Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Guides creation and validation of custom dotnet new templates from existing projects. Generates a .template.config/template.json that preserves the source project's conventions. USE FOR: creating a reusable dotnet new template from an existing project, bootstrapping .template.config/template.json with correct identity, shortName, parameters, and post-actions, adding parameters or conditional content to a template you are authoring, validating the template.json you are authoring before publishing
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 444% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 5% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 50% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 57% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 65% | 0% |
This skill helps an agent create and validate custom dotnet new templates. It guides bootstrapping templates from existing projects and validates template.json files for authoring issues before publishing.
.template.config/template.json from scratchtemplate-discovery or template-instantiationdotnet-msbuild plugin| Input | Required | Description | |-------|----------|-------------| | Source project path | For creation | Path to the .csproj to use as template source | | template.json path | For validation | Path to an existing template.json to validate | | Template name | For creation | Human-readable name for the template | | Short name | Recommended | Short name for dotnet new <shortname> usage |
Analyze the source .csproj and create a .template.config/template.json:
.template.config directory next to the projecttemplate.json with identity (reverse-DNS), name, shortName, sourceName (project name for replacement), classifications, and tagsdotnet new templates frequently get these wrong, so verify each is carried over from the original .csproj:Microsoft.NET.Sdk, Microsoft.NET.Sdk.Web, Microsoft.NET.Sdk.Worker, etc.PrivateAssets, IncludeAssets, ExcludeAssetsOutputType and other key properties — TreatWarningsAsErrors, Nullable, LangVersionVersion attributes when a Directory.Packages.props is presentDirectory.Build.props conventionsglobal.json SDK pinMinimal example:
json{ "$schema": "http://json.schemastore.org/template", "author": "MyOrg", "classifications": ["Library"], "identity": "MyOrg.Templates.MyLib", "name": "My Library Template", "shortName": "mylib", "sourceName": "MyLib", "tags": { "language": "C#", "type": "project" } }
Required output — do not stop at a minimal stub. Write the complete .template.config/template.json for the actual source project, then emit a short conventions-preserved confirmation so the user can see nothing was silently dropped. This carry-over is the whole value of the skill; a generic dotnet new template that loses these is why authoring ties with a hand-written stub.
| Source .csproj setting | Carried over? | How | |--------------------------|---------------|-----| | SDK (Microsoft.NET.Sdk.*) | ✅ | template content .csproj uses same SDK | | TreatWarningsAsErrors / Nullable / LangVersion | ✅ | preserved verbatim in template .csproj | | PackageReference PrivateAssets / IncludeAssets / ExcludeAssets | ✅ | metadata kept on each reference | | CPM (Directory.Packages.props present) | ✅ | no inline Version attributes emitted |
Mark any row you intentionally omitted as ⚠️ with a reason — never leave it implicit.
Validate the generated template.json using the template-validation skill (it owns the full rule set — required fields, identity format, reserved shortName conflicts, parameter datatypes, post-actions, constraints, and tags).
Quick summary of what gets checked:
identity, name, and shortName must be present.dotnet new subcommands. Read the authoritative set from the Commands: section of dotnet new --help for the installed SDK and do not hardcode it (it can change between versions); illustrative examples from current SDKs are install, uninstall, update, list, search, details, create. A conflict happens because dotnet new <name> would be parsed as the subcommand of the same name. Top-level dotnet verbs like build, run, test, and publish do NOT conflict. Run dotnet new list to confirm the name is not already taken.Based on validation results and user requirements:
#if preprocessor directives for optional featuresbashdotnet new install ./path/to/template/root dotnet new mylib --name TestProject --dry-run dotnet new mylib --name TestProject --output ./test-output dotnet build ./test-output/TestProject
template.json passes manual validation with zero errorsdotnet build| Pitfall | Solution | |---------|----------| | Identity format issues | Use reverse-DNS format (e.g., MyOrg.Templates.WebApi). Avoid spaces or special characters. | | ShortName conflicts with CLI commands | Avoid names that match a dotnet new subcommand; read the live set from dotnet new --help and don't hardcode it (illustrative examples: install, uninstall, update, list, search, details, create). Top-level verbs like build/run/test/publish are fine. Run dotnet new list to see if the name is already taken. | | Missing parameter descriptions | Every parameter should have a description and displayName for discoverability. | | Not testing all parameter combinations | Use dotnet new <template> --dry-run with different parameter values to verify conditional content works correctly. | | Hardcoded versions in template | Use sourceName replacement for project names and consider parameterizing framework versions. | | Not setting classifications | Add appropriate classifications (e.g., ["Web", "API"]) for template discovery. |
Other measured skills in the registry, with their headline benchmark lift.