skills/migrate-turboplans/SKILL.md
Migrate legacy plan and shell files in .turbo/ to the current layout. Splits legacy artifacts between .turbo/shells/ (unexpanded shells, needs /expand-shell) and .turbo/plans/ (expanded plans and standalone plans), backfills minimal frontmatter, and deletes legacy prompt-plan indexes. Use when the user asks to "migrate turboplans", "migrate turbo plans", "upgrade plan format", "add frontmatter to plans", or "convert old plans".
npx skillsauth add tobihagemann/turbo migrate-turboplansInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Current layout: unexpanded shells live in .turbo/shells/ with spec: and depends_on: frontmatter. Plans live in .turbo/plans/ with status: (required) and optional spec: for provenance. This skill migrates legacy shapes to that layout.
Use TaskCreate to create a task for each step:
.turbo/plans/Scan for all legacy shapes:
.turbo/prompt-plans/*.md. Also check for .turbo/prompts.md (oldest legacy format). Parse each index to determine whether prompts are inline (contain ### Prompt sections with code blocks) or reference separate shell files (contain **Shell:** fields). Record the set of shell files each index references — Step 3 will skip these..turbo/plans/*.md — Read each file's first 20 lines and classify:
type: shell frontmatter AND does not contain ## Pattern Survey, OR has no frontmatter but contains ## Produces, ## Consumes, and ## Covers Spec Requirements without ## Pattern Survey. Target: .turbo/shells/<filename>.## Pattern Survey (with or without <!-- Expanded from: marker, with or without legacy type: shell). Target: stays in .turbo/plans/, frontmatter normalized.type: plan frontmatter, not shell-shaped, no ## Pattern Survey. Target: stays in .turbo/plans/, frontmatter normalized.status: and no type:. Skip..turbo/shells/*.md — if they already have current frontmatter (no type:, no status:, just spec: and depends_on:), they're migrated. Otherwise, queue for normalization in Step 3.Report what was found: number of indexes, unexpanded shells in .turbo/plans/, expanded plans in .turbo/plans/, regular plans, already-current plans, already-current shells. If nothing needs migration, report and stop.
For each prompt plan index (including .turbo/prompts.md if present), parse:
Source: field## Prompt N: entry with its Status, Depends on, and contentIndexes where each prompt contains a ### Prompt section with a code block of concrete instructions. These are equivalent to expanded plans, so migrate them to .turbo/plans/.
For each prompt entry:
<spec-slug>-NN-<title-slug> from the spec filename and prompt number/title.turbo/plans/<slug>.md already exists with current frontmatter, skip this entry (collision)status: done → done, pending → ready, in-progress → ready.turbo/plans/<slug>.md:---
status: <mapped status>
spec: <source spec path>
---
# Plan: <Prompt Title>
## Context
<The prompt's **Context** field content. If absent, use "Migrated from legacy prompt plan.">
## Implementation Steps
1. **Execute prompt instructions**
- <The prompt's code block content, converted from a monolithic block into numbered sub-steps where natural boundaries exist. Preserve the concrete file references and instructions.>
## Verification
- Verify the implementation matches the prompt's requirements
- Run any test commands mentioned in the prompt
Indexes where each prompt references a separate shell file via a **Shell:** field. The referenced files may live in .turbo/plans/ under the old layout. For each prompt entry:
## Pattern Survey) or expanded (has ## Pattern Survey).turbo/shells/<filename>, frontmatter carries spec: and depends_on:.turbo/plans/<filename>, frontmatter carries status: and spec:spec from the index's Source fielddepends_on mapped from the index entry's Depends on field, converting prompt numbers to shell file slugsstatus mapped from the index entry's Status field (done → done, pending → ready, in-progress → ready)# Plan: heading (replacing any legacy frontmatter). Delete the original at .turbo/plans/<filename>..turbo/plans/Handles files in .turbo/plans/ that were not recorded in Step 1 as referenced by a prompt-plan index. Skip index-referenced files even if Step 2 couldn't process them (missing source, collision, target-already-current) — they belong to Step 2's accounting and should not be reprocessed here as unexpanded shells.
For each unexpanded shell:
spec: inferred from the spec slug embedded in the filename (<spec-slug>-NN-<title>.md) when a matching .turbo/specs/<spec-slug>.md exists (otherwise omit), depends_on: [].turbo/shells/<filename> with the new frontmatter prepended before the # Plan: heading (replacing any legacy frontmatter).turbo/plans/<filename>For each expanded plan:
status: ready (default), or status: done if legacy frontmatter had status: done, plus spec: inferred from the filename when a matching spec existstype:, depends_on:, and any other fields)For each file in .turbo/shells/*.md that needs normalization (queued from Step 1):
spec: and depends_on: if present, synthesize defaults if not (depends_on: [])type: or status: fieldsCreate .turbo/shells/ if it does not exist. If a file at a shell target path already exists, report the collision and skip.
For regular plans in .turbo/plans/ that were not handled by Steps 2 or 3:
status: done (plans without frontmatter predate the convention and have already been implemented)type: plan frontmatter, drop type: and normalize status: to done if already done, otherwise ready. If no status: is present, set status: done.The status: done default here differs from Step 3's ready default for expanded plans. Reasoning: regular plans without frontmatter are old enough that they're assumed implemented; expanded plans may have been expanded but never implemented, so ready is the safer default.
After all files are migrated:
.turbo/prompt-plans/ (the index files are no longer needed).turbo/prompts.md if it exists (oldest legacy format)Report a summary:
.turbo/plans/.turbo/shells/.turbo/plans/.turbo/plans/ to .turbo/shells/.turbo/plans/.turbo/shells/.turbo/specs/.type: into any migrated file. The directory is the type signal.depends_on: into a plan. The dependency graph lives on shells only.status: draft because legacy artifacts predate the draft concept and cannot retroactively go through refinement; ready is the baseline for migrated expanded plans.tools
Teach the user to deeply understand a change through interactive tutoring: restating understanding, drilling into why/what/how, and quizzing until mastery. The active counterpart to a one-shot explanation. Use when the user asks to "understand this change", "teach me this change", "help me understand what changed", "walk me through this change", "make sure I understand this", "quiz me on this", or "teach me what we did".
tools
Teach the user to deeply understand a change through interactive tutoring: restating understanding, drilling into why/what/how, and quizzing until mastery. The active counterpart to a one-shot explanation. Use when the user asks to "understand this change", "teach me this change", "help me understand what changed", "walk me through this change", "make sure I understand this", "quiz me on this", or "teach me what we did".
tools
Update an existing GitHub pull request's title and description to reflect the current state of the branch. Use when the user asks to "update the PR", "update PR description", "update PR title", "refresh PR description", or "sync PR with changes".
tools
Execute an approved split plan by creating separate branches, commits, and PRs for each change group. Use when the user asks to "split and ship", "ship the split plan", "create separate PRs", or "split changes into branches".