Commit cc94a5f4a617f39265ca0acc5dd487580b061444
1 parent
18d6d292
edit
Showing
23 changed files
with
141 additions
and
136 deletions
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 "$current_branch" 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
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 "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 "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 "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 "${CLAUDE_SKILL_DIR}/templates/docs-01-readme-template.md" 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 "${CLAUDE_SKILL_DIR}/templates/scripts-setup-test-db-template.sh" 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 "${CLAUDE_SKILL_DIR}/scripts/merge-gitignore.sh" "${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