---
name: blueprint-cloudflare-scaffold
description: "Lay out a Worker with D1 and static Vue assets, with tests that run inside the Workers runtime."
---
# App skeleton
One folder, one `package.json`, TypeScript throughout, `yarn`. The later checks rely on this layout exactly:
```
wrangler.jsonc the Worker: main, compatibility_date, assets, the D1 binding "DB"
src/worker/index.ts the Worker's fetch handler; /api/* is the API, everything else is the Vue app
migrations/ D1 migrations: numbered .sql files, applied by wrangler
index.html the Vue entry (
)
src/client/ Vue 3 + Vite
public/_headers the security headers for the static files (they do not go through the Worker)
vitest.config.ts @cloudflare/vitest-pool-workers: tests run in workerd with D1, migrations applied first
test/ one file per area: data.test.ts, api.test.ts, ui.test.ts, auth.test.ts
```
- Dev dependencies: `wrangler`, `vite`, `@vitejs/plugin-vue`, `vue`, `typescript`, `@cloudflare/workers-types`,
`@cloudflare/vitest-pool-workers`, and the `vitest` major that it asks for as a peer (check `yarn why` and the
install warnings: a newer vitest than it supports fails to start).
- `typescript@^6`, not 7: a later check reads the test files through TypeScript's compiler API, which TypeScript 7
does not ship.
- `wrangler.jsonc`:
- `assets`: `{ "directory": "./dist/client", "not_found_handling": "single-page-application", "run_worker_first": ["/api/*"] }`
- `d1_databases`: one entry with `"binding": "DB"`, `"migrations_dir": "migrations"`. The `database_id` is a
placeholder until the publish step creates the real database.
- `compatibility_date`: a date the installed wrangler's runtime supports — about a month before today. A date
newer than the runtime refuses to start ("requires compatibility date … newest supported is …").
- Scripts:
- `build`: `vite build` into `dist/client`
- `start`: `wrangler d1 migrations apply DB --local && wrangler dev --local --ip 127.0.0.1`. The checks run
`yarn start --port `, so extra arguments must reach `wrangler dev`.
- `test`: `vitest run`
- `deploy`: `wrangler deploy`
- `GET /api/health` answers `{ "ok": true }`.
- The tests read the migrations with `readD1Migrations` and apply them in a setup file with `applyD1Migrations`, so
every test starts from the same schema. Call the Worker through `SELF.fetch` from `cloudflare:test`.
- Add one trivial passing test in `test/` so the harness is proven.
Done when the check passes: the layout exists, `yarn build` and `yarn test` succeed.
## Always
- Read `.blueprint/spec.md` first. It is the agreed specification; do not widen it.
- When you need a decision, ask it through the blueprint question tool and stop. Do not guess.
- Do not run `git init`: a new repository loses the folder's trust and the next unattended step stops at Claude
Code's trust prompt. The user adds git themselves after the build if they want it.
- Say you are done by stopping; the executor runs the check. Do not claim success yourself.