@zhouhao4221/devflow-skills 0.3.6 → 0.3.7

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.
Files changed (40) hide show
  1. package/package.json +1 -1
  2. package/plugins/diag/templates/services.yaml.template +31 -0
  3. package/plugins/req/skills/branch/SKILL.md +48 -377
  4. package/plugins/req/skills/dev/SKILL.md +1 -1
  5. package/plugins/req/skills/dev-guide/SKILL.md +74 -399
  6. package/plugins/req/skills/do/SKILL.md +1 -1
  7. package/plugins/req/skills/done/SKILL.md +2 -2
  8. package/plugins/req/skills/edit/SKILL.md +1 -1
  9. package/plugins/req/skills/fix/SKILL.md +1 -1
  10. package/plugins/req/skills/init/SKILL.md +66 -430
  11. package/plugins/req/skills/issue/SKILL.md +1 -1
  12. package/plugins/req/skills/migrate/SKILL.md +1 -1
  13. package/plugins/req/skills/natural-language-dispatcher/SKILL.md +78 -438
  14. package/plugins/req/skills/new/SKILL.md +1 -1
  15. package/plugins/req/skills/pr/SKILL.md +1 -1
  16. package/plugins/req/skills/prd/SKILL.md +1 -1
  17. package/plugins/req/skills/prd-edit/SKILL.md +1 -1
  18. package/plugins/req/skills/release/SKILL.md +1 -1
  19. package/plugins/req/skills/review/SKILL.md +1 -1
  20. package/plugins/req/skills/review-pr/SKILL.md +74 -601
  21. package/plugins/req/skills/test/SKILL.md +41 -355
  22. package/plugins/req/skills/test_new/SKILL.md +36 -356
  23. package/plugins/req/skills/test_regression/SKILL.md +1 -1
  24. package/plugins/req/skills/update-template/SKILL.md +1 -1
  25. package/plugins/req/skills/use/SKILL.md +1 -1
  26. package/plugins/req/templates/claude-md-snippets/frontend-react.md +48 -0
  27. package/plugins/req/templates/claude-md-snippets/generic.md +43 -0
  28. package/plugins/req/templates/claude-md-snippets/go-backend.md +47 -0
  29. package/plugins/req/templates/claude-md-snippets/java-backend.md +46 -0
  30. package/plugins/req/templates/docker-compose.test.yml +84 -0
  31. package/plugins/req/templates/index-template.md +60 -0
  32. package/plugins/req/templates/module-template.md +79 -0
  33. package/plugins/req/templates/prd-template.md +338 -0
  34. package/plugins/req/templates/quick-template.md +71 -0
  35. package/plugins/req/templates/release-prompt-template.md +51 -0
  36. package/plugins/req/templates/requirement-template.md +256 -0
  37. package/plugins/req/templates/scripts/test-env.sh +226 -0
  38. package/plugins/req/templates/tests/e2e/playwright.config.ts +86 -0
  39. package/plugins/uat/templates/flow-template.md +116 -0
  40. package/plugins/uat/templates/testid-convention.md +42 -0
@@ -5,12 +5,11 @@ description: PR 审查与合并 - AI 代码审查、提交评论、合并 PR
5
5
 
6
6
  # PR 审查与合并
7
7
 
8
- 对已创建的 PR 进行 AI 代码审查,可将审查意见提交到平台(Gitea/GitHub),审查通过后合并 PR。
8
+ 对已创建的 PR 进行 AI 代码审查,可将审查意见提交到平台,审查通过后合并 PR。
9
9
 
10
- > 此命令**不受仓库角色限制**,readonly 仓库也可执行。
11
- > 不触发缓存同步。
10
+ > 不受仓库角色限制,readonly 可执行。不触发缓存同步。
12
11
  >
13
- > **CLI 优先级**:GitHub `gh pr` / `gh api`;Gitea [`_gitea_cli.md`](./_gitea_cli.md) 检测 `tea`:**列表/查看/合并** 走 `tea pulls ls|<N>|merge`,**评论** 走 `tea comment <PR-N>`;但 **PR diff、行内 review 评论、reviews 详情**等 tea 未覆盖的接口仍走本文中的 curl 示例。
12
+ > CLI 优先级:GitHub `gh pr`/`gh api`;Gitea 检测 `tea` CLI,可用即走 `tea`,否则回退 curl。API 细节:PR 评论用 `/issues/{N}/comments`;行内评论先 `GET /pulls/{N}/reviews` 再逐条 `/reviews/{ID}/comments`。
14
13
 
15
14
  ## 命令格式
16
15
 
@@ -18,678 +17,152 @@ description: PR 审查与合并 - AI 代码审查、提交评论、合并 PR
18
17
  /req:review-pr [子命令] [REQ-XXX]
