Skip to main content
Removing an entry from gaal.yaml doesn’t, by default, delete what gaal previously installed. The leftover files are called orphans. gaal sync --prune cleans them up. Pruning is opt-in because the safe default is “leave alone what I didn’t author this run.” If you removed a skill from gaal.yaml by accident, you don’t want gaal to delete it before you notice.

What gets pruned

ResourcePruned?Notes
SkillsYesSkill directories gaal previously installed and that no longer have a matching skills[] entry.
MCP server entriesYesInside each managed target file, mcpServers keys gaal previously upserted that are no longer in mcps[].
RepositoriesNogaal never deletes repository directories. Remove them by hand if you want them gone.
Other JSON keys in MCP target filesNo--prune only touches keys gaal could have authored.

Always preview a prune

gaal sync --prune --dry-run
The plan marks pruned items with -:
plan:
  skills
    - remove  old-reviewer        ← claude-code (was managed by gaal)
  mcps
    - remove  legacy-server       ← ~/.config/claude/claude_desktop_config.json

Apply the prune

gaal sync --prune

Incompatible with --service

$ gaal sync --service --prune
error: --prune and --service are incompatible: use one-shot mode for destructive operations
Destructive operations don’t belong in an unattended loop. Run prune as a one-shot after editing gaal.yaml.

How gaal knows what it managed

gaal records what it installed each cycle. A skill or MCP entry is considered gaal-managed if a previous sync wrote it. When you remove it from gaal.yaml and run --prune, that record is what authorises the deletion. If you delete the gaal state file by hand, gaal forgets what it managed and --prune becomes a no-op until you sync again.

Dry-run

gaal sync

MCP servers