Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Helps find, inspect, and compare (at a high level) .NET project templates. Resolves natural-language project descriptions to ranked template matches with pre-filled parameters. USE FOR: finding the right dotnet new template for a task, inspecting a template's parameters and constraints, understanding what a template produces before creating a project, resolving intent like "web API with auth" to concrete template + parameters. DO NOT USE FOR: actually creating projects (use template-instantiatio
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-09 | ✗→✓ | ▲ Improved | 76% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 81% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 125% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 146% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 86% | 0% |
This skill helps an agent find, inspect, and select the right dotnet new template for a given task using dotnet new CLI commands for search, listing, and parameter inspection.
template-instantiation skilltemplate-authoring skilltemplate-comparison skilltemplate-smart-defaults skilldotnet-msbuild plugin> Answer first, confirm second — required, in this order. The Step 1 intent → template > and keyword → parameter mappings are a complete answer on their own. Your first action is > to write a concrete template + parameter recommendation (with a ready-to-run dotnet new > command) from the mapping, before you run any dotnet new command. Only then use the CLI > to confirm exact names/choices and update the answer. Never make a dotnet new call your > final action — the engine's global mutex can make it fail with an empty "persistence"/"mutex" > result under load, leaving the user nothing. Always close with the written recommendation, and > never end a turn on a "let me confirm from the CLI…" teaser.
| Input | Required | Description | |-------|----------|-------------| | User intent or keywords | Yes | Natural-language description or keywords (e.g., "web API", "console app", "MAUI") | | Language preference | No | C#, F#, or VB — defaults to C# | | Framework preference | No | Target framework (e.g., net10.0, net9.0) |
> Do Step 1 and write the recommendation to the user before running Step 2–4 commands. > Steps 2–4 only confirm the answer; a dotnet new failure must never leave the turn empty.
Map the user's natural-language description to template short names and parameters using these mappings.
Intent → template short name(s):
| Intent / phrase | Template short name(s) | |---|---| | web api, web service, rest api, restful, api, minimal api | webapi | | web app, web application | webapp, blazorserver | | mvc | mvc | | razor, razor pages | webapp | | blazor, blazor web app | blazor | | blazor server | blazorserver | | blazor wasm, blazor webassembly | blazorwasm | | grpc | grpc | | signalr | webapi, webapp | | console, console app, command line, cli | console | | worker, background service, daemon, windows service | worker | | class library, library, lib, nuget package | classlib | | maui, mobile, cross-platform app, ios, android | maui | | desktop | maui, wpf, winforms | | wpf | wpf | | winforms, windows forms | winforms | | winui, winui3 | winui3 | | test, unit test | xunit, nunit, mstest | | xunit / nunit / mstest | xunit / nunit / mstest | | solution | sln | | aspire, .net aspire | aspire-starter, aspire | | azure functions, function app, serverless | func | | orleans | orleans | | razor component, web component | razorcomponent | | razor class library | razorclasslib | | gitignore / editorconfig / nuget config / global json | gitignore / editorconfig / nugetconfig / globaljson |
Keyword → parameter:
| Keyword / phrase | Parameter | Value | |---|---|---| | authentication, auth, individual auth, individual accounts | --auth | Individual | | windows auth | --auth | Windows | | azure ad, entra id | --auth | SingleOrg | | no auth, no authentication | --auth | None | | controllers, with controllers | --use-controllers | (flag) | | minimal api | (default) | — | | aot, native aot | --aot | (flag) | | docker, container | the template's Docker/container option | varies by template — confirm with --help (not all templates expose one) | | net8 / .net 8 / dotnet 8 | --framework | net8.0 | | net9 / .net 9 / dotnet 9 | --framework | net9.0 | | net10 / .net 10 / dotnet 10 | --framework | net10.0 |
These are starting guesses. Always confirm the real parameter names/choices with dotnet new <template> --help, because parameter names vary by template (e.g., --auth vs --Authentication).
Some mapped short names are not present in a default SDK install — templates like maui, winui3, aspire-starter/aspire, func, and orleans typically require a workload (dotnet workload install <id>) and/or an additional template package (dotnet new install <package>). If a mapped short name does not appear in dotnet new list, fall back to dotnet new list/dotnet new search to find the right template and the package/workload that provides it before recommending it.
> Resilience — always answer, even if the CLI fails. The intent mapping above is a usable answer on its own. Run dotnet new commands sequentially, one at a time — the template engine uses a global mutex, so firing several dotnet new <template> --help/--dry-run calls concurrently can produce a transient "mutex"/"persistence" error and empty output. If a command fails, retry it once; if it still fails, fall back to this intent/parameter mapping and give the user a concrete recommendation, noting that the exact parameter names/choices could not be CLI-confirmed. Never end the turn with no answer because a CLI call errored.
Use dotnet new search to find templates by keyword across both locally installed templates and NuGet.org:
bashdotnet new search blazor
Use dotnet new list to show only installed templates, with optional filters:
bashdotnet new list --language C# --type project dotnet new list web
Use dotnet new <template> --help to get full parameter details for a specific template — parameter names, types, defaults, and allowed values:
bashdotnet new webapi --help
Use dotnet new <template> --dry-run to show what files and directories a template would create without writing anything to disk:
bashdotnet new webapi --name MyApi --auth Individual --dry-run
If the dry-run fails (transient "mutex"/"persistence" error), retry once; if it still fails, give a representative structure (template family and typical file kinds) and note it isn't CLI-confirmed. Do not invent specific values, choices, or file paths. When the dry-run succeeds, present the actual file list from its output faithfully — don't summarize, regroup, or invent files — and add a one-line purpose for the key entry points (e.g. Program.cs, App.razor).
Lead with the answer as a ready-to-run command, then justify it. Required shape:
> Use <template> — one-line why. > bash > dotnet new <template> --name <Name> [--key params] >
Then add supporting detail:
--auth: None | Individual | SingleOrg | Windows)dotnet new install <id>), or say "no install needed — ships with the SDK" for a built-in templateAn answer without a concrete, copy-pasteable command is what makes this skill tie with a plain reply — always give the command to run next.
| Pitfall | Solution | |---------|----------| | Not searching NuGet for templates | If dotnet new list shows no matches, use dotnet new search <keyword> to find installable templates on NuGet.org. | | Not checking template constraints | Some templates require specific SDKs or workloads. Use dotnet new <template> --help to surface constraints before recommending. | | Recommending a template without previewing output | Always use dotnet new <template> --dry-run to confirm the template produces what the user expects. | | A dotnet new call fails with a "mutex"/"persistence" error and you return nothing | These are transient (often from concurrent invocations). Run dotnet new calls sequentially, retry once, then fall back to the Step 1 intent mapping and still give the user a concrete answer. |
Other measured skills in the registry, with their headline benchmark lift.