19
18
  ```
20
19
 
21
- ## 子命令
20
+ | 子命令 | 说明 |
21
+ |--------|------|
22
+ | (空) | 查看 PR 状态 |
23
+ | `review` | AI 代码审查 |
24
+ | `fetch-comments` | 拉取 PR 评论,AI 生成修改清单并应用 |
25
+ | `merge` | 合并 PR |
22
26
 
23
- | 子命令 | 说明 | 示例 |
24
- |--------|------|------|
25
- | (空) | 查看 PR 状态 | `/req:review-pr` |
26
- | `review` | AI 代码审查 | `/req:review-pr review` |
27
- | `fetch-comments` | 拉取 PR 评论,AI 生成修改清单并应用 | `/req:review-pr fetch-comments` |
28
- | `merge` | 合并 PR | `/req:review-pr merge` |
29
-
30
- - 省略编号时从当前分支自动匹配需求
31
- - 未指定子命令时展示 PR 状态概览
27
+ 省略编号时从当前分支自动匹配。
32
28
 
33
29
  ---
34
30
 
35
31
  ## 前置条件
36
32
 
37
- 本命令依赖 `/req:pr` 已创建的 PR。如果需求没有关联的 PR
38
-
39
- ```
40
- ❌ 未找到关联的 PR
41
-
42
- 请先创建 PR:/req:pr [REQ-XXX]
43
- ```
33
+ 依赖 `/req:pr` 已创建 PR。未找到关联 PR 时提示先创建。
44
34
 
45
35
  ---
46
36
 
47
- ## 执行流程(查看状态)
48
-
49
- ### 1. 识别需求和 PR
50
-
51
- **指定编号** → 读取该需求文档
52
- **未指定** → 从当前分支名匹配需求编号(`REQ-\d+` 或 `QUICK-\d+`)
53
-
54
- ### 2. 查询 PR 信息
55
-
56
- 根据 `repoType` 查询 PR:从需求文档 `branch` 字段取分支名,按平台 API 查询关联的 open PR(Gitea 需指定 `head=OWNER:branch`)。
57
-
58
- ### 3. 展示状态
59
-
60
- ```
61
- PR 状态:REQ-001 用户积分规则管理
62
-
63
- PR #42: feat(REQ-001): 用户积分规则管理
64
- 状态:Open
65
- 合并方向:feat/REQ-001-user-points → develop
66
- 可合并:✅ 无冲突 / ❌ 有冲突
67
- 审查:未审查 / ✅ 已通过 / ❌ 需修改
37
+ ## 查看状态
68
38
 
