Template Smart Defaults
This skill helps an agent fill in cross-parameter defaults when creating a dotnet new
project. The rules below are guidance heuristics that keep related parameters consistent —
they only fill gaps and never override a value the user set explicitly.
When to Use
- The user asks to create a project but leaves related parameters unspecified
- A parameter the user chose implies a sensible value for another parameter
- You need to explain why a particular default was selected
When Not to Use
- User wants to actually create the project — route to
template-instantiation - User wants to find or compare templates — route to
template-discoveryortemplate-comparison - User wants to author or validate a custom template — route to
template-authoringortemplate-validation
Inputs
| Input | Required | Description |
|---|---|---|
| Template short name | Yes | The template the project will be created from (e.g., webapi) |
| Parameters already chosen | Yes | The parameter values the user has explicitly set |
| Available choices | Recommended | Parameter names/choices from dotnet new <template> --help |
Workflow
- Gather the parameters the user has explicitly set.
- Apply each rule below only where the corresponding parameter is unset — never override an explicit user value.
- Log every applied default with a short rationale so the user can see and override it.
- Confirm the chosen parameter names and choices against
dotnet new <template> --helpbefore creating.
AOT at create time vs publish time.
--aotis adotnet newflag only on the templates that expose it (e.g.console,worker,grpc); it is not onwebapi/webapp. There is no--publish-aottemplate flag — publish-time native AOT is enabled with the MSBuild propertyPublishAot=true(viadotnet publishor in the.csproj), not throughdotnet new. Apply the framework rule only when the template actually offers--aot.
Rules
| Rule | Default applied | Rationale |
|---|---|---|
--aot is set (on templates that support it, e.g. console/worker/grpc) and --framework is unset |
Set --framework to the latest AOT-compatible framework the template offers |
Native AOT requires a recent, AOT-capable target framework; using the latest avoids build failures. |
--auth is anything other than None |
Do NOT pass --no-https |
Authentication flows (cookies, tokens, redirects) require HTTPS; disabling it breaks auth. |
--use-controllers is set |
Do NOT also pass a minimal-API flag | Controllers and minimal APIs are mutually exclusive program models; passing both is contradictory. |
| User set a value explicitly | Leave it unchanged | Smart defaults only fill gaps; explicit user intent always wins. |
Validation
- Each applied default was logged and explained to the user
- No parameter the user set explicitly was overridden
- Only unset parameters were filled
- The resulting parameter names/choices were confirmed against
dotnet new <template> --help
Common Pitfalls
| Pitfall | Solution |
|---|---|
| Treating heuristics as enforcement | These are guidance rules, not validation. Always confirm against dotnet new <template> --help choices, since parameter names vary by template. |
| Overriding an explicit user value | Apply a rule only when the target parameter is unset. |
| Assuming a flag name | The exact flag differs per template (--aot exists on console/worker/grpc but not webapi; controllers use --use-controllers) — verify with --help. |
| Picking a framework the template doesn't support | Use the latest framework that appears in the template's --framework choices, not an arbitrary newest version. |
More Info
- dotnet new — CLI reference
- Native AOT deployment — AOT framework requirements