@zhuan-ai/zhuanspec 2.9.5 → 2.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/cli/hooks.js +8 -8
  2. package/dist/cli/index.js +1 -0
  3. package/dist/commands/design.d.ts +12 -2
  4. package/dist/commands/design.js +83 -10
  5. package/dist/commands/progress.js +11 -0
  6. package/dist/commands/review.d.ts +1 -25
  7. package/dist/commands/review.js +51 -408
  8. package/dist/core/completions/command-registry.js +4 -0
  9. package/dist/core/hooks/collect-knowledge.d.ts +13 -5
  10. package/dist/core/hooks/collect-knowledge.js +56 -164
  11. package/dist/core/hooks/deviation-check.js +159 -55
  12. package/dist/core/hooks/init.js +46 -0
  13. package/dist/core/hooks/post-apply.js +2 -0
  14. package/dist/core/hooks/pre-archive.js +13 -14
  15. package/dist/core/hooks/pre-review.d.ts +27 -0
  16. package/dist/core/hooks/pre-review.js +169 -0
  17. package/dist/core/hooks/record-progress.d.ts +25 -0
  18. package/dist/core/hooks/record-progress.js +88 -1
  19. package/dist/core/hooks/review-hooks.js +176 -7
  20. package/dist/core/hooks/review-orchestrator.js +58 -11
  21. package/dist/core/hooks/tdd-phase-hook.d.ts +59 -0
  22. package/dist/core/hooks/tdd-phase-hook.js +313 -0
  23. package/dist/core/init.d.ts +1 -0
  24. package/dist/core/init.js +45 -2
  25. package/dist/core/templates/agents-template.d.ts +1 -1
  26. package/dist/core/templates/agents-template.js +139 -23
  27. package/dist/core/templates/skill-templates.js +21 -1
  28. package/dist/core/templates/slash-command-templates.js +163 -63
  29. package/dist/core/templates/tasks-template.js +89 -0
  30. package/dist/core/update.d.ts +3 -0
  31. package/dist/core/update.js +85 -2
  32. package/dist/core/validation/strict-rules.d.ts +47 -0
  33. package/dist/core/validation/strict-rules.js +589 -42
  34. package/dist/utils/git-repo-detector.js +1 -1
  35. package/dist/utils/phase-utils.js +14 -1
  36. package/package.json +22 -20
@@ -153,19 +153,33 @@ Wave: W/N | Phase: Apply
153
153
  * 兼容策略:若未找到 project.md 或关键词无匹配,输出警告并使用全局检索
