memory-journal-mcp 7.7.1 → 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-6LPTBIB6.js → chunk-MWNLAEHR.js} +309 -4332
- 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 +6 -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,207 @@
|
|
|
1
|
+
# Cron Triggers Gotchas
|
|
2
|
+
|
|
3
|
+
## Common Errors
|
|
4
|
+
|
|
5
|
+
### "Timezone Issues"
|
|
6
|
+
|
|
7
|
+
**Problem:** Cron runs at wrong time relative to local timezone
|
|
8
|
+
**Cause:** All crons execute in UTC, no local timezone support
|
|
9
|
+
**Solution:** Convert local time to UTC manually
|
|
10
|
+
|
|
11
|
+
**Conversion formula:** `utcHour = (localHour - utcOffset + 24) % 24`
|
|
12
|
+
|
|
13
|
+
**Examples:**
|
|
14
|
+
|
|
15
|
+
- 9am PST (UTC-8) → `(9 - (-8) + 24) % 24 = 17` → `0 17 * * *`
|
|
16
|
+
- 2am EST (UTC-5) → `(2 - (-5) + 24) % 24 = 7` → `0 7 * * *`
|
|
17
|
+
- 6pm JST (UTC+9) → `(18 - 9 + 24) % 24 = 33 % 24 = 9` → `0 9 * * *`
|
|
18
|
+
|
|
19
|
+
**Daylight Saving Time:** Adjust manually when DST changes, or schedule at times unaffected by DST (e.g., 2am-4am local time usually safe)
|
|
20
|
+
|
|
21
|
+
### "Cron Not Executing"
|
|
22
|
+
|
|
23
|
+
**Cause:** Missing `scheduled()` export, invalid syntax, propagation delay (<15min), or plan limits
|
|
24
|
+
**Solution:** Verify export exists, validate at crontab.guru, wait 15+ min after deploy, check plan limits
|
|
25
|
+
|
|
26
|
+
### "Duplicate Executions"
|
|
27
|
+
|
|
28
|
+
**Cause:** At-least-once delivery
|
|
29
|
+
**Solution:** Track execution IDs in KV - see idempotency pattern below
|
|
30
|
+
|
|
31
|
+
### "Execution Failures"
|
|
32
|
+
|
|
33
|
+
**Cause:** CPU exceeded, unhandled exceptions, network timeouts, binding errors
|
|
34
|
+
**Solution:** Use try-catch, AbortController timeouts, `ctx.waitUntil()` for long ops, or Workflows for heavy tasks
|
|
35
|
+
|
|
36
|
+
### "Local Testing Not Working"
|
|
37
|
+
|
|
38
|
+
**Problem:** `/__scheduled` endpoint returns 404 or doesn't trigger handler
|
|
39
|
+
**Cause:** Missing `scheduled()` export, wrangler not running, or incorrect endpoint format
|
|
40
|
+
**Solution:**
|
|
41
|
+
|
|
42
|
+
1. Verify `scheduled()` is exported:
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
export default {
|
|
46
|
+
async scheduled(controller, env, ctx) {
|
|
47
|
+
console.log('Cron triggered')
|
|
48
|
+
},
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
2. Start dev server:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
npx wrangler dev
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
3. Use correct endpoint format (URL-encode spaces as `+`):
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# Correct
|
|
62
|
+
curl "http://localhost:8787/__scheduled?cron=*/5+*+*+*+*"
|
|
63
|
+
|
|
64
|
+
# Wrong (will fail)
|
|
65
|
+
curl "http://localhost:8787/__scheduled?cron=*/5 * * * *"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
4. Update Wrangler if outdated:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
npm install -g wrangler@latest
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### "waitUntil() Tasks Not Completing"
|
|
75
|
+
|
|
76
|
+
**Problem:** Background tasks in `ctx.waitUntil()` fail silently or don't execute
|
|
77
|
+
**Cause:** Promises rejected without error handling, or handler returns before promise settles
|
|
78
|
+
**Solution:** Always await or handle errors in waitUntil promises:
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
export default {
|
|
82
|
+
async scheduled(controller, env, ctx) {
|
|
83
|
+
// BAD: Silent failures
|
|
84
|
+
ctx.waitUntil(riskyOperation())
|
|
85
|
+
|
|
86
|
+
// GOOD: Explicit error handling
|
|
87
|
+
ctx.waitUntil(
|
|
88
|
+
riskyOperation().catch((err) => {
|
|
89
|
+
console.error('Background task failed:', err)
|
|
90
|
+
return logError(err, env)
|
|
91
|
+
})
|
|
92
|
+
)
|
|
93
|
+
},
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### "Idempotency Issues"
|
|
98
|
+
|
|
99
|
+
**Problem:** At-least-once delivery causes duplicate side effects (double charges, duplicate emails)
|
|
100
|
+
**Cause:** No deduplication mechanism
|
|
101
|
+
**Solution:** Use KV to track execution IDs:
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
export default {
|
|
105
|
+
async scheduled(controller, env, ctx) {
|
|
106
|
+
const executionId = `${controller.cron}-${controller.scheduledTime}`
|
|
107
|
+
const existing = await env.EXECUTIONS.get(executionId)
|
|
108
|
+
|
|
109
|
+
if (existing) {
|
|
110
|
+
console.log('Already executed, skipping')
|
|
111
|
+
controller.noRetry()
|
|
112
|
+
return
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
await env.EXECUTIONS.put(executionId, '1', { expirationTtl: 86400 }) // 24h TTL
|
|
116
|
+
await performIdempotentOperation(env)
|
|
117
|
+
},
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### "Security Concerns"
|
|
122
|
+
|
|
123
|
+
**Problem:** `__scheduled` endpoint exposed in production allows unauthorized cron triggering
|
|
124
|
+
**Cause:** Testing endpoint available in deployed Workers
|
|
125
|
+
**Solution:** Block `__scheduled` in production:
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
export default {
|
|
129
|
+
async fetch(request, env, ctx) {
|
|
130
|
+
const url = new URL(request.url)
|
|
131
|
+
|
|
132
|
+
// Block __scheduled in production
|
|
133
|
+
if (url.pathname === '/__scheduled' && env.ENVIRONMENT === 'production') {
|
|
134
|
+
return new Response('Not Found', { status: 404 })
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return handleRequest(request, env, ctx)
|
|
138
|
+
},
|
|
139
|
+
|
|
140
|
+
async scheduled(controller, env, ctx) {
|
|
141
|
+
// Your cron logic
|
|
142
|
+
},
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**Also:** Use `env.API_KEY` for secrets (never hardcode)
|
|
147
|
+
|
|
148
|
+
**Alternative:** Add middleware to verify request origin:
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
export default {
|
|
152
|
+
async fetch(request, env, ctx) {
|
|
153
|
+
const url = new URL(request.url)
|
|
154
|
+
|
|
155
|
+
if (url.pathname === '/__scheduled') {
|
|
156
|
+
// Check Cloudflare headers to verify internal request
|
|
157
|
+
const cfRay = request.headers.get('cf-ray')
|
|
158
|
+
if (!cfRay && env.ENVIRONMENT === 'production') {
|
|
159
|
+
return new Response('Not Found', { status: 404 })
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return handleRequest(request, env, ctx)
|
|
164
|
+
},
|
|
165
|
+
|
|
166
|
+
async scheduled(controller, env, ctx) {
|
|
167
|
+
// Your cron logic
|
|
168
|
+
},
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Limits & Quotas
|
|
173
|
+
|
|
174
|
+
| Limit | Free | Paid | Notes |
|
|
175
|
+
| ------------------- | ---------------- | ---------------- | ---------------------------------------- |
|
|
176
|
+
| Triggers per Worker | 3 | Unlimited | Maximum cron schedules per Worker |
|
|
177
|
+
| CPU time | 10ms | 50ms | May need `ctx.waitUntil()` or Workflows |
|
|
178
|
+
| Execution guarantee | At-least-once | At-least-once | Duplicates possible - use idempotency |
|
|
179
|
+
| Propagation delay | Up to 15 minutes | Up to 15 minutes | Time for changes to take effect globally |
|
|
180
|
+
| Min interval | 1 minute | 1 minute | Cannot schedule more frequently |
|
|
181
|
+
| Cron accuracy | ±1 minute | ±1 minute | Execution may drift slightly |
|
|
182
|
+
|
|
183
|
+
## Testing Best Practices
|
|
184
|
+
|
|
185
|
+
**Unit tests:**
|
|
186
|
+
|
|
187
|
+
- Mock `ScheduledController`, `ExecutionContext`, and bindings
|
|
188
|
+
- Test each cron expression separately
|
|
189
|
+
- Verify `noRetry()` is called when expected
|
|
190
|
+
- Use Vitest with `@cloudflare/vitest-pool-workers` for realistic env
|
|
191
|
+
|
|
192
|
+
**Integration tests:**
|
|
193
|
+
|
|
194
|
+
- Test via `/__scheduled` endpoint in dev environment
|
|
195
|
+
- Verify idempotency logic with duplicate `scheduledTime` values
|
|
196
|
+
- Test error handling and retry behavior
|
|
197
|
+
|
|
198
|
+
**Production:** Start with long intervals (`*/30 * * * *`), monitor Cron Events for 24h, set up alerts before reducing interval
|
|
199
|
+
|
|
200
|
+
## Resources
|
|
201
|
+
|
|
202
|
+
- [Cron Triggers Docs](https://developers.cloudflare.com/workers/configuration/cron-triggers/)
|
|
203
|
+
- [Scheduled Handler API](https://developers.cloudflare.com/workers/runtime-apis/handlers/scheduled/)
|
|
204
|
+
- [Cloudflare Workflows](https://developers.cloudflare.com/workflows/)
|
|
205
|
+
- [Workers Limits](https://developers.cloudflare.com/workers/platform/limits/)
|
|
206
|
+
- [Crontab Guru](https://crontab.guru/) - Validator
|
|
207
|
+
- [Vitest Pool Workers](https://github.com/cloudflare/workers-sdk/tree/main/fixtures/vitest-pool-workers-examples)
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
# Cron Triggers Patterns
|
|
2
|
+
|
|
3
|
+
## API Data Sync
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export default {
|
|
7
|
+
async scheduled(controller, env, ctx) {
|
|
8
|
+
const response = await fetch('https://api.example.com/data', {
|
|
9
|
+
headers: { Authorization: `Bearer ${env.API_KEY}` },
|
|
10
|
+
})
|
|
11
|
+
if (!response.ok) throw new Error(`API error: ${response.status}`)
|
|
12
|
+
ctx.waitUntil(
|
|
13
|
+
env.MY_KV.put('cached_data', JSON.stringify(await response.json()), { expirationTtl: 3600 })
|
|
14
|
+
)
|
|
15
|
+
},
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Database Cleanup
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
export default {
|
|
23
|
+
async scheduled(controller, env, ctx) {
|
|
24
|
+
const result = await env.DB.prepare(
|
|
25
|
+
`DELETE FROM sessions WHERE expires_at < datetime('now')`
|
|
26
|
+
).run()
|
|
27
|
+
console.log(`Deleted ${result.meta.changes} expired sessions`)
|
|
28
|
+
ctx.waitUntil(env.DB.prepare('VACUUM').run())
|
|
29
|
+
},
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Report Generation
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
export default {
|
|
37
|
+
async scheduled(controller, env, ctx) {
|
|
38
|
+
const startOfWeek = new Date()
|
|
39
|
+
startOfWeek.setDate(startOfWeek.getDate() - 7)
|
|
40
|
+
const { results } = await env.DB.prepare(
|
|
41
|
+
`SELECT date, revenue, orders FROM daily_stats WHERE date >= ? ORDER BY date`
|
|
42
|
+
)
|
|
43
|
+
.bind(startOfWeek.toISOString())
|
|
44
|
+
.all()
|
|
45
|
+
const report = {
|
|
46
|
+
period: 'weekly',
|
|
47
|
+
totalRevenue: results.reduce((sum, d) => sum + d.revenue, 0),
|
|
48
|
+
totalOrders: results.reduce((sum, d) => sum + d.orders, 0),
|
|
49
|
+
dailyBreakdown: results,
|
|
50
|
+
}
|
|
51
|
+
const reportKey = `reports/weekly-${Date.now()}.json`
|
|
52
|
+
await env.REPORTS_BUCKET.put(reportKey, JSON.stringify(report))
|
|
53
|
+
ctx.waitUntil(
|
|
54
|
+
env.SEND_EMAIL.fetch('https://example.com/send', {
|
|
55
|
+
method: 'POST',
|
|
56
|
+
body: JSON.stringify({
|
|
57
|
+
to: 'team@example.com',
|
|
58
|
+
subject: 'Weekly Report',
|
|
59
|
+
reportUrl: `https://reports.example.com/${reportKey}`,
|
|
60
|
+
}),
|
|
61
|
+
})
|
|
62
|
+
)
|
|
63
|
+
},
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Health Checks
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
export default {
|
|
71
|
+
async scheduled(controller, env, ctx) {
|
|
72
|
+
const services = [
|
|
73
|
+
{ name: 'API', url: 'https://api.example.com/health' },
|
|
74
|
+
{ name: 'CDN', url: 'https://cdn.example.com/health' },
|
|
75
|
+
]
|
|
76
|
+
const checks = await Promise.all(
|
|
77
|
+
services.map(async (service) => {
|
|
78
|
+
const start = Date.now()
|
|
79
|
+
try {
|
|
80
|
+
const response = await fetch(service.url, { signal: AbortSignal.timeout(5000) })
|
|
81
|
+
return {
|
|
82
|
+
name: service.name,
|
|
83
|
+
status: response.ok ? 'up' : 'down',
|
|
84
|
+
responseTime: Date.now() - start,
|
|
85
|
+
}
|
|
86
|
+
} catch (error) {
|
|
87
|
+
return {
|
|
88
|
+
name: service.name,
|
|
89
|
+
status: 'down',
|
|
90
|
+
responseTime: Date.now() - start,
|
|
91
|
+
error: error.message,
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
})
|
|
95
|
+
)
|
|
96
|
+
ctx.waitUntil(env.STATUS_KV.put('health_status', JSON.stringify(checks)))
|
|
97
|
+
const failures = checks.filter((c) => c.status === 'down')
|
|
98
|
+
if (failures.length > 0)
|
|
99
|
+
ctx.waitUntil(
|
|
100
|
+
fetch(env.ALERT_WEBHOOK, {
|
|
101
|
+
method: 'POST',
|
|
102
|
+
body: JSON.stringify({
|
|
103
|
+
text: `${failures.length} service(s) down: ${failures.map((f) => f.name).join(', ')}`,
|
|
104
|
+
}),
|
|
105
|
+
})
|
|
106
|
+
)
|
|
107
|
+
},
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Batch Processing (Rate-Limited)
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
export default {
|
|
115
|
+
async scheduled(controller, env, ctx) {
|
|
116
|
+
const queueData = await env.QUEUE_KV.get('pending_items', 'json')
|
|
117
|
+
if (!queueData || queueData.length === 0) return
|
|
118
|
+
const batch = queueData.slice(0, 100)
|
|
119
|
+
const results = await Promise.allSettled(
|
|
120
|
+
batch.map((item) =>
|
|
121
|
+
fetch('https://api.example.com/process', {
|
|
122
|
+
method: 'POST',
|
|
123
|
+
headers: { Authorization: `Bearer ${env.API_KEY}`, 'Content-Type': 'application/json' },
|
|
124
|
+
body: JSON.stringify(item),
|
|
125
|
+
})
|
|
126
|
+
)
|
|
127
|
+
)
|
|
128
|
+
console.log(
|
|
129
|
+
`Processed ${results.filter((r) => r.status === 'fulfilled').length}/${batch.length} items`
|
|
130
|
+
)
|
|
131
|
+
ctx.waitUntil(env.QUEUE_KV.put('pending_items', JSON.stringify(queueData.slice(100))))
|
|
132
|
+
},
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Queue Integration
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
export default {
|
|
140
|
+
async scheduled(controller, env, ctx) {
|
|
141
|
+
const batch = await env.MY_QUEUE.receive({ batchSize: 100 })
|
|
142
|
+
const results = await Promise.allSettled(
|
|
143
|
+
batch.messages.map(async (msg) => {
|
|
144
|
+
await processMessage(msg.body, env)
|
|
145
|
+
await msg.ack()
|
|
146
|
+
})
|
|
147
|
+
)
|
|
148
|
+
console.log(
|
|
149
|
+
`Processed ${results.filter((r) => r.status === 'fulfilled').length}/${batch.messages.length}`
|
|
150
|
+
)
|
|
151
|
+
},
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Monitoring & Observability
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
export default {
|
|
159
|
+
async scheduled(controller, env, ctx) {
|
|
160
|
+
const startTime = Date.now()
|
|
161
|
+
const meta = { cron: controller.cron, scheduledTime: controller.scheduledTime }
|
|
162
|
+
console.log('[START]', meta)
|
|
163
|
+
try {
|
|
164
|
+
const result = await performTask(env)
|
|
165
|
+
console.log('[SUCCESS]', { ...meta, duration: Date.now() - startTime, count: result.count })
|
|
166
|
+
ctx.waitUntil(
|
|
167
|
+
env.METRICS.put(
|
|
168
|
+
`cron:${controller.scheduledTime}`,
|
|
169
|
+
JSON.stringify({ ...meta, status: 'success' }),
|
|
170
|
+
{ expirationTtl: 2592000 }
|
|
171
|
+
)
|
|
172
|
+
)
|
|
173
|
+
} catch (error) {
|
|
174
|
+
console.error('[ERROR]', { ...meta, duration: Date.now() - startTime, error: error.message })
|
|
175
|
+
ctx.waitUntil(
|
|
176
|
+
fetch(env.ALERT_WEBHOOK, {
|
|
177
|
+
method: 'POST',
|
|
178
|
+
body: JSON.stringify({ text: `Cron failed: ${controller.cron}`, error: error.message }),
|
|
179
|
+
})
|
|
180
|
+
)
|
|
181
|
+
throw error
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
**View logs:** `npx wrangler tail` or Dashboard → Workers & Pages → Worker → Logs
|
|
188
|
+
|
|
189
|
+
## Durable Objects Coordination
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
export default {
|
|
193
|
+
async scheduled(controller, env, ctx) {
|
|
194
|
+
const stub = env.COORDINATOR.get(env.COORDINATOR.idFromName('cron-lock'))
|
|
195
|
+
const acquired = await stub.tryAcquireLock(controller.scheduledTime)
|
|
196
|
+
if (!acquired) {
|
|
197
|
+
controller.noRetry()
|
|
198
|
+
return
|
|
199
|
+
}
|
|
200
|
+
try {
|
|
201
|
+
await performTask(env)
|
|
202
|
+
} finally {
|
|
203
|
+
await stub.releaseLock()
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Python Handler
|
|
210
|
+
|
|
211
|
+
```python
|
|
212
|
+
from workers import WorkerEntrypoint
|
|
213
|
+
|
|
214
|
+
class Default(WorkerEntrypoint):
|
|
215
|
+
async def scheduled(self, controller, env, ctx):
|
|
216
|
+
data = await env.MY_KV.get("key")
|
|
217
|
+
ctx.waitUntil(env.DB.execute("DELETE FROM logs WHERE created_at < datetime('now', '-7 days')"))
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Testing Patterns
|
|
221
|
+
|
|
222
|
+
**Local testing with /\_\_scheduled:**
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
# Start dev server
|
|
226
|
+
npx wrangler dev
|
|
227
|
+
|
|
228
|
+
# Test specific cron
|
|
229
|
+
curl "http://localhost:8787/__scheduled?cron=*/5+*+*+*+*"
|
|
230
|
+
|
|
231
|
+
# Test with specific time
|
|
232
|
+
curl "http://localhost:8787/__scheduled?cron=0+2+*+*+*&scheduledTime=1704067200000"
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
**Unit tests:**
|
|
236
|
+
|
|
237
|
+
```typescript
|
|
238
|
+
// test/scheduled.test.ts
|
|
239
|
+
import { describe, it, expect, vi } from 'vitest'
|
|
240
|
+
import { env } from 'cloudflare:test'
|
|
241
|
+
import worker from '../src/index'
|
|
242
|
+
|
|
243
|
+
describe('Scheduled Handler', () => {
|
|
244
|
+
it('executes cron', async () => {
|
|
245
|
+
const controller = {
|
|
246
|
+
scheduledTime: Date.now(),
|
|
247
|
+
cron: '*/5 * * * *',
|
|
248
|
+
type: 'scheduled' as const,
|
|
249
|
+
noRetry: vi.fn(),
|
|
250
|
+
}
|
|
251
|
+
const ctx = { waitUntil: vi.fn(), passThroughOnException: vi.fn() }
|
|
252
|
+
await worker.scheduled(controller, env, ctx)
|
|
253
|
+
expect(await env.MY_KV.get('last_run')).toBeDefined()
|
|
254
|
+
})
|
|
255
|
+
|
|
256
|
+
it('calls noRetry on duplicate', async () => {
|
|
257
|
+
const controller = {
|
|
258
|
+
scheduledTime: 1704067200000,
|
|
259
|
+
cron: '0 2 * * *',
|
|
260
|
+
type: 'scheduled' as const,
|
|
261
|
+
noRetry: vi.fn(),
|
|
262
|
+
}
|
|
263
|
+
await env.EXECUTIONS.put('0 2 * * *-1704067200000', '1')
|
|
264
|
+
await worker.scheduled(controller, env, { waitUntil: vi.fn(), passThroughOnException: vi.fn() })
|
|
265
|
+
expect(controller.noRetry).toHaveBeenCalled()
|
|
266
|
+
})
|
|
267
|
+
})
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## See Also
|
|
271
|
+
|
|
272
|
+
- [README.md](./README.md) - Overview
|
|
273
|
+
- [api.md](./api.md) - Handler implementation
|
|
274
|
+
- [gotchas.md](./gotchas.md) - Troubleshooting
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Cloudflare D1 Database
|
|
2
|
+
|
|
3
|
+
Expert guidance for Cloudflare D1, a serverless SQLite database designed for horizontal scale-out across multiple databases.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
D1 is Cloudflare's managed, serverless database with:
|
|
8
|
+
|
|
9
|
+
- SQLite SQL semantics and compatibility
|
|
10
|
+
- Built-in disaster recovery via Time Travel (30-day point-in-time recovery)
|
|
11
|
+
- Horizontal scale-out architecture (10 GB per database)
|
|
12
|
+
- Worker and HTTP API access
|
|
13
|
+
- Pricing based on query and storage costs only
|
|
14
|
+
|
|
15
|
+
**Architecture Philosophy**: D1 is optimized for per-user, per-tenant, or per-entity database patterns rather than single large databases.
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# Create database
|
|
21
|
+
wrangler d1 create <database-name>
|
|
22
|
+
|
|
23
|
+
# Execute migration
|
|
24
|
+
wrangler d1 migrations apply <db-name> --remote
|
|
25
|
+
|
|
26
|
+
# Local development
|
|
27
|
+
wrangler dev
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Core Query Methods
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
// .all() - Returns all rows; .first() - First row or null; .first(col) - Single column value
|
|
34
|
+
// .run() - INSERT/UPDATE/DELETE; .raw() - Array of arrays (efficient)
|
|
35
|
+
const { results, success, meta } = await env.DB.prepare('SELECT * FROM users WHERE active = ?')
|
|
36
|
+
.bind(true)
|
|
37
|
+
.all()
|
|
38
|
+
const user = await env.DB.prepare('SELECT * FROM users WHERE id = ?').bind(userId).first()
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Batch Operations
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
// Multiple queries in single round trip (atomic transaction)
|
|
45
|
+
const results = await env.DB.batch([
|
|
46
|
+
env.DB.prepare('SELECT * FROM users WHERE id = ?').bind(1),
|
|
47
|
+
env.DB.prepare('SELECT * FROM posts WHERE author_id = ?').bind(1),
|
|
48
|
+
env.DB.prepare('UPDATE users SET last_access = ? WHERE id = ?').bind(Date.now(), 1),
|
|
49
|
+
])
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Sessions API (Paid Plans)
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
// Create long-running session for analytics/migrations (up to 15 minutes)
|
|
56
|
+
const session = env.DB.withSession()
|
|
57
|
+
try {
|
|
58
|
+
await session.prepare('CREATE INDEX idx_heavy ON large_table(column)').run()
|
|
59
|
+
await session.prepare('ANALYZE').run()
|
|
60
|
+
} finally {
|
|
61
|
+
session.close() // Always close to release resources
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Read Replication (Paid Plans)
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
// Read from nearest replica for lower latency (automatic failover)
|
|
69
|
+
const user = await env.DB_REPLICA.prepare('SELECT * FROM users WHERE id = ?').bind(userId).first()
|
|
70
|
+
|
|
71
|
+
// Writes always go to primary
|
|
72
|
+
await env.DB.prepare('UPDATE users SET last_login = ? WHERE id = ?').bind(Date.now(), userId).run()
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Platform Limits
|
|
76
|
+
|
|
77
|
+
| Limit | Free Tier | Paid Plans |
|
|
78
|
+
| --------------------- | ---------------- | ------------------ |
|
|
79
|
+
| Database size | 500 MB | 10 GB per database |
|
|
80
|
+
| Row size | 1 MB max | 1 MB max |
|
|
81
|
+
| Query timeout | 30 seconds | 30 seconds |
|
|
82
|
+
| Batch size | 1,000 statements | 10,000 statements |
|
|
83
|
+
| Time Travel retention | 7 days | 30 days |
|
|
84
|
+
| Read replicas | Not available | Yes (paid add-on) |
|
|
85
|
+
|
|
86
|
+
**Pricing**: $5/month per database beyond free tier + $0.001 per 1K reads + $1 per 1M writes + $0.75/GB storage/month
|
|
87
|
+
|
|
88
|
+
## CLI Commands
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# Database management
|
|
92
|
+
wrangler d1 create <db-name>
|
|
93
|
+
wrangler d1 list
|
|
94
|
+
wrangler d1 delete <db-name>
|
|
95
|
+
|
|
96
|
+
# Migrations
|
|
97
|
+
wrangler d1 migrations create <db-name> <migration-name> # Create new migration file
|
|
98
|
+
wrangler d1 migrations apply <db-name> --remote # Apply pending migrations
|
|
99
|
+
wrangler d1 migrations apply <db-name> --local # Apply locally
|
|
100
|
+
wrangler d1 migrations list <db-name> --remote # Show applied migrations
|
|
101
|
+
|
|
102
|
+
# Direct SQL execution
|
|
103
|
+
wrangler d1 execute <db-name> --remote --command="SELECT * FROM users"
|
|
104
|
+
wrangler d1 execute <db-name> --local --file=./schema.sql
|
|
105
|
+
|
|
106
|
+
# Backups & Import/Export
|
|
107
|
+
wrangler d1 export <db-name> --remote --output=./backup.sql # Full export with schema
|
|
108
|
+
wrangler d1 export <db-name> --remote --no-schema --output=./data.sql # Data only
|
|
109
|
+
wrangler d1 time-travel restore <db-name> --timestamp="2024-01-15T14:30:00Z" # Point-in-time recovery
|
|
110
|
+
|
|
111
|
+
# Development
|
|
112
|
+
wrangler dev --persist-to=./.wrangler/state
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Reading Order
|
|
116
|
+
|
|
117
|
+
**Start here**: Quick Start above → configuration.md (setup) → api.md (queries)
|
|
118
|
+
|
|
119
|
+
**Common tasks**:
|
|
120
|
+
|
|
121
|
+
- First time setup: configuration.md → Run migrations
|
|
122
|
+
- Adding queries: api.md → Prepared statements
|
|
123
|
+
- Pagination/caching: patterns.md
|
|
124
|
+
- Production optimization: Read Replication + Sessions API (this file)
|
|
125
|
+
- Debugging: gotchas.md
|
|
126
|
+
|
|
127
|
+
## In This Reference
|
|
128
|
+
|
|
129
|
+
- [configuration.md](./configuration.md) - wrangler.jsonc setup, migrations, TypeScript types, ORMs, local dev
|
|
130
|
+
- [api.md](./api.md) - Query methods (.all/.first/.run/.raw), batch, sessions, read replicas, error handling
|
|
131
|
+
- [patterns.md](./patterns.md) - Pagination, bulk operations, caching, multi-tenant, sessions, analytics
|
|
132
|
+
- [gotchas.md](./gotchas.md) - SQL injection, limits by plan tier, performance, common errors
|
|
133
|
+
|
|
134
|
+
## See Also
|
|
135
|
+
|
|
136
|
+
- [workers](../workers/) - Worker runtime and fetch handler patterns
|
|
137
|
+
- [hyperdrive](../hyperdrive/) - Connection pooling for external databases
|