フック : 作業の前後に自分の処理を挟む
フックは会話の開始、ツールやモデルの実行前後、終了時に自分のスクリプトを動かす仕組みです。現在は6つのイベントがあり、初期化、検査、整形などに使えます。
用意するもの
- プロジェクトのフォルダ
- 実行するスクリプト
1. hooks.json を置く
`.agents/hooks.json` を作り、いつ・何を実行するかを書きます。 全体共通なら ~/.gemini/config/hooks.json に置けます。CLIの /hooks で読み込み状態を確認します。
2. 場面を選ぶ
SessionStart(会話の開始時)、PreToolUse・PostToolUse(ツールの前後)、PreInvocation・PostInvocation(モデル呼び出しの前後)、Stop(終了時)の6イベントから選びます。
3. 対象を絞る
ツールの前後では `matcher` で対象を絞ります。`"run_command"` ならコマンド実行だけ、`"browser_.*"` ならブラウザ操作すべてです。
4. 答えを返す
スクリプトは標準入力でJSONを受け取り、標準出力でJSONを返します。`PreToolUse` なら `{"decision":"deny","reason":"..."}` で実行を止められます。
コピーして使える依頼文
.agents/hooks.json を作って。コマンドを実行する前に scripts/guard.sh を呼び、本番のデータベースに触るコマンドなら止めるようにして。
この依頼文だと、こう返ってきます
.agents/hooks.json を作成しました。
{
"db-guard": {
"PreToolUse": [
{
"matcher": "run_command",
"hooks": [{ "command": "./scripts/guard.sh", "timeout": 5 }]
}
]
}
}
guard.sh は標準入力から toolCall.args.CommandLine を読み、本番の接続先が含まれていれば
{"decision":"deny","reason":"本番DBへの操作です"} を返す形にしています。
動作を確かめてから有効にしてください。まず手で1回、止めたいコマンドを試してみてください。
実際の返答はそのときの資料や状況で変わります。形の目安として載せています。
完成チェック
- 決めた場面でスクリプトが走った
- 止めたいコマンドが実際に止まった
OpenAI版で関連する記事OpenAI版マニュアルには、これに当たる記事がありません。
Claude版で関連する記事フックで自動実行する ↗