Baton 是挂在 PATH 最前面的轻量审批闸门:AI coding agent 执行高风险命令时,先用 macOS 原生对话框向你确认。
它适合给 Emdash、claudexor、Conductor 以及直接运行的 Codex、Claude Code 等工具加一层“防手滑、防失控”保护。它不是安全沙箱,也不用于抵抗主动绕过闸门的恶意程序。
- macOS
- Node.js 20+
- pnpm
git clone https://github.com/yangjinmin666/baton.git
cd baton
pnpm install
pnpm build
npm link
baton installbaton install 会生成 ~/.baton/shims/,并打印这一行:
export PATH="$HOME/.baton/shims:$PATH"把它加入 ~/.zprofile,完全退出并重开 Emdash 和终端后检查:
baton statusstatus 应显示“闸门目录已位于最前面”。
安装命令还会注册一个当前用户专属的 macOS LaunchAgent。L0/L1 仍由 shim 直接透传;L2/L3 才通过权限为 0600 的本地 Unix socket 请求这个小型审批服务。这样即使 agent 自带沙箱不允许写 ~/.baton,原生弹窗与追加式审计仍由沙箱外的用户进程可靠完成。审批服务不可用时,高风险命令一律拒绝。
直接运行 agent:
codex exec "修复登录失败的问题"在 Emdash 中使用:把上面的 PATH 行加入登录 shell 配置,完全退出并重新打开 Emdash。Emdash 仍按原方式发现 agent CLI;agent 启动的 git、npm、rm 等同名命令会先经过 Baton。
查看审批历史:
baton log
baton log --jsonBaton 为以下命令安装同名 shim:
git gh npm pnpm yarn npx curl wget docker ssh scp rsync sudo rm
- L0/L1 静默放行:
git status/diff/log/add/commit、测试、构建、按 lockfile 安装已有依赖等。 - L2 弹窗:
git push、创建 PR、安装新包、外网curl/wget、改 CI、碰.env或密钥文件等。 - L3 弹窗且只能允许一次:
rm -rf、强推、删分支、改写历史、sudo、docker push、npm publish、远程ssh/scp/rsync、修改~/.baton等。
L2 对话框可选择“允许一次”“30 分钟内同类允许”或“拒绝”。同类授权按完整动作签名匹配,不会把 npm add zod 扩大成 npm:*。L3 的批量授权在代码层被禁用。
弹窗等待 5 分钟会自动拒绝。没有图形界面、osascript 失败或日志无法落盘时,同样拒绝并返回退出码 1。L2/L3 的请求与决策会以 JSONL 追加到 ~/.baton/audit/;显示和落盘前会脱敏常见 token 与私钥。
Baton 只拦截通过 PATH 按名字查找的命令调用。它拦不住:
- 绝对路径调用,例如
/usr/bin/git push; - agent 自己写代码,用原始 socket 直接联网;
- agent 直接调用系统 API,不经过这些命令行工具;
- agent 主动修改自己的
PATH,避开~/.baton/shims。
因此 Baton 是低打扰的操作确认层,不提供文件隔离、网络隔离或对抗性安全保证。需要抵抗恶意代码时,应继续使用厂商沙箱、容器或 OS 级隔离。
baton status # 安装状态、拦截命令、最近审批
baton log # 完整审批历史
baton uninstall # 移除 shims,保留审批历史卸载后还需从 shell 配置中删除 PATH 行。
pnpm test
pnpm buildMIT