ppef 1.0.1 → 1.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.
Files changed (175) hide show
  1. package/bin/ppef.mjs +20 -0
  2. package/dist/__tests__/framework-pipeline.integration.test.js +13 -11
  3. package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -1
  4. package/dist/__tests__/index-exports.unit.test.d.ts +8 -0
  5. package/dist/__tests__/index-exports.unit.test.d.ts.map +1 -0
  6. package/dist/__tests__/index-exports.unit.test.js +127 -0
  7. package/dist/__tests__/index-exports.unit.test.js.map +1 -0
  8. package/dist/__tests__/registry-executor.integration.test.js +12 -9
  9. package/dist/__tests__/registry-executor.integration.test.js.map +1 -1
  10. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts +7 -0
  11. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts.map +1 -0
  12. package/dist/aggregation/__tests__/aggregators.unit.test.js +350 -0
  13. package/dist/aggregation/__tests__/aggregators.unit.test.js.map +1 -0
  14. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts +7 -0
  15. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts.map +1 -0
  16. package/dist/aggregation/__tests__/pipeline.unit.test.js +213 -0
  17. package/dist/aggregation/__tests__/pipeline.unit.test.js.map +1 -0
  18. package/dist/aggregation/aggregators.d.ts +9 -0
  19. package/dist/aggregation/aggregators.d.ts.map +1 -1
  20. package/dist/aggregation/aggregators.js +1 -1
  21. package/dist/aggregation/aggregators.js.map +1 -1
  22. package/dist/aggregation/index.d.ts +1 -1
  23. package/dist/aggregation/index.d.ts.map +1 -1
  24. package/dist/aggregation/index.js +1 -1
  25. package/dist/aggregation/index.js.map +1 -1
  26. package/dist/claims/__tests__/evaluator.unit.test.d.ts +12 -0
  27. package/dist/claims/__tests__/evaluator.unit.test.d.ts.map +1 -0
  28. package/dist/claims/__tests__/evaluator.unit.test.js +801 -0
  29. package/dist/claims/__tests__/evaluator.unit.test.js.map +1 -0
  30. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts +7 -0
  31. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts.map +1 -0
  32. package/dist/cli/__tests__/aggregate.command.unit.test.js +396 -0
  33. package/dist/cli/__tests__/aggregate.command.unit.test.js.map +1 -0
  34. package/dist/cli/__tests__/commands.unit.test.d.ts +10 -0
  35. package/dist/cli/__tests__/commands.unit.test.d.ts.map +1 -0
  36. package/dist/cli/__tests__/commands.unit.test.js +217 -0
  37. package/dist/cli/__tests__/commands.unit.test.js.map +1 -0
  38. package/dist/cli/__tests__/index.unit.test.d.ts +10 -0
  39. package/dist/cli/__tests__/index.unit.test.d.ts.map +1 -0
  40. package/dist/cli/__tests__/index.unit.test.js +65 -0
  41. package/dist/cli/__tests__/index.unit.test.js.map +1 -0
  42. package/dist/cli/__tests__/logger.unit.test.d.ts +11 -0
  43. package/dist/cli/__tests__/logger.unit.test.d.ts.map +1 -0
  44. package/dist/cli/__tests__/logger.unit.test.js +180 -0
  45. package/dist/cli/__tests__/logger.unit.test.js.map +1 -0
  46. package/dist/cli/__tests__/module-loader.unit.test.d.ts +11 -0
  47. package/dist/cli/__tests__/module-loader.unit.test.d.ts.map +1 -0
  48. package/dist/cli/__tests__/module-loader.unit.test.js +262 -0
  49. package/dist/cli/__tests__/module-loader.unit.test.js.map +1 -0
  50. package/dist/cli/__tests__/output-writer.unit.test.d.ts +10 -0
  51. package/dist/cli/__tests__/output-writer.unit.test.d.ts.map +1 -0
  52. package/dist/cli/__tests__/output-writer.unit.test.js +216 -0
  53. package/dist/cli/__tests__/output-writer.unit.test.js.map +1 -0
  54. package/dist/cli/__tests__/plan.command.unit.test.d.ts +7 -0
  55. package/dist/cli/__tests__/plan.command.unit.test.d.ts.map +1 -0
  56. package/dist/cli/__tests__/plan.command.unit.test.js +289 -0
  57. package/dist/cli/__tests__/plan.command.unit.test.js.map +1 -0
  58. package/dist/cli/__tests__/run.command.unit.test.d.ts +7 -0
  59. package/dist/cli/__tests__/run.command.unit.test.d.ts.map +1 -0
  60. package/dist/cli/__tests__/run.command.unit.test.js +422 -0
  61. package/dist/cli/__tests__/run.command.unit.test.js.map +1 -0
  62. package/dist/cli/__tests__/validate.command.unit.test.d.ts +7 -0
  63. package/dist/cli/__tests__/validate.command.unit.test.d.ts.map +1 -0
  64. package/dist/cli/__tests__/validate.command.unit.test.js +226 -0
  65. package/dist/cli/__tests__/validate.command.unit.test.js.map +1 -0
  66. package/dist/cli/command-deps.d.ts +125 -0
  67. package/dist/cli/command-deps.d.ts.map +1 -0
  68. package/dist/cli/command-deps.js +7 -0
  69. package/dist/cli/command-deps.js.map +1 -0
  70. package/dist/cli/commands/aggregate.d.ts +35 -0
  71. package/dist/cli/commands/aggregate.d.ts.map +1 -0
  72. package/dist/cli/commands/aggregate.js +121 -0
  73. package/dist/cli/commands/aggregate.js.map +1 -0
  74. package/dist/cli/commands/plan.d.ts +36 -0
  75. package/dist/cli/commands/plan.d.ts.map +1 -0
  76. package/dist/cli/commands/plan.js +109 -0
  77. package/dist/cli/commands/plan.js.map +1 -0
  78. package/dist/cli/commands/run.d.ts +33 -0
  79. package/dist/cli/commands/run.d.ts.map +1 -0
  80. package/dist/cli/commands/run.js +185 -0
  81. package/dist/cli/commands/run.js.map +1 -0
  82. package/dist/cli/commands/validate.d.ts +27 -0
  83. package/dist/cli/commands/validate.d.ts.map +1 -0
  84. package/dist/cli/commands/validate.js +88 -0
  85. package/dist/cli/commands/validate.js.map +1 -0
  86. package/dist/cli/config-loader.d.ts +30 -0
  87. package/dist/cli/config-loader.d.ts.map +1 -0
  88. package/dist/cli/config-loader.js +181 -0
  89. package/dist/cli/config-loader.js.map +1 -0
  90. package/dist/cli/index.d.ts +26 -0
  91. package/dist/cli/index.d.ts.map +1 -0
  92. package/dist/cli/index.js +58 -0
  93. package/dist/cli/index.js.map +1 -0
  94. package/dist/cli/logger.d.ts +75 -0
  95. package/dist/cli/logger.d.ts.map +1 -0
  96. package/dist/cli/logger.js +131 -0
  97. package/dist/cli/logger.js.map +1 -0
  98. package/dist/cli/module-loader.d.ts +46 -0
  99. package/dist/cli/module-loader.d.ts.map +1 -0
  100. package/dist/cli/module-loader.js +116 -0
  101. package/dist/cli/module-loader.js.map +1 -0
  102. package/dist/cli/output-writer.d.ts +51 -0
  103. package/dist/cli/output-writer.d.ts.map +1 -0
  104. package/dist/cli/output-writer.js +65 -0
  105. package/dist/cli/output-writer.js.map +1 -0
  106. package/dist/cli/types.d.ts +174 -0
  107. package/dist/cli/types.d.ts.map +1 -0
  108. package/dist/cli/types.js +7 -0
  109. package/dist/cli/types.js.map +1 -0
  110. package/dist/collector/__tests__/result-collector.unit.test.d.ts +7 -0
  111. package/dist/collector/__tests__/result-collector.unit.test.d.ts.map +1 -0
  112. package/dist/collector/__tests__/result-collector.unit.test.js +1021 -0
  113. package/dist/collector/__tests__/result-collector.unit.test.js.map +1 -0
  114. package/dist/collector/__tests__/schema.unit.test.d.ts +7 -0
  115. package/dist/collector/__tests__/schema.unit.test.d.ts.map +1 -0
  116. package/dist/collector/__tests__/schema.unit.test.js +360 -0
  117. package/dist/collector/__tests__/schema.unit.test.js.map +1 -0
  118. package/dist/executor/__tests__/checkpoint-manager.unit.test.js +83 -1
  119. package/dist/executor/__tests__/checkpoint-manager.unit.test.js.map +1 -1
  120. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts +3 -6
  121. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts.map +1 -1
  122. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js +428 -159
  123. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js.map +1 -1
  124. package/dist/executor/__tests__/checkpoint-storage.unit.test.js +105 -1
  125. package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -1
  126. package/dist/executor/__tests__/executor.unit.test.js +69 -1
  127. package/dist/executor/__tests__/executor.unit.test.js.map +1 -1
  128. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts +7 -0
  129. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts.map +1 -0
  130. package/dist/executor/__tests__/memory-monitor.unit.test.js +285 -0
  131. package/dist/executor/__tests__/memory-monitor.unit.test.js.map +1 -0
  132. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts +2 -1
  133. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts.map +1 -1
  134. package/dist/executor/__tests__/parallel-executor.unit.test.js +426 -156
  135. package/dist/executor/__tests__/parallel-executor.unit.test.js.map +1 -1
  136. package/dist/executor/__tests__/run-id.unit.test.d.ts +8 -0
  137. package/dist/executor/__tests__/run-id.unit.test.d.ts.map +1 -0
  138. package/dist/executor/__tests__/run-id.unit.test.js +156 -0
  139. package/dist/executor/__tests__/run-id.unit.test.js.map +1 -0
  140. package/dist/executor/__tests__/worker-entry.integration.test.d.ts +24 -0
  141. package/dist/executor/__tests__/worker-entry.integration.test.d.ts.map +1 -0
  142. package/dist/executor/__tests__/worker-entry.integration.test.js +82 -0
  143. package/dist/executor/__tests__/worker-entry.integration.test.js.map +1 -0
  144. package/dist/executor/__tests__/worker-entry.unit.test.d.ts +7 -0
  145. package/dist/executor/__tests__/worker-entry.unit.test.d.ts.map +1 -0
  146. package/dist/executor/__tests__/worker-entry.unit.test.js +364 -0
  147. package/dist/executor/__tests__/worker-entry.unit.test.js.map +1 -0
  148. package/dist/executor/parallel-executor.d.ts +186 -0
  149. package/dist/executor/parallel-executor.d.ts.map +1 -1
  150. package/dist/executor/parallel-executor.js +218 -83
  151. package/dist/executor/parallel-executor.js.map +1 -1
  152. package/dist/executor/run-id.d.ts.map +1 -1
  153. package/dist/executor/run-id.js +8 -1
  154. package/dist/executor/run-id.js.map +1 -1
  155. package/dist/executor/worker-entry.d.ts +2 -0
  156. package/dist/executor/worker-entry.d.ts.map +1 -1
  157. package/dist/executor/worker-entry.js +29 -54
  158. package/dist/executor/worker-entry.js.map +1 -1
  159. package/dist/executor/worker-executor.d.ts +156 -0
  160. package/dist/executor/worker-executor.d.ts.map +1 -0
  161. package/dist/executor/worker-executor.js +88 -0
  162. package/dist/executor/worker-executor.js.map +1 -0
  163. package/dist/robustness/__tests__/analyzer.unit.test.d.ts +11 -0
  164. package/dist/robustness/__tests__/analyzer.unit.test.d.ts.map +1 -0
  165. package/dist/robustness/__tests__/analyzer.unit.test.js +455 -0
  166. package/dist/robustness/__tests__/analyzer.unit.test.js.map +1 -0
  167. package/dist/robustness/__tests__/perturbations.unit.test.d.ts +11 -0
  168. package/dist/robustness/__tests__/perturbations.unit.test.d.ts.map +1 -0
  169. package/dist/robustness/__tests__/perturbations.unit.test.js +284 -0
  170. package/dist/robustness/__tests__/perturbations.unit.test.js.map +1 -0
  171. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts +7 -0
  172. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts.map +1 -0
  173. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js +185 -0
  174. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js.map +1 -0
  175. package/package.json +8 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-loader.js","sourceRoot":"","sources":["../../src/cli/module-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Output Writer
