[BUG] Versionless official plugins (skill-creator, frontend-design) re-trigger "Plugins updated · Run /reload-plugins" banner on every marketplace refresh

Status Open
Reported on v2.1.216
Maintainer reply ✓ Yes — bcherny
Activity 4 comments · opened Jul 21, 2026
💡 Likely answer: A maintainer (bcherny, collaborator) responded on this thread — see the highlighted reply below.

Environment

  • Claude Code version: 2.1.216 (native installer, macOS arm64, Darwin 25.5.0)
  • Plugins installed from the official marketplace (claude-plugins-official, GCS-synced): figma, skill-creator, frontend-design

Bug

The status banner

Plugins updated: skill-creator and frontend-design · Run /reload-plugins to apply

reappears constantly (on virtually every session where the background marketplace refresh runs), even though nothing about these plugins has actually changed. Running /reload-plugins, restarting, or fully uninstalling/reinstalling the plugins does not stop it.

Root cause

skill-creator and frontend-design are shipped in the official marketplace without a version field in .claude-plugin/plugin.json, and marketplace.json declares no version for them either. As a result they are recorded in installed_plugins.json with:

"version": "unknown",
"installPath": ".../claude-plugins-official/skill-creator/unknown"

In the plugin update op (updatePluginOp / the function reporting plugin_update_op telemetry), the up-to-date short-circuit is explicitly skipped when the resolved version is "unknown":

let B = L === "unknown";
if (!B && (_.version === L || _.installPath === j || _.installPath === G)) {
  return { outcome: "up_to_date", ... };
}
j = await tDt(P, i, L, d, W, { forceOverwrite: B });  // force reinstall
// → outcome: "updated"  ("Plugin refreshed from source ...")

So every time the marketplace autoupdater runs (Orf → Sxa), any versionless plugin is force-reinstalled and reported as outcome: "updated", which feeds the plugin-autoupdate-restart notification ("Plugins updated: … · Run /reload-plugins to apply"). Since the official marketplace refreshes near-daily, the banner is effectively permanent for these two plugins. The telemetry even tracks this case (version_unknown: r.newVersion === "unknown").

Notably this happens even for plugins the user has disabled (frontend-design@claude-plugins-official: false in enabledPlugins) — they still get autoupdated and still trigger the banner.

Steps to reproduce

  1. Install skill-creator and/or frontend-design from claude-plugins-official.
  2. Observe installed_plugins.json records "version": "unknown" for them.
  3. Wait for (or trigger) the background marketplace refresh.
  4. The "Plugins updated: … · Run /reload-plugins to apply" banner appears — every time, regardless of whether anything changed, and /reload-plugins never clears it for good.

Expected behavior

For versionless plugins, the updater should compare content (e.g. the marketplace's synced SHA, a content hash of the plugin directory, or mtime of the plugin subtree) instead of unconditionally force-reinstalling, and only report "updated" when the plugin files actually changed. Alternatively: ship version fields for all official plugins.

Workaround

Disable marketplace autoupdate in ~/.claude/settings.json:

"extraKnownMarketplaces": {
  "claude-plugins-official": {
    "source": { "source": "github", "repo": "anthropics/claude-plugins-official" },
    "autoUpdate": false
  }
}

This stops the banner, at the cost of no auto-updates for any plugin from the official marketplace (e.g. figma).

🤖 Generated with Claude Code

View original on GitHub ↗

4 Comments

REtoolsx · 2 months ago

Confirming this on Windows and Linux as well, so it is not macOS-specific — same Claude Code version (2.1.216), official marketplace, frontend-design installed. The banner asking to run /reload-plugins comes back on essentially every session start on both platforms.

Three additional data points that may help triage:

1. The blast radius is much larger than two plugins. Auditing the bundled (local-source) entries in the official marketplace catalog, 28 of 52 ship without any version — neither in marketplace.json nor in .claude-plugin/plugin.json:

agent-sdk-dev, asana, code-modernization, code-review, commit-commands,
context7, feature-dev, firebase, frontend-design, github, gitlab, greptile,
hookify, laravel-boost, linear, math-olympiad, mcp-server-dev, mcp-tunnels,
playground, playwright, plugin-dev, pr-review-toolkit, project-artifact,
receipts, serena, session-report, skill-creator, terraform

So code-review, plugin-dev, playwright, github, linear, terraform and friends are all in the same permanent force-reinstall loop as soon as a user installs them. (The remaining 206 catalog entries are remote git/url sources, which I can't inspect locally — the real number may be higher.)

2. Direct proof that nothing actually changed. With frontend-design installed, the marketplace copy and the materialized install are byte-identical, yet an update was still recorded:

$ diff -r --exclude='.in_use' \
    ~/.claude/plugins/marketplaces/claude-plugins-official/plugins/frontend-design \
    ~/.claude/plugins/cache/claude-plugins-official/frontend-design/unknown
$ echo $?
0

while installed_plugins.json shows the entry being touched repeatedly long after the original install:

{
  "scope": "user",
  "installPath": ".../cache/claude-plugins-official/frontend-design/unknown",
  "version": "unknown",
  "installedAt": "2026-07-19T20:39:04.413Z",
  "lastUpdated": "2026-07-21T17:28:16.902Z"
}

Zero content delta, outcome: "updated" anyway — which matches the version === "unknown" short-circuit skip described above.

3. The state is self-perpetuating. Because the force-reinstall writes the version back as "unknown" (and the install path is literally .../frontend-design/unknown), the condition that triggers the reinstall is exactly the condition the reinstall reproduces. There is no sequence of /reload-plugins, restart, or reinstall that can ever converge — which is why the workaround has to be disabling autoupdate entirely.

Given #2, a content hash (or reusing the marketplace's already-tracked .gcs-sha) as the comparison key for versionless plugins would fix this without requiring every plugin author to start emitting version fields.

🤖 Generated with Claude Code

bcherny collaborator · 1 month ago

Reproduced on the current release (2.1.233). Confirmed each step:

  • Installing skill-creator from the official marketplace records "version": "unknown" with an install path ending in /unknown — the plugin ships no version field and the marketplace entry declares none (same for frontend-design; figma is pinned to a commit and unaffected).
  • Running a plugin update with no changes at all reports "refreshed from source … Restart to apply changes" every single time — versionless plugins never take the "already at the latest version" path.
  • After a background marketplace refresh, the "Plugin updated: skill-creator · Run /reload-plugins to apply" banner appears in an open session even though nothing about the plugin changed, and reloading can never clear it for good since the recorded version stays "unknown".

Your analysis matches what we see: with no version signal the updater re-copies from source unconditionally and reports it as an update, and since the official marketplace refreshes frequently the banner is effectively permanent for these plugins. Marking as a confirmed bug — the updater should compare content for versionless plugins (and/or the official plugins should ship version fields) so "updated" is only reported when something actually changed. Thanks for the excellent diagnosis and the workaround.

🤖 Generated with Claude Code

sepehrtaji-dev · 1 month ago

Update: the root cause of this issue lives in the claude-plugins-official marketplace repo, where skill-creator and frontend-design still ship without a version field in both plugin.json and the marketplace entries. I've opened anthropics/claude-plugins-official#6093 declaring 1.0.0 for both, which is the direct fix for the banner churn described here.

sepehrtaji-dev · 1 month ago

Follow-up: the marketplace bot auto-closed #6093 since that repository only accepts team-member PRs. The two-line fix (declaring 1.0.0 for both plugins in plugin.json and marketplace.json) remains available on my fork: sepehrtaji-dev/claude-plugins-official:fix/skill-creator-frontend-design-versions — free for the team to apply directly.