@jevitate/cli 0.12.0 → 0.13.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.
Files changed (135) hide show
  1. package/dist/bin.js +48283 -47589
  2. package/dist/build-info.generated.js +2 -2
  3. package/dist/explore-cli/adversarial-strategy.d.ts +3 -0
  4. package/dist/explore-cli/adversarial-strategy.js +99 -0
  5. package/dist/explore-cli/adversarial-strategy.js.map +1 -0
  6. package/dist/explore-cli/coverage-strategy.d.ts +3 -0
  7. package/dist/explore-cli/coverage-strategy.js +95 -0
  8. package/dist/explore-cli/coverage-strategy.js.map +1 -0
  9. package/dist/explore-cli/feature-strategy.d.ts +3 -0
  10. package/dist/explore-cli/feature-strategy.js +59 -0
  11. package/dist/explore-cli/feature-strategy.js.map +1 -0
  12. package/dist/explore-cli/goal-strategy.d.ts +3 -0
  13. package/dist/explore-cli/goal-strategy.js +184 -0
  14. package/dist/explore-cli/goal-strategy.js.map +1 -0
  15. package/dist/explore-cli/options.d.ts +3 -0
  16. package/dist/explore-cli/options.js +155 -0
  17. package/dist/explore-cli/options.js.map +1 -0
  18. package/dist/explore-cli/run.d.ts +7 -0
  19. package/dist/explore-cli/run.js +682 -0
  20. package/dist/explore-cli/run.js.map +1 -0
  21. package/dist/explore-cli/shared.d.ts +158 -0
  22. package/dist/explore-cli/shared.js +20 -0
  23. package/dist/explore-cli/shared.js.map +1 -0
  24. package/dist/explore-cli/usability-strategy.d.ts +3 -0
  25. package/dist/explore-cli/usability-strategy.js +136 -0
  26. package/dist/explore-cli/usability-strategy.js.map +1 -0
  27. package/dist/explore-cli.d.ts +2 -2
  28. package/dist/explore-cli.js +2 -1347
  29. package/dist/explore-cli.js.map +1 -1
  30. package/dist/journey-anchor-api.d.ts +10 -9
  31. package/dist/journey-anchor-api.js +12 -22
  32. package/dist/journey-anchor-api.js.map +1 -1
  33. package/dist/journey-anchor-cli.d.ts +1 -1
  34. package/dist/journey-anchor-cli.js +10 -6
  35. package/dist/journey-anchor-cli.js.map +1 -1
  36. package/dist/journey-cli/anchors.d.ts +4 -0
  37. package/dist/journey-cli/anchors.js +48 -0
  38. package/dist/journey-cli/anchors.js.map +1 -0
  39. package/dist/journey-cli/find.d.ts +4 -0
  40. package/dist/journey-cli/find.js +44 -0
  41. package/dist/journey-cli/find.js.map +1 -0
  42. package/dist/journey-cli/lint.d.ts +4 -0
  43. package/dist/journey-cli/lint.js +76 -0
  44. package/dist/journey-cli/lint.js.map +1 -0
  45. package/dist/journey-cli/list.d.ts +4 -0
  46. package/dist/journey-cli/list.js +48 -0
  47. package/dist/journey-cli/list.js.map +1 -0
  48. package/dist/journey-cli/migrate.d.ts +4 -0
  49. package/dist/journey-cli/migrate.js +101 -0
  50. package/dist/journey-cli/migrate.js.map +1 -0
  51. package/dist/journey-cli/promote.d.ts +4 -0
  52. package/dist/journey-cli/promote.js +181 -0
  53. package/dist/journey-cli/promote.js.map +1 -0
  54. package/dist/journey-cli/publish.d.ts +4 -0
  55. package/dist/journey-cli/publish.js +70 -0
  56. package/dist/journey-cli/publish.js.map +1 -0
  57. package/dist/journey-cli/review.d.ts +4 -0
  58. package/dist/journey-cli/review.js +103 -0
  59. package/dist/journey-cli/review.js.map +1 -0
  60. package/dist/journey-cli/run.d.ts +4 -0
  61. package/dist/journey-cli/run.js +244 -0
  62. package/dist/journey-cli/run.js.map +1 -0
  63. package/dist/journey-cli/shared.d.ts +9 -0
  64. package/dist/journey-cli/shared.js +12 -0
  65. package/dist/journey-cli/shared.js.map +1 -0
  66. package/dist/journey-cli/verify.d.ts +4 -0
  67. package/dist/journey-cli/verify.js +125 -0
  68. package/dist/journey-cli/verify.js.map +1 -0
  69. package/dist/journey-cli.d.ts +3 -2
  70. package/dist/journey-cli.js +21 -949
  71. package/dist/journey-cli.js.map +1 -1
  72. package/dist/journey-review/render.d.ts +43 -0
  73. package/dist/journey-review/render.js +461 -0
  74. package/dist/journey-review/render.js.map +1 -0
  75. package/dist/journey-review.d.ts +1 -4
  76. package/dist/journey-review.js +16 -391
  77. package/dist/journey-review.js.map +1 -1
  78. package/dist/log-sources.js +17 -1
  79. package/dist/log-sources.js.map +1 -1
  80. package/dist/mcp-api.js +16 -821
  81. package/dist/mcp-api.js.map +1 -1
  82. package/dist/mcp-cli-tools.js +12 -4
  83. package/dist/mcp-cli-tools.js.map +1 -1
  84. package/dist/mcp-tools/cli.d.ts +3 -0
  85. package/dist/mcp-tools/cli.js +20 -0
  86. package/dist/mcp-tools/cli.js.map +1 -0
  87. package/dist/mcp-tools/explore.d.ts +3 -0
  88. package/dist/mcp-tools/explore.js +141 -0
  89. package/dist/mcp-tools/explore.js.map +1 -0
  90. package/dist/mcp-tools/findings.d.ts +3 -0
  91. package/dist/mcp-tools/findings.js +277 -0
  92. package/dist/mcp-tools/findings.js.map +1 -0
  93. package/dist/mcp-tools/inbox.d.ts +3 -0
  94. package/dist/mcp-tools/inbox.js +106 -0
  95. package/dist/mcp-tools/inbox.js.map +1 -0
  96. package/dist/mcp-tools/journey.d.ts +3 -0
  97. package/dist/mcp-tools/journey.js +260 -0
  98. package/dist/mcp-tools/journey.js.map +1 -0
  99. package/dist/mcp-tools/shared.d.ts +39 -0
  100. package/dist/mcp-tools/shared.js +69 -0
  101. package/dist/mcp-tools/shared.js.map +1 -0
  102. package/dist/sweep-api.d.ts +9 -0
  103. package/dist/sweep-api.js +70 -2
  104. package/dist/sweep-api.js.map +1 -1
  105. package/dist/sweep-cli.d.ts +2 -0
  106. package/dist/sweep-cli.js +22 -5
  107. package/dist/sweep-cli.js.map +1 -1
  108. package/dist/ux-usability/analysis.d.ts +14 -0
  109. package/dist/ux-usability/analysis.js +106 -0
  110. package/dist/ux-usability/analysis.js.map +1 -0
  111. package/dist/ux-usability/done-adjudication.d.ts +15 -0
  112. package/dist/ux-usability/done-adjudication.js +56 -0
  113. package/dist/ux-usability/done-adjudication.js.map +1 -0
  114. package/dist/ux-usability/hang.d.ts +5 -0
  115. package/dist/ux-usability/hang.js +41 -0
  116. package/dist/ux-usability/hang.js.map +1 -0
  117. package/dist/ux-usability/loop.d.ts +15 -0
  118. package/dist/ux-usability/loop.js +104 -0
  119. package/dist/ux-usability/loop.js.map +1 -0
  120. package/dist/ux-usability/observe.d.ts +7 -0
  121. package/dist/ux-usability/observe.js +89 -0
  122. package/dist/ux-usability/observe.js.map +1 -0
  123. package/dist/ux-usability/result.d.ts +11 -0
  124. package/dist/ux-usability/result.js +113 -0
  125. package/dist/ux-usability/result.js.map +1 -0
  126. package/dist/ux-usability/setup.d.ts +75 -0
  127. package/dist/ux-usability/setup.js +203 -0
  128. package/dist/ux-usability/setup.js.map +1 -0
  129. package/dist/ux-usability/teardown.d.ts +3 -0
  130. package/dist/ux-usability/teardown.js +13 -0
  131. package/dist/ux-usability/teardown.js.map +1 -0
  132. package/dist/ux-usability.d.ts +14 -17
  133. package/dist/ux-usability.js +15 -589
  134. package/dist/ux-usability.js.map +1 -1
  135. package/package.json +7 -7
