@tracecart/cli 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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +131 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +149 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/delta.d.ts +1 -0
  7. package/dist/commands/delta.js +19 -0
  8. package/dist/commands/delta.js.map +1 -0
  9. package/dist/commands/extract-prompt.d.ts +2 -0
  10. package/dist/commands/extract-prompt.js +35 -0
  11. package/dist/commands/extract-prompt.js.map +1 -0
  12. package/dist/commands/extract-validate.d.ts +2 -0
  13. package/dist/commands/extract-validate.js +21 -0
  14. package/dist/commands/extract-validate.js.map +1 -0
  15. package/dist/commands/finalize.d.ts +1 -0
  16. package/dist/commands/finalize.js +64 -0
  17. package/dist/commands/finalize.js.map +1 -0
  18. package/dist/commands/init.d.ts +1 -0
  19. package/dist/commands/init.js +33 -0
  20. package/dist/commands/init.js.map +1 -0
  21. package/dist/commands/match-prompt.d.ts +2 -0
  22. package/dist/commands/match-prompt.js +51 -0
  23. package/dist/commands/match-prompt.js.map +1 -0
  24. package/dist/commands/match-validate.d.ts +2 -0
  25. package/dist/commands/match-validate.js +15 -0
  26. package/dist/commands/match-validate.js.map +1 -0
  27. package/dist/commands/presets.d.ts +1 -0
  28. package/dist/commands/presets.js +14 -0
  29. package/dist/commands/presets.js.map +1 -0
  30. package/dist/commands/remainder.d.ts +1 -0
  31. package/dist/commands/remainder.js +19 -0
  32. package/dist/commands/remainder.js.map +1 -0
  33. package/dist/commands/reverse-extract-validate.d.ts +1 -0
  34. package/dist/commands/reverse-extract-validate.js +20 -0
  35. package/dist/commands/reverse-extract-validate.js.map +1 -0
  36. package/dist/commands/reverse-match-prompt.d.ts +2 -0
  37. package/dist/commands/reverse-match-prompt.js +50 -0
  38. package/dist/commands/reverse-match-prompt.js.map +1 -0
  39. package/dist/commands/reverse-match-validate.d.ts +1 -0
  40. package/dist/commands/reverse-match-validate.js +14 -0
  41. package/dist/commands/reverse-match-validate.js.map +1 -0
  42. package/dist/commands/split.d.ts +1 -0
  43. package/dist/commands/split.js +26 -0
  44. package/dist/commands/split.js.map +1 -0
  45. package/dist/commands/status.d.ts +1 -0
  46. package/dist/commands/status.js +34 -0
  47. package/dist/commands/status.js.map +1 -0
  48. package/dist/commands/update.d.ts +1 -0
  49. package/dist/commands/update.js +5 -0
  50. package/dist/commands/update.js.map +1 -0
  51. package/dist/extract/extract.d.ts +37 -0
  52. package/dist/extract/extract.js +158 -0
  53. package/dist/extract/extract.js.map +1 -0
  54. package/dist/extract/remainder.d.ts +16 -0
  55. package/dist/extract/remainder.js +34 -0
  56. package/dist/extract/remainder.js.map +1 -0
  57. package/dist/match/coverage.d.ts +64 -0
  58. package/dist/match/coverage.js +375 -0
  59. package/dist/match/coverage.js.map +1 -0
  60. package/dist/output/delta.d.ts +46 -0
  61. package/dist/output/delta.js +155 -0
  62. package/dist/output/delta.js.map +1 -0
  63. package/dist/output/trace-map.d.ts +89 -0
  64. package/dist/output/trace-map.js +135 -0
  65. package/dist/output/trace-map.js.map +1 -0
  66. package/dist/parse/clause-split.d.ts +20 -0
  67. package/dist/parse/clause-split.js +185 -0
  68. package/dist/parse/clause-split.js.map +1 -0
  69. package/dist/parse/discover-inputs.d.ts +16 -0
  70. package/dist/parse/discover-inputs.js +97 -0
  71. package/dist/parse/discover-inputs.js.map +1 -0
  72. package/dist/parse/parse-document.d.ts +28 -0
  73. package/dist/parse/parse-document.js +141 -0
  74. package/dist/parse/parse-document.js.map +1 -0
  75. package/dist/preset.d.ts +18 -0
  76. package/dist/preset.js +85 -0
  77. package/dist/preset.js.map +1 -0
  78. package/package.json +58 -0
  79. package/presets/spec-coverage.json +15 -0
  80. package/prompts/coverage_check.txt +38 -0
  81. package/prompts/extract.txt +40 -0
  82. package/prompts/reverse_check.txt +36 -0
  83. package/templates/claude/commands/tracecart.md +217 -0
