Claude Media
claude plugin evalを名前指定して失敗する原因と対処

claude plugin evalを名前指定して失敗する原因と対処

ローカルパスで追加したマーケットプレイスのプラグインを名前で評価すると、cannot be evaluated where sessions load itでexit 1になります。切り分けと ./<dir> での回避を解説します。

claude plugin eval formatter@my-marketplace のように名前で評価したとき、次のエラーで止まることがあります。

Error: formatter@my-marketplace cannot be evaluated where sessions load it: no session could load it now. Its marketplace is a folder whose catalog could not be read, or lists it no more. Check the marketplace with `claude plugin marketplace list`, or pass ./<dir> to evaluate a directory.

これは評価スイートの不具合ではありません。ローカルのフォルダとして追加したマーケットプレイスが、いまのセッションからプラグインを引けない状態になっているという知らせです。終了コードは1。直し方は2通りあります。マーケットプレイス側を直すか、プラグインのディレクトリを直接指定するかです。

このエラーが出る条件

出るのは、フォルダとして追加したマーケットプレイスのプラグインを、シェルから名前で指定したときです。GitHubやURLから追加したマーケットプレイスの話ではありません。

claude plugin eval の対象指定は、次のように分かれます。

指定何が評価されるか
. や ./plugins/formatter何が評価されるかそのディレクトリのプラグイン。評価ケースもそこから読む
prompt.md / case.yaml何が評価されるかそのケース1つ。含まれるプラグインを読み込む
name / name@marketplace何が評価されるかインストール済みのプラグイン。ケースは元の場所かインストール済みコピーから読む
name@skills-dir何が評価されるかskills-directoryプラグイン

エラーになるのは、表の3行目のうち、そのマーケットプレイスがローカルパス登録のものです。./<dir> で渡す形なら、マーケットプレイスの状態に関係なく評価できます。

なぜローカルパス登録だけ引っかかるのか

プラグインは、出どころによって「その場で読み込む」ものと「キャッシュにコピーして読み込む」ものに分かれます。

くらべる

プラグインの読み込み方は出どころで決まる

in place

その場で読み込む

ローカルパスで追加したマーケットプレイスの、相対パス指定のプラグイン。--plugin-dir のディレクトリも同じです。編集は次のセッション開始か /reload-plugins で反映され、バージョンを上げる必要はありません。

cache

コピーして読み込む

それ以外のマーケットプレイスのプラグイン。インストール時に cache/<marketplace>/<plugin>/<version>/ へコピーされ、そのコピーが読まれます。

ローカルパス登録のマーケットプレイスは、~/.claude/plugins/ に複製が作られません。known_marketplaces.json の installLocation が、あなたが渡したパスそのものになります。つまりフォルダを動かしたり消したりすると、カタログごと消えます。

名前指定の評価は「いまセッションを開いたら、そのプラグインが読み込まれるか」を前提にします。読み込み元のフォルダやカタログが壊れていれば、評価の側が先に止まる、という作りです。メッセージの where sessions load it はこの意味です。

何が壊れているかの見分け方

メッセージには no session could load it now. の後に、失敗した中身が書かれています。示されるのは大きく2つです。

  • カタログ(marketplace.json)が読めない
  • カタログは読めるが、そのプラグインの項目がもう載っていない

まずシェルで登録状況を見ます。

claude plugin marketplace list

一覧に出る名前と、評価で指定した @my-marketplace の部分が一致しているかを確かめます。綴りが違えば、評価の指定ミスです。一覧に出ていて名前も合うなら、フォルダの中身を疑います。

症状直し方
登録したフォルダが移動・削除された直し方フォルダを元に戻すか、マーケットプレイスを削除して新しい場所から追加し直す
カタログにプラグインの項目が無い直し方marketplace.json に項目を戻す
項目の相対パスの先にディレクトリが無い直し方source のパスを直すか、フォルダを復元する

ディスクとErrorsタブで壊れた箇所を探す

