Versões alvo. Pinos exatos em package.json de cada workspace. Atualização via Renovate/Dependabot com PRs pequenos.
Runtime e build
| Camada | Tecnologia | Versão alvo |
|---|
| Runtime | Node.js | 22 LTS |
| Package manager | pnpm (via Corepack) | 9.15.x |
| Monorepo | Turborepo | ^2.3 |
| Linguagem | TypeScript | ^5.6 |
Frontend (apps/web)
| Camada | Tecnologia | Versão |
|---|
| Framework | React + Vite | 18.x / 5.x |
| UI | shadcn/ui + Tailwind + Radix | ^3.4 |
| Data client | TanStack Query | ^5 |
| Estado UI | Zustand | ^5 |
| Forms | react-hook-form | ^7.53 |
| Validação | Zod | ^3.23 |
| i18n | react-i18next | ^15 |
| Gráficos | Recharts | ^2 |
| PWA | vite-plugin-pwa (Workbox) | ^0.21 |
| Push (server) | web-push em Edge Function send-push | ^3.6 |
| Fontes | @fontsource-variable/inter (bundled) | ^5.1 |
| Captcha | @hcaptcha/react-hcaptcha | ^1.11 |
| Observabilidade | @sentry/react + posthog-js (opcional F2.5+) | ^8.40 / ^1.18 |
Documentação (apps/docs)
| Camada | Tecnologia | Versão |
|---|
| Framework | Astro 5 | ^5.0 |
| Docs theme | Starlight | ^0.32 |
Backend (Supabase)
| Camada | Tecnologia | Versão |
|---|
| Postgres | 15 (com extensions: pgcrypto, moddatetime) | 15.x |
| Auth | Supabase Auth + Custom Access Token Hook | — |
| Edge Functions | Deno | runtime Supabase |
| Storage | S3-compatible | — |
| CLI | supabase | ^2.0 |
Provedores externos
| Categoria | Provedor | Notas |
|---|
| Hosting | Netlify Pro | $19/mês — wildcard SSL F1.5+ |
| DNS | HostGator → Cloudflare (pendente F1.5) | Cloudflare obrigatório pra wildcard *.clinicgestor.com |
| Email transacional | Resend | DKIM + SPF + DMARC verificados |
| Cobrança | Asaas | API v3 (sandbox + produção); 2 níveis (plataforma + subcontas) |
| Assinatura digital | Assinafy | API v1 (sem ZapSign — ver ADR 0007) |
| Captcha | hCaptcha | site key pública + secret no Vault |
| Observabilidade | Sentry + PostHog (opcional F2.5+) | sem PII em events |
| LLM | Anthropic via AI Gateway | redact obrigatório antes do prompt |
Testes
| Categoria | Tecnologia | Versão |
|---|
| Unit / integration | Vitest | ^2 |
| E2E | Playwright (Chromium) | ^1.49 |
| Coverage mínima | 70% packages com lógica de negócio · 50% app | — |
| Camada | Tecnologia | Versão |
|---|
| Lint | ESLint 9 (flat config) | ^9.15 |
| Plugins ESLint | react · react-hooks · jsx-a11y · tailwindcss · @typescript-eslint | — |
| Format | Prettier | ^3.3 |
| Hooks | Husky + lint-staged | ^9.1 / ^15.2 |
Lints custom obrigatórios:
pnpm lint:tokens — proíbe hex inline, style={{ color }}, rgb(...), fontFamily inline
pnpm lint:pages — toda rota usa <PageContainer> (exceto auth/* e _dev/*)
pnpm lint:consultancy-scope — toda mutation em tabela tenant valida consultancy_id
pnpm lint:no-spam-b2b — proíbe rotas /consultancy/(marketplace|search|browse)-clinic*
Como rodar localmente
corepack prepare pnpm@9.15.0 --activate
pnpm --filter @clinicgestor/web build
Comandos pnpm db:* e pnpm dev ficam disponíveis a partir do Sprint 1, quando o monorepo for completado com apps/web, packages/* e supabase/.