@zhuan-ai/zhuanspec 2.2.4 → 2.4.8

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 (103) hide show
  1. package/bin/zhuanspec-hook.js +3 -0
  2. package/dist/cli/hooks.d.ts +14 -0
  3. package/dist/cli/hooks.js +465 -0
  4. package/dist/cli/index.js +100 -0
  5. package/dist/commands/artifact-workflow.js +15 -34
  6. package/dist/commands/design.d.ts +42 -0
  7. package/dist/commands/design.js +337 -0
  8. package/dist/commands/progress.d.ts +32 -0
  9. package/dist/commands/progress.js +278 -0
  10. package/dist/commands/review.d.ts +32 -0
  11. package/dist/commands/review.js +472 -0
  12. package/dist/commands/validate.d.ts +14 -0
  13. package/dist/commands/validate.js +161 -10
  14. package/dist/core/archive.d.ts +1 -0
  15. package/dist/core/archive.js +45 -3
  16. package/dist/core/completions/command-registry.js +67 -0
  17. package/dist/core/configurators/slash/amazon-q.js +32 -2
  18. package/dist/core/configurators/slash/antigravity.js +8 -2
  19. package/dist/core/configurators/slash/auggie.js +16 -1
  20. package/dist/core/configurators/slash/base.js +1 -1
  21. package/dist/core/configurators/slash/claude.d.ts +4 -0
  22. package/dist/core/configurators/slash/claude.js +56 -1
  23. package/dist/core/configurators/slash/cline.js +8 -2
  24. package/dist/core/configurators/slash/codebuddy.js +22 -1
  25. package/dist/core/configurators/slash/codex.js +21 -0
  26. package/dist/core/configurators/slash/costrict.js +15 -0
  27. package/dist/core/configurators/slash/crush.js +22 -1
  28. package/dist/core/configurators/slash/cursor.js +22 -1
  29. package/dist/core/configurators/slash/factory.js +16 -1
  30. package/dist/core/configurators/slash/gemini.js +8 -2
  31. package/dist/core/configurators/slash/github-copilot.js +19 -1
  32. package/dist/core/configurators/slash/iflow.js +22 -1
  33. package/dist/core/configurators/slash/kilocode.js +4 -1
  34. package/dist/core/configurators/slash/opencode.js +27 -0
  35. package/dist/core/configurators/slash/qoder.d.ts +4 -0
  36. package/dist/core/configurators/slash/qoder.js +59 -1
  37. package/dist/core/configurators/slash/qwen.js +8 -2
  38. package/dist/core/configurators/slash/roocode.js +8 -2
  39. package/dist/core/configurators/slash/windsurf.js +8 -2
  40. package/dist/core/dashboard/metrics.d.ts +33 -0
  41. package/dist/core/dashboard/metrics.js +114 -0
  42. package/dist/core/hooks/collect-knowledge.d.ts +16 -0
  43. package/dist/core/hooks/collect-knowledge.js +203 -0
  44. package/dist/core/hooks/context-load-hook.d.ts +25 -0
  45. package/dist/core/hooks/context-load-hook.js +159 -0
  46. package/dist/core/hooks/deviation-check.d.ts +27 -0
  47. package/dist/core/hooks/deviation-check.js +403 -0
  48. package/dist/core/hooks/deviation-handler.d.ts +43 -0
  49. package/dist/core/hooks/deviation-handler.js +98 -0
  50. package/dist/core/hooks/init.d.ts +14 -0
  51. package/dist/core/hooks/init.js +244 -0
  52. package/dist/core/hooks/notify-milestone.d.ts +14 -0
  53. package/dist/core/hooks/notify-milestone.js +170 -0
  54. package/dist/core/hooks/post-apply.d.ts +29 -0
  55. package/dist/core/hooks/post-apply.js +173 -0
  56. package/dist/core/hooks/post-archive.d.ts +7 -0
  57. package/dist/core/hooks/post-archive.js +208 -0
  58. package/dist/core/hooks/pre-apply.d.ts +34 -0
  59. package/dist/core/hooks/pre-apply.js +139 -0
  60. package/dist/core/hooks/pre-archive.d.ts +7 -0
  61. package/dist/core/hooks/pre-archive.js +50 -0
  62. package/dist/core/hooks/record-progress.d.ts +49 -0
  63. package/dist/core/hooks/record-progress.js +494 -0
  64. package/dist/core/hooks/review-hooks.d.ts +89 -0
  65. package/dist/core/hooks/review-hooks.js +345 -0
  66. package/dist/core/hooks/review-orchestrator.d.ts +40 -0
  67. package/dist/core/hooks/review-orchestrator.js +146 -0
  68. package/dist/core/hooks/summarize.d.ts +15 -0
  69. package/dist/core/hooks/summarize.js +282 -0
  70. package/dist/core/hooks/user-input-hook.d.ts +25 -0
  71. package/dist/core/hooks/user-input-hook.js +179 -0
  72. package/dist/core/init.d.ts +8 -0
  73. package/dist/core/init.js +251 -23
  74. package/dist/core/parsers/requirement-blocks.js +13 -10
  75. package/dist/core/templates/agents-template.d.ts +1 -1
  76. package/dist/core/templates/agents-template.js +510 -243
  77. package/dist/core/templates/index.d.ts +1 -0
  78. package/dist/core/templates/index.js +1 -0
  79. package/dist/core/templates/skill-templates.js +46 -152
  80. package/dist/core/templates/slash-command-templates.d.ts +1 -1
  81. package/dist/core/templates/slash-command-templates.js +352 -20
  82. package/dist/core/templates/tasks-template.d.ts +7 -0
  83. package/dist/core/templates/tasks-template.js +130 -24
  84. package/dist/core/templates/tdd-tasks-template.d.ts +3 -0
  85. package/dist/core/templates/tdd-tasks-template.js +91 -38
  86. package/dist/core/templates/test-cases-template.d.ts +41 -0
  87. package/dist/core/templates/test-cases-template.js +128 -0
  88. package/dist/core/validation/strict-rules.d.ts +44 -5
  89. package/dist/core/validation/strict-rules.js +302 -8
  90. package/dist/core/validation/validator.js +52 -2
  91. package/dist/core/view.d.ts +1 -0
  92. package/dist/core/view.js +60 -2
  93. package/dist/mcp/index.d.ts +28 -0
  94. package/dist/mcp/index.js +31 -0
  95. package/dist/utils/file-system.d.ts +1 -0
  96. package/dist/utils/file-system.js +11 -0
  97. package/dist/utils/item-discovery.js +24 -2
  98. package/dist/utils/phase-utils.d.ts +36 -0
  99. package/dist/utils/phase-utils.js +117 -0
  100. package/package.json +22 -23
  101. package/schemas/spec-driven/schema.yaml +45 -31
  102. package/schemas/spec-driven/templates/spec.md +142 -5
  103. package/schemas/spec-driven/templates/tasks.md +73 -9
