QA.army CLI
Use qa-army to manage saved Tests and request Web Runs from your terminal or
coding agent. Runs execute in QA.army and use the same Workspace permissions,
saved Tests, results, and evidence as the app. qa is a shorter command alias.
Install and discover commands
Install Node.js 22 or newer, then install the versioned package from the official CLI releases:
These examples use release 0.2.11. The package is distributed through GitHub
releases. Use capabilities to check the commands supported by your installation.
It works without signing in and distinguishes supported commands from capability
requests. A capability request does not perform the requested operation.
Authorize access
Interactive agent registration needs your operating system’s credential store: macOS Keychain, Windows Credential Manager, or Secret Service and the desktop portal on Linux. See the authentication guide for platform requirements.
Complete sign-in in the browser opened by the CLI, then enter the short-lived
code at the CLI’s hidden prompt. Keep that code and all credentials out of chat,
Test files, and shell arguments. If the credential store is unavailable, fix it
before continuing; do not save credentials in a plain-text file. status reports
local credential metadata; it does not test an authenticated API request.
For scripts, status exits 0 when a credential is available and intentionally
exits 1 when the result is unauthenticated.
After you complete the claim, reuse the same registered agent identity to discover Workspaces and Projects, manage Test Groups, create and update saved Tests, and create, start, inspect, or cancel Runs. A second API key is not required for these operations. Workspace membership is checked on every request.
Registration does not authorize every command listed by capabilities.
Test deletion, Test Account metadata and credentials, Live View, account
administration, and integration consent remain separate user operations.
Signing in to QA.army also does not sign
the test browser into your application; use a governed Test Account for that.
Workspace Owners can also use the same claimed identity to select Test Groups
for an existing connected GitHub deployment watch. Use prs watch to read its
current selection and prs watch-update to replace the complete selection, then
read it back. See regression watch configuration
for the request body and permission limits. This does not connect an integration
or grant consent.
Select an existing Project
Replace the example identifiers below with complete IDs returned by QA.army:
Confirm the Project’s target before making a change. Supply the relevant Workspace or Project ID on each command when working across several Projects. An identifier never grants access to another Workspace.
For a new Project, first prepare a Test file as described below. With your
registered agent, use setup only when you also intend to start a Run:
setup creates or reuses the Project and Test, starts one Run, prints its
live URL, and waits for a result. Each explicit invocation requests a new Run.
Use a target QA.army can reach; a local-only address is not a supported target.
It exits 0 only when setup completes and the Run is PASSED. A valid terminal
result of FAILED, ERROR, or CANCELLED exits 1, as do setup, API, and
waiting errors. Inspect the emitted receipts to distinguish the Test result from
a command error.
Save a Test without running it
Save this example as test.json and adapt the instructions to your application:
The boolean settings and each step’s enabled flag are required. Use dedicated
Test Accounts for login steps; never put passwords or tokens in this file.
This saves the definition and returns its Test ID and version. It does not
start a Run. The shell examples use a POSIX shell; in PowerShell, pass the file
with --input (Get-Content -Raw test.json). There is no --input-file flag.
Read Write Reliable Test Steps before adding more
coverage.
Organize and update saved coverage
Use a Test Group for a family of journeys, such as Onboarding:
Use the returned Group ID and the Test’s current version. Send the complete
editable Test definition with every step and setting preserved; use group_id
to move it and enabled: false to keep a Test with missing prerequisites out of
execution. A conflict means another editor changed the Test: reload and reconcile
before saving. Updating a definition does not start a Run or alter earlier results.
Run one saved Test
Start execution only when intended; it can interact with your application and use your Workspace’s Run allowance.
--timeout and --interval are milliseconds. This command creates a Run,
starts it, and waits for a terminal result. With --wait, exit code 0 means
PASSED; FAILED, ERROR, and CANCELLED return 1. Input, authentication,
API, and waiting errors also return 1, so inspect the receipt or error message.
The completed response contains command_status and a nested run receipt;
read that receipt’s status and run_url.
Without --wait, a successful response only confirms that the Run started.
For explicit control of each operation:
The first command creates a READY Run; it does not execute the Test. Use the
returned Run ID in the following commands.
Run selected Tests from a Group
Read the Group and its Tests first. Save an explicit selection of 1–20 unique,
enabled Tests and their current versions in selection.json:
Replace the abbreviated ID with a complete Test ID, then run:
Every selected Test must still belong to that Project and Group, remain enabled, and match the supplied version. Each becomes a separate Run and can consume the normal Run allowance. The command checks all selected definitions before creating Runs, then verifies each created Run matches its selected Test version before starting any. A server that cannot supply that version proof is blocked.
The receipt is DISPATCHED or INCOMPLETE, never a passing suite result.
DISPATCHED returns exit code 0; INCOMPLETE returns 1. Inspect every returned
Run’s terminal result and evidence. An interruption may leave some Runs ready or
started: reconcile their IDs before retrying, preserve the same selection and
request key. On a preparation failure before dispatch, the client attempts to
cancel known ready Runs; inspect each cleanup outcome and cancel any remaining
unused ready Runs explicitly. Do not replace the selection
with a fresh list on retry or start a child that is already beyond READY.
Inspect progress and evidence
watch reads one batch of events. Continue from the returned next_after
with --after; it is not a continuous stream. wait polls an existing Run.
Its exit code confirms the read succeeded, including when the final Run is
FAILED or ERROR; inspect status before making a release decision.
runs evidence lists finalized artifact metadata and stable evidence IDs. To
download an authorized artifact, choose its evidence ID and a new local filename:
The command creates a private file without overwriting an existing file and verifies its size and SHA-256 checksum. Downloads are limited to 128 MiB. A failed download empties the file it created; it does not leave partial evidence presented as valid. The receipt omits the temporary access URL. Keep downloaded evidence private and do not share access capabilities.
Open the returned run_url to review the Run in the app, including available
screenshots and recordings. A successful download proves artifact integrity,
not that the Test passed. Inspect the Run verdict and required screenshots.
Stop an authorized Run with qa-army runs cancel --run run_..., then read its
status again. Your claimed agent identity can request cancellation within its
Workspace access. The cancellation request alone is not a terminal result.
Use output in scripts and agents
Successful command output is JSON by default; --json is accepted. Read the
resource’s status, not just the command’s exit code. setup and authentication
can emit several JSON receipts, while command errors are text on stderr. Do not
assume every command produces one JSON object or a JSON error envelope.
Preserve resource IDs and event cursors before continuing. If a wait times out,
the remote Run may still be active: inspect it with runs get or runs wait.
Do not repeat setup or tests run to reconnect; those commands request a new
Run. If no Run ID was received, inspect runs list --test tst_... and the app
before deciding whether another execution is needed.
Run history returns a page of results. Use runs list --test tst_... --limit 20,
then pass its next_before as --before for the next page, until it is null.
A first page is not necessarily the complete history.
The basic Test and Run commands above do not expose a caller-supplied
--request-key flag. For explicit retry control, use the API’s documented
idempotency contract in Coding Agents.
Troubleshoot
Direct Web testing is available. Native Android, iOS, and Desktop execution are not generally available. See CI and Deployments for script boundaries and Results and Evidence for result review.
