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.
- package/LICENSE +22 -0
- package/README.md +153 -0
- package/bin/openspec.js +3 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +480 -0
- package/dist/commands/change.d.ts +35 -0
- package/dist/commands/change.js +277 -0
- package/dist/commands/completion.d.ts +72 -0
- package/dist/commands/completion.js +257 -0
- package/dist/commands/config.d.ts +8 -0
- package/dist/commands/config.js +198 -0
- package/dist/commands/feedback.d.ts +9 -0
- package/dist/commands/feedback.js +183 -0
- package/dist/commands/schema.d.ts +6 -0
- package/dist/commands/schema.js +869 -0
- package/dist/commands/show.d.ts +14 -0
- package/dist/commands/show.js +132 -0
- package/dist/commands/spec.d.ts +15 -0
- package/dist/commands/spec.js +225 -0
- package/dist/commands/validate.d.ts +24 -0
- package/dist/commands/validate.js +294 -0
- package/dist/commands/workflow/index.d.ts +17 -0
- package/dist/commands/workflow/index.js +12 -0
- package/dist/commands/workflow/instructions.d.ts +29 -0
- package/dist/commands/workflow/instructions.js +381 -0
- package/dist/commands/workflow/new-change.d.ts +11 -0
- package/dist/commands/workflow/new-change.js +44 -0
- package/dist/commands/workflow/schemas.d.ts +10 -0
- package/dist/commands/workflow/schemas.js +34 -0
- package/dist/commands/workflow/shared.d.ts +52 -0
- package/dist/commands/workflow/shared.js +111 -0
- package/dist/commands/workflow/status.d.ts +14 -0
- package/dist/commands/workflow/status.js +58 -0
- package/dist/commands/workflow/templates.d.ts +16 -0
- package/dist/commands/workflow/templates.js +68 -0
- package/dist/core/archive.d.ts +11 -0
- package/dist/core/archive.js +280 -0
- package/dist/core/artifact-graph/graph.d.ts +56 -0
- package/dist/core/artifact-graph/graph.js +141 -0
- package/dist/core/artifact-graph/index.d.ts +7 -0
- package/dist/core/artifact-graph/index.js +13 -0
- package/dist/core/artifact-graph/instruction-loader.d.ts +143 -0
- package/dist/core/artifact-graph/instruction-loader.js +214 -0
- package/dist/core/artifact-graph/resolver.d.ts +81 -0
- package/dist/core/artifact-graph/resolver.js +257 -0
- package/dist/core/artifact-graph/schema.d.ts +13 -0
- package/dist/core/artifact-graph/schema.js +108 -0
- package/dist/core/artifact-graph/state.d.ts +12 -0
- package/dist/core/artifact-graph/state.js +54 -0
- package/dist/core/artifact-graph/types.d.ts +45 -0
- package/dist/core/artifact-graph/types.js +43 -0
- package/dist/core/command-generation/adapters/amazon-q.d.ts +13 -0
- package/dist/core/command-generation/adapters/amazon-q.js +26 -0
- package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
- package/dist/core/command-generation/adapters/antigravity.js +26 -0
- package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
- package/dist/core/command-generation/adapters/auggie.js +27 -0
- package/dist/core/command-generation/adapters/claude.d.ts +13 -0
- package/dist/core/command-generation/adapters/claude.js +50 -0
- package/dist/core/command-generation/adapters/cline.d.ts +14 -0
- package/dist/core/command-generation/adapters/cline.js +27 -0
- package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
- package/dist/core/command-generation/adapters/codebuddy.js +28 -0
- package/dist/core/command-generation/adapters/codex.d.ts +13 -0
- package/dist/core/command-generation/adapters/codex.js +27 -0
- package/dist/core/command-generation/adapters/continue.d.ts +13 -0
- package/dist/core/command-generation/adapters/continue.js +28 -0
- package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
- package/dist/core/command-generation/adapters/costrict.js +27 -0
- package/dist/core/command-generation/adapters/crush.d.ts +13 -0
- package/dist/core/command-generation/adapters/crush.js +30 -0
- package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
- package/dist/core/command-generation/adapters/cursor.js +44 -0
- package/dist/core/command-generation/adapters/factory.d.ts +13 -0
- package/dist/core/command-generation/adapters/factory.js +27 -0
- package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
- package/dist/core/command-generation/adapters/gemini.js +26 -0
- package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
- package/dist/core/command-generation/adapters/github-copilot.js +26 -0
- package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
- package/dist/core/command-generation/adapters/iflow.js +29 -0
- package/dist/core/command-generation/adapters/index.d.ts +27 -0
- package/dist/core/command-generation/adapters/index.js +27 -0
- package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
- package/dist/core/command-generation/adapters/kilocode.js +23 -0
- package/dist/core/command-generation/adapters/opencode.d.ts +13 -0
- package/dist/core/command-generation/adapters/opencode.js +26 -0
- package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
- package/dist/core/command-generation/adapters/qoder.js +30 -0
- package/dist/core/command-generation/adapters/qwen.d.ts +13 -0
- package/dist/core/command-generation/adapters/qwen.js +26 -0
- package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
- package/dist/core/command-generation/adapters/roocode.js +27 -0
- package/dist/core/command-generation/adapters/windsurf.d.ts +14 -0
- package/dist/core/command-generation/adapters/windsurf.js +51 -0
- package/dist/core/command-generation/generator.d.ts +21 -0
- package/dist/core/command-generation/generator.js +27 -0
- package/dist/core/command-generation/index.d.ts +22 -0
- package/dist/core/command-generation/index.js +24 -0
- package/dist/core/command-generation/registry.d.ts +36 -0
- package/dist/core/command-generation/registry.js +88 -0
- package/dist/core/command-generation/types.d.ts +55 -0
- package/dist/core/command-generation/types.js +8 -0
- package/dist/core/completions/command-registry.d.ts +7 -0
- package/dist/core/completions/command-registry.js +456 -0
- package/dist/core/completions/completion-provider.d.ts +60 -0
- package/dist/core/completions/completion-provider.js +102 -0
- package/dist/core/completions/factory.d.ts +64 -0
- package/dist/core/completions/factory.js +75 -0
- package/dist/core/completions/generators/bash-generator.d.ts +32 -0
- package/dist/core/completions/generators/bash-generator.js +174 -0
- package/dist/core/completions/generators/fish-generator.d.ts +32 -0
- package/dist/core/completions/generators/fish-generator.js +157 -0
- package/dist/core/completions/generators/powershell-generator.d.ts +33 -0
- package/dist/core/completions/generators/powershell-generator.js +207 -0
- package/dist/core/completions/generators/zsh-generator.d.ts +44 -0
- package/dist/core/completions/generators/zsh-generator.js +250 -0
- package/dist/core/completions/installers/bash-installer.d.ts +87 -0
- package/dist/core/completions/installers/bash-installer.js +318 -0
- package/dist/core/completions/installers/fish-installer.d.ts +43 -0
- package/dist/core/completions/installers/fish-installer.js +143 -0
- package/dist/core/completions/installers/powershell-installer.d.ts +88 -0
- package/dist/core/completions/installers/powershell-installer.js +327 -0
- package/dist/core/completions/installers/zsh-installer.d.ts +125 -0
- package/dist/core/completions/installers/zsh-installer.js +449 -0
- package/dist/core/completions/templates/bash-templates.d.ts +6 -0
- package/dist/core/completions/templates/bash-templates.js +24 -0
- package/dist/core/completions/templates/fish-templates.d.ts +7 -0
- package/dist/core/completions/templates/fish-templates.js +39 -0
- package/dist/core/completions/templates/powershell-templates.d.ts +6 -0
- package/dist/core/completions/templates/powershell-templates.js +25 -0
- package/dist/core/completions/templates/zsh-templates.d.ts +6 -0
- package/dist/core/completions/templates/zsh-templates.js +36 -0
- package/dist/core/completions/types.d.ts +79 -0
- package/dist/core/completions/types.js +2 -0
- package/dist/core/config-prompts.d.ts +9 -0
- package/dist/core/config-prompts.js +34 -0
- package/dist/core/config-schema.d.ts +76 -0
- package/dist/core/config-schema.js +200 -0
- package/dist/core/config.d.ts +17 -0
- package/dist/core/config.js +30 -0
- package/dist/core/converters/json-converter.d.ts +6 -0
- package/dist/core/converters/json-converter.js +51 -0
- package/dist/core/global-config.d.ts +39 -0
- package/dist/core/global-config.js +115 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +3 -0
- package/dist/core/init.d.ts +32 -0
- package/dist/core/init.js +433 -0
- package/dist/core/legacy-cleanup.d.ts +162 -0
- package/dist/core/legacy-cleanup.js +501 -0
- package/dist/core/list.d.ts +9 -0
- package/dist/core/list.js +171 -0
- package/dist/core/parsers/change-parser.d.ts +13 -0
- package/dist/core/parsers/change-parser.js +193 -0
- package/dist/core/parsers/markdown-parser.d.ts +22 -0
- package/dist/core/parsers/markdown-parser.js +187 -0
- package/dist/core/parsers/requirement-blocks.d.ts +37 -0
- package/dist/core/parsers/requirement-blocks.js +201 -0
- package/dist/core/project-config.d.ts +64 -0
- package/dist/core/project-config.js +223 -0
- package/dist/core/schemas/base.schema.d.ts +13 -0
- package/dist/core/schemas/base.schema.js +13 -0
- package/dist/core/schemas/change.schema.d.ts +73 -0
- package/dist/core/schemas/change.schema.js +31 -0
- package/dist/core/schemas/index.d.ts +4 -0
- package/dist/core/schemas/index.js +4 -0
- package/dist/core/schemas/spec.schema.d.ts +18 -0
- package/dist/core/schemas/spec.schema.js +15 -0
- package/dist/core/shared/index.d.ts +8 -0
- package/dist/core/shared/index.js +8 -0
- package/dist/core/shared/skill-generation.d.ts +41 -0
- package/dist/core/shared/skill-generation.js +74 -0
- package/dist/core/shared/tool-detection.d.ts +66 -0
- package/dist/core/shared/tool-detection.js +140 -0
- package/dist/core/specs-apply.d.ts +73 -0
- package/dist/core/specs-apply.js +384 -0
- package/dist/core/styles/palette.d.ts +7 -0
- package/dist/core/styles/palette.js +8 -0
- package/dist/core/templates/index.d.ts +8 -0
- package/dist/core/templates/index.js +9 -0
- package/dist/core/templates/skill-templates.d.ts +112 -0
- package/dist/core/templates/skill-templates.js +2893 -0
- package/dist/core/update.d.ts +42 -0
- package/dist/core/update.js +306 -0
- package/dist/core/validation/constants.d.ts +34 -0
- package/dist/core/validation/constants.js +40 -0
- package/dist/core/validation/types.d.ts +18 -0
- package/dist/core/validation/types.js +2 -0
- package/dist/core/validation/validator.d.ts +33 -0
- package/dist/core/validation/validator.js +409 -0
- package/dist/core/view.d.ts +8 -0
- package/dist/core/view.js +168 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/prompts/searchable-multi-select.d.ts +27 -0
- package/dist/prompts/searchable-multi-select.js +149 -0
- package/dist/telemetry/config.d.ts +32 -0
- package/dist/telemetry/config.js +68 -0
- package/dist/telemetry/index.d.ts +31 -0
- package/dist/telemetry/index.js +145 -0
- package/dist/ui/ascii-patterns.d.ts +16 -0
- package/dist/ui/ascii-patterns.js +133 -0
- package/dist/ui/welcome-screen.d.ts +10 -0
- package/dist/ui/welcome-screen.js +146 -0
- package/dist/utils/change-metadata.d.ts +51 -0
- package/dist/utils/change-metadata.js +147 -0
- package/dist/utils/change-utils.d.ts +62 -0
- package/dist/utils/change-utils.js +121 -0
- package/dist/utils/file-system.d.ts +36 -0
- package/dist/utils/file-system.js +281 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/interactive.d.ts +18 -0
- package/dist/utils/interactive.js +21 -0
- package/dist/utils/item-discovery.d.ts +4 -0
- package/dist/utils/item-discovery.js +72 -0
- package/dist/utils/match.d.ts +3 -0
- package/dist/utils/match.js +22 -0
- package/dist/utils/shell-detection.d.ts +20 -0
- package/dist/utils/shell-detection.js +41 -0
- package/dist/utils/task-progress.d.ts +8 -0
- package/dist/utils/task-progress.js +36 -0
- package/package.json +84 -0
- package/schemas/spec-driven/schema.yaml +148 -0
- package/schemas/spec-driven/templates/design.md +19 -0
- package/schemas/spec-driven/templates/proposal.md +23 -0
- package/schemas/spec-driven/templates/spec.md +8 -0
- package/schemas/spec-driven/templates/tasks.md +9 -0
- package/schemas/tdd/schema.yaml +213 -0
- package/schemas/tdd/templates/docs.md +15 -0
- package/schemas/tdd/templates/implementation.md +11 -0
- package/schemas/tdd/templates/spec.md +11 -0
- package/schemas/tdd/templates/test.md +11 -0
- 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
|