opencode-starterkit 1.0.1
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/README.md +47 -0
- package/baseline/.env.example +196 -0
- package/baseline/.template-manifest.json +646 -0
- package/baseline/.version +1 -0
- package/baseline/AGENTS.md +410 -0
- package/baseline/AGENT_ALIGNMENT.md +564 -0
- package/baseline/README.md +79 -0
- package/baseline/agent/build.md +373 -0
- package/baseline/agent/explore.md +96 -0
- package/baseline/agent/general.md +186 -0
- package/baseline/agent/painter.md +74 -0
- package/baseline/agent/plan.md +435 -0
- package/baseline/agent/review.md +243 -0
- package/baseline/agent/runner.md +79 -0
- package/baseline/agent/scout.md +100 -0
- package/baseline/agent/vision.md +91 -0
- package/baseline/command/compound.md +143 -0
- package/baseline/command/create.md +213 -0
- package/baseline/command/design.md +112 -0
- package/baseline/command/handoff.md +147 -0
- package/baseline/command/init-context.md +273 -0
- package/baseline/command/init-user.md +105 -0
- package/baseline/command/init.md +117 -0
- package/baseline/command/lfg.md +170 -0
- package/baseline/command/plan.md +355 -0
- package/baseline/command/pr.md +161 -0
- package/baseline/command/research.md +125 -0
- package/baseline/command/resume.md +87 -0
- package/baseline/command/review-codebase.md +131 -0
- package/baseline/command/ship.md +342 -0
- package/baseline/command/start.md +158 -0
- package/baseline/command/status.md +117 -0
- package/baseline/command/ui-review.md +92 -0
- package/baseline/command/ui-slop-check.md +146 -0
- package/baseline/command/verify.md +160 -0
- package/baseline/context/README.md +29 -0
- package/baseline/dcp.jsonc +72 -0
- package/baseline/memory/README.md +89 -0
- package/baseline/memory/_templates/design.md +59 -0
- package/baseline/memory/_templates/prd.md +192 -0
- package/baseline/memory/_templates/project.md +58 -0
- package/baseline/memory/_templates/proposal.md +38 -0
- package/baseline/memory/_templates/roadmap.md +93 -0
- package/baseline/memory/_templates/state.md +89 -0
- package/baseline/memory/_templates/tasks.md +198 -0
- package/baseline/memory/_templates/tech-stack.md +85 -0
- package/baseline/memory/_templates/user.md +26 -0
- package/baseline/memory/project/gotchas.md +67 -0
- package/baseline/memory/project/project.md +92 -0
- package/baseline/memory/project/roadmap.md +142 -0
- package/baseline/memory/project/state.md +84 -0
- package/baseline/memory/project/tech-stack.md +53 -0
- package/baseline/memory/project/user.md +38 -0
- package/baseline/memory/research/benchmark-framework.md +162 -0
- package/baseline/memory/research/ccpm-analysis.md +334 -0
- package/baseline/memory/research/context-management-analysis.md +685 -0
- package/baseline/memory/research/effectiveness-audit.md +213 -0
- package/baseline/memory/research/opencode-mcp-bug-report.md +129 -0
- package/baseline/memory/research/openspec-analysis.md +226 -0
- package/baseline/memory/session-context.md +40 -0
- package/baseline/opencode.json +1431 -0
- package/baseline/opencode.json.tui-migration.bak +1380 -0
- package/baseline/package-lock.json +87 -0
- package/baseline/package.json +21 -0
- package/baseline/plans/1768385996691-silent-wizard.md +247 -0
- package/baseline/plans/1770006237537-mighty-otter.md +418 -0
- package/baseline/plans/1770006913647-glowing-forest.md +170 -0
- package/baseline/plans/1770013678126-witty-planet.md +278 -0
- package/baseline/plans/1770112267595-shiny-rocket.md +258 -0
- package/baseline/plans/swarm-protocol.md +123 -0
- package/baseline/plugin/README.md +70 -0
- package/baseline/plugin/copilot-auth.ts +607 -0
- package/baseline/plugin/lib/capture.ts +177 -0
- package/baseline/plugin/lib/context.ts +198 -0
- package/baseline/plugin/lib/curator.ts +234 -0
- package/baseline/plugin/lib/db/maintenance.ts +312 -0
- package/baseline/plugin/lib/db/observations.ts +299 -0
- package/baseline/plugin/lib/db/pipeline.ts +520 -0
- package/baseline/plugin/lib/db/schema.ts +356 -0
- package/baseline/plugin/lib/db/types.ts +211 -0
- package/baseline/plugin/lib/distill.ts +376 -0
- package/baseline/plugin/lib/inject.ts +126 -0
- package/baseline/plugin/lib/memory-admin-tools.ts +188 -0
- package/baseline/plugin/lib/memory-db.ts +58 -0
- package/baseline/plugin/lib/memory-helpers.ts +111 -0
- package/baseline/plugin/lib/memory-hooks.ts +195 -0
- package/baseline/plugin/lib/memory-tools.ts +341 -0
- package/baseline/plugin/lib/notify.ts +81 -0
- package/baseline/plugin/memory.ts +89 -0
- package/baseline/plugin/notification.ts.bak +64 -0
- package/baseline/plugin/package.json +7 -0
- package/baseline/plugin/sdk/copilot/chat/convert-to-openai-compatible-chat-messages.ts +178 -0
- package/baseline/plugin/sdk/copilot/chat/get-response-metadata.ts +15 -0
- package/baseline/plugin/sdk/copilot/chat/map-openai-compatible-finish-reason.ts +19 -0
- package/baseline/plugin/sdk/copilot/chat/openai-compatible-api-types.ts +72 -0
- package/baseline/plugin/sdk/copilot/chat/openai-compatible-chat-language-model.ts +833 -0
- package/baseline/plugin/sdk/copilot/chat/openai-compatible-chat-options.ts +30 -0
- package/baseline/plugin/sdk/copilot/chat/openai-compatible-metadata-extractor.ts +48 -0
- package/baseline/plugin/sdk/copilot/chat/openai-compatible-prepare-tools.ts +92 -0
- package/baseline/plugin/sdk/copilot/copilot-provider.ts +94 -0
- package/baseline/plugin/sdk/copilot/index.ts +5 -0
- package/baseline/plugin/sdk/copilot/openai-compatible-error.ts +30 -0
- package/baseline/plugin/sessions.ts +428 -0
- package/baseline/plugin/skill-mcp.ts +618 -0
- package/baseline/plugin/tsconfig.json +16 -0
- package/baseline/skill/accessibility-audit/SKILL.md +191 -0
- package/baseline/skill/agent-browser/SKILL.md +413 -0
- package/baseline/skill/agent-teams/SKILL.md +268 -0
- package/baseline/skill/augment-context-engine/SKILL.md +122 -0
- package/baseline/skill/augment-context-engine/mcp.json +6 -0
- package/baseline/skill/beads/SKILL.md +181 -0
- package/baseline/skill/beads/references/BEST_PRACTICES.md +27 -0
- package/baseline/skill/beads/references/BOUNDARIES.md +219 -0
- package/baseline/skill/beads/references/DEPENDENCIES.md +124 -0
- package/baseline/skill/beads/references/EXAMPLES.md +45 -0
- package/baseline/skill/beads/references/FILE_CLAIMING.md +101 -0
- package/baseline/skill/beads/references/GIT_SYNC.md +25 -0
- package/baseline/skill/beads/references/HIERARCHY.md +71 -0
- package/baseline/skill/beads/references/MULTI_AGENT.md +40 -0
- package/baseline/skill/beads/references/RESUMABILITY.md +177 -0
- package/baseline/skill/beads/references/SESSION_PROTOCOL.md +61 -0
- package/baseline/skill/beads/references/TASK_CREATION.md +38 -0
- package/baseline/skill/beads/references/TROUBLESHOOTING.md +38 -0
- package/baseline/skill/beads/references/WORKFLOWS.md +226 -0
- package/baseline/skill/beads-bridge/SKILL.md +321 -0
- package/baseline/skill/brainstorming/SKILL.md +114 -0
- package/baseline/skill/chrome-devtools/SKILL.md +76 -0
- package/baseline/skill/chrome-devtools/mcp.json +19 -0
- package/baseline/skill/cloudflare/SKILL.md +253 -0
- package/baseline/skill/cloudflare/references/agents-sdk/README.md +35 -0
- package/baseline/skill/cloudflare/references/agents-sdk/api.md +100 -0
- package/baseline/skill/cloudflare/references/agents-sdk/configuration.md +99 -0
- package/baseline/skill/cloudflare/references/agents-sdk/gotchas.md +59 -0
- package/baseline/skill/cloudflare/references/agents-sdk/patterns.md +89 -0
- package/baseline/skill/cloudflare/references/ai-gateway/README.md +695 -0
- package/baseline/skill/cloudflare/references/ai-search/README.md +14 -0
- package/baseline/skill/cloudflare/references/ai-search/api.md +38 -0
- package/baseline/skill/cloudflare/references/ai-search/configuration.md +52 -0
- package/baseline/skill/cloudflare/references/ai-search/gotchas.md +41 -0
- package/baseline/skill/cloudflare/references/ai-search/patterns.md +45 -0
- package/baseline/skill/cloudflare/references/analytics-engine/README.md +14 -0
- package/baseline/skill/cloudflare/references/analytics-engine/api.md +27 -0
- package/baseline/skill/cloudflare/references/analytics-engine/configuration.md +45 -0
- package/baseline/skill/cloudflare/references/analytics-engine/gotchas.md +3 -0
- package/baseline/skill/cloudflare/references/analytics-engine/patterns.md +36 -0
- package/baseline/skill/cloudflare/references/api/README.md +21 -0
- package/baseline/skill/cloudflare/references/api/api.md +31 -0
- package/baseline/skill/cloudflare/references/api/configuration.md +20 -0
- package/baseline/skill/cloudflare/references/api/gotchas.md +28 -0
- package/baseline/skill/cloudflare/references/api/patterns.md +47 -0
- package/baseline/skill/cloudflare/references/api-shield/README.md +20 -0
- package/baseline/skill/cloudflare/references/api-shield/api.md +78 -0
- package/baseline/skill/cloudflare/references/api-shield/configuration.md +128 -0
- package/baseline/skill/cloudflare/references/api-shield/gotchas.md +51 -0
- package/baseline/skill/cloudflare/references/api-shield/patterns.md +145 -0
- package/baseline/skill/cloudflare/references/argo-smart-routing/README.md +16 -0
- package/baseline/skill/cloudflare/references/argo-smart-routing/api.md +50 -0
- package/baseline/skill/cloudflare/references/argo-smart-routing/configuration.md +53 -0
- package/baseline/skill/cloudflare/references/argo-smart-routing/gotchas.md +16 -0
- package/baseline/skill/cloudflare/references/argo-smart-routing/patterns.md +45 -0
- package/baseline/skill/cloudflare/references/bindings/README.md +14 -0
- package/baseline/skill/cloudflare/references/bindings/api.md +3 -0
- package/baseline/skill/cloudflare/references/bindings/configuration.md +58 -0
- package/baseline/skill/cloudflare/references/bindings/gotchas.md +35 -0
- package/baseline/skill/cloudflare/references/bindings/patterns.md +37 -0
- package/baseline/skill/cloudflare/references/bot-management/README.md +71 -0
- package/baseline/skill/cloudflare/references/bot-management/api.md +168 -0
- package/baseline/skill/cloudflare/references/bot-management/configuration.md +114 -0
- package/baseline/skill/cloudflare/references/bot-management/gotchas.md +99 -0
- package/baseline/skill/cloudflare/references/bot-management/patterns.md +125 -0
- package/baseline/skill/cloudflare/references/browser-rendering/README.md +16 -0
- package/baseline/skill/cloudflare/references/browser-rendering/api.md +54 -0
- package/baseline/skill/cloudflare/references/browser-rendering/configuration.md +47 -0
- package/baseline/skill/cloudflare/references/browser-rendering/gotchas.md +29 -0
- package/baseline/skill/cloudflare/references/browser-rendering/patterns.md +29 -0
- package/baseline/skill/cloudflare/references/c3/README.md +264 -0
- package/baseline/skill/cloudflare/references/cache-reserve/README.md +93 -0
- package/baseline/skill/cloudflare/references/cache-reserve/api.md +176 -0
- package/baseline/skill/cloudflare/references/cache-reserve/configuration.md +164 -0
- package/baseline/skill/cloudflare/references/cache-reserve/gotchas.md +203 -0
- package/baseline/skill/cloudflare/references/cache-reserve/patterns.md +180 -0
- package/baseline/skill/cloudflare/references/containers/README.md +16 -0
- package/baseline/skill/cloudflare/references/containers/api.md +43 -0
- package/baseline/skill/cloudflare/references/containers/configuration.md +56 -0
- package/baseline/skill/cloudflare/references/containers/gotchas.md +21 -0
- package/baseline/skill/cloudflare/references/containers/patterns.md +40 -0
- package/baseline/skill/cloudflare/references/cron-triggers/README.md +85 -0
- package/baseline/skill/cloudflare/references/cron-triggers/api.md +198 -0
- package/baseline/skill/cloudflare/references/cron-triggers/configuration.md +151 -0
- package/baseline/skill/cloudflare/references/cron-triggers/gotchas.md +129 -0
- package/baseline/skill/cloudflare/references/cron-triggers/patterns.md +122 -0
- package/baseline/skill/cloudflare/references/d1/README.md +92 -0
- package/baseline/skill/cloudflare/references/d1/api.md +141 -0
- package/baseline/skill/cloudflare/references/d1/configuration.md +127 -0
- package/baseline/skill/cloudflare/references/d1/gotchas.md +70 -0
- package/baseline/skill/cloudflare/references/d1/patterns.md +144 -0
- package/baseline/skill/cloudflare/references/ddos/README.md +34 -0
- package/baseline/skill/cloudflare/references/ddos/api.md +136 -0
- package/baseline/skill/cloudflare/references/ddos/configuration.md +67 -0
- package/baseline/skill/cloudflare/references/ddos/gotchas.md +114 -0
- package/baseline/skill/cloudflare/references/ddos/patterns.md +158 -0
- package/baseline/skill/cloudflare/references/do-storage/README.md +62 -0
- package/baseline/skill/cloudflare/references/do-storage/api.md +89 -0
- package/baseline/skill/cloudflare/references/do-storage/configuration.md +116 -0
- package/baseline/skill/cloudflare/references/do-storage/gotchas.md +93 -0
- package/baseline/skill/cloudflare/references/do-storage/patterns.md +112 -0
- package/baseline/skill/cloudflare/references/durable-objects/README.md +125 -0
- package/baseline/skill/cloudflare/references/durable-objects/api.md +152 -0
- package/baseline/skill/cloudflare/references/durable-objects/configuration.md +148 -0
- package/baseline/skill/cloudflare/references/durable-objects/gotchas.md +158 -0
- package/baseline/skill/cloudflare/references/durable-objects/patterns.md +255 -0
- package/baseline/skill/cloudflare/references/email-routing/README.md +18 -0
- package/baseline/skill/cloudflare/references/email-routing/api.md +46 -0
- package/baseline/skill/cloudflare/references/email-routing/configuration.md +63 -0
- package/baseline/skill/cloudflare/references/email-routing/gotchas.md +16 -0
- package/baseline/skill/cloudflare/references/email-routing/patterns.md +46 -0
- package/baseline/skill/cloudflare/references/email-workers/README.md +598 -0
- package/baseline/skill/cloudflare/references/hyperdrive/README.md +62 -0
- package/baseline/skill/cloudflare/references/hyperdrive/api.md +137 -0
- package/baseline/skill/cloudflare/references/hyperdrive/configuration.md +133 -0
- package/baseline/skill/cloudflare/references/hyperdrive/gotchas.md +184 -0
- package/baseline/skill/cloudflare/references/hyperdrive/patterns.md +176 -0
- package/baseline/skill/cloudflare/references/images/README.md +14 -0
- package/baseline/skill/cloudflare/references/images/api.md +3 -0
- package/baseline/skill/cloudflare/references/images/configuration.md +45 -0
- package/baseline/skill/cloudflare/references/images/gotchas.md +23 -0
- package/baseline/skill/cloudflare/references/images/patterns.md +31 -0
- package/baseline/skill/cloudflare/references/kv/README.md +60 -0
- package/baseline/skill/cloudflare/references/kv/api.md +114 -0
- package/baseline/skill/cloudflare/references/kv/configuration.md +92 -0
- package/baseline/skill/cloudflare/references/kv/gotchas.md +117 -0
- package/baseline/skill/cloudflare/references/kv/patterns.md +139 -0
- package/baseline/skill/cloudflare/references/miniflare/README.md +64 -0
- package/baseline/skill/cloudflare/references/miniflare/api.md +144 -0
- package/baseline/skill/cloudflare/references/miniflare/configuration.md +203 -0
- package/baseline/skill/cloudflare/references/miniflare/gotchas.md +187 -0
- package/baseline/skill/cloudflare/references/miniflare/patterns.md +211 -0
- package/baseline/skill/cloudflare/references/network-interconnect/README.md +60 -0
- package/baseline/skill/cloudflare/references/network-interconnect/api.md +240 -0
- package/baseline/skill/cloudflare/references/network-interconnect/configuration.md +127 -0
- package/baseline/skill/cloudflare/references/network-interconnect/gotchas.md +171 -0
- package/baseline/skill/cloudflare/references/network-interconnect/patterns.md +171 -0
- package/baseline/skill/cloudflare/references/observability/README.md +18 -0
- package/baseline/skill/cloudflare/references/observability/api.md +51 -0
- package/baseline/skill/cloudflare/references/observability/configuration.md +60 -0
- package/baseline/skill/cloudflare/references/observability/gotchas.md +36 -0
- package/baseline/skill/cloudflare/references/observability/patterns.md +42 -0
- package/baseline/skill/cloudflare/references/pages/README.md +76 -0
- package/baseline/skill/cloudflare/references/pages/api.md +200 -0
- package/baseline/skill/cloudflare/references/pages/configuration.md +228 -0
- package/baseline/skill/cloudflare/references/pages/gotchas.md +161 -0
- package/baseline/skill/cloudflare/references/pages/patterns.md +145 -0
- package/baseline/skill/cloudflare/references/pages-functions/README.md +57 -0
- package/baseline/skill/cloudflare/references/pages-functions/api.md +201 -0
- package/baseline/skill/cloudflare/references/pages-functions/configuration.md +159 -0
- package/baseline/skill/cloudflare/references/pages-functions/gotchas.md +151 -0
- package/baseline/skill/cloudflare/references/pages-functions/patterns.md +190 -0
- package/baseline/skill/cloudflare/references/pipelines/README.md +664 -0
- package/baseline/skill/cloudflare/references/pulumi/README.md +107 -0
- package/baseline/skill/cloudflare/references/pulumi/api.md +194 -0
- package/baseline/skill/cloudflare/references/pulumi/configuration.md +216 -0
- package/baseline/skill/cloudflare/references/pulumi/gotchas.md +223 -0
- package/baseline/skill/cloudflare/references/pulumi/patterns.md +139 -0
- package/baseline/skill/cloudflare/references/queues/README.md +69 -0
- package/baseline/skill/cloudflare/references/queues/api.md +138 -0
- package/baseline/skill/cloudflare/references/queues/configuration.md +125 -0
- package/baseline/skill/cloudflare/references/queues/gotchas.md +112 -0
- package/baseline/skill/cloudflare/references/queues/patterns.md +155 -0
- package/baseline/skill/cloudflare/references/r2/README.md +61 -0
- package/baseline/skill/cloudflare/references/r2/api.md +127 -0
- package/baseline/skill/cloudflare/references/r2/configuration.md +76 -0
- package/baseline/skill/cloudflare/references/r2/gotchas.md +94 -0
- package/baseline/skill/cloudflare/references/r2/patterns.md +127 -0
- package/baseline/skill/cloudflare/references/r2-data-catalog/README.md +18 -0
- package/baseline/skill/cloudflare/references/r2-data-catalog/api.md +29 -0
- package/baseline/skill/cloudflare/references/r2-data-catalog/configuration.md +39 -0
- package/baseline/skill/cloudflare/references/r2-data-catalog/gotchas.md +20 -0
- package/baseline/skill/cloudflare/references/r2-data-catalog/patterns.md +46 -0
- package/baseline/skill/cloudflare/references/r2-sql/README.md +512 -0
- package/baseline/skill/cloudflare/references/realtime-sfu/README.md +21 -0
- package/baseline/skill/cloudflare/references/realtime-sfu/api.md +135 -0
- package/baseline/skill/cloudflare/references/realtime-sfu/configuration.md +63 -0
- package/baseline/skill/cloudflare/references/realtime-sfu/gotchas.md +75 -0
- package/baseline/skill/cloudflare/references/realtime-sfu/patterns.md +102 -0
- package/baseline/skill/cloudflare/references/realtimekit/README.md +81 -0
- package/baseline/skill/cloudflare/references/realtimekit/api.md +164 -0
- package/baseline/skill/cloudflare/references/realtimekit/configuration.md +147 -0
- package/baseline/skill/cloudflare/references/realtimekit/gotchas.md +172 -0
- package/baseline/skill/cloudflare/references/realtimekit/patterns.md +155 -0
- package/baseline/skill/cloudflare/references/sandbox/README.md +90 -0
- package/baseline/skill/cloudflare/references/sandbox/api.md +178 -0
- package/baseline/skill/cloudflare/references/sandbox/configuration.md +131 -0
- package/baseline/skill/cloudflare/references/sandbox/gotchas.md +156 -0
- package/baseline/skill/cloudflare/references/sandbox/patterns.md +203 -0
- package/baseline/skill/cloudflare/references/secrets-store/README.md +58 -0
- package/baseline/skill/cloudflare/references/secrets-store/api.md +182 -0
- package/baseline/skill/cloudflare/references/secrets-store/configuration.md +140 -0
- package/baseline/skill/cloudflare/references/secrets-store/gotchas.md +129 -0
- package/baseline/skill/cloudflare/references/secrets-store/patterns.md +218 -0
- package/baseline/skill/cloudflare/references/smart-placement/README.md +91 -0
- package/baseline/skill/cloudflare/references/smart-placement/api.md +139 -0
- package/baseline/skill/cloudflare/references/smart-placement/configuration.md +129 -0
- package/baseline/skill/cloudflare/references/smart-placement/gotchas.md +87 -0
- package/baseline/skill/cloudflare/references/smart-placement/patterns.md +135 -0
- package/baseline/skill/cloudflare/references/snippets/README.md +15 -0
- package/baseline/skill/cloudflare/references/snippets/api.md +47 -0
- package/baseline/skill/cloudflare/references/snippets/configuration.md +33 -0
- package/baseline/skill/cloudflare/references/snippets/gotchas.md +21 -0
- package/baseline/skill/cloudflare/references/snippets/patterns.md +34 -0
- package/baseline/skill/cloudflare/references/spectrum/README.md +16 -0
- package/baseline/skill/cloudflare/references/spectrum/api.md +24 -0
- package/baseline/skill/cloudflare/references/spectrum/configuration.md +43 -0
- package/baseline/skill/cloudflare/references/spectrum/gotchas.md +42 -0
- package/baseline/skill/cloudflare/references/spectrum/patterns.md +40 -0
- package/baseline/skill/cloudflare/references/static-assets/README.md +14 -0
- package/baseline/skill/cloudflare/references/static-assets/api.md +3 -0
- package/baseline/skill/cloudflare/references/static-assets/configuration.md +47 -0
- package/baseline/skill/cloudflare/references/static-assets/gotchas.md +44 -0
- package/baseline/skill/cloudflare/references/static-assets/patterns.md +42 -0
- package/baseline/skill/cloudflare/references/stream/README.md +103 -0
- package/baseline/skill/cloudflare/references/stream/api.md +204 -0
- package/baseline/skill/cloudflare/references/stream/configuration.md +127 -0
- package/baseline/skill/cloudflare/references/stream/gotchas.md +131 -0
- package/baseline/skill/cloudflare/references/stream/patterns.md +152 -0
- package/baseline/skill/cloudflare/references/tail-workers/README.md +640 -0
- package/baseline/skill/cloudflare/references/terraform/README.md +76 -0
- package/baseline/skill/cloudflare/references/terraform/api.md +159 -0
- package/baseline/skill/cloudflare/references/terraform/configuration.md +156 -0
- package/baseline/skill/cloudflare/references/terraform/gotchas.md +207 -0
- package/baseline/skill/cloudflare/references/terraform/patterns.md +135 -0
- package/baseline/skill/cloudflare/references/tunnel/README.md +82 -0
- package/baseline/skill/cloudflare/references/tunnel/api.md +105 -0
- package/baseline/skill/cloudflare/references/tunnel/configuration.md +113 -0
- package/baseline/skill/cloudflare/references/tunnel/gotchas.md +115 -0
- package/baseline/skill/cloudflare/references/tunnel/patterns.md +157 -0
- package/baseline/skill/cloudflare/references/turn/README.md +699 -0
- package/baseline/skill/cloudflare/references/turnstile/README.md +14 -0
- package/baseline/skill/cloudflare/references/turnstile/api.md +3 -0
- package/baseline/skill/cloudflare/references/turnstile/configuration.md +19 -0
- package/baseline/skill/cloudflare/references/turnstile/gotchas.md +27 -0
- package/baseline/skill/cloudflare/references/turnstile/patterns.md +41 -0
- package/baseline/skill/cloudflare/references/vectorize/README.md +682 -0
- package/baseline/skill/cloudflare/references/waf/README.md +14 -0
- package/baseline/skill/cloudflare/references/waf/api.md +3 -0
- package/baseline/skill/cloudflare/references/waf/configuration.md +44 -0
- package/baseline/skill/cloudflare/references/waf/gotchas.md +24 -0
- package/baseline/skill/cloudflare/references/waf/patterns.md +29 -0
- package/baseline/skill/cloudflare/references/web-analytics/README.md +19 -0
- package/baseline/skill/cloudflare/references/web-analytics/api.md +52 -0
- package/baseline/skill/cloudflare/references/web-analytics/configuration.md +31 -0
- package/baseline/skill/cloudflare/references/web-analytics/gotchas.md +28 -0
- package/baseline/skill/cloudflare/references/web-analytics/patterns.md +52 -0
- package/baseline/skill/cloudflare/references/workerd/README.md +47 -0
- package/baseline/skill/cloudflare/references/workerd/api.md +199 -0
- package/baseline/skill/cloudflare/references/workerd/configuration.md +185 -0
- package/baseline/skill/cloudflare/references/workerd/gotchas.md +203 -0
- package/baseline/skill/cloudflare/references/workerd/patterns.md +216 -0
- package/baseline/skill/cloudflare/references/workers/README.md +96 -0
- package/baseline/skill/cloudflare/references/workers/api.md +137 -0
- package/baseline/skill/cloudflare/references/workers/configuration.md +147 -0
- package/baseline/skill/cloudflare/references/workers/gotchas.md +99 -0
- package/baseline/skill/cloudflare/references/workers/patterns.md +149 -0
- package/baseline/skill/cloudflare/references/workers-ai/README.md +116 -0
- package/baseline/skill/cloudflare/references/workers-for-platforms/README.md +48 -0
- package/baseline/skill/cloudflare/references/workers-for-platforms/api.md +169 -0
- package/baseline/skill/cloudflare/references/workers-for-platforms/configuration.md +136 -0
- package/baseline/skill/cloudflare/references/workers-for-platforms/gotchas.md +130 -0
- package/baseline/skill/cloudflare/references/workers-for-platforms/patterns.md +170 -0
- package/baseline/skill/cloudflare/references/workers-playground/README.md +16 -0
- package/baseline/skill/cloudflare/references/workers-playground/api.md +20 -0
- package/baseline/skill/cloudflare/references/workers-playground/configuration.md +3 -0
- package/baseline/skill/cloudflare/references/workers-playground/gotchas.md +35 -0
- package/baseline/skill/cloudflare/references/workers-playground/patterns.md +42 -0
- package/baseline/skill/cloudflare/references/workers-vpc/README.md +579 -0
- package/baseline/skill/cloudflare/references/workflows/README.md +62 -0
- package/baseline/skill/cloudflare/references/workflows/api.md +125 -0
- package/baseline/skill/cloudflare/references/workflows/configuration.md +177 -0
- package/baseline/skill/cloudflare/references/workflows/gotchas.md +136 -0
- package/baseline/skill/cloudflare/references/workflows/patterns.md +132 -0
- package/baseline/skill/cloudflare/references/wrangler/README.md +90 -0
- package/baseline/skill/cloudflare/references/wrangler/api.md +140 -0
- package/baseline/skill/cloudflare/references/wrangler/configuration.md +128 -0
- package/baseline/skill/cloudflare/references/wrangler/gotchas.md +93 -0
- package/baseline/skill/cloudflare/references/wrangler/patterns.md +150 -0
- package/baseline/skill/cloudflare/references/zaraz/README.md +360 -0
- package/baseline/skill/code-navigation/SKILL.md +130 -0
- package/baseline/skill/compaction/SKILL.md +317 -0
- package/baseline/skill/condition-based-waiting/SKILL.md +123 -0
- package/baseline/skill/condition-based-waiting/example.ts +158 -0
- package/baseline/skill/context-engineering/SKILL.md +176 -0
- package/baseline/skill/context-initialization/SKILL.md +70 -0
- package/baseline/skill/context-management/SKILL.md +163 -0
- package/baseline/skill/core-data-expert/SKILL.md +93 -0
- package/baseline/skill/core-data-expert/references/batch-operations.md +543 -0
- package/baseline/skill/core-data-expert/references/cloudkit-integration.md +259 -0
- package/baseline/skill/core-data-expert/references/concurrency.md +522 -0
- package/baseline/skill/core-data-expert/references/fetch-requests.md +643 -0
- package/baseline/skill/core-data-expert/references/glossary.md +233 -0
- package/baseline/skill/core-data-expert/references/migration.md +393 -0
- package/baseline/skill/core-data-expert/references/model-configuration.md +597 -0
- package/baseline/skill/core-data-expert/references/performance.md +300 -0
- package/baseline/skill/core-data-expert/references/persistent-history.md +553 -0
- package/baseline/skill/core-data-expert/references/project-audit.md +60 -0
- package/baseline/skill/core-data-expert/references/saving.md +574 -0
- package/baseline/skill/core-data-expert/references/stack-setup.md +625 -0
- package/baseline/skill/core-data-expert/references/testing.md +300 -0
- package/baseline/skill/core-data-expert/references/threading.md +589 -0
- package/baseline/skill/deep-research/SKILL.md +384 -0
- package/baseline/skill/defense-in-depth/SKILL.md +166 -0
- package/baseline/skill/design-system-audit/SKILL.md +153 -0
- package/baseline/skill/development-lifecycle/SKILL.md +356 -0
- package/baseline/skill/dispatching-parallel-agents/SKILL.md +191 -0
- package/baseline/skill/executing-plans/SKILL.md +247 -0
- package/baseline/skill/figma/SKILL.md +224 -0
- package/baseline/skill/finishing-a-development-branch/SKILL.md +357 -0
- package/baseline/skill/frontend-design/SKILL.md +235 -0
- package/baseline/skill/frontend-design/references/animation/motion-advanced.md +224 -0
- package/baseline/skill/frontend-design/references/animation/motion-core.md +181 -0
- package/baseline/skill/frontend-design/references/canvas/execution.md +90 -0
- package/baseline/skill/frontend-design/references/canvas/philosophy.md +94 -0
- package/baseline/skill/frontend-design/references/design/color-system.md +111 -0
- package/baseline/skill/frontend-design/references/design/interaction.md +149 -0
- package/baseline/skill/frontend-design/references/design/typography-rules.md +106 -0
- package/baseline/skill/frontend-design/references/design/ux-writing.md +99 -0
- package/baseline/skill/frontend-design/references/shadcn/accessibility.md +132 -0
- package/baseline/skill/frontend-design/references/shadcn/core-components.md +153 -0
- package/baseline/skill/frontend-design/references/shadcn/form-components.md +158 -0
- package/baseline/skill/frontend-design/references/shadcn/setup.md +69 -0
- package/baseline/skill/frontend-design/references/shadcn/theming.md +152 -0
- package/baseline/skill/frontend-design/references/tailwind/responsive.md +112 -0
- package/baseline/skill/frontend-design/references/tailwind/utilities-layout.md +134 -0
- package/baseline/skill/frontend-design/references/tailwind/utilities-styling.md +165 -0
- package/baseline/skill/frontend-design/references/tailwind/v4-config.md +147 -0
- package/baseline/skill/frontend-design/references/tailwind/v4-features.md +128 -0
- package/baseline/skill/gemini-large-context/SKILL.md +216 -0
- package/baseline/skill/index-knowledge/SKILL.md +413 -0
- package/baseline/skill/jira/SKILL.md +283 -0
- package/baseline/skill/jira/mcp.json +6 -0
- package/baseline/skill/memory-system/SKILL.md +84 -0
- package/baseline/skill/mockup-to-code/SKILL.md +184 -0
- package/baseline/skill/mqdh/SKILL.md +171 -0
- package/baseline/skill/obsidian/SKILL.md +192 -0
- package/baseline/skill/obsidian/mcp.json +22 -0
- package/baseline/skill/opensrc/SKILL.md +127 -0
- package/baseline/skill/opensrc/references/architecture.md +176 -0
- package/baseline/skill/opensrc/references/cli-usage.md +176 -0
- package/baseline/skill/opensrc/references/registry-support.md +137 -0
- package/baseline/skill/pdf-extract/SKILL.md +438 -0
- package/baseline/skill/playwright/SKILL.md +320 -0
- package/baseline/skill/playwright/mcp.json +16 -0
- package/baseline/skill/playwriter/SKILL.md +158 -0
- package/baseline/skill/polar/SKILL.md +102 -0
- package/baseline/skill/prd/SKILL.md +146 -0
- package/baseline/skill/prd-task/SKILL.md +182 -0
- package/baseline/skill/prd-task/references/prd-schema.json +124 -0
- package/baseline/skill/ralph/SKILL.md +296 -0
- package/baseline/skill/react-best-practices/AGENTS.md +2410 -0
- package/baseline/skill/react-best-practices/README.md +123 -0
- package/baseline/skill/react-best-practices/SKILL.md +133 -0
- package/baseline/skill/react-best-practices/metadata.json +15 -0
- package/baseline/skill/react-best-practices/rules/_sections.md +46 -0
- package/baseline/skill/react-best-practices/rules/_template.md +28 -0
- package/baseline/skill/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/baseline/skill/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/baseline/skill/react-best-practices/rules/async-api-routes.md +38 -0
- package/baseline/skill/react-best-practices/rules/async-defer-await.md +80 -0
- package/baseline/skill/react-best-practices/rules/async-dependencies.md +36 -0
- package/baseline/skill/react-best-practices/rules/async-parallel.md +28 -0
- package/baseline/skill/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/baseline/skill/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/baseline/skill/react-best-practices/rules/bundle-conditional.md +31 -0
- package/baseline/skill/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/baseline/skill/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/baseline/skill/react-best-practices/rules/bundle-preload.md +50 -0
- package/baseline/skill/react-best-practices/rules/client-event-listeners.md +74 -0
- package/baseline/skill/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/baseline/skill/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/baseline/skill/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/baseline/skill/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/baseline/skill/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/baseline/skill/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/baseline/skill/react-best-practices/rules/js-cache-storage.md +70 -0
- package/baseline/skill/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/baseline/skill/react-best-practices/rules/js-early-exit.md +50 -0
- package/baseline/skill/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/baseline/skill/react-best-practices/rules/js-index-maps.md +37 -0
- package/baseline/skill/react-best-practices/rules/js-length-check-first.md +49 -0
- package/baseline/skill/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/baseline/skill/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/baseline/skill/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/baseline/skill/react-best-practices/rules/rendering-activity.md +26 -0
- package/baseline/skill/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/baseline/skill/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/baseline/skill/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/baseline/skill/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/baseline/skill/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/baseline/skill/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/baseline/skill/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/baseline/skill/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/baseline/skill/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/baseline/skill/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/baseline/skill/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/baseline/skill/react-best-practices/rules/rerender-memo.md +44 -0
- package/baseline/skill/react-best-practices/rules/rerender-transitions.md +40 -0
- package/baseline/skill/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/baseline/skill/react-best-practices/rules/server-cache-lru.md +41 -0
- package/baseline/skill/react-best-practices/rules/server-cache-react.md +76 -0
- package/baseline/skill/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/baseline/skill/react-best-practices/rules/server-serialization.md +38 -0
- package/baseline/skill/receiving-code-review/SKILL.md +252 -0
- package/baseline/skill/requesting-code-review/SKILL.md +397 -0
- package/baseline/skill/requesting-code-review/review.md +160 -0
- package/baseline/skill/resend/SKILL.md +177 -0
- package/baseline/skill/resend/references/react-email.md +287 -0
- package/baseline/skill/resend/references/receive-email.md +248 -0
- package/baseline/skill/resend/references/send-email.md +318 -0
- package/baseline/skill/root-cause-tracing/SKILL.md +192 -0
- package/baseline/skill/root-cause-tracing/find-polluter.sh +63 -0
- package/baseline/skill/session-management/SKILL.md +9 -0
- package/baseline/skill/sharing-skills/SKILL.md +214 -0
- package/baseline/skill/skill-creator/SKILL.md +156 -0
- package/baseline/skill/source-code-research/SKILL.md +293 -0
- package/baseline/skill/source-code-research/references/analysis-tips.md +43 -0
- package/baseline/skill/source-code-research/references/anti-patterns.md +36 -0
- package/baseline/skill/source-code-research/references/common-patterns.md +57 -0
- package/baseline/skill/source-code-research/references/example-workflow.md +60 -0
- package/baseline/skill/source-code-research/references/further-reading.md +5 -0
- package/baseline/skill/source-code-research/references/source-structure.md +45 -0
- package/baseline/skill/stitch/SKILL.md +147 -0
- package/baseline/skill/stitch/mcp.json +9 -0
- package/baseline/skill/structured-edit/SKILL.md +181 -0
- package/baseline/skill/subagent-driven-development/SKILL.md +237 -0
- package/baseline/skill/supabase/SKILL.md +130 -0
- package/baseline/skill/supabase/mcp.json +27 -0
- package/baseline/skill/supabase-postgres-best-practices/AGENTS.md +1490 -0
- package/baseline/skill/supabase-postgres-best-practices/SKILL.md +65 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/advanced-full-text-search.md +55 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/advanced-jsonb-indexing.md +49 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/conn-idle-timeout.md +46 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/conn-limits.md +44 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/conn-pooling.md +41 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/conn-prepared-statements.md +46 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/data-batch-inserts.md +54 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/data-n-plus-one.md +53 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/data-pagination.md +50 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/data-upsert.md +50 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/lock-advisory.md +56 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/lock-deadlock-prevention.md +68 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/lock-short-transactions.md +50 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/lock-skip-locked.md +54 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/monitor-explain-analyze.md +45 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/monitor-pg-stat-statements.md +55 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/monitor-vacuum-analyze.md +55 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/query-composite-indexes.md +44 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/query-covering-indexes.md +40 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/query-index-types.md +45 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/query-missing-indexes.md +43 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/query-partial-indexes.md +45 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/schema-data-types.md +46 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/schema-foreign-key-indexes.md +59 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/schema-lowercase-identifiers.md +55 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/schema-partitioning.md +55 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/schema-primary-keys.md +61 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/security-privileges.md +54 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/security-rls-basics.md +50 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/security-rls-performance.md +57 -0
- package/baseline/skill/swarm-coordination/SKILL.md +179 -0
- package/baseline/skill/swarm-coordination/references/architecture.md +39 -0
- package/baseline/skill/swarm-coordination/references/delegation-worker-protocol.md +145 -0
- package/baseline/skill/swarm-coordination/references/dependency-graph.md +50 -0
- package/baseline/skill/swarm-coordination/references/drift-check.md +90 -0
- package/baseline/skill/swarm-coordination/references/integration-beads.md +20 -0
- package/baseline/skill/swarm-coordination/references/launch-flow.md +186 -0
- package/baseline/skill/swarm-coordination/references/reconciler.md +172 -0
- package/baseline/skill/swarm-coordination/references/tier-enforcement.md +78 -0
- package/baseline/skill/swarm-coordination/references/tmux-integration.md +134 -0
- package/baseline/skill/swift-concurrency/SKILL.md +266 -0
- package/baseline/skill/swift-concurrency/references/actors.md +640 -0
- package/baseline/skill/swift-concurrency/references/async-algorithms.md +822 -0
- package/baseline/skill/swift-concurrency/references/async-await-basics.md +249 -0
- package/baseline/skill/swift-concurrency/references/async-sequences.md +670 -0
- package/baseline/skill/swift-concurrency/references/core-data.md +533 -0
- package/baseline/skill/swift-concurrency/references/glossary.md +128 -0
- package/baseline/skill/swift-concurrency/references/linting.md +142 -0
- package/baseline/skill/swift-concurrency/references/memory-management.md +542 -0
- package/baseline/skill/swift-concurrency/references/migration.md +1076 -0
- package/baseline/skill/swift-concurrency/references/performance.md +574 -0
- package/baseline/skill/swift-concurrency/references/sendable.md +578 -0
- package/baseline/skill/swift-concurrency/references/tasks.md +604 -0
- package/baseline/skill/swift-concurrency/references/testing.md +565 -0
- package/baseline/skill/swift-concurrency/references/threading.md +452 -0
- package/baseline/skill/swiftui-expert-skill/SKILL.md +329 -0
- package/baseline/skill/swiftui-expert-skill/references/animation-advanced.md +351 -0
- package/baseline/skill/swiftui-expert-skill/references/animation-basics.md +284 -0
- package/baseline/skill/swiftui-expert-skill/references/animation-transitions.md +326 -0
- package/baseline/skill/swiftui-expert-skill/references/image-optimization.md +286 -0
- package/baseline/skill/swiftui-expert-skill/references/layout-best-practices.md +312 -0
- package/baseline/skill/swiftui-expert-skill/references/liquid-glass.md +377 -0
- package/baseline/skill/swiftui-expert-skill/references/list-patterns.md +153 -0
- package/baseline/skill/swiftui-expert-skill/references/modern-apis.md +400 -0
- package/baseline/skill/swiftui-expert-skill/references/performance-patterns.md +377 -0
- package/baseline/skill/swiftui-expert-skill/references/scroll-patterns.md +305 -0
- package/baseline/skill/swiftui-expert-skill/references/sheet-navigation-patterns.md +292 -0
- package/baseline/skill/swiftui-expert-skill/references/state-management.md +447 -0
- package/baseline/skill/swiftui-expert-skill/references/text-formatting.md +285 -0
- package/baseline/skill/swiftui-expert-skill/references/view-structure.md +276 -0
- package/baseline/skill/systematic-debugging/SKILL.md +402 -0
- package/baseline/skill/test-driven-development/SKILL.md +388 -0
- package/baseline/skill/testing-anti-patterns/SKILL.md +333 -0
- package/baseline/skill/testing-skills-with-subagents/SKILL.md +405 -0
- package/baseline/skill/tilth-cli/SKILL.md +180 -0
- package/baseline/skill/tool-priority/SKILL.md +299 -0
- package/baseline/skill/ui-ux-research/SKILL.md +9 -0
- package/baseline/skill/using-git-worktrees/SKILL.md +259 -0
- package/baseline/skill/using-skills/SKILL.md +117 -0
- package/baseline/skill/v0/SKILL.md +158 -0
- package/baseline/skill/v1-run/SKILL.md +175 -0
- package/baseline/skill/v1-run/mcp.json +6 -0
- package/baseline/skill/vercel-deploy-claimable/SKILL.md +124 -0
- package/baseline/skill/vercel-deploy-claimable/scripts/deploy.sh +249 -0
- package/baseline/skill/verification-before-completion/SKILL.md +236 -0
- package/baseline/skill/verification-before-completion/references/VERIFICATION_PROTOCOL.md +171 -0
- package/baseline/skill/visual-analysis/SKILL.md +154 -0
- package/baseline/skill/web-design-guidelines/SKILL.md +46 -0
- package/baseline/skill/writing-plans/SKILL.md +320 -0
- package/baseline/skill/writing-skills/SKILL.md +287 -0
- package/baseline/skill/writing-skills/anthropic-best-practices.md +1173 -0
- package/baseline/skill/writing-skills/graphviz-conventions.dot +172 -0
- package/baseline/skill/writing-skills/persuasion-principles.md +220 -0
- package/baseline/skill/writing-skills/references/anti-patterns.md +25 -0
- package/baseline/skill/writing-skills/references/claude-search-optimization.md +140 -0
- package/baseline/skill/writing-skills/references/discovery-workflow.md +11 -0
- package/baseline/skill/writing-skills/references/file-organization.md +32 -0
- package/baseline/skill/writing-skills/references/flowcharts-and-examples.md +57 -0
- package/baseline/skill/writing-skills/references/rationalization-hardening.md +75 -0
- package/baseline/skill/writing-skills/references/testing-skill-types.md +52 -0
- package/baseline/tool/context7.ts +191 -0
- package/baseline/tool/grepsearch.ts +143 -0
- package/baseline/tsconfig.json +21 -0
- package/baseline/tui.json +15 -0
- package/bin/mrc-opc.mjs +25 -0
- package/bin/ocp.mjs +25 -0
- package/bin/opc.mjs +25 -0
- package/bin/opencode-starterkit.mjs +25 -0
- package/docs/reports/2026-03-18-memory-db-architecture-note.md +47 -0
- package/docs/reports/2026-03-18-vat-opencode-classification-matrix.md +180 -0
- package/package.json +25 -0
- package/src/cli.mjs +41 -0
- package/src/config-merge.mjs +61 -0
- package/src/constants.mjs +58 -0
- package/src/fs-utils.mjs +46 -0
- package/src/install-global.mjs +102 -0
- package/src/install-project.mjs +81 -0
- package/src/memory-bootstrap.mjs +29 -0
- package/src/prompt.mjs +31 -0
- package/src/templates.mjs +31 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: resend
|
|
3
|
+
description: Use when working with Resend email platform - sending transactional emails, receiving inbound emails, creating email templates with React Email, handling webhooks, or integrating email into applications.
|
|
4
|
+
references:
|
|
5
|
+
- send-email
|
|
6
|
+
- receive-email
|
|
7
|
+
- react-email
|
|
8
|
+
version: 1.0.0
|
|
9
|
+
tags: [integration, mcp]
|
|
10
|
+
dependencies: []
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Resend Email Platform
|
|
14
|
+
|
|
15
|
+
## When to Use
|
|
16
|
+
|
|
17
|
+
- When integrating Resend for sending/receiving emails or building React Email templates.
|
|
18
|
+
|
|
19
|
+
## When NOT to Use
|
|
20
|
+
|
|
21
|
+
- When email delivery is handled by a different provider or not required.
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
## How to Use This Skill
|
|
25
|
+
|
|
26
|
+
### Reference File Structure
|
|
27
|
+
|
|
28
|
+
Each feature in `./references/` contains documentation for specific use cases:
|
|
29
|
+
|
|
30
|
+
| File | Purpose | When to Read |
|
|
31
|
+
| ------------------ | ---------------------------- | ---------------------------------------------- |
|
|
32
|
+
| `send-email.md` | Sending transactional emails | Single/batch sends, attachments, scheduling |
|
|
33
|
+
| `receive-email.md` | Receiving inbound emails | Webhooks, processing received mail, forwarding |
|
|
34
|
+
| `react-email.md` | Building email templates | React components, styling, rendering |
|
|
35
|
+
|
|
36
|
+
### Reading Order
|
|
37
|
+
|
|
38
|
+
1. Start with this file for quick routing
|
|
39
|
+
2. Then read the relevant reference file for your task
|
|
40
|
+
|
|
41
|
+
## Quick Decision Tree
|
|
42
|
+
|
|
43
|
+
### "I need to send emails"
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
Need to send emails?
|
|
47
|
+
├─ Single email (transactional) → send-email.md
|
|
48
|
+
├─ Batch emails (max 100) → send-email.md
|
|
49
|
+
├─ Email with attachments → send-email.md (single only)
|
|
50
|
+
├─ Scheduled emails → send-email.md (single only)
|
|
51
|
+
├─ Marketing/bulk campaigns → Use Resend Broadcasts (dashboard)
|
|
52
|
+
└─ AI agent sending emails → send-email.md + moltbot patterns
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### "I need to receive emails"
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
Need to receive emails?
|
|
59
|
+
├─ Set up inbound domain → receive-email.md
|
|
60
|
+
├─ Process webhook events → receive-email.md
|
|
61
|
+
├─ Get email body/content → receive-email.md (Receiving API)
|
|
62
|
+
├─ Download attachments → receive-email.md
|
|
63
|
+
├─ Forward received emails → receive-email.md
|
|
64
|
+
└─ AI agent receiving emails → receive-email.md + moltbot patterns
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### "I need to build email templates"
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
Need email templates?
|
|
71
|
+
├─ React-based templates → react-email.md
|
|
72
|
+
├─ Cross-client compatibility → react-email.md
|
|
73
|
+
├─ Reusable components → react-email.md
|
|
74
|
+
├─ Tailwind styling → react-email.md
|
|
75
|
+
└─ Plain HTML templates → Use Resend dashboard templates
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Common Setup
|
|
79
|
+
|
|
80
|
+
### API Key
|
|
81
|
+
|
|
82
|
+
Store in environment variable (never commit to code):
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
export RESEND_API_KEY=re_xxxxxxxxx
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### SDK Installation
|
|
89
|
+
|
|
90
|
+
**Node.js:**
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
npm install resend
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Python:**
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
pip install resend
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Go:**
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
go get github.com/resend/resend-go/v2
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Basic Usage (Node.js)
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
import { Resend } from "resend";
|
|
112
|
+
|
|
113
|
+
const resend = new Resend(process.env.RESEND_API_KEY);
|
|
114
|
+
|
|
115
|
+
// Send email
|
|
116
|
+
const { data, error } = await resend.emails.send({
|
|
117
|
+
from: "Acme <hello@acme.com>",
|
|
118
|
+
to: ["user@example.com"],
|
|
119
|
+
subject: "Hello World",
|
|
120
|
+
html: "<p>Email body here</p>",
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
if (error) {
|
|
124
|
+
console.error("Failed:", error.message);
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Critical Best Practices
|
|
129
|
+
|
|
130
|
+
### Always Do
|
|
131
|
+
|
|
132
|
+
| Practice | Why |
|
|
133
|
+
| ----------------------------- | ---------------------------------- |
|
|
134
|
+
| **Idempotency keys** | Prevent duplicate emails on retry |
|
|
135
|
+
| **Verify webhook signatures** | Prevent spoofed events |
|
|
136
|
+
| **Use test addresses** | `delivered@resend.dev` for testing |
|
|
137
|
+
| **Warm up new domains** | Gradual volume increase |
|
|
138
|
+
| **Include plain text** | Accessibility and deliverability |
|
|
139
|
+
|
|
140
|
+
### Never Do
|
|
141
|
+
|
|
142
|
+
| Anti-Pattern | Why |
|
|
143
|
+
| ---------------------------------------- | -------------------------- |
|
|
144
|
+
| Test with fake emails (`test@gmail.com`) | Destroys sender reputation |
|
|
145
|
+
| Skip webhook verification | Security vulnerability |
|
|
146
|
+
| Retry 400/422 errors | Fix the request instead |
|
|
147
|
+
| Use "no-reply" addresses | Hurts deliverability |
|
|
148
|
+
| Send high volume from new domain | Triggers spam filters |
|
|
149
|
+
|
|
150
|
+
## Webhook Events
|
|
151
|
+
|
|
152
|
+
| Event | Use Case |
|
|
153
|
+
| ------------------ | ----------------------------- |
|
|
154
|
+
| `email.sent` | Confirm email accepted |
|
|
155
|
+
| `email.delivered` | Confirm delivery to inbox |
|
|
156
|
+
| `email.bounced` | Remove from list, alert user |
|
|
157
|
+
| `email.complained` | Unsubscribe (spam complaint) |
|
|
158
|
+
| `email.opened` | Track engagement (marketing) |
|
|
159
|
+
| `email.clicked` | Track link clicks (marketing) |
|
|
160
|
+
| `email.received` | Process inbound emails |
|
|
161
|
+
|
|
162
|
+
## Error Handling
|
|
163
|
+
|
|
164
|
+
| Code | Action |
|
|
165
|
+
| -------- | ----------------------------------- |
|
|
166
|
+
| 400, 422 | Fix request parameters, don't retry |
|
|
167
|
+
| 401, 403 | Check API key / verify domain |
|
|
168
|
+
| 409 | Idempotency conflict - use new key |
|
|
169
|
+
| 429 | Rate limited - exponential backoff |
|
|
170
|
+
| 500 | Server error - retry with backoff |
|
|
171
|
+
|
|
172
|
+
## Resources
|
|
173
|
+
|
|
174
|
+
- [Resend Documentation](https://resend.com/docs)
|
|
175
|
+
- [API Reference](https://resend.com/docs/api-reference)
|
|
176
|
+
- [React Email](https://react.email)
|
|
177
|
+
- [Dashboard](https://resend.com/emails)
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
# React Email
|
|
2
|
+
|
|
3
|
+
Build and send HTML emails using React components. A modern, component-based approach to email development that works across all major email clients by compiling to compatible HTML.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
- Creating transactional emails (welcome, password reset, order confirmation)
|
|
8
|
+
- Building notification or marketing email templates
|
|
9
|
+
- Need consistent rendering across Gmail, Outlook, Apple Mail, Yahoo
|
|
10
|
+
- Want component reusability and TypeScript support in emails
|
|
11
|
+
- Integrating with email providers like Resend, SendGrid, Postmark
|
|
12
|
+
|
|
13
|
+
**When NOT to use:**
|
|
14
|
+
|
|
15
|
+
- Simple plain-text emails
|
|
16
|
+
- Emails that don't need cross-client compatibility
|
|
17
|
+
- Projects without React/Node.js
|
|
18
|
+
|
|
19
|
+
## Installation
|
|
20
|
+
|
|
21
|
+
### New Project
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npx create-email@latest
|
|
25
|
+
cd react-email-starter
|
|
26
|
+
npm install
|
|
27
|
+
npm run dev
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
The server runs at localhost:3000 with a preview interface for templates in the `emails` folder.
|
|
31
|
+
|
|
32
|
+
### Existing Project
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npm install react-email @react-email/preview-server -D -E
|
|
36
|
+
npm install @react-email/components react react-dom -E
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Add script to package.json:
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"scripts": {
|
|
44
|
+
"email:dev": "email dev --dir src/emails"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Basic Email Template
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
import {
|
|
53
|
+
Html,
|
|
54
|
+
Head,
|
|
55
|
+
Preview,
|
|
56
|
+
Body,
|
|
57
|
+
Container,
|
|
58
|
+
Heading,
|
|
59
|
+
Text,
|
|
60
|
+
Button,
|
|
61
|
+
Tailwind,
|
|
62
|
+
pixelBasedPreset,
|
|
63
|
+
} from "@react-email/components";
|
|
64
|
+
|
|
65
|
+
interface WelcomeEmailProps {
|
|
66
|
+
name: string;
|
|
67
|
+
verificationUrl: string;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export default function WelcomeEmail({ name, verificationUrl }: WelcomeEmailProps) {
|
|
71
|
+
return (
|
|
72
|
+
<Html lang="en">
|
|
73
|
+
<Tailwind
|
|
74
|
+
config={{
|
|
75
|
+
presets: [pixelBasedPreset],
|
|
76
|
+
theme: {
|
|
77
|
+
extend: {
|
|
78
|
+
colors: {
|
|
79
|
+
brand: "#007bff",
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
}}
|
|
84
|
+
>
|
|
85
|
+
<Head />
|
|
86
|
+
<Body className="bg-gray-100 font-sans">
|
|
87
|
+
<Preview>Welcome - Verify your email</Preview>
|
|
88
|
+
<Container className="max-w-xl mx-auto p-5">
|
|
89
|
+
<Heading className="text-2xl text-gray-800">Welcome!</Heading>
|
|
90
|
+
<Text className="text-base text-gray-800">Hi {name}, thanks for signing up!</Text>
|
|
91
|
+
<Button
|
|
92
|
+
href={verificationUrl}
|
|
93
|
+
className="bg-brand text-white px-5 py-3 rounded block text-center no-underline box-border"
|
|
94
|
+
>
|
|
95
|
+
Verify Email
|
|
96
|
+
</Button>
|
|
97
|
+
</Container>
|
|
98
|
+
</Body>
|
|
99
|
+
</Tailwind>
|
|
100
|
+
</Html>
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
WelcomeEmail.PreviewProps = {
|
|
105
|
+
name: "John Doe",
|
|
106
|
+
verificationUrl: "https://example.com/verify/abc123",
|
|
107
|
+
} satisfies WelcomeEmailProps;
|
|
108
|
+
|
|
109
|
+
export { WelcomeEmail };
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Essential Components
|
|
113
|
+
|
|
114
|
+
**Core Structure:**
|
|
115
|
+
|
|
116
|
+
- `Html` - Root wrapper with `lang` attribute
|
|
117
|
+
- `Head` - Meta elements, styles, fonts
|
|
118
|
+
- `Body` - Main content wrapper
|
|
119
|
+
- `Container` - Centers content (max-width layout)
|
|
120
|
+
- `Section` - Layout sections
|
|
121
|
+
- `Row` & `Column` - Multi-column layouts (table-based)
|
|
122
|
+
- `Tailwind` - Enables Tailwind CSS utility classes
|
|
123
|
+
|
|
124
|
+
**Content:**
|
|
125
|
+
|
|
126
|
+
- `Preview` - Inbox preview text (place after `Body` opening tag)
|
|
127
|
+
- `Heading` - h1-h6 headings
|
|
128
|
+
- `Text` - Paragraphs
|
|
129
|
+
- `Button` - Styled link buttons
|
|
130
|
+
- `Link` - Hyperlinks
|
|
131
|
+
- `Img` - Images (use absolute URLs)
|
|
132
|
+
- `Hr` - Horizontal dividers
|
|
133
|
+
|
|
134
|
+
**Specialized:**
|
|
135
|
+
|
|
136
|
+
- `CodeBlock` - Syntax-highlighted code
|
|
137
|
+
- `CodeInline` - Inline code
|
|
138
|
+
- `Markdown` - Render markdown
|
|
139
|
+
- `Font` - Custom web fonts
|
|
140
|
+
|
|
141
|
+
## Styling Rules
|
|
142
|
+
|
|
143
|
+
### Always Do
|
|
144
|
+
|
|
145
|
+
| Rule | Why |
|
|
146
|
+
| ------------------------------ | --------------------------------------------- |
|
|
147
|
+
| Use `pixelBasedPreset` | Email clients don't support `rem` units |
|
|
148
|
+
| Use `Row`/`Column` for layouts | Table-based layouts work everywhere |
|
|
149
|
+
| Specify border type | Always: `border-solid`, `border-dashed`, etc. |
|
|
150
|
+
| Use `box-border` on buttons | Consistent sizing |
|
|
151
|
+
| Use PNG/JPEG images | SVG/WEBP not supported |
|
|
152
|
+
| Use absolute image URLs | Relative paths won't work |
|
|
153
|
+
|
|
154
|
+
### Never Do
|
|
155
|
+
|
|
156
|
+
| Rule | Why |
|
|
157
|
+
| -------------------------------- | ---------------------------------------- |
|
|
158
|
+
| Use flexbox/grid | Not supported in email clients |
|
|
159
|
+
| Use media queries (`sm:`, `md:`) | Most email clients ignore them |
|
|
160
|
+
| Use theme selectors (`dark:`) | Inconsistent support |
|
|
161
|
+
| Use SVG/WEBP images | Not supported |
|
|
162
|
+
| Write template vars in JSX | Use props: `{props.name}` not `{{name}}` |
|
|
163
|
+
|
|
164
|
+
## Rendering
|
|
165
|
+
|
|
166
|
+
### Convert to HTML
|
|
167
|
+
|
|
168
|
+
```tsx
|
|
169
|
+
import { render } from "@react-email/components";
|
|
170
|
+
import { WelcomeEmail } from "./emails/welcome";
|
|
171
|
+
|
|
172
|
+
const html = await render(
|
|
173
|
+
<WelcomeEmail name="John" verificationUrl="https://example.com/verify" />,
|
|
174
|
+
);
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Convert to Plain Text
|
|
178
|
+
|
|
179
|
+
```tsx
|
|
180
|
+
const text = await render(
|
|
181
|
+
<WelcomeEmail name="John" verificationUrl="https://example.com/verify" />,
|
|
182
|
+
{ plainText: true },
|
|
183
|
+
);
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Sending with Resend
|
|
187
|
+
|
|
188
|
+
```tsx
|
|
189
|
+
import { Resend } from "resend";
|
|
190
|
+
import { WelcomeEmail } from "./emails/welcome";
|
|
191
|
+
|
|
192
|
+
const resend = new Resend(process.env.RESEND_API_KEY);
|
|
193
|
+
|
|
194
|
+
const { data, error } = await resend.emails.send({
|
|
195
|
+
from: "Acme <onboarding@resend.dev>",
|
|
196
|
+
to: ["user@example.com"],
|
|
197
|
+
subject: "Welcome to Acme",
|
|
198
|
+
react: <WelcomeEmail name="John" verificationUrl="https://example.com/verify" />,
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
if (error) {
|
|
202
|
+
console.error("Failed to send:", error);
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Resend accepts React components directly. It automatically generates a plain-text version if not provided.
|
|
207
|
+
|
|
208
|
+
## Common Patterns
|
|
209
|
+
|
|
210
|
+
### Responsive Container
|
|
211
|
+
|
|
212
|
+
```tsx
|
|
213
|
+
<Container className="max-w-xl mx-auto p-5">
|
|
214
|
+
{/* Content stays centered and readable on all devices */}
|
|
215
|
+
</Container>
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Two-Column Layout
|
|
219
|
+
|
|
220
|
+
```tsx
|
|
221
|
+
<Row>
|
|
222
|
+
<Column className="w-1/2">
|
|
223
|
+
<Text>Left content</Text>
|
|
224
|
+
</Column>
|
|
225
|
+
<Column className="w-1/2">
|
|
226
|
+
<Text>Right content</Text>
|
|
227
|
+
</Column>
|
|
228
|
+
</Row>
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**Note:** Columns won't stack on mobile. Design with this in mind.
|
|
232
|
+
|
|
233
|
+
### CTA Button
|
|
234
|
+
|
|
235
|
+
```tsx
|
|
236
|
+
<Button
|
|
237
|
+
href="https://example.com"
|
|
238
|
+
className="bg-blue-600 text-white px-6 py-3 rounded block text-center no-underline box-border"
|
|
239
|
+
>
|
|
240
|
+
Click Here
|
|
241
|
+
</Button>
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### Footer with Links
|
|
245
|
+
|
|
246
|
+
```tsx
|
|
247
|
+
<Section className="text-center text-gray-500 text-sm">
|
|
248
|
+
<Text>
|
|
249
|
+
<Link href="https://example.com/unsubscribe" className="text-gray-500 underline">
|
|
250
|
+
Unsubscribe
|
|
251
|
+
</Link>
|
|
252
|
+
{" | "}
|
|
253
|
+
<Link href="https://example.com/preferences" className="text-gray-500 underline">
|
|
254
|
+
Preferences
|
|
255
|
+
</Link>
|
|
256
|
+
</Text>
|
|
257
|
+
<Text>123 Main St, City, State 12345</Text>
|
|
258
|
+
</Section>
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Best Practices
|
|
262
|
+
|
|
263
|
+
1. **Test across clients** - Gmail, Outlook, Apple Mail, Yahoo
|
|
264
|
+
2. **Keep responsive** - Max-width ~600px
|
|
265
|
+
3. **Use absolute image URLs** - Host on reliable CDN
|
|
266
|
+
4. **Provide plain text version** - Required for accessibility
|
|
267
|
+
5. **Add TypeScript types** - Define interfaces for all props
|
|
268
|
+
6. **Include PreviewProps** - For development testing
|
|
269
|
+
7. **Keep under 102KB** - Gmail clips larger emails
|
|
270
|
+
|
|
271
|
+
## Common Mistakes
|
|
272
|
+
|
|
273
|
+
| Mistake | Fix |
|
|
274
|
+
| --------------------------------- | ---------------------------------------- |
|
|
275
|
+
| Using flexbox/grid | Use `Row` and `Column` components |
|
|
276
|
+
| Using `rem` units | Use `pixelBasedPreset` with Tailwind |
|
|
277
|
+
| Using SVG images | Use PNG or JPG instead |
|
|
278
|
+
| Using media queries | Design mobile-first with stacked layouts |
|
|
279
|
+
| Template vars in JSX (`{{name}}`) | Use props: `{props.name}` |
|
|
280
|
+
| Missing border type | Always specify: `border-solid`, etc. |
|
|
281
|
+
| Emails over 102KB | Gmail clips - reduce size |
|
|
282
|
+
|
|
283
|
+
## Resources
|
|
284
|
+
|
|
285
|
+
- [React Email Documentation](https://react.email/docs)
|
|
286
|
+
- [React Email GitHub](https://github.com/resend/react-email)
|
|
287
|
+
- [Email Client CSS Support](https://www.caniemail.com)
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
# Receive Emails with Resend
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Resend processes incoming emails for your domain and sends webhook events to your endpoint. **Webhooks contain metadata only** - you must call separate APIs to retrieve email body and attachments.
|
|
6
|
+
|
|
7
|
+
## Quick Start
|
|
8
|
+
|
|
9
|
+
1. **Configure receiving domain** - Use Resend's `.resend.app` domain or add MX record for custom domain
|
|
10
|
+
2. **Set up webhook** - Subscribe to `email.received` event
|
|
11
|
+
3. **Retrieve content** - Call Receiving API for body, Attachments API for files
|
|
12
|
+
|
|
13
|
+
## Domain Setup
|
|
14
|
+
|
|
15
|
+
### Option 1: Resend-Managed Domain (Fastest)
|
|
16
|
+
|
|
17
|
+
Use your auto-generated address: `<anything>@<your-id>.resend.app`
|
|
18
|
+
|
|
19
|
+
No DNS configuration needed. Find your address in Dashboard -> Emails -> Receiving -> "Receiving address".
|
|
20
|
+
|
|
21
|
+
### Option 2: Custom Domain
|
|
22
|
+
|
|
23
|
+
Add MX record to receive at `<anything>@yourdomain.com`.
|
|
24
|
+
|
|
25
|
+
| Setting | Value |
|
|
26
|
+
| ------------ | ---------------------------- |
|
|
27
|
+
| **Type** | MX |
|
|
28
|
+
| **Host** | Your domain or subdomain |
|
|
29
|
+
| **Value** | Provided in Resend dashboard |
|
|
30
|
+
| **Priority** | 10 (lowest number wins) |
|
|
31
|
+
|
|
32
|
+
**Critical:** Your MX record must have the lowest priority value, or emails won't route to Resend.
|
|
33
|
+
|
|
34
|
+
### Subdomain Recommendation
|
|
35
|
+
|
|
36
|
+
If you already have MX records (e.g., Google Workspace, Microsoft 365):
|
|
37
|
+
|
|
38
|
+
| Approach | Result |
|
|
39
|
+
| ------------------------------- | ------------------------------------------------------------- |
|
|
40
|
+
| **Use subdomain** (recommended) | `support.acme.com` -> Resend, `acme.com` -> existing provider |
|
|
41
|
+
| **Use root domain** | All email routes to Resend (breaks existing email) |
|
|
42
|
+
|
|
43
|
+
```dns
|
|
44
|
+
# Receive at support.acme.com without affecting acme.com
|
|
45
|
+
support.acme.com. MX 10 <resend-mx-value>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Webhook Setup
|
|
49
|
+
|
|
50
|
+
### Subscribe to `email.received`
|
|
51
|
+
|
|
52
|
+
Dashboard -> Webhooks -> Add Webhook -> Select `email.received`
|
|
53
|
+
|
|
54
|
+
For local development, use tunneling:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
ngrok http 3000
|
|
58
|
+
# Use https://abc123.ngrok.io/api/webhook as endpoint
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Webhook Payload Structure
|
|
62
|
+
|
|
63
|
+
**Important:** Payload contains metadata only, not email body or attachments.
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"type": "email.received",
|
|
68
|
+
"created_at": "2024-02-22T23:41:12.126Z",
|
|
69
|
+
"data": {
|
|
70
|
+
"email_id": "a1b2c3d4-...",
|
|
71
|
+
"from": "sender@example.com",
|
|
72
|
+
"to": ["support@acme.com"],
|
|
73
|
+
"cc": [],
|
|
74
|
+
"bcc": [],
|
|
75
|
+
"subject": "Question about my order",
|
|
76
|
+
"attachments": [
|
|
77
|
+
{
|
|
78
|
+
"id": "att_abc123",
|
|
79
|
+
"filename": "receipt.pdf",
|
|
80
|
+
"content_type": "application/pdf"
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Verify Webhook Signatures
|
|
88
|
+
|
|
89
|
+
Always verify signatures to prevent spoofed events:
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
import { Resend } from "resend";
|
|
93
|
+
|
|
94
|
+
const resend = new Resend(process.env.RESEND_API_KEY);
|
|
95
|
+
|
|
96
|
+
export async function POST(req: Request) {
|
|
97
|
+
const payload = await req.text();
|
|
98
|
+
|
|
99
|
+
const event = resend.webhooks.verify({
|
|
100
|
+
payload,
|
|
101
|
+
headers: {
|
|
102
|
+
"svix-id": req.headers.get("svix-id"),
|
|
103
|
+
"svix-timestamp": req.headers.get("svix-timestamp"),
|
|
104
|
+
"svix-signature": req.headers.get("svix-signature"),
|
|
105
|
+
},
|
|
106
|
+
secret: process.env.RESEND_WEBHOOK_SECRET,
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
if (event.type === "email.received") {
|
|
110
|
+
// Process the email
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return new Response("OK", { status: 200 });
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Retrieving Email Content
|
|
118
|
+
|
|
119
|
+
Webhooks exclude email body. Call the Receiving API:
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
if (event.type === "email.received") {
|
|
123
|
+
const { data: email } = await resend.emails.receiving.get(event.data.email_id);
|
|
124
|
+
|
|
125
|
+
console.log(email.html); // HTML body
|
|
126
|
+
console.log(email.text); // Plain text body
|
|
127
|
+
console.log(email.headers); // Email headers
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**Why this design?** Serverless environments have request body size limits. Separating content retrieval supports large emails and attachments.
|
|
132
|
+
|
|
133
|
+
## Handling Attachments
|
|
134
|
+
|
|
135
|
+
### Get Attachment Metadata and Download URLs
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
const { data: attachments } = await resend.emails.receiving.attachments.list({
|
|
139
|
+
emailId: event.data.email_id,
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
for (const attachment of attachments) {
|
|
143
|
+
console.log(attachment.filename);
|
|
144
|
+
console.log(attachment.download_url); // Valid for 1 hour
|
|
145
|
+
console.log(attachment.expires_at);
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Download Attachment Content
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
const response = await fetch(attachment.download_url);
|
|
153
|
+
const buffer = await response.arrayBuffer();
|
|
154
|
+
|
|
155
|
+
// Save to storage, process, etc.
|
|
156
|
+
await saveToStorage(attachment.filename, buffer);
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**Important:** `download_url` expires after 1 hour. Call the API again for a fresh URL if needed.
|
|
160
|
+
|
|
161
|
+
## Forwarding Emails
|
|
162
|
+
|
|
163
|
+
Complete workflow to receive and forward an email with attachments:
|
|
164
|
+
|
|
165
|
+
```typescript
|
|
166
|
+
import { Resend } from "resend";
|
|
167
|
+
|
|
168
|
+
const resend = new Resend(process.env.RESEND_API_KEY);
|
|
169
|
+
|
|
170
|
+
export async function POST(req: Request) {
|
|
171
|
+
const payload = await req.text();
|
|
172
|
+
const event = resend.webhooks.verify({
|
|
173
|
+
/* ... */
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
if (event.type === "email.received") {
|
|
177
|
+
// 1. Get email content
|
|
178
|
+
const { data: email } = await resend.emails.receiving.get(event.data.email_id);
|
|
179
|
+
|
|
180
|
+
// 2. Get attachments (if any)
|
|
181
|
+
const { data: attachmentList } = await resend.emails.receiving.attachments.list({
|
|
182
|
+
emailId: event.data.email_id,
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
// 3. Download and encode attachments
|
|
186
|
+
const attachments = await Promise.all(
|
|
187
|
+
attachmentList.map(async (att) => {
|
|
188
|
+
const res = await fetch(att.download_url);
|
|
189
|
+
const buffer = Buffer.from(await res.arrayBuffer());
|
|
190
|
+
return {
|
|
191
|
+
filename: att.filename,
|
|
192
|
+
content: buffer.toString("base64"),
|
|
193
|
+
};
|
|
194
|
+
}),
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
// 4. Forward the email
|
|
198
|
+
await resend.emails.send({
|
|
199
|
+
from: "Support System <system@acme.com>",
|
|
200
|
+
to: ["team@acme.com"],
|
|
201
|
+
subject: `Fwd: ${email.subject}`,
|
|
202
|
+
html: email.html,
|
|
203
|
+
text: email.text,
|
|
204
|
+
attachments,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return new Response("OK", { status: 200 });
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Routing by Recipient
|
|
213
|
+
|
|
214
|
+
All emails to your domain arrive at the same webhook. Route based on the `to` field:
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
if (event.type === "email.received") {
|
|
218
|
+
const recipient = event.data.to[0];
|
|
219
|
+
|
|
220
|
+
if (recipient.includes("support@")) {
|
|
221
|
+
await handleSupportEmail(event.data);
|
|
222
|
+
} else if (recipient.includes("billing@")) {
|
|
223
|
+
await handleBillingEmail(event.data);
|
|
224
|
+
} else {
|
|
225
|
+
await handleUnknownEmail(event.data);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
## Common Mistakes
|
|
231
|
+
|
|
232
|
+
| Mistake | Fix |
|
|
233
|
+
| -------------------------------------------- | ---------------------------------------------------------------- |
|
|
234
|
+
| Expecting body in webhook payload | Webhook has metadata only - call `resend.emails.receiving.get()` |
|
|
235
|
+
| MX record not lowest priority | Ensure Resend's MX has lowest number (highest priority) |
|
|
236
|
+
| Adding MX to root domain with existing email | Use subdomain to avoid breaking existing email service |
|
|
237
|
+
| Using expired download_url | URLs expire after 1 hour - call attachments API again |
|
|
238
|
+
| Not verifying webhook signatures | Always verify - attackers can send fake events |
|
|
239
|
+
| Forgetting to return 200 OK | Resend retries on non-200 responses |
|
|
240
|
+
|
|
241
|
+
## Storage Note
|
|
242
|
+
|
|
243
|
+
Resend stores received emails even if:
|
|
244
|
+
|
|
245
|
+
- Webhook isn't configured yet
|
|
246
|
+
- Webhook endpoint is down
|
|
247
|
+
|
|
248
|
+
View all received emails in Dashboard -> Emails -> Receiving tab.
|