enabledPlugins in settings.local.json silently ignored unless key also exists in settings.json

Resolved 💬 4 comments Opened Feb 20, 2026 by kitaekatt Closed Apr 14, 2026
Note: This is a re-filing of #26150, which was incorrectly closed as a duplicate of #24657. These are different bugs: - #19893: enabledPlugins exists in both scopes, but local override (truefalse) doesn't suppress hook execution - This issue: enabledPlugins exists only in settings.local.json — the key is absent from settings.json entirely, causing local values to be silently dropped during merge

Description

enabledPlugins defined in settings.local.json has no effect unless enabledPlugins also exists as a key in settings.json. This contradicts the documented settings merge behavior where local scope settings should apply independently and override broader ones.

The docs state:

Settings are merged, with more specific settings adding to or overriding broader ones.

And explicitly list enabledPlugins as valid in user, project, and local scopes.

For example, a user who enables plugins only in settings.local.json will see the /plugin Marketplaces tab correctly report their marketplace with plugins available (e.g., "11 available"), the Discover tab report "All available plugins are already installed," and the Installed tab report "No plugins or MCP servers installed" — all at the same time. There are no errors — plugins silently fail to load, and the only diagnostic signal is three tabs contradicting each other.

100% Reproduction

Setup: Install any plugin from a marketplace so it appears in installed_plugins.json.

Case 1: Local-only enabledPlugins (fails)

  1. Remove enabledPlugins from ~/.claude/settings.json entirely
  2. Add enabledPlugins to ~/.claude/settings.local.json with plugins set to true
  3. Restart Claude Code
  4. /plugin > Installed tab: "No plugins or MCP servers installed"
  5. /plugin > Discover tab: "All available plugins are already installed"
  6. Plugin skills/hooks/commands do not load

Case 2: Local overrides user (works)

  1. Set enabledPlugins in ~/.claude/settings.json with all plugins false
  2. Set enabledPlugins in ~/.claude/settings.local.json with all plugins true
  3. Restart Claude Code
  4. /plugin > Installed tab: All plugins shown and enabled
  5. Plugin skills/hooks/commands load correctly

Root Cause

The settings merge for enabledPlugins only applies overrides to an existing key. If enabledPlugins is absent from settings.json, the local scope values are silently dropped rather than being introduced into the merged result.

Impact

  • Users who configure enabledPlugins exclusively in settings.local.json (as the docs suggest is valid) get silently broken plugins with no error
  • The Discover and Installed tabs show contradictory information with no diagnostic signal
  • Workaround: ensure enabledPlugins exists in settings.json (even as {}), then local overrides work

Environment

  • Claude Code version: 1.0.33+
  • Platform: Linux (Ubuntu), also likely affects macOS/Windows

View original on GitHub ↗

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