@qawolf/cli 1.27.0 → 1.29.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 +725 -65
- package/dist/runner-sdk.js +674 -25
- package/package.json +2 -2
- package/skills/qawolf-cli/SKILL.md +13 -4
- package/skills/qawolf-cli/references/runner.md +19 -11
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qawolf/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.29.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.53.0",
|
|
75
75
|
"@qawolf/emails": "1.1.1",
|
|
76
76
|
"@qawolf/flow-targets": "1.0.0",
|
|
77
77
|
"@qawolf/flows": "0.1.4",
|
|
@@ -125,7 +125,7 @@ that `url`; never guess a route and never send a repository link in its place.
|
|
|
125
125
|
<!-- prettier-ignore -->
|
|
126
126
|
| Command | Kind | What it does |
|
|
127
127
|
| --- | --- | --- |
|
|
128
|
-
| `qawolf agent get` | read | Monitor a QA Wolf AI session by reading its status and replies. After agent.send, share the returned session URL before monitoring. Wait 30 to 60 seconds between checks; do not call this in a tight loop.
|
|
128
|
+
| `qawolf agent get` | read | Monitor a QA Wolf AI session by reading its status and replies. After agent.send, share the returned session URL before monitoring. Wait 30 to 60 seconds between checks; do not call this in a tight loop. Pass the nextCursor from one response as the cursor on the next check; it then reads only what is new, and only for the session that minted it. Continue monitoring silently when the status is unchanged and no replies come back; do not narrate waiting, announce the next check, or ask whether to keep monitoring. Report only substantive new progress, questions, blockers, or the final outcome. A status of "waiting-for-you" means the last reply is a question the work is blocked on, and answering it with agent.send is what unblocks it. Surface an explicit request for user input even if the status still says "working". Include the session URL when reporting a blocker or final outcome. On "completed", stop status checks and verify the requested result before claiming success. For new flows, validation, publication in the target environment, and readiness are separate checks; a Git push or final reply does not prove the flow is active. If every requested result is verified but status remains "working", report the mismatch and stop monitoring. Stop on "failed" or "cancelled" and report any confirmed partial result. |
|
|
129
129
|
| `qawolf agent send` | write | Start or continue work with the QA Wolf AI and return a live session URL to share with the user. Use it to cover a user journey, investigate a failing run, or fix a broken flow. This is the one verb that starts work from nothing: every other write acts on a flow, run or issue that already exists. Returns sessionId, status, and url as soon as the request is accepted; work can take minutes to tens of minutes. After each send, make the next action a normal user-visible assistant message containing the exact returned url, before any tool call or wait. Tool output and internal reasoning do not count as sharing the link. Do not run a timer or monitoring call alongside this send. Acceptance does not mean the work is complete. Then monitor the session with agent.get, reporting new progress, blockers, and the final outcome rather than unchanged status. Send here again to answer a question or add context to the same session. |
|
|
130
130
|
| `qawolf auth login` | local | Authenticate with QA Wolf in a browser or with an API key |
|
|
131
131
|
| `qawolf auth logout` | local | Remove stored credentials |
|
|
@@ -139,7 +139,7 @@ that `url`; never guess a route and never send a repository link in its place.
|
|
|
139
139
|
| `qawolf email listAddresses` | read | List the workspace's inbox addresses, alphabetical. A flow can sign up with a plus-suffixed form of any of them, and email.find reads what arrives. |
|
|
140
140
|
| `qawolf email registerAddress` | write | Register an inbox address for the workspace. Registering an address the workspace already has changes nothing. A refusal names the domains the workspace can use. |
|
|
141
141
|
| `qawolf email send` | write | Send an email from one of the workspace's inbox addresses, for example to exercise a flow that reacts to incoming mail. Returns the sent email; read it back with email.get. |
|
|
142
|
-
| `qawolf environment create` | write | Create an environment on the caller's team and return it in the environment.get shape. |
|
|
142
|
+
| `qawolf environment create` | write | Create an environment on the caller's team and return it in the environment.get shape. This can also create a branch on the team's connected Git provider. |
|
|
143
143
|
| `qawolf environment deleteVariable` | write | Remove one environment variable by name. Succeeds whether or not the variable existed. |
|
|
144
144
|
| `qawolf environment find` | read | List the team's environments, newest first. |
|
|
145
145
|
| `qawolf environment get` | read | Read a single environment's name, kind, standing run health, flow-code branch and reconciliation state, run concurrency limit, and termination state. If flowCodeBranch exists, use its syncStatus for Git reconciliation and read lastSyncedCommitHash only when syncStatus is reconciled. |
|
|
@@ -147,6 +147,8 @@ that `url`; never guess a route and never send a repository link in its place.
|
|
|
147
147
|
| `qawolf environment listVariableNames` | read | Use this to answer which QA Wolf environment variables are available to test code. Returns names only; values never leave the server. |
|
|
148
148
|
| `qawolf environment setVariable` | write | Create or replace an environment variable. If the user asks to create one for "my email" without naming it, use DEFAULT_EMAIL. The value is never returned. |
|
|
149
149
|
| `qawolf environment update` | write | Update an environment owned by the caller's team and return it in the environment.get shape. Omitted fields remain unchanged. |
|
|
150
|
+
| `qawolf file requestDownload` | read | Get a URL for reading a file out of the caller's team storage. Answers 404 when nothing is stored at that path. |
|
|
151
|
+
| `qawolf file requestUpload` | write | Get a URL to put a file into team storage: a spreadsheet of journeys, anything too large to paste. PUT with the returned contentType, then name the path in filePaths. |
|
|
150
152
|
| `qawolf flow addTag` | write | Assign an existing tag to the selected flows. Create tags with tag.create. Flows that already carry the tag are reported in skippedFlows. |
|
|
151
153
|
| `qawolf flow removeTag` | write | Remove a tag from the selected flows. Succeeds whether or not each flow carried the tag; the flows that did not are reported in skippedFlows. |
|
|
152
154
|
| `qawolf flow update` | write | Move a flow between draft and active readiness. The other statuses shown in the app are derived and cannot be set. |
|
|
@@ -169,7 +171,7 @@ that `url`; never guess a route and never send a repository link in its place.
|
|
|
169
171
|
| `qawolf run find` | read | List an environment's recent runs, newest first. |
|
|
170
172
|
| `qawolf run get` | read | Get a run's status, per-flow results, and links. |
|
|
171
173
|
| `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. |
|
|
172
|
-
| `qawolf run stop` | write | Stop a run, including its queued flows and automatic retries. Stopping is asynchronous. 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. |
|
|
174
|
+
| `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. |
|
|
173
175
|
| `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 |
|
|
174
176
|
| `qawolf runner events` | read | Print a runner's journal, one entry per line. QA Wolf writes console, recorder, run-events, run-logs, run-status |
|
|
175
177
|
| `qawolf runner exec` | write | Evaluate a snippet against a runner's live page. Use - to read the snippet from stdin |
|
|
@@ -177,7 +179,7 @@ that `url`; never guess a route and never send a repository link in its place.
|
|
|
177
179
|
| `qawolf runner import-package` | write | Install a package into a runner's live run, so a snippet or a selection can import it |
|
|
178
180
|
| `qawolf runner inspect contexts` | read | List the WebView contexts available, and which is current |
|
|
179
181
|
| `qawolf runner inspect element-html` | read | Print the HTML of the first element a selector matches |
|
|
180
|
-
| `qawolf runner inspect elements` | read | Find elements at a screen point,
|
|
182
|
+
| `qawolf runner inspect elements` | read | Find elements at a screen point, carrying some text, or matching a selector |
|
|
181
183
|
| `qawolf runner inspect page-html` | read | Print the page's HTML, simplified for a model to read |
|
|
182
184
|
| `qawolf runner inspect page-source` | read | Print the current context's page source, as a tree |
|
|
183
185
|
| `qawolf runner inspect session` | read | Print the Appium session's status: ready, or why not |
|
|
@@ -192,6 +194,13 @@ that `url`; never guess a route and never send a repository link in its place.
|
|
|
192
194
|
| `qawolf runner terminate` | write | End an interactive runner, and the pod it runs on with it |
|
|
193
195
|
| `qawolf tag create` | write | Create a tag on the caller's team. Tags select flows in run.create. |
|
|
194
196
|
| `qawolf tag list` | read | List the team's tags, alphabetical by name. Tag names select flows in run.create. |
|
|
197
|
+
| `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. |
|
|
198
|
+
| `qawolf trigger delete` | write | Delete a trigger permanently. The runs it already created are kept. To stop a trigger without losing it, use trigger.pause. |
|
|
199
|
+
| `qawolf trigger find` | read | List the team's triggers, newest first. |
|
|
200
|
+
| `qawolf trigger get` | read | Get one trigger by id. |
|
|
201
|
+
| `qawolf trigger pause` | write | Pause a trigger so it stops firing. Pausing is idempotent. A team whose triggers are all paused reports no trigger activity at all. |
|
|
202
|
+
| `qawolf trigger resume` | write | Resume a paused trigger. A schedule trigger restarts from the next upcoming slot: the slots it missed while paused do not run. |
|
|
203
|
+
| `qawolf trigger update` | write | Replace a trigger's configuration. Every field is written, so read the trigger first and send its configuration back with your changes applied. Pausing is separate: use trigger.pause and trigger.resume. |
|
|
195
204
|
|
|
196
205
|
<!-- commands-table:end -->
|
|
197
206
|
|
|
@@ -232,8 +232,10 @@ qawolf runner inspect session
|
|
|
232
232
|
qawolf runner inspect contexts
|
|
233
233
|
qawolf runner inspect page-source
|
|
234
234
|
qawolf runner inspect page-source --context WEBVIEW_1 # a specific context, not the current one
|
|
235
|
-
qawolf runner inspect elements --
|
|
236
|
-
qawolf runner inspect elements --
|
|
235
|
+
qawolf runner inspect elements --x 240 --y 480
|
|
236
|
+
qawolf runner inspect elements --text "Sign in" --partial
|
|
237
|
+
qawolf runner inspect elements --selector "//android.widget.Button[@text='Sign in']"
|
|
238
|
+
qawolf runner inspect elements --selector "@label == 'Sign in'" --strategy ios-predicate
|
|
237
239
|
```
|
|
238
240
|
|
|
239
241
|
`session` prints one summary line — ready, or why not — because that line is
|
|
@@ -253,15 +255,21 @@ runner yet — run a flow that opens one, then inspect again; `screen-not-ready`
|
|
|
253
255
|
exits `4` and means the session exists but did not answer this instant, or more
|
|
254
256
|
than one is somehow live — retry once, and relaunch the runner if it persists.
|
|
255
257
|
|
|
256
|
-
`elements` takes one of
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
258
|
+
`elements` takes one of three ways to search: whole-pixel `--x`/`--y` on the
|
|
259
|
+
device's own screen, the same coordinates a screenshot is measured in;
|
|
260
|
+
`--text`, which matches exactly unless `--partial` is passed; or `--selector`,
|
|
261
|
+
resolved the same way a screen object's own selector is, with `--strategy`
|
|
262
|
+
naming how (`xpath`, `ios-predicate` or `shadow`; defaults to `xpath`). Prefer
|
|
263
|
+
`--selector` when checking a selector you are about to write: it answers what
|
|
264
|
+
that exact string resolves to, where `--text`/`--x`/`--y` only approximate it.
|
|
265
|
+
The three do not mix — passing flags from more than one at once is refused
|
|
266
|
+
before a runner is addressed rather than silently searching by whichever one
|
|
267
|
+
it picked. An unparseable selector answers `invalid-selector`, exit `2`,
|
|
268
|
+
distinctly from a selector that parsed fine but matched nothing, which answers
|
|
269
|
+
an empty `matches` list, exit `0` — the same distinction `highlight-selector`
|
|
270
|
+
draws on a browser runner. `--context` on `page-source` or `elements` reads a
|
|
271
|
+
context other than the current one — useful once `contexts` has told you which
|
|
272
|
+
are available.
|
|
265
273
|
|
|
266
274
|
A browser runner answers `runner-is-not-mobile` to all four, exit `2`, since
|
|
267
275
|
retrying never helps: launch with `--name android` or `--name ios` instead.
|