3
+ *
4
+ * Handles writing results and aggregates to JSON files.
5
+ */
6
+ import type { AggregationOutput } from "../types/aggregate.js";
7
+ import type { EvaluationResult } from "../types/result.js";
8
+ /**
9
+ * Output format options.
10
+ */
11
+ export type OutputFormat = "json" | "json-pretty";
12
+ /**
13
+ * Result batch output format.
14
+ */
15
+ export interface ResultBatch {
16
+ /** Batch format version */
17
+ version: string;
18
+ /** Timestamp of generation */
19
+ timestamp: string;
20
+ /** Total results in batch */
21
+ count: number;
22
+ /** Evaluation results */
23
+ results: EvaluationResult[];
24
+ }
25
+ /**
26
+ * Write results to a JSON file.
27
+ *
28
+ * @param results - Results to write
29
+ * @param outputPath - Path to output file
30
+ * @param format - Output format
31
+ * @throws Error if file cannot be written
32
+ */
33
+ export declare function writeResults(results: EvaluationResult[], outputPath: string, format?: OutputFormat): Promise<void>;
34
+ /**
35
+ * Write aggregated results to a JSON file.
36
+ *
37
+ * @param aggregation - Aggregation output to write
38
+ * @param outputPath - Path to output file
39
+ * @param format - Output format
40
+ * @throws Error if file cannot be written
41
+ */
42
+ export declare function writeAggregates(aggregation: AggregationOutput, outputPath: string, format?: OutputFormat): Promise<void>;
43
+ /**
44
+ * Generate output filename based on experiment name and timestamp.
45
+ *
46
+ * @param experimentName - Name of the experiment
47
+ * @param type - Type of output ("results" or "aggregates")
48
+ * @returns Generated filename
49
+ */
50
+ export declare function generateOutputFilename(experimentName: string, type: "results" | "aggregates"): string;
51
+ //# sourceMappingURL=output-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-writer.d.ts","sourceRoot":"","sources":["../../src/cli/output-writer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,aAAa,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAEhB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAElB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IAEd,yBAAyB;IACzB,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CACjC,OAAO,EAAE,gBAAgB,EAAE,EAC3B,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,YAA4B,GAClC,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACpC,WAAW,EAAE,iBAAiB,EAC9B,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,YAA4B,GAClC,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACrC,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,SAAS,GAAG,YAAY,GAC5B,MAAM,CAIR"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Output Writer
3
+ *
4
+ * Handles writing results and aggregates to JSON files.
5
+ */
6
+ import { mkdir, writeFile } from "node:fs/promises";
7
+ import { dirname } from "node:path";
8
+ /**
9
+ * Write results to a JSON file.
10
+ *
11
+ * @param results - Results to write
12
+ * @param outputPath - Path to output file
13
+ * @param format - Output format
14
+ * @throws Error if file cannot be written
15
+ */
16
+ export async function writeResults(results, outputPath, format = "json-pretty") {
17
+ const batch = {
18
+ version: "1.0.0",
19
+ timestamp: new Date().toISOString(),
20
+ count: results.length,
21
+ results,
22
+ };
23
+ const json = format === "json-pretty" ? JSON.stringify(batch, null, 2) : JSON.stringify(batch);
24
+ await ensureDir(dirname(outputPath));
25
+ await writeFile(outputPath, json, "utf-8");
26
+ }
27
+ /**
28
+ * Write aggregated results to a JSON file.
29
+ *
30
+ * @param aggregation - Aggregation output to write
31
+ * @param outputPath - Path to output file
32
+ * @param format - Output format
33
+ * @throws Error if file cannot be written
34
+ */
35
+ export async function writeAggregates(aggregation, outputPath, format = "json-pretty") {
36
+ const json = format === "json-pretty" ? JSON.stringify(aggregation, null, 2) : JSON.stringify(aggregation);
37
+ await ensureDir(dirname(outputPath));
38
+ await writeFile(outputPath, json, "utf-8");
39
+ }
40
+ /**
41
+ * Generate output filename based on experiment name and timestamp.
42
+ *
43
+ * @param experimentName - Name of the experiment
44
+ * @param type - Type of output ("results" or "aggregates")
45
+ * @returns Generated filename
46
+ */
47
+ export function generateOutputFilename(experimentName, type) {
48
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-").slice(0, -5);
49
+ const sanitizedName = experimentName.replace(/[^a-z0-9]+/gi, "-").toLowerCase();
50
+ return `${sanitizedName}-${type}-${timestamp}.json`;
51
+ }
52
+ /**
53
+ * Ensure a directory exists, creating it if necessary.
54
+ *
55
+ * @param dirPath - Directory path
56
+ */
57
+ async function ensureDir(dirPath) {
58
+ try {
59
+ await mkdir(dirPath, { recursive: true });
60
+ }
61
+ catch {
62
+ // Ignore errors (directory may already exist)
63
+ }
64
+ }
65
+ //# sourceMappingURL=output-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-writer.js","sourceRoot":"","sources":["../../src/cli/output-writer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BpC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,OAA2B,EAC3B,UAAkB,EAClB,SAAuB,aAAa;IAEpC,MAAM,KAAK,GAAgB;QAC1B,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK,EAAE,OAAO,CAAC,MAAM;QACrB,OAAO;KACP,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAE/F,MAAM,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IACrC,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACpC,WAA8B,EAC9B,UAAkB,EAClB,SAAuB,aAAa;IAEpC,MAAM,IAAI,GACT,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAE/F,MAAM,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IACrC,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACrC,cAAsB,EACtB,IAA8B;IAE9B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAChF,OAAO,GAAG,aAAa,IAAI,IAAI,IAAI,SAAS,OAAO,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,SAAS,CAAC,OAAe;IACvC,IAAI,CAAC;QACJ,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACR,8CAA8C;IAC/C,CAAC;AACF,CAAC"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * CLI Type Definitions
3
+ *
4
+ * Types for the JSON experiment configuration and CLI options.
5
+ */
6
+ import type { SutRole } from "../types/sut.js";
7
+ /**
8
+ * Experiment metadata.
9
+ */
10
+ export interface ExperimentMeta {
11
+ /** Experiment name */
12
+ name: string;
13
+ /** Experiment description */
14
+ description?: string;
15
+ /** Version string */
16
+ version?: string;
17
+ }
18
+ /**
19
+ * Executor configuration from JSON.
20
+ */
21
+ export interface ExecutorConfig {
22
+ /** Continue execution if a single run fails */
23
+ continueOnError?: boolean;
24
+ /** Number of repetitions per case */
25
+ repetitions?: number;
26
+ /** Random seed base */
27
+ seedBase?: number;
28
+ /** Timeout per run in milliseconds (0 = no timeout) */
29
+ timeoutMs?: number;
30
+ /** Whether to collect provenance information */
31
+ collectProvenance?: boolean;
32
+ /** Number of concurrent runs */
33
+ concurrency?: number;
34
+ }
35
+ /**
36
+ * SUT configuration from JSON.
37
+ */
38
+ export interface SutConfig {
39
+ /** Unique SUT identifier */
40
+ id: string;
41
+ /** Path to module file (relative to config file) */
42
+ module: string;
43
+ /** Name of the export to use as factory */
44
+ exportName: string;
45
+ /** Optional configuration to pass to factory */
46
+ config?: Record<string, unknown>;
47
+ /** SUT registration metadata */
48
+ registration: {
49
+ /** Human-readable name */
50
+ name: string;
51
+ /** Version string */
52
+ version: string;
53
+ /** Role in evaluation */
54
+ role: SutRole;
55
+ /** Searchable tags */
56
+ tags?: string[];
57
+ /** Optional description */
58
+ description?: string;
59
+ };
60
+ }
61
+ /**
62
+ * Case configuration from JSON.
63
+ */
64
+ export interface CaseConfig {
65
+ /** Unique case identifier */
66
+ id: string;
67
+ /** Path to module file (relative to config file) */
68
+ module: string;
69
+ /** Name of the export to use as case factory */
70
+ exportName: string;
71
+ }
72
+ /**
73
+ * Metrics extractor configuration from JSON.
74
+ */
75
+ export interface MetricsExtractorConfig {
76
+ /** Path to module file (relative to config file) */
77
+ module: string;
78
+ /** Name of the export to use as metrics extractor */
79
+ exportName: string;
80
+ }
81
+ /**
82
+ * Output configuration from JSON.
83
+ */
84
+ export interface OutputConfig {
85
+ /** Output directory path */
86
+ path?: string;
87
+ /** Output format: "json" or "json-pretty" */
88
+ format?: "json" | "json-pretty";
89
+ /** Whether to aggregate results */
90
+ aggregate?: boolean;
91
+ }
92
+ /**
93
+ * Complete experiment configuration from JSON.
94
+ */
95
+ export interface ExperimentConfig {
96
+ /** Experiment metadata */
97
+ experiment: ExperimentMeta;
98
+ /** Executor configuration */
99
+ executor: ExecutorConfig;
100
+ /** SUTs to evaluate */
101
+ suts: SutConfig[];
102
+ /** Test cases to run */
103
+ cases: CaseConfig[];
104
+ /** Metrics extractor configuration */
105
+ metricsExtractor: MetricsExtractorConfig;
106
+ /** Output configuration */
107
+ output: OutputConfig;
108
+ }
109
+ /**
110
+ * CLI command options.
111
+ */
112
+ export interface CliOptions {
113
+ /** Path to config file */
114
+ config?: string;
115
+ /** Output directory override */
116
+ output?: string;
117
+ /** Output format */
118
+ format?: "json" | "json-pretty";
119
+ /** Skip aggregation */
120
+ noAggregate?: boolean;
121
+ /** Override concurrency */
122
+ jobs?: number;
123
+ /** Verbose logging */
124
+ verbose?: boolean;
125
+ /** Suppress output */
126
+ quiet?: boolean;
127
+ /** Dry run (plan without executing) */
128
+ dryRun?: boolean;
129
+ }
130
+ /**
131
+ * Validation result.
132
+ */
133
+ export interface ValidationResult {
134
+ /** Whether validation passed */
135
+ valid: boolean;
136
+ /** Validation errors */
137
+ errors: string[];
138
+ /** Validation warnings */
139
+ warnings: string[];
140
+ }
141
+ /**
142
+ * Loaded and validated experiment configuration.
143
+ */
144
+ export interface LoadedConfig {
145
+ /** Parsed experiment configuration */
146
+ config: ExperimentConfig;
147
+ /** Directory containing the config file (for resolving module paths) */
148
+ baseDir: string;
149
+ /** Absolute path to config file */
150
+ configPath: string;
151
+ }
152
+ /**
153
+ * Module export types for dynamic loading.
154
+ */
155
+ export type SutFactoryExport = (config?: Record<string, unknown>) => {
156
+ id: string;
157
+ config?: Record<string, unknown>;
158
+ run: (inputs: unknown) => Promise<unknown>;
159
+ };
160
+ export type CaseDefinitionExport = () => {
161
+ case: {
162
+ caseId: string;
163
+ name?: string;
164
+ caseClass?: string;
165
+ inputs: unknown;
166
+ expectedOutput?: unknown;
167
+ version?: string;
168
+ tags?: readonly string[];
169
+ };
170
+ getInput: () => Promise<unknown>;
171
+ getInputs: () => unknown;
172
+ };
173
+ export type MetricsExtractorExport = (result: unknown) => Record<string, number>;
174
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * CLI Type Definitions
3
+ *
4
+ * Types for the JSON experiment configuration and CLI options.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Unit tests for ResultCollector
3
+ *
4
+ * Tests result collection, validation, querying, and serialization.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=result-collector.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-collector.unit.test.d.ts","sourceRoot":"","sources":["../../../src/collector/__tests__/result-collector.unit.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}