Commit cc94a5f4a617f39265ca0acc5dd487580b061444

Authored by zichun
1 parent 18d6d292

edit

README.md
... ... @@ -10,15 +10,15 @@ Claude Code 插件:ERP / 后端管理系统全流程开发框架。
10 10 📋 阶段 A:规划(一次性,入口 /erp-workflow:erp-plan-start)
11 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 17 用户显式 /erp-workflow:erp-coding-start
18 18  
19 19 🔁 阶段 B:编码(按模块循环,入口 /erp-workflow:erp-coding-start)
20 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 53 ```
54 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 61 3. **Coding 阶段入口**(模块循环):
62 62 ```
63 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 67 - `state == merged` → 模块已完成,跳过
68 68 - `MR: —` / opened / closed / 查不到 → 该模块是当前模块
69 69  
70 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 120 ```
121 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 124 │ - 所有模块都 merged → 打印"所有模块已完成"
125 125 │ - 找到第一个非 merged 模块 → 派发
126 126 │ 派发前 git checkout main + git pull --ff-only(同步远程 base)
... ... @@ -131,39 +131,39 @@ erp-workflow-plugin/
131 131 │ erp-feature-brainstorm → -plan → -tdd → -verify → -review
132 132
133 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 135 │ review request-changes (=5) → 停下(升级给人)
136 136
137 137 │ 模块全部 REQ approve →
138 138 │ erp-local-test-gate(commit test-gate.md)
139 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 141 │ → 追 MR URL 到报告 + commit → 写 MR iid 到 docs/08 + commit
142   - │ → 再 push;docs/08 无 checkbox
  142 + │ → 再 push
143 143
144 144 └─ ⏸ 停下等人工 Approve + Merge
145   - (人工合并后再跑 coding-start,扫到 state=merged 自动跳过
  145 + (人工合并后再次运行 coding-start,扫描到 state=merged 自动跳过
146 146 → pull main → 推进下一模块)
147 147 ```
148 148  
149 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 152 | `erp-feature-brainstorm` | 功能循环步骤 1:交互 brainstorm → 生成 `docs/superpowers/specs/*.md` | `erp-module-start` 推进 REQ 时调用 |
153 153 | `erp-feature-plan` | 功能循环步骤 2:spec → 任务级 plan(含文件路径 + 完整代码),输出 `docs/superpowers/plans/*.md` | `erp-feature-brainstorm` 链式调用 |
154 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 161 ### Crosscut(4 个,`skills/crosscut/`)
162 162  
163 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 167 | `erp-red-flag-check` | 检查 CLAUDE.md 的 6 项红旗清单;命中则追加 Blocker 到计划文件并停下 | 功能循环各步骤和生成重要制品前自动调用 |
168 168 | `erp-cross-module-log` | 给 `log-cross-module.sh` 追加的跨模块改动存根补「原因 / 影响评估」 | 用户看到 hook 提示后调用;`erp-module-start` 初始化日志文件时也会用其模板 |
169 169  
... ... @@ -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 218 - **`mysql` / `mysqldump` 命令行**:`erp-db-init` (A3) 验证连接 + 导出 V1 initial migration + 导出 seed-data.sql;`scripts/setup-test-db.sh` 在测试闸门前后 drop+create 空库
219 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 1 #!/usr/bin/env bash
2 2 # PostToolUse hook: 检测 Edit/Write 是否触及"当前模块以外"的模块路径,若是则在当前模块的跨模块日志中留痕(软规则 S2)。
3   -# 注:原设计基于"已勾 [x] 模块"触发,但 docs/08 § 二 的 checkbox 永远保持 `- [ ]`(完成由 MR merged state 判定);
4   -# 新判定按"非当前模块"触发——CC 在当前模块开发期间改动其他模块(无论是否已 merged)都应留痕。
  3 +# CC 在当前模块开发期间改动其他模块(无论目标模块是否已 merged)都会在此处留痕。
