{"id":"9e5ea4f6-e97e-4959-99be-b71acdda75de","shortId":"JSLMs8","kind":"skill","title":"migrate-turboplans","tagline":"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 ind","description":"# Migrate Plans\n\nCurrent 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.\n\n## Task Tracking\n\nUse `TaskCreate` to create a task for each step:\n\n1. Scan and classify existing files\n2. Migrate prompt plan indexes\n3. Process remaining files in `.turbo/plans/`\n4. Normalize frontmatter on remaining plans\n5. Clean up and report\n\n## Step 1: Scan and Classify Existing Files\n\nScan for all legacy shapes:\n\n- **Prompt plan indexes** — Glob `.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.\n- **Files in `.turbo/plans/*.md`** — Read each file's first 20 lines and classify:\n  - **Unexpanded shell** — has legacy `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>`.\n  - **Expanded plan** — contains `## Pattern Survey` (with or without `<!-- Expanded from:` marker, with or without legacy `type: shell`). Target: stays in `.turbo/plans/`, frontmatter normalized.\n  - **Regular plan** — no frontmatter or legacy `type: plan` frontmatter, not shell-shaped, no `## Pattern Survey`. Target: stays in `.turbo/plans/`, frontmatter normalized.\n  - **Already-current plan** — has frontmatter with `status:` and no `type:`. Skip.\n- **Files in `.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.\n\nReport 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.\n\n## Step 2: Migrate Prompt Plan Indexes\n\nFor each prompt plan index (including `.turbo/prompts.md` if present), parse:\n\n- **Source** — spec path from the `Source:` field\n- **Prompts** — each `## Prompt N:` entry with its Status, Depends on, and content\n\n### Inline Prompts (Old Format)\n\nIndexes 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/`.\n\nFor each prompt entry:\n\n1. Generate a slug: `<spec-slug>-NN-<title-slug>` from the spec filename and prompt number/title\n2. If `.turbo/plans/<slug>.md` already exists with current frontmatter, skip this entry (collision)\n3. Map the legacy status to a plan `status`: `done` → `done`, `pending` → `ready`, `in-progress` → `ready`\n4. Write a plan at `.turbo/plans/<slug>.md`:\n\n````markdown\n---\nstatus: <mapped status>\nspec: <source spec path>\n---\n\n# Plan: <Prompt Title>\n\n## Context\n\n<The prompt's **Context** field content. If absent, use \"Migrated from legacy prompt plan.\">\n\n## Implementation Steps\n\n1. **Execute prompt instructions**\n   - <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.>\n\n## Verification\n\n- Verify the implementation matches the prompt's requirements\n- Run any test commands mentioned in the prompt\n````\n\n### Shell-Based Prompt Plans (Newer Format)\n\nIndexes 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:\n\n1. Read the referenced file at its original path. If missing, report the mismatch and skip\n2. Classify as unexpanded (no `## Pattern Survey`) or expanded (has `## Pattern Survey`)\n3. Determine target:\n   - **Unexpanded** → `.turbo/shells/<filename>`, frontmatter carries `spec:` and `depends_on:`\n   - **Expanded** → `.turbo/plans/<filename>`, frontmatter carries `status:` and `spec:`\n4. Build frontmatter:\n   - `spec` from the index's Source field\n   - For unexpanded only: `depends_on` mapped from the index entry's Depends on field, converting prompt numbers to shell file slugs\n   - For expanded only: `status` mapped from the index entry's Status field (`done` → `done`, `pending` → `ready`, `in-progress` → `ready`)\n5. If the target already exists with current frontmatter, skip\n6. Write the file to the target path with the new frontmatter prepended before the existing `# Plan:` heading (replacing any legacy frontmatter). Delete the original at `.turbo/plans/<filename>`.\n\n## Step 3: Process Remaining Files in `.turbo/plans/`\n\nHandles 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.\n\nFor each unexpanded shell:\n\n1. Build frontmatter: `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: []`\n2. Write to `.turbo/shells/<filename>` with the new frontmatter prepended before the `# Plan:` heading (replacing any legacy frontmatter)\n3. Delete the original at `.turbo/plans/<filename>`\n\nFor each expanded plan:\n\n1. Build frontmatter: `status: ready` (default), or `status: done` if legacy frontmatter had `status: done`, plus `spec:` inferred from the filename when a matching spec exists\n2. Rewrite the file in place with the normalized frontmatter (dropping legacy `type:`, `depends_on:`, and any other fields)\n\nFor each file in `.turbo/shells/*.md` that needs normalization (queued from Step 1):\n\n1. Keep `spec:` and `depends_on:` if present, synthesize defaults if not (`depends_on: []`)\n2. Drop any legacy `type:` or `status:` fields\n3. Rewrite the file in place with the normalized frontmatter\n\nCreate `.turbo/shells/` if it does not exist. If a file at a shell target path already exists, report the collision and skip.\n\n## Step 4: Normalize Frontmatter on Remaining Plans\n\nFor regular plans in `.turbo/plans/` that were not handled by Steps 2 or 3:\n\n- If the file has no frontmatter, prepend `status: done` (plans without frontmatter predate the convention and have already been implemented)\n- If the file has legacy `type: plan` frontmatter, drop `type:` and normalize `status:` to `done` if already `done`, otherwise `ready`. If no `status:` is present, set `status: done`.\n\nThe `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.\n\n## Step 5: Clean Up and Report\n\nAfter all files are migrated:\n\n1. Delete `.turbo/prompt-plans/` (the index files are no longer needed)\n2. Delete `.turbo/prompts.md` if it exists (oldest legacy format)\n\nReport a summary:\n\n- Number of inline prompts converted to plans under `.turbo/plans/`\n- Number of shells migrated from prompt-plan indexes to `.turbo/shells/`\n- Number of expanded plans migrated from prompt-plan indexes to `.turbo/plans/`\n- Number of unexpanded shells relocated from `.turbo/plans/` to `.turbo/shells/`\n- Number of expanded plans normalized in place in `.turbo/plans/`\n- Number of shells normalized in place in `.turbo/shells/`\n- Number of regular plans that received frontmatter\n- Number of files already migrated (skipped)\n- Files deleted (indexes and relocated source files)\n\n## Rules\n\n- Never modify the spec files in `.turbo/specs/`.\n- Never overwrite a file that already exists at the target path with valid current frontmatter.\n- Preserve all existing body content when adding or normalizing frontmatter. The migration is additive, structural (directory moves), and subtractive (legacy index deletion), never content-destructive.\n- If a shell file referenced by an index does not exist, report the mismatch and skip that entry.\n- If the source spec path in an index does not resolve, still migrate the files but note the missing spec in the report.\n- Never write `type:` into any migrated file. The directory is the type signal.\n- Never write `depends_on:` into a plan. The dependency graph lives on shells only.\n- The migration never produces `status: draft` because legacy artifacts predate the draft concept and cannot retroactively go through refinement; `ready` is the baseline for migrated expanded plans.","tags":["migrate","turboplans","turbo","tobihagemann","agent-skills","claude-code","claude-skills","developer-tools","skills"],"capabilities":["skill","source-tobihagemann","skill-migrate-turboplans","topic-agent-skills","topic-claude-code","topic-claude-skills","topic-developer-tools","topic-skills"],"categories":["turbo"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/tobihagemann/turbo/migrate-turboplans","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add tobihagemann/turbo","source_repo":"https://github.com/tobihagemann/turbo","install_from":"skills.sh"}},"qualityScore":"0.590","qualityRationale":"deterministic score 0.59 from registry signals: · indexed on github topic:agent-skills · 280 github stars · SKILL.md body (8,825 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T00:54:10.510Z","embedding":null,"createdAt":"2026-04-18T22:03:52.660Z","updatedAt":"2026-04-22T00:54:10.510Z","lastSeenAt":"2026-04-22T00:54:10.510Z","tsv":"'/expand-shell':24 '1':88,117,408,478,561,712,761,813,870,871,1048 '2':94,340,420,577,729,745,786,839,885,943,1058 '20':187 '3':99,174,306,433,589,696,803,893,945,1002 '4':105,450,607,926 '5':111,658,1038 '6':668 'absent':469 'account':747 'ad':1177 'addit':1184 'alreadi':267,284,325,329,424,662,739,918,963,982,1138,1161 'already-curr':266,324,328 'also':134 'artifact':18,1273 'assum':1020 'backfil':32 'base':528 'baselin':1287 'belong':742 'block':155,389,486,492 'bodi':1174 'boundari':500 'build':608,762,814 'cannot':1279 'carri':595,603 'check':135 'classifi':91,120,190,578 'clean':112,1039 'code':154,388,485 'collis':432,736,922 'command':521 'concept':1277 'concret':391,504 'consum':211 'contain':150,161,201,209,223,382 'content':373,467,487,1175,1195 'content-destruct':1194 'context':461,465 'convent':960 'convert':488,631,1074 'couldn':730 'cover':213 'creat':82,903 'current':14,44,268,286,326,330,427,665,740,1169 'default':818,880,997,1005,1036 'delet':36,690,804,1049,1059,1142,1192 'depend':54,295,370,598,620,628,784,852,875,883,1253,1259 'destruct':1196 'determin':145,590 'differ':999 'directori':1186,1246 'done':442,443,650,651,821,827,954,980,983,993,996 'draft':1270,1276 'drop':849,886,974 'embed':770 'enough':1016 'entri':366,407,431,560,626,646,1214 'equival':395 'even':726 'execut':479 'exist':92,121,425,501,663,683,781,838,909,919,1063,1162,1173,1207 'expand':27,221,229,318,397,585,600,639,811,1007,1022,1027,1092,1113,1290 'field':163,361,466,545,616,630,649,857,892 'file':9,93,102,122,160,169,178,184,278,505,541,548,565,636,671,699,703,725,842,860,896,912,948,968,1045,1053,1137,1141,1147,1153,1159,1200,1229,1244 'filenam':416,773,833 'first':186 'format':140,377,532,1066 'found':310 'frontmatt':34,56,107,197,207,242,247,252,264,271,287,428,594,602,609,666,679,689,763,793,802,815,824,848,902,928,951,957,973,1013,1134,1170,1180 'generat':409 'glob':131 'go':1281 'graph':1260 'handl':702,940 'head':685,798 'implement':476,512,965,1021,1030 'in-progress':446,654 'includ':350 'ind':41 'index':98,130,143,171,313,344,349,378,533,613,625,645,720,723,1052,1087,1099,1143,1191,1204,1222 'index-referenc':722 'infer':765,830 'inlin':149,374,1072 'instruct':392,481,508 'keep':872 'layout':15,45,76,556 'legaci':5,17,37,72,126,139,194,235,249,436,473,688,801,823,850,888,970,1065,1190,1272 'line':188 'live':48,58,550,1261 'longer':1056 'map':434,622,642 'markdown':457 'marker':231 'match':513,778,836 'may':549,1024 'md':133,181,281,423,456,775,780,863 'mention':522 'migrat':2,4,42,71,95,299,335,341,400,471,1047,1082,1094,1139,1182,1227,1243,1266,1289 'migrate-turboplan':1 'minim':33 'mismatch':574,1210 'miss':571,734,1233 'modifi':1150 'monolith':491 'move':1187 'n':365 'natur':499 'need':23,334,865,1057 'never':1029,1149,1156,1193,1238,1251,1267 'new':678,792 'newer':531 'nn':412,774 'normal':106,243,265,303,847,866,901,927,977,1115,1123,1179 'note':1231 'noth':333 'number':311,494,633,1070,1079,1090,1102,1111,1120,1128,1135 'number/title':419 'old':376,555,1015 'oldest':138,1064 'omit':783 'option':65 'origin':568,692,806 'otherwis':300,782,984 'overwrit':1157 'pars':141,354 'path':357,569,675,917,1166,1219 'pattern':202,217,224,258,582,587 'pend':444,652 'place':844,898,1117,1125 'plan':6,28,31,40,43,57,97,110,129,222,245,251,269,319,323,327,343,348,398,440,453,460,475,530,684,719,797,812,931,934,955,972,1008,1011,1023,1076,1086,1093,1098,1114,1131,1257,1291 'plus':828 'predat':958,1274 'prepend':680,794,952 'present':353,878,990 'preserv':502,1171 'process':100,697,732 'produc':210,1268 'progress':448,656 'prompt':39,96,128,147,151,342,347,362,364,375,381,384,406,418,463,474,480,483,515,525,529,536,559,632,718,1073,1085,1097 'prompt-plan':38,717,1084,1096 'proven':68 'queu':867 'queue':301 're':298,1019 'read':182,562 'readi':445,449,653,657,817,985,1004,1032,1284 'reason':1009 'receiv':1133 'record':164,709 'refer':157,172,506,537 'referenc':547,564,714,724,1201 'refin':1283 'regular':244,322,933,1010,1130 'reloc':1106,1145 'remain':101,109,698,930 'replac':686,799 'report':115,307,336,572,920,1042,1067,1208,1237 'reprocess':752 'requir':63,215,517 'resolv':1225 'retroact':1280 'rewrit':840,894 'rule':1148 'run':518 'safer':1035 'scan':89,118,123 'section':152,385 'separ':158,539 'set':166,991 'shape':73,127,256 'shell':8,22,47,159,162,168,192,196,237,255,315,331,527,540,544,635,756,760,915,1081,1105,1122,1199,1263 'shell-bas':526 'shell-shap':254 'signal':1250 'skill':70 'skill-migrate-turboplans' 'skip':176,277,429,576,667,721,924,1140,1212 'slug':411,637,769 'sourc':355,360,615,735,1146,1217 'source-tobihagemann' 'spec':52,66,214,293,356,415,459,596,606,610,764,768,829,837,873,1152,1218,1234 'split':16 'standalon':30 'status':62,273,291,369,437,441,458,604,641,648,816,820,826,891,953,978,988,992,995,1269 'stay':239,261 'step':87,116,173,305,339,477,497,695,711,728,744,869,925,942,1001,1037 'still':1226 'stop':338 'structur':1185 'sub':496 'sub-step':495 'subtract':1189 'summari':1069 'survey':203,218,225,259,583,588 'synthes':879 'target':219,238,260,591,661,674,738,916,1165 'target-already-curr':737 'task':77,84 'taskcreat':80 'test':520 'topic-agent-skills' 'topic-claude-code' 'topic-claude-skills' 'topic-developer-tools' 'topic-skills' 'track':78 'turbo':11 'turbo/plans':26,60,104,180,241,263,317,321,403,422,455,552,601,694,701,705,808,936,1078,1101,1108,1119 'turbo/prompt-plans':132,1050 'turbo/prompts.md':137,351,1060 'turbo/shells':20,50,220,280,593,789,862,904,1089,1110,1127 'turbo/specs':779,1155 'turboplan':3 'type':195,236,250,276,289,851,889,971,975,1240,1249 'unexpand':21,46,191,314,580,592,618,755,759,1104 'use':79,470 'valid':1168 'verif':509 'verifi':510 'via':542 'whether':146 'without':216,228,234,956,1012 'write':451,669,787,1239,1252","prices":[{"id":"c9c0c26f-23d2-45b5-bab2-7d8912d549c6","listingId":"9e5ea4f6-e97e-4959-99be-b71acdda75de","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"tobihagemann","category":"turbo","install_from":"skills.sh"},"createdAt":"2026-04-18T22:03:52.660Z"}],"sources":[{"listingId":"9e5ea4f6-e97e-4959-99be-b71acdda75de","source":"github","sourceId":"tobihagemann/turbo/migrate-turboplans","sourceUrl":"https://github.com/tobihagemann/turbo/tree/main/skills/migrate-turboplans","isPrimary":false,"firstSeenAt":"2026-04-18T22:03:52.660Z","lastSeenAt":"2026-04-22T00:54:10.510Z"}],"details":{"listingId":"9e5ea4f6-e97e-4959-99be-b71acdda75de","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"tobihagemann","slug":"migrate-turboplans","github":{"repo":"tobihagemann/turbo","stars":280,"topics":["agent-skills","claude-code","claude-skills","developer-tools","skills"],"license":"mit","html_url":"https://github.com/tobihagemann/turbo","pushed_at":"2026-04-21T12:22:12Z","description":"A composable dev process for Claude Code, packaged as modular skills.","skill_md_sha":"e776529aff2d74bbac62e74376d117865189108f","skill_md_path":"skills/migrate-turboplans/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/tobihagemann/turbo/tree/main/skills/migrate-turboplans"},"layout":"multi","source":"github","category":"turbo","frontmatter":{"name":"migrate-turboplans","description":"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\"."},"skills_sh_url":"https://skills.sh/tobihagemann/turbo/migrate-turboplans"},"updatedAt":"2026-04-22T00:54:10.510Z"}}