👏

Claude Codeに絶対cdさせたくない(PreToolUse編)

に公開

Claude CodeにHooks機能が追加されましたね。神機能です。

このおかげで、ファイルの編集後にlintやformatを強制的に実行できるようになりました。
これだけでも強力ですが、個人的にもっと嬉しい点がありました。

これまで超ストレスだったのが、Bashツールで cd してからコマンドを実行し、次のターンには自分がどこにいるのか忘れてしまっているClaudeくんです。

迷子になっていることもわからずmake test するけど無情に返ってくる No rule to make target ...
なにしてるの?と何度思ったことか。
実際「なにしてるの?」って打ったら謝ってプロジェクトルートに帰ってました、いやわかるのかよ。

permissionsdeny で指定しても、 cd って引数 + && 他のコマンド って使われることが多くて確実に防げないっぽいんですよね。それで困ってました。

だが、そんなストレスにもう悩まされることはありません。これで君はもうそこから動けない。

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "jq 'if .tool_input.command | (startswith(\"cd \") or contains(\" cd \")) then halt_error(2) else empty end'"
          }
        ]
      }
    ]
  }
}

公式ドキュメントにも記載があるように、exit code 2で返すと止められます。0以外でexitすると黄色い字で警告が出てしまうのでそこだけ注意です。

同じようなやり方で他のコマンドも止められるはずです。

Discussion