[BUG] Desktop Code tab: enabled ~/.claude plugins never load into sessions — regression 2.1.237 → 2.1.260, still broken in 2.1.270
Summary
In Claude Desktop Code-tab sessions, skills from marketplace plugins installed under ~/.claude are never loaded into the session at all — not merely missing from the / menu. The model's available-skills listing contains personal ~/.claude/skills/ entries and account-level anthropic-skills:* entries, but nothing from the 10 enabled user-scope plugins. Plugin SessionStart hooks do not fire and plugin MCP servers never start.
This is a regression: the same plugins loaded correctly in bundled harness 2.1.237 and broke in 2.1.260. It is still present in 2.1.270.
The terminal CLI reports the plugins as installed and enabled the whole time.
Evidence
1. The app delegates plugin loading to the CLI, and the CLI never loads them
~/Library/Logs/Claude/main.log, on every session spawn:
[CCD] Initialized with version 2.1.270
[CCD] 10 ~/.claude plugin(s) left to the CLI's own loader (not passed as --plugin-dir)
[CCD] Passing 1 plugin(s) to SDK (skills: 1, remote: 0, local: 0)
[CCD] session spawn on required_version:2.1.270:<hash>: 1 plugin(s) go to Claude Code over stdin (initialize request, --await-initialize)
[CCD start-timing] ... plugin_dirs=1 registry_plugins=10 init_plugins=1
registry_plugins=10 but init_plugins=1. The one plugin that loads is the app's own skills plugin. The 10 ~/.claude plugins are explicitly not passed and are expected to be picked up by the CLI's own loader, which does not happen.
Same two lines appear identically on 2.1.260, where the transport differs:
[CCD] session spawn on fallback_version:2.1.260:<hash>: 1 plugin(s) go to Claude Code as --plugin-dir flags (the spawning CLI is not known to be at least 2.1.261)
So the >= 2.1.261 gate only changes the transport for the app's own plugin. It does not affect the 10 delegated ones.
2. Version bisect from session transcripts
Scanning ~/.claude/projects/*/*.jsonl for the injected skill body (superpowers:brainstorming: You MUST use this...) against the version field of each session:
| Date | Bundled harness | Plugin skills injected |
|---|---|---|
| 2026-08-13 | 2.1.222 | yes |
| 2026-08-14 | 2.1.229 | yes |
| 2026-08-24 .. 2026-09-04 | 2.1.237 | yes (10/10 sessions) |
| 2026-09-07 .. 2026-09-14 | 2.1.260 | no (8/8 sessions) |
| 2026-09-14 | 2.1.270 | no |
The cutover matches the app installing 2.1.260 on 2026-09-05.
3. CLI-side state is healthy throughout
$ claude plugin list
superpowers@claude-plugins-official Version: 6.2.0 Scope: user Status: ✔ enabled
oh-my-claudecode@omc Version: 4.11.6 Scope: user Status: ✔ enabled
ponytail@ponytail Version: 4.8.4 Scope: user Status: ✔ enabled
... (10 enabled total)
$ claude plugin details superpowers@claude-plugins-official
Skills (14) brainstorming, systematic-debugging, test-driven-development, ...
Hooks (1) SessionStart
installPath in installed_plugins.json matches an existing directory for every plugin, enabledPlugins in ~/.claude/settings.json is true for all 10, and no plugin contains a .claude/ directory (ruling out #44120).
Uninstalling and reinstalling a plugin does not help — the same two log lines appear afterwards.
Not a duplicate of #91210
In #91210 the plugin and personal skills "load correctly into the session and Claude can invoke them" and only the / menu is wrong. Here the skills are absent from the session itself: the model's skill listing does not contain them, the plugins' SessionStart hooks never run, and their MCP servers never appear in the session's tool list.
Expected
Desktop Code-tab sessions load skills, agents, hooks, and MCP servers from enabled ~/.claude marketplace plugins, as terminal CLI sessions do.
Actual
Only the app's own skills plugin loads (init_plugins=1). All 10 enabled ~/.claude plugins are silently dropped. No error is logged.
Workaround (verified)
Converting each marketplace plugin into a skills-directory plugin restores everything, because ~/.claude/skills/ is still read correctly:
cp -R "$(plugin installPath)" ~/.claude/skills/<plugin-name>
claude plugin uninstall <plugin-name>@<marketplace> # frees the name; an installed plugin takes precedence
After this, claude plugin list reports <plugin-name>@skills-dir ✔ loaded, and a restarted Desktop session receives the skills, agents, hooks, and MCP servers. Note the uninstall is required — a skills-dir plugin whose name matches an installed plugin is refused with:
✘ Not loaded — the name "<x>" is already taken by an installed plugin (<x>@<marketplace>), which takes precedence.
Environment
- Claude Desktop 1.49585.0, macOS (Darwin 25.6.0), Apple Silicon
- Bundled harness: 2.1.270 (broken), 2.1.260 (broken), 2.1.237 (working) under
~/Library/Application Support/Claude/claude-code/ - Terminal CLI (npm) 2.1.241
- 10 enabled user-scope plugins across 4 marketplaces (
claude-plugins-official, plus three third-party) ~/.claude/skills/personal skills load correctly the entire time
Possibly related
#48963, #49042, #86627, #83704, #90927
🤖 Generated with Claude Code