mcpField
H
hooks-configuration

hooks-configuration

github.com/laurigatesエージェントワークフロー5984 回インストール1 日前に更新
リポジトリ

hooks-configuration について

hooks-configuration は、ワークフローの自動化やルール適用に使う Claude Code hooks の設定・開発スキルです。ライフサイクルイベント、フックの種類、設定方法、一般的なパターンを扱います。

主な機能

  1. 01Claude Code のライフサイクルフック設定
  2. 02危険なコマンドの阻止とルール適用
  3. 03編集後のフォーマットとログ記録
  4. 04セッションやサブエージェント開始時のコンテキスト注入
  5. 05プロンプト・エージェントフックの設定

活用シーン

  1. 01ツール実行前の危険なコマンド阻止
  2. 02ツール完了後のファイル整形
  3. 03セッション開始時のプロジェクト情報読み込み

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/laurigates/claude-plugins --skill hooks-configuration

インストール後、Claude Code で/hooks-configurationを入力して読み込まれたか確認します。

同梱ファイルREFERENCE.md

詳細

Claude Code フックの設定

ワークフローを自動化し、ベストプラクティスを徹底するための Claude Code フックの設定と開発に関する専門知識です。

このスキルを使用する場面

このスキルを使用する場面...別の方法を使用する場面...
フックのライフサイクルイベント(PreToolUse、PostToolUse など)を設定する場合フックと関係のない一般的なシェルスクリプトを作成する場合
危険なコマンドをブロックしたり、パターンを徹底したりする場合CI/CD パイプラインを設定する場合(CI ツールを使用してください)
編集後にファイルを自動フォーマットする場合フックと関係のない Claude Code の設定を行う場合
セッションまたはサブエージェントの開始時にコンテキストを注入する場合独立した自動化スクリプトを作成する場合
PermissionRequest の自動承認/拒否を設定する場合settings.json を直接使ってプロジェクトの権限を管理する場合
判断に基づく決定を行うプロンプトフックまたはエージェントフックを開発する場合MCP サーバーやカスタムツール連携を構築する場合

主な概念

フックとは何ですか? フックは、Claude Code のライフサイクルの特定のタイミングで実行される、ユーザー定義のシェルコマンドです。Claude が何かを実行する「判断」に依存するのとは異なり、フックは確実で保証された実行を提供します。

フックを使用する理由

  • コードのフォーマットを自動的に徹底する
  • 実行前に危険なコマンドをブロックする
  • セッション開始時にコンテキストを注入する
  • 監査証跡のためにコマンドを記録する
  • タスク完了時に通知を送信する

フックのライフサイクルイベント

イベント発生するタイミング主な用途
SessionStartセッションの開始時/再開時環境のセットアップ、コンテキストの読み込み
SessionEndセッションの終了時クリーンアップ、状態の永続化
UserPromptSubmitユーザーがプロンプトを送信したとき入力の検証、コンテキストの挿入
PreToolUseツールの実行前権限の制御、危険な操作のブロック
PostToolUseツールの実行後自動フォーマット、ログ記録、検証
PostToolUseFailureツールの実行が失敗した後再試行の判断、エラー処理
PermissionRequestClaude がツールの使用許可を要求したときユーザーへの確認なしで自動的に許可/拒否
Stopメインエージェントが応答を完了したとき通知、Git のリマインダー
SubagentStartサブエージェント(Task ツール)の開始直前入力の変更、コンテキストの挿入
SubagentStopサブエージェントの完了時タスクごとの完了評価
WorktreeCreateEnterWorktree によって新しい Git ワークツリーが作成されたときワークツリーのセットアップ、依存関係のインストール
WorktreeRemoveセッション終了後にワークツリーが削除されたときクリーンアップ、未コミット変更の警告
TeammateIdleエージェントチームのチームメイトがアイドル状態になったときチームメイトへの追加タスクの割り当て
TaskCompleted共有タスクリストでタスクが完了としてマークされたときタスク受け入れ前の検証ゲート
PreCompactコンテキストの圧縮前トランスクリプトのバックアップ
NotificationClaude が通知を送信したときカスタムアラート
ConfigChangeClaude Code の設定が実行中に変更されたとき設定変更の監査、検証

