原文(日本語に翻訳)
フックにargs: string[]フィールド(execフォーム)を追加。シェルを介さずにコマンドを直接起動するため、パスのプレースホルダーをクォートする必要がなくなります
原文(英語)
Added hook args: string[] field (exec form) that spawns the command directly without a shell, so path placeholders never need quoting
概要
フック設定にargsフィールドを追加することで、シェルを介さずにコマンドを直接実行できるexecフォームが利用できるようになりました。シェルフォームでは${CLAUDE_PLUGIN_ROOT}などのパスプレースホルダーにクォートが必要でしたが、execフォームでは各引数が個別のパラメータとして渡されるため、スペースを含むパスでも確実に動作します。
基本的な使い方
シェルフォーム(従来):
json
{
"hooks": {
"PostToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "/path/to/my-hook.sh \"${CLAUDE_PLUGIN_ROOT}/config\""
}
]
}
]
}
}execフォーム(新機能):
json
{
"hooks": {
"PostToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "/path/to/my-hook.sh",
"args": ["${CLAUDE_PLUGIN_ROOT}/config"]
}
]
}
]
}
}実践例
スペースを含むパスでの安全な実行
json
{
"hooks": {
"PreToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "/usr/local/bin/validate-file",
"args": [
"--config",
"${CLAUDE_PROJECT_DIR}/.validation-rules.json",
"--file",
"${TOOL_INPUT_FILE_PATH}"
]
}
]
}
]
}
}プラグインのフックでexecフォームを使用
json
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "node",
"args": [
"${CLAUDE_PLUGIN_ROOT}/hooks/on-stop.js",
"--session-id",
"${CLAUDE_SESSION_ID}"
]
}
]
}
]
}
}注意点
argsフィールドがある場合はexecフォーム(シェルなし)で実行されますargsフィールドがない場合は従来通りシェルフォームで実行されます- execフォームではシェル展開(
*グロブ、パイプ|など)は使用できません - パスにスペースが含まれる環境(macOSのアプリケーションフォルダなど)で特に効果的です
${CLAUDE_PROJECT_DIR}、${CLAUDE_PLUGIN_ROOT}などのプレースホルダーはexecフォームでも展開されます