[BUG] Plugin marketplace auto-update is silently disabled entirely on non-native (Homebrew/package-manager) installs, regardless of `autoUpdate: true`

Status Open
Reported on v2.1.197
Maintainer reply None cached
Activity 2 comments · opened Aug 12, 2026

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 doctor and /status give 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_PLUGINS missing 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-managed autoUpdate: true settings 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 the FORCE_AUTOUPDATE_PLUGINS override in the environment variables reference.
  • Surface this state in /status or claude plugin marketplace list --json so it's diagnosable without decompiling the binary.

Steps to Reproduce

  1. Install Claude Code via Homebrew (brew install --cask claude-code or equivalent), not the native installer.
  2. Register a git-sourced marketplace with autoUpdate: true (via local settings.json's extraKnownMarketplaces, or via org server-managed settings).
  3. Install a plugin from it.
  4. Push a new commit to the marketplace remote bumping a plugin's version.
  5. Fully quit and relaunch Claude Code repeatedly over several days. Do not run /plugin marketplace update manually.
  6. Observe: the marketplace clone never advances, installed_plugins.json stays 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.
  7. 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: true delivered via org server-managed settings (~/.claude/remote-settings.json)

Related Issues

  • #60772 (closed, stale) — same symptom (autoUpdate: true not 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_PLUGINS as missing from the env var reference; still true today, and now more clearly load-bearing than that issue's framing suggested.

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