Show HN:一个预执行守卫,阻止 AI 代理运行破坏性命令
Agent Guard 是一个约 60 行的 shell 钩子,在 AI 代理执行每条命令前进行检查,阻止 git reset --hard、rm -rf 等不可逆操作,并将原因写入 stderr 反馈给代理循环。它采用“故障关闭”策略,匹配整个命令字符串,适用于 Claude Code 的 PreToolUse 钩子,并强调无法防御恶意规避,仅作为“安全带”而非“防滚架”。
AI 编程代理在自信满满时,可能会执行 git reset --hard、强制推送到主干,甚至删除数据库表——不是因为它粗心,而是因为循环在几步前已经偏离了轨道。Agent Guard 正是为这种场景设计的:一个约 60 行的 shell 钩子,在代理提出的每条命令执行之前运行,以退出码 2 拒绝命令,并将原因写入 stderr。代理 CLI 会把这个反馈重新喂入循环,从而停止重试,把命令交给人类处理。
安装十分简单:运行 install.sh 将 PreToolUse 钩子合并进 .claude/settings.json,再运行 test-guard.sh 进行断言测试。它依赖 bash、grep -E 和 python3,兼容 Claude Code 的 PreToolUse 钩子,也适用于任何在调用工具前运行 shell 钩子并尊重退出码的代理 CLI。
守卫默认阻止的命令包括:git reset --hard、rm -rf、git clean -f/-x、git checkout .、git filter-branch、强推 main/master/production 分支、DROP TABLE、TRUNCATE、FLUSHALL、aws delete-*/terminate-*、kubectl delete、terraform destroy、docker … prune、chmod 777、curl … | sh,以及对 /dev/sd* 的裸写入。规则以“标签@@正则”对的形式集中在脚本顶部的数组里,用户可以自行编辑,并建议在添加规则时附上良性命令的测试用例,以免正则误伤。
开发者非常坦率地说明了它的局限:它能阻止“一个自信的代理以纯文本形式提出不可逆命令”,这是实际遇到的失败模式;但它无法阻止刻意规避的行为,比如 g""it reset --hard、通过 eval 传递 base64 负载、shell 脚本或别名。因为匹配器只是对命令字符串做正则匹配,而正则永远赢不了对手。这背后的威胁模型是:假设代理有良好意图,只是状态不佳,而不是恶意对抗。如果代理真的在混淆命令绕过钩子,那就不是规则列表能解决的了。
它也不是服务端分支保护、最低权限凭证和备份的替代品。开发者明确表示,这些更可靠的手段位于机器外部,应优先使用;Agent Guard 只用于填补它们无法覆盖的不可逆操作,比如未提交工作的硬重置、递归删除、删除表、销毁环境。用他们的话说,这是一条“安全带”,而不是“防滚架”。
两个值得注意的设计决策:第一,它匹配整个命令字符串,包括参数,因此提交消息里引用被禁短语也会被拦截。这是故意的,因为替代方案是解析 shell 引号、展开和 eval,而每增加一个解析器就多一条绕过路径。所以“故障安全”胜过“聪明”;建议用 git commit -F .commit-msg 而不是 -m "..."。第二,它故障时关闭(fail closed):如果无法从钩子负载中读取命令,就会阻止执行。一个静默降级为“全部放行”的守卫比没有更糟糕,因为你会停止警惕。
设计理念是分层:破坏性命令和外部副作用命令是不同的问题。Tier 1 包括 rm -rf、reset --hard、DROP TABLE 这类不可恢复的操作,绝不妥协,不提供解锁,甚至对“赶时间的人”也不解锁。Tier 2 包括 git push、npm publish、部署、迁移等有真实影响但可审查、可逆转的操作;这些不应被禁止,而应被“门控”——由人类短时解锁,窗口自动重新锁定。Tier 2 的关键是解锁机制必须让代理无法触及,包括不能刷新时间戳延长窗口,也不能删除记录来隐藏使用痕迹。
完整套件还在这个基础之上加入了带限时解锁的 Tier 2、配置文件、git pre-push 钩子、隔离工作流、用确定性评分器捕获提示回归的合并门禁,以及每条规则背后的事故报告,地址见 https://andevan.gumroad.com/l/agent-control-kit。项目以 MIT 许可证发布,开发者鼓励大家拿去用、fork,并整合进自己的工具链。