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.
- package/bin/ppef.mjs +20 -0
- package/dist/__tests__/framework-pipeline.integration.test.js +13 -11
- package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -1
- package/dist/__tests__/index-exports.unit.test.d.ts +8 -0
- package/dist/__tests__/index-exports.unit.test.d.ts.map +1 -0
- package/dist/__tests__/index-exports.unit.test.js +127 -0
- package/dist/__tests__/index-exports.unit.test.js.map +1 -0
- package/dist/__tests__/registry-executor.integration.test.js +12 -9
- package/dist/__tests__/registry-executor.integration.test.js.map +1 -1
- package/dist/aggregation/__tests__/aggregators.unit.test.d.ts +7 -0
- package/dist/aggregation/__tests__/aggregators.unit.test.d.ts.map +1 -0
- package/dist/aggregation/__tests__/aggregators.unit.test.js +350 -0
- package/dist/aggregation/__tests__/aggregators.unit.test.js.map +1 -0
- package/dist/aggregation/__tests__/pipeline.unit.test.d.ts +7 -0
- package/dist/aggregation/__tests__/pipeline.unit.test.d.ts.map +1 -0
- package/dist/aggregation/__tests__/pipeline.unit.test.js +213 -0
- package/dist/aggregation/__tests__/pipeline.unit.test.js.map +1 -0
- package/dist/aggregation/aggregators.d.ts +9 -0
- package/dist/aggregation/aggregators.d.ts.map +1 -1
- package/dist/aggregation/aggregators.js +1 -1
- package/dist/aggregation/aggregators.js.map +1 -1
- package/dist/aggregation/index.d.ts +1 -1
- package/dist/aggregation/index.d.ts.map +1 -1
- package/dist/aggregation/index.js +1 -1
- package/dist/aggregation/index.js.map +1 -1
- package/dist/claims/__tests__/evaluator.unit.test.d.ts +12 -0
- package/dist/claims/__tests__/evaluator.unit.test.d.ts.map +1 -0
- package/dist/claims/__tests__/evaluator.unit.test.js +801 -0
- package/dist/claims/__tests__/evaluator.unit.test.js.map +1 -0
- package/dist/cli/__tests__/aggregate.command.unit.test.d.ts +7 -0
- package/dist/cli/__tests__/aggregate.command.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/aggregate.command.unit.test.js +396 -0
- package/dist/cli/__tests__/aggregate.command.unit.test.js.map +1 -0
- package/dist/cli/__tests__/commands.unit.test.d.ts +10 -0
- package/dist/cli/__tests__/commands.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/commands.unit.test.js +217 -0
- package/dist/cli/__tests__/commands.unit.test.js.map +1 -0
- package/dist/cli/__tests__/index.unit.test.d.ts +10 -0
- package/dist/cli/__tests__/index.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/index.unit.test.js +65 -0
- package/dist/cli/__tests__/index.unit.test.js.map +1 -0
- package/dist/cli/__tests__/logger.unit.test.d.ts +11 -0
- package/dist/cli/__tests__/logger.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/logger.unit.test.js +180 -0
- package/dist/cli/__tests__/logger.unit.test.js.map +1 -0
- package/dist/cli/__tests__/module-loader.unit.test.d.ts +11 -0
- package/dist/cli/__tests__/module-loader.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/module-loader.unit.test.js +262 -0
- package/dist/cli/__tests__/module-loader.unit.test.js.map +1 -0
- package/dist/cli/__tests__/output-writer.unit.test.d.ts +10 -0
- package/dist/cli/__tests__/output-writer.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/output-writer.unit.test.js +216 -0
- package/dist/cli/__tests__/output-writer.unit.test.js.map +1 -0
- package/dist/cli/__tests__/plan.command.unit.test.d.ts +7 -0
- package/dist/cli/__tests__/plan.command.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/plan.command.unit.test.js +289 -0
- package/dist/cli/__tests__/plan.command.unit.test.js.map +1 -0
- package/dist/cli/__tests__/run.command.unit.test.d.ts +7 -0
- package/dist/cli/__tests__/run.command.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/run.command.unit.test.js +422 -0
- package/dist/cli/__tests__/run.command.unit.test.js.map +1 -0
- package/dist/cli/__tests__/validate.command.unit.test.d.ts +7 -0
- package/dist/cli/__tests__/validate.command.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/validate.command.unit.test.js +226 -0
- package/dist/cli/__tests__/validate.command.unit.test.js.map +1 -0
- package/dist/cli/command-deps.d.ts +125 -0
- package/dist/cli/command-deps.d.ts.map +1 -0
- package/dist/cli/command-deps.js +7 -0
- package/dist/cli/command-deps.js.map +1 -0
- package/dist/cli/commands/aggregate.d.ts +35 -0
- package/dist/cli/commands/aggregate.d.ts.map +1 -0
- package/dist/cli/commands/aggregate.js +121 -0
- package/dist/cli/commands/aggregate.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +36 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +109 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/run.d.ts +33 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +185 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +27 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +88 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/config-loader.d.ts +30 -0
- package/dist/cli/config-loader.d.ts.map +1 -0
- package/dist/cli/config-loader.js +181 -0
- package/dist/cli/config-loader.js.map +1 -0
- package/dist/cli/index.d.ts +26 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +58 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/logger.d.ts +75 -0
- package/dist/cli/logger.d.ts.map +1 -0
- package/dist/cli/logger.js +131 -0
- package/dist/cli/logger.js.map +1 -0
- package/dist/cli/module-loader.d.ts +46 -0
- package/dist/cli/module-loader.d.ts.map +1 -0
- package/dist/cli/module-loader.js +116 -0
- package/dist/cli/module-loader.js.map +1 -0
- package/dist/cli/output-writer.d.ts +51 -0
- package/dist/cli/output-writer.d.ts.map +1 -0
- package/dist/cli/output-writer.js +65 -0
- package/dist/cli/output-writer.js.map +1 -0
- package/dist/cli/types.d.ts +174 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +7 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/collector/__tests__/result-collector.unit.test.d.ts +7 -0
- package/dist/collector/__tests__/result-collector.unit.test.d.ts.map +1 -0
- package/dist/collector/__tests__/result-collector.unit.test.js +1021 -0
- package/dist/collector/__tests__/result-collector.unit.test.js.map +1 -0
- package/dist/collector/__tests__/schema.unit.test.d.ts +7 -0
- package/dist/collector/__tests__/schema.unit.test.d.ts.map +1 -0
- package/dist/collector/__tests__/schema.unit.test.js +360 -0
- package/dist/collector/__tests__/schema.unit.test.js.map +1 -0
- package/dist/executor/__tests__/checkpoint-manager.unit.test.js +83 -1
- package/dist/executor/__tests__/checkpoint-manager.unit.test.js.map +1 -1
- package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts +3 -6
- package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts.map +1 -1
- package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js +428 -159
- package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js.map +1 -1
- package/dist/executor/__tests__/checkpoint-storage.unit.test.js +105 -1
- package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -1
- package/dist/executor/__tests__/executor.unit.test.js +69 -1
- package/dist/executor/__tests__/executor.unit.test.js.map +1 -1
- package/dist/executor/__tests__/memory-monitor.unit.test.d.ts +7 -0
- package/dist/executor/__tests__/memory-monitor.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/memory-monitor.unit.test.js +285 -0
- package/dist/executor/__tests__/memory-monitor.unit.test.js.map +1 -0
- package/dist/executor/__tests__/parallel-executor.unit.test.d.ts +2 -1
- package/dist/executor/__tests__/parallel-executor.unit.test.d.ts.map +1 -1
- package/dist/executor/__tests__/parallel-executor.unit.test.js +426 -156
- package/dist/executor/__tests__/parallel-executor.unit.test.js.map +1 -1
- package/dist/executor/__tests__/run-id.unit.test.d.ts +8 -0
- package/dist/executor/__tests__/run-id.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/run-id.unit.test.js +156 -0
- package/dist/executor/__tests__/run-id.unit.test.js.map +1 -0
- package/dist/executor/__tests__/worker-entry.integration.test.d.ts +24 -0
- package/dist/executor/__tests__/worker-entry.integration.test.d.ts.map +1 -0
- package/dist/executor/__tests__/worker-entry.integration.test.js +82 -0
- package/dist/executor/__tests__/worker-entry.integration.test.js.map +1 -0
- package/dist/executor/__tests__/worker-entry.unit.test.d.ts +7 -0
- package/dist/executor/__tests__/worker-entry.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/worker-entry.unit.test.js +364 -0
- package/dist/executor/__tests__/worker-entry.unit.test.js.map +1 -0
- package/dist/executor/parallel-executor.d.ts +186 -0
- package/dist/executor/parallel-executor.d.ts.map +1 -1
- package/dist/executor/parallel-executor.js +218 -83
- package/dist/executor/parallel-executor.js.map +1 -1
- package/dist/executor/run-id.d.ts.map +1 -1
- package/dist/executor/run-id.js +8 -1
- package/dist/executor/run-id.js.map +1 -1
- package/dist/executor/worker-entry.d.ts +2 -0
- package/dist/executor/worker-entry.d.ts.map +1 -1
- package/dist/executor/worker-entry.js +29 -54
- package/dist/executor/worker-entry.js.map +1 -1
- package/dist/executor/worker-executor.d.ts +156 -0
- package/dist/executor/worker-executor.d.ts.map +1 -0
- package/dist/executor/worker-executor.js +88 -0
- package/dist/executor/worker-executor.js.map +1 -0
- package/dist/robustness/__tests__/analyzer.unit.test.d.ts +11 -0
- package/dist/robustness/__tests__/analyzer.unit.test.d.ts.map +1 -0
- package/dist/robustness/__tests__/analyzer.unit.test.js +455 -0
- package/dist/robustness/__tests__/analyzer.unit.test.js.map +1 -0
- package/dist/robustness/__tests__/perturbations.unit.test.d.ts +11 -0
- package/dist/robustness/__tests__/perturbations.unit.test.d.ts.map +1 -0
- package/dist/robustness/__tests__/perturbations.unit.test.js +284 -0
- package/dist/robustness/__tests__/perturbations.unit.test.js.map +1 -0
- package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts +7 -0
- package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts.map +1 -0
- package/dist/statistical/__tests__/mann-whitney-u.unit.test.js +185 -0
- package/dist/statistical/__tests__/mann-whitney-u.unit.test.js.map +1 -0
- package/package.json +8 -1
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan Command
|
|
3
|
+
*
|
|
4
|
+
* Shows execution plan without running experiments.
|
|
5
|
+
*/
|
|
6
|
+
import { Executor } from "../../executor/index.js";
|
|
7
|
+
import { loadAndValidateConfig } from "../config-loader.js";
|
|
8
|
+
import { loadCaseDefinition, loadSutFactory } from "../module-loader.js";
|
|
9
|
+
// Note: createLogger is imported in the action handler to avoid circular dependency with logger.ts
|
|
10
|
+
/**
|
|
11
|
+
* Execute plan command with injected dependencies.
|
|
12
|
+
*
|
|
13
|
+
* This function is exported for testing.
|
|
14
|
+
*
|
|
15
|
+
* @param configFile - Path to config file
|
|
16
|
+
* @param dependencies - Injected dependencies
|
|
17
|
+
*/
|
|
18
|
+
export async function executePlan(configFile, dependencies) {
|
|
19
|
+
const { logger, configLoader, moduleLoader, executor, processExit } = dependencies;
|
|
20
|
+
try {
|
|
21
|
+
logger.header("Execution Plan");
|
|
22
|
+
const loaded = await configLoader.loadAndValidateConfig(configFile);
|
|
23
|
+
const { config, baseDir } = loaded;
|
|
24
|
+
// Load SUTs
|
|
25
|
+
logger.subheader("Loading SUTs...");
|
|
26
|
+
const sutDefinitions = await Promise.all(config.suts.map((sutConfig) => moduleLoader.loadSutFactory(sutConfig.module, sutConfig.exportName, baseDir, {
|
|
27
|
+
id: sutConfig.id,
|
|
28
|
+
name: sutConfig.registration.name,
|
|
29
|
+
version: sutConfig.registration.version,
|
|
30
|
+
role: sutConfig.registration.role,
|
|
31
|
+
config: sutConfig.config ?? {},
|
|
32
|
+
tags: sutConfig.registration.tags ?? [],
|
|
33
|
+
description: sutConfig.registration.description,
|
|
34
|
+
}, sutConfig.config)));
|
|
35
|
+
// Load cases
|
|
36
|
+
logger.subheader("Loading cases...");
|
|
37
|
+
const caseDefinitions = await Promise.all(config.cases.map((caseConfig) => moduleLoader.loadCaseDefinition(caseConfig.module, caseConfig.exportName, baseDir)));
|
|
38
|
+
// Plan runs
|
|
39
|
+
logger.subheader("Planning runs...");
|
|
40
|
+
const plannedRuns = executor.plan(sutDefinitions, caseDefinitions);
|
|
41
|
+
// Group and display plan
|
|
42
|
+
logger.info("");
|
|
43
|
+
logger.info(`Total planned runs: ${plannedRuns.length}`);
|
|
44
|
+
logger.info("");
|
|
45
|
+
// Group by SUT
|
|
46
|
+
const bySut = new Map();
|
|
47
|
+
for (const run of plannedRuns) {
|
|
48
|
+
const existing = bySut.get(run.sutId) ?? [];
|
|
49
|
+
existing.push(run);
|
|
50
|
+
bySut.set(run.sutId, existing);
|
|
51
|
+
}
|
|
52
|
+
for (const [sutId, runs] of bySut) {
|
|
53
|
+
const sutDef = sutDefinitions.find((s) => s.id === sutId);
|
|
54
|
+
logger.subheader(sutDef?.id ?? sutId);
|
|
55
|
+
// Group by case class
|
|
56
|
+
const byCaseClass = new Map();
|
|
57
|
+
for (const run of runs) {
|
|
58
|
+
const caseDef = caseDefinitions.find((c) => c.case.caseId === run.caseId);
|
|
59
|
+
const caseClass = caseDef?.case.caseClass ?? "uncategorized";
|
|
60
|
+
const existing = byCaseClass.get(caseClass) ?? [];
|
|
61
|
+
existing.push(run);
|
|
62
|
+
byCaseClass.set(caseClass, existing);
|
|
63
|
+
}
|
|
64
|
+
for (const [caseClass, classRuns] of byCaseClass) {
|
|
65
|
+
logger.info(` ${caseClass}: ${classRuns.length} runs`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
logger.info("");
|
|
69
|
+
logger.info("Execution plan validated successfully!");
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (error instanceof Error) {
|
|
73
|
+
logger.error(error.message);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
logger.error(String(error));
|
|
77
|
+
}
|
|
78
|
+
processExit(1);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Register the plan command.
|
|
83
|
+
*
|
|
84
|
+
* @param program - Commander program instance
|
|
85
|
+
*/
|
|
86
|
+
export function registerPlanCommand(program) {
|
|
87
|
+
program
|
|
88
|
+
.command("plan")
|
|
89
|
+
.description("Show execution plan without running experiments")
|
|
90
|
+
.argument("<config-file>", "Path to experiment configuration JSON file")
|
|
91
|
+
.action(async (configFile) => {
|
|
92
|
+
const { createLogger } = await import("../logger.js");
|
|
93
|
+
const { loadMetricsExtractor } = await import("../module-loader.js");
|
|
94
|
+
const logger = createLogger();
|
|
95
|
+
const executor = new Executor({});
|
|
96
|
+
await executePlan(configFile, {
|
|
97
|
+
logger,
|
|
98
|
+
configLoader: { loadAndValidateConfig },
|
|
99
|
+
moduleLoader: {
|
|
100
|
+
loadSutFactory,
|
|
101
|
+
loadCaseDefinition,
|
|
102
|
+
loadMetricsExtractor,
|
|
103
|
+
},
|
|
104
|
+
executor: executor,
|
|
105
|
+
processExit: (code) => process.exit(code),
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/cli/commands/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run Command
|
|
3
|
+
*
|
|
4
|
+
* Executes experiments based on JSON configuration.
|
|
5
|
+
*/
|
|
6
|
+
import type { Command } from "commander";
|
|
7
|
+
import type { IAggregator, ICommandLogger, IConfigLoader, IExecutor, IModuleLoader, IOutputWriter } from "../command-deps.js";
|
|
8
|
+
import type { CliOptions } from "../types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Execute run command with injected dependencies.
|
|
11
|
+
*
|
|
12
|
+
* This function is exported for testing.
|
|
13
|
+
*
|
|
14
|
+
* @param configFile - Path to config file
|
|
15
|
+
* @param options - Command options
|
|
16
|
+
* @param dependencies - Injected dependencies
|
|
17
|
+
*/
|
|
18
|
+
export declare function executeRun(configFile: string, options: CliOptions, dependencies: {
|
|
19
|
+
logger: ICommandLogger;
|
|
20
|
+
configLoader: IConfigLoader;
|
|
21
|
+
moduleLoader: IModuleLoader;
|
|
22
|
+
createExecutor: (config: unknown) => IExecutor;
|
|
23
|
+
aggregator: IAggregator;
|
|
24
|
+
outputWriter: IOutputWriter;
|
|
25
|
+
processExit: (code: number) => never;
|
|
26
|
+
}): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Register the run command.
|
|
29
|
+
*
|
|
30
|
+
* @param program - Commander program instance
|
|
31
|
+
*/
|
|
32
|
+
export declare function registerRunCommand(program: Command): void;
|
|
33
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,OAAO,KAAK,EACX,WAAW,EACX,cAAc,EACd,aAAa,EACb,SAAS,EACT,aAAa,EACb,aAAa,EACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAC/B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,UAAU,EACnB,YAAY,EAAE;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,YAAY,EAAE,aAAa,CAAC;IAC5B,YAAY,EAAE,aAAa,CAAC;IAC5B,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,SAAS,CAAC;IAC/C,UAAU,EAAE,WAAW,CAAC;IACxB,YAAY,EAAE,aAAa,CAAC;IAC5B,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;CACrC,GACC,OAAO,CAAC,IAAI,CAAC,CAuLf;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8BzD"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run Command
|
|
3
|
+
*
|
|
4
|
+
* Executes experiments based on JSON configuration.
|
|
5
|
+
*/
|
|
6
|
+
import { aggregateResults, createAggregationOutput } from "../../aggregation/index.js";
|
|
7
|
+
import { Executor } from "../../executor/index.js";
|
|
8
|
+
import { loadAndValidateConfig } from "../config-loader.js";
|
|
9
|
+
import { loadCaseDefinition, loadMetricsExtractor, loadSutFactory } from "../module-loader.js";
|
|
10
|
+
import { generateOutputFilename, writeAggregates, writeResults } from "../output-writer.js";
|
|
11
|
+
/**
|
|
12
|
+
* Execute run command with injected dependencies.
|
|
13
|
+
*
|
|
14
|
+
* This function is exported for testing.
|
|
15
|
+
*
|
|
16
|
+
* @param configFile - Path to config file
|
|
17
|
+
* @param options - Command options
|
|
18
|
+
* @param dependencies - Injected dependencies
|
|
19
|
+
*/
|
|
20
|
+
export async function executeRun(configFile, options, dependencies) {
|
|
21
|
+
const { logger, configLoader, moduleLoader, createExecutor, aggregator, outputWriter, processExit, } = dependencies;
|
|
22
|
+
try {
|
|
23
|
+
logger.header(`Experiment: ${options.dryRun ? "Dry Run" : "Execution"}`);
|
|
24
|
+
// Load and validate configuration
|
|
25
|
+
const loaded = await configLoader.loadAndValidateConfig(configFile);
|
|
26
|
+
const { config, baseDir } = loaded;
|
|
27
|
+
logger.info(`Configuration: ${loaded.configPath}`);
|
|
28
|
+
logger.info(`Experiment: ${config.experiment.name}`);
|
|
29
|
+
if (config.experiment.description) {
|
|
30
|
+
logger.info(`Description: ${config.experiment.description}`);
|
|
31
|
+
}
|
|
32
|
+
// Apply CLI overrides
|
|
33
|
+
const executorConfig = { ...config.executor };
|
|
34
|
+
if (options.jobs !== undefined) {
|
|
35
|
+
executorConfig.concurrency = options.jobs;
|
|
36
|
+
logger.debug(`Concurrency overridden to ${options.jobs}`);
|
|
37
|
+
}
|
|
38
|
+
// Load SUTs
|
|
39
|
+
logger.subheader("Loading SUTs...");
|
|
40
|
+
const sutDefinitions = await Promise.all(config.suts.map(async (sutConfig) => {
|
|
41
|
+
logger.debug(`Loading SUT: ${sutConfig.id} from ${sutConfig.module}`);
|
|
42
|
+
return moduleLoader.loadSutFactory(sutConfig.module, sutConfig.exportName, baseDir, {
|
|
43
|
+
id: sutConfig.id,
|
|
44
|
+
name: sutConfig.registration.name,
|
|
45
|
+
version: sutConfig.registration.version,
|
|
46
|
+
role: sutConfig.registration.role,
|
|
47
|
+
config: sutConfig.config ?? {},
|
|
48
|
+
tags: sutConfig.registration.tags ?? [],
|
|
49
|
+
description: sutConfig.registration.description,
|
|
50
|
+
}, sutConfig.config);
|
|
51
|
+
}));
|
|
52
|
+
logger.info(`Loaded ${sutDefinitions.length} SUTs`);
|
|
53
|
+
// Load cases
|
|
54
|
+
logger.subheader("Loading cases...");
|
|
55
|
+
const caseDefinitions = await Promise.all(config.cases.map(async (caseConfig) => {
|
|
56
|
+
logger.debug(`Loading case: ${caseConfig.id} from ${caseConfig.module}`);
|
|
57
|
+
return moduleLoader.loadCaseDefinition(caseConfig.module, caseConfig.exportName, baseDir);
|
|
58
|
+
}));
|
|
59
|
+
logger.info(`Loaded ${caseDefinitions.length} cases`);
|
|
60
|
+
// Load metrics extractor
|
|
61
|
+
logger.subheader("Loading metrics extractor...");
|
|
62
|
+
const metricsExtractor = await moduleLoader.loadMetricsExtractor(config.metricsExtractor.module, config.metricsExtractor.exportName, baseDir);
|
|
63
|
+
logger.info(`Metrics extractor loaded from ${config.metricsExtractor.module}`);
|
|
64
|
+
// Create executor
|
|
65
|
+
const executor = createExecutor(executorConfig);
|
|
66
|
+
// Plan runs
|
|
67
|
+
logger.subheader("Planning execution...");
|
|
68
|
+
const plannedRuns = executor.plan(sutDefinitions, caseDefinitions);
|
|
69
|
+
logger.info(`Planned ${plannedRuns.length} runs`);
|
|
70
|
+
// Dry run - just show plan and exit
|
|
71
|
+
if (options.dryRun) {
|
|
72
|
+
logger.info("");
|
|
73
|
+
logger.subheader("Dry run - not executing");
|
|
74
|
+
logger.info(`SUTs: ${sutDefinitions.map((s) => s.id).join(", ")}`);
|
|
75
|
+
logger.info(`Cases: ${caseDefinitions.map((c) => c.case.caseId).join(", ")}`);
|
|
76
|
+
logger.info(`Total runs: ${plannedRuns.length}`);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Execute
|
|
80
|
+
logger.subheader("Executing...");
|
|
81
|
+
logger.setProgress(true);
|
|
82
|
+
const startTime = Date.now();
|
|
83
|
+
const summary = await executor.execute(sutDefinitions, caseDefinitions, metricsExtractor, undefined);
|
|
84
|
+
const elapsed = Date.now() - startTime;
|
|
85
|
+
logger.setProgress(false);
|
|
86
|
+
logger.info("");
|
|
87
|
+
// Report results
|
|
88
|
+
logger.subheader("Execution Summary");
|
|
89
|
+
logger.info(`Total runs: ${summary.totalRuns}`);
|
|
90
|
+
logger.info(`Successful: ${summary.successfulRuns}`);
|
|
91
|
+
logger.info(`Failed: ${summary.failedRuns}`);
|
|
92
|
+
logger.info(`Elapsed time: ${(elapsed / 1000).toFixed(2)}s`);
|
|
93
|
+
if (summary.errors.length > 0) {
|
|
94
|
+
logger.warn(`Errors encountered: ${summary.errors.length}`);
|
|
95
|
+
for (const error of summary.errors.slice(0, 5)) {
|
|
96
|
+
logger.warn(` - ${error.runId}: ${error.error}`);
|
|
97
|
+
}
|
|
98
|
+
if (summary.errors.length > 5) {
|
|
99
|
+
logger.warn(` ... and ${summary.errors.length - 5} more`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Determine output settings
|
|
103
|
+
const outputPath = options.output ?? config.output.path ?? "./results";
|
|
104
|
+
const format = options.format ?? config.output.format ?? "json-pretty";
|
|
105
|
+
const shouldAggregate = options.noAggregate !== true && config.output.aggregate !== false;
|
|
106
|
+
// Write results
|
|
107
|
+
logger.subheader("Writing results...");
|
|
108
|
+
const resultsFilename = outputWriter.generateOutputFilename(config.experiment.name, "results");
|
|
109
|
+
const resultsPath = `${outputPath}/${resultsFilename}`;
|
|
110
|
+
await outputWriter.writeResults(summary.results, resultsPath, format);
|
|
111
|
+
logger.info(`Results written to: ${resultsPath}`);
|
|
112
|
+
// Aggregate if requested
|
|
113
|
+
if (shouldAggregate && summary.results.length > 0) {
|
|
114
|
+
logger.subheader("Aggregating results...");
|
|
115
|
+
const aggregates = aggregator.aggregateResults(summary.results, {
|
|
116
|
+
groupByCaseClass: true,
|
|
117
|
+
computeComparisons: true,
|
|
118
|
+
});
|
|
119
|
+
const aggregationOutput = aggregator.createAggregationOutput(aggregates, summary.results);
|
|
120
|
+
const aggregatesFilename = outputWriter.generateOutputFilename(config.experiment.name, "aggregates");
|
|
121
|
+
const aggregatesPath = `${outputPath}/${aggregatesFilename}`;
|
|
122
|
+
await outputWriter.writeAggregates(aggregationOutput, aggregatesPath, format);
|
|
123
|
+
logger.info(`Aggregates written to: ${aggregatesPath}`);
|
|
124
|
+
logger.info("");
|
|
125
|
+
logger.subheader("Aggregation Summary");
|
|
126
|
+
for (const agg of aggregates) {
|
|
127
|
+
const caseClassSuffix = agg.caseClass ? ` (${agg.caseClass})` : "";
|
|
128
|
+
logger.info(`${agg.sut}${caseClassSuffix}:`);
|
|
129
|
+
logger.info(` Runs: ${agg.group.runCount}`);
|
|
130
|
+
logger.info(` Cases: ${agg.group.caseCount}`);
|
|
131
|
+
for (const [metric, stats] of Object.entries(agg.metrics)) {
|
|
132
|
+
const std = stats.std ?? 0;
|
|
133
|
+
logger.info(` ${metric}: mean=${stats.mean.toFixed(2)}, std=${std.toFixed(2)}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
logger.info("");
|
|
138
|
+
logger.info("Experiment completed successfully!");
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
logger.setProgress(false);
|
|
142
|
+
if (error instanceof Error) {
|
|
143
|
+
logger.error(error.message);
|
|
144
|
+
if (options.verbose) {
|
|
145
|
+
console.error(error.stack);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
logger.error(String(error));
|
|
150
|
+
}
|
|
151
|
+
processExit(1);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Register the run command.
|
|
156
|
+
*
|
|
157
|
+
* @param program - Commander program instance
|
|
158
|
+
*/
|
|
159
|
+
export function registerRunCommand(program) {
|
|
160
|
+
program
|
|
161
|
+
.command("run")
|
|
162
|
+
.description("Run experiments from a configuration file")
|
|
163
|
+
.argument("<config-file>", "Path to experiment configuration JSON file")
|
|
164
|
+
.option("-o, --output <path>", "Output directory")
|
|
165
|
+
.option("-f, --format <format>", "Output format (json or json-pretty)", "json-pretty")
|
|
166
|
+
.option("--no-aggregate", "Skip aggregation")
|
|
167
|
+
.option("-j, --jobs <number>", "Override concurrency", (value) => Number.parseInt(value, 10))
|
|
168
|
+
.option("-v, --verbose", "Verbose logging")
|
|
169
|
+
.option("-q, --quiet", "Suppress output")
|
|
170
|
+
.option("--dry-run", "Plan without running")
|
|
171
|
+
.action(async (configFile, options) => {
|
|
172
|
+
const { createLogger } = await import("../logger.js");
|
|
173
|
+
const logger = createLogger(options);
|
|
174
|
+
await executeRun(configFile, options, {
|
|
175
|
+
logger,
|
|
176
|
+
configLoader: { loadAndValidateConfig },
|
|
177
|
+
moduleLoader: { loadSutFactory, loadCaseDefinition, loadMetricsExtractor },
|
|
178
|
+
createExecutor: (config) => new Executor(config),
|
|
179
|
+
aggregator: { aggregateResults, createAggregationOutput },
|
|
180
|
+
outputWriter: { generateOutputFilename, writeResults, writeAggregates },
|
|
181
|
+
processExit: (code) => process.exit(code),
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate Command
|
|
3
|
+
*
|
|
4
|
+
* Validates experiment configuration files without running experiments.
|
|
5
|
+
*/
|
|
6
|
+
import type { Command } from "commander";
|
|
7
|
+
import type { IConfigLoader, ICommandLogger } from "../command-deps.js";
|
|
8
|
+
/**
|
|
9
|
+
* Execute validate command with injected dependencies.
|
|
10
|
+
*
|
|
11
|
+
* This function is exported for testing.
|
|
12
|
+
*
|
|
13
|
+
* @param configFile - Path to config file
|
|
14
|
+
* @param dependencies - Injected dependencies
|
|
15
|
+
*/
|
|
16
|
+
export declare function executeValidate(configFile: string, dependencies: {
|
|
17
|
+
logger: ICommandLogger;
|
|
18
|
+
configLoader: IConfigLoader;
|
|
19
|
+
processExit: (code: number) => never;
|
|
20
|
+
}): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Register the validate command.
|
|
23
|
+
*
|
|
24
|
+
* @param program - Commander program instance
|
|
25
|
+
*/
|
|
26
|
+
export declare function registerValidateCommand(program: Command): void;
|
|
27
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIxE;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACpC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,YAAY,EAAE,aAAa,CAAC;IAC5B,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;CACrC,GACC,OAAO,CAAC,IAAI,CAAC,CA0Df;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgB9D"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate Command
|
|
3
|
+
*
|
|
4
|
+
* Validates experiment configuration files without running experiments.
|
|
5
|
+
*/
|
|
6
|
+
import { loadAndValidateConfig } from "../config-loader.js";
|
|
7
|
+
// Note: createLogger imported lazily in action handler to avoid circular dependency
|
|
8
|
+
/**
|
|
9
|
+
* Execute validate command with injected dependencies.
|
|
10
|
+
*
|
|
11
|
+
* This function is exported for testing.
|
|
12
|
+
*
|
|
13
|
+
* @param configFile - Path to config file
|
|
14
|
+
* @param dependencies - Injected dependencies
|
|
15
|
+
*/
|
|
16
|
+
export async function executeValidate(configFile, dependencies) {
|
|
17
|
+
const { logger, configLoader, processExit } = dependencies;
|
|
18
|
+
try {
|
|
19
|
+
logger.header("Configuration Validation");
|
|
20
|
+
const loaded = await configLoader.loadAndValidateConfig(configFile);
|
|
21
|
+
logger.info(`Configuration file: ${loaded.configPath}`);
|
|
22
|
+
logger.info(`Base directory: ${loaded.baseDir}`);
|
|
23
|
+
logger.info(`Experiment: ${loaded.config.experiment.name}`);
|
|
24
|
+
if (loaded.config.experiment.description) {
|
|
25
|
+
logger.info(`Description: ${loaded.config.experiment.description}`);
|
|
26
|
+
}
|
|
27
|
+
if (loaded.config.experiment.version) {
|
|
28
|
+
logger.info(`Version: ${loaded.config.experiment.version}`);
|
|
29
|
+
}
|
|
30
|
+
logger.subheader("SUTs");
|
|
31
|
+
for (const sut of loaded.config.suts) {
|
|
32
|
+
logger.info(` - ${sut.id} (${sut.registration.name} v${sut.registration.version})`);
|
|
33
|
+
logger.info(` Module: ${sut.module} -> ${sut.exportName}`);
|
|
34
|
+
logger.info(` Role: ${sut.registration.role}`);
|
|
35
|
+
}
|
|
36
|
+
logger.subheader("Cases");
|
|
37
|
+
for (const testCase of loaded.config.cases) {
|
|
38
|
+
logger.info(` - ${testCase.id}`);
|
|
39
|
+
logger.info(` Module: ${testCase.module} -> ${testCase.exportName}`);
|
|
40
|
+
}
|
|
41
|
+
logger.subheader("Executor");
|
|
42
|
+
const executor = loaded.config.executor;
|
|
43
|
+
logger.info(` Repetitions: ${executor.repetitions ?? "default"}`);
|
|
44
|
+
logger.info(` Seed base: ${executor.seedBase ?? "default"}`);
|
|
45
|
+
logger.info(` Timeout: ${executor.timeoutMs ?? "default"}ms`);
|
|
46
|
+
logger.info(` Concurrency: ${executor.concurrency ?? "sequential"}`);
|
|
47
|
+
logger.info(` Continue on error: ${executor.continueOnError ?? "default"}`);
|
|
48
|
+
logger.info(` Collect provenance: ${executor.collectProvenance ?? "default"}`);
|
|
49
|
+
logger.subheader("Output");
|
|
50
|
+
const output = loaded.config.output;
|
|
51
|
+
logger.info(` Path: ${output.path ?? "./results"}`);
|
|
52
|
+
logger.info(` Format: ${output.format ?? "json-pretty"}`);
|
|
53
|
+
logger.info(` Aggregate: ${output.aggregate ?? "true"}`);
|
|
54
|
+
logger.info("");
|
|
55
|
+
logger.info("Configuration is valid!");
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
if (error instanceof Error) {
|
|
59
|
+
logger.error(error.message);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
logger.error(String(error));
|
|
63
|
+
}
|
|
64
|
+
processExit(1);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Register the validate command.
|
|
69
|
+
*
|
|
70
|
+
* @param program - Commander program instance
|
|
71
|
+
*/
|
|
72
|
+
export function registerValidateCommand(program) {
|
|
73
|
+
program
|
|
74
|
+
.command("validate")
|
|
75
|
+
.description("Validate an experiment configuration file")
|
|
76
|
+
.argument("<config-file>", "Path to experiment configuration JSON file")
|
|
77
|
+
.action(async (configFile) => {
|
|
78
|
+
// Import dependencies lazily to avoid circular imports
|
|
79
|
+
const { createLogger } = await import("../logger.js");
|
|
80
|
+
const logger = createLogger();
|
|
81
|
+
await executeValidate(configFile, {
|
|
82
|
+
logger,
|
|
83
|
+
configLoader: { loadAndValidateConfig },
|
|
84
|
+
processExit: (code) => process.exit(code),
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Loader
|
|
3
|
+
*
|
|
4
|
+
* Loads and validates experiment configuration from JSON files.
|
|
5
|
+
*/
|
|
6
|
+
import type { ExperimentConfig, LoadedConfig, ValidationResult } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Load and parse experiment configuration from a JSON file.
|
|
9
|
+
*
|
|
10
|
+
* @param configPath - Path to config file (can be absolute or relative)
|
|
11
|
+
* @returns Loaded configuration with base directory
|
|
12
|
+
* @throws Error if file cannot be read or parsed
|
|
13
|
+
*/
|
|
14
|
+
export declare function loadConfig(configPath: string): Promise<LoadedConfig>;
|
|
15
|
+
/**
|
|
16
|
+
* Validate experiment configuration.
|
|
17
|
+
*
|
|
18
|
+
* @param config - Configuration to validate
|
|
19
|
+
* @returns Validation result with errors and warnings
|
|
20
|
+
*/
|
|
21
|
+
export declare function validateConfig(config: ExperimentConfig): ValidationResult;
|
|
22
|
+
/**
|
|
23
|
+
* Load and validate experiment configuration.
|
|
24
|
+
*
|
|
25
|
+
* @param configPath - Path to config file
|
|
26
|
+
* @returns Loaded and validated configuration
|
|
27
|
+
* @throws Error if validation fails
|
|
28
|
+
*/
|
|
29
|
+
export declare function loadAndValidateConfig(configPath: string): Promise<LoadedConfig>;
|
|
30
|
+
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/cli/config-loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnF;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAgB1E;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CA+HzE;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAkBrF"}
|