@jevitate/cli 0.2.0 → 0.3.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 +31 -11
- package/dist/ai-cli.js +100 -67
- package/dist/ai-cli.js.map +1 -1
- package/dist/author-journey-cli.js +3 -1
- package/dist/author-journey-cli.js.map +1 -1
- package/dist/bin.js +48218 -39969
- package/dist/browser-run-options.d.ts +32 -1
- package/dist/browser-run-options.js +69 -0
- package/dist/browser-run-options.js.map +1 -1
- package/dist/build-info.generated.js +2 -2
- package/dist/campaign-api.d.ts +151 -0
- package/dist/campaign-api.js +446 -0
- package/dist/campaign-api.js.map +1 -0
- package/dist/campaign-cli.d.ts +6 -0
- package/dist/campaign-cli.js +66 -0
- package/dist/campaign-cli.js.map +1 -0
- package/dist/check-api.js +3 -2
- package/dist/check-api.js.map +1 -1
- package/dist/check-budget.js +2 -1
- package/dist/check-budget.js.map +1 -1
- package/dist/check-execute.d.ts +4 -0
- package/dist/check-execute.js +41 -6
- package/dist/check-execute.js.map +1 -1
- package/dist/check-plan.d.ts +5 -0
- package/dist/check-plan.js +72 -4
- package/dist/check-plan.js.map +1 -1
- package/dist/check-suite.d.ts +14 -1
- package/dist/check-suite.js +26 -1
- package/dist/check-suite.js.map +1 -1
- package/dist/cli-output.d.ts +4 -0
- package/dist/cli-output.js +52 -5
- package/dist/cli-output.js.map +1 -1
- package/dist/cli-shared.d.ts +13 -3
- package/dist/cli-shared.js +52 -7
- package/dist/cli-shared.js.map +1 -1
- package/dist/defect-evidence.js +6 -3
- package/dist/defect-evidence.js.map +1 -1
- package/dist/demo-aspect-api.js +2 -1
- package/dist/demo-aspect-api.js.map +1 -1
- package/dist/demo-aspect-cli.js +3 -1
- package/dist/demo-aspect-cli.js.map +1 -1
- package/dist/demo-capture.d.ts +37 -3
- package/dist/demo-capture.js +119 -20
- package/dist/demo-capture.js.map +1 -1
- package/dist/explore-adversarial.d.ts +11 -4
- package/dist/explore-adversarial.js +21 -12
- package/dist/explore-adversarial.js.map +1 -1
- package/dist/explore-cli.js +262 -26
- package/dist/explore-cli.js.map +1 -1
- package/dist/explore-coverage.d.ts +17 -2
- package/dist/explore-coverage.js +19 -13
- package/dist/explore-coverage.js.map +1 -1
- package/dist/explore-feature.d.ts +0 -2
- package/dist/explore-feature.js +6 -8
- package/dist/explore-feature.js.map +1 -1
- package/dist/explore-goal.d.ts +25 -7
- package/dist/explore-goal.js +61 -18
- package/dist/explore-goal.js.map +1 -1
- package/dist/explore-shared.d.ts +27 -2
- package/dist/explore-shared.js +21 -1
- package/dist/explore-shared.js.map +1 -1
- package/dist/fixture-auth.d.ts +13 -2
- package/dist/fixture-auth.js +19 -6
- package/dist/fixture-auth.js.map +1 -1
- package/dist/fixture-cli.d.ts +29 -0
- package/dist/fixture-cli.js +121 -7
- package/dist/fixture-cli.js.map +1 -1
- package/dist/github-issue-filer.js +2 -1
- package/dist/github-issue-filer.js.map +1 -1
- package/dist/host-health-run.d.ts +2 -1
- package/dist/host-health-run.js +8 -2
- package/dist/host-health-run.js.map +1 -1
- package/dist/init-cli.js +34 -5
- package/dist/init-cli.js.map +1 -1
- package/dist/init-keys.d.ts +11 -0
- package/dist/init-keys.js +5 -2
- package/dist/init-keys.js.map +1 -1
- package/dist/journey-annotate-api.js +17 -4
- package/dist/journey-annotate-api.js.map +1 -1
- package/dist/journey-annotate-cli.js +3 -1
- package/dist/journey-annotate-cli.js.map +1 -1
- package/dist/journey-api.d.ts +26 -1
- package/dist/journey-api.js +51 -25
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-cli.d.ts +1 -1
- package/dist/journey-cli.js +44 -3
- package/dist/journey-cli.js.map +1 -1
- package/dist/journey-demo-api.d.ts +2 -0
- package/dist/journey-demo-api.js +23 -10
- package/dist/journey-demo-api.js.map +1 -1
- package/dist/journey-demo-cli.js +5 -2
- package/dist/journey-demo-cli.js.map +1 -1
- package/dist/journey-prefix.d.ts +194 -0
- package/dist/journey-prefix.js +279 -0
- package/dist/journey-prefix.js.map +1 -0
- package/dist/key-report.d.ts +49 -0
- package/dist/key-report.js +101 -0
- package/dist/key-report.js.map +1 -0
- package/dist/kill-signal.js +0 -1
- package/dist/kill-signal.js.map +1 -1
- package/dist/ledger-api.js +3 -1
- package/dist/ledger-api.js.map +1 -1
- package/dist/log-correlation.d.ts +54 -1
- package/dist/log-correlation.js +83 -14
- package/dist/log-correlation.js.map +1 -1
- package/dist/log-sources.js +6 -5
- package/dist/log-sources.js.map +1 -1
- package/dist/log-trace.d.ts +80 -0
- package/dist/log-trace.js +210 -0
- package/dist/log-trace.js.map +1 -0
- package/dist/logs-retention.js +2 -1
- package/dist/logs-retention.js.map +1 -1
- package/dist/masked-input.d.ts +22 -0
- package/dist/masked-input.js +99 -0
- package/dist/masked-input.js.map +1 -0
- package/dist/mcp-api.d.ts +3 -1
- package/dist/mcp-api.js +49 -7
- package/dist/mcp-api.js.map +1 -1
- package/dist/mcp-args.d.ts +12 -0
- package/dist/mcp-args.js +33 -0
- package/dist/mcp-args.js.map +1 -1
- package/dist/mcp-cli-tools.d.ts +5 -1
- package/dist/mcp-cli-tools.js +73 -16
- package/dist/mcp-cli-tools.js.map +1 -1
- package/dist/mission-api.js +2 -1
- package/dist/mission-api.js.map +1 -1
- package/dist/mission-cli.js +2 -1
- package/dist/mission-cli.js.map +1 -1
- package/dist/mission-fixtures.d.ts +10 -1
- package/dist/mission-fixtures.js +49 -15
- package/dist/mission-fixtures.js.map +1 -1
- package/dist/mission-queue-runner.js +11 -2
- package/dist/mission-queue-runner.js.map +1 -1
- package/dist/multi-run-cli.js +7 -1
- package/dist/multi-run-cli.js.map +1 -1
- package/dist/openrouter-call.js +3 -2
- package/dist/openrouter-call.js.map +1 -1
- package/dist/program.js +4 -0
- package/dist/program.js.map +1 -1
- package/dist/project-dir.js +3 -2
- package/dist/project-dir.js.map +1 -1
- package/dist/record-api.d.ts +3 -1
- package/dist/record-api.js +5 -2
- package/dist/record-api.js.map +1 -1
- package/dist/record-cli.js +14 -2
- package/dist/record-cli.js.map +1 -1
- package/dist/regression-api.d.ts +6 -0
- package/dist/regression-api.js +4 -2
- package/dist/regression-api.js.map +1 -1
- package/dist/regression-cli.js +56 -4
- package/dist/regression-cli.js.map +1 -1
- package/dist/report-api.js +2 -1
- package/dist/report-api.js.map +1 -1
- package/dist/resource-preflight.d.ts +87 -0
- package/dist/resource-preflight.js +160 -0
- package/dist/resource-preflight.js.map +1 -0
- package/dist/result-schema.d.ts +1 -1
- package/dist/result-schema.js +1 -1
- package/dist/run-key-preflight.d.ts +42 -0
- package/dist/run-key-preflight.js +82 -0
- package/dist/run-key-preflight.js.map +1 -0
- package/dist/run-screenshots.js +11 -5
- package/dist/run-screenshots.js.map +1 -1
- package/dist/runtime-env.js +3 -2
- package/dist/runtime-env.js.map +1 -1
- package/dist/server-log-verify.d.ts +2 -0
- package/dist/server-log-verify.js +8 -3
- package/dist/server-log-verify.js.map +1 -1
- package/dist/site-gate-cli.js +2 -1
- package/dist/site-gate-cli.js.map +1 -1
- package/dist/source-api.js +2 -1
- package/dist/source-api.js.map +1 -1
- package/dist/suite-explore-options.d.ts +32 -0
- package/dist/suite-explore-options.js +22 -0
- package/dist/suite-explore-options.js.map +1 -1
- package/dist/target-config.d.ts +6 -0
- package/dist/target-config.js +9 -0
- package/dist/target-config.js.map +1 -1
- package/dist/type-fixture-file.d.ts +9 -0
- package/dist/type-fixture-file.js +48 -0
- package/dist/type-fixture-file.js.map +1 -0
- package/dist/ui-api.js +4 -3
- package/dist/ui-api.js.map +1 -1
- package/dist/usability-capture.js +4 -3
- package/dist/usability-capture.js.map +1 -1
- package/dist/usage-config.d.ts +1 -1
- package/dist/usage-config.js +1 -1
- package/dist/ux-claim-probe.d.ts +45 -0
- package/dist/ux-claim-probe.js +386 -0
- package/dist/ux-claim-probe.js.map +1 -0
- package/dist/ux-cli.js +8 -1
- package/dist/ux-cli.js.map +1 -1
- package/dist/ux-product.d.ts +14 -0
- package/dist/ux-product.js +39 -0
- package/dist/ux-product.js.map +1 -0
- package/dist/ux-review.d.ts +4 -0
- package/dist/ux-review.js +27 -7
- package/dist/ux-review.js.map +1 -1
- package/dist/ux-usability.d.ts +34 -9
- package/dist/ux-usability.js +100 -14
- package/dist/ux-usability.js.map +1 -1
- package/dist/verify-fix-api.d.ts +21 -0
- package/dist/verify-fix-api.js +85 -33
- package/dist/verify-fix-api.js.map +1 -1
- package/dist/verify-fix-cli.js +7 -2
- package/dist/verify-fix-cli.js.map +1 -1
- package/package.json +9 -9
- package/skills/jevitate-explore/SKILL.md +8 -0
- package/skills/jevitate-getting-started/SKILL.md +2 -1
- package/skills/jevitate-test-campaign/SKILL.md +203 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explore-adversarial.js","sourceRoot":"","sources":["../src/explore-adversarial.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"explore-adversarial.js","sourceRoot":"","sources":["../src/explore-adversarial.ts"],"names":[],"mappings":"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"}
|
package/dist/explore-cli.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
2
|
import { envCredentialStore, MissingCredentialError } from "@jevitate/ai-core";
|
|
3
3
|
import { loadLocalCredentials } from "./credentials-file.js";
|
|
4
|
-
import { FixtureNotFoundError, ScopeUnderivableError, UnauthorizedExploreTargetError, resolveCoverageThresholds, parseSecretField, SecretFieldSpecError, validateDenyPatterns, } from "@jevitate/explore";
|
|
4
|
+
import { FixtureNotFoundError, ScopeUnderivableError, UnauthorizedExploreTargetError, resolveCoverageThresholds, parseSecretField, SecretFieldSpecError, TypeFixtureSpecError, validateDenyPatterns, } from "@jevitate/explore";
|
|
5
|
+
import { loadTypeFixtures } from "./type-fixture-file.js";
|
|
5
6
|
import { ok, fail } from "./envelope.js";
|
|
6
7
|
import { SessionFileInProjectError, assertSessionFileOutsideProject } from "./project-dir.js";
|
|
7
8
|
import { InvariantsFileError, loadInvariantFiles, resolveInvariantAuthTokens } from "./invariants-file.js";
|
|
@@ -10,8 +11,8 @@ import { fileDraftsWithEvidence } from "./defect-evidence.js";
|
|
|
10
11
|
import { parseScreenshotsArg } from "./run-screenshots.js";
|
|
11
12
|
import { GitHubIssueFiler } from "./github-issue-filer.js";
|
|
12
13
|
import { TargetConfigError, loadTargetsFile, resolveTargetConfig } from "./target-config.js";
|
|
13
|
-
import { buildMissionFixtures, checkSetupRefs, checkUrlRefOrigin, invariantSetupTexts, substituteSpecSetupRefs, fixtureSetupFailedResult, withFixtureFlags, } from "./fixture-cli.js";
|
|
14
|
-
import { FixtureSetupError, FixtureSpecError,
|
|
14
|
+
import { buildMissionFixtures, checkSetupRefs, checkUrlRefOrigin, substituteUrlSetupRefs, setupRefFreeUrl, invariantSetupTexts, substituteSpecSetupRefs, fixtureSetupFailedResult, withFixtureFlags, } from "./fixture-cli.js";
|
|
15
|
+
import { FixtureSetupError, FixtureSpecError, UnboundSetupRefError, substituteSetupRefs, } from "./mission-fixtures.js";
|
|
15
16
|
import { LITERAL_SECRET_WARNING, SecretArgError, resolveSecretArgs } from "./secret-args.js";
|
|
16
17
|
import { withEngine } from "./engine.js";
|
|
17
18
|
import { setKillSwitchOutput } from "./kill-signal.js";
|
|
@@ -20,31 +21,62 @@ import { intArg, positiveNumberArg, nonNegativeIntArg, positiveIntArg, ratioArg
|
|
|
20
21
|
import { formatMissionHuman, formatMultiRunHuman } from "./cli-output.js";
|
|
21
22
|
import { runExploration, runCoverageMission, runAdversarialCliMission, CLI_ADVERSARIAL_STRATEGIES, runFeatureCliMission, parseSuccessSpec, resolveExploreAllowlist, } from "./explore-api.js";
|
|
22
23
|
import { parseLogSourceSpecs, LogSourceSpecError } from "./log-sources.js";
|
|
23
|
-
import { parseLogDefectSpecs, parseLogIgnoreSpecs } from "./log-correlation.js";
|
|
24
|
+
import { parseLogDefectSpecs, parseLogIgnoreSpecs, parseLogScopeSpecs } from "./log-correlation.js";
|
|
25
|
+
import { parseCorrelationHeaders, parseLogIdPatterns } from "./log-trace.js";
|
|
24
26
|
import { LogSpecError } from "./log-lines.js";
|
|
25
27
|
import { MultiRunArgsError, resolveMultiRunPlan, wantsMultiRun } from "./multi-run.js";
|
|
26
28
|
import { MultiRunAbortedError, runExploreMultiRun } from "./multi-run-cli.js";
|
|
27
29
|
import { checkActorsAgainstSpec, resolveMissionActors } from "./mission-actors.js";
|
|
28
30
|
import { runUsabilityMission, UsabilityInvariantsUnsupportedError } from "./ux-api.js";
|
|
29
31
|
import { UxConfigError } from "./ux-config.js";
|
|
30
|
-
import { MinConfidenceError, QualityPolicyError, MaxFindingsPerRouteError } from "@jevitate/ux";
|
|
31
|
-
import { withBrowserLaunchFlags, withDemoFlags, withScreenshotsFlag, browserRunFromFlags, withEmulationFlags, emulationFromFlags, emitCommandResult, stallTimeoutMs, EXPLORE_STRATEGIES, EXPLORE_OUTCOME_HELP, GatewaySelectionError, buildExploreGateways, } from "./cli-shared.js";
|
|
32
|
-
import { multiWindowWarning } from "./browser-run-options.js";
|
|
32
|
+
import { MinConfidenceError, QualityPolicyError, MaxFindingsPerRouteError, ProductFactsError } from "@jevitate/ux";
|
|
33
|
+
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";
|
|
34
|
+
import { allowWithExtensions, assertExtensionTargetLoaded, multiWindowWarning } from "./browser-run-options.js";
|
|
35
|
+
import { ParamValidationError } from "@jevitate/journey";
|
|
36
|
+
import { SiteGateRefusedError } from "@jevitate/runtime";
|
|
37
|
+
import { JourneyRequiresAuthError, UnknownJourneyError } from "./journey-api.js";
|
|
38
|
+
import { environmentFromFlags, isEnvironmentError, withEnvironmentFlags } from "./environments.js";
|
|
39
|
+
import { resolve as resolvePath } from "node:path";
|
|
40
|
+
import { CAMPAIGN_LIMITS, isSweepMode } from "@jevitate/journey";
|
|
41
|
+
import { CampaignSpecError, runCampaign, validateCampaignSpec } from "./campaign-api.js";
|
|
42
|
+
import { formatCampaignHuman } from "./campaign-cli.js";
|
|
43
|
+
import { forwardedArgv } from "./multi-run-cli.js";
|
|
44
|
+
import { ANCHORED_STRATEGIES, JourneyPrefixArgsError, JourneyPrefixStaleError, journeyStaleResult, resolveJourneyPrefix, } from "./journey-prefix.js";
|
|
45
|
+
import { clock } from "@jevitate/domain";
|
|
46
|
+
/**
|
|
47
|
+
* #293: the flags a sweep sets on each of its missions itself (the rest of the command line is
|
|
48
|
+
* forwarded to every mission as given).
|
|
49
|
+
*/
|
|
50
|
+
const SWEEP_OWNED = new Set([
|
|
51
|
+
"fromJourney", "atStep", "strategy", "journeysDir", "param", "env", "baseUrl", "storageState", "maxActions", "maxDecisions",
|
|
52
|
+
"goal", "success", "appClass", "real", "fakeAi", "fixtures", "before", "after", "allowShellHooks", "hookTimeoutMs",
|
|
53
|
+
]);
|
|
33
54
|
/**
|
|
34
55
|
* Registers `jevitate explore` (every strategy: goal, coverage, exploratory, adversarial, usability, feature, multi-run).
|
|
35
56
|
* `buildProgram` builds a fresh program for each run of a multi-run (#141/#143).
|
|
36
57
|
*/
|
|
37
58
|
export function registerExploreCommands(program, deps, buildProgram) {
|
|
38
|
-
withScreenshotsFlag(withEmulationFlags(withFixtureFlags(withDemoFlags(withBrowserLaunchFlags(program
|
|
59
|
+
withEnvironmentFlags(withScreenshotsFlag(withEmulationFlags(withFixtureFlags(withDemoFlags(withBrowserLaunchFlags(program
|
|
39
60
|
.command("explore")
|
|
40
|
-
.description("goal-directed exploration -> a deterministic Recording (authoring/test plane)")), { recordVideo: true, overlay: true }))))
|
|
61
|
+
.description("goal-directed exploration -> a deterministic Recording (authoring/test plane)")), { recordVideo: true, overlay: true })))))
|
|
41
62
|
.option("--url <url>", "target URL (must be an authorized origin)")
|
|
63
|
+
.option("--from-journey <id>", "journey-anchored exploration (#293): start from a PROMOTED Journey instead of --url — its first --at-step steps are replayed " +
|
|
64
|
+
"in the mission's own browser context (page, form contents and session kept; fail-closed, never self-healed; --env/--base-url apply), " +
|
|
65
|
+
"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). " +
|
|
66
|
+
"Strategies: goal, coverage, exploratory, adversarial, usability")
|
|
67
|
+
.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>`); " +
|
|
68
|
+
"`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")
|
|
69
|
+
.option("--param <kv>", "with --from-journey: a Journey param as key=value (repeatable); only the prefix's own params are required", collectParam, {})
|
|
70
|
+
.option("--journeys-dir <path>", "with --from-journey: the journeys directory (default: the repo's .jevitate/journeys; outside a repo ~/.jevitate/journeys)")
|
|
42
71
|
.option("--strategy <name>", "exploration strategy: goal (default) | coverage | exploratory | adversarial | usability (UX review: ranked, cited findings)", "goal")
|
|
43
72
|
.option("--goal <text>", "natural-language goal / job (required for --strategy goal and usability)")
|
|
44
73
|
.option("--app-class <class>", "app class for UX calibration (required for --strategy usability), e.g. consumer|admin|internal")
|
|
45
74
|
.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")
|
|
46
75
|
.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")
|
|
47
76
|
.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")
|
|
77
|
+
.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)")
|
|
78
|
+
.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)")
|
|
79
|
+
.option("--polish", "(--strategy usability) polish each verified UX finding's recommendation with one generation call (opt-in; the default prose is built from templates)")
|
|
48
80
|
.option("--success <spec>", [
|
|
49
81
|
"independent success check (repeatable; every one must hold; --strategy goal and usability). Kinds:",
|
|
50
82
|
"urlIncludes:<text> | visible:<d> | textIncludes:<d>|<text> (case-insensitive) | count:<d>|min=<n>,max=<n>",
|
|
@@ -64,6 +96,9 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
64
96
|
.option("--success-when <when>", "when the --success page checks must hold: final (default; on the final page) | held (on the final page, or all together at any settled step — a one-time secret, a toast). reloadThen is always final")
|
|
65
97
|
.option("--allow-vacuous-checks", "downgrade a vacuous --success check to a warning. By default a check satisfied before the run's first action — a page check that held on the seed page and never changed " +
|
|
66
98
|
"(an empty result container), a requestMade/responseStatus matched only by a page-load or polling request — FAILS: it cannot verify the goal")
|
|
99
|
+
.option("--action-deltas", "opt-in (#303; every --strategy, not --feature): record what each action changed on the page — an accessibility snapshot before and after, announcements, " +
|
|
100
|
+
"the action's requests — redacted, with a code verdict per step (no-change | relevant-change | inconclusive) used by the goal loop's no-progress check and a persistence re-check after writes (goal), and as defect evidence (adversarial, coverage); " +
|
|
101
|
+
"adds `delta` to every transcript step (and Recording step, goal) and `actionDeltas` to the result. Costs about 50-100 ms per action on a small page, 0.3-0.5 s on a large one")
|
|
67
102
|
.option("--feature <name>", "run the capability-scoped feature-testing mission (instead of --goal/--success)")
|
|
68
103
|
.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], [])
|
|
69
104
|
.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")
|
|
@@ -71,6 +106,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
71
106
|
.option("--secret <value|env:VAR>", "REDACTION ONLY: a secret/PII value kept out of every model call and artifact (repeatable); env:VAR reads it from the environment (preferred: a literal is visible in the process list and shell history). It is never typed into a field — to log in, bind it with --secret-field (or start from --storage-state)", (v, prev) => [...prev, v], [])
|
|
72
107
|
.option("--secret-field <binding>", "goal/usability strategy: '<label|testId|type|id|name>=<value>=env:<VAR>' (repeatable), e.g. 'label=Password=env:APP_PASSWORD'. When the run types into a matching field, code types $VAR itself; the model sees only «secret:VAR» and the Recording {redacted:true}", (v, prev) => [...prev, v], [])
|
|
73
108
|
.option("--totp <binding>", "goal/usability strategy: '<descriptor>=env:<VAR>' with $VAR a base32 TOTP seed (repeatable), e.g. 'label=Authentication code=env:APP_TOTP_SEED'. The 6-digit code is computed locally (RFC 6238) when the field is typed; the seed never reaches a model or disk", (v, prev) => [...prev, v], [])
|
|
109
|
+
.option("--type-fixture <binding>", "goal strategy: '<label|testId|type|id|name>=<value>=<file>' (repeatable), e.g. 'label=Paste your text=./fixtures/import.txt'. When the run types into a matching field, code types the file's exact text verbatim (line breaks kept, never paraphrased or capped); the model sees only «fixture:<file name>». Recorded as typed unless it holds a --secret", (v, prev) => [...prev, v], [])
|
|
74
110
|
.option("--fixture <path>", "local file the upload op attaches to a file input (goal and usability strategies); must exist")
|
|
75
111
|
.option("--storage-state <file>", "Playwright storageState JSON to start the session authenticated (deterministic login pre-step); must exist")
|
|
76
112
|
.option("--actor <name=storageState>", "multi-actor mission (#147, goal only; repeatable): the FIRST actor is the primary (the only one the model drives, " +
|
|
@@ -91,7 +127,9 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
91
127
|
.option("--reply-ceiling-ms <ms>", "conversational pages: hard ceiling on one reply wait, however busy the page stays (default 180000; never below --reply-wait-ms)", positiveIntArg)
|
|
92
128
|
.option("--reply-max-chars <n>", "conversational pages: cap on each generated chat message (goal and usability; default 300)", intArg({ min: 20, max: 2000 }))
|
|
93
129
|
.option("--job-wait-ms <ms>", "goal and usability: while the page shows an in-progress status (\"Simulating…\", aria-busy, a job \"is running\"), " +
|
|
94
|
-
"waits keep waiting with backoff — and a model 'blocked' is deferred — up to this budget (default: --reply-ceiling-ms, 180000)"
|
|
130
|
+
"waits keep waiting with backoff — and a model 'blocked' is deferred — up to this budget (default: --reply-ceiling-ms, 180000); " +
|
|
131
|
+
"it also bounds a busy indicator the app visibly keeps working behind (live progress, a job poll) before it is a hang, " +
|
|
132
|
+
"and a wait the page documents (\"usually takes a minute\") can raise it", positiveIntArg)
|
|
95
133
|
.option("--deny <pattern>", "a control no mission may click (repeatable): an accessible-name regex (/Archive/i or Archive) or a descriptor role=button;name=Archive. " +
|
|
96
134
|
"Session-ending (Sign out), destructive (Delete, Revoke, Rotate) and paid (Buy, Run simulation, Generate, Send invite) controls are refused by default", (v, prev) => [...prev, v], [])
|
|
97
135
|
.option("--paid <pattern>", "an app control that costs money or credits (repeatable; same syntax as --deny), e.g. /^(Analyze|Draft|Improve)\\b/i: treated like the built-in paid " +
|
|
@@ -124,15 +162,18 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
124
162
|
.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], [])
|
|
125
163
|
.option("--log-quiet-ok <spec>", "declares a --log-source spec (exact match, repeatable) as legitimately quiet: zero lines from it does not make the --log-defect oracle unhealthy (#169). Without it, a declared source that opened but delivered not one line makes an otherwise-clean run inconclusive, same as one that failed to open", (v, prev) => [...prev, v], [])
|
|
126
164
|
.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], [])
|
|
165
|
+
.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], [])
|
|
166
|
+
.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], [])
|
|
167
|
+
.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], [])
|
|
127
168
|
.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)
|
|
128
169
|
.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")
|
|
129
170
|
.option("--min-agreement <k>", "with --repeat: runs a finding (and the outcome) must recur in to count (default: a majority of N)")
|
|
130
171
|
.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], [])
|
|
131
172
|
.option("--personas <file>", "personas JSON: {\"<name>\": \"<storageState>\"} or {\"personas\": [{\"name\", \"storageState\"}]}")
|
|
132
|
-
.option("--check-overflow", "check the horizontal-overflow
|
|
173
|
+
.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 " +
|
|
133
174
|
"(a defect), adversarial (a defect) or usability (a signal finding). " +
|
|
134
175
|
"On by default whenever --viewport/--device emulates a viewport narrower than 1024px")
|
|
135
|
-
.option("--ignore-overflow <selector>", "a CSS selector (repeatable) whose overflow is intentional — excluded from the horizontal-overflow
|
|
176
|
+
.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], [])
|
|
136
177
|
.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)")
|
|
137
178
|
.option("--json", "emit the JSON envelope (default: a human summary)")
|
|
138
179
|
.addHelpText("after", [
|
|
@@ -178,12 +219,149 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
178
219
|
}
|
|
179
220
|
}
|
|
180
221
|
const strategy = o.strategy ?? "goal";
|
|
222
|
+
// #293 journey-anchored exploration: the Journey, step, params and environment are resolved (and
|
|
223
|
+
// refused, exit 64) before anything else — the start URL every later check uses is where the
|
|
224
|
+
// Journey's prefix lands.
|
|
225
|
+
let journeyPrefix;
|
|
226
|
+
const anchoredFlags = [o.fromJourney, o.atStep, o.journeysDir, o.env, o.baseUrl].some((v) => v !== undefined);
|
|
227
|
+
if (anchoredFlags || Object.keys(o.param).length > 0) {
|
|
228
|
+
const refuse = (message) => emitExplore(fail("E_EXPLORE_ARGS", message));
|
|
229
|
+
if (o.fromJourney === undefined || o.atStep === undefined) {
|
|
230
|
+
refuse("--from-journey and --at-step go together (and --param, --env, --base-url and --journeys-dir need them)");
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (o.url !== undefined) {
|
|
234
|
+
refuse("--url cannot be combined with --from-journey: the mission starts where the Journey's prefix leaves the page");
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
if (o.feature !== undefined || !ANCHORED_STRATEGIES.includes(strategy)) {
|
|
238
|
+
refuse(`--from-journey supports --strategy ${ANCHORED_STRATEGIES.join(", ")} (not --feature)`);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (wantsMultiRun(o) || o.actor.length > 0) {
|
|
242
|
+
refuse("--from-journey runs one anchored mission: --repeat, --persona, --personas and --actor are not supported with it (a campaign runs several)");
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
// #293 sweep: `--at-step all|anchors` runs the strategy from EVERY step (or anchor), each in a
|
|
246
|
+
// fresh session with --fixtures restored around it, --max-actions/--max-decisions split evenly
|
|
247
|
+
// over the stop points, and reads them as one deduped report (a one-job campaign).
|
|
248
|
+
if (isSweepMode(o.atStep)) {
|
|
249
|
+
if (o.real !== true && o.fakeAi !== true) {
|
|
250
|
+
emitExplore(fail("E_AI_SETUP_REQUIRED", "a sweep's missions are model-driven: pass --real or --fake-ai"));
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const journeysDir = resolveJourneysDir(deps, o.journeysDir);
|
|
254
|
+
const abs = (p) => resolvePath(p);
|
|
255
|
+
const spec = {
|
|
256
|
+
version: 1,
|
|
257
|
+
name: `sweep of ${o.fromJourney} (${o.atStep}, ${strategy})`,
|
|
258
|
+
...(o.env === undefined ? {} : { env: o.env }),
|
|
259
|
+
...(o.baseUrl === undefined ? {} : { baseUrl: o.baseUrl }),
|
|
260
|
+
...(o.storageState === undefined ? {} : { storageState: abs(o.storageState) }),
|
|
261
|
+
...(o.fixtures === undefined ? {} : { fixtures: abs(o.fixtures) }),
|
|
262
|
+
...(o.before === undefined ? {} : { before: o.before }),
|
|
263
|
+
...(o.after === undefined ? {} : { after: o.after }),
|
|
264
|
+
discovery: false,
|
|
265
|
+
maxRuns: CAMPAIGN_LIMITS.maxRuns,
|
|
266
|
+
jobs: [
|
|
267
|
+
{
|
|
268
|
+
id: "sweep",
|
|
269
|
+
journey: o.fromJourney,
|
|
270
|
+
params: o.param,
|
|
271
|
+
anchors: o.atStep.trim(),
|
|
272
|
+
strategies: [strategy],
|
|
273
|
+
...(o.goal === undefined ? {} : { goal: o.goal }),
|
|
274
|
+
...(o.appClass === undefined ? {} : { appClass: o.appClass }),
|
|
275
|
+
...(o.success.length === 0 ? {} : { success: o.success }),
|
|
276
|
+
...(o.maxActions === undefined ? {} : { maxActions: Number(o.maxActions) }),
|
|
277
|
+
...(o.maxDecisions === undefined ? {} : { maxDecisions: Number(o.maxDecisions) }),
|
|
278
|
+
},
|
|
279
|
+
],
|
|
280
|
+
};
|
|
281
|
+
try {
|
|
282
|
+
const plan = await validateCampaignSpec(spec, resolvePath("explore-sweep.json"), {
|
|
283
|
+
journeysDir,
|
|
284
|
+
allowShellHooks: o.allowShellHooks === true,
|
|
285
|
+
environmentSeams: environmentSeams(deps),
|
|
286
|
+
});
|
|
287
|
+
const result = await runCampaign(plan, {
|
|
288
|
+
newProgram: () => buildProgram(deps),
|
|
289
|
+
journeysDir,
|
|
290
|
+
missionTargetsDir: resolveMissionTargetsDir(deps),
|
|
291
|
+
...(o.out === undefined ? {} : { outDir: o.out }),
|
|
292
|
+
...(o.real === true ? { real: true } : {}),
|
|
293
|
+
...(o.fakeAi === true ? { fakeAi: true } : {}),
|
|
294
|
+
missionArgs: forwardedArgv(this, SWEEP_OWNED),
|
|
295
|
+
});
|
|
296
|
+
emitExplore(ok(withEngine({ sweep: { journeyId: o.fromJourney, mode: o.atStep.trim(), strategy, stops: plan.totalRuns, budgetPerStop: { maxActions: plan.jobs[0]?.maxActions, ...(plan.jobs[0]?.maxDecisions === undefined ? {} : { maxDecisions: plan.jobs[0].maxDecisions }) } }, ...result })), result.exitCode, formatCampaignHuman);
|
|
297
|
+
}
|
|
298
|
+
catch (err) {
|
|
299
|
+
if (err instanceof CampaignSpecError)
|
|
300
|
+
emitExplore(fail("E_EXPLORE_ARGS", err.message));
|
|
301
|
+
else
|
|
302
|
+
emitExplore(fail("E_EXPLORE_RUN", String(err instanceof Error ? err.message : err)));
|
|
303
|
+
}
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
try {
|
|
307
|
+
const environment = environmentFromFlags({ ...(o.env === undefined ? {} : { env: o.env }), ...(o.baseUrl === undefined ? {} : { baseUrl: o.baseUrl }) }, environmentSeams(deps));
|
|
308
|
+
// The environment's own session applies when --storage-state names none (as `journey run`).
|
|
309
|
+
if (o.storageState === undefined && environment?.storageState !== undefined)
|
|
310
|
+
o.storageState = environment.storageState;
|
|
311
|
+
journeyPrefix = await resolveJourneyPrefix({
|
|
312
|
+
dir: resolveJourneysDir(deps, o.journeysDir),
|
|
313
|
+
id: o.fromJourney,
|
|
314
|
+
atStep: o.atStep,
|
|
315
|
+
params: o.param,
|
|
316
|
+
...(environment === undefined ? {} : { environment }),
|
|
317
|
+
...(o.storageState === undefined ? {} : { storageState: o.storageState }),
|
|
318
|
+
dbPath: resolveDbPath(deps),
|
|
319
|
+
environmentFlags: { ...(o.env === undefined ? {} : { env: o.env }), ...(o.baseUrl === undefined ? {} : { baseUrl: o.baseUrl }) },
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
catch (err) {
|
|
323
|
+
if (isEnvironmentError(err) || err instanceof JourneyPrefixArgsError)
|
|
324
|
+
emitExplore(fail(err.code, err.message));
|
|
325
|
+
else if (err instanceof UnknownJourneyError)
|
|
326
|
+
emitExplore(fail("E_UNKNOWN_JOURNEY", err.message));
|
|
327
|
+
else if (err instanceof ParamValidationError)
|
|
328
|
+
emitExplore(fail("E_INVALID_PARAMS", err.message));
|
|
329
|
+
else if (err instanceof JourneyRequiresAuthError)
|
|
330
|
+
emitExplore(fail("E_JOURNEY_REQUIRES_AUTH", err.message));
|
|
331
|
+
else
|
|
332
|
+
emitExplore(fail("E_EXPLORE_ARGS", err instanceof Error ? err.message : String(err)));
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
// The prefix types its secret params into the page the mission perceives: they are redacted like
|
|
336
|
+
// --secret. Coverage/exploratory carry no redaction set, so a prefix with secrets refuses them.
|
|
337
|
+
if (journeyPrefix.secrets.length > 0 && (strategy === "coverage" || strategy === "exploratory")) {
|
|
338
|
+
refuse(`journey '${o.fromJourney}' types a secret param before step ${journeyPrefix.branch.step}: --strategy ${strategy} cannot redact it — use goal, adversarial or usability`);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
o.url = journeyPrefix.startUrl;
|
|
342
|
+
// Default allowlist: the origins the Journey's steps may be on (the environment's), not just the landing's.
|
|
343
|
+
if (o.allow.length === 0)
|
|
344
|
+
o.allow = [...journeyPrefix.allowedOrigins];
|
|
345
|
+
}
|
|
346
|
+
const withPrefix = journeyPrefix === undefined ? {} : { journeyPrefix };
|
|
347
|
+
/** #293: a prefix that no longer replays, or a site policy that refused it — typed, handled once for every strategy. */
|
|
348
|
+
const emitJourneyFailure = (err) => {
|
|
349
|
+
if (err instanceof JourneyPrefixStaleError) {
|
|
350
|
+
emitExplore(ok(withEngine(journeyStaleResult(err, strategy))), EXIT_CODES.inconclusive);
|
|
351
|
+
return true;
|
|
352
|
+
}
|
|
353
|
+
if (err instanceof SiteGateRefusedError) {
|
|
354
|
+
emitExplore(fail(err.code, err.message));
|
|
355
|
+
return true;
|
|
356
|
+
}
|
|
357
|
+
return false;
|
|
358
|
+
};
|
|
181
359
|
// #195: `--secret env:VAR` is resolved from the environment before anything runs (fail closed).
|
|
182
360
|
try {
|
|
183
361
|
const resolved = resolveSecretArgs(o.secret, process.env, "--secret");
|
|
184
362
|
if (resolved.literals > 0)
|
|
185
363
|
program.configureOutput().writeErr?.(LITERAL_SECRET_WARNING);
|
|
186
|
-
o.secret = resolved.secrets;
|
|
364
|
+
o.secret = [...resolved.secrets, ...(journeyPrefix?.secrets ?? [])];
|
|
187
365
|
}
|
|
188
366
|
catch (err) {
|
|
189
367
|
if (!(err instanceof SecretArgError))
|
|
@@ -196,6 +374,9 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
196
374
|
let browser;
|
|
197
375
|
try {
|
|
198
376
|
browser = browserRunFromFlags(o, deps.explore?.env ?? process.env);
|
|
377
|
+
// #256: a chrome-extension:// --url must be a loaded extension's; loaded extensions' origins are allowed.
|
|
378
|
+
assertExtensionTargetLoaded(o.url, browser);
|
|
379
|
+
o.allow = allowWithExtensions(o.url, o.allow, browser);
|
|
199
380
|
}
|
|
200
381
|
catch (err) {
|
|
201
382
|
emitExplore(fail("E_EXPLORE_ARGS", err instanceof Error ? err.message : String(err)));
|
|
@@ -261,12 +442,9 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
261
442
|
emitExplore(fail("E_EXPLORE_ARGS", "--job-wait-ms must be a positive integer"));
|
|
262
443
|
return;
|
|
263
444
|
}
|
|
264
|
-
// #154: refused BEFORE any browser opens
|
|
445
|
+
// #154: refused BEFORE any browser opens — `nonNegativeIntArg` already rejects a bad value at
|
|
446
|
+
// parse time (#275: the value is a number here). 0 is valid: "don't replay" — a hang is then
|
|
265
447
|
// reported unconfirmed (inconclusive), never replayed and never a crash.
|
|
266
|
-
if (o.hangReplays !== undefined && !/^\d+$/.test(o.hangReplays.trim())) {
|
|
267
|
-
emitExplore(fail("E_EXPLORE_ARGS", `--hang-replays must be a non-negative integer (0 = don't replay; the hang is reported unconfirmed), got "${o.hangReplays}"`));
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
448
|
try {
|
|
271
449
|
validateDenyPatterns(o.deny);
|
|
272
450
|
validateDenyPatterns(o.paid, "--paid");
|
|
@@ -293,7 +471,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
293
471
|
...(o.fileIssues === undefined ? {} : { fileIssues: o.fileIssues }),
|
|
294
472
|
...(o.issueRepo === undefined ? {} : { issueRepo: o.issueRepo }),
|
|
295
473
|
...(o.jevitateRepo === undefined ? {} : { jevitateRepo: o.jevitateRepo }),
|
|
296
|
-
}, new URL(o.url).origin);
|
|
474
|
+
}, new URL(setupRefFreeUrl(o.url)).origin);
|
|
297
475
|
}
|
|
298
476
|
catch (err) {
|
|
299
477
|
if (err instanceof FilingConfigError) {
|
|
@@ -309,7 +487,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
309
487
|
let target;
|
|
310
488
|
if (o.url !== undefined) {
|
|
311
489
|
try {
|
|
312
|
-
target = resolveTargetConfig(loadTargetsFile(deps.explore?.targetsConfigPath), new URL(o.url).origin, {
|
|
490
|
+
target = resolveTargetConfig(loadTargetsFile(deps.explore?.targetsConfigPath), new URL(setupRefFreeUrl(o.url)).origin, {
|
|
313
491
|
settleIgnore: o.settleIgnore,
|
|
314
492
|
ignoreNoProgress: o.ignoreNoProgress,
|
|
315
493
|
apiPrefixes: o.apiPrefix,
|
|
@@ -343,7 +521,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
343
521
|
return result;
|
|
344
522
|
let out = result;
|
|
345
523
|
if (filing?.enabled === true)
|
|
346
|
-
out = await fileDraftsWithEvidence(out, filing, issueFiler,
|
|
524
|
+
out = await fileDraftsWithEvidence(out, filing, issueFiler, clock.nowIso());
|
|
347
525
|
return out;
|
|
348
526
|
};
|
|
349
527
|
// `--fixture` feeds the upload op, which only the explore loop (goal and
|
|
@@ -353,6 +531,11 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
353
531
|
emitExplore(fail("E_EXPLORE_ARGS", "--fixture is supported only with --strategy goal or usability"));
|
|
354
532
|
return;
|
|
355
533
|
}
|
|
534
|
+
// #198: product facts and polish shape the UX review's findings only.
|
|
535
|
+
if ((o.product !== undefined || o.polish === true || o.probeGuards === true) && (o.feature !== undefined || strategy !== "usability")) {
|
|
536
|
+
emitExplore(fail("E_EXPLORE_ARGS", "--product, --polish and --probe-guards are supported only with --strategy usability"));
|
|
537
|
+
return;
|
|
538
|
+
}
|
|
356
539
|
// #225: success checks judge a goal / a usability job — every other strategy (and --feature) would
|
|
357
540
|
// silently ignore them, so they are refused up front, never dropped.
|
|
358
541
|
if ((o.success.length > 0 || o.successWhen !== undefined || o.allowVacuousChecks === true) &&
|
|
@@ -360,6 +543,12 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
360
543
|
emitExplore(fail("E_EXPLORE_ARGS", `--success, --success-when and --allow-vacuous-checks are supported only with --strategy goal or usability (not ${o.feature !== undefined ? "--feature" : `--strategy ${strategy}`})`));
|
|
361
544
|
return;
|
|
362
545
|
}
|
|
546
|
+
// #303: action deltas are recorded by the goal loop (goal and usability runs) only — refused
|
|
547
|
+
// elsewhere, never silently ignored.
|
|
548
|
+
if (o.actionDeltas === true && o.feature !== undefined) {
|
|
549
|
+
emitExplore(fail("E_EXPLORE_ARGS", "--action-deltas is not supported with --feature (goal, usability, coverage, exploratory and adversarial runs record deltas)"));
|
|
550
|
+
return;
|
|
551
|
+
}
|
|
363
552
|
if (o.storageState !== undefined && !existsSync(o.storageState)) {
|
|
364
553
|
emitExplore(fail("E_EXPLORE_ARGS", `storage state not found: ${o.storageState}`));
|
|
365
554
|
return;
|
|
@@ -436,12 +625,18 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
436
625
|
const sources = parseLogSourceSpecs(o.logSource, o.allowLogCmd ?? false);
|
|
437
626
|
const logDefect = parseLogDefectSpecs(o.logDefect);
|
|
438
627
|
const logIgnore = parseLogIgnoreSpecs(o.logIgnore);
|
|
628
|
+
const logScope = parseLogScopeSpecs(o.logScope);
|
|
629
|
+
const correlationHeaders = parseCorrelationHeaders(o.logCorrelationHeader);
|
|
630
|
+
const idPatterns = parseLogIdPatterns(o.logIdPattern);
|
|
439
631
|
serverLog = {
|
|
440
632
|
sources,
|
|
441
633
|
logDefect,
|
|
442
634
|
allowLogCmd: o.allowLogCmd ?? false,
|
|
443
635
|
quietOk: o.logQuietOk,
|
|
444
636
|
logIgnore,
|
|
637
|
+
logScope,
|
|
638
|
+
correlationHeaders,
|
|
639
|
+
idPatterns,
|
|
445
640
|
...(o.serverLogDrainMs === undefined ? {} : { drainMs: Number(o.serverLogDrainMs) }),
|
|
446
641
|
};
|
|
447
642
|
}
|
|
@@ -474,6 +669,23 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
474
669
|
return;
|
|
475
670
|
}
|
|
476
671
|
}
|
|
672
|
+
// #281: fields typed with a file's exact text — read (and checked) before any browser opens.
|
|
673
|
+
let typeFixtures = [];
|
|
674
|
+
if (o.typeFixture.length > 0) {
|
|
675
|
+
if (o.feature !== undefined || strategy !== "goal") {
|
|
676
|
+
emitExplore(fail("E_EXPLORE_ARGS", "--type-fixture is supported only with --strategy goal"));
|
|
677
|
+
return;
|
|
678
|
+
}
|
|
679
|
+
try {
|
|
680
|
+
typeFixtures = loadTypeFixtures(o.typeFixture);
|
|
681
|
+
}
|
|
682
|
+
catch (err) {
|
|
683
|
+
if (!(err instanceof TypeFixtureSpecError))
|
|
684
|
+
throw err;
|
|
685
|
+
emitExplore(fail(err.code, err.message));
|
|
686
|
+
return;
|
|
687
|
+
}
|
|
688
|
+
}
|
|
477
689
|
// Mission fixtures (#140/#144) run around the goal loop and its replays only.
|
|
478
690
|
const fixtureFlagsGiven = o.fixtures !== undefined || o.before !== undefined || o.after !== undefined;
|
|
479
691
|
if (fixtureFlagsGiven && (o.feature !== undefined || strategy !== "goal")) {
|
|
@@ -527,6 +739,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
527
739
|
try {
|
|
528
740
|
const result = await runCoverageMission({
|
|
529
741
|
...(target === undefined ? {} : { target }),
|
|
742
|
+
...(o.actionDeltas === true ? { actionDeltas: true } : {}),
|
|
530
743
|
url: o.url,
|
|
531
744
|
allowlist: covAllowlist,
|
|
532
745
|
judge: covJudge,
|
|
@@ -546,11 +759,14 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
546
759
|
...(o.saveStorageState !== undefined ? { saveStorageState: o.saveStorageState } : {}),
|
|
547
760
|
...withInvariants,
|
|
548
761
|
...withServerLog,
|
|
762
|
+
...withPrefix,
|
|
549
763
|
});
|
|
550
764
|
// Typed verdict → exit code (0 clean · 1 defects · 2 crashed; see exit-codes.ts).
|
|
551
765
|
emitExplore(ok(await withEvidence(result)), result.exitCode);
|
|
552
766
|
}
|
|
553
767
|
catch (err) {
|
|
768
|
+
if (emitJourneyFailure(err))
|
|
769
|
+
return;
|
|
554
770
|
if (err instanceof UnauthorizedExploreTargetError) {
|
|
555
771
|
emitExplore(fail("E_UNAUTHORIZED_EXPLORE_TARGET", err.message));
|
|
556
772
|
}
|
|
@@ -610,6 +826,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
610
826
|
try {
|
|
611
827
|
const result = await runAdversarialCliMission({
|
|
612
828
|
...(target === undefined ? {} : { target }),
|
|
829
|
+
...(o.actionDeltas === true ? { actionDeltas: true } : {}),
|
|
613
830
|
seedUrl: o.url,
|
|
614
831
|
allowlist: advAllowlist,
|
|
615
832
|
usage: advUsage,
|
|
@@ -619,7 +836,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
619
836
|
secrets: o.secret.length > 0 ? o.secret : undefined,
|
|
620
837
|
...(runFiling === undefined ? {} : { filing: runFiling }),
|
|
621
838
|
issueFiler,
|
|
622
|
-
...(o.hangReplays === undefined ? {} : { hangReplays:
|
|
839
|
+
...(o.hangReplays === undefined ? {} : { hangReplays: o.hangReplays }),
|
|
623
840
|
strategies: CLI_ADVERSARIAL_STRATEGIES,
|
|
624
841
|
judgment: advJudge,
|
|
625
842
|
generation: advGen,
|
|
@@ -633,12 +850,15 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
633
850
|
...(o.saveStorageState !== undefined ? { saveStorageState: o.saveStorageState } : {}),
|
|
634
851
|
...withInvariants,
|
|
635
852
|
...withServerLog,
|
|
853
|
+
...withPrefix,
|
|
636
854
|
});
|
|
637
855
|
// The typed verdict gates CI: 0 clean · 1 defects found (a failing check) · 2 the run
|
|
638
856
|
// itself broke (inconclusive/crashed) — see exit-codes.ts.
|
|
639
857
|
emitExplore(ok(await withEvidence(result)), result.exitCode);
|
|
640
858
|
}
|
|
641
859
|
catch (err) {
|
|
860
|
+
if (emitJourneyFailure(err))
|
|
861
|
+
return;
|
|
642
862
|
if (err instanceof UnauthorizedExploreTargetError) {
|
|
643
863
|
emitExplore(fail("E_UNAUTHORIZED_EXPLORE_TARGET", err.message));
|
|
644
864
|
}
|
|
@@ -720,6 +940,9 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
720
940
|
...(o.minConfidence !== undefined ? { minConfidence: o.minConfidence } : {}),
|
|
721
941
|
...(o.show !== undefined ? { show: o.show } : {}),
|
|
722
942
|
...(o.maxFindingsPerPage !== undefined ? { maxFindingsPerRoute: o.maxFindingsPerPage } : {}),
|
|
943
|
+
...(o.product !== undefined ? { product: o.product } : {}),
|
|
944
|
+
...(o.polish === true ? { polish: true } : {}),
|
|
945
|
+
...(o.probeGuards === true ? { probeGuards: true } : {}),
|
|
723
946
|
bounds: Object.keys(uxBounds).length > 0 ? uxBounds : undefined,
|
|
724
947
|
conversation,
|
|
725
948
|
secrets: o.secret.length > 0 ? o.secret : undefined,
|
|
@@ -738,12 +961,16 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
738
961
|
...(uxSuccessChecks.length === 0 ? {} : { successChecks: uxSuccessChecks }),
|
|
739
962
|
...(o.successWhen === "held" || o.successWhen === "final" ? { successWhen: o.successWhen } : {}),
|
|
740
963
|
...(o.allowVacuousChecks === true ? { allowVacuousChecks: true } : {}),
|
|
964
|
+
...withPrefix,
|
|
965
|
+
...(o.actionDeltas === true ? { actionDeltas: true } : {}),
|
|
741
966
|
});
|
|
742
967
|
// UX findings are advisory (0); a failed --success check (#225) is 1, as on a goal run; a
|
|
743
968
|
// broken run or an unavailable analysis is 2.
|
|
744
969
|
emitExplore(ok(await withEvidence(result)), result.exitCode);
|
|
745
970
|
}
|
|
746
971
|
catch (err) {
|
|
972
|
+
if (emitJourneyFailure(err))
|
|
973
|
+
return;
|
|
747
974
|
if (err instanceof UnauthorizedExploreTargetError) {
|
|
748
975
|
emitExplore(fail("E_UNAUTHORIZED_EXPLORE_TARGET", err.message));
|
|
749
976
|
}
|
|
@@ -760,6 +987,9 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
760
987
|
else if (err instanceof UsabilityInvariantsUnsupportedError) {
|
|
761
988
|
emitExplore(fail("E_EXPLORE_ARGS", err.message));
|
|
762
989
|
}
|
|
990
|
+
else if (err instanceof ProductFactsError) {
|
|
991
|
+
emitExplore(fail(err.code, err.message));
|
|
992
|
+
}
|
|
763
993
|
else {
|
|
764
994
|
emitExplore(fail("E_EXPLORE_RUN", String(err instanceof Error ? err.message : err)));
|
|
765
995
|
}
|
|
@@ -840,7 +1070,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
840
1070
|
return;
|
|
841
1071
|
}
|
|
842
1072
|
const successWhen = o.successWhen === "held" || o.successWhen === "final" ? o.successWhen : undefined;
|
|
843
|
-
const allowlist = resolveExploreAllowlist(o.url, o.allow);
|
|
1073
|
+
const allowlist = resolveExploreAllowlist(setupRefFreeUrl(o.url), o.allow);
|
|
844
1074
|
// Fixtures (#140/#144): the spec and every ${setup.x} reference are validated here, before any
|
|
845
1075
|
// browser or request; the setup itself runs just before the mission (below).
|
|
846
1076
|
let fx;
|
|
@@ -848,11 +1078,12 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
848
1078
|
checkUrlRefOrigin(o.url);
|
|
849
1079
|
fx = buildMissionFixtures(o, {
|
|
850
1080
|
allowlist,
|
|
851
|
-
baseUrl: o.url
|
|
1081
|
+
baseUrl: setupRefFreeUrl(o.url),
|
|
852
1082
|
...(primaryStorageState === undefined ? {} : { storageState: primaryStorageState }),
|
|
853
1083
|
secretFields,
|
|
854
1084
|
secrets: o.secret,
|
|
855
1085
|
...(target?.fixtures === undefined ? {} : { targetFixtures: target.fixtures }),
|
|
1086
|
+
...(target?.personas === undefined ? {} : { personas: target.personas }),
|
|
856
1087
|
});
|
|
857
1088
|
checkSetupRefs({ "--url": o.url, "--goal": o.goal, "--success": o.success, ...invariantSetupTexts(invariants) }, fx);
|
|
858
1089
|
}
|
|
@@ -891,7 +1122,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
891
1122
|
try {
|
|
892
1123
|
await fx.setup();
|
|
893
1124
|
const b = fx.bindings();
|
|
894
|
-
url =
|
|
1125
|
+
url = substituteUrlSetupRefs(o.url, b);
|
|
895
1126
|
goal = substituteSetupRefs(o.goal, b, { where: "--goal" });
|
|
896
1127
|
successChecks = o.success.map((spec) => parseSuccessSpec(substituteSetupRefs(spec, b, { where: "--success" })));
|
|
897
1128
|
// #187: ${setup.x} in the invariants (probe paths, deniedAs.open, capture routes), origin-fixed.
|
|
@@ -916,6 +1147,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
916
1147
|
successChecks,
|
|
917
1148
|
...(successWhen === undefined ? {} : { successWhen }),
|
|
918
1149
|
...(o.allowVacuousChecks === true ? { allowVacuousChecks: true } : {}),
|
|
1150
|
+
...(o.actionDeltas === true ? { actionDeltas: true } : {}),
|
|
919
1151
|
allowlist,
|
|
920
1152
|
judge,
|
|
921
1153
|
gen,
|
|
@@ -923,6 +1155,7 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
923
1155
|
bounds: Object.keys(bounds).length > 0 ? bounds : undefined,
|
|
924
1156
|
secrets: o.secret.length > 0 ? o.secret : undefined,
|
|
925
1157
|
...(secretFields.length > 0 ? { secretFields } : {}),
|
|
1158
|
+
...(typeFixtures.length > 0 ? { typeFixtures } : {}),
|
|
926
1159
|
fixture: o.fixture,
|
|
927
1160
|
outDir: o.out,
|
|
928
1161
|
browserPortFactory: deps.explore?.browserPortFactory,
|
|
@@ -934,16 +1167,19 @@ export function registerExploreCommands(program, deps, buildProgram) {
|
|
|
934
1167
|
...(actors === null ? {} : { actors }),
|
|
935
1168
|
...(runFiling === undefined ? {} : { filing: runFiling }),
|
|
936
1169
|
issueFiler,
|
|
937
|
-
...(o.hangReplays === undefined ? {} : { hangReplays:
|
|
1170
|
+
...(o.hangReplays === undefined ? {} : { hangReplays: o.hangReplays }),
|
|
938
1171
|
conversation,
|
|
939
1172
|
...runInvariants,
|
|
940
1173
|
...withServerLog,
|
|
941
1174
|
...(fx === undefined ? {} : { fixtures: fx }),
|
|
1175
|
+
...withPrefix,
|
|
942
1176
|
});
|
|
943
1177
|
// 0 succeeded · 1 assertion not met · 2 the run broke (inconclusive/crashed).
|
|
944
1178
|
emitExplore(ok(await withEvidence(result)), result.exitCode);
|
|
945
1179
|
}
|
|
946
1180
|
catch (err) {
|
|
1181
|
+
if (emitJourneyFailure(err))
|
|
1182
|
+
return;
|
|
947
1183
|
if (err instanceof UnauthorizedExploreTargetError) {
|
|
948
1184
|
emitExplore(fail("E_UNAUTHORIZED_EXPLORE_TARGET", err.message));
|
|
949
1185
|
}
|