[BUG] Versionless official plugins (skill-creator, frontend-design) re-trigger "Plugins updated · Run /reload-plugins" banner on every marketplace refresh
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
- Install
skill-creatorand/orfrontend-designfromclaude-plugins-official. - Observe
installed_plugins.jsonrecords"version": "unknown"for them. - Wait for (or trigger) the background marketplace refresh.
- The "Plugins updated: … · Run /reload-plugins to apply" banner appears — every time, regardless of whether anything changed, and
/reload-pluginsnever 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
4 Comments
Confirming this on Windows and Linux as well, so it is not macOS-specific — same Claude Code version (
2.1.216), official marketplace,frontend-designinstalled. The banner asking to run/reload-pluginscomes 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 anyversion— neither inmarketplace.jsonnor in.claude-plugin/plugin.json:So
code-review,plugin-dev,playwright,github,linear,terraformand friends are all in the same permanent force-reinstall loop as soon as a user installs them. (The remaining 206 catalog entries are remotegit/urlsources, which I can't inspect locally — the real number may be higher.)2. Direct proof that nothing actually changed. With
frontend-designinstalled, the marketplace copy and the materialized install are byte-identical, yet an update was still recorded:while
installed_plugins.jsonshows the entry being touched repeatedly long after the original install:Zero content delta,
outcome: "updated"anyway — which matches theversion === "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 emittingversionfields.🤖 Generated with Claude Code
Reproduced on the current release (2.1.233). Confirmed each step:
skill-creatorfrom 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 forfrontend-design;figmais pinned to a commit and unaffected).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
Update: the root cause of this issue lives in the
claude-plugins-officialmarketplace repo, whereskill-creatorandfrontend-designstill ship without aversionfield in bothplugin.jsonand the marketplace entries. I've opened anthropics/claude-plugins-official#6093 declaring1.0.0for both, which is the direct fix for the banner churn described here.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.