specops 0.2.5 → 0.3.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 (201) hide show
  1. package/.opencode/agent/specops-codebase-mapper.md +764 -0
  2. package/.opencode/agent/specops-debugger.md +1246 -0
  3. package/.opencode/agent/specops-executor.md +475 -0
  4. package/.opencode/agent/specops-integration-checker.md +443 -0
  5. package/.opencode/agent/specops-phase-researcher.md +547 -0
  6. package/.opencode/agent/specops-plan-checker.md +690 -0
  7. package/.opencode/agent/specops-planner.md +581 -0
  8. package/.opencode/agent/specops-project-researcher.md +354 -0
  9. package/.opencode/agent/specops-research-synthesizer.md +242 -0
  10. package/.opencode/agent/specops-roadmapper.md +642 -0
  11. package/.opencode/agent/specops-work-verifier.md +573 -0
  12. package/.opencode/references/checkpoints.md +776 -0
  13. package/.opencode/references/continuation-format.md +249 -0
  14. package/.opencode/references/decimal-phase-calculation.md +65 -0
  15. package/.opencode/references/git-integration.md +248 -0
  16. package/.opencode/references/git-planning-commit.md +38 -0
  17. package/.opencode/references/model-profile-resolution.md +34 -0
  18. package/.opencode/references/model-profiles.md +92 -0
  19. package/.opencode/references/phase-argument-parsing.md +61 -0
  20. package/.opencode/references/planning-config.md +196 -0
  21. package/.opencode/references/questioning.md +145 -0
  22. package/.opencode/references/tdd.md +263 -0
  23. package/.opencode/references/ui-brand.md +160 -0
  24. package/.opencode/references/verification-patterns.md +612 -0
  25. package/.opencode/templates/DEBUG.md +164 -0
  26. package/.opencode/templates/UAT.md +180 -0
  27. package/.opencode/templates/VALIDATION.md +76 -0
  28. package/.opencode/templates/codebase/architecture.md +255 -0
  29. package/.opencode/templates/codebase/concerns.md +310 -0
  30. package/.opencode/templates/codebase/conventions.md +307 -0
  31. package/.opencode/templates/codebase/integrations.md +280 -0
  32. package/.opencode/templates/codebase/stack.md +186 -0
  33. package/.opencode/templates/codebase/structure.md +285 -0
  34. package/.opencode/templates/codebase/testing.md +480 -0
  35. package/.opencode/templates/context.md +221 -0
  36. package/.opencode/templates/continue-here.md +78 -0
  37. package/.opencode/templates/debug-subagent-prompt.md +91 -0
  38. package/.opencode/templates/discovery.md +147 -0
  39. package/.opencode/templates/milestone-archive.md +123 -0
  40. package/.opencode/templates/milestone.md +115 -0
  41. package/.opencode/templates/phase-prompt.md +333 -0
  42. package/.opencode/templates/planner-subagent-prompt.md +117 -0
  43. package/.opencode/templates/project.md +184 -0
  44. package/.opencode/templates/requirements.md +130 -0
  45. package/.opencode/templates/research-project/ARCHITECTURE.md +204 -0
  46. package/.opencode/templates/research-project/FEATURES.md +147 -0
  47. package/.opencode/templates/research-project/PITFALLS.md +200 -0
  48. package/.opencode/templates/research-project/STACK.md +120 -0
  49. package/.opencode/templates/research-project/SUMMARY.md +170 -0
  50. package/.opencode/templates/research.md +278 -0
  51. package/.opencode/templates/retrospective.md +54 -0
  52. package/.opencode/templates/roadmap.md +202 -0
  53. package/.opencode/templates/state.md +176 -0
  54. package/.opencode/templates/summary-complex.md +59 -0
  55. package/.opencode/templates/summary-minimal.md +41 -0
  56. package/.opencode/templates/summary-standard.md +48 -0
  57. package/.opencode/templates/summary.md +248 -0
  58. package/.opencode/templates/user-setup.md +311 -0
  59. package/.opencode/templates/verification-report.md +322 -0
  60. package/.opencode/workflows/add-phase.md +111 -0
  61. package/.opencode/workflows/add-tests.md +350 -0
  62. package/.opencode/workflows/add-todo.md +157 -0
  63. package/.opencode/workflows/audit-milestone.md +297 -0
  64. package/.opencode/workflows/check-todos.md +176 -0
  65. package/.opencode/workflows/cleanup.md +152 -0
  66. package/.opencode/workflows/complete-milestone.md +763 -0
  67. package/.opencode/workflows/diagnose-issues.md +219 -0
  68. package/.opencode/workflows/discovery-phase.md +288 -0
  69. package/.opencode/workflows/discuss-phase.md +542 -0
  70. package/.opencode/workflows/execute-phase.md +449 -0
  71. package/.opencode/workflows/execute-plan.md +447 -0
  72. package/.opencode/workflows/health.md +156 -0
  73. package/.opencode/workflows/help.md +489 -0
  74. package/.opencode/workflows/insert-phase.md +129 -0
  75. package/.opencode/workflows/list-phase-assumptions.md +178 -0
  76. package/.opencode/workflows/map-codebase.md +315 -0
  77. package/.opencode/workflows/new-milestone.md +382 -0
  78. package/.opencode/workflows/new-project.md +1116 -0
  79. package/.opencode/workflows/pause-work.md +122 -0
  80. package/.opencode/workflows/plan-milestone-gaps.md +274 -0
  81. package/.opencode/workflows/plan-phase.md +569 -0
  82. package/.opencode/workflows/progress.md +381 -0
  83. package/.opencode/workflows/quick.md +453 -0
  84. package/.opencode/workflows/remove-phase.md +154 -0
  85. package/.opencode/workflows/research-phase.md +73 -0
  86. package/.opencode/workflows/resume-project.md +304 -0
  87. package/.opencode/workflows/set-profile.md +80 -0
  88. package/.opencode/workflows/settings.md +213 -0
  89. package/.opencode/workflows/transition.md +544 -0
  90. package/.opencode/workflows/update.md +219 -0
  91. package/.opencode/workflows/verify-phase.md +242 -0
  92. package/.opencode/workflows/verify-work.md +569 -0
  93. package/commands/specops/add-phase.md +43 -0
  94. package/commands/specops/add-tests.md +41 -0
  95. package/commands/specops/add-todo.md +47 -0
  96. package/commands/specops/audit-milestone.md +36 -0
  97. package/commands/specops/check-todos.md +45 -0
  98. package/commands/specops/cleanup.md +18 -0
  99. package/commands/specops/complete-milestone.md +136 -0
  100. package/commands/specops/debug.md +167 -0
  101. package/commands/specops/discuss-phase.md +83 -0
  102. package/commands/specops/execute-phase.md +41 -0
  103. package/commands/specops/health.md +22 -0
  104. package/commands/specops/help.md +22 -0
  105. package/commands/specops/insert-phase.md +32 -0
  106. package/commands/specops/join-discord.md +18 -0
  107. package/commands/specops/list-phase-assumptions.md +46 -0
  108. package/commands/specops/map-codebase.md +71 -0
  109. package/commands/specops/new-milestone.md +44 -0
  110. package/commands/specops/new-project.md +42 -0
  111. package/commands/specops/pause-work.md +38 -0
  112. package/commands/specops/plan-milestone-gaps.md +34 -0
  113. package/commands/specops/plan-phase.md +45 -0
  114. package/commands/specops/progress.md +24 -0
  115. package/commands/specops/quick.md +41 -0
  116. package/commands/specops/reapply-patches.md +111 -0
  117. package/commands/specops/remove-phase.md +31 -0
  118. package/commands/specops/research-phase.md +189 -0
  119. package/commands/specops/resume-work.md +40 -0
  120. package/commands/specops/set-profile.md +34 -0
  121. package/commands/specops/settings.md +36 -0
  122. package/commands/specops/update.md +37 -0
  123. package/commands/specops/verify-work.md +38 -0
  124. package/dist/__integration__/fixtures/generator.d.ts +4 -0
  125. package/dist/__integration__/fixtures/generator.js +1 -0
  126. package/dist/__integration__/mocks/server.d.ts +7 -0
  127. package/dist/__integration__/mocks/server.js +1 -0
  128. package/dist/__integration__/setup.d.ts +6 -0
  129. package/dist/__integration__/setup.js +1 -0
  130. package/dist/acceptance/lazyDetector.js +1 -1
  131. package/dist/acceptance/reporter.js +1 -1
  132. package/dist/acceptance/runner.js +1 -1
  133. package/dist/cli.js +1 -1
  134. package/dist/context/index.js +1 -1
  135. package/dist/context/promptTemplate.js +1 -1
  136. package/dist/context/techContextLoader.js +1 -1
  137. package/dist/engine.d.ts +1 -0
  138. package/dist/engine.js +1 -1
  139. package/dist/evolution/distiller.js +1 -1
  140. package/dist/evolution/index.js +1 -1
  141. package/dist/evolution/memoryGraph.js +1 -1
  142. package/dist/evolution/selector.js +1 -1
  143. package/dist/evolution/signals.js +1 -1
  144. package/dist/evolution/solidify.js +1 -1
  145. package/dist/evolution/store.js +1 -1
  146. package/dist/evolution/types.js +1 -1
  147. package/dist/init.d.ts +4 -3
  148. package/dist/init.js +1 -1
  149. package/dist/machines/agentMachine.js +1 -1
  150. package/dist/machines/supervisorMachine.js +1 -1
  151. package/dist/persistence/schema.js +1 -1
  152. package/dist/persistence/stateFile.js +1 -1
  153. package/dist/plugin-engine.js +1 -1
  154. package/dist/plugin.js +1 -1
  155. package/dist/requirement-analysis/analyzers/repository-parser.d.ts +121 -0
  156. package/dist/requirement-analysis/analyzers/repository-parser.js +1 -0
  157. package/dist/requirement-analysis/generators/prd-generator.d.ts +90 -0
  158. package/dist/requirement-analysis/generators/prd-generator.js +1 -0
  159. package/dist/requirement-analysis/integrations/v1-integration.d.ts +73 -0
  160. package/dist/requirement-analysis/integrations/v1-integration.js +1 -0
  161. package/dist/requirement-analysis/tools/analyze-requirements.js +1 -0
  162. package/dist/requirement-analysis/types/analysis-result.d.ts +326 -0
  163. package/dist/requirement-analysis/types/analysis-result.js +1 -0
  164. package/dist/requirement-analysis/types/feature-mapping.d.ts +294 -0
  165. package/dist/requirement-analysis/types/feature-mapping.js +1 -0
  166. package/dist/requirement-analysis/types/index.d.ts +171 -0
  167. package/dist/requirement-analysis/types/index.js +1 -0
  168. package/dist/requirement-analysis/types/tech-stack.d.ts +213 -0
  169. package/dist/requirement-analysis/types/tech-stack.js +1 -0
  170. package/dist/requirement-analysis/utils/error-handler.d.ts +112 -0
  171. package/dist/requirement-analysis/utils/error-handler.js +1 -0
  172. package/dist/types/index.d.ts +4 -2
  173. package/dist/types/index.js +1 -1
  174. package/dist/utils/id.js +1 -1
  175. package/package.json +4 -2
  176. package/skills/competitor-search/SKILL.md +169 -0
  177. package/skills/demand-analysis/SKILL.md +307 -0
  178. package/skills/feature-search/SKILL.md +182 -0
  179. package/skills/requirement-analysis/README.md +464 -0
  180. package/skills/requirement-analysis/SKILL.md +224 -0
  181. package/skills/requirement-analysis/templates/feature-mapping-template.json +210 -0
  182. package/skills/requirement-analysis/templates/prd-template.md +104 -0
  183. package/skills/tech-selection/SKILL.md +198 -0
  184. package/dist/__e2e__/01-state-engine.e2e.test.d.ts +0 -10
  185. package/dist/__e2e__/01-state-engine.e2e.test.js +0 -1
  186. package/dist/acceptance/lazyDetector.test.d.ts +0 -1
  187. package/dist/acceptance/lazyDetector.test.js +0 -1
  188. package/dist/acceptance/reporter.test.d.ts +0 -1
  189. package/dist/acceptance/reporter.test.js +0 -1
  190. package/dist/acceptance/runner.test.d.ts +0 -1
  191. package/dist/acceptance/runner.test.js +0 -1
  192. package/dist/context/promptTemplate.test.d.ts +0 -1
  193. package/dist/context/promptTemplate.test.js +0 -1
  194. package/dist/context/techContextLoader.test.d.ts +0 -1
  195. package/dist/context/techContextLoader.test.js +0 -1
  196. package/dist/machines/agentMachine.test.d.ts +0 -1
  197. package/dist/machines/agentMachine.test.js +0 -1
  198. package/dist/machines/supervisorMachine.test.d.ts +0 -1
  199. package/dist/machines/supervisorMachine.test.js +0 -1
  200. package/dist/persistence/stateFile.test.d.ts +0 -1
  201. package/dist/persistence/stateFile.test.js +0 -1
