memory-journal-mcp 7.7.0 → 8.0.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/README.md +126 -56
- package/dist/chunk-6OHRCNYW.js +3231 -0
- package/dist/chunk-JFMITANR.js +5168 -0
- package/dist/{chunk-QCQPAF4I.js → chunk-MWNLAEHR.js} +301 -4321
- package/dist/{chunk-ARLYSFSI.js → chunk-UHSO65A4.js} +4242 -6092
- package/dist/cli.js +21 -3
- package/dist/index.d.ts +16 -13
- package/dist/index.js +4 -2
- package/dist/resources-IJVKDFGS.js +2 -0
- package/dist/tools-44DGXE3V.js +2 -0
- package/dist/worker-script.js +201 -20
- package/package.json +7 -4
- package/skills/README.md +62 -25
- package/skills/adversarial-performance/SKILL.md +139 -0
- package/skills/adversarial-performance/references/audit-categories.md +462 -0
- package/skills/adversarial-performance/references/copilot-performance-prompts.md +44 -0
- package/skills/adversarial-performance/references/copilot-usage.md +16 -0
- package/skills/adversarial-performance/references/feedback-loop.md +177 -0
- package/skills/adversarial-performance/references/multi-pass-performance-protocol.md +398 -0
- package/skills/adversarial-planner/SKILL.md +23 -54
- package/skills/adversarial-planner/references/copilot-integration.md +25 -40
- package/skills/adversarial-planner/references/copilot-usage.md +16 -0
- package/skills/adversarial-planner/references/multi-pass-protocol.md +4 -0
- package/skills/adversarial-security/SKILL.md +149 -0
- package/skills/adversarial-security/references/adversarial-base-protocol.md +44 -0
- package/skills/adversarial-security/references/audit-categories.md +723 -0
- package/skills/adversarial-security/references/copilot-security-prompts.md +142 -0
- package/skills/adversarial-security/references/copilot-usage.md +16 -0
- package/skills/adversarial-security/references/feedback-loop.md +206 -0
- package/skills/adversarial-security/references/journal-opt-out.md +7 -0
- package/skills/adversarial-security/references/multi-pass-security-protocol.md +403 -0
- package/skills/adversarial-skill-audit/SKILL.md +118 -0
- package/skills/adversarial-skill-audit/references/audit-categories.md +308 -0
- package/skills/adversarial-skill-audit/references/copilot-skill-prompts.md +68 -0
- package/skills/adversarial-skill-audit/references/copilot-usage.md +16 -0
- package/skills/adversarial-skill-audit/references/feedback-loop.md +155 -0
- package/skills/adversarial-skill-audit/references/multi-pass-skill-protocol.md +367 -0
- package/skills/adversarial-skill-audit/scripts/check-skills.ps1 +48 -0
- package/skills/adversarial-skill-audit/scripts/run-copilot.ps1 +52 -0
- package/skills/adversarial-workflow-audit/SKILL.md +82 -0
- package/skills/adversarial-workflow-audit/references/audit-categories.md +28 -0
- package/skills/adversarial-workflow-audit/references/copilot-usage.md +16 -0
- package/skills/adversarial-workflow-audit/scripts/check-workflows.ps1 +24 -0
- package/skills/agents-sdk/SKILL.md +220 -0
- package/skills/agents-sdk/references/callable.md +92 -0
- package/skills/agents-sdk/references/codemode.md +209 -0
- package/skills/agents-sdk/references/email.md +144 -0
- package/skills/agents-sdk/references/mcp/SKILL.md +65 -0
- package/skills/agents-sdk/references/mcp/code-mode-reference.md +245 -0
- package/skills/agents-sdk/references/mcp/oauth-reference.md +359 -0
- package/skills/agents-sdk/references/mcp/references/architecture-reference.md +208 -0
- package/skills/agents-sdk/references/mcp/references/cloudflare-quickstart.md +156 -0
- package/skills/agents-sdk/references/mcp/references/error-handling.md +343 -0
- package/skills/agents-sdk/references/mcp/references/http-security.md +164 -0
- package/skills/agents-sdk/references/mcp/references/implementation-guide.md +507 -0
- package/skills/agents-sdk/references/mcp/references/testing-reference.md +171 -0
- package/skills/agents-sdk/references/mcp.md +157 -0
- package/skills/agents-sdk/references/state-scheduling.md +164 -0
- package/skills/agents-sdk/references/streaming-chat.md +168 -0
- package/skills/agents-sdk/references/workflows.md +136 -0
- package/skills/auth-identity/SKILL.md +48 -0
- package/skills/autonomous-dev/SKILL.md +46 -23
- package/skills/autonomous-dev/references/workflow_orchestration.md +22 -0
- package/skills/aws/SKILL.md +39 -0
- package/skills/azure/SKILL.md +38 -0
- package/skills/bin/sync.js +7 -1
- package/skills/biome/SKILL.md +59 -0
- package/skills/bun/SKILL.md +8 -2
- package/skills/cloudflare/SKILL.md +37 -0
- package/skills/cloudflare/references/agents-sdk/README.md +95 -0
- package/skills/cloudflare/references/agents-sdk/api.md +195 -0
- package/skills/cloudflare/references/agents-sdk/configuration.md +178 -0
- package/skills/cloudflare/references/agents-sdk/gotchas.md +173 -0
- package/skills/cloudflare/references/agents-sdk/patterns.md +215 -0
- package/skills/cloudflare/references/ai-gateway/README.md +176 -0
- package/skills/cloudflare/references/ai-gateway/configuration.md +117 -0
- package/skills/cloudflare/references/ai-gateway/dynamic-routing.md +88 -0
- package/skills/cloudflare/references/ai-gateway/features.md +96 -0
- package/skills/cloudflare/references/ai-gateway/sdk-integration.md +110 -0
- package/skills/cloudflare/references/ai-gateway/troubleshooting.md +90 -0
- package/skills/cloudflare/references/ai-search/README.md +145 -0
- package/skills/cloudflare/references/ai-search/api.md +87 -0
- package/skills/cloudflare/references/ai-search/configuration.md +91 -0
- package/skills/cloudflare/references/ai-search/gotchas.md +92 -0
- package/skills/cloudflare/references/ai-search/patterns.md +87 -0
- package/skills/cloudflare/references/analytics-engine/README.md +96 -0
- package/skills/cloudflare/references/analytics-engine/api.md +112 -0
- package/skills/cloudflare/references/analytics-engine/configuration.md +107 -0
- package/skills/cloudflare/references/analytics-engine/gotchas.md +87 -0
- package/skills/cloudflare/references/analytics-engine/patterns.md +83 -0
- package/skills/cloudflare/references/api/README.md +66 -0
- package/skills/cloudflare/references/api/api.md +205 -0
- package/skills/cloudflare/references/api/configuration.md +158 -0
- package/skills/cloudflare/references/api/gotchas.md +231 -0
- package/skills/cloudflare/references/api/patterns.md +208 -0
- package/skills/cloudflare/references/api-shield/README.md +44 -0
- package/skills/cloudflare/references/api-shield/api.md +153 -0
- package/skills/cloudflare/references/api-shield/configuration.md +210 -0
- package/skills/cloudflare/references/api-shield/gotchas.md +132 -0
- package/skills/cloudflare/references/api-shield/patterns.md +185 -0
- package/skills/cloudflare/references/argo-smart-routing/README.md +96 -0
- package/skills/cloudflare/references/argo-smart-routing/api.md +253 -0
- package/skills/cloudflare/references/argo-smart-routing/configuration.md +205 -0
- package/skills/cloudflare/references/argo-smart-routing/gotchas.md +115 -0
- package/skills/cloudflare/references/argo-smart-routing/patterns.md +107 -0
- package/skills/cloudflare/references/bindings/README.md +127 -0
- package/skills/cloudflare/references/bindings/api.md +214 -0
- package/skills/cloudflare/references/bindings/configuration.md +200 -0
- package/skills/cloudflare/references/bindings/gotchas.md +210 -0
- package/skills/cloudflare/references/bindings/patterns.md +205 -0
- package/skills/cloudflare/references/bot-management/README.md +95 -0
- package/skills/cloudflare/references/bot-management/api.md +175 -0
- package/skills/cloudflare/references/bot-management/configuration.md +175 -0
- package/skills/cloudflare/references/bot-management/gotchas.md +116 -0
- package/skills/cloudflare/references/bot-management/patterns.md +181 -0
- package/skills/cloudflare/references/browser-rendering/README.md +84 -0
- package/skills/cloudflare/references/browser-rendering/api.md +108 -0
- package/skills/cloudflare/references/browser-rendering/configuration.md +78 -0
- package/skills/cloudflare/references/browser-rendering/gotchas.md +91 -0
- package/skills/cloudflare/references/browser-rendering/patterns.md +93 -0
- package/skills/cloudflare/references/c3/README.md +111 -0
- package/skills/cloudflare/references/c3/api.md +71 -0
- package/skills/cloudflare/references/c3/configuration.md +85 -0
- package/skills/cloudflare/references/c3/gotchas.md +97 -0
- package/skills/cloudflare/references/c3/patterns.md +84 -0
- package/skills/cloudflare/references/cache-reserve/README.md +150 -0
- package/skills/cloudflare/references/cache-reserve/api.md +184 -0
- package/skills/cloudflare/references/cache-reserve/configuration.md +170 -0
- package/skills/cloudflare/references/cache-reserve/gotchas.md +136 -0
- package/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
- package/skills/cloudflare/references/containers/README.md +87 -0
- package/skills/cloudflare/references/containers/api.md +197 -0
- package/skills/cloudflare/references/containers/configuration.md +191 -0
- package/skills/cloudflare/references/containers/gotchas.md +182 -0
- package/skills/cloudflare/references/containers/patterns.md +204 -0
- package/skills/cloudflare/references/cron-triggers/README.md +101 -0
- package/skills/cloudflare/references/cron-triggers/api.md +224 -0
- package/skills/cloudflare/references/cron-triggers/configuration.md +190 -0
- package/skills/cloudflare/references/cron-triggers/gotchas.md +207 -0
- package/skills/cloudflare/references/cron-triggers/patterns.md +274 -0
- package/skills/cloudflare/references/d1/README.md +137 -0
- package/skills/cloudflare/references/d1/api.md +213 -0
- package/skills/cloudflare/references/d1/configuration.md +198 -0
- package/skills/cloudflare/references/d1/gotchas.md +98 -0
- package/skills/cloudflare/references/d1/patterns.md +240 -0
- package/skills/cloudflare/references/ddos/README.md +42 -0
- package/skills/cloudflare/references/ddos/api.md +158 -0
- package/skills/cloudflare/references/ddos/configuration.md +94 -0
- package/skills/cloudflare/references/ddos/gotchas.md +114 -0
- package/skills/cloudflare/references/ddos/patterns.md +220 -0
- package/skills/cloudflare/references/decision-trees.md +95 -0
- package/skills/cloudflare/references/do-storage/README.md +79 -0
- package/skills/cloudflare/references/do-storage/api.md +107 -0
- package/skills/cloudflare/references/do-storage/configuration.md +114 -0
- package/skills/cloudflare/references/do-storage/gotchas.md +153 -0
- package/skills/cloudflare/references/do-storage/patterns.md +210 -0
- package/skills/cloudflare/references/do-storage/testing.md +186 -0
- package/skills/cloudflare/references/durable-objects/README.md +194 -0
- package/skills/cloudflare/references/durable-objects/api.md +205 -0
- package/skills/cloudflare/references/durable-objects/configuration.md +160 -0
- package/skills/cloudflare/references/durable-objects/gotchas.md +200 -0
- package/skills/cloudflare/references/durable-objects/patterns.md +205 -0
- package/skills/cloudflare/references/email-routing/README.md +89 -0
- package/skills/cloudflare/references/email-routing/api.md +192 -0
- package/skills/cloudflare/references/email-routing/configuration.md +187 -0
- package/skills/cloudflare/references/email-routing/gotchas.md +203 -0
- package/skills/cloudflare/references/email-routing/patterns.md +241 -0
- package/skills/cloudflare/references/email-workers/README.md +153 -0
- package/skills/cloudflare/references/email-workers/api.md +227 -0
- package/skills/cloudflare/references/email-workers/configuration.md +115 -0
- package/skills/cloudflare/references/email-workers/gotchas.md +133 -0
- package/skills/cloudflare/references/email-workers/patterns.md +108 -0
- package/skills/cloudflare/references/graphql-api/README.md +147 -0
- package/skills/cloudflare/references/graphql-api/api.md +175 -0
- package/skills/cloudflare/references/graphql-api/configuration.md +151 -0
- package/skills/cloudflare/references/graphql-api/gotchas.md +111 -0
- package/skills/cloudflare/references/graphql-api/patterns.md +276 -0
- package/skills/cloudflare/references/hyperdrive/README.md +84 -0
- package/skills/cloudflare/references/hyperdrive/api.md +149 -0
- package/skills/cloudflare/references/hyperdrive/configuration.md +166 -0
- package/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
- package/skills/cloudflare/references/hyperdrive/patterns.md +203 -0
- package/skills/cloudflare/references/images/README.md +65 -0
- package/skills/cloudflare/references/images/api.md +101 -0
- package/skills/cloudflare/references/images/configuration.md +206 -0
- package/skills/cloudflare/references/images/gotchas.md +106 -0
- package/skills/cloudflare/references/images/patterns.md +126 -0
- package/skills/cloudflare/references/kv/README.md +90 -0
- package/skills/cloudflare/references/kv/api.md +163 -0
- package/skills/cloudflare/references/kv/configuration.md +148 -0
- package/skills/cloudflare/references/kv/gotchas.md +133 -0
- package/skills/cloudflare/references/kv/patterns.md +195 -0
- package/skills/cloudflare/references/miniflare/README.md +113 -0
- package/skills/cloudflare/references/miniflare/api.md +204 -0
- package/skills/cloudflare/references/miniflare/configuration.md +174 -0
- package/skills/cloudflare/references/miniflare/gotchas.md +179 -0
- package/skills/cloudflare/references/miniflare/patterns.md +187 -0
- package/skills/cloudflare/references/network-interconnect/README.md +104 -0
- package/skills/cloudflare/references/network-interconnect/api.md +220 -0
- package/skills/cloudflare/references/network-interconnect/configuration.md +123 -0
- package/skills/cloudflare/references/network-interconnect/gotchas.md +175 -0
- package/skills/cloudflare/references/network-interconnect/patterns.md +174 -0
- package/skills/cloudflare/references/observability/README.md +93 -0
- package/skills/cloudflare/references/observability/api.md +168 -0
- package/skills/cloudflare/references/observability/configuration.md +178 -0
- package/skills/cloudflare/references/observability/gotchas.md +125 -0
- package/skills/cloudflare/references/observability/patterns.md +105 -0
- package/skills/cloudflare/references/pages/README.md +92 -0
- package/skills/cloudflare/references/pages/api.md +205 -0
- package/skills/cloudflare/references/pages/configuration.md +216 -0
- package/skills/cloudflare/references/pages/gotchas.md +218 -0
- package/skills/cloudflare/references/pages/patterns.md +215 -0
- package/skills/cloudflare/references/pages-functions/README.md +104 -0
- package/skills/cloudflare/references/pages-functions/api.md +159 -0
- package/skills/cloudflare/references/pages-functions/configuration.md +130 -0
- package/skills/cloudflare/references/pages-functions/gotchas.md +102 -0
- package/skills/cloudflare/references/pages-functions/patterns.md +148 -0
- package/skills/cloudflare/references/pipelines/README.md +109 -0
- package/skills/cloudflare/references/pipelines/api.md +214 -0
- package/skills/cloudflare/references/pipelines/configuration.md +98 -0
- package/skills/cloudflare/references/pipelines/gotchas.md +84 -0
- package/skills/cloudflare/references/pipelines/patterns.md +87 -0
- package/skills/cloudflare/references/product-index.md +112 -0
- package/skills/cloudflare/references/pulumi/README.md +113 -0
- package/skills/cloudflare/references/pulumi/api.md +230 -0
- package/skills/cloudflare/references/pulumi/configuration.md +213 -0
- package/skills/cloudflare/references/pulumi/gotchas.md +205 -0
- package/skills/cloudflare/references/pulumi/patterns.md +260 -0
- package/skills/cloudflare/references/queues/README.md +99 -0
- package/skills/cloudflare/references/queues/api.md +211 -0
- package/skills/cloudflare/references/queues/configuration.md +151 -0
- package/skills/cloudflare/references/queues/gotchas.md +210 -0
- package/skills/cloudflare/references/queues/patterns.md +220 -0
- package/skills/cloudflare/references/r2/README.md +97 -0
- package/skills/cloudflare/references/r2/api.md +235 -0
- package/skills/cloudflare/references/r2/configuration.md +176 -0
- package/skills/cloudflare/references/r2/gotchas.md +190 -0
- package/skills/cloudflare/references/r2/patterns.md +203 -0
- package/skills/cloudflare/references/r2-data-catalog/README.md +157 -0
- package/skills/cloudflare/references/r2-data-catalog/api.md +199 -0
- package/skills/cloudflare/references/r2-data-catalog/configuration.md +205 -0
- package/skills/cloudflare/references/r2-data-catalog/gotchas.md +170 -0
- package/skills/cloudflare/references/r2-data-catalog/patterns.md +191 -0
- package/skills/cloudflare/references/r2-sql/README.md +138 -0
- package/skills/cloudflare/references/r2-sql/SKILL.md.backup +512 -0
- package/skills/cloudflare/references/r2-sql/api.md +159 -0
- package/skills/cloudflare/references/r2-sql/configuration.md +152 -0
- package/skills/cloudflare/references/r2-sql/gotchas.md +228 -0
- package/skills/cloudflare/references/r2-sql/patterns.md +230 -0
- package/skills/cloudflare/references/realtime-sfu/README.md +66 -0
- package/skills/cloudflare/references/realtime-sfu/api.md +164 -0
- package/skills/cloudflare/references/realtime-sfu/configuration.md +141 -0
- package/skills/cloudflare/references/realtime-sfu/gotchas.md +138 -0
- package/skills/cloudflare/references/realtime-sfu/patterns.md +187 -0
- package/skills/cloudflare/references/realtimekit/README.md +118 -0
- package/skills/cloudflare/references/realtimekit/api.md +234 -0
- package/skills/cloudflare/references/realtimekit/configuration.md +226 -0
- package/skills/cloudflare/references/realtimekit/gotchas.md +206 -0
- package/skills/cloudflare/references/realtimekit/patterns.md +240 -0
- package/skills/cloudflare/references/sandbox/README.md +104 -0
- package/skills/cloudflare/references/sandbox/api.md +200 -0
- package/skills/cloudflare/references/sandbox/configuration.md +154 -0
- package/skills/cloudflare/references/sandbox/gotchas.md +201 -0
- package/skills/cloudflare/references/sandbox/patterns.md +195 -0
- package/skills/cloudflare/references/secrets-store/README.md +77 -0
- package/skills/cloudflare/references/secrets-store/api.md +199 -0
- package/skills/cloudflare/references/secrets-store/configuration.md +187 -0
- package/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
- package/skills/cloudflare/references/secrets-store/patterns.md +218 -0
- package/skills/cloudflare/references/smart-placement/README.md +143 -0
- package/skills/cloudflare/references/smart-placement/api.md +192 -0
- package/skills/cloudflare/references/smart-placement/configuration.md +202 -0
- package/skills/cloudflare/references/smart-placement/gotchas.md +180 -0
- package/skills/cloudflare/references/smart-placement/patterns.md +190 -0
- package/skills/cloudflare/references/snippets/README.md +74 -0
- package/skills/cloudflare/references/snippets/api.md +214 -0
- package/skills/cloudflare/references/snippets/configuration.md +239 -0
- package/skills/cloudflare/references/snippets/gotchas.md +104 -0
- package/skills/cloudflare/references/snippets/patterns.md +135 -0
- package/skills/cloudflare/references/spectrum/README.md +52 -0
- package/skills/cloudflare/references/spectrum/api.md +184 -0
- package/skills/cloudflare/references/spectrum/configuration.md +203 -0
- package/skills/cloudflare/references/spectrum/gotchas.md +155 -0
- package/skills/cloudflare/references/spectrum/patterns.md +206 -0
- package/skills/cloudflare/references/static-assets/README.md +65 -0
- package/skills/cloudflare/references/static-assets/api.md +201 -0
- package/skills/cloudflare/references/static-assets/configuration.md +186 -0
- package/skills/cloudflare/references/static-assets/gotchas.md +164 -0
- package/skills/cloudflare/references/static-assets/patterns.md +189 -0
- package/skills/cloudflare/references/stream/README.md +123 -0
- package/skills/cloudflare/references/stream/api-live.md +202 -0
- package/skills/cloudflare/references/stream/api.md +206 -0
- package/skills/cloudflare/references/stream/configuration.md +151 -0
- package/skills/cloudflare/references/stream/gotchas.md +139 -0
- package/skills/cloudflare/references/stream/patterns.md +217 -0
- package/skills/cloudflare/references/tail-workers/README.md +92 -0
- package/skills/cloudflare/references/tail-workers/api.md +203 -0
- package/skills/cloudflare/references/tail-workers/configuration.md +178 -0
- package/skills/cloudflare/references/tail-workers/gotchas.md +206 -0
- package/skills/cloudflare/references/tail-workers/patterns.md +190 -0
- package/skills/cloudflare/references/terraform/README.md +100 -0
- package/skills/cloudflare/references/terraform/api.md +178 -0
- package/skills/cloudflare/references/terraform/configuration.md +197 -0
- package/skills/cloudflare/references/terraform/gotchas.md +150 -0
- package/skills/cloudflare/references/terraform/patterns.md +174 -0
- package/skills/cloudflare/references/tunnel/README.md +137 -0
- package/skills/cloudflare/references/tunnel/api.md +205 -0
- package/skills/cloudflare/references/tunnel/configuration.md +163 -0
- package/skills/cloudflare/references/tunnel/gotchas.md +159 -0
- package/skills/cloudflare/references/tunnel/networking.md +174 -0
- package/skills/cloudflare/references/tunnel/patterns.md +199 -0
- package/skills/cloudflare/references/turn/README.md +86 -0
- package/skills/cloudflare/references/turn/api.md +236 -0
- package/skills/cloudflare/references/turn/configuration.md +181 -0
- package/skills/cloudflare/references/turn/gotchas.md +236 -0
- package/skills/cloudflare/references/turn/patterns.md +228 -0
- package/skills/cloudflare/references/turnstile/README.md +102 -0
- package/skills/cloudflare/references/turnstile/api.md +253 -0
- package/skills/cloudflare/references/turnstile/configuration.md +242 -0
- package/skills/cloudflare/references/turnstile/gotchas.md +253 -0
- package/skills/cloudflare/references/turnstile/patterns.md +195 -0
- package/skills/cloudflare/references/vectorize/README.md +133 -0
- package/skills/cloudflare/references/vectorize/api.md +89 -0
- package/skills/cloudflare/references/vectorize/configuration.md +91 -0
- package/skills/cloudflare/references/vectorize/gotchas.md +83 -0
- package/skills/cloudflare/references/vectorize/patterns.md +92 -0
- package/skills/cloudflare/references/waf/README.md +125 -0
- package/skills/cloudflare/references/waf/api.md +203 -0
- package/skills/cloudflare/references/waf/configuration.md +215 -0
- package/skills/cloudflare/references/waf/gotchas.md +208 -0
- package/skills/cloudflare/references/waf/patterns.md +236 -0
- package/skills/cloudflare/references/web-analytics/README.md +149 -0
- package/skills/cloudflare/references/web-analytics/configuration.md +81 -0
- package/skills/cloudflare/references/web-analytics/gotchas.md +86 -0
- package/skills/cloudflare/references/web-analytics/integration.md +63 -0
- package/skills/cloudflare/references/web-analytics/patterns.md +98 -0
- package/skills/cloudflare/references/workerd/README.md +85 -0
- package/skills/cloudflare/references/workerd/api.md +219 -0
- package/skills/cloudflare/references/workerd/configuration.md +200 -0
- package/skills/cloudflare/references/workerd/gotchas.md +151 -0
- package/skills/cloudflare/references/workerd/patterns.md +205 -0
- package/skills/cloudflare/references/workers/README.md +110 -0
- package/skills/cloudflare/references/workers/api.md +197 -0
- package/skills/cloudflare/references/workers/configuration.md +184 -0
- package/skills/cloudflare/references/workers/frameworks.md +200 -0
- package/skills/cloudflare/references/workers/gotchas.md +145 -0
- package/skills/cloudflare/references/workers/patterns.md +220 -0
- package/skills/cloudflare/references/workers-ai/README.md +206 -0
- package/skills/cloudflare/references/workers-ai/api.md +115 -0
- package/skills/cloudflare/references/workers-ai/configuration.md +98 -0
- package/skills/cloudflare/references/workers-ai/gotchas.md +130 -0
- package/skills/cloudflare/references/workers-ai/patterns.md +122 -0
- package/skills/cloudflare/references/workers-for-platforms/README.md +95 -0
- package/skills/cloudflare/references/workers-for-platforms/api.md +212 -0
- package/skills/cloudflare/references/workers-for-platforms/configuration.md +178 -0
- package/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
- package/skills/cloudflare/references/workers-for-platforms/patterns.md +210 -0
- package/skills/cloudflare/references/workers-playground/README.md +131 -0
- package/skills/cloudflare/references/workers-playground/api.md +101 -0
- package/skills/cloudflare/references/workers-playground/configuration.md +169 -0
- package/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
- package/skills/cloudflare/references/workers-playground/patterns.md +134 -0
- package/skills/cloudflare/references/workers-vpc/README.md +130 -0
- package/skills/cloudflare/references/workers-vpc/api.md +196 -0
- package/skills/cloudflare/references/workers-vpc/configuration.md +151 -0
- package/skills/cloudflare/references/workers-vpc/gotchas.md +171 -0
- package/skills/cloudflare/references/workers-vpc/patterns.md +235 -0
- package/skills/cloudflare/references/workflows/README.md +72 -0
- package/skills/cloudflare/references/workflows/api.md +237 -0
- package/skills/cloudflare/references/workflows/configuration.md +158 -0
- package/skills/cloudflare/references/workflows/gotchas.md +97 -0
- package/skills/cloudflare/references/workflows/patterns.md +245 -0
- package/skills/cloudflare/references/wrangler/README.md +143 -0
- package/skills/cloudflare/references/wrangler/api.md +188 -0
- package/skills/cloudflare/references/wrangler/configuration.md +198 -0
- package/skills/cloudflare/references/wrangler/gotchas.md +212 -0
- package/skills/cloudflare/references/wrangler/patterns.md +211 -0
- package/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +131 -0
- package/skills/cloudflare/references/zaraz/README.md +114 -0
- package/skills/cloudflare/references/zaraz/api.md +118 -0
- package/skills/cloudflare/references/zaraz/configuration.md +94 -0
- package/skills/cloudflare/references/zaraz/gotchas.md +88 -0
- package/skills/cloudflare/references/zaraz/patterns.md +77 -0
- package/skills/docker/SKILL.md +7 -101
- package/skills/docker/references/advanced-examples.md +71 -0
- package/skills/docker/references/templates.md +34 -0
- package/skills/docs-marketer/SKILL.md +178 -0
- package/skills/docs-marketer/references/audit-categories.md +328 -0
- package/skills/docs-marketer/references/copilot-docs-prompts.md +88 -0
- package/skills/docs-marketer/references/copilot-usage.md +16 -0
- package/skills/docs-marketer/references/feedback-loop.md +155 -0
- package/skills/docs-marketer/references/multi-pass-docs-protocol.md +410 -0
- package/skills/drizzle-orm/SKILL.md +82 -0
- package/skills/durable-objects/SKILL.md +167 -0
- package/skills/durable-objects/references/advanced_features.md +29 -0
- package/skills/durable-objects/references/rules.md +300 -0
- package/skills/durable-objects/references/testing.md +261 -0
- package/skills/durable-objects/references/workers.md +336 -0
- package/skills/gcp/SKILL.md +37 -0
- package/skills/github-actions/SKILL.md +5 -58
- package/skills/github-actions/references/templates.md +65 -0
- package/skills/github-commander/SKILL.md +13 -21
- package/skills/github-commander/workflows/copilot-audit.md +12 -12
- package/skills/github-copilot-cli/SKILL.md +21 -26
- package/skills/github-repo-setup/SKILL.md +136 -0
- package/skills/github-repo-setup/references/community-standards.md +136 -0
- package/skills/github-repo-setup/references/github-automation.md +490 -0
- package/skills/github-repo-setup/references/inline-templates.md +205 -0
- package/skills/github-repo-setup/references/project-config.md +320 -0
- package/skills/gitlab/SKILL.md +7 -2
- package/skills/gitlab/package-lock.json +389 -389
- package/skills/golang/SKILL.md +8 -1
- package/skills/graphql/SKILL.md +30 -0
- package/skills/hono/SKILL.md +82 -0
- package/skills/journal-optimizer/SKILL.md +206 -0
- package/skills/journal-optimizer/references/optimizer-scripts.md +169 -0
- package/skills/llm-app-engineering/SKILL.md +18 -0
- package/skills/monorepo/SKILL.md +56 -0
- package/skills/multi-agent-orchestration/SKILL.md +14 -0
- package/skills/mysql/SKILL.md +6 -2
- package/skills/next-best-practices/SKILL.md +86 -0
- package/skills/next-best-practices/references/cache-components-examples.md +234 -0
- package/skills/next-best-practices/references/cache-components.md +210 -0
- package/skills/next-best-practices/references/upgrade-decision-tree.md +33 -0
- package/skills/next-best-practices/references/upgrade.md +43 -0
- package/skills/next-cache-components/SKILL.md +441 -0
- package/skills/next-upgrade/SKILL.md +43 -0
- package/skills/next-upgrade/references/decision-tree.md +33 -0
- package/skills/nodejs/SKILL.md +46 -0
- package/skills/opentelemetry/SKILL.md +62 -0
- package/skills/package.json +39 -4
- package/skills/playwright-standard/SKILL.md +6 -11
- package/skills/playwright-standard/references/locators.md +7 -0
- package/skills/postgres/SKILL.md +6 -1
- package/skills/python/SKILL.md +8 -70
- package/skills/python/references/advanced-patterns.md +37 -0
- package/skills/python/references/config-templates.md +48 -0
- package/skills/rag-pipelines/SKILL.md +14 -0
- package/skills/redis/SKILL.md +31 -0
- package/skills/render/SKILL.md +35 -0
- package/skills/rust/SKILL.md +15 -25
- package/skills/rust/references/borrow-checker.md +13 -0
- package/skills/rust/references/ecosystem.md +11 -0
- package/skills/sandbox-sdk/SKILL.md +186 -0
- package/skills/sandbox-sdk/references/api-quick-ref.md +113 -0
- package/skills/sandbox-sdk/references/examples.md +52 -0
- package/skills/shadcn-ui/SKILL.md +22 -57
- package/skills/skill-builder/SKILL.md +23 -424
- package/skills/skill-builder/references/tutorial.md +457 -0
- package/skills/sqlite/SKILL.md +16 -5
- package/skills/table.md +59 -0
- package/skills/tailwind-css/SKILL.md +11 -60
- package/skills/tailwind-css/references/component-patterns.md +52 -0
- package/skills/trpc/SKILL.md +56 -0
- package/skills/typescript/SKILL.md +30 -433
- package/skills/typescript/references/tutorial.md +453 -0
- package/skills/vercel-ai-sdk/SKILL.md +48 -0
- package/skills/vitest-standard/SKILL.md +5 -11
- package/skills/vitest-standard/references/assertions.md +11 -0
- package/skills/web-perf/SKILL.md +207 -0
- package/skills/workers-best-practices/SKILL.md +120 -0
- package/skills/workers-best-practices/references/anti-patterns.md +18 -0
- package/skills/workers-best-practices/references/review.md +174 -0
- package/skills/workers-best-practices/references/rules.md +485 -0
- package/skills/wrangler/SKILL.md +43 -0
- package/skills/wrangler/references/cli-commands.md +861 -0
- package/skills/zod/SKILL.md +48 -0
- package/dist/tools-P4VGG4FH.js +0 -1
- package/skills/react-best-practices/AGENTS.md +0 -2883
- package/skills/react-best-practices/SKILL.md +0 -138
- /package/skills/{react-best-practices → next-best-practices}/README.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/metadata.json +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/_sections.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/_template.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-event-handler-refs.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-init-once.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-use-latest.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-api-routes.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-defer-await.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-dependencies.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-parallel.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-suspense-boundaries.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-barrel-imports.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-conditional.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-defer-third-party.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-dynamic-imports.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-preload.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-event-listeners.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-localstorage-schema.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-passive-event-listeners.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-swr-dedup.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-batch-dom-css.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-function-results.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-property-access.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-storage.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-combine-iterations.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-early-exit.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-hoist-regexp.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-index-maps.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-length-check-first.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-min-max-loop.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-set-map-lookups.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-tosorted-immutable.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-activity.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-animate-svg-wrapper.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-conditional-render.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-content-visibility.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hoist-jsx.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hydration-no-flicker.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hydration-suppress-warning.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-svg-precision.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-usetransition-loading.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-defer-reads.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-dependencies.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-derived-state-no-effect.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-derived-state.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-functional-setstate.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-lazy-state-init.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-memo-with-default-value.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-memo.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-move-effect-to-event.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-simple-expression-in-memo.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-transitions.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-use-ref-transient-values.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-after-nonblocking.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-auth-actions.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-cache-lru.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-cache-react.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-dedup-props.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-parallel-fetching.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-serialization.md +0 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# Cloudflare Email Workers
|
|
2
|
+
|
|
3
|
+
Process incoming emails programmatically using Cloudflare Workers runtime.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Email Workers enable custom email processing logic at the edge. Build spam filters, auto-responders, ticket systems, notification handlers, and more using the same Workers runtime you use for HTTP requests.
|
|
8
|
+
|
|
9
|
+
**Key capabilities**:
|
|
10
|
+
|
|
11
|
+
- Process inbound emails with full message access
|
|
12
|
+
- Forward to verified destinations
|
|
13
|
+
- Send replies with proper threading
|
|
14
|
+
- Parse MIME content and attachments
|
|
15
|
+
- Integrate with KV, R2, D1, and external APIs
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
### Minimal ES Modules Handler
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
export default {
|
|
23
|
+
async email(message, env, ctx) {
|
|
24
|
+
// Reject spam
|
|
25
|
+
if (message.from.includes('spam.com')) {
|
|
26
|
+
message.setReject('Blocked')
|
|
27
|
+
return
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Forward to inbox
|
|
31
|
+
await message.forward('inbox@example.com')
|
|
32
|
+
},
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Core Operations
|
|
37
|
+
|
|
38
|
+
| Operation | Method | Use Case |
|
|
39
|
+
| --------- | ------------------------------- | ---------------------------------- |
|
|
40
|
+
| Forward | `message.forward(to, headers?)` | Route to verified destination |
|
|
41
|
+
| Reject | `message.setReject(reason)` | Block with SMTP error |
|
|
42
|
+
| Reply | `message.reply(emailMessage)` | Auto-respond with threading |
|
|
43
|
+
| Parse | postal-mime library | Extract subject, body, attachments |
|
|
44
|
+
|
|
45
|
+
## Reading Order
|
|
46
|
+
|
|
47
|
+
For comprehensive understanding, read files in this order:
|
|
48
|
+
|
|
49
|
+
1. **README.md** (this file) - Overview and quick start
|
|
50
|
+
2. **configuration.md** - Setup, deployment, bindings
|
|
51
|
+
3. **api.md** - Complete API reference
|
|
52
|
+
4. **patterns.md** - Real-world implementation examples
|
|
53
|
+
5. **gotchas.md** - Critical pitfalls and debugging
|
|
54
|
+
|
|
55
|
+
## In This Reference
|
|
56
|
+
|
|
57
|
+
| File | Description | Key Topics |
|
|
58
|
+
| -------------------------------------- | ----------------------- | ------------------------------------------------------------------------------------------- |
|
|
59
|
+
| [api.md](./api.md) | Complete API reference | ForwardableEmailMessage, SendEmail bindings, reply() method, postal-mime/mimetext APIs |
|
|
60
|
+
| [configuration.md](./configuration.md) | Setup and configuration | wrangler.jsonc, bindings, deployment, dependencies |
|
|
61
|
+
| [patterns.md](./patterns.md) | Real-world examples | Allowlists from KV, auto-reply with threading, attachment extraction, webhook notifications |
|
|
62
|
+
| [gotchas.md](./gotchas.md) | Pitfalls and debugging | Stream consumption, ctx.waitUntil errors, security, limits |
|
|
63
|
+
|
|
64
|
+
## Architecture
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
Incoming Email → Email Routing → Email Worker
|
|
68
|
+
↓
|
|
69
|
+
Process + Decide
|
|
70
|
+
↓
|
|
71
|
+
┌───────────────┼───────────────┐
|
|
72
|
+
↓ ↓ ↓
|
|
73
|
+
Forward Reply Reject
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Event flow**:
|
|
77
|
+
|
|
78
|
+
1. Email arrives at your domain
|
|
79
|
+
2. Email Routing matches route (e.g., `support@example.com`)
|
|
80
|
+
3. Bound Email Worker receives `ForwardableEmailMessage`
|
|
81
|
+
4. Worker processes and takes action (forward/reply/reject)
|
|
82
|
+
5. Email delivered or rejected based on worker logic
|
|
83
|
+
|
|
84
|
+
## Key Concepts
|
|
85
|
+
|
|
86
|
+
### Envelope vs Headers
|
|
87
|
+
|
|
88
|
+
- **Envelope addresses** (`message.from`, `message.to`): SMTP transport addresses (trusted)
|
|
89
|
+
- **Header addresses** (parsed from body): Display addresses (can be spoofed)
|
|
90
|
+
|
|
91
|
+
Use envelope addresses for security decisions.
|
|
92
|
+
|
|
93
|
+
### Single-Use Streams
|
|
94
|
+
|
|
95
|
+
`message.raw` is a ReadableStream that can only be read once. Buffer to ArrayBuffer for multiple uses.
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
// Buffer first
|
|
99
|
+
const buffer = await new Response(message.raw).arrayBuffer()
|
|
100
|
+
const email = await PostalMime.parse(buffer)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
See [gotchas.md](./gotchas.md#readablestream-can-only-be-consumed-once) for details.
|
|
104
|
+
|
|
105
|
+
### Verified Destinations
|
|
106
|
+
|
|
107
|
+
`forward()` only works with addresses verified in the Cloudflare Email Routing dashboard. Add destinations before deployment.
|
|
108
|
+
|
|
109
|
+
## Use Cases
|
|
110
|
+
|
|
111
|
+
- **Spam filtering**: Block based on sender, content, or reputation
|
|
112
|
+
- **Auto-responders**: Send acknowledgment replies with threading
|
|
113
|
+
- **Ticket creation**: Parse emails and create support tickets
|
|
114
|
+
- **Email archival**: Store in KV, R2, or D1
|
|
115
|
+
- **Notification routing**: Forward to Slack, Discord, or webhooks
|
|
116
|
+
- **Attachment processing**: Extract files to R2 storage
|
|
117
|
+
- **Multi-tenant routing**: Route based on recipient subdomain
|
|
118
|
+
- **Size filtering**: Reject oversized attachments
|
|
119
|
+
|
|
120
|
+
## Limits
|
|
121
|
+
|
|
122
|
+
| Limit | Value |
|
|
123
|
+
| -------------------- | ------ |
|
|
124
|
+
| Max message size | 25 MiB |
|
|
125
|
+
| Max routing rules | 200 |
|
|
126
|
+
| Max destinations | 200 |
|
|
127
|
+
| CPU time (free tier) | 10ms |
|
|
128
|
+
| CPU time (paid tier) | 50ms |
|
|
129
|
+
|
|
130
|
+
See [gotchas.md](./gotchas.md#limits-reference) for complete limits table.
|
|
131
|
+
|
|
132
|
+
## Prerequisites
|
|
133
|
+
|
|
134
|
+
Before deploying Email Workers:
|
|
135
|
+
|
|
136
|
+
1. **Enable Email Routing** in Cloudflare dashboard for your domain
|
|
137
|
+
2. **Verify destination addresses** for forwarding
|
|
138
|
+
3. **Configure DMARC/SPF** for sending domains (required for replies)
|
|
139
|
+
4. **Set up wrangler.jsonc** with SendEmail binding
|
|
140
|
+
|
|
141
|
+
See [configuration.md](./configuration.md) for detailed setup.
|
|
142
|
+
|
|
143
|
+
## Service Worker Syntax (Deprecated)
|
|
144
|
+
|
|
145
|
+
Modern projects should use ES modules format shown above. Service Worker syntax (`addEventListener('email', ...)`) is deprecated but still supported.
|
|
146
|
+
|
|
147
|
+
## See Also
|
|
148
|
+
|
|
149
|
+
- [Email Routing Documentation](https://developers.cloudflare.com/email-routing/)
|
|
150
|
+
- [Workers Platform](https://developers.cloudflare.com/workers/)
|
|
151
|
+
- [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/)
|
|
152
|
+
- [postal-mime on npm](https://www.npmjs.com/package/postal-mime)
|
|
153
|
+
- [mimetext on npm](https://www.npmjs.com/package/mimetext)
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# Email Workers API Reference
|
|
2
|
+
|
|
3
|
+
Complete API reference for Cloudflare Email Workers runtime.
|
|
4
|
+
|
|
5
|
+
## ForwardableEmailMessage Interface
|
|
6
|
+
|
|
7
|
+
The main interface passed to email handlers.
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
interface ForwardableEmailMessage {
|
|
11
|
+
readonly from: string // Envelope MAIL FROM (SMTP sender)
|
|
12
|
+
readonly to: string // Envelope RCPT TO (SMTP recipient)
|
|
13
|
+
readonly headers: Headers // Web-standard Headers object
|
|
14
|
+
readonly raw: ReadableStream // Raw MIME message (single-use stream)
|
|
15
|
+
readonly rawSize: number // Total message size in bytes
|
|
16
|
+
|
|
17
|
+
setReject(reason: string): void
|
|
18
|
+
forward(rcptTo: string, headers?: Headers): Promise<void>
|
|
19
|
+
reply(message: EmailMessage): Promise<void>
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Properties
|
|
24
|
+
|
|
25
|
+
| Property | Type | Description |
|
|
26
|
+
| --------- | -------------- | --------------------------------------------------- |
|
|
27
|
+
| `from` | string | Envelope sender (SMTP MAIL FROM) - use for security |
|
|
28
|
+
| `to` | string | Envelope recipient (SMTP RCPT TO) |
|
|
29
|
+
| `headers` | Headers | Message headers (Subject, Message-ID, etc.) |
|
|
30
|
+
| `raw` | ReadableStream | Raw MIME message (**single-use**, buffer first) |
|
|
31
|
+
| `rawSize` | number | Message size in bytes |
|
|
32
|
+
|
|
33
|
+
### Methods
|
|
34
|
+
|
|
35
|
+
#### setReject(reason: string): void
|
|
36
|
+
|
|
37
|
+
Reject with permanent SMTP 5xx error. Email not delivered, sender may receive bounce.
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
if (blockList.includes(message.from)) {
|
|
41
|
+
message.setReject('Sender blocked')
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
#### forward(rcptTo: string, headers?: Headers): Promise<void>
|
|
46
|
+
|
|
47
|
+
Forward to verified destination. Only `X-*` custom headers allowed.
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
await message.forward('inbox@example.com')
|
|
51
|
+
|
|
52
|
+
// With custom headers
|
|
53
|
+
const h = new Headers()
|
|
54
|
+
h.set('X-Processed-By', 'worker')
|
|
55
|
+
await message.forward('inbox@example.com', h)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
#### reply(message: EmailMessage): Promise<void>
|
|
59
|
+
|
|
60
|
+
Send a reply to the original sender (March 2025 feature).
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
import { EmailMessage } from 'cloudflare:email'
|
|
64
|
+
import { createMimeMessage } from 'mimetext'
|
|
65
|
+
|
|
66
|
+
const msg = createMimeMessage()
|
|
67
|
+
msg.setSender({ name: 'Support', addr: 'support@example.com' })
|
|
68
|
+
msg.setRecipient(message.from)
|
|
69
|
+
msg.setSubject(`Re: ${message.headers.get('Subject')}`)
|
|
70
|
+
msg.setHeader('In-Reply-To', message.headers.get('Message-ID'))
|
|
71
|
+
msg.setHeader('References', message.headers.get('References') || '')
|
|
72
|
+
msg.addMessage({
|
|
73
|
+
contentType: 'text/plain',
|
|
74
|
+
data: 'Thank you for your message.',
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
await message.reply(new EmailMessage('support@example.com', message.from, msg.asRaw()))
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Requirements**:
|
|
81
|
+
|
|
82
|
+
- Incoming email needs valid DMARC
|
|
83
|
+
- Reply once per event, recipient = `message.from`
|
|
84
|
+
- Sender domain = receiving domain, with DMARC/SPF/DKIM
|
|
85
|
+
- Max 100 `References` entries
|
|
86
|
+
- Threading: `In-Reply-To` (original Message-ID), `References`, new `Message-ID`
|
|
87
|
+
|
|
88
|
+
## EmailMessage Constructor
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
import { EmailMessage } from 'cloudflare:email';
|
|
92
|
+
|
|
93
|
+
new EmailMessage(from: string, to: string, raw: ReadableStream | string)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Used for sending emails (replies or via SendEmail binding). Domain must be verified.
|
|
97
|
+
|
|
98
|
+
## SendEmail Interface
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
interface SendEmail {
|
|
102
|
+
send(message: EmailMessage): Promise<void>
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Usage
|
|
106
|
+
await env.EMAIL.send(new EmailMessage(from, to, mimeContent))
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## SendEmail Binding Types
|
|
110
|
+
|
|
111
|
+
```jsonc
|
|
112
|
+
{
|
|
113
|
+
"send_email": [
|
|
114
|
+
{ "name": "EMAIL" }, // Type 1: Any verified address
|
|
115
|
+
{ "name": "LOGS", "destination_address": "logs@example.com" }, // Type 2: Single dest
|
|
116
|
+
{ "name": "TEAM", "allowed_destination_addresses": ["a@ex.com", "b@ex.com"] }, // Type 3: Dest allowlist
|
|
117
|
+
{ "name": "NOREPLY", "allowed_sender_addresses": ["noreply@ex.com"] }, // Type 4: Sender allowlist
|
|
118
|
+
],
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## postal-mime Parsed Output
|
|
123
|
+
|
|
124
|
+
postal-mime v2.7.3 parses incoming emails into structured data.
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
interface ParsedEmail {
|
|
128
|
+
headers: Array<{ key: string; value: string }>
|
|
129
|
+
from: { name: string; address: string } | null
|
|
130
|
+
to: Array<{ name: string; address: string }> | { name: string; address: string } | null
|
|
131
|
+
cc: Array<{ name: string; address: string }> | null
|
|
132
|
+
bcc: Array<{ name: string; address: string }> | null
|
|
133
|
+
subject: string
|
|
134
|
+
messageId: string | null
|
|
135
|
+
inReplyTo: string | null
|
|
136
|
+
references: string | null
|
|
137
|
+
date: string | null
|
|
138
|
+
html: string | null
|
|
139
|
+
text: string | null
|
|
140
|
+
attachments: Array<{
|
|
141
|
+
filename: string
|
|
142
|
+
mimeType: string
|
|
143
|
+
disposition: string | null
|
|
144
|
+
related: boolean
|
|
145
|
+
contentId: string | null
|
|
146
|
+
content: Uint8Array
|
|
147
|
+
}>
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Usage
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
import PostalMime from 'postal-mime'
|
|
155
|
+
|
|
156
|
+
const buffer = await new Response(message.raw).arrayBuffer()
|
|
157
|
+
const email = await PostalMime.parse(buffer)
|
|
158
|
+
|
|
159
|
+
console.log(email.subject)
|
|
160
|
+
console.log(email.from?.address)
|
|
161
|
+
console.log(email.text)
|
|
162
|
+
console.log(email.attachments.length)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## mimetext API Quick Reference
|
|
166
|
+
|
|
167
|
+
mimetext v3.0.27 composes outgoing emails.
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
import { createMimeMessage } from 'mimetext'
|
|
171
|
+
|
|
172
|
+
const msg = createMimeMessage()
|
|
173
|
+
|
|
174
|
+
// Sender
|
|
175
|
+
msg.setSender({ name: 'John Doe', addr: 'john@example.com' })
|
|
176
|
+
|
|
177
|
+
// Recipients
|
|
178
|
+
msg.setRecipient('alice@example.com')
|
|
179
|
+
msg.setRecipients(['bob@example.com', 'carol@example.com'])
|
|
180
|
+
msg.setCc('manager@example.com')
|
|
181
|
+
msg.setBcc(['audit@example.com'])
|
|
182
|
+
|
|
183
|
+
// Headers
|
|
184
|
+
msg.setSubject('Meeting Notes')
|
|
185
|
+
msg.setHeader('In-Reply-To', '<previous-message-id>')
|
|
186
|
+
msg.setHeader('References', '<msg1> <msg2>')
|
|
187
|
+
msg.setHeader('Message-ID', `<${crypto.randomUUID()}@example.com>`)
|
|
188
|
+
|
|
189
|
+
// Content
|
|
190
|
+
msg.addMessage({
|
|
191
|
+
contentType: 'text/plain',
|
|
192
|
+
data: 'Plain text content',
|
|
193
|
+
})
|
|
194
|
+
|
|
195
|
+
msg.addMessage({
|
|
196
|
+
contentType: 'text/html',
|
|
197
|
+
data: '<p>HTML content</p>',
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
// Attachments
|
|
201
|
+
msg.addAttachment({
|
|
202
|
+
filename: 'report.pdf',
|
|
203
|
+
contentType: 'application/pdf',
|
|
204
|
+
data: pdfBuffer, // Uint8Array or base64 string
|
|
205
|
+
})
|
|
206
|
+
|
|
207
|
+
// Generate raw MIME
|
|
208
|
+
const raw = msg.asRaw() // Returns string
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## TypeScript Types
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
import { ForwardableEmailMessage, EmailMessage } from 'cloudflare:email'
|
|
215
|
+
|
|
216
|
+
interface Env {
|
|
217
|
+
EMAIL: SendEmail
|
|
218
|
+
EMAIL_ARCHIVE: KVNamespace
|
|
219
|
+
ALLOWED_SENDERS: KVNamespace
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export default {
|
|
223
|
+
async email(message: ForwardableEmailMessage, env: Env, ctx: ExecutionContext): Promise<void> {
|
|
224
|
+
// Fully typed
|
|
225
|
+
},
|
|
226
|
+
}
|
|
227
|
+
```
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# Email Workers Configuration
|
|
2
|
+
|
|
3
|
+
## wrangler.jsonc
|
|
4
|
+
|
|
5
|
+
```jsonc
|
|
6
|
+
{
|
|
7
|
+
"name": "email-worker",
|
|
8
|
+
"main": "src/index.ts",
|
|
9
|
+
"compatibility_date": "2025-01-27",
|
|
10
|
+
"send_email": [
|
|
11
|
+
{ "name": "EMAIL" }, // Unrestricted
|
|
12
|
+
{ "name": "EMAIL_LOGS", "destination_address": "logs@example.com" }, // Single dest
|
|
13
|
+
{ "name": "EMAIL_TEAM", "allowed_destination_addresses": ["a@ex.com", "b@ex.com"] },
|
|
14
|
+
{ "name": "EMAIL_NOREPLY", "allowed_sender_addresses": ["noreply@ex.com"] },
|
|
15
|
+
],
|
|
16
|
+
"kv_namespaces": [{ "binding": "ARCHIVE", "id": "xxx" }],
|
|
17
|
+
"r2_buckets": [{ "binding": "ATTACHMENTS", "bucket_name": "email-attachments" }],
|
|
18
|
+
"vars": { "WEBHOOK_URL": "https://hooks.example.com" },
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## TypeScript Types
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
interface Env {
|
|
26
|
+
EMAIL: SendEmail
|
|
27
|
+
ARCHIVE: KVNamespace
|
|
28
|
+
ATTACHMENTS: R2Bucket
|
|
29
|
+
WEBHOOK_URL: string
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export default {
|
|
33
|
+
async email(message: ForwardableEmailMessage, env: Env, ctx: ExecutionContext) {},
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Dependencies
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm install postal-mime mimetext
|
|
41
|
+
npm install -D @cloudflare/workers-types wrangler typescript
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Use postal-mime v2.x, mimetext v3.x.
|
|
45
|
+
|
|
46
|
+
## tsconfig.json
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"compilerOptions": {
|
|
51
|
+
"target": "ES2022",
|
|
52
|
+
"module": "ES2022",
|
|
53
|
+
"lib": ["ES2022"],
|
|
54
|
+
"types": ["@cloudflare/workers-types"],
|
|
55
|
+
"moduleResolution": "bundler",
|
|
56
|
+
"strict": true
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Local Development
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
npx wrangler dev
|
|
65
|
+
|
|
66
|
+
# Test receiving
|
|
67
|
+
curl --request POST 'http://localhost:8787/cdn-cgi/handler/email' \
|
|
68
|
+
--url-query 'from=sender@example.com' --url-query 'to=recipient@example.com' \
|
|
69
|
+
--header 'Content-Type: text/plain' --data-raw 'Subject: Test\n\nHello'
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Sent emails write to local `.eml` files.
|
|
73
|
+
|
|
74
|
+
## Deployment Checklist
|
|
75
|
+
|
|
76
|
+
- [ ] Enable Email Routing in dashboard
|
|
77
|
+
- [ ] Verify destination addresses
|
|
78
|
+
- [ ] Configure DMARC/SPF/DKIM for sending
|
|
79
|
+
- [ ] Create KV/R2 resources if needed
|
|
80
|
+
- [ ] Update wrangler.jsonc with production IDs
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
npx wrangler deploy
|
|
84
|
+
npx wrangler deployments list
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Dashboard Setup
|
|
88
|
+
|
|
89
|
+
1. **Email Routing:** Domain → Email → Enable Email Routing
|
|
90
|
+
2. **Verify addresses:** Email → Destination addresses → Add & verify
|
|
91
|
+
3. **Bind Worker:** Email → Email Workers → Create route → Select pattern & Worker
|
|
92
|
+
4. **DMARC:** Add TXT `_dmarc.domain.com`: `v=DMARC1; p=quarantine;`
|
|
93
|
+
|
|
94
|
+
## Secrets
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
npx wrangler secret put API_KEY
|
|
98
|
+
# Access: env.API_KEY
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Monitoring
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
npx wrangler tail
|
|
105
|
+
npx wrangler tail --status error
|
|
106
|
+
npx wrangler tail --format json
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Troubleshooting
|
|
110
|
+
|
|
111
|
+
| Error | Fix |
|
|
112
|
+
| --------------------- | ------------------------------------ |
|
|
113
|
+
| "Binding not found" | Check `send_email` name matches code |
|
|
114
|
+
| "Invalid destination" | Verify in Email Routing dashboard |
|
|
115
|
+
| Type errors | Install `@cloudflare/workers-types` |
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Email Workers Gotchas
|
|
2
|
+
|
|
3
|
+
## Critical Issues
|
|
4
|
+
|
|
5
|
+
### ReadableStream Single-Use
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// ❌ WRONG: Stream consumed twice
|
|
9
|
+
const email = await PostalMime.parse(await new Response(message.raw).arrayBuffer())
|
|
10
|
+
const rawText = await new Response(message.raw).text() // EMPTY!
|
|
11
|
+
|
|
12
|
+
// ✅ CORRECT: Buffer first
|
|
13
|
+
const buffer = await new Response(message.raw).arrayBuffer()
|
|
14
|
+
const email = await PostalMime.parse(buffer)
|
|
15
|
+
const rawText = new TextDecoder().decode(buffer)
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### ctx.waitUntil() Errors Silent
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
// ❌ Errors dropped silently
|
|
22
|
+
ctx.waitUntil(fetch(webhookUrl, { method: 'POST', body: data }))
|
|
23
|
+
|
|
24
|
+
// ✅ Catch and log
|
|
25
|
+
ctx.waitUntil(
|
|
26
|
+
fetch(webhookUrl, { method: 'POST', body: data }).catch((err) =>
|
|
27
|
+
env.ERROR_LOG.put(`error:${Date.now()}`, err.message)
|
|
28
|
+
)
|
|
29
|
+
)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Security
|
|
33
|
+
|
|
34
|
+
### Envelope vs Header From (Spoofing)
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
const envelopeFrom = message.from // SMTP MAIL FROM (trusted)
|
|
38
|
+
const headerFrom = (await PostalMime.parse(buffer)).from?.address // (untrusted)
|
|
39
|
+
// Use envelope for security decisions
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Input Validation
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
if (message.rawSize > 5_000_000) {
|
|
46
|
+
message.setReject('Too large')
|
|
47
|
+
return
|
|
48
|
+
}
|
|
49
|
+
if ((message.headers.get('Subject') || '').length > 1000) {
|
|
50
|
+
message.setReject('Invalid subject')
|
|
51
|
+
return
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### DMARC for Replies
|
|
56
|
+
|
|
57
|
+
Replies fail silently without DMARC. Verify: `dig TXT _dmarc.example.com`
|
|
58
|
+
|
|
59
|
+
## Parsing
|
|
60
|
+
|
|
61
|
+
### Address Parsing
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
const email = await PostalMime.parse(buffer)
|
|
65
|
+
const fromAddress = email.from?.address || 'unknown'
|
|
66
|
+
const toAddresses = Array.isArray(email.to) ? email.to.map((t) => t.address) : [email.to?.address]
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Character Encoding
|
|
70
|
+
|
|
71
|
+
Let postal-mime handle decoding - `email.subject`, `email.text`, `email.html` are UTF-8.
|
|
72
|
+
|
|
73
|
+
## API Behavior
|
|
74
|
+
|
|
75
|
+
### setReject() vs throw
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
// setReject() for SMTP rejection
|
|
79
|
+
if (blockList.includes(message.from)) {
|
|
80
|
+
message.setReject('Blocked')
|
|
81
|
+
return
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// throw for worker errors
|
|
85
|
+
if (!env.KV) throw new Error('KV not configured')
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### forward() Only X-\* Headers
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
headers.set('X-Processed-By', 'worker') // ✅ Works
|
|
92
|
+
headers.set('Subject', 'Modified') // ❌ Dropped
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Reply Requires Verified Domain
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
// Use same domain as receiving address
|
|
99
|
+
const receivingDomain = message.to.split('@')[1]
|
|
100
|
+
await message.reply(new EmailMessage(`noreply@${receivingDomain}`, message.from, rawMime))
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Performance
|
|
104
|
+
|
|
105
|
+
### CPU Limit
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
// Skip parsing large emails
|
|
109
|
+
if (message.rawSize > 5_000_000) {
|
|
110
|
+
await message.forward('inbox@example.com')
|
|
111
|
+
return
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Monitor: `npx wrangler tail`
|
|
116
|
+
|
|
117
|
+
## Limits
|
|
118
|
+
|
|
119
|
+
| Limit | Value |
|
|
120
|
+
| -------------------- | ----------- |
|
|
121
|
+
| Max message size | 25 MiB |
|
|
122
|
+
| Max rules/zone | 200 |
|
|
123
|
+
| CPU time (free/paid) | 10ms / 50ms |
|
|
124
|
+
| Reply References | 100 |
|
|
125
|
+
|
|
126
|
+
## Common Errors
|
|
127
|
+
|
|
128
|
+
| Error | Fix |
|
|
129
|
+
| ---------------------- | -------------------------------- |
|
|
130
|
+
| "Address not verified" | Add in Email Routing dashboard |
|
|
131
|
+
| "Exceeded CPU time" | Use `ctx.waitUntil()` or upgrade |
|
|
132
|
+
| "Stream is locked" | Buffer `message.raw` first |
|
|
133
|
+
| Silent reply failure | Check DMARC records |
|