有位開發(fā)者正盯著終端,心里一陣窩火。他給 Claude Code 裝了一個工作記憶服務,讓代理發(fā)現什么就記一筆,回頭再用。他在 CLAUDE.md 里白紙黑字寫著:“每個任務開始時先調用回憶工具。” 結果在一次真實會話里,代理完全無視了這條指令,翻出三周前就讀過的文件,又重新讀了一遍。這家伙氣得想再補幾條更嚴厲的 prompt,突然停住了——他意識到,指望用語句保證行為可靠性,就像在冰箱門上貼滿便簽,但家里沒有一個人看。
這就是 Claude Code 用戶會碰到的最擰巴的事:你可以反復「教育」模型,卻永遠得不到確定性。模型本質是概率的,而真正能保證每次一定發(fā)生的,是腳手架,也就是 hooks。與其在 CLAUDE.md 里寫一萬句“請每次都先查記憶”,不如在合適的事件上掛一個腳本,讓它無聲運行。
![]()
現在需要把腦子里那個默認分清楚:CLAUDE.md 管的是偏好和風格,告訴模型“你最好這么做”“你可以參考這個”;而 hook 管的是必須一擊必中的東西——安全攔阻、上下文注入、事后清理。把必須發(fā)生的邏輯塞進模糊指令區(qū),模型偶爾忽略一次,你的系統(tǒng)就瞬間從演示模式滑坡到生產事故。
Hooks 在會話生命周期里觸發(fā)。幾個最頂用的節(jié)點:SessionStart 時初始化環(huán)境,PreToolUse 在工具調用前做檢查,PostToolUse 抓執(zhí)行后的狀態(tài)。你可以在 settings.json 里配置,而且支持三級粒度:全局 ~/.claude/settings.json(不提交),項目共享的 .claude/settings.json,還有自己的 .claude/settings.local.json(放進 gitignore)。
配置非常直白。比如你要在每次 Bash 工具被調用前攔一腳,就在 PreToolUse 里掛一個匹配 Bash 的組,再指一個腳本路徑和超時時間。匹配器很靈活,支持像 "Edit|Write" 那樣用管道拼多個工具名,也支持 startup|resume 這類原因過濾。鉤子類型不止 shell 命令,還有 HTTP 回調、MCP 工具調用,甚至帶 LLM 的提示型鉤子,但凡要省一點延遲,直接用本地命令最快。
動手試試第一個管道:把 rm -rf 這種誤刪的風險關進籠子。新建 .claude/hooks/guard.sh,讓它讀入事件傳來的 JSON,用 jq 掏出工具名和命令字符串。如果工具是 Bash,且命令里藏著 rm -rf(但又不涉及 node_modules 這種常規(guī)清理),腳本立刻吐出一個錯誤對象,告訴代理此路不通。
這一下就從概率游戲切換到了硬約束。以前你可能要在 CLAUDE.md 啰嗦“絕對不要執(zhí)行危險的刪除命令”,但模型到底聽不聽全憑運氣;現在 hook 直接接管,連商量的余地都沒有。于是你終于可以把心里的清單重新分類:偏好寫進 CLAUDE.md,規(guī)則交給 hooks,再也不用對著日志生悶氣。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.