154
154
  - 阅读 \`zhuanspec/project.md\` 了解项目约定(提示:"✓ Loaded project.md")
155
155
  - 审查 \`zhuanspec/project.md\`,\`zhuanspec list\` 和 \`zhuanspec list --specs\` 以了解当前上下文。
156
- 1. **强制询问测试用例(TDD 模式检查点,必须首先执行)**:
157
- - 使用选项式交互询问:"请提供相关的测试用例(可选),可以是:本地目录路径、在线链接(将通过 zzcase-data-fetcher skill 获取)、或跳过此步骤继续常规流程"
158
- - 用户选择"提供测试用例":进入 TDD 驱动模式
159
- * 明确告知:测试用例将用于需求定义、单元测试生成、实施验证
160
- * 在 proposal.md 创建 "Test Case Coverage" 部分
161
- * 在 tasks.md 使用 \`@test-case:TC-XXX\` 标签关联任务
162
- * 创建 test-cases.md 记录测试用例详情
163
- - 用户选择"跳过":继续常规流程(即提案无需考虑测试case)
164
-
165
- ⚠️ **CHECKPOINT [TDD-MODE]**:
166
- - TDD 模式下,Apply 阶段每个任务完成后需验证对应测试用例通过
167
- - Review 阶段包含测试覆盖率检查
168
- - 测试用例在 TDD 模式下发挥关键验证作用,确保代码符合预期行为
156
+ 1. **测试 case 来源确认(最先执行,禁止跳过)**:
157
+ 在进行任何澄清、设计或编写任何提案文件之前,使用选项式交互询问用户:
158
+ - 选项 A:提供测试 case(有现成 case,走 TDD 模式)
159
+ - 选项 B:暂不提供测试 case
160
+ - 选项 C:其他(请在后续补充说明)
161
+
162
+ 用户选择"提供测试 case"时:进入 TDD 驱动模式
163
+ - 明确告知:测试用例将用于需求定义、单元测试生成、实施验证
164
+ - 若用户提供链接(格式:\`https://zzcase.zhuanspirit.com/plan/taskDetail/module/{moduleId}/task/{taskId}\`),从 URL 提取 \`moduleId\`,调用 MCP 工具 \`mcp__caseweb__GET_get2\` 读取数据;否则手动录入
165
+ - 创建 test-cases.md 记录测试 case 详情(每个 TC-XXX 含前置条件、步骤、预期结果、验收点)
166
+ - tasks.md 使用 \`@test-case:TC-XXX\` 标签关联任务与测试 case
167
+ - 任务实施顺序调整为:先写测试 → 再写实现 → 验证测试通过
168
+
169
+ 用户选择"暂不提供":跳过,按常规流程继续
170
+ 用户选择"其他":等待用户补充说明后继续
171
+
172
+ ⚠️ **CHECKPOINT [TEST-CASE-INQUIRY]**:
173
+ 无论用户选择什么,必须**立即**将结果记录到 tasks.md 的 \`## Test Case Source Log\` 段
174
+ (若 tasks.md 尚未创建,先创建并写入此段,其余内容后续补充):
175
+ \`\`\`
176
+ ## Test Case Source Log
177
+ - 用户回答:[提供测试 case / 暂不提供 / 具体说明]
178
+ - TDD 模式:[启用 / 禁用]
179
+ - (如启用)测试 case 来源:[链接 / 手动录入 / bicId]
180
+ \`\`\`
181
+ 此段不得为空,validate --strict 会**无条件**检查其存在与内容,缺失直接报 ERROR。
182
+ 未完成此 checkpoint 记录之前,禁止执行步骤 2 及后续任何文件写入操作。
169
183
 
170
184
  2. **强制澄清检查(必须执行,不可跳过)**:分析用户请求,识别所有不确定或模糊的方面(范围、技术选择、实现细节、数据获取来源、服务分层、依赖关系、优先级、验收标准等......)。如果发现任何模糊之处,必须停止并使用**选项式交互**(如 \`AskQuestion\` 工具)提问,获得明确答复后才能继续。严禁在不确定的情况下自行推测或创建提案,严禁要求用户手动输入大段文字。
171
185
 
@@ -180,6 +194,12 @@ Wave: W/N | Phase: Apply
180
194
  4. 将变更映射为具体的功能或要求,将多范围的工作分解为具有明确关系和顺序的不同规范增量。
181
195
  5. 当解决方案跨越多个系统、引入新模式或在提交规范之前需要权衡讨论时,在 \`design.md\` 中捕获架构推理。
182
196
  6. 在 \`changes/<id>/specs/<capability>/spec.md\` 中起草规范增量(每个功能一个文件夹),使用 \`## ADDED|MODIFIED|REMOVED Requirements\`,每个要求至少包含一个 \`#### Scenario:\`,并在相关时交叉引用相关功能。
197
+
198
+ ⚠️ **CHECKPOINT [SPEC-REQUIREMENT-FORMAT]**:
199
+ 每个 \`### Requirement:\` 块写完后必须自检以下两点,违反任意一条 \`zhuanspec validate\` 会报 ERROR:
200
+ 1. **必须有需求描述文本**:header 之后、第一个 \`#### Scenario\` 之前,必须至少有一行非空的需求描述文本;不能直接从 \`### Requirement:\` 跳到 \`#### Scenario:\`。
201
+ 2. **第一行描述必须包含 SHALL 或 MUST**:验证器用 \`/\\b(SHALL|MUST)\\b/\` 检查第一行,缺失直接 ERROR。正确示例:\`系统 MUST 提供...\` / \`The system SHALL...\`;错误示例:仅写普通陈述句(如"提供客户查询能力")。
202
+
183
203
  7. **发现可用 Skill 并创建 tasks.md**:
184
204
  - 运行 \`zhuanspec skills list --json\` 获取当前环境中可用的 skill 列表及其 description
185
205
  - 在 \`proposal.md\` 的 **Skill Mapping** 段中基于 skill description 进行语义匹配:
@@ -188,6 +208,21 @@ Wave: W/N | Phase: Apply
188
208
  - 简单的代码修改(如枚举值增删)应匹配通用编码规范 skill,而非架构级 skill
189
209
  - 避免仅因模块名称或文件路径中的关键词而错误匹配
190
210
  - 在表格中说明匹配理由
211
+ - **任务分解规则(模板驱动)**:
212
+ - 每个任务按类型使用固定模板,必须填满所有字段(文件 → 位置 → 内容 → 验证):
213
+ * **新增文件任务**:必须包含 \`文件\`(完整相对路径+"新增"标记)、\`内容\`(类定义、依赖注入、核心方法签名+返回类型、关键逻辑流程、字段列表)、\`验证\`(正常+异常场景的输入输出断言)
214
+ * **修改文件任务**:必须包含 \`文件\`(完整相对路径+总行数)、\`修改位置\`(L行号范围+函数名)、\`内容\`(具体改什么和怎么改)、\`验证\`(修改后预期行为+回归验证)
215
+ - 任务编号严格使用 N.M 格式(如 1.1、2.3),不允许 3.2a 等非标准编号
216
+ - 每个任务必须包含 @ref 标签指向技术方案具体章节(格式:@ref:<tech-spec路径>#章节编号-章节名称,路径为实际定位到的技术方案文件相对路径)
217
+ - **技术方案摄取**:当技术方案文档存在时(按优先级:用户 --tech-spec 指定路径 > techDesign/tech-spec.md):
218
+ * 逐章解析 DB 表、接口方法、ES 索引、MQ、配置项等元素
219
+ * 每个技术元素必须对应至少一个任务
220
+ * 任务的"内容"段必须引用技术方案中的具体字段定义(如表字段列表、接口入参出参、枚举值)
221
+ * 新增 Coverage Checklist 段,确保覆盖率 >= 95%
222
+ - **禁止模糊描述**:
223
+ * 禁止:"创建 CustomerMapper" — 缺少文件路径、方法列表、关键逻辑
224
+ * 正确:"创建 CustomerMapper" + 文件路径 + 继承 BaseMapper<CustomerEntity> + 3个自定义方法签名 + 验证
225
+ * 任务描述必须自包含:AI 执行时不需要再读技术方案猜测实现细节
191
226
  - 将 \`tasks.md\` 起草为有序的小型、可验证工作项列表
192
227
  - 使用 \`@skill:<real-skill-name>\` 标注与 skill 匹配的任务(支持多个:\`@skill:name1,name2\`)
193
228
  - 仅当 skill 明确匹配任务时才标注,没有匹配的 skill 可省略标签
@@ -206,6 +241,10 @@ Wave: W/N | Phase: Apply
206
241
  3. No task may appear before a task it depends on
207
242
  4. You MUST add a "## Dependency Analysis" section at the end with "Status: COMPLETED"
208
243
  5. validate --strict will verify task ordering matches computed waves
244
+ 6. 如果多个任务描述中引用了相同文件路径,必须在 "## File Conflict Analysis" 表中声明:
245
+ - 各任务修改的具体区域(函数名、行号范围、配置节名称)
246
+ - 隔离策略:parallel(不同区域,可在同一 Wave 并行)或 serial(同区域,必须跨 Wave 串行)
247
+ - 若所有任务修改不同文件,无冲突时跳过此表或填写 N/A
209
248
 
210
249
  8. **测试 case 处理(仅 TDD 模式)**:
211
250
 
@@ -214,28 +253,44 @@ Wave: W/N | Phase: Apply
214
253
  - **无 case 模式**:普通 spec-driven 工作流,用户未提供测试 case 相关信息
215
254
 
216
255
  **【有 case 模式】**(必须执行以下步骤):
217
- - **【强制】获取测试 case 的方式**:
256
+ - **【强制】获取测试 case 的方式**(按优先级选择):
257
+ * **优先**:检查 \`./doc/\` 目录下是否存在 \`*-tdd-cases.md\` 文件(由技术方案 skill 自动转换生成)
258
+ - 存在 → 直接读取,无需重新获取原始 case
259
+ - 不存在 → 使用以下方式获取原始 case
218
260
  * 如果用户提供的是**链接**(如 zzcase 平台 URL):使用 \`@skill:zzcase-data-fetcher\` skill 直接读取
219
261
  * 如果用户提供 **taskId/bicId**:使用 \`@skill:zzcase-data-fetcher\` skill 通过参数获取
220
262
  * **禁止**使用 MCP 工具 \`zzcase_get_api_report_queryBaseCase\` 获取测试 case
221
263
  * 或手动录入测试 case
222
264
  - **【强制】创建 test-cases.md 文件**:
223
- * 使用 \`getTestCasesTemplate\` 模板(从 \`src/core/templates/index.ts\` 导出)
265
+ * 若已读取 \`./doc/*-tdd-cases.md\`:直接复制内容到 \`changes/<change-id>/test-cases.md\`,无需重新生成
266
+ * 若从原始 case 获取:使用 \`getTestCasesTemplate\` 模板(从 \`src/core/templates/index.ts\` 导出)
224
267
  * 文件路径:\`changes/<change-id>/test-cases.md\`
225
- * 填写获取时间、来源(taskId/bicId/manual)、测试 case 详情
226
- * 每个 TC-XXX 必须包含:前置条件、测试步骤、预期结果、验收点
268
+ * 填写获取时间、来源(tdd-cases.md / taskId/bicId/manual)、测试 case 详情
269
+ * 每个 TC-XXX 必须包含:前置条件、测试步骤、预期结果、验收点、**@layer 标注(BE/FE/BOTH)**
270
+ - **【强制】tasks.md @test-case 标注**:
271
+ * 读取 test-cases.md 中所有 TC-XXX 条目
272
+ * 为 tasks.md 中每个 task,**按语义匹配**找到相关 Case:
273
+ - task 描述中涉及「新建/编辑/删除」→ 匹配对应 CRUD Case
274
+ - task 描述中涉及「手机号去重/合并」→ 匹配手机号冲突相关 Case
275
+ - task 描述中涉及「租户/权限」→ 匹配权限隔离相关 Case
276
+ - task 描述中涉及「MQ/消息消费」→ 匹配 MQ 消费相关 Case
277
+ - task 描述中涉及「导出」→ 匹配导出相关 Case
278
+ * 匹配到 → 追加 \`@test-case:TC-XXX\`(可多个:\`@test-case:TC-022,TC-024\`)
279
+ * 匹配不到 → 不追加,该 task 走普通 Apply Agent
227
280
  - 在 \`tasks.md\` 增加 **Test Case Coverage** 表格(四列格式):
228
281
  | Task | 测试 Case ID | 测试 Case 文件路径 | 覆盖场景 |
229
282
  |------|-------------|-------------------|----------|
230
- * "测试 Case 文件路径" 列填写 BIC 路径层级格式
283
+ * "测试 Case 文件路径" 列填写 \`changes/<change-id>/test-cases.md\`
231
284
  - 使用 \`@test-case:TC-XXX\` 关联任务与测试 case
232
285
 
233
286
  ⚠️ **CHECKPOINT [TEST-CASE-COVERAGE]**(仅适用于有 case 模式):
234
287
  1. 每个 Requirement 应至少对应一个测试 case
235
288
  2. 测试 case 应覆盖正向和异常场景
236
- 3. **必须创建 test-cases.md 文件**(使用 \`getTestCasesTemplate\` 模板)
289
+ 3. **必须创建 test-cases.md 文件**(优先复用 \`./doc/*-tdd-cases.md\`,否则使用 \`getTestCasesTemplate\` 模板)
237
290
  4. Test Case Coverage 表格必须包含四列:Task、测试 Case ID、测试 Case 文件路径、覆盖场景
238
- 5. validate --strict 会验证测试 case 覆盖率(**阻塞级别**)
291
+ 5. **每个 TC-XXX 必须有 @layer 标注**(BE/FE/BOTH),无标注视为格式不完整
292
+ 6. **有 @test-case 标注的 task**,必须通过语义匹配找到对应 Case,不得随意指定无关 Case
293
+ 7. validate --strict 会验证测试 case 覆盖率(**阻塞级别**)
239
294
 
240
295
  **【无 case 模式】**(跳过测试 case 相关步骤):
241
296
  - 不创建 test-cases.md
@@ -656,8 +711,42 @@ The system SHALL provide...
656
711
  4. 必须在文件末尾添加 "## 依赖分析" 章节并标明"状态:已完成"
657
712
  5. validate --strict 会验证任务排序是否与计算的波次匹配
658
713
 
659
- 5. **创建 design.md(必选)**:
660
- 每个提案都必须创建 \`design.md\`,记录技术决策和架构思考:
714
+ ## Subagent 启动前上下文准备
715
+
716
+ 在编排层为每个 Subagent 准备上下文时,按三级策略注入:
717
+
718
+ ### L1 核心(全量注入,必须完整)
719
+ 1. 解析当前任务的 @test-case 标注 → 从 test-cases.md 中提取对应 TC 全文
720
+ 2. 解析当前任务的 @ref 标注 → 从技术方案文档中提取对应章节(按优先级查找:用户 --tech-spec 指定路径 > techDesign/tech-spec.md)
721
+ 3. 定位当前任务所属的 capability → 读取 specs/<capability>/spec.md
722
+
723
+ ### L2 关联(全量注入)
724
+ 4. design.md 全文
725
+ 5. Rules + Knowledge
726
+ 6. 当前 Wave 其他任务的一句话摘要 + 前置 Wave 完成结果摘要
727
+
728
+ ### L3 背景(摘要 + 按需读取)
729
+ 7. 技术方案其他章节 → 输出清单式摘要(“还包含 N 张表:xxx, yyy, ...,详见技术方案文档”)
730
+ 8. 其他 spec 的 Requirement 标题列表 → 输出清单("另有 M 个 spec,详见 specs/ 目录")
731
+
732
+ ### 最终校验
733
+ - L1+L2 总行数 > 800 行 → 对 L2 中 design.md 做章节裁剪(只保留当前任务相关章节)
734
+ - L1 不允许裁剪
735
+ - L3 的摘要必须包含所有元素名称,不允许用"等"或"..."省略
736
+
737
+ 5. **基于技术方案逐章映射到 design.md(必选)**:
738
+ 每个提案都必须创建 \`design.md\`,记录技术决策和架构思考。
739
+
740
+ **章节映射规则**:
741
+ - **必选章节**(所有提案必须包含):背景/Background、决策/Decision、风险/Risks
742
+ - **按需章节**(仅当技术方案涉及时才生成):
743
+ - 技术方案有建表 SQL / DDL → 生成 数据模型/Database Design 章节
744
+ - 技术方案有接口定义 / API / SCF / RPC → 生成 接口设计/API Contract 章节
745
+ - 技术方案有 ES / MQ / 缓存 → 生成 基础设施/Infrastructure 章节
746
+ - 技术方案有前端设计 → 生成 前端设计/Frontend Design 章节
747
+ -...(按照提供的技术方案补充 总之要覆盖全)
748
+ - 每个按需章节的内容从技术方案对应章节映射而来
749
+ - 无技术方案文档时,仅校验必选章节(向后兼容)
661
750
 
662
751
  \`\`\`markdown
663
752
  ## 背景
@@ -687,7 +776,7 @@ The system SHALL provide...
687
776
  - [...]
688
777
  \`\`\`
689
778
 
690
- **重要**:design.md 是知识提取的主要来源,归档时会自动提取其中的"决策"、"最佳实践"、"隐式约定"沉淀到项目知识库。
779
+ **重要**:design.md 是知识提取的主要来源,归档时会自动提取其中的“决策”、“最佳实践”、“隐式约定”沉淀到项目知识库。
691
780
  - [...]
692
781
  \`\`\`
693
782
 
@@ -1028,12 +1117,39 @@ Apply 阶段使用两种专用 Agent 类型执行代码实施任务,由编排
1028
1117
  - 相关的 spec 文件路径和内容(仅限该 task 涉及的部分)
1029
1118
  - 前序 wave 的完成摘要(而非完整输出)
1030
1119
  - Rules 和 Knowledge 上下文
1120
+ - **若 task 有 \`@test-case\` 标注**:从 \`test-cases.md\` 中提取对应 TC-XXX 的完整内容(含 @layer、BE 验收、FE 验收),注入给 TDD Apply Agent
1121
+ - **design.md 的层间依赖规则 + 架构约束**(所有 task 必须注入,确保 Agent 了解禁止的跨层调用)
1031
1122
 
1032
1123
  **禁止注入**:
1033
1124
  - 其他 wave 的 task 详情
1034
1125
  - 不相关的 skill 内容
1035
1126
  - 其他 subagent 的完整输出
1036
1127
 
1128
+ ## Skill 断流恢复
1129
+
1130
+ 如果在执行 @skill 过程中遇到异常:
1131
+ 1. 记录异常到 progress.json 的 skillCalls
1132
+ 2. 标记 afterAction: 'skip-and-continue'
1133
+ 3. 继续当前任务的后续实施步骤
1134
+ 4. 在任务完成报告中标注 "Skill [name] skipped due to [reason]"
1135
+
1136
+ ⚠️ Skill 是辅助工具,不应阻断主流程。任何 Skill 失败都不应导致任务失败。
1137
+
1138
+ ## Wave 集成验证
1139
+
1140
+ 每个 Wave 全部 Subagent 完成后,编排 Agent 执行集成验证:
1141
+ 1. 编译检查(\`mvn compile -q\` 或 \`tsc --noEmit\`)
1142
+ 2. 导入解析检查(本 Wave 新增 import 是否可解析)
1143
+ 3. 接口签名一致性(调用方参数与定义匹配)
1144
+ 4. TC 覆盖快照对比(如 tc-implementation-verify Skill 已安装):
1145
+ - 生成 \`metrics/tc-snapshot-wave-N.json\`
1146
+ - 与前一 Wave 快照对比
1147
+ - 回归(implemented → missing)→ 阻断
1148
+ - 进展(missing → implemented)→ 记录
1149
+
1150
+ 验证失败 → 修复后才进入下一 Wave。
1151
+ 验证通过 → 记录 Wave 完成状态,进入下一 Wave。
1152
+
1037
1153
  ---
1038
1154
 
1039
1155
  ### Rules 和 Knowledge 注入示例
@@ -276,6 +276,13 @@ export function getApplyChangeSkillTemplate() {
276
276
  - Error or blocker encountered → report and wait for guidance
277
277
  - User interrupts
278
278
 
279
+ ### Wave 完成后检查
280
+ 每个 Wave 的所有任务执行完毕后:
281
+ 1. 运行编译检查确保无错误
282
+ 2. 验证跨任务的接口一致性
283
+ 3. 如有 tc-implementation-verify Skill,运行 TC 覆盖快照
284
+ 4. 所有检查通过后才进入下一 Wave
285
+
279
286
  7. **On completion or pause, show status**
280
287
 
281
288
  Display:
@@ -414,7 +421,20 @@ What would you like to do?
414
421
  This skill supports the "actions on a change" model:
415
422
 
416
423
  - **Can be invoked anytime**: Before all artifacts are done (if tasks exist), after partial implementation, interleaved with other actions
417
- - **Allows artifact updates**: If implementation reveals design issues, suggest updating artifacts - not phase-locked, work fluidly`
424
+ - **Allows artifact updates**: If implementation reveals design issues, suggest updating artifacts - not phase-locked, work fluidly
425
+
426
+ ## Skill 执行完成后的衔接协议
427
+
428
+ 每个 Skill 执行完成后必须:
429
+ 1. 输出结构化结果文件(JSON 格式)到约定路径
430
+ 2. 明确声明接续动作(afterAction):
431
+ - continue: 继续当前任务流
432
+ - validate: 触发 zhuanspec validate
433
+ - pause: 暂停等用户确认
434
+ - review-gate: 结果进入审查门禁
435
+ 3. 如果 Skill 执行失败,不阻断 ZhuanSpec 主流程
436
+
437
+ ⚠️ Skill 是工具,不是流程控制器。Skill 不应改变 ZhuanSpec 阶段。`
418
438
  };
419
439
  }
420
440
  /**
@@ -6,7 +6,7 @@ const baseGuardrails = `**约束条件**
6
6
  const proposalGuardrails = `${baseGuardrails}\n- **强制澄清要求**:在创建任何提案文件之前,必须首先分析用户请求,识别所有不确定或模糊的方面(范围、技术选择、优先级、验收标准等)。如果发现任何模糊之处,必须停止并使用**选项式交互**(如 \`AskQuestion\` 工具)提问,获得明确答复后才能继续。严禁在不确定的情况下自行推测、假设或创建提案。严禁要求用户手动输入大段文字来回答澄清问题。
7
7
  - 识别任何模糊或歧义的细节,使用带预设选项的选择题在编辑文件之前询问必要的后续问题。
8
8
  - 在提案阶段不要编写任何代码。先完成 techDesign(需求技术方案)后再创建 proposal/specs/tasks,实施在批准后的应用阶段进行。
9
- - **TechDesign 目录识别**:proposal 阶段扫描 changes/ 目录,通过 progress.json 的 phase 字段识别 techDesign 目录,交互式确认复用。
9
+ - **TechDesign 目录识别**:proposal 阶段扫描 changes/ 目录,通过 progress.json 的 phase 字段识别 techDesign 目录,**自动复用**(无需询问用户)。复用时按优先级查找技术方案:① 用户通过 --tech-spec 指定的外部路径 ② changes/<name>/techDesign/tech-spec.md,找到后作为提案输入上下文。
10
10
  - **Phase 自动更新**:复用 techDesign 目录时,自动运行 \`zhuanspec progress set-phase <change-id> propose\` 更新 phase。`;
