@jevitate/cli 0.6.0 → 0.8.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.
- package/dist/ai-cli.d.ts +3 -1
- package/dist/ai-cli.js +60 -16
- package/dist/ai-cli.js.map +1 -1
- package/dist/approval-provenance.d.ts +120 -0
- package/dist/approval-provenance.js +300 -0
- package/dist/approval-provenance.js.map +1 -0
- package/dist/author-journey-cli.js +11 -18
- package/dist/author-journey-cli.js.map +1 -1
- package/dist/bin.js +29012 -20685
- package/dist/build-info.generated.js +2 -2
- package/dist/builtin-analyzers.d.ts +7 -0
- package/dist/builtin-analyzers.js +19 -0
- package/dist/builtin-analyzers.js.map +1 -0
- package/dist/campaign-cli.d.ts +6 -0
- package/dist/campaign-cli.js +9 -4
- package/dist/campaign-cli.js.map +1 -1
- package/dist/catalog-analysis.d.ts +70 -0
- package/dist/catalog-analysis.js +507 -0
- package/dist/catalog-analysis.js.map +1 -0
- package/dist/catalog-api.d.ts +73 -0
- package/dist/catalog-api.js +97 -0
- package/dist/catalog-api.js.map +1 -0
- package/dist/catalog-cli.d.ts +12 -0
- package/dist/catalog-cli.js +224 -0
- package/dist/catalog-cli.js.map +1 -0
- package/dist/catalog-review.d.ts +29 -0
- package/dist/catalog-review.js +290 -0
- package/dist/catalog-review.js.map +1 -0
- package/dist/catalog.d.ts +133 -0
- package/dist/catalog.js +352 -0
- package/dist/catalog.js.map +1 -0
- package/dist/check-api.js +24 -2
- package/dist/check-api.js.map +1 -1
- package/dist/check-cli.d.ts +3 -0
- package/dist/check-cli.js +18 -4
- package/dist/check-cli.js.map +1 -1
- package/dist/check-execute.js +25 -9
- package/dist/check-execute.js.map +1 -1
- package/dist/check-plan.js +4 -1
- package/dist/check-plan.js.map +1 -1
- package/dist/check-suite.js +6 -3
- package/dist/check-suite.js.map +1 -1
- package/dist/check-types.d.ts +12 -1
- package/dist/check-types.js.map +1 -1
- package/dist/cli-output.js +86 -4
- package/dist/cli-output.js.map +1 -1
- package/dist/cli-shared.d.ts +22 -2
- package/dist/cli-shared.js +34 -5
- package/dist/cli-shared.js.map +1 -1
- package/dist/demo-aspect-api.d.ts +21 -5
- package/dist/demo-aspect-api.js +30 -1
- package/dist/demo-aspect-api.js.map +1 -1
- package/dist/demo-aspect-cli.js +64 -5
- package/dist/demo-aspect-cli.js.map +1 -1
- package/dist/environments.js +6 -1
- package/dist/environments.js.map +1 -1
- package/dist/exit-codes.js +4 -0
- package/dist/exit-codes.js.map +1 -1
- package/dist/explore-adversarial.d.ts +3 -1
- package/dist/explore-adversarial.js +3 -3
- package/dist/explore-adversarial.js.map +1 -1
- package/dist/explore-author.js +5 -2
- package/dist/explore-author.js.map +1 -1
- package/dist/explore-cli.js +162 -13
- package/dist/explore-cli.js.map +1 -1
- package/dist/explore-coverage.d.ts +6 -2
- package/dist/explore-coverage.js +5 -4
- package/dist/explore-coverage.js.map +1 -1
- package/dist/explore-feature.d.ts +3 -1
- package/dist/explore-feature.js +2 -2
- package/dist/explore-feature.js.map +1 -1
- package/dist/explore-goal.d.ts +37 -6
- package/dist/explore-goal.js +70 -52
- package/dist/explore-goal.js.map +1 -1
- package/dist/explore-shared.d.ts +12 -7
- package/dist/explore-shared.js +9 -1
- package/dist/explore-shared.js.map +1 -1
- package/dist/goal-run-flags.d.ts +2 -0
- package/dist/goal-run-flags.js +8 -1
- package/dist/goal-run-flags.js.map +1 -1
- package/dist/http-5xx-outcome.d.ts +8 -3
- package/dist/http-5xx-outcome.js +5 -15
- package/dist/http-5xx-outcome.js.map +1 -1
- package/dist/init-cli.d.ts +7 -0
- package/dist/init-cli.js +79 -9
- package/dist/init-cli.js.map +1 -1
- package/dist/init-codeowners.d.ts +39 -0
- package/dist/init-codeowners.js +91 -0
- package/dist/init-codeowners.js.map +1 -0
- package/dist/init-keys.d.ts +3 -1
- package/dist/init-keys.js +20 -8
- package/dist/init-keys.js.map +1 -1
- package/dist/init-skills.d.ts +85 -7
- package/dist/init-skills.js +303 -36
- package/dist/init-skills.js.map +1 -1
- package/dist/jev-advisor.d.ts +72 -0
- package/dist/jev-advisor.js +172 -0
- package/dist/jev-advisor.js.map +1 -0
- package/dist/journey-api.d.ts +104 -5
- package/dist/journey-api.js +165 -23
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-cli.d.ts +1 -1
- package/dist/journey-cli.js +320 -13
- package/dist/journey-cli.js.map +1 -1
- package/dist/journey-demo-api.d.ts +7 -1
- package/dist/journey-demo-api.js +8 -3
- package/dist/journey-demo-api.js.map +1 -1
- package/dist/journey-demo-cli.js +3 -0
- package/dist/journey-demo-cli.js.map +1 -1
- package/dist/journey-lint-sarif.d.ts +19 -0
- package/dist/journey-lint-sarif.js +48 -0
- package/dist/journey-lint-sarif.js.map +1 -0
- package/dist/journey-network-checks.d.ts +45 -9
- package/dist/journey-network-checks.js +117 -30
- package/dist/journey-network-checks.js.map +1 -1
- package/dist/journey-prefix.d.ts +24 -15
- package/dist/journey-prefix.js +53 -7
- package/dist/journey-prefix.js.map +1 -1
- package/dist/journey-review-api.d.ts +19 -0
- package/dist/journey-review-api.js +46 -0
- package/dist/journey-review-api.js.map +1 -0
- package/dist/journey-review-store.d.ts +16 -0
- package/dist/journey-review-store.js +95 -0
- package/dist/journey-review-store.js.map +1 -0
- package/dist/journey-review.d.ts +47 -0
- package/dist/journey-review.js +499 -0
- package/dist/journey-review.js.map +1 -0
- package/dist/journey-verify.d.ts +61 -0
- package/dist/journey-verify.js +144 -0
- package/dist/journey-verify.js.map +1 -0
- package/dist/key-report.d.ts +20 -5
- package/dist/key-report.js +32 -9
- package/dist/key-report.js.map +1 -1
- package/dist/kill-signal.js +10 -2
- package/dist/kill-signal.js.map +1 -1
- package/dist/load-api.js +9 -3
- package/dist/load-api.js.map +1 -1
- package/dist/load-cli.js +4 -2
- package/dist/load-cli.js.map +1 -1
- package/dist/log-classes.d.ts +73 -0
- package/dist/log-classes.js +167 -0
- package/dist/log-classes.js.map +1 -0
- package/dist/log-correlation.d.ts +29 -10
- package/dist/log-correlation.js +44 -21
- package/dist/log-correlation.js.map +1 -1
- package/dist/login-cli.d.ts +15 -0
- package/dist/login-cli.js +116 -0
- package/dist/login-cli.js.map +1 -0
- package/dist/logs-cli.js +3 -1
- package/dist/logs-cli.js.map +1 -1
- package/dist/mcp-api.d.ts +1 -0
- package/dist/mcp-api.js +61 -12
- package/dist/mcp-api.js.map +1 -1
- package/dist/mcp-cli-runner.d.ts +2 -0
- package/dist/mcp-cli-runner.js +3 -1
- package/dist/mcp-cli-runner.js.map +1 -1
- package/dist/mcp-cli-tools.d.ts +6 -0
- package/dist/mcp-cli-tools.js +182 -23
- package/dist/mcp-cli-tools.js.map +1 -1
- package/dist/mission-cli.js +8 -4
- package/dist/mission-cli.js.map +1 -1
- package/dist/mission-journal.d.ts +4 -1
- package/dist/mission-journal.js +9 -3
- package/dist/mission-journal.js.map +1 -1
- package/dist/mission-queue-cli.js +21 -2
- package/dist/mission-queue-cli.js.map +1 -1
- package/dist/mission-queue-runner.d.ts +6 -0
- package/dist/mission-queue-runner.js +33 -3
- package/dist/mission-queue-runner.js.map +1 -1
- package/dist/multi-run-cli.d.ts +7 -1
- package/dist/multi-run-cli.js +10 -3
- package/dist/multi-run-cli.js.map +1 -1
- package/dist/multi-run.d.ts +38 -3
- package/dist/multi-run.js +115 -23
- package/dist/multi-run.js.map +1 -1
- package/dist/persona-login.d.ts +199 -0
- package/dist/persona-login.js +574 -0
- package/dist/persona-login.js.map +1 -0
- package/dist/pre-approval.d.ts +98 -0
- package/dist/pre-approval.js +175 -0
- package/dist/pre-approval.js.map +1 -0
- package/dist/program.js +10 -0
- package/dist/program.js.map +1 -1
- package/dist/project-dir.d.ts +2 -1
- package/dist/project-dir.js +3 -1
- package/dist/project-dir.js.map +1 -1
- package/dist/promotions.d.ts +15 -0
- package/dist/promotions.js +52 -0
- package/dist/promotions.js.map +1 -0
- package/dist/readiness.d.ts +29 -0
- package/dist/readiness.js +291 -0
- package/dist/readiness.js.map +1 -0
- package/dist/regression-cli.js +4 -2
- package/dist/regression-cli.js.map +1 -1
- package/dist/report-api.d.ts +24 -2
- package/dist/report-api.js +33 -5
- package/dist/report-api.js.map +1 -1
- package/dist/report-cli.js +8 -1
- package/dist/report-cli.js.map +1 -1
- package/dist/result-schema.d.ts +12 -0
- package/dist/result-schema.js +8 -0
- package/dist/result-schema.js.map +1 -1
- package/dist/run-index.d.ts +4 -2
- package/dist/run-index.js +3 -1
- package/dist/run-index.js.map +1 -1
- package/dist/run-key-preflight.d.ts +2 -1
- package/dist/run-key-preflight.js +3 -2
- package/dist/run-key-preflight.js.map +1 -1
- package/dist/run-metadata.d.ts +26 -0
- package/dist/run-metadata.js +41 -0
- package/dist/run-metadata.js.map +1 -0
- package/dist/run-tags-cli.d.ts +12 -0
- package/dist/run-tags-cli.js +35 -0
- package/dist/run-tags-cli.js.map +1 -0
- package/dist/self-heal-adapter.js +3 -1
- package/dist/self-heal-adapter.js.map +1 -1
- package/dist/site-cli.d.ts +1 -1
- package/dist/site-cli.js +24 -1
- package/dist/site-cli.js.map +1 -1
- package/dist/source-cli.js +4 -2
- package/dist/source-cli.js.map +1 -1
- package/dist/source-run-api.js +17 -7
- package/dist/source-run-api.js.map +1 -1
- package/dist/suite-explore-options.d.ts +14 -0
- package/dist/suite-explore-options.js +7 -0
- package/dist/suite-explore-options.js.map +1 -1
- package/dist/sweep-api.d.ts +266 -0
- package/dist/sweep-api.js +828 -0
- package/dist/sweep-api.js.map +1 -0
- package/dist/sweep-cli.d.ts +9 -0
- package/dist/sweep-cli.js +115 -0
- package/dist/sweep-cli.js.map +1 -0
- package/dist/target-config.d.ts +5 -2
- package/dist/target-config.js +15 -0
- package/dist/target-config.js.map +1 -1
- package/dist/usability-capture.js +6 -0
- package/dist/usability-capture.js.map +1 -1
- package/dist/ux-cli.js +3 -1
- package/dist/ux-cli.js.map +1 -1
- package/dist/ux-usability.d.ts +9 -3
- package/dist/ux-usability.js +6 -4
- package/dist/ux-usability.js.map +1 -1
- package/dist/verify-fix-cli.js +4 -2
- package/dist/verify-fix-cli.js.map +1 -1
- package/package.json +13 -13
- package/skills/jevitate-demo/SKILL.md +5 -2
- package/skills/jevitate-explore/SKILL.md +6 -2
- package/skills/jevitate-getting-started/SKILL.md +12 -0
- package/skills/jevitate-run-journey/SKILL.md +17 -4
- package/skills/jevitate-test-campaign/SKILL.md +26 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explore-author.js","sourceRoot":"","sources":["../src/explore-author.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"explore-author.js","sourceRoot":"","sources":["../src/explore-author.ts"],"names":[],"mappings":"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"}
|
package/dist/explore-cli.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { JEV_PROVIDER_FLAG_HELP, jevProviderArg } from "./cli-shared.js";
|
|
2
|
+
import { TAG_FLAG, TAG_HELP, collectTag, taggedAction } from "./run-tags-cli.js";
|
|
1
3
|
import { existsSync } from "node:fs";
|
|
2
4
|
import { envCredentialStore, MissingCredentialError } from "@jevitate/ai-core";
|
|
3
5
|
import { loadLocalCredentials } from "./credentials-file.js";
|
|
4
|
-
import { FixtureNotFoundError, ScopeUnderivableError, UnauthorizedExploreTargetError, resolveCoverageThresholds, TypeFixtureSpecError, validateDenyPatterns, } from "@jevitate/explore";
|
|
6
|
+
import { FixtureNotFoundError, ScopeUnderivableError, UnauthorizedExploreTargetError, resolveCoverageThresholds, TypeFixtureSpecError, validateAllowControlPatterns, validateDenyPatterns, } from "@jevitate/explore";
|
|
5
7
|
import { loadTypeFixtures } from "./type-fixture-file.js";
|
|
6
8
|
import { secretCommandRunner } from "./secret-command.js";
|
|
7
9
|
import { ok, fail } from "./envelope.js";
|
|
@@ -24,14 +26,17 @@ import { runExploration, runCoverageMission, runAdversarialCliMission, CLI_ADVER
|
|
|
24
26
|
import { parseLogSourceSpecs, LogSourceSpecError } from "./log-sources.js";
|
|
25
27
|
import { triagedServerLog } from "./explore-shared.js";
|
|
26
28
|
import { parseLogDefectSpecs, parseLogIgnoreSpecs, parseLogScopeSpecs } from "./log-correlation.js";
|
|
29
|
+
import { LogClassesError, loadLogClassRules } from "./log-classes.js";
|
|
27
30
|
import { parseCorrelationHeaders, parseLogIdPatterns } from "./log-trace.js";
|
|
28
31
|
import { LogSpecError } from "./log-lines.js";
|
|
29
|
-
import { MultiRunArgsError, resolveMultiRunPlan, wantsMultiRun } from "./multi-run.js";
|
|
32
|
+
import { MultiRunArgsError, projectPersonaFor, resolveMultiRunPlan, wantsMultiRun } from "./multi-run.js";
|
|
33
|
+
import { authExpiredResult, ensurePersonaSession, LoginArgsError, parseAuthCheck } from "./persona-login.js";
|
|
30
34
|
import { MultiRunAbortedError, runExploreMultiRun } from "./multi-run-cli.js";
|
|
31
35
|
import { checkActorsAgainstSpec, resolveMissionActors } from "./mission-actors.js";
|
|
32
36
|
import { runUsabilityMission, UsabilityInvariantsUnsupportedError } from "./ux-api.js";
|
|
33
37
|
import { UxConfigError } from "./ux-config.js";
|
|
34
38
|
import { MinConfidenceError, QualityPolicyError, MaxFindingsPerRouteError, ProductFactsError } from "@jevitate/ux";
|
|
39
|
+
import { PlaywrightBrowserPort } from "@jevitate/playwright";
|
|
35
40
|
import { withBrowserLaunchFlags, withDemoFlags, withScreenshotsFlag, browserRunFromFlags, withEmulationFlags, emulationFromFlags, emitCommandResult, collectParam, environmentSeams, resolveDbPath, resolveJourneysDir, resolveMissionTargetsDir, stallTimeoutMs, EXPLORE_STRATEGIES, EXPLORE_OUTCOME_HELP, GatewaySelectionError, buildExploreGateways, } from "./cli-shared.js";
|
|
36
41
|
import { allowWithExtensions, assertExtensionTargetLoaded, multiWindowWarning } from "./browser-run-options.js";
|
|
37
42
|
import { ParamValidationError } from "@jevitate/journey";
|
|
@@ -46,6 +51,17 @@ import { forwardedArgv } from "./multi-run-cli.js";
|
|
|
46
51
|
import { ANCHORED_STRATEGIES, JourneyPrefixArgsError, JourneyPrefixStaleError, journeyStaleResult, resolveJourneyPrefix, } from "./journey-prefix.js";
|
|
47
52
|
import { clock } from "@jevitate/domain";
|
|
48
53
|
import { GOAL_RUN_OPTIONS, GoalRunFlagError, conversationFromFlags, dialogsFromFlags, secretFieldsFromFlags, successWhenFromFlags, targetFlagsFromFlags, } from "./goal-run-flags.js";
|
|
54
|
+
/** #427: the app root of a start URL bound from --fixtures (`<origin>${setup.x}`), or undefined without an origin. */
|
|
55
|
+
function fixtureBoundUrlRoot(url) {
|
|
56
|
+
try {
|
|
57
|
+
return `${new URL(url.slice(0, url.indexOf("${"))).origin}/`;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** #427: how long the pre-flight auth check (and a refresh's sign-in) may take to load a page. */
|
|
64
|
+
const AUTH_PREFLIGHT_TIMEOUT_MS = 30_000;
|
|
49
65
|
/**
|
|
50
66
|
* #293: the flags a sweep sets on each of its missions itself (the rest of the command line is
|
|
51
67
|
* forwarded to every mission as given).
|
|
@@ -109,12 +125,20 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
109
125
|
.addOption(GOAL_RUN_OPTIONS.typeFixture())
|
|
110
126
|
.addOption(GOAL_RUN_OPTIONS.fixture())
|
|
111
127
|
.option("--storage-state <file>", "Playwright storageState JSON to start the session authenticated (deterministic login pre-step); must exist")
|
|
128
|
+
.option("--auth-check <mode>", "#427 pre-flight auth check before a run that starts from a session (--storage-state, --persona/--personas, --actor's primary): " +
|
|
129
|
+
"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. " +
|
|
130
|
+
"auto (default): a login-like URL (/login, /signin, /sign-in, /auth, …) or a visible password field, unless --url is itself such a route; " +
|
|
131
|
+
"urlExcludes:<text>: expired when the landed URL includes <text>; selector:<css>: alive only when this signed-in marker is visible; off. " +
|
|
132
|
+
"A persona with login parameters (a personas file entry's `login`, or .jevitate/personas.json) is signed in again once instead")
|
|
112
133
|
.option("--actor <name=storageState>", "multi-actor mission (#147, goal only; repeatable): the FIRST actor is the primary (the only one the model drives, " +
|
|
113
134
|
"from its own storageState); every other actor is an observer in its OWN fresh context that only runs the " +
|
|
114
135
|
"--invariants' cross-actor checks (capture + probe as:/deniedAs) — never clicks or types. Replaces --storage-state", (v, prev) => [...prev, v], [])
|
|
115
136
|
.addOption(GOAL_RUN_OPTIONS.saveStorageState())
|
|
116
137
|
.option("--max-actions <n>", "hard cap on executed actions", positiveIntArg)
|
|
117
138
|
.option("--max-decisions <n>", "hard cap on model decisions", positiveIntArg)
|
|
139
|
+
.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 " +
|
|
140
|
+
"(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)
|
|
141
|
+
.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)
|
|
118
142
|
.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)
|
|
119
143
|
.addOption(GOAL_RUN_OPTIONS.replyWaitMs())
|
|
120
144
|
.addOption(GOAL_RUN_OPTIONS.replyQuietMs())
|
|
@@ -123,6 +147,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
123
147
|
.addOption(GOAL_RUN_OPTIONS.jobWaitMs())
|
|
124
148
|
.addOption(GOAL_RUN_OPTIONS.deny())
|
|
125
149
|
.addOption(GOAL_RUN_OPTIONS.paid())
|
|
150
|
+
.addOption(GOAL_RUN_OPTIONS.allowControl())
|
|
126
151
|
.addOption(GOAL_RUN_OPTIONS.allowDestructive())
|
|
127
152
|
.addOption(GOAL_RUN_OPTIONS.dialogs())
|
|
128
153
|
.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 " +
|
|
@@ -133,6 +158,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
133
158
|
.addOption(GOAL_RUN_OPTIONS.readRpc())
|
|
134
159
|
.option("--real", "use live Jev + OpenRouter gateways (requires keys)", false)
|
|
135
160
|
.option("--fake-ai", "use deterministic fake gateways (pipeline smoke only)", false)
|
|
161
|
+
.option("--jev-provider <provider>", JEV_PROVIDER_FLAG_HELP, jevProviderArg)
|
|
136
162
|
.option("--out <dir>", "directory to write the emitted Recording")
|
|
137
163
|
.option("--file-issues", "file findings as issues (needs a repo: --issue-repo or ~/.jevitate/filing.json); default: drafts only")
|
|
138
164
|
.option("--issue-repo <owner/name>", "the system-under-test repo findings for THIS target are filed to")
|
|
@@ -151,7 +177,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
151
177
|
.addOption(GOAL_RUN_OPTIONS.secretCmdAttempts())
|
|
152
178
|
.option("--allow-log-cmd", "opt-in: a --log-source cmd:<command> may run as a subprocess (operator-declared only; refused otherwise)", false)
|
|
153
179
|
.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], [])
|
|
154
|
-
.option("--log-quiet-ok <spec>", "
|
|
180
|
+
.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], [])
|
|
155
181
|
.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], [])
|
|
156
182
|
.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], [])
|
|
157
183
|
.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], [])
|
|
@@ -163,7 +189,9 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
163
189
|
.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")
|
|
164
190
|
.option("--min-agreement <k>", "with --repeat: runs a finding (and the outcome) must recur in to count (default: a majority of N)")
|
|
165
191
|
.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], [])
|
|
166
|
-
.option("--personas <file>", "personas JSON: {\"<name>\": \"<storageState>\"} or {\"personas\": [{\"name\", \"storageState\"}]}"
|
|
192
|
+
.option("--personas <file>", "personas JSON: {\"<name>\": \"<storageState>\"} or {\"personas\": [{\"name\", \"storageState\", \"login\"?}]} — #427: `login` " +
|
|
193
|
+
"({url, userEnv, passwordEnv, userField?, passwordField?, submit?, success?}, environment variable NAMES only) re-mints an expired session once. " +
|
|
194
|
+
"A bare --persona <name> is the project's persona of that name (.jevitate/personas.json, same format)")
|
|
167
195
|
.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 " +
|
|
168
196
|
"(a defect), adversarial (a defect) or usability (a signal finding). " +
|
|
169
197
|
"On by default whenever --viewport/--device emulates a viewport narrower than 1024px")
|
|
@@ -189,7 +217,8 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
189
217
|
" verify-fix/regression replay reproduce under the SAME device by default.",
|
|
190
218
|
].join("\n"))
|
|
191
219
|
.addHelpText("after", EXPLORE_OUTCOME_HELP)
|
|
192
|
-
.
|
|
220
|
+
.option(TAG_FLAG, TAG_HELP, collectTag, [])
|
|
221
|
+
.action(taggedAction(program, "explore", async function () {
|
|
193
222
|
const o = this.opts();
|
|
194
223
|
// #210: one output rule for every strategy — the envelope with --json, a human summary without.
|
|
195
224
|
const emitExplore = (envelope, exitCode, human = formatMissionHuman) => emitCommandResult(program, envelope, { json: o.json === true, command: "explore", human, ...(exitCode === undefined ? {} : { exitCode }) });
|
|
@@ -211,6 +240,17 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
211
240
|
emitExplore(fail(err.code, err.message));
|
|
212
241
|
return;
|
|
213
242
|
}
|
|
243
|
+
// #427: an unusable --auth-check is a usage error, refused before anything runs.
|
|
244
|
+
let authCheck;
|
|
245
|
+
try {
|
|
246
|
+
authCheck = parseAuthCheck(o.authCheck);
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
if (!(err instanceof LoginArgsError))
|
|
250
|
+
throw err;
|
|
251
|
+
emitExplore(fail("E_EXPLORE_ARGS", err.message));
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
214
254
|
// #195: a session file never lands in the repo's .jevitate/ (refused before any run, multi-runs included).
|
|
215
255
|
if (o.saveStorageState !== undefined) {
|
|
216
256
|
try {
|
|
@@ -228,6 +268,8 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
228
268
|
// refused, exit 64) before anything else — the start URL every later check uses is where the
|
|
229
269
|
// Journey's prefix lands.
|
|
230
270
|
let journeyPrefix;
|
|
271
|
+
/** #399: how the prefix was resolved — re-resolved once `${setup.x}` in a --param is bound (goal + --fixtures). */
|
|
272
|
+
let prefixRequest;
|
|
231
273
|
const anchoredFlags = [o.fromJourney, o.atStep, o.journeysDir, o.env, o.baseUrl].some((v) => v !== undefined);
|
|
232
274
|
if (anchoredFlags || Object.keys(o.param).length > 0) {
|
|
233
275
|
const refuse = (message) => emitExplore(fail("E_EXPLORE_ARGS", message));
|
|
@@ -253,6 +295,10 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
253
295
|
// #312: one anchored step with a state restore (--fixtures/--before/--after) on a non-goal
|
|
254
296
|
// strategy runs the same way — as a one-stop campaign, whose runner restores around the run.
|
|
255
297
|
const restoredSingle = !isSweepMode(o.atStep) && strategy !== "goal" && (o.fixtures !== undefined || o.before !== undefined || o.after !== undefined);
|
|
298
|
+
if ((isSweepMode(o.atStep) || restoredSingle) && Object.values(o.param).some((v) => v.includes("${setup."))) {
|
|
299
|
+
refuse("a --param holding ${setup.x} is bound from --fixtures only by a single --strategy goal run; pass the value itself here");
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
256
302
|
if (isSweepMode(o.atStep) || restoredSingle) {
|
|
257
303
|
if (o.real !== true && o.fakeAi !== true) {
|
|
258
304
|
emitExplore(fail("E_AI_SETUP_REQUIRED", "a sweep's missions are model-driven: pass --real or --fake-ai"));
|
|
@@ -317,7 +363,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
317
363
|
// The environment's own session applies when --storage-state names none (as `journey run`).
|
|
318
364
|
if (o.storageState === undefined && environment?.storageState !== undefined)
|
|
319
365
|
o.storageState = environment.storageState;
|
|
320
|
-
|
|
366
|
+
prefixRequest = {
|
|
321
367
|
dir: resolveJourneysDir(deps, o.journeysDir),
|
|
322
368
|
id: o.fromJourney,
|
|
323
369
|
atStep: o.atStep,
|
|
@@ -326,7 +372,8 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
326
372
|
...(o.storageState === undefined ? {} : { storageState: o.storageState }),
|
|
327
373
|
dbPath: resolveDbPath(deps),
|
|
328
374
|
environmentFlags: { ...(o.env === undefined ? {} : { env: o.env }), ...(o.baseUrl === undefined ? {} : { baseUrl: o.baseUrl }) },
|
|
329
|
-
}
|
|
375
|
+
};
|
|
376
|
+
journeyPrefix = await resolveJourneyPrefix(prefixRequest);
|
|
330
377
|
}
|
|
331
378
|
catch (err) {
|
|
332
379
|
if (isEnvironmentError(err) || err instanceof JourneyPrefixArgsError)
|
|
@@ -405,6 +452,35 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
405
452
|
if (browser?.headed === true && (wantsMultiRun(o) || o.actor.length > 1)) {
|
|
406
453
|
program.configureOutput().writeErr?.(multiWindowWarning(o.actor.length > 1 ? "several --actor sessions" : "--repeat/--persona"));
|
|
407
454
|
}
|
|
455
|
+
/**
|
|
456
|
+
* #427: the pre-flight auth check of one session — undefined when it is alive (or refreshed, or
|
|
457
|
+
* not checked: --auth-check off, no --url, a --from-journey run whose prefix replay is its own
|
|
458
|
+
* check), or the `auth-expired` result when it is not. Throws `UnauthorizedExploreTargetError`.
|
|
459
|
+
*/
|
|
460
|
+
const sessionPreflight = async (storageState, persona) => {
|
|
461
|
+
if (authCheck.mode === "off" || o.url === undefined || journeyPrefix !== undefined)
|
|
462
|
+
return undefined;
|
|
463
|
+
const allowlist = resolveExploreAllowlist(o.url, o.allow);
|
|
464
|
+
// A start URL bound from --fixtures (`${setup.x}`) does not exist before the setup runs: the
|
|
465
|
+
// check opens the app's root instead (the mission itself starts after the setup, as before).
|
|
466
|
+
const checkUrl = o.url.includes("${") ? fixtureBoundUrlRoot(o.url) : o.url;
|
|
467
|
+
if (checkUrl === undefined)
|
|
468
|
+
return undefined; // no origin before the placeholder: the mission's own URL check refuses it
|
|
469
|
+
const r = await ensurePersonaSession({
|
|
470
|
+
...(persona === undefined ? {} : { persona: persona.name }),
|
|
471
|
+
...(persona?.login === undefined ? {} : { login: persona.login }),
|
|
472
|
+
storageState,
|
|
473
|
+
url: checkUrl,
|
|
474
|
+
allowlist,
|
|
475
|
+
check: authCheck,
|
|
476
|
+
port: (deps.explore?.browserPortFactory ?? (() => new PlaywrightBrowserPort()))(),
|
|
477
|
+
...(browser === undefined ? {} : { browser }),
|
|
478
|
+
env: deps.explore?.env ?? process.env,
|
|
479
|
+
timeoutMs: AUTH_PREFLIGHT_TIMEOUT_MS,
|
|
480
|
+
note: (line) => program.configureOutput().writeErr?.(line),
|
|
481
|
+
});
|
|
482
|
+
return r.ok ? undefined : authExpiredResult(strategy, o.url, r, persona?.name);
|
|
483
|
+
};
|
|
408
484
|
// Repeat-and-vote (#141) / persona matrix (#143): the same command, run sequentially and aggregated.
|
|
409
485
|
if (wantsMultiRun(o)) {
|
|
410
486
|
try {
|
|
@@ -417,12 +493,26 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
417
493
|
...(o.out === undefined ? {} : { out: o.out }),
|
|
418
494
|
// #220: a killed multi-run prints ITS partial summary, by this command's own output rule.
|
|
419
495
|
killOutput: (partial) => (o.json === true ? `${JSON.stringify(ok(withEngine(partial)))}\n` : formatMultiRunHuman(partial)),
|
|
496
|
+
// #427: each run's session (its persona's, or the mission's own) is checked before it starts.
|
|
497
|
+
...(authCheck.mode === "off"
|
|
498
|
+
? {}
|
|
499
|
+
: {
|
|
500
|
+
authPreflight: async (p) => {
|
|
501
|
+
const state = p?.storageState ?? o.storageState;
|
|
502
|
+
if (state === undefined)
|
|
503
|
+
return undefined;
|
|
504
|
+
const r = await sessionPreflight(state, p ?? projectPersonaFor(state));
|
|
505
|
+
return r === undefined ? undefined : withEngine(r);
|
|
506
|
+
},
|
|
507
|
+
}),
|
|
420
508
|
});
|
|
421
509
|
emitExplore(ok(withEngine(result)), result.exitCode, formatMultiRunHuman);
|
|
422
510
|
}
|
|
423
511
|
catch (err) {
|
|
424
512
|
if (err instanceof MultiRunArgsError)
|
|
425
513
|
emitExplore(fail(err.code, err.message));
|
|
514
|
+
else if (err instanceof UnauthorizedExploreTargetError)
|
|
515
|
+
emitExplore(fail("E_UNAUTHORIZED_EXPLORE_TARGET", err.message));
|
|
426
516
|
else if (err instanceof MultiRunAbortedError)
|
|
427
517
|
emitExplore(fail(err.envelope.error.code, err.envelope.error.message));
|
|
428
518
|
else
|
|
@@ -449,6 +539,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
449
539
|
try {
|
|
450
540
|
validateDenyPatterns(o.deny);
|
|
451
541
|
validateDenyPatterns(o.paid, "--paid");
|
|
542
|
+
validateAllowControlPatterns(o.allowControl ?? []);
|
|
452
543
|
}
|
|
453
544
|
catch (err) {
|
|
454
545
|
emitExplore(fail("E_EXPLORE_ARGS", err instanceof Error ? err.message : String(err)));
|
|
@@ -516,6 +607,11 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
516
607
|
// `--fixture` feeds the upload op, which only the explore loop (goal and
|
|
517
608
|
// usability strategies) can issue. Refuse it elsewhere rather than
|
|
518
609
|
// silently ignoring a file the user expected to be uploaded.
|
|
610
|
+
// #424: the minimum effort gates the goal loop's own endings (report / blocked / done) — a goal run's.
|
|
611
|
+
if ((o.minActions !== undefined || o.minDistinctStates !== undefined) && (o.feature !== undefined || strategy !== "goal")) {
|
|
612
|
+
emitExplore(fail("E_EXPLORE_ARGS", "--min-actions and --min-distinct-states are supported only with --strategy goal (a goal or find-out run)"));
|
|
613
|
+
return;
|
|
614
|
+
}
|
|
519
615
|
if (o.fixture !== undefined && (o.feature !== undefined || (strategy !== "goal" && strategy !== "usability"))) {
|
|
520
616
|
emitExplore(fail("E_EXPLORE_ARGS", "--fixture is supported only with --strategy goal or usability"));
|
|
521
617
|
return;
|
|
@@ -538,7 +634,19 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
538
634
|
emitExplore(fail("E_EXPLORE_ARGS", "--action-deltas is not supported with --feature (goal, usability, coverage, exploratory and adversarial runs record deltas)"));
|
|
539
635
|
return;
|
|
540
636
|
}
|
|
541
|
-
|
|
637
|
+
// #427: the project persona (.jevitate/personas.json) this --storage-state is, when it is one — its
|
|
638
|
+
// session may not exist yet: the pre-flight mints it from its login parameters.
|
|
639
|
+
let projectPersona;
|
|
640
|
+
try {
|
|
641
|
+
projectPersona = o.storageState === undefined ? undefined : projectPersonaFor(o.storageState);
|
|
642
|
+
}
|
|
643
|
+
catch (err) {
|
|
644
|
+
if (!(err instanceof MultiRunArgsError))
|
|
645
|
+
throw err;
|
|
646
|
+
emitExplore(fail(err.code, err.message));
|
|
647
|
+
return;
|
|
648
|
+
}
|
|
649
|
+
if (o.storageState !== undefined && !existsSync(o.storageState) && (authCheck.mode === "off" || projectPersona?.login === undefined)) {
|
|
542
650
|
emitExplore(fail("E_EXPLORE_ARGS", `storage state not found: ${o.storageState}`));
|
|
543
651
|
return;
|
|
544
652
|
}
|
|
@@ -617,6 +725,8 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
617
725
|
const logScope = parseLogScopeSpecs(o.logScope);
|
|
618
726
|
const correlationHeaders = parseCorrelationHeaders(o.logCorrelationHeader);
|
|
619
727
|
const idPatterns = parseLogIdPatterns(o.logIdPattern);
|
|
728
|
+
// #422: the project's .jevitate/log-classes.json, validated before any browser opens.
|
|
729
|
+
const logClasses = loadLogClassRules();
|
|
620
730
|
serverLog = {
|
|
621
731
|
sources,
|
|
622
732
|
logDefect,
|
|
@@ -626,11 +736,12 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
626
736
|
logScope,
|
|
627
737
|
correlationHeaders,
|
|
628
738
|
idPatterns,
|
|
739
|
+
logClasses,
|
|
629
740
|
...(o.serverLogDrainMs === undefined ? {} : { drainMs: Number(o.serverLogDrainMs) }),
|
|
630
741
|
};
|
|
631
742
|
}
|
|
632
743
|
catch (err) {
|
|
633
|
-
if (err instanceof LogSourceSpecError || err instanceof LogSpecError) {
|
|
744
|
+
if (err instanceof LogSourceSpecError || err instanceof LogSpecError || err instanceof LogClassesError) {
|
|
634
745
|
emitExplore(fail(err.code, err.message));
|
|
635
746
|
return;
|
|
636
747
|
}
|
|
@@ -687,6 +798,26 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
687
798
|
emitExplore(fail("E_EXPLORE_ARGS", "--fixtures, --before and --after are supported only with --strategy goal, or with --from-journey (any anchored strategy)"));
|
|
688
799
|
return;
|
|
689
800
|
}
|
|
801
|
+
// #427 pre-flight auth check: a run that starts from a session first proves the session is alive
|
|
802
|
+
// (re-minting it once from a persona's login parameters) — else it ends now, `auth-expired`.
|
|
803
|
+
if (primaryStorageState !== undefined) {
|
|
804
|
+
let expired;
|
|
805
|
+
try {
|
|
806
|
+
expired = await sessionPreflight(primaryStorageState, actors?.primary ?? projectPersona);
|
|
807
|
+
}
|
|
808
|
+
catch (err) {
|
|
809
|
+
if (err instanceof UnauthorizedExploreTargetError)
|
|
810
|
+
emitExplore(fail("E_UNAUTHORIZED_EXPLORE_TARGET", err.message));
|
|
811
|
+
// The check could not open its browser (the mission could not have either): the run did not start.
|
|
812
|
+
else
|
|
813
|
+
emitExplore(fail("E_EXPLORE_RUN", `the pre-flight auth check failed: ${err instanceof Error ? err.message : String(err)}`));
|
|
814
|
+
return;
|
|
815
|
+
}
|
|
816
|
+
if (expired !== undefined) {
|
|
817
|
+
emitExplore(ok(withEngine(expired)), EXIT_CODES.inconclusive);
|
|
818
|
+
return;
|
|
819
|
+
}
|
|
820
|
+
}
|
|
690
821
|
// Additive coverage/exploratory strategy: proof-by-induction state coverage.
|
|
691
822
|
// It takes no goal/success (the frontier itself is the objective), so it is
|
|
692
823
|
// a distinct, goal-free path that leaves the goal strategy below unchanged.
|
|
@@ -720,6 +851,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
720
851
|
({ judge: covJudge, gen: covGen, usage: covUsage } = await buildExploreGateways(deps, {
|
|
721
852
|
real: o.real ?? false,
|
|
722
853
|
fakeAi: o.fakeAi ?? false,
|
|
854
|
+
jevProvider: o.jevProvider,
|
|
723
855
|
}));
|
|
724
856
|
}
|
|
725
857
|
catch (err) {
|
|
@@ -791,6 +923,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
791
923
|
({ judge: advJudge, gen: advGen, usage: advUsage } = await buildExploreGateways(deps, {
|
|
792
924
|
real: o.real ?? false,
|
|
793
925
|
fakeAi: o.fakeAi ?? false,
|
|
926
|
+
jevProvider: o.jevProvider,
|
|
794
927
|
}));
|
|
795
928
|
}
|
|
796
929
|
catch (err) {
|
|
@@ -911,6 +1044,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
911
1044
|
({ judge: uxJudge, gen: uxGen, usage: uxUsage } = await buildExploreGateways(deps, {
|
|
912
1045
|
real: o.real ?? false,
|
|
913
1046
|
fakeAi: o.fakeAi ?? false,
|
|
1047
|
+
jevProvider: o.jevProvider,
|
|
914
1048
|
}));
|
|
915
1049
|
}
|
|
916
1050
|
catch (err) {
|
|
@@ -1087,7 +1221,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
1087
1221
|
...(target?.fixtures === undefined ? {} : { targetFixtures: target.fixtures }),
|
|
1088
1222
|
...(target?.personas === undefined ? {} : { personas: target.personas }),
|
|
1089
1223
|
});
|
|
1090
|
-
checkSetupRefs({ "--url": o.url, "--goal": o.goal, "--success": o.success, ...invariantSetupTexts(invariants) }, fx);
|
|
1224
|
+
checkSetupRefs({ "--url": o.url, "--goal": o.goal, "--success": o.success, ...invariantSetupTexts(invariants), ...(journeyPrefix === undefined ? {} : { "--param": Object.values(o.param) }) }, fx);
|
|
1091
1225
|
}
|
|
1092
1226
|
catch (err) {
|
|
1093
1227
|
if (!(err instanceof FixtureSpecError || err instanceof UnboundSetupRefError))
|
|
@@ -1104,7 +1238,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
1104
1238
|
let gen;
|
|
1105
1239
|
let usage;
|
|
1106
1240
|
try {
|
|
1107
|
-
({ judge, gen, usage } = await buildExploreGateways(deps, { real: o.real ?? false, fakeAi: o.fakeAi ?? false }));
|
|
1241
|
+
({ judge, gen, usage } = await buildExploreGateways(deps, { real: o.real ?? false, fakeAi: o.fakeAi ?? false, jevProvider: o.jevProvider }));
|
|
1108
1242
|
}
|
|
1109
1243
|
catch (err) {
|
|
1110
1244
|
if (err instanceof MissingCredentialError || err instanceof GatewaySelectionError) {
|
|
@@ -1130,6 +1264,13 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
1130
1264
|
// #187: ${setup.x} in the invariants (probe paths, deniedAs.open, capture routes), origin-fixed.
|
|
1131
1265
|
if (invariants !== undefined)
|
|
1132
1266
|
runInvariants = { ...withInvariants, invariants: substituteSpecSetupRefs(invariants, b, url) };
|
|
1267
|
+
// #399: `--param name=${setup.x}` for the Journey prefix is bound to the fixture's output, and the
|
|
1268
|
+
// prefix re-resolved so its secret params (and so every redaction) hold the bound value.
|
|
1269
|
+
if (journeyPrefix !== undefined && prefixRequest !== undefined && Object.values(o.param).some((v) => v.includes("${setup."))) {
|
|
1270
|
+
const params = Object.fromEntries(Object.entries(o.param).map(([k, v]) => [k, substituteSetupRefs(v, b, { where: `--param ${k}` })]));
|
|
1271
|
+
journeyPrefix = await resolveJourneyPrefix({ ...prefixRequest, params });
|
|
1272
|
+
o.secret = [...new Set([...o.secret, ...journeyPrefix.secrets])];
|
|
1273
|
+
}
|
|
1133
1274
|
}
|
|
1134
1275
|
catch (err) {
|
|
1135
1276
|
if (!(err instanceof FixtureSetupError || err instanceof UnboundSetupRefError)) {
|
|
@@ -1155,6 +1296,14 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
1155
1296
|
gen,
|
|
1156
1297
|
usage,
|
|
1157
1298
|
bounds: Object.keys(bounds).length > 0 ? bounds : undefined,
|
|
1299
|
+
...(o.minActions === undefined && o.minDistinctStates === undefined
|
|
1300
|
+
? {}
|
|
1301
|
+
: {
|
|
1302
|
+
minEffort: {
|
|
1303
|
+
...(o.minActions === undefined ? {} : { minActions: Number(o.minActions) }),
|
|
1304
|
+
...(o.minDistinctStates === undefined ? {} : { minDistinctStates: Number(o.minDistinctStates) }),
|
|
1305
|
+
},
|
|
1306
|
+
}),
|
|
1158
1307
|
secrets: o.secret.length > 0 ? o.secret : undefined,
|
|
1159
1308
|
...(secretFields.length > 0 ? { secretFields } : {}),
|
|
1160
1309
|
...(secretCommand === undefined ? {} : { secretCommand }),
|
|
@@ -1176,7 +1325,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
1176
1325
|
...runInvariants,
|
|
1177
1326
|
...triagedServerLog(serverLog, judge, o.real === true),
|
|
1178
1327
|
...(fx === undefined ? {} : { fixtures: fx }),
|
|
1179
|
-
...
|
|
1328
|
+
...(journeyPrefix === undefined ? {} : { journeyPrefix }), // #399: re-resolved when a --param was bound
|
|
1180
1329
|
});
|
|
1181
1330
|
// 0 succeeded · 1 assertion not met · 2 the run broke (inconclusive/crashed).
|
|
1182
1331
|
emitExplore(ok(await withEvidence(result)), result.exitCode);
|
|
@@ -1198,6 +1347,6 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
1198
1347
|
// Every exit path restores the fixture state (a no-op when the mission already did).
|
|
1199
1348
|
await fx?.restore();
|
|
1200
1349
|
}
|
|
1201
|
-
});
|
|
1350
|
+
}));
|
|
1202
1351
|
}
|
|
1203
1352
|
//# sourceMappingURL=explore-cli.js.map
|