--- 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。派发前自动探测默认分支(main / master)并 git checkout + 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 *) Bash(git symbolic-ref *) Bash(sed *) --- **所有输出必须使用中文。** B 阶段(Coding)的入口分发器。职责:**验证 Plan 已完成 → 按 docs/02 § 二 REQ 序 + MR state 定位当前模块 → 切回默认分支并同步远程 → 派发 erp-module-start**。不直接生成任何文件。开发顺序以 `docs/02 § 二` 为准;完成判定以 `docs/08 条目的 MR: 字段 + glab mr view state` 为准。默认分支(`main` 或 `master`)在步骤 4 自动探测,不硬编码。 ## 执行步骤 ### 步骤 1:确认 docs/08 存在 用 `Glob` 检查 `docs/08-模块任务管理.md`。 - 不存在 → 打印"⚠️ 项目尚未初始化,请先运行 `/erp-workflow:erp-plan-start`"并停下。 ### 步骤 2:Plan 完成性检查 用 `Grep` 在 `docs/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: !` → `Bash`: `glab mr view -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:` 字段值(`—` / `!-opened` / `!-closed` / `!-查不到`,用于步骤 5 横幅展示)。 ### 步骤 4:探测默认分支 + 切回并同步远程(准备 module-start 切新分支的干净 base) 4.0 **探测默认分支**: ```bash DEFAULT_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's|refs/remotes/origin/||') if [ -z "$DEFAULT_BRANCH" ]; then # HEAD 未设置,回退:在 main / master 里取第一个实际存在的远程分支 DEFAULT_BRANCH=$(git branch -r --format='%(refname:short)' | grep -E '^origin/(main|master)$' | head -1 | sed 's|^origin/||') fi ``` - `DEFAULT_BRANCH` 为空 → 打印错误并**停下**(既无 `origin/main` 也无 `origin/master`,说明远程未就绪,提示用户先完成 Plan 的首次 push 或 `git remote set-head origin -a` 设置 HEAD)。 4.1 **切回 + 同步**: - `Bash`: `git branch --show-current` → `current_branch`。 - 若 `current_branch != $DEFAULT_BRANCH`: - `Bash`: `git status --porcelain`;非空 → 打印: ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [erp-coding-start] ⚠️ 当前分支 有未提交改动,无法切换到 请手工处理后重新运行 /erp-workflow:erp-coding-start。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` 并**停下**。 - `Bash`: `git checkout "$DEFAULT_BRANCH"`。 - `Bash`: `git pull --ff-only origin "$DEFAULT_BRANCH"`。 - 失败(非 fast-forward / 网络 / 冲突)→ 打印错误横幅: ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [erp-coding-start] ⚠️ 同步 失败 本地 无法 fast-forward 到 remote。请手工处理: git status git log ..origin/ # 远程领先的 commit git log origin/.. # 本地未推的 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-` 回到原分支继续,不会跳到下一模块。 - **每次派发前都 pull 默认分支**:代码同步的同时,也保证 module-start 切出新分支时 base 新鲜。默认分支由步骤 4.0 探测(main 或 master),不硬编码。 ## 参考 - `docs/02-开发计划.md § 二 开发顺序清单`(分发权威) - `docs/08-模块任务管理.md § 二`(模块元数据,含 `MR:` 字段) - `CLAUDE.md`(项目指令) - `erp-plan-start`(姊妹入口,A 阶段)