Dashboard interno + base para futuro ecomerce BR. Monorepo Bun + Turborepo. Auth dual (Better Auth) sobre Supabase Postgres.
Para agentes/IA: o guia canônico de stack, regras, design e workflows é
CLAUDE.mdno root. Sistema visual completo emDESIGN.md.
- Runtime: Bun 1.3 (workspaces + catalog)
- Build: Turborepo 2.10 (TUI)
- Frontend: Next 16 + React 19 (
apps/web, port 3001) - UI: shadcn/ui + Tailwind 4 + Base UI React (
packages/ui) - DB: PostgreSQL via Supabase + Drizzle ORM (
packages/db) - Auth: Better Auth 1.6 — instância dashboard em
packages/auth/src/dashboard.ts(convite-only, ADR-0013); instância ecommerce vive no repo ecommerce (ADR-0004) - Env validation:
@t3-oss/env-core+ Zod (packages/env) - Lint/format: Biome 2.4.15 + Ultracite (
bun fix) - Storage: Supabase Storage (
tool-imagesbucket) para imagens de produtos - Design system: Industrial-workshop warm-dark + coral, Barlow Condensed caixa-alta em h1, dark-mode único, AAA (ver
DESIGN.md)
bun installPostgreSQL + Drizzle ORM via Supabase.
- Provisionar Postgres (Supabase ou local).
- Popular
apps/web/.enva partir deapps/web/.env.example(incluiDATABASE_URL+NEXT_PUBLIC_SUPABASE_*). - Aplicar schema (push-only — ver ADR-0006):
bun db:sync # drizzle-kit push + triggers + RLS
# ⛔ não rode db:seed-demo: o banco é único (dev = prod), e o seed trunca tudoServidor de desenvolvimento:
bun dev:web # apenas web em :3001 (preferido)
bun dev # todos os apps em paralelo (Turbo TUI)Abrir http://localhost:3001.
Primitives shadcn/ui ficam em packages/ui.
- Tokens de design + globals:
packages/ui/src/styles/globals.css - Componentes shared:
packages/ui/src/components/* - shadcn aliases:
packages/ui/components.json+apps/web/components.json
Adicionar primitives shared (rodar da raiz):
npx shadcn@latest add accordion dialog popover sheet table -c packages/uiImport:
import { Button } from "@emach/ui/components/button";Blocks específicos do app: rodar shadcn CLI dentro de apps/web (não em packages/ui).
bun check— dry-run (Ultracite check; falha se houver issue)bun fix— aplica fixes automáticos (também roda como PostToolUse hook)
emach-dashboard/
├── apps/
│ └── web/ # Next 16 dashboard (port 3001)
│ └── src/app/dashboard/{tools,categories,suppliers,branches,stock,promotions,orders,separacao,shipping,reviews,customers,users,site,dev-preview,sem-acesso}
├── packages/
│ ├── ui/ # shadcn/ui primitives + globals.css
│ ├── auth/ # Better Auth dashboard: dashboard.ts (ecommerce no repo ecommerce — ADR-0004)
│ ├── db/ # Drizzle schema + createDb factory + scripts
│ ├── email/ # E-mails transacionais (Resend)
│ ├── env/ # Zod-validated env (@t3-oss/env-core)
│ └── config/ # tsconfig.base.json compartilhado
├── docs/
│ ├── adr/ # Decisões arquiteturais (índice em docs/adr/README.md)
│ ├── agents/ # Guias de consumo de domínio/issues p/ agentes
│ ├── integration/admin-ecommerce.md
│ └── storage-buckets.md
├── scripts/
│ ├── clean.sh
│ ├── remove-tool-image-bg.py
│ └── sync-fork.sh
├── CLAUDE.md # Guia canônico para Claude Code
├── DESIGN.md # Sistema visual industrial-workshop dark + coral + condensada
├── PRODUCT.md # Register product + personality + anti-references
└── .mcp.json # MCP servers: supabase, shadcn, next-devtools, better-auth
| Script | Função |
|---|---|
bun dev |
Inicia todos os apps em paralelo (Turbo TUI) |
bun dev:web |
Inicia apenas o web (port 3001) |
bun build |
Build de todos os apps |
bun check-types |
tsc --noEmit em todos os workspaces |
bun check |
Ultracite check (lint/format dry-run; falha se issue) |
bun fix |
Ultracite fix (aplica auto-format) |
bun db:sync |
drizzle-kit push + triggers + RLS (push-only — ADR-0006) |
bun db:push |
Só o schema Drizzle (sem triggers/RLS) |
bun db:studio |
UI inspetora de tabelas (drizzle-kit) |
bun --cwd packages/db db:apply-sql |
Aplica src/sql/{triggers,rls}.sql (triggers + RLS deny-all, idempotente) |
bun --cwd packages/db db:seed-demo |
⛔ Trunca e repopula o banco único (dev = prod); só com autorização |
bun --cwd packages/db db:reset-demo |
⛔ Trunca as tabelas demo no banco único; só com autorização |
bun --cwd packages/db db:seed-test-orders |
⛔ Insere pedidos de teste no banco único (dev = prod); só com autorização |
bun --cwd packages/db db:seed-ready-to-ship |
⛔ Insere pedidos prontos para envio no banco único; só com autorização |
bun --cwd packages/db db:unseed-ready-to-ship |
⛔ Apaga pedidos EM-TEST-91* e devolve o estoque no banco único; só com autorização |
bun verify |
check-types + check + testes de apps/web |
bun --cwd apps/web test |
Vitest de apps/web (test:watch para modo watch) |
bun --cwd packages/db test |
Vitest de packages/db |
bun guard:forms |
ast-grep scan (regras de formulário) |
bun guard:forms:test |
Testes das regras do guard:forms |
bun doctor |
react-doctor (diagnóstico de React) |
bun sync:fork |
Sincroniza o fork (scripts/sync-fork.sh); sync:fork:dry só simula |
bun clean |
Remove node_modules + caches Turbo/Next |
bun clean-all |
Como clean, sem confirmação e limpando o cache do bun |
bun clean-dry |
Mostra o que clean removeria, sem apagar |