specops 0.2.3 → 0.2.4
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/.opencode/agent/demand-analyst.md +69 -18
- package/.opencode/agent/verifier.md +231 -0
- package/.opencode/skills/brainstorming/SKILL.md +105 -0
- package/.opencode/skills/demand-analysis/SKILL.md +261 -47
- package/.opencode/skills/dispatching-parallel-agents/SKILL.md +180 -0
- package/.opencode/skills/executing-plans/SKILL.md +90 -0
- package/.opencode/skills/finishing-a-development-branch/SKILL.md +222 -0
- package/.opencode/skills/receiving-code-review/SKILL.md +213 -0
- package/.opencode/skills/repo-clone-analyze/SKILL.md +371 -0
- package/.opencode/skills/requesting-code-review/SKILL.md +105 -0
- package/.opencode/skills/requesting-code-review/code-reviewer.md +146 -0
- package/.opencode/skills/subagent-driven-development/SKILL.md +242 -0
- package/.opencode/skills/subagent-driven-development/code-quality-reviewer-prompt.md +20 -0
- package/.opencode/skills/subagent-driven-development/implementer-prompt.md +78 -0
- package/.opencode/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/.opencode/skills/systematic-debugging/SKILL.md +296 -0
- package/.opencode/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/.opencode/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/.opencode/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/.opencode/skills/test-driven-development/SKILL.md +399 -0
- package/.opencode/skills/test-driven-development/testing-anti-patterns.md +299 -0
- package/.opencode/skills/using-git-worktrees/SKILL.md +218 -0
- package/.opencode/skills/using-superpowers/SKILL.md +99 -0
- package/.opencode/skills/verification-before-completion/SKILL.md +150 -0
- package/.opencode/skills/writing-plans/SKILL.md +123 -0
- package/.opencode/skills/writing-skills/SKILL.md +654 -0
- package/dist/__e2e__/01-state-engine.e2e.test.js +1 -1
- package/dist/acceptance/lazyDetector.js +1 -1
- package/dist/acceptance/lazyDetector.test.js +1 -1
- package/dist/acceptance/reporter.js +1 -1
- package/dist/acceptance/reporter.test.js +1 -1
- package/dist/acceptance/runner.js +1 -1
- package/dist/acceptance/runner.test.js +1 -1
- package/dist/cli.js +1 -1
- package/dist/context/index.js +1 -1
- package/dist/context/promptTemplate.js +1 -1
- package/dist/context/promptTemplate.test.js +1 -1
- package/dist/context/techContextLoader.js +1 -1
- package/dist/context/techContextLoader.test.js +1 -1
- package/dist/engine.js +1 -1
- package/dist/evolution/distiller.js +1 -1
- package/dist/evolution/index.js +1 -1
- package/dist/evolution/memoryGraph.js +1 -1
- package/dist/evolution/selector.js +1 -1
- package/dist/evolution/signals.js +1 -1
- package/dist/evolution/solidify.js +1 -1
- package/dist/evolution/store.js +1 -1
- package/dist/evolution/types.js +1 -1
- package/dist/init.js +1 -1
- package/dist/machines/agentMachine.js +1 -1
- package/dist/machines/agentMachine.test.js +1 -1
- package/dist/machines/supervisorMachine.js +1 -1
- package/dist/machines/supervisorMachine.test.js +1 -1
- package/dist/persistence/schema.js +1 -1
- package/dist/persistence/stateFile.js +1 -1
- package/dist/persistence/stateFile.test.js +1 -1
- package/dist/plugin-engine.js +1 -1
- package/dist/plugin.js +1 -1
- package/dist/types/index.js +1 -1
- package/dist/utils/id.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: using-git-worktrees
|
|
3
|
+
description: 开始需要与当前工作区隔离的功能开发时使用,或在执行实现计划前使用,创建带有智能目录选择和安全验证的隔离 git 工作树
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 使用 Git 工作树
|
|
7
|
+
|
|
8
|
+
## 概述
|
|
9
|
+
|
|
10
|
+
Git 工作树创建共享同一仓库的隔离工作区,允许同时在多个分支上工作而无需切换。
|
|
11
|
+
|
|
12
|
+
**核心原则:** 系统化目录选择 + 安全验证 = 可靠隔离。
|
|
13
|
+
|
|
14
|
+
**开始时宣布:** "我正在使用 using-git-worktrees skill 来设置隔离工作区。"
|
|
15
|
+
|
|
16
|
+
## 目录选择流程
|
|
17
|
+
|
|
18
|
+
按以下优先级顺序:
|
|
19
|
+
|
|
20
|
+
### 1. 检查现有目录
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# 按优先级检查
|
|
24
|
+
ls -d .worktrees 2>/dev/null # 首选(隐藏)
|
|
25
|
+
ls -d worktrees 2>/dev/null # 备选
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**如果找到:** 使用该目录。如果两个都存在,`.worktrees` 优先。
|
|
29
|
+
|
|
30
|
+
### 2. 检查 CLAUDE.md
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
grep -i "worktree.*director" CLAUDE.md 2>/dev/null
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**如果指定了偏好:** 直接使用,不用询问。
|
|
37
|
+
|
|
38
|
+
### 3. 询问用户
|
|
39
|
+
|
|
40
|
+
如果没有现有目录且 CLAUDE.md 中没有偏好:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
未找到工作树目录。应该在哪里创建工作树?
|
|
44
|
+
|
|
45
|
+
1. .worktrees/(项目本地,隐藏)
|
|
46
|
+
2. ~/.config/specops/worktrees/<项目名>/(全局位置)
|
|
47
|
+
|
|
48
|
+
你倾向哪个?
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 安全验证
|
|
52
|
+
|
|
53
|
+
### 项目本地目录(.worktrees 或 worktrees)
|
|
54
|
+
|
|
55
|
+
**创建工作树前必须验证目录被忽略:**
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# 检查目录是否被忽略(遵循本地、全局和系统 gitignore)
|
|
59
|
+
git check-ignore -q .worktrees 2>/dev/null || git check-ignore -q worktrees 2>/dev/null
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**如果未被忽略:**
|
|
63
|
+
|
|
64
|
+
按照"立即修复坏掉的东西"原则:
|
|
65
|
+
1. 在 .gitignore 中添加相应行
|
|
66
|
+
2. 提交变更
|
|
67
|
+
3. 继续创建工作树
|
|
68
|
+
|
|
69
|
+
**为什么关键:** 防止意外将工作树内容提交到仓库。
|
|
70
|
+
|
|
71
|
+
### 全局目录(~/.config/specops/worktrees)
|
|
72
|
+
|
|
73
|
+
不需要 .gitignore 验证,完全在项目之外。
|
|
74
|
+
|
|
75
|
+
## 创建步骤
|
|
76
|
+
|
|
77
|
+
### 1. 检测项目名称
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
project=$(basename "$(git rev-parse --show-toplevel)")
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 2. 创建工作树
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
# 确定完整路径
|
|
87
|
+
case $LOCATION in
|
|
88
|
+
.worktrees|worktrees)
|
|
89
|
+
path="$LOCATION/$BRANCH_NAME"
|
|
90
|
+
;;
|
|
91
|
+
~/.config/specops/worktrees/*)
|
|
92
|
+
path="~/.config/specops/worktrees/$project/$BRANCH_NAME"
|
|
93
|
+
;;
|
|
94
|
+
esac
|
|
95
|
+
|
|
96
|
+
# 创建工作树并新建分支
|
|
97
|
+
git worktree add "$path" -b "$BRANCH_NAME"
|
|
98
|
+
cd "$path"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 3. 运行项目设置
|
|
102
|
+
|
|
103
|
+
自动检测并运行相应的设置:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# Node.js
|
|
107
|
+
if [ -f package.json ]; then npm install; fi
|
|
108
|
+
|
|
109
|
+
# Rust
|
|
110
|
+
if [ -f Cargo.toml ]; then cargo build; fi
|
|
111
|
+
|
|
112
|
+
# Python
|
|
113
|
+
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
|
|
114
|
+
if [ -f pyproject.toml ]; then poetry install; fi
|
|
115
|
+
|
|
116
|
+
# Go
|
|
117
|
+
if [ -f go.mod ]; then go mod download; fi
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### 4. 验证干净基线
|
|
121
|
+
|
|
122
|
+
运行测试确保工作树起始状态干净:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
# 示例 - 使用项目对应的命令
|
|
126
|
+
npm test
|
|
127
|
+
cargo test
|
|
128
|
+
pytest
|
|
129
|
+
go test ./...
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**如果测试失败:** 报告失败,询问是否继续还是排查。
|
|
133
|
+
|
|
134
|
+
**如果测试通过:** 报告就绪。
|
|
135
|
+
|
|
136
|
+
### 5. 报告位置
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
工作树就绪,位于 <完整路径>
|
|
140
|
+
测试通过(<N> 个测试,0 个失败)
|
|
141
|
+
准备实现 <功能名称>
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## 快速参考
|
|
145
|
+
|
|
146
|
+
| 情况 | 操作 |
|
|
147
|
+
|------|------|
|
|
148
|
+
| `.worktrees/` 存在 | 使用它(验证已忽略) |
|
|
149
|
+
| `worktrees/` 存在 | 使用它(验证已忽略) |
|
|
150
|
+
| 两个都存在 | 使用 `.worktrees/` |
|
|
151
|
+
| 都不存在 | 检查 CLAUDE.md → 询问用户 |
|
|
152
|
+
| 目录未被忽略 | 添加到 .gitignore + 提交 |
|
|
153
|
+
| 基线测试失败 | 报告失败 + 询问 |
|
|
154
|
+
| 没有 package.json/Cargo.toml | 跳过依赖安装 |
|
|
155
|
+
|
|
156
|
+
## 常见错误
|
|
157
|
+
|
|
158
|
+
### 跳过忽略验证
|
|
159
|
+
|
|
160
|
+
- **问题:** 工作树内容被跟踪,污染 git status
|
|
161
|
+
- **修正:** 创建项目本地工作树前始终使用 `git check-ignore`
|
|
162
|
+
|
|
163
|
+
### 假设目录位置
|
|
164
|
+
|
|
165
|
+
- **问题:** 造成不一致,违反项目约定
|
|
166
|
+
- **修正:** 遵循优先级:现有 > CLAUDE.md > 询问
|
|
167
|
+
|
|
168
|
+
### 测试失败时继续
|
|
169
|
+
|
|
170
|
+
- **问题:** 无法区分新 bug 和已有问题
|
|
171
|
+
- **修正:** 报告失败,获得明确许可后再继续
|
|
172
|
+
|
|
173
|
+
### 硬编码设置命令
|
|
174
|
+
|
|
175
|
+
- **问题:** 在使用不同工具的项目上会坏
|
|
176
|
+
- **修正:** 从项目文件自动检测(package.json 等)
|
|
177
|
+
|
|
178
|
+
## 示例工作流
|
|
179
|
+
|
|
180
|
+
```
|
|
181
|
+
你:我正在使用 using-git-worktrees skill 来设置隔离工作区。
|
|
182
|
+
|
|
183
|
+
[检查 .worktrees/ - 存在]
|
|
184
|
+
[验证已忽略 - git check-ignore 确认 .worktrees/ 被忽略]
|
|
185
|
+
[创建工作树:git worktree add .worktrees/auth -b feature/auth]
|
|
186
|
+
[运行 npm install]
|
|
187
|
+
[运行 npm test - 47 个通过]
|
|
188
|
+
|
|
189
|
+
工作树就绪,位于 /Users/jesse/myproject/.worktrees/auth
|
|
190
|
+
测试通过(47 个测试,0 个失败)
|
|
191
|
+
准备实现 auth 功能
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## 红线
|
|
195
|
+
|
|
196
|
+
**绝对不要:**
|
|
197
|
+
- 不验证是否被忽略就创建工作树(项目本地)
|
|
198
|
+
- 跳过基线测试验证
|
|
199
|
+
- 测试失败时不询问就继续
|
|
200
|
+
- 位置不明确时假设目录位置
|
|
201
|
+
- 跳过 CLAUDE.md 检查
|
|
202
|
+
|
|
203
|
+
**始终:**
|
|
204
|
+
- 遵循目录优先级:现有 > CLAUDE.md > 询问
|
|
205
|
+
- 项目本地目录验证是否被忽略
|
|
206
|
+
- 自动检测并运行项目设置
|
|
207
|
+
- 验证干净的测试基线
|
|
208
|
+
|
|
209
|
+
## 集成
|
|
210
|
+
|
|
211
|
+
**被调用方:**
|
|
212
|
+
- **specops:brainstorming**(阶段 4)- 设计通过且要开始实现时必需
|
|
213
|
+
- **specops:subagent-driven-development** - 执行任何任务前必需
|
|
214
|
+
- **specops:executing-plans** - 执行任何任务前必需
|
|
215
|
+
- 任何需要隔离工作区的 skill
|
|
216
|
+
|
|
217
|
+
**配合使用:**
|
|
218
|
+
- **specops:finishing-a-development-branch** - 工作完成后清理必需
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: using-superpowers
|
|
3
|
+
description: "在开始任何对话时使用 - 建立如何查找和使用 skill,要求在任何响应(包括澄清问题)之前先调用 Skill 工具"
|
|
4
|
+
triggers:
|
|
5
|
+
- "开始对话"
|
|
6
|
+
- "新任务"
|
|
7
|
+
- "检查 skill"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
<EXTREMELY-IMPORTANT>
|
|
11
|
+
如果你认为哪怕只有 1% 的可能性某个 skill 适用于你正在做的事情,你绝对必须调用那个 skill。
|
|
12
|
+
|
|
13
|
+
如果某个 SKILL 适用于你的任务,你没有选择。你必须使用它。
|
|
14
|
+
|
|
15
|
+
这不可商量。这不是可选的。你不能给自己找理由跳过。
|
|
16
|
+
</EXTREMELY-IMPORTANT>
|
|
17
|
+
|
|
18
|
+
## 如何访问 Skill
|
|
19
|
+
|
|
20
|
+
**在 Claude Code 中:** 使用 `Skill` 工具。调用 skill 时,其内容会被加载并展示给你,直接按照它执行。永远不要用 Read 工具读取 skill 文件。
|
|
21
|
+
|
|
22
|
+
**在其他环境中:** 查看你所在平台的文档了解 skill 的加载方式。
|
|
23
|
+
|
|
24
|
+
# 使用 Skill
|
|
25
|
+
|
|
26
|
+
## 规则
|
|
27
|
+
|
|
28
|
+
**在任何响应或行动之前,先调用相关或被请求的 skill。** 哪怕只有 1% 的可能性某个 skill 适用,你也应该调用它来检查。如果调用后发现不适合当前情况,你不需要使用它。
|
|
29
|
+
|
|
30
|
+
```dot
|
|
31
|
+
digraph skill_flow {
|
|
32
|
+
"收到用户消息" [shape=doublecircle];
|
|
33
|
+
"即将进入规划模式?" [shape=doublecircle];
|
|
34
|
+
"已经做过头脑风暴?" [shape=diamond];
|
|
35
|
+
"调用 brainstorming skill" [shape=box];
|
|
36
|
+
"可能有 skill 适用?" [shape=diamond];
|
|
37
|
+
"调用 Skill 工具" [shape=box];
|
|
38
|
+
"宣布:'使用 [skill] 来 [目的]'" [shape=box];
|
|
39
|
+
"有检查清单?" [shape=diamond];
|
|
40
|
+
"为每项创建 TodoWrite 任务" [shape=box];
|
|
41
|
+
"严格按照 skill 执行" [shape=box];
|
|
42
|
+
"响应(包括澄清问题)" [shape=doublecircle];
|
|
43
|
+
|
|
44
|
+
"即将进入规划模式?" -> "已经做过头脑风暴?";
|
|
45
|
+
"已经做过头脑风暴?" -> "调用 brainstorming skill" [label="否"];
|
|
46
|
+
"已经做过头脑风暴?" -> "可能有 skill 适用?" [label="是"];
|
|
47
|
+
"调用 brainstorming skill" -> "可能有 skill 适用?";
|
|
48
|
+
|
|
49
|
+
"收到用户消息" -> "可能有 skill 适用?";
|
|
50
|
+
"可能有 skill 适用?" -> "调用 Skill 工具" [label="是,哪怕只有 1%"];
|
|
51
|
+
"可能有 skill 适用?" -> "响应(包括澄清问题)" [label="确定没有"];
|
|
52
|
+
"调用 Skill 工具" -> "宣布:'使用 [skill] 来 [目的]'";
|
|
53
|
+
"宣布:'使用 [skill] 来 [目的]'" -> "有检查清单?";
|
|
54
|
+
"有检查清单?" -> "为每项创建 TodoWrite 任务" [label="是"];
|
|
55
|
+
"有检查清单?" -> "严格按照 skill 执行" [label="否"];
|
|
56
|
+
"为每项创建 TodoWrite 任务" -> "严格按照 skill 执行";
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## 危险信号
|
|
61
|
+
|
|
62
|
+
这些想法意味着停下来。你在给自己找理由:
|
|
63
|
+
|
|
64
|
+
| 想法 | 现实 |
|
|
65
|
+
|------|------|
|
|
66
|
+
| "这只是个简单问题" | 问题也是任务。检查 skill。 |
|
|
67
|
+
| "我需要先了解更多上下文" | Skill 检查在澄清问题之前。 |
|
|
68
|
+
| "让我先看看代码库" | Skill 会告诉你怎么看。先检查。 |
|
|
69
|
+
| "我可以快速查一下 git/文件" | 文件缺少对话上下文。检查 skill。 |
|
|
70
|
+
| "让我先收集信息" | Skill 会告诉你怎么收集信息。 |
|
|
71
|
+
| "这不需要正式的 skill" | 如果 skill 存在,就用它。 |
|
|
72
|
+
| "我记得这个 skill" | Skill 会更新。读当前版本。 |
|
|
73
|
+
| "这不算一个任务" | 行动 = 任务。检查 skill。 |
|
|
74
|
+
| "这个 skill 太重了" | 简单的事情会变复杂。用它。 |
|
|
75
|
+
| "我先做这一件事" | 做任何事之前先检查。 |
|
|
76
|
+
| "这样做效率很高" | 没有纪律的行动浪费时间。Skill 能防止这种情况。 |
|
|
77
|
+
| "我知道那是什么意思" | 知道概念 ≠ 使用 skill。调用它。 |
|
|
78
|
+
|
|
79
|
+
## Skill 优先级
|
|
80
|
+
|
|
81
|
+
当多个 skill 可能适用时,按这个顺序:
|
|
82
|
+
|
|
83
|
+
1. **流程 skill 优先**(brainstorming、systematic-debugging)- 这些决定如何处理任务
|
|
84
|
+
2. **实现 skill 其次**(frontend-design、mcp-builder)- 这些指导执行
|
|
85
|
+
|
|
86
|
+
"来构建 X" → 先 brainstorming,然后进入 specops 需求分析流程。
|
|
87
|
+
"修复这个 bug" → 先 systematic-debugging,然后是领域相关的 skill。
|
|
88
|
+
|
|
89
|
+
## Skill 类型
|
|
90
|
+
|
|
91
|
+
**刚性**(TDD、debugging):严格遵循。不要为了适应而放弃纪律。
|
|
92
|
+
|
|
93
|
+
**柔性**(模式类):根据上下文调整原则。
|
|
94
|
+
|
|
95
|
+
Skill 本身会告诉你它属于哪种。
|
|
96
|
+
|
|
97
|
+
## 用户指令
|
|
98
|
+
|
|
99
|
+
指令说的是做什么,不是怎么做。"添加 X" 或 "修复 Y" 不意味着跳过工作流。
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: verification-before-completion
|
|
3
|
+
description: 在声称工作完成、修复成功或测试通过之前使用,在提交或创建 PR 之前,要求运行验证命令并确认输出后才能做出任何成功声明;证据先于断言,始终如此
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 完成前验证
|
|
7
|
+
|
|
8
|
+
## 概述
|
|
9
|
+
|
|
10
|
+
在没有验证的情况下声称工作完成,是不诚实,不是高效。
|
|
11
|
+
|
|
12
|
+
**核心原则:** 证据先于声明,始终如此。
|
|
13
|
+
|
|
14
|
+
**违反这条规则的字面意思就是违反这条规则的精神。**
|
|
15
|
+
|
|
16
|
+
## 铁律
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
没有新鲜的验证证据,就不能声称完成
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
如果你在这条消息中没有运行验证命令,你不能声称它通过了。
|
|
23
|
+
|
|
24
|
+
## 门控函数
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
在声称任何状态或表达满意之前:
|
|
28
|
+
|
|
29
|
+
1. 识别:什么命令能证明这个声明?
|
|
30
|
+
2. 运行:执行完整命令(新鲜的、完整的)
|
|
31
|
+
3. 阅读:完整输出,检查退出码,计算失败数
|
|
32
|
+
4. 验证:输出是否确认了声明?
|
|
33
|
+
- 如果否:用证据陈述实际状态
|
|
34
|
+
- 如果是:带着证据陈述声明
|
|
35
|
+
5. 然后才能:做出声明
|
|
36
|
+
|
|
37
|
+
跳过任何步骤 = 撒谎,不是验证
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 常见失败
|
|
41
|
+
|
|
42
|
+
| 声明 | 需要 | 不够 |
|
|
43
|
+
|------|------|------|
|
|
44
|
+
| 测试通过 | 测试命令输出:0 失败 | 之前的运行结果,"应该通过" |
|
|
45
|
+
| Linter 干净 | Linter 输出:0 错误 | 部分检查,推断 |
|
|
46
|
+
| 构建成功 | 构建命令:exit 0 | Linter 通过,日志看起来没问题 |
|
|
47
|
+
| Bug 修复了 | 测试原始症状:通过 | 代码改了,假设修好了 |
|
|
48
|
+
| 回归测试有效 | 红-绿循环已验证 | 测试通过了一次 |
|
|
49
|
+
| Agent 完成了 | VCS diff 显示变更 | Agent 报告"成功" |
|
|
50
|
+
| 需求满足 | 逐行检查清单 | 测试通过 |
|
|
51
|
+
| 验收通过 | specops 验收运行器:全部 PASS | 只跑了部分检查 |
|
|
52
|
+
|
|
53
|
+
## 危险信号 - 停下来
|
|
54
|
+
|
|
55
|
+
- 使用"应该"、"大概"、"看起来"
|
|
56
|
+
- 在验证之前表达满意("太好了!"、"完美!"、"搞定!"等)
|
|
57
|
+
- 准备在没有验证的情况下提交/推送/创建 PR
|
|
58
|
+
- 信任 agent 的成功报告
|
|
59
|
+
- 依赖部分验证
|
|
60
|
+
- 想着"就这一次"
|
|
61
|
+
- 累了想赶紧结束
|
|
62
|
+
- **任何暗示成功但没有运行验证的措辞**
|
|
63
|
+
|
|
64
|
+
## 合理化防御
|
|
65
|
+
|
|
66
|
+
| 借口 | 现实 |
|
|
67
|
+
|------|------|
|
|
68
|
+
| "现在应该能用了" | 运行验证 |
|
|
69
|
+
| "我很有信心" | 信心 ≠ 证据 |
|
|
70
|
+
| "就这一次" | 没有例外 |
|
|
71
|
+
| "Linter 通过了" | Linter ≠ 编译器 |
|
|
72
|
+
| "Agent 说成功了" | 独立验证 |
|
|
73
|
+
| "我累了" | 疲劳 ≠ 借口 |
|
|
74
|
+
| "部分检查够了" | 部分什么都证明不了 |
|
|
75
|
+
| "换个说法所以规则不适用" | 精神高于字面 |
|
|
76
|
+
|
|
77
|
+
## specops 验收集成
|
|
78
|
+
|
|
79
|
+
在 specops 工作流中,验收不只是运行测试:
|
|
80
|
+
|
|
81
|
+
1. **自动验收**:specops acceptance runner 串联 tsc + vitest + tech-guard + 偷懒检测
|
|
82
|
+
2. **E2E 验收**:验收 Agent 使用浏览器 MCP 走完业务流程
|
|
83
|
+
3. **人工验收**:UAT 清单逐项确认
|
|
84
|
+
|
|
85
|
+
每一项都必须有证据。不接受"应该通过了"。
|
|
86
|
+
|
|
87
|
+
## 关键模式
|
|
88
|
+
|
|
89
|
+
**测试:**
|
|
90
|
+
```
|
|
91
|
+
✅ [运行测试命令] [看到:34/34 通过] "所有测试通过"
|
|
92
|
+
❌ "现在应该通过了" / "看起来对了"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**回归测试(TDD 红-绿):**
|
|
96
|
+
```
|
|
97
|
+
✅ 写 → 运行(通过)→ 回退修复 → 运行(必须失败)→ 恢复 → 运行(通过)
|
|
98
|
+
❌ "我写了回归测试"(没有红-绿验证)
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**构建:**
|
|
102
|
+
```
|
|
103
|
+
✅ [运行构建] [看到:exit 0] "构建通过"
|
|
104
|
+
❌ "Linter 通过了"(linter 不检查编译)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**需求:**
|
|
108
|
+
```
|
|
109
|
+
✅ 重读计划 → 创建检查清单 → 逐项验证 → 报告差距或完成
|
|
110
|
+
❌ "测试通过了,阶段完成"
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**Agent 委派:**
|
|
114
|
+
```
|
|
115
|
+
✅ Agent 报告成功 → 检查 VCS diff → 验证变更 → 报告实际状态
|
|
116
|
+
❌ 信任 agent 报告
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## 为什么这很重要
|
|
120
|
+
|
|
121
|
+
来自 24 次失败记忆:
|
|
122
|
+
- 你的人类搭档说"我不信你" - 信任被打破
|
|
123
|
+
- 未定义的函数被发布 - 会崩溃
|
|
124
|
+
- 遗漏的需求被发布 - 功能不完整
|
|
125
|
+
- 在虚假完成上浪费时间 → 纠正 → 返工
|
|
126
|
+
- 违反了:"诚实是核心价值。如果你撒谎,你会被替换。"
|
|
127
|
+
|
|
128
|
+
## 何时应用
|
|
129
|
+
|
|
130
|
+
**始终在以下操作之前:**
|
|
131
|
+
- 任何形式的成功/完成声明
|
|
132
|
+
- 任何满意的表达
|
|
133
|
+
- 任何关于工作状态的正面陈述
|
|
134
|
+
- 提交、创建 PR、标记任务完成
|
|
135
|
+
- 进入下一个任务
|
|
136
|
+
- 委派给 agent
|
|
137
|
+
|
|
138
|
+
**规则适用于:**
|
|
139
|
+
- 精确措辞
|
|
140
|
+
- 释义和同义词
|
|
141
|
+
- 暗示成功
|
|
142
|
+
- 任何暗示完成/正确的沟通
|
|
143
|
+
|
|
144
|
+
## 底线
|
|
145
|
+
|
|
146
|
+
**验证没有捷径。**
|
|
147
|
+
|
|
148
|
+
运行命令。阅读输出。然后才能声称结果。
|
|
149
|
+
|
|
150
|
+
这是不可协商的。
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: writing-plans
|
|
3
|
+
description: "有规格或多步骤任务需求时使用,在接触代码之前"
|
|
4
|
+
triggers:
|
|
5
|
+
- "制定计划"
|
|
6
|
+
- "实现计划"
|
|
7
|
+
- "写实现方案"
|
|
8
|
+
- "规划任务"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# 编写实现计划
|
|
12
|
+
|
|
13
|
+
## 概述
|
|
14
|
+
|
|
15
|
+
编写全面的实现计划,假设工程师对我们的代码库零上下文、品味堪忧。记录他们需要知道的一切:每个任务要改哪些文件、代码、测试、可能需要查阅的文档、如何验证。把整个计划拆成小任务。DRY。YAGNI。TDD。频繁提交。
|
|
16
|
+
|
|
17
|
+
假设他们是熟练的开发者,但对我们的工具集和问题领域几乎一无所知。假设他们不太擅长测试设计。
|
|
18
|
+
|
|
19
|
+
**开始时宣布:** "我正在使用 writing-plans skill 来创建实现计划。"
|
|
20
|
+
|
|
21
|
+
**上下文:** 这应该在专用的 worktree 中运行(由 brainstorming skill 创建)。
|
|
22
|
+
|
|
23
|
+
**计划保存到:** `.specops/plans/YYYY-MM-DD-<功能名>.md`
|
|
24
|
+
|
|
25
|
+
## 小任务粒度
|
|
26
|
+
|
|
27
|
+
**每一步是一个动作(2-5 分钟):**
|
|
28
|
+
- "编写失败的测试" - 一步
|
|
29
|
+
- "运行测试确认它失败" - 一步
|
|
30
|
+
- "编写最少代码让测试通过" - 一步
|
|
31
|
+
- "运行测试确认它通过" - 一步
|
|
32
|
+
- "提交" - 一步
|
|
33
|
+
|
|
34
|
+
## 计划文档头部
|
|
35
|
+
|
|
36
|
+
**每个计划必须以这个头部开始:**
|
|
37
|
+
|
|
38
|
+
```markdown
|
|
39
|
+
# [功能名称] 实现计划
|
|
40
|
+
|
|
41
|
+
> **给 Claude 的指令:** 必须使用的子 SKILL:使用 specops:executing-plans 来逐任务实现此计划。
|
|
42
|
+
|
|
43
|
+
**目标:** [一句话描述这个计划要构建什么]
|
|
44
|
+
|
|
45
|
+
**架构:** [2-3 句话描述方案]
|
|
46
|
+
|
|
47
|
+
**技术栈:** [关键技术/库]
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 任务结构
|
|
53
|
+
|
|
54
|
+
````markdown
|
|
55
|
+
### 任务 N:[组件名称]
|
|
56
|
+
|
|
57
|
+
**文件:**
|
|
58
|
+
- 创建:`exact/path/to/file.py`
|
|
59
|
+
- 修改:`exact/path/to/existing.py:123-145`
|
|
60
|
+
- 测试:`tests/exact/path/to/test.py`
|
|
61
|
+
|
|
62
|
+
**步骤 1:编写失败的测试**
|
|
63
|
+
|
|
64
|
+
```python
|
|
65
|
+
def test_specific_behavior():
|
|
66
|
+
# 测试特定行为
|
|
67
|
+
result = function(input)
|
|
68
|
+
assert result == expected
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**步骤 2:运行测试确认它失败**
|
|
72
|
+
|
|
73
|
+
运行:`pytest tests/path/test.py::test_name -v`
|
|
74
|
+
预期:FAIL,报错 "function not defined"
|
|
75
|
+
|
|
76
|
+
**步骤 3:编写最少实现**
|
|
77
|
+
|
|
78
|
+
```python
|
|
79
|
+
def function(input):
|
|
80
|
+
# 最少实现让测试通过
|
|
81
|
+
return expected
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**步骤 4:运行测试确认它通过**
|
|
85
|
+
|
|
86
|
+
运行:`pytest tests/path/test.py::test_name -v`
|
|
87
|
+
预期:PASS
|
|
88
|
+
|
|
89
|
+
**步骤 5:提交**
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
git add tests/path/test.py src/path/file.py
|
|
93
|
+
git commit -m "feat: 添加特定功能"
|
|
94
|
+
```
|
|
95
|
+
````
|
|
96
|
+
|
|
97
|
+
## 注意事项
|
|
98
|
+
- 始终使用精确的文件路径
|
|
99
|
+
- 计划中包含完整代码(不是"添加验证"这种模糊描述)
|
|
100
|
+
- 精确的命令和预期输出
|
|
101
|
+
- 用 @ 语法引用相关 skill
|
|
102
|
+
- DRY、YAGNI、TDD、频繁提交
|
|
103
|
+
|
|
104
|
+
## 执行交接
|
|
105
|
+
|
|
106
|
+
保存计划后,提供执行选择:
|
|
107
|
+
|
|
108
|
+
**"计划已完成并保存到 `.specops/plans/<文件名>.md`。两种执行方式:**
|
|
109
|
+
|
|
110
|
+
**1. 子 Agent 驱动(当前会话)** - 每个任务分派一个新的子 Agent,任务间进行审查,快速迭代
|
|
111
|
+
|
|
112
|
+
**2. 并行会话(单独开)** - 在新会话中使用 executing-plans,分批执行带检查点
|
|
113
|
+
|
|
114
|
+
**选哪种?"**
|
|
115
|
+
|
|
116
|
+
**如果选择子 Agent 驱动:**
|
|
117
|
+
- **必须使用的子 SKILL:** 使用 specops:subagent-driven-development
|
|
118
|
+
- 留在当前会话
|
|
119
|
+
- 每个任务一个新子 Agent + 代码审查
|
|
120
|
+
|
|
121
|
+
**如果选择并行会话:**
|
|
122
|
+
- 引导用户在 worktree 中打开新会话
|
|
123
|
+
- **必须使用的子 SKILL:** 新会话使用 specops:executing-plans
|