11
11
  const proposalOutputFormat = `**输出格式要求**
12
12
  每个步骤完成后,输出阶段性进度报告:
@@ -64,15 +64,48 @@ const proposalSteps = `**步骤**
64
64
  - **TechDesign 目录识别**:
65
65
  * 扫描 changes/ 目录下的所有变更
66
66
  * 检查每个变更的 metrics/progress.json 的 phase 字段
67
- * 如果存在 phase=techDesign 的目录,列为候选
68
- * 使用 AskQuestion 工具交互式确认:
69
- - 选择复用现有 techDesign 目录(列出所有候选)
70
- - 创建新目录
71
- - 其他(手动指定)
67
+ * 如果存在 phase=techDesign 的目录,**直接复用该目录,无需询问用户**,并输出提示:"techDesign 阶段已提前创建提案目录,直接复用该目录"
68
+ * 如果存在多个 phase=techDesign 目录,复用最新创建的目录
69
+ * 如果不存在 phase=techDesign 目录,创建新目录
70
+ - **技术方案定位(多源)**:
71
+ * 按优先级依次查找技术方案文档:
72
+ 1. 用户通过 \`--tech-spec <path>\` 指定的外部路径(绝对或相对路径均可)
73
+ 2. \`changes/<name>/techDesign/tech-spec.md\`
74
+ * 找到第一个存在且内容非空(非模板占位符)的文件,Read 全文作为 Propose 的输入上下文
75
+ * 将技术方案内容系统性注入后续 design.md、proposal.md 和 tasks.md
76
+ * 如果所有路径均不存在或为空占位符,按原流程从头生成提案
72
77
  - **Phase 初始化**:
73
78
  * 如果复用 techDesign 目录:运行 \`zhuanspec progress set-phase <change-id> propose\`
74
79
  * 如果新建目录:目录创建时自动初始化 phase=propose
75
- 1. **强制澄清检查(必须首先执行,不可跳过)**:
80
+ 1. **测试 case 来源确认(最先执行,禁止跳过)**:
81
+ 在进行任何澄清、设计或编写任何提案文件之前,使用 AskQuestion 工具询问用户:
82
+ - 选项 A:提供测试 case(有现成 case,走 TDD 模式)
83
+ - 选项 B:暂不提供测试 case
84
+ - 选项 C:其他(请在后续补充说明)
85
+
86
+ 用户选择"提供测试 case"时:
87
+ - 启用 **TDD 模式**:先获取测试 case,再基于 case 设计 spec 和任务
88
+ - **获取方式**:若用户提供链接(格式:\`https://zzcase.zhuanspirit.com/plan/taskDetail/module/{moduleId}/task/{taskId}\`),从 URL 路径中提取 \`moduleId\`,调用 MCP 工具 \`mcp__caseweb__GET_get2\` 读取数据;否则手动录入
89
+ - **创建 test-cases.md**(路径:\`changes/<change-id>/test-cases.md\`),使用 \`getTestCasesTemplate\` 模板,每个 TC-XXX 包含:前置条件、测试步骤、预期结果、验收点
90
+ - tasks.md 中使用 \`@test-case:TC-XXX\` 关联任务与测试 case,表格四列:Task、测试 Case ID、测试 Case 文件路径、覆盖场景
91
+ - 任务实施顺序调整为:先写测试 → 再写实现 → 验证测试通过
92
+
93
+ 用户选择"暂不提供":跳过,按常规流程继续
94
+ 用户选择"其他":等待用户补充说明后继续
95
+
96
+ ⚠️ **CHECKPOINT [TEST-CASE-INQUIRY]**:
97
+ 无论用户选择什么,必须**立即**将结果记录到 tasks.md 的 \`## Test Case Source Log\` 段
98
+ (若 tasks.md 尚未创建,先创建并写入此段,其余内容后续补充):
99
+ \`\`\`
100
+ ## Test Case Source Log
101
+ - 用户回答:[提供测试 case / 暂不提供 / 具体说明]
102
+ - TDD 模式:[启用 / 禁用]
103
+ - (如启用)测试 case 来源:[链接 / 手动录入 / bicId]
104
+ \`\`\`
105
+ 此段不得为空,validate --strict 会**无条件**检查其存在与内容,缺失直接报 ERROR。
106
+ 未完成此 checkpoint 记录之前,禁止执行步骤 2 及后续任何文件写入操作。
107
+
108
+ 2. **强制澄清检查(必须首先执行,不可跳过)**:
76
109
  - 仔细分析用户请求,识别所有不确定或模糊的方面:
77
110
  * 范围是否明确?(边界、包含/排除的内容)
78
111
  * 技术选择是否明确?(框架、库、架构模式)
@@ -102,12 +135,25 @@ const proposalSteps = `**步骤**
102
135
  - This section MUST NOT be empty or contain only HTML comments
