Pular para o conteúdo principal

Setup do Ambiente de Desenvolvimento

O desenvolvimento é gerenciado pelo workspace front-dev, que usa o FECA CLI (Front-End Cactus CLI) — ferramenta interna que centraliza setup, dev servers e gestão de repos.

Pré-requisitos

  • Node.js 24.14.1 (versão pinada no .nvmrc do workspace)
  • pnpm >=10.0.0 (obrigatório — não use npm ou yarn)
  • Git com chave SSH configurada no GitHub
  • Um GitHub PAT com read:packages
node --version # 24.14.1
pnpm --version # >= 10.0.0

:::info .nvmrc vs engines O engines.node dos repos declara >=24.0.0 (um piso), mas o .nvmrc do workspace pina 24.14.1. Use a do .nvmrc. :::

Setup inicial (workspace front-dev)

# 1. Clonar o workspace
git clone git@github.com:cactus-agents/front-dev.git
cd front-dev

# 2. Rodar o setup
pnpm start
# ou: ./setup.sh
# ou, não-interativo: GITHUB_TOKEN=<pat> ./setup.sh --non-interactive

O script faz:

  1. Verifica pré-requisitos (Node, pnpm)
  2. Instala o FECA CLI em bin/feca
  3. Obtém o GitHub PAT — do env GITHUB_TOKEN se estiver setado (modo não-interativo auto-detectado), senão via prompt oculto
  4. Escreve repos/front-web-base/.npmrc (local ao projeto, gitignored) com o registry e o token
  5. Clona os repos: feca clone --tag initial
  6. Instala dependências: feca exec "pnpm install" --tag initial
  7. Copia .env.example como .dev.vars / .env pré-preenchidos

:::caution O token nunca vai pelo chat Se você está pedindo ajuda a uma IA no setup, exporte GITHUB_TOKEN no seu shell e rode o script — nunca cole o valor do PAT numa conversa. :::

Repos clonados pelo setup

--tag initial cobre cinco repos:

RepoTags
front-web-basefrontend, base, initial
front-cactus-corefrontend, core, initial
front-cactus-docsfrontend, docs, initial
front-opsops, initial
front-tests-e2ee2e, tests, initial

Os outros quatro repos do workspace ficam de fora e são clonados por tag quando necessário:

feca clone --tag service # front-service-api, -dev-proxy, -warmup
feca clone --tag admin # fecadm
feca clone --tag ops # front-ops + os service workers + fecadm

A fonte de verdade da lista e das tags é o feca.yaml na raiz do workspace. Ver Serviços de infraestrutura e fecadm.

Gerando o GitHub PAT

  1. Acesse github.com/settings/tokensGenerate new token (classic)
  2. Dê um nome (ex: cactus-local) e defina uma expiração
  3. Marque o escopo read:packages
  4. Generate token e copie o valor — ele só aparece uma vez

O token é salvo em repos/front-web-base/.npmrc (local ao projeto) e nunca deve ser commitado.

Usando o FECA CLI

feca # abre a TUI interativa
feca --help # lista todos os comandos

Comandos principais no dia-a-dia:

feca dev # base: auto (source do core / registry)
feca dev:docs # docs: sobe Docusaurus em localhost:3000
feca dev --registry # base com pacotes publicados
feca dev --pb-bet # ativa brand (copia .dev.vars.pb-bet → .dev.vars)
feca dev --pb-bet --registry # brand + registry
feca test # E2E Playwright (seleção interativa de brand + env)
feca update # update interativo (default: @cactus-agents/*)
feca update "@cactus-agents/*" # update filtrado por pattern
feca install # pnpm install em TODOS os repos clonados
feca sync --install # git pull workspace+repos + pnpm install
feca kill # mata listeners zumbis nas portas de dev
feca status / sync / clone # git status / pull / clone em todos os repos
feca code # abre o workspace na IDE
feca purge --brand DOMAIN # purge de cache emergencial

Porta do dev server — não assuma 5173

O Vite do base usa DEV_PORT do .env.local (gitignored), com fallback para 5173, e roda com strictPort: true — se a porta estiver ocupada ele falha em vez de cair silenciosamente pra outra.

# repos/front-web-base/.env.local
DEV_PORT=5193

Isso existe para rodar workspaces paralelos (front-dev, front-dev-claude, front-dev-codex, …) sem colidir. Antes de um smoke test, leia o .env.local do seu workspace em vez de chutar a porta:

grep DEV_PORT repos/front-web-base/.env.local
curl -sI http://localhost:<porta>/

feca kill

O range default é 5170-5199 — cobre tanto o 5173 do Vite quanto a faixa dos workspaces paralelos.

