Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Upgrade all backend (.NET/NuGet), frontend (npm), and GitHub Actions dependencies to their latest versions, in that fixed order. Drives the developer CLI's update-packages command, parses its quiet dry-run output to separate trivial bumps from majors, ships trivial bumps as one bulk commit per side, and gives every major (and any code/config change) its own clean commit. Detects required toolchain installs (e.g. a new .NET SDK that needs sudo) and asks the user to run them up front so the backen
.claude/skills/platformplatform-upgrade-packages/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 136% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 282% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 46% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 42% | 0% |
| case-18 | ✗→✓ | ▲ Improved | -18% | 0% |
Bring all backend, frontend, and GitHub Actions dependencies to their latest versions. The project always runs the latest version of every package. Don't quit, give up, or recommend reverting just because something is non-trivial — research, debug, push through. The only acceptable reasons to skip an upgrade are the permanent exceptions below.
Every NuGet and npm bump goes through the developer CLI. Run it directly (the Bash hook allows dotnet run --project developer-cli, and the CLI runs its own dotnet/npm subprocesses without tripping the hook):
bashdotnet run --project developer-cli -- update-packages [--backend|--frontend] [--dry-run] [--exclude <csv>] [--include-major-framework-updates] --quiet
Always pass --quiet. In quiet mode the command prints no tables or banners — only parseable plain-text lines:
<side> <patch|minor|major> <package> <current> -> <new> [<extra>]
<side> restricted <package> <current> (latest <X> is a new major, pinned)
<side> excluded <package> <current>
summary <side> patch=<n> minor=<n> major=<n> excluded=<n> uptodate=<n><side> is backend or frontend. restricted lines are the permanent exceptions (pinned to their current major by the CLI). Use a --dry-run --quiet run to plan; parse the major lines to get the package names that need their own commit.
Run the build, format, lint, test, and e2e skills for all verification (never raw dotnet/npm).
These never move to a new major. The CLI enforces them itself (RestrictedNuGetPackages in developer-cli/Commands/UpdatePackagesCommand.cs), so you do not pass --exclude for them — they show up as restricted lines in the dry-run and are pinned to the latest version within their current major:
MediatR, FluentAssertions — later majors changed licensing/APIs.Microsoft.ApplicationInsights, Microsoft.ApplicationInsights.AspNetCore — the next major drops PageView tracking as part of moving to OpenTelemetry; the codebase uses PageView heavily and that migration is a separate effort.Note: frontend @microsoft/applicationinsights-* packages are not restricted and upgrade normally. .NET, Node.js, and @types/node stay within their current major unless you pass --include-major-framework-updates; don't cross a framework major as part of a routine package upgrade.
update-packages for every bump. Never hand-edit package.json / Directory.Packages.props or run raw npm / dotnet to move a version.developer-cli/Commands/UpdatePackagesCommand.cs, and commit that fix on its own. Working around a CLI bug by hand is unacceptable — the next person deserves the fix.build + lint per trivial commit; add e2e after majors that touch runtime, build tooling, or i18n; run format whenever code changes or after upgrading formatter/linter tooling. Run a full backend regression with e2e at the end of the backend phase, before the frontend, and a full regression for both sides at the very end. Fold any fix into the commit that caused it (see Fixing A Regression).When a regression run fails, the bad change belongs in an earlier commit — fold the fix there, don't tack a loose fix on the end. The branch isn't pushed yet, so rewriting local history is safe. Two patterns by cause:
git commit --fixup=<offending-commit> followed by git rebase --autosquash --interactive <base>.--exclude, or drop its version bump from the bulk commit via a fixup), then give it its own commit on top with the code change it needs — exactly like a major.Either way, keep every commit independently green and bisectable, and never move to the next phase with a red suite — the fix-up happens in the phase that caused it.
git status clean; build, lint, test green (run e2e if anything looks risky). Fix or stop if the baseline is broken before you start.update-packages --dry-run --quiet (no side flag covers both). Read the output and split each side into:patch and minor line.major line. Collect the package names; each becomes its own commit.(sdk) line (e.g. dotnet-sdk) and any ⚠️ … is NOT installed warning — these gate the backend and are handled first (step 3).restricted lines are the permanent exceptions — ignore them.dotnet-sdk (or other framework) bump whose target version is not installed locally, the backend update will abort: update-packages --backend exits when the required SDK is missing. You cannot install it yourself — it needs sudo/admin. Stop and ask the user to run the exact install command the dry-run printed (e.g. brew upgrade dotnet-sdk on macOS, winget upgrade Microsoft.DotNet.SDK.<major> on Windows), then wait for them to confirm. Re-run update-packages --dry-run --quiet and check that nothing is still flagged as not-installed before continuing. This keeps the backend first and unblocked — do not start the frontend while a backend toolchain install is pending.bash dotnet run --project developer-cli -- update-packages --backend --exclude <comma-separated backend majors> --quiet Then build --backend + lint --backend. When green, commit, e.g. Upgrade backend NuGet packages, dotnet tools, and SDK to latest minor and patch versions.
P (the only outstanding backend updates after the bulk are the majors, so exclude the other majors to move just P):bash dotnet run --project developer-cli -- update-packages --backend --exclude <every other backend major> --quiet Research P's changelog, make the required code changes, adopt cheap new features, run build/format/lint/test (+ e2e if it touches runtime), and commit P and its changes together, e.g. Upgrade <Package> to <version> and <what changed>.
e2e, before the frontend — with every backend commit in place, run the full backend suite: build --backend, format --backend, lint --backend, test, and e2e. The backend must be fully green here, before any frontend work begins — that way a failure is unambiguously a backend regression and its fix lands in a backend commit. If it fails, fix it up now (see Fixing A Regression); never carry a red backend suite into the frontend phase.--frontend. The CLI runs npm install and npm audit fix for you. Then build --frontend + lint --frontend (+ format --frontend since the install may reformat). Commit, e.g. Upgrade frontend npm dependencies to latest minor and patch versions.--frontend. Formatter/linter majors (oxfmt, oxlint) and i18n/build-tool majors warrant a format + e2e pass. One commit per major..github/workflows/*.yml (not covered by update-packages):uses: <action>@vN to its latest major (e.g. actions/checkout, actions/setup-node, actions/setup-dotnet, actions/setup-java, actions/upload-artifact, actions/download-artifact, actions/github-script, azure/login, docker/setup-buildx-action).runs-on: runners to the current Ubuntu LTS image (e.g. ubuntu-24.04).with: (node-version, and any others) to match the project's runtime.Verify nothing else references an old version; commit, e.g. Upgrade GitHub Actions and runner images to latest versions.
build, format, lint, test, e2e. If anything fails, fix it up in the commit that caused it (see Fixing A Regression) rather than tacking a fix on the end. Then summarise to the user: what moved, what was skipped (with reason), what was adopted, what's deferred.Every non-exception package on its latest version. Trivial bumps in one bulk commit per side; each major and each code/config change in its own clear commit; GitHub Actions current. The CLI is better than when you started — every bug you tripped over is fixed at the source and committed separately. build, format, lint, test, and e2e all green at HEAD.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 2,505 | 5,441 | +117% | 1 | 1 | 0% | 254 | 3,085 | +1115% | 0 | 0 | — |
case-02 | fail→fail | 2,742 | 5,568 | +103% | 1 | 1 | 0% | 304 | 2,859 | +840% | 0 | 0 | — |
case-03 | fail→fail | 25,231 | 4,548 | -82% | 1 | 1 | 0% | 4,066 | 2,878 | -29% | 0 | 0 | — |
case-04 | fail→pass | 8,662 | 3,366 | -61% | 1 | 1 | 0% | 1,328 | 3,136 | +136% | 0 | 0 | — |
case-05 | fail→pass | 4,551 | 2,710 | -40% | 1 | 1 | 0% | 800 | 3,057 | +282% | 0 | 0 | — |
case-06 | fail→fail | 8,149 | 3,040 | -63% | 1 | 1 | 0% | 1,391 | 3,084 | +122% | 0 | 0 | — |
case-07 | fail→pass | 13,769 | 2,575 | -81% | 1 | 1 | 0% | 2,029 | 2,964 | +46% | 0 | 0 | — |
case-08 | fail→pass | 15,670 | 6,300 | -60% | 1 | 1 | 0% | 2,580 | 3,653 | +42% | 0 | 0 | — |
case-09 | pass→pass | 10,375 | 4,166 | -60% | 1 | 1 | 0% | 1,713 | 3,199 | +87% | 0 | 0 | — |
case-18 | fail→pass | 20,699 | 1,635 | -92% | 1 | 1 | 0% | 3,376 | 2,785 | -18% | 0 | 0 | — |
case-10 | fail→pass | 12,946 | 3,188 | -75% | 1 | 1 | 0% | 2,044 | 3,048 | +49% | 0 | 0 | — |
case-11 | fail→pass | 9,834 | 1,963 | -80% | 1 | 1 | 0% | 1,505 | 2,835 | +88% | 0 | 0 | — |
case-12 | fail→pass | 12,731 | 3,594 | -72% | 1 | 1 | 0% | 2,110 | 3,136 | +49% | 0 | 0 | — |
case-13 | fail→pass | 10,865 | 2,852 | -74% | 1 | 1 | 0% | 1,701 | 3,016 | +77% | 0 | 0 | — |
case-14 | pass→pass | 11,368 | 3,831 | -66% | 1 | 1 | 0% | 1,749 | 3,183 | +82% | 0 | 0 | — |
case-15 | fail→fail | 15,557 | 1,443 | -91% | 1 | 1 | 0% | 2,586 | 2,755 | +7% | 0 | 0 | — |
case-16 | pass→pass | 8,627 | 5,760 | -33% | 1 | 1 | 0% | 1,514 | 3,576 | +136% | 0 | 0 | — |
case-17 | fail→pass | 10,156 | 4,420 | -56% | 1 | 1 | 0% | 1,589 | 3,293 | +107% | 0 | 0 | — |
case-19 | pass→pass | 2,611 | 1,949 | -25% | 1 | 1 | 0% | 417 | 2,884 | +592% | 0 | 0 | — |
case-20 | pass→pass | 4,397 | 3,450 | -22% | 1 | 1 | 0% | 750 | 3,053 | +307% | 0 | 0 | — |
case-21 | pass→pass | 3,485 | 2,726 | -22% | 1 | 1 | 0% | 584 | 2,987 | +411% | 0 | 0 | — |
case-22 | pass→fail | 3,453 | 2,280 | -34% | 1 | 1 | 0% | 468 | 2,910 | +522% | 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. 22 cases were attempted, and 19 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 +41 percentage points is the difference between those two pass rates over the 19 comparable cases. 2 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.