prowl-tools 0.1.6 → 0.1.8

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/lib.d.ts CHANGED
@@ -327,7 +327,7 @@ type StepResult = {
327
327
  type AssertionResult = {
328
328
  type: string;
329
329
  value?: string | boolean;
330
- status: "pass" | "fail";
330
+ status: "pass" | "fail" | "skipped";
331
331
  error?: string;
332
332
  };
333
333
  type RunArtifacts = {
@@ -444,6 +444,8 @@ interface SessionDriver {
444
444
  goto(url: string, options?: NavigateOptions): Promise<void>;
445
445
  currentUrl(): string;
446
446
  count(selector: string): Promise<number>;
447
+ /** Count only elements the driver considers visibly present, when it can distinguish visibility from existence. */
448
+ visibleCount?(selector: string): Promise<number>;
447
449
  textContent(selector: string): Promise<string | null>;
448
450
  click(selector: string): Promise<void>;
449
451
  clickFirst(selector: string): Promise<void>;
@@ -453,6 +455,12 @@ interface SessionDriver {
453
455
  selectOption(selector: string, value: string): Promise<void>;
454
456
  selectOptionFirst(selector: string, value: string): Promise<void>;
455
457
  hover(selector: string): Promise<void>;
458
+ /**
459
+ * Scroll the viewport in `direction` by `amount` (engine-defined units: CSS
460
+ * pixels on web, a synthesized swipe distance on mobile). Native targets that
461
+ * have no scroll gesture (macOS) reject this.
462
+ */
463
+ scroll(direction: "up" | "down" | "left" | "right", amount?: number): Promise<void>;
456
464
  scrollIntoView(selector: string): Promise<void>;
457
465
  setInputFiles(selector: string, files: string | string[]): Promise<void>;
458
466
  countByRole(role: string, name: string): Promise<number>;
@@ -544,13 +552,57 @@ declare function parseMacSelector(selector: string): MacQuery;
544
552
  /** Wrap a live {@link MacHelperClient} as a {@link SessionDriver}. */
545
553
  declare function createMacDriver(client: MacHelperClient, options?: MacDriverOptions): SessionDriver;
546
554
 
547
- declare function macdriverBuildInstructions(): string;
555
+ /** Basename of the helper executable, in the tarball and on disk. */
556
+ declare const HELPER_BINARY = "prowl-macdriver";
557
+ /** Pinned helper version. A CLI release always installs this exact version. */
558
+ declare const MACDRIVER_VERSION = "0.1.0";
559
+ /** GitHub `owner/repo` that hosts the helper releases. */
560
+ declare const MACDRIVER_REPO = "prowl-tools/prowl";
561
+ /** Code-signing identifier assigned to release builds. */
562
+ declare const MACDRIVER_SIGNING_IDENTIFIER = "tools.prowl.macdriver";
563
+ /** Developer ID Application common-name prefix expected on release builds. */
564
+ declare const MACDRIVER_SIGNING_AUTHORITY_PREFIX = "Developer ID Application: Genkei Labs";
565
+ /** Accepted helper release version token. */
566
+ declare const MACDRIVER_VERSION_PATTERN: RegExp;
567
+ /** Validate the helper release version before using it in URLs or paths. */
568
+ declare function validateMacdriverVersion(version: string): string;
569
+ /** Git tag for a helper version — the release the workflow builds. */
570
+ declare function macdriverReleaseTag(version?: string): string;
571
+ /** Release asset file name for the universal (arm64 + x86_64) binary zip. */
572
+ declare function macdriverAssetName(version?: string): string;
573
+ /** Release asset file name for the SHA-256 checksum sidecar. */
574
+ declare function macdriverChecksumName(version?: string): string;
575
+ /** Download URL for a named asset of the pinned release (follows redirects). */
576
+ declare function macdriverAssetUrl(assetName: string, version?: string): string;
577
+ /** Root of all user-level installs: `~/.prowl/macdriver`. */
578
+ declare function macdriverInstallRoot(homedir?: string): string;
579
+ /** Directory that holds a specific installed version. */
580
+ declare function macdriverVersionDir(version?: string, homedir?: string): string;
581
+ /** Absolute path to the installed helper binary for a version. */
582
+ declare function macdriverInstalledBinary(version?: string, homedir?: string): string;
583
+
548
584
  /**
549
- * Resolve the helper binary path. Order: `PROWL_MACDRIVER_BIN`, then the
550
- * release then debug build under `macdriver/.build/`. Throws with build
551
- * instructions when none is found.
585
+ * Guidance shown when the helper can't be resolved. Leads with the
586
+ * two-minute `prowl macdriver install` path; source build and the
587
+ * `PROWL_MACDRIVER_BIN` override are the contributor fallbacks.
552
588
  */
553
- declare function resolveHelperBinary(env?: NodeJS.ProcessEnv): string;
589
+ declare function macdriverBuildInstructions(): string;
590
+ type ResolveHelperOptions = {
591
+ /** Home directory for the user-level install lookup (defaults to `os.homedir()`). */
592
+ homedir?: string;
593
+ };
594
+ /**
595
+ * Resolve the helper binary path. Search order (documented in the README's
596
+ * macOS Target section):
597
+ * 1. `PROWL_MACDRIVER_BIN` env override (absolute path to the binary);
598
+ * 2. the user-level install of the pinned version at
599
+ * `~/.prowl/macdriver/<MACDRIVER_VERSION>/prowl-macdriver`
600
+ * (what `prowl macdriver install` writes);
601
+ * 3. the contributor's repo-local source build under `macdriver/.build/`
602
+ * (`release` then `debug`).
603
+ * Throws with install-first guidance when none is found.
604
+ */
605
+ declare function resolveHelperBinary(env?: NodeJS.ProcessEnv, options?: ResolveHelperOptions): string;
554
606
  /** Default per-request deadline for the helper transport. */
555
607
  declare const DEFAULT_REQUEST_TIMEOUT_MS = 30000;
556
608
  type SpawnMacHelperOptions = {
@@ -594,6 +646,151 @@ declare function launchMacSession(options: LaunchMacOptions): Promise<MacSession
594
646
  /** Quit the target app (best effort) and shut the helper down. */
595
647
  declare function closeMacSession(session: MacSession): Promise<void>;
596
648
 
649
+ /** Minimal shape of the `fetch` responses this module consumes. */
650
+ interface FetchResponseLike {
651
+ ok: boolean;
652
+ status: number;
653
+ arrayBuffer(): Promise<ArrayBuffer>;
654
+ text(): Promise<string>;
655
+ }
656
+ /** A `fetch`-like function; the real global `fetch` satisfies it. */
657
+ type FetchLike$2 = (url: string, init?: {
658
+ redirect?: "follow" | "error" | "manual";
659
+ }) => Promise<FetchResponseLike>;
660
+ /** Extracts the binary out of a downloaded zip into `destDir`. */
661
+ type Extractor = (zipPath: string, destDir: string) => Promise<void>;
662
+ /** Lists the raw path entries in a downloaded zip before extraction. */
663
+ type ArchiveLister = (zipPath: string) => Promise<string[]>;
664
+ /** Verifies the code signature of an installed binary; throws if invalid. */
665
+ type SignatureVerifier = (binaryPath: string) => Promise<void>;
666
+ interface CommandResult {
667
+ stdout?: string | Buffer;
668
+ stderr?: string | Buffer;
669
+ }
670
+ type CommandRunner = (file: string, args: string[]) => Promise<CommandResult>;
671
+ /** Parse the hex digest out of a `shasum`-style `.sha256` file. */
672
+ declare function parseChecksumFile(text: string): string;
673
+ /** SHA-256 of a buffer, lowercase hex. */
674
+ declare function sha256Hex(bytes: Buffer): string;
675
+ /** Default archive lister: `zipinfo -1`, used before any extraction happens. */
676
+ declare const zipinfoArchiveLister: ArchiveLister;
677
+ /** Validate the zip member list before extraction. */
678
+ declare function validateMacdriverArchiveEntries(entries: string[]): void;
679
+ /** Default extractor: Apple's `ditto`, which preserves the code signature. */
680
+ declare const dittoExtractor: Extractor;
681
+ interface CodesignDetails {
682
+ identifier: string | null;
683
+ authorities: string[];
684
+ teamIdentifier: string | null;
685
+ }
686
+ declare function parseCodesignDetails(text: string): CodesignDetails;
687
+ declare function verifyMacdriverSignature(binaryPath: string, run?: CommandRunner): Promise<void>;
688
+ /**
689
+ * Default signature verifier: fail closed unless `codesign` verifies the
690
+ * signature, the identity matches the release contract, and Gatekeeper accepts
691
+ * the executable through `spctl --assess --type execute`.
692
+ */
693
+ declare const codesignVerifier: SignatureVerifier;
694
+ interface DownloadOptions {
695
+ version?: string;
696
+ fetchImpl?: FetchLike$2;
697
+ }
698
+ /**
699
+ * Download the pinned release's universal-binary zip and verify its SHA-256
700
+ * against the released `.sha256` sidecar. Returns the verified zip bytes.
701
+ * Throws a clear, actionable error on a 404 (no release cut yet) or a checksum
702
+ * mismatch.
703
+ */
704
+ declare function downloadAndVerify(options?: DownloadOptions): Promise<Buffer>;
705
+ interface InstallOptions {
706
+ version?: string;
707
+ force?: boolean;
708
+ homedir?: string;
709
+ fetchImpl?: FetchLike$2;
710
+ listArchiveEntries?: ArchiveLister;
711
+ extract?: Extractor;
712
+ verifySignature?: SignatureVerifier;
713
+ }
714
+ interface InstallResult {
715
+ version: string;
716
+ binaryPath: string;
717
+ alreadyInstalled: boolean;
718
+ }
719
+ /**
720
+ * Install the pinned helper to `~/.prowl/macdriver/<version>/prowl-macdriver`
721
+ * (0755). Returns `alreadyInstalled: true` (a no-op) when the binary is already
722
+ * present and `force` is not set. The downloaded archive is inspected before
723
+ * extraction, extracted into a temporary staging directory, and moved into place
724
+ * only after the staged helper passes file and signature verification.
725
+ */
726
+ declare function installMacdriver(options?: InstallOptions): Promise<InstallResult>;
727
+ interface InstalledVersion {
728
+ version: string;
729
+ binaryPath: string;
730
+ }
731
+ interface MacdriverStatus {
732
+ /** The binary Prowl would use now, and how it was found. */
733
+ resolved: {
734
+ path: string;
735
+ source: "env" | "user-install" | "source-build";
736
+ } | null;
737
+ /** The pinned version the CLI targets. */
738
+ pinnedVersion: string;
739
+ /** All versions found under `~/.prowl/macdriver/`. */
740
+ installed: InstalledVersion[];
741
+ /** Version string the resolved binary reports, or null if it couldn't run. */
742
+ probedVersion: string | null;
743
+ }
744
+ /** Probe a helper binary's `version` output; null if it can't be run/parsed. */
745
+ type VersionProbe = (binaryPath: string) => Promise<string | null>;
746
+ /** Default probe: run `<binary> version` and parse the `prowl-macdriver X.Y.Z` line. */
747
+ declare const runVersionProbe: VersionProbe;
748
+ interface StatusOptions {
749
+ env?: NodeJS.ProcessEnv;
750
+ homedir?: string;
751
+ probe?: VersionProbe;
752
+ }
753
+ /**
754
+ * Gather the state `prowl macdriver status` reports: the resolved binary and
755
+ * how it was found, every installed version, and the resolved binary's probed
756
+ * version. Pure aside from filesystem reads and the (injectable) probe.
757
+ */
758
+ declare function collectMacdriverStatus(options?: StatusOptions): Promise<MacdriverStatus>;
759
+ /** Static TCC-permission guidance printed after install / in status. */
760
+ declare function tccGuidance(): string;
761
+
762
+ /** Screen dimensions in device points, as reported by the agent. */
763
+ interface ScreenSize {
764
+ width: number;
765
+ height: number;
766
+ }
767
+ /** One item in a W3C `pointer` action sequence. */
768
+ type PointerActionItem = {
769
+ type: "pointerMove";
770
+ duration: number;
771
+ x: number;
772
+ y: number;
773
+ origin?: "viewport";
774
+ } | {
775
+ type: "pointerDown";
776
+ button: number;
777
+ } | {
778
+ type: "pointerUp";
779
+ button: number;
780
+ } | {
781
+ type: "pause";
782
+ duration: number;
783
+ };
784
+ /** A single `touch` pointer input source and its ordered actions. */
785
+ interface PointerActionSequence {
786
+ type: "pointer";
787
+ id: string;
788
+ parameters: {
789
+ pointerType: "touch";
790
+ };
791
+ actions: PointerActionItem[];
792
+ }
793
+
597
794
  /** The selector kinds the native dialect understands. */
598
795
  type NativeSelectorKind = "id" | "label" | "text" | "role" | "focused";
599
796
  /**
@@ -811,6 +1008,10 @@ interface AndroidAgentClient {
811
1008
  getText(elementId: string): Promise<string | null>;
812
1009
  /** Dispatch a global key event by Android key code (goes to the focused view). */
813
1010
  pressKeyCode(keyCode: number): Promise<void>;
1011
+ /** Current screen size in pixels (uiautomator2 `/window/current/size`), for gestures. */
1012
+ windowSize(): Promise<ScreenSize>;
1013
+ /** Perform a W3C pointer action sequence (`POST /session/:id/actions`). */
1014
+ performActions(actions: PointerActionSequence): Promise<void>;
814
1015
  /** Capture the current screen as PNG bytes. */
815
1016
  screenshotPng(): Promise<Buffer>;
816
1017
  /**
@@ -1054,10 +1255,16 @@ interface IosAgentClient {
1054
1255
  /** Replace an element's text (W3C `element/value`). */
1055
1256
  setValue(elementId: string, text: string): Promise<void>;
1056
1257
  getText(elementId: string): Promise<string | null>;
1258
+ /** True only when WDA reports the element is displayed in the current viewport. */
1259
+ isDisplayed(elementId: string): Promise<boolean>;
1057
1260
  /** Send raw key sequences to the focused element (WDA `/wda/keys`). */
1058
1261
  sendKeys(keys: string[]): Promise<void>;
1059
1262
  /** Return to the springboard home screen (WDA `/wda/homescreen`). */
1060
1263
  homescreen(): Promise<void>;
1264
+ /** Current screen size in points (WDA `/window/size`), for gesture geometry. */
1265
+ windowSize(): Promise<ScreenSize>;
1266
+ /** Perform a W3C pointer action sequence (WDA `POST /session/:id/actions`). */
1267
+ performActions(actions: PointerActionSequence): Promise<void>;
1061
1268
  /**
1062
1269
  * Return the current UI hierarchy as WebDriverAgent `/source` XML. Present on
1063
1270
  * live clients and consumed by the analyzer (PROWL-061); optional so lighter
@@ -1359,7 +1566,9 @@ declare function createWdaAgentClient(transport: WdaTransport, sessionId: string
1359
1566
  * Step types that only make sense on the web target. Everything else
1360
1567
  * (`click`, `fill`, `type`, `press`, `wait`, `assert visible/notVisible`,
1361
1568
  * `screenshot`, `assertScreenshot`, `repeat`, `runHunt`, `if`, `copyText`,
1362
- * `hover`, `scrollTo`, `waitForSelector`) is portable across targets.
1569
+ * `hover`, `scrollTo`, `waitForSelector`) is portable across targets. The
1570
+ * directional `scroll` step is the one per-target exception — see
1571
+ * {@link MACOS_UNSUPPORTED_STEP_TYPES}.
1363
1572
  */
1364
1573
  declare const WEB_ONLY_STEP_TYPES: ReadonlySet<string>;
1365
1574
  /** The web-only reason a step is unsupported on a non-web target, or null if portable. */
@@ -1367,8 +1576,10 @@ declare function webOnlyReason(step: Step): string | null;
1367
1576
  /**
1368
1577
  * Throw if any step in `steps` (recursing into `if`/`repeat` bodies) is not
1369
1578
  * supported by `target`. `runHunt` references are validated when the referenced
1370
- * hunt itself runs. No-op for the web target; every native target (macOS,
1371
- * Android, iOS) rejects the same web-only step vocabulary.
1579
+ * hunt itself runs. No-op for the web target; every native target rejects the
1580
+ * same web-only step vocabulary, and macOS additionally rejects the directional
1581
+ * `scroll` swipe (no AX equivalent) — but NOT `scrollTo`, which macOS maps to
1582
+ * AXScrollToVisible just as iOS/Android map it to a swipe loop.
1372
1583
  */
1373
1584
  declare function assertStepsSupportedByTarget(steps: Step[], target: Target["type"]): void;
1374
1585
  /** Read the bundle id from an iOS `.app` (root `Info.plist`), or null. */
@@ -1705,24 +1916,24 @@ declare const configSchema: z.ZodObject<{
1705
1916
  }>]>>;
1706
1917
  }, "strip", z.ZodTypeAny, {
1707
1918
  timeout?: number | undefined;
1708
- headless?: boolean | undefined;
1709
- slowMo?: number | undefined;
1710
- engine?: "chromium" | "firefox" | "webkit" | undefined;
1711
- channel?: "chromium" | "chrome" | "chrome-beta" | "chrome-canary" | "chrome-dev" | "msedge" | "msedge-beta" | "msedge-canary" | "msedge-dev" | undefined;
1712
1919
  viewport?: "mobile" | "tablet" | "desktop" | {
1713
1920
  width: number;
1714
1921
  height: number;
1715
1922
  } | undefined;
1716
- }, {
1717
- timeout?: number | undefined;
1718
1923
  headless?: boolean | undefined;
1719
1924
  slowMo?: number | undefined;
1720
1925
  engine?: "chromium" | "firefox" | "webkit" | undefined;
1721
1926
  channel?: "chromium" | "chrome" | "chrome-beta" | "chrome-canary" | "chrome-dev" | "msedge" | "msedge-beta" | "msedge-canary" | "msedge-dev" | undefined;
1927
+ }, {
1928
+ timeout?: number | undefined;
1722
1929
  viewport?: "mobile" | "tablet" | "desktop" | {
1723
1930
  width: number;
1724
1931
  height: number;
1725
1932
  } | undefined;
1933
+ headless?: boolean | undefined;
1934
+ slowMo?: number | undefined;
1935
+ engine?: "chromium" | "firefox" | "webkit" | undefined;
1936
+ channel?: "chromium" | "chrome" | "chrome-beta" | "chrome-canary" | "chrome-dev" | "msedge" | "msedge-beta" | "msedge-canary" | "msedge-dev" | undefined;
1726
1937
  }>>;
1727
1938
  artifacts: z.ZodOptional<z.ZodObject<{
1728
1939
  screenshots: z.ZodOptional<z.ZodEnum<["on-failure", "all"]>>;
@@ -1836,14 +2047,14 @@ declare const configSchema: z.ZodObject<{
1836
2047
  };
1837
2048
  browser?: {
1838
2049
  timeout?: number | undefined;
1839
- headless?: boolean | undefined;
1840
- slowMo?: number | undefined;
1841
- engine?: "chromium" | "firefox" | "webkit" | undefined;
1842
- channel?: "chromium" | "chrome" | "chrome-beta" | "chrome-canary" | "chrome-dev" | "msedge" | "msedge-beta" | "msedge-canary" | "msedge-dev" | undefined;
1843
2050
  viewport?: "mobile" | "tablet" | "desktop" | {
1844
2051
  width: number;
1845
2052
  height: number;
1846
2053
  } | undefined;
2054
+ headless?: boolean | undefined;
2055
+ slowMo?: number | undefined;
2056
+ engine?: "chromium" | "firefox" | "webkit" | undefined;
2057
+ channel?: "chromium" | "chrome" | "chrome-beta" | "chrome-canary" | "chrome-dev" | "msedge" | "msedge-beta" | "msedge-canary" | "msedge-dev" | undefined;
1847
2058
  } | undefined;
1848
2059
  artifacts?: {
1849
2060
  screenshots?: "on-failure" | "all" | undefined;
@@ -1901,14 +2112,14 @@ declare const configSchema: z.ZodObject<{
1901
2112
  };
1902
2113
  browser?: {
1903
2114
  timeout?: number | undefined;
1904
- headless?: boolean | undefined;
1905
- slowMo?: number | undefined;
1906
- engine?: "chromium" | "firefox" | "webkit" | undefined;
1907
- channel?: "chromium" | "chrome" | "chrome-beta" | "chrome-canary" | "chrome-dev" | "msedge" | "msedge-beta" | "msedge-canary" | "msedge-dev" | undefined;
1908
2115
  viewport?: "mobile" | "tablet" | "desktop" | {
1909
2116
  width: number;
1910
2117
  height: number;
1911
2118
  } | undefined;
2119
+ headless?: boolean | undefined;
2120
+ slowMo?: number | undefined;
2121
+ engine?: "chromium" | "firefox" | "webkit" | undefined;
2122
+ channel?: "chromium" | "chrome" | "chrome-beta" | "chrome-canary" | "chrome-dev" | "msedge" | "msedge-beta" | "msedge-canary" | "msedge-dev" | undefined;
1912
2123
  } | undefined;
1913
2124
  artifacts?: {
1914
2125
  screenshots?: "on-failure" | "all" | undefined;
@@ -2454,4 +2665,4 @@ type GenerateOptions = {
2454
2665
  };
2455
2666
  declare function generateHunt(options: GenerateOptions): Promise<string>;
2456
2667
 
2457
- export { ANDROID_INTERACTIVE_CLASSES, ANDROID_KEYCODES, ANDROID_MATCH_DIALECT, type AdbDevice, type AdbResult, type AdbRunner, type AdbSpawner, type AgentApks, type AgentConnector, type AnalysisResult, type AnalyzeAndroidOptions, type AnalyzeIosOptions, type AnalyzeMacOptions, type AndroidAgentClient, type AndroidAnalysisElement, type AndroidAnalysisResult, type AndroidDriverOptions, type AndroidLocator, type AndroidQuery, type AndroidSession, type AndroidTarget, type AndroidUiNode, type AndroidUiSource, type AssertScreenshotStep, type Assertion, type AssertionResult, type BrowserChannel, type BrowserEngine, type BugFailure, type BugLogSummary, type CiFailureCluster, type CiFlakyHunt, type CiHuntResult, type CiResult, type CiStatus, type Config, DEFAULT_AGENT_REQUEST_TIMEOUT_MS, DEFAULT_ANALYZE_TREE_DEPTH, DEFAULT_FLAKY_THRESHOLD, DEFAULT_REQUEST_TIMEOUT_MS, DEFAULT_SIMULATOR_LOCK_ROOT, DEFAULT_WDA_REQUEST_TIMEOUT_MS, type EvalScriptStep, type FailureCluster, type FetchLike$1 as FetchLike, type FlakyScore, type GenerateOptions, type HealResult, type HistoryEntry, type HistoryFile, type Hunt, INTERACTIVE_ROLES, IOS_INTERACTIVE_TYPES, IOS_MATCH_DIALECT, IOS_PRESS_KEYS, IOS_WINDOW_TYPE, type IfStep, type IosAgentClient, type IosAgentConnector, type IosAnalysisElement, type IosAnalysisResult, type IosAnalysisWindow, type IosDriverOptions, type IosLocator, type IosQuery, type IosSession, type IosTarget, type IosUiNode, type IosUiSource, type LaunchAndroidOptions, type LaunchIosOptions, type LaunchMacOptions, MACOS_MATCH_DIALECT, type MacAnalysisElement, type MacAnalysisResult, type MacAnalysisWindow, type MacAxNode, type MacDriverOptions, type MacHelperClient, type MacQuery, type MacSession, type MacosTarget, type MockRouteStep, NATIVE_ATTRIBUTE_MAP, type NativeMatchDialect, type NativeMatchOptions, type NativeNode, type NativePlatform, type NativeRankFields, type NativeSelector, type NativeSelectorKind, type PageElement, type PageForm, type PageLink, type RankFlakyOptions, type ReliabilityConfig, type RepeatStep, type ReserveSimulatorOptions, type ResolveWdaTestRunOptions, type RunArtifacts, type RunOptions, type RunResult, type RunScriptStep, type RunSuiteHooks, type RunSuiteOptions, type RunSuiteResult, type SelectorKindMapping, type SimDevice, type SimctlResult, type SimctlRunner, type SimulatorReservation, SpawnMacHelperClient, type SpawnMacHelperOptions, type Step, type StepResult, type Target, UIA2_REMOTE_PORT, Uia2HttpError, Uia2Transport, type Uia2TransportOptions, type UnmockRouteStep, type UpdateBacklogOptions, type Viewport, WDA_RUNNER_BUNDLE_ID, WDA_USE_PORT_ENV, WEB_ONLY_STEP_TYPES, WdaHttpError, type WdaTestRunPreparer, WdaTransport, type WdaTransportOptions, type WebTarget, type XmlElement, analyzeAndroidApp, analyzeIosApp, analyzeMacApp, analyzePage, androidAppAllowedIdentities, androidNodeToNative, androidQueryToLocator, assertAndroidAppAllowed, assertIosAppAllowed, assertStepsSupportedByTarget, assertTargetAppAllowed, bootedDevices, bootedSimulators, buildHealCandidates, closeAndroidSession, closeIosSession, closeMacSession, clusterFailures, computeFlakeScore, configSchema, createAndroidDriver, createIosDriver, createMacDriver, createUia2AgentClient, createUia2Session, createWdaAgentClient, createWdaSession, decodeXmlEntities, defaultAgentConnector, defaultIosAgentConnector, defaultWdaTestRunPreparer, escapePredicateArg, escapeUiSelectorArg, extractElementId, extractFailures, extractSelectorIntent, findFreePort, generateHunt, healSelector, huntSchema, injectUsePortIntoXctestrun, interpolateHunt, iosAppAllowedIdentities, iosNodeToNative, iosQueryToLocator, isAndroidInteractive, isIosInteractive, launchAndroidSession, launchIosSession, launchMacSession, listDevices, listHunts, listSimulators, loadConfig, loadHunt, loadHuntMeta, loadHuntTags, macdriverBuildInstructions, matchAndroidSelector, matchIosSelector, matchNativeTree, nodeMatchesSelector, normalizeXcuiClassName, parseAaptPackage, parseAdbDevices, parseAndroidHierarchy, parseAndroidSelector, parseForwardPort, parseIosHierarchy, parseIosSelector, parseMacSelector, parseNativeSelector, parseSimctlDevices, parseSnapshot, parseXcodeVersion, parseXml, qualifyResourceId, quoteSelectorValue, rankAndroidSelectors, rankFlaky, rankIosSelectors, rankMacSelectors, rankNativeSelectors, readHistory, readHuntHistory, readIosBundleIdentifier, reserveSimulatorUdid, resolveAgentApks, resolveHelperBinary, resolveWdaProject, resolveWdaTestRun, runHunt, runSuite, selectDeviceSerial, selectSimulatorUdid, shortIosType, stepSchema, unquoteSelectorValue, unwrapAndroidTextSelector, unwrapIosTextSelector, unwrapNativeTextSelector, updateBacklogFromSuite, waitForAgentReady, waitForWdaReady, wdaCacheDir, wdaTestRunArgs, webOnlyReason };
2668
+ export { ANDROID_INTERACTIVE_CLASSES, ANDROID_KEYCODES, ANDROID_MATCH_DIALECT, type AdbDevice, type AdbResult, type AdbRunner, type AdbSpawner, type AgentApks, type AgentConnector, type AnalysisResult, type AnalyzeAndroidOptions, type AnalyzeIosOptions, type AnalyzeMacOptions, type AndroidAgentClient, type AndroidAnalysisElement, type AndroidAnalysisResult, type AndroidDriverOptions, type AndroidLocator, type AndroidQuery, type AndroidSession, type AndroidTarget, type AndroidUiNode, type AndroidUiSource, type ArchiveLister, type AssertScreenshotStep, type Assertion, type AssertionResult, type BrowserChannel, type BrowserEngine, type BugFailure, type BugLogSummary, type CiFailureCluster, type CiFlakyHunt, type CiHuntResult, type CiResult, type CiStatus, type CodesignDetails, type CommandResult, type CommandRunner, type Config, DEFAULT_AGENT_REQUEST_TIMEOUT_MS, DEFAULT_ANALYZE_TREE_DEPTH, DEFAULT_FLAKY_THRESHOLD, DEFAULT_REQUEST_TIMEOUT_MS, DEFAULT_SIMULATOR_LOCK_ROOT, DEFAULT_WDA_REQUEST_TIMEOUT_MS, type DownloadOptions, type EvalScriptStep, type Extractor, type FailureCluster, type FetchLike$1 as FetchLike, type FlakyScore, type GenerateOptions, HELPER_BINARY, type HealResult, type HistoryEntry, type HistoryFile, type Hunt, INTERACTIVE_ROLES, IOS_INTERACTIVE_TYPES, IOS_MATCH_DIALECT, IOS_PRESS_KEYS, IOS_WINDOW_TYPE, type IfStep, type InstallOptions, type InstallResult, type InstalledVersion, type IosAgentClient, type IosAgentConnector, type IosAnalysisElement, type IosAnalysisResult, type IosAnalysisWindow, type IosDriverOptions, type IosLocator, type IosQuery, type IosSession, type IosTarget, type IosUiNode, type IosUiSource, type LaunchAndroidOptions, type LaunchIosOptions, type LaunchMacOptions, MACDRIVER_REPO, MACDRIVER_SIGNING_AUTHORITY_PREFIX, MACDRIVER_SIGNING_IDENTIFIER, MACDRIVER_VERSION, MACDRIVER_VERSION_PATTERN, MACOS_MATCH_DIALECT, type MacAnalysisElement, type MacAnalysisResult, type MacAnalysisWindow, type MacAxNode, type MacDriverOptions, type MacHelperClient, type MacQuery, type MacSession, type MacdriverStatus, type MacosTarget, type MockRouteStep, NATIVE_ATTRIBUTE_MAP, type NativeMatchDialect, type NativeMatchOptions, type NativeNode, type NativePlatform, type NativeRankFields, type NativeSelector, type NativeSelectorKind, type PageElement, type PageForm, type PageLink, type RankFlakyOptions, type ReliabilityConfig, type RepeatStep, type ReserveSimulatorOptions, type ResolveHelperOptions, type ResolveWdaTestRunOptions, type RunArtifacts, type RunOptions, type RunResult, type RunScriptStep, type RunSuiteHooks, type RunSuiteOptions, type RunSuiteResult, type SelectorKindMapping, type SignatureVerifier, type SimDevice, type SimctlResult, type SimctlRunner, type SimulatorReservation, SpawnMacHelperClient, type SpawnMacHelperOptions, type StatusOptions, type Step, type StepResult, type Target, UIA2_REMOTE_PORT, Uia2HttpError, Uia2Transport, type Uia2TransportOptions, type UnmockRouteStep, type UpdateBacklogOptions, type VersionProbe, type Viewport, WDA_RUNNER_BUNDLE_ID, WDA_USE_PORT_ENV, WEB_ONLY_STEP_TYPES, WdaHttpError, type WdaTestRunPreparer, WdaTransport, type WdaTransportOptions, type WebTarget, type XmlElement, analyzeAndroidApp, analyzeIosApp, analyzeMacApp, analyzePage, androidAppAllowedIdentities, androidNodeToNative, androidQueryToLocator, assertAndroidAppAllowed, assertIosAppAllowed, assertStepsSupportedByTarget, assertTargetAppAllowed, bootedDevices, bootedSimulators, buildHealCandidates, closeAndroidSession, closeIosSession, closeMacSession, clusterFailures, codesignVerifier, collectMacdriverStatus, computeFlakeScore, configSchema, createAndroidDriver, createIosDriver, createMacDriver, createUia2AgentClient, createUia2Session, createWdaAgentClient, createWdaSession, decodeXmlEntities, defaultAgentConnector, defaultIosAgentConnector, defaultWdaTestRunPreparer, dittoExtractor, downloadAndVerify, escapePredicateArg, escapeUiSelectorArg, extractElementId, extractFailures, extractSelectorIntent, findFreePort, generateHunt, healSelector, huntSchema, injectUsePortIntoXctestrun, installMacdriver, interpolateHunt, iosAppAllowedIdentities, iosNodeToNative, iosQueryToLocator, isAndroidInteractive, isIosInteractive, launchAndroidSession, launchIosSession, launchMacSession, listDevices, listHunts, listSimulators, loadConfig, loadHunt, loadHuntMeta, loadHuntTags, macdriverAssetName, macdriverAssetUrl, macdriverBuildInstructions, macdriverChecksumName, macdriverInstallRoot, macdriverInstalledBinary, macdriverReleaseTag, macdriverVersionDir, matchAndroidSelector, matchIosSelector, matchNativeTree, nodeMatchesSelector, normalizeXcuiClassName, parseAaptPackage, parseAdbDevices, parseAndroidHierarchy, parseAndroidSelector, parseChecksumFile, parseCodesignDetails, parseForwardPort, parseIosHierarchy, parseIosSelector, parseMacSelector, parseNativeSelector, parseSimctlDevices, parseSnapshot, parseXcodeVersion, parseXml, qualifyResourceId, quoteSelectorValue, rankAndroidSelectors, rankFlaky, rankIosSelectors, rankMacSelectors, rankNativeSelectors, readHistory, readHuntHistory, readIosBundleIdentifier, reserveSimulatorUdid, resolveAgentApks, resolveHelperBinary, resolveWdaProject, resolveWdaTestRun, runHunt, runSuite, runVersionProbe, selectDeviceSerial, selectSimulatorUdid, sha256Hex, shortIosType, stepSchema, tccGuidance, unquoteSelectorValue, unwrapAndroidTextSelector, unwrapIosTextSelector, unwrapNativeTextSelector, updateBacklogFromSuite, validateMacdriverArchiveEntries, validateMacdriverVersion, verifyMacdriverSignature, waitForAgentReady, waitForWdaReady, wdaCacheDir, wdaTestRunArgs, webOnlyReason, zipinfoArchiveLister };
package/dist/lib.js CHANGED
@@ -8,11 +8,17 @@ import {
8
8
  DEFAULT_REQUEST_TIMEOUT_MS,
9
9
  DEFAULT_SIMULATOR_LOCK_ROOT,
10
10
  DEFAULT_WDA_REQUEST_TIMEOUT_MS,
11
+ HELPER_BINARY,
11
12
  INTERACTIVE_ROLES,
12
13
  IOS_INTERACTIVE_TYPES,
13
14
  IOS_MATCH_DIALECT,
14
15
  IOS_PRESS_KEYS,
15
16
  IOS_WINDOW_TYPE,
17
+ MACDRIVER_REPO,
18
+ MACDRIVER_SIGNING_AUTHORITY_PREFIX,
19
+ MACDRIVER_SIGNING_IDENTIFIER,
20
+ MACDRIVER_VERSION,
21
+ MACDRIVER_VERSION_PATTERN,
16
22
  MACOS_MATCH_DIALECT,
17
23
  NATIVE_ATTRIBUTE_MAP,
18
24
  SpawnMacHelperClient,
@@ -42,6 +48,8 @@ import {
42
48
  closeIosSession,
43
49
  closeMacSession,
44
50
  clusterFailures,
51
+ codesignVerifier,
52
+ collectMacdriverStatus,
45
53
  computeFlakeScore,
46
54
  createAndroidDriver,
47
55
  createIosDriver,
@@ -54,6 +62,8 @@ import {
54
62
  defaultAgentConnector,
55
63
  defaultIosAgentConnector,
56
64
  defaultWdaTestRunPreparer,
65
+ dittoExtractor,
66
+ downloadAndVerify,
57
67
  escapePredicateArg,
58
68
  escapeUiSelectorArg,
59
69
  extractElementId,
@@ -63,7 +73,7 @@ import {
63
73
  generateHunt,
64
74
  healSelector,
65
75
  injectUsePortIntoXctestrun,
66
- interpolateHunt,
76
+ installMacdriver,
67
77
  iosAppAllowedIdentities,
68
78
  iosNodeToNative,
69
79
  iosQueryToLocator,
@@ -74,7 +84,14 @@ import {
74
84
  launchMacSession,
75
85
  listDevices,
76
86
  listSimulators,
87
+ macdriverAssetName,
88
+ macdriverAssetUrl,
77
89
  macdriverBuildInstructions,
90
+ macdriverChecksumName,
91
+ macdriverInstallRoot,
92
+ macdriverInstalledBinary,
93
+ macdriverReleaseTag,
94
+ macdriverVersionDir,
78
95
  matchAndroidSelector,
79
96
  matchIosSelector,
80
97
  matchNativeTree,
@@ -84,6 +101,8 @@ import {
84
101
  parseAdbDevices,
85
102
  parseAndroidHierarchy,
86
103
  parseAndroidSelector,
104
+ parseChecksumFile,
105
+ parseCodesignDetails,
87
106
  parseForwardPort,
88
107
  parseIosHierarchy,
89
108
  parseIosSelector,
@@ -110,30 +129,38 @@ import {
110
129
  resolveWdaTestRun,
111
130
  runHunt,
112
131
  runSuite,
132
+ runVersionProbe,
113
133
  selectDeviceSerial,
114
134
  selectSimulatorUdid,
135
+ sha256Hex,
115
136
  shortIosType,
137
+ tccGuidance,
116
138
  unquoteSelectorValue,
117
139
  unwrapAndroidTextSelector,
118
140
  unwrapIosTextSelector,
119
141
  unwrapNativeTextSelector,
120
142
  updateBacklogFromSuite,
143
+ validateMacdriverArchiveEntries,
144
+ validateMacdriverVersion,
145
+ verifyMacdriverSignature,
121
146
  waitForAgentReady,
122
147
  waitForWdaReady,
123
148
  wdaCacheDir,
124
149
  wdaTestRunArgs,
125
- webOnlyReason
126
- } from "./chunk-5KQR3IR3.js";
150
+ webOnlyReason,
151
+ zipinfoArchiveLister
152
+ } from "./chunk-CWLRDV5P.js";
127
153
  import {
128
154
  configSchema,
129
155
  huntSchema,
156
+ interpolateHunt,
130
157
  listHunts,
131
158
  loadConfig,
132
159
  loadHunt,
133
160
  loadHuntMeta,
134
161
  loadHuntTags,
135
162
  stepSchema
136
- } from "./chunk-WHAMB4TY.js";
163
+ } from "./chunk-JFJQNJSJ.js";
137
164
  export {
138
165
  ANDROID_INTERACTIVE_CLASSES,
139
166
  ANDROID_KEYCODES,
@@ -144,11 +171,17 @@ export {
144
171
  DEFAULT_REQUEST_TIMEOUT_MS,
145
172
  DEFAULT_SIMULATOR_LOCK_ROOT,
146
173
  DEFAULT_WDA_REQUEST_TIMEOUT_MS,
174
+ HELPER_BINARY,
147
175
  INTERACTIVE_ROLES,
148
176
  IOS_INTERACTIVE_TYPES,
149
177
  IOS_MATCH_DIALECT,
150
178
  IOS_PRESS_KEYS,
151
179
  IOS_WINDOW_TYPE,
180
+ MACDRIVER_REPO,
181
+ MACDRIVER_SIGNING_AUTHORITY_PREFIX,
182
+ MACDRIVER_SIGNING_IDENTIFIER,
183
+ MACDRIVER_VERSION,
184
+ MACDRIVER_VERSION_PATTERN,
152
185
  MACOS_MATCH_DIALECT,
153
186
  NATIVE_ATTRIBUTE_MAP,
154
187
  SpawnMacHelperClient,
@@ -178,6 +211,8 @@ export {
178
211
  closeIosSession,
179
212
  closeMacSession,
180
213
  clusterFailures,
214
+ codesignVerifier,
215
+ collectMacdriverStatus,
181
216
  computeFlakeScore,
182
217
  configSchema,
183
218
  createAndroidDriver,
@@ -191,6 +226,8 @@ export {
191
226
  defaultAgentConnector,
192
227
  defaultIosAgentConnector,
193
228
  defaultWdaTestRunPreparer,
229
+ dittoExtractor,
230
+ downloadAndVerify,
194
231
  escapePredicateArg,
195
232
  escapeUiSelectorArg,
196
233
  extractElementId,
@@ -201,6 +238,7 @@ export {
201
238
  healSelector,
202
239
  huntSchema,
203
240
  injectUsePortIntoXctestrun,
241
+ installMacdriver,
204
242
  interpolateHunt,
205
243
  iosAppAllowedIdentities,
206
244
  iosNodeToNative,
@@ -217,7 +255,14 @@ export {
217
255
  loadHunt,
218
256
  loadHuntMeta,
219
257
  loadHuntTags,
258
+ macdriverAssetName,
259
+ macdriverAssetUrl,
220
260
  macdriverBuildInstructions,
261
+ macdriverChecksumName,
262
+ macdriverInstallRoot,
263
+ macdriverInstalledBinary,
264
+ macdriverReleaseTag,
265
+ macdriverVersionDir,
221
266
  matchAndroidSelector,
222
267
  matchIosSelector,
223
268
  matchNativeTree,
@@ -227,6 +272,8 @@ export {
227
272
  parseAdbDevices,
228
273
  parseAndroidHierarchy,
229
274
  parseAndroidSelector,
275
+ parseChecksumFile,
276
+ parseCodesignDetails,
230
277
  parseForwardPort,
231
278
  parseIosHierarchy,
232
279
  parseIosSelector,
@@ -253,19 +300,26 @@ export {
253
300
  resolveWdaTestRun,
254
301
  runHunt,
255
302
  runSuite,
303
+ runVersionProbe,
256
304
  selectDeviceSerial,
257
305
  selectSimulatorUdid,
306
+ sha256Hex,
258
307
  shortIosType,
259
308
  stepSchema,
309
+ tccGuidance,
260
310
  unquoteSelectorValue,
261
311
  unwrapAndroidTextSelector,
262
312
  unwrapIosTextSelector,
263
313
  unwrapNativeTextSelector,
264
314
  updateBacklogFromSuite,
315
+ validateMacdriverArchiveEntries,
316
+ validateMacdriverVersion,
317
+ verifyMacdriverSignature,
265
318
  waitForAgentReady,
266
319
  waitForWdaReady,
267
320
  wdaCacheDir,
268
321
  wdaTestRunArgs,
269
- webOnlyReason
322
+ webOnlyReason,
323
+ zipinfoArchiveLister
270
324
  };
271
325
  //# sourceMappingURL=lib.js.map
@@ -10,7 +10,7 @@ import {
10
10
  loadHuntTags,
11
11
  resolveViewport,
12
12
  warnLegacyConfigDir
13
- } from "./chunk-WHAMB4TY.js";
13
+ } from "./chunk-JFJQNJSJ.js";
14
14
  export {
15
15
  CONFIG_DIR,
16
16
  LEGACY_CONFIG_DIR,
@@ -24,4 +24,4 @@ export {
24
24
  resolveViewport,
25
25
  warnLegacyConfigDir
26
26
  };
27
- //# sourceMappingURL=loader-PBBYV3U7.js.map
27
+ //# sourceMappingURL=loader-JTHA4BYG.js.map
@@ -5,7 +5,7 @@
5
5
  #
6
6
  # Run it: prowl run hello
7
7
  #
8
- # Browse more hunt templates at https://hub.prowl.tools
8
+ # See .prowl/hunts/login-flow.yml for a fuller example (auth, secrets, assertions).
9
9
 
10
10
  name: hello
11
11
  description: Verify the target app loads successfully
@@ -0,0 +1,58 @@
1
+ # Login Flow
2
+ # ---
3
+ # Pattern: Authentication — email/password login with redirect verification
4
+ # What it tests: Fill credentials, submit, verify redirect to dashboard.
5
+ # Customize:
6
+ # - Update the selectors and URL paths to match your app's login page
7
+ # - Store credentials in .prowl/.env and reference them with {{VAR}}
8
+ #
9
+ # Tip: Use `prowl login` to capture auth state so other hunts can skip login.
10
+
11
+ name: login-flow
12
+ description: Log in with email and password, verify redirect to dashboard
13
+
14
+ tags:
15
+ - auth
16
+ - login
17
+ - credentials
18
+
19
+ # Store secrets in .prowl/.env — they'll be redacted in reports automatically.
20
+ # Example .env:
21
+ # TEST_EMAIL=user@example.com
22
+ # TEST_PASSWORD=secret123
23
+ vars:
24
+ EMAIL: "{{TEST_EMAIL}}"
25
+ PASSWORD: "{{TEST_PASSWORD}}"
26
+
27
+ steps:
28
+ - navigate: "/login"
29
+
30
+ # Shorthand fill — Prowl finds the input by its label or placeholder text.
31
+ # Equivalent explicit form:
32
+ # fill:
33
+ # selector: "input[placeholder='Email']"
34
+ # value: "{{EMAIL}}"
35
+ - fill:
36
+ "Email": "{{EMAIL}}"
37
+
38
+ - fill:
39
+ "Password": "{{PASSWORD}}"
40
+
41
+ # Shorthand click — Prowl finds a button by its text content.
42
+ # Equivalent explicit form:
43
+ # click:
44
+ # selector: "button:has-text('Sign In')"
45
+ - click: "Sign In"
46
+
47
+ # Wait for navigation to complete after login
48
+ - waitForUrl:
49
+ value: "/dashboard"
50
+ timeout: 10000
51
+
52
+ # Mid-flow assertion — verify the dashboard loaded
53
+ - assert:
54
+ visible: "Dashboard"
55
+
56
+ assertions:
57
+ - urlIncludes: "/dashboard"
58
+ - noConsoleErrors: true