teqo/docs/plans/ops54-pnpm-warning-onlybuiltdependencies-impl.md
Francisco Solla 64ea0dbab9
All checks were successful
Agent PR Ready + auto-merge / ready-automerge (pull_request) Has been skipped
CI (PR) / docs-guards (pull_request) Successful in 7s
CI (PR) / plans-only-closes (pull_request) Successful in 8s
CI (PR) / scope (pull_request) Successful in 34s
CI (PR) / lint (pull_request) Successful in 46s
CI (PR) / format (pull_request) Successful in 56s
CI (PR) / typecheck (pull_request) Successful in 38s
CI (PR) / knip (pull_request) Successful in 39s
CI (PR) / cycles (pull_request) Successful in 37s
CI (PR) / unit (pull_request) Successful in 53s
CI (PR) / int (pull_request) Successful in 2m37s
CI (PR) / build (pull_request) Successful in 3m39s
CI (PR) / e2e (2) (pull_request) Successful in 5m25s
CI (PR) / e2e (1) (pull_request) Successful in 5m43s
CI (PR) / checks (pull_request) Successful in 1s
Promote plan-issue Related on main merge / plan-issue-ready (pull_request) Has been skipped
Main merge flips claimed issues to done + in-prod / issue-done (pull_request) Successful in 13s
Agent pool supervisor / tick (pull_request) Successful in 34s
CI / static (push) Successful in 2m35s
CI / int (push) Successful in 2m45s
CI / build (push) Successful in 3m31s
CI / e2e (1) (push) Successful in 5m28s
CI / e2e (2) (push) Successful in 4m14s
CI / checks (push) Successful in 1s
CI / deploy homeserver (teqo-1313) (push) Successful in 8m57s
ops(OPS54): allowlist onlyBuiltDependencies migra para pnpm-workspace.yaml — fim do warning do pnpm 10 sobre o campo pnpm ignorado
2026-08-18 09:06:37 -03:00

5.4 KiB
Raw Blame History

Impl: Acabar com o warning do pnpm sobre pnpm.onlyBuiltDependencies ignorado

Status: aprovado Atualizado em: 2026-08-18 Issue: #12 Intenção: docs/plans/ops54-pnpm-warning-onlybuiltdependencies.md Appetite restante: herdado (~2–4 h; executável em bem menos — mudança de 3 arquivos)

Leitura da intenção

  • Outcome: nenhum comando pnpm (terminal, CI, Dockerfile) imprime o [WARN] do campo pnpm; a allowlist onlyBuiltDependencies (sharp, esbuild, unrs-resolver) volta a ser honrada no lugar canônico que o pnpm 10 aponta.
  • O que NÃO negociar: .npmrc intocado (legacy-peer-deps, include); packageManager intocado; grafo de dependências inalterado (pnpm install --frozen-lockfile continua passando); nada além do que o warning cita é migrado.
  • O que reavaliar: a hipótese da intenção já é a abordagem correta (pnpm-workspace.yaml). Ponto novo verificado empiricamente com a versão pinada (10.11.0): pnpm-workspace.yaml sem o campo packages funciona (single-package repo vira workspace de raiz, default ['.']); o lockfile existente só tem um importer raiz — consistente.

Abordagem recomendada

flowchart LR
  A[package.json\nremove campo pnpm] --> C[pnpm-workspace.yaml\nonlyBuiltDependencies]
  B[Dockerfile deps\n+ COPY pnpm-workspace.yaml] --> D[pnpm install --frozen-lockfile\nsem warning, allowlist honrada]
  C --> D

