クイックスタート
以下の例では、HookでAgentがrm -rfを実行しようとした際に自動的に阻止する危険なコマンド遮断の実装を示します。
ステップ1:スクリプトを作成する
~/.qoder/settings.jsonに以下を追加します:
rm -rfを含むコマンドを実行させてみてください。Hookが実行を阻止し、Agentに通知します。
設定
設定ファイルの場所
Hook設定は以下の3つのファイルから読み込まれ、3段階の設定がマージされて実行されます:設定フォーマット
| フィールド | 必須 | 説明 |
|---|---|---|
type | はい | Hook タイプ。shell スクリプトや shell コマンドでは "command" を使用します |
command | はい | 実行するシェルコマンド |
timeout | いいえ | タイムアウト秒数。command hook のデフォルトは 600 秒です |
matcher | いいえ | マッチ条件。省略するとすべてにマッチ |
matcherのルール
matcherはhookのトリガー範囲をフィルタリングします。イベントごとにマッチする対象が異なります(各イベントの説明を参照)。
| 書き方 | 意味 | 例 |
|---|---|---|
省略または"*" | すべてにマッチ | すべてのツールでトリガー |
| 固定値 | 完全一致 | "Bash" はBashツールのみマッチ |
|区切り | 複数値にマッチ | "Write|Edit" はWriteまたはEditにマッチ |
| 正規表現 | 正規表現マッチ | "mcp__.*" はすべてのMCPツールにマッチ |
Hookスクリプトの書き方
Hookスクリプトはstdinを通してJSON入力を受け取り、exit codeとstdoutによって動作を制御します。本セクションではすべてのイベントに共通する入出力フォーマットを説明します。よく使われるイベント固有の追加フィールドは主なイベントを参照してください。入力
HookスクリプトはstdinからJSONデータを受け取ります。すべてのイベントに以下の共通フィールドが含まれます:| フィールド | 説明 |
|---|---|
session_id | 現在のセッションID |
transcript_path | 現在の transcript ファイルのパス |
cwd | 現在の作業ディレクトリ |
hook_event_name | トリガーされたイベント名 |
permission_mode | 現在の権限モード(イベントが提供する場合) |
agent_id | 現在の Agent ID(イベントが提供する場合) |
agent_type | 現在の Agent タイプ(イベントが提供する場合) |
jqを使った入力の解析例:
出力
Hook は exit code と stdout で動作を制御します。 exit code が基本動作を決定します:0 は成功、2 はブロック(stderr の内容が会話に注入、ブロックをサポートするイベントのみ有効)、その他の値は非ブロッキングエラーです。 stdout JSON(exit 0 の場合のみ解析)は一部のイベントに対して詳細な制御を提供します。サポートされるフィールドは各イベントの説明を参照してください。exit が 0 以外の場合、stdout は無視されます。環境変数
Hookスクリプト実行時に以下の環境変数が利用できます:| 変数 | 説明 |
|---|---|
QODER_PROJECT_DIR | 現在のプロジェクトの作業ディレクトリ |
主なイベント
よく使われる Hook イベントは以下のとおりです。Qoder CLI は高度なワークフローで追加のライフサイクルイベントを発火する場合があります。SessionStart
セッション開始時にトリガーされます。 matcherの対象: セッションのソース| matcher値 | トリガーシナリオ |
|---|---|
startup | 新しいセッション開始時 |
resume | 既存セッションの再開時 |
compact | コンテキスト圧縮完了後 |
SessionEnd
セッション終了時にトリガーされます。 matcherの対象: 終了理由| matcher値 | トリガーシナリオ |
|---|---|
prompt_input_exit | ユーザーが入力を終了(Ctrl+Dなど) |
other | その他の理由 |
UserPromptSubmit
ユーザーが Prompt を送信した後、Agent が処理する前にトリガーされます。 追加入力フィールド:PreToolUse
ツール実行前にトリガーされます。ツールの実行を阻止できます。 matcherの対象: ツール名(例:Bash、Write、Edit、Read、Glob、Grep、MCPツール名はmcp__server__tool形式)
追加入力フィールド:
PostToolUse
ツールが正常に実行された後にトリガーされます。 matcherの対象: ツール名 追加入力フィールド:PostToolUseFailure
ツールの実行が失敗した後にトリガーされます。 matcherの対象: ツール名 追加入力フィールド:Stop
Agentがレスポンスを完了した後(メインAgent、保留中のツール呼び出しがない状態)にトリガーされます。Agentの停止を阻止して、作業を継続させることができます。 Agentの停止を阻止する: exit code 2を返します。stderrの内容がメッセージとして会話に注入され、Agentが作業を続けます。SubagentStart / SubagentStop
サブAgentの起動時と完了時にトリガーされます。SubagentStopはStopと同様で、サブAgentの停止を阻止できます。 matcherの対象: Agentタイプ名 追加入力フィールド:PreCompact
コンテキスト圧縮前にトリガーされます。 matcherの対象: トリガー方法| matcher値 | トリガーシナリオ |
|---|---|
manual | ユーザーが手動で/compactを実行 |
auto | コンテキストウィンドウが満杯になった際に自動トリガー |
Notification
通知イベントがトリガーされます(権限リクエスト、タスク完了など)。 matcherの対象: 通知タイプ| matcher値 | トリガーシナリオ |
|---|---|
permission | 権限リクエスト通知 |
result | Agentの結果通知 |
PermissionRequest
ツールの実行にユーザーの認可が必要な際にトリガーされます。 matcherの対象: ツール名 追加入力フィールド:実用的な使用例
デスクトップ通知
Agentがタスクを完了したり認可が必要な際にデスクトップ通知をポップアップ表示します。 スクリプト~/.qoder/hooks/notify.sh(macOS):
ファイル書き込み後の自動Lint
Agentがファイルを書き込みまたは編集するたびに、自動的にlintチェックを実行します。 スクリプト${project}/.qoder/hooks/auto-lint.sh:
PostToolUse、matcher Write|Edit、command .qoder/hooks/auto-lint.sh。
Agentの作業を継続させる
Agentが停止した際に未完了のタスクがないか確認し、あればメッセージを注入してAgentに作業を続けさせます。 スクリプト~/.qoder/hooks/check-continue.sh:
Stop、command ~/.qoder/hooks/check-continue.sh。