103
136
  - NEVER proceed to proposal writing without completing this checkpoint
104
137
 
105
- 2. 选择一个唯一的动词开头的 \`change-id\`,但是必须注意,如果经过了techDesign阶段并且已经提前创建好了提案目录则必须直接复用,并在 \`zhuanspec/changes/<id>/\` 下搭建 \`proposal.md\`、\`tasks.md\` 和 \`design.md\`。
138
+ 3. 选择一个唯一的动词开头的 \`change-id\`,但是必须注意,如果经过了techDesign阶段并且已经提前创建好了提案目录则必须直接复用,并在 \`zhuanspec/changes/<id>/\` 下搭建 \`proposal.md\`、\`tasks.md\` 和 \`design.md\`。
106
139
  -如果复用了techDesign创建的提案目录,需要输出'techDesign阶段已经提前创建好提案目录,我将直接在该目录生成相关提案文件'
107
- 3. 将变更映射为具体的功能或要求,将多范围的工作分解为具有明确关系和顺序的不同规范增量。
108
- 4. 创建 \`design.md\`(必选),记录技术决策、最佳实践、隐式约定。归档时会自动提取这些内容沉淀到项目知识库。
109
- 5. 在 \`changes/<id>/specs/<capability>/spec.md\` 中起草规范增量(每个功能一个文件夹),使用 \`## ADDED|MODIFIED|REMOVED Requirements\`,每个要求至少包含一个 \`#### Scenario:\`,并在相关时交叉引用相关功能。
110
- 6. **发现可用 Skill 并创建 tasks.md**:
140
+ 4. 将变更映射为具体的功能或要求,将多范围的工作分解为具有明确关系和顺序的不同规范增量。
141
+ 5. 创建 \`design.md\`(必选),记录技术决策、最佳实践、隐式约定。归档时会自动提取这些内容沉淀到项目知识库。
142
+ - **如果用户已提供详细技术方案**,必须将以下内容系统性摄取到 design.md 对应章节,不得遗漏:
143
+ * 接口定义(方法签名、入参/出参字段、类型、枚举值)→ 写入 \`## 接口设计\`
144
+ * DB schema 变更、实体类字段 → 写入 \`## 数据模型\`
145
+ * 流程图/时序图 → 写入 \`## 业务流程\`
146
+ * 分层实现说明、关键逻辑 → 写入 \`## 实现细节\`
147
+ * 参数校验、错误码、异常处理 → 写入 \`## 边界条件 / 异常处理\`
148
+ - **摄取原则**:保留原始章节标题和结构,便于 apply 阶段按章节定位;不要压缩或省略具体字段定义
149
+ 6. 在 \`changes/<id>/specs/<capability>/spec.md\` 中起草规范增量(每个功能一个文件夹),使用 \`## ADDED|MODIFIED|REMOVED Requirements\`,每个要求至少包含一个 \`#### Scenario:\`,并在相关时交叉引用相关功能。
150
+
151
+ ⚠️ **CHECKPOINT [SPEC-REQUIREMENT-FORMAT]**:
152
+ 每个 \`### Requirement:\` 块写完后必须自检以下两点,违反任意一条 \`zhuanspec validate\` 会报 ERROR:
153
+ 1. **必须有需求描述文本**:header 之后、第一个 \`#### Scenario\` 之前,必须至少有一行非空的需求描述文本;不能直接从 \`### Requirement:\` 跳到 \`#### Scenario:\`。
154
+ 2. **第一行描述必须包含 SHALL 或 MUST**:验证器用 \`/\\b(SHALL|MUST)\\b/\` 检查第一行,缺失直接 ERROR。正确示例:\`系统 MUST 提供...\` / \`The system SHALL...\`;错误示例:仅写普通陈述句(如"提供客户查询能力")。
155
+
156
+ 7. **发现可用 Skill 并创建 tasks.md**:
111
157
  - 运行 \`zhuanspec skills list --json\` 获取当前环境中可用的 skill 列表及其 description
112
158
  - 在 \`proposal.md\` 的 **Skill Mapping** 段中基于 skill description 进行语义匹配:
113
159
  - 仔细阅读每个 skill 的 description,理解其具体功能和适用场景
@@ -115,6 +161,21 @@ const proposalSteps = `**步骤**
115
161
  - 简单的代码修改(如枚举值增删)应匹配通用编码规范 skill,而非架构级 skill
