Plugin loader silently breaks when installed_plugins.json and known_marketplaces.json drift after marketplace refresh

Resolved 💬 2 comments Opened Apr 27, 2026 by msr-hickory Closed May 29, 2026

Summary

Claude Code's plugin auto-refresh can leave installed_plugins.json (installPath) and known_marketplaces.json (installLocation) pointing at different on-disk locations. When this happens, the plugin shows as enabled in enabledPlugins but its skills/commands silently fail to load — no error surfaces in any visible log. The user only notices when a slash command they expect is missing.

I've now hit this twice with compound-engineering@EveryInc, in opposite directions:

  1. 2026-04-22 (rename forward): marketplace went from marketplaces/compound-engineering-plugin/cache/EveryInc/. known_marketplaces.json updated, installed_plugins.json did not.
  2. 2026-04-27 (rename reversed): a fresh clone reappeared at marketplaces/compound-engineering-plugin/ while the registry still pointed at cache/EveryInc/, which was being torn down via .orphaned_at sentinels.

So the drift can occur in either direction — registry ahead of disk, or disk ahead of registry. Both produce the same silent-load failure.

Observed state at time of failure (instance #2)

~/.claude/plugins/known_marketplaces.json:
  EveryInc.installLocation = ".../cache/EveryInc"        # stale — being orphaned

~/.claude/plugins/installed_plugins.json:
  compound-engineering@EveryInc.installPath = ".../cache/EveryInc/plugins/compound-engineering"

On disk:
  ~/.claude/plugins/cache/EveryInc/                      # full of .orphaned_at markers
    .agents/plugins/.orphaned_at
    .claude/commands/.orphaned_at
    docs/brainstorms/.orphaned_at
    ... (17 total)
  ~/.claude/plugins/marketplaces/compound-engineering-plugin/   # fresh clone, no orphans

enabledPlugins.compound-engineering@EveryInc = true in ~/.claude/settings.json the entire time. No log messages. /ce-plan and 30+ other CE skills missing from autocomplete.

Expected behavior

When the refresher updates known_marketplaces.json installLocation, it should atomically update every matching installed_plugins.json installPath entry. Alternatively, the loader should fall back to installLocation when installPath points at a non-existent or orphaned directory, and log a warning.

Reproduction

I cannot reliably reproduce on demand because the trigger is upstream marketplace state changes Claude Code reacts to in the background. But the post-mortem state is unambiguous and the recovery is mechanical: edit both files to point at the freshest non-orphaned clone, restart the IDE, plugin loads.

Environment

  • Claude Code VSCode extension on Windows 11
  • Plugin: compound-engineering@EveryInc (github: EveryInc/compound-engineering-plugin)
  • Plugin SHA 4b5f28da9746aae8f2c5dd715d7029d0ab2758a6 (v3.2.0) at both incidents

Suggested fixes

  1. Atomic update: mutate installed_plugins.json in the same transaction as known_marketplaces.json.
  2. Loader resilience: if installPath is missing or orphaned, fall back to resolving via installLocation and log it.
  3. Surface the failure: emit a user-visible warning when an enabled plugin fails to resolve, instead of silently dropping it.

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