
Template Discovery
FreeFind and inspect .NET project templates efficiently.
Free · Opens the source repo
What Template Discovery does
Template Discovery is a skill designed to assist developers in identifying, inspecting, and selecting the appropriate .NET project templates using the dotnet new command line interface. By resolving natural language descriptions, it provides ranked template matches along with pre-filled parameters, allowing users to understand what each template produces before initiating a project. This skill is particularly useful for developers who need to quickly assess available templates based on specific project requirements, such as creating a web API or a console application.
The skill works by mapping user queries to template names and associated parameters. For instance, if a user describes their need for a 'web API with authentication', Template Discovery will identify the relevant template and suggest the necessary command to create it. This streamlined approach not only saves time but also reduces the cognitive load of remembering template names and their specific configurations.
Template Discovery is ideal for both novice and experienced developers looking to leverage the power of .NET templates without the hassle of manual searching. It can help clarify the capabilities and constraints of various templates, making it easier to choose the right one for a given task. Additionally, it provides insights into what files and project structures a template will generate, ensuring that users can make informed decisions before committing to a particular template.
However, it's important to note that this skill is not intended for project creation or custom template authoring. For those tasks, users should utilize the template-instantiation or template-authoring skills, respectively. Template Discovery is focused on the discovery and inspection phase, making it a valuable tool for developers in the early stages of project setup.
When to use it
Use Template Discovery when you need to find templates for a specific .NET project type or when you want to inspect the parameters of a template before creating a project.
When not to use it
Do not use this skill for creating projects or authoring custom templates; it is specifically for template discovery and inspection.
What you can build with it
Finding a Web API Template
A developer asks for a template to create a web API with authentication. Template Discovery maps this request to the `webapi` template and suggests the necessary command.
Inspecting Template Parameters
A user wants to know what parameters are available for a console application template. The skill retrieves and explains the relevant parameters before project creation.
Comparing Available Templates
A designer describes a need for a web application and wants to compare options. Template Discovery provides a list of suitable templates and their features.
How to install Template Discovery
View source1. Install with the skills CLI
npx skills add dotnet/skills/template-discovery --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by dotnetTemplate Discovery
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.
When to Use
- User asks "What templates are available for X?"
- User describes a project in natural language ("I need a web API with authentication")
- User wants to compare templates or understand parameters before creating a project
- User needs to know what a template produces (files, structure) before committing
When Not to Use
- User wants to create a project — route to
template-instantiationskill - User wants to author or validate a custom template — route to
template-authoringskill - User wants a detailed side-by-side comparison of templates — route to
template-comparisonskill - User wants smart cross-parameter defaults during creation — route to
template-smart-defaultsskill - User is troubleshooting build issues — route to
dotnet-msbuildplugin
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 newcommand) from the mapping, before you run anydotnet newcommand. Only then use the CLI to confirm exact names/choices and update the answer. Never make adotnet newcall 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.
Inputs
| 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) |
Workflow
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 newfailure must never leave the turn empty.
Step 1: Resolve intent to template candidates
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 newcommands sequentially, one at a time — the template engine uses a global mutex, so firing severaldotnet new <template> --help/--dry-runcalls 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.
Step 2: Search for templates
Use dotnet new search to find templates by keyword across both locally installed templates and NuGet.org:
dotnet new search blazor
Use dotnet new list to show only installed templates, with optional filters:
dotnet new list --language C# --type project
dotnet new list web
Step 3: Inspect template details
Use dotnet new <template> --help to get full parameter details for a specific template — parameter names, types, defaults, and allowed values:
dotnet new webapi --help
Step 4: Preview output
Use dotnet new <template> --dry-run to show what files and directories a template would create without writing anything to disk:
dotnet 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).
Step 5: Present findings
Lead with the answer as a ready-to-run command, then justify it. Required shape:
Use
<template>— one-line why.dotnet new <template> --name <Name> [--key params]
Then add supporting detail:
- Key parameters and recommended values (with the choices, e.g.
--auth: None | Individual | SingleOrg | Windows) - What to expect (files created, project structure)
- Any prerequisites — name the exact package to install (
dotnet new install <id>), or say "no install needed — ships with the SDK" for a built-in template
An answer without a concrete, copy-pasteable command is what makes this skill tie with a plain reply — always give the command to run next.
Validation
- At least one template match was found for the user's intent
- Template parameters are explained with types and defaults
- User understands what the template produces before proceeding to creation
Common Pitfalls
| 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. |
More Info
- dotnet new templates — built-in template reference
- Template Engine Wiki — template engine internals
Frequently asked questions about Template Discovery
Similar skills
Rhino 3D Scripting
Streamline your Rhinoceros 3D scripting tasks.
MVVM Toolkit
Streamline ViewModel development with source generators.
FreeCAD Scripts
Generate Python scripts for FreeCAD automation and modeling.
Azure Architecture Builder
Design and deploy Azure infrastructure using natural language.
Command Development
Streamline your command creation for Claude Code.
Create Cowork Plugin
Easily build and package plugins through guided sessions.
