nimblegate/nimblegate
GitHub: nimblegate/nimblegate
nimblegate 是一款自托管的 Git push 网关,在 AI agent 与真实 Git 仓库之间拦截不安全推送并转发安全推送,同时记录所有决策。
Stars: 0 | Forks: 0
# nimblegate
**状态:** v0.1.0 · 自 2026 年初起用于生产环境
nimblegate 位于**你的 AI agent 和真实的 git host 之间**。你的 agent 进行的每一次 push 都会根据你开启的规则进行检查;干净的 push 会在一秒内转发到你的 upstream,不安全的 push 会被拦截并附带清晰的报告。相同的输入,每次都会得到相同的答案。
**→ 试试 [在线演示](https://demo.nimblegate.com):浏览基于示例数据的真实仪表板,无需安装任何内容。**
**→ 新手?[入门指南](docs/getting-started.md) 将一步步带你从安装到完成第一次受保护的 push,无需任何 git 经验。**
## 目录
- [快速安装](#quick-install)
- [工作原理](#how-it-works)
- [工作流](#the-workflow)
- [Auto-PR:agent 修复循环](#auto-pr-the-agent-fix-loop)
- [它能拦截什么以及如何运作](#what-it-catches-and-how-it-acts)
- [面向 agent 的 MCP 分析](#mcp-analytics-for-agents)
- [指南](#guides)
- [职责所在](#where-the-responsibility-lives)
- [非商业版本包含的内容](#whats-in-the-non-commercial-version)
- [商业用途 · License · 隐私](#commercial-use)
## 快速安装
在单个 container 中实现自托管。你需要在运行网关的机器上安装带有 **`docker compose`** 插件的 **Docker**。
**1. 启动网关。**
```
curl -O https://raw.githubusercontent.com/nimblegate/nimblegate/main/compose.yaml
docker compose up -d
```
**2. 认领管理员账号。** 获取一次性设置 token,然后设置你的密码:
```
docker logs nimblegate | grep nbg-setup # prints the setup token
```
打开 **http://localhost:7900/setup**,粘贴 token,选择你的管理员密码。
**3. 注册要受保护的 repo。** 在仪表板中:**Repos → Add a repo**,然后填写:
- **Name** - 字母、数字、连字符(例如 `my-app`)。这是你要 push 的目标名称。
- **Upstream URL** - 你的真实 repo 地址,必须是 **HTTPS** 格式:`https://github.com/you/my-app.git`(而不是 `git@…` SSH 形式)。container 仅通过 **HTTPS** 进行中继 - 设计上它不包含 SSH 客户端 - 并且 PAT 对**公共和私有** repo 进行身份验证。
- **Upstream credential** - 来自你的 git host 的 **Personal Access Token**,其权限范围限定为**写入该 repo**:
- GitHub **fine-grained**:repository = 该 repo,**Contents → Read and write**
- GitHub **classic**:`repo` scope
- GitLab / Gitea:具有对该 repo 写入/push 权限的 token
*(Auto-PR 的修复循环需要更多权限 - 请参阅 [入门指南](docs/getting-started.md#step-4-register-the-repo-to-guard)。)*
点击 **Register**。如果 upstream **已经有 commits**,请点击 repo 行上的 **Sync from upstream**,以便网关同步其当前历史记录(这样你现有的 clones 就能顺利 push) - 全新的/空的 upstream 不需要同步。**core** 规则套件会自动应用。 → [其他 git hosts,作用域访问](docs/getting-started.md)
**4. 授权你的 push key。** 在你的开发机器上,打印你的 SSH **public** key:
```
cat ~/.ssh/id_ed25519.pub
```
复制整行,然后在仪表板中转到 **Keys → Add a key**,粘贴并保存。网关只会看到你的 **public** key - 永远不会看到私钥。
**5. 将你的计算机指向网关并 push。** 将网关添加为你的 remote,并 push 到它而不是你的真实 host。
```
git remote set-url origin ssh://git@:2222/~/my-app.git # my-app = the name from step 3
git push
```
**6. 查看运行效果。** 干净的 push 会被接受并转发到你的 upstream;触发规则的 push 会被拦截,永远不会到达真实 host。在仪表板的 **Feed** 中实时查看。
需要裸机安装、SSH-key upstreams、多开发人员作用域访问或公共 TLS? → **[入门指南](docs/getting-started.md)** - 完整的演练 + 故障排除。
## 工作原理
这里有**三个位置**,理清它们是整个游戏的关键:
```
YOUR COMPUTER THE GATEWAY THE UPSTREAM
(you / your agent (nimblegate) (GitHub / Gitea / GitLab:
write + git push) your real repo)
git push ──────────────────► checks your rules ─forwards─► stores the code
git clone ◄───────────────── serves the code
```
- **你的计算机只与网关通信:** 你 push 到它并从中 clone,
永远不会直接连接 upstream(那会跳过检查)。
- **只有网关与 upstream 通信:** 它持有凭证,
并为你转发干净的 push。
你的 commits 到达 upstream 时**逐字节保持不变**:相同的 SHA、相同的 author、相同的 signature。网关只负责检查和转发;它从不重写。你可以在仪表板上实时看到每一次 push 和决定,并且你可以随时更改规则;下一次 push 将使用新规则集。
**这能为你带来什么:**
- **节省审查时间。** 网关是 agent 输出与你真实 repo 之间的过滤器,
因此你不必亲自逐个肉眼检查每个生成的 diff。
- **在 push 时拦截,而不是在部署时。** 泄露的凭证、向 main 的 force-push、schema drift:在网关处被拦截,永远不会进入你的 upstream 历史。
- **一个修复循环能够收敛的审查者。** “Push → 失败 → 修复 → 通过”只在审查者每次回答一致时才有效。模式检查可以做到;AI 审查者做不到。
- **拦截记录证明。** 每个决定的实时 feed,加上一个估算节省时间的统计页面。
- **干净时隐形。** 干净的 push 在一秒内转发;只有在有内容需要查看时,网关才会发声。
详细说明心智模型的完整演练:**[入门指南](docs/getting-started.md)**。
## 工作流
在日常使用中,网关契合正常的功能分支流:
1. **你的 agent 在功能分支上工作** - 编码 agent 通常为每个任务使用一个 git
worktree,因此同时进行着多个分支(一个任务,一个分支) - 并将其 push **到网关**。
2. 网关检查该 push。**干净** → 转发到你的 upstream,在那里会开启一个 PR
(`feature → main`)。**发现** → **拒绝**,并且糟糕的 commit
永远不会到达 upstream。
3. 在拒绝且已有打开的 PR 时,网关会将该发现作为 PR 评论发布
(参见下文的 Auto-PR) - agent 阅读它,进行修复,然后重新 push 直到通过。
4. **你像往常一样在你的 git host 上审查 PR 并将其合并到 `main`**。
因为被拒绝的 commits 在网关处被拦截,你 upstream 上的分支只
包含经过网关检查的干净代码 - 因此当你审查 PR 时,它已经
通过了自动化检查;你可以将审查时间花在判断上,而不是寻找泄露的 key 或 `rm -rf`。将 repo 的 **protected refs 设置为 `refs/heads/*`**,以便 agent 的 *feature* 分支受网关保护,而不仅仅是 `main`。
## Auto-PR:agent 修复循环
当 push 被拒绝时,网关会将发现结果作为**结构化评论发布在 upstream PR 上**,并触发一个带有相同 JSON 的 **webhook**,以便 agent(Claude Code、Cursor、Copilot、自定义 CI)读取拒绝信息并自行修复。
置顶评论会就地更新,跟踪 **尝试 N/M** 并 @-提及该 agent;当随后的 push 通过时,它会翻转为 **✅ 所有问题已解决**,循环关闭。`/auto-pr` 仪表板将其显示为 Dashboard / Repos / Activity / Setup 标签页。
最低配置(针对每个 repo,`/auto-pr` → Setup 或 `gateway.toml`):设置
`[notification] enabled = true` 以及一个提及的 handle 和/或 webhook URL。
upstream token 需要 **comment** 权限(与中继的 push 权限分开):**GitHub** - classic `repo`,或 fine-grained **Issues: Read and write** + **Pull requests: Read**(PR 评论使用 Issues API);**Gitea** -
`write:issue`;**GitLab** - **`api`** scope(没有更窄的范围允许 MR 评论)。如果投递失败,**Auto-PR → Repos** 标签页会显示错误 +
一个 **Retry now** 按钮。完整设置 + 接收器示例:
**[notifications.md](docs/notifications.md)**。
## 它能拦截什么以及如何运作
nimblegate 内置了 **45 条规则(“frames”)**,专门针对 agent 最常犯的错误,并将其分组为一键式 **kits**:
- **`core`** *(每个 repo)*:硬编码的凭证、提交的私钥、
向受保护分支的 force-push、`--no-verify` 绕过、对受保护路径的 `rm -rf`、`curl | sh` 模式、DB schema drift、非幂等迁移。
- **`web-app`** / **`cf-pages-project`** / **`cf-workers-project`**:特定 stack 的
捆绑包(HTML/SEO、Cloudflare Pages + D1、Workers)。
- **`security-strict`** / **`encoding-strict`**:不可见 Unicode 攻击
类别以及因粘贴损坏而静默破坏解析器的问题。可叠加在任何 kit 上。
此外还有你自己的 **regex 规则**,可以直接在仪表板上编写,并带有实时的“将标记 N 个文件”预览:无需代码,无需重新构建。选择和编写策略:
**[policy-authoring.md](docs/policy-authoring.md)**。完整目录:
**[frames.md](docs/frames.md)**。
然后,每个 repo 会以以下两种模式之一运行这些规则,可针对每个 repo 进行设置:
| | Enforce(默认) | Observe(`observe = true`) |
|---|---|---|
| **拦截发现** | push **被拒绝** | 记录,**已中继** |
| **Pusher / agent 看到的内容** | 发现 + `push rejected` | **什么都没有**,静默 |
| **Operator 看到的内容** | 仪表板 + 审计日志 | 仪表板 + 审计日志(⚠ 横幅) |
| **充当护栏?** | **是** | **否,仅供参考** |
| **用于** | 日常保护 | 衡量/基准测试 agent |
Observe 模式是**故意静默的**,以便 agent 无法适应网关;它衡量的是行为,**不是**安全网(凭证或 `curl | sh` 会被记录并放行)。切换模式会在下一次 push 时生效。
## 面向 agent 的 MCP 分析
网关公开了一个只读分析 API(MCP + REST),以便 agent 可以直接查询决定日志:*“本月哪个 repo 的退回次数最多?”*,*“网关避免了多少调试时间?”*,*“本周发生了什么变化?”*,这些都可以通过基于验证日志的 SQL 来回答。生成一个 bearer token
(`nimblegate gateway token new
标签:AI代理, DevSecOps, EVTX分析, Git, 上游代理, 代码安全审查, 内存分配, 版权保护, 网关, 网络安全研究, 请求拦截