Dependency upgrade planner
Upgrades fail when they are done as one big bump. This skill turns "47 packages outdated" into an ordered list of small, reversible steps.
When to use
- After
composer outdated,npm outdated,pip list --outdatedor a Dependabot summary. - Before a framework major.
Input
The outdated report (name, current, wanted, latest), the lockfile, the CI status, and whether the project has an integration test suite.
Process
- Sort by blast radius. Framework and runtime first, then packages the code imports directly, then transitive-only.
- Classify each bump. Patch: batch them. Minor: batch per ecosystem, read release notes for the ones the code imports. Major: one at a time, always.
- Read, don't guess. For every major, find the upgrade guide or changelog and quote the breaking changes that touch this codebase — grep for the removed APIs and list the files.
- Order the majors so that each step leaves the build green: a package that requires a newer framework goes after the framework.
- Define the step's proof: which tests or smoke checks must pass before the next step.
Rules
- Never bundle a major with anything else.
- Version numbers are not evidence. "Minor" releases have broken people; read the notes for anything the code imports.
- If the project has no tests, say so first and propose the three smoke checks that stand in for them.
- Pin what you cannot upgrade yet, and say why (an abandoned package, a peer conflict) — with the issue link when there is one.
Output format
## Plan (6 steps)
1. Patch batch — 31 packages, no code touched. Proof: full test suite.
2. symfony/* 7.3 → 7.4 (minor) — reads: Console `Command::$defaultName` deprecation, used in app/Console/*. Proof: `php artisan list` + suite.
3. laravel/framework 12 → 13 (major) — breaking: … (3 items, files listed). Proof: suite + manual login flow.
...
## Held back
- intervention/image 2.x — 3.x renames the facade; touches 14 files. Separate PR.
License
MIT