@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.
Files changed (365) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +168 -168
  3. package/gates/agent-no-recursive-dispatch.md +84 -82
  4. package/kit/COMANDOS.md +138 -138
  5. package/kit/COMPATIBILITY.md +5 -0
  6. package/kit/README.md +76 -76
  7. package/kit/agents/advisor-researcher.md +107 -106
  8. package/kit/agents/ai-mutation-tester.md +1 -0
  9. package/kit/agents/assumptions-analyzer.md +108 -107
  10. package/kit/agents/audit-log-implementer.md +314 -313
  11. package/kit/agents/auditor-consistencia-isolamento.md +414 -413
  12. package/kit/agents/b2b-saas-architect.md +157 -156
  13. package/kit/agents/burn-rate-forecaster.md +1 -0
  14. package/kit/agents/cascading-failures-auditor.md +299 -298
  15. package/kit/agents/codebase-mapper.md +769 -768
  16. package/kit/agents/crm-pipeline-implementer.md +257 -256
  17. package/kit/agents/debugger.md +814 -813
  18. package/kit/agents/detector-tenant-quente.md +338 -337
  19. package/kit/agents/evolution-go-integrator.md +201 -200
  20. package/kit/agents/example-reviewer.md +22 -21
  21. package/kit/agents/executor.md +565 -564
  22. package/kit/agents/golden-signals-instrumenter.md +1 -0
  23. package/kit/agents/incident-investigator.md +1 -0
  24. package/kit/agents/integration-checker.md +201 -200
  25. package/kit/agents/invite-flow-implementer.md +190 -189
  26. package/kit/agents/legacy-characterizer.md +369 -368
  27. package/kit/agents/lgpd-compliance-auditor.md +296 -295
  28. package/kit/agents/load-shedding-instrumenter.md +1 -0
  29. package/kit/agents/multi-tenant-isolation-auditor.md +254 -253
  30. package/kit/agents/multi-tenant-rls-writer.md +341 -340
  31. package/kit/agents/nyquist-auditor.md +179 -178
  32. package/kit/agents/observability-coverage-auditor.md +316 -315
  33. package/kit/agents/observability-instrumenter.md +1 -0
  34. package/kit/agents/omm-auditor.md +1 -0
  35. package/kit/agents/org-onboarding-implementer.md +224 -223
  36. package/kit/agents/payload-capture-instrumenter.md +274 -273
  37. package/kit/agents/phase-researcher.md +697 -696
  38. package/kit/agents/plan-checker.md +273 -272
  39. package/kit/agents/planner.md +923 -922
  40. package/kit/agents/postmortem-writer.md +1 -0
  41. package/kit/agents/project-researcher.md +653 -652
  42. package/kit/agents/prr-conductor.md +1 -0
  43. package/kit/agents/refactor-safety-auditor.md +405 -404
  44. package/kit/agents/release-pipeline-auditor.md +1 -0
  45. package/kit/agents/research-synthesizer.md +246 -245
  46. package/kit/agents/roadmapper.md +678 -677
  47. package/kit/agents/schema-checker.md +1 -0
  48. package/kit/agents/seam-finder.md +360 -359
  49. package/kit/agents/shotgun-surgery-detector.md +350 -349
  50. package/kit/agents/slo-engineer.md +1 -0
  51. package/kit/agents/storytelling-analyst.md +1 -0
  52. package/kit/agents/supabase-architect.md +1 -0
  53. package/kit/agents/supabase-auth-bootstrapper.md +16 -1
  54. package/kit/agents/supabase-auth-hook-writer.md +418 -0
  55. package/kit/agents/supabase-branching-architect.md +563 -562
  56. package/kit/agents/supabase-cicd-pipeline-implementer.md +778 -777
  57. package/kit/agents/supabase-column-privileges-writer.md +400 -399
  58. package/kit/agents/supabase-edge-fn-tester.md +2 -1
  59. package/kit/agents/supabase-edge-fn-writer.md +2 -1
  60. package/kit/agents/supabase-mfa-implementer.md +439 -0
  61. package/kit/agents/supabase-migration-writer.md +386 -385
  62. package/kit/agents/supabase-oauth-server-implementer.md +507 -0
  63. package/kit/agents/supabase-rbac-implementer.md +393 -392
  64. package/kit/agents/supabase-realtime-implementer.md +364 -363
  65. package/kit/agents/supabase-rls-hardener.md +522 -521
  66. package/kit/agents/supabase-rls-writer.md +324 -323
  67. package/kit/agents/supabase-roles-implementer.md +356 -355
  68. package/kit/agents/supabase-social-auth-implementer.md +451 -0
  69. package/kit/agents/supabase-sso-saml-architect.md +549 -0
  70. package/kit/agents/supabase-storage-implementer.md +1 -0
  71. package/kit/agents/super-admin-implementer.md +282 -281
  72. package/kit/agents/toil-auditor.md +1 -0
  73. package/kit/agents/ui-auditor.md +438 -437
  74. package/kit/agents/ui-checker.md +303 -302
  75. package/kit/agents/ui-researcher.md +356 -355
  76. package/kit/agents/user-profiler.md +176 -175
  77. package/kit/agents/validador-evolucao-schema.md +336 -335
  78. package/kit/agents/verifier.md +729 -728
  79. package/kit/commands/adicionar-backlog.md +75 -75
  80. package/kit/commands/adicionar-fase.md +42 -42
  81. package/kit/commands/adicionar-tarefa.md +45 -45
  82. package/kit/commands/adicionar-testes.md +41 -41
  83. package/kit/commands/ajuda.md +21 -21
  84. package/kit/commands/atualizar.md +37 -37
  85. package/kit/commands/auditar-cascading.md +111 -111
  86. package/kit/commands/auditar-marco.md +179 -179
  87. package/kit/commands/auditar-observabilidade-cobertura.md +183 -183
  88. package/kit/commands/auditar-refactor.md +219 -219
  89. package/kit/commands/auditar-release.md +109 -109
  90. package/kit/commands/auditar-uat.md +23 -23
  91. package/kit/commands/autonomo.md +40 -40
  92. package/kit/commands/branch-pr.md +24 -24
  93. package/kit/commands/burn-rate-status.md +408 -408
  94. package/kit/commands/capturar-payloads.md +193 -193
  95. package/kit/commands/caracterizar.md +212 -212
  96. package/kit/commands/concluir-marco.md +247 -247
  97. package/kit/commands/configuracoes.md +36 -36
  98. package/kit/commands/dados-distribuidos.md +188 -188
  99. package/kit/commands/definir-perfil.md +10 -10
  100. package/kit/commands/depurar.md +190 -190
  101. package/kit/commands/detectar-duplicacao.md +197 -197
  102. package/kit/commands/discutir-fase.md +131 -131
  103. package/kit/commands/encontrar-seams.md +136 -136
  104. package/kit/commands/entrar-discord.md +17 -17
  105. package/kit/commands/estatisticas.md +18 -18
  106. package/kit/commands/example-greeting.md +33 -33
  107. package/kit/commands/executar-fase.md +58 -58
  108. package/kit/commands/expresso.md +56 -56
  109. package/kit/commands/fase-ui.md +34 -34
  110. package/kit/commands/fazer.md +57 -57
  111. package/kit/commands/fio.md +125 -125
  112. package/kit/commands/fluxos-trabalho.md +64 -64
  113. package/kit/commands/forense.md +176 -176
  114. package/kit/commands/gerenciador.md +38 -38
  115. package/kit/commands/inserir-fase.md +31 -31
  116. package/kit/commands/legacy.md +263 -263
  117. package/kit/commands/limpeza.md +17 -17
  118. package/kit/commands/listar-hipoteses-fase.md +45 -45
  119. package/kit/commands/listar-workspaces.md +18 -18
  120. package/kit/commands/load-shedding.md +117 -117
  121. package/kit/commands/mapear-codebase.md +70 -70
  122. package/kit/commands/multi-tenant.md +163 -163
  123. package/kit/commands/nota.md +33 -33
  124. package/kit/commands/novo-marco.md +43 -43
  125. package/kit/commands/novo-projeto.md +41 -41
  126. package/kit/commands/novo-workspace.md +43 -43
  127. package/kit/commands/pausar-trabalho.md +37 -37
  128. package/kit/commands/perfil-usuario.md +45 -45
  129. package/kit/commands/pesquisar-fase.md +195 -195
  130. package/kit/commands/planejar-fase.md +67 -67
  131. package/kit/commands/planejar-lacunas.md +33 -33
  132. package/kit/commands/plantar-ideia.md +25 -25
  133. package/kit/commands/progresso.md +24 -24
  134. package/kit/commands/proximo.md +30 -30
  135. package/kit/commands/publicar.md +490 -490
  136. package/kit/commands/rapido.md +35 -35
  137. package/kit/commands/reaplicar-patches.md +124 -124
  138. package/kit/commands/refactor-seguro.md +321 -321
  139. package/kit/commands/relatorio-sessao.md +19 -19
  140. package/kit/commands/remover-fase.md +31 -31
  141. package/kit/commands/remover-workspace.md +26 -26
  142. package/kit/commands/resumo-marco.md +50 -50
  143. package/kit/commands/retomar-trabalho.md +40 -40
  144. package/kit/commands/revisar-backlog.md +60 -60
  145. package/kit/commands/revisar-ui.md +32 -32
  146. package/kit/commands/revisar.md +37 -37
  147. package/kit/commands/saude.md +21 -21
  148. package/kit/commands/setup-notion.md +93 -93
  149. package/kit/commands/storytelling.md +179 -179
  150. package/kit/commands/supabase.md +21 -1
  151. package/kit/commands/sync-main.md +68 -68
  152. package/kit/commands/validar-fase.md +35 -35
  153. package/kit/commands/verificar-tarefas.md +44 -44
  154. package/kit/commands/verificar-trabalho.md +64 -64
  155. package/kit/file-manifest.json +100 -84
  156. package/kit/framework/bin/lib/commands.cjs +959 -959
  157. package/kit/framework/bin/lib/config.cjs +442 -442
  158. package/kit/framework/bin/lib/core.cjs +1230 -1230
  159. package/kit/framework/bin/lib/frontmatter.cjs +336 -336
  160. package/kit/framework/bin/lib/init.cjs +1442 -1442
  161. package/kit/framework/bin/lib/milestone.cjs +252 -252
  162. package/kit/framework/bin/lib/model-profiles.cjs +68 -68
  163. package/kit/framework/bin/lib/phase.cjs +888 -888
  164. package/kit/framework/bin/lib/profile-output.cjs +952 -952
  165. package/kit/framework/bin/lib/profile-pipeline.cjs +539 -539
  166. package/kit/framework/bin/lib/roadmap.cjs +329 -329
  167. package/kit/framework/bin/lib/security.cjs +382 -382
  168. package/kit/framework/bin/lib/state.cjs +1031 -1031
  169. package/kit/framework/bin/lib/template.cjs +222 -222
  170. package/kit/framework/bin/lib/uat.cjs +282 -282
  171. package/kit/framework/bin/lib/verify.cjs +888 -888
  172. package/kit/framework/bin/lib/workstream.cjs +491 -491
  173. package/kit/framework/bin/tools.cjs +918 -918
  174. package/kit/framework/commands/workstreams.md +63 -63
  175. package/kit/framework/references/checkpoints.md +778 -778
  176. package/kit/framework/references/continuation-format.md +249 -249
  177. package/kit/framework/references/decimal-phase-calculation.md +64 -64
  178. package/kit/framework/references/git-integration.md +295 -295
  179. package/kit/framework/references/git-planning-commit.md +38 -38
  180. package/kit/framework/references/model-profile-resolution.md +36 -36
  181. package/kit/framework/references/model-profiles.md +139 -139
  182. package/kit/framework/references/phase-argument-parsing.md +61 -61
  183. package/kit/framework/references/planning-config.md +202 -202
  184. package/kit/framework/references/questioning.md +162 -162
  185. package/kit/framework/references/tdd.md +263 -263
  186. package/kit/framework/references/ui-brand.md +160 -160
  187. package/kit/framework/references/user-profiling.md +657 -657
  188. package/kit/framework/references/verification-patterns.md +612 -612
  189. package/kit/framework/references/workstream-flag.md +58 -58
  190. package/kit/framework/templates/DEBUG.md +164 -164
  191. package/kit/framework/templates/UAT.md +265 -265
  192. package/kit/framework/templates/UI-SPEC.md +100 -100
  193. package/kit/framework/templates/VALIDATION.md +76 -76
  194. package/kit/framework/templates/claude-md.md +122 -122
  195. package/kit/framework/templates/codebase/architecture.md +185 -185
  196. package/kit/framework/templates/codebase/concerns.md +205 -205
  197. package/kit/framework/templates/codebase/conventions.md +204 -204
  198. package/kit/framework/templates/codebase/integrations.md +192 -192
  199. package/kit/framework/templates/codebase/stack.md +158 -158
  200. package/kit/framework/templates/codebase/structure.md +199 -199
  201. package/kit/framework/templates/codebase/testing.md +301 -301
  202. package/kit/framework/templates/config.json +44 -44
  203. package/kit/framework/templates/context.md +352 -352
  204. package/kit/framework/templates/continue-here.md +78 -78
  205. package/kit/framework/templates/copilot-instructions.md +7 -7
  206. package/kit/framework/templates/debug-subagent-prompt.md +91 -91
  207. package/kit/framework/templates/dev-preferences.md +20 -20
  208. package/kit/framework/templates/discovery.md +146 -146
  209. package/kit/framework/templates/discussion-log.md +63 -63
  210. package/kit/framework/templates/milestone-archive.md +123 -123
  211. package/kit/framework/templates/milestone.md +115 -115
  212. package/kit/framework/templates/phase-prompt.md +610 -610
  213. package/kit/framework/templates/planner-subagent-prompt.md +117 -117
  214. package/kit/framework/templates/project.md +186 -186
  215. package/kit/framework/templates/requirements.md +231 -231
  216. package/kit/framework/templates/research-project/ARCHITECTURE.md +204 -204
  217. package/kit/framework/templates/research-project/FEATURES.md +147 -147
  218. package/kit/framework/templates/research-project/PITFALLS.md +200 -200
  219. package/kit/framework/templates/research-project/STACK.md +120 -120
  220. package/kit/framework/templates/research-project/SUMMARY.md +170 -170
  221. package/kit/framework/templates/research.md +419 -419
  222. package/kit/framework/templates/retrospective.md +54 -54
  223. package/kit/framework/templates/roadmap.md +202 -202
  224. package/kit/framework/templates/state.md +176 -176
  225. package/kit/framework/templates/summary-complex.md +59 -59
  226. package/kit/framework/templates/summary-minimal.md +41 -41
  227. package/kit/framework/templates/summary-standard.md +48 -48
  228. package/kit/framework/templates/summary.md +209 -209
  229. package/kit/framework/templates/user-profile.md +146 -146
  230. package/kit/framework/templates/user-setup.md +256 -256
  231. package/kit/framework/templates/verification-report.md +258 -258
  232. package/kit/framework/workflows/add-phase.md +112 -112
  233. package/kit/framework/workflows/add-tests.md +351 -351
  234. package/kit/framework/workflows/add-todo.md +158 -158
  235. package/kit/framework/workflows/audit-milestone.md +340 -340
  236. package/kit/framework/workflows/audit-uat.md +109 -109
  237. package/kit/framework/workflows/autonomous.md +891 -891
  238. package/kit/framework/workflows/check-todos.md +177 -177
  239. package/kit/framework/workflows/cleanup.md +152 -152
  240. package/kit/framework/workflows/complete-milestone.md +696 -696
  241. package/kit/framework/workflows/diagnose-issues.md +231 -231
  242. package/kit/framework/workflows/discovery-phase.md +289 -289
  243. package/kit/framework/workflows/discuss-phase-assumptions.md +653 -653
  244. package/kit/framework/workflows/discuss-phase.md +784 -784
  245. package/kit/framework/workflows/do.md +104 -104
  246. package/kit/framework/workflows/execute-phase.md +838 -838
  247. package/kit/framework/workflows/execute-plan.md +510 -510
  248. package/kit/framework/workflows/fast.md +102 -102
  249. package/kit/framework/workflows/forensics.md +265 -265
  250. package/kit/framework/workflows/health.md +181 -181
  251. package/kit/framework/workflows/help.md +619 -619
  252. package/kit/framework/workflows/insert-phase.md +130 -130
  253. package/kit/framework/workflows/list-phase-assumptions.md +178 -178
  254. package/kit/framework/workflows/list-workspaces.md +56 -56
  255. package/kit/framework/workflows/manager.md +362 -362
  256. package/kit/framework/workflows/map-codebase.md +377 -377
  257. package/kit/framework/workflows/milestone-summary.md +223 -223
  258. package/kit/framework/workflows/new-milestone.md +486 -486
  259. package/kit/framework/workflows/new-project.md +1159 -1159
  260. package/kit/framework/workflows/new-workspace.md +237 -237
  261. package/kit/framework/workflows/next.md +97 -97
  262. package/kit/framework/workflows/node-repair.md +92 -92
  263. package/kit/framework/workflows/note.md +156 -156
  264. package/kit/framework/workflows/pause-work.md +176 -176
  265. package/kit/framework/workflows/plan-milestone-gaps.md +273 -273
  266. package/kit/framework/workflows/plan-phase.md +765 -765
  267. package/kit/framework/workflows/plant-seed.md +169 -169
  268. package/kit/framework/workflows/pr-branch.md +129 -129
  269. package/kit/framework/workflows/profile-user.md +450 -450
  270. package/kit/framework/workflows/progress.md +507 -507
  271. package/kit/framework/workflows/quick.md +757 -757
  272. package/kit/framework/workflows/remove-phase.md +155 -155
  273. package/kit/framework/workflows/remove-workspace.md +90 -90
  274. package/kit/framework/workflows/research-phase.md +82 -82
  275. package/kit/framework/workflows/resume-project.md +326 -326
  276. package/kit/framework/workflows/review.md +228 -228
  277. package/kit/framework/workflows/session-report.md +146 -146
  278. package/kit/framework/workflows/settings.md +283 -283
  279. package/kit/framework/workflows/ship.md +228 -228
  280. package/kit/framework/workflows/stats.md +60 -60
  281. package/kit/framework/workflows/transition.md +671 -671
  282. package/kit/framework/workflows/ui-phase.md +302 -302
  283. package/kit/framework/workflows/ui-review.md +165 -165
  284. package/kit/framework/workflows/update.md +323 -323
  285. package/kit/framework/workflows/validate-phase.md +174 -174
  286. package/kit/framework/workflows/verify-phase.md +252 -252
  287. package/kit/framework/workflows/verify-work.md +637 -637
  288. package/kit/hooks/check-update.js +118 -118
  289. package/kit/hooks/context-monitor.js +163 -163
  290. package/kit/hooks/kit-attribution-reminder.cjs +29 -50
  291. package/kit/hooks/kit-router.cjs +137 -0
  292. package/kit/hooks/prompt-guard.js +103 -103
  293. package/kit/hooks/statusline.js +125 -125
  294. package/kit/hooks/workflow-guard.js +101 -101
  295. package/kit/settings.json +45 -45
  296. package/kit/skills/ai-prompt-characterization/SKILL.md +335 -335
  297. package/kit/skills/armadilhas-sistemas-distribuidos/SKILL.md +447 -447
  298. package/kit/skills/audit-log-multi-tenant/SKILL.md +340 -340
  299. package/kit/skills/b2b-saas-architecture/SKILL.md +300 -300
  300. package/kit/skills/consistencia-leitura-replica/SKILL.md +385 -385
  301. package/kit/skills/crm-lead-pipeline-patterns/SKILL.md +343 -343
  302. package/kit/skills/escolha-modelo-consistencia/SKILL.md +494 -494
  303. package/kit/skills/evolucao-schema-compativel/SKILL.md +448 -448
  304. package/kit/skills/evolution-go-whatsapp-integration/SKILL.md +322 -322
  305. package/kit/skills/example-skill/SKILL.md +42 -42
  306. package/kit/skills/legacy-api-only-applications/SKILL.md +358 -358
  307. package/kit/skills/legacy-characterization-tests/SKILL.md +330 -330
  308. package/kit/skills/legacy-effect-analysis/SKILL.md +331 -331
  309. package/kit/skills/legacy-extract-class/SKILL.md +203 -203
  310. package/kit/skills/legacy-programming-by-difference/SKILL.md +252 -252
  311. package/kit/skills/legacy-seams-and-test-harness/SKILL.md +460 -460
  312. package/kit/skills/legacy-shotgun-surgery/SKILL.md +286 -286
  313. package/kit/skills/legacy-sprout-wrap-techniques/SKILL.md +434 -434
  314. package/kit/skills/legacy-storytelling-naked-crc/SKILL.md +270 -270
  315. package/kit/skills/lgpd-multi-tenant-compliance/SKILL.md +340 -340
  316. package/kit/skills/member-invite-flow/SKILL.md +305 -305
  317. package/kit/skills/member-management-react-shadcn/SKILL.md +328 -328
  318. package/kit/skills/multi-tenant-performance-scaling/SKILL.md +316 -316
  319. package/kit/skills/multi-tenant-rls-hierarchy/SKILL.md +342 -342
  320. package/kit/skills/org-onboarding-flow/SKILL.md +257 -257
  321. package/kit/skills/org-switcher-react-pattern/SKILL.md +349 -349
  322. package/kit/skills/permission-gate-react-pattern/SKILL.md +271 -271
  323. package/kit/skills/postgres-isolamento-concorrencia/SKILL.md +552 -552
  324. package/kit/skills/pre-refactor-characterization/SKILL.md +421 -421
  325. package/kit/skills/rbac-permissions-matrix-supabase/SKILL.md +338 -338
  326. package/kit/skills/streams-eventos-cdc/SKILL.md +711 -711
  327. package/kit/skills/supabase-auth-hardening/SKILL.md +674 -0
  328. package/kit/skills/supabase-auth-hooks/SKILL.md +875 -0
  329. package/kit/skills/supabase-auth-methods/SKILL.md +486 -0
  330. package/kit/skills/supabase-auth-sessions/SKILL.md +579 -0
  331. package/kit/skills/supabase-auth-ssr/SKILL.md +60 -14
  332. package/kit/skills/supabase-branching-workflow/SKILL.md +544 -544
  333. package/kit/skills/supabase-ci-cd-github-actions/SKILL.md +880 -880
  334. package/kit/skills/supabase-column-level-security/SKILL.md +426 -426
  335. package/kit/skills/supabase-config-toml-remotes/SKILL.md +807 -807
  336. package/kit/skills/supabase-custom-claims-rbac/SKILL.md +472 -472
  337. package/kit/skills/supabase-edge-functions/SKILL.md +1 -1
  338. package/kit/skills/supabase-edge-functions-auth/SKILL.md +1 -1
  339. package/kit/skills/supabase-edge-functions-limits/SKILL.md +1 -1
  340. package/kit/skills/supabase-edge-functions-mcp-server/SKILL.md +1 -1
  341. package/kit/skills/supabase-edge-functions-testing/SKILL.md +1 -1
  342. package/kit/skills/supabase-edge-runtime-builtins/SKILL.md +1 -1
  343. package/kit/skills/supabase-enterprise-sso-saml/SKILL.md +545 -0
  344. package/kit/skills/supabase-jwt-signing-keys/SKILL.md +399 -0
  345. package/kit/skills/supabase-mfa/SKILL.md +488 -0
  346. package/kit/skills/supabase-migration-repair/SKILL.md +823 -823
  347. package/kit/skills/supabase-migrations/SKILL.md +297 -297
  348. package/kit/skills/supabase-oauth-server/SKILL.md +537 -0
  349. package/kit/skills/supabase-pgtap-testing/SKILL.md +1053 -1053
  350. package/kit/skills/supabase-postgres-roles/SKILL.md +392 -392
  351. package/kit/skills/supabase-realtime/SKILL.md +460 -460
  352. package/kit/skills/supabase-rls-defense-in-depth/SKILL.md +418 -418
  353. package/kit/skills/supabase-rls-policies/SKILL.md +635 -635
  354. package/kit/skills/supabase-social-oauth/SKILL.md +480 -0
  355. package/kit/skills/supabase-third-party-auth/SKILL.md +450 -0
  356. package/kit/skills/super-admin-platform-pattern/SKILL.md +326 -326
  357. package/kit/skills/tenant-quente-mitigacao/SKILL.md +605 -605
  358. package/kit/skills/whatsapp-conversation-state-machine/SKILL.md +287 -287
  359. package/package.json +1 -1
  360. package/src/core/kit.js +216 -216
  361. package/src/core/reflect.js +247 -247
  362. package/src/core/reverse-sync.js +372 -372
  363. package/src/core/sync.js +437 -418
  364. package/src/core/watch.js +121 -121
  365. package/src/mcp-server/index.js +794 -746
