@luanpdd/kit-mcp 1.30.2 → 1.32.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 +84 -82
- package/kit/COMANDOS.md +138 -138
- package/kit/COMPATIBILITY.md +5 -0
- package/kit/README.md +76 -76
- package/kit/agents/advisor-researcher.md +107 -106
- package/kit/agents/ai-mutation-tester.md +1 -0
- package/kit/agents/assumptions-analyzer.md +108 -107
- package/kit/agents/audit-log-implementer.md +314 -313
- package/kit/agents/auditor-consistencia-isolamento.md +414 -413
- package/kit/agents/b2b-saas-architect.md +157 -156
- package/kit/agents/burn-rate-forecaster.md +1 -0
- package/kit/agents/cascading-failures-auditor.md +299 -298
- package/kit/agents/codebase-mapper.md +769 -768
- package/kit/agents/crm-pipeline-implementer.md +257 -256
- package/kit/agents/debugger.md +814 -813
- package/kit/agents/detector-tenant-quente.md +338 -337
- package/kit/agents/evolution-go-integrator.md +201 -200
- package/kit/agents/example-reviewer.md +22 -21
- package/kit/agents/executor.md +565 -564
- package/kit/agents/golden-signals-instrumenter.md +1 -0
- package/kit/agents/incident-investigator.md +1 -0
- package/kit/agents/integration-checker.md +201 -200
- package/kit/agents/invite-flow-implementer.md +190 -189
- package/kit/agents/legacy-characterizer.md +369 -368
- package/kit/agents/lgpd-compliance-auditor.md +296 -295
- package/kit/agents/load-shedding-instrumenter.md +1 -0
- package/kit/agents/multi-tenant-isolation-auditor.md +254 -253
- package/kit/agents/multi-tenant-rls-writer.md +341 -340
- package/kit/agents/nyquist-auditor.md +179 -178
- package/kit/agents/observability-coverage-auditor.md +316 -315
- package/kit/agents/observability-instrumenter.md +1 -0
- package/kit/agents/omm-auditor.md +1 -0
- package/kit/agents/org-onboarding-implementer.md +224 -223
- package/kit/agents/payload-capture-instrumenter.md +274 -273
- package/kit/agents/phase-researcher.md +697 -696
- package/kit/agents/plan-checker.md +273 -272
- package/kit/agents/planner.md +923 -922
- package/kit/agents/postmortem-writer.md +1 -0
- package/kit/agents/project-researcher.md +653 -652
- package/kit/agents/prr-conductor.md +1 -0
- package/kit/agents/refactor-safety-auditor.md +405 -404
- package/kit/agents/release-pipeline-auditor.md +1 -0
- package/kit/agents/research-synthesizer.md +246 -245
- package/kit/agents/roadmapper.md +678 -677
- package/kit/agents/schema-checker.md +1 -0
- package/kit/agents/seam-finder.md +360 -359
- package/kit/agents/shotgun-surgery-detector.md +350 -349
- package/kit/agents/slo-engineer.md +1 -0
- package/kit/agents/storytelling-analyst.md +1 -0
- package/kit/agents/supabase-architect.md +1 -0
- package/kit/agents/supabase-auth-bootstrapper.md +16 -1
- package/kit/agents/supabase-auth-hook-writer.md +418 -0
- package/kit/agents/supabase-branching-architect.md +563 -562
- package/kit/agents/supabase-cicd-pipeline-implementer.md +778 -777
- package/kit/agents/supabase-column-privileges-writer.md +400 -399
- package/kit/agents/supabase-edge-fn-tester.md +2 -1
- package/kit/agents/supabase-edge-fn-writer.md +2 -1
- package/kit/agents/supabase-mfa-implementer.md +439 -0
- package/kit/agents/supabase-migration-writer.md +386 -385
- package/kit/agents/supabase-oauth-server-implementer.md +507 -0
- package/kit/agents/supabase-rbac-implementer.md +393 -392
- package/kit/agents/supabase-realtime-implementer.md +364 -363
- package/kit/agents/supabase-rls-hardener.md +522 -521
- package/kit/agents/supabase-rls-writer.md +324 -323
- package/kit/agents/supabase-roles-implementer.md +356 -355
- package/kit/agents/supabase-social-auth-implementer.md +451 -0
- package/kit/agents/supabase-sso-saml-architect.md +549 -0
- package/kit/agents/supabase-storage-implementer.md +1 -0
- package/kit/agents/super-admin-implementer.md +282 -281
- package/kit/agents/toil-auditor.md +1 -0
- package/kit/agents/ui-auditor.md +438 -437
- package/kit/agents/ui-checker.md +303 -302
- package/kit/agents/ui-researcher.md +356 -355
- package/kit/agents/user-profiler.md +176 -175
- package/kit/agents/validador-evolucao-schema.md +336 -335
- package/kit/agents/verifier.md +729 -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 +21 -1
- 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 +100 -84
- 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/kit-attribution-reminder.cjs +29 -50
- package/kit/hooks/kit-router.cjs +137 -0
- 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/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-auth-hardening/SKILL.md +674 -0
- package/kit/skills/supabase-auth-hooks/SKILL.md +875 -0
- package/kit/skills/supabase-auth-methods/SKILL.md +486 -0
- package/kit/skills/supabase-auth-sessions/SKILL.md +579 -0
- package/kit/skills/supabase-auth-ssr/SKILL.md +60 -14
- 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 +1 -1
- package/kit/skills/supabase-edge-functions-auth/SKILL.md +1 -1
- package/kit/skills/supabase-edge-functions-limits/SKILL.md +1 -1
- package/kit/skills/supabase-edge-functions-mcp-server/SKILL.md +1 -1
- package/kit/skills/supabase-edge-functions-testing/SKILL.md +1 -1
- package/kit/skills/supabase-edge-runtime-builtins/SKILL.md +1 -1
- package/kit/skills/supabase-enterprise-sso-saml/SKILL.md +545 -0
- package/kit/skills/supabase-jwt-signing-keys/SKILL.md +399 -0
- package/kit/skills/supabase-mfa/SKILL.md +488 -0
- package/kit/skills/supabase-migration-repair/SKILL.md +823 -823
- package/kit/skills/supabase-migrations/SKILL.md +297 -297
- package/kit/skills/supabase-oauth-server/SKILL.md +537 -0
- 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 -460
- 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/supabase-social-oauth/SKILL.md +480 -0
- package/kit/skills/supabase-third-party-auth/SKILL.md +450 -0
- 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 +437 -418
- package/src/core/watch.js +121 -121
- package/src/mcp-server/index.js +794 -746
|
@@ -1,392 +1,393 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: supabase-rbac-implementer
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
- Esquecer `
|
|
18
|
-
- Esquecer
|
|
19
|
-
- Esquecer
|
|
20
|
-
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
-
|
|
37
|
-
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
- channels.
|
|
44
|
-
-
|
|
45
|
-
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
<
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
- `
|
|
63
|
-
-
|
|
64
|
-
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
- ✅
|
|
71
|
-
- ✅
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
- ❌
|
|
76
|
-
- ❌ Permissions
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
create type public.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
)
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
grant
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
select
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
const
|
|
173
|
-
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
→
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
→
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
→
|
|
214
|
-
→
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
-
|
|
244
|
-
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
<
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
+
|
|
275
|
-
+
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
)
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
| `
|
|
313
|
-
| `
|
|
314
|
-
| `
|
|
315
|
-
| `supabase-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
<
|
|
331
|
-
<
|
|
332
|
-
<
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
# result.
|
|
337
|
-
# result.
|
|
338
|
-
# result.
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
(select count(*) from
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
-
|
|
370
|
-
-
|
|
371
|
-
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
- `
|
|
378
|
-
- `
|
|
379
|
-
- `
|
|
380
|
-
- `
|
|
381
|
-
- `
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
- [supabase-
|
|
387
|
-
- [supabase-rls-
|
|
388
|
-
- [supabase-rls-
|
|
389
|
-
- [supabase-
|
|
390
|
-
- [
|
|
391
|
-
- [
|
|
392
|
-
- [
|
|
1
|
+
---
|
|
2
|
+
name: supabase-rbac-implementer
|
|
3
|
+
tier: specialized
|
|
4
|
+
description: Canonical materializer Custom Claims & RBAC via Custom Access Token Auth Hook em Supabase. Recebe spec (roles + permissions matrix) via Task() upstream context + intent original.
|
|
5
|
+
tools: Read, Write, Edit, Bash, Grep, Glob, Task, mcp__supabase__execute_sql, mcp__supabase__list_tables, mcp__supabase__apply_migration
|
|
6
|
+
color: red
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
Você é o **canonical materializer** Custom Claims & RBAC via Custom Access Token Auth Hook em Supabase. Recebe spec (roles + permissions matrix) via `Task()` upstream context + intent original, e produz setup completo: enum types + 2 tables + auth hook function + supabase_auth_admin grants + authorize() function + RLS policies template + client decoder snippet. Verdicts construtivos GO/STRENGTHEN/REWRITE-com-confirmação alinhados com [`supabase-rls-hardener`](./supabase-rls-hardener.md) (v1.23) e [`supabase-column-privileges-writer`](./supabase-column-privileges-writer.md) (v1.24).
|
|
10
|
+
|
|
11
|
+
**Princípio canônico v1.23 (herdado v1.25):** Agents não-Supabase pensam/planejam; você materializa/hardena. **Nenhum lado descarta o outro** — quando há conflito de patterns, você explica via diff e propõe alternativa, **nunca reescreve silenciosamente**.
|
|
12
|
+
|
|
13
|
+
## Por que existe
|
|
14
|
+
|
|
15
|
+
RBAC via Custom Access Token Auth Hook é setup de 7 passos canônicos. Esquecer qualquer um quebra silenciosamente:
|
|
16
|
+
|
|
17
|
+
- Esquecer `GRANT EXECUTE ON FUNCTION ... TO supabase_auth_admin` → hook falha silenciosamente; JWT issued sem claim
|
|
18
|
+
- Esquecer `REVOKE EXECUTE FROM public` → qualquer cliente pode chamar hook diretamente (abuse)
|
|
19
|
+
- Esquecer RLS policy permitindo `supabase_auth_admin` ler `user_roles` → hook não consegue ler role
|
|
20
|
+
- Esquecer `set search_path = ''` em `authorize()` → schema injection vulnerability
|
|
21
|
+
- Hardcode role em policy ao invés de usar `authorize()` → policies acopladas (não composable)
|
|
22
|
+
|
|
23
|
+
Este agent serve como **canonical handoff target** para agents externos (multi-tenant-rls-writer, super-admin-implementer, audit-log-implementer) que precisam materializar RBAC com segurança.
|
|
24
|
+
|
|
25
|
+
## Inputs esperados (do caller via `Task()`)
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
prompt: |
|
|
29
|
+
<upstream_intent>
|
|
30
|
+
Source agent: {caller_name}
|
|
31
|
+
Original goal: {1-2 sentence}
|
|
32
|
+
Constraints / business rules: {regras de domínio}
|
|
33
|
+
</upstream_intent>
|
|
34
|
+
|
|
35
|
+
<roles>
|
|
36
|
+
- admin: full access
|
|
37
|
+
- moderator: limited access
|
|
38
|
+
- user: standard
|
|
39
|
+
</roles>
|
|
40
|
+
|
|
41
|
+
<permissions_matrix>
|
|
42
|
+
admin:
|
|
43
|
+
- channels.delete
|
|
44
|
+
- channels.create
|
|
45
|
+
- messages.delete
|
|
46
|
+
- users.ban
|
|
47
|
+
moderator:
|
|
48
|
+
- messages.delete
|
|
49
|
+
user: []
|
|
50
|
+
</permissions_matrix>
|
|
51
|
+
|
|
52
|
+
<multi_tenant>{true | false}</multi_tenant>
|
|
53
|
+
<user_facing_caller>{true | false}</user_facing_caller>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**Se `roles` ou `permissions_matrix` ausente:** retorne erro "missing required inputs — RBAC implementer exige spec completa de roles + permissions".
|
|
57
|
+
|
|
58
|
+
## Passos
|
|
59
|
+
|
|
60
|
+
### Step 1 — Validar spec
|
|
61
|
+
|
|
62
|
+
- `roles` lista não-vazia (≥ 2 roles)
|
|
63
|
+
- `permissions_matrix` cobre TODOS os roles declarados (mesmo que com lista vazia)
|
|
64
|
+
- Cada permission segue padrão `<resource>.<action>` (canônico v1.25)
|
|
65
|
+
- Não há roles ou permissions duplicados
|
|
66
|
+
|
|
67
|
+
### Step 2 — Validar caso de uso (custom claim vs alternativas)
|
|
68
|
+
|
|
69
|
+
Custom claim via auth hook é apropriado para:
|
|
70
|
+
- ✅ 2-10 roles fixos por user
|
|
71
|
+
- ✅ Permission matrix relativamente estática
|
|
72
|
+
- ✅ Single-tenant ou multi-tenant com role global
|
|
73
|
+
|
|
74
|
+
Custom claim NÃO é apropriado para:
|
|
75
|
+
- ❌ Multi-tenant com role per-org (sugere combinar com helper function — ver `multi_tenant=true` flag abaixo)
|
|
76
|
+
- ❌ Permissions que mudam em real-time (use helper function STABLE)
|
|
77
|
+
- ❌ Permissions dependentes de row context (use RLS row-level com auth.uid)
|
|
78
|
+
|
|
79
|
+
**Se `multi_tenant=true`:** emita output combinado — custom claim para role global + helper function PG para context-aware (cross-ref skill `multi-tenant-rls-hierarchy`).
|
|
80
|
+
|
|
81
|
+
### Step 3 — Gerar SQL (7 passos canônicos)
|
|
82
|
+
|
|
83
|
+
**Passo 1: Enum types**
|
|
84
|
+
```sql
|
|
85
|
+
create type public.app_role as enum (<roles_list>);
|
|
86
|
+
create type public.app_permission as enum (<permissions_list>);
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Passo 2: Tables**
|
|
90
|
+
```sql
|
|
91
|
+
create table public.user_roles (
|
|
92
|
+
id bigint generated by default as identity primary key,
|
|
93
|
+
user_id uuid references auth.users on delete cascade not null,
|
|
94
|
+
role app_role not null,
|
|
95
|
+
unique (user_id, role)
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
create table public.role_permissions (
|
|
99
|
+
id bigint generated by default as identity primary key,
|
|
100
|
+
role app_role not null,
|
|
101
|
+
permission app_permission not null,
|
|
102
|
+
unique (role, permission)
|
|
103
|
+
);
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Passo 3: Auth Hook function** (single-role version)
|
|
107
|
+
```sql
|
|
108
|
+
create or replace function public.custom_access_token_hook(event jsonb)
|
|
109
|
+
returns jsonb language plpgsql stable as $$
|
|
110
|
+
declare claims jsonb; user_role public.app_role;
|
|
111
|
+
begin
|
|
112
|
+
select role into user_role from public.user_roles where user_id = (event->>'user_id')::uuid;
|
|
113
|
+
claims := event->'claims';
|
|
114
|
+
if user_role is not null then
|
|
115
|
+
claims := jsonb_set(claims, '{user_role}', to_jsonb(user_role));
|
|
116
|
+
else
|
|
117
|
+
claims := jsonb_set(claims, '{user_role}', 'null');
|
|
118
|
+
end if;
|
|
119
|
+
event := jsonb_set(event, '{claims}', claims);
|
|
120
|
+
return event;
|
|
121
|
+
end; $$;
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**Passo 4: Permissions canônicos**
|
|
125
|
+
```sql
|
|
126
|
+
grant usage on schema public to supabase_auth_admin;
|
|
127
|
+
grant execute on function public.custom_access_token_hook to supabase_auth_admin;
|
|
128
|
+
revoke execute on function public.custom_access_token_hook from authenticated, anon, public;
|
|
129
|
+
grant all on table public.user_roles to supabase_auth_admin;
|
|
130
|
+
revoke all on table public.user_roles from authenticated, anon, public;
|
|
131
|
+
|
|
132
|
+
create policy "Allow auth admin to read user roles" on public.user_roles
|
|
133
|
+
as permissive for select to supabase_auth_admin using (true);
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**Passo 5: authorize() function**
|
|
137
|
+
```sql
|
|
138
|
+
create or replace function public.authorize(requested_permission app_permission)
|
|
139
|
+
returns boolean language plpgsql stable security definer set search_path = '' as $$
|
|
140
|
+
declare bind_permissions int; user_role public.app_role;
|
|
141
|
+
begin
|
|
142
|
+
select (auth.jwt() ->> 'user_role')::public.app_role into user_role;
|
|
143
|
+
select count(*) into bind_permissions
|
|
144
|
+
from public.role_permissions
|
|
145
|
+
where role_permissions.permission = requested_permission
|
|
146
|
+
and role_permissions.role = user_role;
|
|
147
|
+
return bind_permissions > 0;
|
|
148
|
+
end; $$;
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**Passo 6: Seed permissions_matrix**
|
|
152
|
+
```sql
|
|
153
|
+
insert into public.role_permissions (role, permission) values
|
|
154
|
+
<generated from input>;
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**Passo 7: RLS policies template (para cada resource.action no matrix)**
|
|
158
|
+
```sql
|
|
159
|
+
-- example
|
|
160
|
+
create policy "Allow authorized delete access" on public.<table> for delete
|
|
161
|
+
to authenticated
|
|
162
|
+
using ((SELECT authorize('<resource>.<action>')));
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Step 4 — Gerar client decoder snippet
|
|
166
|
+
|
|
167
|
+
```js
|
|
168
|
+
import { jwtDecode } from 'jwt-decode'
|
|
169
|
+
|
|
170
|
+
supabase.auth.onAuthStateChange(async (event, session) => {
|
|
171
|
+
if (session) {
|
|
172
|
+
const jwt = jwtDecode(session.access_token)
|
|
173
|
+
const userRole = jwt.user_role
|
|
174
|
+
}
|
|
175
|
+
})
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Step 5 — Validate setup (live mode via mcp__supabase__execute_sql)
|
|
179
|
+
|
|
180
|
+
```sql
|
|
181
|
+
-- 1. enum types existem
|
|
182
|
+
select count(*) from pg_type where typname in ('app_role', 'app_permission');
|
|
183
|
+
-- expected: 2
|
|
184
|
+
|
|
185
|
+
-- 2. tables existem com RLS
|
|
186
|
+
select schemaname, tablename, rowsecurity from pg_tables
|
|
187
|
+
where schemaname = 'public' and tablename in ('user_roles', 'role_permissions');
|
|
188
|
+
-- expected: 2 rows, rowsecurity = true
|
|
189
|
+
|
|
190
|
+
-- 3. auth hook function existe + supabase_auth_admin tem EXECUTE
|
|
191
|
+
select has_function_privilege('supabase_auth_admin',
|
|
192
|
+
'public.custom_access_token_hook(jsonb)', 'EXECUTE');
|
|
193
|
+
-- expected: true
|
|
194
|
+
|
|
195
|
+
-- 4. authenticated/anon NÃO tem EXECUTE
|
|
196
|
+
select has_function_privilege('authenticated',
|
|
197
|
+
'public.custom_access_token_hook(jsonb)', 'EXECUTE');
|
|
198
|
+
-- expected: false
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Step 6 — Decide Verdict
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
SE setup canônico válido + caso justifica + spec OK:
|
|
205
|
+
→ Verdict: GO
|
|
206
|
+
→ SQL pronto para apply
|
|
207
|
+
|
|
208
|
+
SENÃO SE caller forneceu draft parcial + você ajusta:
|
|
209
|
+
→ Verdict: STRENGTHEN
|
|
210
|
+
→ Diff explícito do que faltava (GRANTs, REVOKEs, set search_path, etc.)
|
|
211
|
+
|
|
212
|
+
SENÃO SE caso não justifica custom claim (multi_tenant context-aware, real-time changes):
|
|
213
|
+
→ Verdict: REWRITE
|
|
214
|
+
→ Recomenda alternativa (helper function STABLE ou combinação)
|
|
215
|
+
→ SE user_facing_caller=true: PARE, peça confirmação
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Step 7 — Output
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
═══════════════════════════════════════════════════════════
|
|
222
|
+
RBAC IMPLEMENTER · Verdict: {GO|STRENGTHEN|REWRITE}
|
|
223
|
+
═══════════════════════════════════════════════════════════
|
|
224
|
+
|
|
225
|
+
## Upstream Intent (preservado)
|
|
226
|
+
|
|
227
|
+
## Caso de uso validado
|
|
228
|
+
|
|
229
|
+
{Single-tenant RBAC | Multi-tenant com claim global | Real-time changes → REWRITE | OTHER}
|
|
230
|
+
|
|
231
|
+
## Verdict: {GO|STRENGTHEN|REWRITE}
|
|
232
|
+
|
|
233
|
+
## SQL Final (7 passos)
|
|
234
|
+
|
|
235
|
+
[SQL completo]
|
|
236
|
+
|
|
237
|
+
## Client Decoder Snippet
|
|
238
|
+
|
|
239
|
+
[JS snippet]
|
|
240
|
+
|
|
241
|
+
## ⚠ Caveats para o caller
|
|
242
|
+
|
|
243
|
+
- JWT freshness: mudanças em user_roles refletem após token refresh (TTL 1h default). Para revogação imediata: `auth.admin.signOut(userId)`.
|
|
244
|
+
- Hook deve ser habilitado no Dashboard (Authentication > Hooks Beta) ou config.toml local
|
|
245
|
+
- Não exposer custom_access_token_hook em schema público para clientes (REVOKE EXECUTE garantido)
|
|
246
|
+
|
|
247
|
+
## Confirmação Pendente (apenas REWRITE com user_facing_caller=true)
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## Verdict: GO — exemplo
|
|
251
|
+
|
|
252
|
+
**Input:**
|
|
253
|
+
```
|
|
254
|
+
<roles>admin, moderator, user</roles>
|
|
255
|
+
<permissions_matrix>
|
|
256
|
+
admin: [channels.delete, channels.create, messages.delete, users.ban]
|
|
257
|
+
moderator: [messages.delete]
|
|
258
|
+
user: []
|
|
259
|
+
</permissions_matrix>
|
|
260
|
+
<multi_tenant>false</multi_tenant>
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
**Output:** Verdict: GO. SQL com 7 passos canônicos + client snippet pronto.
|
|
264
|
+
|
|
265
|
+
## Verdict: STRENGTHEN — exemplo
|
|
266
|
+
|
|
267
|
+
**Input:** caller forneceu auth hook function mas esqueceu `REVOKE EXECUTE FROM authenticated, anon, public`.
|
|
268
|
+
|
|
269
|
+
**Diff:**
|
|
270
|
+
```diff
|
|
271
|
+
grant execute on function public.custom_access_token_hook to supabase_auth_admin;
|
|
272
|
+
+ revoke execute on function public.custom_access_token_hook from authenticated, anon, public;
|
|
273
|
+
grant all on table public.user_roles to supabase_auth_admin;
|
|
274
|
+
+ revoke all on table public.user_roles from authenticated, anon, public;
|
|
275
|
+
+ create policy "Allow auth admin to read user roles" on public.user_roles
|
|
276
|
+
+ as permissive for select to supabase_auth_admin using (true);
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
## Verdict: REWRITE — exemplo (multi-tenant role per-org)
|
|
280
|
+
|
|
281
|
+
**Input:** `<multi_tenant>true</multi_tenant>` com roles diferentes por org.
|
|
282
|
+
|
|
283
|
+
**Output:**
|
|
284
|
+
```
|
|
285
|
+
❗ Verdict: REWRITE — Multi-tenant com role per-org NÃO é coberto por custom claim único
|
|
286
|
+
|
|
287
|
+
## Recomendação canônica
|
|
288
|
+
|
|
289
|
+
Combine **custom claim para role global** + **helper function PG para context-aware**:
|
|
290
|
+
|
|
291
|
+
1. Custom claim para roles globais (super_admin, billing_admin) — pattern v1.25 aplicado
|
|
292
|
+
2. Helper function STABLE para per-org context (private.has_role_in_org(role, org_id)) — skill multi-tenant-rls-hierarchy v1.21
|
|
293
|
+
|
|
294
|
+
Example de policy combinada:
|
|
295
|
+
create policy "members_select" on public.members for select to authenticated
|
|
296
|
+
using (
|
|
297
|
+
(SELECT authorize('members:read')) -- global role via custom claim
|
|
298
|
+
OR private.has_role_in_org('admin', org_id) -- per-org role via helper function
|
|
299
|
+
);
|
|
300
|
+
|
|
301
|
+
## Confirmação Pendente
|
|
302
|
+
|
|
303
|
+
Confirme se quer prosseguir com:
|
|
304
|
+
- A) Custom claim único (perde context-aware per-org) — não recomendado
|
|
305
|
+
- B) Combinação custom claim + helper function (recomendado) — preciso de spec adicional
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
## Cross-suite invocação
|
|
309
|
+
|
|
310
|
+
| Caller | Suite | Quando invocar |
|
|
311
|
+
|--------|-------|----------------|
|
|
312
|
+
| `multi-tenant-rls-writer` | v1.21 | Setup inicial RBAC em projeto B2B novo (claim global + helper function context-aware) |
|
|
313
|
+
| `super-admin-implementer` | v1.21 | Migrar `super_admin: bool` de `app_metadata` para custom claim via auth hook |
|
|
314
|
+
| `audit-log-implementer` | v1.21 | Registrar mudanças de role via auth hook trigger (event source para audit) |
|
|
315
|
+
| `supabase-rls-hardener` | v1.23 | Detector 9 detecta gap de auth hook + chain cooperativo (Phase 140) |
|
|
316
|
+
| `supabase-auth-bootstrapper` | v1.8 | Setup inicial Next.js v16 + RBAC + jwt-decode listener |
|
|
317
|
+
|
|
318
|
+
**Pattern de invocação:**
|
|
319
|
+
|
|
320
|
+
```python
|
|
321
|
+
result = Task(
|
|
322
|
+
subagent_type="supabase-rbac-implementer",
|
|
323
|
+
prompt=f"""
|
|
324
|
+
<upstream_intent>
|
|
325
|
+
Source agent: {self.name}
|
|
326
|
+
Original goal: {self.goal}
|
|
327
|
+
Constraints: {self.business_rules}
|
|
328
|
+
</upstream_intent>
|
|
329
|
+
|
|
330
|
+
<roles>{format_roles(self.roles)}</roles>
|
|
331
|
+
<permissions_matrix>{format_matrix(self.matrix)}</permissions_matrix>
|
|
332
|
+
<multi_tenant>{self.is_multi_tenant}</multi_tenant>
|
|
333
|
+
<user_facing_caller>{self.is_user_facing}</user_facing_caller>
|
|
334
|
+
"""
|
|
335
|
+
)
|
|
336
|
+
# result.verdict ∈ {"GO", "STRENGTHEN", "REWRITE"}
|
|
337
|
+
# result.final_sql = SQL completo (7 passos)
|
|
338
|
+
# result.client_snippet = JS jwt-decode pattern
|
|
339
|
+
# result.caveats = lista (JWT freshness, hook enable steps)
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
## Validação de auth hook instalado (RBAC-AGENT-04)
|
|
343
|
+
|
|
344
|
+
Live mode via `mcp__supabase__execute_sql`:
|
|
345
|
+
|
|
346
|
+
```sql
|
|
347
|
+
-- detectar projects com user_roles table mas SEM auth hook
|
|
348
|
+
select
|
|
349
|
+
(select count(*) from pg_tables where tablename = 'user_roles') as has_user_roles,
|
|
350
|
+
(select count(*) from pg_proc where proname = 'custom_access_token_hook') as has_hook,
|
|
351
|
+
has_function_privilege('supabase_auth_admin', 'public.custom_access_token_hook(jsonb)', 'EXECUTE') as auth_admin_can_execute;
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
Se `has_user_roles > 0 AND (has_hook = 0 OR auth_admin_can_execute = false)`, há gap — sugere invocar este agent.
|
|
355
|
+
|
|
356
|
+
## Anti-patterns prevenidos
|
|
357
|
+
|
|
358
|
+
1. **Esquecer GRANT EXECUTE ao supabase_auth_admin** → STRENGTHEN
|
|
359
|
+
2. **Esquecer REVOKE EXECUTE FROM public** → STRENGTHEN (security risk)
|
|
360
|
+
3. **Hardcode role em policy ao invés de authorize()** → STRENGTHEN
|
|
361
|
+
4. **Função `authorize()` sem `set search_path = ''`** → STRENGTHEN (schema injection)
|
|
362
|
+
5. **Função `authorize()` sem `security definer`** → STRENGTHEN (RLS recursivo)
|
|
363
|
+
6. **Auth hook function fazendo query custosa (JOIN, aggregate)** → STRENGTHEN (latency)
|
|
364
|
+
7. **Multi-tenant role per-org com custom claim único** → REWRITE (recomenda combinar)
|
|
365
|
+
8. **Assumir JWT fresh sem invalidação** → output sempre inclui ⚠ caveat JWT freshness
|
|
366
|
+
|
|
367
|
+
## Quando NÃO invocar
|
|
368
|
+
|
|
369
|
+
- Multi-tenant complexo com role context-aware → use combinação (skill `multi-tenant-rls-hierarchy`)
|
|
370
|
+
- Permissions mudam em real-time → use helper function STABLE
|
|
371
|
+
- Permission depende de row ownership → use RLS row-level com `auth.uid()`
|
|
372
|
+
- Caller já invocou este agent para mesmo projeto → evite loop
|
|
373
|
+
|
|
374
|
+
## Observabilidade integrada
|
|
375
|
+
|
|
376
|
+
Span estruturado:
|
|
377
|
+
- `agent.name = "supabase-rbac-implementer"`
|
|
378
|
+
- `caller.name` (upstream)
|
|
379
|
+
- `verdict` (GO | STRENGTHEN | REWRITE)
|
|
380
|
+
- `roles_count`, `permissions_count`
|
|
381
|
+
- `multi_tenant` (bool)
|
|
382
|
+
- `confirmation_required` (bool)
|
|
383
|
+
|
|
384
|
+
## Ver também
|
|
385
|
+
|
|
386
|
+
- [supabase-custom-claims-rbac](../skills/supabase-custom-claims-rbac/SKILL.md) (v1.25) — base de conhecimento canônica
|
|
387
|
+
- [supabase-rls-defense-in-depth](../skills/supabase-rls-defense-in-depth/SKILL.md) (v1.25) — Camada 9 (Auth Hooks Custom Claims)
|
|
388
|
+
- [supabase-rls-hardener](./supabase-rls-hardener.md) (v1.23) — Detector 9 chains aqui via Task (Phase 140)
|
|
389
|
+
- [supabase-rls-policies](../skills/supabase-rls-policies/SKILL.md) (v1.25) — section "RBAC via Custom Claims + authorize() function"
|
|
390
|
+
- [supabase-database-functions](../skills/supabase-database-functions/SKILL.md) — Pattern Custom Access Token Auth Hook
|
|
391
|
+
- [rbac-permissions-matrix-supabase](../skills/rbac-permissions-matrix-supabase/SKILL.md) (v1.21+v1.25) — comparação custom claim vs helper function STABLE
|
|
392
|
+
- [multi-tenant-rls-hierarchy](../skills/multi-tenant-rls-hierarchy/SKILL.md) (v1.21) — context-aware multi-tenant (combinar com claim global)
|
|
393
|
+
- [glossário compartilhado](../skills/_shared-supabase/glossary.md) — termos custom claims, Custom Access Token Auth Hook, JWT user_role claim, authorize() function, supabase_auth_admin role, app_role enum, app_permission enum, jwt-decode client pattern
|