Skip to content

原文(日本語に翻訳)

Write/Edit/Readツールに対してPreToolUse/PostToolUseフックがドキュメント記載の動作と一致するように、file_pathを絶対パスとして受け取るよう修正しました。

原文(英語)

Fixed PreToolUse/PostToolUse hooks to receive file_path as an absolute path for Write/Edit/Read tools, matching the documented behavior

概要

PreToolUse および PostToolUse フックでWrite/Edit/Readツールの file_path を受け取る際、ドキュメントには絶対パスが渡されると記載されているにもかかわらず、実際には相対パスが渡されていました。この不一致により、フック内でのパス処理が不安定になり、フックが正しく機能しないケースがありました。v2.1.89でドキュメント通りの絶対パスが渡されるようになりました。

基本的な使い方

json
// .claude/settings.json でのフック設定例
{
  "hooks": {
    "PreToolUse": [
      {
        "type": "command",
        "command": "echo 'About to edit: $CLAUDE_TOOL_INPUT_FILE_PATH'",
        "tools": ["Edit", "Write", "Read"]
      }
    ],
    "PostToolUse": [
      {
        "type": "command",
        "command": "git add '$CLAUDE_TOOL_INPUT_FILE_PATH'",
        "tools": ["Edit", "Write"]
      }
    ]
  }
}

修正後は $CLAUDE_TOOL_INPUT_FILE_PATH に絶対パスが設定されます(例: /home/user/project/src/main.py)。

実践例

ファイル編集後の自動コミットフック

bash
#!/bin/bash
# PostToolUse フックスクリプト: 編集後に自動でgit addする

FILE_PATH="$CLAUDE_TOOL_INPUT_FILE_PATH"

# 修正前: 相対パスが渡されていたため、cdが必要だった
# 修正後: 絶対パスが渡されるため、直接使用できる
if [ -f "$FILE_PATH" ]; then
  git add "$FILE_PATH"
  echo "Staged: $FILE_PATH"
fi

ファイルアクセスログのフック

python
#!/usr/bin/env python3
# PreToolUse フックスクリプト: ファイルアクセスをログに記録する

import os
import json
import sys
from datetime import datetime

tool_input = json.load(sys.stdin)
file_path = tool_input.get("file_path", "")

# 修正後: 絶対パスが渡されるため、os.path操作が確実に動作する
if os.path.isabs(file_path):
    with open("/tmp/claude-file-access.log", "a") as f:
        f.write(f"{datetime.now().isoformat()}: {file_path}\n")

セキュリティチェックフック

bash
#!/bin/bash
# PreToolUse フック: 特定ディレクトリ外へのWriteを拒否する

FILE_PATH="$CLAUDE_TOOL_INPUT_FILE_PATH"
ALLOWED_DIR="/home/user/project"

# 修正後: 絶対パスで確実に比較できる
if [[ "$FILE_PATH" != "$ALLOWED_DIR"* ]]; then
  echo "ERROR: Write to $FILE_PATH is not allowed" >&2
  exit 1
fi

注意点

  • この修正でフックに渡される file_path が絶対パスになりました
  • 相対パスを期待していたフックスクリプトがある場合は修正が必要です
  • basenamedirname などのパス操作は絶対パスの方が確実に動作します
  • フックが正しく動作しているか、デバッグモードで確認することを推奨します

関連情報