@@ -1,12 +1,77 @@
1
1
  const baseGuardrails = `**约束条件**
2
2
  - 优先采用简单、最小化的实现,仅在请求或明确需要时添加复杂性。
3
3
  - 将更改严格限制在请求的结果范围内。
4
+ - **知识库参考**:开始任何阶段前,先检查 \`zhuanspec/knowledge/\` 目录。使用 \`rg "[关键词]" zhuanspec/knowledge/\` 搜索相关陷阱和最佳实践,避免重复踩坑。阅读 \`zhuanspec/knowledge/index.md\` 了解项目级知识摘要。
4
5
  - 如果需要额外的 ZhuanSpec 约定或澄清,请参考 \`zhuanspec/AGENTS.md\`(位于 \`zhuanspec/\` 目录内 - 如果看不到,请运行 \`ls zhuanspec\` 或 \`zhuanspec update\`)。`;
5
6
  const proposalGuardrails = `${baseGuardrails}\n- **强制澄清要求**:在创建任何提案文件之前,必须首先分析用户请求,识别所有不确定或模糊的方面(范围、技术选择、优先级、验收标准等)。如果发现任何模糊之处,必须停止并使用**选项式交互**(如 \`AskQuestion\` 工具)提问,获得明确答复后才能继续。严禁在不确定的情况下自行推测、假设或创建提案。严禁要求用户手动输入大段文字来回答澄清问题。
6
7
  - 识别任何模糊或歧义的细节,使用带预设选项的选择题在编辑文件之前询问必要的后续问题。
7
- - 在提案阶段不要编写任何代码。仅创建设计文档(proposal.md、tasks.md、design.md 和规范增量)。实施在批准后的应用阶段进行。`;
8
+ - 在提案阶段不要编写任何代码。先完成 techDesign(需求技术方案)后再创建 proposal/specs/tasks,实施在批准后的应用阶段进行。
9
+ - **TechDesign 目录识别**:proposal 阶段扫描 changes/ 目录,通过 progress.json 的 phase 字段识别 techDesign 目录,交互式确认复用。
10
+ - **Phase 自动更新**:复用 techDesign 目录时,自动运行 \`zhuanspec progress set-phase <change-id> propose\` 更新 phase。`;
11
+ const proposalOutputFormat = `**输出格式要求**
12
+ 每个步骤完成后,输出阶段性进度报告:
13
+ \`\`\`
14
+ ### 阶段进度报告
15
+
16
+ **当前阶段**: Propose
17
+ **当前步骤**: [步骤名称]
18
+ **步骤状态**: ✅ 完成 / ⏳ 进行中 / ❌ 失败
19
+ **输出文件**: [创建/修改的文件列表]
20
+ **下一步**: [下一步骤描述]
21
+ \`\`\`
22
+
23
+ 最终输出包含:
24
+ 1. **提案摘要** - 变更原因、内容、影响范围
25
+ 2. **关键 Requirements** - 列出所有 ADDED/MODIFIED Requirements
26
+ 3. **任务分布** - Wave 分布和任务数量
27
+ 4. **验证结果** - validate --strict 输出`;
28
+ const applyOutputFormat = `**输出格式要求**
29
+ - 每个任务完成后:\`[x] Task N.M - [完成描述]\`
30
+ - Wave 完成后:\`Wave N 完成 - [任务列表]\`
31
+ - 最终输出包含:
32
+ 1. **实施摘要** - 完成的任务数量、修改的文件
33
+ 2. **偏差检测结果** - 是否有偏离提案范围的修改
34
+ 3. **下一步建议** - Review 阶段或继续任务`;
35
+ const reviewOutputFormat = `**输出格式要求**
36
+ - 每轨完成后:\`[轨名称] ✅ PASS / ❌ FAIL - [关键指标摘要]\`
37
+ - 三轨并行输出汇总格式:
38
+ \`\`\`
39
+ ### Review 阶段进度报告
40
+
41
+ **轨道 A (Code Review)**: ✅ PASS / ❌ FAIL
42
+ - Critical Issues: [数量]
43
+ - Important Issues: [数量]
44
+
45
+ **轨道 B (Unit Test)**: ✅ PASS / ❌ FAIL
46
+ - Coverage: [百分比]
47
+ - Tests Passed: [数量]/[总数]
48
+
49
+ **轨道 C (Spec-Code)**: ✅ PASS / ❌ FAIL
50
+ - Consistency Rate: [百分比]
51
+ \`\`\`
52
+ - 最终输出:review-report.md 路径、归档建议`;
8
53
  const proposalSteps = `**步骤**
9
- 0. 审查 \`zhuanspec/project.md\`,运行 \`zhuanspec list\` 和 \`zhuanspec list --specs\`,并检查相关代码或文档(例如,通过 \`rg\`/\`ls\`)以将提案建立在当前行为基础上;注意任何需要澄清的空白。
54
+ 0. **检查知识库、加载项目知识并识别 TechDesign 目录**:
55
+ - 运行 \`rg "[关键词]" zhuanspec/knowledge/\` 搜索相关陷阱和最佳实践,避免重复踩坑
56
+ - 阅读 \`zhuanspec/knowledge/index.md\` 了解项目级知识摘要
57
+ - **加载项目知识**:调用 \`@skill:load-project-knowledge\` 进行渐进式加载:
58
+ * 输入:domain(当前项目)、keywords(从需求描述提取)
59
+ * 获取:matched_services(涉及的服务列表)、search_priority(检索优先路径)、architecture_constraints(架构约束)
60
+ * 使用:后续代码定位使用 search_priority 限定范围,方案设计检查 architecture_constraints
61
+ - 审查 \`zhuanspec/project.md\`,运行 \`zhuanspec list\` 和 \`zhuanspec list --specs\`
62
+ - 检查相关代码或文档(例如,
63
+ 通过 \`rg\`/\`ls\`)以将提案建立在当前行为基础上;注意任何需要澄清的空白。
64
+ - **TechDesign 目录识别**:
65
+ * 扫描 changes/ 目录下的所有变更
66
+ * 检查每个变更的 metrics/progress.json 的 phase 字段
67
+ * 如果存在 phase=techDesign 的目录,列为候选
68
+ * 使用 AskQuestion 工具交互式确认:
69
+ - 选择复用现有 techDesign 目录(列出所有候选)
70
+ - 创建新目录
71
+ - 其他(手动指定)
72
+ - **Phase 初始化**:
73
+ * 如果复用 techDesign 目录:运行 \`zhuanspec progress set-phase <change-id> propose\`
74
+ * 如果新建目录:目录创建时自动初始化 phase=propose
10
75
  1. **强制澄清检查(必须首先执行,不可跳过)**:
11
76
  - 仔细分析用户请求,识别所有不确定或模糊的方面:
12
77
  * 范围是否明确?(边界、包含/排除的内容)
@@ -18,10 +83,11 @@ const proposalSteps = `**步骤**
18
83
  * 数据获取来源是否明确?(从数据库、API、文件、外部服务、历史逻辑复用)
