# Deskcomm Doutrina

Doutrina de código do DeskcommCRM, multi-tenancy com RLS, tripla de migration...

- Repository: https://github.com/melgarafael/DeskcommCRM (5031 stars)
- Category: AI and agents
- License: MIT
- Last updated: 2026-11-01
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add melgarafael/DeskcommCRM --skill deskcomm-doutrina -g -a claude-code -y`
Codex: `npx skills add melgarafael/DeskcommCRM --skill deskcomm-doutrina -g -a codex -y`
Cursor: `npx skills add melgarafael/DeskcommCRM --skill deskcomm-doutrina -g -a cursor -y`
Gemini CLI: `npx skills add melgarafael/DeskcommCRM --skill deskcomm-doutrina -g -a gemini-cli -y`

## Description

Doutrina de código do DeskcommCRM, multi-tenancy com RLS, tripla de migration, restrição de canal, eixo self-host. USE SEMPRE ao escrever ou revisar código neste repositório, e antes de responder pergunta sobre convenção, schema, tenancy, WhatsApp/WAHA, instalador ou Definition of Done. É o ponteiro para a doutrina viva do repo; não substitui ler o CLAUDE.md.

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# DeskcommCRM, doutrina de código

> A fonte da verdade é o `CLAUDE.md` da raiz, lido do `origin/main` e não de um resumo. Esta skill
> existe para te fazer abri-lo na hora certa e para carregar as três regras que mais custam caro
> quando esquecidas.

## 1. Leia antes de escrever

| arquivo | quando |
|---|---|
| `CLAUDE.md` | **sempre**, antes de qualquer código, contém a Definition of Done, que muda |
| `VISION.md` | antes de decidir escopo, ou de dizer não a uma feature |
| `docs/doctrine/` | ao mexer em canal, agente, ou peça que se conecte a outra |
| `ARCHITECTURE.md` | para a visão de uma página |

**Não confie em resumo de doutrina, nem neste arquivo.** A Definition of Done já foi de 13 para 14
itens; cópia congelada ensina a regra de ontem. Abra o `CLAUDE.md`.

## 2. As três que mais custam

**Multi-tenancy.** Toda tabela tenant-aware leva `organization_id uuid not null` e RLS com policy
`tenant_isolation_<tabela>_all` via `fn_user_org_ids()`. Service role bypassa RLS, handler que o usa
filtra `organization_id` **manualmente**, resolvido de fonte confiável (cookie, JWT, segredo de
webhook, token de path), **nunca do body**. No backend é sempre `getUser()`, nunca `getSession()`.

**Schema sai em tripla.** Arquivo em `supabase/migrations/`, apêndice **idempotente** no
`supabase/baseline.sql`, e linha `-- manifest: <o quê e por quê>` no cabeçalho do `.sql` (o `MANIFEST.md` é histórico; não recebe linha nova). O kit self-host aplica **só o baseline**, o que
não chega lá não chega em quem instalou numa VPS, que é o cliente que paga. Constraint nova exige
corrigir os dados **antes**, senão o `update.sh` do clone quebra.

**Nenhuma feature nomeia um provider.** Provider vive em `lib/channels/`. `pnpm lint:channels` é
catraca com lista de dívida: arquivo novo sujo reprova, e arquivo que ficou limpo e não saiu da
lista **também** reprova.

## 3. O eixo que não é técnico

The rest: https://github.com/melgarafael/DeskcommCRM/blob/HEAD/.agents/skills/deskcomm-doutrina/SKILL.md
