ppef 1.0.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/README.md +76 -125
  2. package/bin/ppef.mjs +20 -0
  3. package/dist/__tests__/cli/evaluate-command.integration.test.d.ts +8 -0
  4. package/dist/__tests__/cli/evaluate-command.integration.test.d.ts.map +1 -0
  5. package/dist/__tests__/cli/evaluate-command.integration.test.js +308 -0
  6. package/dist/__tests__/cli/evaluate-command.integration.test.js.map +1 -0
  7. package/dist/__tests__/evaluators/claims-evaluator.unit.test.d.ts +8 -0
  8. package/dist/__tests__/evaluators/claims-evaluator.unit.test.d.ts.map +1 -0
  9. package/dist/__tests__/evaluators/claims-evaluator.unit.test.js +405 -0
  10. package/dist/__tests__/evaluators/claims-evaluator.unit.test.js.map +1 -0
  11. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.d.ts +8 -0
  12. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.d.ts.map +1 -0
  13. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.js +424 -0
  14. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.js.map +1 -0
  15. package/dist/__tests__/evaluators/registry.unit.test.d.ts +7 -0
  16. package/dist/__tests__/evaluators/registry.unit.test.d.ts.map +1 -0
  17. package/dist/__tests__/evaluators/registry.unit.test.js +173 -0
  18. package/dist/__tests__/evaluators/registry.unit.test.js.map +1 -0
  19. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.d.ts +8 -0
  20. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.d.ts.map +1 -0
  21. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.js +260 -0
  22. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.js.map +1 -0
  23. package/dist/__tests__/framework-pipeline.integration.test.js +49 -20
  24. package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -1
  25. package/dist/__tests__/index-exports.unit.test.d.ts +8 -0
  26. package/dist/__tests__/index-exports.unit.test.d.ts.map +1 -0
  27. package/dist/__tests__/index-exports.unit.test.js +124 -0
  28. package/dist/__tests__/index-exports.unit.test.js.map +1 -0
  29. package/dist/__tests__/registry-executor.integration.test.js +12 -9
  30. package/dist/__tests__/registry-executor.integration.test.js.map +1 -1
  31. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts +7 -0
  32. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts.map +1 -0
  33. package/dist/aggregation/__tests__/aggregators.unit.test.js +350 -0
  34. package/dist/aggregation/__tests__/aggregators.unit.test.js.map +1 -0
  35. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts +7 -0
  36. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts.map +1 -0
  37. package/dist/aggregation/__tests__/pipeline.unit.test.js +213 -0
  38. package/dist/aggregation/__tests__/pipeline.unit.test.js.map +1 -0
  39. package/dist/aggregation/aggregators.d.ts +9 -0
  40. package/dist/aggregation/aggregators.d.ts.map +1 -1
  41. package/dist/aggregation/aggregators.js +1 -1
  42. package/dist/aggregation/aggregators.js.map +1 -1
  43. package/dist/aggregation/index.d.ts +1 -1
  44. package/dist/aggregation/index.d.ts.map +1 -1
  45. package/dist/aggregation/index.js +1 -1
  46. package/dist/aggregation/index.js.map +1 -1
  47. package/dist/aggregation/pipeline.d.ts.map +1 -1
  48. package/dist/aggregation/pipeline.js +40 -3
  49. package/dist/aggregation/pipeline.js.map +1 -1
  50. package/dist/claims/index.d.ts +6 -3
  51. package/dist/claims/index.d.ts.map +1 -1
  52. package/dist/claims/index.js +6 -3
  53. package/dist/claims/index.js.map +1 -1
  54. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts +7 -0
  55. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts.map +1 -0
  56. package/dist/cli/__tests__/aggregate.command.unit.test.js +399 -0
  57. package/dist/cli/__tests__/aggregate.command.unit.test.js.map +1 -0
  58. package/dist/cli/__tests__/binary-sut.integration.test.d.ts +8 -0
  59. package/dist/cli/__tests__/binary-sut.integration.test.d.ts.map +1 -0
  60. package/dist/cli/__tests__/binary-sut.integration.test.js +165 -0
  61. package/dist/cli/__tests__/binary-sut.integration.test.js.map +1 -0
  62. package/dist/cli/__tests__/commands.unit.test.d.ts +10 -0
  63. package/dist/cli/__tests__/commands.unit.test.d.ts.map +1 -0
  64. package/dist/cli/__tests__/commands.unit.test.js +217 -0
  65. package/dist/cli/__tests__/commands.unit.test.js.map +1 -0
  66. package/dist/cli/__tests__/config-loader.unit.test.d.ts +7 -0
  67. package/dist/cli/__tests__/config-loader.unit.test.d.ts.map +1 -0
  68. package/dist/cli/__tests__/config-loader.unit.test.js +611 -0
  69. package/dist/cli/__tests__/config-loader.unit.test.js.map +1 -0
  70. package/dist/cli/__tests__/index.unit.test.d.ts +10 -0
  71. package/dist/cli/__tests__/index.unit.test.d.ts.map +1 -0
  72. package/dist/cli/__tests__/index.unit.test.js +65 -0
  73. package/dist/cli/__tests__/index.unit.test.js.map +1 -0
  74. package/dist/cli/__tests__/logger.unit.test.d.ts +11 -0
  75. package/dist/cli/__tests__/logger.unit.test.d.ts.map +1 -0
  76. package/dist/cli/__tests__/logger.unit.test.js +180 -0
  77. package/dist/cli/__tests__/logger.unit.test.js.map +1 -0
  78. package/dist/cli/__tests__/module-loader.unit.test.d.ts +11 -0
  79. package/dist/cli/__tests__/module-loader.unit.test.d.ts.map +1 -0
  80. package/dist/cli/__tests__/module-loader.unit.test.js +262 -0
  81. package/dist/cli/__tests__/module-loader.unit.test.js.map +1 -0
  82. package/dist/cli/__tests__/output-writer.unit.test.d.ts +10 -0
  83. package/dist/cli/__tests__/output-writer.unit.test.d.ts.map +1 -0
  84. package/dist/cli/__tests__/output-writer.unit.test.js +216 -0
  85. package/dist/cli/__tests__/output-writer.unit.test.js.map +1 -0
  86. package/dist/cli/__tests__/plan.command.unit.test.d.ts +7 -0
  87. package/dist/cli/__tests__/plan.command.unit.test.d.ts.map +1 -0
  88. package/dist/cli/__tests__/plan.command.unit.test.js +289 -0
  89. package/dist/cli/__tests__/plan.command.unit.test.js.map +1 -0
  90. package/dist/cli/__tests__/run.command.unit.test.d.ts +7 -0
  91. package/dist/cli/__tests__/run.command.unit.test.d.ts.map +1 -0
  92. package/dist/cli/__tests__/run.command.unit.test.js +422 -0
  93. package/dist/cli/__tests__/run.command.unit.test.js.map +1 -0
  94. package/dist/cli/__tests__/validate.command.unit.test.d.ts +7 -0
  95. package/dist/cli/__tests__/validate.command.unit.test.d.ts.map +1 -0
  96. package/dist/cli/__tests__/validate.command.unit.test.js +226 -0
  97. package/dist/cli/__tests__/validate.command.unit.test.js.map +1 -0
  98. package/dist/cli/command-deps.d.ts +137 -0
  99. package/dist/cli/command-deps.d.ts.map +1 -0
  100. package/dist/cli/command-deps.js +7 -0
  101. package/dist/cli/command-deps.js.map +1 -0
  102. package/dist/cli/commands/aggregate.d.ts +35 -0
  103. package/dist/cli/commands/aggregate.d.ts.map +1 -0
  104. package/dist/cli/commands/aggregate.js +124 -0
  105. package/dist/cli/commands/aggregate.js.map +1 -0
  106. package/dist/cli/commands/evaluate.d.ts +41 -0
  107. package/dist/cli/commands/evaluate.d.ts.map +1 -0
  108. package/dist/cli/commands/evaluate.js +287 -0
  109. package/dist/cli/commands/evaluate.js.map +1 -0
  110. package/dist/cli/commands/plan.d.ts +36 -0
  111. package/dist/cli/commands/plan.d.ts.map +1 -0
  112. package/dist/cli/commands/plan.js +109 -0
  113. package/dist/cli/commands/plan.js.map +1 -0
  114. package/dist/cli/commands/run.d.ts +33 -0
  115. package/dist/cli/commands/run.d.ts.map +1 -0
  116. package/dist/cli/commands/run.js +277 -0
  117. package/dist/cli/commands/run.js.map +1 -0
  118. package/dist/cli/commands/validate.d.ts +27 -0
  119. package/dist/cli/commands/validate.d.ts.map +1 -0
  120. package/dist/cli/commands/validate.js +88 -0
  121. package/dist/cli/commands/validate.js.map +1 -0
  122. package/dist/cli/config-loader.d.ts +30 -0
  123. package/dist/cli/config-loader.d.ts.map +1 -0
  124. package/dist/cli/config-loader.js +181 -0
  125. package/dist/cli/config-loader.js.map +1 -0
  126. package/dist/cli/index.d.ts +27 -0
  127. package/dist/cli/index.d.ts.map +1 -0
  128. package/dist/cli/index.js +60 -0
  129. package/dist/cli/index.js.map +1 -0
  130. package/dist/cli/logger.d.ts +75 -0
  131. package/dist/cli/logger.d.ts.map +1 -0
  132. package/dist/cli/logger.js +131 -0
  133. package/dist/cli/logger.js.map +1 -0
  134. package/dist/cli/module-loader.d.ts +68 -0
  135. package/dist/cli/module-loader.d.ts.map +1 -0
  136. package/dist/cli/module-loader.js +134 -0
  137. package/dist/cli/module-loader.js.map +1 -0
  138. package/dist/cli/output-writer.d.ts +51 -0
  139. package/dist/cli/output-writer.d.ts.map +1 -0
  140. package/dist/cli/output-writer.js +65 -0
  141. package/dist/cli/output-writer.js.map +1 -0
  142. package/dist/cli/types.d.ts +193 -0
  143. package/dist/cli/types.d.ts.map +1 -0
  144. package/dist/cli/types.js +7 -0
  145. package/dist/cli/types.js.map +1 -0
  146. package/dist/collector/__tests__/result-collector.unit.test.d.ts +7 -0
  147. package/dist/collector/__tests__/result-collector.unit.test.d.ts.map +1 -0
  148. package/dist/collector/__tests__/result-collector.unit.test.js +1021 -0
  149. package/dist/collector/__tests__/result-collector.unit.test.js.map +1 -0
  150. package/dist/collector/__tests__/schema.unit.test.d.ts +7 -0
  151. package/dist/collector/__tests__/schema.unit.test.d.ts.map +1 -0
  152. package/dist/collector/__tests__/schema.unit.test.js +360 -0
  153. package/dist/collector/__tests__/schema.unit.test.js.map +1 -0
  154. package/dist/evaluators/claims-evaluator.d.ts +87 -0
  155. package/dist/evaluators/claims-evaluator.d.ts.map +1 -0
  156. package/dist/evaluators/claims-evaluator.js +289 -0
  157. package/dist/evaluators/claims-evaluator.js.map +1 -0
  158. package/dist/evaluators/exploratory-evaluator.d.ts +136 -0
  159. package/dist/evaluators/exploratory-evaluator.d.ts.map +1 -0
  160. package/dist/evaluators/exploratory-evaluator.js +545 -0
  161. package/dist/evaluators/exploratory-evaluator.js.map +1 -0
  162. package/dist/evaluators/index.d.ts +13 -0
  163. package/dist/evaluators/index.d.ts.map +1 -0
  164. package/dist/evaluators/index.js +14 -0
  165. package/dist/evaluators/index.js.map +1 -0
  166. package/dist/evaluators/metrics-evaluator.d.ts +114 -0
  167. package/dist/evaluators/metrics-evaluator.d.ts.map +1 -0
  168. package/dist/evaluators/metrics-evaluator.js +433 -0
  169. package/dist/evaluators/metrics-evaluator.js.map +1 -0
  170. package/dist/evaluators/registry.d.ts +106 -0
  171. package/dist/evaluators/registry.d.ts.map +1 -0
  172. package/dist/evaluators/registry.js +148 -0
  173. package/dist/evaluators/registry.js.map +1 -0
  174. package/dist/evaluators/robustness-evaluator.d.ts +57 -0
  175. package/dist/evaluators/robustness-evaluator.d.ts.map +1 -0
  176. package/dist/evaluators/robustness-evaluator.js +186 -0
  177. package/dist/evaluators/robustness-evaluator.js.map +1 -0
  178. package/dist/executor/__tests__/binary-sut.unit.test.d.ts +8 -0
  179. package/dist/executor/__tests__/binary-sut.unit.test.d.ts.map +1 -0
  180. package/dist/executor/__tests__/binary-sut.unit.test.js +313 -0
  181. package/dist/executor/__tests__/binary-sut.unit.test.js.map +1 -0
  182. package/dist/executor/__tests__/checkpoint-manager.unit.test.js +83 -1
  183. package/dist/executor/__tests__/checkpoint-manager.unit.test.js.map +1 -1
  184. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts +3 -6
  185. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts.map +1 -1
  186. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js +428 -159
  187. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js.map +1 -1
  188. package/dist/executor/__tests__/checkpoint-storage.unit.test.js +148 -1
  189. package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -1
  190. package/dist/executor/__tests__/executor.unit.test.js +123 -8
  191. package/dist/executor/__tests__/executor.unit.test.js.map +1 -1
  192. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts +7 -0
  193. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts.map +1 -0
  194. package/dist/executor/__tests__/memory-monitor.unit.test.js +285 -0
  195. package/dist/executor/__tests__/memory-monitor.unit.test.js.map +1 -0
  196. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts +2 -1
  197. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts.map +1 -1
  198. package/dist/executor/__tests__/parallel-executor.unit.test.js +426 -156
  199. package/dist/executor/__tests__/parallel-executor.unit.test.js.map +1 -1
  200. package/dist/executor/__tests__/resource-calculator.unit.test.d.ts +10 -0
  201. package/dist/executor/__tests__/resource-calculator.unit.test.d.ts.map +1 -0
  202. package/dist/executor/__tests__/resource-calculator.unit.test.js +104 -0
  203. package/dist/executor/__tests__/resource-calculator.unit.test.js.map +1 -0
  204. package/dist/executor/__tests__/run-id.unit.test.d.ts +8 -0
  205. package/dist/executor/__tests__/run-id.unit.test.d.ts.map +1 -0
  206. package/dist/executor/__tests__/run-id.unit.test.js +156 -0
  207. package/dist/executor/__tests__/run-id.unit.test.js.map +1 -0
  208. package/dist/executor/__tests__/worker-entry.integration.test.d.ts +24 -0
  209. package/dist/executor/__tests__/worker-entry.integration.test.d.ts.map +1 -0
  210. package/dist/executor/__tests__/worker-entry.integration.test.js +82 -0
  211. package/dist/executor/__tests__/worker-entry.integration.test.js.map +1 -0
  212. package/dist/executor/__tests__/worker-entry.unit.test.d.ts +7 -0
  213. package/dist/executor/__tests__/worker-entry.unit.test.d.ts.map +1 -0
  214. package/dist/executor/__tests__/worker-entry.unit.test.js +364 -0
  215. package/dist/executor/__tests__/worker-entry.unit.test.js.map +1 -0
  216. package/dist/executor/__tests__/worker-threads-executor.unit.test.d.ts +8 -0
  217. package/dist/executor/__tests__/worker-threads-executor.unit.test.d.ts.map +1 -0
  218. package/dist/executor/__tests__/worker-threads-executor.unit.test.js +276 -0
  219. package/dist/executor/__tests__/worker-threads-executor.unit.test.js.map +1 -0
  220. package/dist/executor/binary-sut.d.ts +105 -0
  221. package/dist/executor/binary-sut.d.ts.map +1 -0
  222. package/dist/executor/binary-sut.js +174 -0
  223. package/dist/executor/binary-sut.js.map +1 -0
  224. package/dist/executor/checkpoint-storage.d.ts.map +1 -1
  225. package/dist/executor/checkpoint-storage.js +6 -4
  226. package/dist/executor/checkpoint-storage.js.map +1 -1
  227. package/dist/executor/executor.d.ts +28 -0
  228. package/dist/executor/executor.d.ts.map +1 -1
  229. package/dist/executor/executor.js +85 -24
  230. package/dist/executor/executor.js.map +1 -1
  231. package/dist/executor/index.d.ts +4 -0
  232. package/dist/executor/index.d.ts.map +1 -1
  233. package/dist/executor/index.js +4 -0
  234. package/dist/executor/index.js.map +1 -1
  235. package/dist/executor/parallel-executor.d.ts +186 -0
  236. package/dist/executor/parallel-executor.d.ts.map +1 -1
  237. package/dist/executor/parallel-executor.js +218 -83
  238. package/dist/executor/parallel-executor.js.map +1 -1
  239. package/dist/executor/resource-calculator.d.ts +49 -0
  240. package/dist/executor/resource-calculator.d.ts.map +1 -0
  241. package/dist/executor/resource-calculator.js +129 -0
  242. package/dist/executor/resource-calculator.js.map +1 -0
  243. package/dist/executor/run-id.d.ts.map +1 -1
  244. package/dist/executor/run-id.js +8 -1
  245. package/dist/executor/run-id.js.map +1 -1
  246. package/dist/executor/worker-entry.d.ts +2 -0
  247. package/dist/executor/worker-entry.d.ts.map +1 -1
  248. package/dist/executor/worker-entry.js +46 -55
  249. package/dist/executor/worker-entry.js.map +1 -1
  250. package/dist/executor/worker-executor.d.ts +257 -0
  251. package/dist/executor/worker-executor.d.ts.map +1 -0
  252. package/dist/executor/worker-executor.js +308 -0
  253. package/dist/executor/worker-executor.js.map +1 -0
  254. package/dist/executor/worker-threads-executor.d.ts +245 -0
  255. package/dist/executor/worker-threads-executor.d.ts.map +1 -0
  256. package/dist/executor/worker-threads-executor.js +332 -0
  257. package/dist/executor/worker-threads-executor.js.map +1 -0
  258. package/dist/index.d.ts +1 -0
  259. package/dist/index.d.ts.map +1 -1
  260. package/dist/index.js +4 -2
  261. package/dist/index.js.map +1 -1
  262. package/dist/renderers/latex-renderer.d.ts +60 -0
  263. package/dist/renderers/latex-renderer.d.ts.map +1 -1
  264. package/dist/renderers/latex-renderer.js +299 -0
  265. package/dist/renderers/latex-renderer.js.map +1 -1
  266. package/dist/renderers/types.d.ts +9 -0
  267. package/dist/renderers/types.d.ts.map +1 -1
  268. package/dist/renderers/types.js.map +1 -1
  269. package/dist/robustness/__tests__/perturbations.unit.test.d.ts +11 -0
  270. package/dist/robustness/__tests__/perturbations.unit.test.d.ts.map +1 -0
  271. package/dist/robustness/__tests__/perturbations.unit.test.js +284 -0
  272. package/dist/robustness/__tests__/perturbations.unit.test.js.map +1 -0
  273. package/dist/robustness/index.d.ts +5 -2
  274. package/dist/robustness/index.d.ts.map +1 -1
  275. package/dist/robustness/index.js +4 -2
  276. package/dist/robustness/index.js.map +1 -1
  277. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts +7 -0
  278. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts.map +1 -0
  279. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js +185 -0
  280. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js.map +1 -0
  281. package/dist/types/evaluator.d.ts +449 -0
  282. package/dist/types/evaluator.d.ts.map +1 -0
  283. package/dist/types/evaluator.js +9 -0
  284. package/dist/types/evaluator.js.map +1 -0
  285. package/dist/types/result.d.ts +2 -0
  286. package/dist/types/result.d.ts.map +1 -1
  287. package/package.json +8 -1
  288. package/dist/claims/evaluator.d.ts +0 -33
  289. package/dist/claims/evaluator.d.ts.map +0 -1
  290. package/dist/claims/evaluator.js +0 -174
  291. package/dist/claims/evaluator.js.map +0 -1
  292. package/dist/robustness/analyzer.d.ts +0 -61
  293. package/dist/robustness/analyzer.d.ts.map +0 -1
  294. package/dist/robustness/analyzer.js +0 -191
  295. package/dist/robustness/analyzer.js.map +0 -1
