LV.1
EXP 0/1000
◀ 用語一覧
NO.7.5

🪝 Hooks

一言で

Hooks は、Copilot エージェントの実行ライフサイクルに独自のシェルスクリプトを差し込む仕組み。セッション開始 / プロンプト送信 / ツール実行前後 / エラー / セッション終了 の 6 イベントを捕まえられる。

🧠 instructions が「お願い」で agent の判断に頼るのに対し、hooks は 実行ロジックそのものを止める。policy enforcement が必要なら hooks 一択。

6 つのフック種別

フックいつ走る入力 (CLI / Cloud Agent)できること
🟢 sessionStart新規 / 再開 / 起動時source, initialPromptログ初期化・環境準備・通知
📝 userPromptSubmittedユーザーがプロンプト送信した瞬間promptプロンプト監査ログ・キーワードアラート
🛡️ preToolUseツール実行の 直前toolName, toolArgsdeny で実行をブロック ・ allow ・ ask
📊 postToolUseツール実行の 直後toolResult結果ログ・失敗時の通知・統計
💥 errorOccurredagent がエラーで落ちた時errorSlack/メール通知・障害ログ
🔚 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 が何を実行しようとしているかを toolNametoolArgs で受け取り、{"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

どこから読み込まれる?

AgentHooks を読む場所適用範囲
💻 Copilot CLIカレントディレクトリ.github/hooks/*.json自分の CLI セッションだけ
🧑‍💻 VS Code agent開いているワークスペース.github/hooks/*.json自分の VS Code agent セッションだけ
☁️ Copilot Cloud AgentGitHub 上の デフォルトブランチ.github/hooks/*.jsonその repo の 全 Cloud Agent セッション

📝 実装時は どの環境で動かすか に注意: hooks.jsontimeout(VS Code) vs timeoutSec(CLI/Cloud)、scripttool_name / tool_input / hookSpecificOutput(VS Code) vs toolName / toolArgs / permissionDecision(CLI/Cloud)。