diegoschagas.SmartDependencies.linux-arm64 0.1.8

dotnet add package diegoschagas.SmartDependencies.linux-arm64 --version 0.1.8
                    
NuGet\Install-Package diegoschagas.SmartDependencies.linux-arm64 -Version 0.1.8
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="diegoschagas.SmartDependencies.linux-arm64" Version="0.1.8" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="diegoschagas.SmartDependencies.linux-arm64" Version="0.1.8" />
                    
Directory.Packages.props
<PackageReference Include="diegoschagas.SmartDependencies.linux-arm64" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add diegoschagas.SmartDependencies.linux-arm64 --version 0.1.8
                    
#r "nuget: diegoschagas.SmartDependencies.linux-arm64, 0.1.8"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package diegoschagas.SmartDependencies.linux-arm64@0.1.8
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=diegoschagas.SmartDependencies.linux-arm64&version=0.1.8
                    
Install as a Cake Addin
#tool nuget:?package=diegoschagas.SmartDependencies.linux-arm64&version=0.1.8
                    
Install as a Cake Tool

DSC.Tech.SmartDependencies

DSC.Tech.SmartDependencies é um gerador de backend .NET orientado a modelo e exposto através do Model Context Protocol (MCP).

O projeto utiliza um arquivo definitions.txt como fonte de verdade do domínio e, a partir dessa definição, gera automaticamente uma solução backend estruturada com Clean Architecture, CQRS, Repository Pattern, Entity Framework Core, API REST e OpenAPI.

O objetivo é reduzir código repetitivo, manter consistência arquitetural entre projetos e permitir que ferramentas e agentes compatíveis com MCP gerem backends completos a partir de uma DSL declarativa.


Principais recursos

A partir do definitions.txt, o gerador pode produzir:

  • Domain
  • Application
  • Infrastructure
  • API REST
  • Entities
  • Commands e Command Handlers
  • Queries e Query Handlers
  • DTOs
  • Validators
  • Repository Interfaces
  • Repositories
  • Entity Framework Core
  • DbContext
  • Persistence
  • Dependency Injection
  • Controllers
  • Testes
  • OpenAPI
  • suporte a autenticação externa Bearer
  • suporte a FEATURE AI
  • relacionamentos locais e referências externas

O gerador foi desenhado para permanecer genérico: particularidades de cada sistema pertencem ao definitions.txt, não ao código do MCP.


Arquitetura

O fluxo principal é:

definitions.txt
       │
       ▼
DefinitionParser
       │
       ▼
ProjectDefinition
       │
       ├── Persistence
       ├── Features
       ├── Authentication
       ├── AI
       ├── Entities
       ├── Fields
       ├── Relationships
       ├── External References
       └── Metadata
       │
       ▼
Generation Pipeline
       │
       ├── Domain
       ├── Application
       ├── Infrastructure
       ├── API
       ├── Tests
       └── OpenAPI

O definitions.txt funciona como uma DSL (Domain Definition Language). O DefinitionParser interpreta a DSL uma única vez e produz um modelo canônico. Os templates e geradores consomem esse modelo; eles não devem reinterpretar o texto de forma independente.


Pré-requisitos

Para uso local:

  • .NET 10 SDK
  • PowerShell 7 recomendado para scripts auxiliares
  • Visual Studio Code ou Visual Studio
  • GitHub Copilot / cliente MCP opcional
  • PostgreSQL, MongoDB ou outro serviço necessário ao projeto gerado, conforme a persistência declarada

Para uso via MCP/NuGet:

  • dnx
  • um cliente compatível com MCP

Como rodar

O uso recomendado do pacote publicado no NuGet é através de um cliente compatível com MCP, como o GitHub Copilot Agent no VS Code.

1. Criar uma pasta para o projeto

Exemplo:

mkdir E:\Projects\MeuProjeto; cd E:\Projects\MeuProjeto

Crie nessa pasta o arquivo:

definitions.txt

Exemplo mínimo:

DSC.Sample;

PERSISTENCE RELATIONAL;

FEATURE API;

