.NET Analyzers & Code Format

SkillAI & models

Run dotnet format to fix code style and analyzer diagnostics (IDE0005, CA*, SA*). Use when fixing unnecessary usings, code style violations, analyzer warnings, or verifying format compliance

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the .NET Analyzers & Code Format skill

What this skill tells your AI

The instructions your AI receives, as published by nikiforovall/claude-code-rules in plugins/handbook-dotnet/skills/dotnet-analyzers/SKILL.md and read by ahel’s review.

Fix code style and analyzer diagnostics using dotnet format.

Arguments: $ARGUMENTS

Key Concepts

  • dotnet format does its own internal compilation — it does NOT depend on cached build output
  • CA*/SA* rules (analyzers) run during build if EnableNETAnalyzers is true

Command Reference

TaskCommand
Fix specific style diagnosticdotnet format style --diagnostics IDE0005 --severity warn
Fix specific analyzer diagnosticdotnet format analyzers --diagnostics CA1305 --severity warn
Fix all style issuesdotnet format style --severity warn
Fix all analyzer issuesdotnet format analyzers --severity warn
Fix everythingdotnet format --severity warn
Verify only (CI)dotnet format --verify-no-changes --severity warn
List violations without fixingdotnet format style --verify-no-changes --severity warn -v diag
Scope to folderdotnet format style --diagnostics IDE0005 --include src/MyProject/

Common Diagnostics

Style (IDE*) — use dotnet format style

IDDescription
IDE0005Unnecessary using directive
IDE0055Fix formatting
IDE0090Simplify new expression
IDE0161File-scoped namespace
IDE0251Make member readonly

Analyzers (CA*) — use dotnet format analyzers

IDDescription
CA1305Specify IFormatProvider
CA1822Mark members as static
CA1859Use concrete types for performance
CA2000Dispose objects before losing scope

Workflow

IMPORTANT: Always start in verify/list mode. NEVER auto-fix without explicit user confirmation.

Step 1: List violations (default)

Always start by showing what would change — never fix automatically. Use --report "$TEMP/dotnet-format" to get structured JSON, then process with jq.

# List all style violations as JSON report
dotnet format style --verify-no-changes --severity warn --report "$TEMP/dotnet-format" <PROJECT_OR_SOLUTION> 2>/dev/null

# List specific diagnostic
dotnet format style --verify-no-changes --diagnostics IDE0005 --severity warn --report "$TEMP/dotnet-format" <PROJECT_OR_SOLUTION> 2>/dev/null

# List analyzer violations
dotnet format analyzers --verify-no-changes --severity warn --report "$TEMP/dotnet-format" <PROJECT_OR_SOLUTION> 2>/dev/null

Process the JSON report with jq:

# Summary: count violations per diagnostic ID
jq '[.[].FileChanges[].DiagnosticId] | group_by(.) | map({id: .[0], count: length}) | sort_by(-.count)' "$TEMP/dotnet-format/format-report.json"

# List affected files
jq '[.[].FilePath] | unique | .[]' "$TEMP/dotnet-format/format-report.json"

# Show details for a specific diagnostic
jq '[.[] | {file: .FilePath, changes: [.FileChanges[] | select(.DiagnosticId == "IDE0005")]} | select(.changes | length > 0)]' "$TEMP/dotnet-format/format-report.json"

Step 2: Report findings to user

Summarize the violations found using the JSON report and ask the user if they want to apply fixes.

Step 3: Apply fixes (only after user confirms)

dotnet format style --diagnostics IDE0005 --severity warn

Or for analyzer rules:

dotnet format analyzers --diagnostics CA1305 --severity warn

Step 4: Verify build still passes

dotnet build -p:WarningLevel=0 /clp:ErrorsOnly

HTML Dashboard Report (--dashboard)

Only generate when user explicitly passes --dashboard. Do NOT suggest or run this unprompted.

