Prompt file imported from yotamleo-org/Himmel (
.claude/commands/plugin-eval.md). Copyright stays with the author.
Run exactly one eval suite for one plugin. This is on-demand, billed (HIMMEL-128) — never wired into CI or a cadence, and never run "all suites" in one shot.
Usage: /plugin-eval <plugin> <suite> — both arguments required.
<plugin> is a directory under marketplace/plugins/ (obsidian-triage,
qmd). <suite> is a case directory name under that plugin's evals/
(telegram-clip-basic, read-link-vault-first, collections-scoping).
Reject any other argument shape (missing arg, or a literal all) without
running anything.
Steps:
-
Preflight — usage check and version floor, before anything else.
scripts/plugin-eval-preflight.shwraps both checks (it callsbank-preflight.shdirectly, mirroringscripts/cr/hermes-critic.sh's own direct-call convention, then checksclaude --versionagainst the 2.1.269 floorclaude plugin evalneeds) and never invokesclaude plugin evalitself — this command gates that invocation on its exit code:bash scripts/plugin-eval-preflight.shNon-zero exit → the script has already printed the refusal reason on stderr (usage at/over cap, or the version floor unmet). Report it and stop — never re-run preflight "to confirm", never fall back to running anyway.
-
Resolve the per-suite tool grant and scaffold flag.
claude plugin evalnever stops to ask permission — a gated tool (Bash,Write,Edit,WebFetch,WebSearch) that isn't explicitly granted with--allow-toolsis removed from the run entirely, so the grant IS the permission boundary here (this plugin subcommand has no--permission-modeflag at all — confirmed againstclaude plugin eval --helpon 2.1.269 — so "explicit permission mode" for this command means the narrowest--allow-toolslist each suite actually needs, never a blanket grant, and--trust-pluginonly because the plugin's own code and suite are ours). A case whosecase.yamldeclarescontext.scaffold_scriptalso needs--scaffold— it is not run otherwise (the case then executes against an unseeded workspace and every grader misses) — trust it here for the same reason as--trust-plugin: the script is ours. Pick the grant by<plugin>/<suite>:obsidian-triage/telegram-clip-basic→--allow-tools Bash --scaffold(itsfixture.shseedsvault-fixture/)obsidian-triage/read-link-vault-first→--allow-tools Bash "WebFetch(domain:example.com)"(no--scaffold: its fixture is a committedcontext.add_dirsdirectory, not a script)qmd/collections-scoping→ no--allow-toolsat all (the suite'squerycall hits a mocked MCP tool, which needs no grant; default--mocks recordapplies)
Any
<plugin> <suite>pair outside this list isn't a suite this command knows about — refuse rather than guessing a grant. -
Run. One suite, one invocation,
--trust-plugin(the plugin and its suite are ours) and--no-publish(keep the HTML report local — this is a local on-demand check, not something to publish to claude.ai):# on-demand eval, bank-preflighted, explicit permission mode (HIMMEL-2931) claude plugin eval marketplace/plugins/<plugin> --case <suite> --trust-plugin --no-publish <resolved-grant-and-scaffold-from-step-2>Substitute
<plugin>,<suite>, and the resolved flags from step 2 (drop--allow-toolsentirely forqmd/collections-scoping) — never pass a glob, never omit--caseto run the whole suite tree. -
Report. Print the suite's WITH / W/OUT / Δ line (or WITH-only score when
--ablation noneapplied) and the exit code verbatim. Do not re-run to chase a different number — a bad result is a finding, not a retry loop.