Opções consideradas: A (pnpm-workspace.yaml — recomendado) | B (.npmrc) | C (manter campo + ignorar) Recomendação: A — é o novo home canônico de settings do pnpm 10 e o destino que o próprio warning aponta; validado empiricamente com a versão pinada (10.11.0): sem warning, pnpm config get onlyBuiltDependencies → sharp,esbuild,unrs-resolver, --frozen-lockfile limpo. Rejeitadas:

  • B (.npmrc): ainda suportado, mas caminho legado para este tipo de setting; o guardrail da intenção proíbe tocar .npmrc (e não há warning pedindo isso).
  • C (ignorar): falha o aceite (warning persiste + allowlist continua ignorada).
  • (implicita) manter o campo pnpm: o warning só some com a remoção do campo — a config no novo lugar não silencia o aviso.

Componentes / mudanças

  • pnpm-workspace.yaml (novo, raiz): onlyBuiltDependencies: [sharp, esbuild, unrs-resolver]. Sem campo packages (default ['.'] em pnpm 10.7+; repo single-package — validado). Sem comentários.
  • package.json: remover o bloco "pnpm": { "onlyBuiltDependencies": [...] } (linhas 186–192). Nada mais no arquivo muda.
  • Dockerfile (estágio deps, linha atual COPY package.json pnpm-lock.yaml ./): passar a copiar também pnpm-workspace.yaml — o pnpm install --frozen-lockfile da imagem precisa da config para honrar a allowlist (sem ela, local e Docker divergiriam: local rodaria os builds de sharp/esbuild/unrs-resolver, Docker não). Estágios builder/migrator usam COPY . . — o .dockerignore não exclui o YAML, já cobertos.
  • Changelog: docs/changelog/2026-08-18-ops54.md + pnpm changelog:build (OPS44).
  • Migration: sem migration (config de ferramenta).
  • Access / Consent / UI: N/A.

Dados → forma (se aplicável)

N/A — sem métricas/UI.

Fases verificáveis

  1. Config + Dockerfile — criar pnpm-workspace.yaml, remover campo pnpm, ajustar COPY do deps.
  2. Verificação local — pnpm install --frozen-lockfile (sem warning, sem diff no lockfile — git status limpo depois); pnpm config get onlyBuiltDependencies → 3 pacotes; rodada de gates: typecheck, lint, format:check, knip, check:cycles, test:unit.
  3. Docker — docker build --target deps . (não precisa de secrets) provando o estágio deps com a config nova.
  4. Gates — pnpm gate:fast; push via pnpm push; CI Forgejo verde (o CI roda pnpm install --frozen-lockfile em todos os jobs — é a prova final do warning sumindo).

Rabbit holes / Não escopo (engenharia)

  • Mover legacy-peer-deps / include do .npmrc para o YAML — fora de escopo (nenhum warning pede).
  • dangerouslyAllowAllBuilds ou re-approve de outros pacotes — fora de escopo.
  • Atualizar pnpm / packageManager — fora de escopo.
  • Comentários no YAML — não adicionar (convenção do repo); o plano + changelog documentam o porquê.

Riscos e mitigação

  • pnpm-workspace.yaml sem packages muda semântica de workspace? Baixo: pnpm 10.7+ defaulta packages: ['.']; lockfile atual tem um único importer raiz; validado no sandbox com a versão pinada (install + frozen-lockfile limpos). Se pnpm install local apontar drift, o passo 2 pega na hora.
  • Docker build sem a config no deps silenciosamente bloquearia os builds dos 3 pacotes na imagem (regressão de comportamento local×Docker): mitigado pelo COPY explícito + verificação com docker build --target deps.
  • OPS53 compartilha o Dockerfile: já resolvido — OPS53 está merged em main (6a3f61f9); sem concorrência em andamento.
  • CI com cache pnpm (pnpm/action-setup): o cache é por lockfile — inalterado — então cache: pnpm segue batendo. Sem risco.

Aceite de engenharia

  • Aceite de produto da intenção ainda coberto (warning some; allowlist honrada; .npmrc/packageManager/grafo intactos)
  • Invariantes AGENTS/engineering-standards (sem código runtime tocado; sem migration; sem DB)
  • Testes de domínio previstos: N/A (sem access/write paths); verificação empírica local + estágio Docker deps + CI como prova