Claude Code no .NET: projetos, testes e debug com IA

Usar o Claude Code no .NET deixou de ser um experimento e passou a ser uma forma concreta de acelerar tarefas repetitivas do dia a dia. Neste artigo, você vai ver como arquivos de especificação em markdown orientam a IA a criar um projeto, escrever testes, documentar o código e encontrar a causa de uma exceção.
O que é o Claude Code no .NET
O Claude Code é um agente de programação da Anthropic que roda no terminal e também se integra a editores como o VS Code. Ele lê o código, edita arquivos e executa comandos, sempre dentro das permissões que você concede.
Na prática, isso significa que ele não apenas sugere trechos de código. Ele cria pastas, roda o dotnet build, executa testes e interpreta as mensagens de erro do compilador.
Por isso, o Claude Code no .NET funciona como um par de programação que domina o CLI da plataforma. A diferença em relação a um chat comum está na capacidade de agir sobre o repositório inteiro.
A documentação oficial descreve esse comportamento na visão geral do Claude Code. Vale a leitura antes de liberar permissões amplas para o agente.
O ponto central deste artigo, no entanto, não é a ferramenta em si. O que faz diferença é a forma como você descreve o que quer, e é aí que entram os arquivos de especificação.
Arquivos de especificação como base do método
Um prompt solto em uma janela de chat gera resultados imprevisíveis. Um arquivo markdown versionado, com regras claras, gera resultados repetíveis.
Essa é a mesma lógica do spec driven development, em que a especificação vira a fonte da verdade do projeto. Em vez de conversar com a IA, você entrega um contrato.
O experimento publicado pelo Round The Code usa exatamente essa abordagem. Cada tarefa ganha um arquivo numerado, como 01-create-project.md, 02-create-unit-tests.md e 03-add-comments.md.
O que o arquivo de especificação contém
O primeiro arquivo descreve o projeto com bastante detalhe. Ele define a versão do framework, a arquitetura, a ordem de criação e as regras de código.
Veja um recorte simplificado de como um arquivo desse tipo pode ser organizado:
# 01-create-project.md
## Stack
- .NET 10 and C# 14
- SQL Server with Entity Framework Core
## Solution
- Create a `.slnx` solution named `Store`
- Projects: `Store.Api`, `Store.Application`, `Store.Infrastructure`
- Enable Central Package Management with `Directory.Packages.props`
## Coding rules
- Use file scoped namespaces
- One type per file
- Pass `CancellationToken` to every async call
- Do not add comments
## Endpoint
- GET /api/products returns every product where `IsDeleted` is false
## Verification
- Run `dotnet build` and `dotnet run`
- Confirm the Swagger page loads
- Generate a CLAUDE.md with these rules
Repare que o arquivo também pede um CLAUDE.md no final. Esse arquivo guarda as convenções do projeto, então as próximas sessões seguem as mesmas regras sem que você precise repeti-las.
Além disso, a especificação manda o agente pesquisar a versão estável mais recente de cada pacote NuGet. Assim, você evita versões antigas que o modelo poderia trazer de memória.
Um detalhe interessante é que o arquivo proíbe a criação de migrations do Entity Framework Core. Em vez disso, ele deixa instruções para que o desenvolvedor as crie manualmente.
Segundo o autor, escrever esse arquivo levou algumas horas de idas e vindas com a própria IA. Contudo, depois de pronto, ele vira um modelo reutilizável para qualquer projeto novo.
Por que usar o modo de planejamento
Todos os prompts do experimento começam com /plan. Esse comando coloca o agente em modo de planejamento, no qual ele analisa o contexto e propõe um plano sem alterar nenhum arquivo.
# Prompt usado para criar o projeto
/plan Read 01-create-project.md and plan how you are going to build it
Com isso, você revisa a estratégia antes da execução. Se algo estiver errado, basta corrigir o plano ou a especificação, o que custa muito menos do que desfazer arquivos criados.
Depois da aprovação, você tira o Claude Code no .NET do modo de planejamento e ele executa o que foi combinado.
Criando um projeto com Claude Code no .NET
A primeira tarefa do experimento parte de uma pasta vazia contendo apenas o arquivo de especificação. A partir dele, o agente monta uma solução completa em Clean Architecture.
O plano gerado antes da execução
Antes de propor qualquer passo, o Claude Code no .NET verificou o ambiente. Ele conferiu a versão do SDK instalada e se o SQL Server LocalDB estava disponível na máquina.
Em seguida, o plano trouxe uma descrição do que seria construído e os passos na ordem definida pela especificação. Também listou os arquivos de cada projeto e os arquivos da raiz, como CLAUDE.md e README.md.
Por fim, o plano incluiu uma seção de verificação. Ela previa compilar a solução, subir a API, abrir o Swagger e confirmar que nenhum comentário havia entrado no código.
Essa etapa de verificação é o que diferencia um bom uso de IA de uma geração às cegas. Afinal, o próprio agente valida o que entregou.
O resultado em poucos minutos
O agente criou o projeto em menos de cinco minutos. Segundo o autor, a mesma tarefa levaria pelo menos uma hora feita à mão.
O resultado incluiu um arquivo .slnx, formato que o dotnet new sln adota por padrão desde o .NET 10, conforme a documentação de breaking changes do SDK. Também incluiu o Central Package Management configurado.
<!-- Directory.Packages.props -->
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.0" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="10.0.0" />
</ItemGroup>
</Project>
Com o Central Package Management, cada .csproj referencia o pacote sem informar a versão. Dessa forma, a solução inteira usa a mesma versão de cada dependência.
O endpoint pedido na especificação também ficou pronto. Ele segue as regras definidas, como o uso de CancellationToken em toda chamada assíncrona:
namespace Store.Api.Endpoints;
public static class ProductEndpoints
{
extension(IEndpointRouteBuilder app)
{
public IEndpointRouteBuilder MapProductEndpoints()
{
app.MapGet("/api/products", GetProductsAsync);
return app;
}
}
public static async Task<IResult> GetProductsAsync(
IProductService productService,
CancellationToken cancellationToken)
{
var products = await productService.GetActiveAsync(cancellationToken);
return Results.Ok(products);
}
}
Note o uso de extension members, recurso do C# 14 que a especificação exigia. Ou seja, o Claude Code no .NET respeitou até as regras de estilo mais recentes da linguagem.
Na visão do autor, esse é o caminho da profissão nos próximos anos. Haverá menos digitação de código e mais decisões de arquitetura.
Escrevendo testes unitários com Claude Code no .NET
A segunda tarefa reaproveita a mesma ideia. Um novo arquivo, 02-create-unit-tests.md, descreve como os testes devem ser escritos.
O plano gerado listou os métodos de serviço, repositório e endpoint que precisavam de cobertura. Em seguida, detalhou a criação dos projetos de teste, a instalação dos pacotes e a atualização do CLAUDE.md com as convenções de testes.
Convenções que tornam os testes previsíveis
A especificação pede três projetos dentro de uma pasta Tests: ApiTests, ApplicationTests e InfrastructureTests, todos com xUnit v3. Além disso, define o Moq como biblioteca de mocks.
Outras regras deixam o código padronizado. Os mocks nascem no construtor da classe de teste, o resultado do método testado fica em uma variável chamada act e todo método que aceita CancellationToken recebe TestContext.Current.CancellationToken.
namespace Store.ApplicationTests.Services;
public class ProductServiceTests
{
private readonly Mock<IProductRepository> _repository;
private readonly ProductService _service;
public ProductServiceTests()
{
_repository = new Mock<IProductRepository>();
_service = new ProductService(_repository.Object);
}
[Fact]
public async Task GetActiveAsync_ReturnsOnlyActiveProducts()
{
// Arrange
var cancellationToken = TestContext.Current.CancellationToken;
_repository
.Setup(r => r.GetActiveAsync(cancellationToken))
.ReturnsAsync([new Product { Id = 1, Name = "Keyboard" }]);
// Act
var act = await _service.GetActiveAsync(cancellationToken);
// Assert
Assert.Single(act);
}
}
Para os repositórios, o Claude Code no .NET usou o provedor em memória do Entity Framework Core, com um banco separado para cada teste. Já os endpoints de Minimal API foram testados chamando cada handler diretamente.
Um detalhe chama atenção: as versões dos pacotes de teste ficam no .csproj de cada projeto, e não no Central Package Management. Essa escolha mostra como a especificação pode abrir exceções conscientes às regras globais.
O Claude Code no .NET criou os projetos de teste em pouco mais de cinco minutos. Como a especificação mandava rodar dotnet test e confirmar o sucesso, todos os testes passaram na entrega.
Além da velocidade, a IA ajuda a planejar a cobertura. Ela costuma encontrar cenários que o desenvolvedor não pensou em testar.
Documentando o código com Claude Code no .NET
O primeiro arquivo proibia comentários de propósito. Assim, a terceira tarefa adiciona a documentação depois, com regras próprias definidas em 03-add-comments.md.
A especificação ativa a propriedade GenerateDocumentationFile nos projetos Api, Application e Infrastructure. Com ela, o compilador emite o aviso CS1591 para todo membro público sem documentação, segundo a referência de comentários XML do C#.
<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>
A regra seguinte é clara: corrigir cada aviso, nunca suprimi-lo. Desse modo, o build passa a funcionar como uma checagem automática de documentação.
Além disso, cada comentário precisa ter no máximo 60 caracteres e descrever o que o membro faz, sem repetir o nome dele. Nas implementações de interface, o Claude Code no .NET usa <inheritdoc /> e mantém a documentação completa na interface.
namespace Store.Application.Products;
/// <summary>
/// Reads products from the data store.
/// </summary>
public interface IProductRepository
{
/// <summary>
/// Gets products that are not deleted.
/// </summary>
/// <param name="cancellationToken">Cancels the operation.</param>
/// <returns>The active products.</returns>
Task<IReadOnlyList<Product>> GetActiveAsync(CancellationToken cancellationToken);
}
/// <inheritdoc />
public sealed class ProductRepository(StoreDbContext context) : IProductRepository
{
/// <inheritdoc />
public async Task<IReadOnlyList<Product>> GetActiveAsync(CancellationToken cancellationToken)
=> await context.Products
.Where(p => !p.IsDeleted)
.ToListAsync(cancellationToken);
}
Nos projetos de teste, a regra muda. Só entram os comentários // Arrange, // Act e // Assert, que deixam a estrutura de cada teste evidente.
Por fim, o Claude Code no .NET substituiu no CLAUDE.md a regra antiga de não comentar pelas novas regras de documentação. Isso mostra como o arquivo de convenções evolui junto com o projeto.
O limite de 60 caracteres resolve um problema comum dos modelos, que tendem a escrever comentários longos demais. Por outro lado, a IA raramente erra ortografia e mantém os parâmetros documentados em sincronia com a assinatura dos métodos.
Depurando exceções com Claude Code no .NET
Seguir regras de arquitetura é uma coisa. Encontrar a causa de um erro em produção, no entanto, exige outro tipo de raciocínio.
Ao chamar /api/products, a API retornou um erro 500 com uma exceção do SQL Server. O autor então pediu ajuda ao agente com um prompt simples, sem arquivo de especificação.
I ran the project. Went to run /api/products, but I get a SQL Server error. Can you debug it for me?
Como a causa real foi encontrada
O Claude Code no .NET investigou o projeto e notou a ausência da pasta Migrations. Sem migration aplicada, o banco de dados simplesmente não existia.
A especificação tinha proibido o agente de criar migrations, e o passo manual descrito no README.md acabou esquecido. Portanto, o erro veio de uma decisão do próprio fluxo, e não de um bug no código gerado.
A correção exigiu apenas dois comandos do CLI do Entity Framework Core:
# Cria a migration inicial e aplica no banco
dotnet ef migrations add InitialCreate --project src/Store.Infrastructure --startup-project src/Store.Api
dotnet ef database update --project src/Store.Infrastructure --startup-project src/Store.Api
Depois disso, o banco e a tabela Products passaram a existir. Com um produto cadastrado, o endpoint voltou a responder com sucesso.
O diagnóstico levou quase quatro minutos. O motivo foi simples: a API continuava rodando em segundo plano, e o agente não conseguia executá-la para reproduzir o erro.
Daí vem uma dica prática importante. Antes de pedir uma depuração, pare a aplicação para que o agente consiga rodá-la e observar a falha.
Vale notar também o valor do diagnóstico em si. Uma exceção do SQL Server costuma levar o desenvolvedor a desconfiar da connection string ou da rede, enquanto o problema real era uma migration não aplicada.
Boas práticas para usar o Claude Code no .NET
O experimento deixa algumas lições que valem para qualquer projeto. A primeira é tratar a especificação como código: versionada, revisada e reutilizada.
A segunda é sempre começar pelo planejamento. Revisar um plano é rápido, enquanto desfazer dezenas de arquivos gerados com a premissa errada consome tempo.
A terceira é incluir critérios de verificação na própria especificação. Quando o arquivo exige dotnet build, dotnet test e uma checagem do Swagger, o Claude Code no .NET valida o próprio trabalho antes de entregar.
Também convém manter o CLAUDE.md atualizado a cada etapa. Ele funciona como a memória do projeto e evita que regras se percam entre sessões.
Por outro lado, a IA não elimina a revisão humana. Você continua responsável por avaliar o código, aprovar o plano e decidir o que entra no repositório.
Por fim, configure as permissões com cuidado. O Claude Code no .NET executa comandos reais, então vale restringir o que ele pode fazer sem confirmação, principalmente em repositórios de produção.
O que isso significa para o desenvolvedor .NET
O autor do experimento afirma que a IA é assustadoramente boa nessas tarefas. Mesmo assim, em uma enquete feita por ele no LinkedIn, apenas 6% dos desenvolvedores disseram ter perdido o emprego por causa da IA.
Na leitura dele, esse número baixo reflete a lentidão das empresas em adotar a tecnologia. Contudo, a adoção tende a acelerar, e quem não dominar essas ferramentas pode ficar para trás.
Na prática, o papel do desenvolvedor muda de foco. Saber escrever uma boa especificação, revisar um plano e validar o resultado passa a valer tanto quanto digitar código rapidamente.
Isso não reduz a importância do conhecimento técnico, muito pelo contrário. Para escrever uma especificação que exige Central Package Management, extension members e <inheritdoc />, você precisa conhecer cada um desses recursos.
Em outras palavras, o Claude Code no .NET amplifica quem já domina a plataforma. Ele transforma conhecimento em entrega com muito mais velocidade.
Conclusão
O experimento mostra que o Claude Code no .NET entrega resultados consistentes em quatro frentes: criar projetos, escrever testes, documentar código e depurar exceções. Em todas elas, o segredo está em uma especificação clara e verificável.
Além disso, o modo de planejamento dá ao desenvolvedor o controle sobre o que será feito antes de qualquer alteração. Somado ao CLAUDE.md, ele garante que as regras do projeto sobrevivam entre sessões.
Se você ainda cria projetos e testes manualmente, vale começar por uma tarefa pequena. Escreva uma especificação, peça um plano, revise e só então execute.
Com o tempo, seus arquivos de especificação viram ativos reutilizáveis da equipe. É assim que a IA deixa de ser um atalho pontual e passa a fazer parte do processo de engenharia.
FAQ
O Claude Code funciona com o Visual Studio?
O Claude Code roda no terminal e tem extensões oficiais para VS Code e JetBrains. Com o Visual Studio, você pode usá-lo pelo terminal integrado, lado a lado com o editor.
Preciso escrever uma especificação para cada tarefa?
Não é obrigatório, mas tarefas repetitivas ganham muito com isso. Para pedidos pontuais, como a depuração do experimento, um prompt direto costuma bastar.
O que é o arquivo CLAUDE.md?
É um arquivo markdown com as convenções do projeto, lido pelo Claude Code no início de cada sessão. Ele evita que você precise repetir as regras a cada conversa.
O modo de planejamento altera arquivos?
Não. No modo de planejamento, o agente apenas analisa o contexto e propõe um plano, aguardando sua aprovação para executar.
A IA substitui o desenvolvedor .NET?
Os dados do experimento não indicam isso. O papel muda para especificar, revisar e validar, o que exige ainda mais conhecimento da plataforma.