shwldshwld17 days ago

PreToolUse hookでAIエージェントの望まないコマンドパターンを禁止する

Claude Codeのエージェントがバックグラウンドタスクの完了を sleep && grep でポーリングし始めた。許可プロンプトが出るたびにユーザーが判断する必要があり、作業の邪魔になる。

PreToolUse hookを設定すると、特定のコマンドパターンをエージェントが実行する前にブロックできる。

// .claude/settings.local.json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -q 'sleep.*grep'; then echo 'BLOCK: sleep+grep polling is not allowed' >&2; exit 2; fi"
          }
        ]
      }
    ]
  }
}

仕組み:

  • PreToolUse はツール実行前に発火するフック
  • matcher でツール名を指定(Bash でシェルコマンドを対象に)
  • exit code 2 でツール実行をブロックし、エラーメッセージがエージェントに返る
  • エージェントは別のアプローチを試みるようになる

ポーリング以外にも、rm -rfgit push --force など危険なパターンの防止に使える。エージェントの行動を事後チェックでなく事前にゲートする仕組みとして便利。

refs: https://docs.anthropic.com/en/docs/claude-code/hooks