feat(worktree-cli): inherit non-port env vars from main worktree#33
Merged
Conversation
Adiciona `inheritEnvFromMain` ao `WorktreeConfig`: lista de arquivos cujas linhas `KEY=VALUE` devem ser anexadas, no fim do `setup`, ao arquivo correspondente do novo worktree. Chaves já presentes (tipicamente as escritas por `writeFiles` — `PORT`, `VITE_API_URL`) NÃO são sobrescritas; só as ausentes são anexadas. Motivação: até hoje o `setup` só escrevia as chaves de porta nos `.env.local` de cada app, exigindo que cada operador manualmente copiasse Cognito/Stripe/S3/DynamoDB/etc. do worktree principal antes de levantar o dev server. O sintoma era opaco — a API caía com 404 `NoSuchBucket` ou 500 sem `STRIPE_SECRET_KEY`, e cada worktree novo quebrava do mesmo jeito. Mudanças: - `WorktreeConfig.inheritEnvFromMain?: string[]` documentado - Helper puro `parseEnvKeys` / `buildInheritedAppend` em `src/env-merge.ts` (testável sem I/O) - `setup.ts` invoca o helper após `writeFiles`, ignora silenciosamente arquivos ausentes em main, registra `inherited N key(s) into <path>` - Tests com `node:test` (sem vitest, sem nova devDep): 13 unitários + 1 integração que faz `git worktree add` real em tmpdir - README com exemplo platform + nota explicando quando usar Repo-side adoption: cada repo que quiser este comportamento adiciona `inheritEnvFromMain` ao bloco `worktree` no `package.json`. Sem essa config, o comportamento atual fica intacto.
Automated Review — Round 1SummaryThe PR implements a mechanism for inheriting environment variables from the main worktree's Changes
🔍 Found 3 suggestions (see inline comments) Reviewed by OpenAI gpt-4o-mini (fallback) | 5,246 in / 257 out | $0.0009 — Round 1 of 2 |
…ritEnvFromMain Substitui nomes de fornecedores específicos no .env.local sintético por chaves neutras (INHERIT_KEY_A/B). O teste valida cópia chave-a-chave; a identidade das chaves é irrelevante para o que está sendo testado e manter nomes de fornecedores em um repo público enumera dependências internas sem necessidade. Refs: #33
Automated Review — Round 2 (Final)SummaryIntegration tests have been updated to reflect changes in environment variable names, providing accurate validation of inherited keys. Changes
✅ No issues found Reviewed by OpenAI gpt-4o-mini (fallback) | 894 in / 46 out | $0.0002 — Round 2 (Final); no further reviews will be performed |
precisa-saude-release-bot Bot
pushed a commit
that referenced
this pull request
May 13, 2026
## [1.9.0](v1.8.0...v1.9.0) (2026-05-13) ### Features * **worktree-cli:** inherit non-port env vars from main worktree ([#33](#33)) ([f57528b](f57528b)) ### CI/CD * bump pnpm/action-setup para v5 (Node.js 24) ([#30](#30)) ([a50119c](a50119c)) ### Chores * **templates:** adicionar environment gate npm-publish no _publish.yml ([#31](#31)) ([f7f7d23](f7f7d23))
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Resumo
Adiciona suporte a
inheritEnvFromMainnoWorktreeConfig— lista de arquivos.env.localcujas chavesKEY=VALUEosetupdeve copiar do worktree principal para o novo worktree (sem sobrescrever as chaves que o próprio CLI escreveu viawriteFiles, ex.:PORT,VITE_API_URL).Motivação
Criar um worktree novo em um monorepo com vários serviços exige passos manuais não-óbvios antes de levantar dev servers:
ERR_MODULE_NOT_FOUNDlendopackages/*/dist/index.js. Isso é solucionável só com config do repo (buildCommand), sem mudança no CLI..env.localprincipal para os arquivos do worktree. O CLI hoje só escreve as chaves de porta viawriteFiles. Isso requer essa mudança no CLI.Sintoma observado pelos consumidores: a API sobe e o primeiro request falha por falta de credenciais. Cada worktree novo quebra do mesmo jeito até alguém lembrar de copiar o env.
Como funciona
inheritEnvFromMain: ['apps/api/.env.local', 'apps/web/.env.local']nopackage.json#worktree.writeFiles, osetuplê cada arquivo no worktree principal, extrai as linhasKEY=VALUE, e anexa ao arquivo correspondente no novo worktree apenas as chaves ausentes. As linhas escritas porwriteFiles(porta,VITE_API_URLetc.) ficam autoritativas.# Inherited from main worktree by precisa-worktree setupsepara as linhas anexadas para rastreabilidade.skip <path>, sem erro.Implementação
src/env-merge.ts: helpers purosparseEnvKeys/buildInheritedAppend(sem I/O, fácil de testar).src/commands/setup.ts: chama o helper apóswriteFiles, faz I/O e logging.src/index.ts: re-exportasetup,buildInheritedAppend,parseEnvKeyspara uso programático.test/env-merge.test.mjs: 13 testes unitários cobrindo parser, dedup, headers, edge cases.test/setup-inherit.integration.test.mjs: 1 teste end-to-end que fazgit worktree addreal em tmpdir e verifica que as chaves herdadas aparecem no destino.node --testnativo (Node 22+). Sem nova devDep.Test plan
pnpm --filter=@precisa-saude/worktree-cli test— 14 passampnpm --filter=@precisa-saude/worktree-cli typecheck— limpopnpm --filter=@precisa-saude/worktree-cli build— limpopackage.json#worktreedo consumidor para adotarinheritEnvFromMain+buildCommand(PR separado).