Stop と SubagentStop の違い:Stop は、メインエージェントが応答ターンを完了したときにセッションレベルで発生します。SubagentStop は、個々のサブエージェント(Task ツールによって起動)が完了したときに発生します。セッションレベルの通知には Stop を、タスクごとの品質ゲートには SubagentStop を使用します。

各イベントの完全なスキーマ、例、タイムアウトの推奨事項については、.claude/rules/hooks-reference.md を参照してください。

設定

ファイルの場所

フックは設定ファイルで設定します。

  • ~/.claude/settings.json - ユーザーレベル(すべての場所に適用)
  • .claude/settings.json - プロジェクトレベル(リポジトリにコミット)
  • .claude/settings.local.json - プロジェクトのローカル設定(コミットしない)

Claude Code は、すべてのファイルから条件に一致するフックをマージします。

フロントマターのフック(スキルとコマンド)

スキルやコマンドのフロントマターで hooks フィールドを使用して、フックを直接定義することもできます。

---
name: my-skill
description: A skill with hooks
allowed-tools: Bash, Read
hooks:
  PreToolUse:
    - matcher: "Bash"
      hooks:
        - type: command
          command: "echo 'Pre-tool hook from skill'"
          timeout: 10
---
基本構造
{
  "hooks": {
    "EventName": [
      {
        "matcher": "ToolPattern",
        "hooks": [
          {
            "type": "command",
            "command": "your-command-here",
            "timeout": 30
          }
        ]
      }
    ]
  }
}
マッチャーパターン
  • 完全一致:「Bash」ツールに完全一致する "Bash"
  • 正規表現パターン:いずれかのツールに一致する "Edit|Write"
  • ワイルドカード:「Notebook」で始まるツールに一致する "Notebook.*"
  • すべてのツール:すべてに一致する "*"
  • MCP ツール:MCP サーバーのツールを対象とする "mcp__server__tool"

入力/出力スキーマの概要

フックは、共通フィールド(session_id、transcript_path、cwd、permission_mode、hook_event_name)を含む JSON を stdin 経由で受け取ります。イベント固有のフィールドには、PreToolUse の tool_name と tool_input、PostToolUse の tool_response、SubagentStart の subagent_type/subagent_prompt があります。

終了コード:0 = 許可、2 = ブロック(stderr の内容が Claude に表示されます)、その他 = ブロックを伴わないエラー。

JSON レスポンスはイベントごとに異なります。PreToolUse は permissionDecision を含む hookSpecificOutput を使用し、Stop/SubagentStop は decision/reason を使用し、SubagentStart は updatedPrompt を使用し、SessionStart は additionalContext を含む hookSpecificOutput を使用します。

フックの詳細なスキーマと例については、REFERENCE.md を参照してください。

よくあるフックのパターン

危険なコマンドをブロックする(PreToolUse)
#!/bin/bash
INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')

# Block rm -rf /
if echo "$COMMAND" | grep -Eq 'rm\s+(-rf|-fr)\s+/'; then
    echo "BLOCKED: Refusing to run destructive command on root" >&2
    exit 2
fi

exit 0
編集後に自動フォーマットする(PostToolUse)
#!/bin/bash
INPUT=$(cat)
FILE=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')

if [[ "$FILE" == *.py ]]; then
    ruff format "$FILE" 2>/dev/null
    ruff check --fix "$FILE" 2>/dev/null
elif [[ "$FILE" == *.ts ]] || [[ "$FILE" == *.tsx ]]; then
    prettier --write "$FILE" 2>/dev/null
fi

exit 0
組み込みツールを使うよう促す(PreToolUse)
#!/bin/bash
INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')

if echo "$COMMAND" | grep -Eq '^\s*cat\s+[^|><]'; then
    echo "REMINDER: Use the Read tool instead of 'cat'" >&2
    exit 2
fi

exit 0
セッション開始時にコンテキストを読み込む(SessionStart)
#!/bin/bash
GIT_STATUS=$(git status --short 2>/dev/null | head -5)
BRANCH=$(git branch --show-current 2>/dev/null)

CONTEXT="Current branch: $BRANCH\nPending changes:\n$GIT_STATUS"
jq -n --arg ctx "$CONTEXT" '{
  "hookSpecificOutput": {
    "hookEventName": "SessionStart",
    "additionalContext": $ctx
  }
}'

その他のパターン(サブエージェントへの挿入、デスクトップ通知、監査ログ、自動承認、worktree のセットアップ、タスクのゲーティング)については、REFERENCE.md を参照してください。

