@mmnto/cli 1.5.10 → 1.6.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/adapters/github-cli-pr.d.ts +8 -0
- package/dist/adapters/github-cli-pr.d.ts.map +1 -1
- package/dist/adapters/github-cli-pr.js +34 -1
- package/dist/adapters/github-cli-pr.js.map +1 -1
- package/dist/adapters/pr-adapter.d.ts +8 -0
- package/dist/adapters/pr-adapter.d.ts.map +1 -1
- package/dist/commands/extract.d.ts +1 -0
- package/dist/commands/extract.d.ts.map +1 -1
- package/dist/commands/extract.js +1 -1
- package/dist/commands/extract.js.map +1 -1
- package/dist/commands/ledger-analyzer.d.ts.map +1 -1
- package/dist/commands/ledger-analyzer.js +2 -0
- package/dist/commands/ledger-analyzer.js.map +1 -1
- package/dist/commands/review-learn.d.ts.map +1 -1
- package/dist/commands/review-learn.js +38 -1
- package/dist/commands/review-learn.js.map +1 -1
- package/dist/commands/shield.d.ts +1 -0
- package/dist/commands/shield.d.ts.map +1 -1
- package/dist/commands/shield.js +59 -5
- package/dist/commands/shield.js.map +1 -1
- package/dist/commands/triage-pr.d.ts +4 -1
- package/dist/commands/triage-pr.d.ts.map +1 -1
- package/dist/commands/triage-pr.js +262 -3
- package/dist/commands/triage-pr.js.map +1 -1
- package/dist/exemptions/__tests__/exemption-engine.test.d.ts +2 -0
- package/dist/exemptions/__tests__/exemption-engine.test.d.ts.map +1 -0
- package/dist/exemptions/__tests__/exemption-engine.test.js +317 -0
- package/dist/exemptions/__tests__/exemption-engine.test.js.map +1 -0
- package/dist/exemptions/exemption-engine.d.ts +27 -0
- package/dist/exemptions/exemption-engine.d.ts.map +1 -0
- package/dist/exemptions/exemption-engine.js +193 -0
- package/dist/exemptions/exemption-engine.js.map +1 -0
- package/dist/exemptions/exemption-schema.d.ts +127 -0
- package/dist/exemptions/exemption-schema.d.ts.map +1 -0
- package/dist/exemptions/exemption-schema.js +32 -0
- package/dist/exemptions/exemption-schema.js.map +1 -0
- package/dist/exemptions/exemption-store.d.ts +22 -0
- package/dist/exemptions/exemption-store.d.ts.map +1 -0
- package/dist/exemptions/exemption-store.js +80 -0
- package/dist/exemptions/exemption-store.js.map +1 -0
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/parsers/bot-review-parser.d.ts +8 -0
- package/dist/parsers/bot-review-parser.d.ts.map +1 -1
- package/dist/parsers/bot-review-parser.js +48 -11
- package/dist/parsers/bot-review-parser.js.map +1 -1
- package/dist/parsers/bot-review-parser.test.js +108 -1
- package/dist/parsers/bot-review-parser.test.js.map +1 -1
- package/dist/services/__tests__/deferred-issuer.test.d.ts +2 -0
- package/dist/services/__tests__/deferred-issuer.test.d.ts.map +1 -0
- package/dist/services/__tests__/deferred-issuer.test.js +115 -0
- package/dist/services/__tests__/deferred-issuer.test.js.map +1 -0
- package/dist/services/__tests__/fix-dispatcher.test.d.ts +2 -0
- package/dist/services/__tests__/fix-dispatcher.test.d.ts.map +1 -0
- package/dist/services/__tests__/fix-dispatcher.test.js +129 -0
- package/dist/services/__tests__/fix-dispatcher.test.js.map +1 -0
- package/dist/services/deferred-issuer.d.ts +17 -0
- package/dist/services/deferred-issuer.d.ts.map +1 -0
- package/dist/services/deferred-issuer.js +64 -0
- package/dist/services/deferred-issuer.js.map +1 -0
- package/dist/services/fix-dispatcher.d.ts +19 -0
- package/dist/services/fix-dispatcher.d.ts.map +1 -0
- package/dist/services/fix-dispatcher.js +100 -0
- package/dist/services/fix-dispatcher.js.map +1 -0
- package/dist/utils/__tests__/milestone-inference.test.d.ts +2 -0
- package/dist/utils/__tests__/milestone-inference.test.d.ts.map +1 -0
- package/dist/utils/__tests__/milestone-inference.test.js +35 -0
- package/dist/utils/__tests__/milestone-inference.test.js.map +1 -0
- package/dist/utils/milestone-inference.d.ts +6 -0
- package/dist/utils/milestone-inference.d.ts.map +1 -0
- package/dist/utils/milestone-inference.js +15 -0
- package/dist/utils/milestone-inference.js.map +1 -0
- package/package.json +2 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { detectBot, extractResolvedBotFindings, extractSuggestion, isBotComment, isThreadResolved, parseCRSeverity, parseGCASeverity, stripHtmlWrappers, } from './bot-review-parser.js';
|
|
2
|
+
import { detectBot, extractPushbackFindings, extractResolvedBotFindings, extractSuggestion, isBotComment, isThreadResolved, parseCRSeverity, parseGCASeverity, stripHtmlWrappers, } from './bot-review-parser.js';
|
|
3
3
|
// ─── detectBot ──────────────────────────────────────────
|
|
4
4
|
describe('detectBot', () => {
|
|
5
5
|
it('identifies coderabbitai[bot]', () => {
|
|
@@ -237,4 +237,111 @@ describe('extractResolvedBotFindings', () => {
|
|
|
237
237
|
expect(findings[1].suggestion).toBeUndefined();
|
|
238
238
|
});
|
|
239
239
|
});
|
|
240
|
+
// ─── extractPushbackFindings ──────────────────────────
|
|
241
|
+
describe('extractPushbackFindings', () => {
|
|
242
|
+
it('extracts findings from threads where human pushed back', () => {
|
|
243
|
+
const threads = [
|
|
244
|
+
{
|
|
245
|
+
path: 'src/a.ts',
|
|
246
|
+
diffHunk: '@@ -1,3 +1,5 @@',
|
|
247
|
+
comments: [
|
|
248
|
+
{ author: 'coderabbitai[bot]', body: '\u{1F7E0} Major: Add error handling' },
|
|
249
|
+
{ author: 'dev', body: 'This is intentional — we let it throw' },
|
|
250
|
+
],
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
path: 'src/b.ts',
|
|
254
|
+
diffHunk: '@@ -10,3 +10,5 @@',
|
|
255
|
+
comments: [
|
|
256
|
+
{ author: 'coderabbitai[bot]', body: 'Missing null check' },
|
|
257
|
+
{ author: 'dev', body: 'Fixed' },
|
|
258
|
+
],
|
|
259
|
+
},
|
|
260
|
+
];
|
|
261
|
+
const findings = extractPushbackFindings(threads);
|
|
262
|
+
expect(findings).toHaveLength(1);
|
|
263
|
+
expect(findings[0].file).toBe('src/a.ts');
|
|
264
|
+
expect(findings[0].tool).toBe('coderabbit');
|
|
265
|
+
expect(findings[0].resolutionSignal).toBe('none');
|
|
266
|
+
});
|
|
267
|
+
it('detects multiple pushback patterns', () => {
|
|
268
|
+
const patterns = [
|
|
269
|
+
"Won't fix this",
|
|
270
|
+
'This is by design',
|
|
271
|
+
'Not applicable here',
|
|
272
|
+
'Ignoring this — test fixture',
|
|
273
|
+
'Dismissed',
|
|
274
|
+
'Just a nit',
|
|
275
|
+
];
|
|
276
|
+
for (const reply of patterns) {
|
|
277
|
+
const threads = [
|
|
278
|
+
{
|
|
279
|
+
path: 'src/test.ts',
|
|
280
|
+
diffHunk: '@@ hunk',
|
|
281
|
+
comments: [
|
|
282
|
+
{ author: 'coderabbitai[bot]', body: 'Some issue' },
|
|
283
|
+
{ author: 'dev', body: reply },
|
|
284
|
+
],
|
|
285
|
+
},
|
|
286
|
+
];
|
|
287
|
+
expect(extractPushbackFindings(threads)).toHaveLength(1);
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
it('skips threads with no human replies', () => {
|
|
291
|
+
const threads = [
|
|
292
|
+
{
|
|
293
|
+
path: 'src/a.ts',
|
|
294
|
+
diffHunk: '@@ hunk',
|
|
295
|
+
comments: [{ author: 'coderabbitai[bot]', body: 'Issue' }],
|
|
296
|
+
},
|
|
297
|
+
];
|
|
298
|
+
expect(extractPushbackFindings(threads)).toHaveLength(0);
|
|
299
|
+
});
|
|
300
|
+
it('skips threads starting with human comment', () => {
|
|
301
|
+
const threads = [
|
|
302
|
+
{
|
|
303
|
+
path: 'src/a.ts',
|
|
304
|
+
diffHunk: '@@ hunk',
|
|
305
|
+
comments: [
|
|
306
|
+
{ author: 'dev', body: 'Question' },
|
|
307
|
+
{ author: 'coderabbitai[bot]', body: 'Answer' },
|
|
308
|
+
],
|
|
309
|
+
},
|
|
310
|
+
];
|
|
311
|
+
expect(extractPushbackFindings(threads)).toHaveLength(0);
|
|
312
|
+
});
|
|
313
|
+
it('extracts line numbers from diff hunk headers', () => {
|
|
314
|
+
const threads = [
|
|
315
|
+
{
|
|
316
|
+
path: 'src/a.ts',
|
|
317
|
+
diffHunk: '@@ -10,5 +42,7 @@',
|
|
318
|
+
comments: [
|
|
319
|
+
{ author: 'coderabbitai[bot]', body: 'Issue here' },
|
|
320
|
+
{ author: 'dev', body: 'By design' },
|
|
321
|
+
],
|
|
322
|
+
},
|
|
323
|
+
];
|
|
324
|
+
const findings = extractPushbackFindings(threads);
|
|
325
|
+
expect(findings[0].line).toBe(42);
|
|
326
|
+
});
|
|
327
|
+
it('handles GCA bot findings', () => {
|
|
328
|
+
const threads = [
|
|
329
|
+
{
|
|
330
|
+
path: 'src/a.ts',
|
|
331
|
+
diffHunk: '@@ hunk',
|
|
332
|
+
comments: [
|
|
333
|
+
{
|
|
334
|
+
author: 'gemini-code-assist[bot]',
|
|
335
|
+
body: ' Security concern',
|
|
336
|
+
},
|
|
337
|
+
{ author: 'dev', body: 'Not applicable — internal tool' },
|
|
338
|
+
],
|
|
339
|
+
},
|
|
340
|
+
];
|
|
341
|
+
const findings = extractPushbackFindings(threads);
|
|
342
|
+
expect(findings).toHaveLength(1);
|
|
343
|
+
expect(findings[0].tool).toBe('gca');
|
|
344
|
+
expect(findings[0].severity).toBe('high');
|
|
345
|
+
});
|
|
346
|
+
});
|
|
240
347
|
//# sourceMappingURL=bot-review-parser.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-review-parser.test.js","sourceRoot":"","sources":["../../src/parsers/bot-review-parser.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bot-review-parser.test.js","sourceRoot":"","sources":["../../src/parsers/bot-review-parser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deferred-issuer.test.d.ts","sourceRoot":"","sources":["../../../src/services/__tests__/deferred-issuer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { createDeferredIssue, isAlreadyDeferred } from '../deferred-issuer.js';
|
|
3
|
+
// ─── Helpers ───────────────────────────────────────────
|
|
4
|
+
function makeMockAdapter(issueUrl = 'https://github.com/owner/repo/issues/42') {
|
|
5
|
+
return {
|
|
6
|
+
fetchOpenPRs: () => [],
|
|
7
|
+
fetchPr: () => ({
|
|
8
|
+
number: 1,
|
|
9
|
+
title: '',
|
|
10
|
+
body: '',
|
|
11
|
+
state: 'open',
|
|
12
|
+
comments: [],
|
|
13
|
+
reviews: [],
|
|
14
|
+
}),
|
|
15
|
+
fetchReviewComments: () => [],
|
|
16
|
+
createIssue: vi.fn().mockReturnValue(issueUrl),
|
|
17
|
+
replyToComment: vi.fn(),
|
|
18
|
+
addPrComment: vi.fn(),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function makeThread(botBody, humanReplies = [], opts) {
|
|
22
|
+
return {
|
|
23
|
+
path: opts?.path ?? 'src/foo.ts',
|
|
24
|
+
diffHunk: opts?.diffHunk ?? '@@ -1,3 +1,5 @@',
|
|
25
|
+
comments: [
|
|
26
|
+
{ id: opts?.rootId ?? 100, author: 'coderabbitai[bot]', body: botBody },
|
|
27
|
+
...humanReplies.map((body) => ({ author: 'dev', body })),
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
// ─── isAlreadyDeferred ─────────────────────────────────
|
|
32
|
+
describe('isAlreadyDeferred', () => {
|
|
33
|
+
it('returns true when a comment contains "Deferred to #123"', () => {
|
|
34
|
+
const thread = makeThread('some finding', ['Deferred to #123']);
|
|
35
|
+
expect(isAlreadyDeferred(thread)).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
it('returns true when a comment contains "Deferred to issue #456"', () => {
|
|
38
|
+
const thread = makeThread('some finding', ['Deferred to issue #456']);
|
|
39
|
+
expect(isAlreadyDeferred(thread)).toBe(true);
|
|
40
|
+
});
|
|
41
|
+
it('returns false when no deferred marker present', () => {
|
|
42
|
+
const thread = makeThread('some finding', ['Will fix later']);
|
|
43
|
+
expect(isAlreadyDeferred(thread)).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
it('returns false for empty thread', () => {
|
|
46
|
+
const thread = {
|
|
47
|
+
path: 'src/foo.ts',
|
|
48
|
+
diffHunk: '@@ -1,3 +1,5 @@',
|
|
49
|
+
comments: [],
|
|
50
|
+
};
|
|
51
|
+
expect(isAlreadyDeferred(thread)).toBe(false);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
// ─── createDeferredIssue ───────────────────────────────
|
|
55
|
+
describe('createDeferredIssue', () => {
|
|
56
|
+
it('creates issue with correct title, body, and labels', () => {
|
|
57
|
+
const adapter = makeMockAdapter();
|
|
58
|
+
const thread = makeThread('Missing error handler in async route');
|
|
59
|
+
createDeferredIssue(adapter, 99, thread, '1.6.0');
|
|
60
|
+
expect(adapter.createIssue).toHaveBeenCalledOnce();
|
|
61
|
+
const call = adapter.createIssue.mock.calls[0][0];
|
|
62
|
+
expect(call.title).toBe('Deferred: Missing error handler in async route');
|
|
63
|
+
expect(call.body).toContain('src/foo.ts');
|
|
64
|
+
expect(call.body).toContain('#99');
|
|
65
|
+
expect(call.body).toContain('coderabbitai[bot]');
|
|
66
|
+
expect(call.labels).toEqual(['tech-debt', 'deferred']);
|
|
67
|
+
expect(call.milestone).toBe('1.7.0');
|
|
68
|
+
});
|
|
69
|
+
it('replies on thread with "Deferred to #NNN"', () => {
|
|
70
|
+
const adapter = makeMockAdapter();
|
|
71
|
+
const thread = makeThread('Some finding', [], { rootId: 200 });
|
|
72
|
+
createDeferredIssue(adapter, 99, thread, '1.6.0');
|
|
73
|
+
expect(adapter.replyToComment).toHaveBeenCalledWith(99, 200, 'Deferred to #42');
|
|
74
|
+
});
|
|
75
|
+
it('skips if thread already deferred (idempotent)', () => {
|
|
76
|
+
const adapter = makeMockAdapter();
|
|
77
|
+
const thread = makeThread('Finding', ['Deferred to #10']);
|
|
78
|
+
const result = createDeferredIssue(adapter, 99, thread, '1.6.0');
|
|
79
|
+
expect(result.skipped).toBe(true);
|
|
80
|
+
expect(adapter.createIssue).not.toHaveBeenCalled();
|
|
81
|
+
expect(adapter.replyToComment).not.toHaveBeenCalled();
|
|
82
|
+
});
|
|
83
|
+
it('skips if no bot comment (empty thread)', () => {
|
|
84
|
+
const adapter = makeMockAdapter();
|
|
85
|
+
const thread = {
|
|
86
|
+
path: 'src/foo.ts',
|
|
87
|
+
diffHunk: '@@ -1,3 +1,5 @@',
|
|
88
|
+
comments: [],
|
|
89
|
+
};
|
|
90
|
+
const result = createDeferredIssue(adapter, 99, thread, '1.6.0');
|
|
91
|
+
expect(result.skipped).toBe(true);
|
|
92
|
+
expect(adapter.createIssue).not.toHaveBeenCalled();
|
|
93
|
+
});
|
|
94
|
+
it('infers next milestone from current', () => {
|
|
95
|
+
const adapter = makeMockAdapter();
|
|
96
|
+
const thread = makeThread('Finding');
|
|
97
|
+
createDeferredIssue(adapter, 99, thread, 'v2.0.0');
|
|
98
|
+
const call = adapter.createIssue.mock.calls[0][0];
|
|
99
|
+
expect(call.milestone).toBe('v2.1.0');
|
|
100
|
+
});
|
|
101
|
+
it('handles replyToComment failure gracefully (issue still created)', () => {
|
|
102
|
+
const adapter = makeMockAdapter();
|
|
103
|
+
adapter.replyToComment.mockImplementation(() => {
|
|
104
|
+
throw new Error('network timeout');
|
|
105
|
+
});
|
|
106
|
+
const thread = makeThread('Finding');
|
|
107
|
+
const logs = [];
|
|
108
|
+
const result = createDeferredIssue(adapter, 99, thread, '1.6.0', (msg) => logs.push(msg));
|
|
109
|
+
expect(result.skipped).toBe(false);
|
|
110
|
+
expect(result.issueUrl).toBe('https://github.com/owner/repo/issues/42');
|
|
111
|
+
expect(adapter.createIssue).toHaveBeenCalledOnce();
|
|
112
|
+
expect(logs.some((l) => l.includes('Failed to reply on thread'))).toBe(true);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
//# sourceMappingURL=deferred-issuer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deferred-issuer.test.js","sourceRoot":"","sources":["../../../src/services/__tests__/deferred-issuer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-dispatcher.test.d.ts","sourceRoot":"","sources":["../../../src/services/__tests__/fix-dispatcher.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { dispatchFix } from '../fix-dispatcher.js';
|
|
3
|
+
vi.mock('node:fs', () => ({
|
|
4
|
+
readFileSync: vi.fn(),
|
|
5
|
+
writeFileSync: vi.fn(),
|
|
6
|
+
}));
|
|
7
|
+
vi.mock('@mmnto/totem', () => ({
|
|
8
|
+
safeExec: vi.fn().mockReturnValue('abc1234'),
|
|
9
|
+
}));
|
|
10
|
+
let fsMock;
|
|
11
|
+
let totemMock;
|
|
12
|
+
describe('dispatchFix', () => {
|
|
13
|
+
beforeEach(async () => {
|
|
14
|
+
vi.clearAllMocks();
|
|
15
|
+
fsMock = await import('node:fs');
|
|
16
|
+
totemMock = await import('@mmnto/totem');
|
|
17
|
+
});
|
|
18
|
+
it('returns error when file does not exist', async () => {
|
|
19
|
+
fsMock.readFileSync.mockImplementation(() => {
|
|
20
|
+
throw new Error('ENOENT: no such file or directory');
|
|
21
|
+
});
|
|
22
|
+
const result = await dispatchFix({
|
|
23
|
+
filePath: 'nonexistent.ts',
|
|
24
|
+
findingBody: 'fix this',
|
|
25
|
+
findingTool: 'CR',
|
|
26
|
+
cwd: '/tmp/fake',
|
|
27
|
+
runOrchestrator: vi.fn(),
|
|
28
|
+
});
|
|
29
|
+
expect(result.applied).toBe(false);
|
|
30
|
+
expect(result.reason).toContain('Cannot read');
|
|
31
|
+
});
|
|
32
|
+
it('returns error when LLM returns no response', async () => {
|
|
33
|
+
fsMock.readFileSync.mockReturnValue('const x = 1;');
|
|
34
|
+
const result = await dispatchFix({
|
|
35
|
+
filePath: 'src/foo.ts',
|
|
36
|
+
findingBody: 'fix this',
|
|
37
|
+
findingTool: 'CR',
|
|
38
|
+
cwd: '/tmp/fake',
|
|
39
|
+
runOrchestrator: vi.fn().mockResolvedValue(undefined),
|
|
40
|
+
});
|
|
41
|
+
expect(result.applied).toBe(false);
|
|
42
|
+
expect(result.reason).toContain('No response from LLM');
|
|
43
|
+
});
|
|
44
|
+
it('returns error when LLM returns no code block', async () => {
|
|
45
|
+
fsMock.readFileSync.mockReturnValue('const x = 1;');
|
|
46
|
+
const result = await dispatchFix({
|
|
47
|
+
filePath: 'src/foo.ts',
|
|
48
|
+
findingBody: 'fix this',
|
|
49
|
+
findingTool: 'CR',
|
|
50
|
+
cwd: '/tmp/fake',
|
|
51
|
+
runOrchestrator: vi.fn().mockResolvedValue('No code block here'),
|
|
52
|
+
});
|
|
53
|
+
expect(result.applied).toBe(false);
|
|
54
|
+
expect(result.reason).toContain('code block');
|
|
55
|
+
});
|
|
56
|
+
it('returns error when LLM returns unchanged content', async () => {
|
|
57
|
+
fsMock.readFileSync.mockReturnValue('const x = 1;\n');
|
|
58
|
+
const result = await dispatchFix({
|
|
59
|
+
filePath: 'src/foo.ts',
|
|
60
|
+
findingBody: 'fix this',
|
|
61
|
+
findingTool: 'CR',
|
|
62
|
+
cwd: '/tmp/fake',
|
|
63
|
+
runOrchestrator: vi.fn().mockResolvedValue('```typescript\nconst x = 1;\n```'),
|
|
64
|
+
});
|
|
65
|
+
expect(result.applied).toBe(false);
|
|
66
|
+
expect(result.reason).toContain('unchanged');
|
|
67
|
+
});
|
|
68
|
+
it('returns error when LLM call throws', async () => {
|
|
69
|
+
fsMock.readFileSync.mockReturnValue('const x = 1;');
|
|
70
|
+
const result = await dispatchFix({
|
|
71
|
+
filePath: 'src/foo.ts',
|
|
72
|
+
findingBody: 'fix this',
|
|
73
|
+
findingTool: 'CR',
|
|
74
|
+
cwd: '/tmp/fake',
|
|
75
|
+
runOrchestrator: vi.fn().mockRejectedValue(new Error('timeout')),
|
|
76
|
+
});
|
|
77
|
+
expect(result.applied).toBe(false);
|
|
78
|
+
expect(result.reason).toContain('LLM call failed');
|
|
79
|
+
});
|
|
80
|
+
it('applies fix and returns commit SHA', async () => {
|
|
81
|
+
fsMock.readFileSync.mockReturnValue('const x = 1;\n');
|
|
82
|
+
totemMock.safeExec.mockReturnValue('abc1234');
|
|
83
|
+
const result = await dispatchFix({
|
|
84
|
+
filePath: 'src/foo.ts',
|
|
85
|
+
findingBody: 'Use const instead of let',
|
|
86
|
+
findingTool: 'CR',
|
|
87
|
+
cwd: '/tmp/fake',
|
|
88
|
+
runOrchestrator: vi.fn().mockResolvedValue('```typescript\nconst x = 2;\n```'),
|
|
89
|
+
});
|
|
90
|
+
expect(result.applied).toBe(true);
|
|
91
|
+
expect(result.commitSha).toBe('abc1234');
|
|
92
|
+
});
|
|
93
|
+
it('includes finding tool and file in commit message', async () => {
|
|
94
|
+
fsMock.readFileSync.mockReturnValue('const x = 1;\n');
|
|
95
|
+
const mockSafeExec = totemMock.safeExec;
|
|
96
|
+
mockSafeExec.mockReturnValue('def5678');
|
|
97
|
+
await dispatchFix({
|
|
98
|
+
filePath: 'src/bar.ts',
|
|
99
|
+
line: 42,
|
|
100
|
+
findingBody: 'Missing null check',
|
|
101
|
+
findingTool: 'GCA',
|
|
102
|
+
cwd: '/tmp/fake',
|
|
103
|
+
runOrchestrator: vi.fn().mockResolvedValue('```typescript\nconst x = 2;\n```'),
|
|
104
|
+
});
|
|
105
|
+
// The second call to safeExec should be `git commit`
|
|
106
|
+
const commitCall = mockSafeExec.mock.calls.find((call) => call[0] === 'git' && call[1][0] === 'commit');
|
|
107
|
+
expect(commitCall).toBeDefined();
|
|
108
|
+
const commitMsg = commitCall[1][2];
|
|
109
|
+
expect(commitMsg).toContain('GCA');
|
|
110
|
+
expect(commitMsg).toContain('src/bar.ts');
|
|
111
|
+
expect(commitMsg).toContain(':42');
|
|
112
|
+
});
|
|
113
|
+
it('calls onLog callback during execution', async () => {
|
|
114
|
+
fsMock.readFileSync.mockReturnValue('const x = 1;\n');
|
|
115
|
+
totemMock.safeExec.mockReturnValue('abc1234');
|
|
116
|
+
const onLog = vi.fn();
|
|
117
|
+
await dispatchFix({
|
|
118
|
+
filePath: 'src/foo.ts',
|
|
119
|
+
findingBody: 'Fix something',
|
|
120
|
+
findingTool: 'CR',
|
|
121
|
+
cwd: '/tmp/fake',
|
|
122
|
+
runOrchestrator: vi.fn().mockResolvedValue('```typescript\nconst x = 2;\n```'),
|
|
123
|
+
onLog,
|
|
124
|
+
});
|
|
125
|
+
expect(onLog).toHaveBeenCalledWith(expect.stringContaining('Generating fix'));
|
|
126
|
+
expect(onLog).toHaveBeenCalledWith(expect.stringContaining('Committed fix'));
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
//# sourceMappingURL=fix-dispatcher.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-dispatcher.test.js","sourceRoot":"","sources":["../../../src/services/__tests__/fix-dispatcher.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PrAdapter } from '../adapters/pr-adapter.js';
|
|
2
|
+
import type { CommentThread } from '../parsers/bot-review-parser.js';
|
|
3
|
+
export interface DeferredIssueResult {
|
|
4
|
+
issueUrl: string;
|
|
5
|
+
issueNumber: string;
|
|
6
|
+
skipped: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Check if a thread already has a deferred issue link.
|
|
10
|
+
*/
|
|
11
|
+
export declare function isAlreadyDeferred(thread: CommentThread): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Create a GitHub issue for a deferred bot review finding and reply on the thread.
|
|
14
|
+
* Returns the issue URL, or skips if already deferred (idempotent).
|
|
15
|
+
*/
|
|
16
|
+
export declare function createDeferredIssue(adapter: PrAdapter, prNumber: number, thread: CommentThread, currentMilestone: string | undefined, onLog?: (msg: string) => void): DeferredIssueResult;
|
|
17
|
+
//# sourceMappingURL=deferred-issuer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deferred-issuer.d.ts","sourceRoot":"","sources":["../../src/services/deferred-issuer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAKrE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAEhE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,EACrB,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC5B,mBAAmB,CA0DrB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { inferNextMilestone } from '../utils/milestone-inference.js';
|
|
2
|
+
const DEFERRED_MARKER = /Deferred to (?:issue )?#(\d+)/i;
|
|
3
|
+
/**
|
|
4
|
+
* Check if a thread already has a deferred issue link.
|
|
5
|
+
*/
|
|
6
|
+
export function isAlreadyDeferred(thread) {
|
|
7
|
+
return thread.comments.some((c) => DEFERRED_MARKER.test(c.body));
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Create a GitHub issue for a deferred bot review finding and reply on the thread.
|
|
11
|
+
* Returns the issue URL, or skips if already deferred (idempotent).
|
|
12
|
+
*/
|
|
13
|
+
export function createDeferredIssue(adapter, prNumber, thread, currentMilestone, onLog) {
|
|
14
|
+
// Idempotency check
|
|
15
|
+
if (isAlreadyDeferred(thread)) {
|
|
16
|
+
onLog?.(`Thread on ${thread.path} already deferred — skipping`);
|
|
17
|
+
return { issueUrl: '', issueNumber: '', skipped: true };
|
|
18
|
+
}
|
|
19
|
+
const botComment = thread.comments[0];
|
|
20
|
+
if (!botComment) {
|
|
21
|
+
return { issueUrl: '', issueNumber: '', skipped: true };
|
|
22
|
+
}
|
|
23
|
+
// Build issue content
|
|
24
|
+
const summary = botComment.body.slice(0, 120).replace(/\n/g, ' ').trim();
|
|
25
|
+
const title = `Deferred: ${summary}`;
|
|
26
|
+
const hunkMatch = thread.diffHunk.match(/@@ .+?\+(\d+)/);
|
|
27
|
+
const lineRef = hunkMatch ? `:${hunkMatch[1]}` : '';
|
|
28
|
+
const body = [
|
|
29
|
+
`## Deferred Bot Review Finding`,
|
|
30
|
+
'',
|
|
31
|
+
`**File:** \`${thread.path}${lineRef}\``,
|
|
32
|
+
`**PR:** #${prNumber}`,
|
|
33
|
+
`**Bot:** ${botComment.author}`,
|
|
34
|
+
'',
|
|
35
|
+
'### Finding',
|
|
36
|
+
'',
|
|
37
|
+
botComment.body,
|
|
38
|
+
].join('\n');
|
|
39
|
+
const nextMilestone = inferNextMilestone(currentMilestone);
|
|
40
|
+
// Create the issue
|
|
41
|
+
const issueUrl = adapter.createIssue({
|
|
42
|
+
title,
|
|
43
|
+
body,
|
|
44
|
+
labels: ['tech-debt', 'deferred'],
|
|
45
|
+
milestone: nextMilestone,
|
|
46
|
+
});
|
|
47
|
+
// Extract issue number from URL (e.g., "https://github.com/owner/repo/issues/123")
|
|
48
|
+
const issueNumMatch = issueUrl.match(/\/issues\/(\d+)/);
|
|
49
|
+
const issueNumber = issueNumMatch ? issueNumMatch[1] : '';
|
|
50
|
+
// Reply on the thread with the issue link
|
|
51
|
+
const rootCommentId = thread.comments[0].id;
|
|
52
|
+
if (rootCommentId !== undefined && issueNumber) {
|
|
53
|
+
try {
|
|
54
|
+
adapter.replyToComment(prNumber, rootCommentId, `Deferred to #${issueNumber}`);
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
// Non-fatal — issue was created, reply is best-effort
|
|
58
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
59
|
+
onLog?.(`Failed to reply on thread (issue created): ${msg}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return { issueUrl, issueNumber, skipped: false };
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=deferred-issuer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deferred-issuer.js","sourceRoot":"","sources":["../../src/services/deferred-issuer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface FixResult {
|
|
2
|
+
applied: boolean;
|
|
3
|
+
commitSha?: string;
|
|
4
|
+
reason?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Apply a fix for a single finding: read file, LLM patch, write, commit, return SHA.
|
|
8
|
+
* Sequential — no concurrency concerns.
|
|
9
|
+
*/
|
|
10
|
+
export declare function dispatchFix(opts: {
|
|
11
|
+
filePath: string;
|
|
12
|
+
line?: number;
|
|
13
|
+
findingBody: string;
|
|
14
|
+
findingTool: string;
|
|
15
|
+
cwd: string;
|
|
16
|
+
runOrchestrator: (prompt: string) => Promise<string | undefined>;
|
|
17
|
+
onLog?: (msg: string) => void;
|
|
18
|
+
}): Promise<FixResult>;
|
|
19
|
+
//# sourceMappingURL=fix-dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-dispatcher.d.ts","sourceRoot":"","sources":["../../src/services/fix-dispatcher.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACjE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B,GAAG,OAAO,CAAC,SAAS,CAAC,CA0FrB"}
|