Skip to content

🌐 English

Hooks のライフサイクル

IMPORTANT

→ Why: Hallucination 対策(テスト実行 Hook で機械的に検出) → Why: Sycophancy 対策(コンパイラ・テストランナーは追従しない) → Why: Instruction Decay 対策(コンテキストに依存しない強制実行)

Hooks とは

Hooks は Claude Code のライフサイクルイベントにフックして実行されるコンテキスト外の処理。LLM のコンテキストウィンドウを消費しない。

属性
注入タイミングコンテキストに注入されない
コンテキスト消費なし(Prompt Hook を除く)
実行場所Claude Code ランタイム(シェル / HTTP)
定義場所settings.json 内の hooks キー

なぜ存在するのか

LLM に「毎回 eslint を実行しろ」と指示すると、

  1. コンテキストウィンドウを消費する
  2. Instruction Decay で忘れることがある
  3. Sycophancy で「問題ない」と判断をスキップする可能性がある

Hooks はランタイムレベルで強制実行するため、これらの問題を全て回避する。

ライフサイクルフロー

TIP

3層構造: セッション層(SessionStartSessionEnd)がエージェントループ層を囲み、非同期イベント層がループと並行して発火する。

イベント一覧

セッションライフサイクル

イベント発火タイミング主な用途
SessionStartセッション開始・再開時環境チェック、ログ初期化
SessionEndセッション終了時クリーンアップ処理
UserPromptSubmitユーザー入力送信時入力バリデーション、コンテキスト追加
Stopレスポンス完了時続行判定、品質ゲート
StopFailureAPIエラーによる終了時エラーログ、アラート送信

ツール実行

イベント発火タイミング主な用途
PreToolUseツール実行前危険なコマンドのブロック
PermissionRequest権限ダイアログ表示時権限の自動承認/拒否
PostToolUseツール成功後自動フォーマット、lint 実行
PostToolUseFailureツール失敗後エラーログ、リトライ判定

サブエージェント・タスク

イベント発火タイミング主な用途
SubagentStartサブエージェント生成時エージェントへのコンテキスト注入
SubagentStopサブエージェント完了時結果の検証、続行判定
TaskCreatedタスク作成時命名規則の強制、タスク検証
TaskCompletedタスク完了時完了条件の検証
TeammateIdleチームメイト待機前品質ゲート、リソース検証

設定・環境変更

イベント発火タイミング主な用途
InstructionsLoadedCLAUDE.md / rules 読込時監査ログ、コンプライアンス追跡
ConfigChange設定ファイル変更時セキュリティ監査、ポリシー強制
CwdChanged作業ディレクトリ変更時環境変数管理(direnv 等)
FileChanged監視ファイル変更時ファイル変更トリガーの自動化
Notification通知発生時デスクトップ通知

コンテキスト管理

イベント発火タイミング主な用途
PreCompactコンテキスト圧縮前圧縮前の検証
PostCompactコンテキスト圧縮後圧縮後の検証

ワークツリー・MCP

イベント発火タイミング主な用途
WorktreeCreateワークツリー作成時Git 動作の置き換え
WorktreeRemoveワークツリー削除時クリーンアップ処理
ElicitationMCP 入力リクエスト時ユーザー入力の自動化
ElicitationResultMCP 入力応答時応答データの検証・修正

NOTE

イベントの詳細(JSON 入出力スキーマ、matcher の仕様、非同期 Hook 等)は公式リファレンスを参照: Hooks reference | Hooks guide

Hook の種類

Command Hook(最も一般的)

jsonc
{
  "hooks": {
    "PostToolUse": [
      {
        "type": "command",
        "command": "npx prettier --write $CLAUDE_FILE_PATH",
        "matcher": {
          "toolName": "edit_file",
          "pathPattern": "**/*.ts",
        },
        "timeout": 10000,
      },
    ],
  },
}

Prompt Hook(唯一コンテキストに影響する)

jsonc
{
  "hooks": {
    "UserPromptSubmit": [
      {
        "type": "prompt",
        "prompt": "必ず変更前にgit stashしてください",
      },
    ],
  },
}

HTTP Hook(外部サービス連携)

jsonc
{
  "hooks": {
    "PostToolUse": [
      {
        "type": "http",
        "url": "https://my-service.com/webhook",
        "matcher": { "toolName": "execute_command" },
      },
    ],
  },
}

Agent Hook(マルチターン検証)

ファイルの読み取りやコマンド実行が必要な検証に使用。サブエージェントを起動し、最大50ターンのツール使用で条件を確認する。

jsonc
{
  "hooks": {
    "Stop": [
      {
        "type": "agent",
        "prompt": "全てのユニットテストが通るか検証してください。テストスイートを実行し結果を確認してください。",
        "timeout": 120,
      },
    ],
  },
}

Exit Code の意味

Exit Code意味
0操作を許可(そのまま続行。stdout をコンテキストに追加可)
2操作をブロック(stderr の内容を Claude にフィードバック)
その他操作は続行。stderr はログに記録されるが Claude には非表示

前へ: settings.json の役割

次へ: なぜLLMに見せないのか

Released under the CC BY 4.0 License.