Upgrade a major dependency
Upgrades a library or framework across major versions using the official migration notes, fixes what breaks, and proves the result with before-and-after checks. Use for any breaking upgrade.
Major upgrades fail in two ways: breaking changes that nobody noticed until production, and "fixes" that silence the compiler or the tests instead of adapting the code. Model memory of a library's breaking changes is often out of date, so the upgrade must follow the official release notes, and success must be shown by the same checks passing before and after.
Upgrade to . Only if [NOTES] is given: Notes:
- Find the current version in the manifest and lockfile, every place the code uses the dependency, and the packages that depend on it or must move with it (plugins, type packages, peer dependencies).
- Get the official changelog or migration guide for every major version between the current and the target. Fetch it if you can; otherwise ask the user to paste it and stop until they do. Do not rely on memory for the list of breaking changes.
- Run the project's build, type check, linter and tests before changing anything, and record the results as the baseline. Find the commands in the repo's scripts or docs.
- Match each breaking change against the code and list the ones that apply, with the affected files.
- Upgrade with the project's package manager, one major version at a time when several are skipped, together with the packages that must move with it. Use the official codemod when one exists, then review its output.
- Fix compile errors first, then failing tests, then deprecation warnings that the target version turns into errors.
- Run the same checks as the baseline and compare.
- Upgrade only what this upgrade requires. No unrelated version bumps, refactors or formatting.
- Never edit the lockfile by hand; let the package manager write it.
- Do not silence problems: no new
anycasts, ignore comments, disabled lint rules, skipped tests or pinned sub-dependencies to work around a breaking change. - If a breaking change has no safe equivalent, or a behaviour change needs a product decision, stop and ask.
- Fix the behaviour, not the test. Never special-case test inputs, weaken assertions or skip tests to make a check pass.
- If a test looks wrong, explain why and ask before changing it.
- Before saying the work is done, run the check that proves it (tests, build, type check or the command the user gave) and report the real result.
- If you could not run a check, say so plainly and say which one.
- Do only what was asked. If you notice something else worth changing, mention it in one line at the end instead of changing it.
- Keep the change as small as it can be while still being correct.
Summary
One line: from version, to version, and whether all checks pass.
Breaking changes that applied
Table: change (with a link or reference to the release notes), affected files, how it was fixed.
Changes made
Bullets, grouped by file or area.
Verification
Table: check, command, before, after.
Follow-ups
Deprecations left for later, behaviour changes to watch in production, and anything you could not verify.
1 required value still a placeholder; the assistant will ask for it.
details
- kind
- Prompt: a task you run by name to get one finished thing back
- domain
- Software engineering
- category
- Migration
- level
- Intermediate
- made for
- Software engineer, Open-source maintainer
- needs
- repo-read, file-write, shell
- risk
- runs-commands
- version
- v1.0.0 · experimental
- reviewed
- 2026-10-02
- works in
- Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Antigravity, OpenCode, Windsurf, Zed, Continue, AGENTS.md
use in
npx @hermes-hq/hodios install upgrade-major-dependency --target claude-codenpx skills add hermes-hq/hodios-dist --skill upgrade-major-dependency -a claude-codeclaude plugin marketplace add hermes-hq/hodios-distclaude plugin install hodios-software-engineering@hodiosThe plugin brings every entry in this domain at once.
more in migration
All of MigrationMigrate JavaScript to TypeScript
Plans and carries out an incremental JavaScript-to-TypeScript migration with config, file order, typed boundaries and a strictness ratchet. Use to move a JS codebase without a freeze.
migrate-javascript-to-typescriptPlan an incremental migration
Plans a framework, platform or system migration as small reversible phases using the strangler fig pattern, with data strategy, verification and rollback per phase. Use instead of a big-bang rewrite.
plan-incremental-migrationAdopt strict type checking module by module
Moves a Python or TypeScript codebase to strict type checking one module at a time, fixing real bugs found and ratcheting config so coverage never slides back. Use to adopt strict mode safely.
adopt-strict-typing-trackConvert class components to hooks
Converts React class components to function components with hooks, mapping lifecycles to effects correctly and keeping refs, error boundaries and behaviour, one component at a time with tests.
convert-class-components-to-hooksDependency update sweep track
Brings a project with many outdated dependencies up to date in gated steps, with a risk-ranked inventory, a patch and minor batch, majors one at a time, then lockfile hygiene and update automation.
dependency-update-sweep-trackInventory deprecated API usage
Groups deprecation warnings and deprecated API usages by replacement before an upgrade, estimates effort per group and orders the work into small changes that ship on the current version.
inventory-deprecated-api-usage