Skip to main content
skill CX Codex

template-discovery — Claude Code skill: .NET templates

Finds suitable dotnet new templates from a project description, then checks parameters and expected output before files are created.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add dotnet/skills --skill template-discovery -a claude-code
Open on GitHub

What template-discovery does

This skill maps a project request to dotnet new templates, such as an API, console app, test project, or MAUI app. It suggests template short names and parameters for authentication, controllers, AOT, or a target .NET framework.

For exact options, constraints, and generated files, the agent can run dotnet new search, dotnet new list, dotnet new <template> --help, or a dry run. Run dotnet new calls one at a time because concurrent requests can conflict with the template engine's global mutex.

It does not create the project itself; use template-instantiation for that task. Templates including maui, winui3, aspire-starter, aspire, func, and orleans can require a workload or an extra template package. Check template availability before relying on a recommendation.

What it helps with

  • match a project brief to a dotnet new template
  • inspect template parameters and constraints
  • preview files produced by a template
  • find a package or workload for a missing template
  • map authentication needs to template options

Example prompts for the agent

  • Find a dotnet new template for a Web API with authentication.
  • Inspect the parameters for the webapi template before creating a project.
  • Which templates fit a MAUI application?

How to install template-discovery

1Skills CLI (Vercel)

npx skills add dotnet/skills --skill template-discovery -a claude-code

2Manually: put the files in place

~/.claude/skills/template-discovery/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/template-discovery/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about template-discovery

How do I install template-discovery in Claude Code?

Run npx skills add dotnet/skills --skill template-discovery -a claude-code, then run npx skills add dotnet/skills --skill template-discovery -a claude-code again. The skill file is at ~/.claude/skills/template-discovery/SKILL.md.

What does template-discovery do?

It turns a natural-language project request into dotnet new template suggestions, then helps inspect parameters and projected output before creating a project.

Why should dotnet new checks run sequentially?

The template engine uses a global mutex. Parallel --help or dry-run calls can produce a temporary error and empty output.

Source text

SKILL.md · MIT
---
name: template-discovery
description: >
  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-instantiation), authoring
  custom templates (use template-authoring), producing a detailed side-by-side comparison
  (use template-comparison), choosing cross-parameter defaults during creation
  (use template-smart-defaults), MSBuild or build issues (use dotnet-msbuild plugin),
  NuGet package management unrelated to template packages.
license: MIT
---

# Template 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-instantiation` skill
- User wants to author or validate a custom template — route to `template-authoring` skill
- User wants a detailed side-by-side comparison of templates — route to `template-comparison` skill
- User wants smart cross-parameter defaults during creation — route to `template-smart-defaults` skill
- User is troubleshooting build issues — route to `dotnet-msbuild` plugin

> **Recommendation requests: answer first, confirm second. Inspection requests: inspect
> first.** For a general "which template?" question, start from the Step 1 mappings so a
> transient CLI failure cannot leave the user without an answer. When the user explicitly
> asks what is installed, requests exact options/defaults, or asks for dry-run output, run
> the relevant `dotnet new` command before writing the final answer. Never end a turn on a
> `dotnet new` call or a "let me confirm..." teaser.

> **Inspection requests require inspection.** If the user asks for installed choices,
> exact parameters/defaults, compatibility constraints, or the exact dry-run file list,
> run the corresponding `dotnet new` command. Do not replace observed data with remembered
> flags. Report a flag only when the current template's `--help` output contains it.

## 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

> For recommendations, use Step 1 before Steps 2–4. For explicit inspection requests,
> execute the requested inspection first and use Step 1 only as a fallback.

### 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 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.

### Step 2: Search for templates

Use `dotnet new search` to find templates by keyword across both locally installed templates and NuGet.org:

```bash
dotnet new search blazor
```

Use `dotnet new list` to show only installed templates, with optional filters:

```bash
dotnet new list --language C# --type project
dotnet new list web
```

