name: coding-start description: B 阶段(Coding)瘦入口。校验 Plan 完成态(docs/08 §一 A0~A5 全勾)并取得 projectRoot 绝对路径后,读取 docs/08 §二/§三 概述模块/前端进度,然后调用 workflows/coding.mjs Workflow 全自动、静默地跑完整个编码阶段(后端+前端功能循环、测试闸、里程碑 tag);git 就绪(默认分支/工作树干净/功能分支创建与合并)由 coding.mjs runBranchSetup 在运行时把守。跑完或 halt 时返回最终状态。本入口不写任何文件、不做编码决策。 user-invocable: true
allowed-tools: Read Glob Workflow Bash(git rev-parse *) Bash(git tag *)
所有输出必须使用中文。
执行步骤
步骤 0:打印 B 阶段流程概览(模型直接输出,不用 cat)
直接向用户输出以下横幅(逐字输出文本本身,不要用任何命令读文件):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[coding-start] B 阶段(Coding)= 一个全自动静默 Workflow
Router → 读 docs/08 + git tag,算出未完成模块
每个模块:
后端功能循环 spec → plan → tdd → verify → review(≤5轮)
后端测试闸 test-gate(RED 自动重试 1 次,仍 RED → halt)
前端骨架占位 router 全量 lazy 路由表 + FeStub 占位(保证中途可构建)
前端功能循环 同一流水线,phase=frontend(FE-NN,限 frontend/);review 仅静态验收,
approve 即打 req-done
前端行为门 阶段级 behavior(整个前端只跑一次:起全栈验「按钮真生效/文字对/样式合规」,
硬问题可 fix→单测复验→重跑门(≤3 轮),green 才进测试闸)
前端测试闸 test-gate(全量回归,兜底行为 fix 引入的回归)
跨模块记录 → 模块报告 → 里程碑(merge --no-ff + milestone/<id> tag)
任一模块 halt → fail-fast 停在该模块,修复后重跑本入口即可续跑
全程无 Q&A:缺值表现为带诊断的 halt,不是对话框。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
步骤 1:确认 docs/08 存在
用 Glob 检查 docs/08-模块任务管理.md。
- 不存在 → 输出「⚠️ 项目尚未初始化,请先运行
/erp-workflow:plan-start」并停下,不启动 Workflow。输出末尾附[ERP-HALT]。
步骤 2:Plan 完成态校验 + 取 projectRoot(HARD GATE)
Read docs/08-模块任务管理.md 校验 Plan 完成态,并取得 projectRoot;任一不满足即拦截、不启动 Workflow。
注:REQ 真实数据 / config 全锁 / docs/04 命令齐 / docs/05+02 已评审等内容闸由
plan-start终结硬闸把守;本步只校验「Plan 完成态(checkbox)」,不重复内容校验。注:git 就绪(在默认分支 / 工作树干净 / 功能分支创建与合并)由 coding.mjs
runBranchSetup在运行时把守——分支已存在则 checkout、不存在则从默认分支新建(与当前所停分支无关),工作树不干净会立即 HALT;续跑点由 Router 从milestone/*tag + docs/08 字段重算,与所在分支无关。故本入口不做 git 就绪预检,只取projectRoot供步骤 4。
-
docs/08 § 一 A0~A5 全部勾选
- 读 § 一 进度表,确认 A0/A1/A2/A3/A4/A5(含各自子项)均为
[x]。 - 任一未勾 → 缺口:
Plan 未完成(<未勾项>)→ 先运行 /erp-workflow:plan-start。
- 读 § 一 进度表,确认 A0/A1/A2/A3/A4/A5(含各自子项)均为
-
取得 projectRoot 绝对路径(取参数,非 gate)
- 用
Bash(git rev-parse --show-toplevel)取仓库根,记录 stdout 作为projectRoot(步骤 4 必须传入;coding.mjs 顶部对相对路径硬 HALT)。 - 命令失败(当前目录不在 git 仓库内)→ 缺口:
无法取得 projectRoot(当前目录不在 git 仓库内)。
- 用
任一缺口 → 输出拦截横幅,逐条列出缺口与回填位置,停下,不启动 Workflow:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[coding-start] ⛔ 未满足进入 B 阶段的前置条件
<逐条列出缺口,格式:[项] 缺口描述 → 回填/处理位置>
例:[Plan 进度] A5 下游文档生成 未勾 → 先运行 /erp-workflow:plan-start
处理后重新运行 /erp-workflow:coding-start。
[ERP-HALT] 前置条件不满足,已停下。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
步骤 3:概述进度(信息提要)
仅当步骤 2 的 § 一 校验通过后,Read docs/08 § 二(后端模块元数据 + 里程碑: 字段)与 § 三(前端阶段 整体里程碑: 字段),并用 Bash(git tag -l "milestone/*") 读取本地里程碑 tag,概述:
- 后端:每个模块的
里程碑:是否已是milestone/<module_id>(已完成)还是—(待跑)。 - 前端:
§ 三 整体里程碑:是否已是milestone/frontend-phase(已完成)还是—(待跑)。
向用户简述「已完成 N 个模块 / 待跑 M 个模块;前端阶段:已完成 / 待跑」。
步骤 3.5:复盘上次运行(续跑 handoff,若有)
用 Glob 检查 docs/superpowers/RESUME.md(由 coding.mjs 在每次 halt / 全部完成时追加,最新条目在末尾):
- 不存在 → 跳过本步(首次运行 / 尚无记录)。
- 存在 →
Read其末尾最新条目,向用户复述上次运行状态,帮助决定是否直接重跑:- 末尾是
## ⛔ HALT→ 提示「上次在模块<id>halt,原因:<reason>;待跑模块:<list>;上次做过的自主默认假设见该条目(重跑前可复核)」。 - 末尾是
## ✅ 全部完成→ 提示「上次已全部完成;本次重跑通常无新增模块(除非用 /add-req 加了增量需求)」。
- 末尾是
- RESUME.md 仅作定向参考与人工复盘,进度真值仍以 git tag(步骤 3)为准;不因它阻断启动。
步骤 4:启动 Coding Workflow
用 Workflow 工具调用编码编排脚本。projectRoot 必须使用步骤 2 里 git rev-parse --show-toplevel 得到的绝对路径(coding.mjs 顶部对相对路径硬校验,传 . 会立即 halt)。
Workflow({
scriptPath: "${CLAUDE_PLUGIN_ROOT}/workflows/coding.mjs",
args: {
projectRoot: "<git rev-parse --show-toplevel 的 stdout>",
pluginRoot: "${CLAUDE_PLUGIN_ROOT}",
parallel: { modules: true, maxWidth: 3, features: true }
}
})
pluginRoot供 coding.mjs 调用插件lib/req-ledger.mjs在首跑时自动建立需求台账基线(P1#3,使日后/add-req能识别增量、免空跑);缺省则该增强静默跳过。
parallel是模块级并行总开关:modules: true时 coding.mjs 先跑调度器(LLM 只输出模块间依赖边,JS 做确定性拓扑波次),同波次 ≥2 个后端模块各自在 lane worktree + lane 测试库 + 专属 migration 版本段内并行推进;任何调度/隔离环节失败一律 fail-open 降级串行,绝不因并行机制 halt。逃生口:改传parallel: { modules: false }(或整个不传parallel)即完全回退现行串行路径。
features: true(feature 级并行,2026-07-22 开启):同一后端模块内多个 REQ 的 tdd→verify→review→fix 段并发跑。执行序见featureBatchRun——① spec+plan 仍串行在模块树产出(plan 要 Grep 现有代码定位文件边界)→ ② 逐 REQ 提取PLAN_FACTS(改哪些文件 / 是否动 schema)→ ③ JS 确定性分批:批内两两文件集不相交 ∧ 全部不改 schema ∧ 批宽 ≤featureMaxWidth(缺省 2,可另传)。准入的灵魂是「LLM 提议、JS 验证」——文件集相交与否可确定性计算,不信 LLM 单方判断。隔离三前提:feature worktree(独立 index)+ 准入排除 schema 改动(不撞V<n>)+ feature 专属测试库;tdd/verify 不起栈不占固定端口,故无需 stackLock——这也是它只收窄到后端 REQ、不含前端的原因(FE 的 e2e 要打穿 vite/playwright/后端三层端口配置,收益比不成立)。全链路 fail-open:facts 提取失败 / 准入不过 / lane 建失败一律退回串行链,绝不因并行机制新增 halt 点;跨批保持 docs/02 原序。逃生口:改传features: false(或删掉该键)即回退逐 REQ 串行。
frontendOverlap(前端 jsdom-only 重叠)同样刻意不传——维持缺省关闭。开启(parallel: { modules: true, maxWidth: 3, frontendOverlap: true })时,前端不依赖后端的部分(骨架 + spec/plan + tdd 的 jsdom 任务 + vitest verify)在独立前端 worktree 与后端波次并发跑,打中间 tagfe-code-done/<FE>;后端全部 done 后才 reconcile(合 default→frontend-phase)并跑 phase2(e2e 任务 + review + req-done + 行为门 + 测试闸 + 里程碑,主根全栈)。重叠期前端无栈/无固定端口/无 DB,补 8/9/10 不变量与端口/lane 安全全部保住。风险:前端对 docs/05 契约写代码,后端编码期若偏离契约,错误拖到 phase2 e2e/行为门才暴露、需返工——故列为显式评估开关,收益/正确性评估通过后才在此处开启(设计:docs/superpowers/plans/2026-06-15-frontend-overlap-jsdom.md)。缺省关 / phase1 失败 / 后端未全 done 一律回退现行终波路径,绝不新增 halt 点。
步骤 5:告知用户 Workflow 已启动
启动后向用户输出:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[coding-start] ✅ Coding Workflow 已启动
进度概述:<步骤 3 概述,如「待跑 3 模块 + 前端阶段」>
已程序化校验:
✓ Plan 完成态:docs/08 §一 A0~A5 全勾
✓ 已取得 projectRoot(仓库根绝对路径),传入 Workflow
Workflow 将按依赖波次全自动、静默推进,跑完所有模块或在某模块
halt(测试闸持续 RED / review 5 轮未过 / 缺值阻塞等)时返回最终状态。
halt 后请按诊断修复,再重新运行 /erp-workflow:coding-start 续跑
(git 分支由 coding.mjs 自行处理:残留功能分支直接续用、新模块从默认分支建,
无需手动 checkout;但工作树不干净会在运行时 HALT,故重跑前请先清理工作树)。
[ERP-HALT] Workflow 已转入后台自治,主循环就此停下等待其完成通知。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
横幅末行的终止标记供 Stop 钩子(
hooks/scripts/auto-continue.sh)识别:Workflow 一旦转后台,主循环应停下等通知,不被自动续跑机制误推去重启 coding-start。逐 REQ 手动推进的会话则无此标记,由 Stop 钩子自动续跑,直到打印终止标记(全部完成 / 硬护栏)才停。
步骤 6:Workflow 完成/halt 通知返回后——先输出最终状态横幅
Workflow 的 task-notification 返回本会话后,第一段输出必须是下面的横幅(之后才允许做任何诊断动作——读 RESUME.md、读 output 文件、查代码都排在横幅之后),保证用户在终端第一眼看到 halt 原因全文:
- 结果含
status:'halted'模块:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[coding-start] ⛔ Coding Workflow HALT
模块:<halted.module>
原因:<halted.reason 全文,不许截断或转述>
已完成:<status done 的模块列表 或 无>
未跑(pending):<pending 列表 或 无>
下一步:按原因修复后重跑 /erp-workflow:coding-start(Router 按 tag 续跑)。
[ERP-HALT] 已停在硬护栏点。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- 全部完成:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[coding-start] ✅ Coding 阶段全部完成
完成模块:<列表>
自主默认决策:<条数> 条(详见 docs/superpowers/RESUME.md 末尾条目,建议复核)
[ERP-HALT] 编码阶段结束。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
本 skill 到此结束,不调用任何下游 skill。
参考
-
docs/08-模块任务管理.md § 一(A0~A5 Plan 进度,步骤 2 读取) -
docs/08-模块任务管理.md § 二(后端模块元数据 + 里程碑字段,步骤 3 读取) -
docs/08-模块任务管理.md § 三(前端阶段整体里程碑,步骤 3 读取) -
docs/superpowers/RESUME.md(续跑 handoff:上次 halt 原因 / 自主假设 / 待跑模块,步骤 3.5 复盘;由 coding.mjs 维护) -
workflows/coding.mjs(B 阶段编排脚本,步骤 4 启动) -
plan-start(姊妹入口,A 阶段) -
CLAUDE.md(项目指令)