@jevitate/cli 0.1.0 → 0.2.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.js +40 -30
- package/dist/ai-cli.js.map +1 -1
- package/dist/author-journey-cli.d.ts +4 -0
- package/dist/author-journey-cli.js +109 -0
- package/dist/author-journey-cli.js.map +1 -0
- package/dist/bin.js +58077 -22454
- package/dist/bin.js.map +1 -1
- package/dist/browser-run-options.d.ts +58 -0
- package/dist/browser-run-options.js +106 -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/check-api.d.ts +5 -0
- package/dist/check-api.js +233 -0
- package/dist/check-api.js.map +1 -0
- package/dist/check-budget.d.ts +26 -0
- package/dist/check-budget.js +89 -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 +25 -0
- package/dist/check-execute.js +385 -0
- package/dist/check-execute.js.map +1 -0
- package/dist/check-plan.d.ts +113 -0
- package/dist/check-plan.js +448 -0
- package/dist/check-plan.js.map +1 -0
- package/dist/check-suite.d.ts +171 -0
- package/dist/check-suite.js +515 -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 +102 -0
- package/dist/cli-output.js +516 -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 +330 -0
- package/dist/cli-shared.js +492 -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 +502 -0
- package/dist/defect-evidence.js.map +1 -0
- package/dist/demo-aspect-api.d.ts +209 -0
- package/dist/demo-aspect-api.js +397 -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 +241 -0
- package/dist/demo-aspect-cli.js.map +1 -0
- package/dist/demo-capture.d.ts +108 -0
- package/dist/demo-capture.js +438 -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 +137 -0
- package/dist/explore-adversarial.js +218 -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 +963 -0
- package/dist/explore-cli.js.map +1 -0
- package/dist/explore-coverage.d.ts +158 -0
- package/dist/explore-coverage.js +240 -0
- package/dist/explore-coverage.js.map +1 -0
- package/dist/explore-feature.d.ts +127 -0
- package/dist/explore-feature.js +220 -0
- package/dist/explore-feature.js.map +1 -0
- package/dist/explore-goal.d.ts +253 -0
- package/dist/explore-goal.js +374 -0
- package/dist/explore-goal.js.map +1 -0
- package/dist/explore-shared.d.ts +152 -0
- package/dist/explore-shared.js +129 -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 +52 -0
- package/dist/fixture-auth.js +82 -0
- package/dist/fixture-auth.js.map +1 -0
- package/dist/fixture-cli.d.ts +70 -0
- package/dist/fixture-cli.js +178 -0
- package/dist/fixture-cli.js.map +1 -0
- package/dist/github-issue-filer.d.ts +62 -0
- package/dist/github-issue-filer.js +188 -0
- package/dist/github-issue-filer.js.map +1 -0
- package/dist/host-health-run.d.ts +24 -0
- package/dist/host-health-run.js +27 -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 +127 -0
- package/dist/init-cli.js.map +1 -0
- package/dist/init-keys.d.ts +19 -2
- package/dist/init-keys.js +15 -4
- 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 +256 -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 +179 -0
- package/dist/journey-annotate-cli.js.map +1 -0
- package/dist/journey-api.d.ts +79 -2
- package/dist/journey-api.js +136 -19
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-cli.d.ts +4 -0
- package/dist/journey-cli.js +370 -0
- package/dist/journey-cli.js.map +1 -0
- package/dist/journey-demo-api.d.ts +112 -0
- package/dist/journey-demo-api.js +392 -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 +155 -0
- package/dist/journey-demo-cli.js.map +1 -0
- package/dist/kill-signal.d.ts +193 -0
- package/dist/kill-signal.js +284 -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 +237 -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 +147 -0
- package/dist/log-correlation.js +325 -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 +235 -0
- package/dist/log-sources.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 +84 -0
- package/dist/logs-retention.js.map +1 -0
- package/dist/mcp-api.d.ts +89 -1
- package/dist/mcp-api.js +472 -18
- package/dist/mcp-api.js.map +1 -1
- package/dist/mcp-args.d.ts +38 -0
- package/dist/mcp-args.js +131 -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 +125 -0
- package/dist/mcp-cli-tools.js +680 -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 +58 -2
- package/dist/mission-api.js.map +1 -1
- package/dist/mission-cli.d.ts +4 -0
- package/dist/mission-cli.js +247 -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 +225 -0
- package/dist/mission-fixtures.js +828 -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 +397 -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 +110 -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 +63 -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 +119 -1921
- package/dist/program.js.map +1 -1
- package/dist/project-dir.d.ts +96 -0
- package/dist/project-dir.js +220 -0
- package/dist/project-dir.js.map +1 -0
- package/dist/record-api.d.ts +10 -6
- package/dist/record-api.js +39 -28
- package/dist/record-api.js.map +1 -1
- package/dist/record-cli.d.ts +4 -0
- package/dist/record-cli.js +64 -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 +101 -0
- package/dist/regression-api.js +384 -5
- package/dist/regression-api.js.map +1 -1
- package/dist/regression-cli.d.ts +4 -0
- package/dist/regression-cli.js +232 -0
- package/dist/regression-cli.js.map +1 -0
- package/dist/report-api.d.ts +146 -0
- package/dist/report-api.js +430 -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/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-screenshots.d.ts +123 -0
- package/dist/run-screenshots.js +229 -0
- package/dist/run-screenshots.js.map +1 -0
- package/dist/runtime-env.d.ts +8 -0
- package/dist/runtime-env.js +22 -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 +34 -0
- package/dist/server-log-verify.js +115 -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 +58 -0
- package/dist/site-gate-cli.js.map +1 -0
- package/dist/source-api.js +18 -3
- 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 +289 -0
- package/dist/suite-explore-options.js +140 -0
- package/dist/suite-explore-options.js.map +1 -0
- package/dist/target-config.d.ts +109 -0
- package/dist/target-config.js +216 -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/ui-api.d.ts +3 -0
- package/dist/ui-api.js +7 -1
- package/dist/ui-api.js.map +1 -1
- package/dist/usability-capture.d.ts +43 -0
- package/dist/usability-capture.js +326 -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-cli.d.ts +4 -0
- package/dist/ux-cli.js +102 -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-review.d.ts +112 -0
- package/dist/ux-review.js +151 -0
- package/dist/ux-review.js.map +1 -0
- package/dist/ux-usability.d.ts +238 -0
- package/dist/ux-usability.js +494 -0
- package/dist/ux-usability.js.map +1 -0
- package/dist/verify-fix-api.d.ts +173 -0
- package/dist/verify-fix-api.js +454 -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 +110 -0
- package/dist/verify-fix-cli.js.map +1 -0
- package/package.json +19 -14
- package/skills/jevitate-ci-check/SKILL.md +77 -0
- package/skills/jevitate-demo/SKILL.md +61 -0
- package/skills/jevitate-explore/SKILL.md +88 -87
- package/skills/jevitate-getting-started/SKILL.md +88 -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-ux-review/SKILL.md +106 -16
- package/skills/jevitate-verify-fix/SKILL.md +76 -0
|
@@ -0,0 +1,113 @@
|
|
|
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 { SuiteGoal, SuiteJourney, SuiteMission, SuiteTarget, SuiteVerifyFix } from "./check-suite.js";
|
|
14
|
+
import { type ItemKind, type RunCheckOptions } from "./check-types.js";
|
|
15
|
+
/** Does an item covering `routes` touch any changed route glob? No known routes ⇒ it runs. */
|
|
16
|
+
export declare function affectedBy(routes: readonly string[] | undefined, changed: readonly string[]): boolean;
|
|
17
|
+
export type Json = Record<string, unknown>;
|
|
18
|
+
export declare function isRecord(v: unknown): v is Json;
|
|
19
|
+
export declare function errorMessage(e: unknown): string;
|
|
20
|
+
/** Executed actions in a persisted result: its `actions`, else its transcript's acted steps. */
|
|
21
|
+
export declare function actionsOf(result: Json): number;
|
|
22
|
+
export interface Stamp {
|
|
23
|
+
readonly engine: EngineInfo;
|
|
24
|
+
readonly targetBuild?: string;
|
|
25
|
+
readonly suite: {
|
|
26
|
+
readonly name: string;
|
|
27
|
+
readonly target: string;
|
|
28
|
+
readonly item: string;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* #213: stamped on a goal result run under `--fake-ai`/`ai:"fake"` — read back by
|
|
32
|
+
* `@jevitate/findings` to keep the fake judge's OWN "goal not reached" ending out of the hard,
|
|
33
|
+
* gating `goal-check` findings (a genuine hard signal it observed along the way, e.g. an
|
|
34
|
+
* invariant violation or a 5xx, still gates: it never depended on the judge).
|
|
35
|
+
*/
|
|
36
|
+
readonly aiMode?: "real" | "fake";
|
|
37
|
+
}
|
|
38
|
+
/** Adds the check's stamp (engine, target build, suite item, ai mode) to a result the runner already wrote. */
|
|
39
|
+
export declare function stampResultFile(path: string, stamp: Stamp): void;
|
|
40
|
+
/** The flat step index → the page URL that step ran on (for a failed Journey step's route). */
|
|
41
|
+
export declare function journeyStepUrl(j: Journey, at: number | undefined): string | undefined;
|
|
42
|
+
export declare function recordingSteps(j: Journey): number;
|
|
43
|
+
export interface PreparedTarget {
|
|
44
|
+
readonly target: SuiteTarget;
|
|
45
|
+
readonly allowlist: string[];
|
|
46
|
+
readonly invariants?: InvariantSpec;
|
|
47
|
+
/** The invariants' `authFrom.secret` values, resolved from the environment at preflight (as `explore --invariants`). */
|
|
48
|
+
readonly invariantAuthTokens?: ReadonlyMap<string, string>;
|
|
49
|
+
/** targets.json `logSources`/`logDefect` for the target's origin (as `explore` and the queue apply them). */
|
|
50
|
+
readonly serverLog?: ServerLogOptions;
|
|
51
|
+
readonly config?: TargetConfig;
|
|
52
|
+
readonly journeys: Map<string, Journey>;
|
|
53
|
+
/** #247: each Journey item that names an `env`/`baseUrl`, and the environment it resolved to at preflight. */
|
|
54
|
+
readonly environments?: ReadonlyMap<SuiteJourney, ResolvedJourneyEnvironment>;
|
|
55
|
+
readonly goals: Map<string, SuccessCheck[]>;
|
|
56
|
+
/** The target's `secretFields`, resolved from the environment at preflight (#170). */
|
|
57
|
+
readonly secretFields: readonly SecretField[];
|
|
58
|
+
/** The target's fixtures file (the suite's, else targets.json's), validated at preflight (#170). */
|
|
59
|
+
readonly fixturesFile?: string;
|
|
60
|
+
}
|
|
61
|
+
/** What an item's fixture lifecycle is built from: its fixtures file and hooks, authenticated like its session. */
|
|
62
|
+
interface FixtureSource {
|
|
63
|
+
readonly allowlist: readonly string[];
|
|
64
|
+
readonly flags: FixtureFlags;
|
|
65
|
+
readonly storageState?: string;
|
|
66
|
+
readonly secretFields: readonly SecretField[];
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* An item's fixture lifecycle (#170/#195), authenticated like the item's session: its storage
|
|
70
|
+
* state and `secretFields`. `undefined` when it declares no fixtures file and no hooks.
|
|
71
|
+
*/
|
|
72
|
+
export declare function fixturesFor(f: FixtureSource, baseUrl: string): MissionFixtures | undefined;
|
|
73
|
+
/** The target's own fixtures (around Journey items), with `storageState` the item's session. */
|
|
74
|
+
export declare function targetFixtures(p: PreparedTarget, storageState: string | undefined): FixtureSource;
|
|
75
|
+
/** An item's session: its own `storageState` (`null`: none), else the target's. */
|
|
76
|
+
export declare function sessionOf(t: SuiteTarget, own: string | null | undefined): string | undefined;
|
|
77
|
+
/**
|
|
78
|
+
* Everything one goal/mission item runs with (#195): `explore`'s options, the target's defaults
|
|
79
|
+
* overridden by the item's own, resolved and validated at preflight exactly as `explore` does for
|
|
80
|
+
* its flags — the target config its safety/settle/timing flags build, its backend log sources,
|
|
81
|
+
* secret references resolved from the environment, actors, personas and fixtures.
|
|
82
|
+
*/
|
|
83
|
+
interface ItemSetup {
|
|
84
|
+
readonly x: SuiteExploreOptions;
|
|
85
|
+
readonly storageState?: string;
|
|
86
|
+
readonly secretFields: readonly SecretField[];
|
|
87
|
+
readonly secrets?: readonly string[];
|
|
88
|
+
readonly config?: TargetConfig;
|
|
89
|
+
readonly serverLog?: ServerLogOptions;
|
|
90
|
+
readonly actors?: MissionActors;
|
|
91
|
+
readonly personas?: readonly Persona[];
|
|
92
|
+
readonly fixtures?: FixtureSource;
|
|
93
|
+
readonly coverageThresholds?: CoverageThresholds;
|
|
94
|
+
}
|
|
95
|
+
export interface Planned {
|
|
96
|
+
readonly t: PreparedTarget;
|
|
97
|
+
readonly kind: ItemKind;
|
|
98
|
+
readonly name: string;
|
|
99
|
+
readonly strategy?: string;
|
|
100
|
+
readonly needsAi: boolean;
|
|
101
|
+
readonly skipped?: string;
|
|
102
|
+
readonly journey?: SuiteJourney;
|
|
103
|
+
readonly goal?: SuiteGoal;
|
|
104
|
+
readonly mission?: SuiteMission;
|
|
105
|
+
readonly verify?: SuiteVerifyFix;
|
|
106
|
+
/** Goal and mission items: what they run with (#195). */
|
|
107
|
+
readonly setup?: ItemSetup;
|
|
108
|
+
/** A persona matrix cell: the persona this item runs as (#143/#195). */
|
|
109
|
+
readonly persona?: Persona;
|
|
110
|
+
}
|
|
111
|
+
export declare function prepareTarget(t: SuiteTarget, opts: RunCheckOptions): Promise<PreparedTarget>;
|
|
112
|
+
export declare function plan(prepared: readonly PreparedTarget[], changed: readonly string[] | undefined, opts: RunCheckOptions): Planned[];
|
|
113
|
+
export {};
|
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
// check-plan.ts — `jevitate check` planning: targets, per-item setup, fixtures, sessions (#231).
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { FsJourneyStore, JourneyRegistry } from "@jevitate/journey";
|
|
4
|
+
import { assertAuthorizedExploreTarget, matchGlob, parseSecretField, resolveCoverageThresholds, secretFieldSecrets, SecretFieldSpecError } from "@jevitate/explore";
|
|
5
|
+
import { buildMissionFixtures, checkSetupRefs } from "./fixture-cli.js";
|
|
6
|
+
import { parseLogSourceSpecs } from "./log-sources.js";
|
|
7
|
+
import { parseLogDefectSpecs, parseLogIgnoreSpecs } from "./log-correlation.js";
|
|
8
|
+
import { checkActorsAgainstSpec, resolveMissionActors } from "./mission-actors.js";
|
|
9
|
+
import { loadPersonasFile, parsePersonaSpec } from "./multi-run.js";
|
|
10
|
+
import { assertHeadedDisplay } from "./browser-run-options.js";
|
|
11
|
+
import { effectiveExploreOptions } from "./suite-explore-options.js";
|
|
12
|
+
import { FixtureSpecError, SETUP_REF, UnboundSetupRefError } from "./mission-fixtures.js";
|
|
13
|
+
import { parseSuccessSpec, resolveExploreAllowlist } from "./explore-api.js";
|
|
14
|
+
import { findFinding, parsePersistedMission } from "./verify-fix-api.js";
|
|
15
|
+
import { loadInvariantFiles, resolveInvariantAuthTokens } from "./invariants-file.js";
|
|
16
|
+
import { serverLogFromTargetConfig } from "./mission-queue-runner.js";
|
|
17
|
+
import { resolveTargetConfig } from "./target-config.js";
|
|
18
|
+
import { applyJourneyEnvironment, isEnvironmentError, resolveJourneyEnvironment } from "./environments.js";
|
|
19
|
+
import { CheckPreflightError } from "./check-types.js";
|
|
20
|
+
import { parseScreenshotsArg } from "./run-screenshots.js";
|
|
21
|
+
// ── changed routes ───────────────────────────────────────────────────────────
|
|
22
|
+
/** Concrete paths standing for a route or route glob (`/cart/**` → `/cart`, `/cart/x`). */
|
|
23
|
+
function representatives(route) {
|
|
24
|
+
if (!route.includes("*"))
|
|
25
|
+
return [route];
|
|
26
|
+
const concrete = route.replace(/\*\*/g, "x").replace(/\*/g, "x");
|
|
27
|
+
const base = route.split("/*")[0] ?? "";
|
|
28
|
+
return [concrete, base === "" ? "/" : base];
|
|
29
|
+
}
|
|
30
|
+
/** Does an item covering `routes` touch any changed route glob? No known routes ⇒ it runs. */
|
|
31
|
+
export function affectedBy(routes, changed) {
|
|
32
|
+
if (routes === undefined || routes.length === 0)
|
|
33
|
+
return true;
|
|
34
|
+
return routes.some((r) => changed.some((g) => representatives(r).some((p) => matchGlob(g, p)) || representatives(g).some((p) => matchGlob(r, p))));
|
|
35
|
+
}
|
|
36
|
+
function pathOf(url, base) {
|
|
37
|
+
try {
|
|
38
|
+
return new URL(url, base).pathname;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return url;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** The page routes a Journey visits (from its Recording). */
|
|
45
|
+
function journeyRoutes(j) {
|
|
46
|
+
return [...new Set(j.recording.pages.map((p) => pathOf(p.url, j.recording.site)))];
|
|
47
|
+
}
|
|
48
|
+
export function isRecord(v) {
|
|
49
|
+
return v !== null && typeof v === "object" && !Array.isArray(v);
|
|
50
|
+
}
|
|
51
|
+
export function errorMessage(e) {
|
|
52
|
+
return e instanceof Error ? e.message : String(e);
|
|
53
|
+
}
|
|
54
|
+
/** Executed actions in a persisted result: its `actions`, else its transcript's acted steps. */
|
|
55
|
+
export function actionsOf(result) {
|
|
56
|
+
if (typeof result.actions === "number")
|
|
57
|
+
return result.actions;
|
|
58
|
+
let transcript = result.transcript;
|
|
59
|
+
if (!Array.isArray(transcript) && typeof result.transcriptPath === "string" && existsSync(result.transcriptPath)) {
|
|
60
|
+
try {
|
|
61
|
+
transcript = JSON.parse(readFileSync(result.transcriptPath, "utf8"));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
transcript = [];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return Array.isArray(transcript) ? transcript.filter((e) => isRecord(e) && e.op !== null && e.op !== undefined).length : 0;
|
|
68
|
+
}
|
|
69
|
+
/** Adds the check's stamp (engine, target build, suite item, ai mode) to a result the runner already wrote. */
|
|
70
|
+
export function stampResultFile(path, stamp) {
|
|
71
|
+
const raw = JSON.parse(readFileSync(path, "utf8"));
|
|
72
|
+
if (!isRecord(raw))
|
|
73
|
+
return;
|
|
74
|
+
if (isRecord(raw.result)) {
|
|
75
|
+
raw.result = {
|
|
76
|
+
...raw.result,
|
|
77
|
+
engine: raw.result.engine ?? stamp.engine,
|
|
78
|
+
suite: stamp.suite,
|
|
79
|
+
...(stamp.targetBuild === undefined ? {} : { targetBuild: stamp.targetBuild }),
|
|
80
|
+
...(stamp.aiMode === undefined ? {} : { aiMode: stamp.aiMode }),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
raw.stamp = { engine: stamp.engine, target: stamp.suite.target, item: stamp.suite.item, ...(stamp.targetBuild === undefined ? {} : { targetBuild: stamp.targetBuild }) };
|
|
85
|
+
}
|
|
86
|
+
writeFileSync(path, `${JSON.stringify(raw, null, 2)}\n`, "utf8");
|
|
87
|
+
}
|
|
88
|
+
/** The flat step index → the page URL that step ran on (for a failed Journey step's route). */
|
|
89
|
+
export function journeyStepUrl(j, at) {
|
|
90
|
+
if (at === undefined)
|
|
91
|
+
return undefined;
|
|
92
|
+
let i = 0;
|
|
93
|
+
for (const page of j.recording.pages) {
|
|
94
|
+
if (at < i + page.steps.length) {
|
|
95
|
+
try {
|
|
96
|
+
return new URL(page.url, j.recording.site).toString();
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
i += page.steps.length;
|
|
103
|
+
}
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
export function recordingSteps(j) {
|
|
107
|
+
return j.recording.pages.reduce((n, p) => n + p.steps.length, 0);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* An item's fixture lifecycle (#170/#195), authenticated like the item's session: its storage
|
|
111
|
+
* state and `secretFields`. `undefined` when it declares no fixtures file and no hooks.
|
|
112
|
+
*/
|
|
113
|
+
export function fixturesFor(f, baseUrl) {
|
|
114
|
+
return buildMissionFixtures(f.flags, {
|
|
115
|
+
allowlist: f.allowlist,
|
|
116
|
+
baseUrl: baseUrl.replace(SETUP_REF, "0"),
|
|
117
|
+
...(f.storageState === undefined ? {} : { storageState: f.storageState }),
|
|
118
|
+
secretFields: f.secretFields,
|
|
119
|
+
secrets: secretFieldSecrets(f.secretFields),
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/** The target's own fixtures (around Journey items), with `storageState` the item's session. */
|
|
123
|
+
export function targetFixtures(p, storageState) {
|
|
124
|
+
return {
|
|
125
|
+
allowlist: p.allowlist,
|
|
126
|
+
flags: p.fixturesFile === undefined ? {} : { fixtures: p.fixturesFile },
|
|
127
|
+
...(storageState === undefined ? {} : { storageState }),
|
|
128
|
+
secretFields: p.secretFields,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/** An item's session: its own `storageState` (`null`: none), else the target's. */
|
|
132
|
+
export function sessionOf(t, own) {
|
|
133
|
+
return own === null ? undefined : (own ?? t.storageState);
|
|
134
|
+
}
|
|
135
|
+
const TARGET_FLAG_KEYS = [
|
|
136
|
+
"deny", "paid", "allowDestructive", "allowWrites", "allowWrite", "readRpc", "hangReplayWrites", "settleIgnore", "longPollMs", "apiPrefix", "ignoreNoProgress",
|
|
137
|
+
];
|
|
138
|
+
function envSecret(ref, env) {
|
|
139
|
+
const name = ref.slice("env:".length);
|
|
140
|
+
const v = env[name];
|
|
141
|
+
if (v === undefined || v === "")
|
|
142
|
+
throw new Error(`secret ${ref}: environment variable ${name} is not set`);
|
|
143
|
+
return v;
|
|
144
|
+
}
|
|
145
|
+
function itemSetup(p, item, kind, opts,
|
|
146
|
+
/** A goal's start URL and the texts that may reference `${setup.x}`. */
|
|
147
|
+
refs) {
|
|
148
|
+
const t = p.target;
|
|
149
|
+
const env = opts.env ?? process.env;
|
|
150
|
+
const x = effectiveExploreOptions(t.explore, item.explore, kind);
|
|
151
|
+
// #245: a headed item without a display is refused here, before anything runs (use recordVideo).
|
|
152
|
+
assertHeadedDisplay(x.headed === true, env);
|
|
153
|
+
// #251: an unusable `screenshots` value is refused at preflight, before anything runs.
|
|
154
|
+
parseScreenshotsArg(x.screenshots, "screenshots");
|
|
155
|
+
let storageState = sessionOf(t, item.storageState);
|
|
156
|
+
if (item.storageState !== undefined && item.storageState !== null && !existsSync(item.storageState)) {
|
|
157
|
+
throw new Error(`storage state not found: ${item.storageState}`);
|
|
158
|
+
}
|
|
159
|
+
const secretFields = [
|
|
160
|
+
...(item.secretFields === undefined ? p.secretFields : item.secretFields.map((s) => parseSecretField(s, "value", env))),
|
|
161
|
+
...(x.totp ?? []).map((s) => parseSecretField(s, "totp", env)),
|
|
162
|
+
];
|
|
163
|
+
const secrets = x.secret?.map((r) => envSecret(r, env));
|
|
164
|
+
if (x.fixture !== undefined && !existsSync(x.fixture))
|
|
165
|
+
throw new Error(`fixture (upload file) not found: ${x.fixture}`);
|
|
166
|
+
let config = p.config;
|
|
167
|
+
if (TARGET_FLAG_KEYS.some((k) => x[k] !== undefined)) {
|
|
168
|
+
config = resolveTargetConfig(opts.targetsConfig ?? {}, new URL(t.url).origin, {
|
|
169
|
+
...(x.settleIgnore === undefined ? {} : { settleIgnore: x.settleIgnore }),
|
|
170
|
+
...(x.ignoreNoProgress === undefined ? {} : { ignoreNoProgress: x.ignoreNoProgress }),
|
|
171
|
+
...(x.apiPrefix === undefined ? {} : { apiPrefixes: x.apiPrefix }),
|
|
172
|
+
...(x.deny === undefined ? {} : { deny: x.deny }),
|
|
173
|
+
...(x.paid === undefined ? {} : { paid: x.paid }),
|
|
174
|
+
...(x.readRpc === undefined ? {} : { readRpc: x.readRpc }),
|
|
175
|
+
...(x.allowDestructive === true ? { allowDestructive: true } : {}),
|
|
176
|
+
...(x.allowWrites === true ? { allowWrites: true } : {}),
|
|
177
|
+
...(x.allowWrite === undefined ? {} : { allowWrite: x.allowWrite }),
|
|
178
|
+
...(x.hangReplayWrites === true ? { hangReplayWrites: true } : {}),
|
|
179
|
+
...(x.longPollMs === undefined ? {} : { longPollMs: x.longPollMs }),
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
// #142: an item's (or its target's) log sources replace targets.json's, as `--log-source` does.
|
|
183
|
+
let serverLog = p.serverLog;
|
|
184
|
+
if (x.logSource !== undefined || x.logDefect !== undefined) {
|
|
185
|
+
const allowLogCmd = x.allowLogCmd ?? false;
|
|
186
|
+
serverLog = {
|
|
187
|
+
sources: parseLogSourceSpecs(x.logSource ?? [], allowLogCmd),
|
|
188
|
+
logDefect: parseLogDefectSpecs(x.logDefect ?? []),
|
|
189
|
+
allowLogCmd,
|
|
190
|
+
quietOk: x.logQuietOk ?? [],
|
|
191
|
+
logIgnore: parseLogIgnoreSpecs(x.logIgnore ?? []),
|
|
192
|
+
...(x.serverLogDrainMs === undefined ? {} : { drainMs: x.serverLogDrainMs }),
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
const actors = x.actor === undefined ? null : resolveMissionActors(x.actor);
|
|
196
|
+
if (actors !== null) {
|
|
197
|
+
checkActorsAgainstSpec(actors, p.invariants);
|
|
198
|
+
storageState = actors.primary.storageState;
|
|
199
|
+
}
|
|
200
|
+
const personas = [...(x.persona ?? []).map((s) => parsePersonaSpec(s)), ...(x.personas === undefined ? [] : loadPersonasFile(x.personas))];
|
|
201
|
+
const seen = new Set();
|
|
202
|
+
for (const q of personas) {
|
|
203
|
+
if (seen.has(q.name))
|
|
204
|
+
throw new Error(`persona ${q.name} is declared twice`);
|
|
205
|
+
seen.add(q.name);
|
|
206
|
+
}
|
|
207
|
+
let fixtures;
|
|
208
|
+
if (kind === "goal") {
|
|
209
|
+
const flags = {
|
|
210
|
+
...((item.fixtures ?? p.fixturesFile) === undefined ? {} : { fixtures: item.fixtures ?? p.fixturesFile }),
|
|
211
|
+
...(x.before === undefined ? {} : { before: x.before }),
|
|
212
|
+
...(x.after === undefined ? {} : { after: x.after }),
|
|
213
|
+
...(x.allowShellHooks === undefined ? {} : { allowShellHooks: x.allowShellHooks }),
|
|
214
|
+
...(x.hookTimeoutMs === undefined ? {} : { hookTimeoutMs: String(x.hookTimeoutMs) }),
|
|
215
|
+
};
|
|
216
|
+
fixtures = { allowlist: p.allowlist, flags, ...(storageState === undefined ? {} : { storageState }), secretFields };
|
|
217
|
+
// Validated now (the spec, and every ${setup.x} the goal uses), before anything runs.
|
|
218
|
+
checkSetupRefs(refs?.texts ?? {}, fixturesFor(fixtures, refs?.url ?? t.url));
|
|
219
|
+
}
|
|
220
|
+
const coverageThresholds = kind === "adversarial" && (x.minControlCoverage !== undefined || x.requireFormSubmit !== undefined)
|
|
221
|
+
? resolveCoverageThresholds({
|
|
222
|
+
...(x.minControlCoverage === undefined ? {} : { minControlRatio: x.minControlCoverage }),
|
|
223
|
+
...(x.requireFormSubmit === undefined ? {} : { requireFormSubmit: x.requireFormSubmit }),
|
|
224
|
+
})
|
|
225
|
+
: undefined;
|
|
226
|
+
return {
|
|
227
|
+
x,
|
|
228
|
+
...(storageState === undefined ? {} : { storageState }),
|
|
229
|
+
secretFields,
|
|
230
|
+
...(secrets === undefined ? {} : { secrets }),
|
|
231
|
+
...(config === undefined ? {} : { config }),
|
|
232
|
+
...(serverLog === undefined ? {} : { serverLog }),
|
|
233
|
+
...(actors === null ? {} : { actors }),
|
|
234
|
+
...(personas.length === 0 ? {} : { personas }),
|
|
235
|
+
...(fixtures === undefined ? {} : { fixtures }),
|
|
236
|
+
...(coverageThresholds === undefined ? {} : { coverageThresholds }),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
/** The implicit invariant sweep: a target with invariants but no goal or mission gets one. */
|
|
240
|
+
function invariantSweep() {
|
|
241
|
+
return { name: "invariants", strategy: "feature", feature: "invariants" };
|
|
242
|
+
}
|
|
243
|
+
export async function prepareTarget(t, opts) {
|
|
244
|
+
const allowlist = resolveExploreAllowlist(t.url, t.allow);
|
|
245
|
+
// #147/#195: every observer a goal item (or the target's default) declares may be named by the invariants.
|
|
246
|
+
const observers = new Set([t.explore?.actor, ...t.goals.map((g) => g.explore?.actor)].flatMap((a) => (a ?? []).slice(1).map((spec) => spec.slice(0, spec.indexOf("=")))));
|
|
247
|
+
let invariants;
|
|
248
|
+
try {
|
|
249
|
+
invariants = loadInvariantFiles(t.invariants, { allowlist, baseUrl: t.url, ...(observers.size === 0 ? {} : { observers: [...observers] }) });
|
|
250
|
+
}
|
|
251
|
+
catch (e) {
|
|
252
|
+
throw new CheckPreflightError(`target ${t.name}: ${errorMessage(e)}`);
|
|
253
|
+
}
|
|
254
|
+
if (t.storageState !== undefined && !existsSync(t.storageState)) {
|
|
255
|
+
throw new CheckPreflightError(`target ${t.name}: storage state not found: ${t.storageState}`);
|
|
256
|
+
}
|
|
257
|
+
const goals = new Map();
|
|
258
|
+
for (const g of t.goals) {
|
|
259
|
+
try {
|
|
260
|
+
goals.set(g.name, g.success.map(parseSuccessSpec));
|
|
261
|
+
}
|
|
262
|
+
catch (e) {
|
|
263
|
+
throw new CheckPreflightError(`target ${t.name}: goal ${g.name}: ${errorMessage(e)}`);
|
|
264
|
+
}
|
|
265
|
+
// #218: the URL the goal actually starts at (its own, else the target's) — an `allow` list
|
|
266
|
+
// REPLACES the target URL's own origin, so the target URL itself may be off it.
|
|
267
|
+
const goalUrl = g.url ?? t.url;
|
|
268
|
+
if (!allowlist.includes(new URL(goalUrl).origin)) {
|
|
269
|
+
throw new CheckPreflightError(`target ${t.name}: goal ${g.name}: ${goalUrl} is not on the target's allowlist`);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
const sweep = t.missions.length === 0 && t.goals.length === 0 && invariants !== undefined ? [invariantSweep()] : [];
|
|
273
|
+
for (const m of [...t.missions, ...sweep]) {
|
|
274
|
+
const missionUrl = m.url ?? t.url;
|
|
275
|
+
if (!allowlist.includes(new URL(missionUrl).origin)) {
|
|
276
|
+
throw new CheckPreflightError(`target ${t.name}: mission ${m.name}: ${missionUrl} is not on the target's allowlist`);
|
|
277
|
+
}
|
|
278
|
+
// #225: a usability mission's success checks are refused up front when unparseable, like a goal's.
|
|
279
|
+
try {
|
|
280
|
+
for (const spec of m.success ?? [])
|
|
281
|
+
parseSuccessSpec(spec);
|
|
282
|
+
}
|
|
283
|
+
catch (e) {
|
|
284
|
+
throw new CheckPreflightError(`target ${t.name}: mission ${m.name}: ${errorMessage(e)}`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
for (const v of t.verifyFix) {
|
|
288
|
+
if (!existsSync(v.result))
|
|
289
|
+
throw new CheckPreflightError(`target ${t.name}: verify-fix ${v.name}: result not found: ${v.result}`);
|
|
290
|
+
// #218: the same lookup `verify-fix` does, up front — a fingerprint the result does not hold
|
|
291
|
+
// (or a result it cannot use) is a suite error, refused before anything runs, never an ERROR item.
|
|
292
|
+
try {
|
|
293
|
+
const mission = parsePersistedMission(JSON.parse(readFileSync(v.result, "utf8")));
|
|
294
|
+
if (findFinding(mission, v.fingerprint) === undefined)
|
|
295
|
+
throw new Error(`no finding with fingerprint ${v.fingerprint} in ${v.result}`);
|
|
296
|
+
assertAuthorizedExploreTarget(mission.target.seedUrl, mission.target.allowlist);
|
|
297
|
+
}
|
|
298
|
+
catch (e) {
|
|
299
|
+
throw new CheckPreflightError(`target ${t.name}: verify-fix ${v.name}: ${errorMessage(e)}`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
const journeys = new Map();
|
|
303
|
+
const environments = new Map();
|
|
304
|
+
if (t.journeys.length > 0) {
|
|
305
|
+
const registry = new JourneyRegistry(new FsJourneyStore(t.journeysDir ?? opts.journeysDir));
|
|
306
|
+
for (const sj of t.journeys) {
|
|
307
|
+
const j = await registry.get(sj.id);
|
|
308
|
+
if (j === null || j === undefined)
|
|
309
|
+
throw new CheckPreflightError(`target ${t.name}: unknown Journey ${JSON.stringify(sj.id)}`);
|
|
310
|
+
if (!j.metadata.promoted)
|
|
311
|
+
throw new CheckPreflightError(`target ${t.name}: Journey ${sj.id} is not promoted`);
|
|
312
|
+
// #247: an item's `env`/`baseUrl` — resolved and the Journey rebased onto it now, so an unknown
|
|
313
|
+
// environment or a step on an origin it does not allow refuses the suite before anything runs.
|
|
314
|
+
let env;
|
|
315
|
+
try {
|
|
316
|
+
env = resolveJourneyEnvironment({
|
|
317
|
+
...(sj.env === undefined ? {} : { env: sj.env }),
|
|
318
|
+
...(sj.baseUrl === undefined ? {} : { baseUrl: sj.baseUrl }),
|
|
319
|
+
...(opts.environmentsFile === undefined ? {} : { environmentsFile: opts.environmentsFile }),
|
|
320
|
+
targets: opts.targetsConfig ?? {},
|
|
321
|
+
});
|
|
322
|
+
applyJourneyEnvironment(j, env);
|
|
323
|
+
}
|
|
324
|
+
catch (e) {
|
|
325
|
+
if (!isEnvironmentError(e))
|
|
326
|
+
throw e;
|
|
327
|
+
throw new CheckPreflightError(`target ${t.name}: Journey ${sj.id}: ${e.message}`);
|
|
328
|
+
}
|
|
329
|
+
if (env !== undefined)
|
|
330
|
+
environments.set(sj, env);
|
|
331
|
+
let origin;
|
|
332
|
+
try {
|
|
333
|
+
origin = new URL(env?.baseUrl ?? j.recording.site).origin;
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
throw new CheckPreflightError(`target ${t.name}: Journey ${sj.id} has no site origin (${JSON.stringify(j.recording.site)})`);
|
|
337
|
+
}
|
|
338
|
+
if (!allowlist.includes(origin)) {
|
|
339
|
+
throw new CheckPreflightError(`target ${t.name}: Journey ${sj.id} runs on ${origin}, which is not on the target's allowlist`);
|
|
340
|
+
}
|
|
341
|
+
journeys.set(sj.id, j);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
let config;
|
|
345
|
+
try {
|
|
346
|
+
config = resolveTargetConfig(opts.targetsConfig ?? {}, new URL(t.url).origin);
|
|
347
|
+
}
|
|
348
|
+
catch (e) {
|
|
349
|
+
throw new CheckPreflightError(`target ${t.name}: ${errorMessage(e)}`);
|
|
350
|
+
}
|
|
351
|
+
// #170: secret fields are read from the environment now (an unset variable is a preflight
|
|
352
|
+
// refusal naming it, never its value); the fixtures spec and every ${setup.x} a goal uses are
|
|
353
|
+
// validated before anything runs.
|
|
354
|
+
let secretFields;
|
|
355
|
+
try {
|
|
356
|
+
secretFields = (t.secretFields ?? []).map((s) => parseSecretField(s, "value", opts.env ?? process.env));
|
|
357
|
+
}
|
|
358
|
+
catch (e) {
|
|
359
|
+
if (!(e instanceof SecretFieldSpecError))
|
|
360
|
+
throw e;
|
|
361
|
+
throw new CheckPreflightError(`target ${t.name}: ${e.message}`);
|
|
362
|
+
}
|
|
363
|
+
let invariantAuthTokens;
|
|
364
|
+
let serverLog;
|
|
365
|
+
try {
|
|
366
|
+
invariantAuthTokens = invariants === undefined ? undefined : resolveInvariantAuthTokens(invariants, opts.env ?? process.env);
|
|
367
|
+
serverLog = serverLogFromTargetConfig(opts.targetsConfig, t.url);
|
|
368
|
+
}
|
|
369
|
+
catch (e) {
|
|
370
|
+
throw new CheckPreflightError(`target ${t.name}: ${errorMessage(e)}`);
|
|
371
|
+
}
|
|
372
|
+
const fixturesFile = t.fixtures ?? config?.fixtures;
|
|
373
|
+
if (fixturesFile !== undefined) {
|
|
374
|
+
// The target's own spec (around Journeys; goals validate theirs in their item setup).
|
|
375
|
+
try {
|
|
376
|
+
fixturesFor({ allowlist, flags: { fixtures: fixturesFile }, secretFields, ...(t.storageState === undefined ? {} : { storageState: t.storageState }) }, t.url);
|
|
377
|
+
}
|
|
378
|
+
catch (e) {
|
|
379
|
+
if (!(e instanceof FixtureSpecError || e instanceof UnboundSetupRefError))
|
|
380
|
+
throw e;
|
|
381
|
+
throw new CheckPreflightError(`target ${t.name}: fixtures: ${e.message}`);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return {
|
|
385
|
+
target: t,
|
|
386
|
+
allowlist,
|
|
387
|
+
journeys,
|
|
388
|
+
...(environments.size === 0 ? {} : { environments }),
|
|
389
|
+
goals,
|
|
390
|
+
...(invariants === undefined ? {} : { invariants }),
|
|
391
|
+
...(invariantAuthTokens === undefined || invariantAuthTokens.size === 0 ? {} : { invariantAuthTokens }),
|
|
392
|
+
...(serverLog === undefined ? {} : { serverLog }),
|
|
393
|
+
config,
|
|
394
|
+
secretFields,
|
|
395
|
+
...(fixturesFile === undefined ? {} : { fixturesFile }),
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
/** The item's setup, a refusal naming its path-precise location (#213: like every other suite refusal), before anything runs. */
|
|
399
|
+
function setupOrRefuse(label, run) {
|
|
400
|
+
try {
|
|
401
|
+
return run();
|
|
402
|
+
}
|
|
403
|
+
catch (e) {
|
|
404
|
+
const fixtures = e instanceof FixtureSpecError || e instanceof UnboundSetupRefError ? "fixtures: " : "";
|
|
405
|
+
throw new CheckPreflightError(`${label}: ${fixtures}${errorMessage(e)}`);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
/** One planned item per persona (each from its own session, gated on its own), else the item itself. */
|
|
409
|
+
function perPersona(item) {
|
|
410
|
+
const personas = item.setup?.personas;
|
|
411
|
+
if (personas === undefined || item.setup === undefined)
|
|
412
|
+
return [item];
|
|
413
|
+
const setup = item.setup;
|
|
414
|
+
return personas.map((q) => ({
|
|
415
|
+
...item,
|
|
416
|
+
name: `${item.name}@${q.name}`,
|
|
417
|
+
persona: q,
|
|
418
|
+
setup: { ...setup, storageState: q.storageState, ...(setup.fixtures === undefined ? {} : { fixtures: { ...setup.fixtures, storageState: q.storageState } }) },
|
|
419
|
+
}));
|
|
420
|
+
}
|
|
421
|
+
export function plan(prepared, changed, opts) {
|
|
422
|
+
const out = [];
|
|
423
|
+
const skip = (routes) => changed === undefined || changed.length === 0 || affectedBy(routes, changed) ? undefined : `not affected by --changed-routes ${changed.join(",")}`;
|
|
424
|
+
prepared.forEach((p, ti) => {
|
|
425
|
+
const t = p.target;
|
|
426
|
+
for (const sj of t.journeys) {
|
|
427
|
+
const j = p.journeys.get(sj.id);
|
|
428
|
+
const routes = sj.routes ?? (j === undefined ? undefined : journeyRoutes(j));
|
|
429
|
+
const s = skip(routes);
|
|
430
|
+
out.push({ t: p, kind: "journey", name: sj.id, journey: sj, needsAi: false, ...(s === undefined ? {} : { skipped: s }) });
|
|
431
|
+
}
|
|
432
|
+
t.goals.forEach((g, gi) => {
|
|
433
|
+
const s = skip(g.routes ?? [pathOf(g.url ?? t.url)]);
|
|
434
|
+
const texts = { [`goal ${g.name} url`]: g.url, [`goal ${g.name}`]: g.goal, [`goal ${g.name} success`]: g.success };
|
|
435
|
+
const setup = setupOrRefuse(`$.targets[${ti}].goals[${gi}]`, () => itemSetup(p, g, "goal", opts, { url: g.url ?? t.url, texts }));
|
|
436
|
+
out.push(...perPersona({ t: p, kind: "goal", name: g.name, goal: g, needsAi: true, setup, ...(s === undefined ? {} : { skipped: s }) }));
|
|
437
|
+
});
|
|
438
|
+
const missions = t.missions.length === 0 && t.goals.length === 0 && p.invariants !== undefined ? [invariantSweep()] : t.missions;
|
|
439
|
+
missions.forEach((m, mi) => {
|
|
440
|
+
const setup = setupOrRefuse(`$.targets[${ti}].missions[${mi}]`, () => itemSetup(p, m, m.strategy, opts));
|
|
441
|
+
out.push(...perPersona({ t: p, kind: "mission", name: m.name, strategy: m.strategy, mission: m, needsAi: m.strategy !== "feature", setup }));
|
|
442
|
+
});
|
|
443
|
+
for (const v of t.verifyFix)
|
|
444
|
+
out.push({ t: p, kind: "verify-fix", name: v.name, verify: v, needsAi: false });
|
|
445
|
+
});
|
|
446
|
+
return out;
|
|
447
|
+
}
|
|
448
|
+
//# sourceMappingURL=check-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-plan.js","sourceRoot":"","sources":["../src/check-plan.ts"],"names":[],"mappings":"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"}
|