hooks / pretooluse-deny · 約 10 分

PreToolUse で deny する

Bash の command に echo CODEX_SCHOOL_DENY_MARKER が含まれるとき permissionDecision を deny します。

学習目標

PreToolUse の matcher は tool_name です。シェルは Bash、パッチは apply_patch / Edit / Write です。 [codex-hooks]

拒否は次の形です。実機でも破壊的なコマンドは使いません。学習用の echo CODEX_SCHOOL_DENY_MARKER を拒否します。

{
  "hookSpecificOutput": {
    "hookEventName": "PreToolUse",
    "permissionDecision": "deny",
    "permissionDecisionReason": "学習用マーカーコマンドを拒否しました"
  }
}

stdin の Bash 入力は tool_input.command です。 [codex-hooks]

前提

/hooks で信頼済みであること。拒否対象は文字列 CODEX_SCHOOL_DENY_MARKER だけです。

なぜ必要か

モデルが出した command を、実行前に機械的に止められます。教材では無害な echo マーカーで同じ JSON 契約を確認します。

実行場所

Web実習 (browser) は WebContainer の Node で公式仕様の入力例を流す練習です。Codex 本体の hook 実行ではありません。local-bridge では同じスクリプトを /hooks で信頼した Codex が呼び出します。command ハンドラは公式例では python3 ですが、JSON 契約は同じです。 [codex-hooks]

echo '{"tool_input":{"command":"echo CODEX_SCHOOL_DENY_MARKER"}}' | node .codex/hooks/pre_tool_use_policy.mjs
echo '{"tool_input":{"command":"echo ok"}}' | node .codex/hooks/pre_tool_use_policy.mjs

成功結果

マーカー付き command では permissionDecisiondeny で、理由は「学習用マーカーコマンドを拒否しました」です。通常の echo ok では {} です。信頼済みなら、実際の Bash でも同じマーカーが拒否されます。

失敗対処

continue: false を PreToolUse に書くと、公式は未サポートとして hook 失敗扱いし、ツールは続行します。deny は permissionDecision を使います。 [codex-hooks]

このレッスンで接続する

ページを移動するとブラウザ内実習の接続とファイルは消えます。演習の直前に、このパネルから明示的に再接続してください(自動では戻りません)。