Regras permanentes de trabalho neste repositório.
- Mudanças entram por branch + PR. Não force-push na
main. - Não criar tags nem publicar o Worker sem instrução explícita do usuário.
- NUNCA rodar scraping por conta própria — nem
run-once, nem jobs agendados, nem coleta manual de loja/categoria, nem re-coleta para "refrescar"/"corrigir" dados. - Scraping só é executado quando o usuário pedir explicitamente.
- Em trabalho de desenvolvimento (ex: nova regra da engine, novo endpoint), usar os dados já existentes no Supabase; se faltar dado, sinalizar e esperar instrução — não inventar coleta.
- Evitar
SELECT *ou varreduras amplas semWHERE/LIMITemproducts/listings/price_history— tabelas grandes, custo de IO. - Para validações, preferir agregações mínimas (
count(*),count(*) GROUP BY loja/categoriacom limite) e só quando estritamente necessário. - Migração D1→Supabase: usar
scripts/d1-to-supabase.sh(idempotente comON CONFLICT DO NOTHING); legadoscripts/d1-push-remote.shestá deprecado. DATABASE_URL(pooler6543para Workers/Hyperdrive,5432direct paradrizzle-kit) viaapps/api/.dev.vars— nunca commitar.
- Front: Angular em
apps/web. - API: Cloudflare Worker (
apps/api) + Supabase Postgres (sa-east-1) + Hyperdrive + Drizzle + Zod. - Domínio puro em
packages/domain(sem I/O). - Scraper Python em
scraper/— persiste viaOPENPC_API_URL(/internal/v1). - Sem Docker, sem GitHub Actions, sem pasta
deploy/.