| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| README.md | 2026-08-31 | 11.6 kB | |
| v0.8.0 source code.tar.gz | 2026-08-31 | 1.1 MB | |
| v0.8.0 source code.zip | 2026-08-31 | 1.3 MB | |
| Totals: 3 Items | 2.5 MB | 0 | |
Added
- Per-test step timeouts from the CLI.
test create --step-timeout <ms>andtest update --step-timeout <ms>set the 1–60000 ms timeout the execution engine applies to every step;test update --clear-step-timeoutrestores engine defaults.test getechoes a configured value, validation and mutual exclusion fail before any request, and successful set operations warn that the independenttest run --wait --timeoutpoll deadline may need to be raised without implying that a client timeout stops the server-side run. ci init github— scaffold a GitHub Actions workflow in one command. Writes a ready-to-run.github/workflows/testsprite.ymlthat delegates to the publishedTestSprite/testsprite-action@v1, so a project gets a CI gate without hand-copying YAML. Because the run, the JUnit upload, the annotations, and the skipped-test guard (allow-partial: falseby default — a partial batch fails the job instead of a false green) all live in one maintained action, the scaffold stays a thin, correct wire-up. The generated workflow pins the CLI version (notlatest), sets least-privilegepermissions: contents: read, skips fork PRs (which have no secrets, so the check can't run), and limits thepushtrigger to the repo's detected default branch. The project id is auto-detected when the key owns exactly one project (otherwise--projectis required, and the validation error names the fix);--filterand--timeoutthread into the action, and a non-default endpoint (resolved from your profile /--endpoint-url, not just the flag) is carried through for self-hosted / staging. Interpolated values are validated so the scaffold can never emit a workflow GitHub refuses to parse.--dry-runpreviews the file without writing; an existing workflow is never clobbered without--force(which keeps a.bak). The workflow reads the key from aTESTSPRITE_API_KEYrepo secret;ci initprints the exactgh secret setcommand to add it, and--set-secretruns it for you when theghCLI is installed and authenticated (the key is passed on stdin, never the process list), degrading to the printed instruction rather than failing the scaffold.test plan generate/test plan accept— ask TestSprite to write the first tests. Until now the CLI could run tests but not come up with them: a project with no tests meant a trip to the Portal, or a coding agent inventing plans by reading the source.testsprite test plan generate --project <id>runs whichever preparation stages the project is still missing — exploring the live app, building the feature map, drafting the cases — shows live progress, and prints the resulting proposals with stable ids.testsprite test plan accept --project <id>turns them into real test cases, all of them or a subset with--only. Nothing is written to your disk: proposals are staged server-side, which is where the review happens, so there is no plan file to manage and no prompt to answer. Only the stages a project is actually missing run — an already-explored project skips straight to proposals — so re-running picks up where the last call left off instead of starting over. Requires a V3-platform account; an account still on the older platform gets a clear message and exit 6 rather than a confusing failure.- Every precondition failure names its exact fix, and nothing prompts. A frontend project whose environment has no URL, an API project with no processed sources, an account not yet migrated — each exits 6 with the literal command to run next (
project update … --url,project docs upload …, or a pointer at the Portal). A generation stage already running — including one started from the Portal — is not an error at all: the command attaches to it and keeps polling. Proposals already staged means nothing is started, said plainly rather than silently no-opped. Ctrl-C detaches honestly (exit 130/143/129) with the truth on stderr — the server keeps working — and--timeout(exit 7) prints a partial object with the project id so re-running the same command re-attaches.--onlynaming any unknown proposal id is a validation error whose request is never sent, because an empty selection means "reject everything" to the server and would destroy the staged batch. project docs upload <file>— supply the source material generation reads. An API project created purely from the CLI used to dead-end: with no uploaded spec there was nothing to build a feature map from, and the only fix was a Portal trip. This uploads an API spec or PRD straight into the project's source pipeline (--role api-doc|prd, display name defaulting to the file name) and starts processing. The file is streamed rather than read into memory, so a large spec costs constant memory; the local file is only ever read, never written back. The two failure points are deliberately distinguished because their fixes differ: if the upload itself fails, nothing was registered and re-running mints a fresh signed URL; if registration fails, the bytes already landed and re-running is safe — the server stores each document by its storage key and replaces rather than duplicates it.test run --local <port>and thetunnelcommand — test an app running on your own machine. Until now a CLI test had to point at something TestSprite could already reach, so an app onlocalhostmeant deploying it first or hand-rolling a public tunnel.testsprite test run <id> --local 3000opens a TestSprite tunnel, runs the test againsthttp://127.0.0.1:3000, and proxies the runner's traffic back to this machine for as long as the command is running.--local-hostpicks which loopback spelling the run targets (localhost,127.0.0.1,::1) for apps that only answer on one of them. Because the tunnel closes with the process,--localimplies--waitand, on Ctrl-C, cancels the run rather than leaving one that could only fail —--no-cancel-on-interruptopts out. It is mutually exclusive with--target-url, is frontend-only, and probes the port before anything is minted or billed, so a dead port costs nothing. For a longer session,testsprite tunnel startholds one tunnel open across many runs (tunnel status <client-id>,tunnel stop <client-id>);test run --local --tunnel-client <id>attaches to it instead of opening its own, and leaves it running afterwards. The id it prints is a non-secret handle — the credential itself is never echoed. Availability: local runs are rolling out — an account already on the newer platform getsUNSUPPORTED(exit 7) with the reason and a pointer to support, rather than a run that would be charged and could not be trusted; everyone else has it now.
Changed
-
test run --allfails (exit 5) when it dispatches zero tests, instead of a silent exit 0. A batch that runs nothing — every test skipped (e.g. a frontend-only project on the backend-only wave engine), an empty project, or a--filterthat matched nothing — used to exit 0 with no summary, no annotation, and no JUnit report: a CI gate that greens on zero tests, which is worse than no gate. It now emits the summary, the::error::annotation, and the JUnit report (skipped test cases) so the gate shows why, then fails with exit 5. Pass--allow-emptyto opt back into exit 0 when a zero-dispatch run is expected. Single-testtest run <id>is unaffected (it always has one test). -
CI output shows the test's title, not its raw id. The
--gh-outputjob-summaryTestcolumn and the::error::annotations rendered the rawtestIdUUID, so a reviewer saw a column of ids they had to paste into the portal to identify. The run response now carries the test's human title (resolved server-side), andtest run,test rerun, andtestlist runrendertitlein the summary + annotations, falling back to the id when a title isn't available (older server / unresolved).testlist run's JUnit<testcase name>gets the title too (it had no name-enrichment pass, so it showed the id wheretest run --allalready showed the name). The raw id stays reachable — JUnit keeps it as thetestIdattribute — so automation is unaffected. - CI summary links are clickable and point where you'd expect. In the
--gh-outputjob-summary table the test title now links to the test's portal page and the Run column links to that run's execution-result page (two distinct destinations); the::error::annotation on a failing run links straight to its result page. Every link is built by the server for the store that actually answered the read — never templated client-side — so it resolves for V3 projects and non-prod endpoints where the old client-built guess was dead or missing. A run with no result page (a V2 run) keeps its raw run id in the Run column, and when the server provides no link the cells stay plain text, exactly as before. - The live progress line no longer shows a
completed/total stepscounter. Both read paths computetotalandcompletedfrom the same set of already-finished step rows (a step row exists only once its step has a verdict), so the two could never differ — the line read0/0 stepsfor the whole early window andN/Nthereafter.test run --wait,test wait, batch--all --wait,test rerun --waitandtestlist run --waitnow show the recorded step count when there is one (running · 3 steps · 14s) and just the status and elapsed time otherwise. The final line uses the same shape (thetest rerun --waitreplay's final line now carries the elapsed time too). Batch members stay tagged(test_id)and closure members[role], as before. The full live step feed is tracked separately (DEV-1018). - The elapsed counter keeps moving between polls. In long-poll mode the server answers every ~25 s, so the seconds on the progress line used to freeze between answers;
test run --waitandtest waitnow redraw the last snapshot once a second (TTY only; never underNO_COLOR, where each redraw would be a new line). test plan generatereports what it actually spent instead of quoting a price up front. The pre-run price quote came from a static table that could drift from what the server charges; the command now stays quiet before the fact and prints the real credits used and the remaining balance when the work is done.
Fixed
- Exit codes are correct on Windows again. On Windows with Node 23 and newer, any failed command printed a low-level crash line and replaced its documented exit code (e.g. 4 for not-found) with
-1073740791, so scripts, CI jobs, and coding agents that branch on the CLI's exit codes got garbage instead of a contract. The CLI now lets Node exit on its own rather than forcing the process down, and an end-to-end test pins the real exit code per class. - Asking for help on a command that does not exist is an error, not silent success.
testsprite <typo> --helpandtestsprite help <typo>printed the root help and exited 0, so a typo in a script looked like a successful run. Both now exit 5 (VALIDATION_ERROR) and name the unknown command. agent listis readable. The text table dropped theSTATUS/MODEcolumns in favour ofAGENT/SKILL/PATH, folding maturity into an(exp.)tag, andagent install/agent setupnow print the reload hint the editor actually needs.--output jsonis unchanged, so anything scripting against it keeps working.