Commit 1add785b463319972d4abff7223de961ddfa637d
1 parent
ac491fe7
workflow: REQ 卡片命名改为 <模块代码>-<子模块代码>-<功能名>(index 五列子模块索引)
- index 模板:三列 → 五列(模块代码/模块名称/子模块代码/子模块名称/核心功能点),一行一个子模块 - 卡片文件名:REQ-XXX-NNN.md → <req_id>.md,req_id 恒 3 段(如 USR-USR-LOGIN),功能名由 CC 据核心功能点推断(英文大写、[A-Z0-9_]、多词下划线、子模块内唯一),保持文件名==req_id 不变量 - scope-lock:五列解析 + 按模块代码聚合建目录 + req_id 生成规则;E.1 glob 改 */*.md 跳过 _module.md - db-design-gen/downstream-gen:REQ-*.md glob 同步;docs/05 结构检查锚点 ### REQ- → 三级标题端点段 - CLAUDE/docs-04 模板 commit 后缀、plan-start 示例、coding.mjs 提示词文案(238/1322)、README 同步 - docs-08 checkbox 文本与 scope-lock Edit 锚点逐字节同步;流程/闸门/tag 机制零改动
Showing
11 changed files
with
37 additions
and
34 deletions
README.md
| ... | ... | @@ -133,7 +133,7 @@ erp-workflow-plugin/ |
| 133 | 133 | | # | Skill | 作用 | 流程中谁调用 | |
| 134 | 134 | |---|---|---|---| |
| 135 | 135 | | A0 | `project-init` | • **依赖检查**:检测 git / mysql / node 是否在 PATH,缺失则按 OS 自动安装,装不上再停下提示用户<br>• 空目录初始化:用 Read/Write/Glob 工具拷模板创建 CLAUDE.md / docs/01/index.md / docs/08<br>• `git init` | `plan-start` | |
| 136 | -| A1 | `scope-lock` | • 引导填项目概述 / 技术栈 / 需求索引<br>• 按 `docs/01-需求清单/<module>/{_module.md, REQ-*.md}` 子目录结构生成 REQ 卡片(CC 据 index.md 填 `{{req_id/title/goal/rules/constraints/acceptance}}` 6 个占位,模板其余内容含输入/输出示例字段表原样复制)<br>• **A1 终结校验**:REQ 6 个占位均填真实数据、无 `{{` 残留、`config-vars.yaml` **全部配置**(包名 / 端口 / 初始账号 + DB 凭据 / 密钥占位)已锁、各 stack 的 build/lint/unit/e2e 命令写入 docs/04 § 零;缺失则在此(Plan 期)用 `AskUserQuestion` 问清(敏感凭据由用户自填,不进会话)<br>• 据模板直接 `Write` 生成 `_module.md` / `REQ-*.md`<br>• 终结校验通过后**自动**调用 `Skill(skeleton-gen)` 进入 A2(不停下) | A0 | | |
| 136 | +| A1 | `scope-lock` | • 引导填项目概述 / 技术栈 / 需求索引<br>• 按 `docs/01-需求清单/<module>/{_module.md, <req_id>.md}` 子目录结构生成 REQ 卡片(req_id = `<模块代码>-<子模块代码>-<功能名>`,如 `USR-USR-LOGIN`;CC 据 index.md 填 `{{req_id/title/goal/rules/constraints/acceptance}}` 6 个占位,模板其余内容含输入/输出示例字段表原样复制)<br>• **A1 终结校验**:REQ 6 个占位均填真实数据、无 `{{` 残留、`config-vars.yaml` **全部配置**(包名 / 端口 / 初始账号 + DB 凭据 / 密钥占位)已锁、各 stack 的 build/lint/unit/e2e 命令写入 docs/04 § 零;缺失则在此(Plan 期)用 `AskUserQuestion` 问清(敏感凭据由用户自填,不进会话)<br>• 据模板直接 `Write` 生成 `_module.md` / `<req_id>.md`<br>• 终结校验通过后**自动**调用 `Skill(skeleton-gen)` 进入 A2(不停下) | A0 | | |
| 137 | 137 | | A2 | `skeleton-gen` | • 生成架构文档:docs/04 § 一+<br>• 生成跨平台工具脚本:`scripts/*.mjs`(**无 chmod**;凭据 / 配置统一在 A1 产出的 config-vars.yaml)<br>• 据 `gitignore-append-template` 用 Read/Write 并入项目 .gitignore | `plan-start` | |
| 138 | 138 | | A3 | `db-design-gen` | • 套用固定 ERP 约定(列前缀 `i/s/t`、`iIncrement` 主键、`sBrandsId`/`sSubsidiaryId` 租户列)从 docs/01 REQ 卡片正向设计 `docs/03-数据库设计文档.md`(schema SSoT)<br>• 回填 REQ 卡片依赖表(`TBD(A3 自动补)` → 实际表名)<br>• **停下**等人工审阅 docs/03,审阅完毕用 `/plan-start` 续进 A4 | A2 | |
| 139 | 139 | | A4 | `db-init` | • LLM 解析 docs/03 → `sql/migrations/V1__initial_schema.sql`(DDL only)<br>• `node ${CLAUDE_PLUGIN_ROOT}/lib/validate-ddl.mjs` 校验 DDL ↔ docs/03(5 维:表/列名/列类型/索引/FK),fail-closed<br>• `node ${CLAUDE_PLUGIN_ROOT}/lib/apply-ddl.mjs config-vars.yaml V1.sql`(读取 config-vars.yaml database: 段 + mysql2 apply) | A3 | |
| ... | ... | @@ -154,10 +154,10 @@ erp-workflow-plugin/ |
| 154 | 154 | | 所属 Skill | 模板文件 | 用途 | |
| 155 | 155 | |---|---|---| |
| 156 | 156 | | project-init | `CLAUDE-template.md` | 项目根的 CLAUDE.md(4 条通用准则 + ERP 专属约定) | |
| 157 | -| project-init | `docs-01-index-template.md` | 需求清单索引骨架,等用户填模块表 | | |
| 157 | +| project-init | `docs-01-index-template.md` | 需求清单索引骨架,等用户填子模块索引表(五列,一行一个子模块) | | |
| 158 | 158 | | project-init | `docs-04-stack-template.md` | docs/04 § 零 默认技术栈总览(零槽位,拷即可) | |
| 159 | 159 | | project-init | `docs-08-initial-template.md` | 工作流进度文件骨架(Plan A0~A5 checkbox) | |
| 160 | -| scope-lock | `req-card-template.md` | 单张 REQ-XXX-NNN 卡片模板(`{{req_id/title/goal/rules/constraints/acceptance}}` 占位 + 输入/输出示例字段表;A1 原样复制,只填这 6 个占位) | | |
| 160 | +| scope-lock | `req-card-template.md` | 单张 REQ 卡片模板(文件名 == req_id `<模块代码>-<子模块代码>-<功能名>`;`{{req_id/title/goal/rules/constraints/acceptance}}` 占位 + 输入/输出示例字段表;A1 原样复制,只填这 6 个占位) | | |
| 161 | 161 | | scope-lock | `_module-template.md` | 模块子目录的 `_module.md` 模块头(模块代码-名 / 简述 / 依赖模块 TBD / 涉及表 TBD) | |
| 162 | 162 | | scope-lock | `config-vars-template.yaml` | 仓库根 `config-vars.yaml` 骨架(跨栈中立):项目**全部配置**——非敏感(包名/端口/前端包名/初始账号)+ 敏感凭据(database / admin_init.password / secrets);A1 E.2 锁定,随项目提交 | |
| 163 | 163 | | skeleton-gen | `docs-04-skeleton-template.md` | docs/04 § 一+ 编码规范大纲(HTML 注释引导 LLM) | | ... | ... |
skills/plan/db-design-gen/SKILL.md
| ... | ... | @@ -19,7 +19,7 @@ allowed-tools: Read Write Edit Grep Glob |
| 19 | 19 | |
| 20 | 20 | - `docs/04-技术规范.md` |
| 21 | 21 | - `docs/01-需求清单/index.md` 模块索引 |
| 22 | -- `docs/01-需求清单/*/REQ-*.md` 所有 REQ 卡片 | |
| 22 | +- `docs/01-需求清单/*/*.md` 所有 REQ 卡片(跳过文件名为 `_module.md` 的模块头;卡片文件名 == req_id) | |
| 23 | 23 | |
| 24 | 24 | ### B. 推导 schema |
| 25 | 25 | |
| ... | ... | @@ -44,7 +44,7 @@ allowed-tools: Read Write Edit Grep Glob |
| 44 | 44 | |
| 45 | 45 | ### D. 回填模块头 + REQ 卡片的 TBD 字段 |
| 46 | 46 | |
| 47 | -1. 列出 `docs/01-需求清单/*/_module.md`(模块头)和 `docs/01-需求清单/*/REQ-*.md`(REQ 卡片)。 | |
| 47 | +1. 列出 `docs/01-需求清单/*/*.md`:`_module.md`(模块头)和其余 .md(REQ 卡片,文件名 == req_id)。 | |
| 48 | 48 | 2. 在这些文件中搜索 `TBD(A3 自动补)` 的并回填。 不动 `TBD(A5 自动补)` |
| 49 | 49 | 3. 打印回填统计:`A3 回填 <M> 处模块"涉及表" + <N> 处 REQ"依赖表"`。 |
| 50 | 50 | |
| ... | ... | @@ -69,4 +69,4 @@ allowed-tools: Read Write Edit Grep Glob |
| 69 | 69 | - `${CLAUDE_SKILL_DIR}/templates/docs-03-table-template.md` |
| 70 | 70 | - `docs/04-技术规范.md` § 一+(命名规范输入) |
| 71 | 71 | - `docs/01-需求清单/<module>/_module.md`(模块头:回填 `涉及表`) |
| 72 | -- `docs/01-需求清单/<module>/REQ-*.md`(REQ 输入 + 回填 `依赖表`) | |
| 72 | +- `docs/01-需求清单/<module>/<req_id>.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-需求清单/<module>/REQ-*.md` REQ 卡片正向设计生成(schema SSoT)。 | |
| 5 | +- **生成方式**: 由 A3 `db-design-gen` 基于 `docs/01-需求清单/<module>/` 下各 REQ 卡片(文件名 == req_id)正向设计生成(schema SSoT)。 | |
| 6 | 6 | |
| 7 | 7 | ## 项目标准列约定 |
| 8 | 8 | ... | ... |
skills/plan/downstream-gen/SKILL.md
| ... | ... | @@ -32,7 +32,7 @@ allowed-tools: Read Write Edit Glob Grep AskUserQuestion |
| 32 | 32 | |
| 33 | 33 | ### B2. 回填模块头 + REQ 卡片的 TBD(A5) 字段 |
| 34 | 34 | |
| 35 | -1. 在`docs/01-需求清单/*/_module.md`(模块头)和 `docs/01-需求清单/*/REQ-*.md`(REQ 卡片)中搜索并回填 `TBD(A5 自动补)` | |
| 35 | +1. 在 `docs/01-需求清单/*/*.md`(模块头 `_module.md` + 全部 REQ 卡片,卡片文件名 == req_id)中搜索并回填 `TBD(A5 自动补)` | |
| 36 | 36 | 2. 打印回填统计:`A5 回填 <M> 处模块"依赖模块" + <N> 处 REQ"依赖接口"`。 |
| 37 | 37 | |
| 38 | 38 | 勾选:` - [ ] REQ 卡片依赖接口已回填` |
| ... | ... | @@ -60,12 +60,12 @@ allowed-tools: Read Write Edit Glob Grep AskUserQuestion |
| 60 | 60 | 1. **合并扫描三类问题**(最多 3 轮自主修复,docs/01 是 REQ SSoT 不动)——一次性扫一致性 + `TBD(A3/A5 自动补)` + 结构性残留: |
| 61 | 61 | |
| 62 | 62 | - **一致性**:docs/01 REQ 全部出现在 docs/05;`docs/02 § 二` `module_id` 集合 = `docs/08 § 二` `module_id` 集合。 |
| 63 | - - **TBD 残留**:`TBD(A3 自动补)` → 查 docs/03 填依赖表;`TBD(A5 自动补)` → 查 docs/05 按 REQ-ID 填依赖接口。 | |
| 64 | - - **结构性**:docs/05 每个 `### REQ-` 端点段含非空 `- **请求**:` / `- **响应**:`(非 `TBD`/`—`/`【人工填写:…】`);docs/01 全部 REQ-ID 都出现在 `docs/02 § 二` 顺序清单。 | |
| 63 | + - **TBD 残留**:`TBD(A3 自动补)` → 查 docs/03 填依赖表;`TBD(A5 自动补)` → 查 docs/05 按 req_id 填依赖接口。 | |
| 64 | + - **结构性**:docs/05 每个 `### ` 三级标题端点段(标题形如 `### <req_id> <标题>`)含非空 `- **请求**:` / `- **响应**:`(非 `TBD`/`—`/`【人工填写:…】`);docs/01 全部 req_id 都出现在 `docs/02 § 二` 顺序清单。 | |
| 65 | 65 | |
| 66 | 66 | 命中即按对应步骤规则就地补填(缺端点 → 按 B 推测;缺 module 行 → 按 D 渲染;缺 REQ 顺序行 → 按 A 子流程拓扑插入)。3 轮后仍残留 `【人工填写:】` 或结构缺口 → 打印清单 + 用 `AskUserQuestion` 弹「继续」/「有疑问想先沟通」二选一;每次弹问前重扫一次,避免脏读放行。 |
| 67 | 67 | |
| 68 | -2. **docs/05 + docs/02 人工评审闸**(未确认不得勾选 A5):摘要展示 docs/05 全部端点(`METHOD PATH — REQ-ID`,标注「由 A5 自动推断」的项)+ docs/02 `req_order[]`(特别标 `note ≠ —` 的环依赖打破项)。`AskUserQuestion` 多问题表单同时问两项:「docs/05 端点/字段无误」+「docs/02 构建顺序可接受」,各二选一 `确认` / `需要修改`。任一需修改 → 收集修改点就地修订并重跑本闸,直到两项均 `确认`;否则禁止勾选 A5、禁止打印横幅。 | |
| 68 | +2. **docs/05 + docs/02 人工评审闸**(未确认不得勾选 A5):摘要展示 docs/05 全部端点(`METHOD PATH — <req_id>`,标注「由 A5 自动推断」的项)+ docs/02 `req_order[]`(特别标 `note ≠ —` 的环依赖打破项)。`AskUserQuestion` 多问题表单同时问两项:「docs/05 端点/字段无误」+「docs/02 构建顺序可接受」,各二选一 `确认` / `需要修改`。任一需修改 → 收集修改点就地修订并重跑本闸,直到两项均 `确认`;否则禁止勾选 A5、禁止打印横幅。 | |
| 69 | 69 | |
| 70 | 70 | 3. 勾选 A5 父项:`- [ ] A5 下游文档生成 — downstream-gen` |
| 71 | 71 | ... | ... |
skills/plan/plan-start/SKILL.md
| ... | ... | @@ -46,7 +46,7 @@ A 阶段 checkbox 全部 `[x]` 后先跑下面 4 项前移闸门; 全过才放 |
| 46 | 46 | 1. **REQ 卡片真实数据**(来自 A1 scope-lock) |
| 47 | 47 | - `Glob` 找出全部 REQ 卡片(如 `docs/01-需求清单/**/*.md`)。 |
| 48 | 48 | - 对每张卡片 `Grep` 命中以下任一即缺口: `【人工填写` / `TBD` / `{{`(`{{` = 6 个标量占位未替换;`TBD` = A3/A5 应回填的依赖表/依赖接口仍未补——A1 时这些 `TBD(A3/A5 自动补)` 是合法保留,到本闸必须已解析,故此处比 scope-lock E.1 多查 `TBD`/`【人工填写`)。 |
| 49 | - - 缺口表述示例:`REQ-USER-001 仍含 TBD / {{title}} 占位未替换`。 | |
| 49 | + - 缺口表述示例:`USR-USR-LOGIN 仍含 TBD / {{title}} 占位未替换`。 | |
| 50 | 50 | |
| 51 | 51 | 2. **全部配置全锁**(来自 A1 写入 `config-vars.yaml` 的非敏感配置 + 敏感凭据,单一文件) |
| 52 | 52 | - `Read` `config-vars.yaml`(项目全部配置,含敏感凭据,随项目提交):校验所有字段均无 `【人工填写`/`TBD`;除 `database.password` 可显式为空串外,其余字段不得为空——含非敏感项(`backend`/`frontend` 包名 / 端口、`admin_init.username`、`database.host/port/user/schema`)与敏感项(`admin_init.password`、`secrets.*`)。 |
| ... | ... | @@ -95,7 +95,7 @@ A 阶段 checkbox 全部 `[x]` 后先跑下面 4 项前移闸门; 全过才放 |
| 95 | 95 | |
| 96 | 96 | <逐条列出每个缺口,格式:[闸门] 缺口描述 → 回填位置> |
| 97 | 97 | 例: |
| 98 | - [REQ 真实数据] REQ-USER-001 仍含 {{goal}} 占位未替换 → docs/01-需求清单/... | |
| 98 | + [REQ 真实数据] USR-USR-LOGIN 仍含 {{goal}} 占位未替换 → docs/01-需求清单/... | |
| 99 | 99 | [配置] database.password 仍是占位(如本地空密码请显式填 `''`)→ config-vars.yaml |
| 100 | 100 | [docs/04 §零] node 栈缺 e2e 命令 → docs/04-技术规范.md §零 |
| 101 | 101 | ... | ... |
skills/plan/project-init/templates/CLAUDE-template.md
| ... | ... | @@ -20,7 +20,7 @@ |
| 20 | 20 | 1. **严格遵循** `docs/04-技术规范.md`——命名 / 编码 / 统一响应 / 异常处理 / 数据访问 / 配置与安全 等项目专属技术规约全部在此 |
| 21 | 21 | 2. **严格遵循** `docs/04-技术规范.md § 1.2 分层结构 / § 2.1 目录约定`——文件放对位置 |
| 22 | 22 | 3. **每个后端接口** 必须先在 `docs/05-API接口契约.md` 定义,再编码实现 |
| 23 | -4. **每个功能可追溯到 `REQ-XXX-NNN`**——commit tag + 代码注释(如 `// REQ-SYS-001: 用户登录`)+ plan/spec 文件名均用此 tag | |
| 23 | +4. **每个功能可追溯到 req_id `<模块代码>-<子模块代码>-<功能名>`**——commit tag + 代码注释(如 `// USR-USR-LOGIN: 用户登录`)+ plan/spec 文件名均用此 tag | |
| 24 | 24 | 5. **遇到跨模块改动**(动到非当前模块的代码)——允许改,但必须在《模块完成报告》记录原因 / 影响评估(留痕) |
| 25 | 25 | |
| 26 | 26 | ### 你禁止做的 🚫 |
| ... | ... | @@ -56,7 +56,7 @@ |
| 56 | 56 | ``` |
| 57 | 57 | |
| 58 | 58 | - `scope`: 模块名,如 `user` / `inventory` / `order` |
| 59 | -- `subject`: 简短描述;业务类(feat / fix / test)必须带 `REQ-XXX-NNN` 后缀 | |
| 59 | +- `subject`: 简短描述;业务类(feat / fix / test)必须带 req_id(`<模块代码>-<子模块代码>-<功能名>`,如 `USR-USR-LOGIN`)后缀 | |
| 60 | 60 | |
| 61 | 61 | `type` 含义: |
| 62 | 62 | ... | ... |
skills/plan/project-init/templates/docs-01-index-template.md
| 1 | 1 | # 需求清单 |
| 2 | 2 | |
| 3 | -> 本目录按模块组织所有功能需求。每个模块一个子目录,含 `_module.md`(模块头)和 `REQ-XXX-NNN.md`(每张 REQ 卡片一个文件)。下方核心功能点供 CC 拆分出 REQ 编号 + 标题 + 草拟规则;卡片内输入 / 输出的简述句和 N 张字段表由人工编辑。 | |
| 3 | +> 本目录按模块组织所有功能需求。每个模块一个子目录,含 `_module.md`(模块头)和 `<req_id>.md`(每张 REQ 卡片一个文件;req_id = `<模块代码>-<子模块代码>-<功能名>` 恒 3 段,如 `USR-USR-LOGIN`——功能名由 CC 据核心功能点推断:英文大写短词、字符集 `[A-Z0-9_]`、多词用下划线如 `PWD_RESET`、同一 模块-子模块 内唯一)。下方核心功能点供 CC 拆分出 req_id + 标题 + 草拟规则;卡片内输入 / 输出的简述句和 N 张字段表由人工编辑。 | |
| 4 | 4 | |
| 5 | 5 | ## 模块索引 |
| 6 | 6 | |
| 7 | -| 模块代码 | 模块名称 | 核心功能点(简要) | | |
| 8 | -|----------|----------|--------------------| | |
| 9 | -| 【人工填写:模块代码】 | 【人工填写:模块名称】 | 【人工填写:核心功能点】 | | |
| 10 | -| SYS | 系统管理 | 用户/角色/权限/部门/字典 等 | | |
| 7 | +> 一行一个子模块;同一模块有多个子模块时写多行(模块代码 / 模块名称 重复填写)。 | |
| 8 | + | |
| 9 | +| 模块代码 | 模块名称 | 子模块代码 | 子模块名称 | 核心功能点(简要) | | |
| 10 | +|----------|----------|------------|------------|--------------------| | |
| 11 | +| 【人工填写:模块代码】 | 【人工填写:模块名称】 | 【人工填写:子模块代码】 | 【人工填写:子模块名称】 | 【人工填写:核心功能点】 | | |
| 12 | +| USR | 用户管理 | USR | 用户账户 | 登录/注销/改密 等 | | |
| 13 | +| USR | 用户管理 | ROLE | 角色权限 | 角色 CRUD/权限分配 等 | | ... | ... |
skills/plan/project-init/templates/docs-08-initial-template.md
| ... | ... | @@ -13,7 +13,7 @@ |
| 13 | 13 | - [ ] 项目概述已填写(CLAUDE.md § 🎯 项目概述) |
| 14 | 14 | - [ ] 技术栈已确认(docs/04 § 零) |
| 15 | 15 | - [ ] 需求清单索引已填写(docs/01-需求清单/index.md) |
| 16 | - - [ ] REQ 卡片骨架已生成(docs/01-需求清单/<module>/REQ-*.md,业务内容留待人工填写) | |
| 16 | + - [ ] REQ 卡片骨架已生成(docs/01-需求清单/<module>/<req_id>.md,业务内容留待人工填写) | |
| 17 | 17 | |
| 18 | 18 | - [ ] A2 骨架生成 — skeleton-gen |
| 19 | 19 | - [ ] 架构文档已生成(docs/04 § 一+) | ... | ... |
skills/plan/scope-lock/SKILL.md
| ... | ... | @@ -21,23 +21,23 @@ allowed-tools: Read Write Edit Grep Glob Skill AskUserQuestion Bash(mkdir *) |
| 21 | 21 | |
| 22 | 22 | - **A**:`CLAUDE.md` § 🎯 项目概述。占位符含项目名称 / 简述 / 目标用户 / 部署方式。 |
| 23 | 23 | - **B**:`docs/04-技术规范.md` § 零。让用户检查 / 调整默认技术栈表(删不需要的行 / 改技术 / 加条目)。 |
| 24 | -- **C**:`docs/01-需求清单/index.md`。让用户按业务列出所有模块(每行一个,如 SYS / PUR / SAL),「核心功能点」给关键词即可,CC 会拆 REQ 卡片。 | |
| 24 | +- **C**:`docs/01-需求清单/index.md`。让用户按业务列出所有子模块(一行一个子模块,五列:模块代码/模块名称/子模块代码/子模块名称/核心功能点;同一模块有多个子模块时写多行,如 USR-USR / USR-ROLE / PUR-ORD),「核心功能点」给关键词即可,CC 会拆 REQ 卡片。 | |
| 25 | 25 | |
| 26 | 26 | ### D. 生成 REQ 卡片骨架并停下等人工审阅 |
| 27 | 27 | |
| 28 | -1. 读 `index.md` 解析模块索引;读两个模板 `${CLAUDE_SKILL_DIR}/templates/_module-template.md`、`${CLAUDE_SKILL_DIR}/templates/req-card-template.md` 作为卡片结构参照。 | |
| 29 | -2. **每模块/每 REQ 直接 `Write`**:对每个模块先 `mkdir -p "docs/01-需求清单/<MOD>-<模块名>"`,再照模板结构 `Write`,`<MOD>` / `<模块名>` / `<REQ-MOD-NNN>` 按 `index.md` 实际值替换: | |
| 30 | - - **模块头** `_module.md`:据 `index.md` 填 `module_code` / `module_name` / `module_brief`;`依赖模块: TBD(A5 自动补)` / `涉及表: TBD(A3 自动补)` 两行原样保留。 | |
| 31 | - - **每个 REQ** `<REQ-MOD-NNN>.md`:**照模板原样 `Write`**,只把 `{{req_id}}` / `{{title}}` / `{{goal}}` / `{{rules}}` / `{{constraints}}` / `{{acceptance}}` 这 6 个占位替换为据 `index.md` 推断的真实值;模板其余内容(`输入` / `输出` 示例字段表、`依赖表: TBD(A3 自动补)` / `依赖接口: TBD(A5 自动补)` 两行)**原样复制不动**;模板顶部 HTML 引导注释**不写进产物**。 | |
| 28 | +1. 读 `index.md` 解析模块索引(五列,一行一个子模块;按「模块代码」聚合——同一模块的多行共用一个模块子目录);读两个模板 `${CLAUDE_SKILL_DIR}/templates/_module-template.md`、`${CLAUDE_SKILL_DIR}/templates/req-card-template.md` 作为卡片结构参照。 | |
| 29 | +2. **每模块/每 REQ 直接 `Write`**:对每个模块先 `mkdir -p "docs/01-需求清单/<MOD>-<模块名>"`,再照模板结构 `Write`,`<MOD>` / `<模块名>` / `<req_id>` 按 `index.md` 实际值替换: | |
| 30 | + - **模块头** `_module.md`:据 `index.md` 填 `module_code` / `module_name` / `module_brief`(module_brief 汇总该模块全部子模块行的核心功能点);`依赖模块: TBD(A5 自动补)` / `涉及表: TBD(A3 自动补)` 两行原样保留。 | |
| 31 | + - **每个 REQ** `<req_id>.md`(req_id = `<模块代码>-<子模块代码>-<功能名>` 恒 3 段,如 `USR-USR-LOGIN`;功能名由 CC 据该行核心功能点推断:英文大写短词、字符集 `[A-Z0-9_]`、多词用下划线如 `PWD_RESET`、同一 模块-子模块 内唯一;文件名 == req_id):**照模板原样 `Write`**,只把 `{{req_id}}` / `{{title}}` / `{{goal}}` / `{{rules}}` / `{{constraints}}` / `{{acceptance}}` 这 6 个占位替换为据 `index.md` 推断的真实值;模板其余内容(`输入` / `输出` 示例字段表、`依赖表: TBD(A3 自动补)` / `依赖接口: TBD(A5 自动补)` 两行)**原样复制不动**;模板顶部 HTML 引导注释**不写进产物**。 | |
| 32 | 32 | 3. 用 `Edit` 在 `docs/08-模块任务管理.md` 勾选(A1 子项): |
| 33 | - - ` - [ ] REQ 卡片骨架已生成(docs/01-需求清单/<module>/REQ-*.md,业务内容留待人工填写)` | |
| 33 | + - ` - [ ] REQ 卡片骨架已生成(docs/01-需求清单/<module>/<req_id>.md,业务内容留待人工填写)` | |
| 34 | 34 | 4. 打印「请人工填写 REQ 卡片」横幅并提示用户填完后回来继续: |
| 35 | 35 | |
| 36 | 36 | ``` |
| 37 | 37 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ |
| 38 | 38 | [scope-lock] REQ 卡片骨架已生成 |
| 39 | 39 | |
| 40 | - - 产出: docs/01-需求清单/<module>/{_module.md, REQ-*.md} | |
| 40 | + - 产出: docs/01-需求清单/<module>/{_module.md, <req_id>.md} | |
| 41 | 41 | - 6 个占位已填真实值;输入/输出字段表为模板示例内容(如需可自行调整)。 |
| 42 | 42 | - 审阅后选「继续」进 A1 校验. |
| 43 | 43 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ |
| ... | ... | @@ -54,7 +54,7 @@ allowed-tools: Read Write Edit Grep Glob Skill AskUserQuestion Bash(mkdir *) |
| 54 | 54 | |
| 55 | 55 | 卡片正文是模板原样复制,只有 6 个 `{{}}` 标量由 CC 填——本步只校验这 6 个占位填全填真。 |
| 56 | 56 | |
| 57 | -1. 用 `Glob` 列出所有 `docs/01-需求清单/<module>/REQ-*.md`。 | |
| 57 | +1. 用 `Glob` 列出 `docs/01-需求清单/*/*.md`,跳过文件名为 `_module.md` 的模块头——其余即 REQ 卡片(文件名 == req_id)。 | |
| 58 | 58 | 2. 对每张卡片用 `Read` + `Grep` 校验: |
| 59 | 59 | - **无 `{{` 残留**:不得残留任何 `{{` 占位(命中即说明 6 个标量未全部替换)。 |
| 60 | 60 | - **6 个标量为真实值**:`req_id` / `title` / `goal` / `rules` / `constraints` / `acceptance` 均据 `index.md` 填为真实内容,非空、非回显占位名。 |
| ... | ... | @@ -93,7 +93,7 @@ allowed-tools: Read Write Edit Grep Glob Skill AskUserQuestion Bash(mkdir *) |
| 93 | 93 | ✓ docs/04 § 零 技术栈 + build/lint/unit/e2e 命令 |
| 94 | 94 | ✓ docs/01-需求清单/index.md 模块索引 |
| 95 | 95 | ✓ docs/01-需求清单/<module>/_module.md 模块头 |
| 96 | - ✓ docs/01-需求清单/<module>/REQ-*.md 6 个占位已填真实值(字段表为模板示例) | |
| 96 | + ✓ docs/01-需求清单/<module>/<req_id>.md 6 个占位已填真实值(字段表为模板示例) | |
| 97 | 97 | ✓ config-vars.yaml 配置已锁(非敏感已填;DB 凭据 / 密钥占位待人工填,plan-start 把关) |
| 98 | 98 | |
| 99 | 99 | 自动进入 A2:skeleton-gen |
| ... | ... | @@ -108,7 +108,7 @@ allowed-tools: Read Write Edit Grep Glob Skill AskUserQuestion Bash(mkdir *) |
| 108 | 108 | - `docs/04-技术规范.md` |
| 109 | 109 | - `docs/01-需求清单/index.md` |
| 110 | 110 | - `docs/01-需求清单/<module>/_module.md` |
| 111 | -- `docs/01-需求清单/<module>/REQ-*.md` | |
| 111 | +- `docs/01-需求清单/<module>/<req_id>.md` | |
| 112 | 112 | - `config-vars.yaml` |
| 113 | 113 | - `${CLAUDE_SKILL_DIR}/templates/config-vars-template.yaml` |
| 114 | 114 | - `${CLAUDE_SKILL_DIR}/templates/req-card-template.md` | ... | ... |
skills/plan/skeleton-gen/templates/docs-04-skeleton-template.md
workflows/coding.mjs
| ... | ... | @@ -235,7 +235,7 @@ function featureStageContract(phase) { |
| 235 | 235 | `- **阶段 = ${fe ? '前端(frontend)' : '后端(backend)'}**。路径作用域:${fe |
| 236 | 236 | ? '实现文件必须落在 `frontend/` 下;命中 `backend/` / `sql/` / `scripts/` 即越界,硬停。' |
| 237 | 237 | : '产出范围限定 controller / service / repository / DTO / 校验 / SQL migration / REST 契约;**禁止**写 `frontend/` 路径下的实现(UI 推迟到前端阶段)。'}`, |
| 238 | - `- id 形态:${fe ? '前端为 `FE-NN`(业务功能粒度,可关联多个 prototype 区域与多个 REQ)。' : '后端为 `REQ-XXX-NNN`。'}`, | |
| 238 | + `- id 形态:${fe ? '前端为 `FE-NN`(业务功能粒度,可关联多个 prototype 区域与多个 REQ)。' : '后端为 `<模块代码>-<子模块代码>-<功能名>`(3 段大写 req_id,如 `USR-USR-LOGIN`)。'}`, | |
| 239 | 239 | ].join('\n') |
| 240 | 240 | } |
| 241 | 241 | |
| ... | ... | @@ -1319,7 +1319,7 @@ function classifyCrossModulePromptM(moduleId, files) { |
| 1319 | 1319 | '- 落在共享根(如 `docs/`、`scripts/`、`sql/migrations/`、`README.md` 等)→ **不算**跨模块。', |
| 1320 | 1320 | '', |
| 1321 | 1321 | '## 输出(CROSS_CLASSIFY_SCHEMA)', |
| 1322 | - '- `{ "crossModule": [ { "file": "...", "targetModule": "module_x", "reason": "<本模块哪个 REQ-XXX-NNN 迫使改它,1 句>", "impact": "<目标模块哪些 API/行为/调用方/测试受影响,1-3 句>" }, ... ] }`', | |
| 1322 | + '- `{ "crossModule": [ { "file": "...", "targetModule": "module_x", "reason": "<本模块哪个 REQ(req_id,如 USR-USR-LOGIN)迫使改它,1 句>", "impact": "<目标模块哪些 API/行为/调用方/测试受影响,1-3 句>" }, ... ] }`', | |
| 1323 | 1323 | '- 无跨模块改动:`{ "crossModule": [] }`', |
| 1324 | 1324 | '- **不要留 `TBD(CC 补)`**:本步骤就是补齐的唯一时机;推不出原因 / 影响 → 整步失败(schema 失败即可,调用方会 halt)。', |
| 1325 | 1325 | ].join('\n') | ... | ... |