@@ -0,0 +1,674 @@
1
+ ---
2
+ name: supabase-auth-hardening
3
+ description: Use ao configurar SMTP customizado, templates de email, redirect URLs, rate limits, CAPTCHA, segurança de senha e audit logs de autenticação no Supabase.
4
+ ---
5
+
6
+ # Supabase — Hardening de Autenticação (Config, SMTP, Rate Limits, CAPTCHA)
7
+
8
+ ## Quando usar
9
+
10
+ LLM carrega esta skill quando o projeto precisar **endurecer a segurança de autenticação** do Supabase — configurando SMTP para produção, protegendo contra bots e abuso, gerenciando email templates, redirect URLs seguras ou habilitando proteção de senhas.
11
+
12
+ Trigger phrases:
13
+
14
+ - "custom SMTP Supabase", "email template Supabase"
15
+ - "redirect URLs Supabase", "rate limit auth"
16
+ - "CAPTCHA Supabase", "hCaptcha", "Turnstile"
17
+ - "password security Supabase", "leaked password protection"
18
+ - "auth audit logs", "signup abuse Supabase"
19
+ - "email prefetching problema", "OTP email Supabase"
20
+
21
+ ## Princípio canônico
22
+
23
+ Auth hardening em Supabase tem **4 camadas complementares**:
24
+
25
+ 1. **Config básica** — controlar quem pode se registrar, confirmar email, sessões anônimas
26
+ 2. **SMTP + email templates** — garantir entregabilidade e segurança dos emails de auth
27
+ 3. **Rate limits + CAPTCHA** — proteger contra abuso automatizado e bots
28
+ 4. **Password security + audit** — senhas fortes, proteção contra vazamentos, rastreabilidade
29
+
30
+ Nenhuma camada substitui as outras — produção exige todas as quatro.
31
+
32
+ ## Config geral de autenticação
33
+
34
+ ### Via Dashboard
35
+
36
+ `Authentication > Providers > Email`
37
+
38
+ ### Via `config.toml`
39
+
40
+ ```toml
41
+ [auth]
42
+ # Permitir ou bloquear novos registros (false = apenas usuários existentes)
43
+ enable_signup = true
44
+
45
+ # Exigir confirmação de email antes de liberar acesso
46
+ double_confirm_email_change = true
47
+
48
+ # Sessões anônimas (usuários sem login — útil para carrinhos, rascunhos)
49
+ enable_anonymous_sign_ins = false
50
+
51
+ # Permitir que usuários vinculem múltiplos provedores de auth manualmente
52
+ enable_manual_linking = false
53
+
54
+ # Expiração do access token (padrão: 3600 = 1h)
55
+ jwt_expiry = 3600
56
+
57
+ # Refresh token não expira automaticamente
58
+ enable_refresh_token_rotation = true
59
+ refresh_token_reuse_interval = 10 # janela de reuso em segundos (graceful)
60
+ ```
61
+
62
+ ### Configurações recomendadas por ambiente
63
+
64
+ | Config | Desenvolvimento | Produção |
65
+ |--------|----------------|---------|
66
+ | `enable_signup` | `true` | Depende do modelo (invite-only = `false`) |
67
+ | `double_confirm_email_change` | `false` | `true` |
68
+ | `enable_anonymous_sign_ins` | `true` | Conforme necessidade |
69
+ | `enable_refresh_token_rotation` | `true` | `true` (obrigatório) |
70
+
71
+ ## Email Templates
72
+
73
+ ### Tipos de templates
74
+
75
+ **Emails de autenticação** (enviados via SMTP configurado):
76
+ - `confirm_signup` — confirmação de email no cadastro
77
+ - `invite` — convite de usuário por admin
78
+ - `magic_link` — link mágico de login
79
+ - `change_email_address` — confirmação de troca de email
80
+ - `reset_password` — redefinição de senha
81
+
82
+ **Emails de notificação de segurança** (sempre enviados, não customizáveis via template):
83
+ - Alertas de login de novo dispositivo
84
+ - Notificações de MFA configurado/removido
85
+
86
+ ### Variáveis disponíveis nos templates
87
+
88
+ | Variável | Descrição |
89
+ |----------|-----------|
90
+ | `{{ .ConfirmationURL }}` | URL completa de confirmação (inclui token) |
91
+ | `{{ .Token }}` | OTP de 6 dígitos (para fluxo OTP, evita prefetching) |
92
+ | `{{ .TokenHash }}` | Hash do token (fluxo PKCE — não expõe token direto) |
93
+ | `{{ .SiteURL }}` | URL base do site (configurada em Auth settings) |
94
+ | `{{ .RedirectTo }}` | URL de redirect passada pelo cliente |
95
+ | `{{ .Email }}` | Email do usuário |
96
+ | `{{ .NewEmail }}` | Novo email (para change_email_address) |
97
+ | `{{ .Data }}` | Metadados adicionais (objeto JSON) |
98
+
99
+ ### Problema crítico: Email Prefetching
100
+
101
+ Alguns serviços de email corporativos (Outlook, Exchange, scanners de segurança) **acessam automaticamente links nos emails** para verificar malware — consumindo o token de confirmação antes do usuário clicar.
102
+
103
+ **Errado (vulnerável a prefetching):**
104
+ ```html
105
+ <!-- Template padrão com link direto -->
106
+ <p>Confirme seu cadastro:</p>
107
+ <a href="{{ .ConfirmationURL }}">Confirmar email</a>
108
+ <!-- Scanner consome o link antes do usuário → usuário vê "link expirado" -->
109
+ ```
110
+
111
+ **Solução A — OTP (recomendado para flows sensíveis):**
112
+ ```html
113
+ <!-- Template com OTP de 6 dígitos — scanner não "usa" um número -->
114
+ <p>Seu código de confirmação: <strong>{{ .Token }}</strong></p>
115
+ <p>Digite este código na tela de confirmação do aplicativo.</p>
116
+ ```
117
+
118
+ ```ts
119
+ // Frontend — verificar OTP
120
+ const { data, error } = await supabase.auth.verifyOtp({
121
+ email: userEmail,
122
+ token: otpDigitado, // código 6 dígitos do email
123
+ type: 'signup', // 'signup' | 'magiclink' | 'recovery' | 'email_change'
124
+ })
125
+ ```
126
+
127
+ **Solução B — Link customizado com token_hash (PKCE flow):**
128
+ ```html
129
+ <!-- Token hash não é o token real — scanner não consegue usar -->
130
+ <a href="{{ .SiteURL }}/confirm?token_hash={{ .TokenHash }}&type=signup&next={{ .RedirectTo }}">
131
+ Confirmar email
132
+ </a>
133
+ ```
134
+
135
+ ```ts
136
+ // Rota /confirm — trocar token_hash pelo token real
137
+ export async function GET(request: Request) {
138
+ const url = new URL(request.url)
139
+ const tokenHash = url.searchParams.get('token_hash')
140
+ const type = url.searchParams.get('type') as any
141
+
142
+ if (tokenHash && type) {
143
+ const { error } = await supabase.auth.verifyOtp({ token_hash: tokenHash, type })
144
+ if (!error) redirect(url.searchParams.get('next') ?? '/')
145
+ }
146
+
147
+ redirect('/auth/error?message=link-invalido')
148
+ }
149
+ ```
150
+
151
+ ### Customizar templates com Go Templates
152
+
153
+ Templates suportam sintaxe Go Template para lógica condicional:
154
+
155
+ ```html
156
+ {{ if eq .Data.plan "enterprise" }}
157
+ <p>Bem-vindo ao plano Enterprise! Seu gerente de conta entrará em contato.</p>
158
+ {{ else }}
159
+ <p>Bem-vindo! Comece sua avaliação gratuita de 14 dias.</p>
160
+ {{ end }}
161
+
162
+ <p>Confirme seu email:</p>
163
+ <a href="{{ .ConfirmationURL }}">Confirmar</a>
164
+ ```
165
+
166
+ ### Management API para templates
167
+
168
+ ```ts
169
+ // Atualizar template via API (service_role)
170
+ const { error } = await supabaseAdmin.from('_supabase_auth_templates').upsert({
171
+ template_type: 'confirm_signup',
172
+ subject: 'Confirme seu cadastro em {{ .SiteURL }}',
173
+ content: '<html>...</html>',
174
+ })
175
+ ```
176
+
177
+ ## Custom SMTP
178
+
179
+ ### Por que SMTP customizado é obrigatório em produção
180
+
181
+ O SMTP padrão do Supabase:
182
+ - **Só envia para endereços da equipe do projeto** — não envia para usuários externos
183
+ - **Rate limit muito baixo** — inadequado para produção
184
+ - **Não customizável** — domínio `noreply@mail.supabase.io`, sem DKIM/DMARC
185
+
186
+ **Provedores recomendados por caso de uso:**
187
+
188
+ | Provedor | Melhor para |
189
+ |----------|------------|
190
+ | Resend | DX moderno, APIs React Email |
191
+ | AWS SES | Escala, custo baixo, ecossistema AWS |
192
+ | Postmark | Alta entregabilidade transacional |
193
+ | SendGrid | Volume alto, analytics |
194
+ | Mailgun | Europeu, GDPR |
195
+
196
+ ### Configurar via `config.toml`
197
+
198
+ ```toml
199
+ [auth.email.smtp]
200
+ enabled = true
201
+ host = "smtp.resend.com"
202
+ port = 465
203
+ user = "resend"
204
+ pass = "env(SMTP_PASSWORD)" # env var — nunca valor direto em config.toml
205
+ admin_email = "noreply@meuapp.com"
206
+ sender_name = "Meu App"
207
+ ```
208
+
209
+ ### Configurar via Dashboard
210
+
211
+ `Authentication > Providers > Email > Custom SMTP` → preencher host, port, user, password.
212
+
213
+ ### Checklist de configuração de email
214
+
215
+ ```
216
+ ☐ SPF record — "v=spf1 include:_spf.resend.com ~all"
217
+ ☐ DKIM record — chave pública no DNS (obtida no provedor)
218
+ ☐ DMARC policy — "v=DMARC1; p=quarantine; rua=mailto:dmarc@meuapp.com"
219
+ ☐ Domínio de envio verificado no provedor
220
+ ☐ Endereço de reply-to configurado
221
+ ☐ Emails de auth separados dos emails de marketing (subdomínios diferentes)
222
+ ☐ Testar entregabilidade com mail-tester.com
223
+ ```
224
+
225
+ ### Separar emails de auth dos de marketing
226
+
227
+ **Problema:** usar o mesmo domínio/IP para emails transacionais (auth) e marketing (newsletters) faz com que reclamações de spam do marketing afetem a entregabilidade de emails de auth.
228
+
229
+ **Certo:** usar subdomínio dedicado para auth:
230
+ - Auth: `noreply@auth.meuapp.com` (subdomínio `auth.`)
231
+ - Marketing: `news@meuapp.com` (domínio principal)
232
+
233
+ ### Mitigação de abuso de SMTP
234
+
235
+ ```toml
236
+ [auth.email]
237
+ # Rate limit de emails por hora por IP
238
+ max_frequency = "1m" # mínimo 1 minuto entre emails para o mesmo endereço
239
+ ```
240
+
241
+ Combinado com CAPTCHA (ver abaixo) e rate limits de endpoint.
242
+
243
+ ## Redirect URLs
244
+
245
+ ### Site URL
246
+
247
+ A Site URL é o redirect padrão quando nenhum `redirectTo` é especificado:
248
+
249
+ ```toml
250
+ [auth]
251
+ site_url = "https://meuapp.com" # PRODUÇÃO — nunca deixar como localhost
252
+ # site_url = "http://localhost:3000" # só em desenvolvimento local
253
+ ```
254
+
255
+ **Erro crítico:** Site URL apontando para `localhost` em produção — usuários são redirecionados para localhost após login/confirmação.
256
+
257
+ ### Allowlist de URLs
258
+
259
+ ```toml
260
+ [auth]
261
+ additional_redirect_urls = [
262
+ "https://meuapp.com",
263
+ "https://app.meuapp.com",
264
+ "https://meuapp.vercel.app",
265
+ ]
266
+ ```
267
+
268
+ ### Wildcards em redirect URLs
269
+
270
+ | Wildcard | Comportamento |
271
+ |----------|--------------|
272
+ | `*` | Qualquer string sem `/` (mesmo segmento) |
273
+ | `**` | Qualquer string incluindo `/` (multi-segmento) |
274
+ | `?` | Um único caractere |
275
+
276
+ ```toml
277
+ additional_redirect_urls = [
278
+ # URLs de preview do Vercel (branch deploys)
279
+ "https://meuapp-*.vercel.app", # * cobre apenas um segmento
280
+ "https://meuapp-git-*.vercel.app/**", # ** cobre qualquer path após
281
+
282
+ # Netlify
283
+ "https://*--meuapp.netlify.app",
284
+
285
+ # Mobile deep links
286
+ "meuapp://auth/callback",
287
+ ]
288
+ ```
289
+
290
+ **Atenção com wildcards:** wildcards muito amplos (ex: `https://*`) são vetores de open redirect. Ser específico ao máximo — usar o domínio base como prefixo do wildcard.
291
+
292
+ ### Passando `redirectTo` no código
293
+
294
+ ```ts
295
+ // Signup com redirect customizado
296
+ const { error } = await supabase.auth.signUp({
297
+ email: 'user@exemplo.com',
298
+ password: 'senha123',
299
+ options: {
300
+ emailRedirectTo: 'https://meuapp.com/onboarding', // deve estar na allowlist
301
+ },
302
+ })
303
+
304
+ // Magic link com redirect customizado
305
+ const { error } = await supabase.auth.signInWithOtp({
306
+ email: 'user@exemplo.com',
307
+ options: {
308
+ emailRedirectTo: 'https://meuapp.com/dashboard',
309
+ },
310
+ })
311
+ ```
312
+
313
+ ## Rate Limits
314
+
315
+ ### Algoritmo Token Bucket
316
+
317
+ Supabase usa token bucket para rate limiting de auth:
318
+
319
+ ```
320
+ Capacidade: N tokens
321
+ Reabastecimento: K tokens por período
322
+ Request consome 1 token
323
+ Quando tokens = 0: requisição rejeitada com 429
324
+ ```
325
+
326
+ ### Limites padrão por endpoint
327
+
328
+ | Endpoint | Limite padrão | Customizável |
329
+ |----------|--------------|--------------|
330
+ | `/auth/v1/signup` | 30/hora por IP | Sim (Pro+) |
331
+ | `/auth/v1/token` (signIn) | 30/hora por IP | Sim (Pro+) |
332
+ | `/auth/v1/otp` (magic link) | 30/hora por IP | Sim (Pro+) |
333
+ | `/auth/v1/recover` (reset password) | 30/hora por IP | Sim (Pro+) |
334
+ | `/auth/v1/user` | 30/hora por IP | Sim (Pro+) |
335
+ | `/auth/v1/resend` | 3/hora por email | Não |
336
+
337
+ ### IP Forwarding com `Sb-Forwarded-For`
338
+
339
+ Em deployments atrás de proxy/load balancer, o IP real do cliente pode ser mascarado. Use o header `Sb-Forwarded-For` para informar o IP real ao Supabase:
340
+
341
+ ```ts
342
+ // Edge Function ou backend — repassar IP real para rate limiting
343
+ const response = await fetch(`${SUPABASE_URL}/auth/v1/signup`, {
344
+ method: 'POST',
345
+ headers: {
346
+ 'Content-Type': 'application/json',
347
+ 'apikey': SUPABASE_ANON_KEY,
348
+ 'Sb-Forwarded-For': request.headers.get('x-forwarded-for') ?? '',
349
+ // ATENÇÃO: 'Sb-Forwarded-For' só é respeitado com service_role key
350
+ 'Authorization': `Bearer ${SUPABASE_SERVICE_ROLE_KEY}`,
351
+ },
352
+ body: JSON.stringify({ email, password }),
353
+ })
354
+ ```
355
+
356
+ **Requisito de segurança:** o header `Sb-Forwarded-For` é aceito apenas quando a requisição usa `service_role` key. Com `anon` key, o header é ignorado (prevenção de spoofing).
357
+
358
+ ## CAPTCHA
359
+
360
+ ### Provedores suportados
361
+
362
+ | Provedor | Tipo | Privacy |
363
+ |----------|------|---------|
364
+ | **hCaptcha** | Challenges visuais | Maior privacidade |
365
+ | **Cloudflare Turnstile** | Invisível (comportamental) | Privacy-first |
366
+
367
+ ### Habilitar via Dashboard
368
+
369
+ `Authentication > Security > CAPTCHA protection` → Selecionar provedor → Colar Site Key.
370
+
371
+ ### Habilitar via `config.toml`
372
+
373
+ ```toml
374
+ [auth.captcha]
375
+ enabled = true
376
+ provider = "turnstile" # ou "hcaptcha"
377
+ secret = "env(CAPTCHA_SECRET_KEY)"
378
+ ```
379
+
380
+ ### Componente frontend (React)
381
+
382
+ ```tsx
383
+ // components/AuthForm.tsx — com Turnstile
384
+ import { Turnstile } from '@marsidev/react-turnstile'
385
+
386
+ export function SignUpForm() {
387
+ const [captchaToken, setCaptchaToken] = useState<string>('')
388
+ const supabase = createClient()
389
+
390
+ async function handleSubmit(e: React.FormEvent<HTMLFormElement>) {
391
+ e.preventDefault()
392
+ const formData = new FormData(e.currentTarget)
393
+
394
+ const { error } = await supabase.auth.signUp({
395
+ email: formData.get('email') as string,
396
+ password: formData.get('password') as string,
397
+ options: {
398
+ captchaToken, // token obtido do widget
399
+ },
400
+ })
401
+
402
+ if (error) console.error(error.message)
403
+ }
404
+
405
+ return (
406
+ <form onSubmit={handleSubmit}>
407
+ <input name="email" type="email" required />
408
+ <input name="password" type="password" required />
409
+
410
+ <Turnstile
411
+ siteKey={process.env.NEXT_PUBLIC_TURNSTILE_SITE_KEY!}
412
+ onSuccess={setCaptchaToken}
413
+ onExpire={() => setCaptchaToken('')}
414
+ />
415
+
416
+ <button type="submit" disabled={!captchaToken}>Criar conta</button>
417
+ </form>
418
+ )
419
+ }
420
+ ```
421
+
422
+ ### CAPTCHA em outros endpoints
423
+
424
+ ```ts
425
+ // Magic link com CAPTCHA
426
+ const { error } = await supabase.auth.signInWithOtp({
427
+ email,
428
+ options: { captchaToken },
429
+ })
430
+
431
+ // Reset de senha com CAPTCHA
432
+ const { error } = await supabase.auth.resetPasswordForEmail(email, {
433
+ captchaToken,
434
+ redirectTo: 'https://meuapp.com/reset',
435
+ })
436
+ ```
437
+
438
+ ### hCaptcha — Alternativa com maior privacidade
439
+
440
+ ```tsx
441
+ import HCaptcha from '@hcaptcha/react-hcaptcha'
442
+
443
+ function SignInForm() {
444
+ const captchaRef = useRef<HCaptcha>(null)
445
+ const [captchaToken, setCaptchaToken] = useState<string>('')
446
+
447
+ return (
448
+ <form>
449
+ <HCaptcha
450
+ sitekey={process.env.NEXT_PUBLIC_HCAPTCHA_SITE_KEY!}
451
+ ref={captchaRef}
452
+ onVerify={setCaptchaToken}
453
+ onExpire={() => setCaptchaToken('')}
454
+ />
455
+ <button type="submit" disabled={!captchaToken}>Entrar</button>
456
+ </form>
457
+ )
458
+ }
459
+ ```
460
+
461
+ ## Password Security
462
+
463
+ ### Configurar políticas de senha
464
+
465
+ ```toml
466
+ [auth.password]
467
+ # Comprimento mínimo (padrão: 6, recomendado: 12+)
468
+ min_length = 12
469
+
470
+ # Exigir caracteres específicos
471
+ require_uppercase = true # pelo menos 1 maiúscula
472
+ require_lowercase = true # pelo menos 1 minúscula
473
+ require_numbers = true # pelo menos 1 número
474
+ require_special_characters = true # pelo menos 1 especial
475
+
476
+ # Proteção contra senhas vazadas (HaveIBeenPwned) — Pro+
477
+ check_breached_passwords = true
478
+ ```
479
+
480
+ ### Leaked Password Protection (HaveIBeenPwned)
481
+
482
+ ```toml
483
+ [auth.password]
484
+ check_breached_passwords = true # rejeita senhas em listas de vazamento conhecidas
485
+ ```
486
+
487
+ Como funciona: a senha é verificada via k-Anonymity contra a API HaveIBeenPwned — apenas os 5 primeiros caracteres do hash SHA-1 são enviados (a senha nunca sai do ambiente).
488
+
489
+ ### Exigir reautenticação antes de trocar senha
490
+
491
+ ```ts
492
+ // 1. Solicitar verificação de identidade (envia email/SMS)
493
+ const { error } = await supabase.auth.reauthenticate()
494
+
495
+ // 2. Verificar código recebido
496
+ const { error } = await supabase.auth.verifyOtp({
497
+ email: userEmail,
498
+ token: codigoDigitado,
499
+ type: 'reauthentication',
500
+ })
501
+
502
+ // 3. Após verificação, atualizar senha
503
+ const { error } = await supabase.auth.updateUser({
504
+ password: novaSenha,
505
+ })
506
+ ```
507
+
508
+ ### Exigir senha atual ao trocar senha
509
+
510
+ ```ts
511
+ // Passar a senha atual junto da nova senha para garantir autenticidade
512
+ const { error } = await supabase.auth.updateUser({
513
+ password: novaSenha,
514
+ // current_password evita ataques de session fixation
515
+ // (disponível em versões recentes do @supabase/supabase-js)
516
+ })
517
+ ```
518
+
519
+ ## Audit Logs
520
+
521
+ ### Tabela `auth.audit_log_entries`
522
+
523
+ ```sql
524
+ -- Ver últimas ações de auth
525
+ select
526
+ created_at,
527
+ payload->>'action' as action,
528
+ payload->>'actor_id' as user_id,
529
+ payload->>'actor_username' as email,
530
+ payload->>'ip_address' as ip,
531
+ payload->>'traits' as traits
532
+ from auth.audit_log_entries
533
+ order by created_at desc
534
+ limit 100;
535
+
536
+ -- Filtrar por tipo de ação
537
+ select *
538
+ from auth.audit_log_entries
539
+ where payload->>'action' = 'login'
540
+ and created_at > now() - interval '24 hours';
541
+ ```
542
+
543
+ ### Ações registradas
544
+
545
+ | Ação | Descrição |
546
+ |------|-----------|
547
+ | `login` | Login bem-sucedido |
548
+ | `logout` | Logout |
549
+ | `signup` | Novo cadastro |
550
+ | `token_refreshed` | Refresh de access token |
551
+ | `password_recovery` | Pedido de reset de senha |
552
+ | `user_modified` | Dados do usuário atualizados |
553
+ | `user_deleted` | Conta deletada |
554
+ | `mfa_challenge_verified` | Desafio MFA verificado |
555
+ | `invite` | Usuário convidado por admin |
556
+
557
+ ### Armazenamento externo de audit logs
558
+
559
+ Por padrão, logs ficam no Postgres do projeto (tabela `auth.audit_log_entries`). Para retenção de longo prazo ou compliance (LGPD, SOC 2):
560
+
561
+ ```ts
562
+ // Edge Function — exportar audit logs para armazenamento externo
563
+ // supabase/functions/export-audit-logs/index.ts
564
+ import { createClient } from '@supabase/supabase-js'
565
+
566
+ Deno.serve(async () => {
567
+ const supabase = createClient(
568
+ Deno.env.get('SUPABASE_URL')!,
569
+ Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!
570
+ )
571
+
572
+ const since = new Date(Date.now() - 60 * 60 * 1000).toISOString() // última hora
573
+
574
+ const { data: logs } = await supabase
575
+ .from('auth.audit_log_entries')
576
+ .select('*')
577
+ .gt('created_at', since)
578
+ .order('created_at')
579
+
580
+ if (logs?.length) {
581
+ // Enviar para S3, Datadog, Elastic, etc.
582
+ await fetch(Deno.env.get('LOG_EXPORT_URL')!, {
583
+ method: 'POST',
584
+ headers: { 'Content-Type': 'application/json' },
585
+ body: JSON.stringify({ logs }),
586
+ })
587
+ }
588
+
589
+ return new Response('ok')
590
+ })
591
+ ```
592
+
593
+ ### Desabilitar armazenamento no Postgres (se usar externo)
594
+
595
+ ```toml
596
+ [auth]
597
+ # Desabilita inserção em auth.audit_log_entries (ainda envia para hooks)
598
+ enable_audit_log = false
599
+ ```
600
+
601
+ ## Regras absolutas
602
+
603
+ 1. **Produção exige SMTP custom** — o SMTP padrão do Supabase só envia para membros da equipe do projeto; sem SMTP custom, usuários não recebem emails de confirmação/reset
604
+ 2. **Habilitar CAPTCHA contra abuso de signup por bots** — signups automatizados consomem cota de email e poluem a base de usuários; Turnstile invisível tem menor atrito
605
+ 3. **Habilitar leaked password protection** — HaveIBeenPwned k-Anonymity não expõe a senha; rejeita 99%+ das senhas mais comuns em vazamentos
606
+ 4. **Site URL deve ser a URL de produção, não localhost** — usuários redirecionados para localhost perdem o fluxo de auth; verificar antes do deploy
607
+ 5. **URLs de preview precisam de entradas na allowlist** — Vercel e Netlify geram URLs dinâmicas por branch; usar wildcard específico com domínio base
608
+ 6. **Separar emails de auth dos emails de marketing** — usar subdomínio dedicado para auth; reclamações de spam do marketing não devem afetar entregabilidade transacional
609
+
610
+ ## Anti-patterns
611
+
612
+ ### Anti-pattern 1: SMTP padrão em produção
613
+
614
+ **Errado:**
615
+ ```toml
616
+ # config.toml sem configuração de SMTP
617
+ # "vai funcionar no dashboard.supabase.com" — ERRADO para usuários reais
618
+ ```
619
+
620
+ **Por quê:** o SMTP built-in do Supabase é exclusivo para desenvolvimento e testes — emails para endereços fora da equipe do projeto são silenciosamente descartados. Usuários em produção não recebem emails de confirmação ou reset de senha.
621
+
622
+ **Certo:** configurar SMTP custom (Resend, SES, Postmark) com domínio verificado, DKIM e DMARC antes de ir para produção.
623
+
624
+ ### Anti-pattern 2: Site URL apontando para localhost
625
+
626
+ **Errado:**
627
+ ```toml
628
+ [auth]
629
+ site_url = "http://localhost:3000" # copiado do .env de dev → esquecido em produção
630
+ ```
631
+
632
+ **Por quê:** após clicar no link de confirmação de email ou reset de senha, o usuário é redirecionado para `localhost:3000` — que não existe em produção. Fluxo de auth quebrado para todos os usuários.
633
+
634
+ **Certo:** `site_url` em staging/produção sempre aponta para a URL real; usar variável de ambiente ou CI/CD para garantir que o valor correto seja aplicado por ambiente.
635
+
636
+ ### Anti-pattern 3: Signup sem CAPTCHA
637
+
638
+ **Errado:**
639
+ ```ts
640
+ // Signup direto sem proteção
641
+ const { error } = await supabase.auth.signUp({ email, password })
642
+ ```
643
+
644
+ **Por quê:** sem CAPTCHA, qualquer script pode criar milhares de contas automaticamente — consumindo cota de email SMTP, poluindo a base de usuários, e potencialmente causando custos inesperados.
645
+
646
+ **Certo:** habilitar Turnstile (invisível, menos atrito) ou hCaptcha; passar `captchaToken` no `signUp()`.
647
+
648
+ ### Anti-pattern 4: Misturar emails de auth e marketing
649
+
650
+ **Errado:**
651
+ ```
652
+ Domínio: meuapp.com
653
+ Auth emails: noreply@meuapp.com (mesmo domínio/IP)
654
+ Marketing: newsletter@meuapp.com (mesmo domínio/IP)
655
+ ```
656
+
657
+ **Por quê:** alta taxa de unsubscribe ou reclamações de spam nas newsletters degrada a reputação do domínio/IP → emails de auth (confirmação, reset de senha) também caem no spam ou são bloqueados.
658
+
659
+ **Certo:**
660
+ ```
661
+ Auth: noreply@auth.meuapp.com (subdomínio dedicado, IP separado)
662
+ Marketing: news@meuapp.com (domínio principal)
663
+ ```
664
+
665
+ Reputações de email são por domínio/IP; subdominios permitem isolamento.
666
+
667
+ ## Ver também
668
+
669
+ - [supabase-auth-methods](../supabase-auth-methods/SKILL.md) — panorama de métodos de auth (email, magic link, OAuth social)
670
+ - [supabase-social-oauth](../supabase-social-oauth/SKILL.md) — OAuth social (Google, GitHub, etc.)
671
+ - [supabase-auth-hooks](../supabase-auth-hooks/SKILL.md) — hooks de autenticação (before/after events)
672
+ - [supabase-mfa](../supabase-mfa/SKILL.md) — Multi-Factor Authentication (TOTP, SMS)
673
+ - [supabase-auth-bootstrapper](../../agents/supabase-auth-bootstrapper.md) — agente que configura auth completo desde o início
674
+ - [supabase-auth-ssr](../supabase-auth-ssr/SKILL.md) — @supabase/ssr para Next.js