[BUG] Plugin marketplace auto-update is silently disabled entirely on non-native (Homebrew/package-manager) installs, regardless of `autoUpdate: true`
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report
- [x] I am using the latest version of Claude Code
What's Wrong?
Plugin marketplace auto-update (the background "Plugin autoupdate" pass that refreshes marketplaces with autoUpdate: true) is gated behind the same kill switch as the binary's own self-updater, with no independent toggle:
function YNe(){return she()&&!ct(process.env.FORCE_AUTOUPDATE_PLUGINS)}
...
function G6l(){return(async()=>{
if(YNe()){C("Plugin autoupdate: skipped (auto-updater disabled)");return}
...
let n=await r4m(); // set of marketplaces with autoUpdate:true
if(n.size===0)return;
...
})()}
she() reflects whether Claude Code's native binary self-update is disabled — which it is, by design, on any package-manager-managed install (Homebrew, apt, etc.), since the package manager owns the upgrade path instead. That's the correct behavior for the binary updater. But because plugin-marketplace autoupdate reuses the exact same flag, it means:
Any Homebrew/apt/non-native install of Claude Code never auto-refreshes plugin marketplaces, period — no matter how correctly autoUpdate: true is set, whether via local settings.json, extraKnownMarketplaces, or org-wide server-managed settings (Admin Settings > Claude Code > Managed settings in the claude.ai console). The only log line produced is a single "Plugin autoupdate: skipped (auto-updater disabled)", and there is no user-facing indication anywhere (docs, /status, claude plugin marketplace list) that this coupling exists.
We only found this by decompiling the installed binary after ~12 days of a marketplace staying stale across multiple releases despite a correctly-configured, server-delivered autoUpdate: true (confirmed present in ~/.claude/remote-settings.json since before the staleness window began).
Why this is easy to hit and hard to diagnose
- Nothing in the server-managed settings docs or settings reference mentions that plugin-marketplace autoupdate depends on the native self-updater being enabled.
claude doctorand/statusgive no indication that plugin autoupdate is being skipped for this reason.- The only escape hatch is an undocumented environment variable,
FORCE_AUTOUPDATE_PLUGINS, discovered only via the binary strings — it isn't listed in the environment variables reference (this appears to be the same gap flagged in the now-closed docs issue #17627, "FORCE_AUTOUPDATE_PLUGINSmissing from Environment Variables reference"). - Any org relying on Homebrew-distributed Claude Code (common for teams that manage their dev tooling via
brew) will have this silently affect 100% of their fleet, with server-managedautoUpdate: truesettings having zero effect.
What Should Happen?
One or more of:
- Decouple plugin-marketplace autoupdate eligibility from the binary self-updater flag entirely — a disabled binary self-updater has no logical bearing on whether a plugin marketplace should refresh.
- At minimum, log a distinguishable reason (e.g.
"Plugin autoupdate: skipped (native self-updater disabled; set FORCE_AUTOUPDATE_PLUGINS=1 to override)") instead of the current generic message, and document theFORCE_AUTOUPDATE_PLUGINSoverride in the environment variables reference. - Surface this state in
/statusorclaude plugin marketplace list --jsonso it's diagnosable without decompiling the binary.
Steps to Reproduce
- Install Claude Code via Homebrew (
brew install --cask claude-codeor equivalent), not the native installer. - Register a git-sourced marketplace with
autoUpdate: true(via localsettings.json'sextraKnownMarketplaces, or via org server-managed settings). - Install a plugin from it.
- Push a new commit to the marketplace remote bumping a plugin's version.
- Fully quit and relaunch Claude Code repeatedly over several days. Do not run
/plugin marketplace updatemanually. - Observe: the marketplace clone never advances,
installed_plugins.jsonstays on the old version, and no log output (even at--debug) indicates why — only the generic "skipped (auto-updater disabled)" line, which doesn't name plugin autoupdate as the affected subsystem in a way that's discoverable without already knowing to look for it. - Confirm the mechanism:
export FORCE_AUTOUPDATE_PLUGINS=1, relaunch — the marketplace now refreshes.
Environment
- Claude Code: 2.1.197
- Install method: Homebrew Cask (
/opt/homebrew/Caskroom/claude-code/2.1.197/claude) - Platform: macOS (Darwin 25.5.0)
- Marketplace source:
github,autoUpdate: truedelivered via org server-managed settings (~/.claude/remote-settings.json)
Related Issues
- #60772 (closed, stale) — same symptom (
autoUpdate: truenot pulling the clone across relaunches), but the reports there didn't identify this root cause. - #84401 (open) — general "plugin autoupdate is silent" observability gaps; complementary but distinct (that reporter is on a native install, so the eligibility gap they hit is different from the one here).
- #17627 (closed, docs) — flagged
FORCE_AUTOUPDATE_PLUGINSas missing from the env var reference; still true today, and now more clearly load-bearing than that issue's framing suggested.
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