From 3aa966d3edd8eb82c4c2d5d702d0ee63e9376e72 Mon Sep 17 00:00:00 2001 From: Atchyut Pulavarthi Date: Thu, 1 Oct 2026 16:55:52 +0530 Subject: [PATCH] chore(cli): bump api-contracts to 0.74.0 --- .changeset/api-contracts-0-74-0.md | 7 +++++++ bun.lock | 4 ++-- package.json | 2 +- skills/qawolf-cli/SKILL.md | 3 ++- skills/qawolf-cli/references/run-results.md | 12 +++++++++--- src/commands/qawolfCliRunResults.template.md | 6 ++++-- 6 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 .changeset/api-contracts-0-74-0.md diff --git a/.changeset/api-contracts-0-74-0.md b/.changeset/api-contracts-0-74-0.md new file mode 100644 index 000000000..1611de73f --- /dev/null +++ b/.changeset/api-contracts-0-74-0.md @@ -0,0 +1,7 @@ +--- +"@qawolf/cli": minor +--- + +Upgrades `@qawolf/api-contracts` to `0.74.0`. + +`qawolf run getAttemptArtifacts --attempt-id ` reads metadata and signed artifact URLs for a finished run attempt. `qawolf run find` includes failed-attempt discovery metadata. `qawolf run get` includes attempt IDs and reports when a run was superseded by a newer run. diff --git a/bun.lock b/bun.lock index 87b3061b0..f9648081d 100644 --- a/bun.lock +++ b/bun.lock @@ -8,7 +8,7 @@ "@clack/prompts": "1.5.1", "@napi-rs/keyring": "1.3.0", "@oxc-node/core": "0.1.0", - "@qawolf/api-contracts": "0.73.0", + "@qawolf/api-contracts": "0.74.0", "@qawolf/emails": "1.1.1", "@qawolf/flow-targets": "1.0.0", "@qawolf/flows": "0.1.4", @@ -462,7 +462,7 @@ "@puppeteer/browsers": ["@puppeteer/browsers@2.13.2", "", { "dependencies": { "debug": "^4.4.3", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", "semver": "^7.7.4", "tar-fs": "^3.1.1", "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" } }, "sha512-5EUZSUIc37H6aIXyWO0Z4y8NlF8NnjgmqeQgOGiswAU7pY0HOo16ho4+alIWmSfdZnjqBRawMsP3I5YqLSn6kw=="], - "@qawolf/api-contracts": ["@qawolf/api-contracts@0.73.0", "", { "dependencies": { "tslib": "^2.5.3" }, "peerDependencies": { "zod": "^4.1.11" } }, "sha512-T5w/Iv18MjBTyDO5wyPKRx/NPVBqDzWzSXD2tSJ5MqtR4BsRasvCmL5teaiz1HRp/gjW15PnoI3YjICerysVPQ=="], + "@qawolf/api-contracts": ["@qawolf/api-contracts@0.74.0", "", { "dependencies": { "tslib": "^2.5.3" }, "peerDependencies": { "zod": "^4.1.11" } }, "sha512-CK/mK5yYgSiqw7iNBhF5grCBgTGyQRSY1T3qKeg5zQo8A4Osn4HzSourxTygWLiKIdcJH2zHWYluNUPUJePylw=="], "@qawolf/emailer-types": ["@qawolf/emailer-types@1.1.0", "", { "dependencies": { "email-addresses": "^5.0.0", "tslib": "^2.5.3", "zod": "^4.1.11", "zod-form-data": "^3.0.1" } }, "sha512-7cX+e31L9dpO8fntQ2cfSMt/1Lla/yUjaLUr/KLpXuscBSajy7CgNzjAGURa1KsCcxz7n+9PGQw6cM3RlC1bSg=="], diff --git a/package.json b/package.json index ce7beecf5..2f20089c1 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "@clack/prompts": "1.5.1", "@napi-rs/keyring": "1.3.0", "@oxc-node/core": "0.1.0", - "@qawolf/api-contracts": "0.73.0", + "@qawolf/api-contracts": "0.74.0", "@qawolf/emails": "1.1.1", "@qawolf/flow-targets": "1.0.0", "@qawolf/flows": "0.1.4", diff --git a/skills/qawolf-cli/SKILL.md b/skills/qawolf-cli/SKILL.md index 77d1d12e1..da6032fce 100644 --- a/skills/qawolf-cli/SKILL.md +++ b/skills/qawolf-cli/SKILL.md @@ -178,8 +178,9 @@ that `url`; never guess a route and never send a repository link in its place. | `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. | | `qawolf run create` | write | Create a run for the selected flows and/or tags in an environment. | | `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. | -| `qawolf run find` | read | List an environment's recent runs, newest first. | +| `qawolf run find` | read | List an environment's recent runs, newest first, including failed-attempt discovery metadata. | | `qawolf run get` | read | Get a run's status, per-flow results, links, and how many of its bugs are blocking. | +| `qawolf run getAttemptArtifacts` | read | Get metadata and signed artifact URLs for one finished run attempt. | | `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. | | `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. | | `qawolf runner act` | write | Perform one raw action on a runner's screen. A browser runner takes click, double_click, scroll, move, drag, keypress, navigate and type; a mobile runner takes tap, swipe, fill and type. A browser runner answers mobile actions with action-not-supported-on-browser; a mobile runner answers the other browser actions with action-not-supported-on-mobile. Use - to read a whole action as JSON from stdin | diff --git a/skills/qawolf-cli/references/run-results.md b/skills/qawolf-cli/references/run-results.md index cbab82c18..062deb4e3 100644 --- a/skills/qawolf-cli/references/run-results.md +++ b/skills/qawolf-cli/references/run-results.md @@ -59,8 +59,10 @@ A run that has been requested but not yet created answers exit `8` too, and says it is still being created. That one clears on its own, so read the message rather than the code before deciding whether to poll. -Poll `status` until it reaches `passed`, `failed` or `canceled`. The other -values mean the run is still going. +Poll `status` until it reaches `passed`, `failed`, `canceled` or `superseded`. +When it is `superseded`, this run will never change again. Read the replacement +run in `supersededBy.runId` for the verdict. `queued` and `running` mean the run +is still going. ## Fields a passing run does not show you @@ -185,13 +187,17 @@ Every documented field of the `run.get` response. `[]` marks an array, so - `git.commitUrl` — Link to the commit on the code host. - `needsReview` — True once every flow has finished its attempts and at least one failed flow still has no diagnosis, including one whose investigation carried over to a later run. `status` stays `running` until that failure is diagnosed, so a caller that is not waiting for a diagnosis can stop polling here and read the run's failed flows. - `runId` — The run this response describes. Treat it as canonical: it can differ from the id you asked for. A deploy notification returns a run id before the run exists, and if a second notification for the same commit is folded into an earlier run, that id resolves to the earlier run instead. -- `status` — One of: queued, running, passed, failed, canceled +- `status` — One of: queued, running, passed, failed, canceled, superseded +- `supersededBy` — The run that replaced this one, present only when `status` is `superseded`. A newer deployment to the same branch and environment (and service, when the deployment named one) cancels the older run's unfinished flows and takes over. Deduplication ignores the commit, so the replacement may be testing a later commit than this run did. Only the direct replacement is named; that run can itself be superseded. +- `supersededBy.runId` — The id of the run. +- `supersededBy.url` — Absolute URL of the replacement run's page. - `blockingBugCount` — How many bugs this run found are blocking: still open, and priority urgent, high, or unprioritized — unprioritized counts because nobody has ruled it out yet. This is what `failed` is derived from, so it explains a failure rather than adding a second verdict: gate on `status`, then read this to say how many bugs are holding the build. It counts a bug filed against a later run by an investigation that carried over from this one, and it drops a bug once that bug is resolved. - `flows` — The run's flows, ordered alphabetically by name. Only the flows matching flowStatuses when the request set it. - `flows[].attempts` — The flow's finished execution attempts, oldest first, including manual Wolf Browser attempts. Present once at least one attempt has finished, so a flow that passed after retries also lists its failed attempts. Artifact URLs appear only on automated attempts that reached a verdict, stay valid for at least a day (call run.get again for fresh ones), and can return 404 when the attempt did not produce that artifact. - `flows[].attempts[].logsUrl` — Signed URL for the attempt's execution logs. - `flows[].attempts[].traceUrl` — Signed URL for the attempt's Playwright trace (a trace.zip; open it with `npx playwright show-trace`). - `flows[].attempts[].videoUrl` — Signed URL for the attempt's screen recording. +- `flows[].attempts[].attemptId` — The id of the run attempt. - `flows[].attempts[].kind` — One of: automated, manual - `flows[].attempts[].startedAt` — Absent when the attempt failed before it could start. - `flows[].attempts[].status` — One of: passed, failed, canceled diff --git a/src/commands/qawolfCliRunResults.template.md b/src/commands/qawolfCliRunResults.template.md index 76b7fd1a0..8f91f293b 100644 --- a/src/commands/qawolfCliRunResults.template.md +++ b/src/commands/qawolfCliRunResults.template.md @@ -59,8 +59,10 @@ A run that has been requested but not yet created answers exit `8` too, and says it is still being created. That one clears on its own, so read the message rather than the code before deciding whether to poll. -Poll `status` until it reaches `passed`, `failed` or `canceled`. The other -values mean the run is still going. +Poll `status` until it reaches `passed`, `failed`, `canceled` or `superseded`. +When it is `superseded`, this run will never change again. Read the replacement +run in `supersededBy.runId` for the verdict. `queued` and `running` mean the run +is still going. ## Fields a passing run does not show you