源碼解讀:pre/post工具鉤子如何改寫Agent行為)
【免費下載鏈接】claude-code-source-codeClaude code source code項目地址https://gitcode.com/gh_mirrors/cla/claude-code-source-code點擊查看免費下載Claude Code 是運行在終端里的 AI 編程 Agent它的Hooks 鉤子系統(tǒng)與Memory 記憶子系統(tǒng)決定了每一次工具調用會被攔截、改寫還是放行。本文基于 Claude Code 源碼架構做完整解讀講清PreToolUse/PostToolUse兩條 pre/post 鉤子的執(zhí)行鏈路、退出碼協(xié)議以及CLAUDE.md記憶文件如何分層注入上下文幫你不改一行代碼就能定制 Agent 行為。一、先看倉庫源碼在哪里當前倉庫是一個指針倉庫僅包含 README.md 和一個圖片資產。README 的 “Main Projects” 部分給出了完整源碼倉庫的指引想逐行讀源碼請從那里入手git clone https://gitcode.com/gh_mirrors/cla/claude-code-source-code理解 Hooks 與 Memory 的關鍵不在某個單文件而在下面這套三層執(zhí)行架構上。二、Hooks 子系統(tǒng)全景事件 → 匹配器 → 你的命令 整個鉤子系統(tǒng)分三層配置層settings.json里的 hook 規(guī)則分四級——企業(yè) managed 策略、用戶級~/.claude/settings.json、項目級.claude/settings.json、本地級.claude/settings.local.json作用域越大優(yōu)先級越高。執(zhí)行層Agent 主循環(huán)在對應的生命周期節(jié)點把一份 JSON 事件數(shù)據(jù)寫進你 shell 命令的 stdin。協(xié)議層命令的退出碼 stdout 的 JSON決定 Agent 下一步干什么。鉤子事件一覽長尾關鍵詞Claude Code hooks 有哪些事件觸發(fā)時機能做什么PreToolUse?每次工具調用執(zhí)行前攔截 / 放行 / 請求授權改寫工具輸入PostToolUse?工具調用成功后注入觀察上下文、做后處理PostToolUseFailure工具調用失敗后收集錯誤信息、告警UserPromptSubmit用戶提交 prompt 時追加上下文、拒絕 promptStop/SubagentStop主 Agent / 子 Agent 結束響應時用退出碼 2 強制繼續(xù)干活SessionStart/SessionEnd會話開始 / 結束注入初始上下文、清理記錄PreCompact上下文壓縮前備份、通知Notification等待輸入等通知觸發(fā)時桌面通知等在 settings.json 中注冊鉤子最快配置方法{ hooks: { PreToolUse: [ { matcher: Bash, hooks: [ { type: command, command: jq -r .tool_input.command, timeout: 30 } ] } ] } }matcher是匹配工具名的正則甚至可以細到參數(shù)Bash(git commit*)、Edit(/etc/*)。timeout單位為秒默認 60 秒超時后鉤子被丟棄主流程繼續(xù)。三、PreToolUse 源碼鏈路攔截與改寫如何發(fā)生在源碼的工具執(zhí)行管線中順序是工具校驗 → 權限門 → PreToolUse 鉤子 → 真正執(zhí)行工具。鉤子在“最后一刻”介入因此擁有最大話語權。Agent 產生一次工具調用例如Bash執(zhí)行前把事件 JSON 通過 stdin 交給你的鉤子命令{ hook_event_name: PreToolUse, tool_name: Bash, tool_input: { command: git push }, session_id: …, transcript_path: …, cwd: … }鉤子的輸出決定這次工具調用的命運。退出碼與 JSON 協(xié)議pre 鉤子的核心鉤子輸出Agent 行為退出碼 0放行stdout 僅記錄到 transcript退出碼 2阻斷stderr 回灌給 Claude工具不執(zhí)行其他非 0非阻斷錯誤stderr 展示給用戶JSON{decision:block,reason:…}帶理由阻斷等效退出碼 2JSONpermissionDecision: allow/deny/ask直接給出權限裁決跳過交互確認JSONupdatedInput改寫工具輸入實際執(zhí)行的參數(shù)被鉤子替換這里藏著 pre 鉤子改寫 Agent 行為的兩個殺手锏改參數(shù)updatedInput例如在Bash執(zhí)行前把命令里的高危路徑替換成沙箱路徑或給危險命令追加--dry-run——模型對“輸入被換過”毫無感知。改裁決permissionDecision原本要彈窗問用戶的權限確認由鉤子直接 allow / deny / ask適合全自動流水線。四、PostToolUse 源碼鏈路把觀察結果回灌給模型它的 stdin 與 pre 相同但額外多一個tool_response工具執(zhí)行結果。在 JSON 輸出里用hookSpecificOutput.additionalContext可以把額外觀察追加進 Claude 的上下文。例如測試輸出有 2 萬行鉤子先跑一遍grep -E FAIL|Error只把失敗摘要塞給模型下一輪推理更準、更省 token。退出碼 2 時stderr 回灌給 Claude 而非用戶適合“工具成功了但我要提醒模型注意”。一句話總結這條閉環(huán)pre 決定“能不能做、怎么做”post 決定“做完后模型看到什么”——這就是工具鉤子改寫 Agent 行為的完整機制。五、Memory 子系統(tǒng)CLAUDE.md 的分層記憶 Memory 是 Agent 的“長期記憶”全部落在CLAUDE.md記憶里文件上。記憶文件的分層與加載順序文件范圍用途企業(yè) managed 策略組織級強制約束優(yōu)先級最高項目根CLAUDE.md/.claude/CLAUDE.md團隊共享代碼規(guī)范、常用命令、架構約定~/.claude/CLAUDE.md個人跨項目個人偏好多層記憶都會在會話開始時被注入系統(tǒng)上下文是 Agent 每次行動前讀到的“第一組規(guī)則”。支持path/to/file語法把別的文件內聯(lián)進記憶如docs/api-notes.md。子目錄里也可以放CLAUDE.mdAgent 碰到該目錄下的文件時才加載實現(xiàn)“按目錄生效”的局部記憶。用 /init 與 # 快捷鍵維護記憶最快上手方法新項目跑一次/initClaude Code 自動生成CLAUDE.md模板。輸入框里按#把當前這句話直接存入項目記憶。/memory打開編輯器集中修改記憶文件。六、Hooks × Memory讓 Agent 行為可演化兩個子系統(tǒng)組合起來能做出“會成長的 Agent”SessionStart鉤子會話開始時讀取記憶里的最新約定additionalContext注入上下文PostToolUse鉤子關鍵工具調用成功后如測試通過自動往記憶文件追加一行“經(jīng)驗”記憶隨每次會話沉淀Agent 行為持續(xù)變好——全程不改任何源碼。七、常見問題排查清單癥狀排查方法鉤子不生效先確認matcher正則命中工具名用示例 payload 手動跑一遍jq .驗證 JSON 能解析確認命令在bash -c下可執(zhí)行鉤子超時調大timeout鉤子只做輕量判斷重邏輯拆到獨立進程block 與 ask 混淆退出碼 2 硬阻斷permissionDecision: ask 仍彈窗問用戶記憶不生效檢查文件所在層級項目根 vs~/.claude/改完開新會話記憶在會話開始注入八、總結PreToolUse攔截 改寫靠decision/permissionDecision/updatedInput三個協(xié)議字段實現(xiàn)。PostToolUse后處理 上下文注入靠additionalContext把觀察結果回灌給模型。CLAUDE.mdAgent 的分層長期記憶會話開始時整體注入。Hooks 是 Agent 行為的改寫層Memory 是 Agent 行為的記憶層。讀懂這兩層你就能在不修改任何源碼的前提下把 Claude Code 配置成貼合自己團隊工程流的 Agent。贊分享【免費下載鏈接】claude-code-source-codeClaude code source code項目地址https://gitcode.com/gh_mirrors/cla/claude-code-source-code點擊查看免費下載相關推薦GoReleaser Build Hooks 實戰(zhàn)指南pre/post 構建鉤子的配置、模板與源碼原理GoReleaser Build Hooks 實戰(zhàn)指南pre/post 構建鉤子的配置、模板與源碼原理 GoReleaser 的 builds .hooks開發(fā)工具CI/CD構建工具如何在 Windows 上為 Claude Code 編寫跨平臺的 SessionStart 鉤子腳本如何在 Windows 上為 Claude Code 編寫跨平臺的 SessionStart 鉤子腳本 Superpowers 倉庫的 Claude CodeAI 技能AI 插件開發(fā)工具agno Agent 鉤子機制實戰(zhàn)指南基于 09_hooks 示例解析 pre/post hooks、工具中間件與流式生命周期agno Agent 鉤子機制實戰(zhàn)指南基于 09_hooks 示例解析 pre/post hooks、工具中間件與流式生命周期 本篇技術指南圍繞 agno 開人工智能AI AgentAgent 框架多智能體工具調用RAGAgent 記憶Agent 工作流后端創(chuàng)作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考