coding-agent-benchmarks 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +474 -0
  3. package/dist/adapters/claudeCodeCLI.d.ts +19 -0
  4. package/dist/adapters/claudeCodeCLI.d.ts.map +1 -0
  5. package/dist/adapters/claudeCodeCLI.js +106 -0
  6. package/dist/adapters/claudeCodeCLI.js.map +1 -0
  7. package/dist/adapters/copilotCLI.d.ts +19 -0
  8. package/dist/adapters/copilotCLI.d.ts.map +1 -0
  9. package/dist/adapters/copilotCLI.js +104 -0
  10. package/dist/adapters/copilotCLI.js.map +1 -0
  11. package/dist/config/defaultScenarios.d.ts +6 -0
  12. package/dist/config/defaultScenarios.d.ts.map +1 -0
  13. package/dist/config/defaultScenarios.js +209 -0
  14. package/dist/config/defaultScenarios.js.map +1 -0
  15. package/dist/config/loader.d.ts +13 -0
  16. package/dist/config/loader.d.ts.map +1 -0
  17. package/dist/config/loader.js +153 -0
  18. package/dist/config/loader.js.map +1 -0
  19. package/dist/evaluator.d.ts +45 -0
  20. package/dist/evaluator.d.ts.map +1 -0
  21. package/dist/evaluator.js +226 -0
  22. package/dist/evaluator.js.map +1 -0
  23. package/dist/index.d.ts +13 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +38 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/runner.d.ts +6 -0
  28. package/dist/runner.d.ts.map +1 -0
  29. package/dist/runner.js +233 -0
  30. package/dist/runner.js.map +1 -0
  31. package/dist/types.d.ts +354 -0
  32. package/dist/types.d.ts.map +1 -0
  33. package/dist/types.js +6 -0
  34. package/dist/types.js.map +1 -0
  35. package/dist/utils/baselineManager.d.ts +53 -0
  36. package/dist/utils/baselineManager.d.ts.map +1 -0
  37. package/dist/utils/baselineManager.js +220 -0
  38. package/dist/utils/baselineManager.js.map +1 -0
  39. package/dist/utils/gitUtils.d.ts +39 -0
  40. package/dist/utils/gitUtils.d.ts.map +1 -0
  41. package/dist/utils/gitUtils.js +121 -0
  42. package/dist/utils/gitUtils.js.map +1 -0
  43. package/dist/utils/githubAuth.d.ts +22 -0
  44. package/dist/utils/githubAuth.d.ts.map +1 -0
  45. package/dist/utils/githubAuth.js +79 -0
  46. package/dist/utils/githubAuth.js.map +1 -0
  47. package/dist/utils/workspaceUtils.d.ts +32 -0
  48. package/dist/utils/workspaceUtils.d.ts.map +1 -0
  49. package/dist/utils/workspaceUtils.js +121 -0
  50. package/dist/utils/workspaceUtils.js.map +1 -0
  51. package/dist/validators/eslintValidator.d.ts +22 -0
  52. package/dist/validators/eslintValidator.d.ts.map +1 -0
  53. package/dist/validators/eslintValidator.js +217 -0
  54. package/dist/validators/eslintValidator.js.map +1 -0
  55. package/dist/validators/llmJudge.d.ts +28 -0
  56. package/dist/validators/llmJudge.d.ts.map +1 -0
  57. package/dist/validators/llmJudge.js +241 -0
  58. package/dist/validators/llmJudge.js.map +1 -0
  59. package/dist/validators/patternValidator.d.ts +27 -0
  60. package/dist/validators/patternValidator.d.ts.map +1 -0
  61. package/dist/validators/patternValidator.js +233 -0
  62. package/dist/validators/patternValidator.js.map +1 -0
  63. package/package.json +50 -0