"Customer"
Id UUID PRIMARY KEY
Name VARCHAR(150) NOT NULL
Email VARCHAR(200) NOT NULL UNIQUE
CreatedAt TIMESTAMP NOT NULL DEFAULT NOW()
UpdatedAt TIMESTAMP NULL
;

O nome da primeira linha define o nome lógico do projeto gerado.


2. Configurar o MCP no VS Code

Crie o arquivo:

.vscode/mcp.json

Conteúdo:

{
  "servers": {
    "dsc-smartdependencies": {
      "type": "stdio",
      "command": "dnx",
      "args": [
        "diegoschagas.SmartDependencies@<VERSAO>",
        "--yes"
      ]
    }
  }
}

Substitua <VERSAO> pela versão publicada no NuGet.

Exemplo de estrutura:

MeuProjeto/
├── .vscode/
│   └── mcp.json
├── definitions.txt
└── ...

O pacote é executado via dnx; não é necessário adicionar referência NuGet ao projeto que será gerado.


3. Confirmar que o servidor MCP está disponível

No VS Code:

Ctrl + Shift + P

Execute:

MCP: List Servers

O servidor deve aparecer como:

dsc-smartdependencies

Se necessário, inicie ou reinicie o servidor MCP pelo próprio VS Code.


4. Gerar o backend

No Copilot Agent, use por exemplo:

Use o MCP dsc-smartdependencies para gerar o backend completo
usando o definitions.txt deste projeto.

Ou informe explicitamente a ferramenta e os caminhos:

Use a ferramenta generate_full_project do MCP dsc-smartdependencies.

root:
E:\Projects\MeuProjeto

definitionsFile:
E:\Projects\MeuProjeto\definitions.txt

Fluxo:

Copilot Agent
    │
    ▼
MCP
    │
    ▼
DSC.Tech.SmartDependencies
    │
    ▼
generate_full_project
    │
    ▼
definitions.txt
    │
    ▼
ProjectDefinition
    │
    ▼
Backend .NET

5. Compilar o projeto gerado

Na raiz da solução gerada:

dotnet build

6. Criar e aplicar migrations

Para projetos com PERSISTENCE RELATIONAL:

dotnet ef migrations add InitialCreate --project .\src\Project.Infrastructure --startup-project .\src\Project.Api --output-dir Migrations

Depois:

dotnet ef database update --project .\src\Project.Infrastructure --startup-project .\src\Project.Api

Substitua Project pelo nome real do projeto gerado quando necessário.

A connection string deve ser configurada de acordo com o ambiente antes de aplicar a migration.


7. Executar a API

dotnet run --project .\src\Project.Api\Project.Api.csproj

A porta utilizada é definida pelo projeto/ambiente gerado e não é fixa no MCP.

Depois de iniciar a API, utilize o endpoint OpenAPI/Swagger exposto pela aplicação para validar o contrato gerado.


Exemplo com Authentication externa e AI

Quando o projeto utiliza Authentication externa e AI, essas configurações devem estar declaradas no definitions.txt.

Exemplo:

DSC.Sample;

PERSISTENCE RELATIONAL;

FEATURE API;
FEATURE AI;

AUTHENTICATION EXTERNAL
PROVIDER OPENAPI
SCHEME BEARER
ISSUER "DSC.API.Authentication"
AUDIENCE "sample-api"
;

AI EXTERNAL
PROVIDER OPENROUTER
BASEURL "https://openrouter.ai/api/v1"
MODEL "openrouter/free"
MODE TOOLS
;

Secrets não devem ser colocados no definitions.txt.

Para Authentication baseada em chave simétrica, configure a chave fora do código, por exemplo:

dotnet user-secrets set "Authentication:Key" "<KEY>" --project .\src\Project.Api\Project.Api.csproj

Para providers de AI que exigem chave, utilize o mecanismo de configuração segura adotado pela aplicação/ambiente.


Relacionamentos locais e externos

Relacionamento local:

HouseholdId UUID NOT NULL REFERENCES Household(Id)

Referência externa:

UserId UUID NOT NULL REFERENCES EXTERNAL Authentication.User(Id)

A diferença é importante:

LOCAL
→ pertence ao mesmo domínio
→ pode gerar FK e navigation property no Entity Framework

