[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-dotnet-convert-to-cpm":3,"mdc--m1ni2j-key":34,"related-org-dotnet-convert-to-cpm":1463,"related-repo-dotnet-convert-to-cpm":1630},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":29,"sourceUrl":32,"mdContent":33},"convert-to-cpm","migrate .NET projects to NuGet CPM","Convert .NET projects and solutions (.sln, .slnx) to NuGet Central Package Management (CPM) using Directory.Packages.props. USE FOR: converting to CPM, centralizing or aligning NuGet package versions across multiple projects, inlining MSBuild version properties from Directory.Build.props into Directory.Packages.props, resolving version conflicts or mismatches across a solution or repository, updating or bumping or syncing package versions across projects. Also activate when packages are out of sync, drifting, or inconsistent -- even without the user mentioning CPM. Provides baseline build capture, version conflict resolution, build validation with binlog comparison, and a structured post-conversion report. DO NOT USE FOR: packages.config projects (must migrate to PackageReference first) or repositories that already have CPM fully enabled.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"dotnet",".NET (Microsoft)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdotnet.png",[12,16,19],{"name":13,"slug":14,"type":15},"Packaging","packaging","tag",{"name":17,"slug":18,"type":15},".NET","net",{"name":20,"slug":21,"type":15},"Migration","migration",4576,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills","2026-07-12T08:24:23.859262","MIT",332,[28],"agent-skills",{"repoUrl":23,"stars":22,"forks":26,"topics":30,"description":31},[28],"Repository for skills to assist AI coding agents with .NET and C#","https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills\u002Ftree\u002FHEAD\u002Fplugins\u002Fdotnet-nuget\u002Fskills\u002Fconvert-to-cpm","---\nname: convert-to-cpm\ndescription: >\n  Convert .NET projects and solutions (.sln, .slnx) to NuGet Central Package Management\n  (CPM) using Directory.Packages.props. USE FOR: converting to CPM, centralizing or\n  aligning NuGet package versions across multiple projects, inlining MSBuild version\n  properties from Directory.Build.props into Directory.Packages.props, resolving version\n  conflicts or mismatches across a solution or repository, updating or bumping or syncing\n  package versions across projects. Also activate when packages are out of sync, drifting,\n  or inconsistent -- even without the user mentioning CPM. Provides baseline build capture,\n  version conflict resolution, build validation with binlog comparison, and a structured\n  post-conversion report. DO NOT USE FOR: packages.config projects (must migrate to\n  PackageReference first) or repositories that already have CPM fully enabled.\nlicense: MIT\n---\n\n# Convert to Central Package Management\n\nMigrate .NET projects from per-project package versioning to NuGet Central Package Management (CPM). CPM centralizes all package versions into a single `Directory.Packages.props` file, making version governance and upgrades easier across multi-project repositories.\n\n## When to Use\n\n- The user wants to adopt Central Package Management for a .NET repository, solution, or project\n- Package versions are scattered across many `.csproj`, `.fsproj`, or `.vbproj` files and the user wants a single source of truth\n- The user mentions `Directory.Packages.props`, CPM, or centralizing NuGet versions\n- The user wants to update, bump, upgrade, align, or sync a NuGet package version across multiple projects -- CPM is the recommended approach for managing shared package versions, so suggest converting to CPM as part of the update if the projects use `PackageReference` and CPM is not already enabled\n- Package versions are out of sync, conflicting, or mismatched across projects and the user wants to resolve or unify them\n\n## When Not to Use\n\n- The repository already has CPM fully enabled for all in-scope projects\n- The user is working with `packages.config`-based projects (must first migrate to `PackageReference`)\n- The user wants to manage versions via a custom MSBuild property file without using CPM\n\n## Inputs\n\n| Input | Required | Description |\n|-------|----------|-------------|\n| Scope | Yes | A project file, solution file, or directory containing .NET projects to convert |\n| Version conflict strategy | No | How to resolve cases where the same package has different versions across projects. When conflicts are detected, do not assume a default strategy -- ask the user which strategy to use or explicitly confirm a proposed strategy before proceeding. |\n\n## Workflow\n\n### Step 1: Determine scope\n\n- **Single project**: User specifies a `.csproj`, `.fsproj`, or `.vbproj`.\n- **Solution**: User specifies a `.sln` or `.slnx`. List projects with `dotnet sln list`.\n- **Repository\u002Fdirectory**: No specific file given. Find all project files recursively from the first common ancestor directory of all .NET projects in scope.\n\nIf the scope is unclear, ask the user.\n\n**Guard: Check for packages.config projects.** Before proceeding, check whether any project in scope uses `packages.config` instead of `PackageReference`. Look for `packages.config` files alongside project files. If any `packages.config` usage is detected, **stop and do not proceed with the conversion**. Inform the user that CPM requires projects with `PackageReference` format and that they must first migrate from `packages.config` to `PackageReference` (e.g., using Visual Studio's built-in migration or the `dotnet migrate` tooling). This skill cannot perform that migration.\n\n### Step 2: Establish baseline build\n\nBefore making any changes, verify the scope builds successfully and capture a baseline binlog and package list. Run `dotnet clean`, then `dotnet build -bl:baseline.binlog`, then `dotnet package list --format json > baseline-packages.json`. Read [baseline-comparison.md](references\u002Fbaseline-comparison.md) for the full procedure and fallback options. If the baseline build fails, stop and inform the user -- the scope must build cleanly before conversion. Do not delete `baseline.binlog` or `baseline-packages.json` -- they are needed for the post-conversion comparison and report.\n\n### Step 3: Check for existing CPM\n\nSearch for any existing `Directory.Packages.props` in scope or ancestor directories. If CPM is already fully enabled, inform the user and stop. If a `Directory.Packages.props` exists without CPM enabled, ask whether to add the property to the existing file or create a new one.\n\n### Step 4: Audit package references\n\nRun `dotnet package list --format json` to get the resolved package references across all in-scope projects. Also scan `\u003CImport>` elements to discover shared `.props`\u002F`.targets` files containing package references.\n\nCheck for complexities: version conflicts, MSBuild property-based versions, conditional references, security advisories, and existing `VersionOverride` usage. Read [audit-complexities.md](references\u002Faudit-complexities.md) for the full checklist.\n\nPresent audit results to the user before proceeding, including:\n- A table of each package, its version(s), and which projects use it\n- Any version conflicts, security advisories, or complexities requiring decisions\n\nWhen version conflicts exist, present each one individually with the affected projects, the distinct versions found, and the resolution options (align to highest, use `VersionOverride`, etc.) with their trade-offs. Do not upgrade any package beyond the highest version already in use across the scope -- this avoids introducing version incompatibilities or breaking changes that are unrelated to the CPM conversion itself. Note any known security advisories or other upgrade opportunities as follow-up items for the user to address after the conversion is complete. Ask the user to decide on each conflict before proceeding. Read [audit-complexities.md - Same package with different versions](references\u002Faudit-complexities.md) for the resolution workflow and presentation format.\n\n### Step 5: Create or update Directory.Packages.props\n\nCreate the file with `dotnet new packagesprops` (.NET 8+) or manually. Add a `\u003CPackageVersion>` entry for each unique package sorted alphabetically. For conditional versions or `VersionOverride` patterns, read [directory-packages-props.md](references\u002Fdirectory-packages-props.md).\n\n### Step 6: Update project files\n\nRemove the `Version` attribute from every `\u003CPackageReference>` that now has a corresponding `\u003CPackageVersion>`. Also update any shared `.props`\u002F`.targets` files identified in step 4.\n\n- Preserve all other attributes (`PrivateAssets`, `IncludeAssets`, `ExcludeAssets`, `GeneratePathProperty`, `Aliases`)\n- Preserve conditional `\u003CItemGroup>` elements -- only remove the `Version` attribute within them\n- Retain each file's existing indentation style (spaces vs. tabs, indentation depth) and blank lines -- do not reformat or reorganize unchanged lines\n- Use `VersionOverride` (with user confirmation) when a project needs a different version than the central one\n\n### Step 7: Handle MSBuild version properties\n\nFor `PackageReference` items that used MSBuild properties for versions, determine whether to inline the resolved value or keep the property reference in `Directory.Packages.props`. After validation succeeds in step 8, remove inlined version properties from `Directory.Build.props` or other files, verifying they have no remaining references. Read [msbuild-property-handling.md](references\u002Fmsbuild-property-handling.md) for the decision workflow, import order requirements, and cleanup procedure.\n\n### Step 8: Restore and validate\n\nRun a clean restore and build, capturing a post-conversion binlog and package list. Run `dotnet clean`, then `dotnet build -bl:after-cpm.binlog`, then `dotnet package list --format json > after-cpm-packages.json`. Read [baseline-comparison.md](references\u002Fbaseline-comparison.md) for the full procedure. If errors occur, read [validation-and-errors.md](references\u002Fvalidation-and-errors.md) for NuGet error codes and multi-TFM guidance.\n\n**Do not delete or clean up any artifacts** (`baseline.binlog`, `after-cpm.binlog`, `baseline-packages.json`, `after-cpm-packages.json`). These files must be preserved for the user to inspect after the conversion. They are deliverables, not temporary files.\n\n### Step 9: Post-conversion report\n\n**You must create a `convert-to-cpm.md` file** alongside the binlog and JSON artifacts. Do not skip this step or substitute inline chat output for the file -- the user needs a persistent, shareable document. This file should be self-contained and shareable -- suitable for a pull request description, a team review, or a record of what was done. Structure the report with the following sections:\n\n#### Section 1: Conversion overview\n\nSummarize what was converted: the scope (project, solution, or repository), number of projects converted, total packages centralized, any projects or packages that were skipped, and any MSBuild properties that were inlined or removed. This gives the reader immediate context.\n\n#### Section 2: Version conflict resolutions\n\nIf any version conflicts were encountered, list each one with:\n\n- The package name and all versions that were found across projects\n- Which projects used each version\n- What the user decided (aligned to highest, used `VersionOverride`, etc.)\n- The practical impact: which projects now resolve a different version than before, and which are unchanged\n\nIf no conflicts were found, state that all packages had consistent versions across projects -- this is a positive signal worth noting.\n\n#### Section 3: Package comparison -- baseline vs. result\n\nCompare `baseline-packages.json` and `after-cpm-packages.json` per project. See [baseline-comparison.md](references\u002Fbaseline-comparison.md) for the comparison procedure. Present two tables:\n\n- **Changes table**: Packages where the resolved version changed, a `VersionOverride` was introduced, or a package was added\u002Fremoved. Include a status column explaining what changed and why (e.g., \"VersionOverride -- project retains pinned version\", \"Aligned to highest version\").\n- **Unchanged table**: All other packages, confirming they resolve identically to baseline.\n\nIf there are no changes at all, state that the conversion is fully version-neutral -- this is the ideal outcome and provides reassurance.\n\n#### Section 4: Risk assessment\n\nProvide a clear confidence statement:\n\n- **[Low risk]** -- Conversion is version-neutral; all packages resolve to the same versions as baseline. The build and restore succeeded. Recommend running `dotnet test` as a final check.\n- **[Moderate risk]** -- Some packages changed versions (e.g., minor\u002Fpatch alignment). List the affected packages and projects. Recommend reviewing the changes table and running `dotnet test` to verify no regressions.\n- **[High risk]** -- Major version changes were applied, or packages were added\u002Fremoved unexpectedly. Recommend careful review, running `dotnet test`, and comparing binlogs before merging.\n\nCall out any specific warnings: `VersionOverride` usage that partially undermines centralization, or MSBuild property removal that could affect other build logic.\n\n#### Section 5: Follow-up items\n\nList any items identified during the conversion that the user should address separately after the CPM conversion is complete. These are intentionally out of scope for the conversion itself but important for the user to act on. Common follow-up items include:\n\n- **Security advisories**: If any package versions are known to have security vulnerabilities (detected via `dotnet package list --vulnerable` or noted during the audit), list each advisory with the package name, current version, affected projects, and the minimum patched version. These upgrades are out of scope for the CPM conversion to avoid introducing version incompatibilities or breaking changes.\n- **Deprecated packages**: If any packages are deprecated, note the recommended replacement.\n- **Version alignment opportunities**: If `VersionOverride` was used to preserve differing versions, note that the user may want to align these in the future once the affected projects can be validated against the central version.\n- **Test validation**: Recommend running `dotnet test` to validate runtime behavior beyond build success, especially if any version conflicts were resolved by aligning to the highest version.\n\nPresent follow-up items as a numbered checklist so the user can track them.\n\n#### Section 6: Artifacts and how to use them\n\nList the artifacts produced during conversion and explain how to use them:\n\n- **`baseline.binlog`** and **`after-cpm.binlog`** -- MSBuild binary logs captured before and after conversion. These are available for manual validation and troubleshooting if needed.\n- **`baseline-packages.json`** and **`after-cpm-packages.json`** -- Machine-readable snapshots of resolved package versions per project, used to produce the comparison tables above.\n- **`convert-to-cpm.md`** -- This report file, suitable for use as a pull request description or team review artifact.\n\nRecommend the user run `dotnet test` to validate runtime behavior beyond build success. If any version conflicts were resolved by aligning to the highest version, recommend reviewing the release notes for the affected packages.\n\n## Validation\n\n- [ ] Baseline build succeeded before any changes were made\n- [ ] `Directory.Packages.props` exists with `ManagePackageVersionsCentrally` set to `true`\n- [ ] Every in-scope `PackageReference` either has no `Version` attribute or uses `VersionOverride`\n- [ ] Every referenced package has a corresponding `PackageVersion` entry\n- [ ] `dotnet restore` and `dotnet build` complete without errors from a clean state\n- [ ] Package list comparison shows no unexpected version changes\n- [ ] No orphaned version properties remain (unless intentionally kept)\n\n## More Info\n\n- [Central Package Management documentation](https:\u002F\u002Fgithub.com\u002FNuGet\u002Fdocs.microsoft.com-nuget\u002Fblob\u002Fmain\u002Fdocs\u002Fconsume-packages\u002FCentral-Package-Management.md)\n- [Validation and common errors](references\u002Fvalidation-and-errors.md)\n",{"data":35,"body":36},{"name":4,"description":6,"license":25},{"type":37,"children":38},"root",[39,48,63,70,139,145,178,184,253,259,266,341,346,420,426,478,484,503,509,546,567,572,585,604,610,645,651,692,772,778,813,819,858,895,901,919,926,931,937,942,972,977,983,1008,1038,1043,1049,1054,1119,1131,1137,1142,1207,1212,1218,1223,1283,1295,1301,1435,1441],{"type":40,"tag":41,"props":42,"children":44},"element","h1",{"id":43},"convert-to-central-package-management",[45],{"type":46,"value":47},"text","Convert to Central Package Management",{"type":40,"tag":49,"props":50,"children":51},"p",{},[52,54,61],{"type":46,"value":53},"Migrate .NET projects from per-project package versioning to NuGet Central Package Management (CPM). CPM centralizes all package versions into a single ",{"type":40,"tag":55,"props":56,"children":58},"code",{"className":57},[],[59],{"type":46,"value":60},"Directory.Packages.props",{"type":46,"value":62}," file, making version governance and upgrades easier across multi-project repositories.",{"type":40,"tag":64,"props":65,"children":67},"h2",{"id":66},"when-to-use",[68],{"type":46,"value":69},"When to Use",{"type":40,"tag":71,"props":72,"children":73},"ul",{},[74,80,109,121,134],{"type":40,"tag":75,"props":76,"children":77},"li",{},[78],{"type":46,"value":79},"The user wants to adopt Central Package Management for a .NET repository, solution, or project",{"type":40,"tag":75,"props":81,"children":82},{},[83,85,91,93,99,101,107],{"type":46,"value":84},"Package versions are scattered across many ",{"type":40,"tag":55,"props":86,"children":88},{"className":87},[],[89],{"type":46,"value":90},".csproj",{"type":46,"value":92},", ",{"type":40,"tag":55,"props":94,"children":96},{"className":95},[],[97],{"type":46,"value":98},".fsproj",{"type":46,"value":100},", or ",{"type":40,"tag":55,"props":102,"children":104},{"className":103},[],[105],{"type":46,"value":106},".vbproj",{"type":46,"value":108}," files and the user wants a single source of truth",{"type":40,"tag":75,"props":110,"children":111},{},[112,114,119],{"type":46,"value":113},"The user mentions ",{"type":40,"tag":55,"props":115,"children":117},{"className":116},[],[118],{"type":46,"value":60},{"type":46,"value":120},", CPM, or centralizing NuGet versions",{"type":40,"tag":75,"props":122,"children":123},{},[124,126,132],{"type":46,"value":125},"The user wants to update, bump, upgrade, align, or sync a NuGet package version across multiple projects -- CPM is the recommended approach for managing shared package versions, so suggest converting to CPM as part of the update if the projects use ",{"type":40,"tag":55,"props":127,"children":129},{"className":128},[],[130],{"type":46,"value":131},"PackageReference",{"type":46,"value":133}," and CPM is not already enabled",{"type":40,"tag":75,"props":135,"children":136},{},[137],{"type":46,"value":138},"Package versions are out of sync, conflicting, or mismatched across projects and the user wants to resolve or unify them",{"type":40,"tag":64,"props":140,"children":142},{"id":141},"when-not-to-use",[143],{"type":46,"value":144},"When Not to Use",{"type":40,"tag":71,"props":146,"children":147},{},[148,153,173],{"type":40,"tag":75,"props":149,"children":150},{},[151],{"type":46,"value":152},"The repository already has CPM fully enabled for all in-scope projects",{"type":40,"tag":75,"props":154,"children":155},{},[156,158,164,166,171],{"type":46,"value":157},"The user is working with ",{"type":40,"tag":55,"props":159,"children":161},{"className":160},[],[162],{"type":46,"value":163},"packages.config",{"type":46,"value":165},"-based projects (must first migrate to ",{"type":40,"tag":55,"props":167,"children":169},{"className":168},[],[170],{"type":46,"value":131},{"type":46,"value":172},")",{"type":40,"tag":75,"props":174,"children":175},{},[176],{"type":46,"value":177},"The user wants to manage versions via a custom MSBuild property file without using CPM",{"type":40,"tag":64,"props":179,"children":181},{"id":180},"inputs",[182],{"type":46,"value":183},"Inputs",{"type":40,"tag":185,"props":186,"children":187},"table",{},[188,212],{"type":40,"tag":189,"props":190,"children":191},"thead",{},[192],{"type":40,"tag":193,"props":194,"children":195},"tr",{},[196,202,207],{"type":40,"tag":197,"props":198,"children":199},"th",{},[200],{"type":46,"value":201},"Input",{"type":40,"tag":197,"props":203,"children":204},{},[205],{"type":46,"value":206},"Required",{"type":40,"tag":197,"props":208,"children":209},{},[210],{"type":46,"value":211},"Description",{"type":40,"tag":213,"props":214,"children":215},"tbody",{},[216,235],{"type":40,"tag":193,"props":217,"children":218},{},[219,225,230],{"type":40,"tag":220,"props":221,"children":222},"td",{},[223],{"type":46,"value":224},"Scope",{"type":40,"tag":220,"props":226,"children":227},{},[228],{"type":46,"value":229},"Yes",{"type":40,"tag":220,"props":231,"children":232},{},[233],{"type":46,"value":234},"A project file, solution file, or directory containing .NET projects to convert",{"type":40,"tag":193,"props":236,"children":237},{},[238,243,248],{"type":40,"tag":220,"props":239,"children":240},{},[241],{"type":46,"value":242},"Version conflict strategy",{"type":40,"tag":220,"props":244,"children":245},{},[246],{"type":46,"value":247},"No",{"type":40,"tag":220,"props":249,"children":250},{},[251],{"type":46,"value":252},"How to resolve cases where the same package has different versions across projects. When conflicts are detected, do not assume a default strategy -- ask the user which strategy to use or explicitly confirm a proposed strategy before proceeding.",{"type":40,"tag":64,"props":254,"children":256},{"id":255},"workflow",[257],{"type":46,"value":258},"Workflow",{"type":40,"tag":260,"props":261,"children":263},"h3",{"id":262},"step-1-determine-scope",[264],{"type":46,"value":265},"Step 1: Determine scope",{"type":40,"tag":71,"props":267,"children":268},{},[269,299,331],{"type":40,"tag":75,"props":270,"children":271},{},[272,278,280,285,286,291,292,297],{"type":40,"tag":273,"props":274,"children":275},"strong",{},[276],{"type":46,"value":277},"Single project",{"type":46,"value":279},": User specifies a ",{"type":40,"tag":55,"props":281,"children":283},{"className":282},[],[284],{"type":46,"value":90},{"type":46,"value":92},{"type":40,"tag":55,"props":287,"children":289},{"className":288},[],[290],{"type":46,"value":98},{"type":46,"value":100},{"type":40,"tag":55,"props":293,"children":295},{"className":294},[],[296],{"type":46,"value":106},{"type":46,"value":298},".",{"type":40,"tag":75,"props":300,"children":301},{},[302,307,308,314,316,322,324,330],{"type":40,"tag":273,"props":303,"children":304},{},[305],{"type":46,"value":306},"Solution",{"type":46,"value":279},{"type":40,"tag":55,"props":309,"children":311},{"className":310},[],[312],{"type":46,"value":313},".sln",{"type":46,"value":315}," or ",{"type":40,"tag":55,"props":317,"children":319},{"className":318},[],[320],{"type":46,"value":321},".slnx",{"type":46,"value":323},". List projects with ",{"type":40,"tag":55,"props":325,"children":327},{"className":326},[],[328],{"type":46,"value":329},"dotnet sln list",{"type":46,"value":298},{"type":40,"tag":75,"props":332,"children":333},{},[334,339],{"type":40,"tag":273,"props":335,"children":336},{},[337],{"type":46,"value":338},"Repository\u002Fdirectory",{"type":46,"value":340},": No specific file given. Find all project files recursively from the first common ancestor directory of all .NET projects in scope.",{"type":40,"tag":49,"props":342,"children":343},{},[344],{"type":46,"value":345},"If the scope is unclear, ask the user.",{"type":40,"tag":49,"props":347,"children":348},{},[349,354,356,361,363,368,370,375,377,382,384,389,391,396,398,403,405,410,412,418],{"type":40,"tag":273,"props":350,"children":351},{},[352],{"type":46,"value":353},"Guard: Check for packages.config projects.",{"type":46,"value":355}," Before proceeding, check whether any project in scope uses ",{"type":40,"tag":55,"props":357,"children":359},{"className":358},[],[360],{"type":46,"value":163},{"type":46,"value":362}," instead of ",{"type":40,"tag":55,"props":364,"children":366},{"className":365},[],[367],{"type":46,"value":131},{"type":46,"value":369},". Look for ",{"type":40,"tag":55,"props":371,"children":373},{"className":372},[],[374],{"type":46,"value":163},{"type":46,"value":376}," files alongside project files. If any ",{"type":40,"tag":55,"props":378,"children":380},{"className":379},[],[381],{"type":46,"value":163},{"type":46,"value":383}," usage is detected, ",{"type":40,"tag":273,"props":385,"children":386},{},[387],{"type":46,"value":388},"stop and do not proceed with the conversion",{"type":46,"value":390},". Inform the user that CPM requires projects with ",{"type":40,"tag":55,"props":392,"children":394},{"className":393},[],[395],{"type":46,"value":131},{"type":46,"value":397}," format and that they must first migrate from ",{"type":40,"tag":55,"props":399,"children":401},{"className":400},[],[402],{"type":46,"value":163},{"type":46,"value":404}," to ",{"type":40,"tag":55,"props":406,"children":408},{"className":407},[],[409],{"type":46,"value":131},{"type":46,"value":411}," (e.g., using Visual Studio's built-in migration or the ",{"type":40,"tag":55,"props":413,"children":415},{"className":414},[],[416],{"type":46,"value":417},"dotnet migrate",{"type":46,"value":419}," tooling). This skill cannot perform that migration.",{"type":40,"tag":260,"props":421,"children":423},{"id":422},"step-2-establish-baseline-build",[424],{"type":46,"value":425},"Step 2: Establish baseline build",{"type":40,"tag":49,"props":427,"children":428},{},[429,431,437,439,445,446,452,454,461,463,469,470,476],{"type":46,"value":430},"Before making any changes, verify the scope builds successfully and capture a baseline binlog and package list. Run ",{"type":40,"tag":55,"props":432,"children":434},{"className":433},[],[435],{"type":46,"value":436},"dotnet clean",{"type":46,"value":438},", then ",{"type":40,"tag":55,"props":440,"children":442},{"className":441},[],[443],{"type":46,"value":444},"dotnet build -bl:baseline.binlog",{"type":46,"value":438},{"type":40,"tag":55,"props":447,"children":449},{"className":448},[],[450],{"type":46,"value":451},"dotnet package list --format json > baseline-packages.json",{"type":46,"value":453},". Read ",{"type":40,"tag":455,"props":456,"children":458},"a",{"href":457},"references\u002Fbaseline-comparison.md",[459],{"type":46,"value":460},"baseline-comparison.md",{"type":46,"value":462}," for the full procedure and fallback options. If the baseline build fails, stop and inform the user -- the scope must build cleanly before conversion. Do not delete ",{"type":40,"tag":55,"props":464,"children":466},{"className":465},[],[467],{"type":46,"value":468},"baseline.binlog",{"type":46,"value":315},{"type":40,"tag":55,"props":471,"children":473},{"className":472},[],[474],{"type":46,"value":475},"baseline-packages.json",{"type":46,"value":477}," -- they are needed for the post-conversion comparison and report.",{"type":40,"tag":260,"props":479,"children":481},{"id":480},"step-3-check-for-existing-cpm",[482],{"type":46,"value":483},"Step 3: Check for existing CPM",{"type":40,"tag":49,"props":485,"children":486},{},[487,489,494,496,501],{"type":46,"value":488},"Search for any existing ",{"type":40,"tag":55,"props":490,"children":492},{"className":491},[],[493],{"type":46,"value":60},{"type":46,"value":495}," in scope or ancestor directories. If CPM is already fully enabled, inform the user and stop. If a ",{"type":40,"tag":55,"props":497,"children":499},{"className":498},[],[500],{"type":46,"value":60},{"type":46,"value":502}," exists without CPM enabled, ask whether to add the property to the existing file or create a new one.",{"type":40,"tag":260,"props":504,"children":506},{"id":505},"step-4-audit-package-references",[507],{"type":46,"value":508},"Step 4: Audit package references",{"type":40,"tag":49,"props":510,"children":511},{},[512,514,520,522,528,530,536,538,544],{"type":46,"value":513},"Run ",{"type":40,"tag":55,"props":515,"children":517},{"className":516},[],[518],{"type":46,"value":519},"dotnet package list --format json",{"type":46,"value":521}," to get the resolved package references across all in-scope projects. Also scan ",{"type":40,"tag":55,"props":523,"children":525},{"className":524},[],[526],{"type":46,"value":527},"\u003CImport>",{"type":46,"value":529}," elements to discover shared ",{"type":40,"tag":55,"props":531,"children":533},{"className":532},[],[534],{"type":46,"value":535},".props",{"type":46,"value":537},"\u002F",{"type":40,"tag":55,"props":539,"children":541},{"className":540},[],[542],{"type":46,"value":543},".targets",{"type":46,"value":545}," files containing package references.",{"type":40,"tag":49,"props":547,"children":548},{},[549,551,557,559,565],{"type":46,"value":550},"Check for complexities: version conflicts, MSBuild property-based versions, conditional references, security advisories, and existing ",{"type":40,"tag":55,"props":552,"children":554},{"className":553},[],[555],{"type":46,"value":556},"VersionOverride",{"type":46,"value":558}," usage. Read ",{"type":40,"tag":455,"props":560,"children":562},{"href":561},"references\u002Faudit-complexities.md",[563],{"type":46,"value":564},"audit-complexities.md",{"type":46,"value":566}," for the full checklist.",{"type":40,"tag":49,"props":568,"children":569},{},[570],{"type":46,"value":571},"Present audit results to the user before proceeding, including:",{"type":40,"tag":71,"props":573,"children":574},{},[575,580],{"type":40,"tag":75,"props":576,"children":577},{},[578],{"type":46,"value":579},"A table of each package, its version(s), and which projects use it",{"type":40,"tag":75,"props":581,"children":582},{},[583],{"type":46,"value":584},"Any version conflicts, security advisories, or complexities requiring decisions",{"type":40,"tag":49,"props":586,"children":587},{},[588,590,595,597,602],{"type":46,"value":589},"When version conflicts exist, present each one individually with the affected projects, the distinct versions found, and the resolution options (align to highest, use ",{"type":40,"tag":55,"props":591,"children":593},{"className":592},[],[594],{"type":46,"value":556},{"type":46,"value":596},", etc.) with their trade-offs. Do not upgrade any package beyond the highest version already in use across the scope -- this avoids introducing version incompatibilities or breaking changes that are unrelated to the CPM conversion itself. Note any known security advisories or other upgrade opportunities as follow-up items for the user to address after the conversion is complete. Ask the user to decide on each conflict before proceeding. Read ",{"type":40,"tag":455,"props":598,"children":599},{"href":561},[600],{"type":46,"value":601},"audit-complexities.md - Same package with different versions",{"type":46,"value":603}," for the resolution workflow and presentation format.",{"type":40,"tag":260,"props":605,"children":607},{"id":606},"step-5-create-or-update-directorypackagesprops",[608],{"type":46,"value":609},"Step 5: Create or update Directory.Packages.props",{"type":40,"tag":49,"props":611,"children":612},{},[613,615,621,623,629,631,636,638,644],{"type":46,"value":614},"Create the file with ",{"type":40,"tag":55,"props":616,"children":618},{"className":617},[],[619],{"type":46,"value":620},"dotnet new packagesprops",{"type":46,"value":622}," (.NET 8+) or manually. Add a ",{"type":40,"tag":55,"props":624,"children":626},{"className":625},[],[627],{"type":46,"value":628},"\u003CPackageVersion>",{"type":46,"value":630}," entry for each unique package sorted alphabetically. For conditional versions or ",{"type":40,"tag":55,"props":632,"children":634},{"className":633},[],[635],{"type":46,"value":556},{"type":46,"value":637}," patterns, read ",{"type":40,"tag":455,"props":639,"children":641},{"href":640},"references\u002Fdirectory-packages-props.md",[642],{"type":46,"value":643},"directory-packages-props.md",{"type":46,"value":298},{"type":40,"tag":260,"props":646,"children":648},{"id":647},"step-6-update-project-files",[649],{"type":46,"value":650},"Step 6: Update project files",{"type":40,"tag":49,"props":652,"children":653},{},[654,656,662,664,670,672,677,679,684,685,690],{"type":46,"value":655},"Remove the ",{"type":40,"tag":55,"props":657,"children":659},{"className":658},[],[660],{"type":46,"value":661},"Version",{"type":46,"value":663}," attribute from every ",{"type":40,"tag":55,"props":665,"children":667},{"className":666},[],[668],{"type":46,"value":669},"\u003CPackageReference>",{"type":46,"value":671}," that now has a corresponding ",{"type":40,"tag":55,"props":673,"children":675},{"className":674},[],[676],{"type":46,"value":628},{"type":46,"value":678},". Also update any shared ",{"type":40,"tag":55,"props":680,"children":682},{"className":681},[],[683],{"type":46,"value":535},{"type":46,"value":537},{"type":40,"tag":55,"props":686,"children":688},{"className":687},[],[689],{"type":46,"value":543},{"type":46,"value":691}," files identified in step 4.",{"type":40,"tag":71,"props":693,"children":694},{},[695,735,755,760],{"type":40,"tag":75,"props":696,"children":697},{},[698,700,706,707,713,714,720,721,727,728,734],{"type":46,"value":699},"Preserve all other attributes (",{"type":40,"tag":55,"props":701,"children":703},{"className":702},[],[704],{"type":46,"value":705},"PrivateAssets",{"type":46,"value":92},{"type":40,"tag":55,"props":708,"children":710},{"className":709},[],[711],{"type":46,"value":712},"IncludeAssets",{"type":46,"value":92},{"type":40,"tag":55,"props":715,"children":717},{"className":716},[],[718],{"type":46,"value":719},"ExcludeAssets",{"type":46,"value":92},{"type":40,"tag":55,"props":722,"children":724},{"className":723},[],[725],{"type":46,"value":726},"GeneratePathProperty",{"type":46,"value":92},{"type":40,"tag":55,"props":729,"children":731},{"className":730},[],[732],{"type":46,"value":733},"Aliases",{"type":46,"value":172},{"type":40,"tag":75,"props":736,"children":737},{},[738,740,746,748,753],{"type":46,"value":739},"Preserve conditional ",{"type":40,"tag":55,"props":741,"children":743},{"className":742},[],[744],{"type":46,"value":745},"\u003CItemGroup>",{"type":46,"value":747}," elements -- only remove the ",{"type":40,"tag":55,"props":749,"children":751},{"className":750},[],[752],{"type":46,"value":661},{"type":46,"value":754}," attribute within them",{"type":40,"tag":75,"props":756,"children":757},{},[758],{"type":46,"value":759},"Retain each file's existing indentation style (spaces vs. tabs, indentation depth) and blank lines -- do not reformat or reorganize unchanged lines",{"type":40,"tag":75,"props":761,"children":762},{},[763,765,770],{"type":46,"value":764},"Use ",{"type":40,"tag":55,"props":766,"children":768},{"className":767},[],[769],{"type":46,"value":556},{"type":46,"value":771}," (with user confirmation) when a project needs a different version than the central one",{"type":40,"tag":260,"props":773,"children":775},{"id":774},"step-7-handle-msbuild-version-properties",[776],{"type":46,"value":777},"Step 7: Handle MSBuild version properties",{"type":40,"tag":49,"props":779,"children":780},{},[781,783,788,790,795,797,803,805,811],{"type":46,"value":782},"For ",{"type":40,"tag":55,"props":784,"children":786},{"className":785},[],[787],{"type":46,"value":131},{"type":46,"value":789}," items that used MSBuild properties for versions, determine whether to inline the resolved value or keep the property reference in ",{"type":40,"tag":55,"props":791,"children":793},{"className":792},[],[794],{"type":46,"value":60},{"type":46,"value":796},". After validation succeeds in step 8, remove inlined version properties from ",{"type":40,"tag":55,"props":798,"children":800},{"className":799},[],[801],{"type":46,"value":802},"Directory.Build.props",{"type":46,"value":804}," or other files, verifying they have no remaining references. Read ",{"type":40,"tag":455,"props":806,"children":808},{"href":807},"references\u002Fmsbuild-property-handling.md",[809],{"type":46,"value":810},"msbuild-property-handling.md",{"type":46,"value":812}," for the decision workflow, import order requirements, and cleanup procedure.",{"type":40,"tag":260,"props":814,"children":816},{"id":815},"step-8-restore-and-validate",[817],{"type":46,"value":818},"Step 8: Restore and validate",{"type":40,"tag":49,"props":820,"children":821},{},[822,824,829,830,836,837,843,844,848,850,856],{"type":46,"value":823},"Run a clean restore and build, capturing a post-conversion binlog and package list. Run ",{"type":40,"tag":55,"props":825,"children":827},{"className":826},[],[828],{"type":46,"value":436},{"type":46,"value":438},{"type":40,"tag":55,"props":831,"children":833},{"className":832},[],[834],{"type":46,"value":835},"dotnet build -bl:after-cpm.binlog",{"type":46,"value":438},{"type":40,"tag":55,"props":838,"children":840},{"className":839},[],[841],{"type":46,"value":842},"dotnet package list --format json > after-cpm-packages.json",{"type":46,"value":453},{"type":40,"tag":455,"props":845,"children":846},{"href":457},[847],{"type":46,"value":460},{"type":46,"value":849}," for the full procedure. If errors occur, read ",{"type":40,"tag":455,"props":851,"children":853},{"href":852},"references\u002Fvalidation-and-errors.md",[854],{"type":46,"value":855},"validation-and-errors.md",{"type":46,"value":857}," for NuGet error codes and multi-TFM guidance.",{"type":40,"tag":49,"props":859,"children":860},{},[861,866,868,873,874,880,881,886,887,893],{"type":40,"tag":273,"props":862,"children":863},{},[864],{"type":46,"value":865},"Do not delete or clean up any artifacts",{"type":46,"value":867}," (",{"type":40,"tag":55,"props":869,"children":871},{"className":870},[],[872],{"type":46,"value":468},{"type":46,"value":92},{"type":40,"tag":55,"props":875,"children":877},{"className":876},[],[878],{"type":46,"value":879},"after-cpm.binlog",{"type":46,"value":92},{"type":40,"tag":55,"props":882,"children":884},{"className":883},[],[885],{"type":46,"value":475},{"type":46,"value":92},{"type":40,"tag":55,"props":888,"children":890},{"className":889},[],[891],{"type":46,"value":892},"after-cpm-packages.json",{"type":46,"value":894},"). These files must be preserved for the user to inspect after the conversion. They are deliverables, not temporary files.",{"type":40,"tag":260,"props":896,"children":898},{"id":897},"step-9-post-conversion-report",[899],{"type":46,"value":900},"Step 9: Post-conversion report",{"type":40,"tag":49,"props":902,"children":903},{},[904,917],{"type":40,"tag":273,"props":905,"children":906},{},[907,909,915],{"type":46,"value":908},"You must create a ",{"type":40,"tag":55,"props":910,"children":912},{"className":911},[],[913],{"type":46,"value":914},"convert-to-cpm.md",{"type":46,"value":916}," file",{"type":46,"value":918}," alongside the binlog and JSON artifacts. Do not skip this step or substitute inline chat output for the file -- the user needs a persistent, shareable document. This file should be self-contained and shareable -- suitable for a pull request description, a team review, or a record of what was done. Structure the report with the following sections:",{"type":40,"tag":920,"props":921,"children":923},"h4",{"id":922},"section-1-conversion-overview",[924],{"type":46,"value":925},"Section 1: Conversion overview",{"type":40,"tag":49,"props":927,"children":928},{},[929],{"type":46,"value":930},"Summarize what was converted: the scope (project, solution, or repository), number of projects converted, total packages centralized, any projects or packages that were skipped, and any MSBuild properties that were inlined or removed. This gives the reader immediate context.",{"type":40,"tag":920,"props":932,"children":934},{"id":933},"section-2-version-conflict-resolutions",[935],{"type":46,"value":936},"Section 2: Version conflict resolutions",{"type":40,"tag":49,"props":938,"children":939},{},[940],{"type":46,"value":941},"If any version conflicts were encountered, list each one with:",{"type":40,"tag":71,"props":943,"children":944},{},[945,950,955,967],{"type":40,"tag":75,"props":946,"children":947},{},[948],{"type":46,"value":949},"The package name and all versions that were found across projects",{"type":40,"tag":75,"props":951,"children":952},{},[953],{"type":46,"value":954},"Which projects used each version",{"type":40,"tag":75,"props":956,"children":957},{},[958,960,965],{"type":46,"value":959},"What the user decided (aligned to highest, used ",{"type":40,"tag":55,"props":961,"children":963},{"className":962},[],[964],{"type":46,"value":556},{"type":46,"value":966},", etc.)",{"type":40,"tag":75,"props":968,"children":969},{},[970],{"type":46,"value":971},"The practical impact: which projects now resolve a different version than before, and which are unchanged",{"type":40,"tag":49,"props":973,"children":974},{},[975],{"type":46,"value":976},"If no conflicts were found, state that all packages had consistent versions across projects -- this is a positive signal worth noting.",{"type":40,"tag":920,"props":978,"children":980},{"id":979},"section-3-package-comparison-baseline-vs-result",[981],{"type":46,"value":982},"Section 3: Package comparison -- baseline vs. result",{"type":40,"tag":49,"props":984,"children":985},{},[986,988,993,995,1000,1002,1006],{"type":46,"value":987},"Compare ",{"type":40,"tag":55,"props":989,"children":991},{"className":990},[],[992],{"type":46,"value":475},{"type":46,"value":994}," and ",{"type":40,"tag":55,"props":996,"children":998},{"className":997},[],[999],{"type":46,"value":892},{"type":46,"value":1001}," per project. See ",{"type":40,"tag":455,"props":1003,"children":1004},{"href":457},[1005],{"type":46,"value":460},{"type":46,"value":1007}," for the comparison procedure. Present two tables:",{"type":40,"tag":71,"props":1009,"children":1010},{},[1011,1028],{"type":40,"tag":75,"props":1012,"children":1013},{},[1014,1019,1021,1026],{"type":40,"tag":273,"props":1015,"children":1016},{},[1017],{"type":46,"value":1018},"Changes table",{"type":46,"value":1020},": Packages where the resolved version changed, a ",{"type":40,"tag":55,"props":1022,"children":1024},{"className":1023},[],[1025],{"type":46,"value":556},{"type":46,"value":1027}," was introduced, or a package was added\u002Fremoved. Include a status column explaining what changed and why (e.g., \"VersionOverride -- project retains pinned version\", \"Aligned to highest version\").",{"type":40,"tag":75,"props":1029,"children":1030},{},[1031,1036],{"type":40,"tag":273,"props":1032,"children":1033},{},[1034],{"type":46,"value":1035},"Unchanged table",{"type":46,"value":1037},": All other packages, confirming they resolve identically to baseline.",{"type":40,"tag":49,"props":1039,"children":1040},{},[1041],{"type":46,"value":1042},"If there are no changes at all, state that the conversion is fully version-neutral -- this is the ideal outcome and provides reassurance.",{"type":40,"tag":920,"props":1044,"children":1046},{"id":1045},"section-4-risk-assessment",[1047],{"type":46,"value":1048},"Section 4: Risk assessment",{"type":40,"tag":49,"props":1050,"children":1051},{},[1052],{"type":46,"value":1053},"Provide a clear confidence statement:",{"type":40,"tag":71,"props":1055,"children":1056},{},[1057,1079,1099],{"type":40,"tag":75,"props":1058,"children":1059},{},[1060,1069,1071,1077],{"type":40,"tag":273,"props":1061,"children":1062},{},[1063],{"type":40,"tag":1064,"props":1065,"children":1066},"span",{},[1067],{"type":46,"value":1068},"Low risk",{"type":46,"value":1070}," -- Conversion is version-neutral; all packages resolve to the same versions as baseline. The build and restore succeeded. Recommend running ",{"type":40,"tag":55,"props":1072,"children":1074},{"className":1073},[],[1075],{"type":46,"value":1076},"dotnet test",{"type":46,"value":1078}," as a final check.",{"type":40,"tag":75,"props":1080,"children":1081},{},[1082,1090,1092,1097],{"type":40,"tag":273,"props":1083,"children":1084},{},[1085],{"type":40,"tag":1064,"props":1086,"children":1087},{},[1088],{"type":46,"value":1089},"Moderate risk",{"type":46,"value":1091}," -- Some packages changed versions (e.g., minor\u002Fpatch alignment). List the affected packages and projects. Recommend reviewing the changes table and running ",{"type":40,"tag":55,"props":1093,"children":1095},{"className":1094},[],[1096],{"type":46,"value":1076},{"type":46,"value":1098}," to verify no regressions.",{"type":40,"tag":75,"props":1100,"children":1101},{},[1102,1110,1112,1117],{"type":40,"tag":273,"props":1103,"children":1104},{},[1105],{"type":40,"tag":1064,"props":1106,"children":1107},{},[1108],{"type":46,"value":1109},"High risk",{"type":46,"value":1111}," -- Major version changes were applied, or packages were added\u002Fremoved unexpectedly. Recommend careful review, running ",{"type":40,"tag":55,"props":1113,"children":1115},{"className":1114},[],[1116],{"type":46,"value":1076},{"type":46,"value":1118},", and comparing binlogs before merging.",{"type":40,"tag":49,"props":1120,"children":1121},{},[1122,1124,1129],{"type":46,"value":1123},"Call out any specific warnings: ",{"type":40,"tag":55,"props":1125,"children":1127},{"className":1126},[],[1128],{"type":46,"value":556},{"type":46,"value":1130}," usage that partially undermines centralization, or MSBuild property removal that could affect other build logic.",{"type":40,"tag":920,"props":1132,"children":1134},{"id":1133},"section-5-follow-up-items",[1135],{"type":46,"value":1136},"Section 5: Follow-up items",{"type":40,"tag":49,"props":1138,"children":1139},{},[1140],{"type":46,"value":1141},"List any items identified during the conversion that the user should address separately after the CPM conversion is complete. These are intentionally out of scope for the conversion itself but important for the user to act on. Common follow-up items include:",{"type":40,"tag":71,"props":1143,"children":1144},{},[1145,1163,1173,1190],{"type":40,"tag":75,"props":1146,"children":1147},{},[1148,1153,1155,1161],{"type":40,"tag":273,"props":1149,"children":1150},{},[1151],{"type":46,"value":1152},"Security advisories",{"type":46,"value":1154},": If any package versions are known to have security vulnerabilities (detected via ",{"type":40,"tag":55,"props":1156,"children":1158},{"className":1157},[],[1159],{"type":46,"value":1160},"dotnet package list --vulnerable",{"type":46,"value":1162}," or noted during the audit), list each advisory with the package name, current version, affected projects, and the minimum patched version. These upgrades are out of scope for the CPM conversion to avoid introducing version incompatibilities or breaking changes.",{"type":40,"tag":75,"props":1164,"children":1165},{},[1166,1171],{"type":40,"tag":273,"props":1167,"children":1168},{},[1169],{"type":46,"value":1170},"Deprecated packages",{"type":46,"value":1172},": If any packages are deprecated, note the recommended replacement.",{"type":40,"tag":75,"props":1174,"children":1175},{},[1176,1181,1183,1188],{"type":40,"tag":273,"props":1177,"children":1178},{},[1179],{"type":46,"value":1180},"Version alignment opportunities",{"type":46,"value":1182},": If ",{"type":40,"tag":55,"props":1184,"children":1186},{"className":1185},[],[1187],{"type":46,"value":556},{"type":46,"value":1189}," was used to preserve differing versions, note that the user may want to align these in the future once the affected projects can be validated against the central version.",{"type":40,"tag":75,"props":1191,"children":1192},{},[1193,1198,1200,1205],{"type":40,"tag":273,"props":1194,"children":1195},{},[1196],{"type":46,"value":1197},"Test validation",{"type":46,"value":1199},": Recommend running ",{"type":40,"tag":55,"props":1201,"children":1203},{"className":1202},[],[1204],{"type":46,"value":1076},{"type":46,"value":1206}," to validate runtime behavior beyond build success, especially if any version conflicts were resolved by aligning to the highest version.",{"type":40,"tag":49,"props":1208,"children":1209},{},[1210],{"type":46,"value":1211},"Present follow-up items as a numbered checklist so the user can track them.",{"type":40,"tag":920,"props":1213,"children":1215},{"id":1214},"section-6-artifacts-and-how-to-use-them",[1216],{"type":46,"value":1217},"Section 6: Artifacts and how to use them",{"type":40,"tag":49,"props":1219,"children":1220},{},[1221],{"type":46,"value":1222},"List the artifacts produced during conversion and explain how to use them:",{"type":40,"tag":71,"props":1224,"children":1225},{},[1226,1248,1270],{"type":40,"tag":75,"props":1227,"children":1228},{},[1229,1237,1238,1246],{"type":40,"tag":273,"props":1230,"children":1231},{},[1232],{"type":40,"tag":55,"props":1233,"children":1235},{"className":1234},[],[1236],{"type":46,"value":468},{"type":46,"value":994},{"type":40,"tag":273,"props":1239,"children":1240},{},[1241],{"type":40,"tag":55,"props":1242,"children":1244},{"className":1243},[],[1245],{"type":46,"value":879},{"type":46,"value":1247}," -- MSBuild binary logs captured before and after conversion. These are available for manual validation and troubleshooting if needed.",{"type":40,"tag":75,"props":1249,"children":1250},{},[1251,1259,1260,1268],{"type":40,"tag":273,"props":1252,"children":1253},{},[1254],{"type":40,"tag":55,"props":1255,"children":1257},{"className":1256},[],[1258],{"type":46,"value":475},{"type":46,"value":994},{"type":40,"tag":273,"props":1261,"children":1262},{},[1263],{"type":40,"tag":55,"props":1264,"children":1266},{"className":1265},[],[1267],{"type":46,"value":892},{"type":46,"value":1269}," -- Machine-readable snapshots of resolved package versions per project, used to produce the comparison tables above.",{"type":40,"tag":75,"props":1271,"children":1272},{},[1273,1281],{"type":40,"tag":273,"props":1274,"children":1275},{},[1276],{"type":40,"tag":55,"props":1277,"children":1279},{"className":1278},[],[1280],{"type":46,"value":914},{"type":46,"value":1282}," -- This report file, suitable for use as a pull request description or team review artifact.",{"type":40,"tag":49,"props":1284,"children":1285},{},[1286,1288,1293],{"type":46,"value":1287},"Recommend the user run ",{"type":40,"tag":55,"props":1289,"children":1291},{"className":1290},[],[1292],{"type":46,"value":1076},{"type":46,"value":1294}," to validate runtime behavior beyond build success. If any version conflicts were resolved by aligning to the highest version, recommend reviewing the release notes for the affected packages.",{"type":40,"tag":64,"props":1296,"children":1298},{"id":1297},"validation",[1299],{"type":46,"value":1300},"Validation",{"type":40,"tag":71,"props":1302,"children":1305},{"className":1303},[1304],"contains-task-list",[1306,1319,1349,1377,1394,1417,1426],{"type":40,"tag":75,"props":1307,"children":1310},{"className":1308},[1309],"task-list-item",[1311,1317],{"type":40,"tag":1312,"props":1313,"children":1316},"input",{"disabled":1314,"type":1315},true,"checkbox",[],{"type":46,"value":1318}," Baseline build succeeded before any changes were made",{"type":40,"tag":75,"props":1320,"children":1322},{"className":1321},[1309],[1323,1326,1328,1333,1335,1341,1343],{"type":40,"tag":1312,"props":1324,"children":1325},{"disabled":1314,"type":1315},[],{"type":46,"value":1327}," ",{"type":40,"tag":55,"props":1329,"children":1331},{"className":1330},[],[1332],{"type":46,"value":60},{"type":46,"value":1334}," exists with ",{"type":40,"tag":55,"props":1336,"children":1338},{"className":1337},[],[1339],{"type":46,"value":1340},"ManagePackageVersionsCentrally",{"type":46,"value":1342}," set to ",{"type":40,"tag":55,"props":1344,"children":1346},{"className":1345},[],[1347],{"type":46,"value":1348},"true",{"type":40,"tag":75,"props":1350,"children":1352},{"className":1351},[1309],[1353,1356,1358,1363,1365,1370,1372],{"type":40,"tag":1312,"props":1354,"children":1355},{"disabled":1314,"type":1315},[],{"type":46,"value":1357}," Every in-scope ",{"type":40,"tag":55,"props":1359,"children":1361},{"className":1360},[],[1362],{"type":46,"value":131},{"type":46,"value":1364}," either has no ",{"type":40,"tag":55,"props":1366,"children":1368},{"className":1367},[],[1369],{"type":46,"value":661},{"type":46,"value":1371}," attribute or uses ",{"type":40,"tag":55,"props":1373,"children":1375},{"className":1374},[],[1376],{"type":46,"value":556},{"type":40,"tag":75,"props":1378,"children":1380},{"className":1379},[1309],[1381,1384,1386,1392],{"type":40,"tag":1312,"props":1382,"children":1383},{"disabled":1314,"type":1315},[],{"type":46,"value":1385}," Every referenced package has a corresponding ",{"type":40,"tag":55,"props":1387,"children":1389},{"className":1388},[],[1390],{"type":46,"value":1391},"PackageVersion",{"type":46,"value":1393}," entry",{"type":40,"tag":75,"props":1395,"children":1397},{"className":1396},[1309],[1398,1401,1402,1408,1409,1415],{"type":40,"tag":1312,"props":1399,"children":1400},{"disabled":1314,"type":1315},[],{"type":46,"value":1327},{"type":40,"tag":55,"props":1403,"children":1405},{"className":1404},[],[1406],{"type":46,"value":1407},"dotnet restore",{"type":46,"value":994},{"type":40,"tag":55,"props":1410,"children":1412},{"className":1411},[],[1413],{"type":46,"value":1414},"dotnet build",{"type":46,"value":1416}," complete without errors from a clean state",{"type":40,"tag":75,"props":1418,"children":1420},{"className":1419},[1309],[1421,1424],{"type":40,"tag":1312,"props":1422,"children":1423},{"disabled":1314,"type":1315},[],{"type":46,"value":1425}," Package list comparison shows no unexpected version changes",{"type":40,"tag":75,"props":1427,"children":1429},{"className":1428},[1309],[1430,1433],{"type":40,"tag":1312,"props":1431,"children":1432},{"disabled":1314,"type":1315},[],{"type":46,"value":1434}," No orphaned version properties remain (unless intentionally kept)",{"type":40,"tag":64,"props":1436,"children":1438},{"id":1437},"more-info",[1439],{"type":46,"value":1440},"More Info",{"type":40,"tag":71,"props":1442,"children":1443},{},[1444,1455],{"type":40,"tag":75,"props":1445,"children":1446},{},[1447],{"type":40,"tag":455,"props":1448,"children":1452},{"href":1449,"rel":1450},"https:\u002F\u002Fgithub.com\u002FNuGet\u002Fdocs.microsoft.com-nuget\u002Fblob\u002Fmain\u002Fdocs\u002Fconsume-packages\u002FCentral-Package-Management.md",[1451],"nofollow",[1453],{"type":46,"value":1454},"Central Package Management documentation",{"type":40,"tag":75,"props":1456,"children":1457},{},[1458],{"type":40,"tag":455,"props":1459,"children":1460},{"href":852},[1461],{"type":46,"value":1462},"Validation and common errors",{"items":1464,"total":1629},[1465,1481,1496,1511,1529,1543,1563,1573,1585,1595,1608,1619],{"slug":1466,"name":1466,"fn":1467,"description":1468,"org":1469,"tags":1470,"stars":1478,"repoUrl":1479,"updatedAt":1480},"multithreaded-task-migration","migrate MSBuild tasks to multithreaded mode","Guide for migrating MSBuild tasks to multithreaded mode support, including compatibility red-team review. Use this when converting tasks to thread-safe versions, implementing IMultiThreadableTask, adding TaskEnvironment support, or auditing migrations for behavioral compatibility.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1471,1472,1475],{"name":17,"slug":18,"type":15},{"name":1473,"slug":1474,"type":15},"Engineering","engineering",{"name":1476,"slug":1477,"type":15},"Performance","performance",5535,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fmsbuild","2026-07-22T05:37:33.965588",{"slug":1482,"name":1482,"fn":1483,"description":1484,"org":1485,"tags":1486,"stars":22,"repoUrl":23,"updatedAt":1495},"analyzing-dotnet-performance","analyze .NET code for performance anti-patterns","Scans .NET code for ~50 performance anti-patterns across async, memory, strings, collections, LINQ, regex, serialization, and I\u002FO with tiered severity classification. Use when analyzing .NET code for optimization opportunities, reviewing hot paths, or auditing allocation-heavy patterns.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1487,1488,1491,1494],{"name":17,"slug":18,"type":15},{"name":1489,"slug":1490,"type":15},"Code Analysis","code-analysis",{"name":1492,"slug":1493,"type":15},"Debugging","debugging",{"name":1476,"slug":1477,"type":15},"2026-07-12T08:23:25.400375",{"slug":1497,"name":1497,"fn":1498,"description":1499,"org":1500,"tags":1501,"stars":22,"repoUrl":23,"updatedAt":1510},"android-tombstone-symbolication","symbolicate .NET runtime frames in Android tombstones","Symbolicate the .NET runtime frames in an Android tombstone file. Extracts BuildIds and PC offsets from the native backtrace, downloads debug symbols from the Microsoft symbol server, and runs llvm-symbolizer to produce function names with source file and line numbers. USE FOR triaging a .NET MAUI or Mono Android app crash from a tombstone, resolving native backtrace frames in libmonosgen-2.0.so or libcoreclr.so to .NET runtime source code, or investigating SIGABRT, SIGSEGV, or other native signals originating from the .NET runtime on Android. DO NOT USE FOR pure Java\u002FKotlin crashes, managed .NET exceptions that are already captured in logcat, or iOS crash logs. INVOKES Symbolicate-Tombstone.ps1 script, llvm-symbolizer, Microsoft symbol server.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1502,1503,1506,1507],{"name":17,"slug":18,"type":15},{"name":1504,"slug":1505,"type":15},"Android","android",{"name":1492,"slug":1493,"type":15},{"name":1508,"slug":1509,"type":15},"Microsoft","microsoft","2026-07-12T08:23:21.595572",{"slug":1512,"name":1512,"fn":1513,"description":1514,"org":1515,"tags":1516,"stars":22,"repoUrl":23,"updatedAt":1528},"apple-crash-symbolication","symbolicate .NET runtime frames in crash logs","Symbolicate .NET runtime frames in Apple platform .ips crash logs (iOS, tvOS, Mac Catalyst, macOS). Extracts UUIDs and addresses from the native backtrace, locates dSYM debug symbols, and runs atos to produce function names with source file and line numbers. Automatically downloads .dwarf symbols from the Microsoft symbol server using Mach-O UUIDs. USE FOR triaging a .NET MAUI or Mono app crash from an .ips file on any Apple platform, resolving native backtrace frames in libcoreclr or libmonosgen-2.0 to .NET runtime source code, retrieving .ips crash logs from a connected iOS device or iPhone, or investigating EXC_CRASH, EXC_BAD_ACCESS, SIGABRT, or SIGSEGV originating from the .NET runtime. DO NOT USE FOR pure Swift\u002FObjective-C crashes with no .NET components, or Android tombstone files. INVOKES Symbolicate-Crash.ps1 script, atos, dwarfdump, idevicecrashreport.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1517,1518,1519,1522,1525],{"name":17,"slug":18,"type":15},{"name":1492,"slug":1493,"type":15},{"name":1520,"slug":1521,"type":15},"iOS","ios",{"name":1523,"slug":1524,"type":15},"macOS","macos",{"name":1526,"slug":1527,"type":15},"Observability","observability","2026-07-12T08:23:20.369986",{"slug":1530,"name":1530,"fn":1531,"description":1532,"org":1533,"tags":1534,"stars":22,"repoUrl":23,"updatedAt":1542},"assertion-quality","evaluate assertion quality in test suites","Analyzes the variety and depth of assertions across test suites in any language. Use when the user asks to evaluate assertion quality, find shallow tests, identify assertion-free tests (no assertions or only trivial ones like Assert.IsNotNull \u002F toBeTruthy()), flag self-referential or tautological assertions, measure assertion diversity, or audit whether tests verify different facets of behavior. Polyglot: .NET, Python, TS\u002FJS, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, C++. DO NOT USE FOR: writing new tests (use code-testing-agent \u002F writing-mstest-tests), mutation reasoning about whether tests would catch a bug (use test-gap-analysis), or a general severity-ranked anti-pattern audit (use test-anti-patterns), fixing or rewriting assertions, or writing, fixing, or modernizing MSTest tests, assertions, or attributes (use writing-mstest-tests).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1535,1536,1539],{"name":1489,"slug":1490,"type":15},{"name":1537,"slug":1538,"type":15},"QA","qa",{"name":1540,"slug":1541,"type":15},"Testing","testing","2026-07-12T08:23:51.277743",{"slug":1544,"name":1544,"fn":1545,"description":1546,"org":1547,"tags":1548,"stars":22,"repoUrl":23,"updatedAt":1562},"author-component","create and review Blazor components","Create or review Blazor components (.razor files) with correct architecture. USE FOR: writing new Blazor components that do NOT involve JavaScript interop, implementing parameters and EventCallback, RenderFragment slots, component lifecycle (OnInitializedAsync, OnParametersSet), async patterns, IAsyncDisposable, CancellationToken, CSS isolation, code-behind. DO NOT USE FOR: creating new projects (use create-blazor-project), JavaScript interop or calling browser APIs from Blazor (use use-js-interop), forms and validation (use collect-user-input), prerendering issues (use support-prerendering), HTTP data fetching patterns (use fetch-and-send-data), coordinating state between unrelated components (use coordinate-components).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1549,1550,1553,1556,1559],{"name":17,"slug":18,"type":15},{"name":1551,"slug":1552,"type":15},"Blazor","blazor",{"name":1554,"slug":1555,"type":15},"C#","csharp",{"name":1557,"slug":1558,"type":15},"UI Components","ui-components",{"name":1560,"slug":1561,"type":15},"Web Development","web-development","2026-07-15T06:03:29.216359",{"slug":1564,"name":1564,"fn":1565,"description":1566,"org":1567,"tags":1568,"stars":22,"repoUrl":23,"updatedAt":1572},"binlog-failure-analysis","analyze MSBuild binary logs","Analyze MSBuild binary logs to diagnose build failures. USE FOR: build errors that are unclear from console output, diagnosing cascading failures across multi-project builds, tracing MSBuild target execution order, and generally any MSBuild build issues. Requires an existing .binlog file. DO NOT USE FOR: generating binlogs (use binlog-generation), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1569,1570,1571],{"name":1489,"slug":1490,"type":15},{"name":1492,"slug":1493,"type":15},{"name":1508,"slug":1509,"type":15},"2026-07-12T08:21:34.637923",{"slug":1574,"name":1574,"fn":1575,"description":1576,"org":1577,"tags":1578,"stars":22,"repoUrl":23,"updatedAt":1584},"binlog-generation","generate MSBuild binary logs for diagnostics","Generate MSBuild binary logs (binlogs) for build diagnostics and analysis. USE FOR: adding \u002Fbl:{} to any dotnet build, test, pack, publish, or restore command to capture a full build execution trace, prerequisite for binlog-failure-analysis and build-perf-diagnostics skills, enabling post-build investigation of errors or performance. Requires MSBuild 17.8+ \u002F .NET 8 SDK+ for {} placeholder; PowerShell needs -bl:{{}}. DO NOT USE FOR: non-MSBuild build systems (npm, Maven, CMake), analyzing an existing binlog (use binlog-failure-analysis instead).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1579,1582,1583],{"name":1580,"slug":1581,"type":15},"Build","build",{"name":1492,"slug":1493,"type":15},{"name":1473,"slug":1474,"type":15},"2026-07-19T05:38:19.340791",{"slug":1586,"name":1586,"fn":1587,"description":1588,"org":1589,"tags":1590,"stars":22,"repoUrl":23,"updatedAt":1594},"build-parallelism","optimize MSBuild build parallelism","Diagnose and fix under-parallelized MSBuild builds. USE WHEN a multi-project solution build is slower than expected, doesn't speed up when you add cores, pegs a single core while others idle, or you want to know why `-m` isn't helping. Note: `\u002Fmaxcpucount` default is 1 (sequential) — always pass `-m` for parallel builds. Covers finding the critical path (longest serial ProjectReference chain), graph build (`\u002Fgraph`), BuildInParallel, and solution filters (`.slnf`). DO NOT USE FOR: single-project builds, incremental issues (use incremental-build), compilation slowness inside one project (use build-perf-diagnostics), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1591,1592,1593],{"name":17,"slug":18,"type":15},{"name":1473,"slug":1474,"type":15},{"name":1476,"slug":1477,"type":15},"2026-07-19T05:38:18.364937",{"slug":1596,"name":1596,"fn":1597,"description":1598,"org":1599,"tags":1600,"stars":22,"repoUrl":23,"updatedAt":1607},"build-perf-baseline","establish and optimize build performance baselines","Establish build performance baselines and apply systematic optimization techniques. USE FOR: diagnosing slow builds, establishing before\u002Fafter measurements (cold, warm, no-op scenarios), applying optimization strategies like MSBuild Server, static graph builds, artifacts output, and dependency graph trimming. Start here before diving into build-perf-diagnostics, incremental-build, or build-parallelism. DO NOT USE FOR: non-MSBuild build systems, detailed bottleneck analysis (use build-perf-diagnostics after baselining).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1601,1602,1605,1606],{"name":1473,"slug":1474,"type":15},{"name":1603,"slug":1604,"type":15},"Monitoring","monitoring",{"name":1476,"slug":1477,"type":15},{"name":1540,"slug":1541,"type":15},"2026-07-12T08:21:35.865649",{"slug":1609,"name":1609,"fn":1610,"description":1611,"org":1612,"tags":1613,"stars":22,"repoUrl":23,"updatedAt":1618},"build-perf-diagnostics","diagnose MSBuild build performance bottlenecks","Diagnose MSBuild build performance bottlenecks using binary log analysis. USE FOR: identifying why builds are slow by analyzing binlog performance summaries, detecting ResolveAssemblyReference (RAR) taking >5s, Roslyn analyzers consuming >30% of Csc time, single targets dominating >50% of build time, node utilization below 80%, excessive Copy tasks, NuGet restore running every build. Covers timeline analysis, Target\u002FTask Performance Summary interpretation, and 7 common bottleneck categories. Use after build-perf-baseline has established measurements. DO NOT USE FOR: establishing initial baselines (use build-perf-baseline first), fixing incremental build issues (use incremental-build), parallelism tuning (use build-parallelism), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1614,1615,1616,1617],{"name":17,"slug":18,"type":15},{"name":1492,"slug":1493,"type":15},{"name":1473,"slug":1474,"type":15},{"name":1476,"slug":1477,"type":15},"2026-07-12T08:21:40.961722",{"slug":1620,"name":1620,"fn":1621,"description":1622,"org":1623,"tags":1624,"stars":22,"repoUrl":23,"updatedAt":1628},"check-bin-obj-clash","detect MSBuild output path conflicts","Detects MSBuild projects with conflicting OutputPath or IntermediateOutputPath. USE FOR: builds failing with 'Cannot create a file when that file already exists', 'The process cannot access the file because it is being used by another process', intermittent build failures that succeed on retry, or missing\u002Foverwritten outputs in multi-project or multi-targeting builds where bin\u002Fobj (or project.assets.json) collide. Common causes: shared OutputPath, missing AppendTargetFrameworkToOutputPath, extra global properties (e.g. PublishReadyToRun), or SetTargetFramework on a ProjectReference to a single-targeting project. DO NOT USE FOR: file access errors unrelated to MSBuild (OS-level locking), single-project single-TFM builds, non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1625,1626,1627],{"name":1492,"slug":1493,"type":15},{"name":1473,"slug":1474,"type":15},{"name":1537,"slug":1538,"type":15},"2026-07-19T05:38:14.336279",144,{"items":1631,"total":1680},[1632,1639,1646,1654,1660,1668,1674],{"slug":1482,"name":1482,"fn":1483,"description":1484,"org":1633,"tags":1634,"stars":22,"repoUrl":23,"updatedAt":1495},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1635,1636,1637,1638],{"name":17,"slug":18,"type":15},{"name":1489,"slug":1490,"type":15},{"name":1492,"slug":1493,"type":15},{"name":1476,"slug":1477,"type":15},{"slug":1497,"name":1497,"fn":1498,"description":1499,"org":1640,"tags":1641,"stars":22,"repoUrl":23,"updatedAt":1510},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1642,1643,1644,1645],{"name":17,"slug":18,"type":15},{"name":1504,"slug":1505,"type":15},{"name":1492,"slug":1493,"type":15},{"name":1508,"slug":1509,"type":15},{"slug":1512,"name":1512,"fn":1513,"description":1514,"org":1647,"tags":1648,"stars":22,"repoUrl":23,"updatedAt":1528},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1649,1650,1651,1652,1653],{"name":17,"slug":18,"type":15},{"name":1492,"slug":1493,"type":15},{"name":1520,"slug":1521,"type":15},{"name":1523,"slug":1524,"type":15},{"name":1526,"slug":1527,"type":15},{"slug":1530,"name":1530,"fn":1531,"description":1532,"org":1655,"tags":1656,"stars":22,"repoUrl":23,"updatedAt":1542},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1657,1658,1659],{"name":1489,"slug":1490,"type":15},{"name":1537,"slug":1538,"type":15},{"name":1540,"slug":1541,"type":15},{"slug":1544,"name":1544,"fn":1545,"description":1546,"org":1661,"tags":1662,"stars":22,"repoUrl":23,"updatedAt":1562},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1663,1664,1665,1666,1667],{"name":17,"slug":18,"type":15},{"name":1551,"slug":1552,"type":15},{"name":1554,"slug":1555,"type":15},{"name":1557,"slug":1558,"type":15},{"name":1560,"slug":1561,"type":15},{"slug":1564,"name":1564,"fn":1565,"description":1566,"org":1669,"tags":1670,"stars":22,"repoUrl":23,"updatedAt":1572},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1671,1672,1673],{"name":1489,"slug":1490,"type":15},{"name":1492,"slug":1493,"type":15},{"name":1508,"slug":1509,"type":15},{"slug":1574,"name":1574,"fn":1575,"description":1576,"org":1675,"tags":1676,"stars":22,"repoUrl":23,"updatedAt":1584},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1677,1678,1679],{"name":1580,"slug":1581,"type":15},{"name":1492,"slug":1493,"type":15},{"name":1473,"slug":1474,"type":15},96]