原文(日本語に翻訳)
プラグインのallowed-tools frontmatterで${CLAUDE_PLUGIN_ROOT}が置換されず、ツールが誤って承認を要求する問題を修正しました
原文(英語)
Fixed ${CLAUDE_PLUGIN_ROOT} not being substituted in plugin allowed-tools frontmatter, which caused tools to incorrectly require approval
概要
Claude Code v2.1.0で修正された、プラグイン開発時のパス変数展開バグです。以前のバージョンでは、プラグインのスキル定義で${CLAUDE_PLUGIN_ROOT}変数を使用してツールパスを指定しても、この変数が実際のプラグインディレクトリパスに展開されず、パーミッションチェックが正しく動作しませんでした。結果として、プラグインが提供するツールが毎回ユーザー承認を要求していました。この修正により、変数が正しく展開され、プラグインツールがスムーズに動作するようになりました。
修正前の問題
症状
yaml
# プラグインのスキル定義
# ~/.claude/plugins/my-plugin/skills/analyzer.md
---
name: analyzer
allowed-tools:
- ${CLAUDE_PLUGIN_ROOT}/bin/analyze.sh
---
# スキル実行
> /analyzer を実行
# 修正前: 毎回承認を要求される
# ⚠️ Permission required:
# Execute: ${CLAUDE_PLUGIN_ROOT}/bin/analyze.sh
# Allow? (yes/no)
# ユーザーが yes を選択しても、次回また要求される
# ${CLAUDE_PLUGIN_ROOT} が展開されていないため、
# パスが一致せず、常に新しいツールと認識される根本原因
プラグイン構造:
~/.claude/plugins/my-plugin/
├── skills/analyzer.md
└── bin/analyze.sh
allowed-tools frontmatter:
- ${CLAUDE_PLUGIN_ROOT}/bin/analyze.sh
期待される展開:
- /Users/username/.claude/plugins/my-plugin/bin/analyze.sh
実際の動作(修正前):
- ${CLAUDE_PLUGIN_ROOT}/bin/analyze.sh(展開されない)
結果:
- パーミッションキャッシュに一致するエントリがない
- 毎回承認を要求修正後の動作
自動パス展開と承認記憶
yaml
# 同じスキル定義
---
name: analyzer
allowed-tools:
- ${CLAUDE_PLUGIN_ROOT}/bin/analyze.sh
---
# スキル実行(初回)
> /analyzer
# 修正後: 初回のみ承認要求
# ⚠️ Permission required:
# Execute: /Users/username/.claude/plugins/my-plugin/bin/analyze.sh
# Allow? (yes/no)
# yes を選択
# 2回目以降
> /analyzer
# ✓ 承認不要、自動実行
# パスが正しく展開されているため、承認が記憶される実践例
プラグイン固有ツールの自動承認
プラグインが提供するツールが初回承認後、自動的に実行されます。
yaml
# データ分析プラグイン
# ~/.claude/plugins/data-analyzer/skills/analyze.md
---
name: analyze
allowed-tools:
- ${CLAUDE_PLUGIN_ROOT}/scripts/analyze-csv.py
- ${CLAUDE_PLUGIN_ROOT}/scripts/generate-report.py
---
# 初回実行
> /analyze data.csv
# 初回: 2つのツールの承認を要求
# Allow analyze-csv.py? yes
# Allow generate-report.py? yes
# 2回目以降
> /analyze other-data.csv
# 修正後: ✓ 自動実行(承認不要)複数スクリプトを持つプラグイン
プラグイン内の複数のスクリプトすべてが正しく動作します。
yaml
# デプロイプラグイン
# ~/.claude/plugins/deployer/skills/deploy.md
---
name: deploy
allowed-tools:
- ${CLAUDE_PLUGIN_ROOT}/bin/pre-deploy.sh
- ${CLAUDE_PLUGIN_ROOT}/bin/deploy.sh
- ${CLAUDE_PLUGIN_ROOT}/bin/post-deploy.sh
- ${CLAUDE_PLUGIN_ROOT}/bin/rollback.sh
---
# 各スクリプトが初回承認後、記憶される
> /deploy production
# 修正前: 毎回4つのスクリプトの承認を要求
# 修正後: 初回のみ承認、以降は自動実行相対パスとの組み合わせ
プラグインルートからの相対パスが正しく処理されます。
yaml
# テストプラグイン
---
name: test-runner
allowed-tools:
- ${CLAUDE_PLUGIN_ROOT}/runners/jest.sh
- ${CLAUDE_PLUGIN_ROOT}/runners/mocha.sh
- ${CLAUDE_PLUGIN_ROOT}/../shared/validator.sh # 親ディレクトリも可能
---
# すべてのパスが正しく展開される
# 承認が適切に記憶される注意点
- この修正は Claude Code v2.1.0(2026年1月7日リリース)で実装されました
${CLAUDE_PLUGIN_ROOT}変数:- プラグインのルートディレクトリを指す
- 例:
~/.claude/plugins/my-plugin - プラグイン配布時にパスを柔軟に指定可能
- 変数展開のタイミング:
- スキルのロード時に展開
- frontmatterの
allowed-toolsフィールドで使用可能
- サポートされる使用箇所:
- ✅
allowed-toolsフィールド - ✅ プラグインのスキル定義
- ✅ エージェント定義
- ❌ hooks コマンド内(別の方法で処理)
- ✅
- 他の変数との組み合わせ:yaml
allowed-tools: - ${CLAUDE_PLUGIN_ROOT}/bin/tool.sh - ${HOME}/.local/bin/helper.sh # HOME変数も使用可能 - パーミッションキャッシュ:
- 展開後のフルパスがキャッシュに保存される
~/.claude/permissions.jsonに記録- 承認したパスは永続的に記憶される
- プラグイン配布:
${CLAUDE_PLUGIN_ROOT}を使用することで、ポータブルなプラグインを作成可能- ユーザーの環境に依存しない
- デバッグ:
--debugフラグで変数展開のログを確認- ログに「Substituting ${CLAUDE_PLUGIN_ROOT} → /path/to/plugin」が表示される
- トラブルシューティング:
- 修正後も毎回承認を要求される場合:
- パーミッションキャッシュをクリア:bash
rm ~/.claude/permissions.json - Claude Codeを再起動
- 再度承認
- パーミッションキャッシュをクリア:
- 修正後も毎回承認を要求される場合:
- プラグイン構造のベストプラクティス:
~/.claude/plugins/my-plugin/ ├── skills/ │ └── my-skill.md # ${CLAUDE_PLUGIN_ROOT} を使用 ├── bin/ │ └── tool.sh └── lib/ └── helper.sh - 関連する変数:
${CLAUDE_PLUGIN_ROOT}: プラグインルート${HOME}: ユーザーホームディレクトリ${PWD}: 現在のワーキングディレクトリ(一部のコンテキスト)