Continuous integration
.github/workflows/test.yml runs on every push to main and every pull request. A newer run on the same ref cancels an older one. It needs no secrets: everything it runs is offline.
Jobs
Typecheck and unit tests (Ubuntu, Node 22, 15-minute limit):
npm cinpm run typecheck: every workspace and the root tooling project.npm run docs:reference -- --check: fails if the generated reference pages in these docs are out of date with the code.npm run test:coverage: Vitest with the per-layer coverage gates.- Uploads
coverage/as an artifact, kept 14 days.
End-to-end (Ubuntu, Node 22, 20-minute limit):
npm cinpx playwright install --with-deps chromiumnpm run test:e2e: builds, starts a fresh test Worker, runs every spec with two retries.- On failure, uploads
playwright-report/andtest-results/(traces, screenshots, video), kept 14 days.
Reproducing a failure locally
npm run test:all # the same steps as CI, in order
CI=1 npm run test:e2e # force a fresh Worker and CI retries
npx playwright show-trace test-results/<test>/trace.zip
| Failure | Usually |
|---|---|
docs:reference -- --check | A capability, tool, prompt, scenario or the Claim schema changed. Run npm run docs:reference and commit the result. |
| A coverage gate | New code without tests, or tests deleted. The summary names the layer. |
e2e/api.spec.ts offline guard | The test Worker is not offline. Check e2e/worker.env. |
| An e2e timeout on the web server | The build failed, or :8799 is taken by something else. |
Deploys
CI does not deploy. Deploys are either manual (npm run deploy) or through Workers Builds. See Deploying.