EXTERNAL
→ pertence a outro sistema/provider
→ mantém somente o identificador escalar
→ não gera FK local
→ não gera navigation property local

O OpenAPI gerado publica metadados x-dsc-relationship para que outros geradores possam distinguir relações locais e externas.


Uso programático

Também é possível chamar o gerador diretamente em C#:

using DSC.Tech.SmartDependencies.Tools;

var root = @"E:\Projects\MeuProjeto";
var definitionsFile = Path.Combine(root, "definitions.txt");

var result =
    await new FullProjectGeneratorTools()
        .GenerateFullProject(
            root,
            definitionsFile);

Console.WriteLine(result);

Esse modo é útil principalmente para desenvolvimento do próprio MCP, testes de regressão e automações internas.


Estrutura geral do definitions.txt

Um arquivo pode combinar:

ProjectName;

PERSISTENCE ...

FEATURE ...

AUTHENTICATION ...

AI ...

"Entity"
...
;

Exemplo mais completo:

DSC.Oikos;

PERSISTENCE RELATIONAL;

FEATURE API;
FEATURE AI;

AUTHENTICATION EXTERNAL
PROVIDER OPENAPI
SCHEME BEARER
ISSUER "DSC.API.Authentication"
AUDIENCE "sample-api"
;

@project title="Oikos"
@project tagline="Gestão financeira para o seu lar."
@dashboard enabled=true defaultPeriod="CURRENT_MONTH"

"Household"
Id UUID PRIMARY KEY
Name VARCHAR(150) NOT NULL
Description VARCHAR(500)
Currency VARCHAR(10) NOT NULL DEFAULT 'BRL'
IsActive BOOLEAN NOT NULL DEFAULT TRUE
CreatedAt TIMESTAMP NOT NULL DEFAULT NOW()
UpdatedAt TIMESTAMP NULL
;

Persistência

Relacional

PERSISTENCE RELATIONAL;

Gera infraestrutura relacional baseada em Entity Framework Core.

MongoDB

PERSISTENCE MONGODB;

A escolha de persistência pertence ao modelo declarativo. Ela não deve ser inferida pelo nome do projeto.


Features

API

FEATURE API;

Gera a API REST e os artefatos associados.

AI

FEATURE AI;

Habilita a infraestrutura de AI prevista pelo gerador.

A configuração operacional do provider pode ser declarada na DSL e propagada para a aplicação gerada.

Exemplo:

AI EXTERNAL
PROVIDER OPENROUTER
BASEURL "https://openrouter.ai/api/v1"
MODEL "openrouter/free"
MODE TOOLS
;

Secrets continuam fora do definitions.txt e do código gerado.

A implementação gerada deve continuar genérica. O MCP não deve ser acoplado a um único sistema ou provider.


Authentication externa

Uma API de domínio pode utilizar uma API de autenticação separada.

DSL:

AUTHENTICATION EXTERNAL
PROVIDER OPENAPI
SCHEME BEARER
ISSUER "DSC.API.Authentication"
AUDIENCE "sample-api"
;

Isso significa:

Authentication API
      │
      │ emite JWT
      ▼
Bearer Token
      │
      ▼
API de domínio

Nesse modo, a API de domínio:

  • valida o token;
  • utiliza AddAuthentication;
  • utiliza Bearer/JWT;
  • utiliza AddAuthorization;
  • pode proteger controllers com [Authorize];
  • publica segurança Bearer no OpenAPI.

Ela não deve gerar:

  • login;
  • refresh token;
  • password hashing;
  • armazenamento de senha;
  • endpoints internos da API de Authentication;
  • bootstrap de usuários do servidor de identidade.

FEATURE AUTHENTICATION e AUTHENTICATION EXTERNAL possuem significados diferentes.


Relacionamentos locais

Relacionamentos entre entidades do mesmo domínio são declarados com:

HouseholdId UUID NOT NULL REFERENCES Household(Id)

O modelo canônico representa esse relacionamento como uma relação local.

Uma relação local pode gerar:

  • propriedade FK;
  • navigation property;
  • configuração EF;
  • display de relacionamento em DTOs;
  • metadados de relacionamento no OpenAPI.

