コンテンツにスキップ
Zenn Pretooluse Hook Control

Claude Code の PreToolUse フックで AI エージェントの行動を物理的に制御する

詳細

permissions.denyの限界2点:

  1. 静的パターンマッチのみ(別表現の絶対パスは素通り)
  2. cwdの状態を判定できない(相対パスでの親リポジトリEditは素通り)

PreToolUse hookの特性:

  • stdin:tool_name/tool_input/cwd/session_id等がJSONで渡される
  • exit 0:通過、exit 2:ブロック
  • stderr:Claudeへのブロック理由として渡される(次の判断材料になる)
  • 動的判定可能:git status・環境変数・他コマンドの実行結果を使用可能

設定例:

{
  "hooks": {
    "PreToolUse": [{
      "matcher": "Bash|Edit|Write|NotebookEdit",
      "hooks": [{"type": "command", "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/worktree-isolation-guard.sh"}]
    }]
  }
}

ガードの3段階ロジック:

  1. leadエージェントは無条件許可
  2. cwdが親リポジトリのパス配下かチェック
  3. 絶対パス指定が親リポジトリを指していないかチェック

「設定ファイルで止められないなら、シェルスクリプトで止める」という実践的アプローチ。