Gavel 是面向 Bazel 单体仓库的代码质量门禁工具,定位为“构建图原生、本地运行、对代理友好”的质量判定层。其核心主张是:仓库构建通过并不代表没有问题,Gavel 负责把变更放在质量规则下审判,并给出一个判定结果,同时交给 CI、终端和编码代理使用。
【用途与定位】 Gavel 针对 Bazel 单体仓库,解决的是 SonarQube 这类平台在结构上难以回答的问题:我的 Bazel 单体仓库中哪些包是健康的,以及这次变更是否让其中某个包变差。它以构建图作为分析单元,把质量把关放在开发内循环中。项目自我定位为 alpha 版本 v0.1.0,处于活跃开发中,API 和配置格式可能变化;Gavel 自身在每个提交上对自己运行门禁。
【主要能力】
- 证据来自构建图:分析器(golangci-lint、PMD、CPD、SpotBugs、Error Prone、Ruff、Bandit、ESLint、Clippy)作为 Bazel aspects 运行,能看到 Bazel 已解析的确切源码树、依赖图和工具链,无需独立扫描器或第二套可能漂移的配置。它只查看图认为发生变更的目标(--affected),因此随着单体仓库增长仍能保持较快运行。所有工具和语言统一归一化为 SARIF 格式。
- 只对变更进行评判:gavel.yaml 即质量门禁,作为代码纳入版本控制,而非在 Web UI 中点击配置。它只把刚新增的内容与已提交的基线比较:新发现问题、覆盖率回退、新架构违规。因此可以在已有十年技术债的仓库上采用 Gavel,它只会因当前 diff 受阻,而不会因历史积压受阻。每次运行保存指纹快照,下一次运行显示增量——新增、已修复、现存——以及覆盖率趋势,无需服务器。
- 编码代理可请求判定:gavel mcp 启动一个 Model Context Protocol 服务器,暴露 judge、lint_file、findings、coverage 和 arch 工具。将 Claude Code、Cursor 或 Zed 指向它,代理在编写时就能对照同一个懂 Bazel 的门禁检查自己的工作。面向编辑器和仪表盘,gavel watch 在每次保存时重新分析并输出 JSONL 事件流。两者都完全本地运行,无服务器、无网络。
【与 SonarQube 的关系】 SonarQube 是成熟平台,有十五年规则积累,Gavel 并不试图取代它。Gavel 回答的是 SonarQube 结构上无法回答的问题。若已在使用 aspect 的 rules_lint,可以保留;Gavel 读取其输出在 bazel-bin/ 中的 SARIF(gavel judge --findings-source=rules_lint),将其转化为门禁——基线增量、覆盖率、架构、判定——即 rules_lint 有意留给你自行处理的层面。
【使用方式】 需要 Bazel 8.0+(bzlmod)工作区,预编译二进制在各平台 releases 页面提供。用 gavel --version 验证。主要命令包括:
- gavel init:生成配置和 Bazel 集成
- gavel judge:分析、评估门禁、展示发现和增量
- gavel judge --project <name>、--quick、--summary、--affected:限定和塑造运行范围
- gavel judge --absolute:评估所有发现(发布门禁、夜间运行)
- gavel judge --json、--output-sarif report.sarif:面向 CI、IDE、GitHub Code Scanning 的结构化输出
- gavel judge --server URL --token TOKEN:共享团队基线,获取并提交
- gavel watch:变更时重新分析,输出 JSONL 事件流
- gavel mcp:面向编辑器/代理集成的 Model Context Protocol 服务器
- gavel validate:检查 Bazel 集成健康状况
【配置与基线】 基线模式为默认模式,基于指纹进行新增/修复/现存分类,并提交到 git 供团队使用。配置文件为 gavel.yaml 和 architecture.yml,文档逐字段说明。可选服务器提供 Web 仪表盘、集中历史、团队基线和 API-token 鉴权。
【适用场景】 适用于使用 Bazel 8.0+(bzlmod)单体仓库、希望在本地和 CI 中按变更增量执行代码质量门禁的团队;适合已使用 rules_lint 并希望补充基线增量、覆盖率、架构和判定层的情况;也适合希望让编码代理在编写时自检质量的场景。
【限制】 当前为 alpha 阶段 v0.1.0,API 与配置格式可能变化。需 Bazel 8.0+ bzlmod 工作区。资料未提供价格、收费模式、具体规则数量等细节,暂未提供。