sdd-skills 1.0.2 → 1.1.1

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.
@@ -36,17 +36,23 @@ Pre-Execution Review (多角色讨论)
36
36
 
37
37
  SAE (需求分析 + 架构设计)
38
38
 
39
- Backend/Frontend Engineer (OpenSpec + 代码实现 + 验证)
40
-
41
- Tester (测试验证)
42
-
43
- Code Reviewer (代码审查)
44
-
45
- Git Engineer (预检测 + 提交 + MR)
46
-
47
- 完成 (等待 MR 批准)
39
+ ├─→ Backend Engineer (OpenSpec + 代码实现 + 验证) ─┐
40
+ │ │
41
+ └─→ Frontend Engineer (OpenSpec + 代码实现 + 验证)─┘
42
+
43
+ (前后端并行开发)
44
+
45
+ Tester (测试验证)
46
+
47
+ Code Reviewer (代码审查)
48
+
49
+ Git Engineer (预检测 + 提交 + MR)
50
+
51
+ 完成 (等待 MR 批准)
48
52
  ```
49
53
 
54
+ **注意**: Backend 和 Frontend Engineer 可以并行开发,通过 API 契约协作,无需等待对方完成。
55
+
50
56
  ---
51
57
 
52
58
  ## 角色说明
@@ -217,6 +223,10 @@ Git Engineer (预检测 + 提交 + MR)
217
223
  - 数据模型
218
224
  - 验收标准
219
225
 
226
+ ### 阶段 2-3: 前后端并行实现
227
+
228
+ **重要**: Backend 和 Frontend Engineer 可以并行开发,通过 SAE 定义的 API 契约协作。前端可以使用 Mock 数据进行开发,后端提供符合契约的 API 实现。
229
+
220
230
  ### 阶段 2: 后端实现 (Backend Engineer)
221
231
 
222
232
  **输入**: 需求规格文档
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sdd-skills",
3
- "version": "1.0.2",
3
+ "version": "1.1.1",
4
4
  "description": "Spec-Driven Development Skills for Claude Code - SAE/ADE workflow automation",
5
5
  "type": "module",
6
6
  "main": "install.js",
@@ -0,0 +1,363 @@
1
+ # Backend Engineer OpenSpec 评审指南
2
+
3
+ ## 何时需要评审
4
+
5
+ **仅在以下情况下加载此评审指南**:
6
+ - Backend OpenSpec 已生成,需要评审验证
7
+ - 用户明确要求对后端 OpenSpec 进行评审
8
+ - 代码实现完成,需要对照 OpenSpec 进行符合性评审
9
+
10
+ ## 评审目标
11
+
12
+ 确保后端 OpenSpec 的完整性、正确性、可实施性,验证代码实现符合 OpenSpec 要求。
13
+
14
+ ## 评审检查清单
15
+
16
+ ### 1. API 设计评审
17
+
18
+ - [ ] **RESTful 规范**: API 设计是否遵循 RESTful 最佳实践?
19
+ - [ ] **HTTP 方法**: GET/POST/PUT/DELETE 使用是否正确?
20
+ - [ ] **URL 设计**: 路径是否清晰?资源命名是否合理?
21
+ - [ ] **版本管理**: 是否有 API 版本控制(如 /api/v1/)?
22
+ - [ ] **幂等性**: PUT/DELETE 操作是否幂等?
23
+
24
+ **示例检查**:
25
+ ```go
26
+ // ❌ 不符合 RESTful
27
+ POST /api/getUserById
28
+
29
+ // ✅ 符合 RESTful
30
+ GET /api/v1/users/:id
31
+ ```
32
+
33
+ ### 2. 请求/响应设计评审
34
+
35
+ - [ ] **请求参数**: 必需参数和可选参数是否明确?
36
+ - [ ] **参数验证**: 是否定义了参数类型、格式、取值范围?
37
+ - [ ] **响应格式**: 是否统一?包含 code, message, data?
38
+ - [ ] **错误码**: 是否定义了完整的错误码体系?
39
+ - [ ] **分页**: 列表接口是否支持分页?
40
+
41
+ **响应格式检查**:
42
+ ```go
43
+ // ✅ 统一的响应格式
44
+ type Response struct {
45
+ Code int `json:"code"`
46
+ Message string `json:"message"`
47
+ Data interface{} `json:"data,omitempty"`
48
+ }
49
+ ```
50
+
51
+ ### 3. 数据模型评审
52
+
53
+ - [ ] **表设计**: 表结构是否合理?字段类型是否正确?
54
+ - [ ] **索引设计**: 是否为常用查询字段添加索引?
55
+ - [ ] **外键约束**: 关系是否正确定义?
56
+ - [ ] **软删除**: 是否需要软删除?deleted_at 字段是否添加?
57
+ - [ ] **时间戳**: created_at, updated_at 是否添加?
58
+
59
+ **模型定义检查**:
60
+ ```go
61
+ type User struct {
62
+ ID uint `gorm:"primaryKey"`
63
+ Email string `gorm:"uniqueIndex;not null"`
64
+ Password string `gorm:"not null"`
65
+ Name string `gorm:"index"`
66
+ CreatedAt time.Time
67
+ UpdatedAt time.Time
68
+ DeletedAt gorm.DeletedAt `gorm:"index"`
69
+ }
70
+ ```
71
+
72
+ ### 4. 业务逻辑评审
73
+
74
+ - [ ] **Service 层**: 业务逻辑是否正确实现?
75
+ - [ ] **事务处理**: 是否正确使用数据库事务?
76
+ - [ ] **并发安全**: 是否考虑并发访问场景?需要锁吗?
77
+ - [ ] **幂等性**: 重复请求是否会产生副作用?
78
+ - [ ] **状态机**: 状态流转是否正确?
79
+
80
+ ### 5. 安全性评审
81
+
82
+ - [ ] **认证授权**: JWT/Session 实现是否正确?
83
+ - [ ] **密码安全**: 是否使用 bcrypt 等安全算法加密?
84
+ - [ ] **SQL 注入**: 是否使用参数化查询?
85
+ - [ ] **XSS 防护**: 输出是否转义?
86
+ - [ ] **CSRF 防护**: 是否有 CSRF token 验证?
87
+ - [ ] **敏感信息**: 日志中是否泄露密码、token 等?
88
+
89
+ **安全检查示例**:
90
+ ```go
91
+ // ✅ 正确:参数化查询
92
+ db.Where("email = ?", email).First(&user)
93
+
94
+ // ❌ 危险:SQL 拼接
95
+ query := "SELECT * FROM users WHERE email = '" + email + "'"
96
+
97
+ // ✅ 正确:密码加密
98
+ hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
99
+
100
+ // ❌ 危险:明文存储
101
+ user.Password = password
102
+ ```
103
+
104
+ ### 6. 性能评审
105
+
106
+ - [ ] **N+1 查询**: 是否使用 Preload 避免 N+1 查询?
107
+ - [ ] **索引使用**: 查询是否命中索引?
108
+ - [ ] **分页查询**: 大数据量是否使用分页?
109
+ - [ ] **缓存策略**: 热点数据是否使用缓存(Redis)?
110
+ - [ ] **批量操作**: 是否使用批量插入/更新?
111
+
112
+ **性能优化示例**:
113
+ ```go
114
+ // ❌ N+1 查询
115
+ for _, user := range users {
116
+ db.Model(&user).Association("Orders").Find(&user.Orders)
117
+ }
118
+
119
+ // ✅ 预加载
120
+ db.Preload("Orders").Find(&users)
121
+ ```
122
+
123
+ ### 7. 错误处理评审
124
+
125
+ - [ ] **错误不忽略**: 是否检查所有 error 返回值?
126
+ - [ ] **错误包装**: 是否使用 fmt.Errorf("%w") 包装错误?
127
+ - [ ] **错误日志**: 是否记录错误日志?
128
+ - [ ] **用户友好**: 错误消息是否用户可读?
129
+ - [ ] **错误分类**: 是否区分系统错误和业务错误?
130
+
131
+ ```go
132
+ // ✅ 正确的错误处理
133
+ if err := db.Create(&user).Error; err != nil {
134
+ log.Error("Failed to create user", zap.Error(err))
135
+ return nil, fmt.Errorf("create user failed: %w", err)
136
+ }
137
+
138
+ // ❌ 忽略错误
139
+ db.Create(&user)
140
+ ```
141
+
142
+ ### 8. 测试覆盖评审
143
+
144
+ - [ ] **单元测试**: 覆盖率是否 >= 90%?
145
+ - [ ] **测试用例**: 是否覆盖正常和异常流程?
146
+ - [ ] **表驱动测试**: 是否使用表驱动测试模式?
147
+ - [ ] **Mock 依赖**: 是否正确 mock 外部依赖?
148
+ - [ ] **集成测试**: 是否有 API 集成测试?
149
+
150
+ ## 评审标准
151
+
152
+ ### ✅ 评审通过标准
153
+
154
+ 1. **API 设计规范**: 遵循 RESTful 规范,URL 设计合理
155
+ 2. **数据模型完整**: 表结构、索引、约束定义完整
156
+ 3. **安全性达标**: 无 SQL 注入、XSS 等安全漏洞
157
+ 4. **性能可接受**: 无 N+1 查询,使用索引和缓存
158
+ 5. **错误处理完善**: 所有错误都正确处理和记录
159
+ 6. **测试覆盖充分**: >= 90% 单元测试覆盖率
160
+
161
+ ### ❌ 评审不通过场景
162
+
163
+ 1. **安全漏洞**: 存在 SQL 注入、密码明文存储等安全问题
164
+ 2. **性能问题**: N+1 查询、缺少索引、未分页
165
+ 3. **错误处理缺失**: 忽略 error 返回值
166
+ 4. **测试不足**: 覆盖率 < 90%,缺少关键测试用例
167
+ 5. **API 设计不规范**: 不符合 RESTful 规范
168
+
169
+ ## 评审流程
170
+
171
+ ### 1. OpenSpec 评审
172
+
173
+ **检查 OpenSpec 文档**:
174
+ ```markdown
175
+ □ API 端点定义完整(方法、路径、参数、响应)
176
+ □ 数据模型定义清晰(字段、类型、约束)
177
+ □ 错误码定义完整
178
+ □ 性能要求明确(响应时间、并发量)
179
+ □ 安全要求明确(认证、授权、加密)
180
+ ```
181
+
182
+ ### 2. 代码实现评审
183
+
184
+ **对照 OpenSpec 检查代码**:
185
+ ```markdown
186
+ □ Handler 层实现所有 API 端点
187
+ □ Service 层实现所有业务逻辑
188
+ □ Repository 层实现所有数据访问
189
+ □ Model 定义与 OpenSpec 一致
190
+ □ 测试用例覆盖所有场景
191
+ ```
192
+
193
+ ### 3. 安全和性能审查
194
+
195
+ 使用自动化工具:
196
+ ```bash
197
+ # 安全扫描
198
+ gosec ./...
199
+
200
+ # 性能分析
201
+ go test -bench=. -benchmem
202
+
203
+ # 竞态检测
204
+ go test -race ./...
205
+ ```
206
+
207
+ ### 4. 测试覆盖率检查
208
+
209
+ ```bash
210
+ go test ./... -coverprofile=coverage.out
211
+ go tool cover -func=coverage.out | grep total
212
+
213
+ # 要求: >= 90%
214
+ ```
215
+
216
+ ## 评审记录模板
217
+
218
+ ```markdown
219
+ ## Backend OpenSpec 评审记录
220
+
221
+ **评审日期**: YYYY-MM-DD
222
+ **评审人**: [Backend Engineer 姓名]
223
+ **OpenSpec 版本**: v1.0
224
+
225
+ ### API 设计评审
226
+
227
+ - [ ] RESTful 规范: ✅ 通过 / ❌ 不通过
228
+ - [ ] 请求/响应格式: ✅ 通过 / ❌ 不通过
229
+ - [ ] 错误码定义: ✅ 通过 / ❌ 不通过
230
+
231
+ **问题列表**:
232
+ 1. [问题描述] - [修复建议]
233
+
234
+ ### 安全性评审
235
+
236
+ - [ ] SQL 注入防护: ✅ 通过 / ❌ 不通过
237
+ - [ ] 密码加密: ✅ 通过 / ❌ 不通过
238
+ - [ ] 认证授权: ✅ 通过 / ❌ 不通过
239
+
240
+ **问题列表**:
241
+ 1. [问题描述] - [修复建议]
242
+
243
+ ### 性能评审
244
+
245
+ - [ ] N+1 查询: ✅ 无问题 / ❌ 发现问题
246
+ - [ ] 索引使用: ✅ 合理 / ❌ 需优化
247
+ - [ ] 缓存策略: ✅ 合理 / ❌ 需优化
248
+
249
+ **问题列表**:
250
+ 1. [问题描述] - [修复建议]
251
+
252
+ ### 测试评审
253
+
254
+ - 单元测试覆盖率: [X]%
255
+ - 测试用例数量: [N] 个
256
+ - 集成测试: ✅ 完成 / ❌ 缺失
257
+
258
+ ### 评审结论
259
+
260
+ - [ ] ✅ 通过,可以进入测试阶段
261
+ - [ ] ⚠️ 有条件通过,修复以下问题后可进入测试
262
+ - [ ] ❌ 不通过,需要重大修订
263
+
264
+ ### 待修复问题
265
+
266
+ 1. [严重] [问题描述] - [修复建议]
267
+ 2. [中等] [问题描述] - [修复建议]
268
+ ```
269
+
270
+ ## 常见问题和解决方案
271
+
272
+ ### Q1: OpenSpec 与实际实现不一致怎么办?
273
+
274
+ **解决方案**:
275
+ - 如果 OpenSpec 错误,更新 OpenSpec 并重新评审
276
+ - 如果代码实现错误,修复代码使其符合 OpenSpec
277
+ - 记录变更原因和决策
278
+
279
+ ### Q2: 测试覆盖率达不到 90% 怎么办?
280
+
281
+ **解决方案**:
282
+ - 使用 `go tool cover -html=coverage.out` 查看未覆盖代码
283
+ - 补充测试用例覆盖关键分支和边界情况
284
+ - 对于不可测试的代码(如初始化代码),可适当豁免
285
+
286
+ ### Q3: 发现性能瓶颈怎么办?
287
+
288
+ **解决方案**:
289
+ - 使用 `go test -bench` 进行基准测试
290
+ - 使用 `pprof` 分析 CPU 和内存使用
291
+ - 优化数据库查询(索引、预加载、缓存)
292
+ - 考虑异步处理或消息队列
293
+
294
+ ### Q4: 如何评审并发安全性?
295
+
296
+ **解决方案**:
297
+ - 运行 `go test -race` 检测数据竞争
298
+ - 检查共享状态是否使用 mutex 保护
299
+ - 验证 goroutine 是否正确管理(避免泄漏)
300
+ - 使用 channel 进行安全通信
301
+
302
+ ## 质量标准
303
+
304
+ ### 优秀的 Backend 实现特征
305
+
306
+ 1. **代码规范**: 遵循 Go 代码规范,通过 golangci-lint
307
+ 2. **安全可靠**: 无安全漏洞,错误处理完善
308
+ 3. **性能优秀**: 响应时间 < 200ms (P95),无 N+1 查询
309
+ 4. **测试充分**: >= 90% 覆盖率,测试用例全面
310
+ 5. **可维护**: 代码结构清晰,注释完整
311
+
312
+ ### 需要改进的实现特征
313
+
314
+ 1. **安全问题**: SQL 注入、密码明文、未认证
315
+ 2. **性能问题**: N+1 查询、缺少索引、未分页
316
+ 3. **错误处理**: 忽略 error,未记录日志
317
+ 4. **测试不足**: 覆盖率 < 90%,缺少边界测试
318
+ 5. **代码混乱**: 逻辑复杂,缺少注释
319
+
320
+ ## 工具推荐
321
+
322
+ ### 静态分析工具
323
+
324
+ ```bash
325
+ # 代码规范检查
326
+ golangci-lint run
327
+
328
+ # 安全漏洞扫描
329
+ gosec ./...
330
+
331
+ # 依赖安全检查
332
+ go list -json -m all | nancy sleuth
333
+ ```
334
+
335
+ ### 性能分析工具
336
+
337
+ ```bash
338
+ # 基准测试
339
+ go test -bench=. -benchmem
340
+
341
+ # CPU profiling
342
+ go test -cpuprofile=cpu.prof
343
+ go tool pprof cpu.prof
344
+
345
+ # 内存 profiling
346
+ go test -memprofile=mem.prof
347
+ go tool pprof mem.prof
348
+ ```
349
+
350
+ ### 测试工具
351
+
352
+ ```bash
353
+ # 覆盖率报告
354
+ go test ./... -coverprofile=coverage.out
355
+ go tool cover -html=coverage.out
356
+
357
+ # 竞态检测
358
+ go test -race ./...
359
+ ```
360
+
361
+ ---
362
+
363
+ **记住**: 高质量的后端代码是系统稳定性的基石。严格的评审能及早发现问题,降低生产环境风险。