If the user explicitly asks you to check both installed templates and NuGet.org, run and report
both searches even when the SDK already includes a suitable template. Distinguish the built-in
choice from installable alternatives:

- For an SDK-shipped template, say **"no install needed — ships with the SDK"** and do not invent
  a package requirement.
- For each relevant NuGet result you recommend, copy the package ID from the actual search output
  and give `dotnet new install <package-id>`.
- If the NuGet search returns no credible alternative, say so explicitly; the local match still
  answers the request.

### 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:

```bash
dotnet new webapi --help
```

Copy the observed option names, choices, defaults, and compatibility notes into the answer.
For example, Windows Service support is not universally a worker-template flag. If the
installed `worker --help` does not expose one, say so and distinguish template creation from
post-creation hosting configuration; never invent `--windows` or `--use-windows-service`.

### 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:

```bash
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**, preserve every actual path from its output. For a long list, render those paths as a directory tree rather than a flat wall of full paths; do not omit or invent entries. Follow the tree with a one-line purpose for each key entry point (for example `Program.cs`, `App.razor`, and the project file). A file list without those explanations is incomplete.

If command execution is unavailable, do not stop at "run this yourself." Give the
representative tree and key-file explanations from the known template family, clearly labeled
as unconfirmed, so the user still receives a useful preview.

If the user says not to create files, every copy-pasteable creation command must include
`--dry-run`. A plain `dotnet new ...` command contradicts that request even when you did not
execute it yourself.

### Step 5: Present findings

**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:
- 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
- [ ] Exact-option claims came from this template's observed `--help` output
- [ ] Advice-only commands that must not create files include `--dry-run`

## Common Pitfalls

| Pitfall | Solution |
|---------|----------|
| Skipping an explicitly requested NuGet search because a local template exists | Run both `dotnet new list <keyword>` and `dotnet new search <keyword>`, then distinguish the built-in template from real installable alternatives. |
| Not searching NuGet when no local template 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. |
| Guessing a Windows Service or AOT flag from another SDK/template | Quote only options observed in `dotnet new <template> --help`; otherwise explain the post-creation path. |

## More Info

- [dotnet new templates](https://learn.microsoft.com/dotnet/core/tools/dotnet-new-sdk-templates) — built-in template reference
- [Template Engine Wiki](https://github.com/dotnet/templating/wiki) — template engine internals

© dotnet · MIT · dotnet/skills

Similar skills

All skills for Agent setup: memory, context, orchestration →

From the same set101

migrate-xunit-to-xunit-v3 Upgrades .NET test suites from xUnit.net v2 to xunit.v3 and fixes breaking changes. Handles CPM, executable output configuration, and runner setup. CX Codex +1 3,200installs android-tombstone-symbolication Turns native backtrace frames from an Android tombstone into function names, source files and line numbers for .NET apps. CX Codex +1 3,300installs migrate-static-to-wrapper Replaces static calls in C# with injected abstractions: DateTime.UtcNow becomes TimeProvider.GetUtcNow(), File.* becomes IFileSystem. Runs on one file, project, or namespace at a time. CX Codex +1 3,300installs template-instantiation Creates .NET projects using dotnet new while matching workspace CPM settings and target frameworks. Generates clean scaffolding without version mismatch. CX Codex +1 3,300installs configure-auth Adds authentication and authorization to a Blazor Web App based on its render mode. It prevents runtime crashes with Identity and interactive routing. CX Codex +1 3,100installs apple-crash-symbolication Turns raw addresses in an .ips crash log into function names, source files and line numbers for .NET. Useful when a MAUI or Mono app dies on iOS, tvOS, macOS or Mac Catalyst. CX Codex +1 3,100installs system-text-json-net11 A skill that tells the agent how to use three new System.Text.Json APIs in .NET 11 instead of writing the old workarounds. CX Codex +1 3,100installs maui-safe-area Safe area and edge-to-edge layout guidance for .NET 10+. Solves system bar overlaps and keyboard padding across Android, iOS, and Mac Catalyst. CX Codex +1 3,200installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor