---
name: kata-doctor
description: Run health checks on Kata project structure, detecting and fixing format issues. Triggers include "doctor", "health check", "fix roadmap", "check project", "kata doctor".
metadata:
version: "1.8.0"
---
Run diagnostic health checks on a Kata project and fix detected issues.
**Health Checks:**
1. **Roadmap format migration** — Detects old-format ROADMAP.md and migrates to current format
2. **Phase directory collision detection** — Detects duplicate numeric prefixes and migrates to globally sequential numbering
When invoked directly by user: run interactively with confirmation prompts.
When invoked by other skills (auto mode): format migration proceeds automatically, collision fix reports the problem and suggests `/kata-doctor` for interactive resolution.
@./references/roadmap-format-spec.md
Mode: $ARGUMENTS (optional: --auto for non-interactive mode)
@.planning/ROADMAP.md
@.planning/STATE.md
Parse arguments for mode:
```bash
AUTO_MODE=false
if echo "$ARGUMENTS" | grep -q "\-\-auto"; then
AUTO_MODE=true
fi
```
Display diagnostic banner:
```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Kata ► PROJECT HEALTH CHECK
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Running diagnostics...
```
## Check 1: Roadmap Format
Run format detection:
```bash
bash ./scripts/check-roadmap-format.sh 2>/dev/null
FORMAT_EXIT=$?
```
**Exit code handling:**
- `0` = Current format, skip migration
- `1` = Old format, needs migration
- `2` = No ROADMAP.md, skip check
**If exit code 0:**
```
✓ ROADMAP.md format: current
```
Continue to Check 2.
**If exit code 2:**
```
— ROADMAP.md: not found (skipped)
```
Continue to Check 2.
**If exit code 1:**
```
⚠ ROADMAP.md format: old (needs migration)
```
Proceed to roadmap migration.
**Only runs if format check returned exit code 1.**
**Step 1: Parse old-format ROADMAP.md**
Read the existing ROADMAP.md and extract:
- Project name (from `# Roadmap:` or `#` heading)
- All phases with their numbers, names, status, plan counts
- Any milestone version references
- Phase completion dates if present
```bash
cat .planning/ROADMAP.md
```
**Step 2: Detect milestone boundaries**
Analyze phases to group them by milestone. Look for:
- Version references in phase goals or headers
- `` blocks (already partially migrated)
- Completed vs in-progress phases
**Step 3: Build current-format structure**
Transform to canonical format per `roadmap-format-spec.md`:
1. Add `## Milestones` overview section with status icons
2. Wrap completed milestone phases in `` blocks
3. Add `## Current Milestone:` heading for active work
4. Preserve all phase details and content
**Step 4: Write migrated ROADMAP.md**
Use Write tool to update `.planning/ROADMAP.md` with new format.
**Step 5: Verify migration**
```bash
bash ./scripts/check-roadmap-format.sh 2>/dev/null
VERIFY_EXIT=$?
```
**If exit code 0:**
```
✓ ROADMAP.md migrated to current format
```
**If still exit code 1:**
```
✗ ROADMAP.md migration failed - manual review needed
```
Display the file for user review.
**Step 6: Commit (if enabled)**
```bash
COMMIT_PLANNING_DOCS=$(cat .planning/config.json 2>/dev/null | grep -o '"commit_docs"[[:space:]]*:[[:space:]]*[^,}]*' | grep -o 'true\|false' || echo "true")
git check-ignore -q .planning 2>/dev/null && COMMIT_PLANNING_DOCS=false
```
**If `COMMIT_PLANNING_DOCS=true`:**
```bash
git add .planning/ROADMAP.md
git commit -m "docs: migrate ROADMAP.md to current format"
```
## Check 2: Phase Directory Collisions
Scan for duplicate numeric prefixes across all phase state directories:
```bash
DUPES=$(for state in active pending completed; do
ls .planning/phases/${state}/ 2>/dev/null
done | grep -oE '^[0-9]+' | sort -n | uniq -d)
# Also check flat directories (unmigrated projects)
FLAT_DUPES=$(ls .planning/phases/ 2>/dev/null | grep -E '^[0-9]' | grep -oE '^[0-9]+' | sort -n | uniq -d)
ALL_DUPES=$(echo -e "${DUPES}\n${FLAT_DUPES}" | sort -nu | grep -v '^$')
```
**If no duplicates:**
```
✓ Phase directories: no collisions
```
Continue to completion.
**If duplicates found:**
```
⚠ Phase directories: collisions detected
Duplicate prefixes: [list]
```
**If AUTO_MODE=true:**
```
Collision fix requires user confirmation.
Run `/kata-doctor` interactively to resolve.
```
Exit without fixing.
**If AUTO_MODE=false:**
Proceed to collision migration.
**Only runs if collisions detected AND AUTO_MODE=false.**
This step incorporates the full logic from `kata-migrate-phases`:
**Step 1: Validate environment**
```bash
[ -f .planning/ROADMAP.md ] || { echo "ERROR: No ROADMAP.md found."; exit 1; }
[ -f .planning/STATE.md ] || { echo "ERROR: No STATE.md found."; exit 1; }
```
**Step 2: Build milestone chronology**
Parse ROADMAP.md to build globally sequential phase numbering:
```bash
GLOBAL_SEQ=0
CHRONOLOGY=""
while IFS= read -r line; do
name=$(echo "$line" | grep -oE 'Phase [0-9.]+: .+' | sed 's/Phase [0-9.]*: //' | sed 's/\*\*$//' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | tr -cd 'a-z0-9-')
if [ -n "$name" ]; then
CHRONOLOGY="${CHRONOLOGY}${GLOBAL_SEQ} ${name}\n"
GLOBAL_SEQ=$((GLOBAL_SEQ + 1))
fi
done < <(grep -E 'Phase [0-9.]+:' .planning/ROADMAP.md)
```
Display: `Chronology ([N] phases): 00 → foundation, 01 → api-endpoints, ...`
**Step 3: Map directories to phases**
For each chronology entry, find matching directory across all states.
Build mapping: `STATE/OLD_DIR → STATE/NEW_PREFIX-SLUG`
**Step 4: Present migration plan**
```
Migration Plan:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
completed/01-foundation → completed/00-foundation
completed/02-api-endpoints → completed/01-api-endpoints
completed/01-setup → completed/02-setup
...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Total: [N] directories to rename
```
Use AskUserQuestion:
- header: "Migration"
- question: "Rename [N] directories to globally sequential numbers?"
- options:
- "Proceed" — Execute all renames
- "Cancel" — Abort migration
If cancelled: exit with "Migration cancelled."
**Step 5: Execute two-pass rename**
**Pass 1:** Rename all directories to temporary names: `mv OLD tmp-{seq}-{slug}`
**Pass 2:** Rename from temporary to final: `mv tmp-{seq}-{slug} {padded}-{slug}`
For active/pending phases, also rename internal files (`*-PLAN.md`, `*-RESEARCH.md`, etc.).
**Step 6: Update documentation**
Update ROADMAP.md current milestone phase numbers.
Update STATE.md current position.
Leave historical `` blocks unchanged.
**Step 7: Verify**
Re-run collision detection:
```bash
DUPES=$(for state in active pending completed; do
ls .planning/phases/${state}/ 2>/dev/null
done | grep -oE '^[0-9]+' | sort -n | uniq -d)
```
**If clean:**
```
✓ Phase directories migrated to globally sequential numbers
✓ No duplicate prefixes remain
```
**Step 8: Commit**
```bash
COMMIT_PLANNING_DOCS=$(cat .planning/config.json 2>/dev/null | grep -o '"commit_docs"[[:space:]]*:[[:space:]]*[^,}]*' | grep -o 'true\|false' || echo "true")
git check-ignore -q .planning 2>/dev/null && COMMIT_PLANNING_DOCS=false
```
**If `COMMIT_PLANNING_DOCS=true`:**
```bash
git add .planning/phases/ .planning/ROADMAP.md .planning/STATE.md
git commit -m "chore: migrate phase directories to globally sequential numbering"
```
## Completion
Display completion summary:
```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Kata ► HEALTH CHECK COMPLETE
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[List each check with status]
✓ ROADMAP.md format: [current | migrated | not found]
✓ Phase directories: [no collisions | migrated | skipped]
```
**If any migrations were performed:**
```
Changes committed. Run `/kata-track-progress` to continue.
```
- Don't modify historical `` blocks content (only add if missing)
- Don't rename completed phase internal files during collision fix
- Don't run collision fix in auto mode without user confirmation
- Don't fail the entire health check if one check has issues
- [ ] Roadmap format detected correctly (current/old/missing)
- [ ] Old-format roadmaps migrated to current format
- [ ] Migrated format verified with check script
- [ ] Phase collisions detected across all state directories
- [ ] Collision migration uses two-pass rename (no mid-rename collisions)
- [ ] Documentation updated after collision migration
- [ ] Changes committed (if commit_docs enabled)
- [ ] Auto mode skips collision fix with informative message
- [ ] User informed of all check results