Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
9f8e084
docs: adiciona ROADMAP com plano de qualidade nota 10
claude Jun 12, 2026
6ce4126
chore: quick wins de CI e higiene (Fase 1 do ROADMAP)
claude Jun 12, 2026
b361024
test: move EF.Tests para tests/ e inclui na solution (Fase 2)
claude Jun 12, 2026
a515577
chore!: remove árvores legadas NetFull, NetCore, src/NetCore, DP e Sh…
claude Jun 12, 2026
6789171
ci: adiciona Dependabot, CodeQL e cobertura no CI de PR (Fase 8 parcial)
claude Jun 12, 2026
48e317e
test: suítes para Common, Security, Image, Data, Domain, EF, Mailer e…
claude Jun 12, 2026
5e5c78a
docs: README raiz atualizado, CONTRIBUTING e READMEs por pacote (Fase…
claude Jun 12, 2026
9a962bc
docs: reescreve READMEs de Data, EF, Mongo, NH, Storage e Mailer
claude Jun 12, 2026
790da93
wip(test): snapshot parcial das suítes em escrita (Mongo/NH e camada …
claude Jun 12, 2026
cf235e1
test: suítes para Mongo (EphemeralMongo + replica set) e NH (SQLite) …
claude Jun 12, 2026
3a2db7c
wip(test): snapshot parcial das suítes da camada Api em escrita
claude Jun 12, 2026
0d87903
test: suítes para DynamicLinq, Api.Dto, Application, Api.Client, Api …
claude Jun 12, 2026
fb386f4
chore: liga nullable, analyzers, TreatWarningsAsErrors e SourceLink g…
claude Jun 12, 2026
92c0599
ci: build determinístico (ContinuousIntegrationBuild) quando em GitHu…
claude Jun 12, 2026
fb64f54
wip: snapshot parcial da anotação nullable em andamento
claude Jun 12, 2026
2e06612
refactor(common): anotações nullable e conformidade com analyzers (Fa…
claude Jun 12, 2026
3cc3e8f
wip: snapshot parcial da anotação nullable (pacotes restantes)
claude Jun 12, 2026
230ed23
refactor: anotações nullable em todos os pacotes e regime estrito ver…
claude Jun 12, 2026
ba87eec
feat: package validation com baseline do NuGet.org em todos os pacote…
claude Jun 12, 2026
3039873
chore: tags/descrições por pacote, snupkg nos artifacts, coverlet e í…
claude Jun 12, 2026
2c6c2a5
wip: snapshot parcial das XML docs de Domain/Data em escrita
claude Jun 12, 2026
aef2440
docs(domain,data): XML docs completas com CS1591 como erro + gate de …
claude Jun 12, 2026
5f8a80b
chore(release): bump minor de todos os pacotes (6.4.0 / core 6.5.0)
claude Jun 15, 2026
8bff14a
ci: neutraliza AppVeyor com no-op (build/test off)
claude Jun 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
53 changes: 53 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,56 @@ insert_final_newline = true
# Windows-only batch/cmd scripts must stay CRLF.
[*.{cmd,bat}]
end_of_line = crlf

# ---------------------------------------------------------------------------
# C#: indentação e analisadores .NET (ROADMAP Fase 5)
# ---------------------------------------------------------------------------
[*.cs]
indent_style = space
indent_size = 4

# Regras de design/perf/estilo rebaixadas para suggestion: corrigi-las exige
# mudanças de código que ficam para PRs incrementais dedicados (visíveis na
# IDE, sem quebrar o build). Subir a severidade conforme forem resolvidas.
dotnet_diagnostic.CA1304.severity = suggestion
dotnet_diagnostic.CA1305.severity = suggestion
dotnet_diagnostic.CA1310.severity = suggestion
dotnet_diagnostic.CA1311.severity = suggestion
dotnet_diagnostic.CA1707.severity = suggestion
dotnet_diagnostic.CA1822.severity = suggestion
dotnet_diagnostic.CA1845.severity = suggestion
dotnet_diagnostic.CA1848.severity = suggestion
dotnet_diagnostic.CA1051.severity = suggestion
dotnet_diagnostic.CA2201.severity = suggestion

# Criptografia fraca (MD5/SHA1/DES): usada apenas nos utilitários legados já
# marcados [Obsolete] em Codout.Framework.Common (Crypto). Não introduzir
# novos usos; remoção planejada para o próximo major.
dotnet_diagnostic.CA5350.severity = suggestion
dotnet_diagnostic.CA5351.severity = suggestion

[tests/**.cs]
# Projetos de teste: convenções de naming xUnit (underscores) e padrões de
# teste tornam várias regras CA inadequadas.
dotnet_analyzer_diagnostic.category-Design.severity = none
dotnet_analyzer_diagnostic.category-Naming.severity = none
dotnet_analyzer_diagnostic.category-Performance.severity = none
dotnet_analyzer_diagnostic.category-Usage.severity = suggestion
dotnet_analyzer_diagnostic.category-Globalization.severity = none
dotnet_analyzer_diagnostic.category-Security.severity = none
dotnet_analyzer_diagnostic.category-Reliability.severity = suggestion

[*.cs]
# Naming de API pública (renomear seria breaking change) e micro-otimizações:
# suggestion até serem tratados em PRs dedicados (idealmente no próximo major).
dotnet_diagnostic.CA1716.severity = suggestion
dotnet_diagnostic.CA1720.severity = suggestion
dotnet_diagnostic.CA1200.severity = suggestion
dotnet_diagnostic.CA1309.severity = suggestion
dotnet_diagnostic.CA1507.severity = suggestion
dotnet_diagnostic.CA1850.severity = suggestion
dotnet_diagnostic.CA1859.severity = suggestion
dotnet_diagnostic.CA1861.severity = suggestion
dotnet_diagnostic.CA1862.severity = suggestion
dotnet_diagnostic.CA1873.severity = suggestion
dotnet_diagnostic.CA2208.severity = suggestion
22 changes: 22 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
version: 2
updates:
- package-ecosystem: "nuget"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
open-pull-requests-limit: 5
groups:
# Agrupa updates minor/patch num PR só; majors saem individualmente
# para revisão de breaking changes.
nuget-minor-patch:
update-types: ["minor", "patch"]

- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
groups:
actions:
patterns: ["*"]
44 changes: 44 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
name: CodeQL

on:
push:
branches: ["master"]
pull_request:
branches: ["master"]
schedule:
- cron: "30 5 * * 1"

jobs:
analyze:
name: Analyze (csharp)
runs-on: ubuntu-latest
permissions:
security-events: write
packages: read
actions: read
contents: read

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 10.0.x

- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: csharp
build-mode: manual

- name: Build
run: |
dotnet restore Codout.Framework.sln
dotnet build Codout.Framework.sln --no-restore --configuration Release

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
with:
category: "/language:csharp"
6 changes: 4 additions & 2 deletions .github/workflows/core-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ env:
DOTNET_NOLOGO: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
CONFIGURATION: Release
TEST_PROJECT: NetCore/Codout.Framework.EF.Tests/Codout.Framework.EF.Tests.csproj
TEST_PROJECT: tests/Codout.Framework.EF.Tests/Codout.Framework.EF.Tests.csproj
DEFAULT_PROJECTS: >-
Codout.Framework.Data/Codout.Framework.Data.csproj
Codout.Framework.Domain/Codout.Framework.Domain.csproj
Expand Down Expand Up @@ -101,7 +101,9 @@ jobs:
uses: actions/upload-artifact@v4
with:
name: codout-framework-core-nupkg
path: ./artifacts/*.nupkg
path: |
./artifacts/*.nupkg
./artifacts/*.snupkg
if-no-files-found: error

publish:
Expand Down
38 changes: 34 additions & 4 deletions .github/workflows/dotnet.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
# This workflow will build a .NET project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net
# CI de PR/push: build + testes da solution completa.

name: .NET

Expand All @@ -9,6 +8,10 @@ on:
pull_request:
branches: [ "master" ]

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
build:

Expand All @@ -19,10 +22,37 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 9.0.x
dotnet-version: 10.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Test
run: dotnet test --no-build --verbosity normal
run: dotnet test --no-build --verbosity normal --collect:"XPlat Code Coverage" --results-directory ./coverage
- name: Coverage gate
# Ratchet: começa em 45% (cobertura atual ~47%) e deve SUBIR conforme a
# suíte crescer — nunca baixar. Falha o CI se a cobertura de linhas dos
# assemblies Codout.* cair abaixo do piso.
run: |
python3 - <<'EOF'
import glob, sys, xml.etree.ElementTree as ET
THRESHOLD = 45.0
hit = total = 0
for f in glob.glob('coverage/**/coverage.cobertura.xml', recursive=True):
for pkg in ET.parse(f).getroot().iter('package'):
if not pkg.get('name', '').startswith(('Codout', 'Softprime')):
continue
for line in pkg.iter('line'):
total += 1
hit += int(line.get('hits', '0')) > 0
pct = 100 * hit / total if total else 0.0
print(f'Cobertura de linhas (Codout.*): {pct:.1f}% (piso: {THRESHOLD}%)')
sys.exit(0 if pct >= THRESHOLD else 1)
EOF
- name: Upload coverage
uses: actions/upload-artifact@v4
if: always()
with:
name: coverage
path: ./coverage
retention-days: 14
4 changes: 3 additions & 1 deletion .github/workflows/mass-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,9 @@ jobs:
uses: actions/upload-artifact@v4
with:
name: codout-framework-all-nupkg
path: ./artifacts/*.nupkg
path: |
./artifacts/*.nupkg
./artifacts/*.snupkg
if-no-files-found: error

- name: Push to NuGet.org
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,9 @@ jobs:
uses: actions/upload-artifact@v4
with:
name: ${{ steps.resolve.outputs.package }}-nupkg
path: ./artifacts/*.nupkg
path: |
./artifacts/*.nupkg
./artifacts/*.snupkg
if-no-files-found: error

publish:
Expand Down
48 changes: 48 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,54 @@ A partir desta entrada cada pacote NuGet é versionado individualmente
`Directory.Build.props`). As entradas abaixo identificam o pacote e a
versão afetados.

## 2026-06-15

> Bump **minor** coordenado de todos os pacotes publicáveis, preparando o
> release das melhorias descritas em 2026-06-12 (testes, nullable, SourceLink,
> READMEs, package validation, correção de vulnerabilidade do Mongo). **Ainda
> não publicado** — as tags só serão criadas após merge na master e revisão.
> O `PackageValidationBaselineVersion` de cada pacote permanece apontando para
> a última versão publicada (6.3.0 / 6.4.0), garantindo a checagem de
> compatibilidade no `pack`.

### Versionamento

- `6.3.0 → 6.4.0`: Api, Api.Client, Api.Dto, Application, Common, DynamicLinq, Image.Extensions, Mailer, Mailer.AWS, Mailer.Razor, Mailer.SendGrid, Mongo, Multitenancy, Softprime.Multitenancy, NH, Security.Core, Security.Argon2, Security.Bcrypt, Security.Scrypt, Storage, Storage.Azure.
- `6.4.0 → 6.5.0`: Data, Domain, EF.
- `Codout.Framework.Mcp` segue o próprio ciclo (`mcp-release.yml`) e não foi bumpado aqui.

## 2026-06-12

> Mudanças abaixo ainda **não publicadas** no NuGet.org — os bumps de versão
> acontecerão na próxima release de cada pacote.

### Tests

- Fase 4 do ROADMAP concluída: **921 testes** em 18 projetos sob `tests/`, cobrindo os 24 pacotes publicáveis (Common, Security, Image, Data, Domain, EF com SQLite, Mongo com mongod efêmero + replica set, NH com SQLite, Mailer + AWS/SendGrid/Razor com mocks e Razor real, Storage, Storage.Azure, DynamicLinq, Api.Dto, Application, Api.Client, Api, Multitenancy). Bugs pré-existentes encontrados foram **caracterizados** (testes documentam o comportamento atual, sem alterá-lo) e catalogados em `tests/FINDINGS-{A..E}.md` para triagem.

### Build

- `Directory.Build.props`: ligados globalmente `Nullable`, `TreatWarningsAsErrors`, analyzers .NET (`latest-recommended`), `GenerateDocumentationFile` (CS1591 suprimido até completar as docs por pacote), SourceLink (GitHub), símbolos `snupkg`, `PackageLicenseExpression MIT` e build determinístico em CI. `.editorconfig` calibra regras CA de estilo/perf como suggestion (subir severidade é trabalho incremental).
- **Package validation**: todos os 24 csproj publicáveis têm `EnablePackageValidation` + `PackageValidationBaselineVersion` apontando para a última versão no NuGet.org — o `pack` falha se a API pública quebrar vs. a baseline. A validação já reverteu duas quebras acidentais durante a anotação nullable (CP0001 em `LimitedList.Enumerator`, CP0021 em `JsonExtensions`).
- `Directory.Build.targets`: `README.md` de cada pasta de pacote é embarcado automaticamente como `PackageReadmeFile` no nupkg.
- Anotações **nullable** em todos os pacotes refletindo o contrato real (ex.: `IRepository<T>.GetAsync`/`LoadAsync` agora declaram `Task<T?>`). Sem mudança de comportamento — apenas metadados; consumidores com nullable habilitado podem ver warnings novos (e verdadeiros).

### Codout.Framework.Mongo (não publicado)

#### Fixed
- `MongoDB.Driver` 3.7.0 → 3.9.0, eliminando vulnerabilidades conhecidas nos transitivos `SharpCompress` 0.30.1 (moderada) e `Snappier` 1.0.0 (alta).

### Repository

- Removidas as árvores legadas `NetFull/`, `NetCore/`, `src/NetCore/` (Cosmos/DocumentDB em `netcoreapp2.0`, EOL), `Codout.Framework.DP` (quebrado, referenciava `Codout.Framework.DAL` inexistente), `Shared/Codout.Framework.Shared.Commom` e `Shared.msbuild`. Nenhum desses projetos era publicado no NuGet (`IsPackable=false` ou fora de `.github/release-packages.json`); o histórico permanece no git. O typo "Commom" deixa de existir no repositório.
- Removido `appveyor.yml` (referenciava Visual Studio 2012; o pipeline real é GitHub Actions).
- `Codout.Framework.Api.Dto` e `Softprime.Multitenancy` adicionados à `Codout.Framework.sln`; `Softprime.Multitenancy` passou a usar `obj`/`bin` isolados para coexistir com `Codout.Multitenancy` na mesma pasta sem corromper o restore.
- Testes movidos para a pasta `tests/` na raiz e incluídos na solution — `dotnet test Codout.Framework.sln` (CI de PR e gate do `release.yml`) agora executa os testes de verdade. `core-release.yml` atualizado para o novo caminho.

### Build

- `dotnet.yml`: SDK do CI atualizado de 9.0.x para 10.0.x, alinhado ao `TargetFramework` `net10.0` do `Directory.Build.props`.

## 2026-05-12

### Build
Expand Down
10 changes: 3 additions & 7 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,11 @@ Quando o usuário pedir "gerar nova versão e publicar do pacote X" (ou equivale
- **Codout.Framework.Mcp**: usa workflow próprio (`.github/workflows/mcp-release.yml`) com passo `--validate` específico do CLI. Tag deve ser `mcp-v<X.Y.Z>` (NÃO use `mcp` como short-name no `release.yml` — está intencionalmente bloqueado por padrão de tag para evitar duplo release).
- **Mass release** (todos os pacotes de uma vez via `.github/workflows/mass-release.yml`): só execute se o usuário pedir explicitamente "mass release" ou "publicar todos". Mesmo assim, oriente o usuário a disparar via Actions UI com `dry_run: true` primeiro e revisar os artifacts antes de re-disparar com `dry_run: false`. Não tente disparar pela CLI sem autorização explícita.

## Pacotes excluídos do release automatizado
## Projetos legados removidos

Os seguintes csproj têm `<IsPackable>false</IsPackable>` e **não** estão em `.github/release-packages.json`. Não tente publicá-los antes de modernizá-los:
Em 2026-06-12 as árvores legadas foram **removidas do repositório** (histórico preservado no git): `NetFull/`, `NetCore/`, `src/NetCore/` (Cosmos/DocumentDB), `Codout.Framework.DP`, `Shared/` e `Shared.msbuild`. Nenhum deles era publicado no NuGet. Se o usuário pedir por um deles (ex.: suporte a Cosmos), a recomendação é recriar do zero como pacote moderno (ex.: `Codout.Framework.Cosmos` com SDK `Microsoft.Azure.Cosmos`) — não recuperar o código antigo do histórico sem modernizá-lo.

- `Codout.Framework.DP` — implementa um `IRepository<T>` antigo (sem `Where`, `AllReadOnly`, `WherePaged`, `Refresh`, overloads de `CancellationToken`, etc.) e referencia a pasta legada `Codout.Framework.DAL` que não existe mais.
- `src/NetCore/Codout.Framework.NetCore.Repository.Cosmos` — `netcoreapp2.0` (fora de suporte), SDK legado `Microsoft.Azure.DocumentDB.Core`, refs pra projetos `NetStandard.*` que sumiram do repo.
- `src/NetCore/Codout.Framework.NetCore.Repository.DocumentDB` — idem.

Se o usuário pedir pra publicar um deles, **avise que está deprecated** e pergunte se quer fazer o port completo antes (não tente packar como está — vai falhar).
Os shared projects ativos na raiz (`Codout.Framework.Api.Shared`, `Codout.Framework.Dto.Shared`) **não** são legados — são `.shproj` importados por Api, Api.Client, Api.Dto e Application.

## Cuidados ao usar `dotnet pack`

Expand Down
49 changes: 49 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Contribuindo com o Codout.Framework

Obrigado pelo interesse em contribuir! Este guia resume o essencial.

## Antes de começar

- Procure uma [issue existente](https://github.com/Codout/Codout.Framework/issues)
ou abra uma nova descrevendo o problema/proposta antes de PRs grandes.
- O repositório usa UTF-8 (sem BOM), LF e newline final — já configurado em
`.editorconfig`.

## Fluxo

1. Faça um fork e crie uma branch: `git checkout -b feature/minha-mudanca`
2. Implemente a mudança **com testes** (os projetos de teste ficam em `tests/`)
3. Garanta build e testes verdes:
```bash
dotnet build Codout.Framework.sln
dotnet test Codout.Framework.sln
```
4. Abra um Pull Request descrevendo motivação e impacto

## Commits

Seguimos [Conventional Commits](https://www.conventionalcommits.org/pt-br/):
`fix:`, `feat:`, `chore:`, `docs:`, `ci:`, `refactor:`, `test:` — com escopo
opcional pelo nome curto do pacote (ex.: `fix(ef): ...`). Mensagens em modo
imperativo, primeira linha com até 72 caracteres.

## Versionamento e releases

- Cada pacote tem `<Version>` no próprio `.csproj` e segue
[SemVer](https://semver.org) — não versione pacotes que sua mudança não toca.
- O CHANGELOG.md é por pacote, sob a data da mudança.
- Releases são disparados por tag (`<short-name>-v<X.Y.Z>`) e publicados no
NuGet.org via GitHub Actions. O mapeamento de nomes curtos está em
`.github/release-packages.json`. Criação de tags é responsabilidade dos
mantenedores.

## Compatibilidade

- Mudanças que quebram API pública exigem bump **major** e destaque no
CHANGELOG.
- Não remova membros `[Obsolete]` fora de um major.

## Licença

Ao contribuir, você concorda que sua contribuição será licenciada sob a
[MIT License](LICENSE).
Loading
Loading