diff --git a/README.md b/README.md index a30ed62..493fc24 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ Claude Code 插件:ERP / 后端管理系统全流程开发框架。 ``` Plan 阶段**三段式**执行,中间有两个人工审阅断点: - - **第一段(首次运行)**:执行 **A0 → A1**(创建骨架 / 锁技术栈 / 填需求 / 生成 REQ 卡片)后**停下**,等你审阅 `docs/01-需求清单/*.md` 里的 REQ 卡片(Plan 阶段第一个人工关口:业务范围) + - **第一段(首次运行)**:执行 **A0 → A1**(创建骨架 / 锁技术栈 / 填需求 / 生成 REQ 卡片骨架)后**停下**,等你审阅并补全 `docs/01-需求清单//REQ-*.md`(CC 已起草 req_id / title / goal / rules / constraints / acceptance;输入 / 输出 各保留「主表 + 从表1」骨架表,留 `-` 等你按业务补;依赖表 / 依赖接口保留 `TBD(A3/A5 自动补)` 由后续 skill 回填——Plan 阶段第一个人工关口:业务范围) - **第二段(REQ 审阅完重新运行)**:继续 **A2 → A3**(生成骨架 / 从 REQ 正向设计 `docs/03-数据库设计文档.md` 并回填 REQ 依赖表)后再次**停下**,等你审阅 docs/03 的表 / 字段 / 索引 / 外键(第二个人工关口:数据库 schema —— A4 会基于它翻译 DDL 并 apply 到 MySQL,所以这关口与 REQ 审阅同等重要) - **第三段(docs/03 审阅完重新运行)**:执行 **A4 → A5**(解析 docs/03 → 生成 V1 migration → 自动 `DROP+CREATE` 本地 schema 并 apply → 生成下游文档),Plan 完成后再次**停下** @@ -102,7 +102,7 @@ erp-workflow-plugin/ | # | Skill | 作用 | 流程中谁调用 | |---|---|---|---| | A0 | `project-init` | • 依赖检查(`mysql` 在 PATH,缺失则尝试自动安装)
• 空目录初始化:`cp` 模板创建 CLAUDE.md / docs/01/index.md / docs/08
• `git init` | `plan-start` | -| A1 | `scope-lock` | • 引导填项目概述 / 技术栈 / 需求索引
• 生成 REQ 卡片(`schema_refs=TBD(A3 自动补)`、`api_refs=TBD(A5 自动补)`)
• **停下**等人工审阅 REQ 卡片,审阅完毕用 `/plan-start` 恢复续进 A2 | A0 | +| A1 | `scope-lock` | • 引导填项目概述 / 技术栈 / 需求索引
• 按 `docs/01-需求清单//{_module.md, REQ-*.md}` 子目录结构生成 REQ 卡片骨架(CC 起草 req_id / title / goal / rules / constraints / acceptance;输入 / 输出 各保留「主表 + 从表1」骨架,每张表表头 + 1 行 `-` 等人工补;`依赖表 / 依赖接口` 留 `TBD(A3/A5 自动补)`)
• **停下**等人工审阅 + 填输入 / 输出表,审阅完毕用 `/plan-start` 恢复续进 A2 | A0 | | A2 | `skeleton-gen` | • 生成架构文档:docs/04 § 一+ / docs/06 / docs/07 / docs/09
• 生成工具脚本:scripts/*.sh、.githooks/pre-push、.env.local
• 创建 `sql/migrations/` 空目录(Flyway 准备)
• 合并 .gitignore(逐行判重) | `plan-start` | | A3 | `db-design-gen` | • 从 docs/01 REQ 卡片正向设计 `docs/03-数据库设计文档.md`(schema SSoT)
• 回填 REQ 卡片依赖表(`TBD(A3 自动补)` → 实际表名)
• **停下**等人工审阅 docs/03,审阅完毕用 `/plan-start` 恢复续进 A4 | A2 | | A4 | `db-init` | • LLM 解析 docs/03 → `sql/migrations/V1__initial_schema.sql`(DDL only)
• **5 维度全量校验** DDL ↔ docs/03(表名 / 列名+列序 / 类型+nullable+默认值 / 索引名 / FK 名),fail-closed
• 验证 MySQL 连接
• 调 `scripts/setup-test-db.sh` 复用三层防护(与 B 阶段 test.sh 共用)→ DROP+CREATE 空库
• apply V1 + `SHOW TABLES` 行数自检 | A3 | @@ -185,8 +185,8 @@ erp-workflow-plugin/ | project-init | `docs-01-index-template.md` | 需求清单索引骨架,等用户填模块表 | | project-init | `docs-08-initial-template.md` | 工作流进度文件骨架(Plan A0~A5 checkbox) | | project-init | `docs-04-stack-template.md` | docs/04 § 零 默认技术栈总览(零槽位,cp 即可) | -| scope-lock | `req-card-template.md` | 单张 REQ-XXX-NNN 卡片字段结构 | -| scope-lock | `docs-01-module-template.md` | 单模块 `-.md` 外壳 | +| scope-lock | `req-card-template.md` | 单张 REQ-XXX-NNN 卡片骨架(6 个 `{{...}}` 占位符由 CC 替换;输入 / 输出 各含「主表 + 从表1」骨架表,留 `-` 等人工补) | +| scope-lock | `_module-template.md` | 模块子目录的 `_module.md` 模块头(4 行:模块代码-名 / 简述 / 依赖模块 TBD / 涉及表 TBD) | | skeleton-gen | `docs-04-skeleton-template.md` | docs/04 § 一+ 编码规范大纲(HTML 注释引导 LLM) | | skeleton-gen | `docs-06-static-template.md` | docs/06 § 一~四 UI 模式大纲 | | skeleton-gen | `docs-07-env-template.md` | docs/07 环境配置大纲 | diff --git a/skills/coding/feature-brainstorm/SKILL.md b/skills/coding/feature-brainstorm/SKILL.md index 0c68dc8..0d9c25e 100644 --- a/skills/coding/feature-brainstorm/SKILL.md +++ b/skills/coding/feature-brainstorm/SKILL.md @@ -18,7 +18,7 @@ allowed-tools: Read Write Skill Bash(mysql *) 1. **中断检查**:调用 `interrupt-check`。如果触发 → 停止。 2. 确定输入: - 当前 REQ-XXX-NNN(从对话中获取,或 `docs/08` 当前模块下一个未完成的 REQ)。 - - REQ 卡片:`docs/01-需求清单/.md` 中对应的 REQ-XXX-NNN 节。 + - REQ 卡片:`docs/01-需求清单//.md`(一 REQ 一文件)。 - 相关数据表(从 `docs/03` 或实时 mysql 命令行查询)。 3. 委托本插件 `superpower-brainstorming`,以 REQ 卡片 + schema 引用作为上下文;把步骤 4 推导出的落盘路径作为 caller-provided path 传入。 4. 推导路径:`docs/superpowers/specs/$(date +%F)-.md`。如已存在,征求用户确认后覆盖。 diff --git a/skills/plan/db-design-gen/SKILL.md b/skills/plan/db-design-gen/SKILL.md index 18f6feb..bb5beb2 100644 --- a/skills/plan/db-design-gen/SKILL.md +++ b/skills/plan/db-design-gen/SKILL.md @@ -1,6 +1,6 @@ --- name: db-design-gen -description: A3 DB 设计 + REQ 回填——基于 docs/01-需求清单 REQ 卡片正向设计 docs/03-数据库设计文档.md(业务实体 → 表 + 字段 + 索引 + 外键 + 业务注记),并把回填值写入 REQ 卡片的「依赖表: TBD(A3 自动补)」占位。生成完毕停下等人工审阅。 +description: A3 DB 设计 + REQ 回填——基于 docs/01-需求清单//REQ-*.md 正向设计 docs/03-数据库设计文档.md(业务实体 → 表 + 字段 + 索引 + 外键 + 业务注记),并把回填值写入 REQ 卡片的「依赖表: TBD(A3 自动补)」与模块头的「涉及表: TBD(A3 自动补)」占位。生成完毕停下等人工审阅。 user-invocable: false allowed-tools: Read Write Edit Grep Glob Skill AskUserQuestion --- @@ -11,7 +11,7 @@ allowed-tools: Read Write Edit Grep Glob Skill AskUserQuestion ## 前置条件 -- A1 `scope-lock` 已完成:`docs/01-需求清单/-*.md` REQ 卡片存在,含 `TBD(A3 自动补)` 占位。 +- A1 `scope-lock` 已完成:`docs/01-需求清单//_module.md` + `docs/01-需求清单//REQ-*.md` 已生成,含 `TBD(A3 自动补)` 占位。 - A2 `skeleton-gen` 已完成:`docs/04-技术规范.md § 一+` 命名规范已生成(本 skill 推导表/字段命名时严格遵循)。 ## 执行步骤 @@ -40,7 +40,7 @@ allowed-tools: Read Write Edit Grep Glob Skill AskUserQuestion - `docs/04-技术规范.md` § 一+ 命名规范(表名 / 字段名 / 索引名 / 外键名约定,及主键 / 时间戳 / 软删等审计列约定) - `docs/01-需求清单/index.md` 模块索引(模块代码 ↔ 中文名) -- `docs/01-需求清单/*.md`(排除 `index.md`)所有 REQ 卡片,提取 `req_id` / `goal` / `input` / `output` / `rules` / `constraints` / `acceptance` +- `docs/01-需求清单/*/REQ-*.md` 所有 REQ 卡片,提取 `req_id` / `goal` / `输入`(主表+从表的字段清单)/ `输出`(主表+从表的字段清单)/ `跨字段规则` / `边界` / `验收` ### B. LLM 推导 schema @@ -64,13 +64,13 @@ allowed-tools: Read Write Edit Grep Glob Skill AskUserQuestion ### D. 回填模块头 + REQ 卡片的 TBD 字段 -1. 用 `Glob` 列出 `docs/01-需求清单/*.md`(排除 `index.md`)。 +1. 用 `Glob` 列出 `docs/01-需求清单/*/_module.md`(模块头)和 `docs/01-需求清单/*/REQ-*.md`(REQ 卡片)。 2. 用 `Grep` 在这些文件中搜索 `TBD(A3 自动补)` 的**行号**(不读全文)。两种行命中: - - `涉及表: TBD(A3 自动补)` → 模块级(文件头部,每文件一次) - - `依赖表: TBD(A3 自动补)` → REQ 级(每 REQ 一次) + - `涉及表: TBD(A3 自动补)` → 模块级(仅在 `_module.md`,每文件一次) + - `依赖表: TBD(A3 自动补)` → REQ 级(仅在 `REQ-*.md`,每文件一次) 3. 对每个命中行按类型回填: - - **模块级 `涉及表`**:用 `Read` 取该文件 `{{module_code}}` + `{{module_name}}`,聚合步骤 B 中所有归属该模块的表(多表用 `, ` 分隔);`Edit` 替换为 `涉及表: , , ...` - - **REQ 级 `依赖表`**:用 `Read` 仅读取该 REQ 卡片所在片段(标题前后约 20 行)取 `req_id`;根据步骤 B 推导结果定位该 REQ 关联的表;`Edit` 替换为 `依赖表: , ` + - **模块级 `涉及表`**(`_module.md`):用 `Read` 取该文件 `module_code` + `module_name`,聚合步骤 B 中所有归属该模块的表(多表用 `, ` 分隔);`Edit` 替换为 `涉及表: , , ...` + - **REQ 级 `依赖表`**(`REQ-*.md`):从文件名直接得 `req_id`(`REQ-USR-001.md` → `REQ-USR-001`);根据步骤 B 推导结果定位该 REQ 关联的表;`Edit` 替换为 `依赖表: , ` - **不动** `TBD(A5 自动补)` 的两种行(`依赖接口` REQ 级 / `依赖模块` 模块级)—— 由 A5 `downstream-gen` 生成 docs/05 + 完成模块 DAG 后回填 4. 用 `Grep` 再次扫 `TBD(A3 自动补)` 应 0 命中;仍有残留则打印残留位置清单并停下。 5. 打印回填统计:`A3 回填 处模块涉及表 + 处 REQ schema_refs`。 @@ -93,7 +93,7 @@ allowed-tools: Read Write Edit Grep Glob Skill AskUserQuestion 产出: ✓ docs/03-数据库设计文档.md - ✓ docs/01-需求清单/-*.md 依赖表已回填 + ✓ docs/01-需求清单//REQ-*.md 依赖表已回填 + _module.md 涉及表已回填 ⏸ 现在请你审阅 docs/03(表 / 字段 / 索引 / 外键 / 业务注记)。 重点关注: @@ -125,4 +125,5 @@ allowed-tools: Read Write Edit Grep Glob Skill AskUserQuestion - `${CLAUDE_SKILL_DIR}/templates/docs-03-header-template.md` - `${CLAUDE_SKILL_DIR}/templates/docs-03-table-template.md` - `docs/04-技术规范.md` § 一+(命名规范输入) -- `docs/01-需求清单/*.md`(REQ 输入 + 回填目标) +- `docs/01-需求清单//_module.md`(模块头:回填 `涉及表`) +- `docs/01-需求清单//REQ-*.md`(REQ 输入 + 回填 `依赖表`) diff --git a/skills/plan/db-design-gen/templates/docs-03-header-template.md b/skills/plan/db-design-gen/templates/docs-03-header-template.md index a88bd48..85f76df 100644 --- a/skills/plan/db-design-gen/templates/docs-03-header-template.md +++ b/skills/plan/db-design-gen/templates/docs-03-header-template.md @@ -2,7 +2,7 @@ Schema: `{{schema_name}}` Migration 清单: `sql/migrations/V*.sql`(由 Flyway 顺序 apply) -生成方式: 由 A3 `db-design-gen` 基于 `docs/01-需求清单/*.md` REQ 卡片正向设计生成(schema SSoT)。 +生成方式: 由 A3 `db-design-gen` 基于 `docs/01-需求清单//REQ-*.md` REQ 卡片正向设计生成(schema SSoT)。 ## ER 关系概览 diff --git a/skills/plan/downstream-gen/SKILL.md b/skills/plan/downstream-gen/SKILL.md index 3c81708..3aed33b 100644 --- a/skills/plan/downstream-gen/SKILL.md +++ b/skills/plan/downstream-gen/SKILL.md @@ -11,7 +11,7 @@ allowed-tools: Read Write Edit Glob Grep Skill AskUserQuestion Bash(cat *) Bash( ## 前置条件 -- `docs/01-需求清单/*.md` 完整 REQ 卡片已就绪(A1 生成 + 人工审阅过 + A3 已回填依赖表)。 +- `docs/01-需求清单//_module.md` + `docs/01-需求清单//REQ-*.md` 完整 REQ 卡片已就绪(A1 生成 + 人工审阅过 + A3 已回填依赖表)。 - `docs/03-数据库设计文档.md` 已就绪(A3 生成 + 人工审阅过)。 - `sql/migrations/V1__initial_schema.sql` 已生成并 apply(A4 完成)。 - `docs/05` / `docs/06 § 五` / `docs/10` 等下游文件尚不存在(本 skill 创建)。 @@ -66,13 +66,13 @@ allowed-tools: Read Write Edit Glob Grep Skill AskUserQuestion Bash(cat *) Bash( ### B2. 回填模块头 + REQ 卡片的 TBD(A5) 字段 -1. 用 `Glob` 列出 `docs/01-需求清单/*.md`(排除 `index.md`)。 +1. 用 `Glob` 列出 `docs/01-需求清单/*/_module.md`(模块头)和 `docs/01-需求清单/*/REQ-*.md`(REQ 卡片)。 2. 用 `Grep` 在这些文件中搜索 `TBD(A5 自动补)` 的行号(不读全文)。两种行命中: - - `依赖模块: TBD(A5 自动补)` → 模块级(文件头部,每文件一次) - - `依赖接口: TBD(A5 自动补)` → REQ 级(每 REQ 一次) + - `依赖模块: TBD(A5 自动补)` → 模块级(仅在 `_module.md`,每文件一次) + - `依赖接口: TBD(A5 自动补)` → REQ 级(仅在 `REQ-*.md`,每文件一次) 3. 对每个命中行按类型回填: - - **模块级 `依赖模块`**:用 `Read` 取该文件 `{{module_code}}` + `{{module_name}}`,从步骤 A 的 `module_topo_order[]` + DAG 查该模块的上游依赖(多模块用 `, ` 分隔);`Edit` 替换为 `依赖模块: , `(无依赖填 `—`) - - **REQ 级 `依赖接口`**:用 `Read` 仅读取该 REQ 卡片所在片段(REQ 标题行前后 20 行),提取 `req_id`;在步骤 B 刚生成的 `docs/05-API接口契约.md` 里 Grep 属于该 REQ 的 endpoint;`Edit` 替换为 `依赖接口: POST /api/xxx, GET /api/yyy`(多个用 `, ` 分隔) + - **模块级 `依赖模块`**(`_module.md`):用 `Read` 取该文件 `module_code` + `module_name`,从步骤 A 的 `module_topo_order[]` + DAG 查该模块的上游依赖(多模块用 `, ` 分隔);`Edit` 替换为 `依赖模块: , `(无依赖填 `—`) + - **REQ 级 `依赖接口`**(`REQ-*.md`):从文件名直接得 `req_id`(`REQ-USR-001.md` → `REQ-USR-001`);在步骤 B 刚生成的 `docs/05-API接口契约.md` 里 Grep 属于该 REQ 的 endpoint;`Edit` 替换为 `依赖接口: POST /api/xxx, GET /api/yyy`(多个用 `, ` 分隔) 4. 打印回填统计:`A5 回填 处模块依赖 + 处 REQ api_refs`。 ### C. docs/06 — 页面清单 @@ -87,7 +87,7 @@ docs/08 已由 A0 project-init 创建(含 Plan 进度骨架)。本步骤只 1. 用 `Read` 读取 `${CLAUDE_SKILL_DIR}/templates/docs-08-module-row-template.md`(单模块 bullet 行模板)。 2. **按 `module_id` 字母序**对每个模块: - 从步骤 A `req_order[]` 过滤出 `module_id` 匹配的 REQ 列表(保持步骤 A 算出的模块内 REQ 顺序)。 - - 对每个 REQ 从 `docs/01-需求清单/.md` 读出其一句话标题(REQ 卡片标题行或 `goal` 字段)。 + - 对每个 REQ 从 `docs/01-需求清单//.md` 读出其一句话标题(REQ 卡片标题行或 `goal` 字段)。 - 渲染 `{{req_checklist}}` 块:每行 ` - [ ] `(4 空格缩进对齐 `- 功能:`)。 - 渲染整条 bullet,填充 `module_id` / `module_name` / `depends_on` / `path_scopes` / `req_checklist`。 @@ -106,7 +106,7 @@ docs/08 已由 A0 project-init 创建(含 Plan 进度骨架)。本步骤只 - docs/01 的每个 REQ 都出现在 docs/05(作为接口,如适用)、docs/10(作为验收项)。 - `docs/02 § 二` 开发顺序清单的 `module_id` 集合 = `docs/08 § 二` 的 `module_id` 集合(数量、ID 全等);不相等 → 报错停下,列出差集。 -2. **最终占位符扫描**(覆盖 Plan 阶段全部产出:`docs/01-需求清单/*.md` + `docs/02` / `docs/03` / `docs/05` / `docs/06` / `docs/10`): +2. **最终占位符扫描**(覆盖 Plan 阶段全部产出:`docs/01-需求清单/index.md` + `docs/01-需求清单/*/_module.md` + `docs/01-需求清单/*/REQ-*.md` + `docs/02` / `docs/03` / `docs/05` / `docs/06` / `docs/10`): a. **`TBD` → CC 自动补齐**:用 `Grep` 搜索 `TBD(A3 自动补)` 和 `TBD(A5 自动补)`。有命中则按 A3 / B2 同样逻辑就地补填(A3 查 docs/03 填 `依赖表:`;A5 查 docs/05 按 REQ-ID 填 `依赖接口:`),再 Grep 确认 0 命中;仍残留报错停下。 diff --git a/skills/plan/project-init/templates/docs-01-index-template.md b/skills/plan/project-init/templates/docs-01-index-template.md index 16b8002..bbfb33c 100644 --- a/skills/plan/project-init/templates/docs-01-index-template.md +++ b/skills/plan/project-init/templates/docs-01-index-template.md @@ -1,6 +1,6 @@ # 需求清单 -> 本目录按模块组织所有功能需求。每个模块一个文件,由 CC 基于下方纲要扩展成 REQ-XXX-NNN 标准卡片。 +> 本目录按模块组织所有功能需求。每个模块一个子目录,含 `_module.md`(模块头)和 `REQ-XXX-NNN.md`(每张 REQ 卡片一个文件)。下方核心功能点供 CC 拆分出 REQ 编号 + 标题 + 草拟规则;卡片内输入 / 输出的主从表字段由人工填写。 ## 模块索引 @@ -12,5 +12,5 @@ ## 填写说明 1. 每个模块占一行,`模块代码` 用大写英文缩写(如 SYS / PUR / INV / SAL / FIN / HR) -2. `核心功能点` 只需列关键词,CC 会基于此扩展成完整 REQ 卡片 +2. `核心功能点` 只需列关键词,CC 会基于此拆分出 N 张 REQ 卡片骨架(卡片内输入 / 输出的主从表字段仍由人工填) 3. 填完后运行 `/erp-workflow:plan-start`,CC 会自动检测并进入需求生成阶段 diff --git a/skills/plan/project-init/templates/docs-08-initial-template.md b/skills/plan/project-init/templates/docs-08-initial-template.md index 67a74fb..bf52487 100644 --- a/skills/plan/project-init/templates/docs-08-initial-template.md +++ b/skills/plan/project-init/templates/docs-08-initial-template.md @@ -15,7 +15,7 @@ - [ ] 项目概述已填写(CLAUDE.md § 🎯 项目概述) - [ ] 技术栈已确认(docs/04 § 零) - [ ] 需求清单索引已填写(docs/01-需求清单/index.md) - - [ ] REQ 卡片已生成(docs/01-需求清单/*.md,schema/api 字段标记为 TBD) + - [ ] REQ 卡片骨架已生成(docs/01-需求清单/<module>/REQ-*.md,业务内容留待人工填写) - [ ] A2 骨架生成 — skeleton-gen - [ ] 架构文档已生成(docs/04 § 一+、docs/06、docs/07、docs/09) diff --git a/skills/plan/scope-lock/SKILL.md b/skills/plan/scope-lock/SKILL.md index dab2ecd..5cda61f 100644 --- a/skills/plan/scope-lock/SKILL.md +++ b/skills/plan/scope-lock/SKILL.md @@ -1,8 +1,8 @@ --- name: scope-lock -description: A1 计划范围锁定——引导用户填写项目概述 + 技术栈 + 需求索引,并自动扩展 REQ 卡片待人工评审(依赖表 / 依赖接口两字段由模板写死 `TBD(...)` 占位,A3/A5 后续回填)。 +description: A1 计划范围锁定——引导用户填写项目概述 + 技术栈 + 需求索引,并按模块子目录生成 REQ 卡片骨架(CC 推断 req_id/title/goal/rules/constraints/acceptance;输入/输出 主从表骨架留 `-` 等人工填;依赖表/依赖接口模板写死 `TBD(A3/A5 自动补)` 由后续 skill 回填)。 user-invocable: false -allowed-tools: Read Write Edit Grep Skill AskUserQuestion +allowed-tools: Read Write Edit Grep Skill AskUserQuestion Bash(mkdir *) --- **所有输出必须使用中文。** @@ -101,7 +101,7 @@ allowed-tools: Read Write Edit Grep Skill AskUserQuestion 请按业务列出所有模块: - 每行一个模块(如 SYS 系统管理 / PUR 采购 / SAL 销售) - - 「核心功能点」只需关键词,CC 会扩展为完整 REQ 卡片 + - 「核心功能点」只需关键词,CC 会拆分为 REQ 卡片骨架(卡片内输入 / 输出的主从表字段由你后续人工填) 改完后回来选择「继续」。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` @@ -114,16 +114,22 @@ allowed-tools: Read Write Edit Grep Skill AskUserQuestion 完成后,用 `Edit` 在 `docs/08-模块任务管理.md` 中勾选: - ` - [ ] 需求清单索引已填写(docs/01-需求清单/index.md)` -### D. 生成 REQ 卡片并停下等人工审阅 +### D. 生成 REQ 卡片骨架并停下等人工审阅 1. 用 `Grep` 校验 `docs/01-需求清单/index.md` 无 `【人工填写:` 残留;有则回步骤 C。 2. 用 `Read` 读 `index.md` 解析模块索引。 3. 对每个模块: - - 基于「核心功能点」扩展若干 REQ-XXX-NNN 卡片 - - 用 `${CLAUDE_SKILL_DIR}/templates/req-card-template.md` 渲染每张(渲染约定见模板顶部 HTML 注释)。 - - 用 `${CLAUDE_SKILL_DIR}/templates/docs-01-module-template.md` 包装卡片列表,用 `Write` 写入 `docs/01-需求清单/<module_code>-<module_name>.md`。 + - 基于「核心功能点」推断出 N 个 REQ,每个 REQ 产出六元组 + `{req_id, title, goal, rules, constraints, acceptance}`: + - `req_id` / `title`:从核心功能点拆分命名(如「用户/角色/权限」→ `REQ-SYS-001 用户管理`、`REQ-SYS-002 角色管理`、`REQ-SYS-003 权限管理`) + - `goal`:用一句话展开 `title` + - `rules` / `constraints` / `acceptance`:业务语义层面的合理起草,待人工审阅修订 + - **不推断输入 / 输出的主从表字段**——模板内保留 `主表 + 从表1` 骨架(每张表表头 + 1 行 `-`),等人工按业务自行复制行 / 增删从表 + - 用 `Bash`: `mkdir -p docs/01-需求清单/<module_code>-<module_name>` 创建模块目录 + - 用 `${CLAUDE_SKILL_DIR}/templates/_module-template.md` 渲染 `_module.md`,填充 `{module_code, module_name, module_brief}`,`Write` 到 `docs/01-需求清单/<module_code>-<module_name>/_module.md` + - 对每个 REQ:用 `${CLAUDE_SKILL_DIR}/templates/req-card-template.md` 渲染(渲染约定见模板顶部 HTML 注释),替换 6 个占位符,`Write` 到 `docs/01-需求清单/<module_code>-<module_name>/<req_id>.md` 4. 用 `Edit` 在 `docs/08-模块任务管理.md` 勾选(A1 子项 + A1 顶层): - - ` - [ ] REQ 卡片已生成(docs/01-需求清单/*.md,schema/api 字段标记为 TBD)` + - ` - [ ] REQ 卡片骨架已生成(docs/01-需求清单/<module>/REQ-*.md,业务内容留待人工填写)` - `- [ ] A1 范围锁定 — scope-lock` 5. 打印停下横幅并**停止**: @@ -135,9 +141,14 @@ allowed-tools: Read Write Edit Grep Skill AskUserQuestion ✓ CLAUDE.md § 🎯 项目概述 ✓ docs/04 § 零 技术栈 ✓ docs/01-需求清单/index.md 模块索引 - ✓ docs/01-需求清单/<module>-*.md REQ 卡片 + ✓ docs/01-需求清单/<module>/_module.md 模块头 + ✓ docs/01-需求清单/<module>/REQ-*.md REQ 卡片骨架 - ⏸ 现在请你审阅每张 REQ 卡片(路径:`docs/01-需求清单/<module_code>-<module_name>.md`) + ⏸ 现在请你逐张打开 REQ 卡片: + - **必填**:输入(主表 + N 从表)、输出(主表 + N 从表) + · 每张表先把 `-` 行按实际字段数复制;没有从表就删掉 `从表1` 整段,多于一个就复制为 `从表2 / 从表3 / ...` + - **审阅**:目标 / 跨字段规则 / 边界 / 验收(CC 已起草,对照业务校正) + - **保留**:依赖表 / 依赖接口 行的 `TBD(A3/A5 自动补)` 不要改,由 A3/A5 自动回填 审阅是 Plan 阶段的关键人工关口,请认真逐张过一遍。 审阅完成后,运行以下命令继续进入 A2: @@ -152,6 +163,7 @@ allowed-tools: Read Write Edit Grep Skill AskUserQuestion - `CLAUDE.md` § 🎯 项目概述(写入目标) - `docs/04-技术规范.md`(技术栈输出,供 skeleton-gen 读取使用) - `docs/01-需求清单/index.md`(模块索引输入) -- `docs/01-需求清单/<module>-*.md`(REQ 卡片输出,A3 db-design-gen 会回填 TBD 字段) +- `docs/01-需求清单/<module>/_module.md`(模块头输出) +- `docs/01-需求清单/<module>/REQ-*.md`(REQ 卡片骨架输出,A3 db-design-gen / A5 downstream-gen 会回填 TBD 字段) - `${CLAUDE_SKILL_DIR}/templates/req-card-template.md` -- `${CLAUDE_SKILL_DIR}/templates/docs-01-module-template.md` +- `${CLAUDE_SKILL_DIR}/templates/_module-template.md` diff --git a/skills/plan/scope-lock/examples/example.md b/skills/plan/scope-lock/examples/example.md new file mode 100644 index 0000000..30f7b9f --- /dev/null +++ b/skills/plan/scope-lock/examples/example.md @@ -0,0 +1,43 @@ +<!-- +本文件示例 scope-lock 步骤 D 渲染后的单张 REQ 卡片产物。 +路径:docs/01-需求清单/USR-用户管理/REQ-USR-001.md + +CC 已替换 6 个占位符(req_id / title / goal / rules / constraints / acceptance); +输入 / 输出 各保留「主表 + 从表1」骨架,每张表只有表头 + 1 行 `-`,等人工按业务补; +依赖表 / 依赖接口 保留 `TBD(...)`,等 A3/A5 自动回填。 +--> +### REQ-USR-001 增加用户 + +**目标**: 在系统中创建新用户账号,绑定员工并配置登录凭据、用户类型与权限组 + +- **输入**: + - **主表**: + + | 字段 | 类型 | 必填 | 输入方式 | 显示来源 | 默认值 | 业务规则 | + | --- | --- | --- | --- | --- | --- | --- | + | - | - | - | - | - | - | - | + + - **从表1**: + + | 字段 | 类型 | 必填 | 输入方式 | 显示来源 | 默认值 | 业务规则 | + | --- | --- | --- | --- | --- | --- | --- | + | - | - | - | - | - | - | - | + +- **输出**: + - **主表**: + + | 字段 | 类型 | 必填 | 输入方式 | 显示来源 | 默认值 | 业务规则 | + | --- | --- | --- | --- | --- | --- | --- | + | - | - | - | - | - | - | - | + + - **从表1**: + + | 字段 | 类型 | 必填 | 输入方式 | 显示来源 | 默认值 | 业务规则 | + | --- | --- | --- | --- | --- | --- | --- | + | - | - | - | - | - | - | - | + +- **跨字段规则**: 员工名选定后用户号 / 用户名 / 手机号 / 邮箱自动带出;权限组至少 1 个 +- **边界**: 同一员工名不能重复创建账号;超级管理员仅允许系统内置创建 +- **验收**: 新增成功后可立即登录;字段校验失败时给出明确提示 +- **依赖表**: TBD(A3 自动补) +- **依赖接口**: TBD(A5 自动补) diff --git a/skills/plan/scope-lock/templates/docs-01-module-template.md b/skills/plan/scope-lock/templates/_module-template.md index 97966d7..518776d 100644 --- a/skills/plan/scope-lock/templates/docs-01-module-template.md +++ b/skills/plan/scope-lock/templates/_module-template.md @@ -3,9 +3,3 @@ 模块简述: {{module_brief}} 依赖模块: TBD(A5 自动补) 涉及表: TBD(A3 自动补) - -## 功能清单 - -{{#each reqs}} -{{req_card}} -{{/each}} diff --git a/skills/plan/scope-lock/templates/req-card-template.md b/skills/plan/scope-lock/templates/req-card-template.md index 45239aa..955528d 100644 --- a/skills/plan/scope-lock/templates/req-card-template.md +++ b/skills/plan/scope-lock/templates/req-card-template.md @@ -1,27 +1,47 @@ <!-- -req-card-template:单张 REQ 卡片结构(三段式)。 -1) 标题 + 目标引言:`### {{req_id}} {{title}}` + 一行 `**目标**: {{goal}}` -2) 字段表(7 列 × N 行):UI 字段 / API 参数的结构化清单 - - 是多行块占位,每个字段一行,LLM 根据本 REQ 实际字段数**复制该行 N 次**,每行填实际值 - - `{{field_rules}}` 是**字段级**规则(例:"13 位数字"、"至少 1 个"、"员工名选择后显示");多条用 `;` 分割 - - `{{source}}` 若来自 DB 表用反引号包裹(如 `` `职员表` ``) - - 若本 REQ 无表单字段(纯后台任务),schema 行填占位:`| — | — | — | — | — | — | 无表单输入 |` -3) REQ 级元数据(bullet list): - - `**跨字段规则**: {{rules}}` = **REQ 级** 跨字段 / 业务流程规则,与字段表 `{{field_rules}}` 区分 - - `TBD(A3 自动补)` 由 A3 `db-design-gen` 回填 - - `TBD(A5 自动补)` 由 A5 `downstream-gen` 回填 - - REQ 级槽位由 LLM 基于功能点推断。 -渲染时 scope-lock skill 会**剥掉本 HTML 注释**,最终 REQ 卡片不保留。 +req-card-template:单张 REQ 卡片骨架。每张卡片是 docs/01-需求清单/<module>/REQ-XXX-NNN.md 一个独立文件。 +渲染约定: +1) scope-lock 渲染时**只替换 6 个占位符**:{{req_id}} / {{title}} / {{goal}} / {{rules}} / {{constraints}} / {{acceptance}} + 这 6 项由 CC 根据 docs/01-需求清单/index.md 的「核心功能点」推断起草: + - req_id / title:从核心功能点拆分命名得来 + - goal:用一句话展开 title + - rules / constraints / acceptance:业务语义层面的合理起草,待人工审阅修订 +2) `**输入**` / `**输出**` 各含「主表 + N 个从表」二级结构,每张表内字面 `-` 是**字面占位**,模板原样保留。等人工拿到生成的卡片后按实际业务自己改: + - 每张表:仅保留表头 + 1 行 `-` 示意;人工按字段数复制行 + - 没有从表的 REQ:删掉 `从表1` 整段;多于一个从表:复制 `从表1` 段并改成 `从表2 / 从表3 / ...` +3) `**依赖表**: TBD(A3 自动补)` 和 `**依赖接口**: TBD(A5 自动补)` 是后续 skill 自动回填的占位,渲染时**保持原样**,不要替换为 `-` 也不要替换为 `{{...}}` +4) 渲染后这段 HTML 注释要**剥掉**,不进入最终卡片 --> ### {{req_id}} {{title}} **目标**: {{goal}} -| 字段 | 类型 | 必填 | 输入方式 | 显示来源 | 默认值 | 业务规则 | -|---|---|---|---|---|---|---| -| {{field}} | {{type}} | {{required}} | {{input_method}} | {{source}} | {{default}} | {{field_rules}} | +- **输入**: + - **主表**: + + | 字段 | 类型 | 必填 | 输入方式 | 显示来源 | 默认值 | 业务规则 | + | --- | --- | --- | --- | --- | --- | --- | + | - | - | - | - | - | - | - | + + - **从表1**: + + | 字段 | 类型 | 必填 | 输入方式 | 显示来源 | 默认值 | 业务规则 | + | --- | --- | --- | --- | --- | --- | --- | + | - | - | - | - | - | - | - | + +- **输出**: + - **主表**: + + | 字段 | 类型 | 必填 | 输入方式 | 显示来源 | 默认值 | 业务规则 | + | --- | --- | --- | --- | --- | --- | --- | + | - | - | - | - | - | - | - | + + - **从表1**: + + | 字段 | 类型 | 必填 | 输入方式 | 显示来源 | 默认值 | 业务规则 | + | --- | --- | --- | --- | --- | --- | --- | + | - | - | - | - | - | - | - | -- **输出**: {{output}} - **跨字段规则**: {{rules}} - **边界**: {{constraints}} - **验收**: {{acceptance}} diff --git a/skills/plan/skeleton-gen/templates/docs-09-structure-template.md b/skills/plan/skeleton-gen/templates/docs-09-structure-template.md index 1c60393..b00f89b 100644 --- a/skills/plan/skeleton-gen/templates/docs-09-structure-template.md +++ b/skills/plan/skeleton-gen/templates/docs-09-structure-template.md @@ -27,7 +27,7 @@ skeleton-gen 基于 docs/04 § 零 技术栈推导目录树: ``` docs/ -├── 01-需求清单/ # REQ 卡片按模块分文件 +├── 01-需求清单/ # 每模块一子目录(_module.md 模块头 + REQ-*.md 卡片) ├── 02-开发计划.md ├── 03-数据库设计文档.md ├── 04-技术规范.md