skills/roadmap-migrate/SKILL.md
{{ 𝛀𝛀𝛀 }} Convert an old simple-style roadmap (single Markdown, four statuses, <a name> anchors, roadmaps.json pointer registry) into the rich phase-array format (roadmaps.json source of truth + PHASE task list + prose overview).
npx skillsauth add jasonwarrenuk/goblin-mode Roadmap: MigrateInstall 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.
Upgrade an old simple-format roadmap to the rich phase-array format the other roadmap-* skills expect. This is a one-way structural rewrite of the source of truth, so it is user-initiated only (never model-triggered) — the other skills detect the old format and point the user here.
Old (simple) format: a single docs/roadmaps/{name}.md is the source of truth, with <a name="m{N}"> anchors, four sections (In Progress / To Do / Blocked / Completed), - [ ]/- [x] checkboxes, prose — **depends on {IDs}**, a graph TD diagram; .claude/roadmaps.json is a {"roadmaps":[{name,path}]} pointer registry.
Rich format: .claude/roadmaps.json is the source of truth — an array of phase objects {name, path, archived?, externalGates, milestones} with six statuses (todo, blocked, paused, deferred, done, out_of_scope), external gates, milestone/gate dependencies, and a mechanical status recompute. docs/roadmaps/{PHASE}.md and docs/reports/ROADMAP_OVERVIEW.md are projections.
Shared conventions: ~/.claude/library/references/roadmap-conventions.md. The CLI is python3 "$HOME"/.claude/library/scripts/roadmap.py.
Resolve the roadmap: $ARGUMENTS path/name → .claude/roadmaps.json → docs/roadmaps/ scan. Run python3 "$HOME"/.claude/library/scripts/roadmap.py detect:
Show git status and advise the user to commit or stash first — this overwrites the source of truth. Do not proceed with a dirty tree unless the user says so.
Read the .md. For each <a name="m{N}"> milestone block, capture:
> **Goal:** / > [!IMPORTANT] block).m{N}-doing, m{N}-todo, m{N}-blocked, m{N}-done): the ID, the description, and any — **depends on {IDs}** clause. Note which section each came from (doing/todo/blocked/done).Also parse the aggregated graph TD diagram for {A} --> {B} edges — merge these into each task's dependency set, so a dependency drawn only in the diagram (not written in prose) is not lost.
Build milestone objects {id: "M{N}", name, goal, tasks:[…]}. Each task: {id, description, dependsOn:[…]} with dependsOn the union of its prose depends-clause and its incoming Mermaid edges. The old format has no external gates → externalGates: []. Preserve any - Note: sub-bullets as a task notes field.
Seed each task's status from its old section, then let the recompute derive the rest:
- [x]) → done (terminal seed — kept).todo (the recompute promotes it to blocked if it has non-done deps). Record every task remapped this way for the report — the user may want to re-seed one deliberately (e.g. paused).todo (empty/all-done deps) or blocked (any non-done dep).Write the seeded JSON, then run python3 "$HOME"/.claude/library/scripts/roadmap.py recompute so every non-terminal status is derived, not carried over. This guarantees the migrated file passes validation immediately.
roadmaps.jsonWrite a single phase object (or, if migrating one roadmap among several pointer-registry entries, an array — append this phase and mark others as needed). Structure, tabs, field order, British spelling exactly as roadmap-create Step 6. Set the phase name from the old roadmap name (or $ARGUMENTS), path to the .md it will regenerate (reuse the old path so existing links hold), archived: false, externalGates: [].
.md as a rich projectionOverwrite the old .md at the same path with the rich layout (see roadmap-create Step 7): milestone headings, - [ ] **{ID}** — {description} lines with status annotations, and a generated graph LR diagram — no <a name> anchors, no four-section structure, no graph TD. The diagram is the verbatim output of python3 "$HOME"/.claude/library/scripts/roadmap.py graph --mermaid --direction LR (terminal milestone edges, canonical colours, correct classDef placement — nothing hand-computed).
ROADMAP_OVERVIEW.mdThe old format had no prose overview. Synthesise a minimal one (see roadmap-create Step 8) from the milestone goals, with the header count from python3 "$HOME"/.claude/library/scripts/roadmap.py stats. Flag the narrative sections as stubs for the user to flesh out — do not invent decisions or rationale that weren't in the source.
Run python3 "$HOME"/.claude/library/scripts/roadmap.py validate — it must report clean; fix any discrepancy. Then report:
roadmap.py stats).ROADMAP_OVERVIEW.md's narrative is a stub.disable-model-invocation keeps it explicit.done/out_of_scope seeds.roadmap-maintain, extended by roadmap-update-tasks, and rendered by artefact-roadmap.tools
{{ 𝚫𝚫𝚫 }} Rebuild roadmap-system.zip, the distributable snapshot of the roadmap tooling (scripts, HTML template, conventions reference, and every roadmap-touching skill, including this one).
tools
--- name: "Suggest: Task" description: "{{ 𝚫𝚫𝚫 }} Suggest the next logical task — grounded in the roadmap's pre-vetted ready-set when one exists, codebase analysis otherwise" when_to_use: "When you don't know what to work on next and want a grounded recommendation rather than picking arbitrarily." model: haiku effort: low disable-model-invocation: true allowed-tools: ["Read", "Glob", "Grep", "Bash(python3:*)", "Bash(npm:*)", "Bash(bun:*)", "Bash(pnpm:*)", "Bash(deno:*)"] argument-hint: [named
data-ai
{{ ƔƔƔ }} Create a pull request to main — wordy or shiny (with screenshots), ready-for-review or draft
tools
{{ 𝚫𝚫𝚫 }} Integrate a target branch into the current one by merge, rebase or squash