總覽
什麼是 Hooks?
Hooks 是您定義的 shell 命令,它們會在 Claude Code 生命週期的特定時間點自動執行。您可以把它們想像成是為您的 AI 程式設計夥伴設定的「自動化規則」或「觸發器」。
與其在提示中反覆告訴 Claude 要遵守某些規則,不如將這些規則編碼為 Hooks,使其成為您開發環境中可靠且自動化的一部分。
為什麼要使用 Hooks?
Hooks 讓您能夠對 Claude Code 的行為進行確定性的控制,確保某些動作總是會發生。常見的使用情境包括:
自動格式化
在 Claude 每次編輯完畢後,自動對 .ts 檔案執行 prettier,或對 .go 檔案執行 gofmt。
自訂通知
當 Claude 等待您的指令或執行權限時,透過系統通知或聲音提醒您。
安全防護
阻止 Claude 執行危險的命令(例如 rm -rf)或修改生產環境的設定檔。
合規性記錄
追蹤所有由 Claude 執行的 shell 命令,以滿足稽核或除錯需求。
入門教學
本教學將引導您建立三個 Hooks,從簡單到複雜,逐步掌握核心概念。
1您的第一個 Hook - 檔案變更日誌
我們的第一個 Hook 非常簡單:每當 Claude 儲存一個檔案時,我們就在一個日誌檔中記錄下來。這個範例不需要任何外部工具。
- 在終端機中執行
/hooks
命令,打開 Hooks 設定介面。 - 從事件列表中選擇
PostToolUse
。這個事件會在 Claude 成功執行工具之後觸發。 - 選擇
+ Add new matcher…
,輸入Write|Edit|MultiEdit
來匹配檔案操作工具。 - 選擇
+ Add new hook…
,然後輸入以下命令:
echo "Claude edited a file at $(date)" >> ~/.claude/file-edit-log.txt
- 按
Enter
儲存 Hook。系統會詢問您儲存位置,選擇User settings
(使用者設定),這樣這個 Hook 就會在您所有的專案中生效。 - 按
Esc
退出設定介面。
驗證一下
現在,請 Claude 隨意修改您專案中的任何一個檔案。完成後,檢查日誌檔的內容:
cat ~/.claude/file-edit-log.txt
您應該會看到類似 "Claude edited a file at [日期時間]" 的訊息。恭喜,您已經成功建立了第一個 Hook!
2加入條件 - 使用匹配器
上一個 Hook 會在任何檔案被編輯後觸發。如果我們只想在特定工具被使用時觸發呢?這時就需要使用「匹配器」。
- 再次執行
/hooks
,選擇PostToolUse
事件。 - 選擇
+ Add new matcher…
,輸入Bash
。這樣 Hook 就只會在 Claude 執行 shell 命令後觸發。 - 新增一個 Hook 命令:
echo "Claude ran a bash command at $(date)" >> ~/.claude/bash-log.txt
3與 Claude 互動 - 記錄執行的命令
現在,我們來挑戰一個更進階的 Hook:記錄 Claude 嘗試執行的所有 shell 命令詳細資訊。這個 Hook 會讀取 Claude 傳遞的資料,並需要 jq
工具來解析 JSON。
先決條件
請確保您已安裝 jq
。如果沒有,請使用您的套件管理器安裝:
- macOS:
brew install jq
- Ubuntu/Debian:
sudo apt-get install jq
- Windows: 下載自 https://stedolan.github.io/jq/
- 執行
/hooks
,這次選擇PreToolUse
事件。這個事件在 Claude 準備執行一個工具(如bash
命令)之前觸發。 - 為這個 Hook 新增一個匹配器,輸入
Bash
,這樣它就只會監控 shell 命令。 - 選擇
+ Add new hook…
並輸入以下命令:
jq -r '"COMMAND: \(.tool_input.command) | DESCRIPTION: \(.tool_input.description // "None")"' >> ~/.claude/bash-command-log.txt
這個命令會從傳入的 JSON 資料中提取 command
和 description
欄位,並將其格式化後寫入日誌檔。
核心概念
Hook 事件生命週期
Hooks 可以在 Claude Code 生命週期的多個時間點觸發。以下是主要的事件類型:
事件名稱 | 觸發時機 | 常見用途 | 可阻止操作 |
---|---|---|---|
UserPromptSubmit |
使用者提交提示後,Claude 處理之前 | 驗證提示、根據提示內容注入額外上下文 | ✅ 是 |
PreToolUse |
在工具(如 Bash )被執行之前 |
阻止危險命令、記錄意圖、修改命令 | ✅ 是 |
PostToolUse |
在工具執行之後 | 記錄執行結果、基於結果觸發下一步 | ❌ 否 |
Notification |
當需要發送通知時 | 自訂通知方式、聲音提醒 | ❌ 否 |
Stop |
當 Claude 完成任務或遇到錯誤時 | 清理工作、後續處理 | ✅ 是 |
SubagentStop |
當子代理(Task 工具)完成時 | 針對子任務的後續處理 | ✅ 是 |
PreCompact |
在 Claude 執行上下文壓縮之前 | 根據壓縮類型執行不同操作、備份重要上下文 | ❌ 否 |
Hook 的輸入 (stdin)
每個 Hook 在執行時,都會透過標準輸入(stdin
)接收一個包含上下文資訊的 JSON 物件。您可以使用 jq
或其他工具來解析它。
通用欄位
{
"session_id": "string",
"transcript_path": "string", // 對話記錄檔路徑
"cwd": "string", // Hook 被調用時的當前工作目錄
"hook_event_name": "string" // 觸發的 Hook 事件名稱
}
PreToolUse 的輸入範例
{
"session_id": "abc123",
"transcript_path": "~/.claude/projects/.../session.jsonl",
"cwd": "/path/to/project",
"hook_event_name": "PreToolUse",
"tool_name": "Bash",
"tool_input": {
"command": "ls -a",
"description": "List all files, including hidden ones."
}
}
實用範例庫
這裡有一些可以直接使用的範例,幫助您快速提升效率。
1. 程式碼自動格式化
TypeScript/JavaScript (Prettier)
在 Claude 每次修改完檔案後,自動執行 Prettier 格式化。
設定:
- 事件:
PostToolUse
- 匹配器:
Edit|MultiEdit|Write
- Hook 命令:
# 檢查是否為 JS/TS 檔案並執行 prettier
file_path=$(jq -r '.tool_input.file_path // ""')
if [[ "$file_path" =~ \.(js|jsx|ts|tsx)$ ]] && [[ -f "$file_path" ]] && [[ -f "package.json" ]]; then
npx --no-install prettier --write "$file_path"
echo "✨ 已自動格式化檔案: $file_path"
fi
2. 安全防護範例
防止危險命令執行
阻止 Claude 執行可能危險的命令。
command=$(jq -r '.tool_input.command // ""')
# 檢查危險命令模式
dangerous_patterns=("rm -rf" "sudo rm" "dd if=" "mkfs" "fdisk" "> /dev/")
for pattern in "${dangerous_patterns[@]}"; do
if [[ "$command" == *"$pattern"* ]]; then
# 使用退出碼 2 來阻擋操作,並將 stderr 的內容傳遞給 Claude
echo "🚫 安全警告: 已阻止潛在危險命令: $command" >&2
echo "💡 建議: 請使用更安全的替代方案或明確指定檔案" >&2
exit 2
fi
done
echo "✅ 命令安全檢查通過: $command"
Hook 執行細節
執行環境與限制
- 執行超時: 預設 60 秒執行限制,可針對個別命令設定
timeout
參數 - 並行執行: 所有匹配的 Hooks 會並行執行
- 執行環境: 在當前目錄中執行,使用 Claude Code 的環境變數
- 輸入方式: 透過 stdin 接收 JSON 資料
常見工具匹配器
以下是可以在 PreToolUse
和 PostToolUse
中使用的常見工具名稱:
Task
代理任務
Bash
Shell 命令
Glob
檔案模式匹配
Grep
內容搜尋
Read
檔案讀取
Edit, MultiEdit
檔案編輯
Write
檔案寫入
WebFetch, WebSearch
網路操作
安全考量
免責聲明
風險自負: Claude Code Hooks 會在您的系統上自動執行任意 shell 命令。使用 Hooks 表示您確認:
- 您對配置的命令承擔全部責任
- Hooks 可以修改、刪除或存取您的使用者帳戶能存取的任何檔案
- 惡意或編寫不當的 Hooks 可能導致資料遺失或系統損害
- Anthropic 不提供任何保證,並且不對 Hook 使用導致的任何損害承擔責任
- 您應該在生產環境使用前,在安全環境中徹底測試 Hooks
在添加到您的配置之前,請務必審查並理解任何 Hook 命令。
重要安全原則
- 最小權限原則: 只授予 Hook 完成任務所需的最小權限
- 輸入驗證: 始終驗證來自 Claude 的輸入資料
- 避免命令注入: 如果使用來自 Claude 的資料建構命令,請正確轉義
- 定期審查: 定期檢查您的 Hook 設定和執行日誌
- 使用絕對路徑: 在腳本中盡量使用絕對路徑指定命令,避免 PATH 被劫持
- 避開敏感檔案: 設定規則以跳過
.env
,.git/
, SSH 金鑰等檔案
疑難排解
基本除錯步驟
如果您的 Hooks 無法正常運作,請依序檢查:
- 檢查配置 - 執行
/hooks
查看您的 Hook 是否已註冊 - 驗證語法 - 確保 JSON 設定有效
- 測試命令 - 先手動執行 Hook 命令
- 檢查權限 - 確保腳本檔案具有執行權限
- 查看日誌 - 使用
claude --debug
查看詳細的 Hook 執行資訊
啟用詳細日誌
使用 --debug
標誌啟動 Claude Code 以查看詳細的日誌輸出:
claude --debug
最佳實踐總結
✅ 推薦做法
- 從簡單開始: 先實作基本的日誌記錄,再逐步加入複雜功能
- 分層設定: 通用規則放在使用者設定,專案特定規則放在專案設定
- 充分測試: 在安全環境中測試所有 Hook 再部署到生產環境
- 詳細註釋: 在設定檔中為每個 Hook 添加說明註釋
- 定期維護: 定期檢查和更新 Hook 設定,移除不需要的規則
❌ 避免事項
- 過度複雜化: 避免在單一 Hook 中包含過多邏輯
- 忽略錯誤處理: 確保 Hook 能夠妥善處理異常情況
- 硬編碼路徑: 使用相對路徑或環境變數而非絕對路徑
- 忽略效能: 避免在 Hook 中執行耗時操作
- 盲目信任: 不要無條件信任來自外部的 Hook 設定
結語
Claude Code Hooks 是一個強大的自動化工具,能夠顯著提升您的開發效率和程式碼品質。透過合理的設定和使用,您可以:
自動化重複性任務
格式化程式碼、執行測試、產生文件
增強安全性
防止危險操作、保護敏感檔案
提升可見度
記錄操作歷史、監控系統狀態
優化工作流程
整合現有工具鏈、自訂通知機制
記住,Hooks 的真正價值在於讓您專注於創造性的工作,而將重複性的、規則化的任務交給自動化系統處理。
開始您的 Claude Code Hooks 之旅,讓 AI 助手成為您開發團隊中最可靠的成員!