Exemplo:

"Account"
Id UUID PRIMARY KEY
HouseholdId UUID NOT NULL REFERENCES Household(Id)
Name VARCHAR(150) NOT NULL
;

Referências externas

Quando o identificador aponta para uma entidade pertencente a outro sistema, utilize:

REFERENCES EXTERNAL Provider.Entity(Property)

Exemplo:

UserId UUID NOT NULL REFERENCES EXTERNAL Authentication.User(Id)

Outro exemplo:

CustomerId UUID NULL REFERENCES EXTERNAL CRM.Customer(Id)

Conceitualmente:

LOCAL
HouseholdId
    │
    ▼
Household
    └── entidade do mesmo ProjectDefinition

EXTERNAL
UserId
    │
    ▼
Authentication.User
    └── entidade pertencente a outro sistema

Uma referência externa:

  • mantém a propriedade escalar, por exemplo UserId;
  • não gera FK local no Entity Framework;
  • não gera navigation property local;
  • não executa Include() para a entidade externa;
  • não tenta resolver a entidade externa dentro do ProjectDefinition local;
  • não deve obrigar a API gerada a conhecer o modelo interno do provider externo.

Exemplo:

"HouseholdMember"
Id UUID PRIMARY KEY
HouseholdId UUID NOT NULL REFERENCES Household(Id)
UserId UUID NOT NULL REFERENCES EXTERNAL Authentication.User(Id)
Role VARCHAR(50) NOT NULL DEFAULT 'MEMBER'
UNIQUE (HouseholdId, UserId)
;

Nesse exemplo:

HouseholdId -> relacionamento local
UserId      -> referência externa

Entidades e campos

A DSL suporta, entre outros:

PRIMARY KEY
NOT NULL
NULL
UNIQUE
DEFAULT
REFERENCES
REFERENCES EXTERNAL
VARCHAR(length)
NUMERIC(precision, scale)
UUID
TIMESTAMP
BOOLEAN
INT
TEXT

Exemplo:

"Transaction"
Id UUID PRIMARY KEY
Amount NUMERIC(15,2) NOT NULL
Description VARCHAR(255) NOT NULL
TransactionDate TIMESTAMP NOT NULL
IsRecurring BOOLEAN NOT NULL DEFAULT FALSE
Notes TEXT
;

Constraints

Constraint composta:

UNIQUE (HouseholdId, UserId)

Outro exemplo:

UNIQUE (HouseholdId, Year, Month)

Esses metadados pertencem ao modelo do domínio e devem ser propagados pelo gerador.


Metadados de apresentação

O definitions.txt também pode carregar metadados utilizados por outros geradores.

Exemplo de i18n:

Name VARCHAR(150) NOT NULL
@i18n en-US label="Name"
@i18n pt-BR label="Nome"
@i18n es-ES label="Nombre"

Entidade:

"Category"
@i18n en-US singular="Category" plural="Categories"
@i18n pt-BR singular="Categoria" plural="Categorias"
@i18n es-ES singular="Categoría" plural="Categorías"

Metadados de filtros e analytics

Exemplos:

TransactionDate TIMESTAMP NOT NULL
@filter kind="date-range" default="CURRENT_MONTH"
@analytics role="time"
@dashboard primaryDate=true
Amount NUMERIC(15,2) NOT NULL
@analytics role="measure" aggregate="sum"
CategoryId UUID NULL REFERENCES Category(Id)
@filter kind="relation"
@analytics role="dimension"

O backend continua genérico: esses dados são metadados declarativos.


CQRS

Escrita:

HTTP POST
    │
    ▼
CreateEntityCommand
    │
    ▼
CreateEntityCommandHandler
    │
    ▼
Repository
    │
    ▼
Persistence

Consulta:

HTTP GET
    │
    ▼
GetEntityByIdQuery
    │
    ▼
GetEntityByIdQueryHandler
    │
    ▼
Repository
    │
    ▼
DTO

OpenAPI

O OpenAPI é derivado do backend gerado:

definitions.txt
       │
       ▼
ProjectDefinition
       │
       ▼
.NET Backend
       │
       ▼
OpenAPI