69
- 可用操作:
70
- - /req:review-pr review AI 代码审查
71
- - /req:review-pr merge 合并 PR
72
- ```
39
+ 根据 `repoType` 查询 PR(从需求文档 `branch` 字段取分支名)。展示:PR 编号、标题、状态、合并方向、是否可合并、审查状态、可用操作。
73
40
 
74
41
  ---
75
42
 
76
- ## 执行流程(review - AI 代码审查)
43
+ ## review AI 代码审查
77
44
 
78
45
  ### 1. 获取 PR diff
79
46
 
80
- 按平台获取 PR diff(Gitea:`GET /pulls/{N}.diff`;GitHub:`gh pr diff`)。
81
-
82
- ### 2. 读取审查规范
83
-
84
- 按优先级读取审查依据:
85
- 1. 项目 CLAUDE.md 中的**开发规范**章节(错误处理、日志、API 风格等)
86
- 2. 项目 CLAUDE.md 中的**测试规范**章节
87
- 3. 需求文档中的**功能清单**和**业务规则**(验证实现是否匹配需求)
88
-
89
- ### 2.5 对比需求文档与实际实现
90
-
91
- 读取需求文档并与 diff 实际内容交叉检查,找出**文档与代码不一致**的地方,稍后在报告中以「需求文档同步」章节提醒用户更新。
92
-
93
- **检查维度:**
94
-
95
- | 检查项 | 如何判断 | 提醒内容 |
96
- |--------|---------|---------|
97
- | 状态字段 | 文档状态是否为「开发中 / 测试中」 | 仍为「待评审/草稿」时提醒先走 `/req:review pass` 再合并 |
98
- | 功能清单 (第二章) | diff 是否覆盖清单中每一项 | 未覆盖的项列出;diff 多出的新功能也列出 |
99
- | 接口需求 (第五章) | diff 中新增/修改的路由、DTO 是否在文档中记录 | 缺失的接口列出,建议补充 |
100
- | 数据模型 (11.1) | diff 中的表/字段变更是否在文档中描述 | 未记录的 Model 变更列出 |
101
- | 文件改动清单 (11.3) | diff 实际修改的文件 vs 清单列出的文件 | 两侧差异双向列出(实际多了哪些 / 清单多了哪些) |
102
- | 实现步骤 (11.4) | 清单步骤是否都能在 diff 中找到对应痕迹 | 未落实的步骤列出 |
103
- | 业务规则 (第三章) | 关键规则是否在代码中体现(如余额校验、权限校验) | 代码里找不到校验痕迹的规则列出 |
104
- | 关联需求 | 文档「关联」字段引用的其他需求 | 列出便于用户判断是否需同步更新关联方 |
105
-
106
- **读取路径**:
107
- - `primary` 仓库:`docs/requirements/active/<REQ-ID>-*.md`
108
- - `readonly` 仓库:`~/.claude-requirements/projects/<project>/active/<REQ-ID>-*.md`
109
-
110
- **未找到需求文档时**(如 `/req:fix`、`/req:do` 创建的无文档分支)跳过本步骤,仅做代码审查。
111
-
112
- ### 3. AI 逐文件审查
113
-
114
- 对 diff 中每个变更文件进行审查,检查维度:
115
-
116
- | 维度 | 检查内容 |
117
- |------|---------|
118
- | 正确性 | 逻辑是否正确,边界条件是否处理 |
119
- | 安全性 | SQL 注入、XSS、敏感信息泄露、权限校验 |
120
- | 错误处理 | 异常是否捕获,错误是否正确返回 |
121
- | 命名规范 | 变量/函数/文件命名是否符合项目规范 |
122
- | 代码风格 | 是否符合项目 CLAUDE.md 中的编码规范 |
123
- | 需求匹配 | 实现是否覆盖需求文档中的功能清单 |
124
- | 测试覆盖 | 关键逻辑是否有测试,测试是否充分 |
125
-
126
- ### 4. 输出审查报告
127
-
128
- 问题分三级:
129
-
130
- | 级别 | 含义 | 影响 |
131
- |------|------|------|
132
- | 阻塞 | 必须修复才能合并 | 阻止合并 |
133
- | 建议 | 建议修改但不阻止合并 | 不阻止 |
134
- | 信息 | 知识分享、风格偏好 | 不阻止 |
135
-
136
- 报告结构包含两部分:
137
- 1. **代码审查**://分级的代码问题
138
- 2. **需求文档同步**:步骤 2.5 中发现的文档与代码偏差(不阻止合并,但建议用户 `/req:edit` 补齐)
139
-
140
- 输出格式:
141
-
142
- ```
143
- AI 代码审查报告:PR #42
144
-
145
- 审查文件:8 个
146
- 审查结果:1 个阻塞 | 3 个建议 | 2 个信息
147
- 需求同步:⚠️ 3 项待更新
148
-
149
- ---
150
-
151
- 阻塞问题:
152
-
153
- internal/user/biz/points.go:45
154
- 问题:积分扣减未检查余额是否充足,可能导致负数
155
- 建议:添加余额校验 `if user.Points < amount { return ErrInsufficientPoints }`
156
-
157
- ---
158
-
159
- 建议:
160
-
161
- internal/user/controller/v1/points.go:23
162
- 问题:缺少请求参数校验
163
- 建议:对 amount 字段添加 min=1 校验
164
-
165
- internal/user/store/points_store.go:67
166
- 问题:批量操作未使用事务
167
- 建议:用 db.Transaction() 包裹
168
-
169
- internal/user/model/points_record.go:12
170
- 问题:CreatedAt 字段缺少 json tag
171
- 建议:添加 `json:"created_at"`
172
-
173
- ---
174
-
175
- 信息:
176
-
177
- internal/user/biz/points.go:20
178
- 备注:可以考虑将积分规则抽为配置,方便后续调整
179
-
180
- internal/user/router.go:34
181
- 备注:路由分组命名建议统一为 /api/v1/points(当前为 /api/v1/point)
182
-
183
- ---
184
-
185
- 需求文档同步(REQ-001):
186
-
187
- ⚠️ 文件改动清单未同步
188
- 文档第 11.3 节缺失:
189
- + internal/user/store/points_record_store.go
190
- + internal/user/model/points_record.go
191
- 文档第 11.3 节多余(实际未改动):
192
- - internal/user/controller/v1/admin_points.go
193
-
194
- ⚠️ 接口未记录
195
- diff 新增路由 POST /api/v1/points/transfer,文档第五章未记录
196
-
197
- ⚠️ 功能清单覆盖不全
198
- 文档第二章列出但 diff 中未找到实现:
199
- - "积分过期自动清理"
200
-
201
- 建议执行:/req:edit REQ-001,补齐以上内容
202
-
203
- ---
204
-
205
- 总结:有 1 个阻塞问题需修复后才能合并;3 项需求文档待同步
206
-
207
- 可用操作:
208
- - 修复后重新提交:/req:commit
209
- - 修复后重新审查:/req:review-pr review
210
- - 更新需求文档:/req:edit REQ-001
211
- - 无阻塞后合并:/req:review-pr merge
212
- ```
213
-
214
- ### 5. 提交审查评论到平台
215
-
216
- **默认先询问用户是否提交**,除非指定 `--auto`。理由:AI 审查结果是会被 reviewer 看到的公开评论,上传前让用户有机会微调或取消。
217
-
218
- **5.0 零问题直通(无需询问)**
219
-
220
- 当同时满足以下条件时,判定为"完全没有问题",跳过 5.1 的预览和 5.2 的询问,直接用固定模板提交通过评论:
221
-
222
- - 阻塞数 = 0
223
- - 建议数 = 0
224
- - 需求文档同步项 = 0
225
-
226
- 信息级备注不影响判定(纯知识分享,不算问题)。
227
-
228
- **固定通过评论模板**(上传到 PR 的 Markdown 内容):
229
-
230
- ```markdown
231
- ### AI 审查通过 ✅
232
-
233
- 本次 PR 未发现阻塞问题、改进建议或需求文档同步项,代码符合项目规范,可以合并。
234
- ```
235
-
236
- **终端输出**:
237
-
238
- ```
239
- ✅ AI 审查未发现问题,已自动提交通过评论到 PR #42
240
- ${PR_URL}
241
- ```
242
-
243
- 随后进入步骤 6(无阻塞后续操作)。
244
-
245
- 有任一 //项时,走下方 5.1/5.2/5.3 的原流程。
246
-
247
- **5.1 展示精简版预览**
248
-
249
- 在询问前,先完整打印将要提交的精简版 Markdown 内容(见下面的"精简规则"和"精简后示例"),让用户看清楚要上传什么:
250
-
251
- ```
252
- 即将提交到 PR #42 的评审评论(预览):
253
-
254
-
255
- <精简版 Markdown 内容>
256
-
257
-
258
- 是否提交到 PR?(y/n,或输入修改意见)
259
- ```
260
-
261
- **5.2 等待确认**
262
-
263
- | 用户回复 | 行为 |
264
- |---------|------|
265
- | `y` / `yes` / `是` / 回车 | 执行上传 |
266
- | `n` / `no` / `否` / `取消` | 跳过上传,仅保留本地完整报告 |
267
- | 自由文本(修改意见) | 按用户意见调整精简版内容后重新预览并询问 |
268
-
269
- **5.3 `--auto` 跳过确认**
270
-
271
- 若用户传入 `--auto`(或通过自然语言触发词),跳过 5.2 的询问,直接上传。预览仍然打印,但不等待用户输入。
272
-
273
- `--auto` 触发方式:
274
- - 显式参数:`/req:review-pr review --auto`
275
- - 自然语言触发词(由 `natural-language-dispatcher` 识别):
276
- - "自动审查"、"一键审查"、"审查并提交"、"审完直接评论"
277
- - "不用确认"、"别问我"、"跑完再说"
278
- - 在 Git 平台 URL 场景下:"自动审查 owner/repo/pulls/158"
279
-
280
- 识别到 `--auto` 时,回复须明确说明能力边界:
281
-
282
- ```
283
- 识别:/req:review-pr review --auto
284
-
285
- --auto 会自动跳过:
286
- 上传评论前的确认询问
287
- 直接把精简版提交到 PR(本地仍保留完整报告)
288
-
289
- 无法跳过(Claude Code harness 层):
290
- - 首次调用 Bash(curl / gh)的工具权限确认
291
-
292
- 不会跳过:
293
- - AI 对代码的实际分析(审查逻辑本身)
294
- - 无阻塞问题时仍会明确结论"未发现明显问题",不凑字数
295
-
296
- 开始执行?
297
- ```
298
-
299
- 用户语气明确("一切自动"、"完全不用问我")时省略末尾的"开始执行?",直接执行。
300
-
301
- ---
302
-
303
- **精简规则**
304
-
305
- **上传到 PR 的是精简版,完整报告仅在本地终端展示**。PR 评论是给 reviewer 看的,只保留需要被看到的重点,过程性描述、逐文件列表、低优先级信息留在本地即可。
47
+ 按平台获取:Gitea `GET /pulls/{N}.diff`,GitHub `gh pr diff`。
306
48
 
307
- **精简规则:**
49
+ ### 2. 读取审查依据
308
50
 
309
- | 保留 | 去除 |
310
- |------|------|
311
- | 阻塞问题(全部) | 信息级备注 |
312
- | 建议中与需求/安全/正确性相关的关键项 | 风格、命名等次要建议 |
313
- | 需求文档同步的关键缺失(接口、数据模型、功能清单覆盖不全) | 文件改动清单的双向差异、关联需求列表 |
314
- | 一行总结:阻塞数、建议数、文档同步项数 | 「审查文件:X 个」「可用操作」等过程信息 |
51
+ 按优先级:项目 CLAUDE.md 开发规范 测试规范 → 需求文档功能清单和业务规则。
315
52
 
316
- - 只有"未发现明显问题"结论时,评论就一两句话,不要凑字数。
317
- - 评论总长度控制在 **300 字以内**为佳,超过时进一步压缩建议项。
318
- - 文件路径保留绝对路径和行号,便于 reviewer 跳转。
53
+ ### 3. 对比需求文档与实际实现
319
54
 
320
- **精简后示例(上传到 PR 的评论内容):**
55
+ 检查维度:
321
56
 
322
- ```markdown
323
- ### AI 审查:1 阻塞 / 1 建议 / 2 项文档待同步
57
+ | 检查项 | 判断依据 |
58
+ |--------|---------|
59
+ | 状态字段 | 文档状态是否为「开发中/测试中」 |
60
+ | 功能清单 | diff 是否覆盖清单每一项 |
61
+ | 接口需求 | diff 中路由/DTO 是否在文档中记录 |
62
+ | 数据模型 | 表/字段变更是否在文档中描述 |
63
+ | 文件改动清单 | diff 实际文件 vs 清单列出文件 |
64
+ | 实现步骤 | 清单步骤是否在 diff 中能找到 |
65
+ | 业务规则 | 关键规则是否在代码中体现 |
66
+ | 关联需求 | 文档「关联」字段引用 |
324
67
 
