Consolida o trabalho desta branch de abril/2026 em um bloco pronto pra testar em staging antes do merge pra main. ## Correções de memória semântica - ExtractionService: Princípio Zero + Regra de Ouro (ação consumada vs intenção). - Cenário Daniela_Reservas: Passo 0 de classificação (consulta/intenção/fora). ## Roleta da Sorte (end-to-end) - Schema Supabase + 7 RPCs atômicas (server-side, idempotentes). - Services: Offer, Redeem, WeeklyReport. - Jobs: OfferRouletteJob (hook em ConfirmationService após Pix pago), NotifyRevealed + Scheduler de fallback. - Tool manual GenerateRoletaLinkTool + endpoint público /roleta/notify. - Dashboard /captain/roleta com Resgate + Relatório + anomaly detection. ## Cenário Reclamacoes_Ouvidoria - Triagem P1-P4, framework LAST, Three-level listening, Self-check. - Sem compensação material, detecção de cliente frustrado eleva prioridade. ## Analytics - Funil de conversão /captain/funnel: 5 etapas via regex, zero LLM. - Detector de churn via ChurnOutreach* (cron dias úteis 10h-17h BRT). ## Trabalho pré-existente incluído - Captain Executive Reports (ceo_digest, mattermost_delivery). - get_reserva_preco_tool, Lifecycle ajustes, Reservations UI polimentos. ## Outros - .gitignore: patterns pra credenciais. - Migrations de scenarios idempotentes. - i18n completa pt_BR+en pra roleta/funnel. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
7.8 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
Chatwoot customizado para fazer.ai — plataforma de atendimento ao cliente multi-canal com IA (Captain). Multi-tenant SaaS para hotelaria, com integração de PIX/Inter, reservas e WhatsApp.
Tech Stack:
- Backend: Ruby 3.4.4 + Rails 7.1
- Frontend: Vue 3 + Vite + Pinia
- Database: PostgreSQL + pgvector
- Background Jobs: Sidekiq (com sidekiq-cron)
- Package Manager: pnpm (obrigatório — nunca npm/yarn)
- Testing: RSpec (backend), Vitest (frontend)
- Event system: Wisper (pub/sub)
- Authorization: Pundit
Development Commands
Iniciar aplicação
pnpm run dev # overmind: Rails :3000 + Sidekiq + Vite
pnpm run start:dev # foreman (alternativo)
Testes
# Frontend (Vitest) — CRÍTICO: sem -- com pnpm!
pnpm test # todos
pnpm test app/javascript/path # arquivo específico (NÃO use pnpm test -- <file>)
pnpm test:watch
pnpm test:coverage
# Backend (RSpec)
bundle exec rspec # todos
bundle exec rspec spec/models/contact_spec.rb # arquivo
bundle exec rspec spec/models/contact_spec.rb:42 # linha específica
Qualidade de código
pnpm run eslint # lint JS/Vue
pnpm run eslint:fix # auto-fix
bundle exec rubocop # lint Ruby
bundle exec rubocop -a # auto-fix Ruby
Database
bin/rails db:migrate
bin/rails db:rollback
bin/rails db:reset && bin/rails db:seed
i18n
pnpm run sync:i18n # sincroniza arquivo de tradução
Arquitetura Backend
Modelo de dados central
Account (tenant raiz)
├── Inbox (canal: WhatsApp, Email, Facebook, Instagram, Twilio...)
│ └── Contact (cliente) via ContactInbox
├── Conversation (central: status, priority, SLA, custom_attributes)
│ ├── Message (conteúdo, attachments, sender)
│ ├── Agent (assignee)
│ └── Label
├── AutomationRule
├── Campaign
└── Article (help center)
Padrões Rails usados
| Padrão | Onde | Função |
|---|---|---|
| Services | app/services/ |
Toda lógica de negócio fora dos models |
| Builders | app/builders/ |
Construção de objetos complexos (ex: criar conversa + contato) |
| Finders | app/finders/ |
Query objects encapsulados |
| Listeners | app/listeners/ |
Subscribers Wisper para eventos de domínio |
| Policies | app/policies/ |
Autorização Pundit por recurso |
| Jobs | app/jobs/ |
Todo trabalho assíncrono via Sidekiq |
Estrutura de controllers
app/controllers/
├── api/v1/accounts/{account_id}/ # Endpoints principais (Conversations, Contacts, Inboxes...)
├── api/v1/widget/ # Chat widget público
└── enterprise/api/v1/accounts/captain/ # Captain AI (enterprise)
Enterprise — Captain AI (enterprise/app/)
Camada fazer.ai sobre o Chatwoot base:
- Models chave:
Captain::Unit(multi-unidade hoteleira),Captain::Assistant,Captain::Reservation,Captain::PixCharge,Captain::Document,Captain::ConversationInsight - Integrações: Inter API (pagamento PIX), WhatsApp, sincronização de reservas, webhooks
- AI features: LLM (OpenAI), copilot, audio transcription, label suggestion, help center search
- Feature flags por account:
captain_features(Editor, Assistant, Copilot, LabelSuggestion, AudioTranscription, HelpCenterSearch)
Arquitetura Frontend
app/javascript/
├── dashboard/ # Dashboard do agente (Vue 3 + Vue Router + Pinia)
│ ├── routes/ # Componentes de página
│ ├── store/ # Pinia stores (55+ módulos: conversations, contacts, captain*)
│ ├── components/ # Componentes reutilizáveis
│ ├── api/ # Clientes HTTP por recurso
│ └── i18n/locale/ # Traduções (en + pt_BR SEMPRE)
├── widget/ # Widget de chat embeddable
├── sdk/ # SDK JS (build separado: pnpm run build:sdk)
├── portal/ # Help center público
└── shared/ # Utilities compartilhados
Aliases Vite:
components→app/javascript/dashboard/componentsdashboard→app/javascript/dashboardhelpers→app/javascript/shared/helpersshared,widget,survey,v3→ diretórios equivalentes
Bibliotecas chave: ProseMirror (rich text), ActionCable (real-time), Chart.js, Twilio Voice SDK
Convenções críticas
Branding
fazer.ai — sempre minúsculo com ponto. Nunca Fazer.ai ou FAZER.AI.
Internacionalização
Qualquer texto visível ao usuário exige tradução em en e pt_BR:
app/javascript/dashboard/i18n/locale/en/
app/javascript/dashboard/i18n/locale/pt_BR/
Novos canais / integrações
Siga o padrão existente em app/services/whatsapp/ ou app/services/instagram/ — nunca coloque lógica de canal no controller.
Background jobs
Toda operação demorada vai para Sidekiq. Jobs em app/jobs/, enterprise em enterprise/app/jobs/.
AIOS Framework Integration
This repository includes Synkra AIOS - an AI-orchestrated development system.
Core Rules
- Siga a Constitution em
.aios-core/constitution.md - Priorize
CLI First -> Observability Second -> UI Third - Trabalhe por stories em
docs/stories/ - Nao invente requisitos fora dos artefatos existentes
Quality Gates
- Rode
pnpm run eslint - Rode
bundle exec rubocop - Rode
pnpm test - Rode
bundle exec rspec - Atualize checklist e file list da story antes de concluir
Project Map
- Core framework:
.aios-core/ - CLI entrypoints:
bin/ - Shared packages:
packages/ - Tests:
tests/ - Docs:
docs/
Common Commands
npm run sync:idenpm run sync:ide:checknpm run sync:skills:codexnpm run sync:skills:codex:global(opcional; neste repo o padrao e local-first)npm run validate:structurenpm run validate:agents
Agent Shortcuts
Preferencia de ativacao no Codex CLI:
- Use
/skillse selecioneaios-<agent-id>vindo de.codex/skills(ex.:aios-architect) - Se preferir, use os atalhos abaixo (
@architect,/architect, etc.)
Interprete os atalhos abaixo carregando o arquivo correspondente em .aios-core/development/agents/ (fallback: .codex/agents/), renderize o greeting via generate-greeting.js e assuma a persona ate *exit:
@architect,/architect,/architect.md->.aios-core/development/agents/architect.md@dev,/dev,/dev.md->.aios-core/development/agents/dev.md@qa,/qa,/qa.md->.aios-core/development/agents/qa.md@pm,/pm,/pm.md->.aios-core/development/agents/pm.md@po,/po,/po.md->.aios-core/development/agents/po.md@sm,/sm,/sm.md->.aios-core/development/agents/sm.md@analyst,/analyst,/analyst.md->.aios-core/development/agents/analyst.md@devops,/devops,/devops.md->.aios-core/development/agents/devops.md@data-engineer,/data-engineer,/data-engineer.md->.aios-core/development/agents/data-engineer.md@ux-design-expert,/ux-design-expert,/ux-design-expert.md->.aios-core/development/agents/ux-design-expert.md@squad-creator,/squad-creator,/squad-creator.md->.aios-core/development/agents/squad-creator.md@aios-master,/aios-master,/aios-master.md->.aios-core/development/agents/aios-master.md