关于 pr-review
pr-review 是专用于编排的技能,通过六个专项子 Agent 并行审查 GitHub 拉取请求。它会发现项目的测试、需求、约定和审查技能,让各审查者依据仓库自身规范开展工作。
主要功能
- 01并行协调六个子 Agent
- 02发现项目审查上下文
- 03与技术栈无关的审查编排
- 04按置信度筛选发现
- 05仅发布评论
适用场景
- 01协调并行拉取请求审查
- 02依据仓库约定调整审查
- 03按项目需求核对变更
- 04避免重复审查评论
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ tech-leads-club/ agent-skills --skill pr-review安装后在 Claude Code 中输入/pr-review确认已加载。
详细介绍
PR Review — 自适应编排协议
通过 Task 工具协调 6 个专门的子 Agent,然后将它们的发现汇总为一份摘要。此技能与技术栈无关:它本身不定义任何规则,而是发现项目已有的文档内容——测试运行器、需求规范、架构约定、项目本地的审查技能——并由每个子 Agent 加载并应用该项目实际具备的内容。它绝不臆造特定技术栈的规则,也不重复项目文档。
执行约定(不可妥协)
此技能是一套仅用于编排的协议。请先阅读以下规则:
- 你是编排者。你绝不能分析差异、阅读源文件,或自行撰写任何审查发现。你唯一的工作是收集上下文(步骤 1)、启动子 Agent(步骤 2),以及启动负责汇总的子 Agent(步骤 3)。
- 六项审查必须由六个独立的通用子 Agent执行(不受工具集限制),并且必须在单个批次中并行启动。使用运行环境提供的任意子 Agent/并行任务机制(在 Claude Code 中使用 Task 工具)。
- 在当前对话中执行审查——哪怕只执行一部分,哪怕是“为了节省时间”,哪怕差异很小——都属于此技能的失败。差异大小不构成例外。
- 每个子 Agent 的提示词都必须自包含:需提供
{REPO}、{PR}、{SHA}、差异、PR 意图、现有评论位置以及 DISCOVERY MAP。子 Agent 不会共享你的上下文。
**宿主前提:**通过 gh CLI 操作 GitHub 拉取请求——以下每次获取和发布操作都使用 gh。“与技术栈无关”指与语言和框架无关,不表示与宿主平台无关:托管在 GitLab/Bitbucket 上的仓库(使用 MR 而非 PR)不在适用范围内。
仅支持显式调用(disable-model-invocation: true)。编码期间绝不自动触发。
步骤 1:初始化
1a. PR 上下文
- 从用户请求中确定 PR 编号;若缺失则询问。
- 确定仓库:
gh repo view --json nameWithOwner -q .nameWithOwner→{REPO}。 - 获取差异:
gh pr diff {PR}。获取 head SHA:gh pr view {PR} --json headRefOid -q .headRefOid→{SHA}(这是为行内评论指定位置所必需的)。 - 加载现有行内评论:
gh api repos/{REPO}/pulls/{PR}/comments— 建立{id, path, line}记录集合:使用{path, line}避免重复发布评论,保留每条评论的正文以识别已解决的问题,并保留每条评论的id以发布串联回复。 - 阅读 PR 意图:
gh pr view {PR} --json title,body,headRefName。
1b. 项目发现(自适应骨干)
探查一次代码仓库,并记录一份项目概况——下方的 DISCOVERY MAP——逐字传递给每个子 Agent。在这一步投入足够精力;这是让审查贴合当前项目的关键。**优先采用项目明确声明的证据,而非猜测。**只检测实际存在的内容;缺少的内容标记为 none。
- 测试运行器 + 布局——查找 CI 实际运行的命令。按以下顺序检查:CI 工作流(
.github/workflows/*——或代码仓库使用的任何 CI 配置,例如.gitlab-ci.yml,仅用于找出实际测试命令),将其视为权威来源;然后再参考清单文件(package.json脚本、pyproject.toml/tox.ini/pytest.ini、go.mod、Cargo.toml、Gemfile、Makefile、*.gradle)。根据现有测试推导测试文件 glob(例如*.spec.ts、*_test.go、test_*.py、*_spec.rb),并记录代码仓库采用的单元测试与集成测试/e2e 测试划分。 - 需求来源——(A) 分支名称或 PR 正文中的问题跟踪器编号(例如 Jira/Linear 的
[A-Z]+-\d+、GitHub issue 的#\d+或owner/repo#\d+、完整工单 URL);(B) 代码仓库内的规范/需求文件:.specs/树、docs/、*-spec.md、*-tasks.md、PRD 文件,或 ADR/RFC 目录。 - 架构/约定文档——记录说明项目规则的文件:
CONTRIBUTING*、ARCHITECTURE*、CONVENTIONS*、docs/**中的约定文件、AGENTS.md、CLAUDE.md,以及代码仓库保留的任何编码/集成/安全模式文档。记录路径;暂时不要阅读,负责的子 Agent 会阅读。 - 项目本地审查技能——扫描技能目录(
.claude/skills/、.cursor/skills/、.codex/skills/、.github/),查找涵盖测试、架构/模块化或安全的技能。记录其SKILL.md路径,以便子 Agent 加载项目自身的参考资料,而非自行猜测。
简洁记录该映射,并逐字传递给每个子 Agent:
TEST: <command> | globs: <...> | unit vs e2e: <split | none> | none-found
REQS: tracker=<Jira KEY-123 | GH #42 | Linear ABC-7 | none> ; specs=<paths | none>
CONVENTIONS: <doc/skill paths that state rules | none-found>
REVIEW_SKILLS: <project-local test/arch skill paths | none>
每个子 Agent 只能加载映射中列出的内容;若某个类别为 none,则回退到该部分的通用检查清单,并注明这一点。
第 2 步:并行启动子 Agent
发送一条消息,其中包含六个 Task 工具调用,并同时启动。每个子 Agent 都是独立的——它无法看到此对话,因此其提示词必须包含完整上下文:{REPO}、{PR}、{SHA}、差异、现有的 {id,path,line} 评论集、PR 意图,以及项目概况(上方的 DISCOVERY MAP)。六个子 Agent 全部完成后,执行第 3 步。
严重程度标签(所有子 Agent 均使用)
- 🚨 严重 — 会导致故障的 Bug 或逻辑错误
- 🔒 安全 — 漏洞或数据泄露
- ⚡ 性能 — 重大性能问题
- ⚠️ 警告 — 代码异味或可维护性问题
- 💡 建议 — 可选改进
通用规则(每个子 Agent 和整合步骤都必须遵守)
- 评论发布机制 — 切勿发布格式损坏的正文。 对于任何多行评论或摘要,先将正文写入临时文件,再使用
--body-file或-F body=@file发布。请参阅下方的准确命令。这是最常见的失败原因 — 务必正确操作。 - 评论允许列表: 仅在以
+开头的差异行上发布行内评论(绝不在+++上评论)。将评论锚定到作为证据的确切+行。 - 跳过重复评论: 如果
{path, line}周围 ±3 行内已有评论,则跳过。 - 标记已解决: 对于差异中已修复其问题的现有评论,回复
[RESOLVED] This appears resolved by the recent changes.— 使用下方的回复端点在该评论线程中发布,并使用步骤 1a.4 中该评论的id。 - 置信度门槛: 仅报告置信度 ≥80% 的发现。不确定时保持沉默。
- 正面亮点: 每个子 Agent 在列出问题前,至少指出一个做得好的方面。
- 仅发表评论,绝不执行破坏性操作: 绝不使用
--approve或--request-changes,也绝不修改文件。仅使用--comment。 - 不提及归属: 评论正文中绝不提及 AI、助手、模型或任何工具。以评审者的身份撰写。
- 标记: 每条行内评论正文都必须以 `` 开头(渲染后不可见;整合步骤会解析它)。
{type}∈security | requirements | tests | architecture | regression | performance。 - 语气: 具体、可操作、友善协作。始终解释原因。
评论发布命令(原样复制)
先将正文写入临时文件(例如 body.md),然后:
对新增行发布行内评审评论:
gh api repos/{REPO}/pulls/{PR}/comments \
-F [email protected] -f commit_id={SHA} -f path={path} -F line={N} -f side=RIGHT
line={N} 是头文件 RIGHT 侧的 从 1 开始的行号 — 从 hunk 标题中的 +c 起始行开始计数,并包含新增行和上下文行。它不是差异或 hunk 的相对偏移;使用差异相对位置会返回 422 错误,或将评论发到错误行上。
在现有评论线程中回复(针对规则 4 [RESOLVED]),使用步骤 1a.4 中的 {COMMENT_ID}:
gh api repos/{REPO}/pulls/{PR}/comments/{COMMENT_ID}/replies -F [email protected]
PR 级摘要(Requirements 子 Agent 和整合步骤):
gh pr review {PR} --comment --body-file body.md
-F/--field 会将 @file 展开为文件内容,并将数字字段识别为数字;-f/--raw-field 不会 — -f [email protected] 会发布字面字符串 @body.md,而不是你的评论。因此:正文使用 -F body=@file,行号使用 -F line=N,普通字符串字段(commit_id、path、side)使用 -f。绝不要使用 -f body=@file。如果不确定正文该如何传递,优先使用 --body-file。
子 Agent 1:安全 — ``
如果配置文件列出了安全或集成规范文档,或安全专项项目技能(来自 CONVENTIONS / REVIEW_SKILLS),请加载这些内容,并先按照其中的规则评审差异。然后无论如何都要执行以下通用检查:硬编码的密钥或凭据;新端点缺少身份验证或授权;日志中包含个人身份信息或机密;缺少 webhook 或回调签名验证;CORS 权限过于宽泛;未经净化的输入被用于查询、命令或模板(注入);不安全的反序列化;用户拥有的资源存在访问控制缺陷;响应载荷泄露敏感字段;内部客户端或密钥跨模块边界导出。
第二轮检查(必须执行): 从头到尾重新阅读完整差异。列出所有未发表评论的文件或代码块。针对每一项,询问:“是否违反我职责范围内的任何安全规则?”只有在能够明确说明文件为何没有问题时,才可跳过该文件。
评论格式:
🔒 Security — [Short title]
[What the issue is and why it matters]
**Recommendation:** [Specific fix]
子 Agent 2:需求与完成定义 — ``
仅发布一条 PR 级摘要评论 — 不发布行内评论。
通过两种途径发现需求(从配置文件的 REQS 获取)。两种途径都要执行;采用能够获取到内容的途径。
跟踪路径 A — 问题跟踪器
从分支名称或 PR 正文中提取工单/问题编号,然后使用环境允许的方式获取相关内容。根据项目使用的问题跟踪器进行调整:
- GitHub 问题
#N→gh issue view {N} --json title,body(或使用owner/repo#N格式)。 - Jira
KEY-123→ 使用项目已配置的 Jira CLI 或 Atlassian MCP(问题摘要 + 描述 + 验收标准)。只能使用环境中已配置的主机/凭据,绝不要编造或硬编码 Jira 主机。 - Linear/其他 → 使用项目文档中指定的方式。
解析验收标准、用户故事和 DoD 项目。如果没有编号或凭据,则跳过跟踪路径 A,转到跟踪路径 B。
跟踪路径 B — 仓库内的规范文件
扫描 PR 标题/正文,查找引用的规范/任务文件(明确路径、Markdown 链接、spec:/tasks: 提及)。还要检查项目配置中的 .specs/、docs/、ADR/RFC 目录,查找与分支、工单或功能名称匹配的文件(按文件名主体进行模糊匹配)。阅读每个候选文件,提取验收标准、任务清单项以及声明的目标/非目标。ADR/RFC 中的“Decision”和“Consequences”部分也视为需求。
判定逻辑
| 含有内容的跟踪路径 | 操作 |
|---|---|
| A 和 B 都有 | 合并需求;注明每项的来源 |
| 只有 A | 使用跟踪器需求 |
| 只有 B | 使用规范文件需求 |
| 都没有 | 发布:⚠️ No issue ticket or spec file found — requirements verification skipped. 并停止 |
逐项评估,以证据为依据。 对每项标准,定位实现代码并标记为 ✅ 已实现(引用 path:line)、🟡 部分实现(缺少有意义的子句)或 ❌ 未实现。没有找到证据 ⇒ 不算实现——绝不要仅凭 PR 描述重述了意图就判定为已实现。测试只执行某项行为、但未断言该行为,不算验证通过。
第二轮检查(必须): 逐项重新阅读合并后的需求列表,并问:“我是否针对差异逐项评估了这条需求?” 根据实际差异,为每个未评估项标记 ✅/🟡/❌。
摘要格式:
## 📋 Requirements Review
**Sources:** {e.g. "Jira: KEY-123" | "Spec: .specs/<feature>/spec.md" | "Both" | "None"}
### ✅ Implemented — [criterion — `path:line`]
### 🟡 Partial — [criterion — what's missing]
### ❌ Missing — [criterion]
### 🔲 Definition of Done — [x] covered / [ ] not covered
### 💬 Notes
子 Agent 3:测试覆盖 — ``
使用项目配置中的 TEST 运行器和目录布局,了解测试应放在哪里,以及在本项目中什么才算“正确的测试”。如果 REVIEW_SKILLS 列出了项目本地的测试技能,加载并使用该技能,将其模式作为测试位置、命名、设置/拆卸和断言风格的参考。否则应用通用标准。不要强加项目未使用的框架。
检查差异中是否存在以下问题:新增或变更的行为没有相应测试(对于公开/入口行为——新增端点、处理器、导出函数、事件/队列消费者、作业——属于 🚨 严重问题);所需测试级别错误(纯逻辑需要单元测试;可观察的 I/O——HTTP/持久化/队列——需要集成/端到端测试;同时涉及两者的行为需要两种测试);以及质量缺陷(测试位置不符合项目布局、缺少清理/拆卸、没有固定数据/工厂、ID 硬编码、缺少负面/错误场景、断言只执行行为却没有断言结果)。
第二轮检查(必须): 重新阅读完整差异。列出所有你尚未评论的新增/修改入口点(端点、导出函数、处理器、消费者)。对于每一项,询问:“是否有测试在正确级别覆盖了正常路径和至少一个错误场景?” 只有在能够说明覆盖已存在或不适用时才可跳过。
评论格式:
[🚨/⚠️/💡] — [Short title]
[The coverage gap or test anti-pattern]
**Recommendation:** [Test to add, at which level, following project patterns]
子 Agent 4:架构与惯例 — ``
阶段 0 — 加载项目自身的约定来源
加载配置文件中列出的所有架构/约定文档和项目本地架构技能(CONVENTIONS + REVIEW_SKILLS),并阅读至文件末尾——不要跳过任何内容,也不要用技术栈知识替代项目文档中的规则。如果配置文件中没有列出任何内容,则执行最低限度的通用检查(遵守模块边界、不违反分层、不进行循环/跨边界导入,命名与相邻代码保持一致),并在每条评论中说明未找到项目约定文档。
阶段 1 — 提取规则矩阵(不要硬编码)
阅读每份已加载的文档,并提取其中明确写出的所有规则——检查清单项(□/- [ ])、✅ do/❌ don't 条目、“必须”/“绝不”陈述、结构约束——整理成一个编号列表。编号从 1 开始,依次递增。不得添加文档未说明的内容;不得遗漏找到的任何内容。此编号列表根据项目自身的文档生成,是评估矩阵。
阶段 2 — 按文件逐一评估矩阵
对于每个已更改的文件,按规则判定 PASS / VIOLATION / N/A。只有当某条规则在结构上不适用于该文件类型时,才可标记为 N/A。对于每项 VIOLATION,在对应的 + 行上添加行内评论,并注明规则编号及其来源文档。
**第二轮(必须执行):**完成矩阵评估后,重新阅读完整差异。列出每个尚未评估的文件,并再次对其运行矩阵。只有说明哪些规则为 N/A 及原因后,才能跳过文件。
评论格式:
[🚨/⚠️/💡] — [Short title]
Rule: [number + source doc, e.g. "Rule 8 — CONTRIBUTING.md Module Boundaries"]
[What in the diff violates it — quote the offending line]
**Recommendation:** [Exact fix; code snippet if < 6 lines]
子 Agent 5:回归与幻觉检测 — ``
检查差异中是否包含与 PR 声明目的无关的更改,或带有机器生成痕迹的更改:删除与更改无关的代码(🚨)、导入/引用仓库中不存在的符号(🚨)、调用时签名或参数数量错误(🚨)、在生产路径中留下 TODO/FIXME/存根、用类型断言或强制转换掩盖实际类型错误、重复实现代码库已有的逻辑、削弱错误处理或验证、静默吞掉错误、削弱或删除测试断言,以及永远不会执行的死代码。
**第二轮(必须执行):**重新阅读完整差异。列出每个未发表评论的文件,并询问:“此处是否存在无关删除、虚假引用、重复逻辑或被削弱的断言?”只有能够说明为何这些问题都不适用时,才能跳过。
评论格式:
[🚨/⚠️/💡] — [Short title]
Type: [unrelated-deletion | phantom-reference | wrong-signature | duplicate | weakened-check | dead-code]
[Specific description with quoted evidence from the diff]
**Recommendation:** [Exact fix]
子 Agent 6:性能 — ``
如果配置文件列出了数据访问或性能约定文档,则加载这些文档作为项目预期模式的参考。只指出在差异中明确可见的问题——不要推测。检查:循环中执行查询/查找(N+1)、没有分页或限制的无界获取、延迟加载的关联关系导致逐行 I/O、可并发执行的独立操作却使用顺序 await/阻塞调用、在循环中重复计算不变的值,以及本应共用一个事务/批次的多次写入。
**第二轮(必须执行):**重新阅读完整差异。列出每个未发表评论的函数、查询和循环,并询问:“此处是否存在明确可见的性能问题?”只有能够说明为何这些问题都不适用时,才能跳过。
评论格式:
⚡ Performance — [Short title]
[Description with estimated impact, e.g. "O(N) queries per request"]
**Recommendation:** [Fix with short code sketch if < 6 lines]
第 3 步:汇总
全部 6 个子 Agent 完成后,再启动一个 Task 子 Agent 进行汇总:
gh api repos/{REPO}/pulls/{PR}/comments— 获取所有行内评论。- 保留正文以 `` summary: 开头的评论。
gh api repos/{REPO}/pulls/{PR}/reviews。Requirements 子 Agent 通过gh pr review --comment发布该评论,因此它属于 review 正文——不是行内/pulls/{PR}/comments条目(第 3.1 步),也不是/issues/{PR}/comments条目。保留正文包含该标记的 review。 - 按严重程度对发现项分组:🔒 安全 → 🚨 严重 → ⚡ 性能 → ⚠️ 警告 → 💡 建议。
- 对相同
{path, line}(±3 行)的发现项去重;在条目中注明每个提供该发现项的子 Agent。 - 收集每个子 Agent 的一条正面亮点。
- **差距检测:**运行
gh pr diff {PR} --name-only,获取完整的变更文件列表。将其与所有收到行内评论的路径交叉比对。在### 🔍 Files With No Inline Comments下列出任何没有行内评论的变更逻辑文件。仅省略配置文件/锁定文件(*.json、*.yaml、*.lock)和不含逻辑的纯类型/声明文件。 - 将汇总写入临时文件,并发布:
gh pr review {PR} --comment --body-file summary.md。
汇总格式:
## 📋 PR Review Summary
| | |
|---|---|
| **Subagents** | 6 (Security · Requirements & DoD · Test Coverage · Architecture · Regression · Performance) |
| **Detected runner** | {TEST command, from the map — or "none found"} |
| **Requirements source** | {tracker / spec path / none} |
| **Project refs loaded** | {convention docs + project-local skills used, from the profile} |
| **Findings** | {N} across {M} files |
---
### 🔒 Security ({N})
- [`path/file:L42`] Finding title
### 🚨 Critical ({N})
### ⚡ Performance ({N})
### ⚠️ Warnings ({N})
### 💡 Suggestions ({N})
---
### 🔍 Files With No Inline Comments
- `path/to/file` — no findings from any subagent (verify manually or re-run a targeted review)
_(Omit this section if every logic file received at least one comment.)_
---
### ✅ Highlights
- [One positive highlight per subagent]
---
> See inline comments for details and recommendations.
如果所有子 Agent 都没有发现问题:发布 ✅ No issues found across all review dimensions.,并仍然包含元数据表。
示例
**A — Requirements 根据仓库现状进行判断。**在分支为 feat/PLAT-482-trial 的仓库中,Track A 提取 PLAT-482,通过项目配置的 Jira CLI/MCP 获取该问题,并根据差异评估验收标准 → Sources: Jira: PLAT-482。在另一个没有跟踪系统、但 PR 正文链接了 .specs/checkout/spec.md 的仓库中,Track B 会读取该规范并评估其中的需求 ID。在第三个仓库中,两者都没有,但 PR 引用了 docs/adr/0007-rate-limits.md,Track B 会将 ADR 的 Decision/Consequences 视为判断标准。第四个仓库中这些内容都不存在 → 发布跳过提示并停止。同一个子 Agent,四种结果——完全由项目配置决定。
**B — Architecture 提取自己的矩阵。**仓库 X 在 CONTRIBUTING.md 中记录了约定;Phase 1 将其中“必须/绝不”条目转化为规则 1–12,并据此评估差异。仓库 Y 则包含项目本地的 .cursor/skills/modular-architecture/SKILL.md;子 Agent 会加载该文件,并将其中的检查清单提取为评估矩阵。仓库 Z 完全没有约定文档 → 子 Agent 会说明这一点,并仅执行最基本的通用边界检查。绝不会硬编码任何技术栈规则。
C — 使用 -F 与 -f 发布内容的修正:正确做法与错误做法。
# ✅ posts the file's contents (uppercase -F expands @)
gh api repos/acme/app/pulls/12/comments \
-F [email protected] -f commit_id={SHA} -f path=src/x -F line=88 -f side=RIGHT
# ❌ posts the literal string "@body.md" (lowercase -f does NOT expand @)
gh api repos/acme/app/pulls/12/comments -f [email protected] -f path=src/x ...
对于 PR 级别的汇总,始终使用 gh pr review 12 --comment --body-file summary.md——绝不要将多行内容内联到 --body 中。