@@ -0,0 +1,350 @@
1
+ <purpose>
2
+ 基于已完成阶段的 SUMMARY.md、CONTEXT.md 和实现代码,生成单元测试和 E2E 测试。将每个变更文件分类为 TDD(单元)、E2E(浏览器)或跳过类别,向用户展示测试计划以获取批准,然后按照 RED-GREEN 规范生成测试。
3
+
4
+ 用户目前在每个阶段完成后手动编写 `/specops:quick` 提示来生成测试。此工作流通过适当的分类、质量门控和缺口报告来标准化这一过程。
5
+ </purpose>
6
+
7
+ <required_reading>
8
+ 在开始之前,阅读调用提示的 execution_context 中引用的所有文件。
9
+ </required_reading>
10
+
11
+ <process>
12
+
13
+ <step name="parse_arguments">
14
+ 解析 `$ARGUMENTS`:
15
+ - 阶段编号(整数、小数或字母后缀)→ 存储为 `$PHASE_ARG`
16
+ - 阶段编号后的剩余文本 → 存储为 `$EXTRA_INSTRUCTIONS`(可选)
17
+
18
+ 示例:`/specops:add-tests 12 focus on edge cases` → `$PHASE_ARG=12`,`$EXTRA_INSTRUCTIONS="focus on edge cases"`
19
+
20
+ 如果未提供阶段参数:
21
+
22
+ ```
23
+ 错误:需要提供阶段编号
24
+ 用法:/specops:add-tests <阶段> [附加说明]
25
+ 示例:/specops:add-tests 12
26
+ 示例:/specops:add-tests 12 focus on edge cases in the pricing module
27
+ ```
28
+
29
+ 退出。
30
+ </step>
31
+
32
+ <step name="init_context">
33
+ 加载阶段操作上下文:
34
+
35
+ ```bash
36
+ INIT=$(node .opencode/bin/specops-tools.cjs init phase-op "${PHASE_ARG}")
37
+ ```
38
+
39
+ 从初始化 JSON 中提取:`phase_dir`、`phase_number`、`phase_name`。
40
+
41
+ 验证阶段目录是否存在。如果不存在:
42
+ ```
43
+ 错误:未找到阶段 ${PHASE_ARG} 的目录
44
+ 请确保阶段存在于 .planning/phases/ 中
45
+ ```
46
+ 退出。
47
+
48
+ 按优先级读取阶段产物:
49
+ 1. `${phase_dir}/*-SUMMARY.md` — 实现了什么,变更了哪些文件
50
+ 2. `${phase_dir}/CONTEXT.md` — 验收标准,决策
51
+ 3. `${phase_dir}/*-VERIFICATION.md` — 用户验证的场景(如果做了 UAT)
52
+
53
+ 如果没有 SUMMARY.md:
54
+ ```
55
+ 错误:未找到阶段 ${PHASE_ARG} 的 SUMMARY.md
56
+ 此命令适用于已完成的阶段。请先运行 /specops:execute-phase。
57
+ ```
58
+ 退出。
59
+
60
+ 展示横幅:
61
+ ```
62
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
63
+ SpecOps ► 添加测试 — 阶段 ${phase_number}:${phase_name}
64
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
65
+ ```
66
+ </step>
67
+
68
+ <step name="analyze_implementation">
69
+ 从 SUMMARY.md 的"Files Changed"或等效部分提取阶段修改的文件列表。
70
+
71
+ 对于每个文件,分类为以下三个类别之一:
72
+
73
+ | 类别 | 标准 | 测试类型 |
74
+ |------|------|----------|
75
+ | **TDD** | 纯函数,可以编写 `expect(fn(input)).toBe(output)` | 单元测试 |
76
+ | **E2E** | 可通过浏览器自动化验证的 UI 行为 | Playwright/E2E 测试 |
77
+ | **跳过** | 无法有意义地测试或已被覆盖 | 无 |
78
+
79
+ **TDD 分类——适用于:**
80
+ - 业务逻辑:计算、定价、税务规则、验证
81
+ - 数据转换:映射、过滤、聚合、格式化
82
+ - 解析器:CSV、JSON、XML、自定义格式解析
83
+ - 验证器:输入验证、schema 验证、业务规则
84
+ - 状态机:状态转换、工作流步骤
85
+ - 工具函数:字符串操作、日期处理、数字格式化
86
+
87
+ **E2E 分类——适用于:**
88
+ - 键盘快捷键:按键绑定、修饰键、组合键序列
89
+ - 导航:页面跳转、路由、面包屑、前进/后退
90
+ - 表单交互:提交、验证错误、字段焦点、自动完成
91
+ - 选择:行选择、多选、Shift+点击范围
92
+ - 拖放:重新排序、在容器间移动
93
+ - 模态对话框:打开、关闭、确认、取消
94
+ - 数据网格:排序、过滤、内联编辑、列调整
95
+
96
+ **跳过分类——适用于:**
97
+ - UI 布局/样式:CSS 类、视觉外观、响应式断点
98
+ - 配置:配置文件、环境变量、功能开关
99
+ - 胶水代码:依赖注入设置、中间件注册、路由表
100
+ - 迁移:数据库迁移、schema 变更
101
+ - 简单 CRUD:无业务逻辑的基本增删改查
102
+ - 类型定义:无逻辑的 record、DTO、interface
103
+
104
+ 阅读每个文件以验证分类。不要仅根据文件名分类。
105
+ </step>
106
+
107
+ <step name="present_classification">
108
+ 在继续之前向用户展示分类以获取确认:
109
+
110
+ ```
111
+ AskUserQuestion(
112
+ header: "测试分类",
113
+ question: |
114
+ ## 已分类的测试文件
115
+
116
+ ### TDD(单元测试)— {N} 个文件
117
+ {文件列表及简要原因}
118
+
119
+ ### E2E(浏览器测试)— {M} 个文件
120
+ {文件列表及简要原因}
121
+
122
+ ### 跳过 — {K} 个文件
123
+ {文件列表及简要原因}
124
+
125
+ {如果有 $EXTRA_INSTRUCTIONS:"附加说明:${EXTRA_INSTRUCTIONS}"}
126
+
127
+ 你希望如何继续?
128
+ options:
129
+ - "批准并生成测试计划"
130
+ - "调整分类(我来指定变更)"
131
+ - "取消"
132
+ )
133
+ ```
134
+
135
+ 如果用户选择"调整分类":应用其变更并重新展示。
136
+ 如果用户选择"取消":优雅退出。
137
+ </step>
138
+
139
+ <step name="discover_test_structure">
140
+ 在生成测试计划之前,发现项目现有的测试结构:
141
+
142
+ ```bash
143
+ # 查找现有测试目录
144
+ find . -type d -name "*test*" -o -name "*spec*" -o -name "*__tests__*" 2>/dev/null | head -20
145
+ # 查找现有测试文件以匹配命名规范
146
+ find . -type f \( -name "*.test.*" -o -name "*.spec.*" -o -name "*Tests.fs" -o -name "*Test.fs" \) 2>/dev/null | head -20
147
+ # 检查测试运行器
148
+ ls package.json *.sln 2>/dev/null
149
+ ```
150
+
151
+ 识别:
152
+ - 测试目录结构(单元测试在哪里,E2E 测试在哪里)
153
+ - 命名规范(`.test.ts`、`.spec.ts`、`*Tests.fs` 等)
154
+ - 测试运行命令(如何执行单元测试,如何执行 E2E 测试)
155
+ - 测试框架(xUnit、NUnit、Jest、Playwright 等)
156
+
157
+ 如果测试结构不明确,询问用户:
158
+ ```
159
+ AskUserQuestion(
160
+ header: "测试结构",
161
+ question: "我发现了多个测试位置。应该在哪里创建测试?",
162
+ options: [列出发现的位置]
163
+ )
164
+ ```
165
+ </step>
166
+
167
+ <step name="generate_test_plan">
168
+ 为每个已批准的文件创建详细的测试计划。
169
+
170
+ **对于 TDD 文件**,按照 RED-GREEN-REFACTOR 规划测试:
171
+ 1. 识别文件中可测试的函数/方法
172
+ 2. 对于每个函数:列出输入场景、预期输出、边界情况
173
+ 3. 注意:由于代码已存在,测试可能立即通过——这没问题,但要验证它们测试的是正确的行为
174
+
175
+ **对于 E2E 文件**,按照 RED-GREEN 门控规划测试:
176
+ 1. 从 CONTEXT.md/VERIFICATION.md 识别用户场景
177
+ 2. 对于每个场景:描述用户操作、预期结果、断言
178
+ 3. 注意:RED 门控意味着确认如果功能损坏测试会失败
179
+
180
+ 展示完整的测试计划:
181
+
182
+ ```
183
+ AskUserQuestion(
184
+ header: "测试计划",
185
+ question: |
186
+ ## 测试生成计划
187
+
188
+ ### 单元测试({N} 个测试,跨 {M} 个文件)
189
+ {对于每个文件:测试文件路径,测试用例列表}
190
+
191
+ ### E2E 测试({P} 个测试,跨 {Q} 个文件)
192
+ {对于每个文件:测试文件路径,测试场景列表}
193
+
194
+ ### 测试命令
195
+ - 单元:{发现的测试命令}
196
+ - E2E:{发现的 E2E 命令}
197
+
198
+ 准备好生成了吗?
199
+ options:
200
+ - "全部生成"
201
+ - "挑选(我来指定)"
202
+ - "调整计划"
203
+ )
204
+ ```
205
+
206
+ 如果选择"挑选":询问用户要包含哪些测试。
207
+ 如果选择"调整计划":应用变更并重新展示。
208
+ </step>
209
+
210
+ <step name="execute_tdd_generation">
211
+ 对于每个已批准的 TDD 测试:
212
+
213
+ 1. **创建测试文件**,遵循发现的项目规范(目录、命名、导入)
214
+
215
+ 2. **编写测试**,使用清晰的 arrange/act/assert 结构:
216
+ ```
217
+ // Arrange — 设置输入和预期输出
218
+ // Act — 调用被测函数
219
+ // Assert — 验证输出符合预期
220
+ ```
221
+
222
+ 3. **运行测试**:
223
+ ```bash
224
+ {discovered test command}
225
+ ```
226
+
227
+ 4. **评估结果:**
228
+ - **测试通过**:好——实现满足测试。验证测试检查的是有意义的行为(不仅仅是能编译)。
229
+ - **测试因断言错误失败**:这可能是测试发现的真正 bug。标记它:
230
+ ```
231
+ ⚠️ 发现潜在 bug:{测试名称}
232
+ 预期:{expected}
233
+ 实际:{actual}
234
+ 文件:{实现文件}
235
+ ```
236
+ 不要修复实现——这是测试生成命令,不是修复命令。记录发现。
237
+ - **测试因错误失败(导入、语法等)**:这是测试错误。修复测试并重新运行。
238
+ </step>
239
+
240
+ <step name="execute_e2e_generation">
241
+ 对于每个已批准的 E2E 测试:
242
+
243
+ 1. **检查是否有覆盖相同场景的现有测试**:
244
+ ```bash
245
+ grep -r "{scenario keyword}" {e2e test directory} 2>/dev/null
246
+ ```
247
+ 如果找到,扩展而非重复。
248
+
249
+ 2. **创建测试文件**,针对 CONTEXT.md/VERIFICATION.md 中的用户场景
250
+
251
+ 3. **运行 E2E 测试**:
252
+ ```bash
253
+ {discovered e2e command}
254
+ ```
255
+
256
+ 4. **评估结果:**
257
+ - **GREEN(通过)**:记录成功
258
+ - **RED(失败)**:判断是测试问题还是真正的应用 bug。标记 bug:
259
+ ```
260
+ ⚠️ E2E 失败:{测试名称}
261
+ 场景:{描述}
262
+ 错误:{错误消息}
263
+ ```
264
+ - **无法运行**:报告阻塞。不要标记为完成。
265
+ ```
266
+ 🛑 E2E 阻塞:{测试无法运行的原因}
267
+ ```
268
+
269
+ **不可跳过规则:** 如果 E2E 测试无法执行(缺少依赖、环境问题),报告阻塞并将测试标记为未完成。永远不要在未实际运行测试的情况下标记成功。
270
+ </step>
271
+
272
+ <step name="summary_and_commit">
273
+ 创建测试覆盖率报告并展示给用户:
274
+
275
+ ```
276
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
277
+ SpecOps ► 测试生成完成
278
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
279
+
280
+ ## 结果
281
+
282
+ | 类别 | 已生成 | 通过 | 失败 | 阻塞 |
283
+ |------|--------|------|------|------|
284
+ | 单元 | {N} | {n1} | {n2} | {n3} |
285
+ | E2E | {M} | {m1} | {m2} | {m3} |
286
+
287
+ ## 创建/修改的文件
288
+ {测试文件列表及路径}
289
+
290
+ ## 覆盖缺口
291
+ {无法测试的区域及原因}
292
+
293
+ ## 发现的 Bug
294
+ {表明实现 bug 的断言失败}
295
+ ```
296
+
297
+ 在项目状态中记录测试生成:
298
+ ```bash
299
+ node .opencode/bin/specops-tools.cjs state-snapshot
300
+ ```
301
+
302
+ 如果有通过的测试需要提交:
303
+
304
+ ```bash
305
+ git add {test files}
306
+ git commit -m "test(phase-${phase_number}): add unit and E2E tests from add-tests command"
307
+ ```
308
+
309
+ 展示后续步骤:
310
+
311
+ ```
312
+ ---
313
+
314
+ ## ▶ 下一步
315
+
316
+ {如果发现了 bug:}
317
+ **修复发现的 bug:** `/specops:quick fix the {N} test failures discovered in phase ${phase_number}`
318
+
319
+ {如果有阻塞的测试:}
320
+ **解决测试阻塞:** {需要什么的描述}
321
+
322
+ {否则:}
323
+ **所有测试通过!** 阶段 ${phase_number} 已完全测试。
324
+
325
+ ---
326
+
327
+ **其他可用操作:**
328
+ - `/specops:add-tests {next_phase}` — 测试另一个阶段
329
+ - `/specops:verify-work {phase_number}` — 运行 UAT 验证
330
+
331
+ ---
332
+ ```
333
+ </step>
334
+
335
+ </process>
336
+
337
+ <success_criteria>
338
+ - [ ] 已加载阶段产物(SUMMARY.md、CONTEXT.md,可选 VERIFICATION.md)
339
+ - [ ] 所有变更文件已分类为 TDD/E2E/跳过类别
340
+ - [ ] 分类已展示给用户并获得批准
341
+ - [ ] 已发现项目测试结构(目录、规范、运行器)
342
+ - [ ] 测试计划已展示给用户并获得批准
343
+ - [ ] 已生成具有 arrange/act/assert 结构的 TDD 测试
344
+ - [ ] 已生成针对用户场景的 E2E 测试
345
+ - [ ] 所有测试已执行——没有未运行的测试被标记为通过
346
+ - [ ] 测试发现的 bug 已标记(未修复)
347
+ - [ ] 测试文件已用正确的消息提交
348
+ - [ ] 覆盖缺口已记录
349
+ - [ ] 已向用户展示后续步骤
350
+ </success_criteria>
@@ -0,0 +1,157 @@
1
+ <purpose>
2
+ 在 SpecOps 会话中捕获浮现的想法、任务或问题,作为结构化的待办事项供后续处理。实现"想法 → 捕获 → 继续"的流程,不丢失上下文。
3
+ </purpose>
4
+
5
+ <required_reading>
6
+ 在开始之前,阅读调用提示的 execution_context 中引用的所有文件。
7
+ </required_reading>
8
+
9
+ <process>
10
+
11
+ <step name="init_context">
12
+ 加载待办事项上下文:
13
+
14
+ ```bash
15
+ INIT=$(node .opencode/bin/specops-tools.cjs init todos)
16
+ ```
17
+
18
+ 从 init JSON 中提取:`commit_docs`、`date`、`timestamp`、`todo_count`、`todos`、`pending_dir`、`todos_dir_exists`。
19
+
20
+ 确保目录存在:
21
+ ```bash
22
+ mkdir -p .planning/todos/pending .planning/todos/done
23
+ ```
24
+
25
+ 记录 todos 数组中已有的领域,以便在 infer_area 步骤中保持一致性。
26
+ </step>
27
+
28
+ <step name="extract_content">
29
+ **有参数时:** 使用参数作为标题/焦点。
30
+ - `/specops:add-todo Add auth token refresh` → title = "Add auth token refresh"
31
+
32
+ **无参数时:** 分析最近的对话以提取:
33
+ - 讨论的具体问题、想法或任务
34
+ - 提到的相关文件路径
35
+ - 技术细节(错误消息、行号、约束条件)
36
+
37
+ 整理:
38
+ - `title`:3-10 个词的描述性标题(优先使用动词开头)
39
+ - `problem`:问题是什么或为什么需要这个
40
+ - `solution`:方法提示或"TBD"(如果只是一个想法)
41
+ - `files`:对话中提到的相关路径及行号
42
+ </step>
43
+
44
+ <step name="infer_area">
45
+ 从文件路径推断领域:
46
+
47
+ | Path pattern | Area |
48
+ |--------------|------|
49
+ | `src/api/*`, `api/*` | `api` |
50
+ | `src/components/*`, `src/ui/*` | `ui` |
51
+ | `src/auth/*`, `auth/*` | `auth` |
52
+ | `src/db/*`, `database/*` | `database` |
53
+ | `tests/*`, `__tests__/*` | `testing` |
54
+ | `docs/*` | `docs` |
55
+ | `.planning/*` | `planning` |
56
+ | `scripts/*`, `bin/*` | `tooling` |
57
+ | 无文件或不明确 | `general` |
58
+
59
+ 如果存在类似匹配,使用步骤 2 中已有的领域。
60
+ </step>
61
+
62
+ <step name="check_duplicates">
63
+ ```bash
64
+ # Search for key words from title in existing todos
65
+ grep -l -i "[key words from title]" .planning/todos/pending/*.md 2>/dev/null
66
+ ```
67
+
68
+ 如果发现潜在重复:
69
+ 1. 读取已有的待办事项
70
+ 2. 比较范围
71
+
72
+ 如果有重叠,使用 AskUserQuestion:
73
+ - header:"Duplicate?"
74
+ - question:"存在类似的待办事项:[title]。你想怎么做?"
75
+ - options:
76
+ - "Skip" — 保留已有的待办事项
77
+ - "Replace" — 用新上下文更新已有的
78
+ - "Add anyway" — 创建为单独的待办事项
79
+ </step>
80
+
81
+ <step name="create_file">
82
+ 使用 init 上下文中的值:`timestamp` 和 `date` 已经可用。
83
+
84
+ 为标题生成 slug:
85
+ ```bash
86
+ slug=$(node .opencode/bin/specops-tools.cjs generate-slug "$title" --raw)
87
+ ```
88
+
89
+ 写入 `.planning/todos/pending/${date}-${slug}.md`:
90
+
91
+ ```markdown
92
+ ---
93
+ created: [timestamp]
94
+ title: [title]
95
+ area: [area]
96
+ files:
97
+ - [file:lines]
98
+ ---
99
+
100
+ ## Problem
101
+
102
+ [problem description - enough context for future Claude to understand weeks later]
103
+
104
+ ## Solution
105
+
106
+ [approach hints or "TBD"]
107
+ ```
108
+ </step>
109
+
110
+ <step name="update_state">
111
+ 如果 `.planning/STATE.md` 存在:
112
+
113
+ 1. 使用 init 上下文中的 `todo_count`(如果计数已变化则重新运行 `init todos`)
114
+ 2. 更新 "## Accumulated Context" 下的 "### Pending Todos"
115
+ </step>
116
+
117
+ <step name="git_commit">
118
+ 提交待办事项和任何更新的状态:
119
+
120
+ ```bash
121
+ node .opencode/bin/specops-tools.cjs commit "docs: capture todo - [title]" --files .planning/todos/pending/[filename] .planning/STATE.md
122
+ ```
123
+
124
+ 工具会自动遵循 `commit_docs` 配置和 gitignore。
125
+
126
+ 确认:"Committed: docs: capture todo - [title]"
127
+ </step>
128
+
129
+ <step name="confirm">
130
+ ```
131
+ Todo saved: .planning/todos/pending/[filename]
132
+
133
+ [title]
134
+ Area: [area]
135
+ Files: [count] referenced
136
+
137
+ ---
138
+
139
+ Would you like to:
140
+
141
+ 1. Continue with current work
142
+ 2. Add another todo
143
+ 3. View all todos (/specops:check-todos)
144
+ ```
145
+ </step>
146
+
147
+ </process>
148
+
149
+ <success_criteria>
150
+ - [ ] 目录结构已存在
151
+ - [ ] 待办事项文件已创建,包含有效的 frontmatter
152
+ - [ ] Problem 部分有足够的上下文供未来的 Claude 理解
153
+ - [ ] 已检查并解决重复项
154
+ - [ ] 领域与已有待办事项保持一致
155
+ - [ ] STATE.md 已更新(如果存在)
156
+ - [ ] 待办事项和状态已提交到 git
157
+ </success_criteria>