Todo arquivo criado ou editado neste repositório deve ser salvo em UTF-8 (sem BOM, salvo quando o tipo de arquivo o exigir). Não introduza nem preserve conteúdo em Windows-1252, ISO-8859-1 ou qualquer outra codificação de byte único. Se encontrar um arquivo legado em outra codificação, converta para UTF-8 antes de editar.
Convenção do repositório (também declarada em .editorconfig):
charset = utf-8end_of_line = lf(CRLF apenas em*.cmd/*.bat)insert_final_newline = true
- Cada
.csprojpublicável tem seu próprio<Version>. A versão NÃO é mais centralizada emDirectory.Build.props— não reintroduza-a lá. - O mapeamento
short-name → caminho.csprojestá em.github/release-packages.json. Sempre consulte esse arquivo para resolver o nome curto de um pacote. - Versionamento segue SemVer. Em caso de ambiguidade sobre o nível de bump, pergunte ao usuário (patch / minor / major) usando
AskUserQuestion.
Quando o usuário pedir "gerar nova versão e publicar do pacote X" (ou equivalente), siga exatamente esta sequência. Se o usuário pedir apenas "bumpar" / "preparar release" sem mencionar "publicar", pare antes do passo 6 (não criar tag).
- Resolva pacote + bump level. Se o usuário não foi explícito:
- Use
.github/release-packages.jsonpara listar os nomes curtos válidos. - Use
AskUserQuestionpara confirmar o pacote e/ou o nível de bump quando não estiver óbvio pela natureza das mudanças.
- Use
- Bump no
.csprojdo pacote alvo. Edite apenas o<Version>daquele projeto. NÃO toque em outros.csprojnem emDirectory.Build.props. - Atualize
CHANGELOG.mdseguindo o formato per-pacote já estabelecido:Se já existe uma seção sob a data de hoje, complemente em vez de duplicar o cabeçalho. Para mudanças cross-cutting (workflow, build, encoding, etc.) use## YYYY-MM-DD ### Codout.Framework.X 6.A.B #### Fixed | Added | Changed | Removed - Descrição em português, frase começando com letra maiúscula.
### Buildou### Repositorysob a mesma data. - Commit no padrão Conventional Commits, com o tipo refletindo a mudança (
fix,feat,chore,docs,ci,refactor) e escopo opcional usando o short-name (fix(ef): ...,chore(mailer-razor): ...). Mensagem em modo imperativo, primeira linha ≤ 72 chars, footerhttps://claude.ai/code/session_<id>. - Push do commit para o branch de trabalho (geralmente
claude/*ou direto emmasterse o usuário autorizar). Confirme que o commit está emorigin/masterantes do passo seguinte:Se não estiver em master, pare e avise o usuário — o workflowgit fetch origin master --quiet git merge-base --is-ancestor HEAD origin/master && echo "on master" || echo "NOT on master"
release.ymlrejeita tags fora de master. - Crie e push da tag no formato
<short>-v<X.Y.Z>:Isso disparagit tag <short>-v<X.Y.Z> git push origin <short>-v<X.Y.Z>
.github/workflows/release.yml, que builda, rodadotnet testna solution e publica no NuGet.org viasecrets.NUGET_API_KEY. Pushar a tag é a ação que realmente publica. Só faça nesse passo se a intenção do usuário foi "publicar". Caso contrário, pare no passo 5 e relate o estado. - Relate ao usuário os SHAs do commit, o nome da tag, e link para a run do workflow no GitHub Actions assim que disponível.
- Codout.Framework.Mcp: usa workflow próprio (
.github/workflows/mcp-release.yml) com passo--validateespecífico do CLI. Tag deve sermcp-v<X.Y.Z>(NÃO usemcpcomo short-name norelease.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 comdry_run: trueprimeiro e revisar os artifacts antes de re-disparar comdry_run: false. Não tente disparar pela CLI sem autorização explícita.
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.
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.
NUNCA passe -p:Version= no dotnet pack. Essa propriedade cascateia para TODOS os projetos do build (incluindo ProjectReference), o que reescreve silenciosamente a versão das dependências no .nuspec gerado e produz pacotes com deps quebradas (ex.: Codout.Framework.EF 6.3.0 declarando Codout.Framework.Data >= 6.3.0 quando Data está em 6.2.2 no csproj). Para sobrescrever a versão do pacote alvo sem cascatear, use apenas -p:PackageVersion=. Os workflows já fazem assim — se for criar um novo, siga o mesmo padrão.
- ❌ Reintroduzir
<Version>emDirectory.Build.props. - ❌ Bumpar pacotes que não foram tocados pela mudança — cada pacote anda no próprio ritmo.
- ❌ Criar / pushar tag sem o usuário ter pedido "publicar" (a tag é a ação visível externamente que publica no NuGet.org).
- ❌ Disparar
mass-release.ymlsem o usuário pedir explicitamente, nem mesmo viagh workflow run. - ❌ Adivinhar nível de bump em mudanças ambíguas — pergunte.
- ❌ Skippar a verificação de master-ancestry antes de criar a tag.