feca kill # range default 5170-5199, interativo
feca kill --range 5170-5199 # explícito
feca kill --include-docs # inclui a porta do Docusaurus
feca kill -y # sem confirmação

:::caution O --help está errado sobre o range O texto do feca --help (e a TUI) dizem "default 5173-5180". O código (lib/commands/kill.sh) usa 5170-5199. O range real é o do código; o texto de ajuda é um bug conhecido, já reportado. :::

TUI interativa

TelaO que faz
DevSeleciona repos + modo (core local / core registry) e inicia o dashboard
StatusTabela com branch e status (clean/dirty) de cada repo
SyncPuxa últimas alterações de todos os repos
ExecExecuta qualquer comando em todos os repos
ResetCleanup: limpar builds, remover repos ou full reset

Dev Dashboard

A tela Dev oferece duas opções para front-web-base (radio):

  • core localpnpm dev: resolve @cactus-agents/* direto do source do front-cactus-core clonado (HMR sub-segundo). Fallback automático pro registry se o core não estiver clonado.
  • core registrypnpm dev --registry: força pacotes publicados, ignora o core local. Use pra validar release.

E um checkbox independente para front-cactus-docs. Não aparecem opções para front-cactus-core nem front-ops porque eles não têm dev server.

Cada processo ativo ocupa um painel com largura total do terminal, empilhados verticalmente. Em registry mode, um badge amarelo REGISTRY aparece no topo.

Atalhos:

TeclaAção
tabAlternar entre painéis
rReiniciar processo ativo
iRodar pnpm install no painel ativo
cLimpar logs
sPausar auto-scroll (navegar com ↑/↓)
qSair

Rodando repos individualmente

Template (front-web-base)

cd repos/front-web-base
pnpm dev # auto: source do core se clonado, senão registry
pnpm dev --registry # força registry (pacotes publicados)
pnpm dev --local # exige core clonado (fail-fast)
pnpm typecheck # tsc via tsconfig.json (source paths + node_modules fallback)
pnpm typecheck:ci # tsc via tsconfig.ci.json (só node_modules) — o que o CI roda
pnpm test # vitest com o mesmo resolver
pnpm quality # lint + check + check:dev-vars + typecheck + test
pnpm build # produção (sempre resolve do registry)

O .dev.vars já vem pré-preenchido pelo setup.sh. Ajuste os valores conforme necessário.

SDK (front-cactus-core)

No fluxo atual, raramente precisa rodar o dev do core em paralelo — o pnpm dev do base lê direto do src/*.ts do core.

cd repos/front-cactus-core
pnpm build # build todos os pacotes (tsup ESM + CJS + .d.ts)
pnpm test # rodar testes
pnpm dev # turbo run dev (raramente necessário no novo fluxo)

:::caution Pacote novo no core Depois de criar um pacote novo, rode node scripts/regen-tsconfig-paths.mjs no base para atualizar tsconfig.json e tsconfig.ci.json. :::

Documentação (front-cactus-docs)

cd repos/front-cactus-docs
pnpm start # dev server em localhost:3000
pnpm build # build estático

GitHub Packages (auth para @cactus-agents/*)

O .npmrc configurado pelo setup já cuida da autenticação. Se precisar configurar manualmente:

# repos/front-web-base/.npmrc (local ao projeto)
@cactus-agents:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=<seu-PAT>
cuidado

O .npmrc com token é local ao projeto — não use ~/.npmrc global para evitar expor o token para todos os projetos da máquina. O .gitignore já inclui .npmrc.

Para mais detalhes, veja GitHub Packages.

Falhas comuns no setup

SintomaCausaCorreção
Permission denied (publickey) no cloneSSH não configurado no GitHubAdicionar a chave em GitHub → Settings → SSH keys
401 Unauthorized no pnpm installPAT ausente/expirado ou sem read:packagesRegenerar o PAT e recriar o .npmrc
GITHUB_TOKEN não está setado no env--non-interactive sem o exportexport GITHUB_TOKEN=<pat> antes de rodar
Vite falha com porta ocupadastrictPort: true + porta em usofeca kill, ou setar outro DEV_PORT no .env.local
curl no localhost:5173 não respondeO workspace usa outra portagrep DEV_PORT repos/front-web-base/.env.local

IDEs

VS Code

Extensões recomendadas:

  • Biome (biomejs.biome) — lint + format
  • Tailwind CSS IntelliSense — autocomplete de classes
  • Pretty TypeScript Errors — erros TS mais legíveis

O Biome substitui ESLint + Prettier:

{
"editor.defaultFormatter": "biomejs.biome",
"editor.formatOnSave": true
}