@@ -0,0 +1,155 @@
1
+ import { JEV_PROVIDER_FLAG_HELP, jevProviderArg } from "../cli-shared.js";
2
+ import { TAG_FLAG, TAG_HELP, TARGET_FLAG, TARGET_HELP, collectTag } from "../run-tags-cli.js";
3
+ import { withFixtureFlags } from "../fixture-cli.js";
4
+ import { positiveNumberArg, nonNegativeIntArg, positiveIntArg, ratioArg } from "../cli-args.js";
5
+ import { withBrowserLaunchFlags, withDemoFlags, withScreenshotsFlag, withEmulationFlags, collectParam, EXPLORE_OUTCOME_HELP } from "../cli-shared.js";
6
+ import { withEnvironmentFlags } from "../environments.js";
7
+ import { GOAL_RUN_OPTIONS } from "../goal-run-flags.js";
8
+ /** The `jevitate explore` command and every flag it takes (moved verbatim out of registerExploreCommands). */
9
+ export function declareExploreCommand(program) {
10
+ return withEnvironmentFlags(withScreenshotsFlag(withEmulationFlags(withFixtureFlags(withDemoFlags(withBrowserLaunchFlags(program
11
+ .command("explore")
12
+ .description("goal-directed exploration -> a deterministic Recording (authoring/test plane)")), { recordVideo: true, overlay: true })))))
13
+ .option("--url <url>", "target URL (must be an authorized origin)")
14
+ .option(TARGET_FLAG, TARGET_HELP)
15
+ .option("--from-journey <id>", "journey-anchored exploration (#293): start from a PROMOTED Journey instead of --url — its first --at-step steps are replayed " +
16
+ "in the mission's own browser context (page, form contents and session kept; fail-closed, never self-healed; --env/--base-url apply), " +
17
+ "then the mission starts on the live page. A replay that stops before the anchor ends the run inconclusive (failure.kind journey-stale, exit 2). " +
18
+ "Strategies: goal, coverage, exploratory, adversarial, usability")
19
+ .option("--at-step <n|name|all|anchors>", "with --from-journey: the step to branch off — a 1-based top-level step number or an anchor name (`jevitate journey anchors <id>`); " +
20
+ "`all` sweeps every step and `anchors` every anchor: each a fresh session (restored by --fixtures), --max-actions/--max-decisions split evenly per stop, one deduped report")
21
+ .option("--param <kv>", "with --from-journey: a Journey param as key=value (repeatable); only the prefix's own params are required", collectParam, {})
22
+ .option("--journeys-dir <path>", "with --from-journey: the journeys directory (default: the repo's .jevitate/journeys; outside a repo ~/.jevitate/journeys)")
23
+ .option("--strategy <name>", "exploration strategy: goal (default) | coverage | exploratory | adversarial | usability (UX review: ranked, cited findings)", "goal")
24
+ .option("--goal <text>", "natural-language goal / job (required for --strategy goal and usability)")
25
+ .option("--app-class <class>", "app class for UX calibration (required for --strategy usability), e.g. consumer|admin|internal")
26
+ .option("--show <labels>", "opt-in filter on the quality grade (comma list of actionable,relevant-minor,generic,wrong); others are suppressed and counted; default JEVITATE_UX_SHOW, then ~/.jevitate/config.json ux.show, then ALL grades — the grader is uncalibrated (#133), so by default every finding is shown with its grade")
27
+ .option("--min-confidence <n>", "(--strategy usability) findings below this FINDING confidence (0..1, a finding's own violation/applicability/grounding score — NOT its quality-grade confidence, a separate independent-grader number shown as finding.quality.confidence) are suppressed and counted in report.suppressed; default JEVITATE_UX_MIN_CONFIDENCE, then ~/.jevitate/config.json ux.minConfidence, then 0.3")
28
+ .option("--max-findings-per-page <n>", "(--strategy usability) cap on UX findings per route/page, highest-confidence first; the rest are counted in report.suppressed as per-page-cap, never dropped silently; default JEVITATE_UX_MAX_FINDINGS_PER_PAGE, then ~/.jevitate/config.json ux.maxFindingsPerPage, then 5")
29
+ .option("--product <file>", "(--strategy usability) product facts JSON (plans/prices, key journeys, each page's intended next step) the review checks screens against in code; default .jevitate/product.json in the project when present (docs/ux-findings.md)")
30
+ .option("--probe-guards", "(--strategy usability) opt in to clicking each destructive control once to check for a confirmation step — fail-safe: every write and destructive-looking request is aborted, and a page with an open WebSocket/EventSource or a service worker is not probed; without it those claims are reported unverifiable (docs/ux-findings.md)")
31
+ .option("--polish", "(--strategy usability) polish each verified UX finding's recommendation with one generation call (opt-in; the default prose is built from templates)")
32
+ .option("--success <spec>", [
33
+ "independent success check (repeatable; every one must hold; --strategy goal and usability). Kinds:",
34
+ "urlIncludes:<text> | visible:<d> | textIncludes:<d>|<text> (case-insensitive) | count:<d>|min=<n>,max=<n>",
35
+ "| valueEquals:<d>|<value> (a form control's value) | reloadThen:<check> (reload first: proves it persisted)",
36
+ "| visual state (#148, read and decided by code): style:<d>|<prop><op><value> (computed style of every match;",
37
+ "<prop> an allowlisted CSS property or a channel of one, e.g. alpha(background-color)>0, color=rgb(255, 0, 0); op = != > >= < <=)",
38
+ "| inViewport:<d>[|min=<ratio>] (visible fraction, default 0.5) | box:<d>|minWidth=<n>,maxWidth=<n>,minHeight=<n>,maxHeight=<n>",
39
+ "| overlaps:<d>|<d2> | noOverlap:<d>|<d2> | attr:<d>|<name>=<value> (or <name> present, !<name> absent)",
40
+ "| flashed:<d>|class=<cls> (or attr=<name>, animation)[|withinMs=<n>] (a transient state gained after the last user input)",
41
+ "| requestMade:<METHOD> <path-glob> | responseStatus:<METHOD> <path-glob>=<2xx|4xx|code>.",
42
+ "<d> is testId=..;role=..;name=..;label=..;text=..;css=.. or a CSS selector such as [data-testid=x].",
43
+ "<path-glob> must start with \"/\" (it matches the request's path, e.g. /api/profile/* or /api/**); * as METHOD matches any method.",
44
+ "e.g. --success 'requestMade:PUT /api/profile' --success 'reloadThen:valueEquals:[data-testid=last-name]|Litmus'.",
45
+ "Omit it for a find-out goal (e.g. \"find out how many contacts... report the answer\"): the run must then end",
46
+ "with the model's own `report` op, and the grounded answer (#101) is the verdict — no page/network check needed.",
47
+ ].join(" "), (v, prev) => [...prev, v], [])
48
+ .addOption(GOAL_RUN_OPTIONS.successWhen())
49
+ .addOption(GOAL_RUN_OPTIONS.allowVacuousChecks())
50
+ .addOption(GOAL_RUN_OPTIONS.actionDeltas())
51
+ .option("--feature <name>", "run the capability-scoped feature-testing mission (instead of --goal/--success)")
52
+ .option("--route <glob>", "in-scope route glob (repeatable), e.g. /thread/** — for --feature it replaces the default scope (the start URL's route and everything under it); it widens --strategy adversarial/coverage/exploratory beyond the start URL's route", (v, prev) => [...prev, v], [])
53
+ .option("--scope <mode>", "--strategy coverage/exploratory: 'app' widens containment to the whole app (same as --route '/**'); default: the start URL's route plus --route globs")
54
+ .option("--allow <origin>", "authorized origin (repeatable); REPLACES the default allowlist when given (the URL's own origin is used only when --allow is omitted entirely) -- include the URL's own origin explicitly if you still need it", (v, prev) => [...prev, v], [])
55
+ .addOption(GOAL_RUN_OPTIONS.secret())
56
+ .addOption(GOAL_RUN_OPTIONS.secretField())
57
+ .addOption(GOAL_RUN_OPTIONS.totp())
58
+ .addOption(GOAL_RUN_OPTIONS.typeFixture())
59
+ .addOption(GOAL_RUN_OPTIONS.fixture())
60
+ .option("--storage-state <file>", "Playwright storageState JSON to start the session authenticated (deterministic login pre-step); must exist")
61
+ .option("--auth-check <mode>", "#427 pre-flight auth check before a run that starts from a session (--storage-state, --persona/--personas, --actor's primary): " +
62
+ "load the session, open --url and end the run fast (inconclusive, failure.kind auth-expired, exit 2) when it lands on a sign-in page — the login page is never explored. " +
63
+ "auto (default): a login-like URL (/login, /signin, /sign-in, /auth, …) or a visible password field, unless --url is itself such a route; " +
64
+ "urlExcludes:<text>: expired when the landed URL includes <text>; selector:<css>: alive only when this signed-in marker is visible; off. " +
65
+ "A persona with login parameters (a personas file entry's `login`, or .jevitate/personas.json) is signed in again once instead")
66
+ .option("--actor <name=storageState>", "multi-actor mission (#147, goal only; repeatable): the FIRST actor is the primary (the only one the model drives, " +
67
+ "from its own storageState); every other actor is an observer in its OWN fresh context that only runs the " +
68
+ "--invariants' cross-actor checks (capture + probe as:/deniedAs) — never clicks or types. Replaces --storage-state", (v, prev) => [...prev, v], [])
69
+ .addOption(GOAL_RUN_OPTIONS.saveStorageState())
70
+ .option("--max-actions <n>", "hard cap on executed actions", positiveIntArg)
71
+ .option("--max-decisions <n>", "hard cap on model decisions", positiveIntArg)
72
+ .option("--min-actions <n>", "--strategy goal (#424): the minimum actions before the model may conclude — until then an early report, blocked or answerless done is deferred and the run steered to breadth " +
73
+ "(unvisited tabs, detail views, primary forms). Default: 12 (at most half the budget) for an open-ended find-out goal (no --success; \"the main features\", \"what works\", \"every error\", \"explore\"…), none otherwise. Capped by --max-actions (with a warning)", positiveIntArg)
74
+ .option("--min-distinct-states <n>", "--strategy goal (#424): the minimum distinct page states (URL + visible controls) observed before the model may conclude. Default: 5 (scaled to the budget) for an open-ended find-out goal, none otherwise. Capped by the budget (with a warning)", positiveIntArg)
75
+ .option("--stall-timeout <seconds>", "--strategy coverage/exploratory and --feature: end the run inconclusive (stalled) when no step completes within this many seconds (default 120)", positiveNumberArg)
76
+ .addOption(GOAL_RUN_OPTIONS.replyWaitMs())
77
+ .addOption(GOAL_RUN_OPTIONS.replyQuietMs())
78
+ .addOption(GOAL_RUN_OPTIONS.replyCeilingMs())
79
+ .addOption(GOAL_RUN_OPTIONS.replyMaxChars())
80
+ .addOption(GOAL_RUN_OPTIONS.jobWaitMs())
81
+ .addOption(GOAL_RUN_OPTIONS.deny())
82
+ .addOption(GOAL_RUN_OPTIONS.paid())
83
+ .addOption(GOAL_RUN_OPTIONS.allowControl())
84
+ .addOption(GOAL_RUN_OPTIONS.allowDestructive())
85
+ .addOption(GOAL_RUN_OPTIONS.dialogs())
86
+ .option("--allow-writes", "let a find-out goal (no --success check, ended by report) change the app. By default it is read-only: controls that start a write flow " +
87
+ "(checkout, upgrade, create, save, submit…) are refused and the write requests an action fires are blocked, unless the goal itself asks for a change")
88
+ .option("--allow-write <glob>", "a write-request path a read-only find-out goal never blocks (repeatable; ** spans segments; a glob starting with https:// matches " +
89
+ "origin + path, e.g. https://abc.supabase.co/rest/v1/**), beyond the built-in auth-refresh ones " +
90
+ "(**/refresh*, **/token*, **/oauth/**, **/auth/**/refresh*). The app's background writes outside an action always pass", (v, prev) => [...prev, v], [])
91
+ .addOption(GOAL_RUN_OPTIONS.readRpc())
92
+ .option("--real", "use live Jev + OpenRouter gateways (requires keys)", false)
93
+ .option("--fake-ai", "use deterministic fake gateways (pipeline smoke only)", false)
94
+ .option("--jev-provider <provider>", JEV_PROVIDER_FLAG_HELP, jevProviderArg)
95
+ .option("--out <dir>", "directory to write the emitted Recording")
96
+ .option("--file-issues", "file findings as issues (needs a repo: --issue-repo or ~/.jevitate/filing.json); default: drafts only")
97
+ .option("--issue-repo <owner/name>", "the system-under-test repo findings for THIS target are filed to")
98
+ .addOption(GOAL_RUN_OPTIONS.hangReplays())
99
+ .option("--hang-replay-writes", "let hang replays re-send a paid/destructive write the run sent (default: such a hang is reported inconclusive, never replayed)")
100
+ .addOption(GOAL_RUN_OPTIONS.settleIgnore())
101
+ .addOption(GOAL_RUN_OPTIONS.longPollMs())
102
+ .addOption(GOAL_RUN_OPTIONS.apiPrefix())
103
+ .addOption(GOAL_RUN_OPTIONS.ignoreNoProgress())
104
+ .option("--jevitate-repo <owner/name>", "where jevitate engine findings are filed (default matt-cochran/jevitate)")
105
+ .option("--min-control-coverage <ratio>", "adversarial: share of the target's controls (0..1) a run must exercise before 'found nothing' is clean (default 0.25); below it the run is inconclusive", ratioArg)
106
+ .option("--no-require-form-submit", "adversarial: do not require a submitted form for a clean result (default: required when the target has a form)")
107
+ .option("--invariants <file>", "app-declared invariants JSON (repeatable; goal, coverage, exploratory, adversarial, --feature): checked around every action, a violation is a defect (exit 1). Validated before any browser opens; probes are GET/HEAD on an --allow origin only", (v, prev) => [...prev, v], [])
108
+ .option("--log-source <spec>", "backend log source (repeatable; every strategy, incl. usability): file:<path> (tailed from its current end) | docker:<container> (docker logs -f --since 0s) | cmd:<command> (needs --allow-log-cmd). Read-only, operator-declared, never the model's choice. Error/warning lines are correlated to the step they landed during and attached to its transcript evidence, redacted", (v, prev) => [...prev, v], [])
109
+ .addOption(GOAL_RUN_OPTIONS.allowSecretCmd())
110
+ .addOption(GOAL_RUN_OPTIONS.secretCmdAttempts())
111
+ .option("--allow-log-cmd", "opt-in: a --log-source cmd:<command> may run as a subprocess (operator-declared only; refused otherwise)", false)
112
+ .option("--log-defect <level|/regex/>", "backend log lines matching this (repeatable) become a server-log defect: a level (error|warn|info|debug, matched as level>=this) or a /regex/flags/ over the raw line. Its fingerprint is the normalized message (ids/numbers/uuids/timestamps stripped) plus the correlated route; verify-fix re-checks it by re-tailing the same --log-source(s)", (v, prev) => [...prev, v], [])
113
+ .option("--log-quiet-ok <spec>", "compatibility only since 0.8.0 (#420): a --log-source that opens and reads zero lines is now always a healthy oracle (the silence is recorded as serverLogs.quietSources), so this flag no longer changes any outcome. Kept so existing invocations keep working", (v, prev) => [...prev, v], [])
114
+ .option("--log-ignore <regex|substring>", "excludes known-noise backend log lines (repeatable, /regex/flags/ over the raw line or a plain substring) from BOTH correlation and the --log-defect oracle (#169 item 3) — e.g. a periodic background job's own expected error. Counted separately as serverLogs.ignoredLines; never makes --log-quiet-ok unnecessary, since an ignored line still proves the source is being tailed", (v, prev) => [...prev, v], [])
115
+ .option("--log-scope <regex|substring>", "attributes only backend log lines matching this (repeatable, /regex/flags/ or a plain substring, e.g. a tenant id) to the run (#282); the rest count as serverLogs.ignoredLines. For concurrent runs tailing one log. A line carrying one of the run's own correlation ids is in scope", (v, prev) => [...prev, v], [])
116
+ .option("--log-correlation-header <name>", "another request/response header that carries a correlation id (repeatable; built in: traceparent, x-request-id, x-correlation-id, request-id, x-amzn-trace-id, x-b3-traceid, x-cloud-trace-context). A log line carrying a request's id is attached to that exact request and the step that sent it, not by time (#204)", (v, prev) => [...prev, v], [])
117
+ .option("--log-id-pattern </regex/>", "how a correlation id is written in your log lines, when not as trace_id=/request_id=/correlation_id= or a traceparent (repeatable; the first capture group is the id). Once ids correlate, a line with another request's id is never attributed to the run (#204)", (v, prev) => [...prev, v], [])
118
+ .option("--log-triage", "#313: record the run's whole signal timeline (backend lines at every level, the browser's console, page errors, failed requests) to <run>.signals.jsonl, " +
119
+ "and attach to each defect only the lines that relate to it (defects[].relatedLogs): code keeps the lines correlated to its request and prefilters its step's window, " +
120
+ "then, with --real, Jev scores each remaining line's relevance (log text goes to the judgment model, redacted — operator opt-in, never an MCP argument). Needs --log-source")
121
+ .option("--server-log-drain-ms <ms>", "how long to keep tailing --log-source after the run's last action, to catch async backend work that settles after the browser gave up (default 3000)", nonNegativeIntArg)
122
+ .option("--repeat <n>", "run the mission N times, one after another, each in a fresh browser context, and vote (#141): findings seen in fewer than --min-agreement runs are reported as flaky, not counted")
123
+ .option("--min-agreement <k>", "with --repeat: runs a finding (and the outcome) must recur in to count (default: a majority of N)")
124
+ .option("--persona <name=storageState>", "run the same mission once per persona (repeatable), serially, each from its own storageState, and diff them (#143): requests, statuses (a 403 vs 200 is a candidate RBAC finding), controls, outcome", (v, prev) => [...prev, v], [])
125
+ .option("--personas <file>", "personas JSON: {\"<name>\": \"<storageState>\"} or {\"personas\": [{\"name\", \"storageState\", \"login\"?}]} — #427: `login` " +
126
+ "({url, userEnv, passwordEnv, userField?, passwordField?, submit?, success?}, or #449 {api, userEnv, passwordEnv} for an HTTP sign-in endpoint; environment variable NAMES only) re-mints an expired session once. " +
127
+ "A bare --persona <name> is the project's persona of that name (.jevitate/personas.json, same format)")
128
+ .option("--check-overflow", "check the horizontal-overflow (#149) and vertical-clipping (#302: text cut off by a fixed-height box or above the page top) hard signals even at a desktop (>=1024px) viewport — --strategy coverage/exploratory " +
129
+ "(a defect), adversarial (a defect) or usability (a signal finding). " +
130
+ "On by default whenever --viewport/--device emulates a viewport narrower than 1024px")
131
+ .option("--ignore-overflow <selector>", "a CSS selector (repeatable) whose overflow or clipping is intentional — excluded from the horizontal-overflow and vertical-clipping signals, like --ignore-no-progress", (v, prev) => [...prev, v], [])
132
+ .option("--evidence-video", "per defect: replay its minimal repro with captions + the failing step marked, record a masked clip and before/at screenshots (defects[].evidence; linked from drafts)")
133
+ .option("--json", "emit the JSON envelope (default: a human summary)")
134
+ .addHelpText("after", [
135
+ "",
136
+ "Authenticated missions:",
137
+ " --secret only REDACTS a value; it is never typed. Prefer starting logged in: save a Playwright",
138
+ " storageState once (e.g. `npx playwright codegen --save-storage=auth.json <url>`) and pass",
139
+ " --storage-state auth.json. To drive a login/signup form, bind fields to environment variables:",
140
+ " --secret-field 'label=Password=env:APP_PASSWORD' and, for MFA, --totp 'label=Code=env:APP_TOTP_SEED'.",
141
+ " See 'Authenticated missions' in the README.",
142
+ ].join("\n"))
143
+ .addHelpText("after", [
144
+ "",
145
+ "Viewport/device emulation (#149):",
146
+ " Default: Playwright's own default viewport (1280x720, desktop, no touch) — nothing narrower",
147
+ " unless --viewport or --device is given (mutually exclusive). --device validates against",
148
+ " Playwright's built-in devices registry (viewport + scale + mobile/touch + UA); an unknown",
149
+ " name is refused before any browser opens. The emulation is recorded on the Recording, so",
150
+ " verify-fix/regression replay reproduce under the SAME device by default.",
151
+ ].join("\n"))
152
+ .addHelpText("after", EXPLORE_OUTCOME_HELP)
153
+ .option(TAG_FLAG, TAG_HELP, collectTag, []);
154
+ }
155
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/explore-cli/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Command } from "commander";
2
+ import { type CliDeps } from "../cli-shared.js";
3
+ /**
4
+ * Registers `jevitate explore` (every strategy: goal, coverage, exploratory, adversarial, usability, feature, multi-run).
5
+ * `buildProgram` builds a fresh program for each run of a multi-run (#141/#143).
6
+ */
7
+ export declare function registerExploreRun(program: Command, deps: CliDeps, buildProgram: (deps: CliDeps) => Command): void;