From 0886fbde59a992c8ce0c15cc5a76a7d400f4830c Mon Sep 17 00:00:00 2001 From: zichun Date: Mon, 25 May 2026 14:08:41 +0800 Subject: [PATCH] feat(lite): merge module-start + frontend-start into phase-driver --- skills/coding/frontend-start/SKILL.md | 66 ------------------------------------------------------------------ skills/coding/frontend-start/templates/frontend-start-banner-template.md | 9 --------- skills/coding/module-start/SKILL.md | 72 ------------------------------------------------------------------------ skills/coding/module-start/templates/module-start-banner-template.md | 8 -------- skills/coding/phase-driver/SKILL.md | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 153 insertions(+), 155 deletions(-) delete mode 100644 skills/coding/frontend-start/SKILL.md delete mode 100644 skills/coding/frontend-start/templates/frontend-start-banner-template.md delete mode 100644 skills/coding/module-start/SKILL.md delete mode 100644 skills/coding/module-start/templates/module-start-banner-template.md create mode 100644 skills/coding/phase-driver/SKILL.md diff --git a/skills/coding/frontend-start/SKILL.md b/skills/coding/frontend-start/SKILL.md deleted file mode 100644 index ab2387e..0000000 --- a/skills/coding/frontend-start/SKILL.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -name: frontend-start -description: 前端阶段循环入口。AI 自主推导 FE 业务功能清单写入 docs/08 § 三(已有则加载),定位未完成 FE 派发 fe-feature-brainstorm 或 test-gate(前端阶段)。幂等可重入。 -user-invocable: false -allowed-tools: Read Write Edit Skill Glob Grep AskUserQuestion Bash(git branch *) Bash(git checkout *) Bash(git rev-parse *) Bash(git status *) Bash(git symbolic-ref *) Bash(git tag *) Bash(find *) Bash(ls *) ---- - -**所有输出必须使用中文。** - -# frontend-start - -## 执行步骤 - -### 步骤 1:检查 prototype - -项目根 `prototype/` 至少含 1 个 `*.html` → 通过,进入步骤 2;缺失 → 用 `AskUserQuestion` 让用户补齐 prototype 后重跑入口,停止。 - -### 步骤 2:准备 FE 清单 - -读 docs/08 § 三 "功能:" 项: - -- 已有 `- [ ] FE-NN ...` 或 `- [x] FE-NN ...` 行 → **加载**:逐行解析得 `fe_list[]`,每项 `{ fe_id, name, status, associated_reqs[], associated_prototypes[] }`。行格式不符 → 硬停打印问题行 -- 仅有 HTML 注释占位(无 FE bullet)→ **推导**: - 1. 读 `prototype/**/*.html` + `docs/01-需求清单/**/*.md` + `docs/05-API接口契约.md` - 2. 以**业务功能**为单位拆分(同流程多屏可合 1 FE;一 HTML 多功能可拆多 FE;无 UI 的 REQ 不产生 FE)。每个 FE:`{ fe_id: FE-NN, name, associated_reqs[], associated_prototypes[] }`,prototype 路径可带 anchor 区分文件内多区域 - 3. **写入 § 三 "功能:" 项**(替换占位 HTML 注释),行格式: - - ``` - - [ ] FE-NN 功能名 | 关联 REQ:REQ-A, REQ-B | 关联原型:prototype/.html - ``` - - 保留 `- 整体里程碑: —` 不动;写入后解析得 `fe_list[]`,继续步骤 3 - -### 步骤 3:检查前端里程碑状态 - -读 § 三 `整体里程碑:` 字段并 `git tag -l 'milestone/frontend-phase'` 校验: - -- 字段为 `milestone/frontend-phase` 且 tag 存在 → 打印"前端阶段已完成"并停(冗余保护,正常由 coding-start 拦掉) -- 否则(`—` 或 tag 不存在)→ 进入步骤 4 - -### 步骤 4:切到 frontend-phase 分支 - -目标分支 `frontend-phase`,分支管理逻辑同 module-start 步骤 3:已在 → 继续;存在 → checkout;不存在 → 切本地默认分支后 `git checkout -b frontend-phase`。任何错误硬停 + 诊断,不自动 stash / 覆盖。 - -### 步骤 5:识别已完成的 FE - -扫 `docs/superpowers/reviews/<日期>-FE-*.md`,`verdict: approve` 的收入 `done_fes[]`。每次进入重新计算,不缓存。 - -### 步骤 6:报告进度 - -按 `${CLAUDE_SKILL_DIR}/templates/frontend-start-banner-template.md` 渲染:当前分支 + prototype HTML 数 + FE 进度(done / total)+ 下一 FE。 - -### 步骤 7:进入下一环节 - -- 存在未完成 FE → `Skill(fe-feature-brainstorm)`,参数 `{ fe_id, name, associated_reqs[], associated_prototypes[] }` -- 全 FE 完成 → `Skill(test-gate)` 带 `phase=frontend` - -## 参考 - -- `${CLAUDE_SKILL_DIR}/templates/frontend-start-banner-template.md` -- `docs/08-模块任务管理.md § 三`(前端阶段元数据:整体里程碑 + FE 清单) -- `prototype/`(HTML mockup,FE 拆分粒度与文件数无关) -- `docs/superpowers/reviews/*-FE-*.md`(verdict=approve 即完成) -- 上游:`coding-start`(步骤 4 派发,仅当后端完成 + 前端未完成);`fe-feature-review` approve 后回调 -- 下游:`fe-feature-brainstorm`(每 FE)/ `test-gate`(phase=frontend,全完成时) -- 前置门禁:本 skill 步骤 1 自承(coding-start 不做) diff --git a/skills/coding/frontend-start/templates/frontend-start-banner-template.md b/skills/coding/frontend-start/templates/frontend-start-banner-template.md deleted file mode 100644 index 9551845..0000000 --- a/skills/coding/frontend-start/templates/frontend-start-banner-template.md +++ /dev/null @@ -1,9 +0,0 @@ -## 前端阶段(frontend-phase) - -- 分支:frontend-phase -- 整体里程碑:{{overall_milestone}} -- FE 进度(`x` = 已完成 review approve;FE 是业务功能粒度,与 prototype/ HTML 文件数无关): -{{#each fes}} - - [{{status}}] {{fe_id}} {{name}} | 关联 REQ:{{reqs}} | 关联原型:{{prototypes}} -{{/each}} -- 下一步:{{next_action}} diff --git a/skills/coding/module-start/SKILL.md b/skills/coding/module-start/SKILL.md deleted file mode 100644 index 368b539..0000000 --- a/skills/coding/module-start/SKILL.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -name: module-start -description: 后端模块循环入口。定位当前未完成(未打里程碑 tag)模块与未完成 REQ,派发 feature-brainstorm 或 test-gate;幂等可重入。阶段路由由 coding-start 负责,本 skill 不感知前端阶段。 -user-invocable: false -allowed-tools: Read Write Skill Glob Grep Bash(git branch *) Bash(git checkout *) Bash(git rev-parse *) Bash(git status *) Bash(git symbolic-ref *) Bash(git tag *) ---- - -**所有输出必须使用中文。** - -# module-start - -## 职责说明 - -本 skill 单一职责:推进**后端模块循环**。`coding-start` 已在派发前确认存在未完成后端模块;本 skill 不再做"后端是否全完"的判定,也不感知前端阶段。 - -## 执行步骤 - -### 步骤 1:定位当前模块与本模块 REQ 列表 - -按 `docs/02 § 二 开发顺序清单` 的 REQ 顺序扫描,找到第一个所属模块尚未打里程碑 tag 的模块作为 `current_module`,并抽取本模块 REQ 序列。 - -模块状态判定(`里程碑:` 字段 + `git tag -l 'milestone/'` 存在性)参见 `CLAUDE.md § ✅ 阶段完成判定规则 § 状态语义`。 - -找到 `current_module` 后,从 docs/02 § 二 的 REQ 列表里取出所有 `module_id == current_module` 的项,按原序得 `req_list[]`(A5 约束保证同模块 REQ 连续)。模块名、需求卡目录等其它字段由后续步骤按需从 `docs/08 § 二` 或 `docs/01-需求清单/` 取,不在本步骤预读。 - -约束: - -- 模块完成 = `docs/08 § 二` 该模块 `里程碑:` 字段为 `milestone/` 且 `git tag -l` 能查到该 tag;二者任一缺失即视为未完成 -- 任何文件读取或解析失败 → 打印错误并停止 - -### 步骤 2:找不到未完成后端模块的处理 - -如果步骤 1 没找到任何未完成的后端模块——理论上不应触达此分支(`coding-start` 步骤 3 已确认存在未完成模块才会派发到本 skill),属于异常调用: - -- 打印诊断:"`module-start` 未发现未完成后端模块。请通过 `/erp-workflow:coding-start` 入口重新驱动——coding-start 会按 docs/08 § 二/§ 三 自动路由到正确阶段(后端 / 前端 / 全部完成)。" -- 结束本 skill,不派发下游 - -### 步骤 3:确保处于模块分支 - -确保工作树位于 `target_branch = module-`(例 `module-module_sys`)。 - -- 已在该分支 → 继续步骤 4 -- 该分支已存在但当前不在 → checkout 过去 -- 该分支不存在 → 先把工作树切到本地默认分支(main 或 master,已由 milestone-tag 的本地 merge 累积所有已完成模块),作为新分支的干净 base,再 `git checkout -b` 创建模块分支 - -任何错误(定位不到默认分支 / 切换前工作树脏 / checkout 失败)一律停下并打印诊断信息,不自动 stash、不强制覆盖。 - -### 步骤 4:计算已完成 REQ 集合 `done_reqs[]` - -对 `req_list[]` 中每个 REQ,检查 `docs/superpowers/reviews/` 下是否存在该 REQ 的 review 文件、且其 `verdict` 字段为 `approve`。两条件都满足 → 收入 `done_reqs[]`,步骤 6 推进时跳过这些 REQ。 - -每次进入本 skill 都重新计算(不缓存),保证中断/重跑后能从最新进度继续。 - -### 步骤 5:渲染并打印模块横幅 - -按 `${CLAUDE_SKILL_DIR}/templates/module-start-banner-template.md` 渲染输出。 - -### 步骤 6:派发 - -- 还有未完成 REQ → 调用 `Skill(feature-brainstorm)` 启动该 REQ 的功能循环 -- 本模块 REQ 全部完成 → 调用 `Skill(test-gate)` 进入模块测试闸门 - -## 参考 - -- `docs/02-开发计划.md § 二 开发顺序清单`(分发权威) -- `docs/08-模块任务管理.md § 二`(后端模块元数据,含 `里程碑:` 字段;完成判定以 tag 存在为准) -- `docs/superpowers/reviews/*.md`(REQ 级进度事实——verdict=approve 即完成) -- `${CLAUDE_SKILL_DIR}/templates/module-start-banner-template.md` -- 下游: - - `feature-brainstorm`(每个未完成 REQ) - - `test-gate`(本模块全部 REQ approve 后;phase=backend 由分支推断) -- 上游:`coding-start`(步骤 3 派发到此;后端模块全部打里程碑时不会派发到此) diff --git a/skills/coding/module-start/templates/module-start-banner-template.md b/skills/coding/module-start/templates/module-start-banner-template.md deleted file mode 100644 index a412e84..0000000 --- a/skills/coding/module-start/templates/module-start-banner-template.md +++ /dev/null @@ -1,8 +0,0 @@ -## 当前模块:{{module_id}}({{module_name}}) - -- 分支:module-{{module_id}} -- 需求卡片目录:docs/01-需求清单/{{req_dir}}/ -- 功能清单(`x` = 已完成 review approve): -{{#each reqs}} - - [{{status}}] {{req_id}} — {{title}} -{{/each}} diff --git a/skills/coding/phase-driver/SKILL.md b/skills/coding/phase-driver/SKILL.md new file mode 100644 index 0000000..81f7755 --- /dev/null +++ b/skills/coding/phase-driver/SKILL.md @@ -0,0 +1,153 @@ +--- +name: phase-driver +description: 统一阶段循环驱动(后端模块 / 前端阶段共用,由 phase 参数区分)。定位当前未完成单元并派发 feature-spec,全完成则派发 milestone。幂等可重入。 +user-invocable: false +allowed-tools: Read Write Edit Skill Glob Grep AskUserQuestion Bash(git branch *) Bash(git checkout *) Bash(git rev-parse *) Bash(git status *) Bash(git symbolic-ref *) Bash(git tag *) Bash(find *) Bash(ls *) +--- + +**所有输出必须使用中文。** + +# phase-driver + +## 职责说明 + +统一阶段循环驱动,由 `phase` 参数区分后端模块循环(`phase=backend`)与前端阶段循环(`phase=frontend`)。由 `coding-start` 初次派发,`feature-review` approve 后回调,均携带 `{ phase }` 参数。幂等可重入。 + +--- + +## phase=backend(后端模块循环) + +### 步骤 B1:定位当前模块与 REQ 列表 + +读取 `docs/08-模块任务管理.md § 二`,按文中模块顺序扫描,找到第一个未完成的模块作为 `current_module`。 + +**模块完成判定**(双重校验,二者皆满足才算完成): +- 该模块条目下 `里程碑:` 字段 == `milestone/` +- `git tag -l 'milestone/'` 能查到对应 tag + +二者任一缺失 → 视为未完成。 + +找到 `current_module` 后,从 `docs/08 § 二` 该模块条目下的 REQ 子项中,按列出顺序提取 `req_list[]`(docs/08 § 二 是 REQ 顺序权威,不读 docs/02)。 + +约束: +- 任何文件读取或解析失败 → 打印错误并停止 + +### 步骤 B2:未找到未完成后端模块的处理 + +若步骤 B1 未找到任何未完成后端模块(理论上由 `coding-start` / `feature-review` approve 后的回调触发,属异常路径): + +- 打印诊断:"`phase-driver(backend)` 未发现未完成后端模块。请通过 `/erp-workflow:coding-start` 入口重新驱动——coding-start 会按 docs/08 § 二/§ 三 自动路由到正确阶段。" +- 结束本 skill,不派发下游 + +### 步骤 B3:确保处于模块分支 + +目标分支:`module-`(例:`module-sys`) + +- 当前已在该分支 → 继续步骤 B4 +- 该分支已存在但当前不在 → `git checkout module-` +- 该分支不存在 → 先切到本地默认分支(`main` 或 `master`,已由 `milestone` 的本地 merge 累积所有已完成模块)作为干净 base,再 `git checkout -b module-` + +任何错误(定位不到默认分支 / 切换前工作树脏 / checkout 失败)→ 打印诊断信息后硬停,不自动 stash,不强制覆盖。 + +### 步骤 B4:计算已完成 REQ 集合 `done_reqs[]` + +对 `req_list[]` 中每个 REQ,检查 `docs/superpowers/reviews/` 下是否存在该 REQ 的 review 文件(文件名含 REQ id),且文件中 `verdict:` 字段为 `approve`。两条件皆满足 → 收入 `done_reqs[]`。 + +每次进入本 skill 都重新计算(不缓存),保证中断 / 重跑后能从最新进度继续。 + +### 步骤 B5:打印状态 + +内联打印(不引用任何模板文件),格式示例: + +``` +[phase-driver] 阶段=backend + 分支:module- + 进度:/ REQ 完成 + 下一: +``` + +### 步骤 B6:派发 + +- 存在未完成 REQ → `Skill(feature-spec)`,参数 `{ phase: "backend", id: , name: }` +- 本模块所有 REQ 全部完成 → `Skill(milestone)` + +--- + +## phase=frontend(前端阶段循环) + +### 步骤 F1:prototype 门禁 + +用 `find /prototype -name "*.html"` 或 `ls /prototype/` 检查项目根 `prototype/` 目录: + +- 找到 ≥1 个 `*.html` → 通过,进入步骤 F2 +- 未找到(目录不存在或无 html 文件)→ `AskUserQuestion` 告知用户需要在 `prototype/` 下放置至少一个 HTML mockup 文件后重跑入口,然后停止 + +### 步骤 F2:准备 FE 清单 + +读 `docs/08-模块任务管理.md § 三` 中"功能:"项: + +**情形 A:已有 FE bullet** + +若已存在 `- [ ] FE-NN ...` 或 `- [x] FE-NN ...` 行 → **加载**:逐行解析得 `fe_list[]`,每项为 `{ fe_id, name, status, associated_reqs[], associated_prototypes[] }`。行格式不符规范 → 硬停并打印问题行。 + +**情形 B:仅有 HTML 注释占位(无 FE bullet)** + +→ **推导**: + +1. 读取 `prototype/**/*.html`、`docs/01-需求清单/**/*.md`、`docs/05-API接口契约.md` +2. 以**业务功能**为单位拆分(同流程多屏可合 1 个 FE;一个 HTML 含多功能可拆多个 FE;无 UI 的 REQ 不产生 FE)。每个 FE 含:`{ fe_id: FE-NN, name, associated_reqs[], associated_prototypes[] }`,prototype 路径可带 anchor 区分文件内多区域 +3. **写入 § 三 "功能:" 项**(替换 HTML 注释占位),每行格式: + + ``` + - [ ] FE-NN 功能名 | 关联 REQ:REQ-A, REQ-B | 关联原型:prototype/.html + ``` + + 保留 `- 整体里程碑: —` 行不动;写入后解析得 `fe_list[]`,继续步骤 F3 + +### 步骤 F3:检查前端里程碑状态 + +读 `docs/08 § 三 整体里程碑:` 字段,并用 `git tag -l 'milestone/frontend-phase'` 校验: + +- 字段为 `milestone/frontend-phase` 且 tag 存在 → 打印"前端阶段已完成"并停止(冗余保护,正常由 `coding-start` 拦截) +- 否则(字段为 `—` 或 tag 不存在)→ 进入步骤 F4 + +### 步骤 F4:确保处于 frontend-phase 分支 + +目标分支:`frontend-phase` + +- 当前已在该分支 → 继续步骤 F5 +- 该分支已存在但当前不在 → `git checkout frontend-phase` +- 该分支不存在 → 先切到本地默认分支(`main` 或 `master`)作为干净 base,再 `git checkout -b frontend-phase` + +任何错误(定位不到默认分支 / 工作树脏 / checkout 失败)→ 打印诊断信息后硬停,不自动 stash,不强制覆盖。 + +### 步骤 F5:识别已完成的 FE + +扫 `docs/superpowers/reviews/` 下文件名含 `-FE-` 的 review 文件(如 `-FE-NN.md`),`verdict: approve` 的收入 `done_fes[]`。每次进入重新计算,不缓存。 + +### 步骤 F6:打印状态 + +内联打印(不引用任何模板文件),格式示例: + +``` +[phase-driver] 阶段=frontend + 分支:frontend-phase + prototype HTML 数: 个 + 进度:/ FE 完成 + 下一: +``` + +### 步骤 F7:派发 + +- 存在未完成 FE → `Skill(feature-spec)`,参数 `{ phase: "frontend", id: , name: , associated_reqs: [...], associated_prototypes: [...] }` +- 所有 FE 全部完成 → `Skill(milestone)` + +--- + +## 参考 + +- `docs/08-模块任务管理.md § 二`(后端模块元数据 + REQ 顺序权威,含 `里程碑:` 字段) +- `docs/08-模块任务管理.md § 三`(前端阶段元数据:整体里程碑 + FE 清单) +- `docs/superpowers/reviews/*.md`(REQ / FE 级进度事实——`verdict: approve` 即完成) +- 上游:`coding-start`(初次派发,携带 `{ phase }`);`feature-review`(approve 后回调,携带 `{ phase }`) +- 下游:`feature-spec`(每个未完成 REQ / FE);`milestone`(全部完成时) -- libgit2 0.22.2