claude plugin update <name> fails with "Plugin not found" for bare plugin names — only name@marketplace works (regression, ~Aug 5)
Environment
- Claude Code CLI 2.1.228 through 2.1.232 (still reproducible on 2.1.232)
- Linux
- Plugin installed at user scope from a single self-hosted git marketplace
Steps to reproduce
$ claude plugin update myplugin
Checking for updates for plugin "myplugin" at user scope…
✘ Failed to update plugin "myplugin": Plugin "myplugin" not found
$ echo $?
1
$ claude plugin update myplugin@mymarket
✔ myplugin is already at the latest version (0.6.13).
$ echo $?
0
(plugin/marketplace names genericized)
The plugin is clearly installed — claude plugin list shows it (enabled, user scope), and installed_plugins.json has the myplugin@mymarket entry.
Expected
The bare name should resolve when it is unambiguous (the plugin exists in exactly one marketplace). claude plugin update --help documents the argument simply as <plugin> and does not mention that a name@marketplace scope is required. (Related docs gap: #31678)
Actual
Bare name always fails with "Plugin not found", which is doubly misleading because plugin list shows the plugin as installed.
Regression evidence
Our plugin ships a SessionStart hook that runs claude plugin update <bare-name> (best-effort auto-update). Local plugin cache timestamps show this worked through Aug 5 (new releases were pulled automatically within hours), then stopped — every release after that was only installed manually with the scoped name. The break coincides with a Claude Code auto-update in the Aug 5 window; we cannot pin the exact CLI version that introduced it (2.1.228 was where we diagnosed it).
Impact
Any hook/script using the documented bare form silently loses auto-update capability. Because the error says "not found" rather than suggesting the scoped form, plugin authors misattribute the failure (we spent days assuming network/permission issues). There is also a bootstrapping problem: a plugin cannot ship a fix for this via its own auto-update hook, since the broken hook cannot pull the fixed version.
Workaround
Use the scoped form name@marketplace everywhere.
Suggestion
Either restore bare-name resolution when unambiguous, or (a) document the scoped requirement in --help and (b) change the error to suggest the scoped form (e.g. Plugin "myplugin" not found — did you mean "myplugin@mymarket"?).
3 Comments
Reproduced on v2.1.233 (macOS).
Steps:
myplugin, version 0.6.13) and add it:claude plugin marketplace add ./mymarketclaude plugin install myplugin@mymarket(succeeds at user scope;claude plugin listshows it enabled)claude plugin update mypluginclaude plugin update myplugin@mymarketObserved:
Expected: the bare name resolves when it is unambiguous (installed from exactly one marketplace), the same way
claude plugin enable myplugin,claude plugin disable myplugin, andclaude plugin uninstall mypluginalready do on the same setup.Assessment: this looks like a genuine bug. The CLI reference (https://code.claude.com/docs/en/plugins-reference#plugin-update) documents the argument for
plugin updateas "Plugin name orplugin-name@marketplace-name", exactly likeenable/disable, butupdateonly ever accepts the scoped form and reports "not found" for a bare name even thoughplugin listshows the plugin installed. On the regression claim: I could not confirm one — the same failure reproduces on 2.1.207 and 2.1.227, soclaude plugin update <bare-name>appears never to have worked from the command line, and whatever was pulling your releases before Aug 5 was most likely the built-in background marketplace auto-update rather than the hook. Either way, the fix is to resolve an unambiguous bare name to its installedname@marketplaceentry (and, on ambiguity or a miss, have the error suggest the scoped form).🤖 Generated with Claude Code
Reproduced on 2.1.233 (Linux) with a minimal setup: a local git marketplace containing a single plugin, installed at user scope.
claude plugin listshows the plugin installed and enabled, and the official CLI reference documents the argument as "Plugin name or plugin-name@marketplace-name" — so the bare form should work when unambiguous, and this is a genuine bug rather than intended behavior.One data point on the timeline: I also ran the same test against older builds (2.1.150, 2.1.205, 2.1.212, 2.1.216, 2.1.220) and the bare name fails identically on all of them — including versions current before your Aug 5 break window. So at least in this single-marketplace configuration, bare-name
plugin updateappears to have been broken for a long time rather than newly regressed; it's possible your auto-update hook stopped working around Aug 5 for a different reason, or that your earlier working setup differed in a way this minimal repro doesn't capture. If you can recall anything that changed around then (marketplace count, install scope, etc.) that would help pin down whether there are two issues here.Either way: reproduced, and the failure mode is confirmed misleading — the error says "not found" for a plugin that
plugin listshows as installed, instead of suggesting the scopedname@marketplaceform.🤖 Generated with Claude Code
Thanks for checking older builds — you're right, and I retract the regression claim on
plugin update. Our own session logs show the hook's bare-name call failing since 2026-07-29 (≈2.1.220), so it never worked; the releases we received before Aug 5 were pulled by the background marketplace auto-update (the marketplace clone's reflog shows unattendedpull origin HEADevery 1–3 days, with the plugin cache populated in the same second, no manual action).That background auto-update stopped after 2026-08-05 15:22 UTC (last unattended pull). Since then no release was picked up in the background; only manual
plugin update name@marketplaceruns. So there may be a second issue here: our marketplace is a third-party git marketplace registered via user-scopeextraKnownMarketplaces(self-hosted HTTPS git, single plugin, user scope, 4 marketplaces total), and today neithersettings.jsonnorknown_marketplaces.jsoncarries anautoUpdatefield — yet background updates were clearly running before Aug 5. Candidates I can see in the changelog for that window: 2.1.228 "marketplace entries now merge as whole entries" and 2.1.232 "startup race that could silently unregister a marketplace (known_marketplaces.json)". Nothing changed on our side (same marketplace count, same scope).Happy to open a separate issue for the auto-update stop if that's cleaner.