116
162
  - 避免仅因模块名称或文件路径中的关键词而错误匹配
117
163
  - 在表格中说明匹配理由
164
+ - **任务分解规则(模板驱动)**:
165
+ - 每个任务按类型使用固定模板,必须填满所有字段(文件 → 位置 → 内容 → 验证):
166
+ * **新增文件任务**:必须包含 \`文件\`(完整相对路径+"新增"标记)、\`内容\`(类定义、依赖注入、核心方法签名+返回类型、关键逻辑流程、字段列表)、\`验证\`(正常+异常场景的输入输出断言)
167
+ * **修改文件任务**:必须包含 \`文件\`(完整相对路径+总行数)、\`修改位置\`(L行号范围+函数名)、\`内容\`(具体改什么和怎么改)、\`验证\`(修改后预期行为+回归验证)
168
+ - 任务编号严格使用 N.M 格式(如 1.1、2.3),不允许 3.2a 等非标准编号
169
+ - 每个任务必须包含 @ref 标签指向技术方案具体章节(格式:@ref:<tech-spec路径>#章节编号-章节名称,路径为实际定位到的技术方案文件相对路径)
170
+ - **技术方案摄取**:当技术方案文档存在时(按优先级:用户 --tech-spec 指定路径 > techDesign/tech-spec.md):
171
+ * 逐章解析 DB 表、接口方法、ES 索引、MQ、配置项等元素
172
+ * 每个技术元素必须对应至少一个任务
173
+ * 任务的"内容"段必须引用技术方案中的具体字段定义(如表字段列表、接口入参出参、枚举值)
174
+ * 新增 Coverage Checklist 段,确保覆盖率 >= 95%
175
+ - **禁止模糊描述**:
176
+ * 禁止:"创建 CustomerMapper" — 缺少文件路径、方法列表、关键逻辑
177
+ * 正确:"创建 CustomerMapper" + 文件路径 + 继承 BaseMapper<CustomerEntity> + 3个自定义方法签名 + 验证
178
+ * 任务描述必须自包含:AI 执行时不需要再读技术方案猜测实现细节
118
179
  - 将 \`tasks.md\` 起草为有序的小型、可验证工作项列表
119
180
  - 使用 \`@skill:<real-skill-name>\` 标注与 skill 匹配的任务(支持多个:\`@skill:name1,name2\`)
120
181
  - 仅当 skill 明确匹配任务时才标注,没有匹配的 skill 可省略标签
@@ -135,43 +196,6 @@ const proposalSteps = `**步骤**
135
196
  5. validate --strict will verify task ordering matches computed waves
