diegoschagas.SmartDependencies 0.1.8

{
  "servers": {
    "diegoschagas.SmartDependencies": {
      "type": "stdio",
      "command": "dnx",
      "args": ["diegoschagas.SmartDependencies@0.1.8", "--yes"]
    }
  }
}
                    
This package contains an MCP Server. The server can be used in VS Code by copying the generated JSON to your VS Code workspace's .vscode/mcp.json settings file.
dotnet tool install --global diegoschagas.SmartDependencies --version 0.1.8
                    
This package contains a .NET tool you can call from the shell/command line.
dotnet new tool-manifest
                    
if you are setting up this repo
dotnet tool install --local diegoschagas.SmartDependencies --version 0.1.8
                    
This package contains a .NET tool you can call from the shell/command line.
#tool dotnet:?package=diegoschagas.SmartDependencies&version=0.1.8
                    
nuke :add-package diegoschagas.SmartDependencies --version 0.1.8
                    

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.

Version Downloads Last Updated
0.1.8 126 9/14/2026
0.1.7 127 9/9/2026
0.1.5 133 9/4/2026
0.1.4 126 9/4/2026
0.1.3 131 9/3/2026