Commit 4bb71298f3d6a7958957718edffa2fae2814963f

Authored by zichun
1 parent 4706a8d9

update req card template

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