136
197
 
137
198
 
138
- 7. **测试 case 来源询问**(强制询问):
139
- - 使用 AskQuestion 工具询问用户是否提供测试 case:
140
- * 选项 A:提供测试 case(有现成 case,走 TDD 模式)
141
- * 选项 B:暂不提供测试 case
142
- * 选项 C:其他(请在后续补充说明)
143
- - 用户选择处理:
144
- * 选择"提供测试 case":
145
- - 启用 **TDD 模式**:先获取测试 case,再基于 case 设计 spec 和任务
146
- - **【强制】获取测试 case 的方式**:
147
- * 如果用户提供的是**链接**(如 zzcase 平台 URL):使用 \`@skill:zzcase-data-fetcher\` skill 直接读取
148
- * 如果用户提供 **taskId/bicId**:使用 \`@skill:zzcase-data-fetcher\` skill 通过参数获取
149
- * **禁止**使用 MCP 工具 \`zzcase_get_api_report_queryBaseCase\` 获取测试 case
150
- - 或手动录入测试 case
151
- - **【强制】创建 test-cases.md 文件**:
152
- * 使用 \`getTestCasesTemplate\` 模板(从 \`src/core/templates/index.ts\` 导出)
153
- * 文件路径:\`changes/<change-id>/test-cases.md\`
154
- * 填写获取时间、来源(taskId/bicId/manual)、测试 case 详情
155
- * 每个 TC-XXX 必须包含:前置条件、测试步骤、预期结果、验收点
156
- - 在 \`tasks.md\` 的 **Test Case Coverage** 表格中使用 \`@test-case:TC-XXX\` 关联任务与测试 case
157
- - **表格格式要求**(四列):
158
- | Task | 测试 Case ID | 测试 Case 文件路径 | 覆盖场景 |
159
- |------|-------------|-------------------|----------|
160
- | T1 | TC-001 | \`退货退款 > 创建售后 > 三选一页面 > 组装机弹窗\` | 描述 |
161
- * "测试 Case 文件路径" 列填写 BIC 路径层级格式
162
- - 任务实施顺序调整为:先写测试 → 再写实现 → 验证测试通过
163
- * 选择"暂不提供":跳过此步骤,按常规流程继续
164
- * 选择"其他":等待用户补充说明后继续
165
-
166
- ⚠️ **CHECKPOINT [TEST-CASE-COVERAGE]**:
167
- 1. 如果用户提供测试 case,启用 TDD 模式,每个 Requirement 必须对应测试 case
168
- 2. 测试 case 应覆盖正向和异常场景
169
- 3. **必须创建 test-cases.md 文件**(使用 \`getTestCasesTemplate\` 模板)
170
- 4. Test Case Coverage 表格必须包含四列:Task、测试 Case ID、测试 Case 文件路径、覆盖场景
171
- 5. validate --strict 会验证测试 case 覆盖率(警告级别,不阻塞)
172
- 6. 记录询问结果到 tasks.md 的 **Test Case Source Log** 段
173
-
174
-
175
199
  8. 【自动验证与修复】:
176
200
  运行 \`zhuanspec validate <id> --strict --auto-fix\` 进行验证:
177
201
  - 如果验证通过(PASS):继续下一步
@@ -182,6 +206,15 @@ const proposalSteps = `**步骤**
182
206
  * 循环结束后仍未通过:输出错误报告,等待人工干预
