sdd-full 4.0.0 → 4.2.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/package.json +1 -1
- package/skills/brainstorming/SKILL.md +164 -0
- package/skills/brainstorming/scripts/frame-template.html +214 -0
- package/skills/brainstorming/scripts/helper.js +88 -0
- package/skills/brainstorming/scripts/server.cjs +338 -0
- package/skills/brainstorming/scripts/start-server.sh +153 -0
- package/skills/brainstorming/scripts/stop-server.sh +55 -0
- package/skills/brainstorming/spec-document-reviewer-prompt.md +48 -0
- package/skills/brainstorming/visual-companion.md +286 -0
- package/skills/chinese-code-review/SKILL.md +277 -0
- package/skills/chinese-commit-conventions/SKILL.md +364 -0
- package/skills/chinese-documentation/SKILL.md +448 -0
- package/skills/chinese-git-workflow/SKILL.md +510 -0
- package/skills/design-planning/enterprise-spec/SKILL.md +5 -0
- package/skills/design-planning/flutter-av/SKILL.md +44 -0
- package/skills/design-planning/flutter-map/SKILL.md +44 -0
- package/skills/design-planning/ui-sdd-specialized/SKILL.md +50 -0
- package/skills/development-execution/flutter-errors/SKILL.md +44 -0
- package/skills/dispatching-parallel-agents/SKILL.md +182 -0
- package/skills/executing-plans/SKILL.md +175 -0
- package/skills/finishing-a-development-branch/SKILL.md +200 -0
- package/skills/mcp-builder/SKILL.md +255 -0
- package/skills/quality-assurance/bdd-acceptance/SKILL.md +49 -0
- package/skills/receiving-code-review/SKILL.md +213 -0
- package/skills/requesting-code-review/SKILL.md +105 -0
- package/skills/requesting-code-review/code-reviewer.md +146 -0
- package/skills/requirement-analysis/sdd-full/SKILL.md +54 -0
- package/skills/requirement-analysis/unified-flow/SKILL.md +45 -0
- package/skills/rules/skill-map.md +97 -0
- package/skills/rules/user_rules.md +69 -0
- package/skills/special-tools/env-check/SKILL.md +47 -0
- package/skills/subagent-driven-development/SKILL.md +277 -0
- package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
- package/skills/subagent-driven-development/implementer-prompt.md +113 -0
- package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/skills/systematic-debugging/SKILL.md +296 -0
- package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/skills/systematic-debugging/find-polluter.sh +63 -0
- package/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/skills/systematic-debugging/test-academic.md +14 -0
- package/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/skills/test-driven-development/SKILL.md +371 -0
- package/skills/test-driven-development/testing-anti-patterns.md +299 -0
- package/skills/using-git-worktrees/SKILL.md +218 -0
- package/skills/using-superpowers/SKILL.md +134 -0
- package/skills/using-superpowers/references/codex-tools.md +25 -0
- package/skills/using-superpowers/references/gemini-tools.md +33 -0
- package/skills/verification-before-completion/SKILL.md +139 -0
- package/skills/workflow-runner/SKILL.md +172 -0
- package/skills/writing-plans/SKILL.md +152 -0
- package/skills/writing-plans/plan-document-reviewer-prompt.md +49 -0
- package/skills/writing-skills/SKILL.md +654 -0
- package/skills/writing-skills/anthropic-best-practices.md +1149 -0
- package/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/skills/writing-skills/graphviz-conventions.dot +172 -0
- package/skills/writing-skills/persuasion-principles.md +187 -0
- package/skills/writing-skills/render-graphs.js +168 -0
- package/skills/writing-skills/testing-skills-with-subagents.md +384 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mcp-builder
|
|
3
|
+
description: MCP 服务器构建方法论 — 系统化构建生产级 MCP 工具,让 AI 助手连接外部能力
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# MCP 服务器构建
|
|
7
|
+
|
|
8
|
+
系统化设计、实现、测试和部署 Model Context Protocol 服务器的方法论。
|
|
9
|
+
|
|
10
|
+
## 1. 协议核心概念
|
|
11
|
+
|
|
12
|
+
MCP 定义三种原语:
|
|
13
|
+
|
|
14
|
+
- **Tools(工具)**:AI 助手主动调用的函数,有副作用。如搜索、创建、删除操作。
|
|
15
|
+
- **Resources(资源)**:AI 助手只读访问的数据源,用 URI 标识。如 `users://{id}/profile`。
|
|
16
|
+
- **Prompts(提示词模板)**:预定义交互模板,引导用户触发工作流。
|
|
17
|
+
|
|
18
|
+
**选择原则:** 执行操作 → Tool | 读取数据 → Resource | 引导交互 → Prompt
|
|
19
|
+
|
|
20
|
+
## 2. 项目结构规范
|
|
21
|
+
|
|
22
|
+
### TypeScript
|
|
23
|
+
```
|
|
24
|
+
my-mcp-server/
|
|
25
|
+
├── src/
|
|
26
|
+
│ ├── index.ts # 入口,注册 tools/resources
|
|
27
|
+
│ ├── tools/ # 按功能拆分
|
|
28
|
+
│ ├── resources/
|
|
29
|
+
│ └── lib/ # 客户端封装、校验逻辑
|
|
30
|
+
├── tests/
|
|
31
|
+
├── package.json
|
|
32
|
+
└── tsconfig.json
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
关键依赖:`@modelcontextprotocol/sdk` + `zod`
|
|
36
|
+
|
|
37
|
+
### Python
|
|
38
|
+
```
|
|
39
|
+
my-mcp-server/
|
|
40
|
+
├── src/my_mcp_server/
|
|
41
|
+
│ ├── server.py
|
|
42
|
+
│ ├── tools/
|
|
43
|
+
│ └── lib/
|
|
44
|
+
├── tests/
|
|
45
|
+
└── pyproject.toml
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
关键依赖:`mcp` + `pydantic`
|
|
49
|
+
|
|
50
|
+
## 3. Tool 设计原则
|
|
51
|
+
|
|
52
|
+
### 命名
|
|
53
|
+
- `snake_case` 格式,动词开头:`search_users`、`create_issue`、`delete_file`
|
|
54
|
+
- 名称自解释,AI 助手靠名称选工具,模糊命名导致误调用
|
|
55
|
+
|
|
56
|
+
### 参数
|
|
57
|
+
- 每个参数有类型约束和 `.describe()` 描述
|
|
58
|
+
- 可选参数给默认值,减少 AI 决策负担
|
|
59
|
+
- 用枚举代替布尔开关
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
server.tool("search_issues", {
|
|
63
|
+
query: z.string().describe("搜索关键词"),
|
|
64
|
+
status: z.enum(["open", "closed", "all"]).default("open").describe("状态筛选"),
|
|
65
|
+
limit: z.number().min(1).max(100).default(20).describe("返回上限"),
|
|
66
|
+
}, async ({ query, status, limit }) => { /* ... */ });
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 描述
|
|
70
|
+
说明**用途 + 返回内容 + 限制**,这是 AI 选择工具的关键依据:
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
server.tool("search_users",
|
|
74
|
+
"根据姓名或邮箱搜索用户。返回 ID、姓名、邮箱列表。模糊匹配,最多 50 条。",
|
|
75
|
+
schema, handler);
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 输出
|
|
79
|
+
- 结构化数据 → JSON,人类可读内容 → Markdown
|
|
80
|
+
- 始终用 `content: [{ type: "text", text: "..." }]` 格式返回
|
|
81
|
+
|
|
82
|
+
## 4. 输入验证和错误处理
|
|
83
|
+
|
|
84
|
+
用 Zod/Pydantic 做 Schema 级校验,业务级校验放 handler 开头:
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
server.tool("get_user", { id: z.string() }, async ({ id }) => {
|
|
88
|
+
try {
|
|
89
|
+
const user = await db.getUser(id);
|
|
90
|
+
if (!user) {
|
|
91
|
+
return {
|
|
92
|
+
content: [{ type: "text", text: `用户 ${id} 不存在,请检查 ID。` }],
|
|
93
|
+
isError: true,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
return { content: [{ type: "text", text: JSON.stringify(user, null, 2) }] };
|
|
97
|
+
} catch (err) {
|
|
98
|
+
return {
|
|
99
|
+
content: [{ type: "text", text: `查询失败:${err.message}` }],
|
|
100
|
+
isError: true,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**错误处理四原则:**
|
|
107
|
+
1. 永远不让服务器崩溃 — try/catch 包裹所有外部调用
|
|
108
|
+
2. 返回可操作的错误信息 — 告诉 AI 问题是什么、能做什么
|
|
109
|
+
3. 使用 `isError: true` — 让 AI 知道调用失败
|
|
110
|
+
4. 区分错误类型 — 参数错误、权限不足、资源不存在、服务不可用
|
|
111
|
+
|
|
112
|
+
## 5. 资源管理和生命周期
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
// 资源注册
|
|
116
|
+
server.resource("user-profile", "users://{userId}/profile", async (uri) => {
|
|
117
|
+
const profile = await db.getProfile(extractId(uri));
|
|
118
|
+
return { contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(profile) }] };
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// 生命周期:先初始化 → 再 connect → 监听关闭信号
|
|
122
|
+
const db = await Database.connect(config.dbUrl);
|
|
123
|
+
await server.connect(new StdioServerTransport());
|
|
124
|
+
process.on("SIGINT", async () => { await db.disconnect(); await server.close(); process.exit(0); });
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
关键点:使用连接池、所有外部调用设超时、优雅关闭清理资源。
|
|
128
|
+
|
|
129
|
+
## 6. 测试策略
|
|
130
|
+
|
|
131
|
+
### 单元测试 — 业务逻辑与 MCP 注册分离
|
|
132
|
+
```typescript
|
|
133
|
+
// tools/search.ts 导出纯函数
|
|
134
|
+
export async function searchUsers(query: string, limit: number) { /* ... */ }
|
|
135
|
+
|
|
136
|
+
// search.test.ts 独立测试
|
|
137
|
+
test("返回匹配结果", async () => {
|
|
138
|
+
const results = await searchUsers("alice", 10);
|
|
139
|
+
expect(results[0].name).toContain("Alice");
|
|
140
|
+
});
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 集成测试 — 用 SDK Client 做端到端验证
|
|
144
|
+
```typescript
|
|
145
|
+
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
146
|
+
await server.connect(serverTransport);
|
|
147
|
+
const client = new Client({ name: "test", version: "1.0.0" });
|
|
148
|
+
await client.connect(clientTransport);
|
|
149
|
+
const result = await client.callTool("search_users", { query: "test" });
|
|
150
|
+
expect(result.isError).toBeFalsy();
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### MCP Inspector — 交互式调试
|
|
154
|
+
```bash
|
|
155
|
+
npx @modelcontextprotocol/inspector node dist/index.js
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
在浏览器中查看所有 tools/resources,手动调用并查看结果。
|
|
159
|
+
|
|
160
|
+
**测试要点:** 每个 Tool 覆盖正常 + 异常路径、边界值、外部服务失败模拟。
|
|
161
|
+
|
|
162
|
+
## 7. 安全考虑
|
|
163
|
+
|
|
164
|
+
**权限控制:**
|
|
165
|
+
- 最小权限原则,读写 Tool 分离
|
|
166
|
+
- 危险操作要求确认参数(如 `confirm: true`)
|
|
167
|
+
|
|
168
|
+
**输入安全:**
|
|
169
|
+
- SQL 注入 → 参数化查询,绝不拼接
|
|
170
|
+
- 路径遍历 → 校验路径,禁止 `../`
|
|
171
|
+
- 命令注入 → 用 `execFile` 而非 `exec`
|
|
172
|
+
|
|
173
|
+
**敏感数据:**
|
|
174
|
+
- 密钥通过环境变量传入,不硬编码
|
|
175
|
+
- 日志不打印完整敏感信息
|
|
176
|
+
- 返回数据做脱敏处理
|
|
177
|
+
|
|
178
|
+
**沙箱:** 文件操作限制目录、网络请求限制白名单、设置资源配额。
|
|
179
|
+
|
|
180
|
+
## 8. 部署和分发
|
|
181
|
+
|
|
182
|
+
### npm 发布
|
|
183
|
+
```json
|
|
184
|
+
{ "bin": { "mcp-server-myservice": "dist/index.js" }, "files": ["dist"] }
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
用户配置:
|
|
188
|
+
```json
|
|
189
|
+
{ "mcpServers": { "myservice": { "command": "npx", "args": ["@yourorg/mcp-server-myservice"], "env": { "API_KEY": "xxx" } } } }
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### pip 发布
|
|
193
|
+
```toml
|
|
194
|
+
[project.scripts]
|
|
195
|
+
mcp-server-myservice = "my_mcp_server.server:main"
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Docker — 适用于复杂依赖或隔离场景
|
|
199
|
+
```dockerfile
|
|
200
|
+
FROM node:20-slim
|
|
201
|
+
WORKDIR /app
|
|
202
|
+
COPY package*.json ./ && RUN npm ci --production
|
|
203
|
+
COPY dist ./dist
|
|
204
|
+
ENTRYPOINT ["node", "dist/index.js"]
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## 9. 调试技巧
|
|
208
|
+
|
|
209
|
+
**关键:MCP 用 stdio 通信,不能用 `console.log`,会破坏协议流。**
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
// 错误
|
|
213
|
+
console.log("debug");
|
|
214
|
+
// 正确
|
|
215
|
+
console.error("[DEBUG]", info);
|
|
216
|
+
// 更好
|
|
217
|
+
server.sendLoggingMessage({ level: "info", data: "处理中" });
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**常见问题:**
|
|
221
|
+
|
|
222
|
+
| 症状 | 原因 | 解决 |
|
|
223
|
+
|------|------|------|
|
|
224
|
+
| 启动无响应 | transport 未连接 | 检查 `server.connect()` |
|
|
225
|
+
| Tool 不出现 | 注册在 connect 之后 | 先注册再 connect |
|
|
226
|
+
| AI 不调用 Tool | 描述不清晰 | 改善名称和描述 |
|
|
227
|
+
| 参数总错 | Schema 不明确 | 添加 `.describe()` |
|
|
228
|
+
| 调用超时 | 外部服务慢 | 加超时和缓存 |
|
|
229
|
+
|
|
230
|
+
**调试流程:** Inspector 验证基本功能 → 手动调用确认输入输出 → 连接真实 AI 客户端观察调用模式 → 根据实际行为调整设计。
|
|
231
|
+
|
|
232
|
+
## 10. 构建检查清单
|
|
233
|
+
|
|
234
|
+
### 设计
|
|
235
|
+
- [ ] 明确 Tools vs Resources vs Prompts 分工
|
|
236
|
+
- [ ] Tool 命名 `动词_名词`,描述说明用途和返回内容
|
|
237
|
+
- [ ] 参数简洁,可选参数有合理默认值
|
|
238
|
+
|
|
239
|
+
### 实现
|
|
240
|
+
- [ ] 输入用 Zod/Pydantic 校验
|
|
241
|
+
- [ ] 外部调用有 try/catch 和超时
|
|
242
|
+
- [ ] 错误返回 `isError: true` 并附可操作信息
|
|
243
|
+
- [ ] 不用 `console.log`(用 stderr 或 SDK 日志)
|
|
244
|
+
- [ ] 敏感数据走环境变量
|
|
245
|
+
|
|
246
|
+
### 测试
|
|
247
|
+
- [ ] 核心逻辑有单元测试
|
|
248
|
+
- [ ] 有集成测试验证 MCP 协议交互
|
|
249
|
+
- [ ] 用 MCP Inspector 手动验证过
|
|
250
|
+
- [ ] 用真实 AI 客户端测试过
|
|
251
|
+
|
|
252
|
+
### 部署
|
|
253
|
+
- [ ] README 含安装和配置说明
|
|
254
|
+
- [ ] 提供客户端配置 JSON 示例
|
|
255
|
+
- [ ] 遵循 semver,无硬编码密钥
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# bdd-acceptance - BDD风格验收标准
|
|
2
|
+
|
|
3
|
+
## 功能说明
|
|
4
|
+
|
|
5
|
+
所有需求配套BDD验收句式、场景写法、准入/准出标准的专用技能。
|
|
6
|
+
|
|
7
|
+
## 触发词
|
|
8
|
+
|
|
9
|
+
`BDD`、`验收标准`、`行为驱动`、`测试用例`
|
|
10
|
+
|
|
11
|
+
## 参数说明
|
|
12
|
+
|
|
13
|
+
| 参数名 | 类型 | 必填 | 说明 |
|
|
14
|
+
|--------|------|------|------|
|
|
15
|
+
| requirement_name | string | 是 | 需求名称 |
|
|
16
|
+
| module | string | 否 | 所属模块 |
|
|
17
|
+
|
|
18
|
+
## BDD句式结构
|
|
19
|
+
|
|
20
|
+
### Given-When-Then 格式
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
场景: [场景名称]
|
|
24
|
+
Given [前置条件]
|
|
25
|
+
And [额外条件]
|
|
26
|
+
When [用户操作]
|
|
27
|
+
And [后续操作]
|
|
28
|
+
Then [预期结果]
|
|
29
|
+
And [额外验证]
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 验收标准
|
|
33
|
+
|
|
34
|
+
| 阶段 | 准入条件 | 准出条件 |
|
|
35
|
+
|------|----------|----------|
|
|
36
|
+
| 开发 | 需求明确、设计完成 | 代码提交、单元测试通过 |
|
|
37
|
+
| 测试 | 开发完成、代码审查通过 | 功能测试通过、无阻塞Bug |
|
|
38
|
+
| 上线 | 测试通过、文档齐全 | 灰度发布成功、监控正常 |
|
|
39
|
+
|
|
40
|
+
## 使用示例
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
trae调用 BDD风格验收标准SDD 需求名称=用户登录
|
|
44
|
+
trae调用 BDD风格验收标准SDD 需求名称=订单支付 模块=支付系统
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 版本
|
|
48
|
+
|
|
49
|
+
v4.1.0
|
|
@@ -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
|
+
在代码库中 grep 实际使用情况
|
|
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
|
+
✅ "在代码库中 grep 了一下——没有任何地方调用这个接口。删掉它(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
|
+
不要敷衍附和。始终保持技术严谨。
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: requesting-code-review
|
|
3
|
+
description: 完成任务、实现重要功能或合并前使用,用于验证工作成果是否符合要求
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 请求代码审查
|
|
7
|
+
|
|
8
|
+
派遣 superpowers:code-reviewer 子代理来在问题扩散之前发现它们。审查者获得的是精心组织的评估上下文——绝不是你的会话历史。这样可以让审查者专注于工作成果而非你的思考过程,同时保留你自己的上下文以便继续工作。
|
|
9
|
+
|
|
10
|
+
**核心原则:** 早审查,勤审查。
|
|
11
|
+
|
|
12
|
+
## 何时请求审查
|
|
13
|
+
|
|
14
|
+
**必须审查:**
|
|
15
|
+
- 子代理驱动开发中每个任务完成后
|
|
16
|
+
- 完成重要功能后
|
|
17
|
+
- 合并到 main 之前
|
|
18
|
+
|
|
19
|
+
**可选但有价值:**
|
|
20
|
+
- 卡住时(换个视角)
|
|
21
|
+
- 重构之前(建立基线)
|
|
22
|
+
- 修复复杂 bug 之后
|
|
23
|
+
|
|
24
|
+
## 如何请求
|
|
25
|
+
|
|
26
|
+
**1. 获取 git SHA:**
|
|
27
|
+
```bash
|
|
28
|
+
BASE_SHA=$(git rev-parse HEAD~1) # 或 origin/main
|
|
29
|
+
HEAD_SHA=$(git rev-parse HEAD)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**2. 派遣 code-reviewer 子代理:**
|
|
33
|
+
|
|
34
|
+
使用 Task 工具,指定 superpowers:code-reviewer 类型,填写 `code-reviewer.md` 中的模板
|
|
35
|
+
|
|
36
|
+
**占位符说明:**
|
|
37
|
+
- `{WHAT_WAS_IMPLEMENTED}` - 你刚完成的内容
|
|
38
|
+
- `{PLAN_OR_REQUIREMENTS}` - 预期功能
|
|
39
|
+
- `{BASE_SHA}` - 起始提交
|
|
40
|
+
- `{HEAD_SHA}` - 结束提交
|
|
41
|
+
- `{DESCRIPTION}` - 简要说明
|
|
42
|
+
|
|
43
|
+
**3. 处理反馈:**
|
|
44
|
+
- Critical 问题立即修复
|
|
45
|
+
- Important 问题在继续之前修复
|
|
46
|
+
- Minor 问题记录下来稍后处理
|
|
47
|
+
- 如果审查者有误,用技术理由反驳
|
|
48
|
+
|
|
49
|
+
## 示例
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
[刚完成任务 2:添加验证功能]
|
|
53
|
+
|
|
54
|
+
你:让我在继续之前请求代码审查。
|
|
55
|
+
|
|
56
|
+
BASE_SHA=$(git log --oneline | grep "Task 1" | head -1 | awk '{print $1}')
|
|
57
|
+
HEAD_SHA=$(git rev-parse HEAD)
|
|
58
|
+
|
|
59
|
+
[派遣 superpowers:code-reviewer 子代理]
|
|
60
|
+
WHAT_WAS_IMPLEMENTED: 会话索引的验证和修复功能
|
|
61
|
+
PLAN_OR_REQUIREMENTS: docs/superpowers/plans/deployment-plan.md 中的任务 2
|
|
62
|
+
BASE_SHA: a7981ec
|
|
63
|
+
HEAD_SHA: 3df7661
|
|
64
|
+
DESCRIPTION: 添加了 verifyIndex() 和 repairIndex(),支持 4 种问题类型
|
|
65
|
+
|
|
66
|
+
[子代理返回]:
|
|
67
|
+
优点:架构清晰,测试真实
|
|
68
|
+
问题:
|
|
69
|
+
Important:缺少进度指示器
|
|
70
|
+
Minor:报告间隔使用了魔法数字 (100)
|
|
71
|
+
评估:可以继续
|
|
72
|
+
|
|
73
|
+
你:[修复进度指示器]
|
|
74
|
+
[继续任务 3]
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## 与工作流的集成
|
|
78
|
+
|
|
79
|
+
**子代理驱动开发:**
|
|
80
|
+
- 每个任务完成后审查
|
|
81
|
+
- 在问题叠加之前发现它们
|
|
82
|
+
- 修复后再进入下一个任务
|
|
83
|
+
|
|
84
|
+
**执行计划:**
|
|
85
|
+
- 每批(3 个任务)后审查
|
|
86
|
+
- 获取反馈,修复,继续
|
|
87
|
+
|
|
88
|
+
**临时开发:**
|
|
89
|
+
- 合并前审查
|
|
90
|
+
- 卡住时审查
|
|
91
|
+
|
|
92
|
+
## 红线
|
|
93
|
+
|
|
94
|
+
**绝不要:**
|
|
95
|
+
- 因为"很简单"就跳过审查
|
|
96
|
+
- 忽略 Critical 问题
|
|
97
|
+
- 带着未修复的 Important 问题继续推进
|
|
98
|
+
- 对合理的技术反馈进行争辩
|
|
99
|
+
|
|
100
|
+
**如果审查者有误:**
|
|
101
|
+
- 用技术理由反驳
|
|
102
|
+
- 展示证明其可行的代码/测试
|
|
103
|
+
- 要求澄清
|
|
104
|
+
|
|
105
|
+
参见模板:requesting-code-review/code-reviewer.md
|