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