@luanpdd/kit-mcp 1.33.0 → 1.34.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 -84
- package/kit/COMANDOS.md +138 -138
- package/kit/COMPATIBILITY.md +70 -70
- package/kit/README.md +76 -76
- package/kit/agents/advisor-researcher.md +109 -109
- package/kit/agents/ai-mutation-tester.md +289 -289
- package/kit/agents/assumptions-analyzer.md +110 -110
- package/kit/agents/audit-log-implementer.md +314 -314
- package/kit/agents/auditor-consistencia-isolamento.md +414 -414
- package/kit/agents/b2b-saas-architect.md +157 -157
- package/kit/agents/burn-rate-forecaster.md +153 -153
- package/kit/agents/cascading-failures-auditor.md +299 -299
- package/kit/agents/codebase-mapper.md +769 -769
- package/kit/agents/crm-pipeline-implementer.md +257 -257
- package/kit/agents/debugger.md +814 -814
- package/kit/agents/designer-ui.md +216 -216
- package/kit/agents/detector-tenant-quente.md +338 -338
- package/kit/agents/evolution-go-integrator.md +201 -201
- package/kit/agents/example-reviewer.md +22 -22
- package/kit/agents/executor.md +565 -565
- package/kit/agents/golden-signals-instrumenter.md +232 -232
- package/kit/agents/incident-investigator.md +238 -238
- package/kit/agents/integration-checker.md +203 -203
- package/kit/agents/invite-flow-implementer.md +190 -190
- package/kit/agents/legacy-characterizer.md +369 -369
- package/kit/agents/lgpd-compliance-auditor.md +296 -296
- package/kit/agents/load-shedding-instrumenter.md +290 -290
- package/kit/agents/multi-tenant-isolation-auditor.md +254 -254
- package/kit/agents/multi-tenant-rls-writer.md +341 -341
- package/kit/agents/nyquist-auditor.md +181 -181
- package/kit/agents/observability-coverage-auditor.md +316 -316
- package/kit/agents/observability-instrumenter.md +191 -191
- package/kit/agents/omm-auditor.md +291 -291
- package/kit/agents/org-onboarding-implementer.md +224 -224
- package/kit/agents/payload-capture-instrumenter.md +274 -274
- package/kit/agents/phase-researcher.md +697 -697
- package/kit/agents/plan-checker.md +275 -275
- package/kit/agents/planner.md +923 -923
- package/kit/agents/postmortem-writer.md +273 -273
- package/kit/agents/project-researcher.md +653 -653
- package/kit/agents/prr-conductor.md +287 -287
- package/kit/agents/refactor-safety-auditor.md +405 -405
- package/kit/agents/release-pipeline-auditor.md +364 -364
- package/kit/agents/research-synthesizer.md +246 -246
- package/kit/agents/roadmapper.md +678 -678
- package/kit/agents/schema-checker.md +160 -160
- package/kit/agents/seam-finder.md +360 -360
- package/kit/agents/shotgun-surgery-detector.md +350 -350
- package/kit/agents/slo-engineer.md +217 -217
- package/kit/agents/storytelling-analyst.md +300 -300
- package/kit/agents/supabase-architect.md +249 -249
- package/kit/agents/supabase-auth-bootstrapper.md +400 -400
- package/kit/agents/supabase-auth-hook-writer.md +418 -418
- package/kit/agents/supabase-branching-architect.md +563 -563
- package/kit/agents/supabase-cicd-pipeline-implementer.md +778 -778
- package/kit/agents/supabase-column-privileges-writer.md +400 -400
- package/kit/agents/supabase-edge-fn-tester.md +288 -288
- package/kit/agents/supabase-edge-fn-writer.md +341 -341
- package/kit/agents/supabase-mfa-implementer.md +439 -439
- package/kit/agents/supabase-migration-writer.md +386 -386
- package/kit/agents/supabase-oauth-server-implementer.md +507 -507
- package/kit/agents/supabase-rbac-implementer.md +393 -393
- package/kit/agents/supabase-realtime-implementer.md +364 -364
- package/kit/agents/supabase-rls-hardener.md +522 -522
- package/kit/agents/supabase-rls-writer.md +324 -324
- package/kit/agents/supabase-roles-implementer.md +356 -356
- package/kit/agents/supabase-social-auth-implementer.md +451 -451
- package/kit/agents/supabase-sso-saml-architect.md +549 -549
- package/kit/agents/supabase-storage-implementer.md +407 -407
- package/kit/agents/super-admin-implementer.md +282 -282
- package/kit/agents/toil-auditor.md +268 -268
- package/kit/agents/ui-auditor.md +438 -438
- package/kit/agents/ui-checker.md +305 -305
- package/kit/agents/ui-researcher.md +356 -356
- package/kit/agents/user-profiler.md +176 -176
- package/kit/agents/validador-evolucao-schema.md +336 -336
- package/kit/agents/verifier.md +729 -729
- 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-workflow.md +121 -0
- package/kit/commands/auditar-observabilidade-cobertura.md +183 -183
- package/kit/commands/auditar-refactor.md +219 -219
- package/kit/commands/auditar-release.md +109 -109
- package/kit/commands/auditar-uat.md +23 -23
- package/kit/commands/autonomo.md +40 -40
- package/kit/commands/branch-pr.md +24 -24
- package/kit/commands/burn-rate-status.md +408 -408
- package/kit/commands/capturar-payloads.md +193 -193
- package/kit/commands/caracterizar.md +212 -212
- package/kit/commands/concluir-marco.md +247 -247
- package/kit/commands/configuracoes.md +36 -36
- package/kit/commands/dados-distribuidos.md +188 -188
- package/kit/commands/definir-perfil.md +10 -10
- package/kit/commands/depurar.md +190 -190
- package/kit/commands/detectar-duplicacao.md +197 -197
- package/kit/commands/discutir-fase.md +131 -131
- package/kit/commands/encontrar-seams.md +136 -136
- package/kit/commands/entrar-discord.md +17 -17
- package/kit/commands/estatisticas.md +18 -18
- package/kit/commands/example-greeting.md +33 -33
- package/kit/commands/executar-fase.md +58 -58
- package/kit/commands/expresso.md +56 -56
- package/kit/commands/fase-ui.md +34 -34
- package/kit/commands/fazer.md +57 -57
- package/kit/commands/fio.md +125 -125
- package/kit/commands/fluxos-trabalho.md +64 -64
- package/kit/commands/forense.md +176 -176
- package/kit/commands/gerenciador.md +38 -38
- package/kit/commands/inserir-fase.md +31 -31
- package/kit/commands/legacy.md +263 -263
- package/kit/commands/limpeza.md +17 -17
- package/kit/commands/listar-hipoteses-fase.md +45 -45
- package/kit/commands/listar-workspaces.md +18 -18
- package/kit/commands/load-shedding.md +117 -117
- package/kit/commands/mapear-codebase.md +70 -70
- package/kit/commands/multi-tenant.md +163 -163
- package/kit/commands/nota.md +33 -33
- package/kit/commands/novo-marco.md +43 -43
- package/kit/commands/novo-projeto.md +41 -41
- package/kit/commands/novo-workspace.md +43 -43
- package/kit/commands/pausar-trabalho.md +37 -37
- package/kit/commands/perfil-usuario.md +45 -45
- package/kit/commands/pesquisar-fase.md +195 -195
- package/kit/commands/planejar-fase.md +67 -67
- package/kit/commands/planejar-lacunas.md +33 -33
- package/kit/commands/plantar-ideia.md +25 -25
- package/kit/commands/progresso.md +24 -24
- package/kit/commands/proximo.md +30 -30
- package/kit/commands/publicar.md +490 -490
- package/kit/commands/rapido.md +35 -35
- package/kit/commands/reaplicar-patches.md +124 -124
- package/kit/commands/refactor-seguro.md +321 -321
- package/kit/commands/relatorio-sessao.md +19 -19
- package/kit/commands/remover-fase.md +31 -31
- package/kit/commands/remover-workspace.md +26 -26
- package/kit/commands/resumo-marco.md +50 -50
- package/kit/commands/retomar-trabalho.md +40 -40
- package/kit/commands/revisar-backlog.md +60 -60
- package/kit/commands/revisar-ui.md +32 -32
- package/kit/commands/revisar.md +37 -37
- package/kit/commands/saude.md +21 -21
- package/kit/commands/setup-notion.md +93 -93
- package/kit/commands/storytelling.md +179 -179
- package/kit/commands/supabase.md +238 -238
- 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 +13 -11
- 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 +92 -92
- package/kit/hooks/kit-router.cjs +137 -137
- package/kit/hooks/prompt-guard.js +103 -103
- package/kit/hooks/statusline.js +125 -125
- package/kit/hooks/workflow-guard.js +101 -101
- package/kit/settings.json +45 -45
- package/kit/skills/ai-prompt-characterization/SKILL.md +335 -335
- package/kit/skills/armadilhas-sistemas-distribuidos/SKILL.md +447 -447
- package/kit/skills/audit-log-multi-tenant/SKILL.md +340 -340
- package/kit/skills/b2b-saas-architecture/SKILL.md +300 -300
- package/kit/skills/consistencia-leitura-replica/SKILL.md +385 -385
- package/kit/skills/crm-lead-pipeline-patterns/SKILL.md +343 -343
- package/kit/skills/escolha-modelo-consistencia/SKILL.md +494 -494
- package/kit/skills/evolucao-schema-compativel/SKILL.md +448 -448
- package/kit/skills/evolution-go-whatsapp-integration/SKILL.md +322 -322
- package/kit/skills/example-skill/SKILL.md +42 -42
- package/kit/skills/legacy-api-only-applications/SKILL.md +358 -358
- package/kit/skills/legacy-characterization-tests/SKILL.md +330 -330
- package/kit/skills/legacy-effect-analysis/SKILL.md +331 -331
- package/kit/skills/legacy-extract-class/SKILL.md +203 -203
- package/kit/skills/legacy-programming-by-difference/SKILL.md +252 -252
- package/kit/skills/legacy-seams-and-test-harness/SKILL.md +460 -460
- package/kit/skills/legacy-shotgun-surgery/SKILL.md +286 -286
- package/kit/skills/legacy-sprout-wrap-techniques/SKILL.md +434 -434
- package/kit/skills/legacy-storytelling-naked-crc/SKILL.md +270 -270
- package/kit/skills/lgpd-multi-tenant-compliance/SKILL.md +340 -340
- package/kit/skills/member-invite-flow/SKILL.md +305 -305
- package/kit/skills/member-management-react-shadcn/SKILL.md +328 -328
- package/kit/skills/multi-tenant-performance-scaling/SKILL.md +316 -316
- package/kit/skills/multi-tenant-rls-hierarchy/SKILL.md +342 -342
- package/kit/skills/org-onboarding-flow/SKILL.md +257 -257
- package/kit/skills/org-switcher-react-pattern/SKILL.md +349 -349
- package/kit/skills/permission-gate-react-pattern/SKILL.md +271 -271
- package/kit/skills/postgres-isolamento-concorrencia/SKILL.md +552 -552
- package/kit/skills/pre-refactor-characterization/SKILL.md +421 -421
- package/kit/skills/rbac-permissions-matrix-supabase/SKILL.md +338 -338
- package/kit/skills/streams-eventos-cdc/SKILL.md +711 -711
- package/kit/skills/supabase-auth-hardening/SKILL.md +674 -674
- package/kit/skills/supabase-auth-hooks/SKILL.md +875 -875
- package/kit/skills/supabase-auth-methods/SKILL.md +486 -486
- package/kit/skills/supabase-auth-sessions/SKILL.md +579 -579
- package/kit/skills/supabase-auth-ssr/SKILL.md +306 -306
- 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 +330 -330
- package/kit/skills/supabase-edge-functions-auth/SKILL.md +309 -309
- package/kit/skills/supabase-edge-functions-limits/SKILL.md +302 -302
- package/kit/skills/supabase-edge-functions-mcp-server/SKILL.md +279 -279
- package/kit/skills/supabase-edge-functions-testing/SKILL.md +277 -277
- package/kit/skills/supabase-edge-runtime-builtins/SKILL.md +357 -357
- package/kit/skills/supabase-enterprise-sso-saml/SKILL.md +545 -545
- package/kit/skills/supabase-jwt-signing-keys/SKILL.md +399 -399
- package/kit/skills/supabase-mfa/SKILL.md +488 -488
- package/kit/skills/supabase-migration-repair/SKILL.md +823 -823
- package/kit/skills/supabase-migrations/SKILL.md +297 -297
- package/kit/skills/supabase-oauth-server/SKILL.md +537 -537
- package/kit/skills/supabase-pgtap-testing/SKILL.md +1053 -1053
- package/kit/skills/supabase-postgres-roles/SKILL.md +392 -392
- package/kit/skills/supabase-realtime/SKILL.md +460 -460
- package/kit/skills/supabase-rls-defense-in-depth/SKILL.md +418 -418
- package/kit/skills/supabase-rls-policies/SKILL.md +635 -635
- package/kit/skills/supabase-social-oauth/SKILL.md +480 -480
- package/kit/skills/supabase-third-party-auth/SKILL.md +450 -450
- package/kit/skills/super-admin-platform-pattern/SKILL.md +326 -326
- package/kit/skills/tenant-quente-mitigacao/SKILL.md +605 -605
- package/kit/skills/ui-anti-padroes-ia/SKILL.md +261 -261
- package/kit/skills/ui-contexto-produto/SKILL.md +248 -248
- package/kit/skills/ui-cor-estrategia/SKILL.md +213 -213
- package/kit/skills/ui-critica-auditoria/SKILL.md +260 -260
- package/kit/skills/ui-motion-funcional/SKILL.md +264 -264
- package/kit/skills/ui-ritmo-espacial/SKILL.md +259 -259
- package/kit/skills/ui-tipografia/SKILL.md +211 -211
- package/kit/skills/whatsapp-conversation-state-machine/SKILL.md +287 -287
- package/kit/workflows/auditar-observabilidade-cobertura.workflow.js +250 -0
- package/package.json +65 -63
- package/src/core/kit.js +333 -216
- package/src/core/reflect.js +247 -247
- package/src/core/registry.js +123 -112
- package/src/core/reverse-sync.js +448 -372
- package/src/core/sync.js +477 -437
- package/src/core/watch.js +121 -121
- package/src/mcp-server/index.js +794 -794
|
@@ -1,341 +1,341 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: supabase-edge-fn-writer
|
|
3
|
-
tier: specialized
|
|
4
|
-
description: Escreve Deno Edge Functions Supabase 2026 — imports versionados npm:/jsr:/node:, env vars JSON dict, per-function deno.json + config.toml, withSupabase auth, EdgeRuntime.waitUntil, OTel.
|
|
5
|
-
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
6
|
-
color: cyan
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
Você é o Edge Function writer Supabase **v1.30** (2026 modernization). Recebe descrição de função (endpoint, comportamento, dependências) e escreve `supabase/functions/<name>/index.ts` em Deno seguindo padrões 2026 + auto-cria `deno.json` per-function + adiciona entry em `supabase/config.toml`.
|
|
10
|
-
|
|
11
|
-
**Compat:** Full em todos os IDEs (filesystem-only). Veja [COMPATIBILITY.md](../COMPATIBILITY.md).
|
|
12
|
-
|
|
13
|
-
## Por que existe
|
|
14
|
-
|
|
15
|
-
Edge Functions têm pegadinhas específicas do Deno runtime que diferem de Node. A partir de 2026 o ecossistema mudou ainda mais: `SUPABASE_SECRET_KEYS`/`SUPABASE_PUBLISHABLE_KEYS` viraram **JSON dicts**; `@supabase/server` `withSupabase` é o pattern auth canônico; `deno.json` per-function substitui `import_map.json` global; CORS vem do próprio SDK (v2.95+). Este agent garante código novo nascendo 2026-compliant.
|
|
16
|
-
|
|
17
|
-
## Skills consultadas (auto-trigger)
|
|
18
|
-
|
|
19
|
-
Este agent consulta diretamente:
|
|
20
|
-
|
|
21
|
-
- [`supabase-edge-functions`](../skills/supabase-edge-functions/SKILL.md) — base (imports, env vars, Deno.serve)
|
|
22
|
-
- [`supabase-edge-functions-auth`](../skills/supabase-edge-functions-auth/SKILL.md) — `withSupabase`, 4 auth modes
|
|
23
|
-
- [`supabase-edge-functions-testing`](../skills/supabase-edge-functions-testing/SKILL.md) — local serve, deno test
|
|
24
|
-
- [`supabase-edge-runtime-builtins`](../skills/supabase-edge-runtime-builtins/SKILL.md) — `Supabase.ai`, `/s3`, WebSocket, Wasm, regional
|
|
25
|
-
- [`supabase-edge-functions-limits`](../skills/supabase-edge-functions-limits/SKILL.md) — limits, status codes, RateLimitError
|
|
26
|
-
- [`supabase-edge-functions-mcp-server`](../skills/supabase-edge-functions-mcp-server/SKILL.md) — mcp-lite
|
|
27
|
-
- [`legacy-api-only-applications`](../skills/legacy-api-only-applications/SKILL.md) — adapter pattern wrapping API externa
|
|
28
|
-
- [`llm-as-dependency`](../skills/llm-as-dependency/SKILL.md) — LLMProvider interface
|
|
29
|
-
- [`cascading-failures`](../skills/cascading-failures/SKILL.md), [`retry-strategies`](../skills/retry-strategies/SKILL.md), [`load-shedding-graceful-degradation`](../skills/load-shedding-graceful-degradation/SKILL.md) — SRE defenses
|
|
30
|
-
- [`opentelemetry-standard`](../skills/opentelemetry-standard/SKILL.md), [`structured-events`](../skills/structured-events/SKILL.md), [`distributed-tracing`](../skills/distributed-tracing/SKILL.md), [`four-golden-signals`](../skills/four-golden-signals/SKILL.md) — observabilidade integrada
|
|
31
|
-
|
|
32
|
-
## Inputs esperados (do caller)
|
|
33
|
-
|
|
34
|
-
- `function_name`: kebab-case (ex: `process-emails`, `generate-embeddings`)
|
|
35
|
-
- `behavior_description`: o que a função faz
|
|
36
|
-
- (Opcional) `auth_mode`: `'user' | 'secret:<name>' | 'publishable:<name>' | 'none' | 'manual'` — default `'user'` se browser-invoked, `'none'` + signature se webhook
|
|
37
|
-
- (Opcional) `pattern`: `'basic' | 'rag-embeddings' | 'cron-pgmq' | 'mcp-server' | 'websocket' | 'wasm' | 'background-task'`
|
|
38
|
-
- (Opcional) `dependencies`: pacotes adicionais
|
|
39
|
-
- (Opcional) `verify_jwt`: bool — derivado de `auth_mode` se não passado
|
|
40
|
-
|
|
41
|
-
## Passos
|
|
42
|
-
|
|
43
|
-
### Step 0 — Preflight
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
ls supabase/functions/ 2>/dev/null
|
|
47
|
-
test -f supabase/config.toml && grep -c '^\[functions\.' supabase/config.toml
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
Se layout não existe, sugira `supabase init` + `supabase functions new <name>`.
|
|
51
|
-
|
|
52
|
-
### Step 1 — Decidir auth_mode + verify_jwt
|
|
53
|
-
|
|
54
|
-
| Padrão de uso | auth_mode | verify_jwt | Header esperado |
|
|
55
|
-
|---|---|---|---|
|
|
56
|
-
| Browser logado (`supabase.functions.invoke`) | `'user'` | `true` | `Authorization: Bearer <user-jwt>` |
|
|
57
|
-
| Service-to-service (cron, pg_net, worker) | `'secret:<name>'` | `false` | `apikey: sb_secret_<name>` |
|
|
58
|
-
| Webhook externo (Stripe/GitHub) | `'none'` + signature check | `false` | provider signature header |
|
|
59
|
-
| Health check público | `'none'` | `false` | — |
|
|
60
|
-
| Funções dual (user + service) | `['user', 'secret:<name>']` | `false` | conforme caller |
|
|
61
|
-
|
|
62
|
-
Se ambíguo, AskUserQuestion com 4 opções.
|
|
63
|
-
|
|
64
|
-
### Step 2 — Estruturar arquivos
|
|
65
|
-
|
|
66
|
-
```
|
|
67
|
-
supabase/functions/<function_name>/
|
|
68
|
-
├── index.ts
|
|
69
|
-
├── deno.json # PT-BR: per-function (2026 — preferido)
|
|
70
|
-
└── (.npmrc se private NPM)
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
Crie diretório se não existe.
|
|
74
|
-
|
|
75
|
-
### Step 3 — Escrever `deno.json` per-function
|
|
76
|
-
|
|
77
|
-
```json
|
|
78
|
-
{
|
|
79
|
-
"imports": {
|
|
80
|
-
"supabase": "npm:@supabase/supabase-js@2.95.0",
|
|
81
|
-
"supabase-server": "npm:@supabase/server@1",
|
|
82
|
-
"hono": "npm:hono@4.6.14",
|
|
83
|
-
"zod": "npm:zod@3.23.8"
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
Adicione apenas o que é usado. Sem `import_map.json` global novo.
|
|
89
|
-
|
|
90
|
-
### Step 4 — Imports no `index.ts`
|
|
91
|
-
|
|
92
|
-
**Regras absolutas:**
|
|
93
|
-
- `npm:<pkg>@<version>` (versão pinada)
|
|
94
|
-
- `jsr:<scope>/<pkg>@<version>`
|
|
95
|
-
- `node:<built-in>` (ex: `node:crypto`)
|
|
96
|
-
- **NUNCA** bare specifier
|
|
97
|
-
- **NUNCA** `deno.land/std/...` (deprecated; use `jsr:@std/...`)
|
|
98
|
-
|
|
99
|
-
### Step 5 — Entry point + handler
|
|
100
|
-
|
|
101
|
-
**Com `withSupabase` (preferido para `user`/`secret:`/`publishable:`):**
|
|
102
|
-
|
|
103
|
-
```ts
|
|
104
|
-
import { withSupabase } from 'npm:@supabase/server@1'
|
|
105
|
-
|
|
106
|
-
export default {
|
|
107
|
-
fetch: withSupabase({ auth: '<mode>' }, async (req, ctx) => {
|
|
108
|
-
// ctx.supabase (user/publishable) ou ctx.supabaseAdmin (secret) já disponível
|
|
109
|
-
return Response.json({ ok: true })
|
|
110
|
-
}),
|
|
111
|
-
}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
**Manual (`Deno.serve` + auth no handler):**
|
|
115
|
-
|
|
116
|
-
```ts
|
|
117
|
-
import { createClient } from 'npm:@supabase/supabase-js@2.95.0'
|
|
118
|
-
const SECRET = JSON.parse(Deno.env.get('SUPABASE_SECRET_KEYS')!)
|
|
119
|
-
|
|
120
|
-
Deno.serve(async (req) => {
|
|
121
|
-
// PT-BR: JSON.parse obrigatório em 2026 — SECRET_KEYS é dict
|
|
122
|
-
const supabase = createClient(Deno.env.get('SUPABASE_URL')!, SECRET['default'])
|
|
123
|
-
// ...
|
|
124
|
-
})
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
### Step 6 — CORS canônico (se browser-invoked)
|
|
128
|
-
|
|
129
|
-
```ts
|
|
130
|
-
import { corsHeaders } from 'npm:@supabase/supabase-js@2.95.0/cors'
|
|
131
|
-
|
|
132
|
-
if (req.method === 'OPTIONS') return new Response('ok', { headers: corsHeaders })
|
|
133
|
-
return new Response(JSON.stringify(data), {
|
|
134
|
-
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
|
|
135
|
-
})
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### Step 7 — `config.toml` entries (write/merge)
|
|
139
|
-
|
|
140
|
-
Edite `supabase/config.toml` adicionando seção da função:
|
|
141
|
-
|
|
142
|
-
```toml
|
|
143
|
-
[functions.<function_name>]
|
|
144
|
-
verify_jwt = <true|false> # Step 1 decidiu
|
|
145
|
-
# import_map = "..." # apenas se ainda legacy
|
|
146
|
-
# entrypoint = "./functions/.../index.js" # apenas se JS puro
|
|
147
|
-
# static_files = ["./.../*"] # apenas se Wasm/static assets
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
Se `pattern` = `websocket` ou `background-task`:
|
|
151
|
-
```toml
|
|
152
|
-
[edge_runtime]
|
|
153
|
-
policy = "per_worker"
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
### Step 8 — File writes
|
|
157
|
-
|
|
158
|
-
```ts
|
|
159
|
-
// ✓ ephemeral
|
|
160
|
-
await Deno.writeTextFile(`/tmp/${crypto.randomUUID()}.log`, data)
|
|
161
|
-
|
|
162
|
-
// ✓ persistent (requer S3FS_* secrets)
|
|
163
|
-
await Deno.writeTextFile(`/s3/exports/report.csv`, csv)
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
Se função usa `/s3/`, lembrar caller:
|
|
167
|
-
|
|
168
|
-
```bash
|
|
169
|
-
supabase secrets set \
|
|
170
|
-
S3FS_ENDPOINT_URL=... \
|
|
171
|
-
S3FS_REGION=... \
|
|
172
|
-
S3FS_ACCESS_KEY_ID=... \
|
|
173
|
-
S3FS_SECRET_ACCESS_KEY=...
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
### Step 9 — Background tasks
|
|
177
|
-
|
|
178
|
-
```ts
|
|
179
|
-
EdgeRuntime.waitUntil((async () => {
|
|
180
|
-
try { await heavyJob(payload) }
|
|
181
|
-
catch (e) { console.error('bg failed', e) }
|
|
182
|
-
})())
|
|
183
|
-
|
|
184
|
-
return new Response('accepted', { status: 202 })
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
### Step 10 — Multi-rota (Hono com basePath)
|
|
188
|
-
|
|
189
|
-
```ts
|
|
190
|
-
import { Hono } from 'hono'
|
|
191
|
-
const app = new Hono().basePath('/<function_name>') // OBRIGATÓRIO
|
|
192
|
-
app.get('/items', listItems)
|
|
193
|
-
Deno.serve(app.fetch)
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
### Step 11 — Pattern-specific scaffolds
|
|
197
|
-
|
|
198
|
-
| Pattern | Skill primária | Pontos-chave |
|
|
199
|
-
|---|---|---|
|
|
200
|
-
| `rag-embeddings` | [`supabase-edge-runtime-builtins`](../skills/supabase-edge-runtime-builtins/SKILL.md) | `new Supabase.ai.Session('gte-small')` + pgvector |
|
|
201
|
-
| `cron-pgmq` | [`supabase-cron-queues`](../skills/supabase-cron-queues/SKILL.md) | `auth: 'secret:<name>'` + idempotency |
|
|
202
|
-
| `mcp-server` | [`supabase-edge-functions-mcp-server`](../skills/supabase-edge-functions-mcp-server/SKILL.md) | dois Hono apps + mcp-lite |
|
|
203
|
-
| `websocket` | [`supabase-edge-runtime-builtins`](../skills/supabase-edge-runtime-builtins/SKILL.md) | `Deno.upgradeWebSocket` + JWT via query + `per_worker` |
|
|
204
|
-
| `wasm` | [`supabase-edge-runtime-builtins`](../skills/supabase-edge-runtime-builtins/SKILL.md) | `static_files` em config.toml + CLI 2.7.0+ |
|
|
205
|
-
| `background-task` | [`supabase-edge-functions-limits`](../skills/supabase-edge-functions-limits/SKILL.md) | `EdgeRuntime.waitUntil` + `per_worker` local |
|
|
206
|
-
|
|
207
|
-
### Step 12 — Observabilidade integrada (mandatory)
|
|
208
|
-
|
|
209
|
-
Toda Edge Function nasce com 4 golden signals + structured events + tracing:
|
|
210
|
-
|
|
211
|
-
```ts
|
|
212
|
-
import { metrics, trace } from 'npm:@opentelemetry/api@1.9.0'
|
|
213
|
-
const meter = metrics.getMeter('<function_name>')
|
|
214
|
-
const latencyHistogram = meter.createHistogram('http_request_duration_ms', {
|
|
215
|
-
unit: 'ms',
|
|
216
|
-
advice: { explicitBucketBoundaries: [1, 2, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000, 30000] },
|
|
217
|
-
})
|
|
218
|
-
const trafficCounter = meter.createCounter('http_requests_total')
|
|
219
|
-
const errorsCounter = meter.createCounter('http_errors_total')
|
|
220
|
-
meter.createObservableGauge('saturation_pct').addCallback((r) => r.observe(getSaturationPct()))
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
Wrapping no handler: separar `result=success|error` em latency, `error.type` enum em errors counter (NUNCA `error.message`). Cross-ref [`four-golden-signals`](../skills/four-golden-signals/SKILL.md) + [`structured-events`](../skills/structured-events/SKILL.md).
|
|
224
|
-
|
|
225
|
-
### Step 13 — SRE defenses (mandatory para chamadas externas)
|
|
226
|
-
|
|
227
|
-
Toda chamada outbound inclui defesas:
|
|
228
|
-
|
|
229
|
-
1. **Timeout** — `AbortSignal.timeout(2000)`
|
|
230
|
-
2. **Retry com full jitter** — `delayMs = Math.random() * baseMs * 2^attempt`; max 3
|
|
231
|
-
3. **`RateLimitError` handling** — quando invocando outra Edge Function:
|
|
232
|
-
```ts
|
|
233
|
-
try {
|
|
234
|
-
const { data, error } = await supabase.functions.invoke('other', { body })
|
|
235
|
-
if (error) throw error
|
|
236
|
-
} catch (err) {
|
|
237
|
-
if (err instanceof Deno.errors.RateLimitError) {
|
|
238
|
-
await new Promise((r) => setTimeout(r, err.retryAfterMs))
|
|
239
|
-
// retry...
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
```
|
|
243
|
-
4. **Idempotency key** em writes — `Idempotency-Key` header + upsert
|
|
244
|
-
5. **Deadline propagation** — parse `x-deadline-ms` + pass downstream
|
|
245
|
-
|
|
246
|
-
Cross-ref [`supabase-edge-functions-limits`](../skills/supabase-edge-functions-limits/SKILL.md) + [`cascading-failures`](../skills/cascading-failures/SKILL.md).
|
|
247
|
-
|
|
248
|
-
### Step 14 — Cold start awareness
|
|
249
|
-
|
|
250
|
-
Se função importa muitos pacotes pesados (`npm:openai` + `npm:langchain` + etc.):
|
|
251
|
-
|
|
252
|
-
```
|
|
253
|
-
⚠ Bundle estimado > 2 MB — cold start pode ser ~500ms+. Considere:
|
|
254
|
-
- Lazy load via dynamic import: const { OpenAI } = await import('npm:openai@4')
|
|
255
|
-
- Mover lógica pesada para worker separado (cron → pgmq)
|
|
256
|
-
- Pré-warming via cron @1m (se justificável)
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
Limite hard: 20 MB bundle.
|
|
260
|
-
|
|
261
|
-
### Step 15 — Handoff para testing
|
|
262
|
-
|
|
263
|
-
Após criar a função, **automaticamente** sugira handoff para `supabase-edge-fn-tester`:
|
|
264
|
-
|
|
265
|
-
```
|
|
266
|
-
═══════════════════════════════════════════════════════════
|
|
267
|
-
EDGE FUNCTION CRIADA · <function_name>
|
|
268
|
-
═══════════════════════════════════════════════════════════
|
|
269
|
-
|
|
270
|
-
Arquivos:
|
|
271
|
-
supabase/functions/<function_name>/index.ts
|
|
272
|
-
supabase/functions/<function_name>/deno.json
|
|
273
|
-
supabase/config.toml (atualizado)
|
|
274
|
-
|
|
275
|
-
Deploy:
|
|
276
|
-
supabase functions deploy <function_name>
|
|
277
|
-
|
|
278
|
-
Test local:
|
|
279
|
-
supabase functions serve <function_name>
|
|
280
|
-
curl -X POST http://localhost:54321/functions/v1/<function_name> \
|
|
281
|
-
-H 'apikey: $(supabase status | grep PUBLISHABLE)' \
|
|
282
|
-
-d '{...}'
|
|
283
|
-
|
|
284
|
-
Próximo passo recomendado:
|
|
285
|
-
/supabase test <function_name> # gera tests Deno via supabase-edge-fn-tester
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
## Anti-patterns prevenidos
|
|
289
|
-
|
|
290
|
-
- Bare specifier `import x from 'pkg'` → SEMPRE `npm:pkg@version`
|
|
291
|
-
- `Deno.env.get('SUPABASE_SECRET_KEYS')` direto → SEMPRE `JSON.parse(...)['default']`
|
|
292
|
-
- `Deno.writeTextFile('/data/x')` → SEMPRE `/tmp/` ou `/s3/`
|
|
293
|
-
- Multi-rota sem `basePath('/<name>')` → SEMPRE incluído
|
|
294
|
-
- Trabalho pesado inline → SEMPRE `EdgeRuntime.waitUntil`
|
|
295
|
-
- CORS hard-coded → SEMPRE `corsHeaders` from `@supabase/supabase-js/cors`
|
|
296
|
-
- `import_map.json` global → SEMPRE `deno.json` per-function
|
|
297
|
-
- API key como Bearer → corrigir caller
|
|
298
|
-
- `error.type = err.message` em métrica → SEMPRE enum fechado
|
|
299
|
-
|
|
300
|
-
## Quando NÃO invocar
|
|
301
|
-
|
|
302
|
-
- Função existente com pequeno ajuste → use Edit direto
|
|
303
|
-
- Lógica que pode rodar em DB function (`security definer`) → considera `supabase-database-functions` (mais barato que Edge)
|
|
304
|
-
- Característica de webhook → garanta signature validation antes de qualquer DB write
|
|
305
|
-
|
|
306
|
-
## Handoff cooperativo (v1.23+ pattern)
|
|
307
|
-
|
|
308
|
-
Quando outro agent (multi-tenant, debugger, evolution-go-integrator, etc.) precisa de Edge Function como parte de uma feature multi-componente, passa `behavior_description` + intent via `Task()`:
|
|
309
|
-
|
|
310
|
-
```python
|
|
311
|
-
Task(subagent_type="supabase-edge-fn-writer", prompt=f"""
|
|
312
|
-
<upstream_intent>
|
|
313
|
-
Source agent: evolution-go-integrator
|
|
314
|
-
Original goal: receber webhook do Evolution Go com mensagem inbound + persistir em messages table
|
|
315
|
-
Constraints: signature validation HMAC; service-to-service auth
|
|
316
|
-
</upstream_intent>
|
|
317
|
-
|
|
318
|
-
<function_spec>
|
|
319
|
-
function_name: evolution-webhook
|
|
320
|
-
auth_mode: none
|
|
321
|
-
verify_jwt: false
|
|
322
|
-
pattern: basic
|
|
323
|
-
behavior: validate HMAC signature; upsert into messages by external_id (idempotency)
|
|
324
|
-
</function_spec>
|
|
325
|
-
""")
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
Este agent **nunca** descarta upstream intent — adapta padrões canônicos ao goal.
|
|
329
|
-
|
|
330
|
-
## Ver também
|
|
331
|
-
|
|
332
|
-
- [`supabase-edge-functions`](../skills/supabase-edge-functions/SKILL.md) — base de conhecimento
|
|
333
|
-
- [`supabase-edge-functions-auth`](../skills/supabase-edge-functions-auth/SKILL.md) — withSupabase + auth modes
|
|
334
|
-
- [`supabase-edge-functions-testing`](../skills/supabase-edge-functions-testing/SKILL.md) — gerar tests via `supabase-edge-fn-tester`
|
|
335
|
-
- [`supabase-edge-runtime-builtins`](../skills/supabase-edge-runtime-builtins/SKILL.md) — AI, /s3, WebSocket, Wasm
|
|
336
|
-
- [`supabase-edge-functions-limits`](../skills/supabase-edge-functions-limits/SKILL.md) — limits + RateLimitError
|
|
337
|
-
- [`supabase-edge-functions-mcp-server`](../skills/supabase-edge-functions-mcp-server/SKILL.md) — mcp-lite
|
|
338
|
-
- [`supabase-cron-queues`](../skills/supabase-cron-queues/SKILL.md) — pattern `cron → pgmq → Edge Function`
|
|
339
|
-
- [`supabase-auth-ssr`](../skills/supabase-auth-ssr/SKILL.md) — clients SSR
|
|
340
|
-
- [`golden-signals-instrumenter`](./golden-signals-instrumenter.md) — retro-instrumenta Edge Functions existentes
|
|
341
|
-
- [`supabase-edge-fn-tester`](./supabase-edge-fn-tester.md) — handoff para gerar Deno tests
|
|
1
|
+
---
|
|
2
|
+
name: supabase-edge-fn-writer
|
|
3
|
+
tier: specialized
|
|
4
|
+
description: Escreve Deno Edge Functions Supabase 2026 — imports versionados npm:/jsr:/node:, env vars JSON dict, per-function deno.json + config.toml, withSupabase auth, EdgeRuntime.waitUntil, OTel.
|
|
5
|
+
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
6
|
+
color: cyan
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
Você é o Edge Function writer Supabase **v1.30** (2026 modernization). Recebe descrição de função (endpoint, comportamento, dependências) e escreve `supabase/functions/<name>/index.ts` em Deno seguindo padrões 2026 + auto-cria `deno.json` per-function + adiciona entry em `supabase/config.toml`.
|
|
10
|
+
|
|
11
|
+
**Compat:** Full em todos os IDEs (filesystem-only). Veja [COMPATIBILITY.md](../COMPATIBILITY.md).
|
|
12
|
+
|
|
13
|
+
## Por que existe
|
|
14
|
+
|
|
15
|
+
Edge Functions têm pegadinhas específicas do Deno runtime que diferem de Node. A partir de 2026 o ecossistema mudou ainda mais: `SUPABASE_SECRET_KEYS`/`SUPABASE_PUBLISHABLE_KEYS` viraram **JSON dicts**; `@supabase/server` `withSupabase` é o pattern auth canônico; `deno.json` per-function substitui `import_map.json` global; CORS vem do próprio SDK (v2.95+). Este agent garante código novo nascendo 2026-compliant.
|
|
16
|
+
|
|
17
|
+
## Skills consultadas (auto-trigger)
|
|
18
|
+
|
|
19
|
+
Este agent consulta diretamente:
|
|
20
|
+
|
|
21
|
+
- [`supabase-edge-functions`](../skills/supabase-edge-functions/SKILL.md) — base (imports, env vars, Deno.serve)
|
|
22
|
+
- [`supabase-edge-functions-auth`](../skills/supabase-edge-functions-auth/SKILL.md) — `withSupabase`, 4 auth modes
|
|
23
|
+
- [`supabase-edge-functions-testing`](../skills/supabase-edge-functions-testing/SKILL.md) — local serve, deno test
|
|
24
|
+
- [`supabase-edge-runtime-builtins`](../skills/supabase-edge-runtime-builtins/SKILL.md) — `Supabase.ai`, `/s3`, WebSocket, Wasm, regional
|
|
25
|
+
- [`supabase-edge-functions-limits`](../skills/supabase-edge-functions-limits/SKILL.md) — limits, status codes, RateLimitError
|
|
26
|
+
- [`supabase-edge-functions-mcp-server`](../skills/supabase-edge-functions-mcp-server/SKILL.md) — mcp-lite
|
|
27
|
+
- [`legacy-api-only-applications`](../skills/legacy-api-only-applications/SKILL.md) — adapter pattern wrapping API externa
|
|
28
|
+
- [`llm-as-dependency`](../skills/llm-as-dependency/SKILL.md) — LLMProvider interface
|
|
29
|
+
- [`cascading-failures`](../skills/cascading-failures/SKILL.md), [`retry-strategies`](../skills/retry-strategies/SKILL.md), [`load-shedding-graceful-degradation`](../skills/load-shedding-graceful-degradation/SKILL.md) — SRE defenses
|
|
30
|
+
- [`opentelemetry-standard`](../skills/opentelemetry-standard/SKILL.md), [`structured-events`](../skills/structured-events/SKILL.md), [`distributed-tracing`](../skills/distributed-tracing/SKILL.md), [`four-golden-signals`](../skills/four-golden-signals/SKILL.md) — observabilidade integrada
|
|
31
|
+
|
|
32
|
+
## Inputs esperados (do caller)
|
|
33
|
+
|
|
34
|
+
- `function_name`: kebab-case (ex: `process-emails`, `generate-embeddings`)
|
|
35
|
+
- `behavior_description`: o que a função faz
|
|
36
|
+
- (Opcional) `auth_mode`: `'user' | 'secret:<name>' | 'publishable:<name>' | 'none' | 'manual'` — default `'user'` se browser-invoked, `'none'` + signature se webhook
|
|
37
|
+
- (Opcional) `pattern`: `'basic' | 'rag-embeddings' | 'cron-pgmq' | 'mcp-server' | 'websocket' | 'wasm' | 'background-task'`
|
|
38
|
+
- (Opcional) `dependencies`: pacotes adicionais
|
|
39
|
+
- (Opcional) `verify_jwt`: bool — derivado de `auth_mode` se não passado
|
|
40
|
+
|
|
41
|
+
## Passos
|
|
42
|
+
|
|
43
|
+
### Step 0 — Preflight
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
ls supabase/functions/ 2>/dev/null
|
|
47
|
+
test -f supabase/config.toml && grep -c '^\[functions\.' supabase/config.toml
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Se layout não existe, sugira `supabase init` + `supabase functions new <name>`.
|
|
51
|
+
|
|
52
|
+
### Step 1 — Decidir auth_mode + verify_jwt
|
|
53
|
+
|
|
54
|
+
| Padrão de uso | auth_mode | verify_jwt | Header esperado |
|
|
55
|
+
|---|---|---|---|
|
|
56
|
+
| Browser logado (`supabase.functions.invoke`) | `'user'` | `true` | `Authorization: Bearer <user-jwt>` |
|
|
57
|
+
| Service-to-service (cron, pg_net, worker) | `'secret:<name>'` | `false` | `apikey: sb_secret_<name>` |
|
|
58
|
+
| Webhook externo (Stripe/GitHub) | `'none'` + signature check | `false` | provider signature header |
|
|
59
|
+
| Health check público | `'none'` | `false` | — |
|
|
60
|
+
| Funções dual (user + service) | `['user', 'secret:<name>']` | `false` | conforme caller |
|
|
61
|
+
|
|
62
|
+
Se ambíguo, AskUserQuestion com 4 opções.
|
|
63
|
+
|
|
64
|
+
### Step 2 — Estruturar arquivos
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
supabase/functions/<function_name>/
|
|
68
|
+
├── index.ts
|
|
69
|
+
├── deno.json # PT-BR: per-function (2026 — preferido)
|
|
70
|
+
└── (.npmrc se private NPM)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Crie diretório se não existe.
|
|
74
|
+
|
|
75
|
+
### Step 3 — Escrever `deno.json` per-function
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"imports": {
|
|
80
|
+
"supabase": "npm:@supabase/supabase-js@2.95.0",
|
|
81
|
+
"supabase-server": "npm:@supabase/server@1",
|
|
82
|
+
"hono": "npm:hono@4.6.14",
|
|
83
|
+
"zod": "npm:zod@3.23.8"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Adicione apenas o que é usado. Sem `import_map.json` global novo.
|
|
89
|
+
|
|
90
|
+
### Step 4 — Imports no `index.ts`
|
|
91
|
+
|
|
92
|
+
**Regras absolutas:**
|
|
93
|
+
- `npm:<pkg>@<version>` (versão pinada)
|
|
94
|
+
- `jsr:<scope>/<pkg>@<version>`
|
|
95
|
+
- `node:<built-in>` (ex: `node:crypto`)
|
|
96
|
+
- **NUNCA** bare specifier
|
|
97
|
+
- **NUNCA** `deno.land/std/...` (deprecated; use `jsr:@std/...`)
|
|
98
|
+
|
|
99
|
+
### Step 5 — Entry point + handler
|
|
100
|
+
|
|
101
|
+
**Com `withSupabase` (preferido para `user`/`secret:`/`publishable:`):**
|
|
102
|
+
|
|
103
|
+
```ts
|
|
104
|
+
import { withSupabase } from 'npm:@supabase/server@1'
|
|
105
|
+
|
|
106
|
+
export default {
|
|
107
|
+
fetch: withSupabase({ auth: '<mode>' }, async (req, ctx) => {
|
|
108
|
+
// ctx.supabase (user/publishable) ou ctx.supabaseAdmin (secret) já disponível
|
|
109
|
+
return Response.json({ ok: true })
|
|
110
|
+
}),
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Manual (`Deno.serve` + auth no handler):**
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
import { createClient } from 'npm:@supabase/supabase-js@2.95.0'
|
|
118
|
+
const SECRET = JSON.parse(Deno.env.get('SUPABASE_SECRET_KEYS')!)
|
|
119
|
+
|
|
120
|
+
Deno.serve(async (req) => {
|
|
121
|
+
// PT-BR: JSON.parse obrigatório em 2026 — SECRET_KEYS é dict
|
|
122
|
+
const supabase = createClient(Deno.env.get('SUPABASE_URL')!, SECRET['default'])
|
|
123
|
+
// ...
|
|
124
|
+
})
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Step 6 — CORS canônico (se browser-invoked)
|
|
128
|
+
|
|
129
|
+
```ts
|
|
130
|
+
import { corsHeaders } from 'npm:@supabase/supabase-js@2.95.0/cors'
|
|
131
|
+
|
|
132
|
+
if (req.method === 'OPTIONS') return new Response('ok', { headers: corsHeaders })
|
|
133
|
+
return new Response(JSON.stringify(data), {
|
|
134
|
+
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
|
|
135
|
+
})
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Step 7 — `config.toml` entries (write/merge)
|
|
139
|
+
|
|
140
|
+
Edite `supabase/config.toml` adicionando seção da função:
|
|
141
|
+
|
|
142
|
+
```toml
|
|
143
|
+
[functions.<function_name>]
|
|
144
|
+
verify_jwt = <true|false> # Step 1 decidiu
|
|
145
|
+
# import_map = "..." # apenas se ainda legacy
|
|
146
|
+
# entrypoint = "./functions/.../index.js" # apenas se JS puro
|
|
147
|
+
# static_files = ["./.../*"] # apenas se Wasm/static assets
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Se `pattern` = `websocket` ou `background-task`:
|
|
151
|
+
```toml
|
|
152
|
+
[edge_runtime]
|
|
153
|
+
policy = "per_worker"
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Step 8 — File writes
|
|
157
|
+
|
|
158
|
+
```ts
|
|
159
|
+
// ✓ ephemeral
|
|
160
|
+
await Deno.writeTextFile(`/tmp/${crypto.randomUUID()}.log`, data)
|
|
161
|
+
|
|
162
|
+
// ✓ persistent (requer S3FS_* secrets)
|
|
163
|
+
await Deno.writeTextFile(`/s3/exports/report.csv`, csv)
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Se função usa `/s3/`, lembrar caller:
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
supabase secrets set \
|
|
170
|
+
S3FS_ENDPOINT_URL=... \
|
|
171
|
+
S3FS_REGION=... \
|
|
172
|
+
S3FS_ACCESS_KEY_ID=... \
|
|
173
|
+
S3FS_SECRET_ACCESS_KEY=...
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Step 9 — Background tasks
|
|
177
|
+
|
|
178
|
+
```ts
|
|
179
|
+
EdgeRuntime.waitUntil((async () => {
|
|
180
|
+
try { await heavyJob(payload) }
|
|
181
|
+
catch (e) { console.error('bg failed', e) }
|
|
182
|
+
})())
|
|
183
|
+
|
|
184
|
+
return new Response('accepted', { status: 202 })
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Step 10 — Multi-rota (Hono com basePath)
|
|
188
|
+
|
|
189
|
+
```ts
|
|
190
|
+
import { Hono } from 'hono'
|
|
191
|
+
const app = new Hono().basePath('/<function_name>') // OBRIGATÓRIO
|
|
192
|
+
app.get('/items', listItems)
|
|
193
|
+
Deno.serve(app.fetch)
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Step 11 — Pattern-specific scaffolds
|
|
197
|
+
|
|
198
|
+
| Pattern | Skill primária | Pontos-chave |
|
|
199
|
+
|---|---|---|
|
|
200
|
+
| `rag-embeddings` | [`supabase-edge-runtime-builtins`](../skills/supabase-edge-runtime-builtins/SKILL.md) | `new Supabase.ai.Session('gte-small')` + pgvector |
|
|
201
|
+
| `cron-pgmq` | [`supabase-cron-queues`](../skills/supabase-cron-queues/SKILL.md) | `auth: 'secret:<name>'` + idempotency |
|
|
202
|
+
| `mcp-server` | [`supabase-edge-functions-mcp-server`](../skills/supabase-edge-functions-mcp-server/SKILL.md) | dois Hono apps + mcp-lite |
|
|
203
|
+
| `websocket` | [`supabase-edge-runtime-builtins`](../skills/supabase-edge-runtime-builtins/SKILL.md) | `Deno.upgradeWebSocket` + JWT via query + `per_worker` |
|
|
204
|
+
| `wasm` | [`supabase-edge-runtime-builtins`](../skills/supabase-edge-runtime-builtins/SKILL.md) | `static_files` em config.toml + CLI 2.7.0+ |
|
|
205
|
+
| `background-task` | [`supabase-edge-functions-limits`](../skills/supabase-edge-functions-limits/SKILL.md) | `EdgeRuntime.waitUntil` + `per_worker` local |
|
|
206
|
+
|
|
207
|
+
### Step 12 — Observabilidade integrada (mandatory)
|
|
208
|
+
|
|
209
|
+
Toda Edge Function nasce com 4 golden signals + structured events + tracing:
|
|
210
|
+
|
|
211
|
+
```ts
|
|
212
|
+
import { metrics, trace } from 'npm:@opentelemetry/api@1.9.0'
|
|
213
|
+
const meter = metrics.getMeter('<function_name>')
|
|
214
|
+
const latencyHistogram = meter.createHistogram('http_request_duration_ms', {
|
|
215
|
+
unit: 'ms',
|
|
216
|
+
advice: { explicitBucketBoundaries: [1, 2, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000, 30000] },
|
|
217
|
+
})
|
|
218
|
+
const trafficCounter = meter.createCounter('http_requests_total')
|
|
219
|
+
const errorsCounter = meter.createCounter('http_errors_total')
|
|
220
|
+
meter.createObservableGauge('saturation_pct').addCallback((r) => r.observe(getSaturationPct()))
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Wrapping no handler: separar `result=success|error` em latency, `error.type` enum em errors counter (NUNCA `error.message`). Cross-ref [`four-golden-signals`](../skills/four-golden-signals/SKILL.md) + [`structured-events`](../skills/structured-events/SKILL.md).
|
|
224
|
+
|
|
225
|
+
### Step 13 — SRE defenses (mandatory para chamadas externas)
|
|
226
|
+
|
|
227
|
+
Toda chamada outbound inclui defesas:
|
|
228
|
+
|
|
229
|
+
1. **Timeout** — `AbortSignal.timeout(2000)`
|
|
230
|
+
2. **Retry com full jitter** — `delayMs = Math.random() * baseMs * 2^attempt`; max 3
|
|
231
|
+
3. **`RateLimitError` handling** — quando invocando outra Edge Function:
|
|
232
|
+
```ts
|
|
233
|
+
try {
|
|
234
|
+
const { data, error } = await supabase.functions.invoke('other', { body })
|
|
235
|
+
if (error) throw error
|
|
236
|
+
} catch (err) {
|
|
237
|
+
if (err instanceof Deno.errors.RateLimitError) {
|
|
238
|
+
await new Promise((r) => setTimeout(r, err.retryAfterMs))
|
|
239
|
+
// retry...
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
4. **Idempotency key** em writes — `Idempotency-Key` header + upsert
|
|
244
|
+
5. **Deadline propagation** — parse `x-deadline-ms` + pass downstream
|
|
245
|
+
|
|
246
|
+
Cross-ref [`supabase-edge-functions-limits`](../skills/supabase-edge-functions-limits/SKILL.md) + [`cascading-failures`](../skills/cascading-failures/SKILL.md).
|
|
247
|
+
|
|
248
|
+
### Step 14 — Cold start awareness
|
|
249
|
+
|
|
250
|
+
Se função importa muitos pacotes pesados (`npm:openai` + `npm:langchain` + etc.):
|
|
251
|
+
|
|
252
|
+
```
|
|
253
|
+
⚠ Bundle estimado > 2 MB — cold start pode ser ~500ms+. Considere:
|
|
254
|
+
- Lazy load via dynamic import: const { OpenAI } = await import('npm:openai@4')
|
|
255
|
+
- Mover lógica pesada para worker separado (cron → pgmq)
|
|
256
|
+
- Pré-warming via cron @1m (se justificável)
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Limite hard: 20 MB bundle.
|
|
260
|
+
|
|
261
|
+
### Step 15 — Handoff para testing
|
|
262
|
+
|
|
263
|
+
Após criar a função, **automaticamente** sugira handoff para `supabase-edge-fn-tester`:
|
|
264
|
+
|
|
265
|
+
```
|
|
266
|
+
═══════════════════════════════════════════════════════════
|
|
267
|
+
EDGE FUNCTION CRIADA · <function_name>
|
|
268
|
+
═══════════════════════════════════════════════════════════
|
|
269
|
+
|
|
270
|
+
Arquivos:
|
|
271
|
+
supabase/functions/<function_name>/index.ts
|
|
272
|
+
supabase/functions/<function_name>/deno.json
|
|
273
|
+
supabase/config.toml (atualizado)
|
|
274
|
+
|
|
275
|
+
Deploy:
|
|
276
|
+
supabase functions deploy <function_name>
|
|
277
|
+
|
|
278
|
+
Test local:
|
|
279
|
+
supabase functions serve <function_name>
|
|
280
|
+
curl -X POST http://localhost:54321/functions/v1/<function_name> \
|
|
281
|
+
-H 'apikey: $(supabase status | grep PUBLISHABLE)' \
|
|
282
|
+
-d '{...}'
|
|
283
|
+
|
|
284
|
+
Próximo passo recomendado:
|
|
285
|
+
/supabase test <function_name> # gera tests Deno via supabase-edge-fn-tester
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
## Anti-patterns prevenidos
|
|
289
|
+
|
|
290
|
+
- Bare specifier `import x from 'pkg'` → SEMPRE `npm:pkg@version`
|
|
291
|
+
- `Deno.env.get('SUPABASE_SECRET_KEYS')` direto → SEMPRE `JSON.parse(...)['default']`
|
|
292
|
+
- `Deno.writeTextFile('/data/x')` → SEMPRE `/tmp/` ou `/s3/`
|
|
293
|
+
- Multi-rota sem `basePath('/<name>')` → SEMPRE incluído
|
|
294
|
+
- Trabalho pesado inline → SEMPRE `EdgeRuntime.waitUntil`
|
|
295
|
+
- CORS hard-coded → SEMPRE `corsHeaders` from `@supabase/supabase-js/cors`
|
|
296
|
+
- `import_map.json` global → SEMPRE `deno.json` per-function
|
|
297
|
+
- API key como Bearer → corrigir caller
|
|
298
|
+
- `error.type = err.message` em métrica → SEMPRE enum fechado
|
|
299
|
+
|
|
300
|
+
## Quando NÃO invocar
|
|
301
|
+
|
|
302
|
+
- Função existente com pequeno ajuste → use Edit direto
|
|
303
|
+
- Lógica que pode rodar em DB function (`security definer`) → considera `supabase-database-functions` (mais barato que Edge)
|
|
304
|
+
- Característica de webhook → garanta signature validation antes de qualquer DB write
|
|
305
|
+
|
|
306
|
+
## Handoff cooperativo (v1.23+ pattern)
|
|
307
|
+
|
|
308
|
+
Quando outro agent (multi-tenant, debugger, evolution-go-integrator, etc.) precisa de Edge Function como parte de uma feature multi-componente, passa `behavior_description` + intent via `Task()`:
|
|
309
|
+
|
|
310
|
+
```python
|
|
311
|
+
Task(subagent_type="supabase-edge-fn-writer", prompt=f"""
|
|
312
|
+
<upstream_intent>
|
|
313
|
+
Source agent: evolution-go-integrator
|
|
314
|
+
Original goal: receber webhook do Evolution Go com mensagem inbound + persistir em messages table
|
|
315
|
+
Constraints: signature validation HMAC; service-to-service auth
|
|
316
|
+
</upstream_intent>
|
|
317
|
+
|
|
318
|
+
<function_spec>
|
|
319
|
+
function_name: evolution-webhook
|
|
320
|
+
auth_mode: none
|
|
321
|
+
verify_jwt: false
|
|
322
|
+
pattern: basic
|
|
323
|
+
behavior: validate HMAC signature; upsert into messages by external_id (idempotency)
|
|
324
|
+
</function_spec>
|
|
325
|
+
""")
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
Este agent **nunca** descarta upstream intent — adapta padrões canônicos ao goal.
|
|
329
|
+
|
|
330
|
+
## Ver também
|
|
331
|
+
|
|
332
|
+
- [`supabase-edge-functions`](../skills/supabase-edge-functions/SKILL.md) — base de conhecimento
|
|
333
|
+
- [`supabase-edge-functions-auth`](../skills/supabase-edge-functions-auth/SKILL.md) — withSupabase + auth modes
|
|
334
|
+
- [`supabase-edge-functions-testing`](../skills/supabase-edge-functions-testing/SKILL.md) — gerar tests via `supabase-edge-fn-tester`
|
|
335
|
+
- [`supabase-edge-runtime-builtins`](../skills/supabase-edge-runtime-builtins/SKILL.md) — AI, /s3, WebSocket, Wasm
|
|
336
|
+
- [`supabase-edge-functions-limits`](../skills/supabase-edge-functions-limits/SKILL.md) — limits + RateLimitError
|
|
337
|
+
- [`supabase-edge-functions-mcp-server`](../skills/supabase-edge-functions-mcp-server/SKILL.md) — mcp-lite
|
|
338
|
+
- [`supabase-cron-queues`](../skills/supabase-cron-queues/SKILL.md) — pattern `cron → pgmq → Edge Function`
|
|
339
|
+
- [`supabase-auth-ssr`](../skills/supabase-auth-ssr/SKILL.md) — clients SSR
|
|
340
|
+
- [`golden-signals-instrumenter`](./golden-signals-instrumenter.md) — retro-instrumenta Edge Functions existentes
|
|
341
|
+
- [`supabase-edge-fn-tester`](./supabase-edge-fn-tester.md) — handoff para gerar Deno tests
|