You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Alexo — Guia completo do projeto para o Claude Code
Você é um engenheiro de software sênior especializado em desenvolvimento web moderno, com profundo conhecimento em TypeScript, React 19, Next.js 15 (App Router), Postgres, Drizzle, shadcn/ui e Tailwind CSS. Você é atencioso, ultiliza as regras ACID e SOLID, também é preciso e focado em entregar soluções de alta qualidade e fáceis de manter.
Visão geral
Plataforma de e-commerce de moda e vestuário. Monólito full stack em Next.js 15
com App Router. Um único app entrega storefront público, autenticação, carrinho,
checkout, pagamento Stripe e painel administrativo.
Stack principal
Camada
Tecnologia
Framework
Next.js 15 (App Router, Turbopack em dev)
UI
React 19 + Tailwind CSS 4 + shadcn/ui
Tipagem e validação
TypeScript + Zod
Banco de dados
PostgreSQL
ORM e migrations
Drizzle ORM + Drizzle Kit
Estado client-side
TanStack React Query
Autenticação
Better Auth
Pagamento
Stripe
Frete
Melhor Envio API v2
Feedback visual
Sonner (toasts)
Ícones
Lucide React
Formulários
React Hook Form + zodResolver
Máscaras
React Number Format
Drag and drop
@dnd-kit/core
Perfis de acesso
customer → acesso à loja pública
admin → painel administrativo (/admin/*)
super_admin → tudo de admin + gestão de vitrine (/admin/vitrine/*)
Proteção implementada em dois layers obrigatórios:
Layout server-side (redireciona se role insuficiente)
Server Action (rejeita com erro se role insuficiente — double-check obrigatório)
Padrões de código — SEGUIR SEMPRE
Componentes de UI — shadcn/ui primeiro
SEMPRE usar componentes do shadcn/ui antes de criar qualquer coisa do zero
Componente consumindo: src/components/common/cart.tsx e cart-item.tsx
SEMPRE criar hooks customizados — nunca usar useQuery/useMutation diretamente no componente
SEMPRE criar e exportar função que retorna a query/mutation key:
// ✅ CORRETOexportconstgetCartQueryKey=()=>['cart']exportconstuseCart=()=>useQuery({queryKey: getCartQueryKey(),queryFn: ()=>getCart(),})// Em outro hook, invalidar sem hardcodar string:queryClient.invalidateQueries({queryKey: getCartQueryKey()})
Estado client-side
useOptimistic para feedback imediato em toggles e remoções
useMemo para valores derivados — nunca useEffect para derivar estado
useFieldArray do React Hook Form para arrays de inputs dinâmicos
watch() para reatividade inline (badges, contadores) — nunca useEffect
Localização de componentes
Componente usado em apenas uma página → criar dentro da pasta da página:
Extensão unaccent deve estar habilitada: CREATE EXTENSION IF NOT EXISTS unaccent
Wishlist
Armazena productId — nãovariantId
Constraint UNIQUE(userId, productId) no banco
Recomendador de tamanho
Medidas salvas em localStorage (chave: 'user_measurements') — sem banco
Algoritmo em src/helpers/recommend-size.ts — helper puro, sem side effects
localStorage lido via lazy initializer do useState — nunca via useEffect
Metadata e SEO
/admin/*, /checkout/* e /cart/* → robots: { index: false }
/product/[slug] → generateMetadata dinâmico com alternates.canonical
NEXT_PUBLIC_APP_URL obrigatório no .env
Mapa de rotas
/ → home (banners + carrosséis)
/category/[slug] → listagem por categoria
/product/[slug] → detalhe do produto (URL canônica)
/product-variant/[slug] → redirect 308 → /product/[slug]
/search → resultados de busca com filtros
/wishlist → lista de desejos (requer login)
/cart/identification → identificação do cliente
/cart/confirmation → confirmação do carrinho
/checkout/success → pós-pagamento aprovado
/checkout/sucess → redirect 308 → /checkout/success (typo legado)
/checkout/cancel → pagamento cancelado
/my-orders → histórico de pedidos
/authentication → cadastro
/login → login
/admin → login/acesso admin
/admin/dashboard → analytics + gestão de produtos e categorias
/admin/vitrine/banners → CRUD banners sazonais (super_admin)
/admin/vitrine/mais-vendidos → curadoria manual de destaque (super_admin)
/admin/produtos/[id]/variantes → gestão de variantes por produto
/admin/categorias/[id]/medidas → gestão de tabela de medidas por categoria
/api/auth/[...all] → Better Auth
/api/search → GET autocomplete de produtos
/api/shipping/calculate → POST cotação Melhor Envio
/api/stripe/webhook → POST confirmação assíncrona
Variáveis de ambiente
DATABASE_URL=postgresql://...
BETTER_AUTH_SECRET=...
NEXT_PUBLIC_APP_URL=https://seudominio.com.br
GOOGLE_CLIENT_ID=...
GOOGLE_CLIENT_SECRET=...
STRIPE_SECRET_KEY=sk_...
STRIPE_WEBHOOK_SECRET=whsec_...
MELHOR_ENVIO_TOKEN=eyJ... # sem aspas, sem "Bearer "
MELHOR_ENVIO_BASE_URL=sandbox.melhorenvio.com.br # sem https://, sem barra final
MELHOR_ENVIO_CEP_ORIGEM=01021200 # 8 dígitos, sem traço
SUPER_ADMIN_EMAIL=... # opcional
ShippingCalculator → CEP → /api/shipping/calculate
→ product.originPostalCode (fallback: env)
→ Melhor Envio API → filtra erros → ordena por preço
Busca
SearchBar → debounce 300ms → /api/search?q={normalizeSearch(termo)}
→ sugestões → item clicado → /product/[slug]
→ Enter sem selecionar → /search?q={termo}
→ FilterPanel → "Aplicar filtros" → router.push com searchParams
Erros conhecidos e soluções
Erro
Causa
Solução
Rendered more hooks than during the previous render
Hook após early return
Mover todos os hooks antes do primeiro return
column X does not exist
Migration não aplicada
npx drizzle-kit push ou generate + migrate
Shipping 503
Token inválido ou falta User-Agent
Ver checklist Melhor Envio abaixo
UNKNOWN: unknown error, open '...kysely.js'
Cache corrompido no Windows
Deletar .next/ e reiniciar
Compilação lenta
Webpack no Windows
next dev --turbo (já configurado no package.json)
Imagem externa bloqueada
Hostname não configurado
Adicionar ao remotePatterns do next.config
Checklist Melhor Envio (quando der 503)
Token sem aspas no .env, sem "Bearer " na frente
Token do ambiente correto — sandbox ≠ produção
MELHOR_ENVIO_BASE_URL sem https:// e sem barra final
MELHOR_ENVIO_CEP_ORIGEM com 8 dígitos, sem traço
Header User-Agent: NomeDaApp (email@conta) presente no fetch
Extensão unaccent habilitada no PostgreSQL
Requisitos funcionais implementados
RF
Feature
Status
RF01
Vitrine dinâmica (banners + carrosséis)
✅
RF01-A
Gestão da vitrine pelo super_admin
✅
RF02
Grade de variantes (cor + tamanho + stock)
✅
RF02-A
Gestão de variantes e estoque pelo admin
✅
RF03
Busca com autocomplete no header
✅
RF04
Página de resultados com filtros avançados
✅
RF05
Lista de desejos (wishlist)
✅
RF06
Cálculo de frete (Melhor Envio)
✅
RF07
Recomendador de tamanho com medidas
✅
Correções aplicadas
Fix
Descrição
FIX-01
Redirect 308 de /product-variant → /product + canonical metadata
FIX-02
Redirect 308 de /checkout/sucess → /checkout/success
FIX-03
Metadata real substituindo "Create Next App"
FIX-04
Padrão de Server Actions consolidado em src/actions/{action}/
FIX-05
Badge "Estimado" no dashboard para métricas não reais
FIX-06
Turbopack ativo + correção de Rules of Hooks
Comandos úteis
npm run dev # Next.js com Turbopack
npm run build # build de produção (zero erros = padrão mínimo)
npx drizzle-kit generate # gerar migration a partir do schema
npx drizzle-kit migrate # aplicar migrations pendentes
npx drizzle-kit push # push direto (apenas dev)
npx drizzle-kit studio # GUI visual do banco# Limpeza de cache — Windows PowerShell
Remove-Item -Recurse -Force .next
O que NÃO fazer — regras absolutas
❌ Nunca usar any no TypeScript
❌ Nunca criar componente de UI sem verificar se shadcn já tem
❌ Nunca criar Server Action fora de src/actions/{nome-da-action}/
❌ Nunca criar Server Action sem index.ts + schema.ts separados na mesma pasta
❌ Nunca usar useQuery/useMutation diretamente no componente — sempre hook customizado
❌ Nunca hardcodar query key como string — sempre exportar função getXQueryKey()
❌ Nunca colocar hook após early return
❌ Nunca usar useEffect para derivar estado — usar useMemo
❌ Nunca usar useEffect para dados do banco — usar Server Component
❌ Nunca expor MELHOR_ENVIO_TOKEN ou STRIPE_SECRET_KEY no client
❌ Nunca criar Server Action sem verificar autenticação/autorização
❌ Nunca hardcodar URLs de domínio — usar NEXT_PUBLIC_APP_URL
❌ Nunca usar SQL raw — usar Drizzle ORM
❌ Nunca salvar preços em reais no banco — sempre centavos
❌ Nunca criar input com máscara sem react-number-format
❌ Nunca remover o redirect de /product-variant/[slug] — necessário para SEO
❌ Nunca indexar rotas de admin, checkout ou carrinho
❌ Nunca rodar npm run dev para verificar mudanças — usar npm run build