M.

Claude Code の settings.local.json に許可ルールが879件溜まっていた

Claude Code でコマンドの実行確認が出たとき、「Yes, and don’t ask again」を選ぶと、そのコマンドが許可ルールとして保存されます。保存先はリポジトリの .claude/settings.local.json です(git には入らないファイルです)。

便利なので気軽に選んでいたら、いつの間にか大量に溜まっていました。手元の10リポジトリ分を数えてみます。

環境:Windows 10 / Claude Code 2.1.302

数えてみた

各リポジトリの .claude/settings.local.json の permissions.allow を、Python で集計しました。

リポジトリ許可ルールうち一回限りうちワイルドカード付き
A(ブログ運用・GCP)37628558
B(VST プラグイン)1045931
C(Web アプリ)976817
D(VST プラグイン)887110
E(Windows アプリ)735118
F〜J(5リポジトリ)1417457
合計879608191

「一回限り」は、* を含まず、コマンドを丸ごと書いたルールです。同じコマンドをもう一度打たない限り、二度と使われません。

ほかにも、こんなものがありました。

  • 120文字を超えるルールが151件。長いワンライナーがそのまま保存されている
  • 改行を含むルールが6件。複数行のスクリプトがまるごと1件のルールになっている
  • 135件は、グローバル設定(~/.claude/settings.json)の許可とかぶっている。あとからグローバルに Bash(python *) などを足したので、もう要らないルールです

ツール別では、832件が Bash でした。

何が溜まっていたか

一回限りのルールを、種類ごとに分けるとこうなりました。

種類件数例
PID を指定した kill13kill 1751、taskkill //PID 13980 //F
行範囲を指定した sed9sed -n '466,561p' public/script.test.js
一時ファイルの削除26rm -f _tmp_check.py
パイプの断片47awk '{print $1}'、cat、break、disown
ssh / scp(接続先込み)10接続先の IP・ユーザー名・鍵のパスがそのまま入っている
環境変数込み3ANTHROPIC_API_KEY=dummy-... node app.js
その他526一度だけ打った確認用のコマンドなど

PID や行番号は毎回変わるので、同じルールが二度使われることはまずありません。

「パイプの断片」は、パイプや ; でつないだコマンドを許可したときに、つないだ部分ごとにルールが保存されたもののようです。Bash(break) や Bash(cat) だけのルールがあって、最初は何かと思いました。

気になったのは ssh / scp です。サーバーの IP アドレス、ユーザー名、秘密鍵のパスが平文で残っていました。git に入らないファイルとはいえ、こういう情報が散らばっているのはうれしくありません。

溜まると何が困るか

  • 何を許可しているのか、読んでも分からない。879件を眺めて危ないルールを探すのは無理があります
  • 必要な許可が埋もれる。本当に残したいのはワイルドカード付きの191件のほうです
  • リポジトリごとにばらばら。同じ gcloud の許可が、リポジトリごとに少しずつ違う形で入っています

整理の方針

整理するときは、次の順に考えるつもりです。

  1. 一回限りのルールは消す。PID・行番号・一時ファイル名が入ったものは、残しても二度と使いません
  2. どのリポジトリでも使うものはグローバルへ。Bash(git *) や Bash(python *) のように、どこでも許可したいものは ~/.claude/settings.json に1回だけ書きます
  3. リポジトリ固有のものだけを残す。そのリポジトリでしか使わないコマンドを、ワイルドカード付きの形で残します
  4. 接続先が入ったルールは消す。ssh / scp は毎回確認されても困らないので、許可しないことにします

ただし、広すぎる許可ルールには注意が要ります。auto mode では Bash(python *) のような広いルールが無視される場合があることを、auto mode の拒否を集計した記事で書きました。「全部ワイルドカードにすれば解決」とはなりません。

溜めないために

一番効くのは、一回限りのコマンドで「今後は確認しない」を選ばない ことです。

確認が出たときに、次にまた同じ形で打つかどうかを考えます。kill 1751 は二度と打たないので「Yes」(今回だけ許可)で十分です。何度も出るコマンドなら、自分で Bash(gcloud run services describe *) のような汎用の形にしてから足します。

Claude Code には、会話ログを見て読み取り専用のコマンドの許可リストを提案してくれる /fewer-permission-prompts というスキルもあります。溜まったものを消すのではなく、最初からまとまった形で足したいときに使えます。

まとめ

  • 「今後は確認しない」を選ぶたびに、settings.local.json にコマンドがそのまま足される
  • 10リポジトリで879件、うち608件は二度と使わない一回限りのルールだった
  • 接続先の IP や鍵のパスが入ったルールも残っていた
  • 一回限りのコマンドには「今回だけ許可」を使い、繰り返すものだけを汎用の形で足す

参考文献

この記事をシェア

関連する記事

Alexa-hosted スキルのビルドが jest で落ちた件と、ログを直接読めない環境でエラーを集計する方法

Alexa スキル「安眠ノイズ」に Jest のテストを足したら、Alexa-hosted のビルドが失敗するようになりました。原因の切り分けと、テストを lambda/ の外に出した構成、さらに CloudWatch Logs に直接アクセスできない Alexa-hosted で、エラーを Logs Insights で集計できる1行ログにした話をまとめます。

コード進行アプリの楽譜表示を自作した(大譜表・コード名どおりの綴り・転調で調号を変える)

コード進行生成アプリ Chord Eureka の楽譜表示を、html-midi-player(Magenta)の表示から、SVG を直接組み立てる自作の大譜表に置き換えました。E♭m がシャープで書かれる、進行によって音部記号が変わるといった問題をどう直したかと、置き換えるかどうかの判断をまとめます。

コード進行アプリにボイシングのプリセットを10種類足した(Drop 2・シェル・4度堆積など。既定の音は1バイトも変えない)

コード進行生成アプリ Chord Eureka に、Drop 2・シェル・ルートレス・4度堆積などのボイシングを選べる機能を足しました。既定の音を変えて一度戻した経緯、「書かれていない音は足さない」という決まり、各プリセットの組み立て方をまとめます。

Claude に「敵対的レビュー」をさせて、指摘がどれくらい当たっていたかを数えた

個人開発では、Claude Code に「壊れるところを探して」と頼む敵対的レビューを何度も使っています。4つのリポジトリに残っていた再検証の記録から、指摘がどれくらい当たり、どう外れていたかを数えました。外れ方には決まった型がありました。

テーマから探す