pi-cloudflare 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +67 -0
- package/bin/setup.mjs +103 -0
- package/dist/auth-flow.d.ts +15 -0
- package/dist/auth-flow.d.ts.map +1 -0
- package/dist/auth-flow.js +90 -0
- package/dist/auth-flow.js.map +1 -0
- package/dist/client.d.ts +18 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +47 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.d.ts +44 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +135 -0
- package/dist/oauth.js.map +1 -0
- package/dist/proxy.d.ts +29 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +39 -0
- package/dist/proxy.js.map +1 -0
- package/dist/servers.d.ts +19 -0
- package/dist/servers.d.ts.map +1 -0
- package/dist/servers.js +40 -0
- package/dist/servers.js.map +1 -0
- package/dist/token-store.d.ts +23 -0
- package/dist/token-store.d.ts.map +1 -0
- package/dist/token-store.js +47 -0
- package/dist/token-store.js.map +1 -0
- package/package.json +67 -0
- package/skills/agents-sdk/SKILL.md +221 -0
- package/skills/agents-sdk/references/browse-the-web.md +63 -0
- package/skills/agents-sdk/references/callable.md +92 -0
- package/skills/agents-sdk/references/client-sdk.md +110 -0
- package/skills/agents-sdk/references/codemode.md +110 -0
- package/skills/agents-sdk/references/configuration.md +72 -0
- package/skills/agents-sdk/references/durable-execution.md +51 -0
- package/skills/agents-sdk/references/email.md +146 -0
- package/skills/agents-sdk/references/human-in-the-loop.md +67 -0
- package/skills/agents-sdk/references/mcp.md +188 -0
- package/skills/agents-sdk/references/observability.md +44 -0
- package/skills/agents-sdk/references/queue-retries.md +79 -0
- package/skills/agents-sdk/references/routing.md +75 -0
- package/skills/agents-sdk/references/server-driven-messages.md +63 -0
- package/skills/agents-sdk/references/state-scheduling.md +171 -0
- package/skills/agents-sdk/references/streaming-chat.md +198 -0
- package/skills/agents-sdk/references/think.md +112 -0
- package/skills/agents-sdk/references/voice.md +68 -0
- package/skills/agents-sdk/references/webhooks-push.md +86 -0
- package/skills/agents-sdk/references/workflows.md +132 -0
- package/skills/cloudflare/SKILL.md +248 -0
- package/skills/cloudflare/references/agents-sdk/README.md +89 -0
- package/skills/cloudflare/references/agents-sdk/api.md +190 -0
- package/skills/cloudflare/references/agents-sdk/configuration.md +182 -0
- package/skills/cloudflare/references/agents-sdk/gotchas.md +158 -0
- package/skills/cloudflare/references/agents-sdk/patterns.md +192 -0
- package/skills/cloudflare/references/ai-gateway/README.md +175 -0
- package/skills/cloudflare/references/ai-gateway/configuration.md +111 -0
- package/skills/cloudflare/references/ai-gateway/dynamic-routing.md +82 -0
- package/skills/cloudflare/references/ai-gateway/features.md +96 -0
- package/skills/cloudflare/references/ai-gateway/sdk-integration.md +114 -0
- package/skills/cloudflare/references/ai-gateway/troubleshooting.md +88 -0
- package/skills/cloudflare/references/ai-search/README.md +138 -0
- package/skills/cloudflare/references/ai-search/api.md +87 -0
- package/skills/cloudflare/references/ai-search/configuration.md +88 -0
- package/skills/cloudflare/references/ai-search/gotchas.md +81 -0
- package/skills/cloudflare/references/ai-search/patterns.md +85 -0
- package/skills/cloudflare/references/analytics-engine/README.md +94 -0
- package/skills/cloudflare/references/analytics-engine/api.md +112 -0
- package/skills/cloudflare/references/analytics-engine/configuration.md +112 -0
- package/skills/cloudflare/references/analytics-engine/gotchas.md +85 -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 +204 -0
- package/skills/cloudflare/references/api/configuration.md +160 -0
- package/skills/cloudflare/references/api/gotchas.md +225 -0
- package/skills/cloudflare/references/api/patterns.md +204 -0
- package/skills/cloudflare/references/api-shield/README.md +44 -0
- package/skills/cloudflare/references/api-shield/api.md +141 -0
- package/skills/cloudflare/references/api-shield/configuration.md +192 -0
- package/skills/cloudflare/references/api-shield/gotchas.md +125 -0
- package/skills/cloudflare/references/api-shield/patterns.md +180 -0
- package/skills/cloudflare/references/argo-smart-routing/README.md +90 -0
- package/skills/cloudflare/references/argo-smart-routing/api.md +240 -0
- package/skills/cloudflare/references/argo-smart-routing/configuration.md +197 -0
- package/skills/cloudflare/references/argo-smart-routing/gotchas.md +111 -0
- package/skills/cloudflare/references/argo-smart-routing/patterns.md +104 -0
- package/skills/cloudflare/references/artifacts/README.md +79 -0
- package/skills/cloudflare/references/artifacts/api.md +128 -0
- package/skills/cloudflare/references/artifacts/configuration.md +92 -0
- package/skills/cloudflare/references/bindings/README.md +122 -0
- package/skills/cloudflare/references/bindings/api.md +203 -0
- package/skills/cloudflare/references/bindings/configuration.md +188 -0
- package/skills/cloudflare/references/bindings/gotchas.md +208 -0
- package/skills/cloudflare/references/bindings/patterns.md +200 -0
- package/skills/cloudflare/references/bot-management/README.md +94 -0
- package/skills/cloudflare/references/bot-management/api.md +169 -0
- package/skills/cloudflare/references/bot-management/configuration.md +163 -0
- package/skills/cloudflare/references/bot-management/gotchas.md +114 -0
- package/skills/cloudflare/references/bot-management/patterns.md +182 -0
- package/skills/cloudflare/references/browser-rendering/README.md +78 -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 +88 -0
- package/skills/cloudflare/references/browser-rendering/patterns.md +91 -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 +81 -0
- package/skills/cloudflare/references/c3/gotchas.md +92 -0
- package/skills/cloudflare/references/c3/patterns.md +82 -0
- package/skills/cloudflare/references/cache-reserve/README.md +147 -0
- package/skills/cloudflare/references/cache-reserve/api.md +194 -0
- package/skills/cloudflare/references/cache-reserve/configuration.md +169 -0
- package/skills/cloudflare/references/cache-reserve/gotchas.md +132 -0
- package/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
- package/skills/cloudflare/references/containers/README.md +85 -0
- package/skills/cloudflare/references/containers/api.md +187 -0
- package/skills/cloudflare/references/containers/configuration.md +188 -0
- package/skills/cloudflare/references/containers/gotchas.md +178 -0
- package/skills/cloudflare/references/containers/patterns.md +202 -0
- package/skills/cloudflare/references/cron-triggers/README.md +99 -0
- package/skills/cloudflare/references/cron-triggers/api.md +196 -0
- package/skills/cloudflare/references/cron-triggers/configuration.md +180 -0
- package/skills/cloudflare/references/cron-triggers/gotchas.md +199 -0
- package/skills/cloudflare/references/cron-triggers/patterns.md +190 -0
- package/skills/cloudflare/references/d1/README.md +133 -0
- package/skills/cloudflare/references/d1/api.md +196 -0
- package/skills/cloudflare/references/d1/configuration.md +191 -0
- package/skills/cloudflare/references/d1/gotchas.md +98 -0
- package/skills/cloudflare/references/d1/patterns.md +189 -0
- package/skills/cloudflare/references/ddos/README.md +41 -0
- package/skills/cloudflare/references/ddos/api.md +164 -0
- package/skills/cloudflare/references/ddos/configuration.md +93 -0
- package/skills/cloudflare/references/ddos/gotchas.md +107 -0
- package/skills/cloudflare/references/ddos/patterns.md +174 -0
- package/skills/cloudflare/references/do-storage/README.md +75 -0
- package/skills/cloudflare/references/do-storage/api.md +102 -0
- package/skills/cloudflare/references/do-storage/configuration.md +112 -0
- package/skills/cloudflare/references/do-storage/gotchas.md +150 -0
- package/skills/cloudflare/references/do-storage/patterns.md +194 -0
- package/skills/cloudflare/references/do-storage/testing.md +183 -0
- package/skills/cloudflare/references/durable-objects/README.md +185 -0
- package/skills/cloudflare/references/durable-objects/api.md +187 -0
- package/skills/cloudflare/references/durable-objects/configuration.md +160 -0
- package/skills/cloudflare/references/durable-objects/gotchas.md +197 -0
- package/skills/cloudflare/references/durable-objects/patterns.md +201 -0
- package/skills/cloudflare/references/email-routing/README.md +89 -0
- package/skills/cloudflare/references/email-routing/api.md +195 -0
- package/skills/cloudflare/references/email-routing/configuration.md +186 -0
- package/skills/cloudflare/references/email-routing/gotchas.md +196 -0
- package/skills/cloudflare/references/email-routing/patterns.md +229 -0
- package/skills/cloudflare/references/email-workers/README.md +151 -0
- package/skills/cloudflare/references/email-workers/api.md +237 -0
- package/skills/cloudflare/references/email-workers/configuration.md +112 -0
- package/skills/cloudflare/references/email-workers/gotchas.md +125 -0
- package/skills/cloudflare/references/email-workers/patterns.md +102 -0
- package/skills/cloudflare/references/flagship/README.md +59 -0
- package/skills/cloudflare/references/flagship/api.md +390 -0
- package/skills/cloudflare/references/flagship/configuration.md +202 -0
- package/skills/cloudflare/references/flagship/gotchas.md +178 -0
- package/skills/cloudflare/references/flagship/patterns.md +469 -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 +118 -0
- package/skills/cloudflare/references/graphql-api/gotchas.md +110 -0
- package/skills/cloudflare/references/graphql-api/patterns.md +225 -0
- package/skills/cloudflare/references/hyperdrive/README.md +82 -0
- package/skills/cloudflare/references/hyperdrive/api.md +143 -0
- package/skills/cloudflare/references/hyperdrive/configuration.md +159 -0
- package/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
- package/skills/cloudflare/references/hyperdrive/patterns.md +190 -0
- package/skills/cloudflare/references/images/README.md +61 -0
- package/skills/cloudflare/references/images/api.md +96 -0
- package/skills/cloudflare/references/images/configuration.md +211 -0
- package/skills/cloudflare/references/images/gotchas.md +99 -0
- package/skills/cloudflare/references/images/patterns.md +115 -0
- package/skills/cloudflare/references/kv/README.md +89 -0
- package/skills/cloudflare/references/kv/api.md +160 -0
- package/skills/cloudflare/references/kv/configuration.md +144 -0
- package/skills/cloudflare/references/kv/gotchas.md +131 -0
- package/skills/cloudflare/references/kv/patterns.md +196 -0
- package/skills/cloudflare/references/miniflare/README.md +105 -0
- package/skills/cloudflare/references/miniflare/api.md +187 -0
- package/skills/cloudflare/references/miniflare/configuration.md +173 -0
- package/skills/cloudflare/references/miniflare/gotchas.md +160 -0
- package/skills/cloudflare/references/miniflare/patterns.md +181 -0
- package/skills/cloudflare/references/network-interconnect/README.md +99 -0
- package/skills/cloudflare/references/network-interconnect/api.md +199 -0
- package/skills/cloudflare/references/network-interconnect/configuration.md +114 -0
- package/skills/cloudflare/references/network-interconnect/gotchas.md +165 -0
- package/skills/cloudflare/references/network-interconnect/patterns.md +166 -0
- package/skills/cloudflare/references/observability/README.md +88 -0
- package/skills/cloudflare/references/observability/api.md +164 -0
- package/skills/cloudflare/references/observability/configuration.md +169 -0
- package/skills/cloudflare/references/observability/gotchas.md +115 -0
- package/skills/cloudflare/references/observability/patterns.md +105 -0
- package/skills/cloudflare/references/pages/README.md +88 -0
- package/skills/cloudflare/references/pages/api.md +204 -0
- package/skills/cloudflare/references/pages/configuration.md +201 -0
- package/skills/cloudflare/references/pages/gotchas.md +203 -0
- package/skills/cloudflare/references/pages/patterns.md +204 -0
- package/skills/cloudflare/references/pages-functions/README.md +98 -0
- package/skills/cloudflare/references/pages-functions/api.md +143 -0
- package/skills/cloudflare/references/pages-functions/configuration.md +122 -0
- package/skills/cloudflare/references/pages-functions/gotchas.md +94 -0
- package/skills/cloudflare/references/pages-functions/patterns.md +137 -0
- package/skills/cloudflare/references/pipelines/README.md +90 -0
- package/skills/cloudflare/references/pipelines/api.md +124 -0
- package/skills/cloudflare/references/pipelines/configuration.md +155 -0
- package/skills/cloudflare/references/pipelines/gotchas.md +58 -0
- package/skills/cloudflare/references/pipelines/patterns.md +130 -0
- package/skills/cloudflare/references/pulumi/README.md +100 -0
- package/skills/cloudflare/references/pulumi/api.md +200 -0
- package/skills/cloudflare/references/pulumi/configuration.md +198 -0
- package/skills/cloudflare/references/pulumi/gotchas.md +181 -0
- package/skills/cloudflare/references/pulumi/patterns.md +191 -0
- package/skills/cloudflare/references/queues/README.md +96 -0
- package/skills/cloudflare/references/queues/api.md +206 -0
- package/skills/cloudflare/references/queues/configuration.md +144 -0
- package/skills/cloudflare/references/queues/gotchas.md +206 -0
- package/skills/cloudflare/references/queues/patterns.md +220 -0
- package/skills/cloudflare/references/r2/README.md +95 -0
- package/skills/cloudflare/references/r2/api.md +200 -0
- package/skills/cloudflare/references/r2/configuration.md +165 -0
- package/skills/cloudflare/references/r2/gotchas.md +190 -0
- package/skills/cloudflare/references/r2/patterns.md +193 -0
- package/skills/cloudflare/references/r2-data-catalog/README.md +75 -0
- package/skills/cloudflare/references/r2-data-catalog/api.md +122 -0
- package/skills/cloudflare/references/r2-data-catalog/configuration.md +98 -0
- package/skills/cloudflare/references/r2-data-catalog/gotchas.md +55 -0
- package/skills/cloudflare/references/r2-data-catalog/patterns.md +122 -0
- package/skills/cloudflare/references/r2-sql/README.md +64 -0
- package/skills/cloudflare/references/r2-sql/api.md +121 -0
- package/skills/cloudflare/references/r2-sql/configuration.md +50 -0
- package/skills/cloudflare/references/r2-sql/gotchas.md +39 -0
- package/skills/cloudflare/references/r2-sql/patterns.md +118 -0
- package/skills/cloudflare/references/realtime-sfu/README.md +65 -0
- package/skills/cloudflare/references/realtime-sfu/api.md +158 -0
- package/skills/cloudflare/references/realtime-sfu/configuration.md +137 -0
- package/skills/cloudflare/references/realtime-sfu/gotchas.md +133 -0
- package/skills/cloudflare/references/realtime-sfu/patterns.md +174 -0
- package/skills/cloudflare/references/realtimekit/README.md +113 -0
- package/skills/cloudflare/references/realtimekit/api.md +212 -0
- package/skills/cloudflare/references/realtimekit/configuration.md +203 -0
- package/skills/cloudflare/references/realtimekit/gotchas.md +169 -0
- package/skills/cloudflare/references/realtimekit/patterns.md +223 -0
- package/skills/cloudflare/references/sandbox/README.md +96 -0
- package/skills/cloudflare/references/sandbox/api.md +198 -0
- package/skills/cloudflare/references/sandbox/configuration.md +143 -0
- package/skills/cloudflare/references/sandbox/gotchas.md +194 -0
- package/skills/cloudflare/references/sandbox/patterns.md +201 -0
- package/skills/cloudflare/references/secrets-store/README.md +74 -0
- package/skills/cloudflare/references/secrets-store/api.md +200 -0
- package/skills/cloudflare/references/secrets-store/configuration.md +185 -0
- package/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
- package/skills/cloudflare/references/secrets-store/patterns.md +207 -0
- package/skills/cloudflare/references/smart-placement/README.md +138 -0
- package/skills/cloudflare/references/smart-placement/api.md +183 -0
- package/skills/cloudflare/references/smart-placement/configuration.md +196 -0
- package/skills/cloudflare/references/smart-placement/gotchas.md +174 -0
- package/skills/cloudflare/references/smart-placement/patterns.md +183 -0
- package/skills/cloudflare/references/snippets/README.md +68 -0
- package/skills/cloudflare/references/snippets/api.md +198 -0
- package/skills/cloudflare/references/snippets/configuration.md +227 -0
- package/skills/cloudflare/references/snippets/gotchas.md +86 -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 +181 -0
- package/skills/cloudflare/references/spectrum/configuration.md +194 -0
- package/skills/cloudflare/references/spectrum/gotchas.md +145 -0
- package/skills/cloudflare/references/spectrum/patterns.md +196 -0
- package/skills/cloudflare/references/static-assets/README.md +65 -0
- package/skills/cloudflare/references/static-assets/api.md +199 -0
- package/skills/cloudflare/references/static-assets/configuration.md +186 -0
- package/skills/cloudflare/references/static-assets/gotchas.md +162 -0
- package/skills/cloudflare/references/static-assets/patterns.md +189 -0
- package/skills/cloudflare/references/stream/README.md +114 -0
- package/skills/cloudflare/references/stream/api-live.md +195 -0
- package/skills/cloudflare/references/stream/api.md +199 -0
- package/skills/cloudflare/references/stream/configuration.md +141 -0
- package/skills/cloudflare/references/stream/gotchas.md +130 -0
- package/skills/cloudflare/references/stream/patterns.md +184 -0
- package/skills/cloudflare/references/tail-workers/README.md +89 -0
- package/skills/cloudflare/references/tail-workers/api.md +200 -0
- package/skills/cloudflare/references/tail-workers/configuration.md +176 -0
- package/skills/cloudflare/references/tail-workers/gotchas.md +192 -0
- package/skills/cloudflare/references/tail-workers/patterns.md +180 -0
- package/skills/cloudflare/references/terraform/README.md +102 -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 +129 -0
- package/skills/cloudflare/references/tunnel/api.md +193 -0
- package/skills/cloudflare/references/tunnel/configuration.md +157 -0
- package/skills/cloudflare/references/tunnel/gotchas.md +147 -0
- package/skills/cloudflare/references/tunnel/networking.md +168 -0
- package/skills/cloudflare/references/tunnel/patterns.md +192 -0
- package/skills/cloudflare/references/turn/README.md +82 -0
- package/skills/cloudflare/references/turn/api.md +239 -0
- package/skills/cloudflare/references/turn/configuration.md +179 -0
- package/skills/cloudflare/references/turn/gotchas.md +231 -0
- package/skills/cloudflare/references/turn/patterns.md +213 -0
- package/skills/cloudflare/references/turnstile/README.md +99 -0
- package/skills/cloudflare/references/turnstile/api.md +240 -0
- package/skills/cloudflare/references/turnstile/configuration.md +222 -0
- package/skills/cloudflare/references/turnstile/gotchas.md +218 -0
- package/skills/cloudflare/references/turnstile/patterns.md +193 -0
- package/skills/cloudflare/references/vectorize/README.md +133 -0
- package/skills/cloudflare/references/vectorize/api.md +88 -0
- package/skills/cloudflare/references/vectorize/configuration.md +88 -0
- package/skills/cloudflare/references/vectorize/gotchas.md +76 -0
- package/skills/cloudflare/references/vectorize/patterns.md +90 -0
- package/skills/cloudflare/references/waf/README.md +113 -0
- package/skills/cloudflare/references/waf/api.md +202 -0
- package/skills/cloudflare/references/waf/configuration.md +203 -0
- package/skills/cloudflare/references/waf/gotchas.md +204 -0
- package/skills/cloudflare/references/waf/patterns.md +197 -0
- package/skills/cloudflare/references/web-analytics/README.md +141 -0
- package/skills/cloudflare/references/web-analytics/configuration.md +76 -0
- package/skills/cloudflare/references/web-analytics/gotchas.md +82 -0
- package/skills/cloudflare/references/web-analytics/integration.md +60 -0
- package/skills/cloudflare/references/web-analytics/patterns.md +91 -0
- package/skills/cloudflare/references/workerd/README.md +78 -0
- package/skills/cloudflare/references/workerd/api.md +185 -0
- package/skills/cloudflare/references/workerd/configuration.md +183 -0
- package/skills/cloudflare/references/workerd/gotchas.md +139 -0
- package/skills/cloudflare/references/workerd/patterns.md +192 -0
- package/skills/cloudflare/references/workers/README.md +108 -0
- package/skills/cloudflare/references/workers/api.md +195 -0
- package/skills/cloudflare/references/workers/configuration.md +185 -0
- package/skills/cloudflare/references/workers/frameworks.md +197 -0
- package/skills/cloudflare/references/workers/gotchas.md +137 -0
- package/skills/cloudflare/references/workers/patterns.md +198 -0
- package/skills/cloudflare/references/workers-ai/README.md +197 -0
- package/skills/cloudflare/references/workers-ai/api.md +112 -0
- package/skills/cloudflare/references/workers-ai/configuration.md +97 -0
- package/skills/cloudflare/references/workers-ai/gotchas.md +114 -0
- package/skills/cloudflare/references/workers-ai/patterns.md +120 -0
- package/skills/cloudflare/references/workers-for-platforms/README.md +89 -0
- package/skills/cloudflare/references/workers-for-platforms/api.md +196 -0
- package/skills/cloudflare/references/workers-for-platforms/configuration.md +167 -0
- package/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
- package/skills/cloudflare/references/workers-for-platforms/patterns.md +188 -0
- package/skills/cloudflare/references/workers-playground/README.md +127 -0
- package/skills/cloudflare/references/workers-playground/api.md +101 -0
- package/skills/cloudflare/references/workers-playground/configuration.md +163 -0
- package/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
- package/skills/cloudflare/references/workers-playground/patterns.md +132 -0
- package/skills/cloudflare/references/workers-vpc/README.md +127 -0
- package/skills/cloudflare/references/workers-vpc/api.md +202 -0
- package/skills/cloudflare/references/workers-vpc/configuration.md +147 -0
- package/skills/cloudflare/references/workers-vpc/gotchas.md +167 -0
- package/skills/cloudflare/references/workers-vpc/patterns.md +209 -0
- package/skills/cloudflare/references/workflows/README.md +77 -0
- package/skills/cloudflare/references/workflows/api.md +218 -0
- package/skills/cloudflare/references/workflows/configuration.md +152 -0
- package/skills/cloudflare/references/workflows/gotchas.md +90 -0
- package/skills/cloudflare/references/workflows/patterns.md +175 -0
- package/skills/cloudflare/references/wrangler/README.md +135 -0
- package/skills/cloudflare/references/wrangler/api.md +188 -0
- package/skills/cloudflare/references/wrangler/configuration.md +197 -0
- package/skills/cloudflare/references/wrangler/gotchas.md +197 -0
- package/skills/cloudflare/references/wrangler/patterns.md +209 -0
- package/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +121 -0
- package/skills/cloudflare/references/zaraz/README.md +111 -0
- package/skills/cloudflare/references/zaraz/api.md +112 -0
- package/skills/cloudflare/references/zaraz/configuration.md +90 -0
- package/skills/cloudflare/references/zaraz/gotchas.md +81 -0
- package/skills/cloudflare/references/zaraz/patterns.md +74 -0
- package/skills/cloudflare-email-service/SKILL.md +103 -0
- package/skills/cloudflare-email-service/references/cli-and-mcp.md +125 -0
- package/skills/cloudflare-email-service/references/deliverability.md +285 -0
- package/skills/cloudflare-email-service/references/rest-api.md +184 -0
- package/skills/cloudflare-email-service/references/routing.md +199 -0
- package/skills/cloudflare-email-service/references/sending.md +252 -0
- package/skills/cloudflare-one/SKILL.md +176 -0
- package/skills/cloudflare-one-migrations/SKILL.md +110 -0
- package/skills/durable-objects/SKILL.md +186 -0
- package/skills/durable-objects/references/rules.md +295 -0
- package/skills/durable-objects/references/testing.md +264 -0
- package/skills/durable-objects/references/workers.md +346 -0
- package/skills/sandbox-migrate-to-next/SKILL.md +185 -0
- package/skills/sandbox-next/SKILL.md +91 -0
- package/skills/sandbox-next/references/api-quick-ref.md +94 -0
- package/skills/sandbox-next/references/examples.md +15 -0
- package/skills/sandbox-stable/SKILL.md +110 -0
- package/skills/turnstile-spin/README.md +51 -0
- package/skills/turnstile-spin/SKILL.md +330 -0
- package/skills/turnstile-spin/references/astro.md +199 -0
- package/skills/turnstile-spin/references/hugo.md +114 -0
- package/skills/turnstile-spin/references/nextjs-app.md +261 -0
- package/skills/turnstile-spin/references/nextjs-pages.md +82 -0
- package/skills/turnstile-spin/references/sveltekit.md +191 -0
- package/skills/turnstile-spin/references/vanilla-html.md +157 -0
- package/skills/turnstile-spin/scripts/auth-probe.sh +285 -0
- package/skills/turnstile-spin/scripts/persist-skill.sh +114 -0
- package/skills/turnstile-spin/scripts/validate.sh +137 -0
- package/skills/turnstile-spin/scripts/widget-create.sh +121 -0
- package/skills/turnstile-spin/tests/validation.md +62 -0
- package/skills/workers-best-practices/SKILL.md +127 -0
- package/skills/workers-best-practices/references/review.md +174 -0
- package/skills/workers-best-practices/references/rules.md +467 -0
- package/skills/wrangler/SKILL.md +922 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Workflow Configuration
|
|
2
|
+
|
|
3
|
+
## wrangler.jsonc Setup
|
|
4
|
+
|
|
5
|
+
```jsonc
|
|
6
|
+
{
|
|
7
|
+
"name": "my-worker",
|
|
8
|
+
"main": "src/index.ts",
|
|
9
|
+
"compatibility_date": "2025-01-01", // Minimum 2024-10-22 required for Workflows bindings
|
|
10
|
+
"observability": {
|
|
11
|
+
"enabled": true // Enables Workflows dashboard + structured logs
|
|
12
|
+
},
|
|
13
|
+
"workflows": [
|
|
14
|
+
{
|
|
15
|
+
"name": "my-workflow", // Workflow name
|
|
16
|
+
"binding": "MY_WORKFLOW", // Env binding
|
|
17
|
+
"class_name": "MyWorkflow", // TS class name
|
|
18
|
+
// "script_name": "other-worker" // For cross-script calls
|
|
19
|
+
// "limits": { "steps": 25000 } // Optional: max steps per instance (check docs for default/max per plan)
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"limits": {
|
|
23
|
+
"cpu_ms": 300000 // Check docs for default and max CPU time per plan
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Step Configuration
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
// Basic step
|
|
32
|
+
const data = await step.do('step name', async () => ({ result: 'value' }));
|
|
33
|
+
|
|
34
|
+
// With retry config
|
|
35
|
+
await step.do('api call', {
|
|
36
|
+
retries: {
|
|
37
|
+
limit: 10, // Accepts number or Infinity
|
|
38
|
+
delay: '10 seconds', // Accepts number (ms) or duration string
|
|
39
|
+
backoff: 'exponential' // constant | linear | exponential
|
|
40
|
+
},
|
|
41
|
+
timeout: '30 minutes' // Per-attempt timeout
|
|
42
|
+
}, async () => {
|
|
43
|
+
const res = await fetch('https://api.example.com/data');
|
|
44
|
+
if (!res.ok) throw new Error('Failed');
|
|
45
|
+
return res.json();
|
|
46
|
+
});
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Parallel Steps
|
|
50
|
+
```typescript
|
|
51
|
+
const [user, settings] = await Promise.all([
|
|
52
|
+
step.do('fetch user', async () => this.env.KV.get(`user:${id}`)),
|
|
53
|
+
step.do('fetch settings', async () => this.env.KV.get(`settings:${id}`))
|
|
54
|
+
]);
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Conditional Steps
|
|
58
|
+
```typescript
|
|
59
|
+
const config = await step.do('fetch config', async () =>
|
|
60
|
+
this.env.KV.get('flags', { type: 'json' })
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
// ✅ Deterministic (based on step output)
|
|
64
|
+
if (config.enableEmail) {
|
|
65
|
+
await step.do('send email', async () => sendEmail());
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// ❌ Non-deterministic (Date.now outside step)
|
|
69
|
+
if (Date.now() > deadline) { /* BAD */ }
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Dynamic Steps (Loops)
|
|
73
|
+
```typescript
|
|
74
|
+
const files = await step.do('list files', async () =>
|
|
75
|
+
this.env.BUCKET.list()
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
for (const file of files.objects) {
|
|
79
|
+
await step.do(`process ${file.key}`, async () => {
|
|
80
|
+
const obj = await this.env.BUCKET.get(file.key);
|
|
81
|
+
return processData(await obj.arrayBuffer());
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Multiple Workflows
|
|
87
|
+
|
|
88
|
+
```jsonc
|
|
89
|
+
{
|
|
90
|
+
"workflows": [
|
|
91
|
+
{"name": "user-onboarding", "binding": "USER_ONBOARDING", "class_name": "UserOnboarding"},
|
|
92
|
+
{"name": "data-processing", "binding": "DATA_PROCESSING", "class_name": "DataProcessing"}
|
|
93
|
+
]
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Each class extends `WorkflowEntrypoint` with its own `Params` type.
|
|
98
|
+
|
|
99
|
+
## Cross-Script Bindings
|
|
100
|
+
|
|
101
|
+
Worker A defines workflow. Worker B calls it by adding `script_name`:
|
|
102
|
+
|
|
103
|
+
```jsonc
|
|
104
|
+
// Worker B (caller)
|
|
105
|
+
{
|
|
106
|
+
"workflows": [{
|
|
107
|
+
"name": "billing-workflow",
|
|
108
|
+
"binding": "BILLING",
|
|
109
|
+
"script_name": "billing-worker" // Points to Worker A
|
|
110
|
+
}]
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Bindings
|
|
115
|
+
|
|
116
|
+
Workflows access Cloudflare bindings via `this.env`:
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
type Env = {
|
|
120
|
+
MY_WORKFLOW: Workflow;
|
|
121
|
+
KV: KVNamespace;
|
|
122
|
+
DB: D1Database;
|
|
123
|
+
BUCKET: R2Bucket;
|
|
124
|
+
AI: Ai;
|
|
125
|
+
VECTORIZE: VectorizeIndex;
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
await step.do('use bindings', async () => {
|
|
129
|
+
const kv = await this.env.KV.get('key');
|
|
130
|
+
const db = await this.env.DB.prepare('SELECT * FROM users').first();
|
|
131
|
+
const file = await this.env.BUCKET.get('file.txt');
|
|
132
|
+
const ai = await this.env.AI.run('@cf/meta/llama-2-7b-chat-int8', { prompt: 'Hi' });
|
|
133
|
+
});
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Pages Functions Binding
|
|
137
|
+
|
|
138
|
+
Pages Functions can trigger Workflows via service bindings:
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
// functions/_middleware.ts
|
|
142
|
+
export const onRequest: PagesFunction<Env> = async ({ env, request }) => {
|
|
143
|
+
const instance = await env.MY_WORKFLOW.create({
|
|
144
|
+
params: { url: request.url }
|
|
145
|
+
});
|
|
146
|
+
return new Response(`Started ${instance.id}`);
|
|
147
|
+
};
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Configure in wrangler.jsonc under `service_bindings`.
|
|
151
|
+
|
|
152
|
+
See: [api.md](./api.md), [patterns.md](./patterns.md)
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Gotchas & Debugging
|
|
2
|
+
|
|
3
|
+
## Common Errors
|
|
4
|
+
|
|
5
|
+
### "Step Timeout"
|
|
6
|
+
|
|
7
|
+
**Cause:** Step execution exceeding the default or configured timeout
|
|
8
|
+
**Solution:** Set custom timeout with `step.do('long operation', {timeout: '30 minutes'}, async () => {...})` or increase CPU limit via `limits.cpu_ms` in wrangler.jsonc
|
|
9
|
+
|
|
10
|
+
### "waitForEvent Timeout"
|
|
11
|
+
|
|
12
|
+
**Cause:** Event not received within timeout period (check docs for default/max)
|
|
13
|
+
**Solution:** Wrap in try-catch to handle timeout gracefully and proceed with default behavior
|
|
14
|
+
|
|
15
|
+
### "Non-Deterministic Step Names"
|
|
16
|
+
|
|
17
|
+
**Cause:** Using dynamic values like `Date.now()` in step names causes replay issues
|
|
18
|
+
**Solution:** Use deterministic values like `event.instanceId` for step names
|
|
19
|
+
|
|
20
|
+
### "State Lost in Variables"
|
|
21
|
+
|
|
22
|
+
**Cause:** Using module-level or local variables to store state which is lost on hibernation
|
|
23
|
+
**Solution:** Return values from `step.do()` which are automatically persisted: `const total = await step.do('step 1', async () => 10)`
|
|
24
|
+
|
|
25
|
+
### "Non-Deterministic Conditionals"
|
|
26
|
+
|
|
27
|
+
**Cause:** Using non-deterministic logic (like `Date.now()`) outside steps in conditionals
|
|
28
|
+
**Solution:** Move non-deterministic operations inside steps: `const isLate = await step.do('check', async () => Date.now() > deadline)`
|
|
29
|
+
|
|
30
|
+
### "Large Step Returns Exceeding Limit"
|
|
31
|
+
|
|
32
|
+
**Cause:** Returning data exceeding the per-step return size limit
|
|
33
|
+
**Solution:** Store large data in R2 and return only reference: `{ key: 'r2-object-key' }`. Alternatively, return a `ReadableStream<Uint8Array>` for large binary output
|
|
34
|
+
|
|
35
|
+
### "Step Exceeded CPU Limit But Ran for a Short Time"
|
|
36
|
+
|
|
37
|
+
**Cause:** Confusion between CPU time (active compute) and wall-clock time (includes I/O waits)
|
|
38
|
+
**Solution:** Network requests, database queries, and sleeps don't count toward CPU. The CPU limit refers to active processing time only
|
|
39
|
+
|
|
40
|
+
### "Idempotency Violation"
|
|
41
|
+
|
|
42
|
+
**Cause:** Step operations not idempotent, causing duplicate charges or actions on retry
|
|
43
|
+
**Solution:** Check if operation already completed before executing (e.g., check if customer already charged)
|
|
44
|
+
|
|
45
|
+
### "Instance ID Collision"
|
|
46
|
+
|
|
47
|
+
**Cause:** Reusing instance IDs causing conflicts
|
|
48
|
+
**Solution:** Use unique IDs with timestamp: `await env.MY_WORKFLOW.create({ id: \`${userId}-${Date.now()}\`, params: {} })`
|
|
49
|
+
|
|
50
|
+
### "Instance Data Disappeared After Completion"
|
|
51
|
+
|
|
52
|
+
**Cause:** Completed/errored instances are automatically deleted after the retention period (differs by plan)
|
|
53
|
+
**Solution:** Export critical data to KV/R2/D1 before workflow completes
|
|
54
|
+
|
|
55
|
+
### "Missing await on step.do"
|
|
56
|
+
|
|
57
|
+
**Cause:** Forgetting to await step.do() causing fire-and-forget behavior
|
|
58
|
+
**Solution:** Always await step operations: `await step.do('task', ...)`
|
|
59
|
+
|
|
60
|
+
### "Provided event type is invalid"
|
|
61
|
+
|
|
62
|
+
**Cause:** Using unsupported characters in `waitForEvent` type (e.g. `.`)
|
|
63
|
+
**Solution:** Type only supports letters, digits, `-`, and `_`. Pattern: `^[a-zA-Z0-9_][a-zA-Z0-9-_]*$`
|
|
64
|
+
|
|
65
|
+
## Limits & Pricing
|
|
66
|
+
|
|
67
|
+
Limits and pricing change over time. **Always fetch the latest values** from the official docs before citing specific numbers:
|
|
68
|
+
|
|
69
|
+
- **Limits:** https://developers.cloudflare.com/workflows/reference/limits/
|
|
70
|
+
- **Pricing:** https://developers.cloudflare.com/workflows/reference/pricing/
|
|
71
|
+
|
|
72
|
+
Key areas to check: CPU time per step, max steps per workflow, concurrent instance limits, step return size, event payload size, instance creation rate, subrequest limits, state retention period, and name/ID length constraints.
|
|
73
|
+
|
|
74
|
+
**Behavioral notes** (stable, not subject to number changes):
|
|
75
|
+
- `step.sleep()` and `step.waitForEvent()` don't count toward the max steps limit
|
|
76
|
+
- Instances in `waiting` state (sleeping, waiting for event, waiting for retry) don't count toward the concurrent instance limit
|
|
77
|
+
- CPU time is active processing only — network I/O, DB queries, and sleeps are wall-clock time, not CPU time
|
|
78
|
+
- `waitForEvent` type and workflow/instance names follow pattern `^[a-zA-Z0-9_][a-zA-Z0-9-_]*$`
|
|
79
|
+
|
|
80
|
+
## References
|
|
81
|
+
|
|
82
|
+
- [Official Docs](https://developers.cloudflare.com/workflows/)
|
|
83
|
+
- [Get Started Guide](https://developers.cloudflare.com/workflows/get-started/guide/)
|
|
84
|
+
- [Workers API](https://developers.cloudflare.com/workflows/build/workers-api/)
|
|
85
|
+
- [REST API](https://developers.cloudflare.com/api/resources/workflows/)
|
|
86
|
+
- [Examples](https://developers.cloudflare.com/workflows/examples/)
|
|
87
|
+
- [Limits](https://developers.cloudflare.com/workflows/reference/limits/)
|
|
88
|
+
- [Pricing](https://developers.cloudflare.com/workflows/reference/pricing/)
|
|
89
|
+
|
|
90
|
+
See: [README.md](./README.md), [configuration.md](./configuration.md), [api.md](./api.md), [patterns.md](./patterns.md)
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# Workflow Patterns
|
|
2
|
+
|
|
3
|
+
## Image Processing Pipeline
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export class ImageProcessingWorkflow extends WorkflowEntrypoint<Env, Params> {
|
|
7
|
+
async run(event, step) {
|
|
8
|
+
const imageData = await step.do('fetch', async () => (await this.env.BUCKET.get(event.payload.imageKey)).arrayBuffer());
|
|
9
|
+
const description = await step.do('generate description', async () =>
|
|
10
|
+
await this.env.AI.run('@cf/llava-hf/llava-1.5-7b-hf', {image: Array.from(new Uint8Array(imageData)), prompt: 'Describe this image', max_tokens: 50})
|
|
11
|
+
);
|
|
12
|
+
await step.waitForEvent('await approval', { type: 'approved', timeout: '24h' });
|
|
13
|
+
await step.do('publish', async () => await this.env.BUCKET.put(`public/${event.payload.imageKey}`, imageData));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## User Lifecycle
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
export class UserLifecycleWorkflow extends WorkflowEntrypoint<Env, Params> {
|
|
22
|
+
async run(event, step) {
|
|
23
|
+
await step.do('welcome email', async () => await sendEmail(event.payload.email, 'Welcome!'));
|
|
24
|
+
await step.sleep('trial period', '7 days');
|
|
25
|
+
const hasConverted = await step.do('check conversion', async () => {
|
|
26
|
+
const user = await this.env.DB.prepare('SELECT subscription_status FROM users WHERE id = ?').bind(event.payload.userId).first();
|
|
27
|
+
return user.subscription_status === 'active';
|
|
28
|
+
});
|
|
29
|
+
if (!hasConverted) await step.do('trial expiration email', async () => await sendEmail(event.payload.email, 'Trial ending'));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Data Pipeline
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
export class DataPipelineWorkflow extends WorkflowEntrypoint<Env, Params> {
|
|
38
|
+
async run(event, step) {
|
|
39
|
+
const rawData = await step.do('extract', {retries: { limit: 10, delay: '30s', backoff: 'exponential' }}, async () => {
|
|
40
|
+
const res = await fetch(event.payload.sourceUrl);
|
|
41
|
+
if (!res.ok) throw new Error('Fetch failed');
|
|
42
|
+
return res.json();
|
|
43
|
+
});
|
|
44
|
+
const transformed = await step.do('transform', async () =>
|
|
45
|
+
rawData.map(item => ({ id: item.id, normalized: normalizeData(item) }))
|
|
46
|
+
);
|
|
47
|
+
const dataRef = await step.do('store', async () => {
|
|
48
|
+
const key = `processed/${Date.now()}.json`;
|
|
49
|
+
await this.env.BUCKET.put(key, JSON.stringify(transformed));
|
|
50
|
+
return { key };
|
|
51
|
+
});
|
|
52
|
+
await step.do('load', async () => {
|
|
53
|
+
const data = await (await this.env.BUCKET.get(dataRef.key)).json();
|
|
54
|
+
for (let i = 0; i < data.length; i += 100) {
|
|
55
|
+
await this.env.DB.batch(data.slice(i, i + 100).map(item =>
|
|
56
|
+
this.env.DB.prepare('INSERT INTO records VALUES (?, ?)').bind(item.id, item.normalized)
|
|
57
|
+
));
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Human-in-the-Loop Approval
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
export class ApprovalWorkflow extends WorkflowEntrypoint<Env, Params> {
|
|
68
|
+
async run(event, step) {
|
|
69
|
+
await step.do('create approval', async () => await this.env.DB.prepare('INSERT INTO approvals (id, user_id, status) VALUES (?, ?, ?)').bind(event.instanceId, event.payload.userId, 'pending').run());
|
|
70
|
+
try {
|
|
71
|
+
const approval = await step.waitForEvent<{ approved: boolean }>('wait for approval', { type: 'approval-response', timeout: '48h' });
|
|
72
|
+
if (approval.approved) { await step.do('process approval', async () => {}); }
|
|
73
|
+
else { await step.do('handle rejection', async () => {}); }
|
|
74
|
+
} catch (e) {
|
|
75
|
+
await step.do('auto reject', async () => await this.env.DB.prepare('UPDATE approvals SET status = ? WHERE id = ?').bind('auto-rejected', event.instanceId).run());
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Testing Workflows
|
|
82
|
+
|
|
83
|
+
### Setup
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
// vitest.config.ts
|
|
87
|
+
import { defineWorkersConfig } from '@cloudflare/vitest-pool-workers/config';
|
|
88
|
+
|
|
89
|
+
export default defineWorkersConfig({
|
|
90
|
+
test: {
|
|
91
|
+
poolOptions: {
|
|
92
|
+
workers: {
|
|
93
|
+
wrangler: { configPath: './wrangler.jsonc' }
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Introspection API
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
import { introspectWorkflowInstance } from 'cloudflare:test';
|
|
104
|
+
|
|
105
|
+
const instance = await env.MY_WORKFLOW.create({ params: { userId: '123' } });
|
|
106
|
+
const introspector = await introspectWorkflowInstance(env.MY_WORKFLOW, instance.id);
|
|
107
|
+
|
|
108
|
+
// Wait for step completion
|
|
109
|
+
const result = await introspector.waitForStepResult({ name: 'fetch user', index: 0 });
|
|
110
|
+
|
|
111
|
+
// Mock step behavior
|
|
112
|
+
await introspector.modify(async (m) => {
|
|
113
|
+
await m.mockStepResult({ name: 'api call' }, { mocked: true });
|
|
114
|
+
});
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Best Practices
|
|
118
|
+
|
|
119
|
+
### ✅ DO
|
|
120
|
+
|
|
121
|
+
1. **Granular steps**: One API call per step (unless proving idempotency)
|
|
122
|
+
2. **Idempotency**: Check-then-execute; use idempotency keys
|
|
123
|
+
3. **Deterministic names**: Use static or step-output-based names
|
|
124
|
+
4. **Return state**: Persist via step returns, not variables
|
|
125
|
+
5. **Always await**: `await step.do()`, avoid dangling promises
|
|
126
|
+
6. **Deterministic conditionals**: Base on `event.payload` or step outputs
|
|
127
|
+
7. **Store large data externally**: R2/KV for data exceeding step return limit, return refs
|
|
128
|
+
8. **Batch creation**: `createBatch()` for multiple instances
|
|
129
|
+
|
|
130
|
+
### ❌ DON'T
|
|
131
|
+
|
|
132
|
+
1. **One giant step**: Breaks durability & retry control
|
|
133
|
+
2. **State outside steps**: Lost on hibernation
|
|
134
|
+
3. **Mutate events**: Events immutable, return new state
|
|
135
|
+
4. **Non-deterministic logic outside steps**: `Math.random()`, `Date.now()` must be in steps
|
|
136
|
+
5. **Side effects outside steps**: May duplicate on restart
|
|
137
|
+
6. **Non-deterministic step names**: Prevents caching
|
|
138
|
+
7. **Ignore timeouts**: `waitForEvent` throws, use try-catch
|
|
139
|
+
8. **Reuse instance IDs**: Must be unique within retention
|
|
140
|
+
|
|
141
|
+
## Orchestration Patterns
|
|
142
|
+
|
|
143
|
+
### Fan-Out (Parallel Processing)
|
|
144
|
+
```typescript
|
|
145
|
+
const files = await step.do('list', async () => this.env.BUCKET.list());
|
|
146
|
+
await Promise.all(files.objects.map((file, i) => step.do(`process ${i}`, async () => processFile(await (await this.env.BUCKET.get(file.key)).arrayBuffer()))));
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Parent-Child Workflows
|
|
150
|
+
```typescript
|
|
151
|
+
const child = await step.do('start child', async () => await this.env.CHILD_WORKFLOW.create({id: `child-${event.instanceId}`, params: { data: result.data }}));
|
|
152
|
+
await step.do('other work', async () => console.log(`Child started: ${child.id}`));
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Race Pattern
|
|
156
|
+
```typescript
|
|
157
|
+
const winner = await Promise.race([
|
|
158
|
+
step.do('option A', async () => slowOperation()),
|
|
159
|
+
step.do('option B', async () => fastOperation())
|
|
160
|
+
]);
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Scheduled Workflow Chain
|
|
164
|
+
```typescript
|
|
165
|
+
export default { async scheduled(event, env) { await env.DAILY_WORKFLOW.create({id: `daily-${event.scheduledTime}`, params: { timestamp: event.scheduledTime }}); }};
|
|
166
|
+
export class DailyWorkflow extends WorkflowEntrypoint<Env, Params> {
|
|
167
|
+
async run(event, step) {
|
|
168
|
+
await step.do('daily task', async () => {});
|
|
169
|
+
await step.sleep('wait 7 days', '7 days');
|
|
170
|
+
await step.do('weekly followup', async () => {});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
See: [configuration.md](./configuration.md), [api.md](./api.md), [gotchas.md](./gotchas.md)
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Cloudflare Wrangler
|
|
2
|
+
|
|
3
|
+
Official CLI for Cloudflare Workers - develop, manage, and deploy Workers from the command line.
|
|
4
|
+
|
|
5
|
+
## What is Wrangler?
|
|
6
|
+
|
|
7
|
+
Wrangler is the Cloudflare Developer Platform CLI that allows you to:
|
|
8
|
+
- Create, develop, and deploy Workers
|
|
9
|
+
- Manage bindings (KV, D1, R2, Durable Objects, etc.)
|
|
10
|
+
- Configure routing and environments
|
|
11
|
+
- Run local development servers
|
|
12
|
+
- Execute migrations and manage resources
|
|
13
|
+
- Perform integration testing
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install wrangler --save-dev
|
|
19
|
+
# or globally
|
|
20
|
+
npm install -g wrangler
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Run commands: `npx wrangler <command>` (or `pnpm`/`yarn wrangler`)
|
|
24
|
+
|
|
25
|
+
## Reading Order
|
|
26
|
+
|
|
27
|
+
| If you want to... | Start here |
|
|
28
|
+
|-------------------|------------|
|
|
29
|
+
| Create/deploy Worker quickly | Essential Commands below → [patterns.md](./patterns.md) §New Worker |
|
|
30
|
+
| Configure bindings (KV, D1, R2) | [configuration.md](./configuration.md) §Bindings |
|
|
31
|
+
| Write integration tests | [api.md](./api.md) §startWorker |
|
|
32
|
+
| Debug production issues | [gotchas.md](./gotchas.md) + Essential Commands §Monitoring |
|
|
33
|
+
| Set up multi-environment workflow | [configuration.md](./configuration.md) §Environments |
|
|
34
|
+
|
|
35
|
+
## Essential Commands
|
|
36
|
+
|
|
37
|
+
### Project & Development
|
|
38
|
+
```bash
|
|
39
|
+
wrangler init [name] # Create new project
|
|
40
|
+
wrangler dev # Local dev server (fast, simulated)
|
|
41
|
+
wrangler dev --remote # Dev with remote resources (production-like)
|
|
42
|
+
wrangler deploy # Deploy to production
|
|
43
|
+
wrangler deploy --env staging # Deploy to environment
|
|
44
|
+
wrangler versions list # List versions
|
|
45
|
+
wrangler rollback [id] # Rollback deployment
|
|
46
|
+
wrangler login # OAuth login
|
|
47
|
+
wrangler whoami # Check auth status
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Resource Management
|
|
51
|
+
|
|
52
|
+
### KV
|
|
53
|
+
```bash
|
|
54
|
+
wrangler kv namespace create NAME
|
|
55
|
+
wrangler kv key put "key" "value" --namespace-id=<id>
|
|
56
|
+
wrangler kv key get "key" --namespace-id=<id>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### D1
|
|
60
|
+
```bash
|
|
61
|
+
wrangler d1 create NAME
|
|
62
|
+
wrangler d1 execute NAME --command "SQL"
|
|
63
|
+
wrangler d1 migrations create NAME "description"
|
|
64
|
+
wrangler d1 migrations apply NAME
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### R2
|
|
68
|
+
```bash
|
|
69
|
+
wrangler r2 bucket create NAME
|
|
70
|
+
wrangler r2 object put BUCKET/key --file path
|
|
71
|
+
wrangler r2 object get BUCKET/key
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Other Resources
|
|
75
|
+
```bash
|
|
76
|
+
wrangler queues create NAME
|
|
77
|
+
wrangler vectorize create NAME --dimensions N --metric cosine
|
|
78
|
+
wrangler hyperdrive create NAME --connection-string "..."
|
|
79
|
+
wrangler workflows create NAME
|
|
80
|
+
wrangler constellation create NAME
|
|
81
|
+
wrangler pages project create NAME
|
|
82
|
+
wrangler pages deployment create --project NAME --branch main
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Secrets
|
|
86
|
+
```bash
|
|
87
|
+
wrangler secret put NAME # Set Worker secret
|
|
88
|
+
wrangler secret list # List Worker secrets
|
|
89
|
+
wrangler secret delete NAME # Delete Worker secret
|
|
90
|
+
wrangler secret bulk FILE.json # Bulk upload from JSON
|
|
91
|
+
|
|
92
|
+
# Secrets Store (centralized, reusable across Workers)
|
|
93
|
+
wrangler secrets-store secret create <store-id> --name SECRET_NAME --scopes workers --remote
|
|
94
|
+
wrangler secrets-store secret list <store-id> --remote
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Monitoring
|
|
98
|
+
```bash
|
|
99
|
+
wrangler tail # Real-time logs
|
|
100
|
+
wrangler tail --env production # Tail specific env
|
|
101
|
+
wrangler tail --status error # Filter by status
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## In This Reference
|
|
105
|
+
|
|
106
|
+
- [configuration.md](./configuration.md) - wrangler.jsonc setup, environments, bindings
|
|
107
|
+
- [api.md](./api.md) - Programmatic API (`startWorker`, `getPlatformProxy`, events)
|
|
108
|
+
- [patterns.md](./patterns.md) - Common workflows and development patterns
|
|
109
|
+
- [gotchas.md](./gotchas.md) - Common pitfalls, limits, and troubleshooting
|
|
110
|
+
|
|
111
|
+
## Quick Decision Tree
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
Need to test your Worker?
|
|
115
|
+
├─ Testing full Worker with bindings → api.md §startWorker
|
|
116
|
+
├─ Testing individual functions → api.md §getPlatformProxy
|
|
117
|
+
└─ Testing with Vitest → patterns.md §Testing with Vitest
|
|
118
|
+
|
|
119
|
+
Need to configure something?
|
|
120
|
+
├─ Bindings (KV, D1, R2, etc.) → configuration.md §Bindings
|
|
121
|
+
├─ Multiple environments → configuration.md §Environments
|
|
122
|
+
├─ Static files → configuration.md §Workers Assets
|
|
123
|
+
└─ Routing → configuration.md §Routing
|
|
124
|
+
|
|
125
|
+
Development not working?
|
|
126
|
+
├─ Local differs from production → Use `wrangler dev --remote`
|
|
127
|
+
├─ Bindings not available → gotchas.md §Binding Not Available
|
|
128
|
+
└─ Auth issues → wrangler login
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## See Also
|
|
132
|
+
|
|
133
|
+
- [workers](../workers/) - Workers runtime API reference
|
|
134
|
+
- [miniflare](../miniflare/) - Local testing with Miniflare
|
|
135
|
+
- [workerd](../workerd/) - Runtime that powers `wrangler dev`
|