@qawolf/cli 1.32.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qawolf/cli",
3
- "version": "1.32.0",
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.53.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",
@@ -131,6 +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 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. |
134
139
  | `qawolf doctor` | local | Diagnose problems running flows locally |
135
140
  | `qawolf email find` | read | List the workspace's inbox, or its sent mail, newest first. Read a message body with email.get. |
136
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. |
@@ -165,13 +170,18 @@ that `url`; never guess a route and never send a repository link in its place.
165
170
  | `qawolf issue get` | read | Get an issue by id. |
166
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. |
167
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. |
168
176
  | `qawolf run create` | write | Create a run for the selected flows and/or tags in an environment. |
169
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. |
170
178
  | `qawolf run find` | read | List an environment's recent runs, newest first. |
171
179
  | `qawolf run get` | read | Get a run's status, per-flow results, and links. |
172
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. |
173
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. |
174
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 |
175
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 |
176
186
  | `qawolf runner exec` | write | Evaluate a snippet against a runner's live page. Use - to read the snippet from stdin |
177
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 |
@@ -191,6 +201,8 @@ that `url`; never guess a route and never send a repository link in its place.
191
201
  | `qawolf runner screenshot` | read | Save a JPEG of an interactive runner's screen to a file, or write it to stdout with --out - |
192
202
  | `qawolf runner stop-run` | write | Stop what a runner is currently executing, leaving the runner up |
193
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. |
194
206
  | `qawolf tag create` | write | Create a tag on the caller's team. Tags select flows in run.create. |
195
207
  | `qawolf tag list` | read | List the team's tags, alphabetical by name. Tag names select flows in run.create. |
196
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
- after a display-size change, or busy with another request. Retry in a second
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. Either nothing has run on this runner yet, so
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 three commands whose lost answer may still have
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