
Template Instantiation
FreeEfficiently scaffold .NET projects from templates.
Free · Opens the source repo
What Template Instantiation does
Template Instantiation is a skill designed for developers working within the .NET ecosystem who need to create new projects quickly and efficiently. By leveraging the dotnet new CLI commands, this skill automates the project creation process while ensuring that the parameters are validated and that the project aligns with existing workspace configurations. The skill intelligently adapts to the Central Package Management (CPM) setup and resolves the latest NuGet package versions, making it an essential tool for maintaining consistency across multiple projects.
The skill operates by first analyzing the workspace to determine if CPM is enabled and to identify the target frameworks used in existing projects. This ensures that newly created projects are compatible with their surroundings, avoiding potential conflicts. Users can create single or multi-project solutions, such as an API alongside tests and libraries, while adhering to best practices for package management and project structure.
Template Instantiation is particularly useful when you need to scaffold a new .NET application or service, install or manage template packages, or create projects that respect existing configurations like Directory.Packages.props. The skill provides a streamlined workflow that includes a preview of the project structure before creation, allowing for adjustments and ensuring that the final output meets user expectations.
However, this skill is not intended for template discovery or comparison, nor for authoring custom templates or modifying existing projects. For those tasks, users should refer to other specialized skills. By focusing on project creation and management, Template Instantiation helps developers save time and reduce errors in their workflow.
When to use it
Use this skill when you need to create a new .NET project or solution that aligns with existing project configurations and package management practices.
When not to use it
Avoid this skill if you're looking to discover templates, compare them, or modify existing projects; those tasks require different tools.
What you can build with it
Creating a New Web API
Use the skill to scaffold a new web API project by specifying the template and desired parameters.
Setting Up a Multi-Project Solution
Quickly create a solution that includes an API, library, and tests, ensuring all projects are aligned with existing configurations.
Managing Template Packages
Easily install or uninstall template packages as needed to keep your development environment up to date.
How to install Template Instantiation
View source1. Install with the skills CLI
npx skills add dotnet/skills/template-instantiation --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 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.
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.props - User 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-comparisonskill - User wants to author a custom template — route to
template-authoringskill - User 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.props - What target frameworks are in use? Check existing
.csprojfiles - Is 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-run
Step 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 Individual
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 — walk up the directory tree from the new project looking for a
Directory.Packages.props. - Strip inline versions — if found, for each
<PackageReference Include="X" Version="Y" />the template generated, remove theVersionattribute from the.csproj(leaving<PackageReference Include="X" />). - Centralize the version — add or merge a
<PackageVersion Include="X" Version="Y" />entry inDirectory.Packages.props. - 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.
- Prefer a tooling-driven flow: run
- Build — run
dotnet buildto 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.Tests
Step 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.0
Step 7: Post-creation verification
- Verify the project builds:
dotnet build - If added to a solution, verify
dotnet buildat the solution level - If 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. |
| 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
Frequently asked questions about Template Instantiation
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.