@@ -0,0 +1,354 @@
1
+ /**
2
+ * Core type definitions for coding-agent-benchmarks
3
+ */
4
+ /**
5
+ * Generic categories for test scenarios
6
+ */
7
+ export type TestCategory = 'typescript' | 'react' | 'testing' | 'architecture' | 'performance' | 'general';
8
+ /**
9
+ * Severity levels for test scenarios
10
+ */
11
+ export type Severity = 'critical' | 'major' | 'minor';
12
+ /**
13
+ * Supported adapter types
14
+ */
15
+ export type AdapterType = 'copilot' | 'claude-code';
16
+ /**
17
+ * Pattern matching configuration for code validation
18
+ */
19
+ export interface PatternValidation {
20
+ /**
21
+ * Regex patterns that should NOT appear in generated code
22
+ */
23
+ forbiddenPatterns?: readonly RegExp[];
24
+ /**
25
+ * Regex patterns that MUST appear in generated code
26
+ */
27
+ requiredPatterns?: readonly RegExp[];
28
+ /**
29
+ * Import statements that should NOT be present
30
+ * Example: ['from "lodash"', 'import * as']
31
+ */
32
+ forbiddenImports?: readonly string[];
33
+ /**
34
+ * Import statements that MUST be present
35
+ */
36
+ requiredImports?: readonly string[];
37
+ /**
38
+ * File name patterns that should NOT be created
39
+ */
40
+ forbiddenFileNamePatterns?: readonly RegExp[];
41
+ /**
42
+ * File name patterns that MUST be created
43
+ */
44
+ requiredFileNamePatterns?: readonly RegExp[];
45
+ }
46
+ /**
47
+ * LLM-as-judge validation configuration
48
+ */
49
+ export interface LLMJudgeValidation {
50
+ /**
51
+ * Enable LLM-based semantic validation
52
+ */
53
+ enabled: boolean;
54
+ /**
55
+ * Custom prompt for the LLM judge
56
+ * If not provided, a default judgment prompt will be used
57
+ */
58
+ judgmentPrompt?: string;
59
+ /**
60
+ * Model to use for judgment (default: openai/gpt-4.1)
61
+ */
62
+ model?: string;
63
+ }
64
+ /**
65
+ * ESLint validation configuration
66
+ */
67
+ export interface ESLintValidation {
68
+ /**
69
+ * Enable ESLint validation on generated code
70
+ */
71
+ enabled: boolean;
72
+ /**
73
+ * Custom ESLint config path (optional)
74
+ */
75
+ configPath?: string;
76
+ }
77
+ /**
78
+ * Validation strategy combining multiple validation methods
79
+ */
80
+ export interface ValidationStrategy {
81
+ /**
82
+ * Pattern-based validation
83
+ */
84
+ patterns?: PatternValidation;
85
+ /**
86
+ * LLM-as-judge validation
87
+ */
88
+ llmJudge?: LLMJudgeValidation;
89
+ /**
90
+ * ESLint validation
91
+ */
92
+ eslint?: ESLintValidation;
93
+ }
94
+ /**
95
+ * A test scenario defining a coding task and validation criteria
96
+ */
97
+ export interface TestScenario {
98
+ /**
99
+ * Unique identifier for the scenario
100
+ */
101
+ id: string;
102
+ /**
103
+ * Category of the test
104
+ */
105
+ category: TestCategory;
106
+ /**
107
+ * Severity level of violations
108
+ */
109
+ severity: Severity;
110
+ /**
111
+ * Tags for filtering and organization
112
+ */
113
+ tags: readonly string[];
114
+ /**
115
+ * Human-readable description of what this scenario tests
116
+ */
117
+ description: string;
118
+ /**
119
+ * The prompt/instruction given to the coding agent
120
+ */
121
+ prompt: string;
122
+ /**
123
+ * Optional inline context to include with the prompt
124
+ */
125
+ context?: string;
126
+ /**
127
+ * Optional context files to provide to the agent
128
+ * Paths are resolved relative to the workspace root
129
+ */
130
+ contextFiles?: readonly string[];
131
+ /**
132
+ * Validation strategy to apply to generated code
133
+ */
134
+ validationStrategy: ValidationStrategy;
135
+ /**
136
+ * Optional timeout in milliseconds
137
+ * - number: Specific timeout (e.g., 120000 = 2 minutes)
138
+ * - null: No timeout (wait indefinitely)
139
+ * - undefined: Use defaultTimeout from config, or 120000ms default
140
+ */
141
+ timeout?: number | null;
142
+ }
143
+ /**
144
+ * A violation found during validation
145
+ */
146
+ export interface Violation {
147
+ /**
148
+ * Type of validation that found this violation
149
+ */
150
+ type: 'pattern' | 'llm-judge' | 'eslint';
151
+ /**
152
+ * Description of the violation
153
+ */
154
+ message: string;
155
+ /**
156
+ * File where the violation was found (if applicable)
157
+ */
158
+ file?: string;
159
+ /**
160
+ * Line number where the violation was found (if applicable)
161
+ */
162
+ line?: number;
163
+ /**
164
+ * Severity of the violation
165
+ */
166
+ severity: Severity;
167
+ /**
168
+ * Additional details about the violation
169
+ */
170
+ details?: string;
171
+ }
172
+ /**
173
+ * Result of a single validation
174
+ */
175
+ export interface ValidationResult {
176
+ /**
177
+ * Whether the validation passed
178
+ */
179
+ passed: boolean;
180
+ /**
181
+ * Score from 0.0 to 1.0 (1.0 = perfect, 0.0 = failed)
182
+ * -1 = validation was skipped
183
+ */
184
+ score: number;
185
+ /**
186
+ * List of violations found
187
+ */
188
+ violations: Violation[];
189
+ /**
190
+ * Type of validator that produced this result
191
+ */
192
+ validatorType: 'pattern' | 'llm-judge' | 'eslint';
193
+ /**
194
+ * Error message if the validator itself failed
195
+ */
196
+ error?: string;
197
+ }
198
+ /**
199
+ * Result of evaluating a single scenario
200
+ */
201
+ export interface EvaluationResult {
202
+ /**
203
+ * The scenario that was evaluated
204
+ */
205
+ scenario: TestScenario;
206
+ /**
207
+ * Whether the scenario passed overall
208
+ */
209
+ passed: boolean;
210
+ /**
211
+ * Overall score (average of all validator scores)
212
+ */
213
+ score: number;
214
+ /**
215
+ * Results from each validator
216
+ */
217
+ validationResults: ValidationResult[];
218
+ /**
219
+ * All violations found across all validators
220
+ */
221
+ violations: Violation[];
222
+ /**
223
+ * Generated code (if available)
224
+ */
225
+ generatedCode?: {
226
+ files: {
227
+ path: string;
228
+ content: string;
229
+ }[];
230
+ };
231
+ /**
232
+ * Time taken to evaluate (milliseconds)
233
+ */
234
+ duration: number;
235
+ /**
236
+ * Error message if evaluation failed
237
+ */
238
+ error?: string;
239
+ /**
240
+ * Baseline comparison (if available)
241
+ */
242
+ baselineComparison?: {
243
+ baselineScore: number;
244
+ delta: number;
245
+ isImprovement: boolean;
246
+ };
247
+ }
248
+ /**
249
+ * Full evaluation report for multiple scenarios
250
+ */
251
+ export interface EvaluationReport {
252
+ /**
253
+ * Adapter used for code generation
254
+ */
255
+ adapter: AdapterType;
256
+ /**
257
+ * Model used (if applicable)
258
+ */
259
+ model?: string;
260
+ /**
261
+ * Timestamp when evaluation started
262
+ */
263
+ timestamp: string;
264
+ /**
265
+ * Results for each scenario
266
+ */
267
+ results: EvaluationResult[];
268
+ /**
269
+ * Summary statistics
270
+ */
271
+ summary: {
272
+ total: number;
273
+ passed: number;
274
+ failed: number;
275
+ skipped: number;
276
+ averageScore: number;
277
+ totalViolations: number;
278
+ };
279
+ /**
280
+ * Total duration of all evaluations (milliseconds)
281
+ */
282
+ totalDuration: number;
283
+ }
284
+ /**
285
+ * Interface for code generation adapters
286
+ */
287
+ export interface CodeGenerationAdapter {
288
+ /**
289
+ * Type identifier for this adapter
290
+ */
291
+ type: AdapterType;
292
+ /**
293
+ * Check if the adapter's CLI tool is available
294
+ */
295
+ checkAvailability(): Promise<boolean>;
296
+ /**
297
+ * Generate code based on a prompt
298
+ * @param prompt The instruction/prompt for the coding agent
299
+ * @param contextFiles Optional context files to provide
300
+ * @param timeout Timeout in milliseconds, or null for no timeout (default: null = no timeout)
301
+ * @returns List of files that were created or modified
302
+ */
303
+ generate(prompt: string, contextFiles?: readonly string[], timeout?: number | null): Promise<string[]>;
304
+ }
305
+ /**
306
+ * Interface for code validators
307
+ */
308
+ export interface CodeValidator {
309
+ /**
310
+ * Type identifier for this validator
311
+ */
312
+ type: 'pattern' | 'llm-judge' | 'eslint';
313
+ /**
314
+ * Validate generated code
315
+ * @param files List of file paths that were generated
316
+ * @param scenario The test scenario being evaluated
317
+ * @returns Validation result
318
+ */
319
+ validate(files: readonly string[], scenario: TestScenario): Promise<ValidationResult>;
320
+ }
321
+ /**
322
+ * Configuration file structure
323
+ */
324
+ export interface BenchmarkConfig {
325
+ /**
326
+ * Custom test scenarios
327
+ */
328
+ scenarios?: TestScenario[];
329
+ /**
330
+ * Default adapter to use
331
+ */
332
+ defaultAdapter?: AdapterType;
333
+ /**
334
+ * Default LLM model for judge
335
+ */
336
+ defaultModel?: string;
337
+ /**
338
+ * Workspace root directory (auto-detected if not specified)
339
+ */
340
+ workspaceRoot?: string;
341
+ /**
342
+ * Default timeout for code generation in milliseconds
343
+ * Applies to all scenarios unless overridden per-scenario
344
+ * - number: Specific timeout (e.g., 120000 = 2 minutes)
345
+ * - null: No timeout (wait indefinitely)
346
+ * - undefined: Use built-in default of 120000ms
347
+ */
348
+ defaultTimeout?: number | null;
349
+ /**
350
+ * Output directory for reports
351
+ */
352
+ outputDir?: string;
353
+ }
354
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,cAAc,GAAG,aAAa,GAAG,SAAS,CAAC;AAE3G;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEtC;;OAEG;IACH,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAErC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAErC;;OAEG;IACH,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEpC;;OAEG;IACH,yBAAyB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAE9C;;OAEG;IACH,wBAAwB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAE9B;;OAEG;IACH,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,QAAQ,EAAE,YAAY,CAAC;IAEvB;;OAEG;IACH,QAAQ,EAAE,QAAQ,CAAC;IAEnB;;OAEG;IACH,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IAExB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEjC;;OAEG;IACH,kBAAkB,EAAE,kBAAkB,CAAC;IAEvC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,IAAI,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAEzC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,EAAE,QAAQ,CAAC;IAEnB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,UAAU,EAAE,SAAS,EAAE,CAAC;IAExB;;OAEG;IACH,aAAa,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAElD;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,QAAQ,EAAE,YAAY,CAAC;IAEvB;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IAEtC;;OAEG;IACH,UAAU,EAAE,SAAS,EAAE,CAAC;IAExB;;OAEG;IACH,aAAa,CAAC,EAAE;QACd,KAAK,EAAE;YACL,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,CAAC;SACjB,EAAE,CAAC;KACL,CAAC;IAEF;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,kBAAkB,CAAC,EAAE;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,OAAO,CAAC;KACxB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,OAAO,EAAE,WAAW,CAAC;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAE5B;;OAEG;IACH,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IAEF;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,IAAI,EAAE,WAAW,CAAC;IAElB;;OAEG;IACH,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtC;;;;;;OAMG;IACH,QAAQ,CACN,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,EAChC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAEzC;;;;;OAKG;IACH,QAAQ,CACN,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAE3B;;OAEG;IACH,cAAc,CAAC,EAAE,WAAW,CAAC;IAE7B;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
package/dist/types.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Core type definitions for coding-agent-benchmarks
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Baseline management for tracking evaluation results over time
3
+ */
4
+ import { AdapterType, EvaluationResult, Violation } from '../types';
5
+ export interface BaselineData {
6
+ scenarioId: string;
7
+ score: number;
8
+ violations: Violation[];
9
+ timestamp: string;
10
+ adapter: AdapterType;
11
+ model?: string;
12
+ }
13
+ export declare class BaselineManager {
14
+ private baselineDir;
15
+ constructor(workspaceRoot: string);
16
+ /**
17
+ * Get the baseline file path for a scenario
18
+ */
19
+ private getBaselinePath;
20
+ /**
21
+ * Save a baseline result
22
+ */
23
+ saveBaseline(result: EvaluationResult, adapter: AdapterType, model?: string): void;
24
+ /**
25
+ * Load a baseline result
26
+ */
27
+ loadBaseline(adapter: AdapterType, model: string, scenarioId: string): BaselineData | null;
28
+ /**
29
+ * Compare current result with baseline
30
+ */
31
+ compareWithBaseline(result: EvaluationResult, adapter: AdapterType, model?: string): {
32
+ baselineScore: number;
33
+ delta: number;
34
+ isImprovement: boolean;
35
+ } | null;
36
+ /**
37
+ * List all baselines for an adapter
38
+ */
39
+ listBaselines(adapter: AdapterType, model?: string): BaselineData[];
40
+ /**
41
+ * Collect baselines from a directory
42
+ */
43
+ private collectBaselinesFromDir;
44
+ /**
45
+ * Delete a baseline
46
+ */
47
+ deleteBaseline(adapter: AdapterType, model: string, scenarioId: string): boolean;
48
+ /**
49
+ * Delete all baselines for an adapter
50
+ */
51
+ deleteAllBaselines(adapter: AdapterType, model?: string): number;
52
+ }
53
+ //# sourceMappingURL=baselineManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baselineManager.d.ts","sourceRoot":"","sources":["../../src/utils/baselineManager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;gBAEhB,aAAa,EAAE,MAAM;IAIjC;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,YAAY,CACV,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,EACpB,KAAK,GAAE,MAAkB,GACxB,IAAI;IAsBP;;OAEG;IACH,YAAY,CACV,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB,YAAY,GAAG,IAAI;IAgBtB;;OAEG;IACH,mBAAmB,CACjB,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,EACpB,KAAK,GAAE,MAAkB,GACxB;QACD,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,OAAO,CAAC;KACxB,GAAG,IAAI;IAiBR;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE;IA4BnE;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAe/B;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAgBhF;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;CA8CjE"}
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ /**
3
+ * Baseline management for tracking evaluation results over time
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.BaselineManager = void 0;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ class BaselineManager {
43
+ constructor(workspaceRoot) {
44
+ this.baselineDir = path.join(workspaceRoot, '.benchmarks', 'baselines');
45
+ }
46
+ /**
47
+ * Get the baseline file path for a scenario
48
+ */
49
+ getBaselinePath(adapter, model, scenarioId) {
50
+ return path.join(this.baselineDir, adapter, model, `${scenarioId}.json`);
51
+ }
52
+ /**
53
+ * Save a baseline result
54
+ */
55
+ saveBaseline(result, adapter, model = 'default') {
56
+ const baseline = {
57
+ scenarioId: result.scenario.id,
58
+ score: result.score,
59
+ violations: result.violations,
60
+ timestamp: new Date().toISOString(),
61
+ adapter,
62
+ model,
63
+ };
64
+ const baselinePath = this.getBaselinePath(adapter, model, result.scenario.id);
65
+ const dir = path.dirname(baselinePath);
66
+ // Ensure directory exists
67
+ if (!fs.existsSync(dir)) {
68
+ fs.mkdirSync(dir, { recursive: true });
69
+ }
70
+ // Write baseline file
71
+ fs.writeFileSync(baselinePath, JSON.stringify(baseline, null, 2), 'utf-8');
72
+ }
73
+ /**
74
+ * Load a baseline result
75
+ */
76
+ loadBaseline(adapter, model, scenarioId) {
77
+ const baselinePath = this.getBaselinePath(adapter, model, scenarioId);
78
+ if (!fs.existsSync(baselinePath)) {
79
+ return null;
80
+ }
81
+ try {
82
+ const content = fs.readFileSync(baselinePath, 'utf-8');
83
+ return JSON.parse(content);
84
+ }
85
+ catch (error) {
86
+ console.warn(`Failed to load baseline for ${scenarioId}:`, error);
87
+ return null;
88
+ }
89
+ }
90
+ /**
91
+ * Compare current result with baseline
92
+ */
93
+ compareWithBaseline(result, adapter, model = 'default') {
94
+ const baseline = this.loadBaseline(adapter, model, result.scenario.id);
95
+ if (!baseline) {
96
+ return null;
97
+ }
98
+ const delta = result.score - baseline.score;
99
+ const isImprovement = delta > 0;
100
+ return {
101
+ baselineScore: baseline.score,
102
+ delta,
103
+ isImprovement,
104
+ };
105
+ }
106
+ /**
107
+ * List all baselines for an adapter
108
+ */
109
+ listBaselines(adapter, model) {
110
+ const baselines = [];
111
+ const adapterDir = path.join(this.baselineDir, adapter);
112
+ if (!fs.existsSync(adapterDir)) {
113
+ return baselines;
114
+ }
115
+ // If model specified, only search that model directory
116
+ if (model) {
117
+ const modelDir = path.join(adapterDir, model);
118
+ if (fs.existsSync(modelDir)) {
119
+ this.collectBaselinesFromDir(modelDir, baselines);
120
+ }
121
+ }
122
+ else {
123
+ // Search all model directories
124
+ const modelDirs = fs.readdirSync(adapterDir, { withFileTypes: true });
125
+ for (const dir of modelDirs) {
126
+ if (dir.isDirectory()) {
127
+ const modelDir = path.join(adapterDir, dir.name);
128
+ this.collectBaselinesFromDir(modelDir, baselines);
129
+ }
130
+ }
131
+ }
132
+ return baselines;
133
+ }
134
+ /**
135
+ * Collect baselines from a directory
136
+ */
137
+ collectBaselinesFromDir(dir, baselines) {
138
+ const files = fs.readdirSync(dir);
139
+ for (const file of files) {
140
+ if (file.endsWith('.json')) {
141
+ try {
142
+ const content = fs.readFileSync(path.join(dir, file), 'utf-8');
143
+ const baseline = JSON.parse(content);
144
+ baselines.push(baseline);
145
+ }
146
+ catch (error) {
147
+ console.warn(`Failed to load baseline ${file}:`, error);
148
+ }
149
+ }
150
+ }
151
+ }
152
+ /**
153
+ * Delete a baseline
154
+ */
155
+ deleteBaseline(adapter, model, scenarioId) {
156
+ const baselinePath = this.getBaselinePath(adapter, model, scenarioId);
157
+ if (!fs.existsSync(baselinePath)) {
158
+ return false;
159
+ }
160
+ try {
161
+ fs.unlinkSync(baselinePath);
162
+ return true;
163
+ }
164
+ catch (error) {
165
+ console.warn(`Failed to delete baseline for ${scenarioId}:`, error);
166
+ return false;
167
+ }
168
+ }
169
+ /**
170
+ * Delete all baselines for an adapter
171
+ */
172
+ deleteAllBaselines(adapter, model) {
173
+ let count = 0;
174
+ const adapterDir = path.join(this.baselineDir, adapter);
175
+ if (!fs.existsSync(adapterDir)) {
176
+ return 0;
177
+ }
178
+ if (model) {
179
+ const modelDir = path.join(adapterDir, model);
180
+ if (fs.existsSync(modelDir)) {
181
+ const files = fs.readdirSync(modelDir);
182
+ for (const file of files) {
183
+ if (file.endsWith('.json')) {
184
+ try {
185
+ fs.unlinkSync(path.join(modelDir, file));
186
+ count++;
187
+ }
188
+ catch (error) {
189
+ console.warn(`Failed to delete ${file}:`, error);
190
+ }
191
+ }
192
+ }
193
+ }
194
+ }
195
+ else {
196
+ // Delete all models
197
+ const modelDirs = fs.readdirSync(adapterDir, { withFileTypes: true });
198
+ for (const dir of modelDirs) {
199
+ if (dir.isDirectory()) {
200
+ const modelDir = path.join(adapterDir, dir.name);
201
+ const files = fs.readdirSync(modelDir);
202
+ for (const file of files) {
203
+ if (file.endsWith('.json')) {
204
+ try {
205
+ fs.unlinkSync(path.join(modelDir, file));
206
+ count++;
207
+ }
208
+ catch (error) {
209
+ console.warn(`Failed to delete ${file}:`, error);
210
+ }
211
+ }
212
+ }
213
+ }
214
+ }
215
+ }
216
+ return count;
217
+ }
218
+ }
219
+ exports.BaselineManager = BaselineManager;
220
+ //# sourceMappingURL=baselineManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baselineManager.js","sourceRoot":"","sources":["../../src/utils/baselineManager.ts"],"names":[],"mappings":"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"}