specops 0.2.3 → 0.2.5
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 +393 -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,180 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dispatching-parallel-agents
|
|
3
|
+
description: 面对 2 个以上独立任务时使用,这些任务之间没有共享状态或顺序依赖
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 并行 Agent 调度
|
|
7
|
+
|
|
8
|
+
## 概述
|
|
9
|
+
|
|
10
|
+
当你有多个不相关的故障(不同的测试文件、不同的子系统、不同的 bug),逐个排查是浪费时间。每个排查都是独立的,可以并行进行。
|
|
11
|
+
|
|
12
|
+
**核心原则:** 每个独立问题域派发一个 agent。让它们并发工作。
|
|
13
|
+
|
|
14
|
+
## 何时使用
|
|
15
|
+
|
|
16
|
+
```dot
|
|
17
|
+
digraph when_to_use {
|
|
18
|
+
"多个故障?" [shape=diamond];
|
|
19
|
+
"它们独立吗?" [shape=diamond];
|
|
20
|
+
"单个 agent 排查全部" [shape=box];
|
|
21
|
+
"每个问题域一个 agent" [shape=box];
|
|
22
|
+
"能并行工作吗?" [shape=diamond];
|
|
23
|
+
"顺序 agent" [shape=box];
|
|
24
|
+
"并行调度" [shape=box];
|
|
25
|
+
|
|
26
|
+
"多个故障?" -> "它们独立吗?" [label="是"];
|
|
27
|
+
"它们独立吗?" -> "单个 agent 排查全部" [label="否 - 相关"];
|
|
28
|
+
"它们独立吗?" -> "能并行工作吗?" [label="是"];
|
|
29
|
+
"能并行工作吗?" -> "并行调度" [label="是"];
|
|
30
|
+
"能并行工作吗?" -> "顺序 agent" [label="否 - 共享状态"];
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**适用场景:**
|
|
35
|
+
- 3 个以上测试文件因不同根因失败
|
|
36
|
+
- 多个子系统独立出问题
|
|
37
|
+
- 每个问题无需其他问题的上下文即可理解
|
|
38
|
+
- 排查之间没有共享状态
|
|
39
|
+
|
|
40
|
+
**不适用场景:**
|
|
41
|
+
- 故障相关(修一个可能修好其他的)
|
|
42
|
+
- 需要理解完整系统状态
|
|
43
|
+
- agent 之间会互相干扰
|
|
44
|
+
|
|
45
|
+
## 模式
|
|
46
|
+
|
|
47
|
+
### 1. 识别独立域
|
|
48
|
+
|
|
49
|
+
按故障分组:
|
|
50
|
+
- 文件 A 测试:工具审批流程
|
|
51
|
+
- 文件 B 测试:批量完成行为
|
|
52
|
+
- 文件 C 测试:中止功能
|
|
53
|
+
|
|
54
|
+
每个域都是独立的,修复工具审批不会影响中止测试。
|
|
55
|
+
|
|
56
|
+
### 2. 创建聚焦的 Agent 任务
|
|
57
|
+
|
|
58
|
+
每个 agent 获得:
|
|
59
|
+
- **明确范围:** 一个测试文件或子系统
|
|
60
|
+
- **清晰目标:** 让这些测试通过
|
|
61
|
+
- **约束条件:** 不要修改其他代码
|
|
62
|
+
- **预期输出:** 发现和修复的摘要
|
|
63
|
+
|
|
64
|
+
### 3. 并行调度
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
// 在 opencode 环境中
|
|
68
|
+
task(run_in_background=true, prompt="修复 agent-tool-abort.test.ts 的失败")
|
|
69
|
+
task(run_in_background=true, prompt="修复 batch-completion-behavior.test.ts 的失败")
|
|
70
|
+
task(run_in_background=true, prompt="修复 tool-approval-race-conditions.test.ts 的失败")
|
|
71
|
+
// 三个并发运行
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 4. 审查与集成
|
|
75
|
+
|
|
76
|
+
agent 返回后:
|
|
77
|
+
- 阅读每个摘要
|
|
78
|
+
- 验证修复不冲突
|
|
79
|
+
- 运行完整测试套件
|
|
80
|
+
- 集成所有变更
|
|
81
|
+
|
|
82
|
+
## Agent 提示词结构
|
|
83
|
+
|
|
84
|
+
好的 agent 提示词应该:
|
|
85
|
+
1. **聚焦** - 一个清晰的问题域
|
|
86
|
+
2. **自包含** - 理解问题所需的所有上下文
|
|
87
|
+
3. **明确输出** - agent 应该返回什么?
|
|
88
|
+
|
|
89
|
+
```markdown
|
|
90
|
+
修复 src/agents/agent-tool-abort.test.ts 中的 3 个失败测试:
|
|
91
|
+
|
|
92
|
+
1. "should abort tool with partial output capture" - 期望消息中包含 'interrupted at'
|
|
93
|
+
2. "should handle mixed completed and aborted tools" - 快速工具被中止而非完成
|
|
94
|
+
3. "should properly track pendingToolCount" - 期望 3 个结果但得到 0
|
|
95
|
+
|
|
96
|
+
这些是时序/竞态条件问题。你的任务:
|
|
97
|
+
|
|
98
|
+
1. 阅读测试文件,理解每个测试验证什么
|
|
99
|
+
2. 找到根因 - 是时序问题还是实际 bug?
|
|
100
|
+
3. 修复方式:
|
|
101
|
+
- 用基于事件的等待替换任意超时
|
|
102
|
+
- 如果发现中止实现的 bug 则修复
|
|
103
|
+
- 如果测试的是已变更的行为则调整测试期望
|
|
104
|
+
|
|
105
|
+
不要只是增加超时 - 找到真正的问题。
|
|
106
|
+
|
|
107
|
+
返回:你发现了什么以及修复了什么的摘要。
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## 常见错误
|
|
111
|
+
|
|
112
|
+
**❌ 范围太广:** "修复所有测试" - agent 会迷失
|
|
113
|
+
**✅ 具体:** "修复 agent-tool-abort.test.ts" - 聚焦的范围
|
|
114
|
+
|
|
115
|
+
**❌ 没有上下文:** "修复竞态条件" - agent 不知道在哪
|
|
116
|
+
**✅ 有上下文:** 粘贴错误信息和测试名称
|
|
117
|
+
|
|
118
|
+
**❌ 没有约束:** agent 可能重构所有东西
|
|
119
|
+
**✅ 有约束:** "不要修改生产代码" 或 "只修复测试"
|
|
120
|
+
|
|
121
|
+
**❌ 输出模糊:** "修好它" - 你不知道改了什么
|
|
122
|
+
**✅ 输出明确:** "返回根因和变更的摘要"
|
|
123
|
+
|
|
124
|
+
## 何时不使用
|
|
125
|
+
|
|
126
|
+
**相关故障:** 修一个可能修好其他的,先一起排查
|
|
127
|
+
**需要完整上下文:** 理解问题需要看整个系统
|
|
128
|
+
**探索性调试:** 你还不知道什么坏了
|
|
129
|
+
**共享状态:** agent 会互相干扰(编辑同一文件、使用同一资源)
|
|
130
|
+
|
|
131
|
+
## 真实案例
|
|
132
|
+
|
|
133
|
+
**场景:** 大规模重构后 3 个文件中有 6 个测试失败
|
|
134
|
+
|
|
135
|
+
**失败情况:**
|
|
136
|
+
- agent-tool-abort.test.ts:3 个失败(时序问题)
|
|
137
|
+
- batch-completion-behavior.test.ts:2 个失败(工具未执行)
|
|
138
|
+
- tool-approval-race-conditions.test.ts:1 个失败(执行次数 = 0)
|
|
139
|
+
|
|
140
|
+
**决策:** 独立域 - 中止逻辑与批量完成与竞态条件各自独立
|
|
141
|
+
|
|
142
|
+
**调度:**
|
|
143
|
+
```
|
|
144
|
+
Agent 1 → 修复 agent-tool-abort.test.ts
|
|
145
|
+
Agent 2 → 修复 batch-completion-behavior.test.ts
|
|
146
|
+
Agent 3 → 修复 tool-approval-race-conditions.test.ts
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**结果:**
|
|
150
|
+
- Agent 1:用基于事件的等待替换了超时
|
|
151
|
+
- Agent 2:修复了事件结构 bug(threadId 位置错误)
|
|
152
|
+
- Agent 3:添加了异步工具执行完成的等待
|
|
153
|
+
|
|
154
|
+
**集成:** 所有修复独立,无冲突,完整套件全绿
|
|
155
|
+
|
|
156
|
+
**节省时间:** 3 个问题并行解决 vs 顺序解决
|
|
157
|
+
|
|
158
|
+
## 核心收益
|
|
159
|
+
|
|
160
|
+
1. **并行化** - 多个排查同时进行
|
|
161
|
+
2. **聚焦** - 每个 agent 范围窄,需要跟踪的上下文少
|
|
162
|
+
3. **独立性** - agent 互不干扰
|
|
163
|
+
4. **速度** - 3 个问题在 1 个问题的时间内解决
|
|
164
|
+
|
|
165
|
+
## 验证
|
|
166
|
+
|
|
167
|
+
agent 返回后:
|
|
168
|
+
1. **审查每个摘要** - 理解改了什么
|
|
169
|
+
2. **检查冲突** - agent 是否编辑了同一段代码?
|
|
170
|
+
3. **运行完整套件** - 验证所有修复协同工作
|
|
171
|
+
4. **抽查** - agent 可能犯系统性错误
|
|
172
|
+
|
|
173
|
+
## 实际影响
|
|
174
|
+
|
|
175
|
+
来自调试会话(2025-10-03):
|
|
176
|
+
- 3 个文件中 6 个失败
|
|
177
|
+
- 3 个 agent 并行调度
|
|
178
|
+
- 所有排查并发完成
|
|
179
|
+
- 所有修复成功集成
|
|
180
|
+
- agent 变更之间零冲突
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: executing-plans
|
|
3
|
+
description: "有写好的实现计划需要在单独会话中执行时使用,带审查检查点"
|
|
4
|
+
triggers:
|
|
5
|
+
- "执行计划"
|
|
6
|
+
- "实现计划"
|
|
7
|
+
- "按计划开发"
|
|
8
|
+
- "分批执行"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# 执行计划
|
|
12
|
+
|
|
13
|
+
## 概述
|
|
14
|
+
|
|
15
|
+
加载计划,批判性审查,分批执行任务,批次之间报告等待审查。
|
|
16
|
+
|
|
17
|
+
**核心原则:** 分批执行,带检查点供架构师审查。
|
|
18
|
+
|
|
19
|
+
**开始时宣布:** "我正在使用 executing-plans skill 来实现这个计划。"
|
|
20
|
+
|
|
21
|
+
## 流程
|
|
22
|
+
|
|
23
|
+
### 步骤 1:加载并审查计划
|
|
24
|
+
1. 读取计划文件
|
|
25
|
+
2. 批判性审查,找出任何问题或疑虑
|
|
26
|
+
3. 如果有疑虑:在开始之前向你的人类搭档提出
|
|
27
|
+
4. 如果没有疑虑:创建 TodoWrite 并继续
|
|
28
|
+
|
|
29
|
+
### 步骤 2:执行批次
|
|
30
|
+
**默认:前 3 个任务**
|
|
31
|
+
|
|
32
|
+
对每个任务:
|
|
33
|
+
1. 标记为 in_progress
|
|
34
|
+
2. 严格按照每一步执行(计划已经拆成了小步骤)
|
|
35
|
+
3. 按要求运行验证
|
|
36
|
+
4. 标记为 completed
|
|
37
|
+
|
|
38
|
+
### 步骤 3:报告
|
|
39
|
+
批次完成时:
|
|
40
|
+
- 展示实现了什么
|
|
41
|
+
- 展示验证输出
|
|
42
|
+
- 说:"等待反馈。"
|
|
43
|
+
|
|
44
|
+
### 步骤 4:继续
|
|
45
|
+
根据反馈:
|
|
46
|
+
- 如果需要就应用修改
|
|
47
|
+
- 执行下一批次
|
|
48
|
+
- 重复直到完成
|
|
49
|
+
|
|
50
|
+
### 步骤 5:完成开发
|
|
51
|
+
|
|
52
|
+
所有任务完成并验证后:
|
|
53
|
+
- 先运行 specops acceptance runner 进行验收测试
|
|
54
|
+
- 宣布:"我正在使用 finishing-a-development-branch skill 来完成这项工作。"
|
|
55
|
+
- **必须使用的子 SKILL:** 使用 specops:finishing-a-development-branch
|
|
56
|
+
- 按照那个 skill 来验证测试、展示选项、执行选择
|
|
57
|
+
|
|
58
|
+
## 什么时候停下来求助
|
|
59
|
+
|
|
60
|
+
**遇到以下情况立即停止执行:**
|
|
61
|
+
- 批次中途遇到阻塞(缺少依赖、测试失败、指令不清楚)
|
|
62
|
+
- 计划有关键缺口导致无法开始
|
|
63
|
+
- 你不理解某条指令
|
|
64
|
+
- 验证反复失败
|
|
65
|
+
|
|
66
|
+
**宁可问清楚,也不要猜。**
|
|
67
|
+
|
|
68
|
+
## 什么时候回到前面的步骤
|
|
69
|
+
|
|
70
|
+
**回到审查(步骤 1)的情况:**
|
|
71
|
+
- 搭档根据你的反馈更新了计划
|
|
72
|
+
- 根本方案需要重新思考
|
|
73
|
+
|
|
74
|
+
**不要硬闯阻塞** - 停下来问。
|
|
75
|
+
|
|
76
|
+
## 注意事项
|
|
77
|
+
- 先批判性审查计划
|
|
78
|
+
- 严格按照计划步骤执行
|
|
79
|
+
- 不要跳过验证
|
|
80
|
+
- 计划提到的 skill 要引用
|
|
81
|
+
- 批次之间:只报告,然后等待
|
|
82
|
+
- 遇到阻塞就停下来,不要猜
|
|
83
|
+
- 未经用户明确同意,永远不要在 main/master 分支上开始实现
|
|
84
|
+
|
|
85
|
+
## 集成
|
|
86
|
+
|
|
87
|
+
**必需的工作流 skill:**
|
|
88
|
+
- **specops:using-git-worktrees** - 必需:开始之前搭建隔离的工作空间
|
|
89
|
+
- **specops:writing-plans** - 创建本 skill 要执行的计划
|
|
90
|
+
- **specops:finishing-a-development-branch** - 所有任务完成后收尾开发
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: finishing-a-development-branch
|
|
3
|
+
description: 实现完成、所有测试通过后使用,指导如何集成工作,提供合并、PR 或清理的结构化选项
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 完成开发分支
|
|
7
|
+
|
|
8
|
+
## 概述
|
|
9
|
+
|
|
10
|
+
指导开发工作的收尾,提供清晰的选项并处理所选的工作流。
|
|
11
|
+
|
|
12
|
+
**核心原则:** 验证测试 → 运行验收 → 展示选项 → 执行选择 → 清理。
|
|
13
|
+
|
|
14
|
+
**开始时宣布:** "我正在使用 finishing-a-development-branch skill 来完成这项工作。"
|
|
15
|
+
|
|
16
|
+
## 流程
|
|
17
|
+
|
|
18
|
+
### 步骤 1:验证测试
|
|
19
|
+
|
|
20
|
+
**展示选项之前,先验证测试通过:**
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# 运行项目的测试套件
|
|
24
|
+
npm test / cargo test / pytest / go test ./...
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**如果测试失败:**
|
|
28
|
+
```
|
|
29
|
+
测试失败(<N> 个失败)。完成前必须修复:
|
|
30
|
+
|
|
31
|
+
[展示失败信息]
|
|
32
|
+
|
|
33
|
+
测试通过前无法进行合并/PR。
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
停下。不要进入步骤 2。
|
|
37
|
+
|
|
38
|
+
**如果测试通过:** 继续步骤 2。
|
|
39
|
+
|
|
40
|
+
### 步骤 1.5:运行 specops 验收
|
|
41
|
+
|
|
42
|
+
**测试通过后,运行 specops 验收运行器确认全部通过:**
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# 运行 specops 验收检查
|
|
46
|
+
specops verify
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**如果验收失败:**
|
|
50
|
+
```
|
|
51
|
+
验收检查未通过(<N> 项失败)。完成前必须修复:
|
|
52
|
+
|
|
53
|
+
[展示失败项]
|
|
54
|
+
|
|
55
|
+
验收全部通过前无法进行合并/PR。
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
停下。不要进入步骤 2。
|
|
59
|
+
|
|
60
|
+
**如果验收通过:** 继续步骤 2。
|
|
61
|
+
|
|
62
|
+
### 步骤 2:确定基准分支
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# 尝试常见的基准分支
|
|
66
|
+
git merge-base HEAD main 2>/dev/null || git merge-base HEAD master 2>/dev/null
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
或者询问:"这个分支是从 main 分出来的,对吗?"
|
|
70
|
+
|
|
71
|
+
### 步骤 3:展示选项
|
|
72
|
+
|
|
73
|
+
展示恰好这 4 个选项:
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
实现完成。你想怎么做?
|
|
77
|
+
|
|
78
|
+
1. 本地合并回 <基准分支>
|
|
79
|
+
2. 推送并创建 Pull Request
|
|
80
|
+
3. 保持分支现状(我稍后处理)
|
|
81
|
+
4. 丢弃这项工作
|
|
82
|
+
|
|
83
|
+
选哪个?
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**不要添加解释** - 保持选项简洁。
|
|
87
|
+
|
|
88
|
+
### 步骤 4:执行选择
|
|
89
|
+
|
|
90
|
+
#### 选项 1:本地合并
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
# 切换到基准分支
|
|
94
|
+
git checkout <基准分支>
|
|
95
|
+
|
|
96
|
+
# 拉取最新
|
|
97
|
+
git pull
|
|
98
|
+
|
|
99
|
+
# 合并功能分支
|
|
100
|
+
git merge <功能分支>
|
|
101
|
+
|
|
102
|
+
# 在合并结果上验证测试
|
|
103
|
+
<测试命令>
|
|
104
|
+
|
|
105
|
+
# 如果测试通过
|
|
106
|
+
git branch -d <功能分支>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
然后:清理工作树(步骤 5)
|
|
110
|
+
|
|
111
|
+
#### 选项 2:推送并创建 PR
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
# 推送分支
|
|
115
|
+
git push -u origin <功能分支>
|
|
116
|
+
|
|
117
|
+
# 创建 PR
|
|
118
|
+
gh pr create --title "<标题>" --body "$(cat <<'EOF'
|
|
119
|
+
## 摘要
|
|
120
|
+
<2-3 条变更要点>
|
|
121
|
+
|
|
122
|
+
## 测试计划
|
|
123
|
+
- [ ] <验证步骤>
|
|
124
|
+
EOF
|
|
125
|
+
)"
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
然后:清理工作树(步骤 5)
|
|
129
|
+
|
|
130
|
+
#### 选项 3:保持现状
|
|
131
|
+
|
|
132
|
+
报告:"保持分支 <名称>。工作树保留在 <路径>。"
|
|
133
|
+
|
|
134
|
+
**不要清理工作树。**
|
|
135
|
+
|
|
136
|
+
#### 选项 4:丢弃
|
|
137
|
+
|
|
138
|
+
**先确认:**
|
|
139
|
+
```
|
|
140
|
+
这将永久删除:
|
|
141
|
+
- 分支 <名称>
|
|
142
|
+
- 所有提交:<提交列表>
|
|
143
|
+
- 工作树 <路径>
|
|
144
|
+
|
|
145
|
+
输入 'discard' 确认。
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
等待精确确认。
|
|
149
|
+
|
|
150
|
+
确认后:
|
|
151
|
+
```bash
|
|
152
|
+
git checkout <基准分支>
|
|
153
|
+
git branch -D <功能分支>
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
然后:清理工作树(步骤 5)
|
|
157
|
+
|
|
158
|
+
### 步骤 5:清理工作树
|
|
159
|
+
|
|
160
|
+
**选项 1、2、4:**
|
|
161
|
+
|
|
162
|
+
检查是否在工作树中:
|
|
163
|
+
```bash
|
|
164
|
+
git worktree list | grep $(git branch --show-current)
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
如果是:
|
|
168
|
+
```bash
|
|
169
|
+
git worktree remove <工作树路径>
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**选项 3:** 保留工作树。
|
|
173
|
+
|
|
174
|
+
## 快速参考
|
|
175
|
+
|
|
176
|
+
| 选项 | 合并 | 推送 | 保留工作树 | 清理分支 |
|
|
177
|
+
|------|------|------|------------|----------|
|
|
178
|
+
| 1. 本地合并 | ✓ | - | - | ✓ |
|
|
179
|
+
| 2. 创建 PR | - | ✓ | ✓ | - |
|
|
180
|
+
| 3. 保持现状 | - | - | ✓ | - |
|
|
181
|
+
| 4. 丢弃 | - | - | - | ✓(强制) |
|
|
182
|
+
|
|
183
|
+
## 常见错误
|
|
184
|
+
|
|
185
|
+
**跳过测试验证**
|
|
186
|
+
- **问题:** 合并了坏代码,创建了失败的 PR
|
|
187
|
+
- **修正:** 展示选项前始终验证测试
|
|
188
|
+
|
|
189
|
+
**开放式提问**
|
|
190
|
+
- **问题:** "接下来该做什么?" → 模糊
|
|
191
|
+
- **修正:** 展示恰好 4 个结构化选项
|
|
192
|
+
|
|
193
|
+
**自动清理工作树**
|
|
194
|
+
- **问题:** 可能还需要时移除了工作树(选项 2、3)
|
|
195
|
+
- **修正:** 只在选项 1 和 4 时清理
|
|
196
|
+
|
|
197
|
+
**丢弃不确认**
|
|
198
|
+
- **问题:** 意外删除工作
|
|
199
|
+
- **修正:** 要求输入 "discard" 确认
|
|
200
|
+
|
|
201
|
+
## 红线
|
|
202
|
+
|
|
203
|
+
**绝对不要:**
|
|
204
|
+
- 测试失败时继续
|
|
205
|
+
- 不验证合并结果的测试就合并
|
|
206
|
+
- 不确认就删除工作
|
|
207
|
+
- 未经明确要求就 force-push
|
|
208
|
+
|
|
209
|
+
**始终:**
|
|
210
|
+
- 展示选项前验证测试
|
|
211
|
+
- 展示恰好 4 个选项
|
|
212
|
+
- 选项 4 要求输入确认
|
|
213
|
+
- 只在选项 1 和 4 时清理工作树
|
|
214
|
+
|
|
215
|
+
## 集成
|
|
216
|
+
|
|
217
|
+
**被调用方:**
|
|
218
|
+
- **specops:subagent-driven-development**(步骤 7)- 所有任务完成后
|
|
219
|
+
- **specops:executing-plans**(步骤 5)- 所有批次完成后
|
|
220
|
+
|
|
221
|
+
**配合使用:**
|
|
222
|
+
- **specops:using-git-worktrees** - 清理该 skill 创建的工作树
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: receiving-code-review
|
|
3
|
+
description: 收到代码审查反馈后、实现建议前使用,尤其当反馈不清楚或技术上有疑问时,需要技术严谨性和验证,而非表演性认同或盲目实现
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 接收代码审查
|
|
7
|
+
|
|
8
|
+
## 概述
|
|
9
|
+
|
|
10
|
+
代码审查需要技术评估,不是情绪表演。
|
|
11
|
+
|
|
12
|
+
**核心原则:** 先验证再实现。先提问再假设。技术正确性优先于社交舒适。
|
|
13
|
+
|
|
14
|
+
## 回应模式
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
收到代码审查反馈时:
|
|
18
|
+
|
|
19
|
+
1. 阅读:完整阅读反馈,不要急于反应
|
|
20
|
+
2. 理解:用自己的话复述需求(或提问)
|
|
21
|
+
3. 验证:对照代码库实际情况检查
|
|
22
|
+
4. 评估:对这个代码库来说技术上合理吗?
|
|
23
|
+
5. 回应:技术性确认或有理有据的反驳
|
|
24
|
+
6. 实现:一次一项,每项都测试
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 禁止的回应
|
|
28
|
+
|
|
29
|
+
**绝对不要:**
|
|
30
|
+
- "你说得太对了!"(明确违反 CLAUDE.md)
|
|
31
|
+
- "好观点!" / "很好的反馈!"(表演性的)
|
|
32
|
+
- "让我现在就实现"(验证之前)
|
|
33
|
+
|
|
34
|
+
**应该:**
|
|
35
|
+
- 复述技术需求
|
|
36
|
+
- 提出澄清问题
|
|
37
|
+
- 如果有误,用技术理由反驳
|
|
38
|
+
- 直接开始做(行动 > 言语)
|
|
39
|
+
|
|
40
|
+
## 处理不清楚的反馈
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
如果任何一项不清楚:
|
|
44
|
+
停下 - 先不要实现任何东西
|
|
45
|
+
对不清楚的项目提问
|
|
46
|
+
|
|
47
|
+
为什么:各项可能相关。部分理解 = 错误实现。
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**示例:**
|
|
51
|
+
```
|
|
52
|
+
你的人类搭档:"修复 1-6"
|
|
53
|
+
你理解 1,2,3,6。4,5 不清楚。
|
|
54
|
+
|
|
55
|
+
❌ 错误:先实现 1,2,3,6,之后再问 4,5
|
|
56
|
+
✅ 正确:"我理解第 1,2,3,6 项。第 4 和第 5 项需要澄清后再继续。"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## 按来源处理
|
|
60
|
+
|
|
61
|
+
### 来自你的人类搭档
|
|
62
|
+
- **可信** - 理解后实现
|
|
63
|
+
- **仍然要问** 如果范围不清楚
|
|
64
|
+
- **不要表演性认同**
|
|
65
|
+
- **直接行动** 或技术性确认
|
|
66
|
+
|
|
67
|
+
### 来自外部审查者
|
|
68
|
+
```
|
|
69
|
+
实现之前:
|
|
70
|
+
1. 检查:对这个代码库来说技术上正确吗?
|
|
71
|
+
2. 检查:会破坏现有功能吗?
|
|
72
|
+
3. 检查:当前实现的原因是什么?
|
|
73
|
+
4. 检查:在所有平台/版本上都可用吗?
|
|
74
|
+
5. 检查:审查者是否理解完整上下文?
|
|
75
|
+
|
|
76
|
+
如果建议似乎有误:
|
|
77
|
+
用技术理由反驳
|
|
78
|
+
|
|
79
|
+
如果无法轻易验证:
|
|
80
|
+
说明:"我无法在没有 [X] 的情况下验证这一点。我应该 [调查/询问/继续]?"
|
|
81
|
+
|
|
82
|
+
如果与你的人类搭档之前的决策冲突:
|
|
83
|
+
先停下来和你的人类搭档讨论
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**你的人类搭档的规则:** "外部反馈 - 保持怀疑,但仔细检查"
|
|
87
|
+
|
|
88
|
+
## 对"专业"功能的 YAGNI 检查
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
如果审查者建议"正确实现":
|
|
92
|
+
在代码库中搜索实际使用情况
|
|
93
|
+
|
|
94
|
+
如果未使用:"这个端点没有被调用。移除它(YAGNI)?"
|
|
95
|
+
如果在用:那就正确实现
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**你的人类搭档的规则:** "你和审查者都向我汇报。如果我们不需要这个功能,就不要加。"
|
|
99
|
+
|
|
100
|
+
## 实现顺序
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
对于多项反馈:
|
|
104
|
+
1. 先澄清所有不清楚的项目
|
|
105
|
+
2. 然后按此顺序实现:
|
|
106
|
+
- 阻塞性问题(崩溃、安全)
|
|
107
|
+
- 简单修复(拼写、导入)
|
|
108
|
+
- 复杂修复(重构、逻辑)
|
|
109
|
+
3. 每个修复单独测试
|
|
110
|
+
4. 验证没有回归
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## 何时反驳
|
|
114
|
+
|
|
115
|
+
在以下情况反驳:
|
|
116
|
+
- 建议会破坏现有功能
|
|
117
|
+
- 审查者缺乏完整上下文
|
|
118
|
+
- 违反 YAGNI(未使用的功能)
|
|
119
|
+
- 对这个技术栈来说技术上不正确
|
|
120
|
+
- 存在遗留/兼容性原因
|
|
121
|
+
- 与你的人类搭档的架构决策冲突
|
|
122
|
+
|
|
123
|
+
**如何反驳:**
|
|
124
|
+
- 用技术理由,不要防御性
|
|
125
|
+
- 提出具体问题
|
|
126
|
+
- 引用可用的测试/代码
|
|
127
|
+
- 如果涉及架构,让你的人类搭档参与
|
|
128
|
+
|
|
129
|
+
**如果不方便大声反驳的信号:** "Strange things are afoot at the Circle K"
|
|
130
|
+
|
|
131
|
+
## 确认正确的反馈
|
|
132
|
+
|
|
133
|
+
当反馈确实正确时:
|
|
134
|
+
```
|
|
135
|
+
✅ "已修复。[简要描述改了什么]"
|
|
136
|
+
✅ "好发现 - [具体问题]。已在 [位置] 修复。"
|
|
137
|
+
✅ [直接修复并在代码中展示]
|
|
138
|
+
|
|
139
|
+
❌ "你说得太对了!"
|
|
140
|
+
❌ "好观点!"
|
|
141
|
+
❌ "感谢指出!"
|
|
142
|
+
❌ "感谢 [任何东西]"
|
|
143
|
+
❌ 任何感谢表达
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**为什么不感谢:** 行动说明一切。直接修复就好。代码本身就表明你听到了反馈。
|
|
147
|
+
|
|
148
|
+
**如果你发现自己要写"感谢":** 删掉它。改为描述修复内容。
|
|
149
|
+
|
|
150
|
+
## 优雅地纠正你的反驳
|
|
151
|
+
|
|
152
|
+
如果你反驳了但发现自己错了:
|
|
153
|
+
```
|
|
154
|
+
✅ "你是对的 - 我检查了 [X],它确实 [Y]。现在实现。"
|
|
155
|
+
✅ "验证了这一点,你是正确的。我最初的理解有误,因为 [原因]。修复中。"
|
|
156
|
+
|
|
157
|
+
❌ 长篇道歉
|
|
158
|
+
❌ 为什么反驳做辩护
|
|
159
|
+
❌ 过度解释
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
陈述事实,继续前进。
|
|
163
|
+
|
|
164
|
+
## 常见错误
|
|
165
|
+
|
|
166
|
+
| 错误 | 修正 |
|
|
167
|
+
|------|------|
|
|
168
|
+
| 表演性认同 | 复述需求或直接行动 |
|
|
169
|
+
| 盲目实现 | 先对照代码库验证 |
|
|
170
|
+
| 批量处理不测试 | 一次一项,每项测试 |
|
|
171
|
+
| 假设审查者正确 | 检查是否会破坏东西 |
|
|
172
|
+
| 回避反驳 | 技术正确性 > 舒适 |
|
|
173
|
+
| 部分实现 | 先澄清所有项目 |
|
|
174
|
+
| 无法验证就继续 | 说明限制,请求指导 |
|
|
175
|
+
|
|
176
|
+
## 真实案例
|
|
177
|
+
|
|
178
|
+
**表演性认同(错误):**
|
|
179
|
+
```
|
|
180
|
+
审查者:"移除遗留代码"
|
|
181
|
+
❌ "你说得太对了!让我移除..."
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
**技术验证(正确):**
|
|
185
|
+
```
|
|
186
|
+
审查者:"移除遗留代码"
|
|
187
|
+
✅ "检查中... 构建目标是 10.15+,这个 API 需要 13+。需要遗留代码来向后兼容。当前实现的 bundle ID 有误 - 修复它还是放弃 pre-13 支持?"
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**YAGNI(正确):**
|
|
191
|
+
```
|
|
192
|
+
审查者:"实现完整的指标追踪,包括数据库、日期过滤、CSV 导出"
|
|
193
|
+
✅ "搜索了代码库 - 没有任何地方调用这个端点。移除它(YAGNI)?还是有我遗漏的使用场景?"
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
**不清楚的项目(正确):**
|
|
197
|
+
```
|
|
198
|
+
你的人类搭档:"修复第 1-6 项"
|
|
199
|
+
你理解 1,2,3,6。4,5 不清楚。
|
|
200
|
+
✅ "理解 1,2,3,6。第 4 和第 5 项需要澄清后再实现。"
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
## GitHub 评论回复
|
|
204
|
+
|
|
205
|
+
在 GitHub 上回复行内审查评论时,在评论线程中回复(`gh api repos/{owner}/{repo}/pulls/{pr}/comments/{id}/replies`),不要作为顶层 PR 评论。
|
|
206
|
+
|
|
207
|
+
## 底线
|
|
208
|
+
|
|
209
|
+
**外部反馈 = 需要评估的建议,不是必须执行的命令。**
|
|
210
|
+
|
|
211
|
+
验证。质疑。然后实现。
|
|
212
|
+
|
|
213
|
+
不要表演性认同。始终保持技术严谨。
|