クイックスタート
以下の例では、HookでAgentがrm -rfを実行しようとした際に自動的に阻止する危険なコマンド遮断の実装を示します。
ステップ1:スクリプトを作成する
~/.qoder/settings.jsonに以下を追加します:
rm -rfを含むコマンドを実行させてみてください。Hookが実行を阻止し、Agentに通知します。
設定
設定ファイルの場所
Hook設定は以下の3つのファイルから読み込まれ、3段階の設定がマージされて実行されます:設定フォーマット
| フィールド | 必須 | 説明 |
|---|---|---|
type | はい | 固定値:"command" |
command | はい | 実行するシェルコマンド |
timeout | いいえ | タイムアウト秒数(デフォルト:60) |
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 |
cwd | 現在の作業ディレクトリ |
hook_event_name | トリガーされたイベント名 |
jqを使った入力の解析例:
出力
Hookはexit codeとstdoutで動作を制御します。 exit 0 は成功を意味します。Qoder CLIはstdoutを解析します。一部のイベント(UserPromptSubmit、SessionStartなど)ではプレーンテキストによるコンテキスト注入またはJSONによる細かい制御をサポートしています。詳細は各イベントの説明を参照してください。 exit 2 はブロッキングエラーを意味し、ブロッキングをサポートするイベントにのみ有効です。stdoutは無視され、stderrがエラーメッセージとしてAgentにフィードバックされます。具体的な効果はイベントによって異なります:PreToolUseはツール実行を阻止し、UserPromptSubmitはpromptを拒否し、StopはAgentの停止を阻止するなどです。 その他のexit code は非ブロッキングエラーとして扱われ、実行フローに影響を与えません。stderrはログにのみ記録されます。環境変数
Hookスクリプト実行時に以下の環境変数が利用できます:| 変数 | 説明 |
|---|---|
QODER_PROJECT_DIR | 現在のプロジェクトの作業ディレクトリ |
サポートされるイベント
Qoder CLIは以下のHookイベントをサポートし、セッションライフサイクルの各段階をカバーしています。SessionStart
セッション開始時にトリガーされます。 matcherの対象: セッションのソース| matcher値 | トリガーシナリオ |
|---|---|
startup | 新しいセッション開始時 |
resume | 既存セッションの再開時 |
compact | コンテキスト圧縮完了後 |
SessionEnd
セッション終了時にトリガーされます。 matcherの対象: 終了理由| matcher値 | トリガーシナリオ |
|---|---|
prompt_input_exit | ユーザーが入力を終了(Ctrl+Dなど) |
other | その他の理由 |
UserPromptSubmit
ユーザーがpromptを送信した後、Agentが処理する前にトリガーされます。Agentに追加コンテキストを注入したり、特定のpromptを検証・阻止したりできます。matcherはサポートされず、設定されたすべてのhookが実行されます。 共通フィールドに加えて、UserPromptSubmitはユーザーが送信したテキストを含むpromptフィールドも受け取ります:
additionalContextフィールドで注入する方法です。プレーンテキストはより簡単ですが、{で始まるとJSONとして解析されるため注意が必要です。
promtを阻止するには、exit 2(stderrの内容がユーザーに表示される)を使うか、exit 0でdecision: "block"を含むJSONを出力します。exit 2は純粋な遮断シナリオに適しています。JSON方式はより柔軟で、同じスクリプトで条件に応じて阻止か通過かを決定できます。
| フィールド | 説明 |
|---|---|
decision | "block"に設定するとpromptの処理を阻止しコンテキストから除去。未設定の場合は通過 |
reason | 阻止時にユーザーに表示される理由。コンテキストには追加されない |
additionalContext | Agentに注入するコンテキスト文字列(hookSpecificOutput経由で渡される) |
JSON形式は必須ではありません。シンプルなケースではexit 0でプレーンテキストを出力するだけでコンテキストを注入できます。promptを阻止したり細かい制御が必要な場合のみJSONが必要です。完全な例はpromptの送信時にコンテキストを注入すると機密情報を含むpromptをブロックするを参照してください。
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。
promptの送信時にコンテキストを注入する
ユーザーの質問前に、現在のgitブランチ情報をAgentのコンテキストとして自動注入します。 スクリプト~/.qoder/hooks/inject-branch.sh:
UserPromptSubmit、command ~/.qoder/hooks/inject-branch.sh。
機密情報を含むpromptをブロックする
パスワードやキーなどの機密キーワードを含むpromptを遮断し、Agentへの送信を防ぎます。 スクリプト~/.qoder/hooks/block-sensitive.sh:
UserPromptSubmit、command ~/.qoder/hooks/block-sensitive.sh。