内容
# 盖威
[](https://github.com/gavelcode/gavel/actions/workflows/ci.yml)
[](https://codecov.io/gh/gavelcode/gavel)
[](LICENSE)

**Bazel 构建你的多模块仓库。盖威来评判。代码库中的秩序!**
Bazel 多模块仓库的质量门户 - 构建图原生,本地,代理就绪。
你的多模块仓库构建通过了。这并不意味着它是无辜的。盖威作为 Bazel 方面收集证据,根据你在 `gavel.yaml` 中设定的规则对每个变更进行审查,并给出判决:你刚刚引入的回归受到指控,而十年的现有债务不被审判。一个判决,同时提交给你的 CI,你的终端和你的编码代理。
```bash
gavel init # 打开案件
gavel judge # 审理案件
```

---
## 安装
```sh
# Homebrew — macOS & Linux
brew install gavelcode/tap/gavel
# 或者使用安装脚本 - Linux, CI, Docker
curl -fsSL https://raw.githubusercontent.com/gavelcode/gavel/main/install.sh | sh
```
每个平台的预编译二进制文件都在 [发布页面](https://github.com/gavelcode/gavel/releases) 上。盖威需要 Bazel **8.0+** (bzlmod)工作区;使用 `gavel --version` 验证。
<details>
<summary>从源代码构建</summary>
```sh
bazel build //apps/cli/cmd/gavel
# 二进制文件位于 bazel-bin/apps/cli/cmd/gavel/gavel_/gavel
```
</details>
## 工作原理
* 每个变更都有机会发言。*
### 1. 证据来自构建图
分析器 - golangci-lint,PMD,CPD,SpotBugs,Error Prone,Ruff,Bandit,ESLint,Clippy - 作为 Bazel 方面运行。它们看到确切的源代码树,依赖关系图和 Bazel 已经解析的工具链;无需单独的扫描器,也无需第二个配置文件。SonarQube 重新扫描整个世界;盖威只查看构建图所说的已更改的目标(`--affected`),因此在多模块仓库增长时,运行速度仍然很快。每个工具,每种语言,都标准化为一种格式:**SARIF**。
### 2. 你只会因变更而受到审判
`gavel.yaml` **是** 质量门户 - 代码,经过审查和版本控制,与仓库一起,不需要点击到 Web UI。它只评估你刚刚添加的内容与已提交的基准线之间的差异:新的发现,覆盖率回归,新的架构违规。采用盖威十年后,它会阻止今天的差异,而不是阻止积压的债务。
```yaml
projects:
- name: payments
pattern: "//payments/..."
tooling:
go: [golangci-lint, archtest]
quality_gate:
findings: { max_error: 0 }
coverage: { min: 80 }
architecture_violations: { max: 0 }
```
每次运行都会保存一个指纹快照;下一次运行会显示增量 - 新的,固定的,存在的 - 以及覆盖率趋势。不需要服务器。
```
payments/api/handler.go:42 error null check missing golangci-lint:nilerr NEW
⚖ 判决:FAIL — code_quality
1 new · 8 fixed · 31 existing coverage 73.5% (↑5.0%) architecture PASS
```
### 3. 编码代理可以请求的判决
编码代理编写代码时看不到后果 - lint 回归,覆盖率下降,层级违规在 CI 中三个提交后生效。`gavel mcp` 启动一个 [Model Context Protocol](https://modelcontextprotocol.io) 服务器,暴露 `judge`、`lint_file`、`findings`、`coverage` 和 `arch` 作为工具。指向 Claude Code、Cursor 或 Zed,它会在编写代码时检查自己的工作与相同的 Bazel 感知门户 **一致** - 一个质量良知,在内联。
对于编辑器和仪表板,`gavel watch` 在每次保存时重新分析并发出 JSONL 事件流。两者都完全本地运行 - 无需服务器,无需网络。
## 盖威 vs SonarQube:案件
| | SonarQube | 盖威 |
|---|---|---|
| 构建图意识 | 无 | Bazel 方面了解目标依赖关系 |
| 多模块仓库模型 | 一个项目,或每个项目一个分支 | 分层:每个包,每个项目,整个仓库 |
| 分析范围 | 完整扫描或文件差异 | Bazel 感知:更改文件 + 受影响的目标 |
| 本地工作流 | 服务器往返 | 完全本地,零网络 |
| 编码代理/编辑器循环 | — | MCP 服务器 + `watch` 事件流 |
| 质量门户 | Web UI 配置 | 代码(`gavel.yaml`),与仓库版本控制 |
| 进度跟踪 | 服务器支持 | 本地指纹快照,无基础设施 |
| 占用 | Java 服务器 + 数据库 + 扫描器 | 一个静态 Go 二进制文件,在 Bazel 内运行 |
SonarQube 是一个成熟的平台,拥有十五年的规则积累,盖威并不是要取代它。盖威回答了 SonarQube 在结构上无法回答的问题:* 我的 Bazel 多模块仓库中哪些包是健康的,这个变更是否使其中一个包变差* - 其中构建图是分析单位,内部循环是质量实际赢得的地方。
> **已经运行 [aspect's rules_lint](https://github.com/aspect-build/rules_lint)?**
> 保留它。盖威读取它在 `bazel-bin/` 中生成的 SARIF(`gavel judge --findings-source=rules_lint`)并将这些报告转化为门户 - 基线增量,覆盖率,架构,判决 - 规则_lint 有意为你留下的层。
## 状态
> **Alpha - v0.1.0.** 正在积极开发中;API 和配置格式可能会发生变化。盖威在其每次提交时都会对其自己的仓库进行门控 - 它是自己的第一个用户。
当前功能:
- `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` - 模型上下文协议服务器,用于编辑器/代理集成
- `gavel validate` - 检查 Bazel 集成健康状况
- 基线模式(默认):基于指纹的新/固定/现有分类,提交到 git 以供团队使用
- 分析器:golangci-lint,PMD,CPD,SpotBugs,Error Prone,Ruff,Bandit,ESLint,Clippy
- 服务器(可选):Web 仪表板,集中式历史记录,团队基线,API 令牌身份验证
## 文档
- [快速入门](docs/quickstart.md) - 从零到五分钟的第一个判决
- [配置](docs/configuration.md) - `gavel.yaml` 和 `architecture.yml`,逐字段解释
- [基线和增量](docs/baseline.md) - 新/固定/现有如何确定
- [服务器部署](docs/deployment.md) - 运行 `gavel-server`
- [完整文档索引](docs/index.md)
## 贡献
问题和拉取请求欢迎 - 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 和我们的 [行为准则](CODE_OF_CONDUCT.md)。安全报告通过 [SECURITY.md](SECURITY.md) 进行。
## 许可证
[Apache License 2.0](LICENSE)