Plugin Uninstall
Remove a plugin from the workspace using DELETE /api/plugins/<slug>. Uninstall is reverse-order via .install-manifest.json.
How to use
Step 1 — Resolve the slug
If not given, call list and ask which one:
from dashboard.backend.sdk_client import evo
plugins = evo.get("/api/plugins")
Validate exists:
detail = evo.get(f"/api/plugins/{slug}")
If HTTP 404, say so and stop.
Step 2 — Show what will be removed
Read manifest from detail. Summarise:
- Files in
.claude/agents/plugin-<slug>-*.md,.claude/skills/plugin-<slug>-*/,.claude/commands/plugin-<slug>-*.md,.claude/rules/plugin-<slug>-*.md - Heartbeats registered by the plugin (disappear from
/heartbeats) - Routines (scheduler SIGHUP reload on removal)
- Claude hook handlers under
plugins/<slug>/claude-hook-handlers/ - Contents of
migrations/uninstall.sql— full text - Contents of
hooks/pre-uninstall.shandhooks/post-uninstall.sh— full text
Important: user data created inside plugin-managed tables is usually DROPped by uninstall SQL. Tell the user explicitly and ask if they want to export first.
Step 3 — Require explicit confirmation
Accept only clear affirmatives. If user hesitates, offer:
- Export first via
GET /api/plugins/<slug>/readonly-data/<query>if declared - Disable instead of remove:
evo.patch(f"/api/plugins/{slug}", {"enabled": False})— reversible, keeps data
Step 4 — Run uninstall
evo.delete(f"/api/plugins/{slug}")
Step 5 — Report
On success, summarise: files removed, tables dropped, hooks cleared. Point to /plugins for confirmation.
Error handling
HTTP 404 not_found— slug doesn't exist. Reprompt.HTTP 409 uninstall_failed— reverse-order chain failed. Surface specific step. Offer manual recovery (deleteplugins/<slug>/after fixing, then retry).HTTP 500 sql_rollback_failed— rare. DB may be inconsistent. CheckADWs/logs/plugins/.
Notes for the agent
- Disable ≠ uninstall. Disable keeps data and is reversible.
- If plugin has routines, scheduler reloads automatically. If offline, user must restart.