プロンプトベースおよびエージェントベースのフック

フックの種類は 4 つあります。command(シェルスクリプト、終了コード)、http(HTTPS エンドポイント)、prompt(単一ターンの LLM 呼び出し)、agent(ツールアクセスを伴う複数ターン)です。決定論的なルールには command を、判断を伴う決定には prompt/agent を使用してください。バックグラウンドで実行して結果を待たない場合は async: true を、セッションごとに一度だけ実行する場合は once: true を追加します。

プロンプトフックとエージェントフックは、PreToolUse、PostToolUse、PostToolUseFailure、PermissionRequest、Stop、SubagentStop、TaskCompleted、UserPromptSubmit で動作します。その他のすべてのイベントでサポートされるのは command フックのみです。

フックの種類の詳細、CLAUDE_ENV_FILE、設定例については、REFERENCE.md および .claude/rules/prompt-agent-hooks.md を参照してください。

ブロックされたコマンドへの対処

PreToolUse フックがコマンドをブロックした場合:

状況対応
フックが代替案を提示する提案されたツール/方法を使用する
代替案が機能しないユーザーにコマンドを手動で実行してもらう
ユーザーが「続行」と言うそれでもブロックされます。理由を説明し、手動実行用のコマンドを提示してください

重要:ユーザーの許可によってフックを回避することはできません。ブロックされたコマンドを再試行しても、再び失敗します。

コマンドが正当に必要な場合:

  1. コマンドが必要な理由を説明する
  2. 検討した代替案と、それらが機能しない理由を説明する
  3. ユーザーが手動で実行するための正確なコマンドを提示する
  4. ユーザーの判断に任せる

タイムアウトのガイドライン

Claude Code 2.1.50 以降では、フックのデフォルトのタイムアウトは 600s(10 分)です。意図を明確にし、「Hook cancelled」エラーを防ぐため、タイムアウトを明示的に設定してください。

フックの種類推奨タイムアウト用途
SessionStart120–300sテスト、リンター、依存関係のチェック
SessionEnd60–120sログ記録、クリーンアップ、状態の保存
Stop / SubagentStop30–60sGit の状態チェック、簡単な検証
PreToolUse10–30s簡単な検証
PostToolUse30–120sログ記録、通知
PermissionRequest5–15s快適なユーザー体験のため、迅速に処理
バックグラウンドサブシェルパターン(推奨)

ブロックせずに時間のかかる処理(ログ記録、API 呼び出し)をフックで実行する必要がある場合は、バックグラウンドサブシェルで実行します。

#!/bin/bash
# Exits instantly; slow work continues in background
(
  echo "$(date): Session ended" >> ~/.claude/session.log
  # Any other slow work...
) &>/dev/null &
exit 0

この方法が機能する理由:( ) はサブシェルを作成し、& はバックグラウンドで実行し、&>/dev/null は stdout/stderr によるブロックを防ぎ、exit 0 は直ちに成功を返します。

ベストプラクティス

領域主なポイント
スクリプトcat で stdin を読み込み、jq で解析します。すべての変数を引用符で囲みます。ブロックする場合は終了コード 2、許可する場合は 0 を返します。メッセージは stderr に出力し、5 秒未満で完了させます
設定移植可能なパスには $CLAUDE_PROJECT_DIR を使用します。タイムアウトを明示し、ワイルドカードより具体的なマッチャーを使います。有効にする前にテストします
セキュリティすべての入力を検証します。絶対パスを使用します。.env や .git/ を直接使用しないでください。デプロイ前に確認します

デバッグ

エラー原因対処方法
フックがキャンセルされたタイムアウトを超過しました"timeout" フィールドを追加するか、バックグラウンドのサブシェルパターンを使用します
フックが失敗したスクリプトエラーです終了コードを確認し、エラー処理を追加します
コマンドが見つからないスクリプトがありませんスクリプトのパスと権限を確認します
アクセスが拒否されたスクリプトに実行権限がありませんchmod +x ~/.claude/script.sh

/hooks で登録を確認し、詳細なログには claude --debug を使用します。手動でテストするには、echo '{"tool_input":{"command":"..."}}' | bash your-hook.sh を実行します。終了コードは $? で確認できます。プラグインフックのドキュメントについては、hooks/README.md を参照してください。

コメント