--sarif selects SARIF mode: the script runs its own dotnet build -t:Rebuild and harvests _analyzer-diag.sarif files. It is NOT a request to run dotnet build separately — passing the flag through to generate-report.sh is the entire job. Without --sarif, the script uses the faster dotnet format path. SARIF mode respects editorconfig severity (filters level=note/none and source-suppressed entries). See Mode comparison for when to pick which.

Generate an interactive HTML dashboard from live dotnet format output. No AI involved — purely deterministic.

Usage

Default mode uses dotnet format (fast, fixable diagnostics only):

# From repo root (defaults to current dir, outputs analyzer-dashboard.html)
bash ~/.claude/skills/dotnet-analyzers/scripts/generate-report.sh

# Explicit solution/project path and output
bash ~/.claude/skills/dotnet-analyzers/scripts/generate-report.sh ./MyProject.sln analyzer-dashboard-generated.html

SARIF mode runs dotnet build -t:Rebuild and harvests Roslyn ErrorLog SARIF (slower, comprehensive):

# Run ONLY when user explicitly asks for full coverage / "report everything"
bash ~/.claude/skills/dotnet-analyzers/scripts/generate-report.sh --sarif presales.slnx analyzer-dashboard-sarif.html

Flag parsing: --sarif and --dashboard may appear in any order; --dashboard is a no-op (dashboard is always emitted) but accepted so user invocations like --dashboard --sarif work as expected. Positional args are [project] [output.html].

When the user asks for both dashboards, generate them with distinct output names:

bash ~/.claude/skills/dotnet-analyzers/scripts/generate-report.sh presales.slnx analyzer-dashboard.html
bash ~/.claude/skills/dotnet-analyzers/scripts/generate-report.sh --sarif presales.slnx analyzer-dashboard-sarif.html

Mode comparison

Aspectdefault (dotnet format)--sarif (Roslyn ErrorLog)
SpeedFast (~10s)Slow (full rebuild, ~1–2 min)
CoverageFixable analyzers only (CA*, S*, IDE*, IDISP*)All Roslyn diagnostics: CS* + CA* + S* + IDE* + IDISP* + ASP* + MUD* + xUnit* etc.
CS* compiler warnings (CS8602, CS0618, …)❌ skipped✅ included
Editorconfig severity respected✅ (filters SARIF level=note/none and suppressions[])
NU* (NuGet vulnerabilities)❌ (restore phase, not in SARIF)
MSB* (MSBuild engine)❌ (build engine, not in SARIF)
Side effectsNoneForces full rebuild; writes per-project _analyzer-diag.sarif

When to use which

  • Default (no flag) — quick triage of fixable issues; iterating on dotnet format fixes.
  • --sarif — only when user explicitly asks for "everything", "full picture", "real warning count", or notices the default dashboard is undercounting compared to dotnet build. Never run unprompted: it triggers a full rebuild.

What it does

Default mode:

  1. Runs dotnet format style --verify-no-changes --severity warn --report <tmpdir>
  2. Runs dotnet format analyzers --verify-no-changes --severity warn --report <tmpdir>
  3. Transforms format-report.json via jq into violation summaries and file-level details
  4. Injects data into scripts/template.html, writes output HTML

--sarif mode:

  1. Cleans prior _analyzer-diag.sarif files
  2. Runs dotnet build <project> -t:Rebuild -p:ErrorLog=_analyzer-diag.sarif%2cversion=2.1
  3. Globs all per-project SARIF, drops source-suppressed and level∉{warning,error} results, dedupes by (ruleId, uri, line, col) (collapses multi-target duplicates)
  4. Routes IDE* into the style bucket, everything else into analyzer bucket, injects into template.html

Signals

GitHub stars
141
Forks
21
Last commit
Aug 2026
Advanced
Catalog kind
skill
Gateway key
dotnet-analyzers
Source
github.com/nikiforovall/claude-code-rules