csharp-scripts
Run file-based C# apps with the .NET CLI when the user explicitly wants C#/.NET code without creating a project. Use for C# language/API experiments, one-file…
Compares two or more dotnet new templates side by side to help users choose between them based on parameters, feature support, frameworks, and classifications. USE FOR: deciding between similar templates (webapi vs webapp, blazor vs blazorwasm, console vs worker), producing a
$ npx -y skills add dotnet/skills --skill template-comparison --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/template-comparisonContext preview
The summary Claude sees to decide when to auto-load this skill.
Compares two or more dotnet new templates side by side to help users choose between them based on parameters, feature support, frameworks, and classifications. USE FOR: deciding between similar templates (webapi vs webapp, blazor vs blazorwasm, console vs worker), producing a
name: template-comparison description: > Compares two or more dotnet new templates side by side to help users choose between them based on parameters, feature support, frameworks, and classifications. USE FOR: deciding between similar templates (webapi vs webapp, blazor vs blazorwasm, console vs worker), producing a side-by-side comparison of parameters and feature support, understanding how templates differ before creating a project. DO NOT USE FOR: creating a project from a template (use template-instantiation), authoring or validating custom templates (use template-authoring and template-validation), general single-template discovery (use template-discovery). license: MIT
This skill helps an agent compare 2+ `dotnet new` templates side by side so the user can pick the right one. It inspects each template's parameters and feature support and renders a comparison table.
| Input | Required | Description | |-------|----------|-------------| | Template short names | Yes | Two or more template short names to compare (e.g., `webapi`, `webapp`) | | Comparison focus | No | Optional aspect to emphasize (auth, AOT, frameworks, interactivity) |
**Evidence contract:** a side-by-side table is useful only when every option claim is grounded in the currently installed templates. Run each `--help` command sequentially, capture the same requested dimensions for each template, and label an unavailable option as `Not exposed` rather than guessing or borrowing a flag from another template.
**Decision contract:** optimize the comparison for the user's stated decision, not table size. Cover every requested dimension, omit unrelated option rows, give a scenario-specific reason, and include one safe `--dry-run` command for the recommended starting point when it would make the recommendation actionable.
Run `dotnet new <template> --help` for each template being compared to collect its parameters (names, types, defaults, choices) and supported frameworks:
dotnet new webapi --help dotnet new webapp --help
If a template is not installed, search for its provider and report the missing prerequisite. Install it only when the user asked you to modify the environment or approved the install.
> **Run `--help` calls sequentially.** The template engine uses a global mutex, so running > several `dotnet new <template> --help` commands concurrently can fail with a transient > "mutex"/"persistence" error and empty output. Inspect templates one at a time; if a call > fails, retry it once before moving on, and still produce the comparison from whatever > parameter knowledge you have rather than ending with no answer.
Produce a side-by-side table covering:
Use one row per requested decision dimension and cite the observed option name in the cell. Do not fill a requested row with general framework knowledge when it is specifically about what the template generates or exposes.
When the user asks about **generated dependencies** without allowing project creation, inspect the installed template package's source `.csproj` files. `--help` and `--dry-run` do not reveal package references. Do not create temporary projects merely to inspect them, and do not guess current package IDs or test-platform defaults.
Example shape:
| Aspect | `webapi` | `webapp` | |--------|----------|----------| | Auth (`--auth`) | None, Individual, SingleOrg, Windows | None, Individual, SingleOrg, ... | | AOT (`--aot` flag) | present if `dotnet new webapi --help` lists `--aot` | present if `dotnet new webapp --help` lists `--aot` | | Controllers (`--use-controllers`) | Yes | n/a | | Interactivity | n/a | n/a | | Frameworks | net8.0 / net9.0 / net10.0 | net8.0 / net9.0 / net10.0 | | Classifications | Web, WebAPI | Web, Razor Pages |
End with a decisive **Recommendation** line — never leave the user with just a table. Format:
> **Recommendation: `<template>`** — one sentence tying the choice to the user's stated scenario. (Pick the other if `<condition>`.)
Then link to `template-instantiation` to create it. A comparison that ends without naming a winner (or a clear "it depends on X") is incomplete — that indecision is what makes this skill tie with a plain answer.
Use these only for the recommendation, not as evidence of current parameter support. Still inspect with `--help` before filling the comparison table:
| Pair | Default pick | Because | |------|-------------|---------| | `webapi` vs `webapp` | **`webapi`** for a JSON/REST backend; `webapp` for server-rendered HTML/Razor Pages | webapi ships controllers/minimal APIs + OpenAPI, no UI | | `blazor` vs `blazorwasm` | **`blazorwasm`** when offline / no server is required; `blazor` (Web App) for flexible server + client interactivity | Standalone WASM runs fully client-side, works offline | | `worker` vs `console` | **`worker`** for long-lived/queue/background processing | Generic Host: DI, logging, config, graceful shutdown, `IHostedService` lifecycle | | `mvc` vs `webapp` | **`webapp`**
This repository contains the .NET team's curated set of core skills and custom agents for coding agents. For information about the Agent Skills standard, see agentskills.io.
Repo: dotnet/skills
Run file-based C# apps with the .NET CLI when the user explicitly wants C#/.NET code without creating a project. Use for C# language/API experiments, one-file…
Correctly call native (C/C++) libraries from .NET using P/Invoke and LibraryImport. Covers function signatures, string marshalling, memory lifetime,…
Set up NuGet trusted publishing (OIDC) on a GitHub Actions repo — replaces long-lived API keys with short-lived tokens. USE FOR: trusted publishing, NuGet…
Design, implement, optimize, and review SIMD code in .NET. USE FOR: vectorizing scalar loops with TensorPrimitives, Vector64/128/256/512, or platform hardware…
Guides technology selection and implementation of AI and ML features in .NET 8+ applications using ML.NET, Microsoft.Extensions.AI (MEAI), Microsoft Agent…
Configure OpenTelemetry distributed tracing, metrics, and logging in ASP.NET Core using the .NET OpenTelemetry SDK. Use when adding observability, setting up…