iachat/AGENTS.md
Rodribm10 cfffea9c16 feat(captain): semantic memory fixes + roleta + reclamações + analytics
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>
2026-04-21 15:36:25 -03:00

222 lines
7.8 KiB
Markdown

# 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
```bash
pnpm run dev # overmind: Rails :3000 + Sidekiq + Vite
pnpm run start:dev # foreman (alternativo)
```
### Testes
```bash
# 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
```bash
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
```bash
bin/rails db:migrate
bin/rails db:rollback
bin/rails db:reset && bin/rails db:seed
```
### i18n
```bash
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/components`
- `dashboard``app/javascript/dashboard`
- `helpers``app/javascript/shared/helpers`
- `shared`, `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.
<!-- AIOS-MANAGED-START: core -->
## Core Rules
1. Siga a Constitution em `.aios-core/constitution.md`
2. Priorize `CLI First -> Observability Second -> UI Third`
3. Trabalhe por stories em `docs/stories/`
4. Nao invente requisitos fora dos artefatos existentes
<!-- AIOS-MANAGED-END: core -->
<!-- AIOS-MANAGED-START: quality -->
## 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
<!-- AIOS-MANAGED-END: quality -->
<!-- AIOS-MANAGED-START: codebase -->
## Project Map
- Core framework: `.aios-core/`
- CLI entrypoints: `bin/`
- Shared packages: `packages/`
- Tests: `tests/`
- Docs: `docs/`
<!-- AIOS-MANAGED-END: codebase -->
<!-- AIOS-MANAGED-START: commands -->
## Common Commands
- `npm run sync:ide`
- `npm run sync:ide:check`
- `npm run sync:skills:codex`
- `npm run sync:skills:codex:global` (opcional; neste repo o padrao e local-first)
- `npm run validate:structure`
- `npm run validate:agents`
<!-- AIOS-MANAGED-END: commands -->
<!-- AIOS-MANAGED-START: shortcuts -->
## Agent Shortcuts
Preferencia de ativacao no Codex CLI:
1. Use `/skills` e selecione `aios-<agent-id>` vindo de `.codex/skills` (ex.: `aios-architect`)
2. 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`
<!-- AIOS-MANAGED-END: shortcuts -->