Commit cc94a5f4a617f39265ca0acc5dd487580b061444

Authored by zichun
1 parent 18d6d292

edit

README.md
@@ -10,15 +10,15 @@ Claude Code 插件:ERP / 后端管理系统全流程开发框架。 @@ -10,15 +10,15 @@ Claude Code 插件:ERP / 后端管理系统全流程开发框架。
10 📋 阶段 A:规划(一次性,入口 /erp-workflow:erp-plan-start) 10 📋 阶段 A:规划(一次性,入口 /erp-workflow:erp-plan-start)
11 初始化项目 → 锁范围(REQ 卡片生成) 11 初始化项目 → 锁范围(REQ 卡片生成)
12 12
13 - ⏸ 审阅 REQ 卡片 → 重 /erp-plan-start 继续 13 + ⏸ 审阅 REQ 卡片 → 重新运行 /erp-plan-start 继续
14 14
15 - 生骨架 → 初始化 DB(V1 migration + seed)→ 生 DB 设计 → 生下游文档 15 + 生成骨架 → 初始化 DB(V1 migration + seed)→ 生成 DB 设计 → 生成下游文档
16 16
17 用户显式 /erp-workflow:erp-coding-start 17 用户显式 /erp-workflow:erp-coding-start
18 18
19 🔁 阶段 B:编码(按模块循环,入口 /erp-workflow:erp-coding-start) 19 🔁 阶段 B:编码(按模块循环,入口 /erp-workflow:erp-coding-start)
20 功能循环:Brainstorm → Plan → TDD → Verify → Review 20 功能循环:Brainstorm → Plan → TDD → Verify → Review
21 - 模块循环:本地测试闸门 → 写模块报告 → 建 GitLab MR → ⏸ 用户 Approve+Merge → 下次 coding-start 自动扫 MR merged → 下一模块 21 + 模块循环:本地测试闸门 → 写模块报告 → 创建 GitLab MR → ⏸ 用户 Approve+Merge → 下次 coding-start 自动扫描 MR 状态为 merged → 下一模块
22 22
23 ⚙️ 后台守门:占位符未填 / 红旗触发 / 跨模块改动未记录 23 ⚙️ 后台守门:占位符未填 / 红旗触发 / 跨模块改动未记录
24 ``` 24 ```
@@ -53,25 +53,25 @@ claude --plugin-dir /path/to/erp-workflow-plugin @@ -53,25 +53,25 @@ claude --plugin-dir /path/to/erp-workflow-plugin
53 ``` 53 ```
54 Plan 阶段**两段式**执行,中间有一个 REQ 审阅断点: 54 Plan 阶段**两段式**执行,中间有一个 REQ 审阅断点:
55 55
56 - - **第一段(首次运行)**:跑 **A0 → A1**(创建骨架 / 锁技术栈 / 填需求 / 生成 REQ 卡片)后**停下**,等你审阅 `docs/01-需求清单/*.md` 里的 REQ 卡片(这是 Plan 阶段最关键的人工关口)  
57 - - **第二段(审阅完重跑同一命令)**:继续 **A2 → A5**(生骨架 / 初始化 DB / 生设计 / 生下游文档),Plan 完成后再次**停下** 56 + - **第一段(首次运行)**:执行 **A0 → A1**(创建骨架 / 锁技术栈 / 填需求 / 生成 REQ 卡片)后**停下**,等你审阅 `docs/01-需求清单/*.md` 里的 REQ 卡片(这是 Plan 阶段最关键的人工关口)
  57 + - **第二段(审阅完重新运行同一命令)**:继续 **A2 → A5**(生成骨架 / 初始化 DB / 生成设计 / 生成下游文档),Plan 完成后再次**停下**
58 58
59 - 每次运行都会自动接上次停下的地方继续;中途可以随时关闭 CC,下次跑同样的命令就能恢复。Plan 完成后**不会自动进入编码**,需要你手动运行 `/erp-workflow:erp-coding-start`。 59 + 每次运行都会自动接上次停下的地方继续;中途可以随时关闭 CC,下次运行同样的命令即可恢复。Plan 完成后**不会自动进入编码**,需要你手动运行 `/erp-workflow:erp-coding-start`。
60 60
61 3. **Coding 阶段入口**(模块循环): 61 3. **Coding 阶段入口**(模块循环):
62 ``` 62 ```
63 /erp-workflow:erp-coding-start 63 /erp-workflow:erp-coding-start
64 ``` 64 ```
65 - Plan 全部完成后由你显式触发。**按 `docs/02 § 二` REQ 开发顺序清单**扫描决定当前模块:  
66 - 对每个 REQ 所属模块查 `docs/08` 的 `MR:` 字段 + `glab mr view state`: 65 + Plan 全部完成后由你显式触发。**按 `docs/02 § 二` REQ 开发顺序清单**扫描,决定当前模块:
  66 + 对每个 REQ 所属模块查询 `docs/08` 的 `MR:` 字段 + `glab mr view state`:
