@renseiai/agentfactory 0.8.19 → 0.8.21
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/dist/src/config/repository-config.d.ts +7 -0
- package/dist/src/config/repository-config.d.ts.map +1 -1
- package/dist/src/config/repository-config.js +15 -1
- package/dist/src/config/repository-config.test.js +1 -1
- package/dist/src/governor/decision-engine-adapter.js +5 -10
- package/dist/src/governor/decision-engine-adapter.test.js +13 -14
- package/dist/src/governor/decision-engine.js +3 -7
- package/dist/src/governor/decision-engine.test.js +5 -5
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/merge-queue/adapters/local.d.ts +68 -0
- package/dist/src/merge-queue/adapters/local.d.ts.map +1 -0
- package/dist/src/merge-queue/adapters/local.js +136 -0
- package/dist/src/merge-queue/adapters/local.test.d.ts +2 -0
- package/dist/src/merge-queue/adapters/local.test.d.ts.map +1 -0
- package/dist/src/merge-queue/adapters/local.test.js +176 -0
- package/dist/src/merge-queue/index.d.ts +13 -5
- package/dist/src/merge-queue/index.d.ts.map +1 -1
- package/dist/src/merge-queue/index.js +13 -6
- package/dist/src/merge-queue/merge-queue.integration.test.js +19 -0
- package/dist/src/merge-queue/merge-worker.d.ts.map +1 -1
- package/dist/src/merge-queue/merge-worker.js +29 -0
- package/dist/src/merge-queue/types.d.ts +1 -1
- package/dist/src/merge-queue/types.d.ts.map +1 -1
- package/dist/src/orchestrator/index.d.ts +4 -0
- package/dist/src/orchestrator/index.d.ts.map +1 -1
- package/dist/src/orchestrator/index.js +3 -0
- package/dist/src/orchestrator/orchestrator.d.ts +31 -0
- package/dist/src/orchestrator/orchestrator.d.ts.map +1 -1
- package/dist/src/orchestrator/orchestrator.js +263 -11
- package/dist/src/orchestrator/parse-work-result.d.ts.map +1 -1
- package/dist/src/orchestrator/parse-work-result.js +3 -1
- package/dist/src/orchestrator/parse-work-result.test.js +6 -0
- package/dist/src/orchestrator/quality-baseline.d.ts +83 -0
- package/dist/src/orchestrator/quality-baseline.d.ts.map +1 -0
- package/dist/src/orchestrator/quality-baseline.js +313 -0
- package/dist/src/orchestrator/quality-baseline.test.d.ts +2 -0
- package/dist/src/orchestrator/quality-baseline.test.d.ts.map +1 -0
- package/dist/src/orchestrator/quality-baseline.test.js +448 -0
- package/dist/src/orchestrator/quality-ratchet.d.ts +70 -0
- package/dist/src/orchestrator/quality-ratchet.d.ts.map +1 -0
- package/dist/src/orchestrator/quality-ratchet.js +162 -0
- package/dist/src/orchestrator/quality-ratchet.test.d.ts +2 -0
- package/dist/src/orchestrator/quality-ratchet.test.d.ts.map +1 -0
- package/dist/src/orchestrator/quality-ratchet.test.js +335 -0
- package/dist/src/orchestrator/types.d.ts +2 -0
- package/dist/src/orchestrator/types.d.ts.map +1 -1
- package/dist/src/providers/codex-app-server-provider.d.ts +37 -1
- package/dist/src/providers/codex-app-server-provider.d.ts.map +1 -1
- package/dist/src/providers/codex-app-server-provider.js +290 -35
- package/dist/src/providers/codex-app-server-provider.test.js +72 -12
- package/dist/src/providers/codex-approval-bridge.d.ts +49 -0
- package/dist/src/providers/codex-approval-bridge.d.ts.map +1 -0
- package/dist/src/providers/codex-approval-bridge.js +117 -0
- package/dist/src/providers/codex-approval-bridge.test.d.ts +2 -0
- package/dist/src/providers/codex-approval-bridge.test.d.ts.map +1 -0
- package/dist/src/providers/codex-approval-bridge.test.js +188 -0
- package/dist/src/providers/types.d.ts +25 -0
- package/dist/src/providers/types.d.ts.map +1 -1
- package/dist/src/routing/types.d.ts +1 -1
- package/dist/src/templates/adapters.d.ts +25 -0
- package/dist/src/templates/adapters.d.ts.map +1 -1
- package/dist/src/templates/adapters.js +70 -0
- package/dist/src/templates/adapters.test.js +49 -0
- package/dist/src/templates/index.d.ts +1 -0
- package/dist/src/templates/index.d.ts.map +1 -1
- package/dist/src/templates/registry.d.ts +8 -0
- package/dist/src/templates/registry.d.ts.map +1 -1
- package/dist/src/templates/registry.js +11 -0
- package/dist/src/templates/types.d.ts +22 -0
- package/dist/src/templates/types.d.ts.map +1 -1
- package/dist/src/templates/types.js +12 -0
- package/dist/src/tools/index.d.ts +2 -0
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +1 -0
- package/dist/src/tools/registry.d.ts +9 -1
- package/dist/src/tools/registry.d.ts.map +1 -1
- package/dist/src/tools/registry.js +13 -1
- package/dist/src/tools/stdio-server-entry.d.ts +25 -0
- package/dist/src/tools/stdio-server-entry.d.ts.map +1 -0
- package/dist/src/tools/stdio-server-entry.js +205 -0
- package/dist/src/tools/stdio-server.d.ts +87 -0
- package/dist/src/tools/stdio-server.d.ts.map +1 -0
- package/dist/src/tools/stdio-server.js +138 -0
- package/dist/src/workflow/workflow-types.d.ts +3 -3
- package/package.json +3 -2
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quality Baseline — Capture & Compare
|
|
3
|
+
*
|
|
4
|
+
* Captures quality metrics (test counts, typecheck errors, lint errors) from a
|
|
5
|
+
* worktree at a point in time. The orchestrator captures a baseline on main
|
|
6
|
+
* before the agent starts, then compares after the agent finishes. If the agent
|
|
7
|
+
* made quality worse (delta > 0 for any failure metric), promotion is blocked.
|
|
8
|
+
*
|
|
9
|
+
* This module is standalone — no orchestrator or template dependencies.
|
|
10
|
+
*/
|
|
11
|
+
import { execSync } from 'node:child_process';
|
|
12
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
13
|
+
import { resolve } from 'node:path';
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Baseline capture
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
/**
|
|
18
|
+
* Capture quality metrics from a worktree. Runs test, typecheck, and lint
|
|
19
|
+
* commands, parsing their output for structured counts.
|
|
20
|
+
*
|
|
21
|
+
* Each command is independent — a failure in one does not prevent capturing the others.
|
|
22
|
+
*/
|
|
23
|
+
export function captureQualityBaseline(worktreePath, config = {}) {
|
|
24
|
+
const pm = config.packageManager ?? 'pnpm';
|
|
25
|
+
const timeout = config.timeoutMs ?? 120_000;
|
|
26
|
+
const commitSha = getCommitSha(worktreePath);
|
|
27
|
+
const tests = captureTestMetrics(worktreePath, config.testCommand ?? `${pm} test`, timeout);
|
|
28
|
+
const typecheck = captureTypecheckMetrics(worktreePath, config.validateCommand ?? `${pm} typecheck`, timeout);
|
|
29
|
+
const lint = captureLintMetrics(worktreePath, config.lintCommand, timeout);
|
|
30
|
+
return {
|
|
31
|
+
timestamp: new Date().toISOString(),
|
|
32
|
+
commitSha,
|
|
33
|
+
tests,
|
|
34
|
+
typecheck,
|
|
35
|
+
lint,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Delta computation
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
/**
|
|
42
|
+
* Compute the quality delta between a baseline and current snapshot.
|
|
43
|
+
* Pure arithmetic — no side effects.
|
|
44
|
+
*/
|
|
45
|
+
export function computeQualityDelta(baseline, current) {
|
|
46
|
+
const testFailuresDelta = current.tests.failed - baseline.tests.failed;
|
|
47
|
+
const typeErrorsDelta = current.typecheck.errorCount - baseline.typecheck.errorCount;
|
|
48
|
+
const lintErrorsDelta = current.lint.errorCount - baseline.lint.errorCount;
|
|
49
|
+
const testCountDelta = current.tests.total - baseline.tests.total;
|
|
50
|
+
return {
|
|
51
|
+
testFailuresDelta,
|
|
52
|
+
typeErrorsDelta,
|
|
53
|
+
lintErrorsDelta,
|
|
54
|
+
testCountDelta,
|
|
55
|
+
passed: testFailuresDelta <= 0 && typeErrorsDelta <= 0 && lintErrorsDelta <= 0,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// Report formatting
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
/**
|
|
62
|
+
* Format a quality comparison into a markdown table for diagnostic comments.
|
|
63
|
+
*/
|
|
64
|
+
export function formatQualityReport(baseline, current, delta) {
|
|
65
|
+
const badge = delta.passed ? '**PASSED**' : '**FAILED**';
|
|
66
|
+
const lines = [
|
|
67
|
+
`Quality Gate: ${badge}`,
|
|
68
|
+
'',
|
|
69
|
+
'| Metric | Baseline (main) | Current (branch) | Delta |',
|
|
70
|
+
'|--------|---------------:|----------------:|------:|',
|
|
71
|
+
`| Test failures | ${baseline.tests.failed} | ${current.tests.failed} | ${formatDelta(delta.testFailuresDelta)} |`,
|
|
72
|
+
`| Typecheck errors | ${baseline.typecheck.errorCount} | ${current.typecheck.errorCount} | ${formatDelta(delta.typeErrorsDelta)} |`,
|
|
73
|
+
`| Lint errors | ${baseline.lint.errorCount} | ${current.lint.errorCount} | ${formatDelta(delta.lintErrorsDelta)} |`,
|
|
74
|
+
`| Test count | ${baseline.tests.total} | ${current.tests.total} | ${formatDelta(delta.testCountDelta, true)} |`,
|
|
75
|
+
];
|
|
76
|
+
if (delta.testCountDelta < 0) {
|
|
77
|
+
lines.push('');
|
|
78
|
+
lines.push(`> Warning: ${Math.abs(delta.testCountDelta)} test(s) were removed.`);
|
|
79
|
+
}
|
|
80
|
+
return lines.join('\n');
|
|
81
|
+
}
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Persistence helpers
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
/**
|
|
86
|
+
* Save a quality baseline to the worktree's .agent/ directory.
|
|
87
|
+
*/
|
|
88
|
+
export function saveBaseline(worktreePath, baseline) {
|
|
89
|
+
const agentDir = resolve(worktreePath, '.agent');
|
|
90
|
+
writeFileSync(resolve(agentDir, 'quality-baseline.json'), JSON.stringify(baseline, null, 2));
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Load a previously saved quality baseline from the worktree's .agent/ directory.
|
|
94
|
+
* Returns null if no baseline exists.
|
|
95
|
+
*/
|
|
96
|
+
export function loadBaseline(worktreePath) {
|
|
97
|
+
const baselinePath = resolve(worktreePath, '.agent', 'quality-baseline.json');
|
|
98
|
+
if (!existsSync(baselinePath))
|
|
99
|
+
return null;
|
|
100
|
+
try {
|
|
101
|
+
return JSON.parse(readFileSync(baselinePath, 'utf-8'));
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
// Internal helpers
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
function getCommitSha(worktreePath) {
|
|
111
|
+
try {
|
|
112
|
+
return execSync('git rev-parse HEAD', {
|
|
113
|
+
cwd: worktreePath,
|
|
114
|
+
encoding: 'utf-8',
|
|
115
|
+
timeout: 10_000,
|
|
116
|
+
}).trim();
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return 'unknown';
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Run the test command and parse output for test counts.
|
|
124
|
+
*
|
|
125
|
+
* Strategy: run with `--reporter=json` appended. If the output is valid JSON
|
|
126
|
+
* with vitest/jest fields, parse counts from it. Otherwise fall back to
|
|
127
|
+
* counting FAIL lines in text output.
|
|
128
|
+
*/
|
|
129
|
+
function captureTestMetrics(worktreePath, testCommand, timeout) {
|
|
130
|
+
const defaults = { total: 0, passed: 0, failed: 0, skipped: 0 };
|
|
131
|
+
try {
|
|
132
|
+
// Try JSON reporter first for structured output
|
|
133
|
+
const jsonCommand = `${testCommand} -- --reporter=json`;
|
|
134
|
+
const output = runCommand(jsonCommand, worktreePath, timeout);
|
|
135
|
+
const parsed = parseVitestJson(output);
|
|
136
|
+
if (parsed)
|
|
137
|
+
return parsed;
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// JSON reporter may not be available or test command may have failed
|
|
141
|
+
}
|
|
142
|
+
// Fall back to running the test command and parsing exit code + text
|
|
143
|
+
try {
|
|
144
|
+
const output = runCommand(testCommand, worktreePath, timeout);
|
|
145
|
+
return parseTestTextOutput(output) ?? defaults;
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
// Test command failed — try to parse the error output for counts
|
|
149
|
+
const errorOutput = extractErrorOutput(error);
|
|
150
|
+
const parsed = parseTestTextOutput(errorOutput);
|
|
151
|
+
if (parsed)
|
|
152
|
+
return parsed;
|
|
153
|
+
// Complete failure — assume tests exist but all fail
|
|
154
|
+
return { ...defaults, failed: 1 };
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Run the typecheck command and count errors.
|
|
159
|
+
*/
|
|
160
|
+
function captureTypecheckMetrics(worktreePath, validateCommand, timeout) {
|
|
161
|
+
try {
|
|
162
|
+
runCommand(validateCommand, worktreePath, timeout);
|
|
163
|
+
return { errorCount: 0, exitCode: 0 };
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
const output = extractErrorOutput(error);
|
|
167
|
+
const errorCount = countTypescriptErrors(output);
|
|
168
|
+
const exitCode = error?.status ?? 1;
|
|
169
|
+
return { errorCount: Math.max(errorCount, exitCode !== 0 ? 1 : 0), exitCode };
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Run the lint command and count errors/warnings.
|
|
174
|
+
* Lint is optional — returns zero counts if no lint command is configured.
|
|
175
|
+
*/
|
|
176
|
+
function captureLintMetrics(worktreePath, lintCommand, timeout) {
|
|
177
|
+
if (!lintCommand) {
|
|
178
|
+
return { errorCount: 0, warningCount: 0 };
|
|
179
|
+
}
|
|
180
|
+
try {
|
|
181
|
+
const output = runCommand(lintCommand, worktreePath, timeout);
|
|
182
|
+
return parseLintOutput(output);
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
const output = extractErrorOutput(error);
|
|
186
|
+
return parseLintOutput(output);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function runCommand(command, cwd, timeout) {
|
|
190
|
+
return execSync(command, {
|
|
191
|
+
cwd,
|
|
192
|
+
encoding: 'utf-8',
|
|
193
|
+
timeout,
|
|
194
|
+
maxBuffer: 10 * 1024 * 1024, // 10MB
|
|
195
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
function extractErrorOutput(error) {
|
|
199
|
+
if (error && typeof error === 'object') {
|
|
200
|
+
const e = error;
|
|
201
|
+
const stdout = typeof e.stdout === 'string' ? e.stdout : '';
|
|
202
|
+
const stderr = typeof e.stderr === 'string' ? e.stderr : '';
|
|
203
|
+
return stdout + '\n' + stderr;
|
|
204
|
+
}
|
|
205
|
+
return String(error);
|
|
206
|
+
}
|
|
207
|
+
// ---------------------------------------------------------------------------
|
|
208
|
+
// Output parsers
|
|
209
|
+
// ---------------------------------------------------------------------------
|
|
210
|
+
/**
|
|
211
|
+
* Parse vitest JSON reporter output.
|
|
212
|
+
* Expected fields: numTotalTests, numPassedTests, numFailedTests
|
|
213
|
+
*/
|
|
214
|
+
export function parseVitestJson(output) {
|
|
215
|
+
try {
|
|
216
|
+
// vitest JSON output may have non-JSON prefix — find the JSON object
|
|
217
|
+
const jsonStart = output.indexOf('{');
|
|
218
|
+
if (jsonStart === -1)
|
|
219
|
+
return null;
|
|
220
|
+
const json = JSON.parse(output.slice(jsonStart));
|
|
221
|
+
if (typeof json.numTotalTests === 'number') {
|
|
222
|
+
return {
|
|
223
|
+
total: json.numTotalTests,
|
|
224
|
+
passed: json.numPassedTests ?? 0,
|
|
225
|
+
failed: json.numFailedTests ?? 0,
|
|
226
|
+
skipped: (json.numTotalTests - (json.numPassedTests ?? 0) - (json.numFailedTests ?? 0)),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
// vitest v2+ format
|
|
230
|
+
if (json.testResults && Array.isArray(json.testResults)) {
|
|
231
|
+
let total = 0, passed = 0, failed = 0;
|
|
232
|
+
for (const suite of json.testResults) {
|
|
233
|
+
if (suite.assertionResults && Array.isArray(suite.assertionResults)) {
|
|
234
|
+
for (const test of suite.assertionResults) {
|
|
235
|
+
total++;
|
|
236
|
+
if (test.status === 'passed')
|
|
237
|
+
passed++;
|
|
238
|
+
else if (test.status === 'failed')
|
|
239
|
+
failed++;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return { total, passed, failed, skipped: total - passed - failed };
|
|
244
|
+
}
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Parse test text output for counts using common patterns.
|
|
253
|
+
* Supports vitest and jest text output formats.
|
|
254
|
+
*/
|
|
255
|
+
function parseTestTextOutput(output) {
|
|
256
|
+
if (!output)
|
|
257
|
+
return null;
|
|
258
|
+
// Vitest format: "Tests 42 passed | 2 failed | 44 total"
|
|
259
|
+
// Also: "Tests 42 passed (44)"
|
|
260
|
+
const vitestMatch = output.match(/Tests\s+(\d+)\s+passed(?:\s*\|\s*(\d+)\s+failed)?(?:\s*\|\s*(\d+)\s+skipped)?(?:\s*\|\s*(\d+)\s+total|\s*\((\d+)\))/);
|
|
261
|
+
if (vitestMatch) {
|
|
262
|
+
const passed = parseInt(vitestMatch[1], 10);
|
|
263
|
+
const failed = parseInt(vitestMatch[2] ?? '0', 10);
|
|
264
|
+
const skipped = parseInt(vitestMatch[3] ?? '0', 10);
|
|
265
|
+
const total = parseInt(vitestMatch[4] ?? vitestMatch[5] ?? String(passed + failed + skipped), 10);
|
|
266
|
+
return { total, passed, failed, skipped };
|
|
267
|
+
}
|
|
268
|
+
// Jest format: "Tests: 2 failed, 42 passed, 44 total"
|
|
269
|
+
const jestMatch = output.match(/Tests:\s+(?:(\d+)\s+failed,\s+)?(\d+)\s+passed,\s+(\d+)\s+total/);
|
|
270
|
+
if (jestMatch) {
|
|
271
|
+
const failed = parseInt(jestMatch[1] ?? '0', 10);
|
|
272
|
+
const passed = parseInt(jestMatch[2], 10);
|
|
273
|
+
const total = parseInt(jestMatch[3], 10);
|
|
274
|
+
return { total, passed, failed, skipped: total - passed - failed };
|
|
275
|
+
}
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Count TypeScript errors in tsc output.
|
|
280
|
+
* Matches lines like: "src/foo.ts(10,5): error TS2304: ..."
|
|
281
|
+
*/
|
|
282
|
+
export function countTypescriptErrors(output) {
|
|
283
|
+
if (!output)
|
|
284
|
+
return 0;
|
|
285
|
+
const matches = output.match(/error TS\d+/g);
|
|
286
|
+
return matches?.length ?? 0;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Parse eslint output for error/warning counts.
|
|
290
|
+
* Matches: "N problems (N errors, N warnings)"
|
|
291
|
+
*/
|
|
292
|
+
function parseLintOutput(output) {
|
|
293
|
+
if (!output)
|
|
294
|
+
return { errorCount: 0, warningCount: 0 };
|
|
295
|
+
// ESLint summary: "✖ 10 problems (6 errors, 4 warnings)"
|
|
296
|
+
const eslintMatch = output.match(/(\d+)\s+problems?\s*\((\d+)\s+errors?,\s*(\d+)\s+warnings?\)/);
|
|
297
|
+
if (eslintMatch) {
|
|
298
|
+
return {
|
|
299
|
+
errorCount: parseInt(eslintMatch[2], 10),
|
|
300
|
+
warningCount: parseInt(eslintMatch[3], 10),
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
// Simple error line counting as fallback
|
|
304
|
+
const errorLines = (output.match(/\berror\b/gi) ?? []).length;
|
|
305
|
+
const warningLines = (output.match(/\bwarning\b/gi) ?? []).length;
|
|
306
|
+
return { errorCount: errorLines, warningCount: warningLines };
|
|
307
|
+
}
|
|
308
|
+
function formatDelta(value, invertSign = false) {
|
|
309
|
+
if (value === 0)
|
|
310
|
+
return '0';
|
|
311
|
+
const display = invertSign ? value : value;
|
|
312
|
+
return display > 0 ? `+${display}` : String(display);
|
|
313
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-baseline.test.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/quality-baseline.test.ts"],"names":[],"mappings":""}
|