Agentic .NET Framework -> modern .NET upgrade skill, packaged with deterministic CLI helpers (baseline build capture, graphify knowledge-graph wiring, task scaffolding/tracking) and one-command installers for Claude Code, Cursor, Codex, and other agent tools.
Project description
dotnet-modernize
An agentic .NET Framework → modern .NET upgrade workflow (assessment → plan → build-validated execution, in the style of Visual Studio Copilot's "Modernize" agent), packaged for pip with:
- One-command install of the skill (
SKILL.md+references/) into Claude Code's skill directory (or any other agent tool via--dest). - Deterministic CLI helpers for the parts of the workflow that don't need
an LLM: scenario scaffolding, baseline build capture, wiring up the
graphify knowledge graph, and
tracking
tasks.mdcompletion.
The reasoning-heavy stages — reading the codebase, deciding the upgrade
strategy, diagnosing build errors — are not reimplemented in Python.
That's what the bundled skill is for: point an agent (Claude Code, or any
tool that can read a SKILL.md) at your solution and let it run the
workflow, using this CLI underneath for the mechanical bits.
Install
pip install dotnet-modernize
# or: pipx install dotnet-modernize / uv tool install dotnet-modernize
Quickstart
cd path/to/your/solution
# 1. Put the skill where your agent will find it
dotnet-modernize install # -> .claude/skills/dotnet-modernize/
# 2. Scaffold an upgrade scenario
dotnet-modernize init dotnet-version-upgrade --target-tfm net10.0
# 3. Capture the pre-upgrade baseline (never edits code)
dotnet-modernize baseline dotnet-version-upgrade
# 4. Build the knowledge graph the agent will query during assessment/execution
dotnet-modernize graph --auto-install
# 5. Hand off to your agent:
# "Upgrade this solution to net10.0 using scenario dotnet-version-upgrade,
# following the dotnet-modernize skill."
# 6. Check progress any time (reads tasks.md, no agent needed)
dotnet-modernize status dotnet-version-upgrade
Commands
| Command | What it does |
|---|---|
install [--target claude-project|claude-user|generic] [--dest PATH] [--force] |
Copies the bundled skill folder into an agent's skill directory. |
uninstall |
Removes a previously installed copy. |
init SCENARIO_ID [--target-tfm] [--scope] [--solution-name] |
Creates .github/upgrades/<id>/ with scenario-instructions.md and tasks.md skeletons. |
list |
Lists existing scenarios. |
archive SCENARIO_ID |
Renames a scenario folder with a timestamp so a new run can start clean without losing history. |
baseline SCENARIO_ID [--solution PATH] [--no-tests] |
Runs dotnet restore/build/test as-is and writes baseline-log.txt. Read-only w.r.t. source. |
graph [--path] [--auto-install] |
Runs graphify extract at the solution root; prints the report path. |
query "<question>" [--path] |
Queries an existing graph without an agent in the loop. |
update-graph [--path] |
Incrementally refreshes the graph after a committed task. |
status SCENARIO_ID |
Parses tasks.md checkboxes and shows completion %. |
doctor |
Checks for dotnet, git, graphify, and whether the skill/scenarios exist. |
Why a hybrid (skill + CLI) instead of pure Python?
Upgrading a real solution requires judgment a script can't safely automate: classifying a WCF server as a rewrite, deciding bottom-up vs top-down order, root-causing a build error to the correct breaking-change entry instead of pattern-spraying fixes. That's delegated to an LLM agent reading the skill. Everything around that judgment — is git clean, does it build today, is the graph fresh, how many tasks are left — is exactly the kind of thing that should be a boring, deterministic, testable CLI command instead of something re-derived by the agent every session. This package draws that line explicitly instead of blurring it.
What's bundled
src/dotnet_modernize/skill_data/
├── SKILL.md
└── references/
├── artifact-templates.md
├── breaking-changes-catalog.md
├── project-type-playbooks.md
├── knowledge-graph.md
├── frontend-and-static-assets.md
└── graphify/ # graphify's own canonical agent workflow, embedded
├── PIPELINE.md
├── query.md
├── update.md
├── extraction-spec.md
├── hooks.md
├── github-and-merge.md
└── transcribe.md
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dotnet_modernize-0.1.0.tar.gz.
File metadata
- Download URL: dotnet_modernize-0.1.0.tar.gz
- Upload date:
- Size: 64.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
75dd9ad267670c0ced073b9ccc0826124e5b803a107566f7d8264a7755caf26e
|
|
| MD5 |
0d735fc2cdcd09c6fd38035fae030e92
|
|
| BLAKE2b-256 |
ce96d768943a0e74cb778ab1437135e0bbe2040eb2e8854676d3a3197149a767
|
File details
Details for the file dotnet_modernize-0.1.0-py3-none-any.whl.
File metadata
- Download URL: dotnet_modernize-0.1.0-py3-none-any.whl
- Upload date:
- Size: 74.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ab661f88181b4d2dfcb6120cf961a70971f8d1fcbfa1854dbc43df50f9617d50
|
|
| MD5 |
5a163a5f5990439ad7a7f72cece753d3
|
|
| BLAKE2b-256 |
a5e4d4afa50eaa4a31f3f3e41a2e36f4cc36ef8895f3a31d7e794091fcf102b7
|