@ranger1/dx 0.1.103 → 0.1.105
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 +3 -2
- package/lib/codex-initial.js +59 -22
- package/package.json +1 -1
- package/skills/doctor/SKILL.md +3 -3
- package/skills/feature-decide-plan-execute/SKILL.md +537 -0
- package/skills/issues-batch-deliver/SKILL.md +440 -0
- package/skills/pr-train-ship/SKILL.md +516 -0
- 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
|
@@ -0,0 +1,516 @@
|
|
|
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 编号**,跑 **双源审查(≤3 轮)→ 双 comment → 修复循环 → 验证总结 → `gh pr merge --squash --auto` → 等真 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
|
+
**审查方式对齐 `git-pr-ship` 阶段四 4.1**:3 个 subagent 分别做 3 件事(验证 / 架构审查 / 逻辑审查),**额外**再派 1 个 subagent 做 Issue 验收检查(PR 是否真的实现了关联 Issue 的功能)。共计 **4 个 subagent 并行**。
|
|
124
|
+
|
|
125
|
+
> **关键约束**:所有 subagent(主线 A 验证 / 审查者 A / 审查者 B / 主线 C Issue 验收)**只向主 agent 返回结果文本,禁止自行调用 `gh pr comment` 或任何方式直接发布 PR 评论**。只有主 agent 在 3.3 / 3.5 / 3.7 发布唯一汇总报告。违反 → PR 上会出现多条重复审核报告。
|
|
126
|
+
|
|
127
|
+
**主线 A:验证流水线(subagent 串行有错即停)**
|
|
128
|
+
|
|
129
|
+
派独立 subagent(后台运行)。不要在主 agent 直接跑——主 agent 易被打断。
|
|
130
|
+
|
|
131
|
+
Subagent prompt:
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
你是验证流水线执行者。严格按顺序执行,任一步骤失败立即停止,不执行后续。
|
|
135
|
+
|
|
136
|
+
【重要】只负责执行验证并返回结果文本。禁止调用 gh pr comment 或以任何方式直接发评论。
|
|
137
|
+
|
|
138
|
+
【重要】返回的失败错误必须完整原样输出(含文件:行号 / 报错栈),不要做"是否本 PR 引入"的判断——主 agent 会统一处理,所有 lint/build/test 错误(含历史遗留)都要修。
|
|
139
|
+
|
|
140
|
+
Step 1: dx lint
|
|
141
|
+
- 失败:记录所有错误,停止
|
|
142
|
+
- 通过:继续
|
|
143
|
+
|
|
144
|
+
Step 2: dx build affected --dev
|
|
145
|
+
- 失败:记录错误,停止
|
|
146
|
+
- 通过:继续
|
|
147
|
+
|
|
148
|
+
Step 3: 运行关联测试(按改动范围判断)
|
|
149
|
+
- 后端改动 (apps/backend/):识别受影响 E2E -> dx test e2e backend <file-or-dir>;受影响 *.spec.ts 按文件运行
|
|
150
|
+
- 前端改动 (apps/front/):dx test unit front
|
|
151
|
+
- 管理端改动 (apps/admin-front/):dx test unit admin
|
|
152
|
+
- 无相关改动测试:跳过
|
|
153
|
+
|
|
154
|
+
返回格式:
|
|
155
|
+
- 执行到第几步
|
|
156
|
+
- 每步通过/失败
|
|
157
|
+
- 失败步骤完整错误输出
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
完成后设 `CODE_CHANGED_SINCE_LAST_CHECK=false`。
|
|
161
|
+
|
|
162
|
+
**主线 B:代码审查**
|
|
163
|
+
|
|
164
|
+
**第一轮:双源审查(必须)**
|
|
165
|
+
|
|
166
|
+
派两个独立 subagent:
|
|
167
|
+
|
|
168
|
+
**审查者 A** — 架构与代码质量:
|
|
169
|
+
|
|
170
|
+
```
|
|
171
|
+
作为资深架构师审查 PR #<PR_NUMBER> 的 diff,关注架构合理性、SOLID、错误处理、性能、安全。
|
|
172
|
+
审查 diff 涉及的文件时如顺便发现同一文件内的历史遗留问题,也一并报告(不主动扩大到 diff 之外)。
|
|
173
|
+
|
|
174
|
+
【重要】只返回审查结果文本。禁止调用 gh pr comment 或任何方式发评论——主 agent 统一发布。
|
|
175
|
+
|
|
176
|
+
获取 diff:gh pr diff <PR_NUMBER>
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**审查者 B** — 逻辑缺陷与规范:
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
作为质量工程师审查 PR #<PR_NUMBER> 的 diff,关注逻辑缺陷、边界条件、命名规范、类型安全、测试覆盖。
|
|
183
|
+
审查 diff 涉及的文件时如顺便发现同一文件内的历史遗留问题,也一并报告(不主动扩大)。
|
|
184
|
+
|
|
185
|
+
【重要】只返回审查结果文本。禁止调用 gh pr comment 或任何方式发评论——主 agent 统一发布。
|
|
186
|
+
|
|
187
|
+
获取 diff:gh pr diff <PR_NUMBER>
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
> ⚠️ **禁止使用 `code-review` 技能或 `oh-my-claudecode:code-reviewer` agent** —— 这些工具内置自动发 PR 评论行为,导致重复审核报告。必须用裸 subagent 并显式约束"禁止发评论"。
|
|
191
|
+
|
|
192
|
+
**主线 C — Issue 验收检查者**(独立 subagent,每轮必须派):
|
|
193
|
+
|
|
194
|
+
目的:审 PR diff 是否真把关联 Issue 的"验收标准 / 目标"逐条落地,避免「代码改了但功能没做完」「PR 描述说做了但 diff 里没体现」。
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
作为产品验收审查者,验证 PR #<PR_NUMBER> 是否实现了关联 Issue 的全部功能。
|
|
198
|
+
|
|
199
|
+
【任务步骤】
|
|
200
|
+
1. 提取关联 Issue ID:gh pr view <PR_NUMBER> --json body --jq .body | grep -oE '(Closes|Refs):\s*#[0-9]+'
|
|
201
|
+
2. 拉 Issue 全文:gh issue view <issue-id> --json title,body,state,labels
|
|
202
|
+
3. 拉 PR diff 与描述:gh pr diff <PR_NUMBER> 与 gh pr view <PR_NUMBER> --json title,body
|
|
203
|
+
4. 逐条比对 Issue 「验收标准」「目标」「方案」三节与 PR 的实际改动:
|
|
204
|
+
- 每条验收标准 → 在 diff 中找到对应实现位置(文件:行号),标记 ✅ 已实现 / ⚠️ 部分实现 / ❌ 未实现 / ➕ 超出范围
|
|
205
|
+
- 「部分实现」必须写明欠缺什么;「未实现」必须写明该在哪个文件做
|
|
206
|
+
- 若 Issue 无明确验收标准,按「目标」一节推断应有的可观察结果
|
|
207
|
+
|
|
208
|
+
【输出格式】
|
|
209
|
+
## Issue 验收报告
|
|
210
|
+
- Issue:#<id> <标题>
|
|
211
|
+
- 验收标准条目数:N
|
|
212
|
+
|
|
213
|
+
| # | 验收标准 | 状态 | 证据 / 欠缺 |
|
|
214
|
+
|---|----------|------|------------|
|
|
215
|
+
| 1 | <原文> | ✅/⚠️/❌ | <文件:行号 或 欠缺描述> |
|
|
216
|
+
|
|
217
|
+
## 结论
|
|
218
|
+
- 全部完成 / 部分完成(欠 X 条)/ 严重缺失(欠 Y 条核心项)
|
|
219
|
+
- 建议:通过 / 补做 / 拆 follow-up Issue
|
|
220
|
+
|
|
221
|
+
【重要】只返回上述报告文本。禁止调用 gh pr comment 或任何方式发评论——主 agent 统一发布。禁止改代码。
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
主线 C 的产出会被纳入 3.2 问题汇总,「❌ 未实现」「⚠️ 部分实现」按 **Critical / Major** 处理(详见 3.2 严重级映射)。
|
|
225
|
+
|
|
226
|
+
**第二轮及以后:按需降级**
|
|
227
|
+
|
|
228
|
+
- 单源审查(默认):上一轮修复少 / 仅 Minor / 改动集中少数文件 → 派一个 subagent
|
|
229
|
+
- 双源审查:改动大 / 涉核心逻辑 / 上一轮有 Critical 修复 → 仍派两个
|
|
230
|
+
- **主线 C Issue 验收**:每轮都派,不降级(功能完成度必须每轮复核,因修复可能引入新的偏离)
|
|
231
|
+
|
|
232
|
+
是否进第二/三轮:
|
|
233
|
+
|
|
234
|
+
- 上一轮全部修复且改动简单(仅格式/命名)→ 跳过后续审查,直接最终验证
|
|
235
|
+
- 上一轮有 Critical/Major 修复 → 应进下一轮
|
|
236
|
+
|
|
237
|
+
### 3.2 问题汇总与去重
|
|
238
|
+
|
|
239
|
+
汇总主线 A(lint/build/test 失败)、主线 B(架构 / 逻辑审查发现)、主线 C(Issue 验收偏离)所有问题。
|
|
240
|
+
|
|
241
|
+
**主线 A 错误一律纳入本轮问题**:不区分"本 PR 引入"还是"历史遗留",全部按 Critical / Major 处理并修复。确实无法在本 skill 内修(跨服务 / 大规模重构)→ 在审核报告 + PR body 双处登记 follow-up Issue 编号后才能放行。
|
|
242
|
+
|
|
243
|
+
**主线 C 严重级映射:**
|
|
244
|
+
|
|
245
|
+
- ❌ 未实现核心验收标准 → **Critical**
|
|
246
|
+
- ⚠️ 部分实现 / 欠缺边界 → **Major**
|
|
247
|
+
- ➕ 超出 Issue 范围且无说明 → **Major**(要求 PR body 补释,或拆 follow-up Issue)
|
|
248
|
+
|
|
249
|
+
**去重规则:**
|
|
250
|
+
|
|
251
|
+
- 同文件同行同类问题 → 合并,保留更详细描述
|
|
252
|
+
- 同根因多个测试失败 → 合并,附所有失败用例名
|
|
253
|
+
- 多个审查者指同一问题 → 综合描述合并
|
|
254
|
+
|
|
255
|
+
**严重级分配:**
|
|
256
|
+
|
|
257
|
+
- **Critical** — 构建失败 / 测试失败 / 安全漏洞 / 数据丢失风险
|
|
258
|
+
- **Major** — 逻辑缺陷 / 错误处理缺失 / 性能问题
|
|
259
|
+
- **Minor** — 命名 / 风格 / 文档
|
|
260
|
+
|
|
261
|
+
### 3.3 发布审核报告到 PR
|
|
262
|
+
|
|
263
|
+
无问题 → 跳 3.6 通过流程。
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
gh pr comment $PR_NUMBER --body-file - <<'MSG'
|
|
267
|
+
## 审核报告(第 N 轮)
|
|
268
|
+
|
|
269
|
+
### 概要
|
|
270
|
+
- Critical:X 个
|
|
271
|
+
- Major:Y 个
|
|
272
|
+
- Minor:Z 个
|
|
273
|
+
|
|
274
|
+
### Issue 验收结果(主线 C)
|
|
275
|
+
- Issue:#<id>
|
|
276
|
+
- 验收标准:N 条,✅ a / ⚠️ b / ❌ c
|
|
277
|
+
- 结论:[全部完成 / 部分完成 / 严重缺失]
|
|
278
|
+
|
|
279
|
+
### Critical 问题
|
|
280
|
+
| # | 来源 | 文件:行号 | 描述 |
|
|
281
|
+
|---|------|-----------|------|
|
|
282
|
+
| 1 | Lint/构建/测试/验收 | path/to/file:42 | 描述 |
|
|
283
|
+
|
|
284
|
+
### Major 问题
|
|
285
|
+
| # | 来源 | 文件:行号 | 描述 |
|
|
286
|
+
|---|------|-----------|------|
|
|
287
|
+
|
|
288
|
+
### Minor 问题
|
|
289
|
+
| # | 来源 | 文件:行号 | 描述 |
|
|
290
|
+
|---|------|-----------|------|
|
|
291
|
+
|
|
292
|
+
### 处理决策
|
|
293
|
+
逐条标 修/拒(拒绝附 ≥1 句理由)
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
*审查工具:dx lint -> dx build -> dx test + 双源代码审查 + Issue 验收检查*
|
|
297
|
+
MSG
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### 3.4 逐项修复
|
|
301
|
+
|
|
302
|
+
按严重级从高到低。
|
|
303
|
+
|
|
304
|
+
每个问题:
|
|
305
|
+
|
|
306
|
+
1. **判断修/拒**:
|
|
307
|
+
- 修:执行修改(含同文件历史遗留问题)
|
|
308
|
+
- 拒:记录理由(误报 / 设计意图)。"历史遗留" / "超出本 PR 范围"不是合法唯一理由
|
|
309
|
+
2. **修复后立即 commit**(一问题一 commit):
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
git add <修改文件>
|
|
313
|
+
git commit -F - <<'MSG'
|
|
314
|
+
fix: 修复审查问题 #<问题编号> — <简要描述>
|
|
315
|
+
|
|
316
|
+
- <具体改动说明>
|
|
317
|
+
|
|
318
|
+
Refs: #<issue-id>
|
|
319
|
+
MSG
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
3. 标 `CODE_CHANGED_SINCE_LAST_CHECK=true`
|
|
323
|
+
|
|
324
|
+
### 3.5 发布修复报告 + 推送
|
|
325
|
+
|
|
326
|
+
```bash
|
|
327
|
+
git push
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
```bash
|
|
331
|
+
gh pr comment $PR_NUMBER --body-file - <<'MSG'
|
|
332
|
+
## 修复报告(第 N 轮)
|
|
333
|
+
|
|
334
|
+
### 已修复
|
|
335
|
+
| # | 问题 | 修复方式 | Commit |
|
|
336
|
+
|---|------|----------|--------|
|
|
337
|
+
| 1 | [描述] | [说明] | abc1234 |
|
|
338
|
+
|
|
339
|
+
### 拒绝修复
|
|
340
|
+
| # | 问题 | 理由 |
|
|
341
|
+
|---|------|------|
|
|
342
|
+
| 1 | [描述] | [理由:误报/设计意图/超出范围] |
|
|
343
|
+
|
|
344
|
+
### 统计
|
|
345
|
+
- 总问题数:X
|
|
346
|
+
- 已修复:Y
|
|
347
|
+
- 拒绝修复:Z
|
|
348
|
+
MSG
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
### 3.6 决定是否下一轮
|
|
352
|
+
|
|
353
|
+
**通过条件**(任一):
|
|
354
|
+
|
|
355
|
+
- 本轮零问题
|
|
356
|
+
- 已达 `MAX_ROUNDS`(3 轮)
|
|
357
|
+
- 所有问题已修复且改动简单(仅格式/命名)
|
|
358
|
+
|
|
359
|
+
**继续下一轮条件**(全满足):
|
|
360
|
+
|
|
361
|
+
- `ROUND < MAX_ROUNDS`
|
|
362
|
+
- 本轮修过代码
|
|
363
|
+
- 存在 Critical/Major 修复(可能引入新问题)
|
|
364
|
+
|
|
365
|
+
继续 → `ROUND += 1`,回 3.1。
|
|
366
|
+
|
|
367
|
+
结束且 `CODE_CHANGED_SINCE_LAST_CHECK=true` → **最终验证**(串行 `dx lint` → `dx build affected --dev` → 关联测试,subagent 跑)。有失败修复 commit/push 后进 3.7;无失败直接 3.7。
|
|
368
|
+
|
|
369
|
+
结束且 `CODE_CHANGED_SINCE_LAST_CHECK=false` → 基于最近验证结果发 3.7。
|
|
370
|
+
|
|
371
|
+
### 3.7 发布验证总结报告
|
|
372
|
+
|
|
373
|
+
```bash
|
|
374
|
+
gh pr comment $PR_NUMBER --body-file - <<'MSG'
|
|
375
|
+
## ✅ 验证总结
|
|
376
|
+
|
|
377
|
+
### 门禁结果
|
|
378
|
+
|
|
379
|
+
| 步骤 | 状态 | 备注 |
|
|
380
|
+
|------|------|------|
|
|
381
|
+
| Lint (`dx lint`) | ✅ 通过 | |
|
|
382
|
+
| 构建 (`dx build affected --dev`) | ✅ 通过 | |
|
|
383
|
+
| 后端 E2E | ✅ 通过 | `dx test e2e backend <实际执行文件>` |
|
|
384
|
+
| 前端单测 | ⏭️ 跳过 | 无相关改动 |
|
|
385
|
+
| 管理端单测 | ⏭️ 跳过 | 无相关改动 |
|
|
386
|
+
|
|
387
|
+
### 审查统计
|
|
388
|
+
|
|
389
|
+
- 审查轮数:N
|
|
390
|
+
- 发现问题:X 个(Critical: a / Major: b / Minor: c)
|
|
391
|
+
- 已修复:Y 个
|
|
392
|
+
- 拒绝修复:Z 个
|
|
393
|
+
|
|
394
|
+
### 结论
|
|
395
|
+
|
|
396
|
+
所有质量门禁通过,PR 可合并。
|
|
397
|
+
MSG
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
> **基于实际结果填写,不编造**。失败后修复再通过 → 标"✅ 通过(修复后重跑)"。测试命令列写实际完整命令。
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
## 阶段四:自动合并
|
|
405
|
+
|
|
406
|
+
```bash
|
|
407
|
+
gh pr merge $PR_NUMBER --squash --auto
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
**禁止:**
|
|
411
|
+
|
|
412
|
+
- `gh pr merge --squash` 不带 `--auto`(绕过 CI)
|
|
413
|
+
- `--admin` 越权
|
|
414
|
+
- `--squash --auto || --squash` 短路 fallback
|
|
415
|
+
|
|
416
|
+
### Auto-merge 监控
|
|
417
|
+
|
|
418
|
+
设定 `--auto` 后等待 main 真合并:
|
|
419
|
+
|
|
420
|
+
```bash
|
|
421
|
+
# 监控 PR 状态(间隔轮询;stuck > 30 min 人工介入)
|
|
422
|
+
gh pr view $PR_NUMBER --json state,mergedAt,statusCheckRollup,mergeStateStatus
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
**正常路径**:CI 全绿后 GitHub 自动 merge → `mergedAt` 不为 null → 本 skill 完成。
|
|
426
|
+
|
|
427
|
+
**Stuck > 30 min**:人工介入,检查 CI / required reviews / branch protection。本 skill 输出"auto-merge stuck,需人工介入"提示,给出当前 `mergeStateStatus`,结束。
|
|
428
|
+
|
|
429
|
+
> Train 模式:本 PR 真正 merge 到 main 之前**调用方不允许启动下一 PR**。这是 train 串行的核心约束(由 `feature-decide-plan-execute` C-Step 3 阶段 1 的依赖检查兜底)。
|
|
430
|
+
|
|
431
|
+
---
|
|
432
|
+
|
|
433
|
+
## 阶段五:完成输出
|
|
434
|
+
|
|
435
|
+
```
|
|
436
|
+
PR Ship 完成!
|
|
437
|
+
|
|
438
|
+
- PR: #<PR_NUMBER> <链接>
|
|
439
|
+
- Issue: #<ID> <标题>
|
|
440
|
+
- 审查轮数:N
|
|
441
|
+
- 修复 commit 数:X
|
|
442
|
+
- 问题统计:发现 A 个 / 修复 B 个 / 拒绝 C 个
|
|
443
|
+
- 合并状态:✓ Auto-merge 已触发并合并到 main(merged_at=<ts>)
|
|
444
|
+
|
|
445
|
+
状态:✓ Lint 通过 ✓ 构建通过 ✓ 测试通过 ✓ 审查完成 ✓ 已合并
|
|
446
|
+
|
|
447
|
+
下一步(Train 模式):可调用 feature-decide-plan-execute 继续下一 PR
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
---
|
|
451
|
+
|
|
452
|
+
## Hard Gates(不可跳过)
|
|
453
|
+
|
|
454
|
+
1. **输入 gate** — 必须有 PR 编号输入(或当前分支能查到 PR)。PR 不存在 → 拒绝执行,提示先用 `feature-decide-plan-execute` 建 PR。
|
|
455
|
+
2. **依赖串行 gate** — PR body 含 `PR Train` 标记时,依赖的上游 PR 必须已 merge 到 main(`mergedAt` 不为 null)才能继续。
|
|
456
|
+
3. **双 comment gate** — 每轮必须发**两条**评论:`审核报告`(issue table)+ `修复报告`(修复+拒绝 table)。**不允许合并成一条**。reviewer 用 review comment 决定 approve,用 fix comment 验证落实。
|
|
457
|
+
4. **Subagent 禁发评论 gate** — 验证流水线 / 审查者 / Issue 验收 subagent **只返回文本**,禁止自己 `gh pr comment`。主 agent 统一发布。
|
|
458
|
+
4.1. **4 subagent 并行 gate** — 阶段三 3.1 每轮必须并行派 4 个 subagent:主线 A 验证 + 审查者 A 架构 + 审查者 B 逻辑 + 主线 C Issue 验收。任一缺失视为流程违规。第二轮起代码审查可降级为单源,但 **主线 C 不可降级、不可跳过**。
|
|
459
|
+
4.2. **Issue 验收 gate** — 主线 C 报告「❌ 未实现核心验收标准」时,本轮不得跳到 3.6 通过流程;必须进入 3.4 修复(补做功能)或在 PR body 显式声明拆 follow-up Issue 并附编号,才能放行。
|
|
460
|
+
5. **禁用 code-review 技能 / code-reviewer agent gate** — 这些工具内置自动发评论。必须用裸 subagent。
|
|
461
|
+
6. **Auto-merge gate** — 最终合并只能 `gh pr merge --squash --auto`。禁止不带 `--auto`、禁止 `--admin`、禁止 fallback。
|
|
462
|
+
7. **不越界做业务代码改动** — 本 skill 只产出"修复审查问题"的 commit;新增功能 / 重构 / 拆 PR 等动作回退给 `feature-decide-plan-execute`。
|
|
463
|
+
8. **Heredoc gate** — `gh pr comment` / commit message 多行内容必须 heredoc,禁止 `--body "...\n..."`。
|
|
464
|
+
9. **真合并才算完成** — 设定 `--auto` 后必须监控 `mergedAt`;stuck > 30 min 人工介入,不允许伪造完成态。
|
|
465
|
+
10. **预存错误零放行 gate** — 验证流水线报的任何 lint / build / test 失败(含非本 PR 引入的历史遗留)都必须在本 skill 内修复并 commit;确实无法当场修 → PR body + 审核报告双处登记 follow-up Issue 编号才能放行。禁止"非本 PR 引入"、"main 上本来就坏"、"先合了再说"等理由跳过。
|
|
466
|
+
|
|
467
|
+
## Critic 决策矩阵
|
|
468
|
+
|
|
469
|
+
| 严重级 | 默认决策 | 例外 |
|
|
470
|
+
|--------|---------|------|
|
|
471
|
+
| **Critical** | 必修 | 无 |
|
|
472
|
+
| **Major** | 修,除非有书面 out-of-scope 理由 | 转 follow-up issue |
|
|
473
|
+
| **Minor** | 修复 if < 5 行;否则附理由拒绝 | "超出本 PR 范围"不是唯一合法理由 |
|
|
474
|
+
| **What's Missing** | 转 follow-up issue 或纳入拒绝理由 | 历史遗留需明示 |
|
|
475
|
+
|
|
476
|
+
## Quick Reference
|
|
477
|
+
|
|
478
|
+
| 操作 | 命令 |
|
|
479
|
+
|------|------|
|
|
480
|
+
| 查 PR | `gh pr view <num> --json ...` |
|
|
481
|
+
| 拉 PR 分支 | `git fetch origin <branch> && git checkout <branch> && git pull` |
|
|
482
|
+
| 查 PR diff | `gh pr diff <num>` |
|
|
483
|
+
| 查依赖 PR 是否 merged | `gh pr view <dep> --json mergedAt --jq .mergedAt` |
|
|
484
|
+
| 冲突检测 | `git fetch origin main && git merge --no-commit --no-ff origin/main` |
|
|
485
|
+
| 发审核报告 | `gh pr comment <num> --body-file - <<'MSG' ... MSG` |
|
|
486
|
+
| 发修复报告 | 同上(不同模板) |
|
|
487
|
+
| 发验证总结 | 同上(验证总结模板) |
|
|
488
|
+
| 自动合并 | `gh pr merge <num> --squash --auto` |
|
|
489
|
+
| 监控合并状态 | `gh pr view <num> --json state,mergedAt,mergeStateStatus` |
|
|
490
|
+
|
|
491
|
+
## Common Mistakes
|
|
492
|
+
|
|
493
|
+
| 错误 | 加固 |
|
|
494
|
+
|------|------|
|
|
495
|
+
| 没传 PR 编号也没法从当前分支查到 | Hard Gate 1:先用 `feature-decide-plan-execute` 建 PR |
|
|
496
|
+
| 验证流水线 / 审查 / Issue 验收 subagent 自己 `gh pr comment` | Hard Gate 4:subagent 只返回文本 |
|
|
497
|
+
| 阶段三只派 3 个 subagent,漏掉 Issue 验收 | Hard Gate 4.1:必须 4 个并行 |
|
|
498
|
+
| Issue 验收报 ❌ 但 PR 直接合并 | Hard Gate 4.2:要么补做要么拆 follow-up Issue |
|
|
499
|
+
| 用 `code-review` 技能 / `code-reviewer` agent | Hard Gate 5:必须裸 subagent |
|
|
500
|
+
| 把 review + fix 合并成一条评论 | Hard Gate 3:双 comment 必须分开 |
|
|
501
|
+
| `gh pr merge --squash` 不带 `--auto` | Hard Gate 6:绕过 CI |
|
|
502
|
+
| `gh pr merge --squash --auto \|\| --squash` 短路 fallback | 同上 |
|
|
503
|
+
| Train 依赖 PR 未 merge 就开始本 skill | Hard Gate 2:依赖串行 |
|
|
504
|
+
| 在本 skill 内做新功能业务代码改动 | Hard Gate 7:回退给 `feature-decide-plan-execute` |
|
|
505
|
+
| commit message / PR body 用 `\n` 字面量 | Hard Gate 8:必须 heredoc |
|
|
506
|
+
| 设 `--auto` 后不监控 `mergedAt` 就声称完成 | Hard Gate 9:必须真合并 |
|
|
507
|
+
| Auto-merge stuck > 30 min 不介入 | 检查 CI / 必需 reviews / branch protection |
|
|
508
|
+
| 拒绝修复只写"超出范围" | 必须 ≥1 句具体理由 |
|
|
509
|
+
| 主线 A 报的 lint/build/test 错误标"非本 PR 引入"跳过 | Hard Gate 10:预存错误零放行,必须修或登记 follow-up Issue |
|
|
510
|
+
| 把历史遗留 lint 错误留 TODO 不修 | Hard Gate 10:当场修;修不动就开 Issue 登记,不留口头承诺 |
|
|
511
|
+
| 简单改动跳过双 comment 直接 squash | 流程一致,避免漏掉历史遗留问题 |
|
|
512
|
+
|
|
513
|
+
## Tie-In With Other Skills
|
|
514
|
+
|
|
515
|
+
- `feature-decide-plan-execute` — 上游:建好 PR 后把 PR 编号交给本 skill
|
|
516
|
+
- `oh-my-claudecode:critic` agent — 阶段三审查子任务可调度(约束"禁发评论")
|