19
84
  * 服务分层是否明确?(前端、后端、数据库、API、服务、4层架构、3层架构、2层架构、领域模型)
20
85
  * 依赖关系是否明确?(依赖哪些服务、依赖哪些库、依赖哪些组件)
86
+ * 测试 case 是否提供?(是否已有现成测试 case、BIC 系统 taskId/bicId)
21
87
  * 其他不明确?(其他不明确的情况)
22
88
  - 如果发现任何模糊之处,必须停止并使用**选项式交互**提问:
23
89
  * 使用编辑器的结构化问答工具(如 \`AskQuestion\`),将每个问题转化为带 2-5 个预设选项的选择题
24
- * 每个问题末尾包含"其他"选项作为兖底
90
+ * 每个问题末尾包含"其他"选项作为兜底
25
91
  * 尽量将多个问题合并到一次交互中一次性展示
26
92
  * 必须等待用户选择答案,不能继续
27
93
  * **严禁**要求用户手动输入大段文字来回答
@@ -35,9 +101,11 @@ const proposalSteps = `**步骤**
35
101
  - If no clarification needed: Write "Status: COMPLETED - No clarification needed" with brief justification
36
102
  - This section MUST NOT be empty or contain only HTML comments
37
103
  - NEVER proceed to proposal writing without completing this checkpoint
38
- 2. 选择一个唯一的动词开头的 \`change-id\`,并在 \`zhuanspec/changes/<id>/\` 下搭建 \`proposal.md\`、\`tasks.md\` 和 \`design.md\`(需要时)。
104
+
105
+ 2. 选择一个唯一的动词开头的 \`change-id\`,但是必须注意,如果经过了techDesign阶段并且已经提前创建好了提案目录则必须直接复用,并在 \`zhuanspec/changes/<id>/\` 下搭建 \`proposal.md\`、\`tasks.md\` 和 \`design.md\`。
106
+ -如果复用了techDesign创建的提案目录,需要输出'techDesign阶段已经提前创建好提案目录,我将直接在该目录生成相关提案文件'
39
107
  3. 将变更映射为具体的功能或要求,将多范围的工作分解为具有明确关系和顺序的不同规范增量。
40
- 4. 当解决方案跨越多个系统、引入新模式或在提交规范之前需要权衡讨论时,在 \`design.md\` 中捕获架构推理。
108
+ 4. 创建 \`design.md\`(必选),记录技术决策、最佳实践、隐式约定。归档时会自动提取这些内容沉淀到项目知识库。
41
109
  5. 在 \`changes/<id>/specs/<capability>/spec.md\` 中起草规范增量(每个功能一个文件夹),使用 \`## ADDED|MODIFIED|REMOVED Requirements\`,每个要求至少包含一个 \`#### Scenario:\`,并在相关时交叉引用相关功能。
42
110
  6. **发现可用 Skill 并创建 tasks.md**:
43
111
  - 运行 \`zhuanspec skills list --json\` 获取当前环境中可用的 skill 列表及其 description
@@ -66,43 +134,307 @@ const proposalSteps = `**步骤**
66
134
  4. You MUST add a "## Dependency Analysis" section at the end with "Status: COMPLETED"
67
135
  5. validate --strict will verify task ordering matches computed waves
68
136
 
69
- 7. 使用 \`zhuanspec validate <id> --strict\` 进行验证,并在分享提案之前解决所有问题。`;
137
+
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
+ - 通过 taskId/bicId 获取测试 case(使用 MCP 工具 \`zzcase_get_api_report_queryBaseCase\`)
147
+ - 或手动录入测试 case
148
+ - **【强制】创建 test-cases.md 文件**:
149
+ * 使用 \`getTestCasesTemplate\` 模板(从 \`src/core/templates/index.ts\` 导出)
150
+ * 文件路径:\`changes/<change-id>/test-cases.md\`
151
+ * 填写获取时间、来源(taskId/bicId/manual)、测试 case 详情
152
+ * 每个 TC-XXX 必须包含:前置条件、测试步骤、预期结果、验收点
153
+ - 在 \`tasks.md\` 的 **Test Case Coverage** 表格中使用 \`@test-case:TC-XXX\` 关联任务与测试 case
154
+ - **表格格式要求**(四列):
155
+ | Task | 测试 Case ID | 测试 Case 文件路径 | 覆盖场景 |
156
+ |------|-------------|-------------------|----------|
157
+ | T1 | TC-001 | \`退货退款 > 创建售后 > 三选一页面 > 组装机弹窗\` | 描述 |
158
+ * "测试 Case 文件路径" 列填写 BIC 路径层级格式
159
+ - 任务实施顺序调整为:先写测试 → 再写实现 → 验证测试通过
160
+ * 选择"暂不提供":跳过此步骤,按常规流程继续
161
+ * 选择"其他":等待用户补充说明后继续
162
+
163
+ ⚠️ **CHECKPOINT [TEST-CASE-COVERAGE]**:
164
+ 1. 如果用户提供测试 case,启用 TDD 模式,每个 Requirement 必须对应测试 case
165
+ 2. 测试 case 应覆盖正向和异常场景
166
+ 3. **必须创建 test-cases.md 文件**(使用 \`getTestCasesTemplate\` 模板)
167
+ 4. Test Case Coverage 表格必须包含四列:Task、测试 Case ID、测试 Case 文件路径、覆盖场景
168
+ 5. validate --strict 会验证测试 case 覆盖率(警告级别,不阻塞)
169
+ 6. 记录询问结果到 tasks.md 的 **Test Case Source Log** 段
170
+
171
+
172
+ 8. 【自动验证与修复】:
173
+ 运行 \`zhuanspec validate <id> --strict --auto-fix\` 进行验证:
174
+ - 如果验证通过(PASS):继续下一步
175
+ - 如果验证失败(FAIL):自动触发修复循环:
176
+ * CLI 自动分析错误原因
177
+ * CLI 自动生成修复方案并执行
178
+ * 重新验证(最多 3 次循环)
179
+ * 循环结束后仍未通过:输出错误报告,等待人工干预
180
+ - 验证通过后,输出提案摘要
181
+
182
+ 9. 【输出提案摘要】:
183
+ • 变更原因、内容、影响范围
184
+ • 关键 Requirements
185
+ • 任务数量和 Wave 分布
186
+
187
+ 10. 【选项式交互确认】:
188
+ 使用 AskQuestion 工具弹出确认对话框:
189
+ \`\`\`
190
+ 问题: "请确认是否批准此提案?"
191
+ 选项:
192
+ A) 批准,进入实施阶段
193
+ B) 需要修改提案内容
194
+ C) 暂不批准,稍后处理
195
+ D) 其他(请在后续补充说明)
196
+ \`\`\`
197
+
198
+ 用户选择处理:
199
+ • 选择"批准":
200
+ - 创建 \`.approved\` 文件
201
+ - **运行 \`zhuanspec progress set-phase <change-id> apply\`** 写入 phase
202
+ - **自动触发 Apply 阶段**:使用 Skill 工具调用 \`zhuanspec:apply\`,传入 change-id 参数
203
+ • 选择"修改":返回步骤 3 修改提案内容
204
+ • 选择"暂不":保持提案状态,等待后续处理
205
+ • 选择"其他":等待用户补充说明后继续
206
+
207
+ ⚠️ **CHECKPOINT [PLAN-APPROVED]**:
208
+ - 用户必须明确选择"批准"选项才能进入 Apply 阶段
209
+ - 未批准前禁止任何代码修改操作
210
+ - PreToolUse Hook 会阻断未批准状态的 Write/Edit 操作`;
70
211
  const proposalReferences = `**参考**
71
212
  - 当验证失败时,使用 \`zhuanspec show <id> --json --deltas-only\` 或 \`zhuanspec show <spec> --type spec\` 检查详细信息。
72
213
  - 在编写新要求之前,使用 \`rg -n "Requirement:|Scenario:" zhuanspec/specs\` 搜索现有要求。
73
214
  - 使用 \`rg <keyword>\`、\`ls\` 或直接文件读取探索代码库,以便提案与当前实现现实保持一致。`;
74
215
  const applySteps = `**步骤**
75
216
  将这些步骤作为待办事项跟踪,逐一完成。
76
- 1. 阅读 \`changes/<id>/proposal.md\`、\`design.md\`(如果存在)和 \`tasks.md\` 以确认范围和验收标准。
217
+ 1. **检查知识库并确认 Phase**:
218
+ - 运行 \`rg "[关键词]" zhuanspec/knowledge/\` 搜索相关最佳实践和陷阱
219
+ - **Phase 确认**:运行 \`zhuanspec progress show <change-id>\` 确认 phase=apply
220
+ - 如果 phase 不为 apply,运行 \`zhuanspec progress set-phase <change-id> apply\`
221
+ - 阅读 \`changes/<id>/proposal.md\`、\`design.md\`(如果存在)和 \`tasks.md\` 以确认范围和验收标准。
77
222
  2. **判断执行模式** - 根据 tasks.md 内容选择执行策略:
78
- - **如果 tasks.md 包含 \`@depends\` 依赖声明**(存在 \`<execution_plan>\`):
79
- → 按【任务执行编排】规则执行(见 \`zhuanspec/AGENTS.md\` 中"任务执行编排"章节)
223
+ - **如果 tasks.md 包含 \`@depends\` 依赖声明**:
224
+ → **Wave 并行执行**:按 Wave 编号串行,Wave 内任务并行启动 subagent
225
+ → **Agent 类型选择**:根据任务是否标注 \`@test-case\` 选择:
226
+ * 无 \`@test-case\` 标注 → 使用 \`applyAgent\`(普通代码实施)
227
+ * 有 \`@test-case:TC-XXX\` 标注 → 使用 \`tddApplyAgent\`(TDD 模式)
228
+ → **Rules 和 Knowledge 注入**:编排 Agent MUST 在每个 subagent prompt 中注入:
229
+ * Rules:根据任务的 \`@skill\` 标注选择性注入 \`api-design.md\`、\`dao-standards.md\`、\`coding-standards.md\` 等
230
+ * Knowledge:始终注入 \`knowledge/index.md\` 知识索引摘要
231
+ * Troubleshooting:注入与任务相关的踩坑警告
232
+ → Subagent 上下文隔离:仅注入当前任务、关联 skill、相关 spec、Rules/Knowledge
80
233
  - **如果 tasks.md 无依赖声明**:
81
234
  → 按顺序执行(见下方步骤 3-5)
82
235
  3. **按顺序实施任务**(无依赖声明时)- 保持编辑最小化并专注于请求的变更。如果任务标注了 \`@skill:<skill-name>\`,直接调用对应 skill 获取指导后再实施。
236
+ - **阶段职责(按 Agent 类型区分)**:
237
+ * **applyAgent(普通模式)**:不生成单元测试文件,单测生成与验证统一在 Review 阶段执行
238
+ * **tddApplyAgent(TDD 模式,任务有 \`@test-case\` 标注)**:基于 test-cases.md 先写测试再实现代码
83
239
  4. **确认完成** - 在更新状态之前确保 \`tasks.md\` 中的每个项目都已完成。
84
240
  5. **更新清单** - 所有工作完成后,将每个任务设置为 \`- [x]\`,以便列表反映实际情况。
85
- 6. **代码审查**(可选) - 审查已实施的代码,检查代码规范合规性、逻辑正确性、性能和安全性问题。如果发现问题,应在归档之前解决。
86
- 7. 需要额外上下文时,参考 \`zhuanspec list\` 或 \`zhuanspec show <item>\`。`;
241
+ 6. **处理 Subagent 状态报告**(Wave 并行执行时):
242
+ - **DONE**:继续下一任务
243
+ - **DONE_WITH_CONCERNS**:记录 concerns 并评估是否需要修复
244
+ - **BLOCKED**:评估 blocker 类型并决定处理策略(提供上下文/换更强模型/拆分任务)
245
+ - **NEEDS_CONTEXT**:提供缺失信息并重新启动 subagent
246
+ 7. **代码审查**(必选) - 必须执行 \`zhuanspec review <change-id>\`,并确认三项门禁全部通过后才可归档:
247
+ - 代码审查通过(Critical=0)
248
+ - 单测生成与验证通过
249
+ - Spec-Code consistency 通过
250
+ 8. 需要额外上下文时,参考 \`zhuanspec list\` 或 \`zhuanspec show <item>\`。`;
251
+ const applyGuardrails = `${baseGuardrails}\n- **Wave 并行执行**:当 tasks.md 包含 \`@depends\` 时,按 Wave 编号串行执行,Wave 内任务通过 Agent tool 并行启动 subagent。
252
+ - **Agent 类型选择**:根据任务 \`@test-case\` 标注选择 subagent 类型:
253
+ * 无 \`@test-case\` 标注 → \`applyAgent\`(普通模式,单测在 Review 阶段)
254
+ * 有 \`@test-case:TC-XXX\` 标注 → \`tddApplyAgent\`(TDD 模式,Apply 阶段执行测试用例)
255
+ - **Rules 和 Knowledge 注入**:编排 Agent MUST 在每个 subagent prompt 中注入 Rules(根据 @skill)和 Knowledge(踩坑警告、最佳实践)。
256
+ - **偏差处理**:PreToolUse Hook 检测到提案范围外修改时弹出选项式交互(更新提案/Bug修复豁免/取消)。3次偏差后强制更新提案。`;
87
257
  const applyReferences = `**参考**
88
258
  - 如果在实施过程中需要提案的额外上下文,请使用 \`zhuanspec show <id> --json --deltas-only\`。`;
89
- const archiveSteps = `**步骤**
90
- 1. 确定要归档的变更 ID:
259
+ const archiveSteps = `**前置检查**:
260
+ - ⚠️ **CHECKPOINT [REVIEW-PASSED]**: Review 阶段必须通过(三轨全部 PASS)
261
+ - \`review-report.md\` 存在且显示 passed
262
+ - \`code-review-result.json\`: critical = 0
263
+ - \`unit-test-result.json\`: tests passed
264
+ - \`spec-consistency-result.json\`: passed
265
+ - **Phase 确认**:phase 应为 review(运行 \`zhuanspec progress show <change-id>\`)
266
+
267
+ **步骤**
268
+ 0. **检查知识库**:运行 \`rg "[关键词]" zhuanspec/knowledge/\` 搜索是否有需要沉淀的知识。阅读 \`zhuanspec/knowledge/index.md\` 了解项目级知识摘要。
269
+ 1. **确定变更 ID 并设置 Phase**:
91
270
  - 如果此提示已包含特定的变更 ID(例如在由斜杠命令参数填充的 \`<ChangeId>\` 块内),请在修剪空白后使用该值。
92
271
  - 如果对话中松散地引用了变更(例如通过标题或摘要),运行 \`zhuanspec list\` 以显示可能的 ID,分享相关候选,并确认用户意图是哪一个。
93
272
  - 否则,审查对话,运行 \`zhuanspec list\`,并询问用户要归档哪个变更;在继续之前等待确认的变更 ID。
94
273
  - 如果您仍然无法识别单个变更 ID,请停止并告诉用户您还无法归档任何内容。
274
+ - **Phase 设置**:运行 \`zhuanspec progress set-phase <change-id> archive\`
95
275
  2. 通过运行 \`zhuanspec list\`(或 \`zhuanspec show <id>\`)验证变更 ID,如果变更缺失、已归档或尚未准备好归档,则停止。
96
- 3. 运行 \`zhuanspec archive <id> --yes\`,以便 CLI 移动变更并应用规范更新,无需提示(仅对仅工具类工作使用 \`--skip-specs\`)。
97
- 4. 审查命令输出以确认目标规范已更新,并且变更已进入 \`changes/archive/\`。
98
- 5. 使用 \`zhuanspec validate --strict\` 进行验证,如果看起来有问题,使用 \`zhuanspec show <id>\` 进行检查。`;
276
+ 3. **验证 Review 门禁**:确认上述四个结果文件存在且全部通过。
277
+ 4. 运行 \`zhuanspec archive <id> --yes\`,以便 CLI 移动变更并应用规范更新,无需提示(仅对仅工具类工作使用 \`--skip-specs\`)。
278
+ 5. 审查命令输出以确认目标规范已更新,并且变更已进入 \`changes/archive/\`。
279
+ 6. 使用 \`zhuanspec validate --strict\` 进行验证,如果看起来有问题,使用 \`zhuanspec show <id>\` 进行检查。
280
+ 7. **知识沉淀(手动补充)**:调用 \`@skill:zhuanspec:knowledge\` skill 从本次会话记忆中补充知识。
281
+ - CLI 已自动从变更目录提取结构化知识(design.md/proposal.md/tasks.md 中的决策、注意事项等)
282
+ - AI 需从会话记忆补充无法自动提取的内容(如对话中发现的隐式约定、调试陷阱等)
283
+ 8. **会话分析**:调用 \`@skill:session-analytics\` skill 分析本次会话的指标数据(工具调用、Token消耗、时长等)。
284
+ 9. **输出反馈链接**:告知用户填写使用反馈:
285
+ 📋 https://doc.weixin.qq.com/forms/AJ4AfQfgAAwACwAAwaVABsCNqDXIKn8sf`;
99
286
  const archiveReferences = `**参考**
100
287
  - 在归档之前使用 \`zhuanspec list\` 确认变更 ID。
101
- - 使用 \`zhuanspec list --specs\` 检查刷新的规范,并在移交之前解决任何验证问题。`;
288
+ - 使用 \`zhuanspec list --specs\` 检查刷新的规范,并在移交之前解决任何验证问题。
289
+ - 知识提取分工:
290
+ - **CLI 自动**:归档时从变更目录(proposal.md/tasks.md/design.md/specs/*.md)正则提取结构化知识
291
+ - **AI 手动**:调用 \`zhuanspec:knowledge\` skill 从会话记忆补充隐式约定、调试发现等
292
+ - 会话分析 (\`session-analytics\`):记录本次会话的效率指标,用于改进工作流。`;
293
+ const designGuardrails = `${baseGuardrails}\n- **独立设计阶段**:techDesign 命令用于在 proposal 之前生成技术设计请求文档,不依赖变更提案。设计文档可作为后续提案的输入。
294
+ - **需求澄清优先**:在生成设计请求前,必须确认需求来源(大神页面、需求描述文本等)。
295
+ - **Skill 调用为主**:技术方案生成主要通过 \`generate-tech-spec-md-skill\` Skill 完成,而非直接运行 CLI 命令。
296
+ - **严格文件约束**:techDesign 阶段只能创建目录和 progress.json(phase=techDesign)。
297
+ - **禁止创建提案文件**:禁止创建 .tech-design、design.md、proposal.md、tasks.md、specs/ 等。
298
+ - **Proposal 复用**:proposal 阶段通过 progress.json 的 phase 字段识别 techDesign 目录。`;
299
+ const designSteps = `**步骤**
300
+ 0. **检查知识库并生成 change-id**:
301
+ - 运行 \`rg "[需求关键词]" zhuanspec/knowledge/\` 搜索相关陷阱和最佳实践,避免重复踩坑。阅读 \`zhuanspec/knowledge/index.md\` 了解项目级知识摘要。
302
+ - **生成 change-id**(与 proposal 阶段命名规则一致):
303
+ * 从用户需求描述中提取核心动词和关键词
304
+ * 格式:动词开头 + kebab-case 关词组合
305
+ * 示例:"separate-techdesign-proposal-phases"、"add-user-auth"
306
+ * 使用 AskQuestion 工具交互式确认生成的 change-id
307
+
308
+ 1. **Phase 初始化**:
309
+ * 使用步骤 0 确认的 change-id 创建提案目录
310
+ * **仅创建以下内容**:
311
+ - 目录:changes/{change-id}/
312
+ - 文件:changes/{change-id}/metrics/progress.json(phase=techDesign)
313
+ * **禁止创建**:.tech-design、design.md、proposal.md、tasks.md、specs/、Skill 请求文件等
314
+ * 如果绑定到已存在 change:运行 \`zhuanspec progress set-phase <change-id> techDesign\`
315
+
316
+ 2. **确认需求来源**:
317
+ - 检查用户是否提供了需求来源(--dashen-page-id、--dashen-url 或 --desc)
318
+ - 如果没有明确来源,使用 AskUserQuestion 工具询问:
319
+ * 大神页面 ID 或 URL
320
+ * 直接提供需求描述文本
321
+ * 其他来源
322
+
323
+ 3. **目录检查**:
324
+ - 是否已经创建提案目录 没有创建则立刻创建
325
+
326
+ 4. **调用 Skill 生成技术方案**:
327
+ - 使用 Skill 工具调用 \`generate-tech-spec-md-skill\`
328
+ - 传入需求来源参数(dashenPageId、dashenUrl 或 desc)
329
+ - Skill 会自动获取大神页面内容并生成完整技术方案文档
330
+
331
+ 5. **输出摘要**:
332
+ - 告知用户生成的文档路径
333
+ - **明确说明**:techDesign 阶段仅保存进度数据(progress.json),不创建 proposal.md 和 tasks.md
334
+ - 提示 phase=techDesign
335
+ - 提示下一步可以使用 \`/zhuanspec:proposal\` 创建变更提案(复用目录)`;
336
+ const designReferences = `**参考**
337
+ - 技术方案生成由 \`generate-tech-spec-md-skill\` Skill 完成,支持从大神页面或需求描述生成完整技术方案
338
+ - Skill 输出包含:背景、目标、决策、风险、迁移计划、Mermaid 图表等完整技术方案结构
339
+ - 使用 \`zhuanspec techDesign --help\` 查看 CLI 命令选项(用于生成请求文档或验证现有设计)`;
340
+ const reviewGuardrails = `${baseGuardrails}\n- **门禁审查阶段**:review 命令用于执行三轨并行校验并汇总结论。
341
+ - **强制审查**:所有变更在归档前必须通过三轨门禁,确保代码质量、测试覆盖与 Spec-Code 一致性。
342
+ - **Skill 触发要求**:必须触发 \`code-review-expert\`(代码审查轨)与 \`generate-mockito-unit-test-skill\`(单测轨)。`;
343
+ const reviewSteps = `**步骤**
344
+ 1. **确定变更 ID 并设置 Phase**:
345
+ - 如果此提示已包含特定的变更 ID,请使用该值
346
+ - 否则运行 \`zhuanspec list\` 显示活跃变更,并询问用户要审查哪个
347
+ - **Phase 设置**:运行 \`zhuanspec progress set-phase <change-id> review\`
348
+ 2. **执行三轨并行校验(强制)**:
349
+ - **轨道 A:Code Review 轨**
350
+ - 使用 Skill 工具调用 \`code-review-expert\` skill
351
+ - 输出 \`code-review-report.md\`,记录 Critical/Important 问题
352
+ - **轨道 B:Unit Test 轨(Skill)**
353
+ - 使用 Skill 工具调用 \`generate-mockito-unit-test-skill\`
354
+ - 对缺失场景补齐单测并执行测试命令,输出单测结果
355
+ - **轨道 C:Spec-Code 一致性轨**
356
+ - 运行 \`zhuanspec validate <change-id> --strict\`
357
+ - 确认 \`spec-code-consistent\` 规则通过
358
+ 3. **汇总执行 CLI Review**:
359
+ - 运行 \`zhuanspec review <change-id>\`
360
+ - CLI 汇总三轨结果并生成 \`review-report.md\` 及 JSON 结果文件
361
+ 4. **审查结果处理**:
362
+ - **PASS**:三轨全部通过(CR=PASS、UT=PASS、Spec-Code=PASS)且 Critical=0,可以继续归档
363
+ - **FAIL**:输出问题列表,需要修复后重新审查
364
+ 5. **修复循环**(如果失败):
365
+ - 根据三轨报告定位问题并修复代码/补充单测/更新提案
366
+ - 重新执行三轨并再次运行 \`zhuanspec review <change-id>\`
367
+ 6. **确认通过后**:
368
+ - 告知用户审查已通过(三轨并行 + CLI 汇总)
369
+ - 提示可以使用 \`/zhuanspec:archive\` 进行归档`;
370
+ const reviewReferences = `**参考**
371
+ - 使用 \`zhuanspec review --help\` 查看完整选项
372
+ - 审查报告包含:\`code-review-result.json\`、\`unit-test-result.json\`、\`spec-consistency-result.json\`、\`review-report.md\`
373
+ - 单元测试覆盖率阈值默认 80%,可通过 \`--coverage-threshold\` 调整
374
+ - \`code-review-expert\` Skill 输出保存到 \`zhuanspec/changes/<id>/metrics/code-review-report.md\``;
375
+ const knowledgeGuardrails = `${baseGuardrails}\n- **知识管理阶段**:knowledge 命令用于管理项目级知识库(最佳实践、陷阱、隐式约定)。
376
+ - **跨变更积累**:知识不绑定单个变更,是长期积累的项目资产。
377
+ - **职责分离**:
378
+ - **CLI 自动提取**:归档时自动从变更目录(proposal.md、tasks.md、design.md、specs/*.md)提取结构化知识
379
+ - **AI 手动补充**:从本次会话记忆中补充无法自动提取的知识(如隐式约定发现、对话中的关键决策)`;
380
+ const knowledgeSteps = `**步骤**
381
+ 1. **选择操作类型**:
382
+ - 查看:列出当前知识库内容
383
+ - 添加:从会话记忆手动添加新的知识条目(CLI 无法自动提取的内容)
384
+ - 搜索:按关键词搜索相关知识
385
+
386
+ 2. **查看知识库**:
387
+ - 运行 \`ls zhuanspec/knowledge/\` 查看目录结构
388
+ - 阅读 \`zhuanspec/knowledge/index.md\` 查看索引
389
+ - 使用 \`cat zhuanspec/knowledge/decisions/*.md\` 查看决策记录
390
+ - 使用 \`cat zhuanspec/knowledge/best-practices/*.md\` 查看最佳实践
391
+
392
+ 3. **从会话添加知识条目**(手动补充 CLI 无法自动提取的内容):
393
+ - 选择分类目录(decisions/best-practices/implicit-conventions)
394
+ - 基于本次会话中的发现,使用模板创建条目:
395
+ \`\`\`markdown
396
+ # [标题]
397
+
398
+ **发现时间**: [YYYY-MM-DD]
399
+ **来源变更**: [change-id](可选)
400
+ **关键词**: [关键词列表]
401
+ **来源**: 会话记忆(AI 补充)
402
+
403
+ ## 背景
404
+
405
+ [发现该知识点的背景描述 - 来自本次对话]
406
+
407
+ ## 问题/经验
408
+
409
+ [具体问题或经验描述 - CLI 无法自动提取的内容]
410
+
411
+ ## 解决方案/建议
412
+
413
+ [解决方案或最佳实践建议]
414
+
415
+ ## 相关代码
416
+
417
+ - \`[相关文件路径]\` - [说明]
418
+ \`\`\`
419
+ - **优先补充**:
420
+ - 对话中发现但未写入文档的隐式约定
421
+ - 调试过程中发现的陷阱
422
+ - 团队特有的最佳实践
423
+
424
+ 4. **搜索知识**:
425
+ - 使用 \`rg "[关键词]" zhuanspec/knowledge/\` 进行搜索
426
+ - 结合变更上下文进行知识推荐`;
427
+ const knowledgeReferences = `**参考**
428
+ - CLI 归档时自动从变更目录提取结构化知识(design.md 中的决策、proposal.md 中的注意事项等)
429
+ - 本 skill 用于从会话记忆中补充无法自动提取的知识
430
+ - 知识库目录结构:decisions(决策记录)、best-practices(最佳实践)、implicit-conventions(隐式约定)`;
102
431
  export const slashCommandBodies = {
103
- proposal: [proposalGuardrails, proposalSteps, proposalReferences].join('\n\n'),
104
- apply: [baseGuardrails, applySteps, applyReferences].join('\n\n'),
105
- archive: [baseGuardrails, archiveSteps, archiveReferences].join('\n\n')
432
+ proposal: [proposalGuardrails, proposalOutputFormat, proposalSteps, proposalReferences].join('\n\n'),
433
+ design: [designGuardrails, designSteps, designReferences].join('\n\n'),
434
+ apply: [applyGuardrails, applyOutputFormat, applySteps, applyReferences].join('\n\n'),
435
+ review: [reviewGuardrails, reviewOutputFormat, reviewSteps, reviewReferences].join('\n\n'),
436
+ archive: [baseGuardrails, archiveSteps, archiveReferences].join('\n\n'),
437
+ knowledge: [knowledgeGuardrails, knowledgeSteps, knowledgeReferences].join('\n\n')
106
438
  };
107
439
  export function getSlashCommandBody(id) {
108
440
  return slashCommandBodies[id];
@@ -2,6 +2,10 @@
2
2
  * Tasks Template
3
3
  *
4
4
  * Template for generating tasks.md with required checkpoint sections.
5
+ * This template MUST conform to strict validation rules in strict-rules.ts:
6
+ * - pre-clarification-completed: Must have valid Pre-Clarification Log section
7
+ * - skill-tags-valid: Must have Skill Mapping table and @skill tags
8
+ * - task-ordering-by-wave: Must have Wave headers in correct order
5
9
  */
6
10
  export interface TasksTemplateOptions {
7
11
  changeId: string;
@@ -9,10 +13,13 @@ export interface TasksTemplateOptions {
9
13
  }
10
14
  /**
11
15
  * Get the tasks.md template structure with required checkpoint sections
16
+ * Template uses valid completion markers to pass strict validation by default
12
17
  */
13
18
  export declare function getTasksTemplate(options?: TasksTemplateOptions): string;
14
19
  /**
15
20
  * Get the minimal tasks.md template (for quick scaffolding)
21
+ * Note: This minimal template will NOT pass strict validation by default
22
+ * User must fill in the Pre-Clarification Log and Skill Mapping sections
16
23
  */
17
24
  export declare function getMinimalTasksTemplate(): string;
18
25
  declare const _default: {