gate は戻り値で拒否や中止ができるイベント(.catch を付けるか検討すべきイベント)、stream は async generator で書くイベントを表します。「next(e) の結果」の欄は、そのイベントのフックが返す値と同じ形です。
ツール
| イベント | 発生するとき | next(e) の結果と用途 |
|---|---|---|
tool.callgate | Claude Code 本体がツールを実行する直前。next の後続の処理として、許可ダイアログとツール本体が実行される。 | { ref, result, text, isError?, isReadOnly? } を返す。{ deny } を返すと拒否し、{ result, context? } を返すとツールの代わりに結果を返す。next の完了後に deny を返しても、実行済みの処理は取り消されない。e.tool で絞り込むと、ツールごとの入力の型が付く。 |
tool.checkgate | ツール呼び出しを許可するかを判定するとき。tool.call と PreToolUse の後、許可モードが確認の要否を決める前に発生する。 | { decision, reason?, rule?, hook?, ceiling? } を返す。ツールは実行されない。例: on("tool.check", { tool: "Read" }, () => ({ decision: "allow" })) |
tool.describe | セッション内で初めてツールのスキーマを生成するとき(ツールごとに1回)。 | { description, isDeferred? } を返す。isDeferred: false にすると、ツールのスキーマを最初からプロンプトに含める。結果はキャッシュされ、$.ui.invalidate("tool.describe") で破棄できる。毎回異なる値を返すとプロンプトキャッシュが効かなくなる。 |
プロンプト
| イベント | 発生するとき | next(e) の結果と用途 |
|---|---|---|
prompt.submitgate | プロンプトが送信され、ターンが始まる前。UserPromptSubmit の設定フックも next の後続で実行される。 | next({ ...e, text }) で本文を書き換える(画面上のメッセージも書き換わる)。{ drop: reason } を返すと送信を中止する。context を追加すると、モデルだけが読むテキストを渡せる。 |
prompt.fill | 入力欄に下書きを入れるとき($.prompt.fill)。 | mode は replace / append / insert のいずれか。{ isFilled: false } を返すと入力欄に入れない。 |
prompt.suggest | 入力欄に薄い色の候補(Tab で確定)を表示するとき。 | { isShown } を返す。{ isShown: false } を返すと候補を表示しない。 |
prompt.edit | ユーザーが入力欄を編集したとき(キー入力、貼り付け)。 | 編集後の入力欄の状態 { text, cursor } を返す。inputText を書き換えて渡すか、{ text: e.text, cursor: e.cursor } を返して入力を反映させないようにできる。 |
prompt.autocomplete | 入力欄で文字を入力している間、カーソルの直前にある空白を含まない文字列(e.token)ごとに発生する。 | { suggestions } を返す。候補は Claude Code 本体の候補の下に並ぶ。Claude Code 本体はこの結果を待たずに処理を進める。 |
prompt.section | システムプロンプトの名前付きセクションを生成するとき(セクションごと)。 | { text } を返す。{ text: null } を返すとセクションを除外する。結果はキャッシュされる。 |
prompt.compose | システムプロンプトを組み立てるとき。 | { sections: [{ id, text, scope }] } を返す。セクションの追加(scope: 'session' で末尾に追加)、置き換え、並べ替え、削除ができる。session のセクションの後に shared のセクションを置くと、フックはスキップされる。 |
prompt.context | 最初のユーザーメッセージに含めるコンテキストブロックを生成するとき(会話ごとに1回)。 | { blocks } を返す。ブロックの追加、削除、並べ替え、書き換えができる。 |
prompt.attachment | Claude Code 本体が自動で挿入するメッセージ(リマインダー、モードの切り替え、参照されたファイル)ごと。 | { text } を返す。{ text: null } を返すとメッセージを除外する。例: { type: "todo_reminder" } |
prompt.mentiongate | プロンプト中の @パス のファイルを読み込む前(ディレクトリは対象外)。この読み込みでは tool.call は発生しない。 | { type } を返す。context の追加、別の path の読み込み、{ deny } による読み込みの拒否ができる。 |
skill.prompt | スキルのプロンプトを展開するとき(/name、Skill ツール、事前読み込み)。 | { text } を返す。モデルが読む本文を差し替えられる。 |
attribution.text | モデルに書かせる git の文面を生成するとき(kind: commit / pr / exemption / remedy)。 | { text } を返す。{ text: "" } を返すと署名行を出力しない。 |
UI
| イベント | 発生するとき | next(e) の結果と用途 |
|---|---|---|
ui.render | コンポーネントを描画するとき。入力値や幅の変化、プラグインの読み込み、invalidate のたびに発生する。 | 描画ツリーを返す。そのまま返す、別の要素で包む、独自に描画する、props を書き換える、のいずれかができる。不正なツリーを返すと Claude Code 本来の描画が使われる(描画)。 |
ui.resolve | プラグインの読み込み時に、表示環境、コンポーネント、プラグインの組み合わせごとに1回発生する。 | 要素表を返す。他のプラグイン向けに要素の見た目を変えたり、要素を取り除いたりできる。 |
ui.press | 描画した Button(または Markdown のリンク)が押されたとき。 | { element } を返す。後続の処理の最後に要素の onPress が実行される。next を呼ばずに値を返すと、押下をフック側で処理できる。 |
ui.input | Input の値が変更または確定されたとき(kind: change / submit)。 | { element, value } を返す。value を書き換えて後続に渡せる。 |
ui.select | Select で項目が選択されたとき。 | { element, value } を返す。 |
ui.message | 自分が描画した Client の表示環境側で動くモジュールが post を呼んだとき。このイベントは描画したプラグインのフックにだけ届く。 | {} を返す。{ props } を返すと、再描画せずに次の props を渡せる。 |
ui.fault | 自分が描画した Client がエラーになったとき(読み込み、描画、実行時)。 | 通知専用のイベント。e.phase で発生した段階、e.reason で原因がわかる。 |
ui.scroll | Pane の本体または AbovePrompt の帯がスクロールする前。 | {} または { deny } を返す。offset を変更する、next を呼ばずに独自に行をずらす、といった処理ができる。 |
ui.focus | Pane や帯の中でフォーカスが移動する前。 | {} または { deny } を返す。フォーカスを別の要素に移す、移動させない、といった処理ができる。 |
セッション
| イベント | 発生するとき | next(e) の結果と用途 |
|---|---|---|
session.start | プロセスごと、読み込まれたプラグインごとに、最初のプロンプトの前に発生する。以後はそのプラグインが新たに読み込まれるたび(有効化、ワーカーの再起動、リロード)に発生する。/clear では発生しない。 | { cwd } を返す。通知用のイベント。最初の1回は完了まで待機されるため、ここで $.tool.register や $.command.register を呼ぶと、最初のターンから使える。 |
session.end | セッションの終了時(exit、/clear、resume、logout、シグナル、-p の完了)。SessionEnd の設定フックの後に発生する。 | { sessionId } を返す。e.reason で終了理由がわかる。チェーン全体で1つの短い制限時間を共有する(next.budget)。 |
session.appendgate | 会話に行(プロンプト、応答ブロック、ツールの結果、通知など)を保存する直前。 | { message, uuid } を返す。書き換えられるのは content だけである(詳細)。 |
session.receive | 外部から届いたもの(リレー、他のセッションからのメッセージ、Remote Control のプロンプト)をキューに入れる前。 | { text } を返す。本文を書き換えるか、{ consumed: reason } を返して破棄できる。 |
session.send | 他のエージェントやセッションへテキストメッセージを送るとき(SendMessage ツール、$.session.send)。 | キューに入った時点で結果を返す。text や宛先 to を書き換えられる。{ isDelivered: false, reason } を返すと送信を拒否する。 |
session.compact | 会話を圧縮する直前(/compact、閾値の超過、プラグインからの要求、事前計算)。 | { messages } を返す。instructions の書き換え、独自の要約の作成、{ skip: reason } による圧縮の中止ができる。 |
session.attach | リモートのクライアント(スマートフォンなど)が接続したとき。 | { clientId } を返す。通知専用のイベント。 |
session.detach | クライアントが切断したとき。 | { clientId } を返す。通知専用のイベント。 |
session.measure | 使用量が変化したとき(メインスレッドのターンの後、レート制限の使用率が1ポイント変化したとき)。 | { changed } を返す。$.session.usage() で取得できる数値が、問い合わせなしで通知される。 |
ターン・エージェント
| イベント | 発生するとき | next(e) の結果と用途 |
|---|---|---|
turn.start | モデルのターンが始まるとき(最初のモデル呼び出しの前)。 | { turnId } を返す。通知専用のイベント。$.turn.abort に渡す id はここで取得する。 |
turn.stepstream | ターン中にモデルへリクエストを送る直前(メインスレッドとサブエージェントの両方)。 | 応答全体を返す。model や effort を変更して送信できる。next を呼ばずに値を返すと、リクエストは送信されない。 |
turn.complete | ターンが終わり、所要時間が報告される時点。 | { text } を返す。別のテキストを返すと、回答の下に表示される(要約や TL;DR など)。会話の記録は書き換わらない。 |
agent.offergate | エージェントの種類をモデルに提示するとき(一覧の生成時と起動時)。 | { isOffered } を返す。false を返すと一覧から除外され、起動も拒否される。プラグイン自身の $.agent.spawn からは起動できる。 |
agent.spawngate | Agent ツールがサブエージェントを起動する直前(ワークフローの agent() も含む)。 | { model } を返す。モデルの差し替えや、{ deny } による起動の拒否ができる。 |
コマンド・設定・プラグイン・テレメトリ
| イベント | 発生するとき | next(e) の結果と用途 |
|---|---|---|
command.rungate | スラッシュコマンドを実行する直前。 | { text, context?, exitCode? } を返す。text は transcript に表示される行(モデルも読む)、context はモデルだけが読むテキストになる。$.command.register で登録したコマンドは、このイベントのフックで結果を返す。 |
command.describe | 入力補完と /help にコマンドを一覧表示するとき。 | { description, argumentHint, isHidden } を返す。 |
config.setgate | /config の項目が変更される直前。 | { value } を返す。{ deny } を返すと変更を拒否する。value を範囲内に補正して後続に渡すこともできる。 |
config.describe | /config の項目を一覧表示するとき。 | { label, description, isHidden } を返す。 |
plugin.registergate | フックモジュールがチェーンに加わる直前(読み込み時、リロード時)。 | { refuse: reason } を返すと、そのモジュールを読み込ませない。tier と uses を見て判断する。 |
engine.create | $ を構築する段階(読み込みごとに1回、そのプラグインの他のどのフックよりも先)。 | それまでに構築された $ を返す。独自の名前空間を追加できる({ ...built, voice })。他のプラグインの名前空間を置き換えようとすると失敗し、そのプラグインは読み込みから外される。 |
telemetry.log | 記録を e.to(collector / anthropic)へ送信するとき。 | 送信先は変更できないが、内容は書き換えられる。on("telemetry.log", { to: "collector" }, …) のように、イベント名と送信先を指定して登録する。 |
telemetry.mark | 機能の利用を1回記録するとき。 | 送信先は常に anthropic である。 |
ストリーミングイベント
turn.step と process.spawn の2つのイベントだけは、フックを async function* で書きます(この形で書かないと読み込まれません)。next(e) は後続の処理のストリームを返します。
// 他のプラグインが起動した子プロセスの出力から、トークンを伏せ字にする
on('process.spawn', async function* ($, e, next) {
for await (const chunk of next(e)) {
yield { ...chunk, text: chunk.text.replaceAll(token, '***') }
}
})
yield* next(e)と書くとストリームをそのまま後続に渡し、式の値が結果になる。for awaitを使うと、チャンクを1つずつ書き換えられる。nextを使わずに yield すれば、フック自身が出力を生成する。- 途中で失敗したフックは、失敗した時点の状態のまま残される。
classic.*(設定フックのイベント)
settings.json に書くコマンドフックのイベントも、classic.<Event> という名前でフックできます。e には、コマンドフックが標準入力で受け取る内容がすべて入ります(transcript_path や cwd などの共通フィールドを含みます)。ただし classic.PreToolUse の e は、ツール呼び出しの入力(ToolCallEnvelope)だけです。チェーンの順序は、managed の設定フック、フックモジュール、その他の設定フック(core)の順になります。
| イベント名 |
|---|
classic.PreToolUse classic.PostToolUse classic.PostToolUseFailure classic.PostToolBatch classic.PermissionRequest classic.PermissionDenied |
classic.UserPromptSubmit classic.UserPromptExpansion classic.Stop classic.StopFailure classic.Notification classic.MessageDisplay |
classic.SessionStart classic.SessionEnd classic.Setup classic.PreCompact classic.PostCompact classic.PreModelSwitch classic.PostModelSwitch classic.ConfigChange classic.InstructionsLoaded |
classic.SubagentStart classic.SubagentStop classic.TaskCreated classic.TaskCompleted classic.TeammateIdle |
classic.CwdChanged classic.FileChanged classic.DirectoryAdded classic.WorktreeCreate classic.WorktreeRemove classic.Elicitation classic.ElicitationResult |
$ の呼び出しによるイベント
$.<名前空間>.<メソッド>(…) を呼び出すと、同じ名前のイベントが発生します。たとえば別のプラグインが $.fs.write を呼ぶと、チェーンの外側にあるフックからは fs.write イベントとして見え、書き換えや拒否ができます。呼び出したフック自身はスキップされます(同じプラグインの他のフックには届きます)。
| 名前空間 | フックできるイベント |
|---|---|
ui | ui.toast ui.status ui.log ui.notice ui.invalidate ui.open ui.close ui.panes ui.selection ui.copy ui.blit など |
model | model.complete model.classify model.fork |
session | session.cwd session.root session.model session.turns session.id session.messages session.repo session.surfaces session.authorize session.usage session.version |
| その他 | tool.list tool.register command.list command.register config.list agent.list agent.register turn.abort prompt.read |
| 入出力 | audio.play audio.speak mcp.call mcp.connect fs.* store.* state.* clock.* http.* process.* settings.* env.* |
$.state の値を書き込めるのは、その値を持つプラグインだけです。他のプラグインの値を変更したい場合は、state.set を plugin と key のマッチャーでフックし、next に別の value を渡します。
絞り込みの条件に一致する行がありません。