RefuseHQ/refuse-cli
GitHub: RefuseHQ/refuse-cli
通过 PATH shim 拦截 18 个主流包管理器的安装命令,在执行前阻断存在已知 CVE 漏洞的依赖包。
Stars: 2 | Forks: 1
# refuse-cli
**封装了 18 个包管理器 —— `npm`、`pnpm`、`yarn`、`bun`、`npx`、`pip`、`pip3`、`uv`、`poetry`、`pipenv`、`pdm`、`pipx`、`cargo`、`gem`、`bundle`、`go`、`composer`、`dotnet` —— 作为 PATH shim,并附带 Claude Code pre-tool-use hook。拒绝安装存在已知 CVE 的软件包。**
[](https://github.com/RefuseHQ/refuse-cli/actions/workflows/ci.yaml)
[](https://github.com/RefuseHQ/refuse-cli/actions/workflows/lint.yaml)
[](https://github.com/RefuseHQ/refuse-cli/actions/workflows/codeql.yml)
[](https://github.com/RefuseHQ/refuse-cli/releases)
[](https://pkg.go.dev/github.com/RefuseHQ/refuse-cli)
[](LICENSE)
```
$ npm install lodash@4.17.10
refuse: blocked — CVE-2019-10744 (high)
Prototype pollution in lodash <= 4.17.11
suggested safe version: 4.17.21
```
`refuse` 位于你的包管理器之前。每次 `install` 调用都会在运行真实二进制文件之前,交由 [`refuse`](https://github.com/RefuseHQ/refuse) 服务器(自托管)或 [refuse.dev](https://refuse.dev)(托管版)进行审查。如果该软件包存在高于你设定的严重性阈值的安全公告,安装将被阻止,并提示 CVE 及建议的安全版本。
适用场景:
- 开发者的笔记本电脑。
- CI runner。
- Docker build stage 内部。
- 作为 [Claude Code](https://www.anthropic.com/claude-code) PreToolUse hook —— 为自主 agent 安装提供同样的拦截机制。
## 安装
**Homebrew** (macOS):
```
brew install refusehq/tap/refuse
```
**macOS / Linux 上直接使用二进制文件**:
```
curl -sSL https://raw.githubusercontent.com/RefuseHQ/refuse-cli/main/scripts/install.sh | sh
```
**Windows 上直接使用二进制文件** (PowerShell):
```
irm https://raw.githubusercontent.com/RefuseHQ/refuse-cli/main/scripts/install.ps1 | iex
```
**从源码构建**:
```
go install github.com/RefuseHQ/refuse-cli/cmd/refuse@latest
```
**支持平台。** 预编译二进制文件发布于以下平台:
| 操作系统 | 架构 |
| --- | --- |
| macOS | x86_64, arm64 |
| Linux | x86_64, arm64, i386, armv6, armv7 |
| Windows | x86_64, arm64, i386 |
其他平台可以通过源码执行 `go install`。
## 快速开始
```
refuse init # interactive: server URL + API key
refuse install # writes shims to ~/.refuse/bin + updates PATH
refuse hook install claude-code # PreToolUse hook in ~/.claude/settings.json
refuse python-hook install # closes the `python -m pip` bypass (per Python env)
```
然后像平常一样运行任何命令:
```
npm install express
pip install requests
cargo add tokio
```
如果安装是干净的,命令将会通过。如果不是,refuse 将阻止它并告诉你原因。
## 服务器
CLI 是拦截关卡;服务器是大脑。有两种方式启动后端 —— 任选其一:
**托管版** ([refuse.dev](https://refuse.dev))
```
refuse config set server_url https://mcp.refuse.dev
refuse config set api_key rfs_...
```
**自托管版** ([RefuseHQ/refuse](https://github.com/RefuseHQ/refuse) —— Apache-2.0 协议,单一 Docker container,无需注册)
```
docker run -d --name refuse -p 8080:8080 \
-v refuse-data:/data \
ghcr.io/refusehq/refuse:latest
refuse config set server_url http://localhost:8080
```
服务器会摄取 OSV、CISA KEV、FIRST EPSS、GHSA、deps.dev 和 Wolfi 的数据;首次启动的引导过程约需 3 分钟,之后每 5 分钟进行一次增量更新。当种子数据加载完成后,`GET /readyz` 的状态会从 503 变为 200。两个版本使用相同的 `/api/v1/check/*` API,因此在托管版和自托管版之间切换只需修改一行配置。
## 支持的包管理器
| 管理器 | 生态系统 | 安装动词 | Lockfile 解析 |
| --- | --- | --- | --- |
| `npm` | npm | `install`, `i`, `add` | `package-lock.json` |
| `pnpm` | npm | `install`, `add` | `pnpm-lock.yaml` |
| `yarn` (classic + Berry) | npm | `add`, `install` | `yarn.lock` |
| `bun` | npm | `install`, `add` | `bun.lockb` / `bun.lock` |
| `pip` / `pip3` | PyPI | `install`, `install -r` | `requirements.txt` |
| `cargo` | crates.io | `add`, `install` | `Cargo.lock` |
| `gem` | RubyGems | `install` | `Gemfile.lock` |
| `go` | Go modules | `get`, `install` | `go.sum` |
## 支持的 Agent Hook
| Agent | 状态 |
| --- | --- |
| Claude Code | ✓ 支持 |
| Cursor | 已纳入追踪 |
| Continue | 已纳入追踪 |
| Aider | 已纳入追踪 |
| Codex CLI | 已纳入追踪 |
| Cline | 已纳入追踪 |
欢迎提交 PR —— 请参阅 [`internal/hook/claudecode.go`](./internal/hook/claudecode.go) 作为参考。
## 命令
| 命令 | 功能 |
| --- | --- |
| `refuse init` | 首次设置向导 |
| `refuse install` | 为受支持的包管理器安装 shim |
| `refuse uninstall` | 移除 shim 并还原 shell-rc 修改 |
| `refuse hook install 标签:DevSecOps, EVTX分析, 上游代理, 依赖管理, 日志审计, 漏洞防护, 请求拦截, 软件供应链安全, 远程方法调用