Claude Code hooks リファレンス
hook を書くときに必要な情報を 1 ページにまとめました。全イベントの一覧と各 matcher が受け付ける値、
すべての hook が標準入力で受け取る項目、settings.json と statusLine の形、終了コードの意味です。
最後の節では、AgentManager がこれらのイベントから導出するセッションごとの状態ファイルを、
自分のスクリプトから読みたい人向けに説明します。設定を手書きせず生成したい場合は
hooks ビルダーを使ってください。
- hook イベント一覧
- すべての hook が標準入力で受け取る項目
- settings.json のスキーマ
- statusLine のスキーマと標準入力
- 終了コード
- AgentManager のセッション状態ファイル
hook イベント一覧
Claude Code は現在 33 種の hook イベントを定義しています。3 列目は、そのイベントで matcher が何を対象に絞り込むかと、値の例です。
「—」のイベントは matcher を無視して常に発火します。| で区切った素の名前は完全一致、
正規表現の記号を含む場合は JavaScript の正規表現として扱われます。空の matcher は全件に一致します。
| イベント | 発火するタイミング | matcher の対象 |
|---|---|---|
| セッションのライフサイクル | ||
SessionStart | セッションが開始・再開した | 開始の種類 startup|resume|clear|compact|fork |
Setup | --init / --maintenance のセットアップ時 | セットアップの種類 init|maintenance |
UserPromptSubmit | プロンプトを送信した(Claude が読む前) | — |
UserPromptExpansion | スラッシュコマンドがプロンプトに展開された | — |
Stop | メインエージェントの応答が終わった | — |
StopFailure | API エラーでターンが止まった | エラーの種類 rate_limit|overloaded|authentication_failed|billing_error|max_output_tokens|unknown |
Notification | 確認が必要になった(許可待ち・放置…) | 通知の種類 permission_prompt|idle_prompt|elicitation_dialog|agent_needs_input |
SessionEnd | セッションが終了した | 終了理由 clear|resume|logout|prompt_input_exit|other |
| ツールと許可 | ||
PreToolUse | ツール実行の直前(ブロック可能) | ツール名 Bash|Edit|Write|mcp__.* |
PermissionRequest | ツール実行に許可の判断が必要になった | ツール名 Bash|Edit|Write |
PermissionDenied | 自動モードがツール実行を拒否した | ツール名 Bash|Edit|Write |
PostToolUse | ツール実行が成功した後 | ツール名 Bash|Edit|Write|mcp__.* |
PostToolUseFailure | ツール実行が失敗した後 | ツール名 Bash|Edit|Write |
PostToolBatch | 並列ツール呼び出しの一括分がすべて終わった | — |
MessageDisplay | アシスタントのメッセージが表示された | — |
| サブエージェントとタスク | ||
SubagentStart | サブエージェントが起動した | エージェント種別 general-purpose|Explore|Plan |
SubagentStop | サブエージェントが終了した | エージェント種別 general-purpose|Explore|Plan |
TaskCreated | タスクが作成された | — |
TaskCompleted | タスクが完了になった | — |
TeammateIdle | エージェントチームのメンバーが待機に入る直前 | — |
| コンテキスト・設定・モデル | ||
PreCompact | コンテキスト圧縮の直前 | トリガー manual|auto |
PostCompact | コンテキスト圧縮の完了後 | トリガー manual|auto |
InstructionsLoaded | CLAUDE.md やルールファイルが読み込まれた | 読み込み理由 session_start|nested_traversal|path_glob_match|include|compact |
ConfigChange | セッション中に設定ファイルが変わった | 設定の種類 user_settings|project_settings|local_settings|policy_settings|skills |
PreModelSwitch | モデル切り替えの直前(ブロック可能) | 切り替え先モデル .*opus.* |
PostModelSwitch | モデルが切り替わった後 | 切り替え先モデル .*opus.* |
Elicitation | MCP サーバーが入力を求めた | MCP サーバー名 my-server |
ElicitationResult | MCP サーバーの入力要求に応答した | MCP サーバー名 my-server |
| ワークスペース | ||
CwdChanged | 作業ディレクトリが変わった | — |
DirectoryAdded | /add-dir でディレクトリが追加された | 追加方法 slash_command|register_repo_root |
FileChanged | 監視中のファイルが変更された | ファイル名(正規表現ではなく | 区切り) .envrc|.env |
WorktreeCreate | git worktree が作成される | — |
WorktreeRemove | git worktree が削除される | — |
StopFailure や PostCompact のような
新しいイベントを追加する前に claude --version を確認してください。
すべての hook が標準入力で受け取る項目
各 hook コマンドは標準入力から JSON オブジェクトを 1 つ受け取ります。次の項目は全イベント共通で、イベントごとに固有の項目が加わります
(例: ツール系イベントの tool_name と tool_input、Notification の notification_type、
StopFailure の error_type、SessionEnd の reason)。
| 項目 | 意味 |
|---|---|
session_id | Claude Code セッションの固定 ID。永続化するものはこれをキーにします。 |
hook_event_name | 上の表のイベント名。1 つのスクリプトで複数イベントを扱うときはこれで分岐します。 |
cwd | hook 発火時点のセッションの作業ディレクトリ。 |
transcript_path | セッションの JSONL トランスクリプトのパス。 |
prompt_id | 現在のターンが属するユーザープロンプトの ID。 |
scratchpad_dir | セッション専用の一時ディレクトリ。 |
permission_mode | 現在の許可モード(default・plan・acceptEdits・bypassPermissions など)。 |
effort | 現在の推論の努力量の設定。 |
agent_id・agent_type | サブエージェント内で発火した場合に付きます。メインエージェントでは付きません。 |
settings.json のスキーマ
hook はトップレベルの hooks キーの下に置きます。置き場所は ~/.claude/settings.json(ユーザー)、
.claude/settings.json(プロジェクト・コミット対象)、.claude/settings.local.json(プロジェクト・git 管理外)のいずれかです。
ファイルはマージされ、複数ファイルに定義した hook はそれぞれから実行されます。
{
"hooks": {
"<イベント名>": [
{
"matcher": "<任意の絞り込み>",
"hooks": [
{ "type": "command", "command": "<シェルコマンド>", "timeout": 600 }
]
}
]
}
}
| キー | 意味 |
|---|---|
matcher | 任意。イベント表の値で絞り込みます。省略または空なら全件に一致します。 |
hooks[].type | command はシェルコマンドを実行します。他のハンドラ種別(http・mcp_tool・prompt・agent)もありますが、このページとビルダーは command を扱います。 |
hooks[].command | あなたのユーザー環境で実行されるシェルコマンド。$HOME などの変数は展開されます。 |
hooks[].timeout | hook を打ち切るまでの秒数。既定は 600。UserPromptSubmit・PreModelSwitch・PostModelSwitch は 30、MessageDisplay は 10。SessionEnd の hook は全体で 1.5 秒を共有します。 |
statusLine のスキーマと標準入力
ステータス行は別のトップレベルキーで、枠は 1 つだけです。そのコマンドはアシスタントの応答のたびに実行され、 hook には渡らないデータ(コンテキストウィンドウの使用量と利用上限の状態)を受け取ります。
{
"statusLine": {
"type": "command",
"command": "<シェルコマンド>",
"padding": 0,
"refreshInterval": 5,
"hideVimModeIndicator": false
}
}
| 標準入力の項目 | 意味 |
|---|---|
session_id・version | セッション ID と Claude Code のバージョン。 |
model.id・model.display_name | 現在使用中のモデル。 |
workspace.* | 現在のディレクトリとプロジェクトディレクトリ。 |
cost.* | セッションの累積コストと経過時間のカウンタ。 |
context_window.used_percentage | コンテキストウィンドウの使用率。ほかに remaining_percentage・total_input_tokens・context_window_size・current_usage。 |
rate_limits.five_hour・rate_limits.seven_day | それぞれ used_percentage と resets_at(エポック秒)を持ちます。 |
終了コード
| 終了コード | 効果 |
|---|---|
0 | 成功。標準出力は verbose モードで表示され、構造化出力を受け付けるイベントでは JSON として解釈されます。 |
2 | ブロック対応イベント(PreToolUse・UserPromptSubmit・PermissionRequest・PreModelSwitch・Stop・SubagentStop など)で動作を止めます。標準エラー出力が理由として Claude に渡されます。 |
| その他 | 非ブロックのエラー。標準エラー出力があなたに表示され、動作は続行されます。 |
AgentManager のセッション状態ファイル
AgentManager の hook は上のイベントをセッションごとに 1 つの JSON ファイルへ集約し、
~/.claude/agent-manager/sessions/<session_id>.json に書きます。イベントのたびにその場で上書きされるため、
読み取り側でパースに失敗したら壊れたと判断せず読み直してください。導出ルールは
hook で Claude Code のセッション状態を追跡するで説明しています。
| 項目 | 型 | 意味 |
|---|---|---|
session_id | string | Claude Code のセッション ID。ファイル名と同じです。 |
state | string | waiting・done・processing・idle・error のいずれか。 |
waiting_kind | string | null | 待機の理由。approval(許可の確認)、plan(計画の承認)、choice(回答待ちの質問)。state が waiting 以外なら null。 |
error_reason | string | null | state が error のときの StopFailure のエラー種別。rate_limit・overloaded・authentication_failed・billing_error・max_output_tokens・unknown。 |
cwd | string | 直近のイベントが報告した作業ディレクトリ。 |
label | string | アプリに表示する名前。cwd の末尾のパス要素です。 |
host_bundle_id・host_bundle_chain | string | null, array | セッションを動かしているターミナルアプリのバンドル ID と、それを特定するのに使ったプロセスの親子関係。 |
iterm_session_id・tmux_pane_id | string | null | セッションをクリックしたときに該当ペインをフォーカスするための識別子。 |
owner_pid・owner_started_at | int, string | claude プロセスの PID と起動時刻。両方を突き合わせて、PID が再利用された死んだセッションを検出します。 |
created_at・updated_at・state_since | ISO 8601 string | ファイルの初回書き込み時刻、最終書き込み時刻、state が最後に変わった時刻。 |
active_subagent_ids・subagent_seen_ids | array of string | 現在実行中のサブエージェントと、このセッションで観測した全サブエージェント。 |
main_stopped・main_waiting | bool | 内部フラグ。メインエージェントが Stop を出したか、メインエージェントが入力待ちで止まっているか。 |
agent_input_pending_ids | array of string | agent_needs_input を出してまだ回答されていないサブエージェント。 |
もう 1 つのファイル ~/.claude/agent-manager/stats/<session_id>.json は statusLine の
パススルーが書きます。ステータス行の標準入力にある context_window・rate_limits・model を
そのまま持ち、PreCompact が発火したときはその印も持ちます。インストール前に設定していたステータス行のコマンドは
~/.claude/agent-manager/statusline-original.json に保存され、引き続き実行されます。
スクリプトは書かず、状態だけ手に入れる
AgentManager は hook とステータス行のパススルーをインストールし、必要なイベントを登録して、 すべての Claude Code セッションをライブのボードに表示します。無料で使え、アカウント登録は不要です。