tumf/review-gauntlet
GitHub: tumf/review-gauntlet
一个计划优先的 AI 代码审查覆盖率门禁工具,通过构建文件×规则审查矩阵来编排审查器、追踪覆盖率并保留审查证据,确保代码在被最终确认前完成所需的审查义务。
Stars: 2 | Forks: 0
# Review Gauntlet
基于计划优先的 AI 代码审查,具备文件 × 规则的覆盖率。
Review Gauntlet 是一个基于计划优先的覆盖率关卡,用于 AI 代码审查。在运行
审查器之前,它会构建一个文件 × 规则的审查矩阵。每个单元格代表一个
具体的审查义务:必须根据此规则检查此文件。然后,Review Gauntlet 会针对这些单元格运行 AI 审查器、静态分析器或自定义 adapter,记录证据和发现,并且只有在所需的
覆盖率完成后才进行最终确认。
审查器负责发现问题。而 Review Gauntlet 负责证明哪些文件是根据哪些规则进行检查的。
## 快速开始
审查仓库的最快方式:
Review Gauntlet 不是一个独立的审查器。在开始之前,请安装并
认证一个外部审查代理 CLI(例如 opencode),为该代理安装匹配的
Review Gauntlet 技能或 prompt 指南,并创建一个 adapter
配置,以告诉 Review Gauntlet 如何调用它。
```
# 1. 安装 CLI(如已安装请跳过)
uv tool install review-gauntlet
# 2. 单独安装/配置外部 review agent,然后创建一个 adapter config
uvx review-gauntlet config init --preset opencode
# 3. 为当前 repository 启动 review session
review-gauntlet init
# 4. 让 Review Gauntlet 驱动已配置的 agent 直到 session 完成
review-gauntlet run
# 5. 如有需要,检查最终的 checkpoint 和 findings
review-gauntlet status
review-gauntlet findings
```
`run` 会反复向 Review Gauntlet 请求下一个准备就绪的任务,使用该
prompt 调用配置好的外部代理,并在活动会话完成确认后停止。
`review` 对于底层或自定义工作流,每次仍然只推进一个审查批次。`verify-fixes` 会重新检查标记为 `fixed_pending_verification` 的发现,
并将它们移动到 `fixed_verified` 或 `reopened`。只有在所需的
覆盖率完成、活动发现已关闭、并且 `status` 报告
`can_finalize: true` 之后,`finalize` 才会成功。
## 这与 AI 审查工具有何不同?
AI 审查工具通常根据 diff 生成评论。而 Review Gauntlet 起步得更早:
它会创建一个审查计划。它将文件与审查规则交叉以构建
覆盖率矩阵,然后针对所需的单元格运行审查器,
并为每个完成的审查义务记录证据。
| 工具类型 | 主要工作 |
|---|---|
| Codex Review / Open Code Review / opencode | 生成审查评论 |
| 静态分析器 | 检测已知的规则违规 |
| Review Gauntlet | 计划审查,构建文件 × 规则矩阵,跟踪覆盖率,保留证据,并把控最终确认关卡 |
Review Gauntlet 旨在与审查器协同工作,而不是与它们竞争。
## 工作原理
Review Gauntlet 使代码审查变得计划优先且可审计。
1. 定义审查范围
- 文件、目录、diff、commit 或其他审查目标
2. 定义审查规则
- 安全性、正确性、可维护性、架构、项目特定检查或自定义规则
3. 构建审查矩阵
- 每个文件 × 规则对成为一个审查单元格
4. 运行审查器
- AI 审查器、静态分析器、opencode、Codex 风格的代理或自定义 adapter 检查分配的单元格
5. 跟踪证据和发现
- 记录 prompt、输出、发现、覆盖率状态和未解决的问题
6. 仅在完成后进行最终确认
- Review Gauntlet 仅在所需的覆盖率完成且活动发现已关闭时才进行最终确认
## 在运行审查之前
审查会话不能仅靠 CLI 运行。请先安装所有必需的组件:
1. 安装 `review-gauntlet` CLI
2. 安装并配置外部审查代理 CLI
3. 为该代理安装匹配的 Review Gauntlet 技能或 prompt 指南
4. 添加一个可被发现的 adapter 配置,例如 `review-gauntlet.jsonc`
### 安装 CLI
```
uv tool install review-gauntlet
```
### 安装技能
安装 Review Gauntlet 代理技能:
```
npx skills add tumf/review-gauntlet
```
### 创建 adapter 配置
Review Gauntlet 会自动从
`.review-gauntlet/config.jsonc`、`review-gauntlet.jsonc` 或 XDG 用户配置
目录中发现配置。已安装的包中内置了启动预设,因此首次使用的用户
无需任何额外设置即可创建配置。
创建项目配置:
```
review-gauntlet config init --preset opencode
```
或者创建一个全局默认配置:
```
review-gauntlet config init --global --preset opencode
```
检查可用的预设并验证有效的配置:
```
review-gauntlet config preset list
review-gauntlet config preset show opencode
review-gauntlet config validate
review-gauntlet config effective --format json
```
使用 `--force` 覆盖现有的生成配置,使用 `--dry-run` 预览
写入目标和预设内容而不创建文件,使用 `--output ` 写入
到自定义路径。如果你的代理命令或参数不同,请编辑生成的 JSONC,然后
验证 `review-gauntlet review` 是否可以端到端运行。
```
uvx review-gauntlet config init --preset opencode
# (单独安装并认证匹配的外部 review agent)
review-gauntlet init
review-gauntlet run
review-gauntlet status
```
`uvx review-gauntlet config init --preset opencode` 是基于包的启动流程。
对于日常使用,请使用 `uv tool install review-gauntlet` 安装 CLI,以便可以使用相同的
命令作为 `review-gauntlet`。
## 安装
对于日常使用,将 CLI 安装为 `review-gauntlet`:
```
uv tool install review-gauntlet
review-gauntlet --help
```
## 从源码安装
当你想要最新的 GitHub 版本或想要贡献代码时使用此方法:
```
git clone https://github.com/tumf/review-gauntlet.git
cd review-gauntlet
uv sync
make install
review-gauntlet --help
```
`make install` 使用 `uv tool install --reinstall .` 将本地包安装为标准的
`review-gauntlet` 命令。
## 基本用法
首先选择一个明确的审查目标,然后使用 `run` 通过配置的外部代理执行准备就绪的任务,直到会话完成确认:
```
# 审查当前 workspace diff。
review-gauntlet init --worktree
# 或审查 branch/range。
review-gauntlet init --from main --to HEAD
# 或审查完整的 repository。
review-gauntlet init --all
# 推荐:运行就绪任务直到活跃的 session finalize。
review-gauntlet run
# 在调试或审计结果时检查 state 和 findings。
review-gauntlet status
review-gauntlet findings
# 放弃误操作的 init,而不写入 checkpoint。
review-gauntlet cancel
# 可选的隔离工作流:为 session 创建 Git branch 和关联的 worktree。
review-gauntlet init --git-worktree
review-gauntlet run
review-gauntlet finalize --merge
```
`run` 是正常的推进命令。它不会改变 `review` 基于基本规则的行为:
`review` 每次调用只精确推进一个审查批次,而
`run` 通过外部代理协调重复的就绪任务执行。`finalize`
仍然是一个关卡,而不是清理命令:在所需的覆盖率完成
并且活动发现关闭之前,它都会失败。仅使用 `cancel` 放弃意外的 `init`;它会
将会话标记为 `cancelled` 并清除活动会话标记,而不会生成
checkpoint artifacts。
`--worktree` 和 `--git-worktree` 是刻意设计的不同概念。`init
--worktree` 选择当前工作区的 diff 作为审查目标。`init
--git-worktree` 在
`.review-gauntlet/worktrees//` 下创建一个隔离的 Git 链接工作树,并创建一个 `review-gauntlet/` 分支
用于该会话。可以将它们组合为 `init --worktree --git-worktree`,在隔离会话工作的同时
审查工作区的 diff。对于基于 Git-worktree 的会话,
`run` 默认在链接的会话工作树内执行配置的外部代理,因此源码的读取和编辑都发生在会话分支上。Review Gauntlet 的
持久状态,包括运行日志、账本、活动会话标记和 checkpoints,
继续存在于基础仓库的 `.review-gauntlet` 目录下。`finalize
--merge` 写入 checkpoint artifacts,提交会话分支,将其快进合并到记录的基准分支,移除链接的工作树,并删除
会话分支。如果合并成功但清理失败,命令会报告
`cleaned_up: false`,包含清理障碍,并留下 `next_required_action:
cleanup_git_worktree` 以供手动修复。
### 高级 `ready` 用法
`ready` 为 CI 系统、自定义编排器、外部
集成和调试打印下一个审查 prompt。当你想在 Review Gauntlet 之外拥有编排循环时使用它:
```
review-gauntlet ready | opencode run
```
自定义编排器可以重复调用 `ready`,但这不再推荐作为日常的
工作流;对于正常的会话推进,首选 `review-gauntlet run`。
## Shell 补全
已安装的 `review-gauntlet` 命令可以为常见的
交互式 shell 生成补全脚本。为当前会话执行该脚本,或者将其写入 shell 启动文件加载的
位置。
Bash:
```
source <(review-gauntlet completion bash)
```
Zsh:
```
review-gauntlet completion zsh > "${fpath[1]}/_review-gauntlet"
autoload -Uz compinit && compinit
```
Fish:
```
review-gauntlet completion fish > ~/.config/fish/completions/review-gauntlet.fish
```
## 命令
目标选择在 `init` 时发生;`review` 仅推进一次活动会话。
普通的 `init` 现在在存在完整可用 checkpoint 时使用 `.review-gauntlet/checkpoints/latest/status.json`,
从其 `review_base_commit` 审查到 `HEAD`。如果不存在 checkpoint,普通的 `init` 会审查所有符合条件的文件。需要先前工作区 diff 默认行为的脚本必须显式传递 `--worktree`。
兼容 OCR 的目标映射为:
```
# 默认审查:最新 finalized 的 checkpoint -> HEAD,或首次审查的所有文件。
review-gauntlet init
# OCR workspace diff 审查:staged、unstaged 和 untracked 的 non-ignored 文件。
review-gauntlet init --worktree
# OCR branch/range 审查:两个 refs 之间发生变化的文件。
review-gauntlet init --from main --to HEAD
# OCR single-commit 审查:由一个 commit 改变的文件。
review-gauntlet init --commit
# review-gauntlet-only 全 repository 审查:每个符合条件的 inventory 文件。
review-gauntlet init --all
# 推荐:使用配置好的 external agent 编排就绪任务。
review-gauntlet run
# 针对底层/自定义工作流执行确切的单一 review step。
review-gauntlet review
# 在此次运行中选择最多 20 个 cells,并同时执行最多 4 次 adapter 调用。
review-gauntlet review --budget 20 --concurrency 4
```
在运行或审查步骤之后,检查会话状态和发现,可选地记录人类的
发现决定,并且只有在覆盖率和发现都关闭后才进行最终确认:
```
review-gauntlet status
review-gauntlet findings
review-gauntlet mark fixed --reason "fixed in follow-up"
review-gauntlet verify-fixes
review-gauntlet finalize
# Finalize 以原子操作写入 Git 可审查的 JSON/Markdown snapshots。
git add .review-gauntlet/checkpoints/latest
# 如果 init 错误地指向了目标,请取消而不是 finalize。
review-gauntlet cancel
```
`cancel` 是放弃由于错误初始化的活动会话的受支持方式。它在账本中记录 `sessions.state = 'cancelled'`,并移除
`.review-gauntlet/active-session.json`,因此在新的 `init` 之前,后续的 `status`、`review` 和 `ready`
命令表现为无活动会话。与 `finalize` 不同,它不会写入 checkpoints 或声称审查已完成。
`status` 将 `coverage` 报告为按状态划分的审查单元格计数:
| 覆盖率状态 | 含义 |
|---|---|
| `pending` | 文件 × 规则单元格仍需审查。 |
| `reviewed` | 该单元格已根据当前文件摘要进行了审查。 |
| `stale` | 文件在审查后发生了更改,因此该单元格必须重新审查。 |
| `superseded` | 旧的持久化单元格不再是当前目标计划的一部分。 |
`findings` 默认报告开放的发现;传递 `--all` 以包含终止的
发现。每个发现行包括:
| 字段 | 含义 |
|---|---|
| `finding_id` | 稳定的 Review Gauntlet 发现 ID,例如 `RGF-...`。 |
| `fingerprint` | 从仓库、目标、路径、规则、声明、代码锚点和规则集派生的去重键。 |
| `state` | 发现的生命周期状态。开放状态为 `untriaged`、`confirmed`、`fixed_pending_verification` 和 `reopened`;终止状态为 `fixed_verified`、`false_positive`、`waived` 和 `accepted_risk`。 |
| `path` | 最新出现的仓库相对文件路径。 |
| `rule_id` | 产生该发现的审查规则。 |
| `content` | 审查器提供的发现文本。 |
| `metadata` | 人类决策记录的 JSON 元数据,例如所有者或到期时间。 |
| `start_line` / `end_line` | 最新行范围,或者在无精确范围时为 `0`。 |
| `imprecise` | 最新位置是否为近似值。 |
成功的 `finalize` 要求覆盖率和活动发现均已关闭,并且
审查范围的文件与 `HEAD` 匹配;脏的已跟踪、已暂存、未暂存或未跟踪的符合条件的文件将阻止 checkpoint 创建。它会在生成的 checkpoint 目录下(例如 `.review-gauntlet/checkpoints//`)写入
`status.json`、`findings.json`、`events.json` 和 `summary.md`,然后更新
`.review-gauntlet/checkpoints/latest` 作为指向该 checkpoint 的指针,并清除
活动会话,以便下一个命令是 `review-gauntlet init`。这里刻意设计为没有单独的 checkpoint 命令。
`review --concurrency` 默认为 `8`,且必须是正整数。`--budget`
仍然限制为一次审查运行选择的单元格总数;`--concurrency` 仅限制
这些选定的 adapter 调用中有多少同时运行。它不会
自动将并发标志传递给嵌套的外部 adapter
命令。
### 诊断和遗留计划命令
`inventory`、`plan` 和 `report` 命令仍可用于兼容
和检查。使用它们来检查文件发现、审查切片和报告
渲染;它们不是正常的日常审查生命周期。
检查当前仓库清单和分类:
```
review-gauntlet inventory
```
检查带有切片和所需检查的遗留审查计划:
```
review-gauntlet plan
```
渲染遗留的 Markdown 矩阵报告:
```
review-gauntlet report
```
## 默认文件过滤
清单发现保持 Git 行为完整:基于 Git 的仓库仍然使用
`git ls-files --cached --others --exclude-standard` 和现有的有限
子进程超时,因此 `.gitignore` 和其他 exclude-standard 规则在
review-gauntlet 的内置过滤器之前生效。
内置的 artifact 过滤器从完整清单和目标范围的清单中移除生成的或依赖的路径。这包括 Python/编辑器/缓存输出,
例如 `.review-gauntlet/`、`__pycache__/`、`.ruff_cache/`、`build/`、`dist/`、
`wheels/`、`htmlcov/`,以及受 OCR 启发的依赖/构建暂存路径,例如
`vendor/`、`node_modules/`、`target/`、`.happypack/`、`.cachefile/`、`_packages/`、
`rpm/`、`pkgs/` 和 `oh_modules/`。
审查会话在创建单元格和
摘要时应用额外的默认审查路径过滤器。文件可以在一般清单中保持可分类,但 `init` 默认会忽略
`openspec/`、`tests/` 和 `docs/`,以及常见的 OCR 风格的测试或
生成的路径,例如 `__tests`、`*_test.go`、`*Test.java`、`*Test.kt`、
`*.spec.ts`、`*.test.tsx`、`test_*.py`、`*_spec.rb`、`*.spec.ets` 和
`*.test.ets`。审查单元格和目标摘要还忽略常见的 package 清单
和 lock 文件,例如 `uv.lock`、`poetry.lock`、`requirements*.txt`、
`package.json`、`package-lock.json`、`yarn.lock`、`pnpm-lock.yaml`、`Cargo.toml`、
`Cargo.lock`、`go.mod`、`go.sum`、`pom.xml`、`Gemfile.lock`、`composer.lock`、
`Package.resolved`、`pubspec.lock`、`mix.lock`、`vcpkg.json`、`flake.lock`、
`stack.yaml.lock`、`Manifest.toml` 和 `renv.lock`。这些 package 文件并没有
从一般清单中移除,除非有其他 artifact 或 Git 忽略规则排除了
它们。正常的源码文件和与 package 相邻的可执行逻辑文件,例如
`setup.py`、`build.gradle`、`mix.exs` 和 `build.zig` 仍然有资格进行审查
单元格。
`review` 按以下顺序发现配置:显式 `--config`、
`.review-gauntlet/config.jsonc`、`.review-gauntlet/config.json`、
`review-gauntlet.jsonc`、`review-gauntlet.json`、
`$XDG_CONFIG_HOME/review-gauntlet/config.jsonc`,然后是
`$XDG_CONFIG_HOME/review-gauntlet/config.json`。当 `XDG_CONFIG_HOME` 未设置
或为空时,全局回退基准是 `~/.config`,因此 JSONC 回退路径是
`~/.config/review-gauntlet/config.jsonc`。仓库本地配置始终
优先于全局 XDG 配置,并且发现机制只读取现有文件;它
从不创建全局配置目录或文件。命令 adapter 使用 argv
数组,从不使用 shell 字符串;provider 登录、模型选择和密钥保留在
外部 CLI 配置内。
用于 opencode 基于 JSON 文件判定的最小 JSONC 配置:
```
{
"adapter": {
"type": "command",
"command": "opencode",
"args": ["run", "{prompt}"],
"output": {"mode": "file-json", "path": "{output_file}"}
}
}
```
生成的 OCR prompt 作为单个 argv 元素被扩展到 `{prompt}` 中。Prompt
artifacts 仍然作为审计证据被写入,但 prompt-file 传输不是
命令 adapter 契约的一部分。`cwd`、`env` 和 `timeout_seconds` 是
可选的应急手段:省略 `cwd` 时继承调用者的当前工作
目录,省略 `env` 时继承父环境且没有固定的自动
变量,显式 `env` 值会覆盖继承的环境,省略
`timeout_seconds` 时默认为 600 秒。
当配置的代理命令需要应随 Review Gauntlet 配置一起携带的环境变量时,请使用 `adapter.env`,例如模型选择、
feature 标志或特定于 wrapper 的路径:
```
{
"adapter": {
"type": "command",
"command": "opencode",
"args": ["run", "{prompt}"],
"env": {
"OPENCODE_MODEL": "anthropic/claude-sonnet-4",
"REVIEW_GAUNTLET_REPO": "{repo_root}",
"REVIEW_GAUNTLET_STATE": "{state_dir}"
}
}
}
```
环境变量使用与 adapter
参数相同的模板语法进行扩展。它们被添加到父进程
环境之上,因此它们也可以覆盖继承的变量。将 provider 凭据保留在外部 CLI
或密钥管理器中,而不是将它们提交到项目配置中。
判定必须是带有 OCR 风格注释的 JSON:
```
{"comments":[{"path":"src/app.py","content":"Issue","start_line":1,"end_line":1}]}
```
支持的模板变量包括 `{repo_root}`、`{state_dir}`、`{run_id}`、
`{run_dir}`、`{cell_id}`、`{cell_dir}`、`{prompt}`、`{output_file}`、
`{file_path}` 和 `{rule_id}`。
## 开发者工作流
```
uv sync
make check
make format
make lint
make typecheck
make test
make coverage
```
## 设计
Review Gauntlet 将审查视为有状态的覆盖率工作流:
- 从显式目标集初始化会话
- 将符合条件的文件分类为审查切片和覆盖率单元格
- 通过外部命令 adapter 每次只运行一个审查步骤
- 将 prompt、输出、发现和覆盖率状态记录为审计证据
- 仅在所需的覆盖率和活动发现关闭后才进行最终确认
外部审查工具通过命令 adapter 进行集成,而不是通过
硬编码的运行器。该 adapter 接受 argv 数组,将审查 artifacts 扩展为
安全的模板变量,并支持写入 stdout 或文件的 JSON 判定,因此
诸如 opencode、Codex 风格的工具、静态分析器或自定义 wrapper 等 CLI 可以
参与,而无需 review-gauntlet 管理 provider 登录或密钥。
标签:AI编程助手, DevOps工具, LNA, 云安全监控, 代码审查, 工作流编排, 文档结构分析, 自动化审查, 逆向工具, 静态分析