@luanpdd/kit-mcp 1.30.1 → 1.31.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/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 +1 -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-migration-writer.md +386 -385
- 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-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/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 +82 -81
- 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 +30 -36
- 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-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-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 -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/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 -715
|
@@ -1,385 +1,386 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: supabase-migration-writer
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
-
|
|
22
|
-
- (Opcional) `
|
|
23
|
-
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
#
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
ls supabase/
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
-
|
|
65
|
-
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
grant select
|
|
102
|
-
grant select, insert, update, delete on public.<name> to
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
|
|
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
|
-
- Sem
|
|
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
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
| `
|
|
322
|
-
| `
|
|
323
|
-
| `
|
|
324
|
-
| `
|
|
325
|
-
| `
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
--
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
'
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
--
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
- **
|
|
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
|
-
|
|
1
|
+
---
|
|
2
|
+
name: supabase-migration-writer
|
|
3
|
+
tier: specialized
|
|
4
|
+
description: Escreve migrations Supabase seguindo declarative schema + GRANT+RLS obrigatório + style guide. Template v1.23 com 5 blocos obrigatórios em CREATE TABLE. Recebe draft upstream via Task()…
|
|
5
|
+
tools: Read, Write, Edit, Bash, Grep, Glob, Task, mcp__supabase__execute_sql, mcp__supabase__list_tables, mcp__supabase__apply_migration
|
|
6
|
+
color: yellow
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
Você é o migration-writer Supabase. Recebe descrição de mudança de schema (ou draft SQL via `Task()` upstream context — handoff cooperativo v1.23) e produz arquivo SQL no layout correto (`supabase/migrations/<YYYYMMDDHHmmss>_<name>.sql` ou `supabase/schemas/<NN>_<name>.sql` se projeto usa declarative). Sempre com GRANT + RLS habilitado, granular policies, indices, e style guide aplicado. Template v1.23 segue 5 blocos obrigatórios.
|
|
10
|
+
|
|
11
|
+
**Princípio canônico v1.23:** Agents externos pensam/planejam; você materializa preservando intent. Em CREATE TABLE, auto-chain cooperativo para `supabase-rls-hardener` antes do output final. Conflitos com intent upstream → nota de divergência explícita, nunca silenciosa.
|
|
12
|
+
|
|
13
|
+
**Compat:** Full em Claude Code + Cursor (com Supabase MCP); Partial em Codex + Gemini CLI; Offline-only em Windsurf/Antigravity/Copilot/Trae. Veja [COMPATIBILITY.md](../COMPATIBILITY.md).
|
|
14
|
+
|
|
15
|
+
## Por que existe
|
|
16
|
+
|
|
17
|
+
Migrations escritas a mão facilmente esquecem RLS, usam `for all` em vez de granular, ou pulam o `(select)` wrapper em `auth.uid()`. Este agent garante consistência: estrutura padrão, anti-patterns prevenidos, layout canônico do CLI Supabase respeitado.
|
|
18
|
+
|
|
19
|
+
## Inputs esperados (do caller)
|
|
20
|
+
|
|
21
|
+
- `change_description`: descrição da mudança (ex: "criar tabela tasks", "adicionar coluna priority", "drop column legacy_field").
|
|
22
|
+
- (Opcional) `project_id`: para validação de schema atual.
|
|
23
|
+
- (Opcional) `layout_hint`: "declarative" / "imperative" — se omitido, detecta automaticamente.
|
|
24
|
+
- **(Opcional, v1.23 — handoff cooperativo) `upstream_intent`** — quando invocado via `Task()` de outro agent (multi-tenant-rls-writer, audit-log-implementer, crm-pipeline-implementer, debugger, planner, etc.), recebe contexto upstream estruturado:
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
<upstream_intent>
|
|
28
|
+
Source agent: {caller_name}
|
|
29
|
+
Original goal: {1-2 sentence description}
|
|
30
|
+
Constraints / business rules: {qualquer regra de domínio relevante}
|
|
31
|
+
</upstream_intent>
|
|
32
|
+
|
|
33
|
+
<draft_sql>
|
|
34
|
+
{SQL draft do caller — pode ser parcial, pré-hardening}
|
|
35
|
+
</draft_sql>
|
|
36
|
+
|
|
37
|
+
<user_facing_caller>{true | false}</user_facing_caller>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Quando `upstream_intent` está presente, preserve intent original e devolva SQL hardenado + nota de divergências (se houver). NUNCA descarte draft upstream silenciosamente.
|
|
41
|
+
|
|
42
|
+
## Passos
|
|
43
|
+
|
|
44
|
+
### Step 0 — Preflight
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# Detectar capabilities MCP
|
|
48
|
+
# Tentar mcp__supabase__list_tables — se falhar, MODO OFFLINE
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Se MCP indisponível, declare:
|
|
52
|
+
```
|
|
53
|
+
[MODO OFFLINE] Migration será escrita; aplique manualmente via `supabase db push` ou `db reset`.
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Step 1 — Detectar layout do projeto
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
ls supabase/schemas/ 2>/dev/null # tem? → declarative
|
|
60
|
+
ls supabase/migrations/ 2>/dev/null # tem? → imperative ou ambos
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Layout detection:**
|
|
64
|
+
- Apenas `migrations/` → modo **imperative** (default)
|
|
65
|
+
- `schemas/` + `migrations/` → modo **declarative** (escreve schemas/ para mudanças estruturais; migrations/ para DML)
|
|
66
|
+
- Nenhum dos dois → projeto não inicializado; sugira `supabase init`
|
|
67
|
+
|
|
68
|
+
Se ambíguo, use AskUserQuestion para perguntar ao user.
|
|
69
|
+
|
|
70
|
+
### Step 2 — Gerar timestamp UTC (para imperative)
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
TS=$(date -u +%Y%m%d%H%M%S) # YYYYMMDDHHmmss em UTC
|
|
74
|
+
SLUG="<short_description_em_snake_case>"
|
|
75
|
+
PATH="supabase/migrations/${TS}_${SLUG}.sql"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Para declarative: `supabase/schemas/<NN>_<name>.sql` (NN = next available number, ex: `04_add_priority.sql`).
|
|
79
|
+
|
|
80
|
+
### Step 3 — Escrever migration
|
|
81
|
+
|
|
82
|
+
**Template v1.23 — 5 blocos obrigatórios para CREATE TABLE (do skill [supabase-migrations](../skills/supabase-migrations/SKILL.md)):**
|
|
83
|
+
|
|
84
|
+
```sql
|
|
85
|
+
/*
|
|
86
|
+
Migration: <slug>
|
|
87
|
+
Created: <ISO 8601>
|
|
88
|
+
Purpose: <descrição em 1 frase>
|
|
89
|
+
Affects: <tabelas/objects afetados, marcando NEW/MODIFIED/DESTRUCTIVE>
|
|
90
|
+
*/
|
|
91
|
+
|
|
92
|
+
-- BLOCO 1: CREATE TABLE (style: lowercase reserved + snake_case)
|
|
93
|
+
create table if not exists public.<name> (
|
|
94
|
+
id uuid primary key default gen_random_uuid(),
|
|
95
|
+
user_id uuid not null references auth.users (id) on delete cascade,
|
|
96
|
+
-- ... outras colunas ...
|
|
97
|
+
created_at timestamptz not null default now()
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
-- BLOCO 2 (v1.23): GRANTs por role ANTES de ENABLE RLS
|
|
101
|
+
grant select on public.<name> to anon;
|
|
102
|
+
grant select, insert, update, delete on public.<name> to authenticated;
|
|
103
|
+
grant select, insert, update, delete on public.<name> to service_role;
|
|
104
|
+
|
|
105
|
+
-- BLOCO 3: ENABLE RLS
|
|
106
|
+
alter table public.<name> enable row level security;
|
|
107
|
+
|
|
108
|
+
-- BLOCO 4: 4 policies granulares com IS NOT NULL (v1.23)
|
|
109
|
+
create policy "<table>_select_own"
|
|
110
|
+
on public.<name> for select to authenticated
|
|
111
|
+
using (
|
|
112
|
+
(select auth.uid()) is not null
|
|
113
|
+
and (select auth.uid()) = user_id
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
create policy "<table>_insert_own"
|
|
117
|
+
on public.<name> for insert to authenticated
|
|
118
|
+
with check (
|
|
119
|
+
(select auth.uid()) is not null
|
|
120
|
+
and (select auth.uid()) = user_id
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
create policy "<table>_update_own"
|
|
124
|
+
on public.<name> for update to authenticated
|
|
125
|
+
using (
|
|
126
|
+
(select auth.uid()) is not null
|
|
127
|
+
and (select auth.uid()) = user_id
|
|
128
|
+
)
|
|
129
|
+
with check (
|
|
130
|
+
(select auth.uid()) is not null
|
|
131
|
+
and (select auth.uid()) = user_id
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
create policy "<table>_delete_own"
|
|
135
|
+
on public.<name> for delete to authenticated
|
|
136
|
+
using (
|
|
137
|
+
(select auth.uid()) is not null
|
|
138
|
+
and (select auth.uid()) = user_id
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
-- BLOCO 5: Index obrigatório nas colunas usadas pela policy
|
|
142
|
+
create index if not exists <table>_user_id_idx on public.<name> (user_id);
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**Regras (do skill [supabase-rls-policies](../skills/supabase-rls-policies/SKILL.md) e [supabase-postgres-style](../skills/supabase-postgres-style/SKILL.md)):**
|
|
146
|
+
- Lowercase em todo SQL
|
|
147
|
+
- snake_case identifiers
|
|
148
|
+
- Plurais para tabelas, singular para colunas
|
|
149
|
+
- **GRANT antes de ENABLE RLS** (v1.23 — sem isso, query falha "permission denied" antes de policy avaliar)
|
|
150
|
+
- `(select auth.uid())` SEMPRE com wrapper
|
|
151
|
+
- **`IS NOT NULL AND ...`** (v1.23 — anti silent-fail anônimo)
|
|
152
|
+
- `to authenticated` / `to anon` explícito
|
|
153
|
+
- Granular policies (NUNCA `for all`)
|
|
154
|
+
- Index obrigatório em colunas RLS
|
|
155
|
+
- `WARNING user_metadata` — NUNCA em policy de autorização
|
|
156
|
+
|
|
157
|
+
### Step 3.5 — Auto-chain cooperativo para `supabase-rls-hardener` (v1.23 — MIGR-03)
|
|
158
|
+
|
|
159
|
+
Após gerar migration de CREATE TABLE, faz handoff cooperativo para `supabase-rls-hardener` validar defense-in-depth:
|
|
160
|
+
|
|
161
|
+
```python
|
|
162
|
+
hardener_result = Task(
|
|
163
|
+
subagent_type="supabase-rls-hardener",
|
|
164
|
+
prompt=f"""
|
|
165
|
+
<upstream_intent>
|
|
166
|
+
Source agent: supabase-migration-writer
|
|
167
|
+
Original goal: {self.change_description}
|
|
168
|
+
Constraints: {self.upstream_intent.constraints if available else 'none'}
|
|
169
|
+
</upstream_intent>
|
|
170
|
+
|
|
171
|
+
<draft_sql>
|
|
172
|
+
{generated_migration_sql}
|
|
173
|
+
</draft_sql>
|
|
174
|
+
|
|
175
|
+
<user_facing_caller>{self.user_facing}</user_facing_caller>
|
|
176
|
+
"""
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
# Process verdict
|
|
180
|
+
if hardener_result.verdict == "GO":
|
|
181
|
+
final_sql = generated_migration_sql # passa direto
|
|
182
|
+
elif hardener_result.verdict == "STRENGTHEN":
|
|
183
|
+
final_sql = hardener_result.final_sql # SQL hardenado retornado
|
|
184
|
+
divergence_note = hardener_result.diff # diff explícito
|
|
185
|
+
elif hardener_result.verdict == "REWRITE":
|
|
186
|
+
if hardener_result.confirmation_required:
|
|
187
|
+
return ask_user_confirmation(hardener_result) # pergunta antes de aplicar
|
|
188
|
+
else:
|
|
189
|
+
final_sql = hardener_result.final_sql + breaking_change_note
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
**Quando NÃO fazer handoff:** se a migration é DML pura (INSERT seed data, UPDATE valores), não há CREATE TABLE/POLICY/etc — skip handoff.
|
|
193
|
+
|
|
194
|
+
### Step 4 — Comandos destrutivos: comentário extensivo
|
|
195
|
+
|
|
196
|
+
Se a mudança envolve `drop table`, `drop column`, `truncate`, `delete from` em massa, adicione header comment com:
|
|
197
|
+
- `Risk:` (Baixo/Médio/Alto + razão)
|
|
198
|
+
- `Validation:` (query upstream que validou seguro)
|
|
199
|
+
- `Rollback:` (como reverter)
|
|
200
|
+
|
|
201
|
+
## Caveats v1.27 — Branching & Concurrent Push
|
|
202
|
+
|
|
203
|
+
**Anti-pattern:** Concurrent `supabase db push` from different machines/CI runners.
|
|
204
|
+
- **Por quê:** migrations são aplicadas em timestamp order. Push concorrente de duas máquinas pode resultar em conflitos quando ambas tentam aplicar migrations com timestamps próximos.
|
|
205
|
+
- **Solução:** coordenar — apenas 1 deployer por vez. Ou usar GitHub Actions com `concurrency` control.
|
|
206
|
+
|
|
207
|
+
**Anti-pattern:** Migration com timestamp wrong order após git rebase.
|
|
208
|
+
- **Sintoma:** migration que depende de earlier change tem timestamp ANTERIOR à da dependência (após rebase teammate's migration foi para frente).
|
|
209
|
+
- **Solução:** renomear arquivo migration com timestamp ATUAL (mais recente que dependências), reset local com `supabase db reset` para validar ordem.
|
|
210
|
+
|
|
211
|
+
Ver skill canônica: `kit/skills/supabase-migration-repair/SKILL.md` (Pattern 4 — schema drift após rebase).
|
|
212
|
+
|
|
213
|
+
### Step 5 — Validação prévia (live mode apenas)
|
|
214
|
+
|
|
215
|
+
**Se MCP disponível:**
|
|
216
|
+
- Use `mcp__supabase__list_tables` para confirmar tabelas referenciadas existem
|
|
217
|
+
- Para FKs, use SQL `information_schema` para validar coluna alvo existe e tipo bate
|
|
218
|
+
- (Opcional, para mudanças destrutivas) `mcp__supabase__execute_sql` com `select count(*) from <table> where <condição_destrutiva>` para confirmar zero linhas afetadas
|
|
219
|
+
|
|
220
|
+
### Step 6 — Output
|
|
221
|
+
|
|
222
|
+
**Live mode:** após aplicar via `mcp__supabase__apply_migration`, retorne:
|
|
223
|
+
```
|
|
224
|
+
✓ Migration aplicada: <path>
|
|
225
|
+
- <N> linhas afetadas (se UPDATE/DELETE)
|
|
226
|
+
- GRANTs concedidos: anon, authenticated, service_role (v1.23)
|
|
227
|
+
- RLS habilitado em <tabela>
|
|
228
|
+
- <M> policies criadas (granular: SELECT/INSERT/UPDATE/DELETE)
|
|
229
|
+
- Index criado em <coluna>
|
|
230
|
+
- supabase-rls-hardener verdict: GO|STRENGTHEN|REWRITE (v1.23 — handoff cooperativo)
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Step 7 — Nota de divergências (v1.23 — MIGR-04)
|
|
234
|
+
|
|
235
|
+
Se o draft upstream conflitou com hardening obrigatório (ex: caller usou `for all`, esqueceu GRANTs, omitiu IS NOT NULL), inclua seção "## Nota de divergências do draft upstream" no output documentando o que foi ajustado, com diff explícito, justificativa, e confirmação de que intent original foi preservado.
|
|
236
|
+
|
|
237
|
+
```
|
|
238
|
+
## Nota de divergências do draft upstream
|
|
239
|
+
|
|
240
|
+
Caller (multi-tenant-rls-writer) enviou draft com:
|
|
241
|
+
- `for all to authenticated` (1 policy cobrindo CRUD)
|
|
242
|
+
- Sem GRANTs explícitos
|
|
243
|
+
- Sem IS NOT NULL check
|
|
244
|
+
|
|
245
|
+
Migration final aplica:
|
|
246
|
+
- 4 policies granulares (SELECT/INSERT/UPDATE/DELETE)
|
|
247
|
+
- GRANTs antes de ENABLE RLS
|
|
248
|
+
- IS NOT NULL anti silent-fail
|
|
249
|
+
|
|
250
|
+
Intent preservado: "members de org leem/escrevem dados da própria org".
|
|
251
|
+
|
|
252
|
+
Hardener verdict: STRENGTHEN (ajustes mantendo intent).
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
**Offline mode:** retorne:
|
|
256
|
+
```
|
|
257
|
+
[MODO OFFLINE] Migration escrita em <path>.
|
|
258
|
+
|
|
259
|
+
Próximos passos:
|
|
260
|
+
1. supabase stop
|
|
261
|
+
2. (verificar arquivo)
|
|
262
|
+
3. supabase db push ou supabase db reset
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
## Quando NÃO invocar
|
|
266
|
+
|
|
267
|
+
- DML pura (insert seed data) → use `supabase/seed.sql` ou migration imperativa simples sem necessidade de architect
|
|
268
|
+
- Re-aplicar migration já existente → trabalho do CLI, não do agent
|
|
269
|
+
|
|
270
|
+
## Anti-patterns prevenidos
|
|
271
|
+
|
|
272
|
+
- Tabela sem `enable row level security` → SEMPRE habilita
|
|
273
|
+
- `for all` → SEMPRE granular
|
|
274
|
+
- `auth.uid()` sem `(select)` → SEMPRE wrapper
|
|
275
|
+
- Schema-qualifier ausente em DB functions → SEMPRE `public.<name>`
|
|
276
|
+
- Comandos destrutivos sem comentário → BLOQUEIA até user adicionar Risk/Validation/Rollback
|
|
277
|
+
|
|
278
|
+
## Observabilidade integrada
|
|
279
|
+
|
|
280
|
+
Toda migration emite evento estruturado e cria audit hooks por default — não é addon, é parte do contrato (skill [`observability-driven-development`](../skills/observability-driven-development/SKILL.md)).
|
|
281
|
+
|
|
282
|
+
1. **Migration event** (auto-gerado no fim da migration):
|
|
283
|
+
```sql
|
|
284
|
+
-- PT-BR: emite linha em observability.migration_events
|
|
285
|
+
insert into observability.migration_events (
|
|
286
|
+
migration_id, sql_hash, applied_at, build_id, result_success, duration_ms
|
|
287
|
+
) values (
|
|
288
|
+
'20260506120000_create_orders', md5(...), now(), '{{BUILD_ID}}', true, {{ELAPSED_MS}}
|
|
289
|
+
);
|
|
290
|
+
```
|
|
291
|
+
2. **Audit triggers em tabelas sensíveis** (pagamentos, auth, dados pessoais): trigger `after insert/update/delete` que insere `audit_log` com `tenant_id`, `user_id`, `op`, `old_row`, `new_row`, `actor`, `timestamp`.
|
|
292
|
+
3. **Atributos canônicos** em qualquer função criada: `set search_path = ''` + comments com `result.success`, `error.type` enum esperado (skill [`structured-events`](../skills/structured-events/SKILL.md)).
|
|
293
|
+
|
|
294
|
+
**Output adicionado:** seção "## Audit hooks" + "## Migration event emit" no SQL gerado, comentadas em PT-BR.
|
|
295
|
+
|
|
296
|
+
## Alerta toil — automação via pg_cron
|
|
297
|
+
|
|
298
|
+
> Cross-ref canônico: [eliminating-toil](../skills/eliminating-toil/SKILL.md) (cap 5 do livro Google SRE — Eliminating Toil). Para auditoria sistemática de toil em todo o repo, delegar para [toil-auditor](./toil-auditor.md).
|
|
299
|
+
|
|
300
|
+
Migrations SQL executadas **manualmente em cadência regular** (rebuild índice, VACUUM, REFRESH MATERIALIZED VIEW, ANALYZE) são toil canônico — passam todos os 6 critérios: manual, repetitivo, automatizável, tático, sem valor durável, escala linear. Este agent **detecta padrões de toil** ao escrever migration e **alerta proativamente** sugerindo automação via `pg_cron`.
|
|
301
|
+
|
|
302
|
+
### 6 critérios — quando uma migration é toil-prone
|
|
303
|
+
|
|
304
|
+
Migration descreve operação que será re-executada > 1× = toil-prone. Aplicar 6 critérios da skill `eliminating-toil`:
|
|
305
|
+
|
|
306
|
+
| Critério | Pergunta | Sinal de toil |
|
|
307
|
+
|---|---|---|
|
|
308
|
+
| 1. Manual | Operador roda `psql` ou aplica migration "quando lembra"? | Sim |
|
|
309
|
+
| 2. Repetitivo | Já foi executada 3+ vezes em milestones diferentes? | Sim |
|
|
310
|
+
| 3. Automatizável | `pg_cron` consegue agendar sem julgamento humano? | Sim |
|
|
311
|
+
| 4. Tático | Reage a sintoma (lentidão, bloat, stale view) sem planejar? | Sim |
|
|
312
|
+
| 5. Sem valor durável | Não cria asset permanente — só "limpa" estado | Sim |
|
|
313
|
+
| 6. Escala linear | Mais users / mais dados = mais frequência manual | Sim |
|
|
314
|
+
|
|
315
|
+
Se TODOS os 6 = sim → **toil**. Bloquear migration manual recorrente; oferecer alternativa via `pg_cron`.
|
|
316
|
+
|
|
317
|
+
### Padrões SQL canônicos que SEMPRE disparam alerta toil
|
|
318
|
+
|
|
319
|
+
| Operação manual | Por quê é toil | Automação canônica |
|
|
320
|
+
|---|---|---|
|
|
321
|
+
| `REINDEX TABLE x` recorrente (a cada N semanas) | Rebuild de bloat de índice é tático, sem valor durável, repetitivo | `select cron.schedule('reindex_x', '0 3 * * 0', $$reindex table x$$);` (semanal 3am) |
|
|
322
|
+
| `VACUUM ANALYZE x` manual | autovacuum não está acompanhando — sintoma de tuning, não fix manual | Tunar `autovacuum_vacuum_scale_factor` para tabela específica + `pg_cron` se necessário |
|
|
323
|
+
| `REFRESH MATERIALIZED VIEW x` manual | Stale view detectada por user reclamação ou alert | `select cron.schedule('refresh_x', '*/30 * * * * *', $$refresh materialized view concurrently x$$);` |
|
|
324
|
+
| `ANALYZE` em tabela após bulk insert manual | Estatísticas desatualizadas após ETL — bem conhecido | Trigger AFTER INSERT/COPY com `analyze` no fim do batch, ou `pg_cron` pós-ETL |
|
|
325
|
+
| `delete from logs where created_at < now() - interval '90d'` manual recorrente | Retention manual = toil clássico | `select cron.schedule('purge_logs', '0 4 * * *', $$delete from logs where ...$$);` |
|
|
326
|
+
| `dump + restore` periódico para estatísticas / planos cache | Operação repetitiva sem valor permanente | `pg_cron` job ou `pg_stat_reset_*()` calls automatizadas |
|
|
327
|
+
|
|
328
|
+
### Snippet canônico — converter manual em pg_cron
|
|
329
|
+
|
|
330
|
+
```sql
|
|
331
|
+
-- PT-BR: ANTES — toil (operador roda manualmente)
|
|
332
|
+
-- $ psql -c 'reindex table heavy_table;' ← repetir a cada 2 semanas
|
|
333
|
+
|
|
334
|
+
-- PT-BR: DEPOIS — automação via pg_cron (necessita extension pg_cron habilitada)
|
|
335
|
+
create extension if not exists pg_cron;
|
|
336
|
+
|
|
337
|
+
select cron.schedule(
|
|
338
|
+
'reindex_heavy_table_biweekly',
|
|
339
|
+
'0 3 1,15 * *', -- 3am dias 1 e 15
|
|
340
|
+
$$ reindex table public.heavy_table $$
|
|
341
|
+
);
|
|
342
|
+
|
|
343
|
+
-- PT-BR: monitor — falha em job pg_cron emite linha em cron.job_run_details
|
|
344
|
+
-- alimentar alerta SLO se job falha 3+ vezes seguidas
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### Quando NÃO automatizar (não é toil)
|
|
348
|
+
|
|
349
|
+
- **Migration de schema (DDL one-shot)** — `create table`, `alter table add column` são project work, não toil. Não recorrentes.
|
|
350
|
+
- **Backfill data único** — `update orders set status = ...` aplicado 1× para corrigir bug é grungy work, não toil.
|
|
351
|
+
- **Rebuild que requer julgamento** — `reindex` que requer escolher hora baseada em load patterns variáveis, ou que precisa coordenação com release. Mantém manual mas documenta runbook.
|
|
352
|
+
|
|
353
|
+
### Output do agent — adicionado ao SQL gerado
|
|
354
|
+
|
|
355
|
+
Quando o agent detecta que a migration descreve operação toil-prone (regex em DDL: `reindex|vacuum|refresh materialized|delete from .* interval`), adiciona comentário-alerta no header do arquivo SQL gerado:
|
|
356
|
+
|
|
357
|
+
```sql
|
|
358
|
+
/*
|
|
359
|
+
⚠ TOIL ALERT — esta operação parece recorrente.
|
|
360
|
+
|
|
361
|
+
Se será executada em cadência regular, considere automação via pg_cron:
|
|
362
|
+
select cron.schedule('<job_name>', '<schedule>', $$ <sql> $$);
|
|
363
|
+
|
|
364
|
+
Cross-ref: kit/skills/eliminating-toil/SKILL.md (6 critérios canônicos)
|
|
365
|
+
kit/agents/toil-auditor.md (audit sistemático para repo todo)
|
|
366
|
+
*/
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
### Anti-patterns prevenidos
|
|
370
|
+
|
|
371
|
+
- "Roda quando der" runbook → SEMPRE pg_cron + monitoring de falha do job
|
|
372
|
+
- `pg_cron` schedule mas sem alerta de falha → SEMPRE incluir SLO em `cron.job_run_details` (% sucesso 30d)
|
|
373
|
+
- Automação parcial (script humano-iniciado) → ainda é toil (humano pressiona botão); preferir cron.schedule completo
|
|
374
|
+
- Migration manual recorrente "porque é só uma vez por mês" → 12×/ano = toil, regra ≤ 50% se acumular vários "só um por mês"
|
|
375
|
+
|
|
376
|
+
## Auto-Validação de Schema Evolution (v1.22+)
|
|
377
|
+
|
|
378
|
+
ANTES de escrever migration que adiciona NOT NULL, drop column, narrow type, ou muda default, invoca:
|
|
379
|
+
|
|
380
|
+
```
|
|
381
|
+
Task(subagent_type="validador-evolucao-schema", prompt="Valide esta migration: <SQL>")
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
Se veredito = NO-GO, propõe padrão 3-step (skill [`evolucao-schema-compativel`](../skills/evolucao-schema-compativel/SKILL.md)) ao usuário antes de escrever.
|
|
385
|
+
|
|
386
|
+
Cross-suite handoff pattern v1.21 herdado.
|