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`(全部完成时)
... ...