Description
When a plugin is installed from the marketplace at project scope, it becomes impossible to reinstall or promote it to user scope through normal UI/CLI flows. The marketplace treats it as "already installed" based on the cache, but the registration only grants access to the original project.
Steps to Reproduce
- Install a plugin (e.g.,
plugin-dev) from the marketplace with project scope in Project A
- Open a different project (Project B)
- Try to use the plugin — it's not available
- Try to install the same plugin again — marketplace says it's already installed
Expected Behavior
Either:
- The marketplace should allow reinstalling at a different scope (user scope)
- There should be a
claude plugin promote or claude plugin scope command to change scope
- The marketplace install flow should offer "Also install for all projects?" option
Actual Behavior
The plugin files exist in ~/.claude/plugins/cache/ (shared), but installed_plugins.json only has a project-scoped entry:
"plugin-dev@claude-plugins-official": [
{
"scope": "project",
"projectPath": "/Users/user/work/project-a",
"installPath": "~/.claude/plugins/cache/claude-plugins-official/plugin-dev/55b58ec6e564",
"version": "55b58ec6e564"
}
]
The only workaround is manually editing installed_plugins.json to add a "scope": "user" entry and enabling it in settings.json under enabledPlugins.
Root Cause
The "already installed" check appears to be based on cache existence, while actual availability is based on registry scope. These two concepts are conflated, creating a gap where a plugin can be "installed" but not "available".
Environment
- Claude Code on macOS
- Plugin system v2 (
installed_plugins.json version 2)
Description
When a plugin is installed from the marketplace at project scope, it becomes impossible to reinstall or promote it to user scope through normal UI/CLI flows. The marketplace treats it as "already installed" based on the cache, but the registration only grants access to the original project.
Steps to Reproduce
plugin-dev) from the marketplace with project scope in Project AExpected Behavior
Either:
claude plugin promoteorclaude plugin scopecommand to change scopeActual Behavior
The plugin files exist in
~/.claude/plugins/cache/(shared), butinstalled_plugins.jsononly has a project-scoped entry:The only workaround is manually editing
installed_plugins.jsonto add a"scope": "user"entry and enabling it insettings.jsonunderenabledPlugins.Root Cause
The "already installed" check appears to be based on cache existence, while actual availability is based on registry scope. These two concepts are conflated, creating a gap where a plugin can be "installed" but not "available".
Environment
installed_plugins.jsonversion 2)