marketplace list の結果だけでは、どのパスが壊れているかまでは分かりません。ローカルパス登録のマーケットプレイスには、~/.claude/plugins/marketplaces/<name>/ に複製が作られません。実体は、追加したときに渡したパスそのものです。そのパスは ~/.claude/plugins/known_marketplaces.json の installLocation に書かれています(CLAUDE_CODE_PLUGIN_CACHE_DIR を設定している場合は、プラグインのルートがそちらに移ります)。

grep -A6 '"my-marketplace"' ~/.claude/plugins/known_marketplaces.json
ls <installLocation の値>/.claude-plugin/marketplace.json

1行目で installLocation の値を読み、2行目でそのパスにカタログが実在するかを確かめます。ファイルが無ければ、フォルダの移動か削除です。ファイルがあるのに止まるなら、marketplace.json のJSONが壊れているか、評価したいプラグインの項目が消えています。

同じ内容は、セッションの /plugin にあるErrorsタブにも出ます。症状ごとの見え方は次のとおりです。

  • Marketplace directory not found at path: <path> は、マーケットプレイス自体のフォルダが無い状態です。ローカルパスで追加したあとにフォルダが動いたか消えたときに出ます。直し方は、フォルダを戻すか、マーケットプレイスを削除して新しい場所から追加し直すことです
  • Plugin directory not found at path: <path> は、カタログが ./plugins/my-plugin のような相対パスで載せているプラグインのフォルダが、マーケットプレイスの中に無い状態です。マーケットプレイスの管理者なら、項目の source のパスを直すかフォルダを戻します。他人のマーケットプレイスなら、メッセージを持ち主に伝えます
  • Plugin "<name>" not cached at <path> は、インストール記録はあるのに、記録が指すキャッシュのディレクトリが無い状態です。キャッシュを消した直後に出ます。claude plugin install <name>@<marketplace> で入れ直し、/reload-plugins で反映します

3つ目は、コピーして読み込む側のプラグインの症状です。ローカルパス登録のプラグインでは、まず上の2つを疑います。

ネットワークドライブ上のフォルダを登録していた場合や、パスに . や .. が含まれていた場合は、Marketplace "<name>" is added but ignored として無視されることもあります。この場合は remove してから、このコンピューター内のコピーを指定して追加し直します。ネットワーク上の場所を使い続けたいときは、ユーザー設定か管理設定の extraKnownMarketplaces に宣言します。リポジトリの .claude/settings.json に書いた宣言は数えられません。

評価コマンドのエラーだけで見当がつかないときは、この3か所(known_marketplaces.json、カタログのパス、Errorsタブ)を順に当たると、壊れた層を絞れます。

フォルダを移したときの再登録は、次の形です。

claude plugin marketplace remove my-marketplace
claude plugin marketplace add ./path/to/my-marketplace
claude plugin eval formatter@my-marketplace

remove はそのマーケットプレイスから入れたプラグインもアンインストールします。入れ直しが要る点は覚えておいてください。

マーケットプレイスを通さず ./<dir> で評価する

カタログの修理を後回しにしたいときや、そもそも評価したいのがソースの状態だけのときは、ディレクトリを渡します。

claude plugin eval ./plugins/formatter

この形では、プラグインのルートの evals/ にあるケースがそのまま走ります。結果は既定で <eval dir>/results/<timestamp>/ の下に出ます。名前指定のほうは、実行時のカレントディレクトリの ./evals/results/ に出ます。--eval-dir を使う場合はどちらも ./<dir>/results/ です。出力先が変わるので、CIの成果物パスは指定方法に合わせて見直します。

もう1つ違うのが、信頼プロンプトです。

  • パスで指定したディレクトリは、初回に Trust this plugin directory? と聞かれる
  • 名前で指定したインストール済みプラグインやskills-directoryプラグインは、このプロンプトを飛ばす
  • 端末でない環境や --json 付きでは聞けず、exit 1で拒否される

