@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.
- package/package.json +1 -1
- package/plugins/diag/templates/services.yaml.template +31 -0
- package/plugins/req/skills/branch/SKILL.md +48 -377
- package/plugins/req/skills/dev/SKILL.md +1 -1
- package/plugins/req/skills/dev-guide/SKILL.md +74 -399
- package/plugins/req/skills/do/SKILL.md +1 -1
- package/plugins/req/skills/done/SKILL.md +2 -2
- package/plugins/req/skills/edit/SKILL.md +1 -1
- package/plugins/req/skills/fix/SKILL.md +1 -1
- package/plugins/req/skills/init/SKILL.md +66 -430
- package/plugins/req/skills/issue/SKILL.md +1 -1
- package/plugins/req/skills/migrate/SKILL.md +1 -1
- package/plugins/req/skills/natural-language-dispatcher/SKILL.md +78 -438
- package/plugins/req/skills/new/SKILL.md +1 -1
- package/plugins/req/skills/pr/SKILL.md +1 -1
- package/plugins/req/skills/prd/SKILL.md +1 -1
- package/plugins/req/skills/prd-edit/SKILL.md +1 -1
- package/plugins/req/skills/release/SKILL.md +1 -1
- package/plugins/req/skills/review/SKILL.md +1 -1
- package/plugins/req/skills/review-pr/SKILL.md +74 -601
- package/plugins/req/skills/test/SKILL.md +41 -355
- package/plugins/req/skills/test_new/SKILL.md +36 -356
- package/plugins/req/skills/test_regression/SKILL.md +1 -1
- package/plugins/req/skills/update-template/SKILL.md +1 -1
- package/plugins/req/skills/use/SKILL.md +1 -1
- package/plugins/req/templates/claude-md-snippets/frontend-react.md +48 -0
- package/plugins/req/templates/claude-md-snippets/generic.md +43 -0
- package/plugins/req/templates/claude-md-snippets/go-backend.md +47 -0
- package/plugins/req/templates/claude-md-snippets/java-backend.md +46 -0
- package/plugins/req/templates/docker-compose.test.yml +84 -0
- package/plugins/req/templates/index-template.md +60 -0
- package/plugins/req/templates/module-template.md +79 -0
- package/plugins/req/templates/prd-template.md +338 -0
- package/plugins/req/templates/quick-template.md +71 -0
- package/plugins/req/templates/release-prompt-template.md +51 -0
- package/plugins/req/templates/requirement-template.md +256 -0
- package/plugins/req/templates/scripts/test-env.sh +226 -0
- package/plugins/req/templates/tests/e2e/playwright.config.ts +86 -0
- package/plugins/uat/templates/flow-template.md +116 -0
- 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
|
|
8
|
+
对已创建的 PR 进行 AI 代码审查,可将审查意见提交到平台,审查通过后合并 PR。
|
|
9
9
|
|
|
10
|
-
>
|
|
11
|
-
> 不触发缓存同步。
|
|
10
|
+
> 不受仓库角色限制,readonly 可执行。不触发缓存同步。
|
|
12
11
|
>
|
|
13
|
-
>
|
|
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
|
-
|
|
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
|
-
##
|
|
43
|
+
## review — AI 代码审查
|
|
77
44
|
|
|
78
45
|
### 1. 获取 PR diff
|
|
79
46
|
|
|
80
|
-
|
|
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
|
-
|
|
55
|
+
检查维度:
|
|
321
56
|
|
|
322
|
-
|
|
323
|
-
|
|
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
|
-
|
|
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
|
-
|
|
76
|
+
问题分三级:**阻塞**(阻止合并)、**建议**(不阻止)、**信息**(知识分享)。
|
|
394
77
|
|
|
395
|
-
|
|
396
|
-
✅ 审查完成,PR #42 无阻塞问题(无分配审核人)
|
|
397
|
-
|
|
398
|
-
如需合并:/req:review-pr merge
|
|
399
|
-
```
|
|
78
|
+
报告分两部分:代码审查 + 需求文档同步(文档与代码偏差)。
|
|
400
79
|
|
|
401
|
-
|
|
80
|
+
### 6. 提交审查评论
|
|
402
81
|
|
|
403
|
-
|
|
82
|
+
**零问题直通**:阻塞=0、建议=0、文档同步项=0 时,自动用固定模板提交通过评论,跳过确认。
|
|
404
83
|
|
|
405
|
-
|
|
84
|
+
**有任意问题时**:展示精简版预览 → 询问用户是否提交(`--auto` 跳过确认)。
|
|
406
85
|
|
|
407
|
-
|
|
408
|
-
```
|
|
409
|
-
✅ PR #42 审核状态已更新为「已通过(Approved)」
|
|
410
|
-
${PR_URL}
|
|
411
|
-
(审核通过 ≠ 合并,PR 仍处于 Open 状态)
|
|
86
|
+
> 精简规则:保留阻塞(全部)、关键建议、文档同步关键缺失;去除信息级备注、风格命名建议、过程信息。控制在 300 字以内。
|
|
412
87
|
|
|
413
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
98
|
+
## fetch-comments — 拉取评论并修改代码
|
|
440
99
|
|
|
441
|
-
|
|
100
|
+
### 1. 拉取评论
|
|
442
101
|
|
|
443
|
-
|
|
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.
|
|
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
|
-
|
|
110
|
+
### 3. 展示评论清单
|
|
454
111
|
|
|
455
|
-
|
|
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
|
-
###
|
|
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
|
-
##
|
|
122
|
+
## merge — 合并 PR
|
|
548
123
|
|
|
549
|
-
###
|
|
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
|
-
|
|
134
|
+
### 合并成功
|
|
581
135
|
|
|
582
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
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
|
|