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

  1. Install any plugin via /plugin install <name>@<marketplace>
  2. Manually delete the plugin directory from ~/.claude/plugins/marketplaces/<marketplace>/plugins/<name>/
  3. Run /reload-plugins4 plugin errors appear
  4. 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:

  1. ~/.claude/plugins/marketplaces/<marketplace>/.claude-plugin/marketplace.json — still lists the plugin
  2. ~/.claude/plugins/installed_plugins.json — still has the install record
  3. ~/.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 false in enabledPlugins

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

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