CC Guide
中級

Hooks で作業を自動化する

PreToolUse/PostToolUseフックを使って、コードフォーマット、型チェック、セキュリティスキャンを自動化する実践ガイド。

hooks自動化中級者向け

Hooks とは

Hooks は、Claude Code がツールを実行する前後(またはセッション終了時)に自動的に実行されるスクリプトの仕組みだ。「毎回手動でやっている確認作業」を自動化できる。

3つのフックタイプ

タイプ実行タイミング用途
PreToolUseツール実行の前バリデーション、パラメータの修正、実行のブロック
PostToolUseツール実行の後自動フォーマット、型チェック、警告の出力
Stopセッション終了時最終確認、監査ログの記録

フックが解決する問題

# フックなし
Claude がコードを編集 → フォーマットが乱れる → 手動で prettier を実行
Claude がファイルを作成 → console.log が残る → 手動で確認
Claude がセッション終了 → 未コミットの変更に気づかない

# フックあり
Claude がコードを編集 → PostToolUse で prettier が自動実行
Claude がファイルを作成 → PostToolUse で console.log を警告
Claude がセッション終了 → Stop で未コミット変更を通知

Hooks導入の効果

項目hooks なしhooks あり
コードフォーマット手動で prettier 実行を忘れがちPostToolUse で編集後に自動フォーマット
型チェックビルド時まで型エラーに気づかないPostToolUse で .ts 編集後に即座に tsc 実行
セキュリティgit push 前のレビューを忘れるPreToolUse で push 前にZedエディタでレビューを促す
console.log本番コードに残留するリスクStop hook でセッション終了時に全修正ファイルを監査
ドキュメント生成不要なREADME等を誤って作成PreToolUse で不要な .md 作成をブロック

基本設定方法

フックは ~/.claude/settings.json(ユーザー全体)または .claude/settings.json(プロジェクト単位)に設定する。

設定ファイルの構造

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "echo 'File modification detected'"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Edit",
        "hooks": [
          {
            "type": "command",
            "command": "npx prettier --write $CLAUDE_FILE_PATH"
          }
        ]
      }
    ],
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "git diff --stat"
          }
        ]
      }
    ]
  }
}

matcher の書き方

matcher にはツール名を正規表現で指定する。

matcher一致するツール
"Edit"Edit ツールのみ
"Edit|Write"Edit または Write
"Bash"Bash ツールのみ
".*"全ツール
""全ツール(Stopフック用)

環境変数

フックの実行時には以下の環境変数が利用できる。

変数内容
$CLAUDE_TOOL_NAME実行されたツール名Edit
$CLAUDE_FILE_PATH操作対象のファイルパスsrc/app/page.tsx

実践例

1. 保存時フォーマット (PostToolUse)

Edit や Write でファイルが変更された後に、自動的に Prettier を実行する。

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "npx prettier --write \"$CLAUDE_FILE_PATH\" 2>/dev/null || true"
          }
        ]
      }
    ]
  }
}

ポイント: 2>/dev/null || true を付けると、Prettier がインストールされていない場合でもエラーで止まらない。

2. TypeScript 型チェック (PostToolUse)

TypeScript ファイルが編集された後に tsc --noEmit を実行し、型エラーを検出する。

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "if [[ \"$CLAUDE_FILE_PATH\" == *.ts || \"$CLAUDE_FILE_PATH\" == *.tsx ]]; then npx tsc --noEmit 2>&1 | head -20; fi"
          }
        ]
      }
    ]
  }
}

3. console.log 警告 (PostToolUse)

編集されたファイルに console.log が含まれていないか確認し、あれば警告を出す。

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "if grep -q 'console\\.log' \"$CLAUDE_FILE_PATH\" 2>/dev/null; then echo 'WARNING: console.log detected in $CLAUDE_FILE_PATH'; fi"
          }
        ]
      }
    ]
  }
}

4. git push 前のレビュー (PreToolUse)

git push の実行前にエディタで変更内容を確認させる。

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -q 'git push'; then echo 'Review changes before pushing:'; git diff --stat HEAD~1; fi"
          }
        ]
      }
    ]
  }
}

5. セッション終了時の監査 (Stop)

セッション終了時に修正されたファイルの一覧を表示する。

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "echo '=== Modified files this session ==='; git diff --name-only 2>/dev/null || echo 'Not a git repository'"
          }
        ]
      }
    ]
  }
}

セキュリティフックの設定

セキュリティに関わる確認を自動化する実践的なフック設定。

機密情報の検出

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "if grep -qE '(sk-[a-zA-Z0-9]{20,}|password\\s*=|secret\\s*=|api_key\\s*=)' \"$CLAUDE_FILE_PATH\" 2>/dev/null; then echo 'CRITICAL: Potential secret detected in $CLAUDE_FILE_PATH'; exit 1; fi"
          }
        ]
      }
    ]
  }
}

危険なコマンドのブロック

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -qE '(rm -rf /|DROP TABLE|truncate)'; then echo 'BLOCKED: Dangerous command detected'; exit 1; fi"
          }
        ]
      }
    ]
  }
}

フックのデバッグ方法

フックが期待通りに動作しない場合のトラブルシューティング。

1. フックの実行を確認する

フックが実行されているか確認するには、コマンドの先頭に echo を追加してログを出力する。

{
  "command": "echo \"[$(date)] Hook executed for $CLAUDE_TOOL_NAME on $CLAUDE_FILE_PATH\" >> /tmp/claude-hooks.log && npx prettier --write \"$CLAUDE_FILE_PATH\""
}

/tmp/claude-hooks.log を確認することで、フックの実行履歴が分かる。

2. よくある問題と対処

問題原因対処
フックが実行されないmatcherの正規表現が間違っているツール名と正確に一致するか確認
コマンドがエラーで止まるコマンドの終了コードが0以外|| true を追加
ファイルパスが空白で切れるパスにスペースが含まれる\"$CLAUDE_FILE_PATH\" でクォート
フックが遅いコマンドの実行に時間がかかるhead で出力を制限

3. フックの無効化

一時的にフックを無効化したい場合は、環境変数を使う。

{
  "command": "if [ -z \"$SKIP_HOOKS\" ]; then npx prettier --write \"$CLAUDE_FILE_PATH\"; fi"
}
# フックをスキップしてセッション開始
SKIP_HOOKS=1 claude

まとめ

Hooks を活用すると、Claude Code の作業フローに「自動品質保証」のレイヤーを追加できる。手動で行っていたフォーマット、型チェック、セキュリティ確認を自動化することで、ミスを防ぎつつ作業効率も向上する。

フック自動化の詳細については、フック自動化で詳しく解説しています。キーバインド設定については、キーバインドによる効率的な入力で詳しく解説しています。

次に読むべきガイド: MCP サーバーで機能を拡張する では、外部ツール連携によるさらなる自動化を学べる。

リファレンス


すぐ試したい方へ

具体的な設定レシピをすぐ試したい場合は、Hook自動化Tips で実践的なテクニックを確認できます。

次のステップ

高度に進む

上級者向け学習パス: ハーネスエンジニアリングと運用最適化

Claude Code の活用を極限まで高める方向けのガイド。ハーネス最適化、プラグイン開発、マルチモデルオーケストレーション、組織展開まで。

関連コンテンツ