claude plugin update reports 'at latest' but cache stays stale vs refreshed marketplace (path-based plugins)
Summary
claude plugin update <plugin> reports "already at the latest version" for path-based marketplace plugins even when the cached plugin files are stale relative to the (refreshed) marketplace source. The local marketplace is up-to-date; the cache is not; update does nothing but says success. The only workaround is uninstall + install.
Environment
- Claude Code: native 2.1.150 (commit 28d4819e0f0a)
- OS: Linux x64 (Ubuntu 24.04.4)
- Marketplace:
claude-plugins-official(GitHub:anthropics/claude-plugins-official) - Affected plugins:
skill-creator@claude-plugins-official,mcp-server-dev@claude-plugins-official(both havesource: "./plugins/<name>"in marketplace.json — path-based, no per-plugin SHA pin)
Reproduction
- Install a path-based plugin from the marketplace at time T0:
``bash`
claude plugin install skill-creator@claude-plugins-official
~/.claude/plugins/cache/claude-plugins-official/skill-creator/unknown/
Cache lands at with version: unknown in installed_plugins.json`.
- Some time later (T1), the marketplace's plugin source files are updated upstream. Verify by checking GitHub: there are commits modifying
plugins/skill-creator/skills/skill-creator/SKILL.mdetc.
- Refresh the marketplace locally:
``bash`
claude plugin marketplace update claude-plugins-official
.gcs-sha
advances to the new HEAD. The marketplace cache at ~/.claude/plugins/marketplaces/claude-plugins-official/plugins/skill-creator/` now contains the new files.
- Run plugin update:
``bash`
claude plugin update skill-creator@claude-plugins-official
✔ skill-creator is already at the latest version (unknown).`
**Output:**
- But the cache is actually stale. Diff the plugin cache against the marketplace source for the same plugin:
``bash`
diff -rq \
~/.claude/plugins/cache/claude-plugins-official/skill-creator/unknown/skills/skill-creator/ \
~/.claude/plugins/marketplaces/claude-plugins-official/plugins/skill-creator/skills/skill-creator/
SKILL.md
Returns multiple differing files (e.g., , scripts/improve_description.py, scripts/run_loop.py`).
lastUpdatedininstalled_plugins.jsondoes NOT advance after the (no-op) update.
Expected
claude plugin update for a path-based plugin should detect that the marketplace's source files differ from the cached files (by content hash, mtime, or by re-syncing whenever marketplace sha advances) and re-sync the cache.
Actual
claude plugin update reports success without doing anything. The version comparison appears to skip the check entirely when version: unknown (i.e., no semver in marketplace.json).
Hypothesis
The update logic for marketplace plugins compares version strings. For plugins whose marketplace entry has no version: field (path-based plugins under the same repo), version is "unknown" both before and after update — comparison says "no change" without ever consulting actual file content or marketplace sha.
Workaround
claude plugin uninstall <plugin>@<marketplace>
claude plugin install <plugin>@<marketplace>
This clears the cache and re-installs fresh from the (refreshed) marketplace. Confirmed working:
$ diff -rq cache marketplace
# (after workaround) — no differences for .md/.py/.sh files
Suggested fix
For path-based plugins under a marketplace (source: ./plugins/<name>):
- Store the marketplace
.gcs-sha(or marketplace commit sha) at install time - On
plugin update, if the current.gcs-sha≠ stored, re-sync the cache from marketplace files - Or: when
version == "unknown"in marketplace.json, fall back to file-content hash comparison
Alternatively, add --force flag to claude plugin update to bypass the "no change" check.
Impact
Currently low severity (no functional break — workaround exists and is documented above), but invisible drift: users running plugin update get a false confirmation and miss new guidance in updated SKILL.md files. Two cases I caught locally:
skill-creator/SKILL.mdadded a new "Updating an existing skill" guidance section (preserve original name, copy to/tmpbefore editing) and dropped "extended thinking" wordingmcp-server-dev/build-mcp-server/SKILL.mdadded a new "Load Claude-specific context first" instruction (fetchhttps://claude.com/docs/llms-full.txt) and a new "Phase 6 — Test in Claude and publish" section with review-criteria and submission links
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