#Chatwit SERVIDOR DE PRODUÇÃO ssh -i ~/.ssh/keys/production-server.key root@49.13.155.94 "docker exec... docker service principal: chatwoot_app_chatwoot_sidekiq
POSTGRES SHARED INFRA LOCAL docker exec postgres psql -U postgres -lqt
Chatwit tem um módulo mobile PWA completo em components-next/mobile/. Regras críticas:
icones reutilizaveis apps/socialwise-frontend/components/icons/index.tsx
- ISOLAMENTO TOTAL do desktop. O módulo mobile é 100% visual — renderiza condicionalmente via
<MobileLayout v-if="isSmallScreen" />emDashboard.vue. Nenhuma funcionalidade desktop pode ser alterada ou quebrada pelo mobile. Zero regressão. - CONECTAR, não recriar. Toda feature solicitada para mobile já existe na versão desktop. O trabalho é sempre conectar stores, composables, APIs e componentes existentes ao layout mobile. Nunca reimplemente lógica que o desktop já tem.
- Push via Web Push (VAPID), não Firebase/FCM. Chaves auto-geradas. Service worker em
public/sw.js. - Código:
components-next/mobile/, i18n emlocale/*/mobile.json. Doc:chatwitdocs/Chatwoot-Chatwit-mobile.md.
- Rede Docker:
minha_rede - PostgreSQL compartilhado: host
postgres, porta5432, imagempgvector/pgvector:pg17 - Redis compartilhado: host
redis, porta6379, imagemredis:8.6.1 - Compose da infra:
/home/wital/shared-infra/docker-compose.yml - Os scripts
dev.shdevem reutilizar essa infra e subirpostgres/redisapenas se ainda não estiverem ativos
- Não adicionar
version:no topo de arquivosdocker-compose*.yml/docker-compose*.yaml; esse campo está deprecated no Compose atual
Universal Agent Instructions — Compatible with Claude Code, Cursor, Copilot, Codex, Gemini CLI, and other AI coding agents.
- WITDEV PLATFORM = CÉREBRO | CHATWIT = CARTEIRO E FONTE DE LEADS: A Witdev Platform Core (
witdev-platform-core) detém 100% da inteligência, processamento, lógica de fluxo, IA, classificação e monitoramento jurídico. O Chatwit é estritamente o carteiro — recebe mensagens dos canais (WhatsApp, Instagram, Facebook), encaminha para a plataforma, e entrega as respostas de volta ao lead. O Chatwit também é a fonte primária de leads e contatos da plataforma: todo lead entra pelo Chatwit e é sincronizado com a plataforma via webhook dedicado (Lead Sync). O Chatwit NUNCA processa lógica de negócio. - Dois produtos, um carteiro: O Chatwit serve dois produtos da plataforma simultaneamente:
- Socialwise — automação de atendimento, flows, campanhas em massa, templates WhatsApp
- JusMonitorIA — monitoramento jurídico de processos, notificações proativas a advogados Cada produto tem seu próprio bot auto-provisionado, webhook e contrato de integração, mas ambos passam pelo Chatwit como canal de entrega.
- Duas vias de comunicação:
- Sync (webhook): Chatwit envia à plataforma e mantém ponte aberta por até 30s. Resposta volta na mesma request.
- Async (Agent Bot API): Plataforma envia de volta ao Chatwit via bot token (campanhas, respostas que ultrapassam 30s, flows, notificações jurídicas).
- Contrato unificado (FONTE DE VERDADE): O contrato que governa toda a comunicação entre Chatwit e a plataforma está em
witdev-platform-core/docs/contrato-plataforma-unificada.md(caminho local:/home/wital/witdev-platform-core/docs/contrato-plataforma-unificada.md). Este documento substitui os contratos legados (chatwitdocs/chatwit-contrato-async-30s.mdechatwitdocs/JusmonitorIA-contrato.md, ambos deprecados). Leia o contrato unificado ANTES de implementar qualquer integração nova. - NUNCA modifique código nativo do Chatwoot sem necessidade. PREFIRA criar novos arquivos/métodos a modificar existentes. MANTENHA compatibilidade com atualizações futuras do Chatwoot.
- SEMPRE documente alterações em
chatwitdocs/.
SERVIDOR DE PRODUÇÃO ssh -i /home/wital/Chatwit-Social-dev/id_rsa.v3 root@49.13.155.94 "docker service ls"
A Witdev Platform Core é mantida por uma equipe separada. Mudanças na integração são feitas via contrato documentado, não por gambiarras.
witdev-platform-core/docs/contrato-plataforma-unificada.md
(caminho local: /home/wital/witdev-platform-core/docs/contrato-plataforma-unificada.md)
Este documento cobre TODOS os contratos de integração:
- Contrato 1: Socialwise Flow — webhook de mensagens, botões, flows, dual-mode sync/async
- Contrato 2: JusMonitorIA — webhook de eventos (contato, mensagem, tag), monitoramento jurídico
- Contrato 3: Payment (InfinitePay) — confirmação de pagamento, auto-create PaymentLink
- Contrato 4: Lead Sync — sincronização de leads e arquivos da plataforma
- API: Plataforma → Chatwit (Agent Bot) — entregas async, templates, mídia, contatos
Deprecados:
chatwitdocs/chatwit-contrato-async-30s.mdechatwitdocs/JusmonitorIA-contrato.mdforam substituídos pelo contrato unificado. Consulte-os apenas como referência histórica.
- A plataforma documenta a necessidade no contrato unificado com: contexto, payload, código Ruby proposto, complexidade
- A equipe Chatwit lê o contrato e implementa
- Ao implementar, marca como IMPLEMENTADO no changelog do contrato
- Chatwit Platform Bot token (global,
account_id=NULL): auto-provisionado no startup emconfig/initializers/00_chatwit.rb, registrado na plataforma via/init; substitui os bots legados separados de Socialwise/JusMonitorIA. - ENVs:
SOCIALWISE_WEBHOOK_URL,JUSMONITORIA_WEBHOOK_URL,CHATWIT_WEBHOOK_SECRET,FRONTEND_URL - User token (
chatwitAccessToken): apenas para operações específicas do usuário, nunca para operações de sistema/campanha.
- Nome do Produto: Chatwit 4.10
- Base: Chatwoot 4.10.1 (oficial)
- Customizações: SocialWise Enterprise (fork v4.4)
- Objetivo: Unificar as customizações SocialWise no Chatwoot mais recente
| Etapa | Descrição | Status | Documentação |
|---|---|---|---|
| 1 | SocialWise Flow (debounce, webhook, mensagens ricas) | Completa | chatwitdocs/migration-etapa1.md |
| 2 | Rich Messages Rendering (WhatsApp/Instagram templates, botões, imagens) | Completa | chatwitdocs/migration-etapa2.md |
| 3 | Stickers (rotas, frontend, upload) | Completa | chatwitdocs/migration-etapa3-stickers.md |
| 4 | UI/UX customizações | Pendente | - |
| Arquivo | O que é | Quando usar |
|---|---|---|
codigo_das_minhas_mudancas.diff |
Diff completo do fork Witdev 4.4 | Entender o que foi modificado |
chatwitdocs/migration-etapa1.md |
Doc da Etapa 1 (SocialWise Flow) | Arquivos, config, fluxo |
chatwitdocs/chatwit-contrato-async-30s.md |
Contrato de integração Socialwise | Novas features de integração |
fork-witdev-4.4-modificacoes/ |
Arquivos originais do fork v4.4 | Copiar arquivos não migrados |
lib/integrations/
├── socialwise/ # Core SocialWise
│ ├── cache_manager.rb # Gerenciador de cache
│ ├── instagram_response_processor.rb # Processador Instagram
│ └── webhook_enhancer_service.rb # Enriquecedor de webhook
└── socialwise_flow/ # Motor de Fluxo
├── processor_service.rb # Serviço principal
├── debounce_processor_service.rb # Processador de debounce
└── whatsapp_response_processor.rb # Processador WhatsApp
config/initializers/
├── 00_chatwit.rb # Auto-provisioning do Chatwit Platform Bot + migração dos bots legados
└── socialwise_cache.rb # Preload de cache
app/jobs/socialwise_*.rb # Jobs (debounce, etc.)
app/controllers/api/v1/accounts/integrations/socialwise_*.rb # Controllers
| Variável | Descrição | Padrão |
|---|---|---|
SOCIALWISE_DEBOUNCE_MS |
Tempo de debounce em ms | 0 (desabilitado) |
SOCIALWISE_DEBOUNCE_MAX_MS |
Timeout máximo do debounce | 30000 |
SKIP_SOCIALWISE_CACHE |
Desabilita preload de cache | false |
SOCIALWISE_WEBHOOK_URL |
URL base do Socialwise | - |
CHATWIT_WEBHOOK_SECRET |
Secret compartilhado com Socialwise | - |
FRONTEND_URL |
Base URL do Chatwit | https://chatwit.witdev.com.br |
SOCIALWISE_FLOW_TIMEOUT |
Timeout sync em segundos | 30 |
- Setup:
bundle install && pnpm install - Run Dev:
pnpm devorovermind start -f Procfile.dev - Seed Local Test Data:
bundle exec rails db:seed(quickly populates minimal data for standard feature verification) - Seed Search Test Data:
bundle exec rails search:setup_test_data(bulk fixture generation for search/performance/manual load scenarios) - Seed Account Sample Data (richer test data):
Seeders::AccountSeederis available as an internal utility and is exposed through Super AdminAccounts#seed, but can be used directly in dev workflows too:- UI path: Super Admin → Accounts → Seed (enqueues
Internal::SeedAccountJob). - CLI path:
bundle exec rails runner "Internal::SeedAccountJob.perform_now(Account.find(<id>))"(or callSeeders::AccountSeeder.new(account: Account.find(<id>)).perform!directly).
- UI path: Super Admin → Accounts → Seed (enqueues
- Lint JS/Vue:
pnpm eslint/pnpm eslint:fix - Lint Ruby:
bundle exec rubocop -a - Test JS:
pnpm testorpnpm test:watch - Ruby Version: Manage Ruby via
rbenv(eval "$(rbenv init -)"antes debundle/rspec) - rbenv setup: Before running any
bundleorrspeccommands, init rbenv in your shell (eval "$(rbenv init -)") so the correct Ruby/Bundler versions are used - Always prefer
bundle execfor Ruby CLI tasks (rspec, rake, rubocop, etc.) - Test env: Specs should run without
.env. If present, temporarily rename it (e.g.,.env->.env.bak) while running specs and restore afterward. - Validação após mudanças (obrigatória): depois de qualquer modificação, rode pelo menos a validação mais específica do stack alterado antes de concluir o trabalho. Prefira checks focados nos arquivos tocados (
pnpm eslint path/to/file.vue,bundle exec rubocop path/to/file.rb,bundle exec rspec spec/path/to/file_spec.rb) e só escale para suites maiores quando necessário. - Host validation: com
pnpm installebundle installjá feitos,eslint,vitest,rubocoperspecpodem rodar no host. Para Ruby/test userbenv, rode sem.enve aponte para a infra Docker compartilhada publicada no host (POSTGRES_HOST=127.0.0.1,POSTGRES_PORT=5432,POSTGRES_USERNAME=postgres,POSTGRES_PASSWORD=postgres; Redis emredis://127.0.0.1:6379/0quando necessário).
Os testes Ruby continuam preferencialmente no container Docker para manter o fluxo do time consistente. Porém, neste ambiente, o host também pode rodar rspec/rails em RAILS_ENV=test usando o PostgreSQL/Redis publicados pela infra compartilhada em 127.0.0.1.
docker ps # Verificar containers
./dev.sh start # Iniciar se necessário
./dev.sh shell # Shell no container Rails
bundle exec rspec spec/path/to/file_spec.rb # Rodar testes
bundle exec rspec spec/path/to/file_spec.rb:LINE_NUMBER # Teste individualSe rodar no host, use
rbenv, remova.envtemporariamente e aponte o banco para127.0.0.1:5432comPOSTGRES_USERNAME=postgresePOSTGRES_PASSWORD=postgres. Se aparecerPG::ConnectionBad, verifique se os containerspostgres/redisestão ativos e se o banco de teste já foi preparado.
- Ruby: RuboCop (150 char max line)
- Vue/JS: ESLint (Airbnb base + Vue 3 recommended)
- Vue Components: PascalCase, Composition API com
<script setup> - Events: camelCase
- I18n: No bare strings; use i18n (
en.ymlbackend,en.jsonfrontend) - Error Handling: Custom exceptions (
lib/custom_exceptions/) - Models: Validate presence/uniqueness, add proper indexes
- Type Safety: PropTypes in Vue, strong params in Rails
- Tailwind Only: No custom CSS, no scoped CSS, no inline styles
- Colors: Refer to
tailwind.config.js
- MVP focus: Least code change, happy-path only
- Ship the happy path first; iterate after confirmation
- Prefer minimal, readable code; clarity beats cleverness
- Remove dead/unreachable/unused code
- Don't write multiple versions — pick the best approach
- Avoid writing specs unless explicitly asked
- Prefer
with_modified_envover stubbingENVin specs - Specs in parallel: prefer
error.class.nameover constant equality
- Use a separate git worktree + branch per task to keep changes isolated.
- Keep Codex-specific local setup under
.codex/and useProcfile.worktreefor worktree process orchestration. - The setup workflow in
.codex/environments/environment.tomlshould dynamically generate per-worktree DB/port values (Rails, Vite, Redis DB index) to avoid collisions. - Start each worktree with its own Overmind socket/title so multiple instances can run at the same time.
- Conventional Commits:
type(scope): subject - Example:
feat(socialwise): add template dispatch via agent bot - Example:
fix(instagram): correct rich message mapping - Migração:
migration(etapaN): description - Don't reference Claude in commit messages
- Start with a short, user-facing paragraph describing the product change.
- Add a
Closessection with relevant issue links (GitHub, Linear, etc.). - For feature PRs, add
How to testfrom a product/UX standpoint. - For bugfix PRs, use
How to reproducewhen helpful. - Optionally add a
What changedsection for implementation highlights. - Do not add a
How this was testedsection listing specs/commands.
- Use
components-next/for message bubbles (the rest is being deprecated) - Only update
en.ymlanden.json(other languages handled by community)
- Use compact
module/classdefinitions; avoid nested styles
- Enterprise overlay under
enterprise/extends/overrides OSS code - Search both trees before editing (
rg -n "FooService" app enterprise) - New endpoints/services: consider Enterprise override or extension point (
prepend_mod_with) - Keep request/response contracts stable across OSS and Enterprise
- Enterprise-specific specs under
spec/enterprise - For Enterprise-only behavior: add Enterprise module instead of editing OSS directly
Practical checklist for any change impacting core logic or public APIs
- Search for related files in both trees before editing (e.g.,
rg -n "FooService|ControllerName|ModelName" app enterprise). - If adding new endpoints, services, or models, consider whether Enterprise needs:
- An override (e.g.,
enterprise/app/...), or - An extension point (e.g.,
prepend_mod_with, hooks, configuration) to avoid hard forks.
- An override (e.g.,
- Avoid hardcoding instance- or plan-specific behavior in OSS; prefer configuration, feature flags, or extension points consumed by Enterprise.
- Keep request/response contracts stable across OSS and Enterprise; update both sets of routes/controllers when introducing new APIs.
- When renaming/moving shared code, mirror the change in
enterprise/to prevent drift. - Tests: Add Enterprise-specific specs under
spec/enterprise, mirroring OSS spec layout where applicable. - When modifying existing OSS features for Enterprise-only behavior, add an Enterprise module (via
prepend_mod_with/include_mod_with) instead of editing OSS files directly—especially for policies, controllers, and services. For Enterprise-exclusive features, place code directly underenterprise/.
- For user-facing strings that currently contain "Chatwoot" but should adapt to branded/self-hosted installs, prefer applying
replaceInstallationNamefromshared/composables/useBrandingin the UI layer (for example tooltip and suggestion labels) instead of adding hardcoded brand-specific copy.
- Sync type: Normal merge
- New merge-base:
437dd9d3 - Conflicts: 13 resolved
- Critical: provisioning dos bots agora é centralizado em
config/initializers/00_chatwit.rb;socialwise_bot.rb/jusmonitoria_bot.rbsão legados. O upstream removeulib/tasks/auto_annotate_models.rakeem favor delib/tasks/annotate_rb.rake, econfig/routes.rbagora precisa preservarregister_webhook/reset_secretjunto das rotas Chatwit (whatsapp_templateseevolution_go).
- Branch
content_type: 'template'+send_template_from_payload()nowhatsapp_cloud_service.rb contacts(search, create, show) adicionado aoBOT_ACCESSIBLE_ENDPOINTS- Init do Agent Bot no Socialwise via
POST /initno startup - Contrato:
chatwitdocs/chatwit-contrato-async-30s.mdseções 13, 14, 15
- Renderização visual de templates WhatsApp com imagem e botões
- Renderização de cards Instagram/Facebook (carrosséis, quick replies)
- Componentes Vue:
WhatsAppInteractive.vue,RichCards.vue - Service mapper:
WhatsappRendererMapper.rb
- Integração do motor de fluxo com debounce para envio ao webhook SocialWise
- Suporte a WhatsApp, Instagram e Facebook
- Processamento de respostas do SocialWise (mensagens interativas, templates)
- hook_type: inbox para conectar à caixa de entrada
# Desenvolvimento
overmind start -f Procfile.dev
# Após modificações
bundle install
bundle exec rails db:migrate
# Lint
bundle exec rubocop -a
pnpm eslint:fix
# Verificar contrato Socialwise
cat chatwitdocs/chatwit-contrato-async-30s.md