From dotnet-inspect
Inspects .NET packages, libraries, assemblies, APIs, dependencies, SourceLink, and API diffs. Use to find evidence for API usage, overloads, source locations, and breaking changes.
How this skill is triggered — by the user, by Claude, or both
Slash command
/dotnet-inspect:dotnet-inspectThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Use dotnet-inspect when you need evidence instead of guesses for .NET packages, platform libraries, local assemblies, APIs, dependencies, SourceLink/source, or version-to-version API changes.
Use dotnet-inspect when you need evidence instead of guesses for .NET packages, platform libraries, local assemblies, APIs, dependencies, SourceLink/source, or version-to-version API changes.
dnx dotnet-inspect -y -- <command>
| Goal | Command |
|---|---|
| Find an API | find Pattern, then reuse the reported --platform, --package, or --library. |
| Inspect overloads | member Type --platform Lib -m Name -S "Member Index" |
| Select an overload | member Type --platform Lib Name:1 or Name~digest |
| Source/implementation | type Type -S "Source Files"; member Type -m Name -S "Source Locations"; member Type Name:1 -S @Source; library/package Foo -S "Source Files" |
| Inspect a type | type Type --package Foo; add --all for non-public/hidden/extra members. |
| Compare APIs | diff --package [email protected] --breaking; use --additive for new APIs. |
| Inspect packages | package Foo -S Signals, -S "Library Files", --library |
| Inspect libraries | library Foo or library path/to.dll; add --platform, --package, -S Signals. |
| Relationships | depends Type, extensions Type, implements Interface; add package/platform/project scope. |
Member lookup is a common flow. Use find when scope is unknown, then inspect the type, then use Member Index to find the overload to select. The bare router also accepts source-qualified member syntax when the source is obvious.
dnx dotnet-inspect -y -- find JsonSerializer
dnx dotnet-inspect -y -- type JsonSerializer --platform System.Text.Json
dnx dotnet-inspect -y -- member JsonSerializer --platform System.Text.Json -m Serialize -S "Member Index"
dnx dotnet-inspect -y -- System.Text.Json.JsonSerializer.Serialize:1 -S Signature
dnx dotnet-inspect -y -- member JsonSerializer --platform System.Text.Json Serialize:1 -S Signature
dnx dotnet-inspect -y -- member JsonSerializer --platform System.Text.Json Serialize~1dc14dd1fb -S @Source
dnx dotnet-inspect -y -- member JsonSerializer --platform System.Text.Json Serialize:1 -S Calls
dnx dotnet-inspect -y -- member string IndexOf:7 -S Callers --caller-package [email protected] --tfm net9.0
Selector syntax: first run member Type --platform Lib -m Name -S "Member Index" (or the package/library source find reported). Then pass either Name:N (1-based, for the current index) or Name~digest (stable, from the Stable column) as the positional member selector. Canonical Signature is the printed digest input. Prefer Name~digest in notes, scripts, issues, and handoffs; use Name:N for immediate drill-in. --show-index is an alias for -S "Member Index".
A selected overload defaults to Signature; bare -S adds Decompiled Source. Use -S "Source Locations" for member file/line URLs without fetching source bodies. Use -S @Source for source and IL evidence: Decompiled Source (raised C#), Annotated Source (C# with hidden-fact comments and interleaved IL), Original Source, and IL. Use Annotated Source or IL when exact opcodes, offsets, branches, tokens, or calls matter.
Use -S Calls for direct call-site evidence, -S Callers for reverse edges (widen with --bin, --project, or --caller-package), -S "Call Graph" for a bounded outbound tree, -S "Caller Graph" for a bounded reverse tree that shows which entry points or callers reach the selected method (its root is labelled target, far entry points entrypoint, and loop call marks a caller that invokes toward the target inside a loop), -S "Unsafe Operations" for unsafe evidence, and -S Facts --tsv for structured hidden facts.
For perf or correctness triage, rank by call-graph leverage (direct callers, root reach, fanout, depth, loop calls): library MyLib.dll -S "Top Leverage" ranks across the whole assembly, or type T --library MyLib.dll --all -S "Top Leverage" ranks one type's members. The Root Reach column counts the distinct roots (entry points / public API with no in-assembly caller) that transitively reach a member, so a low-fanin helper sitting under many roots still shows wide inbound scale. Both library- and type-scope rows carry a copyable Stable selector (Name~digest), a Visibility column, and a Selector (Name:N), and mark compiler-Generated rows; copy the Stable selector to drill straight in. Then drill the top candidates with -S "Call Graph,Facts" (outbound cost) and -S "Caller Graph" (inbound reach). On either graph, project the kind of cost per node with --fields "Fanout,Fanin,Depth,Loop,Alloc,Copy,Unsafe,Reflection,Throw,Exceptions,Catch,Finally,EvidenceIL" (signals are opt-in and annotate only the nodes that carry them; for exception-risk triage read Throw/Catch/Finally over Caller Graph). Add --tsv or -n to trim to the top rows. The ranking surfaces non-public helpers, so add --all when drilling a private/internal candidate (otherwise member selection can't resolve it). -S "Optimization Opportunities" shares the same Root Reach column and sorts by it, so leveraged methods that also carry an actionable rewrite shape (small non-escaping array, temporary byte-array copy, capturing delegate, stateless instance method) surface first — the high-value intersection.
Default output is Markdown. Use --table for compact aligned rows, --tsv for stable snake_case headers with no embedded tabs/newlines, --jsonl for one JSON object per row, --json for structured documents, --bare for one undecorated payload or URL list, --count for a bare row count, and --mermaid for graph-shaped output.
Use -D to discover sections/columns, -S Section to select sections by name or wildcard, and --columns/--fields to project values. Discover first instead of guessing names.
dnx dotnet-inspect -y -- member JsonSerializer --platform System.Text.Json -D --tsv
dnx dotnet-inspect -y -- member JsonSerializer --platform System.Text.Json -m Serialize -D "Member Index" --tsv
dnx dotnet-inspect -y -- member JsonSerializer --platform System.Text.Json -m Serialize -S "Member Index" --columns "Selector;Stable;Canonical Signature" --tsv
@ names a category: -S @All, -S @Source, -S @Audit, -S @Integrations, -S @Switches. Row formats (--tsv/--jsonl/--table) work best with one concrete section, not a category.
Prefer built-in limits to shell pipes. -n N and numeric shorthand like -6 cap output lines; --tail N shows the end; --rows makes -n cap Markdown table data rows; --count counts rows in one selected table. Command-specific caps: -t N for type/find rows, -m N for members, and --versions N for package versions.
For agent-readable package docs, use --path @readme --content; the resolver exposes the best README content for agents, preferring AGENTS.md over README.md when present. For multi-package doc surveys, pass multiple package IDs with --path @readme --jsonl for metadata rows or --path @readme --content --jsonl for content rows. Add --frontmatter/--yaml-header or --body with --content; keep --readme for single-package reads.
dnx dotnet-inspect -y -- package Microsoft.Extensions.AI -S Signals
dnx dotnet-inspect -y -- package Microsoft.Extensions.AI --path @readme --content --frontmatter
dnx dotnet-inspect -y -- package Microsoft.Extensions.AI Microsoft.Extensions.AI.OpenAI --path @readme --content --jsonl
dnx dotnet-inspect -y -- project ./App --agents-index --jsonl
dnx dotnet-inspect -y -- package Microsoft.Extensions.AI --library -S @Integrations
dnx dotnet-inspect -y -- library System.Text.Json -S "Source Files"
Use package Foo --library for the primary DLL when unambiguous; add a DLL name or use --all-libraries for multi-library packages. Use -S "Source Files" for SourceLink type-to-URL rows. Signals reports observations, not trust: SourceLink, determinism, trim/AOT, memory-safety metadata, unsafe/PInvoke, references, TFMs, manifest/docs, license, vulnerabilities, package age, and dependency risk.
Use diff --package [email protected] --breaking for migration work, --additive for release-note work, and -t Type to narrow. For platform APIs, compare individual libraries: diff --platform [email protected] --additive.
For unsafe audits, start with library MyLib.dll -S @Audit, then drill into member Type Method:1 --library MyLib.dll -S "Unsafe Operations,IL".
Use --bare to extract one undecorated payload: type Name -S "Decompiled Source" --bare, member Type Method:1 -S "Source Locations" --bare, or package Foo --readme --bare. SourceLink URLs default to raw/fetchable form; add --blob for browser URLs. Use library Foo --il-offset 0x06000001+0x5 for crash diagnostics with MethodDef token plus IL offset. If decompiled output looks wrong, capture Decompiled Source, Annotated Source, Original Source, and IL; maintainers diagnose pipeline state with DecompilerHarness.
type string, type 'List<T>'.member 'Dictionary<TKey,TValue>', -S "Async*".find, reuse the package/library it reports; add --library for multi-library packages.type uses -t for type filters; member uses -m for member filters.--preview for prerelease APIs.--trace-mermaid and include stderr in bug reports.npx claudepluginhub richlander/dotnet-inspectInspects .NET packages, assemblies, APIs, dependencies, and API diffs. Reports evidence for types, members, SourceLink, and breaking changes.
Decompiles .NET assemblies with ILSpy via dnx to inspect internal API implementations, NuGet packages, framework code, and binaries. Use for understanding compiled .NET behavior.
Provides .NET ecosystem guidance: C#/F# language features, project structure, NuGet package selection, and architecture decisions across ASP.NET Core, Blazor, EF Core, and cloud/desktop/mobile targets.