この記事はnkjzmがClaude Codeと一緒に執筆しました。
はじめに
Claude Codeのsettings.jsonにはpermissions.allowでAllowリストを設定する機能がありますが、&&や;で結合された複合コマンドだとプレフィックスマッチが正しく機能しません。Allowリストに登録済みのコマンドでも毎回確認プロンプトが表示されるようになり、自動編集モードが中断されてしまいます。
この記事では、PreToolUseフックを使ってこの問題を回避する方法を紹介します。
👇最終的にこうい形で回避できます

複合コマンドを実行しようとすると警告が表示されて、分割して実行されている様子
問題の詳細
permissions.allowの設定例:
{
"permissions": {
"allow": [
"Bash(git add:*)",
"Bash(git commit:*)",
"Bash(git push:*)"
]
}
}
たとえばBash(git add:*)を許可していても、cd repo && git add .という複合コマンドはプレフィックスマッチに失敗し、確認プロンプトが表示されます。CLAUDE.mdで「複合コマンドは使わないこと」と指示することで改善はされますが、忘れられてしまうこともあり不確実でした。
GitHub Issueでの経緯
この問題にはセキュリティ修正との兼ね合いがあります。元々は#16180(&&でコマンドを繋ぐとAllowリストをすり抜けて任意コマンドを実行できてしまうセキュリティ問題)が報告され、v2.1.7で修正されました。しかし、その修正の副作用として安全な複合コマンドまで一律ブロックされるようになったのが現在の状況です。
#28183(個々のコマンドがAllowリストに入っていても複合コマンドだとプロンプトが表示されるという報告)は既存Issueと重複するためクローズされています。根本的な解決策として#16561(複合コマンドを&&などで分割して各コンポーネントを個別にAllowリストと照合する機能リクエスト)がありますが、2026年3月時点でまだOPENのままです。
つまり、現時点ではClaude Code本体での対応は行われておらず、ワークアラウンドが必要な状況です。
PreToolUseフックによる解決
PreToolUseフックは、BashやFileEditなどのツール実行前にスクリプトを割り込ませる仕組みです。フックからの出力でpermissionDecision: "deny"を返すと、Claude Codeは自動的にコマンドを分割して再実行しようとします。
詳しくは公式ドキュメント(Hooks Guide)を参照してください。
settings.jsonへの設定追加
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "node ~/.claude/hooks/no-compound-git.js"
}
]
}
]
}
}
Node.jsスクリプトの実装
~/.claude/hooks/no-compound-git.jsに以下のスクリプトを配置します。
#!/usr/bin/env node
const fs = require("fs");
const input = fs.readFileSync(0, "utf8");
const data = JSON.parse(input);
const command = data.tool_input?.command || "";
if (/\bgit\b/.test(command) && /(&&|\|\||;)/.test(command)) {
console.log(JSON.stringify({
hookSpecificOutput: {
hookEventName: "PreToolUse",
permissionDecision: "deny",
permissionDecisionReason:
"gitコマンドに複合コマンド(&&, ||, ;)を使わないでください。各コマンドを個別に実行してください。"
}
}));
}
process.exit(0);
標準入力からBashツールへの入力(JSONフォーマット)を受け取り、gitを含む複合コマンドであればpermissionDecision: "deny"を返します。それ以外のコマンドは何も出力せずprocess.exit(0)で終了するため、通常のコマンドには影響しません。
denyを受け取ったClaude Codeは理由を読み取り、cd pathとgit add .のように自動的にコマンドを分割して個別に再実行します。これによりAllowリストのプレフィックスマッチが正常に機能するようになります。
最後に
PreToolUseフックを使うことで、settings.jsonのAllowリストだけでは対応しきれない複合コマンドの問題をカバーできます。同じような課題を抱えている方の参考になれば幸いです。
よかったらXのフォローもよろしくお願いします!