openspec-cn 0.23.0

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 (235) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +153 -0
  3. package/bin/openspec.js +3 -0
  4. package/dist/cli/index.d.ts +2 -0
  5. package/dist/cli/index.js +480 -0
  6. package/dist/commands/change.d.ts +35 -0
  7. package/dist/commands/change.js +277 -0
  8. package/dist/commands/completion.d.ts +72 -0
  9. package/dist/commands/completion.js +257 -0
  10. package/dist/commands/config.d.ts +8 -0
  11. package/dist/commands/config.js +198 -0
  12. package/dist/commands/feedback.d.ts +9 -0
  13. package/dist/commands/feedback.js +183 -0
  14. package/dist/commands/schema.d.ts +6 -0
  15. package/dist/commands/schema.js +869 -0
  16. package/dist/commands/show.d.ts +14 -0
  17. package/dist/commands/show.js +132 -0
  18. package/dist/commands/spec.d.ts +15 -0
  19. package/dist/commands/spec.js +225 -0
  20. package/dist/commands/validate.d.ts +24 -0
  21. package/dist/commands/validate.js +294 -0
  22. package/dist/commands/workflow/index.d.ts +17 -0
  23. package/dist/commands/workflow/index.js +12 -0
  24. package/dist/commands/workflow/instructions.d.ts +29 -0
  25. package/dist/commands/workflow/instructions.js +381 -0
  26. package/dist/commands/workflow/new-change.d.ts +11 -0
  27. package/dist/commands/workflow/new-change.js +44 -0
  28. package/dist/commands/workflow/schemas.d.ts +10 -0
  29. package/dist/commands/workflow/schemas.js +34 -0
  30. package/dist/commands/workflow/shared.d.ts +52 -0
  31. package/dist/commands/workflow/shared.js +111 -0
  32. package/dist/commands/workflow/status.d.ts +14 -0
  33. package/dist/commands/workflow/status.js +58 -0
  34. package/dist/commands/workflow/templates.d.ts +16 -0
  35. package/dist/commands/workflow/templates.js +68 -0
  36. package/dist/core/archive.d.ts +11 -0
  37. package/dist/core/archive.js +280 -0
  38. package/dist/core/artifact-graph/graph.d.ts +56 -0
  39. package/dist/core/artifact-graph/graph.js +141 -0
  40. package/dist/core/artifact-graph/index.d.ts +7 -0
  41. package/dist/core/artifact-graph/index.js +13 -0
  42. package/dist/core/artifact-graph/instruction-loader.d.ts +143 -0
  43. package/dist/core/artifact-graph/instruction-loader.js +214 -0
  44. package/dist/core/artifact-graph/resolver.d.ts +81 -0
  45. package/dist/core/artifact-graph/resolver.js +257 -0
  46. package/dist/core/artifact-graph/schema.d.ts +13 -0
  47. package/dist/core/artifact-graph/schema.js +108 -0
  48. package/dist/core/artifact-graph/state.d.ts +12 -0
  49. package/dist/core/artifact-graph/state.js +54 -0
  50. package/dist/core/artifact-graph/types.d.ts +45 -0
  51. package/dist/core/artifact-graph/types.js +43 -0
  52. package/dist/core/command-generation/adapters/amazon-q.d.ts +13 -0
  53. package/dist/core/command-generation/adapters/amazon-q.js +26 -0
  54. package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
  55. package/dist/core/command-generation/adapters/antigravity.js +26 -0
  56. package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
  57. package/dist/core/command-generation/adapters/auggie.js +27 -0
  58. package/dist/core/command-generation/adapters/claude.d.ts +13 -0
  59. package/dist/core/command-generation/adapters/claude.js +50 -0
  60. package/dist/core/command-generation/adapters/cline.d.ts +14 -0
  61. package/dist/core/command-generation/adapters/cline.js +27 -0
  62. package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
  63. package/dist/core/command-generation/adapters/codebuddy.js +28 -0
  64. package/dist/core/command-generation/adapters/codex.d.ts +13 -0
  65. package/dist/core/command-generation/adapters/codex.js +27 -0
  66. package/dist/core/command-generation/adapters/continue.d.ts +13 -0
  67. package/dist/core/command-generation/adapters/continue.js +28 -0
  68. package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
  69. package/dist/core/command-generation/adapters/costrict.js +27 -0
  70. package/dist/core/command-generation/adapters/crush.d.ts +13 -0
  71. package/dist/core/command-generation/adapters/crush.js +30 -0
  72. package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
  73. package/dist/core/command-generation/adapters/cursor.js +44 -0
  74. package/dist/core/command-generation/adapters/factory.d.ts +13 -0
  75. package/dist/core/command-generation/adapters/factory.js +27 -0
  76. package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
  77. package/dist/core/command-generation/adapters/gemini.js +26 -0
  78. package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
  79. package/dist/core/command-generation/adapters/github-copilot.js +26 -0
  80. package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
  81. package/dist/core/command-generation/adapters/iflow.js +29 -0
  82. package/dist/core/command-generation/adapters/index.d.ts +27 -0
  83. package/dist/core/command-generation/adapters/index.js +27 -0
  84. package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
  85. package/dist/core/command-generation/adapters/kilocode.js +23 -0
  86. package/dist/core/command-generation/adapters/opencode.d.ts +13 -0
  87. package/dist/core/command-generation/adapters/opencode.js +26 -0
  88. package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
  89. package/dist/core/command-generation/adapters/qoder.js +30 -0
  90. package/dist/core/command-generation/adapters/qwen.d.ts +13 -0
  91. package/dist/core/command-generation/adapters/qwen.js +26 -0
  92. package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
  93. package/dist/core/command-generation/adapters/roocode.js +27 -0
  94. package/dist/core/command-generation/adapters/windsurf.d.ts +14 -0
  95. package/dist/core/command-generation/adapters/windsurf.js +51 -0
  96. package/dist/core/command-generation/generator.d.ts +21 -0
  97. package/dist/core/command-generation/generator.js +27 -0
  98. package/dist/core/command-generation/index.d.ts +22 -0
  99. package/dist/core/command-generation/index.js +24 -0
  100. package/dist/core/command-generation/registry.d.ts +36 -0
  101. package/dist/core/command-generation/registry.js +88 -0
  102. package/dist/core/command-generation/types.d.ts +55 -0
  103. package/dist/core/command-generation/types.js +8 -0
  104. package/dist/core/completions/command-registry.d.ts +7 -0
  105. package/dist/core/completions/command-registry.js +456 -0
  106. package/dist/core/completions/completion-provider.d.ts +60 -0
  107. package/dist/core/completions/completion-provider.js +102 -0
  108. package/dist/core/completions/factory.d.ts +64 -0
  109. package/dist/core/completions/factory.js +75 -0
  110. package/dist/core/completions/generators/bash-generator.d.ts +32 -0
  111. package/dist/core/completions/generators/bash-generator.js +174 -0
  112. package/dist/core/completions/generators/fish-generator.d.ts +32 -0
  113. package/dist/core/completions/generators/fish-generator.js +157 -0
  114. package/dist/core/completions/generators/powershell-generator.d.ts +33 -0
  115. package/dist/core/completions/generators/powershell-generator.js +207 -0
  116. package/dist/core/completions/generators/zsh-generator.d.ts +44 -0
  117. package/dist/core/completions/generators/zsh-generator.js +250 -0
  118. package/dist/core/completions/installers/bash-installer.d.ts +87 -0
  119. package/dist/core/completions/installers/bash-installer.js +318 -0
  120. package/dist/core/completions/installers/fish-installer.d.ts +43 -0
  121. package/dist/core/completions/installers/fish-installer.js +143 -0
  122. package/dist/core/completions/installers/powershell-installer.d.ts +88 -0
  123. package/dist/core/completions/installers/powershell-installer.js +327 -0
  124. package/dist/core/completions/installers/zsh-installer.d.ts +125 -0
  125. package/dist/core/completions/installers/zsh-installer.js +449 -0
  126. package/dist/core/completions/templates/bash-templates.d.ts +6 -0
  127. package/dist/core/completions/templates/bash-templates.js +24 -0
  128. package/dist/core/completions/templates/fish-templates.d.ts +7 -0
  129. package/dist/core/completions/templates/fish-templates.js +39 -0
  130. package/dist/core/completions/templates/powershell-templates.d.ts +6 -0
  131. package/dist/core/completions/templates/powershell-templates.js +25 -0
  132. package/dist/core/completions/templates/zsh-templates.d.ts +6 -0
  133. package/dist/core/completions/templates/zsh-templates.js +36 -0
  134. package/dist/core/completions/types.d.ts +79 -0
  135. package/dist/core/completions/types.js +2 -0
  136. package/dist/core/config-prompts.d.ts +9 -0
  137. package/dist/core/config-prompts.js +34 -0
  138. package/dist/core/config-schema.d.ts +76 -0
  139. package/dist/core/config-schema.js +200 -0
  140. package/dist/core/config.d.ts +17 -0
  141. package/dist/core/config.js +30 -0
  142. package/dist/core/converters/json-converter.d.ts +6 -0
  143. package/dist/core/converters/json-converter.js +51 -0
  144. package/dist/core/global-config.d.ts +39 -0
  145. package/dist/core/global-config.js +115 -0
  146. package/dist/core/index.d.ts +2 -0
  147. package/dist/core/index.js +3 -0
  148. package/dist/core/init.d.ts +32 -0
  149. package/dist/core/init.js +433 -0
  150. package/dist/core/legacy-cleanup.d.ts +162 -0
  151. package/dist/core/legacy-cleanup.js +501 -0
  152. package/dist/core/list.d.ts +9 -0
  153. package/dist/core/list.js +171 -0
  154. package/dist/core/parsers/change-parser.d.ts +13 -0
  155. package/dist/core/parsers/change-parser.js +193 -0
  156. package/dist/core/parsers/markdown-parser.d.ts +22 -0
  157. package/dist/core/parsers/markdown-parser.js +187 -0
  158. package/dist/core/parsers/requirement-blocks.d.ts +37 -0
  159. package/dist/core/parsers/requirement-blocks.js +201 -0
  160. package/dist/core/project-config.d.ts +64 -0
  161. package/dist/core/project-config.js +223 -0
  162. package/dist/core/schemas/base.schema.d.ts +13 -0
  163. package/dist/core/schemas/base.schema.js +13 -0
  164. package/dist/core/schemas/change.schema.d.ts +73 -0
  165. package/dist/core/schemas/change.schema.js +31 -0
  166. package/dist/core/schemas/index.d.ts +4 -0
  167. package/dist/core/schemas/index.js +4 -0
  168. package/dist/core/schemas/spec.schema.d.ts +18 -0
  169. package/dist/core/schemas/spec.schema.js +15 -0
  170. package/dist/core/shared/index.d.ts +8 -0
  171. package/dist/core/shared/index.js +8 -0
  172. package/dist/core/shared/skill-generation.d.ts +41 -0
  173. package/dist/core/shared/skill-generation.js +74 -0
  174. package/dist/core/shared/tool-detection.d.ts +66 -0
  175. package/dist/core/shared/tool-detection.js +140 -0
  176. package/dist/core/specs-apply.d.ts +73 -0
  177. package/dist/core/specs-apply.js +384 -0
  178. package/dist/core/styles/palette.d.ts +7 -0
  179. package/dist/core/styles/palette.js +8 -0
  180. package/dist/core/templates/index.d.ts +8 -0
  181. package/dist/core/templates/index.js +9 -0
  182. package/dist/core/templates/skill-templates.d.ts +112 -0
  183. package/dist/core/templates/skill-templates.js +2893 -0
  184. package/dist/core/update.d.ts +42 -0
  185. package/dist/core/update.js +306 -0
  186. package/dist/core/validation/constants.d.ts +34 -0
  187. package/dist/core/validation/constants.js +40 -0
  188. package/dist/core/validation/types.d.ts +18 -0
  189. package/dist/core/validation/types.js +2 -0
  190. package/dist/core/validation/validator.d.ts +33 -0
  191. package/dist/core/validation/validator.js +409 -0
  192. package/dist/core/view.d.ts +8 -0
  193. package/dist/core/view.js +168 -0
  194. package/dist/index.d.ts +3 -0
  195. package/dist/index.js +3 -0
  196. package/dist/prompts/searchable-multi-select.d.ts +27 -0
  197. package/dist/prompts/searchable-multi-select.js +149 -0
  198. package/dist/telemetry/config.d.ts +32 -0
  199. package/dist/telemetry/config.js +68 -0
  200. package/dist/telemetry/index.d.ts +31 -0
  201. package/dist/telemetry/index.js +145 -0
  202. package/dist/ui/ascii-patterns.d.ts +16 -0
  203. package/dist/ui/ascii-patterns.js +133 -0
  204. package/dist/ui/welcome-screen.d.ts +10 -0
  205. package/dist/ui/welcome-screen.js +146 -0
  206. package/dist/utils/change-metadata.d.ts +51 -0
  207. package/dist/utils/change-metadata.js +147 -0
  208. package/dist/utils/change-utils.d.ts +62 -0
  209. package/dist/utils/change-utils.js +121 -0
  210. package/dist/utils/file-system.d.ts +36 -0
  211. package/dist/utils/file-system.js +281 -0
  212. package/dist/utils/index.d.ts +5 -0
  213. package/dist/utils/index.js +7 -0
  214. package/dist/utils/interactive.d.ts +18 -0
  215. package/dist/utils/interactive.js +21 -0
  216. package/dist/utils/item-discovery.d.ts +4 -0
  217. package/dist/utils/item-discovery.js +72 -0
  218. package/dist/utils/match.d.ts +3 -0
  219. package/dist/utils/match.js +22 -0
  220. package/dist/utils/shell-detection.d.ts +20 -0
  221. package/dist/utils/shell-detection.js +41 -0
  222. package/dist/utils/task-progress.d.ts +8 -0
  223. package/dist/utils/task-progress.js +36 -0
  224. package/package.json +84 -0
  225. package/schemas/spec-driven/schema.yaml +148 -0
  226. package/schemas/spec-driven/templates/design.md +19 -0
  227. package/schemas/spec-driven/templates/proposal.md +23 -0
  228. package/schemas/spec-driven/templates/spec.md +8 -0
  229. package/schemas/spec-driven/templates/tasks.md +9 -0
  230. package/schemas/tdd/schema.yaml +213 -0
  231. package/schemas/tdd/templates/docs.md +15 -0
  232. package/schemas/tdd/templates/implementation.md +11 -0
  233. package/schemas/tdd/templates/spec.md +11 -0
  234. package/schemas/tdd/templates/test.md +11 -0
  235. package/scripts/postinstall.js +147 -0
