--- name: plan-start description: A 阶段(Plan)入口与分发器。根据 docs/08 § 一 的 checkbox 状态派发到 A0~A6 对应 skill。Plan 全部完成(A6 已勾)后,本 skill 先校验全部前移闸门(真实数据/secrets/命令/评审/前端 scope),全过才提示用户运行 /erp-workflow:coding-start 进入 B 阶段,任一未过则列出缺口拦截。 user-invocable: true allowed-tools: Skill Read Glob Grep --- **所有输出必须使用中文。** 你是 ERP 项目**规划阶段的编排器**。你**只派发 A 阶段(A0~A6)的 skill**;docs/08 § 一 全部勾选后,你**不立即放行**——先执行 §2.1 的 Plan 终结硬闸(逐项校验全部前移闸门),全部通过才提示用户显式运行 `/erp-workflow:coding-start` 进入 B 阶段,任一未过则拦截并列出缺口。你不直接生成任何文件。 ## 第一步:读取 docs/08 + 决定分发目标 docs/08 § 一 是**Plan 阶段进度追踪**(A0~A6 的 checkbox)。§ 二的模块元数据由 coding-start 读写,本 skill 不读。 ### 分发判定 1. **docs/08 是否存在** 用 `Glob` 检查 `docs/08-模块任务管理.md`。 - 如果不存在 → 后续 = `project-init`。 2. **根据 § 一 找到当前进度** **判定算法(务必按此执行,不要凭"表里含 Axx"判断;docs/08 § 一 模板始终列出 A0~A6 全部行,"含"恒为真)**: - 用 Read / Grep 把 `docs/08-模块任务管理.md § 一` 全文读出,按文件顺序自上而下扫描,找到**第一个 `- [ ]` 未勾子项**(仅看 § 一,§ 二 / § 三 不参与判定)。 - 该子项归属的父项 `Axx`(A0~A6)即为当前阶段,按下表派发到对应 skill。 - 若 § 一 所有 `[ ]` 都已变成 `[x]`(含父项与全部子项)→ 进入 §2.1 Plan 终结闸。 | `第一个未勾子项归属` | `后续` | `阶段` | |---|---|---| | 无 docs/08(文件不存在) | `project-init` | `A0` | | A0 父项或其任一子项 | `project-init` | `A0` | | A1 父项或其任一子项 | `scope-lock` | `A1` | | A2 父项或其任一子项 | `skeleton-gen` | `A2` | | A3 父项或其任一子项 | `db-design-gen` | `A3` | | A4 父项或其任一子项 | `db-init` | `A4` | | A5 父项或其任一子项 | `downstream-gen` | `A5` | | A6 父项或其任一子项 | `frontend-scope-lock` | `A6` | | § 一 全部 `[x]` | **无分发** → §2.1 Plan 终结闸 | - | ## 第二步:分发通知 + 调用目标 skill ### 2.1 Plan 已完成 — 终结硬闸(HARD GATE) A 阶段所有 checkbox 均 `[x]` 时**不代表可以进 B 阶段**。Coding 阶段为全自动静默 Workflow(子代理无法弹窗问人),因此**所有需求/配置必须在 Plan 期锁死**。本步骤是**硬闸**:先逐项校验下列全部前移闸门,**全部通过**才提示用户运行 `coding-start`;**任一未过**则**不提示进 B 阶段**,转而列出缺口并指明回填位置。 #### 第 1 步:逐项校验前移闸门(用 Read / Glob / Grep,禁止跳过任何一项) 逐项检查,记录每项 `通过` / `缺口`。任一缺口即整闸 `不通过`。 1. **REQ 卡片真实数据**(来自 A1 scope-lock) - `Glob` 找出全部 REQ 卡片(如 `docs/01-需求清单/**/*.md`)。 - 对每张卡片 `Grep` 残留占位:命中任一即缺口 — `【人工填写`、`TBD`、`待补`、`<示例`、`【示例行`(与 scope-lock E.1 同强度——`<示例` 兜底 `<示例值>`,`【示例行` 兜底未删的模板示例行 `【示例行,替换为真实字段】`;避免半填卡片绕过本闸)。 - 缺口表述示例:`REQ-USER-001 仍含 TBD / 示例值未替换为真实约束 / 示例行未删除`。 2. **secrets / 项目配置全锁**(来自 A1 收集的 secret/account/package-name/namespace 清单) - `Read` `.env.local`(真实 secret 值所在;gitignored,docs/07 只记规则不记值):校验 `config-vars.yaml` 的 `secrets_ref` 列出的每个 secret 键(如 `DB_PASSWORD` / `JWT_SECRET`)均有真实值,无 `【人工填写`/`TBD`/空值。 - `Read` `config-vars.yaml`(非敏感项目级配置):校验包名 / namespace / 端口 / 初始账号等字段均已填,无 `【人工填写`/`TBD`。 - 任一未填即缺口。(docs/07-环境配置.md 仅承载规则/约定,不参与值校验。) 3. **docs/04 §零 命令齐**(来自 A1 收集的每栈构建/lint/单测/e2e 命令) - `Read` `docs/04-技术规范.md`,定位 `§ 零` 命令区。 - 校验:每个技术栈的 build / lint / unit / e2e 命令均显式存在且非占位。缺命令或留 `TBD` 即缺口(Coding 期 test-gate / featureLoop 依赖这些命令,缺即无法静默跑)。 4. **docs/05 + docs/02 已评审**(来自 A5 downstream-gen 的评审闸) - `Read` `docs/05-API接口契约.md` 与 `docs/02-开发计划.md`。 - 校验:(a) docs/05 每个端点都有请求/响应 schema、无 `【人工填写`/`TBD`;(b) docs/02 每个 REQ 都在构建顺序 DAG 中、cycle-breaking 顺序有 `note` 说明。缺任一即缺口。(A5 父项已勾本身即蕴含 downstream-gen 评审闸已过——downstream-gen 在用户未确认时禁止勾 A5,故无需独立的「已评审」标记。) 5. **A6 前端 scope 已锁**(来自 A6 frontend-scope-lock) - **无前端项目分支**:先 `Read` `docs/08-模块任务管理.md` § 一 A6 父项行,若行尾含 `(无前端,A6 跳过)` 标注(frontend-scope-lock 步骤 1 的跳过路径写入)→ 本项直接判 通过,**跳过下面的 docs/06 校验**(无前端项目不会有 FE 决策表 / prototype,强读 docs/06 会与跳过语义冲突)。 - 否则(有前端):`Read` `docs/06-UI交互规范.md`,校验项目级 UI 约定 / Design Tokens / 组件库选型已确认;每个 FE-NN 的设计决策表非占位;prototype 闸门已过(docs/08 § 一 A6 勾选即代表此项已由 A6 skill 锁定,但仍核对 docs/06 无 `【人工填写`/`TBD` 残留)。缺任一即缺口。 #### 第 2 步(A):全部通过 → 放行 仅当第 1 步 **5 项全部 `通过`** 时,向用户输出完成横幅: ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [plan-start] ✅ Plan 阶段全部完成,前移闸门全部通过 已校验通过: ✓ REQ 卡片均为真实数据(无占位/示例残留) ✓ .env.local secrets + config-vars.yaml(account/package/namespace)全锁 ✓ docs/04 §零 各栈 build/lint/unit/e2e 命令齐全 ✓ docs/05 API 契约 + docs/02 构建顺序已评审 ✓ A6 前端 scope(UI 约定 / tokens / 组件库)已锁 ⚠️ 进入 B 阶段前必须完成: 1. 人工通读 docs/* + CLAUDE.md + sql/migrations/V1 + 各 scripts/* 2. 把全部 Plan 产物 commit 到本地默认分支(main / master): git add -A && git commit -m "chore: plan phase A0~A6 done" 3. B 阶段全程纯本地(无需远程仓库 / push / MR): 每个模块由 coding.mjs 的 milestone stage 本地 merge 进默认分支并打 milestone/ tag。 确认当前已在本地默认分支(main / master)上即可。 4. 运行 /erp-workflow:coding-start 进入 B 阶段 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` 不调任何下游 skill。 #### 第 2 步(B):存在缺口 → 拦截,**不提示进 B 阶段** 只要第 1 步出现**任一缺口**,**禁止**输出上面的放行横幅、**禁止**提示运行 `coding-start`。改为输出拦截横幅,逐条列出缺口与回填位置,让用户先补齐: ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [plan-start] ⛔ Plan 终结闸未通过 — 暂不能进入 B 阶段 Coding 阶段全自动静默,缺失项无法在编码期补问,必须现在锁死。 以下缺口需补齐后重新运行 /erp-workflow:plan-start: <逐条列出每个缺口,格式:[闸门] 缺口描述 → 回填位置> 例: [REQ 真实数据] REQ-USER-001 输入字段「示例值」列仍为模板占位 → docs/01-需求清单/... [secrets] DB_PASSWORD 未填 → .env.local [docs/04 §零] node 栈缺 e2e 命令 → docs/04-技术规范.md §零 补齐后再次运行 /erp-workflow:plan-start 重新校验。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` 输出拦截横幅后**停下**,不调任何下游 skill,不提示 coding-start。 ### 2.2 正常派发(`后续` 非空) 打印简短分发通知: ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [plan-start] → 派发到 <后续> 未勾项: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` 立即用 `Skill` 工具调用 `后续`。 ## 参考 - `docs/08-模块任务管理.md`(进度追踪) - `CLAUDE.md`(项目指令) - 后续 skills(通过 `Skill` 工具按名称调用)