VendeeDocs
Arquitetura

Monorepo

Turborepo, Bun e pipeline de build

O Vendee usa Turborepo como build system e Bun 1.3.2 como runtime e gerenciador de pacotes.

Estrutura

vendee-turborepo/
├── apps/
│   ├── app/           # Dashboard SPA (Vite + React 19) — o CRM
│   ├── docs/          # Esta documentação (Fumadocs / Next.js)
│   └── runtime/       # Vendee Agent Runtime — o ÚNICO motor de IA (Hono)
├── packages/
│   ├── supabase/          # @repo/supabase — client tipado + types gerados
│   ├── shared/            # @repo/shared — finance-engine e ai-policy
│   ├── eslint-config/     # @repo/eslint-config
│   └── typescript-config/ # @repo/typescript-config
├── supabase/          # migrations e edge functions
├── turbo.json
└── package.json

Pipeline Turbo

turbo.json
{
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": [".next/**", "!.next/cache/**", "dist/**"]
    },
    "lint": { "dependsOn": ["^lint"] },
    "check-types": { "dependsOn": ["^check-types"] },
    "dev": { "cache": false, "persistent": true }
  }
}
  • build e check-types dependem de ^build / ^check-types (builds das dependências primeiro)
  • dev é persistente e sem cache
  • lint cascateia pelas dependências

Comandos

bun run dev              # Dev de todos os apps
bun run dev:app          # Apenas apps/app (:5173)
bun run dev:docs         # Apenas apps/docs (:3001)
bun run build            # Build de todos
bun run lint             # Lint (zero warnings)
bun run check-types      # Type-check
bun run format           # Prettier

A porta padrão do apps/app é 5173. Se ela já estiver ocupada (por outro projeto local, por exemplo), rode bunx vite --port 5200 dentro de apps/app — a porta 5200 é a convenção local quando 5173 está em uso.

Type-checking

O script bun run check-types executa tsc -b (build mode com project references), não tsc --noEmit.

Nunca rode tsc --noEmit diretamente para validar o monorepo. Com project references, esse modo não detecta erros cross-package — é um gap silencioso que pode passar no CI e quebrar no build do CI. Sempre use bun run check-types.

Variáveis de ambiente globais

Definidas em turbo.json > globalEnv:

  • VITE_SUPABASE_URL / VITE_SUPABASE_PUBLISHABLE_KEY (legado VITE_SUPABASE_PUBLISHABLE_DEFAULT_KEY) (Vite)
  • NEXT_PUBLIC_SUPABASE_URL / NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY (legado NEXT_PUBLIC_SUPABASE_ANON_KEY) (Next.js)

Comandos que provam de verdade

Além de dev, build, lint e check-types, o repositório tem os scripts que reproduzem o portão do CI:

bun run validate         # lint + check-types + build + testes — rápido, para o loop de trabalho
bun run validate:strict  # o mesmo, com --force e EM SÉRIE. Use este antes de abrir PR
bun run gates            # knip + deno check das edges — o que o turbo NÃO cobre e o CI cobra
bun run check:edges      # só o deno check; aceita o nome de uma edge
bun run edge:verify <slug>   # prova que a edge publicada é igual à do repositório

⚠️ bun run validate puro pode devolver FULL TURBO em ~100ms, reusando cache — verde que não provou nada. A prova antes do PR é o validate:strict.

⚠️ O validate:strict roda as quatro etapas em série de propósito. Rodando em paralelo, duas corridas aparecem e somem: testes estouram o teto de tempo por disputa de CPU, e o check-types do docs lê um diretório que o build está reescrevendo. Serializar custa ~40s e devolve resultado determinístico.

Nesta página