---
name: gsd-complete-milestone
description: Complete milestone with direct archiving and cleanup
allowed-tools: Read, Edit, Bash, AskUserQuestion
argument-hint: '[milestone-version]'
---
Complete milestone {{milestone-version}}, archive all files directly to .planning/history/v{{milestone-version}}/ with mirrored structure, and clean workspace for next milestone.
Purpose: Archive milestone artifacts to permanent history/, update MILESTONES.md registry, optional git tag, prepare clean workspace.
Output: Milestone archived to history/v{{milestone-version}}/, workspace contains only PROJECT.md, MILESTONES.md, config.json, codebase/.
@.github/get-shit-done/workflows/complete-milestone.md
@.github/get-shit-done/references/ui-brand.md
**Project files:**
- `.planning/ROADMAP.md`
- `.planning/STATE.md`
- `.planning/PROJECT.md`
- `.planning/REQUIREMENTS.md` (optional)
- `.planning/phases/` (if exists)
- `.planning/research/` (if exists)
- `.planning/todos/` (if exists)
**User input:**
- Version: {{milestone-version}} (e.g., "1.0", "1.1", "2.0")
Check if milestone is complete by counting phases with SUMMARY.md files:
```bash
# Count completed plans
ls .planning/phases/*/SUMMARY.md 2>/dev/null | wc -l
# Check ROADMAP for milestone scope
cat .planning/ROADMAP.md
```
Present milestone scope and stats to user.
Use AskUserQuestion to get combined readiness + archive confirmation:
**Tool: AskUserQuestion**
- **header:** "Ready to Complete Milestone?"
- **question:** "Complete v{{milestone-version}}? This will archive all files to history/v{{milestone-version}}/"
- **details:** Show milestone stats:
- Number of phases completed
- Number of plans completed
- Key accomplishments (extracted from SUMMARYs)
- **options:**
- "Complete and archive" — Archive to history/ and mark complete
- "Cancel" — Exit without changes
**If "Cancel":** Exit with message "Milestone completion cancelled."
**If "Complete and archive":** Continue to next step.
Archive all milestone files directly to history/v{{milestone-version}}/ using bash commands:
```bash
# Source git helpers
if ! type commit_as_user >/dev/null 2>&1; then
source .github/get-shit-done/workflows/git-identity-helpers.sh
fi
# Create destination with mirrored structure
mkdir -p .planning/history/v{{milestone-version}}/
# Move required files atomically
mv .planning/ROADMAP.md .planning/history/v{{milestone-version}}/
mv .planning/STATE.md .planning/history/v{{milestone-version}}/
mv .planning/PROJECT.md .planning/history/v{{milestone-version}}/
# Move optional files (don't fail if missing)
mv .planning/REQUIREMENTS.md .planning/history/v{{milestone-version}}/ 2>/dev/null || true
# Move directories (preserves structure)
mv .planning/phases .planning/history/v{{milestone-version}}/ 2>/dev/null || true
mv .planning/research .planning/history/v{{milestone-version}}/ 2>/dev/null || true
mv .planning/todos .planning/history/v{{milestone-version}}/ 2>/dev/null || true
# Stage all changes
git add .planning/history/v{{milestone-version}}/
git add -u .planning/ # Stages deletions
# Commit with user identity
commit_as_user "milestone: archive v{{milestone-version}} to history
Moved to .planning/history/v{{milestone-version}}/:
- ROADMAP.md, STATE.md, PROJECT.md
- REQUIREMENTS.md
- phases/, research/, todos/
Workspace ready for next milestone."
```
**Note:** All operations are atomic at filesystem level (mv appears instantly or not at all).
Update .planning/MILESTONES.md with new entry (create if doesn't exist):
```bash
# Extract milestone name from ROADMAP.md (now in history/)
MILESTONE_NAME=$(grep "^# " .planning/history/v{{milestone-version}}/ROADMAP.md | head -1 | sed 's/^# //')
# Count phases and plans
PHASE_COUNT=$(find .planning/history/v{{milestone-version}}/phases -name "SUMMARY.md" 2>/dev/null | cut -d/ -f5 | cut -d- -f1 | sort -u | wc -l)
PLAN_COUNT=$(find .planning/history/v{{milestone-version}}/phases -name "SUMMARY.md" 2>/dev/null | wc -l)
# Extract key accomplishments from SUMMARYs
# (AI: Read 3-5 SUMMARY files and extract major accomplishments)
# Append to registry
cat >> .planning/MILESTONES.md << EOF
## v{{milestone-version}} — ${MILESTONE_NAME}
**Completed:** $(date +%Y-%m-%d)
**Phases:** ${PHASE_COUNT}
**Plans:** ${PLAN_COUNT}
**Key Accomplishments:**
- [ACCOMPLISHMENT_1]
- [ACCOMPLISHMENT_2]
- [ACCOMPLISHMENT_3]
**Location:** .planning/history/v{{milestone-version}}/
EOF
git add .planning/MILESTONES.md
commit_as_user "milestone: register v{{milestone-version}} completion"
```
Use AskUserQuestion to offer optional git tag:
**Tool: AskUserQuestion**
- **header:** "Git Tag"
- **question:** "Create git tag v{{milestone-version}}?"
- **options:**
- "Create tag v{{milestone-version}}" — Tag this version
- "Skip tag" — No git tag
**If "Create tag v{{milestone-version}}":**
```bash
git tag v{{milestone-version}}
echo "Tag v{{milestone-version}} created locally."
echo "To push: git push origin v{{milestone-version}}"
```
**If "Skip tag":** Continue to next step.
Display stage banner (following ui-brand.md):
```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
GSD ► MILESTONE COMPLETE ✓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
**v{{milestone-version}} {MILESTONE_NAME}** — {N} phases complete
Archived to: .planning/history/v{{milestone-version}}/
Git tag: v{{milestone-version}} {if created}
Workspace clean: PROJECT.md, MILESTONES.md, config.json, codebase/
───────────────────────────────────────────────────────────────
## ▶ Next Up
**New Milestone** — Start planning next version
`/gsd-new-milestone`
`/clear` first → fresh context window
───────────────────────────────────────────────────────────────
```
- [ ] All milestone files archived to .planning/history/v{{milestone-version}}/
- [ ] Directory structure mirrored (phases/, research/, todos/)
- [ ] Git commit preserves user identity
- [ ] Optional git tag created based on user choice
- [ ] Workspace contains only: PROJECT.md, MILESTONES.md, config.json, codebase/
- [ ] User knows next command (/gsd-new-milestone)
- **Use AskUserQuestion:** All confirmations via AskUserQuestion tool (not manual text prompts)
- **Atomic operations:** Use mv for file moves (not cp then rm)
- **Git identity:** Source git-identity-helpers.sh and use commit_as_user
- **Optional files:** Use 2>/dev/null || true for files that might not exist
- **Direct archiving:** Archive to history/v{{milestone-version}}/ (not milestones/)
- **Clean workspace:** After completion, only PROJECT.md, MILESTONES.md, config.json, codebase/ remain