[BUG] installed_plugins.json regeneration silently drops URL-based plugins, startup sync cannot recover them

Resolved 💬 1 comment Opened May 18, 2026 by mhanson-github Closed May 22, 2026

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):

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

  1. Have one or more URL-based plugins installed at user scope (source: "url" in marketplace manifest)
  2. 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)
  3. 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
  4. 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)

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