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,116 @@
|
|
|
1
|
+
# Bot Management Gotchas
|
|
2
|
+
|
|
3
|
+
## Common Errors
|
|
4
|
+
|
|
5
|
+
### "Bot Score = 0"
|
|
6
|
+
|
|
7
|
+
**Cause:** Bot Management didn't run (internal Cloudflare request, Worker routing to zone (Orange-to-Orange), or request handled before BM (Redirect Rules, etc.))
|
|
8
|
+
**Solution:** Check request flow and ensure Bot Management runs in request lifecycle
|
|
9
|
+
|
|
10
|
+
### "JavaScript Detections Not Working"
|
|
11
|
+
|
|
12
|
+
**Cause:** `js_detection.passed` always false or undefined due to: CSP headers don't allow `/cdn-cgi/challenge-platform/`, using on first page visit (needs HTML page first), ad blockers or disabled JS, JSD not enabled in dashboard, or using Block action (must use Managed Challenge)
|
|
13
|
+
**Solution:** Add CSP header `Content-Security-Policy: script-src 'self' /cdn-cgi/challenge-platform/;` and ensure JSD is enabled with Managed Challenge action
|
|
14
|
+
|
|
15
|
+
### "False Positives (Legitimate Users Blocked)"
|
|
16
|
+
|
|
17
|
+
**Cause:** Bot detection incorrectly flagging legitimate users
|
|
18
|
+
**Solution:** Check Bot Analytics for affected IPs/paths, identify detection source (ML, Heuristics, etc.), create exception rule like `(cf.bot_management.score lt 30 and http.request.uri.path eq "/problematic-path")` with Action: Skip (Bot Management), or allowlist by IP/ASN/country
|
|
19
|
+
|
|
20
|
+
### "False Negatives (Bots Not Caught)"
|
|
21
|
+
|
|
22
|
+
**Cause:** Bots bypassing detection
|
|
23
|
+
**Solution:** Lower score threshold (30 → 50), enable JavaScript Detections, add JA3/JA4 fingerprinting rules, or use rate limiting as fallback
|
|
24
|
+
|
|
25
|
+
### "Verified Bot Blocked"
|
|
26
|
+
|
|
27
|
+
**Cause:** Search engine bot blocked by WAF Managed Rules (not just Bot Management)
|
|
28
|
+
**Solution:** Create WAF exception for specific rule ID and verify bot via reverse DNS
|
|
29
|
+
|
|
30
|
+
### "Yandex Bot Blocked During IP Update"
|
|
31
|
+
|
|
32
|
+
**Cause:** Yandex updates bot IPs; new IPs unrecognized for 48h during propagation
|
|
33
|
+
**Solution:**
|
|
34
|
+
|
|
35
|
+
1. Check Security Events for specific WAF rule ID blocking Yandex
|
|
36
|
+
2. Create WAF exception:
|
|
37
|
+
```txt
|
|
38
|
+
(http.user_agent contains "YandexBot" and ip.src in {<yandex-ip-range>})
|
|
39
|
+
Action: Skip (WAF Managed Ruleset)
|
|
40
|
+
```
|
|
41
|
+
3. Monitor Bot Analytics for 48h
|
|
42
|
+
4. Remove exception after propagation completes
|
|
43
|
+
|
|
44
|
+
Issue resolves automatically after 48h. Contact Cloudflare Support if persists.
|
|
45
|
+
|
|
46
|
+
### "JA3/JA4 Missing"
|
|
47
|
+
|
|
48
|
+
**Cause:** Non-HTTPS traffic, Worker routing traffic, Orange-to-Orange traffic via Worker, or Bot Management skipped
|
|
49
|
+
**Solution:** JA3/JA4 only available for HTTPS/TLS traffic; check request routing
|
|
50
|
+
|
|
51
|
+
**JA3/JA4 Not User-Unique:** Same browser/library version = same fingerprint
|
|
52
|
+
|
|
53
|
+
- Don't use for user identification
|
|
54
|
+
- Use for client profiling only
|
|
55
|
+
- Fingerprints change with browser updates
|
|
56
|
+
|
|
57
|
+
## Bot Verification Methods
|
|
58
|
+
|
|
59
|
+
Cloudflare verifies bots via:
|
|
60
|
+
|
|
61
|
+
1. **Reverse DNS (IP validation):** Traditional method—bot IP resolves to expected domain
|
|
62
|
+
2. **Web Bot Auth:** Modern cryptographic verification—faster propagation
|
|
63
|
+
|
|
64
|
+
When `verifiedBot=true`, bot passed at least one method.
|
|
65
|
+
|
|
66
|
+
**Inactive verified bots:** IPs removed after 24h of no traffic.
|
|
67
|
+
|
|
68
|
+
## Detection Engine Behavior
|
|
69
|
+
|
|
70
|
+
| Engine | Score | Timing | Plan | Notes |
|
|
71
|
+
| --------------------- | ---------- | -------------- | ---------- | ------------------------------- |
|
|
72
|
+
| Heuristics | Always 1 | Immediate | All | Known fingerprints—overrides ML |
|
|
73
|
+
| ML | 1-99 | Immediate | All | Majority of detections |
|
|
74
|
+
| Anomaly Detection | Influences | After baseline | Enterprise | Optional, baseline analysis |
|
|
75
|
+
| JavaScript Detections | Pass/fail | After JS | Pro+ | Headless browser detection |
|
|
76
|
+
| Cloudflare Service | N/A | N/A | Enterprise | Zero Trust internal source |
|
|
77
|
+
|
|
78
|
+
**Priority:** Heuristics > ML—if heuristic matches, score=1 regardless of ML.
|
|
79
|
+
|
|
80
|
+
## Limits
|
|
81
|
+
|
|
82
|
+
| Limit | Value | Notes |
|
|
83
|
+
| ----------------------------- | ----------------------------------------- | ------------------------------------------- |
|
|
84
|
+
| Bot Score = 0 | Means not computed | Not score = 100 |
|
|
85
|
+
| First request JSD data | May not be available | JSD data appears on subsequent requests |
|
|
86
|
+
| Score accuracy | Not 100% guaranteed | False positives/negatives possible |
|
|
87
|
+
| JSD on first HTML page visit | Not supported | Requires subsequent page load |
|
|
88
|
+
| JSD requirements | JavaScript-enabled browser | Won't work with JS disabled or ad blockers |
|
|
89
|
+
| JSD ETag stripping | Strips ETags from HTML responses | May affect caching behavior |
|
|
90
|
+
| JSD CSP compatibility | Requires specific CSP | Not compatible with some CSP configurations |
|
|
91
|
+
| JSD meta CSP tags | Not supported | Must use HTTP headers |
|
|
92
|
+
| JSD WebSocket support | Not supported | WebSocket endpoints won't work with JSD |
|
|
93
|
+
| JSD mobile app support | Native apps won't pass | Only works in browsers |
|
|
94
|
+
| JA3/JA4 traffic type | HTTPS/TLS only | Not available for non-HTTPS traffic |
|
|
95
|
+
| JA3/JA4 Worker routing | Missing for Worker-routed traffic | Check request routing |
|
|
96
|
+
| JA3/JA4 uniqueness | Not unique per user | Shared by clients with same browser/library |
|
|
97
|
+
| JA3/JA4 stability | Can change with updates | Browser/library updates affect fingerprints |
|
|
98
|
+
| WAF custom rules (Free) | 5 | Varies by plan |
|
|
99
|
+
| WAF custom rules (Pro) | 20 | Varies by plan |
|
|
100
|
+
| WAF custom rules (Business) | 100 | Varies by plan |
|
|
101
|
+
| WAF custom rules (Enterprise) | 1,000+ | Varies by plan |
|
|
102
|
+
| Workers CPU time | Varies by plan | Applies to bot logic |
|
|
103
|
+
| Bot Analytics sampling | 1-10% adaptive | High-volume zones sampled more aggressively |
|
|
104
|
+
| Bot Analytics history | 30 days max | Historical data retention limit |
|
|
105
|
+
| CSP requirements for JSD | Must allow `/cdn-cgi/challenge-platform/` | Required for JSD to function |
|
|
106
|
+
|
|
107
|
+
### Plan Restrictions
|
|
108
|
+
|
|
109
|
+
| Feature | Free | Pro/Business | Enterprise |
|
|
110
|
+
| ------------------------- | ------- | ------------ | ---------- |
|
|
111
|
+
| Granular scores (1-99) | No | No | Yes |
|
|
112
|
+
| JA3/JA4 | No | No | Yes |
|
|
113
|
+
| Anomaly Detection | No | No | Yes |
|
|
114
|
+
| Corporate Proxy detection | No | No | Yes |
|
|
115
|
+
| Verified bot categories | Limited | Limited | Full |
|
|
116
|
+
| Custom WAF rules | 5 | 20/100 | 1,000+ |
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# Bot Management Patterns
|
|
2
|
+
|
|
3
|
+
## E-commerce Protection
|
|
4
|
+
|
|
5
|
+
```txt
|
|
6
|
+
# High security for checkout
|
|
7
|
+
(cf.bot_management.score lt 50 and http.request.uri.path in {"/checkout" "/cart/add"} and not cf.bot_management.verified_bot and not cf.bot_management.corporate_proxy)
|
|
8
|
+
Action: Managed Challenge
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## API Protection
|
|
12
|
+
|
|
13
|
+
```txt
|
|
14
|
+
# Protect API with JS detection + score
|
|
15
|
+
(http.request.uri.path matches "^/api/" and (cf.bot_management.score lt 30 or not cf.bot_management.js_detection.passed) and not cf.bot_management.verified_bot)
|
|
16
|
+
Action: Block
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## SEO-Friendly Bot Handling
|
|
20
|
+
|
|
21
|
+
```txt
|
|
22
|
+
# Allow search engine crawlers
|
|
23
|
+
(cf.bot_management.score lt 30 and not cf.verified_bot_category in {"Search Engine Crawler"})
|
|
24
|
+
Action: Managed Challenge
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Block AI Scrapers
|
|
28
|
+
|
|
29
|
+
```txt
|
|
30
|
+
# Block training crawlers only (allow AI assistants/search)
|
|
31
|
+
(cf.verified_bot_category eq "AI Crawler")
|
|
32
|
+
Action: Block
|
|
33
|
+
|
|
34
|
+
# Block all AI-related bots (training + assistants + search)
|
|
35
|
+
(cf.verified_bot_category in {"AI Crawler" "AI Assistant" "AI Search"})
|
|
36
|
+
Action: Block
|
|
37
|
+
|
|
38
|
+
# Allow AI Search, block AI Crawler and AI Assistant
|
|
39
|
+
(cf.verified_bot_category in {"AI Crawler" "AI Assistant"})
|
|
40
|
+
Action: Block
|
|
41
|
+
|
|
42
|
+
# Or use dashboard: Security > Settings > Bot Management > Block AI Bots
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Rate Limiting by Bot Score
|
|
46
|
+
|
|
47
|
+
```txt
|
|
48
|
+
# Stricter limits for suspicious traffic
|
|
49
|
+
(cf.bot_management.score lt 50)
|
|
50
|
+
Rate: 10 requests per 10 seconds
|
|
51
|
+
|
|
52
|
+
(cf.bot_management.score ge 50)
|
|
53
|
+
Rate: 100 requests per 10 seconds
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Mobile App Allowlisting
|
|
57
|
+
|
|
58
|
+
```txt
|
|
59
|
+
# Identify mobile app by JA3/JA4
|
|
60
|
+
(cf.bot_management.ja4 in {"fingerprint1" "fingerprint2"})
|
|
61
|
+
Action: Skip (all remaining rules)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Datacenter Detection
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
import type { IncomingRequestCfProperties } from '@cloudflare/workers-types'
|
|
68
|
+
|
|
69
|
+
// Low score + not corporate proxy = likely datacenter bot
|
|
70
|
+
export default {
|
|
71
|
+
async fetch(request: Request): Promise<Response> {
|
|
72
|
+
const cf = request.cf as IncomingRequestCfProperties | undefined
|
|
73
|
+
const botMgmt = cf?.botManagement
|
|
74
|
+
|
|
75
|
+
if (botMgmt?.score && botMgmt.score < 30 && !botMgmt.corporateProxy && !botMgmt.verifiedBot) {
|
|
76
|
+
return new Response('Datacenter traffic blocked', { status: 403 })
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return fetch(request)
|
|
80
|
+
},
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Conditional Delay (Tarpit)
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
import type { IncomingRequestCfProperties } from '@cloudflare/workers-types'
|
|
88
|
+
|
|
89
|
+
// Add delay proportional to bot suspicion
|
|
90
|
+
export default {
|
|
91
|
+
async fetch(request: Request): Promise<Response> {
|
|
92
|
+
const cf = request.cf as IncomingRequestCfProperties | undefined
|
|
93
|
+
const botMgmt = cf?.botManagement
|
|
94
|
+
|
|
95
|
+
if (botMgmt?.score && botMgmt.score < 50 && !botMgmt.verifiedBot) {
|
|
96
|
+
// Delay: 0-2 seconds for scores 50-0
|
|
97
|
+
const delayMs = Math.max(0, (50 - botMgmt.score) * 40)
|
|
98
|
+
await new Promise((r) => setTimeout(r, delayMs))
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return fetch(request)
|
|
102
|
+
},
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Layered Defense
|
|
107
|
+
|
|
108
|
+
```txt
|
|
109
|
+
1. Bot Management (score-based)
|
|
110
|
+
2. JavaScript Detections (for JS-capable clients)
|
|
111
|
+
3. Rate Limiting (fallback protection)
|
|
112
|
+
4. WAF Managed Rules (OWASP, etc.)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Progressive Enhancement
|
|
116
|
+
|
|
117
|
+
```txt
|
|
118
|
+
Public content: High threshold (score < 10)
|
|
119
|
+
Authenticated: Medium threshold (score < 30)
|
|
120
|
+
Sensitive: Low threshold (score < 50) + JSD
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Zero Trust for Bots
|
|
124
|
+
|
|
125
|
+
```txt
|
|
126
|
+
1. Default deny (all scores < 30)
|
|
127
|
+
2. Allowlist verified bots
|
|
128
|
+
3. Allowlist mobile apps (JA3/JA4)
|
|
129
|
+
4. Allowlist corporate proxies
|
|
130
|
+
5. Allowlist static resources
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Workers: Score + JS Detection
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
import type { IncomingRequestCfProperties } from '@cloudflare/workers-types'
|
|
137
|
+
|
|
138
|
+
export default {
|
|
139
|
+
async fetch(request: Request): Promise<Response> {
|
|
140
|
+
const cf = request.cf as IncomingRequestCfProperties | undefined
|
|
141
|
+
const botMgmt = cf?.botManagement
|
|
142
|
+
const url = new URL(request.url)
|
|
143
|
+
|
|
144
|
+
if (botMgmt?.staticResource) return fetch(request) // Skip static
|
|
145
|
+
|
|
146
|
+
// API endpoints: require JS detection + good score
|
|
147
|
+
if (url.pathname.startsWith('/api/')) {
|
|
148
|
+
const jsDetectionPassed = botMgmt?.jsDetection?.passed ?? false
|
|
149
|
+
const score = botMgmt?.score ?? 100
|
|
150
|
+
|
|
151
|
+
if (!jsDetectionPassed || score < 30) {
|
|
152
|
+
return new Response('Unauthorized', { status: 401 })
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return fetch(request)
|
|
157
|
+
},
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Rate Limiting by JWT Claim + Bot Score
|
|
162
|
+
|
|
163
|
+
```txt
|
|
164
|
+
# Enterprise: Combine bot score with JWT validation
|
|
165
|
+
Rate limiting > Custom rules
|
|
166
|
+
- Field: lookup_json_string(http.request.jwt.claims["{config_id}"][0], "sub")
|
|
167
|
+
- Matches: user ID claim
|
|
168
|
+
- Additional condition: cf.bot_management.score lt 50
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## WAF Integration Points
|
|
172
|
+
|
|
173
|
+
- **WAF Custom Rules**: Primary enforcement mechanism
|
|
174
|
+
- **Rate Limiting Rules**: Bot score as dimension, stricter limits for low scores
|
|
175
|
+
- **Transform Rules**: Pass score to origin via custom header
|
|
176
|
+
- **Workers**: Programmatic bot logic, custom scoring algorithms
|
|
177
|
+
- **Page Rules / Configuration Rules**: Zone-level overrides, path-specific settings
|
|
178
|
+
|
|
179
|
+
## See Also
|
|
180
|
+
|
|
181
|
+
- [gotchas.md](./gotchas.md) - Common errors, false positives/negatives, limitations
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Cloudflare Browser Rendering Skill Reference
|
|
2
|
+
|
|
3
|
+
**Description**: Expert knowledge for Cloudflare Browser Rendering - control headless Chrome on Cloudflare's global network for browser automation, screenshots, PDFs, web scraping, testing, and content generation.
|
|
4
|
+
|
|
5
|
+
**When to use**: Any task involving Cloudflare Browser Rendering including: taking screenshots, generating PDFs, web scraping, browser automation, testing web applications, extracting structured data, capturing page metrics, or automating browser interactions.
|
|
6
|
+
|
|
7
|
+
## Decision Tree
|
|
8
|
+
|
|
9
|
+
### REST API vs Workers Bindings
|
|
10
|
+
|
|
11
|
+
**Use REST API when:**
|
|
12
|
+
|
|
13
|
+
- One-off, stateless tasks (screenshot, PDF, content fetch)
|
|
14
|
+
- No Workers infrastructure yet
|
|
15
|
+
- Simple integrations from external services
|
|
16
|
+
- Need quick prototyping without deployment
|
|
17
|
+
|
|
18
|
+
**Use Workers Bindings when:**
|
|
19
|
+
|
|
20
|
+
- Complex browser automation workflows
|
|
21
|
+
- Need session reuse for performance
|
|
22
|
+
- Multiple page interactions per request
|
|
23
|
+
- Custom scripting and logic required
|
|
24
|
+
- Building production applications
|
|
25
|
+
|
|
26
|
+
### Puppeteer vs Playwright
|
|
27
|
+
|
|
28
|
+
| Feature | Puppeteer | Playwright |
|
|
29
|
+
| -------------- | ---------------------------- | ------------------------- |
|
|
30
|
+
| API Style | Chrome DevTools Protocol | High-level abstractions |
|
|
31
|
+
| Selectors | CSS, XPath | CSS, text, role, test-id |
|
|
32
|
+
| Best for | Advanced control, CDP access | Quick automation, testing |
|
|
33
|
+
| Learning curve | Steeper | Gentler |
|
|
34
|
+
|
|
35
|
+
**Use Puppeteer:** Need CDP protocol access, Chrome-specific features, migration from existing Puppeteer code
|
|
36
|
+
**Use Playwright:** Modern selector APIs, cross-browser patterns, faster development
|
|
37
|
+
|
|
38
|
+
## Tier Limits Summary
|
|
39
|
+
|
|
40
|
+
| Limit | Free Tier | Paid Tier |
|
|
41
|
+
| ------------------- | ---------- | ----------- |
|
|
42
|
+
| Daily browser time | 10 minutes | Unlimited\* |
|
|
43
|
+
| Concurrent sessions | 3 | 30 |
|
|
44
|
+
| Requests per minute | 6 | 180 |
|
|
45
|
+
|
|
46
|
+
\*Subject to fair-use policy. See [gotchas.md](gotchas.md) for details.
|
|
47
|
+
|
|
48
|
+
## Reading Order
|
|
49
|
+
|
|
50
|
+
**New to Browser Rendering:**
|
|
51
|
+
|
|
52
|
+
1. [configuration.md](configuration.md) - Setup and deployment
|
|
53
|
+
2. [patterns.md](patterns.md) - Common use cases with examples
|
|
54
|
+
3. [api.md](api.md) - API reference
|
|
55
|
+
4. [gotchas.md](gotchas.md) - Avoid common pitfalls
|
|
56
|
+
|
|
57
|
+
**Specific task:**
|
|
58
|
+
|
|
59
|
+
- **Setup/deployment** → [configuration.md](configuration.md)
|
|
60
|
+
- **API reference/endpoints** → [api.md](api.md)
|
|
61
|
+
- **Example code/patterns** → [patterns.md](patterns.md)
|
|
62
|
+
- **Debugging/troubleshooting** → [gotchas.md](gotchas.md)
|
|
63
|
+
|
|
64
|
+
**REST API users:**
|
|
65
|
+
|
|
66
|
+
- Start with [api.md](api.md) REST API section
|
|
67
|
+
- Check [gotchas.md](gotchas.md) for rate limits
|
|
68
|
+
|
|
69
|
+
**Workers users:**
|
|
70
|
+
|
|
71
|
+
- Start with [configuration.md](configuration.md)
|
|
72
|
+
- Review [patterns.md](patterns.md) for session management
|
|
73
|
+
- Reference [api.md](api.md) for Workers Bindings
|
|
74
|
+
|
|
75
|
+
## In This Reference
|
|
76
|
+
|
|
77
|
+
- **[configuration.md](configuration.md)** - Setup, deployment, wrangler config, compatibility
|
|
78
|
+
- **[api.md](api.md)** - REST API endpoints + Workers Bindings (Puppeteer/Playwright)
|
|
79
|
+
- **[patterns.md](patterns.md)** - Common patterns, use cases, real examples
|
|
80
|
+
- **[gotchas.md](gotchas.md)** - Troubleshooting, best practices, tier limits, common errors
|
|
81
|
+
|
|
82
|
+
## See Also
|
|
83
|
+
|
|
84
|
+
- [Cloudflare Docs](https://developers.cloudflare.com/browser-rendering/)
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Browser Rendering API
|
|
2
|
+
|
|
3
|
+
## REST API
|
|
4
|
+
|
|
5
|
+
**Base:** `https://api.cloudflare.com/client/v4/accounts/{accountId}/browser-rendering`
|
|
6
|
+
**Auth:** `Authorization: Bearer <token>` (Browser Rendering - Edit permission)
|
|
7
|
+
|
|
8
|
+
### Endpoints
|
|
9
|
+
|
|
10
|
+
| Endpoint | Description | Key Options |
|
|
11
|
+
| ------------- | ------------------------ | ------------------------------------------- |
|
|
12
|
+
| `/content` | Get rendered HTML | `url`, `waitUntil` |
|
|
13
|
+
| `/screenshot` | Capture image | `screenshotOptions: {type, fullPage, clip}` |
|
|
14
|
+
| `/pdf` | Generate PDF | `pdfOptions: {format, landscape, margin}` |
|
|
15
|
+
| `/snapshot` | HTML + inlined resources | `url` |
|
|
16
|
+
| `/scrape` | Extract by selectors | `selectors: ["h1", ".price"]` |
|
|
17
|
+
| `/json` | AI-structured extraction | `schema: {name: "string", price: "number"}` |
|
|
18
|
+
| `/links` | Get all links | `url` |
|
|
19
|
+
| `/markdown` | Convert to markdown | `url` |
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
curl -X POST '.../browser-rendering/screenshot' \
|
|
23
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
24
|
+
-d '{"url":"https://example.com","screenshotOptions":{"fullPage":true}}'
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Workers Binding
|
|
28
|
+
|
|
29
|
+
```jsonc
|
|
30
|
+
// wrangler.jsonc
|
|
31
|
+
{ "browser": { "binding": "MYBROWSER" } }
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Puppeteer
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import puppeteer from '@cloudflare/puppeteer'
|
|
38
|
+
|
|
39
|
+
const browser = await puppeteer.launch(env.MYBROWSER, { keep_alive: 600000 })
|
|
40
|
+
const page = await browser.newPage()
|
|
41
|
+
await page.goto('https://example.com', { waitUntil: 'networkidle0' })
|
|
42
|
+
|
|
43
|
+
// Content
|
|
44
|
+
const html = await page.content()
|
|
45
|
+
const title = await page.title()
|
|
46
|
+
|
|
47
|
+
// Screenshot/PDF
|
|
48
|
+
await page.screenshot({ fullPage: true, type: 'png' })
|
|
49
|
+
await page.pdf({ format: 'A4', printBackground: true })
|
|
50
|
+
|
|
51
|
+
// Interaction
|
|
52
|
+
await page.click('#button')
|
|
53
|
+
await page.type('#input', 'text')
|
|
54
|
+
await page.evaluate(() => document.querySelector('h1')?.textContent)
|
|
55
|
+
|
|
56
|
+
// Session management
|
|
57
|
+
const sessions = await puppeteer.sessions(env.MYBROWSER)
|
|
58
|
+
const limits = await puppeteer.limits(env.MYBROWSER)
|
|
59
|
+
|
|
60
|
+
await browser.close()
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Playwright
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
import { launch, connect } from '@cloudflare/playwright'
|
|
67
|
+
|
|
68
|
+
const browser = await launch(env.MYBROWSER, { keep_alive: 600000 })
|
|
69
|
+
const page = await browser.newPage()
|
|
70
|
+
|
|
71
|
+
await page.goto('https://example.com', { waitUntil: 'networkidle' })
|
|
72
|
+
|
|
73
|
+
// Modern selectors
|
|
74
|
+
await page.locator('.button').click()
|
|
75
|
+
await page.getByText('Submit').click()
|
|
76
|
+
await page.getByTestId('search').fill('query')
|
|
77
|
+
|
|
78
|
+
// Context for isolation
|
|
79
|
+
const context = await browser.newContext({
|
|
80
|
+
viewport: { width: 1920, height: 1080 },
|
|
81
|
+
userAgent: 'custom',
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
await browser.close()
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Session Management
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
// List sessions
|
|
91
|
+
await puppeteer.sessions(env.MYBROWSER)
|
|
92
|
+
|
|
93
|
+
// Connect to existing
|
|
94
|
+
await puppeteer.connect(env.MYBROWSER, sessionId)
|
|
95
|
+
|
|
96
|
+
// Check limits
|
|
97
|
+
await puppeteer.limits(env.MYBROWSER)
|
|
98
|
+
// { remaining: ms, total: ms, concurrent: n }
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Key Options
|
|
102
|
+
|
|
103
|
+
| Option | Values |
|
|
104
|
+
| ----------------- | ---------------------------------------------------------- |
|
|
105
|
+
| `waitUntil` | `load`, `domcontentloaded`, `networkidle0`, `networkidle2` |
|
|
106
|
+
| `keep_alive` | Max 600000ms (10 min) |
|
|
107
|
+
| `screenshot.type` | `png`, `jpeg` |
|
|
108
|
+
| `pdf.format` | `A4`, `Letter`, `Legal` |
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Configuration & Setup
|
|
2
|
+
|
|
3
|
+
## Installation
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm install @cloudflare/puppeteer # or @cloudflare/playwright
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
**Use Cloudflare packages** - standard `puppeteer`/`playwright` won't work in Workers.
|
|
10
|
+
|
|
11
|
+
## wrangler.json
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{
|
|
15
|
+
"name": "browser-worker",
|
|
16
|
+
"main": "src/index.ts",
|
|
17
|
+
"compatibility_date": "2025-01-01",
|
|
18
|
+
"compatibility_flags": ["nodejs_compat"],
|
|
19
|
+
"browser": {
|
|
20
|
+
"binding": "MYBROWSER"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Required:** `nodejs_compat` flag and `browser.binding`.
|
|
26
|
+
|
|
27
|
+
## TypeScript
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
interface Env {
|
|
31
|
+
MYBROWSER: Fetcher
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export default {
|
|
35
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
36
|
+
// ...
|
|
37
|
+
},
|
|
38
|
+
} satisfies ExportedHandler<Env>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Development
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
wrangler dev --remote # --remote required for browser binding
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Local mode does NOT support Browser Rendering** - must use `--remote`.
|
|
48
|
+
|
|
49
|
+
## REST API
|
|
50
|
+
|
|
51
|
+
No wrangler config needed. Get API token with "Browser Rendering - Edit" permission.
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
curl -X POST \
|
|
55
|
+
'https://api.cloudflare.com/client/v4/accounts/{accountId}/browser-rendering/screenshot' \
|
|
56
|
+
-H 'Authorization: Bearer TOKEN' \
|
|
57
|
+
-d '{"url": "https://example.com"}' --output screenshot.png
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Requirements
|
|
61
|
+
|
|
62
|
+
| Requirement | Value |
|
|
63
|
+
| --------------------- | --------------------------------- |
|
|
64
|
+
| Node.js compatibility | `nodejs_compat` flag |
|
|
65
|
+
| Compatibility date | 2023-03-01+ |
|
|
66
|
+
| Module format | ES modules only |
|
|
67
|
+
| Browser | Chromium 119+ (no Firefox/Safari) |
|
|
68
|
+
|
|
69
|
+
**Not supported:** WebGL, WebRTC, extensions, `file://` protocol, Service Worker syntax.
|
|
70
|
+
|
|
71
|
+
## Troubleshooting
|
|
72
|
+
|
|
73
|
+
| Error | Solution |
|
|
74
|
+
| --------------------------------- | ----------------------------------- |
|
|
75
|
+
| `MYBROWSER is undefined` | Use `wrangler dev --remote` |
|
|
76
|
+
| `nodejs_compat not enabled` | Add to `compatibility_flags` |
|
|
77
|
+
| `Module not found` | `npm install @cloudflare/puppeteer` |
|
|
78
|
+
| `Browser Rendering not available` | Enable in dashboard |
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Browser Rendering Gotchas
|
|
2
|
+
|
|
3
|
+
## Tier Limits
|
|
4
|
+
|
|
5
|
+
| Limit | Free | Paid |
|
|
6
|
+
| ------------------- | ---------- | ----------- |
|
|
7
|
+
| Daily browser time | 10 min | Unlimited\* |
|
|
8
|
+
| Concurrent sessions | 3 | 30 |
|
|
9
|
+
| Requests/minute | 6 | 180 |
|
|
10
|
+
| Session keep-alive | 10 min max | 10 min max |
|
|
11
|
+
|
|
12
|
+
\*Subject to fair-use policy.
|
|
13
|
+
|
|
14
|
+
**Check quota:**
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
const limits = await puppeteer.limits(env.MYBROWSER)
|
|
18
|
+
// { remaining: 540000, total: 600000, concurrent: 2 }
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Always Close Browsers
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
const browser = await puppeteer.launch(env.MYBROWSER)
|
|
25
|
+
try {
|
|
26
|
+
const page = await browser.newPage()
|
|
27
|
+
await page.goto('https://example.com')
|
|
28
|
+
return new Response(await page.content())
|
|
29
|
+
} finally {
|
|
30
|
+
await browser.close() // ALWAYS in finally
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**Workers vs REST:** REST auto-closes after timeout. Workers must call `close()` or session stays open until `keep_alive` expires.
|
|
35
|
+
|
|
36
|
+
## Optimize Concurrency
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
// ❌ 3 sessions (hits free tier limit)
|
|
40
|
+
const browser1 = await puppeteer.launch(env.MYBROWSER)
|
|
41
|
+
const browser2 = await puppeteer.launch(env.MYBROWSER)
|
|
42
|
+
|
|
43
|
+
// ✅ 1 session, multiple pages
|
|
44
|
+
const browser = await puppeteer.launch(env.MYBROWSER)
|
|
45
|
+
const page1 = await browser.newPage()
|
|
46
|
+
const page2 = await browser.newPage()
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Common Errors
|
|
50
|
+
|
|
51
|
+
| Error | Cause | Fix |
|
|
52
|
+
| ----------------------------- | --------------------------------------- | --------------------------------------------- |
|
|
53
|
+
| Session limit exceeded | Too many concurrent | Close unused browsers, use pages not browsers |
|
|
54
|
+
| Page navigation timeout | Slow page or `networkidle` on busy page | Increase timeout, use `waitUntil: "load"` |
|
|
55
|
+
| Session not found | Expired session | Catch error, launch new session |
|
|
56
|
+
| Evaluation failed | DOM element missing | Use `?.` optional chaining |
|
|
57
|
+
| Protocol error: Target closed | Page closed during operation | Await all ops before closing |
|
|
58
|
+
|
|
59
|
+
## page.evaluate() Gotchas
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
// ❌ Outer scope not available
|
|
63
|
+
const selector = 'h1'
|
|
64
|
+
await page.evaluate(() => document.querySelector(selector))
|
|
65
|
+
|
|
66
|
+
// ✅ Pass as argument
|
|
67
|
+
await page.evaluate((sel) => document.querySelector(sel)?.textContent, selector)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Performance
|
|
71
|
+
|
|
72
|
+
**waitUntil options (fastest to slowest):**
|
|
73
|
+
|
|
74
|
+
1. `domcontentloaded` - DOM ready
|
|
75
|
+
2. `load` - load event (default)
|
|
76
|
+
3. `networkidle0` - no network for 500ms
|
|
77
|
+
|
|
78
|
+
**Block unnecessary resources:**
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
await page.setRequestInterception(true)
|
|
82
|
+
page.on('request', (req) => {
|
|
83
|
+
if (['image', 'stylesheet', 'font'].includes(req.resourceType())) {
|
|
84
|
+
req.abort()
|
|
85
|
+
} else {
|
|
86
|
+
req.continue()
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Session reuse:** Cold start ~1-2s, warm connect ~100-200ms. Store sessionId in KV for reuse.
|