183
207
  - 验证通过后,输出提案摘要
184
208
 
209
+ 8.5. 【技术方案覆盖度自动完善】(当存在技术方案文档时:techDesign/ 目录下的 tech-spec.md,或用户指定了本地技术方案路径):
210
+ - 运行覆盖度检查(通过 Skill \`@skill:tech-spec-coverage-check\` 或内置 \`zhuanspec validate <change-id> --strict\`)
211
+ - 如果发现未覆盖的技术方案元素,**自动补充到对应提案文件**:
212
+ * 未覆盖的数据库表/API → 自动追加到 specs/ 对应 spec.md 的 Requirements 中
213
+ * 未覆盖的类名/接口 → 自动追加到 tasks.md 作为新任务项
214
+ * 未覆盖的配置项/基础设施 → 自动追加到 design.md 对应章节
215
+ - 补充完成后重新检查覆盖率,确认 >= 90%
216
+ - 将覆盖度报告写入 metrics/tech-spec-coverage.json
217
+
185
218
  9. 【输出提案摘要】:
186
219
  • 变更原因、内容、影响范围
187
220
  • 关键 Requirements
@@ -228,24 +261,78 @@ const applySteps = `**步骤**
228
261
  → **Agent 类型选择**:根据任务是否标注 \`@test-case\` 选择:
229
262
  * 无 \`@test-case\` 标注 → 使用 \`applyAgent\`(普通代码实施)
230
263
  * 有 \`@test-case:TC-XXX\` 标注 → 使用 \`tddApplyAgent\`(TDD 模式)
231
- → **Rules 和 Knowledge 注入**:编排 Agent MUST 在每个 subagent prompt 中注入:
232
- * Rules:根据任务的 \`@skill\` 标注选择性注入 \`api-design.md\`、\`dao-standards.md\`、\`coding-standards.md\` 等
233
- * Knowledge:始终注入 \`knowledge/index.md\` 知识索引摘要
234
- * Troubleshooting:注入与任务相关的踩坑警告
235
- → Subagent 上下文隔离:仅注入当前任务、关联 skill、相关 spec、Rules/Knowledge
264
+ → **Subagent 上下文注入(三级策略)**:
265
+
266
+ **L1 核心(全量注入,不可省略)**:
267
+ ① spec 内容:当前任务对应的 specs/<capability>/spec.md 全文
268
+ ② test-cases:当前任务 @test-case:TC-XXX 对应的 TC 详情(从 test-cases.md 提取)
269
+ ③ techDesign 实施细节:当前任务 @ref 指向的技术方案章节(从 techDesign/tech-spec.md 提取)
270
+
271
+ **L2 关联(全量注入)**:
272
+ ④ design.md 全文(已有,保持不变)
273
+ ⑤ Rules + Knowledge(已有,保持不变)
274
+ ⑥ 当前 Wave 其他任务摘要 + 前置 Wave 完成结果
275
+
276
+ **L3 背景(摘要嵌入 + 提供 Read 路径)**:
277
+ ⑦ 技术方案其他章节摘要(列出所有元素清单,如"10 张表:t_customer, t_customer_tag, ...")
278
+ ⑧ 其他 spec 摘要
279
+ → 提供完整文件路径,Subagent 如需详情可自行 Read
280
+
281
+ **关键约束**:
282
+ - L1 和 L2 必须全量注入,不允许摘要或截断
283
+ - L3 的摘要必须列出所有元素清单,确保 Subagent 知道完整范围
284
+ - 最终校验:L1+L2 总行数超过 800 行时,对 L2 中的 design.md 做章节裁剪(只保留与当前任务相关的章节),但不允许裁剪 L1
236
285
  - **如果 tasks.md 无依赖声明**:
237
286
  → 按顺序执行(见下方步骤 3-5)
238
287
  3. **按顺序实施任务**(无依赖声明时)- 保持编辑最小化并专注于请求的变更。如果任务标注了 \`@skill:<skill-name>\`,直接调用对应 skill 获取指导后再实施。
288
+
289
+ **Subagent 调用 @skill 后的行为**:
290
+ 1. 执行 @skill 标注的 Skill
291
+ 2. 读取 Skill 输出的 JSON 结果
292
+ 3. 无论 Skill 成功/失败,**必须回到当前任务的实施步骤继续**
293
+ 4. 如果 Skill 异常或超时,跳过 Skill 继续实施
294
+
239
295
  - **阶段职责(按 Agent 类型区分)**:
240
296
  * **applyAgent(普通模式)**:不生成单元测试文件,单测生成与验证统一在 Review 阶段执行
241
297
  * **tddApplyAgent(TDD 模式,任务有 \`@test-case\` 标注)**:基于 test-cases.md 先写测试再实现代码
242
298
  4. **确认完成** - 在更新状态之前确保 \`tasks.md\` 中的每个项目都已完成。
243
299
  5. **更新清单** - 所有工作完成后,将每个任务设置为 \`- [x]\`,以便列表反映实际情况。
244
300
  6. **处理 Subagent 状态报告**(Wave 并行执行时):
245
- - **DONE**:继续下一任务
246
- - **DONE_WITH_CONCERNS**:记录 concerns 并评估是否需要修复
247
- - **BLOCKED**:评估 blocker 类型并决定处理策略(提供上下文/换更强模型/拆分任务)
248
- - **NEEDS_CONTEXT**:提供缺失信息并重新启动 subagent
301
+ - **必须转发进度汇报**:每个 subagent 完成后,将其输出的 \`━━━ ✅ 任务完成\` 进度块原文转发输出给用户
302
+ - **DONE**:转发进度汇报 → 继续下一任务
303
+ - **DONE_WITH_CONCERNS**:转发进度汇报 → 记录 concerns 并评估是否需要修复
304
+ - **BLOCKED**:转发进度汇报 → 评估 blocker 类型并决定处理策略(提供上下文/换更强模型/拆分任务)
305
+ - **NEEDS_CONTEXT**:转发进度汇报 → 提供缺失信息并重新启动 subagent
306
+ - 所有任务报告文件均保存在 \`changes/<change-id>/reports/\` 目录,可告知用户按 task-id 查阅
307
+ 7. **Wave 完成后集成验证**(Wave 并行执行时):
308
+ 每个 Wave 全部任务完成后,编排 Agent 自动执行以下检查:
309
+
310
+ 1. **编译检查**:运行项目编译命令,确保无编译错误
311
+ - Java: \`mvn compile -q\` / \`gradle compileJava\`
312
+ - TypeScript: \`tsc --noEmit\`
313
+ - 编译失败 → 阻断后续 Wave,定位失败文件并修复
314
+
315
+ 2. **导入检查**:验证本 Wave 新增的 import 是否都能解析
316
+ - 搜索本 Wave 修改文件中的 import 语句
317
+ - 检查 import 的类/模块是否存在
318
+
319
+ 3. **接口签名一致性**:
320
+ - 提取本 Wave 新增/修改的接口定义(参数类型、返回类型)
321
+ - 检查调用方的参数是否与定义一致
322
+
323
+ 4. **TC 覆盖快照与回归检测**:
324
+ - 如果 tc-implementation-verify Skill 已安装:
325
+ a. 运行 tc-implementation-verify,生成当前 Wave 的 TC 覆盖快照
326
+ b. 将结果写入 \`metrics/tc-snapshot-wave-N.json\`
327
+ c. 读取上一个 Wave 的快照 \`metrics/tc-snapshot-wave-(N-1).json\`
328
+ d. 对比两个快照:
329
+ - 新增 implemented 的 TC → 记录为进展
330
+ - 从 implemented 变为 missing 的 TC → **回归告警**,阻断后续 Wave
331
+ - missing 数量未减少 → 记录警告但不阻断
332
+ e. 输出对比结果到 \`metrics/tc-wave-comparison.json\`
333
+ - 如果 Skill 未安装:跳过此步骤
334
+
335
+ 任何检查失败 → 修复后再进入下一个 Wave
249
336
  8. 需要额外上下文时,参考 \`zhuanspec list\` 或 \`zhuanspec show <item>\`。
250
337
  9. **触发审查门禁** - 所有任务完成后选项式提问用户是否进入 Review 阶段`;
251
338
  const applyGuardrails = `${baseGuardrails}\n- **Wave 并行执行**:当 tasks.md 包含 \`@depends\` 时,按 Wave 编号串行执行,Wave 内任务通过 Agent tool 并行启动 subagent。
@@ -339,7 +426,7 @@ const designReferences = `**参考**
339
426
  - 使用 \`zhuanspec techDesign --help\` 查看 CLI 命令选项(用于生成请求文档或验证现有设计)`;
340
427
  const reviewGuardrails = `${baseGuardrails}\n- **门禁审查阶段**:review 命令用于执行三轨并行校验并汇总结论。
341
428
  - **强制审查**:所有变更在归档前必须通过三轨门禁,确保代码质量、测试覆盖与 Spec-Code 一致性。
342
- - **Skill 触发要求**:必须触发 \`code-review-expert\`(代码审查轨)与 \`generate-mockito-unit-test-skill\`(单测轨)。`;
429
+ - **Skill 触发要求**:必须触发 \`code-review-expert\`(代码审查轨)与 \`generate-mockito-unit-test\`(单测轨)。`;
343
430
  const reviewSteps = `**步骤**
344
431
  1. **确定变更 ID 并设置 Phase**:
345
432
  - 如果此提示已包含特定的变更 ID,请使用该值
@@ -349,15 +436,28 @@ const reviewSteps = `**步骤**
349
436
  - **轨道 A:Code Review 轨**
350
437
  - 使用 Skill 工具调用 \`code-review-expert\` skill
351
438
  - 输出 \`code-review-report.md\`,记录 Critical/Important 问题
439
+ - skill 完成后,**AI 将结果写入** \`changes/<id>/review/code-review-result.json\`,格式:
440
+ \`\`\`json
441
+ { "criticalCount": 0, "importantCount": 0, "infoCount": 0, "issues": [], "sonarStatus": "skip", "loopCount": 0 }
442
+ \`\`\`
352
443
  - **轨道 B:Unit Test 轨(Skill)**
353
- - 使用 Skill 工具调用 \`generate-mockito-unit-test-skill\`
444
+ - 使用 Skill 工具调用 \`generate-mockito-unit-test\`
354
445
  - 对缺失场景补齐单测并执行测试命令,输出单测结果
446
+ - skill 完成后,**AI 将结果写入** \`changes/<id>/review/unit-test-result.json\`,格式:
447
+ \`\`\`json
448
+ { "testPassed": true, "passRate": 100, "coverage": 85, "coverageThreshold": 80, "newTestsGenerated": [], "failedTests": [], "loopCount": 0 }
449
+ \`\`\`
355
450
  - **轨道 C:Spec-Code 一致性轨**
356
451
  - 运行 \`zhuanspec validate <change-id> --strict\`
357
452
  - 确认 \`spec-code-consistent\` 规则通过
453
+ - validate 完成后,**AI 将结果写入** \`changes/<id>/review/spec-consistency-result.json\`,格式:
454
+ \`\`\`json
455
+ { "consistencyRate": 100, "totalRequirements": 0, "totalScenarios": 0, "coveredScenarios": 0, "uncoveredScenarios": [], "mapping": [], "loopCount": 0 }
456
+ \`\`\`
358
457
  3. **汇总执行 CLI Review**:
359
458
  - 运行 \`zhuanspec review <change-id>\`
360
- - CLI 汇总三轨结果并生成 \`review-report.md\` 及 JSON 结果文件
459
+ - CLI 读取三个 JSON,生成 \`changes/<id>/review/review-report.md\`
460
+ - 如果 skill JSON 未写入,CLI 将打印缺失文件列表并退出
361
461
  4. **审查结果处理**:
362
462
  - **PASS**:三轨全部通过(CR=PASS、UT=PASS、Spec-Code=PASS)且 Critical=0,可以继续归档
363
463
  - **FAIL**:输出问题列表,需要修复后重新审查
@@ -369,9 +469,9 @@ const reviewSteps = `**步骤**
369
469
  - 提示可以使用 \`/zhuanspec:archive\` 进行归档`;
370
470
  const reviewReferences = `**参考**
371
471
  - 使用 \`zhuanspec review --help\` 查看完整选项
372
- - 审查报告包含:\`code-review-result.json\`、\`unit-test-result.json\`、\`spec-consistency-result.json\`、\`review-report.md\`
472
+ - 审查报告文件均位于 \`changes/<id>/review/\` 目录下:\`code-review-result.json\`、\`unit-test-result.json\`、\`spec-consistency-result.json\`、\`review-report.md\`
373
473
  - 单元测试覆盖率阈值默认 80%,可通过 \`--coverage-threshold\` 调整
374
- - \`code-review-expert\` Skill 输出保存到 \`zhuanspec/changes/<id>/metrics/code-review-report.md\``;
474
+ - \`code-review-expert\` Skill 结果由 AI 写入 \`changes/<id>/review/code-review-result.json\`,\`generate-mockito-unit-test\` Skill 结果由 AI 写入 \`changes/<id>/review/unit-test-result.json\``;
375
475
  const knowledgeGuardrails = `${baseGuardrails}\n- **知识管理阶段**:knowledge 命令用于管理项目级知识库(最佳实践、陷阱、隐式约定)。
376
476
  - **跨变更积累**:知识不绑定单个变更,是长期积累的项目资产。
377
477
  - **职责分离**: