{"id":"5069c5bd-da55-45ff-b686-d4b281b684ef","shortId":"5j7SFC","kind":"skill","title":"migrate-turbo-files","tagline":"Migrate legacy files in .turbo/ to current formats. Covers plans and shells (layout split, frontmatter normalization, prompt-plan index cleanup) and improvements.md (legacy `trivial`/`standard` Type values rewritten to `direct`/`plan`). Use when the user asks to \"migrate turbo fi","description":"# Migrate Turbo Files\n\nCurrent layouts:\n\n- Unexpanded shells live in `.turbo/shells/` with `spec:` and `depends_on:` frontmatter.\n- Plans live in `.turbo/plans/` with `status:` (required) and optional `spec:` for provenance.\n- `.turbo/improvements.md` entries use Type values `direct`, `investigate`, or `plan`. Legacy values `trivial` and `standard` map to `direct` and `plan` respectively.\n\nThis skill migrates legacy shapes to those layouts.\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. Migrate `improvements.md` Type values\n6. 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- **`.turbo/improvements.md`** — read the file if it exists. Count entries whose `- **Type**:` line carries the legacy values `trivial` or `standard`. Queue these for rewriting in Step 5.\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, and improvements entries with legacy Type values. 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: Migrate `improvements.md` Type Values\n\nFor each entry queued in Step 1, rewrite its `- **Type**:` line in place:\n\n- `- **Type**: trivial` → `- **Type**: direct`\n- `- **Type**: standard` → `- **Type**: plan`\n\n`investigate` is unchanged. Preserve all other entry content (Category, Where, Why, Noted, summary). If `improvements.md` does not exist or no entries carry legacy values, skip this step.\n\n## Step 6: 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 improvements entries with rewritten Type values\n- Number of files already migrated (skipped)\n- Files deleted (indexes and relocated source files)\n\n## Rules\n\n- Treat `.turbo/specs/` as read-only.\n- Skip any target path that already has 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- Omit `type:` from all migrated files; the directory is the type signal.\n- Reserve `depends_on:` for shells; plans omit it.\n- Use `ready` as the baseline status for migrated expanded plans; `draft` is reserved for refinement-stage artifacts.\n- For `improvements.md`, only the Type value changes. Leave summaries, categories, file paths, rationales, and dates untouched.","tags":["migrate","turbo","files","tobihagemann","agent-skills","claude-code","claude-skills","developer-tools","skills"],"capabilities":["skill","source-tobihagemann","skill-migrate-turbo-files","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-turbo-files","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.597","qualityRationale":"deterministic score 0.60 from registry signals: · indexed on github topic:agent-skills · 295 github stars · SKILL.md body (9,721 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-05-08T06:54:09.622Z","embedding":null,"createdAt":"2026-04-28T00:53:57.818Z","updatedAt":"2026-05-08T06:54:09.622Z","lastSeenAt":"2026-05-08T06:54:09.622Z","tsv":"'1':113,147,471,541,624,775,824,876,933,934,1112,1165 '2':119,403,483,640,792,808,849,902,948,1006,1175 '20':217 '3':124,204,336,496,652,759,866,956,1008,1065 '4':130,513,670,989 '5':136,362,721,1101 '6':141,731,1155 'absent':532 'account':810 'ad':1296 'addit':1303 'alreadi':297,314,381,385,487,725,802,981,1026,1045,1263,1285 'already-curr':296,380,384 'also':164 'artifact':1394 'ask':41 'assum':1083 'base':591 'baselin':1381 'belong':805 'block':185,452,549,555 'bodi':1293 'boundari':563 'build':671,825,877 'carri':349,658,666,1148 'categori':1135,1404 'chang':1401 'check':165 'classifi':116,150,220,641 'clean':142,1156 'cleanup':25 'code':184,451,548 'collis':495,799,985 'command':584 'concret':454,567 'consum':241 'contain':180,191,231,239,253,445 'content':436,530,550,1134,1294,1314 'content-destruct':1313 'context':524,528 'convent':1023 'convert':551,694,1191 'couldn':793 'count':344 'cover':13,243 'creat':107,966 'current':11,49,298,316,382,386,490,728,803,1288 'date':1409 'default':881,943,1060,1068,1099 'delet':753,867,1166,1176,1267,1311 'depend':59,325,433,661,683,691,847,915,938,946,1370 'destruct':1315 'determin':175,653 'differ':1062 'direct':35,79,90,1122 'directori':1305,1364 'done':505,506,713,714,884,890,1017,1043,1046,1056,1059 'draft':1387 'drop':912,949,1037 'embed':833 'enough':1079 'entri':75,345,390,429,470,494,623,689,709,1108,1133,1147,1255,1333 'equival':458 'even':789 'execut':542 'exist':117,151,343,488,564,726,746,844,901,972,982,1144,1180,1292,1326 'expand':251,259,374,460,648,663,702,874,1070,1085,1090,1209,1230,1385 'fi':45 'field':193,424,529,608,679,693,712,920,955 'file':4,7,48,118,127,152,190,199,208,214,308,340,568,604,611,628,699,734,762,766,788,905,923,959,975,1011,1031,1162,1170,1262,1266,1272,1319,1348,1362,1405 'filenam':479,836,896 'first':216 'format':12,170,440,595,1183 'found':366 'frontmatt':19,61,132,227,237,272,277,282,294,301,317,491,657,665,672,729,742,752,826,856,865,878,887,911,965,991,1014,1020,1036,1076,1251,1289,1299 'generat':472 'glob':161 'handl':765,1003 'head':748,861 'implement':539,575,1028,1084,1093 'improv':389,1254 'improvements.md':27,138,1103,1141,1396 'in-progress':509,717 'includ':413 'index':24,123,160,173,201,369,407,412,441,596,676,688,708,783,786,1169,1204,1216,1268,1310,1323,1341 'index-referenc':785 'infer':828,893 'inlin':179,437,1189 'instruct':455,544,571 'investig':80,1127 'keep':935 'layout':17,50,101,619 'leav':1402 'legaci':6,28,83,97,156,169,224,265,279,351,392,499,536,751,864,886,913,951,1033,1149,1182,1309 'line':218,348,1116 'live':53,63,613 'longer':1173 'map':88,497,685,705 'markdown':520 'marker':261 'match':576,841,899 'may':612,1087 'md':163,211,311,486,519,838,843,926 'mention':585 'migrat':2,5,43,46,96,120,137,329,398,404,463,534,1102,1164,1199,1211,1264,1301,1346,1361,1384 'migrate-turbo-fil':1 'mismatch':637,1329 'miss':634,797,1352 'monolith':554 'move':1306 'n':428 'natur':562 'need':397,928,1174 'never':1092,1312 'new':741,855 'newer':594 'nn':475,837 'normal':20,131,273,295,333,910,929,964,990,1040,1232,1240,1298 'note':1138,1350 'noth':396 'number':367,557,696,1187,1196,1207,1219,1228,1237,1245,1252,1260 'number/title':482 'old':439,618,1078 'oldest':168,1181 'omit':846,1357,1375 'option':70 'origin':631,755,869 'otherwis':330,845,1047 'pars':171,417 'path':420,632,738,980,1283,1338,1406 'pattern':232,247,254,288,645,650 'pend':507,715 'place':907,961,1118,1234,1242 'plan':14,23,36,62,82,92,122,135,159,252,275,281,299,375,379,383,406,411,461,503,516,523,538,593,747,782,860,875,994,997,1018,1035,1071,1074,1086,1126,1193,1203,1210,1215,1231,1248,1374,1386 'plus':891 'predat':1021 'prepend':743,857,1015 'present':416,941,1053 'preserv':565,1130,1290 'process':125,760,795 'produc':240 'progress':511,719 'prompt':22,121,158,177,181,405,410,425,427,438,444,447,469,481,526,537,543,546,578,588,592,599,622,695,781,1190,1202,1214 'prompt-plan':21,780,1201,1213 'proven':73 'queu':930,1109 'queue':331,356 'rational':1407 're':328,1082 'read':212,338,625,1278 'read-on':1277 'readi':508,512,716,720,880,1048,1067,1095,1378 'reason':1072 'receiv':1250 'record':194,772 'refer':187,202,569,600 'referenc':610,627,777,787,1320 'refin':1392 'refinement-stag':1391 'regular':274,378,996,1073,1247 'reloc':1223,1270 'remain':126,134,761,993 'replac':749,862 'report':145,363,399,635,983,1159,1184,1327,1356 'reprocess':815 'requir':68,245,580 'reserv':1369,1389 'resolv':1344 'respect':93 'rewrit':359,903,957,1113 'rewritten':33,1257 'rule':1273 'run':581 'safer':1098 'scan':114,148,153 'section':182,448 'separ':188,602 'set':196,1054 'shape':98,157,286 'shell':16,52,189,192,198,222,226,267,285,371,387,590,603,607,698,819,823,978,1198,1222,1239,1318,1373 'shell-bas':589 'shell-shap':284 'signal':1368 'skill':95 'skill-migrate-turbo-files' 'skip':206,307,492,639,730,784,987,1151,1265,1280,1331 'slug':474,700,832 'sourc':418,423,678,798,1271,1336 'source-tobihagemann' 'spec':57,71,244,323,419,478,522,659,669,673,827,831,892,900,936,1337,1353 'split':18 'stage':1393 'standard':30,87,355,1124 'status':67,303,321,432,500,504,521,667,704,711,879,883,889,954,1016,1041,1051,1055,1058,1382 'stay':269,291 'step':112,146,203,335,361,402,540,560,758,774,791,807,932,988,1005,1064,1100,1111,1153,1154 'still':1345 'stop':401 'structur':1304 'sub':559 'sub-step':558 'subtract':1308 'summari':1139,1186,1403 'survey':233,248,255,289,646,651 'synthes':942 'target':249,268,290,654,724,737,801,979,1282 'target-already-curr':800 'task':102,109 'taskcreat':105 'test':583 'topic-agent-skills' 'topic-claude-code' 'topic-claude-skills' 'topic-developer-tools' 'topic-skills' 'track':103 'treat':1274 'trivial':29,85,353,1120 'turbo':3,9,44,47 'turbo/improvements.md':74,337 'turbo/plans':65,129,210,271,293,373,377,466,485,518,615,664,757,764,768,871,999,1195,1218,1225,1236 'turbo/prompt-plans':162,1167 'turbo/prompts.md':167,414,1177 'turbo/shells':55,250,310,656,852,925,967,1206,1227,1244 'turbo/specs':842,1275 'type':31,77,139,225,266,280,306,319,347,393,914,952,1034,1038,1104,1115,1119,1121,1123,1125,1258,1358,1367,1399 'unchang':1129 'unexpand':51,221,370,643,655,681,818,822,1221 'untouch':1410 'use':37,76,104,533,1377 'user':40 'valid':1287 'valu':32,78,84,140,352,394,1105,1150,1259,1400 'verif':572 'verifi':573 'via':605 'whether':176 'whose':346 'without':246,258,264,1019,1075 'write':514,732,850","prices":[{"id":"3be5baf3-ec26-4815-9412-294d310881ba","listingId":"5069c5bd-da55-45ff-b686-d4b281b684ef","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-28T00:53:57.818Z"}],"sources":[{"listingId":"5069c5bd-da55-45ff-b686-d4b281b684ef","source":"github","sourceId":"tobihagemann/turbo/migrate-turbo-files","sourceUrl":"https://github.com/tobihagemann/turbo/tree/main/skills/migrate-turbo-files","isPrimary":false,"firstSeenAt":"2026-04-28T00:53:57.818Z","lastSeenAt":"2026-05-08T06:54:09.622Z"}],"details":{"listingId":"5069c5bd-da55-45ff-b686-d4b281b684ef","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"tobihagemann","slug":"migrate-turbo-files","github":{"repo":"tobihagemann/turbo","stars":295,"topics":["agent-skills","claude-code","claude-skills","developer-tools","skills"],"license":"mit","html_url":"https://github.com/tobihagemann/turbo","pushed_at":"2026-05-01T15:45:15Z","description":"A composable dev process for Claude Code, packaged as modular skills.","skill_md_sha":"74512afe23fe5c614a897f18efa3dc2364fba418","skill_md_path":"skills/migrate-turbo-files/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/tobihagemann/turbo/tree/main/skills/migrate-turbo-files"},"layout":"multi","source":"github","category":"turbo","frontmatter":{"name":"migrate-turbo-files","description":"Migrate legacy files in .turbo/ to current formats. Covers plans and shells (layout split, frontmatter normalization, prompt-plan index cleanup) and improvements.md (legacy `trivial`/`standard` Type values rewritten to `direct`/`plan`). Use when the user asks to \"migrate turbo files\", \"migrate turbo\", \"migrate turboplans\", \"migrate turbo plans\", \"upgrade plan format\", \"add frontmatter to plans\", \"convert old plans\", or \"migrate improvements\"."},"skills_sh_url":"https://skills.sh/tobihagemann/turbo/migrate-turbo-files"},"updatedAt":"2026-05-08T06:54:09.622Z"}}