67 - `state == merged` → 模块已完成,跳过 67 - `state == merged` → 模块已完成,跳过
68 - `MR: —` / opened / closed / 查不到 → 该模块是当前模块 68 - `MR: —` / opened / closed / 查不到 → 该模块是当前模块
69 69
70 之后 `git checkout main` + `git pull --ff-only` 同步远程 main(保证下次 module 分支切出时 base 新鲜),再派发到 `erp-module-start`。 70 之后 `git checkout main` + `git pull --ff-only` 同步远程 main(保证下次 module 分支切出时 base 新鲜),再派发到 `erp-module-start`。
71 71
72 - **`docs/08 § 二` 每模块是 bullet(`- module_id ...`,无 checkbox)**——完成信号由 MR merged state 判定。原来的"翻勾 `[x]`"动作已从结构上消除,彻底消灭 Codex adversarial review Finding 1 的"用户抢跑 coding-start 跳过未合并模块"的 ordering bug 72 + **`docs/08 § 二` 每模块占一行 bullet**,完成信号由 MR merged state 判定;即使用户提前触发 coding-start,未 merged 的模块仍会被选中,不会跳过
73 73
74 -4. **中途恢复**:任何时候对应入口命令——根据 Plan § 一 checkbox 和 § 二 各模块 MR state 跳到当前该做的事。 74 +4. **中途恢复**:任何时候运行对应入口命令——根据 Plan § 一 checkbox 和 § 二 各模块 MR state 跳到当前该做的事。
75 75
76 ## 目录结构 76 ## 目录结构
77 77
@@ -120,7 +120,7 @@ erp-workflow-plugin/ @@ -120,7 +120,7 @@ erp-workflow-plugin/
120 ``` 120 ```
121 /erp-workflow:erp-coding-start ← 用户每次手动触发 121 /erp-workflow:erp-coding-start ← 用户每次手动触发
122 122
123 - │ 扫 docs/02 REQ 序 + docs/08 MR 字段 + glab mr view state 判当前模块: 123 + │ 扫描 docs/02 REQ 序 + docs/08 MR 字段 + glab mr view state 判定当前模块:
124 │ - 所有模块都 merged → 打印"所有模块已完成" 124 │ - 所有模块都 merged → 打印"所有模块已完成"
125 │ - 找到第一个非 merged 模块 → 派发 125 │ - 找到第一个非 merged 模块 → 派发
126 │ 派发前 git checkout main + git pull --ff-only(同步远程 base) 126 │ 派发前 git checkout main + git pull --ff-only(同步远程 base)
@@ -131,39 +131,39 @@ erp-workflow-plugin/ @@ -131,39 +131,39 @@ erp-workflow-plugin/
131 │ erp-feature-brainstorm → -plan → -tdd → -verify → -review 131 │ erp-feature-brainstorm → -plan → -tdd → -verify → -review
132 132
133 │ review approve → 回 erp-module-start(推进下一 REQ) 133 │ review approve → 回 erp-module-start(推进下一 REQ)
134 - │ review request-changes (<5) → fix commit → 回 erp-feature-verify 重 134 + │ review request-changes (<5) → fix commit → 回 erp-feature-verify 重新执行
135 │ review request-changes (=5) → 停下(升级给人) 135 │ review request-changes (=5) → 停下(升级给人)
136 136
137 │ 模块全部 REQ approve → 137 │ 模块全部 REQ approve →
138 │ erp-local-test-gate(commit test-gate.md) 138 │ erp-local-test-gate(commit test-gate.md)
139 │ → erp-module-report(commit 模块报告 + cross-module log) 139 │ → erp-module-report(commit 模块报告 + cross-module log)
140 - │ → erp-mr-create(worktree clean 校验 → push 代码+evidence → 建 MR 140 + │ → erp-mr-create(worktree clean 校验 → push 代码+evidence → 建 MR
141 │ → 追 MR URL 到报告 + commit → 写 MR iid 到 docs/08 + commit 141 │ → 追 MR URL 到报告 + commit → 写 MR iid 到 docs/08 + commit
142 - │ → 再 push;docs/08 无 checkbox 142 + │ → 再 push
143 143
144 └─ ⏸ 停下等人工 Approve + Merge 144 └─ ⏸ 停下等人工 Approve + Merge
145 - (人工合并后再跑 coding-start,扫到 state=merged 自动跳过 145 + (人工合并后再次运行 coding-start,扫描到 state=merged 自动跳过
146 → pull main → 推进下一模块) 146 → pull main → 推进下一模块)
147 ``` 147 ```
148 148
149 | Skill | 做什么 | 谁触发它 | 149 | Skill | 做什么 | 谁触发它 |
150 |---|---|---| 150 |---|---|---|
151 -| `erp-module-start` | 定位当前模块(docs/02 REQ 序)+ 切/建 `module-<id>` 分支 + 扫 `docs/superpowers/reviews/*.md` 的 `verdict=approve` 算已完成 REQ + 推进第一个未完成 REQ 的功能循环。全部完成 → `erp-local-test-gate`。**幂等可重入**(中途断开再跑自动跳过已 approve 的 REQ) | `erp-coding-start` 派发;`erp-feature-review` approve 后回调 | 151 +| `erp-module-start` | 定位当前模块(docs/02 REQ 序)+ 切换或创建 `module-<id>` 分支 + 扫描 `docs/superpowers/reviews/*.md` 的 `verdict=approve` 计算已完成 REQ + 推进第一个未完成 REQ 的功能循环。全部完成 → `erp-local-test-gate`。**幂等可重入**(中途断开后重新运行会自动跳过已 approve 的 REQ) | `erp-coding-start` 派发;`erp-feature-review` approve 后回调 |
152 | `erp-feature-brainstorm` | 功能循环步骤 1:交互 brainstorm → 生成 `docs/superpowers/specs/*.md` | `erp-module-start` 推进 REQ 时调用 | 152 | `erp-feature-brainstorm` | 功能循环步骤 1:交互 brainstorm → 生成 `docs/superpowers/specs/*.md` | `erp-module-start` 推进 REQ 时调用 |
153 | `erp-feature-plan` | 功能循环步骤 2:spec → 任务级 plan(含文件路径 + 完整代码),输出 `docs/superpowers/plans/*.md` | `erp-feature-brainstorm` 链式调用 | 153 | `erp-feature-plan` | 功能循环步骤 2:spec → 任务级 plan(含文件路径 + 完整代码),输出 `docs/superpowers/plans/*.md` | `erp-feature-brainstorm` 链式调用 |
154 | `erp-feature-tdd` | 功能循环步骤 3:红绿循环(写失败测试 → 实现 → 子会话验证通过 → commit 到 `module-<id>` 分支) | `erp-feature-plan` 链式调用 | 154 | `erp-feature-tdd` | 功能循环步骤 3:红绿循环(写失败测试 → 实现 → 子会话验证通过 → commit 到 `module-<id>` 分支) | `erp-feature-plan` 链式调用 |
155 -| `erp-feature-verify` | 功能循环步骤 4:全测试套件派子会话跑一次,用模板渲染 evidence | `erp-feature-tdd` 链式调用;`erp-feature-review` 在 request-changes 修复后重跑 |  
156 -| `erp-feature-review` | 功能循环步骤 5:AI 自审,写 `docs/superpowers/reviews/*.md`。approve → 回 `erp-module-start`;request-changes → 逐项 Edit + fix commit → 回 `erp-feature-verify` 重跑(最多 5 轮,第 5 轮仍 request-changes 则停下) | `erp-feature-verify` 链式调用 |  
157 -| `erp-local-test-gate` | MR 前硬闸门:子会话跑 `scripts/test.sh`(脚本内部 drop+create 空库、Flyway apply `sql/migrations/V*.sql`、再跑测试);通过 → 写 `<module_id>-test-gate.md` 并 `git add + commit`(evidence 进 module 分支);失败停下 | `erp-module-start` 在本模块所有 REQ approve 后调用 |  
158 -| `erp-module-report` | 红旗检查 → 生成 12 节模块完成报告 `docs/superpowers/module-reports/<date>-<module_id>.md` → `git add + commit`(报告 + cross-module log 进 module 分支,erp-mr-create 的 worktree clean 前置条件依赖此步) | `erp-local-test-gate` 链式调用 |  
159 -| `erp-mr-create` | 红旗检查 → 验证当前分支 = `module-<id>` + `git status --porcelain` worktree 干净 → `git push` 推代码和所有 evidence → `glab mr create`(模块报告嵌入 MR 描述)→ 追 MR URL 到报告 + commit → 回写 `MR: —` → `MR: !<iid>` 到 docs/08 + commit → 再次 push;**停下等人工 Approve+Merge**。docs/08 § 二是模块元数据 bullet(无 checkbox),完成由 MR state 判定 | `erp-module-report` 链式调用 | 155 +| `erp-feature-verify` | 功能循环步骤 4:将全量测试派发到子会话执行一次,用模板渲染 evidence | `erp-feature-tdd` 链式调用;`erp-feature-review` 在 request-changes 修复后重新调用 |
  156 +| `erp-feature-review` | 功能循环步骤 5:AI 自审,写 `docs/superpowers/reviews/*.md`。approve → 回 `erp-module-start`;request-changes → 逐项 Edit + fix commit → 回 `erp-feature-verify` 重新执行(最多 5 轮,第 5 轮仍 request-changes 则停下) | `erp-feature-verify` 链式调用 |
  157 +| `erp-local-test-gate` | MR 前硬闸门:子会话执行 `scripts/test.sh`(脚本内部 drop+create 空库、Flyway apply `sql/migrations/V*.sql`、再执行测试);通过 → 写 `<module_id>-test-gate.md` 并 `git add + commit`(evidence 提交到 module 分支);失败停下 | `erp-module-start` 在本模块所有 REQ approve 后调用 |
  158 +| `erp-module-report` | 红旗检查 → 生成 12 节模块完成报告 `docs/superpowers/module-reports/<date>-<module_id>.md` → `git add + commit`(报告 + cross-module log 提交到 module 分支,erp-mr-create 的 worktree clean 前置条件依赖此步) | `erp-local-test-gate` 链式调用 |
  159 +| `erp-mr-create` | 红旗检查 → 验证当前分支 = `module-<id>` 且 `git status --porcelain` worktree 干净 → `git push` 推代码与全部 evidence → `glab mr create`(模块报告嵌入 MR 描述)→ 追加 MR URL 到报告并 commit → 把 docs/08 该模块的 `MR: —` 回写为 `MR: !<iid>` 并 commit → 再次 push;**停下等人工 Approve+Merge**。完成由 MR state 判定 | `erp-module-report` 链式调用 |
160 160
161 ### Crosscut(4 个,`skills/crosscut/`) 161 ### Crosscut(4 个,`skills/crosscut/`)
162 162
163 | Skill | 作用 | 流程中谁调用 | 163 | Skill | 作用 | 流程中谁调用 |
164 |---|---|---| 164 |---|---|---|
165 -| `erp-plan-start` | **A 阶段入口**。读 docs/08 § 一 找第一个未勾 A 子项 → 派发对应 A skill;A 全部完成时提示运行 coding-start | **用户手动**运行 `/erp-workflow:erp-plan-start` |  
166 -| `erp-coding-start` | **B 阶段入口**。先验证 Plan 已完成;**按 `docs/02 § 二` REQ 序扫**,对每个 REQ 所属模块查 `MR: 字段 + glab mr view state`:`merged` 跳过;`—`/opened/closed/查不到 选为当前模块。派发前 `git checkout main + git pull --ff-only` 同步远程 base,然后调 `erp-module-start` | **用户手动**运行 `/erp-workflow:erp-coding-start` | 165 +| `erp-plan-start` | **A 阶段入口**。读取 docs/08 § 一 找第一个未勾 A 子项 → 派发对应 A skill;A 全部完成时提示运行 coding-start | **用户手动**运行 `/erp-workflow:erp-plan-start` |
  166 +| `erp-coding-start` | **B 阶段入口**。先验证 Plan 已完成;**按 `docs/02 § 二` REQ 序扫描**,对每个 REQ 所属模块查询 `MR: 字段 + glab mr view state`:`merged` 跳过;`—`/opened/closed/查不到 选为当前模块。派发前 `git checkout main + git pull --ff-only` 同步远程 base,然后调用 `erp-module-start` | **用户手动**运行 `/erp-workflow:erp-coding-start` |
167 | `erp-red-flag-check` | 检查 CLAUDE.md 的 6 项红旗清单;命中则追加 Blocker 到计划文件并停下 | 功能循环各步骤和生成重要制品前自动调用 | 167 | `erp-red-flag-check` | 检查 CLAUDE.md 的 6 项红旗清单;命中则追加 Blocker 到计划文件并停下 | 功能循环各步骤和生成重要制品前自动调用 |
168 | `erp-cross-module-log` | 给 `log-cross-module.sh` 追加的跨模块改动存根补「原因 / 影响评估」 | 用户看到 hook 提示后调用;`erp-module-start` 初始化日志文件时也会用其模板 | 168 | `erp-cross-module-log` | 给 `log-cross-module.sh` 追加的跨模块改动存根补「原因 / 影响评估」 | 用户看到 hook 提示后调用;`erp-module-start` 初始化日志文件时也会用其模板 |
169 169
@@ -214,11 +214,11 @@ erp-workflow-plugin/ @@ -214,11 +214,11 @@ erp-workflow-plugin/
214 214
215 ## 前置依赖 215 ## 前置依赖
216 216
217 -- **MySQL 8.x** 实例已建好(CC 不跑 DDL;schema 由人工初始化) 217 +- **MySQL 8.x** 实例已就绪(CC 不执行 DDL;schema 由人工初始化)
218 - **`mysql` / `mysqldump` 命令行**:`erp-db-init` (A3) 验证连接 + 导出 V1 initial migration + 导出 seed-data.sql;`scripts/setup-test-db.sh` 在测试闸门前后 drop+create 空库 218 - **`mysql` / `mysqldump` 命令行**:`erp-db-init` (A3) 验证连接 + 导出 V1 initial migration + 导出 seed-data.sql;`scripts/setup-test-db.sh` 在测试闸门前后 drop+create 空库
219 - **Spring Boot + Flyway**(**必需**):pom.xml 声明 `flyway-core` + `flyway-mysql`;Spring 启动时自动 apply `sql/migrations/V*.sql`。本插件生成的 `setup-test-db.sh` 只清库,schema 必须由 Flyway 应用 219 - **Spring Boot + Flyway**(**必需**):pom.xml 声明 `flyway-core` + `flyway-mysql`;Spring 启动时自动 apply `sql/migrations/V*.sql`。本插件生成的 `setup-test-db.sh` 只清库,schema 必须由 Flyway 应用
220 -- **GitLab + glab CLI**:`erp-mr-create` 用 `glab mr create`;`erp-coding-start` 用 `glab mr view` 判 MR 状态  
221 -- **本地能跑 `mvn test` / `pnpm test`**:测试闸门 `scripts/test.sh` 由 `erp-skeleton-gen` 生成 220 +- **GitLab + glab CLI**:`erp-mr-create` 用 `glab mr create`;`erp-coding-start` 用 `glab mr view` 判定 MR 状态
  221 +- **本地可运行 `mvn test` / `pnpm test`**:测试闸门 `scripts/test.sh` 由 `erp-skeleton-gen` 生成
222 222
223 ## 设计原则 223 ## 设计原则
224 224
hooks/scripts/log-cross-module.sh
1 #!/usr/bin/env bash 1 #!/usr/bin/env bash
2 # PostToolUse hook: 检测 Edit/Write 是否触及"当前模块以外"的模块路径,若是则在当前模块的跨模块日志中留痕(软规则 S2)。 2 # PostToolUse hook: 检测 Edit/Write 是否触及"当前模块以外"的模块路径,若是则在当前模块的跨模块日志中留痕(软规则 S2)。
3 -# 注:原设计基于"已勾 [x] 模块"触发,但 docs/08 § 二 的 checkbox 永远保持 `- [ ]`(完成由 MR merged state 判定);  
4 -# 新判定按"非当前模块"触发——CC 在当前模块开发期间改动其他模块(无论是否已 merged)都应留痕。 3 +# CC 在当前模块开发期间改动其他模块(无论目标模块是否已 merged)都会在此处留痕。
5 4
6 set -euo pipefail 5 set -euo pipefail
7 6
@@ -29,8 +28,7 @@ case &quot;$current_branch&quot; in @@ -29,8 +28,7 @@ case &quot;$current_branch&quot; in
29 esac 28 esac
30 [ -n "$current_module" ] || exit 0 29 [ -n "$current_module" ] || exit 0
31 30
32 -# 遍历所有 `- module_X` 行(docs/08 § 二 的所有模块,纯 bullet 无 checkbox),  
33 -# 提取 module_id 和其下的"路径:"行。 31 +# 遍历 docs/08 § 二 的所有 `- module_X` 行,提取 module_id 和其下的"路径:"行。
34 # docs/08 § 二 的模块块结构: 32 # docs/08 § 二 的模块块结构:
35 # - module_0 <name> 33 # - module_0 <name>
36 # - 依赖: ... 34 # - 依赖: ...
skills/coding/erp-feature-brainstorm/SKILL.md
@@ -11,7 +11,7 @@ allowed-tools: Read Write Skill Bash(mysql *) @@ -11,7 +11,7 @@ allowed-tools: Read Write Skill Bash(mysql *)
11 11
12 ## 说明 12 ## 说明
13 13
14 -针对一个 REQ-XXX-NNN,委托 `superpowers:brainstorming` 进行头脑风暴,然后将输出打包到标准规格模板中,产出 ≤1 页的功能规格。 14 +针对一个 REQ-XXX-NNN,委托 `superpowers:brainstorming` 进行头脑风暴,再把输出填入标准规格模板,产出单页功能规格。
15 15
16 ## 执行步骤 16 ## 执行步骤
17 17
skills/coding/erp-feature-review/SKILL.md
1 --- 1 ---
2 name: erp-feature-review 2 name: erp-feature-review
3 -description: 功能循环第 5 步。AI 自审,输出审阅报告到 docs/superpowers/reviews/。approve 回调 erp-module-start;request-changes 则编辑代码并 fix commit,重 verify。自修复循环上限 5 轮。 3 +description: 功能循环第 5 步。AI 自审,输出审阅报告到 docs/superpowers/reviews/。approve 回调 erp-module-start;request-changes 则编辑代码并 fix commit,重新执行 verify。自修复循环上限 5 轮。
4 user-invocable: false 4 user-invocable: false
5 allowed-tools: Read Write Edit Skill Agent Bash(git add *) Bash(git commit *) 5 allowed-tools: Read Write Edit Skill Agent Bash(git add *) Bash(git commit *)
6 --- 6 ---
@@ -22,14 +22,14 @@ allowed-tools: Read Write Edit Skill Agent Bash(git add *) Bash(git commit *) @@ -22,14 +22,14 @@ allowed-tools: Read Write Edit Skill Agent Bash(git add *) Bash(git commit *)
22 - 逐项处理 `must_fix[]`:对每个条目用 `Edit` 修改其指向的代码文件。 22 - 逐项处理 `must_fix[]`:对每个条目用 `Edit` 修改其指向的代码文件。
23 - 所有 Must-fix 修复后,拼 commit 消息(格式与 `erp-feature-tdd` 一致,单行):`fix(<module_id>): 修复 review round <N> must-fix <REQ-id>`。 23 - 所有 Must-fix 修复后,拼 commit 消息(格式与 `erp-feature-tdd` 一致,单行):`fix(<module_id>): 修复 review round <N> must-fix <REQ-id>`。
24 - `Bash`: `git add <修改的代码文件>` + `git commit -m "<上一步拼出的消息>"`。 24 - `Bash`: `git add <修改的代码文件>` + `git commit -m "<上一步拼出的消息>"`。
25 - - 调用 `Skill(erp-feature-verify)` 重验证;verify 通过后会再次链到本 skill,作为 round `<N+1>` 重审。 25 + - 调用 `Skill(erp-feature-verify)` 重新执行验证;verify 通过后会再次链到本 skill,作为 round `<N+1>` 重审。
26 26
27 6. 上限:**5 轮**。第 5 轮仍为 `request-changes` → 停止并打印摘要(升级给用户手工介入),不再自动修复,不回调 module-start。 27 6. 上限:**5 轮**。第 5 轮仍为 `request-changes` → 停止并打印摘要(升级给用户手工介入),不再自动修复,不回调 module-start。
28 28
29 ## 衔接 29 ## 衔接
30 30
31 - `approve` → `Skill(erp-module-start)` 回主循环。 31 - `approve` → `Skill(erp-module-start)` 回主循环。
32 -- `request-changes`(round < 5)→ `Skill(erp-feature-verify)` 重 32 +- `request-changes`(round < 5)→ `Skill(erp-feature-verify)` 重新执行
33 - `request-changes`(round == 5)→ 停止。 33 - `request-changes`(round == 5)→ 停止。
34 34
35 ## 参考 35 ## 参考
skills/coding/erp-feature-tdd/SKILL.md
@@ -17,7 +17,7 @@ allowed-tools: Read Write Edit Agent Skill Bash(git add *) Bash(git commit *) @@ -17,7 +17,7 @@ allowed-tools: Read Write Edit Agent Skill Bash(git add *) Bash(git commit *)
17 - `ls sql/migrations/V*.sql` 得最大版本号 n_max,新文件版本号 = n_max + 1 17 - `ls sql/migrations/V*.sql` 得最大版本号 n_max,新文件版本号 = n_max + 1
18 - 文件名格式 `V<n>__<snake_case_desc>.sql`,例 `V5__add_user_email.sql` 18 - 文件名格式 `V<n>__<snake_case_desc>.sql`,例 `V5__add_user_email.sql`
19 - `Write` 该文件(只含 DDL:`ALTER TABLE ... ADD COLUMN ...` / `CREATE TABLE ...` 等),commit 19 - `Write` 该文件(只含 DDL:`ALTER TABLE ... ADD COLUMN ...` / `CREATE TABLE ...` 等),commit
20 - - 之后的代码任务(entity / DAO / service / 测试)在此之后做;测试跑时 Spring Boot 启动会让 Flyway 自动 apply 这个新 migration(`scripts/setup-test-db.sh` 只负责清空库) 20 + - 之后的代码任务(entity / DAO / service / 测试)在此之后做;测试运行时 Spring Boot 启动会由 Flyway 自动 apply 这个新 migration(`scripts/setup-test-db.sh` 只负责清空库)
21 4. 按顺序处理每个(代码类)任务: 21 4. 按顺序处理每个(代码类)任务:
22 a. 在 `test_file::test_name` 处编写失败测试。 22 a. 在 `test_file::test_name` 处编写失败测试。
23 b. **派发子会话**(通过 `Agent`,general-purpose)运行测试并确认失败;子会话只返回 `{command, exit_code, failing_assertion}`。主会话**不直接**运行测试。 23 b. **派发子会话**(通过 `Agent`,general-purpose)运行测试并确认失败;子会话只返回 `{command, exit_code, failing_assertion}`。主会话**不直接**运行测试。
@@ -32,7 +32,7 @@ allowed-tools: Read Write Edit Agent Skill Bash(git add *) Bash(git commit *) @@ -32,7 +32,7 @@ allowed-tools: Read Write Edit Agent Skill Bash(git add *) Bash(git commit *)
32 - **绝不**在主会话直接运行 `mvn test` / `pnpm test` / `scripts/test.sh`,必须通过子会话。 32 - **绝不**在主会话直接运行 `mvn test` / `pnpm test` / `scripts/test.sh`,必须通过子会话。
33 - 每次提交必须包含 REQ-XXX-NNN 标签。 33 - 每次提交必须包含 REQ-XXX-NNN 标签。
34 - 不要将不相关的变更合并到一次提交中。 34 - 不要将不相关的变更合并到一次提交中。
35 -- **禁止**在主会话直接 `mysql -e "ALTER ..."` 业务 DDL;所有业务 schema 变更必须走 `sql/migrations/V_n__<desc>.sql` 文件(只读查询 / 临时调试探索除外)。 35 +- **禁止**在主会话直接 `mysql -e "ALTER ..."` 执行业务 DDL;所有业务 schema 变更必须走 `sql/migrations/V_n__<desc>.sql` 文件(只读查询 / 临时调试探索除外)。
36 36
37 ## 衔接 37 ## 衔接
38 38
skills/coding/erp-feature-verify/SKILL.md
1 --- 1 ---
2 name: erp-feature-verify 2 name: erp-feature-verify
3 -description: 功能循环第 4 步。将功能的测试套件派发到子会话执行,用模板渲染验证证据。无证据不得声称完成。 3 +description: 功能循环第 4 步。将本功能的测试派发到子会话执行,用模板渲染验证证据。无证据不得声称完成。
4 user-invocable: false 4 user-invocable: false
5 allowed-tools: Skill Read Write Agent 5 allowed-tools: Skill Read Write Agent
6 --- 6 ---
skills/coding/erp-local-test-gate/SKILL.md
1 --- 1 ---
2 name: erp-local-test-gate 2 name: erp-local-test-gate
3 -description: MR 创建前的唯一硬闸门。子会话跑 scripts/test.sh(setup-test-db.sh 清库后,Spring Boot 启动让 Flyway apply 当前 sql/migrations/V*.sql),任一失败则停止。 3 +description: MR 创建前的唯一硬闸门。子会话执行 scripts/test.sh(setup-test-db.sh 清库后,Spring Boot 启动时 Flyway 自动 apply 当前 sql/migrations/V*.sql),任一失败则停止。
4 user-invocable: false 4 user-invocable: false
5 allowed-tools: Read Write Skill Agent Bash(git add *) Bash(git commit *) 5 allowed-tools: Read Write Skill Agent Bash(git add *) Bash(git commit *)
6 --- 6 ---
@@ -47,19 +47,19 @@ allowed-tools: Read Write Skill Agent Bash(git add *) Bash(git commit *) @@ -47,19 +47,19 @@ allowed-tools: Read Write Skill Agent Bash(git add *) Bash(git commit *)
47 请根据失败类型选择下一步: 47 请根据失败类型选择下一步:
48 48
49 ① 测试脆弱(flakey,偶发) 49 ① 测试脆弱(flakey,偶发)
50 - → 再跑 /erp-workflow:erp-coding-start  
51 - (module-start 幂等:reviews 已全 approve 会跳过功能循环,直接重跑本闸门) 50 + → 重新运行 /erp-workflow:erp-coding-start
  51 + (module-start 幂等:reviews 已全 approve 会跳过功能循环,直接重新执行本闸门)
52 52
53 ② 真有回归(某个 REQ 破坏了其他 REQ/已合并模块) 53 ② 真有回归(某个 REQ 破坏了其他 REQ/已合并模块)
54 → 定位到具体 REQ,删除其 review 记录: 54 → 定位到具体 REQ,删除其 review 记录:
55 rm docs/superpowers/reviews/*-<REQ-id>.md 55 rm docs/superpowers/reviews/*-<REQ-id>.md
56 - → 再跑 /erp-workflow:erp-coding-start 56 + → 重新运行 /erp-workflow:erp-coding-start
57 (module-start 把该 REQ 视为未完成,重走 brainstorm→...→review 循环修复) 57 (module-start 把该 REQ 视为未完成,重走 brainstorm→...→review 循环修复)
58 58
59 ③ 环境/依赖问题(DB 连不上、外部 API 失败、证书失效) 59 ③ 环境/依赖问题(DB 连不上、外部 API 失败、证书失效)
60 → 命中红旗 #6(外部接口不可达) 60 → 命中红旗 #6(外部接口不可达)
61 → 调用 Skill(erp-red-flag-check) 追加 Blocker 到本模块任一 plan 文件 61 → 调用 Skill(erp-red-flag-check) 追加 Blocker 到本模块任一 plan 文件
62 - → 修好环境后再跑 /erp-workflow:erp-coding-start 62 + → 修复环境后重新运行 /erp-workflow:erp-coding-start
63 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 63 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
64 ``` 64 ```
65 65
skills/coding/erp-module-report/SKILL.md
@@ -23,7 +23,7 @@ allowed-tools: Read Write Glob Grep Skill Bash(git diff *) Bash(git log *) Bash( @@ -23,7 +23,7 @@ allowed-tools: Read Write Glob Grep Skill Bash(git diff *) Bash(git log *) Bash(
23 - **§ ⑥ 本模块新增 migration**:用 `git diff --name-only --diff-filter=A <module-start-commit>..HEAD -- 'sql/migrations/V*.sql'` 列出本模块提交的新 migration 文件;每个文件 Read 第一行(V_n 描述)作为说明 23 - **§ ⑥ 本模块新增 migration**:用 `git diff --name-only --diff-filter=A <module-start-commit>..HEAD -- 'sql/migrations/V*.sql'` 列出本模块提交的新 migration 文件;每个文件 Read 第一行(V_n 描述)作为说明
24 - `docs/superpowers/module-reports/<module_id>-cross-module.md` → § ⑦ 24 - `docs/superpowers/module-reports/<module_id>-cross-module.md` → § ⑦
25 - `docs/superpowers/module-reports/<module_id>-test-gate.md` → § ⑤ 25 - `docs/superpowers/module-reports/<module_id>-test-gate.md` → § ⑤
26 - - § ④(读写的表):**用 `grep -rlE "(SELECT|INSERT|UPDATE|DELETE).*FROM|INTO"` 定位涉及 SQL 的文件,再按需 Read 片段**。不要全量读 docs/03。 26 + - § ④(读写的表):**用 `grep -rlE "(SELECT|INSERT|UPDATE|DELETE).*FROM|INTO"` 定位涉及 SQL 的文件,再按需读取片段**。不要全量读取 docs/03。
27 3. 用 `Read` 读取 `${CLAUDE_SKILL_DIR}/templates/module-report-template.md`,填充全部 12 节。 27 3. 用 `Read` 读取 `${CLAUDE_SKILL_DIR}/templates/module-report-template.md`,填充全部 12 节。
28 4. **硬性验证**: 28 4. **硬性验证**:
29 - § ⑦:如果 cross-module 有任何行含 `TBD(CC 补)` → **停止**,调用 `Skill(erp-cross-module-log)` 让 CC **自主推断**补齐,补完再回本步骤重验。 29 - § ⑦:如果 cross-module 有任何行含 `TBD(CC 补)` → **停止**,调用 `Skill(erp-cross-module-log)` 让 CC **自主推断**补齐,补完再回本步骤重验。
skills/coding/erp-module-start/SKILL.md
1 --- 1 ---
2 name: erp-module-start 2 name: erp-module-start
3 -description: 启动/恢复模块循环。按 docs/02 § 二 REQ 清单定位当前模块及其 REQ 序列,确保处于模块分支,扫 docs/superpowers/reviews/ 计算已完成 REQ,驱动第一个未完成 REQ 的功能循环;全部完成则调 erp-local-test-gate。幂等可重入。 3 +description: 启动/恢复模块循环。按 docs/02 § 二 REQ 清单定位当前模块及其 REQ 序列,确保处于模块分支,扫描 docs/superpowers/reviews/ 计算已完成 REQ,驱动第一个未完成 REQ 的功能循环;全部完成则调用 erp-local-test-gate。幂等可重入。
4 user-invocable: false 4 user-invocable: false
5 allowed-tools: Read Write Skill Glob Grep Bash(git branch *) Bash(git checkout *) Bash(git rev-parse *) Bash(glab mr *) 5 allowed-tools: Read Write Skill Glob Grep Bash(git branch *) Bash(git checkout *) Bash(git rev-parse *) Bash(glab mr *)
6 --- 6 ---
@@ -13,20 +13,20 @@ allowed-tools: Read Write Skill Glob Grep Bash(git branch *) Bash(git checkout * @@ -13,20 +13,20 @@ allowed-tools: Read Write Skill Glob Grep Bash(git branch *) Bash(git checkout *
13 13
14 ### 步骤 1:按 `docs/02 § 二` REQ 序 + MR state 定位当前模块 + 本模块 REQ 列表 14 ### 步骤 1:按 `docs/02 § 二` REQ 序 + MR state 定位当前模块 + 本模块 REQ 列表
15 15
16 -与 `erp-coding-start` 步骤 3 同构(完成判定权威是 `MR:` 字段 + `glab mr view state`,不看 checkbox): 16 +与 `erp-coding-start` 步骤 3 同构(完成判定以 `MR:` 字段 + `glab mr view state` 为准):
17 17
18 - 用 `Read` 读取 `docs/02-开发计划.md`,用 `Grep`(pattern `^\|\s*[0-9]+\s*\|\s*\*\*(REQ-[A-Z0-9]+-[0-9]+)\*\*\s*\|\s*(module_\w+)`)抽取 § 二 表格数据行,按行号升序得 `req_order[]`。 18 - 用 `Read` 读取 `docs/02-开发计划.md`,用 `Grep`(pattern `^\|\s*[0-9]+\s*\|\s*\*\*(REQ-[A-Z0-9]+-[0-9]+)\*\*\s*\|\s*(module_\w+)`)抽取 § 二 表格数据行,按行号升序得 `req_order[]`。
19 - 若 `req_order` 为空 → 打印"⚠️ docs/02 § 二 REQ 开发顺序清单为空或无法解析,请检查"并停止。 19 - 若 `req_order` 为空 → 打印"⚠️ docs/02 § 二 REQ 开发顺序清单为空或无法解析,请检查"并停止。
20 - 初始化 `module_merged[module_id → bool]` 空缓存。按序遍历 `req_order[]`: 20 - 初始化 `module_merged[module_id → bool]` 空缓存。按序遍历 `req_order[]`:
21 - `module_merged[module_id]` 已缓存为 `true` → 跳过本 REQ。 21 - `module_merged[module_id]` 已缓存为 `true` → 跳过本 REQ。
22 - `module_merged[module_id]` 已缓存为 `false` → `current_module = module_id`,结束遍历。 22 - `module_merged[module_id]` 已缓存为 `false` → `current_module = module_id`,结束遍历。
23 - - 未缓存 → 读 docs/08 § 二 该模块条目的 ` - MR:` 字段: 23 + - 未缓存 → 读 docs/08 § 二 该模块条目的 ` - MR:` 字段:
24 - `MR: —` → `module_merged[module_id] = false`,`current_module = module_id`,结束遍历。 24 - `MR: —` → `module_merged[module_id] = false`,`current_module = module_id`,结束遍历。
25 - `MR: !<iid>` → `Bash`: `glab mr view <iid> -F json 2>/dev/null`,取 `.state`: 25 - `MR: !<iid>` → `Bash`: `glab mr view <iid> -F json 2>/dev/null`,取 `.state`:
26 - `merged` → 缓存 `true`,跳过本 REQ。 26 - `merged` → 缓存 `true`,跳过本 REQ。
27 - 其他 → 缓存 `false`,`current_module = module_id`,结束遍历。 27 - 其他 → 缓存 `false`,`current_module = module_id`,结束遍历。
28 - **抽取本模块 REQ 序列 `req_list[]`**:从 `req_order[]` 取出所有 `module_id == current_module` 的项,按原序组成(同模块 REQ 必须连续,见 A5 约束)。 28 - **抽取本模块 REQ 序列 `req_list[]`**:从 `req_order[]` 取出所有 `module_id == current_module` 的项,按原序组成(同模块 REQ 必须连续,见 A5 约束)。
29 -- 用 `Read` 读取 docs/08 § 二 该模块行 + 后续缩进行,提取 `module_name` / `depends_on`(REQ 列表以 docs/02 为权威,不再读 docs/08)。 29 +- 用 `Read` 读取 docs/08 § 二 该模块行 + 后续缩进行,提取 `module_name` / `depends_on`(REQ 列表以 docs/02 为准,不再读取 docs/08)。
30 30
31 ### 步骤 2:所有模块已完成短路 31 ### 步骤 2:所有模块已完成短路
32 32
@@ -66,7 +66,7 @@ allowed-tools: Read Write Skill Glob Grep Bash(git branch *) Bash(git checkout * @@ -66,7 +66,7 @@ allowed-tools: Read Write Skill Glob Grep Bash(git branch *) Bash(git checkout *
66 ## 参考 66 ## 参考
67 67
68 - `docs/02-开发计划.md § 二 开发顺序清单`(分发权威) 68 - `docs/02-开发计划.md § 二 开发顺序清单`(分发权威)
69 -- `docs/08-模块任务管理.md § 二`(模块元数据 + `MR:` 字段;每模块行是 `- module_id ...` bullet,无 checkbox;完成判定权威是 MR state 69 +- `docs/08-模块任务管理.md § 二`(模块元数据,含 `MR:` 字段;完成判定以 MR state 为准
70 - `docs/superpowers/reviews/*.md`(REQ 级进度事实——verdict=approve 即完成) 70 - `docs/superpowers/reviews/*.md`(REQ 级进度事实——verdict=approve 即完成)
71 - `${CLAUDE_SKILL_DIR}/templates/module-start-banner-template.md` 71 - `${CLAUDE_SKILL_DIR}/templates/module-start-banner-template.md`
72 - `${CLAUDE_SKILL_DIR}/templates/cross-module-log-template.md` 72 - `${CLAUDE_SKILL_DIR}/templates/cross-module-log-template.md`
skills/coding/erp-mr-create/SKILL.md
1 --- 1 ---
2 name: erp-mr-create 2 name: erp-mr-create
3 -description: 模块报告完成后,验证当前分支为 module-<id> + worktree 干净,push 推代码和所有 evidence,创建 GitLab MR(报告嵌入描述),把 MR URL 追加到模块报告 § ⑫ 并 commit,把 MR iid 回写到 docs/08 该模块 `MR:` 字段并 commit,再次 push 同步。完成信号由 MR merged state 判定(docs/08 无 checkbox)。停下等待人工审核。 3 +description: 模块报告完成后,验证当前分支为 module-<id> 且 worktree 干净,push 推代码和所有 evidence,创建 GitLab MR(报告嵌入描述),把 MR URL 追加到模块报告 § ⑫ 并 commit,把 MR iid 回写到 docs/08 该模块 `MR:` 字段并 commit,再次 push 同步。完成信号由 MR merged state 判定。停下等待人工审核。
4 user-invocable: false 4 user-invocable: false
5 allowed-tools: Read Write Edit Skill Bash(git *) Bash(glab *) Bash(sed *) Bash(awk *) Bash(cat *) Bash(echo *) Bash(mkdir -p .tmp) Bash(mv .tmp/*) Bash(rm -f .tmp/*) 5 allowed-tools: Read Write Edit Skill Bash(git *) Bash(glab *) Bash(sed *) Bash(awk *) Bash(cat *) Bash(echo *) Bash(mkdir -p .tmp) Bash(mv .tmp/*) Bash(rm -f .tmp/*)
6 --- 6 ---
@@ -24,7 +24,7 @@ allowed-tools: Read Write Edit Skill Bash(git *) Bash(glab *) Bash(sed *) Bash(a @@ -24,7 +24,7 @@ allowed-tools: Read Write Edit Skill Bash(git *) Bash(glab *) Bash(sed *) Bash(a
24 ### 步骤 1:验证当前分支 24 ### 步骤 1:验证当前分支
25 25
26 - `Bash`: `git branch --show-current` → `current_branch`。 26 - `Bash`: `git branch --show-current` → `current_branch`。
27 -- `current_branch` 必须匹配 `module-*`;否则打印错误并**停止**(不自动建分支——分支职责在 `erp-module-start` 步骤 3)。 27 +- `current_branch` 必须匹配 `module-*`;否则打印错误并**停止**(不自动建分支——分支职责在 `erp-module-start` 步骤 3)。
28 - 从 `current_branch` 取 `module_id = current_branch` 去掉 `"module-"` 前缀。 28 - 从 `current_branch` 取 `module_id = current_branch` 去掉 `"module-"` 前缀。
29 29
30 ### 步骤 2:验证 worktree 干净(防止 evidence 文件漏 commit) 30 ### 步骤 2:验证 worktree 干净(防止 evidence 文件漏 commit)
@@ -43,7 +43,7 @@ allowed-tools: Read Write Edit Skill Bash(git *) Bash(glab *) Bash(sed *) Bash(a @@ -43,7 +43,7 @@ allowed-tools: Read Write Edit Skill Bash(git *) Bash(glab *) Bash(sed *) Bash(a
43 - erp-module-report 步骤 5b 是否已 commit 模块报告 + cross-module log? 43 - erp-module-report 步骤 5b 是否已 commit 模块报告 + cross-module log?
44 - 本 skill 前没人跑过额外的 Edit/Write? 44 - 本 skill 前没人跑过额外的 Edit/Write?
45 45
46 - 修复方式:`git add <files> && git commit -m "..."`,然后重 /erp-workflow:erp-coding-start。 46 + 修复方式:`git add <files> && git commit -m "..."`,然后重新运行 /erp-workflow:erp-coding-start。
47 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 47 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
48 ``` 48 ```
49 49
@@ -98,7 +98,7 @@ rm -f .tmp/mr-title.txt .tmp/mr-desc.md @@ -98,7 +98,7 @@ rm -f .tmp/mr-title.txt .tmp/mr-desc.md
98 98
99 ### 步骤 8:回写 docs/08 的 MR 字段并 commit 99 ### 步骤 8:回写 docs/08 的 MR 字段并 commit
100 100
101 -- `Edit docs/08-模块任务管理.md`:把当前模块条目的 ` - MR: —` 改为 ` - MR: !<iid>`(只改一行)。docs/08 § 二每模块是 bullet(`- module_id ...`,无 checkbox),`MR:` 字段是唯一动态字段。 101 +- `Edit docs/08-模块任务管理.md`:把当前模块条目的 ` - MR: —` 改为 ` - MR: !<iid>`(只改一行)。docs/08 § 二 中 `MR:` 是唯一动态字段。
102 - `Bash`: `git add docs/08-模块任务管理.md && git commit -m "chore(<module_id>): record MR !<iid> in docs/08"`。 102 - `Bash`: `git add docs/08-模块任务管理.md && git commit -m "chore(<module_id>): record MR !<iid> in docs/08"`。
103 103
104 ### 步骤 9:再次 push 104 ### 步骤 9:再次 push
@@ -111,12 +111,12 @@ rm -f .tmp/mr-title.txt .tmp/mr-desc.md @@ -111,12 +111,12 @@ rm -f .tmp/mr-title.txt .tmp/mr-desc.md
111 111
112 ### 步骤 11:停止 — 等待人工 Approve + Merge 112 ### 步骤 11:停止 — 等待人工 Approve + Merge
113 113
114 -用户合并后再 `/erp-workflow:erp-coding-start`,入口会自动检测 MR merged → `git checkout main` + `git pull --ff-only` 同步远程 + 派发下一模块。 114 +用户合并后再次运行 `/erp-workflow:erp-coding-start`,入口会自动检测 MR merged → `git checkout main` + `git pull --ff-only` 同步远程 + 派发下一模块。
115 115
116 ## 设计要点 116 ## 设计要点
117 117
118 -- **main 是 protected branch**,只能通过 MR 修改。MR diff 包含:代码 + 模块报告 + test-gate evidence + cross-module log + docs/08 的 `MR: !<iid>` 字段。  
119 -- **完成信号由 MR state 判定**——docs/08 § 二每模块是 bullet(无 checkbox),没有可翻勾的地方。从结构上消除"用户抢跑 coding-start 跳过未合并模块"的 ordering bug。仅 `MR:` 字段在 `—` / `!<iid>` 之间变化。 118 +- **main 是 protected branch**,只能通过 MR 修改。MR diff 覆盖代码、模块报告、test-gate evidence、cross-module log,以及 docs/08 的 `MR: !<iid>` 字段。
  119 +- **完成信号以 MR state 为准**:docs/08 § 二 中仅 `MR:` 字段在 `—` / `!<iid>` 之间变化,避免提前合并未完成模块的顺序错误。
120 - **worktree 干净前置**(步骤 2):保证 test-gate.md、module-report.md、cross-module log.md 都已进 repo,审计证据完整;防止下次 coding-start `git checkout main` 遇到 dirty state。 120 - **worktree 干净前置**(步骤 2):保证 test-gate.md、module-report.md、cross-module log.md 都已进 repo,审计证据完整;防止下次 coding-start `git checkout main` 遇到 dirty state。
121 121
122 ## 参考 122 ## 参考
skills/coding/erp-mr-create/templates/mr-description-template.md
@@ -15,4 +15,4 @@ @@ -15,4 +15,4 @@
15 ## 审核入口 15 ## 审核入口
16 16
17 - 本 MR = 模块 `{{module_id}}` 的唯一人工介入点 17 - 本 MR = 模块 `{{module_id}}` 的唯一人工介入点
18 -- Approve + Merge 后,下次用户跑 `/erp-workflow:erp-coding-start` 时入口会自动扫到 `glab mr view state=merged`,`git pull --ff-only` 同步 main 并推进下一模块。docs/08 § 二每模块是 bullet(无 checkbox),完成由 MR state 判定 18 +- Approve + Merge 后,下次用户运行 `/erp-workflow:erp-coding-start` 时入口会自动扫描到 `glab mr view state=merged`,`git pull --ff-only` 同步 main 并推进下一模块
skills/crosscut/erp-coding-start/SKILL.md
1 --- 1 ---
2 name: erp-coding-start 2 name: erp-coding-start
3 -description: B 阶段(Coding)入å£ã€‚å…ˆéªŒè¯ Plan 已完æˆï¼›æŒ‰ docs/02 § 二 REQ å¼€å‘é¡ºåºæ¸…啿‰«ï¼Œå¯¹æ¯ä¸ª REQ 所属模å—用 docs/08 çš„ `MR:` 字段 + `glab mr view state` 判完æˆâ€”—merged 跳过,`—` 或 opened/closed é€‰ä¸ºå½“å‰æ¨¡å—å¹¶æ´¾å‘到 erp-module-start。派å‘å‰å…ˆ git checkout main + pull --ff-only ä¿æŒ base 最新。docs/08 § 二 æ¯æ¨¡å—是 bullet(无 checkbox),完æˆç”± MR state 判定。 3 +description: B 阶段(Coding)入å£ã€‚å…ˆéªŒè¯ Plan 已完æˆï¼›æŒ‰ docs/02 § 二 REQ å¼€å‘é¡ºåºæ¸…啿‰«æï¼Œå¯¹æ¯ä¸ª REQ 所属模å—用 docs/08 çš„ `MR:` 字段 + `glab mr view state` 判定是å¦å®Œæˆâ€”—merged 跳过,`—` 或 opened/closed é€‰ä¸ºå½“å‰æ¨¡å—å¹¶æ´¾å‘到 erp-module-start。派å‘å‰å…ˆ git checkout main + pull --ff-only ä¿æŒ base 最新。
4 user-invocable: true 4 user-invocable: true
5 allowed-tools: Skill Read Glob Grep Bash(glab mr *) Bash(git branch *) Bash(git checkout *) Bash(git pull *) Bash(git status *) 5 allowed-tools: Skill Read Glob Grep Bash(glab mr *) Bash(git branch *) Bash(git checkout *) Bash(git pull *) Bash(git status *)
6 --- 6 ---
7 7
8 **所有输出必须使用中文。** 8 **所有输出必须使用中文。**
9 9
10 -B 阶段(Coding)的入å£åˆ†å‘器。èŒè´£ï¼š**éªŒè¯ Plan å·²å®Œæˆ â†’ 按 docs/02 § 二 REQ åº + MR state æ‰¾å½“å‰æ¨¡å— → 切回 main åŒæ­¥ remote → æ´¾å‘ erp-module-start**。ä¸ç›´æŽ¥ç”Ÿæˆä»»ä½•文件。开å‘é¡ºåºæƒå¨æ˜¯ `docs/02 § 二`;完æˆåˆ¤å®šæƒå¨æ˜¯ `docs/08 æ¡ç›®çš„ MR: 字段 + glab mr view state`(docs/08 § äºŒæ¯æ¨¡å—是 bullet,无 checkbox)。 10 +B 阶段(Coding)的入å£åˆ†å‘器。èŒè´£ï¼š**éªŒè¯ Plan å·²å®Œæˆ â†’ 按 docs/02 § 二 REQ åº + MR state 定ä½å½“剿¨¡å— → 切回 main å¹¶åŒæ­¥è¿œç¨‹ → æ´¾å‘ erp-module-start**。ä¸ç›´æŽ¥ç”Ÿæˆä»»ä½•文件。开å‘顺åºä»¥ `docs/02 § 二` 为准;完æˆåˆ¤å®šä»¥ `docs/08 æ¡ç›®çš„ MR: 字段 + glab mr view state` 为准。
11 11
12 ## 执行步骤 12 ## 执行步骤
13 13
@@ -18,7 +18,7 @@ B 阶段(Coding)的入å£åˆ†å‘器。èŒè´£ï¼š**éªŒè¯ Plan å·²å®Œæˆ â†’ æŒ @@ -18,7 +18,7 @@ B 阶段(Coding)的入å£åˆ†å‘器。èŒè´£ï¼š**éªŒè¯ Plan å·²å®Œæˆ â†’ æŒ
18 18
19 ### 步骤 2:Plan å®Œæˆæ€§æ£€æŸ¥ 19 ### 步骤 2:Plan å®Œæˆæ€§æ£€æŸ¥
20 20
21 -用 `Grep` 在 `docs/08-模å—任务管ç†.md` æœ `^- \[ \] A[0-5]`(pattern å¯ä»¥ç›´æŽ¥åŒ¹é…父项未勾的情况;也å¯ä»¥æ›´å®½åœ°æœ `^[[:space:]]*- \[ \].*A[0-5]` 涵盖å­é¡¹ï¼‰ã€‚ 21 +用 `Grep` 在 `docs/08-模å—任务管ç†.md` æœç´¢ `^- \[ \] A[0-5]`(pattern å¯ä»¥ç›´æŽ¥åŒ¹é…父项未勾的情况;也å¯ä»¥ç”¨æ›´å®½çš„ `^[[:space:]]*- \[ \].*A[0-5]` 覆盖å­é¡¹ï¼‰ã€‚
22 22
23 - **命中任一 A 未勾** → 打å°ï¼š 23 - **命中任一 A 未勾** → 打å°ï¼š
24 ``` 24 ```
@@ -44,7 +44,7 @@ B 阶段(Coding)的入å£åˆ†å‘器。èŒè´£ï¼š**éªŒè¯ Plan å·²å®Œæˆ â†’ æŒ @@ -44,7 +44,7 @@ B 阶段(Coding)的入å£åˆ†å‘器。èŒè´£ï¼š**éªŒè¯ Plan å·²å®Œæˆ â†’ æŒ
44 - 若 `module_merged[module_id]` 已有缓存: 44 - 若 `module_merged[module_id]` 已有缓存:
45 - `true` → 跳过本 REQ,继续下一个 45 - `true` → 跳过本 REQ,继续下一个
46 - `false` → `current_module = module_id`,结æŸé历,进入步骤 4 46 - `false` → `current_module = module_id`,结æŸé历,进入步骤 4
47 - - 未缓存 → 读 docs/08 § 二 è¯¥æ¨¡å—æ¡ç›®çš„ ` - MR:` 字段: 47 + - 未缓存 → è¯»å– docs/08 § 二 è¯¥æ¨¡å—æ¡ç›®çš„ ` - MR:` 字段:
48 - `MR: —` → `module_merged[module_id] = false`ï¼›`current_module = module_id`,结æŸé历 48 - `MR: —` → `module_merged[module_id] = false`ï¼›`current_module = module_id`,结æŸé历
49 - `MR: !<iid>` → `Bash`: `glab mr view <iid> -F json 2>/dev/null`ï¼Œè§£æž `.state`: 49 - `MR: !<iid>` → `Bash`: `glab mr view <iid> -F json 2>/dev/null`ï¼Œè§£æž `.state`:
50 - `merged` → `module_merged[module_id] = true`,跳过本 REQ 50 - `merged` → `module_merged[module_id] = true`,跳过本 REQ
@@ -71,7 +71,7 @@ B 阶段(Coding)的入å£åˆ†å‘器。èŒè´£ï¼š**éªŒè¯ Plan å·²å®Œæˆ â†’ æŒ @@ -71,7 +71,7 @@ B 阶段(Coding)的入å£åˆ†å‘器。èŒè´£ï¼š**éªŒè¯ Plan å·²å®Œæˆ â†’ æŒ
71 71
72 <git status 输出> 72 <git status 输出>
73 73
74 - 请手工处ç†åŽé‡è·‘ /erp-workflow:erp-coding-start。 74 + 请手工处ç†åŽé‡æ–°è¿è¡Œ /erp-workflow:erp-coding-start。
75 â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â” 75 â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”
76 ``` 76 ```
77 å¹¶**åœä¸‹**。 77 å¹¶**åœä¸‹**。
@@ -86,7 +86,7 @@ B 阶段(Coding)的入å£åˆ†å‘器。èŒè´£ï¼š**éªŒè¯ Plan å·²å®Œæˆ â†’ æŒ @@ -86,7 +86,7 @@ B 阶段(Coding)的入å£åˆ†å‘器。èŒè´£ï¼š**éªŒè¯ Plan å·²å®Œæˆ â†’ æŒ
86 git status 86 git status
87 git log main..origin/main # 远程领先的 commit 87 git log main..origin/main # 远程领先的 commit
88 git log origin/main..main # 本地未推的 commit 88 git log origin/main..main # 本地未推的 commit
89 - ä¿®å¤åŽé‡è·‘ /erp-workflow:erp-coding-start。 89 + ä¿®å¤åŽé‡æ–°è¿è¡Œ /erp-workflow:erp-coding-start。
90 â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â” 90 â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”
91 ``` 91 ```
92 å¹¶**åœä¸‹**。 92 å¹¶**åœä¸‹**。
@@ -105,19 +105,16 @@ B 阶段(Coding)的入å£åˆ†å‘器。èŒè´£ï¼š**éªŒè¯ Plan å·²å®Œæˆ â†’ æŒ @@ -105,19 +105,16 @@ B 阶段(Coding)的入å£åˆ†å‘器。èŒè´£ï¼š**éªŒè¯ Plan å·²å®Œæˆ â†’ æŒ
105 105
106 ç„¶åŽç«‹å³ç”¨ `Skill` 工具调用 `erp-module-start`。 106 ç„¶åŽç«‹å³ç”¨ `Skill` 工具调用 `erp-module-start`。
107 107
108 -> 分å‘å‰å…ˆè°ƒ `erp-red-flag-check`;命中红旗则åœåœ¨æ­¤ä¸åˆ†å‘。 108 +> 分å‘å‰å…ˆè°ƒç”¨ `erp-red-flag-check`;命中红旗则åœåœ¨æ­¤ä¸åˆ†å‘。
109 109
110 ## 设计è¦ç‚¹ 110 ## 设计è¦ç‚¹
111 111
112 -- **完æˆåˆ¤å®šç›´æŽ¥è¯» `MR:` 字段 + `glab mr view state`**:docs/08 § 二 æ¯æ¨¡å—是 bullet(无 checkbox),没有å¯ç¿»å‹¾çš„地方。这从结构上消除了 Codex adversarial review Finding 1 æè¿°çš„"用户抢跑 coding-start 跳过未åˆå¹¶æ¨¡å—"çš„ ordering bug:  
113 - - MR 未 merge 剿œ¬åœ° docs/08 没有任何"已完æˆ"标记  
114 - - å³ä½¿ç”¨æˆ·æŠ¢è·‘ coding-start,步骤 3 扫到 MR opened ä»ä¼šé€‰ä¸­å½“剿¨¡å—ï¼ˆä¸æ˜¯è·³åˆ°ä¸‹ä¸€æ¨¡å—)  
115 - - module-start 会 `git checkout module-<id>` 回到原分支,用户看到"ç»§ç»­åœ¨å½“å‰æ¨¡å—"而éž"开始下一模å—"  
116 -- **pull main 时机**:原设计里 pull main 是 merged åˆ†æ”¯ç‰¹æœ‰åŠ¨ä½œï¼›æ–°è®¾è®¡é‡Œæ¯æ¬¡æ´¾å‘å‰éƒ½ pull main(代ç åŒæ­¥ + module-start 切新分支时 base 新鲜)。 112 +- **完æˆåˆ¤å®šç›´æŽ¥è¯»å– `MR:` 字段 + `glab mr view state`**:MR 未 merge å‰ docs/08 没有任何"已完æˆ"标记;用户æå‰è§¦å‘ coding-start 时,步骤 3 扫æåˆ° MR opened ä»ä¼šé€‰ä¸­å½“剿¨¡å—,module-start 会 `git checkout module-<id>` 回到原分支继续,ä¸ä¼šè·³åˆ°ä¸‹ä¸€æ¨¡å—。
  113 +- **æ¯æ¬¡æ´¾å‘å‰éƒ½ pull main**:代ç åŒæ­¥çš„åŒæ—¶ï¼Œä¹Ÿä¿è¯ module-start 切出新分支时 base 新鲜。
117 114
118 ## å‚考 115 ## å‚考
119 116
120 - `docs/02-å¼€å‘计划.md § 二 å¼€å‘é¡ºåºæ¸…å•`ï¼ˆåˆ†å‘æƒå¨ï¼‰ 117 - `docs/02-å¼€å‘计划.md § 二 å¼€å‘é¡ºåºæ¸…å•`ï¼ˆåˆ†å‘æƒå¨ï¼‰
121 -- `docs/08-模å—任务管ç†.md § 二`(模å—å…ƒæ•°æ® + `MR:` å­—æ®µï¼›æ¯æ¨¡å—行是 `- module_id ...` bullet,无 checkbox) 118 +- `docs/08-模å—任务管ç†.md § 二`(模å—元数æ®ï¼Œå« `MR:` 字段)
122 - `CLAUDE.md`(项目指令) 119 - `CLAUDE.md`(项目指令)
123 - `erp-plan-start`(姊妹入å£ï¼ŒA 阶段) 120 - `erp-plan-start`(姊妹入å£ï¼ŒA 阶段)
skills/crosscut/erp-plan-start/SKILL.md
1 --- 1 ---
2 name: erp-plan-start 2 name: erp-plan-start
3 description: A 阶段(Plan)入å£ä¸Žåˆ†å‘å™¨ã€‚æ ¹æ® docs/08 § 一 çš„ checkbox çŠ¶æ€æ´¾å‘到 A0~A5 对应 skill(§ 二是 B 阶段模å—元数æ®ï¼Œæœ¬ skill ä¸è¯»ï¼‰ã€‚Plan 全部完æˆï¼ˆA5 å·²å‹¾ï¼‰æ—¶æ‰“å°æç¤ºè®©ç”¨æˆ·è¿è¡Œ /erp-workflow:erp-coding-start 进入 B 阶段。 3 description: A 阶段(Plan)入å£ä¸Žåˆ†å‘å™¨ã€‚æ ¹æ® docs/08 § 一 çš„ checkbox çŠ¶æ€æ´¾å‘到 A0~A5 对应 skill(§ 二是 B 阶段模å—元数æ®ï¼Œæœ¬ skill ä¸è¯»ï¼‰ã€‚Plan 全部完æˆï¼ˆA5 å·²å‹¾ï¼‰æ—¶æ‰“å°æç¤ºè®©ç”¨æˆ·è¿è¡Œ /erp-workflow:erp-coding-start 进入 B 阶段。
  4 +user-invocable: true
4 allowed-tools: Skill Read Glob Grep 5 allowed-tools: Skill Read Glob Grep
5 --- 6 ---
6 7
@@ -20,7 +21,7 @@ docs/08 § 一 是**Plan 阶段进度æƒå¨**(A0~A5 çš„ checkbox)。ä¸åšå… @@ -20,7 +21,7 @@ docs/08 § 一 是**Plan 阶段进度æƒå¨**(A0~A5 çš„ checkbox)。ä¸åšå…
20 21
21 2. **找 § 一 第一个未勾的 A å­é¡¹** 22 2. **找 § 一 第一个未勾的 A å­é¡¹**
22 用 `Grep`(pattern `^[[:space:]]*- \[ \].*A[0-5]`,`-n`)在 `docs/08-模å—任务管ç†.md` çš„ § 一 Plan 段æœç´¢ï¼Œå–**最å°è¡Œå·**那一行作为 `unchecked_line`。 23 用 `Grep`(pattern `^[[:space:]]*- \[ \].*A[0-5]`,`-n`)在 `docs/08-模å—任务管ç†.md` çš„ § 一 Plan 段æœç´¢ï¼Œå–**最å°è¡Œå·**那一行作为 `unchecked_line`。
23 - 注:§ 二 的模å—行是纯 bullet(`- module_id ...`,无 checkbox),ä¸ä¼šè¢«æ­¤ pattern 匹é…。 24 + 注:§ 二 的模å—行是纯 bullet(形如 `- module_id ...`),ä¸ä¼šè¢«æ­¤ pattern 匹é…。
24 25
25 3. **把 `unchecked_line` 映射到 `target_skill` + `mark_line`**: 26 3. **把 `unchecked_line` 映射到 `target_skill` + `mark_line`**:
26 27
@@ -35,7 +36,7 @@ docs/08 § 一 是**Plan 阶段进度æƒå¨**(A0~A5 çš„ checkbox)。ä¸åšå… @@ -35,7 +36,7 @@ docs/08 § 一 是**Plan 阶段进度æƒå¨**(A0~A5 çš„ checkbox)。ä¸åšå…
35 | å« `A5` / A5 å­é¡¹ | `erp-downstream-gen` | `A5` | 36 | å« `A5` / A5 å­é¡¹ | `erp-downstream-gen` | `A5` |
36 | 无命中(A 全勾,Plan 阶段结æŸï¼‰ | **无分å‘** | `plan-done` | 37 | 无命中(A 全勾,Plan 阶段结æŸï¼‰ | **无分å‘** | `plan-done` |
37 38
38 -项目完æˆçжæ€ï¼ˆB é˜¶æ®µæ‰€æœ‰æ¨¡å— MR merged)由 `erp-coding-start` 扫 MR state 判定并打å°ï¼Œæœ¬ skill ä¸å¤„ç†ã€‚ 39 +项目完æˆçжæ€ï¼ˆB é˜¶æ®µæ‰€æœ‰æ¨¡å— MR merged)由 `erp-coding-start` 扫æ MR state 判定并打å°ï¼Œæœ¬ skill ä¸å¤„ç†ã€‚
39 40
40 ## 第二步:分å‘通知 + 调用目标 skill 41 ## 第二步:分å‘通知 + 调用目标 skill
41 42
@@ -43,7 +44,7 @@ docs/08 § 一 是**Plan 阶段进度æƒå¨**(A0~A5 çš„ checkbox)。ä¸åšå… @@ -43,7 +44,7 @@ docs/08 § 一 是**Plan 阶段进度æƒå¨**(A0~A5 çš„ checkbox)。ä¸åšå…
43 44
44 ### 2.1 Plan 已完æˆï¼ˆ`mark_line=plan-done`) 45 ### 2.1 Plan 已完æˆï¼ˆ`mark_line=plan-done`)
45 46
46 -A 阶段所有 checkbox å‡ `[x]`。因无下游 A skill 接手,本步骤**è‡ªå·±æ‰“å°æµç¨‹å›¾**(`â–¶` 标在"规划阶段到此结æŸ")+ æç¤ºï¼Œ**åœä¸‹**;项目整体完æˆçжæ€ç”± `erp-coding-start` 扫 MR state 判定,本 skill ä¸è´Ÿè´£ï¼š 47 +A 阶段所有 checkbox å‡ `[x]`。因无下游 A skill 接手,本步骤**è‡ªè¡Œæ‰“å°æµç¨‹å›¾**(`â–¶` 标在"规划阶段到此结æŸ")并给出æç¤ºï¼Œç„¶åŽ**åœä¸‹**;项目整体完æˆçжæ€ç”± `erp-coding-start` 扫æ MR state 判定,本 skill ä¸è´Ÿè´£ï¼š
47 48
48 ``` 49 ```
49 ┌──────────────────────────────────────────────────────┠50 ┌──────────────────────────────────────────────────────â”
@@ -51,9 +52,9 @@ A 阶段所有 checkbox å‡ `[x]`。因无下游 A skill 接手,本步骤**自 @@ -51,9 +52,9 @@ A 阶段所有 checkbox å‡ `[x]`。因无下游 A skill 接手,本步骤**自
51 │ │ 52 │ │
52 │ A0 åˆå§‹åŒ–项目 → A1 é”范围(REQ å¡ç‰‡ï¼‰ │ 53 │ A0 åˆå§‹åŒ–项目 → A1 é”范围(REQ å¡ç‰‡ï¼‰ │
53 │ ↓ │ 54 │ ↓ │
54 -│ ⸠等你审阅 REQ,é‡è·‘ /erp-plan-start ç»­ │ 55 +│ ⸠等你审阅 REQï¼Œé‡æ–°è¿è¡Œ /erp-plan-start ç»§ç»­ │
55 │ ↓ │ 56 │ ↓ │
56 -│ A2 生骨架 → A3 åˆå§‹åŒ– DB → A4 生 DB 设计 → A5 生下游文档│ 57 +│ A2 生æˆéª¨æž¶ → A3 åˆå§‹åŒ– DB → A4 ç”Ÿæˆ DB 设计 → A5 生æˆä¸‹æ¸¸æ–‡æ¡£â”‚
57 │ ↓ │ 58 │ ↓ │
58 │ â–¶ è§„åˆ’é˜¶æ®µåˆ°æ­¤ç»“æŸ â”‚ 59 │ â–¶ è§„åˆ’é˜¶æ®µåˆ°æ­¤ç»“æŸ â”‚
59 └──────────────────────────────────────────────────────┘ 60 └──────────────────────────────────────────────────────┘
@@ -61,7 +62,12 @@ A 阶段所有 checkbox å‡ `[x]`。因无下游 A skill 接手,本步骤**自 @@ -61,7 +62,12 @@ A 阶段所有 checkbox å‡ `[x]`。因无下游 A skill 接手,本步骤**自
61 â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â” 62 â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”
62 [erp-plan-start] ✅ Plan é˜¶æ®µå…¨éƒ¨å®Œæˆ 63 [erp-plan-start] ✅ Plan 阶段全部完æˆ
63 64
64 - 请è¿è¡Œ /erp-workflow:erp-coding-start 进入 B 阶段模å—循环。 65 + âš ï¸ è¿›å…¥ B 阶段å‰å¿…须完æˆï¼š
  66 + 1. 人工通读 docs/01~10 + CLAUDE.md + sql/migrations/V1 + å„ scripts/*
  67 + 2. 把全部 Plan 产物 commit 到 main 分支:
  68 + git add -A && git commit -m "chore: plan phase A0~A5 done"
  69 + 3. 建 Plan MR æäº¤å›¢é˜Ÿå®¡æ ¸ï¼Œåˆå¹¶åŽ main æˆä¸º B 阶段æ¯ä¸ªæ¨¡å—分支的基线
  70 + 4. MR åˆå¹¶åŽå†è¿è¡Œ /erp-workflow:erp-coding-start 进入 B 阶段
65 â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â” 71 â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”
66 ``` 72 ```
67 73
skills/plan/erp-db-design-gen/SKILL.md
@@ -26,9 +26,9 @@ allowed-tools: Read Write Edit Grep Glob Skill Bash(mysql *) Bash(source *) @@ -26,9 +26,9 @@ allowed-tools: Read Write Edit Grep Glob Skill Bash(mysql *) Bash(source *)
26 │ │ 26 │ │
27 │ A0 初始化项目 → A1 锁范围(REQ 卡片) │ 27 │ A0 初始化项目 → A1 锁范围(REQ 卡片) │
28 │ ↓ │ 28 │ ↓ │
29 -│ ⏸ 等你审阅 REQ,重跑 /erp-plan-start 续 29 +│ ⏸ 等你审阅 REQ,重新运行 /erp-plan-start 继续
30 │ ↓ │ 30 │ ↓ │
31 -│ A2 生骨架 → A3 初始化 DB → ▶ A4 生 DB 设计 → A5 生下游文档│ 31 +│ A2 生成骨架 → A3 初始化 DB → ▶ A4 生成 DB 设计 → A5 生成下游文档│
32 │ ↓ │ 32 │ ↓ │
33 │ 规划阶段到此结束 │ 33 │ 规划阶段到此结束 │
34 └──────────────────────────────────────────────────────┘ 34 └──────────────────────────────────────────────────────┘
@@ -55,7 +55,7 @@ $MYSQL_CMD -e &quot;SELECT table_name, column_name, referenced_table_name, referenced @@ -55,7 +55,7 @@ $MYSQL_CMD -e &quot;SELECT table_name, column_name, referenced_table_name, referenced
55 $MYSQL_CMD -e "SELECT table_name, index_name, GROUP_CONCAT(column_name ORDER BY seq_in_index) AS cols, non_unique FROM information_schema.statistics WHERE table_schema='${DB_SCHEMA}' GROUP BY table_name, index_name, non_unique;" 55 $MYSQL_CMD -e "SELECT table_name, index_name, GROUP_CONCAT(column_name ORDER BY seq_in_index) AS cols, non_unique FROM information_schema.statistics WHERE table_schema='${DB_SCHEMA}' GROUP BY table_name, index_name, non_unique;"
56 ``` 56 ```
57 57
58 -将结果解析为结构化列表(内存中)。**不把查询结果完整写入会话上下文**——只保留表名 + 字段名 + 关键元信息 58 +在内存中将结果解析为结构化列表,**只保留表名、字段名与关键元信息,不把查询结果完整写入会话上下文**
59 59
60 ### B. 生成 docs/03 60 ### B. 生成 docs/03
61 61
@@ -84,7 +84,7 @@ $MYSQL_CMD -e &quot;SELECT table_name, index_name, GROUP_CONCAT(column_name ORDER BY @@ -84,7 +84,7 @@ $MYSQL_CMD -e &quot;SELECT table_name, index_name, GROUP_CONCAT(column_name ORDER BY
84 3. 比对: 84 3. 比对:
85 - REQ 提到但 docs/03 没有的表 → 报错停下(schema 与需求不一致;请确认是 REQ 理解错误还是需要新增 migration) 85 - REQ 提到但 docs/03 没有的表 → 报错停下(schema 与需求不一致;请确认是 REQ 理解错误还是需要新增 migration)
86 - docs/03 有但没 REQ 引用 → 警告但不停下(可能是未使用表) 86 - docs/03 有但没 REQ 引用 → 警告但不停下(可能是未使用表)
87 -4. 用 `Grep` 搜 `TBD(A4 自动补)` 在 `docs/01-需求清单/*.md`:应 0 命中(A4 已把所有 schema_refs 回填完);若仍有,打印残留 REQ 清单并停下。 87 +4. 用 `Grep` 在 `docs/01-需求清单/*.md` 中搜索 `TBD(A4 自动补)`:应 0 命中(A4 已把所有 schema_refs 回填完);若仍有,打印残留 REQ 清单并停下。
88 88
89 ### E. 勾选 docs/08 进度 + 进入 A5 89 ### E. 勾选 docs/08 进度 + 进入 A5
90 90
@@ -100,7 +100,7 @@ $MYSQL_CMD -e &quot;SELECT table_name, index_name, GROUP_CONCAT(column_name ORDER BY @@ -100,7 +100,7 @@ $MYSQL_CMD -e &quot;SELECT table_name, index_name, GROUP_CONCAT(column_name ORDER BY
100 100
101 ## 不变量 101 ## 不变量
102 102
103 -- REQ 卡片的 `依赖接口` 字段不在此处填充,留给 A5 erp-downstream-gen(它会先生成 docs/05 API 契约,再按 `TBD(A5 自动补)` 回填) 103 +- REQ 卡片的 `依赖接口` 字段不在此处填充,留给 A5 的 `erp-downstream-gen` 先生成 docs/05 API 契约后按 `TBD(A5 自动补)` 回填
104 104
105 ## 参考 105 ## 参考
106 106
skills/plan/erp-db-init/SKILL.md
@@ -21,9 +21,9 @@ allowed-tools: Read Write Edit Glob Skill Bash(mkdir *) Bash(mysql *) Bash(mysql @@ -21,9 +21,9 @@ allowed-tools: Read Write Edit Glob Skill Bash(mkdir *) Bash(mysql *) Bash(mysql
21 │ │ 21 │ │
22 │ A0 初始化项目 → A1 锁范围(REQ 卡片) │ 22 │ A0 初始化项目 → A1 锁范围(REQ 卡片) │
23 │ ↓ │ 23 │ ↓ │
24 -│ ⏸ 等你审阅 REQ,重跑 /erp-plan-start 续 24 +│ ⏸ 等你审阅 REQ,重新运行 /erp-plan-start 继续
25 │ ↓ │ 25 │ ↓ │
26 -│ A2 生骨架 → ▶ A3 初始化 DB → A4 生 DB 设计 → A5 生下游文档│ 26 +│ A2 生成骨架 → ▶ A3 初始化 DB → A4 生成 DB 设计 → A5 生成下游文档│
27 │ ↓ │ 27 │ ↓ │
28 │ 规划阶段到此结束 │ 28 │ 规划阶段到此结束 │
29 └──────────────────────────────────────────────────────┘ 29 └──────────────────────────────────────────────────────┘
@@ -131,7 +131,7 @@ rm sql/seed-data.sql.raw @@ -131,7 +131,7 @@ rm sql/seed-data.sql.raw
131 131
132 2. 用 `Bash` 执行 `grep -c "INSERT INTO" sql/seed-data.sql` 统计数据行数: 132 2. 用 `Bash` 执行 `grep -c "INSERT INTO" sql/seed-data.sql` 统计数据行数:
133 - > 0:正常 133 - > 0:正常
134 - - = 0:提示"本地 DB 无数据,seed-data.sql 为空(只有 header 注释);如需测试数据,请在本地 MySQL 插入后重 A3",允许继续 134 + - = 0:提示"本地 DB 无数据,seed-data.sql 为空(只有 header 注释);如需测试数据,请在本地 MySQL 插入后重新运行 A3",允许继续
135 135
136 3. 用 `Edit` 在 `docs/08-模块任务管理.md` 勾选 5 个 checkbox(A3 的 4 个子项 + A3 父项): 136 3. 用 `Edit` 在 `docs/08-模块任务管理.md` 勾选 5 个 checkbox(A3 的 4 个子项 + A3 父项):
137 - ` - [ ] .env.local 凭据验证通过` → `[x]` 137 - ` - [ ] .env.local 凭据验证通过` → `[x]`
skills/plan/erp-downstream-gen/SKILL.md
@@ -27,9 +27,9 @@ allowed-tools: Read Write Edit Glob Grep Skill AskUserQuestion Bash(cat *) @@ -27,9 +27,9 @@ allowed-tools: Read Write Edit Glob Grep Skill AskUserQuestion Bash(cat *)
27 │ │ 27 │ │
28 │ A0 初始化项目 → A1 锁范围(REQ 卡片) │ 28 │ A0 初始化项目 → A1 锁范围(REQ 卡片) │
29 │ ↓ │ 29 │ ↓ │
30 -│ ⏸ 等你审阅 REQ,重跑 /erp-plan-start 续 30 +│ ⏸ 等你审阅 REQ,重新运行 /erp-plan-start 继续
31 │ ↓ │ 31 │ ↓ │
32 -│ A2 生骨架 → A3 初始化 DB → A4 生 DB 设计 → ▶ A5 生下游文档│ 32 +│ A2 生成骨架 → A3 初始化 DB → A4 生成 DB 设计 → ▶ A5 生成下游文档│
33 │ ↓ │ 33 │ ↓ │
34 │ 规划阶段到此结束 │ 34 │ 规划阶段到此结束 │
35 └──────────────────────────────────────────────────────┘ 35 └──────────────────────────────────────────────────────┘
@@ -37,7 +37,7 @@ allowed-tools: Read Write Edit Glob Grep Skill AskUserQuestion Bash(cat *) @@ -37,7 +37,7 @@ allowed-tools: Read Write Edit Glob Grep Skill AskUserQuestion Bash(cat *)
37 37
38 ### A. docs/02 — 开发计划(含 REQ 级开发顺序清单,CC 分发权威) 38 ### A. docs/02 — 开发计划(含 REQ 级开发顺序清单,CC 分发权威)
39 39
40 -**清单粒度**:每行一个 REQ(功能),不是模块。同一模块的 REQ 必须**连续排列**。 40 +**清单粒度**:一行一个 REQ,同一模块的 REQ 必须**连续排列**。
41 41
42 1. 构建**模块依赖 DAG**: 42 1. 构建**模块依赖 DAG**:
43 - docs/03 中的外键(表 A → 表 B ⇒ A 的模块依赖 B 的模块) 43 - docs/03 中的外键(表 A → 表 B ⇒ A 的模块依赖 B 的模块)
@@ -83,9 +83,9 @@ allowed-tools: Read Write Edit Glob Grep Skill AskUserQuestion Bash(cat *) @@ -83,9 +83,9 @@ allowed-tools: Read Write Edit Glob Grep Skill AskUserQuestion Bash(cat *)
83 docs/08 已由 A0 erp-project-init 创建(含 Plan 进度骨架)。本步骤只往 § 二 追加模块行,**不重写整个文件**。 83 docs/08 已由 A0 erp-project-init 创建(含 Plan 进度骨架)。本步骤只往 § 二 追加模块行,**不重写整个文件**。
84 84
85 1. 用 `Read` 读取 `${CLAUDE_SKILL_DIR}/templates/docs-08-module-row-template.md`(单模块 bullet 行模板)。 85 1. 用 `Read` 读取 `${CLAUDE_SKILL_DIR}/templates/docs-08-module-row-template.md`(单模块 bullet 行模板)。
86 -2. **按 `module_id` 字母序**对每个模块:渲染一行 bullet(`- ` 开头,无 checkbox),填充 `module_id` / `module_name` / `depends_on` / `path_scopes`(不含 REQ 列表——REQ 级顺序由 docs/02 § 二 权威维护;模块完成信号由 `MR:` 字段 + `glab mr view state` 判定)。 86 +2. **按 `module_id` 字母序**对每个模块:渲染一行 bullet,填充 `module_id` / `module_name` / `depends_on` / `path_scopes`(不含 REQ 列表——REQ 级顺序以 docs/02 § 二 为准;模块完成信号由 `MR:` 字段 + `glab mr view state` 判定)。
87 87
88 - > 注意:docs/08 § 二 的行序**不决定分发顺序**——分发权威在 docs/02 § 二 REQ 开发顺序清单。本步骤按字母序排只是便于人类肉眼查找。 88 + > 注意:docs/08 § 二 的行序**不决定分发顺序**——分发以 docs/02 § 二 为准,此处按字母序仅方便查找。
89 3. 所有模块行拼成一段文本,用 `Edit` 在 `docs/08-模块任务管理.md` 的 `## 二、Coding 阶段(按模块循环)` 标题后插入(定位用下一行注释"(A5 填入后..."作为锚,把模块清单插到该注释之前)。 89 3. 所有模块行拼成一段文本,用 `Edit` 在 `docs/08-模块任务管理.md` 的 `## 二、Coding 阶段(按模块循环)` 标题后插入(定位用下一行注释"(A5 填入后..."作为锚,把模块清单插到该注释之前)。
90 90
91 ### E. docs/10 — 验收清单 91 ### E. docs/10 — 验收清单
@@ -101,13 +101,13 @@ docs/08 已由 A0 erp-project-init 创建(含 Plan 进度骨架)。本步骤 @@ -101,13 +101,13 @@ docs/08 已由 A0 erp-project-init 创建(含 Plan 进度骨架)。本步骤
101 101
102 2. **最终占位符扫描**(覆盖 Plan 阶段全部产出:`docs/01-需求清单/*.md` + `docs/02` / `docs/05` / `docs/06` / `docs/10` + `sql/seed-data.sql`): 102 2. **最终占位符扫描**(覆盖 Plan 阶段全部产出:`docs/01-需求清单/*.md` + `docs/02` / `docs/05` / `docs/06` / `docs/10` + `sql/seed-data.sql`):
103 103
104 - a. **`TBD` → CC 自动补齐**:`Grep` 搜 `TBD(A4 自动补)` 和 `TBD(A5 自动补)`。有命中则按 A4 / B2 同样逻辑就地补填(A4 查 docs/03 填 `依赖表:`;A5 查 docs/05 按 REQ-ID 填 `依赖接口:`),再 Grep 确认 0 命中;仍残留报错停下。 104 + a. **`TBD` → CC 自动补齐**:用 `Grep` 搜索 `TBD(A4 自动补)` 和 `TBD(A5 自动补)`。有命中则按 A4 / B2 同样逻辑就地补填(A4 查 docs/03 填 `依赖表:`;A5 查 docs/05 按 REQ-ID 填 `依赖接口:`),再 Grep 确认 0 命中;仍残留报错停下。
105 105
106 b. **`【人工填写:...】` → QA 循环等用户补**(与 A2 erp-skeleton-gen 步骤 E 同风格): 106 b. **`【人工填写:...】` → QA 循环等用户补**(与 A2 erp-skeleton-gen 步骤 E 同风格):
107 107
108 循环执行直到两个条件**同时满足**:(1) 扫描 0 命中;(2) 用户选「继续」 108 循环执行直到两个条件**同时满足**:(1) 扫描 0 命中;(2) 用户选「继续」
109 109
110 - - **b.1 扫描**:用 `Grep` 在上述所有文件中搜 `【人工填写:`,得命中数 N 和残留位置清单(`<文件:行号> — <行内容摘要>`) 110 + - **b.1 扫描**:用 `Grep` 在上述所有文件中搜索 `【人工填写:`,得到命中数 N 和残留位置清单(`<文件:行号> — <行内容摘要>`)
111 - **b.2 打印汇总横幅**: 111 - **b.2 打印汇总横幅**:
112 ``` 112 ```
113 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 113 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
@@ -122,18 +122,18 @@ docs/08 已由 A0 erp-project-init 创建(含 Plan 进度骨架)。本步骤 @@ -122,18 +122,18 @@ docs/08 已由 A0 erp-project-init 创建(含 Plan 进度骨架)。本步骤
122 填完后 → 回来选「继续」放行完成 Plan 122 填完后 → 回来选「继续」放行完成 Plan
123 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 123 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
124 ``` 124 ```
125 - - **b.3 弹 QA**:用 `AskUserQuestion` 询问: 125 + - **b.3 弹 QA**:用 `AskUserQuestion` 询问:
126 - **question**: `最终占位符补填完毕?` 126 - **question**: `最终占位符补填完毕?`
127 - **options** (每项为对象): 127 - **options** (每项为对象):
128 - `{"label": "继续", "description": "放行完成 Plan 阶段"}` 128 - `{"label": "继续", "description": "放行完成 Plan 阶段"}`
129 - `{"label": "有疑问想先沟通", "description": "需要讨论或修改"}` 129 - `{"label": "有疑问想先沟通", "description": "需要讨论或修改"}`
130 - **b.4 路由**: 130 - **b.4 路由**:
131 - - 选「有疑问想先沟通」→ 回答用户问题后**回 b.1 重扫**  
132 - - 选「继续」→ **回 b.1 重扫验证**:  
133 - - 新 N = 0 → 进步骤 3  
134 - - 新 N > 0 → 用户以为填完其实还有残留,回 b.2 打印新横幅 + 再弹 QA 131 + - 选「有疑问想先沟通」→ 回答用户问题后**回 b.1 重新扫描**
  132 + - 选「继续」→ **回 b.1 重新扫描验证**:
  133 + - 新 N = 0 → 进入步骤 3
  134 + - 新 N > 0 → 用户以为填完其实还有残留,回 b.2 打印新横幅并再次弹出 QA
135 135
136 - 关键:**每次弹 QA 前都重扫一次**,用户看到的 N 始终是最新的;只有 N = 0 且选「继续」才放行。 136 + 关键:**每次弹出 QA 前都重新扫描一次**,用户看到的 N 始终是最新的;只有 N = 0 且选「继续」才放行。
137 137
138 3. 用 `Edit` 在 `docs/08-模块任务管理.md` 勾选 7 个 checkbox(A5 的 6 个子项 + A5 父项): 138 3. 用 `Edit` 在 `docs/08-模块任务管理.md` 勾选 7 个 checkbox(A5 的 6 个子项 + A5 父项):
139 - ` - [ ] docs/02 开发计划已生成` → `[x]` 139 - ` - [ ] docs/02 开发计划已生成` → `[x]`
@@ -154,8 +154,12 @@ docs/08 已由 A0 erp-project-init 创建(含 Plan 进度骨架)。本步骤 @@ -154,8 +154,12 @@ docs/08 已由 A0 erp-project-init 创建(含 Plan 进度骨架)。本步骤
154 154
155 所有规划文档已就绪,docs/08 § 一 全部勾选。 155 所有规划文档已就绪,docs/08 § 一 全部勾选。
156 156
157 - 下一步由你显式触发:  
158 - 运行 /erp-workflow:erp-coding-start 进入 B 阶段模块循环 157 + ⚠️ 进入 B 阶段前必须完成:
  158 + 1. 人工通读 docs/01~10 + CLAUDE.md + sql/migrations/V1 + 各 scripts/*
  159 + 2. 把全部 Plan 产物 commit 到 main 分支:
  160 + git add -A && git commit -m "chore: plan phase A0~A5 done"
  161 + 3. 建 Plan MR 提交团队审核,合并后 main 成为 B 阶段每个模块分支的基线
  162 + 4. MR 合并后再运行 /erp-workflow:erp-coding-start 进入 B 阶段
159 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 163 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
160 ``` 164 ```
161 165
skills/plan/erp-downstream-gen/templates/docs-02-template.md
@@ -10,7 +10,7 @@ @@ -10,7 +10,7 @@
10 10
11 ## 二、开发顺序清单(CC 分发权威) 11 ## 二、开发顺序清单(CC 分发权威)
12 12
13 -> 本清单由 A5 `erp-downstream-gen` 一次性生成。**每行是一个 REQ(功能)**,不是模块。CC 按表格行序从上到下扫描,对每个 REQ 所属模块查 `docs/08 § 二` 的 `MR:` 字段 + `glab mr view state`:`merged` 跳过,其他(`—` / opened / closed / 查不到)选为当前模块(`erp-module-start` 会一次性把该模块在本清单里所有 REQ 做完)。`docs/08 § 二` 每模块是 bullet(无 checkbox),完成由 MR state 判定 13 +> 本清单由 A5 `erp-downstream-gen` 一次性生成。**每行是一个 REQ**,不是模块。CC 按表格行序从上到下扫描,对每个 REQ 所属模块查 `docs/08 § 二` 的 `MR:` 字段 + `glab mr view state`:`merged` 跳过,其他(`—` / opened / closed / 查不到)选为当前模块;`erp-module-start` 会把该模块的所有 REQ 一次做完
14 > 14 >
15 > **约束**:同一模块的所有 REQ 必须**连续排列**。允许打破依赖拓扑(如环依赖、业务必须先做),但必须在「备注」列写明原因。 15 > **约束**:同一模块的所有 REQ 必须**连续排列**。允许打破依赖拓扑(如环依赖、业务必须先做),但必须在「备注」列写明原因。
16 16
skills/plan/erp-project-init/SKILL.md
@@ -21,9 +21,9 @@ allowed-tools: Glob Edit Skill Bash(mkdir *) Bash(cp -n *) Bash(git init) Bash(c @@ -21,9 +21,9 @@ allowed-tools: Glob Edit Skill Bash(mkdir *) Bash(cp -n *) Bash(git init) Bash(c
21 │ │ 21 │ │
22 │ â–¶ A0 åˆå§‹åŒ–项目 → A1 é”范围(REQ å¡ç‰‡ï¼‰ │ 22 │ â–¶ A0 åˆå§‹åŒ–项目 → A1 é”范围(REQ å¡ç‰‡ï¼‰ │
23 │ ↓ │ 23 │ ↓ │
24 -│ ⸠等你审阅 REQ,é‡è·‘ /erp-plan-start ç»­ │ 24 +│ ⸠等你审阅 REQï¼Œé‡æ–°è¿è¡Œ /erp-plan-start ç»§ç»­ │
25 │ ↓ │ 25 │ ↓ │
26 -│ A2 生骨架 → A3 åˆå§‹åŒ– DB → A4 生 DB 设计 → A5 生下游文档│ 26 +│ A2 生æˆéª¨æž¶ → A3 åˆå§‹åŒ– DB → A4 ç”Ÿæˆ DB 设计 → A5 生æˆä¸‹æ¸¸æ–‡æ¡£â”‚
27 │ ↓ │ 27 │ ↓ │
28 │ è§„åˆ’é˜¶æ®µåˆ°æ­¤ç»“æŸ â”‚ 28 │ è§„åˆ’é˜¶æ®µåˆ°æ­¤ç»“æŸ â”‚
29 └──────────────────────────────────────────────────────┘ 29 └──────────────────────────────────────────────────────┘
@@ -46,7 +46,7 @@ done @@ -46,7 +46,7 @@ done
46 2. æ ¹æ®å½“å‰ç³»ç»Ÿé€‰æœ€åˆé€‚的包管ç†å™¨å®‰è£… mysql å®¢æˆ·ç«¯ï¼›è‹¥éœ€è¦ sudo 但 CC 没有æƒé™ï¼Œæ‰“å°æ‰‹åŠ¨å®‰è£…å‘½ä»¤è®©ç”¨æˆ·æ‰§è¡Œ 46 2. æ ¹æ®å½“å‰ç³»ç»Ÿé€‰æœ€åˆé€‚的包管ç†å™¨å®‰è£… mysql å®¢æˆ·ç«¯ï¼›è‹¥éœ€è¦ sudo 但 CC 没有æƒé™ï¼Œæ‰“å°æ‰‹åŠ¨å®‰è£…å‘½ä»¤è®©ç”¨æˆ·æ‰§è¡Œ
47 3. 装完åŽï¼ŒæŠŠå¿…è¦çš„ bin è·¯å¾„åŠ å…¥æœ¬æ¬¡ä¼šè¯ PATH(如 macOS çš„ keg-only 路径) 47 3. 装完åŽï¼ŒæŠŠå¿…è¦çš„ bin è·¯å¾„åŠ å…¥æœ¬æ¬¡ä¼šè¯ PATH(如 macOS çš„ keg-only 路径)
48 4. å‘用户æç¤ºå¦‚何把路径永久写入 shell å¯åŠ¨è„šæœ¬ 48 4. å‘用户æç¤ºå¦‚何把路径永久写入 shell å¯åŠ¨è„šæœ¬
49 -5. 釿–°è·‘开头的 `command -v` 循环验è¯ï¼›ä»ç¼ºå¤± → 打å°é”™è¯¯å¹¶åœä¸‹ï¼Œç­‰ç”¨æˆ·æ‰‹åŠ¨è§£å†³åŽé‡è·‘å…¥å£ 49 +5. 釿–°æ‰§è¡Œå¼€å¤´çš„ `command -v` 循环验è¯ï¼›ä»ç¼ºå¤± → 打å°é”™è¯¯å¹¶åœä¸‹ï¼Œç­‰ç”¨æˆ·æ‰‹åŠ¨è§£å†³åŽé‡æ–°è¿è¡Œå…¥å£
50 50
51 ### B. 幂等å¤åˆ¶æ¨¡æ¿æ–‡ä»¶ 51 ### B. 幂等å¤åˆ¶æ¨¡æ¿æ–‡ä»¶
52 52
@@ -59,7 +59,7 @@ cp -n &quot;${CLAUDE_SKILL_DIR}/templates/docs-01-readme-template.md&quot; docs/01-需求æ @@ -59,7 +59,7 @@ cp -n &quot;${CLAUDE_SKILL_DIR}/templates/docs-01-readme-template.md&quot; docs/01-需求æ
59 cp -n "${CLAUDE_SKILL_DIR}/templates/docs-08-initial-template.md" docs/08-模å—任务管ç†.md 59 cp -n "${CLAUDE_SKILL_DIR}/templates/docs-08-initial-template.md" docs/08-模å—任务管ç†.md
60 ``` 60 ```
61 61
62 -æ•…éšœæ¢å¤åœºæ™¯ï¼šå¦‚æžœç”¨æˆ·ä¹‹å‰ init 跑一åŠä¸­æ–­ï¼ˆCLAUDE.md 已存在但 docs/08 缺失),`cp -n` 会ä¿ç•™ CLAUDE.md 原样,åªè¡¥é½ docs/08。 62 +æ•…éšœæ¢å¤åœºæ™¯ï¼šå¦‚果用户上一次åˆå§‹åŒ–中途中断(CLAUDE.md 已存在但 docs/08 缺失),`cp -n` 会ä¿ç•™ CLAUDE.md 原样,åªè¡¥é½ docs/08。
63 63
64 ### C. åˆå§‹åŒ– Git(如尚未åˆå§‹åŒ–) 64 ### C. åˆå§‹åŒ– Git(如尚未åˆå§‹åŒ–)
65 65
skills/plan/erp-project-init/templates/CLAUDE-template.md
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 15
16 ## ✅ 模块完成判定规则 16 ## ✅ 模块完成判定规则
17 17
18 -`docs/08-模块任务管理.md § 二` 是**模块元数据表**——每个模块一行 bullet(无 checkbox),记录依赖 / 路径 / MR iid。**模块完成由 `MR:` 字段 + `glab mr view state=merged` 判定**,不用 checkbox 表达进度 18 +`docs/08-模块任务管理.md § 二` 是**模块元数据表**——每个模块一行 bullet,记录依赖 / 路径 / MR iid。**模块完成由 `MR:` 字段 + `glab mr view state=merged` 判定**
19 19
20 ### 规则定义 20 ### 规则定义
21 21
@@ -34,14 +34,14 @@ @@ -34,14 +34,14 @@
34 34
35 | `MR:` 字段 | `glab mr view state` | 含义 | 你(Claude Code)的行为 | 35 | `MR:` 字段 | `glab mr view state` | 含义 | 你(Claude Code)的行为 |
36 |---|---|---|---| 36 |---|---|---|---|
37 -| `—` | — | 模块未开始(未建 MR) | ✅ 开始本模块开发 | 37 +| `—` | — | 模块未开始(未建 MR) | ✅ 开始本模块开发 |
38 | `!<iid>` | `opened` / `closed` | 模块开发中 / 打回 | ✅ 继续推进该模块 | 38 | `!<iid>` | `opened` / `closed` | 模块开发中 / 打回 | ✅ 继续推进该模块 |
39 | `!<iid>` | `merged` | 模块**已完成** | 🟢 进入下一未完成模块 | 39 | `!<iid>` | `merged` | 模块**已完成** | 🟢 进入下一未完成模块 |
40 40
41 ### 工作流规则 41 ### 工作流规则
42 42
43 - **开发顺序权威在 `docs/02-开发计划.md § 二 开发顺序清单`**,不是 `docs/08 § 二` 的物理行序 43 - **开发顺序权威在 `docs/02-开发计划.md § 二 开发顺序清单`**,不是 `docs/08 § 二` 的物理行序
44 -- **下一个要做的模块** = `docs/02 § 二` 清单中**第一个所属模块 MR 状态非 merged 的 REQ** 的 `module_id`(由 `erp-coding-start` 步骤 3 扫 `docs/08` 的 `MR:` 字段 + `glab mr view` 判定) 44 +- **下一个要做的模块** = `docs/02 § 二` 清单中**第一个所属模块 MR 状态非 merged 的 REQ** 的 `module_id`(由 `erp-coding-start` 步骤 3 扫 `docs/08` 的 `MR:` 字段 + `glab mr view` 判定)
45 - `docs/02 § 二` 清单由 A5 `erp-downstream-gen` 生成阶段一次性确定(会交互询问业务偏好),之后通常不改;若开发中途需要调整顺序,重新触发 A5 生成阶段而非直接编辑文件 45 - `docs/02 § 二` 清单由 A5 `erp-downstream-gen` 生成阶段一次性确定(会交互询问业务偏好),之后通常不改;若开发中途需要调整顺序,重新触发 A5 生成阶段而非直接编辑文件
46 - **已完成模块**(`MR: !<iid>` + `glab mr view state=merged`):**默认不改**(不是禁止,是已交付无需改) 46 - **已完成模块**(`MR: !<iid>` + `glab mr view state=merged`):**默认不改**(不是禁止,是已交付无需改)
47 - 如果在当前模块开发中发现某个**已完成模块**(MR merged)有 bug: 47 - 如果在当前模块开发中发现某个**已完成模块**(MR merged)有 bug:
@@ -53,21 +53,21 @@ @@ -53,21 +53,21 @@
53 53
54 ``` 54 ```
55 1. 对每个 REQ 跑完整功能循环: 55 1. 对每个 REQ 跑完整功能循环:
56 - brainstorm → plan → TDD(红绿循环,每步 commit)→ verify(子会话 REQ 级测试)→ 自审 56 + brainstorm → plan → TDD(红绿循环,每步 commit)→ verify(子会话执行 REQ 级测试)→ 自审
57 2. 所有 REQ 完成后,erp-local-test-gate 派子会话按顺序跑: 57 2. 所有 REQ 完成后,erp-local-test-gate 派子会话按顺序跑:
58 a. schema 一致性检查(erp-local-test-gate 步骤 1 内联,schema 未漂移)+ 占位符扫描 58 a. schema 一致性检查(erp-local-test-gate 步骤 1 内联,schema 未漂移)+ 占位符扫描
59 - b. scripts/test.sh 全套:build → lint → **unit + integration(全量重跑当前模块所有  
60 - REQ 的功能测试 + 所有已勾模块的回归测试)** → e2e 59 + b. scripts/test.sh 全套:build → lint → **unit + integration(全量重新运行当前模块所有
  60 + REQ 的功能测试 + 所有已完成模块的回归测试)** → e2e
61 任一失败停下修复再来 61 任一失败停下修复再来
62 3. 测试全绿 → erp-module-report 输出《模块完成报告》 62 3. 测试全绿 → erp-module-report 输出《模块完成报告》
63 -4. 自动 git push(.githooks/pre-push 会再一遍 scripts/test.sh 作为硬闸门) 63 +4. 自动 git push(.githooks/pre-push 会再执行一遍 scripts/test.sh 作为硬闸门)
64 + glab mr create,报告嵌入 MR 描述 64 + glab mr create,报告嵌入 MR 描述
65 5. 人工 review MR → Approve + Merge(人工动作,唯一人工介入点) 65 5. 人工 review MR → Approve + Merge(人工动作,唯一人工介入点)
66 -6. 下次用户跑 `/erp-workflow:erp-coding-start` 时,入口自动检测到本模块 `glab mr view state=merged` → `git checkout main && git pull --ff-only` 同步远程 → 扫下一模块派发  
67 -7. 你**不需要**手工 Edit docs/08(模块元数据不变;下次 coding-start 自动扫 MR state 判完成) 66 +6. 下次用户运行 `/erp-workflow:erp-coding-start` 时,入口自动检测到本模块 `glab mr view state=merged` → `git checkout main && git pull --ff-only` 同步远程 → 扫描下一模块并派发
  67 +7. 你**不需要**手工 Edit docs/08(模块元数据不变;下次 coding-start 自动扫描 MR state 判定是否完成)
68 ``` 68 ```
69 69
70 -> 两道测试闸门:功能级(`erp-feature-tdd` + `erp-feature-verify`,每 REQ 一遍)+ 模块级(`erp-local-test-gate` + pre-push hook,每模块一遍)。所有测试/验证都派到子会话跑,主会话只收结构化结论。 70 +> 两道测试闸门:功能级(`erp-feature-tdd` + `erp-feature-verify`,每 REQ 一遍)+ 模块级(`erp-local-test-gate` + pre-push hook,每模块一遍)。所有测试/验证都派发到子会话执行,主会话只接收结构化结论。
71 71
72 ### 模块完成报告 72 ### 模块完成报告
73 73
@@ -96,10 +96,10 @@ @@ -96,10 +96,10 @@
96 96
97 两层嵌套循环的详细步骤**全部固化到 skills**,CLAUDE.md 不展开。入口调 `/erp-workflow:erp-coding-start`,自动分发: 97 两层嵌套循环的详细步骤**全部固化到 skills**,CLAUDE.md 不展开。入口调 `/erp-workflow:erp-coding-start`,自动分发:
98 98
99 -- **模块循环(外层,Layer 2)** → `erp-module-start` → `erp-local-test-gate`(commit test-gate.md)→ `erp-module-report`(commit 模块报告 + cross-module log)→ `erp-mr-create`(worktree clean 校验 → push → 建 MR → 追 MR URL 到报告 + commit → 写 `MR: !<iid>` 到 docs/08 + commit → 再 push)→ 人工 Approve+Merge → 下次 `/erp-workflow:erp-coding-start` 扫到本模块 `glab mr view merged` → `git pull --ff-only main` → 推进下一模块 99 +- **模块循环(外层,Layer 2)** → `erp-module-start` → `erp-local-test-gate`(commit test-gate.md)→ `erp-module-report`(commit 模块报告 + cross-module log)→ `erp-mr-create`(worktree clean 校验 → push → 创建 MR → 追加 MR URL 到报告并 commit → 写 `MR: !<iid>` 到 docs/08 并 commit → 再次 push)→ 人工 Approve+Merge → 下次运行 `/erp-workflow:erp-coding-start` 扫描到本模块 `glab mr view merged` → `git pull --ff-only main` → 推进下一模块
100 - **功能循环(内层,Layer 3,每个 REQ-XXX-NNN 走一遍)** → `erp-feature-brainstorm` → `erp-feature-plan` → `erp-feature-tdd` → `erp-feature-verify` → `erp-feature-review` 100 - **功能循环(内层,Layer 3,每个 REQ-XXX-NNN 走一遍)** → `erp-feature-brainstorm` → `erp-feature-plan` → `erp-feature-tdd` → `erp-feature-verify` → `erp-feature-review`
101 101
102 -**本地测试闸门**: `erp-local-test-gate` 是 MR 前的唯一硬闸门,子会话跑 `scripts/test.sh`:脚本先让 `setup-test-db.sh` 清空库 → build / lint → 跑测试(Spring Boot 启动时 Flyway 自动 apply `sql/migrations/V*.sql`)→ e2e → 再次清库。详见 § 🧪 自测要求。`.githooks/pre-push` 在 push 时会再跑一次 `scripts/test.sh` 作为兜底;`git push --no-verify` 被 hook `deny-no-verify.sh` 硬拦截。本项目不配置 GitLab CI/CD。 102 +**本地测试闸门**: `erp-local-test-gate` 是 MR 前的唯一硬闸门,子会话执行 `scripts/test.sh`:脚本先由 `setup-test-db.sh` 清空库 → build / lint → 执行测试(Spring Boot 启动时 Flyway 自动 apply `sql/migrations/V*.sql`)→ e2e → 再次清库。详见 § 🧪 自测要求。`.githooks/pre-push` 在 push 时会再次执行 `scripts/test.sh` 作为兜底;`git push --no-verify` 被 hook `deny-no-verify.sh` 硬拦截。本项目不配置 GitLab CI/CD。
103 103
104 > 占位符扫描 / schema 一致性校验都不在此闸门:前者在 A 阶段 skill 生成期完成;schema 演化通过 Flyway migration 保证一致(每次测试启动,Spring Boot 的 Flyway 从空库按序 apply V1~Vn,不存在"漂移"概念)。hook 产生的 `TBD(CC 补)` 存根由 CC 自主调 `erp-cross-module-log` 补齐,并在 `erp-module-report` § ⑦ 硬验收(非人工填写)。 104 > 占位符扫描 / schema 一致性校验都不在此闸门:前者在 A 阶段 skill 生成期完成;schema 演化通过 Flyway migration 保证一致(每次测试启动,Spring Boot 的 Flyway 从空库按序 apply V1~Vn,不存在"漂移"概念)。hook 产生的 `TBD(CC 补)` 存根由 CC 自主调 `erp-cross-module-log` 补齐,并在 `erp-module-report` § ⑦ 硬验收(非人工填写)。
105 105
@@ -202,8 +202,8 @@ refactor(common): 统一响应格式包装 @@ -202,8 +202,8 @@ refactor(common): 统一响应格式包装
202 202
203 ## 🧪 自测要求 203 ## 🧪 自测要求
204 204
205 -- 所有测试与验证(`scripts/test.sh` / `mvn test` / `pnpm test` / DB 测试集 diff 等)**一律派发到全新子会话 via `Agent` 执行**,主会话只接收结构化结论(命令 / 退出码 / 通过数 / 失败项 / 关键 stdout ≤30 行)。不在主会话直跑测试。  
206 -- 由 `erp-feature-verify`(功能级)+ `erp-local-test-gate`(模块级)两道 skill 统一承接。前者每个 REQ 跑一次,后者模块闸门跑一次。 205 +- 所有测试与验证(`scripts/test.sh` / `mvn test` / `pnpm test` / DB 测试集 diff 等)**一律派发到全新子会话 via `Agent` 执行**,主会话只接收结构化结论(命令 / 退出码 / 通过数 / 失败项 / 关键 stdout ≤30 行)。不在主会话直接执行测试。
  206 +- 由 `erp-feature-verify`(功能级)+ `erp-local-test-gate`(模块级)两道 skill 统一承接。前者每个 REQ 执行一次,后者模块闸门执行一次。
207 - 声称"完成"前必须贴出子会话返回的 evidence(模板:由 erp-feature-verify skill 持有)。 207 - 声称"完成"前必须贴出子会话返回的 evidence(模板:由 erp-feature-verify skill 持有)。
208 208
209 --- 209 ---
skills/plan/erp-project-init/templates/docs-08-initial-template.md
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 2
3 > 全流程进度跟踪。CC 每完成一项产出就勾选一项。 3 > 全流程进度跟踪。CC 每完成一项产出就勾选一项。
4 > - **§ 一 Plan(A0~A5)**:`erp-plan-start` 找第一个未勾 A 子项分发到对应 skill 4 > - **§ 一 Plan(A0~A5)**:`erp-plan-start` 找第一个未勾 A 子项分发到对应 skill
5 -> - **§ 二 Coding(模块)**:分发权威在 `docs/02-开发计划.md § 二 开发顺序清单`;`erp-coding-start` 按 docs/02 顺序扫,对每个 REQ 所属模块查本 § 二的 `MR:` 字段 + `glab mr view state`,找第一个非 merged 模块分发。本 § 二每模块是纯 bullet(无 checkbox),§ 二行序无语义 5 +> - **§ 二 Coding(模块)**:分发以 `docs/02-开发计划.md § 二 开发顺序清单` 为准;`erp-coding-start` 按 docs/02 顺序扫描,对每个 REQ 所属模块查询本 § 二的 `MR:` 字段 + `glab mr view state`,找第一个非 merged 模块分发。本 § 二 行序无语义,仅作模块元数据表
6 6
7 ## 一、Plan 阶段(一次性) 7 ## 一、Plan 阶段(一次性)
8 8
@@ -41,7 +41,7 @@ @@ -41,7 +41,7 @@
41 41
42 ## 二、Coding 阶段(按模块循环) 42 ## 二、Coding 阶段(按模块循环)
43 43
44 -(A5 填入后,每个模块一行 bullet(`- ` 开头,无 checkbox)。每个模块的 `MR:` 字段在 `—` 和 `!<iid>` 之间变化,完成由 `glab mr view state=merged` 判定。`erp-coding-start` 每次跑时按 docs/02 REQ 序扫描每模块的 MR state 决定派发。) 44 +(A5 填入后,每个模块一行 bullet。每个模块的 `MR:` 字段在 `—` 和 `!<iid>` 之间变化,完成由 `glab mr view state=merged` 判定。`erp-coding-start` 每次按 docs/02 REQ 序扫每模块的 MR state 决定派发。)
45 45
46 <!-- 模块格式示例(由 A5 erp-downstream-gen 追加): 46 <!-- 模块格式示例(由 A5 erp-downstream-gen 追加):
47 - module_0 系统管理 47 - module_0 系统管理
skills/plan/erp-scope-lock/SKILL.md
@@ -21,9 +21,9 @@ allowed-tools: Read Write Edit Grep Skill AskUserQuestion @@ -21,9 +21,9 @@ allowed-tools: Read Write Edit Grep Skill AskUserQuestion
21 │ │ 21 │ │
22 │ A0 初始化项目 → ▶ A1 锁范围(REQ 卡片) │ 22 │ A0 初始化项目 → ▶ A1 锁范围(REQ 卡片) │
23 │ ↓ │ 23 │ ↓ │
24 -│ ⏸ 等你审阅 REQ,重跑 /erp-plan-start 续 24 +│ ⏸ 等你审阅 REQ,重新运行 /erp-plan-start 继续
25 │ ↓ │ 25 │ ↓ │
26 -│ A2 生骨架 → A3 初始化 DB → A4 生 DB 设计 → A5 生下游文档│ 26 +│ A2 生成骨架 → A3 初始化 DB → A4 生成 DB 设计 → A5 生成下游文档│
27 │ ↓ │ 27 │ ↓ │
28 │ 规划阶段到此结束 │ 28 │ 规划阶段到此结束 │
29 └──────────────────────────────────────────────────────┘ 29 └──────────────────────────────────────────────────────┘
@@ -170,7 +170,7 @@ allowed-tools: Read Write Edit Grep Skill AskUserQuestion @@ -170,7 +170,7 @@ allowed-tools: Read Write Edit Grep Skill AskUserQuestion
170 - `api_refs` —— 填 `TBD(A5 自动补)`(A5 `erp-downstream-gen` 回填依赖接口) 170 - `api_refs` —— 填 `TBD(A5 自动补)`(A5 `erp-downstream-gen` 回填依赖接口)
171 - 用 module 模板包装卡片列表 171 - 用 module 模板包装卡片列表
172 - 用 `Write` 写入 `docs/01-需求清单/<module_code>-<module_name>.md` 172 - 用 `Write` 写入 `docs/01-需求清单/<module_code>-<module_name>.md`
173 -4. 向用户输出(只打印,**不弹 QA**,不等待): 173 +4. 向用户输出(只打印,**不弹 QA**,不等待):
174 174
175 ``` 175 ```
176 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 176 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
@@ -218,7 +218,7 @@ allowed-tools: Read Write Edit Grep Skill AskUserQuestion @@ -218,7 +218,7 @@ allowed-tools: Read Write Edit Grep Skill AskUserQuestion
218 审阅完成后,运行以下命令继续进入 A2: 218 审阅完成后,运行以下命令继续进入 A2:
219 /erp-workflow:erp-plan-start 219 /erp-workflow:erp-plan-start
220 220
221 - (入口会读 docs/08 进度,自动派发到 A2 erp-skeleton-gen) 221 + (入口会读 docs/08 进度,自动派发到 A2 erp-skeleton-gen)
222 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 222 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
223 ``` 223 ```
224 224
skills/plan/erp-skeleton-gen/SKILL.md
@@ -20,7 +20,7 @@ allowed-tools: Read Write Edit Skill Grep Glob AskUserQuestion Bash(mkdir *) Bas @@ -20,7 +20,7 @@ allowed-tools: Read Write Edit Skill Grep Glob AskUserQuestion Bash(mkdir *) Bas
20 20
21 **产出覆盖提醒**: 21 **产出覆盖提醒**:
22 - 本 skill 会 `Write` 覆盖以下文件:docs/04(拼接 § 零 + § 一+)、docs/06、docs/07、docs/09、scripts/test.sh、scripts/setup-test-db.sh、.githooks/pre-push、.env.local。 22 - 本 skill 会 `Write` 覆盖以下文件:docs/04(拼接 § 零 + § 一+)、docs/06、docs/07、docs/09、scripts/test.sh、scripts/setup-test-db.sh、.githooks/pre-push、.env.local。
23 -- 如果之前运行过本 skill 且用户手动改过这些文件,**重会覆盖修改**。 23 +- 如果之前运行过本 skill 且用户手动改过这些文件,**重新运行会覆盖修改**。
24 24
25 ## 执行步骤 25 ## 执行步骤
26 26
@@ -34,9 +34,9 @@ allowed-tools: Read Write Edit Skill Grep Glob AskUserQuestion Bash(mkdir *) Bas @@ -34,9 +34,9 @@ allowed-tools: Read Write Edit Skill Grep Glob AskUserQuestion Bash(mkdir *) Bas
34 │ │ 34 │ │
35 │ A0 初始化项目 → A1 锁范围(REQ 卡片) │ 35 │ A0 初始化项目 → A1 锁范围(REQ 卡片) │
36 │ ↓ │ 36 │ ↓ │
37 -│ ⏸ 等你审阅 REQ,重跑 /erp-plan-start 续 37 +│ ⏸ 等你审阅 REQ,重新运行 /erp-plan-start 继续
38 │ ↓ │ 38 │ ↓ │
39 -│ ▶ A2 生骨架 → A3 初始化 DB → A4 生 DB 设计 → A5 生下游文档│ 39 +│ ▶ A2 生成骨架 → A3 初始化 DB → A4 生成 DB 设计 → A5 生成下游文档│
40 │ ↓ │ 40 │ ↓ │
41 │ 规划阶段到此结束 │ 41 │ 规划阶段到此结束 │
42 └──────────────────────────────────────────────────────┘ 42 └──────────────────────────────────────────────────────┘
@@ -89,13 +89,13 @@ cp &quot;${CLAUDE_SKILL_DIR}/templates/scripts-setup-test-db-template.sh&quot; scripts/set @@ -89,13 +89,13 @@ cp &quot;${CLAUDE_SKILL_DIR}/templates/scripts-setup-test-db-template.sh&quot; scripts/set
89 89
90 说明: 90 说明:
91 - `sql/migrations/` 是 Flyway migration 目录。A3 `erp-db-init` 会在此生成 `V1__initial_schema.sql`,后续 B 阶段每个 REQ 的业务 DDL 也写在这(`V2__xxx.sql` / `V3__xxx.sql` ...) 91 - `sql/migrations/` 是 Flyway migration 目录。A3 `erp-db-init` 会在此生成 `V1__initial_schema.sql`,后续 B 阶段每个 REQ 的业务 DDL 也写在这(`V2__xxx.sql` / `V3__xxx.sql` ...)
92 -- `setup-test-db.sh` 只做 **drop + create 空库**;schema apply 由 **Flyway 在 Spring Boot 启动时自动处理** 92 +- `setup-test-db.sh` 只做 **drop + create 空库**,schema 由 **Flyway 在 Spring Boot 启动时自动应用**
93 - **硬依赖**:项目 `pom.xml` 必须包含 `flyway-core` + `flyway-mysql` 依赖(已列入 docs/04 § 零 技术栈);否则 Spring 启动不会 apply migration,测试会因表不存在而失败 93 - **硬依赖**:项目 `pom.xml` 必须包含 `flyway-core` + `flyway-mysql` 依赖(已列入 docs/04 § 零 技术栈);否则 Spring 启动不会 apply migration,测试会因表不存在而失败
94 - seed 数据(`sql/seed-data.sql`)由 A3 `erp-db-init` 从本地 MySQL 导出,开发者选一种装载方式(Spring `@Sql` / Flyway `R__seed.sql` / `data.sql`);setup-test-db.sh 只负责清空库 94 - seed 数据(`sql/seed-data.sql`)由 A3 `erp-db-init` 从本地 MySQL 导出,开发者选一种装载方式(Spring `@Sql` / Flyway `R__seed.sql` / `data.sql`);setup-test-db.sh 只负责清空库
95 95
96 #### C.2 `scripts/test.sh` —— 直接 Write 96 #### C.2 `scripts/test.sh` —— 直接 Write
97 97
98 -基于步骤 A 的技术栈推断 4 条命令(build / lint / unit+integration / e2e),直接 `Write` 完整 `scripts/test.sh`。 98 +基于步骤 A 的技术栈推断 build / lint / unit+integration / e2e 四条命令,直接 `Write` 完整 `scripts/test.sh`。
99 99
100 骨架如下(CC 把 4 个 `<推断的 ... 命令>` 替换成实际值后 Write): 100 骨架如下(CC 把 4 个 `<推断的 ... 命令>` 替换成实际值后 Write):
101 101
@@ -155,12 +155,12 @@ bash &quot;${CLAUDE_SKILL_DIR}/scripts/merge-gitignore.sh&quot; &quot;${CLAUDE_SKILL_DIR}/templ @@ -155,12 +155,12 @@ bash &quot;${CLAUDE_SKILL_DIR}/scripts/merge-gitignore.sh&quot; &quot;${CLAUDE_SKILL_DIR}/templ
155 目标:减少用户重复编辑。同一"逻辑占位"(如根包名出现多处)只问用户一次,CC 批量填;派生占位(如 Java 路径从根包名派生)由 CC 自己推断。敏感占位(`.env.local` 凭据 / 密钥)不进会话上下文,让用户自己去文件里填。 155 目标:减少用户重复编辑。同一"逻辑占位"(如根包名出现多处)只问用户一次,CC 批量填;派生占位(如 Java 路径从根包名派生)由 CC 自己推断。敏感占位(`.env.local` 凭据 / 密钥)不进会话上下文,让用户自己去文件里填。
156 156
157 循环执行直到**两个条件同时满足**: 157 循环执行直到**两个条件同时满足**:
158 -(a) 所有占位符已填(重命中数 N = 0) 158 +(a) 所有占位符已填(重新扫描命中数 N = 0)
159 (b) 用户选「继续」 159 (b) 用户选「继续」
160 160
161 #### E.1 扫描 + 分组 161 #### E.1 扫描 + 分组
162 162
163 -用 `Grep` 扫 `【人工填写:` 于以下 8 个路径,记录每处命中(文件 + 行号 + 说明文字): 163 +用 `Grep` 在以下 8 个路径下扫描 `【人工填写:`,记录每处命中(文件 + 行号 + 说明文字):
164 - `docs/04-技术规范.md` 164 - `docs/04-技术规范.md`
165 - `docs/06-UI交互规范.md` 165 - `docs/06-UI交互规范.md`
166 - `docs/07-环境配置.md` 166 - `docs/07-环境配置.md`
@@ -211,7 +211,7 @@ options: @@ -211,7 +211,7 @@ options:
211 211
212 3. 若 CC 对某派生占位无法可靠推断(说明不清 / 上下文不足),**回退**:把该占位当作独立根占位,弹 `AskUserQuestion` 问用户。 212 3. 若 CC 对某派生占位无法可靠推断(说明不清 / 上下文不足),**回退**:把该占位当作独立根占位,弹 `AskUserQuestion` 问用户。
213 213
214 -#### E.4 `.env.local` 敏感占位提示(不弹 QA) 214 +#### E.4 `.env.local` 敏感占位提示(不弹 QA)
215 215
216 若敏感组非空,打印提示横幅(只打印,不问): 216 若敏感组非空,打印提示横幅(只打印,不问):
217 217
@@ -270,12 +270,12 @@ options: @@ -270,12 +270,12 @@ options:
270 - `{"label": "有疑问想先沟通", "description": "需要讨论或修改"}` 270 - `{"label": "有疑问想先沟通", "description": "需要讨论或修改"}`
271 271
272 4. 路由: 272 4. 路由:
273 - - 选「有疑问想先沟通」→ 回答用户问题后**回 E.5.1 重扫**  
274 - - 选「继续」→ **回 E.5.1 重扫验证**: 273 + - 选「有疑问想先沟通」→ 回答用户问题后**回 E.5.1 重新扫描**
  274 + - 选「继续」→ **回 E.5.1 重新扫描验证**:
275 - 新 N = 0 → 进入步骤 F(放行 A3) 275 - 新 N = 0 → 进入步骤 F(放行 A3)
276 - - 新 N > 0 → 用户以为填完其实还有残留,回 E.5.2 打印新横幅 + 再弹 QA 276 + - 新 N > 0 → 用户以为填完其实还有残留,回 E.5.2 打印新横幅并再次弹出 QA
277 277
278 -关键点:**每次弹 QA 前都重扫一次**,用户看到的 N 始终是最新的;只有 N = 0 且选「继续」才放行。 278 +关键点:**每次弹出 QA 前都重新扫描一次**,用户看到的 N 始终是最新的;只有 N = 0 且选「继续」才放行。
279 279
280 ### F. 勾选 docs/08 进度 + 进入 A3 280 ### F. 勾选 docs/08 进度 + 进入 A3
281 281
skills/plan/erp-skeleton-gen/templates/docs-07-env-template.md
@@ -23,4 +23,4 @@ skeleton-gen 基于 docs/04 § 零 技术栈表推导各节内容: @@ -23,4 +23,4 @@ skeleton-gen 基于 docs/04 § 零 技术栈表推导各节内容:
23 23
24 ## 四、常用命令 24 ## 四、常用命令
25 25
26 -<!-- 表格:| 命令 | 说明 |;包含 启动后端 / 启动前端 / 打包 / 跑测试 / 重置测试数据 / 创建 MR。 --> 26 +<!-- 表格:| 命令 | 说明 |;包含 启动后端 / 启动前端 / 打包 / 运行测试 / 重置测试数据 / 创建 MR。 -->