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,253 @@
|
|
|
1
|
+
# Troubleshooting & Gotchas
|
|
2
|
+
|
|
3
|
+
## Critical Rules
|
|
4
|
+
|
|
5
|
+
### ❌ Skipping Server-Side Validation
|
|
6
|
+
|
|
7
|
+
**Problem:** Client-only validation is easily bypassed.
|
|
8
|
+
|
|
9
|
+
**Solution:** Always validate on server.
|
|
10
|
+
|
|
11
|
+
```javascript
|
|
12
|
+
// CORRECT - Server validates token
|
|
13
|
+
app.post('/submit', async (req, res) => {
|
|
14
|
+
const token = req.body['cf-turnstile-response']
|
|
15
|
+
const validation = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', {
|
|
16
|
+
method: 'POST',
|
|
17
|
+
body: JSON.stringify({ secret: SECRET, response: token }),
|
|
18
|
+
}).then((r) => r.json())
|
|
19
|
+
|
|
20
|
+
if (!validation.success) return res.status(403).json({ error: 'CAPTCHA failed' })
|
|
21
|
+
})
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### ❌ Exposing Secret Key
|
|
25
|
+
|
|
26
|
+
**Problem:** Secret key leaked in client-side code.
|
|
27
|
+
|
|
28
|
+
**Solution:** Server-side validation only. Never send secret to client.
|
|
29
|
+
|
|
30
|
+
### ❌ Reusing Tokens (Single-Use Rule)
|
|
31
|
+
|
|
32
|
+
**Problem:** Tokens are single-use. Revalidation fails with `timeout-or-duplicate`.
|
|
33
|
+
|
|
34
|
+
**Solution:** Generate new token for each submission. Reset widget on error.
|
|
35
|
+
|
|
36
|
+
```javascript
|
|
37
|
+
if (!response.ok) window.turnstile.reset(widgetId)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### ❌ Not Handling Token Expiry
|
|
41
|
+
|
|
42
|
+
**Problem:** Tokens expire after 5 minutes.
|
|
43
|
+
|
|
44
|
+
**Solution:** Handle expiry callback or use auto-refresh.
|
|
45
|
+
|
|
46
|
+
```javascript
|
|
47
|
+
window.turnstile.render('#container', {
|
|
48
|
+
sitekey: 'YOUR_SITE_KEY',
|
|
49
|
+
'refresh-expired': 'auto', // or 'manual' with expired-callback
|
|
50
|
+
'expired-callback': () => window.turnstile.reset(widgetId),
|
|
51
|
+
})
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Common Errors
|
|
55
|
+
|
|
56
|
+
| Error | Cause | Solution |
|
|
57
|
+
| -------------------------- | ------------------------------------------------- | ----------------------------------------------------------------- |
|
|
58
|
+
| **Widget not rendering** | Incorrect sitekey, CSP blocking, file:// protocol | Check sitekey, add CSP for challenges.cloudflare.com, use http:// |
|
|
59
|
+
| **timeout-or-duplicate** | Token expired (>5min) or reused | Generate fresh token, don't cache >5min |
|
|
60
|
+
| **invalid-input-secret** | Wrong secret key | Verify secret from dashboard, check env vars |
|
|
61
|
+
| **missing-input-response** | Token not sent | Check form field name is 'cf-turnstile-response' |
|
|
62
|
+
|
|
63
|
+
## Framework Gotchas
|
|
64
|
+
|
|
65
|
+
### React: Widget Re-mounting
|
|
66
|
+
|
|
67
|
+
**Problem:** Widget re-renders on state change, losing token.
|
|
68
|
+
|
|
69
|
+
**Solution:** Control lifecycle with useRef.
|
|
70
|
+
|
|
71
|
+
```tsx
|
|
72
|
+
function TurnstileWidget({ onToken }) {
|
|
73
|
+
const containerRef = useRef(null)
|
|
74
|
+
const widgetIdRef = useRef(null)
|
|
75
|
+
|
|
76
|
+
useEffect(() => {
|
|
77
|
+
if (containerRef.current && !widgetIdRef.current) {
|
|
78
|
+
widgetIdRef.current = window.turnstile.render(containerRef.current, {
|
|
79
|
+
sitekey: 'YOUR_SITE_KEY',
|
|
80
|
+
callback: onToken,
|
|
81
|
+
})
|
|
82
|
+
}
|
|
83
|
+
return () => {
|
|
84
|
+
if (widgetIdRef.current) {
|
|
85
|
+
window.turnstile.remove(widgetIdRef.current)
|
|
86
|
+
widgetIdRef.current = null
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}, [])
|
|
90
|
+
|
|
91
|
+
return <div ref={containerRef} />
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### React StrictMode: Double Render
|
|
96
|
+
|
|
97
|
+
**Problem:** Widget renders twice in dev due to StrictMode.
|
|
98
|
+
|
|
99
|
+
**Solution:** Use cleanup function.
|
|
100
|
+
|
|
101
|
+
```tsx
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
const widgetId = window.turnstile.render('#container', { sitekey })
|
|
104
|
+
return () => window.turnstile.remove(widgetId)
|
|
105
|
+
}, [])
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Next.js: SSR Hydration
|
|
109
|
+
|
|
110
|
+
**Problem:** `window.turnstile` undefined during SSR.
|
|
111
|
+
|
|
112
|
+
**Solution:** Use `'use client'` or dynamic import with `ssr: false`.
|
|
113
|
+
|
|
114
|
+
```tsx
|
|
115
|
+
'use client'
|
|
116
|
+
export default function Turnstile() {
|
|
117
|
+
/* component */
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### SPA: Navigation Without Cleanup
|
|
122
|
+
|
|
123
|
+
**Problem:** Navigating leaves orphaned widgets.
|
|
124
|
+
|
|
125
|
+
**Solution:** Remove widget in cleanup.
|
|
126
|
+
|
|
127
|
+
```javascript
|
|
128
|
+
// Vue
|
|
129
|
+
onBeforeUnmount(() => window.turnstile.remove(widgetId))
|
|
130
|
+
|
|
131
|
+
// React
|
|
132
|
+
useEffect(() => () => window.turnstile.remove(widgetId), [])
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Network & Security
|
|
136
|
+
|
|
137
|
+
### CSP Blocking
|
|
138
|
+
|
|
139
|
+
**Problem:** Content Security Policy blocks script/iframe.
|
|
140
|
+
|
|
141
|
+
**Solution:** Add CSP directives.
|
|
142
|
+
|
|
143
|
+
```html
|
|
144
|
+
<meta
|
|
145
|
+
http-equiv="Content-Security-Policy"
|
|
146
|
+
content="script-src 'self' https://challenges.cloudflare.com;
|
|
147
|
+
frame-src https://challenges.cloudflare.com;"
|
|
148
|
+
/>
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### IP Address Forwarding
|
|
152
|
+
|
|
153
|
+
**Problem:** Server receives proxy IP instead of client IP.
|
|
154
|
+
|
|
155
|
+
**Solution:** Use correct header.
|
|
156
|
+
|
|
157
|
+
```javascript
|
|
158
|
+
// Cloudflare Workers
|
|
159
|
+
const ip = request.headers.get('CF-Connecting-IP')
|
|
160
|
+
|
|
161
|
+
// Behind proxy
|
|
162
|
+
const ip = request.headers.get('X-Forwarded-For')?.split(',')[0]
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### CORS (Siteverify)
|
|
166
|
+
|
|
167
|
+
**Problem:** CORS error calling siteverify from browser.
|
|
168
|
+
|
|
169
|
+
**Solution:** Never call siteverify client-side. Call your backend, backend calls siteverify.
|
|
170
|
+
|
|
171
|
+
## Limits & Constraints
|
|
172
|
+
|
|
173
|
+
| Limit | Value | Impact |
|
|
174
|
+
| -------------- | -------------------------------------- | ---------------------------- |
|
|
175
|
+
| Token validity | 5 minutes | Must regenerate after expiry |
|
|
176
|
+
| Token use | Single-use | Cannot revalidate same token |
|
|
177
|
+
| Widget size | 300x65px (normal), 130x120px (compact) | Plan layout |
|
|
178
|
+
|
|
179
|
+
## Debugging
|
|
180
|
+
|
|
181
|
+
### Console Logging
|
|
182
|
+
|
|
183
|
+
```javascript
|
|
184
|
+
window.turnstile.render('#container', {
|
|
185
|
+
sitekey: 'YOUR_SITE_KEY',
|
|
186
|
+
callback: (token) => console.log('✓ Token:', token),
|
|
187
|
+
'error-callback': (code) => console.error('✗ Error:', code),
|
|
188
|
+
'expired-callback': () => console.warn('⏱ Expired'),
|
|
189
|
+
'timeout-callback': () => console.warn('⏱ Timeout'),
|
|
190
|
+
})
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Check Token State
|
|
194
|
+
|
|
195
|
+
```javascript
|
|
196
|
+
const token = window.turnstile.getResponse(widgetId)
|
|
197
|
+
console.log('Token:', token || 'NOT READY')
|
|
198
|
+
console.log('Expired:', window.turnstile.isExpired(widgetId))
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Test Keys (Use First)
|
|
202
|
+
|
|
203
|
+
Always develop with test keys before production:
|
|
204
|
+
|
|
205
|
+
- Site: `1x00000000000000000000AA`
|
|
206
|
+
- Secret: `1x0000000000000000000000000000000AA`
|
|
207
|
+
|
|
208
|
+
### Network Tab
|
|
209
|
+
|
|
210
|
+
- Verify `api.js` loads (200 OK)
|
|
211
|
+
- Check siteverify request/response
|
|
212
|
+
- Look for 4xx/5xx errors
|
|
213
|
+
|
|
214
|
+
## Misconfigurations
|
|
215
|
+
|
|
216
|
+
### Wrong Key Pairing
|
|
217
|
+
|
|
218
|
+
**Problem:** Site key from one widget, secret from another.
|
|
219
|
+
|
|
220
|
+
**Solution:** Verify site key and secret are from same widget in dashboard.
|
|
221
|
+
|
|
222
|
+
### Test Keys in Production
|
|
223
|
+
|
|
224
|
+
**Problem:** Using test keys in production.
|
|
225
|
+
|
|
226
|
+
**Solution:** Environment-based keys.
|
|
227
|
+
|
|
228
|
+
```javascript
|
|
229
|
+
const SITE_KEY =
|
|
230
|
+
process.env.NODE_ENV === 'production'
|
|
231
|
+
? process.env.TURNSTILE_SITE_KEY
|
|
232
|
+
: '1x00000000000000000000AA'
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### Missing Environment Variables
|
|
236
|
+
|
|
237
|
+
**Problem:** Secret undefined on server.
|
|
238
|
+
|
|
239
|
+
**Solution:** Check .env and verify loading.
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
# .env
|
|
243
|
+
TURNSTILE_SECRET=your_secret_here
|
|
244
|
+
|
|
245
|
+
# Verify
|
|
246
|
+
console.log('Secret loaded:', !!process.env.TURNSTILE_SECRET);
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
## Reference
|
|
250
|
+
|
|
251
|
+
- [Turnstile Docs](https://developers.cloudflare.com/turnstile/)
|
|
252
|
+
- [Dashboard](https://dash.cloudflare.com/?to=/:account/turnstile)
|
|
253
|
+
- [Error Codes](https://developers.cloudflare.com/turnstile/troubleshooting/)
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# Common Patterns
|
|
2
|
+
|
|
3
|
+
## Form Integration
|
|
4
|
+
|
|
5
|
+
### Basic Form (Implicit Rendering)
|
|
6
|
+
|
|
7
|
+
```html
|
|
8
|
+
<!DOCTYPE html>
|
|
9
|
+
<html>
|
|
10
|
+
<head>
|
|
11
|
+
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
|
|
12
|
+
</head>
|
|
13
|
+
<body>
|
|
14
|
+
<form action="/submit" method="POST">
|
|
15
|
+
<input type="email" name="email" required />
|
|
16
|
+
<div class="cf-turnstile" data-sitekey="YOUR_SITE_KEY"></div>
|
|
17
|
+
<button type="submit">Submit</button>
|
|
18
|
+
</form>
|
|
19
|
+
</body>
|
|
20
|
+
</html>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Controlled Form (Explicit Rendering)
|
|
24
|
+
|
|
25
|
+
```javascript
|
|
26
|
+
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit"></script>
|
|
27
|
+
<script>
|
|
28
|
+
let widgetId = window.turnstile.render('#container', {
|
|
29
|
+
sitekey: 'YOUR_SITE_KEY',
|
|
30
|
+
callback: (token) => console.log('Token:', token)
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
form.addEventListener('submit', async (e) => {
|
|
34
|
+
e.preventDefault();
|
|
35
|
+
const token = window.turnstile.getResponse(widgetId);
|
|
36
|
+
if (!token) return;
|
|
37
|
+
|
|
38
|
+
const response = await fetch('/submit', {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
body: JSON.stringify({ 'cf-turnstile-response': token })
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
if (!response.ok) window.turnstile.reset(widgetId);
|
|
44
|
+
});
|
|
45
|
+
</script>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Framework Patterns
|
|
49
|
+
|
|
50
|
+
### React
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
import { useState } from 'react'
|
|
54
|
+
import Turnstile from '@marsidev/react-turnstile'
|
|
55
|
+
|
|
56
|
+
export default function Form() {
|
|
57
|
+
const [token, setToken] = useState<string | null>(null)
|
|
58
|
+
|
|
59
|
+
return (
|
|
60
|
+
<form
|
|
61
|
+
onSubmit={async (e) => {
|
|
62
|
+
e.preventDefault()
|
|
63
|
+
if (!token) return
|
|
64
|
+
await fetch('/api/submit', {
|
|
65
|
+
method: 'POST',
|
|
66
|
+
body: JSON.stringify({ 'cf-turnstile-response': token }),
|
|
67
|
+
})
|
|
68
|
+
}}
|
|
69
|
+
>
|
|
70
|
+
<Turnstile siteKey="YOUR_SITE_KEY" onSuccess={setToken} />
|
|
71
|
+
<button disabled={!token}>Submit</button>
|
|
72
|
+
</form>
|
|
73
|
+
)
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Vue / Svelte
|
|
78
|
+
|
|
79
|
+
```vue
|
|
80
|
+
<!-- Vue: npm install vue-turnstile -->
|
|
81
|
+
<VueTurnstile :site-key="SITE_KEY" @success="token = $event" />
|
|
82
|
+
|
|
83
|
+
<!-- Svelte: npm install svelte-turnstile -->
|
|
84
|
+
<Turnstile siteKey={SITE_KEY} on:turnstile-callback={(e) => token = e.detail.token} />
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Server Validation
|
|
88
|
+
|
|
89
|
+
### Cloudflare Workers
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
interface Env {
|
|
93
|
+
TURNSTILE_SECRET: string
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export default {
|
|
97
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
98
|
+
if (request.method !== 'POST') {
|
|
99
|
+
return new Response('Method not allowed', { status: 405 })
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const formData = await request.formData()
|
|
103
|
+
const token = formData.get('cf-turnstile-response')
|
|
104
|
+
|
|
105
|
+
if (!token) {
|
|
106
|
+
return new Response('Missing token', { status: 400 })
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Validate token
|
|
110
|
+
const ip = request.headers.get('CF-Connecting-IP')
|
|
111
|
+
const result = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', {
|
|
112
|
+
method: 'POST',
|
|
113
|
+
headers: { 'Content-Type': 'application/json' },
|
|
114
|
+
body: JSON.stringify({
|
|
115
|
+
secret: env.TURNSTILE_SECRET,
|
|
116
|
+
response: token,
|
|
117
|
+
remoteip: ip,
|
|
118
|
+
}),
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
const validation = await result.json()
|
|
122
|
+
|
|
123
|
+
if (!validation.success) {
|
|
124
|
+
return new Response('CAPTCHA validation failed', { status: 403 })
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Process form...
|
|
128
|
+
return new Response('Success')
|
|
129
|
+
},
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Pages Functions
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
// functions/submit.ts - same pattern as Workers, use ctx.env and ctx.request
|
|
137
|
+
export const onRequestPost: PagesFunction<{ TURNSTILE_SECRET: string }> = async (ctx) => {
|
|
138
|
+
const token = (await ctx.request.formData()).get('cf-turnstile-response')
|
|
139
|
+
// Validate with ctx.env.TURNSTILE_SECRET (same as Workers pattern above)
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Advanced Patterns
|
|
144
|
+
|
|
145
|
+
### Pre-Clearance (Invisible)
|
|
146
|
+
|
|
147
|
+
```html
|
|
148
|
+
<div id="turnstile-precheck"></div>
|
|
149
|
+
<form id="protected-form" style="display: none;">
|
|
150
|
+
<button type="submit">Submit</button>
|
|
151
|
+
</form>
|
|
152
|
+
|
|
153
|
+
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit"></script>
|
|
154
|
+
<script>
|
|
155
|
+
let cachedToken = null
|
|
156
|
+
|
|
157
|
+
window.onload = () => {
|
|
158
|
+
window.turnstile.render('#turnstile-precheck', {
|
|
159
|
+
sitekey: 'YOUR_SITE_KEY',
|
|
160
|
+
size: 'invisible',
|
|
161
|
+
callback: (token) => {
|
|
162
|
+
cachedToken = token
|
|
163
|
+
document.getElementById('protected-form').style.display = 'block'
|
|
164
|
+
},
|
|
165
|
+
})
|
|
166
|
+
}
|
|
167
|
+
</script>
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Token Refresh on Expiry
|
|
171
|
+
|
|
172
|
+
```javascript
|
|
173
|
+
let widgetId = window.turnstile.render('#container', {
|
|
174
|
+
sitekey: 'YOUR_SITE_KEY',
|
|
175
|
+
'refresh-expired': 'manual',
|
|
176
|
+
'expired-callback': () => {
|
|
177
|
+
console.log('Token expired, refreshing...')
|
|
178
|
+
window.turnstile.reset(widgetId)
|
|
179
|
+
},
|
|
180
|
+
})
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Testing
|
|
184
|
+
|
|
185
|
+
### Environment-Based Keys
|
|
186
|
+
|
|
187
|
+
```javascript
|
|
188
|
+
const SITE_KEY =
|
|
189
|
+
process.env.NODE_ENV === 'production' ? 'YOUR_PRODUCTION_SITE_KEY' : '1x00000000000000000000AA' // Always passes
|
|
190
|
+
|
|
191
|
+
const SECRET_KEY =
|
|
192
|
+
process.env.NODE_ENV === 'production'
|
|
193
|
+
? process.env.TURNSTILE_SECRET
|
|
194
|
+
: '1x0000000000000000000000000000000AA'
|
|
195
|
+
```
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Cloudflare Vectorize
|
|
2
|
+
|
|
3
|
+
Globally distributed vector database for AI applications. Store and query vector embeddings for semantic search, recommendations, RAG, and classification.
|
|
4
|
+
|
|
5
|
+
**Status:** Generally Available (GA) | **Last Updated:** 2026-01-27
|
|
6
|
+
|
|
7
|
+
## Quick Start
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// 1. Create index
|
|
11
|
+
// npx wrangler vectorize create my-index --dimensions=768 --metric=cosine
|
|
12
|
+
|
|
13
|
+
// 2. Configure binding (wrangler.jsonc)
|
|
14
|
+
// { "vectorize": [{ "binding": "VECTORIZE", "index_name": "my-index" }] }
|
|
15
|
+
|
|
16
|
+
// 3. Query vectors
|
|
17
|
+
const matches = await env.VECTORIZE.query(queryVector, { topK: 5 })
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Key Features
|
|
21
|
+
|
|
22
|
+
- **10M vectors per index** (V2)
|
|
23
|
+
- Dimensions up to 1536 (32-bit float)
|
|
24
|
+
- Three distance metrics: cosine, euclidean, dot-product
|
|
25
|
+
- Metadata filtering (up to 10 indexes)
|
|
26
|
+
- Namespace support (50K namespaces paid, 1K free)
|
|
27
|
+
- Seamless Workers AI integration
|
|
28
|
+
- Global distribution
|
|
29
|
+
|
|
30
|
+
## Reading Order
|
|
31
|
+
|
|
32
|
+
| Task | Files to Read |
|
|
33
|
+
| ------------------ | ----------------------- |
|
|
34
|
+
| New to Vectorize | README only |
|
|
35
|
+
| Implement feature | README + api + patterns |
|
|
36
|
+
| Setup/configure | README + configuration |
|
|
37
|
+
| Debug issues | gotchas |
|
|
38
|
+
| Integrate with AI | README + patterns |
|
|
39
|
+
| RAG implementation | README + patterns |
|
|
40
|
+
|
|
41
|
+
## File Guide
|
|
42
|
+
|
|
43
|
+
- **README.md** (this file): Overview, quick decisions
|
|
44
|
+
- **api.md**: Runtime API, types, operations (query/insert/upsert)
|
|
45
|
+
- **configuration.md**: Setup, CLI, metadata indexes
|
|
46
|
+
- **patterns.md**: RAG, Workers AI, OpenAI, LangChain, multi-tenant
|
|
47
|
+
- **gotchas.md**: Limits, pitfalls, troubleshooting
|
|
48
|
+
|
|
49
|
+
## Distance Metric Selection
|
|
50
|
+
|
|
51
|
+
Choose based on your use case:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
What are you building?
|
|
55
|
+
├─ Text/semantic search → cosine (most common)
|
|
56
|
+
├─ Image similarity → euclidean
|
|
57
|
+
├─ Recommendation system → dot-product
|
|
58
|
+
└─ Pre-normalized vectors → dot-product
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
| Metric | Best For | Score Interpretation |
|
|
62
|
+
| ------------- | ------------------------------------ | --------------------------------- |
|
|
63
|
+
| `cosine` | Text embeddings, semantic similarity | Higher = closer (1.0 = identical) |
|
|
64
|
+
| `euclidean` | Absolute distance, spatial data | Lower = closer (0.0 = identical) |
|
|
65
|
+
| `dot-product` | Recommendations, normalized vectors | Higher = closer |
|
|
66
|
+
|
|
67
|
+
**Note:** Index configuration is immutable. Cannot change dimensions or metric after creation.
|
|
68
|
+
|
|
69
|
+
## Multi-Tenancy Strategy
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
How many tenants?
|
|
73
|
+
├─ < 50K tenants → Use namespaces (recommended)
|
|
74
|
+
│ ├─ Fastest (filter before vector search)
|
|
75
|
+
│ └─ Strict isolation
|
|
76
|
+
├─ > 50K tenants → Use metadata filtering
|
|
77
|
+
│ ├─ Slower (post-filter after vector search)
|
|
78
|
+
│ └─ Requires metadata index
|
|
79
|
+
└─ Per-tenant indexes → Only if compliance mandated
|
|
80
|
+
└─ 50K index limit per account (paid plan)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Common Workflows
|
|
84
|
+
|
|
85
|
+
### Semantic Search
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
// 1. Generate embedding
|
|
89
|
+
const result = await env.AI.run('@cf/baai/bge-base-en-v1.5', { text: [query] })
|
|
90
|
+
|
|
91
|
+
// 2. Query Vectorize
|
|
92
|
+
const matches = await env.VECTORIZE.query(result.data[0], {
|
|
93
|
+
topK: 5,
|
|
94
|
+
returnMetadata: 'indexed',
|
|
95
|
+
})
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### RAG Pattern
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
// 1. Generate query embedding
|
|
102
|
+
const embedding = await env.AI.run('@cf/baai/bge-base-en-v1.5', { text: [query] })
|
|
103
|
+
|
|
104
|
+
// 2. Search Vectorize
|
|
105
|
+
const matches = await env.VECTORIZE.query(embedding.data[0], { topK: 5 })
|
|
106
|
+
|
|
107
|
+
// 3. Fetch full documents from R2/D1/KV
|
|
108
|
+
const docs = await Promise.all(
|
|
109
|
+
matches.matches.map((m) => env.R2.get(m.metadata.key).then((obj) => obj?.text()))
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
// 4. Generate LLM response with context
|
|
113
|
+
const answer = await env.AI.run('@cf/meta/llama-3-8b-instruct', {
|
|
114
|
+
prompt: `Context: ${docs.join('\n\n')}\n\nQuestion: ${query}\n\nAnswer:`,
|
|
115
|
+
})
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Critical Gotchas
|
|
119
|
+
|
|
120
|
+
See `gotchas.md` for details. Most important:
|
|
121
|
+
|
|
122
|
+
1. **Async mutations**: Inserts take 5-10s to be queryable
|
|
123
|
+
2. **500 batch limit**: Workers API enforces 500 vectors per call (undocumented)
|
|
124
|
+
3. **Metadata truncation**: `"indexed"` returns first 64 bytes only
|
|
125
|
+
4. **topK with metadata**: Max 20 (not 100) when using returnValues or returnMetadata: "all"
|
|
126
|
+
5. **Metadata indexes first**: Must create before inserting vectors
|
|
127
|
+
|
|
128
|
+
## Resources
|
|
129
|
+
|
|
130
|
+
- [Official Docs](https://developers.cloudflare.com/vectorize/)
|
|
131
|
+
- [Client API Reference](https://developers.cloudflare.com/vectorize/reference/client-api/)
|
|
132
|
+
- [Workers AI Models](https://developers.cloudflare.com/workers-ai/models/#text-embeddings)
|
|
133
|
+
- [Discord: #vectorize](https://discord.cloudflare.com)
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Vectorize API Reference
|
|
2
|
+
|
|
3
|
+
## Types
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
interface VectorizeVector {
|
|
7
|
+
id: string // Max 64 bytes
|
|
8
|
+
values: number[] // Must match index dimensions
|
|
9
|
+
namespace?: string // Optional partition (max 64 bytes)
|
|
10
|
+
metadata?: Record<string, any> // Max 10 KiB
|
|
11
|
+
}
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Query
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
const matches = await env.VECTORIZE.query(queryVector, {
|
|
18
|
+
topK: 10, // Max 100 (or 20 with returnValues/returnMetadata:"all")
|
|
19
|
+
returnMetadata: 'indexed', // "none" | "indexed" | "all"
|
|
20
|
+
returnValues: false,
|
|
21
|
+
namespace: 'tenant-123',
|
|
22
|
+
filter: { category: 'docs' },
|
|
23
|
+
})
|
|
24
|
+
// matches.matches[0] = { id, score, metadata? }
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**returnMetadata:** `"none"` (fastest) → `"indexed"` (recommended) → `"all"` (topK max 20)
|
|
28
|
+
|
|
29
|
+
**queryById (V2 only):** Search using existing vector as query.
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
await env.VECTORIZE.queryById('doc-123', { topK: 5 })
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Insert/Upsert
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
// Insert: ignores duplicates (keeps first)
|
|
39
|
+
await env.VECTORIZE.insert([{ id, values, metadata }])
|
|
40
|
+
|
|
41
|
+
// Upsert: overwrites duplicates (keeps last)
|
|
42
|
+
await env.VECTORIZE.upsert([{ id, values, metadata }])
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Max 500 vectors per call.** Queryable after 5-10 seconds.
|
|
46
|
+
|
|
47
|
+
## Other Operations
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
// Get by IDs
|
|
51
|
+
const vectors = await env.VECTORIZE.getByIds(['id1', 'id2'])
|
|
52
|
+
|
|
53
|
+
// Delete (max 1000 IDs per call)
|
|
54
|
+
await env.VECTORIZE.deleteByIds(['id1', 'id2'])
|
|
55
|
+
|
|
56
|
+
// Index info
|
|
57
|
+
const info = await env.VECTORIZE.describe()
|
|
58
|
+
// { dimensions, metric, vectorCount }
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Filtering
|
|
62
|
+
|
|
63
|
+
Requires metadata index. Filter operators:
|
|
64
|
+
|
|
65
|
+
| Operator | Example |
|
|
66
|
+
| ---------------------------- | -------------------------------- |
|
|
67
|
+
| `$eq` (implicit) | `{ category: "docs" }` |
|
|
68
|
+
| `$ne` | `{ status: { $ne: "deleted" } }` |
|
|
69
|
+
| `$in` / `$nin` | `{ tag: { $in: ["sale"] } }` |
|
|
70
|
+
| `$lt`, `$lte`, `$gt`, `$gte` | `{ price: { $lt: 100 } }` |
|
|
71
|
+
|
|
72
|
+
**Constraints:** Max 2048 bytes, no dots/`$` in keys, values: string/number/boolean/null.
|
|
73
|
+
|
|
74
|
+
## Performance
|
|
75
|
+
|
|
76
|
+
| Configuration | topK Limit | Speed |
|
|
77
|
+
| --------------------------- | ---------- | ------- |
|
|
78
|
+
| No metadata | 100 | Fastest |
|
|
79
|
+
| `returnMetadata: "indexed"` | 100 | Fast |
|
|
80
|
+
| `returnMetadata: "all"` | 20 | Slower |
|
|
81
|
+
| `returnValues: true` | 20 | Slower |
|
|
82
|
+
|
|
83
|
+
**Batch operations:** Always batch (500/call) for optimal throughput.
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
for (let i = 0; i < vectors.length; i += 500) {
|
|
87
|
+
await env.VECTORIZE.upsert(vectors.slice(i, i + 500))
|
|
88
|
+
}
|
|
89
|
+
```
|