Bug: No proper plugin uninstall path — manual file surgery required to remove plugins
Resolved 💬 3 comments Opened Mar 25, 2026 by debop Closed Mar 29, 2026
Summary
There is no reliable way to fully uninstall a plugin. Deleting the plugin directory leaves broken references in marketplace.json, installed_plugins.json, and the cache, causing persistent /doctor errors after every /reload-plugins.
Steps to Reproduce
- Install any plugin via
/plugin install <name>@<marketplace> - Manually delete the plugin directory from
~/.claude/plugins/marketplaces/<marketplace>/plugins/<name>/ - Run
/reload-plugins→ 4 plugin errors appear - Run
/doctor→ errors still reference the deleted plugin paths
Root Cause
Plugin metadata is stored in three separate places, and deleting only the plugin directory leaves the other two intact:
~/.claude/plugins/marketplaces/<marketplace>/.claude-plugin/marketplace.json— still lists the plugin~/.claude/plugins/installed_plugins.json— still has the install record~/.claude/plugins/cache/<marketplace>/<plugin>/— cache remains
Claude Code validates all plugins listed in marketplace.json on load, even if they're marked as false in settings.local.json (enabledPlugins). This means disabling a plugin does NOT suppress the path validation error.
Expected Behavior
Either:
- A
/plugin uninstall <name>command that atomically removes all three references, OR - Plugin path validation should be skipped for plugins marked
falseinenabledPlugins
Workaround (3 manual steps required)
# 1. Remove plugin directory
rm -rf ~/.claude/plugins/marketplaces/<marketplace>/plugins/<name>
rm -rf ~/.claude/plugins/cache/<marketplace>/<name>
# 2. Remove from installed_plugins.json
python3 -c "
import json; path='~/.claude/plugins/installed_plugins.json'
d=json.load(open(path)); del d['plugins']['<name>@<marketplace>']
json.dump(d, open(path,'w'), indent=2)"
# 3. Remove from marketplace.json
python3 -c "
import json; path='~/.claude/plugins/marketplaces/<marketplace>/.claude-plugin/marketplace.json'
d=json.load(open(path))
d['plugins']=[p for p in d['plugins'] if p.get('name')!='<name>']
json.dump(d, open(path,'w'), indent=2)"
Environment
- Claude Code 2.1.83 (native)
- macOS Darwin 25.3.0
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