一言で
Hooks は、Copilot エージェントの実行ライフサイクルに独自のシェルスクリプトを差し込む仕組み。セッション開始 / プロンプト送信 / ツール実行前後 / エラー / セッション終了 の 6 イベントを捕まえられる。
🧠 instructions が「お願い」で agent の判断に頼るのに対し、hooks は 実行ロジックそのものを止める。policy enforcement が必要なら hooks 一択。
6 つのフック種別
| フック | いつ走る | 入力 (CLI / Cloud Agent) | できること |
|---|---|---|---|
| 🟢 sessionStart | 新規 / 再開 / 起動時 | source, initialPrompt | ログ初期化・環境準備・通知 |
| 📝 userPromptSubmitted | ユーザーがプロンプト送信した瞬間 | prompt | プロンプト監査ログ・キーワードアラート |
| 🛡️ preToolUse ★ | ツール実行の 直前 | toolName, toolArgs | deny で実行をブロック ・ allow ・ ask |
| 📊 postToolUse | ツール実行の 直後 | toolResult | 結果ログ・失敗時の通知・統計 |
| 💥 errorOccurred | agent がエラーで落ちた時 | error | Slack/メール通知・障害ログ |
| 🔚 sessionEnd | セッション終了時 | reason | クリーンアップ・サマリー送信 |
🔑 PreToolUse だけが agent の動きを止められる。他の 5 つは「観察 / 記録 / 通知」用と覚えておけばよい。
設定方法
.github/hooks/ 配下に 任意名の .json ファイル を 1 個以上置く。CLI / VS Code はローカルから、Cloud Agent は デフォルトブランチの .github/hooks/ から読み込む。
{
"version": 1,
"hooks": {
"preToolUse": [
{
"type": "command",
"bash": "./scripts/guard.sh",
"powershell": "./scripts/guard.ps1",
"cwd": ".",
"timeoutSec": 30,
"env": { "LOG_LEVEL": "INFO" }
}
]
}
}
- 📦
bash/powershellどちらも書いておけば OS 横断で動く - ⏱️ デフォルト timeout は 30 秒。重い検証を入れるなら
timeoutSecを上げる - 🔁 同じイベントに 複数フックを配列で 並べると上から順に実行される
- 📥 スクリプトは stdin から JSON を受け取り、必要なら stdout に JSON を返す
★ 特定コマンドのブロック (PreToolUse)
agent が何を実行しようとしているかを toolName と toolArgs で受け取り、{"permissionDecision": "deny", "permissionDecisionReason": "..."} を返すだけで実行を止められる。
#!/bin/bash
# .github/hooks/scripts/guard.sh
INPUT=$(cat)
TOOL_NAME=$(echo "$INPUT" | jq -r '.toolName')
TOOL_ARGS=$(echo "$INPUT" | jq -r '.toolArgs')
# bash 以外はそのまま許可
if [ "$TOOL_NAME" != "bash" ]; then
exit 0
fi
COMMAND=$(echo "$TOOL_ARGS" | jq -r '.command')
# 🚨 危険コマンドの黒リスト
if echo "$COMMAND" | grep -qE 'rm -rf /|sudo |mkfs|dd if=|:\(\)\{'; then
jq -nc \
--arg reason "禁止コマンド: $COMMAND" \
'{permissionDecision: "deny", permissionDecisionReason: $reason}'
exit 0
fi
# 🔒 production 環境への変更を禁止
if echo "$COMMAND" | grep -qE 'kubectl .*--context[= ]prod|terraform apply.*prod'; then
jq -nc '{permissionDecision: "deny", permissionDecisionReason: "production への変更は人間レビュー必須"}'
exit 0
fi
# それ以外は許可 (出力なし or "allow")
exit 0
どこから読み込まれる?
| Agent | Hooks を読む場所 | 適用範囲 |
|---|---|---|
| 💻 Copilot CLI | カレントディレクトリ の .github/hooks/*.json | 自分の CLI セッションだけ |
| 🧑💻 VS Code agent | 開いているワークスペース の .github/hooks/*.json | 自分の VS Code agent セッションだけ |
| ☁️ Copilot Cloud Agent | GitHub 上の デフォルトブランチ の .github/hooks/*.json | その repo の 全 Cloud Agent セッション |
📝 実装時は どの環境で動かすか に注意: hooks.json は
timeout(VS Code) vstimeoutSec(CLI/Cloud)、script はtool_name/tool_input/hookSpecificOutput(VS Code) vstoolName/toolArgs/permissionDecision(CLI/Cloud)。