@trieungoctam/vibekit 1.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/LICENSE +21 -0
- package/README.md +85 -0
- package/agents/debugger.md +158 -0
- package/agents/docs-manager.md +220 -0
- package/agents/planner.md +129 -0
- package/agents/researcher.md +58 -0
- package/agents/reviewer.md +152 -0
- package/agents/tester.md +126 -0
- package/bin/vibekit.js +18 -0
- package/hooks/lib/ck-config-utils.cjs +831 -0
- package/hooks/lib/colors.cjs +95 -0
- package/hooks/lib/config-counter.cjs +103 -0
- package/hooks/lib/context-builder.cjs +616 -0
- package/hooks/lib/git-info-cache.cjs +143 -0
- package/hooks/lib/hook-logger.cjs +92 -0
- package/hooks/lib/privacy-checker.cjs +297 -0
- package/hooks/lib/project-detector.cjs +474 -0
- package/hooks/lib/scout-checker.cjs +263 -0
- package/hooks/lib/transcript-parser.cjs +181 -0
- package/hooks/post-edit-simplify-reminder.cjs +156 -0
- package/hooks/privacy-block.cjs +166 -0
- package/hooks/scout-block.cjs +147 -0
- package/hooks/session-init.cjs +360 -0
- package/package.json +41 -0
- package/rules/development-rules.md +52 -0
- package/rules/documentation-management.md +121 -0
- package/rules/orchestration-protocol.md +43 -0
- package/rules/primary-workflow.md +57 -0
- package/rules/team-coordination-rules.md +90 -0
- package/skills/ai/agent-browser/SKILL.md +294 -0
- package/skills/ai/agent-browser/references/.gitkeep +0 -0
- package/skills/ai/agent-browser/references/agent-browser-vs-chrome-devtools.md +112 -0
- package/skills/ai/agent-browser/references/browserbase-cloud-setup.md +161 -0
- package/skills/ai/ai-artist/SKILL.md +122 -0
- package/skills/ai/ai-artist/data/awesome-prompts.csv +3592 -0
- package/skills/ai/ai-artist/data/lighting.csv +19 -0
- package/skills/ai/ai-artist/data/nano-banana-templates.csv +17 -0
- package/skills/ai/ai-artist/data/platforms.csv +11 -0
- package/skills/ai/ai-artist/data/styles.csv +26 -0
- package/skills/ai/ai-artist/data/techniques.csv +19 -0
- package/skills/ai/ai-artist/data/use-cases.csv +16 -0
- package/skills/ai/ai-artist/references/advanced-techniques.md +184 -0
- package/skills/ai/ai-artist/references/awesome-nano-banana-pro-prompts.md +8575 -0
- package/skills/ai/ai-artist/references/domain-code.md +66 -0
- package/skills/ai/ai-artist/references/domain-data.md +72 -0
- package/skills/ai/ai-artist/references/domain-marketing.md +66 -0
- package/skills/ai/ai-artist/references/domain-patterns.md +33 -0
- package/skills/ai/ai-artist/references/domain-writing.md +68 -0
- package/skills/ai/ai-artist/references/image-prompting.md +141 -0
- package/skills/ai/ai-artist/references/llm-prompting.md +165 -0
- package/skills/ai/ai-artist/references/nano-banana.md +136 -0
- package/skills/ai/ai-artist/references/reasoning-techniques.md +201 -0
- package/skills/ai/ai-artist/references/validation-workflow.md +117 -0
- package/skills/ai/ai-artist/scripts/core.py +197 -0
- package/skills/ai/ai-artist/scripts/extract_prompts.py +102 -0
- package/skills/ai/ai-artist/scripts/generate.py +370 -0
- package/skills/ai/ai-artist/scripts/search.py +147 -0
- package/skills/ai/ai-multimodal/.env.example +204 -0
- package/skills/ai/ai-multimodal/SKILL.md +110 -0
- package/skills/ai/ai-multimodal/references/audio-processing.md +387 -0
- package/skills/ai/ai-multimodal/references/image-generation.md +939 -0
- package/skills/ai/ai-multimodal/references/music-generation.md +311 -0
- package/skills/ai/ai-multimodal/references/video-analysis.md +515 -0
- package/skills/ai/ai-multimodal/references/video-generation.md +457 -0
- package/skills/ai/ai-multimodal/references/vision-understanding.md +492 -0
- package/skills/ai/ai-multimodal/scripts/.coverage +0 -0
- package/skills/ai/ai-multimodal/scripts/check_setup.py +315 -0
- package/skills/ai/ai-multimodal/scripts/document_converter.py +395 -0
- package/skills/ai/ai-multimodal/scripts/gemini_batch_process.py +1185 -0
- package/skills/ai/ai-multimodal/scripts/media_optimizer.py +506 -0
- package/skills/ai/ai-multimodal/scripts/requirements.txt +26 -0
- package/skills/ai/ai-multimodal/scripts/tests/.coverage +0 -0
- package/skills/ai/ai-multimodal/scripts/tests/requirements.txt +20 -0
- package/skills/ai/ai-multimodal/scripts/tests/test_document_converter.py +74 -0
- package/skills/ai/ai-multimodal/scripts/tests/test_gemini_batch_process.py +362 -0
- package/skills/ai/ai-multimodal/scripts/tests/test_media_optimizer.py +373 -0
- package/skills/ai/mcp-management/README.md +219 -0
- package/skills/ai/mcp-management/SKILL.md +210 -0
- package/skills/ai/mcp-management/assets/tools.json +3146 -0
- package/skills/ai/mcp-management/references/configuration.md +114 -0
- package/skills/ai/mcp-management/references/gemini-cli-integration.md +221 -0
- package/skills/ai/mcp-management/references/mcp-protocol.md +116 -0
- package/skills/ai/mcp-management/scripts/.env.example +10 -0
- package/skills/ai/mcp-management/scripts/cli.ts +195 -0
- package/skills/ai/mcp-management/scripts/dist/analyze-tools.js +70 -0
- package/skills/ai/mcp-management/scripts/dist/cli.js +160 -0
- package/skills/ai/mcp-management/scripts/dist/mcp-client.js +183 -0
- package/skills/ai/mcp-management/scripts/mcp-client.ts +230 -0
- package/skills/ai/mcp-management/scripts/package.json +20 -0
- package/skills/ai/mcp-management/scripts/tsconfig.json +15 -0
- package/skills/core/brainstorm/SKILL.md +164 -0
- package/skills/core/brainstorm/scripts/frame-template.html +214 -0
- package/skills/core/brainstorm/scripts/helper.js +88 -0
- package/skills/core/brainstorm/scripts/server.cjs +338 -0
- package/skills/core/brainstorm/scripts/start-server.sh +153 -0
- package/skills/core/brainstorm/scripts/stop-server.sh +55 -0
- package/skills/core/brainstorm/spec-document-reviewer-prompt.md +49 -0
- package/skills/core/brainstorm/visual-companion.md +286 -0
- package/skills/core/code-review/SKILL.md +147 -0
- package/skills/core/code-review/references/code-review-reception.md +113 -0
- package/skills/core/code-review/references/codebase-scan-workflow.md +29 -0
- package/skills/core/code-review/references/edge-case-scouting.md +119 -0
- package/skills/core/code-review/references/parallel-review-workflow.md +69 -0
- package/skills/core/code-review/references/requesting-code-review.md +116 -0
- package/skills/core/code-review/references/task-management-reviews.md +140 -0
- package/skills/core/code-review/references/verification-before-completion.md +139 -0
- package/skills/core/cook/README.md +86 -0
- package/skills/core/cook/SKILL.md +113 -0
- package/skills/core/cook/references/intent-detection.md +101 -0
- package/skills/core/cook/references/review-cycle.md +75 -0
- package/skills/core/cook/references/subagent-patterns.md +75 -0
- package/skills/core/cook/references/workflow-steps.md +172 -0
- package/skills/core/debug/SKILL.md +121 -0
- package/skills/core/debug/references/defense-in-depth.md +124 -0
- package/skills/core/debug/references/frontend-verification.md +103 -0
- package/skills/core/debug/references/investigation-methodology.md +101 -0
- package/skills/core/debug/references/log-and-ci-analysis.md +97 -0
- package/skills/core/debug/references/performance-diagnostics.md +113 -0
- package/skills/core/debug/references/reporting-standards.md +122 -0
- package/skills/core/debug/references/root-cause-tracing.md +122 -0
- package/skills/core/debug/references/systematic-debugging.md +102 -0
- package/skills/core/debug/references/task-management-debugging.md +155 -0
- package/skills/core/debug/references/verification.md +123 -0
- package/skills/core/debug/scripts/find-polluter.sh +63 -0
- package/skills/core/debug/scripts/find-polluter.test.md +102 -0
- package/skills/core/execute/SKILL.md +70 -0
- package/skills/core/fix/SKILL.md +111 -0
- package/skills/core/fix/references/complexity-assessment.md +72 -0
- package/skills/core/fix/references/mode-selection.md +46 -0
- package/skills/core/fix/references/parallel-exploration.md +100 -0
- package/skills/core/fix/references/review-cycle.md +77 -0
- package/skills/core/fix/references/skill-activation-matrix.md +78 -0
- package/skills/core/fix/references/task-orchestration.md +103 -0
- package/skills/core/fix/references/workflow-ci.md +28 -0
- package/skills/core/fix/references/workflow-deep.md +122 -0
- package/skills/core/fix/references/workflow-logs.md +72 -0
- package/skills/core/fix/references/workflow-quick.md +59 -0
- package/skills/core/fix/references/workflow-standard.md +111 -0
- package/skills/core/fix/references/workflow-test.md +75 -0
- package/skills/core/fix/references/workflow-types.md +33 -0
- package/skills/core/fix/references/workflow-ui.md +75 -0
- package/skills/core/plan/SKILL.md +145 -0
- package/skills/core/plan/plan-document-reviewer-prompt.md +49 -0
- package/skills/core/subagent-dev/SKILL.md +277 -0
- package/skills/core/subagent-dev/code-quality-reviewer-prompt.md +26 -0
- package/skills/core/subagent-dev/implementer-prompt.md +113 -0
- package/skills/core/subagent-dev/spec-reviewer-prompt.md +61 -0
- package/skills/core/tdd/SKILL.md +371 -0
- package/skills/core/tdd/testing-anti-patterns.md +299 -0
- package/skills/core/test/SKILL.md +109 -0
- package/skills/core/test/references/report-format.md +58 -0
- package/skills/core/test/references/test-execution-workflow.md +103 -0
- package/skills/core/test/references/ui-testing-workflow.md +65 -0
- package/skills/core/verify/SKILL.md +139 -0
- package/skills/dev/backend-dev/SKILL.md +96 -0
- package/skills/dev/backend-dev/references/backend-api-design.md +495 -0
- package/skills/dev/backend-dev/references/backend-architecture.md +454 -0
- package/skills/dev/backend-dev/references/backend-authentication.md +338 -0
- package/skills/dev/backend-dev/references/backend-code-quality.md +659 -0
- package/skills/dev/backend-dev/references/backend-debugging.md +904 -0
- package/skills/dev/backend-dev/references/backend-devops.md +494 -0
- package/skills/dev/backend-dev/references/backend-mindset.md +387 -0
- package/skills/dev/backend-dev/references/backend-performance.md +397 -0
- package/skills/dev/backend-dev/references/backend-security.md +290 -0
- package/skills/dev/backend-dev/references/backend-technologies.md +256 -0
- package/skills/dev/backend-dev/references/backend-testing.md +429 -0
- package/skills/dev/context-engineering/SKILL.md +108 -0
- package/skills/dev/context-engineering/references/context-compression.md +84 -0
- package/skills/dev/context-engineering/references/context-degradation.md +93 -0
- package/skills/dev/context-engineering/references/context-fundamentals.md +75 -0
- package/skills/dev/context-engineering/references/context-optimization.md +82 -0
- package/skills/dev/context-engineering/references/evaluation.md +89 -0
- package/skills/dev/context-engineering/references/memory-systems.md +88 -0
- package/skills/dev/context-engineering/references/multi-agent-patterns.md +90 -0
- package/skills/dev/context-engineering/references/project-development.md +97 -0
- package/skills/dev/context-engineering/references/runtime-awareness.md +202 -0
- package/skills/dev/context-engineering/references/tool-design.md +86 -0
- package/skills/dev/context-engineering/scripts/compression_evaluator.py +349 -0
- package/skills/dev/context-engineering/scripts/context_analyzer.py +317 -0
- package/skills/dev/context-engineering/scripts/tests/test_edge_cases.py +246 -0
- package/skills/dev/databases/SKILL.md +84 -0
- package/skills/dev/databases/analytics.md +198 -0
- package/skills/dev/databases/db-design.md +188 -0
- package/skills/dev/databases/incremental-etl.md +213 -0
- package/skills/dev/databases/references/mongodb-aggregation.md +447 -0
- package/skills/dev/databases/references/mongodb-atlas.md +465 -0
- package/skills/dev/databases/references/mongodb-crud.md +408 -0
- package/skills/dev/databases/references/mongodb-indexing.md +442 -0
- package/skills/dev/databases/references/postgresql-administration.md +594 -0
- package/skills/dev/databases/references/postgresql-performance.md +527 -0
- package/skills/dev/databases/references/postgresql-psql-cli.md +467 -0
- package/skills/dev/databases/references/postgresql-queries.md +475 -0
- package/skills/dev/databases/scripts/.coverage +0 -0
- package/skills/dev/databases/scripts/db_backup.py +502 -0
- package/skills/dev/databases/scripts/db_migrate.py +426 -0
- package/skills/dev/databases/scripts/db_performance_check.py +457 -0
- package/skills/dev/databases/scripts/requirements.txt +20 -0
- package/skills/dev/databases/scripts/tests/coverage-db.json +1 -0
- package/skills/dev/databases/scripts/tests/requirements.txt +4 -0
- package/skills/dev/databases/scripts/tests/test_db_backup.py +340 -0
- package/skills/dev/databases/scripts/tests/test_db_migrate.py +277 -0
- package/skills/dev/databases/scripts/tests/test_db_performance_check.py +370 -0
- package/skills/dev/databases/stacks/bigquery.md +231 -0
- package/skills/dev/databases/stacks/d1_cloudflare.md +137 -0
- package/skills/dev/databases/stacks/mysql.md +216 -0
- package/skills/dev/databases/stacks/postgres.md +235 -0
- package/skills/dev/databases/stacks/sqlite.md +244 -0
- package/skills/dev/databases/transactional.md +176 -0
- package/skills/dev/devops/.env.example +76 -0
- package/skills/dev/devops/SKILL.md +97 -0
- package/skills/dev/devops/references/browser-rendering.md +305 -0
- package/skills/dev/devops/references/cloudflare-d1-kv.md +123 -0
- package/skills/dev/devops/references/cloudflare-platform.md +271 -0
- package/skills/dev/devops/references/cloudflare-r2-storage.md +280 -0
- package/skills/dev/devops/references/cloudflare-workers-advanced.md +312 -0
- package/skills/dev/devops/references/cloudflare-workers-apis.md +309 -0
- package/skills/dev/devops/references/cloudflare-workers-basics.md +418 -0
- package/skills/dev/devops/references/docker-basics.md +297 -0
- package/skills/dev/devops/references/docker-compose.md +292 -0
- package/skills/dev/devops/references/gcloud-platform.md +297 -0
- package/skills/dev/devops/references/gcloud-services.md +304 -0
- package/skills/dev/devops/references/kubernetes-basics.md +99 -0
- package/skills/dev/devops/references/kubernetes-helm-advanced.md +75 -0
- package/skills/dev/devops/references/kubernetes-helm.md +81 -0
- package/skills/dev/devops/references/kubernetes-kubectl.md +74 -0
- package/skills/dev/devops/references/kubernetes-security-advanced.md +98 -0
- package/skills/dev/devops/references/kubernetes-security.md +95 -0
- package/skills/dev/devops/references/kubernetes-troubleshooting-advanced.md +74 -0
- package/skills/dev/devops/references/kubernetes-troubleshooting.md +49 -0
- package/skills/dev/devops/references/kubernetes-workflows-advanced.md +75 -0
- package/skills/dev/devops/references/kubernetes-workflows.md +78 -0
- package/skills/dev/devops/scripts/cloudflare_deploy.py +269 -0
- package/skills/dev/devops/scripts/docker_optimize.py +332 -0
- package/skills/dev/devops/scripts/requirements.txt +20 -0
- package/skills/dev/devops/scripts/tests/requirements.txt +3 -0
- package/skills/dev/devops/scripts/tests/test_cloudflare_deploy.py +285 -0
- package/skills/dev/devops/scripts/tests/test_docker_optimize.py +436 -0
- package/skills/dev/frontend-design/SKILL.md +78 -0
- package/skills/dev/frontend-design/references/ai-multimodal-overview.md +165 -0
- package/skills/dev/frontend-design/references/analysis-best-practices.md +80 -0
- package/skills/dev/frontend-design/references/analysis-prompts.md +141 -0
- package/skills/dev/frontend-design/references/analysis-techniques.md +118 -0
- package/skills/dev/frontend-design/references/animejs.md +396 -0
- package/skills/dev/frontend-design/references/asset-generation.md +337 -0
- package/skills/dev/frontend-design/references/design-extraction-overview.md +71 -0
- package/skills/dev/frontend-design/references/extraction-best-practices.md +141 -0
- package/skills/dev/frontend-design/references/extraction-output-templates.md +162 -0
- package/skills/dev/frontend-design/references/extraction-prompts.md +127 -0
- package/skills/dev/frontend-design/references/technical-accessibility.md +119 -0
- package/skills/dev/frontend-design/references/technical-best-practices.md +97 -0
- package/skills/dev/frontend-design/references/technical-optimization.md +44 -0
- package/skills/dev/frontend-design/references/technical-overview.md +90 -0
- package/skills/dev/frontend-design/references/technical-workflows.md +150 -0
- package/skills/dev/frontend-design/references/visual-analysis-overview.md +95 -0
- package/skills/dev/frontend-design/references/workflow-3d.md +102 -0
- package/skills/dev/frontend-design/references/workflow-describe.md +87 -0
- package/skills/dev/frontend-design/references/workflow-immersive.md +87 -0
- package/skills/dev/frontend-design/references/workflow-quick.md +57 -0
- package/skills/dev/frontend-design/references/workflow-screenshot.md +63 -0
- package/skills/dev/frontend-design/references/workflow-video.md +74 -0
- package/skills/dev/frontend-dev/SKILL.md +400 -0
- package/skills/dev/frontend-dev/resources/common-patterns.md +331 -0
- package/skills/dev/frontend-dev/resources/complete-examples.md +872 -0
- package/skills/dev/frontend-dev/resources/component-patterns.md +502 -0
- package/skills/dev/frontend-dev/resources/data-fetching.md +767 -0
- package/skills/dev/frontend-dev/resources/file-organization.md +502 -0
- package/skills/dev/frontend-dev/resources/loading-and-error-states.md +501 -0
- package/skills/dev/frontend-dev/resources/performance.md +406 -0
- package/skills/dev/frontend-dev/resources/routing-guide.md +364 -0
- package/skills/dev/frontend-dev/resources/styling-guide.md +428 -0
- package/skills/dev/frontend-dev/resources/typescript-standards.md +418 -0
- package/skills/dev/git/SKILL.md +114 -0
- package/skills/dev/git/references/branch-management.md +88 -0
- package/skills/dev/git/references/commit-standards.md +46 -0
- package/skills/dev/git/references/gh-cli-guide.md +109 -0
- package/skills/dev/git/references/safety-protocols.md +69 -0
- package/skills/dev/git/references/workflow-commit.md +58 -0
- package/skills/dev/git/references/workflow-merge.md +48 -0
- package/skills/dev/git/references/workflow-pr.md +58 -0
- package/skills/dev/git/references/workflow-push.md +52 -0
- package/skills/dev/git-worktree/SKILL.md +218 -0
- package/skills/utils/ask/SKILL.md +58 -0
- package/skills/utils/bootstrap/SKILL.md +101 -0
- package/skills/utils/bootstrap/references/shared-phases.md +59 -0
- package/skills/utils/bootstrap/references/workflow-auto.md +52 -0
- package/skills/utils/bootstrap/references/workflow-fast.md +50 -0
- package/skills/utils/bootstrap/references/workflow-full.md +60 -0
- package/skills/utils/bootstrap/references/workflow-parallel.md +59 -0
- package/skills/utils/ck-help/SKILL.md +102 -0
- package/skills/utils/ck-help/scripts/ck-help.py +1321 -0
- package/skills/utils/ck-help/scripts/commands_data.yaml +3 -0
- package/skills/utils/ck-help/scripts/skills_data.yaml +593 -0
- package/skills/utils/copywriting/SKILL.md +94 -0
- package/skills/utils/copywriting/references/copy-formulas.md +150 -0
- package/skills/utils/copywriting/references/cta-patterns.md +168 -0
- package/skills/utils/copywriting/references/email-copy.md +193 -0
- package/skills/utils/copywriting/references/headline-templates.md +140 -0
- package/skills/utils/copywriting/references/landing-page-copy.md +175 -0
- package/skills/utils/copywriting/references/power-words.md +189 -0
- package/skills/utils/copywriting/references/social-media-copy.md +222 -0
- package/skills/utils/copywriting/references/workflow-cro.md +83 -0
- package/skills/utils/copywriting/references/workflow-enhance.md +32 -0
- package/skills/utils/copywriting/references/workflow-fast.md +29 -0
- package/skills/utils/copywriting/references/workflow-good.md +39 -0
- package/skills/utils/copywriting/references/writing-styles.md +247 -0
- package/skills/utils/copywriting/scripts/extract-writing-styles.py +308 -0
- package/skills/utils/copywriting/templates/copy-brief.md +49 -0
- package/skills/utils/docs/SKILL.md +55 -0
- package/skills/utils/docs/references/init-workflow.md +32 -0
- package/skills/utils/docs/references/summarize-workflow.md +18 -0
- package/skills/utils/docs/references/update-workflow.md +59 -0
- package/skills/utils/journal/SKILL.md +11 -0
- package/skills/utils/kanban/SKILL.md +99 -0
- package/skills/utils/preview/SKILL.md +75 -0
- package/skills/utils/preview/references/generation-modes.md +95 -0
- package/skills/utils/preview/references/view-mode.md +42 -0
- package/skills/utils/repomix/SKILL.md +248 -0
- package/skills/utils/repomix/references/configuration.md +211 -0
- package/skills/utils/repomix/references/usage-patterns.md +232 -0
- package/skills/utils/repomix/scripts/.coverage +0 -0
- package/skills/utils/repomix/scripts/README.md +179 -0
- package/skills/utils/repomix/scripts/repomix_batch.py +455 -0
- package/skills/utils/repomix/scripts/repos.example.json +15 -0
- package/skills/utils/repomix/scripts/requirements.txt +15 -0
- package/skills/utils/repomix/scripts/tests/test_repomix_batch.py +531 -0
- package/skills/utils/research/SKILL.md +171 -0
- package/skills/utils/scout/SKILL.md +89 -0
- package/skills/utils/scout/references/external-scouting.md +140 -0
- package/skills/utils/scout/references/internal-scouting.md +119 -0
- package/skills/utils/scout/references/task-management-scouting.md +125 -0
- package/skills/utils/sequential-thinking/.env.example +8 -0
- package/skills/utils/sequential-thinking/README.md +183 -0
- package/skills/utils/sequential-thinking/SKILL.md +95 -0
- package/skills/utils/sequential-thinking/package.json +31 -0
- package/skills/utils/sequential-thinking/references/advanced-strategies.md +79 -0
- package/skills/utils/sequential-thinking/references/advanced-techniques.md +76 -0
- package/skills/utils/sequential-thinking/references/core-patterns.md +95 -0
- package/skills/utils/sequential-thinking/references/examples-api.md +88 -0
- package/skills/utils/sequential-thinking/references/examples-architecture.md +94 -0
- package/skills/utils/sequential-thinking/references/examples-debug.md +90 -0
- package/skills/utils/sequential-thinking/scripts/format-thought.js +159 -0
- package/skills/utils/sequential-thinking/scripts/process-thought.js +236 -0
- package/skills/utils/sequential-thinking/tests/format-thought.test.js +133 -0
- package/skills/utils/sequential-thinking/tests/process-thought.test.js +215 -0
- package/skills/utils/write-skill/SKILL.md +655 -0
- package/skills/utils/write-skill/anthropic-best-practices.md +1150 -0
- package/skills/utils/write-skill/examples/CLAUDE_MD_TESTING.md +189 -0
- package/skills/utils/write-skill/graphviz-conventions.dot +172 -0
- package/skills/utils/write-skill/persuasion-principles.md +187 -0
- package/skills/utils/write-skill/render-graphs.js +168 -0
- package/skills/utils/write-skill/testing-skills-with-subagents.md +384 -0
- package/src/commands/init.js +238 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
# Cloudflare Browser Rendering
|
|
2
|
+
|
|
3
|
+
Headless browser automation with Puppeteer/Playwright on Cloudflare Workers.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
**wrangler.toml:**
|
|
8
|
+
```toml
|
|
9
|
+
name = "browser-worker"
|
|
10
|
+
main = "src/index.ts"
|
|
11
|
+
compatibility_date = "2024-01-01"
|
|
12
|
+
|
|
13
|
+
browser = { binding = "MYBROWSER" }
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Basic Screenshot Worker
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
import puppeteer from '@cloudflare/puppeteer';
|
|
20
|
+
|
|
21
|
+
export default {
|
|
22
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
23
|
+
const browser = await puppeteer.launch(env.MYBROWSER);
|
|
24
|
+
const page = await browser.newPage();
|
|
25
|
+
|
|
26
|
+
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
|
|
27
|
+
const screenshot = await page.screenshot({ type: 'png' });
|
|
28
|
+
|
|
29
|
+
await browser.close();
|
|
30
|
+
|
|
31
|
+
return new Response(screenshot, {
|
|
32
|
+
headers: { 'Content-Type': 'image/png' }
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Session Reuse (Cost Optimization)
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
// Disconnect instead of close
|
|
42
|
+
await browser.disconnect();
|
|
43
|
+
|
|
44
|
+
// Retrieve and reconnect
|
|
45
|
+
const sessions = await puppeteer.sessions(env.MYBROWSER);
|
|
46
|
+
const freeSession = sessions.find(s => !s.connectionId);
|
|
47
|
+
|
|
48
|
+
if (freeSession) {
|
|
49
|
+
const browser = await puppeteer.connect(env.MYBROWSER, freeSession.sessionId);
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## PDF Generation
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
const browser = await puppeteer.launch(env.MYBROWSER);
|
|
57
|
+
const page = await browser.newPage();
|
|
58
|
+
|
|
59
|
+
await page.setContent(`
|
|
60
|
+
<!DOCTYPE html>
|
|
61
|
+
<html>
|
|
62
|
+
<head>
|
|
63
|
+
<style>
|
|
64
|
+
body { font-family: Arial; padding: 50px; }
|
|
65
|
+
h1 { color: #2c3e50; }
|
|
66
|
+
</style>
|
|
67
|
+
</head>
|
|
68
|
+
<body>
|
|
69
|
+
<h1>Certificate</h1>
|
|
70
|
+
<p>Awarded to: <strong>John Doe</strong></p>
|
|
71
|
+
</body>
|
|
72
|
+
</html>
|
|
73
|
+
`);
|
|
74
|
+
|
|
75
|
+
const pdf = await page.pdf({
|
|
76
|
+
format: 'A4',
|
|
77
|
+
printBackground: true,
|
|
78
|
+
margin: { top: '1cm', right: '1cm', bottom: '1cm', left: '1cm' }
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
await browser.close();
|
|
82
|
+
|
|
83
|
+
return new Response(pdf, {
|
|
84
|
+
headers: { 'Content-Type': 'application/pdf' }
|
|
85
|
+
});
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Durable Objects for Persistent Sessions
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
export class Browser {
|
|
92
|
+
state: DurableObjectState;
|
|
93
|
+
browser: any;
|
|
94
|
+
lastUsed: number;
|
|
95
|
+
|
|
96
|
+
constructor(state: DurableObjectState, env: Env) {
|
|
97
|
+
this.state = state;
|
|
98
|
+
this.lastUsed = Date.now();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async fetch(request: Request, env: Env) {
|
|
102
|
+
if (!this.browser) {
|
|
103
|
+
this.browser = await puppeteer.launch(env.MYBROWSER);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
this.lastUsed = Date.now();
|
|
107
|
+
await this.state.storage.setAlarm(Date.now() + 10000);
|
|
108
|
+
|
|
109
|
+
const page = await this.browser.newPage();
|
|
110
|
+
const url = new URL(request.url).searchParams.get('url');
|
|
111
|
+
await page.goto(url);
|
|
112
|
+
const screenshot = await page.screenshot();
|
|
113
|
+
await page.close();
|
|
114
|
+
|
|
115
|
+
return new Response(screenshot, {
|
|
116
|
+
headers: { 'Content-Type': 'image/png' }
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
async alarm() {
|
|
121
|
+
if (Date.now() - this.lastUsed > 60000) {
|
|
122
|
+
await this.browser?.close();
|
|
123
|
+
this.browser = null;
|
|
124
|
+
} else {
|
|
125
|
+
await this.state.storage.setAlarm(Date.now() + 10000);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## AI-Powered Web Scraper
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
import { Ai } from '@cloudflare/ai';
|
|
135
|
+
|
|
136
|
+
export default {
|
|
137
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
138
|
+
const browser = await puppeteer.launch(env.MYBROWSER);
|
|
139
|
+
const page = await browser.newPage();
|
|
140
|
+
await page.goto('https://news.ycombinator.com');
|
|
141
|
+
const content = await page.content();
|
|
142
|
+
await browser.close();
|
|
143
|
+
|
|
144
|
+
const ai = new Ai(env.AI);
|
|
145
|
+
const response = await ai.run('@cf/meta/llama-3-8b-instruct', {
|
|
146
|
+
messages: [
|
|
147
|
+
{
|
|
148
|
+
role: 'system',
|
|
149
|
+
content: 'Extract top 5 article titles and URLs as JSON'
|
|
150
|
+
},
|
|
151
|
+
{ role: 'user', content: content }
|
|
152
|
+
]
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
return Response.json(response);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Crawler with Queues
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
export default {
|
|
164
|
+
async queue(batch: MessageBatch<any>, env: Env): Promise<void> {
|
|
165
|
+
const browser = await puppeteer.launch(env.MYBROWSER);
|
|
166
|
+
|
|
167
|
+
for (const message of batch.messages) {
|
|
168
|
+
const page = await browser.newPage();
|
|
169
|
+
await page.goto(message.body.url);
|
|
170
|
+
|
|
171
|
+
const links = await page.evaluate(() => {
|
|
172
|
+
return Array.from(document.querySelectorAll('a')).map(a => a.href);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
for (const link of links) {
|
|
176
|
+
await env.QUEUE.send({ url: link });
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
await page.close();
|
|
180
|
+
message.ack();
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
await browser.close();
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## Configuration
|
|
189
|
+
|
|
190
|
+
### Timeout
|
|
191
|
+
```typescript
|
|
192
|
+
await page.goto(url, {
|
|
193
|
+
timeout: 60000, // 60 seconds max
|
|
194
|
+
waitUntil: 'networkidle2'
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
await page.waitForSelector('.content', { timeout: 45000 });
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Viewport
|
|
201
|
+
```typescript
|
|
202
|
+
await page.setViewport({ width: 1920, height: 1080 });
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Screenshot Options
|
|
206
|
+
```typescript
|
|
207
|
+
const screenshot = await page.screenshot({
|
|
208
|
+
type: 'png', // 'png' | 'jpeg' | 'webp'
|
|
209
|
+
quality: 90, // JPEG/WebP only
|
|
210
|
+
fullPage: true, // Full scrollable page
|
|
211
|
+
clip: { // Crop
|
|
212
|
+
x: 0, y: 0,
|
|
213
|
+
width: 800,
|
|
214
|
+
height: 600
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Limits & Pricing
|
|
220
|
+
|
|
221
|
+
### Free Plan
|
|
222
|
+
- 10 minutes/day
|
|
223
|
+
- 3 concurrent browsers
|
|
224
|
+
- 3 new browsers/minute
|
|
225
|
+
|
|
226
|
+
### Paid Plan
|
|
227
|
+
- 10 hours/month included
|
|
228
|
+
- 30 concurrent browsers
|
|
229
|
+
- 30 new browsers/minute
|
|
230
|
+
- $0.09/hour overage
|
|
231
|
+
- $2.00/concurrent browser overage
|
|
232
|
+
|
|
233
|
+
### Cost Optimization
|
|
234
|
+
1. Use `disconnect()` instead of `close()`
|
|
235
|
+
2. Enable Keep-Alive (10 min max)
|
|
236
|
+
3. Pool tabs with browser contexts
|
|
237
|
+
4. Cache auth state with KV
|
|
238
|
+
5. Implement Durable Objects cleanup
|
|
239
|
+
|
|
240
|
+
## Best Practices
|
|
241
|
+
|
|
242
|
+
### Session Management
|
|
243
|
+
- Always use `disconnect()` for reuse
|
|
244
|
+
- Implement session pooling
|
|
245
|
+
- Track session IDs and states
|
|
246
|
+
|
|
247
|
+
### Performance
|
|
248
|
+
- Cache content in KV
|
|
249
|
+
- Use browser contexts vs multiple browsers
|
|
250
|
+
- Choose appropriate `waitUntil` strategy
|
|
251
|
+
- Set realistic timeouts
|
|
252
|
+
|
|
253
|
+
### Error Handling
|
|
254
|
+
- Handle timeout errors gracefully
|
|
255
|
+
- Check session availability before connecting
|
|
256
|
+
- Validate responses before caching
|
|
257
|
+
|
|
258
|
+
### Security
|
|
259
|
+
- Validate user-provided URLs
|
|
260
|
+
- Implement authentication
|
|
261
|
+
- Sanitize extracted content
|
|
262
|
+
- Set appropriate CORS headers
|
|
263
|
+
|
|
264
|
+
## Troubleshooting
|
|
265
|
+
|
|
266
|
+
**Timeout Errors:**
|
|
267
|
+
```typescript
|
|
268
|
+
await page.goto(url, {
|
|
269
|
+
timeout: 60000,
|
|
270
|
+
waitUntil: 'domcontentloaded' // Faster than networkidle2
|
|
271
|
+
});
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
**Memory Issues:**
|
|
275
|
+
```typescript
|
|
276
|
+
await page.close(); // Close pages
|
|
277
|
+
await browser.disconnect(); // Reuse session
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
**Font Rendering:**
|
|
281
|
+
Use supported fonts (Noto Sans, Roboto, etc.) or inject custom:
|
|
282
|
+
```html
|
|
283
|
+
<link href="https://fonts.googleapis.com/css2?family=Poppins" rel="stylesheet">
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
## Key Methods
|
|
287
|
+
|
|
288
|
+
### Puppeteer
|
|
289
|
+
- `puppeteer.launch(binding)` - Start browser
|
|
290
|
+
- `puppeteer.connect(binding, sessionId)` - Reconnect
|
|
291
|
+
- `puppeteer.sessions(binding)` - List sessions
|
|
292
|
+
- `browser.newPage()` - Create page
|
|
293
|
+
- `browser.disconnect()` - Disconnect (keep alive)
|
|
294
|
+
- `browser.close()` - Close (terminate)
|
|
295
|
+
- `page.goto(url, options)` - Navigate
|
|
296
|
+
- `page.screenshot(options)` - Capture
|
|
297
|
+
- `page.pdf(options)` - Generate PDF
|
|
298
|
+
- `page.content()` - Get HTML
|
|
299
|
+
- `page.evaluate(fn)` - Execute JS
|
|
300
|
+
|
|
301
|
+
## Resources
|
|
302
|
+
|
|
303
|
+
- Docs: https://developers.cloudflare.com/browser-rendering/
|
|
304
|
+
- Puppeteer: https://pptr.dev/
|
|
305
|
+
- Examples: https://developers.cloudflare.com/workers/examples/
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Cloudflare D1 & KV
|
|
2
|
+
|
|
3
|
+
## D1 (SQLite Database)
|
|
4
|
+
|
|
5
|
+
### Setup
|
|
6
|
+
```bash
|
|
7
|
+
# Create database
|
|
8
|
+
wrangler d1 create my-database
|
|
9
|
+
|
|
10
|
+
# Add to wrangler.toml
|
|
11
|
+
[[d1_databases]]
|
|
12
|
+
binding = "DB"
|
|
13
|
+
database_name = "my-database"
|
|
14
|
+
database_id = "YOUR_DATABASE_ID"
|
|
15
|
+
|
|
16
|
+
# Apply schema
|
|
17
|
+
wrangler d1 execute my-database --file=./schema.sql
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### Usage
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
// Query
|
|
24
|
+
const result = await env.DB.prepare(
|
|
25
|
+
"SELECT * FROM users WHERE id = ?"
|
|
26
|
+
).bind(userId).first();
|
|
27
|
+
|
|
28
|
+
// Insert
|
|
29
|
+
await env.DB.prepare(
|
|
30
|
+
"INSERT INTO users (name, email) VALUES (?, ?)"
|
|
31
|
+
).bind("Alice", "alice@example.com").run();
|
|
32
|
+
|
|
33
|
+
// Batch (atomic)
|
|
34
|
+
await env.DB.batch([
|
|
35
|
+
env.DB.prepare("UPDATE accounts SET balance = balance - 100 WHERE id = ?").bind(user1),
|
|
36
|
+
env.DB.prepare("UPDATE accounts SET balance = balance + 100 WHERE id = ?").bind(user2)
|
|
37
|
+
]);
|
|
38
|
+
|
|
39
|
+
// All results
|
|
40
|
+
const { results } = await env.DB.prepare("SELECT * FROM users").all();
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Features
|
|
44
|
+
- Global read replication (low-latency reads)
|
|
45
|
+
- Single-writer consistency
|
|
46
|
+
- Standard SQLite syntax
|
|
47
|
+
- 25GB database size limit
|
|
48
|
+
- ACID transactions with batch
|
|
49
|
+
|
|
50
|
+
## KV (Key-Value Store)
|
|
51
|
+
|
|
52
|
+
### Setup
|
|
53
|
+
```bash
|
|
54
|
+
# Create namespace
|
|
55
|
+
wrangler kv:namespace create MY_KV
|
|
56
|
+
|
|
57
|
+
# Add to wrangler.toml
|
|
58
|
+
[[kv_namespaces]]
|
|
59
|
+
binding = "KV"
|
|
60
|
+
id = "YOUR_NAMESPACE_ID"
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Usage
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
// Put with TTL
|
|
67
|
+
await env.KV.put("session:token", JSON.stringify(data), {
|
|
68
|
+
expirationTtl: 3600,
|
|
69
|
+
metadata: { userId: "123" }
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Get
|
|
73
|
+
const value = await env.KV.get("session:token");
|
|
74
|
+
const json = await env.KV.get("session:token", "json");
|
|
75
|
+
const buffer = await env.KV.get("session:token", "arrayBuffer");
|
|
76
|
+
const stream = await env.KV.get("session:token", "stream");
|
|
77
|
+
|
|
78
|
+
// Get with metadata
|
|
79
|
+
const { value, metadata } = await env.KV.getWithMetadata("session:token");
|
|
80
|
+
|
|
81
|
+
// Delete
|
|
82
|
+
await env.KV.delete("session:token");
|
|
83
|
+
|
|
84
|
+
// List
|
|
85
|
+
const list = await env.KV.list({ prefix: "user:" });
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Features
|
|
89
|
+
- Sub-millisecond reads (edge-cached)
|
|
90
|
+
- Eventual consistency (~60 seconds globally)
|
|
91
|
+
- 25MB value size limit
|
|
92
|
+
- Automatic expiration (TTL)
|
|
93
|
+
|
|
94
|
+
## Use Cases
|
|
95
|
+
|
|
96
|
+
### D1
|
|
97
|
+
- Relational data
|
|
98
|
+
- Complex queries with JOINs
|
|
99
|
+
- ACID transactions
|
|
100
|
+
- User accounts, orders, inventory
|
|
101
|
+
|
|
102
|
+
### KV
|
|
103
|
+
- Cache
|
|
104
|
+
- Sessions
|
|
105
|
+
- Feature flags
|
|
106
|
+
- Rate limiting
|
|
107
|
+
- Real-time counters
|
|
108
|
+
|
|
109
|
+
## Decision Matrix
|
|
110
|
+
|
|
111
|
+
| Need | Choose |
|
|
112
|
+
|------|--------|
|
|
113
|
+
| SQL queries | D1 |
|
|
114
|
+
| Sub-millisecond reads | KV |
|
|
115
|
+
| ACID transactions | D1 |
|
|
116
|
+
| Large values (>25MB) | R2 |
|
|
117
|
+
| Strong consistency | D1 (writes), Durable Objects |
|
|
118
|
+
| Automatic expiration | KV |
|
|
119
|
+
|
|
120
|
+
## Resources
|
|
121
|
+
|
|
122
|
+
- D1: https://developers.cloudflare.com/d1/
|
|
123
|
+
- KV: https://developers.cloudflare.com/kv/
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
# Cloudflare Platform Overview
|
|
2
|
+
|
|
3
|
+
Cloudflare Developer Platform: comprehensive edge computing ecosystem for full-stack applications on global network across 300+ cities.
|
|
4
|
+
|
|
5
|
+
## Core Concepts
|
|
6
|
+
|
|
7
|
+
### Edge Computing Model
|
|
8
|
+
|
|
9
|
+
**Global Network:**
|
|
10
|
+
- Code runs on servers in 300+ cities globally
|
|
11
|
+
- Requests execute from nearest location
|
|
12
|
+
- Ultra-low latency (<50ms typical)
|
|
13
|
+
- Automatic failover and redundancy
|
|
14
|
+
|
|
15
|
+
**V8 Isolates:**
|
|
16
|
+
- Lightweight execution environments (faster than containers)
|
|
17
|
+
- Millisecond cold starts
|
|
18
|
+
- Zero infrastructure management
|
|
19
|
+
- Automatic scaling
|
|
20
|
+
- Pay-per-request pricing
|
|
21
|
+
|
|
22
|
+
### Key Components
|
|
23
|
+
|
|
24
|
+
**Workers** - Serverless functions on edge
|
|
25
|
+
- HTTP/scheduled/queue/email handlers
|
|
26
|
+
- JavaScript/TypeScript/Python/Rust support
|
|
27
|
+
- Max 50ms CPU (free), 30s (paid)
|
|
28
|
+
- 128MB memory limit
|
|
29
|
+
|
|
30
|
+
**D1** - SQLite database with global read replication
|
|
31
|
+
- Standard SQLite syntax
|
|
32
|
+
- Single-writer consistency
|
|
33
|
+
- Global read replication
|
|
34
|
+
- 25GB database size limit
|
|
35
|
+
- Batch operations for transactions
|
|
36
|
+
|
|
37
|
+
**KV** - Distributed key-value store
|
|
38
|
+
- Sub-millisecond reads (edge-cached)
|
|
39
|
+
- Eventual consistency (~60s globally)
|
|
40
|
+
- 25MB value size limit
|
|
41
|
+
- Automatic TTL expiration
|
|
42
|
+
- Best for: cache, sessions, feature flags
|
|
43
|
+
|
|
44
|
+
**R2** - Object storage (S3-compatible)
|
|
45
|
+
- Zero egress fees (huge cost advantage)
|
|
46
|
+
- Unlimited storage
|
|
47
|
+
- 5TB object size limit
|
|
48
|
+
- S3-compatible API
|
|
49
|
+
- Multipart upload support
|
|
50
|
+
|
|
51
|
+
**Durable Objects** - Stateful compute with WebSockets
|
|
52
|
+
- Single-instance coordination (strong consistency)
|
|
53
|
+
- Persistent storage (1GB limit paid)
|
|
54
|
+
- WebSocket support
|
|
55
|
+
- Automatic hibernation
|
|
56
|
+
|
|
57
|
+
**Queues** - Message queue system
|
|
58
|
+
- At-least-once delivery
|
|
59
|
+
- Automatic retries (exponential backoff)
|
|
60
|
+
- Dead-letter queue support
|
|
61
|
+
- Batch processing
|
|
62
|
+
|
|
63
|
+
**Pages** - Static site hosting + serverless functions
|
|
64
|
+
- Git integration (auto-deploy)
|
|
65
|
+
- Directory-based routing
|
|
66
|
+
- Framework support (Next.js, Remix, Astro, SvelteKit)
|
|
67
|
+
- Built-in preview deployments
|
|
68
|
+
|
|
69
|
+
**Workers AI** - Run AI models on edge
|
|
70
|
+
- LLMs (Llama 3, Mistral, Gemma, Qwen)
|
|
71
|
+
- Image generation (Stable Diffusion, DALL-E)
|
|
72
|
+
- Embeddings (BGE, GTE)
|
|
73
|
+
- Speech recognition (Whisper)
|
|
74
|
+
- No GPU management required
|
|
75
|
+
|
|
76
|
+
**Browser Rendering** - Headless browser automation
|
|
77
|
+
- Puppeteer/Playwright support
|
|
78
|
+
- Screenshots, PDFs, web scraping
|
|
79
|
+
- Session reuse for cost optimization
|
|
80
|
+
- MCP server support for AI agents
|
|
81
|
+
|
|
82
|
+
## Architecture Patterns
|
|
83
|
+
|
|
84
|
+
### Full-Stack Application
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
┌─────────────────────────────────────────┐
|
|
88
|
+
│ Cloudflare Pages (Frontend) │
|
|
89
|
+
│ Next.js / Remix / Astro │
|
|
90
|
+
└──────────────────┬──────────────────────┘
|
|
91
|
+
│
|
|
92
|
+
┌──────────────────▼──────────────────────┐
|
|
93
|
+
│ Workers (API Layer) │
|
|
94
|
+
│ - Routing │
|
|
95
|
+
│ - Authentication │
|
|
96
|
+
│ - Business logic │
|
|
97
|
+
└─┬──────┬──────┬──────┬──────┬───────────┘
|
|
98
|
+
│ │ │ │ │
|
|
99
|
+
▼ ▼ ▼ ▼ ▼
|
|
100
|
+
┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────────────┐
|
|
101
|
+
│ D1 │ │ KV │ │ R2 │ │ DO │ │ Workers AI │
|
|
102
|
+
└────┘ └────┘ └────┘ └────┘ └────────────┘
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Polyglot Storage Pattern
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
export default {
|
|
109
|
+
async fetch(request: Request, env: Env) {
|
|
110
|
+
// KV: Fast cache
|
|
111
|
+
const cached = await env.KV.get(key);
|
|
112
|
+
if (cached) return new Response(cached);
|
|
113
|
+
|
|
114
|
+
// D1: Structured data
|
|
115
|
+
const user = await env.DB.prepare(
|
|
116
|
+
"SELECT * FROM users WHERE id = ?"
|
|
117
|
+
).bind(userId).first();
|
|
118
|
+
|
|
119
|
+
// R2: Media files
|
|
120
|
+
const avatar = await env.R2_BUCKET.get(`avatars/${user.id}.jpg`);
|
|
121
|
+
|
|
122
|
+
// Durable Objects: Real-time
|
|
123
|
+
const chat = env.CHAT_ROOM.get(env.CHAT_ROOM.idFromName(roomId));
|
|
124
|
+
|
|
125
|
+
// Queue: Async processing
|
|
126
|
+
await env.EMAIL_QUEUE.send({ to: user.email, template: 'welcome' });
|
|
127
|
+
|
|
128
|
+
return new Response(JSON.stringify({ user }));
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Wrangler CLI Essentials
|
|
134
|
+
|
|
135
|
+
### Installation
|
|
136
|
+
```bash
|
|
137
|
+
npm install -g wrangler
|
|
138
|
+
wrangler login
|
|
139
|
+
wrangler init my-worker
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Core Commands
|
|
143
|
+
```bash
|
|
144
|
+
# Development
|
|
145
|
+
wrangler dev # Local dev server
|
|
146
|
+
wrangler dev --remote # Dev on real edge
|
|
147
|
+
|
|
148
|
+
# Deployment
|
|
149
|
+
wrangler deploy # Deploy to production
|
|
150
|
+
wrangler deploy --dry-run # Preview changes
|
|
151
|
+
|
|
152
|
+
# Logs
|
|
153
|
+
wrangler tail # Real-time logs
|
|
154
|
+
wrangler tail --format pretty # Formatted logs
|
|
155
|
+
|
|
156
|
+
# Versions
|
|
157
|
+
wrangler deployments list # List deployments
|
|
158
|
+
wrangler rollback [version] # Rollback
|
|
159
|
+
|
|
160
|
+
# Secrets
|
|
161
|
+
wrangler secret put SECRET_NAME
|
|
162
|
+
wrangler secret list
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Resource Management
|
|
166
|
+
```bash
|
|
167
|
+
# D1
|
|
168
|
+
wrangler d1 create my-db
|
|
169
|
+
wrangler d1 execute my-db --file=schema.sql
|
|
170
|
+
|
|
171
|
+
# KV
|
|
172
|
+
wrangler kv:namespace create MY_KV
|
|
173
|
+
wrangler kv:key put --binding=MY_KV "key" "value"
|
|
174
|
+
|
|
175
|
+
# R2
|
|
176
|
+
wrangler r2 bucket create my-bucket
|
|
177
|
+
wrangler r2 object put my-bucket/file.txt --file=./file.txt
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Configuration (wrangler.toml)
|
|
181
|
+
|
|
182
|
+
```toml
|
|
183
|
+
name = "my-worker"
|
|
184
|
+
main = "src/index.ts"
|
|
185
|
+
compatibility_date = "2024-01-01"
|
|
186
|
+
|
|
187
|
+
# Environment variables
|
|
188
|
+
[vars]
|
|
189
|
+
ENVIRONMENT = "production"
|
|
190
|
+
|
|
191
|
+
# D1 Database
|
|
192
|
+
[[d1_databases]]
|
|
193
|
+
binding = "DB"
|
|
194
|
+
database_name = "my-database"
|
|
195
|
+
database_id = "YOUR_DATABASE_ID"
|
|
196
|
+
|
|
197
|
+
# KV Namespace
|
|
198
|
+
[[kv_namespaces]]
|
|
199
|
+
binding = "KV"
|
|
200
|
+
id = "YOUR_NAMESPACE_ID"
|
|
201
|
+
|
|
202
|
+
# R2 Bucket
|
|
203
|
+
[[r2_buckets]]
|
|
204
|
+
binding = "R2_BUCKET"
|
|
205
|
+
bucket_name = "my-bucket"
|
|
206
|
+
|
|
207
|
+
# Durable Objects
|
|
208
|
+
[[durable_objects.bindings]]
|
|
209
|
+
name = "COUNTER"
|
|
210
|
+
class_name = "Counter"
|
|
211
|
+
script_name = "my-worker"
|
|
212
|
+
|
|
213
|
+
# Queues
|
|
214
|
+
[[queues.producers]]
|
|
215
|
+
binding = "MY_QUEUE"
|
|
216
|
+
queue = "my-queue"
|
|
217
|
+
|
|
218
|
+
# Workers AI
|
|
219
|
+
[ai]
|
|
220
|
+
binding = "AI"
|
|
221
|
+
|
|
222
|
+
# Cron triggers
|
|
223
|
+
[triggers]
|
|
224
|
+
crons = ["0 0 * * *"]
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## Best Practices
|
|
228
|
+
|
|
229
|
+
### Performance
|
|
230
|
+
- Keep Workers lightweight (<1MB bundled)
|
|
231
|
+
- Use bindings over fetch (faster than HTTP)
|
|
232
|
+
- Leverage KV and Cache API for frequently accessed data
|
|
233
|
+
- Use D1 batch for multiple queries
|
|
234
|
+
- Stream large responses
|
|
235
|
+
|
|
236
|
+
### Security
|
|
237
|
+
- Use `wrangler secret` for API keys
|
|
238
|
+
- Separate production/staging/development environments
|
|
239
|
+
- Validate user input
|
|
240
|
+
- Implement rate limiting (KV or Durable Objects)
|
|
241
|
+
- Configure proper CORS headers
|
|
242
|
+
|
|
243
|
+
### Cost Optimization
|
|
244
|
+
- R2 for large files (zero egress fees vs S3)
|
|
245
|
+
- KV for caching (reduce D1/R2 requests)
|
|
246
|
+
- Request deduplication with caching
|
|
247
|
+
- Efficient D1 queries (proper indexing)
|
|
248
|
+
- Monitor usage via Cloudflare Analytics
|
|
249
|
+
|
|
250
|
+
## Decision Matrix
|
|
251
|
+
|
|
252
|
+
| Need | Choose |
|
|
253
|
+
|------|--------|
|
|
254
|
+
| Sub-millisecond reads | KV |
|
|
255
|
+
| SQL queries | D1 |
|
|
256
|
+
| Large files (>25MB) | R2 |
|
|
257
|
+
| Real-time WebSockets | Durable Objects |
|
|
258
|
+
| Async background jobs | Queues |
|
|
259
|
+
| ACID transactions | D1 |
|
|
260
|
+
| Strong consistency | Durable Objects |
|
|
261
|
+
| Zero egress costs | R2 |
|
|
262
|
+
| AI inference | Workers AI |
|
|
263
|
+
| Static site hosting | Pages |
|
|
264
|
+
|
|
265
|
+
## Resources
|
|
266
|
+
|
|
267
|
+
- Docs: https://developers.cloudflare.com
|
|
268
|
+
- Wrangler: https://developers.cloudflare.com/workers/wrangler/
|
|
269
|
+
- Discord: https://discord.cloudflare.com
|
|
270
|
+
- Examples: https://developers.cloudflare.com/workers/examples/
|
|
271
|
+
- Status: https://www.cloudflarestatus.com
|