# MORPH-SPEC Templates Reference

Documentação completa de todos os templates disponíveis.

---

## Feature Templates

Templates para documentação de features.

### spec.md
Template de especificação técnica.

**Localização**: `.morph/templates/spec.md`

**Seções**:
- Visão Geral
- Requisitos Funcionais
- Requisitos Não-Funcionais
- Arquitetura
- Modelo de Dados
- APIs
- Segurança

### tasks.md
Template de breakdown de tasks.

**Localização**: `.morph/templates/tasks.md`

**Estrutura**:
```markdown
| ID | Task | Dependências | Estimativa |
|----|------|--------------|------------|
| T001 | Descrição | - | S/M/L |
```

### contracts.cs
Template de contratos (interfaces, DTOs).

**Localização**: `.morph/templates/contracts.cs`

**Inclui**:
- Interfaces de serviço
- DTOs de request/response
- Enums
- Interfaces de repositório

### decisions.md
Template de Architecture Decision Records.

**Localização**: `.morph/templates/decisions.md`

**Formato ADR**:
```markdown
## ADR-001: Título

**Status**: Proposed | Accepted | Deprecated

**Context**: Descrição do contexto

**Decision**: A decisão tomada

**Consequences**: Impactos positivos e negativos
```

### recap.md
Template de resumo pós-implementação.

**Localização**: `.morph/templates/recap.md`

---

## Code Templates

Templates para geração de código.

### component.razor
Componente Blazor com parâmetros e lifecycle.

**Localização**: `.morph/templates/component.razor`

```razor
@namespace {{Namespace}}.Components

<div class="{{ComponentName | kebab-case}}">
    @* Content *@
</div>

@code {
    [Parameter] public string Title { get; set; }

    protected override async Task OnInitializedAsync()
    {
        await base.OnInitializedAsync();
    }
}
```

### service.cs
Serviço com injeção de dependência.

**Localização**: `.morph/templates/service.cs`

```csharp
public interface I{{ServiceName}}Service
{
    Task<Result> ExecuteAsync(Request request, CancellationToken ct);
}

public class {{ServiceName}}Service : I{{ServiceName}}Service
{
    private readonly IRepository _repository;
    private readonly ILogger<{{ServiceName}}Service> _logger;

    public {{ServiceName}}Service(
        IRepository repository,
        ILogger<{{ServiceName}}Service> logger)
    {
        _repository = repository;
        _logger = logger;
    }
}
```

### repository.cs
Repositório EF Core.

**Localização**: `.morph/templates/repository.cs`

```csharp
public interface I{{Entity}}Repository
{
    Task<{{Entity}}?> GetByIdAsync(int id, CancellationToken ct);
    Task<IReadOnlyList<{{Entity}}>> GetAllAsync(CancellationToken ct);
    Task AddAsync({{Entity}} entity, CancellationToken ct);
    void Update({{Entity}} entity);
    void Delete({{Entity}} entity);
}
```

### test.cs
Teste xUnit com FluentAssertions.

**Localização**: `.morph/templates/test.cs`

```csharp
public class {{ServiceName}}ServiceTests
{
    private readonly Mock<IRepository> _repositoryMock;
    private readonly {{ServiceName}}Service _sut;

    public {{ServiceName}}ServiceTests()
    {
        _repositoryMock = new Mock<IRepository>();
        _sut = new {{ServiceName}}Service(_repositoryMock.Object);
    }

    [Fact]
    public async Task Method_Should_ReturnExpected_When_Condition()
    {
        // Arrange
        // Act
        // Assert
    }
}
```

### migration.cs
Migration EF Core.

**Localização**: `.morph/templates/migration.cs`

### agent.cs
Agente AI com Semantic Kernel.

**Localização**: `.morph/templates/agent.cs`

```csharp
public class {{AgentName}}Agent
{
    private readonly Kernel _kernel;

    [KernelFunction("function_name")]
    [Description("Description of the function")]
    public async Task<string> ExecuteAsync(
        [Description("Parameter description")] string input)
    {
        // Implementation
    }
}
```

### job.cs
Background job Hangfire.

**Localização**: `.morph/templates/job.cs`

```csharp
public class {{JobName}}Job
{
    private readonly IService _service;
    private readonly ILogger<{{JobName}}Job> _logger;

    [AutomaticRetry(Attempts = 3)]
    public async Task ExecuteAsync(JobParameters parameters)
    {
        _logger.LogInformation("Starting job {JobName}", nameof({{JobName}}Job));
        // Implementation
    }
}
```

---

## IaC Templates (Bicep)

Templates de Infrastructure as Code.

### main.bicep
Entry point que compõe todos os módulos.

