ADR 0270 — O brabo-contracts é publicado no GitHub Packages, com o shared só de tipos
- Status: aceito (decisões do dono de 06/11 e 07/11/2026, AT-770)
- Data: 2026-11-08
- Tema:
engenharia - Referencia: revisa o item 2 do ADR 0252 ("consumido como dependência git por TAG"), sem editá-lo, e o "Stack decidida" do
CLAUDE.mddobrabo-contracts. Mantém a origem dos tipos do web do ADR 0116 e usa a cadeia do ADR 0280. RN-1037 a RN-1041, nos repos que as testam.
Contexto
O brabo-contracts (shared, docker-port, areas.json, fluxo.yml) era consumido por dependência git em uma TAG. Em 06/11 havia quatro tags em uso ao mesmo tempo, o pnpm-lock.yaml reescrito inteiro quebrou o CI do broker (broker#14), o engine lia as constantes do docker-cli.ts por um arquivo TypeScript, e o runner carregava um loader (strip-node-modules.mjs) por causa do type stripping. O broker instalava git na imagem só para resolver a dependência.
O levantamento comparou manter a TAG com um check (A+), publicar no npmjs (B) e gerar um SDK da api (C). O dono escolheu arrumar o mecanismo e publicar como lib já, no GitHub Packages. Fatos que mandam: o registry npm do GitHub só aceita pacote com escopo, o escopo é a org dona (@viralabs-dev), instalar pede token (até pacote público) e só aceita PAT classic fora do Actions. O npm publish --provenance só está documentado para o npmjs.
Decisão
- Dois pacotes,
@viralabs-dev/brabo-sharede@viralabs-dev/brabo-docker-port, públicos (decisão do dono), publicados no GitHub Packages pela TAG. Os dois saem sempre com a mesma versão, a da TAG:vX.Y.Z-dev.Ncom o dist-tagdev, a finalvX.Y.Zcomlatest. O consumidor fixa a versão exata, sem^. A versão é escrita pelo workflow a partir da TAG, sem commit. - O import não muda: o consumidor usa o alias do pnpm (
"@brabo/shared": "npm:@viralabs-dev/brabo-shared@1.2.0", idem@brabo/docker-port). Renomear os imports custaria cerca de 150 arquivos e não ganha nada. - O
sharedcontinua só com tipos, mesmo comdist: nenhumexportde valor sobrevive (RN-1037). A regra "só o broker fala com o socket" também fica: o specapi-nao-consome-docker-portda api não sai. - Publicação no
brabo-ci: o reutilizávelpublish-npm.ymlfazpnpm pack, atesta os.tgzcomactions/atteste publica o mesmo arquivo atestado. Sem--provenance. Obrabo-contractso chama pelopublish.ymlna TAG, que o token do App empurra (oGITHUB_TOKENnão dispararia o workflow). - Token por ponto de instalação. CI dos consumidores:
GITHUB_TOKENcompackages: readesetup-nodecomregistry-urlescope. Dev local: PAT classic só comread:packagesem~/.npmrc; o repo versiona só a linha do registry, nunca o token. Docker (build e dev): secret do BuildKit, nuncaARG,ENVnem camada (RN-1039). install.sh --source=ghcrnão muda.--source=localexige o PAT (decisão do dono, P2): confere o~/.npmrcantes e, semread:packages, para dizendo como criar o token.- O runner do npmjs não depende do GitHub Packages:
dependenciesnão declara@viralabs-dev/*(RN-1040). O contracts continua devDependency embutida pelotsup. - Os dados continuam por raw na TAG (
areas.json,fluxo.yml). Odocker-cli.jsonpassa a ser o espelho das constantes dodocker-cli.ts(RN-1041), e o engine o lê no lugar do.ts. O engine continua sem npm. - Uma versão para todos: a chave
contractsdocomponentes.json({ "repo": "viralabs-dev/brabo-contracts", "tag": "v1.2.0" }) é a fonte da versão vigente. O checkcontracts-alinhadodobrabo-cireprova versão diferente entrepackage.json, lock e scripts de download do mesmo repo (RN-1038), e só avisa se o repo difere docomponentes.json. Ele não é obrigatório. - A chave
contractsnão entra na travapins-dos-componentes. O contracts não tem Release (só TAG), e a trava mede Release final. Quem a cobrar um dia declara a régua dele (TAG, não Release).
Consequências
- Acabam as quatro tags em uso, a reescrita do lock inteiro (o
subir-contracts.shdobrabo-cirecusa diff fora das duas entradas) e ogitna imagem do broker. Odistdá semver e integridade sha512 no lock. - Uma queda do
npm.pkg.github.comderruba build de imagem, CI e dev local, o que antes só o github.com fazia. - Quem constrói de fonte (
--source=local, inclusive contribuidor de fora) precisa de conta GitHub e PAT. - Sem
--provenance: o atestado do.tgzo substitui, e a publicação vale mesmo se o atestado precisar de ajuste. - O Dependabot de npm segue só em segurança (limite 0). O
GITHUB_TOKENdele basta se o repo estiver em "Manage Actions access"; se falhar, o plano B é oregistriescom PAT. - Sai um
-dev.Npor merge nadev. A limpeza das versões antigas fica para depois. - Fora de escopo: o SDK da api (C), que, se um dia existir, mora no
brabo-api, e o npmjs público. - A página do PAT (passo a passo) fica como entrega à parte, ainda sem ADR próprio.
Referências
- AT-770 (levantamento de 06/11, plano da R222 e decisões do dono), AT-764, AT-796 (a trava de pins que deixa o contracts fora).