@testmuai/evidence-cli 0.1.1

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.
Files changed (55) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +124 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +55 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/config.d.ts +6 -0
  7. package/dist/config.js +71 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/contract.d.ts +66 -0
  10. package/dist/contract.js +50 -0
  11. package/dist/contract.js.map +1 -0
  12. package/dist/diagnostics.d.ts +3 -0
  13. package/dist/diagnostics.js +11 -0
  14. package/dist/diagnostics.js.map +1 -0
  15. package/dist/finalize/index.d.ts +21 -0
  16. package/dist/finalize/index.js +196 -0
  17. package/dist/finalize/index.js.map +1 -0
  18. package/dist/index.d.ts +12 -0
  19. package/dist/index.js +37 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/pack/byte-source.d.ts +33 -0
  22. package/dist/pack/byte-source.js +50 -0
  23. package/dist/pack/byte-source.js.map +1 -0
  24. package/dist/pack/container.d.ts +58 -0
  25. package/dist/pack/container.js +215 -0
  26. package/dist/pack/container.js.map +1 -0
  27. package/dist/pack/remote.d.ts +49 -0
  28. package/dist/pack/remote.js +258 -0
  29. package/dist/pack/remote.js.map +1 -0
  30. package/dist/report/reporter.d.ts +22 -0
  31. package/dist/report/reporter.js +66 -0
  32. package/dist/report/reporter.js.map +1 -0
  33. package/dist/schemas/0.1/L0/result.schema.json +150 -0
  34. package/dist/schemas/0.1/L0/run.schema.json +114 -0
  35. package/dist/schemas/0.1/L1/logs-meta.schema.json +39 -0
  36. package/dist/schemas/0.1/L1/video.schema.json +16 -0
  37. package/dist/schemas/compile.d.ts +11 -0
  38. package/dist/schemas/compile.js +45 -0
  39. package/dist/schemas/compile.js.map +1 -0
  40. package/dist/schemas/registry.d.ts +11 -0
  41. package/dist/schemas/registry.js +40 -0
  42. package/dist/schemas/registry.js.map +1 -0
  43. package/dist/validate/checks.d.ts +15 -0
  44. package/dist/validate/checks.js +152 -0
  45. package/dist/validate/checks.js.map +1 -0
  46. package/dist/validate/index.d.ts +5 -0
  47. package/dist/validate/index.js +99 -0
  48. package/dist/validate/index.js.map +1 -0
  49. package/dist/validate/l1.d.ts +12 -0
  50. package/dist/validate/l1.js +117 -0
  51. package/dist/validate/l1.js.map +1 -0
  52. package/dist/yaml.d.ts +4 -0
  53. package/dist/yaml.js +16 -0
  54. package/dist/yaml.js.map +1 -0
  55. package/package.json +70 -0
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runL1Checks = runL1Checks;
4
+ const contract_1 = require("../contract");
5
+ const diagnostics_1 = require("../diagnostics");
6
+ const compile_1 = require("../schemas/compile");
7
+ const yaml_1 = require("../yaml");
8
+ const checks_1 = require("./checks");
9
+ // The L1 artifact layer (decision 0040). Status-gated like L0: artifact PRESENCE
10
+ // (logs/, steps/, coverage/) is required only when finalized; shape checks on
11
+ // whatever artifacts ARE present run at any status.
12
+ async function runL1Checks(input) {
13
+ const diags = [];
14
+ const finalized = input.status === "finalized";
15
+ const { logsMeta, video } = (0, compile_1.loadL1Schemas)(input.version);
16
+ if (finalized && !(await input.container.isDir("coverage"))) {
17
+ diags.push((0, diagnostics_1.err)(contract_1.Codes.L1_COVERAGE_MISSING, "coverage/", "L1 requires a global coverage/ directory"));
18
+ }
19
+ for (const { testId, result } of input.tests) {
20
+ const base = `tests/${testId}`;
21
+ await checkLogs(input.container, diags, base, finalized, logsMeta);
22
+ await checkSteps(input.container, diags, base, finalized, result);
23
+ await checkVideo(input.container, diags, base, video);
24
+ }
25
+ return diags;
26
+ }
27
+ async function checkLogs(c, diags, base, finalized, logsMeta) {
28
+ const dir = `${base}/logs`;
29
+ if (!(await c.isDir(dir))) {
30
+ if (finalized)
31
+ diags.push((0, diagnostics_1.err)(contract_1.Codes.L1_LOGS_MISSING, `${dir}/`, "L1 requires a logs/ directory"));
32
+ return;
33
+ }
34
+ const metaRel = `${dir}/meta.yaml`;
35
+ const raw = await c.readText(metaRel);
36
+ if (raw == null) {
37
+ if (finalized)
38
+ diags.push((0, diagnostics_1.err)(contract_1.Codes.L1_LOGS_META_MISSING, metaRel, "logs/ is present but logs/meta.yaml is missing"));
39
+ return;
40
+ }
41
+ let meta;
42
+ try {
43
+ meta = (0, yaml_1.parseYaml)(raw);
44
+ }
45
+ catch (e) {
46
+ diags.push((0, diagnostics_1.err)(contract_1.Codes.L1_LOGS_META_INVALID, metaRel, `logs/meta.yaml is not valid YAML: ${e?.message ?? e}`));
47
+ return;
48
+ }
49
+ if (!logsMeta(meta)) {
50
+ for (const e of logsMeta.errors ?? []) {
51
+ diags.push((0, diagnostics_1.err)(contract_1.Codes.L1_LOGS_META_INVALID, `${metaRel}${e.instancePath || ""}`, `${e.instancePath || "/"} ${e.message ?? "schema violation"}`));
52
+ }
53
+ return; // can't trust file declarations if the shape is wrong
54
+ }
55
+ for (const entry of meta.logs) {
56
+ const file = entry?.file;
57
+ if (typeof file !== "string")
58
+ continue;
59
+ if (!(0, checks_1.isContained)(file)) {
60
+ diags.push((0, diagnostics_1.err)(contract_1.Codes.L1_LOG_PATH_ESCAPE, metaRel, `declared log file "${file}" escapes logs/`));
61
+ continue;
62
+ }
63
+ if (!(await c.exists(`${dir}/${file}`))) {
64
+ diags.push((0, diagnostics_1.err)(contract_1.Codes.L1_LOG_FILE_MISSING, `${dir}/${file}`, `declared log file "${file}" does not exist`));
65
+ }
66
+ }
67
+ }
68
+ async function checkSteps(c, diags, base, finalized, result) {
69
+ const dir = `${base}/steps`;
70
+ if (!(await c.isDir(dir))) {
71
+ if (finalized)
72
+ diags.push((0, diagnostics_1.err)(contract_1.Codes.L1_STEPS_MISSING, `${dir}/`, "L1 requires a steps/ directory"));
73
+ return;
74
+ }
75
+ const steps = Array.isArray(result?.steps) ? result.steps : [];
76
+ const stepKeys = new Set(steps.map((s) => `${s?.ordinal}-${s?.id}`));
77
+ for (const entry of await c.listDir(dir)) {
78
+ if (!entry.isDir)
79
+ continue;
80
+ const m = entry.name.match(/^(\d+)-(.+)$/);
81
+ if (!m) {
82
+ diags.push((0, diagnostics_1.err)(contract_1.Codes.L1_STEPS_MALFORMED, `${dir}/${entry.name}`, `step folder "${entry.name}" is not <ordinal>-<id>`));
83
+ continue;
84
+ }
85
+ if (!stepKeys.has(`${Number(m[1])}-${m[2]}`)) {
86
+ diags.push((0, diagnostics_1.err)(contract_1.Codes.L1_STEPS_UNMATCHED, `${dir}/${entry.name}`, `step folder "${entry.name}" matches no result.yaml step`));
87
+ continue;
88
+ }
89
+ const files = await c.listDir(`${dir}/${entry.name}`);
90
+ const hasShot = files.some((f) => !f.isDir && /^screenshot\.[^.]+$/i.test(f.name));
91
+ if (!hasShot) {
92
+ // Advisory only (decision 0040): not every framework captures a frame per
93
+ // step; a missing screenshot never fails the pack.
94
+ diags.push((0, diagnostics_1.warn)(contract_1.Codes.L1_STEPS_SCREENSHOT_MISSING, `${dir}/${entry.name}`, `step folder "${entry.name}" has no screenshot.<ext>`));
95
+ }
96
+ }
97
+ }
98
+ async function checkVideo(c, diags, base, video) {
99
+ const rel = `${base}/video.yaml`;
100
+ const raw = await c.readText(rel);
101
+ if (raw == null)
102
+ return; // optional; an inline video.<ext> is opaque
103
+ let v;
104
+ try {
105
+ v = (0, yaml_1.parseYaml)(raw);
106
+ }
107
+ catch (e) {
108
+ diags.push((0, diagnostics_1.err)(contract_1.Codes.L1_VIDEO_INVALID, rel, `video.yaml is not valid YAML: ${e?.message ?? e}`));
109
+ return;
110
+ }
111
+ if (!video(v)) {
112
+ for (const e of video.errors ?? []) {
113
+ diags.push((0, diagnostics_1.err)(contract_1.Codes.L1_VIDEO_INVALID, `${rel}${e.instancePath || ""}`, `${e.instancePath || "/"} ${e.message ?? "schema violation"}`));
114
+ }
115
+ }
116
+ }
117
+ //# sourceMappingURL=l1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l1.js","sourceRoot":"","sources":["../../src/validate/l1.ts"],"names":[],"mappings":"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"}
package/dist/yaml.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import type { Document } from "yaml";
2
+ export declare function parseYaml(raw: string): unknown;
3
+ export declare function parseDoc(raw: string): Document.Parsed;
4
+ export declare function stringifyDoc(doc: Document.Parsed): string;
package/dist/yaml.js ADDED
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseYaml = parseYaml;
4
+ exports.parseDoc = parseDoc;
5
+ exports.stringifyDoc = stringifyDoc;
6
+ const yaml_1 = require("yaml");
7
+ function parseYaml(raw) {
8
+ return (0, yaml_1.parse)(raw);
9
+ }
10
+ function parseDoc(raw) {
11
+ return (0, yaml_1.parseDocument)(raw);
12
+ }
13
+ function stringifyDoc(doc) {
14
+ return doc.toString();
15
+ }
16
+ //# sourceMappingURL=yaml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml.js","sourceRoot":"","sources":["../src/yaml.ts"],"names":[],"mappings":";;AAGA,8BAEC;AAED,4BAEC;AAED,oCAEC;AAbD,+BAA4C;AAG5C,SAAgB,SAAS,CAAC,GAAW;IACnC,OAAO,IAAA,YAAK,EAAC,GAAG,CAAC,CAAC;AACpB,CAAC;AAED,SAAgB,QAAQ,CAAC,GAAW;IAClC,OAAO,IAAA,oBAAa,EAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,SAAgB,YAAY,CAAC,GAAoB;IAC/C,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "@testmuai/evidence-cli",
3
+ "version": "0.1.1",
4
+ "description": "An open, framework-agnostic format for what a test run produced — the .evidence pack, and the library + CLI that validate and seal it.",
5
+ "license": "Apache-2.0",
6
+ "author": "TestMu AI (formerly LambdaTest)",
7
+ "homepage": "https://github.com/LambdaTest/evidence-cli#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/LambdaTest/evidence-cli.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/LambdaTest/evidence-cli/issues"
14
+ },
15
+ "keywords": [
16
+ "evidence",
17
+ "test-results",
18
+ "test-report",
19
+ "conformance",
20
+ "json-schema",
21
+ "validation",
22
+ "ci",
23
+ "test-automation",
24
+ "framework-agnostic"
25
+ ],
26
+ "engines": {
27
+ "node": ">=18"
28
+ },
29
+ "bin": {
30
+ "evidence": "dist/cli.js"
31
+ },
32
+ "main": "dist/index.js",
33
+ "types": "dist/index.d.ts",
34
+ "exports": {
35
+ ".": {
36
+ "types": "./dist/index.d.ts",
37
+ "default": "./dist/index.js"
38
+ },
39
+ "./package.json": "./package.json"
40
+ },
41
+ "files": [
42
+ "dist"
43
+ ],
44
+ "publishConfig": {
45
+ "access": "public"
46
+ },
47
+ "scripts": {
48
+ "build": "tsc -p tsconfig.build.json && node scripts/copy-schemas.mjs",
49
+ "prepack": "npm run build",
50
+ "test": "vitest run",
51
+ "test:watch": "vitest",
52
+ "docs": "npm --prefix design/web run dev",
53
+ "docs:build": "npm --prefix design/web run build",
54
+ "docs:install": "npm --prefix design/web install"
55
+ },
56
+ "dependencies": {
57
+ "adm-zip": "^0.5.14",
58
+ "ajv": "^8.17.1",
59
+ "ajv-formats": "^3.0.1",
60
+ "commander": "^12.1.0",
61
+ "picocolors": "^1.0.1",
62
+ "yaml": "^2.5.0"
63
+ },
64
+ "devDependencies": {
65
+ "@types/adm-zip": "^0.5.5",
66
+ "@types/node": "^20.14.0",
67
+ "typescript": "^5.5.0",
68
+ "vitest": "^2.0.0"
69
+ }
70
+ }