All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
packages_upgradetool — scan a.csproj,.sln/.slnx, or directory for outdated NuGet packages and report (default) or apply (apply=true) upgrades to the latest stable version. CPM-aware: updatesDirectory.Packages.propsPackageVersionentries for packages actually referenced by the scanned projects, otherwise rewrites inlinePackageReferenceversions. Skips floating/range/MSBuild-property versions and never downgrades. Brings the tool count to 15.- Persistent NuGet version cache —
NuGetVersionResolvernow keeps a best-effort, bounded on-disk cache (one JSON file per package underLocalApplicationData, atomic temp+move writes, pruned to 1000 entries) that survives restarts, plus aUser-Agentheader and separate success (30 min) vs failure (1 min) cache TTLs. HTTP timeouts are treated as transient failures rather than caller cancellation.
- Framework version sorting (auth path) —
TemplateEngineFacadeparameter suggestions sorted frameworks lexicographically, pickingnet9.0overnet10.0. Now uses numeric version parsing. - Choice symbol generation —
template_create_from_existingnow emits achoicesarray for choice parameters and de-duplicatesreplacesvalues and property names. - NuGet latest-version selection —
NuGetVersionResolvernow picks the highest stable version via SemVer ordering instead of trusting array order, and never registers a downgrade. - SDK install caching — only caches success when all installs succeed; disposes the bootstrap semaphore; null-guards
lang/templateTypetags during NuGet search. - Tool robustness — added null guards before
.Containson tag values, SemVer-based version equality intemplate_install, error telemetry ontemplate_dry_run/template_validate/template_create_from_existingfailure paths, a crash guard intemplate_validate, and XML-based (not substring) CPM detection insolution_analyze.
- Intent scoring —
ClassificationBasedIntentResolvernow matches template name/identity/description against extracted keywords instead of the full intent sentence, improving ranking precision.
template_comparetool — compare 2+ templates side by side showing parameters, feature support flags (auth, AOT, Docker, controllers, interactivity), available frameworks, and classifications. Useful when deciding between templates likewebapivswebapp.- Search relevance scoring —
template_searchnow ranks results by relevance (exact short name match → name → classification → description → identity) instead of just concatenating local + NuGet results. - Intent synonym expansion — added 11 new template keywords (.NET Aspire, Azure Functions, Orleans, WinUI, Blazor Web App, Razor components) and 5 new parameter keywords (Blazor interactivity modes). Total: 60 template keywords, 41 parameter keywords, 11 classification keywords.
- Invalid datatype validation —
template_validatenow flags unknown datatypes (e.g.,"datatype": "invalid-type") against the valid list:string,bool,choice,int,float,hex,text. - Common parameter combinations —
docs/tool-reference.mdnow includes a quick-reference table of common template + parameter combinations (webapi auth, Blazor interactivity, AOT). - Template validation skill documentation —
docs/skills-equivalent.mdnow covers the newtemplate-validationCopilot skill from dotnet/skills PR #480 with feasibility analysis.
- Integer datatype validation —
template_validateandValidateParametersused"integer"instead of"int"for datatype checks, meaning integer parameters were never validated. Fixed in bothTemplateValidateTool.csandTemplateEngineService.cs. - Framework version sorting — smart defaults picked
net9.0overnet10.0due to lexicographic string sort. Now uses numeric version parsing viaParseFrameworkVersion(). Fixed in bothTemplateEngineServiceandTemplateEngineFacade. - DataType null safety —
ValidateParameterscould throwNullReferenceExceptionwhen a template parameter had noDataType. Added null checks before all.Equals()calls. - Tags validation when absent —
template_validateskipped tag suggestions when thetagsfield was entirely absent. Now suggests adding language/type tags regardless. - ParseParameters silent JSON failure —
ParseParameterssilently returned an empty dictionary on malformed JSON. Now reports structured parse errors to all callers (instantiate, dry-run, suggest-parameters, facade). - Elicitation null-value bypass —
GetMissingRequiredParameterstreated{"Framework": null}as "provided", skipping elicitation. Now checks for null/empty values. - Post-processing crash after creation —
template_instantiatepost-processing (CPM + NuGet versions) was not wrapped in try/catch. Failures after project creation now return structured responses instead of unhandled exceptions. - Template install package matching —
TemplateInstallToolusedContainsfor package matching, which could match wrong packages. Changed to exactEquals. Removed fallback that returned all templates when matching failed. - SDK bootstrap race condition — replaced plain
boolflag withSemaphoreSlimdouble-check locking. Failures now allow retry on next call instead of permanently suppressing SDK template discovery. - CPM stale version updates — post-processing now updates existing packages in
Directory.Packages.propsto latest version instead of skipping them when they already exist with a stale version. - Short name sanitization —
ToShortName()now strips filesystem-unsafe and dotnet-new-invalid characters (/ \ : * ? " < > |etc.), collapses repeated hyphens, and falls back to"template"for empty results.
- Multi-target net8.0 and net10.0 — broadens adoption to .NET 8 LTS users. The tool package includes both framework builds; the correct one is selected at runtime. Template engine packages use
VersionOverride(8.0.406 for net8.0, 10.0.103 for net10.0). - NuGet version lookup cache —
NuGetVersionResolvernow caches results in aConcurrentDictionarywith 30-minute TTL, eliminating redundant API calls for repeated package lookups within a session. - GitHub Releases workflow — push a
v*tag to auto-create a GitHub Release with install instructions, auto-generated release notes, and.nupkgartifact attached. - Dependabot configuration — automated weekly dependency updates for NuGet packages and GitHub Actions.
- Enhanced Copilot instructions —
.github/copilot-instructions.mdnow routestemplate_validate,template_create_from_existing,solution_analyze, andtemplate_composeto the appropriate MCP tools. template_validateas hero feature — prominent section in README with example output; enriched tool-reference.md with full example response and usage guidance.
McpFeatureFlags.IsEnabled()case sensitivity — replaced explicit 9-casing switch withStringComparison.OrdinalIgnoreCase, correctly handling all case variants offalse,no,off.Program.csServerInfo version — was hardcoded to1.0.0, now matches package version.
template_search— Search locally and on NuGet.org with ranked resultstemplate_list— List installed templates with language/type/classification filterstemplate_inspect— Full metadata including parameters, constraints, and post-actionstemplate_instantiate— Create projects with auto-resolve from NuGet, smart defaults, parameter validation, constraint checking, and interactive elicitation of missing required parameterstemplate_dry_run— Preview files without writing to disktemplate_install— Idempotent package installationtemplate_uninstall— Remove template packagestemplates_installed— Inventory of all installed templatestemplate_from_intent— Natural language to template resolution (offline, rule-based, 70+ keyword mappings)template_create_from_existing— Reverse-engineer a reusable template from an existing .csprojtemplate_compose— Execute multi-template workflows (project + items) in one calltemplate_suggest_parameters— Parameter recommendations with cross-parameter rationalesolution_analyze— Analyze workspace structure, target frameworks, and CPM status
- Stdio transport (default) — for local CLI and IDE integration
- Streamable HTTP transport — for remote, cloud, team-shared, and CI/CD deployment
/mcpendpoint for MCP protocol/healthendpoint for monitoring- Configurable via
--transport httporMCP_TEMPLATE_TRANSPORTenv var - Custom listen URL via
MCP_TEMPLATE_HTTP_URL
- Smart defaults — cross-parameter intelligence (AOT → latest framework, auth → HTTPS stays on, controllers → minimal APIs off)
- Parameter validation — validates before writing any files
- Constraint checking — OS, SDK version, and workload requirements
- Auto-resolve from NuGet — template not installed? Searches, installs, and creates in one call
- Interactive elicitation — asks user for missing required parameters via MCP elicitation protocol
- CPM detection — walks directory tree for
Directory.Packages.props - CPM adaptation — strips
Versionfrom .csproj PackageReferences, adds to props - NuGet version resolution — replaces stale template versions with latest stable from NuGet
ClassificationBasedIntentResolverwith 5-factor scoringIntentSynonymDictionarywith 70+ keyword mappings- Feature flag:
MCP_TEMPLATE_INTENT_RESOLUTION
dotnet toolpackaging asDotnetTemplateMCPNuGet packagednxzero-install support (.NET 10+)- CI pipeline (GitHub Actions, Ubuntu + Windows)
- OpenTelemetry-ready telemetry (ActivitySource + Meter)
- Structured error responses with error codes and suggestions
- Architecture guide (
docs/architecture.md) - Tool reference (
docs/tool-reference.md) - Configuration guide (
docs/configuration.md) - MCP vs Skills comparison (
docs/mcp-vs-skills.md) - Plain LLM vs MCP comparison (
docs/plain-llm-vs-mcp.md)
- CPM adaptation and latest NuGet version resolution
- Template composition (
template_compose) - Parameter suggestions (
template_suggest_parameters)
- Intent resolution (
template_from_intent) - Template creation from existing projects (
template_create_from_existing) - .NET 10 target framework
- Initial release with core tools: search, list, inspect, instantiate, dry-run, install, uninstall
- Smart defaults and parameter validation
- Stdio transport