.NET Analyzers & Code Format
SkillAI & modelsRun 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.
No other account needed.
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 formatdoes its own internal compilation — it does NOT depend on cached build output- CA*/SA* rules (analyzers) run during build if
EnableNETAnalyzersis true
Command Reference
| Task | Command |
|---|---|
| Fix specific style diagnostic | dotnet format style --diagnostics IDE0005 --severity warn |
| Fix specific analyzer diagnostic | dotnet format analyzers --diagnostics CA1305 --severity warn |
| Fix all style issues | dotnet format style --severity warn |
| Fix all analyzer issues | dotnet format analyzers --severity warn |
| Fix everything | dotnet format --severity warn |
| Verify only (CI) | dotnet format --verify-no-changes --severity warn |
| List violations without fixing | dotnet format style --verify-no-changes --severity warn -v diag |
| Scope to folder | dotnet format style --diagnostics IDE0005 --include src/MyProject/ |
Common Diagnostics
Style (IDE*) — use dotnet format style
| ID | Description |
|---|---|
| IDE0005 | Unnecessary using directive |
| IDE0055 | Fix formatting |
| IDE0090 | Simplify new expression |
| IDE0161 | File-scoped namespace |
| IDE0251 | Make member readonly |
Analyzers (CA*) — use dotnet format analyzers
| ID | Description |
|---|---|
| CA1305 | Specify IFormatProvider |
| CA1822 | Mark members as static |
| CA1859 | Use concrete types for performance |
| CA2000 | Dispose 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
| Aspect | default (dotnet format) | --sarif (Roslyn ErrorLog) |
|---|---|---|
| Speed | Fast (~10s) | Slow (full rebuild, ~1–2 min) |
| Coverage | Fixable 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 effects | None | Forces full rebuild; writes per-project _analyzer-diag.sarif |
When to use which
- Default (no flag) — quick triage of fixable issues; iterating on
dotnet formatfixes. --sarif— only when user explicitly asks for "everything", "full picture", "real warning count", or notices the default dashboard is undercounting compared todotnet build. Never run unprompted: it triggers a full rebuild.
What it does
Default mode:
- Runs
dotnet format style --verify-no-changes --severity warn --report <tmpdir> - Runs
dotnet format analyzers --verify-no-changes --severity warn --report <tmpdir> - Transforms
format-report.jsonviajqinto violation summaries and file-level details - Injects data into
scripts/template.html, writes output HTML
--sarif mode:
- Cleans prior
_analyzer-diag.sariffiles - Runs
dotnet build <project> -t:Rebuild -p:ErrorLog=_analyzer-diag.sarif%2cversion=2.1 - Globs all per-project SARIF, drops source-suppressed and
level∉{warning,error}results, dedupes by(ruleId, uri, line, col)(collapses multi-target duplicates) - 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