325
- **阻塞**
326
- - `internal/user/biz/points.go:45` 积分扣减未检查余额,可能为负 → 加 `if user.Points < amount` 校验
68
+ > primary 读 `docs/requirements/active/`,readonly 读 `~/.claude-requirements/projects/<project>/active/`。未找到需求文档时跳过此步。
327
69
 
328
- **关键建议**
329
- - `internal/user/store/points_store.go:67` 批量操作未使用事务
70
+ ### 4. AI 逐文件审查
330
71
 
331
- **需求文档同步(REQ-001)**
332
- - 新增路由 `POST /api/v1/points/transfer` 未记录(第五章)
333
- - 文件改动清单(11.3)与实际 diff 不一致
72
+ 审查维度:正确性、安全性、错误处理、命名规范、代码风格、需求匹配、测试覆盖。
334
73
 
335
- > 完整报告见本地终端输出。
336
- ```
337
-
338
- 按平台提交评论。**Gitea 注意**:PR 评论使用 `/issues/{N}/comments` 端点(不是 `/pulls/`)。
339
-
340
- **repoType = "other"**:仅本地展示,不提交评论,不触发确认询问。
341
-
342
- **上传成功**:
343
- ```
344
- ✅ 审查报告已提交到 PR #42(精简版)
345
- ${PR_URL}
346
- 完整报告见上方本地输出
347
- ```
348
-
349
- **用户拒绝上传**(仅在交互模式下可能):
350
- ```
351
- 已跳过上传,完整审查报告保留在本地终端输出
352
- 如需重新上传:/req:review-pr review --auto
353
- ```
354
-
355
- ### 6. 无阻塞时的后续操作
356
-
357
- **触发条件**(同时满足):
358
- - 阻塞数 = 0(可以有 /问题)
359
- - PR 当前为 Open 状态(审核中)
360
-
361
- 不满足时(有阻塞问题 / PR 已合并或关闭):跳过本步骤,结束。
362
-
363
- **6.0 检查是否有审核人**
364
-
365
- ```python
366
- # 来源 1:PR 上已分配的 reviewers(从 PR 详情读取)
367
- pr_reviewers = [r["login"] for r in pr_info.get("reviewers", [])]
368
-
369
- # 来源 2:branchStrategy.reviewers 配置(/req:pr 时自动设置的默认审核人)
370
- config_reviewers = settings.get("branchStrategy", {}).get("reviewers", [])
371
-
372
- has_reviewer = bool(pr_reviewers or config_reviewers)
373
- ```
374
-
375
- **有审核人**(`has_reviewer = True`)→ 展示「审核通过」选项(见 6.1)。
376
-
377
- **无审核人**(`has_reviewer = False`)→ 跳到 6.2,仅展示合并选项。
378
-
379
- **6.1 有审核人时——提示是否提交审核通过状态**
380
-
381
- ```
382
- ✅ 审查完成,PR #42 无阻塞问题
383
-
384
- 审核人:@alice, @bob
385
-
386
- 是否在平台提交「审核通过」状态?
387
- [y] 提交审核通过 — 在 GitHub/Gitea 将你的 Review 状态更新为 Approved
388
- [n] 暂不处理 — 保留当前审核状态不变
389
-
390
- 请输入(y/n,回车默认不处理):
391
- ```
74
+ ### 5. 输出审查报告
392
75
 
393
- **6.2 无审核人时——仅展示当前结果**
76
+ 问题分三级:**阻塞**(阻止合并)、**建议**(不阻止)、**信息**(知识分享)。
394
77
 
395
- ```
396
- ✅ 审查完成,PR #42 无阻塞问题(无分配审核人)
397
-
398
- 如需合并:/req:review-pr merge
399
- ```
78
+ 报告分两部分:代码审查 + 需求文档同步(文档与代码偏差)。
400
79
 
401
- **y 审核通过**(仅 `has_reviewer = True` 时出现)
80
+ ### 6. 提交审查评论
402
81
 
403
- 按平台提交「Approved」评审。**Gitea**:`POST /pulls/{N}/reviews`,body 为 `{"event": "APPROVED"}`。GitHub:`gh pr review --approve`。
82
+ **零问题直通**:阻塞=0、建议=0、文档同步项=0 时,自动用固定模板提交通过评论,跳过确认。
404
83
 
405
- **repoType = "other"**:跳过,告知用户在平台手动操作。
84
+ **有任意问题时**:展示精简版预览 询问用户是否提交(`--auto` 跳过确认)。
406
85
 
407
- 成功后输出:
408
- ```
409
- ✅ PR #42 审核状态已更新为「已通过(Approved)」
410
- ${PR_URL}
411
- (审核通过 ≠ 合并,PR 仍处于 Open 状态)
86
+ > 精简规则:保留阻塞(全部)、关键建议、文档同步关键缺失;去除信息级备注、风格命名建议、过程信息。控制在 300 字以内。
412
87
 
