3.4 KiB
OPS40 — worktree dev: PORT do .env.local não é honrado pelo next dev
Status: rascunho
Atualizado em: 2026-08-11
Issue: (OPS40 — a registrar)
Priority: P2
Model: composer-2.5
Impeccable: A — sem UI
Appetite: ~2–4h eng; um outcome verificável — dois worktrees em pnpm dev simultâneos não colidem na porta
Intenção
O contrato de ambientes paralelos (OPS24/OPS26/OPS28, AGENTS.md "Per-worktree environments") promete um dev-server por worktree em 3100+slot (ex.: C116 → 3216). O provisionador escreve PORT=<port> no .env.local do worktree — mas next dev (Next 15.4.11) não honra PORT vindo de arquivo .env: o startup log mostra "Local: http://localhost:3000" com PORT=3216 presente no .env.local (evidência colhida na sessão do C116, 2026-08-11). Consequência: dois agentes com pnpm dev rodando colidem na porta 3000 (ou um rouba a porta do outro), quebrando o isolamento que o modelo paralelo vende. O e2e escapa do defeito porque o playwright.config.ts injeta PORT explicitamente no env do webServer — o caminho manual (pnpm dev) é o exposto.
Objetivo e aceite
pnpm devnum worktree provisionado sobe em3100+slot(a porta do.env.local), não em 3000.- Dois worktrees com
pnpm devsimultâneos não colidem (cada um na sua porta). - O e2e (webServer com
PORTexplícito) e o main repo (pnpm devem 3000) ficam intactos. - O mecanismo escolhido não depende de o usuário lembrar
-p <port>.
Direção no codebase (hipótese)
package.jsonscriptdev(node scripts/guard-dev-db.mjs && cross-env NODE_OPTIONS=--no-deprecation next dev) — o script pode derivar a porta do.env.locale passarnext dev -p <port>(ou lerprocess.env.PORT— o cross-env repassa env do processo; o problema é onext devignorar env-file, então a porta precisa ir como flag CLI).- Candidatos: (a) wrapper
scripts/dev.mjsque lêPORTdo.env.local(ouprocess.env.PORTvia dotenv) e executanext dev -p <port>; (b) trocarcross-env ... next devpornext dev -p "$PORT"— masPORTdo arquivo.env.localnão está no shell — precisaria de carga explícita; (c) o próprio Next respeitarPORTde env-file (upstream — não controlável). - Verificar se o prewarm/setup e2e (que também usa
pnpm devcomo webServer command em dev-mode) não depende do comportamento atual.
Fora de escopo
- Mudar como o Next resolve porta (upstream).
- Re-provisionar worktrees existentes (o
.env.localjá tem a porta certa; só o dev server a ignora).
Rabbit holes
- Carregar
.env.localduas vezes (guard + script) com ordens conflitantes — o wrapper deve ler a MESMA fonte que o provisionador escreveu (variávelPORTdo arquivo). - Quebrar o e2e dev-mode: o webServer passa
PORTno env do processo — se o script novo der prioridade ao.env.localsobre o env do processo, o e2e perderia a porta forçada. O wrapper deve dar prioridade aoprocess.env.PORTreal (o que o webServer injeta) e cair no.env.localsó quando ausente.
Referências
scripts/lib/worktree-env.mjs(escrevePORT=${env.devPort}no.env.local)scripts/guard-dev-db.mjs(preflight dopnpm dev)playwright.config.tswebServer (env: { PORT: webServerPort }— precedente do env explícito)- Evidência da sessão C116: log
next devcom "Local: http://localhost:3000" e.env.localcomPORT=3216