@@ -0,0 +1,27 @@
1
+ /**
2
+ * PPEF CLI
3
+ *
4
+ * Command-line interface for the Portable Programmatic Evaluation Framework.
5
+ */
6
+ import { Command } from "commander";
7
+ import { registerAggregateCommand } from "./commands/aggregate.js";
8
+ import { registerEvaluateCommand } from "./commands/evaluate.js";
9
+ import { registerPlanCommand } from "./commands/plan.js";
10
+ import { registerRunCommand } from "./commands/run.js";
11
+ import { registerValidateCommand } from "./commands/validate.js";
12
+ /**
13
+ * Create and configure the CLI program.
14
+ *
15
+ * This function is exported for testing purposes.
16
+ *
17
+ * @returns Configured Commander program
18
+ */
19
+ export declare function createCliProgram(): Command;
20
+ /**
21
+ * Run the CLI and return exit code.
22
+ *
23
+ * @returns Exit code (0 for success, 1 for error)
24
+ */
25
+ export declare function runCli(): Promise<number>;
26
+ export { registerAggregateCommand, registerEvaluateCommand, registerPlanCommand, registerRunCommand, registerValidateCommand, };
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAgB1C;AAED;;;;GAIG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAS9C;AAiBD,OAAO,EACN,wBAAwB,EACxB,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,GACvB,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * PPEF CLI
3
+ *
4
+ * Command-line interface for the Portable Programmatic Evaluation Framework.
5
+ */
6
+ import { Command } from "commander";
7
+ import { registerAggregateCommand } from "./commands/aggregate.js";
8
+ import { registerEvaluateCommand } from "./commands/evaluate.js";
9
+ import { registerPlanCommand } from "./commands/plan.js";
10
+ import { registerRunCommand } from "./commands/run.js";
11
+ import { registerValidateCommand } from "./commands/validate.js";
12
+ /**
13
+ * Create and configure the CLI program.
14
+ *
15
+ * This function is exported for testing purposes.
16
+ *
17
+ * @returns Configured Commander program
18
+ */
19
+ export function createCliProgram() {
20
+ const program = new Command();
21
+ program
22
+ .name("ppef")
23
+ .description("Portable Programmatic Evaluation Framework - CLI for experiment execution")
24
+ .version("1.0.1");
25
+ // Register commands
26
+ registerRunCommand(program);
27
+ registerValidateCommand(program);
28
+ registerPlanCommand(program);
29
+ registerAggregateCommand(program);
30
+ registerEvaluateCommand(program);
31
+ return program;
32
+ }
33
+ /**
34
+ * Run the CLI and return exit code.
35
+ *
36
+ * @returns Exit code (0 for success, 1 for error)
37
+ */
38
+ export async function runCli() {
39
+ const program = createCliProgram();
40
+ try {
41
+ await program.parseAsync(process.argv);
42
+ return 0;
43
+ }
44
+ catch {
45
+ return 1;
46
+ }
47
+ }
48
+ /**
49
+ * Run CLI when executed directly (for development/testing).
50
+ */
51
+ if (import.meta.url === `file://${process.argv[1]}`) {
52
+ runCli().then((code) => {
53
+ process.exit(code);
54
+ }, (error) => {
55
+ console.error("Fatal error:", error);
56
+ process.exit(1);
57
+ });
58
+ }
59
+ export { registerAggregateCommand, registerEvaluateCommand, registerPlanCommand, registerRunCommand, registerValidateCommand, };
60
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB;IAC/B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACL,IAAI,CAAC,MAAM,CAAC;SACZ,WAAW,CAAC,2EAA2E,CAAC;SACxF,OAAO,CAAC,OAAO,CAAC,CAAC;IAEnB,oBAAoB;IACpB,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAClC,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAEjC,OAAO,OAAO,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM;IAC3B,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IAEnC,IAAI,CAAC;QACJ,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvC,OAAO,CAAC,CAAC;IACV,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,CAAC,CAAC;IACV,CAAC;AACF,CAAC;AAED;;GAEG;AACH,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACrD,MAAM,EAAE,CAAC,IAAI,CACZ,CAAC,IAAI,EAAE,EAAE;QACR,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;QACT,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC,CACD,CAAC;AACH,CAAC;AAED,OAAO,EACN,wBAAwB,EACxB,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,GACvB,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * CLI Logger
3
+ *
4
+ * Handles progress reporting, error messages, and output formatting.
5
+ */
6
+ import type { ExecutionProgress } from "../executor/index.js";
7
+ /**
8
+ * Log level for controlling verbosity.
9
+ */
10
+ export type LogLevel = "silent" | "error" | "warn" | "info" | "debug";
11
+ /**
12
+ * CLI logger for formatted output.
13
+ */
14
+ export declare class CliLogger {
15
+ private readonly level;
16
+ private readonly quiet;
17
+ private showProgress;
18
+ private lastProgress;
19
+ constructor(options: {
20
+ verbose?: boolean;
21
+ quiet?: boolean;
22
+ });
23
+ /**
24
+ * Enable or disable progress bar updates.
25
+ */
26
+ setProgress(enabled: boolean): void;
27
+ /**
28
+ * Log a debug message (only shown in verbose mode).
29
+ */
30
+ debug(message: string): void;
31
+ /**
32
+ * Log an info message.
33
+ */
34
+ info(message: string): void;
35
+ /**
36
+ * Log a warning message.
37
+ */
38
+ warn(message: string): void;
39
+ /**
40
+ * Log an error message (always shown unless quiet).
41
+ */
42
+ error(message: string): void;
43
+ /**
44
+ * Log execution progress.
45
+ */
46
+ progress(progress: ExecutionProgress): void;
47
+ /**
48
+ * Clear the current progress line.
49
+ */
50
+ clearProgress(): void;
51
+ /**
52
+ * Log a header section.
53
+ */
54
+ header(title: string): void;
55
+ /**
56
+ * Log a sub-header.
57
+ */
58
+ subheader(title: string): void;
59
+ /**
60
+ * Create a progress reporter callback for the executor.
61
+ */
62
+ createProgressReporter(): (progress: ExecutionProgress) => void;
63
+ /**
64
+ * Internal log method.
65
+ */
66
+ private log;
67
+ }
68
+ /**
69
+ * Create a default logger instance.
70
+ */
71
+ export declare function createLogger(options?: {
72
+ verbose?: boolean;
73
+ quiet?: boolean;
74
+ }): CliLogger;
75
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/cli/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEtE;;GAEG;AACH,qBAAa,SAAS;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;IAChC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAM;gBAEd,OAAO,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;IAK3D;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAInC;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM5B;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM3B;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM3B;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM5B;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IA0B3C;;OAEG;IACH,aAAa,IAAI,IAAI;IAOrB;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ3B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAO9B;;OAEG;IACH,sBAAsB,IAAI,CAAC,QAAQ,EAAE,iBAAiB,KAAK,IAAI;IAM/D;;OAEG;IACH,OAAO,CAAC,GAAG;CAKX;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,SAAS,CAE5F"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * CLI Logger
3
+ *
4
+ * Handles progress reporting, error messages, and output formatting.
5
+ */
6
+ /**
7
+ * CLI logger for formatted output.
8
+ */
9
+ export class CliLogger {
10
+ level;
11
+ quiet;
12
+ showProgress = false;
13
+ lastProgress = "";
14
+ constructor(options) {
15
+ this.quiet = options.quiet ?? false;
16
+ this.level = options.verbose ? "debug" : this.quiet ? "silent" : "info";
17
+ }
18
+ /**
19
+ * Enable or disable progress bar updates.
20
+ */
21
+ setProgress(enabled) {
22
+ this.showProgress = enabled;
23
+ }
24
+ /**
25
+ * Log a debug message (only shown in verbose mode).
26
+ */
27
+ debug(message) {
28
+ if (this.level === "debug") {
29
+ this.log(`[DEBUG] ${message}`);
30
+ }
31
+ }
32
+ /**
33
+ * Log an info message.
34
+ */
35
+ info(message) {
36
+ if (this.level !== "silent") {
37
+ this.log(message);
38
+ }
39
+ }
40
+ /**
41
+ * Log a warning message.
42
+ */
43
+ warn(message) {
44
+ if (this.level !== "silent") {
45
+ this.log(`Warning: ${message}`);
46
+ }
47
+ }
48
+ /**
49
+ * Log an error message (always shown unless quiet).
50
+ */
51
+ error(message) {
52
+ if (this.level !== "silent") {
53
+ this.log(`Error: ${message}`);
54
+ }
55
+ }
56
+ /**
57
+ * Log execution progress.
58
+ */
59
+ progress(progress) {
60
+ if (!this.showProgress || this.level === "silent") {
61
+ return;
62
+ }
63
+ const percentage = Math.round((progress.completed / progress.total) * 100);
64
+ const currentSut = progress.currentSut ?? "unknown";
65
+ const currentCase = progress.currentCase ?? "unknown";
66
+ const currentRep = progress.currentRepetition ?? 0;
67
+ const elapsed = Math.round(progress.elapsedMs / 1000);
68
+ const message = `[${percentage}%] ${currentSut} / ${currentCase} (rep ${currentRep + 1}) - ${elapsed}s`;
69
+ // Only update if message changed (avoid flickering)
70
+ if (message !== this.lastProgress) {
71
+ // Use carriage return to overwrite line
72
+ process.stdout.write(`\r${message.padEnd(80)}`);
73
+ this.lastProgress = message;
74
+ }
75
+ // New line when complete
76
+ if (progress.completed >= progress.total) {
77
+ process.stdout.write("\n");
78
+ }
79
+ }
80
+ /**
81
+ * Clear the current progress line.
82
+ */
83
+ clearProgress() {
84
+ if (this.lastProgress) {
85
+ process.stdout.write("\r" + " ".repeat(80) + "\r");
86
+ this.lastProgress = "";
87
+ }
88
+ }
89
+ /**
90
+ * Log a header section.
91
+ */
92
+ header(title) {
93
+ if (this.level === "silent") {
94
+ return;
95
+ }
96
+ this.log("");
97
+ this.log(`=== ${title} ===`);
98
+ }
99
+ /**
100
+ * Log a sub-header.
101
+ */
102
+ subheader(title) {
103
+ if (this.level === "silent") {
104
+ return;
105
+ }
106
+ this.log(`--- ${title}`);
107
+ }
108
+ /**
109
+ * Create a progress reporter callback for the executor.
110
+ */
111
+ createProgressReporter() {
112
+ return (progress) => {
113
+ this.progress(progress);
114
+ };
115
+ }
116
+ /**
117
+ * Internal log method.
118
+ */
119
+ log(message) {
120
+ // Clear progress line before logging
121
+ this.clearProgress();
122
+ console.log(message);
123
+ }
124
+ }
125
+ /**
126
+ * Create a default logger instance.
127
+ */
128
+ export function createLogger(options = {}) {
129
+ return new CliLogger(options);
130
+ }
131
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/cli/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Module Loader
3
+ *
4
+ * Dynamically loads JavaScript/TypeScript modules containing SUT factories,
5
+ * case definitions, and metrics extractors.
6
+ */
7
+ import type { CaseDefinition, SutDefinition } from "../types/index.js";
8
+ /**
9
+ * Binary SUT configuration for module loader.
10
+ */
11
+ interface BinaryConfig {
12
+ /** Type discriminator */
13
+ type: "binary";
14
+ /** Command to execute */
15
+ command: string;
16
+ /** Arguments to pass to command */
17
+ args?: string[];
18
+ /** How to serialize inputs to stdin */
19
+ inputFormat?: "json" | "raw" | "lines";
20
+ /** How to deserialize stdout */
21
+ outputFormat?: "json" | "raw" | "lines";
22
+ /** Timeout per run in milliseconds */
23
+ timeout?: number;
24
+ /** Exit code that indicates success */
25
+ successExitCode?: number;
26
+ /** Working directory */
27
+ cwd?: string;
28
+ }
29
+ /**
30
+ * Load a SUT factory from a module.
31
+ *
32
+ * @param modulePath - Path to module file
33
+ * @param exportName - Name of the export to use
34
+ * @param baseDir - Base directory for resolving paths
35
+ * @returns SUT definition ready for registration
36
+ * @throws Error if export cannot be found or loaded
37
+ */
38
+ export declare function loadSutFactory(modulePath: string, exportName: string, baseDir: string, registration: {
39
+ id: string;
40
+ name: string;
41
+ version: string;
42
+ role: "primary" | "baseline" | "oracle";
43
+ config: Readonly<Record<string, unknown>>;
44
+ tags: readonly string[];
45
+ description?: string;
46
+ }, config?: Record<string, unknown>, binaryConfig?: BinaryConfig): Promise<SutDefinition>;
47
+ /**
48
+ * Load a case definition from a module.
49
+ *
50
+ * @param modulePath - Path to module file
51
+ * @param exportName - Name of the export to use
52
+ * @param baseDir - Base directory for resolving paths
53
+ * @returns Case definition ready for use
54
+ * @throws Error if export cannot be found or loaded
55
+ */
56
+ export declare function loadCaseDefinition(modulePath: string, exportName: string, baseDir: string): Promise<CaseDefinition>;
57
+ /**
58
+ * Load a metrics extractor from a module.
59
+ *
60
+ * @param modulePath - Path to module file
61
+ * @param exportName - Name of the export to use
62
+ * @param baseDir - Base directory for resolving paths
63
+ * @returns Metrics extractor function
64
+ * @throws Error if export cannot be found or loaded
65
+ */
66
+ export declare function loadMetricsExtractor(modulePath: string, exportName: string, baseDir: string): Promise<(result: unknown) => Record<string, number>>;
67
+ export {};
68
+ //# sourceMappingURL=module-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-loader.d.ts","sourceRoot":"","sources":["../../src/cli/module-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvE;;GAEG;AACH,UAAU,YAAY;IACrB,yBAAyB;IACzB,IAAI,EAAE,QAAQ,CAAC;IAEf,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAEhB,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;IAEvC,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;IAExC,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AA6BD;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CACnC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IACxC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1C,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,EACD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,YAAY,CAAC,EAAE,YAAY,GACzB,OAAO,CAAC,aAAa,CAAC,CAuDxB;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACvC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,cAAc,CAAC,CAqCzB;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACzC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAYtD"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Module Loader
3
+ *
4
+ * Dynamically loads JavaScript/TypeScript modules containing SUT factories,
5
+ * case definitions, and metrics extractors.
6
+ */
7
+ import { resolve } from "node:path";
8
+ import { pathToFileURL } from "node:url";
9
+ /**
10
+ * Load a module from a file path.
11
+ *
12
+ * @param modulePath - Path to module file (relative to base directory)
13
+ * @param baseDir - Base directory for resolving relative paths
14
+ * @returns Loaded module exports
15
+ * @throws Error if module cannot be loaded
16
+ */
17
+ async function loadModule(modulePath, baseDir) {
18
+ const absolutePath = resolve(baseDir, modulePath);
19
+ // Use import with file:// URL for proper ESM support
20
+ const moduleUrl = pathToFileURL(absolutePath).href;
21
+ try {
22
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
23
+ const module = await import(moduleUrl);
24
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
25
+ return module;
26
+ }
27
+ catch (error) {
28
+ if (error instanceof Error) {
29
+ throw new Error(`Failed to load module from ${modulePath}: ${error.message}`);
30
+ }
31
+ throw error;
32
+ }
33
+ }
34
+ /**
35
+ * Load a SUT factory from a module.
36
+ *
37
+ * @param modulePath - Path to module file
38
+ * @param exportName - Name of the export to use
39
+ * @param baseDir - Base directory for resolving paths
40
+ * @returns SUT definition ready for registration
41
+ * @throws Error if export cannot be found or loaded
42
+ */
43
+ export async function loadSutFactory(modulePath, exportName, baseDir, registration, config, binaryConfig) {
44
+ // Handle binary SUTs
45
+ if (binaryConfig?.type === "binary") {
46
+ const { createBinarySut } = await import("../executor/binary-sut.js");
47
+ const factory = createBinarySut({
48
+ id: registration.id,
49
+ command: binaryConfig.command,
50
+ args: binaryConfig.args,
51
+ inputFormat: binaryConfig.inputFormat ?? "json",
52
+ outputFormat: binaryConfig.outputFormat ?? "json",
53
+ timeout: binaryConfig.timeout,
54
+ successExitCode: binaryConfig.successExitCode,
55
+ cwd: binaryConfig.cwd ?? resolve(baseDir),
56
+ });
57
+ return {
58
+ registration,
59
+ factory: factory,
60
+ };
61
+ }
62
+ const module = await loadModule(modulePath, baseDir);
63
+ const factoryExport = module[exportName];
64
+ if (typeof factoryExport !== "function") {
65
+ throw new Error(`Export "${exportName}" in ${modulePath} is not a function. ` +
66
+ `Found type: ${typeof factoryExport}`);
67
+ }
68
+ // Wrap the factory to match our expected SutFactory type
69
+ const factory = (userConfig) => {
70
+ const instance = factoryExport({ ...config, ...userConfig });
71
+ const mergedConfig = { ...config, ...userConfig, ...(instance.config ?? {}) };
72
+ return {
73
+ id: registration.id,
74
+ config: mergedConfig,
75
+ run: instance.run,
76
+ };
77
+ };
78
+ return {
79
+ registration,
80
+ factory,
81
+ };
82
+ }
83
+ /**
84
+ * Load a case definition from a module.
85
+ *
86
+ * @param modulePath - Path to module file
87
+ * @param exportName - Name of the export to use
88
+ * @param baseDir - Base directory for resolving paths
89
+ * @returns Case definition ready for use
90
+ * @throws Error if export cannot be found or loaded
91
+ */
92
+ export async function loadCaseDefinition(modulePath, exportName, baseDir) {
93
+ const module = await loadModule(modulePath, baseDir);
94
+ const caseExport = module[exportName];
95
+ if (typeof caseExport !== "function") {
96
+ throw new Error(`Export "${exportName}" in ${modulePath} is not a function. ` +
97
+ `Found type: ${typeof caseExport}`);
98
+ }
99
+ const definition = caseExport();
100
+ // Validate structure
101
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
102
+ if (!definition.case?.caseId) {
103
+ throw new Error(`Export "${exportName}" in ${modulePath} does not return a valid case definition. ` +
104
+ `Missing case.caseId.`);
105
+ }
106
+ if (typeof definition.getInput !== "function") {
107
+ throw new Error(`Export "${exportName}" in ${modulePath} does not return a valid case definition. ` +
108
+ `Missing getInput function.`);
109
+ }
110
+ if (typeof definition.getInputs !== "function") {
111
+ throw new Error(`Export "${exportName}" in ${modulePath} does not return a valid case definition. ` +
112
+ `Missing getInputs function.`);
113
+ }
114
+ return definition;
115
+ }
116
+ /**
117
+ * Load a metrics extractor from a module.
118
+ *
119
+ * @param modulePath - Path to module file
120
+ * @param exportName - Name of the export to use
121
+ * @param baseDir - Base directory for resolving paths
122
+ * @returns Metrics extractor function
123
+ * @throws Error if export cannot be found or loaded
124
+ */
125
+ export async function loadMetricsExtractor(modulePath, exportName, baseDir) {
126
+ const module = await loadModule(modulePath, baseDir);
127
+ const extractorExport = module[exportName];
128
+ if (typeof extractorExport !== "function") {
129
+ throw new Error(`Export "${exportName}" in ${modulePath} is not a function. ` +
130
+ `Found type: ${typeof extractorExport}`);
131
+ }
132
+ return extractorExport;
133
+ }
134
+ //# sourceMappingURL=module-loader.js.map
@@ -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"}