Quando existe Authentication externa, o OpenAPI da API de domínio pode publicar o esquema Bearer correspondente.

Em um fluxo full-stack:

definitions.txt
       │
       ▼
Backend MCP
       │
       ▼
Domain OpenAPI
       │
       ├──────────────┐
       │              │
Authentication OpenAPI
                      │
                      ▼
              Frontend Generator
                      │
                      ▼
                    React

Estrutura da solução gerada

Exemplo:

src/
├── Project.Domain/
│   ├── Entities/
│   ├── ValueObjects/
│   └── Shared/
│
├── Project.Application/
│   ├── Common/
│   └── Features/
│       └── Entity/
│           ├── Commands/
│           ├── Queries/
│           ├── Dtos/
│           ├── Validators/
│           └── Mappers/
│
├── Project.Infrastructure/
│   ├── Persistence/
│   ├── Repositories/
│   └── DependencyInjection/
│
└── Project.Api/
    ├── Controllers/
    ├── Configuration/
    └── OpenApi/

tests/
└── ...

Configuração depois da geração

Alguns valores pertencem ao ambiente e não devem ser hardcoded no MCP.

Banco relacional

Exemplo:

{
  "ConnectionStrings": {
    "DefaultConnection": "Host=localhost;Port=5432;Database=SampleDb;Username=sample_app;Password=..."
  }
}

Authentication externa

Exemplo:

{
  "Authentication": {
    "Mode": "External",
    "Provider": "OPENAPI",
    "Scheme": "BEARER",
    "Issuer": "DSC.API.Authentication",
    "Audience": "sample-api"
  }
}

A chave de assinatura deve ser fornecida por mecanismo seguro, por exemplo:

dotnet user-secrets set "Authentication:Key" "<valor>"

Nunca versione secrets reais no appsettings.json.


Configurando JWT com Authentication externa

Quando o projeto utiliza:

AUTHENTICATION EXTERNAL
PROVIDER OPENAPI
SCHEME BEARER
ISSUER "DSC.API.Authentication"
AUDIENCE "sample-api"
;

a API de domínio valida tokens emitidos pelo servidor externo de Authentication.

Para validação com JWT/HMAC, três valores precisam estar alinhados entre quem emite e quem valida o token:

Issuer
Audience
Key

Conceitualmente:

Authentication API
    Issuer   = DSC.API.Authentication
    Audience = dsc-oikos-api
    Key      = K

              JWT
               │
               ▼

API de domínio
    Issuer   = DSC.API.Authentication
    Audience = dsc-oikos-api
    Key      = K

Issuer

Issuer identifica quem emitiu o token.

Exemplo:

{
  "Authentication": {
    "Issuer": "DSC.API.Authentication"
  }
}

O valor configurado na API de domínio deve ser compatível com o iss emitido no JWT.

Audience

Audience identifica para qual API o token foi emitido.

Exemplo para Oikos:

{
  "Authentication": {
    "Audience": "dsc-oikos-api"
  }
}

O valor precisa corresponder ao aud do token.

Projetos diferentes podem utilizar audiences diferentes.

Gerando uma Key

Para HS256, gere uma chave aleatória suficientemente forte.

Exemplo em PowerShell:

$keyBytes = New-Object byte[] 32
[System.Security.Cryptography.RandomNumberGenerator]::Fill($keyBytes)
$key = [Convert]::ToBase64String($keyBytes)

$key

O comando imprime uma chave que pode ser armazenada de forma segura.

Não versione a chave real no Git e não coloque secrets reais no definitions.txt.

Configurando a Key com user-secrets

Entre no projeto .Api gerado:

cd .\src\Project.Api

Inicialize user-secrets, caso o projeto ainda não tenha um UserSecretsId:

dotnet user-secrets init

Configure a chave:

dotnet user-secrets set "Authentication:Key" "<KEY>"

Confira:

dotnet user-secrets list

O .csproj deverá possuir um UserSecretsId depois da inicialização.

Exemplo:

<PropertyGroup>
  <UserSecretsId>...</UserSecretsId>
</PropertyGroup>

Configuração completa da API de domínio

Exemplo:

