-
released this
2026-09-15 04:02:49 +00:00 | 212 commits to main since this releaseA retired plugin build no longer downgrades the dashboard
claude plugin updateunpacks the new version into a new cache directory and prints "Restart to apply changes". A Claude Code process that was already running does not: it keeps loading the OLD directory, hooks and all.Every session such a process opened then ran the OLD bootstrap, which saw a
state.jsonnaming a different root, concluded the server had to be replaced, repointedagenthub.serviceat itself, and restarted the dashboard onto the version you had just upgraded away from. The dashboard reported the old version and offered the update again — once per session, forever, whileinstalled_plugins.jsonand the cache both said the new version was installed. An "Update now" from that session succeeded and changed nothing.supersededBy()reads Claude Code'sinstalled_plugins.json. When a sibling cache directory is the recorded install, the bootstrap logs one line and does nothing else — no dependencies, no unit, no server.--forcedoes not override it: the self-update chain forces from the new directory, which is never superseded, so the only--forcerefused is a deliberate downgrade. It cannot hand over to the new build either (the process it would replace is the one loading it), so the log line says to restart Claude Code.- Matched by sibling directory rather than by the
<plugin>@<marketplace>key — correct without parsing a cache path or trusting a name. An entry pointing at a directory that no longer exists is ignored rather than wedging the bootstrap shut.
The plugin cache now prunes itself
The same updates leave a full copy of the repo —
node_modulesand all — per release. Twelve of them measured 1.7 GB on one machine.pruneRetiredPluginRoots()runs after the bootstrap's state is durable, so a bad prune cannot cost the record of a good bootstrap. Four independent readings of "still in use" are protected, and nothing matching any of them is ever deleted:Protected Why This build It is running. Every installPathininstalled_plugins.jsonClaude Code says it is installed. The directory agenthub.servicenames (foreign unit included)A service is executing from it. Any directory named in settings.jsonhooksA Claude Code process that has not been restarted is still executing from there. Plus the two newest survivors as a rollback cushion, and nothing at all outside
~/.claude/plugins/cache/. Steady state is roughly four directories instead of twelve. Best effort throughout: a directory that will not delete is left alone, never an error.Upgrading
If your dashboard has been reporting an old version and offering the same update repeatedly, quit Claude Code and reopen it once after updating. That is the state this release fixes, and the fix ships in the new build — the stuck old build does not have it. From then on it cannot recur.
No API, schema, or behaviour change to the dashboard itself.
Downloads