@chanl/eval-cli 0.4.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/LICENSE +21 -0
- package/dist/agent-loader.d.ts +39 -0
- package/dist/agent-loader.d.ts.map +1 -0
- package/dist/agent-loader.js +166 -0
- package/dist/agent-loader.js.map +1 -0
- package/dist/analytics.d.ts +15 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +94 -0
- package/dist/analytics.js.map +1 -0
- package/dist/assertions.d.ts +73 -0
- package/dist/assertions.d.ts.map +1 -0
- package/dist/assertions.js +282 -0
- package/dist/assertions.js.map +1 -0
- package/dist/baseline.d.ts +100 -0
- package/dist/baseline.d.ts.map +1 -0
- package/dist/baseline.js +327 -0
- package/dist/baseline.js.map +1 -0
- package/dist/bin/chanl.d.ts +3 -0
- package/dist/bin/chanl.d.ts.map +1 -0
- package/dist/bin/chanl.js +11 -0
- package/dist/bin/chanl.js.map +1 -0
- package/dist/client.d.ts +40 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +99 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/analytics.d.ts +3 -0
- package/dist/commands/analytics.d.ts.map +1 -0
- package/dist/commands/analytics.js +44 -0
- package/dist/commands/analytics.js.map +1 -0
- package/dist/commands/compare.d.ts +51 -0
- package/dist/commands/compare.d.ts.map +1 -0
- package/dist/commands/compare.js +429 -0
- package/dist/commands/compare.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +94 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/dataset.d.ts +6 -0
- package/dist/commands/dataset.d.ts.map +1 -0
- package/dist/commands/dataset.js +225 -0
- package/dist/commands/dataset.js.map +1 -0
- package/dist/commands/executions.d.ts +3 -0
- package/dist/commands/executions.d.ts.map +1 -0
- package/dist/commands/executions.js +249 -0
- package/dist/commands/executions.js.map +1 -0
- package/dist/commands/generate.d.ts +3 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +159 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +29 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +545 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +65 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/personas.d.ts +3 -0
- package/dist/commands/personas.d.ts.map +1 -0
- package/dist/commands/personas.js +269 -0
- package/dist/commands/personas.js.map +1 -0
- package/dist/commands/scenarios.d.ts +16 -0
- package/dist/commands/scenarios.d.ts.map +1 -0
- package/dist/commands/scenarios.js +755 -0
- package/dist/commands/scenarios.js.map +1 -0
- package/dist/commands/scorecards.d.ts +3 -0
- package/dist/commands/scorecards.d.ts.map +1 -0
- package/dist/commands/scorecards.js +220 -0
- package/dist/commands/scorecards.js.map +1 -0
- package/dist/commands/server.d.ts +8 -0
- package/dist/commands/server.d.ts.map +1 -0
- package/dist/commands/server.js +357 -0
- package/dist/commands/server.js.map +1 -0
- package/dist/commands/test.d.ts +3 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +410 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/tool-fixtures.d.ts +3 -0
- package/dist/commands/tool-fixtures.d.ts.map +1 -0
- package/dist/commands/tool-fixtures.js +324 -0
- package/dist/commands/tool-fixtures.js.map +1 -0
- package/dist/config.d.ts +32 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +132 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +146 -0
- package/dist/index.js.map +1 -0
- package/dist/output.d.ts +30 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +77 -0
- package/dist/output.js.map +1 -0
- package/dist/update-check.d.ts +6 -0
- package/dist/update-check.d.ts.map +1 -0
- package/dist/update-check.js +50 -0
- package/dist/update-check.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Assertion engine for `chanl test` — evaluates pass/fail assertions
|
|
4
|
+
* against scenario execution results.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.extractTranscriptText = extractTranscriptText;
|
|
8
|
+
exports.extractAvgResponseTimeSecs = extractAvgResponseTimeSecs;
|
|
9
|
+
exports.extractToolCalls = extractToolCalls;
|
|
10
|
+
exports.extractOverallScore = extractOverallScore;
|
|
11
|
+
exports.evaluateAssertions = evaluateAssertions;
|
|
12
|
+
/* ------------------------------------------------------------------ */
|
|
13
|
+
/* Transcript helpers */
|
|
14
|
+
/* ------------------------------------------------------------------ */
|
|
15
|
+
/**
|
|
16
|
+
* Extract the full transcript text from an execution's stepResults.
|
|
17
|
+
* Concatenates all actualResponse fields.
|
|
18
|
+
*/
|
|
19
|
+
function extractTranscriptText(execution) {
|
|
20
|
+
if (!execution.stepResults || !Array.isArray(execution.stepResults)) {
|
|
21
|
+
return '';
|
|
22
|
+
}
|
|
23
|
+
return execution.stepResults
|
|
24
|
+
.map((step) => step.actualResponse || '')
|
|
25
|
+
.filter(Boolean)
|
|
26
|
+
.join('\n');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Extract average agent response time in seconds from execution data.
|
|
30
|
+
* Checks execution.metrics first, then computes from stepResults durations.
|
|
31
|
+
*/
|
|
32
|
+
function extractAvgResponseTimeSecs(execution) {
|
|
33
|
+
// Check for pre-computed latency in metrics
|
|
34
|
+
if (execution.metrics?.avgResponseTimeMs) {
|
|
35
|
+
return execution.metrics.avgResponseTimeMs / 1000;
|
|
36
|
+
}
|
|
37
|
+
// Compute from stepResults agent durations
|
|
38
|
+
if (execution.stepResults && Array.isArray(execution.stepResults)) {
|
|
39
|
+
const agentSteps = execution.stepResults.filter((s) => typeof s.stepId === 'string' &&
|
|
40
|
+
s.stepId.includes('agent') &&
|
|
41
|
+
s.duration > 0);
|
|
42
|
+
if (agentSteps.length > 0) {
|
|
43
|
+
const total = agentSteps.reduce((sum, s) => sum + s.duration, 0);
|
|
44
|
+
return total / agentSteps.length / 1000;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Fall back to overall duration if available
|
|
48
|
+
if (execution.duration) {
|
|
49
|
+
return execution.duration / 1000;
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Extract tool names mentioned in an execution.
|
|
55
|
+
* Checks stepResults metadata and falls back to transcript keyword search.
|
|
56
|
+
*/
|
|
57
|
+
function extractToolCalls(execution) {
|
|
58
|
+
const tools = new Set();
|
|
59
|
+
if (execution.stepResults && Array.isArray(execution.stepResults)) {
|
|
60
|
+
for (const step of execution.stepResults) {
|
|
61
|
+
// Check step metadata for tool call info
|
|
62
|
+
if (step.toolCalls && Array.isArray(step.toolCalls)) {
|
|
63
|
+
for (const tc of step.toolCalls) {
|
|
64
|
+
if (tc.name)
|
|
65
|
+
tools.add(tc.name);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (step.metadata?.toolCalls && Array.isArray(step.metadata.toolCalls)) {
|
|
69
|
+
for (const tc of step.metadata.toolCalls) {
|
|
70
|
+
if (tc.name)
|
|
71
|
+
tools.add(tc.name);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Check execution-level metrics
|
|
77
|
+
if (execution.metrics?.toolCalls && Array.isArray(execution.metrics.toolCalls)) {
|
|
78
|
+
for (const tc of execution.metrics.toolCalls) {
|
|
79
|
+
if (typeof tc === 'string')
|
|
80
|
+
tools.add(tc);
|
|
81
|
+
else if (tc.name)
|
|
82
|
+
tools.add(tc.name);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return Array.from(tools);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Extract the overall score from an execution, if present.
|
|
89
|
+
*/
|
|
90
|
+
function extractOverallScore(execution) {
|
|
91
|
+
if (typeof execution.overallScore === 'number') {
|
|
92
|
+
return execution.overallScore;
|
|
93
|
+
}
|
|
94
|
+
if (typeof execution.metadata?.scorecardResult?.overallScore === 'number') {
|
|
95
|
+
return execution.metadata.scorecardResult.overallScore;
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
/* ------------------------------------------------------------------ */
|
|
100
|
+
/* Assertion evaluators */
|
|
101
|
+
/* ------------------------------------------------------------------ */
|
|
102
|
+
function evaluateKeyword(assertion, execution) {
|
|
103
|
+
const transcript = extractTranscriptText(execution).toLowerCase();
|
|
104
|
+
const description = assertion.description || 'Keyword check';
|
|
105
|
+
if (assertion.must_include && assertion.must_include.length > 0) {
|
|
106
|
+
const missing = assertion.must_include.filter((kw) => !transcript.includes(kw.toLowerCase()));
|
|
107
|
+
if (missing.length > 0) {
|
|
108
|
+
return {
|
|
109
|
+
type: 'keyword',
|
|
110
|
+
description,
|
|
111
|
+
passed: false,
|
|
112
|
+
actual: `missing: ${missing.join(', ')}`,
|
|
113
|
+
expected: `must include: ${assertion.must_include.join(', ')}`,
|
|
114
|
+
reason: `Keywords not found in transcript: ${missing.join(', ')}`,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (assertion.must_not_include && assertion.must_not_include.length > 0) {
|
|
119
|
+
const found = assertion.must_not_include.filter((kw) => transcript.includes(kw.toLowerCase()));
|
|
120
|
+
if (found.length > 0) {
|
|
121
|
+
return {
|
|
122
|
+
type: 'keyword',
|
|
123
|
+
description,
|
|
124
|
+
passed: false,
|
|
125
|
+
actual: `found: ${found.join(', ')}`,
|
|
126
|
+
expected: `must not include: ${assertion.must_not_include.join(', ')}`,
|
|
127
|
+
reason: `Forbidden keywords found in transcript: ${found.join(', ')}`,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
type: 'keyword',
|
|
133
|
+
description,
|
|
134
|
+
passed: true,
|
|
135
|
+
actual: 'all keywords matched',
|
|
136
|
+
expected: formatKeywordExpected(assertion),
|
|
137
|
+
reason: 'All keyword checks passed',
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function formatKeywordExpected(assertion) {
|
|
141
|
+
const parts = [];
|
|
142
|
+
if (assertion.must_include?.length) {
|
|
143
|
+
parts.push(`include: ${assertion.must_include.join(', ')}`);
|
|
144
|
+
}
|
|
145
|
+
if (assertion.must_not_include?.length) {
|
|
146
|
+
parts.push(`exclude: ${assertion.must_not_include.join(', ')}`);
|
|
147
|
+
}
|
|
148
|
+
return parts.join('; ');
|
|
149
|
+
}
|
|
150
|
+
function evaluateResponseTime(assertion, execution) {
|
|
151
|
+
const description = assertion.description || 'Response time check';
|
|
152
|
+
const actualSecs = extractAvgResponseTimeSecs(execution);
|
|
153
|
+
if (actualSecs === null) {
|
|
154
|
+
return {
|
|
155
|
+
type: 'response_time',
|
|
156
|
+
description,
|
|
157
|
+
passed: false,
|
|
158
|
+
actual: 'no timing data',
|
|
159
|
+
expected: `<= ${assertion.max_seconds}s`,
|
|
160
|
+
reason: 'No response time data available in execution results',
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
const passed = actualSecs <= assertion.max_seconds;
|
|
164
|
+
return {
|
|
165
|
+
type: 'response_time',
|
|
166
|
+
description,
|
|
167
|
+
passed,
|
|
168
|
+
actual: `${actualSecs.toFixed(2)}s`,
|
|
169
|
+
expected: `<= ${assertion.max_seconds}s`,
|
|
170
|
+
reason: passed
|
|
171
|
+
? `Response time ${actualSecs.toFixed(2)}s within limit`
|
|
172
|
+
: `Response time ${actualSecs.toFixed(2)}s exceeds ${assertion.max_seconds}s limit`,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
function evaluatePrompt(assertion, execution) {
|
|
176
|
+
const description = assertion.description || 'Prompt-based check';
|
|
177
|
+
const score = extractOverallScore(execution);
|
|
178
|
+
if (score === null) {
|
|
179
|
+
return {
|
|
180
|
+
type: 'prompt',
|
|
181
|
+
description,
|
|
182
|
+
passed: false,
|
|
183
|
+
actual: 'no scorecard score',
|
|
184
|
+
expected: `>= ${assertion.min_score}/10`,
|
|
185
|
+
reason: 'No scorecard score available. Ensure the scenario has a scorecard configured.',
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
// Normalize: if score is 0-100, scale to 0-10 for comparison
|
|
189
|
+
const normalizedScore = score > 10 ? score / 10 : score;
|
|
190
|
+
const passed = normalizedScore >= assertion.min_score;
|
|
191
|
+
return {
|
|
192
|
+
type: 'prompt',
|
|
193
|
+
description,
|
|
194
|
+
passed,
|
|
195
|
+
actual: `${normalizedScore.toFixed(1)}/10`,
|
|
196
|
+
expected: `>= ${assertion.min_score}/10`,
|
|
197
|
+
reason: passed
|
|
198
|
+
? `Score ${normalizedScore.toFixed(1)} meets minimum ${assertion.min_score}`
|
|
199
|
+
: `Score ${normalizedScore.toFixed(1)} below minimum ${assertion.min_score}`,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
function evaluateToolCall(assertion, execution) {
|
|
203
|
+
const description = assertion.description || 'Tool call check';
|
|
204
|
+
const actualTools = extractToolCalls(execution);
|
|
205
|
+
// If no tools found via structured data, fall back to transcript search
|
|
206
|
+
let effectiveTools = actualTools;
|
|
207
|
+
if (actualTools.length === 0) {
|
|
208
|
+
const transcript = extractTranscriptText(execution).toLowerCase();
|
|
209
|
+
effectiveTools = assertion.expected.filter((tool) => transcript.includes(tool.toLowerCase()));
|
|
210
|
+
}
|
|
211
|
+
const missing = assertion.expected.filter((tool) => !effectiveTools.some((actual) => actual.toLowerCase() === tool.toLowerCase()));
|
|
212
|
+
const passed = missing.length === 0;
|
|
213
|
+
return {
|
|
214
|
+
type: 'tool_call',
|
|
215
|
+
description,
|
|
216
|
+
passed,
|
|
217
|
+
actual: effectiveTools.length > 0 ? effectiveTools.join(', ') : 'none',
|
|
218
|
+
expected: assertion.expected.join(', '),
|
|
219
|
+
reason: passed
|
|
220
|
+
? `All expected tools were called: ${assertion.expected.join(', ')}`
|
|
221
|
+
: `Missing tool calls: ${missing.join(', ')}`,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
function evaluateScore(assertion, execution) {
|
|
225
|
+
const description = assertion.description || 'Score check';
|
|
226
|
+
const score = extractOverallScore(execution);
|
|
227
|
+
if (score === null) {
|
|
228
|
+
return {
|
|
229
|
+
type: 'score',
|
|
230
|
+
description,
|
|
231
|
+
passed: false,
|
|
232
|
+
actual: 'no score',
|
|
233
|
+
expected: `>= ${assertion.min_score}`,
|
|
234
|
+
reason: 'No overall score available in execution results',
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
const passed = score >= assertion.min_score;
|
|
238
|
+
return {
|
|
239
|
+
type: 'score',
|
|
240
|
+
description,
|
|
241
|
+
passed,
|
|
242
|
+
actual: String(score),
|
|
243
|
+
expected: `>= ${assertion.min_score}`,
|
|
244
|
+
reason: passed
|
|
245
|
+
? `Score ${score} meets minimum ${assertion.min_score}`
|
|
246
|
+
: `Score ${score} below minimum ${assertion.min_score}`,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/* ------------------------------------------------------------------ */
|
|
250
|
+
/* Public API */
|
|
251
|
+
/* ------------------------------------------------------------------ */
|
|
252
|
+
/**
|
|
253
|
+
* Evaluate all assertions against an execution result.
|
|
254
|
+
*/
|
|
255
|
+
function evaluateAssertions(assertions, execution) {
|
|
256
|
+
return assertions.map((assertion) => {
|
|
257
|
+
switch (assertion.type) {
|
|
258
|
+
case 'keyword':
|
|
259
|
+
return evaluateKeyword(assertion, execution);
|
|
260
|
+
case 'response_time':
|
|
261
|
+
return evaluateResponseTime(assertion, execution);
|
|
262
|
+
case 'prompt':
|
|
263
|
+
return evaluatePrompt(assertion, execution);
|
|
264
|
+
case 'tool_call':
|
|
265
|
+
return evaluateToolCall(assertion, execution);
|
|
266
|
+
case 'score':
|
|
267
|
+
return evaluateScore(assertion, execution);
|
|
268
|
+
default: {
|
|
269
|
+
const unknown = assertion;
|
|
270
|
+
return {
|
|
271
|
+
type: (typeof unknown.type === 'string' ? unknown.type : 'unknown'),
|
|
272
|
+
description: (typeof unknown.description === 'string' ? unknown.description : 'Unknown assertion type'),
|
|
273
|
+
passed: false,
|
|
274
|
+
actual: 'N/A',
|
|
275
|
+
expected: 'N/A',
|
|
276
|
+
reason: `Unknown assertion type: ${typeof unknown.type === 'string' ? unknown.type : 'unknown'}`,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=assertions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertions.js","sourceRoot":"","sources":["../src/assertions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baseline management for `chanl test --save-baseline` / `--baseline`.
|
|
3
|
+
*
|
|
4
|
+
* Saves test results as a JSON snapshot and compares future runs
|
|
5
|
+
* against the snapshot to detect regressions.
|
|
6
|
+
*/
|
|
7
|
+
export interface BaselineAssertionEntry {
|
|
8
|
+
[assertionKey: string]: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface BaselineTestEntry {
|
|
11
|
+
score: number | null;
|
|
12
|
+
assertions: Record<string, boolean>;
|
|
13
|
+
}
|
|
14
|
+
export interface BaselineFile {
|
|
15
|
+
version: 1;
|
|
16
|
+
savedAt: string;
|
|
17
|
+
results: Record<string, BaselineTestEntry>;
|
|
18
|
+
}
|
|
19
|
+
export type ComparisonStatus = 'improved' | 'regressed' | 'unchanged' | 'added' | 'removed';
|
|
20
|
+
export interface AssertionComparison {
|
|
21
|
+
name: string;
|
|
22
|
+
status: ComparisonStatus;
|
|
23
|
+
before: boolean | null;
|
|
24
|
+
after: boolean | null;
|
|
25
|
+
}
|
|
26
|
+
export interface TestComparison {
|
|
27
|
+
file: string;
|
|
28
|
+
status: ComparisonStatus;
|
|
29
|
+
scoreBefore: number | null;
|
|
30
|
+
scoreAfter: number | null;
|
|
31
|
+
scoreDelta: number | null;
|
|
32
|
+
assertions: AssertionComparison[];
|
|
33
|
+
}
|
|
34
|
+
export interface BaselineComparison {
|
|
35
|
+
tests: TestComparison[];
|
|
36
|
+
summary: {
|
|
37
|
+
improved: number;
|
|
38
|
+
regressed: number;
|
|
39
|
+
unchanged: number;
|
|
40
|
+
added: number;
|
|
41
|
+
removed: number;
|
|
42
|
+
};
|
|
43
|
+
hasRegressions: boolean;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Build a stable key for an assertion result.
|
|
47
|
+
* Uses the description if available, otherwise falls back to type + index.
|
|
48
|
+
*/
|
|
49
|
+
export declare function assertionKey(result: {
|
|
50
|
+
type: string;
|
|
51
|
+
description?: string;
|
|
52
|
+
}, index: number): string;
|
|
53
|
+
/**
|
|
54
|
+
* Build a BaselineFile from test results (same shape as test.ts TestFileResult[]).
|
|
55
|
+
*/
|
|
56
|
+
export declare function buildBaseline(results: Array<{
|
|
57
|
+
file: string;
|
|
58
|
+
scenarioName: string;
|
|
59
|
+
assertions: Array<{
|
|
60
|
+
type: string;
|
|
61
|
+
description: string;
|
|
62
|
+
passed: boolean;
|
|
63
|
+
}>;
|
|
64
|
+
error?: string;
|
|
65
|
+
}>): BaselineFile;
|
|
66
|
+
/**
|
|
67
|
+
* Save baseline results to a JSON file.
|
|
68
|
+
*/
|
|
69
|
+
export declare function saveBaseline(results: Array<{
|
|
70
|
+
file: string;
|
|
71
|
+
scenarioName: string;
|
|
72
|
+
assertions: Array<{
|
|
73
|
+
type: string;
|
|
74
|
+
description: string;
|
|
75
|
+
passed: boolean;
|
|
76
|
+
}>;
|
|
77
|
+
error?: string;
|
|
78
|
+
}>, filePath?: string): string;
|
|
79
|
+
/**
|
|
80
|
+
* Load a baseline file. Returns null if the file does not exist.
|
|
81
|
+
*/
|
|
82
|
+
export declare function loadBaseline(filePath?: string): BaselineFile | null;
|
|
83
|
+
/**
|
|
84
|
+
* Compare current test results against a saved baseline.
|
|
85
|
+
*/
|
|
86
|
+
export declare function compareWithBaseline(currentResults: Array<{
|
|
87
|
+
file: string;
|
|
88
|
+
scenarioName: string;
|
|
89
|
+
assertions: Array<{
|
|
90
|
+
type: string;
|
|
91
|
+
description: string;
|
|
92
|
+
passed: boolean;
|
|
93
|
+
}>;
|
|
94
|
+
error?: string;
|
|
95
|
+
}>, baseline: BaselineFile): BaselineComparison;
|
|
96
|
+
/**
|
|
97
|
+
* Print a human-readable baseline comparison to stdout.
|
|
98
|
+
*/
|
|
99
|
+
export declare function printBaselineComparison(comparison: BaselineComparison): void;
|
|
100
|
+
//# sourceMappingURL=baseline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../src/baseline.ts"],"names":[],"mappings":"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"}
|