dotnet
@dotnet Organization
Public Skills
write-ui-tests
by dotnet
Creates UI tests for a GitHub issue and verifies they reproduce the bug. Iterates until tests actually fail (proving they catch the issue). Use when PR lacks tests or tests need to be created for an issue.
pr-build-status
by dotnet
"Retrieve Azure DevOps build information for GitHub Pull Requests, including build IDs, stage status, failed jobs, and Helix console logs for any Helix-based test failures."
test-anti-patterns
by dotnet
Audit an existing test file or suite and produce a severity-ranked diagnostic report. ALWAYS USE for findings about tests that verify nothing, missing or tautological assertions, swallowed/broad exceptions, flaky or order-dependent tests, duplication, or magic values. Polyglot. DO NOT USE for direct edits: use writing-mstest-tests for supplied MSTest assertions, attributes, or lifecycle, and code-testing-agent for new tests. Do not use for running tests, migration, assertion metrics (assertion-quality), coverage/CRAP metrics, or the testsmells.org catalog (test-smell-detection).
scaffold-dotnet-test-project
by dotnet
Create and wire the first .NET test project. USE FOR: "solution has no tests", Tests.csproj/ProjectReference, solution registration, central packages, or tests missing from CI. DO NOT USE when a suitable project exists, for migration, or for MSTest API/attribute/MSTest.Sdk/parallelization advice without a request to create and wire files (writing-mstest-tests).
writing-mstest-tests
by dotnet
Fix, modernize, review, or explain supplied MSTest code and MSTest-specific configuration while honoring installed versions and project style. ALWAYS USE for direct corrections: expected/actual order; generic/manual assertions; exception, hard-cast, or object[] patterns; TestContext/lifecycle; timeout/cancellation; condition/retry/cleanup; parallelization; MSTest.Sdk setup; or MSTESTxxxx. Use for "review" only when corrected code or edits are wanted. DO NOT USE for new test-case design (code-testing-agent), report-only audits/metrics (test-anti-patterns or assertion-quality), creating/wiring a first test project (scaffold-dotnet-test-project), running tests, migration, non-MSTest frameworks, or non-.NET.
code-testing-agent
by dotnet
Generate or add unit tests for existing code, from one function to a project-wide suite. ALWAYS USE for "write/add/generate tests", "cover this untested method", scaffolding tests where none exist, or comprehensive suites. Polyglot; supports classic packages.config MSTest, sparse workspaces, and proportional focused work. DO NOT USE for only running/diagnosing tests, coverage/audits, or correcting supplied MSTest assertions, attributes, lifecycle, or configuration without designing new cases (writing-mstest-tests).
assertion-quality
by dotnet
"Produce an assertion-quality report or metrics for existing tests. ALWAYS USE when asked whether assertions are weak, shallow, trivial, always true, self-referential, or diverse; which tests are assertion-free or use only presence/truthiness checks; or for depth/variety metrics. Polyglot. DO NOT USE for direct fixes: use writing-mstest-tests for supplied MSTest assertions, or code-testing-agent when new cases must be designed. Do not use for mutation reasoning (test-gap-analysis) or a general severity-ranked audit (test-anti-patterns)."
improve-skill-quality
by dotnet
Diagnoses and fixes skills in the dotnet/skills repository that lose to their own baseline, fail to activate, time out, or return "no credible improvement". Use when an evaluation verdict is a regression or underpowered, when a skill regressed after a change, when /evaluate reports no results, or when deciding whether a weak skill should be strengthened or retired. Do not use for scaffolding a brand-new skill (use create-skill) or a brand-new eval (use create-skill-test).
create-skill-test
by dotnet
Scaffolds eval.yaml evaluation specs for agent skills in the dotnet/skills repository. Use when creating skill tests, writing evaluation stimuli, defining graders and rubrics, sizing an eval for statistical power, or setting up test fixture files. Handles the Vally eval.yaml schema, fixture organization, and overfitting avoidance. Do not use for running or debugging existing evals (use improve-skill-quality) nor for skills authoring (use create-skill).
test-smell-detection
by dotnet
Audits existing tests in any language using formal, research-backed test smell names and the testsmells.org 19-smell academic taxonomy. Use when the caller asks for an academic or citable test-smell review, named smell categories, or a formal severity-ranked smell assessment. Covers Assertion Roulette, Conditional Test Logic, Mystery Guest, Eager Test, Sleepy Test, Unknown Test, Sensitive Equality, and the rest of the catalog across .NET, Python, JavaScript/TypeScript, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, and C++. DO NOT USE FOR a quick pragmatic test review (use test-anti-patterns), writing or running tests, framework migration, coverage, or assertion-diversity metrics.
agentic-workflows
by dotnet
Route gh-aw workflow design/create/debug/upgrade requests to the right prompts.
create-skill
by dotnet
Scaffolds new agent skills for the dotnet/skills repository. Use when creating a new skill, generating SKILL.md files, writing a skill description that the runtime will actually route to, or setting up skill directory structures. Handles frontmatter generation, section templates, and validation guidance. Do not use for fixing a skill that already fails its evaluation (use improve-skill-quality) or for writing eval.yaml (use create-skill-test).
convert-to-cpm
by dotnet
Convert .NET projects and solutions (.sln, .slnx) to NuGet Central Package Management (CPM) using Directory.Packages.props. USE FOR: converting to CPM, centralizing or aligning NuGet package versions across multiple projects, inlining MSBuild version properties from Directory.Build.props into Directory.Packages.props, resolving version conflicts or mismatches across a solution or repository, updating or bumping or syncing package versions across projects. Also activate when packages are out of sync, drifting, or inconsistent -- even without the user mentioning CPM. Provides baseline build capture, version conflict resolution, build validation with binlog comparison, and a structured post-conversion report. DO NOT USE FOR: packages.config projects (must migrate to PackageReference first) or repositories that already have CPM fully enabled.
technology-selection
by dotnet
"Guides technology selection and implementation of AI and ML features in .NET 8+ applications using ML.NET, Microsoft.Extensions.AI (MEAI), Microsoft Agent Framework (MAF), GitHub Copilot SDK, ONNX Runtime, and OllamaSharp. Covers the full spectrum from classic ML through modern LLM orchestration to local inference. Use when adding classification, regression, clustering, anomaly detection, recommendation, LLM integration (text generation, summarization, reasoning), RAG pipelines with vector search, agentic workflows with tool calling, Copilot extensions, or custom model inference via ONNX Runtime to a .NET project. DO NOT USE FOR projects targeting .NET Framework (requires .NET 8+), the task is pure data engineering or ETL with no ML/AI component, or the project needs a custom deep learning training loop (use Python with PyTorch/TensorFlow, then export to ONNX for .NET inference)."
platform-detection
by dotnet
Detect a .NET project's test platform/framework and SDK-style vs classic project system. ALWAYS USE for "which test platform/framework?", "VSTest or MTP?", a wrong dotnet test runner, or hidden runner settings in global.json, .csproj, packages.config, Directory.Build.props, or Directory.Packages.props. Handles SDK-version precedence and MSTest/xUnit/NUnit/TUnit. DO NOT USE for running/filtering tests (run-tests), hot reload, or migration.
coverage-analysis
by dotnet
Project-wide code coverage and CRAP (Change Risk Anti-Patterns) score analysis for .NET projects. Calculates CRAP scores per method and surfaces risk hotspots — complex code with low coverage that is dangerous to modify. Use to diagnose why coverage is stuck or plateaued, identify what methods block improvement, or get project-wide coverage analysis with risk ranking. USE FOR: coverage stuck, coverage plateau, can't increase coverage, what's blocking coverage, coverage gap, CRAP scores, risk hotspots, where to add tests, coverage analysis, coverage report. DO NOT USE FOR: targeted single-method CRAP analysis (use crap-score); auditing test code for coverage-touching or other anti-patterns (use test-anti-patterns); writing tests; running tests (use run-tests). Requires or produces coverage (Cobertura) and CRAP metrics.
run-tests
by dotnet
Run or recommend the exact .NET test command. ALWAYS USE when asked to run, filter, or troubleshoot .NET tests or provide precise flags/argument order. Supports SDK-style dotnet test and classic non-SDK projects using MSBuild plus vstest.console/MSTest or repository scripts. USE FOR: all tests or subsets by class/category/trait; multi-TFM --framework; TRX reports; crash/hang dumps; VSTest vs Microsoft.Testing.Platform; bridged vs native MTP argument syntax; --filter, --filter-class, --filter-trait, --filter-query, and --treenode-filter. Detects MSTest/xUnit/NUnit/TUnit and packages.config/classic project constraints. DO NOT USE FOR: writing tests (use code-testing-agent), MTP hot-reload iteration, CI/CD configuration, or debugging test logic.
crap-score
by dotnet
Calculates targeted CRAP (Change Risk Anti-Patterns) scores for a named .NET method, class, or single source file. Use when the user explicitly asks to compute CRAP scores or assess risky untested code for a specific target, combining Cobertura coverage data with cyclomatic complexity analysis. DO NOT USE FOR: project-wide coverage analysis, coverage plateau or "stuck coverage" diagnosis, what's blocking coverage, or where to add tests across a project (use coverage-analysis); writing tests; running tests without CRAP context.
test-gap-analysis
by dotnet
Find or close verified gaps in existing tests. USE FOR: "add missing edge cases", "would tests catch this bug?", weak tests, survived boundaries/guards/ errors, or pseudo-mutation analysis. Polyglot. DO NOT USE FOR: a new suite (code-testing-agent), smells/assertion audits, or an actual mutation tool.
testability-obstacle
by dotnet
Make C# ambient-dependent behavior testable and add deterministic tests. USE FOR: DateTime/Task.Delay/File/Environment/Guid/Random, constructor injection for instance classes, preserving static APIs, nested override restore, parallel isolation, or no real I/O. DO NOT USE FOR: audits, wrapper-only/bulk migration, or an existing injectable seam.
optimizing-ef-core-queries
by dotnet
"Optimize and improve the performance of slow Entity Framework Core (EF Core) queries: make them generate less SQL, make fewer database round-trips, and return results faster. Use whenever an EF Core or DbContext query or data-access path is slow or should be made faster — whether or not EF Core owns the database schema. For EF Core, not Dapper or raw ADO.NET."
binlog-failure-analysis
by dotnet
"Analyze MSBuild binary logs to diagnose build failures. USE FOR: build errors that are unclear from console output, diagnosing cascading failures across multi-project builds, tracing MSBuild target execution order, and generally any MSBuild build issues. Requires an existing .binlog file. DO NOT USE FOR: generating binlogs (use binlog-generation), non-MSBuild build systems."
generate-testability-wrappers
by dotnet
Generate wrapper interfaces and DI registration for hard-to-test static dependencies in C#, when the abstraction does NOT exist yet. Produces IFileSystem, IEnvironmentProvider, IConsole, IProcessRunner wrappers, or guides first-time adoption of TimeProvider and IHttpClientFactory. With no DI container, produces the ambient context seam instead. USE FOR: generate wrapper for static, create IFileSystem wrapper, wrap DateTime.Now, make a static or a class testable, create abstraction for File., generate DI registration, adopt TimeProvider when it is not registered yet, IHttpClientFactory setup, testability wrapper, how to make statics injectable, adopt System.IO.Abstractions, make code testable without adding a DI framework. DO NOT USE FOR: detecting statics (use detect-static-dependencies), migrating call sites or replacing existing DateTime./File.* usages once the wrapper is created or already registered in DI (use migrate-static-to-wrapper), general interface design.
migrate-mstest-v3-to-v4
by dotnet
Fix build errors and breaking changes after upgrading MSTest v3 to v4, or plan a complete v3-to-v4 migration. Use when user says "upgrade to MSTest v4", "MSTest 4 migration", "MSTest v4 breaking changes", "tests don't compile after upgrading MSTest 3.x to 4.x", or hits CS0507, CS0103, CS1061, CS1615 after updating MSTest packages to 4.x. USE FOR: Execute to ExecuteAsync, CallerInfo ctor on TestMethodAttribute, sealed custom attributes, ClassCleanupBehavior removal, TestContext.Properties Contains to ContainsKey, Assert.ThrowsException to ThrowsExactly, Assert.IsInstanceOfType out param removal, ExpectedExceptionAttribute removal, TestTimeout enum removal, [TestMethod("name")] to DisplayName syntax, TreatDiscoveryWarningsAsErrors, TestContext.TestName in ClassInitialize, MSTest.Sdk MTP changes, dropped TFMs (net6.0/net7.0 to net8.0+). DO NOT USE FOR: MSTest v1/v2 to v3, or errors left from a 2.x-to-3.x upgrade (use migrate-mstest-v1v2-to-v3 first); test framework conversions; general .NET upgrades.