@validate.qa/runner 1.0.57 → 1.0.58
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 +24 -6
- package/dist/cli.mjs +24 -6
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -5276,6 +5276,12 @@ var init_auth_state_freshness = __esm({
|
|
|
5276
5276
|
function detectSkippedApiCoverage(steps) {
|
|
5277
5277
|
const allSkipped = steps.length > 0 && steps.every((s) => s.status === "skipped");
|
|
5278
5278
|
if (allSkipped) {
|
|
5279
|
+
if (steps.every((s) => s.skipKind === "fixme")) {
|
|
5280
|
+
return {
|
|
5281
|
+
detected: false,
|
|
5282
|
+
logLine: "All @api tests skipped, but EVERY skip is a deliberate fixme (intentional N/A \u2014 e.g. a UI-only redirect login) \u2014 NOT relabelling CONFIG_ISSUE"
|
|
5283
|
+
};
|
|
5284
|
+
}
|
|
5279
5285
|
return {
|
|
5280
5286
|
detected: true,
|
|
5281
5287
|
error: (
|
|
@@ -75514,12 +75520,11 @@ ${existingScreens.slice(0, 100).map((s) => `- ${s.screenId}${s.name ? ` "${s.nam
|
|
|
75514
75520
|
keyboardRecoveryScreenId = currentScreenId ?? null;
|
|
75515
75521
|
keyboardRecoverySameScreenTurns = 0;
|
|
75516
75522
|
}
|
|
75517
|
-
|
|
75518
|
-
if (keyboardRecoverySameScreenTurns >= 4 && keyboardLikelyOpen && iteration - lastKeyboardRecoveryIteration > 4) {
|
|
75523
|
+
if (keyboardRecoverySameScreenTurns >= 4 && iteration - lastKeyboardRecoveryIteration > 4) {
|
|
75519
75524
|
lastKeyboardRecoveryIteration = iteration;
|
|
75520
75525
|
try {
|
|
75521
75526
|
await (0, mobile_keyboard_js_1.dismissKeyboardForRetry)(driver);
|
|
75522
|
-
log2(" Auto-dismissed the on-screen keyboard (several turns stalled on this screen
|
|
75527
|
+
log2(" Auto-dismissed the on-screen keyboard (several turns stalled on this screen).");
|
|
75523
75528
|
transientDirectives.push("HARNESS NOTE: the on-screen keyboard was just auto-dismissed because multiple turns stalled on this screen \u2014 controls it occluded (e.g. the form submit button) may now be visible. Call mobile_snapshot, then TAP the commit/submit control instead of re-filling fields.");
|
|
75524
75529
|
} catch (error2) {
|
|
75525
75530
|
(0, mobile_driver_errors_js_1.rethrowIfTerminalMobileDriverError)(error2);
|
|
@@ -84295,6 +84300,7 @@ ${args.directive}`);
|
|
|
84295
84300
|
aiResponseCount += 1;
|
|
84296
84301
|
const parsed = parseHealVerdict(content);
|
|
84297
84302
|
if (!parsed) {
|
|
84303
|
+
options.onProgress?.(`Phase 1 attempt ${attempt}: response was not a valid verdict \u2014 granting a recovery turn`);
|
|
84298
84304
|
markRecoverableTurn();
|
|
84299
84305
|
pendingDirective = "Your last response was not valid JSON matching the verdict schema. Return exactly one JSON verdict object.";
|
|
84300
84306
|
continue;
|
|
@@ -350298,7 +350304,7 @@ var require_package4 = __commonJS({
|
|
|
350298
350304
|
"package.json"(exports2, module2) {
|
|
350299
350305
|
module2.exports = {
|
|
350300
350306
|
name: "@validate.qa/runner",
|
|
350301
|
-
version: "1.0.
|
|
350307
|
+
version: "1.0.58",
|
|
350302
350308
|
description: "validate local test runner - execute Playwright tests on your machine, connected to validate.qa cloud.",
|
|
350303
350309
|
bin: {
|
|
350304
350310
|
"validate-runner": "dist/cli.js"
|
|
@@ -351977,6 +351983,12 @@ function isKeyboardAlreadyHiddenError(err) {
|
|
|
351977
351983
|
return /keyboard.*(not|already).*(shown|visible|present|open)|no.*keyboard/i.test(message);
|
|
351978
351984
|
}
|
|
351979
351985
|
async function dismissKeyboard(sessionPath, platform3) {
|
|
351986
|
+
try {
|
|
351987
|
+
const shown = await appiumRequest(`${sessionPath}/appium/device/is_keyboard_shown`, { method: "GET" });
|
|
351988
|
+
if (readValue(shown) === false) return;
|
|
351989
|
+
} catch (err) {
|
|
351990
|
+
if (isAppiumDriverDeadError(err)) throw err;
|
|
351991
|
+
}
|
|
351980
351992
|
if (platform3 === "ANDROID") {
|
|
351981
351993
|
await pressBack(sessionPath);
|
|
351982
351994
|
return;
|
|
@@ -356560,11 +356572,17 @@ var MobileBridgeDriver = class {
|
|
|
356560
356572
|
}
|
|
356561
356573
|
/** Type `value`; pass `bounds` to tap-to-focus first when nothing is focused. */
|
|
356562
356574
|
async type(value, bounds) {
|
|
356563
|
-
return this.runAction(() =>
|
|
356575
|
+
return this.runAction(async () => {
|
|
356576
|
+
await typeText(this.sessionPath, value, bounds);
|
|
356577
|
+
await hideKeyboardIfShown(this.sessionPath);
|
|
356578
|
+
});
|
|
356564
356579
|
}
|
|
356565
356580
|
/** Invoke the focused field's Enter/Done action without clearing its value. */
|
|
356566
356581
|
async submitKeyboard(bounds) {
|
|
356567
|
-
return this.runAction(() =>
|
|
356582
|
+
return this.runAction(async () => {
|
|
356583
|
+
await submitKeyboard(this.sessionPath, bounds);
|
|
356584
|
+
await hideKeyboardIfShown(this.sessionPath);
|
|
356585
|
+
});
|
|
356568
356586
|
}
|
|
356569
356587
|
/** Clear the focused element; pass `bounds` to tap-to-focus first. */
|
|
356570
356588
|
async clear(bounds) {
|
package/dist/cli.mjs
CHANGED
|
@@ -5281,6 +5281,12 @@ var init_auth_state_freshness = __esm({
|
|
|
5281
5281
|
function detectSkippedApiCoverage(steps) {
|
|
5282
5282
|
const allSkipped = steps.length > 0 && steps.every((s) => s.status === "skipped");
|
|
5283
5283
|
if (allSkipped) {
|
|
5284
|
+
if (steps.every((s) => s.skipKind === "fixme")) {
|
|
5285
|
+
return {
|
|
5286
|
+
detected: false,
|
|
5287
|
+
logLine: "All @api tests skipped, but EVERY skip is a deliberate fixme (intentional N/A \u2014 e.g. a UI-only redirect login) \u2014 NOT relabelling CONFIG_ISSUE"
|
|
5288
|
+
};
|
|
5289
|
+
}
|
|
5284
5290
|
return {
|
|
5285
5291
|
detected: true,
|
|
5286
5292
|
error: (
|
|
@@ -75519,12 +75525,11 @@ ${existingScreens.slice(0, 100).map((s) => `- ${s.screenId}${s.name ? ` "${s.nam
|
|
|
75519
75525
|
keyboardRecoveryScreenId = currentScreenId ?? null;
|
|
75520
75526
|
keyboardRecoverySameScreenTurns = 0;
|
|
75521
75527
|
}
|
|
75522
|
-
|
|
75523
|
-
if (keyboardRecoverySameScreenTurns >= 4 && keyboardLikelyOpen && iteration - lastKeyboardRecoveryIteration > 4) {
|
|
75528
|
+
if (keyboardRecoverySameScreenTurns >= 4 && iteration - lastKeyboardRecoveryIteration > 4) {
|
|
75524
75529
|
lastKeyboardRecoveryIteration = iteration;
|
|
75525
75530
|
try {
|
|
75526
75531
|
await (0, mobile_keyboard_js_1.dismissKeyboardForRetry)(driver);
|
|
75527
|
-
log2(" Auto-dismissed the on-screen keyboard (several turns stalled on this screen
|
|
75532
|
+
log2(" Auto-dismissed the on-screen keyboard (several turns stalled on this screen).");
|
|
75528
75533
|
transientDirectives.push("HARNESS NOTE: the on-screen keyboard was just auto-dismissed because multiple turns stalled on this screen \u2014 controls it occluded (e.g. the form submit button) may now be visible. Call mobile_snapshot, then TAP the commit/submit control instead of re-filling fields.");
|
|
75529
75534
|
} catch (error2) {
|
|
75530
75535
|
(0, mobile_driver_errors_js_1.rethrowIfTerminalMobileDriverError)(error2);
|
|
@@ -84300,6 +84305,7 @@ ${args.directive}`);
|
|
|
84300
84305
|
aiResponseCount += 1;
|
|
84301
84306
|
const parsed = parseHealVerdict(content);
|
|
84302
84307
|
if (!parsed) {
|
|
84308
|
+
options.onProgress?.(`Phase 1 attempt ${attempt}: response was not a valid verdict \u2014 granting a recovery turn`);
|
|
84303
84309
|
markRecoverableTurn();
|
|
84304
84310
|
pendingDirective = "Your last response was not valid JSON matching the verdict schema. Return exactly one JSON verdict object.";
|
|
84305
84311
|
continue;
|
|
@@ -350303,7 +350309,7 @@ var require_package4 = __commonJS({
|
|
|
350303
350309
|
"package.json"(exports, module) {
|
|
350304
350310
|
module.exports = {
|
|
350305
350311
|
name: "@validate.qa/runner",
|
|
350306
|
-
version: "1.0.
|
|
350312
|
+
version: "1.0.58",
|
|
350307
350313
|
description: "validate local test runner - execute Playwright tests on your machine, connected to validate.qa cloud.",
|
|
350308
350314
|
bin: {
|
|
350309
350315
|
"validate-runner": "dist/cli.js"
|
|
@@ -351982,6 +351988,12 @@ function isKeyboardAlreadyHiddenError(err) {
|
|
|
351982
351988
|
return /keyboard.*(not|already).*(shown|visible|present|open)|no.*keyboard/i.test(message);
|
|
351983
351989
|
}
|
|
351984
351990
|
async function dismissKeyboard(sessionPath, platform3) {
|
|
351991
|
+
try {
|
|
351992
|
+
const shown = await appiumRequest(`${sessionPath}/appium/device/is_keyboard_shown`, { method: "GET" });
|
|
351993
|
+
if (readValue(shown) === false) return;
|
|
351994
|
+
} catch (err) {
|
|
351995
|
+
if (isAppiumDriverDeadError(err)) throw err;
|
|
351996
|
+
}
|
|
351985
351997
|
if (platform3 === "ANDROID") {
|
|
351986
351998
|
await pressBack(sessionPath);
|
|
351987
351999
|
return;
|
|
@@ -356568,11 +356580,17 @@ var MobileBridgeDriver = class {
|
|
|
356568
356580
|
}
|
|
356569
356581
|
/** Type `value`; pass `bounds` to tap-to-focus first when nothing is focused. */
|
|
356570
356582
|
async type(value, bounds) {
|
|
356571
|
-
return this.runAction(() =>
|
|
356583
|
+
return this.runAction(async () => {
|
|
356584
|
+
await typeText(this.sessionPath, value, bounds);
|
|
356585
|
+
await hideKeyboardIfShown(this.sessionPath);
|
|
356586
|
+
});
|
|
356572
356587
|
}
|
|
356573
356588
|
/** Invoke the focused field's Enter/Done action without clearing its value. */
|
|
356574
356589
|
async submitKeyboard(bounds) {
|
|
356575
|
-
return this.runAction(() =>
|
|
356590
|
+
return this.runAction(async () => {
|
|
356591
|
+
await submitKeyboard(this.sessionPath, bounds);
|
|
356592
|
+
await hideKeyboardIfShown(this.sessionPath);
|
|
356593
|
+
});
|
|
356576
356594
|
}
|
|
356577
356595
|
/** Clear the focused element; pass `bounds` to tap-to-focus first. */
|
|
356578
356596
|
async clear(bounds) {
|
package/package.json
CHANGED