diff --git a/README.md b/README.md index c46c1b8..9e9b159 100644 --- a/README.md +++ b/README.md @@ -10,15 +10,15 @@ Claude Code 插件:ERP / 后端管理系统全流程开发框架。 📋 阶段 A:规划(一次性,入口 /erp-workflow:erp-plan-start) 初始化项目 → 锁范围(REQ 卡片生成) ↓ - ⏸ 审阅 REQ 卡片 → 重跑 /erp-plan-start 继续 + ⏸ 审阅 REQ 卡片 → 重新运行 /erp-plan-start 继续 ↓ - 生骨架 → 初始化 DB(V1 migration + seed)→ 生 DB 设计 → 生下游文档 + 生成骨架 → 初始化 DB(V1 migration + seed)→ 生成 DB 设计 → 生成下游文档 ↓ 用户显式 /erp-workflow:erp-coding-start 🔁 阶段 B:编码(按模块循环,入口 /erp-workflow:erp-coding-start) 功能循环:Brainstorm → Plan → TDD → Verify → Review - 模块循环:本地测试闸门 → 写模块报告 → 建 GitLab MR → ⏸ 用户 Approve+Merge → 下次 coding-start 自动扫 MR merged → 下一模块 + 模块循环:本地测试闸门 → 写模块报告 → 创建 GitLab MR → ⏸ 用户 Approve+Merge → 下次 coding-start 自动扫描 MR 状态为 merged → 下一模块 ⚙️ 后台守门:占位符未填 / 红旗触发 / 跨模块改动未记录 ``` @@ -53,25 +53,25 @@ claude --plugin-dir /path/to/erp-workflow-plugin ``` Plan 阶段**两段式**执行,中间有一个 REQ 审阅断点: - - **第一段(首次运行)**:跑 **A0 → A1**(创建骨架 / 锁技术栈 / 填需求 / 生成 REQ 卡片)后**停下**,等你审阅 `docs/01-需求清单/*.md` 里的 REQ 卡片(这是 Plan 阶段最关键的人工关口) - - **第二段(审阅完重跑同一命令)**:继续 **A2 → A5**(生骨架 / 初始化 DB / 生设计 / 生下游文档),Plan 完成后再次**停下** + - **第一段(首次运行)**:执行 **A0 → A1**(创建骨架 / 锁技术栈 / 填需求 / 生成 REQ 卡片)后**停下**,等你审阅 `docs/01-需求清单/*.md` 里的 REQ 卡片(这是 Plan 阶段最关键的人工关口) + - **第二段(审阅完重新运行同一命令)**:继续 **A2 → A5**(生成骨架 / 初始化 DB / 生成设计 / 生成下游文档),Plan 完成后再次**停下** - 每次运行都会自动接上次停下的地方继续;中途可以随时关闭 CC,下次跑同样的命令就能恢复。Plan 完成后**不会自动进入编码**,需要你手动运行 `/erp-workflow:erp-coding-start`。 + 每次运行都会自动接上次停下的地方继续;中途可以随时关闭 CC,下次运行同样的命令即可恢复。Plan 完成后**不会自动进入编码**,需要你手动运行 `/erp-workflow:erp-coding-start`。 3. **Coding 阶段入口**(模块循环): ``` /erp-workflow:erp-coding-start ``` - Plan 全部完成后由你显式触发。**按 `docs/02 § 二` REQ 开发顺序清单**扫描决定当前模块: - 对每个 REQ 所属模块查 `docs/08` 的 `MR:` 字段 + `glab mr view state`: + Plan 全部完成后由你显式触发。**按 `docs/02 § 二` REQ 开发顺序清单**扫描,决定当前模块: + 对每个 REQ 所属模块查询 `docs/08` 的 `MR:` 字段 + `glab mr view state`: - `state == merged` → 模块已完成,跳过 - `MR: —` / opened / closed / 查不到 → 该模块是当前模块 之后 `git checkout main` + `git pull --ff-only` 同步远程 main(保证下次 module 分支切出时 base 新鲜),再派发到 `erp-module-start`。 - **`docs/08 § 二` 每模块是 bullet(`- module_id ...`,无 checkbox)**——完成信号由 MR merged state 判定。原来的"翻勾 `[x]`"动作已从结构上消除,彻底消灭 Codex adversarial review Finding 1 的"用户抢跑 coding-start 跳过未合并模块"的 ordering bug。 + **`docs/08 § 二` 每模块占一行 bullet**,完成信号由 MR merged state 判定;即使用户提前触发 coding-start,未 merged 的模块仍会被选中,不会跳过。 -4. **中途恢复**:任何时候跑对应入口命令——根据 Plan § 一 checkbox 和 § 二 各模块 MR state 跳到当前该做的事。 +4. **中途恢复**:任何时候运行对应入口命令——根据 Plan § 一 checkbox 和 § 二 各模块 MR state 跳到当前该做的事。 ## 目录结构 @@ -120,7 +120,7 @@ erp-workflow-plugin/ ``` /erp-workflow:erp-coding-start ← 用户每次手动触发 │ - │ 扫 docs/02 REQ 序 + docs/08 MR 字段 + glab mr view state 判当前模块: + │ 扫描 docs/02 REQ 序 + docs/08 MR 字段 + glab mr view state 判定当前模块: │ - 所有模块都 merged → 打印"所有模块已完成" │ - 找到第一个非 merged 模块 → 派发 │ 派发前 git checkout main + git pull --ff-only(同步远程 base) @@ -131,39 +131,39 @@ erp-workflow-plugin/ │ erp-feature-brainstorm → -plan → -tdd → -verify → -review │ │ review approve → 回 erp-module-start(推进下一 REQ) - │ review request-changes (<5) → fix commit → 回 erp-feature-verify 重跑 + │ review request-changes (<5) → fix commit → 回 erp-feature-verify 重新执行 │ review request-changes (=5) → 停下(升级给人) │ │ 模块全部 REQ approve → │ erp-local-test-gate(commit test-gate.md) │ → erp-module-report(commit 模块报告 + cross-module log) - │ → erp-mr-create(worktree clean 校验 → push 代码+evidence → 建 MR + │ → erp-mr-create(worktree clean 校验 → push 代码+evidence → 创建 MR │ → 追 MR URL 到报告 + commit → 写 MR iid 到 docs/08 + commit - │ → 再 push;docs/08 无 checkbox) + │ → 再 push) │ └─ ⏸ 停下等人工 Approve + Merge - (人工合并后再跑 coding-start,扫到 state=merged 自动跳过 + (人工合并后再次运行 coding-start,扫描到 state=merged 自动跳过 → pull main → 推进下一模块) ``` | Skill | 做什么 | 谁触发它 | |---|---|---| -| `erp-module-start` | 定位当前模块(docs/02 REQ 序)+ 切/建 `module-` 分支 + 扫 `docs/superpowers/reviews/*.md` 的 `verdict=approve` 算已完成 REQ + 推进第一个未完成 REQ 的功能循环。全部完成 → `erp-local-test-gate`。**幂等可重入**(中途断开再跑自动跳过已 approve 的 REQ) | `erp-coding-start` 派发;`erp-feature-review` approve 后回调 | +| `erp-module-start` | 定位当前模块(docs/02 REQ 序)+ 切换或创建 `module-` 分支 + 扫描 `docs/superpowers/reviews/*.md` 的 `verdict=approve` 计算已完成 REQ + 推进第一个未完成 REQ 的功能循环。全部完成 → `erp-local-test-gate`。**幂等可重入**(中途断开后重新运行会自动跳过已 approve 的 REQ) | `erp-coding-start` 派发;`erp-feature-review` approve 后回调 | | `erp-feature-brainstorm` | 功能循环步骤 1:交互 brainstorm → 生成 `docs/superpowers/specs/*.md` | `erp-module-start` 推进 REQ 时调用 | | `erp-feature-plan` | 功能循环步骤 2:spec → 任务级 plan(含文件路径 + 完整代码),输出 `docs/superpowers/plans/*.md` | `erp-feature-brainstorm` 链式调用 | | `erp-feature-tdd` | 功能循环步骤 3:红绿循环(写失败测试 → 实现 → 子会话验证通过 → commit 到 `module-` 分支) | `erp-feature-plan` 链式调用 | -| `erp-feature-verify` | 功能循环步骤 4:全测试套件派子会话跑一次,用模板渲染 evidence | `erp-feature-tdd` 链式调用;`erp-feature-review` 在 request-changes 修复后重跑 | -| `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` 链式调用 | -| `erp-local-test-gate` | MR 前硬闸门:子会话跑 `scripts/test.sh`(脚本内部 drop+create 空库、Flyway apply `sql/migrations/V*.sql`、再跑测试);通过 → 写 `-test-gate.md` 并 `git add + commit`(evidence 进 module 分支);失败停下 | `erp-module-start` 在本模块所有 REQ approve 后调用 | -| `erp-module-report` | 红旗检查 → 生成 12 节模块完成报告 `docs/superpowers/module-reports/-.md` → `git add + commit`(报告 + cross-module log 进 module 分支,erp-mr-create 的 worktree clean 前置条件依赖此步) | `erp-local-test-gate` 链式调用 | -| `erp-mr-create` | 红旗检查 → 验证当前分支 = `module-` + `git status --porcelain` worktree 干净 → `git push` 推代码和所有 evidence → `glab mr create`(模块报告嵌入 MR 描述)→ 追 MR URL 到报告 + commit → 回写 `MR: —` → `MR: !` 到 docs/08 + commit → 再次 push;**停下等人工 Approve+Merge**。docs/08 § 二是模块元数据 bullet(无 checkbox),完成由 MR state 判定 | `erp-module-report` 链式调用 | +| `erp-feature-verify` | 功能循环步骤 4:将全量测试派发到子会话执行一次,用模板渲染 evidence | `erp-feature-tdd` 链式调用;`erp-feature-review` 在 request-changes 修复后重新调用 | +| `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` 链式调用 | +| `erp-local-test-gate` | MR 前硬闸门:子会话执行 `scripts/test.sh`(脚本内部 drop+create 空库、Flyway apply `sql/migrations/V*.sql`、再执行测试);通过 → 写 `-test-gate.md` 并 `git add + commit`(evidence 提交到 module 分支);失败停下 | `erp-module-start` 在本模块所有 REQ approve 后调用 | +| `erp-module-report` | 红旗检查 → 生成 12 节模块完成报告 `docs/superpowers/module-reports/-.md` → `git add + commit`(报告 + cross-module log 提交到 module 分支,erp-mr-create 的 worktree clean 前置条件依赖此步) | `erp-local-test-gate` 链式调用 | +| `erp-mr-create` | 红旗检查 → 验证当前分支 = `module-` 且 `git status --porcelain` worktree 干净 → `git push` 推代码与全部 evidence → `glab mr create`(模块报告嵌入 MR 描述)→ 追加 MR URL 到报告并 commit → 把 docs/08 该模块的 `MR: —` 回写为 `MR: !` 并 commit → 再次 push;**停下等人工 Approve+Merge**。完成由 MR state 判定 | `erp-module-report` 链式调用 | ### Crosscut(4 个,`skills/crosscut/`) | Skill | 作用 | 流程中谁调用 | |---|---|---| -| `erp-plan-start` | **A 阶段入口**。读 docs/08 § 一 找第一个未勾 A 子项 → 派发对应 A skill;A 全部完成时提示运行 coding-start | **用户手动**运行 `/erp-workflow:erp-plan-start` | -| `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` | +| `erp-plan-start` | **A 阶段入口**。读取 docs/08 § 一 找第一个未勾 A 子项 → 派发对应 A skill;A 全部完成时提示运行 coding-start | **用户手动**运行 `/erp-workflow:erp-plan-start` | +| `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` | | `erp-red-flag-check` | 检查 CLAUDE.md 的 6 项红旗清单;命中则追加 Blocker 到计划文件并停下 | 功能循环各步骤和生成重要制品前自动调用 | | `erp-cross-module-log` | 给 `log-cross-module.sh` 追加的跨模块改动存根补「原因 / 影响评估」 | 用户看到 hook 提示后调用;`erp-module-start` 初始化日志文件时也会用其模板 | @@ -214,11 +214,11 @@ erp-workflow-plugin/ ## 前置依赖 -- **MySQL 8.x** 实例已建好(CC 不跑 DDL;schema 由人工初始化) +- **MySQL 8.x** 实例已就绪(CC 不执行 DDL;schema 由人工初始化) - **`mysql` / `mysqldump` 命令行**:`erp-db-init` (A3) 验证连接 + 导出 V1 initial migration + 导出 seed-data.sql;`scripts/setup-test-db.sh` 在测试闸门前后 drop+create 空库 - **Spring Boot + Flyway**(**必需**):pom.xml 声明 `flyway-core` + `flyway-mysql`;Spring 启动时自动 apply `sql/migrations/V*.sql`。本插件生成的 `setup-test-db.sh` 只清库,schema 必须由 Flyway 应用 -- **GitLab + glab CLI**:`erp-mr-create` 用 `glab mr create`;`erp-coding-start` 用 `glab mr view` 判 MR 状态 -- **本地能跑 `mvn test` / `pnpm test`**:测试闸门 `scripts/test.sh` 由 `erp-skeleton-gen` 生成 +- **GitLab + glab CLI**:`erp-mr-create` 用 `glab mr create`;`erp-coding-start` 用 `glab mr view` 判定 MR 状态 +- **本地可运行 `mvn test` / `pnpm test`**:测试闸门 `scripts/test.sh` 由 `erp-skeleton-gen` 生成 ## 设计原则 diff --git a/hooks/scripts/log-cross-module.sh b/hooks/scripts/log-cross-module.sh index 1fe0aa7..24bd34f 100755 --- a/hooks/scripts/log-cross-module.sh +++ b/hooks/scripts/log-cross-module.sh @@ -1,7 +1,6 @@ #!/usr/bin/env bash # PostToolUse hook: 检测 Edit/Write 是否触及"当前模块以外"的模块路径,若是则在当前模块的跨模块日志中留痕(软规则 S2)。 -# 注:原设计基于"已勾 [x] 模块"触发,但 docs/08 § 二 的 checkbox 永远保持 `- [ ]`(完成由 MR merged state 判定); -# 新判定按"非当前模块"触发——CC 在当前模块开发期间改动其他模块(无论是否已 merged)都应留痕。 +# CC 在当前模块开发期间改动其他模块(无论目标模块是否已 merged)都会在此处留痕。 set -euo pipefail @@ -29,8 +28,7 @@ case "$current_branch" in esac [ -n "$current_module" ] || exit 0 -# 遍历所有 `- module_X` 行(docs/08 § 二 的所有模块,纯 bullet 无 checkbox), -# 提取 module_id 和其下的"路径:"行。 +# 遍历 docs/08 § 二 的所有 `- module_X` 行,提取 module_id 和其下的"路径:"行。 # docs/08 § 二 的模块块结构: # - module_0 # - 依赖: ... diff --git a/skills/coding/erp-feature-brainstorm/SKILL.md b/skills/coding/erp-feature-brainstorm/SKILL.md index 8298d5e..2029758 100644 --- a/skills/coding/erp-feature-brainstorm/SKILL.md +++ b/skills/coding/erp-feature-brainstorm/SKILL.md @@ -11,7 +11,7 @@ allowed-tools: Read Write Skill Bash(mysql *) ## 说明 -针对一个 REQ-XXX-NNN,委托 `superpowers:brainstorming` 进行头脑风暴,然后将输出打包到标准规格模板中,产出 ≤1 页的功能规格。 +针对一个 REQ-XXX-NNN,委托 `superpowers:brainstorming` 进行头脑风暴,再把输出填入标准规格模板,产出单页功能规格。 ## 执行步骤 diff --git a/skills/coding/erp-feature-review/SKILL.md b/skills/coding/erp-feature-review/SKILL.md index 9be880e..8ebdadf 100644 --- a/skills/coding/erp-feature-review/SKILL.md +++ b/skills/coding/erp-feature-review/SKILL.md @@ -1,6 +1,6 @@ --- name: erp-feature-review -description: 功能循环第 5 步。AI 自审,输出审阅报告到 docs/superpowers/reviews/。approve 回调 erp-module-start;request-changes 则编辑代码并 fix commit,重跑 verify。自修复循环上限 5 轮。 +description: 功能循环第 5 步。AI 自审,输出审阅报告到 docs/superpowers/reviews/。approve 回调 erp-module-start;request-changes 则编辑代码并 fix commit,重新执行 verify。自修复循环上限 5 轮。 user-invocable: false allowed-tools: Read Write Edit Skill Agent Bash(git add *) Bash(git commit *) --- @@ -22,14 +22,14 @@ allowed-tools: Read Write Edit Skill Agent Bash(git add *) Bash(git commit *) - 逐项处理 `must_fix[]`:对每个条目用 `Edit` 修改其指向的代码文件。 - 所有 Must-fix 修复后,拼 commit 消息(格式与 `erp-feature-tdd` 一致,单行):`fix(): 修复 review round must-fix `。 - `Bash`: `git add <修改的代码文件>` + `git commit -m "<上一步拼出的消息>"`。 - - 调用 `Skill(erp-feature-verify)` 重跑验证;verify 通过后会再次链到本 skill,作为 round `` 重审。 + - 调用 `Skill(erp-feature-verify)` 重新执行验证;verify 通过后会再次链到本 skill,作为 round `` 重审。 6. 上限:**5 轮**。第 5 轮仍为 `request-changes` → 停止并打印摘要(升级给用户手工介入),不再自动修复,不回调 module-start。 ## 衔接 - `approve` → `Skill(erp-module-start)` 回主循环。 -- `request-changes`(round < 5)→ `Skill(erp-feature-verify)` 重跑。 +- `request-changes`(round < 5)→ `Skill(erp-feature-verify)` 重新执行。 - `request-changes`(round == 5)→ 停止。 ## 参考 diff --git a/skills/coding/erp-feature-tdd/SKILL.md b/skills/coding/erp-feature-tdd/SKILL.md index ffca2a9..641ab0d 100644 --- a/skills/coding/erp-feature-tdd/SKILL.md +++ b/skills/coding/erp-feature-tdd/SKILL.md @@ -17,7 +17,7 @@ allowed-tools: Read Write Edit Agent Skill Bash(git add *) Bash(git commit *) - `ls sql/migrations/V*.sql` 得最大版本号 n_max,新文件版本号 = n_max + 1 - 文件名格式 `V__.sql`,例 `V5__add_user_email.sql` - `Write` 该文件(只含 DDL:`ALTER TABLE ... ADD COLUMN ...` / `CREATE TABLE ...` 等),commit - - 之后的代码任务(entity / DAO / service / 测试)在此之后做;测试跑时 Spring Boot 启动会让 Flyway 自动 apply 这个新 migration(`scripts/setup-test-db.sh` 只负责清空库) + - 之后的代码任务(entity / DAO / service / 测试)在此之后做;测试运行时 Spring Boot 启动会由 Flyway 自动 apply 这个新 migration(`scripts/setup-test-db.sh` 只负责清空库) 4. 按顺序处理每个(代码类)任务: a. 在 `test_file::test_name` 处编写失败测试。 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 *) - **绝不**在主会话直接运行 `mvn test` / `pnpm test` / `scripts/test.sh`,必须通过子会话。 - 每次提交必须包含 REQ-XXX-NNN 标签。 - 不要将不相关的变更合并到一次提交中。 -- **禁止**在主会话直接 `mysql -e "ALTER ..."` 跑业务 DDL;所有业务 schema 变更必须走 `sql/migrations/V_n__.sql` 文件(只读查询 / 临时调试探索除外)。 +- **禁止**在主会话直接 `mysql -e "ALTER ..."` 执行业务 DDL;所有业务 schema 变更必须走 `sql/migrations/V_n__.sql` 文件(只读查询 / 临时调试探索除外)。 ## 衔接 diff --git a/skills/coding/erp-feature-verify/SKILL.md b/skills/coding/erp-feature-verify/SKILL.md index c77442e..7496cb1 100644 --- a/skills/coding/erp-feature-verify/SKILL.md +++ b/skills/coding/erp-feature-verify/SKILL.md @@ -1,6 +1,6 @@ --- name: erp-feature-verify -description: 功能循环第 4 步。将功能的测试套件派发到子会话执行,用模板渲染验证证据。无证据不得声称完成。 +description: 功能循环第 4 步。将本功能的测试派发到子会话执行,用模板渲染验证证据。无证据不得声称完成。 user-invocable: false allowed-tools: Skill Read Write Agent --- diff --git a/skills/coding/erp-local-test-gate/SKILL.md b/skills/coding/erp-local-test-gate/SKILL.md index b0f7a10..d912597 100644 --- a/skills/coding/erp-local-test-gate/SKILL.md +++ b/skills/coding/erp-local-test-gate/SKILL.md @@ -1,6 +1,6 @@ --- name: erp-local-test-gate -description: MR 创建前的唯一硬闸门。子会话跑 scripts/test.sh(setup-test-db.sh 清库后,Spring Boot 启动让 Flyway apply 当前 sql/migrations/V*.sql),任一失败则停止。 +description: MR 创建前的唯一硬闸门。子会话执行 scripts/test.sh(setup-test-db.sh 清库后,Spring Boot 启动时 Flyway 自动 apply 当前 sql/migrations/V*.sql),任一失败则停止。 user-invocable: false allowed-tools: Read Write Skill Agent Bash(git add *) Bash(git commit *) --- @@ -47,19 +47,19 @@ allowed-tools: Read Write Skill Agent Bash(git add *) Bash(git commit *) 请根据失败类型选择下一步: ① 测试脆弱(flakey,偶发) - → 再跑 /erp-workflow:erp-coding-start - (module-start 幂等:reviews 已全 approve 会跳过功能循环,直接重跑本闸门) + → 重新运行 /erp-workflow:erp-coding-start + (module-start 幂等:reviews 已全 approve 会跳过功能循环,直接重新执行本闸门) ② 真有回归(某个 REQ 破坏了其他 REQ/已合并模块) → 定位到具体 REQ,删除其 review 记录: rm docs/superpowers/reviews/*-.md - → 再跑 /erp-workflow:erp-coding-start + → 重新运行 /erp-workflow:erp-coding-start (module-start 把该 REQ 视为未完成,重走 brainstorm→...→review 循环修复) ③ 环境/依赖问题(DB 连不上、外部 API 失败、证书失效) → 命中红旗 #6(外部接口不可达) → 调用 Skill(erp-red-flag-check) 追加 Blocker 到本模块任一 plan 文件 - → 修好环境后再跑 /erp-workflow:erp-coding-start + → 修复环境后重新运行 /erp-workflow:erp-coding-start ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` diff --git a/skills/coding/erp-module-report/SKILL.md b/skills/coding/erp-module-report/SKILL.md index 4295c58..05c8ec4 100644 --- a/skills/coding/erp-module-report/SKILL.md +++ b/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( - **§ ⑥ 本模块新增 migration**:用 `git diff --name-only --diff-filter=A ..HEAD -- 'sql/migrations/V*.sql'` 列出本模块提交的新 migration 文件;每个文件 Read 第一行(V_n 描述)作为说明 - `docs/superpowers/module-reports/-cross-module.md` → § ⑦ - `docs/superpowers/module-reports/-test-gate.md` → § ⑤ - - § ④(读写的表):**用 `grep -rlE "(SELECT|INSERT|UPDATE|DELETE).*FROM|INTO"` 定位涉及 SQL 的文件,再按需 Read 片段**。不要全量读 docs/03。 + - § ④(读写的表):**用 `grep -rlE "(SELECT|INSERT|UPDATE|DELETE).*FROM|INTO"` 定位涉及 SQL 的文件,再按需读取片段**。不要全量读取 docs/03。 3. 用 `Read` 读取 `${CLAUDE_SKILL_DIR}/templates/module-report-template.md`,填充全部 12 节。 4. **硬性验证**: - § ⑦:如果 cross-module 有任何行含 `TBD(CC 补)` → **停止**,调用 `Skill(erp-cross-module-log)` 让 CC **自主推断**补齐,补完再回本步骤重验。 diff --git a/skills/coding/erp-module-start/SKILL.md b/skills/coding/erp-module-start/SKILL.md index 595f2e4..515921b 100644 --- a/skills/coding/erp-module-start/SKILL.md +++ b/skills/coding/erp-module-start/SKILL.md @@ -1,6 +1,6 @@ --- name: erp-module-start -description: 启动/恢复模块循环。按 docs/02 § 二 REQ 清单定位当前模块及其 REQ 序列,确保处于模块分支,扫 docs/superpowers/reviews/ 计算已完成 REQ,驱动第一个未完成 REQ 的功能循环;全部完成则调 erp-local-test-gate。幂等可重入。 +description: 启动/恢复模块循环。按 docs/02 § 二 REQ 清单定位当前模块及其 REQ 序列,确保处于模块分支,扫描 docs/superpowers/reviews/ 计算已完成 REQ,驱动第一个未完成 REQ 的功能循环;全部完成则调用 erp-local-test-gate。幂等可重入。 user-invocable: false allowed-tools: Read Write Skill Glob Grep Bash(git branch *) Bash(git checkout *) Bash(git rev-parse *) Bash(glab mr *) --- @@ -13,20 +13,20 @@ allowed-tools: Read Write Skill Glob Grep Bash(git branch *) Bash(git checkout * ### 步骤 1:按 `docs/02 § 二` REQ 序 + MR state 定位当前模块 + 本模块 REQ 列表 -与 `erp-coding-start` 步骤 3 同构(完成判定权威是 `MR:` 字段 + `glab mr view state`,不看 checkbox): +与 `erp-coding-start` 步骤 3 同构(完成判定以 `MR:` 字段 + `glab mr view state` 为准): - 用 `Read` 读取 `docs/02-开发计划.md`,用 `Grep`(pattern `^\|\s*[0-9]+\s*\|\s*\*\*(REQ-[A-Z0-9]+-[0-9]+)\*\*\s*\|\s*(module_\w+)`)抽取 § 二 表格数据行,按行号升序得 `req_order[]`。 - 若 `req_order` 为空 → 打印"⚠️ docs/02 § 二 REQ 开发顺序清单为空或无法解析,请检查"并停止。 - 初始化 `module_merged[module_id → bool]` 空缓存。按序遍历 `req_order[]`: - `module_merged[module_id]` 已缓存为 `true` → 跳过本 REQ。 - `module_merged[module_id]` 已缓存为 `false` → `current_module = module_id`,结束遍历。 - - 未缓存 → 读 docs/08 § 二 该模块条目的 ` - MR:` 字段: + - 未缓存 → 读取 docs/08 § 二 该模块条目的 ` - MR:` 字段: - `MR: —` → `module_merged[module_id] = false`,`current_module = module_id`,结束遍历。 - `MR: !` → `Bash`: `glab mr view -F json 2>/dev/null`,取 `.state`: - `merged` → 缓存 `true`,跳过本 REQ。 - 其他 → 缓存 `false`,`current_module = module_id`,结束遍历。 - **抽取本模块 REQ 序列 `req_list[]`**:从 `req_order[]` 取出所有 `module_id == current_module` 的项,按原序组成(同模块 REQ 必须连续,见 A5 约束)。 -- 用 `Read` 读取 docs/08 § 二 该模块行 + 后续缩进行,提取 `module_name` / `depends_on`(REQ 列表以 docs/02 为权威,不再读 docs/08)。 +- 用 `Read` 读取 docs/08 § 二 该模块行 + 后续缩进行,提取 `module_name` / `depends_on`(REQ 列表以 docs/02 为准,不再读取 docs/08)。 ### 步骤 2:所有模块已完成短路 @@ -66,7 +66,7 @@ allowed-tools: Read Write Skill Glob Grep Bash(git branch *) Bash(git checkout * ## 参考 - `docs/02-开发计划.md § 二 开发顺序清单`(分发权威) -- `docs/08-模块任务管理.md § 二`(模块元数据 + `MR:` 字段;每模块行是 `- module_id ...` bullet,无 checkbox;完成判定权威是 MR state) +- `docs/08-模块任务管理.md § 二`(模块元数据,含 `MR:` 字段;完成判定以 MR state 为准) - `docs/superpowers/reviews/*.md`(REQ 级进度事实——verdict=approve 即完成) - `${CLAUDE_SKILL_DIR}/templates/module-start-banner-template.md` - `${CLAUDE_SKILL_DIR}/templates/cross-module-log-template.md` diff --git a/skills/coding/erp-mr-create/SKILL.md b/skills/coding/erp-mr-create/SKILL.md index 8f6cfdd..ef5319a 100644 --- a/skills/coding/erp-mr-create/SKILL.md +++ b/skills/coding/erp-mr-create/SKILL.md @@ -1,6 +1,6 @@ --- name: erp-mr-create -description: 模块报告完成后,验证当前分支为 module- + worktree 干净,push 推代码和所有 evidence,创建 GitLab MR(报告嵌入描述),把 MR URL 追加到模块报告 § ⑫ 并 commit,把 MR iid 回写到 docs/08 该模块 `MR:` 字段并 commit,再次 push 同步。完成信号由 MR merged state 判定(docs/08 无 checkbox)。停下等待人工审核。 +description: 模块报告完成后,验证当前分支为 module- 且 worktree 干净,push 推代码和所有 evidence,创建 GitLab MR(报告嵌入描述),把 MR URL 追加到模块报告 § ⑫ 并 commit,把 MR iid 回写到 docs/08 该模块 `MR:` 字段并 commit,再次 push 同步。完成信号由 MR merged state 判定。停下等待人工审核。 user-invocable: false 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/*) --- @@ -24,7 +24,7 @@ allowed-tools: Read Write Edit Skill Bash(git *) Bash(glab *) Bash(sed *) Bash(a ### 步骤 1:验证当前分支 - `Bash`: `git branch --show-current` → `current_branch`。 -- `current_branch` 必须匹配 `module-*`;否则打印错误并**停止**(不自动建分支——分支职责在 `erp-module-start` 步骤 3)。 +- `current_branch` 必须匹配 `module-*`;否则打印错误并**停止**(不自动创建分支——分支职责在 `erp-module-start` 步骤 3)。 - 从 `current_branch` 取 `module_id = current_branch` 去掉 `"module-"` 前缀。 ### 步骤 2:验证 worktree 干净(防止 evidence 文件漏 commit) @@ -43,7 +43,7 @@ allowed-tools: Read Write Edit Skill Bash(git *) Bash(glab *) Bash(sed *) Bash(a - erp-module-report 步骤 5b 是否已 commit 模块报告 + cross-module log? - 本 skill 前没人跑过额外的 Edit/Write? - 修复方式:`git add && git commit -m "..."`,然后重跑 /erp-workflow:erp-coding-start。 + 修复方式:`git add && git commit -m "..."`,然后重新运行 /erp-workflow:erp-coding-start。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` @@ -98,7 +98,7 @@ rm -f .tmp/mr-title.txt .tmp/mr-desc.md ### 步骤 8:回写 docs/08 的 MR 字段并 commit -- `Edit docs/08-模块任务管理.md`:把当前模块条目的 ` - MR: —` 改为 ` - MR: !`(只改一行)。docs/08 § 二每模块是 bullet(`- module_id ...`,无 checkbox),`MR:` 字段是唯一动态字段。 +- `Edit docs/08-模块任务管理.md`:把当前模块条目的 ` - MR: —` 改为 ` - MR: !`(只改一行)。docs/08 § 二 中 `MR:` 是唯一动态字段。 - `Bash`: `git add docs/08-模块任务管理.md && git commit -m "chore(): record MR ! in docs/08"`。 ### 步骤 9:再次 push @@ -111,12 +111,12 @@ rm -f .tmp/mr-title.txt .tmp/mr-desc.md ### 步骤 11:停止 — 等待人工 Approve + Merge -用户合并后再跑 `/erp-workflow:erp-coding-start`,入口会自动检测 MR merged → `git checkout main` + `git pull --ff-only` 同步远程 + 派发下一模块。 +用户合并后再次运行 `/erp-workflow:erp-coding-start`,入口会自动检测 MR merged → `git checkout main` + `git pull --ff-only` 同步远程 + 派发下一模块。 ## 设计要点 -- **main 是 protected branch**,只能通过 MR 修改。MR diff 包含:代码 + 模块报告 + test-gate evidence + cross-module log + docs/08 的 `MR: !` 字段。 -- **完成信号由 MR state 判定**——docs/08 § 二每模块是 bullet(无 checkbox),没有可翻勾的地方。从结构上消除"用户抢跑 coding-start 跳过未合并模块"的 ordering bug。仅 `MR:` 字段在 `—` / `!` 之间变化。 +- **main 是 protected branch**,只能通过 MR 修改。MR diff 覆盖代码、模块报告、test-gate evidence、cross-module log,以及 docs/08 的 `MR: !` 字段。 +- **完成信号以 MR state 为准**:docs/08 § 二 中仅 `MR:` 字段在 `—` / `!` 之间变化,避免提前合并未完成模块的顺序错误。 - **worktree 干净前置**(步骤 2):保证 test-gate.md、module-report.md、cross-module log.md 都已进 repo,审计证据完整;防止下次 coding-start `git checkout main` 遇到 dirty state。 ## 参考 diff --git a/skills/coding/erp-mr-create/templates/mr-description-template.md b/skills/coding/erp-mr-create/templates/mr-description-template.md index 0a71f94..ebb483c 100644 --- a/skills/coding/erp-mr-create/templates/mr-description-template.md +++ b/skills/coding/erp-mr-create/templates/mr-description-template.md @@ -15,4 +15,4 @@ ## 审核入口 - 本 MR = 模块 `{{module_id}}` 的唯一人工介入点 -- Approve + Merge 后,下次用户跑 `/erp-workflow:erp-coding-start` 时入口会自动扫到 `glab mr view state=merged`,`git pull --ff-only` 同步 main 并推进下一模块。docs/08 § 二每模块是 bullet(无 checkbox),完成由 MR state 判定 +- Approve + Merge 后,下次用户运行 `/erp-workflow:erp-coding-start` 时入口会自动扫描到 `glab mr view state=merged`,`git pull --ff-only` 同步 main 并推进下一模块 diff --git a/skills/crosscut/erp-coding-start/SKILL.md b/skills/crosscut/erp-coding-start/SKILL.md index f57519a..ccef567 100644 --- a/skills/crosscut/erp-coding-start/SKILL.md +++ b/skills/crosscut/erp-coding-start/SKILL.md @@ -1,13 +1,13 @@ --- name: erp-coding-start -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 判定。 +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 最新。 user-invocable: true allowed-tools: Skill Read Glob Grep Bash(glab mr *) Bash(git branch *) Bash(git checkout *) Bash(git pull *) Bash(git status *) --- **所有输出必须使用中文。** -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)。 +B 阶段(Coding)的入口分发器。职责:**验证 Plan 已完成 → 按 docs/02 § 二 REQ 序 + MR state 定位当前模块 → 切回 main 并同步远程 → 派发 erp-module-start**。不直接生成任何文件。开发顺序以 `docs/02 § 二` 为准;完成判定以 `docs/08 条目的 MR: 字段 + glab mr view state` 为准。 ## 执行步骤 @@ -18,7 +18,7 @@ B 阶段(Coding)的入口分发器。职责:**验证 Plan 已完成 → ### 步骤 2:Plan 完成性检查 -用 `Grep` 在 `docs/08-模块任务管理.md` 搜 `^- \[ \] A[0-5]`(pattern 可以直接匹配父项未勾的情况;也可以更宽地搜 `^[[:space:]]*- \[ \].*A[0-5]` 涵盖子项)。 +用 `Grep` 在 `docs/08-模块任务管理.md` 搜索 `^- \[ \] A[0-5]`(pattern 可以直接匹配父项未勾的情况;也可以用更宽的 `^[[:space:]]*- \[ \].*A[0-5]` 覆盖子项)。 - **命中任一 A 未勾** → 打印: ``` @@ -44,7 +44,7 @@ B 阶段(Coding)的入口分发器。职责:**验证 Plan 已完成 → - 若 `module_merged[module_id]` 已有缓存: - `true` → 跳过本 REQ,继续下一个 - `false` → `current_module = module_id`,结束遍历,进入步骤 4 - - 未缓存 → 读 docs/08 § 二 该模块条目的 ` - MR:` 字段: + - 未缓存 → 读取 docs/08 § 二 该模块条目的 ` - MR:` 字段: - `MR: —` → `module_merged[module_id] = false`;`current_module = module_id`,结束遍历 - `MR: !` → `Bash`: `glab mr view -F json 2>/dev/null`,解析 `.state`: - `merged` → `module_merged[module_id] = true`,跳过本 REQ @@ -71,7 +71,7 @@ B 阶段(Coding)的入口分发器。职责:**验证 Plan 已完成 → - 请手工处理后重跑 /erp-workflow:erp-coding-start。 + 请手工处理后重新运行 /erp-workflow:erp-coding-start。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` 并**停下**。 @@ -86,7 +86,7 @@ B 阶段(Coding)的入口分发器。职责:**验证 Plan 已完成 → git status git log main..origin/main # 远程领先的 commit git log origin/main..main # 本地未推的 commit - 修复后重跑 /erp-workflow:erp-coding-start。 + 修复后重新运行 /erp-workflow:erp-coding-start。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` 并**停下**。 @@ -105,19 +105,16 @@ B 阶段(Coding)的入口分发器。职责:**验证 Plan 已完成 → 然后立即用 `Skill` 工具调用 `erp-module-start`。 -> 分发前先调 `erp-red-flag-check`;命中红旗则停在此不分发。 +> 分发前先调用 `erp-red-flag-check`;命中红旗则停在此不分发。 ## 设计要点 -- **完成判定直接读 `MR:` 字段 + `glab mr view state`**:docs/08 § 二 每模块是 bullet(无 checkbox),没有可翻勾的地方。这从结构上消除了 Codex adversarial review Finding 1 描述的"用户抢跑 coding-start 跳过未合并模块"的 ordering bug: - - MR 未 merge 前本地 docs/08 没有任何"已完成"标记 - - 即使用户抢跑 coding-start,步骤 3 扫到 MR opened 仍会选中当前模块(不是跳到下一模块) - - module-start 会 `git checkout module-` 回到原分支,用户看到"继续在当前模块"而非"开始下一模块" -- **pull main 时机**:原设计里 pull main 是 merged 分支特有动作;新设计里每次派发前都 pull main(代码同步 + module-start 切新分支时 base 新鲜)。 +- **完成判定直接读取 `MR:` 字段 + `glab mr view state`**:MR 未 merge 前 docs/08 没有任何"已完成"标记;用户提前触发 coding-start 时,步骤 3 扫描到 MR opened 仍会选中当前模块,module-start 会 `git checkout module-` 回到原分支继续,不会跳到下一模块。 +- **每次派发前都 pull main**:代码同步的同时,也保证 module-start 切出新分支时 base 新鲜。 ## 参考 - `docs/02-开发计划.md § 二 开发顺序清单`(分发权威) -- `docs/08-模块任务管理.md § 二`(模块元数据 + `MR:` 字段;每模块行是 `- module_id ...` bullet,无 checkbox) +- `docs/08-模块任务管理.md § 二`(模块元数据,含 `MR:` 字段) - `CLAUDE.md`(项目指令) - `erp-plan-start`(姊妹入口,A 阶段) diff --git a/skills/crosscut/erp-plan-start/SKILL.md b/skills/crosscut/erp-plan-start/SKILL.md index 4b1c561..9c7654d 100644 --- a/skills/crosscut/erp-plan-start/SKILL.md +++ b/skills/crosscut/erp-plan-start/SKILL.md @@ -1,6 +1,7 @@ --- name: erp-plan-start description: A 阶段(Plan)入口与分发器。根据 docs/08 § 一 的 checkbox 状态派发到 A0~A5 对应 skill(§ 二是 B 阶段模块元数据,本 skill 不读)。Plan 全部完成(A5 已勾)时打印提示让用户运行 /erp-workflow:erp-coding-start 进入 B 阶段。 +user-invocable: true allowed-tools: Skill Read Glob Grep --- @@ -20,7 +21,7 @@ docs/08 § 一 是**Plan 阶段进度权威**(A0~A5 的 checkbox)。不做 2. **找 § 一 第一个未勾的 A 子项** 用 `Grep`(pattern `^[[:space:]]*- \[ \].*A[0-5]`,`-n`)在 `docs/08-模块任务管理.md` 的 § 一 Plan 段搜索,取**最小行号**那一行作为 `unchecked_line`。 - 注:§ 二 的模块行是纯 bullet(`- module_id ...`,无 checkbox),不会被此 pattern 匹配。 + 注:§ 二 的模块行是纯 bullet(形如 `- module_id ...`),不会被此 pattern 匹配。 3. **把 `unchecked_line` 映射到 `target_skill` + `mark_line`**: @@ -35,7 +36,7 @@ docs/08 § 一 是**Plan 阶段进度权威**(A0~A5 的 checkbox)。不做 | 含 `A5` / A5 子项 | `erp-downstream-gen` | `A5` | | 无命中(A 全勾,Plan 阶段结束) | **无分发** | `plan-done` | -项目完成状态(B 阶段所有模块 MR merged)由 `erp-coding-start` 扫 MR state 判定并打印,本 skill 不处理。 +项目完成状态(B 阶段所有模块 MR merged)由 `erp-coding-start` 扫描 MR state 判定并打印,本 skill 不处理。 ## 第二步:分发通知 + 调用目标 skill @@ -43,7 +44,7 @@ docs/08 § 一 是**Plan 阶段进度权威**(A0~A5 的 checkbox)。不做 ### 2.1 Plan 已完成(`mark_line=plan-done`) -A 阶段所有 checkbox 均 `[x]`。因无下游 A skill 接手,本步骤**自己打印流程图**(`▶` 标在"规划阶段到此结束")+ 提示,**停下**;项目整体完成状态由 `erp-coding-start` 扫 MR state 判定,本 skill 不负责: +A 阶段所有 checkbox 均 `[x]`。因无下游 A skill 接手,本步骤**自行打印流程图**(`▶` 标在"规划阶段到此结束")并给出提示,然后**停下**;项目整体完成状态由 `erp-coding-start` 扫描 MR state 判定,本 skill 不负责: ``` ┌──────────────────────────────────────────────────────┐ @@ -51,9 +52,9 @@ A 阶段所有 checkbox 均 `[x]`。因无下游 A skill 接手,本步骤**自 │ │ │ A0 初始化项目 → A1 锁范围(REQ 卡片) │ │ ↓ │ -│ ⏸ 等你审阅 REQ,重跑 /erp-plan-start 续 │ +│ ⏸ 等你审阅 REQ,重新运行 /erp-plan-start 继续 │ │ ↓ │ -│ A2 生骨架 → A3 初始化 DB → A4 生 DB 设计 → A5 生下游文档│ +│ A2 生成骨架 → A3 初始化 DB → A4 生成 DB 设计 → A5 生成下游文档│ │ ↓ │ │ ▶ 规划阶段到此结束 │ └──────────────────────────────────────────────────────┘ @@ -61,7 +62,12 @@ A 阶段所有 checkbox 均 `[x]`。因无下游 A skill 接手,本步骤**自 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [erp-plan-start] ✅ Plan 阶段全部完成 - 请运行 /erp-workflow:erp-coding-start 进入 B 阶段模块循环。 + ⚠️ 进入 B 阶段前必须完成: + 1. 人工通读 docs/01~10 + CLAUDE.md + sql/migrations/V1 + 各 scripts/* + 2. 把全部 Plan 产物 commit 到 main 分支: + git add -A && git commit -m "chore: plan phase A0~A5 done" + 3. 建 Plan MR 提交团队审核,合并后 main 成为 B 阶段每个模块分支的基线 + 4. MR 合并后再运行 /erp-workflow:erp-coding-start 进入 B 阶段 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` diff --git a/skills/plan/erp-db-design-gen/SKILL.md b/skills/plan/erp-db-design-gen/SKILL.md index 330331a..9e662aa 100644 --- a/skills/plan/erp-db-design-gen/SKILL.md +++ b/skills/plan/erp-db-design-gen/SKILL.md @@ -26,9 +26,9 @@ allowed-tools: Read Write Edit Grep Glob Skill Bash(mysql *) Bash(source *) │ │ │ A0 初始化项目 → A1 锁范围(REQ 卡片) │ │ ↓ │ -│ ⏸ 等你审阅 REQ,重跑 /erp-plan-start 续 │ +│ ⏸ 等你审阅 REQ,重新运行 /erp-plan-start 继续 │ │ ↓ │ -│ A2 生骨架 → A3 初始化 DB → ▶ A4 生 DB 设计 → A5 生下游文档│ +│ A2 生成骨架 → A3 初始化 DB → ▶ A4 生成 DB 设计 → A5 生成下游文档│ │ ↓ │ │ 规划阶段到此结束 │ └──────────────────────────────────────────────────────┘ @@ -55,7 +55,7 @@ $MYSQL_CMD -e "SELECT table_name, column_name, referenced_table_name, referenced $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;" ``` -将结果解析为结构化列表(内存中)。**不把查询结果完整写入会话上下文**——只保留表名 + 字段名 + 关键元信息。 +在内存中将结果解析为结构化列表,**只保留表名、字段名与关键元信息,不把查询结果完整写入会话上下文**。 ### B. 生成 docs/03 @@ -84,7 +84,7 @@ $MYSQL_CMD -e "SELECT table_name, index_name, GROUP_CONCAT(column_name ORDER BY 3. 比对: - REQ 提到但 docs/03 没有的表 → 报错停下(schema 与需求不一致;请确认是 REQ 理解错误还是需要新增 migration) - docs/03 有但没 REQ 引用 → 警告但不停下(可能是未使用表) -4. 用 `Grep` 搜 `TBD(A4 自动补)` 在 `docs/01-需求清单/*.md`:应 0 命中(A4 已把所有 schema_refs 回填完);若仍有,打印残留 REQ 清单并停下。 +4. 用 `Grep` 在 `docs/01-需求清单/*.md` 中搜索 `TBD(A4 自动补)`:应 0 命中(A4 已把所有 schema_refs 回填完);若仍有,打印残留 REQ 清单并停下。 ### E. 勾选 docs/08 进度 + 进入 A5 @@ -100,7 +100,7 @@ $MYSQL_CMD -e "SELECT table_name, index_name, GROUP_CONCAT(column_name ORDER BY ## 不变量 -- REQ 卡片的 `依赖接口` 字段不在此处填充,留给 A5 erp-downstream-gen(它会先生成 docs/05 API 契约,再按 `TBD(A5 自动补)` 回填)。 +- REQ 卡片的 `依赖接口` 字段不在此处填充,留给 A5 的 `erp-downstream-gen` 先生成 docs/05 API 契约后按 `TBD(A5 自动补)` 回填。 ## 参考 diff --git a/skills/plan/erp-db-init/SKILL.md b/skills/plan/erp-db-init/SKILL.md index b9a9cf7..4fac7e9 100644 --- a/skills/plan/erp-db-init/SKILL.md +++ b/skills/plan/erp-db-init/SKILL.md @@ -21,9 +21,9 @@ allowed-tools: Read Write Edit Glob Skill Bash(mkdir *) Bash(mysql *) Bash(mysql │ │ │ A0 初始化项目 → A1 锁范围(REQ 卡片) │ │ ↓ │ -│ ⏸ 等你审阅 REQ,重跑 /erp-plan-start 续 │ +│ ⏸ 等你审阅 REQ,重新运行 /erp-plan-start 继续 │ │ ↓ │ -│ A2 生骨架 → ▶ A3 初始化 DB → A4 生 DB 设计 → A5 生下游文档│ +│ A2 生成骨架 → ▶ A3 初始化 DB → A4 生成 DB 设计 → A5 生成下游文档│ │ ↓ │ │ 规划阶段到此结束 │ └──────────────────────────────────────────────────────┘ @@ -131,7 +131,7 @@ rm sql/seed-data.sql.raw 2. 用 `Bash` 执行 `grep -c "INSERT INTO" sql/seed-data.sql` 统计数据行数: - > 0:正常 - - = 0:提示"本地 DB 无数据,seed-data.sql 为空(只有 header 注释);如需测试数据,请在本地 MySQL 插入后重跑 A3",允许继续 + - = 0:提示"本地 DB 无数据,seed-data.sql 为空(只有 header 注释);如需测试数据,请在本地 MySQL 插入后重新运行 A3",允许继续 3. 用 `Edit` 在 `docs/08-模块任务管理.md` 勾选 5 个 checkbox(A3 的 4 个子项 + A3 父项): - ` - [ ] .env.local 凭据验证通过` → `[x]` diff --git a/skills/plan/erp-downstream-gen/SKILL.md b/skills/plan/erp-downstream-gen/SKILL.md index fd7a133..b9ba33a 100644 --- a/skills/plan/erp-downstream-gen/SKILL.md +++ b/skills/plan/erp-downstream-gen/SKILL.md @@ -27,9 +27,9 @@ allowed-tools: Read Write Edit Glob Grep Skill AskUserQuestion Bash(cat *) │ │ │ A0 初始化项目 → A1 锁范围(REQ 卡片) │ │ ↓ │ -│ ⏸ 等你审阅 REQ,重跑 /erp-plan-start 续 │ +│ ⏸ 等你审阅 REQ,重新运行 /erp-plan-start 继续 │ │ ↓ │ -│ A2 生骨架 → A3 初始化 DB → A4 生 DB 设计 → ▶ A5 生下游文档│ +│ A2 生成骨架 → A3 初始化 DB → A4 生成 DB 设计 → ▶ A5 生成下游文档│ │ ↓ │ │ 规划阶段到此结束 │ └──────────────────────────────────────────────────────┘ @@ -37,7 +37,7 @@ allowed-tools: Read Write Edit Glob Grep Skill AskUserQuestion Bash(cat *) ### A. docs/02 — 开发计划(含 REQ 级开发顺序清单,CC 分发权威) -**清单粒度**:每行一个 REQ(功能),不是模块。同一模块的 REQ 必须**连续排列**。 +**清单粒度**:一行一个 REQ,同一模块的 REQ 必须**连续排列**。 1. 构建**模块依赖 DAG**: - docs/03 中的外键(表 A → 表 B ⇒ A 的模块依赖 B 的模块) @@ -83,9 +83,9 @@ allowed-tools: Read Write Edit Glob Grep Skill AskUserQuestion Bash(cat *) docs/08 已由 A0 erp-project-init 创建(含 Plan 进度骨架)。本步骤只往 § 二 追加模块行,**不重写整个文件**。 1. 用 `Read` 读取 `${CLAUDE_SKILL_DIR}/templates/docs-08-module-row-template.md`(单模块 bullet 行模板)。 -2. **按 `module_id` 字母序**对每个模块:渲染一行 bullet(`- ` 开头,无 checkbox),填充 `module_id` / `module_name` / `depends_on` / `path_scopes`(不含 REQ 列表——REQ 级顺序由 docs/02 § 二 权威维护;模块完成信号由 `MR:` 字段 + `glab mr view state` 判定)。 +2. **按 `module_id` 字母序**对每个模块:渲染一行 bullet,填充 `module_id` / `module_name` / `depends_on` / `path_scopes`(不含 REQ 列表——REQ 级顺序以 docs/02 § 二 为准;模块完成信号由 `MR:` 字段 + `glab mr view state` 判定)。 - > 注意:docs/08 § 二 的行序**不决定分发顺序**——分发权威在 docs/02 § 二 REQ 开发顺序清单。本步骤按字母序排只是便于人类肉眼查找。 + > 注意:docs/08 § 二 的行序**不决定分发顺序**——分发以 docs/02 § 二 为准,此处按字母序仅方便查找。 3. 所有模块行拼成一段文本,用 `Edit` 在 `docs/08-模块任务管理.md` 的 `## 二、Coding 阶段(按模块循环)` 标题后插入(定位用下一行注释"(A5 填入后..."作为锚,把模块清单插到该注释之前)。 ### E. docs/10 — 验收清单 @@ -101,13 +101,13 @@ docs/08 已由 A0 erp-project-init 创建(含 Plan 进度骨架)。本步骤 2. **最终占位符扫描**(覆盖 Plan 阶段全部产出:`docs/01-需求清单/*.md` + `docs/02` / `docs/05` / `docs/06` / `docs/10` + `sql/seed-data.sql`): - a. **`TBD` → CC 自动补齐**:`Grep` 搜 `TBD(A4 自动补)` 和 `TBD(A5 自动补)`。有命中则按 A4 / B2 同样逻辑就地补填(A4 查 docs/03 填 `依赖表:`;A5 查 docs/05 按 REQ-ID 填 `依赖接口:`),再 Grep 确认 0 命中;仍残留报错停下。 + a. **`TBD` → CC 自动补齐**:用 `Grep` 搜索 `TBD(A4 自动补)` 和 `TBD(A5 自动补)`。有命中则按 A4 / B2 同样逻辑就地补填(A4 查 docs/03 填 `依赖表:`;A5 查 docs/05 按 REQ-ID 填 `依赖接口:`),再 Grep 确认 0 命中;仍残留报错停下。 b. **`【人工填写:...】` → QA 循环等用户补**(与 A2 erp-skeleton-gen 步骤 E 同风格): 循环执行直到两个条件**同时满足**:(1) 扫描 0 命中;(2) 用户选「继续」 - - **b.1 扫描**:用 `Grep` 在上述所有文件中搜 `【人工填写:`,得命中数 N 和残留位置清单(`<文件:行号> — <行内容摘要>`) + - **b.1 扫描**:用 `Grep` 在上述所有文件中搜索 `【人工填写:`,得到命中数 N 和残留位置清单(`<文件:行号> — <行内容摘要>`) - **b.2 打印汇总横幅**: ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -122,18 +122,18 @@ docs/08 已由 A0 erp-project-init 创建(含 Plan 进度骨架)。本步骤 填完后 → 回来选「继续」放行完成 Plan ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` - - **b.3 弹 QA**:用 `AskUserQuestion` 询问: + - **b.3 弹出 QA**:用 `AskUserQuestion` 询问: - **question**: `最终占位符补填完毕?` - **options** (每项为对象): - `{"label": "继续", "description": "放行完成 Plan 阶段"}` - `{"label": "有疑问想先沟通", "description": "需要讨论或修改"}` - **b.4 路由**: - - 选「有疑问想先沟通」→ 回答用户问题后**回 b.1 重扫** - - 选「继续」→ **回 b.1 重扫验证**: - - 新 N = 0 → 进步骤 3 - - 新 N > 0 → 用户以为填完其实还有残留,回 b.2 打印新横幅 + 再弹 QA + - 选「有疑问想先沟通」→ 回答用户问题后**回 b.1 重新扫描** + - 选「继续」→ **回 b.1 重新扫描验证**: + - 新 N = 0 → 进入步骤 3 + - 新 N > 0 → 用户以为填完其实还有残留,回 b.2 打印新横幅并再次弹出 QA - 关键:**每次弹 QA 前都重扫一次**,用户看到的 N 始终是最新的;只有 N = 0 且选「继续」才放行。 + 关键:**每次弹出 QA 前都重新扫描一次**,用户看到的 N 始终是最新的;只有 N = 0 且选「继续」才放行。 3. 用 `Edit` 在 `docs/08-模块任务管理.md` 勾选 7 个 checkbox(A5 的 6 个子项 + A5 父项): - ` - [ ] docs/02 开发计划已生成` → `[x]` @@ -154,8 +154,12 @@ docs/08 已由 A0 erp-project-init 创建(含 Plan 进度骨架)。本步骤 所有规划文档已就绪,docs/08 § 一 全部勾选。 - 下一步由你显式触发: - 运行 /erp-workflow:erp-coding-start 进入 B 阶段模块循环 + ⚠️ 进入 B 阶段前必须完成: + 1. 人工通读 docs/01~10 + CLAUDE.md + sql/migrations/V1 + 各 scripts/* + 2. 把全部 Plan 产物 commit 到 main 分支: + git add -A && git commit -m "chore: plan phase A0~A5 done" + 3. 建 Plan MR 提交团队审核,合并后 main 成为 B 阶段每个模块分支的基线 + 4. MR 合并后再运行 /erp-workflow:erp-coding-start 进入 B 阶段 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` diff --git a/skills/plan/erp-downstream-gen/templates/docs-02-template.md b/skills/plan/erp-downstream-gen/templates/docs-02-template.md index 4f66854..7372249 100644 --- a/skills/plan/erp-downstream-gen/templates/docs-02-template.md +++ b/skills/plan/erp-downstream-gen/templates/docs-02-template.md @@ -10,7 +10,7 @@ ## 二、开发顺序清单(CC 分发权威) -> 本清单由 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 判定。 +> 本清单由 A5 `erp-downstream-gen` 一次性生成。**每行是一个 REQ**,不是模块。CC 按表格行序从上到下扫描,对每个 REQ 所属模块查 `docs/08 § 二` 的 `MR:` 字段 + `glab mr view state`:`merged` 跳过,其他(`—` / opened / closed / 查不到)选为当前模块;`erp-module-start` 会把该模块的所有 REQ 一次做完。 > > **约束**:同一模块的所有 REQ 必须**连续排列**。允许打破依赖拓扑(如环依赖、业务必须先做),但必须在「备注」列写明原因。 diff --git a/skills/plan/erp-project-init/SKILL.md b/skills/plan/erp-project-init/SKILL.md index 8dfd4fb..fdd1226 100644 --- a/skills/plan/erp-project-init/SKILL.md +++ b/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 │ │ │ ▶ A0 初始化项目 → A1 锁范围(REQ 卡片) │ │ ↓ │ -│ ⏸ 等你审阅 REQ,重跑 /erp-plan-start 续 │ +│ ⏸ 等你审阅 REQ,重新运行 /erp-plan-start 继续 │ │ ↓ │ -│ A2 生骨架 → A3 初始化 DB → A4 生 DB 设计 → A5 生下游文档│ +│ A2 生成骨架 → A3 初始化 DB → A4 生成 DB 设计 → A5 生成下游文档│ │ ↓ │ │ 规划阶段到此结束 │ └──────────────────────────────────────────────────────┘ @@ -46,7 +46,7 @@ done 2. 根据当前系统选最合适的包管理器安装 mysql 客户端;若需要 sudo 但 CC 没有权限,打印手动安装命令让用户执行 3. 装完后,把必要的 bin 路径加入本次会话 PATH(如 macOS 的 keg-only 路径) 4. 向用户提示如何把路径永久写入 shell 启动脚本 -5. 重新跑开头的 `command -v` 循环验证;仍缺失 → 打印错误并停下,等用户手动解决后重跑入口 +5. 重新执行开头的 `command -v` 循环验证;仍缺失 → 打印错误并停下,等用户手动解决后重新运行入口 ### B. 幂等复制模板文件 @@ -59,7 +59,7 @@ cp -n "${CLAUDE_SKILL_DIR}/templates/docs-01-readme-template.md" docs/01-需求 cp -n "${CLAUDE_SKILL_DIR}/templates/docs-08-initial-template.md" docs/08-模块任务管理.md ``` -故障恢复场景:如果用户之前 init 跑一半中断(CLAUDE.md 已存在但 docs/08 缺失),`cp -n` 会保留 CLAUDE.md 原样,只补齐 docs/08。 +故障恢复场景:如果用户上一次初始化中途中断(CLAUDE.md 已存在但 docs/08 缺失),`cp -n` 会保留 CLAUDE.md 原样,只补齐 docs/08。 ### C. 初始化 Git(如尚未初始化) diff --git a/skills/plan/erp-project-init/templates/CLAUDE-template.md b/skills/plan/erp-project-init/templates/CLAUDE-template.md index 7be104a..8a337b0 100644 --- a/skills/plan/erp-project-init/templates/CLAUDE-template.md +++ b/skills/plan/erp-project-init/templates/CLAUDE-template.md @@ -15,7 +15,7 @@ ## ✅ 模块完成判定规则 -`docs/08-模块任务管理.md § 二` 是**模块元数据表**——每个模块一行 bullet(无 checkbox),记录依赖 / 路径 / MR iid。**模块完成由 `MR:` 字段 + `glab mr view state=merged` 判定**,不用 checkbox 表达进度。 +`docs/08-模块任务管理.md § 二` 是**模块元数据表**——每个模块一行 bullet,记录依赖 / 路径 / MR iid。**模块完成由 `MR:` 字段 + `glab mr view state=merged` 判定**。 ### 规则定义 @@ -34,14 +34,14 @@ | `MR:` 字段 | `glab mr view state` | 含义 | 你(Claude Code)的行为 | |---|---|---|---| -| `—` | — | 模块未开始(未建 MR) | ✅ 开始本模块开发 | +| `—` | — | 模块未开始(未创建 MR) | ✅ 开始本模块开发 | | `!` | `opened` / `closed` | 模块开发中 / 打回 | ✅ 继续推进该模块 | | `!` | `merged` | 模块**已完成** | 🟢 进入下一未完成模块 | ### 工作流规则 - **开发顺序权威在 `docs/02-开发计划.md § 二 开发顺序清单`**,不是 `docs/08 § 二` 的物理行序 -- **下一个要做的模块** = `docs/02 § 二` 清单中**第一个所属模块 MR 状态非 merged 的 REQ** 的 `module_id`(由 `erp-coding-start` 步骤 3 扫 `docs/08` 的 `MR:` 字段 + `glab mr view` 判定) +- **下一个要做的模块** = `docs/02 § 二` 清单中**第一个所属模块 MR 状态非 merged 的 REQ** 的 `module_id`(由 `erp-coding-start` 步骤 3 扫描 `docs/08` 的 `MR:` 字段 + `glab mr view` 判定) - `docs/02 § 二` 清单由 A5 `erp-downstream-gen` 生成阶段一次性确定(会交互询问业务偏好),之后通常不改;若开发中途需要调整顺序,重新触发 A5 生成阶段而非直接编辑文件 - **已完成模块**(`MR: !` + `glab mr view state=merged`):**默认不改**(不是禁止,是已交付无需改) - 如果在当前模块开发中发现某个**已完成模块**(MR merged)有 bug: @@ -53,21 +53,21 @@ ``` 1. 对每个 REQ 跑完整功能循环: - brainstorm → plan → TDD(红绿循环,每步 commit)→ verify(子会话跑 REQ 级测试)→ 自审 + brainstorm → plan → TDD(红绿循环,每步 commit)→ verify(子会话执行 REQ 级测试)→ 自审 2. 所有 REQ 完成后,erp-local-test-gate 派子会话按顺序跑: a. schema 一致性检查(erp-local-test-gate 步骤 1 内联,schema 未漂移)+ 占位符扫描 - b. scripts/test.sh 全套:build → lint → **unit + integration(全量重跑当前模块所有 - REQ 的功能测试 + 所有已勾模块的回归测试)** → e2e + b. scripts/test.sh 全套:build → lint → **unit + integration(全量重新运行当前模块所有 + REQ 的功能测试 + 所有已完成模块的回归测试)** → e2e 任一失败停下修复再来 3. 测试全绿 → erp-module-report 输出《模块完成报告》 -4. 自动 git push(.githooks/pre-push 会再跑一遍 scripts/test.sh 作为硬闸门) +4. 自动 git push(.githooks/pre-push 会再执行一遍 scripts/test.sh 作为硬闸门) + glab mr create,报告嵌入 MR 描述 5. 人工 review MR → Approve + Merge(人工动作,唯一人工介入点) -6. 下次用户跑 `/erp-workflow:erp-coding-start` 时,入口自动检测到本模块 `glab mr view state=merged` → `git checkout main && git pull --ff-only` 同步远程 → 扫下一模块派发 -7. 你**不需要**手工 Edit docs/08(模块元数据不变;下次 coding-start 自动扫 MR state 判完成) +6. 下次用户运行 `/erp-workflow:erp-coding-start` 时,入口自动检测到本模块 `glab mr view state=merged` → `git checkout main && git pull --ff-only` 同步远程 → 扫描下一模块并派发 +7. 你**不需要**手工 Edit docs/08(模块元数据不变;下次 coding-start 自动扫描 MR state 判定是否完成) ``` -> 两道测试闸门:功能级(`erp-feature-tdd` + `erp-feature-verify`,每 REQ 一遍)+ 模块级(`erp-local-test-gate` + pre-push hook,每模块一遍)。所有测试/验证都派到子会话跑,主会话只收结构化结论。 +> 两道测试闸门:功能级(`erp-feature-tdd` + `erp-feature-verify`,每 REQ 一遍)+ 模块级(`erp-local-test-gate` + pre-push hook,每模块一遍)。所有测试/验证都派发到子会话执行,主会话只接收结构化结论。 ### 模块完成报告 @@ -96,10 +96,10 @@ 两层嵌套循环的详细步骤**全部固化到 skills**,CLAUDE.md 不展开。入口调 `/erp-workflow:erp-coding-start`,自动分发: -- **模块循环(外层,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: !` 到 docs/08 + commit → 再 push)→ 人工 Approve+Merge → 下次 `/erp-workflow:erp-coding-start` 扫到本模块 `glab mr view merged` → `git pull --ff-only main` → 推进下一模块 +- **模块循环(外层,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: !` 到 docs/08 并 commit → 再次 push)→ 人工 Approve+Merge → 下次运行 `/erp-workflow:erp-coding-start` 扫描到本模块 `glab mr view merged` → `git pull --ff-only main` → 推进下一模块 - **功能循环(内层,Layer 3,每个 REQ-XXX-NNN 走一遍)** → `erp-feature-brainstorm` → `erp-feature-plan` → `erp-feature-tdd` → `erp-feature-verify` → `erp-feature-review` -**本地测试闸门**: `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。 +**本地测试闸门**: `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。 > 占位符扫描 / schema 一致性校验都不在此闸门:前者在 A 阶段 skill 生成期完成;schema 演化通过 Flyway migration 保证一致(每次测试启动,Spring Boot 的 Flyway 从空库按序 apply V1~Vn,不存在"漂移"概念)。hook 产生的 `TBD(CC 补)` 存根由 CC 自主调 `erp-cross-module-log` 补齐,并在 `erp-module-report` § ⑦ 硬验收(非人工填写)。 @@ -202,8 +202,8 @@ refactor(common): 统一响应格式包装 ## 🧪 自测要求 -- 所有测试与验证(`scripts/test.sh` / `mvn test` / `pnpm test` / DB 测试集 diff 等)**一律派发到全新子会话 via `Agent` 执行**,主会话只接收结构化结论(命令 / 退出码 / 通过数 / 失败项 / 关键 stdout ≤30 行)。不在主会话直跑测试。 -- 由 `erp-feature-verify`(功能级)+ `erp-local-test-gate`(模块级)两道 skill 统一承接。前者每个 REQ 跑一次,后者模块闸门跑一次。 +- 所有测试与验证(`scripts/test.sh` / `mvn test` / `pnpm test` / DB 测试集 diff 等)**一律派发到全新子会话 via `Agent` 执行**,主会话只接收结构化结论(命令 / 退出码 / 通过数 / 失败项 / 关键 stdout ≤30 行)。不在主会话直接执行测试。 +- 由 `erp-feature-verify`(功能级)+ `erp-local-test-gate`(模块级)两道 skill 统一承接。前者每个 REQ 执行一次,后者模块闸门执行一次。 - 声称"完成"前必须贴出子会话返回的 evidence(模板:由 erp-feature-verify skill 持有)。 --- diff --git a/skills/plan/erp-project-init/templates/docs-08-initial-template.md b/skills/plan/erp-project-init/templates/docs-08-initial-template.md index 3b9a069..c286f69 100644 --- a/skills/plan/erp-project-init/templates/docs-08-initial-template.md +++ b/skills/plan/erp-project-init/templates/docs-08-initial-template.md @@ -2,7 +2,7 @@ > 全流程进度跟踪。CC 每完成一项产出就勾选一项。 > - **§ 一 Plan(A0~A5)**:`erp-plan-start` 找第一个未勾 A 子项分发到对应 skill -> - **§ 二 Coding(模块)**:分发权威在 `docs/02-开发计划.md § 二 开发顺序清单`;`erp-coding-start` 按 docs/02 顺序扫,对每个 REQ 所属模块查本 § 二的 `MR:` 字段 + `glab mr view state`,找第一个非 merged 模块分发。本 § 二每模块是纯 bullet(无 checkbox),§ 二行序无语义 +> - **§ 二 Coding(模块)**:分发以 `docs/02-开发计划.md § 二 开发顺序清单` 为准;`erp-coding-start` 按 docs/02 顺序扫描,对每个 REQ 所属模块查询本 § 二的 `MR:` 字段 + `glab mr view state`,找第一个非 merged 模块分发。本 § 二 行序无语义,仅作模块元数据表 ## 一、Plan 阶段(一次性) @@ -41,7 +41,7 @@ ## 二、Coding 阶段(按模块循环) -(A5 填入后,每个模块一行 bullet(`- ` 开头,无 checkbox)。每个模块的 `MR:` 字段在 `—` 和 `!` 之间变化,完成由 `glab mr view state=merged` 判定。`erp-coding-start` 每次跑时按 docs/02 REQ 序扫描每模块的 MR state 决定派发。) +(A5 填入后,每个模块一行 bullet。每个模块的 `MR:` 字段在 `—` 和 `!` 之间变化,完成由 `glab mr view state=merged` 判定。`erp-coding-start` 每次按 docs/02 REQ 序扫每模块的 MR state 决定派发。) +