Local CI (dev build)
Run local CI against the in-tree dev build (pnpm local-ci-dev) to verify changes to this repo before completing work.
This skill relies on two pi-native tools added by .pi/extensions/background-shell.ts: bash_background (start a command, return immediately) and monitor_wait (block until the log matches a pattern or the task exits). If those tools aren't available in your pi, load/reload the extension — /reload if you're already in a session, or relaunch pi — before continuing.
Steps
Start local-ci in the background with
bash_background, with the NDJSON event stream enabled:{ "command": "pnpm local-ci-dev run --all -q -p --json" }This returns
{ taskId, outputFile, pid }without blocking. Because stdout isn't a TTY, the launcher detaches automatically: the foreground process exits 77 the moment a step pauses, while the worker keeps the container alive forretry.Wait for a pause or completion with
monitor_wait, matching the NDJSON event discriminators (silence is not success — a crash or hang with a success-only filter looks identical to still-running):{ "taskId": "<from step 1>", "pattern": "\"event\":\"(run\\.paused|run\\.finish)\"", "timeoutMs": 600000 }monitor_waitreturns when any of the following happens:- the regex matches a new line →
stoppedBecause: "match", inspectmatches. Arun.pausedline carries therunnername +retry_cmd; arun.finishline carriesstatus: passed|failed. - the task exits →
stoppedBecause: "exit", inspectstate(succeededorfailed) andexitCode. Exit code 77 means a step paused — treat it like arun.pausedmatch. - the timeout elapses →
stoppedBecause: "timeout", loop back and callmonitor_waitagain (it resumes from the previous byte offset automatically)
- the regex matches a new line →
On success (
run.finishwithstatus: passed, orstate: "succeeded"), you're done.On failure (
run.pausedmatch orexitCode: 77), read the full output file for details:tail -n 200 <outputFile>CI was passing before your work started, so the failure is caused by your changes. Fix the issue in your code, then retry the failed runner — again via
bash_background+monitor_wait:pnpm local-ci-dev retry --name <runner-name>If the fix requires re-running from an earlier step:
pnpm local-ci-dev retry --name <runner-name> --from-step <N>Repeat until the job passes.
Once all jobs have passed, you're done.