@@ -0,0 +1,375 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { resolve, dirname } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = dirname(__filename);
6
+ const PROMPT_TEMPLATE_PATH = resolve(__dirname, '..', '..', 'prompts');
7
+ export const VALID_STATUSES = new Set([
8
+ 'COVERED', 'PARTIAL', 'MISSING', 'DEFERRED', 'N/A',
9
+ ]);
10
+ export const VALID_REVERSE_STATUSES = new Set([
11
+ 'TRACED', 'PARTIAL_SOURCE', 'UNTRACED_IN_SOURCE',
12
+ ]);
13
+ export const MAX_TRACES_PER_BATCH = 20;
14
+ export function parseTargetSections(targetText, targetFile = '') {
15
+ const sections = [];
16
+ let currentSection = null;
17
+ let currentLines = [];
18
+ const lines = targetText.split('\n');
19
+ for (let i = 0; i < lines.length; i++) {
20
+ const line = lines[i];
21
+ const stripped = line.trim();
22
+ let headerMatch = stripped.match(/^(#{1,4})\s+(.+)$/);
23
+ let sectionMatch = null;
24
+ if (!headerMatch) {
25
+ sectionMatch = stripped.match(/^(\d+(?:\.\d+)*)\s+(.+)$/);
26
+ }
27
+ const match = headerMatch ?? sectionMatch;
28
+ if (match) {
29
+ if (currentSection) {
30
+ currentSection.text = currentLines.join('\n').trim();
31
+ if (currentSection.text) {
32
+ sections.push(currentSection);
33
+ }
34
+ }
35
+ const title = match[2];
36
+ let sectionId = match[1];
37
+ if (sectionId.startsWith('#')) {
38
+ sectionId = `§${sectionId.length}`;
39
+ }
40
+ currentSection = {
41
+ id: sectionId,
42
+ title,
43
+ file: targetFile,
44
+ line: i + 1,
45
+ text: '',
46
+ };
47
+ currentLines = [line];
48
+ }
49
+ else if (currentSection) {
50
+ currentLines.push(line);
51
+ }
52
+ else if (stripped) {
53
+ if (!currentSection) {
54
+ currentSection = {
55
+ id: '§0',
56
+ title: '(preamble)',
57
+ file: targetFile,
58
+ line: 1,
59
+ text: '',
60
+ };
61
+ currentLines = [];
62
+ }
63
+ currentLines.push(line);
64
+ }
65
+ }
66
+ if (currentSection) {
67
+ currentSection.text = currentLines.join('\n').trim();
68
+ if (currentSection.text) {
69
+ sections.push(currentSection);
70
+ }
71
+ }
72
+ return sections;
73
+ }
74
+ export function formatPrompt(traces, targetText, exclusions = '', language = 'hu') {
75
+ const templatePath = language === 'en'
76
+ ? resolve(PROMPT_TEMPLATE_PATH, 'en', 'coverage_check.txt')
77
+ : resolve(PROMPT_TEMPLATE_PATH, 'coverage_check.txt');
78
+ const template = readFileSync(templatePath, 'utf-8');
79
+ const reqLines = [];
80
+ for (const t of traces) {
81
+ const tid = t.id ?? t.sentence_id ?? '';
82
+ const text = t.text ?? '';
83
+ const ttype = t.type ?? 'REQUIREMENT';
84
+ const implicit = t.implicit ? ' [implicit]' : '';
85
+ reqLines.push(`[${tid}] (${ttype}${implicit}) ${text}`);
86
+ }
87
+ let prompt = template.replace('{requirements}', reqLines.join('\n'));
88
+ prompt = prompt.replace('{specs}', targetText);
89
+ prompt = prompt.replace('{exclusions}', exclusions || '(none specified)');
90
+ return prompt;
91
+ }
92
+ export function batchTraces(traces, batchSize = MAX_TRACES_PER_BATCH) {
93
+ const batches = [];
94
+ for (let i = 0; i < traces.length; i += batchSize) {
95
+ batches.push(traces.slice(i, i + batchSize));
96
+ }
97
+ return batches;
98
+ }
99
+ export function validateMatches(rawOutput, traces, validStatuses = VALID_STATUSES) {
100
+ const errors = [];
101
+ const matches = [];
102
+ const parsed = parseJsonOutput(rawOutput);
103
+ if (parsed === null) {
104
+ return { matches: [], errors: ['Failed to parse LLM output as JSON'] };
105
+ }
106
+ if (!Array.isArray(parsed)) {
107
+ return { matches: [], errors: ['LLM output is not a JSON array'] };
108
+ }
109
+ const traceIds = new Set();
110
+ for (const t of traces) {
111
+ traceIds.add(t.id ?? t.sentence_id ?? '');
112
+ }
113
+ for (let i = 0; i < parsed.length; i++) {
114
+ const entry = parsed[i];
115
+ if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) {
116
+ errors.push(`Entry ${i}: not a dict`);
117
+ continue;
118
+ }
119
+ const rec = entry;
120
+ const sid = (rec.sentence_id ?? rec.id ?? rec.trace_id ?? '');
121
+ if (!sid) {
122
+ errors.push(`Entry ${i}: missing sentence_id/id`);
123
+ continue;
124
+ }
125
+ const status = (rec.status ?? '').toUpperCase();
126
+ if (!validStatuses.has(status)) {
127
+ errors.push(`Entry ${i} (${sid}): invalid status "${status}"`);
128
+ continue;
129
+ }
130
+ const match = {
131
+ trace_id: sid,
132
+ status,
133
+ spec_ref: rec.spec_ref ?? '',
134
+ notes: rec.notes ?? '',
135
+ };
136
+ if (rec.refs) {
137
+ match.refs = rec.refs;
138
+ }
139
+ matches.push(match);
140
+ }
141
+ const matchedIds = new Set(matches.map(m => m.trace_id));
142
+ const unmatched = [...traceIds].filter(id => !matchedIds.has(id)).sort();
143
+ if (unmatched.length > 0) {
144
+ errors.push(`Traces not matched by LLM: ${JSON.stringify(unmatched)}`);
145
+ }
146
+ return { matches, errors };
147
+ }
148
+ export function applyMatches(traces, matches) {
149
+ const matchMap = new Map();
150
+ for (const m of matches) {
151
+ const key = m.trace_id;
152
+ matchMap.set(key, m);
153
+ }
154
+ const result = [];
155
+ for (const trace of traces) {
156
+ const t = { ...trace };
157
+ const tid = t.id ?? t.sentence_id ?? '';
158
+ const match = matchMap.get(tid);
159
+ if (match) {
160
+ t.status = match.status;
161
+ const refs = [];
162
+ if (match.spec_ref) {
163
+ refs.push(parseSpecRef(match.spec_ref));
164
+ }
165
+ if (match.refs) {
166
+ refs.push(...match.refs);
167
+ }
168
+ t.refs = refs;
169
+ if (match.notes) {
170
+ t.notes = match.notes;
171
+ }
172
+ }
173
+ else {
174
+ t.status = 'MISSING';
175
+ t.refs = [];
176
+ }
177
+ result.push(t);
178
+ }
179
+ return result;
180
+ }
181
+ export function formatReversePrompt(reverseTraces, sourceTraces, language = 'hu') {
182
+ const templatePath = language === 'en'
183
+ ? resolve(PROMPT_TEMPLATE_PATH, 'en', 'reverse_check.txt')
184
+ : resolve(PROMPT_TEMPLATE_PATH, 'reverse_check.txt');
185
+ const template = readFileSync(templatePath, 'utf-8');
186
+ const claimLines = [];
187
+ for (const t of reverseTraces) {
188
+ const tid = t.id ?? '';
189
+ const text = t.text ?? '';
190
+ const ttype = t.type ?? 'REQUIREMENT';
191
+ claimLines.push(`[${tid}] (${ttype}) ${text}`);
192
+ }
193
+ const evidenceLines = [];
194
+ for (const t of sourceTraces) {
195
+ const tid = t.id ?? '';
196
+ const text = t.text ?? '';
197
+ const ttype = t.type ?? 'REQUIREMENT';
198
+ const implicit = t.implicit ? ' [implicit]' : '';
199
+ evidenceLines.push(`[${tid}] (${ttype}${implicit}) ${text}`);
200
+ }
201
+ let prompt = template.replace('{claims}', claimLines.join('\n'));
202
+ prompt = prompt.replace('{evidence}', evidenceLines.join('\n'));
203
+ return prompt;
204
+ }
205
+ export function validateReverseMatches(rawOutput, reverseTraces) {
206
+ const errors = [];
207
+ const matches = [];
208
+ const parsed = parseJsonOutput(rawOutput);
209
+ if (parsed === null) {
210
+ return { matches: [], errors: ['Failed to parse LLM output as JSON'] };
211
+ }
212
+ if (!Array.isArray(parsed)) {
213
+ return { matches: [], errors: ['LLM output is not a JSON array'] };
214
+ }
215
+ const claimIds = new Set();
216
+ for (const t of reverseTraces) {
217
+ claimIds.add(t.id ?? '');
218
+ }
219
+ for (let i = 0; i < parsed.length; i++) {
220
+ const entry = parsed[i];
221
+ if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) {
222
+ errors.push(`Entry ${i}: not a dict`);
223
+ continue;
224
+ }
225
+ const rec = entry;
226
+ const cid = (rec.claim_id ?? rec.id ?? rec.trace_id ?? '');
227
+ if (!cid) {
228
+ errors.push(`Entry ${i}: missing claim_id`);
229
+ continue;
230
+ }
231
+ const status = (rec.status ?? '').toUpperCase();
232
+ if (!VALID_REVERSE_STATUSES.has(status)) {
233
+ errors.push(`Entry ${i} (${cid}): invalid status "${status}"`);
234
+ continue;
235
+ }
236
+ const match = {
237
+ claim_id: cid,
238
+ status,
239
+ source_trace_id: rec.source_trace_id,
240
+ nearest_source_trace: rec.nearest_source_trace,
241
+ similarity_note: rec.similarity_note ?? '',
242
+ notes: rec.notes ?? '',
243
+ };
244
+ matches.push(match);
245
+ }
246
+ const matchedIds = new Set(matches.map(m => m.claim_id));
247
+ const unmatched = [...claimIds].filter(id => !matchedIds.has(id)).sort();
248
+ if (unmatched.length > 0) {
249
+ errors.push(`Claims not matched by LLM: ${JSON.stringify(unmatched)}`);
250
+ }
251
+ return { matches, errors };
252
+ }
253
+ export function applyReverseMatches(reverseTraces, matches) {
254
+ const matchMap = new Map();
255
+ for (const m of matches) {
256
+ matchMap.set(m.claim_id, m);
257
+ }
258
+ const result = [];
259
+ for (const trace of reverseTraces) {
260
+ const t = { ...trace };
261
+ const tid = t.id ?? '';
262
+ const match = matchMap.get(tid);
263
+ if (match) {
264
+ t.status = match.status;
265
+ t.nearest_source_trace = match.nearest_source_trace;
266
+ t.similarity_note = match.similarity_note;
267
+ if (match.source_trace_id) {
268
+ t.source_trace_id = match.source_trace_id;
269
+ }
270
+ if (match.notes) {
271
+ t.notes = match.notes;
272
+ }
273
+ }
274
+ else {
275
+ t.status = 'UNTRACED_IN_SOURCE';
276
+ t.nearest_source_trace = undefined;
277
+ t.similarity_note = 'not evaluated by LLM';
278
+ }
279
+ result.push(t);
280
+ }
281
+ return result;
282
+ }
283
+ export function resolveRefs(traces, targetFiles) {
284
+ const sectionIndex = new Map();
285
+ for (const tf of targetFiles) {
286
+ let lines;
287
+ try {
288
+ lines = readFileSync(tf, 'utf-8').split('\n');
289
+ }
290
+ catch {
291
+ continue;
292
+ }
293
+ for (let i = 0; i < lines.length; i++) {
294
+ const stripped = lines[i].trim();
295
+ if (/^#{1,4}\s+/.test(stripped)) {
296
+ sectionIndex.set(`${tf}\0${stripped}`, i + 1);
297
+ }
298
+ }
299
+ }
300
+ for (const trace of traces) {
301
+ const refs = trace.refs;
302
+ if (!refs)
303
+ continue;
304
+ for (const ref of refs) {
305
+ const fileIsReal = (ref.file ?? '').match(/\.(md|txt|json)$/);
306
+ if ((ref.line ?? 0) > 0 && fileIsReal) {
307
+ continue;
308
+ }
309
+ const section = ref.section ?? '';
310
+ if (!section)
311
+ continue;
312
+ let bestFile = '';
313
+ let bestLine = 0;
314
+ for (const [key, lineno] of sectionIndex) {
315
+ const [tf, header] = key.split('\0');
316
+ if (sectionMatches(section, header)) {
317
+ bestFile = tf;
318
+ bestLine = lineno;
319
+ break;
320
+ }
321
+ }
322
+ if (bestLine) {
323
+ ref.file = bestFile;
324
+ ref.line = bestLine;
325
+ }
326
+ }
327
+ }
328
+ return traces;
329
+ }
330
+ function parseSpecRef(refStr) {
331
+ const parts = refStr.split('§');
332
+ const filePart = parts.length > 0 ? parts[0].trim() : '';
333
+ const section = parts.length > 1 ? `§${parts[1].trim()}` : '';
334
+ return {
335
+ file: filePart,
336
+ section,
337
+ line: 0,
338
+ };
339
+ }
340
+ function sectionMatches(sectionRef, headerLine) {
341
+ const cleanRef = sectionRef.replace(/^§\s*/, '').trim().toLowerCase();
342
+ const cleanHeader = headerLine.replace(/^#+\s*/, '').trim().toLowerCase();
343
+ return cleanRef.includes(cleanHeader) || cleanHeader.includes(cleanRef);
344
+ }
345
+ export function parseJsonOutput(raw) {
346
+ raw = raw.trim();
347
+ if (raw.startsWith('```json')) {
348
+ raw = raw.slice(7);
349
+ }
350
+ if (raw.startsWith('```')) {
351
+ raw = raw.slice(3);
352
+ }
353
+ if (raw.endsWith('```')) {
354
+ raw = raw.slice(0, -3);
355
+ }
356
+ raw = raw.trim();
357
+ try {
358
+ return JSON.parse(raw);
359
+ }
360
+ catch {
361
+ // fall through
362
+ }
363
+ const start = raw.indexOf('[');
364
+ const end = raw.lastIndexOf(']');
365
+ if (start !== -1 && end !== -1 && end > start) {
366
+ try {
367
+ return JSON.parse(raw.slice(start, end + 1));
368
+ }
369
+ catch {
370
+ // fall through
371
+ }
372
+ }
373
+ return null;
374
+ }
375
+ //# sourceMappingURL=coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../src/match/coverage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ interface TraceEntry {
2
+ id: string;
3
+ text?: string;
4
+ status?: string;
5
+ }
6
+ interface TraceMap {
7
+ traces?: TraceEntry[];
8
+ summary?: {
9
+ coverage_score_pct?: number;
10
+ reverse_coverage_pct?: number;
11
+ };
12
+ }
13
+ interface DeltaItem {
14
+ id: string;
15
+ text: string;
16
+ old_status: string;
17
+ new_status: string;
18
+ }
19
+ interface NewOrRemovedItem {
20
+ id: string;
21
+ text: string;
22
+ status: string;
23
+ }
24
+ interface DeltaSummary {
25
+ old_coverage_pct: number;
26
+ new_coverage_pct: number;
27
+ coverage_diff: number;
28
+ improved_count: number;
29
+ regressed_count: number;
30
+ new_count: number;
31
+ removed_count: number;
32
+ unchanged_count: number;
33
+ old_reverse_pct?: number;
34
+ new_reverse_pct?: number;
35
+ reverse_diff?: number;
36
+ }
37
+ export interface DeltaResult {
38
+ summary: DeltaSummary;
39
+ improved: DeltaItem[];
40
+ regressed: DeltaItem[];
41
+ new: NewOrRemovedItem[];
42
+ removed: NewOrRemovedItem[];
43
+ }
44
+ export declare function compare(oldMap: TraceMap, newMap: TraceMap): DeltaResult;
45
+ export declare function formatText(delta: DeltaResult): string;
46
+ export {};
@@ -0,0 +1,155 @@
1
+ function _buildIndex(traces) {
2
+ const byId = new Map();
3
+ const byText = new Map();
4
+ for (const t of traces) {
5
+ byId.set(t.id, t);
6
+ const text = (t.text ?? '').trim().toLowerCase();
7
+ if (text) {
8
+ byText.set(text, t);
9
+ }
10
+ }
11
+ return [byId, byText];
12
+ }
13
+ const RANK = {
14
+ 'COVERED': 3, 'TRACED': 3,
15
+ 'PARTIAL': 2, 'PARTIAL_SOURCE': 2, 'DEFERRED': 2,
16
+ 'MISSING': 1, 'UNTRACED_IN_SOURCE': 1,
17
+ 'N/A': 0,
18
+ };
19
+ export function compare(oldMap, newMap) {
20
+ const oldTraces = oldMap.traces ?? [];
21
+ const newTraces = newMap.traces ?? [];
22
+ const [oldById, oldByText] = _buildIndex(oldTraces);
23
+ const [, newByText] = _buildIndex(newTraces);
24
+ const improved = [];
25
+ const regressed = [];
26
+ const unchanged = [];
27
+ const newItems = [];
28
+ const removed = [];
29
+ const matchedOld = new Set();
30
+ for (const t of newTraces) {
31
+ const tid = t.id;
32
+ let oldT = oldById.get(tid);
33
+ if (!oldT) {
34
+ const text = (t.text ?? '').trim().toLowerCase();
35
+ oldT = oldByText.get(text);
36
+ }
37
+ if (oldT) {
38
+ matchedOld.add(oldT.id);
39
+ const oldStatus = oldT.status ?? 'MISSING';
40
+ const newStatus = t.status ?? 'MISSING';
41
+ const oldRank = RANK[oldStatus] ?? 0;
42
+ const newRank = RANK[newStatus] ?? 0;
43
+ if (newRank > oldRank) {
44
+ improved.push({
45
+ id: tid, text: t.text ?? '',
46
+ old_status: oldStatus, new_status: newStatus,
47
+ });
48
+ }
49
+ else if (newRank < oldRank) {
50
+ regressed.push({
51
+ id: tid, text: t.text ?? '',
52
+ old_status: oldStatus, new_status: newStatus,
53
+ });
54
+ }
55
+ else {
56
+ unchanged.push(tid);
57
+ }
58
+ }
59
+ else {
60
+ newItems.push({
61
+ id: tid, text: t.text ?? '',
62
+ status: t.status ?? 'MISSING',
63
+ });
64
+ }
65
+ }
66
+ for (const t of oldTraces) {
67
+ if (!matchedOld.has(t.id)) {
68
+ const text = (t.text ?? '').trim().toLowerCase();
69
+ if (!newByText.has(text)) {
70
+ removed.push({
71
+ id: t.id, text: t.text ?? '',
72
+ status: t.status ?? 'MISSING',
73
+ });
74
+ }
75
+ }
76
+ }
77
+ const oldSummary = oldMap.summary ?? {};
78
+ const newSummary = newMap.summary ?? {};
79
+ const oldPct = oldSummary.coverage_score_pct ?? 0;
80
+ const newPct = newSummary.coverage_score_pct ?? 0;
81
+ const summary = {
82
+ old_coverage_pct: oldPct,
83
+ new_coverage_pct: newPct,
84
+ coverage_diff: Math.round((newPct - oldPct) * 10) / 10,
85
+ improved_count: improved.length,
86
+ regressed_count: regressed.length,
87
+ new_count: newItems.length,
88
+ removed_count: removed.length,
89
+ unchanged_count: unchanged.length,
90
+ };
91
+ if ('reverse_coverage_pct' in oldSummary || 'reverse_coverage_pct' in newSummary) {
92
+ const oldRev = oldSummary.reverse_coverage_pct ?? 0;
93
+ const newRev = newSummary.reverse_coverage_pct ?? 0;
94
+ summary.old_reverse_pct = oldRev;
95
+ summary.new_reverse_pct = newRev;
96
+ summary.reverse_diff = Math.round((newRev - oldRev) * 10) / 10;
97
+ }
98
+ return {
99
+ summary,
100
+ improved,
101
+ regressed,
102
+ new: newItems,
103
+ removed,
104
+ };
105
+ }
106
+ export function formatText(delta) {
107
+ const s = delta.summary;
108
+ const lines = [];
109
+ const diffStr = s.coverage_diff >= 0 ? `+${s.coverage_diff}` : String(s.coverage_diff);
110
+ lines.push(`Forward: ${s.old_coverage_pct}% → ${s.new_coverage_pct}% (${diffStr}%)`);
111
+ if (s.old_reverse_pct !== undefined) {
112
+ const revDiff = s.reverse_diff >= 0 ? `+${s.reverse_diff}` : String(s.reverse_diff);
113
+ lines.push(`Reverse: ${s.old_reverse_pct}% → ${s.new_reverse_pct}% (${revDiff}%)`);
114
+ }
115
+ lines.push('');
116
+ if (delta.improved.length > 0) {
117
+ lines.push(`IMPROVED (${delta.improved.length}):`);
118
+ for (const item of delta.improved) {
119
+ lines.push(` ▲ ${item.id} ${item.old_status} → ${item.new_status}`);
120
+ lines.push(` ${item.text}`);
121
+ }
122
+ lines.push('');
123
+ }
124
+ if (delta.regressed.length > 0) {
125
+ lines.push(`REGRESSED (${delta.regressed.length}):`);
126
+ for (const item of delta.regressed) {
127
+ lines.push(` ▼ ${item.id} ${item.old_status} → ${item.new_status}`);
128
+ lines.push(` ${item.text}`);
129
+ }
130
+ lines.push('');
131
+ }
132
+ if (delta.new.length > 0) {
133
+ lines.push(`NEW (${delta.new.length}):`);
134
+ for (const item of delta.new) {
135
+ lines.push(` + ${item.id} [${item.status}]`);
136
+ lines.push(` ${item.text}`);
137
+ }
138
+ lines.push('');
139
+ }
140
+ if (delta.removed.length > 0) {
141
+ lines.push(`REMOVED (${delta.removed.length}):`);
142
+ for (const item of delta.removed) {
143
+ lines.push(` - ${item.id} [${item.status}]`);
144
+ lines.push(` ${item.text}`);
145
+ }
146
+ lines.push('');
147
+ }
148
+ if (delta.improved.length === 0 && delta.regressed.length === 0 &&
149
+ delta.new.length === 0 && delta.removed.length === 0) {
150
+ lines.push('No changes.');
151
+ }
152
+ lines.push(`Unchanged: ${s.unchanged_count} traces`);
153
+ return lines.join('\n');
154
+ }
155
+ //# sourceMappingURL=delta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta.js","sourceRoot":"","sources":["../../src/output/delta.ts"],"names":[],"mappings":"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"}