@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,540 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, isAbsolute, resolve } from "node:path";
|
|
3
|
+
import { parseViewport, resolveEmulation } from "@jevitate/playwright";
|
|
4
|
+
import { validateDenyPatterns } from "@jevitate/explore";
|
|
5
|
+
import { SUITE_EXPLORE_OPTIONS, isSuiteExploreOption, } from "./suite-explore-options.js";
|
|
6
|
+
import { SessionFileInProjectError, assertSessionFileOutsideProject } from "./project-dir.js";
|
|
7
|
+
const STRATEGIES = ["coverage", "exploratory", "adversarial", "feature", "usability"];
|
|
8
|
+
export class SuiteError extends Error {
|
|
9
|
+
code = "E_CHECK_SUITE";
|
|
10
|
+
/** #213: each path-precise problem on its own (`$.targets[0].name: …`); the message joins them. */
|
|
11
|
+
problems;
|
|
12
|
+
constructor(message, problems = [message]) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = "SuiteError";
|
|
15
|
+
this.problems = problems;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function isRecord(v) {
|
|
19
|
+
return v !== null && typeof v === "object" && !Array.isArray(v);
|
|
20
|
+
}
|
|
21
|
+
class Reader {
|
|
22
|
+
source;
|
|
23
|
+
baseDir;
|
|
24
|
+
/** #213: every problem `collect` caught, so a suite reports ALL of them, not just the first. */
|
|
25
|
+
problems = [];
|
|
26
|
+
constructor(source, baseDir) {
|
|
27
|
+
this.source = source;
|
|
28
|
+
this.baseDir = baseDir;
|
|
29
|
+
}
|
|
30
|
+
fail(path, msg) {
|
|
31
|
+
throw new SuiteError(`${this.source}: ${path}: ${msg}`);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Runs `fn`; a `SuiteError` it throws is recorded (#213) and this returns `undefined` instead of
|
|
35
|
+
* aborting every OTHER independent problem in the suite (a sibling target, goal, mission, journey
|
|
36
|
+
* or verify-fix item, or a root-level field). Any other error still propagates.
|
|
37
|
+
*/
|
|
38
|
+
collect(fn) {
|
|
39
|
+
try {
|
|
40
|
+
return fn();
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
if (!(e instanceof SuiteError))
|
|
44
|
+
throw e;
|
|
45
|
+
this.problems.push(...e.problems);
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/** Refuses a field not in `own` (nor, with `explore`, one of `explore`'s options, #195). */
|
|
50
|
+
keys(obj, path, own, explore = false) {
|
|
51
|
+
for (const k of Object.keys(obj)) {
|
|
52
|
+
if (own.includes(k) || (explore && isSuiteExploreOption(k)))
|
|
53
|
+
continue;
|
|
54
|
+
const camel = k.replace(/^-+/, "").replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
55
|
+
if (explore && camel !== k && (isSuiteExploreOption(camel) || own.includes(camel)))
|
|
56
|
+
this.fail(`${path}.${k}`, `unknown field; did you mean ${JSON.stringify(camel)}?`);
|
|
57
|
+
this.fail(`${path}.${k}`, `unknown field (allowed: ${own.join(", ")}${explore ? "; and explore's options by camelCase name, e.g. deny, apiPrefix, logSource" : ""})`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
string(obj, key, path, optional) {
|
|
61
|
+
const v = obj[key];
|
|
62
|
+
if (v === undefined && optional === true)
|
|
63
|
+
return undefined;
|
|
64
|
+
if (typeof v !== "string" || v.trim() === "")
|
|
65
|
+
this.fail(`${path}.${key}`, "must be a non-empty string");
|
|
66
|
+
return v;
|
|
67
|
+
}
|
|
68
|
+
number(obj, key, path, opts = {}) {
|
|
69
|
+
const v = obj[key];
|
|
70
|
+
if (v === undefined)
|
|
71
|
+
return undefined;
|
|
72
|
+
if (typeof v !== "number" || !Number.isFinite(v) || v <= 0 || (opts.integer === true && !Number.isInteger(v))) {
|
|
73
|
+
this.fail(`${path}.${key}`, `must be a positive ${opts.integer === true ? "integer" : "number"}`);
|
|
74
|
+
}
|
|
75
|
+
return v;
|
|
76
|
+
}
|
|
77
|
+
strings(obj, key, path) {
|
|
78
|
+
const v = obj[key];
|
|
79
|
+
if (v === undefined)
|
|
80
|
+
return [];
|
|
81
|
+
if (!Array.isArray(v) || !v.every((s) => typeof s === "string" && s.trim() !== ""))
|
|
82
|
+
this.fail(`${path}.${key}`, "must be an array of non-empty strings");
|
|
83
|
+
return v;
|
|
84
|
+
}
|
|
85
|
+
list(obj, key, path) {
|
|
86
|
+
const v = obj[key];
|
|
87
|
+
if (v === undefined)
|
|
88
|
+
return [];
|
|
89
|
+
if (!Array.isArray(v))
|
|
90
|
+
this.fail(`${path}.${key}`, "must be an array");
|
|
91
|
+
return v;
|
|
92
|
+
}
|
|
93
|
+
/** `viewport: "WxH"` or `device: "<Playwright device>"` (never both), validated now. */
|
|
94
|
+
emulation(obj, path) {
|
|
95
|
+
const viewport = this.string(obj, "viewport", path, true);
|
|
96
|
+
const device = this.string(obj, "device", path, true);
|
|
97
|
+
if (viewport === undefined && device === undefined)
|
|
98
|
+
return undefined;
|
|
99
|
+
let spec;
|
|
100
|
+
try {
|
|
101
|
+
spec = { ...(viewport === undefined ? {} : { viewport: parseViewport(viewport) }), ...(device === undefined ? {} : { device }) };
|
|
102
|
+
resolveEmulation(spec);
|
|
103
|
+
}
|
|
104
|
+
catch (e) {
|
|
105
|
+
return this.fail(path, e instanceof Error ? e.message : String(e));
|
|
106
|
+
}
|
|
107
|
+
return spec;
|
|
108
|
+
}
|
|
109
|
+
resolvePath(p) {
|
|
110
|
+
return isAbsolute(p) ? p : resolve(this.baseDir, p);
|
|
111
|
+
}
|
|
112
|
+
url(obj, key, path, optional) {
|
|
113
|
+
const v = optional === true ? this.string(obj, key, path, true) : this.string(obj, key, path);
|
|
114
|
+
if (v === undefined)
|
|
115
|
+
return undefined;
|
|
116
|
+
try {
|
|
117
|
+
new URL(v);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
this.fail(`${path}.${key}`, `not a URL: ${JSON.stringify(v)}`);
|
|
121
|
+
}
|
|
122
|
+
return v;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const emulationOf = (e) => (e === undefined ? {} : { emulation: e });
|
|
126
|
+
// ── explore options (#195) ───────────────────────────────────────────────────
|
|
127
|
+
const ENV_VAR = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
128
|
+
const NO_LITERAL = "a suite never carries a literal secret; the value is read from the environment when the check starts";
|
|
129
|
+
/**
|
|
130
|
+
* Each suite level's own field names; targets, goals and missions also take every generic explore
|
|
131
|
+
* option (`SUITE_EXPLORE_OPTIONS`).
|
|
132
|
+
*/
|
|
133
|
+
export const SUITE_FIELDS = {
|
|
134
|
+
target: ["name", "url", "allow", "storageState", "secretFields", "fixtures", "invariants", "journeysDir", "journeys", "goals", "missions", "verifyFix", "viewport", "device"],
|
|
135
|
+
journey: ["id", "params", "routes", "viewport", "device", "storageState", "env", "baseUrl"],
|
|
136
|
+
goal: ["name", "goal", "success", "url", "successWhen", "routes", "maxActions", "maxDecisions", "viewport", "device", "storageState", "secretFields", "fixtures"],
|
|
137
|
+
mission: ["name", "strategy", "url", "routes", "feature", "goal", "appClass", "success", "successWhen", "maxActions", "maxDecisions", "viewport", "device", "storageState", "secretFields", "fromJourney", "atStep", "params", "env", "baseUrl"],
|
|
138
|
+
verifyFix: ["name", "result", "fingerprint", "replays", "storageState"],
|
|
139
|
+
};
|
|
140
|
+
function envBindings(r, obj, key, path) {
|
|
141
|
+
const list = r.strings(obj, key, path);
|
|
142
|
+
list.forEach((b, i) => {
|
|
143
|
+
const at = b.lastIndexOf("=env:");
|
|
144
|
+
const head = at === -1 ? "" : b.slice(0, at);
|
|
145
|
+
// The entry is never echoed: a value pasted in place of env:<VAR> must not reach a log.
|
|
146
|
+
if (at === -1 || !ENV_VAR.test(b.slice(at + 5)) || head.indexOf("=") <= 0 || head.endsWith("=")) {
|
|
147
|
+
r.fail(`${path}.${key}[${i}]`, `must be '<label|testId|type|id|name>=<value>=env:<VAR>'; ${NO_LITERAL}`);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
return list;
|
|
151
|
+
}
|
|
152
|
+
function readOption(r, obj, key, path) {
|
|
153
|
+
const spec = SUITE_EXPLORE_OPTIONS[key];
|
|
154
|
+
const at = `${path}.${key}`;
|
|
155
|
+
const v = obj[key];
|
|
156
|
+
switch (spec.shape) {
|
|
157
|
+
case "string": {
|
|
158
|
+
const s = r.string(obj, key, path);
|
|
159
|
+
if (spec.oneOf !== undefined && !spec.oneOf.includes(s))
|
|
160
|
+
r.fail(at, `must be ${spec.oneOf.map((o) => JSON.stringify(o)).join(" | ")}`);
|
|
161
|
+
return s;
|
|
162
|
+
}
|
|
163
|
+
case "path": {
|
|
164
|
+
const file = r.resolvePath(r.string(obj, key, path));
|
|
165
|
+
if (key === "saveStorageState") {
|
|
166
|
+
try {
|
|
167
|
+
assertSessionFileOutsideProject(file, "saveStorageState");
|
|
168
|
+
}
|
|
169
|
+
catch (e) {
|
|
170
|
+
if (!(e instanceof SessionFileInProjectError))
|
|
171
|
+
throw e;
|
|
172
|
+
r.fail(at, e.message);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return file;
|
|
176
|
+
}
|
|
177
|
+
case "boolean":
|
|
178
|
+
if (typeof v !== "boolean")
|
|
179
|
+
r.fail(at, "must be a boolean");
|
|
180
|
+
return v;
|
|
181
|
+
case "positive":
|
|
182
|
+
return r.number(obj, key, path);
|
|
183
|
+
case "integer": {
|
|
184
|
+
const n = r.number(obj, key, path, { integer: true });
|
|
185
|
+
if (spec.range !== undefined && (n < spec.range[0] || n > spec.range[1]))
|
|
186
|
+
r.fail(at, `must be an integer in ${spec.range[0]}..${spec.range[1]}`);
|
|
187
|
+
return n;
|
|
188
|
+
}
|
|
189
|
+
case "count":
|
|
190
|
+
if (typeof v !== "number" || !Number.isInteger(v) || v < 0)
|
|
191
|
+
r.fail(at, "must be a non-negative integer");
|
|
192
|
+
return v;
|
|
193
|
+
case "ratio":
|
|
194
|
+
if (typeof v !== "number" || !Number.isFinite(v) || v < 0 || v > 1)
|
|
195
|
+
r.fail(at, "must be a number in 0..1");
|
|
196
|
+
return v;
|
|
197
|
+
case "strings": {
|
|
198
|
+
const list = r.strings(obj, key, path);
|
|
199
|
+
if (key === "deny" || key === "paid") {
|
|
200
|
+
try {
|
|
201
|
+
validateDenyPatterns(list, key);
|
|
202
|
+
}
|
|
203
|
+
catch (e) {
|
|
204
|
+
r.fail(at, e instanceof Error ? e.message : String(e));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return list;
|
|
208
|
+
}
|
|
209
|
+
case "named-paths":
|
|
210
|
+
return r.strings(obj, key, path).map((e, i) => {
|
|
211
|
+
const eq = e.indexOf("=");
|
|
212
|
+
if (eq <= 0 || eq === e.length - 1)
|
|
213
|
+
r.fail(`${at}[${i}]`, "must be '<name>=<storageState path>'");
|
|
214
|
+
return `${e.slice(0, eq)}=${r.resolvePath(e.slice(eq + 1))}`;
|
|
215
|
+
});
|
|
216
|
+
case "env-refs":
|
|
217
|
+
return r.strings(obj, key, path).map((e, i) => {
|
|
218
|
+
if (!e.startsWith("env:") || !ENV_VAR.test(e.slice(4)))
|
|
219
|
+
r.fail(`${at}[${i}]`, `must be an env:<VAR> reference; ${NO_LITERAL}`);
|
|
220
|
+
return e;
|
|
221
|
+
});
|
|
222
|
+
case "env-bindings":
|
|
223
|
+
return envBindings(r, obj, key, path);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* The generic explore options set in `obj`. For an item (`kind` given) an option that does not
|
|
228
|
+
* apply to it is refused, as `explore` refuses the flag; a target's are defaults for any kind.
|
|
229
|
+
*/
|
|
230
|
+
function exploreOptionsOf(r, obj, path, kind) {
|
|
231
|
+
const out = {};
|
|
232
|
+
for (const key of Object.keys(obj)) {
|
|
233
|
+
if (!isSuiteExploreOption(key))
|
|
234
|
+
continue;
|
|
235
|
+
const applies = SUITE_EXPLORE_OPTIONS[key].appliesTo;
|
|
236
|
+
if (kind !== undefined && !applies.includes(kind)) {
|
|
237
|
+
r.fail(`${path}.${key}`, `does not apply to a ${kind === "goal" ? "goal" : `${kind} mission`} item (applies to: ${applies.join(", ")})`);
|
|
238
|
+
}
|
|
239
|
+
out[key] = readOption(r, obj, key, path);
|
|
240
|
+
}
|
|
241
|
+
const has = (k) => out[k] !== undefined;
|
|
242
|
+
if (kind !== undefined) {
|
|
243
|
+
if ((has("actor") || has("persona") || has("personas")) && obj.storageState !== undefined) {
|
|
244
|
+
r.fail(`${path}.storageState`, "cannot be combined with actor/persona/personas (each brings its own session)");
|
|
245
|
+
}
|
|
246
|
+
if (has("actor") && (has("persona") || has("personas")))
|
|
247
|
+
r.fail(`${path}.actor`, "cannot be combined with persona/personas");
|
|
248
|
+
if ((has("persona") || has("personas")) && has("saveStorageState")) {
|
|
249
|
+
r.fail(`${path}.saveStorageState`, "cannot be combined with persona/personas (one file cannot hold every persona)");
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return Object.keys(out).length === 0 ? undefined : out;
|
|
253
|
+
}
|
|
254
|
+
/** An item's `storageState`: a path (resolved), `null` (start without the target's session), or absent. */
|
|
255
|
+
function storageStateOf(r, obj, path) {
|
|
256
|
+
if (obj.storageState === null)
|
|
257
|
+
return { storageState: null };
|
|
258
|
+
const s = r.string(obj, "storageState", path, true);
|
|
259
|
+
return s === undefined ? {} : { storageState: r.resolvePath(s) };
|
|
260
|
+
}
|
|
261
|
+
/** The goal/mission overrides: own session, own secret fields, explore options. */
|
|
262
|
+
function overridesOf(r, obj, path, kind) {
|
|
263
|
+
const secretFields = envBindings(r, obj, "secretFields", path);
|
|
264
|
+
if (secretFields.length > 0 && kind !== "goal" && kind !== "usability")
|
|
265
|
+
r.fail(`${path}.secretFields`, "applies only to goal and usability items");
|
|
266
|
+
const explore = exploreOptionsOf(r, obj, path, kind);
|
|
267
|
+
return {
|
|
268
|
+
...storageStateOf(r, obj, path),
|
|
269
|
+
...(secretFields.length === 0 ? {} : { secretFields }),
|
|
270
|
+
...(explore === undefined ? {} : { explore }),
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
function journeyOf(r, v, path) {
|
|
274
|
+
if (typeof v === "string" && v.trim() !== "")
|
|
275
|
+
return { id: v, params: {} };
|
|
276
|
+
if (!isRecord(v))
|
|
277
|
+
return r.fail(path, "must be a Journey id or { id, params?, routes? }");
|
|
278
|
+
r.keys(v, path, SUITE_FIELDS.journey);
|
|
279
|
+
const params = v.params ?? {};
|
|
280
|
+
if (!isRecord(params) || !Object.values(params).every((p) => typeof p === "string"))
|
|
281
|
+
r.fail(`${path}.params`, "must be an object of string values");
|
|
282
|
+
const routes = r.strings(v, "routes", path);
|
|
283
|
+
const emulation = r.emulation(v, path);
|
|
284
|
+
const env = r.string(v, "env", path, true);
|
|
285
|
+
const baseUrl = r.url(v, "baseUrl", path, true);
|
|
286
|
+
return {
|
|
287
|
+
id: r.string(v, "id", path),
|
|
288
|
+
params: params,
|
|
289
|
+
...(routes.length === 0 ? {} : { routes }),
|
|
290
|
+
...(emulation === undefined ? {} : { emulation }),
|
|
291
|
+
...(env === undefined ? {} : { env }),
|
|
292
|
+
...(baseUrl === undefined ? {} : { baseUrl }),
|
|
293
|
+
...storageStateOf(r, v, path),
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
function goalOf(r, v, path, i) {
|
|
297
|
+
if (!isRecord(v))
|
|
298
|
+
return r.fail(path, "must be an object");
|
|
299
|
+
r.keys(v, path, SUITE_FIELDS.goal, true);
|
|
300
|
+
const success = r.strings(v, "success", path);
|
|
301
|
+
if (success.length === 0)
|
|
302
|
+
r.fail(`${path}.success`, "at least one success check is required (a goal without one proves nothing)");
|
|
303
|
+
const successWhen = v.successWhen;
|
|
304
|
+
if (successWhen !== undefined && successWhen !== "final" && successWhen !== "held")
|
|
305
|
+
r.fail(`${path}.successWhen`, 'must be "final" or "held"');
|
|
306
|
+
const routes = r.strings(v, "routes", path);
|
|
307
|
+
const url = r.url(v, "url", path, true);
|
|
308
|
+
const maxActions = r.number(v, "maxActions", path, { integer: true });
|
|
309
|
+
const maxDecisions = r.number(v, "maxDecisions", path, { integer: true });
|
|
310
|
+
const fixtures = r.string(v, "fixtures", path, true);
|
|
311
|
+
return {
|
|
312
|
+
...overridesOf(r, v, path, "goal"),
|
|
313
|
+
...(fixtures === undefined ? {} : { fixtures: r.resolvePath(fixtures) }),
|
|
314
|
+
name: r.string(v, "name", path, true) ?? `goal-${i + 1}`,
|
|
315
|
+
goal: r.string(v, "goal", path),
|
|
316
|
+
...emulationOf(r.emulation(v, path)),
|
|
317
|
+
success,
|
|
318
|
+
...(url === undefined ? {} : { url }),
|
|
319
|
+
...(successWhen === undefined ? {} : { successWhen }),
|
|
320
|
+
...(routes.length === 0 ? {} : { routes }),
|
|
321
|
+
...(maxActions === undefined ? {} : { maxActions }),
|
|
322
|
+
...(maxDecisions === undefined ? {} : { maxDecisions }),
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
function missionOf(r, v, path) {
|
|
326
|
+
if (!isRecord(v))
|
|
327
|
+
return r.fail(path, "must be an object");
|
|
328
|
+
r.keys(v, path, SUITE_FIELDS.mission, true);
|
|
329
|
+
const strategy = r.string(v, "strategy", path);
|
|
330
|
+
if (!STRATEGIES.includes(strategy))
|
|
331
|
+
r.fail(`${path}.strategy`, `must be one of ${STRATEGIES.join(" | ")}`);
|
|
332
|
+
const s = strategy;
|
|
333
|
+
const feature = r.string(v, "feature", path, true);
|
|
334
|
+
if (s === "feature" && feature === undefined)
|
|
335
|
+
r.fail(`${path}.feature`, "is required for strategy feature");
|
|
336
|
+
const goal = r.string(v, "goal", path, true);
|
|
337
|
+
const appClass = r.string(v, "appClass", path, true);
|
|
338
|
+
if (s === "usability" && (goal === undefined || appClass === undefined))
|
|
339
|
+
r.fail(path, "strategy usability requires goal and appClass");
|
|
340
|
+
// #225: success checks judge a usability job's completion; any other strategy has no job to check.
|
|
341
|
+
const success = r.strings(v, "success", path);
|
|
342
|
+
const successWhen = v.successWhen;
|
|
343
|
+
if ((success.length > 0 || successWhen !== undefined) && s !== "usability")
|
|
344
|
+
r.fail(`${path}.success`, "applies only to goal items and usability missions");
|
|
345
|
+
if (successWhen !== undefined && successWhen !== "final" && successWhen !== "held")
|
|
346
|
+
r.fail(`${path}.successWhen`, 'must be "final" or "held"');
|
|
347
|
+
if (successWhen !== undefined && success.length === 0)
|
|
348
|
+
r.fail(`${path}.successWhen`, "needs at least one success check");
|
|
349
|
+
const routes = r.strings(v, "routes", path);
|
|
350
|
+
const url = r.url(v, "url", path, true);
|
|
351
|
+
const maxActions = r.number(v, "maxActions", path, { integer: true });
|
|
352
|
+
const maxDecisions = r.number(v, "maxDecisions", path, { integer: true });
|
|
353
|
+
// #293: a journey-anchored mission — the Journey and step it branches off (checked at preflight).
|
|
354
|
+
const fromJourney = r.string(v, "fromJourney", path, true);
|
|
355
|
+
const rawStep = v.atStep;
|
|
356
|
+
const atStep = typeof rawStep === "number" && Number.isInteger(rawStep) && rawStep > 0 ? String(rawStep) : typeof rawStep === "string" && rawStep.trim() !== "" ? rawStep : undefined;
|
|
357
|
+
if (rawStep !== undefined && atStep === undefined)
|
|
358
|
+
r.fail(`${path}.atStep`, "must be a positive step number or an anchor name");
|
|
359
|
+
const params = v.params;
|
|
360
|
+
if (params !== undefined && (!isRecord(params) || !Object.values(params).every((p) => typeof p === "string")))
|
|
361
|
+
r.fail(`${path}.params`, "must be an object of string values");
|
|
362
|
+
const env = r.string(v, "env", path, true);
|
|
363
|
+
const baseUrl = r.url(v, "baseUrl", path, true);
|
|
364
|
+
const anchored = fromJourney !== undefined || rawStep !== undefined || params !== undefined || env !== undefined || baseUrl !== undefined;
|
|
365
|
+
if (anchored) {
|
|
366
|
+
if (fromJourney === undefined || rawStep === undefined)
|
|
367
|
+
r.fail(path, "fromJourney and atStep go together (and params, env and baseUrl need them)");
|
|
368
|
+
if (s === "feature")
|
|
369
|
+
r.fail(`${path}.fromJourney`, "a feature mission cannot start from a Journey (strategies: coverage, exploratory, adversarial, usability)");
|
|
370
|
+
if (url !== undefined)
|
|
371
|
+
r.fail(`${path}.url`, "cannot be combined with fromJourney: the mission starts where the Journey's prefix leaves the page");
|
|
372
|
+
}
|
|
373
|
+
return {
|
|
374
|
+
...overridesOf(r, v, path, s),
|
|
375
|
+
...(fromJourney === undefined ? {} : { fromJourney }),
|
|
376
|
+
...(atStep === undefined ? {} : { atStep }),
|
|
377
|
+
...(params === undefined ? {} : { params: params }),
|
|
378
|
+
...(env === undefined ? {} : { env }),
|
|
379
|
+
...(baseUrl === undefined ? {} : { baseUrl }),
|
|
380
|
+
name: r.string(v, "name", path, true) ?? (feature === undefined ? s : `${s}-${feature}`),
|
|
381
|
+
strategy: s,
|
|
382
|
+
...emulationOf(r.emulation(v, path)),
|
|
383
|
+
...(url === undefined ? {} : { url }),
|
|
384
|
+
...(routes.length === 0 ? {} : { routes }),
|
|
385
|
+
...(feature === undefined ? {} : { feature }),
|
|
386
|
+
...(goal === undefined ? {} : { goal }),
|
|
387
|
+
...(appClass === undefined ? {} : { appClass }),
|
|
388
|
+
...(success.length === 0 ? {} : { success }),
|
|
389
|
+
...(successWhen === "final" || successWhen === "held" ? { successWhen } : {}),
|
|
390
|
+
...(maxActions === undefined ? {} : { maxActions }),
|
|
391
|
+
...(maxDecisions === undefined ? {} : { maxDecisions }),
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
function verifyOf(r, v, path) {
|
|
395
|
+
if (!isRecord(v))
|
|
396
|
+
return r.fail(path, "must be an object");
|
|
397
|
+
r.keys(v, path, SUITE_FIELDS.verifyFix);
|
|
398
|
+
const fingerprint = r.string(v, "fingerprint", path);
|
|
399
|
+
const replays = r.number(v, "replays", path, { integer: true });
|
|
400
|
+
return {
|
|
401
|
+
name: r.string(v, "name", path, true) ?? `verify-${fingerprint}`,
|
|
402
|
+
result: r.resolvePath(r.string(v, "result", path)),
|
|
403
|
+
fingerprint,
|
|
404
|
+
...(replays === undefined ? {} : { replays }),
|
|
405
|
+
...storageStateOf(r, v, path),
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
const NAME = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
|
|
409
|
+
function targetOf(r, v, path) {
|
|
410
|
+
if (!isRecord(v))
|
|
411
|
+
return r.fail(path, "must be an object");
|
|
412
|
+
r.keys(v, path, SUITE_FIELDS.target, true);
|
|
413
|
+
const name = r.string(v, "name", path);
|
|
414
|
+
if (!NAME.test(name))
|
|
415
|
+
r.fail(`${path}.name`, "must match [A-Za-z0-9][A-Za-z0-9._-]*");
|
|
416
|
+
const url = r.url(v, "url", path) ?? r.fail(`${path}.url`, "is required");
|
|
417
|
+
const storageState = r.string(v, "storageState", path, true);
|
|
418
|
+
const secretFields = envBindings(r, v, "secretFields", path);
|
|
419
|
+
const explore = exploreOptionsOf(r, v, path);
|
|
420
|
+
const fixtures = r.string(v, "fixtures", path, true);
|
|
421
|
+
const journeysDir = r.string(v, "journeysDir", path, true);
|
|
422
|
+
const goals = r.list(v, "goals", path);
|
|
423
|
+
// #213: each item validated on its own (every problem reported), then duplicate default names refused.
|
|
424
|
+
const verifyFix = r
|
|
425
|
+
.list(v, "verifyFix", path)
|
|
426
|
+
.map((m, i) => r.collect(() => verifyOf(r, m, `${path}.verifyFix[${i}]`)))
|
|
427
|
+
.filter((m) => m !== undefined);
|
|
428
|
+
// #213: two verifyFix items that omit `name` and share a fingerprint both default to
|
|
429
|
+
// `verify-<fingerprint>`, which collides in the JUnit output (same classname AND name). Fail
|
|
430
|
+
// closed rather than silently deduping the JUnit only — the suite itself is ambiguous.
|
|
431
|
+
const verifyNames = new Set();
|
|
432
|
+
for (const vf of verifyFix) {
|
|
433
|
+
if (verifyNames.has(vf.name)) {
|
|
434
|
+
r.collect(() => r.fail(`${path}.verifyFix`, `duplicate verifyFix name ${JSON.stringify(vf.name)} — give each verifyFix item (there is more than one for fingerprint ${JSON.stringify(vf.fingerprint)}) its own "name"`));
|
|
435
|
+
}
|
|
436
|
+
verifyNames.add(vf.name);
|
|
437
|
+
}
|
|
438
|
+
return {
|
|
439
|
+
name,
|
|
440
|
+
url,
|
|
441
|
+
...emulationOf(r.emulation(v, path)),
|
|
442
|
+
allow: r.strings(v, "allow", path),
|
|
443
|
+
...(storageState === undefined ? {} : { storageState: r.resolvePath(storageState) }),
|
|
444
|
+
...(secretFields.length === 0 ? {} : { secretFields }),
|
|
445
|
+
...(fixtures === undefined ? {} : { fixtures: r.resolvePath(fixtures) }),
|
|
446
|
+
invariants: r.strings(v, "invariants", path).map((f) => r.resolvePath(f)),
|
|
447
|
+
...(journeysDir === undefined ? {} : { journeysDir: r.resolvePath(journeysDir) }),
|
|
448
|
+
// #213: each item is validated on its own — one bad journey/goal/mission is recorded and
|
|
449
|
+
// dropped, instead of hiding every sibling item's problems behind it.
|
|
450
|
+
journeys: r
|
|
451
|
+
.list(v, "journeys", path)
|
|
452
|
+
.map((j, i) => r.collect(() => journeyOf(r, j, `${path}.journeys[${i}]`)))
|
|
453
|
+
.filter((j) => j !== undefined),
|
|
454
|
+
goals: goals
|
|
455
|
+
.map((g, i) => r.collect(() => goalOf(r, g, `${path}.goals[${i}]`, i)))
|
|
456
|
+
.filter((g) => g !== undefined),
|
|
457
|
+
missions: r
|
|
458
|
+
.list(v, "missions", path)
|
|
459
|
+
.map((m, i) => r.collect(() => missionOf(r, m, `${path}.missions[${i}]`)))
|
|
460
|
+
.filter((m) => m !== undefined),
|
|
461
|
+
verifyFix,
|
|
462
|
+
...(explore === undefined ? {} : { explore }),
|
|
463
|
+
};
|
|
464
|
+
}
|
|
465
|
+
/** Validates a parsed suite. `file` names it in every refusal; relative paths resolve against it. */
|
|
466
|
+
export function parseSuite(raw, file) {
|
|
467
|
+
const abs = resolve(file);
|
|
468
|
+
const r = new Reader(file, dirname(abs));
|
|
469
|
+
if (!isRecord(raw))
|
|
470
|
+
return r.fail("$", "must be a JSON object");
|
|
471
|
+
r.collect(() => r.keys(raw, "$", ["version", "name", "budget", "ai", "gateAdvisory", "targets"]));
|
|
472
|
+
r.collect(() => {
|
|
473
|
+
if (raw.version !== 1)
|
|
474
|
+
r.fail("$.version", "must be 1");
|
|
475
|
+
});
|
|
476
|
+
const budgetRaw = raw.budget ?? {};
|
|
477
|
+
const budgetOk = isRecord(budgetRaw);
|
|
478
|
+
r.collect(() => {
|
|
479
|
+
if (!budgetOk)
|
|
480
|
+
r.fail("$.budget", "must be an object");
|
|
481
|
+
});
|
|
482
|
+
const b = (budgetOk ? budgetRaw : {});
|
|
483
|
+
r.collect(() => r.keys(b, "$.budget", ["maxActions", "maxMinutes", "maxUsd"]));
|
|
484
|
+
const maxActions = r.collect(() => r.number(b, "maxActions", "$.budget", { integer: true }));
|
|
485
|
+
const maxMinutes = r.collect(() => r.number(b, "maxMinutes", "$.budget"));
|
|
486
|
+
const maxUsd = r.collect(() => r.number(b, "maxUsd", "$.budget"));
|
|
487
|
+
const ai = raw.ai;
|
|
488
|
+
r.collect(() => {
|
|
489
|
+
if (ai !== undefined && ai !== "real" && ai !== "fake")
|
|
490
|
+
r.fail("$.ai", 'must be "real" or "fake"');
|
|
491
|
+
});
|
|
492
|
+
r.collect(() => {
|
|
493
|
+
if (raw.gateAdvisory !== undefined && typeof raw.gateAdvisory !== "boolean")
|
|
494
|
+
r.fail("$.gateAdvisory", "must be a boolean");
|
|
495
|
+
});
|
|
496
|
+
const name = r.collect(() => r.string(raw, "name", "$", true)) ?? "suite";
|
|
497
|
+
// #213: every target — and within it, every journey/goal/mission/verify-fix item — is validated on
|
|
498
|
+
// its own, so a suite with several unrelated problems reports all of them, not just the first.
|
|
499
|
+
const targetsRaw = r.collect(() => r.list(raw, "targets", "$")) ?? [];
|
|
500
|
+
const targets = targetsRaw
|
|
501
|
+
.map((t, i) => r.collect(() => targetOf(r, t, `$.targets[${i}]`)))
|
|
502
|
+
.filter((t) => t !== undefined);
|
|
503
|
+
// Only when NO target was even attempted — when some targets failed their own validation, that is
|
|
504
|
+
// already reported per-target above, and "at least one target is required" would just be noise.
|
|
505
|
+
if (targetsRaw.length === 0)
|
|
506
|
+
r.collect(() => r.fail("$.targets", "at least one target is required"));
|
|
507
|
+
const names = new Set();
|
|
508
|
+
for (const t of targets) {
|
|
509
|
+
if (names.has(t.name))
|
|
510
|
+
r.collect(() => r.fail("$.targets", `duplicate target name ${JSON.stringify(t.name)}`));
|
|
511
|
+
else
|
|
512
|
+
names.add(t.name);
|
|
513
|
+
}
|
|
514
|
+
if (r.problems.length > 0)
|
|
515
|
+
throw new SuiteError(r.problems.join("; "), [...r.problems]);
|
|
516
|
+
return {
|
|
517
|
+
version: 1,
|
|
518
|
+
name,
|
|
519
|
+
budget: {
|
|
520
|
+
...(maxActions === undefined ? {} : { maxActions }),
|
|
521
|
+
...(maxMinutes === undefined ? {} : { maxMinutes }),
|
|
522
|
+
...(maxUsd === undefined ? {} : { maxUsd }),
|
|
523
|
+
},
|
|
524
|
+
...(ai === "real" || ai === "fake" ? { ai } : {}),
|
|
525
|
+
gateAdvisory: raw.gateAdvisory === true,
|
|
526
|
+
targets,
|
|
527
|
+
path: abs,
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
export function loadSuite(file) {
|
|
531
|
+
let raw;
|
|
532
|
+
try {
|
|
533
|
+
raw = JSON.parse(readFileSync(file, "utf8"));
|
|
534
|
+
}
|
|
535
|
+
catch (e) {
|
|
536
|
+
throw new SuiteError(`cannot read suite ${file}: ${e instanceof Error ? e.message : String(e)}`);
|
|
537
|
+
}
|
|
538
|
+
return parseSuite(raw, file);
|
|
539
|
+
}
|
|
540
|
+
//# sourceMappingURL=check-suite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-suite.js","sourceRoot":"","sources":["../src/check-suite.ts"],"names":[],"mappings":"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"}
|