{"id":"cloudflare-worker-builder","name":"cloudflare-worker-builder","summary":"Honoルーティング、Viteプラグイン、静的アセットを使ってCloudflare Workersをスキャフォールドし展開します。","body":"# Cloudflare Worker Builder\n\nScaffold a working Cloudflare Worker project from a brief description. Produces a deployable project with Hono routing, Vite dev server, and Static Assets.\n\n## Workflow\n\n### Step 1: Understand the Project\n\nAsk about the project to choose the right bindings and structure:\n\n- What does the app do? (API only, SPA + API, landing page)\n- What data storage? (D1 database, R2 files, KV cache, none)\n- Auth needed? (Clerk, better-auth, none)\n- Custom domain or workers.dev subdomain?\n\nA brief like \"todo app with database\" is enough to proceed.\n\n### Step 2: Scaffold the Project\n\n```bash\nnpm create cloudflare@latest my-worker -- --type hello-world --ts --git --deploy false --framework none\ncd my-worker\nnpm install hono\nnpm install -D @cloudflare/vite-plugin vite\n```\n\nCopy and customise the asset files from this skill's `assets/` directory:\n- `wrangler.jsonc` — Worker configuration\n- `vite.config.ts` — Vite + Cloudflare plugin\n- `src/index.ts` — Hono app with Static Assets fallback\n- `package.json` — Scripts and dependencies\n- `tsconfig.json` — TypeScript config\n- `public/index.html` — SPA entry point\n\n### Step 3: Configure Bindings\n\nAdd bindings to `wrangler.jsonc` based on project needs. Wrangler 4.45+ auto-provisions resources on first deploy — always specify explicit names:\n\n```jsonc\n{\n  \"name\": \"my-worker\",\n  \"main\": \"src/index.ts\",\n  \"compatibility_date\": \"2025-11-11\",\n  \"assets\": {\n    \"directory\": \"./public/\",\n    \"binding\": \"ASSETS\",\n    \"not_found_handling\": \"single-page-application\",\n    \"run_worker_first\": [\"/api/*\"]\n  },\n  // Add as needed:\n  \"d1_databases\": [{ \"binding\": \"DB\", \"database_name\": \"my-app-db\" }],\n  \"r2_buckets\": [{ \"binding\": \"STORAGE\", \"bucket_name\": \"my-app-files\" }],\n  \"kv_namespaces\": [{ \"binding\": \"CACHE\", \"title\": \"my-app-cache\" }]\n}\n```\n\n### Step 4: Deploy\n\n```bash\nnpm run dev           # Local dev at http://localhost:8787\nwrangler deploy       # Production deploy\n```\n\n---\n\n## Critical Patterns\n\n### Export Syntax\n\n```typescript\n// CORRECT — use this pattern\nexport default app\n\n// WRONG — causes \"Cannot read properties of undefined\"\nexport default { fetch: app.fetch }\n```\n\nSource: [honojs/hono #3955](https://github.com/honojs/hono/issues/3955)\n\n### Static Assets + API Routes\n\nWithout `run_worker_first`, SPA fallback intercepts API routes and returns `index.html` instead of JSON:\n\n```jsonc\n\"assets\": {\n  \"not_found_handling\": \"single-page-application\",\n  \"run_worker_first\": [\"/api/*\"]  // CRITICAL\n}\n```\n\nSource: [workers-sdk #8879](https://github.com/cloudflare/workers-sdk/issues/8879)\n\n### Vite Config\n\n```typescript\nimport { defineConfig } from 'vite'\nimport { cloudflare } from '@cloudflare/vite-plugin'\n\nexport default defineConfig({ plugins: [cloudflare()] })\n```\n\nAlways set the `main` field in wrangler.jsonc — the Vite plugin needs it.\n\n### Scheduled/Cron Handlers\n\nWhen adding cron triggers, switch to explicit export:\n\n```typescript\nexport default {\n  fetch: app.fetch,\n  scheduled: async (event, env, ctx) => { /* ... */ }\n}\n```\n\n---\n\n## Reference Files\n\nRead these for detailed troubleshooting:\n\n- `references/common-issues.md` — 10 documented issues with sources and fixes\n- `references/architecture.md` — Route priority, caching, Workers RPC\n- `references/deployment.md` — CI/CD, auto-provisioning, gradual rollouts","author":"@jezweb","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/jezweb/claude-skills/tree/main/plugins/cloudflare/skills/cloudflare-worker-builder","license":"MIT","category":"writing","lang":"en","tokens":861,"stars":0,"calls30d":2,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[{"path":"assets/package.json","size":485,"sha256":"a3c06e51aa7774ac821af048ded64dcefc66cbbb24fb39ac1197a67275610a3d"},{"path":"assets/public/index.html","size":1932,"sha256":"666f828cfb91306baf0b318cbcc33cfdb703013a0c4ea54af0ff50ad641f9fa7"},{"path":"assets/public/script.js","size":2067,"sha256":"cc4fa2c001fb8b12fbb95e91d9bdbd498d0aab56305fa7b3b0d6023bd19268f8"},{"path":"assets/public/styles.css","size":2580,"sha256":"8bff3ff271f32820ac2e3d0493caa3aa59c99165ce11af52cf3fa59e49d772d3"},{"path":"assets/src/index.ts","size":1958,"sha256":"c0a8b998f0e1d90261d4ca9d7e81513ce5fd92922aca61cf71020eac56162b10"},{"path":"assets/tsconfig.json","size":1563,"sha256":"6956104e94fa7add588ceb73718ee8dac3e44c1427b6e9c647e1a9961b1873e6"},{"path":"assets/vite.config.ts","size":273,"sha256":"5d2062acc1fa802f8ca1fe41ca07ef45d4ec97fe6efef83dc8e03ff8fad37fe2"},{"path":"assets/wrangler.jsonc","size":1755,"sha256":"dba230edb1754e4bfe4f1adf5039f1a9f52c4c912c09d3101856b7f8b4c89bd7"},{"path":"references/architecture.md","size":10949,"sha256":"d3fd27f33955a41dd4ef73fea6dac6d36b37807c4a291d2e06c8f2f43d9d4e3d"},{"path":"references/common-issues.md","size":14046,"sha256":"7c0b51fb63cdf1c8455715aa2978035ce4a213b274e42fea5987bbb46e990f49"},{"path":"references/deployment.md","size":14820,"sha256":"d9b4f83effbc5ea3f1f7f2a56e4ac53057245a3c8b11ce6b7bcbfc2a73c5ce19"}],"requires":{"mcp":[],"tools":[]},"safety":{"flags":[{"code":"net.endpoints","kind":"exfiltration","excerpt":"aka.ms, api-staging.example.com, api.datadoghq.com, api.example.com, dash.cloudflare.com, developers.cloudflare.com, discord.gg, hono.dev","message":"bundled scripts reach 8 external host(s)","severity":"warn"}],"scannedAt":"2026-08-22","hasScripts":true,"networkEndpoints":["aka.ms","api-staging.example.com","api.datadoghq.com","api.example.com","dash.cloudflare.com","developers.cloudflare.com","discord.gg","hono.dev"]}}