@qawolf/cli 1.31.0 → 1.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +1818 -618
- package/dist/runner-sdk.js +1199 -374
- package/package.json +2 -2
- package/skills/qawolf-cli/SKILL.md +13 -2
- package/skills/qawolf-cli/references/runner.md +25 -16
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qawolf/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.33.0",
|
|
4
4
|
"description": "Run and manage QA Wolf flows from the terminal, CI, or an AI agent",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"automation",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"@clack/prompts": "1.5.1",
|
|
72
72
|
"@napi-rs/keyring": "1.3.0",
|
|
73
73
|
"@oxc-node/core": "0.1.0",
|
|
74
|
-
"@qawolf/api-contracts": "0.
|
|
74
|
+
"@qawolf/api-contracts": "0.64.0",
|
|
75
75
|
"@qawolf/emails": "1.1.1",
|
|
76
76
|
"@qawolf/flow-targets": "1.0.0",
|
|
77
77
|
"@qawolf/flows": "0.1.4",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: qawolf-cli
|
|
3
|
-
description: Manage QA Wolf through the qawolf CLI. Use when asked to create, update, or list coverage requests, bug reports, or maintenance reports; start a run of flows or tags on the QA Wolf platform or read a run's results; list, set, or delete environment variables; manage environments, flows, or tags;
|
|
3
|
+
description: Manage QA Wolf through the qawolf CLI. Use when asked to create, update, or list coverage requests, bug reports, or maintenance reports; start a run of flows or tags on the QA Wolf platform or read a run's results; list, set, or delete environment variables; manage environments, flows, or tags; run or list flows locally; authenticate; install the local runtime; or drive a live cloud browser (launch a runner, screenshot it, click and type on it, read its recorder) from a shell.
|
|
4
4
|
license: Apache-2.0
|
|
5
5
|
compatibility: Requires the qawolf CLI on PATH. Install it from @qawolf/cli or use a standalone binary from GitHub Releases.
|
|
6
6
|
---
|
|
@@ -131,7 +131,11 @@ that `url`; never guess a route and never send a repository link in its place.
|
|
|
131
131
|
| `qawolf auth logout` | local | Remove stored credentials |
|
|
132
132
|
| `qawolf auth switch` | local | Choose which workspace to work in |
|
|
133
133
|
| `qawolf auth whoami` | read | Show authentication status |
|
|
134
|
-
| `qawolf
|
|
134
|
+
| `qawolf codeHostIntegration find` | read | List the workspace's code host integrations (GitHub or GitLab). A connected integration lets QA Wolf read repositories and receive the code host's webhooks. codeHostIntegration.listRepositories pages the repositories each integration covers. |
|
|
135
|
+
| `qawolf codeHostIntegration listRepositories` | read | List the repositories the workspace's code host integrations cover, alphabetical by full name. The list reflects the last sync from the code host; codeHostIntegration.find lists the integrations themselves. |
|
|
136
|
+
| `qawolf deployment find` | read | List the deployments QA Wolf has received for the workspace, newest first. A deployment arrives through a code host integration's webhook or through deployment.reportStatus, and is what a deployment trigger evaluates against. deployment.listTriggerEvaluations reports each trigger's verdict for one deployment. |
|
|
137
|
+
| `qawolf deployment listTriggerEvaluations` | read | List the per-trigger verdicts recorded when a deployment was evaluated against the workspace's triggers. Each verdict says whether the trigger matched, did not match with the reason per condition, or was never considered and why. Verdicts are a snapshot from evaluation time: editing or deleting a trigger later does not change them. |
|
|
138
|
+
| `qawolf deployment reportStatus` | write | Report a deployment lifecycle status. A deployment's first success report evaluates global triggers asynchronously, and it is the only report that does: a trigger added or unpaused later does not make an already reported deployment evaluate again. Report that deployment under a new providerDeploymentId to evaluate it against the current triggers. The response contains the deployment only, not the resulting runs. |
|
|
135
139
|
| `qawolf doctor` | local | Diagnose problems running flows locally |
|
|
136
140
|
| `qawolf email find` | read | List the workspace's inbox, or its sent mail, newest first. Read a message body with email.get. |
|
|
137
141
|
| `qawolf email get` | read | Read one email of the workspace, with its plain text and HTML bodies. Use it to pull a sign-in code or a verification link out of a message. |
|
|
@@ -166,13 +170,18 @@ that `url`; never guess a route and never send a repository link in its place.
|
|
|
166
170
|
| `qawolf issue get` | read | Get an issue by id. |
|
|
167
171
|
| `qawolf issue removeFlows` | write | Remove flows from a coverage request owned by the caller's team. Flows the request does not cover are left alone. Bug and maintenance reports link to flows through the runs that reproduce them, so their flows cannot be set directly. |
|
|
168
172
|
| `qawolf issue update` | write | Update an issue owned by the caller's team. Omitted fields remain unchanged. |
|
|
173
|
+
| `qawolf legacyTrigger find` | read | List a workspace's legacy per-environment triggers; trigger.find lists the current ones. For migration only; it goes when legacy triggers go. adaptiveFlowSelection becomes a generativeSuite action, which takes no tags. |
|
|
174
|
+
| `qawolf legacyTrigger pause` | write | Pause one legacy trigger, the older per-environment kind, so it stops firing; use trigger.pause for a current one. Its copies in pull request environments pause too. For migration only; it goes when legacy triggers go. |
|
|
175
|
+
| `qawolf legacyTrigger resume` | write | Resume one legacy trigger, the older per-environment kind; use trigger.resume for a current one. Its copies in pull request environments resume too, and a scheduled one jumps to the next upcoming slot even if it was not paused. For migration only; it goes when legacy triggers go. |
|
|
169
176
|
| `qawolf run create` | write | Create a run for the selected flows and/or tags in an environment. |
|
|
170
177
|
| `qawolf run diagnose` | write | Diagnose failed flows in a run as reproductions of a bug or maintenance report owned by the caller's team. The issue's type selects the diagnosis. Each flow must have failed in the run. A flow that is already diagnosed moves to this issue. The diagnosis appears on the run, and the reproduction appears under the issue's reproductions. Coverage requests cannot be diagnosed; use issue.addFlows to cover flows instead. |
|
|
171
178
|
| `qawolf run find` | read | List an environment's recent runs, newest first. |
|
|
172
179
|
| `qawolf run get` | read | Get a run's status, per-flow results, and links. |
|
|
173
180
|
| `qawolf run reattempt` | write | Request new attempts for a run's flows, in the same run. A flow is eligible once its result is failed or canceled and QA Wolf's automatic retries have finished. A fully investigated run no longer accepts reattempts. Attempts run with the latest flow code. Poll run.get for results. |
|
|
174
181
|
| `qawolf run stop` | write | Stop a run, including its queued flows and automatic retries. Stopping is asynchronous and can update run-status messages and commit statuses in connected integrations. Repeated requests are safe, and finished runs keep their results. A run that is still being created returns not found; retry once run.get returns the run. If run.get returns a different runId, use that ID. Poll run.get for results. |
|
|
182
|
+
| `qawolf run triage` | read | Prototype. Ask Jev, a TypeSafe System One model, whether a flow failure in a run is a bug in the product or a test that needs maintenance. Compares the failing attempt with the flow's last passing run in the same environment. Records nothing. |
|
|
175
183
|
| `qawolf runner act` | write | Perform one raw action on a runner's screen: click, double_click, scroll, move, drag, keypress, navigate or type. Use - to read a whole action as JSON from stdin. On a mobile runner only click (button left), drag and type have a touchscreen equivalent; the rest answer action-not-supported-on-mobile |
|
|
184
|
+
| `qawolf runner actions` | write | Perform a sequence of up to ten raw actions on a runner's screen in one request, as a JSON array of the same actions `runner act` takes. Use - to read the array from stdin. Actions run back to back, so batch only steps whose targets are on the screen you last saw, and end the sequence at the step that changes the page. Each result carries an effect: performed, not-performed, or unknown when the runner stopped answering and the action may have landed |
|
|
176
185
|
| `qawolf runner events` | read | Print a runner's journal, one entry per line. QA Wolf writes console, recorder, run-events, run-logs, run-status |
|
|
177
186
|
| `qawolf runner exec` | write | Evaluate a snippet against a runner's live page. Use - to read the snippet from stdin |
|
|
178
187
|
| `qawolf runner highlight-selector` | write | Highlight what a selector matches on a runner's live page, so the next screenshot shows it. Omit the selector to clear the highlight |
|
|
@@ -192,6 +201,8 @@ that `url`; never guess a route and never send a repository link in its place.
|
|
|
192
201
|
| `qawolf runner screenshot` | read | Save a JPEG of an interactive runner's screen to a file, or write it to stdout with --out - |
|
|
193
202
|
| `qawolf runner stop-run` | write | Stop what a runner is currently executing, leaving the runner up |
|
|
194
203
|
| `qawolf runner terminate` | write | End an interactive runner, and the pod it runs on with it |
|
|
204
|
+
| `qawolf skill get` | read | Read a QA Wolf skill: the instructions a coding agent follows for one kind of QA Wolf work. The reply carries the skill's SKILL.md and every file under its references directory, so nothing else has to be fetched for it. Read the skill before starting the work it covers and follow it. A link in the reply of the form ../<skill>/SKILL.md names another skill, which this call reads by that name. |
|
|
205
|
+
| `qawolf skill list` | read | List the QA Wolf skills, each with its name and the description that says when to use it. A skill is the instructions a coding agent follows for one kind of QA Wolf work, such as onboarding an application, creating a flow, repairing a failing flow, or setting up triggers. Call this before any QA Wolf work, pick the skill whose description matches the request, and read it with skill.get. |
|
|
195
206
|
| `qawolf tag create` | write | Create a tag on the caller's team. Tags select flows in run.create. |
|
|
196
207
|
| `qawolf tag list` | read | List the team's tags, alphabetical by name. Tag names select flows in run.create. |
|
|
197
208
|
| `qawolf trigger create` | write | Create a trigger. A schedule trigger runs a named set of flows on a cadence; a deployment trigger runs when a matching deployment is reported. |
|
|
@@ -119,17 +119,14 @@ and says so on stderr. Everything else on this page waits for a run.
|
|
|
119
119
|
|
|
120
120
|
Retry on the exit code, not on the message text:
|
|
121
121
|
|
|
122
|
-
- `4` is transient. The screen is up but cannot serve this instant: restarting
|
|
123
|
-
|
|
124
|
-
or two, and bound the retries.
|
|
122
|
+
- `4` is transient, with one exception. The screen is up but cannot serve this instant: restarting after a display-size change, or busy with another request. Retry in a second or two, and bound the retries. The exception is a command that changes something, where a `4` can instead mean the answer was lost with the work in flight. For `act` and `actions`, take a screenshot first and repeat only what the screen says did not happen. For `run`, poll `run-status` instead of submitting again, since a second submission risks a second billed run (see Running a flow). For `exec`, check the effect the snippet was meant to have before running it again.
|
|
123
|
+
- `6` means the work ran out of the time it is given. A `runner actions` sequence leaves by the worst thing that happened to any one of its actions — an effect nobody can confirm (`4`) first, then running out of time (`6`), then a refusal (`2`), then an action that plainly did not happen (`1`) — so a sequence that did not reach every action exits `6` only when nothing worse also went wrong. Whatever the code, the message names the last action that took effect, and only what follows it goes in a new request.
|
|
125
124
|
- `8` means there is no such runner. It was never launched, or it was
|
|
126
125
|
terminated, or it idled out. Retrying never brings one back, so stop and
|
|
127
126
|
launch the id or name one that is running. The message says which runner was
|
|
128
127
|
meant and whether `--runner`, `QAWOLF_RUNNER_ID` or this directory's stored
|
|
129
128
|
default chose it — read that line before you pick an id to launch.
|
|
130
|
-
- `2` will not clear on its own.
|
|
131
|
-
run a flow, or the runner has no browser at all, so launch with
|
|
132
|
-
`--name playwright` instead. The message says which.
|
|
129
|
+
- `2` will not clear on its own. Nothing has run on this runner yet, so run a flow; or the runner has no browser at all, so launch with `--name playwright` instead; or the action has no touchscreen equivalent on a mobile runner, so reach for one that has. A `runner actions` sequence also exits `2` before it sends anything, for an argument that is not a JSON array, an array of more than ten actions, and `--screenshot` flags that contradict each other. The message says which.
|
|
133
130
|
|
|
134
131
|
## Seeing and acting: the loop is yours
|
|
135
132
|
|
|
@@ -166,17 +163,9 @@ you a picture of why the click missed. A `4` whose message starts with
|
|
|
166
163
|
`screenshot`, never send the action again to get it. As with
|
|
167
164
|
`screenshot --out -`, a terminal on stdout is refused.
|
|
168
165
|
|
|
169
|
-
Coordinates are pixels on the same screenshot you just read. The runner serves
|
|
170
|
-
one see-or-act request at a time, so decide what to do next from each answer
|
|
171
|
-
rather than firing several. Bounds are checked before anything is sent, so an
|
|
172
|
-
over-long `--text` or an out-of-range coordinate comes back immediately naming
|
|
173
|
-
the limit instead of occupying the runner and then failing.
|
|
166
|
+
Coordinates are pixels on the same screenshot you just read. The runner serves one see-or-act request at a time, so never have two in flight; when the next few steps are already known, send them as one `runner actions` sequence instead of one request after another. Bounds are checked before anything is sent, so an over-long `--text` or an out-of-range coordinate comes back immediately naming the limit instead of occupying the runner and then failing.
|
|
174
167
|
|
|
175
|
-
`act`, `run` and `exec` are the
|
|
176
|
-
taken effect. On a `4` from `act`, take a screenshot before repeating a click.
|
|
177
|
-
`exec`'s message says the snippet could not be evaluated, but a lost answer
|
|
178
|
-
looks the same from outside, so treat a `4` from a snippet that changes something
|
|
179
|
-
as "may have run" rather than "did not run".
|
|
168
|
+
`act`, `actions`, `run` and `exec` are the commands whose lost answer may still have taken effect. On a `4` from `act` or `actions`, take a screenshot before repeating a click. `exec`'s message says the snippet could not be evaluated, but a lost answer looks the same from outside, so treat a `4` from a snippet that changes something as "may have run" rather than "did not run".
|
|
180
169
|
|
|
181
170
|
A mobile runner has a touchscreen, not a mouse, so only three of the eight
|
|
182
171
|
actions have a touchscreen equivalent and go through: `click` with
|
|
@@ -186,6 +175,26 @@ tap focused. The rest — `double_click`, `scroll`, `move`, `keypress`,
|
|
|
186
175
|
something approximate. `navigate` is the one to watch for, since it works on a
|
|
187
176
|
browser runner without a run first but has no meaning on mobile at all.
|
|
188
177
|
|
|
178
|
+
### Several steps in one request: `runner actions`
|
|
179
|
+
|
|
180
|
+
`qawolf runner actions '<json array>'` performs up to ten of those same actions back to back in one request, for the steps you already know: click the field, type into it, press Enter. One round trip instead of three, with no delay to guess at between them, and `-` reads the array from stdin the way `act -` reads one action.
|
|
181
|
+
|
|
182
|
+
```sh
|
|
183
|
+
qawolf runner actions '[{"type":"click","button":"left","x":480,"y":260},{"type":"type","text":"me@example.com"},{"type":"keypress","keys":["Enter"]}]' --screenshot after-login.jpg
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Batch only steps whose targets are all on the screen you last saw and are not moved by the steps before them, and make the step that changes the page — a submit, a navigation, opening a menu — the last one. Then read the frame and decide the next batch from it.
|
|
187
|
+
|
|
188
|
+
`--screenshot after.jpg` writes the screen after the last action, as `act --screenshot` does, and `-` puts those bytes on stdout with the confirmation on stderr. Stdout then carries the image and nothing else, so `-` trades the per-action results below for the frame: give `--screenshot` a file path whenever you need to read `effect` per action. `--screenshot-mode each --screenshot step.jpg` writes one frame per action instead, `step-0.jpg`, `step-1.jpg` and so on; each is a full image, so keep those sequences short.
|
|
189
|
+
|
|
190
|
+
The answer holds one entry per action reached, and the field to read on each is `effect`:
|
|
191
|
+
|
|
192
|
+
- `performed` means the runner did it.
|
|
193
|
+
- `not-performed` means the runner answered that it did not take effect.
|
|
194
|
+
- `unknown` means the runner stopped answering with the action in flight, or its screen went quiet mid-action, so it may have taken effect. Take a screenshot before repeating anything from that step on, and never send it again blind.
|
|
195
|
+
|
|
196
|
+
The sequence stops at the first action that fails. `--continue-on-failure` carries on past one that reached the runner and did not take effect, which is only safe for actions that do not depend on each other: a `type` after a failed `click` goes to whatever has focus. A runner that cannot be reached, a screen that cannot serve, or running out of time ends the sequence either way, and the message names every action that did not succeed.
|
|
197
|
+
|
|
189
198
|
## The recorder: what you cannot get from pixels
|
|
190
199
|
|
|
191
200
|
`qawolf runner events recorder` is the capability that has no equivalent in a
|