SKILL.md 6.69 KB

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 最新。 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 并同步远程 → 派发 erp-module-start。不直接生成任何文件。开发顺序以 docs/02 § 二 为准;完成判定以 docs/08 条目的 MR: 字段 + glab mr view state 为准。

执行步骤

步骤 1:确认 docs/08 存在

Glob 检查 docs/08-模块任务管理.md

  • 不存在 → 打印"⚠️ 项目尚未初始化,请先运行 /erp-workflow:erp-plan-start"并停下。

步骤 2:Plan 完成性检查

Grepdocs/08-模块任务管理.md 搜索 ^- \[ \] A[0-5](pattern 可以直接匹配父项未勾的情况;也可以用更宽的 ^[[:space:]]*- \[ \].*A[0-5] 覆盖子项)。

  • 命中任一 A 未勾 → 打印: ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [erp-coding-start] ⚠️ Plan 尚未完成

docs/08 § 一 还有未勾选项,请先运行: /erp-workflow:erp-plan-start

继续 Plan 阶段直到 A5 下游文档生成完成,再回来运行 coding-start。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  **停下**。

- 无命中 → Plan 已完成,进入步骤 3。

### 步骤 3:按 docs/02 REQ 序 + MR state 找当前模块

1. 用 `Read` 读取 `docs/02-开发计划.md` 的 § 二;用 `Grep`(pattern `^\|\s*[0-9]+\s*\|\s*\*\*(REQ-[A-Z0-9]+-[0-9]+)\*\*\s*\|\s*(module_\w+)`,`-n`)抽取所有表格数据行,按行号升序得 `req_order[]`,每项含 `req_id` + `module_id`。
2. 若 `req_order` 为空 → 打印错误并**停下**(与原逻辑相同,略)。
3. **初始化模块完成缓存 `module_merged[module_id → bool]`**(空)。
4. 按序遍历 `req_order[]`:
   - 若 `module_merged[module_id]` 已有缓存:
     - `true` → 跳过本 REQ,继续下一个
     - `false` → `current_module = module_id`,结束遍历,进入步骤 4
   - 未缓存 → 读取 docs/08 § 二 该模块条目的 `  - MR:` 字段:
     - `MR: —` → `module_merged[module_id] = false`;`current_module = module_id`,结束遍历
     - `MR: !<iid>` → `Bash`: `glab mr view <iid> -F json 2>/dev/null`,解析 `.state`:
       - `merged` → `module_merged[module_id] = true`,跳过本 REQ
       - 其他(`opened` / `closed` / 查不到)→ `module_merged[module_id] = false`;`current_module = module_id`,结束遍历
5. 全遍历完仍无命中(所有模块都 merged) → 打印:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [erp-coding-start] ✅ 所有模块已完成

docs/02 § 二 清单中每个 REQ 所属模块的 MR 都已 merged。项目结束。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

   并**停下**。
6. 命中后:记录 `current_module` 的 `MR:` 字段值(`—` / `!<iid>-opened` / `!<iid>-closed` / `!<iid>-查不到`,用于步骤 5 横幅展示)。

### 步骤 4:切回 main + 同步远程(准备 module-start 切新分支的干净 base)

- `Bash`: `git branch --show-current` → `current_branch`。
- 若 `current_branch != main`:
  - `Bash`: `git status --porcelain`;非空 → 打印:
    ```
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
     [erp-coding-start] ⚠️ 当前分支 <current_branch> 有未提交改动,无法切换到 main

     <git status 输出>

     请手工处理后重新运行 /erp-workflow:erp-coding-start。
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ```
    并**停下**。
  - `Bash`: `git checkout main`。
- `Bash`: `git pull --ff-only origin main`。
  - 失败(非 fast-forward / 网络 / 冲突)→ 打印错误横幅:
    ```
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
     [erp-coding-start] ⚠️ 同步 main 失败

     本地 main 无法 fast-forward 到 remote。请手工处理:
       git status
       git log main..origin/main   # 远程领先的 commit
       git log origin/main..main   # 本地未推的 commit
     修复后重新运行 /erp-workflow:erp-coding-start。
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ```
    并**停下**。

### 步骤 5:打印横幅并分发

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [erp-coding-start] 阶段:B 编码 当前模块: MR 状态:<未建 | opened | closed | 查不到> 下一步:invoke erp-module-start ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


然后立即用 `Skill` 工具调用 `erp-module-start`。

> 分发前先调用 `erp-red-flag-check`;命中红旗则停在此不分发。

## 设计要点

- **完成判定直接读取 `MR:` 字段 + `glab mr view state`**:MR 未 merge 前 docs/08 没有任何"已完成"标记;用户提前触发 coding-start 时,步骤 3 扫描到 MR opened 仍会选中当前模块,module-start 会 `git checkout module-<id>` 回到原分支继续,不会跳到下一模块。
- **每次派发前都 pull main**:代码同步的同时,也保证 module-start 切出新分支时 base 新鲜。

## 参考

- `docs/02-开发计划.md § 二 开发顺序清单`(分发权威)
- `docs/08-模块任务管理.md § 二`(模块元数据,含 `MR:` 字段)
- `CLAUDE.md`(项目指令)
- `erp-plan-start`(姊妹入口,A 阶段)