Hooks とは
Hooksがどのように動くのか
Hooksとは、Tool実行の前後に特定のコマンドを動かす設定できるファイルのことを指す
ファイル編集後にフォーマットしたり、変更されたファイルでテストを実行することができる
code:mermaid
sequenceDiagram
participant You as あなた
participant CA as Cording Assitant
participant LM as Lauguage Model
participant T as Tool
You->>CA: main.tsファイルの概要をおしえてください
CA->>LM: main.tsファイルにはどんなコードが書いてありますか?<br/>ファイルを読みたい場合は「ReadFile: ファイル名」と返答してください
LM-->>CA: ReadFile: main.ts
CA->>CA: 🚀🚀🚀 PreToolUse Hooks開始 🚀🚀🚀
CA->>T: main.tsの中身を教えてください
T-->>CA: main.tsのファイル本文
CA->>CA: 🚀🚀🚀 PostToolUse Hooks開始 🚀🚀🚀
CA->>LM: main.tsのファイル本文
LM-->>You: main.tsの中身の概要を解説
Hooksには二つの役割がある
PreToolUse Hooks: ツールが呼び出される前に実行する
PostToolUse Hooks: ツールが呼びされた後に実行する
Hooksの設定
Hooksの設定ファイルはsettings.jsonで設定する
グローバルの場合:~/.claude/settings.json
プロジェクト: .claude/settings.json
個人設定(コミットしない): .claude/settings.local.json
構造としてはPreToolUse・PostToolUseセクションで構造されている
code:settings.json
{
"hooks": {
"PreToolUse": [
{
"matcher": "Read",
"hooks": [
{
"type": "command",
"command": "node /home/hooks/read_hook.ts"
}
]
},
],
"PostToolUse": [
{
"matcher": "Write|Edit|MultiEdit",
"hooks": [
{
"type": "command",
"command": "node /home/hooks/edit_hook.ts"
}
]
}
]
}
実際の処理をするコマンドは/hooksディレクトリで管理する
PreToolUse Hooks
ツールが実行される前にHooksが実行される。
matcher側でどのツールで使用するかを指定する
code:settings.json
"PreToolUse": [
{
"matcher": "Read",
"hooks": [
{
"type": "command",
"command": "node /home/hooks/read_hook.ts"
}
]
}
]
PostToolUse Hooks
ツールが実行された後にHooksが実行される。
code:settings.json
"PostToolUse": [
{
"matcher": "Write|Edit|MultiEdit",
"hooks": [
{
"type": "command",
"command": "node /home/hooks/edit_hook.ts"
}
]
}
]
実用的な使い方
コードフォーマット
ファイルが編集された後にフォーマットする
テスト
ファイルが変更されたとき、自動でテストを実行できる
アクセス制御
特定のファイルや読み取り・編集をブロックする
コード品質
静的解析や型チェックを実行できる
ログ記録
クロードがアクセスしたファイルを追跡する
検証
命名規則やコーディング規約を元に検証する
他の便利なHooks
PreToolUseやPostToolUse以外にも、便利なHooksはある
Notification
Claude Code側から通知を送信する時に使用される
Ex)ツールへのアクセス制限を要求した時・プロンプトの入力がなく60秒間経過した場合
Stop
Claude Codeの処理が終了したとき
SubagentStop
サブエージェントの処理が終わった時に実行される(UI上ではタスクとして表示される)
PreCompact
手動・自動で/compactコマンドを実行したとき
デバッグ方法
Hookによって標準入出力される値は変わってくる。標準入出力を確認したい場合は、以下のコマンドを登録して外部ファイルに出力させて対応させる
code:json
"PostToolUse": [ // Or "PreToolUse" or "Stop", etc
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "jq . > post-log.json"
}
]
},
]
code:post-log.json
{
"session_id": "9ecf22fa-edf8-4332-ae85-b6d5456eda64",
"transcript_path": "<path_to_transcript>",
"hook_event_name": "PostToolUse",
"tool_name": "TodoWrite",
"tool_input": {
"todos": "content": "write a readme", "status": "pending", "priority": "medium", "id": "1" }
},
"tool_response": {
"oldTodos": [],
"newTodos": "content": "write a readme", "status": "pending", "priority": "medium", "id": "1" }
}
}