@restormel/testing-cli 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) Allotment Technology Ltd
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/bin/testing.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from "../dispatch.js";
3
+ const code = await runCli(process.argv.slice(2));
4
+ process.exitCode = code;
5
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/bin/testing.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Run the CLI and return a process exit code (does not call `process.exit`).
3
+ */
4
+ export declare function runCli(argv: string[]): Promise<number>;
5
+ //# sourceMappingURL=dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"AAiNA;;GAEG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6C5D"}
@@ -0,0 +1,205 @@
1
+ import { access, constants, mkdir, writeFile } from "node:fs/promises";
2
+ import { basename, dirname, join } from "node:path";
3
+ import { formatConfigErrors, loadConfigFromFile } from "@restormel/testing-config";
4
+ import { keysAdapterOptionsFromProcessEnv } from "@restormel/testing-keys-adapter";
5
+ import { formatRunSummary, PRE_RUN_FAILURE_JSON, readRunArtifacts, writeRunReportBundle, } from "@restormel/testing-report";
6
+ import { runLocalSuite } from "@restormel/testing-runner";
7
+ import { runDoctor } from "./doctor.js";
8
+ import { EXIT_FAILED, EXIT_OK, EXIT_USAGE } from "./exit-codes.js";
9
+ import { printCommandHelp, printGlobalHelp } from "./help.js";
10
+ import { parseArgs } from "./parse-args.js";
11
+ import { STARTER_CONFIG_YAML } from "./starter-config.js";
12
+ import { cliPackageVersion } from "./version.js";
13
+ function programLabel() {
14
+ const exe = process.argv[1];
15
+ if (!exe)
16
+ return "testing";
17
+ const base = basename(exe, ".js");
18
+ return base === "restormel-testing" ? "restormel-testing" : "testing";
19
+ }
20
+ async function cmdInit(opts) {
21
+ if (opts.print) {
22
+ process.stdout.write(STARTER_CONFIG_YAML);
23
+ return EXIT_OK;
24
+ }
25
+ if (!opts.force) {
26
+ try {
27
+ await access(opts.config, constants.F_OK);
28
+ console.error(`${programLabel()} init: file already exists: ${opts.config}`);
29
+ console.error(`Use --force to overwrite, or --print to view the template.`);
30
+ return EXIT_USAGE;
31
+ }
32
+ catch {
33
+ /* absent */
34
+ }
35
+ }
36
+ await mkdir(dirname(opts.config), { recursive: true });
37
+ await writeFile(opts.config, STARTER_CONFIG_YAML, "utf8");
38
+ console.log(`Wrote ${opts.config}`);
39
+ return EXIT_OK;
40
+ }
41
+ async function cmdValidate(opts) {
42
+ const loaded = await loadConfigFromFile(opts.config);
43
+ if (!loaded.ok) {
44
+ if (opts.json) {
45
+ console.log(JSON.stringify({ ok: false, errors: loaded.errors }, null, 2));
46
+ }
47
+ else {
48
+ console.error(formatConfigErrors(loaded.errors));
49
+ }
50
+ return EXIT_USAGE;
51
+ }
52
+ if (opts.json) {
53
+ console.log(JSON.stringify({
54
+ ok: true,
55
+ schema_version: loaded.config.schemaVersion,
56
+ config_path: opts.config,
57
+ }, null, 2));
58
+ }
59
+ else {
60
+ console.log(`Valid ${opts.config} (schema_version ${loaded.config.schemaVersion})`);
61
+ }
62
+ return EXIT_OK;
63
+ }
64
+ function defaultArtifactDir() {
65
+ const slug = new Date().toISOString().replace(/[:.]/g, "-");
66
+ return join(process.cwd(), ".restormel-testing", "runs", `run-${slug}`);
67
+ }
68
+ async function cmdRun(opts) {
69
+ const artifactDir = opts.artifactDir ?? defaultArtifactDir();
70
+ await mkdir(artifactDir, { recursive: true });
71
+ const keysAdapterOptions = keysAdapterOptionsFromProcessEnv();
72
+ const result = await runLocalSuite({
73
+ configPath: opts.config,
74
+ suiteId: opts.suite,
75
+ environmentId: opts.environmentId,
76
+ targetUrlOverride: opts.targetUrl,
77
+ commitSha: opts.commitSha,
78
+ repository: opts.repository,
79
+ trigger: opts.trigger,
80
+ artifactDir,
81
+ headless: opts.headless,
82
+ goalIds: opts.goalIds,
83
+ keysAdapterOptions,
84
+ });
85
+ if (!result.ok) {
86
+ const failureDoc = {
87
+ ok: false,
88
+ phase: "pre_run",
89
+ errors: result.errors,
90
+ };
91
+ await writeFile(join(artifactDir, PRE_RUN_FAILURE_JSON), JSON.stringify(failureDoc, null, 2), "utf8");
92
+ if (opts.json) {
93
+ console.log(JSON.stringify({
94
+ ok: false,
95
+ errors: result.errors,
96
+ artifact_dir: artifactDir,
97
+ partial_artifacts: [PRE_RUN_FAILURE_JSON],
98
+ }, null, 2));
99
+ }
100
+ else {
101
+ console.error(result.errors.join("\n"));
102
+ console.error(`Partial artefacts: ${artifactDir} (${PRE_RUN_FAILURE_JSON})`);
103
+ }
104
+ for (const w of result.warnings)
105
+ console.warn(w);
106
+ return EXIT_USAGE;
107
+ }
108
+ const run = result.run;
109
+ if (!run) {
110
+ console.error("Internal error: missing run record.");
111
+ return EXIT_FAILED;
112
+ }
113
+ const program = programLabel();
114
+ let reproduceRun = `${program} run --suite ${opts.suite} --config ${opts.config}`;
115
+ if (opts.environmentId !== undefined)
116
+ reproduceRun += ` --environment ${opts.environmentId}`;
117
+ if (opts.goalIds !== undefined && opts.goalIds.length > 0) {
118
+ reproduceRun += ` --goal ${opts.goalIds.join(",")}`;
119
+ }
120
+ await writeRunReportBundle(artifactDir, {
121
+ run,
122
+ traces: result.traces,
123
+ warnings: result.warnings.length ? result.warnings : undefined,
124
+ suite: result.suiteMeta,
125
+ reproduction: {
126
+ report_command: `${program} report ${artifactDir}`,
127
+ notes: `Re-run suite: ${reproduceRun}`.trim(),
128
+ },
129
+ });
130
+ for (const w of result.warnings)
131
+ console.warn(w);
132
+ if (opts.json) {
133
+ console.log(JSON.stringify({
134
+ ok: true,
135
+ verdict: run.verdict,
136
+ run_id: run.id,
137
+ artifact_dir: artifactDir,
138
+ suite_id: run.suiteId,
139
+ environment_id: run.environmentId,
140
+ }, null, 2));
141
+ }
142
+ else {
143
+ console.log(formatRunSummary(run));
144
+ console.log(`\nArtefacts: ${artifactDir}\n (run.json, traces.json, report.json, summary.md, github-summary.md, junit.xml)`);
145
+ }
146
+ if (run.verdict !== "passed") {
147
+ return EXIT_FAILED;
148
+ }
149
+ return EXIT_OK;
150
+ }
151
+ async function cmdReport(opts) {
152
+ const loaded = await readRunArtifacts(opts.path);
153
+ if (!("run" in loaded)) {
154
+ console.error(loaded.message);
155
+ return EXIT_USAGE;
156
+ }
157
+ console.log(formatRunSummary(loaded.run));
158
+ if (loaded.warnings.length > 0) {
159
+ console.warn("Warnings from run:");
160
+ for (const w of loaded.warnings)
161
+ console.warn(` ${w}`);
162
+ }
163
+ return EXIT_OK;
164
+ }
165
+ /**
166
+ * Run the CLI and return a process exit code (does not call `process.exit`).
167
+ */
168
+ export async function runCli(argv) {
169
+ const program = programLabel();
170
+ const parsed = parseArgs(argv);
171
+ if (parsed.kind === "help") {
172
+ if (parsed.topic !== undefined) {
173
+ const ok = printCommandHelp(program, parsed.topic);
174
+ return ok ? EXIT_OK : EXIT_USAGE;
175
+ }
176
+ printGlobalHelp(program);
177
+ return EXIT_OK;
178
+ }
179
+ if (parsed.kind === "version") {
180
+ console.log(cliPackageVersion());
181
+ return EXIT_OK;
182
+ }
183
+ if (parsed.kind === "error") {
184
+ console.error(`${program}: ${parsed.message}`);
185
+ console.error(`Run '${program} --help' for usage.`);
186
+ return EXIT_USAGE;
187
+ }
188
+ if (parsed.kind === "init") {
189
+ return cmdInit(parsed);
190
+ }
191
+ if (parsed.kind === "validate") {
192
+ return cmdValidate(parsed);
193
+ }
194
+ if (parsed.kind === "run") {
195
+ return cmdRun(parsed);
196
+ }
197
+ if (parsed.kind === "report") {
198
+ return cmdReport(parsed);
199
+ }
200
+ if (parsed.kind === "doctor") {
201
+ return runDoctor({ config: parsed.config });
202
+ }
203
+ return EXIT_USAGE;
204
+ }
205
+ //# sourceMappingURL=dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Minimal prerequisite checks (no secret values printed).
3
+ * Exit 0 = OK, 2 = hard failure (Node / browser / missing config file).
4
+ */
5
+ export declare function runDoctor(opts: {
6
+ config?: string;
7
+ }): Promise<number>;
8
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA0C1E"}
package/dist/doctor.js ADDED
@@ -0,0 +1,46 @@
1
+ import { access, constants } from "node:fs/promises";
2
+ import { chromium } from "playwright";
3
+ /**
4
+ * Minimal prerequisite checks (no secret values printed).
5
+ * Exit 0 = OK, 2 = hard failure (Node / browser / missing config file).
6
+ */
7
+ export async function runDoctor(opts) {
8
+ const major = Number.parseInt(process.versions.node.split(".")[0] ?? "0", 10);
9
+ if (Number.isNaN(major) || major < 20) {
10
+ console.error(`doctor: Node 20+ required (got ${process.version})`);
11
+ return 2;
12
+ }
13
+ console.log(`doctor: Node ${process.version} OK`);
14
+ if (opts.config !== undefined) {
15
+ try {
16
+ await access(opts.config, constants.R_OK);
17
+ console.log(`doctor: config readable (${opts.config})`);
18
+ }
19
+ catch {
20
+ console.error(`doctor: config not readable: ${opts.config}`);
21
+ return 2;
22
+ }
23
+ }
24
+ try {
25
+ const exe = chromium.executablePath();
26
+ console.log(`doctor: Playwright Chromium executable OK`);
27
+ console.log(` ${exe}`);
28
+ }
29
+ catch {
30
+ console.error("doctor: Playwright Chromium not installed — run:\n pnpm --filter @restormel/testing-browser-playwright exec playwright install chromium");
31
+ return 2;
32
+ }
33
+ const keysBase = process.env.RESTORMEL_KEYS_API_BASE_URL?.trim();
34
+ const fallback = process.env.RESTORMEL_TESTING_OPENAI_FALLBACK?.trim() === "1";
35
+ if (keysBase) {
36
+ console.log("doctor: RESTORMEL_KEYS_API_BASE_URL is set (value not shown)");
37
+ }
38
+ else if (fallback) {
39
+ console.log("doctor: RESTORMEL_TESTING_OPENAI_FALLBACK=1 (OpenAI env fallback may be used for judges)");
40
+ }
41
+ else {
42
+ console.log("doctor: Keys HTTP not set — goals with judge_rubric need RESTORMEL_KEYS_API_BASE_URL or RESTORMEL_TESTING_OPENAI_FALLBACK=1");
43
+ }
44
+ return 0;
45
+ }
46
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAyB;IACvD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;IAC9E,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;QACtC,OAAO,CAAC,KAAK,CAAC,kCAAkC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC;QACpE,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC;IAElD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,gCAAgC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CACX,0IAA0I,CAC3I,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,IAAI,EAAE,CAAC;IACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC;IAC/E,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC9E,CAAC;SAAM,IAAI,QAAQ,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,0FAA0F,CAAC,CAAC;IAC1G,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CACT,6HAA6H,CAC9H,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,10 @@
1
+ /** Normal success. */
2
+ export declare const EXIT_OK = 0;
3
+ /**
4
+ * Run finished but suite did not pass (failed / indeterminate), or unexpected runtime failure.
5
+ * Use in CI to fail the job when tests fail.
6
+ */
7
+ export declare const EXIT_FAILED = 1;
8
+ /** Invalid usage, missing arguments, missing files, or invalid config (validate / init guardrails). */
9
+ export declare const EXIT_USAGE = 2;
10
+ //# sourceMappingURL=exit-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.d.ts","sourceRoot":"","sources":["../src/exit-codes.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,eAAO,MAAM,OAAO,IAAI,CAAC;AAEzB;;;GAGG;AACH,eAAO,MAAM,WAAW,IAAI,CAAC;AAE7B,uGAAuG;AACvG,eAAO,MAAM,UAAU,IAAI,CAAC"}
@@ -0,0 +1,10 @@
1
+ /** Normal success. */
2
+ export const EXIT_OK = 0;
3
+ /**
4
+ * Run finished but suite did not pass (failed / indeterminate), or unexpected runtime failure.
5
+ * Use in CI to fail the job when tests fail.
6
+ */
7
+ export const EXIT_FAILED = 1;
8
+ /** Invalid usage, missing arguments, missing files, or invalid config (validate / init guardrails). */
9
+ export const EXIT_USAGE = 2;
10
+ //# sourceMappingURL=exit-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.js","sourceRoot":"","sources":["../src/exit-codes.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AAEzB;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAE7B,uGAAuG;AACvG,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC"}
package/dist/help.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export declare function printGlobalHelp(program: string): void;
2
+ /** @returns false if topic is unknown */
3
+ export declare function printCommandHelp(program: string, topic: string): boolean;
4
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAiCrD;AAED,yCAAyC;AACzC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CA0ExE"}
package/dist/help.js ADDED
@@ -0,0 +1,107 @@
1
+ const KNOWN_TOPICS = new Set(["init", "validate", "run", "report", "doctor"]);
2
+ export function printGlobalHelp(program) {
3
+ console.log(`${program} — Restormel / Testing CLI
4
+
5
+ Usage:
6
+ ${program} <command> [options]
7
+
8
+ Commands:
9
+ init Write a starter config file (or print it with --print)
10
+ validate Check that a config file parses and satisfies the schema
11
+ run Execute a browser suite locally and write report artefacts
12
+ report Print a human summary from a previous run directory
13
+ doctor Check Node, optional config file, Playwright Chromium, Keys env hints
14
+
15
+ Global options:
16
+ -h, --help Show help (optionally: ${program} help <command>)
17
+ -v, --version Print CLI version
18
+
19
+ Examples:
20
+ ${program} init
21
+ ${program} validate --config restormel-testing.yaml
22
+ ${program} validate --config restormel-testing.yaml --json
23
+ ${program} run --suite web-critical --config restormel-testing.yaml
24
+ ${program} run --suite web-critical --goal smoke,login --config restormel-testing.yaml
25
+ ${program} report .restormel-testing/runs/run-2026-04-07
26
+ ${program} doctor --config restormel-testing.yaml
27
+
28
+ Environment (Keys / judges — values never printed):
29
+ RESTORMEL_KEYS_API_BASE_URL Keys HTTP API origin (optional)
30
+ RESTORMEL_KEYS_API_TOKEN_ENV Name of env var with Keys API bearer (default RESTORMEL_KEYS_API_TOKEN)
31
+ RESTORMEL_TESTING_OPENAI_FALLBACK Set to 1 for documented OPENAI_API_KEY fallback when Keys unset
32
+
33
+ See docs/config-reference-mvp.md for supported YAML, CLI --json behaviour, and judge_rubric notes.
34
+ `);
35
+ }
36
+ /** @returns false if topic is unknown */
37
+ export function printCommandHelp(program, topic) {
38
+ const t = topic.toLowerCase();
39
+ if (!KNOWN_TOPICS.has(t)) {
40
+ console.error(`Unknown help topic: ${topic}`);
41
+ console.error(`Try: ${program} help init | validate | run | report | doctor`);
42
+ return false;
43
+ }
44
+ if (t === "init") {
45
+ console.log(`${program} init [options]
46
+
47
+ Write 'restormel-testing.yaml' (or another path via --config) with a minimal valid example.
48
+
49
+ Options:
50
+ -c, --config <path> Output file (default: restormel-testing.yaml)
51
+ --print Print to stdout instead of writing a file
52
+ --force Overwrite an existing file
53
+ `);
54
+ return true;
55
+ }
56
+ if (t === "validate") {
57
+ console.log(`${program} validate [options]
58
+
59
+ Validate configuration. Exits 0 if valid, non-zero if not.
60
+
61
+ Options:
62
+ -c, --config <path> Config file (default: restormel-testing.yaml)
63
+ --json Print { ok, schema_version } or { ok: false, errors } to stdout
64
+ `);
65
+ return true;
66
+ }
67
+ if (t === "run") {
68
+ console.log(`${program} run --suite <name> [options]
69
+
70
+ Run a suite. Writes JSON artefacts under --artifact-dir (default: timestamped dir under .restormel-testing/runs/).
71
+
72
+ Exit codes: 0 passed, 1 suite failed or indeterminate, 2 config or usage error.
73
+
74
+ Options:
75
+ --suite <name> Suite id from the config (required)
76
+ --goal <ids> Comma-separated goal ids (subset of suite; repeatable)
77
+ -c, --config <path> Config file (default: restormel-testing.yaml)
78
+ --environment, --env <id> Environment id (default: suite's environment)
79
+ --target-url <url> Override base URL (e.g. preview deploy; no credentials in URL)
80
+ --commit-sha <sha> Record in run metadata
81
+ --repository <slug> Record in run metadata (e.g. org/name)
82
+ --artifact-dir <dir> Directory for screenshots + run.json + traces.json
83
+ --headed Run browser non-headless (local debugging)
84
+ --ci Mark trigger as 'ci' in the run record
85
+ --json Print JSON to stdout. On success: verdict, run_id, artifact_dir. On pre-run failure (before RunRecord): ok false, errors, artifact_dir, partial_artifacts (includes pre-run-failure.json in the run directory)
86
+ `);
87
+ return true;
88
+ }
89
+ if (t === "doctor") {
90
+ console.log(`${program} doctor [options]
91
+
92
+ Check Node 20+, optional config readability, Playwright Chromium install, and whether Keys-related env vars are set (names only).
93
+
94
+ Options:
95
+ -c, --config <path> If set, file must exist and be readable
96
+
97
+ Exit: 0 OK, 2 prerequisite failure
98
+ `);
99
+ return true;
100
+ }
101
+ console.log(`${program} report <path>
102
+
103
+ Print a summary from a run artefact directory (containing run.json) or a direct path to run.json.
104
+ `);
105
+ return true;
106
+ }
107
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE9E,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO;;;IAGpB,OAAO;;;;;;;;;;4CAUiC,OAAO;;;;IAI/C,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;;;;;;;;CAQV,CAAC,CAAC;AACH,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,KAAa;IAC7D,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,uBAAuB,KAAK,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,KAAK,CAAC,QAAQ,OAAO,+CAA+C,CAAC,CAAC;QAC9E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO;;;;;;;;CAQzB,CAAC,CAAC;QACC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO;;;;;;;CAOzB,CAAC,CAAC;QACC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO;;;;;;;;;;;;;;;;;;CAkBzB,CAAC,CAAC;QACC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO;;;;;;;;CAQzB,CAAC,CAAC;QACC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO;;;CAGvB,CAAC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,42 @@
1
+ export type ParsedCli = {
2
+ kind: "help";
3
+ topic?: string;
4
+ } | {
5
+ kind: "version";
6
+ } | {
7
+ kind: "init";
8
+ config: string;
9
+ print: boolean;
10
+ force: boolean;
11
+ } | {
12
+ kind: "validate";
13
+ config: string;
14
+ json: boolean;
15
+ } | {
16
+ kind: "run";
17
+ suite: string;
18
+ config: string;
19
+ environmentId?: string;
20
+ targetUrl?: string;
21
+ commitSha?: string;
22
+ repository?: string;
23
+ artifactDir?: string;
24
+ headless: boolean;
25
+ trigger: "local" | "ci";
26
+ goalIds?: string[];
27
+ json: boolean;
28
+ } | {
29
+ kind: "report";
30
+ path: string;
31
+ } | {
32
+ kind: "doctor";
33
+ config?: string;
34
+ } | {
35
+ kind: "error";
36
+ message: string;
37
+ };
38
+ /**
39
+ * Parse argv with `process.argv.slice(2)` (no `node`, no executable).
40
+ */
41
+ export declare function parseArgs(argv: string[]): ParsedCli;
42
+ //# sourceMappingURL=parse-args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-args.d.ts","sourceRoot":"","sources":["../src/parse-args.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAChE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GACnD;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;CACf,GACD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAsNvC;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAoCnD"}
@@ -0,0 +1,241 @@
1
+ function parseInitArgs(args) {
2
+ let config = "restormel-testing.yaml";
3
+ let print = false;
4
+ let force = false;
5
+ for (let i = 0; i < args.length; i++) {
6
+ const a = args[i];
7
+ if (a === "--print") {
8
+ print = true;
9
+ continue;
10
+ }
11
+ if (a === "--force") {
12
+ force = true;
13
+ continue;
14
+ }
15
+ if (a === "--config" || a === "-c") {
16
+ const v = args[++i];
17
+ if (!v || v.startsWith("-")) {
18
+ return { kind: "error", message: "init: --config requires a file path" };
19
+ }
20
+ config = v;
21
+ continue;
22
+ }
23
+ if (a === "-h" || a === "--help") {
24
+ return { kind: "help", topic: "init" };
25
+ }
26
+ return { kind: "error", message: `init: unexpected argument: ${a}` };
27
+ }
28
+ return { kind: "init", config, print, force };
29
+ }
30
+ function parseValidateArgs(args) {
31
+ let config = "restormel-testing.yaml";
32
+ let json = false;
33
+ for (let i = 0; i < args.length; i++) {
34
+ const a = args[i];
35
+ if (a === "--json") {
36
+ json = true;
37
+ continue;
38
+ }
39
+ if (a === "--config" || a === "-c") {
40
+ const v = args[++i];
41
+ if (!v || v.startsWith("-")) {
42
+ return { kind: "error", message: "validate: --config requires a file path" };
43
+ }
44
+ config = v;
45
+ continue;
46
+ }
47
+ if (a === "-h" || a === "--help") {
48
+ return { kind: "help", topic: "validate" };
49
+ }
50
+ return { kind: "error", message: `validate: unexpected argument: ${a}` };
51
+ }
52
+ return { kind: "validate", config, json };
53
+ }
54
+ function parseRunArgs(args) {
55
+ let suite;
56
+ let config = "restormel-testing.yaml";
57
+ let environmentId;
58
+ let targetUrl;
59
+ let commitSha;
60
+ let repository;
61
+ let artifactDir;
62
+ let headless = true;
63
+ let trigger = "local";
64
+ const goalIds = [];
65
+ let json = false;
66
+ for (let i = 0; i < args.length; i++) {
67
+ const a = args[i];
68
+ if (a === "--suite") {
69
+ const v = args[++i];
70
+ if (!v || v.startsWith("-")) {
71
+ return { kind: "error", message: "run: --suite requires a value" };
72
+ }
73
+ suite = v;
74
+ continue;
75
+ }
76
+ if (a === "--goal") {
77
+ const v = args[++i];
78
+ if (!v || v.startsWith("-")) {
79
+ return { kind: "error", message: "run: --goal requires a value" };
80
+ }
81
+ for (const part of v.split(",")) {
82
+ const id = part.trim();
83
+ if (id.length > 0)
84
+ goalIds.push(id);
85
+ }
86
+ continue;
87
+ }
88
+ if (a === "--environment" || a === "--env") {
89
+ const v = args[++i];
90
+ if (!v || v.startsWith("-")) {
91
+ return { kind: "error", message: "run: --environment requires a value" };
92
+ }
93
+ environmentId = v;
94
+ continue;
95
+ }
96
+ if (a === "--target-url") {
97
+ const v = args[++i];
98
+ if (!v || v.startsWith("-")) {
99
+ return { kind: "error", message: "run: --target-url requires a value" };
100
+ }
101
+ targetUrl = v;
102
+ continue;
103
+ }
104
+ if (a === "--commit-sha") {
105
+ const v = args[++i];
106
+ if (!v || v.startsWith("-")) {
107
+ return { kind: "error", message: "run: --commit-sha requires a value" };
108
+ }
109
+ commitSha = v;
110
+ continue;
111
+ }
112
+ if (a === "--repository") {
113
+ const v = args[++i];
114
+ if (!v || v.startsWith("-")) {
115
+ return { kind: "error", message: "run: --repository requires a value" };
116
+ }
117
+ repository = v;
118
+ continue;
119
+ }
120
+ if (a === "--config" || a === "-c") {
121
+ const v = args[++i];
122
+ if (!v || v.startsWith("-")) {
123
+ return { kind: "error", message: "run: --config requires a file path" };
124
+ }
125
+ config = v;
126
+ continue;
127
+ }
128
+ if (a === "--artifact-dir") {
129
+ const v = args[++i];
130
+ if (!v || v.startsWith("-")) {
131
+ return { kind: "error", message: "run: --artifact-dir requires a directory path" };
132
+ }
133
+ artifactDir = v;
134
+ continue;
135
+ }
136
+ if (a === "--headed") {
137
+ headless = false;
138
+ continue;
139
+ }
140
+ if (a === "--ci") {
141
+ trigger = "ci";
142
+ continue;
143
+ }
144
+ if (a === "--json") {
145
+ json = true;
146
+ continue;
147
+ }
148
+ if (a === "-h" || a === "--help") {
149
+ return { kind: "help", topic: "run" };
150
+ }
151
+ return { kind: "error", message: `run: unexpected argument: ${a}` };
152
+ }
153
+ if (!suite) {
154
+ return { kind: "error", message: "run: --suite <name> is required" };
155
+ }
156
+ return {
157
+ kind: "run",
158
+ suite,
159
+ config,
160
+ environmentId,
161
+ targetUrl,
162
+ commitSha,
163
+ repository,
164
+ artifactDir,
165
+ headless,
166
+ trigger,
167
+ goalIds: goalIds.length > 0 ? goalIds : undefined,
168
+ json,
169
+ };
170
+ }
171
+ function parseReportArgs(args) {
172
+ const rest = [...args];
173
+ for (let i = 0; i < rest.length; i++) {
174
+ if (rest[i] === "-h" || rest[i] === "--help") {
175
+ return { kind: "help", topic: "report" };
176
+ }
177
+ }
178
+ const pos = rest.filter((a) => !a.startsWith("-"));
179
+ if (pos.length === 0) {
180
+ return { kind: "error", message: "report: requires a path to a run directory or run.json" };
181
+ }
182
+ if (pos.length > 1) {
183
+ return { kind: "error", message: "report: too many arguments" };
184
+ }
185
+ return { kind: "report", path: pos[0] };
186
+ }
187
+ function parseDoctorArgs(args) {
188
+ let config;
189
+ for (let i = 0; i < args.length; i++) {
190
+ const a = args[i];
191
+ if (a === "--config" || a === "-c") {
192
+ const v = args[++i];
193
+ if (!v || v.startsWith("-")) {
194
+ return { kind: "error", message: "doctor: --config requires a file path" };
195
+ }
196
+ config = v;
197
+ continue;
198
+ }
199
+ if (a === "-h" || a === "--help") {
200
+ return { kind: "help", topic: "doctor" };
201
+ }
202
+ return { kind: "error", message: `doctor: unexpected argument: ${a}` };
203
+ }
204
+ return { kind: "doctor", config };
205
+ }
206
+ /**
207
+ * Parse argv with `process.argv.slice(2)` (no `node`, no executable).
208
+ */
209
+ export function parseArgs(argv) {
210
+ if (argv.length === 0) {
211
+ return { kind: "help" };
212
+ }
213
+ const first = argv[0];
214
+ if (first === "-h" || first === "--help") {
215
+ return { kind: "help", topic: argv[1] };
216
+ }
217
+ if (first === "--version" || first === "-v") {
218
+ return { kind: "version" };
219
+ }
220
+ if (first === "help") {
221
+ return { kind: "help", topic: argv[1] };
222
+ }
223
+ const rest = argv.slice(1);
224
+ if (first === "init") {
225
+ return parseInitArgs(rest);
226
+ }
227
+ if (first === "validate") {
228
+ return parseValidateArgs(rest);
229
+ }
230
+ if (first === "run") {
231
+ return parseRunArgs(rest);
232
+ }
233
+ if (first === "report") {
234
+ return parseReportArgs(rest);
235
+ }
236
+ if (first === "doctor") {
237
+ return parseDoctorArgs(rest);
238
+ }
239
+ return { kind: "error", message: `Unknown command: ${first}` };
240
+ }
241
+ //# sourceMappingURL=parse-args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-args.js","sourceRoot":"","sources":["../src/parse-args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Minimal valid `restormel-testing` document (schema v1). */
2
+ export declare const STARTER_CONFIG_YAML = "schema_version: \"1\"\n\n# Optional global Keys logical refs (opaque; never put API keys here):\n# keys:\n# llm_primary: ref:restormel-keys:llm/primary\n\nenvironments:\n local:\n base_url: https://example.com\n\nsuites:\n - id: example\n environment: local\n goals:\n - id: smoke\n type: browser\n description: Replace with a real user-visible outcome for your app\n success_criteria:\n text_present:\n - Example Domain\n";
3
+ //# sourceMappingURL=starter-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"starter-config.d.ts","sourceRoot":"","sources":["../src/starter-config.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,eAAO,MAAM,mBAAmB,seAoB/B,CAAC"}
@@ -0,0 +1,23 @@
1
+ /** Minimal valid `restormel-testing` document (schema v1). */
2
+ export const STARTER_CONFIG_YAML = `schema_version: "1"
3
+
4
+ # Optional global Keys logical refs (opaque; never put API keys here):
5
+ # keys:
6
+ # llm_primary: ref:restormel-keys:llm/primary
7
+
8
+ environments:
9
+ local:
10
+ base_url: https://example.com
11
+
12
+ suites:
13
+ - id: example
14
+ environment: local
15
+ goals:
16
+ - id: smoke
17
+ type: browser
18
+ description: Replace with a real user-visible outcome for your app
19
+ success_criteria:
20
+ text_present:
21
+ - Example Domain
22
+ `;
23
+ //# sourceMappingURL=starter-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"starter-config.js","sourceRoot":"","sources":["../src/starter-config.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;CAoBlC,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** CLI package version (from `packages/cli/package.json`). */
2
+ export declare function cliPackageVersion(): string;
3
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAMA,8DAA8D;AAC9D,wBAAgB,iBAAiB,IAAI,MAAM,CAG1C"}
@@ -0,0 +1,10 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ const dir = dirname(fileURLToPath(import.meta.url));
5
+ /** CLI package version (from `packages/cli/package.json`). */
6
+ export function cliPackageVersion() {
7
+ const raw = readFileSync(join(dir, "..", "package.json"), "utf8");
8
+ return JSON.parse(raw).version;
9
+ }
10
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEpD,8DAA8D;AAC9D,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;IAClE,OAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC,OAAO,CAAC;AAC1D,CAAC"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@restormel/testing-cli",
3
+ "version": "0.1.0",
4
+ "description": "Restormel / Testing CLI (init, validate, run, report).",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/Allotment-Technology-Ltd/restormel-testing.git",
9
+ "directory": "packages/cli"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/Allotment-Technology-Ltd/restormel-testing/issues"
13
+ },
14
+ "homepage": "https://github.com/Allotment-Technology-Ltd/restormel-testing/tree/main/packages/cli#readme",
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "type": "module",
19
+ "bin": {
20
+ "testing": "./dist/bin/testing.js",
21
+ "restormel-testing": "./dist/bin/testing.js"
22
+ },
23
+ "files": [
24
+ "dist"
25
+ ],
26
+ "engines": {
27
+ "node": ">=20"
28
+ },
29
+ "dependencies": {
30
+ "playwright": "^1.49.0",
31
+ "@restormel/testing-keys-adapter": "0.1.0",
32
+ "@restormel/testing-report": "0.1.0",
33
+ "@restormel/testing-runner": "0.1.0",
34
+ "@restormel/testing-config": "0.1.0"
35
+ },
36
+ "devDependencies": {
37
+ "typescript": "^5.7.0"
38
+ },
39
+ "scripts": {
40
+ "build": "tsc -b tsconfig.json",
41
+ "typecheck": "tsc -b tsconfig.json"
42
+ }
43
+ }