このページは原文を AI が翻訳したものです。

Claude Codeで作業していると、AIが編集するたびに手動でフォーマッター(mix formatprettierrubocop)やリンターを実行するのがすぐに面倒になってきます。

Claude Codeにはフックという仕組みがあり、ツールがファイルの編集を終えた直後など、ワークフローの重要なポイントで指定したシェルコマンドを自動的に実行できます。

ここでは、その設定方法と、私がプロジェクトでどう使っているかを紹介します。

設定のスコープ

フックはClaude Codeの設定JSONファイルで構成します。スコープには3つのレベルがあります:

  • ~/.claude/settings.json — グローバルなユーザー設定(すべてのプロジェクトに適用)
  • .claude/settings.json — プロジェクト設定(gitにコミットされ、チームメンバーと共有)
  • .claude/settings.local.json — ローカルプロジェクトの上書き(gitignoreされ、個人のマシンのみ)

基本設定:ファイル編集時のフォーマット

Claude Codeがファイルを変更するたびにmix formatのようなフォーマッターを実行するには、PostToolUseフックをEditツールのマッチャー付きで設定します:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit",
        "hooks": [
          {
            "type": "command",
            "command": "mix format"
          }
        ]
      }
    ]
  }
}

これを.claude/settings.jsonに設定しておけば、フォーマットされていないコードが差分に混入する心配がなくなります。

トリガーポイントとマッチャー

Claude Codeにはいくつかのトリガーポイントがあります:

  • PreToolUse:ツールが実行される前に動作。ログ記録や検証に便利です。
  • PostToolUse:ツールが正常に完了した後に動作。フォーマッターやリンターに最適です。
  • Stop:Claudeがプロンプトへの応答を終えたときに動作。
  • Notification:Claudeが通知を送信するときにトリガーされます。

matcherフィールドは、どのツールがフックをトリガーするかを制御します:

  • "matcher": "Edit":ファイル編集時のみトリガー。
  • "matcher": "Edit|Write":複数のツールに一致する正規表現(部分編集とファイル全体の書き込みの両方など)。
  • "matcher": "Bash":コマンド実行時にトリガー。
  • マッチャーを省略:そのトリガーポイントのすべてのイベントで実行。

複数コマンドの例

単一のトリガーの下に複数のコマンドを連鎖させることができます。たとえば、ファイルが変更されるたびにフォーマッターと厳格なリンターの両方を実行し、さらにシェルコマンドのログ記録も行う場合:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "mix format"
          },
          {
            "type": "command",
            "command": "mix credo --strict"
          }
        ]
      }
    ],
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "echo \"[$(date)] Running: $CLAUDE_TOOL_INPUT\" >> .claude/command_log.txt"
          }
        ]
      }
    ]
  }
}

まとめ

プロジェクトのデフォルトフォーマッター用にシンプルなPostToolUseフックを設定するのは2分で済み、AI支援による編集後の手動クリーンアップの手間がなくなります。複数の言語を扱う場合は、言語に依存しない設定をユーザー設定に置き、プロジェクト固有のリンターを.claude/settings.jsonに設定することで、クリーンで予測可能な状態を保てます。

Epona
執筆Epona

There's nothing wrong with having a little fun

x.com/simura_epona

コメントを読み込み中…