ch4nn0n/fencepost
GitHub: ch4nn0n/fencepost
fencepost 是一个 Claude Code 插件,通过可配置的 YAML 规则集为每次工具调用提供 allow/ask/deny 三级权限控制。
Stars: 1 | Forks: 0
# fencepost
**为每一次 Claude Code 工具调用提供可配置的权限网关。**
[](https://github.com/ch4nn0n/fencepost/actions/workflows/ci.yml)
[](https://ch4nn0n.github.io/fencepost/)
[](./LICENSE)
fencepost 作为 [Claude Code](https://docs.claude.com/en/docs/claude-code) 插件安装,并在 `PreToolUse` hook(加上用于密钥脱敏的 `PostToolUse`)上运行,因此它能在**每次工具调用发生前**对其进行拦截,并根据你控制的 YAML 规则集对其进行评估。每次调用都会解析为以下三种决策之一:
| 决策 | 结果 | 向谁显示原因 |
|----------|--------------|-----------------|
| **allow** | 工具静默运行(快速路径)。 | — |
| **ask** | Claude Code 提示你进行批准。 | 你 |
| **deny** | 工具被阻止,并提供可操作的替代方案。 | Claude |
拒绝并不是死胡同:fencepost 会引导 Claude 采用建议的替代方案,而不是让它重试同一堵墙。
## 为什么选择 fencepost
- **精心策划、可共享的规则。** 一行代码即可导入针对 `git`、`kubernetes`、`helm`、`ansible`、`filesystem` 等经过实战检验的规则集。
- **真正的 bash 理解能力。** 命令使用 tree-sitter 进行解析,而不是简单的模式匹配——fencepost 能够推理重定向、每个参数、复合命令,甚至内联的 `python -c` / `node -e` 代码片段。
- **临时沙盒。** 将临时文件汇集到 `/tmp/claude` 并将破坏性权限限制在该目录内;文件系统的其余部分保持受控状态。
- **密钥保护。** 使用你已安装的 gitleaks(推荐)/ betterleaks / trufflehog / detect-secrets 中的任意一种,fencepost 会拒绝包含凭据的工具输入,并在工具输出到达模型之前将其中的密钥进行脱敏处理。
- **失败即关闭的安全机制。** 损坏的安全配置会拒绝所有操作,直到人工修复,而不是静默降低安全性。
- **审计追踪。** 每一个决策都会被记录;`/audit` 技能能将实际使用情况转化为具体的配置建议。
fencepost 作为一个小型的已提交 JS bundle 发布(约 280 KB,外加 tree-sitter 语法),因此用户无需构建步骤,也无需下载大型二进制文件。它可以在 **Node**(如果你通过 npm 运行 Claude Code,你已经具备了此环境)或 **Bun** 上运行。
## 安装
该代码库本身也兼作一个单插件市场:
```
/plugin marketplace add ch4nn0n/fencepost
/plugin install fencepost@fencepost
```
hooks 将被注册,并且网关会在下一次工具调用时生效。要在不安装的情况下针对克隆进行测试:
```
git clone https://github.com/ch4nn0n/fencepost.git
claude --plugin-dir ./fencepost
```
有关详细信息,请参阅[安装指南](https://ch4nn0n.github.io/fencepost/docs/getting-started/installation)。
## 快速开始
在你的项目中创建 `.claude/fencepost.yaml`:
```
import:
- claude # allow Claude's built-in tools + enable the /tmp sandbox
- git # sensible git porcelain rules
default: ask # what to do when nothing matches
onError: ask # what to do when a command can't be checked
```
这就足以发挥作用了:
```
git status # → allow (silent)
git push origin main # → ask (you approve)
git push --force # → deny (steered to --force-with-lease)
```
在此之上叠加你自己的规则——导入的规则是基础,你的规则始终优先。请参阅[配置指南](https://ch4nn0n.github.io/fencepost/docs/configuration/config-files)。
## 内置预设
`claude` · `claude-web` · `git` · `gh` · `kubernetes` · `helm` · `helmfile` · `ansible` · `context7` · `playwright` · `filesystem` · `python-safety` · `secrets`
请参阅[预设参考](https://ch4nn0n.github.io/fencepost/docs/presets)。
## 开发
```
bun install
bun test # run the test suite
bun run typecheck # tsc --noEmit
bun run build # bundle src/ → dist/index.js (+ wasm grammars)
bun run dev # run the entry point directly
```
`dist/` 是有意提交的——它是插件发布的构建产物——因此每当你更改 `src/` 时,请重新构建并提交它。
文档站点位于 [`docs/`](./docs) (Docusaurus):
```
cd docs
bun install
bun start # dev server with HMR
bun run build # static site → docs/build/
```
## 发布
发布过程由 [release-please](https://github.com/googleapis/release-please) 自动化。请编写 [Conventional Commits](https://www.conventionalcommits.org/)(`feat:`、`fix:` 等);release-please 会维护一个**发布 PR**,用于提升版本号(同时更新 `package.json` 和 `.claude-plugin/plugin.json`)并更新 `CHANGELOG.md`。合并该 PR 将会打上发布标签并发布一个可直接安装的插件归档。
## 许可证
[GNU General Public License v3.0](./LICENSE) 或更高版本。
标签:AI编程助手, Claude Code插件, DevSecOps, MITM代理, 上游代理, 敏感信息脱敏, 数据可视化, 权限控制, 策略引擎, 网络安全挑战, 自动化攻击