@luanpdd/kit-mcp 1.35.0 → 1.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +2 -2
- package/bin/mcp.js +6 -6
- package/bin/ui.js +74 -74
- package/gates/ai-prompt-stability.md +120 -120
- package/gates/budget-description.md +68 -68
- package/gates/confidence.md +29 -29
- package/gates/dependency-check.md +33 -33
- package/gates/dept-cycle-prevention.md +179 -179
- package/gates/golden-signals-coverage.md +133 -133
- package/gates/legacy-refactor-safety.md +178 -178
- package/gates/multi-tenant-rls-coverage.md +102 -102
- package/gates/no-personal-uuid.md +72 -72
- package/gates/obs-agents-mcp-supabase.md +86 -86
- package/gates/obs-skills-frontmatter.md +76 -76
- package/gates/observability-coverage.md +151 -151
- package/gates/omm-no-regression.md +83 -83
- package/gates/postmortem-template-required.md +127 -127
- package/gates/prr-checklist-coverage.md +128 -128
- package/gates/regression.md +32 -32
- package/gates/release-pipeline-policy.md +132 -132
- package/gates/secrets-scan.md +33 -33
- package/gates/service-role-not-in-user-facing.md +113 -113
- package/gates/skill-must-include.md +71 -71
- package/gates/sync-idempotent.md +62 -62
- package/gates/verify-phase-goal.md +34 -34
- package/kit/agents/designer-ui.md +216 -216
- package/kit/agents/workflow-generator.md +537 -167
- package/kit/commands/adicionar-backlog.md +1 -1
- package/kit/commands/adicionar-fase.md +1 -1
- package/kit/commands/adicionar-tarefa.md +1 -1
- package/kit/commands/auditar-observabilidade.md +103 -103
- package/kit/commands/auditar-toil.md +129 -129
- package/kit/commands/caracterizar-prompt.md +195 -195
- package/kit/commands/criar-workflow.md +158 -158
- package/kit/commands/definir-perfil.md +1 -1
- package/kit/commands/definir-slo.md +108 -108
- package/kit/commands/fio.md +1 -1
- package/kit/commands/golden-signals.md +142 -142
- package/kit/commands/instrumentar-fase.md +200 -200
- package/kit/commands/investigar-producao.md +162 -162
- package/kit/commands/observabilidade.md +118 -118
- package/kit/commands/postmortem.md +179 -179
- package/kit/commands/prr.md +205 -205
- package/kit/commands/publicar-rapido.md +207 -207
- package/kit/commands/risk-budget.md +220 -220
- package/kit/commands/sre.md +230 -230
- package/kit/file-manifest.json +424 -424
- package/kit/framework/references/output-style.md +22 -22
- package/kit/hooks/post-apply-migration.js +199 -199
- package/kit/hooks/sidecar-tool-publisher.js +210 -210
- package/kit/skills/_shared-dados-distribuidos/glossary.md +224 -224
- package/kit/skills/_shared-legacy/glossary.md +389 -389
- package/kit/skills/_shared-multi-tenant/glossary.md +186 -186
- package/kit/skills/_shared-observability/glossary.md +396 -396
- package/kit/skills/_shared-sre/glossary.md +712 -712
- package/kit/skills/_shared-supabase/glossary.md +234 -234
- package/kit/skills/blameless-postmortems/SKILL.md +340 -340
- package/kit/skills/burn-rate-alerting/SKILL.md +258 -258
- package/kit/skills/cascading-failures/SKILL.md +311 -311
- package/kit/skills/core-analysis-loop/SKILL.md +352 -352
- package/kit/skills/distributed-tracing/SKILL.md +362 -362
- package/kit/skills/dynamic-workflow-authoring/SKILL.md +327 -223
- package/kit/skills/eliminating-toil/SKILL.md +243 -243
- package/kit/skills/event-based-slos/SKILL.md +296 -296
- package/kit/skills/four-golden-signals/SKILL.md +314 -314
- package/kit/skills/hermetic-builds/SKILL.md +323 -323
- package/kit/skills/legacy-monster-methods/SKILL.md +444 -444
- package/kit/skills/llm-as-dependency/SKILL.md +436 -436
- package/kit/skills/load-shedding-graceful-degradation/SKILL.md +396 -396
- package/kit/skills/observability-driven-development/SKILL.md +315 -315
- package/kit/skills/observability-maturity-model/SKILL.md +222 -222
- package/kit/skills/opentelemetry-standard/SKILL.md +351 -351
- package/kit/skills/production-readiness-review/SKILL.md +305 -305
- package/kit/skills/release-engineering/SKILL.md +367 -367
- package/kit/skills/retry-strategies/SKILL.md +372 -372
- package/kit/skills/sre-risk-management/SKILL.md +221 -221
- package/kit/skills/structured-events/SKILL.md +265 -265
- package/kit/skills/supabase-cron-queues/SKILL.md +275 -275
- package/kit/skills/supabase-database-functions/SKILL.md +332 -332
- package/kit/skills/supabase-declarative-schema/SKILL.md +183 -183
- package/kit/skills/supabase-pgvector-rag/SKILL.md +253 -253
- package/kit/skills/supabase-postgres-style/SKILL.md +138 -138
- package/kit/skills/supabase-storage/SKILL.md +234 -234
- package/kit/skills/telemetry-pipelines/SKILL.md +259 -259
- package/kit/skills/telemetry-sampling/SKILL.md +256 -256
- package/kit/skills/ui-anti-padroes-ia/SKILL.md +261 -261
- package/kit/skills/ui-contexto-produto/SKILL.md +248 -248
- package/kit/skills/ui-cor-estrategia/SKILL.md +213 -213
- package/kit/skills/ui-critica-auditoria/SKILL.md +260 -260
- package/kit/skills/ui-motion-funcional/SKILL.md +264 -264
- package/kit/skills/ui-ritmo-espacial/SKILL.md +259 -259
- package/kit/skills/ui-tipografia/SKILL.md +211 -211
- package/package.json +1 -1
- package/src/cli/index.js +1114 -1114
- package/src/cli/render.js +194 -194
- package/src/cli/upgrade-check.js +135 -135
- package/src/core/error-redaction.js +76 -76
- package/src/core/failures.js +153 -153
- package/src/core/gate-runner.js +205 -205
- package/src/core/gates.js +82 -82
- package/src/core/logger.js +170 -170
- package/src/core/manifest-verify.js +174 -174
- package/src/core/metrics.js +268 -268
- package/src/core/notify.js +60 -60
- package/src/core/path-safety.js +141 -141
- package/src/core/replays.js +120 -120
- package/src/core/ui.js +185 -185
- package/src/mcp-server/install.js +149 -149
- package/src/mcp-server/roots.js +124 -124
- package/src/ui/auto-spawn.js +113 -113
- package/src/ui/browser.js +78 -78
- package/src/ui/client.js +130 -130
- package/src/ui/events.js +65 -65
- package/src/ui/lockfile.js +191 -191
- package/src/ui/port.js +67 -67
- package/src/ui/server.js +547 -547
- package/src/ui/wrapper.js +129 -129
|
@@ -1,234 +1,234 @@
|
|
|
1
|
-
# Glossário Supabase — Termos, Comandos e Patterns Canônicos
|
|
2
|
-
|
|
3
|
-
> Arquivo de referência compartilhado pelas skills `supabase-*`. **NÃO é skill** — não tem `description:` triggerável; não aparece em `listKit`. Cross-referenciado pelas 11 skills via Markdown link relativo.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## (a) Termos PT-BR ↔ EN
|
|
8
|
-
|
|
9
|
-
### Authorization e Auth
|
|
10
|
-
|
|
11
|
-
| EN | PT-BR / Significado |
|
|
12
|
-
|---|---|
|
|
13
|
-
| **RLS** | Row Level Security — segurança em nível de linha. Filtra automaticamente quais linhas de uma tabela cada usuário vê/modifica baseado em policies. |
|
|
14
|
-
| **policy** | Política de RLS — regra `create policy ... on <table> for <op> ...`. Sempre granular por operação (SELECT/INSERT/UPDATE/DELETE). |
|
|
15
|
-
| **`auth.uid()`** | Função que retorna o UUID do usuário autenticado da sessão atual. **Sempre** usar em `(select auth.uid())` em policies. |
|
|
16
|
-
| **`auth.jwt()`** | Função que retorna o JWT decodificado da sessão. Acesso via `auth.jwt()->'app_metadata'` ou `auth.jwt()->>'aal'`. |
|
|
17
|
-
| **`app_metadata`** | Metadata controlado pelo backend (apenas service_role pode mutar). **Use para roles/permissions** em RLS. |
|
|
18
|
-
| **`user_metadata`** | Metadata controlado pelo cliente (`auth.updateUser({data: ...})`). **NUNCA** use em policy de autorização — privilege escalation. |
|
|
19
|
-
| **service_role** | Role do Postgres com bypass total de RLS. **NUNCA** expor ao cliente — vazamento = acesso total ao DB. |
|
|
20
|
-
| **anon** | Role para requests sem autenticação. RLS aplicado normalmente. |
|
|
21
|
-
| **authenticated** | Role para usuário autenticado. RLS aplicado normalmente. |
|
|
22
|
-
| **public** | Role default — equivale a anon + authenticated juntos. Evite — sempre use `to authenticated` ou `to anon` explícito. |
|
|
23
|
-
| **AAL** | Authentication Assurance Level. `aal1` = senha apenas; `aal2` = senha + 2FA. Verifica via `(auth.jwt()->>'aal')::text`. |
|
|
24
|
-
| **defense-in-depth** (v1.23) | Defesa em profundidade — múltiplas camadas independentes de proteção RLS (policy + event trigger + GRANT explícito + bypass controlado + views security_invoker + service_role caveat). Princípio canônico contra esquecimento humano + third-party tooling. |
|
|
25
|
-
| **hardener** (v1.23) | Agent `supabase-rls-hardener` (canônico v1.23) — recebe draft SQL via `Task()` upstream context + intent original e produz SQL final hardenado preservando intent. Verdicts: **GO** (já bom), **STRENGTHEN** (ajusta com diff), **REWRITE** (anti-pattern crítico, requer confirmação). NUNCA descarta upstream silenciosamente. |
|
|
26
|
-
| **cooperative-handoff** (v1.23) | Pattern de handoff entre agents do kit em que agents externos (multi-tenant, debugger, planner, etc.) planejam/sugerem SQL via draft, e agents Supabase materializam o output final hardenado preservando intent upstream. Substitui pattern "BLOCK rígido" — não descarta tokens já gastos. |
|
|
27
|
-
| **event-trigger-rls-auto-enable** (v1.23) | Event trigger Postgres (`rls_auto_enable`) registrado em `ddl_command_end` que ativa RLS automaticamente em `CREATE TABLE` em schemas configurados (`public` por default). Defense-in-depth contra esquecimento humano. Skill: `supabase-rls-defense-in-depth`. |
|
|
28
|
-
| **bypassrls** (v1.23) | Privilégio Postgres `alter role <name> with bypassrls` que permite role bypass total de RLS sempre. Use para roles internos (`postgres`, custom admin role para scripts/cron). NUNCA conceda a role que recebe requisições de cliente. Alternativa Postgres-native ao service_role API key. |
|
|
29
|
-
| **security_invoker** (v1.23) | Atributo de view em Postgres 15+ (`with (security_invoker = true)`) — faz a view respeitar RLS do role chamador, não do criador. Default views são `security_definer` e **bypassam** RLS — defense-in-depth Camada 5. |
|
|
30
|
-
| **column-level privileges** (v1.24) | `GRANT/REVOKE (col1, col2) ON TABLE TO role` — privilégios granulares por coluna. Subset do table-level. Feature AVANÇADA — usar apenas com PII real (LGPD/GDPR), audit log payload, billing, tokens. Camada 8 de defense-in-depth. |
|
|
31
|
-
| **table-level privileges** (v1.24) | `GRANT/REVOKE ON TABLE TO role` — privilégio em **todas** colunas da tabela. Default em CREATE TABLE. Mais permissivo que column-level — quando ambos existem, table-level prevalece (mais permissivo vence). |
|
|
32
|
-
| **wildcard restriction** (v1.24) | Restricted roles (com column-level privilege em apenas algumas colunas) **NÃO** podem usar `SELECT *` — falha com "permission denied for column". Devem listar colunas explicitamente. Aplicação prática: `supabase.from(t).select()` falha; use `.select('col1, col2, col3')`. |
|
|
33
|
-
| **dedicated role table pattern** (v1.24) | Tabela `user_roles` com flags booleans (`is_admin`, `can_view_pii`, etc.) + helper function PG (`public.can_view_pii()` STABLE) consultada em RLS policies. Alternativa **PREFERIDA** ao column-level privileges para casos comuns (admin/user roles). Dinâmico, auditável, sem caveat de wildcard. Recomendado pela doc oficial Supabase. |
|
|
34
|
-
| **column privilege auditing** (v1.24) | Query SQL em `information_schema.column_privileges` para detectar tabelas com colunas potencialmente sensíveis (PII via keyword match: email, phone, ssn, cpf, token, password, credit_card, bank_account, salary, payload) sem column-level GRANT/REVOKE. Usado por Detector 8 do `supabase-rls-hardener` (v1.24). |
|
|
35
|
-
| **custom claims** (v1.25) | Claims customizados injetados no JWT via Custom Access Token Auth Hook durante geração do token. Exemplo canônico: `user_role` adicionado em `claims->>'user_role'` para uso em RLS policies via `authorize()` function. Alternativa moderna a helper function STABLE com JOIN. Camada 9 de defense-in-depth. |
|
|
36
|
-
| **Custom Access Token Auth Hook** (v1.25) | Função Postgres (`custom_access_token_hook(event jsonb) returns jsonb`) invocada pelo Supabase Auth service ANTES de issuing token JWT. Recebe event com user_id + claims atuais, retorna event modificado com claims adicionais. Habilitada via Dashboard (Auth > Hooks Beta) ou config.toml local. |
|
|
37
|
-
| **JWT user_role claim** (v1.25) | Claim canônico `user_role` no JWT (string ou null) lido via `auth.jwt() ->> 'user_role'` em RLS policies ou via `jwt-decode` no cliente. Delivered por Custom Access Token Auth Hook. Eventually consistent — refresh TTL 1h. |
|
|
38
|
-
| **authorize() function** (v1.25) | Função `public.authorize(requested_permission app_permission) returns boolean` — lê `user_role` do JWT e checa permission em `role_permissions` table. `security definer + set search_path = '' + stable`. Pattern canônico para policies: `using ((SELECT authorize('channels.delete')))`. |
|
|
39
|
-
| **supabase_auth_admin role** (v1.25) | Postgres role usado pelo Supabase Auth service ao invocar Auth Hooks (Custom Access Token, etc.). Precisa de GRANTs específicos: `GRANT USAGE ON SCHEMA public`, `GRANT EXECUTE ON FUNCTION <hook>`, `GRANT ALL ON TABLE user_roles`, + RLS policy permissive permitindo SELECT em user_roles. Hook function deve `REVOKE EXECUTE FROM authenticated, anon, public`. |
|
|
40
|
-
| **app_role enum** (v1.25) | Enum Postgres canônico para roles aplicação (`create type public.app_role as enum (...)`). Exemplo: `('admin', 'moderator', 'user')`. Type-safe, refactorable. Caveat: `ALTER TYPE ADD VALUE` não pode ser feito dentro de transação Postgres. |
|
|
41
|
-
| **app_permission enum** (v1.25) | Enum Postgres canônico para permissions formato `<resource>.<action>` (`create type public.app_permission as enum (...)`). Exemplo: `('channels.delete', 'channels.create', 'messages.delete', 'users.ban')`. Consultado por `authorize()` function. |
|
|
42
|
-
| **jwt-decode client pattern** (v1.25) | Package npm `jwt-decode` para decodificar JWT access_token no cliente JavaScript. Usado dentro de `onAuthStateChange` listener para acessar custom claims após login/refresh. Caveat: apenas decode (NÃO valida assinatura) — para validação server-side use `@supabase/ssr` `getUser()`. |
|
|
43
|
-
| **Postgres roles** (v1.26) | Entidades Postgres que podem ter permissions. Podem ser **users** (com LOGIN) ou **groups** (sem LOGIN). Para **system access** (cron jobs, BI tools, ETL, admin scripts). NÃO usar para application access (use RLS + Custom Claims v1.25). Camada 10 de defense-in-depth. |
|
|
44
|
-
| **INHERIT / NOINHERIT** (v1.26) | INHERIT (default): child role herda permissions do parent automaticamente. NOINHERIT: child role precisa `SET ROLE parent` explícito para usar permissions. NOINHERIT preferido para roles superuser-like (audit trail mais claro). |
|
|
45
|
-
| **LOGIN PASSWORD** (v1.26) | `create role "name" with login password 'pwd'` — cria role que pode autenticar via senha. Best practices: 12+ chars, password manager, mixed case+symbols, percent-encode em connection string. Sem LOGIN, role é group para hierarchy. |
|
|
46
|
-
| **GRANT/REVOKE syntax** (v1.26) | `GRANT <permission> ON <object> TO <role>` / `REVOKE <permission> ON <object> FROM <role>`. Permission types: SELECT, INSERT, UPDATE, DELETE, EXECUTE, USAGE. Objects: tables, views, functions, schemas, sequences. Use `ALTER DEFAULT PRIVILEGES` para tabelas futuras. |
|
|
47
|
-
| **role hierarchy** (v1.26) | Padrão Postgres de role inheritance via `GRANT <parent_role> TO <child_role>`. Multi-level (readers ← admins ← bob). Simplifica permission management. Combine com NOINHERIT para superuser roles. |
|
|
48
|
-
| **predefined Supabase roles** (v1.26) | 10 roles configurados automaticamente em todo projeto Supabase: `postgres` (admin), `anon` (unauthenticated), `authenticator` (PostgREST switch), `authenticated` (logged-in), `service_role` (bypass RLS), `supabase_auth_admin` (Auth middleware), `supabase_storage_admin` (Storage middleware), `supabase_etl_admin` (Replication), `dashboard_user` (UI), `supabase_admin` (internal). NÃO criar substitutos — documentar uso direto. |
|
|
49
|
-
| **role switching authenticator** (v1.26) | PostgREST recebe JWT, valida via `authenticator` role, e switches para `anon` ou `authenticated` baseado em claims. `authenticator` tem acesso muito limitado — apenas SWITCH ROLE. Pattern interno do Supabase. |
|
|
50
|
-
| **percent-encoding password** (v1.26) | Special symbols em password Postgres precisam ser percent-encoded em connection string URL (`=` → `%3D`, `&` → `%26`, `+` → `%2B`, `#` → `%23`, `:` → `%3A`, `/` → `%2F`, `@` → `%40`, space → `%20`). Necessário em `postgresql://user:p%3Dssword@host/db`. |
|
|
51
|
-
|
|
52
|
-
### Database e Schema
|
|
53
|
-
|
|
54
|
-
| EN | PT-BR / Significado |
|
|
55
|
-
|---|---|
|
|
56
|
-
| **`schemas/`** | Pasta `supabase/schemas/` — fonte da verdade declarative do schema. Editar aqui, depois `db diff` gera migration. |
|
|
57
|
-
| **`migrations/`** | Pasta `supabase/migrations/` — arquivos `YYYYMMDDHHmmss_<name>.sql` versionados em git. |
|
|
58
|
-
| **`db diff`** | `supabase db diff -f <name>` — gera migration a partir do diff entre schemas/ declarado e DB local atual. |
|
|
59
|
-
| **`db reset`** | `supabase db reset` — recria DB local do zero + reaplica todas as migrations + seeds. |
|
|
60
|
-
| **`search_path`** | Caminho de busca de schema do Postgres. **Sempre** `set search_path = ''` em funções. |
|
|
61
|
-
| **schema-qualified** | Referência a objeto com schema explícito: `public.tasks` em vez de só `tasks`. Obrigatório quando `search_path = ''`. |
|
|
62
|
-
| **`SECURITY INVOKER`** | Função executa com permissões de quem chamou. Default obrigatório. |
|
|
63
|
-
| **`SECURITY DEFINER`** | Função executa com permissões do owner. Apenas com justificativa documentada. |
|
|
64
|
-
| **`IMMUTABLE`** | Função sempre retorna o mesmo para os mesmos inputs (sem consultar DB). |
|
|
65
|
-
| **`STABLE`** | Função consulta DB mas não modifica — mesmo resultado dentro de uma transação. |
|
|
66
|
-
| **`VOLATILE`** | Default. Função pode retornar valores diferentes ou ter side effects. |
|
|
67
|
-
|
|
68
|
-
### Realtime
|
|
69
|
-
|
|
70
|
-
| EN | PT-BR / Significado |
|
|
71
|
-
|---|---|
|
|
72
|
-
| **broadcast** | Mensagens custom via WebSocket — tipo recomendado em 2026 (substitui `postgres_changes` em apps novos). |
|
|
73
|
-
| **postgres_changes** | Pattern legado de receber mudanças do DB via stream. Single-threaded — não escala. **Migrar para broadcast.** |
|
|
74
|
-
| **presence** | Tracking de "quem está online". Usar **com moderação** — só para presence real (online status, cursor de colaboração). |
|
|
75
|
-
| **channel** | Canal de comunicação — naming canônico `scope:entity:id` (ex: `room:123:messages`). |
|
|
76
|
-
| **private channel** | Canal autenticado — `private: true` + RLS sobre `realtime.messages`. **Default em produção.** |
|
|
77
|
-
| **`realtime.broadcast_changes`** | Função SQL para emitir broadcast de dentro do Postgres (de trigger). |
|
|
78
|
-
| **`realtime.send`** | Função SQL para emitir mensagem custom (não amarrada a tabela). |
|
|
79
|
-
|
|
80
|
-
### Edge Functions
|
|
81
|
-
|
|
82
|
-
| EN | PT-BR / Significado |
|
|
83
|
-
|---|---|
|
|
84
|
-
| **Edge Function** | Função serverless Deno hospedada por Supabase. Roda perto do usuário. |
|
|
85
|
-
| **`Deno.serve`** | Built-in para HTTP server em Edge Functions (NÃO usar `serve` de `deno.land/std`). |
|
|
86
|
-
| **`EdgeRuntime.waitUntil`** | Permite tarefa background continuar após response retornar. |
|
|
87
|
-
| **`npm:` / `jsr:`** | Specifiers de import obrigatórios (sem bare specifiers). Ex: `import x from "npm:hono@4.6.7"`. |
|
|
88
|
-
|
|
89
|
-
### Storage e Vector
|
|
90
|
-
|
|
91
|
-
| EN | PT-BR / Significado |
|
|
92
|
-
|---|---|
|
|
93
|
-
| **bucket** | Container de arquivos — público ou privado. Privado por default. |
|
|
94
|
-
| **signed URL** | URL temporária com expiration para download de arquivo privado. |
|
|
95
|
-
| **`storage.objects`** | Tabela onde Storage grava metadados — RLS aplicado aqui controla acesso. |
|
|
96
|
-
| **multi-tenant path isolation** | Pattern: prefixar path do arquivo com `auth.uid()` (`{user_id}/file.png`) para isolar por tenant via RLS. |
|
|
97
|
-
| **TUS** | Tus Resumable Upload protocol — upload em chunks resumable. |
|
|
98
|
-
| **pgvector** | Extensão Postgres para embeddings/similarity search. |
|
|
99
|
-
| **HNSW** | Hierarchical Navigable Small World — index para vector. **Recall melhor.** Default em 2026. |
|
|
100
|
-
| **IVFFlat** | Inverted File Flat — index alternativo. Mais rápido com volumes grandes mas recall menor. |
|
|
101
|
-
| **`<=>`** | Operador cosine distance em pgvector. |
|
|
102
|
-
| **`<#>`** | Operador inner product em pgvector. |
|
|
103
|
-
| **`<->`** | Operador L2 (euclidean) distance em pgvector. |
|
|
104
|
-
|
|
105
|
-
### Background Jobs
|
|
106
|
-
|
|
107
|
-
| EN | PT-BR / Significado |
|
|
108
|
-
|---|---|
|
|
109
|
-
| **`pg_cron`** | Extensão para jobs cron dentro do Postgres. Schedule SQL/funções. |
|
|
110
|
-
| **`pgmq`** | Postgres Message Queue — extensão de queues. Requer Postgres 15.6.1.143+. |
|
|
111
|
-
| **`pg_net`** | Extensão para requests HTTP de dentro do Postgres. v0.10.0+. |
|
|
112
|
-
|
|
113
|
-
### Branching
|
|
114
|
-
|
|
115
|
-
| EN | PT-BR / Significado |
|
|
116
|
-
|---|---|
|
|
117
|
-
| **branch database** | Cópia preview do DB de produção para feature branches. |
|
|
118
|
-
| **Branching Compute Hours** (v1.27) | Métrica de billing Supabase para tempo de compute consumido por branches. FORA do Spend Cap. Compute Credits NÃO aplicam. Micro $0.01344/h. |
|
|
119
|
-
| **Branching workflow (Supabase)** (v1.27) | Fluxo de criar preview/persistent branches separados da production. Cada branch tem própria instância Supabase + API credentials. |
|
|
120
|
-
| **Deploy DAG (7 steps)** (v1.27) | Directed Acyclic Graph que descreve deployment de branch: clone → pull → health → configure → migrate → seed → deploy. Falha em parent step skipa children. |
|
|
121
|
-
| **dotenvx encrypted fields** (v1.27) | Pattern de encryptar secrets em arquivos `.env.*` commitados no git. Decryption key em `.env.keys` (gitignored). Sintaxe `encrypted:<value>` em config.toml — só funciona em designated secret fields. |
|
|
122
|
-
| **Migration repair** (v1.27) | Comando `supabase migration repair --status applied\|reverted <timestamp>` que atualiza tracking table only, NÃO aplica/reverte SQL. Para corrigir history record quando schema state real está OK. |
|
|
123
|
-
| **persistent branch** | Branch que sobrevive entre PRs (staging long-lived). |
|
|
124
|
-
| **Persistent branch** (v1.27) | Branch Supabase long-lived (staging/QA/dev), NÃO auto-pause em inatividade, não auto-delete em PR merge. Custo Branching Compute Hours contínuo. |
|
|
125
|
-
| **pgTAP testing** (v1.27) | Pattern de testing PostgreSQL usando pgTAP extension (TAP — Test Anything Protocol). Comando `supabase test db` busca em `supabase/tests/*.sql`. Funções canônicas: plan/ok/is/throws_ok/finish. |
|
|
126
|
-
| **preview branch** | Branch criado para PR específico — destruído ao merge. |
|
|
127
|
-
| **Preview branch** (v1.27) | Branch Supabase ephemeral, auto-pause em inatividade, auto-delete em PR merge/close. Padrão para feature development. |
|
|
128
|
-
| **[remotes] block** (v1.27) | Seção em `config.toml` que define configuração branch-specific. Referencia `project_id` obtido via `supabase --experimental branches list`. Permite override de db/api/auth/edge_runtime per branch. |
|
|
129
|
-
| **Schema drift** (v1.27) | Divergência entre estado real do schema e migration tracking. Causa típica: changes diretos no dashboard, ou timestamps wrong order após git rebase. Resolução via `migration repair` (tracking) ou rebase rename (timestamps). |
|
|
130
|
-
| **`SUPABASE_PUBLISHABLE_KEYS` / `SUPABASE_SECRET_KEYS`** (v1.30) | Env vars 2026 — **JSON dicts** (não strings) com chaves nomeadas. Acesso canônico: `JSON.parse(Deno.env.get('SUPABASE_SECRET_KEYS')!)['default']`. Cada projeto pode ter múltiplas chaves nomeadas (`default`, `automations`, `internal-cron`) para rotação granular + audit per-consumer. Legacy `SUPABASE_ANON_KEY` e `SUPABASE_SERVICE_ROLE_KEY` ainda funcionam mas devem ser evitados em código novo. |
|
|
131
|
-
| **`@supabase/server`** (v1.30) | Package npm 2026 que reduz boilerplate de auth em Edge Functions. Exporta `withSupabase({auth, ...})` (wrapper canônico) e `createSupabaseContext` (low-level para erros customizados). Pré-configura `ctx.supabase` (RLS-aware) ou `ctx.supabaseAdmin` (bypass) conforme auth mode. |
|
|
132
|
-
| **`withSupabase` auth modes** (v1.30) | 4 modos: `'user'` (JWT em Authorization), `'secret:<name>'` (sb_secret em apikey, ctx.supabaseAdmin), `'publishable:<name>'` (sb_publishable em apikey, ctx.supabase anon), `'none'` (sem check — handler responsável). Combinável via array `['user', 'secret:cron']` — `ctx.authMode` indica qual matchou. |
|
|
133
|
-
| **`verify_jwt` toggle** (v1.30) | Flag em `[functions.<name>]` no `config.toml` — `true` (default, plataforma valida JWT antes do handler) ou `false` (webhooks externos / service-to-service auth via apikey). CLI `--no-verify-jwt` para deploy/serve único. |
|
|
134
|
-
| **`Authorization` vs `apikey`** (v1.30) | Headers distintos. `Authorization: Bearer <user-jwt>` é JWT do Supabase Auth. `apikey: sb_publishable_... \| sb_secret_...` é API key 2026 do projeto. Mandar API key como Bearer = 401 (causa #1 de erros auth). Browser logado envia ambos. |
|
|
135
|
-
| **per-function `deno.json`** (v1.30) | Pattern recomendado 2026 — cada função tem seu próprio `deno.json` com `imports`, substituindo `import_map.json` global. Isola deps; update em uma função não quebra outra. Aliases tipo `"supabase": "npm:@supabase/supabase-js@2.95.0"` permitem imports limpos. |
|
|
136
|
-
| **per-function `config.toml`** (v1.30) | Seção `[functions.<name>]` configura comportamento por função: `verify_jwt`, `import_map` (legacy), `entrypoint` (JS puro CLI 1.215+), `static_files` (Wasm/assets CLI 2.7.0+). Sobrescreve defaults. |
|
|
137
|
-
| **`Supabase.ai.Session`** (v1.30) | Built-in runtime para AI inference. `gte-small` (zero deps, 384-dim embeddings, English, max 512 tokens). LLM via `AI_INFERENCE_API_HOST` apontando para Ollama (`mode: 'ollama'`) ou Llamafile (`mode: 'openaicompatible'`). Streaming via async iterator. |
|
|
138
|
-
| **S3FS persistent storage** (v1.30) | Mount S3-compatible bucket como filesystem em `/s3/<bucket-name>/`. Habilitado por 4 secrets: `S3FS_ENDPOINT_URL`, `S3FS_REGION`, `S3FS_ACCESS_KEY_ID`, `S3FS_SECRET_ACCESS_KEY`. Permite `Deno.writeFile`, `Deno.readFile`, `Deno.mkdir` em paths persistentes (vs `/tmp` ephemeral). |
|
|
139
|
-
| **`x-region` / `FunctionRegion`** (v1.30) | Regional invocation. Header `x-region: us-east-1` ou query `?forceFunctionRegion=us-east-1` força execução em região específica (útil quando DB-heavy + DB regional). 14 regiões disponíveis. **Caveat:** desliga failover automático. Header response `x-sb-edge-region` confirma região executada. Env `SB_REGION` lê região atual. |
|
|
140
|
-
| **`Deno.upgradeWebSocket`** (v1.30) | API canônica para WebSocket server em Edge Function. Browser não permite custom headers — JWT via query param `?jwt=...` ou subprotocol `Sec-WebSocket-Protocol: jwt-<token>`. Validar com `supabase.auth.getUser(jwt)`. Local: `[edge_runtime] policy = "per_worker"` obrigatório (desliga hot-reload). |
|
|
141
|
-
| **`static_files` Wasm** (v1.30) | Config em `config.toml` para bundle Wasm + assets junto com a função (CLI 2.7.0+). Format `static_files = ["./functions/wasm-add/add-wasm/pkg/*"]`. Caveat: **não funciona com `--use-api`** — requer Docker no deploy. |
|
|
142
|
-
| **`RateLimitError` / `retryAfterMs`** (v1.30) | Erro Deno lançado quando Edge Function chama outra Edge Function e excede ~5000 req/min do chain. `err.retryAfterMs` indica delay sugerido. Resposta canônica: 429 + header `Retry-After`. Retry pattern: `setTimeout(_, err.retryAfterMs)`. Não conta inbound nem APIs externas — só function-to-function. |
|
|
143
|
-
| **`FunctionsHttpError` / `FunctionsRelayError` / `FunctionsFetchError`** (v1.30) | 3 error classes do `@supabase/supabase-js` para classificar falha de `supabase.functions.invoke`. HttpError = função executou e retornou 4xx/5xx; RelayError = gateway↔Supabase; FetchError = inalcançável. `error.context.json()` lê body do HttpError. |
|
|
144
|
-
| **status code 546** (v1.30) | Custom code Supabase = `WORKER_LIMIT` (recurso esgotado — memory 256MB, CPU 2s, ou wall clock 150s/400s excedido). Logs mostram qual limite estourou. Fix: reduzir bundle, chunk processing, mover para `EdgeRuntime.waitUntil` ou pgmq. |
|
|
145
|
-
| **`mcp-lite`** (v1.30) | Framework TypeScript zero-deps para MCP servers. Pattern canônico em Edge Function: dois Hono apps — outer `app.route('/<function-name>', mcpApp)` (Supabase prefixa URL com nome) + inner `mcpApp.all('/mcp', handler)` (transport binding). Scaffold via `npm create mcp-lite@latest` template "Supabase Edge Functions". |
|
|
146
|
-
| **`corsHeaders` from SDK** (v1.30) | A partir de `@supabase/supabase-js@2.95.0`, import `corsHeaders` direto do SDK: `import { corsHeaders } from 'npm:@supabase/supabase-js@2.95.0/cors'`. Auto-sync com novos headers em releases futuras (evita drift de strings hard-coded). |
|
|
147
|
-
|
|
148
|
-
---
|
|
149
|
-
|
|
150
|
-
## (b) Comandos CLI canônicos
|
|
151
|
-
|
|
152
|
-
```bash
|
|
153
|
-
# Schema declarative
|
|
154
|
-
supabase stop # parar containers (necessário antes de db diff)
|
|
155
|
-
supabase db diff -f <name> # gera migration de schemas/ → migrations/
|
|
156
|
-
supabase db reset # reset local + reaplica migrations + seeds
|
|
157
|
-
supabase db push # aplica migrations não aplicadas no DB remote
|
|
158
|
-
supabase db pull # pulla mudanças remote → cria migration local
|
|
159
|
-
|
|
160
|
-
# Migrations
|
|
161
|
-
supabase migration new <name> # cria migration vazia com timestamp UTC
|
|
162
|
-
|
|
163
|
-
# Edge Functions
|
|
164
|
-
supabase functions new <name> # cria boilerplate de Edge Function
|
|
165
|
-
supabase functions deploy <name> # deploy para Supabase
|
|
166
|
-
supabase functions invoke <name> --body '{}' # invoca localmente
|
|
167
|
-
|
|
168
|
-
# Tipos
|
|
169
|
-
supabase gen types typescript --local > types/db.ts # gera tipos do schema local
|
|
170
|
-
supabase gen types typescript --linked > types/db.ts # gera tipos do remote linked
|
|
171
|
-
|
|
172
|
-
# Project lifecycle
|
|
173
|
-
supabase init # inicializa supabase/ no projeto
|
|
174
|
-
supabase start # sobe stack local (Postgres + Studio + Auth + ...)
|
|
175
|
-
supabase stop # derruba stack local
|
|
176
|
-
supabase status # status dos containers locais
|
|
177
|
-
supabase link --project-ref <ref> # linka projeto local com remote
|
|
178
|
-
|
|
179
|
-
# Branching
|
|
180
|
-
supabase branches create <name> # cria preview branch
|
|
181
|
-
supabase branches list # lista branches
|
|
182
|
-
supabase branches delete <name> # deleta branch (importante para custo!)
|
|
183
|
-
|
|
184
|
-
# Secrets
|
|
185
|
-
supabase secrets set --env-file .env.production # setar secrets em remote
|
|
186
|
-
supabase secrets list # listar (sem revelar valores)
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
---
|
|
190
|
-
|
|
191
|
-
## (c) Patterns canônicos consolidados
|
|
192
|
-
|
|
193
|
-
### Pattern: `(select auth.uid())` wrapper em RLS
|
|
194
|
-
- Sem `(select)`: degradação até **1000×** em queries com filtro RLS
|
|
195
|
-
- Detalhes: [supabase-rls-policies](../supabase-rls-policies/SKILL.md)
|
|
196
|
-
|
|
197
|
-
### Pattern: `set search_path = ''` em funções
|
|
198
|
-
- Sem isso: vulnerável a hijack de schema via `search_path` manipulation
|
|
199
|
-
- Detalhes: [supabase-database-functions](../supabase-database-functions/SKILL.md)
|
|
200
|
-
|
|
201
|
-
### Pattern: `getAll`/`setAll` cookies em SSR (Next.js)
|
|
202
|
-
- Pacote `@supabase/ssr` — **NUNCA** `@supabase/auth-helpers-nextjs` (deprecated)
|
|
203
|
-
- Detalhes: [supabase-auth-ssr](../supabase-auth-ssr/SKILL.md)
|
|
204
|
-
|
|
205
|
-
### Pattern: `cron → pgmq → Edge Function` (background jobs)
|
|
206
|
-
- Schedule via `pg_cron` → enqueue em `pgmq` → consumir e disparar `pg_net.http_post()` para Edge Function
|
|
207
|
-
- Sem dep externa (Inngest/Trigger.dev) — tudo dentro de Supabase
|
|
208
|
-
- Detalhes: [supabase-cron-queues](../supabase-cron-queues/SKILL.md)
|
|
209
|
-
|
|
210
|
-
### Pattern: RAG with permissions (similarity + RLS)
|
|
211
|
-
- Embeddings em coluna vector + RLS policy filtrando por `user_id` ou `org_id`
|
|
212
|
-
- Sem RLS, qualquer cliente vê embeddings de todos os tenants
|
|
213
|
-
- Detalhes: [supabase-pgvector-rag](../supabase-pgvector-rag/SKILL.md)
|
|
214
|
-
|
|
215
|
-
### Pattern: multi-tenant path isolation em Storage
|
|
216
|
-
- Path do arquivo prefixado com `auth.uid()` ou `org_id`: `{user_id}/avatar.png`, `{org_id}/docs/file.pdf`
|
|
217
|
-
- RLS sobre `storage.objects` valida que o cliente acessa apenas o próprio prefixo
|
|
218
|
-
- Detalhes: [supabase-storage](../supabase-storage/SKILL.md)
|
|
219
|
-
|
|
220
|
-
### Pattern: declarative-first → diff → migration
|
|
221
|
-
- Editar schemas em `supabase/schemas/*.sql`
|
|
222
|
-
- Rodar `supabase stop && supabase db diff -f <name>` para gerar migration em `supabase/migrations/`
|
|
223
|
-
- Revisar migration manualmente antes de aplicar
|
|
224
|
-
- Detalhes: [supabase-declarative-schema](../supabase-declarative-schema/SKILL.md)
|
|
225
|
-
|
|
226
|
-
### Pattern: `private: true` em Realtime channels
|
|
227
|
-
- Default em produção (2026) — desabilita acesso anônimo
|
|
228
|
-
- Requer RLS sobre `realtime.messages` para SELECT (read) e INSERT (write)
|
|
229
|
-
- Detalhes: [supabase-realtime](../supabase-realtime/SKILL.md)
|
|
230
|
-
|
|
231
|
-
### Pattern: schema-qualified em Edge Functions chamando Supabase
|
|
232
|
-
- Function consulta `public.tasks` (não `tasks`) quando usar service-role client
|
|
233
|
-
- Combina com `set search_path = ''` em DB functions chamadas via RPC
|
|
234
|
-
- Detalhes: [supabase-edge-functions](../supabase-edge-functions/SKILL.md)
|
|
1
|
+
# Glossário Supabase — Termos, Comandos e Patterns Canônicos
|
|
2
|
+
|
|
3
|
+
> Arquivo de referência compartilhado pelas skills `supabase-*`. **NÃO é skill** — não tem `description:` triggerável; não aparece em `listKit`. Cross-referenciado pelas 11 skills via Markdown link relativo.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## (a) Termos PT-BR ↔ EN
|
|
8
|
+
|
|
9
|
+
### Authorization e Auth
|
|
10
|
+
|
|
11
|
+
| EN | PT-BR / Significado |
|
|
12
|
+
|---|---|
|
|
13
|
+
| **RLS** | Row Level Security — segurança em nível de linha. Filtra automaticamente quais linhas de uma tabela cada usuário vê/modifica baseado em policies. |
|
|
14
|
+
| **policy** | Política de RLS — regra `create policy ... on <table> for <op> ...`. Sempre granular por operação (SELECT/INSERT/UPDATE/DELETE). |
|
|
15
|
+
| **`auth.uid()`** | Função que retorna o UUID do usuário autenticado da sessão atual. **Sempre** usar em `(select auth.uid())` em policies. |
|
|
16
|
+
| **`auth.jwt()`** | Função que retorna o JWT decodificado da sessão. Acesso via `auth.jwt()->'app_metadata'` ou `auth.jwt()->>'aal'`. |
|
|
17
|
+
| **`app_metadata`** | Metadata controlado pelo backend (apenas service_role pode mutar). **Use para roles/permissions** em RLS. |
|
|
18
|
+
| **`user_metadata`** | Metadata controlado pelo cliente (`auth.updateUser({data: ...})`). **NUNCA** use em policy de autorização — privilege escalation. |
|
|
19
|
+
| **service_role** | Role do Postgres com bypass total de RLS. **NUNCA** expor ao cliente — vazamento = acesso total ao DB. |
|
|
20
|
+
| **anon** | Role para requests sem autenticação. RLS aplicado normalmente. |
|
|
21
|
+
| **authenticated** | Role para usuário autenticado. RLS aplicado normalmente. |
|
|
22
|
+
| **public** | Role default — equivale a anon + authenticated juntos. Evite — sempre use `to authenticated` ou `to anon` explícito. |
|
|
23
|
+
| **AAL** | Authentication Assurance Level. `aal1` = senha apenas; `aal2` = senha + 2FA. Verifica via `(auth.jwt()->>'aal')::text`. |
|
|
24
|
+
| **defense-in-depth** (v1.23) | Defesa em profundidade — múltiplas camadas independentes de proteção RLS (policy + event trigger + GRANT explícito + bypass controlado + views security_invoker + service_role caveat). Princípio canônico contra esquecimento humano + third-party tooling. |
|
|
25
|
+
| **hardener** (v1.23) | Agent `supabase-rls-hardener` (canônico v1.23) — recebe draft SQL via `Task()` upstream context + intent original e produz SQL final hardenado preservando intent. Verdicts: **GO** (já bom), **STRENGTHEN** (ajusta com diff), **REWRITE** (anti-pattern crítico, requer confirmação). NUNCA descarta upstream silenciosamente. |
|
|
26
|
+
| **cooperative-handoff** (v1.23) | Pattern de handoff entre agents do kit em que agents externos (multi-tenant, debugger, planner, etc.) planejam/sugerem SQL via draft, e agents Supabase materializam o output final hardenado preservando intent upstream. Substitui pattern "BLOCK rígido" — não descarta tokens já gastos. |
|
|
27
|
+
| **event-trigger-rls-auto-enable** (v1.23) | Event trigger Postgres (`rls_auto_enable`) registrado em `ddl_command_end` que ativa RLS automaticamente em `CREATE TABLE` em schemas configurados (`public` por default). Defense-in-depth contra esquecimento humano. Skill: `supabase-rls-defense-in-depth`. |
|
|
28
|
+
| **bypassrls** (v1.23) | Privilégio Postgres `alter role <name> with bypassrls` que permite role bypass total de RLS sempre. Use para roles internos (`postgres`, custom admin role para scripts/cron). NUNCA conceda a role que recebe requisições de cliente. Alternativa Postgres-native ao service_role API key. |
|
|
29
|
+
| **security_invoker** (v1.23) | Atributo de view em Postgres 15+ (`with (security_invoker = true)`) — faz a view respeitar RLS do role chamador, não do criador. Default views são `security_definer` e **bypassam** RLS — defense-in-depth Camada 5. |
|
|
30
|
+
| **column-level privileges** (v1.24) | `GRANT/REVOKE (col1, col2) ON TABLE TO role` — privilégios granulares por coluna. Subset do table-level. Feature AVANÇADA — usar apenas com PII real (LGPD/GDPR), audit log payload, billing, tokens. Camada 8 de defense-in-depth. |
|
|
31
|
+
| **table-level privileges** (v1.24) | `GRANT/REVOKE ON TABLE TO role` — privilégio em **todas** colunas da tabela. Default em CREATE TABLE. Mais permissivo que column-level — quando ambos existem, table-level prevalece (mais permissivo vence). |
|
|
32
|
+
| **wildcard restriction** (v1.24) | Restricted roles (com column-level privilege em apenas algumas colunas) **NÃO** podem usar `SELECT *` — falha com "permission denied for column". Devem listar colunas explicitamente. Aplicação prática: `supabase.from(t).select()` falha; use `.select('col1, col2, col3')`. |
|
|
33
|
+
| **dedicated role table pattern** (v1.24) | Tabela `user_roles` com flags booleans (`is_admin`, `can_view_pii`, etc.) + helper function PG (`public.can_view_pii()` STABLE) consultada em RLS policies. Alternativa **PREFERIDA** ao column-level privileges para casos comuns (admin/user roles). Dinâmico, auditável, sem caveat de wildcard. Recomendado pela doc oficial Supabase. |
|
|
34
|
+
| **column privilege auditing** (v1.24) | Query SQL em `information_schema.column_privileges` para detectar tabelas com colunas potencialmente sensíveis (PII via keyword match: email, phone, ssn, cpf, token, password, credit_card, bank_account, salary, payload) sem column-level GRANT/REVOKE. Usado por Detector 8 do `supabase-rls-hardener` (v1.24). |
|
|
35
|
+
| **custom claims** (v1.25) | Claims customizados injetados no JWT via Custom Access Token Auth Hook durante geração do token. Exemplo canônico: `user_role` adicionado em `claims->>'user_role'` para uso em RLS policies via `authorize()` function. Alternativa moderna a helper function STABLE com JOIN. Camada 9 de defense-in-depth. |
|
|
36
|
+
| **Custom Access Token Auth Hook** (v1.25) | Função Postgres (`custom_access_token_hook(event jsonb) returns jsonb`) invocada pelo Supabase Auth service ANTES de issuing token JWT. Recebe event com user_id + claims atuais, retorna event modificado com claims adicionais. Habilitada via Dashboard (Auth > Hooks Beta) ou config.toml local. |
|
|
37
|
+
| **JWT user_role claim** (v1.25) | Claim canônico `user_role` no JWT (string ou null) lido via `auth.jwt() ->> 'user_role'` em RLS policies ou via `jwt-decode` no cliente. Delivered por Custom Access Token Auth Hook. Eventually consistent — refresh TTL 1h. |
|
|
38
|
+
| **authorize() function** (v1.25) | Função `public.authorize(requested_permission app_permission) returns boolean` — lê `user_role` do JWT e checa permission em `role_permissions` table. `security definer + set search_path = '' + stable`. Pattern canônico para policies: `using ((SELECT authorize('channels.delete')))`. |
|
|
39
|
+
| **supabase_auth_admin role** (v1.25) | Postgres role usado pelo Supabase Auth service ao invocar Auth Hooks (Custom Access Token, etc.). Precisa de GRANTs específicos: `GRANT USAGE ON SCHEMA public`, `GRANT EXECUTE ON FUNCTION <hook>`, `GRANT ALL ON TABLE user_roles`, + RLS policy permissive permitindo SELECT em user_roles. Hook function deve `REVOKE EXECUTE FROM authenticated, anon, public`. |
|
|
40
|
+
| **app_role enum** (v1.25) | Enum Postgres canônico para roles aplicação (`create type public.app_role as enum (...)`). Exemplo: `('admin', 'moderator', 'user')`. Type-safe, refactorable. Caveat: `ALTER TYPE ADD VALUE` não pode ser feito dentro de transação Postgres. |
|
|
41
|
+
| **app_permission enum** (v1.25) | Enum Postgres canônico para permissions formato `<resource>.<action>` (`create type public.app_permission as enum (...)`). Exemplo: `('channels.delete', 'channels.create', 'messages.delete', 'users.ban')`. Consultado por `authorize()` function. |
|
|
42
|
+
| **jwt-decode client pattern** (v1.25) | Package npm `jwt-decode` para decodificar JWT access_token no cliente JavaScript. Usado dentro de `onAuthStateChange` listener para acessar custom claims após login/refresh. Caveat: apenas decode (NÃO valida assinatura) — para validação server-side use `@supabase/ssr` `getUser()`. |
|
|
43
|
+
| **Postgres roles** (v1.26) | Entidades Postgres que podem ter permissions. Podem ser **users** (com LOGIN) ou **groups** (sem LOGIN). Para **system access** (cron jobs, BI tools, ETL, admin scripts). NÃO usar para application access (use RLS + Custom Claims v1.25). Camada 10 de defense-in-depth. |
|
|
44
|
+
| **INHERIT / NOINHERIT** (v1.26) | INHERIT (default): child role herda permissions do parent automaticamente. NOINHERIT: child role precisa `SET ROLE parent` explícito para usar permissions. NOINHERIT preferido para roles superuser-like (audit trail mais claro). |
|
|
45
|
+
| **LOGIN PASSWORD** (v1.26) | `create role "name" with login password 'pwd'` — cria role que pode autenticar via senha. Best practices: 12+ chars, password manager, mixed case+symbols, percent-encode em connection string. Sem LOGIN, role é group para hierarchy. |
|
|
46
|
+
| **GRANT/REVOKE syntax** (v1.26) | `GRANT <permission> ON <object> TO <role>` / `REVOKE <permission> ON <object> FROM <role>`. Permission types: SELECT, INSERT, UPDATE, DELETE, EXECUTE, USAGE. Objects: tables, views, functions, schemas, sequences. Use `ALTER DEFAULT PRIVILEGES` para tabelas futuras. |
|
|
47
|
+
| **role hierarchy** (v1.26) | Padrão Postgres de role inheritance via `GRANT <parent_role> TO <child_role>`. Multi-level (readers ← admins ← bob). Simplifica permission management. Combine com NOINHERIT para superuser roles. |
|
|
48
|
+
| **predefined Supabase roles** (v1.26) | 10 roles configurados automaticamente em todo projeto Supabase: `postgres` (admin), `anon` (unauthenticated), `authenticator` (PostgREST switch), `authenticated` (logged-in), `service_role` (bypass RLS), `supabase_auth_admin` (Auth middleware), `supabase_storage_admin` (Storage middleware), `supabase_etl_admin` (Replication), `dashboard_user` (UI), `supabase_admin` (internal). NÃO criar substitutos — documentar uso direto. |
|
|
49
|
+
| **role switching authenticator** (v1.26) | PostgREST recebe JWT, valida via `authenticator` role, e switches para `anon` ou `authenticated` baseado em claims. `authenticator` tem acesso muito limitado — apenas SWITCH ROLE. Pattern interno do Supabase. |
|
|
50
|
+
| **percent-encoding password** (v1.26) | Special symbols em password Postgres precisam ser percent-encoded em connection string URL (`=` → `%3D`, `&` → `%26`, `+` → `%2B`, `#` → `%23`, `:` → `%3A`, `/` → `%2F`, `@` → `%40`, space → `%20`). Necessário em `postgresql://user:p%3Dssword@host/db`. |
|
|
51
|
+
|
|
52
|
+
### Database e Schema
|
|
53
|
+
|
|
54
|
+
| EN | PT-BR / Significado |
|
|
55
|
+
|---|---|
|
|
56
|
+
| **`schemas/`** | Pasta `supabase/schemas/` — fonte da verdade declarative do schema. Editar aqui, depois `db diff` gera migration. |
|
|
57
|
+
| **`migrations/`** | Pasta `supabase/migrations/` — arquivos `YYYYMMDDHHmmss_<name>.sql` versionados em git. |
|
|
58
|
+
| **`db diff`** | `supabase db diff -f <name>` — gera migration a partir do diff entre schemas/ declarado e DB local atual. |
|
|
59
|
+
| **`db reset`** | `supabase db reset` — recria DB local do zero + reaplica todas as migrations + seeds. |
|
|
60
|
+
| **`search_path`** | Caminho de busca de schema do Postgres. **Sempre** `set search_path = ''` em funções. |
|
|
61
|
+
| **schema-qualified** | Referência a objeto com schema explícito: `public.tasks` em vez de só `tasks`. Obrigatório quando `search_path = ''`. |
|
|
62
|
+
| **`SECURITY INVOKER`** | Função executa com permissões de quem chamou. Default obrigatório. |
|
|
63
|
+
| **`SECURITY DEFINER`** | Função executa com permissões do owner. Apenas com justificativa documentada. |
|
|
64
|
+
| **`IMMUTABLE`** | Função sempre retorna o mesmo para os mesmos inputs (sem consultar DB). |
|
|
65
|
+
| **`STABLE`** | Função consulta DB mas não modifica — mesmo resultado dentro de uma transação. |
|
|
66
|
+
| **`VOLATILE`** | Default. Função pode retornar valores diferentes ou ter side effects. |
|
|
67
|
+
|
|
68
|
+
### Realtime
|
|
69
|
+
|
|
70
|
+
| EN | PT-BR / Significado |
|
|
71
|
+
|---|---|
|
|
72
|
+
| **broadcast** | Mensagens custom via WebSocket — tipo recomendado em 2026 (substitui `postgres_changes` em apps novos). |
|
|
73
|
+
| **postgres_changes** | Pattern legado de receber mudanças do DB via stream. Single-threaded — não escala. **Migrar para broadcast.** |
|
|
74
|
+
| **presence** | Tracking de "quem está online". Usar **com moderação** — só para presence real (online status, cursor de colaboração). |
|
|
75
|
+
| **channel** | Canal de comunicação — naming canônico `scope:entity:id` (ex: `room:123:messages`). |
|
|
76
|
+
| **private channel** | Canal autenticado — `private: true` + RLS sobre `realtime.messages`. **Default em produção.** |
|
|
77
|
+
| **`realtime.broadcast_changes`** | Função SQL para emitir broadcast de dentro do Postgres (de trigger). |
|
|
78
|
+
| **`realtime.send`** | Função SQL para emitir mensagem custom (não amarrada a tabela). |
|
|
79
|
+
|
|
80
|
+
### Edge Functions
|
|
81
|
+
|
|
82
|
+
| EN | PT-BR / Significado |
|
|
83
|
+
|---|---|
|
|
84
|
+
| **Edge Function** | Função serverless Deno hospedada por Supabase. Roda perto do usuário. |
|
|
85
|
+
| **`Deno.serve`** | Built-in para HTTP server em Edge Functions (NÃO usar `serve` de `deno.land/std`). |
|
|
86
|
+
| **`EdgeRuntime.waitUntil`** | Permite tarefa background continuar após response retornar. |
|
|
87
|
+
| **`npm:` / `jsr:`** | Specifiers de import obrigatórios (sem bare specifiers). Ex: `import x from "npm:hono@4.6.7"`. |
|
|
88
|
+
|
|
89
|
+
### Storage e Vector
|
|
90
|
+
|
|
91
|
+
| EN | PT-BR / Significado |
|
|
92
|
+
|---|---|
|
|
93
|
+
| **bucket** | Container de arquivos — público ou privado. Privado por default. |
|
|
94
|
+
| **signed URL** | URL temporária com expiration para download de arquivo privado. |
|
|
95
|
+
| **`storage.objects`** | Tabela onde Storage grava metadados — RLS aplicado aqui controla acesso. |
|
|
96
|
+
| **multi-tenant path isolation** | Pattern: prefixar path do arquivo com `auth.uid()` (`{user_id}/file.png`) para isolar por tenant via RLS. |
|
|
97
|
+
| **TUS** | Tus Resumable Upload protocol — upload em chunks resumable. |
|
|
98
|
+
| **pgvector** | Extensão Postgres para embeddings/similarity search. |
|
|
99
|
+
| **HNSW** | Hierarchical Navigable Small World — index para vector. **Recall melhor.** Default em 2026. |
|
|
100
|
+
| **IVFFlat** | Inverted File Flat — index alternativo. Mais rápido com volumes grandes mas recall menor. |
|
|
101
|
+
| **`<=>`** | Operador cosine distance em pgvector. |
|
|
102
|
+
| **`<#>`** | Operador inner product em pgvector. |
|
|
103
|
+
| **`<->`** | Operador L2 (euclidean) distance em pgvector. |
|
|
104
|
+
|
|
105
|
+
### Background Jobs
|
|
106
|
+
|
|
107
|
+
| EN | PT-BR / Significado |
|
|
108
|
+
|---|---|
|
|
109
|
+
| **`pg_cron`** | Extensão para jobs cron dentro do Postgres. Schedule SQL/funções. |
|
|
110
|
+
| **`pgmq`** | Postgres Message Queue — extensão de queues. Requer Postgres 15.6.1.143+. |
|
|
111
|
+
| **`pg_net`** | Extensão para requests HTTP de dentro do Postgres. v0.10.0+. |
|
|
112
|
+
|
|
113
|
+
### Branching
|
|
114
|
+
|
|
115
|
+
| EN | PT-BR / Significado |
|
|
116
|
+
|---|---|
|
|
117
|
+
| **branch database** | Cópia preview do DB de produção para feature branches. |
|
|
118
|
+
| **Branching Compute Hours** (v1.27) | Métrica de billing Supabase para tempo de compute consumido por branches. FORA do Spend Cap. Compute Credits NÃO aplicam. Micro $0.01344/h. |
|
|
119
|
+
| **Branching workflow (Supabase)** (v1.27) | Fluxo de criar preview/persistent branches separados da production. Cada branch tem própria instância Supabase + API credentials. |
|
|
120
|
+
| **Deploy DAG (7 steps)** (v1.27) | Directed Acyclic Graph que descreve deployment de branch: clone → pull → health → configure → migrate → seed → deploy. Falha em parent step skipa children. |
|
|
121
|
+
| **dotenvx encrypted fields** (v1.27) | Pattern de encryptar secrets em arquivos `.env.*` commitados no git. Decryption key em `.env.keys` (gitignored). Sintaxe `encrypted:<value>` em config.toml — só funciona em designated secret fields. |
|
|
122
|
+
| **Migration repair** (v1.27) | Comando `supabase migration repair --status applied\|reverted <timestamp>` que atualiza tracking table only, NÃO aplica/reverte SQL. Para corrigir history record quando schema state real está OK. |
|
|
123
|
+
| **persistent branch** | Branch que sobrevive entre PRs (staging long-lived). |
|
|
124
|
+
| **Persistent branch** (v1.27) | Branch Supabase long-lived (staging/QA/dev), NÃO auto-pause em inatividade, não auto-delete em PR merge. Custo Branching Compute Hours contínuo. |
|
|
125
|
+
| **pgTAP testing** (v1.27) | Pattern de testing PostgreSQL usando pgTAP extension (TAP — Test Anything Protocol). Comando `supabase test db` busca em `supabase/tests/*.sql`. Funções canônicas: plan/ok/is/throws_ok/finish. |
|
|
126
|
+
| **preview branch** | Branch criado para PR específico — destruído ao merge. |
|
|
127
|
+
| **Preview branch** (v1.27) | Branch Supabase ephemeral, auto-pause em inatividade, auto-delete em PR merge/close. Padrão para feature development. |
|
|
128
|
+
| **[remotes] block** (v1.27) | Seção em `config.toml` que define configuração branch-specific. Referencia `project_id` obtido via `supabase --experimental branches list`. Permite override de db/api/auth/edge_runtime per branch. |
|
|
129
|
+
| **Schema drift** (v1.27) | Divergência entre estado real do schema e migration tracking. Causa típica: changes diretos no dashboard, ou timestamps wrong order após git rebase. Resolução via `migration repair` (tracking) ou rebase rename (timestamps). |
|
|
130
|
+
| **`SUPABASE_PUBLISHABLE_KEYS` / `SUPABASE_SECRET_KEYS`** (v1.30) | Env vars 2026 — **JSON dicts** (não strings) com chaves nomeadas. Acesso canônico: `JSON.parse(Deno.env.get('SUPABASE_SECRET_KEYS')!)['default']`. Cada projeto pode ter múltiplas chaves nomeadas (`default`, `automations`, `internal-cron`) para rotação granular + audit per-consumer. Legacy `SUPABASE_ANON_KEY` e `SUPABASE_SERVICE_ROLE_KEY` ainda funcionam mas devem ser evitados em código novo. |
|
|
131
|
+
| **`@supabase/server`** (v1.30) | Package npm 2026 que reduz boilerplate de auth em Edge Functions. Exporta `withSupabase({auth, ...})` (wrapper canônico) e `createSupabaseContext` (low-level para erros customizados). Pré-configura `ctx.supabase` (RLS-aware) ou `ctx.supabaseAdmin` (bypass) conforme auth mode. |
|
|
132
|
+
| **`withSupabase` auth modes** (v1.30) | 4 modos: `'user'` (JWT em Authorization), `'secret:<name>'` (sb_secret em apikey, ctx.supabaseAdmin), `'publishable:<name>'` (sb_publishable em apikey, ctx.supabase anon), `'none'` (sem check — handler responsável). Combinável via array `['user', 'secret:cron']` — `ctx.authMode` indica qual matchou. |
|
|
133
|
+
| **`verify_jwt` toggle** (v1.30) | Flag em `[functions.<name>]` no `config.toml` — `true` (default, plataforma valida JWT antes do handler) ou `false` (webhooks externos / service-to-service auth via apikey). CLI `--no-verify-jwt` para deploy/serve único. |
|
|
134
|
+
| **`Authorization` vs `apikey`** (v1.30) | Headers distintos. `Authorization: Bearer <user-jwt>` é JWT do Supabase Auth. `apikey: sb_publishable_... \| sb_secret_...` é API key 2026 do projeto. Mandar API key como Bearer = 401 (causa #1 de erros auth). Browser logado envia ambos. |
|
|
135
|
+
| **per-function `deno.json`** (v1.30) | Pattern recomendado 2026 — cada função tem seu próprio `deno.json` com `imports`, substituindo `import_map.json` global. Isola deps; update em uma função não quebra outra. Aliases tipo `"supabase": "npm:@supabase/supabase-js@2.95.0"` permitem imports limpos. |
|
|
136
|
+
| **per-function `config.toml`** (v1.30) | Seção `[functions.<name>]` configura comportamento por função: `verify_jwt`, `import_map` (legacy), `entrypoint` (JS puro CLI 1.215+), `static_files` (Wasm/assets CLI 2.7.0+). Sobrescreve defaults. |
|
|
137
|
+
| **`Supabase.ai.Session`** (v1.30) | Built-in runtime para AI inference. `gte-small` (zero deps, 384-dim embeddings, English, max 512 tokens). LLM via `AI_INFERENCE_API_HOST` apontando para Ollama (`mode: 'ollama'`) ou Llamafile (`mode: 'openaicompatible'`). Streaming via async iterator. |
|
|
138
|
+
| **S3FS persistent storage** (v1.30) | Mount S3-compatible bucket como filesystem em `/s3/<bucket-name>/`. Habilitado por 4 secrets: `S3FS_ENDPOINT_URL`, `S3FS_REGION`, `S3FS_ACCESS_KEY_ID`, `S3FS_SECRET_ACCESS_KEY`. Permite `Deno.writeFile`, `Deno.readFile`, `Deno.mkdir` em paths persistentes (vs `/tmp` ephemeral). |
|
|
139
|
+
| **`x-region` / `FunctionRegion`** (v1.30) | Regional invocation. Header `x-region: us-east-1` ou query `?forceFunctionRegion=us-east-1` força execução em região específica (útil quando DB-heavy + DB regional). 14 regiões disponíveis. **Caveat:** desliga failover automático. Header response `x-sb-edge-region` confirma região executada. Env `SB_REGION` lê região atual. |
|
|
140
|
+
| **`Deno.upgradeWebSocket`** (v1.30) | API canônica para WebSocket server em Edge Function. Browser não permite custom headers — JWT via query param `?jwt=...` ou subprotocol `Sec-WebSocket-Protocol: jwt-<token>`. Validar com `supabase.auth.getUser(jwt)`. Local: `[edge_runtime] policy = "per_worker"` obrigatório (desliga hot-reload). |
|
|
141
|
+
| **`static_files` Wasm** (v1.30) | Config em `config.toml` para bundle Wasm + assets junto com a função (CLI 2.7.0+). Format `static_files = ["./functions/wasm-add/add-wasm/pkg/*"]`. Caveat: **não funciona com `--use-api`** — requer Docker no deploy. |
|
|
142
|
+
| **`RateLimitError` / `retryAfterMs`** (v1.30) | Erro Deno lançado quando Edge Function chama outra Edge Function e excede ~5000 req/min do chain. `err.retryAfterMs` indica delay sugerido. Resposta canônica: 429 + header `Retry-After`. Retry pattern: `setTimeout(_, err.retryAfterMs)`. Não conta inbound nem APIs externas — só function-to-function. |
|
|
143
|
+
| **`FunctionsHttpError` / `FunctionsRelayError` / `FunctionsFetchError`** (v1.30) | 3 error classes do `@supabase/supabase-js` para classificar falha de `supabase.functions.invoke`. HttpError = função executou e retornou 4xx/5xx; RelayError = gateway↔Supabase; FetchError = inalcançável. `error.context.json()` lê body do HttpError. |
|
|
144
|
+
| **status code 546** (v1.30) | Custom code Supabase = `WORKER_LIMIT` (recurso esgotado — memory 256MB, CPU 2s, ou wall clock 150s/400s excedido). Logs mostram qual limite estourou. Fix: reduzir bundle, chunk processing, mover para `EdgeRuntime.waitUntil` ou pgmq. |
|
|
145
|
+
| **`mcp-lite`** (v1.30) | Framework TypeScript zero-deps para MCP servers. Pattern canônico em Edge Function: dois Hono apps — outer `app.route('/<function-name>', mcpApp)` (Supabase prefixa URL com nome) + inner `mcpApp.all('/mcp', handler)` (transport binding). Scaffold via `npm create mcp-lite@latest` template "Supabase Edge Functions". |
|
|
146
|
+
| **`corsHeaders` from SDK** (v1.30) | A partir de `@supabase/supabase-js@2.95.0`, import `corsHeaders` direto do SDK: `import { corsHeaders } from 'npm:@supabase/supabase-js@2.95.0/cors'`. Auto-sync com novos headers em releases futuras (evita drift de strings hard-coded). |
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## (b) Comandos CLI canônicos
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# Schema declarative
|
|
154
|
+
supabase stop # parar containers (necessário antes de db diff)
|
|
155
|
+
supabase db diff -f <name> # gera migration de schemas/ → migrations/
|
|
156
|
+
supabase db reset # reset local + reaplica migrations + seeds
|
|
157
|
+
supabase db push # aplica migrations não aplicadas no DB remote
|
|
158
|
+
supabase db pull # pulla mudanças remote → cria migration local
|
|
159
|
+
|
|
160
|
+
# Migrations
|
|
161
|
+
supabase migration new <name> # cria migration vazia com timestamp UTC
|
|
162
|
+
|
|
163
|
+
# Edge Functions
|
|
164
|
+
supabase functions new <name> # cria boilerplate de Edge Function
|
|
165
|
+
supabase functions deploy <name> # deploy para Supabase
|
|
166
|
+
supabase functions invoke <name> --body '{}' # invoca localmente
|
|
167
|
+
|
|
168
|
+
# Tipos
|
|
169
|
+
supabase gen types typescript --local > types/db.ts # gera tipos do schema local
|
|
170
|
+
supabase gen types typescript --linked > types/db.ts # gera tipos do remote linked
|
|
171
|
+
|
|
172
|
+
# Project lifecycle
|
|
173
|
+
supabase init # inicializa supabase/ no projeto
|
|
174
|
+
supabase start # sobe stack local (Postgres + Studio + Auth + ...)
|
|
175
|
+
supabase stop # derruba stack local
|
|
176
|
+
supabase status # status dos containers locais
|
|
177
|
+
supabase link --project-ref <ref> # linka projeto local com remote
|
|
178
|
+
|
|
179
|
+
# Branching
|
|
180
|
+
supabase branches create <name> # cria preview branch
|
|
181
|
+
supabase branches list # lista branches
|
|
182
|
+
supabase branches delete <name> # deleta branch (importante para custo!)
|
|
183
|
+
|
|
184
|
+
# Secrets
|
|
185
|
+
supabase secrets set --env-file .env.production # setar secrets em remote
|
|
186
|
+
supabase secrets list # listar (sem revelar valores)
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## (c) Patterns canônicos consolidados
|
|
192
|
+
|
|
193
|
+
### Pattern: `(select auth.uid())` wrapper em RLS
|
|
194
|
+
- Sem `(select)`: degradação até **1000×** em queries com filtro RLS
|
|
195
|
+
- Detalhes: [supabase-rls-policies](../supabase-rls-policies/SKILL.md)
|
|
196
|
+
|
|
197
|
+
### Pattern: `set search_path = ''` em funções
|
|
198
|
+
- Sem isso: vulnerável a hijack de schema via `search_path` manipulation
|
|
199
|
+
- Detalhes: [supabase-database-functions](../supabase-database-functions/SKILL.md)
|
|
200
|
+
|
|
201
|
+
### Pattern: `getAll`/`setAll` cookies em SSR (Next.js)
|
|
202
|
+
- Pacote `@supabase/ssr` — **NUNCA** `@supabase/auth-helpers-nextjs` (deprecated)
|
|
203
|
+
- Detalhes: [supabase-auth-ssr](../supabase-auth-ssr/SKILL.md)
|
|
204
|
+
|
|
205
|
+
### Pattern: `cron → pgmq → Edge Function` (background jobs)
|
|
206
|
+
- Schedule via `pg_cron` → enqueue em `pgmq` → consumir e disparar `pg_net.http_post()` para Edge Function
|
|
207
|
+
- Sem dep externa (Inngest/Trigger.dev) — tudo dentro de Supabase
|
|
208
|
+
- Detalhes: [supabase-cron-queues](../supabase-cron-queues/SKILL.md)
|
|
209
|
+
|
|
210
|
+
### Pattern: RAG with permissions (similarity + RLS)
|
|
211
|
+
- Embeddings em coluna vector + RLS policy filtrando por `user_id` ou `org_id`
|
|
212
|
+
- Sem RLS, qualquer cliente vê embeddings de todos os tenants
|
|
213
|
+
- Detalhes: [supabase-pgvector-rag](../supabase-pgvector-rag/SKILL.md)
|
|
214
|
+
|
|
215
|
+
### Pattern: multi-tenant path isolation em Storage
|
|
216
|
+
- Path do arquivo prefixado com `auth.uid()` ou `org_id`: `{user_id}/avatar.png`, `{org_id}/docs/file.pdf`
|
|
217
|
+
- RLS sobre `storage.objects` valida que o cliente acessa apenas o próprio prefixo
|
|
218
|
+
- Detalhes: [supabase-storage](../supabase-storage/SKILL.md)
|
|
219
|
+
|
|
220
|
+
### Pattern: declarative-first → diff → migration
|
|
221
|
+
- Editar schemas em `supabase/schemas/*.sql`
|
|
222
|
+
- Rodar `supabase stop && supabase db diff -f <name>` para gerar migration em `supabase/migrations/`
|
|
223
|
+
- Revisar migration manualmente antes de aplicar
|
|
224
|
+
- Detalhes: [supabase-declarative-schema](../supabase-declarative-schema/SKILL.md)
|
|
225
|
+
|
|
226
|
+
### Pattern: `private: true` em Realtime channels
|
|
227
|
+
- Default em produção (2026) — desabilita acesso anônimo
|
|
228
|
+
- Requer RLS sobre `realtime.messages` para SELECT (read) e INSERT (write)
|
|
229
|
+
- Detalhes: [supabase-realtime](../supabase-realtime/SKILL.md)
|
|
230
|
+
|
|
231
|
+
### Pattern: schema-qualified em Edge Functions chamando Supabase
|
|
232
|
+
- Function consulta `public.tasks` (não `tasks`) quando usar service-role client
|
|
233
|
+
- Combina com `set search_path = ''` em DB functions chamadas via RPC
|
|
234
|
+
- Detalhes: [supabase-edge-functions](../supabase-edge-functions/SKILL.md)
|