Plan Archiver
Move completed plans and closed roadmap milestones to an archive directory.
Installation
- Make sure Claude is on your device and in your terminal.
Skills load from
~/.claude/skills/when Claude Code starts up — so you need it on your machine first. If you don't have it yet, install it once with the command below, then runclaudein any terminal to verify.One-time setupnpm i -g @anthropic-ai/claude-codeAlready have it? Skip ahead.
- Paste into Claude Code or into your terminal.
This copies the whole skill folder into
~/.claude/skills/aif-archive-lee-to/— the SKILL.md plus any scripts, reference docs, or templates the skill ships with. Safe default: works for every skill.Faster alternative (instruction-only skills)
Skips the clone and grabs only the SKILL.md file. Don't use this if the skill ships Python scripts, reference markdowns, or asset templates — they won't be downloaded and the skill will fail when it tries to load them.
Quick install (SKILL.md only)Sign up to copy - Restart Claude Code.
Quit and reopen Claude Code (or any other agent that loads from
~/.claude/skills/). New skills are picked up on startup. - Just ask Claude.
Skills auto-activate when your request matches the skill's description — no slash command needed. Trigger phrases live in the skill's own frontmatter; you can read them in the “What this skill does” section above.
Prefer to read the source first? Open on GitHub.
When Claude uses it
Archive completed plans and roadmap milestones. Moves finished plans to the archive directory and optionally trims closed milestones from ROADMAP.md. Use when user says "archive plans", "clean up plans", "archive completed", or "trim roadmap".
What this skill does
Archive — Move completed plans and roadmap snapshots
Archive completed plans from paths.plans/ into paths.archive/plans/ and
optionally trim closed milestones from ROADMAP.md into dated snapshots
under paths.archive/roadmap/.
Workflow
Step 0: Load Config
Read .ai-factory/config.yaml if it exists to resolve:
paths.plans(default:.ai-factory/plans/)paths.archive(default:.ai-factory/archive/)paths.plan(default:.ai-factory/PLAN.md)paths.fix_plan(default:.ai-factory/FIX_PLAN.md)paths.roadmap(default:.ai-factory/ROADMAP.md)workflow.plan_id_format(default:slug) — active values:slugandsequential.timestampanduuidare reserved and behave likeslug. Treat any unknown value asslug.language.uifor user-facing prompts
If config doesn't exist, use defaults listed above.
Read .ai-factory/skill-context/aif-archive/SKILL.md if it exists —
project-specific overrides take priority over general instructions.
Step 1: Parse Arguments
Extract mode from arguments:
(no args) → interactive mode: scan, show completable plans, ask which to archive
list → show archive contents, then STOP
--roadmap → trim closed milestones from ROADMAP.md into a snapshot
--all → archive ALL completed plans (ask confirmation first)
<plan-name> → archive a specific plan by filename or partial stem match
Parsing rules:
listand--roadmapare mutually exclusive with<plan-name>and--all- If multiple conflicting modes are given, emit error and STOP
<plan-name>can be:- full filename:
0005_feature-auth.md - stem without extension:
0005_feature-auth - partial match:
feature-auth(must match exactly one plan)
- full filename:
Step 2: Execute Mode
Mode: Interactive (no arguments)
- Scan
paths.plans/for all*.mdfiles usingGlob. - For each plan file, read the
## Taskssection. - Determine completion: a plan is completed when ALL task checkboxes
are
- [x]. Plans with any- [ ]are incomplete. - If no completed plans found:
→ STOP.No completed plans found in <paths.plans/>. - Display completed plans:
Completed plans ready to archive: 1. 0001_feature-alpha.md (completed 2026-05-20) 2. 0003_feature-gamma.md (completed 2026-05-24) Incomplete plans (skipped): - 0005_feature-delta.md (3/7 tasks done) - Ask which to archive:
AskUserQuestion: Which plans to archive? Options: 1. All completed plans listed above 2. Select specific plans (enter numbers) 3. Cancel - Execute archive operation for selected plans (see Archive Operation).
Mode: list
- Check if
<paths.archive>/plans/exists. - If not:
Archive is empty. No plans have been archived yet.→ STOP. - Glob
<paths.archive>/plans/*.md. - For each archived plan, read the YAML frontmatter to extract
archiveddate. - Display:
Archived plans (<paths.archive>/plans/): 1. 0001_feature-alpha.md (archived: 2026-05-20) 2. 0003_feature-gamma.md (archived: 2026-05-24) Total: 2 archived plans - Check
<paths.archive>/roadmap/for snapshots and list them if present:Roadmap snapshots (<paths.archive>/roadmap/): 1. 2026-05-20_roadmap-snapshot.md (3 milestones) - STOP.
Mode: <plan-name>
- Resolve
<plan-name>to a file inpaths.plans/:- Try exact filename match first
- Then try with
.mdextension appended - Then try partial stem match (grep for
<plan-name>in filenames)
- If no match:
Plan not found: <plan-name>with suggestions → STOP. - If multiple matches: list them and ask user to be more specific → STOP.
- Read the matched plan file and check completion status.
- If incomplete:
→ STOP.Plan <filename> is not completed (5/8 tasks done). Only completed plans can be archived. - Execute archive operation (see Archive Operation).
Mode: --all
- Scan
paths.plans/for completed plans (same logic as interactive mode). - If no completed plans: inform and STOP.
- Display list and ask confirmation:
AskUserQuestion: Archive ALL completed plans? 1. 0001_feature-alpha.md 2. 0003_feature-gamma.md Options: 1. Yes, archive all 2 plans 2. Cancel - Execute archive operation for all confirmed plans.
Mode: --roadmap
- Read the resolved
paths.roadmapfile. - If it doesn't exist:
No ROADMAP.md found at <path>.→ STOP. - Find milestones with
- [x]checkbox (completed milestones). - If no completed milestones:
No closed milestones to archive.→ STOP. - Display and ask confirmation:
Closed milestones found in ROADMAP.md: - [x] MVP Launch — core features shipped - [x] Beta Testing — user feedback round AskUserQuestion: Trim these milestones from ROADMAP.md into a snapshot? Options: 1. Yes, create snapshot and trim 2. Cancel - Create snapshot:
mkdir -p <paths.archive>/roadmap/- Determine snapshot filename:
YYYY-MM-DD_roadmap-snapshot.md - Collision check. Before writing, verify the destination does not already exist:
If the file exists, append a counter suffix to produce a non-colliding name:Read <paths.archive>/roadmap/YYYY-MM-DD_roadmap-snapshot.mdYYYY-MM-DD_roadmap-snapshot-2.md,YYYY-MM-DD_roadmap-snapshot-3.md, etc. Check each candidate until a free name is found. - Write the resolved snapshot path with:
# Roadmap Snapshot — YYYY-MM-DD Archived from: <paths.roadmap> ## Archived Milestones - [x] MVP Launch — core features shipped - [x] Beta Testing — user feedback round
- Edit
paths.roadmap: remove the archived- [x]lines from the## Milestonessection. Keep the## Completedtable if it exists. Do NOT editpaths.roadmapunless the snapshot write in step 6 succeeded. - Logging:
INFO [aif-archive] roadmap snapshot: <resolved-path> (<N> milestones archived)
Archive Operation (plans)
For each plan to archive:
-
mkdir -p <paths.archive>/plans/ -
Collision check. Before moving, verify the destination does not already exist:
Read <paths.archive>/plans/<original-filename>If the file exists:
- Single plan (interactive or
<plan-name>): STOP with an error:ERROR [aif-archive] destination already exists: <paths.archive>/plans/<filename> A previously archived plan has the same filename. This can happen when sequential numbering reuses a freed number after archiving. To resolve: rename the existing archive file, or delete it if it is no longer needed. - Batch (
--all): SKIP this plan with a warning, continue to the next:WARN [aif-archive] skipped: <filename> — destination already exists
Do NOT overwrite in either case.
- Single plan (interactive or
-
Move the source file into the archive path first:
mv <paths.plans>/<filename> <paths.archive>/plans/<filename>This atomically removes the plan from the active directory.
-
Add archive metadata to the moved file using
Edit:If the file already has YAML frontmatter (between
---markers at the top):- Use
Editto addarchived: YYYY-MM-DDfield inside the existing frontmatter block.
If the file has no YAML frontmatter:
- Use
Editto prepend a minimal frontmatter block before the first line:--- archived: YYYY-MM-DD ---
The original filename is preserved exactly, including any sequential
NNNN_prefix. - Use
-
Logging:
INFO [aif-archive] archived: <filename> -> <paths.archive>/plans/<filename> -
After all plans are processed, display summary:
## Archive Complete Archived N plan(s) to <paths.archive>/plans/: - 0001_feature-alpha.md - 0003_feature-gamma.md Skipped: K (destination already exists) - 0002_feature-beta.md Plans directory: <paths.plans/> (M plans remaining)Omit the "Skipped" section when K is 0.
Completion Detection Algorithm
A plan is completed when:
- The file contains a
## Taskssection (case-insensitive header match). - ALL lines matching the pattern
- [x]or- [ ]within the Tasks section (and its subsections) are checked: every checkbox is- [x]. - If the Tasks section contains zero checkboxes, the plan is considered not completed (empty plans are not archivable).
Edge cases:
- Checkboxes outside
## Tasks(e.g., in## Settingsor## Commit Plan) are NOT counted for completion. - Nested checkboxes (indented
- [x]) ARE counted. - Plans without a
## Taskssection are not archivable — emitWARN [aif-archive] <filename> has no ## Tasks section; skipping.
Completion Date Inference
When displaying "completed" dates in interactive mode:
- Check YAML frontmatter for a
completedfield — use if present. - Fall back to git:
git log -1 --format=%ai -- <plan-file>to get last modification date. - Fall back to filesystem: file modification time.
Important Rules
- Never archive incomplete plans — all tasks must be
- [x] - Always ask confirmation before
--alland--roadmapoperations - Preserve original filenames — including sequential
NNNN_prefix - Add archive metadata —
archived: YYYY-MM-DDin YAML frontmatter - Do not modify fast plans (
paths.plan) or fix plans (paths.fix_plan) — those are single-file artifacts managed by/aif-implementand/aif-fix - Do not count archived plans for sequential numbering — archived plans
live in
paths.archive/plans/, notpaths.plans/, so/aif-plansequential scan does not include them
Artifact Ownership
- Owns:
paths.archive/plans/*.md,paths.archive/roadmap/*.md - Reads:
paths.plans/*.md,paths.roadmap - Modifies:
paths.roadmap(only with--roadmap, only after confirmation) - Does NOT touch:
paths.plan,paths.fix_plan,paths.description,paths.architecture,paths.rules_file
Related skills
Claude API Helper
anthropics
Build, debug, and optimize Claude API applications with caching and model migration support.
Documentation Co-Authoring
anthropics
Guide structured workflows for writing docs, proposals, and technical specs collaboratively.
PPTX Text Extractor
axoviq-ai
Extract text and speaker notes from PowerPoint presentations.
Memory Search
davila7
Search conversation history and recall previous discussions, decisions, and context.