Plano de implementação para elevar o Codout.Framework da avaliação atual (6,5/10, jun/2026) até 10/10. Status 2026-06-12: Fases 1-6 executadas; Fases 7-8 quase completas — pendências marcadas abaixo. As fases estão em ordem de execução recomendada: cada uma cria a base da seguinte. Os ganhos de nota são estimativas para acompanhamento, não ciência exata.
- Não quebrar consumidores: pacotes já publicados no NuGet.org seguem SemVer. Mudança que altere API pública exige bump major e aviso no CHANGELOG.
- Cada pacote anda no próprio ritmo: bumps de versão apenas nos pacotes efetivamente tocados (ver CLAUDE.md).
- CI primeiro: nenhuma fase é considerada concluída sem o
dotnet.ymlverde validando o resultado.
Correções de baixo risco que destravam o resto.
-
dotnet.yml: atualizardotnet-versionde9.0.xpara10.0.x(o core targetanet10.0viaDirectory.Build.props). - Adicionar
Codout.Framework.Api.DtoeSoftprime.MultitenancyàCodout.Framework.sln(estão norelease-packages.jsonmas fora da solution — hoje o CI de PR não os builda). - Remover
appveyor.yml(referencia Visual Studio 2012; o pipeline real é GitHub Actions). - Corrigir badge de build do README (aponta para
build.yml/dotnet.ymlde forma inconsistente).
Critério de aceite: dotnet build da solution verde no CI com SDK 10.
Hoje os 4 projetos de teste existem fora da solution; o dotnet test Codout.Framework.sln do release.yml roda zero testes.
- Criar pasta
tests/na raiz. - Migrar
NetCore/Codout.Framework.EF.Testsparatests/Codout.Framework.EF.Testse atualizarTEST_PROJECTnocore-release.yml(linha 39). - Adicionar os projetos de teste ativos (EF.Tests e, se viável por
caminho, Mcp.Tests) à
Codout.Framework.sln. - Remover do escopo os testes legados (
NetFull/*.Tests,NetCore/Codout.Framework.NetCore.Tests) — dependem de infraestrutura externa (appsettings com conexões reais) e serão substituídos na Fase 4.
Critério de aceite: dotnet test Codout.Framework.sln executa testes de
verdade (> 0) no CI de PR e no gate do release.yml.
Remover ~2.000 linhas de código morto que distorcem a leitura do repo e impedem políticas globais de qualidade (Fase 5).
- Decisão prévia (usuário): deletar ou arquivar em branch
archive/legacyantes de remover. Recomendação: branch de arquivo + remoção do master. - Remover
NetFull/(EF6, .NET Framework — EOL). - Remover
NetCore/(netcoreapp2.x — EOL; testes já migrados na Fase 2). - Remover
src/NetCore/(Cosmos e DocumentDB emnetcoreapp2.0com SDKMicrosoft.Azure.DocumentDB.Coredescontinuado e anti-padrãoAllAsync().ResultemCosmosRepository.cs). Se houver demanda real por Cosmos, recriar do zero comoCodout.Framework.Cosmoscom SDKMicrosoft.Azure.Cosmos— fora do escopo deste plano. - Remover
Codout.Framework.DP(quebrado: referenciaCodout.Framework.DALinexistente;IsPackable=false). - Remover/renomear
Shared/Codout.Framework.Shared.Commom(typo "Commom") e avaliar seShared/ainda tem consumidor. - Atualizar CLAUDE.md (seção "Pacotes excluídos do release automatizado")
e CHANGELOG (
### Repository) refletindo as remoções.
Critério de aceite: nenhum csproj com target EOL no repo; busca por "Commom" retorna vazio.
O maior gap: 19 de 23 pacotes publicáveis sem teste algum. Priorizar por
risco × facilidade, em tests/<Pacote>.Tests:
| Onda | Pacotes | Abordagem |
|---|---|---|
| 1 | Data, Domain, Common, DynamicLinq, Security.* | Unit puro (sem I/O) — maior retorno imediato |
| 2 | EF (ampliar), Mongo, NH | EF: SQLite in-memory; Mongo: Testcontainers ou EphemeralMongo; NH: SQLite |
| 3 | Mailer, Mailer.Razor, Api.Client, Storage | Fakes/mocks (HttpMessageHandler fake, template rendering, contratos de abstração) |
| 4 | Storage.Azure, Mailer.AWS, Mailer.SendGrid, Api, Application, Multitenancy | Azurite para Azure; demais via mocks dos SDKs |
- Onda 1 concluída e no CI.
- Onda 2 concluída (Testcontainers exige Docker no runner —
ubuntu-latestjá tem). - Onda 3 concluída.
- Onda 4 concluída.
- Coleta de cobertura com
coverlet.collector+ publicação de relatório no CI (artifact ou Codecov + badge no README). - Meta de cobertura: ≥ 70 % nos pacotes core, ≥ 50 % nos demais. Status 2026-06-12: 47,4% total com gate ratchet de 45% no CI; EF 73%, Mongo 96%, NH 79%, Multitenancy 99% — pendências principais: Domain (22%), DynamicLinq (28%), Common (44%). Subir o piso junto com a cobertura.
Critério de aceite: todo pacote publicável tem projeto de teste; metas de cobertura atingidas e visíveis no CI.
Aplicar via Directory.Build.props (depois da Fase 3, para não gastar
esforço em código morto):
-
<Nullable>enable</Nullable>global, corrigindo projetos em ondas (13/37 já têm). Para projetos ainda não migrados, opt-out temporário explícito no csproj com comentárioTODO. -
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>+<EnableNETAnalyzers>true</EnableNETAnalyzers>+<AnalysisLevel>latest-recommended</AnalysisLevel>. - Expandir
.editorconfigcom convenções C# (indentação, naming,dotnet_diagnostic.*para calibrar severidade dos analyzers). - Resolver os
[Obsolete]pendentes emCodout.Framework.Common(Crypto, NumericExtensions, WebPageFetcher): remover no próximo bump major ou documentar substitutos. - Atualizar
System.ComponentModel.Annotations5.0.0 → versão atual (ou remover a referência onde o shared framework já cobre).
Critério de aceite: dotnet build sem warnings na solution inteira;
nullable ativo em 100 % dos projetos publicáveis.
Tudo no Directory.Build.props, exceto onde indicado:
- SourceLink:
Microsoft.SourceLink.GitHub,PublishRepositoryUrl,EmbedUntrackedSources,IncludeSymbols+SymbolPackageFormat=snupkg. -
ContinuousIntegrationBuild=truenos workflows de release (build determinístico). -
PackageReadmeFile: criarREADME.mdcurto por pacote (o que é, instalação, exemplo mínimo) e empacotar — hoje 19/20 pacotes têm página vazia no NuGet.org. -
DescriptionePackageTagsindividualizados em cada csproj. - Publicar os snupkg no fluxo de release (NuGet.org aceita no mesmo
dotnet nuget push). - Republicar pacotes com bump patch (mudança só de empacotamento) — confirmar com o usuário antes, pois publicar exige tag.
Critério de aceite: página de cada pacote no NuGet.org com README, ícone e símbolos depuráveis (F12 no código do framework a partir de um consumidor).
- Reescrever a tabela de módulos do README: remover "Zenvia", "DAL", "Kendo.DynamicLinq", "DP", "Shared"; incluir Security.*, Storage, Storage.Azure, Application, Mcp, Image.Extensions.
- Seção "Qual pacote eu instalo?" com cenários comuns (EF + API, Mongo, multitenancy, mailer).
-
GenerateDocumentationFile=trueglobal (viaDirectory.Build.props) e completar XML docs nos tipos públicos deDomain,Common,DataeApi— comTreatWarningsAsErrorsda Fase 5, o CS1591 força a conclusão (calibrar severidade se necessário). - Atualizar instruções de build/teste do README (caminhos reais da
pasta
tests/).
Critério de aceite: README sem referência a módulo inexistente; XML docs completos nos 4 pacotes core.
- Dependabot (
.github/dependabot.yml) para NuGet + GitHub Actions, agrupando updates minor/patch. - CodeQL (
github/codeql-action) para análise de segurança em PR. - Gate de cobertura no
dotnet.yml(falhar se cair abaixo da meta). - Branch protection em
master: exigir CI verde + 1 review (config no GitHub, não no repo). - Concurrency/cancel-in-progress nos workflows de PR para economizar runner.
Critério de aceite: PRs só mergeiam com CI + CodeQL verdes; dependências atualizadas automaticamente via PRs do Dependabot.
| Fase | Tema | Esforço | Nota acumulada (alvo) |
|---|---|---|---|
| — | Estado atual | — | 6,5 |
| 1 | Quick wins CI | P | 6,75 |
| 2 | Testes na solution | P | 7,0 |
| 3 | Limpeza do legado | M | 8,0 |
| 4 | Cobertura de testes | G | 9,5 (maior fase — pode rodar em paralelo às 5–8) |
| 5 | Qualidade estática | M | +0,75 dentro do teto |
| 6 | Empacotamento | M | +0,75 dentro do teto |
| 7 | Documentação | M | +0,5 dentro do teto |
| 8 | Hardening CI/CD | P | 10,0 |
- Fase 3: deletar legado direto ou arquivar em branch
archive/legacyprimeiro? (Recomendação: arquivar e deletar.) - Fase 4, onda 2: Testcontainers (fiel, requer Docker) vs. bibliotecas in-memory (mais rápido, menos fiel) para Mongo.
- Fase 6: republicar todos os pacotes com bump patch após SourceLink/ README, ou deixar para o próximo release natural de cada pacote?
- Fase 5:
[Obsolete]deCommon— remover em bump major agora ou manter até 7.0?