Delete old plan versions or entire plans based on retention preferences, explicit age, or interactive selection. Keeps the latest version of each plan by default.
<load-config>
<action>Resolve the user's home directory.</action>
<command language="bash" output="home" tool="Bash">echo $HOME</command>
<constraint>Never pass `~` to the Read tool.</constraint>
<read path="<home>/.things/config.json" output="config" />
<if condition="config-missing">Tell the user: "Run `/things:setup-things` first." Then stop.<exit /></if>
<read path="<home>/.things/playbook/preferences.json" output="preferences" />
<if condition="preferences-missing">Tell the user: "Run `/setup-pb` first." Then stop.<exit /></if>
</load-config>
</step>
<step id="determine-mode" number="2">
<description>Determine Pruning Mode</description>
</step>
<step id="find-candidates" number="3">
<description>Find Deletion Candidates (age-based)</description>
</step>
<step id="interactive-selection" number="4">
<description>Interactive Selection</description>
</step>
<step id="delete-files" number="5">
<description>Delete Files</description>
</step>
<step id="rebuild" number="6">
<description>Trigger Rebuild</description>
</step>
<step id="git-workflow" number="7">
<description>Handle Git Workflow</description>
</step>
<step id="confirm" number="8">
<description>Confirm</description>
</step>
</steps><action>Parse `$ARGUMENTS` for:</action>
- **--older-than <days>**: Delete plan versions older than N days (keeps latest per slug)
- **--interactive**: Show all plans with version counts for manual selection
<if condition="--interactive">
<action>Use interactive mode (step 4).</action>
</if>
<if condition="--older-than provided">
<action>Use the explicit days value.</action>
</if>
<if condition="no flags">
<action>Use `preferences.plan_retention_days`.</action>
<if condition="plan_retention_days is null or missing">
<action>Tell the user: "No retention policy configured and no `--older-than` flag provided. Either run `/setup-pb reconfigure` to set `plan_retention_days`, or use `--older-than <days>` or `--interactive`." Then stop.</action>
<exit />
</if>
</if>
<if condition="age-based mode">
<action>For each plan directory in `<home>/.things/playbook/plans/`, list all `v*.md` files. For each file, parse the date from frontmatter. Calculate age in days from today.</action>
<action>Filter to versions older than the threshold, but NEVER include the latest (highest-numbered) version of any plan.</action>
<if condition="no candidates">
<action>Tell the user: "No plan versions older than <N> days found (latest versions are always kept)." Then stop.</action>
<exit />
</if>
<output>
Plan versions older than <N> days (latest versions excluded):
<slug>/v<N>.md (<date>, <age> days old)
<slug>/v<N>.md (<date>, <age> days old)
...
Total: <count> versions to delete
</output>
<ask-user-question>
<question>Delete these <count> old plan versions?</question>
<option label="Yes">Delete all listed versions</option>
<option label="No">Cancel -- keep everything</option>
</ask-user-question>
</if>
<if condition="interactive mode">
<action>List all plan directories with their version counts and latest version info.</action>
<if condition="no plans">
<action>Tell the user: "No plans found." Then stop.</action>
<exit />
</if>
<output>
Plans:
1. <slug>/ -- <version-count> versions (latest: v<N>, "<title>", <status>)
2. <slug>/ -- <version-count> versions (latest: v<N>, "<title>", <status>)
...
</output>
<ask-user-question>
<question>Which plans would you like to manage? Enter numbers (e.g., "1,3") or "all".</question>
</ask-user-question>
<action>For each selected plan, show individual versions:</action>
<output>
<slug>/
v1.md -- <date>, "<title>" <status>
v2.md -- <date>, "<title>" <status> (latest)
</output>
<ask-user-question>
<question>What would you like to delete? Enter version numbers (e.g., "v1"), "old" (all except latest), or "all" (entire plan).</question>
</ask-user-question>
<if condition="user-chose-all AND plan-has-only-one-version">
<ask-user-question>
<question>This is the only version of "<slug>". Deleting it removes the entire plan. Are you sure?</question>
<option label="Yes">Delete the plan entirely</option>
<option label="No">Cancel</option>
</ask-user-question>
</if>
<ask-user-question>
<question>Confirm: delete <count> selected items?</question>
<option label="Yes">Delete selected</option>
<option label="No">Cancel</option>
</ask-user-question>
</if>
<action>Delete each confirmed file.</action>
<command language="bash" tool="Bash">rm "<home>/.things/playbook/plans/<slug>/v<N>.md"</command>
<action>If all versions of a plan were deleted, remove the empty directory.</action>
<command language="bash" tool="Bash">rmdir "<home>/.things/playbook/plans/<slug>" 2>/dev/null || true</command>
<action>Read `<home>/.things/registry.json` to find the rebuild command for `playbook/plans`. Execute it.</action>
<constraint>If the rebuild command is not found, fall back to: `python3 <cached-path>/scripts/rebuild-index.py <home>/.things`</constraint>
<git-workflow>
<action>Pull latest before committing.</action>
<command language="bash" tool="Bash">git -C <home>/.things pull --rebase 2>/dev/null || true</command>
<action>Read git workflow from `config.json` (`git.workflow`).</action>
<if condition="workflow-auto">Automatically `git add`, `git commit -m "prune: <count> plan versions"`, and `git push`.</if>
<if condition="workflow-ask">
<ask-user-question>
<question>Commit and push the pruned plans?</question>
<option>Yes -- commit and push</option>
<option>Commit only</option>
<option>No -- I'll handle git myself</option>
</ask-user-question>
</if>
<if condition="workflow-manual">Tell the user the pruning is complete.</if>
</git-workflow>
<completion-message>
Pruned <count> plan versions.
Remaining: <remaining-plans> plans with <remaining-versions> total versions
</completion-message>