@jevitate/cli 0.1.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/README.md +23 -0
- package/dist/ai-cli.d.ts +31 -11
- package/dist/ai-cli.js +131 -88
- package/dist/ai-cli.js.map +1 -1
- package/dist/author-journey-cli.d.ts +4 -0
- package/dist/author-journey-cli.js +111 -0
- package/dist/author-journey-cli.js.map +1 -0
- package/dist/bin.js +60349 -16477
- package/dist/bin.js.map +1 -1
- package/dist/browser-run-options.d.ts +89 -0
- package/dist/browser-run-options.js +175 -0
- package/dist/browser-run-options.js.map +1 -0
- package/dist/build-info.generated.d.ts +2 -0
- package/dist/build-info.generated.js +10 -0
- package/dist/build-info.generated.js.map +1 -0
- 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.d.ts +5 -0
- package/dist/check-api.js +234 -0
- package/dist/check-api.js.map +1 -0
- package/dist/check-budget.d.ts +26 -0
- package/dist/check-budget.js +90 -0
- package/dist/check-budget.js.map +1 -0
- package/dist/check-cli.d.ts +31 -0
- package/dist/check-cli.js +109 -0
- package/dist/check-cli.js.map +1 -0
- package/dist/check-execute.d.ts +29 -0
- package/dist/check-execute.js +420 -0
- package/dist/check-execute.js.map +1 -0
- package/dist/check-plan.d.ts +118 -0
- package/dist/check-plan.js +516 -0
- package/dist/check-plan.js.map +1 -0
- package/dist/check-suite.d.ts +184 -0
- package/dist/check-suite.js +540 -0
- package/dist/check-suite.js.map +1 -0
- package/dist/check-types.d.ts +181 -0
- package/dist/check-types.js +35 -0
- package/dist/check-types.js.map +1 -0
- package/dist/cli-args.d.ts +26 -0
- package/dist/cli-args.js +50 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/cli-output.d.ts +106 -0
- package/dist/cli-output.js +563 -0
- package/dist/cli-output.js.map +1 -0
- package/dist/cli-reference.d.ts +3 -0
- package/dist/cli-reference.js +81 -0
- package/dist/cli-reference.js.map +1 -0
- package/dist/cli-refusal.d.ts +12 -0
- package/dist/cli-refusal.js +52 -0
- package/dist/cli-refusal.js.map +1 -0
- package/dist/cli-shared.d.ts +340 -0
- package/dist/cli-shared.js +537 -0
- package/dist/cli-shared.js.map +1 -0
- package/dist/cli-surface.d.ts +33 -0
- package/dist/cli-surface.js +48 -0
- package/dist/cli-surface.js.map +1 -0
- package/dist/conversation-options.d.ts +15 -0
- package/dist/conversation-options.js +10 -0
- package/dist/conversation-options.js.map +1 -0
- package/dist/credentials-file.d.ts +15 -0
- package/dist/credentials-file.js +56 -0
- package/dist/credentials-file.js.map +1 -0
- package/dist/data-dir.d.ts +1 -1
- package/dist/data-dir.js +1 -1
- package/dist/defect-evidence.d.ts +141 -0
- package/dist/defect-evidence.js +505 -0
- package/dist/defect-evidence.js.map +1 -0
- package/dist/demo-aspect-api.d.ts +209 -0
- package/dist/demo-aspect-api.js +398 -0
- package/dist/demo-aspect-api.js.map +1 -0
- package/dist/demo-aspect-cli.d.ts +3 -0
- package/dist/demo-aspect-cli.js +243 -0
- package/dist/demo-aspect-cli.js.map +1 -0
- package/dist/demo-capture.d.ts +142 -0
- package/dist/demo-capture.js +537 -0
- package/dist/demo-capture.js.map +1 -0
- package/dist/engine.d.ts +35 -0
- package/dist/engine.js +25 -0
- package/dist/engine.js.map +1 -0
- package/dist/environments.d.ts +155 -0
- package/dist/environments.js +364 -0
- package/dist/environments.js.map +1 -0
- package/dist/exit-codes.d.ts +46 -0
- package/dist/exit-codes.js +91 -0
- package/dist/exit-codes.js.map +1 -0
- package/dist/explore-adversarial.d.ts +144 -0
- package/dist/explore-adversarial.js +227 -0
- package/dist/explore-adversarial.js.map +1 -0
- package/dist/explore-api.d.ts +7 -187
- package/dist/explore-api.js +7 -301
- package/dist/explore-api.js.map +1 -1
- package/dist/explore-author.d.ts +79 -0
- package/dist/explore-author.js +86 -0
- package/dist/explore-author.js.map +1 -0
- package/dist/explore-cli.d.ts +7 -0
- package/dist/explore-cli.js +1199 -0
- package/dist/explore-cli.js.map +1 -0
- package/dist/explore-coverage.d.ts +173 -0
- package/dist/explore-coverage.js +246 -0
- package/dist/explore-coverage.js.map +1 -0
- package/dist/explore-feature.d.ts +125 -0
- package/dist/explore-feature.js +218 -0
- package/dist/explore-feature.js.map +1 -0
- package/dist/explore-goal.d.ts +271 -0
- package/dist/explore-goal.js +417 -0
- package/dist/explore-goal.js.map +1 -0
- package/dist/explore-shared.d.ts +177 -0
- package/dist/explore-shared.js +149 -0
- package/dist/explore-shared.js.map +1 -0
- package/dist/explore-specs.d.ts +53 -0
- package/dist/explore-specs.js +333 -0
- package/dist/explore-specs.js.map +1 -0
- package/dist/findings-filing.d.ts +64 -0
- package/dist/findings-filing.js +108 -0
- package/dist/findings-filing.js.map +1 -0
- package/dist/fixture-auth.d.ts +63 -0
- package/dist/fixture-auth.js +95 -0
- package/dist/fixture-auth.js.map +1 -0
- package/dist/fixture-cli.d.ts +99 -0
- package/dist/fixture-cli.js +292 -0
- package/dist/fixture-cli.js.map +1 -0
- package/dist/github-issue-filer.d.ts +62 -0
- package/dist/github-issue-filer.js +189 -0
- package/dist/github-issue-filer.js.map +1 -0
- package/dist/host-health-run.d.ts +25 -0
- package/dist/host-health-run.js +33 -0
- package/dist/host-health-run.js.map +1 -0
- package/dist/http-5xx-outcome.d.ts +6 -0
- package/dist/http-5xx-outcome.js +39 -0
- package/dist/http-5xx-outcome.js.map +1 -0
- package/dist/inbox-cli.d.ts +7 -0
- package/dist/inbox-cli.js +197 -0
- package/dist/inbox-cli.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/init-cli.d.ts +4 -0
- package/dist/init-cli.js +156 -0
- package/dist/init-cli.js.map +1 -0
- package/dist/init-keys.d.ts +30 -2
- package/dist/init-keys.js +19 -5
- package/dist/init-keys.js.map +1 -1
- package/dist/init-next-steps.d.ts +35 -0
- package/dist/init-next-steps.js +79 -0
- package/dist/init-next-steps.js.map +1 -0
- package/dist/invariants-file.d.ts +34 -0
- package/dist/invariants-file.js +68 -0
- package/dist/invariants-file.js.map +1 -0
- package/dist/invariants-validate.d.ts +30 -0
- package/dist/invariants-validate.js +105 -0
- package/dist/invariants-validate.js.map +1 -0
- package/dist/journey-annotate-api.d.ts +76 -0
- package/dist/journey-annotate-api.js +269 -0
- package/dist/journey-annotate-api.js.map +1 -0
- package/dist/journey-annotate-cli.d.ts +9 -0
- package/dist/journey-annotate-cli.js +181 -0
- package/dist/journey-annotate-cli.js.map +1 -0
- package/dist/journey-api.d.ts +104 -2
- package/dist/journey-api.js +163 -20
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-cli.d.ts +4 -0
- package/dist/journey-cli.js +411 -0
- package/dist/journey-cli.js.map +1 -0
- package/dist/journey-demo-api.d.ts +114 -0
- package/dist/journey-demo-api.js +405 -0
- package/dist/journey-demo-api.js.map +1 -0
- package/dist/journey-demo-cli.d.ts +10 -0
- package/dist/journey-demo-cli.js +158 -0
- package/dist/journey-demo-cli.js.map +1 -0
- 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.d.ts +193 -0
- package/dist/kill-signal.js +283 -0
- package/dist/kill-signal.js.map +1 -0
- package/dist/launch-armed.d.ts +37 -0
- package/dist/launch-armed.js +31 -0
- package/dist/launch-armed.js.map +1 -0
- package/dist/ledger-api.d.ts +106 -0
- package/dist/ledger-api.js +239 -0
- package/dist/ledger-api.js.map +1 -0
- package/dist/ledger-cli.d.ts +18 -0
- package/dist/ledger-cli.js +107 -0
- package/dist/ledger-cli.js.map +1 -0
- package/dist/load-api.d.ts +29 -11
- package/dist/load-api.js +23 -15
- package/dist/load-api.js.map +1 -1
- package/dist/load-cli.d.ts +4 -0
- package/dist/load-cli.js +97 -0
- package/dist/load-cli.js.map +1 -0
- package/dist/log-correlation.d.ts +200 -0
- package/dist/log-correlation.js +394 -0
- package/dist/log-correlation.js.map +1 -0
- package/dist/log-lines.d.ts +131 -0
- package/dist/log-lines.js +389 -0
- package/dist/log-lines.js.map +1 -0
- package/dist/log-sources.d.ts +71 -0
- package/dist/log-sources.js +236 -0
- package/dist/log-sources.js.map +1 -0
- 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-cli.d.ts +3 -0
- package/dist/logs-cli.js +51 -0
- package/dist/logs-cli.js.map +1 -0
- package/dist/logs-retention.d.ts +28 -0
- package/dist/logs-retention.js +85 -0
- package/dist/logs-retention.js.map +1 -0
- 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 +91 -1
- package/dist/mcp-api.js +514 -18
- package/dist/mcp-api.js.map +1 -1
- package/dist/mcp-args.d.ts +50 -0
- package/dist/mcp-args.js +164 -0
- package/dist/mcp-args.js.map +1 -0
- package/dist/mcp-cli-bridge.d.ts +34 -0
- package/dist/mcp-cli-bridge.js +62 -0
- package/dist/mcp-cli-bridge.js.map +1 -0
- package/dist/mcp-cli-runner.d.ts +29 -0
- package/dist/mcp-cli-runner.js +44 -0
- package/dist/mcp-cli-runner.js.map +1 -0
- package/dist/mcp-cli-tools.d.ts +129 -0
- package/dist/mcp-cli-tools.js +737 -0
- package/dist/mcp-cli-tools.js.map +1 -0
- package/dist/mcp-paths.d.ts +28 -0
- package/dist/mcp-paths.js +76 -0
- package/dist/mcp-paths.js.map +1 -0
- package/dist/mission-actors.d.ts +40 -0
- package/dist/mission-actors.js +72 -0
- package/dist/mission-actors.js.map +1 -0
- package/dist/mission-api.d.ts +35 -0
- package/dist/mission-api.js +60 -3
- package/dist/mission-api.js.map +1 -1
- package/dist/mission-cli.d.ts +4 -0
- package/dist/mission-cli.js +248 -0
- package/dist/mission-cli.js.map +1 -0
- package/dist/mission-exit.d.ts +22 -0
- package/dist/mission-exit.js +26 -0
- package/dist/mission-exit.js.map +1 -0
- package/dist/mission-fixtures.d.ts +234 -0
- package/dist/mission-fixtures.js +862 -0
- package/dist/mission-fixtures.js.map +1 -0
- package/dist/mission-journal.d.ts +60 -0
- package/dist/mission-journal.js +115 -0
- package/dist/mission-journal.js.map +1 -0
- package/dist/mission-queue-cli.d.ts +10 -0
- package/dist/mission-queue-cli.js +198 -0
- package/dist/mission-queue-cli.js.map +1 -0
- package/dist/mission-queue-runner.d.ts +126 -0
- package/dist/mission-queue-runner.js +406 -0
- package/dist/mission-queue-runner.js.map +1 -0
- package/dist/multi-run-cli.d.ts +37 -0
- package/dist/multi-run-cli.js +116 -0
- package/dist/multi-run-cli.js.map +1 -0
- package/dist/multi-run.d.ts +339 -0
- package/dist/multi-run.js +619 -0
- package/dist/multi-run.js.map +1 -0
- package/dist/openrouter-call.d.ts +22 -0
- package/dist/openrouter-call.js +64 -0
- package/dist/openrouter-call.js.map +1 -0
- package/dist/profile-cli.d.ts +4 -0
- package/dist/profile-cli.js +57 -0
- package/dist/profile-cli.js.map +1 -0
- package/dist/program.d.ts +3 -75
- package/dist/program.js +123 -1921
- package/dist/program.js.map +1 -1
- package/dist/project-dir.d.ts +96 -0
- package/dist/project-dir.js +221 -0
- package/dist/project-dir.js.map +1 -0
- package/dist/record-api.d.ts +13 -7
- package/dist/record-api.js +44 -30
- package/dist/record-api.js.map +1 -1
- package/dist/record-cli.d.ts +4 -0
- package/dist/record-cli.js +76 -0
- package/dist/record-cli.js.map +1 -0
- package/dist/recording-cli.d.ts +4 -0
- package/dist/recording-cli.js +248 -0
- package/dist/recording-cli.js.map +1 -0
- package/dist/regression-api.d.ts +107 -0
- package/dist/regression-api.js +387 -6
- package/dist/regression-api.js.map +1 -1
- package/dist/regression-cli.d.ts +4 -0
- package/dist/regression-cli.js +284 -0
- package/dist/regression-cli.js.map +1 -0
- package/dist/report-api.d.ts +146 -0
- package/dist/report-api.js +431 -0
- package/dist/report-api.js.map +1 -0
- package/dist/report-cli.d.ts +12 -0
- package/dist/report-cli.js +147 -0
- package/dist/report-cli.js.map +1 -0
- 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 +22 -0
- package/dist/result-schema.js +28 -0
- package/dist/result-schema.js.map +1 -0
- package/dist/run-index.d.ts +29 -0
- package/dist/run-index.js +70 -0
- package/dist/run-index.js.map +1 -0
- 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.d.ts +123 -0
- package/dist/run-screenshots.js +235 -0
- package/dist/run-screenshots.js.map +1 -0
- package/dist/runtime-env.d.ts +8 -0
- package/dist/runtime-env.js +23 -0
- package/dist/runtime-env.js.map +1 -0
- package/dist/secret-args.d.ts +23 -0
- package/dist/secret-args.js +45 -0
- package/dist/secret-args.js.map +1 -0
- package/dist/serve-cli.d.ts +4 -0
- package/dist/serve-cli.js +95 -0
- package/dist/serve-cli.js.map +1 -0
- package/dist/server-log-verify.d.ts +36 -0
- package/dist/server-log-verify.js +120 -0
- package/dist/server-log-verify.js.map +1 -0
- package/dist/session-check.d.ts +14 -0
- package/dist/session-check.js +44 -0
- package/dist/session-check.js.map +1 -0
- package/dist/site-cli.d.ts +4 -0
- package/dist/site-cli.js +127 -0
- package/dist/site-cli.js.map +1 -0
- package/dist/site-gate-cli.d.ts +28 -0
- package/dist/site-gate-cli.js +59 -0
- package/dist/site-gate-cli.js.map +1 -0
- package/dist/source-api.js +20 -4
- package/dist/source-api.js.map +1 -1
- package/dist/source-cli.d.ts +4 -0
- package/dist/source-cli.js +284 -0
- package/dist/source-cli.js.map +1 -0
- package/dist/source-run-api.d.ts +27 -1
- package/dist/source-run-api.js +22 -11
- package/dist/source-run-api.js.map +1 -1
- package/dist/storage-state-snapshot.d.ts +50 -0
- package/dist/storage-state-snapshot.js +87 -0
- package/dist/storage-state-snapshot.js.map +1 -0
- package/dist/suite-explore-options.d.ts +321 -0
- package/dist/suite-explore-options.js +162 -0
- package/dist/suite-explore-options.js.map +1 -0
- package/dist/target-config.d.ts +115 -0
- package/dist/target-config.js +225 -0
- package/dist/target-config.js.map +1 -0
- package/dist/transcript-file.d.ts +12 -0
- package/dist/transcript-file.js +23 -0
- package/dist/transcript-file.js.map +1 -0
- 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.d.ts +3 -0
- package/dist/ui-api.js +11 -4
- package/dist/ui-api.js.map +1 -1
- package/dist/usability-capture.d.ts +43 -0
- package/dist/usability-capture.js +327 -0
- package/dist/usability-capture.js.map +1 -0
- package/dist/usage-config.d.ts +36 -0
- package/dist/usage-config.js +114 -0
- package/dist/usage-config.js.map +1 -0
- package/dist/ux-api.d.ts +3 -75
- package/dist/ux-api.js +3 -220
- package/dist/ux-api.js.map +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.d.ts +4 -0
- package/dist/ux-cli.js +109 -0
- package/dist/ux-cli.js.map +1 -0
- package/dist/ux-config.d.ts +29 -0
- package/dist/ux-config.js +103 -0
- package/dist/ux-config.js.map +1 -0
- package/dist/ux-evidence.d.ts +54 -0
- package/dist/ux-evidence.js +197 -0
- package/dist/ux-evidence.js.map +1 -0
- 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 +116 -0
- package/dist/ux-review.js +171 -0
- package/dist/ux-review.js.map +1 -0
- package/dist/ux-usability.d.ts +263 -0
- package/dist/ux-usability.js +580 -0
- package/dist/ux-usability.js.map +1 -0
- package/dist/verify-fix-api.d.ts +194 -0
- package/dist/verify-fix-api.js +506 -0
- package/dist/verify-fix-api.js.map +1 -0
- package/dist/verify-fix-cli.d.ts +4 -0
- package/dist/verify-fix-cli.js +115 -0
- package/dist/verify-fix-cli.js.map +1 -0
- package/package.json +23 -18
- package/skills/jevitate-ci-check/SKILL.md +77 -0
- package/skills/jevitate-demo/SKILL.md +61 -0
- package/skills/jevitate-explore/SKILL.md +96 -87
- package/skills/jevitate-getting-started/SKILL.md +89 -0
- package/skills/jevitate-load-test/SKILL.md +11 -2
- package/skills/jevitate-mission-scope/SKILL.md +19 -11
- package/skills/jevitate-record/SKILL.md +23 -5
- package/skills/jevitate-run-journey/SKILL.md +61 -17
- package/skills/jevitate-sources/SKILL.md +57 -14
- package/skills/jevitate-test-campaign/SKILL.md +203 -0
- package/skills/jevitate-ux-review/SKILL.md +106 -16
- package/skills/jevitate-verify-fix/SKILL.md +76 -0
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
// check-execute.ts — `jevitate check` item execution (#231).
|
|
2
|
+
import { recordRun } from "./run-index.js";
|
|
3
|
+
import { withSiteGate } from "./site-gate-cli.js";
|
|
4
|
+
import { writeFile } from "node:fs/promises";
|
|
5
|
+
import { join, resolve } from "node:path";
|
|
6
|
+
import { parseScreenshotsArg } from "./run-screenshots.js";
|
|
7
|
+
import { resolveRouteScope } from "@jevitate/explore";
|
|
8
|
+
import { substituteSetupRefs } from "./mission-fixtures.js";
|
|
9
|
+
import { CLI_ADVERSARIAL_STRATEGIES, parseSuccessSpec } from "./explore-api.js";
|
|
10
|
+
import { artifactStamp } from "./mission-journal.js";
|
|
11
|
+
import { loadRunFile } from "./report-api.js";
|
|
12
|
+
import { GOAL_ONLY_OUTCOMES, clock } from "@jevitate/domain";
|
|
13
|
+
import { actionsOf, fixturesFor, isRecord, journeyStepUrl, recordingSteps, sessionOf, stampResultFile, targetFixtures } from "./check-plan.js";
|
|
14
|
+
import { applyJourneyEnvironment } from "./environments.js";
|
|
15
|
+
const BROKEN = new Set(["crashed", "inconclusive"]);
|
|
16
|
+
function missionExecuted(resultPath, missionOutcome, result) {
|
|
17
|
+
const actions = actionsOf(result);
|
|
18
|
+
if (BROKEN.has(missionOutcome)) {
|
|
19
|
+
const failure = isRecord(result.failure) ? result.failure : undefined;
|
|
20
|
+
const why = typeof failure?.message === "string" ? failure.message : typeof result.reason === "string" ? result.reason : missionOutcome;
|
|
21
|
+
return { status: "error", resultPath, outcome: missionOutcome, actions, error: { type: missionOutcome, message: `run ${missionOutcome}: ${why}` } };
|
|
22
|
+
}
|
|
23
|
+
return { status: "ran", resultPath, outcome: missionOutcome, actions };
|
|
24
|
+
}
|
|
25
|
+
function bounds(maxActions, maxDecisions, remaining) {
|
|
26
|
+
const b = {};
|
|
27
|
+
const cap = [maxActions, remaining].filter((n) => n !== undefined);
|
|
28
|
+
if (cap.length > 0)
|
|
29
|
+
b.maxActions = Math.max(1, Math.min(...cap));
|
|
30
|
+
if (maxDecisions !== undefined)
|
|
31
|
+
b.maxDecisions = maxDecisions;
|
|
32
|
+
return Object.keys(b).length > 0 ? b : undefined;
|
|
33
|
+
}
|
|
34
|
+
/** A goal/mission item's `browser` (#245): the check's launch options plus the item's demo-mode options. */
|
|
35
|
+
function itemBrowser(base, x) {
|
|
36
|
+
const demo = {
|
|
37
|
+
...(x.headed === true ? { headed: true } : {}),
|
|
38
|
+
...(x.slowMo === undefined ? {} : { slowMo: x.slowMo }),
|
|
39
|
+
...(x.recordVideo === undefined ? {} : { recordVideo: { dir: x.recordVideo } }),
|
|
40
|
+
...(x.overlay === false ? { overlay: false } : {}),
|
|
41
|
+
};
|
|
42
|
+
return Object.keys(demo).length === 0 ? base : { ...base, ...demo };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* #293: a journey-anchored mission item runs between the target's fixture setup and restore (as a
|
|
46
|
+
* Journey item does), so one stop point's side effects never leak into the next of a sweep.
|
|
47
|
+
*/
|
|
48
|
+
export async function execute(item, ctx, remaining) {
|
|
49
|
+
const anchored = item.kind === "mission" && item.mission !== undefined && item.t.prefixes?.has(item.mission) === true;
|
|
50
|
+
if (!anchored || item.t.fixturesFile === undefined)
|
|
51
|
+
return executeItem(item, ctx, remaining);
|
|
52
|
+
const session = item.setup?.storageState;
|
|
53
|
+
const fx = fixturesFor(targetFixtures(item.t, session), item.t.prefixes.get(item.mission).startUrl);
|
|
54
|
+
if (fx === undefined)
|
|
55
|
+
return executeItem(item, ctx, remaining);
|
|
56
|
+
try {
|
|
57
|
+
await fx.setup();
|
|
58
|
+
return await executeItem(item, ctx, remaining);
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
await fx.restore();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async function executeItem(item, ctx, remaining) {
|
|
65
|
+
const { opts, runners } = ctx;
|
|
66
|
+
const t = item.t.target;
|
|
67
|
+
const stamp = {
|
|
68
|
+
engine: ctx.engine,
|
|
69
|
+
...(opts.targetBuild === undefined ? {} : { targetBuild: opts.targetBuild }),
|
|
70
|
+
suite: { name: opts.suite.name, target: t.name, item: item.name },
|
|
71
|
+
};
|
|
72
|
+
// Goal and mission items run with their own setup (#195): explore's options, target defaults
|
|
73
|
+
// overridden per item; Journey and verify-fix items with the target's, and their own session.
|
|
74
|
+
const setup = item.setup;
|
|
75
|
+
const x = setup?.x ?? {};
|
|
76
|
+
const session = setup !== undefined ? setup.storageState : sessionOf(t, item.journey?.storageState ?? item.verify?.storageState);
|
|
77
|
+
// #245: an item's demo mode (headed/slowMo/recordVideo/overlay) on top of the check's launch flags.
|
|
78
|
+
const browser = itemBrowser(opts.browser, x);
|
|
79
|
+
// #251: an item's `screenshots` (validated at preflight); #250: `evidenceVideo`, on by default
|
|
80
|
+
// when the item records video — each defect's captioned repro clip + key screenshots, attached to
|
|
81
|
+
// the result (and so to JUnit, SARIF and report.md).
|
|
82
|
+
const screenshots = parseScreenshotsArg(x.screenshots, "screenshots");
|
|
83
|
+
const evidenceOn = x.evidenceVideo ?? browser?.recordVideo !== undefined;
|
|
84
|
+
const common = {
|
|
85
|
+
...(screenshots === undefined ? {} : { screenshots }),
|
|
86
|
+
...(evidenceOn ? { evidenceVideo: true } : {}),
|
|
87
|
+
outDir: ctx.resultsDir,
|
|
88
|
+
...(opts.browserPortFactory === undefined ? {} : { browserPortFactory: opts.browserPortFactory }),
|
|
89
|
+
...(browser === undefined ? {} : { browser }),
|
|
90
|
+
...(session === undefined ? {} : { storageState: session }),
|
|
91
|
+
...(x.saveStorageState === undefined ? {} : { saveStorageState: x.saveStorageState }),
|
|
92
|
+
};
|
|
93
|
+
const invariants = {
|
|
94
|
+
...(item.t.invariants === undefined ? {} : { invariants: item.t.invariants }),
|
|
95
|
+
...(item.t.invariantAuthTokens === undefined ? {} : { invariantAuthTokens: item.t.invariantAuthTokens }),
|
|
96
|
+
};
|
|
97
|
+
const serverLog = setup?.serverLog ?? (setup === undefined ? item.t.serverLog : undefined);
|
|
98
|
+
const withServerLog = serverLog === undefined ? {} : { serverLog };
|
|
99
|
+
const secretFields = setup?.secretFields ?? item.t.secretFields;
|
|
100
|
+
const withSecretFields = secretFields.length === 0 ? {} : { secretFields };
|
|
101
|
+
const withSecrets = setup?.secrets === undefined ? {} : { secrets: setup.secrets };
|
|
102
|
+
const conversation = {
|
|
103
|
+
...(x.replyWaitMs === undefined ? {} : { replyWaitMs: x.replyWaitMs }),
|
|
104
|
+
...(x.replyCeilingMs === undefined ? {} : { replyCeilingMs: x.replyCeilingMs }),
|
|
105
|
+
...(x.replyMaxChars === undefined ? {} : { replyMaxChars: x.replyMaxChars }),
|
|
106
|
+
...(x.jobWaitMs === undefined ? {} : { jobWaitMs: x.jobWaitMs }),
|
|
107
|
+
};
|
|
108
|
+
const withConversation = Object.keys(conversation).length === 0 ? {} : { conversation };
|
|
109
|
+
const withOverflow = x.checkOverflow === undefined && x.ignoreOverflow === undefined
|
|
110
|
+
? {}
|
|
111
|
+
: { overflow: { checkOverflow: x.checkOverflow ?? false, ignoreSelectors: x.ignoreOverflow ?? [] } };
|
|
112
|
+
const withStall = x.stallTimeout === undefined ? {} : { stallTimeoutMs: Math.round(x.stallTimeout * 1000) };
|
|
113
|
+
const withHangReplays = x.hangReplays === undefined ? {} : { hangReplays: x.hangReplays };
|
|
114
|
+
const withFixture = x.fixture === undefined ? {} : { fixture: x.fixture };
|
|
115
|
+
// An item's own viewport/device, else its target's.
|
|
116
|
+
const emulationFor = (own) => {
|
|
117
|
+
const e = own ?? t.emulation;
|
|
118
|
+
return e === undefined ? {} : { emulation: e };
|
|
119
|
+
};
|
|
120
|
+
const config = setup === undefined ? item.t.config : setup.config;
|
|
121
|
+
const targetConfig = config === undefined ? {} : { target: config };
|
|
122
|
+
// A feature mission takes the target's safety directly (it has no settle/hang config to apply).
|
|
123
|
+
const targetSafety = config?.safety === undefined ? {} : { safety: config.safety };
|
|
124
|
+
if (item.kind === "journey" && item.journey !== undefined) {
|
|
125
|
+
const stored = item.t.journeys.get(item.journey.id);
|
|
126
|
+
if (stored === undefined)
|
|
127
|
+
return { status: "error", actions: 0, error: { type: "journey", message: `Journey ${item.journey.id} not loaded` } };
|
|
128
|
+
const startedAt = (opts.nowIso ?? (() => clock.nowIso()))();
|
|
129
|
+
const sj = item.journey;
|
|
130
|
+
// #247: the item's environment (resolved and checked at preflight); its session when the item and target name none.
|
|
131
|
+
const environment = item.t.environments?.get(sj);
|
|
132
|
+
const j = applyJourneyEnvironment(stored, environment);
|
|
133
|
+
const journeySession = session ?? (sj.storageState === null ? undefined : environment?.storageState);
|
|
134
|
+
const r = await withSiteGate(opts.sitePolicyDbPath, (siteGate) => runners.journey({
|
|
135
|
+
...(siteGate === undefined ? {} : { siteGate }),
|
|
136
|
+
dir: t.journeysDir ?? opts.journeysDir,
|
|
137
|
+
id: sj.id,
|
|
138
|
+
params: { ...sj.params },
|
|
139
|
+
...emulationFor(sj.emulation),
|
|
140
|
+
...(opts.browserPortFactory === undefined ? {} : { browserPortFactory: opts.browserPortFactory }),
|
|
141
|
+
...(opts.browser === undefined ? {} : { browser: opts.browser }),
|
|
142
|
+
// #170: the item's session (default: the target's), exactly as `journey run --storage-state` (#118), and its fixtures.
|
|
143
|
+
...(journeySession === undefined ? {} : { storageState: journeySession }),
|
|
144
|
+
...(item.t.fixturesFile === undefined ? {} : { fixtures: (site) => fixturesFor(targetFixtures(item.t, journeySession), site) }),
|
|
145
|
+
...(environment === undefined ? {} : { environment }),
|
|
146
|
+
}));
|
|
147
|
+
const at = r.outcome === "quarantined" ? r.at : undefined;
|
|
148
|
+
const url = journeyStepUrl(j, at);
|
|
149
|
+
const path = join(ctx.resultsDir, `journey-${artifactStamp(startedAt)}-${ctx.seq()}.result.json`);
|
|
150
|
+
const failed = r.outcome === "quarantined";
|
|
151
|
+
const record = {
|
|
152
|
+
missionOutcome: failed ? "defects-found" : "clean",
|
|
153
|
+
exitCode: failed ? 1 : 0,
|
|
154
|
+
result: {
|
|
155
|
+
mode: "journey",
|
|
156
|
+
journeyId: item.journey.id,
|
|
157
|
+
outcome: r.outcome,
|
|
158
|
+
...(r.outcome === "quarantined" ? { reason: r.reason, ...(r.at === undefined ? {} : { at: r.at }) } : {}),
|
|
159
|
+
...(url === undefined ? {} : { url }),
|
|
160
|
+
startedAt,
|
|
161
|
+
target: { seedUrl: j.recording.site, allowlist: [new URL(j.recording.site).origin] },
|
|
162
|
+
engine: ctx.engine,
|
|
163
|
+
suite: stamp.suite,
|
|
164
|
+
...(opts.targetBuild === undefined ? {} : { targetBuild: opts.targetBuild }),
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
await writeFile(path, `${JSON.stringify(record, null, 2)}\n`, "utf8");
|
|
168
|
+
recordRun(path); // #213: a bare `report` in this project finds it
|
|
169
|
+
const actions = failed && at !== undefined ? at + 1 : recordingSteps(j);
|
|
170
|
+
return { status: "ran", resultPath: path, outcome: r.outcome, actions };
|
|
171
|
+
}
|
|
172
|
+
if (item.kind === "goal" && item.goal !== undefined) {
|
|
173
|
+
const g = item.goal;
|
|
174
|
+
const { judge, gen, usage } = await ctx.gateways();
|
|
175
|
+
// #170: the target's fixtures run around the goal (a failed setup is an item error, never a
|
|
176
|
+
// run on unknown state), and its secret fields are typed by code, as `explore --secret-field`.
|
|
177
|
+
let url = g.url ?? t.url;
|
|
178
|
+
let goal = g.goal;
|
|
179
|
+
let successChecks = item.t.goals.get(g.name) ?? [];
|
|
180
|
+
const fx = setup?.fixtures === undefined ? undefined : fixturesFor(setup.fixtures, url);
|
|
181
|
+
try {
|
|
182
|
+
if (fx !== undefined) {
|
|
183
|
+
await fx.setup();
|
|
184
|
+
const b = fx.bindings();
|
|
185
|
+
url = substituteSetupRefs(url, b, { where: `goal ${g.name} url` });
|
|
186
|
+
goal = substituteSetupRefs(goal, b, { where: `goal ${g.name}` });
|
|
187
|
+
successChecks = g.success.map((s) => parseSuccessSpec(substituteSetupRefs(s, b, { where: `goal ${g.name} success` })));
|
|
188
|
+
}
|
|
189
|
+
const r = await runners.goal({
|
|
190
|
+
...common,
|
|
191
|
+
...emulationFor(g.emulation),
|
|
192
|
+
...targetConfig,
|
|
193
|
+
...invariants,
|
|
194
|
+
...withServerLog,
|
|
195
|
+
url,
|
|
196
|
+
goal,
|
|
197
|
+
successChecks,
|
|
198
|
+
...(g.successWhen === undefined ? {} : { successWhen: g.successWhen }),
|
|
199
|
+
...(x.allowVacuousChecks === true ? { allowVacuousChecks: true } : {}),
|
|
200
|
+
...(x.actionDeltas === true ? { actionDeltas: true } : {}),
|
|
201
|
+
allowlist: item.t.allowlist,
|
|
202
|
+
judge,
|
|
203
|
+
gen,
|
|
204
|
+
usage,
|
|
205
|
+
bounds: bounds(g.maxActions, g.maxDecisions, remaining),
|
|
206
|
+
...withSecretFields,
|
|
207
|
+
...withSecrets,
|
|
208
|
+
...withFixture,
|
|
209
|
+
...withHangReplays,
|
|
210
|
+
...withConversation,
|
|
211
|
+
...(setup?.actors === undefined ? {} : { actors: setup.actors }),
|
|
212
|
+
...(fx === undefined ? {} : { fixtures: fx }),
|
|
213
|
+
});
|
|
214
|
+
stampResultFile(r.resultPath, { ...stamp, ...(ctx.opts.aiMode === "fake" ? { aiMode: "fake" } : {}) });
|
|
215
|
+
// #213: `--fake-ai`'s judge is a deterministic stand-in (it always proposes `done`) — it
|
|
216
|
+
// cannot prove a goal was reached OR missed, so the goal's own judgment-driven ending
|
|
217
|
+
// (`succeeded`/`failed`/`exhausted`/`blocked`: `GOAL_ONLY_OUTCOMES`) is honestly inconclusive
|
|
218
|
+
// under it, never a gating FAILED. A genuine hard signal the run hit along the way (an
|
|
219
|
+
// invariant violation, a 5xx, a hang, a crash — `goalOutcome` holding a shared
|
|
220
|
+
// `MissionOutcome` directly, not a goal-only one) never depended on the judge and still
|
|
221
|
+
// gates. `succeeded` needs no override: it is the clean case.
|
|
222
|
+
if (ctx.opts.aiMode === "fake" && GOAL_ONLY_OUTCOMES.includes(r.goalOutcome) && r.goalOutcome !== "succeeded") {
|
|
223
|
+
return {
|
|
224
|
+
status: "error",
|
|
225
|
+
resultPath: r.resultPath,
|
|
226
|
+
outcome: "inconclusive",
|
|
227
|
+
goalOutcome: r.goalOutcome,
|
|
228
|
+
actions: r.actions,
|
|
229
|
+
error: {
|
|
230
|
+
type: "inconclusive",
|
|
231
|
+
message: `goal not verified: --fake-ai has no real judgment (the goal ended '${r.goalOutcome}') — use --real to gate on this goal`,
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
// #217: the canonical verdict gates; the goal's own ending rides beside it.
|
|
236
|
+
const executed = missionExecuted(r.resultPath, r.missionOutcome, r);
|
|
237
|
+
return { ...executed, goalOutcome: r.goalOutcome, actions: r.actions };
|
|
238
|
+
}
|
|
239
|
+
finally {
|
|
240
|
+
await fx?.restore();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (item.kind === "mission" && item.mission !== undefined) {
|
|
244
|
+
const m = item.mission;
|
|
245
|
+
// #293: a journey-anchored mission replays its Journey's prefix first and starts where it lands.
|
|
246
|
+
const prefix = item.t.prefixes?.get(m);
|
|
247
|
+
const withPrefix = prefix === undefined ? {} : { journeyPrefix: prefix };
|
|
248
|
+
// The prefix types its secret params into the page the mission perceives: redacted like the item's own.
|
|
249
|
+
const anchoredSecrets = prefix === undefined || prefix.secrets.length === 0 ? withSecrets : { secrets: [...(setup?.secrets ?? []), ...prefix.secrets] };
|
|
250
|
+
const url = prefix?.startUrl ?? m.url ?? t.url;
|
|
251
|
+
const b = bounds(m.maxActions, m.maxDecisions, remaining);
|
|
252
|
+
if (m.strategy === "feature") {
|
|
253
|
+
const r = await runners.feature({
|
|
254
|
+
...common,
|
|
255
|
+
...emulationFor(m.emulation),
|
|
256
|
+
...targetSafety,
|
|
257
|
+
...invariants,
|
|
258
|
+
...withServerLog,
|
|
259
|
+
seedUrl: url,
|
|
260
|
+
allowlist: item.t.allowlist,
|
|
261
|
+
capability: m.feature ?? m.name,
|
|
262
|
+
routeGlobs: resolveRouteScope(url, m.routes).routeGlobs,
|
|
263
|
+
bounds: b,
|
|
264
|
+
...withStall,
|
|
265
|
+
});
|
|
266
|
+
stampResultFile(r.resultPath, stamp);
|
|
267
|
+
return missionExecuted(r.resultPath, r.missionOutcome, r);
|
|
268
|
+
}
|
|
269
|
+
const { judge, gen, usage } = await ctx.gateways();
|
|
270
|
+
if (m.strategy === "coverage" || m.strategy === "exploratory") {
|
|
271
|
+
const r = await runners.coverage({
|
|
272
|
+
...common,
|
|
273
|
+
...emulationFor(m.emulation),
|
|
274
|
+
...(m.strategy === "exploratory" ? { strategy: "exploratory" } : {}),
|
|
275
|
+
...targetConfig,
|
|
276
|
+
...invariants,
|
|
277
|
+
...withServerLog,
|
|
278
|
+
url,
|
|
279
|
+
allowlist: item.t.allowlist,
|
|
280
|
+
judge,
|
|
281
|
+
gen,
|
|
282
|
+
usage,
|
|
283
|
+
bounds: b,
|
|
284
|
+
...withStall,
|
|
285
|
+
...withOverflow,
|
|
286
|
+
...(m.routes === undefined && x.scope === undefined ? {} : { routeGlobs: [...(m.routes ?? []), ...(x.scope === "app" ? ["/**"] : [])] }),
|
|
287
|
+
...withPrefix,
|
|
288
|
+
...(x.actionDeltas === true ? { actionDeltas: true } : {}),
|
|
289
|
+
});
|
|
290
|
+
stampResultFile(r.resultPath, stamp);
|
|
291
|
+
return missionExecuted(r.resultPath, r.missionOutcome, r);
|
|
292
|
+
}
|
|
293
|
+
if (m.strategy === "adversarial") {
|
|
294
|
+
const r = await runners.adversarial({
|
|
295
|
+
...common,
|
|
296
|
+
...emulationFor(m.emulation),
|
|
297
|
+
...targetConfig,
|
|
298
|
+
...invariants,
|
|
299
|
+
...withServerLog,
|
|
300
|
+
seedUrl: url,
|
|
301
|
+
allowlist: item.t.allowlist,
|
|
302
|
+
strategies: CLI_ADVERSARIAL_STRATEGIES,
|
|
303
|
+
...(x.actionDeltas === true ? { actionDeltas: true } : {}),
|
|
304
|
+
judgment: judge,
|
|
305
|
+
generation: gen,
|
|
306
|
+
usage,
|
|
307
|
+
...(b === undefined ? {} : { bounds: b }),
|
|
308
|
+
...(m.routes === undefined ? {} : { routeGlobs: [...m.routes] }),
|
|
309
|
+
...anchoredSecrets,
|
|
310
|
+
...withHangReplays,
|
|
311
|
+
...withOverflow,
|
|
312
|
+
...(setup?.coverageThresholds === undefined ? {} : { coverageThresholds: setup.coverageThresholds }),
|
|
313
|
+
...withPrefix,
|
|
314
|
+
});
|
|
315
|
+
stampResultFile(r.resultPath, stamp);
|
|
316
|
+
return missionExecuted(r.resultPath, r.outcome, r);
|
|
317
|
+
}
|
|
318
|
+
// usability: UX findings are advisory; the report file is the result the report reads.
|
|
319
|
+
const r = await runners.usability({
|
|
320
|
+
...common,
|
|
321
|
+
...emulationFor(m.emulation),
|
|
322
|
+
...targetConfig,
|
|
323
|
+
...withServerLog,
|
|
324
|
+
url,
|
|
325
|
+
job: m.goal ?? "",
|
|
326
|
+
appContext: { appClass: m.appClass ?? "", job: m.goal ?? "" },
|
|
327
|
+
allowlist: item.t.allowlist,
|
|
328
|
+
...withSecretFields,
|
|
329
|
+
...anchoredSecrets,
|
|
330
|
+
...withFixture,
|
|
331
|
+
...withConversation,
|
|
332
|
+
...withOverflow,
|
|
333
|
+
...(x.minConfidence === undefined ? {} : { minConfidence: x.minConfidence }),
|
|
334
|
+
...(x.show === undefined ? {} : { show: x.show }),
|
|
335
|
+
...(x.maxFindingsPerPage === undefined ? {} : { maxFindingsPerRoute: x.maxFindingsPerPage }),
|
|
336
|
+
...(x.product === undefined ? {} : { product: x.product }),
|
|
337
|
+
...(x.polish === true ? { polish: true } : {}),
|
|
338
|
+
...(x.probeGuards === true ? { probeGuards: true } : {}),
|
|
339
|
+
// #225: the job's completion checks — goal-item semantics, never ignored.
|
|
340
|
+
...(m.success === undefined ? {} : { successChecks: m.success.map(parseSuccessSpec) }),
|
|
341
|
+
...(m.successWhen === undefined ? {} : { successWhen: m.successWhen }),
|
|
342
|
+
...(x.allowVacuousChecks === true ? { allowVacuousChecks: true } : {}),
|
|
343
|
+
...(x.actionDeltas === true ? { actionDeltas: true } : {}),
|
|
344
|
+
judge,
|
|
345
|
+
gen,
|
|
346
|
+
usage,
|
|
347
|
+
bounds: b,
|
|
348
|
+
...withPrefix,
|
|
349
|
+
});
|
|
350
|
+
const actions = actionsOf({ transcriptPath: r.transcriptPath });
|
|
351
|
+
// #213: the item points at the PERSISTED result (which carries the UX report), never at the
|
|
352
|
+
// report file alone — the same kind of path every other strategy's item has.
|
|
353
|
+
stampResultFile(r.resultPath, stamp);
|
|
354
|
+
if (r.reportPath === null) {
|
|
355
|
+
return {
|
|
356
|
+
status: "error",
|
|
357
|
+
resultPath: r.resultPath,
|
|
358
|
+
outcome: r.missionOutcome,
|
|
359
|
+
actions,
|
|
360
|
+
error: { type: "inconclusive", message: r.analysisUnavailable ?? "usability analysis unavailable" },
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
stampResultFile(r.reportPath, stamp);
|
|
364
|
+
if (BROKEN.has(r.missionOutcome)) {
|
|
365
|
+
return { status: "error", resultPath: r.resultPath, outcome: r.missionOutcome, actions, error: { type: r.missionOutcome, message: `usability run ${r.missionOutcome}` } };
|
|
366
|
+
}
|
|
367
|
+
return { status: "ran", resultPath: r.resultPath, outcome: r.missionOutcome, actions };
|
|
368
|
+
}
|
|
369
|
+
if (item.kind === "verify-fix" && item.verify !== undefined) {
|
|
370
|
+
const v = item.verify;
|
|
371
|
+
const startedAt = (opts.nowIso ?? (() => clock.nowIso()))();
|
|
372
|
+
const source = loadRunFile(v.result);
|
|
373
|
+
const original = source?.observations.find((o) => o.related.includes(v.fingerprint));
|
|
374
|
+
const r = await runners.verifyFix({
|
|
375
|
+
resultPath: v.result,
|
|
376
|
+
fingerprint: v.fingerprint,
|
|
377
|
+
...(v.replays === undefined ? {} : { replays: v.replays }),
|
|
378
|
+
...(opts.targetsConfig === undefined ? {} : { targets: opts.targetsConfig }),
|
|
379
|
+
...(opts.browserPortFactory === undefined ? {} : { browserPortFactory: opts.browserPortFactory }),
|
|
380
|
+
...(opts.browser === undefined ? {} : { browser: opts.browser }),
|
|
381
|
+
...(session === undefined ? {} : { storageState: session }),
|
|
382
|
+
});
|
|
383
|
+
const missionOutcome = r.verdict === "fixed" ? "clean" : r.verdict === "still-reproduces" ? "defects-found" : r.verdict === "intermittent" ? "intermittent" : "inconclusive";
|
|
384
|
+
const path = join(ctx.resultsDir, `verify-${artifactStamp(startedAt)}-${ctx.seq()}.result.json`);
|
|
385
|
+
const record = {
|
|
386
|
+
missionOutcome,
|
|
387
|
+
exitCode: r.exitCode,
|
|
388
|
+
result: {
|
|
389
|
+
mode: "verify-fix",
|
|
390
|
+
source: resolve(v.result),
|
|
391
|
+
fingerprint: v.fingerprint,
|
|
392
|
+
verdict: r.verdict,
|
|
393
|
+
reason: r.reason,
|
|
394
|
+
...(r.title === undefined ? {} : { title: r.title }),
|
|
395
|
+
...(original === undefined ? {} : { identity: original.identity }),
|
|
396
|
+
...(source?.target === undefined ? {} : { target: { seedUrl: source.target } }),
|
|
397
|
+
startedAt,
|
|
398
|
+
engine: ctx.engine,
|
|
399
|
+
suite: stamp.suite,
|
|
400
|
+
...(opts.targetBuild === undefined ? {} : { targetBuild: opts.targetBuild }),
|
|
401
|
+
},
|
|
402
|
+
};
|
|
403
|
+
await writeFile(path, `${JSON.stringify(record, null, 2)}\n`, "utf8");
|
|
404
|
+
recordRun(path); // #213: a bare `report` in this project finds it
|
|
405
|
+
if (r.verdict === "inconclusive") {
|
|
406
|
+
return { status: "error", resultPath: path, outcome: r.verdict, actions: 0, error: { type: "inconclusive", message: `verify-fix inconclusive: ${r.reason}` } };
|
|
407
|
+
}
|
|
408
|
+
if (original === undefined && r.verdict !== "fixed") {
|
|
409
|
+
// Still reproducing, but the source finding's identity could not be read: fail closed as an item error.
|
|
410
|
+
return { status: "error", resultPath: path, outcome: r.verdict, actions: 0, error: { type: r.verdict, message: `verify-fix ${r.verdict}: ${r.reason}` } };
|
|
411
|
+
}
|
|
412
|
+
return { status: "ran", resultPath: path, outcome: r.verdict, actions: 0 };
|
|
413
|
+
}
|
|
414
|
+
return { status: "error", actions: 0, error: { type: "internal", message: `unplannable item ${item.kind} ${item.name}` } };
|
|
415
|
+
}
|
|
416
|
+
// ── gate ─────────────────────────────────────────────────────────────────────
|
|
417
|
+
export function caseDetail(defects) {
|
|
418
|
+
return defects.map((d) => `${d.key} ${d.title}${d.reproduce === undefined ? "" : `\n reproduce: ${d.reproduce}`}`).join("\n");
|
|
419
|
+
}
|
|
420
|
+
//# sourceMappingURL=check-execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-execute.js","sourceRoot":"","sources":["../src/check-execute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import type { InvariantSpec } from "@jevitate/recording";
|
|
2
|
+
import { type Journey } from "@jevitate/journey";
|
|
3
|
+
import { type CoverageThresholds, type SecretField, type SuccessCheck } from "@jevitate/explore";
|
|
4
|
+
import { type FixtureFlags } from "./fixture-cli.js";
|
|
5
|
+
import { type MissionActors } from "./mission-actors.js";
|
|
6
|
+
import { type Persona } from "./multi-run.js";
|
|
7
|
+
import { type SuiteExploreOptions } from "./suite-explore-options.js";
|
|
8
|
+
import { type MissionFixtures } from "./mission-fixtures.js";
|
|
9
|
+
import { type ServerLogOptions } from "./explore-api.js";
|
|
10
|
+
import { type TargetConfig } from "./target-config.js";
|
|
11
|
+
import { type EngineInfo } from "./engine.js";
|
|
12
|
+
import { type ResolvedJourneyEnvironment } from "./environments.js";
|
|
13
|
+
import { type JourneyPrefix } from "./journey-prefix.js";
|
|
14
|
+
import type { SuiteGoal, SuiteJourney, SuiteMission, SuiteTarget, SuiteVerifyFix } from "./check-suite.js";
|
|
15
|
+
import { type ItemKind, type RunCheckOptions } from "./check-types.js";
|
|
16
|
+
/** Does an item covering `routes` touch any changed route glob? No known routes ⇒ it runs. */
|
|
17
|
+
export declare function affectedBy(routes: readonly string[] | undefined, changed: readonly string[]): boolean;
|
|
18
|
+
export type Json = Record<string, unknown>;
|
|
19
|
+
export declare function isRecord(v: unknown): v is Json;
|
|
20
|
+
export declare function errorMessage(e: unknown): string;
|
|
21
|
+
/** Executed actions in a persisted result: its `actions`, else its transcript's acted steps. */
|
|
22
|
+
export declare function actionsOf(result: Json): number;
|
|
23
|
+
export interface Stamp {
|
|
24
|
+
readonly engine: EngineInfo;
|
|
25
|
+
readonly targetBuild?: string;
|
|
26
|
+
readonly suite: {
|
|
27
|
+
readonly name: string;
|
|
28
|
+
readonly target: string;
|
|
29
|
+
readonly item: string;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* #213: stamped on a goal result run under `--fake-ai`/`ai:"fake"` — read back by
|
|
33
|
+
* `@jevitate/findings` to keep the fake judge's OWN "goal not reached" ending out of the hard,
|
|
34
|
+
* gating `goal-check` findings (a genuine hard signal it observed along the way, e.g. an
|
|
35
|
+
* invariant violation or a 5xx, still gates: it never depended on the judge).
|
|
36
|
+
*/
|
|
37
|
+
readonly aiMode?: "real" | "fake";
|
|
38
|
+
}
|
|
39
|
+
/** Adds the check's stamp (engine, target build, suite item, ai mode) to a result the runner already wrote. */
|
|
40
|
+
export declare function stampResultFile(path: string, stamp: Stamp): void;
|
|
41
|
+
/** The flat step index → the page URL that step ran on (for a failed Journey step's route). */
|
|
42
|
+
export declare function journeyStepUrl(j: Journey, at: number | undefined): string | undefined;
|
|
43
|
+
export declare function recordingSteps(j: Journey): number;
|
|
44
|
+
export interface PreparedTarget {
|
|
45
|
+
readonly target: SuiteTarget;
|
|
46
|
+
readonly allowlist: string[];
|
|
47
|
+
readonly invariants?: InvariantSpec;
|
|
48
|
+
/** The invariants' `authFrom.secret` values, resolved from the environment at preflight (as `explore --invariants`). */
|
|
49
|
+
readonly invariantAuthTokens?: ReadonlyMap<string, string>;
|
|
50
|
+
/** targets.json `logSources`/`logDefect` for the target's origin (as `explore` and the queue apply them). */
|
|
51
|
+
readonly serverLog?: ServerLogOptions;
|
|
52
|
+
readonly config?: TargetConfig;
|
|
53
|
+
readonly journeys: Map<string, Journey>;
|
|
54
|
+
/** #247: each Journey item that names an `env`/`baseUrl`, and the environment it resolved to at preflight. */
|
|
55
|
+
readonly environments?: ReadonlyMap<SuiteJourney, ResolvedJourneyEnvironment>;
|
|
56
|
+
readonly goals: Map<string, SuccessCheck[]>;
|
|
57
|
+
/** The target's `secretFields`, resolved from the environment at preflight (#170). */
|
|
58
|
+
readonly secretFields: readonly SecretField[];
|
|
59
|
+
/** The target's fixtures file (the suite's, else targets.json's), validated at preflight (#170). */
|
|
60
|
+
readonly fixturesFile?: string;
|
|
61
|
+
/** #293: each journey-anchored mission item's Journey prefix, resolved (and refused) at preflight. */
|
|
62
|
+
readonly prefixes?: ReadonlyMap<SuiteMission, JourneyPrefix>;
|
|
63
|
+
/** #293: each anchored mission item → the items it runs as (a sweep: one per stop point). */
|
|
64
|
+
readonly expanded?: ReadonlyMap<SuiteMission, readonly SuiteMission[]>;
|
|
65
|
+
}
|
|
66
|
+
/** What an item's fixture lifecycle is built from: its fixtures file and hooks, authenticated like its session. */
|
|
67
|
+
interface FixtureSource {
|
|
68
|
+
readonly allowlist: readonly string[];
|
|
69
|
+
readonly flags: FixtureFlags;
|
|
70
|
+
readonly storageState?: string;
|
|
71
|
+
readonly secretFields: readonly SecretField[];
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* An item's fixture lifecycle (#170/#195), authenticated like the item's session: its storage
|
|
75
|
+
* state and `secretFields`. `undefined` when it declares no fixtures file and no hooks.
|
|
76
|
+
*/
|
|
77
|
+
export declare function fixturesFor(f: FixtureSource, baseUrl: string): MissionFixtures | undefined;
|
|
78
|
+
/** The target's own fixtures (around Journey items), with `storageState` the item's session. */
|
|
79
|
+
export declare function targetFixtures(p: PreparedTarget, storageState: string | undefined): FixtureSource;
|
|
80
|
+
/** An item's session: its own `storageState` (`null`: none), else the target's. */
|
|
81
|
+
export declare function sessionOf(t: SuiteTarget, own: string | null | undefined): string | undefined;
|
|
82
|
+
/**
|
|
83
|
+
* Everything one goal/mission item runs with (#195): `explore`'s options, the target's defaults
|
|
84
|
+
* overridden by the item's own, resolved and validated at preflight exactly as `explore` does for
|
|
85
|
+
* its flags — the target config its safety/settle/timing flags build, its backend log sources,
|
|
86
|
+
* secret references resolved from the environment, actors, personas and fixtures.
|
|
87
|
+
*/
|
|
88
|
+
interface ItemSetup {
|
|
89
|
+
readonly x: SuiteExploreOptions;
|
|
90
|
+
readonly storageState?: string;
|
|
91
|
+
readonly secretFields: readonly SecretField[];
|
|
92
|
+
readonly secrets?: readonly string[];
|
|
93
|
+
readonly config?: TargetConfig;
|
|
94
|
+
readonly serverLog?: ServerLogOptions;
|
|
95
|
+
readonly actors?: MissionActors;
|
|
96
|
+
readonly personas?: readonly Persona[];
|
|
97
|
+
readonly fixtures?: FixtureSource;
|
|
98
|
+
readonly coverageThresholds?: CoverageThresholds;
|
|
99
|
+
}
|
|
100
|
+
export interface Planned {
|
|
101
|
+
readonly t: PreparedTarget;
|
|
102
|
+
readonly kind: ItemKind;
|
|
103
|
+
readonly name: string;
|
|
104
|
+
readonly strategy?: string;
|
|
105
|
+
readonly needsAi: boolean;
|
|
106
|
+
readonly skipped?: string;
|
|
107
|
+
readonly journey?: SuiteJourney;
|
|
108
|
+
readonly goal?: SuiteGoal;
|
|
109
|
+
readonly mission?: SuiteMission;
|
|
110
|
+
readonly verify?: SuiteVerifyFix;
|
|
111
|
+
/** Goal and mission items: what they run with (#195). */
|
|
112
|
+
readonly setup?: ItemSetup;
|
|
113
|
+
/** A persona matrix cell: the persona this item runs as (#143/#195). */
|
|
114
|
+
readonly persona?: Persona;
|
|
115
|
+
}
|
|
116
|
+
export declare function prepareTarget(t: SuiteTarget, opts: RunCheckOptions): Promise<PreparedTarget>;
|
|
117
|
+
export declare function plan(prepared: readonly PreparedTarget[], changed: readonly string[] | undefined, opts: RunCheckOptions): Planned[];
|
|
118
|
+
export {};
|