dsngeu/code-review-agents
GitHub: dsngeu/code-review-agents
基于 Claude 的 GitHub 集中式代码审查平台,提供安全漏洞扫描、代码质量审查和分支对比分析三个可复用的自动化 Agent。
Stars: 0 | Forks: 0
# code-review-agents
适用于 GitHub 的集中式、可复用的**代码审查平台**。只需在此处**编写一次**审查逻辑;其他所有代码库只需添加微小的调用方工作流,即可自动获取该逻辑。只需修复或改进一次共享引擎,所有代码库都能同步更新。三个 Agent 共享同一个引擎,它们**仅提供建议**(绝不阻止合并)、**失败放行**,并且支持**多语言**(检测每个文件的语言并应用正确的检查)。
## 三个 Agent
| Agent | 触发器 | 审查内容 | 输出 | 默认 model | 开关 |
|-------|---------|---------|--------|---------------|--------|
| **1 · Security** | 自动,每个 PR | 仅安全漏洞 | 内联评论 + 摘要评论 + Check Run | Sonnet | 始终开启 |
| **2 · Branch review** | 手动(Actions 标签页) | 分支相对于 base 的更改 — 质量 **+** 安全 | 运行页面上的 Job Summary | Sonnet | 无(手动) |
| **3 · PR review** | 自动,每个 PR | 常规质量(bug、性能、设计)— **无安全检查** | 单条摘要评论 + Check Run | Sonnet | 代码库变量 `ENABLE_PR_REVIEW` |
这三个 Agent 都会在发现 HIGH/CRITICAL 级别的问题时 @-mention PR 作者及您的审查者列表,并且**每个 Agent 的模型均可配置**(`model` 工作流输入,默认为 `claude-sonnet-4-6`)。
## 工作原理
```
┌─────────────────────────────────────────────┐
│ code-review-agents (this repo) — the brain │
│ agents/_core/ shared engine │
│ agents/security/ Agent 1 (security) │
│ agents/review/ Agents 2 & 3 (quality) │
│ .github/workflows/ 3 reusable workflows │
└─────────────────────────────────────────────┘
▲ callers invoke the reusable workflows
┌──────────┴──────────┬─────────────┐
┌────────┐ ┌────────┐ ┌────────┐
│ repo 1 │ │ repo 2 │ │ repo N │ ← each adds small caller workflows
└────────┘ └────────┘ └────────┘
```
目标代码库的调用方工作流会调用此处的可复用工作流,该工作流会在 GitHub 托管的 runner 上运行匹配的 Agent。每个 Agent 都是共享 `runReview()` 引擎的一个轻量级入口,该引擎会:
- 获取 PR diff(或用于分支审查的 `compare/base...head`)以及已更改文件的完整内容
- **跳过任何技术栈的依赖/构建产物**(node_modules、Pods、Gradle、DerivedData、target/、.venv、lockfiles、binaries 等)
- 对文件进行风险分级并应用 `MAX_FILES` 预算(会披露被跳过的部分)
- 引入未更改的导入文件以提供数据流上下文
- 在文件边界处对大型 diff 进行分块,并**并行**审查各分块
- 通过 Claude tool-use 返回**结构化的审查结果**(无需脆弱的 JSON 解析)
- 运行**对抗性验证过程**以剔除误报
- 通过 Agent 的渠道(内联 / 摘要评论 / Job Summary / Check Run)进行输出,具备**幂等性**(首先删除其之前的评论)
**失败放行:** 任何错误 → 发出一条错误评论 / Job-Summary 备注 + @-mention,Check Run 状态为 `neutral`,绝不阻止 PR。
## 仓库布局
```
agents/_core/ config.js · github.js · payload.js · claude.js · review.js (shared engine)
agents/security/ index.js (Agent 1) · prompt.js (security lens)
agents/review/ prompt.js (general lens) · pr.js (Agent 3) · branch.js (Agent 2)
.github/workflows/ security-review.yml · pr-review.yml · branch-review.yml (reusable)
caller-workflow-template/ pr-security.yml · pr-review.yml · branch-review.yml (copy into target repos)
package.json Dependencies (@anthropic-ai/sdk)
```
## 设置 — 将 Agent 添加到您的仓库
您只需执行**一次**此操作:在您的账户下 fork(或复制)此仓库,然后在每个需要审查的仓库中存储**两个密钥**,并为每个 Agent 添加一个**调用方工作流文件**。下面是完整的操作步骤。
### 第 1 步 — 生成两个密钥
**密钥 1:Anthropic API key**(允许 Agent 调用 Claude)
1. 前往 **https://console.anthropic.com**
2. **Settings → API Keys → Create Key**,将其命名为例如 `code-review`
3. 复制其值 — 它以 `sk-ant-...` 开头(仅显示一次)
4. 确保您的账户已启用账单/积分功能,否则调用将失败
**密钥 2:GitHub Personal Access Token**(允许 Agent 检出 Agent 代码)
1. 前往 **https://github.com/settings/tokens** → **Tokens (classic)**
2. **Generate new token → Generate new token (classic)**
3. 将其命名为 `code-review`,并选择一个过期时间
4. 勾选唯一的顶级 **`repo`** 权限范围(无需其他权限)
5. **Generate token** 并复制它 — 以 `ghp_...` 开头(仅显示一次)
### 第 2 步 — 在每个目标仓库中保存密钥
GitHub 会按仓库存储这些信息。在**每个您希望被审查的仓库**中,前往:
**Repo → Settings → Secrets and variables → Actions → _Secrets_ 标签页 → New repository secret**
添加这两个密钥(名称必须**完全一致**):
| 名称 | 值 | 标签页 |
|------|-------|-----|
| `ANTHROPIC_API_KEY` | 您的 `sk-ant-...` 密钥 | **Secrets** |
| `GH_PAT` | 您的 `ghp_...` token | **Secrets** |
### 第 3 步 — 添加调用方工作流文件
在目标代码库中,于 **`.github/workflows/`** 下创建以下文件 — 每个 Agent 对应一个。您可以任意挑选组合。
**Agent 1 — Security** → `.github/workflows/pr-security.yml`
```
name: Security Review
on:
pull_request:
types: [opened, synchronize, reopened]
permissions:
contents: read
checks: write
pull-requests: write
jobs:
security:
uses: dsngeu/code-review-agents/.github/workflows/security-review.yml@main
with:
repo: ${{ github.repository }}
pr_number: ${{ github.event.pull_request.number }}
head_sha: ${{ github.event.pull_request.head.sha }}
pr_author: ${{ github.event.pull_request.user.login }}
# model: 'claude-sonnet-4-6' # optional per-repo override
secrets: inherit
```
**Agent 3 — PR quality review** → `.github/workflows/pr-review.yml`
```
name: Code Review
on:
pull_request:
types: [opened, synchronize, reopened]
permissions:
contents: read
checks: write
pull-requests: write
jobs:
code-review:
if: ${{ vars.ENABLE_PR_REVIEW == 'true' }} # toggle (see Step 4)
uses: dsngeu/code-review-agents/.github/workflows/pr-review.yml@main
with:
repo: ${{ github.repository }}
pr_number: ${{ github.event.pull_request.number }}
head_sha: ${{ github.event.pull_request.head.sha }}
pr_author: ${{ github.event.pull_request.user.login }}
secrets: inherit
```
**Agent 2 — Manual branch review** → `.github/workflows/branch-review.yml`
```
name: Branch Review
on:
workflow_dispatch:
inputs:
model:
description: 'Claude model id'
required: false
default: 'claude-sonnet-4-6'
permissions:
contents: read
jobs:
branch-review:
uses: dsngeu/code-review-agents/.github/workflows/branch-review.yml@main
with:
repo: ${{ github.repository }}
ref: ${{ github.ref_name }} # the branch you pick in "Use workflow from"
base: '' # diff against the default branch
model: ${{ inputs.model }}
secrets: inherit
```
### 第 4 步 — 开启 Agent 3(仅在您添加了它的情况下)
Agent 3 **默认关闭**,因此它绝不会在代码库中造成意外惊吓。通过代码库**变量**来启用它:
**Repo → Settings → Secrets and variables → Actions → _Variables_ 标签页 → New repository variable**
- 名称:`ENABLE_PR_REVIEW`
- 值:`true`
将其设置为任何其他值(或删除它)即可关闭 Agent 3 — 无需更改文件。(Agent 1 和 2 不使用此功能。)
### 第 5 步 — 如果运行无法启动(`startup_failure`)
GitHub 可能会默认将 runner token 设置为只读。如果您看到 `startup_failure`,请为 token 授予一次写入权限:
**Repo → Settings → Actions → General → Workflow permissions → "Read and write permissions" → Save**
(或者执行 `gh api --method PUT repos///actions/permissions/workflow -f default_workflow_permissions=write`。)
### 快速参考
| 如果您想… | 位置 |
|----------|-------|
| 添加密钥 | Repo → Settings → Secrets and variables → Actions → **Secrets** |
| 启用 Agent 3 | Repo → Settings → Secrets and variables → Actions → **Variables** → `ENABLE_PR_REVIEW=true` |
| 更改 Agent 的模型 | 该调用方文件中 `with:` 下的 `model:` |
| 运行 Agent 2 | Repo → **Actions** 标签页 → Branch Review → Run workflow → 选择分支 |
## 测试它
1. 在目标代码库中,创建一个分支并添加一个包含故意留下的漏洞的文件,例如:
// test-vulnerabilities.js
function getUser(userId) {
db.query(`SELECT * FROM users WHERE id = ${userId}`); // SQL injection
}
const API_KEY = 'sk-prod-abc123def456'; // hardcoded secret
function runCmd(input) {
require('child_process').execSync(`ls ${input}`); // command injection
}
2. 从该分支向 `main` 发起一个 PR。
3. 检查该 PR — 您应该会看到:
- 一个 **Security Review** Check Run(中性)
- 针对漏洞代码行的**内联评论**
- 一条带有问题汇总表的**摘要评论**
- PR 作者 + 配置的审查者被 @-mention(因为发现了 HIGH/CRITICAL 级别的问题)→ 电子邮件通知
**错误路径测试:** 暂时将 `ANTHROPIC_API_KEY` 设置为无效值,发起一个 PR,并确认 Agent 会发布一条错误评论 + @-mention,且 Check Run 状态为 `neutral`(PR 仍然可以合并)。
## 配置
### 环境变量(按目标代码库调整,无需更改代码)
如果需要覆盖默认值,请将这些设置为代码库/组织变量,或在调用方工作流的 `env:` 中进行设置:
| 控制项 | 位置 | 默认值 | 含义 |
|------|-------|---------|---------|
| `model` | 调用方 `with:` 输入 | 按每个 Agent 设定 | Claude 模型 ID。所有 Agent 默认为 `claude-sonnet-4-6`。 |
| `ENABLE_PR_REVIEW` | 代码库**变量** | 未设置 | 设置为 `true` 以在代码库中启用 Agent 3(自动 PR 审查)。 |
| `notify_users` | 调用方 `with:` 输入 | — | 额外以逗号分隔的审查者,用于 @-mention(在 PR 作者之外额外添加)。 |
| `MAX_FILES` | env | `80` | 深入分析的最大已更改文件数;其余文件将被剔除风险评级并披露为已跳过。 |
| `CHUNK_CONCURRENCY` | env | `4` | 并行发送给 Claude 的分块数量。 |
| `INLINE_MIN_SEVERITY` | env | `LOW` | 发布**内联**评论所需的最低严重性级别(所有问题仍会出现在摘要中)。 |
| `VERIFY` | env | `true` | 用于剔除误报的对抗性验证过程。`false` = 更快/更便宜/更多噪音。 |
### 代码常量 (`agents/_core/config.js`)
| 常量 | 默认值 | 含义 |
|----------|---------|---------|
| `DEFAULT_MODEL` | `claude-sonnet-4-6` | 未提供 `model` 输入时的全局模型回退项 |
| `MAX_TOKENS` | `16000` | 每次 Claude 调用的最大输出 token 数 |
| `CLAUDE_MAX_RETRIES` | `5` | 针对临时 API 错误 (429/5xx) 的重试次数 |
| `CHUNK_SIZE_CHARS` | `600_000` | 进行分块前的字符阈值(约 150k token) |
| `ALWAYS_NOTIFY` | `['dsngeu']` | 硬编码的审查者回退项(在 `notify_users` 为空时使用) |
| `MAX_INLINE_COMMENTS` | `50` | 每次审查的内联评论上限 |
| `MAX_CONTEXT_FILES` | `20` | 为提供数据流上下文而引入的未更改的导入文件 |
| `SKIP_PATTERNS` | deps/build/binaries(所有技术栈) | 排除在审查之外的文件 |
安全审查标准位于 `agents/security/prompt.js`;常规审查标准位于 `agents/review/prompt.js`。
### 它如何处理棘手情况
- **大型 PR:** 对文件进行风险评级(安全关键字 + 代码本质优先于原始大小);审查前 `MAX_FILES` 个文件,其余文件在摘要中披露 — 绝不悄无声息地丢弃。
- **可靠的审查结果:** Claude 返回结构化的工具输出(无需 JSON 解析);内联评论行会根据 diff 进行验证,并带有针对每条评论的回退机制,因此一行错误的代码不会导致整个审查失效。
- **更少的误报:** 验证过程会在发布前驳斥薄弱的审查结果。
- **幂等重跑:** 每次推送都会在发布新评论之前删除 Agent 之前的评论(带有隐藏标记) — 不会产生重复的垃圾信息。
## 设计保证
- **只读 + 评论** — Agent 只能读取代码并发布/更新 PR 评论。它们**无法修改或删除代码、分支、PR 或评论。** 通过两种方式强制执行此操作:工作流 token 为 `contents: read`(无 push/edit/delete 权限),并且代码硬阻断了除 GET/POST/PATCH 之外的所有 HTTP 方法(DELETE/PUT 会抛出异常)。重跑会原地更新现有评论 — 绝不删除。
- **无服务器** — 按需在 GitHub Actions 上运行。
- **单一事实来源** — 在此修复共享引擎,每个代码库都会即时更新。
- **按 Agent 设置模型** — 每个 Agent 的模型均通过 `model` 输入进行设置(参见配置);更改其中一个不会影响其他 Agent。
- **仅提供建议** — 绝不阻止合并。
- **失败放行** — Agent 错误绝不会阻止 PR。
## 路线图
- GitHub App 身份验证(适用于客户账户,取代个人 PAT)
- 可选的合并阻断模式
- 基于共享引擎提供额外的审查视角(如无障碍访问、测试质量)
标签:AI辅助, GitHub Actions, MITM代理, SOC Prime, 代码审查, 开发工具, 网络调试, 自动化, 自动笔记, 自定义脚本, 错误基检测, 静态代码分析