From 8dc9071793ec9686ac09e2eca2882bdc3ca44438 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2026 06:25:26 +0000 Subject: [PATCH] chore: refresh upstream skill catalog --- .../manifest.json | 2 +- .../skills/dotnet-webapi/manifest.json | 2 +- .../skills/author-component/manifest.json | 2 +- .../skills/collect-user-input/manifest.json | 2 +- .../skills/configure-auth/SKILL.md | 2 +- .../skills/configure-auth/manifest.json | 2 +- .../coordinate-components/manifest.json | 2 +- .../create-blazor-project/manifest.json | 2 +- .../skills/fetch-and-send-data/manifest.json | 2 +- .../skills/plan-ui-change/manifest.json | 2 +- .../skills/support-prerendering/manifest.json | 2 +- .../skills/use-igniteui-blazor/manifest.json | 2 +- .../skills/use-js-interop/manifest.json | 2 +- .../skills/vectorization/SKILL.md | 2 +- .../skills/system-text-json-net11/SKILL.md | 9 +- .../skills/csharp-refactoring/manifest.json | 2 +- .../skills/msbuild/manifest.json | 2 +- .../skills/setup-local-sdk/manifest.json | 2 +- .../migrate-mstest-v1v2-to-v3/manifest.json | 2 +- .../migrate-mstest-v3-to-v4/manifest.json | 2 +- .../migrate-nunit-to-mstest/manifest.json | 2 +- .../migrate-vstest-to-mtp/manifest.json | 2 +- .../migrate-xunit-to-mstest/manifest.json | 2 +- .../migrate-xunit-to-xunit-v3/manifest.json | 2 +- .../agents/test-quality-auditor/AGENT.md | 15 ++- .../skills/assertion-quality/manifest.json | 2 +- .../skills/code-testing-agent/manifest.json | 2 +- .../code-testing-extensions/manifest.json | 2 +- .../skills/coverage-analysis/manifest.json | 2 +- .../skills/crap-score/manifest.json | 2 +- .../detect-static-dependencies/manifest.json | 2 +- .../skills/filter-syntax/manifest.json | 2 +- .../find-untested-sources/manifest.json | 2 +- .../manifest.json | 2 +- .../skills/grade-tests/SKILL.md | 125 ++++++++++-------- .../skills/grade-tests/manifest.json | 2 +- .../migrate-static-to-wrapper/manifest.json | 2 +- .../skills/mtp-hot-reload/manifest.json | 2 +- .../skills/platform-detection/manifest.json | 2 +- .../skills/run-tests/manifest.json | 2 +- .../manifest.json | 2 +- .../test-analysis-extensions/manifest.json | 2 +- .../skills/test-anti-patterns/manifest.json | 2 +- .../skills/test-gap-analysis/manifest.json | 2 +- .../skills/test-smell-detection/manifest.json | 2 +- .../skills/test-tagging/manifest.json | 2 +- .../skills/testability-obstacle/manifest.json | 2 +- .../skills/writing-mstest-tests/manifest.json | 2 +- .../skills/agentic-workflows/manifest.json | 2 +- .../authoring-github-workflows/manifest.json | 2 +- .../skills/create-custom-agent/manifest.json | 2 +- .../skills/create-skill-test/manifest.json | 2 +- .../skills/create-skill/SKILL.md | 4 + .../skills/create-skill/manifest.json | 2 +- .../manifest.json | 2 +- .../manifest.json | 2 +- .../apple-crash-symbolication/manifest.json | 2 +- .../clr-activation-debugging/manifest.json | 2 +- .../skills/dotnet-trace-collect/manifest.json | 2 +- .../skills/dump-collect/manifest.json | 2 +- .../skills/microbenchmarking/manifest.json | 2 +- .../improve-skill-quality/manifest.json | 2 +- .../skills/binlog-failure-analysis/SKILL.md | 6 +- .../binlog-failure-analysis/manifest.json | 2 +- .../skills/binlog-generation/SKILL.md | 16 +-- .../skills/binlog-generation/manifest.json | 2 +- .../skills/build-parallelism/SKILL.md | 24 +++- .../skills/build-parallelism/manifest.json | 2 +- .../skills/build-perf-baseline/SKILL.md | 104 +++++++++++---- .../skills/build-perf-baseline/manifest.json | 2 +- .../skills/build-perf-diagnostics/SKILL.md | 4 +- .../build-perf-diagnostics/manifest.json | 2 +- .../skills/check-bin-obj-clash/SKILL.md | 2 +- .../skills/check-bin-obj-clash/manifest.json | 2 +- .../copy-to-output-directory/manifest.json | 2 +- .../directory-build-organization/SKILL.md | 32 ++++- .../manifest.json | 2 +- .../skills/eval-performance/SKILL.md | 2 +- .../skills/eval-performance/manifest.json | 2 +- .../skills/extension-points/SKILL.md | 2 +- .../skills/extension-points/manifest.json | 2 +- .../skills/including-generated-files/SKILL.md | 2 +- .../including-generated-files/manifest.json | 2 +- .../skills/incremental-build/SKILL.md | 62 ++++++--- .../skills/incremental-build/manifest.json | 2 +- .../skills/item-management/SKILL.md | 2 +- .../skills/item-management/manifest.json | 2 +- .../skills/msbuild-antipatterns/SKILL.md | 11 +- .../skills/msbuild-antipatterns/manifest.json | 2 +- .../skills/msbuild-modernization/SKILL.md | 2 +- .../msbuild-modernization/manifest.json | 2 +- .../skills/property-patterns/SKILL.md | 2 +- .../skills/property-patterns/manifest.json | 2 +- .../resolve-project-references/manifest.json | 2 +- .../skills/target-authoring/manifest.json | 2 +- .../skills/template-authoring/manifest.json | 2 +- .../skills/template-comparison/manifest.json | 2 +- .../skills/template-discovery/manifest.json | 2 +- .../template-instantiation/manifest.json | 2 +- .../template-smart-defaults/manifest.json | 2 +- .../skills/template-validation/manifest.json | 2 +- .../.agents/skills/create-skill/SKILL.md | 4 + .../skills/vectorization/SKILL.md | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../plugins/dotnet-aspnetcore/plugin.json | 2 +- .../dotnet-blazor/.claude-plugin/plugin.json | 2 +- .../dotnet-blazor/.codex-plugin/plugin.json | 2 +- .../plugins/dotnet-blazor/plugin.json | 2 +- .../skills/configure-auth/SKILL.md | 2 +- .../dotnet-diag/.claude-plugin/plugin.json | 2 +- .../dotnet-diag/.codex-plugin/plugin.json | 2 +- .../plugins/dotnet-diag/plugin.json | 2 +- .../dotnet-msbuild/.claude-plugin/plugin.json | 2 +- .../dotnet-msbuild/.codex-plugin/plugin.json | 2 +- .../plugins/dotnet-msbuild/plugin.json | 2 +- .../skills/binlog-failure-analysis/SKILL.md | 6 +- .../skills/binlog-generation/SKILL.md | 16 +-- .../skills/build-parallelism/SKILL.md | 24 +++- .../skills/build-perf-baseline/SKILL.md | 104 +++++++++++---- .../skills/build-perf-diagnostics/SKILL.md | 4 +- .../skills/check-bin-obj-clash/SKILL.md | 2 +- .../directory-build-organization/SKILL.md | 32 ++++- .../skills/eval-performance/SKILL.md | 2 +- .../skills/extension-points/SKILL.md | 2 +- .../skills/including-generated-files/SKILL.md | 2 +- .../skills/incremental-build/SKILL.md | 62 ++++++--- .../skills/item-management/SKILL.md | 2 +- .../skills/msbuild-antipatterns/SKILL.md | 11 +- .../skills/msbuild-modernization/SKILL.md | 2 +- .../skills/property-patterns/SKILL.md | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../dotnet-template-engine/plugin.json | 2 +- .../.claude-plugin/plugin.json | 2 +- .../.codex-plugin/plugin.json | 2 +- .../plugins/dotnet-test-migration/plugin.json | 2 +- .../dotnet-test/.claude-plugin/plugin.json | 2 +- .../dotnet-test/.codex-plugin/plugin.json | 2 +- .../plugins/dotnet-test/README.md | 6 +- .../agents/test-quality-auditor.agent.md | 15 ++- .../plugins/dotnet-test/plugin.json | 2 +- .../dotnet-test/skills/grade-tests/SKILL.md | 125 ++++++++++-------- .../plugins/dotnet/.claude-plugin/plugin.json | 2 +- .../plugins/dotnet/.codex-plugin/plugin.json | 2 +- .../dotnet-skills/plugins/dotnet/plugin.json | 2 +- .../skills/system-text-json-net11/SKILL.md | 9 +- external-sources/vendir.lock.yml | 13 +- 148 files changed, 698 insertions(+), 389 deletions(-) diff --git a/catalog/Frameworks/Official-DotNet-ASPNetCore/skills/convert-blazor-server-to-webapp/manifest.json b/catalog/Frameworks/Official-DotNet-ASPNetCore/skills/convert-blazor-server-to-webapp/manifest.json index f0bfd1b2..c833b814 100644 --- a/catalog/Frameworks/Official-DotNet-ASPNetCore/skills/convert-blazor-server-to-webapp/manifest.json +++ b/catalog/Frameworks/Official-DotNet-ASPNetCore/skills/convert-blazor-server-to-webapp/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.1", + "version": "0.1.2", "category": "Web", "compatibility": "Requires an ASP.NET Core project or solution." } diff --git a/catalog/Frameworks/Official-DotNet-ASPNetCore/skills/dotnet-webapi/manifest.json b/catalog/Frameworks/Official-DotNet-ASPNetCore/skills/dotnet-webapi/manifest.json index f0bfd1b2..c833b814 100644 --- a/catalog/Frameworks/Official-DotNet-ASPNetCore/skills/dotnet-webapi/manifest.json +++ b/catalog/Frameworks/Official-DotNet-ASPNetCore/skills/dotnet-webapi/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.1", + "version": "0.1.2", "category": "Web", "compatibility": "Requires an ASP.NET Core project or solution." } diff --git a/catalog/Frameworks/Official-DotNet-Blazor/skills/author-component/manifest.json b/catalog/Frameworks/Official-DotNet-Blazor/skills/author-component/manifest.json index 9f71cbb7..e7f95460 100644 --- a/catalog/Frameworks/Official-DotNet-Blazor/skills/author-component/manifest.json +++ b/catalog/Frameworks/Official-DotNet-Blazor/skills/author-component/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.1", + "version": "0.1.2", "category": "Web", "compatibility": "Requires a Blazor project or solution.", "package_prefix": "Microsoft.AspNetCore.Components" diff --git a/catalog/Frameworks/Official-DotNet-Blazor/skills/collect-user-input/manifest.json b/catalog/Frameworks/Official-DotNet-Blazor/skills/collect-user-input/manifest.json index 9f71cbb7..e7f95460 100644 --- a/catalog/Frameworks/Official-DotNet-Blazor/skills/collect-user-input/manifest.json +++ b/catalog/Frameworks/Official-DotNet-Blazor/skills/collect-user-input/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.1", + "version": "0.1.2", "category": "Web", "compatibility": "Requires a Blazor project or solution.", "package_prefix": "Microsoft.AspNetCore.Components" diff --git a/catalog/Frameworks/Official-DotNet-Blazor/skills/configure-auth/SKILL.md b/catalog/Frameworks/Official-DotNet-Blazor/skills/configure-auth/SKILL.md index 7d11621f..423beaf6 100644 --- a/catalog/Frameworks/Official-DotNet-Blazor/skills/configure-auth/SKILL.md +++ b/catalog/Frameworks/Official-DotNet-Blazor/skills/configure-auth/SKILL.md @@ -6,7 +6,7 @@ description: > USE WHEN the user needs [Authorize] on pages, AuthorizeView, role or policy-based access, login/logout Identity pages, or AuthenticationStateProvider. Also USE WHEN auth state is null after WebAssembly loads, SignInManager throws in an interactive - component, content never renders in static SSR, or HttpContext.User is null in + component, NotAuthorized content never renders in static SSR, or HttpContext.User is null in an interactive component. DO NOT USE for general component authoring (see author-component), for prerendering concerns unrelated to auth (see support-prerendering), or for managing non-auth cascading state diff --git a/catalog/Frameworks/Official-DotNet-Blazor/skills/configure-auth/manifest.json b/catalog/Frameworks/Official-DotNet-Blazor/skills/configure-auth/manifest.json index 9f71cbb7..e7f95460 100644 --- a/catalog/Frameworks/Official-DotNet-Blazor/skills/configure-auth/manifest.json +++ b/catalog/Frameworks/Official-DotNet-Blazor/skills/configure-auth/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.1", + "version": "0.1.2", "category": "Web", "compatibility": "Requires a Blazor project or solution.", "package_prefix": "Microsoft.AspNetCore.Components" diff --git a/catalog/Frameworks/Official-DotNet-Blazor/skills/coordinate-components/manifest.json b/catalog/Frameworks/Official-DotNet-Blazor/skills/coordinate-components/manifest.json index 9f71cbb7..e7f95460 100644 --- a/catalog/Frameworks/Official-DotNet-Blazor/skills/coordinate-components/manifest.json +++ b/catalog/Frameworks/Official-DotNet-Blazor/skills/coordinate-components/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.1", + "version": "0.1.2", "category": "Web", "compatibility": "Requires a Blazor project or solution.", "package_prefix": "Microsoft.AspNetCore.Components" diff --git a/catalog/Frameworks/Official-DotNet-Blazor/skills/create-blazor-project/manifest.json b/catalog/Frameworks/Official-DotNet-Blazor/skills/create-blazor-project/manifest.json index 9f71cbb7..e7f95460 100644 --- a/catalog/Frameworks/Official-DotNet-Blazor/skills/create-blazor-project/manifest.json +++ b/catalog/Frameworks/Official-DotNet-Blazor/skills/create-blazor-project/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.1", + "version": "0.1.2", "category": "Web", "compatibility": "Requires a Blazor project or solution.", "package_prefix": "Microsoft.AspNetCore.Components" diff --git a/catalog/Frameworks/Official-DotNet-Blazor/skills/fetch-and-send-data/manifest.json b/catalog/Frameworks/Official-DotNet-Blazor/skills/fetch-and-send-data/manifest.json index 9f71cbb7..e7f95460 100644 --- a/catalog/Frameworks/Official-DotNet-Blazor/skills/fetch-and-send-data/manifest.json +++ b/catalog/Frameworks/Official-DotNet-Blazor/skills/fetch-and-send-data/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.1", + "version": "0.1.2", "category": "Web", "compatibility": "Requires a Blazor project or solution.", "package_prefix": "Microsoft.AspNetCore.Components" diff --git a/catalog/Frameworks/Official-DotNet-Blazor/skills/plan-ui-change/manifest.json b/catalog/Frameworks/Official-DotNet-Blazor/skills/plan-ui-change/manifest.json index 9f71cbb7..e7f95460 100644 --- a/catalog/Frameworks/Official-DotNet-Blazor/skills/plan-ui-change/manifest.json +++ b/catalog/Frameworks/Official-DotNet-Blazor/skills/plan-ui-change/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.1", + "version": "0.1.2", "category": "Web", "compatibility": "Requires a Blazor project or solution.", "package_prefix": "Microsoft.AspNetCore.Components" diff --git a/catalog/Frameworks/Official-DotNet-Blazor/skills/support-prerendering/manifest.json b/catalog/Frameworks/Official-DotNet-Blazor/skills/support-prerendering/manifest.json index 9f71cbb7..e7f95460 100644 --- a/catalog/Frameworks/Official-DotNet-Blazor/skills/support-prerendering/manifest.json +++ b/catalog/Frameworks/Official-DotNet-Blazor/skills/support-prerendering/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.1", + "version": "0.1.2", "category": "Web", "compatibility": "Requires a Blazor project or solution.", "package_prefix": "Microsoft.AspNetCore.Components" diff --git a/catalog/Frameworks/Official-DotNet-Blazor/skills/use-igniteui-blazor/manifest.json b/catalog/Frameworks/Official-DotNet-Blazor/skills/use-igniteui-blazor/manifest.json index c7348263..b7529ecb 100644 --- a/catalog/Frameworks/Official-DotNet-Blazor/skills/use-igniteui-blazor/manifest.json +++ b/catalog/Frameworks/Official-DotNet-Blazor/skills/use-igniteui-blazor/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.1", + "version": "0.1.2", "category": "Web", "compatibility": "Requires a Blazor project or solution.", "package_prefix": "IgniteUI.Blazor" diff --git a/catalog/Frameworks/Official-DotNet-Blazor/skills/use-js-interop/manifest.json b/catalog/Frameworks/Official-DotNet-Blazor/skills/use-js-interop/manifest.json index 9f71cbb7..e7f95460 100644 --- a/catalog/Frameworks/Official-DotNet-Blazor/skills/use-js-interop/manifest.json +++ b/catalog/Frameworks/Official-DotNet-Blazor/skills/use-js-interop/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.1", + "version": "0.1.2", "category": "Web", "compatibility": "Requires a Blazor project or solution.", "package_prefix": "Microsoft.AspNetCore.Components" diff --git a/catalog/Platform/Official-DotNet-Advanced/skills/vectorization/SKILL.md b/catalog/Platform/Official-DotNet-Advanced/skills/vectorization/SKILL.md index 1d5e9d77..c98d5d10 100644 --- a/catalog/Platform/Official-DotNet-Advanced/skills/vectorization/SKILL.md +++ b/catalog/Platform/Official-DotNet-Advanced/skills/vectorization/SKILL.md @@ -4,7 +4,7 @@ description: > Design, implement, optimize, and review SIMD code in .NET. USE FOR: vectorizing scalar loops with TensorPrimitives, Vector64/128/256/512, or platform hardware intrinsics; reviewing existing SIMD - code, including Vector, for contract equivalence, tail handling, memory + code, including the generic Vector type, for contract equivalence, tail handling, memory safety, portability, fallbacks, and measured performance. DO NOT USE FOR: performance work unrelated to SIMD or vectorization. license: MIT diff --git a/catalog/Platform/Official-DotNet-Dotnet11/skills/system-text-json-net11/SKILL.md b/catalog/Platform/Official-DotNet-Dotnet11/skills/system-text-json-net11/SKILL.md index 25c7bf95..20a6daae 100644 --- a/catalog/Platform/Official-DotNet-Dotnet11/skills/system-text-json-net11/SKILL.md +++ b/catalog/Platform/Official-DotNet-Dotnet11/skills/system-text-json-net11/SKILL.md @@ -2,13 +2,12 @@ name: system-text-json-net11 description: > Imperative guidance for the System.Text.Json APIs added in .NET 11: the built-in - `JsonNamingPolicy.PascalCase` naming policy, and the strongly-typed - `JsonSerializerOptions.GetTypeInfo()` and - `JsonSerializerOptions.TryGetTypeInfo(out JsonTypeInfo? info)` - metadata accessors. + `JsonNamingPolicy.PascalCase` naming policy, and the strongly-typed generic + `JsonSerializerOptions.GetTypeInfo` and `JsonSerializerOptions.TryGetTypeInfo` + metadata accessors (generic overloads that return a typed `JsonTypeInfo`). USE ONLY when the user is targeting net11.0 or later and needs PascalCase JSON property or dictionary-key names without writing a custom naming policy, a strongly-typed - `JsonTypeInfo` instead of the non-generic `JsonTypeInfo`, or a no-throw way to probe + generic `JsonTypeInfo` instead of the non-generic `JsonTypeInfo`, or a no-throw way to probe whether a type's serialization metadata is resolved. DO NOT USE when the target is earlier than net11.0, the requested behavior uses an established pre-net11 naming policy, or the user explicitly selected another JSON library. diff --git a/catalog/Platform/Official-DotNet/skills/csharp-refactoring/manifest.json b/catalog/Platform/Official-DotNet/skills/csharp-refactoring/manifest.json index 24520a62..2bcc99fa 100644 --- a/catalog/Platform/Official-DotNet/skills/csharp-refactoring/manifest.json +++ b/catalog/Platform/Official-DotNet/skills/csharp-refactoring/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.4", + "version": "0.2.5", "category": "Code Quality", "compatibility": "Requires a .NET repository or solution." } diff --git a/catalog/Platform/Official-DotNet/skills/msbuild/manifest.json b/catalog/Platform/Official-DotNet/skills/msbuild/manifest.json index 286bd19c..a7dbe8b3 100644 --- a/catalog/Platform/Official-DotNet/skills/msbuild/manifest.json +++ b/catalog/Platform/Official-DotNet/skills/msbuild/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.4", + "version": "0.2.5", "category": "Core", "compatibility": "Requires a .NET repository or solution." } diff --git a/catalog/Platform/Official-DotNet/skills/setup-local-sdk/manifest.json b/catalog/Platform/Official-DotNet/skills/setup-local-sdk/manifest.json index 286bd19c..a7dbe8b3 100644 --- a/catalog/Platform/Official-DotNet/skills/setup-local-sdk/manifest.json +++ b/catalog/Platform/Official-DotNet/skills/setup-local-sdk/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.4", + "version": "0.2.5", "category": "Core", "compatibility": "Requires a .NET repository or solution." } diff --git a/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-mstest-v1v2-to-v3/manifest.json b/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-mstest-v1v2-to-v3/manifest.json index 7637f2ac..378a369f 100644 --- a/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-mstest-v1v2-to-v3/manifest.json +++ b/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-mstest-v1v2-to-v3/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.9", + "version": "0.1.10", "category": "Migration", "compatibility": "Requires a .NET test project being migrated between frameworks, framework versions, or test platforms.", "package_prefix": "MSTest" diff --git a/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-mstest-v3-to-v4/manifest.json b/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-mstest-v3-to-v4/manifest.json index 7637f2ac..378a369f 100644 --- a/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-mstest-v3-to-v4/manifest.json +++ b/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-mstest-v3-to-v4/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.9", + "version": "0.1.10", "category": "Migration", "compatibility": "Requires a .NET test project being migrated between frameworks, framework versions, or test platforms.", "package_prefix": "MSTest" diff --git a/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-nunit-to-mstest/manifest.json b/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-nunit-to-mstest/manifest.json index 1678cb61..961e76ce 100644 --- a/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-nunit-to-mstest/manifest.json +++ b/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-nunit-to-mstest/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.9", + "version": "0.1.10", "category": "Migration", "compatibility": "Requires a .NET test project being migrated between frameworks, framework versions, or test platforms." } diff --git a/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-vstest-to-mtp/manifest.json b/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-vstest-to-mtp/manifest.json index 1678cb61..961e76ce 100644 --- a/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-vstest-to-mtp/manifest.json +++ b/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-vstest-to-mtp/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.9", + "version": "0.1.10", "category": "Migration", "compatibility": "Requires a .NET test project being migrated between frameworks, framework versions, or test platforms." } diff --git a/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-xunit-to-mstest/manifest.json b/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-xunit-to-mstest/manifest.json index 1678cb61..961e76ce 100644 --- a/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-xunit-to-mstest/manifest.json +++ b/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-xunit-to-mstest/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.9", + "version": "0.1.10", "category": "Migration", "compatibility": "Requires a .NET test project being migrated between frameworks, framework versions, or test platforms." } diff --git a/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-xunit-to-xunit-v3/manifest.json b/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-xunit-to-xunit-v3/manifest.json index 31578594..35088f6d 100644 --- a/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-xunit-to-xunit-v3/manifest.json +++ b/catalog/Testing/Official-DotNet-Test-Migration/skills/migrate-xunit-to-xunit-v3/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.9", + "version": "0.1.10", "category": "Migration", "compatibility": "Requires a .NET test project being migrated between frameworks, framework versions, or test platforms.", "packages": [ diff --git a/catalog/Testing/Official-DotNet-Test/agents/test-quality-auditor/AGENT.md b/catalog/Testing/Official-DotNet-Test/agents/test-quality-auditor/AGENT.md index 48562d90..8ada2582 100644 --- a/catalog/Testing/Official-DotNet-Test/agents/test-quality-auditor/AGENT.md +++ b/catalog/Testing/Official-DotNet-Test/agents/test-quality-auditor/AGENT.md @@ -33,10 +33,14 @@ broad health check: | Project-wide coverage, plateaus, or risk hotspots | `coverage-analysis` for .NET; native tooling otherwise | | CRAP or coverage-and-complexity risk for one named method, class, or file | `crap-score` | | Tags, traits, or test-type distribution | `test-tagging` | +| Curated tests needing a PR-ready Pass / Failed / Uncertain decision | `grade-tests` | | Generate or repair tests | `code-testing-agent`; it uses its direct workflow for focused work and delegates broad work to `code-testing-generator` | For a focused request, invoke the matching skill once and stop. A request to -generate tests is not an audit; leave this agent dormant. +grade a curated list is a focused decision report, not an audit dimension: route +to `grade-tests` once and do not add it to the broad pipeline unless the user +explicitly requested per-test decisions. A request to generate tests is not an +audit; leave this agent dormant. ## Workflow @@ -84,6 +88,10 @@ not rescan the same files. Invoke each applicable skill at most once: If coverage is unavailable, say it was not measured; do not launch collection just because this is a broad audit. +Do not run `grade-tests` as part of a general audit. Its zero-finding +Pass / Failed / Uncertain / Not applicable decision is designed for a bounded +test list or changed-test diff, not suite-wide health synthesis. + Run optional dimensions only when the user requested them or core findings make them necessary: @@ -115,8 +123,9 @@ number of tools/skills used. 3. One inventory, one execution probe, one invocation per selected skill. 4. No automatic coverage collection, mutation run, tagging, or experimental analysis without evidence or explicit user intent. -5. Skip inapplicable dimensions explicitly rather than simulating them. -6. Mention testability migration only for an explicit permitted .NET production +5. No automatic per-test grading during a broad audit. +6. Skip inapplicable dimensions explicitly rather than simulating them. +7. Mention testability migration only for an explicit permitted .NET production refactor request. ## Completion Condition diff --git a/catalog/Testing/Official-DotNet-Test/skills/assertion-quality/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/assertion-quality/manifest.json index 31abb0f0..dec12fb9 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/assertion-quality/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/assertion-quality/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/code-testing-agent/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/code-testing-agent/manifest.json index 31abb0f0..dec12fb9 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/code-testing-agent/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/code-testing-agent/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/code-testing-extensions/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/code-testing-extensions/manifest.json index 31abb0f0..dec12fb9 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/code-testing-extensions/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/code-testing-extensions/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/coverage-analysis/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/coverage-analysis/manifest.json index ef63c5db..0ffecdc2 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/coverage-analysis/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/coverage-analysis/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution.", "packages": [ diff --git a/catalog/Testing/Official-DotNet-Test/skills/crap-score/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/crap-score/manifest.json index 31abb0f0..dec12fb9 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/crap-score/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/crap-score/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/detect-static-dependencies/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/detect-static-dependencies/manifest.json index 31abb0f0..dec12fb9 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/detect-static-dependencies/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/detect-static-dependencies/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/filter-syntax/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/filter-syntax/manifest.json index 31abb0f0..dec12fb9 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/filter-syntax/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/filter-syntax/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/find-untested-sources/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/find-untested-sources/manifest.json index 31abb0f0..dec12fb9 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/find-untested-sources/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/find-untested-sources/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/generate-testability-wrappers/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/generate-testability-wrappers/manifest.json index 31abb0f0..dec12fb9 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/generate-testability-wrappers/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/generate-testability-wrappers/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/grade-tests/SKILL.md b/catalog/Testing/Official-DotNet-Test/skills/grade-tests/SKILL.md index 6829a6e8..a7f2b5a5 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/grade-tests/SKILL.md +++ b/catalog/Testing/Official-DotNet-Test/skills/grade-tests/SKILL.md @@ -1,25 +1,24 @@ --- name: grade-tests description: > - Grade specified test methods individually and produce a concise PR-ready - table with each fully qualified test name, an A-F grade, score band, and - one-line note. USE FOR per-test feedback on a curated list such as new or - modified tests in a pull request, not a suite-wide audit. Polyglot: .NET, - Python, TS/JS, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, C++. Inputs - may be test methods, method bodies, or file-and-line spans. DO NOT USE FOR: - full suite audits (use test-quality-auditor agent or test-anti-patterns), - writing new tests (use code-testing-generator agent or writing-mstest-tests), - fixing failures, or measuring code coverage. + Assess a curated list of tests and produce a PR-ready table with a primary + Pass, Failed, Uncertain, or Not applicable result plus A-F quality detail for + every resolved test; Uncertain and Not applicable omit the grade. USE FOR new + or modified tests supplied as methods, bodies, file spans, or a bounded PR + diff. Polyglot: .NET, Python, TS/JS, Java, Go, Ruby, Rust, Swift, Kotlin, + PowerShell, C++. DO NOT USE FOR: suite-wide audits (use test-quality-auditor + or test-anti-patterns), writing or fixing tests, or measuring coverage. license: MIT --- # Grade Tests -Grade a curated list of test methods and produce a compact, PR-comment-friendly -report: one row per test method with a letter grade, a score band, and a -one-line note explaining the grade. The skill **does not discover tests on its -own** — the caller (typically a PR automation workflow or a human reviewer -holding a specific list) provides the test methods to grade. +Assess a curated list of test methods and produce a compact, +PR-comment-friendly report. The primary result is one of **Pass**, **Failed**, +**Uncertain**, or **Not applicable**; an A-F quality grade remains secondary +diagnostic information. The skill **does not discover tests on its own** — the +caller (typically a PR automation workflow or a human reviewer holding a +specific list) provides the tests or a bounded diff to assess. > **Language-specific guidance**: Call the `test-analysis-extensions` skill > to discover available extension files, then read the file matching the @@ -29,22 +28,21 @@ holding a specific list) provides the test methods to grade. > anti-patterns, because assertion APIs and idiomatic patterns differ > significantly across frameworks. -## Why a Per-Test Grade +## Why a Decision Result Plus Quality Detail -Suite-wide audits (`test-anti-patterns`, `assertion-quality`, -`test-smell-detection`) produce excellent diagnostic reports, but they are -hard to consume as a short PR comment. Reviewers of a PR mostly want to know: -*for the tests this PR adds or changes, are they good?* This skill answers -that question with a one-row-per-test verdict that fits in a comment table. +PR reviewers need a simple answer to *does this test need follow-up?* The +four-state result provides that decision; the existing A-F rubric explains its +quality and severity. ## When to Use -- A PR automation workflow needs to post a comment grading the tests - introduced or modified in a pull request. +- A PR automation workflow needs to post a decision on the tests introduced or + modified in a pull request. - A reviewer has a specific list of tests (a file, a class, a method list, - or a diff hunk) and wants a per-test verdict rather than a suite report. + or a diff hunk) and wants per-test follow-up decisions rather than a suite + report. - A maintainer wants to triage which of N tests in a contribution deserve - follow-up improvements. + follow-up improvements, with quality grades for resolved tests. ## When Not to Use @@ -85,6 +83,9 @@ short message asking the caller to provide an explicit list / file(s) / diff, and optionally point them at `test-quality-auditor` agent or `test-anti-patterns` skill for full-suite analysis. Stop there. +If a valid bounded scope resolves to zero eligible tests, return +**Not applicable** with a short explanation and no invented rows. + ## Workflow ### Step 1: Detect language and load extension @@ -106,10 +107,12 @@ For each entry in the input list: 2. Otherwise read the file at the given path and locate the method by its fully-qualified name. Capture the full method body, including attributes / decorators / fixtures and any helper code that the test calls. -3. If a method cannot be found, record it as `N/A — method not found` and - continue. Never invent a body to grade. +3. If a requested method cannot be found, record it as + `Uncertain — method not found` with no quality grade and continue. Never + invent a body to grade. A missing requested method requires human review; + it is not the same as a valid scope containing no tests. -### Step 3: Score each test +### Step 3: Score each resolved test Start every test at grade **A (score band 90–100)**, then apply deductions strictly for **observable issues** in the captured body. Do **not** deduct @@ -260,46 +263,58 @@ Report the **letter grade** and the **score band** (not a single 0–100 number). False precision invites bikeshedding; bands keep the conversation focused on the rubric. -### Step 4: Build the note +### Step 4: Assign the decision result + +The grade summarizes strength; the result says whether follow-up exists. +An actionable improvement is an evidence-backed change to the test, setup, or +fixtures. Assign exactly one: + +- **Pass** — no actionable improvement; positive/context-only notes are allowed. +- **Failed** — at least one actionable improvement, regardless of grade. +- **Uncertain** — missing evidence prevents a decision and needs human review. +- **Not applicable** — a valid scope contains no eligible tests; normally an + overall result with no rows. -The note column is one short sentence (target ≤ 120 characters). State the -single most important reason for the grade. Examples: +Do not derive status from grade: a complete focused test can be **B / Pass**, +while debug output can make an otherwise excellent test **A / Failed**. Use +Uncertain for an unresolved body, unsupported construct, or essential missing +contract—not merely absent production code. A definite finding wins over +uncertainty. -- A (90–100): `Clear AAA structure; equality + exception assertions on the public contract.` -- B (80–89): `Good assertion variety, mildly long body — consider splitting into per-condition tests.` -- C (70–79): `Only checks IsNotNull on the result; no value verification.` -- D (60–69): `Self-referential assertion: round-trip identity verifies plumbing, not transformation.` -- F (0–59): `No assertions — test executes the method but never verifies anything.` +### Step 5: Build the note -If a test gets A with no notable issues, the note may simply be -`No issues found.` — do not invent weaknesses to justify the grade. +Use one sentence (target ≤ 120 characters) for the most important reason: +`No issues found.`, `Only checks IsNotNull; add value verification.`, or +`Method body could not be resolved; human review is required.` Do not invent a +weakness to justify a grade or Failed result. -### Step 5: Report +### Step 6: Report Produce two sections. #### 1. Summary -A short paragraph (2–4 sentences) covering: total tests graded, grade -distribution, most common issue, and the single most important -recommendation. +Begin with `**Result: **`, then give result +counts and the highest-priority action. Aggregate using +**Failed → Uncertain → Pass → Not applicable**. For Not applicable, explain the +empty scope and omit the table. #### 2. Per-test table ```markdown -| Test | Grade | Band | Notes | -|------|-------|------|-------| -| `Namespace.ClassName.Test_Method_Condition_Expected` | A | 90–100 | Clear AAA; equality + exception assertions. | -| `Namespace.ClassName.Test_Other` | C | 70–79 | Only `IsNotNull` — no value verification. | -| `Namespace.ClassName.Test_Old` | F | 0–59 | No assertions. | +| Test | Result | Quality | Notes | +|------|--------|---------|-------| +| `Namespace.ClassName.Test_Method_Condition_Expected` | Pass | A (90–100) | No issues found. | +| `Namespace.ClassName.Test_Other` | Failed | C (70–79) | Only `IsNotNull`; add value verification. | +| `Namespace.ClassName.Test_Missing` | Uncertain | — | Method body could not be resolved; human review is required. | ``` **Caps and ordering**: -- If the table would exceed **50 rows**, show all tests graded below **B** - first (worst to best), then a sample of the best tests, and wrap any - overflow in a collapsed `
` block. -- Within the same grade, order by file path then by method name for - determinism. +- If the table would exceed **50 rows**, show Failed tests first, then + Uncertain tests, then a sample of Pass tests. Wrap overflow in a collapsed + `
` block. +- Within the same result, order by quality from worst to best, then by file + path and method name for determinism. - If the diff context is provided, prefix each test name with a `(new)` or `(modified)` marker. @@ -309,7 +324,9 @@ prefix each section with the language name and framework. ## Validation - [ ] Every test in the input list appears in the table (or is recorded as - `N/A — method not found`). + `Uncertain — method not found`). +- [ ] Every resolved test has Pass or Failed plus A-F quality detail. +- [ ] Uncertain is an evidence gap; Not applicable is a valid empty scope. - [ ] Every grade is justified by at least one observable signal in the captured body — no speculative deductions. - [ ] Trivial-assertion tests are flagged only when the **only** assertion @@ -343,6 +360,8 @@ prefix each section with the language name and framework. | Treating pytest bare `assert` or Go `if got != want { t.Error… }` as missing-framework | Both are canonical; count in the correct assertion category. | | Penalizing tests when production code is unavailable | Mark concerns about uncovered behaviors as `Unverified` and do not deduct. | | Using a fake-precise score (e.g., 87/100) | Use the score band only — 90–100, 80–89, 70–79, 60–69, 0–59. | -| Spilling a 500-row table into a PR comment | Apply the row cap from Step 5; collapse extras into `
`. | +| Spilling a 500-row table into a PR comment | Apply the row cap from Step 6; collapse extras into `
`. | | Re-reporting an existing finding three times under different categories | Pick the most fitting category and report once. | | Inventing weaknesses for A-grade tests to make the note "balanced" | If a test is clean, the note may simply read `No issues found.` | +| Mapping status from grade or comments | Fail only for actionable improvements; a B can Pass and an A can Fail. | +| Confusing Uncertain and Not applicable | Evidence gaps are Uncertain; a valid empty scope is Not applicable. | diff --git a/catalog/Testing/Official-DotNet-Test/skills/grade-tests/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/grade-tests/manifest.json index 31abb0f0..dec12fb9 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/grade-tests/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/grade-tests/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/migrate-static-to-wrapper/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/migrate-static-to-wrapper/manifest.json index e5db7ecd..cee18a89 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/migrate-static-to-wrapper/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/migrate-static-to-wrapper/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Migration", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/mtp-hot-reload/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/mtp-hot-reload/manifest.json index 31abb0f0..dec12fb9 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/mtp-hot-reload/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/mtp-hot-reload/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/platform-detection/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/platform-detection/manifest.json index 31abb0f0..dec12fb9 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/platform-detection/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/platform-detection/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/run-tests/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/run-tests/manifest.json index 31abb0f0..dec12fb9 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/run-tests/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/run-tests/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/scaffold-dotnet-test-project/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/scaffold-dotnet-test-project/manifest.json index 31abb0f0..dec12fb9 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/scaffold-dotnet-test-project/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/scaffold-dotnet-test-project/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/test-analysis-extensions/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/test-analysis-extensions/manifest.json index 31abb0f0..dec12fb9 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/test-analysis-extensions/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/test-analysis-extensions/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/test-anti-patterns/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/test-anti-patterns/manifest.json index 31abb0f0..dec12fb9 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/test-anti-patterns/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/test-anti-patterns/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/test-gap-analysis/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/test-gap-analysis/manifest.json index 31abb0f0..dec12fb9 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/test-gap-analysis/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/test-gap-analysis/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/test-smell-detection/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/test-smell-detection/manifest.json index 31abb0f0..dec12fb9 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/test-smell-detection/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/test-smell-detection/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/test-tagging/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/test-tagging/manifest.json index 31abb0f0..dec12fb9 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/test-tagging/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/test-tagging/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/testability-obstacle/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/testability-obstacle/manifest.json index 31abb0f0..dec12fb9 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/testability-obstacle/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/testability-obstacle/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution." } diff --git a/catalog/Testing/Official-DotNet-Test/skills/writing-mstest-tests/manifest.json b/catalog/Testing/Official-DotNet-Test/skills/writing-mstest-tests/manifest.json index e78730f5..d48ab94a 100644 --- a/catalog/Testing/Official-DotNet-Test/skills/writing-mstest-tests/manifest.json +++ b/catalog/Testing/Official-DotNet-Test/skills/writing-mstest-tests/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.22", + "version": "0.2.23", "category": "Testing", "compatibility": "Requires a .NET test project or solution.", "package_prefix": "MSTest" diff --git a/catalog/Tools/Official-DotNet-Agentic-Workflows/skills/agentic-workflows/manifest.json b/catalog/Tools/Official-DotNet-Agentic-Workflows/skills/agentic-workflows/manifest.json index fbc8573d..16b56884 100644 --- a/catalog/Tools/Official-DotNet-Agentic-Workflows/skills/agentic-workflows/manifest.json +++ b/catalog/Tools/Official-DotNet-Agentic-Workflows/skills/agentic-workflows/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.4", + "version": "0.2.5", "category": "Governance", "compatibility": "Requires a GitHub repository using gh-aw and access to the github/gh-aw upstream prompts." } diff --git a/catalog/Tools/Official-DotNet-Authoring-Github-Workflows/skills/authoring-github-workflows/manifest.json b/catalog/Tools/Official-DotNet-Authoring-Github-Workflows/skills/authoring-github-workflows/manifest.json index be5ac4ae..e5dbe2e0 100644 --- a/catalog/Tools/Official-DotNet-Authoring-Github-Workflows/skills/authoring-github-workflows/manifest.json +++ b/catalog/Tools/Official-DotNet-Authoring-Github-Workflows/skills/authoring-github-workflows/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.4", + "version": "0.2.5", "category": "Governance", "compatibility": "Requires a GitHub Actions repository and actionlint for local validation." } diff --git a/catalog/Tools/Official-DotNet-Create-Custom-Agent/skills/create-custom-agent/manifest.json b/catalog/Tools/Official-DotNet-Create-Custom-Agent/skills/create-custom-agent/manifest.json index 873a8d3c..fce3147c 100644 --- a/catalog/Tools/Official-DotNet-Create-Custom-Agent/skills/create-custom-agent/manifest.json +++ b/catalog/Tools/Official-DotNet-Create-Custom-Agent/skills/create-custom-agent/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.4", + "version": "0.2.5", "category": "AI", "compatibility": "Requires VS Code or GitHub Copilot custom-agent support." } diff --git a/catalog/Tools/Official-DotNet-Create-Skill-Test/skills/create-skill-test/manifest.json b/catalog/Tools/Official-DotNet-Create-Skill-Test/skills/create-skill-test/manifest.json index cbb55232..9694037c 100644 --- a/catalog/Tools/Official-DotNet-Create-Skill-Test/skills/create-skill-test/manifest.json +++ b/catalog/Tools/Official-DotNet-Create-Skill-Test/skills/create-skill-test/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.4", + "version": "0.2.5", "category": "Governance", "compatibility": "Requires a dotnet/skills checkout and its skill-validator and evaluation tooling." } diff --git a/catalog/Tools/Official-DotNet-Create-Skill/skills/create-skill/SKILL.md b/catalog/Tools/Official-DotNet-Create-Skill/skills/create-skill/SKILL.md index 627ca659..937f2b17 100644 --- a/catalog/Tools/Official-DotNet-Create-Skill/skills/create-skill/SKILL.md +++ b/catalog/Tools/Official-DotNet-Create-Skill/skills/create-skill/SKILL.md @@ -65,6 +65,9 @@ description: . USE FOR: ` or ``. Spell it out in words ("generic Vector type", + "Import element"); `skill-validator check` fails on it. ### Step 3: Write for delta over the baseline model @@ -214,6 +217,7 @@ After creating a skill, verify: - [ ] Skill name matches directory name exactly - [ ] Skill name is lowercase with hyphens only - [ ] Description is non-empty and under 1024 characters +- [ ] Description contains no XML-like tags (for example `Vector`) - [ ] SKILL.md body is under 500 lines - [ ] Instructions are specific and actionable - [ ] Bundled-file paths are relative to the directory that contains `SKILL.md` diff --git a/catalog/Tools/Official-DotNet-Create-Skill/skills/create-skill/manifest.json b/catalog/Tools/Official-DotNet-Create-Skill/skills/create-skill/manifest.json index cbb55232..9694037c 100644 --- a/catalog/Tools/Official-DotNet-Create-Skill/skills/create-skill/manifest.json +++ b/catalog/Tools/Official-DotNet-Create-Skill/skills/create-skill/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.4", + "version": "0.2.5", "category": "Governance", "compatibility": "Requires a dotnet/skills checkout and its skill-validator and evaluation tooling." } diff --git a/catalog/Tools/Official-DotNet-Diagnostics/skills/analyzing-dotnet-performance/manifest.json b/catalog/Tools/Official-DotNet-Diagnostics/skills/analyzing-dotnet-performance/manifest.json index 997af0ef..2f9136ef 100644 --- a/catalog/Tools/Official-DotNet-Diagnostics/skills/analyzing-dotnet-performance/manifest.json +++ b/catalog/Tools/Official-DotNet-Diagnostics/skills/analyzing-dotnet-performance/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.2", + "version": "0.1.3", "category": "Metrics", "compatibility": "Requires a .NET repository, build artifacts, traces, dumps, or a runnable app for diagnostics work." } diff --git a/catalog/Tools/Official-DotNet-Diagnostics/skills/android-tombstone-symbolication/manifest.json b/catalog/Tools/Official-DotNet-Diagnostics/skills/android-tombstone-symbolication/manifest.json index 0f2872db..9f96f2af 100644 --- a/catalog/Tools/Official-DotNet-Diagnostics/skills/android-tombstone-symbolication/manifest.json +++ b/catalog/Tools/Official-DotNet-Diagnostics/skills/android-tombstone-symbolication/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.2", + "version": "0.1.3", "category": "Cross-Platform UI", "compatibility": "Requires a .NET repository, build artifacts, traces, dumps, or a runnable app for diagnostics work." } diff --git a/catalog/Tools/Official-DotNet-Diagnostics/skills/apple-crash-symbolication/manifest.json b/catalog/Tools/Official-DotNet-Diagnostics/skills/apple-crash-symbolication/manifest.json index 0f2872db..9f96f2af 100644 --- a/catalog/Tools/Official-DotNet-Diagnostics/skills/apple-crash-symbolication/manifest.json +++ b/catalog/Tools/Official-DotNet-Diagnostics/skills/apple-crash-symbolication/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.2", + "version": "0.1.3", "category": "Cross-Platform UI", "compatibility": "Requires a .NET repository, build artifacts, traces, dumps, or a runnable app for diagnostics work." } diff --git a/catalog/Tools/Official-DotNet-Diagnostics/skills/clr-activation-debugging/manifest.json b/catalog/Tools/Official-DotNet-Diagnostics/skills/clr-activation-debugging/manifest.json index 997af0ef..2f9136ef 100644 --- a/catalog/Tools/Official-DotNet-Diagnostics/skills/clr-activation-debugging/manifest.json +++ b/catalog/Tools/Official-DotNet-Diagnostics/skills/clr-activation-debugging/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.2", + "version": "0.1.3", "category": "Metrics", "compatibility": "Requires a .NET repository, build artifacts, traces, dumps, or a runnable app for diagnostics work." } diff --git a/catalog/Tools/Official-DotNet-Diagnostics/skills/dotnet-trace-collect/manifest.json b/catalog/Tools/Official-DotNet-Diagnostics/skills/dotnet-trace-collect/manifest.json index 997af0ef..2f9136ef 100644 --- a/catalog/Tools/Official-DotNet-Diagnostics/skills/dotnet-trace-collect/manifest.json +++ b/catalog/Tools/Official-DotNet-Diagnostics/skills/dotnet-trace-collect/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.2", + "version": "0.1.3", "category": "Metrics", "compatibility": "Requires a .NET repository, build artifacts, traces, dumps, or a runnable app for diagnostics work." } diff --git a/catalog/Tools/Official-DotNet-Diagnostics/skills/dump-collect/manifest.json b/catalog/Tools/Official-DotNet-Diagnostics/skills/dump-collect/manifest.json index 997af0ef..2f9136ef 100644 --- a/catalog/Tools/Official-DotNet-Diagnostics/skills/dump-collect/manifest.json +++ b/catalog/Tools/Official-DotNet-Diagnostics/skills/dump-collect/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.2", + "version": "0.1.3", "category": "Metrics", "compatibility": "Requires a .NET repository, build artifacts, traces, dumps, or a runnable app for diagnostics work." } diff --git a/catalog/Tools/Official-DotNet-Diagnostics/skills/microbenchmarking/manifest.json b/catalog/Tools/Official-DotNet-Diagnostics/skills/microbenchmarking/manifest.json index 997af0ef..2f9136ef 100644 --- a/catalog/Tools/Official-DotNet-Diagnostics/skills/microbenchmarking/manifest.json +++ b/catalog/Tools/Official-DotNet-Diagnostics/skills/microbenchmarking/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.2", + "version": "0.1.3", "category": "Metrics", "compatibility": "Requires a .NET repository, build artifacts, traces, dumps, or a runnable app for diagnostics work." } diff --git a/catalog/Tools/Official-DotNet-Improve-Skill-Quality/skills/improve-skill-quality/manifest.json b/catalog/Tools/Official-DotNet-Improve-Skill-Quality/skills/improve-skill-quality/manifest.json index cbb55232..9694037c 100644 --- a/catalog/Tools/Official-DotNet-Improve-Skill-Quality/skills/improve-skill-quality/manifest.json +++ b/catalog/Tools/Official-DotNet-Improve-Skill-Quality/skills/improve-skill-quality/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.2.4", + "version": "0.2.5", "category": "Governance", "compatibility": "Requires a dotnet/skills checkout and its skill-validator and evaluation tooling." } diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/binlog-failure-analysis/SKILL.md b/catalog/Tools/Official-DotNet-MSBuild/skills/binlog-failure-analysis/SKILL.md index c6679594..768e876c 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/binlog-failure-analysis/SKILL.md +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/binlog-failure-analysis/SKILL.md @@ -39,9 +39,9 @@ SDK or in an offline environment). ```bash dotnet msbuild build.binlog -noconlog \ - -fl -flp:v=diag;logfile=full.log;performancesummary \ - -fl1 -flp1:errorsonly;logfile=errors.log \ - -fl2 -flp2:warningsonly;logfile=warnings.log + -fl "-flp:v=diag;logfile=full.log;performancesummary" \ + -fl1 "-flp1:errorsonly;logfile=errors.log" \ + -fl2 "-flp2:warningsonly;logfile=warnings.log" ``` > **PowerShell note:** Use `-flp:"v=diag;logfile=full.log;performancesummary"` diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/binlog-failure-analysis/manifest.json b/catalog/Tools/Official-DotNet-MSBuild/skills/binlog-failure-analysis/manifest.json index 7ff2be8b..2af79182 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/binlog-failure-analysis/manifest.json +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/binlog-failure-analysis/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.10", + "version": "0.1.11", "category": "Core", "compatibility": "Requires a .NET repository with MSBuild project or solution files." } diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/binlog-generation/SKILL.md b/catalog/Tools/Official-DotNet-MSBuild/skills/binlog-generation/SKILL.md index f1df0a69..0d18266c 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/binlog-generation/SKILL.md +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/binlog-generation/SKILL.md @@ -1,6 +1,6 @@ --- name: binlog-generation -description: "Generate MSBuild binary logs (binlogs) for build diagnostics and analysis. USE FOR: adding /bl:{} 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+ / .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)." +description: "Generate MSBuild binary logs (binlogs) for build diagnostics and analysis. USE FOR: adding /bl:{} 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+ / .NET 8 SDK+ for {} placeholder; PowerShell must quote the complete switch as '-bl:{}'. DO NOT USE FOR: non-MSBuild build systems (npm, Maven, CMake), analyzing an existing binlog (use binlog-failure-analysis instead)." license: MIT --- @@ -32,12 +32,12 @@ dotnet test /bl:{} dotnet build --configuration Release /bl:{} ``` -**PowerShell requires escaping the braces:** +**PowerShell requires quoting the complete switch:** ```powershell -# PowerShell: escape { } as {{ }} -dotnet build -bl:{{}} -dotnet test -bl:{{}} +# Keep the literal {} placeholder in one argument +dotnet build '-bl:{}' +dotnet test '-bl:{}' ``` ## Why This Matters @@ -54,9 +54,9 @@ dotnet test -bl:{{}} dotnet build /bl:{} dotnet test /bl:{} -# ✅ CORRECT - PowerShell escaping -dotnet build -bl:{{}} -dotnet test -bl:{{}} +# ✅ CORRECT - quote the complete PowerShell argument +dotnet build '-bl:{}' +dotnet test '-bl:{}' # ❌ WRONG - Missing /bl flag entirely dotnet build diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/binlog-generation/manifest.json b/catalog/Tools/Official-DotNet-MSBuild/skills/binlog-generation/manifest.json index 7ff2be8b..2af79182 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/binlog-generation/manifest.json +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/binlog-generation/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.10", + "version": "0.1.11", "category": "Core", "compatibility": "Requires a .NET repository with MSBuild project or solution files." } diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/build-parallelism/SKILL.md b/catalog/Tools/Official-DotNet-MSBuild/skills/build-parallelism/SKILL.md index 96fdc200..776c44e6 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/build-parallelism/SKILL.md +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/build-parallelism/SKILL.md @@ -1,6 +1,6 @@ --- name: build-parallelism -description: "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: `/maxcpucount` default is 1 (sequential) — always pass `-m` for parallel builds. Covers finding the critical path (longest serial ProjectReference chain), graph build (`/graph`), 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." +description: "Analyze an MSBuild solution, solution filter, or Build.proj that schedules multiple project files. USE FOR: measured idle worker nodes, `-m` that does not scale, a serial ProjectReference critical path, graph builds, or an MSBuild task that builds a Projects list. Requires at least two distinct project files whose scheduling or throughput must be analyzed. DO NOT USE for non-MSBuild build systems." license: MIT --- @@ -9,9 +9,14 @@ license: MIT Work this checklist in order — it targets the usual root cause (a serial dependency chain that no number of cores can parallelize): -1. **Confirm parallelism is even on.** Rebuild with `dotnet build -m /bl:{}` - (PowerShell: `dotnet build -m -bl:{{}}`). `-m` with no number uses all logical - processors; without `-m` MSBuild runs a single node (sequential). +1. **Check how many worker nodes actually built the solution.** Capture a + binlog with `dotnet build /bl:{}` (PowerShell: `dotnet build '-bl:{}'`) and + inspect the node timeline to see whether more than one node ran. Every + `dotnet` CLI command built on the SDK's MSBuild-forwarding path (`build`, + `msbuild`, `test`, `pack`, `publish`, etc.) enables `/maxcpucount` (multiple + nodes) by default; `-m:1` forces a single node. A direct `MSBuild.exe` + invocation is sequential by default, so pass `-m` explicitly to enable + parallel worker nodes there. 2. **Find the critical path.** From the binlog, read per-project timings and the node timeline. If total build time ≈ the sum of the projects on one dependency chain, that chain — not CPU count — is the bottleneck. @@ -27,7 +32,11 @@ dependency chain that no number of cores can parallelize): ## MSBuild Parallelism Model - `/maxcpucount` (or `-m`): number of worker nodes (processes) -- Default: 1 node (sequential!). Always use `-m` for parallel builds +- Every `dotnet` CLI command (`build`, `msbuild`, `test`, `pack`, `publish`, + etc.) passes `/maxcpucount` by default via the SDK's shared MSBuild-forwarding + path; `-m:1` overrides it with one node +- A direct `MSBuild.exe` invocation is sequential by default and requires an + explicit `-m` - Recommended: `-m` without a number = use all logical processors - Each node builds one project at a time - Projects are scheduled based on dependency graph @@ -51,7 +60,8 @@ dependency chain that no number of cores can parallelize): ## Optimizing Project References -- Reduce unnecessary `` — each adds to the dependency chain +- Reduce a `` only after proving it is unnecessary; a slow but + valid dependency must stay in the graph - Use `` to avoid extra evaluations - `` for build-order-only dependencies - Consider if a ProjectReference should be a PackageReference instead (pre-built NuGet) @@ -85,7 +95,7 @@ Use the **binlog MCP server** (`Microsoft.AITools.BinlogMcp`, exposed under the Step-by-step: -1. Replay the binlog: `dotnet msbuild build.binlog -noconlog -fl -flp:v=diag;logfile=full.log;performancesummary` +1. Replay the binlog: `dotnet msbuild build.binlog -noconlog -fl "-flp:v=diag;logfile=full.log;performancesummary"` 2. Check Project Performance Summary at the end of `full.log` 3. Ideal: build time should be much less than sum of project times (parallelism) 4. If build time ≈ sum of project times: too many serial dependencies, or one slow project blocking others diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/build-parallelism/manifest.json b/catalog/Tools/Official-DotNet-MSBuild/skills/build-parallelism/manifest.json index 7ff2be8b..2af79182 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/build-parallelism/manifest.json +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/build-parallelism/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.10", + "version": "0.1.11", "category": "Core", "compatibility": "Requires a .NET repository with MSBuild project or solution files." } diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/build-perf-baseline/SKILL.md b/catalog/Tools/Official-DotNet-MSBuild/skills/build-perf-baseline/SKILL.md index fbfbc958..680a11c9 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/build-perf-baseline/SKILL.md +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/build-perf-baseline/SKILL.md @@ -1,6 +1,6 @@ --- name: build-perf-baseline -description: "Establish build performance baselines and apply systematic optimization techniques. USE FOR: diagnosing slow builds, establishing before/after measurements (cold, warm, no-op scenarios), applying optimization strategies like 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)." +description: "Establish MSBuild/.NET build performance baselines before optimizing. USE FOR: a .NET build or solution that is slow or has build-performance concerns; cold, warm, incremental, or no-op measurements; before/after comparisons; CI build output caching; static graph build decisions; artifacts output; and dependency graph trimming. Start here before build-perf-diagnostics, incremental-build, or build-parallelism. DO NOT USE for webpack, npm, JavaScript bundlers, or other non-MSBuild build systems. For detailed target/task/analyzer bottleneck analysis after baselining, use build-perf-diagnostics." license: MIT --- @@ -20,47 +20,68 @@ Before optimizing a build, you need a **baseline**. Without measurements, optimi ## Step 1: Establish a Performance Baseline -Measure three scenarios to understand where time is spent: +Measure three scenarios to understand where time is spent. Keep the SDK, +configuration, machine, environment variables, restore state, and build command +consistent. Run each scenario at least three times, repeating its setup before +every measured sample, and report the median plus the observed range; a single +timing is not a baseline. Keep setup outside the timed interval. Save each +sample's binlog under a unique name, outside generated output directories. ### Cold Build (First Build) No previous build output exists. Measures the full end-to-end time including restore, compilation, and all targets. -```bash -# Clean everything first -dotnet clean -# Remove bin/obj to truly start fresh -Get-ChildItem -Recurse -Directory -Include bin,obj | Remove-Item -Recurse -Force -# OR on Linux/macOS: -# find . -type d \( -name bin -o -name obj \) -exec rm -rf {} + - -# Measure cold build -dotnet build /bl:cold-build.binlog -m +Before **every cold sample**, restore the same source state, run `dotnet clean` +with the measured configuration, and remove only the confirmed, disposable +output and intermediate directories for the measured projects. Include custom +artifact paths, not just `bin` and `obj`, and obtain approval before deletion. +Verify those outputs are absent before timing the next build. + +This is an **output-cold** build, not necessarily a cold NuGet, OS, or compiler +server cache. Choose and record a consistent cache/server policy for all +samples; do not clear shared caches. If measuring uncached restore, use a +separate, empty package cache for each sample. + +```shell +# After repeating the cold setup; use a unique log name for each sample +dotnet build /bl:cold-build-1.binlog -m ``` ### Warm Build (Incremental Build) Build output exists, some files have changed. Measures how well incremental build works. -```bash -# Build once to populate outputs +Before **every warm sample**, restore the same baseline source contents and +build successfully without timing it. Then apply the same small, build-relevant +edit to the same source file and time the build. Keep the changed file set and +edit identical across samples; do not let edits accumulate. Restore the +baseline contents before the next sample and rebuild them outside the timed +interval. Do not clean between that setup build and its measured build. + +```shell +# Untimed setup after restoring baseline source contents dotnet build -m -# Make a small change (touch one .cs file) -# Then rebuild -dotnet build /bl:warm-build.binlog -m +# Apply the same controlled source edit, then measure with a unique log name +dotnet build /bl:warm-build-1.binlog -m ``` ### No-Op Build (Nothing Changed) -Build output exists, nothing has changed. This should be nearly instant. If it's slow, incremental build is broken. +Build output exists, nothing has changed. Compilation and correctly incremental +targets should skip; compare timing with this build's other samples. -```bash -# Build once to populate outputs +Before **every no-op sample**, restore the same baseline source contents and +run an untimed setup build successfully. Then measure an identical build +without edits, touching inputs, cleaning outputs, or changing properties. +Keep restore and cache/server policy consistent with the other samples. + +```shell +# Untimed setup after restoring baseline source contents dotnet build -m -# Rebuild immediately without changes -dotnet build /bl:noop-build.binlog -m +# Rebuild immediately without changes; use a unique log name for each sample +dotnet build /bl:noop-build-1.binlog -m ``` ### What Good Looks Like @@ -69,12 +90,31 @@ dotnet build /bl:noop-build.binlog -m |----------|------------------| | Cold build | Full compilation, all targets run. This is your absolute baseline | | Warm build | Only changed projects recompile. Time proportional to change scope | -| No-op build | < 5 seconds for small repos, < 30 seconds for large repos. All compilation targets should report "Skipping target — all outputs up-to-date" | +| No-op build | Compilation and correctly incremental custom targets skip; compare duration with this repo's repeated warm and cold samples | **Red flags:** -- No-op build > 30 seconds → incremental build is broken (see `incremental-build` skill) +- No-op time is repeatedly close to warm/cold time, or compilation targets rerun → investigate incrementality (see `incremental-build`) - Warm build recompiles everything → project dependency chain forces full rebuild -- Cold build has long restore → NuGet cache issues +- Restore dominates cold samples → measure `dotnet restore` and `dotnet build --no-restore` separately before changing project structure + +Do not use universal duration or percentage thresholds to declare a bottleneck. +Rank costs against the controlled samples and the build's own target/task +timings. + +### Capture analyzer evidence + +A binlog shows compiler/task timing, but granular analyzer timing requires an +analyzer-reporting run. When supported by the SDK/compiler, capture: + +```shell +dotnet build /bl:analyzers.binlog /p:ReportAnalyzer=true +``` + +Open the binlog in MSBuild Structured Log Viewer and inspect the analyzer +summary under the compiler task. If granular timing is unavailable, compare +otherwise identical samples with `/p:RunAnalyzers=false` as an attribution +experiment; do not present disabling analyzers as the fix. Preserve analyzer +enforcement in CI. ### Recording Baselines @@ -329,10 +369,15 @@ dotnet test --no-build # Skip building documentation dotnet build /p:GenerateDocumentationFile=false -# Skip analyzers during development (not for CI!) +# Attribution experiment only: compare against the same build with analyzers dotnet build /p:RunAnalyzers=false ``` +Use these switches to measure contribution before changing configuration. +Do not recommend permanently disabling analyzers from this baseline step; +route measured analyzer bottlenecks to `build-perf-diagnostics` and preserve +CI enforcement. + ### Use Project-Level Filtering ```bash @@ -356,8 +401,9 @@ Then use the `build-perf-diagnostics` skill and binlog tools for systematic bott ## Optimization Decision Tree ``` -Is your no-op build slow (> 10s per project)? -├── YES → See `incremental-build` skill (fix Inputs/Outputs) +Is your repeated no-op build disproportionately close to warm/cold samples, +or are compile/custom targets rerunning? +├── YES → See `incremental-build` skill (inspect Inputs/Outputs and skip reasons) └── NO Is your cold build slow? ├── YES @@ -373,5 +419,5 @@ Is your no-op build slow (> 10s per project)? └── NO Is your warm build slow? ├── YES → Projects rebuilding unnecessarily → check `incremental-build` skill - └── NO → Build is healthy! Consider graph build or UseArtifactsOutput for further gains + └── NO → Baseline is healthy; adopt graph build or UseArtifactsOutput only for a measured need ``` diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/build-perf-baseline/manifest.json b/catalog/Tools/Official-DotNet-MSBuild/skills/build-perf-baseline/manifest.json index 7ff2be8b..2af79182 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/build-perf-baseline/manifest.json +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/build-perf-baseline/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.10", + "version": "0.1.11", "category": "Core", "compatibility": "Requires a .NET repository with MSBuild project or solution files." } diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/build-perf-diagnostics/SKILL.md b/catalog/Tools/Official-DotNet-MSBuild/skills/build-perf-diagnostics/SKILL.md index 4e9d3c11..ecea02c2 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/build-perf-diagnostics/SKILL.md +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/build-perf-diagnostics/SKILL.md @@ -14,7 +14,7 @@ license: MIT 1. **Generate a binlog**: `dotnet build /bl:{} -m` 2. **Replay to diagnostic log with performance summary**: ```bash - dotnet msbuild build.binlog -noconlog -fl -flp:v=diag;logfile=full.log;performancesummary + dotnet msbuild build.binlog -noconlog -fl "-flp:v=diag;logfile=full.log;performancesummary" ``` 3. **Read the performance summary** (at the end of `full.log`): ```bash @@ -103,7 +103,7 @@ Step-by-step workflow using text log replay: 1. **Replay with performance summary**: ```bash - dotnet msbuild build.binlog -noconlog -fl -flp:v=diag;logfile=full.log;performancesummary + dotnet msbuild build.binlog -noconlog -fl "-flp:v=diag;logfile=full.log;performancesummary" ``` 2. **Read target/task performance summaries** (at the end of `full.log`): ```bash diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/build-perf-diagnostics/manifest.json b/catalog/Tools/Official-DotNet-MSBuild/skills/build-perf-diagnostics/manifest.json index 7ff2be8b..2af79182 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/build-perf-diagnostics/manifest.json +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/build-perf-diagnostics/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.10", + "version": "0.1.11", "category": "Core", "compatibility": "Requires a .NET repository with MSBuild project or solution files." } diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/check-bin-obj-clash/SKILL.md b/catalog/Tools/Official-DotNet-MSBuild/skills/check-bin-obj-clash/SKILL.md index 8d1007cf..48be6127 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/check-bin-obj-clash/SKILL.md +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/check-bin-obj-clash/SKILL.md @@ -78,7 +78,7 @@ Use this only when the MCP server cannot be started. Replay the binlog to a diagnostic text log, then grep for the same signals the MCP tools surface: ```bash -dotnet msbuild build.binlog -noconlog -fl -flp:v=diag;logfile=full.log +dotnet msbuild build.binlog -noconlog -fl "-flp:v=diag;logfile=full.log" ``` Then extract the clash signals: diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/check-bin-obj-clash/manifest.json b/catalog/Tools/Official-DotNet-MSBuild/skills/check-bin-obj-clash/manifest.json index 7ff2be8b..2af79182 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/check-bin-obj-clash/manifest.json +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/check-bin-obj-clash/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.10", + "version": "0.1.11", "category": "Core", "compatibility": "Requires a .NET repository with MSBuild project or solution files." } diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/copy-to-output-directory/manifest.json b/catalog/Tools/Official-DotNet-MSBuild/skills/copy-to-output-directory/manifest.json index 7ff2be8b..2af79182 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/copy-to-output-directory/manifest.json +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/copy-to-output-directory/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.10", + "version": "0.1.11", "category": "Core", "compatibility": "Requires a .NET repository with MSBuild project or solution files." } diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/directory-build-organization/SKILL.md b/catalog/Tools/Official-DotNet-MSBuild/skills/directory-build-organization/SKILL.md index 5d6284bd..c6adfb78 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/directory-build-organization/SKILL.md +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/directory-build-organization/SKILL.md @@ -1,11 +1,30 @@ --- name: directory-build-organization -description: "Guide for organizing MSBuild infrastructure with Directory.Build.props, Directory.Build.targets, Directory.Packages.props, and Directory.Build.rsp. USE FOR: structuring multi-project repos, centralizing build settings, implementing NuGet Central Package Management (CPM) with ManagePackageVersionsCentrally, consolidating duplicated properties across .csproj files, setting up multi-level Directory.Build hierarchy with GetPathOfFileAbove, understanding evaluation order (Directory.Build.props → SDK .props → .csproj → SDK .targets → Directory.Build.targets). Critical pitfall: $(TargetFramework) conditions in .props silently fail for single-targeting projects — must use .targets. DO NOT USE FOR: non-MSBuild build systems, migrating legacy projects to SDK-style (use msbuild-modernization), single-project solutions with no shared settings." +description: "USE ONLY for (1) two or more projects with repeated MSBuild policy, targets, or package versions, or (2) an existing Directory.Build.props/targets/rsp hierarchy with an import, placement, or layering defect. A one-project repo without an existing Directory.Build file is outside scope; do not load this skill. Covers centralizing shared policy and targets, Directory.Packages.props across projects, parent hierarchy/import structure, props-versus-targets placement, and folder/project exceptions. An existing hierarchy defect remains in scope when only one project is affected. For property value or condition semantics use property-patterns. Exclude legacy-to-SDK migration and non-MSBuild systems." license: MIT --- # Organizing Build Infrastructure with Directory.Build Files +## Intent control + +- For "should we", "how should we organize", "recommend", "advise", or review + requests, inspect the actual project files and return a proposed layout only. + Do not create or edit files unless the user explicitly asks to apply, move, + centralize, or clean up the configuration. +- Before summarizing, verify which project retains each project-specific + property, item, or target. Name the actual file; do not infer it from sibling + names. +- Recommend a verification command only after discovering a real `.sln`, + `.slnx`, `.proj`, or project file at that path. If no repo-root entry point + exists, give commands for the discovered projects or state that the entry + point was not found. +- Every advice response must explain that `Microsoft.Common.props` searches + upward from each project and automatically imports the nearest + `Directory.Build.props` early; project values can then override shared + defaults. Explain the equivalent late `Microsoft.Common.targets` import when + recommending `Directory.Build.targets`. + ## Directory.Build.props vs Directory.Build.targets Understanding which file to use is critical. They differ in **when** they are imported during evaluation: @@ -13,7 +32,9 @@ Understanding which file to use is critical. They differ in **when** they are im **Evaluation order:** ``` -Directory.Build.props → SDK .props → YourProject.csproj → SDK .targets → Directory.Build.targets +Microsoft.Common.props imports Directory.Build.props early +→ project body and package/project imports evaluate +→ Microsoft.Common.targets imports Directory.Build.targets late ``` | Use `.props` for | Use `.targets` for | @@ -153,7 +174,12 @@ Set `$(MSBuildThisFileDirectory)artifacts` in `Di 4. **Create `Directory.Packages.props`** — Enable Central Package Management (`ManagePackageVersionsCentrally`), list all `PackageVersion` entries, and remove `Version=` from `PackageReference` items in `.csproj` files. 5. **Set up multi-level hierarchy** — Create inner `Directory.Build.props` files for `src/` and `test/` folders with distinct settings. Use `GetPathOfFileAbove` to chain to the parent. 6. **Simplify `.csproj` files** — Remove all centralized properties, version attributes, and duplicated targets. Each project should only contain what is unique to it. -7. **Validate** — Run `dotnet restore && dotnet build` and verify no regressions. Use `dotnet msbuild -pp:output.xml` to inspect the final merged view if needed. +7. **Validate** — Run restore/build against the discovered `.sln`, `.slnx`, + `.proj`, or project path, for example + `dotnet restore && dotnet build `. If no root + entrypoint exists, validate each discovered project explicitly instead of + claiming a repo-root build. Use + `dotnet msbuild -pp:output.xml` to inspect the final merged view. ## Troubleshooting diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/directory-build-organization/manifest.json b/catalog/Tools/Official-DotNet-MSBuild/skills/directory-build-organization/manifest.json index 7ff2be8b..2af79182 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/directory-build-organization/manifest.json +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/directory-build-organization/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.10", + "version": "0.1.11", "category": "Core", "compatibility": "Requires a .NET repository with MSBuild project or solution files." } diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/eval-performance/SKILL.md b/catalog/Tools/Official-DotNet-MSBuild/skills/eval-performance/SKILL.md index 56216836..f29516f0 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/eval-performance/SKILL.md +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/eval-performance/SKILL.md @@ -58,7 +58,7 @@ Use the **binlog MCP server** (`Microsoft.AITools.BinlogMcp`, exposed under the ### Using binlog -1. Replay the binlog: `dotnet msbuild build.binlog -noconlog -fl -flp:v=diag;logfile=full.log` +1. Replay the binlog: `dotnet msbuild build.binlog -noconlog -fl "-flp:v=diag;logfile=full.log"` 2. Search for evaluation events: `grep -i 'Evaluation started\|Evaluation finished' full.log` 3. Multiple evaluations for the same project = overbuilding 4. Look for "Project evaluation started/finished" messages and their timestamps diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/eval-performance/manifest.json b/catalog/Tools/Official-DotNet-MSBuild/skills/eval-performance/manifest.json index 7ff2be8b..2af79182 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/eval-performance/manifest.json +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/eval-performance/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.10", + "version": "0.1.11", "category": "Core", "compatibility": "Requires a .NET repository with MSBuild project or solution files." } diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/extension-points/SKILL.md b/catalog/Tools/Official-DotNet-MSBuild/skills/extension-points/SKILL.md index 1052bd0c..c1d2e59d 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/extension-points/SKILL.md +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/extension-points/SKILL.md @@ -1,6 +1,6 @@ --- name: extension-points -description: "Guide for MSBuild extensibility: CustomBefore/CustomAfter hooks, wildcard imports with alphabetic ordering, import gating with control properties, NuGet package build extension layout (build/buildTransitive), and the MicrosoftCommonPropsHasBeenImported guard. USE FOR: diagnosing and fixing MSBuild import and hook patterns, reviewing and fixing extension point anti-patterns in Directory.Build files, fixing missing Exists() guards on imports that break fresh clones, fixing NuGet package hooks being silently dropped instead of appended, making build targets extensible for other projects, injecting custom logic into the build pipeline, creating NuGet packages that extend the build, conditionally disabling imports. DO NOT USE FOR: target authoring patterns (use target-authoring), props vs targets placement (use directory-build-organization), general anti-patterns (use msbuild-antipatterns), non-MSBuild build systems." +description: "Own MSBuild import and hook discovery. USE FOR: CustomBefore/CustomAfter hooks, ordered wildcard and NuGet auto-imports, control properties, build/buildTransitive packed layout, package ID and file-name matching, per-TFM forwarders, and tracing why assets or hooks are missing, broken, or replaced. An import guard remains in scope when it is one defect in a broader hook/import flow. DO NOT USE for a focused safety verdict on whether one specific Import needs Exists or is an intentionally unguarded package contract; use msbuild-antipatterns. NEVER INVOKE when imports and hook placement already work and the request is only target Inputs/Outputs, incremental skipping, or FileWrites clean tracking; use incremental-build or target-authoring. Exclude props-versus-targets placement and non-MSBuild systems." license: MIT --- diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/extension-points/manifest.json b/catalog/Tools/Official-DotNet-MSBuild/skills/extension-points/manifest.json index 7ff2be8b..2af79182 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/extension-points/manifest.json +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/extension-points/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.10", + "version": "0.1.11", "category": "Core", "compatibility": "Requires a .NET repository with MSBuild project or solution files." } diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/including-generated-files/SKILL.md b/catalog/Tools/Official-DotNet-MSBuild/skills/including-generated-files/SKILL.md index 8723c397..5dab5398 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/including-generated-files/SKILL.md +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/including-generated-files/SKILL.md @@ -1,6 +1,6 @@ --- name: including-generated-files -description: "Fix MSBuild targets that generate files during the build but those files are missing from compilation or output. USE FOR: generated source files not compiling (CS0246 for a type that should exist), custom build tasks that create files but they are invisible to subsequent targets, globs not capturing build-generated files because they expand at evaluation time before execution creates them, ensuring generated files are cleaned by the Clean target. Covers correct BeforeTargets timing (CoreCompile, BeforeBuild, AssignTargetPaths), adding to Compile/FileWrites item groups, using $(IntermediateOutputPath) instead of hardcoded obj/ paths. DO NOT USE FOR: C# source generators that already work via the Roslyn pipeline, T4 design-time generation that runs in Visual Studio, non-MSBuild build systems." +description: "Own MSBuild generated-artifact integration. USE FOR: a target that creates or should create source, Content, None, or another physical file but the artifact is missing from compilation or output; target timing; evaluation-time glob misses; $(IntermediateOutputPath) placement; and FileWrites clean tracking. The prompt may describe the generated artifact without naming the producing task. DO NOT USE when the primary defect is general Include/Remove/Update semantics, item metadata or batching, duplicate/overlapping declarations, or a generated-item identity relationship; use item-management. Exclude Roslyn source-generator internals and non-MSBuild systems." license: MIT --- diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/including-generated-files/manifest.json b/catalog/Tools/Official-DotNet-MSBuild/skills/including-generated-files/manifest.json index 7ff2be8b..2af79182 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/including-generated-files/manifest.json +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/including-generated-files/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.10", + "version": "0.1.11", "category": "Core", "compatibility": "Requires a .NET repository with MSBuild project or solution files." } diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/incremental-build/SKILL.md b/catalog/Tools/Official-DotNet-MSBuild/skills/incremental-build/SKILL.md index ed5656a4..790387e2 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/incremental-build/SKILL.md +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/incremental-build/SKILL.md @@ -4,13 +4,31 @@ description: "Guide for optimizing MSBuild incremental builds. USE FOR: builds s license: MIT --- +## Required diagnosis output + +For every diagnose or explain request, the final answer must explicitly cover +all of these points, even when the immediate cause is simply missing +`Inputs`/`Outputs`: + +- the target and exact root-cause evidence; +- the actual input/output timestamp comparison; +- missing, deleted, cleaned, or rewritten outputs; +- complete inputs, including dynamic or volatile inputs; +- evaluated input/output paths and one-to-one mapping when item lists are batched; +- two identical no-change builds and the expected second-build skip/out-of-date evidence. + +Do not edit unless the user asks for a fix. If a check cannot be run, label it +as an unverified check rather than omitting it or claiming success. When +`Inputs` or `Outputs` are absent, report timestamp comparison or one-to-one +mapping as **not applicable — the incremental mechanism is not engaged**, not +as an unverified comparison. + ## How MSBuild Incremental Build Works MSBuild's incremental build mechanism allows targets to be skipped when their outputs are already up to date, dramatically reducing build times on subsequent runs. - **Targets with `Inputs` and `Outputs` attributes**: MSBuild compares the timestamps of all files listed in `Inputs` against all files listed in `Outputs`. If every output file is newer than every input file, the target is skipped entirely. - **Without `Inputs`/`Outputs`**: The target runs every time the build is invoked. This is the default behavior and the most common cause of slow incremental builds. -- **`Incremental` attribute on targets**: Targets can explicitly opt in or out of incremental behavior. Setting `Incremental="false"` forces the target to always run, even if `Inputs` and `Outputs` are specified. - **Timestamp-based comparison**: MSBuild uses file system timestamps (last write time) to determine staleness. It does not use content hashes. This means touching a file (updating its timestamp without changing content) will trigger a rebuild. ```xml @@ -49,12 +67,29 @@ MSBuild's incremental build mechanism allows targets to be skipped when their ou Use binary logs (binlogs) to understand exactly why targets ran instead of being skipped. +Before recommending a fix, report this compact checklist for each target that reran: + +1. **Actual timestamp comparison** — name the newest resolved input and oldest resolved output, with their last-write times, and state which input is newer. +2. **Output existence** — confirm every declared output exists before the second build and is not deleted, cleaned, or rewritten by another target. +3. **Complete inputs** — verify `Inputs` includes every file that should invalidate the output, including volatile or generated dependencies. If a producer touches an input on every build, check whether its content changes. Fix unnecessary rewrites in the producer (for example, write only when content changes); if relevant content really changes, the dependent target must rerun. Exclude a file only with evidence that it cannot affect the output, never just because it changes often. +4. **Stable resolved paths** — expand properties and relative paths for both builds; outputs must resolve to the same location and must not contain timestamps, build numbers, or GUIDs. +5. **One-to-one mapping when batched** — for item transforms, map each input identity to its expected output and report missing, duplicate, or unmatched pairs. +6. **No-change verification** — run the same build twice without edits and cite the second build's skip or out-of-date reason. + +For a diagnosis or explanation request, do not edit the project unless the user asks for a fix. If build execution is unavailable, distinguish inspected facts from expected behavior and do not claim the fix was applied or verified. + +`Overwrite="true"` on `WriteLinesToFile` is not itself a reason that an +incremental target reruns. The task rewrites the file only after MSBuild has +already scheduled the target; correct `Inputs`/`Outputs` can skip the target +before the task executes. + ### Step-by-step using binlog -1. **Build twice with binlogs** to capture the incremental build behavior: +1. **Build twice without edits** and capture both structured and text evidence + from the second build: ```shell dotnet build /bl:first.binlog - dotnet build /bl:second.binlog + dotnet build /bl:second.binlog -fl "-flp:v=diag;logfile=second-full.log;performancesummary" ``` The first build establishes the baseline. The second build is the one you want to be incremental. Analyze `second.binlog`. @@ -62,19 +97,16 @@ Use binary logs (binlogs) to understand exactly why targets ran instead of being Use the **binlog MCP server** (`Microsoft.AITools.BinlogMcp`, exposed under the `binlog` MCP namespace) to analyze the second binlog: -1. Use the overview tool to check overall build status and duration -2. Use the search tool to find targets that executed vs were skipped — search for "Building target completely", "Building target incrementally", "Skipping target" -3. Use the search tool to find "is newer than output" messages that reveal which input file triggered a rebuild -4. Use target-related tools (target_reasons, project_targets) to inspect why specific targets ran -5. Use the expensive_targets tool to find targets that consumed the most time in the second build — these are your optimization targets +1. Use `load_binlog` to load `second.binlog`. +2. Use `search_binlog` for "Building target completely", "Building target incrementally", "Skipping target", and "is newer than output". +3. Use `get_target_info_by_name` for the target that reran. +4. Use `get_project_target_list` to confirm the target and its project context. +5. Use `get_expensive_targets` only to rank the non-skipped targets after the skip reason is understood. -### Fallback: text-log replay (when MCP is unavailable) +### Fallback: diagnostic text log (when MCP is unavailable) -2. **Replay the second binlog** to a diagnostic text log: - ```shell - dotnet msbuild second.binlog -noconlog -fl -flp:v=diag;logfile=second-full.log;performancesummary - ``` - Then search for targets that actually executed: +2. **Read the diagnostic log captured during the second build**. Do not run + another build or depend on replay support for the default fallback: ```bash grep 'Building target\|Target.*was not skipped' second-full.log ``` @@ -220,7 +252,7 @@ MSBuild provides built-in tools to understand what's running and why. - **Always add `Inputs` and `Outputs` to custom targets** — This is the single most impactful change for incremental build performance. Without both attributes, the target runs every time. - **Use `$(IntermediateOutputPath)` for generated files** — Files in `obj/` are tracked by MSBuild's clean infrastructure and won't leak between configurations. - **Register generated files in `FileWrites`** — Ensures `dotnet clean` removes them and prevents stale file accumulation. -- **Avoid volatile data in build** — Don't embed timestamps, random values, or build counters in file paths or generated content unless you have a deliberate strategy for managing staleness. If you must use volatile data, isolate it to a single file with minimal downstream impact. +- **Avoid unnecessary volatility in producers** — Don't embed timestamps, random values, or build counters in file paths or generated content unless required. Preserve generated-file timestamps when content is unchanged (for example, `Overwrite="true" WriteOnlyWhenDifferent="true"` with `WriteLinesToFile`). Keep real dependencies in `Inputs`; if required volatile content changes, accept the dependent rebuild. Exclude a file only after proving it cannot affect the output. - **Use `Returns` instead of `Outputs` when you need to pass items without creating incremental build dependency** — `Outputs` serves double duty: it defines the incremental check AND the items returned from the target. If you only need to pass items to calling targets without affecting incrementality, use `Returns` instead: ```xml diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/incremental-build/manifest.json b/catalog/Tools/Official-DotNet-MSBuild/skills/incremental-build/manifest.json index 7ff2be8b..2af79182 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/incremental-build/manifest.json +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/incremental-build/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.10", + "version": "0.1.11", "category": "Core", "compatibility": "Requires a .NET repository with MSBuild project or solution files." } diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/item-management/SKILL.md b/catalog/Tools/Official-DotNet-MSBuild/skills/item-management/SKILL.md index c776e3d2..b2749a57 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/item-management/SKILL.md +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/item-management/SKILL.md @@ -1,6 +1,6 @@ --- name: item-management -description: "Patterns for managing MSBuild item groups: Include/Remove/Update semantics, item metadata, batching with %(Metadata), transforms, per-item filtering, and cross-product batching pitfalls. USE FOR: diagnosing and fixing item group anti-patterns in .csproj files, reviewing item management for correctness, fixing CS2002 duplicate file warnings from SDK globbing, fixing targets that run more times than expected due to cross-product batching, fixing Include vs Update misuse on SDK-globbed items, fixing FileWrites registration for generated file clean support, moving generated files to IntermediateOutputPath. DO NOT USE FOR: target chain architecture (use target-authoring), property patterns (use property-patterns), incrementality (use incremental-build), general anti-patterns (use msbuild-antipatterns), non-MSBuild build systems." +description: "Own concrete MSBuild ItemGroup and item-expression questions. USE FOR: Include, Remove, Update, item identity and metadata, transforms, filtering, batching, duplicate or overlapping items, and reviews that verify whether those operations are correct. Generated items stay in scope when the central defect is item identity, metadata, batching, duplicate declarations, or glob/Remove/Update semantics. For a generated artifact missing from compilation or output, wrong target timing/path, or FileWrites clean tracking without a broader item-semantics defect, use including-generated-files. The item operation may be broken, suspected, or already correct. Exclude property-only issues, general incrementality with no item question, broad reviews with no concrete item concern, and non-MSBuild systems." license: MIT --- diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/item-management/manifest.json b/catalog/Tools/Official-DotNet-MSBuild/skills/item-management/manifest.json index 7ff2be8b..2af79182 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/item-management/manifest.json +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/item-management/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.10", + "version": "0.1.11", "category": "Core", "compatibility": "Requires a .NET repository with MSBuild project or solution files." } diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/msbuild-antipatterns/SKILL.md b/catalog/Tools/Official-DotNet-MSBuild/skills/msbuild-antipatterns/SKILL.md index 3daa0776..5cbd50ca 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/msbuild-antipatterns/SKILL.md +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/msbuild-antipatterns/SKILL.md @@ -1,6 +1,6 @@ --- name: msbuild-antipatterns -description: "Detect and fix MSBuild anti-patterns in project and build files. USE WHEN asked to review, audit, lint, clean up, or code-review a .csproj/.vbproj/.fsproj/.props/.targets/.proj (or Directory.Build.props/.targets) file, when asked 'is this project file correct?' or 'what's wrong with my build file?', or when hunting subtle build bugs caused by how a project is authored. Each anti-pattern has a symptom and a concrete BAD→GOOD fix. DO NOT USE FOR: non-MSBuild build systems (npm, Maven, CMake), or migrating a project to SDK-style (use msbuild-modernization)." +description: "DO NOT INVOKE when the primary request explicitly asks to convert, migrate, modernize, or rewrite a legacy/old-style project to SDK style; use msbuild-modernization. Migration prompts often mention ToolsVersion, explicit Compile/Reference entries, packages.config, or Microsoft.CSharp.targets, but merely reviewing or auditing a file that contains those patterns remains in scope here. USE FOR broad review, audit, lint, or maintainability/correctness checks of project/build files, including custom targets; prioritized cross-cutting findings; discrete anti-patterns; F# ordering/FS0039; cross-platform paths; and focused Import safety verdicts. Review/audit is analysis-only unless fixes are requested. For concrete property/item defects use property-patterns/item-management; use target-authoring for implementation and extension-points for NuGet auto-import/layout discovery. Exclude non-MSBuild systems." license: MIT --- @@ -14,6 +14,15 @@ A numbered catalog of common MSBuild anti-patterns. Each entry follows the forma Use this catalog when scanning project files for improvements. +## Review output contract + +For review, audit, maintainability, or correctness-risk requests: + +1. Do not edit files unless the user explicitly asks for fixes. +2. Return prioritized findings grounded in the supplied file, with impact and a targeted recommendation. +3. Separate confirmed defects from conditional risks and already-correct patterns. +4. Keep the final answer as the review; do not replace it with a terse summary of changes. + --- ## AP-01: `` for Operations That Have Built-in Tasks diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/msbuild-antipatterns/manifest.json b/catalog/Tools/Official-DotNet-MSBuild/skills/msbuild-antipatterns/manifest.json index 7ff2be8b..2af79182 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/msbuild-antipatterns/manifest.json +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/msbuild-antipatterns/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.10", + "version": "0.1.11", "category": "Core", "compatibility": "Requires a .NET repository with MSBuild project or solution files." } diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/msbuild-modernization/SKILL.md b/catalog/Tools/Official-DotNet-MSBuild/skills/msbuild-modernization/SKILL.md index d8c52abf..e88cd17c 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/msbuild-modernization/SKILL.md +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/msbuild-modernization/SKILL.md @@ -1,6 +1,6 @@ --- name: msbuild-modernization -description: "Guide for modernizing and migrating MSBuild project files to SDK-style format. USE FOR: converting legacy .csproj/.vbproj with verbose XML to SDK-style, migrating packages.config to PackageReference, removing Properties/AssemblyInfo.cs in favor of auto-generation, eliminating explicit lists via implicit globbing, consolidating shared settings into Directory.Build.props. Indicators of legacy projects: ToolsVersion attribute, , .csproj files > 50 lines for simple projects. DO NOT USE FOR: projects already in SDK-style format, non-.NET build systems (npm, Maven, CMake), .NET Framework projects that cannot move to SDK-style." +description: "Guide for modernizing and migrating MSBuild project files to SDK-style format. USE FOR: converting legacy .csproj/.vbproj with verbose XML to SDK-style, migrating packages.config to PackageReference, removing Properties/AssemblyInfo.cs in favor of auto-generation, eliminating explicit Compile Include lists via implicit globbing, consolidating shared settings into Directory.Build.props. Indicators of legacy projects: ToolsVersion attribute, an Import of Microsoft.CSharp.targets via $(MSBuildToolsPath), .csproj files over 50 lines for simple projects. DO NOT USE FOR: projects already in SDK-style format, non-.NET build systems (npm, Maven, CMake), .NET Framework projects that cannot move to SDK-style." license: MIT --- diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/msbuild-modernization/manifest.json b/catalog/Tools/Official-DotNet-MSBuild/skills/msbuild-modernization/manifest.json index 7ff2be8b..2af79182 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/msbuild-modernization/manifest.json +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/msbuild-modernization/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.10", + "version": "0.1.11", "category": "Core", "compatibility": "Requires a .NET repository with MSBuild project or solution files." } diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/property-patterns/SKILL.md b/catalog/Tools/Official-DotNet-MSBuild/skills/property-patterns/SKILL.md index c0e3793c..29bd91cf 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/property-patterns/SKILL.md +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/property-patterns/SKILL.md @@ -1,6 +1,6 @@ --- name: property-patterns -description: "MSBuild property definition patterns: conditional defaults, composition/concatenation, path normalization, trailing-slash handling, TFM detection helpers, and evaluation order. USE FOR: diagnosing and fixing property definition issues and shared-property anti-patterns in .props/.csproj; DefineConstants or NoWarn overwritten instead of appended; unconditional assignments that block project-level overrides; unquoted conditions that fail on empty properties; hardcoded paths that break cross-platform builds; setting overridable defaults; property evaluation order and last-write-wins semantics. DO NOT USE FOR: props vs targets placement (use directory-build-organization), item operations (use item-management), target structure (use target-authoring), general anti-patterns (use msbuild-antipatterns), non-MSBuild build systems." +description: "Diagnose and fix concrete MSBuild property defects in projects and existing shared-file hierarchies. USE FOR: conditions, defaults, append versus overwrite, last-write-wins values, OS/TFM checks, portable paths, normalization, and reviews centered on those property defects. Property defects in Directory.Build.* remain in scope, including overwritten values across parent/child imports and conditions that run before TargetFramework is set, even when the fix changes import order or moves a property group to .targets. DO NOT USE FOR: placement-only or import-only requests with no concrete property defect, such as discovering shared files or choosing which file owns a target or customization (use directory-build-organization); item operations; target structure; broad reviews without a concrete property defect; non-MSBuild work." license: MIT --- diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/property-patterns/manifest.json b/catalog/Tools/Official-DotNet-MSBuild/skills/property-patterns/manifest.json index 7ff2be8b..2af79182 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/property-patterns/manifest.json +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/property-patterns/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.10", + "version": "0.1.11", "category": "Core", "compatibility": "Requires a .NET repository with MSBuild project or solution files." } diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/resolve-project-references/manifest.json b/catalog/Tools/Official-DotNet-MSBuild/skills/resolve-project-references/manifest.json index 7ff2be8b..2af79182 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/resolve-project-references/manifest.json +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/resolve-project-references/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.10", + "version": "0.1.11", "category": "Core", "compatibility": "Requires a .NET repository with MSBuild project or solution files." } diff --git a/catalog/Tools/Official-DotNet-MSBuild/skills/target-authoring/manifest.json b/catalog/Tools/Official-DotNet-MSBuild/skills/target-authoring/manifest.json index 7ff2be8b..2af79182 100644 --- a/catalog/Tools/Official-DotNet-MSBuild/skills/target-authoring/manifest.json +++ b/catalog/Tools/Official-DotNet-MSBuild/skills/target-authoring/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.10", + "version": "0.1.11", "category": "Core", "compatibility": "Requires a .NET repository with MSBuild project or solution files." } diff --git a/catalog/Tools/Official-DotNet-Template-Engine/skills/template-authoring/manifest.json b/catalog/Tools/Official-DotNet-Template-Engine/skills/template-authoring/manifest.json index f7602a48..d479b42d 100644 --- a/catalog/Tools/Official-DotNet-Template-Engine/skills/template-authoring/manifest.json +++ b/catalog/Tools/Official-DotNet-Template-Engine/skills/template-authoring/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.4", + "version": "0.1.5", "category": "Core", "compatibility": "Requires a .NET repository using dotnet new templates or template authoring workflows." } diff --git a/catalog/Tools/Official-DotNet-Template-Engine/skills/template-comparison/manifest.json b/catalog/Tools/Official-DotNet-Template-Engine/skills/template-comparison/manifest.json index f7602a48..d479b42d 100644 --- a/catalog/Tools/Official-DotNet-Template-Engine/skills/template-comparison/manifest.json +++ b/catalog/Tools/Official-DotNet-Template-Engine/skills/template-comparison/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.4", + "version": "0.1.5", "category": "Core", "compatibility": "Requires a .NET repository using dotnet new templates or template authoring workflows." } diff --git a/catalog/Tools/Official-DotNet-Template-Engine/skills/template-discovery/manifest.json b/catalog/Tools/Official-DotNet-Template-Engine/skills/template-discovery/manifest.json index f7602a48..d479b42d 100644 --- a/catalog/Tools/Official-DotNet-Template-Engine/skills/template-discovery/manifest.json +++ b/catalog/Tools/Official-DotNet-Template-Engine/skills/template-discovery/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.4", + "version": "0.1.5", "category": "Core", "compatibility": "Requires a .NET repository using dotnet new templates or template authoring workflows." } diff --git a/catalog/Tools/Official-DotNet-Template-Engine/skills/template-instantiation/manifest.json b/catalog/Tools/Official-DotNet-Template-Engine/skills/template-instantiation/manifest.json index f7602a48..d479b42d 100644 --- a/catalog/Tools/Official-DotNet-Template-Engine/skills/template-instantiation/manifest.json +++ b/catalog/Tools/Official-DotNet-Template-Engine/skills/template-instantiation/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.4", + "version": "0.1.5", "category": "Core", "compatibility": "Requires a .NET repository using dotnet new templates or template authoring workflows." } diff --git a/catalog/Tools/Official-DotNet-Template-Engine/skills/template-smart-defaults/manifest.json b/catalog/Tools/Official-DotNet-Template-Engine/skills/template-smart-defaults/manifest.json index f7602a48..d479b42d 100644 --- a/catalog/Tools/Official-DotNet-Template-Engine/skills/template-smart-defaults/manifest.json +++ b/catalog/Tools/Official-DotNet-Template-Engine/skills/template-smart-defaults/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.4", + "version": "0.1.5", "category": "Core", "compatibility": "Requires a .NET repository using dotnet new templates or template authoring workflows." } diff --git a/catalog/Tools/Official-DotNet-Template-Engine/skills/template-validation/manifest.json b/catalog/Tools/Official-DotNet-Template-Engine/skills/template-validation/manifest.json index f7602a48..d479b42d 100644 --- a/catalog/Tools/Official-DotNet-Template-Engine/skills/template-validation/manifest.json +++ b/catalog/Tools/Official-DotNet-Template-Engine/skills/template-validation/manifest.json @@ -1,5 +1,5 @@ { - "version": "0.1.4", + "version": "0.1.5", "category": "Core", "compatibility": "Requires a .NET repository using dotnet new templates or template authoring workflows." } diff --git a/external-sources/upstreams/dotnet-skills/.agents/skills/create-skill/SKILL.md b/external-sources/upstreams/dotnet-skills/.agents/skills/create-skill/SKILL.md index 627ca659..937f2b17 100644 --- a/external-sources/upstreams/dotnet-skills/.agents/skills/create-skill/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/.agents/skills/create-skill/SKILL.md @@ -65,6 +65,9 @@ description: . USE FOR: ` or ``. Spell it out in words ("generic Vector type", + "Import element"); `skill-validator check` fails on it. ### Step 3: Write for delta over the baseline model @@ -214,6 +217,7 @@ After creating a skill, verify: - [ ] Skill name matches directory name exactly - [ ] Skill name is lowercase with hyphens only - [ ] Description is non-empty and under 1024 characters +- [ ] Description contains no XML-like tags (for example `Vector`) - [ ] SKILL.md body is under 500 lines - [ ] Instructions are specific and actionable - [ ] Bundled-file paths are relative to the directory that contains `SKILL.md` diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-advanced/skills/vectorization/SKILL.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-advanced/skills/vectorization/SKILL.md index 1d5e9d77..c98d5d10 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-advanced/skills/vectorization/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-advanced/skills/vectorization/SKILL.md @@ -4,7 +4,7 @@ description: > Design, implement, optimize, and review SIMD code in .NET. USE FOR: vectorizing scalar loops with TensorPrimitives, Vector64/128/256/512, or platform hardware intrinsics; reviewing existing SIMD - code, including Vector, for contract equivalence, tail handling, memory + code, including the generic Vector type, for contract equivalence, tail handling, memory safety, portability, fallbacks, and measured performance. DO NOT USE FOR: performance work unrelated to SIMD or vectorization. license: MIT diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-aspnetcore/.claude-plugin/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-aspnetcore/.claude-plugin/plugin.json index fb43960a..3add75ad 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-aspnetcore/.claude-plugin/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-aspnetcore/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-aspnetcore", - "version": "0.1.1", + "version": "0.1.2", "description": "ASP.NET Core web development skills including middleware, endpoints, real-time communication, and API patterns.", "skills": ["./skills/"] } diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-aspnetcore/.codex-plugin/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-aspnetcore/.codex-plugin/plugin.json index fb43960a..3add75ad 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-aspnetcore/.codex-plugin/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-aspnetcore/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-aspnetcore", - "version": "0.1.1", + "version": "0.1.2", "description": "ASP.NET Core web development skills including middleware, endpoints, real-time communication, and API patterns.", "skills": ["./skills/"] } diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-aspnetcore/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-aspnetcore/plugin.json index fb43960a..3add75ad 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-aspnetcore/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-aspnetcore/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-aspnetcore", - "version": "0.1.1", + "version": "0.1.2", "description": "ASP.NET Core web development skills including middleware, endpoints, real-time communication, and API patterns.", "skills": ["./skills/"] } diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-blazor/.claude-plugin/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-blazor/.claude-plugin/plugin.json index 7eaf6aaa..9ab06bea 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-blazor/.claude-plugin/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-blazor/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-blazor", - "version": "0.1.1", + "version": "0.1.2", "description": "Skills for Blazor development: component authoring, interactivity, and web application patterns.", "skills": ["./skills/"] } diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-blazor/.codex-plugin/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-blazor/.codex-plugin/plugin.json index 7eaf6aaa..9ab06bea 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-blazor/.codex-plugin/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-blazor/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-blazor", - "version": "0.1.1", + "version": "0.1.2", "description": "Skills for Blazor development: component authoring, interactivity, and web application patterns.", "skills": ["./skills/"] } diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-blazor/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-blazor/plugin.json index 7eaf6aaa..9ab06bea 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-blazor/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-blazor/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-blazor", - "version": "0.1.1", + "version": "0.1.2", "description": "Skills for Blazor development: component authoring, interactivity, and web application patterns.", "skills": ["./skills/"] } diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-blazor/skills/configure-auth/SKILL.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-blazor/skills/configure-auth/SKILL.md index 7d11621f..423beaf6 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-blazor/skills/configure-auth/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-blazor/skills/configure-auth/SKILL.md @@ -6,7 +6,7 @@ description: > USE WHEN the user needs [Authorize] on pages, AuthorizeView, role or policy-based access, login/logout Identity pages, or AuthenticationStateProvider. Also USE WHEN auth state is null after WebAssembly loads, SignInManager throws in an interactive - component, content never renders in static SSR, or HttpContext.User is null in + component, NotAuthorized content never renders in static SSR, or HttpContext.User is null in an interactive component. DO NOT USE for general component authoring (see author-component), for prerendering concerns unrelated to auth (see support-prerendering), or for managing non-auth cascading state diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-diag/.claude-plugin/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-diag/.claude-plugin/plugin.json index eb4c91da..2f470717 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-diag/.claude-plugin/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-diag/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-diag", - "version": "0.1.2", + "version": "0.1.3", "description": "Skills for .NET performance investigations, debugging, and incident analysis.", "skills": ["./skills/"], "agents": ["./agents/optimizing-dotnet-performance.agent.md"] diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-diag/.codex-plugin/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-diag/.codex-plugin/plugin.json index 8ed7789a..770053c5 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-diag/.codex-plugin/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-diag/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-diag", - "version": "0.1.2", + "version": "0.1.3", "description": "Skills for .NET performance investigations, debugging, and incident analysis.", "skills": ["./skills/"] } diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-diag/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-diag/plugin.json index eb4c91da..2f470717 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-diag/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-diag/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-diag", - "version": "0.1.2", + "version": "0.1.3", "description": "Skills for .NET performance investigations, debugging, and incident analysis.", "skills": ["./skills/"], "agents": ["./agents/optimizing-dotnet-performance.agent.md"] diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/.claude-plugin/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/.claude-plugin/plugin.json index 0bc182f5..9c683c1c 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/.claude-plugin/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-msbuild", - "version": "0.1.10", + "version": "0.1.11", "description": "Comprehensive MSBuild and .NET build skills: failure diagnosis, performance optimization, code quality, and modernization.", "skills": ["./skills/"], "agents": [ diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/.codex-plugin/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/.codex-plugin/plugin.json index 81c2fe93..9d20f2e0 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/.codex-plugin/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-msbuild", - "version": "0.1.10", + "version": "0.1.11", "description": "Comprehensive MSBuild and .NET build skills: failure diagnosis, performance optimization, code quality, and modernization.", "skills": ["./skills/"], "mcpServers": { diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/plugin.json index 0bc182f5..9c683c1c 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-msbuild", - "version": "0.1.10", + "version": "0.1.11", "description": "Comprehensive MSBuild and .NET build skills: failure diagnosis, performance optimization, code quality, and modernization.", "skills": ["./skills/"], "agents": [ diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/binlog-failure-analysis/SKILL.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/binlog-failure-analysis/SKILL.md index c6679594..768e876c 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/binlog-failure-analysis/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/binlog-failure-analysis/SKILL.md @@ -39,9 +39,9 @@ SDK or in an offline environment). ```bash dotnet msbuild build.binlog -noconlog \ - -fl -flp:v=diag;logfile=full.log;performancesummary \ - -fl1 -flp1:errorsonly;logfile=errors.log \ - -fl2 -flp2:warningsonly;logfile=warnings.log + -fl "-flp:v=diag;logfile=full.log;performancesummary" \ + -fl1 "-flp1:errorsonly;logfile=errors.log" \ + -fl2 "-flp2:warningsonly;logfile=warnings.log" ``` > **PowerShell note:** Use `-flp:"v=diag;logfile=full.log;performancesummary"` diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/binlog-generation/SKILL.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/binlog-generation/SKILL.md index f1df0a69..0d18266c 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/binlog-generation/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/binlog-generation/SKILL.md @@ -1,6 +1,6 @@ --- name: binlog-generation -description: "Generate MSBuild binary logs (binlogs) for build diagnostics and analysis. USE FOR: adding /bl:{} 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+ / .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)." +description: "Generate MSBuild binary logs (binlogs) for build diagnostics and analysis. USE FOR: adding /bl:{} 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+ / .NET 8 SDK+ for {} placeholder; PowerShell must quote the complete switch as '-bl:{}'. DO NOT USE FOR: non-MSBuild build systems (npm, Maven, CMake), analyzing an existing binlog (use binlog-failure-analysis instead)." license: MIT --- @@ -32,12 +32,12 @@ dotnet test /bl:{} dotnet build --configuration Release /bl:{} ``` -**PowerShell requires escaping the braces:** +**PowerShell requires quoting the complete switch:** ```powershell -# PowerShell: escape { } as {{ }} -dotnet build -bl:{{}} -dotnet test -bl:{{}} +# Keep the literal {} placeholder in one argument +dotnet build '-bl:{}' +dotnet test '-bl:{}' ``` ## Why This Matters @@ -54,9 +54,9 @@ dotnet test -bl:{{}} dotnet build /bl:{} dotnet test /bl:{} -# ✅ CORRECT - PowerShell escaping -dotnet build -bl:{{}} -dotnet test -bl:{{}} +# ✅ CORRECT - quote the complete PowerShell argument +dotnet build '-bl:{}' +dotnet test '-bl:{}' # ❌ WRONG - Missing /bl flag entirely dotnet build diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/build-parallelism/SKILL.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/build-parallelism/SKILL.md index 96fdc200..776c44e6 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/build-parallelism/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/build-parallelism/SKILL.md @@ -1,6 +1,6 @@ --- name: build-parallelism -description: "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: `/maxcpucount` default is 1 (sequential) — always pass `-m` for parallel builds. Covers finding the critical path (longest serial ProjectReference chain), graph build (`/graph`), 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." +description: "Analyze an MSBuild solution, solution filter, or Build.proj that schedules multiple project files. USE FOR: measured idle worker nodes, `-m` that does not scale, a serial ProjectReference critical path, graph builds, or an MSBuild task that builds a Projects list. Requires at least two distinct project files whose scheduling or throughput must be analyzed. DO NOT USE for non-MSBuild build systems." license: MIT --- @@ -9,9 +9,14 @@ license: MIT Work this checklist in order — it targets the usual root cause (a serial dependency chain that no number of cores can parallelize): -1. **Confirm parallelism is even on.** Rebuild with `dotnet build -m /bl:{}` - (PowerShell: `dotnet build -m -bl:{{}}`). `-m` with no number uses all logical - processors; without `-m` MSBuild runs a single node (sequential). +1. **Check how many worker nodes actually built the solution.** Capture a + binlog with `dotnet build /bl:{}` (PowerShell: `dotnet build '-bl:{}'`) and + inspect the node timeline to see whether more than one node ran. Every + `dotnet` CLI command built on the SDK's MSBuild-forwarding path (`build`, + `msbuild`, `test`, `pack`, `publish`, etc.) enables `/maxcpucount` (multiple + nodes) by default; `-m:1` forces a single node. A direct `MSBuild.exe` + invocation is sequential by default, so pass `-m` explicitly to enable + parallel worker nodes there. 2. **Find the critical path.** From the binlog, read per-project timings and the node timeline. If total build time ≈ the sum of the projects on one dependency chain, that chain — not CPU count — is the bottleneck. @@ -27,7 +32,11 @@ dependency chain that no number of cores can parallelize): ## MSBuild Parallelism Model - `/maxcpucount` (or `-m`): number of worker nodes (processes) -- Default: 1 node (sequential!). Always use `-m` for parallel builds +- Every `dotnet` CLI command (`build`, `msbuild`, `test`, `pack`, `publish`, + etc.) passes `/maxcpucount` by default via the SDK's shared MSBuild-forwarding + path; `-m:1` overrides it with one node +- A direct `MSBuild.exe` invocation is sequential by default and requires an + explicit `-m` - Recommended: `-m` without a number = use all logical processors - Each node builds one project at a time - Projects are scheduled based on dependency graph @@ -51,7 +60,8 @@ dependency chain that no number of cores can parallelize): ## Optimizing Project References -- Reduce unnecessary `` — each adds to the dependency chain +- Reduce a `` only after proving it is unnecessary; a slow but + valid dependency must stay in the graph - Use `` to avoid extra evaluations - `` for build-order-only dependencies - Consider if a ProjectReference should be a PackageReference instead (pre-built NuGet) @@ -85,7 +95,7 @@ Use the **binlog MCP server** (`Microsoft.AITools.BinlogMcp`, exposed under the Step-by-step: -1. Replay the binlog: `dotnet msbuild build.binlog -noconlog -fl -flp:v=diag;logfile=full.log;performancesummary` +1. Replay the binlog: `dotnet msbuild build.binlog -noconlog -fl "-flp:v=diag;logfile=full.log;performancesummary"` 2. Check Project Performance Summary at the end of `full.log` 3. Ideal: build time should be much less than sum of project times (parallelism) 4. If build time ≈ sum of project times: too many serial dependencies, or one slow project blocking others diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/build-perf-baseline/SKILL.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/build-perf-baseline/SKILL.md index fbfbc958..680a11c9 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/build-perf-baseline/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/build-perf-baseline/SKILL.md @@ -1,6 +1,6 @@ --- name: build-perf-baseline -description: "Establish build performance baselines and apply systematic optimization techniques. USE FOR: diagnosing slow builds, establishing before/after measurements (cold, warm, no-op scenarios), applying optimization strategies like 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)." +description: "Establish MSBuild/.NET build performance baselines before optimizing. USE FOR: a .NET build or solution that is slow or has build-performance concerns; cold, warm, incremental, or no-op measurements; before/after comparisons; CI build output caching; static graph build decisions; artifacts output; and dependency graph trimming. Start here before build-perf-diagnostics, incremental-build, or build-parallelism. DO NOT USE for webpack, npm, JavaScript bundlers, or other non-MSBuild build systems. For detailed target/task/analyzer bottleneck analysis after baselining, use build-perf-diagnostics." license: MIT --- @@ -20,47 +20,68 @@ Before optimizing a build, you need a **baseline**. Without measurements, optimi ## Step 1: Establish a Performance Baseline -Measure three scenarios to understand where time is spent: +Measure three scenarios to understand where time is spent. Keep the SDK, +configuration, machine, environment variables, restore state, and build command +consistent. Run each scenario at least three times, repeating its setup before +every measured sample, and report the median plus the observed range; a single +timing is not a baseline. Keep setup outside the timed interval. Save each +sample's binlog under a unique name, outside generated output directories. ### Cold Build (First Build) No previous build output exists. Measures the full end-to-end time including restore, compilation, and all targets. -```bash -# Clean everything first -dotnet clean -# Remove bin/obj to truly start fresh -Get-ChildItem -Recurse -Directory -Include bin,obj | Remove-Item -Recurse -Force -# OR on Linux/macOS: -# find . -type d \( -name bin -o -name obj \) -exec rm -rf {} + - -# Measure cold build -dotnet build /bl:cold-build.binlog -m +Before **every cold sample**, restore the same source state, run `dotnet clean` +with the measured configuration, and remove only the confirmed, disposable +output and intermediate directories for the measured projects. Include custom +artifact paths, not just `bin` and `obj`, and obtain approval before deletion. +Verify those outputs are absent before timing the next build. + +This is an **output-cold** build, not necessarily a cold NuGet, OS, or compiler +server cache. Choose and record a consistent cache/server policy for all +samples; do not clear shared caches. If measuring uncached restore, use a +separate, empty package cache for each sample. + +```shell +# After repeating the cold setup; use a unique log name for each sample +dotnet build /bl:cold-build-1.binlog -m ``` ### Warm Build (Incremental Build) Build output exists, some files have changed. Measures how well incremental build works. -```bash -# Build once to populate outputs +Before **every warm sample**, restore the same baseline source contents and +build successfully without timing it. Then apply the same small, build-relevant +edit to the same source file and time the build. Keep the changed file set and +edit identical across samples; do not let edits accumulate. Restore the +baseline contents before the next sample and rebuild them outside the timed +interval. Do not clean between that setup build and its measured build. + +```shell +# Untimed setup after restoring baseline source contents dotnet build -m -# Make a small change (touch one .cs file) -# Then rebuild -dotnet build /bl:warm-build.binlog -m +# Apply the same controlled source edit, then measure with a unique log name +dotnet build /bl:warm-build-1.binlog -m ``` ### No-Op Build (Nothing Changed) -Build output exists, nothing has changed. This should be nearly instant. If it's slow, incremental build is broken. +Build output exists, nothing has changed. Compilation and correctly incremental +targets should skip; compare timing with this build's other samples. -```bash -# Build once to populate outputs +Before **every no-op sample**, restore the same baseline source contents and +run an untimed setup build successfully. Then measure an identical build +without edits, touching inputs, cleaning outputs, or changing properties. +Keep restore and cache/server policy consistent with the other samples. + +```shell +# Untimed setup after restoring baseline source contents dotnet build -m -# Rebuild immediately without changes -dotnet build /bl:noop-build.binlog -m +# Rebuild immediately without changes; use a unique log name for each sample +dotnet build /bl:noop-build-1.binlog -m ``` ### What Good Looks Like @@ -69,12 +90,31 @@ dotnet build /bl:noop-build.binlog -m |----------|------------------| | Cold build | Full compilation, all targets run. This is your absolute baseline | | Warm build | Only changed projects recompile. Time proportional to change scope | -| No-op build | < 5 seconds for small repos, < 30 seconds for large repos. All compilation targets should report "Skipping target — all outputs up-to-date" | +| No-op build | Compilation and correctly incremental custom targets skip; compare duration with this repo's repeated warm and cold samples | **Red flags:** -- No-op build > 30 seconds → incremental build is broken (see `incremental-build` skill) +- No-op time is repeatedly close to warm/cold time, or compilation targets rerun → investigate incrementality (see `incremental-build`) - Warm build recompiles everything → project dependency chain forces full rebuild -- Cold build has long restore → NuGet cache issues +- Restore dominates cold samples → measure `dotnet restore` and `dotnet build --no-restore` separately before changing project structure + +Do not use universal duration or percentage thresholds to declare a bottleneck. +Rank costs against the controlled samples and the build's own target/task +timings. + +### Capture analyzer evidence + +A binlog shows compiler/task timing, but granular analyzer timing requires an +analyzer-reporting run. When supported by the SDK/compiler, capture: + +```shell +dotnet build /bl:analyzers.binlog /p:ReportAnalyzer=true +``` + +Open the binlog in MSBuild Structured Log Viewer and inspect the analyzer +summary under the compiler task. If granular timing is unavailable, compare +otherwise identical samples with `/p:RunAnalyzers=false` as an attribution +experiment; do not present disabling analyzers as the fix. Preserve analyzer +enforcement in CI. ### Recording Baselines @@ -329,10 +369,15 @@ dotnet test --no-build # Skip building documentation dotnet build /p:GenerateDocumentationFile=false -# Skip analyzers during development (not for CI!) +# Attribution experiment only: compare against the same build with analyzers dotnet build /p:RunAnalyzers=false ``` +Use these switches to measure contribution before changing configuration. +Do not recommend permanently disabling analyzers from this baseline step; +route measured analyzer bottlenecks to `build-perf-diagnostics` and preserve +CI enforcement. + ### Use Project-Level Filtering ```bash @@ -356,8 +401,9 @@ Then use the `build-perf-diagnostics` skill and binlog tools for systematic bott ## Optimization Decision Tree ``` -Is your no-op build slow (> 10s per project)? -├── YES → See `incremental-build` skill (fix Inputs/Outputs) +Is your repeated no-op build disproportionately close to warm/cold samples, +or are compile/custom targets rerunning? +├── YES → See `incremental-build` skill (inspect Inputs/Outputs and skip reasons) └── NO Is your cold build slow? ├── YES @@ -373,5 +419,5 @@ Is your no-op build slow (> 10s per project)? └── NO Is your warm build slow? ├── YES → Projects rebuilding unnecessarily → check `incremental-build` skill - └── NO → Build is healthy! Consider graph build or UseArtifactsOutput for further gains + └── NO → Baseline is healthy; adopt graph build or UseArtifactsOutput only for a measured need ``` diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/build-perf-diagnostics/SKILL.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/build-perf-diagnostics/SKILL.md index 4e9d3c11..ecea02c2 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/build-perf-diagnostics/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/build-perf-diagnostics/SKILL.md @@ -14,7 +14,7 @@ license: MIT 1. **Generate a binlog**: `dotnet build /bl:{} -m` 2. **Replay to diagnostic log with performance summary**: ```bash - dotnet msbuild build.binlog -noconlog -fl -flp:v=diag;logfile=full.log;performancesummary + dotnet msbuild build.binlog -noconlog -fl "-flp:v=diag;logfile=full.log;performancesummary" ``` 3. **Read the performance summary** (at the end of `full.log`): ```bash @@ -103,7 +103,7 @@ Step-by-step workflow using text log replay: 1. **Replay with performance summary**: ```bash - dotnet msbuild build.binlog -noconlog -fl -flp:v=diag;logfile=full.log;performancesummary + dotnet msbuild build.binlog -noconlog -fl "-flp:v=diag;logfile=full.log;performancesummary" ``` 2. **Read target/task performance summaries** (at the end of `full.log`): ```bash diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/check-bin-obj-clash/SKILL.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/check-bin-obj-clash/SKILL.md index 8d1007cf..48be6127 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/check-bin-obj-clash/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/check-bin-obj-clash/SKILL.md @@ -78,7 +78,7 @@ Use this only when the MCP server cannot be started. Replay the binlog to a diagnostic text log, then grep for the same signals the MCP tools surface: ```bash -dotnet msbuild build.binlog -noconlog -fl -flp:v=diag;logfile=full.log +dotnet msbuild build.binlog -noconlog -fl "-flp:v=diag;logfile=full.log" ``` Then extract the clash signals: diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/directory-build-organization/SKILL.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/directory-build-organization/SKILL.md index 5d6284bd..c6adfb78 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/directory-build-organization/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/directory-build-organization/SKILL.md @@ -1,11 +1,30 @@ --- name: directory-build-organization -description: "Guide for organizing MSBuild infrastructure with Directory.Build.props, Directory.Build.targets, Directory.Packages.props, and Directory.Build.rsp. USE FOR: structuring multi-project repos, centralizing build settings, implementing NuGet Central Package Management (CPM) with ManagePackageVersionsCentrally, consolidating duplicated properties across .csproj files, setting up multi-level Directory.Build hierarchy with GetPathOfFileAbove, understanding evaluation order (Directory.Build.props → SDK .props → .csproj → SDK .targets → Directory.Build.targets). Critical pitfall: $(TargetFramework) conditions in .props silently fail for single-targeting projects — must use .targets. DO NOT USE FOR: non-MSBuild build systems, migrating legacy projects to SDK-style (use msbuild-modernization), single-project solutions with no shared settings." +description: "USE ONLY for (1) two or more projects with repeated MSBuild policy, targets, or package versions, or (2) an existing Directory.Build.props/targets/rsp hierarchy with an import, placement, or layering defect. A one-project repo without an existing Directory.Build file is outside scope; do not load this skill. Covers centralizing shared policy and targets, Directory.Packages.props across projects, parent hierarchy/import structure, props-versus-targets placement, and folder/project exceptions. An existing hierarchy defect remains in scope when only one project is affected. For property value or condition semantics use property-patterns. Exclude legacy-to-SDK migration and non-MSBuild systems." license: MIT --- # Organizing Build Infrastructure with Directory.Build Files +## Intent control + +- For "should we", "how should we organize", "recommend", "advise", or review + requests, inspect the actual project files and return a proposed layout only. + Do not create or edit files unless the user explicitly asks to apply, move, + centralize, or clean up the configuration. +- Before summarizing, verify which project retains each project-specific + property, item, or target. Name the actual file; do not infer it from sibling + names. +- Recommend a verification command only after discovering a real `.sln`, + `.slnx`, `.proj`, or project file at that path. If no repo-root entry point + exists, give commands for the discovered projects or state that the entry + point was not found. +- Every advice response must explain that `Microsoft.Common.props` searches + upward from each project and automatically imports the nearest + `Directory.Build.props` early; project values can then override shared + defaults. Explain the equivalent late `Microsoft.Common.targets` import when + recommending `Directory.Build.targets`. + ## Directory.Build.props vs Directory.Build.targets Understanding which file to use is critical. They differ in **when** they are imported during evaluation: @@ -13,7 +32,9 @@ Understanding which file to use is critical. They differ in **when** they are im **Evaluation order:** ``` -Directory.Build.props → SDK .props → YourProject.csproj → SDK .targets → Directory.Build.targets +Microsoft.Common.props imports Directory.Build.props early +→ project body and package/project imports evaluate +→ Microsoft.Common.targets imports Directory.Build.targets late ``` | Use `.props` for | Use `.targets` for | @@ -153,7 +174,12 @@ Set `$(MSBuildThisFileDirectory)artifacts` in `Di 4. **Create `Directory.Packages.props`** — Enable Central Package Management (`ManagePackageVersionsCentrally`), list all `PackageVersion` entries, and remove `Version=` from `PackageReference` items in `.csproj` files. 5. **Set up multi-level hierarchy** — Create inner `Directory.Build.props` files for `src/` and `test/` folders with distinct settings. Use `GetPathOfFileAbove` to chain to the parent. 6. **Simplify `.csproj` files** — Remove all centralized properties, version attributes, and duplicated targets. Each project should only contain what is unique to it. -7. **Validate** — Run `dotnet restore && dotnet build` and verify no regressions. Use `dotnet msbuild -pp:output.xml` to inspect the final merged view if needed. +7. **Validate** — Run restore/build against the discovered `.sln`, `.slnx`, + `.proj`, or project path, for example + `dotnet restore && dotnet build `. If no root + entrypoint exists, validate each discovered project explicitly instead of + claiming a repo-root build. Use + `dotnet msbuild -pp:output.xml` to inspect the final merged view. ## Troubleshooting diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/eval-performance/SKILL.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/eval-performance/SKILL.md index 56216836..f29516f0 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/eval-performance/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/eval-performance/SKILL.md @@ -58,7 +58,7 @@ Use the **binlog MCP server** (`Microsoft.AITools.BinlogMcp`, exposed under the ### Using binlog -1. Replay the binlog: `dotnet msbuild build.binlog -noconlog -fl -flp:v=diag;logfile=full.log` +1. Replay the binlog: `dotnet msbuild build.binlog -noconlog -fl "-flp:v=diag;logfile=full.log"` 2. Search for evaluation events: `grep -i 'Evaluation started\|Evaluation finished' full.log` 3. Multiple evaluations for the same project = overbuilding 4. Look for "Project evaluation started/finished" messages and their timestamps diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/extension-points/SKILL.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/extension-points/SKILL.md index 1052bd0c..c1d2e59d 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/extension-points/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/extension-points/SKILL.md @@ -1,6 +1,6 @@ --- name: extension-points -description: "Guide for MSBuild extensibility: CustomBefore/CustomAfter hooks, wildcard imports with alphabetic ordering, import gating with control properties, NuGet package build extension layout (build/buildTransitive), and the MicrosoftCommonPropsHasBeenImported guard. USE FOR: diagnosing and fixing MSBuild import and hook patterns, reviewing and fixing extension point anti-patterns in Directory.Build files, fixing missing Exists() guards on imports that break fresh clones, fixing NuGet package hooks being silently dropped instead of appended, making build targets extensible for other projects, injecting custom logic into the build pipeline, creating NuGet packages that extend the build, conditionally disabling imports. DO NOT USE FOR: target authoring patterns (use target-authoring), props vs targets placement (use directory-build-organization), general anti-patterns (use msbuild-antipatterns), non-MSBuild build systems." +description: "Own MSBuild import and hook discovery. USE FOR: CustomBefore/CustomAfter hooks, ordered wildcard and NuGet auto-imports, control properties, build/buildTransitive packed layout, package ID and file-name matching, per-TFM forwarders, and tracing why assets or hooks are missing, broken, or replaced. An import guard remains in scope when it is one defect in a broader hook/import flow. DO NOT USE for a focused safety verdict on whether one specific Import needs Exists or is an intentionally unguarded package contract; use msbuild-antipatterns. NEVER INVOKE when imports and hook placement already work and the request is only target Inputs/Outputs, incremental skipping, or FileWrites clean tracking; use incremental-build or target-authoring. Exclude props-versus-targets placement and non-MSBuild systems." license: MIT --- diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/including-generated-files/SKILL.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/including-generated-files/SKILL.md index 8723c397..5dab5398 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/including-generated-files/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/including-generated-files/SKILL.md @@ -1,6 +1,6 @@ --- name: including-generated-files -description: "Fix MSBuild targets that generate files during the build but those files are missing from compilation or output. USE FOR: generated source files not compiling (CS0246 for a type that should exist), custom build tasks that create files but they are invisible to subsequent targets, globs not capturing build-generated files because they expand at evaluation time before execution creates them, ensuring generated files are cleaned by the Clean target. Covers correct BeforeTargets timing (CoreCompile, BeforeBuild, AssignTargetPaths), adding to Compile/FileWrites item groups, using $(IntermediateOutputPath) instead of hardcoded obj/ paths. DO NOT USE FOR: C# source generators that already work via the Roslyn pipeline, T4 design-time generation that runs in Visual Studio, non-MSBuild build systems." +description: "Own MSBuild generated-artifact integration. USE FOR: a target that creates or should create source, Content, None, or another physical file but the artifact is missing from compilation or output; target timing; evaluation-time glob misses; $(IntermediateOutputPath) placement; and FileWrites clean tracking. The prompt may describe the generated artifact without naming the producing task. DO NOT USE when the primary defect is general Include/Remove/Update semantics, item metadata or batching, duplicate/overlapping declarations, or a generated-item identity relationship; use item-management. Exclude Roslyn source-generator internals and non-MSBuild systems." license: MIT --- diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/incremental-build/SKILL.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/incremental-build/SKILL.md index ed5656a4..790387e2 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/incremental-build/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/incremental-build/SKILL.md @@ -4,13 +4,31 @@ description: "Guide for optimizing MSBuild incremental builds. USE FOR: builds s license: MIT --- +## Required diagnosis output + +For every diagnose or explain request, the final answer must explicitly cover +all of these points, even when the immediate cause is simply missing +`Inputs`/`Outputs`: + +- the target and exact root-cause evidence; +- the actual input/output timestamp comparison; +- missing, deleted, cleaned, or rewritten outputs; +- complete inputs, including dynamic or volatile inputs; +- evaluated input/output paths and one-to-one mapping when item lists are batched; +- two identical no-change builds and the expected second-build skip/out-of-date evidence. + +Do not edit unless the user asks for a fix. If a check cannot be run, label it +as an unverified check rather than omitting it or claiming success. When +`Inputs` or `Outputs` are absent, report timestamp comparison or one-to-one +mapping as **not applicable — the incremental mechanism is not engaged**, not +as an unverified comparison. + ## How MSBuild Incremental Build Works MSBuild's incremental build mechanism allows targets to be skipped when their outputs are already up to date, dramatically reducing build times on subsequent runs. - **Targets with `Inputs` and `Outputs` attributes**: MSBuild compares the timestamps of all files listed in `Inputs` against all files listed in `Outputs`. If every output file is newer than every input file, the target is skipped entirely. - **Without `Inputs`/`Outputs`**: The target runs every time the build is invoked. This is the default behavior and the most common cause of slow incremental builds. -- **`Incremental` attribute on targets**: Targets can explicitly opt in or out of incremental behavior. Setting `Incremental="false"` forces the target to always run, even if `Inputs` and `Outputs` are specified. - **Timestamp-based comparison**: MSBuild uses file system timestamps (last write time) to determine staleness. It does not use content hashes. This means touching a file (updating its timestamp without changing content) will trigger a rebuild. ```xml @@ -49,12 +67,29 @@ MSBuild's incremental build mechanism allows targets to be skipped when their ou Use binary logs (binlogs) to understand exactly why targets ran instead of being skipped. +Before recommending a fix, report this compact checklist for each target that reran: + +1. **Actual timestamp comparison** — name the newest resolved input and oldest resolved output, with their last-write times, and state which input is newer. +2. **Output existence** — confirm every declared output exists before the second build and is not deleted, cleaned, or rewritten by another target. +3. **Complete inputs** — verify `Inputs` includes every file that should invalidate the output, including volatile or generated dependencies. If a producer touches an input on every build, check whether its content changes. Fix unnecessary rewrites in the producer (for example, write only when content changes); if relevant content really changes, the dependent target must rerun. Exclude a file only with evidence that it cannot affect the output, never just because it changes often. +4. **Stable resolved paths** — expand properties and relative paths for both builds; outputs must resolve to the same location and must not contain timestamps, build numbers, or GUIDs. +5. **One-to-one mapping when batched** — for item transforms, map each input identity to its expected output and report missing, duplicate, or unmatched pairs. +6. **No-change verification** — run the same build twice without edits and cite the second build's skip or out-of-date reason. + +For a diagnosis or explanation request, do not edit the project unless the user asks for a fix. If build execution is unavailable, distinguish inspected facts from expected behavior and do not claim the fix was applied or verified. + +`Overwrite="true"` on `WriteLinesToFile` is not itself a reason that an +incremental target reruns. The task rewrites the file only after MSBuild has +already scheduled the target; correct `Inputs`/`Outputs` can skip the target +before the task executes. + ### Step-by-step using binlog -1. **Build twice with binlogs** to capture the incremental build behavior: +1. **Build twice without edits** and capture both structured and text evidence + from the second build: ```shell dotnet build /bl:first.binlog - dotnet build /bl:second.binlog + dotnet build /bl:second.binlog -fl "-flp:v=diag;logfile=second-full.log;performancesummary" ``` The first build establishes the baseline. The second build is the one you want to be incremental. Analyze `second.binlog`. @@ -62,19 +97,16 @@ Use binary logs (binlogs) to understand exactly why targets ran instead of being Use the **binlog MCP server** (`Microsoft.AITools.BinlogMcp`, exposed under the `binlog` MCP namespace) to analyze the second binlog: -1. Use the overview tool to check overall build status and duration -2. Use the search tool to find targets that executed vs were skipped — search for "Building target completely", "Building target incrementally", "Skipping target" -3. Use the search tool to find "is newer than output" messages that reveal which input file triggered a rebuild -4. Use target-related tools (target_reasons, project_targets) to inspect why specific targets ran -5. Use the expensive_targets tool to find targets that consumed the most time in the second build — these are your optimization targets +1. Use `load_binlog` to load `second.binlog`. +2. Use `search_binlog` for "Building target completely", "Building target incrementally", "Skipping target", and "is newer than output". +3. Use `get_target_info_by_name` for the target that reran. +4. Use `get_project_target_list` to confirm the target and its project context. +5. Use `get_expensive_targets` only to rank the non-skipped targets after the skip reason is understood. -### Fallback: text-log replay (when MCP is unavailable) +### Fallback: diagnostic text log (when MCP is unavailable) -2. **Replay the second binlog** to a diagnostic text log: - ```shell - dotnet msbuild second.binlog -noconlog -fl -flp:v=diag;logfile=second-full.log;performancesummary - ``` - Then search for targets that actually executed: +2. **Read the diagnostic log captured during the second build**. Do not run + another build or depend on replay support for the default fallback: ```bash grep 'Building target\|Target.*was not skipped' second-full.log ``` @@ -220,7 +252,7 @@ MSBuild provides built-in tools to understand what's running and why. - **Always add `Inputs` and `Outputs` to custom targets** — This is the single most impactful change for incremental build performance. Without both attributes, the target runs every time. - **Use `$(IntermediateOutputPath)` for generated files** — Files in `obj/` are tracked by MSBuild's clean infrastructure and won't leak between configurations. - **Register generated files in `FileWrites`** — Ensures `dotnet clean` removes them and prevents stale file accumulation. -- **Avoid volatile data in build** — Don't embed timestamps, random values, or build counters in file paths or generated content unless you have a deliberate strategy for managing staleness. If you must use volatile data, isolate it to a single file with minimal downstream impact. +- **Avoid unnecessary volatility in producers** — Don't embed timestamps, random values, or build counters in file paths or generated content unless required. Preserve generated-file timestamps when content is unchanged (for example, `Overwrite="true" WriteOnlyWhenDifferent="true"` with `WriteLinesToFile`). Keep real dependencies in `Inputs`; if required volatile content changes, accept the dependent rebuild. Exclude a file only after proving it cannot affect the output. - **Use `Returns` instead of `Outputs` when you need to pass items without creating incremental build dependency** — `Outputs` serves double duty: it defines the incremental check AND the items returned from the target. If you only need to pass items to calling targets without affecting incrementality, use `Returns` instead: ```xml diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/item-management/SKILL.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/item-management/SKILL.md index c776e3d2..b2749a57 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/item-management/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/item-management/SKILL.md @@ -1,6 +1,6 @@ --- name: item-management -description: "Patterns for managing MSBuild item groups: Include/Remove/Update semantics, item metadata, batching with %(Metadata), transforms, per-item filtering, and cross-product batching pitfalls. USE FOR: diagnosing and fixing item group anti-patterns in .csproj files, reviewing item management for correctness, fixing CS2002 duplicate file warnings from SDK globbing, fixing targets that run more times than expected due to cross-product batching, fixing Include vs Update misuse on SDK-globbed items, fixing FileWrites registration for generated file clean support, moving generated files to IntermediateOutputPath. DO NOT USE FOR: target chain architecture (use target-authoring), property patterns (use property-patterns), incrementality (use incremental-build), general anti-patterns (use msbuild-antipatterns), non-MSBuild build systems." +description: "Own concrete MSBuild ItemGroup and item-expression questions. USE FOR: Include, Remove, Update, item identity and metadata, transforms, filtering, batching, duplicate or overlapping items, and reviews that verify whether those operations are correct. Generated items stay in scope when the central defect is item identity, metadata, batching, duplicate declarations, or glob/Remove/Update semantics. For a generated artifact missing from compilation or output, wrong target timing/path, or FileWrites clean tracking without a broader item-semantics defect, use including-generated-files. The item operation may be broken, suspected, or already correct. Exclude property-only issues, general incrementality with no item question, broad reviews with no concrete item concern, and non-MSBuild systems." license: MIT --- diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/msbuild-antipatterns/SKILL.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/msbuild-antipatterns/SKILL.md index 3daa0776..5cbd50ca 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/msbuild-antipatterns/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/msbuild-antipatterns/SKILL.md @@ -1,6 +1,6 @@ --- name: msbuild-antipatterns -description: "Detect and fix MSBuild anti-patterns in project and build files. USE WHEN asked to review, audit, lint, clean up, or code-review a .csproj/.vbproj/.fsproj/.props/.targets/.proj (or Directory.Build.props/.targets) file, when asked 'is this project file correct?' or 'what's wrong with my build file?', or when hunting subtle build bugs caused by how a project is authored. Each anti-pattern has a symptom and a concrete BAD→GOOD fix. DO NOT USE FOR: non-MSBuild build systems (npm, Maven, CMake), or migrating a project to SDK-style (use msbuild-modernization)." +description: "DO NOT INVOKE when the primary request explicitly asks to convert, migrate, modernize, or rewrite a legacy/old-style project to SDK style; use msbuild-modernization. Migration prompts often mention ToolsVersion, explicit Compile/Reference entries, packages.config, or Microsoft.CSharp.targets, but merely reviewing or auditing a file that contains those patterns remains in scope here. USE FOR broad review, audit, lint, or maintainability/correctness checks of project/build files, including custom targets; prioritized cross-cutting findings; discrete anti-patterns; F# ordering/FS0039; cross-platform paths; and focused Import safety verdicts. Review/audit is analysis-only unless fixes are requested. For concrete property/item defects use property-patterns/item-management; use target-authoring for implementation and extension-points for NuGet auto-import/layout discovery. Exclude non-MSBuild systems." license: MIT --- @@ -14,6 +14,15 @@ A numbered catalog of common MSBuild anti-patterns. Each entry follows the forma Use this catalog when scanning project files for improvements. +## Review output contract + +For review, audit, maintainability, or correctness-risk requests: + +1. Do not edit files unless the user explicitly asks for fixes. +2. Return prioritized findings grounded in the supplied file, with impact and a targeted recommendation. +3. Separate confirmed defects from conditional risks and already-correct patterns. +4. Keep the final answer as the review; do not replace it with a terse summary of changes. + --- ## AP-01: `` for Operations That Have Built-in Tasks diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/msbuild-modernization/SKILL.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/msbuild-modernization/SKILL.md index d8c52abf..e88cd17c 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/msbuild-modernization/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/msbuild-modernization/SKILL.md @@ -1,6 +1,6 @@ --- name: msbuild-modernization -description: "Guide for modernizing and migrating MSBuild project files to SDK-style format. USE FOR: converting legacy .csproj/.vbproj with verbose XML to SDK-style, migrating packages.config to PackageReference, removing Properties/AssemblyInfo.cs in favor of auto-generation, eliminating explicit lists via implicit globbing, consolidating shared settings into Directory.Build.props. Indicators of legacy projects: ToolsVersion attribute, , .csproj files > 50 lines for simple projects. DO NOT USE FOR: projects already in SDK-style format, non-.NET build systems (npm, Maven, CMake), .NET Framework projects that cannot move to SDK-style." +description: "Guide for modernizing and migrating MSBuild project files to SDK-style format. USE FOR: converting legacy .csproj/.vbproj with verbose XML to SDK-style, migrating packages.config to PackageReference, removing Properties/AssemblyInfo.cs in favor of auto-generation, eliminating explicit Compile Include lists via implicit globbing, consolidating shared settings into Directory.Build.props. Indicators of legacy projects: ToolsVersion attribute, an Import of Microsoft.CSharp.targets via $(MSBuildToolsPath), .csproj files over 50 lines for simple projects. DO NOT USE FOR: projects already in SDK-style format, non-.NET build systems (npm, Maven, CMake), .NET Framework projects that cannot move to SDK-style." license: MIT --- diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/property-patterns/SKILL.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/property-patterns/SKILL.md index c0e3793c..29bd91cf 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/property-patterns/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-msbuild/skills/property-patterns/SKILL.md @@ -1,6 +1,6 @@ --- name: property-patterns -description: "MSBuild property definition patterns: conditional defaults, composition/concatenation, path normalization, trailing-slash handling, TFM detection helpers, and evaluation order. USE FOR: diagnosing and fixing property definition issues and shared-property anti-patterns in .props/.csproj; DefineConstants or NoWarn overwritten instead of appended; unconditional assignments that block project-level overrides; unquoted conditions that fail on empty properties; hardcoded paths that break cross-platform builds; setting overridable defaults; property evaluation order and last-write-wins semantics. DO NOT USE FOR: props vs targets placement (use directory-build-organization), item operations (use item-management), target structure (use target-authoring), general anti-patterns (use msbuild-antipatterns), non-MSBuild build systems." +description: "Diagnose and fix concrete MSBuild property defects in projects and existing shared-file hierarchies. USE FOR: conditions, defaults, append versus overwrite, last-write-wins values, OS/TFM checks, portable paths, normalization, and reviews centered on those property defects. Property defects in Directory.Build.* remain in scope, including overwritten values across parent/child imports and conditions that run before TargetFramework is set, even when the fix changes import order or moves a property group to .targets. DO NOT USE FOR: placement-only or import-only requests with no concrete property defect, such as discovering shared files or choosing which file owns a target or customization (use directory-build-organization); item operations; target structure; broad reviews without a concrete property defect; non-MSBuild work." license: MIT --- diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-template-engine/.claude-plugin/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-template-engine/.claude-plugin/plugin.json index b579845c..baf6c637 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-template-engine/.claude-plugin/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-template-engine/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-template-engine", - "version": "0.1.4", + "version": "0.1.5", "description": ".NET Template Engine skills for dotnet new: create projects (console app, class library, web API, Blazor, MAUI), discover and search templates, inspect template parameters and frameworks (net8.0, net9.0, net10.0), scaffold solutions, author and validate custom templates, install template packages from NuGet.", "skills": ["./skills/"], "agents": ["./agents/template-engine.agent.md"] diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-template-engine/.codex-plugin/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-template-engine/.codex-plugin/plugin.json index a3da1e6a..d5410fd3 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-template-engine/.codex-plugin/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-template-engine/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-template-engine", - "version": "0.1.4", + "version": "0.1.5", "description": ".NET Template Engine skills for dotnet new: create projects (console app, class library, web API, Blazor, MAUI), discover and search templates, inspect template parameters and frameworks (net8.0, net9.0, net10.0), scaffold solutions, author and validate custom templates, install template packages from NuGet.", "skills": ["./skills/"] } diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-template-engine/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-template-engine/plugin.json index b579845c..baf6c637 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-template-engine/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-template-engine/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-template-engine", - "version": "0.1.4", + "version": "0.1.5", "description": ".NET Template Engine skills for dotnet new: create projects (console app, class library, web API, Blazor, MAUI), discover and search templates, inspect template parameters and frameworks (net8.0, net9.0, net10.0), scaffold solutions, author and validate custom templates, install template packages from NuGet.", "skills": ["./skills/"], "agents": ["./agents/template-engine.agent.md"] diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-test-migration/.claude-plugin/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-test-migration/.claude-plugin/plugin.json index 2e1854cb..ab40a94b 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-test-migration/.claude-plugin/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-test-migration/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-test-migration", - "version": "0.1.9", + "version": "0.1.10", "description": "Skills and an orchestrator agent for migrating .NET test frameworks and platforms: MSTest and xUnit version upgrades, xUnit/NUnit-to-MSTest conversion, and VSTest to Microsoft.Testing.Platform.", "skills": ["./skills/"], "agents": [ diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-test-migration/.codex-plugin/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-test-migration/.codex-plugin/plugin.json index 0a282b5c..6e782354 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-test-migration/.codex-plugin/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-test-migration/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-test-migration", - "version": "0.1.9", + "version": "0.1.10", "description": "Skills for migrating .NET test frameworks and platforms: MSTest and xUnit version upgrades, xUnit/NUnit-to-MSTest conversion, and VSTest to Microsoft.Testing.Platform.", "skills": ["./skills/"] } diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-test-migration/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-test-migration/plugin.json index 2e1854cb..ab40a94b 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-test-migration/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-test-migration/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-test-migration", - "version": "0.1.9", + "version": "0.1.10", "description": "Skills and an orchestrator agent for migrating .NET test frameworks and platforms: MSTest and xUnit version upgrades, xUnit/NUnit-to-MSTest conversion, and VSTest to Microsoft.Testing.Platform.", "skills": ["./skills/"], "agents": [ diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/.claude-plugin/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/.claude-plugin/plugin.json index 763d2504..84622731 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/.claude-plugin/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-test", - "version": "0.2.22", + "version": "0.2.23", "description": "Skills for running, generating, analyzing, and improving .NET tests: test execution, filtering, platform detection, coverage, testability, and MSTest workflows.", "skills": ["./skills/"], "agents": [ diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/.codex-plugin/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/.codex-plugin/plugin.json index ff3c6b4f..1bf79f57 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/.codex-plugin/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-test", - "version": "0.2.22", + "version": "0.2.23", "description": "Skills for running, generating, analyzing, and improving .NET tests: test execution, filtering, platform detection, coverage, testability, and MSTest workflows.", "skills": ["./skills/"] } diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/README.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/README.md index 4a7f7ea9..063b50ed 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/README.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/README.md @@ -36,7 +36,7 @@ Moved to the [`dotnet-test-migration`](../dotnet-test-migration/) plugin (`migra ### Test quality & analysis *(polyglot)* -These six skills are all polyglot. They work across all supported languages by loading a per-language reference file from `test-analysis-extensions`. `grade-tests` additionally embeds its own scoring rubric (sub-grades, weighting, anti-pattern catalog) so the per-test grades stay consistent across calls. +These six skills are all polyglot. They work across all supported languages by loading a per-language reference file from `test-analysis-extensions`. `grade-tests` additionally embeds its own decision and scoring rubric so per-test Pass / Failed / Uncertain outcomes and supporting A-F quality grades stay consistent across calls. | Skill | Description | |---|---| @@ -45,7 +45,7 @@ These six skills are all polyglot. They work across all supported languages by l | **assertion-quality** | Measure assertion variety and depth — find shallow tests that barely verify anything (any language) | | **test-gap-analysis** | Verify test blind spots through pseudo-mutations and optionally add focused tests that kill them (any language) | | **test-tagging** | Tag tests with standardized traits (smoke, regression, boundary, critical-path, etc.); auto-edits where the framework has canonical syntax, report-only otherwise | -| **grade-tests** | Grade a curated list of test methods individually and produce a compact, PR-comment-friendly table of letter grades (A–F), score bands, and one-line notes — designed for per-PR test-quality feedback (any language) | +| **grade-tests** | Assess a curated list of test methods and produce a compact PR-ready table with Pass, Failed, or Uncertain decisions, A-F quality detail for resolved tests, and one-line notes; unresolved or empty scopes omit the grade, and a valid scope with no tests returns Not applicable (any language) | ### Coverage & risk *(.NET only)* @@ -104,7 +104,7 @@ These are the entry-point agents you invoke directly: | Agent | Purpose | |---|---| -| **test-quality-auditor** | Runs multi-skill audit pipelines for comprehensive test suite assessment | +| **test-quality-auditor** | Routes focused quality requests, including curated per-test decisions, and runs multi-skill pipelines for comprehensive suite assessment | | **testability-migration** | End-to-end testability improvement: detect → generate wrappers → migrate call sites → add deterministic tests when requested | > **Test framework/platform migration** is handled by the `test-migration` agent in the separate [`dotnet-test-migration`](../dotnet-test-migration/) plugin. diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/agents/test-quality-auditor.agent.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/agents/test-quality-auditor.agent.md index 48562d90..8ada2582 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/agents/test-quality-auditor.agent.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/agents/test-quality-auditor.agent.md @@ -33,10 +33,14 @@ broad health check: | Project-wide coverage, plateaus, or risk hotspots | `coverage-analysis` for .NET; native tooling otherwise | | CRAP or coverage-and-complexity risk for one named method, class, or file | `crap-score` | | Tags, traits, or test-type distribution | `test-tagging` | +| Curated tests needing a PR-ready Pass / Failed / Uncertain decision | `grade-tests` | | Generate or repair tests | `code-testing-agent`; it uses its direct workflow for focused work and delegates broad work to `code-testing-generator` | For a focused request, invoke the matching skill once and stop. A request to -generate tests is not an audit; leave this agent dormant. +grade a curated list is a focused decision report, not an audit dimension: route +to `grade-tests` once and do not add it to the broad pipeline unless the user +explicitly requested per-test decisions. A request to generate tests is not an +audit; leave this agent dormant. ## Workflow @@ -84,6 +88,10 @@ not rescan the same files. Invoke each applicable skill at most once: If coverage is unavailable, say it was not measured; do not launch collection just because this is a broad audit. +Do not run `grade-tests` as part of a general audit. Its zero-finding +Pass / Failed / Uncertain / Not applicable decision is designed for a bounded +test list or changed-test diff, not suite-wide health synthesis. + Run optional dimensions only when the user requested them or core findings make them necessary: @@ -115,8 +123,9 @@ number of tools/skills used. 3. One inventory, one execution probe, one invocation per selected skill. 4. No automatic coverage collection, mutation run, tagging, or experimental analysis without evidence or explicit user intent. -5. Skip inapplicable dimensions explicitly rather than simulating them. -6. Mention testability migration only for an explicit permitted .NET production +5. No automatic per-test grading during a broad audit. +6. Skip inapplicable dimensions explicitly rather than simulating them. +7. Mention testability migration only for an explicit permitted .NET production refactor request. ## Completion Condition diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/plugin.json index 763d2504..84622731 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet-test", - "version": "0.2.22", + "version": "0.2.23", "description": "Skills for running, generating, analyzing, and improving .NET tests: test execution, filtering, platform detection, coverage, testability, and MSTest workflows.", "skills": ["./skills/"], "agents": [ diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/skills/grade-tests/SKILL.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/skills/grade-tests/SKILL.md index 6829a6e8..a7f2b5a5 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/skills/grade-tests/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet-test/skills/grade-tests/SKILL.md @@ -1,25 +1,24 @@ --- name: grade-tests description: > - Grade specified test methods individually and produce a concise PR-ready - table with each fully qualified test name, an A-F grade, score band, and - one-line note. USE FOR per-test feedback on a curated list such as new or - modified tests in a pull request, not a suite-wide audit. Polyglot: .NET, - Python, TS/JS, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, C++. Inputs - may be test methods, method bodies, or file-and-line spans. DO NOT USE FOR: - full suite audits (use test-quality-auditor agent or test-anti-patterns), - writing new tests (use code-testing-generator agent or writing-mstest-tests), - fixing failures, or measuring code coverage. + Assess a curated list of tests and produce a PR-ready table with a primary + Pass, Failed, Uncertain, or Not applicable result plus A-F quality detail for + every resolved test; Uncertain and Not applicable omit the grade. USE FOR new + or modified tests supplied as methods, bodies, file spans, or a bounded PR + diff. Polyglot: .NET, Python, TS/JS, Java, Go, Ruby, Rust, Swift, Kotlin, + PowerShell, C++. DO NOT USE FOR: suite-wide audits (use test-quality-auditor + or test-anti-patterns), writing or fixing tests, or measuring coverage. license: MIT --- # Grade Tests -Grade a curated list of test methods and produce a compact, PR-comment-friendly -report: one row per test method with a letter grade, a score band, and a -one-line note explaining the grade. The skill **does not discover tests on its -own** — the caller (typically a PR automation workflow or a human reviewer -holding a specific list) provides the test methods to grade. +Assess a curated list of test methods and produce a compact, +PR-comment-friendly report. The primary result is one of **Pass**, **Failed**, +**Uncertain**, or **Not applicable**; an A-F quality grade remains secondary +diagnostic information. The skill **does not discover tests on its own** — the +caller (typically a PR automation workflow or a human reviewer holding a +specific list) provides the tests or a bounded diff to assess. > **Language-specific guidance**: Call the `test-analysis-extensions` skill > to discover available extension files, then read the file matching the @@ -29,22 +28,21 @@ holding a specific list) provides the test methods to grade. > anti-patterns, because assertion APIs and idiomatic patterns differ > significantly across frameworks. -## Why a Per-Test Grade +## Why a Decision Result Plus Quality Detail -Suite-wide audits (`test-anti-patterns`, `assertion-quality`, -`test-smell-detection`) produce excellent diagnostic reports, but they are -hard to consume as a short PR comment. Reviewers of a PR mostly want to know: -*for the tests this PR adds or changes, are they good?* This skill answers -that question with a one-row-per-test verdict that fits in a comment table. +PR reviewers need a simple answer to *does this test need follow-up?* The +four-state result provides that decision; the existing A-F rubric explains its +quality and severity. ## When to Use -- A PR automation workflow needs to post a comment grading the tests - introduced or modified in a pull request. +- A PR automation workflow needs to post a decision on the tests introduced or + modified in a pull request. - A reviewer has a specific list of tests (a file, a class, a method list, - or a diff hunk) and wants a per-test verdict rather than a suite report. + or a diff hunk) and wants per-test follow-up decisions rather than a suite + report. - A maintainer wants to triage which of N tests in a contribution deserve - follow-up improvements. + follow-up improvements, with quality grades for resolved tests. ## When Not to Use @@ -85,6 +83,9 @@ short message asking the caller to provide an explicit list / file(s) / diff, and optionally point them at `test-quality-auditor` agent or `test-anti-patterns` skill for full-suite analysis. Stop there. +If a valid bounded scope resolves to zero eligible tests, return +**Not applicable** with a short explanation and no invented rows. + ## Workflow ### Step 1: Detect language and load extension @@ -106,10 +107,12 @@ For each entry in the input list: 2. Otherwise read the file at the given path and locate the method by its fully-qualified name. Capture the full method body, including attributes / decorators / fixtures and any helper code that the test calls. -3. If a method cannot be found, record it as `N/A — method not found` and - continue. Never invent a body to grade. +3. If a requested method cannot be found, record it as + `Uncertain — method not found` with no quality grade and continue. Never + invent a body to grade. A missing requested method requires human review; + it is not the same as a valid scope containing no tests. -### Step 3: Score each test +### Step 3: Score each resolved test Start every test at grade **A (score band 90–100)**, then apply deductions strictly for **observable issues** in the captured body. Do **not** deduct @@ -260,46 +263,58 @@ Report the **letter grade** and the **score band** (not a single 0–100 number). False precision invites bikeshedding; bands keep the conversation focused on the rubric. -### Step 4: Build the note +### Step 4: Assign the decision result + +The grade summarizes strength; the result says whether follow-up exists. +An actionable improvement is an evidence-backed change to the test, setup, or +fixtures. Assign exactly one: + +- **Pass** — no actionable improvement; positive/context-only notes are allowed. +- **Failed** — at least one actionable improvement, regardless of grade. +- **Uncertain** — missing evidence prevents a decision and needs human review. +- **Not applicable** — a valid scope contains no eligible tests; normally an + overall result with no rows. -The note column is one short sentence (target ≤ 120 characters). State the -single most important reason for the grade. Examples: +Do not derive status from grade: a complete focused test can be **B / Pass**, +while debug output can make an otherwise excellent test **A / Failed**. Use +Uncertain for an unresolved body, unsupported construct, or essential missing +contract—not merely absent production code. A definite finding wins over +uncertainty. -- A (90–100): `Clear AAA structure; equality + exception assertions on the public contract.` -- B (80–89): `Good assertion variety, mildly long body — consider splitting into per-condition tests.` -- C (70–79): `Only checks IsNotNull on the result; no value verification.` -- D (60–69): `Self-referential assertion: round-trip identity verifies plumbing, not transformation.` -- F (0–59): `No assertions — test executes the method but never verifies anything.` +### Step 5: Build the note -If a test gets A with no notable issues, the note may simply be -`No issues found.` — do not invent weaknesses to justify the grade. +Use one sentence (target ≤ 120 characters) for the most important reason: +`No issues found.`, `Only checks IsNotNull; add value verification.`, or +`Method body could not be resolved; human review is required.` Do not invent a +weakness to justify a grade or Failed result. -### Step 5: Report +### Step 6: Report Produce two sections. #### 1. Summary -A short paragraph (2–4 sentences) covering: total tests graded, grade -distribution, most common issue, and the single most important -recommendation. +Begin with `**Result: **`, then give result +counts and the highest-priority action. Aggregate using +**Failed → Uncertain → Pass → Not applicable**. For Not applicable, explain the +empty scope and omit the table. #### 2. Per-test table ```markdown -| Test | Grade | Band | Notes | -|------|-------|------|-------| -| `Namespace.ClassName.Test_Method_Condition_Expected` | A | 90–100 | Clear AAA; equality + exception assertions. | -| `Namespace.ClassName.Test_Other` | C | 70–79 | Only `IsNotNull` — no value verification. | -| `Namespace.ClassName.Test_Old` | F | 0–59 | No assertions. | +| Test | Result | Quality | Notes | +|------|--------|---------|-------| +| `Namespace.ClassName.Test_Method_Condition_Expected` | Pass | A (90–100) | No issues found. | +| `Namespace.ClassName.Test_Other` | Failed | C (70–79) | Only `IsNotNull`; add value verification. | +| `Namespace.ClassName.Test_Missing` | Uncertain | — | Method body could not be resolved; human review is required. | ``` **Caps and ordering**: -- If the table would exceed **50 rows**, show all tests graded below **B** - first (worst to best), then a sample of the best tests, and wrap any - overflow in a collapsed `
` block. -- Within the same grade, order by file path then by method name for - determinism. +- If the table would exceed **50 rows**, show Failed tests first, then + Uncertain tests, then a sample of Pass tests. Wrap overflow in a collapsed + `
` block. +- Within the same result, order by quality from worst to best, then by file + path and method name for determinism. - If the diff context is provided, prefix each test name with a `(new)` or `(modified)` marker. @@ -309,7 +324,9 @@ prefix each section with the language name and framework. ## Validation - [ ] Every test in the input list appears in the table (or is recorded as - `N/A — method not found`). + `Uncertain — method not found`). +- [ ] Every resolved test has Pass or Failed plus A-F quality detail. +- [ ] Uncertain is an evidence gap; Not applicable is a valid empty scope. - [ ] Every grade is justified by at least one observable signal in the captured body — no speculative deductions. - [ ] Trivial-assertion tests are flagged only when the **only** assertion @@ -343,6 +360,8 @@ prefix each section with the language name and framework. | Treating pytest bare `assert` or Go `if got != want { t.Error… }` as missing-framework | Both are canonical; count in the correct assertion category. | | Penalizing tests when production code is unavailable | Mark concerns about uncovered behaviors as `Unverified` and do not deduct. | | Using a fake-precise score (e.g., 87/100) | Use the score band only — 90–100, 80–89, 70–79, 60–69, 0–59. | -| Spilling a 500-row table into a PR comment | Apply the row cap from Step 5; collapse extras into `
`. | +| Spilling a 500-row table into a PR comment | Apply the row cap from Step 6; collapse extras into `
`. | | Re-reporting an existing finding three times under different categories | Pick the most fitting category and report once. | | Inventing weaknesses for A-grade tests to make the note "balanced" | If a test is clean, the note may simply read `No issues found.` | +| Mapping status from grade or comments | Fail only for actionable improvements; a B can Pass and an A can Fail. | +| Confusing Uncertain and Not applicable | Evidence gaps are Uncertain; a valid empty scope is Not applicable. | diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet/.claude-plugin/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet/.claude-plugin/plugin.json index 61945dc7..6771476f 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet/.claude-plugin/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet", - "version": "0.2.4", + "version": "0.2.5", "description": "C# language server (LSP) integration for coding agents and high-level .NET development skills.", "skills": ["./skills/"], "lspServers": "./.lsp.json" diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet/.codex-plugin/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet/.codex-plugin/plugin.json index 3fe9d78a..d6c1560e 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet/.codex-plugin/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet", - "version": "0.2.4", + "version": "0.2.5", "description": "Core C# and .NET development skills for coding agents.", "skills": ["./skills/"] } diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet/plugin.json b/external-sources/upstreams/dotnet-skills/plugins/dotnet/plugin.json index 609af72e..b0f2dbde 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet/plugin.json +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet/plugin.json @@ -1,6 +1,6 @@ { "name": "dotnet", - "version": "0.2.4", + "version": "0.2.5", "description": "C# language server (LSP) integration for coding agents and high-level .NET development skills.", "skills": ["./skills/"], "lspServers": "./lsp.json" diff --git a/external-sources/upstreams/dotnet-skills/plugins/dotnet11/skills/system-text-json-net11/SKILL.md b/external-sources/upstreams/dotnet-skills/plugins/dotnet11/skills/system-text-json-net11/SKILL.md index 25c7bf95..20a6daae 100644 --- a/external-sources/upstreams/dotnet-skills/plugins/dotnet11/skills/system-text-json-net11/SKILL.md +++ b/external-sources/upstreams/dotnet-skills/plugins/dotnet11/skills/system-text-json-net11/SKILL.md @@ -2,13 +2,12 @@ name: system-text-json-net11 description: > Imperative guidance for the System.Text.Json APIs added in .NET 11: the built-in - `JsonNamingPolicy.PascalCase` naming policy, and the strongly-typed - `JsonSerializerOptions.GetTypeInfo()` and - `JsonSerializerOptions.TryGetTypeInfo(out JsonTypeInfo? info)` - metadata accessors. + `JsonNamingPolicy.PascalCase` naming policy, and the strongly-typed generic + `JsonSerializerOptions.GetTypeInfo` and `JsonSerializerOptions.TryGetTypeInfo` + metadata accessors (generic overloads that return a typed `JsonTypeInfo`). USE ONLY when the user is targeting net11.0 or later and needs PascalCase JSON property or dictionary-key names without writing a custom naming policy, a strongly-typed - `JsonTypeInfo` instead of the non-generic `JsonTypeInfo`, or a no-throw way to probe + generic `JsonTypeInfo` instead of the non-generic `JsonTypeInfo`, or a no-throw way to probe whether a type's serialization metadata is resolved. DO NOT USE when the target is earlier than net11.0, the requested behavior uses an established pre-net11 naming policy, or the user explicitly selected another JSON library. diff --git a/external-sources/vendir.lock.yml b/external-sources/vendir.lock.yml index c1488bb0..bb8ee411 100644 --- a/external-sources/vendir.lock.yml +++ b/external-sources/vendir.lock.yml @@ -2,20 +2,21 @@ apiVersion: vendir.k14s.io/v1alpha1 directories: - contents: - git: - commitTitle: 'Merge pull request #1185 from dotnet/abhitejjohn-fix-csharp-refactoring-evals...' - sha: e87c5da26cbf0f8c701e91247c4817df0adc12f7 + commitTitle: 'Merge pull request #1194 from dotnet/bot/weekly-version-sync...' + sha: c7cc6617da6c6cadc4ebe7b06926a02caa108e82 tags: - - skill-validator-nightly-14-ge87c5da + - skill-validator-nightly-23-gc7cc6617 path: dotnet-skills - git: commitTitle: Add Cursor rules that reference the existing skill docs... sha: af2319bd01bb7cc881267a9ef42cafdaf5e9029d path: webgpu-claude-skill - git: - commitTitle: Update examples (#18204)... - sha: 4c1470a7f907fe678ef5e7dceaa972ca83d297da + commitTitle: Skip dev toolbar source annotations when compiling in Vite test + mode (#18162) (#18242)... + sha: c5275e3d5a688a7d246c9576b594870675b70e37 tags: - - astro@7.3.5-43-g4c1470a7f9 + - astro@7.3.5-67-gc5275e3d5a path: astro path: upstreams kind: LockConfig