@ranger1/dx 0.1.104 → 0.1.106
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/lib/codex-initial.js +79 -5
- package/package.json +1 -1
- package/skills/backend-audit-fixer/SKILL.md +98 -0
- package/skills/backend-audit-fixer/references/backend-layering.md +103 -0
- package/skills/backend-audit-fixer/references/e2e.md +60 -0
- package/skills/backend-audit-fixer/references/env-accessor.md +73 -0
- package/skills/backend-audit-fixer/references/error-handling.md +77 -0
- package/skills/{naming-audit-fixer/references/fix-guide.md → backend-audit-fixer/references/naming-fix-guide.md} +8 -3
- package/skills/backend-audit-fixer/references/naming.md +139 -0
- package/skills/backend-audit-fixer/references/pagination-dto.md +52 -0
- package/skills/create-issue/SKILL.md +90 -0
- package/skills/feature-decide-plan-execute/SKILL.md +537 -0
- package/skills/issues-batch-deliver/SKILL.md +549 -0
- package/skills/pr-train-ship/SKILL.md +669 -0
- package/skills/backend-layering-audit-fixer/SKILL.md +0 -180
- package/skills/e2e-audit-fixer/SKILL.md +0 -76
- package/skills/e2e-audit-fixer/agents/openai.yaml +0 -4
- package/skills/env-accessor-audit-fixer/SKILL.md +0 -149
- package/skills/env-accessor-audit-fixer/agents/openai.yaml +0 -7
- package/skills/error-handling-audit-fixer/SKILL.md +0 -187
- package/skills/error-handling-audit-fixer/agents/openai.yaml +0 -7
- package/skills/git-pr-ship/SKILL.md +0 -528
- package/skills/multi-pr-feature-delivery/SKILL.md +0 -493
- package/skills/multi-pr-feature-delivery/agents/openai.yaml +0 -7
- package/skills/naming-audit-fixer/SKILL.md +0 -149
- package/skills/pagination-dto-audit-fixer/SKILL.md +0 -69
- package/skills/pagination-dto-audit-fixer/agents/openai.yaml +0 -7
- /package/skills/{env-accessor-audit-fixer → backend-audit-fixer}/references/bootstrap-env-foundation.md +0 -0
- /package/skills/{error-handling-audit-fixer/references/foundation-bootstrap.md → backend-audit-fixer/references/error-handling-foundation-bootstrap.md} +0 -0
- /package/skills/{error-handling-audit-fixer → backend-audit-fixer}/references/error-handling-standard.md +0 -0
- /package/skills/{pagination-dto-audit-fixer → backend-audit-fixer}/references/pagination-standard.md +0 -0
- /package/skills/{e2e-audit-fixer/scripts/e2e_e2e_audit.py → backend-audit-fixer/scripts/e2e_audit.py} +0 -0
- /package/skills/{env-accessor-audit-fixer → backend-audit-fixer}/scripts/env_accessor_audit.py +0 -0
- /package/skills/{error-handling-audit-fixer → backend-audit-fixer}/scripts/error_handling_audit.py +0 -0
- /package/skills/{naming-audit-fixer/scripts/audit_naming.py → backend-audit-fixer/scripts/naming_audit.py} +0 -0
- /package/skills/{pagination-dto-audit-fixer → backend-audit-fixer}/scripts/pagination_dto_audit.py +0 -0
|
@@ -0,0 +1,669 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pr-train-ship
|
|
3
|
+
description: 仅在用户显式调用 $pr-train-ship 或明确要求使用 pr-train-ship 技能时使用;不要通过关键词自动触发。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# PR Train Ship — PR 审查 · 修复 · 自动合并
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
接收一个**已存在的 PR 编号**,跑 **两波并行审查(Wave 1 验证+验收 → Wave 2 三源代码审查:审查者 A 架构 + 审查者 B 逻辑 + 审查者 C 系统 `/code-review`,≤3 轮)→ 审查质量自检 → 三 comment(验收/审查/修复)→ 修复循环 → 验证总结 → `gh pr merge --squash --auto` → 独立 subagent 等真 merge 到 main**。Train 模式下严格串行:本 PR 真合并后才允许调用方启动下一 PR。
|
|
11
|
+
|
|
12
|
+
**不负责** commit / push / 创建 PR — 这些由 `feature-decide-plan-execute` 完成后把 PR 编号交给本 skill。
|
|
13
|
+
|
|
14
|
+
## Scope
|
|
15
|
+
|
|
16
|
+
显式调用 / 上游 skill 显式 handoff 才进入。
|
|
17
|
+
|
|
18
|
+
**输入:**
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
$pr-train-ship --pr <PR_NUMBER>
|
|
22
|
+
# 或
|
|
23
|
+
$pr-train-ship # 自动从当前分支查 PR
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**前提:**
|
|
27
|
+
|
|
28
|
+
- PR 已存在(`gh pr view <num>` 能查到)
|
|
29
|
+
- PR 已 push 最新代码(本 skill 不再 push 业务代码,仅 push 修复审查问题产生的 commit)
|
|
30
|
+
- 上游 `feature-decide-plan-execute` 已跑过本地 lint/build/test 全绿(本 skill 仍会在 subagent 里复跑作为门禁)
|
|
31
|
+
|
|
32
|
+
**不要用:** 用户未显式调用;PR 还没创建(先用 `feature-decide-plan-execute` 或 `git-pr-ship`);纯讨论。
|
|
33
|
+
|
|
34
|
+
## 执行原则
|
|
35
|
+
|
|
36
|
+
- 全程中文输出。
|
|
37
|
+
- **每修复一个问题立即 commit 一次**,禁止攒到最后。
|
|
38
|
+
- AI 自主判断是否拒绝某个问题,**拒绝必须写明理由**。
|
|
39
|
+
- 扫描中顺便发现的同文件历史遗留问题视同本次问题修复;**不以"历史遗留"或"超出本 PR 范围"为唯一理由跳过**。但不主动扩大扫描范围。
|
|
40
|
+
- **预存的 lint / build / test 错误顺手修**:验证流水线(主线 A)跑出来的失败,即便不是本 PR diff 引入的(main 上原本就坏 / 别人 PR 引入 / 环境历史问题),也必须当作本轮问题修复并 commit,禁止以"非本 PR 引入"为由跳过、降级或留 TODO。无法在本 skill 内修复(如需大规模重构 / 跨服务协同)→ 必须新建 follow-up Issue 并在 PR body / 审核报告里附编号,不允许只口头说一下。
|
|
41
|
+
- 上次跑完测试 / lint 后改过代码 → 必须重跑验证。
|
|
42
|
+
- 使用 **heredoc** 写 commit message / `gh` 命令 body(禁止 `\n` 字面量)。
|
|
43
|
+
- **零业务代码改动**:本 skill 只产出修复审查问题的 commit,不做主功能代码改动(那是 `feature-decide-plan-execute` 的事)。
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 阶段一:上下文加载
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# 输入 PR 编号
|
|
51
|
+
PR_NUMBER=<num>
|
|
52
|
+
|
|
53
|
+
# 拉取 PR 信息
|
|
54
|
+
gh pr view $PR_NUMBER --json number,title,headRefName,baseRefName,state,mergeable,mergeStateStatus,statusCheckRollup,url,body,author
|
|
55
|
+
|
|
56
|
+
# 切到 PR 对应分支
|
|
57
|
+
PR_BRANCH=$(gh pr view $PR_NUMBER --json headRefName --jq .headRefName)
|
|
58
|
+
git fetch origin "$PR_BRANCH"
|
|
59
|
+
git checkout "$PR_BRANCH"
|
|
60
|
+
git pull
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**自动提取上下文:**
|
|
64
|
+
|
|
65
|
+
- **Issue ID** — 从 PR body `Closes: #<id>` / `Refs: #<id>` 提取
|
|
66
|
+
- **Train 序号**(如有)— 从 PR body 顶部 `**PR Train:** N/Total(依赖 #X)` 提取;保存 `DEPENDS_ON_PR` 用于 Hard Gate 检查
|
|
67
|
+
- **PR 状态** — `state` 必须为 `OPEN`;若已 merged/closed,本 skill 输出"PR 已终态"结束
|
|
68
|
+
|
|
69
|
+
### Train 依赖检查(PR body 含 `PR Train` 标记时执行)
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# 提取依赖 PR 编号
|
|
73
|
+
DEPENDS=$(gh pr view $PR_NUMBER --json body --jq .body | grep -oE '依赖 #[0-9]+' | grep -oE '[0-9]+')
|
|
74
|
+
|
|
75
|
+
if [ -n "$DEPENDS" ]; then
|
|
76
|
+
MERGED=$(gh pr view $DEPENDS --json mergedAt --jq .mergedAt)
|
|
77
|
+
if [ "$MERGED" = "null" ] || [ -z "$MERGED" ]; then
|
|
78
|
+
echo "依赖 PR #$DEPENDS 尚未 merge 到 main,本 skill 拒绝继续"
|
|
79
|
+
exit 1
|
|
80
|
+
fi
|
|
81
|
+
fi
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
依赖未 merge → 直接结束本 skill,提示调用方等待。
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 阶段二:合并冲突检测
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
git fetch origin main
|
|
92
|
+
git merge --no-commit --no-ff origin/main
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
- 无冲突 → `git merge --abort` 撤回,继续阶段三
|
|
96
|
+
- 有冲突 →
|
|
97
|
+
1. `git merge --abort`
|
|
98
|
+
2. `git merge origin/main` 解冲突
|
|
99
|
+
3. Commit:
|
|
100
|
+
```bash
|
|
101
|
+
git add -A
|
|
102
|
+
git commit -F - <<'MSG'
|
|
103
|
+
merge: 解决与 main 的合并冲突
|
|
104
|
+
|
|
105
|
+
- <冲突文件及解决方式>
|
|
106
|
+
|
|
107
|
+
Refs: #<issue-id>
|
|
108
|
+
MSG
|
|
109
|
+
```
|
|
110
|
+
4. `git push`
|
|
111
|
+
5. 标 `CODE_CHANGED_SINCE_LAST_CHECK=true`
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 阶段三:审查修复循环(≤3 轮)
|
|
116
|
+
|
|
117
|
+
循环变量:`ROUND=1`,`MAX_ROUNDS=3`,`CODE_CHANGED_SINCE_LAST_CHECK=true`
|
|
118
|
+
|
|
119
|
+
### 3.1 验证流水线 + Issue 验收 + 代码审查(两波并行,共 4 个 subagent)
|
|
120
|
+
|
|
121
|
+
仅在 `CODE_CHANGED_SINCE_LAST_CHECK=true` 时跑验证流水线(主线 A)。主线 B/C 每轮都跑。
|
|
122
|
+
|
|
123
|
+
**核心改进**:subagent 不再"一次并行",拆成 **两波**,避免主 agent 同时融合多份风格迥异的报告导致代码审查深度被稀释:
|
|
124
|
+
|
|
125
|
+
- **Wave 1(并行 2 个,事实层扫描)**:主线 A 验证流水线 + 主线 C Issue 验收。两者负责"流水线是否过关 / 功能是否到位"的事实层结论。
|
|
126
|
+
- **Wave 2(并行 3 个,深度审查)**:审查者 A 架构 + 审查者 B 逻辑 + 审查者 C 系统 `/code-review`。**必须把 Wave 1 的 Issue 验收结论作为 prompt 输入**,并反向约束:"功能缺失主线 C 已覆盖,你只挑 diff 内的代码 bug,不要重复列功能缺失"。
|
|
127
|
+
|
|
128
|
+
> **审查者 C = 系统 `/code-review` 第三路**:在裸 subagent 内调用系统 `/code-review`(**禁带 `--comment` / `--fix`**),让它只读地扫 diff、返回 findings 文本给主 agent。系统 `/code-review` 裸跑本身就是只读不发评论不改码,与「主 agent 唯一发布者」架构兼容——它的 findings 与审查者 A/B 一样并入 3.2 汇总,由主 agent 在 3.3b 统一发布。**绝不允许 `--comment`(会绕过单发布者产生重复评论)或 `--fix`(会越权改业务代码,违反 Hard Gate 7)。**
|
|
129
|
+
|
|
130
|
+
Wave 1 失败不阻塞 Wave 2 启动;但 Wave 2 的 prompt 必须带 Wave 1 验收结论。
|
|
131
|
+
|
|
132
|
+
> **关键约束**:所有 subagent(主线 A 验证 / 主线 C Issue 验收 / 审查者 A / 审查者 B)**只向主 agent 返回结果文本,禁止自行调用 `gh pr comment` 或任何方式直接发布 PR 评论**。只有主 agent 在 3.3a / 3.3b / 3.5 / 3.7 发布唯一汇总报告。违反 → PR 上会出现多条重复审核报告。
|
|
133
|
+
|
|
134
|
+
**Wave 1 — 主线 A:验证流水线(subagent 串行有错即停)**
|
|
135
|
+
|
|
136
|
+
派独立 subagent(后台运行)。不要在主 agent 直接跑——主 agent 易被打断。
|
|
137
|
+
|
|
138
|
+
Subagent prompt:
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
你是验证流水线执行者。严格按顺序执行,任一步骤失败立即停止,不执行后续。
|
|
142
|
+
|
|
143
|
+
【重要】只负责执行验证并返回结果文本。禁止调用 gh pr comment 或以任何方式直接发评论。
|
|
144
|
+
|
|
145
|
+
【重要】返回的失败错误必须完整原样输出(含文件:行号 / 报错栈)。
|
|
146
|
+
针对每个失败,额外用 git blame 或 git log -L 判定该行最近一次修改是否在本 PR 提交范围内:
|
|
147
|
+
- 取 PR base sha:BASE=$(gh pr view <PR_NUMBER> --json baseRefOid --jq .baseRefOid)
|
|
148
|
+
- 取 PR head sha:HEAD=$(gh pr view <PR_NUMBER> --json headRefOid --jq .headRefOid)
|
|
149
|
+
- 对失败行运行 `git log $BASE..$HEAD --oneline -- <file>` 看是否有 commit;或 `git blame -L <line>,<line> <file>` 看作者 commit 是否在 $BASE..$HEAD 范围内
|
|
150
|
+
分类输出:
|
|
151
|
+
[本 PR 引入] <file>:<line> <错误>
|
|
152
|
+
[历史遗留] <file>:<line> <错误>
|
|
153
|
+
所有错误都要返回——分类是给主 agent 决定 commit 拆分用,不是允许跳过的依据(Hard Gate 10)。
|
|
154
|
+
|
|
155
|
+
Step 1: dx lint
|
|
156
|
+
- 失败:记录所有错误(按上面分类),停止
|
|
157
|
+
- 通过:继续
|
|
158
|
+
|
|
159
|
+
Step 2: dx build affected --dev
|
|
160
|
+
- 失败:记录错误(按上面分类),停止
|
|
161
|
+
- 通过:继续
|
|
162
|
+
|
|
163
|
+
Step 3: 运行关联测试(按改动范围判断)
|
|
164
|
+
- 后端改动 (apps/backend/):识别受影响 E2E -> dx test e2e backend <file-or-dir>;受影响 *.spec.ts 按文件运行
|
|
165
|
+
- 前端改动 (apps/front/):dx test unit front
|
|
166
|
+
- 管理端改动 (apps/admin-front/):dx test unit admin
|
|
167
|
+
- 无相关改动测试:跳过
|
|
168
|
+
|
|
169
|
+
返回格式:
|
|
170
|
+
- 执行到第几步
|
|
171
|
+
- 每步通过/失败
|
|
172
|
+
- 失败步骤完整错误输出
|
|
173
|
+
- 每条错误的 [本 PR 引入] / [历史遗留] 分类标签
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
完成后设 `CODE_CHANGED_SINCE_LAST_CHECK=false`。
|
|
177
|
+
|
|
178
|
+
**历史遗留错误的 commit 隔离规则**(避免污染下一轮代码审查的 diff):
|
|
179
|
+
|
|
180
|
+
- "本 PR 引入"失败 → 走 3.4 常规修复 commit(`fix:` 前缀,挂本 Issue)
|
|
181
|
+
- "历史遗留"失败 → **单独 commit**,前缀 `chore(precheck):`,commit body 写明"非本 PR diff 引入,按 Hard Gate 10 顺手修";如确实修不动 → 不 commit,直接进入 Hard Gate 10 后半段(PR body + 审核报告双处登记 follow-up Issue 编号)
|
|
182
|
+
- 下一轮的代码审查 prompt 必须明确告知"本轮 commit 含历史遗留修复(commit hash: xxx),审查者请聚焦本 PR 业务 diff,不要在这些文件里做 nitpick"
|
|
183
|
+
|
|
184
|
+
**Wave 2 — 主线 B:代码审查**(必须在 Wave 1 主线 C 输出可用后再启动,A/B prompt 中嵌入主线 C 验收结论)
|
|
185
|
+
|
|
186
|
+
**第一轮:三源审查(必须)**
|
|
187
|
+
|
|
188
|
+
派三个独立 subagent(审查者 A 架构 + 审查者 B 逻辑 + 审查者 C 系统 `/code-review`)。**三个 prompt 都必须先嵌入主线 C 输出,再说明任务**:
|
|
189
|
+
|
|
190
|
+
**审查者 A** — 架构与代码质量:
|
|
191
|
+
|
|
192
|
+
```
|
|
193
|
+
【背景:主线 C Issue 验收结论已就位】
|
|
194
|
+
<这里粘贴主线 C 完整报告:验收标准条目数、✅/⚠️/❌ 表格、结论>
|
|
195
|
+
|
|
196
|
+
你是资深架构师,审查 PR #<PR_NUMBER> 的 diff。
|
|
197
|
+
|
|
198
|
+
【关注点】架构合理性、SOLID、错误处理、性能、安全、并发安全、资源泄漏、跨模块耦合。
|
|
199
|
+
【反向约束】Issue 验收已由主线 C 覆盖——你不要在报告里重复列「功能未实现 / 部分实现」,专注 diff 内代码层 bug。门禁 / 流程合规问题也不在你的范围内。
|
|
200
|
+
【范围】审查 diff 涉及的文件时如顺便发现同一文件内的历史遗留代码 bug 也报告(不主动扩大到 diff 之外)。本轮若 commit 含 `chore(precheck):` 历史遗留修复 commit,列入审查范围的代码 diff 排除这些 commit 的改动。
|
|
201
|
+
|
|
202
|
+
【输出格式】每条问题必须给出:
|
|
203
|
+
- 严重级(Critical / Major / Minor)
|
|
204
|
+
- 文件:行号
|
|
205
|
+
- 问题描述(≥1 句具体说明,禁止"建议优化"这类含糊表述)
|
|
206
|
+
- 建议改法(具体到代码层面,不写"考虑使用 X 模式"这种空话)
|
|
207
|
+
缺任一字段视为该条无效。
|
|
208
|
+
|
|
209
|
+
【重要】只返回审查结果文本。禁止调用 gh pr comment 或任何方式发评论——主 agent 统一发布。
|
|
210
|
+
|
|
211
|
+
获取 diff:gh pr diff <PR_NUMBER>
|
|
212
|
+
本 PR 历史遗留修复 commit 列表(若有):<commit hash 列表,由主 agent 填入>
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
**审查者 B** — 逻辑缺陷与规范:
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
【背景:主线 C Issue 验收结论已就位】
|
|
219
|
+
<这里粘贴主线 C 完整报告>
|
|
220
|
+
|
|
221
|
+
你是质量工程师,审查 PR #<PR_NUMBER> 的 diff。
|
|
222
|
+
|
|
223
|
+
【关注点】逻辑缺陷、边界条件、空值 / 异常路径、命名规范、类型安全、测试覆盖、回归风险。
|
|
224
|
+
【反向约束】Issue 验收已由主线 C 覆盖——你不要重复列「功能未实现」,专注 diff 内代码层 bug 与规范偏离。
|
|
225
|
+
【范围】审查 diff 涉及的文件时如顺便发现同一文件内的历史遗留代码 bug 也报告(不主动扩大)。本轮历史遗留修复 commit 的改动从审查范围排除。
|
|
226
|
+
|
|
227
|
+
【输出格式】同审查者 A:严重级 + 文件:行号 + 问题描述 ≥1 句 + 具体改法。缺一视为无效。
|
|
228
|
+
|
|
229
|
+
【重要】只返回审查结果文本。禁止调用 gh pr comment 或任何方式发评论——主 agent 统一发布。
|
|
230
|
+
|
|
231
|
+
获取 diff:gh pr diff <PR_NUMBER>
|
|
232
|
+
本 PR 历史遗留修复 commit 列表(若有):<commit hash 列表,由主 agent 填入>
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
**审查者 C** — 系统 `/code-review` 第三路(裸 subagent 内调用,只读返回 findings):
|
|
236
|
+
|
|
237
|
+
```
|
|
238
|
+
【背景:主线 C Issue 验收结论已就位】
|
|
239
|
+
<这里粘贴主线 C 完整报告>
|
|
240
|
+
|
|
241
|
+
你是第三路代码审查者,对 PR #<PR_NUMBER> 的 diff 跑系统内置 /code-review。
|
|
242
|
+
|
|
243
|
+
【调用方式】调用系统 skill:/code-review --effort medium
|
|
244
|
+
- 严禁带 --comment(会直接发 PR 评论,绕过主 agent 单发布者,产生重复审核报告)
|
|
245
|
+
- 严禁带 --fix(会改工作区业务代码,违反本 skill 零业务改动约束)
|
|
246
|
+
- 只跑只读审查,把 /code-review 输出的 findings 原样整理成下方格式返回主 agent
|
|
247
|
+
|
|
248
|
+
【反向约束】Issue 验收已由主线 C 覆盖——findings 里若有"功能未实现"类条目请剔除,只保留 diff 内代码层 bug / 复用-简化-效率类清理项。
|
|
249
|
+
|
|
250
|
+
【输出格式】把 /code-review 的每条 finding 归一化为:
|
|
251
|
+
- 严重级(Critical / Major / Minor;/code-review 的 bug 类→按严重程度,cleanup 类→Minor)
|
|
252
|
+
- 文件:行号
|
|
253
|
+
- 问题描述(≥1 句)
|
|
254
|
+
- 建议改法(具体到代码层面)
|
|
255
|
+
缺任一字段的条目剔除。
|
|
256
|
+
|
|
257
|
+
【重要】只返回归一化后的 findings 文本。禁止 gh pr comment、禁止 --comment、禁止 --fix、禁止任何写操作——主 agent 统一发布、统一决定修/拒。
|
|
258
|
+
|
|
259
|
+
获取 diff:gh pr diff <PR_NUMBER>(/code-review 默认审当前 diff)
|
|
260
|
+
本 PR 历史遗留修复 commit 列表(若有):<commit hash 列表,由主 agent 填入>
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
> ⚠️ **审查者 A/B 仍用裸 subagent,不得调用 `code-review` 技能或 `oh-my-claudecode:code-reviewer` agent**。只有**审查者 C** 专门承载系统 `/code-review`,且**必须裸跑(不带 `--comment` / `--fix`)**——裸跑只读不发评论不改码,findings 仍经主 agent 统一发布。带 `--comment` = 重复评论;带 `--fix` = 越权改码,两者都禁止。
|
|
264
|
+
|
|
265
|
+
**Wave 1 — 主线 C — Issue 验收检查者**(独立 subagent,每轮必须派,与主线 A 并行):
|
|
266
|
+
|
|
267
|
+
目的:审 PR diff 是否真把关联 Issue 的"验收标准 / 目标"逐条落地,避免「代码改了但功能没做完」「PR 描述说做了但 diff 里没体现」。
|
|
268
|
+
|
|
269
|
+
```
|
|
270
|
+
作为产品验收审查者,验证 PR #<PR_NUMBER> 是否实现了关联 Issue 的全部功能。
|
|
271
|
+
|
|
272
|
+
【任务步骤】
|
|
273
|
+
1. 提取关联 Issue ID:gh pr view <PR_NUMBER> --json body --jq .body | grep -oE '(Closes|Refs):\s*#[0-9]+'
|
|
274
|
+
2. 拉 Issue 全文:gh issue view <issue-id> --json title,body,state,labels
|
|
275
|
+
3. 拉 PR diff 与描述:gh pr diff <PR_NUMBER> 与 gh pr view <PR_NUMBER> --json title,body
|
|
276
|
+
4. 逐条比对 Issue 「验收标准」「目标」「方案」三节与 PR 的实际改动:
|
|
277
|
+
- 每条验收标准 → 在 diff 中找到对应实现位置(文件:行号),标记 ✅ 已实现 / ⚠️ 部分实现 / ❌ 未实现 / ➕ 超出范围
|
|
278
|
+
- 「部分实现」必须写明欠缺什么;「未实现」必须写明该在哪个文件做
|
|
279
|
+
- 若 Issue 无明确验收标准,按「目标」一节推断应有的可观察结果
|
|
280
|
+
|
|
281
|
+
【输出格式】
|
|
282
|
+
## Issue 验收报告
|
|
283
|
+
- Issue:#<id> <标题>
|
|
284
|
+
- 验收标准条目数:N
|
|
285
|
+
|
|
286
|
+
| # | 验收标准 | 状态 | 证据 / 欠缺 |
|
|
287
|
+
|---|----------|------|------------|
|
|
288
|
+
| 1 | <原文> | ✅/⚠️/❌ | <文件:行号 或 欠缺描述> |
|
|
289
|
+
|
|
290
|
+
## 结论
|
|
291
|
+
- 全部完成 / 部分完成(欠 X 条)/ 严重缺失(欠 Y 条核心项)
|
|
292
|
+
- 建议:通过 / 补做 / 拆 follow-up Issue
|
|
293
|
+
|
|
294
|
+
【重要】只返回上述报告文本。禁止调用 gh pr comment 或任何方式发评论——主 agent 统一发布。禁止改代码。
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
主线 C 的产出会被纳入 3.2 问题汇总,「❌ 未实现」「⚠️ 部分实现」按 **Critical / Major** 处理(详见 3.2 严重级映射)。
|
|
298
|
+
|
|
299
|
+
**第二轮及以后:按需降级**
|
|
300
|
+
|
|
301
|
+
- 单源审查(默认):上一轮修复少 / 仅 Minor / 改动集中少数文件 → 派一个 subagent(优先保留审查者 C `/code-review`,或审查者 B 逻辑,二选一)
|
|
302
|
+
- 多源审查:改动大 / 涉核心逻辑 / 上一轮有 Critical 修复 → 仍派审查者 A + B + C
|
|
303
|
+
- **审查者 C `/code-review` 始终 medium 档**,不随轮次升降档(轮次降级只减审查者数量,不改 effort)
|
|
304
|
+
- **主线 C Issue 验收**:每轮都派,不降级(功能完成度必须每轮复核,因修复可能引入新的偏离)
|
|
305
|
+
|
|
306
|
+
是否进第二/三轮:
|
|
307
|
+
|
|
308
|
+
- 上一轮全部修复且改动简单(仅格式/命名)→ 跳过后续审查,直接最终验证
|
|
309
|
+
- 上一轮有 Critical/Major 修复 → 应进下一轮
|
|
310
|
+
|
|
311
|
+
### 3.1.5 审查质量自检(主 agent 内联,无新增 subagent)
|
|
312
|
+
|
|
313
|
+
Wave 2 返回后,主 agent 必须按下面清单**逐条核对审查者 A/B/C 的报告**,不达标则**就地把不达标条目退回**对应 subagent 要求补充(同一 subagent,带原 prompt + 不达标条目清单 + "请补全:文件:行号 / 具体描述 / 具体改法",直到达标或退回 2 次仍不达标——记为该条无效,不写入审核报告)。
|
|
314
|
+
|
|
315
|
+
清单:
|
|
316
|
+
|
|
317
|
+
- [ ] 每条问题都带 **严重级 + 文件:行号 + ≥1 句具体描述 + 具体改法** 四要素
|
|
318
|
+
- [ ] 没有"建议优化"/"考虑使用 X 模式"这类无具体改法的空话条目
|
|
319
|
+
- [ ] 审查者 A/B/C 报告中均不含「功能未实现」类条目(那是主线 C 的范围)
|
|
320
|
+
- [ ] 审查者 C 的 findings 已归一化(剔除功能缺失类、补齐四要素),且确认其调用未带 `--comment` / `--fix`
|
|
321
|
+
- [ ] 报告中没有针对 `chore(precheck):` 历史遗留修复 commit 的 nitpick
|
|
322
|
+
|
|
323
|
+
这一步**不发 PR 评论**,只是主 agent 把不合格条目踢回 subagent。目的是保证最终落到 3.3b 审核报告里的每条都有可执行的改法。
|
|
324
|
+
|
|
325
|
+
### 3.2 问题汇总与去重
|
|
326
|
+
|
|
327
|
+
汇总主线 A(lint/build/test 失败)、主线 B(审查者 A 架构 / B 逻辑 / C 系统 `/code-review` 的发现)、主线 C(Issue 验收偏离)所有问题。
|
|
328
|
+
|
|
329
|
+
**主线 A 错误一律纳入本轮问题**:不区分"本 PR 引入"还是"历史遗留",全部按 Critical / Major 处理并修复。确实无法在本 skill 内修(跨服务 / 大规模重构)→ 在审核报告 + PR body 双处登记 follow-up Issue 编号后才能放行。
|
|
330
|
+
|
|
331
|
+
**主线 C 严重级映射:**
|
|
332
|
+
|
|
333
|
+
- ❌ 未实现核心验收标准 → **Critical**
|
|
334
|
+
- ⚠️ 部分实现 / 欠缺边界 → **Major**
|
|
335
|
+
- ➕ 超出 Issue 范围且无说明 → **Major**(要求 PR body 补释,或拆 follow-up Issue)
|
|
336
|
+
|
|
337
|
+
**去重规则:**
|
|
338
|
+
|
|
339
|
+
- 同文件同行同类问题 → 合并,保留更详细描述
|
|
340
|
+
- 同根因多个测试失败 → 合并,附所有失败用例名
|
|
341
|
+
- 多个审查者指同一问题 → 综合描述合并
|
|
342
|
+
|
|
343
|
+
**严重级分配:**
|
|
344
|
+
|
|
345
|
+
- **Critical** — 构建失败 / 测试失败 / 安全漏洞 / 数据丢失风险
|
|
346
|
+
- **Major** — 逻辑缺陷 / 错误处理缺失 / 性能问题
|
|
347
|
+
- **Minor** — 命名 / 风格 / 文档
|
|
348
|
+
|
|
349
|
+
### 3.3 发布审核报告到 PR(拆三条评论,职责单一)
|
|
350
|
+
|
|
351
|
+
无问题 → 跳 3.6 通过流程。
|
|
352
|
+
|
|
353
|
+
> **核心改进**:Issue 验收 / 代码审查 / 修复进度分别发独立评论(Hard Gate 3 升级为「三 comment gate」)。让 reviewer 在 GitHub PR 时间线上能按主题快速定位,不要把三种异构信息塞进同一长评论。
|
|
354
|
+
|
|
355
|
+
#### 3.3a Issue 验收独立评论(每轮第一条评论,主线 C 输出闭环)
|
|
356
|
+
|
|
357
|
+
```bash
|
|
358
|
+
gh pr comment $PR_NUMBER --body-file - <<'MSG'
|
|
359
|
+
## Issue 验收报告(第 N 轮)
|
|
360
|
+
|
|
361
|
+
- Issue:#<id> <标题>
|
|
362
|
+
- 验收标准条目数:N
|
|
363
|
+
- 结论:[全部完成 / 部分完成(欠 X 条) / 严重缺失(欠 Y 条核心项)]
|
|
364
|
+
|
|
365
|
+
### 逐条比对
|
|
366
|
+
|
|
367
|
+
| # | 验收标准 | 状态 | 证据 / 欠缺 |
|
|
368
|
+
|---|----------|------|------------|
|
|
369
|
+
| 1 | <原文> | ✅/⚠️/❌ | <文件:行号 或 欠缺描述> |
|
|
370
|
+
|
|
371
|
+
### 后续处理
|
|
372
|
+
|
|
373
|
+
- ❌ 未实现项 → 进入 3.4 修复或拆 follow-up Issue(附编号)
|
|
374
|
+
- ⚠️ 部分实现项 → 进入 3.4 修复
|
|
375
|
+
- ➕ 超出范围项 → 要求 PR body 补释或拆 follow-up Issue
|
|
376
|
+
|
|
377
|
+
---
|
|
378
|
+
*主线 C 产出,与代码审查解耦发布*
|
|
379
|
+
MSG
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
#### 3.3b 代码审查 + 验证审核报告(每轮第二条评论,主线 A + 主线 B 汇总)
|
|
383
|
+
|
|
384
|
+
```bash
|
|
385
|
+
gh pr comment $PR_NUMBER --body-file - <<'MSG'
|
|
386
|
+
## 代码审查报告(第 N 轮)
|
|
387
|
+
|
|
388
|
+
### 概要
|
|
389
|
+
- Critical:X 个
|
|
390
|
+
- Major:Y 个
|
|
391
|
+
- Minor:Z 个
|
|
392
|
+
|
|
393
|
+
### 验证流水线(主线 A)
|
|
394
|
+
- Lint:✅/❌
|
|
395
|
+
- 构建:✅/❌
|
|
396
|
+
- 测试:✅/❌(列实际执行的命令)
|
|
397
|
+
- 错误分类:本 PR 引入 X 条 / 历史遗留 Y 条(详见下方表)
|
|
398
|
+
|
|
399
|
+
### 历史遗留错误处理(若 Y > 0)
|
|
400
|
+
| # | 文件:行号 | 错误 | 本轮处理 |
|
|
401
|
+
|---|-----------|------|----------|
|
|
402
|
+
| 1 | path/file:42 | 描述 | 已 chore(precheck) 修复 / 已开 follow-up Issue #NNN |
|
|
403
|
+
|
|
404
|
+
### Critical 问题
|
|
405
|
+
| # | 来源 | 文件:行号 | 描述 | 建议改法 |
|
|
406
|
+
|---|------|-----------|------|----------|
|
|
407
|
+
| 1 | 审查者A / 审查者B / 审查者C(code-review) / 验证 | path/to/file:42 | 描述 | 改法 |
|
|
408
|
+
|
|
409
|
+
### Major 问题
|
|
410
|
+
| # | 来源 | 文件:行号 | 描述 | 建议改法 |
|
|
411
|
+
|---|------|-----------|------|----------|
|
|
412
|
+
|
|
413
|
+
### Minor 问题
|
|
414
|
+
| # | 来源 | 文件:行号 | 描述 | 建议改法 |
|
|
415
|
+
|---|------|-----------|------|----------|
|
|
416
|
+
|
|
417
|
+
### 处理决策
|
|
418
|
+
逐条标 修/拒(拒绝附 ≥1 句理由,"超出范围"不是唯一合法理由)
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
*主线 A 验证 + 主线 B 三源代码审查(架构 A / 逻辑 B / 系统 code-review C)汇总,与 Issue 验收解耦发布*
|
|
422
|
+
MSG
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
### 3.4 逐项修复
|
|
426
|
+
|
|
427
|
+
按严重级从高到低。
|
|
428
|
+
|
|
429
|
+
每个问题:
|
|
430
|
+
|
|
431
|
+
1. **判断修/拒**:
|
|
432
|
+
- 修:执行修改(含同文件历史遗留问题)
|
|
433
|
+
- 拒:记录理由(误报 / 设计意图)。"历史遗留" / "超出本 PR 范围"不是合法唯一理由
|
|
434
|
+
2. **修复后立即 commit**(一问题一 commit):
|
|
435
|
+
|
|
436
|
+
```bash
|
|
437
|
+
git add <修改文件>
|
|
438
|
+
git commit -F - <<'MSG'
|
|
439
|
+
fix: 修复审查问题 #<问题编号> — <简要描述>
|
|
440
|
+
|
|
441
|
+
- <具体改动说明>
|
|
442
|
+
|
|
443
|
+
Refs: #<issue-id>
|
|
444
|
+
MSG
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
3. 标 `CODE_CHANGED_SINCE_LAST_CHECK=true`
|
|
448
|
+
|
|
449
|
+
### 3.5 发布修复报告 + 推送
|
|
450
|
+
|
|
451
|
+
```bash
|
|
452
|
+
git push
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
```bash
|
|
456
|
+
gh pr comment $PR_NUMBER --body-file - <<'MSG'
|
|
457
|
+
## 修复报告(第 N 轮)
|
|
458
|
+
|
|
459
|
+
### 已修复
|
|
460
|
+
| # | 问题 | 修复方式 | Commit |
|
|
461
|
+
|---|------|----------|--------|
|
|
462
|
+
| 1 | [描述] | [说明] | abc1234 |
|
|
463
|
+
|
|
464
|
+
### 拒绝修复
|
|
465
|
+
| # | 问题 | 理由 |
|
|
466
|
+
|---|------|------|
|
|
467
|
+
| 1 | [描述] | [理由:误报/设计意图/超出范围] |
|
|
468
|
+
|
|
469
|
+
### 统计
|
|
470
|
+
- 总问题数:X
|
|
471
|
+
- 已修复:Y
|
|
472
|
+
- 拒绝修复:Z
|
|
473
|
+
MSG
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
### 3.6 决定是否下一轮
|
|
477
|
+
|
|
478
|
+
**通过条件**(任一):
|
|
479
|
+
|
|
480
|
+
- 本轮零问题
|
|
481
|
+
- 已达 `MAX_ROUNDS`(3 轮)
|
|
482
|
+
- 所有问题已修复且改动简单(仅格式/命名)
|
|
483
|
+
|
|
484
|
+
**继续下一轮条件**(全满足):
|
|
485
|
+
|
|
486
|
+
- `ROUND < MAX_ROUNDS`
|
|
487
|
+
- 本轮修过代码
|
|
488
|
+
- 存在 Critical/Major 修复(可能引入新问题)
|
|
489
|
+
|
|
490
|
+
继续 → `ROUND += 1`,回 3.1。
|
|
491
|
+
|
|
492
|
+
结束且 `CODE_CHANGED_SINCE_LAST_CHECK=true` → **最终验证**(串行 `dx lint` → `dx build affected --dev` → 关联测试,subagent 跑)。有失败修复 commit/push 后进 3.7;无失败直接 3.7。
|
|
493
|
+
|
|
494
|
+
结束且 `CODE_CHANGED_SINCE_LAST_CHECK=false` → 基于最近验证结果发 3.7。
|
|
495
|
+
|
|
496
|
+
### 3.7 发布验证总结报告
|
|
497
|
+
|
|
498
|
+
```bash
|
|
499
|
+
gh pr comment $PR_NUMBER --body-file - <<'MSG'
|
|
500
|
+
## ✅ 验证总结
|
|
501
|
+
|
|
502
|
+
### 门禁结果
|
|
503
|
+
|
|
504
|
+
| 步骤 | 状态 | 备注 |
|
|
505
|
+
|------|------|------|
|
|
506
|
+
| Lint (`dx lint`) | ✅ 通过 | |
|
|
507
|
+
| 构建 (`dx build affected --dev`) | ✅ 通过 | |
|
|
508
|
+
| 后端 E2E | ✅ 通过 | `dx test e2e backend <实际执行文件>` |
|
|
509
|
+
| 前端单测 | ⏭️ 跳过 | 无相关改动 |
|
|
510
|
+
| 管理端单测 | ⏭️ 跳过 | 无相关改动 |
|
|
511
|
+
|
|
512
|
+
### 审查统计
|
|
513
|
+
|
|
514
|
+
- 审查轮数:N
|
|
515
|
+
- 发现问题:X 个(Critical: a / Major: b / Minor: c)
|
|
516
|
+
- 已修复:Y 个
|
|
517
|
+
- 拒绝修复:Z 个
|
|
518
|
+
|
|
519
|
+
### 结论
|
|
520
|
+
|
|
521
|
+
所有质量门禁通过,PR 可合并。
|
|
522
|
+
MSG
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
> **基于实际结果填写,不编造**。失败后修复再通过 → 标"✅ 通过(修复后重跑)"。测试命令列写实际完整命令。
|
|
526
|
+
|
|
527
|
+
---
|
|
528
|
+
|
|
529
|
+
## 阶段四:自动合并
|
|
530
|
+
|
|
531
|
+
```bash
|
|
532
|
+
gh pr merge $PR_NUMBER --squash --auto
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
**禁止:**
|
|
536
|
+
|
|
537
|
+
- `gh pr merge --squash` 不带 `--auto`(绕过 CI)
|
|
538
|
+
- `--admin` 越权
|
|
539
|
+
- `--squash --auto || --squash` 短路 fallback
|
|
540
|
+
|
|
541
|
+
### Auto-merge 监控(独立 subagent)
|
|
542
|
+
|
|
543
|
+
设定 `--auto` 后,主 agent 派**独立 subagent 后台监控**, 自己释放上下文(避免审核完成后主 agent 还背着轮询任务,精力分散)。
|
|
544
|
+
|
|
545
|
+
Subagent prompt:
|
|
546
|
+
|
|
547
|
+
```
|
|
548
|
+
你是 auto-merge 监控者。轮询 PR #<PR_NUMBER> 直到合并完成或达到 stuck 阈值。
|
|
549
|
+
|
|
550
|
+
【任务】
|
|
551
|
+
1. 每 60 秒跑一次:
|
|
552
|
+
gh pr view <PR_NUMBER> --json state,mergedAt,statusCheckRollup,mergeStateStatus
|
|
553
|
+
2. 满足任一终止条件即返回:
|
|
554
|
+
- mergedAt 不为 null → 返回"已合并,merged_at=<ts>"
|
|
555
|
+
- state = CLOSED 且 mergedAt 为 null → 返回"PR 已关闭未合并"
|
|
556
|
+
- statusCheckRollup 出现 FAILURE → 返回"CI 失败,需修复",列失败 check 名称
|
|
557
|
+
- 累计轮询超过 30 分钟 → 返回"stuck > 30 min,当前 mergeStateStatus=<状态>"
|
|
558
|
+
3. 期间若 statusCheckRollup 还在 PENDING / IN_PROGRESS,继续等待,不要主动重跑 CI 或推 commit。
|
|
559
|
+
|
|
560
|
+
【重要】只返回结果文本。禁止调用 gh pr comment / gh pr merge / git push 等任何写操作。
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
**正常路径**:CI 全绿后 GitHub 自动 merge → subagent 返回"已合并" → 本 skill 完成。
|
|
564
|
+
|
|
565
|
+
**Stuck > 30 min**:subagent 返回 stuck 状态,主 agent 输出"auto-merge stuck,需人工介入",附 `mergeStateStatus`,结束。**禁止主 agent 自行 `--admin` 越权合并**。
|
|
566
|
+
|
|
567
|
+
> Train 模式:本 PR 真正 merge 到 main 之前**调用方不允许启动下一 PR**。这是 train 串行的核心约束(由 `feature-decide-plan-execute` C-Step 3 阶段 1 的依赖检查兜底)。
|
|
568
|
+
|
|
569
|
+
---
|
|
570
|
+
|
|
571
|
+
## 阶段五:完成输出
|
|
572
|
+
|
|
573
|
+
```
|
|
574
|
+
PR Ship 完成!
|
|
575
|
+
|
|
576
|
+
- PR: #<PR_NUMBER> <链接>
|
|
577
|
+
- Issue: #<ID> <标题>
|
|
578
|
+
- 审查轮数:N
|
|
579
|
+
- 修复 commit 数:X
|
|
580
|
+
- 问题统计:发现 A 个 / 修复 B 个 / 拒绝 C 个
|
|
581
|
+
- 合并状态:✓ Auto-merge 已触发并合并到 main(merged_at=<ts>)
|
|
582
|
+
|
|
583
|
+
状态:✓ Lint 通过 ✓ 构建通过 ✓ 测试通过 ✓ 审查完成 ✓ 已合并
|
|
584
|
+
|
|
585
|
+
下一步(Train 模式):可调用 feature-decide-plan-execute 继续下一 PR
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
---
|
|
589
|
+
|
|
590
|
+
## Hard Gates(不可跳过)
|
|
591
|
+
|
|
592
|
+
1. **输入 gate** — 必须有 PR 编号输入(或当前分支能查到 PR)。PR 不存在 → 拒绝执行,提示先用 `feature-decide-plan-execute` 建 PR。
|
|
593
|
+
2. **依赖串行 gate** — PR body 含 `PR Train` 标记时,依赖的上游 PR 必须已 merge 到 main(`mergedAt` 不为 null)才能继续。
|
|
594
|
+
3. **三 comment gate** — 每轮必须发**三条**评论:`Issue 验收报告`(3.3a,主线 C 输出)+ `代码审查报告`(3.3b,主线 A 验证 + 主线 B 审查汇总)+ `修复报告`(3.5,修复+拒绝 table)。**不允许合并**。reviewer 用验收 comment 看功能完成度,用审查 comment 看代码质量,用修复 comment 验证落实。
|
|
595
|
+
4. **Subagent 禁发评论 gate** — 验证流水线 / 审查者 / Issue 验收 / auto-merge 监控 subagent **只返回文本**,禁止自己 `gh pr comment`。主 agent 统一发布。
|
|
596
|
+
4.1. **两波 5 subagent gate** — 阶段三 3.1 每轮(第一轮)必须按两波派 subagent:
|
|
597
|
+
- Wave 1 并行 2 个:主线 A 验证 + 主线 C Issue 验收
|
|
598
|
+
- Wave 2 并行 3 个:审查者 A 架构 + 审查者 B 逻辑 + 审查者 C 系统 `/code-review`(三者 prompt 必须嵌入 Wave 1 主线 C 验收结论 + 历史遗留 commit hash 列表)
|
|
599
|
+
任一波缺失视为流程违规。第二轮起代码审查可降级减少审查者数量,但 **主线 C 不可降级、不可跳过**,且**审查者 C `/code-review` 固定 medium 档不随轮次升降**;Wave 1→Wave 2 的顺序依赖不可省略(即使主线 C 还在跑也要等它完成才能启动 Wave 2,因为 Wave 2 prompt 依赖其输出)。
|
|
600
|
+
4.2. **Issue 验收 gate** — 主线 C 报告「❌ 未实现核心验收标准」时,本轮不得跳到 3.6 通过流程;必须进入 3.4 修复(补做功能)或在 PR body 显式声明拆 follow-up Issue 并附编号,才能放行。
|
|
601
|
+
4.3. **审查质量自检 gate** — Wave 2 返回后必须按 3.1.5 清单核对 A/B 报告,缺四要素(严重级 + 文件:行号 + 描述 + 改法)的条目要退回 subagent 补全;最多退回 2 次,仍不达标的条目不写入 3.3b 审核报告。避免审查者用"建议优化"等空话凑数。
|
|
602
|
+
5. **`/code-review` 受控接入 gate** —
|
|
603
|
+
- 审查者 C 在裸 subagent 内调用系统 `/code-review --effort medium`,**必须只读**:严禁 `--comment`(会绕过单发布者产生重复评论)、严禁 `--fix`(会越权改业务代码,违反 Hard Gate 7)。findings 文本返回主 agent,由主 agent 在 3.3b 统一发布。
|
|
604
|
+
- 审查者 A / B 仍用**裸 subagent**,**不得**调用 `code-review` 技能或 `oh-my-claudecode:code-reviewer` agent(保持双源人格审查的多样性,且避免重复跑 `/code-review`)。
|
|
605
|
+
- 任何 subagent 都禁止 `gh pr comment`。
|
|
606
|
+
6. **Auto-merge gate** — 最终合并只能 `gh pr merge --squash --auto`。禁止不带 `--auto`、禁止 `--admin`、禁止 fallback。
|
|
607
|
+
7. **不越界做业务代码改动** — 本 skill 只产出"修复审查问题"的 commit;新增功能 / 重构 / 拆 PR 等动作回退给 `feature-decide-plan-execute`。
|
|
608
|
+
8. **Heredoc gate** — `gh pr comment` / commit message 多行内容必须 heredoc,禁止 `--body "...\n..."`。
|
|
609
|
+
9. **真合并才算完成** — 设定 `--auto` 后必须监控 `mergedAt`;stuck > 30 min 人工介入,不允许伪造完成态。
|
|
610
|
+
10. **预存错误零放行 gate** — 验证流水线报的任何 lint / build / test 失败(含非本 PR 引入的历史遗留)都必须在本 skill 内修复并 commit;确实无法当场修 → PR body + 审核报告双处登记 follow-up Issue 编号才能放行。禁止"非本 PR 引入"、"main 上本来就坏"、"先合了再说"等理由跳过。
|
|
611
|
+
|
|
612
|
+
## Critic 决策矩阵
|
|
613
|
+
|
|
614
|
+
| 严重级 | 默认决策 | 例外 |
|
|
615
|
+
|--------|---------|------|
|
|
616
|
+
| **Critical** | 必修 | 无 |
|
|
617
|
+
| **Major** | 修,除非有书面 out-of-scope 理由 | 转 follow-up issue |
|
|
618
|
+
| **Minor** | 修复 if < 5 行;否则附理由拒绝 | "超出本 PR 范围"不是唯一合法理由 |
|
|
619
|
+
| **What's Missing** | 转 follow-up issue 或纳入拒绝理由 | 历史遗留需明示 |
|
|
620
|
+
|
|
621
|
+
## Quick Reference
|
|
622
|
+
|
|
623
|
+
| 操作 | 命令 |
|
|
624
|
+
|------|------|
|
|
625
|
+
| 查 PR | `gh pr view <num> --json ...` |
|
|
626
|
+
| 拉 PR 分支 | `git fetch origin <branch> && git checkout <branch> && git pull` |
|
|
627
|
+
| 查 PR diff | `gh pr diff <num>` |
|
|
628
|
+
| 查依赖 PR 是否 merged | `gh pr view <dep> --json mergedAt --jq .mergedAt` |
|
|
629
|
+
| 冲突检测 | `git fetch origin main && git merge --no-commit --no-ff origin/main` |
|
|
630
|
+
| 发审核报告 | `gh pr comment <num> --body-file - <<'MSG' ... MSG` |
|
|
631
|
+
| 发修复报告 | 同上(不同模板) |
|
|
632
|
+
| 发验证总结 | 同上(验证总结模板) |
|
|
633
|
+
| 自动合并 | `gh pr merge <num> --squash --auto` |
|
|
634
|
+
| 监控合并状态 | `gh pr view <num> --json state,mergedAt,mergeStateStatus` |
|
|
635
|
+
|
|
636
|
+
## Common Mistakes
|
|
637
|
+
|
|
638
|
+
| 错误 | 加固 |
|
|
639
|
+
|------|------|
|
|
640
|
+
| 没传 PR 编号也没法从当前分支查到 | Hard Gate 1:先用 `feature-decide-plan-execute` 建 PR |
|
|
641
|
+
| 验证流水线 / 审查 / Issue 验收 subagent 自己 `gh pr comment` | Hard Gate 4:subagent 只返回文本 |
|
|
642
|
+
| 阶段三只派 3 个 subagent,漏掉 Issue 验收 | Hard Gate 4.1:必须两波 5 个(Wave2 三源) |
|
|
643
|
+
| 把 5 个 subagent 一次并行不分波 | Hard Gate 4.1:必须 Wave 1 完成主线 C 后再启 Wave 2,prompt 嵌验收结论 |
|
|
644
|
+
| Wave 2 审查者 prompt 没嵌主线 C 结论,跑出"功能未实现"重复条目 | Hard Gate 4.1:prompt 强制反向约束(审查者 A/B/C 都要剔除功能缺失类) |
|
|
645
|
+
| 审查者用"建议优化"凑条目 | Hard Gate 4.3:四要素自检退回补全 |
|
|
646
|
+
| Issue 验收报 ❌ 但 PR 直接合并 | Hard Gate 4.2:要么补做要么拆 follow-up Issue |
|
|
647
|
+
| 审查者 C 跑 `/code-review --comment` 直接发评论 | Hard Gate 5:必须裸跑只读,findings 经主 agent 统一发,禁 `--comment` |
|
|
648
|
+
| 审查者 C 跑 `/code-review --fix` 改了业务代码 | Hard Gate 5 + 7:禁 `--fix`,零业务改动,修复走 3.4 主 agent 决策 |
|
|
649
|
+
| 审查者 A/B 也去调 `/code-review` 技能 / `code-reviewer` agent | Hard Gate 5:只有审查者 C 承载 `/code-review`,A/B 裸 subagent 保人格多样性 |
|
|
650
|
+
| 把 Issue 验收 + 审核 + 修复 合并成一条评论 | Hard Gate 3:三 comment 必须分开 |
|
|
651
|
+
| `gh pr merge --squash` 不带 `--auto` | Hard Gate 6:绕过 CI |
|
|
652
|
+
| `gh pr merge --squash --auto \|\| --squash` 短路 fallback | 同上 |
|
|
653
|
+
| Train 依赖 PR 未 merge 就开始本 skill | Hard Gate 2:依赖串行 |
|
|
654
|
+
| 在本 skill 内做新功能业务代码改动 | Hard Gate 7:回退给 `feature-decide-plan-execute` |
|
|
655
|
+
| commit message / PR body 用 `\n` 字面量 | Hard Gate 8:必须 heredoc |
|
|
656
|
+
| 设 `--auto` 后不监控 `mergedAt` 就声称完成 | Hard Gate 9:必须真合并 |
|
|
657
|
+
| Auto-merge stuck > 30 min 不介入 | 检查 CI / 必需 reviews / branch protection |
|
|
658
|
+
| 拒绝修复只写"超出范围" | 必须 ≥1 句具体理由 |
|
|
659
|
+
| 主线 A 报的 lint/build/test 错误标"非本 PR 引入"跳过 | Hard Gate 10:预存错误零放行,必须修或登记 follow-up Issue |
|
|
660
|
+
| 把历史遗留 lint 错误留 TODO 不修 | Hard Gate 10:当场修;修不动就开 Issue 登记,不留口头承诺 |
|
|
661
|
+
| 历史遗留修复和本 PR 业务修复混在同一个 `fix:` commit | 3.1 隔离规则:历史遗留走 `chore(precheck):`,本 PR 走 `fix:`,下一轮审查 diff 排除历史 commit |
|
|
662
|
+
| 主 agent 自己轮询 auto-merge | 阶段四:独立 subagent 监控,主 agent 完成审核闭环即释放 |
|
|
663
|
+
| 简单改动跳过双 comment 直接 squash | 流程一致,避免漏掉历史遗留问题 |
|
|
664
|
+
|
|
665
|
+
## Tie-In With Other Skills
|
|
666
|
+
|
|
667
|
+
- `feature-decide-plan-execute` — 上游:建好 PR 后把 PR 编号交给本 skill
|
|
668
|
+
- `oh-my-claudecode:critic` agent — 阶段三审查子任务可调度(约束"禁发评论")
|
|
669
|
+
- 系统 `/code-review` — 阶段三 Wave 2 审查者 C 的承载工具,裸跑(`--effort medium`,禁 `--comment`/`--fix`),findings 经主 agent 统一发布
|