Remove a plugin's artifacts
Three different removals live here, and they are not equally reversible. Establish which one is being asked for before deleting anything.
| Ask | What it removes | Reversible by |
|---|---|---|
| clean the build output | derived vendor manifests | plugin build |
| drop a vendor | one vendor's manifest, and its declaration | re-adding the vendor, then plugin build |
| remove the plugin | the canonical manifest and every component | nothing — confirm first |
Clean the build output
Derived manifests are build artifacts. The build removes and rewrites them itself:
npx universal-plugin plugin build --clean
--clean deletes exactly what the manifest declares and nothing it does not, which is why it is the
supported route. To remove a derived manifest without rebuilding, delete that one path with the
user's own file tooling — .claude-plugin/plugin.json, .cursor-plugin/plugin.json, or
.codex-plugin/plugin.json. Name the path you are deleting before you delete it, and never widen
the deletion to the directory.
Never delete root
plugin.json. It is the canonical source of truth and the manifest Copilot CLI reads, so removing it takes out both the source and a live target at once.copilot-clihas no generated manifest to clean — nothing to delete is the correct state for it.
Clear a stale or shadowing manifest
Two paths are worth checking whenever a plugin behaves as though it were an older version of itself:
.github/plugin/plugin.json— written by older builds. It sits below root in Copilot CLI's search order, so it was never read, and it is no longer generated. Safe to delete..plugin/plugin.json— this one outranks root in that search order. If it exists, Copilot CLI is reading it instead of the canonical manifest, and nothing regenerates it. Delete it, then rebuild and confirm Copilot CLI picks up root.
Copilot CLI's search order is .plugin/plugin.json → plugin.json → .github/plugin/plugin.json →
.claude-plugin/plugin.json, first match wins.
Drop a vendor
Removing a vendor is a manifest edit first and a deletion second — deleting only the file leaves the
vendor declared, and the next build writes it straight back. That edit belongs to
/universal-plugin:init-universal-plugin's update route; come back here for the file.
Remove the whole plugin
Irreversible. Confirm with the user before proceeding, and say specifically what goes:
- root
plugin.json - every derived manifest
- the component directories the manifest names (
skills/,commands/,agents/,hooks/, …) — these hold authored content, not build output, so name them individually and get agreement on each
If the package's package.json files array was wired to ship the plugin (plugin init --npm),
that entry is now dead weight; remove it in the same change.
If the plugin was published, deleting the source does not unpublish it. Say so — consumers keep resolving the last published version until it is deprecated at the registry, which is not something this skill does.
Rules
- Confirm before any irreversible delete. Cleaning build output is not irreversible; removing authored components is.
- Never delete root
plugin.jsonas cleanup. Only as a deliberate, confirmed removal of the whole plugin. - Prefer
plugin build --cleanoverrm— it removes exactly what the manifest declares, and nothing it does not. - A vendor left declared in
plugin.jsoncomes back on the next build. Edit the manifest, or the deletion is temporary.
Related skills
| Task | Skill |
|---|---|
| Remove a vendor from what the plugin declares | init-universal-plugin, update route |
| Confirm what is stale, shadowing, or unbuilt before deleting | doctor |
| Take a published plugin out of a marketplace listing | publish-plugin |