@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,280 @@
|
|
|
1
|
+
# Cloudflare R2 Storage
|
|
2
|
+
|
|
3
|
+
S3-compatible object storage with zero egress fees.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
### Create Bucket
|
|
8
|
+
```bash
|
|
9
|
+
wrangler r2 bucket create my-bucket
|
|
10
|
+
wrangler r2 bucket create my-bucket --location=wnam
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Locations: `wnam`, `enam`, `weur`, `eeur`, `apac`
|
|
14
|
+
|
|
15
|
+
### Upload Object
|
|
16
|
+
```bash
|
|
17
|
+
wrangler r2 object put my-bucket/file.txt --file=./local-file.txt
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### Workers Binding
|
|
21
|
+
|
|
22
|
+
**wrangler.toml:**
|
|
23
|
+
```toml
|
|
24
|
+
[[r2_buckets]]
|
|
25
|
+
binding = "MY_BUCKET"
|
|
26
|
+
bucket_name = "my-bucket"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Worker:**
|
|
30
|
+
```typescript
|
|
31
|
+
// Put
|
|
32
|
+
await env.MY_BUCKET.put('user-uploads/photo.jpg', imageData, {
|
|
33
|
+
httpMetadata: {
|
|
34
|
+
contentType: 'image/jpeg',
|
|
35
|
+
cacheControl: 'public, max-age=31536000'
|
|
36
|
+
},
|
|
37
|
+
customMetadata: {
|
|
38
|
+
uploadedBy: userId,
|
|
39
|
+
uploadDate: new Date().toISOString()
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Get
|
|
44
|
+
const object = await env.MY_BUCKET.get('large-file.mp4');
|
|
45
|
+
if (!object) {
|
|
46
|
+
return new Response('Not found', { status: 404 });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return new Response(object.body, {
|
|
50
|
+
headers: {
|
|
51
|
+
'Content-Type': object.httpMetadata.contentType,
|
|
52
|
+
'ETag': object.etag
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// List
|
|
57
|
+
const listed = await env.MY_BUCKET.list({
|
|
58
|
+
prefix: 'user-uploads/',
|
|
59
|
+
limit: 100
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// Delete
|
|
63
|
+
await env.MY_BUCKET.delete('old-file.txt');
|
|
64
|
+
|
|
65
|
+
// Head (check existence)
|
|
66
|
+
const object = await env.MY_BUCKET.head('file.txt');
|
|
67
|
+
if (object) {
|
|
68
|
+
console.log('Size:', object.size);
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## S3 API Integration
|
|
73
|
+
|
|
74
|
+
### AWS CLI
|
|
75
|
+
```bash
|
|
76
|
+
# Configure
|
|
77
|
+
aws configure
|
|
78
|
+
# Access Key ID: <your-key-id>
|
|
79
|
+
# Secret Access Key: <your-secret>
|
|
80
|
+
# Region: auto
|
|
81
|
+
|
|
82
|
+
# Operations
|
|
83
|
+
aws s3api list-buckets --endpoint-url https://<accountid>.r2.cloudflarestorage.com
|
|
84
|
+
|
|
85
|
+
aws s3 cp file.txt s3://my-bucket/ --endpoint-url https://<accountid>.r2.cloudflarestorage.com
|
|
86
|
+
|
|
87
|
+
# Presigned URL
|
|
88
|
+
aws s3 presign s3://my-bucket/file.txt --endpoint-url https://<accountid>.r2.cloudflarestorage.com --expires-in 3600
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### JavaScript (AWS SDK v3)
|
|
92
|
+
```javascript
|
|
93
|
+
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
|
|
94
|
+
|
|
95
|
+
const s3 = new S3Client({
|
|
96
|
+
region: "auto",
|
|
97
|
+
endpoint: `https://${accountId}.r2.cloudflarestorage.com`,
|
|
98
|
+
credentials: {
|
|
99
|
+
accessKeyId: process.env.R2_ACCESS_KEY_ID,
|
|
100
|
+
secretAccessKey: process.env.R2_SECRET_ACCESS_KEY
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
await s3.send(new PutObjectCommand({
|
|
105
|
+
Bucket: "my-bucket",
|
|
106
|
+
Key: "file.txt",
|
|
107
|
+
Body: fileContents
|
|
108
|
+
}));
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Python (Boto3)
|
|
112
|
+
```python
|
|
113
|
+
import boto3
|
|
114
|
+
|
|
115
|
+
s3 = boto3.client(
|
|
116
|
+
service_name='s3',
|
|
117
|
+
endpoint_url=f'https://{account_id}.r2.cloudflarestorage.com',
|
|
118
|
+
aws_access_key_id=access_key_id,
|
|
119
|
+
aws_secret_access_key=secret_access_key,
|
|
120
|
+
region_name='auto'
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
s3.upload_fileobj(file_obj, 'my-bucket', 'file.txt')
|
|
124
|
+
s3.download_file('my-bucket', 'file.txt', './local-file.txt')
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Multipart Uploads
|
|
128
|
+
|
|
129
|
+
For files >100MB:
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
const multipart = await env.MY_BUCKET.createMultipartUpload('large-file.mp4');
|
|
133
|
+
|
|
134
|
+
// Upload parts (5MiB - 5GiB each, max 10,000 parts)
|
|
135
|
+
const part1 = await multipart.uploadPart(1, chunk1);
|
|
136
|
+
const part2 = await multipart.uploadPart(2, chunk2);
|
|
137
|
+
|
|
138
|
+
// Complete
|
|
139
|
+
const object = await multipart.complete([part1, part2]);
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Rclone (Large Files)
|
|
143
|
+
```bash
|
|
144
|
+
rclone config # Configure Cloudflare R2
|
|
145
|
+
|
|
146
|
+
# Upload with optimization
|
|
147
|
+
rclone copy large-video.mp4 r2:my-bucket/ \
|
|
148
|
+
--s3-upload-cutoff=100M \
|
|
149
|
+
--s3-chunk-size=100M
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Public Buckets
|
|
153
|
+
|
|
154
|
+
### Enable Public Access
|
|
155
|
+
1. Dashboard → R2 → Bucket → Settings → Public Access
|
|
156
|
+
2. Add custom domain (recommended) or use r2.dev
|
|
157
|
+
|
|
158
|
+
**r2.dev (rate-limited):**
|
|
159
|
+
```
|
|
160
|
+
https://pub-<hash>.r2.dev/file.txt
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**Custom domain (production):**
|
|
164
|
+
Cloudflare handles DNS/TLS automatically
|
|
165
|
+
|
|
166
|
+
## CORS Configuration
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
wrangler r2 bucket cors put my-bucket --rules '[
|
|
170
|
+
{
|
|
171
|
+
"AllowedOrigins": ["https://example.com"],
|
|
172
|
+
"AllowedMethods": ["GET", "PUT", "POST"],
|
|
173
|
+
"AllowedHeaders": ["*"],
|
|
174
|
+
"ExposeHeaders": ["ETag"],
|
|
175
|
+
"MaxAgeSeconds": 3600
|
|
176
|
+
}
|
|
177
|
+
]'
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Lifecycle Rules
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
wrangler r2 bucket lifecycle put my-bucket --rules '[
|
|
184
|
+
{
|
|
185
|
+
"action": {"type": "AbortIncompleteMultipartUpload"},
|
|
186
|
+
"filter": {},
|
|
187
|
+
"abortIncompleteMultipartUploadDays": 7
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"action": {"type": "Transition", "storageClass": "InfrequentAccess"},
|
|
191
|
+
"filter": {"prefix": "archives/"},
|
|
192
|
+
"daysFromCreation": 90
|
|
193
|
+
}
|
|
194
|
+
]'
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Event Notifications
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
wrangler r2 bucket notification create my-bucket \
|
|
201
|
+
--queue=my-queue \
|
|
202
|
+
--event-type=object-create
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Supported events: `object-create`, `object-delete`
|
|
206
|
+
|
|
207
|
+
## Data Migration
|
|
208
|
+
|
|
209
|
+
### Sippy (Incremental)
|
|
210
|
+
```bash
|
|
211
|
+
wrangler r2 bucket sippy enable my-bucket \
|
|
212
|
+
--provider=aws \
|
|
213
|
+
--bucket=source-bucket \
|
|
214
|
+
--region=us-east-1 \
|
|
215
|
+
--access-key-id=$AWS_KEY \
|
|
216
|
+
--secret-access-key=$AWS_SECRET
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
Objects migrate on first request.
|
|
220
|
+
|
|
221
|
+
### Super Slurper (Bulk)
|
|
222
|
+
Use dashboard for one-time complete migration from AWS, GCS, Azure.
|
|
223
|
+
|
|
224
|
+
## Best Practices
|
|
225
|
+
|
|
226
|
+
### Performance
|
|
227
|
+
- Use Cloudflare Cache with custom domains
|
|
228
|
+
- Multipart uploads for files >100MB
|
|
229
|
+
- Rclone for batch operations
|
|
230
|
+
- Location hints match user geography
|
|
231
|
+
|
|
232
|
+
### Security
|
|
233
|
+
- Never commit Access Keys
|
|
234
|
+
- Use environment variables
|
|
235
|
+
- Bucket-scoped tokens for least privilege
|
|
236
|
+
- Presigned URLs for temporary access
|
|
237
|
+
- Enable Cloudflare Access for protection
|
|
238
|
+
|
|
239
|
+
### Cost Optimization
|
|
240
|
+
- Infrequent Access storage for archives (30+ days)
|
|
241
|
+
- Lifecycle rules to auto-transition/delete
|
|
242
|
+
- Larger multipart chunks = fewer Class A operations
|
|
243
|
+
- Monitor usage via dashboard
|
|
244
|
+
|
|
245
|
+
### Naming
|
|
246
|
+
- Bucket names: lowercase, hyphens, 3-63 chars
|
|
247
|
+
- Avoid sequential prefixes (use hashed for performance)
|
|
248
|
+
- No dots in bucket names if using custom domains with TLS
|
|
249
|
+
|
|
250
|
+
## Limits
|
|
251
|
+
|
|
252
|
+
- Buckets per account: 1,000
|
|
253
|
+
- Object size: 5TB max
|
|
254
|
+
- Lifecycle rules: 1,000 per bucket
|
|
255
|
+
- Event notification rules: 100 per bucket
|
|
256
|
+
- r2.dev rate limit: 1,000 req/min (use custom domains)
|
|
257
|
+
|
|
258
|
+
## Troubleshooting
|
|
259
|
+
|
|
260
|
+
**401 Unauthorized:**
|
|
261
|
+
- Verify Access Keys
|
|
262
|
+
- Check endpoint URL includes account ID
|
|
263
|
+
- Ensure region is "auto"
|
|
264
|
+
|
|
265
|
+
**403 Forbidden:**
|
|
266
|
+
- Check bucket permissions
|
|
267
|
+
- Verify CORS configuration
|
|
268
|
+
- Confirm bucket exists
|
|
269
|
+
|
|
270
|
+
**Presigned URLs not working:**
|
|
271
|
+
- Verify CORS configuration
|
|
272
|
+
- Check URL expiry time
|
|
273
|
+
- Ensure origin matches CORS rules
|
|
274
|
+
|
|
275
|
+
## Resources
|
|
276
|
+
|
|
277
|
+
- Docs: https://developers.cloudflare.com/r2/
|
|
278
|
+
- Wrangler: https://developers.cloudflare.com/r2/reference/wrangler-commands/
|
|
279
|
+
- S3 Compatibility: https://developers.cloudflare.com/r2/api/s3/api/
|
|
280
|
+
- Workers API: https://developers.cloudflare.com/r2/api/workers/
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
# Cloudflare Workers Advanced Patterns
|
|
2
|
+
|
|
3
|
+
Advanced techniques for optimization, performance, and complex workflows.
|
|
4
|
+
|
|
5
|
+
## Session Reuse and Connection Pooling
|
|
6
|
+
|
|
7
|
+
### Durable Objects for Persistent Sessions
|
|
8
|
+
```typescript
|
|
9
|
+
export class Browser {
|
|
10
|
+
state: DurableObjectState;
|
|
11
|
+
browser: any;
|
|
12
|
+
lastUsed: number;
|
|
13
|
+
|
|
14
|
+
constructor(state: DurableObjectState, env: Env) {
|
|
15
|
+
this.state = state;
|
|
16
|
+
this.lastUsed = Date.now();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async fetch(request: Request, env: Env) {
|
|
20
|
+
if (!this.browser) {
|
|
21
|
+
this.browser = await puppeteer.launch(env.MYBROWSER);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
this.lastUsed = Date.now();
|
|
25
|
+
await this.state.storage.setAlarm(Date.now() + 10000);
|
|
26
|
+
|
|
27
|
+
const page = await this.browser.newPage();
|
|
28
|
+
await page.goto(new URL(request.url).searchParams.get('url'));
|
|
29
|
+
const screenshot = await page.screenshot();
|
|
30
|
+
await page.close();
|
|
31
|
+
|
|
32
|
+
return new Response(screenshot);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async alarm() {
|
|
36
|
+
if (Date.now() - this.lastUsed > 60000) {
|
|
37
|
+
await this.browser?.close();
|
|
38
|
+
this.browser = null;
|
|
39
|
+
} else {
|
|
40
|
+
await this.state.storage.setAlarm(Date.now() + 10000);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Multi-Tier Caching Strategy
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
const CACHE_TTL = 3600;
|
|
50
|
+
|
|
51
|
+
export default {
|
|
52
|
+
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
|
|
53
|
+
const cache = caches.default;
|
|
54
|
+
const cacheKey = new Request(request.url);
|
|
55
|
+
|
|
56
|
+
// 1. Check edge cache
|
|
57
|
+
let response = await cache.match(cacheKey);
|
|
58
|
+
if (response) return response;
|
|
59
|
+
|
|
60
|
+
// 2. Check KV cache
|
|
61
|
+
const kvCached = await env.MY_KV.get(request.url);
|
|
62
|
+
if (kvCached) {
|
|
63
|
+
response = new Response(kvCached);
|
|
64
|
+
ctx.waitUntil(cache.put(cacheKey, response.clone()));
|
|
65
|
+
return response;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// 3. Fetch from origin
|
|
69
|
+
response = await fetch(request);
|
|
70
|
+
|
|
71
|
+
// 4. Store in both caches
|
|
72
|
+
ctx.waitUntil(Promise.all([
|
|
73
|
+
cache.put(cacheKey, response.clone()),
|
|
74
|
+
env.MY_KV.put(request.url, await response.clone().text(), {
|
|
75
|
+
expirationTtl: CACHE_TTL
|
|
76
|
+
})
|
|
77
|
+
]));
|
|
78
|
+
|
|
79
|
+
return response;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## WebSocket with Durable Objects
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
export class ChatRoom {
|
|
88
|
+
state: DurableObjectState;
|
|
89
|
+
sessions: Set<WebSocket>;
|
|
90
|
+
|
|
91
|
+
constructor(state: DurableObjectState) {
|
|
92
|
+
this.state = state;
|
|
93
|
+
this.sessions = new Set();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async fetch(request: Request) {
|
|
97
|
+
const pair = new WebSocketPair();
|
|
98
|
+
const [client, server] = Object.values(pair);
|
|
99
|
+
|
|
100
|
+
this.state.acceptWebSocket(server);
|
|
101
|
+
this.sessions.add(server);
|
|
102
|
+
|
|
103
|
+
return new Response(null, { status: 101, webSocket: client });
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async webSocketMessage(ws: WebSocket, message: string) {
|
|
107
|
+
// Broadcast to all connected clients
|
|
108
|
+
for (const session of this.sessions) {
|
|
109
|
+
session.send(message);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
async webSocketClose(ws: WebSocket) {
|
|
114
|
+
this.sessions.delete(ws);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Queue-Based Crawler
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
export default {
|
|
123
|
+
async queue(batch: MessageBatch<any>, env: Env): Promise<void> {
|
|
124
|
+
const browser = await puppeteer.launch(env.MYBROWSER);
|
|
125
|
+
|
|
126
|
+
for (const message of batch.messages) {
|
|
127
|
+
const page = await browser.newPage();
|
|
128
|
+
await page.goto(message.body.url);
|
|
129
|
+
|
|
130
|
+
// Extract links
|
|
131
|
+
const links = await page.evaluate(() => {
|
|
132
|
+
return Array.from(document.querySelectorAll('a'))
|
|
133
|
+
.map(a => a.href);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
// Queue new links
|
|
137
|
+
for (const link of links) {
|
|
138
|
+
await env.QUEUE.send({ url: link });
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
await page.close();
|
|
142
|
+
message.ack();
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
await browser.close();
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Authentication Pattern
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
import { sign, verify } from 'hono/jwt';
|
|
154
|
+
|
|
155
|
+
async function authenticate(request: Request, env: Env): Promise<any> {
|
|
156
|
+
const authHeader = request.headers.get('Authorization');
|
|
157
|
+
|
|
158
|
+
if (!authHeader?.startsWith('Bearer ')) {
|
|
159
|
+
throw new Error('Missing token');
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const token = authHeader.substring(7);
|
|
163
|
+
const payload = await verify(token, env.JWT_SECRET);
|
|
164
|
+
|
|
165
|
+
return payload;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export default {
|
|
169
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
170
|
+
try {
|
|
171
|
+
const user = await authenticate(request, env);
|
|
172
|
+
return new Response(`Hello ${user.name}`);
|
|
173
|
+
} catch (error) {
|
|
174
|
+
return new Response('Unauthorized', { status: 401 });
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Code Splitting
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
// Lazy load large dependencies
|
|
184
|
+
export default {
|
|
185
|
+
async fetch(request: Request): Promise<Response> {
|
|
186
|
+
const url = new URL(request.url);
|
|
187
|
+
|
|
188
|
+
if (url.pathname === '/heavy') {
|
|
189
|
+
const { processHeavy } = await import('./heavy');
|
|
190
|
+
return processHeavy(request);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return new Response('OK');
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Batch Operations with D1
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
// Efficient bulk inserts
|
|
202
|
+
const statements = users.map(user =>
|
|
203
|
+
env.DB.prepare('INSERT INTO users (name, email) VALUES (?, ?)')
|
|
204
|
+
.bind(user.name, user.email)
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
await env.DB.batch(statements);
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Stream Processing
|
|
211
|
+
|
|
212
|
+
```typescript
|
|
213
|
+
const { readable, writable } = new TransformStream({
|
|
214
|
+
transform(chunk, controller) {
|
|
215
|
+
// Process chunk
|
|
216
|
+
controller.enqueue(chunk);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
response.body.pipeTo(writable);
|
|
221
|
+
return new Response(readable);
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## AI-Powered Web Scraper
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
import { Ai } from '@cloudflare/ai';
|
|
228
|
+
|
|
229
|
+
export default {
|
|
230
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
231
|
+
// Render page
|
|
232
|
+
const browser = await puppeteer.launch(env.MYBROWSER);
|
|
233
|
+
const page = await browser.newPage();
|
|
234
|
+
await page.goto('https://news.ycombinator.com');
|
|
235
|
+
const content = await page.content();
|
|
236
|
+
await browser.close();
|
|
237
|
+
|
|
238
|
+
// Extract with AI
|
|
239
|
+
const ai = new Ai(env.AI);
|
|
240
|
+
const response = await ai.run('@cf/meta/llama-3-8b-instruct', {
|
|
241
|
+
messages: [
|
|
242
|
+
{
|
|
243
|
+
role: 'system',
|
|
244
|
+
content: 'Extract top 5 article titles and URLs as JSON array'
|
|
245
|
+
},
|
|
246
|
+
{ role: 'user', content: content }
|
|
247
|
+
]
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
return Response.json(response);
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## Performance Optimization
|
|
256
|
+
|
|
257
|
+
### Bundle Size
|
|
258
|
+
- Keep Workers <1MB bundled
|
|
259
|
+
- Remove unused dependencies
|
|
260
|
+
- Use code splitting
|
|
261
|
+
- Check with: `wrangler deploy --dry-run --outdir=dist`
|
|
262
|
+
|
|
263
|
+
### Cold Starts
|
|
264
|
+
- Minimize initialization code
|
|
265
|
+
- Use bindings over fetch
|
|
266
|
+
- Avoid large imports at top level
|
|
267
|
+
|
|
268
|
+
### Memory Management
|
|
269
|
+
- Close pages when done: `await page.close()`
|
|
270
|
+
- Disconnect browsers: `await browser.disconnect()`
|
|
271
|
+
- Implement cleanup alarms in Durable Objects
|
|
272
|
+
|
|
273
|
+
### Request Optimization
|
|
274
|
+
- Use server-side filtering with `--filter`
|
|
275
|
+
- Batch operations with D1 `.batch()`
|
|
276
|
+
- Stream large responses
|
|
277
|
+
- Implement proper caching
|
|
278
|
+
|
|
279
|
+
## Monitoring & Debugging
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
# Real-time logs
|
|
283
|
+
wrangler tail --format pretty
|
|
284
|
+
|
|
285
|
+
# Filter by status
|
|
286
|
+
wrangler tail --status error
|
|
287
|
+
|
|
288
|
+
# Check deployments
|
|
289
|
+
wrangler deployments list
|
|
290
|
+
|
|
291
|
+
# Rollback
|
|
292
|
+
wrangler rollback [version-id]
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## Production Checklist
|
|
296
|
+
|
|
297
|
+
- [ ] Multi-stage error handling implemented
|
|
298
|
+
- [ ] Rate limiting configured
|
|
299
|
+
- [ ] Caching strategy in place
|
|
300
|
+
- [ ] Secrets managed with `wrangler secret`
|
|
301
|
+
- [ ] Health checks implemented
|
|
302
|
+
- [ ] Monitoring alerts configured
|
|
303
|
+
- [ ] Session reuse for browser rendering
|
|
304
|
+
- [ ] Resource cleanup (pages, browsers)
|
|
305
|
+
- [ ] Proper timeout configurations
|
|
306
|
+
- [ ] CI/CD pipeline set up
|
|
307
|
+
|
|
308
|
+
## Resources
|
|
309
|
+
|
|
310
|
+
- Advanced Patterns: https://developers.cloudflare.com/workers/examples/
|
|
311
|
+
- Durable Objects: https://developers.cloudflare.com/workers/runtime-apis/durable-objects/
|
|
312
|
+
- Performance: https://developers.cloudflare.com/workers/platform/limits/
|