Skip to content

palm remove

palm remove deletes exactly what the lock says an entity wrote, then drops it from palm.yaml and the lock.

Terminal window
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.
~/project
$ palm remove grill-me
- skill grill-me .agents/skills/grill-me/, .claude/skills/grill-me/ 3 files
1 removed.
$ palm remove grill-me
i grill-me is not installed
$ palm remove tdd
x 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 files
1 removed.
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.

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 .claude or .github.
  • Merged entries by identity: a hook inside .claude/settings.json, a server inside .mcp.json, a block in AGENTS.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.

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.

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.

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

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 --force

Every 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.

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.