Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Upgrade a project between versions of the Output framework. Use when the user asks to upgrade, migrate, or move to a newer Output version. Detects the current @outputai/* version in the project, fetches the matching migration guide from docs.output.ai, applies the changes, and verifies the project still type-checks.
.claude/skills/growthxai-output-migrate/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-14 | ✗→✓ | ▲ Improved | 113% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 62% | 0% |
| case-12 | ✓→✗ | ▼ Worse | 211% | 0% |
| case-20 | ✓→✗ | ▼ Worse | 28% | 0% |
| case-22 | ✓→✗ | ▼ Worse | -32% | 0% |
This skill migrates a project from one version of the Output framework to another.
You do not carry migration instructions in your own context. The docs site at https://docs.output.ai/migrations is the source of truth — fetch the right page and follow it.
Use the todo tool to track your progress.
@outputai/* packages to a newer versionMigration guides are hand-authored MDX pages linked from a single index:
https://docs.output.ai/migrationshttps://docs.output.ai/migrations/v{FROM_FULL}-to-v{TO_FULL} (e.g. v0.1.12-to-v0.2.0)The index lists every available guide with a title and a short description. A release only has a guide if it introduced breaking changes — most releases will not have one.
If the user is jumping multiple boundaries, fetch each applicable guide in order and apply them sequentially.
<process_flow>
<step number="0" name="arguments_analysis">
If the user passed arguments when invoking this skill, parse them as positional values in this order (all optional):
from-version: The version the project is currently on. If blank, detect it in Step 2.to-version: The target version. If blank, resolve it in Step 1.additional-instructions: Free-form guidance from the user (e.g. "skip the http changes, we don't use that package").</step>
<step number="1" name="detect_to_version">
If the user provided a to-version argument, use it.
Otherwise, run npm view @outputai/core version via Bash and use that as the target.
</step>
<step number="2" name="detect_from_version">
If the user provided a from-version argument, use it and skip the rest of this step.
Otherwise, read package.json at the project root and resolve the current framework version from the first entry that exists, in this order:
dependencies["@outputai/core"]devDependencies["@outputai/core"]dependencies["@outputai/cli"]Strip any leading ^ or ~. If no @outputai/* package is present, stop and tell the user: "This project doesn't depend on any @outputai/ packages — nothing to migrate."
If the version read from package.json equals the TO version, the user may have already edited package.json to the new version without running the migration yet. Don't give up — find the pre-bump version by looking in this order:
git diff package.json pnpm-lock.yaml package-lock.json yarn.lock 2>/dev/null and scan the diff for an @outputai/* version that was removed (lines starting with -). If you find one, that's the FROM version.git log -p -n 20 -- package.json and find the most recent commit that changed an @outputai/* version. The old value on that commit's parent side is the FROM version.package.json and git history show vX.Y.Z. Re-run with --from <version> to specify it explicitly."If FROM and TO still resolve to the same version after this recovery, stop and tell the user: "Already on vX.Y.Z — nothing to migrate."
</step>
<step number="3" name="fetch_migration_guide">
WebFetch https://docs.output.ai/migrations. This is the index page — it links to every hand-authored migration guide with a title keyed on the version boundary.
From the index, identify every guide whose v{FROM}-to-v{TO} range falls between the user's FROM and TO versions. Examples:
0.1.12, TO 0.2.0 → if a v0.1.12-to-v0.2.0 guide is listed, fetch it.0.1.12, TO 0.3.0 → fetch v0.1.12-to-v0.2.0 first, then (if listed) v0.2.0-to-v0.3.0.Fetch each applicable guide by hitting https://docs.output.ai/migrations/v{FROM_FULL}-to-v{TO_FULL}.
If the index lists no guides covering the FROM → TO range, stop and tell the user: "No migration guides found for vFROM → vTO. The releases in this range were additive; just bump your dependencies."
Also WebFetch https://docs.output.ai/changelog to cross-reference what shipped in the range — use it to fill in gaps the migration guides may not cover.
</step>
<step number="4" name="plan_changes">
From the fetched guide(s), produce a TodoWrite list of concrete changes, one todo per change. Do not start editing yet.
For each todo, capture:
If the user passed additional-instructions, honor them: skip todos they asked to skip, add todos they asked to add.
Print the plan and ask the user to confirm before proceeding. If they reject, stop.
</step>
<step number="5" name="apply_changes">
Work through each todo. For every todo:
in_progress before starting.completed when done.Do not batch completions — update TodoWrite after each one.
</step>
<step number="6" name="bump_dependencies">
Update every @outputai/* package and (if present) output-api entry in package.json to the TO version. The framework uses a fixed version group, so all packages move together.
Then run pnpm install (or npm install / yarn install — detect from the lockfile).
</step>
<step number="7" name="verify">
Run the project's type checker if one is configured (check package.json scripts for typecheck, tsc, or build).
If type checking fails, surface each error with the migration guide section that maps to it. Do not attempt silent fixes — report what broke.
If the project has no type check script, note that and recommend the user run their test suite.
</step>
<step number="8" name="summary">
Report:
Do not suggest additional commands or next steps — the CLI handles post-migration messaging.
</step>
</process_flow>
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 2,833 | 5,869 | +107% | 1 | 1 | 0% | 399 | 2,269 | +469% | 0 | 0 | — |
case-02 | fail→fail | 5,642 | 7,261 | +29% | 1 | 1 | 0% | 270 | 2,245 | +731% | 0 | 0 | — |
case-03 | fail→fail | 2,390 | 6,626 | +177% | 1 | 1 | 0% | 348 | 2,170 | +524% | 0 | 0 | — |
case-04 | fail→fail | 9,226 | 5,157 | -44% | 1 | 1 | 0% | 1,479 | 2,007 | +36% | 0 | 0 | — |
case-09 | fail→fail | 11,603 | 7,948 | -32% | 1 | 1 | 0% | 1,928 | 2,263 | +17% | 0 | 0 | — |
case-05 | fail→fail | 7,206 | 3,460 | -52% | 1 | 1 | 0% | 1,266 | 2,256 | +78% | 0 | 0 | — |
case-06 | fail→fail | 4,213 | 6,032 | +43% | 1 | 1 | 0% | 619 | 2,222 | +259% | 0 | 0 | — |
case-07 | fail→fail | 1,888 | 7,166 | +280% | 1 | 1 | 0% | 317 | 2,268 | +615% | 0 | 0 | — |
case-08 | fail→fail | 9,951 | 4,114 | -59% | 1 | 1 | 0% | 1,752 | 2,473 | +41% | 0 | 0 | — |
case-10 | fail→fail | 14,105 | 13,443 | -5% | 1 | 1 | 0% | 2,300 | 3,494 | +52% | 0 | 0 | — |
case-11 | fail→fail | 10,320 | 2,020 | -80% | 1 | 1 | 0% | 1,462 | 2,124 | +45% | 0 | 0 | — |
case-12 | pass→fail | 4,680 | 6,498 | +39% | 1 | 1 | 0% | 755 | 2,348 | +211% | 0 | 0 | — |
case-13 | fail→fail | 13,301 | 24,336 | +83% | 1 | 1 | 0% | 2,026 | 2,497 | +23% | 0 | 0 | — |
case-14 | fail→pass | 7,138 | 2,485 | -65% | 1 | 1 | 0% | 1,035 | 2,201 | +113% | 0 | 0 | — |
case-15 | fail→pass | 9,361 | 2,846 | -70% | 1 | 1 | 0% | 1,412 | 2,284 | +62% | 0 | 0 | — |
case-16 | pass→pass | 8,910 | 5,028 | -44% | 1 | 1 | 0% | 1,603 | 2,691 | +68% | 0 | 0 | — |
case-17 | fail→fail | 13,921 | 4,977 | -64% | 1 | 1 | 0% | 2,146 | 2,578 | +20% | 0 | 0 | — |
case-18 | pass→pass | 6,982 | 1,920 | -73% | 1 | 1 | 0% | 1,016 | 2,088 | +106% | 0 | 0 | — |
case-19 | fail→fail | 4,327 | 2,010 | -54% | 1 | 1 | 0% | 722 | 2,140 | +196% | 0 | 0 | — |
case-20 | pass→fail | 9,703 | 6,578 | -32% | 1 | 1 | 0% | 1,750 | 2,246 | +28% | 0 | 0 | — |
case-21 | pass→pass | 12,959 | 2,563 | -80% | 1 | 1 | 0% | 2,062 | 2,227 | +8% | 0 | 0 | — |
case-22 | pass→fail | 17,873 | 7,122 | -60% | 1 | 1 | 0% | 3,190 | 2,173 | -32% | 0 | 0 | — |
case-23 | fail→fail | 2,784 | 5,196 | +87% | 1 | 1 | 0% | 423 | 2,043 | +383% | 0 | 0 | — |
case-24 | pass→pass | 7,578 | 6,479 | -15% | 1 | 1 | 0% | 1,374 | 2,254 | +64% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 12 counted toward the lift figure. The other 12 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of -4 percentage points is the difference between those two pass rates over the 12 comparable cases. 5 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.