Commit 0886fbde59a992c8ce0c15cc5a76a7d400f4830c

Authored by zichun
1 parent 26f7bfd7

feat(lite): merge module-start + frontend-start into phase-driver

skills/coding/frontend-start/SKILL.md deleted
1 ----  
2 -name: frontend-start  
3 -description: 前端阶段循环入口。AI 自主推导 FE 业务功能清单写入 docs/08 § 三(已有则加载),定位未完成 FE 派发 fe-feature-brainstorm 或 test-gate(前端阶段)。幂等可重入。  
4 -user-invocable: false  
5 -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 *)  
6 ----  
7 -  
8 -**所有输出必须使用中文。**  
9 -  
10 -# frontend-start  
11 -  
12 -## 执行步骤  
13 -  
14 -### 步骤 1:检查 prototype  
15 -  
16 -项目根 `prototype/` 至少含 1 个 `*.html` → 通过,进入步骤 2;缺失 → 用 `AskUserQuestion` 让用户补齐 prototype 后重跑入口,停止。  
17 -  
18 -### 步骤 2:准备 FE 清单  
19 -  
20 -读 docs/08 § 三 "功能:" 项:  
21 -  
22 -- 已有 `- [ ] FE-NN ...` 或 `- [x] FE-NN ...` 行 → **加载**:逐行解析得 `fe_list[]`,每项 `{ fe_id, name, status, associated_reqs[], associated_prototypes[] }`。行格式不符 → 硬停打印问题行  
23 -- 仅有 HTML 注释占位(无 FE bullet)→ **推导**:  
24 - 1. 读 `prototype/**/*.html` + `docs/01-需求清单/**/*.md` + `docs/05-API接口契约.md`  
25 - 2. 以**业务功能**为单位拆分(同流程多屏可合 1 FE;一 HTML 多功能可拆多 FE;无 UI 的 REQ 不产生 FE)。每个 FE:`{ fe_id: FE-NN, name, associated_reqs[], associated_prototypes[] }`,prototype 路径可带 anchor 区分文件内多区域  
26 - 3. **写入 § 三 "功能:" 项**(替换占位 HTML 注释),行格式:  
27 -  
28 - ```  
29 - - [ ] FE-NN 功能名 | 关联 REQ:REQ-A, REQ-B | 关联原型:prototype/<file>.html  
30 - ```  
31 -  
32 - 保留 `- 整体里程碑: —` 不动;写入后解析得 `fe_list[]`,继续步骤 3  
33 -  
34 -### 步骤 3:检查前端里程碑状态  
35 -  
36 -读 § 三 `整体里程碑:` 字段并 `git tag -l 'milestone/frontend-phase'` 校验:  
37 -  
38 -- 字段为 `milestone/frontend-phase` 且 tag 存在 → 打印"前端阶段已完成"并停(冗余保护,正常由 coding-start 拦掉)  
39 -- 否则(`—` 或 tag 不存在)→ 进入步骤 4  
40 -  
41 -### 步骤 4:切到 frontend-phase 分支  
42 -  
43 -目标分支 `frontend-phase`,分支管理逻辑同 module-start 步骤 3:已在 → 继续;存在 → checkout;不存在 → 切本地默认分支后 `git checkout -b frontend-phase`。任何错误硬停 + 诊断,不自动 stash / 覆盖。  
44 -  
45 -### 步骤 5:识别已完成的 FE  
46 -  
47 -扫 `docs/superpowers/reviews/<日期>-FE-*.md`,`verdict: approve` 的收入 `done_fes[]`。每次进入重新计算,不缓存。  
48 -  
49 -### 步骤 6:报告进度  
50 -  
51 -按 `${CLAUDE_SKILL_DIR}/templates/frontend-start-banner-template.md` 渲染:当前分支 + prototype HTML 数 + FE 进度(done / total)+ 下一 FE。  
52 -  
53 -### 步骤 7:进入下一环节  
54 -  
55 -- 存在未完成 FE → `Skill(fe-feature-brainstorm)`,参数 `{ fe_id, name, associated_reqs[], associated_prototypes[] }`  
56 -- 全 FE 完成 → `Skill(test-gate)` 带 `phase=frontend`  
57 -  
58 -## 参考  
59 -  
60 -- `${CLAUDE_SKILL_DIR}/templates/frontend-start-banner-template.md`  
61 -- `docs/08-模块任务管理.md § 三`(前端阶段元数据:整体里程碑 + FE 清单)  
62 -- `prototype/`(HTML mockup,FE 拆分粒度与文件数无关)  
63 -- `docs/superpowers/reviews/*-FE-*.md`(verdict=approve 即完成)  
64 -- 上游:`coding-start`(步骤 4 派发,仅当后端完成 + 前端未完成);`fe-feature-review` approve 后回调  
65 -- 下游:`fe-feature-brainstorm`(每 FE)/ `test-gate`(phase=frontend,全完成时)  
66 -- 前置门禁:本 skill 步骤 1 自承(coding-start 不做)  
skills/coding/frontend-start/templates/frontend-start-banner-template.md deleted
1 -## 前端阶段(frontend-phase)  
2 -  
3 -- 分支:frontend-phase  
4 -- 整体里程碑:{{overall_milestone}}  
5 -- FE 进度(`x` = 已完成 review approve;FE 是业务功能粒度,与 prototype/ HTML 文件数无关):  
6 -{{#each fes}}  
7 - - [{{status}}] {{fe_id}} {{name}} | 关联 REQ:{{reqs}} | 关联原型:{{prototypes}}  
8 -{{/each}}  
9 -- 下一步:{{next_action}}  
skills/coding/module-start/SKILL.md deleted
1 ----  
2 -name: module-start  
3 -description: 后端模块循环入口。定位当前未完成(未打里程碑 tag)模块与未完成 REQ,派发 feature-brainstorm 或 test-gate;幂等可重入。阶段路由由 coding-start 负责,本 skill 不感知前端阶段。  
4 -user-invocable: false  
5 -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 *)  
6 ----  
7 -  
8 -**所有输出必须使用中文。**  
9 -  
10 -# module-start  
11 -  
12 -## 职责说明  
13 -  
14 -本 skill 单一职责:推进**后端模块循环**。`coding-start` 已在派发前确认存在未完成后端模块;本 skill 不再做"后端是否全完"的判定,也不感知前端阶段。  
15 -  
16 -## 执行步骤  
17 -  
18 -### 步骤 1:定位当前模块与本模块 REQ 列表  
19 -  
20 -按 `docs/02 § 二 开发顺序清单` 的 REQ 顺序扫描,找到第一个所属模块尚未打里程碑 tag 的模块作为 `current_module`,并抽取本模块 REQ 序列。  
21 -  
22 -模块状态判定(`里程碑:` 字段 + `git tag -l 'milestone/<module_id>'` 存在性)参见 `CLAUDE.md § ✅ 阶段完成判定规则 § 状态语义`。  
23 -  
24 -找到 `current_module` 后,从 docs/02 § 二 的 REQ 列表里取出所有 `module_id == current_module` 的项,按原序得 `req_list[]`(A5 约束保证同模块 REQ 连续)。模块名、需求卡目录等其它字段由后续步骤按需从 `docs/08 § 二` 或 `docs/01-需求清单/` 取,不在本步骤预读。  
25 -  
26 -约束:  
27 -  
28 -- 模块完成 = `docs/08 § 二` 该模块 `里程碑:` 字段为 `milestone/<module_id>` 且 `git tag -l` 能查到该 tag;二者任一缺失即视为未完成  
29 -- 任何文件读取或解析失败 → 打印错误并停止  
30 -  
31 -### 步骤 2:找不到未完成后端模块的处理  
32 -  
33 -如果步骤 1 没找到任何未完成的后端模块——理论上不应触达此分支(`coding-start` 步骤 3 已确认存在未完成模块才会派发到本 skill),属于异常调用:  
34 -  
35 -- 打印诊断:"`module-start` 未发现未完成后端模块。请通过 `/erp-workflow:coding-start` 入口重新驱动——coding-start 会按 docs/08 § 二/§ 三 自动路由到正确阶段(后端 / 前端 / 全部完成)。"  
36 -- 结束本 skill,不派发下游  
37 -  
38 -### 步骤 3:确保处于模块分支  
39 -  
40 -确保工作树位于 `target_branch = module-<module_id>`(例 `module-module_sys`)。  
41 -  
42 -- 已在该分支 → 继续步骤 4  
43 -- 该分支已存在但当前不在 → checkout 过去  
44 -- 该分支不存在 → 先把工作树切到本地默认分支(main 或 master,已由 milestone-tag 的本地 merge 累积所有已完成模块),作为新分支的干净 base,再 `git checkout -b` 创建模块分支  
45 -  
46 -任何错误(定位不到默认分支 / 切换前工作树脏 / checkout 失败)一律停下并打印诊断信息,不自动 stash、不强制覆盖。  
47 -  
48 -### 步骤 4:计算已完成 REQ 集合 `done_reqs[]`  
49 -  
50 -对 `req_list[]` 中每个 REQ,检查 `docs/superpowers/reviews/` 下是否存在该 REQ 的 review 文件、且其 `verdict` 字段为 `approve`。两条件都满足 → 收入 `done_reqs[]`,步骤 6 推进时跳过这些 REQ。  
51 -  
52 -每次进入本 skill 都重新计算(不缓存),保证中断/重跑后能从最新进度继续。  
53 -  
54 -### 步骤 5:渲染并打印模块横幅  
55 -  
56 -按 `${CLAUDE_SKILL_DIR}/templates/module-start-banner-template.md` 渲染输出。  
57 -  
58 -### 步骤 6:派发  
59 -  
60 -- 还有未完成 REQ → 调用 `Skill(feature-brainstorm)` 启动该 REQ 的功能循环  
61 -- 本模块 REQ 全部完成 → 调用 `Skill(test-gate)` 进入模块测试闸门  
62 -  
63 -## 参考  
64 -  
65 -- `docs/02-开发计划.md § 二 开发顺序清单`(分发权威)  
66 -- `docs/08-模块任务管理.md § 二`(后端模块元数据,含 `里程碑:` 字段;完成判定以 tag 存在为准)  
67 -- `docs/superpowers/reviews/*.md`(REQ 级进度事实——verdict=approve 即完成)  
68 -- `${CLAUDE_SKILL_DIR}/templates/module-start-banner-template.md`  
69 -- 下游:  
70 - - `feature-brainstorm`(每个未完成 REQ)  
71 - - `test-gate`(本模块全部 REQ approve 后;phase=backend 由分支推断)  
72 -- 上游:`coding-start`(步骤 3 派发到此;后端模块全部打里程碑时不会派发到此)  
skills/coding/module-start/templates/module-start-banner-template.md deleted
1 -## 当前模块:{{module_id}}({{module_name}})  
2 -  
3 -- 分支:module-{{module_id}}  
4 -- 需求卡片目录:docs/01-需求清单/{{req_dir}}/  
5 -- 功能清单(`x` = 已完成 review approve):  
6 -{{#each reqs}}  
7 - - [{{status}}] {{req_id}} — {{title}}  
8 -{{/each}}  
skills/coding/phase-driver/SKILL.md 0 → 100644
  1 +---
  2 +name: phase-driver
  3 +description: 统一阶段循环驱动(后端模块 / 前端阶段共用,由 phase 参数区分)。定位当前未完成单元并派发 feature-spec,全完成则派发 milestone。幂等可重入。
  4 +user-invocable: false
  5 +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 *)
  6 +---
  7 +
  8 +**所有输出必须使用中文。**
  9 +
  10 +# phase-driver
  11 +
  12 +## 职责说明
  13 +
  14 +统一阶段循环驱动,由 `phase` 参数区分后端模块循环(`phase=backend`)与前端阶段循环(`phase=frontend`)。由 `coding-start` 初次派发,`feature-review` approve 后回调,均携带 `{ phase }` 参数。幂等可重入。
  15 +
  16 +---
  17 +
  18 +## phase=backend(后端模块循环)
  19 +
  20 +### 步骤 B1:定位当前模块与 REQ 列表
  21 +
  22 +读取 `docs/08-模块任务管理.md § 二`,按文中模块顺序扫描,找到第一个未完成的模块作为 `current_module`。
  23 +
  24 +**模块完成判定**(双重校验,二者皆满足才算完成):
  25 +- 该模块条目下 `里程碑:` 字段 == `milestone/<module_id>`
  26 +- `git tag -l 'milestone/<module_id>'` 能查到对应 tag
  27 +
  28 +二者任一缺失 → 视为未完成。
  29 +
  30 +找到 `current_module` 后,从 `docs/08 § 二` 该模块条目下的 REQ 子项中,按列出顺序提取 `req_list[]`(docs/08 § 二 是 REQ 顺序权威,不读 docs/02)。
  31 +
  32 +约束:
  33 +- 任何文件读取或解析失败 → 打印错误并停止
  34 +
  35 +### 步骤 B2:未找到未完成后端模块的处理
  36 +
  37 +若步骤 B1 未找到任何未完成后端模块(理论上由 `coding-start` / `feature-review` approve 后的回调触发,属异常路径):
  38 +
  39 +- 打印诊断:"`phase-driver(backend)` 未发现未完成后端模块。请通过 `/erp-workflow:coding-start` 入口重新驱动——coding-start 会按 docs/08 § 二/§ 三 自动路由到正确阶段。"
  40 +- 结束本 skill,不派发下游
  41 +
  42 +### 步骤 B3:确保处于模块分支
  43 +
  44 +目标分支:`module-<module_id>`(例:`module-sys`)
  45 +
  46 +- 当前已在该分支 → 继续步骤 B4
  47 +- 该分支已存在但当前不在 → `git checkout module-<module_id>`
  48 +- 该分支不存在 → 先切到本地默认分支(`main` 或 `master`,已由 `milestone` 的本地 merge 累积所有已完成模块)作为干净 base,再 `git checkout -b module-<module_id>`
  49 +
  50 +任何错误(定位不到默认分支 / 切换前工作树脏 / checkout 失败)→ 打印诊断信息后硬停,不自动 stash,不强制覆盖。
  51 +
  52 +### 步骤 B4:计算已完成 REQ 集合 `done_reqs[]`
  53 +
  54 +对 `req_list[]` 中每个 REQ,检查 `docs/superpowers/reviews/` 下是否存在该 REQ 的 review 文件(文件名含 REQ id),且文件中 `verdict:` 字段为 `approve`。两条件皆满足 → 收入 `done_reqs[]`。
  55 +
  56 +每次进入本 skill 都重新计算(不缓存),保证中断 / 重跑后能从最新进度继续。
  57 +
  58 +### 步骤 B5:打印状态
  59 +
  60 +内联打印(不引用任何模板文件),格式示例:
  61 +
  62 +```
  63 +[phase-driver] 阶段=backend
  64 + 分支:module-<module_id>
  65 + 进度:<done_count>/<total_count> REQ 完成
  66 + 下一:<first_incomplete_REQ_id> <REQ_title>
  67 +```
  68 +
  69 +### 步骤 B6:派发
  70 +
  71 +- 存在未完成 REQ → `Skill(feature-spec)`,参数 `{ phase: "backend", id: <first_incomplete_REQ_id>, name: <REQ_title> }`
  72 +- 本模块所有 REQ 全部完成 → `Skill(milestone)`
  73 +
  74 +---
  75 +
  76 +## phase=frontend(前端阶段循环)
  77 +
  78 +### 步骤 F1:prototype 门禁
  79 +
  80 +用 `find <project-root>/prototype -name "*.html"` 或 `ls <project-root>/prototype/` 检查项目根 `prototype/` 目录:
  81 +
  82 +- 找到 ≥1 个 `*.html` → 通过,进入步骤 F2
  83 +- 未找到(目录不存在或无 html 文件)→ `AskUserQuestion` 告知用户需要在 `prototype/` 下放置至少一个 HTML mockup 文件后重跑入口,然后停止
  84 +
  85 +### 步骤 F2:准备 FE 清单
  86 +
  87 +读 `docs/08-模块任务管理.md § 三` 中"功能:"项:
  88 +
  89 +**情形 A:已有 FE bullet**
  90 +
  91 +若已存在 `- [ ] FE-NN ...` 或 `- [x] FE-NN ...` 行 → **加载**:逐行解析得 `fe_list[]`,每项为 `{ fe_id, name, status, associated_reqs[], associated_prototypes[] }`。行格式不符规范 → 硬停并打印问题行。
  92 +
  93 +**情形 B:仅有 HTML 注释占位(无 FE bullet)**
  94 +
  95 +→ **推导**:
  96 +
  97 +1. 读取 `prototype/**/*.html`、`docs/01-需求清单/**/*.md`、`docs/05-API接口契约.md`
  98 +2. 以**业务功能**为单位拆分(同流程多屏可合 1 个 FE;一个 HTML 含多功能可拆多个 FE;无 UI 的 REQ 不产生 FE)。每个 FE 含:`{ fe_id: FE-NN, name, associated_reqs[], associated_prototypes[] }`,prototype 路径可带 anchor 区分文件内多区域
  99 +3. **写入 § 三 "功能:" 项**(替换 HTML 注释占位),每行格式:
  100 +
  101 + ```
  102 + - [ ] FE-NN 功能名 | 关联 REQ:REQ-A, REQ-B | 关联原型:prototype/<file>.html
  103 + ```
  104 +
  105 + 保留 `- 整体里程碑: —` 行不动;写入后解析得 `fe_list[]`,继续步骤 F3
  106 +
  107 +### 步骤 F3:检查前端里程碑状态
  108 +
  109 +读 `docs/08 § 三 整体里程碑:` 字段,并用 `git tag -l 'milestone/frontend-phase'` 校验:
  110 +
  111 +- 字段为 `milestone/frontend-phase` 且 tag 存在 → 打印"前端阶段已完成"并停止(冗余保护,正常由 `coding-start` 拦截)
  112 +- 否则(字段为 `—` 或 tag 不存在)→ 进入步骤 F4
  113 +
  114 +### 步骤 F4:确保处于 frontend-phase 分支
  115 +
  116 +目标分支:`frontend-phase`
  117 +
  118 +- 当前已在该分支 → 继续步骤 F5
  119 +- 该分支已存在但当前不在 → `git checkout frontend-phase`
  120 +- 该分支不存在 → 先切到本地默认分支(`main` 或 `master`)作为干净 base,再 `git checkout -b frontend-phase`
  121 +
  122 +任何错误(定位不到默认分支 / 工作树脏 / checkout 失败)→ 打印诊断信息后硬停,不自动 stash,不强制覆盖。
  123 +
  124 +### 步骤 F5:识别已完成的 FE
  125 +
  126 +扫 `docs/superpowers/reviews/` 下文件名含 `-FE-` 的 review 文件(如 `<YYYY-MM-DD>-FE-NN.md`),`verdict: approve` 的收入 `done_fes[]`。每次进入重新计算,不缓存。
  127 +
  128 +### 步骤 F6:打印状态
  129 +
  130 +内联打印(不引用任何模板文件),格式示例:
  131 +
  132 +```
  133 +[phase-driver] 阶段=frontend
  134 + 分支:frontend-phase
  135 + prototype HTML 数:<n> 个
  136 + 进度:<done_count>/<total_count> FE 完成
  137 + 下一:<FE-NN> <FE_name>
  138 +```
  139 +
  140 +### 步骤 F7:派发
  141 +
  142 +- 存在未完成 FE → `Skill(feature-spec)`,参数 `{ phase: "frontend", id: <FE-NN>, name: <FE_name>, associated_reqs: [...], associated_prototypes: [...] }`
  143 +- 所有 FE 全部完成 → `Skill(milestone)`
  144 +
  145 +---
  146 +
  147 +## 参考
  148 +
  149 +- `docs/08-模块任务管理.md § 二`(后端模块元数据 + REQ 顺序权威,含 `里程碑:` 字段)
  150 +- `docs/08-模块任务管理.md § 三`(前端阶段元数据:整体里程碑 + FE 清单)
  151 +- `docs/superpowers/reviews/*.md`(REQ / FE 级进度事实——`verdict: approve` 即完成)
  152 +- 上游:`coding-start`(初次派发,携带 `{ phase }`);`feature-review`(approve 后回调,携带 `{ phase }`)
  153 +- 下游:`feature-spec`(每个未完成 REQ / FE);`milestone`(全部完成时)