You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Only agent-bundle validate --artifact invokes the installed Claude validator (packages/agent-bundle/src/api.ts:593 → validateClaudePlugin). The other two Claude-target paths do not:
agent-bundle build --target claude runs no host validation at all. A bundle that Claude Code will load with a component silently dropped (unknown hook event, unparseable skill frontmatter — both warnings Claude tolerates at load time) builds green unless the author separately runs validate --artifact.
agent-bundle doctor runs only the local pinned-schema check (validateClaudePluginFiles, src/install/doctor.ts → AB7320) and claude --plugin-dir <bundle> plugin list --json (doctor.ts:1284). It never runs claude plugin validate, even though the docs position that command as the pre-publish check (plugins-reference-1.md → CLI commands reference › plugin validate, L1212–1242).
A second, smaller gap in the same inventory code: publicHostInventory (doctor.ts:874-893) records every claude plugin list --json row as state: 'installed' and never reads the row's enabled boolean, so a plugin the user disabled (claude plugin disable) is reported as an installed, current copy. (errors[] is #464.)
Proposed
doctor --host claude: after the pinned-schema pass, run the same validateClaudePlugin (plugin.json + marketplace.json runs, --json on ≥2.1.259, see fix(claude): validate plugin.json and marketplace.json explicitly; read the --json report on 2.1.259+ #474) against the bundle root and the installed cache copy, and surface its AB6019–AB6022 diagnostics in the doctor report. Doctor is read-only; claude plugin validate is offline and read-only.
build --target claude: opt-in --host-validation (or run it when claude is on PATH and print the skip as AB6019 otherwise), so the CI build gate can fail on a Claude finding without a second command.
Read enabled in publicHostInventory and report enabled: false rows as a distinct state (or at least mention it in the entry label).
plugins-reference-1.md → plugin list (L1137–1160): --json rows; --plugin-dir plugins are listed only when the flag precedes the subcommand (which doctor already does at doctor.ts:1284).
plugin-marketplaces-0.md → Validate a plugin or a directory without a manifest › Read the validation results (L1406–1416): frontmatter parse errors and invalid hooks/hooks.json make a session load the plugin without that component.
discover-plugins-0.md → Install plugins (L322–327): claude plugin install from the shell takes effect at the next session start or /reload-plugins.
Problem
Only
agent-bundle validate --artifactinvokes the installed Claude validator (packages/agent-bundle/src/api.ts:593→validateClaudePlugin). The other two Claude-target paths do not:agent-bundle build --target clauderuns no host validation at all. A bundle that Claude Code will load with a component silently dropped (unknown hook event, unparseable skill frontmatter — both warnings Claude tolerates at load time) builds green unless the author separately runsvalidate --artifact.agent-bundle doctorruns only the local pinned-schema check (validateClaudePluginFiles,src/install/doctor.ts→AB7320) andclaude --plugin-dir <bundle> plugin list --json(doctor.ts:1284). It never runsclaude plugin validate, even though the docs position that command as the pre-publish check (plugins-reference-1.md→ CLI commands reference › plugin validate, L1212–1242).A second, smaller gap in the same inventory code:
publicHostInventory(doctor.ts:874-893) records everyclaude plugin list --jsonrow asstate: 'installed'and never reads the row'senabledboolean, so a plugin the user disabled (claude plugin disable) is reported as an installed, current copy. (errors[]is #464.)Proposed
doctor --host claude: after the pinned-schema pass, run the samevalidateClaudePlugin(plugin.json + marketplace.json runs,--jsonon ≥2.1.259, see fix(claude): validate plugin.json and marketplace.json explicitly; read the --json report on 2.1.259+ #474) against the bundle root and the installed cache copy, and surface itsAB6019–AB6022diagnostics in the doctor report. Doctor is read-only;claude plugin validateis offline and read-only.build --target claude: opt-in--host-validation(or run it whenclaudeis on PATH and print the skip asAB6019otherwise), so the CI build gate can fail on a Claude finding without a second command.enabledinpublicHostInventoryand reportenabled: falserows as a distinct state (or at least mention it in theentrylabel).Evidence
plugins-reference-1.md→ plugin validate (L1212–1242): exit codes,--strict,--json(≥2.1.259), report shape.plugins-reference-1.md→ plugin list (L1137–1160):--jsonrows;--plugin-dirplugins are listed only when the flag precedes the subcommand (which doctor already does atdoctor.ts:1284).plugin-marketplaces-0.md→ Validate a plugin or a directory without a manifest › Read the validation results (L1406–1416): frontmatter parse errors and invalidhooks/hooks.jsonmake a session load the plugin without that component.discover-plugins-0.md→ Install plugins (L322–327):claude plugin installfrom the shell takes effect at the next session start or/reload-plugins.Related
claude plugin list --jsonerrors[] is never read, so a plugin Claude refused to load is reported as installed/current #464, Native Claude proofs runclaude plugin validateon the bundle directory, which Claude treats as a marketplace (hooks/skills/agents never checked) #475.