Skip to content

原文(日本語に翻訳)

ツール呼び出しが失敗した場合に、PreToolUseフックのadditionalContextが失われる問題を修正しました。

原文(英語)

Fixed PreToolUse hook additionalContext being dropped when the tool call fails.

概要

Claude Code v2.1.110では、PreToolUseフックが返すadditionalContext(追加コンテキスト情報)が、ツール呼び出し自体が失敗した場合に失われてしまう問題が修正されました。additionalContextはフックからClaudeへの追加情報を提供するための仕組みですが、ツールが失敗した状況でもこの情報がClaudeに正しく渡されるようになりました。これにより、フックがエラーの原因や対処法などの追加情報を提供する場合でも、Claudeが適切に対応できるようになります。

基本的な使い方

json
// .claude/settings.json でのPreToolUseフック設定例
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash(*)",
        "hooks": [
          {
            "type": "command",
            "command": "pre-bash-hook.sh"
          }
        ]
      }
    ]
  }
}
bash
#!/bin/bash
# pre-bash-hook.sh
# ツールの実行前チェックと追加コンテキストの提供

INPUT=$(cat)
COMMAND=$(echo $INPUT | jq -r '.tool_input.command // empty')

# 追加コンテキストをClaudeに提供
echo '{
  "additionalContext": "このコマンドは本番環境に影響します。慎重に実行してください。",
  "decision": "approve"
}'

実践例

ユースケース1: ツール失敗時の追加コンテキスト

bash
#!/bin/bash
# tool-context-hook.sh
# ツールが失敗する可能性がある場合に追加情報を提供

INPUT=$(cat)
COMMAND=$(echo $INPUT | jq -r '.tool_input.command // empty')

# データベース関連のコマンドをチェック
if echo "$COMMAND" | grep -q "psql\|mysql\|mongo"; then
  echo '{
    "additionalContext": "データベース接続が必要です。環境変数 DB_HOST, DB_PORT, DB_USER が設定されているか確認してください。接続失敗の場合は VPN 接続を確認してください。",
    "decision": "approve"
  }'
fi

// 修正前: ツール呼び出し(psql コマンド)が失敗した場合、
// additionalContext Claude に渡されず、
// Claude は「コマンドが失敗しました」という情報のみしか受け取れなかった

// 修正後: ツール呼び出しが失敗しても、
// "データベース接続が必要です..." の情報が Claude に渡され、
// Claude がより適切な対処を提案できるようになった

ユースケース2: エラー診断情報の提供

bash
#!/bin/bash
# error-context-hook.sh
# エラーの原因診断情報を提供

INPUT=$(cat)
TOOL=$(echo $INPUT | jq -r '.tool_name')
COMMAND=$(echo $INPUT | jq -r '.tool_input.command // empty')

ADDITIONAL_CONTEXT=""

# 一般的なエラーシナリオに対応する情報を準備
if echo "$COMMAND" | grep -q "npm install"; then
  ADDITIONAL_CONTEXT="npm install が失敗する場合の一般的な原因: 1) node_modules の権限問題 2) package.json の構文エラー 3) ネットワーク接続の問題 4) Node.js バージョンの不一致"
elif echo "$COMMAND" | grep -q "docker"; then
  ADDITIONAL_CONTEXT="Docker コマンドが失敗する場合: Docker Desktop が起動しているか確認してください。'docker ps' で状態を確認できます。"
fi

echo "{
  \"additionalContext\": \"$ADDITIONAL_CONTEXT\",
  \"decision\": \"approve\"
}"

ユースケース3: セキュリティ監査コンテキスト

bash
#!/bin/bash
# security-audit-hook.sh
# セキュリティ監査情報を提供

INPUT=$(cat)
COMMAND=$(echo $INPUT | jq -r '.tool_input.command // empty')
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
USER=$(whoami)

# 監査ログに記録
echo "[AUDIT] $TIMESTAMP | User: $USER | Command: $COMMAND" >> ~/.claude/audit.log

echo "{
  \"additionalContext\": \"このコマンドは監査ログに記録されました($TIMESTAMP)。コマンドが失敗した場合でも、実行試行は記録されます。\",
  \"decision\": \"approve\"
}"

ユースケース4: 環境別の追加情報

bash
#!/bin/bash
# environment-context-hook.sh

INPUT=$(cat)
COMMAND=$(echo $INPUT | jq -r '.tool_input.command // empty')
ENV=${ENVIRONMENT:-development}

case $ENV in
  production)
    CONTEXT="【警告】本番環境で実行中です。変更は即座に本番に反映されます。"
    ;;
  staging)
    CONTEXT="ステージング環境で実行中です。本番との差異に注意してください。"
    ;;
  *)
    CONTEXT="開発環境で実行中です。"
    ;;
esac

echo "{
  \"additionalContext\": \"$CONTEXT\",
  \"decision\": \"approve\"
}"

注意点

  • additionalContextの用途additionalContextはClaudeへの補足情報提供のための仕組みです。ツールの実行可否の制御にはdecisionフィールドを使用します。
  • 失敗時の重要性 — ツールが失敗した場合の追加コンテキストは、Claudeがエラーの原因を理解し適切な対処を提案するために特に重要です。
  • 修正の影響PreToolUseフックでadditionalContextを返しているすべてのユーザーが恩恵を受けます。
  • ログとデバッグ — フックの動作を確認するにはCLAUDE_DEBUG=hooks claudeでデバッグ出力を有効にしてください。

関連情報