opencodekit 0.15.3 → 0.15.5
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/dist/index.js +1 -1
- package/dist/template/.opencode/AGENTS.md +209 -77
- package/dist/template/.opencode/agent/plan.md +4 -0
- package/dist/template/.opencode/command/cloudflare.md +70 -0
- package/dist/template/.opencode/package.json +1 -1
- package/dist/template/.opencode/skill/cloudflare/SKILL.md +233 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/README.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/api.md +100 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/configuration.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/gotchas.md +59 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/patterns.md +89 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-gateway/README.md +695 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/api.md +38 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/configuration.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/gotchas.md +41 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/patterns.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/api.md +27 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/configuration.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/gotchas.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/patterns.md +36 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/README.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/api.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/configuration.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/gotchas.md +28 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/patterns.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/README.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/api.md +78 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/configuration.md +128 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/gotchas.md +51 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/patterns.md +145 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/api.md +50 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/configuration.md +53 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/gotchas.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/patterns.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/configuration.md +58 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/gotchas.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/patterns.md +37 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/README.md +71 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/api.md +168 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/configuration.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/gotchas.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/patterns.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/api.md +54 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/configuration.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/gotchas.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/patterns.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/c3/README.md +264 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/README.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/api.md +176 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/configuration.md +164 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/gotchas.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/patterns.md +180 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/api.md +43 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/configuration.md +56 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/gotchas.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/patterns.md +40 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/README.md +85 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/api.md +198 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/configuration.md +151 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/gotchas.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/patterns.md +122 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/README.md +92 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/api.md +141 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/gotchas.md +70 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/patterns.md +144 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/README.md +34 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/api.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/configuration.md +67 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/gotchas.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/patterns.md +158 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/api.md +89 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/configuration.md +116 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/gotchas.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/patterns.md +112 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/README.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/api.md +152 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/configuration.md +148 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/gotchas.md +158 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/patterns.md +255 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/api.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/configuration.md +63 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/gotchas.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/patterns.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-workers/README.md +598 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/api.md +137 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/configuration.md +133 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/gotchas.md +184 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/patterns.md +176 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/configuration.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/gotchas.md +23 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/patterns.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/README.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/api.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/configuration.md +92 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/gotchas.md +117 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/patterns.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/README.md +64 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/api.md +144 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/configuration.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/gotchas.md +187 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/patterns.md +211 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/README.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/api.md +240 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/gotchas.md +171 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/patterns.md +171 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/api.md +51 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/configuration.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/gotchas.md +36 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/README.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/api.md +200 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/configuration.md +228 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/gotchas.md +161 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/patterns.md +145 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/README.md +57 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/api.md +201 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/configuration.md +159 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/gotchas.md +151 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/patterns.md +190 -0
- package/dist/template/.opencode/skill/cloudflare/references/pipelines/README.md +664 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/README.md +107 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/api.md +194 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/configuration.md +216 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/gotchas.md +223 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/patterns.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/README.md +69 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/api.md +138 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/configuration.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/gotchas.md +112 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/patterns.md +155 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/README.md +61 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/api.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/configuration.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/gotchas.md +94 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/patterns.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/api.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/configuration.md +39 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/gotchas.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/patterns.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-sql/README.md +512 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/README.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/api.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/configuration.md +63 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/gotchas.md +75 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/patterns.md +102 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/README.md +81 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/api.md +164 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/configuration.md +147 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/gotchas.md +172 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/patterns.md +155 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/README.md +90 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/api.md +178 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/configuration.md +131 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/gotchas.md +156 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/patterns.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/README.md +58 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/api.md +182 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/configuration.md +140 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/gotchas.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/patterns.md +218 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/README.md +91 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/api.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/configuration.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/gotchas.md +87 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/patterns.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/README.md +15 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/api.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/configuration.md +33 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/gotchas.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/patterns.md +34 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/api.md +24 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/configuration.md +43 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/gotchas.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/patterns.md +40 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/configuration.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/gotchas.md +44 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/README.md +103 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/api.md +204 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/gotchas.md +131 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/patterns.md +152 -0
- package/dist/template/.opencode/skill/cloudflare/references/tail-workers/README.md +640 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/README.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/api.md +159 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/configuration.md +156 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/gotchas.md +207 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/patterns.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/README.md +82 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/api.md +105 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/configuration.md +113 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/gotchas.md +115 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/patterns.md +157 -0
- package/dist/template/.opencode/skill/cloudflare/references/turn/README.md +699 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/configuration.md +19 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/gotchas.md +27 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/patterns.md +41 -0
- package/dist/template/.opencode/skill/cloudflare/references/vectorize/README.md +682 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/configuration.md +44 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/gotchas.md +24 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/patterns.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/README.md +19 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/api.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/configuration.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/gotchas.md +28 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/patterns.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/README.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/api.md +199 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/configuration.md +185 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/gotchas.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/patterns.md +216 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/README.md +96 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/api.md +137 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/configuration.md +147 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/gotchas.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/patterns.md +149 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-ai/README.md +116 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/README.md +48 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/api.md +169 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/configuration.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/gotchas.md +130 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/patterns.md +170 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/api.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/configuration.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/gotchas.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-vpc/README.md +579 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/api.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/configuration.md +177 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/gotchas.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/patterns.md +132 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/README.md +90 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/api.md +140 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/configuration.md +128 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/gotchas.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/patterns.md +150 -0
- package/dist/template/.opencode/skill/cloudflare/references/zaraz/README.md +360 -0
- package/dist/template/.opencode/skill/react-best-practices/AGENTS.md +2410 -0
- package/dist/template/.opencode/skill/react-best-practices/README.md +123 -0
- package/dist/template/.opencode/skill/react-best-practices/SKILL.md +125 -0
- package/dist/template/.opencode/skill/react-best-practices/metadata.json +15 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/_sections.md +46 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/_template.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-api-routes.md +38 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-defer-await.md +80 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-dependencies.md +36 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-parallel.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-conditional.md +31 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-preload.md +50 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-event-listeners.md +74 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-storage.md +70 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-early-exit.md +50 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-index-maps.md +37 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-length-check-first.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-activity.md +26 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-memo.md +44 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-transitions.md +40 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-lru.md +41 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-react.md +76 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-serialization.md +38 -0
- package/dist/template/.opencode/skill/supabase/SKILL.md +120 -0
- package/dist/template/.opencode/skill/supabase/mcp.json +27 -0
- package/dist/template/.opencode/skill/vercel-deploy-claimable/SKILL.md +112 -0
- package/dist/template/.opencode/skill/vercel-deploy-claimable/scripts/deploy.sh +249 -0
- package/dist/template/.opencode/skill/web-design-guidelines/SKILL.md +39 -0
- package/package.json +1 -1
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Configuration
|
|
2
|
+
|
|
3
|
+
## getSandbox Options
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
const sandbox = getSandbox(env.Sandbox, 'sandbox-id', {
|
|
7
|
+
normalizeId: true, // lowercase ID (required for preview URLs)
|
|
8
|
+
sleepAfter: '30m', // sleep after inactivity: '5m', '1h', '2d'
|
|
9
|
+
keepAlive: false, // false = auto-timeout, true = never sleep
|
|
10
|
+
|
|
11
|
+
containerTimeouts: {
|
|
12
|
+
instanceGetTimeoutMS: 30000, // 30s for provisioning
|
|
13
|
+
portReadyTimeoutMS: 90000 // 90s for container startup
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Sleep Config**:
|
|
19
|
+
- `sleepAfter`: Duration string (e.g., '5m', '30m', '1h')
|
|
20
|
+
- `keepAlive: false`: Auto-sleep (default, cost-optimized)
|
|
21
|
+
- `keepAlive: true`: Never sleep (higher cost, faster response)
|
|
22
|
+
- Sleeping sandboxes wake automatically (cold start)
|
|
23
|
+
|
|
24
|
+
## Instance Types
|
|
25
|
+
|
|
26
|
+
wrangler.jsonc `instance_type`:
|
|
27
|
+
- `lite`: 256MB RAM, 0.5 vCPU (default)
|
|
28
|
+
- `standard`: 512MB RAM, 1 vCPU
|
|
29
|
+
- `heavy`: 1GB RAM, 2 vCPU
|
|
30
|
+
|
|
31
|
+
## Dockerfile Patterns
|
|
32
|
+
|
|
33
|
+
**Basic**:
|
|
34
|
+
```dockerfile
|
|
35
|
+
FROM docker.io/cloudflare/sandbox:latest
|
|
36
|
+
RUN pip3 install --no-cache-dir pandas numpy
|
|
37
|
+
EXPOSE 8080 # Required for wrangler dev
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Scientific**:
|
|
41
|
+
```dockerfile
|
|
42
|
+
FROM docker.io/cloudflare/sandbox:latest
|
|
43
|
+
RUN pip3 install --no-cache-dir \
|
|
44
|
+
jupyter-server ipykernel matplotlib \
|
|
45
|
+
pandas seaborn plotly scipy scikit-learn
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Node.js**:
|
|
49
|
+
```dockerfile
|
|
50
|
+
FROM docker.io/cloudflare/sandbox:latest
|
|
51
|
+
RUN npm install -g typescript ts-node
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**CRITICAL**: `EXPOSE` required for `wrangler dev` port access. Production auto-exposes all ports.
|
|
55
|
+
|
|
56
|
+
## CLI Commands
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# Dev
|
|
60
|
+
wrangler dev # Start local dev server
|
|
61
|
+
wrangler deploy # Deploy to production
|
|
62
|
+
wrangler tail # Monitor logs
|
|
63
|
+
wrangler containers list # Check container status
|
|
64
|
+
wrangler secret put KEY # Set secret
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Environment & Secrets
|
|
68
|
+
|
|
69
|
+
**wrangler.jsonc**:
|
|
70
|
+
```jsonc
|
|
71
|
+
{
|
|
72
|
+
"vars": {
|
|
73
|
+
"ENVIRONMENT": "production",
|
|
74
|
+
"API_URL": "https://api.example.com"
|
|
75
|
+
},
|
|
76
|
+
"r2_buckets": [{
|
|
77
|
+
"binding": "DATA_BUCKET",
|
|
78
|
+
"bucket_name": "my-data-bucket"
|
|
79
|
+
}]
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Usage**:
|
|
84
|
+
```typescript
|
|
85
|
+
const token = env.GITHUB_TOKEN; // From wrangler secret
|
|
86
|
+
await sandbox.exec('git clone ...', {
|
|
87
|
+
env: { GIT_TOKEN: token }
|
|
88
|
+
});
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Preview URL Setup
|
|
92
|
+
|
|
93
|
+
**Prerequisites**:
|
|
94
|
+
- Custom domain with wildcard DNS: `*.yourdomain.com → worker.yourdomain.com`
|
|
95
|
+
- `.workers.dev` domains NOT supported
|
|
96
|
+
- `normalizeId: true` in getSandbox
|
|
97
|
+
- `proxyToSandbox()` called first in fetch handler
|
|
98
|
+
|
|
99
|
+
## Cron Triggers (Pre-warming)
|
|
100
|
+
|
|
101
|
+
```jsonc
|
|
102
|
+
{
|
|
103
|
+
"triggers": {
|
|
104
|
+
"crons": ["*/5 * * * *"] // Every 5 minutes
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
export default {
|
|
111
|
+
async scheduled(event: ScheduledEvent, env: Env) {
|
|
112
|
+
const sandbox = getSandbox(env.Sandbox, 'main');
|
|
113
|
+
await sandbox.exec('echo "keepalive"'); // Wake sandbox
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## R2 Storage Integration
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
await sandbox.mountStorage({
|
|
122
|
+
type: 'r2',
|
|
123
|
+
bucket: env.DATA_BUCKET,
|
|
124
|
+
mountPoint: '/data',
|
|
125
|
+
readOnly: false
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
// Access mounted storage
|
|
129
|
+
await sandbox.exec('python3 process.py', { cwd: '/data/datasets' });
|
|
130
|
+
await sandbox.writeFile('/data/output/results.csv', csvData);
|
|
131
|
+
```
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# Gotchas & Best Practices
|
|
2
|
+
|
|
3
|
+
## Common Issues
|
|
4
|
+
|
|
5
|
+
### Container Not Ready
|
|
6
|
+
**Error**: `CONTAINER_NOT_READY`
|
|
7
|
+
**Cause**: Container still provisioning (first request or after sleep)
|
|
8
|
+
**Fix**: Retry after 2-3s
|
|
9
|
+
|
|
10
|
+
```typescript
|
|
11
|
+
async function execWithRetry(sandbox, cmd) {
|
|
12
|
+
for (let i = 0; i < 3; i++) {
|
|
13
|
+
try {
|
|
14
|
+
return await sandbox.exec(cmd);
|
|
15
|
+
} catch (e) {
|
|
16
|
+
if (e.code === 'CONTAINER_NOT_READY') {
|
|
17
|
+
await new Promise(r => setTimeout(r, 2000));
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
throw e;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Port Exposure Fails in Dev
|
|
27
|
+
**Error**: "Connection refused: container port not found"
|
|
28
|
+
**Cause**: Missing `EXPOSE` directive in Dockerfile
|
|
29
|
+
**Fix**: Add `EXPOSE <port>` to Dockerfile (only needed for `wrangler dev`, production auto-exposes)
|
|
30
|
+
|
|
31
|
+
### Preview URLs Not Working
|
|
32
|
+
**Checklist**:
|
|
33
|
+
1. Custom domain configured? (not `.workers.dev`)
|
|
34
|
+
2. Wildcard DNS set up? (`*.domain.com → worker.domain.com`)
|
|
35
|
+
3. `normalizeId: true` in getSandbox?
|
|
36
|
+
4. `proxyToSandbox()` called first in fetch?
|
|
37
|
+
|
|
38
|
+
### Slow First Request
|
|
39
|
+
**Cause**: Cold start (container provisioning)
|
|
40
|
+
**Solutions**:
|
|
41
|
+
- Use `sleepAfter` instead of creating new sandboxes
|
|
42
|
+
- Pre-warm with cron triggers
|
|
43
|
+
- Set `keepAlive: true` for critical sandboxes
|
|
44
|
+
|
|
45
|
+
### File Not Persisting
|
|
46
|
+
**Cause**: Files in `/tmp` or other ephemeral paths
|
|
47
|
+
**Fix**: Use `/workspace` for persistent files
|
|
48
|
+
|
|
49
|
+
## Performance Optimization
|
|
50
|
+
|
|
51
|
+
### Sandbox ID Strategy
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
// ❌ BAD: Creates new sandbox every time (slow, expensive)
|
|
55
|
+
const sandbox = getSandbox(env.Sandbox, `user-${Date.now()}`);
|
|
56
|
+
|
|
57
|
+
// ✅ GOOD: Reuse sandbox per user
|
|
58
|
+
const sandbox = getSandbox(env.Sandbox, `user-${userId}`);
|
|
59
|
+
|
|
60
|
+
// ✅ GOOD: Reuse for temporary tasks
|
|
61
|
+
const sandbox = getSandbox(env.Sandbox, 'shared-runner');
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Sleep Configuration
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
// Cost-optimized: Sleep after 30min inactivity
|
|
68
|
+
const sandbox = getSandbox(env.Sandbox, 'id', {
|
|
69
|
+
sleepAfter: '30m',
|
|
70
|
+
keepAlive: false
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
// Always-on (higher cost, faster response)
|
|
74
|
+
const sandbox = getSandbox(env.Sandbox, 'id', {
|
|
75
|
+
keepAlive: true
|
|
76
|
+
});
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Increase max_instances for High Traffic
|
|
80
|
+
|
|
81
|
+
```jsonc
|
|
82
|
+
{
|
|
83
|
+
"containers": [{
|
|
84
|
+
"class_name": "Sandbox",
|
|
85
|
+
"max_instances": 50 // Allow 50 concurrent sandboxes
|
|
86
|
+
}]
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Security Best Practices
|
|
91
|
+
|
|
92
|
+
### Sandbox Isolation
|
|
93
|
+
- Each sandbox = isolated container (filesystem, network, processes)
|
|
94
|
+
- Use unique sandbox IDs per tenant for multi-tenant apps
|
|
95
|
+
- Sandboxes cannot communicate directly
|
|
96
|
+
|
|
97
|
+
### Input Validation
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
// ❌ DANGEROUS: Command injection
|
|
101
|
+
const result = await sandbox.exec(`python3 -c "${userCode}"`);
|
|
102
|
+
|
|
103
|
+
// ✅ SAFE: Write to file, execute file
|
|
104
|
+
await sandbox.writeFile('/workspace/user_code.py', userCode);
|
|
105
|
+
const result = await sandbox.exec('python3 /workspace/user_code.py');
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Resource Limits
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
// Timeout long-running commands
|
|
112
|
+
const result = await sandbox.exec('python3 script.py', {
|
|
113
|
+
timeout: 30000 // 30 seconds
|
|
114
|
+
});
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Secrets Management
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
// ❌ NEVER hardcode secrets
|
|
121
|
+
const token = 'ghp_abc123';
|
|
122
|
+
|
|
123
|
+
// ✅ Use environment secrets
|
|
124
|
+
const token = env.GITHUB_TOKEN;
|
|
125
|
+
|
|
126
|
+
// Pass to sandbox via exec env
|
|
127
|
+
const result = await sandbox.exec('git clone ...', {
|
|
128
|
+
env: { GIT_TOKEN: token }
|
|
129
|
+
});
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Preview URL Security
|
|
133
|
+
Preview URLs include auto-generated tokens:
|
|
134
|
+
```
|
|
135
|
+
https://8080-sandbox-abc123def456.yourdomain.com
|
|
136
|
+
```
|
|
137
|
+
Token changes on each expose operation, preventing unauthorized access.
|
|
138
|
+
|
|
139
|
+
## Limits
|
|
140
|
+
|
|
141
|
+
- **Instance types**: lite (256MB), standard (512MB), heavy (1GB)
|
|
142
|
+
- **Default timeout**: 120s for exec operations
|
|
143
|
+
- **First deploy**: 2-3 min for container provisioning
|
|
144
|
+
- **Cold start**: 2-3s when waking from sleep
|
|
145
|
+
|
|
146
|
+
## Production Guide
|
|
147
|
+
|
|
148
|
+
See: https://developers.cloudflare.com/sandbox/guides/production-deployment/
|
|
149
|
+
|
|
150
|
+
## Resources
|
|
151
|
+
|
|
152
|
+
- [Official Docs](https://developers.cloudflare.com/sandbox/)
|
|
153
|
+
- [API Reference](https://developers.cloudflare.com/sandbox/api/)
|
|
154
|
+
- [Examples](https://github.com/cloudflare/sandbox-sdk/tree/main/examples)
|
|
155
|
+
- [npm Package](https://www.npmjs.com/package/@cloudflare/sandbox)
|
|
156
|
+
- [Discord Support](https://discord.cloudflare.com)
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# Common Patterns
|
|
2
|
+
|
|
3
|
+
## AI Code Execution Agent
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export default {
|
|
7
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
8
|
+
const { code } = await request.json();
|
|
9
|
+
const sandbox = getSandbox(env.Sandbox, 'ai-agent');
|
|
10
|
+
|
|
11
|
+
// Execute user code safely
|
|
12
|
+
await sandbox.writeFile('/workspace/user_code.py', code);
|
|
13
|
+
const result = await sandbox.exec('python3 /workspace/user_code.py');
|
|
14
|
+
|
|
15
|
+
return Response.json({
|
|
16
|
+
output: result.stdout,
|
|
17
|
+
error: result.stderr,
|
|
18
|
+
success: result.success
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Interactive Dev Environment
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
export default {
|
|
28
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
29
|
+
const proxyResponse = await proxyToSandbox(request, env);
|
|
30
|
+
if (proxyResponse) return proxyResponse;
|
|
31
|
+
|
|
32
|
+
const sandbox = getSandbox(env.Sandbox, 'ide', { normalizeId: true });
|
|
33
|
+
|
|
34
|
+
if (request.url.endsWith('/start')) {
|
|
35
|
+
await sandbox.exec('curl -fsSL https://code-server.dev/install.sh | sh');
|
|
36
|
+
await sandbox.startProcess('code-server --bind-addr 0.0.0.0:8080', {
|
|
37
|
+
processId: 'vscode'
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const exposed = await sandbox.exposePort(8080);
|
|
41
|
+
return Response.json({ url: exposed.url });
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return new Response('Try /start');
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## CI/CD Pipeline
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
export default {
|
|
53
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
54
|
+
const { repo, branch } = await request.json();
|
|
55
|
+
const sandbox = getSandbox(env.Sandbox, `ci-${repo}-${Date.now()}`);
|
|
56
|
+
|
|
57
|
+
await sandbox.exec(`git clone -b ${branch} ${repo} /workspace/repo`);
|
|
58
|
+
|
|
59
|
+
const install = await sandbox.exec('npm install', {
|
|
60
|
+
cwd: '/workspace/repo',
|
|
61
|
+
stream: true,
|
|
62
|
+
onOutput: (stream, data) => console.log(data)
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
if (!install.success) {
|
|
66
|
+
return Response.json({ success: false, error: 'Install failed' });
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const test = await sandbox.exec('npm test', { cwd: '/workspace/repo' });
|
|
70
|
+
|
|
71
|
+
return Response.json({
|
|
72
|
+
success: test.success,
|
|
73
|
+
output: test.stdout,
|
|
74
|
+
exitCode: test.exitCode
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Data Analysis Platform
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
export default {
|
|
84
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
85
|
+
const { notebook } = await request.json();
|
|
86
|
+
const sandbox = getSandbox(env.Sandbox, 'data-analysis');
|
|
87
|
+
|
|
88
|
+
await sandbox.writeFile('/workspace/analysis.ipynb', JSON.stringify(notebook));
|
|
89
|
+
|
|
90
|
+
const result = await sandbox.exec(
|
|
91
|
+
'jupyter nbconvert --to notebook --execute analysis.ipynb --output results.ipynb',
|
|
92
|
+
{ cwd: '/workspace' }
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
const output = await sandbox.readFile('/workspace/results.ipynb');
|
|
96
|
+
|
|
97
|
+
return Response.json({
|
|
98
|
+
success: result.success,
|
|
99
|
+
notebook: JSON.parse(output.content)
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Multi-Language Code Runner
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
const languageConfigs = {
|
|
109
|
+
python: { cmd: 'python3', ext: 'py' },
|
|
110
|
+
javascript: { cmd: 'node', ext: 'js' },
|
|
111
|
+
typescript: { cmd: 'ts-node', ext: 'ts' },
|
|
112
|
+
bash: { cmd: 'bash', ext: 'sh' }
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
export default {
|
|
116
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
117
|
+
const { language, code } = await request.json();
|
|
118
|
+
const config = languageConfigs[language];
|
|
119
|
+
|
|
120
|
+
if (!config) {
|
|
121
|
+
return Response.json({ error: 'Unsupported language' }, { status: 400 });
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const sandbox = getSandbox(env.Sandbox, 'code-runner');
|
|
125
|
+
const filename = `/workspace/script.${config.ext}`;
|
|
126
|
+
|
|
127
|
+
await sandbox.writeFile(filename, code);
|
|
128
|
+
const result = await sandbox.exec(`${config.cmd} ${filename}`);
|
|
129
|
+
|
|
130
|
+
return Response.json({
|
|
131
|
+
output: result.stdout,
|
|
132
|
+
error: result.stderr,
|
|
133
|
+
exitCode: result.exitCode
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Multi-Tenant Pattern
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
export default {
|
|
143
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
144
|
+
const userId = request.headers.get('X-User-ID');
|
|
145
|
+
const sandbox = getSandbox(env.Sandbox, 'multi-tenant');
|
|
146
|
+
|
|
147
|
+
// Each user gets isolated session
|
|
148
|
+
let session;
|
|
149
|
+
try {
|
|
150
|
+
session = await sandbox.getSession(userId);
|
|
151
|
+
} catch {
|
|
152
|
+
session = await sandbox.createSession({
|
|
153
|
+
id: userId,
|
|
154
|
+
cwd: `/workspace/users/${userId}`,
|
|
155
|
+
env: { USER_ID: userId }
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const code = await request.text();
|
|
160
|
+
const result = await session.exec(`python3 -c "${code}"`);
|
|
161
|
+
|
|
162
|
+
return Response.json({ output: result.stdout });
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Jupyter Integration
|
|
168
|
+
|
|
169
|
+
**Dockerfile**:
|
|
170
|
+
```dockerfile
|
|
171
|
+
FROM docker.io/cloudflare/sandbox:latest
|
|
172
|
+
RUN pip3 install --no-cache-dir jupyter-server ipykernel matplotlib pandas
|
|
173
|
+
EXPOSE 8888
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**Worker**:
|
|
177
|
+
```typescript
|
|
178
|
+
await sandbox.startProcess('jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser', {
|
|
179
|
+
processId: 'jupyter',
|
|
180
|
+
cwd: '/workspace'
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
const exposed = await sandbox.exposePort(8888, { name: 'jupyter' });
|
|
184
|
+
return Response.json({ url: exposed.url });
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Git Operations
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
// Clone
|
|
191
|
+
await sandbox.exec('git clone https://github.com/user/repo.git /workspace/repo');
|
|
192
|
+
|
|
193
|
+
// Clone specific branch
|
|
194
|
+
await sandbox.exec('git clone -b main --single-branch https://github.com/user/repo.git /workspace/repo');
|
|
195
|
+
|
|
196
|
+
// Authenticated clone
|
|
197
|
+
const token = env.GITHUB_TOKEN;
|
|
198
|
+
await sandbox.exec(`git clone https://${token}@github.com/user/private-repo.git`);
|
|
199
|
+
|
|
200
|
+
// Git ops
|
|
201
|
+
await sandbox.exec('git pull', { cwd: '/workspace/repo' });
|
|
202
|
+
await sandbox.exec('git checkout -b feature', { cwd: '/workspace/repo' });
|
|
203
|
+
```
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Cloudflare Secrets Store
|
|
2
|
+
|
|
3
|
+
Account-level encrypted secret management for Workers and AI Gateway.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
**Secrets Store**: Centralized, account-level secrets, reusable across Workers
|
|
8
|
+
**Worker Secrets**: Per-Worker secrets (`wrangler secret put`)
|
|
9
|
+
|
|
10
|
+
### Architecture
|
|
11
|
+
|
|
12
|
+
- **Store**: Container (1/account in beta)
|
|
13
|
+
- **Secret**: String ≤1024 bytes
|
|
14
|
+
- **Scopes**: Permission boundaries (`workers`, `ai-gateway`)
|
|
15
|
+
- **Bindings**: Connect secrets via `env` object
|
|
16
|
+
|
|
17
|
+
### Access Control
|
|
18
|
+
|
|
19
|
+
- **Super Admin**: Full access
|
|
20
|
+
- **Admin**: Create/edit/delete secrets, view metadata
|
|
21
|
+
- **Deployer**: View metadata + bindings
|
|
22
|
+
- **Reporter**: View metadata only
|
|
23
|
+
|
|
24
|
+
API Token permissions: `Account Secrets Store Edit/Read`
|
|
25
|
+
|
|
26
|
+
### Limits (Beta)
|
|
27
|
+
|
|
28
|
+
- 100 secrets/account
|
|
29
|
+
- 1 store/account
|
|
30
|
+
- 1024 bytes max/secret
|
|
31
|
+
- Production secrets count toward limit
|
|
32
|
+
|
|
33
|
+
## When to Use
|
|
34
|
+
|
|
35
|
+
**Use Secrets Store when:**
|
|
36
|
+
- Multiple Workers share same credential
|
|
37
|
+
- Centralized management needed
|
|
38
|
+
- Compliance requires audit trail
|
|
39
|
+
- Team collaboration on secrets
|
|
40
|
+
|
|
41
|
+
**Use Worker Secrets when:**
|
|
42
|
+
- Secret unique to one Worker
|
|
43
|
+
- Simple single-Worker project
|
|
44
|
+
- No cross-Worker sharing needed
|
|
45
|
+
|
|
46
|
+
## Files
|
|
47
|
+
|
|
48
|
+
- [configuration.md](./configuration.md) - Wrangler commands, binding config
|
|
49
|
+
- [api.md](./api.md) - Binding API, get/put/delete operations
|
|
50
|
+
- [patterns.md](./patterns.md) - Rotation, encryption, access control
|
|
51
|
+
- [gotchas.md](./gotchas.md) - Security issues, limits, best practices
|
|
52
|
+
|
|
53
|
+
## References
|
|
54
|
+
|
|
55
|
+
- [Docs](https://developers.cloudflare.com/secrets-store/)
|
|
56
|
+
- [Workers Integration](https://developers.cloudflare.com/secrets-store/integrations/workers/)
|
|
57
|
+
- [API Reference](https://developers.cloudflare.com/api/resources/secrets_store/)
|
|
58
|
+
- [Wrangler Commands](https://developers.cloudflare.com/workers/wrangler/commands/#secrets-store)
|