palm remove
palm remove deletes exactly what the lock says an entity wrote, then drops it from palm.yaml and the lock.
palm remove [source] <[kind:]name...> [--exclude]palm remove <source> [--all]Aliases: palm uninstall, palm rm.
| Command | What it does |
|---|---|
palm remove tdd |
Remove the entity named tdd, from whichever source it came from. |
palm remove mattpocock/skills tdd handoff |
Remove two entities of one source. |
palm remove obra/superpowers brainstorming --exclude |
Drop one plugin member for the whole team. |
palm remove obra/superpowers plugin:superpowers |
Remove a plugin and every member no other plugin declares. |
palm remove mcp:docs |
Remove a hand-declared MCP server. |
palm remove mattpocock/skills |
Remove every entry of the source, and the source, after a yes. |
palm remove handoff -g |
Remove from your home directory. |
$ palm remove grill-me- skill grill-me .agents/skills/grill-me/, .claude/skills/grill-me/ 3 files1 removed.$ palm remove grill-mei grill-me is not installed$ palm remove tddx skill tdd from mattpocock/skills: .claude/skills/tdd/SKILL.md was modified since install palm remove mattpocock/skills skill:tdd --force$ palm remove mattpocock/skills tdd --force- skill tdd .agents/skills/tdd/, .claude/skills/tdd/ 5 files1 removed.Options
Section titled “Options”| Argument | Meaning |
|---|---|
names |
an optional source, then [kind:]name of what to remove |
| Option | Meaning |
|---|---|
--exclude |
a plugin member: exclude it for the team in palm.yaml |
--all |
every entry of the source, after a question |
--allow-local-sources |
palm.yaml may name file:// sources outside the project |
The global options also apply.
Behavior
Section titled “Behavior”palm selects each entity by name, by kind when a name means two kinds, and by source when a name exists in two sources.
When a name matches two entries, the error prints one command per entry, each with its source and kind:name.
It then undoes exactly what the lock lists.
- Files by path. Folders palm emptied are removed, up to but never including the harness folders such as
.claudeor.github. - Merged entries by identity: a hook inside
.claude/settings.json, a server inside.mcp.json, a block inAGENTS.md. Your own entries in the same file stay. A JSON, TOML or Markdown file left empty is deleted. - The entity’s
.palm/assets/<source>/<entity>/folder.
palm then checks that every merged entry is gone, and prints ! could not remove for one that stays.
It removes the entry from palm.yaml and the lock.
A source with no entries left is dropped from both.
palm deletes only what it wrote for that entry, and the report counts what it kept.
A file another entry also owns stays, and the line says kept, owned by that entry.
A file whose real path lies inside a declared source stays too, with a line such as kept 42 files inside source ./skill (palm never deletes inside a source).
In a project, the result is a set of deleted and edited files that you commit.
A teammate’s git pull removes the entity for them, with no palm run.
Under -g, ~/.palm/applied.yaml records the removal, and palm install -g on another machine repeats it.
Plugin members
Section titled “Plugin members”A member installed through a plugin cannot be removed on its own name alone, because the plugin would bring it back.
x brainstorming belongs to plugin superpowers: exclude it for the team (palm remove obra/superpowers brainstorming --exclude) or remove the plugin--exclude adds skill:brainstorming to the plugin entry’s exclude: list and removes the member.
Removing a plugin removes its members, except a member another installed plugin still declares. That member stays, and a warning names the command that removes both.
When a plugin member was also edited, the hint names both flags at once, as in palm remove obra/superpowers skill:brainstorming --exclude --force.
When you remove the plugin and one of its members was edited, the hint removes the plugin again with --force: palm remove obra/superpowers plugin:superpowers --force.
A whole source
Section titled “A whole source”palm remove <source> alone, or with --all, removes every entry installed from that source, and the source leaves palm.yaml.
palm asks first, and the default is no.
Without a terminal, --yes answers the question.
A no removes nothing and exits 130.
Reads and writes
Section titled “Reads and writes”| File | Reads | Writes |
|---|---|---|
palm.yaml |
yes | removes entries, empty sections and sources with no entries |
palm.lock.yaml |
yes | removes entries and unused sources |
| harness files | yes, to compare with the render | deletes files, removes merged entries |
.palm/assets/ |
no | deletes the entity’s folder |
What it refuses
Section titled “What it refuses”A file you changed since palm wrote it stops the removal, and the entity stays installed and locked.
x skill tdd: .claude/skills/tdd/SKILL.md was modified since install palm remove mattpocock/skills skill:tdd --forceEvery command palm prints names the entity as kind:name, so it still runs when the source offers the name in two kinds.
--force deletes the changed file too. To keep your change, first copy the file into your own in-repo source under a new name and install it from there, as Troubleshooting shows.
palm never deletes a path whose real path is inside a declared source, --force included.
Removing something that is not installed prints i <name> is not installed and exits 0.
Exit codes
Section titled “Exit codes”| Code | When |
|---|---|
0 |
Every named entity is removed, or was not installed. |
1 |
A file was modified since install, a plugin member was named without --exclude, a name exists in two sources, or a file could not be removed. |
2 |
No name, an unknown option, or --local. |
130 |
You pressed Esc or Ctrl-C at a prompt, or answered no to removing a whole source. |