Template Instantiation
.NET (Microsoft)OfficialPublished by .NET (Microsoft)
- Skill
- Workflow
- Software development
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill streamlines the .NET project creation process by leveraging the dotnet new CLI. It goes beyond simple scaffolding by performing workspace analysis to ensure new projects align with existing conventions, such as Central Package Management (CPM) and target framework consistency. The skill handles the end-to-end lifecycle of project creation, including parameter validation, multi-project solution composition, and post-creation verification to ensure the generated code is build-ready.
What it does
- Scaffolds new .NET projects using standard templates
- Detects and adapts to existing Central Package Management (CPM) configurations
- Ensures target framework consistency with neighboring projects
- Manages multi-project solution composition and references
- Installs and manages external template packages
- Verifies project integrity through automated build checks
When to use it
- When creating a new .NET application, service, or library
- When scaffolding complex solutions involving multiple related projects
- When working in a repository that uses Central Package Management
- When you need to install or update specific .NET template packages
Advantages
- Reduces manual configuration errors by aligning with workspace standards
- Prevents dependency conflicts in projects using Central Package Management
- Ensures consistent target framework usage across a solution
- Automates the wiring of multi-project dependencies and solution files
Usage examples
- “Create a new web API project named MyService in the current directory.”
- The agent inspects the workspace, identifies the appropriate template, creates the project with the correct framework, and verifies it builds.
- “Scaffold a solution with a web API and a corresponding xUnit test project.”
- The agent creates both projects, adds the test project as a reference to the API, and includes both in a solution file.
- “Create a new worker service that uses native AOT.”
- The agent identifies the worker template, applies the --aot parameter, and ensures the project is configured correctly.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/dotnet/template-instantiation/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip template-instantiation.zip -d .agents/skills
Documentation by .NET (Microsoft)
Template Instantiation
This skill creates .NET projects from templates using dotnet new CLI commands, with guidance for parameter validation, Central Package Management adaptation, and multi-project composition.
Match the workspace, then stop. The highest-value move is aligning the new project with the repo it lands in: detect CPM (
Directory.Packages.props) and the target framework used by neighbouring.csprojfiles, and mirror both. Treat the discovered target framework as an explicit choice — pass it as--frameworksotemplate-smart-defaultswon't override it; deviate only when it's incompatible with a requested feature (then flag the conflict). Do this in as few steps as possible — a--dry-run, the create, and onedotnet buildto confirm is usually enough. Extra exploratory turns add cost without improving the result.
Perform the requested creation. Do not return only a plan or statement of intent. Run state-dependent commands sequentially: inspect, dry-run, create, then build. Never launch create and build in parallel; a build-before-create race produces a false failure.
| Situation | Required action |
|---|---|
| Simple standalone project | inspect only the requested template, create at the exact path, then build |
| Existing neighboring projects | read their TFMs first and pass the matching supported --framework explicitly |
Directory.Packages.props found | create with --no-restore when supported, normalize generated package references, then restore/build once |
| Multi-project solution | create each project at its final path, add references, add all projects to the solution, then build the solution once |
User explicitly requests .sln | inspect dotnet new sln --help; pass --format sln when supported, otherwise use the older SDK's default .sln output |
Do not predict the generated target framework. If the user and workspace do not supply one,
inspect dotnet new <template> --help, choose a supported value (normally its documented
default), pass it explicitly, then confirm the generated .csproj. Never announce an
intermediate framework guess that was not grounded in the template's current choices.
When to Use
User asks to create a new .NET project, app, or service
User needs a solution with multiple projects (API + tests + library)
User wants to create a project that respects existing
Directory.Packages.propsUser needs to install or manage template packages
When Not to Use
User is searching for templates — route to
template-discoveryskill; for a detailed side-by-side comparison — route totemplate-comparisonskillUser wants to author a custom template — route to
template-authoringskillUser wants to add packages to an existing project — use
dotnet add packagedirectly
Inputs
| Input | Required | Description |
|---|---|---|
| Template name or intent | Yes | Template short name (e.g., webapi) or natural-language description |
| Project name | Yes | Name for the created project |
| Output path | Recommended | Directory where the project should be created |
| Parameters | No | Template-specific parameters (e.g., --framework, --auth, --aot) |
Workflow
Step 1: Resolve template and parameters
If the user provides a natural-language description, map it to a template short name (see the keyword table in the template-discovery skill). If they provide a template name, proceed directly.
Use dotnet new <template> --help to review available parameters, defaults, and types for any parameters the user did not specify.
When a parameter the user chose implies a value for an unset related parameter, invoke the template-smart-defaults skill to resolve the gap before assembling the command line — e.g., native AOT implies a recent AOT-capable target framework, a non-None --auth choice means HTTPS must stay enabled (don't add --no-https), and --use-controllers excludes the minimal-API option. Smart defaults only fill gaps; never let them override a value the user set explicitly. The workspace framework discovered in Step 2 counts as such an explicit value — pass it to smart-defaults as the chosen --framework so it isn't treated as an unset gap; deviate only if it is incompatible with the requested feature/template (then surface the conflict to the user).
Step 2: Analyze the workspace
Check the existing solution structure before creating:
Is Central Package Management (CPM) enabled? Look for
Directory.Packages.propsWhat target frameworks are in use? Check existing
.csprojfilesIs there a
global.jsonpinning the SDK?
This ensures the new project is consistent with the workspace.
Step 3: Preview the creation
Use dotnet new <template> --dry-run to show the user what files would be created. Confirm before proceeding.
dotnet new webapi --name MyApi --framework net10.0 --dry-runStep 4: Create the project
Use dotnet new with the template name and all parameters:
dotnet new webapi --name MyApi --output ./src/MyApi --framework net10.0 --auth IndividualBefore running it, emit one compact decision line:
Creating <template> at <path>; framework=<value> (<user|workspace|template>); CPM=<on|off>.
This makes workspace adaptations explicit without adding a long report.
Common parameter combinations
| Template | Parameters | Example |
|---|---|---|
webapi | --auth (None, Individual, SingleOrg, Windows), --aot (native AOT) | dotnet new webapi -n MyApi --auth Individual --aot |
webapi | --use-controllers (use controllers vs minimal APIs) | dotnet new webapi -n MyApi --use-controllers |
blazor | --interactivity (None, Server, WebAssembly, Auto), --auth | dotnet new blazor -n MyApp --interactivity Server |
grpc | --aot (native AOT) | dotnet new grpc -n MyService --aot |
worker | --aot (native AOT) | dotnet new worker -n MyWorker --aot |
Note: Use dotnet new <template> --help to see all available parameters for any template.
After creation, adapt the project to Central Package Management and refresh stale versions:
Detect CPM before creation — walk up from the destination looking for
Directory.Packages.props.Avoid a doomed automatic restore — when CPM is active and the template exposes
--no-restore, pass it during creation so package centralization happens first.Strip inline versions — for each generated
<PackageReference Include="X" Version="Y" />, remove theVersionattribute (leaving<PackageReference Include="X" />).Centralize the version — add or merge a
<PackageVersion Include="X" Version="Y" />entry inDirectory.Packages.props; preserve unrelated existing entries.Optionally refresh stale template-default versions — templates often hardcode old versions. Keep the template's versions by default (safest for reproducibility and controlled upgrades). Only refresh when the user asks, and when you do:
Prefer a tooling-driven flow: run
dotnet list package --outdatedand confirm the proposed bumps with the user before changing anything.Constrain upgrades to the same major (or major/minor) version unless the user explicitly opts into larger upgrades, since cross-major bumps can introduce breaking changes.
When checking the latest stable version of a package conceptually, the NuGet V3 flat-container
index.jsonendpoint for that package ID lists published versions; never select a prerelease unless requested.
Build — run
dotnet buildonce to restore and confirm the centralized/refreshed versions resolve.
Step 5: Multi-project composition (optional)
For complex structures, create each project sequentially and wire them together:
dotnet new webapi --name MyApi --output ./src/MyApi
dotnet new xunit --name MyApi.Tests --output ./tests/MyApi.Tests
dotnet add ./tests/MyApi.Tests reference ./src/MyApi
dotnet sln add ./src/MyApi ./tests/MyApi.TestsStep 6: Template package management
Install or uninstall template packages:
dotnet new install Microsoft.DotNet.Web.ProjectTemplates.10.0
dotnet new uninstall Microsoft.DotNet.Web.ProjectTemplates.10.0Step 7: Post-creation verification
Verify the project builds:
dotnet buildFor a runnable template such as
console, run the generated app when the request is simple and no external service is required; report the observed output rather than only build success.If added to a solution, verify
dotnet buildat the solution levelIf CPM was adapted, verify
Directory.Packages.propshas the new entries
Validation
[ ] Project was created successfully with the expected files
[ ] Project builds cleanly with
dotnet build[ ] If CPM is active,
.csprojhas no version attributes andDirectory.Packages.propshas matching entries[ ] Package versions in the project are current (not stale template defaults)
[ ] If multi-project, all projects build and reference each other correctly
Common Pitfalls
| Pitfall | Solution |
|---|---|
| Not checking for CPM before creating a project | If Directory.Packages.props exists, dotnet new creates projects with inline versions that conflict. After creation, move versions to Directory.Packages.props and remove them from .csproj. |
| Letting template restore fail before adapting CPM | Detect CPM first and use the template's --no-restore option when available; centralize versions before the first restore/build. |
| Creating projects without specifying the framework | Always specify --framework when the template supports multiple TFMs to avoid defaulting to an older version. |
| Not adding the project to the solution | After creation, run dotnet sln add to include the project in the solution. |
| Not verifying the project builds | Always run dotnet build after creation to catch missing dependencies or parameter issues early. |
More Info
Central Package Management — CPM documentation
dotnet new — CLI reference
Files
- ATTRIBUTION.mdAdded by AutoGineer866 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md11.1 KiB
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- .NET (Microsoft)
- Publisher
- .NET (Microsoft) (Official)
- Source
- dotnet/skills · plugins/dotnet-template-engine/skills/template-instantiation · commit 96c3d68
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by .NET (Microsoft).
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download template-instantiation.zip