**Localização**: `.morph/templates/infra/main.bicep`

**Parâmetros**:
- `appName` - Nome da aplicação
- `environment` - dev/staging/prod
- `location` - Região Azure

**Módulos incluídos**:
- Container App Environment
- Container App
- SQL Database
- Storage Account
- Key Vault
- Application Insights

### container-app.bicep
Azure Container Apps com auto-scaling.

**Localização**: `.morph/templates/infra/container-app.bicep`

**Features**:
- Scale-to-zero
- HTTP auto-scaling
- Health probes (liveness + readiness)
- Environment variables
- Secrets integration

### container-app-env.bicep
Managed Environment para Container Apps.

**Localização**: `.morph/templates/infra/container-app-env.bicep`

**Inclui**:
- Log Analytics workspace
- Internal/External ingress

### sql-database.bicep
Azure SQL Database.

**Localização**: `.morph/templates/infra/sql-database.bicep`

**Tiers suportados**:
- Free (32GB) - Desenvolvimento
- Basic - Produção pequena
- Standard - Produção

### storage.bicep
Storage Account com containers.

**Localização**: `.morph/templates/infra/storage.bicep`

**Containers padrão**:
- uploads
- reports
- backups

### key-vault.bicep
Azure Key Vault.

**Localização**: `.morph/templates/infra/key-vault.bicep`

**Features**:
- RBAC authorization
- Soft delete
- Purge protection (prod)

### app-insights.bicep
Application Insights para monitoring.

**Localização**: `.morph/templates/infra/app-insights.bicep`

### parameters.dev.json / parameters.prod.json
Parâmetros por ambiente.

**Localização**: `.morph/templates/infra/parameters.*.json`

---

## Integration Templates

Templates para integrações externas.

### asaas-client.cs
Cliente HTTP completo para Asaas.

**Localização**: `.morph/templates/integrations/asaas-client.cs`

**Endpoints**:
- Customers (CRUD)
- Payments (PIX, Boleto, Credit Card)
- Subscriptions
- Webhooks validation

**Uso**:
```csharp
services.AddAsaasClient(options =>
{
    options.ApiKey = configuration["Asaas:ApiKey"];
    options.Environment = AsaasEnvironment.Sandbox;
});
```

### asaas-webhook.cs
Controller para webhooks Asaas.

**Localização**: `.morph/templates/integrations/asaas-webhook.cs`

**Eventos suportados**:
- PAYMENT_CREATED
- PAYMENT_RECEIVED
- PAYMENT_CONFIRMED
- PAYMENT_OVERDUE
- PAYMENT_REFUNDED
- SUBSCRIPTION_*

### clerk-config.cs
Configuração de autenticação Clerk.

**Localização**: `.morph/templates/integrations/clerk-config.cs`

**Features**:
- JWT validation
- User claims
- Middleware
- Blazor integration

### azure-identity-config.cs
Microsoft Identity Platform.

**Localização**: `.morph/templates/integrations/azure-identity-config.cs`

**Modos**:
- Web App (OpenID Connect)
- API (JWT Bearer)
- Blazor Server
- Downstream APIs (Graph)

---

## SaaS Templates

Templates para aplicações SaaS.

### subscription.cs
Modelo completo de assinaturas.

**Localização**: `.morph/templates/saas/subscription.cs`

**Entidades**:
- `Plan` - Planos com limites e features
- `Subscription` - Assinatura do tenant
- `SubscriptionPayment` - Histórico de pagamentos

**Features**:
- Ciclos mensais e anuais
- Trial period
- Status machine (Trial → Active → PastDue → Canceled)
- Integração Asaas

### tenant.cs
Multi-tenancy completo.

**Localização**: `.morph/templates/saas/tenant.cs`

**Entidades**:
- `Tenant` - Organização
- `TenantUser` - Usuários do tenant

**Features**:
- Múltiplas estratégias de resolução:
  - Subdomínio (`acme.app.com`)
  - Header (`X-Tenant-ID`)
  - Route (`/tenant/{slug}`)
  - Claim (JWT)
- EF Core query filters
- Status management

---

## Como Usar

### 1. Copiar Template
Os templates são automaticamente aplicados pelo MORPH durante `/morph-apply`.

### 2. Substituir Placeholders
Placeholders comuns:
- `{{Namespace}}` - Namespace do projeto
- `{{ServiceName}}` - Nome do serviço
- `{{Entity}}` - Nome da entidade
- `{{ComponentName}}` - Nome do componente

### 3. Customizar
Edite os templates em `.morph/templates/` para seu estilo.

---

*MORPH-SPEC by Polymorphism Tech*
