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,並整合進自己的工具鏈。