Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Upgrade project dependencies with breaking change research for major version updates. Use when the user asks to "update dependencies", "upgrade packages", "upgrade dependencies", "update deps", "upgrade deps", "update npm deps", "update Swift packages", "cargo update", "go get updates", "bundle update", or "pip upgrade".
.claude/skills/tobihagemann-update-dependencies/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 17% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 127% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 65% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 218% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 13% | 0% |
Upgrade project dependencies, researching breaking changes for major version updates.
Optional filter: $ARGUMENTS (e.g., react, Alamofire, serde tokio)
Run the $review-dependencies skill to detect package managers and discover available updates. If no updates are available, stop.
Present a summary showing:
Use request_user_input for upgrade strategy (Codex request_user_input allows up to 3 options per question, so the strategies are split across two questions):
Question 1 — Header: "Approach" Options:
When a major upgrade would force a migration that is costly to reverse, present a Get a second opinion option in place of All at once, keeping Question 1 at three options and leaving Major handling in place so Question 2 stays reachable. It runs the $consult-claude skill for which strategy the breaking changes warrant. Then resolve the strategy with that answer in hand, re-asking when the choice stays the user's. A freeform answer asking to upgrade everything together selects the All-at-once strategy.
If the user picks Major handling, ask a follow-up:
Question 2 — Header: "Major handling" Options:
For each package with a major version update:
Identify all major versions between current and target. For example:
react: 17.0.2 → 19.0.0 → research v18 AND v19 breaking changesAlamofire: 4.9.1 → 6.0.0 → research v5 AND v6 breaking changesSearch for migration documentation:
Web search: "[package-name] v[X] migration guide"
Web search: "[package-name] v[X] breaking changes"Common sources: GitHub releases page, official docs, changelog files.
Identify: API changes (renamed/removed functions), configuration changes, peer/transitive dependency requirements, behavioral changes, deprecated features now removed.
Use rg to find usage of deprecated or changed APIs. Document which files are affected and what changes are needed.
For each major update, present:
Use request_user_input to confirm (Codex request_user_input allows up to 3 options per question, so the four actions are split across two questions):
Question 1 — Header: "Decision" Options:
If the user picks Other action, ask a follow-up:
Question 2 — Header: "Other action" Options:
If "Show details" selected, display full migration research, then ask again.
First upgrade minor and patch only using the package manager's semver-respecting update command, then run tests. If tests fail, stop before proceeding with major upgrades.
Update the manifest file (version constraint) and run the install/resolve command. For package managers with a dedicated upgrade command, use it. For others (Swift PM, Maven, Gradle), edit the manifest directly.
Some ecosystems provide automated migration tools:
| Ecosystem | Migration tools | |---|---| | React | npx react-codemod [transform] | | Next.js | npx @next/codemod [transform] | | Jest | npx jest-codemods | | Angular | npx ng update | | Rust | cargo fix for edition migrations | | Python | pyupgrade, python-modernize |
For changes requiring manual intervention:
apply_patchIf configuration format changed, read current config, transform to new format, write updated config.
Some packages pin their version outside the manifest, beyond the package manager's reach, so a green local run hides the drift. For every upgraded package (major, minor, or patch), search CI and container configs for the old version string with rg "<old-version>" .github Dockerfile* docker-compose* .devcontainer and bump it in lockstep:
@playwright/test version.Dockerfile, .devcontainer/, and docker-compose.yml.actions/setup-node node-version, setup-python, toolchain files).Run the project's test, build, and lint commands. Detect which commands are available from the project's config files and scripts. Use project-level task runners when present (Makefile, Taskfile, justfile, npm scripts, etc.).
Summarize: packages upgraded (count), breaking changes addressed (count), files modified (count), test results, remaining manual tasks.
If any migrations could not be automated:
If the discovery tool is not installed, $review-dependencies will note it. Fall back to manual version checking via web search.
If web search/fetch fails: retry with alternative search terms, provide manual research links, proceed with caution warning that migration research may be incomplete.
If official migration docs are not found: check the package's repository for issues and discussions, note as "migration research incomplete — proceed with caution."
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 4,818 | 4,732 | -2% | 1 | 1 | 0% | 757 | 2,007 | +165% | 0 | 0 | — |
case-07 | pass→pass | 12,528 | 7,621 | -39% | 1 | 1 | 0% | 1,733 | 2,781 | +60% | 0 | 0 | — |
case-02 | fail→fail | 1,820 | 2,382 | +31% | 1 | 1 | 0% | 215 | 1,758 | +718% | 0 | 0 | — |
case-03 | fail→fail | 5,955 | 7,132 | +20% | 1 | 1 | 0% | 560 | 2,048 | +266% | 0 | 0 | — |
case-04 | pass→pass | 12,220 | 5,929 | -51% | 1 | 1 | 0% | 1,964 | 2,555 | +30% | 0 | 0 | — |
case-05 | fail→pass | 14,848 | 5,451 | -63% | 1 | 1 | 0% | 2,214 | 2,596 | +17% | 0 | 0 | — |
case-06 | fail→pass | 6,093 | 4,661 | -24% | 1 | 1 | 0% | 1,095 | 2,486 | +127% | 0 | 0 | — |
case-08 | fail→pass | 8,831 | 3,861 | -56% | 1 | 1 | 0% | 1,373 | 2,260 | +65% | 0 | 0 | — |
case-09 | pass→pass | 8,554 | 2,991 | -65% | 1 | 1 | 0% | 1,293 | 2,111 | +63% | 0 | 0 | — |
case-10 | pass→pass | 10,248 | 6,555 | -36% | 1 | 1 | 0% | 1,630 | 2,653 | +63% | 0 | 0 | — |
case-11 | fail→pass | 4,163 | 4,134 | -1% | 1 | 1 | 0% | 715 | 2,275 | +218% | 0 | 0 | — |
case-12 | fail→pass | 17,490 | 5,242 | -70% | 1 | 1 | 0% | 2,158 | 2,434 | +13% | 0 | 0 | — |
case-13 | fail→pass | 12,967 | 3,059 | -76% | 1 | 1 | 0% | 2,014 | 2,189 | +9% | 0 | 0 | — |
case-14 | fail→pass | 10,969 | 3,109 | -72% | 1 | 1 | 0% | 1,659 | 2,023 | +22% | 0 | 0 | — |
case-15 | fail→pass | 11,213 | 2,764 | -75% | 1 | 1 | 0% | 1,727 | 2,047 | +19% | 0 | 0 | — |
case-16 | fail→pass | 11,256 | 2,358 | -79% | 1 | 1 | 0% | 1,758 | 2,120 | +21% | 0 | 0 | — |
case-17 | fail→pass | 9,687 | 4,555 | -53% | 1 | 1 | 0% | 1,622 | 2,420 | +49% | 0 | 0 | — |
case-18 | pass→pass | 11,687 | 7,203 | -38% | 1 | 1 | 0% | 1,964 | 2,768 | +41% | 0 | 0 | — |
case-19 | pass→pass | 8,751 | 3,148 | -64% | 1 | 1 | 0% | 1,381 | 2,256 | +63% | 0 | 0 | — |
case-20 | fail→pass | 10,982 | 2,046 | -81% | 1 | 1 | 0% | 1,674 | 1,919 | +15% | 0 | 0 | — |
case-21 | pass→pass | 15,168 | 14,002 | -8% | 1 | 1 | 0% | 2,451 | 3,832 | +56% | 0 | 0 | — |
case-22 | pass→pass | 10,953 | 4,791 | -56% | 1 | 1 | 0% | 1,729 | 2,432 | +41% | 0 | 0 | — |
case-23 | pass→pass | 11,803 | 5,047 | -57% | 1 | 1 | 0% | 2,002 | 2,486 | +24% | 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. 23 cases were attempted, and 20 counted toward the lift figure. The other 3 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 +48 percentage points is the difference between those two pass rates over the 20 comparable cases.
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.