| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| README.md | 2026-09-18 | 7.7 kB | |
| v0.12.0 source code.tar.gz | 2026-09-18 | 1.3 MB | |
| v0.12.0 source code.zip | 2026-09-18 | 1.5 MB | |
| Totals: 3 Items | 2.8 MB | 0 | |
Added
- Environments from the CLI.
project env list | create | update | delete | set-default <project-id>manage a project's environments over/api/cli/v1/projects/{id}/envwith the existingread:projects/write:projectsscopes; passwords come from--password-fileand are never printed, anddeleterefuses the default environment (the server soft-deletes, so run history keeps naming it).--env <name>ontest run(including--all),test rerunandtest result --historytargets or filters by environment; an unknown name is a server-side validation error that lists the project's environment names, never a silent fallback.project createandproject updateaccept--local <port>(with--local-hostand--skip-preflight) for an app on this machine — the CLI builds the loopback URL and probes the port first; a loopback--urlis refused and pointed at--local, and a bind-all0.0.0.0/::is refused everywhere. Every run now names an environment on the server (--target-urland--localmatch by origin or create one), and run, result and history payloads carryenvironment {id, name}; the history table gains an ENV column andauthModereportsaccount/otp/manual/public. Requires a backend that serves the environment facade; against an older backend theproject envverbs return not-found and--envis rejected. TESTSPRITE_CLIENT— let a wrapper identify itself. A tool driving the CLI (the GitHub Action setsgithub-action/<ref>) can setTESTSPRITE_CLIENT=<name>/<version>; the value is appended to the User-Agent on every API request and the telemetry beacon (testsprite-cli/<version> (<client>)) and reported as the telemetryclientfield. The value is validated against a tight<name>/<version>grammar; anything else is ignored silently and never echoed. Without the variable every request is byte-identical to before.- CI context and outcome counts on the telemetry event. The one per-invocation event now carries
ciProvider(github/gitlab/circleci/buildkite/other/none), and under GitHub ActionsciEventandrepoHash— a salted, truncated hash of the repository, never the name.test run --all,testlist runandtest run <id> --waitadd outcome counts (accepted/conflicts/deferred/skipped,passed/failed/blocked/timedOut) andconflictReason, the most frequent reason a case did not dispatch;ci initaddsplatform,force,workflowExistedandprojectResolved. All fields are low-cardinality numbers and closed enums; the privacy contract (no URLs, ids, messages, argument values or repository names) is unchanged, and so are the opt-outs. - Pinned-version warning in GitHub Actions. A
ci init-generated workflow pinscli-version, so the job keeps running that release forever. When the backend reports that the running version has fallen below its minimum supported version, a job underGITHUB_ACTIONS=truenow gets one::warning title=TestSprite::annotation naming the pinned version, the floor, and the fix (testsprite ci init github --force) — on stderr, so--output jsonon stdout stays parseable. The plain TTY advisory is unchanged off Actions. This keys off the version floor the backend already sends on every response; the npm "newer version available" check is (still) skipped in CI, so the warning does not fire for a pin that is merely behind the latest release.
Changed
- Batch billing refusals exit 12, like a single run.
POST /tests/batch/runandtestlist runmay now report per-caseinsufficient_credits/billing_holdconflicts, and both are named in the conflict summary with the server's message. When nothing dispatched, nothing was rate-deferred, and every conflict isinsufficient_credits,test run --all(with or without--wait) andtestlist runexit 12 with the sameINSUFFICIENT_CREDITSenvelope and billingnextActiona singletest runprints — previously a generic "already in flight" conflict, exit 6. A backend that answers that case with a 402 envelope directly is mapped identically. A batch refused entirely for a billing hold comes back from the current backend as the standard 403FEATURE_GATEDenvelope (details.reason: 'billing_hold') and exits 13 with the server'snextAction— the same as a singletest run; per-casebilling_holdconflicts appear only on a mixed batch, and an older backend that folds every case into them still exits 6 with the hold named. Every other conflict mix keeps its current exit code. - The CI summary counts never-dispatched tests as
skipped, never asfailed. The--summary-fileJSON (ontest run, batchtest rerun, andtestlist run) gains askippedfield, andfailednow counts only dispatched runs that did not pass. Previously a test that never ran — rate-deferred, conflicted (already in flight), not found, or skipped by the engine — was counted underfailed, so a batch could exit 0 while its own artifact claimedfailed: 1and the checks tab showed a red annotation: three surfaces telling two stories. The annotations split the same way — a dispatched run that failed or timed out still annotates as::error::, while a never-dispatched test annotates as::warning::— and the job-summary headline readsN/M passed (F failed, S skipped, T timed out). Migration: a pipeline that parses the summary JSON and gates onfailed > 0no longer fails on conflict/not-found/deferred members; gate on the exit code (which already covers every case where nothing ran: deferred → 7, all-conflict → 6, all-not-found rerun → 4, zero-dispatch → 5), or onfailed + skippedto keep the old behavior. test rerun --allfails (exit 5) when the resolved rerun set is empty, instead of a silent exit 0. No tests matching--filter/--status/--skip-terminal— or a project with no tests — used to print one stderr line and exit 0 with no CI artifact: a rerun gate that greens on zero runs. It now emits the summary + annotation and fails with exit 5, exactly liketest run --all(0.8.0); pass the new--allow-emptyto opt back into exit 0 when an empty sweep is expected.
Fixed
- A batch rerun where every id has no replayable run exits 4, not 0.
test rerun a b --waitwith both ids innotFounddispatched nothing, printed two red annotations and an artifact claiming two failures — and exited 0, so a CI gate passed on zero runs. It now exits 4 (NOT_FOUND, the same codetestlist runuses for a--casemiss) with anextActionpointing attest run <id>for a first fresh run, on both the--waitand non---waitpaths. A mixed batch is unchanged:notFoundids surface asskippedrows without failing an otherwise-passing batch. - An empty frontend
stepSummaryrenders asn/a, not0/0. A frontend run card whose step summary carried no steps printedsteps 0/0 (passed=0, failed=0), the same shape a backend run uses to say "not applicable"; it now printsn/alike the backend card. Community contribution (#336). - A month-restricted cron schedule is no longer described as "daily". The human-readable schedule description ignored the month field, so
0 9 * 1 *read as "every day at 09:00"; the month restriction is now part of the description. Community contribution (#319). DOCUMENTATION.mdmanual-authentication commands match the currentsetup/authsurface. Community contribution (#342).