name: skeleton-gen description: A2 骨架生成——基于 docs/04 § 零 技术栈 + docs/01-需求清单/index.md 模块索引,生成项目专属的架构文档(docs/04 § 一+、docs/06、docs/07、docs/09)和工具脚本(.mjs,跨平台)。固定工具文件用 Read/Write 落盘,架构文档由 LLM 按大纲生成。 user-invocable: false
allowed-tools: Read Write Edit Skill Grep Glob AskUserQuestion Bash(node *)
所有输出必须使用中文。
执行步骤
A. 读取锁定的输入
用 Read 读取:
-
docs/04-技术规范.md§ 零 技术栈表 -
docs/01-需求清单/index.md需求索引 -
docs/01-需求清单/需求卡片
后续所有内容都基于它们推导。
B.1 生成 3 个全新架构文档(docs/06 / 07 / 09)
对下表每个目标文件:
- 读取对应的大纲模板
- 基于步骤 A 的输入,按大纲生成项目专属内容
- 剥掉 HTML 注释(注释是给 LLM 的提示,不应出现在最终文档里)
- 写入目标路径
| 目标文件 | 大纲模板 |
|---|---|
docs/06-UI交互规范.md(§ 一 ~ 三;FE 决策表由 A6 frontend-scope-lock 追加到 § 三之后) |
${CLAUDE_SKILL_DIR}/templates/docs-06-static-template.md |
docs/07-环境配置.md |
${CLAUDE_SKILL_DIR}/templates/docs-07-env-template.md |
docs/09-项目目录结构.md |
${CLAUDE_SKILL_DIR}/templates/docs-09-structure-template.md |
项目专属标识(根包名 / 命名空间)保留 【人工填写:<说明>】 占位,等人工在 docs/09 顶部补填一次后,其他文件复用。
B.2 追加 docs/04 § 一+(保留 § 零 不覆盖)
docs/04 已由 scope-lock 写入 § 零。本步骤追加 § 一 ~ 三。
- 读取
docs/04-技术规范.md(现有 § 零 完整内容)。 - 读取
${CLAUDE_SKILL_DIR}/templates/docs-04-skeleton-template.md。 - 基于技术栈,按大纲生成 § 一 ~ 三 的项目专属内容,剥掉 HTML 注释。
- 拼接原有内容和新生成内容,写回
docs/04-技术规范.md。
完成后,用 Edit 在 docs/08-模块任务管理.md 中勾选:
- [ ] 架构文档已生成(docs/04 § 一+、docs/06、docs/07、docs/09)
C. 生成工具脚本
C.1 复制固定模板文件(用 Read + Write,跨平台无 shell)
对下表每个文件:用 Read 读模板内容,用 Write 原样写到目标路径(Write 会自动创建缺失的父目录,无需 mkdir)。.gitkeep 用 Write 写空文件。
| 模板 | 目标路径 |
|---|---|
${CLAUDE_SKILL_DIR}/templates/env-local-template |
.env.local |
${CLAUDE_SKILL_DIR}/templates/scripts-setup-test-db-template.mjs |
scripts/setup-test-db.mjs |
${CLAUDE_SKILL_DIR}/templates/styles-tokens-template.css |
src/styles/tokens.css |
| (空文件) | sql/migrations/.gitkeep |
.env.local须与config-vars.yaml的secrets_ref对齐:写完.env.local后用Read读仓库根config-vars.yaml的secrets_ref列表,逐个核对键名。env-local-template 已含DB_*/JWT_SECRET;secrets_ref里其余项目专属键(如REDIS_PASSWORD/ADMIN_INIT_PASSWORD/ 第三方凭证)用Edit追加到.env.local,值统一为【人工填写:<说明>】。
C.2 渲染 scripts/test.mjs
用 Read 读取 ${CLAUDE_SKILL_DIR}/templates/scripts-test-template.mjs,基于步骤 A 的技术栈(docs/04 § 零)为 7 个占位推断命令后用 Write 写到 scripts/test.mjs:
-
{{backend_build}}/{{backend_lint}}/{{backend_test}}后端各 stage 命令 -
{{frontend_build}}/{{frontend_lint}}/{{frontend_test}}前端各 stage 命令 -
{{e2e_cmd}}E2E(无 E2E 工具则填echo "[test.mjs] e2e 略")
占位是普通 shell 命令字符串,模板在运行期用
spawnSync(cmd, { shell:true })跨平台执行(Windows 走 cmd.exe,*nix 走 /bin/sh),缺席 stack 由模板内的existsSync('backend')/existsSync('frontend')守卫跳过。
完成后,用 Edit 在 docs/08-模块任务管理.md 中勾选:
- [ ] 工具脚本已生成(scripts/*.mjs、.env.local)- [ ] 样式 token 骨架已生成(src/styles/tokens.css)
D. 追加 .gitignore 忽略项
调 ${CLAUDE_PLUGIN_ROOT}/lib/merge-gitignore.mjs(跨平台纯 Node,逐行判重并集合并,把 append 模板内容并入项目 .gitignore,原地写回第一个参数):
node "${CLAUDE_PLUGIN_ROOT}/lib/merge-gitignore.mjs" .gitignore "${CLAUDE_SKILL_DIR}/templates/gitignore-append-template"
.gitignore不存在则先 Write 空文件。
完成后,用 Edit 在 docs/08-模块任务管理.md 中勾选:
- [ ] .gitignore 已配置
E. 占位符补填 + QA 闸门
E.1 扫描 + 分组
用 Grep 在以下路径扫 【人工填写:,记录命中(文件 / 行号 / 说明):
-
docs/04-技术规范.md/docs/06-UI交互规范.md/docs/07-环境配置.md/docs/09-项目目录结构.md -
config-vars.yaml(A1 留下的未推断字段,如包名 / 端口) -
scripts/*.mjs/.gitignore .env.local
分两组:
-
敏感组:
.env.local路径命中(凭据 / 密钥)。不弹 QA(凭据不进会话),E.3 提示用户自填。 - 非敏感组:其余文件。按说明文字聚合为「根占位」(相同说明 = 同一值,多处共用)或「派生占位」(说明表达派生关系,如"后端 java 根包路径"派生自"根包名")。
无命中 → 跳 E.4。
E.2 问根占位 + 推派生 + 批量 Edit
- 每个根占位用
AskUserQuestion问(给合理默认值 + 自由输入),用Edit批量替换所有命中位置 - 派生占位不问,CC 基于根占位值推断后
Edit;不能可靠推断则回退当独立根占位问
E.3 敏感占位提示(不弹 QA)
若敏感组非空:打印提示横幅,列出 .env.local 待填字段名 + 告诉用户"直接编辑文件,凭据不进会话"。
E.4 验证 + QA 闸门
循环直到两条件同时满足:
(a) Grep 重新扫 E.1 全部路径,0 命中
(b) 用户 AskUserQuestion 选「继续」
每次弹 QA 前重扫;有残留则打印残留位置清单(文件:行号 — 说明)+ 再弹 QA。
QA 横幅涵盖:产出文件清单(docs/04 / 06 / 07 / 09 + config-vars.yaml + scripts/*.mjs + .env.local + .gitignore)、占位状态(N=0 或待填清单)、「继续」/「有疑问先沟通」两选项。
通过后(N=0 且用户选「继续」),用 Edit 在 docs/08-模块任务管理.md 中勾选:
- [ ] A2 骨架生成 — skeleton-gen
F. 进入 A3
输出 skeleton-gen: 完成,立即调用 Skill(db-design-gen)。
参考
-
docs/04-技术规范.md§ 零 docs/01-需求清单/index.md${CLAUDE_SKILL_DIR}/templates/docs-04-skeleton-template.md${CLAUDE_SKILL_DIR}/templates/docs-06-static-template.md${CLAUDE_SKILL_DIR}/templates/docs-07-env-template.md${CLAUDE_SKILL_DIR}/templates/docs-09-structure-template.md${CLAUDE_SKILL_DIR}/templates/scripts-test-template.mjs${CLAUDE_SKILL_DIR}/templates/scripts-setup-test-db-template.mjs${CLAUDE_SKILL_DIR}/templates/env-local-templateconfig-vars.yaml${CLAUDE_SKILL_DIR}/templates/gitignore-append-template${CLAUDE_SKILL_DIR}/templates/styles-tokens-template.css${CLAUDE_PLUGIN_ROOT}/lib/merge-gitignore.mjs