import { readdirSync, readFileSync, writeFileSync } from 'node:fs'; import { join, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; const root = join(dirname(fileURLToPath(import.meta.url)), '..'); const partsDir = join(root, 'parts'); const files = readdirSync(partsDir).filter((f) => /^\d{2}-.+\.md$/.test(f)).sort(); const titles = { '00': '使用说明 + 任务声明(总入口)', '01': '项目总纲(定位 / 体验原则 / 架构 / 功能全景)', '02': '技术栈与工程结构(pnpm/Electron/Vue/Vite、进程模型、构建)', '03': '设计系统 Token(颜色/字体/圆角/间距/阴影/层级/DPI)', '04': '主界面(岛)像素级规格(窗口/行/背景/进度/遮罩/编辑/隐藏)', '05': '组件系统(11 个内置组件逐个规格)', '06': '课程表/时间表/档案/科目/周次/调课/导入导出', '07': '提醒系统(队列/提供者/气泡/强提醒/音效/TTS/天气服务)', '08': '自动化(触发器/行动/规则集)', '09': '主题系统(Fluent/Classic、主题包、壁纸取色 P2)', '10': '设置中心(19 个设置页逐项)', '11': '其它窗口与向导(OOBE/闪屏/崩溃/恢复/更新/换课/Excel/教程…)', '12': '插件系统、IPC、单实例与自动更新', '13': '数据模型、存储、备份与迁移(JSON schema)', '14': '动画与动效总表(99 条)', '15': '资源清单(图标/字体/音效/天气图标/教程/本地化)', '16': '质量门禁与验收清单', '17': '开发里程碑(M0–M8)', '18': '禁止事项与实现边界(红线)', '19': '结语', }; const rows = []; for (const f of files) { const t = readFileSync(join(partsDir, f), 'utf8'); const chars = [...t.replace(/\s/g, '')].length; const cjk = (t.match(/[\u4e00-\u9fff]/g) || []).length; const tokens = Math.round(cjk * 0.9 + (chars - cjk) * 0.3); const num = f.slice(0, 2); rows.push({ num, file: f, title: titles[num] || '', chars, cjk, tokens }); } const table = rows .map((r) => `| ${r.num} | ${r.title} | \`${r.file}\` | ${r.chars} | ${r.tokens} |`) .join('\n'); const totalChars = rows.reduce((a, r) => a + r.chars, 0); const totalTokens = rows.reduce((a, r) => a + r.tokens, 0); const md = `# 投喂指南:把这份 ClassIsland 提示词交给 ChatGPT > 本目录是最终交付物。主提示词共 20 个 part(00–19),合计约 **${totalChars}** 字符(去空白)、**约 ${totalTokens} tokens**。请不要一次性把全部内容塞进小上下文模型;按下面三套方案挑一套。 ## 一、交付物 | 文件 | 内容 | 用途 | |---|---|---| | \`../ClassIsland-给ChatGPT的完整提示词.md\` | 全量主提示词(20 个 part,含目录) | 唯一权威版本;模型上下文足够时一次投喂 | | \`vol1-总纲与技术栈(00-02).md\` ~ \`vol5-动画资源验收与结语(14-19).md\` | 5 个分卷 | 适合 128k 上下文模型分批投喂 | | \`sections/\` | 20 个独立 part 文件 | 适合 32k–64k 上下文模型逐章投喂;也方便只补某一章 | | \`../analysis/\`、\`../parts/\` | 调研记录与原始 part 源文件 | 供人工核对证据(不投喂给模型) | ## 二、各 part 体量与 token 估算 | # | 内容 | 文件 | 字符(去空白) | 估算 tokens | |---|---|---|---|---| ${table} > token 估算按「汉字 0.9、其他字符 0.3」粗算,仅用于选择投喂方式;实际以所用模型 tokenizer 为准。 ## 三、三套投喂方案 ### 方案 A:一次性投喂(上下文 ≥ 200k tokens) - 适用:GPT-5 级别 / Claude 长上下文 / Gemini 2.5 Pro 等。 - 做法:粘贴 \`ClassIsland-给ChatGPT的完整提示词.md\` 全文,末尾追加: > 请严格按此提示词实现「classisland-ts」。先通读全文,输出:①实施计划与完整文件树;②你识别出的歧义点(一次性列出,等我确认);③M0 的验收脚本设计。确认后再开始写代码。 - 注意:长上下文也会「中间遗忘」,务必要求模型在每个里程碑复述本阶段关键数值。 ### 方案 B:五卷投喂(上下文 ≥ 128k tokens) 1. 第 1 批:\`vol1\` + 追加话术:「这是项目的总纲、技术栈与工程结构;先只确认理解,不要写代码。请复述 10 条体验原则、技术栈版本、进程模型。」 2. 第 2 批:\`vol2\` +「这是设计 tokens、主界面与组件规格;请输出你将创建的 Vue 组件树与 CSS token 文件草案。」 3. 第 3 批:\`vol3\` +「这是课表、提醒、自动化;请输出数据流与状态机设计。」 4. 第 4 批:\`vol4\` +「这是主题、设置、窗口、插件、数据;请输出 IPC 通道表与数据 schema 清单。」 5. 第 5 批:\`vol5\` +「这是动画、资源、验收、里程碑、红线;请输出最终实施顺序与验收计划,然后从 M0 开始实现。」 - 每批结束时要求模型把「已确认的关键参数」写进一份 \`SPEC-LOCK.md\`,下一批先复述再继续。 ### 方案 C:逐章投喂(上下文 32k–64k) - 适用:GPT-4o 等 32k/128k 模型或需要精细控制时。 - 做法:按 00 → 19 顺序,每次投喂 \`sections/\` 下 1–3 个 part(建议:00+01+02;03+04;05;06;07;08;09+10;11;12+13;14+15;16+17+18+19)。 - 每次投喂加一句:「只实现/修改与本章相关的文件;先复述本章关键数值与验收点,再动手;不要重写其他模块。」 ## 四、建议的追问与验收话术 - 开工前:「请先输出 20 个你认为最可能歧义的地方,并给出你的默认决策。」 - 架构评审:「请给出 packages/desktop-client/src 的完整文件树,每个文件一句话职责;标注哪些文件对应提示词的哪个章节。」 - 像素校验:「请给出岛在 1920×1080、缩放 100%、深色 Fluent 主题下的基准截图校验清单(元素/坐标/颜色/字号)。」 - 动画校验:「请列出第 14 部分要求的 99 条动画中,你已实现/未实现的清单,并给出每条的验证方法。」 - 无头验证:「所有自动验证必须无头运行,不得显示可见窗口或播放声音;请提供 headless 测试命令与输出。」 - 数据安全:「请演示一次配置迁移:备份 → 迁移 → 校验 → 失败回滚。」 - 完成前:「请对照第 16 部分逐条勾选,并列出未通过项与原因;对照第 18 部分确认红线。」 ## 五、必须向模型强调的三件事 1. **证据路径不是依赖**:文中 \`repos/ClassIsland/...\`、\`repos/ClassHelper-master/...\` 是规格来源,实现时应转写为 TypeScript/CSS,不得在产物中引用这两个仓库。 2. **技术栈不可替换**:pnpm 11 + Electron 44 + Vue 3.5 + Element Plus 2.14 + Pinia 4 + Vite 8 + TS 5.9;更新器自研(禁 electron-updater);岛不得引入 Element Plus 全局样式。 3. **不打扰纪律**:任何自动验证必须无头/离屏,不得弹窗、发声、占用真实桌面(第 18 部分)。 ## 六、已知的「与 ClassIsland 原版差异」(模型需在交付说明中列出) - Avalonia 窗口 → Electron 透明 BrowserWindow(固定包围盒 + 窗内形变,见 04 §4.3)。 - XAML 资源字典/主题 → CSS 变量 + 受控主题包(09)。 - 插件 DLL/.cipx → npm 包 + utilityProcess 宿主(12)。 - 命名管道 IPC → Electron IPC + 可选本地只读 HTTP(12)。 - Excel 导入导出:原版 2.1 已停用,本实现用 xlsx 重建为 P1(06/11)。 - 壁纸取色:原版 2.1 已停用,本实现仅 P2 实验性、默认关闭(09)。 - 置顶轮询:原版 1ms 轮询 → 事件驱动 + ≥1000ms 兜底(04/18)。 `; writeFileSync(join(root, 'out', '投喂指南.md'), md, 'utf8'); console.log('written out/投喂指南.md'); console.log(md.split('\n').slice(0, 5).join('\n'));