5 4  
6 5 set -euo pipefail
7 6  
... ... @@ -29,8 +28,7 @@ case &quot;$current_branch&quot; in
29 28 esac
30 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 32 # docs/08 § 二 的模块块结构:
35 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 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 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 4 user-invocable: false
5 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 22 - 逐项处理 `must_fix[]`:对每个条目用 `Edit` 修改其指向的代码文件。
23 23 - 所有 Must-fix 修复后,拼 commit 消息(格式与 `erp-feature-tdd` 一致,单行):`fix(<module_id>): 修复 review round <N> must-fix <REQ-id>`。
24 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 27 6. 上限:**5 轮**。第 5 轮仍为 `request-changes` → 停止并打印摘要(升级给用户手工介入),不再自动修复,不回调 module-start。
28 28  
29 29 ## 衔接
30 30  
31 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 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 17 - `ls sql/migrations/V*.sql` 得最大版本号 n_max,新文件版本号 = n_max + 1
18 18 - 文件名格式 `V<n>__<snake_case_desc>.sql`,例 `V5__add_user_email.sql`
19 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 21 4. 按顺序处理每个(代码类)任务:
22 22 a. 在 `test_file::test_name` 处编写失败测试。
23 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 32 - **绝不**在主会话直接运行 `mvn test` / `pnpm test` / `scripts/test.sh`,必须通过子会话。
33 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 2 name: erp-feature-verify
3   -description: 功能循环第 4 步。将功能的测试套件派发到子会话执行,用模板渲染验证证据。无证据不得声称完成。
  3 +description: 功能循环第 4 步。将本功能的测试派发到子会话执行,用模板渲染验证证据。无证据不得声称完成。
