dotnet-code-analysis
Configures and enforces .NET code analysis and warning policies in .NET projects.
Install
mkdir -p .claude/skills/dotnet-code-analysis && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/18668" && unzip -o skill.zip -d .claude/skills/dotnet-code-analysis && rm skill.zipInstalls to .claude/skills/dotnet-code-analysis
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Use the free built-in .NET SDK analyzers and analysis levels with gradual Roslyn warning promotion. Use when a .NET repo needs first-party code analysis, `EnableNETAnalyzers`, `AnalysisLevel`, or warning-as-error policy wired into build and CI.Key capabilities
- →Enable built-in .NET SDK analyzers
- →Set `AnalysisLevel` and `AnalysisMode`
- →Enforce `TreatWarningsAsErrors` policy
- →Promote Roslyn warnings gradually in legacy projects
- →Configure per-rule severity in `.editorconfig`
How it works
The skill analyzes a .NET project's maturity and applies appropriate Roslyn analyzer settings, including `AnalysisLevel` and `TreatWarningsAsErrors`. It facilitates gradual warning promotion for legacy codebases.
Inputs & outputs
When to use dotnet-code-analysis
- →Enforcing code analysis
- →Setting warning-as-error policies
- →Managing Roslyn analyzers
About this skill
.NET Code Analysis
Trigger On
- the repo wants first-party .NET analyzers
- CI should fail on analyzer warnings
- the team needs
AnalysisLevelorAnalysisModeguidance - the repo needs a gradual Roslyn warning promotion strategy
Do Not Use For
- third-party analyzer selection by itself
- formatting-only work
Inputs
- the nearest
AGENTS.md - project files or
Directory.Build.props - current analyzer severity policy
Hard Rules for AI Agents
Non-negotiable. Violating these undermines the user's explicit intent.
- Never disable or remove
TreatWarningsAsErrorsorWarningsAsErrorsif the project has set them. Do not comment them out, set tofalse, wrap in a condition, or add<TreatWarningsAsErrors>false</TreatWarningsAsErrors>to make the build pass. - Never add
<NoWarn>or#pragma warning disablefor warnings the user chose to treat as errors, unless the user explicitly approves the suppression. - Never silently downgrade severity in
.editorconfig(e.g.errortowarningornone) to make a build succeed. - If warnings-as-errors breaks the build — fix the code. If the fix is too large, ask the user whether to defer that warning ID.
- If warning volume is too large to fix in one pass — report count and categories to the user and ask which to tackle first. Do not unilaterally disable the policy.
Workflow
flowchart TD
A[Start] --> B{New or legacy project?}
B -->|New| C[TreatWarningsAsErrors=true immediately]
B -->|Legacy| D[dotnet build, count warnings by ID]
D --> E{"< 30 warnings?"}
E -->|Yes| F[Fix all, then enable TreatWarningsAsErrors]
E -->|No| G[Report counts to user, ask which batch first]
G --> H[Add selected IDs to WarningsAsErrors]
H --> I[Fix that batch, verify build]
I --> J{More batches?}
J -->|Yes| G
J -->|No| F
C --> K[Set AnalysisLevel latest-recommended]
F --> K
K --> L[Promote security CA3xxx/CA5xxx to error in .editorconfig]
L --> M[Validate: build + CI green]
- Start with SDK analyzers before third-party packages.
- Detect project maturity: new or existing/legacy.
- Enable
EnableNETAnalyzers,AnalysisLevel,AnalysisModeinDirectory.Build.props. - Apply the right warning promotion strategy (see below).
- Per-rule severity goes in repo-root
.editorconfig. dotnet buildis the analyzer gate in CI.
Warning Promotion Strategy
New Projects
Set these in Directory.Build.props immediately:
TreatWarningsAsErrors= trueAnalysisLevel= latest-recommended- Security category = error in
.editorconfig
Fix all warnings before merging.
Legacy Projects — Gradual Promotion
Blanket TreatWarningsAsErrors on a legacy codebase produces hundreds/thousands of errors. An agent cannot fix them all at once — context floods, fix quality drops. Promote in batches.
Phase 1: Trivial Hygiene (start here)
Mechanical fixes, lowest effort:
- CS8019 — unnecessary using directive (remove it)
- CS0219 — variable assigned but never used (remove it)
- CS0168 — variable declared but never used (remove it)
- CS1591 — missing XML comment for public member (add comment or disable for internal code)
- CS0612 — obsolete member used, no message (replace with non-obsolete API)
- CS0618 — obsolete member used, with message (follow migration guidance)
Add to WarningsAsErrors: CS8019;CS0219;CS0168. Fix all, then Phase 2.
Phase 2: Code Quality (ask user which categories)
- CA2000 — dispose objects before losing scope (Reliability)
- CA1062 — validate public method arguments (Design)
- CA1822 — mark members as static (Performance)
- CA1860 — avoid Enumerable.Any() for length check (Performance)
- CA1861 — avoid constant arrays as arguments (Performance)
- CA2007 — consider calling ConfigureAwait (Reliability)
- CS8600–CS8610 — nullable reference type warnings (Nullability)
Ask: "Which categories next — Nullability, Performance, or Reliability?" Add selected IDs to WarningsAsErrors, fix, repeat.
Phase 3: Security (always promote early)
Set in .editorconfig regardless of project maturity:
[*.cs]
dotnet_analyzer_diagnostic.category-Security.severity = error
Covers CA3001 (SQL injection), CA3002 (XSS), CA3003 (path injection), CA3075 (insecure DTD), CA5350/CA5351 (weak crypto), CA5394 (insecure randomness).
Phase 4: Full Coverage
Once all batches pass, transition to:
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<WarningsNotAsErrors>CA1707</WarningsNotAsErrors> <!-- explicit exceptions only -->
Interaction Protocol (legacy codebases)
- Run
dotnet build, count warnings by ID. - Report summary: "Found 47 CS8019, 23 CA1822, 12 CA2000, 8 CS8600."
- Ask which batch to tackle. Recommend starting with Phase 1.
- Fix selected batch, verify build.
- Add those IDs to
WarningsAsErrors. - Report back, ask about next batch.
Never skip the ask step. The user decides the pace.
Bootstrap When Missing
- Detect current state:
dotnet --inforg -n "EnableNETAnalyzers|AnalysisLevel|AnalysisMode|TreatWarningsAsErrors|WarningsAsErrors" -g '*.csproj' -g 'Directory.Build.*' .dotnet build SOLUTION_OR_PROJECT 2>&1— count warnings by ID
- Classify: new (few/zero warnings) vs legacy (many warnings).
- Enable
EnableNETAnalyzers,AnalysisLevel,AnalysisModein MSBuild config. - Apply promotion strategy matching project maturity.
- Per-rule severity in repo-root
.editorconfig. - Run
dotnet build, returnstatus: configuredorstatus: improved. - If repo defers analyzer policy to another build layer, return
status: not_applicable.
Deliver
- explicit, reviewable first-party analyzer policy
- build-time analyzer execution for CI
- warning promotion plan matching project maturity
Validate
- analyzer behavior driven by repo config, not IDE defaults
- CI reproduces same warnings/errors locally
- no
TreatWarningsAsErrors,WarningsAsErrors, or severity settings removed/weakened without user approval - promoted warnings produce build errors, not just IDE hints
Ralph Loop
- Plan: analyze state, define target, constraints, risks, execution plan, validation steps.
- Execute one step, produce concrete delta.
- Review result, capture findings.
- Apply fixes in small batches, rerun checks.
- Update plan after each iteration.
- Repeat until acceptable or only explicit exceptions remain.
- Missing dependency: bootstrap or return
status: not_applicable.
Required Result Format
status:complete|clean|improved|configured|not_applicable|blockedplan: concise plan and current stepactions_taken: concrete changesvalidation_skills: final skills run or skipped with reasonsverification: commands, checks, or review evidenceremaining: unresolved items ornone
Load References
references/rules.mdreferences/config.mdreferences/code-analysis.md
Example Requests
- "Turn on built-in .NET analyzers."
- "Make analyzer warnings fail the build."
- "Set the right AnalysisLevel for this repo."
- "Start treating unused usings and unused variables as errors."
- "Help me gradually promote Roslyn warnings in my legacy project."
- "Which warnings should I promote to errors next?"
When not to use it
- →For third-party analyzer selection by itself
- →For formatting-only work
- →When the user wants to disable or remove `TreatWarningsAsErrors` without explicit approval
Prerequisites
Limitations
- →Requires a .NET SDK-based repository
- →Does not select third-party analyzers by itself
- →Cannot disable `TreatWarningsAsErrors` or downgrade severity without user approval
How it compares
This skill provides a structured, policy-driven approach to .NET code analysis and warning management, unlike manually configuring analyzers or fixing all warnings at once.
Compared to similar skills
dotnet-code-analysis side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| dotnet-code-analysis (this skill) | 0 | 3mo | No flags | Intermediate |
| dotnet-dev | 1 | 5mo | Review | Beginner |
| dotnet-code-quality | 0 | 12d | Review | Intermediate |
| csharp-pro | 9 | 3mo | No flags | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by managedcode
View all by managedcode →You might also like
dotnet-dev
GitTools
Expert guidance for .NET development in this repository. Use this skill for building, testing, debugging, and understanding project structure, coding conventions, dependency injection patterns, and testing practices.
dotnet-code-quality
albertoirurueta
Run this .NET/C# project or solution's Roslyn analyzers — StyleCop.Analyzers for style/formatting (the .NET equivalent of Checkstyle) and Microsoft.CodeAnalysis.NetAnalyzers' CA rules for code-quality/design/reliability/security bug detection (the .NET equivalent of PMD + SpotBugs combined) — via a
csharp-pro
sickn33
Write modern C# code with advanced features like records, pattern matching, and async/await. Optimizes .NET applications, implements enterprise patterns, and ensures comprehensive testing. Use PROACTIVELY for C# refactoring, performance optimization, or complex .NET solutions.
performance-benchmark
dotnet
Generate and run ad hoc performance benchmarks to validate code changes. Use this when asked to benchmark, profile, or validate the performance impact of a code change in dotnet/runtime.
backend-testing
exceptionless
Backend testing with xUnit, Foundatio.Xunit, integration tests with AppWebHostFactory, FluentClient, ProxyTimeProvider for time manipulation, and test data builders. Keywords: xUnit, Fact, Theory, integration tests, AppWebHostFactory, FluentClient, ProxyTimeProvider, TimeProvider, Foundatio.Xunit, TestWithLoggingBase, test data builders
mutation-testing
SebastienDegodez
Use when running mutation testing, killing mutants, verifying test quality, checking mutation score, or analyzing survivors after the test baseline is green