enabledPlugins in settings.local.json silently ignored unless key also exists in settings.json
Note: This is a re-filing of #26150, which was incorrectly closed as a duplicate of #24657. These are different bugs: - #19893:enabledPluginsexists in both scopes, but local override (true→false) doesn't suppress hook execution - This issue:enabledPluginsexists only insettings.local.json— the key is absent fromsettings.jsonentirely, 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)
- Remove
enabledPluginsfrom~/.claude/settings.jsonentirely - Add
enabledPluginsto~/.claude/settings.local.jsonwith plugins set totrue - Restart Claude Code
/plugin> Installed tab: "No plugins or MCP servers installed"/plugin> Discover tab: "All available plugins are already installed"- Plugin skills/hooks/commands do not load
Case 2: Local overrides user (works)
- Set
enabledPluginsin~/.claude/settings.jsonwith all pluginsfalse - Set
enabledPluginsin~/.claude/settings.local.jsonwith all pluginstrue - Restart Claude Code
/plugin> Installed tab: All plugins shown and enabled- 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
enabledPluginsexclusively insettings.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
enabledPluginsexists insettings.json(even as{}), then local overrides work
Environment
- Claude Code version: 1.0.33+
- Platform: Linux (Ubuntu), also likely affects macOS/Windows
This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