{
  "Authentication": {
    "Mode": "External",
    "Provider": "OPENAPI",
    "Scheme": "BEARER",
    "Issuer": "DSC.API.Authentication",
    "Audience": "dsc-oikos-api"
  }
}

A Key fica fora do arquivo:

dotnet user-secrets set "Authentication:Key" "<KEY>"

Em produção, utilize um mecanismo apropriado de secrets/environment variables em vez de user-secrets.

Regra importante sobre a Key

A API que emite o JWT e a API que valida o JWT precisam utilizar a mesma convenção de chave.

Na implementação atual baseada em HS256, a string configurada em Authentication:Key é utilizada como bytes UTF-8 para construir a SymmetricSecurityKey.

Portanto, se a chave foi gerada como uma string Base64:

abc123...=

a implementação atual utiliza os bytes UTF-8 dessa própria string.

Não faça Convert.FromBase64String() apenas no lado emissor ou apenas no lado consumidor. Isso produziria chaves criptográficas diferentes.

O contrato deve permanecer simétrico:

Authentication
Encoding.UTF8.GetBytes(Key)
          │
          ▼
       assinatura

       mesmo Key

          │
          ▼
API de domínio
Encoding.UTF8.GetBytes(Key)
          │
          ▼
       validação

Se futuramente o projeto adotar outra representação de chave, a mudança deve ser feita simultaneamente no emissor e no consumidor.

Configuração do Authentication

O servidor de Authentication também precisa utilizar valores compatíveis:

Issuer   = mesmo Issuer esperado pela API
Audience = audience da API de destino
Key      = mesma chave usada para validação

Para múltiplas APIs:

Authentication
      │
      ├── audience: dsc-oikos-api
      │       └── Oikos
      │
      ├── audience: dsc-crm-api
      │       └── CRM
      │
      └── audience: dsc-other-api
              └── Outra API

A arquitetura não deve hardcodar dsc-oikos-api no MCP. O valor é configuração do projeto/ambiente.

Diagnóstico de 401 Unauthorized

Quando uma API protegida responder 401 Unauthorized, confira nesta ordem:

1. Authorization: Bearer <token>
2. token ainda está válido
3. Issuer da API == iss do JWT
4. Audience da API == aud do JWT
5. Key do emissor == Key do consumidor
6. mesma convenção de encoding da Key
7. Authentication está registrado antes de Authorization
8. middleware UseAuthentication está ativo
9. endpoint/controller realmente utiliza o esquema esperado

Ao utilizar arquivos .http, não coloque aspas em volta do token.

Correto:

@accessToken = eyJ...

GET http://localhost:5000/api/v1/example
Authorization: Bearer {{accessToken}}

Evite:

@accessToken = "eyJ..."

As aspas passam a fazer parte do valor e podem invalidar o token.

Erro Authentication:Issuer nao configurado

Confirme que a configuração possui:

"Authentication": {
  "Issuer": "..."
}

e que o ambiente carregado pela aplicação é o esperado.

Erro Authentication:Audience nao configurado

Configure:

"Authentication": {
  "Audience": "..."
}

O valor precisa ser compatível com o token emitido.

Erro Authentication:Key nao configurada

Para desenvolvimento:

dotnet user-secrets set "Authentication:Key" "<KEY>"

Se aparecer:

Could not find the global property 'UserSecretsId'

execute no diretório do projeto .Api:

dotnet user-secrets init

e depois configure novamente a chave.

Checklist rápido

Antes de testar uma API gerada com Authentication externa:

[ ] Authentication API está executando
[ ] usuário consegue fazer login
[ ] JWT possui iss correto
[ ] JWT possui aud correto
[ ] API de domínio possui Issuer configurado
[ ] API de domínio possui Audience configurado
[ ] Authentication:Key está disponível via secret/environment
[ ] emissor e consumidor usam a mesma Key
[ ] API de domínio compila e inicia
[ ] endpoint protegido recebe Authorization: Bearer

Build do projeto gerado

Após a geração:

cd <pasta-do-projeto-gerado>
dotnet build

Depois, se aplicável:

dotnet run --project .\src\Project.Api\Project.Api.csproj

