Files
DeskcommCRM/README.es.md
T
Rafael MelgaçoandClaude Opus 5 ce93ab00d4 chore(growth-fase-0): CI prova o isolamento RLS, e o README para de afirmar o que não era verdade
O README afirmava "Teste de isolamento RLS é gate obrigatório" e o CLAUDE.md
repetia "obrigatório no CI antes de merge". Não era verdade: ci.yml rodava só
typecheck + lint + test:unit, e vitest.config.ts exclui tests/invariants/**.
Os 364 testes de invariante — incluindo o de isolamento entre 2 tenants —
rodavam só localmente, sob demanda. Afirmação pública, checável em 30 segundos,
e falsa.

Duas saídas possíveis: enfraquecer a frase ou tornar a frase verdadeira. Como o
script já existia (scripts/test-db.sh) e o runner do GitHub já tem Docker, o
custo de torná-la verdadeira era menor que o custo reputacional de mantê-la.

- ci.yml: job `invariants` em paralelo ao `verify`, rodando `pnpm test:db`
  (Postgres efêmero + baseline em modo install/update + tests/invariants/**).
  Job separado de propósito: não atrasa o feedback rápido e vira check nomeado.
- README.{md,en,es} + CLAUDE.md: a frase agora descreve o que o teste realmente
  faz, com número medido pelo executor (364 em 56 arquivos — não os 304 que um
  grep de `it(` sugeria) e com o caso de controle que prova que as linhas da
  org B existem antes de provar que a RLS as esconde.
- CLAUDE.md: registra que test:unit NÃO cobre os invariantes, para que rodar só
  test:unit e concluir "está verde" deixe de ser um falso verde.

Junto, três correções de vitrine que a auditoria de crescimento levantou:

- docker-compose.prod.yml: default apontava para ghcr.io/deskcommcrm/deskcommcrm,
  namespace que não existe no registry (a imagem pública é ghcr.io/melgarafael/
  deskcommcrm). Quebrava quem seguisse docs/deploy-selfhost/ sem .env completo.
- raiz: de 64 para 42 itens versionados. 7 documentos de trabalho arquivados em
  docs/handoffs/ e 11 screenshots em docs/evidence/inbox-multimodal/, via git mv.
  Ficam na raiz HANDOFF.md, HANDOFF-operacao-visivel.md e HANDOFF-harness-
  evolution.md: os dois últimos estão modificados em feat/operacao-visivel e
  movê-los agora criaria conflito de rename/edit no merge.
- roadmap dos 3 READMEs: removido "Fase FG — agente Vendaval consome a governança
  via ai_dispatch_mode=external", jargão interno redundante com "MCP público".

tests/unit/evidencia-citada.test.ts: arquivar handoff quebrou 5 casos porque o
guarda resolve referência de imagem contra a pasta do documento — as imagens
seguem em evidence/, então ele reprovava documento correto por um caminho que
ele mesmo inventou, o defeito que o próprio arquivo já condena. docs/handoffs/
passa a contar como raiz, e a entrada de LEGADO acompanhou o caminho novo.

Verificado no SHA 0ea9f4b: typecheck 0, lint 0 erros, test:unit 1035/1035,
test:db 364 passando em 56 arquivos ("test:db verde").

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KMEbgy5YWXZimXQAN7oRMm
2026-07-27 13:09:17 -03:00

16 KiB
Raw Blame History

🇧🇷 Português · 🇺🇸 English · 🇪🇸 Español

🛠️ DeskcommCRM — El Sistema Operativo de Ventas con Agentes de IA

Agentes de IA que atienden, califican y venden por WhatsApp — dentro de un CRM open source corriendo en tu propio servidor. Sin mensualidad, sin funciones bloqueadas, tus datos contigo. La alternativa abierta a Kommo, Octadesk e Intercom.

Next.js 16 TypeScript Supabase Self-hosted License: MIT

🧭 Visión · 📘 Guía de instalación · 🏗️ Arquitectura · 🤝 Contribuir · 📋 PRDs · 🗺️ Roadmap


☁️ Pon este CRM en producción con un solo comando

DeskcommCRM se desarrolla en alianza con HostGator: el hostgator-setup-kit/ instala el CRM completo (app + WAHA + base de datos) en un VPS con un único comando, y el runbook de producción ya asume ese entorno.

👉 Contratar el VPS de HostGator con el descuento de la alianza — datacenter en São Paulo, ideal para WhatsApp funcionando 24/7. (enlace de partner — contratar por él apoya el proyecto y te sale más barato)

✨ Qué es

Deskcomm viene de Desk (escritorio) + comm (comercio): toda la operación de ventas de tu negocio en un solo escritorio, operada por personas y agentes de IA trabajando juntos.

El proyecto nació como un CRM de e-commerce — y la comunidad open source lo llevó mucho más allá: hoy funciona en clínicas, inmobiliarias, negocios de infoproductos, agencias, tiendas y empresas de servicios — cualquier negocio que vende por WhatsApp. El producto acompañó ese giro y se convirtió en un sistema operativo de ventas: agentes de IA con RAG por tenant atienden clientes, califican leads, los mueven por el embudo, disparan automatizaciones y saben cuándo pasar la conversación a un humano — con el CRM completo expuesto vía MCP para que los agentes lo operen de verdad. La historia completa está en VISION.md.

Por qué es diferente

  • 🤖 Agentes de IA que operan el CRM — RAG por tenant, análisis de sentimiento, handoff IA→humano auditado, la IA como asignado de primera clase y control de presupuesto por organización. No es un chatbot decorativo: el agente atiende, califica y mueve el embudo.
  • 🔁 Agentes que se auto-mejoran — las conversaciones resueltas se convierten en conocimiento nuevo para el RAG; los handoffs marcan dónde el agente todavía no llega; las métricas cierran el ciclo. Cada mes de operación hace al agente mejor, con compuerta humana donde importa.
  • 🧩 Multi-nicho por diseño — vocabulario configurable por pipeline: un lead se vuelve Cliente, Paciente o Comprador; "ganado" se vuelve Pagado, Agendado o Cerrado. El mismo núcleo sirve para e-commerce (nuestra cuna, con integración nativa con Nuvemshop/Tiendanube), clínicas, inmobiliarias o infoproductos.
  • 🔌 MCP-ready — servidor MCP interno para los agentes integrados; contrato público para agentes externos en construcción. El CRM como infraestructura para cualquier agente de IA.
  • 💬 WhatsApp-nativo vía WAHA — multi-número, anti-baneo (throttle + jitter + ventanas de horario), medios vía Storage, detección de STOP.
  • 👥 Gobernanza de atención — RBAC server-side de verdad, asignación/transferencia auditadas, cola con posición, enrutamiento automático y alcance de visualización por rol.
  • 🏢 Multi-tenant + privacidad por diseño (LGPD) — RLS en toda tabla tenant-aware con test de aislamiento como gate de CI; anonimización preferida sobre borrado; log de auditoría append-only con retención de 5 años.
  • 🖥️ Self-hosted de verdad — tus datos en tu VPS; instalación con 1 comando; sin versión paga, sin funciones bloqueadas.

🔌 Webhooks & Automatizaciones

Cada tenant puede crear fuentes de captación: una dirección pública (/api/v1/webhooks/in/<token>) que recibe leads de landing pages, formularios propios o herramientas como Zapier/n8n vía POST (JSON o application/x-www-form-urlencoded) y los deja directo en el embudo/etapa elegidos — sin código, sin integración a medida por tenant. Sobre esas fuentes (y los demás eventos del CRM — lead cambió de etapa, recibió una etiqueta, llegó un mensaje de WhatsApp), el tenant arma automatizaciones: reglas CUANDO/SI/ENTONCES que agregan etiquetas, mueven leads, asignan agentes, envían mensajes de WhatsApp o avisan a sistemas externos vía webhooks de salida.

En la UI todo vive en Webhooks en la barra lateral (visible solo para roles manager/admin). Tres pestañas: Recibir datos (crear una fuente, copiar la dirección/formulario listo, disparar un lead de prueba, ver las últimas entregas), Automatizaciones (armar la regla, que siempre nace pausada hasta que el tenant la revise y active) y Actividad (línea de tiempo de cada ejecución, con el resultado de cada acción y reenvío manual cuando una llamada a un webhook externo falla).

Por debajo, cada evento se convierte en una fila en event_log — ningún trigger de base de datos hace llamadas HTTP. La ruta /api/v1/cron/event-log-drain drena la cola cada minuto. En Vercel eso es un Cron Job gestionado; en el kit self-host de HostGator (hostgator-setup-kit/), install.sh/update.sh configura solo una línea de crontab que ejecuta esa ruta cada minuto con el INTERNAL_SECRET del .env.


🚀 Quickstart (velo funcionando en 5 minutos)

# 1. Clona
git clone https://github.com/melgarafael/DeskcommCRM.git
cd DeskcommCRM

# 2. Node 20 + pnpm
nvm use                    # o instala Node 20+
npm install -g pnpm
pnpm install

# 3. Variables de entorno
cp .env.example .env.local
# Edita .env.local — guía completa en docs/SETUP.md

# 4. WAHA local (opcional en dev sin WhatsApp)
docker compose up -d

# 5. Migraciones de Supabase
supabase link --project-ref <tu-ref>
supabase db push

# 6. Levanta la app
pnpm dev

App: http://localhost:3000 · Health check: http://localhost:3000/api/v1/health

🆕 ¿Primera vez? No te saltes pasos. docs/SETUP.md es el tutorial completo paso a paso de todas las integraciones (Supabase, WAHA, Anthropic, Upstash, Sentry, Resend, Nuvemshop) — hecho para quien nunca configuró nada de esto. ~60–90 min de cero a la app funcionando. (La documentación está en portugués de Brasil; ¡las traducciones son bienvenidas!)


🧱 Stack

Capa Elección Por qué
Frontend Next.js 16 App Router (Turbopack) + React 19 + TypeScript 6 estricto Server Components + Route Handlers en el mismo repo
Estilos Tailwind + shadcn/ui (new-york, neutral) Personalizable sin lock-in
DB Supabase (Postgres + RLS + vector) Multi-tenant nativo, embeddings para RAG
Auth Supabase Auth vía @supabase/ssr Cookies SameSite=Strict, HttpOnly
Realtime Supabase Realtime postgres_changes + broadcast
Storage Supabase Storage (URLs firmadas) Bucket privado whatsapp-media
WhatsApp WAHA Plus (engine NOWEB) Multi-tenant, retry, S3
Colas Tabla event_log + workers (cron) Sin Inngest/Trigger en el MVP
Rate limit Upstash Redis (sliding window) Serverless, el free tier alcanza
AI Vercel AI SDK v7 (providers Anthropic/Google/OpenAI v4) vía AI Gateway Fallback automático, ZDR
Validación Zod Input externo, env, payloads
Observabilidad Sentry (con beforeSend sanitizado) Sin PII en los breadcrumbs
Hosting Vercel (app) + HostGator VPS Turing/SP (WAHA) Edge + servidor dedicado para WhatsApp; datacenter en Brasil

Detalles: ARCHITECTURE.md.


🧪 Tests

pnpm typecheck     # tsc --noEmit (estricto)
pnpm lint          # eslint next/core-web-vitals
pnpm test:unit     # Vitest (NO incluye tests/invariants/**)
pnpm test:db       # Postgres efímero + baseline install/update + invariantes
pnpm test:e2e      # Playwright (requiere dev server)

El CI ejecuta typecheck, lint y test:unit en cada PR. Un segundo job — invariants — levanta un Postgres limpio, aplica supabase/baseline.sql en modo install (ON_ERROR_STOP=1) y luego en modo update (probando idempotencia), y ejecuta 364 tests de invariante repartidos en 56 archivos, cubriendo RBAC, asignación, alcance de visualización, enrutamiento, follow-up, webhooks y automatizaciones.

Entre ellos está el test de aislamiento RLS: crea 2 organizaciones, simula los claims JWT por el mismo camino auth.uid() / fn_user_org_ids() que usan las policies de producción, y prueba que un usuario de la org A ve cero filas de la org B en conversations, messages, contacts y crm_leads. Antes, un caso de control prueba que las filas de la org B realmente existen en la base — sin él, el test pasaría contra una tabla vacía.


📚 Documentación

Doc Qué contiene
VISION.md Visión y posicionamiento — qué es el proyecto, en qué cree, hacia dónde va
docs/SETUP.md Instalación completa paso a paso de todas las integraciones
CLAUDE.md Convenciones no negociables (lectura obligatoria para contribuir)
ARCHITECTURE.md Visión de 1 página de la arquitectura
CONTRIBUTING.md Flujo de PRs
docs/prd/ PRDs (master, plataforma, customer 360, WhatsApp, pipeline, IA-RAG, Nuvemshop)
docs/specs/ Specs técnicas 01–13 (schema SQL, payloads, MCP, gobernanza)
docs/runbooks/waha-hostgator.md Runbook completo de WAHA en producción (VPS HostGator)

La mayor parte de la documentación está en portugués de Brasil — nuestra comunidad primaria. Las contribuciones de traducción son muy bienvenidas.


🤝 Contribuir

Este proyecto es open source para la comunidad. Toda contribución es bienvenida — desde corregir un typo en la documentación hasta una feature nueva.

  1. Lee CLAUDE.md (~5 min) — convenciones no negociables (multi-tenancy, RLS, auditoría, privacidad).
  2. Lee CONTRIBUTING.md — flujo de branches y commits.
  3. Sigue el Código de Conducta.

Definition of Done: typecheck en cero, lint en cero, tests relevantes en verde, RLS testeada si se toca una tabla tenant-aware, log de auditoría emitido en mutaciones, migración versionada si cambia el schema.


🐛 Reportar bugs

Abre un issue — la plantilla pide lo que necesitamos (entorno, /api/v1/health, pasos).

Para vulnerabilidades de seguridad, NO abras un issue público — usa el reporte privado de vulnerabilidades. Detalles en SECURITY.md.


🗺️ Roadmap

✅ Entregado

  • Fundación & plataforma — auth (MFA para admins), multi-tenancy con RLS + test de aislamiento, RBAC de 4 roles, log de auditoría append-only, onboarding de tenants.
  • Atención por WhatsApp — inbox de 3 paneles en tiempo real, conexiones WAHA multi-número, medios vía Storage, anti-baneo (throttle + jitter + ventana de horario), detección de STOP.
  • CRM & pedidos — kanban con vocabulario configurable por nicho (fractional indexing), customer 360, contactos, etiquetas, integración con Nuvemshop/Tiendanube para e-commerce.
  • IA nativa — agentes con RAG por tenant (pgvector), análisis de sentimiento, handoff IA→humano, control de presupuesto por org, servidor MCP interno.
  • Privacidad (LGPD) — export y redact vía workers, anonimización en cascada, consentimiento auditado.
  • Self-host — hostgator-setup-kit (app + WAHA + base de datos con 1 comando), baseline.sql auto-curativo, runbook de producción.
  • Webhooks & automatización — fuentes de captación + reglas CUANDO/SI/ENTONCES + triggers para sistemas externos.
  • Gobernanza de atención — RBAC server-side en toda la API, asignación y transferencia auditadas (la IA como asignado de 1ª clase), visualización por rol (RLS) + métricas por agente, enrutamiento automático con cola y panel de gestión, y contrato de gobernanza para agentes de IA externos (docs/specs/14). Épica guiada por 100+ invariantes (G1–G6).
  • Operación visible — pantallas para que el operador entienda al agente: motivo de la retención anti-baneo traducido en la conversación, central de avisos con severidades, control de protección de envío (ventana/ritmo/tope) y propuestas del flywheel aplicables como versión nueva (con compuerta humana).

🔮 Próximo

  • MCP público — capacidades del CRM expuestas al ecosistema de agentes: conecta el agente que quieras y opera Deskcomm.
  • Flywheel de auto-mejora — el ciclo conversación resuelta → conocimiento → agente mejor, medido y con compuerta humana.
  • Plantillas por nicho — pipelines y vocabularios listos para clínicas, inmobiliarias, infoproductos y servicios (e-commerce ya entregado).
  • Integraciones — VTEX y Shopify vía adapter pattern (Nuvemshop ya entregada).
  • Identidad probabilística — unificación de contactos entre canales.

💬 Comunidad


📜 Licencia

Distribuido bajo la licencia MIT — mira LICENSE. Puedes usar, modificar y distribuir libremente, incluso con fines comerciales. El software se entrega "tal cual", sin garantías.


🛟 Soporte & responsabilidades (self-host)

Este es un proyecto self-hosted: cada persona ejecuta el CRM en su propia infraestructura (VPS, base de datos Supabase y clave de IA propias). Eso implica:

  • El soporte es comunitario y "as-is". Sin SLA — es open source mantenido por buena voluntad.
  • Eres responsable de tu instalación, incluyendo actualizaciones (bash hostgator-setup-kit/update.sh) y backups.
  • Protección de datos: quien hospeda la instancia es el responsable de los datos personales que se procesan ahí. Los mantenedores del proyecto no tienen acceso a tus datos.
  • Telemetría (Sentry): por defecto se envían errores anonimizados (sin PII) al Sentry de la comunidad. Usa SENTRY_DSN=off para desactivarlo, o SENTRY_DSN=<tu-dsn> para usar el tuyo.

🙏 Agradecimientos

  • WAHA (devlikeapro) — engine de WhatsApp.
  • Supabase, Vercel, Anthropic (Claude), shadcn/ui.
  • La comunidad que llevó Deskcomm del e-commerce a clínicas, inmobiliarias, infoproductos y más allá — ustedes definieron lo que este proyecto es.

Built with ☕ in Brasil · Made for the community