Mod API リファレンス

イベント一覧

出典: Claude Code 2.1.294 が書き出す型定義 Early access:リリースごとに変更される可能性あり ← 私家版 Claude Mods まとめ

gate は戻り値で拒否や中止ができるイベント(.catch を付けるか検討すべきイベント)、stream は async generator で書くイベントを表します。「next(e) の結果」の欄は、そのイベントのフックが返す値と同じ形です。

ツール

イベント発生するときnext(e) の結果と用途
tool.callgateClaude 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.attachmentClaude 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.inputInput の値が変更または確定されたとき(kind: change / submit)。{ element, value } を返す。value を書き換えて後続に渡せる。
ui.selectSelect で項目が選択されたとき。{ element, value } を返す。
ui.message自分が描画した Client の表示環境側で動くモジュールが post を呼んだとき。このイベントは描画したプラグインのフックにだけ届く。{} を返す。{ props } を返すと、再描画せずに次の props を渡せる。
ui.fault自分が描画した Client がエラーになったとき(読み込み、描画、実行時)。通知専用のイベント。e.phase で発生した段階、e.reason で原因がわかる。
ui.scrollPane の本体または AbovePrompt の帯がスクロールする前。{} または { deny } を返す。offset を変更する、next を呼ばずに独自に行をずらす、といった処理ができる。
ui.focusPane や帯の中でフォーカスが移動する前。{} または { 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.spawngateAgent ツールがサブエージェントを起動する直前(ワークフローの 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 イベントとして見え、書き換えや拒否ができます。呼び出したフック自身はスキップされます(同じプラグインの他のフックには届きます)。

名前空間フックできるイベント
uiui.toast ui.status ui.log ui.notice ui.invalidate ui.open ui.close ui.panes ui.selection ui.copy ui.blit など
modelmodel.complete model.classify model.fork
sessionsession.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 を渡します。

絞り込みの条件に一致する行がありません。