2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Codeで複合コマンドの確認プロンプトが表示される問題を防ぐ

2
Last updated at Posted at 2026-03-11

この記事はnkjzmがClaude Codeと一緒に執筆しました。

はじめに

Claude Codeのsettings.jsonにはpermissions.allowでAllowリストを設定する機能がありますが、&&;で結合された複合コマンドだとプレフィックスマッチが正しく機能しません。Allowリストに登録済みのコマンドでも毎回確認プロンプトが表示されるようになり、自動編集モードが中断されてしまいます。

この記事では、PreToolUseフックを使ってこの問題を回避する方法を紹介します。

👇最終的にこうい形で回避できます

IMG
複合コマンドを実行しようとすると警告が表示されて、分割して実行されている様子

問題の詳細

permissions.allowの設定例:

.claude/settings.json
{
  "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への設定追加

.claude/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に以下のスクリプトを配置します。

~/.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 pathgit add .のように自動的にコマンドを分割して個別に再実行します。これによりAllowリストのプレフィックスマッチが正常に機能するようになります。

最後に

PreToolUseフックを使うことで、settings.jsonのAllowリストだけでは対応しきれない複合コマンドの問題をカバーできます。同じような課題を抱えている方の参考になれば幸いです。

よかったらXのフォローもよろしくお願いします!

参考

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?