4 4 user-invocable: false
5 5 allowed-tools: Skill Read Write Agent
6 6 ---
... ...
skills/coding/erp-local-test-gate/SKILL.md
1 1 ---
2 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 4 user-invocable: false
5 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 47 请根据失败类型选择下一步:
48 48  
49 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 53 ② 真有回归(某个 REQ 破坏了其他 REQ/已合并模块)
54 54 → 定位到具体 REQ,删除其 review 记录:
55 55 rm docs/superpowers/reviews/*-<REQ-id>.md
56   - → 再跑 /erp-workflow:erp-coding-start
  56 + → 重新运行 /erp-workflow:erp-coding-start
57 57 (module-start 把该 REQ 视为未完成,重走 brainstorm→...→review 循环修复)
58 58  
59 59 ③ 环境/依赖问题(DB 连不上、外部 API 失败、证书失效)
60 60 → 命中红旗 #6(外部接口不可达)
61 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 23 - **§ ⑥ 本模块新增 migration**:用 `git diff --name-only --diff-filter=A <module-start-commit>..HEAD -- 'sql/migrations/V*.sql'` 列出本模块提交的新 migration 文件;每个文件 Read 第一行(V_n 描述)作为说明
24 24 - `docs/superpowers/module-reports/<module_id>-cross-module.md` → § ⑦
25 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 27 3. 用 `Read` 读取 `${CLAUDE_SKILL_DIR}/templates/module-report-template.md`,填充全部 12 节。
28 28 4. **硬性验证**:
29 29 - § ⑦:如果 cross-module 有任何行含 `TBD(CC 补)` → **停止**,调用 `Skill(erp-cross-module-log)` 让 CC **自主推断**补齐,补完再回本步骤重验。
... ...
skills/coding/erp-module-start/SKILL.md
1 1 ---
2 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 4 user-invocable: false
5 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 13  
14 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 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 19 - 若 `req_order` 为空 → 打印"⚠️ docs/02 § 二 REQ 开发顺序清单为空或无法解析,请检查"并停止。
20 20 - 初始化 `module_merged[module_id → bool]` 空缓存。按序遍历 `req_order[]`:
21 21 - `module_merged[module_id]` 已缓存为 `true` → 跳过本 REQ。
22 22 - `module_merged[module_id]` 已缓存为 `false` → `current_module = module_id`,结束遍历。
23   - - 未缓存 → 读 docs/08 § 二 该模块条目的 ` - MR:` 字段:
  23 + - 未缓存 → 读 docs/08 § 二 该模块条目的 ` - MR:` 字段:
24 24 - `MR: —` → `module_merged[module_id] = false`,`current_module = module_id`,结束遍历。
25 25 - `MR: !<iid>` → `Bash`: `glab mr view <iid> -F json 2>/dev/null`,取 `.state`:
26 26 - `merged` → 缓存 `true`,跳过本 REQ。
27 27 - 其他 → 缓存 `false`,`current_module = module_id`,结束遍历。
28 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 31 ### 步骤 2:所有模块已完成短路
32 32  
... ... @@ -66,7 +66,7 @@ allowed-tools: Read Write Skill Glob Grep Bash(git branch *) Bash(git checkout *
66 66 ## 参考
67 67  
68 68 - `docs/02-开发计划.md § 二 开发顺序清单`(分发权威)
69   -- `docs/08-模块任务管理.md § 二`(模块元数据 + `MR:` 字段;每模块行是 `- module_id ...` bullet,无 checkbox;完成判定权威是 MR state
  69 +- `docs/08-模块任务管理.md § 二`(模块元数据,含 `MR:` 字段;完成判定以 MR state 为准
70 70 - `docs/superpowers/reviews/*.md`(REQ 级进度事实——verdict=approve 即完成)
71 71 - `${CLAUDE_SKILL_DIR}/templates/module-start-banner-template.md`
72 72 - `${CLAUDE_SKILL_DIR}/templates/cross-module-log-template.md`
... ...
skills/coding/erp-mr-create/SKILL.md
1 1 ---
2 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 4 user-invocable: false
5 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 24 ### 步骤 1:验证当前分支
25 25  
26 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 28 - 从 `current_branch` 取 `module_id = current_branch` 去掉 `"module-"` 前缀。
29 29  
30 30 ### 步骤 2:验证 worktree 干净(防止 evidence 文件漏 commit)
... ... @@ -43,7 +43,7 @@ allowed-tools: Read Write Edit Skill Bash(git *) Bash(glab *) Bash(sed *) Bash(a
43 43 - erp-module-report 步骤 5b 是否已 commit 模块报告 + cross-module log?
44 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 98  
99 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 102 - `Bash`: `git add docs/08-模块任务管理.md && git commit -m "chore(<module_id>): record MR !<iid> in docs/08"`。
103 103  
104 104 ### 步骤 9:再次 push
... ... @@ -111,12 +111,12 @@ rm -f .tmp/mr-title.txt .tmp/mr-desc.md
111 111  
112 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 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 15 ## 审核入口
16 16  
17 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 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 4 user-invocable: true
5 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 18  
19 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 23 - **命中任一 A 未勾** → 打å°ï¼š
24 24 ```
... ... @@ -44,7 +44,7 @@ B 阶段(Coding)的入å£åˆ†å‘器。èŒè´£ï¼š**éªŒè¯ Plan å·²å®Œæˆ â†’ æŒ
44 44 - 若 `module_merged[module_id]` 已有缓存:
45 45 - `true` → 跳过本 REQ,继续下一个
46 46 - `false` → `current_module = module_id`,结æŸé历,进入步骤 4
47   - - 未缓存 → 读 docs/08 § 二 è¯¥æ¨¡å—æ¡ç›®çš„ ` - MR:` 字段:
  47 + - 未缓存 → è¯»å– docs/08 § 二 è¯¥æ¨¡å—æ¡ç›®çš„ ` - MR:` 字段:
48 48 - `MR: —` → `module_merged[module_id] = false`ï¼›`current_module = module_id`,结æŸé历
49 49 - `MR: !<iid>` → `Bash`: `glab mr view <iid> -F json 2>/dev/null`ï¼Œè§£æž `.state`:
50 50 - `merged` → `module_merged[module_id] = true`,跳过本 REQ
... ... @@ -71,7 +71,7 @@ B 阶段(Coding)的入å£åˆ†å‘器。èŒè´£ï¼š**éªŒè¯ Plan å·²å®Œæˆ â†’ æŒ
71 71  
72 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 86 git status
87 87 git log main..origin/main # 远程领先的 commit
88 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 105  
106 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 117 - `docs/02-å¼€å‘计划.md § 二 å¼€å‘é¡ºåºæ¸…å•`ï¼ˆåˆ†å‘æƒå¨ï¼‰
121   -- `docs/08-模å—任务管ç†.md § 二`(模å—å…ƒæ•°æ® + `MR:` å­—æ®µï¼›æ¯æ¨¡å—行是 `- module_id ...` bullet,无 checkbox)
  118 +- `docs/08-模å—任务管ç†.md § 二`(模å—元数æ®ï¼Œå« `MR:` 字段)
122 119 - `CLAUDE.md`(项目指令)
123 120 - `erp-plan-start`(姊妹入å£ï¼ŒA 阶段)
... ...
skills/crosscut/erp-plan-start/SKILL.md
1 1 ---
2 2 name: erp-plan-start
3 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 5 allowed-tools: Skill Read Glob Grep
5 6 ---
6 7  
... ... @@ -20,7 +21,7 @@ docs/08 § 一 是**Plan 阶段进度æƒå¨**(A0~A5 çš„ checkbox)。ä¸åšå…
20 21  
21 22 2. **找 § 一 第一个未勾的 A å­é¡¹**
22 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 26 3. **把 `unchecked_line` 映射到 `target_skill` + `mark_line`**:
26 27  
... ... @@ -35,7 +36,7 @@ docs/08 § 一 是**Plan 阶段进度æƒå¨**(A0~A5 çš„ checkbox)。ä¸åšå…
35 36 | å« `A5` / A5 å­é¡¹ | `erp-downstream-gen` | `A5` |
36 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 41 ## 第二步:分å‘通知 + 调用目标 skill
41 42  
... ... @@ -43,7 +44,7 @@ docs/08 § 一 是**Plan 阶段进度æƒå¨**(A0~A5 çš„ checkbox)。ä¸åšå…
43 44  
44 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 52 │ │
52 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 62 â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”
62 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 26 │ │
27 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 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 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 84 3. 比对:
85 85 - REQ 提到但 docs/03 没有的表 → 报错停下(schema 与需求不一致;请确认是 REQ 理解错误还是需要新增 migration)
86 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 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 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 21 │ │
22 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 131  
132 132 2. 用 `Bash` 执行 `grep -c "INSERT INTO" sql/seed-data.sql` 统计数据行数:
133 133 - > 0:正常
134   - - = 0:提示"本地 DB 无数据,seed-data.sql 为空(只有 header 注释);如需测试数据,请在本地 MySQL 插入后重 A3",允许继续
  134 + - = 0:提示"本地 DB 无数据,seed-data.sql 为空(只有 header 注释);如需测试数据,请在本地 MySQL 插入后重新运行 A3",允许继续
135 135  
136 136 3. 用 `Edit` 在 `docs/08-模块任务管理.md` 勾选 5 个 checkbox(A3 的 4 个子项 + A3 父项):
137 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 27 │ │
28 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 37  
38 38 ### A. docs/02 — 开发计划(含 REQ 级开发顺序清单,CC 分发权威)
39 39  
40   -**清单粒度**:每行一个 REQ(功能),不是模块。同一模块的 REQ 必须**连续排列**。
  40 +**清单粒度**:一行一个 REQ,同一模块的 REQ 必须**连续排列**。
41 41  
42 42 1. 构建**模块依赖 DAG**:
43 43 - docs/03 中的外键(表 A → 表 B ⇒ A 的模块依赖 B 的模块)
... ... @@ -83,9 +83,9 @@ allowed-tools: Read Write Edit Glob Grep Skill AskUserQuestion Bash(cat *)
83 83 docs/08 已由 A0 erp-project-init 创建(含 Plan 进度骨架)。本步骤只往 § 二 追加模块行,**不重写整个文件**。
84 84  
85 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 89 3. 所有模块行拼成一段文本,用 `Edit` 在 `docs/08-模块任务管理.md` 的 `## 二、Coding 阶段(按模块循环)` 标题后插入(定位用下一行注释"(A5 填入后..."作为锚,把模块清单插到该注释之前)。
90 90  
91 91 ### E. docs/10 — 验收清单
... ... @@ -101,13 +101,13 @@ docs/08 已由 A0 erp-project-init 创建(含 Plan 进度骨架)。本步骤
101 101  
102 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 106 b. **`【人工填写:...】` → QA 循环等用户补**(与 A2 erp-skeleton-gen 步骤 E 同风格):
107 107  
108 108 循环执行直到两个条件**同时满足**:(1) 扫描 0 命中;(2) 用户选「继续」
109 109  
110   - - **b.1 扫描**:用 `Grep` 在上述所有文件中搜 `【人工填写:`,得命中数 N 和残留位置清单(`<文件:行号> — <行内容摘要>`)
  110 + - **b.1 扫描**:用 `Grep` 在上述所有文件中搜索 `【人工填写:`,得到命中数 N 和残留位置清单(`<文件:行号> — <行内容摘要>`)
111 111 - **b.2 打印汇总横幅**:
112 112 ```
113 113 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
... ... @@ -122,18 +122,18 @@ docs/08 已由 A0 erp-project-init 创建(含 Plan 进度骨架)。本步骤
122 122 填完后 → 回来选「继续」放行完成 Plan
123 123 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
124 124 ```
125   - - **b.3 弹 QA**:用 `AskUserQuestion` 询问:
  125 + - **b.3 弹 QA**:用 `AskUserQuestion` 询问:
126 126 - **question**: `最终占位符补填完毕?`
127 127 - **options** (每项为对象):
128 128 - `{"label": "继续", "description": "放行完成 Plan 阶段"}`
129 129 - `{"label": "有疑问想先沟通", "description": "需要讨论或修改"}`
130 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 138 3. 用 `Edit` 在 `docs/08-模块任务管理.md` 勾选 7 个 checkbox(A5 的 6 个子项 + A5 父项):
139 139 - ` - [ ] docs/02 开发计划已生成` → `[x]`
... ... @@ -154,8 +154,12 @@ docs/08 已由 A0 erp-project-init 创建(含 Plan 进度骨架)。本步骤
154 154  
155 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 10  
11 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 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 21 │ │
22 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 46 2. æ ¹æ®å½“å‰ç³»ç»Ÿé€‰æœ€åˆé€‚的包管ç†å™¨å®‰è£… mysql å®¢æˆ·ç«¯ï¼›è‹¥éœ€è¦ sudo 但 CC 没有æƒé™ï¼Œæ‰“å°æ‰‹åŠ¨å®‰è£…å‘½ä»¤è®©ç”¨æˆ·æ‰§è¡Œ
47 47 3. 装完åŽï¼ŒæŠŠå¿…è¦çš„ bin è·¯å¾„åŠ å…¥æœ¬æ¬¡ä¼šè¯ PATH(如 macOS çš„ keg-only 路径)
48 48 4. å‘用户æç¤ºå¦‚何把路径永久写入 shell å¯åŠ¨è„šæœ¬
49   -5. 釿–°è·‘开头的 `command -v` 循环验è¯ï¼›ä»ç¼ºå¤± → 打å°é”™è¯¯å¹¶åœä¸‹ï¼Œç­‰ç”¨æˆ·æ‰‹åŠ¨è§£å†³åŽé‡è·‘å…¥å£
  49 +5. 釿–°æ‰§è¡Œå¼€å¤´çš„ `command -v` 循环验è¯ï¼›ä»ç¼ºå¤± → 打å°é”™è¯¯å¹¶åœä¸‹ï¼Œç­‰ç”¨æˆ·æ‰‹åŠ¨è§£å†³åŽé‡æ–°è¿è¡Œå…¥å£
50 50  
51 51 ### B. 幂等å¤åˆ¶æ¨¡æ¿æ–‡ä»¶
52 52  
... ... @@ -59,7 +59,7 @@ cp -n &quot;${CLAUDE_SKILL_DIR}/templates/docs-01-readme-template.md&quot; docs/01-需求æ
59 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 64 ### C. åˆå§‹åŒ– Git(如尚未åˆå§‹åŒ–)
65 65  
... ...
skills/plan/erp-project-init/templates/CLAUDE-template.md
... ... @@ -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 34  
35 35 | `MR:` 字段 | `glab mr view state` | 含义 | 你(Claude Code)的行为 |
36 36 |---|---|---|---|
37   -| `—` | — | 模块未开始(未建 MR) | ✅ 开始本模块开发 |
  37 +| `—` | — | 模块未开始(未建 MR) | ✅ 开始本模块开发 |
38 38 | `!<iid>` | `opened` / `closed` | 模块开发中 / 打回 | ✅ 继续推进该模块 |
39 39 | `!<iid>` | `merged` | 模块**已完成** | 🟢 进入下一未完成模块 |
40 40  
41 41 ### 工作流规则
42 42  
43 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 45 - `docs/02 § 二` 清单由 A5 `erp-downstream-gen` 生成阶段一次性确定(会交互询问业务偏好),之后通常不改;若开发中途需要调整顺序,重新触发 A5 生成阶段而非直接编辑文件
46 46 - **已完成模块**(`MR: !<iid>` + `glab mr view state=merged`):**默认不改**(不是禁止,是已交付无需改)
47 47 - 如果在当前模块开发中发现某个**已完成模块**(MR merged)有 bug:
... ... @@ -53,21 +53,21 @@
53 53  
54 54 ```
55 55 1. 对每个 REQ 跑完整功能循环:
56   - brainstorm → plan → TDD(红绿循环,每步 commit)→ verify(子会话 REQ 级测试)→ 自审
  56 + brainstorm → plan → TDD(红绿循环,每步 commit)→ verify(子会话执行 REQ 级测试)→ 自审
57 57 2. 所有 REQ 完成后,erp-local-test-gate 派子会话按顺序跑:
58 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 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 64 + glab mr create,报告嵌入 MR 描述
65 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 96  
97 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 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 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 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 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 2  
3 3 > 全流程进度跟踪。CC 每完成一项产出就勾选一项。
4 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 7 ## 一、Plan 阶段(一次性)
8 8  
... ... @@ -41,7 +41,7 @@
41 41  
42 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 46 <!-- 模块格式示例(由 A5 erp-downstream-gen 追加):
47 47 - module_0 系统管理
... ...
skills/plan/erp-scope-lock/SKILL.md
... ... @@ -21,9 +21,9 @@ allowed-tools: Read Write Edit Grep Skill AskUserQuestion
21 21 │ │
22 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 170 - `api_refs` —— 填 `TBD(A5 自动补)`(A5 `erp-downstream-gen` 回填依赖接口)
171 171 - 用 module 模板包装卡片列表
172 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 218 审阅完成后,运行以下命令继续进入 A2:
219 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 20  
21 21 **产出覆盖提醒**:
22 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 34 │ │
35 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 89  
90 90 说明:
91 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 93 - **硬依赖**:项目 `pom.xml` 必须包含 `flyway-core` + `flyway-mysql` 依赖(已列入 docs/04 § 零 技术栈);否则 Spring 启动不会 apply migration,测试会因表不存在而失败
94 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 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 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 155 目标:减少用户重复编辑。同一"逻辑占位"(如根包名出现多处)只问用户一次,CC 批量填;派生占位(如 Java 路径从根包名派生)由 CC 自己推断。敏感占位(`.env.local` 凭据 / 密钥)不进会话上下文,让用户自己去文件里填。
156 156  
157 157 循环执行直到**两个条件同时满足**:
158   -(a) 所有占位符已填(重命中数 N = 0)
  158 +(a) 所有占位符已填(重新扫描命中数 N = 0)
159 159 (b) 用户选「继续」
160 160  
161 161 #### E.1 扫描 + 分组
162 162  
163   -用 `Grep` 扫 `【人工填写:` 于以下 8 个路径,记录每处命中(文件 + 行号 + 说明文字):
  163 +用 `Grep` 在以下 8 个路径下扫描 `【人工填写:`,记录每处命中(文件 + 行号 + 说明文字):
164 164 - `docs/04-技术规范.md`
165 165 - `docs/06-UI交互规范.md`
166 166 - `docs/07-环境配置.md`
... ... @@ -211,7 +211,7 @@ options:
211 211  
212 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 270 - `{"label": "有疑问想先沟通", "description": "需要讨论或修改"}`
271 271  
272 272 4. 路由:
273   - - 选「有疑问想先沟通」→ 回答用户问题后**回 E.5.1 重扫**
274   - - 选「继续」→ **回 E.5.1 重扫验证**:
  273 + - 选「有疑问想先沟通」→ 回答用户问题后**回 E.5.1 重新扫描**
  274 + - 选「继续」→ **回 E.5.1 重新扫描验证**:
275 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 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 23  
24 24 ## 四、常用命令
25 25  
26   -<!-- 表格:| 命令 | 说明 |;包含 启动后端 / 启动前端 / 打包 / 跑测试 / 重置测试数据 / 创建 MR。 -->
  26 +<!-- 表格:| 命令 | 说明 |;包含 启动后端 / 启动前端 / 打包 / 运行测试 / 重置测试数据 / 创建 MR。 -->
... ...