原文(日本語に翻訳)
グローバルオプション後のサブコマンドを正しく識別するようBashコマンドプレフィックス抽出を修正しました(例: git -C /path log が Bash(git log:*) ルールに正しくマッチするように)
原文(英語)
Fixed bash command prefix extraction to correctly identify subcommands after global options (e.g., git -C /path log now correctly matches Bash(git log:*) rules)
概要
Claude Code v2.1.0で修正された、パーミッションルールマッチングバグです。以前のバージョンでは、gitやdockerなどのグローバルオプション(-C, --configなど)をサブコマンドの前に指定すると、パーミッションルールのサブコマンド識別が正しく動作せず、事前に承認したコマンドでも再度承認を要求されていました。この修正により、グローバルオプションをスキップしてサブコマンドを正しく抽出し、パーミッションルールが適切にマッチするようになりました。
修正前の問題
症状
bash
# settings.jsonでgit logを事前承認
{
"permissions": {
"allowed": ["Bash(git log:*)"]
}
}
# 通常のgit logコマンド
> git log --oneline
# ✓ 承認済み、自動実行
# グローバルオプション付きgit log
> git -C /path/to/repo log --oneline
# 修正前: 再度承認を要求
# ⚠️ Permission required: Execute "git -C /path/to/repo log --oneline"
# Allow? (yes/no)
# 理由: サブコマンド "log" が識別されず、ルールにマッチしない影響を受けるコマンド
bash
# git -C (change directory)
git -C /path log # "log" が識別されない
# git --git-dir (リポジトリ指定)
git --git-dir=/path/.git status # "status" が識別されない
# docker --config (設定ファイル指定)
docker --config ~/.docker ps # "ps" が識別されない
# npm --prefix (プロジェクトディレクトリ指定)
npm --prefix /path test # "test" が識別されない修正後の動作
正しいサブコマンド識別
bash
# settings.jsonで事前承認
{
"permissions": {
"allowed": ["Bash(git log:*)"]
}
}
# グローバルオプション付きコマンド
> git -C /path/to/repo log --oneline
# 修正後:
# 1. "git -C /path/to/repo" → グローバルオプションと認識
# 2. "log" → サブコマンドとして識別
# 3. "Bash(git log:*)" ルールにマッチ
# ✓ 自動実行(承認不要)
> git --git-dir=/repo/.git log --graph
# ✓ 同様に "log" が識別され、自動実行実践例
Gitマルチリポジトリ管理
複数のリポジトリで同じgitコマンドを使用します。
bash
# settings.json
{
"permissions": {
"allowed": [
"Bash(git log:*)",
"Bash(git status:*)"
]
}
}
# 異なるリポジトリでgit log
> git -C ~/projects/repo1 log --oneline
# ✓ 自動実行
> git -C ~/projects/repo2 log --graph
# ✓ 自動実行
# git status も同様
> git --git-dir=/var/repos/repo3/.git status
# ✓ 自動実行Dockerコンテナ管理
異なる設定ファイルでdockerコマンドを使用します。
bash
# settings.json
{
"permissions": {
"allowed": ["Bash(docker ps:*)"]
}
}
# 異なる設定でdocker ps
> docker --config ~/.docker-dev ps
# 修正後: ✓ "ps" が識別され、自動実行
> docker --config ~/.docker-prod ps -a
# ✓ 同様に自動実行NPMプロジェクト管理
異なるプロジェクトディレクトリでnpmコマンドを実行します。
bash
# settings.json
{
"permissions": {
"allowed": ["Bash(npm test:*)"]
}
}
# 異なるプロジェクトでnpm test
> npm --prefix /path/to/project1 test
# ✓ "test" が識別され、自動実行
> npm --prefix /path/to/project2 test --coverage
# ✓ 自動実行Kubectlコンテキスト切り替え
異なるクラスターでkubectlコマンドを使用します。
bash
# settings.json
{
"permissions": {
"allowed": ["Bash(kubectl get:*)"]
}
}
# 異なるコンテキストで実行
> kubectl --context=dev-cluster get pods
# ✓ "get" が識別され、自動実行
> kubectl --context=prod-cluster get services
# ✓ 自動実行注意点
- この修正は Claude Code v2.1.0(2026年1月7日リリース)で実装されました
- グローバルオプション:
- コマンド全体に影響するオプション
- サブコマンドの前に指定
- 例:
git -C <path>,docker --config <path>,npm --prefix <path>
- サブコマンド:
- メインコマンドの特定の機能を実行
- 例:
git log,docker ps,npm test
- サポートされるコマンドとグローバルオプション:
- git:
-C,--git-dir,--work-tree,-c - docker:
--config,--context,--host - kubectl:
--context,--namespace,--kubeconfig - npm:
--prefix,--global - その他の一般的なCLIツール
- git:
- パーミッションルールの構文:json
{ "allowed": [ "Bash(git log:*)", // git log とそのすべてのオプション "Bash(docker ps:*)", // docker ps とそのすべてのオプション "Bash(npm test:*)" // npm test とそのすべてのオプション ] } - 修正の詳細:
- コマンドプレフィックス抽出アルゴリズムの改善
- グローバルオプションとその引数を認識してスキップ
- 最初の非オプション引数をサブコマンドとして識別
- 複数のグローバルオプション:bash
git -C /path --git-dir=/repo/.git log # "log" が正しく識別される - デバッグ:
--debugフラグでサブコマンド抽出のログを確認- ログに「Extracted subcommand: log from git -C /path log」が表示される
- パフォーマンスへの影響:
- サブコマンド抽出ロジックがわずかに複雑化
- 実行時のパフォーマンスは変わらず
- 関連する改善:
- index 20: ワイルドカードパターンマッチング
- より柔軟なパーミッションルールが可能に
- トラブルシューティング:
- グローバルオプション付きコマンドが承認を要求する場合:
- パーミッションルールを確認
- サブコマンドが正しく指定されているか確認
--debugでサブコマンド抽出を確認
- グローバルオプション付きコマンドが承認を要求する場合: