Claude Codeで自作のコマンドを自動化していて確認プロンプトが多いと感じたら、.claude/settings.jsonのpermissions.allowにコマンドパターンを書けば、特定の操作だけ確認なしで実行できます。ただし、便利さを優先して許可パターンを広く書いてしまうと、想定していないコマンドまで無確認で通ってしまう落とし穴があります。今回はこれに実際にハマってから気づいたので、その時の判断と直し方をまとめます。
背景
ブログのネタからWordPressに下書き記事を投稿する自作コマンドを作っていたところ、SSH・SCP・WP-CLIの実行のたびに確認プロンプトが出るのが手間になってきました。同じコマンドを毎回承認するのは地味に時間を取られるんですよね。
確認プロンプトを消すには2つの方法がある
最初は「コマンドの説明文の中に『これ以外は実行しない』というルールを書けばいいのでは」と考えました。これは実際にやる価値のある対策ですが、これだけでは確認プロンプトは消えません。コマンドファイルに書くルールは「AIが変なコマンドを叩かないようにする安全策」であり、「Claude Code側が確認を求めるかどうか」とは別の話だと整理できました。
確認プロンプトを実際に消すには、次の2つの方法があります。
- 初回実行時に出るダイアログで「今後このパターンは確認しない」を選ぶ
.claude/settings.jsonのpermissions.allowに、許可したいコマンドのパターンを明示的に書く
また、Claude Codeの許可設定は「どのスキル(コマンド)が実行したか」という単位では効きません。あくまで「コマンドの文字列パターン単位」でしか許可・拒否を判定できないという仕組みも、調べて分かりました。
広すぎるパターンで許可してしまった失敗
最初に書いた許可ルールはこのような内容でした。
"Bash(ssh takecraft-xserver *)"
これは「takecraft-xserverというホストへのSSH接続なら、どんなコマンドでも確認なしで実行してよい」という意味になります。本来許可したかったのはwp post createのような特定のWP-CLIコマンドだけだったのですが、このパターンだとそのホストに対する任意のコマンドが無確認で通ってしまう状態でした。これに気づいたときはちょっとヒヤッとしました。
似たような問題が、ファイルの書き込み権限にもありました。
"Write(docs/blog-drafts/**)"
これも「そのディレクトリ配下なら拡張子を問わず何でも書き込み可能」になっており、想定していた「.mdファイルだけ」という範囲より広い許可になっていました。
修正: コマンドの文字列をできるだけ固定する
修正では、ワイルドカード(*)を使う場所を最小限にし、サブコマンドや固定フラグまで文字列として固定しました。
"Bash(ssh takecraft-xserver \"cd /path/to/site && wp post create /tmp/blog-post-content.html --post_type=post --post_status=draft *)"
--post_status=draftという固定文字列を含めたことで、もし誤って--post_status=publishを実行しようとしても、この許可パターンには一致せず、通常の確認プロンプトに戻ります。書き込み範囲もWrite(docs/blog-drafts/*.md)のように拡張子まで絞りました。
どんなときに役立つか
この仕組みが向いているのは、「決まった手順を何度も繰り返す自動化コマンド」「個人開発で自分しか使わない、安全な範囲が明確な操作」です。逆に、コマンドの内容が毎回大きく変わるような汎用作業には向きません。パターンを書きづらく、結局広く許可してしまいがちだからです。
まとめ
確認プロンプトを消すこと自体は簡単ですが、「楽にする」ことと「安全に保つ」ことは別の問題かなと思います。コマンドパターンはできるだけ固定文字列で書き、ワイルドカードを使う範囲を最小限にすることで、便利さと安全性を両方保てると感じました。
よくある質問
コマンドファイルに「禁止ルール」を書けば確認プロンプトは出なくなりますか?
出なくなりません。コマンドファイルのルールはAI自身の振る舞いを制約するものであり、Claude Code側の確認プロンプトの表示・非表示とは別の仕組みです。
permissions.allowの設定はプロジェクトとユーザーどちらに書くべきですか?
プロジェクト固有の自動化であれば、プロジェクト側の.claude/settings.jsonに書く方が、後から見返しやすく、他の判断記録とも一緒に管理できると感じました。
ワイルドカードを全く使わずに書くことはできますか?
コマンドの引数(投稿ID、タイトルなど)が毎回変わる以上、完全に固定文字列だけで書くのは難しいです。固定したい部分(サブコマンドやステータス指定など)だけ文字列で固定し、変わる部分だけワイルドカードにする、という考え方が現実的だと思います。

コメント