• v1.6.2 6e685ce1c3

    nntrivi2001 released this 2026-09-15 04:02:49 +00:00 | 212 commits to main since this release

    A retired plugin build no longer downgrades the dashboard

    claude plugin update unpacks 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.json naming a different root, concluded the server had to be replaced, repointed agenthub.service at 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, while installed_plugins.json and the cache both said the new version was installed. An "Update now" from that session succeeded and changed nothing.

    • supersededBy() reads Claude Code's installed_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. --force does not override it: the self-update chain forces from the new directory, which is never superseded, so the only --force refused 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_modules and 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 installPath in installed_plugins.json Claude Code says it is installed.
    The directory agenthub.service names (foreign unit included) A service is executing from it.
    Any directory named in settings.json hooks A 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