413
- 如需合并:/req:review-pr merge
414
- ```
415
-
416
- 失败时输出:
417
- ```
418
- ❌ 审核状态提交失败
88
+ Gitea 注意:PR 评论用 `/issues/{N}/comments` 端点。`repoType = "other"` 仅本地展示。
419
89
 
420
- 可能原因:
421
- - Token 权限不足(需要 repo 写入权限)
422
- - 当前用户不在 PR 审核人列表
423
- - 网络问题
90
+ ### 7. 无阻塞时的后续操作
424
91
 
425
- 请在平台手动操作:${PR_URL}
426
- ```
427
-
428
- **n / 回车 — 暂不处理**(`has_reviewer = True`)
429
-
430
- ```
431
- 已跳过,PR #42 保持当前状态
432
-
433
- 后续可执行:
434
- - /req:review-pr merge 合并 PR
435
- ```
92
+ 阻塞=0 且 PR 为 Open 时:
93
+ - **有审核人**(PR reviewers 或 `branchStrategy.reviewers`)→ 提示是否提交 Approved
94
+ - **无审核人** → 仅展示结果,提示可 `/req:review-pr merge`
436
95
 
437
96
  ---
438
97
 
439
- ## 执行流程(fetch-comments - 拉取评论并修改代码)
98
+ ## fetch-comments 拉取评论并修改代码
440
99
 
441
- > 用途:PR 已被人工或 AI 审查并留下评论,开发者用此子命令拉取评论、让 AI 分析并应用修改。
100
+ ### 1. 拉取评论
442
101
 
443
- ### 1. 识别需求和 PR
102
+ 同时拉取 Issue Comments(整体讨论)和 Review Comments(行内评论)。
444
103
 
445
- 与「查看状态」流程相同(支持从当前分支名反查)。
104
+ > Gitea:整体评论 `/issues/{N}/comments`,行内评论先 `GET /pulls/{N}/reviews` 再逐条 `/reviews/{ID}/comments`。GitHub:`gh api` 直接支持。
446
105
 
447
- ### 2. 拉取 PR 评论
106
+ ### 2. 过滤评论
448
107
 
449
- 同时拉取两类评论:
450
- - **Issue Comments(整体讨论评论)**:针对 PR 整体的讨论
451
- - **Review Comments(行内评论)**:针对 diff 具体行的评论,含 `path` 和 `position`/`line` 字段
108
+ 排除:当前 git 用户自己的评论、已 resolved/outdated 的行评论、AI 自提交的审查报告(`AI 代码审查报告` 开头)。
452
109
 
453
- 按平台拉取。**Gitea 注意**:整体评论用 `/issues/{N}/comments`;行内评论需两级拉取——先 `GET /pulls/{N}/reviews`,再对每条 review 拉 `/reviews/{ID}/comments`。GitHub:`gh api` 直接支持两个独立端点。
110
+ ### 3. 展示评论清单
454
111
 
455
- **repoType = "other"**:提示不支持,结束。
456
-
457
- ### 3. 过滤评论
458
-
459
- 排除以下评论,避免无效循环:
460
- - 作者为当前 git 用户(`git config user.name` / `git config user.email`)的评论
461
- - 已 resolved / outdated 状态的行评论(Gitea 字段 `resolved`,GitHub 字段无需过滤,按时间戳排序)
462
- - AI 自动提交的审查报告(body 以 `AI 代码审查报告` 开头)
463
-
464
- 可用「上次 fetch-comments 执行时间」作为增量标记(存储在需求文档「开发记录」或 `.claude/settings.local.json` 的 `reviewPrLastFetch` 字段)。**首次执行时拉取全部**。
465
-
466
- ### 4. 展示评论清单
467
-
468
- 分组展示,带编号供后续引用:
469
-
470
- ```
471
- PR #42 评论(7 条,已过滤 2 条 AI 自提交)
472
-
473
- 整体讨论:
474
-
475
- [1] @reviewer-a (2026-04-15 10:21)
476
- 整体逻辑 OK,但 user_points 表建议加软删除字段,方便回滚。
477
-
478
- 行内评论:
479
-
480
- [2] @reviewer-b (2026-04-15 10:30)
481
- internal/user/biz/points.go:45
482
- 余额检查应该放在事务开头,现在位置会有并发问题。
483
-
484
- [3] @reviewer-b (2026-04-15 10:32)
485
- internal/user/controller/v1/points.go:23
486
- 这里返回 500 不合适,参数错误应该返回 400。
487
- ```
112
+ 分组展示(整体讨论 / 行内评论),带编号供引用。
488
113
 
489
- ### 5. AI 分析并生成修改清单
114
+ ### 4. AI 分析并生成修改清单
490
115
 
491
- 对每条评论:
492
- 1. 读取评论引用的源码位置(使用 Read,范围为评论行的 ±20 行上下文)
493
- 2. 判断评论是否**可执行**(改代码)或**需讨论**(需要人判断)
494
- 3. 生成修改方案
116
+ 逐条读取评论引用的源码位置(±20 行上下文),判断可执行/需讨论,生成修改方案。用户确认后执行。
495
117
 
496
- 输出格式:
497
-
498
- ```
499
- 修改方案
500
-
501
- [1] ✅ 可执行 — 加软删除字段
502
- internal/user/model/points_record.go
503
- 在 PointsRecord 结构体追加 `DeletedAt gorm.DeletedAt` 字段,并在 migration SQL 增补列。
504
-
505
- [2] ✅ 可执行 — 调整余额校验位置
506
- internal/user/biz/points.go:42-50
507
- 把余额检查从方法末尾移到事务 `tx.Begin()` 之后、`UPDATE` 之前。
508
-
509
- [3] ⚠️ 需确认 — 错误码调整
510
- internal/user/controller/v1/points.go:23
511
- 原代码统一返回 500,建议改为 400。**但项目 CLAUDE.md 约定由中间件统一处理 400 错误**,需确认是手工返回还是调中间件。
512
-
513
- 是否按以上方案执行?(回复序号跳过某项,如 "跳过 3";或直接回复 y 全部执行)
514
- ```
515
-
516
- ### 6. 执行修改
517
-
518
- 用户确认后:
519
- 1. 按方案修改代码(Edit 工具)
520
- 2. 对跳过项不做改动
521
- 3. 对「需确认」项,等用户进一步说明
522
-
523
- ### 7. 完成提示
524
-
525
- ```
526
- ✅ 已应用 2 项修改(跳过 1 项待确认)
527
-
528
- 修改文件:
529
- - internal/user/model/points_record.go(+2 -0)
530
- - internal/user/biz/points.go(+5 -3)
531
-
532
- 下一步:
533
- - /req:commit 提交修改(建议在 commit message 中引用 PR #42 review)
534
- - /req:review-pr review 可选:再次 AI 自审查
535
- ```
536
-
537
- 提交建议的 commit message 格式:
538
- ```
539
- review: 处理 PR #42 的审查评论
540
-
541
- - 加软删除字段 (reviewer-a)
542
- - 调整余额校验位置到事务开头 (reviewer-b)
543
- ```
118
+ 完成提示给出修改文件列表和下一步操作(`/req:commit`、重新审查等)。
544
119
 
545
120
  ---
546
121
 
547
- ## 执行流程(merge - 合并 PR
122
+ ## merge 合并 PR
548
123
 
549
- ### 1. 前置检查
124
+ ### 前置检查
550
125
 
551
- 依次检查以下条件:
126
+ PR 存在 → PR 为 Open → 无合并冲突。逐项失败时提示处理方式。
552
127
 
553
- | 检查项 | 失败时行为 |
554
- |--------|-----------|
555
- | PR 是否存在 | ❌ 提示先创建 PR |
556
- | PR 是否 Open 状态 | ❌ 提示 PR 已关闭/已合并 |
557
- | 是否有合并冲突 | ❌ 提示解决冲突后重试 |
128
+ ### 执行合并
558
129
 
559
- ```
560
- ❌ PR #42 存在合并冲突
561
-
562
- 解决方式:
563
- git checkout <branch>
564
- git merge <merge_target>
565
- # 解决冲突后
566
- git add . && git commit
567
- git push
568
- ```
569
-
570
- ### 2. 执行合并
571
-
572
- 读取 `branchStrategy.mergeMethod` 配置(默认 `merge`):
130
+ 读取 `branchStrategy.mergeMethod`(默认 `merge`),按平台执行。
573
131
 
574
- | | 说明 | 适用场景 |
575
- |------|------|---------|
576
- | `merge` | 保留完整提交历史 | 默认,适合大多数团队 |
577
- | `squash` | 压缩为一个提交 | 希望主分支历史简洁 |
578
- | `rebase` | 变基到目标分支 | 追求线性历史 |
132
+ > Gitea:merge method 通过 `Do` 字段传递。`repoType = "other"` 展示手动合并命令。
579
133
 
580
- 按平台合并。**Gitea 注意**:merge method 通过 `Do` 字段传递(不是 `method`),值为 `"merge"` / `"squash"` / `"rebase"`。GitHub:`gh pr merge --<mergeMethod>`。
134
+ ### 合并成功
581
135
 
582
- **repoType = "other"**:
583
- ```
584
- 请手动合并 PR
136
+ 输出 PR 合并信息,提示 `/req:done` 归档。
585
137
 
586
- 合并命令:
587
- git checkout <merge_target>
588
- git merge <branch>
589
- git push
590
- ```
138
+ ### 分支清理
591
139
 
592
- ### 3. 合并成功
593
-
594
- ```
595
- ✅ PR #42 已合并!
596
-
597
- ${PR_URL}
598
- feat/REQ-001-user-points → develop
599
- 合并方式:merge
600
-
601
- 后续操作:
602
- - /req:done REQ-001 归档需求
603
- ```
604
-
605
- ### 4. 分支清理
606
-
607
- 合并成功后,读取 `branchStrategy.deleteBranchAfterMerge` 配置(默认 `true`)。
608
-
609
- **配置为 true 或未配置时**:
610
-
611
- ```
612
- 是否删除已合并的分支?
613
-
614
- 将执行:
615
- git checkout <merge_target>
616
- git pull
617
- git branch -d <branch>
618
- ```
619
-
620
- 等待用户确认:
621
- - 确认 → 执行切换、拉取最新、删除本地分支
622
- - 拒绝 → 保留分支
623
-
624
- **配置为 false 时**:不提示,跳过清理。
140
+ 读取 `branchStrategy.deleteBranchAfterMerge`(默认 `true`),询问用户是否删除已合并分支。配置为 `false` 时跳过。
625
141
 
626
142
  ---
627
143
 
628
144
  ## Git Flow 双 PR 场景
629
145
 
630
- 当策略为 `git-flow` 且分支是 hotfix 时,可能存在两个 PR(→ main + → develop)。
631
-
632
- 此时分别展示/审查/合并两个 PR:
633
-
634
- ```
635
- Hotfix 关联 2 个 PR:
636
-
637
- 1. PR #42: hotfix/fix-order-calc → main 状态:Open
638
- 2. PR #43: hotfix/fix-order-calc → develop 状态:Open
639
-
640
- 请选择操作的 PR(或输入 all 全部处理):
641
- ```
642
-
643
- 合并时按顺序:先合并 → main,再合并 → develop。
146
+ hotfix 分支可能存在两个 PR(→ main + → develop),分别展示,按先 main 后 develop 顺序操作。
644
147
 
645
148
  ---
646
149
 
647
- ## 与其他命令的衔接
150
+ ## 命令衔接
648
151
 
649
152
  ```
650
- /req:dev 开发完成后
651
-
652
- /req:commit 提交代码
653
-
654
- /req:pr 创建 PR
655
-
656
- /req:review-pr review AI 审查代码 + 提交评论
657
-
658
- (他人/AI 留下评论)
659
-
660
- /req:review-pr fetch-comments 拉取评论 + AI 应用修改
661
-
662
- /req:commit 提交修改
663
-
664
- /req:review-pr merge 合并 PR + 清理分支
665
-
666
- /req:done 归档需求
153
+ /req:dev → /req:commit → /req:pr → /req:review-pr review
154
+ → /req:review-pr fetch-comments → /req:commit
155
+ /req:review-pr merge → /req:done
667
156
  ```
668
157
 
669
158
  ---
670
159
 
671
160
  ## 与 `/req:release` 的关系
672
161
 
673
- **`/req:review-pr merge` 只是完成单个需求的里程碑,不是发版**。具体边界:
674
-
675
- 1. **migration SQL merge 时不会被归档**
676
- 合并 PR 后,`docs/migrations/` 下该需求的 SQL 文件仍然保留在原目录,不会被搬到 `released/`。这些 SQL 会等到下一次 `/req:release` 被命令合并到 `docs/migrations/released/<version>.sql`,并 `git rm` 原文件。
677
- 2. **合并到 `developBranch` ≠ 发布**
678
- 在 git-flow 下,merge 通常是把 feat 分支合到 `developBranch`。发版仍需要跑 `/req:release`,由它走 cross-branch 流程打开 develop → main 的 release PR。
679
- 3. **不要为"发版"手工 tag 或手工建 Release**
680
- 发版的所有动作(合并 SQL、生成回滚、changelog、tag、平台 Release)都应该由 `/req:release` 原子化完成。v3.0.0+ 默认 draft 模式,命令完成后你在 Gitea/GitHub 手工 publish 才真正发版——这是"双闸门"的核心。
681
-
682
- **典型发版流水线**:
683
-
684
- ```
685
- REQ-1 /req:review-pr merge ← 单需求合并(不发版)
686
- REQ-2 /req:review-pr merge ← 单需求合并(不发版)
687
- REQ-3 /req:review-pr merge ← 单需求合并(不发版)
688
-
689
- /req:release ← 真正发版,自动推导版本号 + draft
690
-
691
- 在 Gitea/GitHub 点 Publish
692
- ```
162
+ `/req:review-pr merge` 是单需求里程碑,不是发版:
163
+ - migration SQL 在 merge 时不会被归档,等 `/req:release` 统一处理
164
+ - 合并到 developBranch 发布,发版仍需 `/req:release`
165
+ - 不要手工 tag 或建 Release,应由 `/req:release` 原子化完成
693
166
 
694
167
  ---
695
168