prowl-tools 0.1.9 → 0.1.10

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/index.js CHANGED
@@ -28,7 +28,7 @@ import {
28
28
  saveStorageState,
29
29
  tccGuidance,
30
30
  updateBacklogFromSuite
31
- } from "./chunk-2RNOK64Y.js";
31
+ } from "./chunk-SRWAF2RI.js";
32
32
  import {
33
33
  CONFIG_DIR,
34
34
  findConfigPath,
@@ -38,7 +38,7 @@ import {
38
38
  loadHuntTags,
39
39
  normalizeHuntName,
40
40
  resolveViewport
41
- } from "./chunk-JFJQNJSJ.js";
41
+ } from "./chunk-TTZ2IL3P.js";
42
42
 
43
43
  // src/cli/program.ts
44
44
  import { Command as Command15 } from "commander";
@@ -46,7 +46,7 @@ import { Command as Command15 } from "commander";
46
46
  // package.json
47
47
  var package_default = {
48
48
  name: "prowl-tools",
49
- version: "0.1.9",
49
+ version: "0.1.10",
50
50
  description: "E2E testing for native macOS apps and web apps from declarative YAML hunts.",
51
51
  type: "module",
52
52
  license: "Apache-2.0",
@@ -105,7 +105,8 @@ var package_default = {
105
105
  build: "tsup",
106
106
  lint: "eslint .",
107
107
  test: "vitest run",
108
- "test:watch": "vitest"
108
+ "test:watch": "vitest",
109
+ "audit:licenses": "node scripts/audit-licenses.mjs"
109
110
  },
110
111
  dependencies: {
111
112
  "@modelcontextprotocol/sdk": "^1.29.0",
@@ -129,6 +130,7 @@ var package_default = {
129
130
  "@typescript-eslint/eslint-plugin": "^7.18.0",
130
131
  "@typescript-eslint/parser": "^7.18.0",
131
132
  eslint: "^8.57.1",
133
+ "license-checker-rseidelsohn": "^4.4.2",
132
134
  tsup: "^8.3.5",
133
135
  typescript: "^5.7.3",
134
136
  vitest: "^2.1.8"
@@ -182,6 +184,10 @@ function describeStep(step) {
182
184
  if ("waitForSelector" in step) return `waitForSelector "${step.waitForSelector.selector}"`;
183
185
  if ("waitForUrl" in step) return `waitForUrl "${step.waitForUrl.value}"`;
184
186
  if ("waitForNetworkIdle" in step) return "waitForNetworkIdle";
187
+ if ("waitForResponse" in step) {
188
+ const statusSuffix = step.waitForResponse.status !== void 0 ? ` (status ${step.waitForResponse.status})` : "";
189
+ return `waitForResponse "${step.waitForResponse.url}"${statusSuffix}`;
190
+ }
185
191
  if ("hover" in step) return `hover "${step.hover.selector}"`;
186
192
  if ("scroll" in step) return `scroll ${step.scroll.direction} ${step.scroll.amount ?? 500}px`;
187
193
  if ("scrollTo" in step) return `scrollTo "${step.scrollTo.selector}"`;
@@ -245,6 +251,10 @@ function printHuntSummary(result, runDir) {
245
251
  const duration = chalk.gray(`(${result.durationMs}ms)`);
246
252
  console.log(`
247
253
  ${status} ${chalk.bold(result.hunt)} ${duration} ${stepCount}`);
254
+ if (result.retrySummary) {
255
+ const color = result.status === "pass" ? chalk.yellow : chalk.red;
256
+ console.log(` ${color(result.retrySummary)}`);
257
+ }
248
258
  console.log(` ${chalk.gray("Artifacts:")} ${runDir}
249
259
  `);
250
260
  }
@@ -1360,7 +1370,7 @@ function buildGenerateCommand() {
1360
1370
  } else if (options.output) {
1361
1371
  let configDir;
1362
1372
  try {
1363
- const { loadConfig: loadConfig2 } = await import("./loader-JTHA4BYG.js");
1373
+ const { loadConfig: loadConfig2 } = await import("./loader-CAE4FPBK.js");
1364
1374
  const result = loadConfig2(options.config);
1365
1375
  configDir = result.configDir;
1366
1376
  } catch {
@@ -1426,6 +1436,7 @@ function buildHistoryCommand() {
1426
1436
  }
1427
1437
  console.log();
1428
1438
  console.log(` ${chalk12.bold(huntName)} \u2014 last ${recent.length} of ${entries.length} runs`);
1439
+ console.log(` ${chalk12.gray(formatRetryFrequency(recent))}`);
1429
1440
  console.log();
1430
1441
  console.log(formatTable(recent));
1431
1442
  console.log();
@@ -1441,12 +1452,23 @@ function buildHistoryCommand() {
1441
1452
  });
1442
1453
  return command;
1443
1454
  }
1455
+ function formatRetryFrequency(entries) {
1456
+ const retried = entries.filter((entry) => (entry.retries ?? 0) > 0).length;
1457
+ if (retried === 0) {
1458
+ return "No retries in these runs";
1459
+ }
1460
+ return `Retried in ${retried} of ${entries.length} runs`;
1461
+ }
1462
+ function formatRetries(retries) {
1463
+ return retries && retries > 0 ? String(retries) : "-";
1464
+ }
1444
1465
  function formatTable(entries) {
1445
- const headers = ["Status", "Started", "Duration"];
1466
+ const headers = ["Status", "Started", "Duration", "Retries"];
1446
1467
  const rows = entries.map((entry) => [
1447
1468
  formatStatus(entry.status),
1448
1469
  entry.startedAt,
1449
- formatDuration(entry.durationMs)
1470
+ formatDuration(entry.durationMs),
1471
+ formatRetries(entry.retries)
1450
1472
  ]);
1451
1473
  const widths = headers.map(
1452
1474
  (header, index) => Math.max(