Repository navigation
Description
Part of dogfooding: codeSplitters hosts codeSplitters (and RustyBuns), with GitHub as the backup. Sibling issues: the desktop as the primary git store (#464), and the integration that ties checks to pushes, branches and GitHub (#465).
What
codeSplitters runs a repo's build and tests itself: on the desktop (a Bun server on your own machine, using your own toolchain) or on the edge in a container. GitHub Actions stops being the only CI.
Pieces that already exist
src/deps.tsalready runs installs and tests in a throwaway clone, a temp dir on the desktop or a container on Cloudflare.src/cuts.tsrunsbun testand reads its JUnit report.src/deploy-runner.tsanddeploy-sandbox/already have a per-repo Durable Object, a container and streamed output under an alarm's time budget. The CI runner needs the same shape without deploy keys, so it gets its own binding, as agents do.
Scope
- What to run. Use a repo's
codesplitters.ciconfig when it has one. Without one, use itspackage.jsontest/typecheckscripts. For a monorepo, use per-app commands (RustyBuns:scripts/ci-apps.tsalready lists them, and only the apps a change touched run). Leave parsing.github/workflows/*.ymlfor later. - The desktop runner. Spawn the commands with
Bun.spawnin a checkout from codeSplitters desktop: the primary git store, local out and GitHub in #464, streaming output into the check run's log. Install scripts follow the deps.ts rules. - The container runner. A
CiRunnerDO plus an image (git + bun). One run at a time per repo, a later commit cancels a queued run, and it holds no secrets. - Limits. Container runs count against
src/limits.ts(see codeSplitters limits: rate-limit preview and deploy runs #238). The desktop is free.
Done when
- A commit to a desktop repo can produce
passed/failedcheck runs with logs for codeSplitters' ownbun test test. - The same run can happen in a container on a local dev Worker.
- Tests cover choosing what to run and the runner state machine (no real containers in tests).
The shared contract (all three issues build against this)
A check run is one record: { id, owner, repo, ref (branch or main), sha, name, runner: "desktop" | "container" | "github", status: queued | running | passed | failed | cancelled, started_at, finished_at, log (streamed), junit? }. It lives in D1 (a check_runs table) and comes in over GET /api/repos/:o/:r/checks?ref= and POST /api/repos/:o/:r/checks/:id/cancel. The runner (#463) writes them, the local store (#464) gives it a real checkout to run in, and the integration (#465) decides when to start them, shows them and gates merges on them. Whichever issue lands first adds the table; the others rebase onto it.
Activity
codeSplitters checks: one panel for our runs and GitHub Actions, and …
QuinnsCode commentedon Oct 11, 2026
Addendum from a design chat: the
codesplitters.ciconfig should take any command, not just test scripts. For example{ image: { run: "docker build .", paths: ["Dockerfile", "src/**"] } }, so people building locally (Docker and the like) get that check run on their own machine by the desktop runner, at zero cost. Itspathsshould be the same shape as the path-scoped required checks in the bring-your-own-runner issue. The bigger picture is that codeSplitters is mostly a proxy to people's existing builds: see #532 (GitHub-compatible webhooks) and #533 (a GitHub status API shim).QuinnsCode commentedon Oct 11, 2026
Folded into #737, which bundles it with related work for one agent. The details here still apply.
🤖 Generated with Claude Code
codeSplitters checks: what runs here, stale runs after branch edits, …