名前指定から ./<dir> に切り替えると、CIでは新しく信頼の問題が出ます。--trust-plugin を付けるか、事前に端末で一度承認します。自分のマシンで動かしてよいプラグインにだけ使うのが前提です。

claude plugin eval ./plugins/formatter \
  --trust-plugin \
  --json results.json

--json は対象指定の後ろに置きます。前に置くと、対象がファイルパスとして読まれて --json output path must end in .json になります。CIでの結果の読み方はclaude plugin evalをCIの合否に使うで扱っています。

同じexit 1でも原因が違うもの

claude plugin eval がexit 1で終わる理由は多く、メッセージを読まないと取り違えます。近い場面で出るものを並べます。

メッセージ意味手当て
cannot be evaluated where sessions load it意味名前指定のプラグインを、いまのセッションが読み込めない手当てマーケットプレイスを直す、または ./<dir>
is not a trusted plugin directory, and this run cannot stop to ask you about it意味初めてのディレクトリで、対話できない手当て端末で一度実行して承認、または --trust-plugin
is too old for claude plugin eval意味gitが2.31未満手当てgitを2.31以上にする
No eval cases found意味ケースが無い、またはフィルタに合わない手当てプラグインルートで実行する、--case / --tag を見直す

最後の No eval cases found は、./<dir> に切り替えた直後に出やすいエラーです。プラグインのルートではなく、1つ上や1つ下を渡すと、evals/ が見つかりません。ケースの置き方はclaude plugin evalとはにまとめています。

実行環境の前提条件を確かめる

名前指定でも ./<dir> でも、claude plugin eval が動く前提は同じです。ここを満たしていないと、評価ケースを1つも走らせずに止まります。

  • Claude Codeがv2.1.269以降であること。claude --version で確かめ、古ければ claude update で上げます
  • gitが入っているなら2.31以上であること。git --version で確かめます。gitが入っていない環境では、そのまま動きます
  • 評価するディレクトリに plugin.json か .claude-plugin/plugin.json があること。skills-directoryプラグインでも構いません
  • 普段のセッションと同じ認証とモデルプロバイダーが使えること

最後の項目は、費用にも関わります。評価ランもjudge型の採点も実際のモデル呼び出しなので、利用枠かAPI料金を消費します。Bedrockなどのクラウド経由で使っているなら、普段のセッションと同じプロバイダー用の環境変数をexportしたシェルから実行します。評価ランはそのシェルの環境変数を引き継ぐためです。

claude --version
git --version

gitの古さは、前の節の表にある is too old for claude plugin eval で表に出ます。実行のたびに、リポジトリのgit設定が起動しうるフックや認証ヘルパーを止める必要があり、その設定を読むのがgit 2.31からだからです。古いgitでは止められないため、スイートごと実行を拒否します。このチェックが入ったのはv2.1.283からで、それ以前は古いgitでもフックが有効なまま走っていました。CIのベースイメージが古いディストリビューションだと、ここで引っかかりやすくなります。

評価ランの中は本番のセッションと違う

名前指定でも ./<dir> でも、評価ランの中は本番のセッションと同じ環境ではありません。ユーザー設定、他のプラグイン、CLAUDE.md、メモリは読み込まれず、評価対象のプラグインだけが入ります。ローカルのマーケットプレイスで動いていたのに評価では動かない、という差は、多くがここから来ます。評価に必要なスキルやフックは、プラグイン自体に同梱しておきます。

プラグインのマーケットプレイスを自分で配る側の設計は、URLで配る落とし穴や必須化と自動更新の設定で別に扱っています。評価からサブエージェントを外したい場合は--disallow-toolsが使えます。

まとめ

名前指定の評価が止まるのは、ローカルパス登録のマーケットプレイスが、フォルダ移動やカタログ破損でプラグインを引けなくなったときです。claude plugin marketplace list で登録状況を見て、直せるなら直します。急ぐなら ./<dir> で評価します。そのときは信頼プロンプトと結果の出力先が変わる点だけ、CIの設定に反映してください。

この記事を共有:XはてブLinkedIn