[BUG] installed_plugins.json regeneration silently drops URL-based plugins, startup sync cannot recover them
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
User-scope URL-based plugins are silently dropped from installed_plugins.json when the file is regenerated (exact trigger unknown — suspected to be marketplace auto-sync or a version migration event). After regeneration, affected plugins show "not cached at (not recorded)" and cannot be fixed via /plugin. This has happened twice in two days.
Plugins that survive regeneration: directory-based sources (./policies, ./velocity) and version:unknown external plugins (linear, playground, gitkraken-hooks).
Plugins that are dropped — all URL-based ("source": "url" in marketplace manifest):
- checkmate@rcrsr → https://github.com/rcrsr/checkmate.git
- snoop@rcrsr → https://github.com/rcrsr/snoop.git
- superpowers@claude-plugins-official → https://github.com/obra/superpowers.git
- sml-toolkit@sml-marketplace → https://github.com/super-mega-lab/toolkit.git
The plugin cache directories for all dropped plugins remain intact. Only the registry entry is missing.
What Should Happen?
URL-based plugins that are enabled in settings.json and have an existing cache directory should be preserved or restored during installed_plugins.json regeneration, rather than being silently dropped.
Error Messages/Logs
Steps to Reproduce
- Have one or more URL-based plugins installed at user scope (source: "url" in marketplace manifest)
- Trigger a installed_plugins.json regeneration (occurs automatically — we observed it happen twice in 2 days, likely tied to marketplace auto-sync or a Claude Code update)
- To reproduce the recovery failure manually: remove a URL-based plugin entry from ~/.claude/plugins/installed_plugins.json while leaving it in enabledPlugins in ~/.claude/settings.json, then start a new session
- Plugin shows "not cached at (not recorded)" — startup sync does not restore it despite cache being present
Claude Model
None
Is this a regression?
Yes, this worked in a previous version
Last Working Version
It worked on May 15th and broke over the weekend.
Claude Code Version
2.1.143 (Claude Code)
Platform
Anthropic API
Operating System
Ubuntu/Debian Linux
Terminal/Shell
VS Code integrated terminal
Additional Information
Forensic evidence: after a regeneration event, stat ~/.claude/plugins/installed_plugins.json shows a fresh birth timestamp, and all surviving entries share the identical installedAt/lastUpdated timestamp — confirming a full rebuild, not an incremental update.
Workaround: manually restore missing entries in installed_plugins.json pointing to the existing cache path (e.g. ~/.claude/plugins/cache/rcrsr/checkmate/2.2.4), or use: claude plugin uninstall <plugin>@<marketplace> --scope user && claude plugin install <plugin>@<marketplace> --scope user
Related: #60292 — same "not cached at (not recorded)" symptom, different root cause (TUI scope mismatch)
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