flakewatch-core 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.
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +65 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/context.test.d.ts +2 -0
- package/dist/__tests__/context.test.d.ts.map +1 -0
- package/dist/__tests__/context.test.js +76 -0
- package/dist/__tests__/context.test.js.map +1 -0
- package/dist/__tests__/grouping.test.d.ts +2 -0
- package/dist/__tests__/grouping.test.d.ts.map +1 -0
- package/dist/__tests__/grouping.test.js +124 -0
- package/dist/__tests__/grouping.test.js.map +1 -0
- package/dist/__tests__/report.test.d.ts +2 -0
- package/dist/__tests__/report.test.d.ts.map +1 -0
- package/dist/__tests__/report.test.js +102 -0
- package/dist/__tests__/report.test.js.map +1 -0
- package/dist/config.d.ts +41 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +91 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +60 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +175 -0
- package/dist/context.js.map +1 -0
- package/dist/grouping.d.ts +23 -0
- package/dist/grouping.d.ts.map +1 -0
- package/dist/grouping.js +88 -0
- package/dist/grouping.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/llm.d.ts +12 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +188 -0
- package/dist/llm.js.map +1 -0
- package/dist/playwright-json.d.ts +46 -0
- package/dist/playwright-json.d.ts.map +1 -0
- package/dist/playwright-json.js +46 -0
- package/dist/playwright-json.js.map +1 -0
- package/dist/report.d.ts +7 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +121 -0
- package/dist/report.js.map +1 -0
- package/dist/triage.d.ts +25 -0
- package/dist/triage.d.ts.map +1 -0
- package/dist/triage.js +91 -0
- package/dist/triage.js.map +1 -0
- package/dist/verdicts.d.ts +56 -0
- package/dist/verdicts.d.ts.map +1 -0
- package/dist/verdicts.js +2 -0
- package/dist/verdicts.js.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright-json.js","sourceRoot":"","sources":["../src/playwright-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAuCjC;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAA4B;IAE5B,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;IAEtC,SAAS,UAAU,CAAC,MAAyB;QAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,MAAM;gBAAE,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,CAAC,KAAK,CAAC,KAAK;gBAAE,SAAS;YAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC/B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC9B,UAAU,EAAE,CAAC;oBAEb,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACrD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,EAAE,CAAC;wBAC5E,SAAS;oBACX,CAAC;oBAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;oBAE1C,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,CAC/C,CAAC;oBACF,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CACnC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,CACpC,CAAC;oBAEF,QAAQ,CAAC,IAAI,CAAC;wBACZ,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;wBACnC,SAAS,EAAE,IAAI,CAAC,KAAK;wBACrB,QAAQ;wBACR,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,KAAK,EAAE;4BACL,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe;4BACjD,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK;yBAC3B;wBACD,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,cAAc,EAAE,UAAU,EAAE,IAAI;wBAChC,SAAS,EAAE,KAAK,EAAE,IAAI;qBACvB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAClC,CAAC"}
|
package/dist/report.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { OutputConfig } from './config.js';
|
|
2
|
+
import type { TriageReport } from './verdicts.js';
|
|
3
|
+
export declare function formatMarkdownReport(report: TriageReport): string;
|
|
4
|
+
export declare function formatGitHubComment(report: TriageReport): string;
|
|
5
|
+
export declare function formatJsonReport(report: TriageReport): string;
|
|
6
|
+
export declare function writeReport(report: TriageReport, config: OutputConfig): Promise<string>;
|
|
7
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,eAAe,CAAC;AAUvB,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAqGjE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAKhE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAE7D;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,MAAM,CAAC,CA4BjB"}
|
package/dist/report.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { resolve, join } from 'node:path';
|
|
3
|
+
const VERDICT_LABELS = {
|
|
4
|
+
likely_bug: { heading: 'Likely Bugs', icon: 'X' },
|
|
5
|
+
stale_test: { heading: 'Stale Tests (fix proposed)', icon: '!' },
|
|
6
|
+
ambiguous_test: { heading: 'Ambiguous Tests (needs clarification)', icon: '?' },
|
|
7
|
+
data_issue: { heading: 'Data Issues', icon: 'D' },
|
|
8
|
+
flaky: { heading: 'Flaky Tests', icon: '~' },
|
|
9
|
+
};
|
|
10
|
+
export function formatMarkdownReport(report) {
|
|
11
|
+
const lines = [];
|
|
12
|
+
lines.push('# Flakewatch Analysis');
|
|
13
|
+
lines.push('');
|
|
14
|
+
lines.push(`**${report.totalFailures}** failures | **${report.investigated}** investigated | ${report.timestamp}`);
|
|
15
|
+
if (report.skippedByCircuitBreaker) {
|
|
16
|
+
lines.push('');
|
|
17
|
+
lines.push('> Circuit breaker triggered: >50% of tests failed. Only the top failure groups were investigated.');
|
|
18
|
+
}
|
|
19
|
+
// Group results by verdict type
|
|
20
|
+
const byVerdict = new Map();
|
|
21
|
+
for (const result of report.results) {
|
|
22
|
+
const existing = byVerdict.get(result.verdict.type) ?? [];
|
|
23
|
+
existing.push(result);
|
|
24
|
+
byVerdict.set(result.verdict.type, existing);
|
|
25
|
+
}
|
|
26
|
+
// Render in priority order
|
|
27
|
+
const order = [
|
|
28
|
+
'likely_bug',
|
|
29
|
+
'stale_test',
|
|
30
|
+
'ambiguous_test',
|
|
31
|
+
'data_issue',
|
|
32
|
+
'flaky',
|
|
33
|
+
];
|
|
34
|
+
for (const verdictType of order) {
|
|
35
|
+
const results = byVerdict.get(verdictType);
|
|
36
|
+
if (!results?.length)
|
|
37
|
+
continue;
|
|
38
|
+
const label = VERDICT_LABELS[verdictType];
|
|
39
|
+
lines.push('');
|
|
40
|
+
lines.push(`## ${label.heading} (${results.length})`);
|
|
41
|
+
for (const result of results) {
|
|
42
|
+
const groupInfo = result.groupId
|
|
43
|
+
? ` (${report.groups.find((g) => g.groupId === result.groupId)?.count ?? 1} similar)`
|
|
44
|
+
: '';
|
|
45
|
+
lines.push('');
|
|
46
|
+
lines.push(`### ${result.testTitle}${groupInfo}`);
|
|
47
|
+
lines.push(`\`${result.testFile}\``);
|
|
48
|
+
lines.push('');
|
|
49
|
+
lines.push(result.verdict.summary);
|
|
50
|
+
if (result.verdict.evidence.reasoning !== result.verdict.summary) {
|
|
51
|
+
lines.push('');
|
|
52
|
+
lines.push('**Analysis:**');
|
|
53
|
+
lines.push(result.verdict.evidence.reasoning);
|
|
54
|
+
}
|
|
55
|
+
if (result.verdict.proposedFix) {
|
|
56
|
+
const fix = result.verdict.proposedFix;
|
|
57
|
+
lines.push('');
|
|
58
|
+
lines.push('**Proposed fix:**');
|
|
59
|
+
lines.push(fix.explanation);
|
|
60
|
+
lines.push('');
|
|
61
|
+
lines.push(`\`${fix.filePath}\``);
|
|
62
|
+
lines.push('```diff');
|
|
63
|
+
for (const line of fix.originalCode.split('\n')) {
|
|
64
|
+
lines.push(`- ${line}`);
|
|
65
|
+
}
|
|
66
|
+
for (const line of fix.fixedCode.split('\n')) {
|
|
67
|
+
lines.push(`+ ${line}`);
|
|
68
|
+
}
|
|
69
|
+
lines.push('```');
|
|
70
|
+
}
|
|
71
|
+
if (result.verdict.proposedComments?.length) {
|
|
72
|
+
lines.push('');
|
|
73
|
+
lines.push('**Suggested clarifying comments:**');
|
|
74
|
+
for (const comment of result.verdict.proposedComments) {
|
|
75
|
+
lines.push(`- \`${comment.filePath}:${comment.line}\`: \`// ${comment.comment}\``);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Summary stats
|
|
81
|
+
const totalTokens = report.results.reduce((sum, r) => sum + r.tokensUsed, 0);
|
|
82
|
+
const totalDuration = report.results.reduce((sum, r) => sum + r.investigationDurationMs, 0);
|
|
83
|
+
lines.push('');
|
|
84
|
+
lines.push('---');
|
|
85
|
+
lines.push(`*Analyzed in ${(totalDuration / 1000).toFixed(1)}s | ${totalTokens.toLocaleString()} tokens used*`);
|
|
86
|
+
return lines.join('\n');
|
|
87
|
+
}
|
|
88
|
+
export function formatGitHubComment(report) {
|
|
89
|
+
const markdown = formatMarkdownReport(report);
|
|
90
|
+
const footer = '\n\n---\n*Generated by [flakewatch](https://github.com/smart-retry/smart-retry)*';
|
|
91
|
+
return markdown + footer;
|
|
92
|
+
}
|
|
93
|
+
export function formatJsonReport(report) {
|
|
94
|
+
return JSON.stringify(report, null, 2);
|
|
95
|
+
}
|
|
96
|
+
export async function writeReport(report, config) {
|
|
97
|
+
const dir = resolve(config.dir);
|
|
98
|
+
await mkdir(dir, { recursive: true });
|
|
99
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
100
|
+
let content;
|
|
101
|
+
let ext;
|
|
102
|
+
switch (config.format) {
|
|
103
|
+
case 'github-comment':
|
|
104
|
+
content = formatGitHubComment(report);
|
|
105
|
+
ext = 'md';
|
|
106
|
+
break;
|
|
107
|
+
case 'json':
|
|
108
|
+
content = formatJsonReport(report);
|
|
109
|
+
ext = 'json';
|
|
110
|
+
break;
|
|
111
|
+
case 'markdown':
|
|
112
|
+
default:
|
|
113
|
+
content = formatMarkdownReport(report);
|
|
114
|
+
ext = 'md';
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
const filePath = join(dir, `report-${timestamp}.${ext}`);
|
|
118
|
+
await writeFile(filePath, content, 'utf-8');
|
|
119
|
+
return filePath;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAS1C,MAAM,cAAc,GAA2D;IAC7E,UAAU,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE;IACjD,UAAU,EAAE,EAAE,OAAO,EAAE,4BAA4B,EAAE,IAAI,EAAE,GAAG,EAAE;IAChE,cAAc,EAAE,EAAE,OAAO,EAAE,uCAAuC,EAAE,IAAI,EAAE,GAAG,EAAE;IAC/E,UAAU,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE;IACjD,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE;CAC7C,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,MAAoB;IACvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CACR,KAAK,MAAM,CAAC,aAAa,mBAAmB,MAAM,CAAC,YAAY,qBAAqB,MAAM,CAAC,SAAS,EAAE,CACvG,CAAC;IAEF,IAAI,MAAM,CAAC,uBAAuB,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CACR,mGAAmG,CACpG,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAsC,CAAC;IAChE,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1D,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,2BAA2B;IAC3B,MAAM,KAAK,GAAkB;QAC3B,YAAY;QACZ,YAAY;QACZ,gBAAgB;QAChB,YAAY;QACZ,OAAO;KACR,CAAC;IAEF,KAAK,MAAM,WAAW,IAAI,KAAK,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,EAAE,MAAM;YAAE,SAAS;QAE/B,MAAM,KAAK,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAEtD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO;gBAC9B,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,WAAW;gBACrF,CAAC,CAAC,EAAE,CAAC;YAEP,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC,CAAC;YAClD,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAEnC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,KAAK,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACjE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAChD,CAAC;YAED,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;gBAChC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBAChD,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC1B,CAAC;gBACD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7C,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC1B,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;YAED,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;gBAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;gBACjD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;oBACtD,KAAK,CAAC,IAAI,CACR,OAAO,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,YAAY,OAAO,CAAC,OAAO,IAAI,CACvE,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC7E,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CACzC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,uBAAuB,EAC3C,CAAC,CACF,CAAC;IAEF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CACR,gBAAgB,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,WAAW,CAAC,cAAc,EAAE,eAAe,CACpG,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACtD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,MAAM,GACV,kFAAkF,CAAC;IACrF,OAAO,QAAQ,GAAG,MAAM,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAoB;IACnD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAoB,EACpB,MAAoB;IAEpB,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAEjE,IAAI,OAAe,CAAC;IACpB,IAAI,GAAW,CAAC;IAEhB,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,gBAAgB;YACnB,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACtC,GAAG,GAAG,IAAI,CAAC;YACX,MAAM;QACR,KAAK,MAAM;YACT,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACnC,GAAG,GAAG,MAAM,CAAC;YACb,MAAM;QACR,KAAK,UAAU,CAAC;QAChB;YACE,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;YACvC,GAAG,GAAG,IAAI,CAAC;YACX,MAAM;IACV,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,SAAS,IAAI,GAAG,EAAE,CAAC,CAAC;IACzD,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/dist/triage.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SmartRetryConfig } from './config.js';
|
|
2
|
+
import type { TestFailure, FailureContext } from './context.js';
|
|
3
|
+
import type { TriageReport, Verdict } from './verdicts.js';
|
|
4
|
+
/**
|
|
5
|
+
* Browser investigator interface — allows browser-agent to plug in
|
|
6
|
+
* without core depending on it.
|
|
7
|
+
*/
|
|
8
|
+
export interface BrowserInvestigatorFn {
|
|
9
|
+
(context: FailureContext, baseURL: string): Promise<{
|
|
10
|
+
verdict: Verdict;
|
|
11
|
+
tokensUsed: number;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
export interface TriageOptions {
|
|
15
|
+
failures: TestFailure[];
|
|
16
|
+
totalTests: number;
|
|
17
|
+
config: SmartRetryConfig;
|
|
18
|
+
/** Optional browser investigator for 'full' mode */
|
|
19
|
+
browserInvestigator?: BrowserInvestigatorFn;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Main triage pipeline: group failures, select samples, investigate, report.
|
|
23
|
+
*/
|
|
24
|
+
export declare function triageFailures(options: TriageOptions): Promise<TriageReport>;
|
|
25
|
+
//# sourceMappingURL=triage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../src/triage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAIhE,OAAO,KAAK,EACV,YAAY,EAEZ,OAAO,EACR,MAAM,eAAe,CAAC;AAGvB;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAClD,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,gBAAgB,CAAC;IACzB,oDAAoD;IACpD,mBAAmB,CAAC,EAAE,qBAAqB,CAAC;CAC7C;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CA0CvB"}
|
package/dist/triage.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { packageFailureContext } from './context.js';
|
|
3
|
+
import { groupFailures, selectGroupsForInvestigation } from './grouping.js';
|
|
4
|
+
import { createLLMProvider } from './llm.js';
|
|
5
|
+
import { writeReport } from './report.js';
|
|
6
|
+
/**
|
|
7
|
+
* Main triage pipeline: group failures, select samples, investigate, report.
|
|
8
|
+
*/
|
|
9
|
+
export async function triageFailures(options) {
|
|
10
|
+
const { failures, totalTests, config } = options;
|
|
11
|
+
// 1. Group failures by error signature
|
|
12
|
+
const groups = groupFailures(failures);
|
|
13
|
+
// 2. Select groups to investigate (respecting limits + circuit breaker)
|
|
14
|
+
const { selected, circuitBroken } = selectGroupsForInvestigation(groups, totalTests, config.investigation);
|
|
15
|
+
// 3. Investigate samples concurrently
|
|
16
|
+
const llm = createLLMProvider(config.llm);
|
|
17
|
+
const results = await investigateGroups(selected, config, llm, options.browserInvestigator);
|
|
18
|
+
// 4. Build report
|
|
19
|
+
const report = {
|
|
20
|
+
timestamp: new Date().toISOString(),
|
|
21
|
+
totalFailures: failures.length,
|
|
22
|
+
investigated: results.length,
|
|
23
|
+
skippedByCircuitBreaker: circuitBroken,
|
|
24
|
+
groups: groups.map((g) => ({
|
|
25
|
+
groupId: g.id,
|
|
26
|
+
errorSignature: g.signature,
|
|
27
|
+
count: g.failures.length,
|
|
28
|
+
sampleTestId: g.sample.testId,
|
|
29
|
+
verdict: results.find((r) => r.groupId === g.id)?.verdict.type,
|
|
30
|
+
})),
|
|
31
|
+
results,
|
|
32
|
+
};
|
|
33
|
+
// 5. Write report
|
|
34
|
+
await writeReport(report, config.output);
|
|
35
|
+
return report;
|
|
36
|
+
}
|
|
37
|
+
async function investigateGroups(groups, config, llm, browserInvestigator) {
|
|
38
|
+
const results = [];
|
|
39
|
+
const maxConcurrent = config.investigation.maxConcurrent;
|
|
40
|
+
// Process in batches of maxConcurrent
|
|
41
|
+
for (let i = 0; i < groups.length; i += maxConcurrent) {
|
|
42
|
+
const batch = groups.slice(i, i + maxConcurrent);
|
|
43
|
+
const batchResults = await Promise.all(batch.map((group) => investigateSample(group, config, llm, browserInvestigator)));
|
|
44
|
+
results.push(...batchResults);
|
|
45
|
+
}
|
|
46
|
+
return results;
|
|
47
|
+
}
|
|
48
|
+
async function investigateSample(group, config, llm, browserInvestigator) {
|
|
49
|
+
const start = Date.now();
|
|
50
|
+
const sample = group.sample;
|
|
51
|
+
// Package context
|
|
52
|
+
const context = await packageFailureContext(sample, config.context);
|
|
53
|
+
// Choose investigation mode
|
|
54
|
+
const mode = config.investigation.mode;
|
|
55
|
+
const baseURL = config.investigation.baseURL;
|
|
56
|
+
if (mode === 'full' && browserInvestigator && baseURL) {
|
|
57
|
+
// Full browser investigation
|
|
58
|
+
const { verdict, tokensUsed } = await browserInvestigator(context, baseURL);
|
|
59
|
+
return {
|
|
60
|
+
testId: sample.testId,
|
|
61
|
+
testTitle: sample.testTitle,
|
|
62
|
+
testFile: sample.testFile,
|
|
63
|
+
groupId: group.id,
|
|
64
|
+
verdict,
|
|
65
|
+
investigationDurationMs: Date.now() - start,
|
|
66
|
+
tokensUsed,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// Screenshot-only mode (default)
|
|
70
|
+
let screenshotBase64;
|
|
71
|
+
if (context.screenshotPath) {
|
|
72
|
+
try {
|
|
73
|
+
const buffer = await readFile(context.screenshotPath);
|
|
74
|
+
screenshotBase64 = buffer.toString('base64');
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Screenshot not available — continue without it
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const { verdict, tokensUsed } = await llm.analyze(context, screenshotBase64);
|
|
81
|
+
return {
|
|
82
|
+
testId: sample.testId,
|
|
83
|
+
testTitle: sample.testTitle,
|
|
84
|
+
testFile: sample.testFile,
|
|
85
|
+
groupId: group.id,
|
|
86
|
+
verdict,
|
|
87
|
+
investigationDurationMs: Date.now() - start,
|
|
88
|
+
tokensUsed,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=triage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.js","sourceRoot":"","sources":["../src/triage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export type VerdictType = 'likely_bug' | 'stale_test' | 'ambiguous_test' | 'data_issue' | 'flaky';
|
|
2
|
+
export interface Verdict {
|
|
3
|
+
type: VerdictType;
|
|
4
|
+
confidence: number;
|
|
5
|
+
summary: string;
|
|
6
|
+
evidence: VerdictEvidence;
|
|
7
|
+
proposedFix?: ProposedFix;
|
|
8
|
+
proposedComments?: ProposedComment[];
|
|
9
|
+
}
|
|
10
|
+
export interface VerdictEvidence {
|
|
11
|
+
reasoning: string;
|
|
12
|
+
screenshots?: string[];
|
|
13
|
+
networkErrors?: NetworkError[];
|
|
14
|
+
consoleErrors?: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface NetworkError {
|
|
17
|
+
url: string;
|
|
18
|
+
status: number;
|
|
19
|
+
method: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ProposedFix {
|
|
22
|
+
filePath: string;
|
|
23
|
+
originalCode: string;
|
|
24
|
+
fixedCode: string;
|
|
25
|
+
explanation: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ProposedComment {
|
|
28
|
+
filePath: string;
|
|
29
|
+
line: number;
|
|
30
|
+
comment: string;
|
|
31
|
+
}
|
|
32
|
+
export interface InvestigationResult {
|
|
33
|
+
testId: string;
|
|
34
|
+
testTitle: string;
|
|
35
|
+
testFile: string;
|
|
36
|
+
groupId?: string;
|
|
37
|
+
verdict: Verdict;
|
|
38
|
+
investigationDurationMs: number;
|
|
39
|
+
tokensUsed: number;
|
|
40
|
+
}
|
|
41
|
+
export interface TriageReport {
|
|
42
|
+
timestamp: string;
|
|
43
|
+
totalFailures: number;
|
|
44
|
+
investigated: number;
|
|
45
|
+
skippedByCircuitBreaker: boolean;
|
|
46
|
+
groups: FailureGroupSummary[];
|
|
47
|
+
results: InvestigationResult[];
|
|
48
|
+
}
|
|
49
|
+
export interface FailureGroupSummary {
|
|
50
|
+
groupId: string;
|
|
51
|
+
errorSignature: string;
|
|
52
|
+
count: number;
|
|
53
|
+
sampleTestId: string;
|
|
54
|
+
verdict?: VerdictType;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=verdicts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verdicts.d.ts","sourceRoot":"","sources":["../src/verdicts.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GACnB,YAAY,GACZ,YAAY,GACZ,gBAAgB,GAChB,YAAY,GACZ,OAAO,CAAC;AAEZ,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,eAAe,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,uBAAuB,EAAE,MAAM,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB,EAAE,OAAO,CAAC;IACjC,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB"}
|
package/dist/verdicts.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verdicts.js","sourceRoot":"","sources":["../src/verdicts.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "flakewatch-core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Core logic for flakewatch: failure grouping, context packaging, LLM interface",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"test": "vitest run",
|
|
17
|
+
"clean": "rm -rf dist"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@anthropic-ai/sdk": "^0.39.0"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"typescript": "^5.7.0",
|
|
24
|
+
"vitest": "^3.0.0",
|
|
25
|
+
"@types/node": "^22.0.0"
|
|
26
|
+
},
|
|
27
|
+
"files": ["dist"],
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "https://github.com/jlawrence6809/smart-retry",
|
|
32
|
+
"directory": "packages/core"
|
|
33
|
+
},
|
|
34
|
+
"keywords": ["playwright", "testing", "ai", "triage", "flaky-tests", "test-automation"]
|
|
35
|
+
}
|