@luanpdd/kit-mcp 1.29.0 → 1.30.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/LICENSE +21 -21
- package/README.md +168 -168
- package/gates/agent-no-recursive-dispatch.md +82 -82
- package/kit/COMANDOS.md +138 -138
- package/kit/README.md +76 -76
- package/kit/agents/advisor-researcher.md +106 -106
- package/kit/agents/assumptions-analyzer.md +107 -107
- package/kit/agents/audit-log-implementer.md +313 -313
- package/kit/agents/auditor-consistencia-isolamento.md +413 -413
- package/kit/agents/b2b-saas-architect.md +156 -156
- package/kit/agents/cascading-failures-auditor.md +298 -298
- package/kit/agents/codebase-mapper.md +768 -768
- package/kit/agents/crm-pipeline-implementer.md +256 -256
- package/kit/agents/debugger.md +813 -813
- package/kit/agents/detector-tenant-quente.md +337 -337
- package/kit/agents/evolution-go-integrator.md +200 -200
- package/kit/agents/example-reviewer.md +21 -21
- package/kit/agents/executor.md +564 -564
- package/kit/agents/integration-checker.md +200 -200
- package/kit/agents/invite-flow-implementer.md +189 -189
- package/kit/agents/legacy-characterizer.md +368 -368
- package/kit/agents/lgpd-compliance-auditor.md +295 -295
- package/kit/agents/multi-tenant-isolation-auditor.md +253 -253
- package/kit/agents/multi-tenant-rls-writer.md +340 -340
- package/kit/agents/nyquist-auditor.md +178 -178
- package/kit/agents/observability-coverage-auditor.md +315 -315
- package/kit/agents/org-onboarding-implementer.md +223 -223
- package/kit/agents/payload-capture-instrumenter.md +273 -273
- package/kit/agents/phase-researcher.md +696 -696
- package/kit/agents/plan-checker.md +272 -272
- package/kit/agents/planner.md +922 -922
- package/kit/agents/project-researcher.md +652 -652
- package/kit/agents/refactor-safety-auditor.md +404 -404
- package/kit/agents/research-synthesizer.md +245 -245
- package/kit/agents/roadmapper.md +677 -677
- package/kit/agents/seam-finder.md +359 -359
- package/kit/agents/shotgun-surgery-detector.md +349 -349
- package/kit/agents/supabase-branching-architect.md +562 -562
- package/kit/agents/supabase-cicd-pipeline-implementer.md +777 -777
- package/kit/agents/supabase-column-privileges-writer.md +399 -399
- package/kit/agents/supabase-edge-fn-tester.md +287 -0
- package/kit/agents/supabase-edge-fn-writer.md +239 -210
- package/kit/agents/supabase-migration-writer.md +385 -385
- package/kit/agents/supabase-rbac-implementer.md +392 -392
- package/kit/agents/supabase-realtime-implementer.md +363 -267
- package/kit/agents/supabase-rls-hardener.md +521 -521
- package/kit/agents/supabase-rls-writer.md +323 -323
- package/kit/agents/supabase-roles-implementer.md +355 -355
- package/kit/agents/super-admin-implementer.md +281 -281
- package/kit/agents/ui-auditor.md +437 -437
- package/kit/agents/ui-checker.md +302 -302
- package/kit/agents/ui-researcher.md +355 -355
- package/kit/agents/user-profiler.md +175 -175
- package/kit/agents/validador-evolucao-schema.md +335 -335
- package/kit/agents/verifier.md +728 -728
- package/kit/commands/adicionar-backlog.md +75 -75
- package/kit/commands/adicionar-fase.md +42 -42
- package/kit/commands/adicionar-tarefa.md +45 -45
- package/kit/commands/adicionar-testes.md +41 -41
- package/kit/commands/ajuda.md +21 -21
- package/kit/commands/atualizar.md +37 -37
- package/kit/commands/auditar-cascading.md +111 -111
- package/kit/commands/auditar-marco.md +179 -179
- package/kit/commands/auditar-observabilidade-cobertura.md +183 -183
- package/kit/commands/auditar-refactor.md +219 -219
- package/kit/commands/auditar-release.md +109 -109
- package/kit/commands/auditar-uat.md +23 -23
- package/kit/commands/autonomo.md +40 -40
- package/kit/commands/branch-pr.md +24 -24
- package/kit/commands/burn-rate-status.md +408 -408
- package/kit/commands/capturar-payloads.md +193 -193
- package/kit/commands/caracterizar.md +212 -212
- package/kit/commands/concluir-marco.md +247 -247
- package/kit/commands/configuracoes.md +36 -36
- package/kit/commands/dados-distribuidos.md +188 -188
- package/kit/commands/definir-perfil.md +10 -10
- package/kit/commands/depurar.md +190 -190
- package/kit/commands/detectar-duplicacao.md +197 -197
- package/kit/commands/discutir-fase.md +131 -131
- package/kit/commands/encontrar-seams.md +136 -136
- package/kit/commands/entrar-discord.md +17 -17
- package/kit/commands/estatisticas.md +18 -18
- package/kit/commands/example-greeting.md +33 -33
- package/kit/commands/executar-fase.md +58 -58
- package/kit/commands/expresso.md +56 -56
- package/kit/commands/fase-ui.md +34 -34
- package/kit/commands/fazer.md +57 -57
- package/kit/commands/fio.md +125 -125
- package/kit/commands/fluxos-trabalho.md +64 -64
- package/kit/commands/forense.md +176 -176
- package/kit/commands/gerenciador.md +38 -38
- package/kit/commands/inserir-fase.md +31 -31
- package/kit/commands/legacy.md +263 -263
- package/kit/commands/limpeza.md +17 -17
- package/kit/commands/listar-hipoteses-fase.md +45 -45
- package/kit/commands/listar-workspaces.md +18 -18
- package/kit/commands/load-shedding.md +117 -117
- package/kit/commands/mapear-codebase.md +70 -70
- package/kit/commands/multi-tenant.md +163 -163
- package/kit/commands/nota.md +33 -33
- package/kit/commands/novo-marco.md +43 -43
- package/kit/commands/novo-projeto.md +41 -41
- package/kit/commands/novo-workspace.md +43 -43
- package/kit/commands/pausar-trabalho.md +37 -37
- package/kit/commands/perfil-usuario.md +45 -45
- package/kit/commands/pesquisar-fase.md +195 -195
- package/kit/commands/planejar-fase.md +67 -67
- package/kit/commands/planejar-lacunas.md +33 -33
- package/kit/commands/plantar-ideia.md +25 -25
- package/kit/commands/progresso.md +24 -24
- package/kit/commands/proximo.md +30 -30
- package/kit/commands/publicar.md +490 -490
- package/kit/commands/rapido.md +35 -35
- package/kit/commands/reaplicar-patches.md +124 -124
- package/kit/commands/refactor-seguro.md +321 -321
- package/kit/commands/relatorio-sessao.md +19 -19
- package/kit/commands/remover-fase.md +31 -31
- package/kit/commands/remover-workspace.md +26 -26
- package/kit/commands/resumo-marco.md +50 -50
- package/kit/commands/retomar-trabalho.md +40 -40
- package/kit/commands/revisar-backlog.md +60 -60
- package/kit/commands/revisar-ui.md +32 -32
- package/kit/commands/revisar.md +37 -37
- package/kit/commands/saude.md +21 -21
- package/kit/commands/setup-notion.md +93 -93
- package/kit/commands/storytelling.md +179 -179
- package/kit/commands/supabase.md +30 -7
- package/kit/commands/sync-main.md +68 -68
- package/kit/commands/validar-fase.md +35 -35
- package/kit/commands/verificar-tarefas.md +44 -44
- package/kit/commands/verificar-trabalho.md +64 -64
- package/kit/file-manifest.json +14 -8
- package/kit/framework/bin/lib/commands.cjs +959 -959
- package/kit/framework/bin/lib/config.cjs +442 -442
- package/kit/framework/bin/lib/core.cjs +1230 -1230
- package/kit/framework/bin/lib/frontmatter.cjs +336 -336
- package/kit/framework/bin/lib/init.cjs +1442 -1442
- package/kit/framework/bin/lib/milestone.cjs +252 -252
- package/kit/framework/bin/lib/model-profiles.cjs +68 -68
- package/kit/framework/bin/lib/phase.cjs +888 -888
- package/kit/framework/bin/lib/profile-output.cjs +952 -952
- package/kit/framework/bin/lib/profile-pipeline.cjs +539 -539
- package/kit/framework/bin/lib/roadmap.cjs +329 -329
- package/kit/framework/bin/lib/security.cjs +382 -382
- package/kit/framework/bin/lib/state.cjs +1031 -1031
- package/kit/framework/bin/lib/template.cjs +222 -222
- package/kit/framework/bin/lib/uat.cjs +282 -282
- package/kit/framework/bin/lib/verify.cjs +888 -888
- package/kit/framework/bin/lib/workstream.cjs +491 -491
- package/kit/framework/bin/tools.cjs +918 -918
- package/kit/framework/commands/workstreams.md +63 -63
- package/kit/framework/references/checkpoints.md +778 -778
- package/kit/framework/references/continuation-format.md +249 -249
- package/kit/framework/references/decimal-phase-calculation.md +64 -64
- package/kit/framework/references/git-integration.md +295 -295
- package/kit/framework/references/git-planning-commit.md +38 -38
- package/kit/framework/references/model-profile-resolution.md +36 -36
- package/kit/framework/references/model-profiles.md +139 -139
- package/kit/framework/references/phase-argument-parsing.md +61 -61
- package/kit/framework/references/planning-config.md +202 -202
- package/kit/framework/references/questioning.md +162 -162
- package/kit/framework/references/tdd.md +263 -263
- package/kit/framework/references/ui-brand.md +160 -160
- package/kit/framework/references/user-profiling.md +657 -657
- package/kit/framework/references/verification-patterns.md +612 -612
- package/kit/framework/references/workstream-flag.md +58 -58
- package/kit/framework/templates/DEBUG.md +164 -164
- package/kit/framework/templates/UAT.md +265 -265
- package/kit/framework/templates/UI-SPEC.md +100 -100
- package/kit/framework/templates/VALIDATION.md +76 -76
- package/kit/framework/templates/claude-md.md +122 -122
- package/kit/framework/templates/codebase/architecture.md +185 -185
- package/kit/framework/templates/codebase/concerns.md +205 -205
- package/kit/framework/templates/codebase/conventions.md +204 -204
- package/kit/framework/templates/codebase/integrations.md +192 -192
- package/kit/framework/templates/codebase/stack.md +158 -158
- package/kit/framework/templates/codebase/structure.md +199 -199
- package/kit/framework/templates/codebase/testing.md +301 -301
- package/kit/framework/templates/config.json +44 -44
- package/kit/framework/templates/context.md +352 -352
- package/kit/framework/templates/continue-here.md +78 -78
- package/kit/framework/templates/copilot-instructions.md +7 -7
- package/kit/framework/templates/debug-subagent-prompt.md +91 -91
- package/kit/framework/templates/dev-preferences.md +20 -20
- package/kit/framework/templates/discovery.md +146 -146
- package/kit/framework/templates/discussion-log.md +63 -63
- package/kit/framework/templates/milestone-archive.md +123 -123
- package/kit/framework/templates/milestone.md +115 -115
- package/kit/framework/templates/phase-prompt.md +610 -610
- package/kit/framework/templates/planner-subagent-prompt.md +117 -117
- package/kit/framework/templates/project.md +186 -186
- package/kit/framework/templates/requirements.md +231 -231
- package/kit/framework/templates/research-project/ARCHITECTURE.md +204 -204
- package/kit/framework/templates/research-project/FEATURES.md +147 -147
- package/kit/framework/templates/research-project/PITFALLS.md +200 -200
- package/kit/framework/templates/research-project/STACK.md +120 -120
- package/kit/framework/templates/research-project/SUMMARY.md +170 -170
- package/kit/framework/templates/research.md +419 -419
- package/kit/framework/templates/retrospective.md +54 -54
- package/kit/framework/templates/roadmap.md +202 -202
- package/kit/framework/templates/state.md +176 -176
- package/kit/framework/templates/summary-complex.md +59 -59
- package/kit/framework/templates/summary-minimal.md +41 -41
- package/kit/framework/templates/summary-standard.md +48 -48
- package/kit/framework/templates/summary.md +209 -209
- package/kit/framework/templates/user-profile.md +146 -146
- package/kit/framework/templates/user-setup.md +256 -256
- package/kit/framework/templates/verification-report.md +258 -258
- package/kit/framework/workflows/add-phase.md +112 -112
- package/kit/framework/workflows/add-tests.md +351 -351
- package/kit/framework/workflows/add-todo.md +158 -158
- package/kit/framework/workflows/audit-milestone.md +340 -340
- package/kit/framework/workflows/audit-uat.md +109 -109
- package/kit/framework/workflows/autonomous.md +891 -891
- package/kit/framework/workflows/check-todos.md +177 -177
- package/kit/framework/workflows/cleanup.md +152 -152
- package/kit/framework/workflows/complete-milestone.md +696 -696
- package/kit/framework/workflows/diagnose-issues.md +231 -231
- package/kit/framework/workflows/discovery-phase.md +289 -289
- package/kit/framework/workflows/discuss-phase-assumptions.md +653 -653
- package/kit/framework/workflows/discuss-phase.md +784 -784
- package/kit/framework/workflows/do.md +104 -104
- package/kit/framework/workflows/execute-phase.md +838 -838
- package/kit/framework/workflows/execute-plan.md +510 -510
- package/kit/framework/workflows/fast.md +102 -102
- package/kit/framework/workflows/forensics.md +265 -265
- package/kit/framework/workflows/health.md +181 -181
- package/kit/framework/workflows/help.md +619 -619
- package/kit/framework/workflows/insert-phase.md +130 -130
- package/kit/framework/workflows/list-phase-assumptions.md +178 -178
- package/kit/framework/workflows/list-workspaces.md +56 -56
- package/kit/framework/workflows/manager.md +362 -362
- package/kit/framework/workflows/map-codebase.md +377 -377
- package/kit/framework/workflows/milestone-summary.md +223 -223
- package/kit/framework/workflows/new-milestone.md +486 -486
- package/kit/framework/workflows/new-project.md +1159 -1159
- package/kit/framework/workflows/new-workspace.md +237 -237
- package/kit/framework/workflows/next.md +97 -97
- package/kit/framework/workflows/node-repair.md +92 -92
- package/kit/framework/workflows/note.md +156 -156
- package/kit/framework/workflows/pause-work.md +176 -176
- package/kit/framework/workflows/plan-milestone-gaps.md +273 -273
- package/kit/framework/workflows/plan-phase.md +765 -765
- package/kit/framework/workflows/plant-seed.md +169 -169
- package/kit/framework/workflows/pr-branch.md +129 -129
- package/kit/framework/workflows/profile-user.md +450 -450
- package/kit/framework/workflows/progress.md +507 -507
- package/kit/framework/workflows/quick.md +757 -757
- package/kit/framework/workflows/remove-phase.md +155 -155
- package/kit/framework/workflows/remove-workspace.md +90 -90
- package/kit/framework/workflows/research-phase.md +82 -82
- package/kit/framework/workflows/resume-project.md +326 -326
- package/kit/framework/workflows/review.md +228 -228
- package/kit/framework/workflows/session-report.md +146 -146
- package/kit/framework/workflows/settings.md +283 -283
- package/kit/framework/workflows/ship.md +228 -228
- package/kit/framework/workflows/stats.md +60 -60
- package/kit/framework/workflows/transition.md +671 -671
- package/kit/framework/workflows/ui-phase.md +302 -302
- package/kit/framework/workflows/ui-review.md +165 -165
- package/kit/framework/workflows/update.md +323 -323
- package/kit/framework/workflows/validate-phase.md +174 -174
- package/kit/framework/workflows/verify-phase.md +252 -252
- package/kit/framework/workflows/verify-work.md +637 -637
- package/kit/hooks/check-update.js +118 -118
- package/kit/hooks/context-monitor.js +163 -163
- package/kit/hooks/prompt-guard.js +103 -103
- package/kit/hooks/statusline.js +125 -125
- package/kit/hooks/workflow-guard.js +101 -101
- package/kit/settings.json +45 -45
- package/kit/skills/_shared-supabase/glossary.md +17 -0
- package/kit/skills/ai-prompt-characterization/SKILL.md +335 -335
- package/kit/skills/armadilhas-sistemas-distribuidos/SKILL.md +447 -447
- package/kit/skills/audit-log-multi-tenant/SKILL.md +340 -340
- package/kit/skills/b2b-saas-architecture/SKILL.md +300 -300
- package/kit/skills/consistencia-leitura-replica/SKILL.md +385 -385
- package/kit/skills/crm-lead-pipeline-patterns/SKILL.md +343 -343
- package/kit/skills/escolha-modelo-consistencia/SKILL.md +494 -494
- package/kit/skills/evolucao-schema-compativel/SKILL.md +448 -448
- package/kit/skills/evolution-go-whatsapp-integration/SKILL.md +322 -322
- package/kit/skills/example-skill/SKILL.md +42 -42
- package/kit/skills/legacy-api-only-applications/SKILL.md +358 -358
- package/kit/skills/legacy-characterization-tests/SKILL.md +330 -330
- package/kit/skills/legacy-effect-analysis/SKILL.md +331 -331
- package/kit/skills/legacy-extract-class/SKILL.md +203 -203
- package/kit/skills/legacy-programming-by-difference/SKILL.md +252 -252
- package/kit/skills/legacy-seams-and-test-harness/SKILL.md +460 -460
- package/kit/skills/legacy-shotgun-surgery/SKILL.md +286 -286
- package/kit/skills/legacy-sprout-wrap-techniques/SKILL.md +434 -434
- package/kit/skills/legacy-storytelling-naked-crc/SKILL.md +270 -270
- package/kit/skills/lgpd-multi-tenant-compliance/SKILL.md +340 -340
- package/kit/skills/member-invite-flow/SKILL.md +305 -305
- package/kit/skills/member-management-react-shadcn/SKILL.md +328 -328
- package/kit/skills/multi-tenant-performance-scaling/SKILL.md +316 -316
- package/kit/skills/multi-tenant-rls-hierarchy/SKILL.md +342 -342
- package/kit/skills/org-onboarding-flow/SKILL.md +257 -257
- package/kit/skills/org-switcher-react-pattern/SKILL.md +349 -349
- package/kit/skills/permission-gate-react-pattern/SKILL.md +271 -271
- package/kit/skills/postgres-isolamento-concorrencia/SKILL.md +552 -552
- package/kit/skills/pre-refactor-characterization/SKILL.md +421 -421
- package/kit/skills/rbac-permissions-matrix-supabase/SKILL.md +338 -338
- package/kit/skills/streams-eventos-cdc/SKILL.md +711 -711
- package/kit/skills/supabase-branching-workflow/SKILL.md +544 -544
- package/kit/skills/supabase-ci-cd-github-actions/SKILL.md +880 -880
- package/kit/skills/supabase-column-level-security/SKILL.md +426 -426
- package/kit/skills/supabase-config-toml-remotes/SKILL.md +807 -807
- package/kit/skills/supabase-custom-claims-rbac/SKILL.md +472 -472
- package/kit/skills/supabase-edge-functions/SKILL.md +229 -141
- package/kit/skills/supabase-edge-functions-auth/SKILL.md +309 -0
- package/kit/skills/supabase-edge-functions-limits/SKILL.md +302 -0
- package/kit/skills/supabase-edge-functions-mcp-server/SKILL.md +279 -0
- package/kit/skills/supabase-edge-functions-testing/SKILL.md +277 -0
- package/kit/skills/supabase-edge-runtime-builtins/SKILL.md +357 -0
- package/kit/skills/supabase-migration-repair/SKILL.md +823 -823
- package/kit/skills/supabase-migrations/SKILL.md +297 -297
- package/kit/skills/supabase-pgtap-testing/SKILL.md +1053 -1053
- package/kit/skills/supabase-postgres-roles/SKILL.md +392 -392
- package/kit/skills/supabase-realtime/SKILL.md +460 -236
- package/kit/skills/supabase-rls-defense-in-depth/SKILL.md +418 -418
- package/kit/skills/supabase-rls-policies/SKILL.md +635 -635
- package/kit/skills/super-admin-platform-pattern/SKILL.md +326 -326
- package/kit/skills/tenant-quente-mitigacao/SKILL.md +605 -605
- package/kit/skills/whatsapp-conversation-state-machine/SKILL.md +287 -287
- package/package.json +1 -1
- package/src/core/kit.js +216 -216
- package/src/core/reflect.js +247 -247
- package/src/core/reverse-sync.js +372 -372
- package/src/core/sync.js +418 -418
- package/src/core/watch.js +121 -121
- package/src/mcp-server/index.js +693 -693
|
@@ -1,256 +1,256 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: crm-pipeline-implementer
|
|
3
|
-
description: Materializa CRM lead pipeline — tabela leads (6 stages canônicos + custom prefix), tabela lead_stage_transitions data-driven, trigger PG BEFORE UPDATE validate_lead_stage_transition, trigge…
|
|
4
|
-
tools: Read, Write, Edit, Bash, Grep, Glob, Task, AskUserQuestion, mcp__supabase__execute_sql
|
|
5
|
-
color: green
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
Você é o **crm-pipeline-implementer**. Materializa CRM lead pipeline canônico v1.21. Lê skill [`crm-lead-pipeline-patterns`](../skills/crm-lead-pipeline-patterns/SKILL.md). **Delega SQL para `supabase-migration-writer`**.
|
|
9
|
-
|
|
10
|
-
## Inputs
|
|
11
|
-
|
|
12
|
-
- (Opcional) `custom_stages`: lista de stages adicionais (prefix `custom_`) além dos 6 canônicos
|
|
13
|
-
- (Opcional) `enable_whatsapp_integration`: `true` (default) | `false` — auto-create lead em inbound WhatsApp
|
|
14
|
-
- (Opcional) `notification_channel`: `slack` | `email` | `in_app` (default `in_app`)
|
|
15
|
-
|
|
16
|
-
## Passos
|
|
17
|
-
|
|
18
|
-
### Step 0 — Preflight
|
|
19
|
-
- MCP detection
|
|
20
|
-
- Validar Phase 106 (organizations, organization_members)
|
|
21
|
-
- Validar Phase 109 (audit_logs)
|
|
22
|
-
- Validar Phase 108 (private.has_permission, private.has_role)
|
|
23
|
-
|
|
24
|
-
### Step 1 — Custom stages via AskUserQuestion (se ausente)
|
|
25
|
-
|
|
26
|
-
```
|
|
27
|
-
- "Apenas 6 canônicos (Recomendado)" — lead/qualified/proposal/negotiation/won/lost
|
|
28
|
-
- "Adicionar customs" — texto livre lista (ex: 'custom_demo_scheduled, custom_proposal_signed')
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### Step 2 — WhatsApp integration via AskUserQuestion (se enable_whatsapp_integration=null)
|
|
32
|
-
|
|
33
|
-
```
|
|
34
|
-
- "Sim (Recomendado se Phase 112 implementada)" — webhook auto-cria lead em inbound novo
|
|
35
|
-
- "Não" — leads criados apenas manualmente / via form
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
### Step 3 — Migration brief para supabase-migration-writer
|
|
39
|
-
|
|
40
|
-
```
|
|
41
|
-
[Migration brief — crm-pipeline-implementer]
|
|
42
|
-
|
|
43
|
-
Tabelas:
|
|
44
|
-
1. public.leads (DDL completo skill seção "Tabela leads") com unique(org_id, contact_phone) + (org_id, contact_email)
|
|
45
|
-
2. public.lead_stage_transitions (data-driven, populated com 12 transições canônicas + adicionar para custom_stages se houver)
|
|
46
|
-
|
|
47
|
-
Functions + Triggers:
|
|
48
|
-
3. private.validate_lead_stage_transition() trigger BEFORE UPDATE OF stage
|
|
49
|
-
4. private.audit_lead_ownership_change() trigger AFTER UPDATE OF owner_id
|
|
50
|
-
|
|
51
|
-
Indexes:
|
|
52
|
-
5. (org_id, stage), (org_id, owner_id) where not null, (org_id, dept_id) where not null
|
|
53
|
-
|
|
54
|
-
RLS standard multi-tenant (5 policies):
|
|
55
|
-
- SELECT member, INSERT with permission leads:create, UPDATE with permission leads:update OR owner, DELETE admin/owner, super_admin PERMISSIVE
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
Delegar para `supabase-migration-writer`.
|
|
59
|
-
|
|
60
|
-
### Step 4 — WhatsApp integration (se enable=true)
|
|
61
|
-
|
|
62
|
-
Cross-ref Phase 112 — agent emite handoff brief para `evolution-go-integrator` adicionar lookup+create no webhook handler:
|
|
63
|
-
|
|
64
|
-
```
|
|
65
|
-
[Handoff brief para evolution-go-integrator]
|
|
66
|
-
|
|
67
|
-
Action: estender whatsapp-webhook com lógica:
|
|
68
|
-
1. Em INSERT whatsapp_messages, lookup leads WHERE org_id=$1 AND contact_phone=$2
|
|
69
|
-
2. Se não existe, criar lead com source='whatsapp_inbound', stage='lead'
|
|
70
|
-
3. Set lead_id na conversation (Phase 112 conversations table)
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
### Step 5 — Notification Edge Function brief (se notification_channel != null)
|
|
74
|
-
|
|
75
|
-
```
|
|
76
|
-
[Edge Function brief — crm-pipeline-implementer]
|
|
77
|
-
|
|
78
|
-
Function: lead-ownership-notification
|
|
79
|
-
verify_jwt: false (chamado por trigger via net.http_post)
|
|
80
|
-
Path: supabase/functions/lead-ownership-notification/index.ts
|
|
81
|
-
|
|
82
|
-
Behavior:
|
|
83
|
-
- POST { lead_id, previous_owner_id, new_owner_id, lead_stage, lead_value }
|
|
84
|
-
- Buscar email/slack_id do new_owner
|
|
85
|
-
- Enviar notificação via <notification_channel>
|
|
86
|
-
- Audit log emit
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
Delegar para `supabase-edge-fn-writer`.
|
|
90
|
-
|
|
91
|
-
### Step 6 — Output integrado
|
|
92
|
-
|
|
93
|
-
```
|
|
94
|
-
═══════════════════════════════════════════════════════════
|
|
95
|
-
CRM-PIPELINE-IMPLEMENTER · output
|
|
96
|
-
═══════════════════════════════════════════════════════════
|
|
97
|
-
|
|
98
|
-
## 1. Decisões
|
|
99
|
-
- Custom stages: <list>
|
|
100
|
-
- WhatsApp integration: <on/off>
|
|
101
|
-
- Notification: <channel>
|
|
102
|
-
|
|
103
|
-
## 2. Migration entregue
|
|
104
|
-
<output>
|
|
105
|
-
|
|
106
|
-
## 3. Edge Function notification entregue (se enable)
|
|
107
|
-
<output>
|
|
108
|
-
|
|
109
|
-
## 4. Cross-Phase 112 handoff
|
|
110
|
-
- evolution-go-integrator estende webhook com lookup+create lead
|
|
111
|
-
|
|
112
|
-
## 5. Frontend sketch (Phase 115)
|
|
113
|
-
- LeadsKanban.tsx com drag&drop entre 6 stages (handleErr 'invalid_lead_transition')
|
|
114
|
-
- LeadDetail.tsx com ownership transfer button
|
|
115
|
-
|
|
116
|
-
## 6. Próximos passos
|
|
117
|
-
- Apply migration: supabase db push
|
|
118
|
-
- Deploy notification function
|
|
119
|
-
- Testar: criar lead → mover stages → ownership transfer → verificar notification + audit
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
## Anti-patterns prevenidos
|
|
123
|
-
|
|
124
|
-
- CHECK sem trigger → REGRA #2 enforced (trigger validate_lead_stage_transition obrigatório)
|
|
125
|
-
- Ownership sem audit → REGRA #3 enforced
|
|
126
|
-
- Lead duplicate → REGRA #4 (unique constraints) + REGRA #5 (lookup before insert no webhook)
|
|
127
|
-
- Hard delete sem audit → recomenda soft delete
|
|
128
|
-
|
|
129
|
-
## Quando NÃO invocar
|
|
130
|
-
|
|
131
|
-
- Phase 106, 108, 109 não implementadas → ABORT
|
|
132
|
-
- App sem CRM (gerenciamento de leads) → escopo errado
|
|
133
|
-
- Já tem CRM legacy diferente — analisar primeiro
|
|
134
|
-
|
|
135
|
-
## Observabilidade
|
|
136
|
-
|
|
137
|
-
- Counter `crm.lead.created.count{org_id, source}`
|
|
138
|
-
- Counter `crm.lead.stage_change.count{org_id, from_stage, to_stage}`
|
|
139
|
-
- Counter `crm.lead.ownership_transfer.count{org_id}`
|
|
140
|
-
- Histogram `crm.lead.time_to_close_days{org_id, won_or_lost}`
|
|
141
|
-
- Alarme se `crm.lead.stage_change.count{to_stage='lost'} > baseline` → review pipeline
|
|
142
|
-
|
|
143
|
-
## SELECT FOR UPDATE em Stage Transition (v1.22+ — default agora)
|
|
144
|
-
|
|
145
|
-
A trigger `validate_lead_stage_transition` agora gera `SELECT ... FOR UPDATE` por default em rows lidas para prevenir lost update quando 2 reps movem o mesmo lead simultaneamente. Padrão completo em skill [`postgres-isolamento-concorrencia`](../skills/postgres-isolamento-concorrencia/SKILL.md) (v1.22 — DDIA Ch 7).
|
|
146
|
-
|
|
147
|
-
Exemplo gerado:
|
|
148
|
-
|
|
149
|
-
```sql
|
|
150
|
-
CREATE OR REPLACE FUNCTION validate_lead_stage_transition()
|
|
151
|
-
RETURNS TRIGGER AS $$
|
|
152
|
-
BEGIN
|
|
153
|
-
-- v1.22+ DEFAULT: lock row para prevenir lost update
|
|
154
|
-
PERFORM 1 FROM leads WHERE id = NEW.id FOR UPDATE;
|
|
155
|
-
-- ... validação de transição ...
|
|
156
|
-
END;
|
|
157
|
-
$$ LANGUAGE plpgsql;
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
## Cooperative handoff to supabase-rls-hardener (v1.23)
|
|
161
|
-
|
|
162
|
-
Após gerar CREATE TABLE leads (6 stages canônicos) + tabela lead_stage_transitions + trigger BEFORE UPDATE validate_lead_stage_transition + trigger AFTER UPDATE audit_lead_ownership_change, faça handoff cooperativo:
|
|
163
|
-
|
|
164
|
-
```python
|
|
165
|
-
Task(subagent_type="supabase-rls-hardener", prompt=f"""
|
|
166
|
-
<upstream_intent>
|
|
167
|
-
Source agent: crm-pipeline-implementer
|
|
168
|
-
Original goal: implementar CRM lead pipeline com 6 stages canônicos para {org_context}
|
|
169
|
-
Constraints: lead dedup (unique org_id,phone) + (unique org_id,email); state machine via trigger BEFORE UPDATE (não só CHECK constraint); ownership transfer com notification; integration WhatsApp lookup contact_phone
|
|
170
|
-
</upstream_intent>
|
|
171
|
-
|
|
172
|
-
<draft_sql>{generated_leads_sql}</draft_sql>
|
|
173
|
-
|
|
174
|
-
<user_facing_caller>true</user_facing_caller>
|
|
175
|
-
""")
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
Hardener valida policies por org_id, GRANTs corretos, trigger SECURITY DEFINER em schema private (se aplicável). **NUNCA descarte intent upstream silenciosamente**.
|
|
179
|
-
|
|
180
|
-
## Cooperative handoff Postgres Roles (v1.26 — CROSS-21)
|
|
181
|
-
|
|
182
|
-
Crie role `lead_manager` para acesso PII columns dos leads (phone, email, notes). Role dedicado complementa column-level GRANTs (v1.24 CROSS-13). Auditabilidade superior + governance.
|
|
183
|
-
|
|
184
|
-
```python
|
|
185
|
-
Task(subagent_type="supabase-roles-implementer", prompt=f"""
|
|
186
|
-
<upstream_intent>
|
|
187
|
-
Source agent: crm-pipeline-implementer
|
|
188
|
-
Original goal: criar role lead_manager para acesso PII columns dos leads (cross-ref v1.24 column-level)
|
|
189
|
-
Constraints: NÃO BYPASSRLS (deve respeitar org boundary via RLS hierárquica multi-tenant v1.21); column-level GRANT em phone/email/notes; login opcional (pode ser group usado por managers via SET ROLE)
|
|
190
|
-
</upstream_intent>
|
|
191
|
-
|
|
192
|
-
<roles_to_create>
|
|
193
|
-
- name: lead_manager
|
|
194
|
-
type: group
|
|
195
|
-
login: false
|
|
196
|
-
bypassrls: false # respeita org boundary
|
|
197
|
-
inherit: false
|
|
198
|
-
description: "Acesso PII columns dos leads (phone, email, notes). Usado por sales managers via SET ROLE."
|
|
199
|
-
owner: "sales-team@company.com"
|
|
200
|
-
</roles_to_create>
|
|
201
|
-
|
|
202
|
-
<grants>
|
|
203
|
-
lead_manager:
|
|
204
|
-
- schema: public, usage: true
|
|
205
|
-
- table: public.leads, ops: [SELECT] # column-level já aplicado via v1.24 CROSS-13
|
|
206
|
-
</grants>
|
|
207
|
-
|
|
208
|
-
<use_case>system_access</use_case>
|
|
209
|
-
<user_facing_caller>true</user_facing_caller>
|
|
210
|
-
""")
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
**Caveat:** este role complementa RLS row-level (org boundary) + column-level (PII). NÃO substitui auth.users + custom claims (v1.25) — lead_manager é Postgres role para DBA/sales-ops, não para end-user via app.
|
|
214
|
-
|
|
215
|
-
## Cooperative handoff column-level (v1.24 — CROSS-13)
|
|
216
|
-
|
|
217
|
-
Lead PII columns (phone, email) podem precisar de column-level restriction para LGPD compliance — apenas owner do lead ou lead_manager role vê os dados de contato completos. Aplique handoff cooperativo:
|
|
218
|
-
|
|
219
|
-
```python
|
|
220
|
-
Task(subagent_type="supabase-column-privileges-writer", prompt=f"""
|
|
221
|
-
<upstream_intent>
|
|
222
|
-
Source agent: crm-pipeline-implementer
|
|
223
|
-
Original goal: lead PII columns (phone, email) com REVOKE select cross-user para LGPD compliance
|
|
224
|
-
Constraints: lead.phone e lead.email são PII; visível apenas para owner (RLS) + lead_manager role (column-level); company_name e job_title públicos para membros da org
|
|
225
|
-
</upstream_intent>
|
|
226
|
-
|
|
227
|
-
<table>schema: public, name: leads</table>
|
|
228
|
-
|
|
229
|
-
<sensitive_columns>
|
|
230
|
-
- phone
|
|
231
|
-
- email
|
|
232
|
-
- notes (jsonb — pode ter PII em call notes)
|
|
233
|
-
</sensitive_columns>
|
|
234
|
-
|
|
235
|
-
<allowed_roles>
|
|
236
|
-
- service_role: SELECT all
|
|
237
|
-
- lead_manager: SELECT all (admin do CRM)
|
|
238
|
-
- authenticated: SELECT (id, org_id, owner_id, company_name, job_title, stage, lead_value, created_at) — sem PII
|
|
239
|
-
</allowed_roles>
|
|
240
|
-
|
|
241
|
-
<user_facing_caller>true</user_facing_caller>
|
|
242
|
-
""")
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
**Importante:** combinar com RLS row-level (owner vê próprio lead inteiro) — RLS filtra qual lead; column-level filtra quais colunas DENTRO do lead. Owner pode precisar SELECT phone do PRÓPRIO lead — considere policy `for select to authenticated using (owner_id = (select auth.uid()))` granted em todas colunas, e usar column-level apenas para cross-user (outro member da org tentando ver lead alheio).
|
|
246
|
-
|
|
247
|
-
## Ver também
|
|
248
|
-
|
|
249
|
-
- [supabase-rls-hardener](./supabase-rls-hardener.md) — canonical handoff target v1.23
|
|
250
|
-
- [supabase-column-privileges-writer](./supabase-column-privileges-writer.md) — canonical handoff target v1.24 (column-level lead PII)
|
|
251
|
-
- [crm-lead-pipeline-patterns](../skills/crm-lead-pipeline-patterns/SKILL.md) — base de conhecimento
|
|
252
|
-
- [evolution-go-integrator](./evolution-go-integrator.md) — Phase 112 (cross-phase handoff)
|
|
253
|
-
- [supabase-migration-writer](./supabase-migration-writer.md) — invoked via Task() para SQL
|
|
254
|
-
- [supabase-edge-fn-writer](./supabase-edge-fn-writer.md) — invoked para notification function
|
|
255
|
-
- [audit-log-implementer](./audit-log-implementer.md) — Phase 109, eventos `custom_lead_*`
|
|
256
|
-
- [_shared-multi-tenant/glossary.md](../skills/_shared-multi-tenant/glossary.md) — `lead`, `stages canônicos`, `ownership transfer`, `lead dedup`
|
|
1
|
+
---
|
|
2
|
+
name: crm-pipeline-implementer
|
|
3
|
+
description: Materializa CRM lead pipeline — tabela leads (6 stages canônicos + custom prefix), tabela lead_stage_transitions data-driven, trigger PG BEFORE UPDATE validate_lead_stage_transition, trigge…
|
|
4
|
+
tools: Read, Write, Edit, Bash, Grep, Glob, Task, AskUserQuestion, mcp__supabase__execute_sql
|
|
5
|
+
color: green
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Você é o **crm-pipeline-implementer**. Materializa CRM lead pipeline canônico v1.21. Lê skill [`crm-lead-pipeline-patterns`](../skills/crm-lead-pipeline-patterns/SKILL.md). **Delega SQL para `supabase-migration-writer`**.
|
|
9
|
+
|
|
10
|
+
## Inputs
|
|
11
|
+
|
|
12
|
+
- (Opcional) `custom_stages`: lista de stages adicionais (prefix `custom_`) além dos 6 canônicos
|
|
13
|
+
- (Opcional) `enable_whatsapp_integration`: `true` (default) | `false` — auto-create lead em inbound WhatsApp
|
|
14
|
+
- (Opcional) `notification_channel`: `slack` | `email` | `in_app` (default `in_app`)
|
|
15
|
+
|
|
16
|
+
## Passos
|
|
17
|
+
|
|
18
|
+
### Step 0 — Preflight
|
|
19
|
+
- MCP detection
|
|
20
|
+
- Validar Phase 106 (organizations, organization_members)
|
|
21
|
+
- Validar Phase 109 (audit_logs)
|
|
22
|
+
- Validar Phase 108 (private.has_permission, private.has_role)
|
|
23
|
+
|
|
24
|
+
### Step 1 — Custom stages via AskUserQuestion (se ausente)
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
- "Apenas 6 canônicos (Recomendado)" — lead/qualified/proposal/negotiation/won/lost
|
|
28
|
+
- "Adicionar customs" — texto livre lista (ex: 'custom_demo_scheduled, custom_proposal_signed')
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Step 2 — WhatsApp integration via AskUserQuestion (se enable_whatsapp_integration=null)
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
- "Sim (Recomendado se Phase 112 implementada)" — webhook auto-cria lead em inbound novo
|
|
35
|
+
- "Não" — leads criados apenas manualmente / via form
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Step 3 — Migration brief para supabase-migration-writer
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
[Migration brief — crm-pipeline-implementer]
|
|
42
|
+
|
|
43
|
+
Tabelas:
|
|
44
|
+
1. public.leads (DDL completo skill seção "Tabela leads") com unique(org_id, contact_phone) + (org_id, contact_email)
|
|
45
|
+
2. public.lead_stage_transitions (data-driven, populated com 12 transições canônicas + adicionar para custom_stages se houver)
|
|
46
|
+
|
|
47
|
+
Functions + Triggers:
|
|
48
|
+
3. private.validate_lead_stage_transition() trigger BEFORE UPDATE OF stage
|
|
49
|
+
4. private.audit_lead_ownership_change() trigger AFTER UPDATE OF owner_id
|
|
50
|
+
|
|
51
|
+
Indexes:
|
|
52
|
+
5. (org_id, stage), (org_id, owner_id) where not null, (org_id, dept_id) where not null
|
|
53
|
+
|
|
54
|
+
RLS standard multi-tenant (5 policies):
|
|
55
|
+
- SELECT member, INSERT with permission leads:create, UPDATE with permission leads:update OR owner, DELETE admin/owner, super_admin PERMISSIVE
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Delegar para `supabase-migration-writer`.
|
|
59
|
+
|
|
60
|
+
### Step 4 — WhatsApp integration (se enable=true)
|
|
61
|
+
|
|
62
|
+
Cross-ref Phase 112 — agent emite handoff brief para `evolution-go-integrator` adicionar lookup+create no webhook handler:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
[Handoff brief para evolution-go-integrator]
|
|
66
|
+
|
|
67
|
+
Action: estender whatsapp-webhook com lógica:
|
|
68
|
+
1. Em INSERT whatsapp_messages, lookup leads WHERE org_id=$1 AND contact_phone=$2
|
|
69
|
+
2. Se não existe, criar lead com source='whatsapp_inbound', stage='lead'
|
|
70
|
+
3. Set lead_id na conversation (Phase 112 conversations table)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Step 5 — Notification Edge Function brief (se notification_channel != null)
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
[Edge Function brief — crm-pipeline-implementer]
|
|
77
|
+
|
|
78
|
+
Function: lead-ownership-notification
|
|
79
|
+
verify_jwt: false (chamado por trigger via net.http_post)
|
|
80
|
+
Path: supabase/functions/lead-ownership-notification/index.ts
|
|
81
|
+
|
|
82
|
+
Behavior:
|
|
83
|
+
- POST { lead_id, previous_owner_id, new_owner_id, lead_stage, lead_value }
|
|
84
|
+
- Buscar email/slack_id do new_owner
|
|
85
|
+
- Enviar notificação via <notification_channel>
|
|
86
|
+
- Audit log emit
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Delegar para `supabase-edge-fn-writer`.
|
|
90
|
+
|
|
91
|
+
### Step 6 — Output integrado
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
═══════════════════════════════════════════════════════════
|
|
95
|
+
CRM-PIPELINE-IMPLEMENTER · output
|
|
96
|
+
═══════════════════════════════════════════════════════════
|
|
97
|
+
|
|
98
|
+
## 1. Decisões
|
|
99
|
+
- Custom stages: <list>
|
|
100
|
+
- WhatsApp integration: <on/off>
|
|
101
|
+
- Notification: <channel>
|
|
102
|
+
|
|
103
|
+
## 2. Migration entregue
|
|
104
|
+
<output>
|
|
105
|
+
|
|
106
|
+
## 3. Edge Function notification entregue (se enable)
|
|
107
|
+
<output>
|
|
108
|
+
|
|
109
|
+
## 4. Cross-Phase 112 handoff
|
|
110
|
+
- evolution-go-integrator estende webhook com lookup+create lead
|
|
111
|
+
|
|
112
|
+
## 5. Frontend sketch (Phase 115)
|
|
113
|
+
- LeadsKanban.tsx com drag&drop entre 6 stages (handleErr 'invalid_lead_transition')
|
|
114
|
+
- LeadDetail.tsx com ownership transfer button
|
|
115
|
+
|
|
116
|
+
## 6. Próximos passos
|
|
117
|
+
- Apply migration: supabase db push
|
|
118
|
+
- Deploy notification function
|
|
119
|
+
- Testar: criar lead → mover stages → ownership transfer → verificar notification + audit
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Anti-patterns prevenidos
|
|
123
|
+
|
|
124
|
+
- CHECK sem trigger → REGRA #2 enforced (trigger validate_lead_stage_transition obrigatório)
|
|
125
|
+
- Ownership sem audit → REGRA #3 enforced
|
|
126
|
+
- Lead duplicate → REGRA #4 (unique constraints) + REGRA #5 (lookup before insert no webhook)
|
|
127
|
+
- Hard delete sem audit → recomenda soft delete
|
|
128
|
+
|
|
129
|
+
## Quando NÃO invocar
|
|
130
|
+
|
|
131
|
+
- Phase 106, 108, 109 não implementadas → ABORT
|
|
132
|
+
- App sem CRM (gerenciamento de leads) → escopo errado
|
|
133
|
+
- Já tem CRM legacy diferente — analisar primeiro
|
|
134
|
+
|
|
135
|
+
## Observabilidade
|
|
136
|
+
|
|
137
|
+
- Counter `crm.lead.created.count{org_id, source}`
|
|
138
|
+
- Counter `crm.lead.stage_change.count{org_id, from_stage, to_stage}`
|
|
139
|
+
- Counter `crm.lead.ownership_transfer.count{org_id}`
|
|
140
|
+
- Histogram `crm.lead.time_to_close_days{org_id, won_or_lost}`
|
|
141
|
+
- Alarme se `crm.lead.stage_change.count{to_stage='lost'} > baseline` → review pipeline
|
|
142
|
+
|
|
143
|
+
## SELECT FOR UPDATE em Stage Transition (v1.22+ — default agora)
|
|
144
|
+
|
|
145
|
+
A trigger `validate_lead_stage_transition` agora gera `SELECT ... FOR UPDATE` por default em rows lidas para prevenir lost update quando 2 reps movem o mesmo lead simultaneamente. Padrão completo em skill [`postgres-isolamento-concorrencia`](../skills/postgres-isolamento-concorrencia/SKILL.md) (v1.22 — DDIA Ch 7).
|
|
146
|
+
|
|
147
|
+
Exemplo gerado:
|
|
148
|
+
|
|
149
|
+
```sql
|
|
150
|
+
CREATE OR REPLACE FUNCTION validate_lead_stage_transition()
|
|
151
|
+
RETURNS TRIGGER AS $$
|
|
152
|
+
BEGIN
|
|
153
|
+
-- v1.22+ DEFAULT: lock row para prevenir lost update
|
|
154
|
+
PERFORM 1 FROM leads WHERE id = NEW.id FOR UPDATE;
|
|
155
|
+
-- ... validação de transição ...
|
|
156
|
+
END;
|
|
157
|
+
$$ LANGUAGE plpgsql;
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Cooperative handoff to supabase-rls-hardener (v1.23)
|
|
161
|
+
|
|
162
|
+
Após gerar CREATE TABLE leads (6 stages canônicos) + tabela lead_stage_transitions + trigger BEFORE UPDATE validate_lead_stage_transition + trigger AFTER UPDATE audit_lead_ownership_change, faça handoff cooperativo:
|
|
163
|
+
|
|
164
|
+
```python
|
|
165
|
+
Task(subagent_type="supabase-rls-hardener", prompt=f"""
|
|
166
|
+
<upstream_intent>
|
|
167
|
+
Source agent: crm-pipeline-implementer
|
|
168
|
+
Original goal: implementar CRM lead pipeline com 6 stages canônicos para {org_context}
|
|
169
|
+
Constraints: lead dedup (unique org_id,phone) + (unique org_id,email); state machine via trigger BEFORE UPDATE (não só CHECK constraint); ownership transfer com notification; integration WhatsApp lookup contact_phone
|
|
170
|
+
</upstream_intent>
|
|
171
|
+
|
|
172
|
+
<draft_sql>{generated_leads_sql}</draft_sql>
|
|
173
|
+
|
|
174
|
+
<user_facing_caller>true</user_facing_caller>
|
|
175
|
+
""")
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Hardener valida policies por org_id, GRANTs corretos, trigger SECURITY DEFINER em schema private (se aplicável). **NUNCA descarte intent upstream silenciosamente**.
|
|
179
|
+
|
|
180
|
+
## Cooperative handoff Postgres Roles (v1.26 — CROSS-21)
|
|
181
|
+
|
|
182
|
+
Crie role `lead_manager` para acesso PII columns dos leads (phone, email, notes). Role dedicado complementa column-level GRANTs (v1.24 CROSS-13). Auditabilidade superior + governance.
|
|
183
|
+
|
|
184
|
+
```python
|
|
185
|
+
Task(subagent_type="supabase-roles-implementer", prompt=f"""
|
|
186
|
+
<upstream_intent>
|
|
187
|
+
Source agent: crm-pipeline-implementer
|
|
188
|
+
Original goal: criar role lead_manager para acesso PII columns dos leads (cross-ref v1.24 column-level)
|
|
189
|
+
Constraints: NÃO BYPASSRLS (deve respeitar org boundary via RLS hierárquica multi-tenant v1.21); column-level GRANT em phone/email/notes; login opcional (pode ser group usado por managers via SET ROLE)
|
|
190
|
+
</upstream_intent>
|
|
191
|
+
|
|
192
|
+
<roles_to_create>
|
|
193
|
+
- name: lead_manager
|
|
194
|
+
type: group
|
|
195
|
+
login: false
|
|
196
|
+
bypassrls: false # respeita org boundary
|
|
197
|
+
inherit: false
|
|
198
|
+
description: "Acesso PII columns dos leads (phone, email, notes). Usado por sales managers via SET ROLE."
|
|
199
|
+
owner: "sales-team@company.com"
|
|
200
|
+
</roles_to_create>
|
|
201
|
+
|
|
202
|
+
<grants>
|
|
203
|
+
lead_manager:
|
|
204
|
+
- schema: public, usage: true
|
|
205
|
+
- table: public.leads, ops: [SELECT] # column-level já aplicado via v1.24 CROSS-13
|
|
206
|
+
</grants>
|
|
207
|
+
|
|
208
|
+
<use_case>system_access</use_case>
|
|
209
|
+
<user_facing_caller>true</user_facing_caller>
|
|
210
|
+
""")
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
**Caveat:** este role complementa RLS row-level (org boundary) + column-level (PII). NÃO substitui auth.users + custom claims (v1.25) — lead_manager é Postgres role para DBA/sales-ops, não para end-user via app.
|
|
214
|
+
|
|
215
|
+
## Cooperative handoff column-level (v1.24 — CROSS-13)
|
|
216
|
+
|
|
217
|
+
Lead PII columns (phone, email) podem precisar de column-level restriction para LGPD compliance — apenas owner do lead ou lead_manager role vê os dados de contato completos. Aplique handoff cooperativo:
|
|
218
|
+
|
|
219
|
+
```python
|
|
220
|
+
Task(subagent_type="supabase-column-privileges-writer", prompt=f"""
|
|
221
|
+
<upstream_intent>
|
|
222
|
+
Source agent: crm-pipeline-implementer
|
|
223
|
+
Original goal: lead PII columns (phone, email) com REVOKE select cross-user para LGPD compliance
|
|
224
|
+
Constraints: lead.phone e lead.email são PII; visível apenas para owner (RLS) + lead_manager role (column-level); company_name e job_title públicos para membros da org
|
|
225
|
+
</upstream_intent>
|
|
226
|
+
|
|
227
|
+
<table>schema: public, name: leads</table>
|
|
228
|
+
|
|
229
|
+
<sensitive_columns>
|
|
230
|
+
- phone
|
|
231
|
+
- email
|
|
232
|
+
- notes (jsonb — pode ter PII em call notes)
|
|
233
|
+
</sensitive_columns>
|
|
234
|
+
|
|
235
|
+
<allowed_roles>
|
|
236
|
+
- service_role: SELECT all
|
|
237
|
+
- lead_manager: SELECT all (admin do CRM)
|
|
238
|
+
- authenticated: SELECT (id, org_id, owner_id, company_name, job_title, stage, lead_value, created_at) — sem PII
|
|
239
|
+
</allowed_roles>
|
|
240
|
+
|
|
241
|
+
<user_facing_caller>true</user_facing_caller>
|
|
242
|
+
""")
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
**Importante:** combinar com RLS row-level (owner vê próprio lead inteiro) — RLS filtra qual lead; column-level filtra quais colunas DENTRO do lead. Owner pode precisar SELECT phone do PRÓPRIO lead — considere policy `for select to authenticated using (owner_id = (select auth.uid()))` granted em todas colunas, e usar column-level apenas para cross-user (outro member da org tentando ver lead alheio).
|
|
246
|
+
|
|
247
|
+
## Ver também
|
|
248
|
+
|
|
249
|
+
- [supabase-rls-hardener](./supabase-rls-hardener.md) — canonical handoff target v1.23
|
|
250
|
+
- [supabase-column-privileges-writer](./supabase-column-privileges-writer.md) — canonical handoff target v1.24 (column-level lead PII)
|
|
251
|
+
- [crm-lead-pipeline-patterns](../skills/crm-lead-pipeline-patterns/SKILL.md) — base de conhecimento
|
|
252
|
+
- [evolution-go-integrator](./evolution-go-integrator.md) — Phase 112 (cross-phase handoff)
|
|
253
|
+
- [supabase-migration-writer](./supabase-migration-writer.md) — invoked via Task() para SQL
|
|
254
|
+
- [supabase-edge-fn-writer](./supabase-edge-fn-writer.md) — invoked para notification function
|
|
255
|
+
- [audit-log-implementer](./audit-log-implementer.md) — Phase 109, eventos `custom_lead_*`
|
|
256
|
+
- [_shared-multi-tenant/glossary.md](../skills/_shared-multi-tenant/glossary.md) — `lead`, `stages canônicos`, `ownership transfer`, `lead dedup`
|