827 827
828フックの終了コードは、ツール呼び出しやプロンプトなど、フックをトリガーしたアクションを続行するかどうかを Claude Code に伝えます。完了した実行の結果は次の 3 つのいずれかです。828フックの終了コードは、ツール呼び出しやプロンプトなど、フックをトリガーしたアクションを続行するかどうかを Claude Code に伝えます。完了した実行の結果は次の 3 つのいずれかです。
829 829
830* **成功**: フックが 0 で終了します。Claude Code はフックが出力した [JSON 出力](#json-output)フィールドを適用し、それらのフィールドがアクションをブロックまたは拒否しない限り、アクションは進行します。830* **成功**: フックが 0 で終了します。Claude Code はフックが出力した [JSON 出力](#json-output)フィールドを適用し、それらのフィールドがアクションをブロックまたは拒否しない限り、アクションは進行します。例外については[バックグラウンド プロセスを開始するフック](#hooks-that-start-a-background-process)を参照してください。
831* **ブロッキング エラー**: フックが 2 で終了します。[ブロック可能なイベント](#exit-code-2-behavior-per-event)では、Claude Code はアクションを停止します。831* **ブロッキング エラー**: フックが 2 で終了します。[ブロック可能なイベント](#exit-code-2-behavior-per-event)では、Claude Code はアクションを停止します。
832* **非ブロッキング エラー**: フックがその他のコードで終了するか、起動しない、無効な JSON を出力するなど、その他の方法で失敗します。アクションは進行し、`PreToolUse` などのイベントではトランスクリプトに `<hook name> hook error` 通知が表示されます。失敗したフックでアクションをブロックしたい場合は、[`onFailure: "block"`](#block-the-action-when-a-hook-fails) を設定してください。832* **非ブロッキング エラー**: フックがその他のコードで終了するか、起動しない、無効な JSON を出力するなど、その他の方法で失敗します。アクションは進行し、`PreToolUse` などのイベントではトランスクリプトに `<hook name> hook error` 通知が表示されます。失敗したフックでアクションをブロックしたい場合は、[`onFailure: "block"`](#block-the-action-when-a-hook-fails) を設定してください。
833 833
932* タイムアウトした `command`、`http`、または `mcp_tool` フックはツール呼び出しをブロックしません。呼び出しは通常の[権限フロー](/docs/ja/permissions)を通じて続行されるため、停止したフックがゲートとして機能することを当てにしないでください。`command` または `http` フックがタイムアウトしたときに呼び出しをブロックするには、[`onFailure: "block"`](#block-the-action-when-a-hook-fails) を設定してください。932* タイムアウトした `command`、`http`、または `mcp_tool` フックはツール呼び出しをブロックしません。呼び出しは通常の[権限フロー](/docs/ja/permissions)を通じて続行されるため、停止したフックがゲートとして機能することを当てにしないでください。`command` または `http` フックがタイムアウトしたときに呼び出しをブロックするには、[`onFailure: "block"`](#block-the-action-when-a-hook-fails) を設定してください。
933* タイムアウトを超えた [Agent SDK コールバック フック](/docs/ja/agent-sdk/hooks)は[ツール呼び出しをブロックします](#pretooluse)。933* タイムアウトを超えた [Agent SDK コールバック フック](/docs/ja/agent-sdk/hooks)は[ツール呼び出しをブロックします](#pretooluse)。
934 934
935<h4 id="hooks-that-start-a-background-process">
936 バックグラウンド プロセスを開始するフック
937</h4>
938
939コマンド フックがバックグラウンド プロセスで決定を行ってから終了する場合、Claude Code が読み取りを停止した後にそのプロセスが出力した deny はツール呼び出しをブロックしません。[非同期](#run-hooks-in-the-background)でないフックの場合、Claude Code はフック自身のプロセスが終了した直後にフックの出力の読み取りを終えます。
940
941バックグラウンド プロセスを開始する前に決定を出力し、そのプロセスの stdout と stderr をリダイレクトしてください。スクリプトが allow を出力した後、そのプロセスの stdout と stderr をリダイレクトせずにバックグラウンド プロセスを開始した場合、Claude Code はツール呼び出しをブロックします。フック エラーには `refusing to honor the suspect capture` が含まれます。
942
943この `PreToolUse` フック スクリプトは `policy-check.sh` で決定を出力し、その後バックグラウンドでメトリクスをアップロードします。
944
945```bash theme={null}
946#!/bin/bash
947"$CLAUDE_PROJECT_DIR"/.claude/hooks/policy-check.sh || exit $?
948"$CLAUDE_PROJECT_DIR"/.claude/hooks/upload-metrics.sh >/dev/null 2>&1 &
949```
950
951スクリプトの残りの部分は次の処理を行います。
952
953* **`|| exit $?`**: チェックの終了コードをフック自身の終了コードにします。これにより、拒否のために 2 で終了するチェックは引き続きブロックします。これがない場合、フックは最後の行の終了コード(0)で終了します。
954* **`>/dev/null 2>&1 &`**: 出力をリダイレクトした状態で `upload-metrics.sh` をバックグラウンドで実行するため、フックの出力が開いたままになりません。
955
956スクリプトをテストするには、`policy-check.sh` が 2 で終了するようにしてから、フックが一致するツール呼び出しをトリガーします。ツール呼び出しはブロックされます。
957
935<h4 id="block-the-action-when-a-hook-fails">958<h4 id="block-the-action-when-a-hook-fails">
936 フックが失敗したときにアクションをブロックする959 フックが失敗したときにアクションをブロックする
937</h4>960</h4>
1245 フックイベント1268 フックイベント
1246</h2>1269</h2>
1247 1270
1248各イベントは、Claude Code のライフサイクルにおいてフックを実行できるポイントに対応しています。以下のセクションはライフサイクルの順序に沿って並んでおり、セッションのセットアップからエージェント型ループを経てセッション終了までを扱います。各セクションでは、イベントが発火するタイミング、サポートされる matcher、受け取る JSON 入力、出力による動作の制御方法を説明します。1271各イベントは、フックを実行できる Claude Code のライフサイクル上のポイントに対応しています。以下のセクションは、セッションのセットアップからエージェント型ループを経てセッション終了まで、ライフサイクルに沿った順序で並んでいます。各セクションでは、イベントが発火するタイミング、サポートされる matcher、受け取る JSON 入力、出力による動作の制御方法を説明します。
1249 1272
1250<h3 id="sessionstart">1273<h3 id="sessionstart">
1251 SessionStart1274 SessionStart
1252</h3>1275</h3>
1253 1276
1254Claude Code が新しいセッションを開始したとき、または既存のセッションを再開したときに実行されます。既存の issue やコードベースへの最近の変更などの開発コンテキストを読み込んだり、環境変数を設定したりするのに便利です。スクリプトを必要としない静的なコンテキストには、代わりに [CLAUDE.md](/docs/ja/memory) を使用してください。1277Claude Code が新しいセッションを開始するとき、または既存のセッションを再開するときに実行されます。既存の issue やコードベースへの最近の変更などの開発コンテキストの読み込みや、環境変数の設定に便利です。スクリプトを必要としない静的なコンテキストには、代わりに [CLAUDE.md](/docs/ja/memory) を使用してください。
1255 1278
1256SessionStart はすべてのセッションで実行されるため、これらのフックは高速に保ってください。サポートされるのは `type: "command"` と `type: "mcp_tool"` のフックのみです。`mcp_tool` フックが実行されるタイミングについては、[MCP ツールフックのフィールド](#mcp-tool-hook-fields)を参照してください。1279SessionStart はすべてのセッションで実行されるため、これらのフックは高速に保ってください。`type: "command"` と `type: "mcp_tool"` のフックのみがサポートされます。`mcp_tool` フックが実行されるタイミングについては、[MCP ツールフックのフィールド](#mcp-tool-hook-fields)を参照してください。
1257 1280
1258matcher の値は、セッションがどのように開始されたかに対応します。1281matcher の値は、セッションがどのように開始されたかに対応します:
1259 1282
1260| Matcher | 発火するタイミング |1283| Matcher | 発火するタイミング |
1261| :- | :- |1284| :- | :- |
1263| `resume` | `--resume`、`--continue`、または `/resume` |1286| `resume` | `--resume`、`--continue`、または `/resume` |
1264| `clear` | `/clear` |1287| `clear` | `/clear` |
1265| `compact` | 自動または手動のコンテキスト圧縮 |1288| `compact` | 自動または手動のコンテキスト圧縮 |
1266| `fork` | 既存のセッションからフォークされた新しいセッション:`--resume` または `--continue` と組み合わせた `--fork-session`、`/fork` によるバックグラウンドコピー、`/branch`、または[バックグラウンドに移動](/docs/ja/agent-view#from-inside-a-session)した会話 |1289| `fork` | 既存のセッションからフォークされた新しいセッション。`--resume` または `--continue` と併用した `--fork-session`、`/fork` によるバックグラウンドコピー、`/branch`、または[バックグラウンドに移動](/docs/ja/agent-view#from-inside-a-session)した会話 |
1267 1290
1268v2.1.214 より前は、フォークされたセッションはソースとして `"resume"` を報告していました。1291v2.1.214 より前は、フォークされたセッションはソース `"resume"` を報告していました。
1269 1292
1270対話セッションを開始したとき、起動時に `--continue` や `--resume` で会話を再開したとき、または `/clear` を実行したとき、SessionStart フックはバックグラウンドで実行されます。すぐに入力を始めることができ、再開した会話はフックを待たずに表示されます。ただし、Claude の最初の応答はフックの完了を待つため、フックのコンテキストは Claude に届きます。1293対話セッションを開始したとき、起動時に `--continue` または `--resume` で会話を再開したとき、または `/clear` を実行したとき、SessionStart フックはバックグラウンドで実行されます。すぐに入力を始めることができ、再開した会話はフックを待たずに表示されます。ただし、Claude の最初の応答はフックの完了を待つため、フックのコンテキストは Claude に届きます。
1271 1294
1272セッション内で `/resume` を使って会話を切り替える場合は、代わりに切り替えがフックの完了を待ちます。バックグラウンドのフックがまだ実行中に `/clear` を実行するか別の会話に切り替えた場合、フックが返す内容はセッションに一切適用されません。1295セッション内で `/resume` を使って会話を切り替える場合は、代わりに切り替えがフックの完了を待ちます。バックグラウンドのフックがまだ実行中に `/clear` を実行したり別の会話に切り替えたりすると、フックが返すものはセッションに一切適用されません。
1273 1296
1274再開したセッションを含め、起動時にも同じ待機が適用されます。SessionStart フックがまだ実行中に送信したプロンプトは、フックが完了するまで Claude に届きません。1297同じ待機は起動時にも適用され、再開したセッションも含まれます。SessionStart フックがまだ実行中に送信したプロンプトは、フックが完了するまで Claude に届きません。
1275 1298
1276いずれの待機中も、`Esc` を押すとプロンプトを送信せずに入力欄に戻すことができます。フックは実行を続けます。1299いずれの待機中も、`Esc` を押すと、プロンプトを送信せずに入力欄に戻せます。フックは実行を続けます。
1277 1300
1278<h4 id="sessionstart-input">1301<h4 id="sessionstart-input">
1279 SessionStart の入力1302 SessionStart の入力
1280</h4>1303</h4>
1281 1304
1282[共通の入力フィールド](#common-input-fields)に加えて、SessionStart フックは `source` と、オプションで `model`、`agent_type`、`session_title` を受け取ります。1305[共通入力フィールド](#common-input-fields)に加えて、SessionStart フックは `source` と、オプションで `model`、`agent_type`、`session_title` を受け取ります:
1283 1306
1284| フィールド | 説明 |1307| フィールド | 説明 |
1285| :- | :- |1308| :- | :- |
1286| `source` | セッションの開始方法:新しいセッションの場合は `"startup"`、再開したセッションの場合は `"resume"`、`/clear` の後は `"clear"`、コンテキスト圧縮の後は `"compact"`、既存のセッションからフォークされた新しいセッションの場合は `"fork"` |1309| `source` | セッションの開始方法。新しいセッションでは `"startup"`、再開したセッションでは `"resume"`、`/clear` の後は `"clear"`、コンテキスト圧縮の後は `"compact"`、既存のセッションからフォークされた新しいセッションでは `"fork"` |
1287| `model` | アクティブなモデルの識別子。`/clear` の後や、会話の復旧によってセッションが復元された場合などに省略されることがあるため、読み取る前にフィールドの有無を確認してください |1310| `model` | アクティブなモデルの識別子。たとえば `/clear` の後や、会話の復旧によってセッションが復元された場合などには省略されることがあるため、読み取る前にフィールドの有無を確認してください |
1288| `agent_type` | エージェント名。`claude --agent <name>` で Claude Code を起動した場合に存在します |1311| `agent_type` | エージェント名。`claude --agent <name>` で Claude Code を起動した場合に存在します |
1289| `session_title` | セッションのカスタムタイトル。`--name`、`/rename`、フックの `sessionTitle` 出力、Agent SDK の `renameSession()` などで設定されている場合に存在します。`sessionTitle` を出力するフックは、まずこのフィールドを確認することで既存のカスタムタイトルの上書きを回避できます |1312| `session_title` | セッションのカスタムタイトル。`--name`、`/rename`、フックの `sessionTitle` 出力、Agent SDK の `renameSession()` などで設定されている場合に存在します。`sessionTitle` を出力するフックは、まずこのフィールドを確認することで、既存のカスタムタイトルの上書きを避けられます |
1290 1313
1291名前を付けていないセッションにも[生成されたタイトル](/docs/ja/sessions#name-your-sessions)が付いている場合があります。このタイトルはカスタムタイトルではないため、`session_title` には表示されません。1314名前を付けていないセッションにも[生成されたタイトル](/docs/ja/sessions#name-your-sessions)がある場合があります。そのタイトルはカスタムタイトルではなく、`session_title` には含まれません。
1292 1315
1293`source` が `"resume"` または `"fork"` で、トランスクリプトに Claude からの応答が少なくとも 1 つ含まれている場合、SessionStart フックは以下の 4 つのフィールドも受け取ります。フックはこれらを使って、古い会話を再開するコストを最初のリクエストの前に報告できます。たとえば [`systemMessage`](#json-output) で報告できます。これらのフィールドには Claude Code v2.1.251 以降が必要です。1316`source` が `"resume"` または `"fork"` で、トランスクリプトに Claude からの応答が少なくとも 1 つ含まれている場合、SessionStart フックは以下の 4 つのフィールドも受け取ります。フックはこれらを使って、古い会話を再開するコストを最初のリクエストの前に報告できます(たとえば [`systemMessage`](#json-output) で)。これらのフィールドには Claude Code v2.1.251 以降が必要です。
1294 1317
1295| フィールド | 説明 |1318| フィールド | 説明 |
1296| :- | :- |1319| :- | :- |
1297| `seconds_since_last_response` | 再開したトランスクリプト内の最後の応答からの経過時間(実時間の秒数) |1320| `seconds_since_last_response` | 再開したトランスクリプト内の最後の応答からの経過秒数(実時間) |
1298| `context_tokens` | 再開したセッションの最初のリクエストがプロンプトとして再送信するトークン数 |1321| `context_tokens` | 再開したセッションの最初のリクエストがプロンプトとして再送信するトークン数 |
1299| `prompt_cache_likely_expired` | 最後の応答がセッションの[プロンプトキャッシュの有効期間](/docs/ja/prompt-caching#cache-lifetime)より古い場合、またはその後のコンテキスト圧縮によってキャッシュされた会話が置き換えられた場合に `true` |1322| `prompt_cache_likely_expired` | 最後の応答がセッションの[プロンプトキャッシュの有効期間](/docs/ja/prompt-caching#cache-lifetime)より古い場合、またはその後のコンテキスト圧縮によってキャッシュされた会話が置き換えられた場合に `true` |
1300| `estimated_cache_write_usd` | セッションのモデルで `context_tokens` をプロンプトキャッシュに書き込む推定コスト(米ドル、応答を除く) |1323| `estimated_cache_write_usd` | セッションのモデルで `context_tokens` をプロンプトキャッシュに書き込む推定コスト(米ドル)。応答は含みません |
1301 1324
1302次の例は、最後の応答から 90 分後に再開したセッションの入力を示しています。1325この例は、最後の応答から 90 分後に再開されたセッションの入力を示しています:
1303 1326
1304```json theme={null}1327```json theme={null}
1305{1328{
1317```1340```
1318 1341
1319<h4 id="sessionstart-decision-control">1342<h4 id="sessionstart-decision-control">
1320 SessionStart の判定制御1343 SessionStart の決定制御
1321</h4>1344</h4>
1322 1345
1323SessionStart フックは、Claude へのコンテキストの追加、最初のユーザーメッセージの指定、セッションタイトルの設定、ファイルの監視、スキルの再読み込みを行えます。すべてのフックで利用できる [JSON 出力フィールド](#json-output)に加えて、それぞれに対応するフィールドを返してください。1346SessionStart フックは、Claude へのコンテキストの追加、最初のユーザーメッセージの提供、セッションタイトルの設定、ファイルの監視、スキルの再読み込みを行えます。すべてのフックで利用できる [JSON 出力フィールド](#json-output)に加えて、それぞれに対応するフィールドを返します:
1324 1347
1325| フィールド | 説明 |1348| フィールド | 説明 |
1326| :- | :- |1349| :- | :- |
1327| `additionalContext` | 会話の開始時、最初のプロンプトの前に Claude のコンテキストに追加される文字列。テキストがどのように渡されるか、何を含めるべきかについては [Claude にコンテキストを追加する](#add-context-for-claude)を参照してください |1350| `additionalContext` | 会話の開始時、最初のプロンプトの前に Claude のコンテキストに追加される文字列。テキストの配信方法と記述内容については、[Claude にコンテキストを追加する](#add-context-for-claude)を参照してください |
1328| `initialUserMessage` | `-p` フラグを使用した[非対話モード](/docs/ja/headless)で、セッションの最初のユーザーメッセージとして使用される文字列。プロンプトを渡さなくても最初のターンになります。プロンプトを渡した場合は、次のターンとして続きます |1351| `initialUserMessage` | `-p` フラグを使用した[非対話モード](/docs/ja/headless)で、セッションの最初のユーザーメッセージとして使用される文字列。プロンプトを渡さなくても最初のターンになります。プロンプトを渡した場合は、次のターンとして続きます |
1329| `sessionTitle` | セッションタイトルを設定します。`/rename` と同じ効果があります。`source` が `"startup"`、`"resume"`、または `"fork"` の場合に適用されます |1352| `sessionTitle` | `/rename` と同じ効果でセッションタイトルを設定します。`source` が `"startup"`、`"resume"`、`"fork"` のいずれかの場合に適用されます |
1330| `watchPaths` | このセッション中に [FileChanged](#filechanged) イベントを監視する絶対パスの配列 |1353| `watchPaths` | このセッション中に [FileChanged](#filechanged) イベントを監視する絶対パスの配列 |
1331| `reloadSkills` | ブール値。`true` の場合、Claude Code は SessionStart フックの完了後に[スキル](/docs/ja/skills)とコマンドのディレクトリを再スキャンします。[フックがインストールしたスキルを再読み込みする](#reload-skills-that-a-hook-installs)を参照してください |1354| `reloadSkills` | ブール値。`true` の場合、SessionStart フックの完了後に Claude Code が[スキル](/docs/ja/skills)とコマンドのディレクトリを再スキャンします。[フックがインストールしたスキルを再読み込みする](#reload-skills-that-a-hook-installs)を参照してください |
1332 1355
1333次の出力はコンテキストを追加し、セッションに名前を付けます。1356この出力はコンテキストを追加し、セッションに名前を付けます:
1334 1357
1335```json theme={null}1358```json theme={null}
1336{1359{
1342}1365}
1343```1366```
1344 1367
1345Claude Code は SessionStart フックの[プレーンテキストの stdout](#exit-code-0) を Claude のコンテキストに追加するため、コンテキストを追加するだけのフックは JSON を組み立てずにそのまま出力できます。1368コンテキストを追加するだけのフックは、JSON を組み立てずにそれを出力できます。Claude Code は SessionStart フックの[プレーンテキストの stdout](#exit-code-0) を Claude のコンテキストに追加するためです。
1346 1369
1347プラグインの SessionStart フックが `initialUserMessage` または `sessionTitle` を指定する場合は、セッションの開始前にプラグインをインストールしてください。SessionStart フックの実行後にインストールが完了したプラグインからのこれら 2 つのフィールドは、Claude Code によって無視されます。1370プラグインの SessionStart フックが `initialUserMessage` または `sessionTitle` を提供する場合は、セッション開始前にプラグインをインストールしてください。SessionStart フックの実行後にインストールが完了したプラグインからのこれら 2 つのフィールドは、Claude Code によって無視されます。
1348 1371
1349<h4 id="reload-skills-that-a-hook-installs">1372<h4 id="reload-skills-that-a-hook-installs">
1350 フックがインストールしたスキルを再読み込みする1373 フックがインストールしたスキルを再読み込みする
1351</h4>1374</h4>
1352 1375
1353SessionStart フックがインストールしたスキルを同じセッションで利用できるようにするには、`reloadSkills` を返します。スキルの検出は通常 SessionStart フックの完了前に実行されるため、これがないと、フックが `~/.claude/skills/` や `.claude/skills/` に書き込んだファイルが最初のプロンプトの実行時に見つからない場合があります。1376SessionStart フックがインストールしたスキルを同じセッションで利用可能にするには、`reloadSkills` を返します。スキルの検出は通常 SessionStart フックが完了する前に実行されるため、これがないと、フックが `~/.claude/skills/` や `.claude/skills/` に書き込んだファイルが最初のプロンプトの実行時に存在しない場合があります。
1354 1377
1355次の例は、共有スキルのリポジトリを同期し、再スキャンを要求します。1378この例は共有スキルリポジトリを同期し、再スキャンを要求します:
1356 1379
1357```bash theme={null}1380```bash theme={null}
1358#!/bin/bash1381#!/bin/bash
1369 環境変数を永続化する1392 環境変数を永続化する
1370</h4>1393</h4>
1371 1394
1372SessionStart フックは `CLAUDE_ENV_FILE` 環境変数にアクセスできます。この変数はファイルパスを提供し、そのファイルに、セッション中に Claude が後で実行するシェルコマンド向けの環境変数を永続化できます。1395SessionStart フックは `CLAUDE_ENV_FILE` 環境変数にアクセスできます。これは、セッション中に Claude が後で実行するシェルコマンド向けに環境変数を永続化できるファイルパスを提供します。
1373 1396
1374個別の環境変数を設定するには、`export` 文を `CLAUDE_ENV_FILE` に書き込みます。他のフックが設定した変数を保持するには、追記(`>>`)を使用してください。1397個々の環境変数を設定するには、`export` 文を `CLAUDE_ENV_FILE` に書き込みます。他のフックが設定した変数を保持するには、追記(`>>`)を使用してください:
1375 1398
1376```bash theme={null}1399```bash theme={null}
1377#!/bin/bash1400#!/bin/bash
1385exit 01408exit 0
1386```1409```
1387 1410
1388セットアップコマンドによるすべての環境の変更を取り込むには、エクスポートされた変数を実行前後で比較します。1411セットアップコマンドによるすべての環境変更を取り込むには、変更前後でエクスポートされた変数を比較します:
1389 1412
1390```bash theme={null}1413```bash theme={null}
1391#!/bin/bash1414#!/bin/bash
1404exit 01427exit 0
1405```1428```
1406 1429
1407各 Bash コマンドは、コマンド自体の前にファイルの内容をシェルコードとして実行するため、そこに書く行では `export PATH="$PATH:./node_modules/.bin"` 内の `$PATH` 参照のように、Bash が評価するものは何でも使用できます。1430各 Bash コマンドは、コマンド自体の前にこのファイルの内容をシェルコードとして実行するため、ファイル内の行では `export PATH="$PATH:./node_modules/.bin"` の `$PATH` 参照のように、Bash が評価するものなら何でも使用できます。
1408 1431
1409<a id="persisted-variables-in-powershell-commands" />1432<a id="persisted-variables-in-powershell-commands" />
1410 1433
1412 PowerShell コマンドでの永続化された変数1435 PowerShell コマンドでの永続化された変数
1413</h5>1436</h5>
1414 1437
1415Claude Code v2.1.296 以降では、[PowerShell](/docs/ja/tools-reference#powershell-tool) コマンドも `CLAUDE_ENV_FILE` から変数を受け取りますが、PowerShell がファイルを実行することはありません。代わりに、Claude Code がファイルから代入を読み取り、PowerShell コマンドの環境にコピーします。これが行われるのは、このセッションのすべてのフックが書き込んだ内容と、起動前に [`CLAUDE_ENV_FILE` に設定した](/docs/ja/env-vars)スクリプトのすべてにわたって、すべての行が次のいずれかである場合のみです。1438[PowerShell](/docs/ja/tools-reference#powershell-tool) コマンドも Claude Code v2.1.296 以降では `CLAUDE_ENV_FILE` から変数を受け取りますが、PowerShell がこのファイルを実行することはありません。代わりに、Claude Code がファイルから代入を読み取り、PowerShell コマンドの環境にコピーします。これが行われるのは、このセッションのすべてのフックが書き込んだ内容と、起動前に [`CLAUDE_ENV_FILE` に設定した](/docs/ja/env-vars)スクリプトの全体にわたって、すべての行が次のいずれかである場合に限られます:
1416 1439
1417* 空行または `#` コメント1440* 空行または `#` コメント
1418* 行頭にある 1 つの代入。`export NAME=value`、`declare -x NAME=value`、または `NAME=value` の形式で記述され、値は Bash が記述どおりにそのまま使用するものであること。値は次の要素を任意に組み合わせて構成されます:文字、数字、および `_ @ % + = : , . / -` の文字のみを使用したクォートなしのテキスト、シングルクォートで囲まれたテキスト、内部の `$`、バッククォート、`"` がバックスラッシュでエスケープされたダブルクォートで囲まれたテキスト1441* 行頭にある 1 つの代入で、`export NAME=value`、`declare -x NAME=value`、または `NAME=value` の形式で記述され、Bash が記述どおりにそのまま使用する値であるもの。値は次の部分を任意に組み合わせたものです:英字、数字、`_ @ % + = : , . / -` の文字のみを使用するクォートなしのテキスト、シングルクォートで囲まれたテキスト、内部の `$`、バッククォート、`"` がすべてバックスラッシュでエスケープされたダブルクォートで囲まれたテキスト
1419 1442
1420エスケープされていない `$PATH` を含む `export PATH="$PATH:./node_modules/.bin"`、`source` コマンド、`direnv export bash` が出力する `$'...'` 文字列など、他の種類の行が 1 つでもあると、PowerShell コマンドは変数を一切受け取らず、`claude --debug` は `Session environment is not all plain assignments` をログに記録します。Bash コマンドは引き続きすべての変数を受け取ります。Windows では、Git Bash と Windows でパスの表記が異なるため、値に `/` または `\` を含む変数も PowerShell コマンドには渡されません。[サンドボックス化された](/docs/ja/sandboxing) PowerShell コマンドは変数を一切受け取りません。1443いずれかの行がそれ以外の種類である場合(エスケープされていない `$PATH` を含む `export PATH="$PATH:./node_modules/.bin"`、`source` コマンド、`direnv export bash` が出力する `$'...'` 文字列など)、PowerShell コマンドは変数を一切受け取らず、`claude --debug` は `Session environment is not all plain assignments` をログに記録します。Bash コマンドは引き続きすべての変数を受け取ります。Windows では、Git Bash と Windows でパスの書き方が異なるため、値に `/` または `\` を含む変数も PowerShell コマンドには渡されません。[サンドボックス化](/docs/ja/sandboxing)された PowerShell コマンドは変数を一切受け取りません。
1421 1444
1422<Note>1445<Note>
1423 `CLAUDE_ENV_FILE` は SessionStart、[Setup](#setup)、[CwdChanged](#cwdchanged)、[FileChanged](#filechanged) フックで利用できます。他のフックイベントはこの変数にアクセスできず、[`"shell": "powershell"`](#command-hook-fields) によるものか、Git Bash のない Windows でのデフォルトによるものかにかかわらず、PowerShell で実行されるフックもアクセスできません。1446 `CLAUDE_ENV_FILE` は、SessionStart、[Setup](#setup)、[CwdChanged](#cwdchanged)、[FileChanged](#filechanged) フックで利用できます。他のフックイベントはこの変数にアクセスできず、PowerShell で実行されるフックも、[`"shell": "powershell"`](#command-hook-fields) によるものか、Git Bash のない Windows でのデフォルトによるものかにかかわらず、アクセスできません。
1424</Note>1447</Note>
1425 1448
1426<h3 id="setup">1449<h3 id="setup">
1427 Setup1450 Setup
1428</h3>1451</h3>
1429 1452
1430Claude Code を `--init-only` で起動した場合、または `-p` フラグを使用した[非対話モード](/docs/ja/headless)で `--init` か `--maintenance` を指定して起動した場合にのみ発火します。通常の起動時には発火しません。通常のセッション起動とは別に、CI やスクリプトから明示的にトリガーする 1 回限りの依存関係のインストールや定期的なクリーンアップに使用してください。セッションごとの初期化には、代わりに [SessionStart](#sessionstart) を使用してください。1453`--init-only` を指定して Claude Code を起動した場合、または `-p` フラグを使用した[非対話モード](/docs/ja/headless)で `--init` または `--maintenance` を指定した場合にのみ発火します。通常の起動では発火しません。通常のセッション起動とは別に、CI やスクリプトから明示的にトリガーする一回限りの依存関係のインストールや定期的なクリーンアップに使用してください。セッションごとの初期化には、代わりに [SessionStart](#sessionstart) を使用してください。
1431 1454
1432matcher の値は、フックをトリガーした CLI フラグに対応します。1455matcher の値は、フックをトリガーした CLI フラグに対応します:
1433 1456
1434| Matcher | 発火するタイミング |1457| Matcher | 発火するタイミング |
1435| :- | :- |1458| :- | :- |
1436| `init` | `claude --init-only` または `claude -p --init` |1459| `init` | `claude --init-only` または `claude -p --init` |
1437| `maintenance` | `claude -p --maintenance` |1460| `maintenance` | `claude -p --maintenance` |
1438 1461
1439`claude --init-only` を実行すると、Claude Code は Setup フックと `startup` matcher の `SessionStart` フックを実行した後、会話を開始せずに終了します。1462`claude --init-only` を実行すると、Claude Code は Setup フックと `startup` matcher の `SessionStart` フックを実行し、会話を開始せずに終了します。
1440 1463
1441`-p` で会話を開始または続行する場合は、引数として、または標準入力へのパイプでプロンプトも指定する必要があります。`SessionStart` フックが [`initialUserMessage`](#sessionstart-decision-control) を提供する場合や、[遅延されたツール呼び出し](#defer-a-tool-call-for-later)を含むセッションを再開する場合は、プロンプトを省略できます。1464`-p` で会話を開始または継続する場合は、引数として、または stdin へのパイプで、プロンプトも指定する必要があります。`SessionStart` フックが [`initialUserMessage`](#sessionstart-decision-control) を提供する場合や、[遅延されたツール呼び出し](#defer-a-tool-call-for-later)を含むセッションを再開する場合は、プロンプトを省略できます。
1442 1465
1443成功した場合、`--init-only` はターミナルに何も出力しません。フックが実行されたことを確認するには、`<path>` をログファイルの場所に置き換えて `claude --debug-file <path> --init-only` で起動し、ログに Setup と SessionStart のフックのエントリがあるか確認してください。1466成功した場合、`--init-only` はターミナルに何も出力しません。フックが実行されたことを確認するには、`<path>` をログファイルの場所に置き換えて `claude --debug-file <path> --init-only` で起動し、ログで Setup と SessionStart のフックのエントリを確認してください。
1444 1467
1445Setup はすべての起動時に発火するわけではないため、依存関係のインストールを必要とするプラグインは Setup だけに頼ることはできません。実用的なパターンは、初回使用時に依存関係を確認し、存在しなければインストールすることです。たとえば、`${CLAUDE_PLUGIN_DATA}/node_modules` の有無をテストし、存在しなければ `npm install` を実行するフックやスキルです。インストールした依存関係の保存場所については、[永続データディレクトリ](/docs/ja/plugins/components#path-variables-and-persistent-data)を参照してください。マーケットプレイスを通じてプラグインを配布する場合、このパターンは不要な場合があります。Claude Code はプラグインをキャッシュする際に、[対象となる Node.js パッケージの依存関係を自動的にインストール](/docs/ja/plugins/loading#node-js-package-dependencies)します。1468Setup はすべての起動で発火するわけではないため、依存関係のインストールを必要とするプラグインは Setup だけに頼ることはできません。実用的なパターンは、初回使用時に依存関係を確認し、存在しなければインストールすることです。たとえば、`${CLAUDE_PLUGIN_DATA}/node_modules` の存在をテストし、なければ `npm install` を実行するフックやスキルなどです。インストールした依存関係の保存場所については、[永続データディレクトリ](/docs/ja/plugins/components#path-variables-and-persistent-data)を参照してください。マーケットプレイスを通じてプラグインを配布する場合、このパターンは不要な場合があります。Claude Code はプラグインをキャッシュする際に、[対象となる Node.js パッケージの依存関係を自動的にインストール](/docs/ja/plugins/loading#node-js-package-dependencies)します。
1446 1469
1447<h4 id="setup-input">1470<h4 id="setup-input">
1448 Setup の入力1471 Setup の入力
1449</h4>1472</h4>
1450 1473
1451[共通の入力フィールド](#common-input-fields)に加えて、Setup フックは `"init"` または `"maintenance"` のいずれかが設定された `trigger` フィールドを受け取ります。1474[共通入力フィールド](#common-input-fields)に加えて、Setup フックは `"init"` または `"maintenance"` のいずれかに設定された `trigger` フィールドを受け取ります:
1452 1475
1453```json theme={null}1476```json theme={null}
1454{1477{
1461```1484```
1462 1485
1463<h4 id="setup-decision-control">1486<h4 id="setup-decision-control">
1464 Setup の判定制御1487 Setup の決定制御
1465</h4>1488</h4>
1466 1489
1467Setup フックはブロックできません。どの終了コードでも実行は続行されます。どの終了コードでも、Claude Code は Setup フックの [JSON 出力フィールド](#json-output)(`systemMessage`、`continue`、`hookSpecificOutput.additionalContext` など)を破棄します。`-p` を使用する場合、Setup フックの標準出力、標準エラー出力、終了コードは、`--output-format stream-json --verbose` で起動したときにのみ、[`hook_response` イベント](/docs/ja/headless#read-session-metadata)として実行の出力に表示されます。1490Setup フックはブロックできません。どの終了コードでも実行は継続されます。どの終了コードの場合も、Claude Code は Setup フックの [JSON 出力フィールド](#json-output)(`systemMessage`、`continue`、`hookSpecificOutput.additionalContext` など)を破棄します。`-p` では、Setup フックの stdout、stderr、終了コードは、`--output-format stream-json --verbose` で起動した場合にのみ、[`hook_response` イベント](/docs/ja/headless#read-session-metadata)として実行の出力に表示されます。
1468 1491
1469Setup フックは `CLAUDE_ENV_FILE` にアクセスできます。このファイルに書き込まれた変数は、[SessionStart フック](#persist-environment-variables)と同様に、セッションの後続の Bash コマンドに引き継がれます。`Setup` で実行されるのは `type: "command"` フックのみです。`Setup` の `type: "mcp_tool"` フックは、[MCP ツールフックのフィールド](#mcp-tool-hook-fields)で説明されているとおり、常にスキップされます。1492Setup フックは `CLAUDE_ENV_FILE` にアクセスできます。このファイルに書き込まれた変数は、[SessionStart フック](#persist-environment-variables)と同様に、セッションの後続の Bash コマンドに引き継がれます。`Setup` では `type: "command"` フックのみが実行されます。`Setup` の `type: "mcp_tool"` フックは、[MCP ツールフックのフィールド](#mcp-tool-hook-fields)で説明されているとおり、常にスキップされます。
1470 1493
1471<h3 id="instructionsloaded">1494<h3 id="instructionsloaded">
1472 InstructionsLoaded1495 InstructionsLoaded
1473</h3>1496</h3>
1474 1497
1475`CLAUDE.md` または `.claude/rules/*.md` ファイルがコンテキストに読み込まれたときに発火します。このイベントは、即時に読み込まれるファイルに対してはセッション開始時に発火し、ファイルが遅延読み込みされるときにも再度発火します。たとえば、Claude がネストされた `CLAUDE.md` を含むサブディレクトリにアクセスしたときや、`paths:` フロントマターを持つ条件付きルールが一致したときです。このフックはブロックや判定制御をサポートしていません。可観測性を目的として非同期に実行されます。1498`CLAUDE.md` または `.claude/rules/*.md` ファイルがコンテキストに読み込まれたときに発火します。このイベントは、即時に読み込まれるファイルについてはセッション開始時に発火し、ファイルが遅延読み込みされるときにも後で再度発火します。たとえば、ネストされた `CLAUDE.md` を含むサブディレクトリに Claude がアクセスしたときや、`paths:` フロントマターを持つ条件付きルールがマッチしたときです。このフックはブロックや決定制御をサポートしません。可観測性のために非同期で実行されます。
1476 1499
1477Claude が **Project instructions** 設定を通じて [`AGENTS.md` を直接読み込む](/docs/ja/memory#agents-md)場合、このイベントは発火しません。`CLAUDE.md` が `AGENTS.md` をインポートする場合は、他のインポートされたファイルと同様に `load_reason` が `include` に設定されて発火し、`CLAUDE.md` が `AGENTS.md` へのシンボリックリンクである場合は、通常の `CLAUDE.md` の読み込みとして発火します。1500このイベントは、Claude が **Project instructions** 設定を通じて [`AGENTS.md` を直接読み取る](/docs/ja/memory#agents-md)場合には発火しません。`CLAUDE.md` が `AGENTS.md` をインポートする場合は、他のインポートされたファイルと同様に `load_reason` が `include` に設定されて発火し、`CLAUDE.md` がそれへのシンボリックリンクである場合は、通常の `CLAUDE.md` の読み込みとして発火します。
1478 1501
1479matcher は `load_reason` に対して実行されます。たとえば、セッション開始時に読み込まれたファイルに対してのみ発火させるには `"matcher": "session_start"` を、遅延読み込みに対してのみ発火させるには `"matcher": "path_glob_match|nested_traversal"` を使用します。1502matcher は `load_reason` に対して実行されます。たとえば、セッション開始時に読み込まれたファイルに対してのみ発火させるには `"matcher": "session_start"` を、遅延読み込みに対してのみ発火させるには `"matcher": "path_glob_match|nested_traversal"` を使用します。
1480 1503
1482 InstructionsLoaded の入力1505 InstructionsLoaded の入力
1483</h4>1506</h4>
1484 1507
1485[共通の入力フィールド](#common-input-fields)に加えて、InstructionsLoaded フックは以下のフィールドを受け取ります。1508[共通入力フィールド](#common-input-fields)に加えて、InstructionsLoaded フックは次のフィールドを受け取ります:
1486 1509
1487| フィールド | 説明 |1510| フィールド | 説明 |
1488| :- | :- |1511| :- | :- |
1489| `file_path` | 読み込まれた指示ファイルの絶対パス |1512| `file_path` | 読み込まれた指示ファイルへの絶対パス |
1490| `memory_type` | ファイルのスコープ:`"User"`、`"Project"`、`"Local"`、または `"Managed"` |1513| `memory_type` | ファイルのスコープ:`"User"`、`"Project"`、`"Local"`、または `"Managed"` |
1491| `load_reason` | ファイルが読み込まれた理由:`"session_start"`、`"nested_traversal"`、`"path_glob_match"`、`"include"`、または `"compact"`。`"compact"` の値は、コンテキスト圧縮イベントの後に指示ファイルが再読み込みされたときに発火します |1514| `load_reason` | ファイルが読み込まれた理由:`"session_start"`、`"nested_traversal"`、`"path_glob_match"`、`"include"`、または `"compact"`。`"compact"` の値は、コンテキスト圧縮イベントの後に指示ファイルが再読み込みされたときに発火します |
1492| `globs` | ファイルの `paths:` フロントマターにあるパスの glob パターン(存在する場合)。`path_glob_match` の読み込みの場合にのみ存在します |1515| `globs` | ファイルの `paths:` フロントマターにあるパスの glob パターン(存在する場合)。`path_glob_match` による読み込みの場合にのみ存在します |
1493| `trigger_file_path` | 遅延読み込みの場合、この読み込みをトリガーしたアクセス先のファイルのパス |1516| `trigger_file_path` | 遅延読み込みの場合、この読み込みのきっかけとなったアクセス先のファイルへのパス |
1494| `parent_file_path` | `include` の読み込みの場合、このファイルをインクルードした親の指示ファイルのパス |1517| `parent_file_path` | `include` による読み込みの場合、このファイルをインクルードした親の指示ファイルへのパス |
1495 1518
1496```json theme={null}1519```json theme={null}
1497{1520{
1506```1529```
1507 1530
1508<h4 id="instructionsloaded-decision-control">1531<h4 id="instructionsloaded-decision-control">
1509 InstructionsLoaded の判定制御1532 InstructionsLoaded の決定制御
1510</h4>1533</h4>
1511 1534
1512InstructionsLoaded フックには判定制御がありません。指示の読み込みをブロックしたり変更したりすることはできません。Claude Code はこれらのフックの [JSON 出力フィールド](#json-output)(`systemMessage` や `continue` など)を破棄します。このイベントは、監査ログ、コンプライアンスの追跡、可観測性のために使用してください。1535InstructionsLoaded フックには決定制御がありません。指示の読み込みをブロックしたり変更したりすることはできません。Claude Code はその [JSON 出力フィールド](#json-output)(`systemMessage` や `continue` など)を破棄します。このイベントは、監査ログ、コンプライアンスの追跡、可観測性のために使用してください。
1513 1536
1514<h3 id="userpromptsubmit">1537<h3 id="userpromptsubmit">
1515 UserPromptSubmit1538 UserPromptSubmit
1519プロンプトや会話に基づいて追加のコンテキストを加えたり、プロンプトを検証したり、1542プロンプトや会話に基づいて追加のコンテキストを加えたり、プロンプトを検証したり、
1520特定の種類のプロンプトをブロックしたりできます。1543特定の種類のプロンプトをブロックしたりできます。
1521 1544
1522`UserPromptSubmit` フックは、ユーザーが入力したプロンプトに対してだけ発火するわけではありません。Claude Code は以下の場合にも実行します。1545`UserPromptSubmit` フックは、入力したプロンプトに対してだけ発火するわけではありません。Claude Code は次の場合にも実行します:
1523 1546
1524* [スケジュールタスク](/docs/ja/scheduled-tasks)の発火(`/loop` の反復を含む)1547* [スケジュールタスク](/docs/ja/scheduled-tasks)の発火(`/loop` の反復を含む)
1525* [バックグラウンドのサブエージェント](/docs/ja/sub-agents#run-subagents-in-foreground-or-background)が、それを開始したセッションに結果を報告するとき1548* [バックグラウンドのサブエージェント](/docs/ja/sub-agents#run-subagents-in-foreground-or-background)が、それを開始したセッションに報告を返すとき
1526* [別のセッションが送信したメッセージ](/docs/ja/cross-session-messaging)がメインの会話に届いたとき1549* [別のセッションが送信したメッセージ](/docs/ja/cross-session-messaging)がメインの会話に届くとき
1527 1550
1528`UserPromptSubmit` フックのデフォルトのタイムアウトは、`command`、`http`、`mcp_tool` の各タイプで 30 秒です。これは、他のほとんどのイベントでのこれらのタイプのデフォルトである 600 秒より短くなっています。このフックはすべてのプロンプトの前に実行され、完了するまでモデルの処理をブロックするため、フックが停止するとセッションも停止します。フックにさらに時間が必要な場合は、フックエントリの `timeout` フィールドを設定してください。1551`UserPromptSubmit` フックのデフォルトのタイムアウトは、`command`、`http`、`mcp_tool` タイプで 30 秒です。これは、他のほとんどのイベントにおけるこれらのタイプのデフォルトである 600 秒より短い値です。このフックはすべてのプロンプトの前に実行され、完了するまでモデルの処理をブロックするため、フックが停止するとセッションも停止します。フックにより多くの時間が必要な場合は、フックエントリで `timeout` フィールドを設定してください。
1529 1552
1530[`async: true`](#run-hooks-in-the-background) で実行するコマンドフックを除き、タイムアウトに達した `UserPromptSubmit` のコマンド、HTTP、または MCP ツールフックはキャンセルされ、その出力は `additionalContext` を含めて破棄されます。プロンプトはそのコンテキストなしで Claude に届きます。代わりにプロンプトをブロックするには、コマンドフックまたは HTTP フックに [`onFailure: "block"`](#block-the-action-when-a-hook-fails) を設定してください。トランスクリプトには、フックの名前、発生したタイムアウト、出力が破棄されたことを示す通知が表示されます。1553[`async: true`](#run-hooks-in-the-background) で実行するコマンドフックを除き、タイムアウトに達した `UserPromptSubmit` のコマンド、HTTP、MCP ツールのフックはキャンセルされ、その出力(`additionalContext` を含む)は破棄されます。プロンプトはそのコンテキストなしで Claude に届きます。代わりにプロンプトをブロックするには、コマンドフックまたは HTTP フックで [`onFailure: "block"`](#block-the-action-when-a-hook-fails) を設定してください。トランスクリプトには、フック名、発生したタイムアウト、出力が破棄されたことを示す通知が表示されます。
1531 1554
1532`UserPromptSubmit` の [Agent SDK コールバックフック](/docs/ja/agent-sdk/hooks)がタイムアウトに達すると、フック名とタイムアウトを示すメッセージとともにプロンプトがブロックされます。これは、そこでのコールバックが、フェイルオープンしてはならないポリシーゲートとして機能している可能性があるためです。セッションは続行されます。v2.1.208 より前は、このイベントでのコールバックのタイムアウトは実行エラーでターンを終了していました。1555タイムアウトに達した `UserPromptSubmit` の [Agent SDK コールバックフック](/docs/ja/agent-sdk/hooks)は、フック名とタイムアウトを示すメッセージとともにプロンプトをブロックします。そこでのコールバックは、フェイルオープンしてはならないポリシーゲートとして機能している可能性があるためです。セッションは継続します。v2.1.208 より前は、このイベントでのコールバックのタイムアウトは実行エラーとともにターンを終了していました。
1533 1556
1534<h4 id="userpromptsubmit-input">1557<h4 id="userpromptsubmit-input">
1535 UserPromptSubmit の入力1558 UserPromptSubmit の入力
1536</h4>1559</h4>
1537 1560
1538[共通の入力フィールド](#common-input-fields)に加えて、UserPromptSubmit フックは送信されたテキストを含む `prompt` フィールドを受け取ります。`[Pasted text #N]` プレースホルダーに折りたたまれた貼り付けコンテンツは、その場で展開された状態で届きます。Claude Code が[貼り付けたテキストを Claude 向けにマークする](/docs/ja/terminal-config#how-claude-treats-pasted-text)セッションでは、展開されたコンテンツは `<pasted_content id="…">` の行と `</pasted_content id="…">` の行の間に置かれるため、フックがプロンプトを解析する場合はこれらの行を考慮してください。1561[共通入力フィールド](#common-input-fields)に加えて、UserPromptSubmit フックは送信されたテキストを含む `prompt` フィールドを受け取ります。`[Pasted text #N]` プレースホルダーに折りたたまれた貼り付けコンテンツは、その場で展開された状態で届きます。Claude Code が[貼り付けたテキストを Claude 向けにマークする](/docs/ja/terminal-config#how-claude-treats-pasted-text)セッションでは、展開されたコンテンツは `<pasted_content id="…">` の行と `</pasted_content id="…">` の行の間に置かれるため、フックがプロンプトを解析する場合はこれらの行を考慮してください。
1539 1562
1540UserPromptSubmit フックは、セッションにカスタムタイトルがある場合に `session_title` も受け取ります。その意味は [SessionStart の `session_title` フィールド](#sessionstart-input)と同じです。1563UserPromptSubmit フックは、セッションにカスタムタイトルがある場合、`session_title` も受け取ります。意味は [SessionStart の `session_title` フィールド](#sessionstart-input)と同じです。
1541 1564
1542```json theme={null}1565```json theme={null}
1543{1566{
1551```1574```
1552 1575
1553<h4 id="userpromptsubmit-decision-control">1576<h4 id="userpromptsubmit-decision-control">
1554 UserPromptSubmit の判定制御1577 UserPromptSubmit の決定制御
1555</h4>1578</h4>
1556 1579
1557`UserPromptSubmit` フックは、送信されたプロンプトを処理するかどうかを制御し、コンテキストを追加できます。すべての [JSON 出力フィールド](#json-output)が利用できます。1580`UserPromptSubmit` フックは、送信されたプロンプトを処理するかどうかを制御し、コンテキストを追加できます。すべての [JSON 出力フィールド](#json-output)が利用できます。
1558 1581
1559終了コード 0 の場合、会話にコンテキストを追加する方法は 2 つあります。1582終了コード 0 で会話にコンテキストを追加する方法は 2 つあります:
1560 1583
1561* **プレーンテキストの標準出力**:Claude Code は、[プレーンテキストとして扱う](#exit-code-0)標準出力を Claude のコンテキストに追加します1584* **プレーンテキストの stdout**:Claude Code は、[プレーンテキストとして扱う](#exit-code-0) stdout を Claude のコンテキストに追加します
1562* **`additionalContext` を含む JSON**:より細かく制御するには、以下の JSON 形式を使用します。`additionalContext` フィールドがコンテキストとして追加されます1585* **`additionalContext` を含む JSON**:より細かく制御するには、以下の JSON 形式を使用します。`additionalContext` フィールドがコンテキストとして追加されます
1563 1586
1564どちらのチャネルも、トランスクリプトに表示されるエントリは作成しません。通常の標準出力と `additionalContext` の値は、それぞれフック名で始まるシステムリマインダーとして挿入され、Claude は両方を読み取ります。配信を確認するには、[デバッグログ](#debug-hooks)を確認してください。1587どちらの方法でも、トランスクリプトに表示されるエントリは作成されません。プレーンな stdout と `additionalContext` の値は、それぞれフック名で始まるシステムリマインダーとして挿入され、Claude は両方を読み取ります。配信を確認するには、[デバッグログ](#debug-hooks)を確認してください。
1565 1588
1566プロンプトをブロックするには、`decision` を `"block"` に設定した JSON オブジェクトを返します。1589プロンプトをブロックするには、`decision` を `"block"` に設定した JSON オブジェクトを返します:
1567 1590
1568| フィールド | 説明 |1591| フィールド | 説明 |
1569| :- | :- |1592| :- | :- |
1570| `decision` | `"block"` は、プロンプトが Claude に届く前に停止します。プロンプトの処理を続行させる場合は省略します |1593| `decision` | `"block"` はプロンプトが Claude に届く前に停止します。プロンプトの処理を続行させるには省略します |
1571| `reason` | `decision` が `"block"` の場合にユーザーに表示されます。コンテキストには追加されません |1594| `reason` | `decision` が `"block"` の場合にユーザーに表示されます。コンテキストには追加されません |
1572| `additionalContext` | 送信されたプロンプトとともに Claude のコンテキストに追加される文字列。[Claude にコンテキストを追加する](#add-context-for-claude)を参照してください |1595| `additionalContext` | 送信されたプロンプトとともに Claude のコンテキストに追加される文字列。[Claude にコンテキストを追加する](#add-context-for-claude)を参照してください |
1573| `sessionTitle` | セッションタイトルを設定します。プロンプトの内容に基づいてセッションに自動で名前を付ける場合に使用します |1596| `sessionTitle` | セッションタイトルを設定します。プロンプトの内容に基づいてセッションに自動的に名前を付けるために使用します |
1574| `suppressOriginalPrompt` | フックがプロンプトをブロックする際に `true` の場合、ブロックメッセージからプロンプトのテキストを除外します。[ブロックされたプロンプトが残すもの](#what-a-blocked-prompt-leaves-behind)を参照してください |1597| `suppressOriginalPrompt` | フックがプロンプトをブロックする際に `true` の場合、ブロックメッセージからプロンプトのテキストを除外します。[ブロックされたプロンプトが残すもの](#what-a-blocked-prompt-leaves-behind)を参照してください |
1575 1598
1576終了コード 2 で終了してブロックするフックは、`reason` と同じ方法で処理されます。ブロックメッセージには標準エラー出力のテキストがユーザーに表示され、コンテキストには追加されません。1599終了コード 2 でブロックするフックは、`reason` と同じように扱われます。ブロックメッセージには stderr のテキストがユーザーに表示され、コンテキストには追加されません。
1577 1600
1578```json theme={null}1601```json theme={null}
1579{1602{
1592 ブロックされたプロンプトが残すもの1615 ブロックされたプロンプトが残すもの
1593</h4>1616</h4>
1594 1617
1595ブロックされたプロンプトは Claude に届きませんが、そのテキストがあらゆる場所から削除されるわけではありません。デフォルトでは、ユーザーに表示されるブロックメッセージの末尾に `Original prompt:` と送信されたテキストが続き、Claude Code はそのメッセージをディスク上のセッションのトランスクリプトファイルに書き込みます。メッセージからテキストを除外するには、`hookSpecificOutput` 内に `"suppressOriginalPrompt": true` を含む JSON を出力してください。これは、フックが `decision: "block"` でブロックする場合でも、終了コード 2 で終了してブロックする場合でも機能します。1618ブロックされたプロンプトが Claude に届くことはありませんが、そのテキストがあらゆる場所から削除されるわけではありません。デフォルトでは、ユーザーに表示されるブロックメッセージの末尾に `Original prompt:` と送信されたテキストが続き、Claude Code はそのメッセージをディスク上のセッションのトランスクリプトファイルに書き込みます。メッセージからテキストを除外するには、`hookSpecificOutput` 内に `"suppressOriginalPrompt": true` を含む JSON を出力します。これは、フックが `decision: "block"` でブロックする場合でも、終了コード 2 でブロックする場合でも機能します。
1596 1619
1597`suppressOriginalPrompt` が変更するのはブロックメッセージだけです。送信されたテキストは、セッションのトランスクリプトやプロンプト履歴などのローカルファイルに引き続き表示される可能性があるため、ブロックするフックは秘密情報をディスクに残さないための手段にはなりません。これらのファイルを制限または削除するには、[プレーンテキストの保存](/docs/ja/claude-directory#plaintext-storage)と[ローカルデータを消去する](/docs/ja/claude-directory#clear-local-data)を参照してください。1620`suppressOriginalPrompt` が変更するのはブロックメッセージのみです。送信されたテキストは、セッションのトランスクリプトやプロンプト履歴などのローカルファイルに引き続き残る可能性があるため、ブロックするフックは機密情報をディスクに残さない手段にはなりません。これらのファイルを制限または削除するには、[プレーンテキストでの保存](/docs/ja/claude-directory#plaintext-storage)と[ローカルデータの消去](/docs/ja/claude-directory#clear-local-data)を参照してください。
1598 1621
1599<h3 id="userpromptexpansion">1622<h3 id="userpromptexpansion">
1600 UserPromptExpansion1623 UserPromptExpansion
1601</h3>1624</h3>
1602 1625
1603ユーザーが入力したコマンドが、Claude に届く前にプロンプトに展開されるときに実行されます。特定のコマンドの直接呼び出しをブロックしたり、特定のスキルにコンテキストを挿入したり、ユーザーがどのコマンドを呼び出したかをログに記録したりするのに使用します。たとえば、`deploy` に一致するフックは承認ファイルが存在しない限り `/deploy` をブロックでき、レビュースキルに一致するフックはチームのレビューチェックリストを `additionalContext` として追加できます。1626ユーザーが入力したコマンドが、Claude に届く前にプロンプトに展開されるときに実行されます。特定のコマンドの直接呼び出しのブロック、特定のスキルへのコンテキストの挿入、ユーザーが呼び出したコマンドのログ記録に使用します。たとえば、`deploy` にマッチするフックは承認ファイルが存在しない限り `/deploy` をブロックでき、レビュースキルにマッチするフックはチームのレビューチェックリストを `additionalContext` として追加できます。
1604 1627
1605このイベントは、`PreToolUse` がカバーしない経路をカバーします。`Skill` ツールに一致する `PreToolUse` フックは Claude がツールを呼び出したときにのみ発火しますが、`/skillname` を直接入力すると `PreToolUse` はバイパスされます。`UserPromptExpansion` はその直接の経路で発火します。1628このイベントは、`PreToolUse` がカバーしない経路をカバーします。`Skill` ツールにマッチする `PreToolUse` フックは Claude がツールを呼び出したときにのみ発火しますが、`/skillname` を直接入力すると `PreToolUse` はバイパスされます。`UserPromptExpansion` はその直接の経路で発火します。
1606 1629
1607`command_name` に対してマッチします。すべてのプロンプト型コマンドで発火させるには、matcher を空のままにしてください。1630`command_name` にマッチします。すべてのプロンプト型コマンドで発火させるには、matcher を空のままにします。
1608 1631
1609<h4 id="userpromptexpansion-input">1632<h4 id="userpromptexpansion-input">
1610 UserPromptExpansion の入力1633 UserPromptExpansion の入力
1611</h4>1634</h4>
1612 1635
1613[共通の入力フィールド](#common-input-fields)に加えて、UserPromptExpansion フックは `expansion_type`、`command_name`、`command_args`、`command_source`、および元の `prompt` 文字列を受け取ります。`expansion_type` フィールドは、スキルとカスタムコマンドの場合は `slash_command`、MCP サーバーのプロンプトの場合は `mcp_prompt` です。1636[共通入力フィールド](#common-input-fields)に加えて、UserPromptExpansion フックは `expansion_type`、`command_name`、`command_args`、`command_source`、および元の `prompt` 文字列を受け取ります。`expansion_type` フィールドは、スキルとカスタムコマンドの場合は `slash_command`、MCP サーバーのプロンプトの場合は `mcp_prompt` です。
1614 1637
1615```json theme={null}1638```json theme={null}
1616{1639{
1628```1651```
1629 1652
1630<h4 id="userpromptexpansion-decision-control">1653<h4 id="userpromptexpansion-decision-control">
1631 UserPromptExpansion の判定制御1654 UserPromptExpansion の決定制御
1632</h4>1655</h4>
1633 1656
1634`UserPromptExpansion` フックは、展開をブロックしたりコンテキストを追加したりできます。すべての [JSON 出力フィールド](#json-output)が利用できます。1657`UserPromptExpansion` フックは展開をブロックしたり、コンテキストを追加したりできます。すべての [JSON 出力フィールド](#json-output)が利用できます。
1635 1658
1636| フィールド | 説明 |1659| フィールド | 説明 |
1637| :- | :- |1660| :- | :- |
1638| `decision` | `"block"` はコマンドの展開を防ぎます。続行させる場合は省略します |1661| `decision` | `"block"` はコマンドの展開を防ぎます。続行させるには省略します |
1639| `reason` | `decision` が `"block"` の場合にユーザーに表示されます |1662| `reason` | `decision` が `"block"` の場合にユーザーに表示されます |
1640| `additionalContext` | 展開されたプロンプトとともに Claude のコンテキストに追加される文字列。[Claude にコンテキストを追加する](#add-context-for-claude)を参照してください |1663| `additionalContext` | 展開されたプロンプトとともに Claude のコンテキストに追加される文字列。[Claude にコンテキストを追加する](#add-context-for-claude)を参照してください |
1641 1664
1642終了コード 2 で終了してブロックするフックは、`reason` と同じ方法で処理されます。ブロックメッセージには標準エラー出力のテキストがユーザーに表示されます。1665終了コード 2 でブロックするフックは、`reason` と同じように扱われます。ブロックメッセージには stderr のテキストがユーザーに表示されます。
1643 1666
1644```json theme={null}1667```json theme={null}
1645{1668{
1656 MessageDisplay1679 MessageDisplay
1657</h3>1680</h3>
1658 1681
1659アシスタントのメッセージが画面にストリーミングされている間に実行されます。Claude Code はメッセージを段階的に表示します。新たに完成した行のバッチが描画できる状態になるたびに、フックはそれらの行を受け取って 1 回実行され、Claude Code はフックの置換テキストをその位置に描画します。長いメッセージでは複数回呼び出され、短いメッセージでは 1 回だけの場合もあります。1682アシスタントメッセージが画面にストリーミングされている間に実行されます。Claude Code はメッセージを段階的に表示します。新たに完成した行のバッチが描画可能になるたびに、フックはそれらの行を受け取って 1 回実行され、Claude Code はその位置にフックの置換テキストを描画します。長いメッセージでは複数回呼び出され、短いメッセージでは 1 回だけの場合もあります。
1660 1683
1661MessageDisplay は次の用途に使用します。1684MessageDisplay は次の用途に使用します:
1662 1685
1663* 最小限の表示のために markdown を除去する1686* 最小限の表示のために markdown を除去する
1664* Agent SDK アプリケーションがユーザーに表示するテキストを変換する1687* Agent SDK アプリケーションがユーザーに表示するテキストを変換する
1665* Claude の応答から API キーや内部ホスト名を秘匿する1688* Claude の応答から API キーや内部ホスト名を秘匿する
1666 1689
1667Claude Code はフックが戻るまで各バッチを保持するため、フックは高速に保ってください。フックが失敗するかタイムアウトした場合、Claude Code は元のテキストを表示します。このイベントのデフォルトのタイムアウトは 10 秒です。フックにさらに時間が必要な場合は、フックエントリの `timeout` フィールドを設定してください。1690Claude Code はフックが返るまで各バッチを保持するため、フックは高速に保ってください。フックが失敗またはタイムアウトした場合、Claude Code は元のテキストを表示します。このイベントのデフォルトのタイムアウトは 10 秒です。フックにより多くの時間が必要な場合は、フックエントリで `timeout` フィールドを設定してください。
1668 1691
1669MessageDisplay は表示専用です。置換テキストは画面に描画される内容だけを変更します。トランスクリプトと Claude が参照する内容は元のテキストのままであるため、Claude が置換テキストを見ることはなく、詳細モードでは元のテキストが表示されます。フックが受け取るのはアシスタントのメッセージのテキストのみであるため、ツールの結果やユーザーが入力したテキストは変更されずに描画されます。1692MessageDisplay は表示専用です。置換テキストによって変わるのは画面に描画される内容だけです。トランスクリプトと Claude が見る内容は元のテキストのままなので、Claude が置換テキストを見ることはなく、verbose モードでは元のテキストが表示されます。フックが受け取るのはアシスタントメッセージのテキストのみなので、ツールの結果やユーザーが入力したテキストは変更されずに描画されます。
1670 1693
1671MessageDisplay は matcher をサポートしておらず、テキストをストリーミングするすべてのアシスタントメッセージで発火します。ツール呼び出しのみの応答など、テキストを含まないメッセージでは発火しません。1694MessageDisplay は matcher をサポートせず、テキストをストリーミングするすべてのアシスタントメッセージで発火します。ツール呼び出しのみの応答など、テキストを含まないメッセージではトリガーされません。
1672 1695
1673Agent SDK のクエリや `claude -p` を含む非対話の実行では、MessageDisplay は行のバッチごとではなく、アシスタントメッセージごとに 1 回実行されます。その 1 回の呼び出しはメッセージの完了後に届き、メッセージの全文を含みます。`index` は `0`、`final` は `true`、`delta` はメッセージ全体を保持します。各メッセージの `delta` テキストを収集するフックは、どちらのモードでも同じテキスト全体を受け取ります。1696Agent SDK のクエリや `claude -p` を含む非対話の実行では、MessageDisplay は行のバッチごとではなく、アシスタントメッセージごとに 1 回実行されます。この 1 回の呼び出しはメッセージの完了後に行われ、メッセージの全文を含みます。`index` は `0`、`final` は `true` で、`delta` にメッセージ全体が入ります。各メッセージの `delta` テキストを収集するフックは、どちらのモードでも同じ合計テキストを受け取ります。
1674 1697
1675<h4 id="messagedisplay-input">1698<h4 id="messagedisplay-input">
1676 MessageDisplay の入力1699 MessageDisplay の入力
1677</h4>1700</h4>
1678 1701
1679[共通の入力フィールド](#common-input-fields)に加えて、MessageDisplay フックは、ターンとメッセージの識別子、メッセージ内でのこの呼び出しの位置、および `delta` 内の新しいテキストを受け取ります。バッチの境界はテキストのストリーミング方法によって異なるため、行が特定の方法でグループ化されることを期待するのではなく、`index` と `final` を使用してメッセージ内の進行状況を追跡してください。1702[共通入力フィールド](#common-input-fields)に加えて、MessageDisplay フックは、ターンとメッセージの識別子、メッセージ内でのこの呼び出しの位置、`delta` 内の新しいテキストを受け取ります。バッチの境界はテキストのストリーミング方法によって異なるため、行が特定の方法でグループ化されることを期待せず、`index` と `final` を使ってメッセージの進行状況を追跡してください。
1680 1703
1681| フィールド | 説明 |1704| フィールド | 説明 |
1682| :- | :- |1705| :- | :- |
1684| `message_id` | 表示中のアシスタントメッセージの UUID。同じメッセージのすべてのバッチで一定です。これは API の `msg_…` ID ではないため、トランスクリプトのメッセージ ID と関連付けることはできません |1707| `message_id` | 表示中のアシスタントメッセージの UUID。同じメッセージのすべてのバッチで一定です。これは API の `msg_…` ID ではないため、トランスクリプトのメッセージ ID と関連付けることはできません |
1685| `index` | メッセージ内でのこのバッチの 0 から始まるインデックス |1708| `index` | メッセージ内でのこのバッチの 0 から始まるインデックス |
1686| `final` | メッセージの最後のバッチで `true`。各メッセージには最終バッチがちょうど 1 つあります |1709| `final` | メッセージの最後のバッチで `true`。各メッセージには最終バッチがちょうど 1 つあります |
1687| `delta` | 前回のバッチ以降に新たに完成した行(終端の改行を含む)。常に行単位ですが、最終バッチは行の途中で終わる場合があります。対話の実行では、メッセージが改行で終わる場合に最終バッチの delta は空になるため、空でない delta ではなく `final` をメッセージ終了のシグナルとして扱ってください。Agent SDK と `claude -p` の実行では、1 回の呼び出しがメッセージ全体を含みます |1710| `delta` | 前のバッチ以降に新たに完成した行(末尾の改行を含む)。最終バッチは行の途中で終わる場合がありますが、それ以外は常に完全な行です。対話的な実行では、メッセージが改行で終わる場合、最終バッチの delta は空になるため、空でない delta ではなく `final` をメッセージ終了のシグナルとして扱ってください。Agent SDK と `claude -p` の実行では、1 回の呼び出しでメッセージ全体が渡されます |
1688 1711
1689```json theme={null}1712```json theme={null}
1690{1713{
1704 MessageDisplay の出力1727 MessageDisplay の出力
1705</h4>1728</h4>
1706 1729
1707すべてのフックで利用できる [JSON 出力フィールド](#json-output)に加えて、MessageDisplay フックは画面上の delta を置き換えるために `displayContent` を返すことができます。1730すべてのフックで利用できる [JSON 出力フィールド](#json-output)に加えて、MessageDisplay フックは `displayContent` を返して画面上の delta を置き換えることができます:
1708 1731
1709| フィールド | 説明 |1732| フィールド | 説明 |
1710| :- | :- |1733| :- | :- |
1711| `displayContent` | delta の代わりに表示されるテキスト。元のテキストを表示する場合は省略します |1734| `displayContent` | delta の代わりに表示されるテキスト。元のテキストを表示するには省略します |
1712 1735
1713MessageDisplay フックには判定制御がありません。メッセージをブロックしたり、トランスクリプトに保存される内容や Claude に送信される内容を変更したりすることはできません。Claude Code は JSON 出力の `displayContent` に従って動作し、`systemMessage` と `continue` は破棄します。1736MessageDisplay フックには決定制御がありません。メッセージをブロックしたり、トランスクリプトに保存される内容や Claude に送信される内容を変更したりすることはできません。Claude Code は JSON 出力の `displayContent` に基づいて動作し、`systemMessage` と `continue` は破棄します。
1714 1737
1715次の例では、プレーンテキストで表示するために Claude の応答から markdown の書式を除去します。スクリプトは各バッチを標準入力から読み取り、`delta` から太字のマーカーとインラインコードのバッククォートを取り除き、結果を `displayContent` として返します。1738この例では、プレーンテキストで表示するために Claude の応答から markdown の書式を除去します。スクリプトは stdin から各バッチを読み取り、`delta` から太字マーカーとインラインコードのバッククォートを削除して、結果を `displayContent` として返します。
1716 1739
1717<Tabs>1740<Tabs>
1718 <Tab title="macOS/Linux">1741 <Tab title="macOS/Linux">
1719 設定ファイルで、このイベント用のコマンドフックを登録します。1742 設定ファイルでこのイベントのコマンドフックを登録します:
1720 1743
1721 ```json theme={null}1744 ```json theme={null}
1722 {1745 {
1736 }1759 }
1737 ```1760 ```
1738 1761
1739 このスクリプトをプロジェクトの `.claude/hooks/plain-display.sh` に保存し、`chmod +x` で実行可能にします。1762 このスクリプトをプロジェクトの `.claude/hooks/plain-display.sh` に保存し、`chmod +x` で実行可能にします:
1740 1763
1741 ```bash theme={null}1764 ```bash theme={null}
1742 #!/bin/bash1765 #!/bin/bash
1745 </Tab>1768 </Tab>
1746 1769
1747 <Tab title="Windows (PowerShell)">1770 <Tab title="Windows (PowerShell)">
1748 PowerShell を通じてスクリプトを実行するコマンドフックを登録します。1771 PowerShell を通じてスクリプトを実行するコマンドフックを登録します:
1749 1772
1750 ```json theme={null}1773 ```json theme={null}
1751 {1774 {
1771 }1794 }
1772 ```1795 ```
1773 1796
1774 `-NoProfile` フラグは PowerShell プロファイルの読み込みをスキップしてフックを高速に起動し、`-ExecutionPolicy Bypass` は PowerShell がローカルのスクリプトファイルを実行できるようにします。1797 `-NoProfile` フラグは PowerShell プロファイルの読み込みをスキップしてフックを高速に起動させ、`-ExecutionPolicy Bypass` は PowerShell がローカルのスクリプトファイルを実行できるようにします。
1775 1798
1776 このスクリプトをプロジェクトの `.claude/hooks/plain-display.ps1` に保存します。1799 このスクリプトをプロジェクトの `.claude/hooks/plain-display.ps1` に保存します:
1777 1800
1778 ```powershell theme={null}1801 ```powershell theme={null}
1779 $batch = [Console]::In.ReadToEnd() | ConvertFrom-Json1802 $batch = [Console]::In.ReadToEnd() | ConvertFrom-Json
1788 </Tab>1811 </Tab>
1789</Tabs>1812</Tabs>
1790 1813
1791markdown を含まないバッチは変更されずにそのまま通過します。`jq` がないなどの理由でスクリプトが失敗した場合、Claude Code は元のテキストを表示し、失敗はセッション内ではなく[デバッグ出力](#debug-hooks)にのみ記録されます。1814markdown を含まないバッチはそのまま通過します。スクリプトが失敗した場合(たとえば `jq` がない場合)、Claude Code は元のテキストを表示し、失敗はセッション内ではなく[デバッグ出力](#debug-hooks)でのみ通知されます。
1792 1815
1793<h3 id="pretooluse">1816<h3 id="pretooluse">
1794 PreToolUse1817 PreToolUse
1795</h3>1818</h3>
1796 1819
1797Claude がツールのパラメーターを作成した後、ツール呼び出しを処理する前に実行されます。`EndConversation` を除く任意のツール名にマッチします。`Bash`、`PowerShell`、`Edit`、`Write`、`Read`、`Glob`、`Grep`、`Agent`、`Workflow`、`WebFetch`、`WebSearch`、`AskUserQuestion`、`ExitPlanMode` などの組み込みツールと、任意の [MCP ツール名](#match-mcp-tools)が対象です。1820Claude がツールのパラメータを作成した後、ツール呼び出しを処理する前に実行されます。`EndConversation` を除くすべてのツール名にマッチします。`Bash`、`PowerShell`、`Edit`、`Write`、`Read`、`Glob`、`Grep`、`Agent`、`Workflow`、`WebFetch`、`WebSearch`、`AskUserQuestion`、`ExitPlanMode` などの組み込みツールと、任意の [MCP ツール名](#match-mcp-tools)が対象です。
1798 1821
1799書き込んだのが何であれ、特定のファイルがディスク上で変更されたときにフックを実行するには、ファイル編集ツールを名前でマッチさせるのではなく [FileChanged](#filechanged) を使用してください。PreToolUse とは異なり、Claude Code は FileChanged フックを変更後に実行し、これには判定制御がないため、書き込みをブロックすることはできません。1822何が書き込んだかにかかわらず、特定のファイルがディスク上で変更されたときにフックを実行するには、ファイル編集ツールを名前でマッチさせる代わりに [FileChanged](#filechanged) を使用してください。PreToolUse とは異なり、Claude Code は FileChanged フックを変更の後に実行し、決定制御もないため、書き込みをブロックすることはできません。
1800 1823
1801<Warning>1824<Warning>
1802 PreToolUse は、Claude がツールを呼び出した場合にのみ実行されます。[プロンプト内で `@` を使って参照した](/docs/ja/common-workflows#reference-files-and-directories)ファイルは、ツール呼び出しなしで追加されます。Claude Code はプロンプトの構築中にその内容を挿入するため、`Read` にマッチするフックを含め、PreToolUse フックはそれらのファイルに対して発火しません。`@` 参照から特定のパスをブロックするには、代わりに [`Read` の拒否ルール](/docs/ja/permissions#read-and-edit)を使用してください。1825 PreToolUse は Claude がツールを呼び出したときにのみ実行されます。デフォルトでは、[プロンプト内で `@` を使って参照した](/docs/ja/common-workflows#reference-files-and-directories)ファイルは、ツール呼び出しなしで追加されます。Claude Code はプロンプトの構築中にその内容を挿入するため、`Read` にマッチするフックを含め、PreToolUse フックは発火しません。PreToolUse は [`EndConversation`](/docs/ja/tools-reference#endconversation-tool-behavior) に対しても発火しません。
1826
1827 特定のパスを `@` 参照からブロックしたり、挿入をオフにしたりできます:
1803 1828
1804 PreToolUse は [`EndConversation`](/docs/ja/tools-reference#endconversation-tool-behavior) に対しても発火しません。1829 * **特定のパスをブロックする**:それらのパスに対する [`Read` の拒否ルール](/docs/ja/permissions#read-and-edit)を追加します
1830 * **挿入をオフにする**:シェル、ユーザー設定、または管理設定で [`CLAUDE_CODE_DISABLE_FILE_MENTIONS=1`](/docs/ja/env-vars#variables) を設定します。これにより Claude は、メンションされたパスを、ファイルツールで読み取るよう促す注記とともに受け取ります。Claude がそうした場合、マッチする PreToolUse フックが実行されます。この変数には Claude Code v2.1.299 以降が必要で、プロジェクト設定とローカル設定では Claude Code によって無視されます。
1805</Warning>1831</Warning>
1806 1832
1807ツール呼び出しを許可、拒否、確認、または遅延させるには、[PreToolUse の判定制御](#pretooluse-decision-control)を使用します。1833[PreToolUse の決定制御](#pretooluse-decision-control)を使用して、ツール呼び出しを許可、拒否、確認、または遅延します。
1808 1834
1809タイムアウトを超えた `PreToolUse` の [Agent SDK コールバックフック](/docs/ja/agent-sdk/hooks)はツール呼び出しをブロックし、Claude はタイムアウトを示すエラー結果を受け取ります。別のフックが返した明示的な拒否は引き続き優先されます。1835タイムアウトを超えた `PreToolUse` の [Agent SDK コールバックフック](/docs/ja/agent-sdk/hooks)はツール呼び出しをブロックし、Claude はタイムアウトを示すエラー結果を受け取ります。別のフックが返した明示的な拒否は引き続き優先されます。
1810 1836
1812 PreToolUse の入力1838 PreToolUse の入力
1813</h4>1839</h4>
1814 1840
1815[共通の入力フィールド](#common-input-fields)に加えて、PreToolUse フックは `tool_name`、`tool_input`、`tool_use_id` を受け取ります。1841[共通入力フィールド](#common-input-fields)に加えて、PreToolUse フックは `tool_name`、`tool_input`、`tool_use_id` を受け取ります。
1816 1842
1817[MCP ツール](#match-mcp-tools)の場合、入力には `mcp_server` も含まれます。これは、サーバーの `name` と、サーバーの定義がどこから来たかを示す `source` を持つオブジェクトです。`source` の値には、`plugin`、`sdk`、および `user` や `project` などの設定スコープがあります。Agent SDK リファレンスの [`McpServerProvenance`](/docs/ja/agent-sdk/typescript#mcpserverprovenance) にすべての値の一覧と、認識できない値の扱い方が記載されています。信頼の判断は、`name` や `mcp__<server>__` というツール名のプレフィックスではなく、`source` に基づいて行ってください。`mcp_server` フィールドには Claude Code v2.1.274 以降が必要です。1843[MCP ツール](#match-mcp-tools)の場合、入力には `mcp_server` も含まれます。これは、サーバーの `name` と、サーバーの定義の出所を示す `source` を持つオブジェクトです。`source` の値には、`plugin`、`sdk`、および `user` や `project` などの設定スコープが含まれます。Agent SDK リファレンスの [`McpServerProvenance`](/docs/ja/agent-sdk/typescript#mcpserverprovenance) にすべての値が記載されており、認識できない値の扱い方も説明されています。信頼に関する判断は、`name` や `mcp__<server>__` というツール名のプレフィックスではなく、`source` に基づいて行ってください。`mcp_server` フィールドには Claude Code v2.1.274 以降が必要です。
1818 1844
1819ファイルツールの `Write`、`Edit`、`Read` では、`tool_input.file_path` は常に絶対パスです。1845ファイルツールの `Write`、`Edit`、`Read` では、`tool_input.file_path` は常に絶対パスです:
1820 1846
1821* Claude Code はフックの実行前に `~` と相対パスを展開するため、パスでマッチするフックを `~` や同じパスの相対表記でバイパスすることはできません1847* Claude Code はフックの実行前に `~` と相対パスを展開するため、パスでマッチするフックが `~` や同じパスの相対表記によって回避されることはありません
1822* Windows では、`$PWD` が `/c/project` のように見える Git Bash でフックを実行している場合でも、パスはバックスラッシュ区切りで届きます1848* Windows では、フックが `$PWD` が `/c/project` のように見える Git Bash で実行される場合でも、パスはバックスラッシュ区切りで届きます
1823* `/src/` のチェックなど、スラッシュで書かれた比較はバックスラッシュのパスには決してマッチせず、フックがブロックするものがなかったかのようにツール呼び出しが続行されます1849* `/src/` のチェックなど、スラッシュで書かれた比較はバックスラッシュのパスには決してマッチせず、ツール呼び出しはフックがブロックするものがなかったかのように続行されます
1824* 比較の前に区切り文字を正規化してください。Bash では `FILE_PATH="${FILE_PATH//\\//}"`、Python では `file_path.replace("\\", "/")` を使用し、パスは絶対パスであるため、`^` で先頭に固定するのではなく `/src/` などのパスセグメントでマッチさせてください1850* 比較の前に区切り文字を正規化してください。Bash では `FILE_PATH="${FILE_PATH//\\//}"`、Python では `file_path.replace("\\", "/")` を使用します。その後、パスは絶対パスなので、`^` で先頭を固定するのではなく、`/src/` などのパスセグメントでマッチさせます
1825 1851
1826Windows での `Write` 呼び出しでは次のように渡されます。1852Windows での `Write` 呼び出しでは次が渡されます:
1827 1853
1828```json theme={null}1854```json theme={null}
1829{1855{
1837}1863}
1838```1864```
1839 1865
1840`tool_input` のフィールドはツールによって異なります。1866`tool_input` のフィールドはツールによって異なります:
1841 1867
1842<a id="bash" />1868<a id="bash" />
1843 1869
1850| フィールド | 型 | 例 | 説明 |1876| フィールド | 型 | 例 | 説明 |
1851| :- | :- | :- | :- |1877| :- | :- | :- | :- |
1852| `command` | string | `"npm test"` | 実行するシェルコマンド |1878| `command` | string | `"npm test"` | 実行するシェルコマンド |
1853| `description` | string | `"Run test suite"` | コマンドの動作についての説明(オプション) |1879| `description` | string | `"Run test suite"` | コマンドの動作に関する説明(任意) |
1854| `timeout` | number | `120000` | ミリ秒単位のタイムアウト(オプション)。[最大値](/docs/ja/tools-reference#bash-tool-behavior)を超える値は拒否されず、最大値に切り下げられます |1880| `timeout` | number | `120000` | ミリ秒単位のタイムアウト(任意)。[上限](/docs/ja/tools-reference#bash-tool-behavior)を超える値は拒否されず、上限に切り下げられます |
1855| `run_in_background` | boolean | `false` | コマンドをバックグラウンドで実行するかどうか |1881| `run_in_background` | boolean | `false` | コマンドをバックグラウンドで実行するかどうか |
1856 1882
1857Bash コマンドが Git リポジトリ内のファイルを変更した場合、Claude Code は変更内容を記録できます。[`bashEditDiffEnabled`](/docs/ja/settings-reference#basheditdiffenabled) 設定で記録がオンになっている場合は、すべての権限モードで変更を記録します。どのファイルでこの設定を指定できるかは、その設定のエントリに記載されています。それ以外の場合は、auto モードと `bypassPermissions` モードでのみ、かつ Claude Code が Claude に Bash を通じてファイルを編集するよう指示した場合にのみ記録します。記録をオフにするには、`bashEditDiffEnabled` を `false` に設定してください。バックグラウンドのコマンドと読み取り専用のコマンドには差分は含まれません。1883Bash コマンドが Git リポジトリ内のファイルを変更すると、Claude Code は変更内容を記録できます。[`bashEditDiffEnabled`](/docs/ja/settings-reference#basheditdiffenabled) 設定で記録がオンになっている場合は、すべての権限モードで変更を記録します。どのファイルでこの設定を行えるかは、その設定の項目を参照してください。それ以外の場合は、auto モードと `bypassPermissions` モードでのみ、かつ Claude Code が Bash を通じてファイルを編集するよう Claude に指示した場合にのみ記録します。記録をオフにするには、`bashEditDiffEnabled` を `false` に設定します。バックグラウンドのコマンドと読み取り専用のコマンドには差分は含まれません。
1858 1884
1859その後、[PostToolUse フック](#posttooluse)は `tool_response.bashEditDiff` で変更されたファイルを受け取ります。このリストは、コマンドの実行中にリポジトリ配下で変更された内容をカバーします。Git が無視するファイルやサブモジュール内のファイルは含まれません。Claude Code v2.1.269 以降が必要です。1885その後、[PostToolUse フック](#posttooluse)は `tool_response.bashEditDiff` で変更されたファイルを受け取ります。このリストには、コマンドの実行中にリポジトリ配下で変更されたものが含まれます。Git が無視するファイルとサブモジュール内のファイルは含まれません。Claude Code v2.1.269 以降が必要です。
1860 1886
1861<Note>1887<Note>
1862 このリストはベストエフォートであり、パブリックベータです。Claude Code は変更を見逃したり、別のプロセスが同時に変更したファイルを含めたり、サイズ制限で打ち切ったりする場合があります。フィールドの形式は変更される可能性があります。このリストはレビュー対象を見つけるために使用し、ポリシーの強制には使用しないでください。1888 このリストはベストエフォートであり、パブリックベータです。Claude Code が変更を見逃したり、同時に別のプロセスが変更したファイルを含めたり、サイズ制限で打ち切ったりする場合があります。フィールドの形式は変更される可能性があります。このリストは、ポリシーの強制ではなく、レビューすべき対象を見つけるために使用してください。
1863</Note>1889</Note>
1864 1890
1865`changedFiles` と `files` はコマンドが変更した内容を列挙し、残りのフィールドはそのリストがどの程度完全で信頼できるかを示します。1891`changedFiles` と `files` はコマンドが変更した内容を列挙し、残りのフィールドはそのリストがどの程度完全で信頼できるかを示します。
1866 1892
1867| フィールド | 型 | 例 | 説明 |1893| フィールド | 型 | 例 | 説明 |
1868| :- | :- | :- | :- |1894| :- | :- | :- | :- |
1869| `changedFiles` | array | `["/path/to/src/app.ts"]` | コマンドが変更したファイルの絶対パス(最大 200 件)。`files` に差分が含まれている場合、または `moreFiles` が 0 より大きい場合に常に存在します |1895| `changedFiles` | array | `["/path/to/src/app.ts"]` | コマンドが変更したファイルの絶対パス(最大 200 件)。`files` に差分が含まれる場合、または `moreFiles` が 0 より大きい場合に必ず存在します |
1870| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | 表示用の、最大 5 件の変更されたファイルの差分。コマンドが追加または削除したファイルでは、`created` または `deleted` が `true` になります |1896| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | 表示用の、最大 5 つの変更されたファイルの差分。コマンドが追加または削除したファイルでは、`created` または `deleted` が `true` になります |
1871| `moreFiles` | number | `2` | `files` に差分が含まれていない変更されたファイルの数 |1897| `moreFiles` | number | `2` | `files` に差分がない変更されたファイルの数 |
1872| `unavailable` | boolean | `true` | 差分が不完全な場合、または取得できなかった場合に設定されます |1898| `unavailable` | boolean | `true` | 差分が不完全な場合、または取得できなかった場合に設定されます |
1873| `skipped` | boolean | `true` | `git checkout` や `git stash` など、作業ツリーを移動する Git コマンドの場合に設定され、Claude Code は差分を取得しません |1899| `skipped` | boolean | `true` | `git checkout` や `git stash` など、作業ツリーを移動する Git コマンドに対して設定され、Claude Code は差分を取得しません |
1874| `shared` | boolean | `true` | サブエージェントのものなど、別の Bash ツール呼び出しが同時に同じリポジトリで実行された場合に設定されます。そのため、列挙された変更の一部はそのコマンドによるものである可能性があります |1900| `shared` | boolean | `true` | サブエージェントのものなど、別の Bash ツール呼び出しが同時に同じリポジトリで実行された場合に設定されます。列挙された変更の一部はそのコマンドによるものである可能性があります |
1875 1901
1876<a id="powershell" />1902<a id="powershell" />
1877 1903
1881 1907
1882PowerShell コマンドを実行します。プラットフォームごとの利用可否については、[PowerShell ツール](/docs/ja/tools-reference#powershell-tool)を参照してください。1908PowerShell コマンドを実行します。プラットフォームごとの利用可否については、[PowerShell ツール](/docs/ja/tools-reference#powershell-tool)を参照してください。
1883 1909
1884フィールドは Bash ツールと同じで、コマンド文字列は `command` に含まれます。1910フィールドは Bash ツールと同じで、コマンド文字列は `command` に入ります:
1885 1911
1886| フィールド | 型 | 例 | 説明 |1912| フィールド | 型 | 例 | 説明 |
1887| :- | :- | :- | :- |1913| :- | :- | :- | :- |
1888| `command` | string | `"Get-ChildItem -Recurse"` | 実行する PowerShell コマンド |1914| `command` | string | `"Get-ChildItem -Recurse"` | 実行する PowerShell コマンド |
1889| `description` | string | `"List files recursively"` | コマンドの動作についての説明(オプション) |1915| `description` | string | `"List files recursively"` | コマンドの動作に関する説明(任意) |
1890| `timeout` | number | `120000` | ミリ秒単位のタイムアウト(オプション) |1916| `timeout` | number | `120000` | ミリ秒単位のタイムアウト(任意) |
1891| `run_in_background` | boolean | `false` | コマンドをバックグラウンドで実行するかどうか |1917| `run_in_background` | boolean | `false` | コマンドをバックグラウンドで実行するかどうか |
1892 1918
1893シェルコマンドを検査するフックでは、両方のツールをカバーするように `Bash|PowerShell` にマッチさせてください。1919シェルコマンドを検査するフックでは `Bash|PowerShell` をマッチさせ、両方のツールをカバーしてください:
1894 1920
1895* Windows では、PowerShell ツールが有効になっている環境であればどこでも、Claude は PowerShell をプライマリシェルとして扱い、シェルコマンドをそこに経由させます。1921* Windows では、PowerShell ツールが有効になっている場合は常に、Claude は PowerShell をプライマリシェルとして扱い、シェルコマンドをそれ経由で実行します。
1896* Git Bash がない Windows では、このツールは自動的に有効になり、Claude Code は Bash ツールをまったく登録しません。1922* Git Bash のない Windows では、このツールが自動的に有効になり、Claude Code は Bash ツールをまったく登録しません。
1897* `Bash` のみにマッチするフックは、そこでは決して発火しません。1923* `Bash` のみにマッチするフックは、そこでは決して発火しません。
1898 1924
1899<h5 id="write">1925<h5 id="write">
1904 1930
1905| フィールド | 型 | 例 | 説明 |1931| フィールド | 型 | 例 | 説明 |
1906| :- | :- | :- | :- |1932| :- | :- | :- | :- |
1907| `file_path` | string | `"/path/to/file.txt"` | 書き込むファイルの絶対パス |1933| `file_path` | string | `"/path/to/file.txt"` | 書き込むファイルへの絶対パス |
1908| `content` | string | `"file content"` | ファイルに書き込む内容 |1934| `content` | string | `"file content"` | ファイルに書き込む内容 |
1909 1935
1910<h5 id="edit">1936<h5 id="edit">
1915 1941
1916| フィールド | 型 | 例 | 説明 |1942| フィールド | 型 | 例 | 説明 |
1917| :- | :- | :- | :- |1943| :- | :- | :- | :- |
1918| `file_path` | string | `"/path/to/file.txt"` | 編集するファイルの絶対パス |1944| `file_path` | string | `"/path/to/file.txt"` | 編集するファイルへの絶対パス |
1919| `old_string` | string | `"original text"` | 検索して置換するテキスト |1945| `old_string` | string | `"original text"` | 検索して置換するテキスト |
1920| `new_string` | string | `"replacement text"` | 置換後のテキスト |1946| `new_string` | string | `"replacement text"` | 置換後のテキスト |
1921| `replace_all` | boolean | `false` | すべての出現箇所を置換するかどうか |1947| `replace_all` | boolean | `false` | すべての出現箇所を置換するかどうか |
1928 1954
1929| フィールド | 型 | 例 | 説明 |1955| フィールド | 型 | 例 | 説明 |
1930| :- | :- | :- | :- |1956| :- | :- | :- | :- |
1931| `file_path` | string | `"/path/to/file.txt"` | 読み取るファイルの絶対パス |1957| `file_path` | string | `"/path/to/file.txt"` | 読み取るファイルへの絶対パス |
1932| `offset` | number | `10` | 読み取りを開始する行番号(オプション) |1958| `offset` | number | `10` | 読み取りを開始する行番号(任意) |
1933| `limit` | number | `50` | 読み取る行数(オプション) |1959| `limit` | number | `50` | 読み取る行数(任意) |
1934 1960
1935<h5 id="glob">1961<h5 id="glob">
1936 Glob1962 Glob
1937</h5>1963</h5>
1938 1964
1939glob パターンに一致するファイルを検索します。1965glob パターンにマッチするファイルを検索します。
1940 1966
1941| フィールド | 型 | 例 | 説明 |1967| フィールド | 型 | 例 | 説明 |
1942| :- | :- | :- | :- |1968| :- | :- | :- | :- |
1943| `pattern` | string | `"**/*.ts"` | ファイルを照合する glob パターン |1969| `pattern` | string | `"**/*.ts"` | ファイルをマッチさせる glob パターン |
1944| `path` | string | `"/path/to/dir"` | 検索するディレクトリ(オプション)。デフォルトは現在の作業ディレクトリです |1970| `path` | string | `"/path/to/dir"` | 検索するディレクトリ(任意)。デフォルトは現在の作業ディレクトリです |
1945 1971
1946<h5 id="grep">1972<h5 id="grep">
1947 Grep1973 Grep
1952| フィールド | 型 | 例 | 説明 |1978| フィールド | 型 | 例 | 説明 |
1953| :- | :- | :- | :- |1979| :- | :- | :- | :- |
1954| `pattern` | string | `"TODO.*fix"` | 検索する正規表現パターン |1980| `pattern` | string | `"TODO.*fix"` | 検索する正規表現パターン |
1955| `path` | string | `"/path/to/dir"` | 検索するファイルまたはディレクトリ(オプション) |1981| `path` | string | `"/path/to/dir"` | 検索するファイルまたはディレクトリ(任意) |
1956| `glob` | string | `"*.ts"` | ファイルを絞り込む glob パターン(オプション) |1982| `glob` | string | `"*.ts"` | ファイルを絞り込む glob パターン(任意) |
1957| `output_mode` | string | `"content"` | `"content"`、`"files_with_matches"`、または `"count"`。デフォルトは `"files_with_matches"` です |1983| `output_mode` | string | `"content"` | `"content"`、`"files_with_matches"`、または `"count"`。デフォルトは `"files_with_matches"` です |
1958| `-i` | boolean | `true` | 大文字と小文字を区別しない検索 |1984| `-i` | boolean | `true` | 大文字と小文字を区別しない検索 |
1959| `multiline` | boolean | `false` | 複数行マッチングを有効にする |1985| `multiline` | boolean | `false` | 複数行マッチングを有効にする |
1966 1992
1967| フィールド | 型 | 例 | 説明 |1993| フィールド | 型 | 例 | 説明 |
1968| :- | :- | :- | :- |1994| :- | :- | :- | :- |
1969| `url` | string | `"https://example.com/api"` | コンテンツを取得する URL |1995| `url` | string | `"https://example.com/api"` | コンテンツの取得元 URL |
1970| `prompt` | string | `"Extract the API endpoints"` | 取得したコンテンツに対して実行するプロンプト |1996| `prompt` | string | `"Extract the API endpoints"` | 取得したコンテンツに対して実行するプロンプト |
1971| `offset` | number | `100000` | ページの先頭からスキップする文字数(オプション)。Claude は長いページの続きを読むためにこれを設定します。Claude Code v2.1.290 以降が必要です |1997| `offset` | number | `100000` | ページの先頭からスキップする文字数(任意)。Claude は長いページの続きを読むためにこれを設定します。Claude Code v2.1.290 以降が必要です |
1972 1998
1973<h5 id="websearch">1999<h5 id="websearch">
1974 WebSearch2000 WebSearch
1979| フィールド | 型 | 例 | 説明 |2005| フィールド | 型 | 例 | 説明 |
1980| :- | :- | :- | :- |2006| :- | :- | :- | :- |
1981| `query` | string | `"react hooks best practices"` | 検索クエリ |2007| `query` | string | `"react hooks best practices"` | 検索クエリ |
1982| `allowed_domains` | array | `["docs.example.com"]` | オプション:これらのドメインの結果のみを含める |2008| `allowed_domains` | array | `["docs.example.com"]` | 任意:これらのドメインの結果のみを含めます |
1983| `blocked_domains` | array | `["spam.example.com"]` | オプション:これらのドメインの結果を除外する |2009| `blocked_domains` | array | `["spam.example.com"]` | 任意:これらのドメインの結果を除外します |
1984 2010
1985<h5 id="agent">2011<h5 id="agent">
1986 Agent2012 Agent
1993| `prompt` | string | `"Find all API endpoints"` | エージェントが実行するタスク |2019| `prompt` | string | `"Find all API endpoints"` | エージェントが実行するタスク |
1994| `description` | string | `"Find API endpoints"` | タスクの短い説明 |2020| `description` | string | `"Find API endpoints"` | タスクの短い説明 |
1995| `subagent_type` | string | `"Explore"` | 使用する専門エージェントの種類 |2021| `subagent_type` | string | `"Explore"` | 使用する専門エージェントの種類 |
1996| `model` | string | `"sonnet"` | デフォルトを上書きするモデルエイリアス(オプション) |2022| `model` | string | `"sonnet"` | デフォルトを上書きするモデルエイリアス(任意) |
1997 2023
1998フォアグラウンドの Agent 呼び出しが完了すると、[PostToolUse フック](#posttooluse)は `tool_response` でサブエージェントの結果と実行のテレメトリを受け取ります。これらのフィールドを読み取って実行内容を検査してください。`totalTokens` と `usage` は最後のリクエストのみを対象としているため、サブエージェント全体のトークンとコストの集計には、`query_source` を `"subagent"` で絞り込んだ[トークンとコストのカウンター](/docs/ja/monitoring-usage#token-counter)を使用してください。2024フォアグラウンドの Agent 呼び出しが完了すると、[PostToolUse フック](#posttooluse)は `tool_response` でサブエージェントの結果と実行のテレメトリを受け取ります。これらのフィールドを読み取って実行内容を調べてください。`totalTokens` と `usage` は最終リクエストのみを対象とするため、サブエージェント全体のトークンとコストの集計には、`query_source` `"subagent"` で絞り込んだ[トークンとコストのカウンター](/docs/ja/monitoring-usage#token-counter)を使用してください:
1999 2025
2000| フィールド | 型 | 例 | 説明 |2026| フィールド | 型 | 例 | 説明 |
2001| :- | :- | :- | :- |2027| :- | :- | :- | :- |
2002| `status` | string | `"completed"` | フォアグラウンドのサブエージェントでは `"completed"`、バックグラウンドのサブエージェントでは `"async_launched"`。サブエージェントはデフォルトでバックグラウンドで実行されるため、`run_in_background` を省略した Agent 呼び出しでも `"async_launched"` になります |2028| `status` | string | `"completed"` | フォアグラウンドのサブエージェントでは `"completed"`、バックグラウンドのサブエージェントでは `"async_launched"`。サブエージェントはデフォルトでバックグラウンドで実行されるため、`run_in_background` を省略した Agent 呼び出しでも `"async_launched"` になります |
2003| `agentId` | string | `"a4d2c8f1e0b3a297"` | サブエージェントの実行の識別子 |2029| `agentId` | string | `"a4d2c8f1e0b3a297"` | サブエージェントの実行の識別子 |
2004| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | サブエージェントの最終テキストブロック。レポートが `SubagentHandback` を経由するサブエージェントの場合は、その代わりにその引き渡しについての短い注記 |2030| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | サブエージェントの最終的なテキストブロック。または、レポートが `SubagentHandback` を経由するサブエージェントの場合は、その代わりにその引き渡しに関する短い注記 |
2005| `resolvedModel` | string | `"claude-sonnet-4-5"` | サブエージェントが開始時に使用したモデル。要求されたモデルと異なる場合があります |2031| `resolvedModel` | string | `"claude-sonnet-4-5"` | サブエージェントが開始時に使用したモデル。要求されたモデルと異なる場合があります |
2006| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | 使用されたモデルを順番に並べたもの(連続する重複はまとめられます)。実行中にモデルが切り替えられた場合にのみ設定されます。Claude Code v2.1.212 以降が必要です |2032| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | 使用されたモデルの順序付きリスト(連続する重複はまとめられます)。実行中にモデルが切り替えられた場合にのみ設定されます。Claude Code v2.1.212 以降が必要です |
2007| `totalTokens` | number | `12450` | サブエージェントの最後の API リクエストのトークン数(入力、出力、キャッシュのトークンの合計)。実行全体の合計ではありません |2033| `totalTokens` | number | `12450` | サブエージェントの最終 API リクエストのトークン数(入力、出力、キャッシュのトークンの合計)。実行全体の合計ではありません |
2008| `totalDurationMs` | number | `48211` | サブエージェントの実行の実時間 |2034| `totalDurationMs` | number | `48211` | サブエージェントの実行の実時間 |
2009| `totalToolUseCount` | number | `7` | サブエージェントが行ったツール呼び出しの数 |2035| `totalToolUseCount` | number | `7` | サブエージェントが行ったツール呼び出しの数 |
2010| `usage` | object | `{"input_tokens": 8320, ...}` | 最後の API リクエストの種類別のトークン内訳:`input_tokens`、`output_tokens`、`cache_creation_input_tokens`、`cache_read_input_tokens` |2036| `usage` | object | `{"input_tokens": 8320, ...}` | 最終 API リクエストのトークンの種類別内訳:`input_tokens`、`output_tokens`、`cache_creation_input_tokens`、`cache_read_input_tokens` |
2011 2037
2012Claude Code v2.1.271 以降では、Claude Code が [auto モード](/docs/ja/permission-modes#eliminate-prompts-with-auto-mode)で提供する [`SubagentHandback`](/docs/ja/tools-reference) ツールを使って実行されるサブエージェントは、レポートをテキストとして返すのではなく、そのツールを通じて渡します。その場合、`completed` の結果の `content` フィールドには、レポート自体ではなく、その引き渡しについての短い注記が含まれます。レポートを読み取るには、`SubagentHandback` にマッチする `PreToolUse` または `PostToolUse` フックで `tool_input.message` を読み取ってください。2038Claude Code v2.1.271 以降では、Claude Code が [auto モード](/docs/ja/permission-modes#eliminate-prompts-with-auto-mode)で提供する [`SubagentHandback`](/docs/ja/tools-reference) ツールを使って実行されるサブエージェントは、レポートをテキストとして返すのではなく、そのツールを通じて配信します。その場合、`completed` の結果の `content` フィールドには、レポート自体ではなく、その引き渡しに関する短い注記が入ります。レポートを読み取るには、`SubagentHandback` に `PreToolUse` または `PostToolUse` フックをマッチさせ、`tool_input.message` を読み取ってください。
2013 2039
2014バックグラウンドのサブエージェントの場合、ツールはタスクがバックグラウンドに移動した時点で戻るため、`tool_response` には使用量のフィールドは含まれません。バックグラウンドでの起動はすぐに戻り、Claude Code が実行中にバックグラウンドに移したフォアグラウンドのタスクはその移行時点で戻ります。このレスポンスには、`status: "async_launched"`、`agentId`、`description`、`prompt`、`outputFile`、`resolvedModel` が含まれます。2040バックグラウンドのサブエージェントの場合、ツールはタスクがバックグラウンドに移った時点で返るため、`tool_response` には使用量のフィールドは含まれません。バックグラウンドでの起動は即座に返り、Claude Code が実行途中でバックグラウンドに移したフォアグラウンドのタスクはその移行時点で返ります。レスポンスには `status: "async_launched"`、`agentId`、`description`、`prompt`、`outputFile`、`resolvedModel` が含まれます。
2015 2041
2016`completed` のレスポンスでは、`resolvedModel` はサブエージェントが開始時に使用したモデルを示します。これは、`availableModels` やその他の上書きが適用される場合など、`tool_input` の `model` の値と異なることがあります。`async_launched` のレスポンスでは、`resolvedModel` はエージェントがバックグラウンドに移動した時点で使用されていたモデルを示すため、バックグラウンドへの移行前に行われた切り替えはそこに反映されます。`modelsUsed` と、バックグラウンド移行時点の `resolvedModel` の動作には Claude Code v2.1.212 以降が必要です。2042`completed` のレスポンスでは、`resolvedModel` はサブエージェントが開始時に使用したモデルを示し、`availableModels` などの上書きが適用された場合など、`tool_input` の `model` の値と異なることがあります。`async_launched` のレスポンスでは、`resolvedModel` はエージェントがバックグラウンドに移った時点で使用されていたモデルを示すため、バックグラウンド化の前に行われた切り替えがそこに反映されます。`modelsUsed` と、バックグラウンド化時点の `resolvedModel` の動作には Claude Code v2.1.212 以降が必要です。
2017 2043
2018<a id="askuserquestion" />2044<a id="askuserquestion" />
2019 2045
2025 2051
2026| フィールド | 型 | 例 | 説明 |2052| フィールド | 型 | 例 | 説明 |
2027| :- | :- | :- | :- |2053| :- | :- | :- | :- |
2028| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React", "description": "Component library"}, {"label": "Vue", "description": "Progressive framework"}], "multiSelect": false}]` | 提示する質問。それぞれに `question` 文字列、短い `header`、`options` 配列、オプションの `multiSelect` フラグがあります |2054| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React", "description": "Component library"}, {"label": "Vue", "description": "Progressive framework"}], "multiSelect": false}]` | 提示する質問。それぞれ `question` 文字列、短い `header`、`options` 配列、任意の `multiSelect` フラグを持ちます |
2029| `answers` | object | `{"Which framework?": "React"}` | オプション。質問のテキストを選択されたオプションのラベルに対応付けます。複数選択の回答は、ラベルをカンマで連結します。Claude はこのフィールドを設定しません。プログラムで回答するには、`updatedInput` を通じて指定してください |2055| `answers` | object | `{"Which framework?": "React"}` | 任意。質問テキストを選択されたオプションのラベルに対応付けます。複数選択の回答はラベルをカンマで結合します。Claude はこのフィールドを設定しません。プログラムで回答するには `updatedInput` を通じて指定します |
2030 2056
2031<h5 id="exitplanmode">2057<h5 id="exitplanmode">
2032 ExitPlanMode2058 ExitPlanMode
2033</h5>2059</h5>
2034 2060
2035Claude が [plan モード](/docs/ja/permission-modes#analyze-before-you-edit-with-plan-mode)を終了する前に、計画を提示してユーザーに承認を求めます。Claude はツールを呼び出す前に計画をディスク上のファイルに書き込むため、モデルからの実際の `tool_input` は通常空です。Claude Code は、入力をフックに渡す前に計画の内容とファイルパスを挿入します。2061計画を提示し、Claude が [plan モード](/docs/ja/permission-modes#analyze-before-you-edit-with-plan-mode)を終了する前にユーザーに承認を求めます。Claude はツールを呼び出す前に計画をディスク上のファイルに書き込むため、モデルからのそのままの `tool_input` は通常空です。Claude Code は、入力をフックに渡す前に計画の内容とファイルパスを挿入します。
2036 2062
2037| フィールド | 型 | 例 | 説明 |2063| フィールド | 型 | 例 | 説明 |
2038| :- | :- | :- | :- |2064| :- | :- | :- | :- |
2039| `plan` | string | `"## Refactor auth\n1. Extract..."` | Markdown 形式の計画の内容。ディスク上の計画ファイルから挿入されます |2065| `plan` | string | `"## Refactor auth\n1. Extract..."` | Markdown 形式の計画の内容。ディスク上の計画ファイルから挿入されます |
2040| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | 計画ファイルのパス。挿入されます |2066| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | 計画ファイルへのパス。挿入されます |
2041| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | 非推奨。Claude Code はこのフィールドを受け付けますが無視します。v2.1.205 より前は、Claude が計画を実装するために要求したプロンプトベースの権限を保持していました |2067| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | 非推奨。Claude Code はこのフィールドを受け付けますが無視します。v2.1.205 より前は、計画を実装するために Claude が要求したプロンプトベースの権限を保持していました |
2042 2068
2043`PostToolUse` では、`tool_response` は承認された計画を保持する `plan` と `filePath` フィールド、および内部のステータスフラグを持つオブジェクトです。計画の内容は、ディスクからファイルを再度読み取るのではなく、`tool_response.plan` から読み取ってください。2069`PostToolUse` では、`tool_response` は承認された計画を保持する `plan` と `filePath` のフィールドと、内部のステータスフラグを持つオブジェクトです。計画の内容は、ディスクからファイルを読み直すのではなく、`tool_response.plan` から読み取ってください。
2044 2070
2045<h4 id="pretooluse-decision-control">2071<h4 id="pretooluse-decision-control">
2046 PreToolUse の判定制御2072 PreToolUse の決定制御
2047</h4>2073</h4>
2048 2074
2049`PreToolUse` フックは、ツール呼び出しを続行するかどうかを制御できます。トップレベルの `decision` フィールドを使用する他のフックとは異なり、PreToolUse は `hookSpecificOutput` オブジェクト内で判定を返します。これにより、4 つの結果(allow、deny、ask、defer)に加えて、実行前にツールの入力を変更する機能という、より豊富な制御が可能になります。2075`PreToolUse` フックは、ツール呼び出しを続行するかどうかを制御できます。トップレベルの `decision` フィールドを使用する他のフックとは異なり、PreToolUse は `hookSpecificOutput` オブジェクト内で決定を返します。これにより、4 つの結果(allow、deny、ask、defer)に加えて、実行前にツールの入力を変更する機能という、より豊富な制御が可能になります。
2050 2076
2051| フィールド | 説明 |2077| フィールド | 説明 |
2052| :- | :- |2078| :- | :- |
2053| `permissionDecision` | `"allow"` は権限プロンプトをスキップします。ただし、[どのモードでも自動承認されない操作](/docs/ja/permission-modes#actions-no-mode-auto-approves)、[ネットワークパスからの読み取り](/docs/ja/permissions#network-paths)、および[`updatedInput` との組み合わせ](#allow-with-updatedinput)が必要な `AskUserQuestion` と `ExitPlanMode` は除きます。`"deny"` はツール呼び出しを防ぎます。`"ask"` はユーザーに確認を求めます。`"defer"` は、後でツールを再開できるように正常に終了します。フックが何を返したかにかかわらず、[拒否ルールと確認ルール](/docs/ja/permissions#manage-permissions)は引き続き評価されます |2079| `permissionDecision` | `"allow"` は権限プロンプトをスキップします。ただし、[どのモードでも自動承認されないアクション](/docs/ja/permission-modes#actions-no-mode-auto-approves)、[ネットワークパスからの読み取り](/docs/ja/permissions#network-paths)、および [`updatedInput` との組み合わせ](#allow-with-updatedinput)が必要な `AskUserQuestion` と `ExitPlanMode` は除きます。`"deny"` はツール呼び出しを防ぎます。`"ask"` はユーザーに確認を求めます。`"defer"` は正常に終了し、後でツールを再開できるようにします。フックが何を返しても、[拒否ルールと確認ルール](/docs/ja/permissions#manage-permissions)は引き続き評価されます |
2054| `permissionDecisionReason` | `"ask"` の場合、権限プロンプトでユーザーに表示されます。誰もそのプロンプトに回答できない `-p` の実行で Claude Code が[呼び出しを拒否する](/docs/ja/headless#turn-off-permission-prompts-in-unattended-runs)場合は、代わりに Claude がツールの結果でその理由を読み取ります。`"deny"` の場合は Claude に表示されます。`"allow"` と `"defer"` の場合は、[デバッグログ](#debug-hooks)にのみ書き込まれます |2080| `permissionDecisionReason` | `"ask"` の場合、権限プロンプトでユーザーに表示されます。そのプロンプトに誰も応答できない `-p` の実行で Claude Code が[呼び出しを拒否する](/docs/ja/headless#turn-off-permission-prompts-in-unattended-runs)場合は、代わりに Claude がツールの結果でその理由を読み取ります。`"deny"` の場合、Claude に表示されます。`"allow"` と `"defer"` の場合、[デバッグログ](#debug-hooks)にのみ書き込まれます |
2055| `updatedInput` | 実行前にツールの入力パラメーターを変更します。入力オブジェクト全体を置き換えるため、変更したフィールドとともに変更していないフィールドも含めてください。Claude Code は、権限ルールと Bash コマンドの[自動バックグラウンド化の適格性](/docs/ja/tools-reference#foreground-commands-that-move-to-the-background)を、Claude が送信した入力ではなく、フックが返した入力に対して評価します。自動承認するには `"allow"` と、変更された入力をユーザーに表示するには `"ask"` と組み合わせます。`"defer"` の場合は無視されます |2081| `updatedInput` | 実行前にツールの入力パラメータを変更します。入力オブジェクト全体を置き換えるため、変更したフィールドとともに変更していないフィールドも含めてください。Claude Code は、権限ルールと Bash コマンドの[自動バックグラウンド化の適格性](/docs/ja/tools-reference#foreground-commands-that-move-to-the-background)を、Claude が送信した入力ではなく、フックが返した入力に対して評価します。自動承認するには `"allow"` と、変更した入力をユーザーに表示するには `"ask"` と組み合わせます。`"defer"` の場合は無視されます |
2056| `additionalContext` | ツールの結果とともに Claude のコンテキストに追加される文字列。`permissionDecision` が `"defer"` の場合は無視されます。[Claude にコンテキストを追加する](#add-context-for-claude)を参照してください |2082| `additionalContext` | ツールの結果とともに Claude のコンテキストに追加される文字列。`permissionDecision` が `"defer"` の場合は無視されます。[Claude にコンテキストを追加する](#add-context-for-claude)を参照してください |
2057 2083
2058複数の PreToolUse フックが異なる判定を返した場合、優先順位は `deny` > `defer` > `ask` > `allow` です。2084複数の PreToolUse フックが異なる決定を返した場合、優先順位は `deny` > `defer` > `ask` > `allow` です。
2059 2085
2060終了コード 2 で終了してブロックするフックは、`"deny"` と同じ方法で処理されます。Claude は標準エラー出力のメッセージを拒否理由として受け取ります。2086終了コード 2 でブロックするフックは `"deny"` と同じように扱われます。Claude は stderr のメッセージを拒否の理由として受け取ります。
2061 2087
2062フックが `"ask"` を返すと、ユーザーに表示される権限プロンプトには、フックの出所を示すラベルが含まれます。任意の設定ファイルまたはエージェントのフロントマターからのフックには `[settings]`、プラグインのフックには `[plugin:<name>]`、スキルのフロントマターからのフックには `[skill]` が表示されます。これにより、ユーザーはどの設定ソースが確認を求めているかを把握できます。2088フックが `"ask"` を返すと、ユーザーに表示される権限プロンプトには、フックの出所を示すラベルが含まれます。任意の設定ファイルまたはエージェントのフロントマターからのフックでは `[settings]`、プラグインのフックでは `[plugin:<name>]`、スキルのフロントマターからのフックでは `[skill]` です。これにより、どの設定ソースが確認を求めているかをユーザーが把握できます。
2063 2089
2064フックの `"ask"` は、[auto モード](/docs/ja/permission-modes#eliminate-prompts-with-auto-mode)でも権限プロンプトを強制します。分類器はツール呼び出しを拒否することはできますが、暗黙的に承認することはできません。v2.1.211 より前は、分類器は[サンドボックス](/docs/ja/sandboxing)の外で実行される Bash コマンドを、フックが要求したプロンプトを表示せずに承認できました。その場合でも分類器はそのコマンドに独自の安全ルールを適用しており、フックの `"deny"` は常に尊重されていました。2090フックの `"ask"` は、[auto モード](/docs/ja/permission-modes#eliminate-prompts-with-auto-mode)でも権限プロンプトを強制します。分類器は引き続きツール呼び出しを拒否できますが、呼び出しを暗黙的に承認することはできません。v2.1.211 より前は、分類器は[サンドボックス](/docs/ja/sandboxing)外で実行される Bash コマンドを、フックが要求したプロンプトを表示せずに承認できました。その場合も分類器はそのコマンドに独自の安全ルールを適用しており、フックの `"deny"` は常に尊重されていました。
2065 2091
2066```json theme={null}2092```json theme={null}
2067{2093{
2078```2104```
2079 2105
2080<Note>2106<Note>
2081 PreToolUse では以前トップレベルの `decision` と `reason` フィールドを使用していましたが、このイベントではこれらは非推奨です。代わりに `hookSpecificOutput.permissionDecision` と `hookSpecificOutput.permissionDecisionReason` を使用してください。非推奨の値 `"approve"` と `"block"` は、それぞれ `"allow"` と `"deny"` に対応します。PostToolUse や Stop などの他のイベントでは、引き続きトップレベルの `decision` と `reason` が現在の形式として使用されます。2107 PreToolUse は以前はトップレベルの `decision` と `reason` フィールドを使用していましたが、このイベントではこれらは非推奨です。代わりに `hookSpecificOutput.permissionDecision` と `hookSpecificOutput.permissionDecisionReason` を使用してください。非推奨の値 `"approve"` と `"block"` は、それぞれ `"allow"` と `"deny"` に対応します。PostToolUse や Stop などの他のイベントは、引き続きトップレベルの `decision` と `reason` を現在の形式として使用します。
2082</Note>2108</Note>
2083 2109
2084<h4 id="allow-with-updatedinput">2110<h4 id="allow-with-updatedinput">
2087 2113
2088`AskUserQuestion` と `ExitPlanMode` はユーザーの操作を必要とします。`-p` フラグを使用した[非対話モード](/docs/ja/headless)では、Claude Code は、Agent SDK の `canUseTool` コールバックなど、プロンプトを受け取る[権限ホスト](/docs/ja/headless#turn-off-permission-prompts-in-unattended-runs)が実行にある場合にのみ、これらのツールを提供します。2114`AskUserQuestion` と `ExitPlanMode` はユーザーの操作を必要とします。`-p` フラグを使用した[非対話モード](/docs/ja/headless)では、Claude Code は、Agent SDK の `canUseTool` コールバックなど、プロンプトを受け取る[権限ホスト](/docs/ja/headless#turn-off-permission-prompts-in-unattended-runs)が実行にある場合にのみ、これらのツールを提供します。
2089 2115
2090`PreToolUse` フックは、次のことを行う場合にその要件を満たします。2116`PreToolUse` フックは、次のことを行うことでその要件を満たします:
2091 2117
20921. 標準入力からツールの入力を読み取る21181. stdin からツールの入力を読み取る
20932. 独自の UI を通じて回答を収集する21192. 独自の UI で回答を収集する
20943. 回答を保持する `updatedInput` とともに `permissionDecision: "allow"` を返し、ツールがプロンプトなしで実行されるようにする21203. 回答を保持する `updatedInput` とともに `permissionDecision: "allow"` を返し、プロンプトなしでツールが実行されるようにする
2095 2121
2096これらのツールでは、`"allow"` を返すだけでは不十分です。2122これらのツールでは、`"allow"` を返すだけでは不十分です。
2097 2123
2098`AskUserQuestion` の場合は、元の `questions` 配列をそのまま返し、各質問のテキストを選択された回答に対応付ける [`answers`](#askuserquestion) オブジェクトを追加します。次の出力は、1 つの質問に `React` と回答しています。2124`AskUserQuestion` では、元の `questions` 配列をそのまま返し、各質問のテキストを選択された回答に対応付ける [`answers`](#askuserquestion) オブジェクトを追加します。この出力は、1 つの質問に `React` と回答します:
2099 2125
2100```json theme={null}2126```json theme={null}
2101{2127{
2117}2143}
2118```2144```
2119 2145
2120サーバーが [`_meta["anthropic/requiresUserInteraction"]`](/docs/ja/mcp#require-approval-for-a-specific-tool) でマークした MCP ツールはより厳格です。Claude Code はフックがツールに必要な操作を収集したことを確認できないため、`updatedInput` の有無にかかわらず、フックは `"allow"` でその承認プロンプトをスキップできません。2146サーバーが [`_meta["anthropic/requiresUserInteraction"]`](/docs/ja/mcp#require-approval-for-a-specific-tool) でマークした MCP ツールはより厳格です。フックは、`updatedInput` の有無にかかわらず、`"allow"` でその承認プロンプトをスキップすることはできません。ツールが必要とする操作をフックが収集したことを Claude Code が確認できないためです。
2121 2147
2122<h4 id="defer-a-tool-call-for-later">2148<h4 id="defer-a-tool-call-for-later">
2123 ツール呼び出しを後で処理するために遅延させる2149 ツール呼び出しを後回しにする
2124</h4>2150</h4>
2125 2151
2126`"defer"` は、Agent SDK アプリや Claude Code 上に構築したカスタム UI など、`claude -p` をサブプロセスとして実行し、その JSON 出力を読み取るインテグレーション向けです。これにより、呼び出し元のプロセスはツール呼び出しの時点で Claude を一時停止し、独自のインターフェースを通じて入力を収集し、中断したところから再開できます。Claude Code がこの値を尊重するのは、`-p` フラグを使用した[非対話モード](/docs/ja/headless)の場合のみです。対話セッションでは警告をログに記録し、フックの結果を無視します。2152`"defer"` は、Agent SDK アプリや Claude Code 上に構築したカスタム UI など、`claude -p` をサブプロセスとして実行し、その JSON 出力を読み取る統合向けです。これにより、呼び出し側のプロセスは、ツール呼び出しの時点で Claude を一時停止し、独自のインターフェースで入力を収集して、中断したところから再開できます。Claude Code がこの値を尊重するのは、`-p` フラグを使用した[非対話モード](/docs/ja/headless)の場合のみです。対話セッションでは警告をログに記録し、フックの結果を無視します。
2127 2153
2128典型的なケースは `AskUserQuestion` ツールです。Claude はユーザーに何かを尋ねたいものの、回答するためのターミナルがありません。`-p` の実行では、`--permission-prompt-tool` で渡す MCP ツールなどの[権限ホスト](/docs/ja/headless#turn-off-permission-prompts-in-unattended-runs)がある場合にのみ `AskUserQuestion` が提供されるため、権限ホストを指定して実行を開始してください。往復の流れは次のとおりです。2154典型的な例は `AskUserQuestion` ツールです。Claude はユーザーに何かを尋ねたいのですが、回答するためのターミナルがありません。`-p` の実行では、`--permission-prompt-tool` で渡す MCP ツールなどの[権限ホスト](/docs/ja/headless#turn-off-permission-prompts-in-unattended-runs)がある場合にのみ `AskUserQuestion` が提供されるため、権限ホストを指定して実行を開始してください。往復の流れは次のとおりです:
2129 2155
21301. Claude が `AskUserQuestion` を呼び出します。`PreToolUse` フックが発火します。21561. Claude が `AskUserQuestion` を呼び出します。`PreToolUse` フックが発火します。
21312. フックが `permissionDecision: "defer"` を返します。ツールは実行されません。プロセスは `stop_reason: "tool_deferred"` で終了し、保留中のツール呼び出しはトランスクリプトに保存されます。21572. フックが `permissionDecision: "defer"` を返します。ツールは実行されません。プロセスは `stop_reason: "tool_deferred"` で終了し、保留中のツール呼び出しはトランスクリプトに保持されます。
21323. 呼び出し元のプロセスが SDK の結果から `deferred_tool_use` を読み取り、独自の UI に質問を表示して回答を待ちます。21583. 呼び出し側のプロセスが SDK の結果から `deferred_tool_use` を読み取り、独自の UI で質問を表示して、回答を待ちます。
21334. 呼び出し元のプロセスが同じ権限ホストを指定して `claude -p --resume <session-id>` を実行します。同じツール呼び出しが再び `PreToolUse` を発火させます。21594. 呼び出し側のプロセスが、同じ権限ホストを指定して `claude -p --resume <session-id>` を実行します。同じツール呼び出しが再び `PreToolUse` を発火させます。
21345. フックが `updatedInput` に回答を含めて `permissionDecision: "allow"` を返します。ツールが実行され、Claude が処理を続行します。21605. フックが `updatedInput` に回答を含めて `permissionDecision: "allow"` を返します。ツールが実行され、Claude が続行します。
2135 2161
2136`deferred_tool_use` フィールドには、ツールの `id`、`name`、`input` が含まれます。`input` は、Claude がツール呼び出しのために生成したパラメーターで、実行前に取得されたものです。2162`deferred_tool_use` フィールドには、ツールの `id`、`name`、`input` が含まれます。`input` は Claude がツール呼び出しのために生成したパラメータで、実行前に取得されたものです:
2137 2163
2138```json theme={null}2164```json theme={null}
2139{2165{
2149}2175}
2150```2176```
2151 2177
2152タイムアウトや再試行の上限はありません。セッションは再開するまでディスク上に残りますが、[`cleanupPeriodDays`](/docs/ja/settings-reference#cleanupperioddays) の保持期間によるクリーンアップの対象となります。このクリーンアップは、[保持期間によるクリーンアップのルール](/docs/ja/claude-directory#cleaned-up-automatically)に従い、デフォルトで 30 日後にセッションファイルを削除します。再開時に回答の準備ができていない場合、フックは再び `"defer"` を返すことができ、プロセスは同じ方法で終了します。呼び出し元のプロセスは、最終的にフックから `"allow"` または `"deny"` を返すことで、ループを抜けるタイミングを制御します。2178タイムアウトや再試行の上限はありません。セッションは再開するまでディスク上に残りますが、[`cleanupPeriodDays`](/docs/ja/settings-reference#cleanupperioddays) による保持期間のクリーンアップの対象となります。このクリーンアップは、[保持期間のクリーンアップのルール](/docs/ja/claude-directory#cleaned-up-automatically)に従い、デフォルトで 30 日後にセッションファイルを削除します。再開時に回答の準備ができていない場合、フックは再び `"defer"` を返すことができ、プロセスは同じ方法で終了します。呼び出し側のプロセスは、最終的にフックから `"allow"` または `"deny"` を返すことで、ループを抜けるタイミングを制御します。
2153 2179
2154`"defer"` は、Claude がターン内で単一のツール呼び出しを行う場合にのみ機能します。Claude が一度に複数のツール呼び出しを行う場合、`"defer"` は警告とともに無視され、ツールは通常の権限フローで処理されます。この制約は、再開時には 1 つのツールしか再実行できないために存在します。他の呼び出しを未解決のままにせずに、バッチの中から 1 つの呼び出しだけを遅延させる方法はありません。2180`"defer"` は、Claude がそのターンで単一のツール呼び出しを行う場合にのみ機能します。Claude が一度に複数のツール呼び出しを行う場合、`"defer"` は警告とともに無視され、ツールは通常の権限フローで処理されます。この制約は、再開時に再実行できるツールが 1 つだけであるために存在します。バッチから 1 つの呼び出しだけを遅延させると、他の呼び出しが未解決のまま残ってしまいます。
2155 2181
2156再開時に遅延されたツールが利用できなくなっている場合、プロセスはフックが発火する前に `stop_reason: "tool_deferred_unavailable"` と `is_error: true` で終了します。これは、ツールを提供していた MCP サーバーが再開されたセッションで接続されていない場合に発生します。どのツールが見つからなくなったかを特定できるように、`deferred_tool_use` ペイロードは引き続き含まれます。2182再開時に遅延されたツールが利用できなくなっている場合、プロセスはフックが発火する前に `stop_reason: "tool_deferred_unavailable"` と `is_error: true` で終了します。これは、ツールを提供していた MCP サーバーが再開したセッションで接続されていない場合に発生します。`deferred_tool_use` ペイロードは引き続き含まれるため、どのツールが見つからなくなったかを特定できます。
2157 2183
2158<Note>2184<Note>
2159 延期されたセッションを plan モードで再開するには、Claude Code が承認のために計画を提示できるよう、`--resume` とともに [`--permission-prompt-tool`](/docs/ja/cli-reference#cli-flags) を渡してください。その他の条件については、[`-p` で plan モードを再開する](/docs/ja/sessions#resume-in-plan-mode-with-p)を参照してください。Claude Code v2.1.246 以降が必要です。2185 遅延されたセッションを plan モードで再開するには、Claude Code が計画を提示して承認を求められるように、`--resume` とともに [`--permission-prompt-tool`](/docs/ja/cli-reference#cli-flags) を渡してください。その他の条件については、[`-p` で plan モードのまま再開する](/docs/ja/sessions#resume-in-plan-mode-with-p)を参照してください。Claude Code v2.1.246 以降が必要です。
2160 2186
2161 `-p` で再開する場合、Claude Code はそれ以外の保存された権限モードを復元しません。新しい `claude -p` の実行が開始する権限モードで実行を開始するため、遅延されたセッションで `--permission-mode` または `--dangerously-skip-permissions` を使用していた場合は、再度渡してください。`-p` なしで `claude --resume <session-id>` を使って再開する場合、Claude Code は保存された権限モードを復元します。例外については[再開時の権限モード](/docs/ja/sessions#permission-mode-on-resume)に記載されています。2187 `-p` で再開する場合、Claude Code はそれ以外の保存された権限モードを復元しません。新しい `claude -p` の実行が開始するのと同じ権限モードで実行を開始するため、遅延されたセッションで `--permission-mode` または `--dangerously-skip-permissions` を使用していた場合は、再度渡してください。`-p` を付けずに `claude --resume <session-id>` で再開する場合、Claude Code は保存された権限モードを復元します。例外は[再開時の権限モード](/docs/ja/sessions#permission-mode-on-resume)に記載されています。
2162</Note>2188</Note>
2163 2189
2164<h3 id="permissionrequest">2190<h3 id="permissionrequest">
2165 PermissionRequest2191 PermissionRequest
2166</h3>2192</h3>
2167 2193
2168Claude Code がツールの使用について権限を求めようとするときに実行されます。[非対話モード](/docs/ja/headless)のバックグラウンドのサブエージェントなど、プロンプトを表示できないセッションでも、Claude Code はこれらのフックを実行し、どのフックも判定を返さない場合はツール呼び出しを拒否します。`--permission-prompt-tool` または Agent SDK の [`canUseTool` コールバック](/docs/ja/agent-sdk/permissions)に到達する呼び出しでは、フックはホストと並行して実行され、先に判定したほうが適用されます。2194Claude Code がツールの使用について権限を求めようとするときに実行されます。[非対話モード](/docs/ja/headless)のバックグラウンドのサブエージェントなど、プロンプトを表示できないセッションでも Claude Code はこれらのフックを実行し、どのフックも決定を返さない場合はツール呼び出しを拒否します。`--permission-prompt-tool` または Agent SDK の [`canUseTool` コールバック](/docs/ja/agent-sdk/permissions)に到達する呼び出しでは、フックはホストと並行して実行され、先に決定した方が適用されます。
2169ユーザーに代わって許可または拒否するには、[PermissionRequest の判定制御](#permissionrequest-decision-control)を使用します。2195[PermissionRequest の決定制御](#permissionrequest-decision-control)を使用して、ユーザーの代わりに許可または拒否します。
2170 2196
2171Claude がツールの使用について権限を求めた瞬間にシグナルが必要な場合は、このイベントを使用してください。Claude Code が `permission_prompt` タイプの [Notification](#notification) フックを実行するのは、プロンプトが約 6 秒待機した後です。2197Claude がツールの使用について権限を求めた瞬間にシグナルが必要な場合は、このイベントを使用してください。Claude Code は、プロンプトが約 6 秒待機した後にのみ、`permission_prompt` タイプの [Notification](#notification) フックを実行します。
2172 2198
2173Claude Code は、サンドボックス化されたコマンドの[ネットワークリクエスト](/docs/ja/sandboxing#network-isolation)に対しては PermissionRequest フックを実行しません。そのプロンプトのシグナルを受け取るには、`permission_prompt` 通知タイプを使用してください。2199Claude Code は、サンドボックス化されたコマンドの[ネットワークリクエスト](/docs/ja/sandboxing#network-isolation)については PermissionRequest フックを実行しません。そのプロンプトのシグナルを得るには、`permission_prompt` 通知タイプを使用してください。
2174 2200
2175PreToolUse と同じ値で、ツール名に対してマッチします。2201PreToolUse と同じ値で、ツール名にマッチします。
2176 2202
2177<h4 id="permissionrequest-input">2203<h4 id="permissionrequest-input">
2178 PermissionRequest の入力2204 PermissionRequest の入力
2179</h4>2205</h4>
2180 2206
2181PermissionRequest フックは、PreToolUse フックと同様に `tool_name` と `tool_input` フィールドを受け取りますが、`tool_use_id` は受け取りません。MCP ツールの場合は、[`mcp_server`](#pretooluse-input) オブジェクトも受け取ります。オプションの `permission_suggestions` 配列には、許可ルールの追加や権限モードの変更など、Claude Code がこのリクエストに対して提案する[権限の更新](#permission-update-entries)が含まれます。2207PermissionRequest フックは、PreToolUse フックと同様に `tool_name` と `tool_input` フィールドを受け取りますが、`tool_use_id` は含まれません。MCP ツールの場合は、[`mcp_server`](#pretooluse-input) オブジェクトも受け取ります。オプションの `permission_suggestions` 配列には、許可ルールの追加や権限モードの変更など、Claude Code がこのリクエストに対して提案する[権限の更新](#permission-update-entries)が含まれます。
2182 2208
2183`permission_suggestions` 配列は、表示されるオプションの正確なリストではありません。各権限ダイアログは独自のオプションを構築するためです。ファイル編集用のダイアログなど、一部のダイアログはこの配列をまったく読み取らず、リクエスト自体からオプションを導き出します。配列を読み取るダイアログでも、提案が配列に残っているオプションを表示しないことがあります。たとえば、[`allowManagedPermissionRulesOnly`](/docs/ja/settings-reference#allowmanagedpermissionrulesonly) によってルールを保存するオプションが非表示になる場合です。また、[**Yes, and switch to auto mode**](/docs/ja/permission-modes#switch-permission-modes) のように、提案エントリを持たないオプションを提供することもあります。このオプションは、権限の更新を経由せずに権限モードを直接変更します。2209各権限ダイアログはそれぞれ独自にオプションを構築するため、`permission_suggestions` 配列は表示されるオプションの正確なリストではありません。ファイル編集用のダイアログなど一部のダイアログは、この配列をまったく読み取らず、リクエスト自体からオプションを導出します。配列を読み取るダイアログでも、提案が配列に残っているオプションを表示しない場合があります。たとえば、[`allowManagedPermissionRulesOnly`](/docs/ja/settings-reference#allowmanagedpermissionrulesonly) によってルールを保存するオプションが非表示になる場合です。また、[**Yes, and switch to auto mode**](/docs/ja/permission-modes#switch-permission-modes) のように、提案エントリを持たないオプションを提示することもあります。このオプションは、権限の更新を介さずに権限モードを直接変更します。
2184 2210
2185PreToolUse フックは、権限が必要かどうかにかかわらず、すべてのツール呼び出しの前に実行されます。PermissionRequest フックは、Claude Code が権限を求めようとするとき、またはプロンプトを表示できない呼び出しを自動的に拒否しようとするときにのみ実行されます。どちらのイベントも [`EndConversation`](/docs/ja/tools-reference#endconversation-tool-behavior) に対しては発火しません。2211PreToolUse フックは、権限が必要かどうかにかかわらず、すべてのツール呼び出しの前に実行されます。PermissionRequest フックは、Claude Code がユーザーに権限を求めようとしているとき、またはプロンプトを表示できない呼び出しを本来なら自動的に拒否するときにのみ実行されます。どちらのイベントも [`EndConversation`](/docs/ja/tools-reference#endconversation-tool-behavior) では発火しません。
2186 2212
2187```json theme={null}2213```json theme={null}
2188{2214{
2208```2234```
2209 2235
2210<h4 id="permissionrequest-decision-control">2236<h4 id="permissionrequest-decision-control">
2211 PermissionRequest の判定制御2237 PermissionRequest の決定制御
2212</h4>2238</h4>
2213 2239
2214`PermissionRequest` フックは、権限リクエストを許可または拒否できます。すべてのフックで利用できる [JSON 出力フィールド](#json-output)に加えて、フックスクリプトは以下のイベント固有のフィールドを持つ `decision` オブジェクトを返すことができます。2240`PermissionRequest` フックは権限リクエストを許可または拒否できます。すべてのフックで利用できる [JSON 出力フィールド](#json-output)に加えて、フックスクリプトは次のイベント固有のフィールドを持つ `decision` オブジェクトを返すことができます。
2215 2241
2216| フィールド | 説明 |2242| フィールド | 説明 |
2217| :- | :- |2243| :- | :- |
2218| `behavior` | `"allow"` は権限を付与し、`"deny"` は拒否します。[拒否ルールと確認ルール](/docs/ja/permissions#manage-permissions)は引き続き評価されるため、`"allow"` を返すフックが一致する拒否ルールを上書きすることはありません |2244| `behavior` | `"allow"` は権限を付与し、`"deny"` は拒否します。[拒否ルールと確認ルール](/docs/ja/permissions#manage-permissions)は引き続き評価されるため、`"allow"` を返すフックが一致する拒否ルールを上書きすることはありません |
2219| `updatedInput` | `"allow"` の場合のみ:実行前にツールの入力パラメーターを変更します。入力オブジェクト全体を置き換えるため、変更したフィールドとともに変更していないフィールドも含めてください。変更された入力は、拒否ルールと確認ルールに対して再評価されます |2245| `updatedInput` | `"allow"` の場合のみ:実行前にツールの入力パラメータを変更します。入力オブジェクト全体を置き換えるため、変更したフィールドと一緒に変更していないフィールドも含めてください。変更された入力は、拒否ルールと確認ルールに対して再評価されます |
2220| `updatedPermissions` | `"allow"` の場合のみ:適用する[権限の更新エントリ](#permission-update-entries)の配列。許可ルールの追加やセッションの権限モードの変更などがあります |2246| `updatedPermissions` | `"allow"` の場合のみ:適用する[権限更新エントリ](#permission-update-entries)の配列です。許可ルールの追加やセッションの権限モードの変更などを指定します |
2221| `message` | `"deny"` の場合のみ:権限が拒否された理由を Claude に伝えます |2247| `message` | `"deny"` の場合のみ:権限が拒否された理由を Claude に伝えます |
2222| `interrupt` | `"deny"` の場合のみ:`true` の場合、Claude を停止します |2248| `interrupt` | `"deny"` の場合のみ:`true` の場合、Claude を停止します |
2223 2249
2224`decision` オブジェクトなしで終了コード 2 で終了するフックは、権限フローを変更せず、その stderr は破棄されます。リクエストを許可または拒否するには、`decision` オブジェクトを返してください。2250`decision` オブジェクトを返さずに終了コード 2 で終了するフックは権限フローを変更せず、その stderr は破棄されます。リクエストを許可または拒否するには、`decision` オブジェクトを返してください。
2225 2251
2226```json theme={null}2252```json theme={null}
2227{2253{
2245 2271
2246| `type` | フィールド | 効果 |2272| `type` | フィールド | 効果 |
2247| :- | :- | :- |2273| :- | :- | :- |
2248| `addRules` | `rules`、`behavior`、`destination` | 権限ルールを追加します。`rules` は `{toolName, ruleContent?}` オブジェクトの配列です。ツール全体にマッチさせるには `ruleContent` を省略します。`behavior` は `"allow"`、`"deny"`、`"ask"` のいずれかです |2274| `addRules` | `rules`、`behavior`、`destination` | 権限ルールを追加します。`rules` は `{toolName, ruleContent?}` オブジェクトの配列です。ツール全体に一致させるには `ruleContent` を省略します。`behavior` は `"allow"`、`"deny"`、`"ask"` のいずれかです |
2249| `replaceRules` | `rules`、`behavior`、`destination` | `destination` にある指定された `behavior` のルールをすべて、提供された `rules` で置き換えます |2275| `replaceRules` | `rules`、`behavior`、`destination` | `destination` にある指定された `behavior` のすべてのルールを、指定された `rules` で置き換えます |
2250| `removeRules` | `rules`、`behavior`、`destination` | 指定された `behavior` のうち、マッチするルールを削除します |2276| `removeRules` | `rules`、`behavior`、`destination` | 指定された `behavior` の一致するルールを削除します |
2251| `setMode` | `mode`、`destination` | 権限モードを変更します。有効なモードは `default`、`auto`、`acceptEdits`、`dontAsk`、`bypassPermissions`、`plan`、および `default` のエイリアスである `manual` です |2277| `setMode` | `mode`、`destination` | 権限モードを変更します。有効なモードは `default`、`auto`、`acceptEdits`、`dontAsk`、`bypassPermissions`、`plan`、および `default` のエイリアスである `manual` です |
2252| `addDirectories` | `directories`、`destination` | 作業ディレクトリを追加します。`directories` はパス文字列の配列です |2278| `addDirectories` | `directories`、`destination` | 作業ディレクトリを追加します。`directories` はパス文字列の配列です |
2253| `removeDirectories` | `directories`、`destination` | 作業ディレクトリを削除します |2279| `removeDirectories` | `directories`、`destination` | 作業ディレクトリを削除します |
2254 2280
2255<Note>2281<Note>
2256 `bypassPermissions` を指定した `setMode` が有効になるのは、bypass モードがすでに利用可能な状態でセッションを起動した場合のみです。つまり、`--dangerously-skip-permissions`、`--permission-mode bypassPermissions`、`--allow-dangerously-skip-permissions`、または [ユーザー設定、`--settings`、管理設定](/docs/ja/settings-reference#permissions-defaultmode)での `permissions.defaultMode: "bypassPermissions"` のいずれかを使用した場合です。それ以外の場合、この更新は何も行いません。また、[`permissions.disableBypassPermissionsMode`](/docs/ja/permissions#managed-settings) がこのモードを無効にしている場合や、セッションが[制限モード](/docs/ja/cli-reference#cli-flags)で開始された場合も、この更新は何も行いません。2282 `bypassPermissions` を指定した `setMode` は、bypass モードがすでに利用可能な状態でセッションを起動した場合にのみ有効になります。具体的には、`--dangerously-skip-permissions`、`--permission-mode bypassPermissions`、`--allow-dangerously-skip-permissions`、または [ユーザー設定、`--settings`、管理設定](/docs/ja/settings-reference#permissions-defaultmode)での `permissions.defaultMode: "bypassPermissions"` のいずれかです。それ以外の場合、この更新は何も行いません。また、[`permissions.disableBypassPermissionsMode`](/docs/ja/permissions#managed-settings) によってこのモードが無効化されている場合や、セッションが[制限モード](/docs/ja/cli-reference#cli-flags)で開始された場合も、この更新は何も行いません。
2257 2283
2258 `destination` に関係なく、`bypassPermissions` が `defaultMode` として永続化されることはありません。2284 `destination` にかかわらず、`bypassPermissions` が `defaultMode` として永続化されることはありません。
2259</Note>2285</Note>
2260 2286
2261すべてのエントリの `destination` フィールドによって、変更がメモリ内にとどまるか、設定ファイルに永続化されるかが決まります。2287各エントリの `destination` フィールドによって、変更がメモリ内にとどまるか、設定ファイルに永続化されるかが決まります。
2262 2288
2263| `destination` | 書き込み先 |2289| `destination` | 書き込み先 |
2264| :- | :- |2290| :- | :- |
2267| `projectSettings` | `.claude/settings.json` |2293| `projectSettings` | `.claude/settings.json` |
2268| `userSettings` | `~/.claude/settings.json` |2294| `userSettings` | `~/.claude/settings.json` |
2269 2295
2270フックは、受け取った `permission_suggestions` のいずれかを、自身の `updatedPermissions` 出力としてそのまま返すことができます。2296フックは、受け取った `permission_suggestions` のいずれかを、そのまま自身の `updatedPermissions` 出力として返すことができます。
2271 2297
2272<h3 id="posttooluse">2298<h3 id="posttooluse">
2273 PostToolUse2299 PostToolUse
2275 2301
2276ツールが正常に完了した直後に実行されます。2302ツールが正常に完了した直後に実行されます。
2277 2303
2278ツール名でマッチします。値は PreToolUse と同じです。2304ツール名で照合します。値は PreToolUse と同じです。
2279 2305
2280ツール名が適切なフィルターでない場合は、より広くマッチさせます。2306ツール名が適切なフィルターでない場合は、より広く照合します。
2281 2307
2282* ツールが正常に完了した後に毎回フックを実行するには、`matcher` を省略するか `"*"` に設定します。その後、フック自身が何が変更されたかを調べられます。たとえば `git status --porcelain` を実行すると、`git diff` では見落とされる未追跡ファイルも一覧表示されます。失敗したツール呼び出しについては、同じフックを [PostToolUseFailure](#posttoolusefailure) にも追加してください。2308* ツールが正常に完了した後に常にフックを実行するには、`matcher` を省略するか `"*"` に設定します。そのうえで、フック自身が何が変更されたかを調べます。たとえば `git status --porcelain` を実行すると、`git diff` では漏れる未追跡ファイルも一覧表示されます。失敗したツール呼び出しについては、同じフックを [PostToolUseFailure](#posttoolusefailure) に追加してください。
2283* 書き込んだのが何であれ、特定のファイルがディスク上で変更されたときにフックを実行するには、[FileChanged](#filechanged) を使用します。`Bash` コマンドや Claude Code 外部のプロセスが同じファイルを書き換えた場合、Claude Code は `Edit|Write` にマッチする `PostToolUse` フックを実行しません。2309* 書き込み元にかかわらず、特定のファイルがディスク上で変更されたときにフックを実行するには、[FileChanged](#filechanged) を使用します。`Bash` コマンドや Claude Code 外部のプロセスが同じファイルを書き換えた場合、Claude Code は `Edit|Write` に一致する `PostToolUse` フックを実行しません。
2284 2310
2285<h4 id="posttooluse-input">2311<h4 id="posttooluse-input">
2286 PostToolUse の入力2312 PostToolUse の入力
2287</h4>2313</h4>
2288 2314
2289`PostToolUse` フックは、ツールがすでに正常に実行された後に発火します。入力には、ツールに送信された引数である `tool_input` と、ツールが返した結果である `tool_response` の両方が含まれます。どちらの正確なスキーマもツールによって異なります。ファイルツールの `tool_input` のパスは [PreToolUse](#pretooluse-input) と同じ形式で届きます。つまり常に絶対パスで、プラットフォームネイティブの区切り文字が使われるため、Windows ではバックスラッシュになります。MCP ツールの場合、入力には [`mcp_server`](#pretooluse-input) オブジェクトも含まれます。2315`PostToolUse` フックは、ツールがすでに正常に実行された後に発火します。入力には、ツールに送信された引数である `tool_input` と、ツールが返した結果である `tool_response` の両方が含まれます。どちらの正確なスキーマもツールによって異なります。ファイルツールの `tool_input` のパスは [PreToolUse](#pretooluse-input) と同じ形式で渡されます。つまり、常に絶対パスで、プラットフォーム固有の区切り文字(Windows ではバックスラッシュ)が使われます。MCP ツールの場合、入力には [`mcp_server`](#pretooluse-input) オブジェクトも含まれます。
2290 2316
2291```json theme={null}2317```json theme={null}
2292{2318{
2311 2337
2312| フィールド | 説明 |2338| フィールド | 説明 |
2313| :- | :- |2339| :- | :- |
2314| `duration_ms` | 省略可能。ツールの実行時間(ミリ秒)。権限プロンプトと PreToolUse フックに費やされた時間は含まれません |2340| `duration_ms` | オプション。ツールの実行時間(ミリ秒)。権限プロンプトと PreToolUse フックに費やされた時間は含まれません |
2315 2341
2316<h4 id="posttooluse-decision-control">2342<h4 id="posttooluse-decision-control">
2317 PostToolUse の決定制御2343 PostToolUse の決定制御
2321 2347
2322| フィールド | 説明 |2348| フィールド | 説明 |
2323| :- | :- |2349| :- | :- |
2324| `decision` | `"block"` は、ツールの結果の横に `reason` を追加します。Claude には元の出力も引き続き表示されます。出力を置き換えるには `updatedToolOutput` を使用します |2350| `decision` | `"block"` は、ツールの結果の横に `reason` を追加します。Claude には元の出力も引き続き表示されます。出力を置き換えるには `updatedToolOutput` を使用してください |
2325| `reason` | `decision` が `"block"` の場合に Claude に表示される説明 |2351| `reason` | `decision` が `"block"` の場合に Claude に表示される説明 |
2326| `additionalContext` | ツールの結果と一緒に Claude のコンテキストに追加される文字列。[Claude にコンテキストを追加する](#add-context-for-claude)を参照してください |2352| `additionalContext` | ツールの結果とともに Claude のコンテキストに追加される文字列。[Claude にコンテキストを追加する](#add-context-for-claude)を参照してください |
2327| `classifierContext` | Claude ではなく [auto モード](/docs/ja/permission-modes#eliminate-prompts-with-auto-mode)の分類器に向けた、この呼び出しの結果に関する短いメモ。[auto モードの分類器向けに結果に注釈を付ける](#annotate-a-result-for-the-auto-mode-classifier)を参照してください。Claude Code v2.1.236 以降が必要です |2353| `classifierContext` | この呼び出しの結果について、Claude ではなく [auto モード](/docs/ja/permission-modes#eliminate-prompts-with-auto-mode)の分類器に向けた短いメモ。[auto モードの分類器向けに結果に注釈を付ける](#annotate-a-result-for-the-auto-mode-classifier)を参照してください。Claude Code v2.1.236 以降が必要です |
2328| `updatedToolOutput` | Claude に送信される前に、ツールの出力を指定した値で置き換えます。値はツールの出力の形式と一致する必要があります |2354| `updatedToolOutput` | Claude に送信される前に、ツールの出力を指定された値で置き換えます。値はツールの出力の形式と一致している必要があります |
2329| `updatedMCPToolOutput` | [MCP ツール](#match-mcp-tools)の出力のみを置き換えます。すべてのツールで機能する `updatedToolOutput` の使用を推奨します |2355| `updatedMCPToolOutput` | [MCP ツール](#match-mcp-tools)の出力のみを置き換えます。すべてのツールで機能する `updatedToolOutput` の使用を推奨します |
2330 2356
2331以下の例では、`Bash` 呼び出しの出力を置き換えます。置き換える値は `Bash` ツールの出力の形式と一致しています。2357次の例は、`Bash` 呼び出しの出力を置き換えます。置き換える値は `Bash` ツールの出力の形式と一致しています。
2332 2358
2333```json theme={null}2359```json theme={null}
2334{2360{
2346```2372```
2347 2373
2348<Warning>2374<Warning>
2349 `updatedToolOutput` が変更するのは Claude に見える内容だけです。フックが発火した時点でツールはすでに実行されているため、書き込まれたファイル、実行されたコマンド、送信されたネットワークリクエストはすでに影響を及ぼしています。OpenTelemetry のツールスパンや分析イベントなどのテレメトリも、フックが実行される前の元の出力を記録します。ツール呼び出しを実行前に阻止または変更するには、代わりに [PreToolUse](#pretooluse) フックを使用してください。2375 `updatedToolOutput` が変更するのは、Claude に表示される内容だけです。フックが発火する時点でツールはすでに実行されているため、書き込まれたファイル、実行されたコマンド、送信されたネットワークリクエストはすでに反映されています。OpenTelemetry のツールスパンや分析イベントなどのテレメトリも、フックの実行前に元の出力を記録します。ツール呼び出しを実行前に阻止または変更するには、代わりに [PreToolUse](#pretooluse) フックを使用してください。
2350 2376
2351 置き換える値はツールの出力の形式と一致する必要があります。組み込みツールはプレーンな文字列ではなく構造化オブジェクトを返します。たとえば、`Bash` は `stdout`、`stderr`、`interrupted`、`isImage` フィールドを持つオブジェクトを返します。組み込みツールの場合、ツールの出力スキーマと一致しない値は無視され、元の出力が使用されます。MCP ツールの出力はスキーマ検証なしでそのまま渡されます。Claude が必要とするエラーの詳細を取り除くと、Claude が誤った前提に基づいて作業を進める可能性があります。2377 置き換える値は、ツールの出力の形式と一致している必要があります。組み込みツールは、プレーンな文字列ではなく構造化されたオブジェクトを返します。たとえば `Bash` は、`stdout`、`stderr`、`interrupted`、`isImage` フィールドを持つオブジェクトを返します。組み込みツールの場合、ツールの出力スキーマと一致しない値は無視され、元の出力が使用されます。MCP ツールの出力は、スキーマ検証なしでそのまま渡されます。Claude が必要とするエラーの詳細を取り除くと、Claude が誤った前提のまま処理を進める可能性があります。
2352</Warning>2378</Warning>
2353 2379
2354<h4 id="annotate-a-result-for-the-auto-mode-classifier">2380<h4 id="annotate-a-result-for-the-auto-mode-classifier">
2355 auto モードの分類器向けに結果に注釈を付ける2381 auto モードの分類器向けに結果に注釈を付ける
2356</h4>2382</h4>
2357 2383
2358`classifierContext` を返すと、ツール呼び出しの結果に関する短いメモを、Claude ではなく [auto モード](/docs/ja/permission-modes#eliminate-prompts-with-auto-mode)の分類器に送信できます。分類器は[ツールの結果そのものを受け取ることはない](/docs/ja/permission-modes#how-the-classifier-evaluates-actions)ため、このフィールドは、分類器が後続のアクションを審査する前に、呼び出しが返した内容について何かを伝えるためのサポートされた方法です。このフィールドには Claude Code v2.1.236 以降が必要です。2384`classifierContext` を返すと、ツール呼び出しの結果に関する短いメモを、Claude ではなく [auto モード](/docs/ja/permission-modes#eliminate-prompts-with-auto-mode)の分類器に送信できます。分類器は[ツールの結果そのものを受け取ることはない](/docs/ja/permission-modes#how-the-classifier-evaluates-actions)ため、このフィールドは、分類器が後続のアクションを審査する前に、呼び出しが返した内容について伝えるためのサポートされた方法です。このフィールドには Claude Code v2.1.236 以降が必要です。
2359 2385
2360以下の例では、クエリの出力がどこから来たかを分類器に伝えます。2386次の例は、クエリの出力がどこから得られたかを分類器に伝えます。
2361 2387
2362```json theme={null}2388```json theme={null}
2363{2389{
2368}2394}
2369```2395```
2370 2396
2371分類器がメモをどの程度重視するかは、フックを設定した場所によって異なります。2397分類器がこのメモをどの程度重視するかは、フックを設定した場所によって異なります。
2372 2398
2373* **Claude Code で設定されたフック**: 設定ファイル、プラグイン、スキル、エージェントのフロントマターからのフックの場合、分類器はメモを検証されていない、アプリケーション提供のコンテキストとして扱います。メモがユーザーの意図を確定させることはなく、ユーザーが何かを承認した、または要求したとメモが主張する場合、分類器はその主張を会話内のユーザー自身のメッセージと照合します2399* **Claude Code で設定されたフック**:設定ファイル、プラグイン、スキル、エージェントのフロントマターに由来するフックの場合、分類器はメモを未検証のアプリケーション提供コンテキストとして扱います。メモがユーザーの意図を立証することはなく、メモがユーザーが何かを承認または要求したと主張している場合、分類器はその主張を会話内のユーザー自身のメッセージと照合します
2374* **インプロセスの Agent SDK コールバック**: Claude Code を組み込んだアプリケーションがフックを [TypeScript SDK コールバック](/docs/ja/agent-sdk/hooks)として登録し、ライブセッション中にメモを返す場合、分類器はメモで伝えられたユーザーの発言をユーザーの意図として重視することがあります。そのような発言は、ユーザーが送信したメッセージであれば分類器が受け入れる同意要件を満たすことができますが、ユーザー自身のメッセージでも解除できないブロックを解除することはありません。セッションが再開された後、Claude Code は復元されたメモを検証されていないコンテキストとして扱います。両方のグループのフックが同じ呼び出しに注釈を付けた場合、分類器は結合されたメモを検証されていないものとして扱います2400* **プロセス内の Agent SDK コールバック**:Claude Code を組み込んだアプリケーションがフックを [TypeScript SDK コールバック](/docs/ja/agent-sdk/hooks)として登録し、実行中のセッションでメモを返す場合、分類器はメモで伝えられたユーザーの発言をユーザーの意図として考慮することがあります。そのような発言は、ユーザーが送信するメッセージであれば分類器が受け入れる同意要件を満たすことはできますが、ユーザー自身のメッセージでも解除できないブロックを解除することはありません。セッションが再開された後は、Claude Code は復元されたメモを未検証のコンテキストとして扱います。両方のグループのフックが同じ呼び出しに注釈を付けた場合、分類器は結合されたメモを未検証として扱います
2375 2401
2376Claude Code はメモを配信する際に次の制限を適用します。2402Claude Code は、メモを配信する際に次の制限を適用します。
2377 2403
2378* **長さ**: Claude Code は 1 回のツール呼び出しに対するメモを 2,000 文字に制限し、残りを切り捨てます。この上限は、その呼び出しに応答するすべてのフックで共有されます2404* **長さ**:Claude Code は 1 回のツール呼び出しに対するメモを 2,000 文字に制限し、残りを切り捨てます。この上限は、その呼び出しに応答するすべてのフックで共有されます
2379* **同期応答のみ**: Claude Code は、[バックグラウンドで実行される](#run-hooks-in-the-background)フックの応答に含まれるこのフィールドを無視します。その応答は Claude Code がツールの結果を記録した後に届くためです2405* **同期応答のみ**:[バックグラウンドで実行される](#run-hooks-in-the-background)フックの応答では、Claude Code はこのフィールドを無視します。その応答は、Claude Code がツールの結果を記録した後に届くためです
2380* **分類器が記録しない呼び出し**: 分類器のトランスクリプトでは、ファイルの読み取りや検索などの読み取り専用の参照が省略されます。Claude Code は、そのような呼び出しに付けられたメモを破棄します2406* **分類器が記録しない呼び出し**:分類器のトランスクリプトでは、ファイルの読み取りや検索などの読み取り専用の参照は省略されます。Claude Code は、そのような呼び出しに付けられたメモを破棄します
2381* **書き換えとの相互作用**: `updatedToolOutput` で置き換えている出力についてメモを記述する場合は、同じフックの応答で両方のフィールドを返してください。その書き換えが拒否された場合、または別のフックの書き換えがそれを置き換えた場合、Claude Code はメモを破棄します。書き換えなしで返したメモは、別のフックが出力を書き換えた場合でも Claude Code によって配信されます2407* **書き換えとの相互作用**:`updatedToolOutput` で置き換える出力についてメモを記述する場合は、同じフックの応答で両方のフィールドを返してください。その書き換えが拒否された場合や、別のフックの書き換えによって置き換えられた場合、Claude Code はメモを破棄します。書き換えなしで返したメモは、別のフックが出力を書き換えた場合でも配信されます
2382 2408
2383<Warning>2409<Warning>
2384 分類器は `classifierContext` に配置した内容を、セッションをホストしているアプリケーションからの情報として読み取ります。そのため、信頼できないツール出力やサードパーティのテキストをコピーしないでください。メモは、その 1 回の呼び出しに関する短い主張(出所に関する事実や、それに関するユーザーの発言など)にとどめてください。このフィールドを、無関係なメッセージやイベントのストリームを配信するために使用しないでください。2410 分類器は、`classifierContext` に記述された内容を、セッションをホストしているアプリケーションからの情報として読み取ります。そのため、信頼できないツールの出力やサードパーティのテキストをこのフィールドにコピーしないでください。メモは、その呼び出しの出所に関する事実や、その呼び出しに関するユーザーの発言など、この 1 回の呼び出しについての短い主張にとどめてください。無関係なメッセージやイベントのストリームを配信する目的でこのフィールドを使用しないでください。
2385</Warning>2411</Warning>
2386 2412
2387<h3 id="posttoolusefailure">2413<h3 id="posttoolusefailure">
2388 PostToolUseFailure2414 PostToolUseFailure
2389</h3>2415</h3>
2390 2416
2391実行を開始したツールが失敗したとき、つまりツールがエラーをスローしたか、MCP ツールがエラー結果を返したときに実行されます。失敗のログ記録、アラートの送信、Claude への修正フィードバックの提供に使用します。2417実行を開始したツールが失敗したとき、つまりツールがエラーをスローした場合や、MCP ツールがエラー結果を返した場合に実行されます。失敗のログ記録、アラートの送信、Claude への是正フィードバックの提供に使用します。
2392 2418
2393ツール名でマッチします。値は PreToolUse と同じです。2419ツール名で照合します。値は PreToolUse と同じです。
2394 2420
2395<Note>2421<Note>
2396 このイベントは、実行前に拒否されたツール呼び出し(不明なツール名、スキーマまたはツール固有の検証に失敗した入力、権限の拒否)では発火しません。検証による拒否は `tool_use_error` の結果として返され、フックの実行前に発生するため、`PreToolUse` も `PostToolUseFailure` も発火しません。権限の拒否では `PreToolUse` は発火しますが、このイベントは発火しません。[PermissionDenied](#permissiondenied) を参照してください。2422 このイベントは、実行前に拒否されたツール呼び出し(不明なツール名、スキーマやツール固有の検証に失敗した入力、権限の拒否)では発火しません。検証による拒否は `tool_use_error` の結果として返され、フックの実行前に発生するため、`PreToolUse` も `PostToolUseFailure` も発火しません。権限の拒否では `PreToolUse` は発火しますが、このイベントは発火しません。[PermissionDenied](#permissiondenied) を参照してください。
2397</Note>2423</Note>
2398 2424
2399<h4 id="posttoolusefailure-input">2425<h4 id="posttoolusefailure-input">
2400 PostToolUseFailure の入力2426 PostToolUseFailure の入力
2401</h4>2427</h4>
2402 2428
2403PostToolUseFailure フックは、PostToolUse と同じ `tool_name` および `tool_input` フィールドに加えて、トップレベルのフィールドとしてエラー情報を受け取ります。MCP ツールの場合は、[`mcp_server`](#pretooluse-input) オブジェクトも受け取ります。たとえば、失敗した `npm test` コマンドでは次のような内容が渡されます。2429PostToolUseFailure フックは、PostToolUse と同じ `tool_name` と `tool_input` フィールドに加えて、トップレベルのフィールドとしてエラー情報を受け取ります。MCP ツールの場合は、[`mcp_server`](#pretooluse-input) オブジェクトも受け取ります。たとえば、`npm test` コマンドが失敗した場合は次のように渡されます。
2404 2430
2405```json theme={null}2431```json theme={null}
2406{2432{
2424| フィールド | 説明 |2450| フィールド | 説明 |
2425| :- | :- |2451| :- | :- |
2426| `error` | 何が問題だったかを説明する文字列。形式は失敗したツールによって異なります |2452| `error` | 何が問題だったかを説明する文字列。形式は失敗したツールによって異なります |
2427| `is_interrupt` | 省略可能なブール値。ツールが報告したエラーとしてではなく、中止として Claude Code に失敗が届いた場合に true になります。実行中のツールをキャンセルしてもこのフックは発火しません。その場合は、ツールの結果に中断メッセージが含まれます |2453| `is_interrupt` | オプションのブール値。失敗が、ツールが報告したエラーとしてではなく、中断として Claude Code に到達した場合に true になります。実行中のツールをキャンセルしてもこのフックは発火せず、代わりにツールの結果に中断メッセージが含まれます |
2428| `duration_ms` | 省略可能。ツールの実行時間(ミリ秒)。権限プロンプトと PreToolUse フックに費やされた時間は含まれません |2454| `duration_ms` | オプション。ツールの実行時間(ミリ秒)。権限プロンプトと PreToolUse フックに費やされた時間は含まれません |
2429 2455
2430`error` 文字列は通常、失敗したツールの結果として Claude が受け取るテキストと同じです。その形式はツールと失敗の種類によって異なります。フックは `tool_name`、`is_interrupt`、および先頭行の `Exit code N` をキーにしてください。文字列の残りの部分は表示用のテキストとして扱い、安定した形式とみなさないでください。2456`error` 文字列は、一般に、失敗したツールの結果として Claude が受け取るテキストと同じです。その形式はツールや失敗の内容によって異なります。フックの判定には `tool_name`、`is_interrupt`、および 1 行目の `Exit code N` を使用し、文字列の残りの部分は安定した形式ではなく表示用のテキストとして扱ってください。
2431 2457
2432* Bash と PowerShell の場合、実行されて終了したコマンドは先頭行に `Exit code N` を出力し、その後にコマンドが生成した出力を、stdout と stderr が混在した 1 つのブロックとして出力します2458* Bash と PowerShell では、実行されて終了したコマンドの場合、1 行目が `Exit code N` となり、その後にコマンドが生成した出力が、stdout と stderr が混在した 1 つのブロックとして続きます
2433* Claude Code がシェルプロセス自体を起動できなかった場合、ペイロードには終了コードの行がない、失敗メッセージだけが含まれることもあります2459* Claude Code がシェルプロセス自体を起動できなかった場合、ペイロードには終了コードの行がない失敗メッセージのみが含まれることもあります
2434* Claude Code は長い文字列を `... [N characters truncated] ...` マーカーを挟んで中間部分を切り詰めます。また、`Command timed out after 2m 0s` のような独自の行を挿入することもあります2460* Claude Code は長い文字列を `... [N characters truncated] ...` マーカーを挟んで中間部分を切り詰めます。また、`Command timed out after 2m 0s` のような独自の行を挿入することもあります
2435 2461
2436<h4 id="posttoolusefailure-decision-control">2462<h4 id="posttoolusefailure-decision-control">
2441 2467
2442| フィールド | 説明 |2468| フィールド | 説明 |
2443| :- | :- |2469| :- | :- |
2444| `additionalContext` | エラーと一緒に Claude のコンテキストに追加される文字列。[Claude にコンテキストを追加する](#add-context-for-claude)を参照してください |2470| `additionalContext` | エラーとともに Claude のコンテキストに追加される文字列。[Claude にコンテキストを追加する](#add-context-for-claude)を参照してください |
2445 2471
2446```json theme={null}2472```json theme={null}
2447{2473{
2456 PostToolBatch2482 PostToolBatch
2457</h3>2483</h3>
2458 2484
2459バッチ内のすべてのツール呼び出しが解決された後、Claude Code がモデルに次のリクエストを送信する前に 1 回実行されます。`PostToolUse` はツールごとに 1 回発火するため、Claude が並列にツールを呼び出すと同時に発火します。`PostToolBatch` はバッチ全体に対して正確に 1 回だけ発火するため、単一のツールではなく、実行されたツールの集合に依存するコンテキストを注入するのに適した場所です。このイベントには matcher がありません。2485バッチ内のすべてのツール呼び出しが解決した後、Claude Code がモデルに次のリクエストを送信する前に 1 回実行されます。`PostToolUse` はツールごとに 1 回発火するため、Claude が並列にツールを呼び出すと同時に発火します。`PostToolBatch` はバッチ全体に対して正確に 1 回だけ発火するため、個々のツールではなく、実行されたツールの組み合わせに依存するコンテキストを注入するのに適しています。このイベントには matcher はありません。
2460 2486
2461<h4 id="posttoolbatch-input">2487<h4 id="posttoolbatch-input">
2462 PostToolBatch の入力2488 PostToolBatch の入力
2463</h4>2489</h4>
2464 2490
2465[共通入力フィールド](#common-input-fields)に加えて、PostToolBatch フックは、バッチ内のすべてのツール呼び出しを記述する配列 `tool_calls` を受け取ります。2491[共通入力フィールド](#common-input-fields)に加えて、PostToolBatch フックはバッチ内のすべてのツール呼び出しを記述する配列 `tool_calls` を受け取ります。
2466 2492
2467```json theme={null}2493```json theme={null}
2468{2494{
2488}2514}
2489```2515```
2490 2516
2491`tool_response` には、モデルが対応する `tool_result` ブロックで受け取るのと同じ内容が含まれます。値は、ツールが出力したとおりのシリアライズされた文字列またはコンテンツブロックの配列です。`Read` の場合、生のファイル内容ではなく、行番号が先頭に付いたテキストになります。レスポンスは大きくなる可能性があるため、必要なフィールドだけを解析してください。2517`tool_response` には、モデルが対応する `tool_result` ブロックで受け取るものと同じ内容が含まれます。値は、ツールが出力したとおりのシリアライズされた文字列またはコンテンツブロックの配列です。`Read` の場合は、生のファイル内容ではなく、行番号が先頭に付いたテキストになります。応答は大きくなる可能性があるため、必要なフィールドだけを解析してください。
2492 2518
2493<Note>2519<Note>
2494 `tool_response` の形式は `PostToolUse` のものとは異なります。`PostToolUse` はツールの構造化された `Output` オブジェクト(`Write` の場合は `{filePath: "...", type: "create"}` など)を渡しますが、`PostToolBatch` はモデルに表示されるシリアライズされた `tool_result` の内容を渡します。2520 `tool_response` の形式は `PostToolUse` のものとは異なります。`PostToolUse` は、`Write` の場合の `{filePath: "...", type: "create"}` のような、ツールの構造化された `Output` オブジェクトを渡します。`PostToolBatch` は、モデルに表示される、シリアライズされた `tool_result` の内容を渡します。
2495</Note>2521</Note>
2496 2522
2497<h4 id="posttoolbatch-decision-control">2523<h4 id="posttoolbatch-decision-control">
2498 PostToolBatch の決定制御2524 PostToolBatch の決定制御
2499</h4>2525</h4>
2500 2526
2501`PostToolBatch` フックは、Claude 向けにコンテキストを注入できます。すべてのフックで利用できる [JSON 出力フィールド](#json-output)に加えて、フックスクリプトは次のイベント固有のフィールドを返すことができます。2527`PostToolBatch` フックは、Claude 向けのコンテキストを注入できます。すべてのフックで利用できる [JSON 出力フィールド](#json-output)に加えて、フックスクリプトは次のイベント固有のフィールドを返すことができます。
2502 2528
2503| フィールド | 説明 |2529| フィールド | 説明 |
2504| :- | :- |2530| :- | :- |
2505| `additionalContext` | 次のモデル呼び出しの前に 1 回注入されるコンテキスト文字列。配信の詳細、含めるべき内容、再開されたセッションが過去の値をどのように扱うかについては、[Claude にコンテキストを追加する](#add-context-for-claude)を参照してください |2531| `additionalContext` | 次のモデル呼び出しの前に 1 回注入されるコンテキスト文字列。配信の詳細、含めるべき内容、再開されたセッションで過去の値がどう扱われるかについては、[Claude にコンテキストを追加する](#add-context-for-claude)を参照してください |
2506 2532
2507```json theme={null}2533```json theme={null}
2508{2534{
2513}2539}
2514```2540```
2515 2541
2516`decision: "block"` または `continue: false` を返すと、次のモデル呼び出しの前にエージェント型ループが停止します。ブロックメッセージは、JSON の `reason` または `stopReason`、あるいは終了コード 2 の場合は stderr から取得されます。このメッセージはトランスクリプトに警告として表示され、会話に残るため、会話が続行されると Claude にも表示されます。2542`decision: "block"` または `continue: false` を返すと、次のモデル呼び出しの前にエージェント型ループが停止します。ブロックメッセージは、JSON の `reason` または `stopReason`、あるいは終了コード 2 の場合の stderr から取得されます。このメッセージはトランスクリプトに警告として表示され、会話内に残るため、会話が続行されると Claude にも表示されます。
2517 2543
2518<h3 id="permissiondenied">2544<h3 id="permissiondenied">
2519 PermissionDenied2545 PermissionDenied
2520</h3>2546</h3>
2521 2547
2522[auto モード](/docs/ja/permission-modes#eliminate-prompts-with-auto-mode)がツール呼び出しを拒否したときに実行されます。これには、[auto モードとは別の安全性チェックが分類器自身のリクエストを拒否した](/docs/ja/errors#auto-mode-cannot-determine-the-safety-of-an-action)場合や、分類器の応答を解析できなかった場合など、分類器の判定なしに拒否された場合も含まれます。このフックは auto モードでのみ発火します。権限ダイアログを手動で拒否した場合、`PreToolUse` フックが呼び出しをブロックした場合、`deny` ルールがマッチした場合には実行されません。拒否のログ記録、設定の調整、またはモデルにツール呼び出しを再試行してよいことを伝えるために使用します。2548[auto モード](/docs/ja/permission-modes#eliminate-prompts-with-auto-mode)がツール呼び出しを拒否したときに実行されます。これには、[auto モードとは別の安全性チェックが分類器自身のリクエストを拒否した](/docs/ja/errors#auto-mode-cannot-determine-the-safety-of-an-action)場合や、分類器の応答を解析できなかった場合など、分類器の判定なしで拒否した場合も含まれます。このフックは auto モードでのみ発火します。権限ダイアログを手動で拒否した場合、`PreToolUse` フックが呼び出しをブロックした場合、`deny` ルールに一致した場合には実行されません。拒否のログ記録、設定の調整、またはツール呼び出しを再試行してよいことをモデルに伝えるために使用します。
2523 2549
2524ツール名でマッチします。値は PreToolUse と同じです。2550ツール名で照合します。値は PreToolUse と同じです。
2525 2551
2526<h4 id="permissiondenied-input">2552<h4 id="permissiondenied-input">
2527 PermissionDenied の入力2553 PermissionDenied の入力
2548 2574
2549| フィールド | 説明 |2575| フィールド | 説明 |
2550| :- | :- |2576| :- | :- |
2551| `reason` | 拒否の理由。分類器の判定の場合、ほとんどのセッションでは `[Data Exfiltration]` のように、マッチしたルールが角括弧で示されます。その他の形式については[拒否を確認する](/docs/ja/auto-mode-config#review-denials)を参照してください。[判定なしの拒否](#permissiondenied-decision-control)の場合は、`Auto mode could not evaluate this action and is blocking it for safety` で始まります。分類器モデルが利用できなかったことによる拒否の場合は、固定のテキスト `Classifier unavailable` になります |2577| `reason` | 拒否の理由。分類器の判定による場合、ほとんどのセッションでは `[Data Exfiltration]` のように、一致したルール名が角括弧で囲まれて示されます。その他の形式については[拒否を確認する](/docs/ja/auto-mode-config#review-denials)を参照してください。[判定なしの拒否](#permissiondenied-decision-control)の場合は、`Auto mode could not evaluate this action and is blocking it for safety` で始まります。分類器モデルが利用できなかったことによる拒否の場合は、固定テキスト `Classifier unavailable` になります |
2552 2578
2553<h4 id="permissiondenied-decision-control">2579<h4 id="permissiondenied-decision-control">
2554 PermissionDenied の決定制御2580 PermissionDenied の決定制御
2565}2591}
2566```2592```
2567 2593
2568`retry` が `true` の場合、Claude Code は、ツール呼び出しを再試行してよいことをモデルに伝えるメッセージを会話に追加します。Claude Code が拒否そのものを取り消すことはありません。フックが JSON を返さない場合、または `retry: false` を返した場合、拒否はそのまま維持され、モデルは元の拒否メッセージを受け取ります。2594`retry` が `true` の場合、Claude Code はツール呼び出しを再試行してよいことをモデルに伝えるメッセージを会話に追加します。Claude Code が拒否そのものを取り消すことはありません。フックが JSON を返さない場合、または `retry: false` を返した場合、拒否はそのまま維持され、モデルは元の拒否メッセージを受け取ります。
2569 2595
2570分類器が[アクションに対する判定を下さなかった](/docs/ja/errors#auto-mode-cannot-determine-the-safety-of-an-action)場合、つまり応答を解析できなかった場合や、auto モードとは別の安全性チェックが分類器自身のリクエストを拒否した場合、Claude Code は `retry: true` を無視します。これらの拒否については、Claude Code はすでに拒否メッセージの中で、後で再試行するか先に進むかをモデルに伝えています。2596分類器が[アクションに対する判定を出さなかった](/docs/ja/errors#auto-mode-cannot-determine-the-safety-of-an-action)場合、つまり分類器の応答を解析できなかった場合や、auto モードとは別の安全性チェックが分類器自身のリクエストを拒否した場合、Claude Code は `retry: true` を無視します。これらの拒否については、後で再試行するか次に進むかを、Claude Code が拒否メッセージの中ですでにモデルに伝えています。
2571 2597
2572<h3 id="notification">2598<h3 id="notification">
2573 Notification2599 Notification
2574</h3>2600</h3>
2575 2601
2576Claude Code が通知を送信するときに実行されます。通知の種類でマッチします。すべての種類の通知でフックを実行するには、matcher を省略します。2602Claude Code が通知を送信するときに実行されます。通知タイプで照合します。すべての通知タイプでフックを実行するには、matcher を省略します。
2577 2603
2578デスクトップ通知をオフにしていても、これらのフックイベントは受け取ります。`notifications_disabled` を含む `preferredNotifChannel` 設定が変更するのは通知の受け取り方だけであり、フックが実行されるかどうかは変わりません。2604デスクトップ通知をオフにしていても、これらのフックイベントは受け取ります。`preferredNotifChannel` 設定(`notifications_disabled` を含む)が変更するのはユーザーへの通知方法だけであり、フックが実行されるかどうかには影響しません。
2579 2605
2580| Matcher | 発火するタイミング |2606| Matcher | 発火するタイミング |
2581| :- | :- |2607| :- | :- |
2582| `permission_prompt` | Claude がツールの使用、またはサンドボックス化されたコマンドの[ネットワークリクエスト](/docs/ja/sandboxing#network-isolation)について承認を必要としており、プロンプトが約 6 秒間待機している場合 |2608| `permission_prompt` | Claude がツールの使用、またはサンドボックス化されたコマンドの[ネットワークリクエスト](/docs/ja/sandboxing#network-isolation)の承認を必要としており、プロンプトが約 6 秒間待機しているとき |
2583| `idle_prompt` | Claude が約 60 秒前に応答を終え、それ以降ユーザーが入力していない場合 |2609| `idle_prompt` | Claude が約 60 秒前に応答を完了し、それ以降ユーザーが入力していないとき |
2584| `auth_success` | 認証が完了した場合 |2610| `auth_success` | 認証が完了したとき |
2585| `elicitation_dialog` | MCP サーバーが elicitation フォームを開き、ユーザーが約 6 秒間入力していない場合 |2611| `elicitation_dialog` | MCP サーバーが elicitation フォームを開き、ユーザーが約 6 秒間入力していないとき |
2586| `elicitation_url_dialog` | MCP サーバーがブラウザの URL を開くよう求め、ユーザーが約 6 秒間入力していない場合 |2612| `elicitation_url_dialog` | MCP サーバーがブラウザの URL を開くようユーザーに求め、ユーザーが約 6 秒間入力していないとき |
2587| `elicitation_complete` | MCP サーバーが [URL モードの elicitation](#elicitation-input) の完了を報告した場合 |2613| `elicitation_complete` | MCP サーバーが [URL モードの elicitation](#elicitation-input) の完了を報告したとき |
2588| `elicitation_response` | MCP の elicitation の応答がサーバーに送り返された場合 |2614| `elicitation_response` | MCP の elicitation の応答がサーバーに送り返されたとき |
2589| `agent_needs_input` | ターミナルで[エージェントビュー](/docs/ja/agent-view)が開いている間に、バックグラウンドセッションがユーザーの入力待ちを開始した場合。また、ターミナルセッションで[エージェントチームのチームメイトのターミナル設定に関する質問](/docs/ja/agent-teams#choose-a-display-mode)や、auto モードの[分類器リクエストの料金](/docs/ja/auto-mode-classifier-billing)に関する通知が表示され、ユーザーが約 6 秒間入力していない場合にも発火します |2615| `agent_needs_input` | ターミナルで[エージェントビュー](/docs/ja/agent-view)が開いている間に、バックグラウンドセッションがユーザーの入力待ちを開始したとき。また、ターミナルセッションで[エージェントチームのチームメイトのターミナル設定に関する質問](/docs/ja/agent-teams#choose-a-display-mode)や、[分類器のリクエスト料金](/docs/ja/auto-mode-classifier-billing)に関する auto モードの通知が表示され、ユーザーが約 6 秒間入力していないときにも発火します |
2590| `agent_completed` | バックグラウンドセッションが終了または失敗した場合。ターミナルで[エージェントビュー](/docs/ja/agent-view)が開いている間のみ発火します |2616| `agent_completed` | バックグラウンドセッションが完了または失敗したとき。ターミナルで[エージェントビュー](/docs/ja/agent-view)が開いている間にのみ発火します |
2591| `quota_auto_resume_fired` | claude.ai の使用制限によって一時停止されたタスクを Claude Code が続行した場合。リセット時、または待機中に Claude Code で使用クレジットの追加、プランのアップグレード、モデルの切り替えなどを行って再び使用可能になった場合はそれより早く続行されます。ただし、[モデル設定に関する例外](/docs/ja/interactive-mode#wait-for-a-usage-limit-to-reset)があります |2617| `quota_auto_resume_fired` | claude.ai の使用制限によってタスクが一時停止された後、Claude Code がタスクを続行したとき。続行はリセット時に行われるか、待機中に Claude Code で使用クレジットの追加、プランのアップグレード、モデルの切り替えなどを行って使用量が再び利用可能になった場合はそれより早く行われます([モデル設定の例外](/docs/ja/interactive-mode#wait-for-a-usage-limit-to-reset)あり) |
2592| `quota_auto_resume_stale` | コンピューターが約 30 分以上スリープしている間に claude.ai の使用制限がリセットされた場合。Claude Code は続行せず、ユーザーが `Enter` を押すのを待ちます。スリープがそれより短い場合は続行し、代わりに `quota_auto_resume_fired` を発火します |2618| `quota_auto_resume_stale` | コンピューターが約 30 分以上スリープしている間に claude.ai の使用制限がリセットされたとき。Claude Code は続行せず、ユーザーが `Enter` を押すのを待ちます。スリープがそれより短い場合は続行し、代わりに `quota_auto_resume_fired` を発火します |
2593| `quota_auto_resume_disabled` | Claude Code が claude.ai の使用制限の待機を、タスクを続行せずに終了した場合。原因は、[`autoContinueAtUsageLimit`](/docs/ja/settings-reference#autocontinueatusagelimit) がオフになった、Claude Code が自ら開始した待機中にリセットが 24 時間以上先に移動した、続行したタスクが繰り返し制限に達した、または続行がモデルに届く前にブロックされた、のいずれかです。ユーザーが `Esc` や `Ctrl+C` を押した場合、または **Don't continue automatically** を選択した場合は発火しません |2619| `quota_auto_resume_disabled` | Claude Code が claude.ai の使用制限の待機を、タスクを続行せずに終了したとき。たとえば、Claude Code が自動的に開始した待機中に [`autoContinueAtUsageLimit`](/docs/ja/settings-reference#autocontinueatusagelimit) がオフにされた場合やリセットが 24 時間以上先に移動した場合、続行したタスクが繰り返し制限に達した場合、続行がモデルに到達する前にブロックされた場合です。ユーザーが `Esc` または `Ctrl+C` を押した場合や、**Don't continue automatically** を選択した場合は発火しません |
2594 2620
2595`quota_auto_resume_fired`、`quota_auto_resume_stale`、`quota_auto_resume_disabled` の種類には Claude Code v2.1.234 以降が必要です。2621`quota_auto_resume_fired`、`quota_auto_resume_stale`、`quota_auto_resume_disabled` タイプには Claude Code v2.1.234 以降が必要です。
2596 2622
2597ターミナルセッションでは、サンドボックス化されたコマンドのネットワークリクエストに対する `permission_prompt` に Claude Code v2.1.246 以降が必要です。2623ターミナルセッションでは、サンドボックス化されたコマンドのネットワークリクエストに対する `permission_prompt` には Claude Code v2.1.246 以降が必要です。
2598 2624
2599チームメイトのターミナル設定に関する質問に対する `agent_needs_input` には Claude Code v2.1.248 以降が必要です。2625チームメイトのターミナル設定に関する質問に対する `agent_needs_input` には Claude Code v2.1.248 以降が必要です。
2600 2626
2601<Note>2627<Note>
2602 `permission_prompt`、`idle_prompt`、`elicitation_dialog`、`elicitation_url_dialog` の種類はデスクトップ通知とタイミングを共有しているため、ターミナルセッションでは、ユーザーがターミナルから離れているように見える場合にのみ表示されます。2628 `permission_prompt`、`idle_prompt`、`elicitation_dialog`、`elicitation_url_dialog` タイプはデスクトップ通知とタイミングを共有しているため、ターミナルセッションでは、ユーザーがターミナルから離れていると判断される場合にのみ表示されます。
2603 2629
2604 * `permission_prompt` は、ユーザーが約 6 秒間入力していないときに発火します。タイマーは権限プロンプトが表示された時点で開始され、キー入力のたびに延期されます。Claude がツールの使用権限を求めたときに即座にフックを実行するには、代わりに [PermissionRequest](#permissionrequest) を使用してください。2630 * `permission_prompt` は、ユーザーが約 6 秒間入力していないときに発火します。タイマーは権限プロンプトが表示されたときに開始され、キー入力のたびに延期されます。Claude がツールの使用権限を求めたときにすぐにフックを実行するには、代わりに [PermissionRequest](#permissionrequest) を使用してください。
2605 * `idle_prompt` は、Claude が応答を終えてから約 60 秒後に発火します。ただし、それ以降ユーザーが入力しておらず、バックグラウンドの[サブエージェント](/docs/ja/sub-agents)などのバックグラウンドエージェントが実行中でない場合に限ります。Claude Code は、claude.ai の使用制限のリセットを待っている間は `idle_prompt` を送信しません。待機が自動的に終了した場合は、代わりに `quota_auto_resume_*` のいずれかの種類が発火します。2631 * `idle_prompt` は、Claude が応答を完了してから約 60 秒後に発火します。ただし、それ以降ユーザーが入力しておらず、バックグラウンドの[サブエージェント](/docs/ja/sub-agents)などのバックグラウンドエージェントが実行中でない場合に限ります。claude.ai の使用制限のリセットを待っている間、Claude Code は `idle_prompt` を送信しません。待機が自然に終了すると、代わりに `quota_auto_resume_*` タイプのいずれかが発火します。
2606 * elicitation フォームに対する `elicitation_dialog`、またはブラウザ URL のリクエストに対する `elicitation_url_dialog` は、ユーザーが約 6 秒間入力していないときに発火します。どちらも `permission_prompt` と同じ 6 秒のゲートを共有しており、タイマーはダイアログが表示された時点で開始され、キー入力のたびに延期されます。2632 * `elicitation_dialog`(elicitation フォームの場合)または `elicitation_url_dialog`(ブラウザの URL リクエストの場合)は、ユーザーが約 6 秒間入力していないときに発火します。どちらも `permission_prompt` と同じ 6 秒間の条件を共有しており、タイマーはダイアログが表示されたときに開始され、キー入力のたびに延期されます。
2607 2633
2608 別のダイアログが画面に表示されている間に届いた権限リクエストや elicitation にも、リクエストが届いた時点から計測される同じ 6 秒のゲートが適用されます。その通知は、リクエストが開いているダイアログの後ろでまだ待機している間に届く場合があります。2634 別のダイアログが画面に表示されている間に届いた権限リクエストや elicitation にも、同じ 6 秒間の条件が適用され、タイマーはリクエストが届いた時点から計測されます。そのため、リクエストが開いているダイアログの後ろで待機している間に、その通知が届くことがあります。
2609</Note>2635</Note>
2610 2636
2611Claude Code が権限リクエストを Agent SDK の [`canUseTool` コールバック](/docs/ja/agent-sdk/user-input)に送信するセッション(Claude Desktop と VS Code 拡張機能が Claude Code をホストする方法)では、Claude Code は `permission_prompt` のタイミングを異なる方法で計測します。2637Claude Code が権限リクエストを Agent SDK の [`canUseTool` コールバック](/docs/ja/agent-sdk/user-input)に送信するセッションでは、`permission_prompt` のタイミングが異なります。これは、Claude Desktop と VS Code 拡張機能が Claude Code をホストする方法です。
2612 2638
2613* `permission_prompt` は、Claude が権限を求めてから約 6 秒後に発火します。Claude Code は入力中でも延期しません。2639* `permission_prompt` は、Claude が権限を求めてから約 6 秒後に発火します。ユーザーが入力している間も延期されません。
2614* ユーザーまたは [PermissionRequest](#permissionrequest) フックがそれより早く応答した場合、Claude Code は `permission_prompt` を実行しません。2640* ユーザーまたは [PermissionRequest](#permissionrequest) フックがそれより早く応答した場合、Claude Code は `permission_prompt` を実行しません。
2615* これらのセッションで `permission_prompt` をオフにするには、[`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/ja/env-vars) を `1` に設定します。2641* これらのセッションで `permission_prompt` をオフにするには、[`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/ja/env-vars) を `1` に設定します。
2616 2642
2617v2.1.233 より前は、これらのセッションで `permission_prompt` は発火しませんでした。2643v2.1.233 より前では、これらのセッションで `permission_prompt` は発火しませんでした。
2618 2644
2619通知の種類に応じて異なるハンドラーを実行するには、個別の matcher を使用します。この設定では、Claude が権限の承認を必要とするときに権限専用のアラートスクリプトを起動し、Claude がアイドル状態になったときに別の通知を起動します。2645通知タイプに応じて異なるハンドラーを実行するには、別々の matcher を使用します。次の設定では、Claude が権限の承認を必要とするときは権限専用のアラートスクリプトを、Claude がアイドル状態のときは別の通知を起動します。
2620 2646
2621```json theme={null}2647```json theme={null}
2622{2648{
2649 Notification の入力2675 Notification の入力
2650</h4>2676</h4>
2651 2677
2652[共通入力フィールド](#common-input-fields)に加えて、Notification フックは、通知テキストを含む `message`、省略可能な `title`、どの種類が発火したかを示す `notification_type` を受け取ります。2678[共通入力フィールド](#common-input-fields)に加えて、Notification フックは通知テキストを含む `message`、オプションの `title`、どのタイプが発火したかを示す `notification_type` を受け取ります。
2653 2679
2654```json theme={null}2680```json theme={null}
2655{2681{
2663}2689}
2664```2690```
2665 2691
2666Notification フックは通知をブロックしたり変更したりすることはできません。Claude Code はそれらの `systemMessage` と `continue` フィールドを破棄しますが、[`terminalSequence`](#emit-terminal-notifications) は引き続き出力します。デスクトップ通知の例はこれに依存しています。Notification フックは、通知を外部サービスに転送するなどの副作用を目的としています。2692Notification フックは、通知をブロックしたり変更したりすることはできません。Claude Code はこれらのフックの `systemMessage` と `continue` フィールドを破棄しますが、[`terminalSequence`](#emit-terminal-notifications) は引き続き出力します。デスクトップ通知の例はこれを利用しています。Notification フックは、通知を外部サービスに転送するなどの副作用を目的としています。
2667 2693
2668<h3 id="subagentstart">2694<h3 id="subagentstart">
2669 SubagentStart2695 SubagentStart
2670</h3>2696</h3>
2671 2697
2672Claude が Agent ツールでサブエージェントを生成したとき、Claude が[サブエージェントを再開](/docs/ja/sub-agents#resume-subagents)したとき、およびインプロセスの[エージェントチーム](/docs/ja/agent-teams)のチームメイトが新しいメッセージを処理するたびに実行されます。エージェントの種類名でフィルタリングする matcher をサポートしています。組み込みエージェントの場合、これは `general-purpose`、`Explore`、`Plan` などのエージェント名です。[カスタムサブエージェント](/docs/ja/sub-agents)の場合、これはファイル名ではなく、エージェントのフロントマターの `name` フィールドです。2698Claude が Agent ツールでサブエージェントを生成したとき、Claude が[サブエージェントを再開](/docs/ja/sub-agents#resume-subagents)したとき、およびプロセス内の[エージェントチーム](/docs/ja/agent-teams)のチームメイトが新しいメッセージを処理するたびに実行されます。エージェントタイプ名でフィルタリングする matcher をサポートしています。組み込みエージェントの場合、これは `general-purpose`、`Explore`、`Plan` などのエージェント名です。[カスタムサブエージェント](/docs/ja/sub-agents)の場合は、ファイル名ではなく、エージェントのフロントマターの `name` フィールドです。
2673 2699
2674[プラグイン](/docs/ja/plugins/overview)に同梱されたサブエージェントの場合、エージェントの種類は素のフロントマターの名前ではなく、`my-plugin:reviewer` のようなプラグインスコープの識別子になります。コロンが含まれるとプラグインスコープの名前は正規表現として扱われるため、完全一致させるには matcher を `^` と `$` で固定してください: `^my-plugin:reviewer$`。2700[プラグイン](/docs/ja/plugins/overview)に含まれるサブエージェントの場合、エージェントタイプは素のフロントマターの名前ではなく、`my-plugin:reviewer` のようなプラグインスコープの識別子になります。コロンが含まれるとプラグインスコープの名前は正規表現として扱われるため、完全一致させるには matcher を `^` と `$` で固定してください(`^my-plugin:reviewer$`)。
2675 2701
2676<h4 id="subagentstart-input">2702<h4 id="subagentstart-input">
2677 SubagentStart の入力2703 SubagentStart の入力
2694 2720
2695| フィールド | 説明 |2721| フィールド | 説明 |
2696| :- | :- |2722| :- | :- |
2697| `additionalContext` | サブエージェントの会話の開始時、最初のプロンプトの前に、サブエージェントのコンテキストに追加される文字列。[Claude にコンテキストを追加する](#add-context-for-claude)を参照してください |2723| `additionalContext` | サブエージェントの会話の開始時、最初のプロンプトの前にサブエージェントのコンテキストに追加される文字列。[Claude にコンテキストを追加する](#add-context-for-claude)を参照してください |
2698 2724
2699```json theme={null}2725```json theme={null}
2700{2726{
2705}2731}
2706```2732```
2707 2733
2708同じサブエージェントに対してフックが再度実行された場合、Claude Code は、サブエージェントのコンテキストに以前の実行で得たコピーがまだ含まれていない場合にのみ、返されたコンテキストを注入します。起動時に注入されたコピーはそのまま残るため、サブエージェントの[プロンプトキャッシュ](/docs/ja/prompt-caching#subagents-and-the-cache)は損なわれません。[自動圧縮](/docs/ja/sub-agents#auto-compaction)によってそのコピーが破棄された後は、Claude Code は次の実行のコンテキストを再び注入します。2734同じサブエージェントに対してフックが再度実行された場合、Claude Code は、サブエージェントのコンテキストに以前の実行時のコピーがまだ含まれていない場合にのみ、返されたコンテキストを注入します。起動時に注入されたコピーはそのまま残るため、サブエージェントの[プロンプトキャッシュ](/docs/ja/prompt-caching#subagents-and-the-cache)は維持されます。[自動圧縮](/docs/ja/sub-agents#auto-compaction)によってそのコピーが破棄された後は、Claude Code は次の実行時のコンテキストを再び注入します。
2709 2735
2710<h3 id="subagentstop">2736<h3 id="subagentstop">
2711 SubagentStop2737 SubagentStop
2712</h3>2738</h3>
2713 2739
2714Claude Code のサブエージェントが応答を終えたときに実行されます。エージェントの種類でマッチします。値は SubagentStart と同じです。2740Claude Code のサブエージェントが応答を完了したときに実行されます。エージェントタイプで照合します。値は SubagentStart と同じです。
2715 2741
2716<h4 id="subagentstop-input">2742<h4 id="subagentstop-input">
2717 SubagentStop の入力2743 SubagentStop の入力
2718</h4>2744</h4>
2719 2745
2720[共通入力フィールド](#common-input-fields)に加えて、SubagentStop フックは `stop_hook_active`、`agent_id`、`agent_type`、`agent_transcript_path`、`last_assistant_message` を受け取ります。`agent_type` フィールドは matcher のフィルタリングに使用される値です。`transcript_path` はメインセッションのトランスクリプトであり、`agent_transcript_path` はネストされた `subagents/` フォルダーに保存されたサブエージェント自身のトランスクリプトです。`last_assistant_message` フィールドにはサブエージェントの最終応答のテキスト内容が含まれるため、フックはトランスクリプトファイルを解析せずにそれにアクセスできます。2746[共通入力フィールド](#common-input-fields)に加えて、SubagentStop フックは `stop_hook_active`、`agent_id`、`agent_type`、`agent_transcript_path`、`last_assistant_message` を受け取ります。`agent_type` フィールドは、matcher のフィルタリングに使用される値です。`transcript_path` はメインセッションのトランスクリプトであり、`agent_transcript_path` はネストされた `subagents/` フォルダに保存されているサブエージェント自身のトランスクリプトです。`last_assistant_message` フィールドにはサブエージェントの最終応答のテキスト内容が含まれるため、フックはトランスクリプトファイルを解析せずにアクセスできます。
2721 2747
2722すべての SubagentStop イベントが、Claude が生成したサブエージェントから来るわけではありません。Claude Code は、[プロンプトの提案](/docs/ja/interactive-mode#prompt-suggestions)や [`/btw` による脇道の質問](/docs/ja/interactive-mode#side-questions-with-%2Fbtw)など、一部の独自機能のために内部エージェントも実行しており、それらが終了したときにも SubagentStop が発火します。これらのイベントでは、`agent_type` はセッション自体が実行されているエージェント名([`--agent`](/docs/ja/cli-reference#cli-flags) や [`agent` 設定](/docs/ja/settings-reference#agent)で設定されたものなど)になり、セッションがエージェントなしで実行されている場合は空文字列になります。2748すべての SubagentStop イベントが、Claude が生成したサブエージェントに由来するわけではありません。Claude Code は、[プロンプトの提案](/docs/ja/interactive-mode#prompt-suggestions)や [`/btw` による横道の質問](/docs/ja/interactive-mode#side-questions-with-%2Fbtw)など、一部の独自機能のために内部エージェントも実行しており、それらが完了したときにも SubagentStop が発火します。これらのイベントでは、`agent_type` は [`--agent`](/docs/ja/cli-reference#cli-flags) や [`agent` 設定](/docs/ja/settings-reference#agent)で設定されたものなど、セッション自体が実行されているエージェント名になり、セッションがエージェントなしで実行されている場合は空文字列になります。
2723 2749
2724エージェントの種類を指定する `matcher` は、空の `agent_type` にはマッチしません。matcher が省略されている、`""` または `"*"` である、あるいは空文字列にマッチする正規表現であるフックは、空の `agent_type` のイベントでも実行されます。2750エージェントタイプを指定する `matcher` は、空の `agent_type` には一致しません。matcher が省略されているフック、`""` または `"*"` のフック、あるいは空文字列に一致する正規表現のフックは、`agent_type` が空のイベントでも実行されます。
2725 2751
2726Claude Code v2.1.271 以降では、[`SubagentHandback`](/docs/ja/tools-reference) ツールを使用して実行されるサブエージェントは、停止する前にそのツールを通じてレポートを配信します。その場合、`last_assistant_message` フィールドにはサブエージェントの締めくくりのテキスト(存在する場合)が含まれ、これは配信されたレポートではありません。レポートはその呼び出しの `message` 入力であり、`SubagentHandback` にマッチした `PreToolUse` または `PostToolUse` フックは、それを `tool_input.message` として受け取ります。2752Claude Code v2.1.271 以降では、[`SubagentHandback`](/docs/ja/tools-reference) ツールを使用して実行されるサブエージェントは、停止する前にそのツールを通じてレポートを配信します。その場合、`last_assistant_message` フィールドには、配信されたレポートではなく、サブエージェントの締めくくりのテキスト(存在する場合)が含まれます。レポートはその呼び出しの `message` 入力であり、`SubagentHandback` に一致する `PreToolUse` または `PostToolUse` フックは、これを `tool_input.message` として受け取ります。
2727 2753
2728SubagentStop フックは、[Stop の入力](#stop-input)で説明されている `background_tasks` と `session_crons` の配列も受け取ります。どちらの配列も、サブエージェントではなく親セッションをスコープとしています。2754SubagentStop フックは、[Stop の入力](#stop-input)で説明している `background_tasks` と `session_crons` 配列も受け取ります。どちらの配列も、サブエージェントではなく親セッションのスコープです。
2729 2755
2730```json theme={null}2756```json theme={null}
2731{2757{
2744}2770}
2745```2771```
2746 2772
2747SubagentStop フックは、[Stop フック](#stop-decision-control)と同じ決定制御の形式を使用します。これには、サブエージェントの実行を継続させるエラー以外のフィードバック用の、`hookEventName` を `"SubagentStop"` に設定した `hookSpecificOutput.additionalContext` も含まれます。`reason` とともに `decision: "block"` を返すと、サブエージェントの実行が継続され、`reason` が次の指示としてサブエージェントに配信されます。終了コード 2 でブロックするフックも、同じ方法で stderr メッセージを配信します。サブエージェントが戻った後に親セッションにコンテキストを注入するには、代わりに `Agent` ツールに対する [`PostToolUse`](#posttooluse) フックを使用してください。2773SubagentStop フックは、[Stop フック](#stop-decision-control)と同じ決定制御の形式を使用します。これには、サブエージェントの実行を継続させるエラー以外のフィードバックとして、`hookEventName` を `"SubagentStop"` に設定した `hookSpecificOutput.additionalContext` も含まれます。`reason` とともに `decision: "block"` を返すと、サブエージェントの実行が継続され、`reason` が次の指示としてサブエージェントに配信されます。終了コード 2 で終了してブロックするフックも、同じ方法で stderr メッセージを配信します。サブエージェントが戻った後に親セッションにコンテキストを注入するには、代わりに `Agent` ツールに対する [`PostToolUse`](#posttooluse) フックを使用してください。
2748 2774
2749<h3 id="taskcreated">2775<h3 id="taskcreated">
2750 TaskCreated2776 TaskCreated
2751</h3>2777</h3>
2752 2778
2753`TaskCreate` ツールを介してタスクが作成されるときに実行されます。命名規則の強制、タスクの説明の必須化、特定のタスクの作成の防止に使用します。[Task ツールのないセッション](/docs/ja/tools-reference#task-tool-availability)では、このイベントは発火しません。2779`TaskCreate` ツールでタスクが作成されるときに実行されます。命名規則の適用、タスクの説明の必須化、特定のタスクの作成防止に使用します。[Task ツールがないセッション](/docs/ja/tools-reference#task-tool-availability)では、このイベントは発火しません。
2754 2780
2755TaskCreated フックは matcher をサポートしておらず、発生するたびに発火します。2781TaskCreated フックは matcher をサポートせず、すべての発生時に発火します。
2756 2782
2757<h4 id="taskcreated-input">2783<h4 id="taskcreated-input">
2758 TaskCreated の入力2784 TaskCreated の入力
2759</h4>2785</h4>
2760 2786
2761[共通入力フィールド](#common-input-fields)に加えて、TaskCreated フックは `task_id`、`task_subject`、および省略可能な `task_description`、`teammate_name`、`team_name` を受け取ります。2787[共通入力フィールド](#common-input-fields)に加えて、TaskCreated フックは `task_id`、`task_subject`、およびオプションで `task_description`、`teammate_name`、`team_name` を受け取ります。
2762 2788
2763```json theme={null}2789```json theme={null}
2764{2790{
2780| `task_subject` | タスクのタイトル |2806| `task_subject` | タスクのタイトル |
2781| `task_description` | タスクの詳細な説明。存在しない場合があります |2807| `task_description` | タスクの詳細な説明。存在しない場合があります |
2782| `teammate_name` | タスクを作成するチームメイトの名前。存在しない場合があります |2808| `teammate_name` | タスクを作成するチームメイトの名前。存在しない場合があります |
2783| `team_name` | 非推奨。セッションから派生したチーム名。将来のリリースで削除されます |2809| `team_name` | 非推奨。セッションから派生したチーム名です。将来のリリースで削除される予定です |
2784| `agent_id` | このイベントでは、この[共通入力フィールド](#common-input-fields)はタスクを作成するサブエージェントまたは[インプロセスのチームメイト](/docs/ja/agent-teams#choose-a-display-mode)を識別します。存在しない場合があります。Claude Code v2.1.290 以降が必要です |2810| `agent_id` | このイベントでは、この[共通入力フィールド](#common-input-fields)は、タスクを作成するサブエージェントまたは[プロセス内のチームメイト](/docs/ja/agent-teams#choose-a-display-mode)を識別します。存在しない場合があります。Claude Code v2.1.290 以降が必要です |
2785 2811
2786<h4 id="taskcreated-decision-control">2812<h4 id="taskcreated-decision-control">
2787 TaskCreated の決定制御2813 TaskCreated の決定制御
2788</h4>2814</h4>
2789 2815
2790TaskCreated フックは、終了コード 2 または JSON の判定によって作成をブロックできます。いずれの場合も、Claude Code はタスクを削除し、メッセージをツールのエラーとして Claude に返します。Claude Code はこのイベントからの `continue: false` を無視し、Claude は作業を続けます。2816TaskCreated フックは、終了コード 2 または JSON の決定によって作成をブロックできます。いずれの場合も、Claude Code はタスクを削除し、メッセージをツールのエラーとして Claude に返します。Claude Code はこのイベントからの `continue: false` を無視し、Claude は作業を続けます。
2791 2817
2792* **終了コード 2**: Claude Code は stderr のテキストをメッセージとして返します。2818* **終了コード 2**:Claude Code は stderr のテキストをメッセージとして返します。
2793* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code は `reason` をメッセージとして返します。2819* **JSON `{"decision": "block", "reason": "..."}`**:Claude Code は `reason` をメッセージとして返します。
2794 2820
2795この例では、件名が必須の形式に従っていないタスクをブロックします。2821次の例は、件名が必須の形式に従っていないタスクをブロックします。
2796 2822
2797```bash theme={null}2823```bash theme={null}
2798#!/bin/bash2824#!/bin/bash
2811 TaskCompleted2837 TaskCompleted
2812</h3>2838</h3>
2813 2839
2814タスクが完了としてマークされるときに実行されます。これは 2 つの状況で発火します。いずれかのエージェントが TaskUpdate ツールを通じて明示的にタスクを完了としてマークしたとき、または[エージェントチーム](/docs/ja/agent-teams)のチームメイトが進行中のタスクを抱えたままターンを終えたときです。タスクを閉じる前に、テストや lint チェックの合格などの完了基準を強制するために使用します。2840タスクが完了としてマークされるときに実行されます。これは 2 つの状況で発火します。いずれかのエージェントが TaskUpdate ツールを通じてタスクを明示的に完了としてマークしたとき、または[エージェントチーム](/docs/ja/agent-teams)のチームメイトが進行中のタスクを抱えたままターンを終了したときです。タスクを閉じる前に、テストや lint チェックの合格といった完了基準を適用するために使用します。
2815 2841
2816TaskCompleted フックは matcher をサポートしておらず、発生するたびに発火します。2842TaskCompleted フックは matcher をサポートせず、すべての発生時に発火します。
2817 2843
2818<h4 id="taskcompleted-input">2844<h4 id="taskcompleted-input">
2819 TaskCompleted の入力2845 TaskCompleted の入力
2820</h4>2846</h4>
2821 2847
2822[共通入力フィールド](#common-input-fields)に加えて、TaskCompleted フックは `task_id`、`task_subject`、および省略可能な `task_description`、`teammate_name`、`team_name` を受け取ります。2848[共通入力フィールド](#common-input-fields)に加えて、TaskCompleted フックは `task_id`、`task_subject`、およびオプションで `task_description`、`teammate_name`、`team_name` を受け取ります。
2823 2849
2824```json theme={null}2850```json theme={null}
2825{2851{
2842| `task_subject` | タスクのタイトル |2868| `task_subject` | タスクのタイトル |
2843| `task_description` | タスクの詳細な説明。存在しない場合があります |2869| `task_description` | タスクの詳細な説明。存在しない場合があります |
2844| `teammate_name` | タスクを完了するチームメイトの名前。存在しない場合があります |2870| `teammate_name` | タスクを完了するチームメイトの名前。存在しない場合があります |
2845| `team_name` | 非推奨。セッションから派生したチーム名。将来のリリースで削除されます |2871| `team_name` | 非推奨。セッションから派生したチーム名です。将来のリリースで削除される予定です |
2846| `agent_id` | このイベントでは、この[共通入力フィールド](#common-input-fields)はタスクを完了するサブエージェントまたは[インプロセスのチームメイト](/docs/ja/agent-teams#choose-a-display-mode)を識別します。存在しない場合があります。Claude Code v2.1.290 以降が必要です |2872| `agent_id` | このイベントでは、この[共通入力フィールド](#common-input-fields)は、タスクを完了するサブエージェントまたは[プロセス内のチームメイト](/docs/ja/agent-teams#choose-a-display-mode)を識別します。存在しない場合があります。Claude Code v2.1.290 以降が必要です |
2847 2873
2848<h4 id="taskcompleted-decision-control">2874<h4 id="taskcompleted-decision-control">
2849 TaskCompleted の決定制御2875 TaskCompleted の決定制御
2851 2877
2852TaskCompleted フックは、タスクの完了を制御する 2 つの方法をサポートしています。2878TaskCompleted フックは、タスクの完了を制御する 2 つの方法をサポートしています。
2853 2879
2854* **終了コード 2**: タスクは完了としてマークされず、stderr メッセージがフィードバックとしてモデルに返されます。2880* **終了コード 2**:タスクは完了としてマークされず、stderr メッセージがフィードバックとしてモデルに返されます。
2855* **JSON `{"continue": false, "stopReason": "..."}`**: チームメイトがターンを終えたことでイベントがトリガーされた場合、`Stop` フックの動作と同様に、チームメイトを完全に停止します。`stopReason` はユーザーに表示されます。`TaskUpdate` ツールがイベントをトリガーした場合、Claude Code は `continue: false` を無視します。終了コード 2 では引き続き完了がブロックされます。2881* **JSON `{"continue": false, "stopReason": "..."}`**:チームメイトがターンを終了したことでイベントが発生した場合、`Stop` フックの動作と同様に、チームメイトを完全に停止します。`stopReason` はユーザーに表示されます。`TaskUpdate` ツールによってイベントが発生した場合、Claude Code は `continue: false` を無視しますが、終了コード 2 では引き続き完了をブロックできます。
2856 2882
2857この例では、テストを実行し、失敗した場合にタスクの完了をブロックします。2883次の例はテストを実行し、失敗した場合はタスクの完了をブロックします。
2858 2884
2859```bash theme={null}2885```bash theme={null}
2860#!/bin/bash2886#!/bin/bash
2874 Stop2900 Stop
2875</h3>2901</h3>
2876 2902
2877メインの Claude Code エージェントが応答を終えたときに実行されます。2903メインの Claude Code エージェントが応答を完了したときに実行されます。
2878停止がユーザーによる中断によって発生した場合は実行されません。API エラーの場合は、2904ユーザーの中断によって停止した場合は実行されません。API エラーの場合は、
2879代わりに [StopFailure](#stopfailure) が発火します。2905代わりに [StopFailure](#stopfailure) が発火します。
2880 2906
2881<Tip>2907<Tip>
2882 [`/goal`](/docs/ja/goal) コマンドは、セッションスコープのプロンプトベースの Stop フックの組み込みショートカットです。フックの設定を書かずに、ある条件に向けて Claude に作業を続けさせたい場合に使用します。2908 [`/goal`](/docs/ja/goal) コマンドは、セッションスコープのプロンプトベースの Stop フックの組み込みショートカットです。フックの設定を書かずに、ある条件に向けて Claude に作業を続けさせたい場合に使用してください。
2883</Tip>2909</Tip>
2884 2910
2885<h4 id="stop-input">2911<h4 id="stop-input">
2886 Stop の入力2912 Stop の入力
2887</h4>2913</h4>
2888 2914
2889[共通入力フィールド](#common-input-fields)に加えて、Stop フックは `stop_hook_active`、`last_assistant_message`、`background_tasks`、`session_crons` を受け取ります。`stop_hook_active` フィールドは、Claude Code がすでに stop フックの結果として続行している場合に `true` になります。決して解決しない条件でブロックし続けることを避けるため、この値を確認するか、トランスクリプトを処理してください。2915[共通入力フィールド](#common-input-fields)に加えて、Stop フックは `stop_hook_active`、`last_assistant_message`、`background_tasks`、`session_crons` を受け取ります。`stop_hook_active` フィールドは、Claude Code が Stop フックの結果としてすでに続行している場合に `true` になります。決して解決しない条件でブロックし続けることを避けるため、この値を確認するか、トランスクリプトを処理してください。
2890 2916
2891Claude Code は 8 回連続の続行上限を適用します。stop フックがターンを 8 回連続で続行させた後、Claude Code は次のブロックを上書きしてターンを終了します。連続続行の回数は、Claude がツールを呼び出すたびにリセットされます。上限を引き上げるには、[`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/ja/env-vars) を設定します。2917Claude Code は連続 8 回の継続上限を適用します。Stop フックが 8 回連続でターンを継続させた後、Claude Code は次のブロックを上書きしてターンを終了します。連続継続の回数は、Claude がツールを呼び出すたびにリセットされます。上限を引き上げるには、[`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/ja/env-vars) を設定してください。
2892 2918
2893`last_assistant_message` フィールドには Claude の最終応答のテキスト内容が含まれるため、フックはトランスクリプトファイルを解析せずにそれにアクセスできます。読み上げフックや通知フックなど、完了したばかりのターンに対して動作するフックでは、`transcript_path` を読み取るのではなく、このフィールドを使用してください。すべてのバージョンで、Stop の時点でトランスクリプトファイルに最終メッセージが含まれていることは保証されていません。2919`last_assistant_message` フィールドには Claude の最終応答のテキスト内容が含まれるため、フックはトランスクリプトファイルを解析せずにアクセスできます。読み上げフックや通知フックなど、完了したばかりのターンに対して動作するフックでは、`transcript_path` を読み取るのではなく、このフィールドを使用してください。すべてのバージョンで、Stop の時点でトランスクリプトファイルに最終メッセージが含まれているとは限らないためです。
2894 2920
2895`background_tasks` と `session_crons` の配列により、フックは「セッションが完了した」状態と「セッションがバックグラウンドの作業によって再開されるのを待って一時停止している」状態を区別できます。どちらの配列も、タスクレジストリにアクセスできる場合に存在し、実行中またはスケジュール済みのものがない場合は空になります。2921`background_tasks` と `session_crons` 配列を使うと、フックは「セッションが完了した」状態と「バックグラウンドの作業によって再開されるのを待って一時停止している」状態を区別できます。どちらの配列も、タスクレジストリにアクセスできる場合に存在し、実行中またはスケジュール済みのものがない場合は空になります。
2896 2922
2897`background_tasks` の各エントリは実行中の 1 つのタスクを記述し、次のフィールドを使用します。2923`background_tasks` の各エントリは 1 つの実行中のタスクを表し、次のフィールドを使用します。
2898 2924
2899| フィールド | 説明 |2925| フィールド | 説明 |
2900| :- | :- |2926| :- | :- |
2901| `id` | タスクの識別子 |2927| `id` | タスクの識別子 |
2902| `type` | `shell`、`subagent`、`monitor`、`workflow`、`teammate`、`cloud session`、`MCP task` などの、わかりやすいタスクの種類のラベル。各ラベルは、どの Claude Code 機能がタスクを作成したかを示します。認識されない種類の場合は、生の判別値にフォールバックします |2928| `type` | `shell`、`subagent`、`monitor`、`workflow`、`teammate`、`cloud session`、`MCP task` などの、わかりやすいタスクタイプのラベル。各ラベルは、どの Claude Code 機能がタスクを作成したかを示します。認識されないタイプの場合は、生の識別値にフォールバックします |
2903| `status` | 現在のタスクのステータス |2929| `status` | 現在のタスクのステータス |
2904| `description` | 自由記述の説明。1000 文字が上限で、切り詰められた場合は文字列内に `… [+N chars]` マーカーが付きます |2930| `description` | 自由形式の説明。1000 文字に制限され、切り詰められた場合は文字列内に `… [+N chars]` マーカーが付きます |
2905| `command` | シェルのコマンドライン。1000 文字が上限です。`shell` タスクの場合のみ存在します |2931| `command` | シェルのコマンドライン。1000 文字に制限されます。`shell` タスクにのみ存在します |
2906| `agent_type` | サブエージェントの種類名。`subagent` タスクの場合のみ存在します |2932| `agent_type` | サブエージェントのタイプ名。`subagent` タスクにのみ存在します |
2907| `server` | MCP サーバー名。`monitor` および `MCP task` タスクの場合のみ存在します |2933| `server` | MCP サーバー名。`monitor` および `MCP task` タスクにのみ存在します |
2908| `tool` | MCP ツール名。`monitor` および `MCP task` タスクの場合のみ存在します |2934| `tool` | MCP ツール名。`monitor` および `MCP task` タスクにのみ存在します |
2909| `name` | ワークフロー名。`workflow` タスクの場合のみ存在します |2935| `name` | ワークフロー名。`workflow` タスクにのみ存在します |
2910 2936
2911`session_crons` の各エントリは、`CronCreate`、`ScheduleWakeup`、`/loop` から取得された、セッションスコープのスケジュール済みウェイクアップを 1 つ記述します。2937`session_crons` の各エントリは、`CronCreate`、`ScheduleWakeup`、`/loop` に由来する、セッションスコープのスケジュール済みの再開を 1 つ表します。
2912 2938
2913| フィールド | 説明 |2939| フィールド | 説明 |
2914| :- | :- |2940| :- | :- |
2915| `id` | cron タスクの識別子 |2941| `id` | cron タスクの識別子 |
2916| `schedule` | cron 式。例: `0 9 * * 1-5` |2942| `schedule` | cron 式。例:`0 9 * * 1-5` |
2917| `recurring` | スケジュールが単一の発火時刻を表す 1 回限りのウェイクアップの場合は `false`、マッチするたびに再発火するタスクの場合は `true` |2943| `recurring` | スケジュールが 1 回の発火時刻を表す単発の再開の場合は `false`、一致するたびに再発火するタスクの場合は `true` |
2918| `prompt` | cron の発火時に送信されるプロンプト。1000 文字が上限で、同じ `… [+N chars]` マーカーが付きます |2944| `prompt` | cron の発火時に送信されるプロンプト。1000 文字に制限され、同じ `… [+N chars]` マーカーが付きます |
2919 2945
2920この例は、実行中のシェルタスクが 1 つと、繰り返しの cron が 1 つある Stop の入力を示しています。2946次の例は、実行中のシェルタスク 1 つと繰り返しの cron 1 つを含む Stop の入力を示しています。
2921 2947
2922```json theme={null}2948```json theme={null}
2923{2949{
2952 Stop の決定制御2978 Stop の決定制御
2953</h4>2979</h4>
2954 2980
2955`Stop` および `SubagentStop` フックは、Claude が続行するかどうかを制御できます。すべてのフックで利用できる [JSON 出力フィールド](#json-output)に加えて、フックスクリプトは次のイベント固有のフィールドを返すことができます。2981`Stop` と `SubagentStop` フックは、Claude が続行するかどうかを制御できます。すべてのフックで利用できる [JSON 出力フィールド](#json-output)に加えて、フックスクリプトは次のイベント固有のフィールドを返すことができます。
2956 2982
2957| フィールド | 説明 |2983| フィールド | 説明 |
2958| :- | :- |2984| :- | :- |
2959| `decision` | `"block"` は Claude の停止を防ぎます。Claude の停止を許可するには省略します |2985| `decision` | `"block"` は Claude の停止を阻止します。Claude の停止を許可するには省略します |
2960| `reason` | `decision` が `"block"` の場合は必須です。Claude に続行すべき理由を伝えます |2986| `reason` | `decision` が `"block"` の場合は必須です。Claude が続行すべき理由を伝えます |
2961| `hookSpecificOutput.additionalContext` | Claude へのエラー以外のフィードバック。Claude がそれに対応できるよう会話は続行されますが、`decision: "block"` とは異なり、トランスクリプトにはフックエラーではなくフックのフィードバックとして表示されます |2987| `hookSpecificOutput.additionalContext` | Claude へのエラー以外のフィードバック。Claude がこれに基づいて行動できるよう会話は続行されますが、`decision: "block"` とは異なり、トランスクリプトにはフックエラーではなくフックのフィードバックとして表示されます |
2962 2988
2963終了コード 2 でブロックするフックは、`reason` と同じ方法で処理されます。Claude は、続行すべき理由の説明として stderr メッセージを受け取ります。2989終了コード 2 で終了してブロックするフックは、`reason` と同じ方法で処理されます。Claude は stderr メッセージを、続行すべき理由の説明として受け取ります。
2964 2990
2965```json theme={null}2991```json theme={null}
2966{2992{
2969}2995}
2970```2996```
2971 2997
2972フックが設計どおりに動作し、「終了する前にテストスイートを実行する」などのガイダンスを Claude に与えている場合は、`additionalContext` を使用します。これは `decision: "block"` と同じループ保護(`stop_hook_active` 入力と 8 回連続の続行上限)を通じて会話を継続させますが、トランスクリプトでは `Stop hook feedback` とラベル付けされ、フックエラーの通知は表示されません。2998フックが設計どおりに動作していて、「終了前にテストスイートを実行する」などのガイダンスを Claude に与える場合は、`additionalContext` を使用します。これは、`decision: "block"` と同じループ保護(`stop_hook_active` 入力と連続 8 回の継続上限)を通じて会話を継続させますが、トランスクリプトでは `Stop hook feedback` とラベル付けされ、フックエラーの通知は表示されません。
2973 2999
2974```json theme={null}3000```json theme={null}
2975{3001{
2984 StopFailure3010 StopFailure
2985</h3>3011</h3>
2986 3012
2987API エラーによってターンが終了したときに、[Stop](#stop) の代わりに実行されます。Claude Code は、[`terminalSequence`](#emit-terminal-notifications) を除き、フックの出力と終了コードを無視します。レート制限、認証の問題、その他の API エラーによって Claude が応答を完了できない場合に、失敗のログ記録、アラートの送信、または復旧アクションの実行に使用します。3013API エラーによってターンが終了したときに、[Stop](#stop) の代わりに実行されます。Claude Code は、[`terminalSequence`](#emit-terminal-notifications) を除き、フックの出力と終了コードを無視します。レート制限、認証の問題、その他の API エラーによって Claude が応答を完了できない場合に、失敗のログ記録、アラートの送信、復旧アクションの実行に使用します。
2988 3014
2989<h4 id="stopfailure-input">3015<h4 id="stopfailure-input">
2990 StopFailure の入力3016 StopFailure の入力
2991</h4>3017</h4>
2992 3018
2993[共通入力フィールド](#common-input-fields)に加えて、StopFailure フックは `error`、省略可能な `error_details`、省略可能な `last_assistant_message` を受け取ります。`error` フィールドはエラーの種類を示し、matcher のフィルタリングに使用されます。3019[共通入力フィールド](#common-input-fields)に加えて、StopFailure フックは `error`、オプションの `error_details`、オプションの `last_assistant_message` を受け取ります。`error` フィールドはエラーの種類を示し、matcher のフィルタリングに使用されます。
2994 3020
2995| フィールド | 説明 |3021| フィールド | 説明 |
2996| :- | :- |3022| :- | :- |
2997| `error` | エラーの種類: `rate_limit`、`overloaded`、`authentication_failed`、`oauth_org_not_allowed`、`account_on_hold`、`billing_error`、`invalid_request`、`model_not_found`、`server_error`、`max_output_tokens`、`cloud_credential_error`、または `unknown` |3023| `error` | エラーの種類:`rate_limit`、`overloaded`、`authentication_failed`、`oauth_org_not_allowed`、`account_on_hold`、`billing_error`、`invalid_request`、`model_not_found`、`server_error`、`max_output_tokens`、`cloud_credential_error`、`unknown` のいずれか |
2998| `error_details` | エラーに関する追加の詳細(利用可能な場合) |3024| `error_details` | エラーに関する追加の詳細(利用可能な場合) |
2999| `last_assistant_message` | 会話に表示されるレンダリングされたエラーテキスト。このフィールドに Claude の会話出力が含まれる `Stop` や `SubagentStop` とは異なり、`StopFailure` では `"API Error: Rate limit reached"` のような API エラー文字列そのものが含まれます |3025| `last_assistant_message` | 会話に表示されるレンダリング済みのエラーテキスト。このフィールドに Claude の会話の出力が含まれる `Stop` や `SubagentStop` とは異なり、`StopFailure` では `"API Error: Rate limit reached"` のような API エラー文字列そのものが含まれます |
3000 3026
3001```json theme={null}3027```json theme={null}
3002{3028{
3016 TeammateIdle3042 TeammateIdle
3017</h3>3043</h3>
3018 3044
3019[エージェントチーム](/docs/ja/agent-teams)のチームメイトがターンを終えてアイドル状態になろうとしているときに実行されます。lint チェックの合格を必須にしたり、出力ファイルの存在を確認したりするなど、チームメイトが作業を停止する前に品質ゲートを強制するために使用します。3045[エージェントチーム](/docs/ja/agent-teams)のチームメイトがターンを終了した後、アイドル状態になろうとしているときに実行されます。lint チェックの合格を必須にしたり、出力ファイルが存在することを確認したりするなど、チームメイトが作業を停止する前に品質ゲートを適用するために使用します。
3020 3046
3021TeammateIdle フックは matcher をサポートしておらず、発生するたびに発火します。3047TeammateIdle フックは matcher をサポートせず、すべての発生時に発火します。
3022 3048
3023<h4 id="teammateidle-input">3049<h4 id="teammateidle-input">
3024 TeammateIdle の入力3050 TeammateIdle の入力
3041| フィールド | 説明 |3067| フィールド | 説明 |
3042| :- | :- |3068| :- | :- |
3043| `teammate_name` | アイドル状態になろうとしているチームメイトの名前 |3069| `teammate_name` | アイドル状態になろうとしているチームメイトの名前 |
3044| `team_name` | 非推奨。セッションから派生したチーム名。将来のリリースで削除されます |3070| `team_name` | 非推奨。セッションから派生したチーム名です。将来のリリースで削除される予定です |
3045| `agent_id` | このイベントでは、この[共通入力フィールド](#common-input-fields)はアイドル状態になろうとしている[インプロセスのチームメイト](/docs/ja/agent-teams#choose-a-display-mode)を識別します。存在しない場合があります。Claude Code v2.1.290 以降が必要です |3071| `agent_id` | このイベントでは、この[共通入力フィールド](#common-input-fields)は、アイドル状態になろうとしている[プロセス内のチームメイト](/docs/ja/agent-teams#choose-a-display-mode)を識別します。存在しない場合があります。Claude Code v2.1.290 以降が必要です |
3046 3072
3047<h4 id="teammateidle-decision-control">3073<h4 id="teammateidle-decision-control">
3048 TeammateIdle の決定制御3074 TeammateIdle の決定制御
3050 3076
3051TeammateIdle フックは、チームメイトの動作を制御する 2 つの方法をサポートしています。3077TeammateIdle フックは、チームメイトの動作を制御する 2 つの方法をサポートしています。
3052 3078
3053* **終了コード 2**: チームメイトは stderr メッセージをフィードバックとして受け取り、アイドル状態にならずに作業を続けます。3079* **終了コード 2**:チームメイトは stderr メッセージをフィードバックとして受け取り、アイドル状態にならずに作業を続けます。
3054* **JSON `{"continue": false, "stopReason": "..."}`**: `Stop` フックの動作と同様に、チームメイトを完全に停止します。`stopReason` はユーザーに表示されます。3080* **JSON `{"continue": false, "stopReason": "..."}`**:`Stop` フックの動作と同様に、チームメイトを完全に停止します。`stopReason` はユーザーに表示されます。
3055 3081
3056この例では、チームメイトがアイドル状態になるのを許可する前に、ビルドアーティファクトが存在することを確認します。3082次の例は、チームメイトがアイドル状態になるのを許可する前に、ビルドアーティファクトが存在することを確認します。
3057 3083
3058```bash theme={null}3084```bash theme={null}
3059#!/bin/bash3085#!/bin/bash
3070 ConfigChange3096 ConfigChange
3071</h3>3097</h3>
3072 3098
3073セッション中に設定ファイルが変更されたときに実行されます。設定変更の監査、セキュリティポリシーの強制、設定ファイルへの不正な変更のブロックに使用します。3099セッション中に設定ファイルが変更されたときに実行されます。設定変更の監査、セキュリティポリシーの適用、設定ファイルへの不正な変更のブロックに使用します。
3074 3100
3075Claude Code は、設定ファイル、管理ポリシーファイル、またはスキルファイルが変更されたときに ConfigChange フックを実行します。管理ポリシーについては、`managed-settings.json` または `managed-settings.d/` 内のファイルが変更された場合にのみ実行します。[サーバー管理設定](/docs/ja/server-managed-settings)や、macOS の管理された環境設定または Windows レジストリポリシーへの変更は、フックを実行せずに適用します。[`wslInheritsWindowsSettings`](/docs/ja/settings-reference#wslinheritswindowssettings) を使用した WSL では、変更された Windows 側の管理設定ファイルも、ポリシーのポーリング時にフックを実行せずに適用します。3101Claude Code は、設定ファイル、管理ポリシーファイル、またはスキルファイルが変更されたときに ConfigChange フックを実行します。管理ポリシーについては、`managed-settings.json` または `managed-settings.d/` 内のファイルが変更された場合にのみ実行します。[サーバー管理設定](/docs/ja/server-managed-settings)や、macOS の管理された環境設定、Windows レジストリのポリシーへの変更は、フックを実行せずに適用されます。[`wslInheritsWindowsSettings`](/docs/ja/settings-reference#wslinheritswindowssettings) を使用した WSL では、変更された Windows 側の管理設定ファイルも、ポリシーのポーリング時にフックを実行せずに適用されます。
3076 3102
3077matcher は設定のソースでフィルタリングします。3103matcher は設定のソースでフィルタリングします。
3078 3104
3079| Matcher | 発火するタイミング |3105| Matcher | 発火するタイミング |
3080| :- | :- |3106| :- | :- |
3081| `user_settings` | `~/.claude/settings.json` が変更された場合 |3107| `user_settings` | `~/.claude/settings.json` が変更されたとき |
3082| `project_settings` | `.claude/settings.json` が変更された場合 |3108| `project_settings` | `.claude/settings.json` が変更されたとき |
3083| `local_settings` | `.claude/settings.local.json` が変更された場合 |3109| `local_settings` | `.claude/settings.local.json` が変更されたとき |
3084| `policy_settings` | `managed-settings.json` または `managed-settings.d/` 内のファイルが変更された場合 |3110| `policy_settings` | `managed-settings.json` または `managed-settings.d/` 内のファイルが変更されたとき |
3085| `skills` | `.claude/skills/` 内のスキルファイルが変更された場合 |3111| `skills` | `.claude/skills/` 内のスキルファイルが変更されたとき |
3086 3112
3087この例では、セキュリティ監査のためにすべての設定変更をログに記録します。3113次の例は、セキュリティ監査のためにすべての設定変更をログに記録します。
3088 3114
3089```json theme={null}3115```json theme={null}
3090{3116{
3108 ConfigChange の入力3134 ConfigChange の入力
3109</h4>3135</h4>
3110 3136
3111[共通入力フィールド](#common-input-fields)に加えて、ConfigChange フックは `source` と、省略可能な `file_path` を受け取ります。`source` フィールドはどの種類の設定が変更されたかを示し、`file_path` は変更された特定のファイルへのパスを提供します。3137[共通入力フィールド](#common-input-fields)に加えて、ConfigChange フックは `source` と、オプションで `file_path` を受け取ります。`source` フィールドはどの種類の設定が変更されたかを示し、`file_path` は変更された特定のファイルへのパスを提供します。
3112 3138
3113```json theme={null}3139```json theme={null}
3114{3140{
3125 ConfigChange の決定制御3151 ConfigChange の決定制御
3126</h4>3152</h4>
3127 3153
3128ConfigChange フックは、設定変更が有効になるのをブロックできます。変更を防ぐには、終了コード 2 または JSON の `decision` を使用します。ブロックされた場合、新しい設定は実行中のセッションに適用されません。3154ConfigChange フックは、設定変更が反映されるのをブロックできます。変更を阻止するには、終了コード 2 または JSON の `decision` を使用します。ブロックされた場合、新しい設定は実行中のセッションに適用されません。
3129 3155
3130| フィールド | 説明 |3156| フィールド | 説明 |
3131| :- | :- |3157| :- | :- |
3132| `decision` | `"block"` は設定変更が適用されるのを防ぎます。変更を許可するには省略します |3158| `decision` | `"block"` は設定変更の適用を阻止します。変更を許可するには省略します |
3133| `reason` | 受け付けられますが、表示されることはありません |3159| `reason` | 受け付けられますが、表示されることはありません |
3134 3160
3135```json theme={null}3161```json theme={null}
3139}3165}
3140```3166```
3141 3167
3142`policy_settings` の変更はブロックできません。マシン上の管理設定ファイルが変更されたとき、`policy_settings` ソースに対してもフックは発火するため、それらの編集をログに記録するために使用できますが、ブロックの決定は無視されます。これにより、エンタープライズで管理された設定が常に有効になることが保証されます。[サーバー管理設定](/docs/ja/server-managed-settings)が届いたり更新されたりしたときには、Claude Code は `ConfigChange` フックを実行しません。3168`policy_settings` の変更はブロックできません。マシン上の管理設定ファイルが変更されたときには `policy_settings` ソースに対してもフックが発火するため、それらの編集をログに記録するために使用できますが、ブロックの決定は無視されます。これにより、エンタープライズで管理された設定が常に反映されることが保証されます。[サーバー管理設定](/docs/ja/server-managed-settings)が届いたときや更新されたときには、Claude Code は `ConfigChange` フックを実行しません。
3143 3169
3144Claude Code は ConfigChange フックの JSON 出力からブロックの決定に従って動作し、`systemMessage` と `continue` を破棄します。`reason` でブロックした場合も、終了コード 2 の stderr でブロックした場合も、ブロックされた変更についてユーザーにも Claude にもメッセージは表示されません。Claude Code はデバッグログに 1 行書き込むだけです。3170Claude Code は ConfigChange フックの JSON 出力のうちブロックの決定に基づいて動作し、`systemMessage` と `continue` は破棄します。`reason` でブロックした場合も、終了コード 2 の stderr でブロックした場合も、ブロックされた変更についてユーザーや Claude にメッセージが表示されることはありません。Claude Code はデバッグログに 1 行を書き込むだけです。
3145 3171
3146<h3 id="cwdchanged">3172<h3 id="cwdchanged">
3147 CwdChanged3173 CwdChanged
3148</h3>3174</h3>
3149 3175
3150メインの会話内のシェルコマンドが作業ディレクトリを変更したとき、たとえば Claude が `cd` コマンドを実行したときに実行されます。ディレクトリの変更に反応するために使用します。環境変数の再読み込み、プロジェクト固有のツールチェーンの有効化、セットアップスクリプトの自動実行などが可能です。ディレクトリごとの環境を管理する [direnv](https://direnv.net/) などのツールには、[FileChanged](#filechanged) と組み合わせて使用します。3176メインの会話内のシェルコマンドが作業ディレクトリを変更したとき、たとえば Claude が `cd` コマンドを実行したときに実行されます。環境変数の再読み込み、プロジェクト固有のツールチェーンの有効化、セットアップスクリプトの自動実行など、ディレクトリの変更に反応するために使用します。ディレクトリごとの環境を管理する [direnv](https://direnv.net/) のようなツールでは、[FileChanged](#filechanged) と組み合わせて使用します。
3151 3177
3152CwdChanged フックは [`CLAUDE_ENV_FILE`](#persist-environment-variables) にアクセスできます。そのファイルに書き込まれた変数は、次の CwdChanged イベントで Claude Code がクリアするまで、後続の Bash コマンドに引き継がれます。3178CwdChanged フックは [`CLAUDE_ENV_FILE`](#persist-environment-variables) にアクセスできます。そのファイルに書き込まれた変数は、次の CwdChanged イベントで Claude Code によってクリアされるまで、後続の Bash コマンドに引き継がれます。
3153 3179
3154CwdChanged は matcher をサポートしておらず、発生するたびに発火します。3180CwdChanged は matcher をサポートせず、すべての発生時に発火します。
3155 3181
3156<h4 id="cwdchanged-input">3182<h4 id="cwdchanged-input">
3157 CwdChanged の入力3183 CwdChanged の入力
3178 3204
3179| フィールド | 説明 |3205| フィールド | 説明 |
3180| :- | :- |3206| :- | :- |
3181| `watchPaths` | 絶対パスの配列。現在の動的な監視リストを置き換えます。`matcher` の設定に含まれるパスは常に監視されます。空の配列を返すと動的なリストがクリアされます。これは新しいディレクトリに入るときの典型的な使い方です |3207| `watchPaths` | 絶対パスの配列。現在の動的監視リストを置き換えます。`matcher` 設定のパスは常に監視されます。空の配列を返すと動的リストがクリアされます。これは新しいディレクトリに移動したときの典型的な使い方です |
3182 3208
3183CwdChanged フックには決定制御がありません。ディレクトリの変更をブロックすることはできません。3209CwdChanged フックには決定制御がありません。ディレクトリの変更をブロックすることはできません。
3184 3210
3185Claude Code は JSON 出力から `watchPaths` と `systemMessage` を読み取り、`continue` を破棄します。対話型セッションでは、`systemMessage` を短いターミナル通知として表示します。このメッセージは SDK のメッセージストリームには届きません。3211Claude Code は、これらのフックの JSON 出力から `watchPaths` と `systemMessage` を読み取り、`continue` は破棄します。対話型セッションでは、`systemMessage` を短いターミナル通知として表示します。このメッセージは SDK のメッセージストリームには届きません。
3186 3212
3187<h3 id="directoryadded">3213<h3 id="directoryadded">
3188 DirectoryAdded3214 DirectoryAdded
3189</h3>3215</h3>
3190 3216
3191`/add-dir` コマンドでセッションの途中に作業ディレクトリを追加した後、または SDK クライアントが `register_repo_root` 制御リクエストで作業ディレクトリを追加した後に実行されます。新しく追加されたリポジトリの準備(依存関係のインストールなど)に使用します。3217セッションの途中で `/add-dir` コマンドを使用して作業ディレクトリを追加した後、または SDK クライアントが `register_repo_root` 制御リクエストでディレクトリを追加した後に実行されます。新しく追加されたリポジトリの依存関係をインストールするなど、リポジトリの準備に使用します。
3192 3218
3193Claude Code は次の場合にはこのイベントを発火しません。3219Claude Code は、次の場合にはこのイベントを発火しません。
3194 3220
3195* `--add-dir` 起動フラグでディレクトリを渡した場合。これらのディレクトリは [SessionStart](#sessionstart) が対象とします3221* `--add-dir` 起動フラグでディレクトリを渡した場合。これらのディレクトリは [SessionStart](#sessionstart) で対応します
3196* `/permissions` の Workspace タブでディレクトリを追加した場合3222* `/permissions` の Workspace タブでディレクトリを追加した場合
3197* すでに作業ディレクトリであるか、作業ディレクトリ内にあるディレクトリを追加した場合3223* すでに作業ディレクトリであるディレクトリ、または作業ディレクトリ内のディレクトリを追加した場合
3198 3224
3199Claude Code はサンドボックスと権限の状態を更新した後に DirectoryAdded を発火するため、フックが実行される時点で、サンドボックス化されたツールにはすでに新しいディレクトリが見えています。フックのコマンド自体はサンドボックス外で実行されます。3225Claude Code はサンドボックスと権限の状態を更新した後に DirectoryAdded を発火するため、フックの実行時には、サンドボックス化されたツールからすでに新しいディレクトリが見える状態になっています。フックのコマンド自体はサンドボックス外で実行されます。
3200 3226
3201Claude Code はフックを待ちません。追加はすぐに完了し、フックは 600 秒のデフォルトのタイムアウトでバックグラウンドで実行されます。3227Claude Code はフックを待ちません。追加はすぐに完了し、フックはデフォルトの 600 秒のタイムアウトでバックグラウンドで実行されます。
3202 3228
3203matcher は、ディレクトリがどのように追加されたかでフィルタリングします。3229matcher は、ディレクトリがどのように追加されたかでフィルタリングします。
3204 3230
3205| Matcher | 発火するタイミング |3231| Matcher | 発火するタイミング |
3206| :- | :- |3232| :- | :- |
3207| `slash_command` | `/add-dir` でディレクトリを追加した場合 |3233| `slash_command` | `/add-dir` でディレクトリを追加したとき |
3208| `register_repo_root` | SDK クライアントが `register_repo_root` 制御リクエストでディレクトリを追加した場合 |3234| `register_repo_root` | SDK クライアントが `register_repo_root` 制御リクエストでディレクトリを追加したとき |
3209 3235
3210<h4 id="directoryadded-input">3236<h4 id="directoryadded-input">
3211 DirectoryAdded の入力3237 DirectoryAdded の入力
3216| フィールド | 説明 |3242| フィールド | 説明 |
3217| :- | :- |3243| :- | :- |
3218| `directory` | 追加されたディレクトリの絶対パス |3244| `directory` | 追加されたディレクトリの絶対パス |
3219| `source` | ディレクトリがどのように追加されたか。`/add-dir` の場合は `"slash_command"`、SDK の制御リクエストの場合は `"register_repo_root"` |3245| `source` | ディレクトリの追加方法。`/add-dir` の場合は `"slash_command"`、SDK の制御リクエストの場合は `"register_repo_root"` |
3220 3246
3221```json theme={null}3247```json theme={null}
3222{3248{
3229}3255}
3230```3256```
3231 3257
3232DirectoryAdded フックには決定制御がありません。フックが実行される時点で追加はすでに完了しているため、追加をブロックすることはできません。Claude Code は JSON 出力から `continue` フィールドを破棄し、残りをソースごとに異なる方法で扱います。3258DirectoryAdded フックには決定制御がありません。フックの実行時には追加がすでに完了しているため、追加をブロックすることはできません。Claude Code はこれらのフックの JSON 出力から `continue` フィールドを破棄し、残りはソースに応じて異なる方法で表示します。
3233 3259
3234* `slash_command`: Claude Code はフックの `systemMessage` を、ユーザーに表示するのではなく、次の会話ターンでコンテキストとして Claude に配信します。失敗したフックの数がトランスクリプトに表示されます。失敗の完全な出力はデバッグログに記録されます3260* `slash_command`:Claude Code はフックの `systemMessage` をユーザーに表示するのではなく、次の会話ターンでコンテキストとして Claude に配信します。失敗したフックの数がトランスクリプトに表示されます。失敗の完全な出力はデバッグログに記録されます
3235* `register_repo_root`: Claude Code は `systemMessage` の出力と失敗の出力をデバッグログにのみ書き込みます3261* `register_repo_root`:Claude Code は `systemMessage` の出力と失敗の出力をデバッグログにのみ書き込みます
3236 3262
3237<h3 id="filechanged">3263<h3 id="filechanged">
3238 FileChanged3264 FileChanged
3239</h3>3265</h3>
3240 3266
3241監視対象のファイルがディスク上で変更されたときに実行されます。Claude Code はツール呼び出しを調べるのではなく、ファイルシステムウォッチャーで変更を検出するため、何がファイルを変更したかに関係なくフックを実行します。`Edit` や `Write` のツール呼び出し、Claude が `Bash` で実行したスクリプト、あるいは Claude Code 外部のプロセスのいずれであっても実行されます。一般的な用途は、プロジェクトの設定ファイルが変更されたときに環境変数を再読み込みすることです。3267監視対象のファイルがディスク上で変更されたときに実行されます。Claude Code はツール呼び出しを調べるのではなく、ファイルシステムウォッチャーで変更を検出するため、ファイルを何が変更したかに関係なくフックを実行します。`Edit` や `Write` のツール呼び出し、Claude が `Bash` で実行するスクリプト、あるいは Claude Code とはまったく無関係のプロセスのいずれでも同様です。一般的な用途は、プロジェクトの設定ファイルが変更されたときに環境変数を再読み込みすることです。
3242 3268
3243このイベントの `matcher` は 2 つの役割を果たします。3269このイベントの `matcher` には 2 つの役割があります。
3244 3270
3245* **監視リストの構築**: 値は `|` で分割され、各セグメントが作業ディレクトリ内のリテラルなファイル名として登録されます。そのため、`".envrc|.env"` はちょうどその 2 つのファイルを監視します。ここでは正規表現パターンは役に立ちません。`^\.env` のような値は、文字どおり `^\.env` という名前のファイルを監視します。3271* **監視リストを構築する**: 値は `|` で分割され、各セグメントが作業ディレクトリ内のリテラルなファイル名として登録されます。そのため `".envrc|.env"` はちょうどこの 2 つのファイルを監視します。ここでは正規表現パターンは役に立ちません。`^\.env` のような値は、文字どおり `^\.env` という名前のファイルを監視します。
3246* **実行するフックのフィルタリング**: 監視対象のファイルが変更されると、同じ値が、変更されたファイルのベース名に対する標準の [matcher ルール](#matcher-patterns)を使用して、どのフックグループを実行するかをフィルタリングします。3272* **実行するフックを絞り込む**: 監視対象のファイルが変更されると、同じ値が標準の [matcher ルール](#matcher-patterns)に従い、変更されたファイルのベース名に対して照合され、実行するフックグループが絞り込まれます。
3247 3273
3248この例では、`Bash` コマンドや外部スクリプトによるファイルの書き換えを含め、変更があるたびに `data.csv` の改行コードを正規化します。3274次の例は、`Bash` コマンドや外部スクリプトによる書き換えも含め、`data.csv` が変更されるたびにその改行コードを正規化します。
3249 3275
3250```json theme={null}3276```json theme={null}
3251{3277{
3265}3291}
3266```3292```
3267 3293
3268フックは、stdin の [JSON 入力](#filechanged-input)の `file_path` フィールドから、変更されたファイルの絶対パスを読み取ります。その `grep` によるガードは、`perl` が削除するのと同じもの、つまり行末の CR をテストするため、正規化後の実行ではファイルに触れずに終了します。より緩いガードにすると無限ループになります。`perl -i` は何も置換しない場合でもファイルを書き換え、Claude Code は書き換えのたびに再びフックを実行するためです。このスクリプトを `/path/to/normalize-line-endings.sh` に保存し、実行可能にしてください。3294このフックは、stdin で受け取る [JSON 入力](#filechanged-input)の `file_path` フィールドから、変更されたファイルの絶対パスを読み取ります。`grep` によるガードは `perl` が削除するものと同じもの、つまり行末の CR を検査するため、正規化後の実行ではファイルに触れずに終了します。これより緩いガードにすると無限ループになります。`perl -i` は何も置換しない場合でもファイルを書き換え、Claude Code は書き換えのたびにフックを再実行するためです。このスクリプトを `/path/to/normalize-line-endings.sh` に保存し、実行可能にしてください。
3269 3295
3270```bash theme={null}3296```bash theme={null}
3271#!/bin/bash3297#!/bin/bash
3275fi3301fi
3276```3302```
3277 3303
3278フックが機能することを確認するには、`Bash` コマンドで `data.csv` に CRLF の行を追加するよう Claude に依頼します。Claude Code がフックを実行し、ファイルの改行コードは LF になります。3304フックが動作することを確認するには、`Bash` コマンドで `data.csv` に CRLF の行を追記するよう Claude に依頼します。Claude Code がフックを実行し、ファイルの改行コードは LF になります。
3279 3305
3280事前に名前を指定できないファイルを監視するには、フックから [`watchPaths`](#filechanged-output) を返して、監視リストを動的に更新します。Claude Code は何かが監視するファイルを指定した場合にのみウォッチャーを開始するため、少なくとも 1 つのファイルを matcher で指定した FileChanged グループ、または `watchPaths` を返す [SessionStart](#sessionstart-decision-control) フックや [CwdChanged](#cwdchanged) フックで、リストに初期値を設定してください。監視対象のファイルが変更されたときにどのフックグループを実行するかは引き続き matcher でフィルタリングされるため、動的なパスを処理するグループでは matcher を省略してください。省略した matcher はすべての監視対象ファイルにマッチし、監視リストには何も追加しません。`"*"` の matcher もすべてのファイルにマッチしますが、Claude Code は他の値と同様に、それを `*` という名前のリテラルなファイルとして監視リストに登録します。3306事前に名前を指定できないファイルを監視するには、フックから [`watchPaths`](#filechanged-output) を返して監視リストを動的に更新します。Claude Code は、監視するファイルを何かが指定したときにのみウォッチャーを起動します。そのため、少なくとも 1 つのファイルを指定する matcher を持つ FileChanged グループか、`watchPaths` を返す [SessionStart](#sessionstart-decision-control) フックまたは [CwdChanged](#cwdchanged) フックで、リストに初期値を与えてください。監視対象のファイルが変更されたときには引き続き matcher によって実行するフックグループが絞り込まれるため、動的なパスを処理するグループでは matcher を省略してください。省略した matcher は監視対象のすべてのファイルに一致し、監視リストには何も追加しません。`"*"` の matcher もすべてのファイルに一致しますが、Claude Code はほかの値と同様にこれを監視リストに登録し、`*` という名前のリテラルなファイルとして扱います。
3281 3307
3282FileChanged フックは [`CLAUDE_ENV_FILE`](#persist-environment-variables) にアクセスできます。そのファイルに書き込まれた変数は、次の [CwdChanged](#cwdchanged) イベントで Claude Code がクリアするまで、後続の Bash コマンドに引き継がれます。3308FileChanged フックは [`CLAUDE_ENV_FILE`](#persist-environment-variables) にアクセスできます。このファイルに書き込まれた変数は、次の [CwdChanged](#cwdchanged) イベントで Claude Code がクリアするまで、以降の Bash コマンドに引き継がれます。
3283 3309
3284<h4 id="filechanged-input">3310<h4 id="filechanged-input">
3285 FileChanged の入力3311 FileChanged の入力
3286</h4>3312</h4>
3287 3313
3288[共通入力フィールド](#common-input-fields)に加えて、FileChanged フックは `file_path` と `event` を受け取ります。3314[共通の入力フィールド](#common-input-fields)に加えて、FileChanged フックは `file_path` と `event` を受け取ります。
3289 3315
3290| フィールド | 説明 |3316| フィールド | 説明 |
3291| :- | :- |3317| :- | :- |
3292| `file_path` | 変更されたファイルの絶対パス |3318| `file_path` | 変更されたファイルの絶対パス |
3293| `event` | 何が起きたか。変更されたファイルの場合は `"change"`、作成されたファイルの場合は `"add"`、削除されたファイルの場合は `"unlink"` |3319| `event` | 発生した内容。変更されたファイルは `"change"`、作成されたファイルは `"add"`、削除されたファイルは `"unlink"` |
3294 3320
3295```json theme={null}3321```json theme={null}
3296{3322{
3307 FileChanged の出力3333 FileChanged の出力
3308</h4>3334</h4>
3309 3335
3310すべてのフックで利用できる [JSON 出力フィールド](#json-output)に加えて、FileChanged フックは `watchPaths` を返して、監視するファイルパスを動的に更新できます。3336すべてのフックで使用できる [JSON 出力フィールド](#json-output)に加えて、FileChanged フックは `watchPaths` を返して、監視するファイルパスを動的に更新できます。
3311 3337
3312| フィールド | 説明 |3338| フィールド | 説明 |
3313| :- | :- |3339| :- | :- |
3314| `watchPaths` | 絶対パスの配列。現在の動的な監視リストを置き換えます。`matcher` の設定に含まれるパスは常に監視されます。フックスクリプトが、変更されたファイルに基づいて監視すべき追加のファイルを見つけた場合に使用します |3340| `watchPaths` | 絶対パスの配列。現在の動的な監視リストを置き換えます。`matcher` の設定に含まれるパスは常に監視されます。変更されたファイルに基づいて、フックスクリプトが監視すべき追加のファイルを見つけた場合に使用します |
3315 3341
3316FileChanged フックには決定制御がありません。ファイルの変更が発生するのをブロックすることはできません。3342FileChanged フックには判定の制御がありません。ファイルの変更が発生するのをブロックすることはできません。
3317 3343
3318Claude Code は JSON 出力から `watchPaths` と `systemMessage` を読み取り、`continue` を破棄します。対話型セッションでは、`systemMessage` を短いターミナル通知として表示します。このメッセージは SDK のメッセージストリームには届きません。3344Claude Code は JSON 出力から `watchPaths` と `systemMessage` を読み取り、`continue` は破棄します。対話セッションでは、`systemMessage` を短いターミナル通知として表示します。このメッセージは SDK のメッセージストリームには届きません。
3319 3345
3320<h3 id="worktreecreate">3346<h3 id="worktreecreate">
3321 WorktreeCreate3347 WorktreeCreate
3322</h3>3348</h3>
3323 3349
3324次のような場合に Claude Code が worktree を作成したときに実行されます。3350次のようなケースで Claude Code が worktree を作成するときに実行されます。
3325 3351
3326* `claude --worktree` でセッションを開始した3352* `claude --worktree` でセッションを開始した
3327* Claude がセッション中に worktree を作成し、[`EnterWorktree`](/docs/ja/tools-reference) ツールでそこに切り替えた3353* Claude がセッション中に worktree を作成し、[`EnterWorktree`](/docs/ja/tools-reference) ツールでその worktree に切り替えた
3328* [サブエージェントが `isolation: "worktree"` を使用している](/docs/ja/sub-agents#choose-the-subagent-scope)3354* [サブエージェントが `isolation: "worktree"` を使用した](/docs/ja/sub-agents#choose-the-subagent-scope)
3329* [ワークフロー](/docs/ja/workflows#migrate-many-files-in-parallel)がエージェントを専用の worktree で実行した3355* [ワークフロー](/docs/ja/workflows#migrate-many-files-in-parallel)がエージェントを専用の worktree で実行した
3330* Claude Code が[バックグラウンドセッション](/docs/ja/agent-view#how-file-edits-are-isolated)を専用の worktree で分離した3356* Claude Code が[バックグラウンドセッション](/docs/ja/agent-view#how-file-edits-are-isolated)を専用の worktree に分離した
3331* `worktree` モードの [`claude remote-control`](/docs/ja/remote-control#start-a-remote-control-session) が専用の worktree でセッションを開始した3357* `worktree` モードの [`claude remote-control`](/docs/ja/remote-control#start-a-remote-control-session) が専用の worktree でセッションを開始した
3332 3358
3333Claude が `EnterWorktree` を呼び出す代わりに Bash ツールで `git worktree add` を実行した場合、WorktreeCreate フックは実行されません。そのコマンドを検査またはブロックするには、`Bash` matcher を指定した [`PreToolUse`](#pretooluse) フックを追加してください。3359Claude が `EnterWorktree` を呼び出すのではなく、Bash ツールを通じて `git worktree add` を実行した場合、WorktreeCreate フックは実行されません。そのコマンドを検査またはブロックするには、`Bash` matcher を持つ [`PreToolUse`](#pretooluse) フックを追加してください。
3334 3360
3335デフォルトでは、Claude Code は `git worktree` を使って分離された作業コピーを作成します。WorktreeCreate フックを設定すると、このデフォルトの git の動作が置き換えられ、SVN、Perforce、Mercurial など別のバージョン管理システムを使用できるようになります。3361デフォルトでは、Claude Code は `git worktree` を使って分離された作業コピーを作成します。WorktreeCreate フックを設定すると、このデフォルトの git の動作が置き換えられ、SVN、Perforce、Mercurial などの別のバージョン管理システムを使用できるようになります。
3336 3362
3337フックはデフォルトの動作を完全に置き換えるため、[`.worktreeinclude`](/docs/ja/worktrees#copy-gitignored-files-into-worktrees) は処理されません。`.env` などのローカル設定ファイルを新しい worktree にコピーする必要がある場合は、フックスクリプト内でコピーしてください。3363フックはデフォルトの動作を完全に置き換えるため、[`.worktreeinclude`](/docs/ja/worktrees#copy-gitignored-files-into-worktrees) は処理されません。`.env` のようなローカルの設定ファイルを新しい worktree にコピーする必要がある場合は、フックスクリプトの中で行ってください。
3338 3364
3339フックは、作成された worktree ディレクトリのパスを返す必要があります。Claude Code はこのパスを分離されたセッションの作業ディレクトリとして使用します。各フックタイプがパスを返す方法については、[WorktreeCreate の出力](#worktreecreate-output)を参照してください。3365フックは、作成した worktree ディレクトリへのパスを返す必要があります。Claude Code はこのパスを、分離されたセッションの作業ディレクトリとして使用します。各フックタイプがパスを返す方法については、[WorktreeCreate の出力](#worktreecreate-output)を参照してください。
3340 3366
3341Claude Code はフックの成功と返されたパスに基づいて動作し、`systemMessage` と `continue` は破棄します。3367Claude Code はフックの成功と返されたパスに基づいて動作し、`systemMessage` と `continue` は破棄します。
3342 3368
3343この例では、SVN の作業コピーを作成し、Claude Code が使用するパスを出力します。リポジトリの URL は独自のものに置き換えてください。3369次の例は SVN の作業コピーを作成し、Claude Code が使用するパスを出力します。リポジトリの URL は自分のものに置き換えてください。
3344 3370
3345```json theme={null}3371```json theme={null}
3346{3372{
3359}3385}
3360```3386```
3361 3387
3362このフックは、stdin の JSON 入力から worktree の `name` を読み取り、新しいディレクトリに新規コピーをチェックアウトして、そのディレクトリパスを出力します。最終行の `echo` が、Claude Code が worktree のパスとして読み取るものです。パスの妨げにならないよう、その他の出力はすべて stderr にリダイレクトしてください。3388このフックは stdin の JSON 入力から worktree の `name` を読み取り、新しいディレクトリに新規のコピーをチェックアウトして、そのディレクトリのパスを出力します。最後の行の `echo` が、Claude Code が worktree のパスとして読み取るものです。パスの妨げにならないよう、それ以外の出力はすべて stderr にリダイレクトしてください。
3363 3389
3364<h4 id="worktreecreate-input">3390<h4 id="worktreecreate-input">
3365 WorktreeCreate の入力3391 WorktreeCreate の入力
3366</h4>3392</h4>
3367 3393
3368[共通の入力フィールド](#common-input-fields)に加えて、WorktreeCreate フックは `name` フィールドを受け取ります。これは新しい worktree のスラッグ識別子で、ユーザーが指定するか自動生成されます(例: `bold-oak-a3f2`)。3394[共通の入力フィールド](#common-input-fields)に加えて、WorktreeCreate フックは `name` フィールドを受け取ります。これは新しい worktree のスラッグ識別子で、ユーザーが指定したものか自動生成されたもの(例: `bold-oak-a3f2`)です。
3369 3395
3370```json theme={null}3396```json theme={null}
3371{3397{
3381 WorktreeCreate の出力3407 WorktreeCreate の出力
3382</h4>3408</h4>
3383 3409
3384WorktreeCreate フックは、標準の許可/ブロックの決定モデルを使用しません。代わりに、フックの成功または失敗によって結果が決まります。フックは、作成された worktree ディレクトリのパスを返す必要があります。3410WorktreeCreate フックは、標準の許可/ブロックの判定モデルを使用しません。代わりに、フックの成功または失敗によって結果が決まります。フックは、作成した worktree ディレクトリへのパスを返す必要があります。
3385 3411
3386* **コマンドフック**(`type: "command"`): stdout の最後の空でない行としてパスを出力します。Claude Code はその行を読み取る前に ANSI エスケープコードを除去するため、`echo` の前に出力されたシェルの起動バナーは無視されます。フックのその他の出力は stderr にリダイレクトしてください。3412* **コマンドフック**(`type: "command"`): パスを stdout の最後の空でない行として出力します。Claude Code はその行を読み取る前に ANSI エスケープコードを取り除くため、`echo` より前に出力されたシェルの起動バナーは無視されます。フックのそれ以外の出力は stderr にリダイレクトしてください。
3387* **HTTP フック**(`type: "http"`): レスポンスボディで `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` を返します。3413* **HTTP フック**(`type: "http"`): レスポンス本文で `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` を返します。
3388 3414
3389フックが失敗した場合、またはパスを生成しなかった場合、worktree の作成はエラーで失敗します。3415フックが失敗した場合やパスを出力しなかった場合、worktree の作成はエラーで失敗します。
3390 3416
3391Claude Code は相対パスをフックが実行されたディレクトリを基準に解決し、その中の `.` や `..` のセグメントを正規化します。結果のパスが Claude Code が移動できるディレクトリでない場合、セッションはそのパスを示すエラーを出力し、終了コード 1 で終了します。3417Claude Code は相対パスをフックが実行されたディレクトリを基準に解決し、その中の `.` や `..` のセグメントを折りたたみます。結果のパスが Claude Code が移動できるディレクトリでない場合、セッションはそのパスを示すエラーを出力し、終了コード 1 で終了します。
3392 3418
3393Claude Code は、`.` や `..` のセグメントを含む絶対パス、およびリポジトリルート以下のシンボリックリンクを経由するパスを拒否します。リポジトリにコミットされたシンボリックリンクによって、worktree がリポジトリの外部にリダイレクトされる可能性があるためです。エラーには拒否された構成要素が示されます。リポジトリ内のシンボリックリンクを経由しない、正規化されたパスを返してください。v2.1.216 より前は、worktree の作成時にこのチェックを行わずにフックのパスに従っていました。3419Claude Code は、`.` や `..` のセグメントを含む絶対パス、およびリポジトリのルートより下でシンボリックリンクを経由するパスを拒否します。リポジトリにコミットされたシンボリックリンクによって、worktree がリポジトリの外にリダイレクトされる可能性があるためです。エラーには拒否された構成要素が示されます。リポジトリ内のシンボリックリンクを経由しない、正規化されたパスを返してください。v2.1.216 より前は、worktree の作成はこのチェックを行わずにフックのパスに従っていました。
3394 3420
3395<h3 id="worktreeremove">3421<h3 id="worktreeremove">
3396 WorktreeRemove3422 WorktreeRemove
3398 3424
3399[`WorktreeCreate`](#worktreecreate) フックが作成した worktree を Claude Code がクリーンアップするときに実行されます。このイベントは次の場合に発生します。3425[`WorktreeCreate`](#worktreecreate) フックが作成した worktree を Claude Code がクリーンアップするときに実行されます。このイベントは次の場合に発生します。
3400 3426
3401* 対話型の [worktree セッション](/docs/ja/worktrees#start-claude-in-a-worktree)を終了し、Claude Code の確認に対して worktree の削除を選択した場合3427* 対話的な [worktree セッション](/docs/ja/worktrees#start-claude-in-a-worktree)を終了し、Claude Code に確認されたときに worktree の削除を選択した
3402* [名前を付けていない](/docs/ja/sessions#name-your-sessions)対話型の worktree セッションを終了し、Claude Code が変更されたファイルや追跡されていないファイルを検出せず、確認なしで worktree を削除した場合3428* [名前を付けていない](/docs/ja/sessions#name-your-sessions)対話的な worktree セッションを終了し、Claude Code が変更済みまたは未追跡のファイルを見つけなかったため、確認なしで worktree を削除した
3403* worktree 内で実行されている[バックグラウンドセッション](/docs/ja/agent-view#what-deleting-a-session-removes)を削除した場合3429* worktree で実行されている[バックグラウンドセッション](/docs/ja/agent-view#what-deleting-a-session-removes)を削除した
3404* セッション中に worktree を終了して削除するよう Claude に依頼し、Claude が [`ExitWorktree`](/docs/ja/tools-reference) ツールでそれを削除した3430* セッション中に worktree を終了して削除するよう Claude に依頼し、Claude が [`ExitWorktree`](/docs/ja/tools-reference) ツールでそれを削除した
3405* [`claude remote-control`](/docs/ja/remote-control#start-a-remote-control-session) が `worktree` モードで開始したセッションがクラッシュせずに終了し、Claude Code がその worktree に変更済みファイル、未追跡ファイル、新しいコミットを見つけなかった3431* [`claude remote-control`](/docs/ja/remote-control#start-a-remote-control-session) が `worktree` モードで開始したセッションがクラッシュせずに終了し、Claude Code がその worktree に変更済みまたは未追跡のファイルも新しいコミットも見つけなかった
3406* `worktree` モードで開始したセッションがまだ実行中の状態で `claude remote-control` を停止し、Claude Code がそれらの worktree に変更済みファイル、未追跡ファイル、新しいコミットを見つけなかった3432* `worktree` モードで開始したセッションがまだ実行中の状態で `claude remote-control` を停止し、Claude Code がそれらの worktree に変更済みまたは未追跡のファイルも新しいコミットも見つけなかった
3407 3433
3408サブエージェントまたはワークフローのエージェントが終了したとき、Claude Code は WorktreeCreate フックがそれ用に作成した worktree を保持し、WorktreeRemove フックを実行しません。作業が完了したら、それらの worktree は自分で削除してください。3434サブエージェントやワークフローのエージェントが終了したとき、Claude Code は WorktreeCreate フックがそのエージェントのために作成した worktree を保持し、WorktreeRemove フックは実行しません。作業が完了したら、それらの worktree は自分で削除してください。
3409 3435
3410`ExitWorktree` の呼び出しや `claude remote-control` のクリーンアップでは、Claude Code はフックの実行前に確認を求めません。`ExitWorktree` は、呼び出しで [`discard_changes: true`](/docs/ja/agent-sdk/typescript#exitworktree) が渡されない限りフックが作成した worktree の削除を拒否するため、その経路ではフックが最後のチェックになります。3436`ExitWorktree` の呼び出しや `claude remote-control` のクリーンアップでは、Claude Code はフックの実行前に確認を求めません。`ExitWorktree` は、呼び出しで [`discard_changes: true`](/docs/ja/agent-sdk/typescript#exitworktree) が渡されない限り、フックで作成された worktree の削除を拒否します。そのため、この経路ではフックが最後のチェックになります。
3411 3437
3412Claude Code は git を使用して変更されたファイルや追跡されていないファイルを探すため、git のチェックアウトではない worktree や git のチェックアウト内にない worktree では、ディレクトリにコミットされていない作業があっても何も検出されません。WorktreeRemove フックで何かを削除する前に、そのような作業がないかを確認してください。3438Claude Code は git を使って変更済みまたは未追跡のファイルを探すため、git のチェックアウトではない worktree やその中にない worktree では、ディレクトリにコミットされていない作業があっても何も見つけません。WorktreeRemove フックでは、何かを削除する前にそのような作業がないか確認してください。
3413 3439
3414git ベースの worktree では、Claude Code が `git worktree remove` で自動的にクリーンアップを処理します。WorktreeCreate フックを設定した場合は、WorktreeRemove フックと組み合わせてクリーンアップを制御してください。3440git ベースの worktree では、Claude Code は `git worktree remove` でクリーンアップを自動的に処理します。WorktreeCreate フックを設定した場合は、WorktreeRemove フックと組み合わせてクリーンアップを制御してください。
3415 3441
3416* **WorktreeRemove フックがない場合**:終了時または `ExitWorktree` による削除では Claude Code は git にフォールバックし、`claude remote-control` がクリーンアップする場合は worktree を保持します。3442* **WorktreeRemove フックがない場合**: 終了時または `ExitWorktree` による削除では Claude Code は git にフォールバックし、`claude remote-control` がクリーンアップする場合は worktree を保持します。
3417 * **worktree セッションを終了した場合、または Claude が `ExitWorktree` を呼び出した場合**:Claude Code は WorktreeCreate フックが返したパスを `git worktree remove --force` と同様に削除するため、git が認識する worktree は削除されます。git が認識しない worktree(例:フックが git 以外のバージョン管理システムで作成したもの)はディスク上に残ります。3443 * **worktree セッションを終了した場合、または Claude が `ExitWorktree` を呼び出した場合**: Claude Code は WorktreeCreate フックが返したパスを `git worktree remove --force` と同じように削除するため、git が認識している worktree は削除されます。git が認識していない worktree(たとえば、フックが git 以外のバージョン管理システムで作成したもの)はディスク上に残ります。
3418 * **`claude remote-control` がセッションの worktree をクリーンアップする場合**:worktree はディスク上に残り、`claude remote-control` を実行しているターミナルに `worktree removal failed, kept: <path>` が表示されます。3444 * **`claude remote-control` がセッションの worktree をクリーンアップする場合**: worktree はディスク上に残り、`claude remote-control` を実行しているターミナルに `worktree removal failed, kept: <path>` と表示されます。
3419 * **バックグラウンドセッションを削除した場合**:[セッションの削除で削除されるもの](/docs/ja/agent-view#what-deleting-a-session-removes)を参照してください。3445 * **バックグラウンドセッションを削除した場合**: [セッションの削除で削除されるもの](/docs/ja/agent-view#what-deleting-a-session-removes)を参照してください。
3420* **フックが 0 で終了した場合**: worktree は削除されたものとみなされます。Claude Code はフックからそれ以外の情報を読み取らないため、フックがディレクトリを削除したことを確認してください。3446* **フックが 0 で終了した場合**: worktree は削除済みとみなされます。Claude Code はフックからそれ以外に何も読み取らないため、フックが確実にディレクトリを削除するようにしてください。
3421* **フックが 0 以外で終了した場合**: その後も `worktree_path` のディレクトリが存在していれば削除は失敗し、git へのフォールバックなしで worktree はディスク上に残ります。0 以外で終了する前にディレクトリを削除したフックは、削除済みとみなされます。失敗の報告方法については、[WorktreeRemove の入力](#worktreeremove-input)を参照してください。3447* **フックが 0 以外で終了した場合**: その後も `worktree_path` のディレクトリが存在していれば削除は失敗し、worktree は git へのフォールバックなしにディスク上に残ります。0 以外で終了する前にディレクトリを削除したフックは、削除済みとみなされます。失敗の報告方法については、[WorktreeRemove の入力](#worktreeremove-input)を参照してください。
3422 3448
3423Claude Code は WorktreeCreate フックが返したパスしか把握していないため、フックで作成された worktree に属するブランチを削除することはありません。WorktreeCreate フックがブランチを作成する場合は、WorktreeRemove フックでそのブランチを削除してください。3449Claude Code は WorktreeCreate フックが返したパスしか把握していないため、フックで作成された worktree に属するブランチを削除することはありません。WorktreeCreate フックがブランチを作成する場合は、WorktreeRemove フックでそれを削除してください。
3424 3450
3425Claude Code は、`systemMessage` や `continue` などの WorktreeRemove フックの [JSON 出力フィールド](#json-output)を破棄します。3451Claude Code は、`systemMessage` や `continue` などの WorktreeRemove フックの [JSON 出力フィールド](#json-output)を破棄します。
3426 3452
3427バックグラウンドセッションの削除では、Claude Code はフックを実行する前に保存されている worktree のパスを検証し、シンボリックリンクであるパスや、リポジトリルートより下のシンボリックリンクを経由するパスを拒否します。この経路では、まだファイルを含む worktree に対してフックが実行されるのは、[agent view](/docs/ja/agent-view#what-deleting-a-session-removes) で削除を確認した場合のみです。そのような worktree に対して [`claude rm`](/docs/ja/agent-view#manage-sessions-from-the-shell) を実行した場合は、代わりにセッションと worktree が保持されます。v2.1.216 より前は、これらのチェックなしで保存されたパスに対してフックが実行されていました。3453バックグラウンドセッションの削除では、Claude Code はフックを実行する前に保存されている worktree のパスを検証し、シンボリックリンクであるパスや、リポジトリのルートより下でシンボリックリンクを経由するパスを拒否します。この経路では、まだファイルが含まれている worktree に対してフックが実行されるのは、[エージェントビュー](/docs/ja/agent-view#what-deleting-a-session-removes)で削除を確定した場合のみです。そのような worktree の場合、[`claude rm`](/docs/ja/agent-view#manage-sessions-from-the-shell) は代わりにセッションと worktree を保持します。v2.1.216 より前は、これらのチェックなしに保存されたパスに対してフックが実行されていました。
3428 3454
3429Claude Code は、WorktreeCreate が返したパスをフック入力の `worktree_path` として渡します。この例では、そのパスを読み取ってディレクトリを削除します。3455Claude Code は、WorktreeCreate が返したパスをフックの入力の `worktree_path` として渡します。次の例はそのパスを読み取り、ディレクトリを削除します。
3430 3456
3431```json theme={null}3457```json theme={null}
3432{3458{
3461}3487}
3462```3488```
3463 3489
3464WorktreeRemove フックの終了コードによって結果が決まります。フックが 0 以外で終了し、その後も `worktree_path` のディレクトリが存在する場合、削除は失敗します。3490結果は WorktreeRemove フックの終了コードによって決まります。フックが 0 以外で終了し、その後も `worktree_path` のディレクトリが存在している場合、削除は失敗します。
3465 3491
3466* worktree はディスク上に残り、フックのコマンドと stderr は[デバッグログ](#debug-hooks)に出力されます。3492* worktree はディスク上に残り、フックのコマンドと stderr は[デバッグログ](#debug-hooks)に記録されます。
3467* バックグラウンドセッションを削除しようとしていた場合、セッションも残ります。[エージェントビュー](/docs/ja/agent-view#what-deleting-a-session-removes)の拒否メッセージには、`exited 1` のようなフックの終了状況、stderr の冒頭部分の引用、およびセッションを再度削除した場合にディレクトリがそれでも削除されるかどうかが表示されます。3493* バックグラウンドセッションを削除しようとしていた場合は、セッションも残ります。[エージェントビュー](/docs/ja/agent-view#what-deleting-a-session-removes)の拒否メッセージには、`exited 1` のようにフックがどのように終了したかが示され、stderr の冒頭が引用され、セッションを再度削除した場合にディレクトリが強制的に削除されるかどうかが示されます。
3468* `claude remote-control` がセッションの worktree をクリーンアップしていた場合は、それを実行しているターミナルに `worktree removal failed, kept: <path>` が表示されます。3494* `claude remote-control` がセッションの worktree をクリーンアップしていた場合は、それを実行しているターミナルに `worktree removal failed, kept: <path>` と表示されます。
3469 3495
3470<h3 id="precompact">3496<h3 id="precompact">
3471 PreCompact3497 PreCompact
3472</h3>3498</h3>
3473 3499
3474Claude Code がコンテキスト圧縮処理を実行する直前に実行されます。3500Claude Code がコンテキスト圧縮の操作を実行する直前に実行されます。
3475 3501
3476matcher の値は、コンテキスト圧縮が手動でトリガーされたか自動でトリガーされたかを示します。3502matcher の値は、圧縮が手動でトリガーされたか自動でトリガーされたかを示します。
3477 3503
3478| Matcher | 発生するタイミング |3504| Matcher | 発生するタイミング |
3479| :- | :- |3505| :- | :- |
3480| `manual` | `/compact` |3506| `manual` | `/compact` |
3481| `auto` | 会話が[自動圧縮ウィンドウ](/docs/ja/model-config#set-the-auto-compact-window)に達したときの自動圧縮 |3507| `auto` | 会話が[自動圧縮ウィンドウ](/docs/ja/model-config#set-the-auto-compact-window)に達したときの自動圧縮、および[アイドル時の圧縮](/docs/ja/settings-reference#idlecompaction) |
3482 3508
3483圧縮をブロックするには、終了コード 2 で終了します。手動の `/compact` の場合、stderr のメッセージがユーザーに表示されます。`"decision": "block"` を含む JSON を返すことでもブロックできます。3509圧縮をブロックするには、終了コード 2 で終了します。手動の `/compact` の場合、stderr のメッセージがユーザーに表示されます。`"decision": "block"` を含む JSON を返してブロックすることもできます。
3484 3510
3485自動圧縮のブロックは、発生するタイミングによって影響が異なります。コンテキストの上限に達する前に先行して圧縮がトリガーされた場合、Claude Code は圧縮をスキップし、会話は圧縮されずに続行されます。API がすでに返したコンテキスト上限エラーから回復するために圧縮がトリガーされた場合は、元のエラーが表面化し、現在のリクエストは失敗します。3511自動圧縮をブロックした場合の効果は、それが発生したタイミングによって異なります。コンテキストの上限に達する前に先回りして圧縮がトリガーされた場合、Claude Code は圧縮をスキップし、会話は圧縮されないまま続行されます。API からすでに返されたコンテキスト上限エラーから回復するために圧縮がトリガーされた場合は、元のエラーが表面化し、現在のリクエストは失敗します。
3486 3512
3487Claude Code は、PreCompact フックの `systemMessage` と `continue` フィールドを破棄します。3513Claude Code は、PreCompact フックの `systemMessage` フィールドと `continue` フィールドを破棄します。
3488 3514
3489<h4 id="precompact-input">3515<h4 id="precompact-input">
3490 PreCompact の入力3516 PreCompact の入力
3507 PostCompact3533 PostCompact
3508</h3>3534</h3>
3509 3535
3510Claude Code がコンテキスト圧縮処理を完了した後に実行されます。このイベントを使用すると、圧縮後の新しい状態に対応できます。例えば、生成された要約をログに記録したり、外部の状態を更新したりできます。Claude Code は、PostCompact フックの `systemMessage` と `continue` フィールドを破棄します。3536Claude Code がコンテキスト圧縮の操作を完了した後に実行されます。このイベントを使って、圧縮後の新しい状態に対応できます。たとえば、生成された要約をログに記録したり、外部の状態を更新したりできます。Claude Code は、PostCompact フックの `systemMessage` フィールドと `continue` フィールドを破棄します。
3511 3537
3512`PreCompact` と同じ matcher の値が適用されます。3538`PreCompact` と同じ matcher の値が適用されます。
3513 3539
3514| Matcher | 発生するタイミング |3540| Matcher | 発生するタイミング |
3515| :- | :- |3541| :- | :- |
3516| `manual` | `/compact` の後 |3542| `manual` | `/compact` の後 |
3517| `auto` | 会話が[自動圧縮ウィンドウ](/docs/ja/model-config#set-the-auto-compact-window)に達して自動圧縮された後 |3543| `auto` | 会話が[自動圧縮ウィンドウ](/docs/ja/model-config#set-the-auto-compact-window)に達したときの自動圧縮の後、および[アイドル時の圧縮](/docs/ja/settings-reference#idlecompaction)の後 |
3518 3544
3519<h4 id="postcompact-input">3545<h4 id="postcompact-input">
3520 PostCompact の入力3546 PostCompact の入力
3521</h4>3547</h4>
3522 3548
3523[共通の入力フィールド](#common-input-fields)に加えて、PostCompact フックは `trigger` と `compact_summary` を受け取ります。`compact_summary` フィールドには、圧縮処理によって生成された会話の要約が含まれます。3549[共通の入力フィールド](#common-input-fields)に加えて、PostCompact フックは `trigger` と `compact_summary` を受け取ります。`compact_summary` フィールドには、圧縮操作によって生成された会話の要約が含まれます。
3524 3550
3525```json theme={null}3551```json theme={null}
3526{3552{
3533}3559}
3534```3560```
3535 3561
3536PostCompact フックには決定制御がありません。圧縮の結果に影響を与えることはできませんが、後続のタスクを実行できます。3562PostCompact フックには判定の制御がありません。圧縮の結果に影響を与えることはできませんが、後続のタスクを実行できます。
3537 3563
3538<h3 id="premodelswitch">3564<h3 id="premodelswitch">
3539 PreModelSwitch3565 PreModelSwitch
3540</h3>3566</h3>
3541 3567
3542ユーザーまたはクライアントが要求したモデルの切り替えを Claude Code が適用する前に実行されます。切り替えをブロックしたり、確認を求めたり、切り替えが行われる前にそのコストを表示したりするために使用します。3568ユーザーまたはクライアントが要求したモデルの切り替えを Claude Code が適用する前に実行されます。切り替えをブロックしたり、確認を求めたり、切り替えにかかるコストを事前に表示したりするために使用します。
3543 3569
3544PreModelSwitch には Claude Code v2.1.251 以降が必要です。Claude Code は次のリクエストに対してこのフックを実行します。3570PreModelSwitch には Claude Code v2.1.251 以降が必要です。Claude Code は次のリクエストに対してこれを実行します。
3545 3571
3546* `/model <name>` および `/model` ピッカー3572* `/model <name>` および `/model` のピッカー
3547* `Option+P` または `Alt+P` のモデルピッカー3573* `Option+P` または `Alt+P` のモデルピッカー
3548* `/config` の Model 設定3574* `/config` の Model 設定
3549* セッションのモデルが変わる場合の [fast mode](/docs/ja/fast-mode) のオン3575* [fast mode](/docs/ja/fast-mode) をオンにしたことでセッションのモデルが変わる場合
3550* [Agent SDK](/docs/ja/agent-sdk/typescript#query-object) ホストまたは [Remote Control](/docs/ja/remote-control) からの `set_model` リクエスト、または `apply_flag_settings` リクエストでのモデル変更3576* [Agent SDK](/docs/ja/agent-sdk/typescript#query-object) のホストまたは [Remote Control](/docs/ja/remote-control) からの `set_model` リクエスト、または `apply_flag_settings` リクエストでのモデル変更
3551 3577
3552Claude Code は、[自動モデルフォールバック](/docs/ja/model-config#automatic-model-fallback)やセッション再開時のモデル復元など、Claude Code が自ら行う切り替えに対しては PreModelSwitch フックを実行しません。これらの変更は [PostModelSwitch](#postmodelswitch) にのみ届きます。3578Claude Code は、[モデルの自動フォールバック](/docs/ja/model-config#automatic-model-fallback)やセッション再開時のモデルの復元など、自身で行う切り替えに対しては PreModelSwitch フックを実行しません。これらの変更は [PostModelSwitch](#postmodelswitch) にのみ届きます。
3553 3579
3554Claude Code は、`[1m]` サフィックスを無視して、セッションの切り替え先モデルの正規名と matcher を比較します。`opus` のようなエイリアス、日付付きのモデル ID、Amazon Bedrock のモデル ID のようなプロバイダー固有の ID は、いずれも解決先の 1 つの正規名に一致するため、`claude-opus-5` は Opus 5 のあらゆる表記をカバーします。3580Claude Code は、`[1m]` サフィックスを無視して、セッションの切り替え先モデルの正規名と matcher を比較します。`opus` のようなエイリアス、日付付きのモデル ID、Amazon Bedrock のモデル ID のようなプロバイダー固有の ID はすべて、解決先の 1 つの正規名に一致します。そのため、`claude-opus-5` は Opus 5 のあらゆる表記をカバーします。
3555 3581
3556切り替え先の正規名を Claude Code が判定できない場合(例えば、[LLM ゲートウェイ](/docs/ja/llm-gateway)だけが認識するカスタムモデル ID の場合)、Claude Code は matcher に関係なくすべての PreModelSwitch フックを実行します。そのため、ブロックを行うフックは matcher だけに頼るのではなく、入力の `to_model` を確認する必要があります。3582たとえば [LLM ゲートウェイ](/docs/ja/llm-gateway)だけが知っているカスタムモデル ID のように、Claude Code が切り替え先の正規名を特定できない場合は、matcher に関係なくすべての PreModelSwitch フックを実行します。したがって、ブロックを行うフックは matcher だけに頼らず、入力の `to_model` を確認する必要があります。
3557 3583
3558matcher は、完全な名前、`claude-opus-4-6|claude-opus-5` のような `|` 区切りのリスト、または `.*opus.*` のような正規表現として記述します。この例では完全な名前の matcher を使用し、さらにフック入力の `to_model` も確認することで、Opus 4.6 への切り替えを終了コード 2 で拒否し、それ以外の切り替え先は通過させます。3584matcher は、完全な名前、`claude-opus-4-6|claude-opus-5` のような `|` 区切りのリスト、または `.*opus.*` のような正規表現で記述します。次の例では完全な名前の matcher を使用し、さらにフックの入力の `to_model` も確認しています。これにより、終了コード 2 で終了して Opus 4.6 への切り替えを拒否し、それ以外の切り替え先は通過させます。
3559 3585
3560<Tabs>3586<Tabs>
3561 <Tab title="macOS/Linux">3587 <Tab title="macOS/Linux">
3562 コマンドは `jq` で `to_model` を確認します。3588 このコマンドは `jq` で `to_model` を確認します。
3563 3589
3564 ```json theme={null}3590 ```json theme={null}
3565 {3591 {
3608 }3634 }
3609 ```3635 ```
3610 3636
3611 このスクリプトをプロジェクトの `.claude/hooks/block-opus-46.ps1` に保存します。3637 このスクリプトをプロジェクト内の `.claude/hooks/block-opus-46.ps1` に保存します。
3612 3638
3613 ```powershell theme={null}3639 ```powershell theme={null}
3614 $hookInput = [Console]::In.ReadToEnd() | ConvertFrom-Json3640 $hookInput = [Console]::In.ReadToEnd() | ConvertFrom-Json
3621 </Tab>3647 </Tab>
3622</Tabs>3648</Tabs>
3623 3649
3624フックが機能することを確認するには、別のモデルで実行中のセッションから `/model claude-opus-4-6` を実行します。Claude Code は現在のモデルを維持し、PreModelSwitch フックが切り替えをブロックしたことを、設定したメッセージを理由として報告します。3650フックが動作することを確認するには、別のモデルで実行中のセッションから `/model claude-opus-4-6` を実行します。Claude Code は現在のモデルを維持し、PreModelSwitch フックが切り替えをブロックしたことを、指定したメッセージを理由として報告します。
3625 3651
3626<h4 id="premodelswitch-input">3652<h4 id="premodelswitch-input">
3627 PreModelSwitch の入力3653 PreModelSwitch の入力
3628</h4>3654</h4>
3629 3655
3630[共通の入力フィールド](#common-input-fields)に加えて、PreModelSwitch フックはこの表のフィールドを受け取ります。最後の 5 つは、会話を新しいモデルに再送信する際のコストを示すため、フックは切り替えが行われる前にその数値を表示できます。3656[共通の入力フィールド](#common-input-fields)に加えて、PreModelSwitch フックは次の表のフィールドを受け取ります。最後の 5 つは、会話を新しいモデルに再送信するのにかかるコストを表しており、フックは切り替えの前にその数値を表示できます。
3631 3657
3632| フィールド | 型 | 説明 |3658| フィールド | 型 | 説明 |
3633| :- | :- | :- |3659| :- | :- | :- |
3634| `from_model` | string | 切り替え元のモデル ID |3660| `from_model` | string | 切り替え元のモデル ID |
3635| `to_model` | string | 切り替え先のモデル ID。matcher はこのモデルの正規名と比較されます |3661| `to_model` | string | 切り替え先のモデル ID。matcher はこのモデルの正規名と比較されます |
3636| `requested_model` | string または `null` | リクエストで指定されたモデル。`opus` のようなエイリアス、完全なモデル ID、またはデフォルトモデルのリクエストの場合は `null` |3662| `requested_model` | string または `null` | リクエストで指定されたモデル。`opus` のようなエイリアス、完全なモデル ID、またはデフォルトモデルが要求された場合は `null` |
3637| `source` | string | リクエストの送信元。`/model <name>`、`/config` の Model 設定、または fast mode のオンの場合は `"command"`、モデルピッカーの場合は `"picker"`、Agent SDK ホストまたは Remote Control からの `set_model` リクエスト、または `apply_flag_settings` リクエストでのモデル変更の場合は `"sdk"` |3663| `source` | string | リクエストの発生元。`/model <name>`、`/config` の Model 設定、fast mode をオンにした場合は `"command"`、モデルピッカーの場合は `"picker"`、Agent SDK のホストまたは Remote Control からの `set_model` リクエスト、または `apply_flag_settings` リクエストでのモデル変更の場合は `"sdk"` |
3638| `context_tokens` | number | 次のリクエストがプロンプトとして再送信するトークン数。メイン会話の最後の応答における入力、キャッシュ読み取り、キャッシュ作成、出力のトークンの合計です。最初の応答の前は `0` |3664| `context_tokens` | number | 次のリクエストがプロンプトとして再送信するトークン数。メイン会話の最後の応答の入力トークン、キャッシュ読み取りトークン、キャッシュ作成トークン、出力トークンの合計です。最初の応答の前は `0` |
3639| `prompt_cache_warm` | boolean | 現在のモデルのプロンプトキャッシュがまだウォームである可能性が高いかどうか。つまり、切り替えによってキャッシュが失われるかどうか |3665| `prompt_cache_warm` | boolean | 現在のモデルのプロンプトキャッシュがまだウォームである可能性が高いかどうか。つまり、切り替えによってそれが失われるかどうか |
3640| `cache_ttl` | string | Claude Code がこのセッションで要求する[プロンプトキャッシュの有効期間](/docs/ja/prompt-caching#cache-lifetime)。`"5m"` または `"1h"` |3666| `cache_ttl` | string | Claude Code がこのセッションで要求する[プロンプトキャッシュの有効期間](/docs/ja/prompt-caching#cache-lifetime)。`"5m"` または `"1h"` |
3641| `estimated_cache_write_usd` | number | `to_model` で `context_tokens` を `cache_ttl` の料金でプロンプトキャッシュに書き込む推定コスト(米ドル)。次の応答は含みません。サーバーがコンテキスト全体を再キャッシュする必要がない場合もあるため、推定値として扱ってください |3667| `estimated_cache_write_usd` | number | `to_model` で `context_tokens` を `cache_ttl` の料金でプロンプトキャッシュに書き込む推定コスト(米ドル)。次の応答は含みません。サーバーがコンテキスト全体を再キャッシュする必要がない場合もあるため、推定値として扱ってください |
3642| `pricing` | string | Claude Code が `estimated_cache_write_usd` を算出した方法。組織が独自の料金を設定している場合はその料金による `"configured"`、定価による `"catalog"`、または `to_model` の価格が不明で Claude Code がデフォルトの料金を想定した場合は `"default"` |3668| `pricing` | string | Claude Code が `estimated_cache_write_usd` を算出した方法。組織が独自の料金を設定している場合はその料金による `"configured"`、定価による `"catalog"`、または `to_model` の価格が不明で Claude Code がデフォルトの料金を仮定した場合は `"default"` |
3643 3669
3644この例は、Sonnet 5 で実行中のセッションで `/model opus` を実行した場合の入力を示しています。3670次の例は、Sonnet 5 で実行中のセッションで `/model opus` を実行した場合の入力を示しています。
3645 3671
3646```json theme={null}3672```json theme={null}
3647{3673{
3662```3688```
3663 3689
3664<h4 id="premodelswitch-decision-control">3690<h4 id="premodelswitch-decision-control">
3665 PreModelSwitch の決定制御3691 PreModelSwitch の判定の制御
3666</h4>3692</h4>
3667 3693
3668`PreModelSwitch` フックは、切り替えをキャンセルしたり、ユーザーに確認を求めたり、そのまま続行させたりできます。終了コード 2 またはトップレベルの `decision: "block"` で切り替えがキャンセルされます。3694`PreModelSwitch` フックは、切り替えをキャンセルしたり、ユーザーに確認を求めたり、そのまま続行させたりできます。終了コード 2 またはトップレベルの `decision: "block"` で切り替えがキャンセルされます。
3669 3695
3670より細かく制御するには、[PreToolUse](#pretooluse-decision-control) と同様に、`hookSpecificOutput` オブジェクト内で `permissionDecision` と `permissionDecisionReason` を返します。`PreModelSwitch` は `"allow"`、`"deny"`、`"ask"` を受け付けます。`"defer"`、`updatedInput`、`additionalContext` は受け付けません。以下の表で両フィールドを説明します。3696より細かく制御するには、[PreToolUse](#pretooluse-decision-control) と同様に、`hookSpecificOutput` オブジェクトで `permissionDecision` と `permissionDecisionReason` を返します。`PreModelSwitch` は `"allow"`、`"deny"`、`"ask"` を受け付けます。`"defer"`、`updatedInput`、`additionalContext` は受け付けません。次の表で両方のフィールドについて説明します。
3671 3697
3672| フィールド | 説明 |3698| フィールド | 説明 |
3673| :- | :- |3699| :- | :- |
3674| `permissionDecision` | `"allow"` は続行し、[プロンプトキャッシュがウォームな間に Claude Code が表示する確認](/docs/ja/prompt-caching#switching-models)をスキップします。`"deny"` は切り替えをキャンセルします。`"ask"` はユーザーに確認を求めます |3700| `permissionDecision` | `"allow"` は続行し、[プロンプトキャッシュがウォームな間に Claude Code が表示する確認](/docs/ja/prompt-caching#switching-models)をスキップします。`"deny"` は切り替えをキャンセルします。`"ask"` はユーザーに確認を求めます |
3675| `permissionDecisionReason` | `"deny"` の場合、切り替えがブロックされた理由としてユーザーに表示されるか、`set_model` リクエストに対するエラーとして返されます。`"ask"` の場合、確認プロンプトに表示されます。`"allow"` の場合は無視されます |3701| `permissionDecisionReason` | `"deny"` の場合は、切り替えがブロックされた理由としてユーザーに表示されるか、`set_model` リクエストのエラーとして返されます。`"ask"` の場合は、確認プロンプトに表示されます。`"allow"` の場合は無視されます |
3676 3702
3677`"ask"` のプロンプトを表示できるのは、対話セッションでの `/model` のみです。`-p` フラグを使用する非対話モード、`/config`、`set_model` リクエストなど、その他のすべてのサーフェスでは、Claude Code は `"ask"` を拒否として扱います。3703`"ask"` のプロンプトを表示できるのは、対話セッションの `/model` のみです。`-p` フラグを使った非対話モード、`/config`、`set_model` リクエストを含むその他すべてのサーフェスでは、Claude Code は `"ask"` を拒否として扱います。
3678 3704
3679この例では、ユーザーに確認を求め、`context_tokens` のトークン数を引用しています。3705次の例は、`context_tokens` のトークン数を引用してユーザーに確認を求めます。
3680 3706
3681```json theme={null}3707```json theme={null}
3682{3708{
3688}3714}
3689```3715```
3690 3716
3691複数の PreModelSwitch フックが異なる決定を返した場合、優先順位は `deny` > `ask` > `allow` です。3717複数の PreModelSwitch フックが異なる判定を返した場合、優先順位は `deny` > `ask` > `allow` です。
3692 3718
3693Claude Code は、決定に関係なく、フックが返した `systemMessage` をユーザーに表示します。そのため、コストを報告するフックは `{"systemMessage": "..."}` を返して 0 で終了できます。3719Claude Code は判定に関係なく、フックが返した `systemMessage` をユーザーに表示します。そのため、コストを報告するフックは `{"systemMessage": "..."}` を返して 0 で終了できます。
3694 3720
3695タイムアウトまでに応答しない PreModelSwitch フックは、切り替えをブロックします。他のイベントでのタイムアウトの動作については、[タイムアウト](#timeouts)を参照してください。このイベントのデフォルトのタイムアウトは 30 秒です。`PreModelSwitch` は `command`、`http`、`mcp_tool` フックのみを実行するため、`prompt` と `agent` のデフォルトは適用されません。3721タイムアウトまでに応答しない PreModelSwitch フックは、切り替えをブロックします。ほかのイベントでタイムアウトがどう作用するかについては、[タイムアウト](#timeouts)を参照してください。このイベントのデフォルトのタイムアウトは 30 秒です。`PreModelSwitch` は `command`、`http`、`mcp_tool` のフックのみを実行するため、`prompt` と `agent` のデフォルトは適用されません。
3696 3722
36970 または 2 以外のコードで終了し、JSON の決定を出力しないフックは、[その他の終了コード](#other-exit-codes)で説明されているように、非ブロッキングエラーになります。37230 または 2 以外のコードで終了し、JSON の判定を出力しないフックは、[その他の終了コード](#other-exit-codes)で説明しているとおり、ブロックしないエラーになります。
3698 3724
3699<h3 id="postmodelswitch">3725<h3 id="postmodelswitch">
3700 PostModelSwitch3726 PostModelSwitch
3701</h3>3727</h3>
3702 3728
3703セッションのモデルが変更された後に実行されます。すべての CLAUDE.md を編集することなく、Claude にモデル固有のガイダンスを与えるために使用します。例えば、特定のモデルに適用される組織全体の指示などです。3729セッションのモデルが変わった後に実行されます。すべての CLAUDE.md を編集することなく、モデル固有のガイダンスを Claude に与えるために使用します。たとえば、特定のモデルに適用される組織全体の指示などです。
3704 3730
3705PostModelSwitch には Claude Code v2.1.251 以降が必要です。モデルはすでに変更されているため、ブロックすることはできません。Claude Code は、次のいずれかの変更の後に PostModelSwitch フックを実行します。3731PostModelSwitch には Claude Code v2.1.251 以降が必要です。モデルはすでに変わっているため、ブロックすることはできません。Claude Code は、次のいずれかの変更の後に PostModelSwitch フックを実行します。
3706 3732
3707* ユーザーまたはクライアントが要求した切り替え3733* ユーザーまたはクライアントが要求した切り替え
3708* セッションのモデルを変更する[自動モデルフォールバック](/docs/ja/model-config#automatic-model-fallback)3734* セッションのモデルを変更する[モデルの自動フォールバック](/docs/ja/model-config#automatic-model-fallback)
3709* [`opusplan`](/docs/ja/model-config#opusplan-model-setting) などの設定による plan モードへの移行または plan モードからの離脱3735* [`opusplan`](/docs/ja/model-config#opusplan-model-setting) のような設定による plan モードへの移行または plan モードからの離脱
3710* セッション再開時の Claude Code によるモデルの復元3736* セッション再開時に Claude Code がモデルを復元した場合
3711 3737
3712[フォールバックモデルチェーン](/docs/ja/model-config#fallback-model-chains)のモデルがターンを処理する場合、Claude Code は PostModelSwitch フックを実行しません。この代替は 1 ターンのみ続き、セッションのモデルは変更されないためです。3738[フォールバックモデルチェーン](/docs/ja/model-config#fallback-model-chains)のモデルがターンを処理する場合、Claude Code は PostModelSwitch フックを実行しません。その置き換えは 1 ターンだけのもので、セッションのモデルは変わらないためです。
3713 3739
3714matcher は [PreModelSwitch](#premodelswitch) と同じルールに従います。Claude Code は、セッションの切り替え先モデルの正規名と matcher を比較します。3740matcher は [PreModelSwitch](#premodelswitch) と同じルールに従います。Claude Code は、セッションの切り替え先モデルの正規名と matcher を比較します。
3715 3741
3716この例では、セッションのモデルがいずれかの Opus モデルに変わるたびにガイダンスを追加します。3742次の例は、セッションのモデルがいずれかの Opus モデルに変わるたびにガイダンスを追加します。
3717 3743
3718```json theme={null}3744```json theme={null}
3719{3745{
3733}3759}
3734```3760```
3735 3761
3736フックが機能することを確認するには、別のモデルで実行中のセッションから Opus モデルに切り替え(例えば Sonnet のセッションから `/model opus` を実行し)、現在のモデルについてどのようなガイダンスがあるかを Claude に尋ねます。3762フックが動作することを確認するには、別のモデルで実行中のセッションから Opus モデルに切り替え(たとえば Sonnet のセッションから `/model opus` を実行し)、現在のモデルについてどのようなガイダンスがあるか Claude に尋ねます。
3737 3763
3738<h4 id="postmodelswitch-input">3764<h4 id="postmodelswitch-input">
3739 PostModelSwitch の入力3765 PostModelSwitch の入力
3740</h4>3766</h4>
3741 3767
3742PostModelSwitch フックは [PreModelSwitch](#premodelswitch-input) と同じフィールドを受け取ります。ただし、`hook_event_name` は `"PostModelSwitch"` に設定され、`source` の値が 2 つ追加されます。自動フォールバックまたは Claude Code が自ら行ったその他の変更の場合は `"auto"`、セッション再開時に復元されたモデルの場合は `"resume"` です。3768PostModelSwitch フックは [PreModelSwitch](#premodelswitch-input) と同じフィールドを受け取ります。ただし、`hook_event_name` は `"PostModelSwitch"` に設定され、`source` の値が 2 つ追加されます。自動フォールバックや Claude Code が自身で行ったその他の変更の場合は `"auto"`、セッション再開時に復元されたモデルの場合は `"resume"` です。
3743 3769
3744`source` が `"auto"` の場合、`requested_model` は `null` です。`source` が `"resume"` の場合は、Claude Code が復元した保存済みのモデル設定になります。3770`source` が `"auto"` の場合、`requested_model` は `null` です。`source` が `"resume"` の場合は、Claude Code が復元した保存済みのモデル設定になります。
3745 3771
3746<h4 id="postmodelswitch-decision-control">3772<h4 id="postmodelswitch-decision-control">
3747 PostModelSwitch の決定制御3773 PostModelSwitch の判定の制御
3748</h4>3774</h4>
3749 3775
3750Claude Code は、終了コード 0 のときのフックの[プレーンテキストの stdout](#exit-code-0)、または JSON 出力の `additionalContext` を受け取り、切り替え後の次のリクエストとともに Claude に渡します。すべてのフックで使用できる [JSON 出力フィールド](#json-output)に加えて、次のフィールドを返すことができます。3776Claude Code は、終了コード 0 の場合のフックの[プレーンテキストの stdout](#exit-code-0)、または JSON 出力の `additionalContext` を受け取り、切り替え後の次のリクエストで Claude に届けます。すべてのフックで使用できる [JSON 出力フィールド](#json-output)に加えて、次を返すことができます。
3751 3777
3752| フィールド | 説明 |3778| フィールド | 説明 |
3753| :- | :- |3779| :- | :- |
3754| `additionalContext` | 次のリクエストとともに Claude のコンテキストに追加される文字列。[Claude のコンテキストを追加する](#add-context-for-claude)を参照してください |3780| `additionalContext` | 次のリクエストで Claude のコンテキストに追加される文字列。[Claude にコンテキストを追加する](#add-context-for-claude)を参照してください |
3755 3781
3756次のプロンプトを送信してから 5 秒以内にフックが完了しない場合、Claude Code はその出力なしでリクエストを送信し、代わりにその次のリクエストに出力を添付します。次のリクエストの前にモデルが複数回変更された場合、Claude Code は最後の切り替え先モデルに対する出力のみを渡します。3782次のプロンプトを送信してから 5 秒以内にフックが完了しない場合、Claude Code はその出力なしでリクエストを送信し、代わりにその次のリクエストに出力を添付します。次のリクエストまでにモデルが複数回変わった場合、Claude Code は最後の切り替え先モデルに対する出力のみを届けます。
3757 3783
3758<h3 id="sessionend">3784<h3 id="sessionend">
3759 SessionEnd3785 SessionEnd
3760</h3>3786</h3>
3761 3787
3762Claude Code のセッションが終了するときに実行されます。クリーンアップタスク、セッション統計のログ記録、セッション状態の保存に役立ちます。終了理由でフィルタリングするための matcher をサポートしています。3788Claude Code のセッションが終了したときに実行されます。クリーンアップタスク、セッション統計のログ記録、
3789セッション状態の保存に役立ちます。終了理由で絞り込むための matcher をサポートしています。
3763 3790
3764フック入力の `reason` フィールドは、セッションが終了した理由を示します。3791フックの入力の `reason` フィールドは、セッションが終了した理由を示します。
3765 3792
3766| 理由 | 説明 |3793| 理由 | 説明 |
3767| :- | :- |3794| :- | :- |
3768| `clear` | `/clear` コマンドでセッションがクリアされた |3795| `clear` | `/clear` コマンドでセッションがクリアされた |
3769| `resume` | 対話型の `/resume` でセッションが切り替えられた |3796| `resume` | 対話的な `/resume` でセッションが切り替えられた |
3770| `logout` | ユーザーがログアウトした |3797| `logout` | ユーザーがログアウトした |
3771| `prompt_input_exit` | プロンプト入力が表示されている間にユーザーが終了した |3798| `prompt_input_exit` | プロンプト入力が表示されている間にユーザーが終了した |
3772| `other` | その他の終了理由 |3799| `other` | その他の終了理由 |
3773| `bypass_permissions_disabled` | v2.1.234 で削除されました。Claude Code はこの値を送信しません。`SessionEnd` の matcher から削除してください |3800| `bypass_permissions_disabled` | v2.1.234 で削除されました。Claude Code はこれを送信しません。`SessionEnd` の matcher から削除してください |
3774 3801
3775<h4 id="sessionend-input">3802<h4 id="sessionend-input">
3776 SessionEnd の入力3803 SessionEnd の入力
3788}3815}
3789```3816```
3790 3817
3791SessionEnd フックには決定制御がありません。セッションの終了をブロックすることはできませんが、クリーンアップタスクを実行できます。Claude Code は、`systemMessage` などのフックの [JSON 出力フィールド](#json-output)を破棄します。3818SessionEnd フックには判定の制御がありません。セッションの終了をブロックすることはできませんが、クリーンアップタスクを実行できます。Claude Code は、`systemMessage` などの [JSON 出力フィールド](#json-output)を破棄します。
3792 3819
3793SessionEnd フックのデフォルトのタイムアウトは 1.5 秒です。これは、終了時、`/clear` の実行時、または対話型の `/resume` でセッションを切り替えたときに適用されます。フックにより多くの時間を与えるには、次の 2 つの方法があります。3820SessionEnd フックのデフォルトのタイムアウトは 1.5 秒です。これは、終了したとき、`/clear` を実行したとき、または対話的な `/resume` でセッションを切り替えたときに適用されます。フックにより多くの時間を与えるには、次の 2 つの方法があります。
3794 3821
3795* **フックごとの `timeout`**: そのフックの設定で `timeout` を設定します。全体の制限時間は、設定ファイル内のフックごとの `timeout` の最大値に合わせて、最大 60 秒まで自動的に引き上げられます。この方法で制限時間を引き上げた場合でも、独自の `timeout` を持たないフックはデフォルトのままです。プラグインが提供するフックに設定されたタイムアウトでは、制限時間は引き上げられません。3822* **フックごとの `timeout`**: そのフックの設定で `timeout` を設定します。全体の予算は、設定ファイル内のフックごとの `timeout` の最大値に合わせて、最大 60 秒まで自動的に引き上げられます。この方法で予算を引き上げた場合でも、独自の `timeout` を持たないフックはデフォルトのままです。プラグインが提供するフックに設定されたタイムアウトは、予算を引き上げません。
3796* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: この環境変数をミリ秒単位で設定して、制限時間を明示的に上書きします。設定した値は、独自の `timeout` を持たない各フックのタイムアウトにもなります。3823* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: この環境変数をミリ秒単位で設定すると、予算を明示的に上書きできます。設定した値は、独自の `timeout` を持たない各フックのタイムアウトにもなります。
3797 3824
3798この例では、制限時間を 5 秒に設定します。3825次の例は予算を 5 秒に設定します。
3799 3826
3800```bash theme={null}3827```bash theme={null}
3801CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude3828CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude
3802```3829```
3803 3830
3804v2.1.268 より前は、`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` は全体の制限時間のみを引き上げ、独自の `timeout` を持たないフックは 1.5 秒後にキャンセルされていました。3831v2.1.268 より前は、`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` は全体の予算だけを引き上げ、独自の `timeout` を持たないフックは引き続き 1.5 秒後にキャンセルされていました。
3805 3832
3806<h3 id="elicitation">3833<h3 id="elicitation">
3807 Elicitation3834 Elicitation
3808</h3>3835</h3>
3809 3836
3810MCP サーバーがタスクの途中でユーザー入力を要求したときに実行されます。デフォルトでは、Claude Code はユーザーが応答するための対話ダイアログを表示します。フックはこのリクエストをインターセプトしてプログラムで応答し、ダイアログを完全にスキップできます。3837MCP サーバーがタスクの途中でユーザー入力を要求したときに実行されます。デフォルトでは、Claude Code はユーザーが応答するための対話的なダイアログを表示します。フックはこのリクエストをインターセプトしてプログラムで応答し、ダイアログを完全にスキップできます。
3811 3838
3812設定エントリとスクリプトを含む完全なフックについては、[スクリプトからフォームリクエストに回答する](#answer-a-form-request-from-a-script)を参照してください。3839設定エントリとスクリプトを含む完全なフックについては、[スクリプトからフォームリクエストに回答する](#answer-a-form-request-from-a-script)を参照してください。
3813 3840
3814matcher フィールドは MCP サーバー名と照合されます。3841matcher フィールドは MCP サーバー名に対して照合されます。
3815 3842
3816<h4 id="elicitation-input">3843<h4 id="elicitation-input">
3817 Elicitation の入力3844 Elicitation の入力
3858 Elicitation の出力3885 Elicitation の出力
3859</h4>3886</h4>
3860 3887
3861Elicitation フックは、ユーザーの代わりにリクエストに回答したり、辞退またはキャンセルしたり、ダイアログに任せたりできます。回答、辞退、またはキャンセルするには、0 で終了し、`action` を含む `hookSpecificOutput` オブジェクトを出力します。サーバーは回答を受け取り、ダイアログは表示されません。この表の各行は、1 つの結果に対して返す内容と、MCP サーバーが受け取る内容を示しています。3888Elicitation フックは、ユーザーの代わりにリクエストに回答したり、辞退またはキャンセルしたり、ダイアログに任せたりできます。回答、辞退、キャンセルを行うには、0 で終了し、`action` を含む `hookSpecificOutput` オブジェクトを出力します。サーバーは回答を受け取り、ダイアログは表示されません。この表の各行は、1 つの結果について何を返すか、MCP サーバーが何を受け取るかを示しています。
3862 3889
3863| 目的 | 返す内容 | サーバーが受け取る内容 |3890| 目的 | 返す内容 | サーバーが受け取るもの |
3864| :- | :- | :- |3891| :- | :- | :- |
3865| ユーザーの代わりに回答する | `"action": "accept"` と、`content` 内のフォームフィールドの値 | `accept` と指定した `content` |3892| ユーザーの代わりに回答する | `"action": "accept"` と、`content` 内のフォームフィールドの値 | 指定した `content` を伴う `accept` |
3866| リクエストを辞退する | `"action": "decline"` | `decline` |3893| リクエストを辞退する | `"action": "decline"` | `decline` |
3867| リクエストをキャンセルする | `"action": "cancel"` | `cancel` |3894| リクエストをキャンセルする | `"action": "cancel"` | `cancel` |
3868| リクエストをユーザーに任せる | 出力なし、終了コード 0 | [ダイアログ](/docs/ja/mcp#respond-to-mcp-elicitation-requests)でのユーザーの回答 |3895| リクエストをユーザーに任せる | 出力なし、終了コード 0 | [ダイアログ](/docs/ja/mcp#respond-to-mcp-elicitation-requests)でのユーザーの回答 |
3869 3896
3870この出力は、[Elicitation の入力](#elicitation-input)で示したフォームモードのリクエストに回答します。`content` のキーは、そのリクエストの `requested_schema` のプロパティ名です。3897次の出力は、[Elicitation の入力](#elicitation-input)で示したフォームモードのリクエストに回答します。`content` のキーは、そのリクエストの `requested_schema` のプロパティ名です。
3871 3898
3872```json theme={null}3899```json theme={null}
3873{3900{
3881}3908}
3882```3909```
3883 3910
3884この出力はリクエストを辞退します。3911次の出力はリクエストを辞退します。
3885 3912
3886```json theme={null}3913```json theme={null}
3887{3914{
3894 3921
3895ダイアログでは、**Decline** を選択すると `decline` が送信され、`Esc` を押すと `cancel` が送信されます。サーバーに見せたいほうを返してください。3922ダイアログでは、**Decline** を選択すると `decline` が送信され、`Esc` を押すと `cancel` が送信されます。サーバーに見せたいほうを返してください。
3896 3923
3897URL モードのリクエストの場合、`accept` を返すフックはダイアログをスキップするため、URL は開かれません。3924URL モードのリクエストでは、`accept` を返すフックはダイアログをスキップするため、URL は開かれません。
3898 3925
3899Claude Code は、どの `action` を返した場合でも、Elicitation フックの JSON 出力から `reason`、`systemMessage`、`continue` を破棄します。3926Claude Code は、どの `action` を返した場合でも、Elicitation フックの JSON 出力の `reason`、`systemMessage`、`continue` を破棄します。
3900 3927
3901<h4 id="other-ways-to-decline-an-elicitation">3928<h4 id="other-ways-to-decline-an-elicitation">
3902 elicitation を辞退するその他の方法3929 elicitation を辞退するその他の方法
3907* **終了コード 2 で終了する**: Claude Code は同じフックが出力した `hookSpecificOutput` を無視します3934* **終了コード 2 で終了する**: Claude Code は同じフックが出力した `hookSpecificOutput` を無視します
3908* **トップレベルの `"decision": "block"` を出力する**: ブロックは同じ出力内の `action` を上書きします3935* **トップレベルの `"decision": "block"` を出力する**: ブロックは同じ出力内の `action` を上書きします
3909 3936
3910複数のフックが同じリクエストに一致する場合、いずれかのフックによる辞退は、他のフックによる `accept` や `cancel` を上書きします。3937複数のフックが同じリクエストに一致した場合、いずれかのフックによる辞退は、ほかのフックの `accept` や `cancel` を上書きします。
3911 3938
3912このスクリプトは、URL モードのリクエストを辞退し、フォームリクエストはダイアログに任せます。3939次のスクリプトは、URL モードのリクエストを辞退し、フォームのリクエストはダイアログに任せます。
3913 3940
3914```bash theme={null}3941```bash theme={null}
3915#!/bin/bash3942#!/bin/bash
3918fi3945fi
3919```3946```
3920 3947
3921Claude Code は stderr や `reason` を表示しないため、ユーザーもサーバーもフックが辞退した理由を知ることはできません。3948Claude Code は stderr も `reason` も表示しないため、ユーザーもサーバーもフックが辞退した理由を知ることはできません。
3922 3949
3923v2.1.105 から v2.1.284 で修正されるまで、Claude Code は `Elicitation` および `ElicitationResult` フックのトップレベルの `decision` を無視していました。3950Claude Code は、v2.1.105 から v2.1.284 で修正されるまで、`Elicitation` フックと `ElicitationResult` フックのトップレベルの `decision` を無視していました。
3924 3951
3925<h4 id="answer-a-form-request-from-a-script">3952<h4 id="answer-a-form-request-from-a-script">
3926 スクリプトからフォームリクエストに回答する3953 スクリプトからフォームリクエストに回答する
3951 }3978 }
3952 ```3979 ```
3953 3980
3954 このスクリプトをプロジェクトの `.claude/hooks/answer-project-key.sh` に保存し、`chmod +x` で実行可能にします。3981 このスクリプトをプロジェクト内の `.claude/hooks/answer-project-key.sh` に保存し、`chmod +x` で実行可能にします。
3955 3982
3956 ```bash theme={null}3983 ```bash theme={null}
3957 #!/bin/bash3984 #!/bin/bash
3992 }4019 }
3993 ```4020 ```
3994 4021
3995 このスクリプトをプロジェクトの `.claude/hooks/answer-project-key.ps1` に保存します。4022 このスクリプトをプロジェクト内の `.claude/hooks/answer-project-key.ps1` に保存します。
3996 4023
3997 ```powershell theme={null}4024 ```powershell theme={null}
3998 $request = [Console]::In.ReadToEnd() | ConvertFrom-Json4025 $request = [Console]::In.ReadToEnd() | ConvertFrom-Json
4011 </Tab>4038 </Tab>
4012</Tabs>4039</Tabs>
4013 4040
4014フックが機能することを確認するには、`claude --debug` で Claude Code を起動し、サーバーがプロジェクトキーを尋ねるようなタスクを Claude に与えます。ダイアログは表示されず、[デバッグログ](#debug-hooks)に `Elicitation resolved by hook: {"action":"accept","content":{"project_key":"DOCS"}}` で終わる行が記録されます。4041フックが動作することを確認するには、`claude --debug` で Claude Code を起動し、サーバーがプロジェクトキーを尋ねるようなタスクを Claude に与えます。ダイアログは表示されず、[デバッグログ](#debug-hooks)に `Elicitation resolved by hook: {"action":"accept","content":{"project_key":"DOCS"}}` で終わる行が記録されます。
4015 4042
4016<h3 id="elicitationresult">4043<h3 id="elicitationresult">
4017 ElicitationResult4044 ElicitationResult
4018</h3>4045</h3>
4019 4046
4020ユーザーが MCP の elicitation に応答した後に実行されます。フックは、応答が MCP サーバーに返される前に、その応答を監視、変更、またはブロックできます。4047ユーザーが MCP の elicitation に応答した後に実行されます。フックは、応答が MCP サーバーに送り返される前に、それを監視、変更、またはブロックできます。
4021 4048
4022[Elicitation](#elicitation) フックがリクエストに回答した場合、Claude Code は ElicitationResult フックを実行せずにその回答をサーバーに送信します。4049[Elicitation](#elicitation) フックがリクエストに回答した場合、Claude Code は ElicitationResult フックを実行せずにその回答をサーバーに送信します。
4023 4050
4024matcher フィールドは MCP サーバー名と照合されます。4051matcher フィールドは MCP サーバー名に対して照合されます。
4025 4052
4026<h4 id="elicitationresult-input">4053<h4 id="elicitationresult-input">
4027 ElicitationResult の入力4054 ElicitationResult の入力
4046 ElicitationResult の出力4073 ElicitationResult の出力
4047</h4>4074</h4>
4048 4075
4049ElicitationResult フックは、ユーザーの応答をそのまま通過させたり、その値を変更したり、ブロックしたりできます。応答を変更またはブロックするには、0 で終了し、`action` を含む `hookSpecificOutput` オブジェクトを出力します。この表の各行は、1 つの結果に対して返す内容と、MCP サーバーが受け取る内容を示しています。4076ElicitationResult フックは、ユーザーの応答をそのまま通したり、その値を変更したり、ブロックしたりできます。応答を変更またはブロックするには、0 で終了し、`action` を含む `hookSpecificOutput` オブジェクトを出力します。この表の各行は、1 つの結果について何を返すか、MCP サーバーが何を受け取るかを示しています。
4050 4077
4051| 目的 | 返す内容 | サーバーが受け取る内容 |4078| 目的 | 返す内容 | サーバーが受け取るもの |
4052| :- | :- | :- |4079| :- | :- | :- |
4053| 応答を通過させる | 出力なし、終了コード 0 | 変更されていないユーザーの応答 |4080| 応答をそのまま通す | 出力なし、終了コード 0 | 変更されていないユーザーの応答 |
4054| 送信された値を変更する | `"action": "accept"` と、`content` 内の新しい値 | `accept` と、ユーザーの値の代わりに指定した `content` |4081| 送信された値を変更する | `"action": "accept"` と、`content` 内の新しい値 | ユーザーの値の代わりに指定した `content` を伴う `accept` |
4055| 応答をブロックする | `"action": "decline"` | ユーザーの値を含まない `decline` |4082| 応答をブロックする | `"action": "decline"` | ユーザーの値を含まない `decline` |
4056| リクエストをキャンセルする | `"action": "cancel"` | `cancel` と、ユーザーが送信した値。値を送らないようにするには `"decline"` を返します |4083| リクエストをキャンセルする | `"action": "cancel"` | ユーザーが送信した値を伴う `cancel`。値を渡さないようにするには `"decline"` を返してください |
4057 4084
4058この出力は、[ElicitationResult の入力](#elicitationresult-input)で示した応答を変更し、ユーザーが `alice` を送信したところでサーバーが `alice@example.com` を受け取るようにします。4085次の出力は [ElicitationResult の入力](#elicitationresult-input)で示した応答を変更し、ユーザーが `alice` と送信したところをサーバーが `alice@example.com` として受け取るようにします。
4059 4086
4060```json theme={null}4087```json theme={null}
4061{4088{
4071 4098
4072指定した `content` はユーザーの `content` オブジェクト全体を置き換えるため、変更しないフィールドも含めてください。Claude Code は `action` のない `hookSpecificOutput` を無視するため、`action` も一緒に返してください。4099指定した `content` はユーザーの `content` オブジェクト全体を置き換えるため、変更しないフィールドも含めてください。Claude Code は `action` のない `hookSpecificOutput` を無視するため、`action` も一緒に返してください。
4073 4100
4074ElicitationResult フックはユーザーが辞退またはキャンセルした場合にも実行され、フックの `action` がユーザーの action を置き換えます。`accept` を返す前に入力の `action` が `accept` であることを確認してください。確認しないと、フックが辞退されたリクエストを受け入れられたリクエストに変えてしまいます。このスクリプトは、ユーザーが受け入れた場合に同じ変更を行い、他のフィールドは保持し、それ以外の場合は何も出力しません。4101ElicitationResult フックはユーザーが辞退またはキャンセルした場合にも実行され、フックの `action` がユーザーのものを置き換えます。`accept` を返す前に入力の `action` が `accept` であることを確認してください。そうしないと、フックが辞退されたリクエストを受け入れられたものに変えてしまいます。次のスクリプトは、ユーザーが受け入れた場合に同じ変更を行い、ほかのフィールドは保持し、それ以外の場合は何も出力しません。
4075 4102
4076```bash theme={null}4103```bash theme={null}
4077#!/bin/bash4104#!/bin/bash
4082fi4109fi
4083```4110```
4084 4111
4085この出力は応答をブロックします。4112次の出力は応答をブロックします。
4086 4113
4087```json theme={null}4114```json theme={null}
4088{4115{
4095 4122
4096終了コード 2 とトップレベルの `"decision": "block"` でも応答をブロックできます。フックがこれらを組み合わせた場合にどれが有効になるか、ユーザーに何が表示されるか、どのバージョンが `decision` を無視していたかについては、[elicitation を辞退するその他の方法](#other-ways-to-decline-an-elicitation)で説明しています。4123終了コード 2 とトップレベルの `"decision": "block"` でも応答をブロックできます。フックがこれらを組み合わせた場合にどれが有効になるか、ユーザーに何が表示されるか、どのバージョンが `decision` を無視していたかについては、[elicitation を辞退するその他の方法](#other-ways-to-decline-an-elicitation)で説明しています。
4097 4124
4098Claude Code は、どの `action` を返した場合でも、ElicitationResult フックの JSON 出力から `reason`、`systemMessage`、`continue` を破棄します。4125Claude Code は、どの `action` を返した場合でも、ElicitationResult フックの JSON 出力の `reason`、`systemMessage`、`continue` を破棄します。
4099 4126
4100<h2 id="prompt-based-hooks">4127<h2 id="prompt-based-hooks">
4101 プロンプト ベースのフック4128 プロンプト ベースのフック
4350* **stdout に単独で出力**: レスポンスが stdout 上の唯一のテキストである場合、整形された `jq` 出力のように複数行にまたがってもかまいません。複数行にまたがるには Claude Code v2.1.295 以降が必要です。4377* **stdout に単独で出力**: レスポンスが stdout 上の唯一のテキストである場合、整形された `jq` 出力のように複数行にまたがってもかまいません。複数行にまたがるには Claude Code v2.1.295 以降が必要です。
4351* **それ自体だけの 1 行として出力**: `jq -c` を使用するなどしてレスポンスが単独で 1 行に収まる場合、非同期フックは stdout に他のテキストを出力できます。4378* **それ自体だけの 1 行として出力**: `jq -c` を使用するなどしてレスポンスが単独で 1 行に収まる場合、非同期フックは stdout に他のテキストを出力できます。
4352 4379
4353Claude Code は JSON レスポンスを同期フックと同じ[出力スキーマ](#json-output)に対して検証し、`systemMessage` が文字列でないなど、値の型が間違っているフィールドをドロップします。これは配信する代わりに行われます。`--debug` で実行すると、ドロップされた各フィールドに名前を付けた警告が表示されます。v2.1.202 より前では、非同期フックからの不正な形式の JSON 出力はセッションをクラッシュさせる可能性があり、セッションが再開されるたびにクラッシュが再発生していました。4380Claude Code はその JSON レスポンスを同期フックと同じ[出力スキーマ](#json-output)に対して検証し、`systemMessage` が文字列でない場合など、値の型が間違っているフィールドは配信せずにドロップします。`--debug` で実行すると、ドロップされた各フィールドの名前を示す警告が表示されます。
4354 4381
4355非同期フック完了通知はデフォルトで抑制されます。これらを表示するには、`Ctrl+O` で詳細モードを有効にするか、`--verbose` で Claude Code を開始します。4382非同期フック完了通知はデフォルトで抑制されます。これらを表示するには、`Ctrl+O` で詳細モードを有効にするか、`--verbose` で Claude Code を開始します。
4356 4383