Skip to main content
Everything after -- is the command, run as given, without a shell. For a pipeline use -- sh -c '...', and pair it with --runner or --junit, since zode-ci cannot see the runner inside a shell.

Runners it understands

auto looks through npx, pnpm exec, yarn, bunx, node_modules/.bin/, python -m, uv run and poetry run. For npm test, npm run <script>, pnpm and yarn scripts it reads package.json and detects the runner when the script is a single command. make test, turbo, nx and shell scripts are not detected: the command runs unchanged and nothing is stored, with a notice naming --runner and --junit. When the command already asks for the same report, zode-ci reads yours instead of adding its own. Playwright and cargo-nextest work today through --junit.

Exit code

Always the command’s own (a command killed by signal n gives 128+n). The only codes of its own come before the command starts: 2 for a usage error, 127 when the command is not found.

Where results go

Each run is stored with its counts and every test’s result, duration and, when selection ran, its decision. Read them in the console on the job, or with the API: GET /v1/ci/test-runs?repo=<owner/name>, GET /v1/ci/test-runs/{id} and GET /v1/ci/test-runs/{id}/tests.

Why there is a line to add

Zode does not rewrite your test step. We checked 236 test steps in 37 popular repositories: only about one in five is a single command whose runner could be named safely, and guessing wrong would break a passing build. Wrapping stays one explicit line.