---
paths:
  - "**/*.cs"
  - "**/*.csproj"
stacks:
  - dotnet
---

# .NET Code Templates

When implementing .NET features, use these templates as reference patterns.
Read the template file to see the exact pattern, then generate code following it.

## Scaffold (preferred for new slices)

**Always use scaffold for new VSA slices — never create feature files manually.**

```bash
morph-spec scaffold dotnet <feature> <slice-name> [--namespace <ns>] [--dry-run]
```

Examples:
```bash
morph-spec scaffold dotnet book create-book
morph-spec scaffold dotnet book get-book-by-id
morph-spec scaffold dotnet book update-book
morph-spec scaffold dotnet book delete-book
morph-spec scaffold dotnet book get-all-books
```

Generates 7 files: endpoint, handler, request, response, validator + entity, errors (shared at feature level). Entity/errors auto-skipped if they already exist.

**Only use `template render` for individual files when adding to an existing slice.**

## VSA Feature Templates (Vertical Slice Architecture)

For each new feature slice, follow the patterns in these templates:

| Template | Path | Purpose |
|----------|------|---------|
| Endpoint | `.morph/framework/templates/code/dotnet/feature/endpoint.cs.hbs` | IApiEndpoint with MapEndpoint() |
| Handler | `.morph/framework/templates/code/dotnet/feature/handler.cs.hbs` | IHandler<TRequest, TResponse> |
| Request | `.morph/framework/templates/code/dotnet/feature/request.cs.hbs` | Sealed record DTO |
| Response | `.morph/framework/templates/code/dotnet/feature/response.cs.hbs` | Sealed record DTO |
| Validator | `.morph/framework/templates/code/dotnet/feature/validator.cs.hbs` | FluentValidation AbstractValidator |
| Entity | `.morph/framework/templates/code/dotnet/feature/entity.cs.hbs` | Domain entity |
| Errors | `.morph/framework/templates/code/dotnet/feature/errors.cs.hbs` | Error factory |

## Base Abstractions (read once per project setup)

| Template | Path | Purpose |
|----------|------|---------|
| IHandler | `.morph/framework/templates/code/dotnet/abstractions/handler.cs` | Handler interface |
| Result<T> | `.morph/framework/templates/code/dotnet/abstractions/result.cs` | Railway-oriented result |
| Error | `.morph/framework/templates/code/dotnet/abstractions/error.cs` | Error types |
| IApiEndpoint | `.morph/framework/templates/code/dotnet/abstractions/api-endpoint.cs` | Endpoint interface |

## Extensions & Pipeline (read once per project setup)

| Template | Path | Purpose |
|----------|------|---------|
| Handler Registration | `.morph/framework/templates/code/dotnet/extensions/handler-registration.cs` | Scrutor auto-discovery |
| Map Endpoints | `.morph/framework/templates/code/dotnet/extensions/map-endpoints.cs` | IApiEndpoint discovery |
| Result Extensions | `.morph/framework/templates/code/dotnet/extensions/result-extensions.cs` | Match() pattern |
| Database Config | `.morph/framework/templates/code/dotnet/extensions/database-extensions.cs` | EF Core + Npgsql |
| Health Checks | `.morph/framework/templates/code/dotnet/extensions/health-checks.cs` | Health endpoints |
| Validation Decorator | `.morph/framework/templates/code/dotnet/pipelines/validation-decorator.cs` | FluentValidation pipeline |
| Logging Decorator | `.morph/framework/templates/code/dotnet/pipelines/logging-decorator.cs` | Duration tracking |
| Exception Handler | `.morph/framework/templates/code/dotnet/exceptions/exception-handler.cs` | ProblemDetails |
| API Tags | `.morph/framework/templates/code/dotnet/constants/api-tags.cs` | Scalar/Swagger groups |

## Specialized Templates

| Template | Path | Purpose |
|----------|------|---------|
| Migration | `.morph/framework/templates/code/dotnet/database/migration.cs` | EF Core migration |
| Hangfire Job | `.morph/framework/templates/code/dotnet/jobs/job.cs` | Background job |
| MAF Agent | `.morph/framework/templates/code/dotnet/jobs/agent.cs` | MS Agent Framework |
| Unit Test | `.morph/framework/templates/code/dotnet/test.cs` | xUnit AAA test |
| Contracts VSA | `.morph/framework/templates/code/dotnet/contracts/contracts-vsa.cs` | Full slice contracts |

## Usage

1. **Read the template** to see the exact pattern
2. **Generate code following the same structure** (naming, namespaces, imports)
3. Or scaffold a whole VSA slice from the templates at once:
   `morph-spec scaffold dotnet <feature> <slice-name>`
