| name | dotnet-analyzers |
| description | 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 |
| argument-hint | [diagnostic ID or 'verify' or 'list' or '--dashboard' or '--sarif'] |
| allowed-tools | Bash(dotnet format *), Bash(dotnet clean *), Bash(jq *), Bash(bash *generate-report*), Read, Grep, Glob |
.NET Analyzers & Code Format
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
| 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.
dotnet format style --verify-no-changes --severity warn --report "$TEMP/dotnet-format" <PROJECT_OR_SOLUTION> 2>/dev/null
dotnet format style --verify-no-changes --diagnostics IDE0005 --severity warn --report "$TEMP/dotnet-format" <PROJECT_OR_SOLUTION> 2>/dev/null
dotnet format analyzers --verify-no-changes --severity warn --report "$TEMP/dotnet-format" <PROJECT_OR_SOLUTION> 2>/dev/null
Process the JSON report with jq:
jq '[.[].FileChanges[].DiagnosticId] | group_by(.) | map({id: .[0], count: length}) | sort_by(-.count)' "$TEMP/dotnet-format/format-report.json"
jq '[.[].FilePath] | unique | .[]' "$TEMP/dotnet-format/format-report.json"
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):
bash ~/.claude/skills/dotnet-analyzers/scripts/generate-report.sh
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):
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 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:
- 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.json via jq into violation summaries and file-level details
- Injects data into
scripts/template.html, writes output HTML
--sarif mode:
- Cleans prior
_analyzer-diag.sarif files
- 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