skills/migrate-app/SKILL.md
--- name: migrate-app description: Generic "migrate an existing project" dispatcher. Asks the source stack and the target shape via AskUserQuestion, then hands off to the framework-specific migration skill (`/ro:migrate-to-tanstack`, `/ro:migrate-to-astro`). Use when the user wants to migrate, port, move, or convert an existing web app but isn't sure which target stack fits. Sister to `/ro:new-app` — same dispatcher pattern, the migration leaves of `[[stack-decision-map]]`. Calls neither skill u
npx skillsauth add RonanCodes/ronan-skills skills/migrate-appInstall 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.
Walks the migration question — what's the source, what's the target — and dispatches to the right /ro:migrate-to-<framework> skill. Doesn't port anything itself.
If you already know the target, call the leaf skill directly:
/ro:migrate-to-tanstack — porting to server-leaning TanStack Start + D1 + Workers/ro:migrate-to-astro — porting to static-leaning Astro 5 on Workers (with the live-DNS cutover sequence)This skill is the "I'm not sure which target fits" entry point.
/ro:migrate-app
/ro:migrate-app --source vercel-astro --target astro
/ro:migrate-app --explain
If running in a repo, do a quick audit before asking anything — the answers often jump out:
# Current adapter / framework
grep -E "@astrojs/(vercel|netlify|cloudflare|node)|next|remix|nuxt|sveltekit" package.json
# Current output mode (Astro)
grep -E "output:\s*['\"](static|server|hybrid)" astro.config.* 2>/dev/null
# Hosting hints
ls vercel.json netlify.toml fly.toml Dockerfile 2>/dev/null
Echo the findings before the first question so the user sees what was detected.
AskUserQuestion):AskUserQuestion):/api/* is dynamic) → /ro:migrate-to-astro/ro:migrate-to-tanstackIf the source is already Astro and the target is static-leaning, the migration is mostly a hosting swap — /ro:migrate-to-astro handles that path with explicit checks for the twelve [[astro-cf-workers-migration-gotchas]].
If the source is Astro but the target is server-leaning (e.g. you're outgrowing the Astro adapter and need a real SaaS), prompt: "this is a rewrite, not a port — confirm?" before dispatching to /ro:migrate-to-tanstack.
Before dispatching, ask:
--keep-data.Print the exact dispatch invocation, ask for confirmation, then run it.
Based on your answers:
- source: Astro on a Hetzner VPS
- target: static-leaning (mostly marketing pages + /api/config)
- live domain: yes (cutover with rollback plan)
About to run: /ro:migrate-to-astro --strategy branch
Continue? (yes/edit-decisions/no)
| Source | Target shape | Dispatches to | Notes |
|---|---|---|---|
| Astro (any host) | static-leaning | /ro:migrate-to-astro | Most common — Vercel/VPS Astro → Workers |
| Next.js | static-leaning | /ro:migrate-to-astro | Treated as a rewrite (drop Next, port content + components to Astro) |
| Plain HTML / Webflow / WP | static-leaning | /ro:migrate-to-astro | Use --strategy fresh |
| Anything | server-leaning | /ro:migrate-to-tanstack | Always a rewrite, never a host swap |
| Astro | server-leaning | /ro:migrate-to-tanstack | Rewrite — confirm with user before dispatch |
[[astro-cf-workers-migration-gotchas]] — the spec /ro:migrate-to-astro implements/ro:migrate-to-astro, /ro:migrate-to-tanstack — the leaves this dispatcher routes to/ro:new-app — the sibling for fresh projects (no source to port)[[stack-decision-map]] — the canonical tree both dispatchers walkdevelopment
Close the loop on a Linear ticket when its work ships - move the status and post a deploy comment with the PR link, what shipped, and a try-it link, mentioning the collaborator. Used as the tail of /ro:linear-nightshift for every merged mirror, or manually after an ad-hoc build. Triggers on "linear update", "update the linear ticket", "mark NUT-x done", "tell eoin it shipped", "/ro:linear-update".
devops
Run a night-shift against a collaborator's Linear board. Pulls the team's Grilled tickets (/ro:linear-grill moves a ticket to Grilled once its questions are answered), VERIFIES the questions were actually answered (unanswered → bounce the ticket to the "Question for <name>" state), mirrors verified tickets to ephemeral GitHub issues with ready-for-agent, then runs the standard /ro:night-shift machinery on GitHub. Tail-calls /ro:linear-update for everything that merged + deployed. Triggers on "linear nightshift", "nightshift linear", "drain the linear board", "run the shift off linear", "/ro:linear-nightshift".
development
Grill a collaborator's Linear tickets and move every processed ticket to where it belongs. Resolves the board from the repo's .ro-linear.json, reads the collaborator's Backlog / Ready-for-agent issues, then per ticket either posts 3-5 decision-extracting questions (state moves to "Question for <name>") or confirms it build-ready (state moves to "Grilled", the gate /ro:linear-nightshift consumes); shipped-and-confirmed tickets close as Done. The async-collaborator counterpart of /ro:day-shift for people who never touch GitHub. Triggers on "grill linear", "grill eoin's tickets", "linear grill", "add questions to the linear tickets", "/ro:linear-grill".
development
--- name: about-page description: Add a standard About page to any web app, what it is, the tech stack, and an FAQ, wired into a footer link with a sticky footer. Built with Spartan + Tailwind (the canonical component layer) and falls back to semantic HTML so it ships reliably. Use whenever building, polishing, or shipping an app, every app should have one. Triggers on "add an about page", "about page", "footer about link", or as a standard step in app build/polish. category: frontend argument-h