Plugin update command never pulls marketplace clone, always reports 'already at latest'
Description
The /plugin update command (and claude plugin install) determines the "latest available version" by reading marketplace.json from the local marketplace clone at ~/.claude/plugins/marketplaces/{name}/. However, this clone is never git pulled after the initial claude plugin marketplace add. As a result, /plugin always compares the installed cache version against the stale clone and reports "already at the latest version" — even when the remote repository has newer commits and tags.
Reproduction
- Add a marketplace:
claude plugin marketplace add soelinmyat/pm - Install a plugin:
claude plugin install pm@pm(installs e.g. v1.0.15) - Publish a new version upstream (e.g. v1.0.17 — push commits + tags to GitHub)
- Run
/pluginto update
Expected: Claude Code detects v1.0.17 and updates.
Actual: "pm is already at the latest version (1.0.15)."
Root cause
~/.claude/plugins/marketplaces/pm/ ← git clone, stuck at initial commit
~/.claude/plugins/cache/pm/pm/1.0.15/ ← installed copy
Marketplace clone: v1.0.15 (never pulled)
Cache: v1.0.15 (installed from stale marketplace)
GitHub remote: v1.0.17 (32 commits ahead)
Confirmed by inspecting the marketplace clone:
$ cd ~/.claude/plugins/marketplaces/pm
$ git status
On branch main
Your branch is behind 'origin/main' by 32 commits, and can be fast-forwarded.
$ git log --oneline -1
4e04743 Merge pull request #11 ... ← original clone commit
$ git fetch origin && git log --oneline origin/main -1
8221124 Merge pull request #21 ... ← actual latest (v1.0.17)
Suggested fix
Before comparing versions, the plugin update mechanism should git pull --ff-only (or git fetch + reset) the marketplace clone to ensure it reflects the current remote state.
Workaround
Plugin authors can work around this by adding a git pull on the marketplace clone in a SessionStart hook. We've implemented this in our plugin: https://github.com/soelinmyat/pm
Environment
- Claude Code CLI (macOS)
- Darwin 25.3.0
- Marketplace:
soelinmyat/pm
This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