memory-journal-mcp 7.7.1 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +126 -56
- package/dist/chunk-6OHRCNYW.js +3231 -0
- package/dist/chunk-JFMITANR.js +5168 -0
- package/dist/{chunk-6LPTBIB6.js → chunk-MWNLAEHR.js} +309 -4332
- package/dist/{chunk-ARLYSFSI.js → chunk-UHSO65A4.js} +4242 -6092
- package/dist/cli.js +21 -3
- package/dist/index.d.ts +16 -13
- package/dist/index.js +4 -2
- package/dist/resources-IJVKDFGS.js +2 -0
- package/dist/tools-44DGXE3V.js +2 -0
- package/dist/worker-script.js +201 -20
- package/package.json +6 -4
- package/skills/README.md +62 -25
- package/skills/adversarial-performance/SKILL.md +139 -0
- package/skills/adversarial-performance/references/audit-categories.md +462 -0
- package/skills/adversarial-performance/references/copilot-performance-prompts.md +44 -0
- package/skills/adversarial-performance/references/copilot-usage.md +16 -0
- package/skills/adversarial-performance/references/feedback-loop.md +177 -0
- package/skills/adversarial-performance/references/multi-pass-performance-protocol.md +398 -0
- package/skills/adversarial-planner/SKILL.md +23 -54
- package/skills/adversarial-planner/references/copilot-integration.md +25 -40
- package/skills/adversarial-planner/references/copilot-usage.md +16 -0
- package/skills/adversarial-planner/references/multi-pass-protocol.md +4 -0
- package/skills/adversarial-security/SKILL.md +149 -0
- package/skills/adversarial-security/references/adversarial-base-protocol.md +44 -0
- package/skills/adversarial-security/references/audit-categories.md +723 -0
- package/skills/adversarial-security/references/copilot-security-prompts.md +142 -0
- package/skills/adversarial-security/references/copilot-usage.md +16 -0
- package/skills/adversarial-security/references/feedback-loop.md +206 -0
- package/skills/adversarial-security/references/journal-opt-out.md +7 -0
- package/skills/adversarial-security/references/multi-pass-security-protocol.md +403 -0
- package/skills/adversarial-skill-audit/SKILL.md +118 -0
- package/skills/adversarial-skill-audit/references/audit-categories.md +308 -0
- package/skills/adversarial-skill-audit/references/copilot-skill-prompts.md +68 -0
- package/skills/adversarial-skill-audit/references/copilot-usage.md +16 -0
- package/skills/adversarial-skill-audit/references/feedback-loop.md +155 -0
- package/skills/adversarial-skill-audit/references/multi-pass-skill-protocol.md +367 -0
- package/skills/adversarial-skill-audit/scripts/check-skills.ps1 +48 -0
- package/skills/adversarial-skill-audit/scripts/run-copilot.ps1 +52 -0
- package/skills/adversarial-workflow-audit/SKILL.md +82 -0
- package/skills/adversarial-workflow-audit/references/audit-categories.md +28 -0
- package/skills/adversarial-workflow-audit/references/copilot-usage.md +16 -0
- package/skills/adversarial-workflow-audit/scripts/check-workflows.ps1 +24 -0
- package/skills/agents-sdk/SKILL.md +220 -0
- package/skills/agents-sdk/references/callable.md +92 -0
- package/skills/agents-sdk/references/codemode.md +209 -0
- package/skills/agents-sdk/references/email.md +144 -0
- package/skills/agents-sdk/references/mcp/SKILL.md +65 -0
- package/skills/agents-sdk/references/mcp/code-mode-reference.md +245 -0
- package/skills/agents-sdk/references/mcp/oauth-reference.md +359 -0
- package/skills/agents-sdk/references/mcp/references/architecture-reference.md +208 -0
- package/skills/agents-sdk/references/mcp/references/cloudflare-quickstart.md +156 -0
- package/skills/agents-sdk/references/mcp/references/error-handling.md +343 -0
- package/skills/agents-sdk/references/mcp/references/http-security.md +164 -0
- package/skills/agents-sdk/references/mcp/references/implementation-guide.md +507 -0
- package/skills/agents-sdk/references/mcp/references/testing-reference.md +171 -0
- package/skills/agents-sdk/references/mcp.md +157 -0
- package/skills/agents-sdk/references/state-scheduling.md +164 -0
- package/skills/agents-sdk/references/streaming-chat.md +168 -0
- package/skills/agents-sdk/references/workflows.md +136 -0
- package/skills/auth-identity/SKILL.md +48 -0
- package/skills/autonomous-dev/SKILL.md +46 -23
- package/skills/autonomous-dev/references/workflow_orchestration.md +22 -0
- package/skills/aws/SKILL.md +39 -0
- package/skills/azure/SKILL.md +38 -0
- package/skills/bin/sync.js +7 -1
- package/skills/biome/SKILL.md +59 -0
- package/skills/bun/SKILL.md +8 -2
- package/skills/cloudflare/SKILL.md +37 -0
- package/skills/cloudflare/references/agents-sdk/README.md +95 -0
- package/skills/cloudflare/references/agents-sdk/api.md +195 -0
- package/skills/cloudflare/references/agents-sdk/configuration.md +178 -0
- package/skills/cloudflare/references/agents-sdk/gotchas.md +173 -0
- package/skills/cloudflare/references/agents-sdk/patterns.md +215 -0
- package/skills/cloudflare/references/ai-gateway/README.md +176 -0
- package/skills/cloudflare/references/ai-gateway/configuration.md +117 -0
- package/skills/cloudflare/references/ai-gateway/dynamic-routing.md +88 -0
- package/skills/cloudflare/references/ai-gateway/features.md +96 -0
- package/skills/cloudflare/references/ai-gateway/sdk-integration.md +110 -0
- package/skills/cloudflare/references/ai-gateway/troubleshooting.md +90 -0
- package/skills/cloudflare/references/ai-search/README.md +145 -0
- package/skills/cloudflare/references/ai-search/api.md +87 -0
- package/skills/cloudflare/references/ai-search/configuration.md +91 -0
- package/skills/cloudflare/references/ai-search/gotchas.md +92 -0
- package/skills/cloudflare/references/ai-search/patterns.md +87 -0
- package/skills/cloudflare/references/analytics-engine/README.md +96 -0
- package/skills/cloudflare/references/analytics-engine/api.md +112 -0
- package/skills/cloudflare/references/analytics-engine/configuration.md +107 -0
- package/skills/cloudflare/references/analytics-engine/gotchas.md +87 -0
- package/skills/cloudflare/references/analytics-engine/patterns.md +83 -0
- package/skills/cloudflare/references/api/README.md +66 -0
- package/skills/cloudflare/references/api/api.md +205 -0
- package/skills/cloudflare/references/api/configuration.md +158 -0
- package/skills/cloudflare/references/api/gotchas.md +231 -0
- package/skills/cloudflare/references/api/patterns.md +208 -0
- package/skills/cloudflare/references/api-shield/README.md +44 -0
- package/skills/cloudflare/references/api-shield/api.md +153 -0
- package/skills/cloudflare/references/api-shield/configuration.md +210 -0
- package/skills/cloudflare/references/api-shield/gotchas.md +132 -0
- package/skills/cloudflare/references/api-shield/patterns.md +185 -0
- package/skills/cloudflare/references/argo-smart-routing/README.md +96 -0
- package/skills/cloudflare/references/argo-smart-routing/api.md +253 -0
- package/skills/cloudflare/references/argo-smart-routing/configuration.md +205 -0
- package/skills/cloudflare/references/argo-smart-routing/gotchas.md +115 -0
- package/skills/cloudflare/references/argo-smart-routing/patterns.md +107 -0
- package/skills/cloudflare/references/bindings/README.md +127 -0
- package/skills/cloudflare/references/bindings/api.md +214 -0
- package/skills/cloudflare/references/bindings/configuration.md +200 -0
- package/skills/cloudflare/references/bindings/gotchas.md +210 -0
- package/skills/cloudflare/references/bindings/patterns.md +205 -0
- package/skills/cloudflare/references/bot-management/README.md +95 -0
- package/skills/cloudflare/references/bot-management/api.md +175 -0
- package/skills/cloudflare/references/bot-management/configuration.md +175 -0
- package/skills/cloudflare/references/bot-management/gotchas.md +116 -0
- package/skills/cloudflare/references/bot-management/patterns.md +181 -0
- package/skills/cloudflare/references/browser-rendering/README.md +84 -0
- package/skills/cloudflare/references/browser-rendering/api.md +108 -0
- package/skills/cloudflare/references/browser-rendering/configuration.md +78 -0
- package/skills/cloudflare/references/browser-rendering/gotchas.md +91 -0
- package/skills/cloudflare/references/browser-rendering/patterns.md +93 -0
- package/skills/cloudflare/references/c3/README.md +111 -0
- package/skills/cloudflare/references/c3/api.md +71 -0
- package/skills/cloudflare/references/c3/configuration.md +85 -0
- package/skills/cloudflare/references/c3/gotchas.md +97 -0
- package/skills/cloudflare/references/c3/patterns.md +84 -0
- package/skills/cloudflare/references/cache-reserve/README.md +150 -0
- package/skills/cloudflare/references/cache-reserve/api.md +184 -0
- package/skills/cloudflare/references/cache-reserve/configuration.md +170 -0
- package/skills/cloudflare/references/cache-reserve/gotchas.md +136 -0
- package/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
- package/skills/cloudflare/references/containers/README.md +87 -0
- package/skills/cloudflare/references/containers/api.md +197 -0
- package/skills/cloudflare/references/containers/configuration.md +191 -0
- package/skills/cloudflare/references/containers/gotchas.md +182 -0
- package/skills/cloudflare/references/containers/patterns.md +204 -0
- package/skills/cloudflare/references/cron-triggers/README.md +101 -0
- package/skills/cloudflare/references/cron-triggers/api.md +224 -0
- package/skills/cloudflare/references/cron-triggers/configuration.md +190 -0
- package/skills/cloudflare/references/cron-triggers/gotchas.md +207 -0
- package/skills/cloudflare/references/cron-triggers/patterns.md +274 -0
- package/skills/cloudflare/references/d1/README.md +137 -0
- package/skills/cloudflare/references/d1/api.md +213 -0
- package/skills/cloudflare/references/d1/configuration.md +198 -0
- package/skills/cloudflare/references/d1/gotchas.md +98 -0
- package/skills/cloudflare/references/d1/patterns.md +240 -0
- package/skills/cloudflare/references/ddos/README.md +42 -0
- package/skills/cloudflare/references/ddos/api.md +158 -0
- package/skills/cloudflare/references/ddos/configuration.md +94 -0
- package/skills/cloudflare/references/ddos/gotchas.md +114 -0
- package/skills/cloudflare/references/ddos/patterns.md +220 -0
- package/skills/cloudflare/references/decision-trees.md +95 -0
- package/skills/cloudflare/references/do-storage/README.md +79 -0
- package/skills/cloudflare/references/do-storage/api.md +107 -0
- package/skills/cloudflare/references/do-storage/configuration.md +114 -0
- package/skills/cloudflare/references/do-storage/gotchas.md +153 -0
- package/skills/cloudflare/references/do-storage/patterns.md +210 -0
- package/skills/cloudflare/references/do-storage/testing.md +186 -0
- package/skills/cloudflare/references/durable-objects/README.md +194 -0
- package/skills/cloudflare/references/durable-objects/api.md +205 -0
- package/skills/cloudflare/references/durable-objects/configuration.md +160 -0
- package/skills/cloudflare/references/durable-objects/gotchas.md +200 -0
- package/skills/cloudflare/references/durable-objects/patterns.md +205 -0
- package/skills/cloudflare/references/email-routing/README.md +89 -0
- package/skills/cloudflare/references/email-routing/api.md +192 -0
- package/skills/cloudflare/references/email-routing/configuration.md +187 -0
- package/skills/cloudflare/references/email-routing/gotchas.md +203 -0
- package/skills/cloudflare/references/email-routing/patterns.md +241 -0
- package/skills/cloudflare/references/email-workers/README.md +153 -0
- package/skills/cloudflare/references/email-workers/api.md +227 -0
- package/skills/cloudflare/references/email-workers/configuration.md +115 -0
- package/skills/cloudflare/references/email-workers/gotchas.md +133 -0
- package/skills/cloudflare/references/email-workers/patterns.md +108 -0
- package/skills/cloudflare/references/graphql-api/README.md +147 -0
- package/skills/cloudflare/references/graphql-api/api.md +175 -0
- package/skills/cloudflare/references/graphql-api/configuration.md +151 -0
- package/skills/cloudflare/references/graphql-api/gotchas.md +111 -0
- package/skills/cloudflare/references/graphql-api/patterns.md +276 -0
- package/skills/cloudflare/references/hyperdrive/README.md +84 -0
- package/skills/cloudflare/references/hyperdrive/api.md +149 -0
- package/skills/cloudflare/references/hyperdrive/configuration.md +166 -0
- package/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
- package/skills/cloudflare/references/hyperdrive/patterns.md +203 -0
- package/skills/cloudflare/references/images/README.md +65 -0
- package/skills/cloudflare/references/images/api.md +101 -0
- package/skills/cloudflare/references/images/configuration.md +206 -0
- package/skills/cloudflare/references/images/gotchas.md +106 -0
- package/skills/cloudflare/references/images/patterns.md +126 -0
- package/skills/cloudflare/references/kv/README.md +90 -0
- package/skills/cloudflare/references/kv/api.md +163 -0
- package/skills/cloudflare/references/kv/configuration.md +148 -0
- package/skills/cloudflare/references/kv/gotchas.md +133 -0
- package/skills/cloudflare/references/kv/patterns.md +195 -0
- package/skills/cloudflare/references/miniflare/README.md +113 -0
- package/skills/cloudflare/references/miniflare/api.md +204 -0
- package/skills/cloudflare/references/miniflare/configuration.md +174 -0
- package/skills/cloudflare/references/miniflare/gotchas.md +179 -0
- package/skills/cloudflare/references/miniflare/patterns.md +187 -0
- package/skills/cloudflare/references/network-interconnect/README.md +104 -0
- package/skills/cloudflare/references/network-interconnect/api.md +220 -0
- package/skills/cloudflare/references/network-interconnect/configuration.md +123 -0
- package/skills/cloudflare/references/network-interconnect/gotchas.md +175 -0
- package/skills/cloudflare/references/network-interconnect/patterns.md +174 -0
- package/skills/cloudflare/references/observability/README.md +93 -0
- package/skills/cloudflare/references/observability/api.md +168 -0
- package/skills/cloudflare/references/observability/configuration.md +178 -0
- package/skills/cloudflare/references/observability/gotchas.md +125 -0
- package/skills/cloudflare/references/observability/patterns.md +105 -0
- package/skills/cloudflare/references/pages/README.md +92 -0
- package/skills/cloudflare/references/pages/api.md +205 -0
- package/skills/cloudflare/references/pages/configuration.md +216 -0
- package/skills/cloudflare/references/pages/gotchas.md +218 -0
- package/skills/cloudflare/references/pages/patterns.md +215 -0
- package/skills/cloudflare/references/pages-functions/README.md +104 -0
- package/skills/cloudflare/references/pages-functions/api.md +159 -0
- package/skills/cloudflare/references/pages-functions/configuration.md +130 -0
- package/skills/cloudflare/references/pages-functions/gotchas.md +102 -0
- package/skills/cloudflare/references/pages-functions/patterns.md +148 -0
- package/skills/cloudflare/references/pipelines/README.md +109 -0
- package/skills/cloudflare/references/pipelines/api.md +214 -0
- package/skills/cloudflare/references/pipelines/configuration.md +98 -0
- package/skills/cloudflare/references/pipelines/gotchas.md +84 -0
- package/skills/cloudflare/references/pipelines/patterns.md +87 -0
- package/skills/cloudflare/references/product-index.md +112 -0
- package/skills/cloudflare/references/pulumi/README.md +113 -0
- package/skills/cloudflare/references/pulumi/api.md +230 -0
- package/skills/cloudflare/references/pulumi/configuration.md +213 -0
- package/skills/cloudflare/references/pulumi/gotchas.md +205 -0
- package/skills/cloudflare/references/pulumi/patterns.md +260 -0
- package/skills/cloudflare/references/queues/README.md +99 -0
- package/skills/cloudflare/references/queues/api.md +211 -0
- package/skills/cloudflare/references/queues/configuration.md +151 -0
- package/skills/cloudflare/references/queues/gotchas.md +210 -0
- package/skills/cloudflare/references/queues/patterns.md +220 -0
- package/skills/cloudflare/references/r2/README.md +97 -0
- package/skills/cloudflare/references/r2/api.md +235 -0
- package/skills/cloudflare/references/r2/configuration.md +176 -0
- package/skills/cloudflare/references/r2/gotchas.md +190 -0
- package/skills/cloudflare/references/r2/patterns.md +203 -0
- package/skills/cloudflare/references/r2-data-catalog/README.md +157 -0
- package/skills/cloudflare/references/r2-data-catalog/api.md +199 -0
- package/skills/cloudflare/references/r2-data-catalog/configuration.md +205 -0
- package/skills/cloudflare/references/r2-data-catalog/gotchas.md +170 -0
- package/skills/cloudflare/references/r2-data-catalog/patterns.md +191 -0
- package/skills/cloudflare/references/r2-sql/README.md +138 -0
- package/skills/cloudflare/references/r2-sql/SKILL.md.backup +512 -0
- package/skills/cloudflare/references/r2-sql/api.md +159 -0
- package/skills/cloudflare/references/r2-sql/configuration.md +152 -0
- package/skills/cloudflare/references/r2-sql/gotchas.md +228 -0
- package/skills/cloudflare/references/r2-sql/patterns.md +230 -0
- package/skills/cloudflare/references/realtime-sfu/README.md +66 -0
- package/skills/cloudflare/references/realtime-sfu/api.md +164 -0
- package/skills/cloudflare/references/realtime-sfu/configuration.md +141 -0
- package/skills/cloudflare/references/realtime-sfu/gotchas.md +138 -0
- package/skills/cloudflare/references/realtime-sfu/patterns.md +187 -0
- package/skills/cloudflare/references/realtimekit/README.md +118 -0
- package/skills/cloudflare/references/realtimekit/api.md +234 -0
- package/skills/cloudflare/references/realtimekit/configuration.md +226 -0
- package/skills/cloudflare/references/realtimekit/gotchas.md +206 -0
- package/skills/cloudflare/references/realtimekit/patterns.md +240 -0
- package/skills/cloudflare/references/sandbox/README.md +104 -0
- package/skills/cloudflare/references/sandbox/api.md +200 -0
- package/skills/cloudflare/references/sandbox/configuration.md +154 -0
- package/skills/cloudflare/references/sandbox/gotchas.md +201 -0
- package/skills/cloudflare/references/sandbox/patterns.md +195 -0
- package/skills/cloudflare/references/secrets-store/README.md +77 -0
- package/skills/cloudflare/references/secrets-store/api.md +199 -0
- package/skills/cloudflare/references/secrets-store/configuration.md +187 -0
- package/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
- package/skills/cloudflare/references/secrets-store/patterns.md +218 -0
- package/skills/cloudflare/references/smart-placement/README.md +143 -0
- package/skills/cloudflare/references/smart-placement/api.md +192 -0
- package/skills/cloudflare/references/smart-placement/configuration.md +202 -0
- package/skills/cloudflare/references/smart-placement/gotchas.md +180 -0
- package/skills/cloudflare/references/smart-placement/patterns.md +190 -0
- package/skills/cloudflare/references/snippets/README.md +74 -0
- package/skills/cloudflare/references/snippets/api.md +214 -0
- package/skills/cloudflare/references/snippets/configuration.md +239 -0
- package/skills/cloudflare/references/snippets/gotchas.md +104 -0
- package/skills/cloudflare/references/snippets/patterns.md +135 -0
- package/skills/cloudflare/references/spectrum/README.md +52 -0
- package/skills/cloudflare/references/spectrum/api.md +184 -0
- package/skills/cloudflare/references/spectrum/configuration.md +203 -0
- package/skills/cloudflare/references/spectrum/gotchas.md +155 -0
- package/skills/cloudflare/references/spectrum/patterns.md +206 -0
- package/skills/cloudflare/references/static-assets/README.md +65 -0
- package/skills/cloudflare/references/static-assets/api.md +201 -0
- package/skills/cloudflare/references/static-assets/configuration.md +186 -0
- package/skills/cloudflare/references/static-assets/gotchas.md +164 -0
- package/skills/cloudflare/references/static-assets/patterns.md +189 -0
- package/skills/cloudflare/references/stream/README.md +123 -0
- package/skills/cloudflare/references/stream/api-live.md +202 -0
- package/skills/cloudflare/references/stream/api.md +206 -0
- package/skills/cloudflare/references/stream/configuration.md +151 -0
- package/skills/cloudflare/references/stream/gotchas.md +139 -0
- package/skills/cloudflare/references/stream/patterns.md +217 -0
- package/skills/cloudflare/references/tail-workers/README.md +92 -0
- package/skills/cloudflare/references/tail-workers/api.md +203 -0
- package/skills/cloudflare/references/tail-workers/configuration.md +178 -0
- package/skills/cloudflare/references/tail-workers/gotchas.md +206 -0
- package/skills/cloudflare/references/tail-workers/patterns.md +190 -0
- package/skills/cloudflare/references/terraform/README.md +100 -0
- package/skills/cloudflare/references/terraform/api.md +178 -0
- package/skills/cloudflare/references/terraform/configuration.md +197 -0
- package/skills/cloudflare/references/terraform/gotchas.md +150 -0
- package/skills/cloudflare/references/terraform/patterns.md +174 -0
- package/skills/cloudflare/references/tunnel/README.md +137 -0
- package/skills/cloudflare/references/tunnel/api.md +205 -0
- package/skills/cloudflare/references/tunnel/configuration.md +163 -0
- package/skills/cloudflare/references/tunnel/gotchas.md +159 -0
- package/skills/cloudflare/references/tunnel/networking.md +174 -0
- package/skills/cloudflare/references/tunnel/patterns.md +199 -0
- package/skills/cloudflare/references/turn/README.md +86 -0
- package/skills/cloudflare/references/turn/api.md +236 -0
- package/skills/cloudflare/references/turn/configuration.md +181 -0
- package/skills/cloudflare/references/turn/gotchas.md +236 -0
- package/skills/cloudflare/references/turn/patterns.md +228 -0
- package/skills/cloudflare/references/turnstile/README.md +102 -0
- package/skills/cloudflare/references/turnstile/api.md +253 -0
- package/skills/cloudflare/references/turnstile/configuration.md +242 -0
- package/skills/cloudflare/references/turnstile/gotchas.md +253 -0
- package/skills/cloudflare/references/turnstile/patterns.md +195 -0
- package/skills/cloudflare/references/vectorize/README.md +133 -0
- package/skills/cloudflare/references/vectorize/api.md +89 -0
- package/skills/cloudflare/references/vectorize/configuration.md +91 -0
- package/skills/cloudflare/references/vectorize/gotchas.md +83 -0
- package/skills/cloudflare/references/vectorize/patterns.md +92 -0
- package/skills/cloudflare/references/waf/README.md +125 -0
- package/skills/cloudflare/references/waf/api.md +203 -0
- package/skills/cloudflare/references/waf/configuration.md +215 -0
- package/skills/cloudflare/references/waf/gotchas.md +208 -0
- package/skills/cloudflare/references/waf/patterns.md +236 -0
- package/skills/cloudflare/references/web-analytics/README.md +149 -0
- package/skills/cloudflare/references/web-analytics/configuration.md +81 -0
- package/skills/cloudflare/references/web-analytics/gotchas.md +86 -0
- package/skills/cloudflare/references/web-analytics/integration.md +63 -0
- package/skills/cloudflare/references/web-analytics/patterns.md +98 -0
- package/skills/cloudflare/references/workerd/README.md +85 -0
- package/skills/cloudflare/references/workerd/api.md +219 -0
- package/skills/cloudflare/references/workerd/configuration.md +200 -0
- package/skills/cloudflare/references/workerd/gotchas.md +151 -0
- package/skills/cloudflare/references/workerd/patterns.md +205 -0
- package/skills/cloudflare/references/workers/README.md +110 -0
- package/skills/cloudflare/references/workers/api.md +197 -0
- package/skills/cloudflare/references/workers/configuration.md +184 -0
- package/skills/cloudflare/references/workers/frameworks.md +200 -0
- package/skills/cloudflare/references/workers/gotchas.md +145 -0
- package/skills/cloudflare/references/workers/patterns.md +220 -0
- package/skills/cloudflare/references/workers-ai/README.md +206 -0
- package/skills/cloudflare/references/workers-ai/api.md +115 -0
- package/skills/cloudflare/references/workers-ai/configuration.md +98 -0
- package/skills/cloudflare/references/workers-ai/gotchas.md +130 -0
- package/skills/cloudflare/references/workers-ai/patterns.md +122 -0
- package/skills/cloudflare/references/workers-for-platforms/README.md +95 -0
- package/skills/cloudflare/references/workers-for-platforms/api.md +212 -0
- package/skills/cloudflare/references/workers-for-platforms/configuration.md +178 -0
- package/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
- package/skills/cloudflare/references/workers-for-platforms/patterns.md +210 -0
- package/skills/cloudflare/references/workers-playground/README.md +131 -0
- package/skills/cloudflare/references/workers-playground/api.md +101 -0
- package/skills/cloudflare/references/workers-playground/configuration.md +169 -0
- package/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
- package/skills/cloudflare/references/workers-playground/patterns.md +134 -0
- package/skills/cloudflare/references/workers-vpc/README.md +130 -0
- package/skills/cloudflare/references/workers-vpc/api.md +196 -0
- package/skills/cloudflare/references/workers-vpc/configuration.md +151 -0
- package/skills/cloudflare/references/workers-vpc/gotchas.md +171 -0
- package/skills/cloudflare/references/workers-vpc/patterns.md +235 -0
- package/skills/cloudflare/references/workflows/README.md +72 -0
- package/skills/cloudflare/references/workflows/api.md +237 -0
- package/skills/cloudflare/references/workflows/configuration.md +158 -0
- package/skills/cloudflare/references/workflows/gotchas.md +97 -0
- package/skills/cloudflare/references/workflows/patterns.md +245 -0
- package/skills/cloudflare/references/wrangler/README.md +143 -0
- package/skills/cloudflare/references/wrangler/api.md +188 -0
- package/skills/cloudflare/references/wrangler/configuration.md +198 -0
- package/skills/cloudflare/references/wrangler/gotchas.md +212 -0
- package/skills/cloudflare/references/wrangler/patterns.md +211 -0
- package/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +131 -0
- package/skills/cloudflare/references/zaraz/README.md +114 -0
- package/skills/cloudflare/references/zaraz/api.md +118 -0
- package/skills/cloudflare/references/zaraz/configuration.md +94 -0
- package/skills/cloudflare/references/zaraz/gotchas.md +88 -0
- package/skills/cloudflare/references/zaraz/patterns.md +77 -0
- package/skills/docker/SKILL.md +7 -101
- package/skills/docker/references/advanced-examples.md +71 -0
- package/skills/docker/references/templates.md +34 -0
- package/skills/docs-marketer/SKILL.md +178 -0
- package/skills/docs-marketer/references/audit-categories.md +328 -0
- package/skills/docs-marketer/references/copilot-docs-prompts.md +88 -0
- package/skills/docs-marketer/references/copilot-usage.md +16 -0
- package/skills/docs-marketer/references/feedback-loop.md +155 -0
- package/skills/docs-marketer/references/multi-pass-docs-protocol.md +410 -0
- package/skills/drizzle-orm/SKILL.md +82 -0
- package/skills/durable-objects/SKILL.md +167 -0
- package/skills/durable-objects/references/advanced_features.md +29 -0
- package/skills/durable-objects/references/rules.md +300 -0
- package/skills/durable-objects/references/testing.md +261 -0
- package/skills/durable-objects/references/workers.md +336 -0
- package/skills/gcp/SKILL.md +37 -0
- package/skills/github-actions/SKILL.md +5 -58
- package/skills/github-actions/references/templates.md +65 -0
- package/skills/github-commander/SKILL.md +13 -21
- package/skills/github-commander/workflows/copilot-audit.md +12 -12
- package/skills/github-copilot-cli/SKILL.md +21 -26
- package/skills/github-repo-setup/SKILL.md +136 -0
- package/skills/github-repo-setup/references/community-standards.md +136 -0
- package/skills/github-repo-setup/references/github-automation.md +490 -0
- package/skills/github-repo-setup/references/inline-templates.md +205 -0
- package/skills/github-repo-setup/references/project-config.md +320 -0
- package/skills/gitlab/SKILL.md +7 -2
- package/skills/gitlab/package-lock.json +389 -389
- package/skills/golang/SKILL.md +8 -1
- package/skills/graphql/SKILL.md +30 -0
- package/skills/hono/SKILL.md +82 -0
- package/skills/journal-optimizer/SKILL.md +206 -0
- package/skills/journal-optimizer/references/optimizer-scripts.md +169 -0
- package/skills/llm-app-engineering/SKILL.md +18 -0
- package/skills/monorepo/SKILL.md +56 -0
- package/skills/multi-agent-orchestration/SKILL.md +14 -0
- package/skills/mysql/SKILL.md +6 -2
- package/skills/next-best-practices/SKILL.md +86 -0
- package/skills/next-best-practices/references/cache-components-examples.md +234 -0
- package/skills/next-best-practices/references/cache-components.md +210 -0
- package/skills/next-best-practices/references/upgrade-decision-tree.md +33 -0
- package/skills/next-best-practices/references/upgrade.md +43 -0
- package/skills/next-cache-components/SKILL.md +441 -0
- package/skills/next-upgrade/SKILL.md +43 -0
- package/skills/next-upgrade/references/decision-tree.md +33 -0
- package/skills/nodejs/SKILL.md +46 -0
- package/skills/opentelemetry/SKILL.md +62 -0
- package/skills/package.json +39 -4
- package/skills/playwright-standard/SKILL.md +6 -11
- package/skills/playwright-standard/references/locators.md +7 -0
- package/skills/postgres/SKILL.md +6 -1
- package/skills/python/SKILL.md +8 -70
- package/skills/python/references/advanced-patterns.md +37 -0
- package/skills/python/references/config-templates.md +48 -0
- package/skills/rag-pipelines/SKILL.md +14 -0
- package/skills/redis/SKILL.md +31 -0
- package/skills/render/SKILL.md +35 -0
- package/skills/rust/SKILL.md +15 -25
- package/skills/rust/references/borrow-checker.md +13 -0
- package/skills/rust/references/ecosystem.md +11 -0
- package/skills/sandbox-sdk/SKILL.md +186 -0
- package/skills/sandbox-sdk/references/api-quick-ref.md +113 -0
- package/skills/sandbox-sdk/references/examples.md +52 -0
- package/skills/shadcn-ui/SKILL.md +22 -57
- package/skills/skill-builder/SKILL.md +23 -424
- package/skills/skill-builder/references/tutorial.md +457 -0
- package/skills/sqlite/SKILL.md +16 -5
- package/skills/table.md +59 -0
- package/skills/tailwind-css/SKILL.md +11 -60
- package/skills/tailwind-css/references/component-patterns.md +52 -0
- package/skills/trpc/SKILL.md +56 -0
- package/skills/typescript/SKILL.md +30 -433
- package/skills/typescript/references/tutorial.md +453 -0
- package/skills/vercel-ai-sdk/SKILL.md +48 -0
- package/skills/vitest-standard/SKILL.md +5 -11
- package/skills/vitest-standard/references/assertions.md +11 -0
- package/skills/web-perf/SKILL.md +207 -0
- package/skills/workers-best-practices/SKILL.md +120 -0
- package/skills/workers-best-practices/references/anti-patterns.md +18 -0
- package/skills/workers-best-practices/references/review.md +174 -0
- package/skills/workers-best-practices/references/rules.md +485 -0
- package/skills/wrangler/SKILL.md +43 -0
- package/skills/wrangler/references/cli-commands.md +861 -0
- package/skills/zod/SKILL.md +48 -0
- package/dist/tools-P4VGG4FH.js +0 -1
- package/skills/react-best-practices/AGENTS.md +0 -2883
- package/skills/react-best-practices/SKILL.md +0 -138
- /package/skills/{react-best-practices → next-best-practices}/README.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/metadata.json +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/_sections.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/_template.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-event-handler-refs.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-init-once.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-use-latest.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-api-routes.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-defer-await.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-dependencies.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-parallel.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-suspense-boundaries.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-barrel-imports.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-conditional.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-defer-third-party.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-dynamic-imports.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-preload.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-event-listeners.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-localstorage-schema.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-passive-event-listeners.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-swr-dedup.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-batch-dom-css.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-function-results.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-property-access.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-storage.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-combine-iterations.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-early-exit.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-hoist-regexp.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-index-maps.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-length-check-first.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-min-max-loop.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-set-map-lookups.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-tosorted-immutable.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-activity.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-animate-svg-wrapper.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-conditional-render.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-content-visibility.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hoist-jsx.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hydration-no-flicker.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hydration-suppress-warning.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-svg-precision.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-usetransition-loading.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-defer-reads.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-dependencies.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-derived-state-no-effect.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-derived-state.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-functional-setstate.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-lazy-state-init.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-memo-with-default-value.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-memo.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-move-effect-to-event.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-simple-expression-in-memo.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-transitions.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-use-ref-transient-values.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-after-nonblocking.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-auth-actions.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-cache-lru.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-cache-react.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-dedup-props.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-parallel-fetching.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-serialization.md +0 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
## Best Practices
|
|
2
|
+
|
|
3
|
+
### 1. Use Selective Worker-First Routing
|
|
4
|
+
|
|
5
|
+
Instead of `run_worker_first = true`, use array patterns:
|
|
6
|
+
|
|
7
|
+
```jsonc
|
|
8
|
+
{
|
|
9
|
+
"assets": {
|
|
10
|
+
"run_worker_first": [
|
|
11
|
+
"/api/*", // API routes
|
|
12
|
+
"/admin/*", // Admin area
|
|
13
|
+
"!/admin/assets/*", // Except admin assets
|
|
14
|
+
],
|
|
15
|
+
},
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**Benefits:**
|
|
20
|
+
|
|
21
|
+
- Reduces Worker invocations
|
|
22
|
+
- Lowers costs
|
|
23
|
+
- Improves asset delivery performance
|
|
24
|
+
|
|
25
|
+
### 2. Leverage Navigation Request Optimization
|
|
26
|
+
|
|
27
|
+
For SPAs, use `compatibility_date = "2025-04-01"` or later:
|
|
28
|
+
|
|
29
|
+
```jsonc
|
|
30
|
+
{
|
|
31
|
+
"compatibility_date": "2025-04-01",
|
|
32
|
+
"assets": {
|
|
33
|
+
"not_found_handling": "single-page-application",
|
|
34
|
+
},
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Navigation requests skip Worker invocation, reducing costs.
|
|
39
|
+
|
|
40
|
+
### 3. Type Safety with Bindings
|
|
41
|
+
|
|
42
|
+
Always type your environment:
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
interface Env {
|
|
46
|
+
ASSETS: Fetcher
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Common Errors
|
|
51
|
+
|
|
52
|
+
### "Asset not found"
|
|
53
|
+
|
|
54
|
+
**Cause:** Asset not in assets directory, wrong path, or assets not deployed
|
|
55
|
+
**Solution:** Verify asset exists, check path case-sensitivity, redeploy if needed
|
|
56
|
+
|
|
57
|
+
### "Worker not invoked for asset"
|
|
58
|
+
|
|
59
|
+
**Cause:** Asset served directly, `run_worker_first` not configured
|
|
60
|
+
**Solution:** Configure `run_worker_first` patterns to include asset routes (see configuration.md:66-106)
|
|
61
|
+
|
|
62
|
+
### "429 Too Many Requests on free tier"
|
|
63
|
+
|
|
64
|
+
**Cause:** `run_worker_first` patterns invoke Worker for many requests, hitting free tier limits (100k req/day)
|
|
65
|
+
**Solution:** Use more selective patterns with negative exclusions, or upgrade to paid plan
|
|
66
|
+
|
|
67
|
+
### "Smart Placement increases latency"
|
|
68
|
+
|
|
69
|
+
**Cause:** `run_worker_first=true` + Smart Placement routes all requests through single smart-placed location
|
|
70
|
+
**Solution:** Use selective patterns (array syntax) or disable Smart Placement for asset-heavy apps
|
|
71
|
+
|
|
72
|
+
### "CF-Cache-Status header unreliable"
|
|
73
|
+
|
|
74
|
+
**Cause:** Header is probabilistically added for privacy reasons
|
|
75
|
+
**Solution:** Don't rely on `CF-Cache-Status` for critical routing logic. Use other signals (ETag, age).
|
|
76
|
+
|
|
77
|
+
### "JWT expired during deployment"
|
|
78
|
+
|
|
79
|
+
**Cause:** Large asset deployments exceed JWT token lifetime
|
|
80
|
+
**Solution:** Update to Wrangler 4.34.0+ (automatic token refresh), or reduce asset count
|
|
81
|
+
|
|
82
|
+
### "Cannot use 'assets' with 'site'"
|
|
83
|
+
|
|
84
|
+
**Cause:** Legacy `site` config conflicts with new `assets` config
|
|
85
|
+
**Solution:** Migrate from `site` to `assets` (see configuration.md). Remove `site` key from wrangler.jsonc.
|
|
86
|
+
|
|
87
|
+
### "Assets not updating after deployment"
|
|
88
|
+
|
|
89
|
+
**Cause:** Browser or CDN cache serving old assets
|
|
90
|
+
**Solution:**
|
|
91
|
+
|
|
92
|
+
- Hard refresh browser (Cmd+Shift+R / Ctrl+F5)
|
|
93
|
+
- Use cache-busting (hashed filenames)
|
|
94
|
+
- Verify deployment completed: `wrangler tail`
|
|
95
|
+
|
|
96
|
+
## Limits
|
|
97
|
+
|
|
98
|
+
| Resource/Limit | Free | Paid | Notes |
|
|
99
|
+
| ------------------ | --------- | ----------- | ----------------------------------------- |
|
|
100
|
+
| Max asset size | 25 MiB | 25 MiB | Per file |
|
|
101
|
+
| Total assets | 20,000 | **100,000** | Requires Wrangler 4.34.0+ (Sep 2025) |
|
|
102
|
+
| Worker invocations | 100k/day | 10M/month | Optimize with `run_worker_first` patterns |
|
|
103
|
+
| Asset storage | Unlimited | Unlimited | Included |
|
|
104
|
+
|
|
105
|
+
### Version Requirements
|
|
106
|
+
|
|
107
|
+
| Feature | Minimum Wrangler Version |
|
|
108
|
+
| ----------------------- | ---------------------------------------- |
|
|
109
|
+
| 100k file limit (paid) | 4.34.0 |
|
|
110
|
+
| Vite plugin | 4.0.0 + @cloudflare/vite-plugin 1.0.0 |
|
|
111
|
+
| Navigation optimization | 4.0.0 + compatibility_date: "2025-04-01" |
|
|
112
|
+
|
|
113
|
+
## Performance Tips
|
|
114
|
+
|
|
115
|
+
### 1. Use Hashed Filenames
|
|
116
|
+
|
|
117
|
+
Enable long-term caching with content-hashed filenames:
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
app.a3b2c1d4.js
|
|
121
|
+
styles.e5f6g7h8.css
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Most bundlers (Vite, Webpack, Parcel) do this automatically.
|
|
125
|
+
|
|
126
|
+
### 2. Minimize Worker Invocations
|
|
127
|
+
|
|
128
|
+
Serve assets directly when possible:
|
|
129
|
+
|
|
130
|
+
```jsonc
|
|
131
|
+
{
|
|
132
|
+
"assets": {
|
|
133
|
+
// Only invoke Worker for dynamic routes
|
|
134
|
+
"run_worker_first": ["/api/*", "/auth/*"],
|
|
135
|
+
},
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 3. Leverage Browser Cache
|
|
140
|
+
|
|
141
|
+
Set appropriate `Cache-Control` headers:
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
// Versioned assets
|
|
145
|
+
'Cache-Control': 'public, max-age=31536000, immutable'
|
|
146
|
+
|
|
147
|
+
// HTML (revalidate often)
|
|
148
|
+
'Cache-Control': 'public, max-age=0, must-revalidate'
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
See patterns.md:169-189 for implementation.
|
|
152
|
+
|
|
153
|
+
### 4. Use .assetsignore
|
|
154
|
+
|
|
155
|
+
Reduce upload time by excluding unnecessary files:
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
*.map
|
|
159
|
+
*.md
|
|
160
|
+
.DS_Store
|
|
161
|
+
node_modules/
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
See configuration.md:107-126 for details.
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
### Common Patterns
|
|
2
|
+
|
|
3
|
+
**1. Forward request to assets:**
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export default {
|
|
7
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
8
|
+
return env.ASSETS.fetch(request)
|
|
9
|
+
},
|
|
10
|
+
}
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
**2. Fetch specific asset by path:**
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
const response = await env.ASSETS.fetch('https://assets.local/logo.png')
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**3. Modify request before fetching asset:**
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
const url = new URL(request.url)
|
|
23
|
+
url.pathname = '/index.html'
|
|
24
|
+
return env.ASSETS.fetch(new Request(url, request))
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**4. Transform asset response:**
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
const response = await env.ASSETS.fetch(request)
|
|
31
|
+
const modifiedResponse = new Response(response.body, response)
|
|
32
|
+
modifiedResponse.headers.set('X-Custom-Header', 'value')
|
|
33
|
+
modifiedResponse.headers.set('Cache-Control', 'public, max-age=3600')
|
|
34
|
+
return modifiedResponse
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**5. Conditional asset serving:**
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
export default {
|
|
41
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
42
|
+
const url = new URL(request.url)
|
|
43
|
+
if (url.pathname === '/') {
|
|
44
|
+
return env.ASSETS.fetch('/index.html')
|
|
45
|
+
}
|
|
46
|
+
return env.ASSETS.fetch(request)
|
|
47
|
+
},
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**6. SPA with API routes:**
|
|
52
|
+
|
|
53
|
+
Most common full-stack pattern - static SPA with backend API:
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
export default {
|
|
57
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
58
|
+
const url = new URL(request.url)
|
|
59
|
+
if (url.pathname.startsWith('/api/')) {
|
|
60
|
+
return handleAPI(request, env)
|
|
61
|
+
}
|
|
62
|
+
return env.ASSETS.fetch(request)
|
|
63
|
+
},
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function handleAPI(request: Request, env: Env): Promise<Response> {
|
|
67
|
+
return new Response(JSON.stringify({ status: 'ok' }), {
|
|
68
|
+
headers: { 'Content-Type': 'application/json' },
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Config:** Set `run_worker_first: ["/api/*"]` (see configuration.md:66-106)
|
|
74
|
+
|
|
75
|
+
**7. Auth gating for protected assets:**
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
export default {
|
|
79
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
80
|
+
const url = new URL(request.url)
|
|
81
|
+
if (url.pathname.startsWith('/admin/')) {
|
|
82
|
+
const session = await validateSession(request, env)
|
|
83
|
+
if (!session) {
|
|
84
|
+
return Response.redirect('/login', 302)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return env.ASSETS.fetch(request)
|
|
88
|
+
},
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Config:** Set `run_worker_first: ["/admin/*"]`
|
|
93
|
+
|
|
94
|
+
**8. Custom headers for security:**
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
export default {
|
|
98
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
99
|
+
const response = await env.ASSETS.fetch(request)
|
|
100
|
+
const secureResponse = new Response(response.body, response)
|
|
101
|
+
secureResponse.headers.set('X-Frame-Options', 'DENY')
|
|
102
|
+
secureResponse.headers.set('X-Content-Type-Options', 'nosniff')
|
|
103
|
+
secureResponse.headers.set('Content-Security-Policy', "default-src 'self'")
|
|
104
|
+
return secureResponse
|
|
105
|
+
},
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**9. A/B testing via cookies:**
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
export default {
|
|
113
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
114
|
+
const cookies = request.headers.get('Cookie') || ''
|
|
115
|
+
const variant = cookies.includes('variant=b') ? 'b' : 'a'
|
|
116
|
+
const url = new URL(request.url)
|
|
117
|
+
if (url.pathname === '/') {
|
|
118
|
+
return env.ASSETS.fetch(`/index-${variant}.html`)
|
|
119
|
+
}
|
|
120
|
+
return env.ASSETS.fetch(request)
|
|
121
|
+
},
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**10. Locale-based routing:**
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
export default {
|
|
129
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
130
|
+
const locale = request.headers.get('Accept-Language')?.split(',')[0] || 'en'
|
|
131
|
+
const url = new URL(request.url)
|
|
132
|
+
if (url.pathname === '/') {
|
|
133
|
+
return env.ASSETS.fetch(`/${locale}/index.html`)
|
|
134
|
+
}
|
|
135
|
+
if (!url.pathname.startsWith(`/${locale}/`)) {
|
|
136
|
+
url.pathname = `/${locale}${url.pathname}`
|
|
137
|
+
}
|
|
138
|
+
return env.ASSETS.fetch(url)
|
|
139
|
+
},
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**11. OAuth callback handling:**
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
export default {
|
|
147
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
148
|
+
const url = new URL(request.url)
|
|
149
|
+
if (url.pathname === '/auth/callback') {
|
|
150
|
+
const code = url.searchParams.get('code')
|
|
151
|
+
if (code) {
|
|
152
|
+
const session = await exchangeCode(code, env)
|
|
153
|
+
return new Response(null, {
|
|
154
|
+
status: 302,
|
|
155
|
+
headers: {
|
|
156
|
+
Location: '/',
|
|
157
|
+
'Set-Cookie': `session=${session}; HttpOnly; Secure; SameSite=Lax`,
|
|
158
|
+
},
|
|
159
|
+
})
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return env.ASSETS.fetch(request)
|
|
163
|
+
},
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Config:** Set `run_worker_first: ["/auth/*"]`
|
|
168
|
+
|
|
169
|
+
**12. Cache control override:**
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
export default {
|
|
173
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
174
|
+
const response = await env.ASSETS.fetch(request)
|
|
175
|
+
const url = new URL(request.url)
|
|
176
|
+
// Immutable assets (hashed filenames)
|
|
177
|
+
if (/\.[a-f0-9]{8,}\.(js|css|png|jpg)$/.test(url.pathname)) {
|
|
178
|
+
return new Response(response.body, {
|
|
179
|
+
...response,
|
|
180
|
+
headers: {
|
|
181
|
+
...Object.fromEntries(response.headers),
|
|
182
|
+
'Cache-Control': 'public, max-age=31536000, immutable',
|
|
183
|
+
},
|
|
184
|
+
})
|
|
185
|
+
}
|
|
186
|
+
return response
|
|
187
|
+
},
|
|
188
|
+
}
|
|
189
|
+
```
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Cloudflare Stream
|
|
2
|
+
|
|
3
|
+
Serverless live and on-demand video streaming platform with one API.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Cloudflare Stream provides video upload, storage, encoding, and delivery without managing infrastructure. Runs on Cloudflare's global network.
|
|
8
|
+
|
|
9
|
+
### Key Features
|
|
10
|
+
|
|
11
|
+
- **On-demand video**: Upload, encode, store, deliver
|
|
12
|
+
- **Live streaming**: RTMPS/SRT ingestion with ABR
|
|
13
|
+
- **Direct creator uploads**: End users upload without API keys
|
|
14
|
+
- **Signed URLs**: Token-based access control
|
|
15
|
+
- **Analytics**: Server-side metrics via GraphQL
|
|
16
|
+
- **Webhooks**: Processing notifications
|
|
17
|
+
- **Captions**: Upload or AI-generate subtitles
|
|
18
|
+
- **Watermarks**: Apply branding to videos
|
|
19
|
+
- **Downloads**: Enable MP4 offline viewing
|
|
20
|
+
|
|
21
|
+
## Core Concepts
|
|
22
|
+
|
|
23
|
+
### Video Upload Methods
|
|
24
|
+
|
|
25
|
+
1. **API Upload (TUS protocol)**: Direct server upload
|
|
26
|
+
2. **Upload from URL**: Import from external source
|
|
27
|
+
3. **Direct Creator Uploads**: User-generated content (recommended)
|
|
28
|
+
|
|
29
|
+
### Playback Options
|
|
30
|
+
|
|
31
|
+
1. **Stream Player (iframe)**: Built-in, optimized player
|
|
32
|
+
2. **Custom Player (HLS/DASH)**: Video.js, HLS.js integration
|
|
33
|
+
3. **Thumbnails**: Static or animated previews
|
|
34
|
+
|
|
35
|
+
### Access Control
|
|
36
|
+
|
|
37
|
+
- **Public**: No restrictions
|
|
38
|
+
- **requireSignedURLs**: Token-based access
|
|
39
|
+
- **allowedOrigins**: Domain restrictions
|
|
40
|
+
- **Access Rules**: Geo/IP restrictions in tokens
|
|
41
|
+
|
|
42
|
+
### Live Streaming
|
|
43
|
+
|
|
44
|
+
- RTMPS/SRT ingest from OBS, FFmpeg
|
|
45
|
+
- Automatic recording to on-demand
|
|
46
|
+
- Simulcast to YouTube, Twitch, etc.
|
|
47
|
+
- WebRTC support for browser streaming
|
|
48
|
+
|
|
49
|
+
## Quick Start
|
|
50
|
+
|
|
51
|
+
**Upload video via API**
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
curl -X POST \
|
|
55
|
+
"https://api.cloudflare.com/client/v4/accounts/{account_id}/stream/copy" \
|
|
56
|
+
-H "Authorization: Bearer <TOKEN>" \
|
|
57
|
+
-H "Content-Type: application/json" \
|
|
58
|
+
-d '{"url": "https://example.com/video.mp4"}'
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Embed player**
|
|
62
|
+
|
|
63
|
+
```html
|
|
64
|
+
<iframe
|
|
65
|
+
src="https://customer-<CODE>.cloudflarestream.com/<VIDEO_ID>/iframe"
|
|
66
|
+
style="border: none;"
|
|
67
|
+
height="720"
|
|
68
|
+
width="1280"
|
|
69
|
+
allow="accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;"
|
|
70
|
+
allowfullscreen="true"
|
|
71
|
+
></iframe>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Create live input**
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
curl -X POST \
|
|
78
|
+
"https://api.cloudflare.com/client/v4/accounts/{account_id}/stream/live_inputs" \
|
|
79
|
+
-H "Authorization: Bearer <TOKEN>" \
|
|
80
|
+
-H "Content-Type: application/json" \
|
|
81
|
+
-d '{"recording": {"mode": "automatic"}}'
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Limits
|
|
85
|
+
|
|
86
|
+
- Max file size: 30 GB
|
|
87
|
+
- Max frame rate: 60 fps (recommended)
|
|
88
|
+
- Supported formats: MP4, MKV, MOV, AVI, FLV, MPEG-2 TS/PS, MXF, LXF, GXF, 3GP, WebM, MPG, QuickTime
|
|
89
|
+
|
|
90
|
+
## Pricing
|
|
91
|
+
|
|
92
|
+
- $5/1000 min stored
|
|
93
|
+
- $1/1000 min delivered
|
|
94
|
+
|
|
95
|
+
## Resources
|
|
96
|
+
|
|
97
|
+
- Dashboard: https://dash.cloudflare.com/?to=/:account/stream
|
|
98
|
+
- API Docs: https://developers.cloudflare.com/api/resources/stream/
|
|
99
|
+
- Stream Docs: https://developers.cloudflare.com/stream/
|
|
100
|
+
|
|
101
|
+
## Reading Order
|
|
102
|
+
|
|
103
|
+
| Order | File | Purpose | When to Use |
|
|
104
|
+
| ----- | -------------------------------------- | ---------------------------------- | ----------------------------- |
|
|
105
|
+
| 1 | [configuration.md](./configuration.md) | Setup SDKs, env vars, signing keys | Starting new project |
|
|
106
|
+
| 2 | [api.md](./api.md) | On-demand video APIs | Implementing uploads/playback |
|
|
107
|
+
| 3 | [api-live.md](./api-live.md) | Live streaming APIs | Building live streaming |
|
|
108
|
+
| 4 | [patterns.md](./patterns.md) | Full-stack flows, TUS, JWT signing | Implementing workflows |
|
|
109
|
+
| 5 | [gotchas.md](./gotchas.md) | Errors, limits, troubleshooting | Debugging issues |
|
|
110
|
+
|
|
111
|
+
## In This Reference
|
|
112
|
+
|
|
113
|
+
- [configuration.md](./configuration.md) - Setup, environment variables, wrangler config
|
|
114
|
+
- [api.md](./api.md) - On-demand video upload, playback, management APIs
|
|
115
|
+
- [api-live.md](./api-live.md) - Live streaming (RTMPS/SRT/WebRTC), simulcast
|
|
116
|
+
- [patterns.md](./patterns.md) - Full-stack flows, state management, best practices
|
|
117
|
+
- [gotchas.md](./gotchas.md) - Error codes, troubleshooting, limits
|
|
118
|
+
|
|
119
|
+
## See Also
|
|
120
|
+
|
|
121
|
+
- [workers](../workers/) - Deploy Stream APIs in Workers
|
|
122
|
+
- [pages](../pages/) - Integrate Stream with Pages
|
|
123
|
+
- [workers-ai](../workers-ai/) - AI-generate captions
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# Stream Live Streaming API
|
|
2
|
+
|
|
3
|
+
Live input creation, status checking, simulcast, and WebRTC streaming.
|
|
4
|
+
|
|
5
|
+
## Create Live Input
|
|
6
|
+
|
|
7
|
+
### Using Cloudflare SDK
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
import Cloudflare from 'cloudflare'
|
|
11
|
+
|
|
12
|
+
const client = new Cloudflare({ apiToken: env.CF_API_TOKEN })
|
|
13
|
+
|
|
14
|
+
const liveInput = await client.stream.liveInputs.create({
|
|
15
|
+
account_id: env.CF_ACCOUNT_ID,
|
|
16
|
+
recording: { mode: 'automatic', timeoutSeconds: 30 },
|
|
17
|
+
deleteRecordingAfterDays: 30,
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
// Returns: { uid, rtmps, srt, webRTC }
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Raw fetch API
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
async function createLiveInput(accountId: string, apiToken: string) {
|
|
27
|
+
const response = await fetch(
|
|
28
|
+
`https://api.cloudflare.com/client/v4/accounts/${accountId}/stream/live_inputs`,
|
|
29
|
+
{
|
|
30
|
+
method: 'POST',
|
|
31
|
+
headers: { Authorization: `Bearer ${apiToken}`, 'Content-Type': 'application/json' },
|
|
32
|
+
body: JSON.stringify({
|
|
33
|
+
recording: { mode: 'automatic', timeoutSeconds: 30 },
|
|
34
|
+
deleteRecordingAfterDays: 30,
|
|
35
|
+
}),
|
|
36
|
+
}
|
|
37
|
+
)
|
|
38
|
+
const { result } = await response.json()
|
|
39
|
+
return {
|
|
40
|
+
uid: result.uid,
|
|
41
|
+
rtmps: { url: result.rtmps.url, streamKey: result.rtmps.streamKey },
|
|
42
|
+
srt: { url: result.srt.url, streamId: result.srt.streamId, passphrase: result.srt.passphrase },
|
|
43
|
+
webRTC: result.webRTC,
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Check Live Status
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
async function getLiveStatus(accountId: string, liveInputId: string, apiToken: string) {
|
|
52
|
+
const response = await fetch(
|
|
53
|
+
`https://api.cloudflare.com/client/v4/accounts/${accountId}/stream/live_inputs/${liveInputId}`,
|
|
54
|
+
{ headers: { Authorization: `Bearer ${apiToken}` } }
|
|
55
|
+
)
|
|
56
|
+
const { result } = await response.json()
|
|
57
|
+
return {
|
|
58
|
+
isLive: result.status?.current?.state === 'connected',
|
|
59
|
+
recording: result.recording,
|
|
60
|
+
status: result.status,
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Simulcast (Live Outputs)
|
|
66
|
+
|
|
67
|
+
### Create Output
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
async function createLiveOutput(
|
|
71
|
+
accountId: string,
|
|
72
|
+
liveInputId: string,
|
|
73
|
+
apiToken: string,
|
|
74
|
+
outputUrl: string,
|
|
75
|
+
streamKey: string
|
|
76
|
+
) {
|
|
77
|
+
return fetch(
|
|
78
|
+
`https://api.cloudflare.com/client/v4/accounts/${accountId}/stream/live_inputs/${liveInputId}/outputs`,
|
|
79
|
+
{
|
|
80
|
+
method: 'POST',
|
|
81
|
+
headers: { Authorization: `Bearer ${apiToken}`, 'Content-Type': 'application/json' },
|
|
82
|
+
body: JSON.stringify({
|
|
83
|
+
url: `${outputUrl}/${streamKey}`,
|
|
84
|
+
enabled: true,
|
|
85
|
+
streamKey, // For platforms like YouTube, Twitch
|
|
86
|
+
}),
|
|
87
|
+
}
|
|
88
|
+
).then((r) => r.json())
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Example: Simulcast to YouTube + Twitch
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
const liveInput = await createLiveInput(accountId, apiToken)
|
|
96
|
+
|
|
97
|
+
// Add YouTube output
|
|
98
|
+
await createLiveOutput(
|
|
99
|
+
accountId,
|
|
100
|
+
liveInput.uid,
|
|
101
|
+
apiToken,
|
|
102
|
+
'rtmp://a.rtmp.youtube.com/live2',
|
|
103
|
+
'your-youtube-stream-key'
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
// Add Twitch output
|
|
107
|
+
await createLiveOutput(
|
|
108
|
+
accountId,
|
|
109
|
+
liveInput.uid,
|
|
110
|
+
apiToken,
|
|
111
|
+
'rtmp://live.twitch.tv/app',
|
|
112
|
+
'your-twitch-stream-key'
|
|
113
|
+
)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## WebRTC Streaming (WHIP/WHEP)
|
|
117
|
+
|
|
118
|
+
### Browser to Stream (WHIP)
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
async function startWebRTCBroadcast(liveInputId: string) {
|
|
122
|
+
const pc = new RTCPeerConnection()
|
|
123
|
+
|
|
124
|
+
// Add local media tracks
|
|
125
|
+
const stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true })
|
|
126
|
+
stream.getTracks().forEach((track) => pc.addTrack(track, stream))
|
|
127
|
+
|
|
128
|
+
// Create offer
|
|
129
|
+
const offer = await pc.createOffer()
|
|
130
|
+
await pc.setLocalDescription(offer)
|
|
131
|
+
|
|
132
|
+
// Send to Stream via WHIP
|
|
133
|
+
const response = await fetch(
|
|
134
|
+
`https://customer-<CODE>.cloudflarestream.com/${liveInputId}/webRTC/publish`,
|
|
135
|
+
{
|
|
136
|
+
method: 'POST',
|
|
137
|
+
headers: { 'Content-Type': 'application/sdp' },
|
|
138
|
+
body: offer.sdp,
|
|
139
|
+
}
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
const answer = await response.text()
|
|
143
|
+
await pc.setRemoteDescription({ type: 'answer', sdp: answer })
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Stream to Browser (WHEP)
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
async function playWebRTCStream(videoId: string) {
|
|
151
|
+
const pc = new RTCPeerConnection()
|
|
152
|
+
|
|
153
|
+
pc.addTransceiver('video', { direction: 'recvonly' })
|
|
154
|
+
pc.addTransceiver('audio', { direction: 'recvonly' })
|
|
155
|
+
|
|
156
|
+
const offer = await pc.createOffer()
|
|
157
|
+
await pc.setLocalDescription(offer)
|
|
158
|
+
|
|
159
|
+
const response = await fetch(
|
|
160
|
+
`https://customer-<CODE>.cloudflarestream.com/${videoId}/webRTC/play`,
|
|
161
|
+
{
|
|
162
|
+
method: 'POST',
|
|
163
|
+
headers: { 'Content-Type': 'application/sdp' },
|
|
164
|
+
body: offer.sdp,
|
|
165
|
+
}
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
const answer = await response.text()
|
|
169
|
+
await pc.setRemoteDescription({ type: 'answer', sdp: answer })
|
|
170
|
+
|
|
171
|
+
return pc
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Recording Settings
|
|
176
|
+
|
|
177
|
+
| Mode | Behavior |
|
|
178
|
+
| ---------------- | -------------------------------------------- |
|
|
179
|
+
| `automatic` | Record all live streams |
|
|
180
|
+
| `off` | No recording |
|
|
181
|
+
| `timeoutSeconds` | Stop recording after N seconds of inactivity |
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
const recordingConfig = {
|
|
185
|
+
mode: 'automatic',
|
|
186
|
+
timeoutSeconds: 30, // Auto-stop 30s after stream ends
|
|
187
|
+
requireSignedURLs: true, // Require token for VOD playback
|
|
188
|
+
allowedOrigins: ['https://yourdomain.com'],
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## In This Reference
|
|
193
|
+
|
|
194
|
+
- [README.md](./README.md) - Overview and quick start
|
|
195
|
+
- [api.md](./api.md) - On-demand video APIs
|
|
196
|
+
- [configuration.md](./configuration.md) - Setup and config
|
|
197
|
+
- [patterns.md](./patterns.md) - Full-stack flows, best practices
|
|
198
|
+
- [gotchas.md](./gotchas.md) - Error codes, troubleshooting
|
|
199
|
+
|
|
200
|
+
## See Also
|
|
201
|
+
|
|
202
|
+
- [workers](../workers/) - Deploy live APIs in Workers
|