[BUG] Project-scoped plugin installs (--scope project) load in CLI sessions but are silently ignored by the VS Code extension
Environment
- Claude Code CLI: v2.1.198 (Windows 11)
- VS Code extension: anthropic.claude-code v2.1.201
- Plugin:
superpowers@claude-plugins-officialv6.1.1 (official Anthropic marketplace)
Steps to reproduce
- From a workspace folder, run:
claude plugin install superpowers@claude-plugins-official --scope project - Observe it succeeds:
"enabledPlugins": {"superpowers@claude-plugins-official": true}is written to the workspace's.claude/settings.json, and~/.claude/plugins/installed_plugins.jsongains a"scope": "project"entry with the correctprojectPath.claude plugin listshows it enabled. - In a terminal CLI session launched from that workspace (e.g.
claude -p "invoke the skill superpowers:using-superpowers"): the plugin's skills ARE registered and invocable. Works as documented. - In a VS Code extension session in that same workspace, after a full VS Code shutdown and restart: the plugin's skills are NOT registered. Namespaced invocation returns
Unknown skill: superpowers:using-superpowers, and nosuperpowers:*entries appear in the available-skills list.
Key evidence that this is plugin-specific, not settings loading
In the same extension session that fails to register the plugin:
- An
envvar added to the same project.claude/settings.jsonfile in the same edit (SUPERPOWERS_DISABLE_TELEMETRY=1) IS applied. So the extension reads and honors the project settings file; it specifically does not honor the plugin enablement. - User-scoped plugins' skills all register normally in the extension session.
- The failure survives a full VS Code shutdown (genuinely new process, verified via the fresh env application above).
Expected
A plugin installed with --scope project behaves the same in every session type launched from that project: CLI and VS Code extension.
Actual
CLI sessions honor the project scope; VS Code extension sessions silently ignore it (no error, no warning; the plugin is just absent).
Why this is distinct from #62174
#62174 (closed as not planned) asked for per-project enabledPlugins as a feature. This report is about an inconsistency between two shipped surfaces: the CLI ships and honors a --scope project install flag today, and the extension ignores its result. Either the extension should honor project-scoped installs, or the CLI should not offer the flag / should warn that extension sessions won't see it. The current state is a silent divergence that costs users a debugging session to discover.
Impact
Any workflow that uses project scoping to keep a plugin's skills out of unrelated projects (the documented purpose of the scope flag) breaks for VS Code extension users with no signal. In our case: a plugin adoption plan built on project isolation had to fall back to "plugin available in terminal sessions only" after tracing the discrepancy.
4 Comments
Having the same issue. Spent hours over the past couple of days trying to get this working. My org's entire plugin distribution model relies on a shared internal plugin marketplace + project-scoped plugins in repos. Any ETA on a fix for this?
I did some extensive testing yesterday on this and it looks like the issue #74912 hit the nail on the head. It's a case-sensitivity check that breaks the plugin cache resolution. Here's what I found:
~/.claude/plugins/installed_plugins.jsonand~/.claude/plugins/known_marketplaces.jsonand replace upper case drive letters with lower case drive letters (e.g. replaceC:withc:) and restart VSCode. Then run/reload-skillsto see that all plugins are loaded. Note: This will work for a while, but eventually it will override the drive letters back to upper case as it updates plugins and marketplaces.Also, as a quick work around, downgrading to
2.1.179for both Claude CLI and VSCode extension works:Downgrade Claude CLI:
Downgrade Claude VSCode Extension:
2.1.179out of the list<img width="634" height="284" alt="Image" src="https://github.com/user-attachments/assets/df33c366-2a4b-47e0-ad7c-f6b898a3f32f" />
Same failure mode on macOS with the desktop app, which I think means the drive-letter case-sensitivity theory from #74912 can't be the whole story.
Environment
1.24012.9(Electron 42.7.0, Node 24.18.0), macOS arm64Setup — one project with plugins enabled at project level.
~/.claude/settings.json(user scope):<project>/.claude/settings.json:<project>/.claude/settings.local.json:~/.claude/plugins/installed_plugins.jsonholds the matching install records with the correctscope(projectformarketing-skills,localforlaravelandimpeccable) and the correctprojectPath.Actual
The desktop app's plugin menu (
+→ Plugin) lists onlymattpocock-skills— the single user-scoped plugin — and shows an identical list in every project I open. Every project-scoped and local-scoped plugin is silently absent, with no error or warning. The CLI launched from the same directory registers all four.Same "it reads the file, just not that key" evidence as the original report: the
permissionsentries from those two project files are applied correctly by the desktop app. OnlyenabledPluginsis dropped.Two details that may help narrow it down
pwdandpwd -Pin the project directory return a string identical to the storedprojectPath— no symlink or firmlink indirection, no case difference, and no drive letters on macOS. So whatever #74912 describes for Windows, there appears to be a second failure path that triggers with exactly-matching paths.scope: "project"andscope: "local"entries equally.installed_plugins.jsonparses as valid JSON and the plugin payloads are correctly present under~/.claude/plugins/cache/, so this is not a cache-miss or a corrupted-config situation on my side.Confirming this on a different plugin, from a non-official marketplace, and on a newer extension build. Same behavior, so it is not specific to
superpowersor to the official marketplace.Environment
claude-plugins-official)Additional data point: the plugin UI itself diverges
The original report covers skill registration. The
/pluginsurface diverges too, and I think it points at the mechanism.~/.claude/plugins/installed_plugins.jsoncontains three"scope": "project"records for the same plugin, each with a differentprojectPath(accumulated over time as it was installed into several workspaces):Opening the same workspace (
project-c) in both surfaces:| | CLI (
/plugin) | VS Code (Manage Plugins) ||---|---|---|
| Entries shown | 1, under a
Projectgroup | 3 identical rows, no scope grouping || State |
✓ enabled| all toggles off || Stale paths | not shown | shown |
Two of those three
projectPathvalues point at directories that no longer exist on disk, and the extension lists them anyway. So the extension does not appear to filterinstalled_plugins.jsonrecords against the current workspace path at all — it flattens the array and renders every record, none of which end up enabled. The CLI, by contrast, resolves the record matching the current project and marks it enabled.Skill-level symptom in the same workspace
The workspace also has fallback slash commands in
.claude/commands/that wrap the plugin's skills, which makes the difference easy to see side by side:/<name>lists both: the project-scoped fallback command and the plugin skill (rendered with the plugin-name prefix and the description from itsSKILL.md).SKILL.mddescriptions.Control group, consistent with the original report: user-level skills in
~/.claude/skills/and built-in skills register normally in the extension in the same session. Only plugin-provided skills are missing.Possibly related
c:\...) whileinstalled_plugins.jsonstores it uppercase (C:\...). I could not confirm whether the comparison is case-sensitive, but if it is, it would explain why zero records match in the extension while the CLI resolves one.