備忘的なやつです。
ユーザ設定以外で考える必要が出たので色々実験。
「共有プロジェクト設定 (.claude/settings.json) と ユーザー設定 (~/.claude/settings.json) の 権限ルール(permissions)について書きますが、大体公式docに書いてある。
まとめ
- 設定の優先順位は共有プロジェクト設定 > ユーザー設定
- 権限ルールの優先順位は Deny > (Ask >) Allow
- DenyはDenyでマージされる、プロジェクト側でAllowしても、ユーザー設定でDenyなら拒否される(ユーザ設定はベースライン)
- Claudeはカレントディレクトリの .claude を参照する(親ディレクトリへ遡らない)
基本
このツールはプレフィックスマッチを使用し、正規表現またはglobパターンではありません
ワイルカード:*はパターンの末尾でのみ機能し、任意の継続にマッチします
Bashのみこれ。よく忘れる。
Read & Editルールは両方ともgitignore仕様に従い
他は gitignoreと一緒
/doctor でエラーを潰しておくこと。これがないと権限設定が読み込まれない(全部使える)
優先順位あれこれ
Denyのマージ
- 前提: ユーザ設定で
Bash(ls -a)をdeny, プロジェクト設定でBash(ls -la)をdeny - 操作: プロジェクトで
ls -laとls -a実行 - 結果: どっちも拒否
Denyルールは単純にマージ(和集合)
ユーザのdeny と プロジェクトのallow
- 前提: ユーザ設定で
Bash(ls:*)とdeny, プロジェクト設定でBash(ls -la)をallow - 操作: プロジェクトでlsとls -laを実行
- 結果: どっちも拒否
denyとallowがそれぞれマージ -> deny > allow のルールで 拒否
Claudeはカレントディレクトリの.claudeを参照する
.
├── .claude
└── dirA
.claude/settings.json
{
"permissions": {
"allow": [],
"deny": [ "Bash(ls:*)"]
}
}
dirA で claudeからlsは拒否されない
ln -s ${project_root}/.claude/settings.json
settings.json@ -> ../../.claude/settings.json
dirAからシンボリックリンクを貼ってやると lsは拒否される