@@ -0,0 +1,2893 @@
1
+ /**
2
+ * Agent Skill Templates
3
+ *
4
+ * Templates for generating Agent Skills compatible with:
5
+ * - Claude Code
6
+ * - Cursor (Settings → Rules → Import Settings)
7
+ * - Windsurf
8
+ * - Other Agent Skills-compatible editors
9
+ */
10
+ /**
11
+ * Template for openspec-explore skill
12
+ * Explore mode - adaptive thinking partner for exploring ideas and problems
13
+ */
14
+ export function getExploreSkillTemplate() {
15
+ return {
16
+ name: 'openspec-explore',
17
+ description: '进入探索模式——用于探索想法、调查问题、澄清需求的思考伙伴。当用户希望在变更前或过程中深入思考时使用。',
18
+ instructions: `进入探索模式。深度思考,自由可视化。跟随对话自然展开。
19
+
20
+ **IMPORTANT: 探索模式用于思考,而非实现。** 你可以读取文件、搜索代码、调查代码库,但绝不能编写代码或实现功能。如果用户要求实现,提醒他们先退出探索模式(例如使用 \`/opsx:new\` 或 \`/opsx:ff\` 启动变更)。如用户要求,你可以创建 OpenSpec 工件(proposal/design/specs),这属于记录思考,而非实现。
21
+
22
+ **这是一种立场,而非流程。** 没有固定步骤、没有必选顺序、没有强制输出。你是帮助用户探索的思考伙伴。
23
+
24
+ ---
25
+
26
+ ## 立场
27
+
28
+ - **保持好奇而非规定路径** - 问自然涌现的问题,不照本宣科
29
+ - **开放线程而非盘问** - 提供多个有趣方向,让用户选择共鸣点,不把他们引导到单一路径
30
+ - **可视化** - 需要澄清思路时尽量使用 ASCII 图
31
+ - **自适应** - 跟随有价值的线索,出现新信息时及时转向
32
+ - **耐心** - 不急于结论,让问题的轮廓自然显现
33
+ - **落地** - 需要时探索真实代码库,而非纯理论
34
+
35
+ ---
36
+
37
+ ## 你可能会做的事
38
+
39
+ 根据用户提供的信息,你可能会:
40
+
41
+ **探索问题空间**
42
+ - 提出基于对话自然产生的澄清问题
43
+ - 质疑假设
44
+ - 重新表述问题
45
+ - 寻找类比
46
+
47
+ **调查代码库**
48
+ - 梳理与讨论相关的现有架构
49
+ - 找到集成点
50
+ - 识别已有模式
51
+ - 暴露隐藏复杂度
52
+
53
+ **比较选项**
54
+ - 头脑风暴多种方案
55
+ - 构建对比表
56
+ - 勾勒权衡
57
+ - 如被请求则给出建议路径
58
+
59
+ **可视化**
60
+ \`\`\`
61
+ ┌─────────────────────────────────────────┐
62
+ │ 尽量使用 ASCII 图表 │
63
+ ├─────────────────────────────────────────┤
64
+ │ │
65
+ │ ┌────────┐ ┌────────┐ │
66
+ │ │ State │────────▶│ State │ │
67
+ │ │ A │ │ B │ │
68
+ │ └────────┘ └────────┘ │
69
+ │ │
70
+ │ 系统图、状态机、数据流、 │
71
+ │ 架构草图、依赖图、对比表 │
72
+ │ │
73
+ └─────────────────────────────────────────┘
74
+ \`\`\`
75
+
76
+ **暴露风险与未知**
77
+ - 识别可能出错的地方
78
+ - 找出认知空白
79
+ - 建议进行探索性调研或验证
80
+
81
+ ---
82
+
83
+ ## OpenSpec 认知
84
+
85
+ 你拥有 OpenSpec 系统的完整上下文。自然使用,不要生硬强推。
86
+
87
+ ### 检查上下文
88
+
89
+ 开始时,快速查看已有内容:
90
+ \`\`\`bash
91
+ openspec list --json
92
+ \`\`\`
93
+
94
+ 这会告诉你:
95
+ - 是否存在活跃变更
96
+ - 变更名称、工作流与状态
97
+ - 用户可能正在做什么
98
+
99
+ ### 当没有变更时
100
+
101
+ 自由思考。当洞见逐渐清晰时,你可以:
102
+
103
+ - "现在信息已经足够开始变更了,要我创建一个吗?"
104
+ → 可转为 \`/opsx:new\` 或 \`/opsx:ff\`
105
+ - 或继续探索——无需急于形式化
106
+
107
+ ### 当已存在变更时
108
+
109
+ 如果用户提到某个变更,或你判断其相关:
110
+
111
+ 1. **读取现有工件作为上下文**
112
+ - \`openspec/changes/<name>/proposal.md\`
113
+ - \`openspec/changes/<name>/design.md\`
114
+ - \`openspec/changes/<name>/tasks.md\`
115
+ - etc.
116
+
117
+ 2. **在对话中自然引用**
118
+ - "你的设计里提到用 Redis,但我们刚发现 SQLite 更合适..."
119
+ - "提案里将范围限定在高级用户,但现在我们在想是否所有人..."
120
+
121
+ 3. **当决策形成时建议记录**
122
+
123
+ | 洞见类型 | 记录位置 |
124
+ |--------------|------------------|
125
+ | 新需求 | \`specs/<capability>/spec.md\` |
126
+ | 需求变更 | \`specs/<capability>/spec.md\` |
127
+ | 设计决策 | \`design.md\` |
128
+ | 范围变化 | \`proposal.md\` |
129
+ | 新工作 | \`tasks.md\` |
130
+ | 假设被推翻 | 相应工件 |
131
+
132
+ 示例话术:
133
+ - "这是一个设计决策,要记录到 design.md 吗?"
134
+ - "这是新需求,要加到 specs 吗?"
135
+ - "这改变了范围,要更新提案吗?"
136
+
137
+ 4. **由用户决定** - 给出建议即可,不要施压,也不要自动记录。
138
+
139
+ ---
140
+
141
+ ## 不必做的事
142
+
143
+ - 按脚本走
144
+ - 每次都问同样的问题
145
+ - 产出某个固定工件
146
+ - 得出结论
147
+ - 有价值的岔路也必须回到主线
148
+ - 简短表达(这是思考时间)
149
+
150
+ ---
151
+
152
+ ## 不同进入方式的处理
153
+
154
+ **用户带着模糊想法:**
155
+ \`\`\`
156
+ User: I'm thinking about adding real-time collaboration
157
+
158
+ You: 实时协作很大,我先想一想...
159
+
160
+ COLLABORATION SPECTRUM
161
+ ════════════════════════════════════════════
162
+
163
+ Awareness Coordination Sync
164
+ │ │ │
165
+ ▼ ▼ ▼
166
+ ┌────────┐ ┌────────┐ ┌────────┐
167
+ │Presence│ │Cursors │ │ CRDT │
168
+ │ "3 │ │ Multi │ │Conflict│
169
+ │online" │ │ select │ │ free │
170
+ └────────┘ └────────┘ └────────┘
171
+ │ │ │
172
+ trivial moderate complex
173
+
174
+ 你更倾向哪一类?
175
+ \`\`\`
176
+
177
+ **用户带来具体问题:**
178
+ \`\`\`
179
+ User: The auth system is a mess
180
+
181
+ You: [读取代码库]
182
+
183
+ ┌─────────────────────────────────────────────┐
184
+ │ CURRENT AUTH FLOW │
185
+ └─────────────────────────────────────────────┘
186
+
187
+ ┌─────────────┼─────────────┐
188
+ ▼ ▼ ▼
189
+ ┌─────────┐ ┌─────────┐ ┌─────────┐
190
+ │ Google │ │ GitHub │ │ Email │
191
+ │ OAuth │ │ OAuth │ │ Magic │
192
+ └────┬────┘ └────┬────┘ └────┬────┘
193
+ │ │ │
194
+ └─────────────┼─────────────┘
195
+
196
+ ┌───────────┐
197
+ │ Session │
198
+ └─────┬─────┘
199
+
200
+
201
+ ┌───────────┐
202
+ │ Perms │
203
+ └───────────┘
204
+
205
+ I see three tangles. Which one's burning?
206
+ \`\`\`
207
+
208
+ **用户在实现中卡住:**
209
+ \`\`\`
210
+ User: /opsx:explore add-auth-system
211
+ The OAuth integration is more complex than expected
212
+
213
+ You: [读取变更工件]
214
+
215
+ 你正在做任务 4:"Implement OAuth flow"
216
+
217
+ 我先梳理一下涉及内容...
218
+
219
+ [绘制图示、探索选项、提出路径]
220
+
221
+ 要把这个反映到设计里吗?
222
+ 还是新增一个调研任务?
223
+ \`\`\`
224
+
225
+ **用户希望比较选项:**
226
+ \`\`\`
227
+ User: Should we use Postgres or SQLite?
228
+
229
+ You: 泛泛而谈很无聊。上下文是什么?
230
+
231
+ User: A CLI tool that tracks local dev environments
232
+
233
+ You: 这就完全不同了。
234
+
235
+ ┌─────────────────────────────────────────────────┐
236
+ │ CLI TOOL DATA STORAGE │
237
+ └─────────────────────────────────────────────────┘
238
+
239
+ 关键约束:
240
+ • No daemon running
241
+ • Must work offline
242
+ • Single user
243
+
244
+ SQLite Postgres
245
+ Deployment embedded ✓ needs server ✗
246
+ Offline yes ✓ no ✗
247
+ Single file yes ✓ no ✗
248
+
249
+ SQLite,毫无悬念。
250
+
251
+ 除非... 有同步组件吗?
252
+ \`\`\`
253
+
254
+ ---
255
+
256
+ ## 结束探索
257
+
258
+ 没有固定结尾。探索可能会:
259
+
260
+ - **转入行动**: "准备开始了吗?/opsx:new 或 /opsx:ff"
261
+ - **推动工件更新**: "已将这些决策更新到 design.md"
262
+ - **仅提供澄清**: 用户获得所需信息后继续
263
+ - **稍后继续**: "我们随时可以继续"
264
+
265
+ 当你感觉思路逐渐清晰时,可以做一个简短总结:
266
+
267
+ \`\`\`
268
+ ## 我们得出的结论
269
+
270
+ **问题**: [清晰的理解]
271
+
272
+ **方案**: [如已形成]
273
+
274
+ **未决问题**: [如仍有]
275
+
276
+ **下一步**(如已准备好):
277
+ - 创建变更:/opsx:new <name>
278
+ - 快进到任务:/opsx:ff <name>
279
+ - 继续探索:继续对话即可
280
+ \`\`\`
281
+
282
+ 但总结并非必须。有时思考本身就是价值。
283
+
284
+ ---
285
+
286
+ ## 约束
287
+
288
+ - **不要实现** - 绝不编写代码或实现功能。创建 OpenSpec 工件可以,写应用代码不行。
289
+ - **不要装懂** - 不清楚就继续深挖
290
+ - **不要急** - 这是思考时间,不是任务时间
291
+ - **不要强行结构化** - 让模式自然浮现
292
+ - **不要自动记录** - 先提出建议,别直接动手
293
+ - **要可视化** - 一张好图胜过千言
294
+ - **要探索代码库** - 以现实为依据
295
+ - **要质疑假设** - 包括用户和你自己的`,
296
+ license: 'MIT',
297
+ compatibility: 'Requires openspec CLI.',
298
+ metadata: { author: 'openspec', version: '1.0' },
299
+ };
300
+ }
301
+ /**
302
+ * Template for openspec-new-change skill
303
+ * Based on /opsx:new command
304
+ */
305
+ export function getNewChangeSkillTemplate() {
306
+ return {
307
+ name: 'openspec-new-change',
308
+ description: '使用实验性工件工作流启动新的 OpenSpec 变更。适用于用户希望以结构化步骤创建新功能、修复或修改时。',
309
+ instructions: `使用实验性工件驱动方式启动新变更。
310
+
311
+ **Input**: 用户请求应包含变更名称(kebab-case)或要构建的内容描述。
312
+
313
+ **Steps**
314
+
315
+ 1. **若输入不清晰,询问想要构建的内容**
316
+
317
+ 使用 **AskUserQuestion tool**(开放式、无预设选项)提问:
318
+ > "你想处理什么变更?描述你要构建或修复的内容。"
319
+
320
+ 根据描述生成 kebab-case 名称(例如 "add user authentication" → \`add-user-auth\`)。
321
+
322
+ **IMPORTANT**: 未理解用户想要构建的内容前不要继续。
323
+
324
+ 2. **确定工作流 schema**
325
+
326
+ 除非用户明确要求其他工作流,否则使用默认 schema(省略 \`--schema\`)。
327
+
328
+ **仅在用户提及以下情况时切换 schema:**
329
+ - "tdd" 或 "test-driven" → 使用 \`--schema tdd\`
330
+ - 指定 schema 名称 → 使用 \`--schema <name>\`
331
+ - "show workflows" 或 "what workflows" → 运行 \`openspec schemas --json\` 并让用户选择
332
+
333
+ **否则**:省略 \`--schema\` 以使用默认值。
334
+
335
+ 3. **创建变更目录**
336
+ \`\`\`bash
337
+ openspec new change "<name>"
338
+ \`\`\`
339
+ 仅在用户指定工作流时添加 \`--schema <name>\`。
340
+ 该命令会在 \`openspec/changes/<name>/\` 下创建脚手架并应用所选 schema。
341
+
342
+ 4. **展示工件状态**
343
+ \`\`\`bash
344
+ openspec status --change "<name>"
345
+ \`\`\`
346
+ 该输出会显示哪些工件需要创建,以及哪些已就绪(依赖已满足)。
347
+
348
+ 5. **获取首个工件的指令**
349
+ 首个工件取决于 schema(例如 spec-driven 为 \`proposal\`,tdd 为 \`spec\`)。
350
+ 查看状态输出,找到第一个状态为 "ready" 的工件。
351
+ \`\`\`bash
352
+ openspec instructions <first-artifact-id> --change "<name>"
353
+ \`\`\`
354
+ 该命令会输出首个工件的模板与上下文。
355
+
356
+ 6. **停止并等待用户指示**
357
+
358
+ **输出**
359
+
360
+ 完成步骤后总结:
361
+ - 变更名称与位置
362
+ - 使用的 schema/工作流及其工件顺序
363
+ - 当前状态(0/N 工件完成)
364
+ - 首个工件的模板
365
+ - 提示语:"Ready to create the first artifact? Just describe what this change is about and I'll draft it, or ask me to continue."
366
+
367
+ **约束**
368
+ - 不要创建任何工件——只展示指令
369
+ - 不要继续到首个工件模板之外
370
+ - 名称不合法(非 kebab-case)时要求提供合法名称
371
+ - 若该名称已存在变更,建议继续该变更
372
+ - 使用非默认工作流时传入 --schema`,
373
+ license: 'MIT',
374
+ compatibility: 'Requires openspec CLI.',
375
+ metadata: { author: 'openspec', version: '1.0' },
376
+ };
377
+ }
378
+ /**
379
+ * Template for openspec-continue-change skill
380
+ * Based on /opsx:continue command
381
+ */
382
+ export function getContinueChangeSkillTemplate() {
383
+ return {
384
+ name: 'openspec-continue-change',
385
+ description: '通过创建下一个工件继续 OpenSpec 变更。适用于用户希望推进变更、创建下一个工件或继续工作流时。',
386
+ instructions: `通过创建下一个工件继续变更。
387
+
388
+ **Input**: 可选指定变更名称。若省略,先从对话上下文推断;如含糊或有歧义,必须提示选择可用变更。
389
+
390
+ **Steps**
391
+
392
+ 1. **未提供变更名称时,提示选择**
393
+
394
+ 运行 \`openspec list --json\` 获取按最近修改排序的变更列表。然后使用 **AskUserQuestion tool** 让用户选择要继续的变更。
395
+
396
+ 以最近修改的 3-4 个变更作为选项,展示:
397
+ - 变更名称
398
+ - Schema(若有 \`schema\` 字段则使用,否则为 "spec-driven")
399
+ - 状态(例如 "0/5 tasks"、"complete"、"no tasks")
400
+ - 最近修改时间(来自 \`lastModified\` 字段)
401
+
402
+ 将最近修改的变更标记为 "(Recommended)",因为它最可能是用户要继续的。
403
+
404
+ **IMPORTANT**: 不要猜测或自动选择变更,必须由用户选择。
405
+
406
+ 2. **检查当前状态**
407
+ \`\`\`bash
408
+ openspec status --change "<name>" --json
409
+ \`\`\`
410
+ 解析 JSON 了解当前状态。响应包含:
411
+ - \`schemaName\`: 正在使用的工作流 schema(例如 "spec-driven"、"tdd")
412
+ - \`artifacts\`: 工件数组及其状态("done"、"ready"、"blocked")
413
+ - \`isComplete\`: 是否所有工件已完成的布尔值
414
+
415
+ 3. **根据状态采取行动**:
416
+
417
+ ---
418
+
419
+ **若所有工件完成(\`isComplete: true\`)**:
420
+ - 祝贺用户
421
+ - 展示最终状态(包含所用 schema)
422
+ - 建议:"All artifacts created! You can now implement this change or archive it."
423
+ - 停止
424
+
425
+ ---
426
+
427
+ **若有可创建的工件**(状态中存在 \`status: "ready"\`):
428
+ - 选择状态输出中第一个 \`status: "ready"\` 的工件
429
+ - 获取其指令:
430
+ \`\`\`bash
431
+ openspec instructions <artifact-id> --change "<name>" --json
432
+ \`\`\`
433
+ - 解析 JSON,关键字段包括:
434
+ - \`context\`: 项目背景(对你是约束,不要写入输出)
435
+ - \`rules\`: 工件规则(对你是约束,不要写入输出)
436
+ - \`template\`: 输出文件结构
437
+ - \`instruction\`: schema 指导说明
438
+ - \`outputPath\`: 输出路径
439
+ - \`dependencies\`: 需读取的已完成工件
440
+ - **创建工件文件**:
441
+ - 读取已完成依赖工件作为上下文
442
+ - 使用 \`template\` 作为结构并填写内容
443
+ - 写入时将 \`context\` 与 \`rules\` 作为约束,但不要复制进文件
444
+ - 写入指令给定的输出路径
445
+ - 展示已创建内容与新解锁内容
446
+ - 创建一个工件后停止
447
+
448
+ ---
449
+
450
+ **若没有可用工件(全部 blocked)**:
451
+ - 这在有效 schema 下不应发生
452
+ - 展示状态并建议检查问题
453
+
454
+ 4. **创建工件后展示进度**
455
+ \`\`\`bash
456
+ openspec status --change "<name>"
457
+ \`\`\`
458
+
459
+ **输出**
460
+
461
+ 每次执行后展示:
462
+ - 已创建的工件
463
+ - 当前使用的 schema 工作流
464
+ - 进度(N/M 完成)
465
+ - 新解锁的工件
466
+ - 提示语:"要继续吗?直接让我继续或告诉我下一步要做什么。"
467
+
468
+ **工件创建指南**
469
+
470
+ 工件类型及其用途取决于 schema。通过指令输出中的 \`instruction\` 字段了解应创建的内容。
471
+
472
+ 常见工件模式:
473
+
474
+ **spec-driven schema**(proposal → specs → design → tasks):
475
+ - **proposal.md**:若变更不清晰先询问用户,填写 Why、What Changes、Capabilities、Impact。
476
+ - Capabilities 部分至关重要——每个能力都需要一个 spec 文件。
477
+ - **specs/*.md**:为提案中每个能力创建一个规范。
478
+ - **design.md**:记录技术决策、架构与实现方案。
479
+ - **tasks.md**:将实现拆解为可勾选任务。
480
+
481
+ **tdd schema**(spec → tests → implementation → docs):
482
+ - **spec.md**:功能规范,定义要构建内容。
483
+ - **tests/*.test.ts**:在实现前编写测试(TDD 红阶段)。
484
+ - **src/*.ts**:实现以通过测试(TDD 绿阶段)。
485
+ - **docs/*.md**:为已实现功能编写文档。
486
+
487
+ 其他 schema 按 CLI 输出中的 \`instruction\` 执行。
488
+
489
+ **约束**
490
+ - 每次只创建一个工件
491
+ - 创建前必须读取依赖工件
492
+ - 不要跳过工件或乱序创建
493
+ - 上下文不清楚时先询问用户
494
+ - 写入后确认文件存在再标记进度
495
+ - 按 schema 的工件顺序执行,不要猜测工件名称
496
+ - **IMPORTANT**: \`context\` 与 \`rules\` 仅作为你的约束,不是文件内容
497
+ - 不要把 \`<context>\`、\`<rules>\`、\`<project_context>\` 复制进工件
498
+ - 它们只用于指导书写,不能出现在输出中`,
499
+ license: 'MIT',
500
+ compatibility: 'Requires openspec CLI.',
501
+ metadata: { author: 'openspec', version: '1.0' },
502
+ };
503
+ }
504
+ /**
505
+ * Template for openspec-apply-change skill
506
+ * For implementing tasks from a completed (or in-progress) change
507
+ */
508
+ export function getApplyChangeSkillTemplate() {
509
+ return {
510
+ name: 'openspec-apply-change',
511
+ description: '根据 OpenSpec 变更实现任务。适用于用户开始实现、继续实现或逐条完成任务时。',
512
+ instructions: `根据 OpenSpec 变更实现任务。
513
+
514
+ **Input**: 可选指定变更名称。若省略,先从对话上下文推断;如含糊或有歧义,必须提示选择可用变更。
515
+
516
+ **Steps**
517
+
518
+ 1. **选择变更**
519
+
520
+ 若提供名称则使用。否则:
521
+ - 从对话上下文推断是否提到某个变更
522
+ - 若仅存在一个活跃变更则自动选择
523
+ - 若有歧义,运行 \`openspec list --json\` 获取变更列表并用 **AskUserQuestion tool** 让用户选择
524
+
525
+ 始终声明:"使用变更:<name>" 并说明如何切换(例如 \`/opsx:apply <other>\`)。
526
+
527
+ 2. **检查状态以了解 schema**
528
+ \`\`\`bash
529
+ openspec status --change "<name>" --json
530
+ \`\`\`
531
+ 解析 JSON 以了解:
532
+ - \`schemaName\`: 使用的工作流(例如 "spec-driven"、"tdd")
533
+ - 任务所在的工件(spec-driven 通常为 "tasks",其他以状态为准)
534
+
535
+ 3. **获取 apply 指令**
536
+
537
+ \`\`\`bash
538
+ openspec instructions apply --change "<name>" --json
539
+ \`\`\`
540
+
541
+ 返回内容:
542
+ - 上下文文件路径(随 schema 不同:proposal/specs/design/tasks 或 spec/tests/implementation/docs)
543
+ - 进度(总数、完成、剩余)
544
+ - 带状态的任务列表
545
+ - 基于当前状态的动态指令
546
+
547
+ **处理状态:**
548
+ - 若 \`state: "blocked"\`(缺少工件):提示并建议使用 openspec-continue-change
549
+ - 若 \`state: "all_done"\`:祝贺并建议归档
550
+ - 否则:进入实现
551
+
552
+ 4. **读取上下文文件**
553
+
554
+ 读取 apply 指令输出中的 \`contextFiles\` 列表。
555
+ 文件取决于所用 schema:
556
+ - **spec-driven**:proposal、specs、design、tasks
557
+ - **tdd**:spec、tests、implementation、docs
558
+ - 其他 schema:以 CLI 输出的 contextFiles 为准
559
+
560
+ 5. **展示当前进度**
561
+
562
+ 展示:
563
+ - 当前 schema
564
+ - 进度:"N/M 任务完成"
565
+ - 剩余任务概览
566
+ - CLI 动态指令
567
+
568
+ 6. **实现任务(循环直到完成或阻塞)**
569
+
570
+ 对每个待办任务:
571
+ - 显示正在处理的任务
572
+ - 进行必要的代码修改
573
+ - 保持修改最小且聚焦
574
+ - 在 tasks 文件中标记完成:\`- [ ]\` → \`- [x]\`
575
+ - 继续下一个任务
576
+
577
+ **遇到以下情况暂停:**
578
+ - 任务不清楚 → 询问澄清
579
+ - 实现暴露设计问题 → 建议更新工件
580
+ - 遇到错误或阻塞 → 汇报并等待指示
581
+ - 用户中断
582
+
583
+ 7. **完成或暂停时展示状态**
584
+
585
+ 展示:
586
+ - 本次完成的任务
587
+ - 总进度:"N/M 任务完成"
588
+ - 若全部完成:建议归档
589
+ - 若暂停:说明原因并等待指示
590
+
591
+ **实现过程中的输出**
592
+
593
+ \`\`\`
594
+ ## Implementing: <change-name> (schema: <schema-name>)
595
+
596
+ Working on task 3/7: <task description>
597
+ [...implementation happening...]
598
+ ✓ Task complete
599
+
600
+ Working on task 4/7: <task description>
601
+ [...implementation happening...]
602
+ ✓ Task complete
603
+ \`\`\`
604
+
605
+ **完成时输出**
606
+
607
+ \`\`\`
608
+ ## Implementation Complete
609
+
610
+ **Change:** <change-name>
611
+ **Schema:** <schema-name>
612
+ **Progress:** 7/7 tasks complete ✓
613
+
614
+ ### Completed This Session
615
+ - [x] Task 1
616
+ - [x] Task 2
617
+ ...
618
+
619
+ All tasks complete! Ready to archive this change.
620
+ \`\`\`
621
+
622
+ **暂停时输出(遇到问题)**
623
+
624
+ \`\`\`
625
+ ## Implementation Paused
626
+
627
+ **Change:** <change-name>
628
+ **Schema:** <schema-name>
629
+ **Progress:** 4/7 tasks complete
630
+
631
+ ### Issue Encountered
632
+ <description of the issue>
633
+
634
+ **Options:**
635
+ 1. <option 1>
636
+ 2. <option 2>
637
+ 3. Other approach
638
+
639
+ What would you like to do?
640
+ \`\`\`
641
+
642
+ **约束**
643
+ - 持续处理任务直到完成或阻塞
644
+ - 开始前必须读取上下文文件(来自 apply 指令输出)
645
+ - 任务含糊则先暂停并询问
646
+ - 实现暴露问题则暂停并建议更新工件
647
+ - 修改尽量小且限定在任务范围
648
+ - 完成任务后立即勾选
649
+ - 遇到错误、阻塞或不清晰需求则暂停,不要猜测
650
+ - 使用 CLI 输出的 contextFiles,不要假设文件名
651
+
652
+ **流式工作流集成**
653
+
654
+ 该技能支持“对变更的行动”模式:
655
+
656
+ - **可随时调用**:在所有工件完成前(若任务存在)、部分实现后、或与其他操作交错
657
+ - **允许更新工件**:若实现暴露设计问题,可建议更新工件——不按阶段锁死,保持流动`,
658
+ license: 'MIT',
659
+ compatibility: 'Requires openspec CLI.',
660
+ metadata: { author: 'openspec', version: '1.0' },
661
+ };
662
+ }
663
+ /**
664
+ * Template for openspec-ff-change skill
665
+ * Fast-forward through artifact creation
666
+ */
667
+ export function getFfChangeSkillTemplate() {
668
+ return {
669
+ name: 'openspec-ff-change',
670
+ description: '快进完成 OpenSpec 工件创建。适用于用户希望快速生成所有实现所需工件,而不逐个创建时。',
671
+ instructions: `快进完成工件创建,一次性生成开始实现所需的一切。
672
+
673
+ **Input**: 用户请求应包含变更名称(kebab-case)或要构建的内容描述。
674
+
675
+ **Steps**
676
+
677
+ 1. **若输入不清晰,询问要构建的内容**
678
+
679
+ 使用 **AskUserQuestion tool**(开放式、无预设选项)提问:
680
+ > "你想处理什么变更?描述你要构建或修复的内容。"
681
+
682
+ 根据描述生成 kebab-case 名称(例如 "add user authentication" → \`add-user-auth\`)。
683
+
684
+ **IMPORTANT**: 未理解用户想要构建的内容前不要继续。
685
+
686
+ 2. **创建变更目录**
687
+ \`\`\`bash
688
+ openspec new change "<name>"
689
+ \`\`\`
690
+ 该命令会在 \`openspec/changes/<name>/\` 下创建脚手架。
691
+
692
+ 3. **获取工件构建顺序**
693
+ \`\`\`bash
694
+ openspec status --change "<name>" --json
695
+ \`\`\`
696
+ 解析 JSON 获取:
697
+ - \`applyRequires\`: 实现前需要完成的工件 ID 列表(例如 \`["tasks"]\`)
698
+ - \`artifacts\`: 所有工件及其状态与依赖
699
+
700
+ 4. **按顺序创建工件直到可 apply**
701
+
702
+ 使用 **TodoWrite tool** 跟踪工件创建进度。
703
+
704
+ 按依赖顺序遍历工件(先处理无待完成依赖的工件):
705
+
706
+ a. **对于状态为 \`ready\` 的工件(依赖已满足)**:
707
+ - Get instructions:
708
+ \`\`\`bash
709
+ openspec instructions <artifact-id> --change "<name>" --json
710
+ \`\`\`
711
+ - 指令 JSON 包含:
712
+ - \`context\`: 项目背景(对你是约束,不要写入输出)
713
+ - \`rules\`: 工件规则(对你是约束,不要写入输出)
714
+ - \`template\`: 输出文件结构
715
+ - \`instruction\`: 该工件的 schema 指导
716
+ - \`outputPath\`: 输出路径
717
+ - \`dependencies\`: 需读取的已完成工件
718
+ - 读取已完成依赖工件作为上下文
719
+ - 使用 \`template\` 作为结构创建工件文件
720
+ - 将 \`context\` 与 \`rules\` 作为约束,但不要复制进文件
721
+ - 简要展示进度:"✓ Created <artifact-id>"
722
+
723
+ b. **继续直到所有 \`applyRequires\` 工件完成**
724
+ - 每创建一个工件后重跑 \`openspec status --change "<name>" --json\`
725
+ - 检查 \`applyRequires\` 中的每个工件 ID 是否在 artifacts 中为 \`status: "done"\`
726
+ - 当所有 \`applyRequires\` 工件完成时停止
727
+
728
+ c. **若某工件需要用户输入**(上下文不清楚):
729
+ - 使用 **AskUserQuestion tool** 进行澄清
730
+ - 然后继续创建
731
+
732
+ 5. **展示最终状态**
733
+ \`\`\`bash
734
+ openspec status --change "<name>"
735
+ \`\`\`
736
+
737
+ **输出**
738
+
739
+ 完成所有工件后总结:
740
+ - 变更名称与位置
741
+ - 已创建工件列表与简述
742
+ - 就绪提示:"所有工件已创建!可开始实现。"
743
+ - 提示语:"运行 \`/opsx:apply\` 或让我开始实现任务。"
744
+
745
+ **工件创建指南**
746
+
747
+ - 按 \`openspec instructions\` 的 \`instruction\` 字段执行每个工件类型
748
+ - schema 定义了每个工件应包含的内容,严格遵循
749
+ - 创建新工件前先读取依赖工件作为上下文
750
+ - 使用 \`template\` 作为输出结构并填写内容
751
+ - **IMPORTANT**: \`context\` 与 \`rules\` 仅作为你的约束,不是文件内容
752
+ - 不要把 \`<context>\`、\`<rules>\`、\`<project_context>\` 复制进工件
753
+ - 它们只用于指导书写,不能出现在输出中
754
+
755
+ **约束**
756
+ - 创建实现所需的所有工件(由 schema 的 \`apply.requires\` 定义)
757
+ - 创建新工件前必须读取依赖工件
758
+ - 若上下文严重不清楚,先询问用户,但尽量做合理判断以保持推进
759
+ - 若该名称已有变更,建议继续该变更
760
+ - 写入后确认工件文件存在,再继续下一个`,
761
+ license: 'MIT',
762
+ compatibility: 'Requires openspec CLI.',
763
+ metadata: { author: 'openspec', version: '1.0' },
764
+ };
765
+ }
766
+ /**
767
+ * Template for openspec-sync-specs skill
768
+ * For syncing delta specs from a change to main specs (agent-driven)
769
+ */
770
+ export function getSyncSpecsSkillTemplate() {
771
+ return {
772
+ name: 'openspec-sync-specs',
773
+ description: '将变更中的增量规范同步到主规范。适用于用户希望应用增量规范变化但不归档该变更时。',
774
+ instructions: `将增量规范从变更同步到主规范。
775
+
776
+ 这是一个 **agent-driven** 操作——你将读取增量规范并直接编辑主规范以应用变更。这允许智能合并(例如只新增场景而不复制整个需求)。
777
+
778
+ **Input**: 可选指定变更名称。若省略,先从对话上下文推断;如含糊或有歧义,必须提示选择可用变更。
779
+
780
+ **Steps**
781
+
782
+ 1. **未提供变更名称时,提示选择**
783
+
784
+ 运行 \`openspec list --json\` 获取可用变更,并使用 **AskUserQuestion tool** 让用户选择。
785
+
786
+ 仅展示包含增量规范的变更(位于 \`specs/\` 目录)。
787
+
788
+ **IMPORTANT**: 不要猜测或自动选择变更,必须由用户选择。
789
+
790
+ 2. **查找增量规范**
791
+
792
+ 查找 \`openspec/changes/<name>/specs/*/spec.md\` 下的增量规范文件。
793
+
794
+ 每个增量规范文件包含以下章节:
795
+ - \`## ADDED Requirements\` - New requirements to add
796
+ - \`## MODIFIED Requirements\` - Changes to existing requirements
797
+ - \`## REMOVED Requirements\` - Requirements to remove
798
+ - \`## RENAMED Requirements\` - Requirements to rename (FROM:/TO: format)
799
+
800
+ 若未找到增量规范,告知用户并停止。
801
+
802
+ 3. **针对每个增量规范应用到主规范**
803
+
804
+ 对于位于 \`openspec/changes/<name>/specs/<capability>/spec.md\` 的每个能力:
805
+
806
+ a. **读取增量规范** 以理解变更意图
807
+
808
+ b. **读取主规范** \`openspec/specs/<capability>/spec.md\`(可能尚不存在)
809
+
810
+ c. **智能应用变更**:
811
+
812
+ **ADDED Requirements:**
813
+ - 主规范中不存在该需求 → 新增
814
+ - 已存在该需求 → 更新以匹配(视为隐式 MODIFIED)
815
+
816
+ **MODIFIED Requirements:**
817
+ - 在主规范中定位需求
818
+ - 应用变更,可包括:
819
+ - 添加新场景(无需复制已有场景)
820
+ - 修改已有场景
821
+ - 修改需求描述
822
+ - 保留增量未涉及的场景/内容
823
+
824
+ **REMOVED Requirements:**
825
+ - 从主规范中删除整个需求块
826
+
827
+ **RENAMED Requirements:**
828
+ - 找到 FROM 需求并重命名为 TO
829
+
830
+ d. **若能力尚不存在主规范则创建**:
831
+ - 创建 \`openspec/specs/<capability>/spec.md\`
832
+ - 添加 Purpose 部分(可简略,标注 TBD)
833
+ - 添加 Requirements 部分并填入 ADDED 需求
834
+
835
+ 4. **展示摘要**
836
+
837
+ 应用完所有变更后总结:
838
+ - 更新了哪些能力
839
+ - 做了哪些变更(新增/修改/删除/重命名需求)
840
+
841
+ **增量规范格式参考**
842
+
843
+ \`\`\`markdown
844
+ ## ADDED Requirements
845
+
846
+ ### Requirement: New Feature
847
+ The system SHALL do something new.
848
+
849
+ #### Scenario: Basic case
850
+ - **WHEN** user does X
851
+ - **THEN** system does Y
852
+
853
+ ## MODIFIED Requirements
854
+
855
+ ### Requirement: Existing Feature
856
+ #### Scenario: New scenario to add
857
+ - **WHEN** user does A
858
+ - **THEN** system does B
859
+
860
+ ## REMOVED Requirements
861
+
862
+ ### Requirement: Deprecated Feature
863
+
864
+ ## RENAMED Requirements
865
+
866
+ - FROM: \`### Requirement: Old Name\`
867
+ - TO: \`### Requirement: New Name\`
868
+ \`\`\`
869
+
870
+ **关键原则:智能合并**
871
+
872
+ 不同于程序化合并,你可以进行 **局部更新**:
873
+ - 只需在 MODIFIED 下加入新增场景,无需复制既有场景
874
+ - 增量表达的是*意图*,不是整体替换
875
+ - 依据判断做合理合并
876
+
877
+ **成功时输出**
878
+
879
+ \`\`\`
880
+ ## Specs Synced: <change-name>
881
+
882
+ Updated main specs:
883
+
884
+ **<capability-1>**:
885
+ - Added requirement: "New Feature"
886
+ - Modified requirement: "Existing Feature" (added 1 scenario)
887
+
888
+ **<capability-2>**:
889
+ - Created new spec file
890
+ - Added requirement: "Another Feature"
891
+
892
+ 主规范已更新。变更仍保持活跃——实现完成后再归档。
893
+ \`\`\`
894
+
895
+ **约束**
896
+ - 修改前先读增量规范与主规范
897
+ - 保留增量未提及的现有内容
898
+ - 不清楚时先询问澄清
899
+ - 边改边展示变更内容
900
+ - 该操作应具备幂等性——重复执行结果相同`,
901
+ license: 'MIT',
902
+ compatibility: 'Requires openspec CLI.',
903
+ metadata: { author: 'openspec', version: '1.0' },
904
+ };
905
+ }
906
+ /**
907
+ * Template for /opsx:explore slash command
908
+ * Explore mode - adaptive thinking partner
909
+ */
910
+ export function getOpsxExploreCommandTemplate() {
911
+ return {
912
+ name: 'OPSX: Explore',
913
+ description: '进入探索模式——思考想法、调查问题、澄清需求',
914
+ category: 'Workflow',
915
+ tags: ['workflow', 'explore', 'experimental', 'thinking'],
916
+ content: `进入探索模式。深度思考,自由可视化。跟随对话自然展开。
917
+
918
+ **IMPORTANT: 探索模式用于思考,而非实现。** 你可以读取文件、搜索代码、调查代码库,但绝不能编写代码或实现功能。如果用户要求实现,提醒他们先退出探索模式(例如使用 \`/opsx:new\` 或 \`/opsx:ff\` 启动变更)。如用户要求,你可以创建 OpenSpec 工件(proposal/design/specs),这属于记录思考,而非实现。
919
+
920
+ **这是一种立场,而非流程。** 没有固定步骤、没有必选顺序、没有强制输出。你是帮助用户探索的思考伙伴。
921
+
922
+ **输入**:\`/opsx:explore\` 后的参数是用户想要思考的内容。可能是:
923
+ - 一个模糊想法:"real-time collaboration"
924
+ - 一个具体问题:"the auth system is getting unwieldy"
925
+ - 变更名称:"add-dark-mode"(在该变更上下文中探索)
926
+ - 一个比较:"postgres vs sqlite for this"
927
+ - 无参数(直接进入探索模式)
928
+
929
+ ---
930
+
931
+ ## 立场
932
+
933
+ - **保持好奇而非规定路径** - 提出自然涌现的问题,不照本宣科
934
+ - **开放线程而非盘问** - 提供多个有趣方向,让用户选择共鸣点,不把他们引导到单一路径
935
+ - **可视化** - 需要澄清思路时尽量使用 ASCII 图
936
+ - **自适应** - 跟随有价值的线索,出现新信息时及时转向
937
+ - **耐心** - 不急于结论,让问题的轮廓自然显现
938
+ - **落地** - 需要时探索真实代码库,而非纯理论
939
+
940
+ ---
941
+
942
+ ## 你可能会做的事
943
+
944
+ 根据用户提供的信息,你可能会:
945
+
946
+ **探索问题空间**
947
+ - 提出基于对话自然产生的澄清问题
948
+ - 质疑假设
949
+ - 重新表述问题
950
+ - 寻找类比
951
+
952
+ **调查代码库**
953
+ - 梳理与讨论相关的现有架构
954
+ - 找到集成点
955
+ - 识别已有模式
956
+ - 暴露隐藏复杂度
957
+
958
+ **比较选项**
959
+ - 头脑风暴多种方案
960
+ - 构建对比表
961
+ - 勾勒权衡
962
+ - 如被请求则给出建议路径
963
+
964
+ **可视化**
965
+ \`\`\`
966
+ ┌─────────────────────────────────────────┐
967
+ │ Use ASCII diagrams liberally │
968
+ ├─────────────────────────────────────────┤
969
+ │ │
970
+ │ ┌────────┐ ┌────────┐ │
971
+ │ │ State │────────▶│ State │ │
972
+ │ │ A │ │ B │ │
973
+ │ └────────┘ └────────┘ │
974
+ │ │
975
+ │ System diagrams, state machines, │
976
+ │ data flows, architecture sketches, │
977
+ │ dependency graphs, comparison tables │
978
+ │ │
979
+ └─────────────────────────────────────────┘
980
+ \`\`\`
981
+
982
+ **暴露风险与未知**
983
+ - 识别可能出错的地方
984
+ - 找出认知空白
985
+ - 建议进行探索性调研或验证
986
+
987
+ ---
988
+
989
+ ## OpenSpec 认知
990
+
991
+ 你拥有 OpenSpec 系统的完整上下文。自然使用,不要生硬强推。
992
+
993
+ ### 检查上下文
994
+
995
+ 开始时,快速查看已有内容:
996
+ \`\`\`bash
997
+ openspec list --json
998
+ \`\`\`
999
+
1000
+ 这会告诉你:
1001
+ - 是否存在活跃变更
1002
+ - 变更名称、工作流与状态
1003
+ - 用户可能正在做什么
1004
+
1005
+ 如果用户提到某个变更名称,读取其工件作为上下文。
1006
+
1007
+ ### 当没有变更时
1008
+
1009
+ 自由思考。当洞见逐渐清晰时,你可以:
1010
+
1011
+ - "现在信息已经足够开始变更了,要我创建一个吗?"
1012
+ → 可转为 \`/opsx:new\` 或 \`/opsx:ff\`
1013
+ - 或继续探索——无需急于形式化
1014
+
1015
+ ### 当已存在变更时
1016
+
1017
+ 如果用户提到某个变更,或你判断其相关:
1018
+
1019
+ 1. **读取现有工件作为上下文**
1020
+ - \`openspec/changes/<name>/proposal.md\`
1021
+ - \`openspec/changes/<name>/design.md\`
1022
+ - \`openspec/changes/<name>/tasks.md\`
1023
+ - 等
1024
+
1025
+ 2. **在对话中自然引用**
1026
+ - "你的设计里提到用 Redis,但我们刚发现 SQLite 更合适..."
1027
+ - "提案里将范围限定在高级用户,但现在我们在想是否所有人..."
1028
+
1029
+ 3. **当决策形成时建议记录**
1030
+
1031
+ | 洞见类型 | 记录位置 |
1032
+ |--------------|------------------|
1033
+ | 新需求发现 | \`specs/<capability>/spec.md\` |
1034
+ | 需求变更 | \`specs/<capability>/spec.md\` |
1035
+ | 设计决策形成 | \`design.md\` |
1036
+ | 范围变化 | \`proposal.md\` |
1037
+ | 发现新工作 | \`tasks.md\` |
1038
+ | 假设被推翻 | 相关工件 |
1039
+
1040
+ 示例话术:
1041
+ - "这是一个设计决策,要记录到 design.md 吗?"
1042
+ - "这是新需求,要加到 specs 吗?"
1043
+ - "这改变了范围,要更新提案吗?"
1044
+
1045
+ 4. **由用户决定** - 给出建议即可,不要施压,也不要自动记录。
1046
+
1047
+ ---
1048
+
1049
+ ## 不必做的事
1050
+
1051
+ - 按脚本走
1052
+ - 每次都问同样的问题
1053
+ - 产出某个固定工件
1054
+ - 得出结论
1055
+ - 有价值的岔路也必须回到主线
1056
+ - 简短表达(这是思考时间)
1057
+
1058
+ ---
1059
+
1060
+ ## 结束探索
1061
+
1062
+ 没有固定结尾。探索可能会:
1063
+
1064
+ - **转入行动**:"准备开始了吗?\`/opsx:new\` 或 \`/opsx:ff\`"
1065
+ - **推动工件更新**:"已将这些决策更新到 design.md"
1066
+ - **仅提供澄清**:用户获得所需信息后继续
1067
+ - **稍后继续**:"我们随时可以继续"
1068
+
1069
+ 当你感觉思路逐渐清晰时,可以做一个简短总结——但不是必须。有时思考本身就是价值。
1070
+
1071
+ ---
1072
+
1073
+ ## 约束
1074
+
1075
+ - **不要实现** - 绝不编写代码或实现功能。创建 OpenSpec 工件可以,写应用代码不行。
1076
+ - **不要装懂** - 不清楚就继续深挖
1077
+ - **不要急** - 这是思考时间,不是任务时间
1078
+ - **不要强行结构化** - 让模式自然浮现
1079
+ - **不要自动记录** - 先提出建议,别直接动手
1080
+ - **要可视化** - 一张好图胜过千言
1081
+ - **要探索代码库** - 以现实为依据
1082
+ - **要质疑假设** - 包括用户和你自己的`
1083
+ };
1084
+ }
1085
+ /**
1086
+ * Template for /opsx:new slash command
1087
+ */
1088
+ export function getOpsxNewCommandTemplate() {
1089
+ return {
1090
+ name: 'OPSX: New',
1091
+ description: '使用实验性工件工作流启动新的变更(OPSX)',
1092
+ category: 'Workflow',
1093
+ tags: ['workflow', 'artifacts', 'experimental'],
1094
+ content: `使用实验性工件驱动方式启动新变更。
1095
+
1096
+ **输入**:\`/opsx:new\` 后的参数是变更名称(kebab-case),或用户想构建内容的描述。
1097
+
1098
+ **步骤**
1099
+
1100
+ 1. **若未提供输入,询问想要构建的内容**
1101
+
1102
+ 使用 **AskUserQuestion tool**(开放式、无预设选项)提问:
1103
+ > "What change do you want to work on? Describe what you want to build or fix."
1104
+
1105
+ 根据描述生成 kebab-case 名称(例如 "add user authentication" → \`add-user-auth\`)。
1106
+
1107
+ **IMPORTANT**: 未理解用户想要构建的内容前不要继续。
1108
+
1109
+ 2. **确定工作流 schema**
1110
+
1111
+ 除非用户明确要求其他工作流,否则使用默认 schema(省略 \`--schema\`)。
1112
+
1113
+ **仅在用户提及以下情况时切换 schema:**
1114
+ - "tdd" 或 "test-driven" → 使用 \`--schema tdd\`
1115
+ - 指定 schema 名称 → 使用 \`--schema <name>\`
1116
+ - "show workflows" 或 "what workflows" → 运行 \`openspec schemas --json\` 并让用户选择
1117
+
1118
+ **否则**:省略 \`--schema\` 以使用默认值。
1119
+
1120
+ 3. **创建变更目录**
1121
+ \`\`\`bash
1122
+ openspec new change "<name>"
1123
+ \`\`\`
1124
+ 仅在用户指定工作流时添加 \`--schema <name>\`。
1125
+ 该命令会在 \`openspec/changes/<name>/\` 下创建脚手架并应用所选 schema。
1126
+
1127
+ 4. **展示工件状态**
1128
+ \`\`\`bash
1129
+ openspec status --change "<name>"
1130
+ \`\`\`
1131
+ 该输出会显示哪些工件需要创建,以及哪些已就绪(依赖已满足)。
1132
+
1133
+ 5. **获取首个工件的指令**
1134
+ 首个工件取决于 schema。查看状态输出,找到第一个状态为 "ready" 的工件。
1135
+ \`\`\`bash
1136
+ openspec instructions <first-artifact-id> --change "<name>"
1137
+ \`\`\`
1138
+ 该命令会输出首个工件的模板与上下文。
1139
+
1140
+ 6. **停止并等待用户指示**
1141
+
1142
+ **输出**
1143
+
1144
+ 完成步骤后总结:
1145
+ - 变更名称与位置
1146
+ - 使用的 schema/工作流及其工件顺序
1147
+ - 当前状态(0/N 工件完成)
1148
+ - 首个工件的模板
1149
+ - 提示语:"准备创建第一个工件了吗?运行 \`/opsx:continue\`,或直接描述这个变更,我来起草。"
1150
+
1151
+ **约束**
1152
+ - 不要创建任何工件——只展示指令
1153
+ - 不要继续到首个工件模板之外
1154
+ - 名称不合法(非 kebab-case)时要求提供合法名称
1155
+ - 若该名称已存在变更,建议改用 \`/opsx:continue\`
1156
+ - 使用非默认工作流时传入 --schema`
1157
+ };
1158
+ }
1159
+ /**
1160
+ * Template for /opsx:continue slash command
1161
+ */
1162
+ export function getOpsxContinueCommandTemplate() {
1163
+ return {
1164
+ name: 'OPSX: Continue',
1165
+ description: '继续推进变更——创建下一个工件(实验性)',
1166
+ category: 'Workflow',
1167
+ tags: ['workflow', 'artifacts', 'experimental'],
1168
+ content: `通过创建下一个工件继续变更。
1169
+
1170
+ **输入**:可选在 \`/opsx:continue\` 后指定变更名称(例如 \`/opsx:continue add-auth\`)。若省略,先从对话上下文推断;如含糊或有歧义,必须提示选择可用变更。
1171
+
1172
+ **步骤**
1173
+
1174
+ 1. **未提供变更名称时,提示选择**
1175
+
1176
+ 运行 \`openspec list --json\` 获取按最近修改排序的变更列表。然后使用 **AskUserQuestion tool** 让用户选择要继续的变更。
1177
+
1178
+ 以最近修改的 3-4 个变更作为选项,展示:
1179
+ - 变更名称
1180
+ - Schema(若有 \`schema\` 字段则使用,否则为 "spec-driven")
1181
+ - 状态(例如 "0/5 tasks"、"complete"、"no tasks")
1182
+ - 最近修改时间(来自 \`lastModified\` 字段)
1183
+
1184
+ 将最近修改的变更标记为 "(Recommended)",因为它最可能是用户要继续的。
1185
+
1186
+ **IMPORTANT**: 不要猜测或自动选择变更,必须由用户选择。
1187
+
1188
+ 2. **检查当前状态**
1189
+ \`\`\`bash
1190
+ openspec status --change "<name>" --json
1191
+ \`\`\`
1192
+ 解析 JSON 了解当前状态。响应包含:
1193
+ - \`schemaName\`: 正在使用的工作流 schema(例如 "spec-driven"、"tdd")
1194
+ - \`artifacts\`: 工件数组及其状态("done"、"ready"、"blocked")
1195
+ - \`isComplete\`: 是否所有工件已完成的布尔值
1196
+
1197
+ 3. **根据状态采取行动**:
1198
+
1199
+ ---
1200
+
1201
+ **若所有工件完成(\`isComplete: true\`)**:
1202
+ - 祝贺用户
1203
+ - 展示最终状态(包含所用 schema)
1204
+ - 建议:"所有工件已创建!现在可以实现该变更或将其归档。"
1205
+ - 停止
1206
+
1207
+ ---
1208
+
1209
+ **若有可创建的工件**(状态中存在 \`status: "ready"\`):
1210
+ - 选择状态输出中第一个 \`status: "ready"\` 的工件
1211
+ - 获取其指令:
1212
+ \`\`\`bash
1213
+ openspec instructions <artifact-id> --change "<name>" --json
1214
+ \`\`\`
1215
+ - 解析 JSON。关键字段包括:
1216
+ - \`context\`: 项目背景(对你是约束,不要写入输出)
1217
+ - \`rules\`: 工件规则(对你是约束,不要写入输出)
1218
+ - \`template\`: 输出文件结构
1219
+ - \`instruction\`: schema 指导说明
1220
+ - \`outputPath\`: 输出路径
1221
+ - \`dependencies\`: 需读取的已完成工件
1222
+ - **创建工件文件**:
1223
+ - 读取已完成依赖工件作为上下文
1224
+ - 使用 \`template\` 作为结构并填写内容
1225
+ - 写入时将 \`context\` 与 \`rules\` 作为约束,但不要复制进文件
1226
+ - 写入指令给定的输出路径
1227
+ - 展示已创建内容与新解锁内容
1228
+ - 创建一个工件后停止
1229
+
1230
+ ---
1231
+
1232
+ **若没有可用工件(全部 blocked)**:
1233
+ - 这在有效 schema 下不应发生
1234
+ - 展示状态并建议检查问题
1235
+
1236
+ 4. **创建工件后展示进度**
1237
+ \`\`\`bash
1238
+ openspec status --change "<name>"
1239
+ \`\`\`
1240
+
1241
+ **输出**
1242
+
1243
+ 每次执行后展示:
1244
+ - 已创建的工件
1245
+ - 当前使用的 schema 工作流
1246
+ - 进度(N/M 完成)
1247
+ - 新解锁的工件
1248
+ - 提示语:"运行 \`/opsx:continue\` 以创建下一个工件"
1249
+
1250
+ **工件创建指南**
1251
+
1252
+ 工件类型及其用途取决于 schema。通过指令输出中的 \`instruction\` 字段了解应创建的内容。
1253
+
1254
+ 常见工件模式:
1255
+
1256
+ **spec-driven schema**(proposal → specs → design → tasks):
1257
+ - **proposal.md**:若变更不清晰先询问用户,填写 Why、What Changes、Capabilities、Impact。
1258
+ - Capabilities 部分至关重要——每个能力都需要一个 spec 文件。
1259
+ - **specs/*.md**:为提案中每个能力创建一个规范。
1260
+ - **design.md**:记录技术决策、架构与实现方案。
1261
+ - **tasks.md**:将实现拆解为可勾选任务。
1262
+
1263
+ **tdd schema**(spec → tests → implementation → docs):
1264
+ - **spec.md**:功能规范,定义要构建内容。
1265
+ - **tests/*.test.ts**:在实现前编写测试(TDD 红阶段)。
1266
+ - **src/*.ts**:实现以通过测试(TDD 绿阶段)。
1267
+ - **docs/*.md**:为已实现功能编写文档。
1268
+
1269
+ 其他 schema 按 CLI 输出中的 \`instruction\` 执行。
1270
+
1271
+ **约束**
1272
+ - 每次只创建一个工件
1273
+ - 创建前必须读取依赖工件
1274
+ - 不要跳过工件或乱序创建
1275
+ - 上下文不清楚时先询问用户
1276
+ - 写入后确认文件存在再标记进度
1277
+ - 按 schema 的工件顺序执行,不要猜测工件名称
1278
+ - **IMPORTANT**: \`context\` 与 \`rules\` 仅作为你的约束,不是文件内容
1279
+ - 不要把 \`<context>\`、\`<rules>\`、\`<project_context>\` 复制进工件
1280
+ - 它们只用于指导书写,不能出现在输出中`
1281
+ };
1282
+ }
1283
+ /**
1284
+ * Template for /opsx:apply slash command
1285
+ */
1286
+ export function getOpsxApplyCommandTemplate() {
1287
+ return {
1288
+ name: 'OPSX: Apply',
1289
+ description: '根据 OpenSpec 变更实现任务(实验性)',
1290
+ category: 'Workflow',
1291
+ tags: ['workflow', 'artifacts', 'experimental'],
1292
+ content: `根据 OpenSpec 变更实现任务。
1293
+
1294
+ **输入**:可选指定变更名称(例如 \`/opsx:apply add-auth\`)。若省略,先从对话上下文推断;如含糊或有歧义,必须提示选择可用变更。
1295
+
1296
+ **步骤**
1297
+
1298
+ 1. **选择变更**
1299
+
1300
+ 若提供名称则使用。否则:
1301
+ - 从对话上下文推断是否提到某个变更
1302
+ - 若仅存在一个活跃变更则自动选择
1303
+ - 若有歧义,运行 \`openspec list --json\` 获取变更列表并用 **AskUserQuestion tool** 让用户选择
1304
+
1305
+ 始终声明:"Using change: <name>" 并说明如何切换(例如 \`/opsx:apply <other>\`)。
1306
+
1307
+ 2. **检查状态以了解 schema**
1308
+ \`\`\`bash
1309
+ openspec status --change "<name>" --json
1310
+ \`\`\`
1311
+ 解析 JSON 以了解:
1312
+ - \`schemaName\`: 使用的工作流(例如 "spec-driven"、"tdd")
1313
+ - 任务所在的工件(spec-driven 通常为 "tasks",其他以状态为准)
1314
+
1315
+ 3. **获取 apply 指令**
1316
+
1317
+ \`\`\`bash
1318
+ openspec instructions apply --change "<name>" --json
1319
+ \`\`\`
1320
+
1321
+ 返回内容:
1322
+ - 上下文文件路径(随 schema 不同)
1323
+ - 进度(总数、完成、剩余)
1324
+ - 带状态的任务列表
1325
+ - 基于当前状态的动态指令
1326
+
1327
+ **处理状态:**
1328
+ - 若 \`state: "blocked"\`(缺少工件):提示并建议使用 \`/opsx:continue\`
1329
+ - 若 \`state: "all_done"\`:祝贺并建议归档
1330
+ - 否则:进入实现
1331
+
1332
+ 4. **读取上下文文件**
1333
+
1334
+ 读取 apply 指令输出中的 \`contextFiles\` 列表。
1335
+ 文件取决于所用 schema:
1336
+ - **spec-driven**:proposal、specs、design、tasks
1337
+ - **tdd**:spec、tests、implementation、docs
1338
+ - 其他 schema:以 CLI 输出的 contextFiles 为准
1339
+
1340
+ 5. **展示当前进度**
1341
+
1342
+ 展示:
1343
+ - 当前 schema
1344
+ - 进度:"N/M tasks complete"
1345
+ - 剩余任务概览
1346
+ - CLI 动态指令
1347
+
1348
+ 6. **实现任务(循环直到完成或阻塞)**
1349
+
1350
+ 对每个待办任务:
1351
+ - 显示正在处理的任务
1352
+ - 进行必要的代码修改
1353
+ - 保持修改最小且聚焦
1354
+ - 在 tasks 文件中标记完成:\`- [ ]\` → \`- [x]\`
1355
+ - 继续下一个任务
1356
+
1357
+ **遇到以下情况暂停:**
1358
+ - 任务不清楚 → 询问澄清
1359
+ - 实现暴露设计问题 → 建议更新工件
1360
+ - 遇到错误或阻塞 → 汇报并等待指示
1361
+ - 用户中断
1362
+
1363
+ 7. **完成或暂停时展示状态**
1364
+
1365
+ 展示:
1366
+ - 本次完成的任务
1367
+ - 总进度:"N/M tasks complete"
1368
+ - 若全部完成:建议归档
1369
+ - 若暂停:说明原因并等待指示
1370
+
1371
+ **实现过程中的输出**
1372
+
1373
+ \`\`\`
1374
+ ## Implementing: <change-name> (schema: <schema-name>)
1375
+
1376
+ Working on task 3/7: <task description>
1377
+ [...implementation happening...]
1378
+ ✓ Task complete
1379
+
1380
+ Working on task 4/7: <task description>
1381
+ [...implementation happening...]
1382
+ ✓ Task complete
1383
+ \`\`\`
1384
+
1385
+ **完成时输出**
1386
+
1387
+ \`\`\`
1388
+ ## Implementation Complete
1389
+
1390
+ **Change:** <change-name>
1391
+ **Schema:** <schema-name>
1392
+ **Progress:** 7/7 tasks complete ✓
1393
+
1394
+ ### Completed This Session
1395
+ - [x] Task 1
1396
+ - [x] Task 2
1397
+ ...
1398
+
1399
+ All tasks complete! Ready to archive this change.
1400
+ \`\`\`
1401
+
1402
+ **暂停时输出(遇到问题)**
1403
+
1404
+ \`\`\`
1405
+ ## Implementation Paused
1406
+
1407
+ **Change:** <change-name>
1408
+ **Schema:** <schema-name>
1409
+ **Progress:** 4/7 tasks complete
1410
+
1411
+ ### Issue Encountered
1412
+ <description of the issue>
1413
+
1414
+ **Options:**
1415
+ 1. <option 1>
1416
+ 2. <option 2>
1417
+ 3. Other approach
1418
+
1419
+ What would you like to do?
1420
+ \`\`\`
1421
+
1422
+ **约束**
1423
+ - 持续处理任务直到完成或阻塞
1424
+ - 开始前必须读取上下文文件(来自 apply 指令输出)
1425
+ - 任务含糊则先暂停并询问
1426
+ - 实现暴露问题则暂停并建议更新工件
1427
+ - 修改尽量小且限定在任务范围
1428
+ - 完成任务后立即勾选
1429
+ - 遇到错误、阻塞或不清晰需求则暂停,不要猜测
1430
+ - 使用 CLI 输出的 contextFiles,不要假设文件名
1431
+
1432
+ **流式工作流集成**
1433
+
1434
+ 该技能支持“对变更的行动”模式:
1435
+
1436
+ - **可随时调用**:在所有工件完成前(若任务存在)、部分实现后、或与其他操作交错
1437
+ - **允许更新工件**:若实现暴露设计问题,可建议更新工件——不按阶段锁死,保持流动`
1438
+ };
1439
+ }
1440
+ /**
1441
+ * Template for /opsx:ff slash command
1442
+ */
1443
+ export function getOpsxFfCommandTemplate() {
1444
+ return {
1445
+ name: 'OPSX: Fast Forward',
1446
+ description: '创建变更并一次性生成实现所需全部工件',
1447
+ category: 'Workflow',
1448
+ tags: ['workflow', 'artifacts', 'experimental'],
1449
+ content: `快进完成工件创建,一次性生成开始实现所需的一切。
1450
+
1451
+ **输入**:\`/opsx:ff\` 后的参数是变更名称(kebab-case),或用户想构建内容的描述。
1452
+
1453
+ **步骤**
1454
+
1455
+ 1. **若未提供输入,询问要构建的内容**
1456
+
1457
+ 使用 **AskUserQuestion tool**(开放式、无预设选项)提问:
1458
+ > "What change do you want to work on? Describe what you want to build or fix."
1459
+
1460
+ 根据描述生成 kebab-case 名称(例如 "add user authentication" → \`add-user-auth\`)。
1461
+
1462
+ **IMPORTANT**: 未理解用户想要构建的内容前不要继续。
1463
+
1464
+ 2. **创建变更目录**
1465
+ \`\`\`bash
1466
+ openspec new change "<name>"
1467
+ \`\`\`
1468
+ 该命令会在 \`openspec/changes/<name>/\` 下创建脚手架。
1469
+
1470
+ 3. **获取工件构建顺序**
1471
+ \`\`\`bash
1472
+ openspec status --change "<name>" --json
1473
+ \`\`\`
1474
+ 解析 JSON 获取:
1475
+ - \`applyRequires\`: 实现前需要完成的工件 ID 列表(例如 \`["tasks"]\`)
1476
+ - \`artifacts\`: 所有工件及其状态与依赖
1477
+
1478
+ 4. **按顺序创建工件直到可 apply**
1479
+
1480
+ 使用 **TodoWrite tool** 跟踪工件创建进度。
1481
+
1482
+ 按依赖顺序遍历工件(先处理无待完成依赖的工件):
1483
+
1484
+ a. **对于状态为 \`ready\` 的工件(依赖已满足)**:
1485
+ - 获取指令:
1486
+ \`\`\`bash
1487
+ openspec instructions <artifact-id> --change "<name>" --json
1488
+ \`\`\`
1489
+ - 指令 JSON 包含:
1490
+ - \`context\`: 项目背景(对你是约束,不要写入输出)
1491
+ - \`rules\`: 工件规则(对你是约束,不要写入输出)
1492
+ - \`template\`: 输出文件结构
1493
+ - \`instruction\`: 该工件的 schema 指导
1494
+ - \`outputPath\`: 输出路径
1495
+ - \`dependencies\`: 需读取的已完成工件
1496
+ - 读取已完成依赖工件作为上下文
1497
+ - 使用 \`template\` 作为结构创建工件文件
1498
+ - 将 \`context\` 与 \`rules\` 作为约束,但不要复制进文件
1499
+ - 简要展示进度:"✓ Created <artifact-id>"
1500
+
1501
+ b. **继续直到所有 \`applyRequires\` 工件完成**
1502
+ - 每创建一个工件后重跑 \`openspec status --change "<name>" --json\`
1503
+ - 检查 \`applyRequires\` 中的每个工件 ID 是否在 artifacts 中为 \`status: "done"\`
1504
+ - 当所有 \`applyRequires\` 工件完成时停止
1505
+
1506
+ c. **若某工件需要用户输入**(上下文不清楚):
1507
+ - 使用 **AskUserQuestion tool** 进行澄清
1508
+ - 然后继续创建
1509
+
1510
+ 5. **展示最终状态**
1511
+ \`\`\`bash
1512
+ openspec status --change "<name>"
1513
+ \`\`\`
1514
+
1515
+ **输出**
1516
+
1517
+ 完成所有工件后总结:
1518
+ - 变更名称与位置
1519
+ - 已创建工件列表与简述
1520
+ - 就绪提示:"所有工件已创建!可开始实现。"
1521
+ - 提示语:"运行 \`/opsx:apply\` 开始实现。"
1522
+
1523
+ **工件创建指南**
1524
+
1525
+ - 按 \`openspec instructions\` 的 \`instruction\` 字段执行每个工件类型
1526
+ - schema 定义了每个工件应包含的内容,严格遵循
1527
+ - 创建新工件前先读取依赖工件作为上下文
1528
+ - 使用 \`template\` 作为输出结构并填写内容
1529
+
1530
+ **约束**
1531
+ - 创建实现所需的所有工件(由 schema 的 \`apply.requires\` 定义)
1532
+ - 创建新工件前必须读取依赖工件
1533
+ - 若上下文严重不清楚,先询问用户,但尽量做合理判断以保持推进
1534
+ - 若该名称已有变更,建议继续该变更
1535
+ - 写入后确认工件文件存在,再继续下一个`
1536
+ };
1537
+ }
1538
+ /**
1539
+ * Template for openspec-archive-change skill
1540
+ * For archiving completed changes in the experimental workflow
1541
+ */
1542
+ export function getArchiveChangeSkillTemplate() {
1543
+ return {
1544
+ name: 'openspec-archive-change',
1545
+ description: '归档实验性工作流中已完成的变更。用于用户完成实现后希望最终归档时。',
1546
+ instructions: `在实验性工作流中归档已完成的变更。
1547
+
1548
+ **输入**:可选指定变更名称。若省略,先从对话上下文推断;如含糊或有歧义,必须提示选择可用变更。
1549
+
1550
+ **步骤**
1551
+
1552
+ 1. **未提供变更名称时,提示选择**
1553
+
1554
+ 运行 \`openspec list --json\` 获取可用变更,并使用 **AskUserQuestion tool** 让用户选择。
1555
+
1556
+ 仅展示活跃变更(未归档)。
1557
+ 如可用,展示每个变更使用的 schema。
1558
+
1559
+ **IMPORTANT**: 不要猜测或自动选择变更,必须由用户选择。
1560
+
1561
+ 2. **检查工件完成状态**
1562
+
1563
+ 运行 \`openspec status --change "<name>" --json\` 检查工件完成情况。
1564
+
1565
+ 解析 JSON 以了解:
1566
+ - \`schemaName\`: 使用的工作流
1567
+ - \`artifacts\`: 工件列表及其状态(\`done\` 或其他)
1568
+
1569
+ **若有工件未完成(非 \`done\`):**
1570
+ - 显示警告并列出未完成的工件
1571
+ - 使用 **AskUserQuestion tool** 确认是否继续
1572
+ - 用户确认后继续
1573
+
1574
+ 3. **检查任务完成状态**
1575
+
1576
+ 读取 tasks 文件(通常为 \`tasks.md\`)以检查未完成任务。
1577
+
1578
+ 统计 \`- [ ]\`(未完成)与 \`- [x]\`(完成)的数量。
1579
+
1580
+ **若存在未完成任务:**
1581
+ - 显示警告并展示未完成任务数量
1582
+ - 使用 **AskUserQuestion tool** 确认是否继续
1583
+ - 用户确认后继续
1584
+
1585
+ **若不存在 tasks 文件:** 无需任务警告,继续。
1586
+
1587
+ 4. **评估增量规范同步状态**
1588
+
1589
+ 检查 \`openspec/changes/<name>/specs/\` 是否存在增量规范。若不存在,无需同步提示。
1590
+
1591
+ **若存在增量规范:**
1592
+ - 将每个增量规范与对应主规范 \`openspec/specs/<capability>/spec.md\` 进行对比
1593
+ - 确定将应用的变更(新增/修改/删除/重命名)
1594
+ - 在提示前展示合并摘要
1595
+
1596
+ **提示选项:**
1597
+ - 若需要同步:"立即同步(推荐)"、"不同步直接归档"
1598
+ - 若已同步:"立即归档"、"仍然同步"、"取消"
1599
+
1600
+ 若用户选择同步,执行 /opsx:sync 逻辑(使用 openspec-sync-specs 技能)。无论选择如何都继续归档流程。
1601
+
1602
+ 5. **执行归档**
1603
+
1604
+ 若归档目录不存在则创建:
1605
+ \`\`\`bash
1606
+ mkdir -p openspec/changes/archive
1607
+ \`\`\`
1608
+
1609
+ 使用当前日期生成目标名称:\`YYYY-MM-DD-<change-name>\`
1610
+
1611
+ **检查目标是否已存在:**
1612
+ - 若存在:报错并建议重命名已有归档或使用不同日期
1613
+ - 若不存在:将变更目录移动到归档
1614
+
1615
+ \`\`\`bash
1616
+ mv openspec/changes/<name> openspec/changes/archive/YYYY-MM-DD-<name>
1617
+ \`\`\`
1618
+
1619
+ 6. **展示摘要**
1620
+
1621
+ 展示归档完成摘要,包括:
1622
+ - 变更名称
1623
+ - 使用的 schema
1624
+ - 归档位置
1625
+ - 规范是否已同步(如适用)
1626
+ - 任何警告说明(工件/任务未完成)
1627
+
1628
+ **成功时输出**
1629
+
1630
+ \`\`\`
1631
+ ## Archive Complete
1632
+
1633
+ **Change:** <change-name>
1634
+ **Schema:** <schema-name>
1635
+ **Archived to:** openspec/changes/archive/YYYY-MM-DD-<name>/
1636
+ **Specs:** ✓ Synced to main specs (or "No delta specs" or "Sync skipped")
1637
+
1638
+ All artifacts complete. All tasks complete.
1639
+ \`\`\`
1640
+
1641
+ **约束**
1642
+ - 未提供变更名称时必须提示选择
1643
+ - 使用工件图(openspec status --json)检查完成情况
1644
+ - 警告不阻塞归档——只需告知并确认
1645
+ - 移动归档时保留 .openspec.yaml(随目录一起移动)
1646
+ - 清晰展示发生了什么
1647
+ - 若请求同步,使用 openspec-sync-specs 方法(agent-driven)
1648
+ - 若存在增量规范,必须先进行同步评估并展示合并摘要再提示`,
1649
+ license: 'MIT',
1650
+ compatibility: 'Requires openspec CLI.',
1651
+ metadata: { author: 'openspec', version: '1.0' },
1652
+ };
1653
+ }
1654
+ /**
1655
+ * Template for openspec-bulk-archive-change skill
1656
+ * For archiving multiple completed changes at once
1657
+ */
1658
+ export function getBulkArchiveChangeSkillTemplate() {
1659
+ return {
1660
+ name: 'openspec-bulk-archive-change',
1661
+ description: '批量归档多个已完成变更。适用于同时归档多个并行变更。',
1662
+ instructions: `在一次操作中归档多个已完成变更。
1663
+
1664
+ 该技能允许批量归档变更,并通过检查代码库智能处理规范冲突以判断真实实现情况。
1665
+
1666
+ **输入**:无需输入(会提示选择)
1667
+
1668
+ **步骤**
1669
+
1670
+ 1. **获取活跃变更**
1671
+
1672
+ 运行 \`openspec list --json\` 获取所有活跃变更。
1673
+
1674
+ 若无活跃变更,告知用户并停止。
1675
+
1676
+ 2. **提示选择变更**
1677
+
1678
+ 使用 **AskUserQuestion tool** 的多选让用户选择变更:
1679
+ - 展示每个变更及其 schema
1680
+ - 包含 "All changes" 选项
1681
+ - 允许选择任意数量(1+ 即可,典型为 2+)
1682
+
1683
+ **IMPORTANT**: 不要自动选择,必须由用户选择。
1684
+
1685
+ 3. **批量校验——收集所选变更的状态**
1686
+
1687
+ 对每个所选变更,收集:
1688
+
1689
+ a. **工件状态** - 运行 \`openspec status --change "<name>" --json\`
1690
+ - 解析 \`schemaName\` 和 \`artifacts\` 列表
1691
+ - 记录哪些工件为 \`done\`,哪些为其他状态
1692
+
1693
+ b. **任务完成情况** - 读取 \`openspec/changes/<name>/tasks.md\`
1694
+ - 统计 \`- [ ]\`(未完成)与 \`- [x]\`(完成)数量
1695
+ - 若没有 tasks 文件,记录为 "无任务"
1696
+
1697
+ c. **增量规范** - 检查 \`openspec/changes/<name>/specs/\` 目录
1698
+ - 列出存在的 capability 规范
1699
+ - 对每个规范提取需求名称(匹配 \`### Requirement: <name>\` 的行)
1700
+
1701
+ 4. **检测规范冲突**
1702
+
1703
+ 构建映射 \`capability -> [changes that touch it]\`:
1704
+
1705
+ \`\`\`
1706
+ auth -> [change-a, change-b] <- CONFLICT (2+ changes)
1707
+ api -> [change-c] <- OK (only 1 change)
1708
+ \`\`\`
1709
+
1710
+ 当 2+ 个所选变更对同一 capability 存在增量规范时视为冲突。
1711
+
1712
+ 5. **以 agent 方式解决冲突**
1713
+
1714
+ **针对每个冲突**,调查代码库:
1715
+
1716
+ a. **读取各冲突变更的增量规范**,理解各自声明新增/修改内容
1717
+
1718
+ b. **搜索代码库** 寻找实现证据:
1719
+ - 查找实现增量规范需求的代码
1720
+ - 检查相关文件、函数或测试
1721
+
1722
+ c. **确定解决方案**:
1723
+ - 仅一个变更实际实现 -> 同步该变更的规范
1724
+ - 两者均已实现 -> 按时间顺序应用(先旧后新,新覆盖旧)
1725
+ - 均未实现 -> 跳过规范同步并警告
1726
+
1727
+ d. **记录冲突解决方案**:
1728
+ - 应用哪个变更的规范
1729
+ - 应用顺序(如两者均实现)
1730
+ - 理由(代码库发现)
1731
+
1732
+ 6. **展示汇总状态表**
1733
+
1734
+ 展示汇总所有变更的表格:
1735
+
1736
+ \`\`\`
1737
+ | Change | Artifacts | Tasks | Specs | Conflicts | Status |
1738
+ |---------------------|-----------|-------|---------|-----------|--------|
1739
+ | schema-management | Done | 5/5 | 2 delta | None | Ready |
1740
+ | project-config | Done | 3/3 | 1 delta | None | Ready |
1741
+ | add-oauth | Done | 4/4 | 1 delta | auth (!) | Ready* |
1742
+ | add-verify-skill | 1 left | 2/5 | None | None | Warn |
1743
+ \`\`\`
1744
+
1745
+ 对于冲突,展示解决方案:
1746
+ \`\`\`
1747
+ * Conflict resolution:
1748
+ - auth spec: Will apply add-oauth then add-jwt (both implemented, chronological order)
1749
+ \`\`\`
1750
+
1751
+ 对于未完成的变更,展示警告:
1752
+ \`\`\`
1753
+ Warnings:
1754
+ - add-verify-skill: 1 incomplete artifact, 3 incomplete tasks
1755
+ \`\`\`
1756
+
1757
+ 7. **确认批量操作**
1758
+
1759
+ 使用 **AskUserQuestion tool** 做一次确认:
1760
+
1761
+ - "归档 N 个变更?" 并提供基于状态的选项
1762
+ - 选项可能包括:
1763
+ - "归档全部 N 个变更"
1764
+ - "仅归档已就绪的 N 个变更(跳过未完成)"
1765
+ - "取消"
1766
+
1767
+ 若存在未完成的变更,要明确会带警告归档。
1768
+
1769
+ 8. **对每个确认的变更执行归档**
1770
+
1771
+ 按确定的顺序处理变更(遵循冲突解决顺序):
1772
+
1773
+ a. **如存在增量规范则先同步**:
1774
+ - 使用 openspec-sync-specs 方法(agent-driven 智能合并)
1775
+ - 对冲突按已解决顺序应用
1776
+ - 记录是否已同步
1777
+
1778
+ b. **执行归档**:
1779
+ \`\`\`bash
1780
+ mkdir -p openspec/changes/archive
1781
+ mv openspec/changes/<name> openspec/changes/archive/YYYY-MM-DD-<name>
1782
+ \`\`\`
1783
+
1784
+ c. **记录每个变更的结果**:
1785
+ - 成功:归档成功
1786
+ - 失败:归档时出错(记录错误)
1787
+ - 跳过:用户选择不归档(如适用)
1788
+
1789
+ 9. **展示总结**
1790
+
1791
+ 展示最终结果:
1792
+
1793
+ \`\`\`
1794
+ ## Bulk Archive Complete
1795
+
1796
+ Archived 3 changes:
1797
+ - schema-management-cli -> archive/2026-01-19-schema-management-cli/
1798
+ - project-config -> archive/2026-01-19-project-config/
1799
+ - add-oauth -> archive/2026-01-19-add-oauth/
1800
+
1801
+ Skipped 1 change:
1802
+ - add-verify-skill (user chose not to archive incomplete)
1803
+
1804
+ Spec sync summary:
1805
+ - 4 delta specs synced to main specs
1806
+ - 1 conflict resolved (auth: applied both in chronological order)
1807
+ \`\`\`
1808
+
1809
+ 若有失败:
1810
+ \`\`\`
1811
+ Failed 1 change:
1812
+ - some-change: Archive directory already exists
1813
+ \`\`\`
1814
+
1815
+ **冲突解决示例**
1816
+
1817
+ 示例 1:仅一个实现
1818
+ \`\`\`
1819
+ Conflict: specs/auth/spec.md touched by [add-oauth, add-jwt]
1820
+
1821
+ Checking add-oauth:
1822
+ - Delta adds "OAuth Provider Integration" requirement
1823
+ - Searching codebase... found src/auth/oauth.ts implementing OAuth flow
1824
+
1825
+ Checking add-jwt:
1826
+ - Delta adds "JWT Token Handling" requirement
1827
+ - Searching codebase... no JWT implementation found
1828
+
1829
+ Resolution: Only add-oauth is implemented. Will sync add-oauth specs only.
1830
+ \`\`\`
1831
+
1832
+ 示例 2:两者均实现
1833
+ \`\`\`
1834
+ Conflict: specs/api/spec.md touched by [add-rest-api, add-graphql]
1835
+
1836
+ Checking add-rest-api (created 2026-01-10):
1837
+ - Delta adds "REST Endpoints" requirement
1838
+ - Searching codebase... found src/api/rest.ts
1839
+
1840
+ Checking add-graphql (created 2026-01-15):
1841
+ - Delta adds "GraphQL Schema" requirement
1842
+ - Searching codebase... found src/api/graphql.ts
1843
+
1844
+ Resolution: Both implemented. Will apply add-rest-api specs first,
1845
+ then add-graphql specs (chronological order, newer takes precedence).
1846
+ \`\`\`
1847
+
1848
+ **成功时输出**
1849
+
1850
+ \`\`\`
1851
+ ## Bulk Archive Complete
1852
+
1853
+ Archived N changes:
1854
+ - <change-1> -> archive/YYYY-MM-DD-<change-1>/
1855
+ - <change-2> -> archive/YYYY-MM-DD-<change-2>/
1856
+
1857
+ Spec sync summary:
1858
+ - N delta specs synced to main specs
1859
+ - No conflicts (or: M conflicts resolved)
1860
+ \`\`\`
1861
+
1862
+ **部分成功时输出**
1863
+
1864
+ \`\`\`
1865
+ ## Bulk Archive Complete (partial)
1866
+
1867
+ Archived N changes:
1868
+ - <change-1> -> archive/YYYY-MM-DD-<change-1>/
1869
+
1870
+ Skipped M changes:
1871
+ - <change-2> (user chose not to archive incomplete)
1872
+
1873
+ Failed K changes:
1874
+ - <change-3>: Archive directory already exists
1875
+ \`\`\`
1876
+
1877
+ **无可归档变更时输出**
1878
+
1879
+ \`\`\`
1880
+ ## No Changes to Archive
1881
+
1882
+ No active changes found. Use \`/opsx:new\` to create a new change.
1883
+ \`\`\`
1884
+
1885
+ **约束**
1886
+ - 允许选择任意数量的变更(1+ 即可,2+ 常见)
1887
+ - 必须提示选择,禁止自动选择
1888
+ - 尽早检测规范冲突并通过代码库解决
1889
+ - 若两个变更都已实现,按时间顺序应用规范
1890
+ - 仅在缺少实现时跳过规范同步(并警告)
1891
+ - 确认前展示清晰的逐变更状态
1892
+ - 整个批次只做一次确认
1893
+ - 跟踪并汇报所有结果(成功/跳过/失败)
1894
+ - 移动归档时保留 .openspec.yaml
1895
+ - 归档目标使用当前日期:YYYY-MM-DD-<name>
1896
+ - 若归档目标已存在,该变更失败但继续处理其他`,
1897
+ license: 'MIT',
1898
+ compatibility: 'Requires openspec CLI.',
1899
+ metadata: { author: 'openspec', version: '1.0' },
1900
+ };
1901
+ }
1902
+ /**
1903
+ * Template for /opsx:sync slash command
1904
+ */
1905
+ export function getOpsxSyncCommandTemplate() {
1906
+ return {
1907
+ name: 'OPSX: Sync',
1908
+ description: '将变更中的增量规范同步到主规范',
1909
+ category: 'Workflow',
1910
+ tags: ['workflow', 'specs', 'experimental'],
1911
+ content: `将增量规范从变更同步到主规范。
1912
+
1913
+ 这是一个 **agent-driven** 操作——你将读取增量规范并直接编辑主规范以应用变更。这允许智能合并(例如只新增场景而不复制整个需求)。
1914
+
1915
+ **输入**:可选在 \`/opsx:sync\` 后指定变更名称(例如 \`/opsx:sync add-auth\`)。若省略,先从对话上下文推断;如含糊或有歧义,必须提示选择可用变更。
1916
+
1917
+ **步骤**
1918
+
1919
+ 1. **未提供变更名称时,提示选择**
1920
+
1921
+ 运行 \`openspec list --json\` 获取可用变更,并使用 **AskUserQuestion tool** 让用户选择。
1922
+
1923
+ 仅展示包含增量规范的变更(位于 \`specs/\` 目录)。
1924
+
1925
+ **IMPORTANT**: 不要猜测或自动选择变更,必须由用户选择。
1926
+
1927
+ 2. **查找增量规范**
1928
+
1929
+ 查找 \`openspec/changes/<name>/specs/*/spec.md\` 下的增量规范文件。
1930
+
1931
+ 每个增量规范文件包含以下章节:
1932
+ - \`## ADDED Requirements\` - 新增的需求
1933
+ - \`## MODIFIED Requirements\` - 对现有需求的变更
1934
+ - \`## REMOVED Requirements\` - 需要移除的需求
1935
+ - \`## RENAMED Requirements\` - 需要重命名的需求(FROM:/TO: 格式)
1936
+
1937
+ 若未找到增量规范,告知用户并停止。
1938
+
1939
+ 3. **针对每个增量规范应用到主规范**
1940
+
1941
+ 对于位于 \`openspec/changes/<name>/specs/<capability>/spec.md\` 的每个能力:
1942
+
1943
+ a. **读取增量规范** 以理解变更意图
1944
+
1945
+ b. **读取主规范** \`openspec/specs/<capability>/spec.md\`(可能尚不存在)
1946
+
1947
+ c. **智能应用变更**:
1948
+
1949
+ **ADDED Requirements:**
1950
+ - 主规范中不存在该需求 → 新增
1951
+ - 已存在该需求 → 更新以匹配(视为隐式 MODIFIED)
1952
+
1953
+ **MODIFIED Requirements:**
1954
+ - 在主规范中定位需求
1955
+ - 应用变更,可包括:
1956
+ - 添加新场景(无需复制已有场景)
1957
+ - 修改已有场景
1958
+ - 修改需求描述
1959
+ - 保留增量未涉及的场景/内容
1960
+
1961
+ **REMOVED Requirements:**
1962
+ - 从主规范中删除整个需求块
1963
+
1964
+ **RENAMED Requirements:**
1965
+ - 找到 FROM 需求并重命名为 TO
1966
+
1967
+ d. **若能力尚不存在主规范则创建**:
1968
+ - 创建 \`openspec/specs/<capability>/spec.md\`
1969
+ - 添加 Purpose 部分(可简略,标注 TBD)
1970
+ - 添加 Requirements 部分并填入 ADDED 需求
1971
+
1972
+ 4. **展示摘要**
1973
+
1974
+ 应用完所有变更后总结:
1975
+ - 更新了哪些能力
1976
+ - 做了哪些变更(新增/修改/删除/重命名需求)
1977
+
1978
+ **增量规范格式参考**
1979
+
1980
+ \`\`\`markdown
1981
+ ## ADDED Requirements
1982
+
1983
+ ### Requirement: New Feature
1984
+ The system SHALL do something new.
1985
+
1986
+ #### Scenario: Basic case
1987
+ - **WHEN** user does X
1988
+ - **THEN** system does Y
1989
+
1990
+ ## MODIFIED Requirements
1991
+
1992
+ ### Requirement: Existing Feature
1993
+ #### Scenario: New scenario to add
1994
+ - **WHEN** user does A
1995
+ - **THEN** system does B
1996
+
1997
+ ## REMOVED Requirements
1998
+
1999
+ ### Requirement: Deprecated Feature
2000
+
2001
+ ## RENAMED Requirements
2002
+
2003
+ - FROM: \`### Requirement: Old Name\`
2004
+ - TO: \`### Requirement: New Name\`
2005
+ \`\`\`
2006
+
2007
+ **关键原则:智能合并**
2008
+
2009
+ 不同于程序化合并,你可以进行 **局部更新**:
2010
+ - 只需在 MODIFIED 下加入新增场景,无需复制既有场景
2011
+ - 增量表达的是*意图*,不是整体替换
2012
+ - 依据判断做合理合并
2013
+
2014
+ **成功时输出**
2015
+
2016
+ \`\`\`
2017
+ ## Specs Synced: <change-name>
2018
+
2019
+ Updated main specs:
2020
+
2021
+ **<capability-1>**:
2022
+ - Added requirement: "New Feature"
2023
+ - Modified requirement: "Existing Feature" (added 1 scenario)
2024
+
2025
+ **<capability-2>**:
2026
+ - Created new spec file
2027
+ - Added requirement: "Another Feature"
2028
+
2029
+ Main specs are now updated. The change remains active - archive when implementation is complete.
2030
+ \`\`\`
2031
+
2032
+ **约束**
2033
+ - 修改前先读增量规范与主规范
2034
+ - 保留增量未提及的现有内容
2035
+ - 不清楚时先询问澄清
2036
+ - 边改边展示变更内容
2037
+ - 该操作应具备幂等性——重复执行结果相同`
2038
+ };
2039
+ }
2040
+ /**
2041
+ * Template for openspec-verify-change skill
2042
+ * For verifying implementation matches change artifacts before archiving
2043
+ */
2044
+ export function getVerifyChangeSkillTemplate() {
2045
+ return {
2046
+ name: 'openspec-verify-change',
2047
+ description: '验证实现是否与变更工件匹配。适用于用户在归档前验证实现是否完整、正确且一致。',
2048
+ instructions: `验证实现是否与变更工件(specs、tasks、design)一致。
2049
+
2050
+ **输入**:可选指定变更名称。若省略,先从对话上下文推断;如含糊或有歧义,必须提示选择可用变更。
2051
+
2052
+ **步骤**
2053
+
2054
+ 1. **未提供变更名称时,提示选择**
2055
+
2056
+ 运行 \`openspec list --json\` 获取可用变更,并使用 **AskUserQuestion tool** 让用户选择。
2057
+
2058
+ 仅展示包含实现任务的变更(存在 tasks 工件)。
2059
+ 如可用,展示每个变更使用的 schema。
2060
+ 对未完成任务的变更标记为 "(In Progress)"。
2061
+
2062
+ **IMPORTANT**: 不要猜测或自动选择变更,必须由用户选择。
2063
+
2064
+ 2. **检查状态以了解 schema**
2065
+ \`\`\`bash
2066
+ openspec status --change "<name>" --json
2067
+ \`\`\`
2068
+ 解析 JSON 以了解:
2069
+ - \`schemaName\`: 使用的工作流(例如 "spec-driven"、"tdd")
2070
+ - 该变更存在哪些工件
2071
+
2072
+ 3. **获取变更目录并加载工件**
2073
+
2074
+ \`\`\`bash
2075
+ openspec instructions apply --change "<name>" --json
2076
+ \`\`\`
2077
+
2078
+ 该命令返回变更目录和上下文文件。读取 \`contextFiles\` 中的所有可用工件。
2079
+
2080
+ 4. **初始化验证报告结构**
2081
+
2082
+ 构建包含三个维度的报告结构:
2083
+ - **Completeness**:跟踪任务与规范覆盖
2084
+ - **Correctness**:跟踪需求实现与场景覆盖
2085
+ - **Coherence**:跟踪设计遵循与模式一致性
2086
+
2087
+ 每个维度可能出现 CRITICAL、WARNING 或 SUGGESTION 问题。
2088
+
2089
+ 5. **验证 Completeness**
2090
+
2091
+ **任务完成情况**:
2092
+ - 若 contextFiles 中存在 tasks.md,读取它
2093
+ - 解析复选框:\`- [ ]\`(未完成)与 \`- [x]\`(完成)
2094
+ - 统计完成数量与总数
2095
+ - 若存在未完成任务:
2096
+ - 为每个未完成任务添加 CRITICAL 问题
2097
+ - 建议语:"完成任务:<description>" 或 "若已实现请标记为完成"
2098
+
2099
+ **规范覆盖**:
2100
+ - 若 \`openspec/changes/<name>/specs/\` 存在增量规范:
2101
+ - 提取所有需求(以 "### Requirement:" 标记)
2102
+ - 对每个需求:
2103
+ - 在代码库中搜索相关关键词
2104
+ - 评估是否存在实现迹象
2105
+ - 若需求疑似未实现:
2106
+ - 添加 CRITICAL 问题:"未找到需求实现:<requirement name>"
2107
+ - 建议语:"实现需求 X:<description>"
2108
+
2109
+ 6. **验证 Correctness**
2110
+
2111
+ **需求实现映射**:
2112
+ - 对每个增量规范需求:
2113
+ - 搜索代码库中的实现证据
2114
+ - 若找到,记录文件路径与行范围
2115
+ - 评估实现是否符合需求意图
2116
+ - 若发现偏差:
2117
+ - 添加 WARNING:"实现可能偏离规范:<details>"
2118
+ - 建议语:"对照需求 X 检查 <file>:<lines>"
2119
+
2120
+ **场景覆盖**:
2121
+ - 针对增量规范中的每个场景(以 "#### Scenario:" 标记):
2122
+ - 检查代码中是否处理了场景条件
2123
+ - 检查是否有覆盖该场景的测试
2124
+ - 若场景疑似未覆盖:
2125
+ - 添加 WARNING:"场景未覆盖:<scenario name>"
2126
+ - 建议语:"为场景补充测试或实现:<description>"
2127
+
2128
+ 7. **验证 Coherence**
2129
+
2130
+ **设计遵循**:
2131
+ - 若 contextFiles 中存在 design.md:
2132
+ - 提取关键决策(查找 "Decision:"、"Approach:"、"Architecture:" 等部分)
2133
+ - 验证实现是否遵循这些决策
2134
+ - 若发现矛盾:
2135
+ - 添加 WARNING:"Design decision not followed: <decision>"
2136
+ - 建议语:"Update implementation or revise design.md to match reality"
2137
+ - 若不存在 design.md:跳过设计遵循检查,并注明 "无 design.md 可供校验"
2138
+
2139
+ **代码模式一致性**:
2140
+ - 审查新代码是否符合项目模式
2141
+ - 检查文件命名、目录结构、编码风格
2142
+ - 若偏差显著:
2143
+ - 添加 SUGGESTION:"Code pattern deviation: <details>"
2144
+ - 建议语:"Consider following project pattern: <example>"
2145
+
2146
+ 8. **生成验证报告**
2147
+
2148
+ **总结记分卡**:
2149
+ \`\`\`
2150
+ ## Verification Report: <change-name>
2151
+
2152
+ ### Summary
2153
+ | Dimension | Status |
2154
+ |--------------|------------------|
2155
+ | Completeness | X/Y tasks, N reqs|
2156
+ | Correctness | M/N reqs covered |
2157
+ | Coherence | Followed/Issues |
2158
+ \`\`\`
2159
+
2160
+ **按优先级列出问题**:
2161
+
2162
+ 1. **CRITICAL**(归档前必须修复):
2163
+ - 未完成任务
2164
+ - 需求实现缺失
2165
+ - 每条都要给出具体可执行的建议
2166
+
2167
+ 2. **WARNING**(应修复):
2168
+ - 规范/设计偏差
2169
+ - 场景覆盖缺失
2170
+ - 每条都有明确建议
2171
+
2172
+ 3. **SUGGESTION**(可优化):
2173
+ - 模式不一致
2174
+ - 轻微改进
2175
+ - 每条都有明确建议
2176
+
2177
+ **最终评估**:
2178
+ - 若存在 CRITICAL:"发现 X 个关键问题。归档前需修复。"
2179
+ - 若仅有 WARNING:"无关键问题。仍有 Y 个警告需考虑。可归档(附改进建议)。"
2180
+ - 若全部通过:"所有检查通过。可归档。"
2181
+
2182
+ **验证启发式**
2183
+
2184
+ - **Completeness**:关注客观清单项(复选框、需求列表)
2185
+ - **Correctness**:使用关键词搜索、路径分析、合理推断——不要求完美确定性
2186
+ - **Coherence**:关注明显不一致,不要纠结风格细节
2187
+ - **False Positives**:不确定时,优先 SUGGESTION,其次 WARNING,再到 CRITICAL
2188
+ - **Actionability**:每个问题必须有具体建议,必要时包含文件/行引用
2189
+
2190
+ **降级策略**
2191
+
2192
+ - 仅有 tasks.md:仅验证任务完成,跳过规范/设计
2193
+ - 有 tasks + specs:验证完整性与正确性,跳过设计
2194
+ - 全量工件:验证三个维度
2195
+ - 总是说明跳过了哪些检查以及原因
2196
+
2197
+ **输出格式**
2198
+
2199
+ 使用清晰的 markdown:
2200
+ - 汇总记分卡表格
2201
+ - 问题分组列表(CRITICAL/WARNING/SUGGESTION)
2202
+ - 代码引用格式:\`file.ts:123\`
2203
+ - 具体、可执行的建议
2204
+ - 避免模糊措辞如 "consider reviewing"`,
2205
+ license: 'MIT',
2206
+ compatibility: 'Requires openspec CLI.',
2207
+ metadata: { author: 'openspec', version: '1.0' },
2208
+ };
2209
+ }
2210
+ /**
2211
+ * Template for /opsx:archive slash command
2212
+ */
2213
+ export function getOpsxArchiveCommandTemplate() {
2214
+ return {
2215
+ name: 'OPSX: Archive',
2216
+ description: '在实验性工作流中归档已完成的变更',
2217
+ category: 'Workflow',
2218
+ tags: ['workflow', 'archive', 'experimental'],
2219
+ content: `在实验性工作流中归档已完成的变更。
2220
+
2221
+ **输入**:可选在 \`/opsx:archive\` 后指定变更名称(例如 \`/opsx:archive add-auth\`)。若省略,先从对话上下文推断;如含糊或有歧义,必须提示选择可用变更。
2222
+
2223
+ **步骤**
2224
+
2225
+ 1. **未提供变更名称时,提示选择**
2226
+
2227
+ 运行 \`openspec list --json\` 获取可用变更,并使用 **AskUserQuestion tool** 让用户选择。
2228
+
2229
+ 仅展示活跃变更(未归档)。
2230
+ 如可用,展示每个变更使用的 schema。
2231
+
2232
+ **IMPORTANT**: 不要猜测或自动选择变更,必须由用户选择。
2233
+
2234
+ 2. **检查工件完成状态**
2235
+
2236
+ 运行 \`openspec status --change "<name>" --json\` 检查工件完成情况。
2237
+
2238
+ 解析 JSON 以了解:
2239
+ - \`schemaName\`: 使用的工作流
2240
+ - \`artifacts\`: 工件列表及其状态(\`done\` 或其他)
2241
+
2242
+ **若有工件未完成(非 \`done\`):**
2243
+ - 显示警告并列出未完成工件
2244
+ - 提示用户确认继续
2245
+ - 用户确认后继续
2246
+
2247
+ 3. **检查任务完成状态**
2248
+
2249
+ 读取 tasks 文件(通常为 \`tasks.md\`)以检查未完成任务。
2250
+
2251
+ 统计 \`- [ ]\`(未完成)与 \`- [x]\`(完成)数量。
2252
+
2253
+ **若存在未完成任务:**
2254
+ - 显示警告并展示未完成任务数量
2255
+ - 提示用户确认继续
2256
+ - 用户确认后继续
2257
+
2258
+ **若不存在 tasks 文件:** 无需任务警告,继续。
2259
+
2260
+ 4. **评估增量规范同步状态**
2261
+
2262
+ 检查 \`openspec/changes/<name>/specs/\` 是否存在增量规范。若不存在,无需同步提示。
2263
+
2264
+ **若存在增量规范:**
2265
+ - 将每个增量规范与对应主规范 \`openspec/specs/<capability>/spec.md\` 进行对比
2266
+ - 确定将应用的变更(新增/修改/删除/重命名)
2267
+ - 在提示前展示合并摘要
2268
+
2269
+ **提示选项:**
2270
+ - 若需要同步:"立即同步(推荐)"、"不同步直接归档"
2271
+ - 若已同步:"立即归档"、"仍然同步"、"取消"
2272
+
2273
+ 若用户选择同步,执行 \`/opsx:sync\` 逻辑。无论选择如何都继续归档流程。
2274
+
2275
+ 5. **执行归档**
2276
+
2277
+ 若归档目录不存在则创建:
2278
+ \`\`\`bash
2279
+ mkdir -p openspec/changes/archive
2280
+ \`\`\`
2281
+
2282
+ 使用当前日期生成目标名称:\`YYYY-MM-DD-<change-name>\`
2283
+
2284
+ **检查目标是否已存在:**
2285
+ - 若存在:报错并建议重命名已有归档或使用不同日期
2286
+ - 若不存在:将变更目录移动到归档
2287
+
2288
+ \`\`\`bash
2289
+ mv openspec/changes/<name> openspec/changes/archive/YYYY-MM-DD-<name>
2290
+ \`\`\`
2291
+
2292
+ 6. **展示摘要**
2293
+
2294
+ 展示归档完成摘要,包括:
2295
+ - 变更名称
2296
+ - 使用的 schema
2297
+ - 归档位置
2298
+ - 规范同步状态(已同步 / 跳过同步 / 无增量规范)
2299
+ - 任何警告说明(工件/任务未完成)
2300
+
2301
+ **成功时输出**
2302
+
2303
+ \`\`\`
2304
+ ## Archive Complete
2305
+
2306
+ **Change:** <change-name>
2307
+ **Schema:** <schema-name>
2308
+ **Archived to:** openspec/changes/archive/YYYY-MM-DD-<name>/
2309
+ **Specs:** ✓ Synced to main specs
2310
+
2311
+ All artifacts complete. All tasks complete.
2312
+ \`\`\`
2313
+
2314
+ **成功时输出(无增量规范)**
2315
+
2316
+ \`\`\`
2317
+ ## Archive Complete
2318
+
2319
+ **Change:** <change-name>
2320
+ **Schema:** <schema-name>
2321
+ **Archived to:** openspec/changes/archive/YYYY-MM-DD-<name>/
2322
+ **Specs:** No delta specs
2323
+
2324
+ All artifacts complete. All tasks complete.
2325
+ \`\`\`
2326
+
2327
+ **成功时输出(含警告)**
2328
+
2329
+ \`\`\`
2330
+ ## Archive Complete (with warnings)
2331
+
2332
+ **Change:** <change-name>
2333
+ **Schema:** <schema-name>
2334
+ **Archived to:** openspec/changes/archive/YYYY-MM-DD-<name>/
2335
+ **Specs:** Sync skipped (user chose to skip)
2336
+
2337
+ **Warnings:**
2338
+ - Archived with 2 incomplete artifacts
2339
+ - Archived with 3 incomplete tasks
2340
+ - Delta spec sync was skipped (user chose to skip)
2341
+
2342
+ Review the archive if this was not intentional.
2343
+ \`\`\`
2344
+
2345
+ **错误输出(归档已存在)**
2346
+
2347
+ \`\`\`
2348
+ ## Archive Failed
2349
+
2350
+ **Change:** <change-name>
2351
+ **Target:** openspec/changes/archive/YYYY-MM-DD-<name>/
2352
+
2353
+ Target archive directory already exists.
2354
+
2355
+ **Options:**
2356
+ 1. Rename the existing archive
2357
+ 2. Delete the existing archive if it's a duplicate
2358
+ 3. Wait until a different date to archive
2359
+ \`\`\`
2360
+
2361
+ **约束**
2362
+ - 未提供变更名称时必须提示选择
2363
+ - 使用工件图(openspec status --json)检查完成情况
2364
+ - 警告不阻塞归档——只需告知并确认
2365
+ - 移动归档时保留 .openspec.yaml(随目录一起移动)
2366
+ - 清晰展示发生了什么
2367
+ - 若请求同步,使用 /opsx:sync 方法(agent-driven)
2368
+ - 若存在增量规范,必须先进行同步评估并展示合并摘要再提示`
2369
+ };
2370
+ }
2371
+ /**
2372
+ * Template for /opsx:bulk-archive slash command
2373
+ */
2374
+ export function getOpsxBulkArchiveCommandTemplate() {
2375
+ return {
2376
+ name: 'OPSX: Bulk Archive',
2377
+ description: '批量归档多个已完成变更',
2378
+ category: 'Workflow',
2379
+ tags: ['workflow', 'archive', 'experimental', 'bulk'],
2380
+ content: `在一次操作中归档多个已完成变更。
2381
+
2382
+ 该技能允许批量归档变更,并通过检查代码库智能处理规范冲突以判断真实实现情况。
2383
+
2384
+ **输入**:无需输入(会提示选择)
2385
+
2386
+ **步骤**
2387
+
2388
+ 1. **获取活跃变更**
2389
+
2390
+ 运行 \`openspec list --json\` 获取所有活跃变更。
2391
+
2392
+ 若无活跃变更,告知用户并停止。
2393
+
2394
+ 2. **提示选择变更**
2395
+
2396
+ 使用 **AskUserQuestion tool** 的多选让用户选择变更:
2397
+ - 展示每个变更及其 schema
2398
+ - 包含 "全部变更" 选项
2399
+ - 允许选择任意数量(1+ 即可,典型为 2+)
2400
+
2401
+ **IMPORTANT**: 不要自动选择,必须由用户选择。
2402
+
2403
+ 3. **批量校验——收集所选变更的状态**
2404
+
2405
+ 对每个所选变更,收集:
2406
+
2407
+ a. **工件状态** - 运行 \`openspec status --change "<name>" --json\`
2408
+ - 解析 \`schemaName\` 和 \`artifacts\` 列表
2409
+ - 记录哪些工件为 \`done\`,哪些为其他状态
2410
+
2411
+ b. **任务完成情况** - 读取 \`openspec/changes/<name>/tasks.md\`
2412
+ - 统计 \`- [ ]\`(未完成)与 \`- [x]\`(完成)数量
2413
+ - 若没有 tasks 文件,记录为 "无任务"
2414
+
2415
+ c. **增量规范** - 检查 \`openspec/changes/<name>/specs/\` 目录
2416
+ - 列出存在的 capability 规范
2417
+ - 对每个规范提取需求名称(匹配 \`### Requirement: <name>\` 的行)
2418
+
2419
+ 4. **检测规范冲突**
2420
+
2421
+ 构建映射 \`capability -> [changes that touch it]\`:
2422
+
2423
+ \`\`\`
2424
+ auth -> [change-a, change-b] <- CONFLICT (2+ changes)
2425
+ api -> [change-c] <- OK (only 1 change)
2426
+ \`\`\`
2427
+
2428
+ 当 2+ 个所选变更对同一 capability 存在增量规范时视为冲突。
2429
+
2430
+ 5. **以 agent 方式解决冲突**
2431
+
2432
+ **针对每个冲突**,调查代码库:
2433
+
2434
+ a. **读取各冲突变更的增量规范**,理解各自声明新增/修改内容
2435
+
2436
+ b. **搜索代码库** 寻找实现证据:
2437
+ - 查找实现增量规范需求的代码
2438
+ - 检查相关文件、函数或测试
2439
+
2440
+ c. **确定解决方案**:
2441
+ - 仅一个变更实际实现 -> 同步该变更的规范
2442
+ - 两者均已实现 -> 按时间顺序应用(先旧后新,新覆盖旧)
2443
+ - 均未实现 -> 跳过规范同步并警告
2444
+
2445
+ d. **记录冲突解决方案**:
2446
+ - 应用哪个变更的规范
2447
+ - 应用顺序(如两者均实现)
2448
+ - 理由(代码库发现)
2449
+
2450
+ 6. **展示汇总状态表**
2451
+
2452
+ 展示汇总所有变更的表格:
2453
+
2454
+ \`\`\`
2455
+ | Change | Artifacts | Tasks | Specs | Conflicts | Status |
2456
+ |---------------------|-----------|-------|---------|-----------|--------|
2457
+ | schema-management | Done | 5/5 | 2 delta | None | Ready |
2458
+ | project-config | Done | 3/3 | 1 delta | None | Ready |
2459
+ | add-oauth | Done | 4/4 | 1 delta | auth (!) | Ready* |
2460
+ | add-verify-skill | 1 left | 2/5 | None | None | Warn |
2461
+ \`\`\`
2462
+
2463
+ 对于冲突,展示解决方案:
2464
+ \`\`\`
2465
+ * Conflict resolution:
2466
+ - auth spec: Will apply add-oauth then add-jwt (both implemented, chronological order)
2467
+ \`\`\`
2468
+
2469
+ 对于未完成的变更,展示警告:
2470
+ \`\`\`
2471
+ Warnings:
2472
+ - add-verify-skill: 1 incomplete artifact, 3 incomplete tasks
2473
+ \`\`\`
2474
+
2475
+ 7. **确认批量操作**
2476
+
2477
+ 使用 **AskUserQuestion tool** 做一次确认:
2478
+
2479
+ - "归档 N 个变更?" 并提供基于状态的选项
2480
+ - 选项可能包括:
2481
+ - "归档全部 N 个变更"
2482
+ - "仅归档已就绪的 N 个变更(跳过未完成)"
2483
+ - "取消"
2484
+
2485
+ 若存在未完成的变更,要明确会带警告归档。
2486
+
2487
+ 8. **对每个确认的变更执行归档**
2488
+
2489
+ 按确定的顺序处理变更(遵循冲突解决顺序):
2490
+
2491
+ a. **如存在增量规范则先同步**:
2492
+ - 使用 openspec-sync-specs 方法(agent-driven 智能合并)
2493
+ - 对冲突按已解决顺序应用
2494
+ - 记录是否已同步
2495
+
2496
+ b. **执行归档**:
2497
+ \`\`\`bash
2498
+ mkdir -p openspec/changes/archive
2499
+ mv openspec/changes/<name> openspec/changes/archive/YYYY-MM-DD-<name>
2500
+ \`\`\`
2501
+
2502
+ c. **记录每个变更的结果**:
2503
+ - 成功:归档成功
2504
+ - 失败:归档时出错(记录错误)
2505
+ - 跳过:用户选择不归档(如适用)
2506
+
2507
+ 9. **展示总结**
2508
+
2509
+ 展示最终结果:
2510
+
2511
+ \`\`\`
2512
+ ## Bulk Archive Complete
2513
+
2514
+ Archived 3 changes:
2515
+ - schema-management-cli -> archive/2026-01-19-schema-management-cli/
2516
+ - project-config -> archive/2026-01-19-project-config/
2517
+ - add-oauth -> archive/2026-01-19-add-oauth/
2518
+
2519
+ Skipped 1 change:
2520
+ - add-verify-skill (user chose not to archive incomplete)
2521
+
2522
+ Spec sync summary:
2523
+ - 4 delta specs synced to main specs
2524
+ - 1 conflict resolved (auth: applied both in chronological order)
2525
+ \`\`\`
2526
+
2527
+ 若有失败:
2528
+ \`\`\`
2529
+ Failed 1 change:
2530
+ - some-change: Archive directory already exists
2531
+ \`\`\`
2532
+
2533
+ **冲突解决示例**
2534
+
2535
+ 示例 1:仅一个实现
2536
+ \`\`\`
2537
+ Conflict: specs/auth/spec.md touched by [add-oauth, add-jwt]
2538
+
2539
+ Checking add-oauth:
2540
+ - Delta adds "OAuth Provider Integration" requirement
2541
+ - Searching codebase... found src/auth/oauth.ts implementing OAuth flow
2542
+
2543
+ Checking add-jwt:
2544
+ - Delta adds "JWT Token Handling" requirement
2545
+ - Searching codebase... no JWT implementation found
2546
+
2547
+ Resolution: Only add-oauth is implemented. Will sync add-oauth specs only.
2548
+ \`\`\`
2549
+
2550
+ 示例 2:两者均实现
2551
+ \`\`\`
2552
+ Conflict: specs/api/spec.md touched by [add-rest-api, add-graphql]
2553
+
2554
+ Checking add-rest-api (created 2026-01-10):
2555
+ - Delta adds "REST Endpoints" requirement
2556
+ - Searching codebase... found src/api/rest.ts
2557
+
2558
+ Checking add-graphql (created 2026-01-15):
2559
+ - Delta adds "GraphQL Schema" requirement
2560
+ - Searching codebase... found src/api/graphql.ts
2561
+
2562
+ Resolution: Both implemented. Will apply add-rest-api specs first,
2563
+ then add-graphql specs (chronological order, newer takes precedence).
2564
+ \`\`\`
2565
+
2566
+ **成功时输出**
2567
+
2568
+ \`\`\`
2569
+ ## Bulk Archive Complete
2570
+
2571
+ Archived N changes:
2572
+ - <change-1> -> archive/YYYY-MM-DD-<change-1>/
2573
+ - <change-2> -> archive/YYYY-MM-DD-<change-2>/
2574
+
2575
+ Spec sync summary:
2576
+ - N delta specs synced to main specs
2577
+ - No conflicts (or: M conflicts resolved)
2578
+ \`\`\`
2579
+
2580
+ **部分成功时输出**
2581
+
2582
+ \`\`\`
2583
+ ## Bulk Archive Complete (partial)
2584
+
2585
+ Archived N changes:
2586
+ - <change-1> -> archive/YYYY-MM-DD-<change-1>/
2587
+
2588
+ Skipped M changes:
2589
+ - <change-2> (user chose not to archive incomplete)
2590
+
2591
+ Failed K changes:
2592
+ - <change-3>: Archive directory already exists
2593
+ \`\`\`
2594
+
2595
+ **无可归档变更时输出**
2596
+
2597
+ \`\`\`
2598
+ ## No Changes to Archive
2599
+
2600
+ No active changes found. Use \`/opsx:new\` to create a new change.
2601
+ \`\`\`
2602
+
2603
+ **约束**
2604
+ - 允许选择任意数量的变更(1+ 即可,2+ 常见)
2605
+ - 必须提示选择,禁止自动选择
2606
+ - 尽早检测规范冲突并通过代码库解决
2607
+ - 若两个变更都已实现,按时间顺序应用规范
2608
+ - 仅在缺少实现时跳过规范同步(并警告)
2609
+ - 确认前展示清晰的逐变更状态
2610
+ - 整个批次只做一次确认
2611
+ - 跟踪并汇报所有结果(成功/跳过/失败)
2612
+ - 移动归档时保留 .openspec.yaml
2613
+ - 归档目标使用当前日期:YYYY-MM-DD-<name>
2614
+ - 若归档目标已存在,该变更失败但继续处理其他`
2615
+ };
2616
+ }
2617
+ /**
2618
+ * Template for /opsx:verify slash command
2619
+ */
2620
+ export function getOpsxVerifyCommandTemplate() {
2621
+ return {
2622
+ name: 'OPSX: Verify',
2623
+ description: '归档前验证实现是否与变更工件匹配',
2624
+ category: 'Workflow',
2625
+ tags: ['workflow', 'verify', 'experimental'],
2626
+ content: `验证实现是否与变更工件(specs、tasks、design)一致。
2627
+
2628
+ **输入**:可选在 \`/opsx:verify\` 后指定变更名称(例如 \`/opsx:verify add-auth\`)。若省略,先从对话上下文推断;如含糊或有歧义,必须提示选择可用变更。
2629
+
2630
+ **步骤**
2631
+
2632
+ 1. **未提供变更名称时,提示选择**
2633
+
2634
+ 运行 \`openspec list --json\` 获取可用变更,并使用 **AskUserQuestion tool** 让用户选择。
2635
+
2636
+ 仅展示包含实现任务的变更(存在 tasks 工件)。
2637
+ 如可用,展示每个变更使用的 schema。
2638
+ 对未完成任务的变更标记为 "(In Progress)"。
2639
+
2640
+ **IMPORTANT**: 不要猜测或自动选择变更,必须由用户选择。
2641
+
2642
+ 2. **检查状态以了解 schema**
2643
+ \`\`\`bash
2644
+ openspec status --change "<name>" --json
2645
+ \`\`\`
2646
+ 解析 JSON 以了解:
2647
+ - \`schemaName\`: 使用的工作流(例如 "spec-driven"、"tdd")
2648
+ - 该变更存在哪些工件
2649
+
2650
+ 3. **获取变更目录并加载工件**
2651
+
2652
+ \`\`\`bash
2653
+ openspec instructions apply --change "<name>" --json
2654
+ \`\`\`
2655
+
2656
+ 该命令返回变更目录和上下文文件。读取 \`contextFiles\` 中的所有可用工件。
2657
+
2658
+ 4. **初始化验证报告结构**
2659
+
2660
+ 构建包含三个维度的报告结构:
2661
+ - **Completeness**:跟踪任务与规范覆盖
2662
+ - **Correctness**:跟踪需求实现与场景覆盖
2663
+ - **Coherence**:跟踪设计遵循与模式一致性
2664
+
2665
+ 每个维度可能出现 CRITICAL、WARNING 或 SUGGESTION 问题。
2666
+
2667
+ 5. **验证 Completeness**
2668
+
2669
+ **任务完成情况**:
2670
+ - 若 contextFiles 中存在 tasks.md,读取它
2671
+ - 解析复选框:\`- [ ]\`(未完成)与 \`- [x]\`(完成)
2672
+ - 统计完成数量与总数
2673
+ - 若存在未完成任务:
2674
+ - 为每个未完成任务添加 CRITICAL 问题
2675
+ - 建议语:"Complete task: <description>" 或 "Mark as done if already implemented"
2676
+
2677
+ **规范覆盖**:
2678
+ - 若 \`openspec/changes/<name>/specs/\` 存在增量规范:
2679
+ - 提取所有需求(以 "### Requirement:" 标记)
2680
+ - 对每个需求:
2681
+ - 在代码库中搜索相关关键词
2682
+ - 评估是否存在实现迹象
2683
+ - 若需求疑似未实现:
2684
+ - 添加 CRITICAL 问题:"未找到需求实现:<requirement name>"
2685
+ - 建议语:"实现需求 X:<description>"
2686
+
2687
+ 6. **验证 Correctness**
2688
+
2689
+ **需求实现映射**:
2690
+ - 对每个增量规范需求:
2691
+ - 搜索代码库中的实现证据
2692
+ - 若找到,记录文件路径与行范围
2693
+ - 评估实现是否符合需求意图
2694
+ - 若发现偏差:
2695
+ - 添加 WARNING:"Implementation may diverge from spec: <details>"
2696
+ - 建议语:"Review <file>:<lines> against requirement X"
2697
+
2698
+ **场景覆盖**:
2699
+ - 针对增量规范中的每个场景(以 "#### Scenario:" 标记):
2700
+ - 检查代码中是否处理了场景条件
2701
+ - 检查是否有覆盖该场景的测试
2702
+ - 若场景疑似未覆盖:
2703
+ - 添加 WARNING:"场景未覆盖:<scenario name>"
2704
+ - 建议语:"为场景补充测试或实现:<description>"
2705
+
2706
+ 7. **验证 Coherence**
2707
+
2708
+ **设计遵循**:
2709
+ - 若 contextFiles 中存在 design.md:
2710
+ - 提取关键决策(查找 "Decision:"、"Approach:"、"Architecture:" 等部分)
2711
+ - 验证实现是否遵循这些决策
2712
+ - 若发现矛盾:
2713
+ - 添加 WARNING:"设计决策未遵循:<decision>"
2714
+ - 建议语:"更新实现或修订 design.md 以符合现实"
2715
+ - 若不存在 design.md:跳过设计遵循检查,并注明 "无 design.md 可供校验"
2716
+
2717
+ **代码模式一致性**:
2718
+ - 审查新代码是否符合项目模式
2719
+ - 检查文件命名、目录结构、编码风格
2720
+ - 若偏差显著:
2721
+ - 添加 SUGGESTION:"代码模式偏离:<details>"
2722
+ - 建议语:"建议遵循项目模式:<example>"
2723
+
2724
+ 8. **生成验证报告**
2725
+
2726
+ **总结记分卡**:
2727
+ \`\`\`
2728
+ ## Verification Report: <change-name>
2729
+
2730
+ ### Summary
2731
+ | Dimension | Status |
2732
+ |--------------|------------------|
2733
+ | Completeness | X/Y tasks, N reqs|
2734
+ | Correctness | M/N reqs covered |
2735
+ | Coherence | Followed/Issues |
2736
+ \`\`\`
2737
+
2738
+ **按优先级列出问题**:
2739
+
2740
+ 1. **CRITICAL**(归档前必须修复):
2741
+ - 未完成任务
2742
+ - 需求实现缺失
2743
+ - 每条都有具体可执行的建议
2744
+
2745
+ 2. **WARNING**(应修复):
2746
+ - 规范/设计偏差
2747
+ - 场景覆盖缺失
2748
+ - 每条都有明确建议
2749
+
2750
+ 3. **SUGGESTION**(可优化):
2751
+ - 模式不一致
2752
+ - 轻微改进
2753
+ - 每条都有明确建议
2754
+
2755
+ **最终评估**:
2756
+ - 若存在 CRITICAL:"发现 X 个关键问题。归档前需修复。"
2757
+ - 若仅有 WARNING:"无关键问题。仍有 Y 个警告需考虑。可归档(附改进建议)。"
2758
+ - 若全部通过:"所有检查通过。可归档。"
2759
+
2760
+ **验证启发式**
2761
+
2762
+ - **Completeness**:关注客观清单项(复选框、需求列表)
2763
+ - **Correctness**:使用关键词搜索、路径分析、合理推断——不要求完美确定性
2764
+ - **Coherence**:关注明显不一致,不要纠结风格细节
2765
+ - **False Positives**:不确定时,优先 SUGGESTION,其次 WARNING,再到 CRITICAL
2766
+ - **Actionability**:每个问题必须有具体建议,必要时包含文件/行引用
2767
+
2768
+ **降级策略**
2769
+
2770
+ - 仅有 tasks.md:仅验证任务完成,跳过规范/设计
2771
+ - 有 tasks + specs:验证完整性与正确性,跳过设计
2772
+ - 全量工件:验证三个维度
2773
+ - 总是说明跳过了哪些检查以及原因
2774
+
2775
+ **输出格式**
2776
+
2777
+ 使用清晰的 markdown:
2778
+ - 汇总记分卡表格
2779
+ - 问题分组列表(CRITICAL/WARNING/SUGGESTION)
2780
+ - 代码引用格式:\`file.ts:123\`
2781
+ - 具体、可执行的建议
2782
+ - 避免模糊措辞如 "consider reviewing"`
2783
+ };
2784
+ }
2785
+ /**
2786
+ * Template for feedback skill
2787
+ * For collecting and submitting user feedback with context enrichment
2788
+ */
2789
+ export function getFeedbackSkillTemplate() {
2790
+ return {
2791
+ name: 'feedback',
2792
+ description: '收集并提交 OpenSpec 用户反馈,包含上下文补充与匿名化处理。',
2793
+ instructions: `帮助用户提交 OpenSpec 反馈。
2794
+
2795
+ **目标**:引导用户收集、补充并提交反馈,同时通过匿名化确保隐私。
2796
+
2797
+ **流程**
2798
+
2799
+ 1. **从对话中收集上下文**
2800
+ - 回顾近期对话内容
2801
+ - 识别正在进行的任务
2802
+ - 记录有效或不佳之处
2803
+ - 捕捉具体摩擦点或表扬
2804
+
2805
+ 2. **撰写补充后的反馈**
2806
+ - 创建清晰的标题(单句,不需要 "Feedback:" 前缀)
2807
+ - 正文需包含:
2808
+ - 用户想做什么
2809
+ - 实际发生了什么(好或不好)
2810
+ - 对话中的相关上下文
2811
+ - 具体建议或诉求
2812
+
2813
+ 3. **匿名化敏感信息**
2814
+ - 将文件路径替换为 \`<path>\` 或泛化描述
2815
+ - 将 API key、token、secret 替换为 \`<redacted>\`
2816
+ - 将公司/组织名称替换为 \`<company>\`
2817
+ - 将个人姓名替换为 \`<user>\`
2818
+ - 将特定 URL 替换为 \`<url>\`(若非公开/必要)
2819
+ - 保留有助于理解问题的技术细节
2820
+
2821
+ 4. **展示草稿并请求确认**
2822
+ - 将完整草稿展示给用户
2823
+ - 清晰呈现标题与正文
2824
+ - 提交前请求明确确认
2825
+ - 允许用户要求修改
2826
+
2827
+ 5. **确认后提交**
2828
+ - 使用 \`openspec feedback\` 命令提交
2829
+ - 格式:\`openspec feedback "title" --body "body content"\`
2830
+ - 该命令会自动附加元数据(版本、平台、时间戳)
2831
+
2832
+ **示例草稿**
2833
+
2834
+ \`\`\`
2835
+ Title: Error handling in artifact workflow needs improvement
2836
+
2837
+ Body:
2838
+ I was working on creating a new change and encountered an issue with
2839
+ the artifact workflow. When I tried to continue after creating the
2840
+ proposal, the system didn't clearly indicate that I needed to complete
2841
+ the specs first.
2842
+
2843
+ Suggestion: Add clearer error messages that explain dependency chains
2844
+ in the artifact workflow. Something like "Cannot create design.md
2845
+ because specs are not complete (0/2 done)."
2846
+
2847
+ Context: Using the spec-driven schema with <path>/my-project
2848
+ \`\`\`
2849
+
2850
+ **匿名化示例**
2851
+
2852
+ Before:
2853
+ \`\`\`
2854
+ Working on /Users/john/mycompany/auth-service/src/oauth.ts
2855
+ Failed with API key: sk_live_abc123xyz
2856
+ Working at Acme Corp
2857
+ \`\`\`
2858
+
2859
+ After:
2860
+ \`\`\`
2861
+ Working on <path>/oauth.ts
2862
+ Failed with API key: <redacted>
2863
+ Working at <company>
2864
+ \`\`\`
2865
+
2866
+ **约束**
2867
+
2868
+ - 必须在提交前展示完整草稿
2869
+ - 必须请求明确确认
2870
+ - 必须匿名化敏感信息
2871
+ - 允许用户在提交前修改草稿
2872
+ - 未经用户确认不得提交
2873
+ - 应包含相关技术上下文
2874
+ - 保留对话中的关键洞见
2875
+
2876
+ **需要用户确认**
2877
+
2878
+ 始终提问:
2879
+ \`\`\`
2880
+ Here's the feedback I've drafted:
2881
+
2882
+ Title: [title]
2883
+
2884
+ Body:
2885
+ [body]
2886
+
2887
+ Does this look good? I can modify it if you'd like, or submit it as-is.
2888
+ \`\`\`
2889
+
2890
+ 仅在用户确认后继续提交。`
2891
+ };
2892
+ }
2893
+ //# sourceMappingURL=skill-templates.js.map