microsoft/dotnet-version-upgrade
Upgrade .NET projects to newer .NET versions, including guidance on current release status, support lifecycle (LTS/STS), and recommended upgrade targets.
npx skills add https://github.com/microsoft/upgrade-agent-plugins --skill dotnet-version-upgrade
Upgrade .NET projects from their current target framework to a newer version of .NET.
<!-- Last updated: 2025-11-12 -->
| Version | Status | Support Level | End of Life |
|---------|--------|---------------|-------------|
| .NET 10 | GA | LTS | 2028-11-14 |
| .NET 9 | GA | STS | 2026-11-10 |
| .NET 8 | GA | LTS | 2026-11-10 |
| .NET 11 | Preview | — | 2030-11-12 (projected) |
> Staleness check: If the user asks about a version listed as Preview above, verify its current status using an internet search tool before answering — it may have shipped since this data was last updated.
Goal: Migrate one or more .NET projects to a target framework version while maintaining functionality.
Run these stages in order:
initialize_scenario, and write scenario-instructions.md. Consumed during pre-initialization by the dedicated DotnetVersionScenarioInitializer gatherer. Tool: get_dotnet_upgrade_options.assessment.md.plan.md.tasks/*/task.md. Uses the executor's execution steps.This section is consumed during pre-initialization by the dedicated DotnetVersionScenarioInitializer
gatherer. It defines the scenario-specific parameters and tools for this scenario.
Step 1: Call get_dotnet_upgrade_options(solutionPath, projectPath, targetFramework) to get:
Step 2: Assemble the confirmFields list — one entry per user-confirmable parameter, in
display order: Target Framework first (suggested value first, then the available frameworks
from get_dotnet_upgrade_options), then flow mode, then — only in a git repo — the working
branch and commit strategy. These feed the single combined confirmation.
One combined confirmation: the framework is one parameter among several. It MUST appear
in the same single confirmation — alongside flow mode, source-control (git only), and any other
gathered parameters — never as its own separate question.
Step 3 — With confirmFields, git facts, and initializeDescription assembled, proceed to the
combined confirmation and then to initialize_scenario.
IMPORTANT: Load each stage's instructions file only when entering that stage (not all upfront).
When entering this stage, load: assessment.md *(read completely - contains 3 required steps)*
Analyzes the solution and produces the assessment document:
Assessment gatherer: this stage is handled by the dedicated DotnetVersionAssessor (the generic
Assessor is the fallback if the dedicated one is unavailable or returns BLOCKED). It works from
these inputs:
scenario id, repo/workspace path, and the workflow folderinputMode, paths, targetFrameworkscenario-instructions.md path (fallback source)When entering this stage, load: planning.md *(read completely - contains 5 steps)*
Confirms upgrade options (including strategy) and creates the plan:
confirmation; the confirmed selections are persisted before the plan is generated
When entering this stage, load: execution.md *(read completely - contains 7 sections)*
Executes the upgrade tasks using the executor's core task-execution steps:
(stub resolution subtasks, package replacement research, multi-targeting mechanics)
Build errors after upgrade:
Circular dependencies:
Incompatible packages:
Take microsoft/dotnet-version-upgrade from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.