Para EF Core:

dotnet ef migrations add InitialCreate --project .\src\Project.Infrastructure --startup-project .\src\Project.Api --output-dir Migrations

e:

dotnet ef database update --project .\src\Project.Infrastructure --startup-project .\src\Project.Api

Fluxo recomendado de desenvolvimento

Para alterar uma característica estrutural de projetos gerados:

1. NÃO corrigir manualmente apenas o projeto gerado
2. identificar a limitação no MCP
3. evoluir Definitions / Parser / Canonical Model
4. evoluir os templates
5. compilar o MCP
6. gerar um projeto do zero
7. compilar o projeto gerado
8. validar OpenAPI
9. validar runtime

A regra principal é:

corrigir o gerador, não o resultado gerado.


Projeto Debug

Durante o desenvolvimento do MCP, um executável de Debug pode chamar o gerador diretamente.

Exemplo:

var backend =
    new McpBackEnd();

var result =
    await backend.GenerateAsync(
        backendRoot,
        definitionsFile);

Console.WriteLine(result);

Isso permite validar rapidamente:

  • parser;
  • geração completa;
  • regressões;
  • templates;
  • build de projetos gerados.

Idempotência e atualização incremental

O MCP atualmente deve ser tratado principalmente como gerador orientado ao modelo.

A evolução planejada é permitir que ele também funcione como um updater/migrator inteligente, capaz de:

projeto existente
      +
definitions.txt atualizado
      │
      ▼
detecção de diferenças
      │
      ▼
mudanças incrementais
      │
      ├── preservar customizações
      ├── adicionar novos artefatos
      ├── atualizar artefatos gerenciados
      └── evitar regeneração destrutiva

Até que esse mecanismo esteja implementado e validado, não assuma que uma regeneração sobre um projeto customizado preservará alterações manuais.


Princípios do projeto

Uma única fonte de verdade

definitions.txt

é a fonte declarativa principal do domínio.

Geração determinística

A mesma definição deve produzir estruturalmente o mesmo backend.

Separação de responsabilidades

Parsing
   ↓
Canonical Model
   ↓
Generation

Contratos explícitos

Relacionamentos, nullability, defaults, constraints, referências externas e metadados devem existir como dados estruturados.

Independência dos geradores

Os geradores consomem o modelo canônico e não reinterpretam a DSL por conta própria.

Sem hardcode de domínio

O MCP não deve conter regras específicas para Oikos, Household, User, Authentication ou qualquer outro domínio concreto.

Exemplos concretos podem existir em documentação e testes, mas não devem determinar o comportamento do gerador.


Objetivo

O objetivo do DSC.Tech.SmartDependencies é permitir que uma definição relativamente pequena:

definitions.txt

seja suficiente para produzir uma base consistente e reproduzível para uma aplicação .NET completa:

Domain
+
Application
+
Infrastructure
+
REST API
+
Persistence
+
Tests
+
OpenAPI

com suporte a evolução arquitetural sem perder o princípio central:

o comportamento do sistema deve ser dirigido pelo modelo, e não por código específico de um projeto.

Como ele vai ser publicado como NuGet MCP, o fluxo que fechamos é este:

Na pasta do projeto que você quer gerar, crie .vscode/mcp.json: { "servers": { "dsc-smartdependencies": { "type": "stdio", "command": "dnx", "args": [ "diegoschagas.SmartDependencies@<VERSAO>", "--yes" ] } } }

Troque <VERSAO> pela versão que você publicou, por exemplo 0.1.4.

Na mesma raiz, tenha o definitions.txt. Abra essa pasta no VS Code e pressione: Ctrl + Shift + P

Procure:

MCP: List Servers

Deve aparecer:

dsc-smartdependencies Depois, no Copilot Agent, pode simplesmente pedir: Use o MCP dsc-smartdependencies para gerar o backend completo usando o definitions.txt deste projeto.

Ele deverá chamar a ferramenta generate_full_project.

There are no supported framework assets in this package.

Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.1.8 106 9/14/2026
0.1.7 103 9/9/2026
0.1.5 106 9/4/2026
0.1.4 99 9/4/2026
0.1.3 100 9/3/2026