[BUG] Plugins show as "(installed)" in marketplace but don't appear in Installed tab
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
Plugins from a custom marketplace appear as installed in the marketplace view but do not appear in the Installed tab. The plugin commands and hooks are not available despite state files indicating successful installation.
The marketplace UI shows contradictory information: ✔ my-plugin (installed) · 0 installs
State files (~/.claude/plugins/installed_plugins.json) correctly contain the plugin entries, and the cache directories exist with valid plugin.json files, but the plugin system doesn't recognize them as installed.
What Should Happen?
- Plugins should appear in the Installed tab after installation
- Plugin commands should be available (e.g.,
/my-plugin:command) - Marketplace view should show consistent install state (not "installed" with "0 installs")
Error Messages/Logs
No error messages displayed.
The installation appears to succeed silently but the plugins are not loaded.
Steps to Reproduce
- Add a custom marketplace:
/plugin marketplace add owner/my-marketplace - Install a plugin from the marketplace:
/plugin install my-plugin@my-marketplace - Run
/pluginand check the Installed tab — plugin is not listed - Navigate to the Marketplaces tab and select
my-marketplace - Observe: plugin shows
✔ my-plugin (installed) · 0 installs - Try running a plugin command — command not found
State verification showing the corruption:
# Shows plugin is "installed" in state
cat ~/.claude/plugins/installed_plugins.json | grep my-plugin
# Cache exists with valid plugin.json
ls ~/.claude/plugins/cache/my-marketplace/my-plugin/
cat ~/.claude/plugins/cache/my-marketplace/my-plugin/1.0.0/.claude-plugin/plugin.json
Claude Model
Opus
Is this a regression?
I don't know
Last Working Version
No response
Claude Code Version
2.0.74 (Claude Code)
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
Other
Additional Information
Workaround: Removing state files and cache, then reinstalling:
rm -rf ~/.claude/plugins/cache/my-marketplace
rm ~/.claude/plugins/installed_plugins.json
# Restart Claude Code and reinstall
Relevant state files:
-
~/.claude/plugins/installed_plugins.json— contains plugin entries -
~/.claude/plugins/known_marketplaces.json— marketplace is registered -
~/.claude/plugins/cache/my-marketplace/— plugin files exist -
~/.claude/settings.json—enabledPluginsis empty{}
The disconnect appears to be between the installation state recorded in installed_plugins.json and what the plugin loader actually recognizes/loads.
Found 3 possible duplicate issues:
- https://github.com/anthropics/claude-code/issues/14202
- https://github.com/anthropics/claude-code/issues/13509
- https://github.com/anthropics/claude-code/issues/14689
This issue will be automatically closed as a duplicate in 3 days.
- If your issue is a duplicate, please close it and 👍 the existing issue instead
- To prevent auto-closure, add a comment or 👎 this comment
🤖 Generated with Claude Code
Found 3 possible duplicate issues:
- Bug: Project-scoped plugins incorrectly detected as installed globally #14202
- [BUG] #13509
- [Bug] Plugin not visible to Claude despite being visible with /plugins command with --plugin-dir flag #14689
This issue will be automatically closed as a duplicate in 3 days.
- If your issue is a duplicate, please close it and 👍 the existing issue instead
- To prevent auto-closure, add a comment or 👎 this comment
🤖 Generated with Claude Code
[BUG] #13509 is close, but that seems to be limited to local marketplaces, and may be subtly different in other ways. This happened with a marketplace installed from a Github repo.
I'm running into the same issue as well, have you figured out any work arounds?
As side solution I have a project that will allow you to enable installed plugins in other local directories and also track plugins from one place: https://github.com/kaldown/ccpm
Running to the same issue with superpowers@superpowers-marketplace and dev-browser@sawyerhood/dev-browser (they suddenly disappeared from the plugin installed view - although cc says they are installed). In some cases plugin appear in the marketplace view but installation is not working.
Experiencing similar issues with custom marketplace plugins. Can confirm the state file disconnect - installed_plugins.json shows the plugin but the system doesn't load it.
Workaround we're trying: Use a prompt-based SessionStart hook that tells Claude where to find plugins directly.
We're building claude-1337 - a plugin marketplace that attempts to sidestep this issue using a SessionStart hook:
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "prompt",
"prompt": "To find available plugins:\n1. Read `~/.claude/plugins/known_marketplaces.json` → get `installLocation`\n2. Read `{installLocation}/.claude-plugin/marketplace.json`\n3. Plugin content at `{installLocation}/plugins/<name>/`"
}
]
}
]
}
}
The idea is to bypass the loader entirely - Claude reads the marketplace files directly at session start instead of relying on the plugin system to recognize what's installed. Will share updates on how well this works.
Root cause hypothesis: The plugin loader and state file have different definitions of "installed". State file records intent, loader checks something else (timestamps? git SHAs? version comparisons?) that gets out of sync.
Update: type: prompt hooks don't fire. Switched to type: command with a shell script that echoes the prompt content — that works.
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/session-start.sh"
}
]
}
]
}
}
Where session-start.sh just echoes the instructions:
#!/bin/bash
cat << 'PROMPT'
To find available plugins:
1. Read ~/.claude/plugins/known_marketplaces.json
2. Read {installLocation}/.claude-plugin/marketplace.json
3. Plugin content at {installLocation}/plugins/<name>/
PROMPT
So there may be two separate bugs here:
- Plugin loader not recognizing installed plugins (this issue)
-
type: prompthooks not firing (possibly related?)
Oh nice to know there is a hook for session start!
Update: Workaround confirmed working.
SessionStart hook with type: command (not type: prompt) successfully injects context at session start.
Example: https://github.com/yzavyas/claude-1337/blob/main/plugins/core-1337/hooks/session-start.sh
Update: Workaround confirmed working.
SessionStart hook with
type: command(nottype: prompt) successfully injects context at session start.Example: https://github.com/yzavyas/claude-1337/blob/main/plugins/core-1337/hooks/session-start.sh
That's not very secure to install plugins by shell script. Context if it could change after some time, leaving to vulnerability exposure. Please consider creating plugin following the Claude code conduct
Adding another data point on Arch Linux.
Environment:
- OS: Arch Linux
- Claude Code: latest
Exact symptom: Same plugin installed and working in one Claude Code session, but in a second concurrent session:
❯ /plugin marketplace add obra/superpowers-marketplace
⎿ Error: Marketplace 'superpowers-marketplace' is already installed.
❯ /plugin install superpowers@superpowers-marketplace
⎿ Plugin 'superpowers@superpowers-marketplace' is already installed.
❯ /plugin → Installed tab
⎿ No plugins or MCP servers installed.
❯ /superpowers:[TAB]
⎿ (no autocompletion, commands not recognized)
The plugin is marked as installed in state files but the plugin loader doesn't recognize it for loading in the second session. Cannot apply the workaround (rm state files) because the first session has the plugin "in use."
This appears related to #14202 - the underlying issue seems to be that plugin installation state is global but plugin loading is per-session, without proper synchronization between them.
This is fixed , validated with 1 enterprise ghec private marketplace and with 1 public gh marketplace. fyi.
I just ran into this issue, exactly as described at the top of this issue thread (showing installed but with 0 installations, and no assets are usable), so it is not resolved (at least not in all cases). MacOS, v2.1.19.
Also seeing this bug.
Bug Report:
- Issue: /plugin install reports plugin as "already installed" when it's not actually installed for the current project
- Steps to reproduce: a. Install a scoped plugin for one project b. Switch to a different project directory c. Try to install the same plugin d. CLI incorrectly reports: "Plugin xxx is already installed"
- Expected behavior: Plugin should be installed for the new project
- Actual behavior: Plugin is not installed and cannot be used, but CLI prevents installation
- Workaround attempted: Removed installed_plugins.json, plugin cache, and marketplace directory - issue persists
The CLI appears to be checking marketplace presence rather than actual installation state for the current project
@htxryan I am not using apple (using Linux) however if you find workaround https://github.com/shibuido/claude-plugin-install (or https://gist.github.com/gwpl/cd6dcd899ca0acce1b4a1bc486d56a9e ) working for you please give a heads up that works also on MacOS, or if you find way to patch it to also work on MacOS , PRs are welcome or github issues with enough detail for my AI/LLM to make a patch for MacOS without having one. Otherwise, I hope issue will be fixed upstream soon so we don't have to use workarounds.