@mmnto/cli 1.75.0 → 1.75.2
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 +12 -1
- package/dist/adapters/github-cli-pr.d.ts.map +1 -1
- package/dist/adapters/github-cli-pr.js +33 -0
- package/dist/adapters/github-cli-pr.js.map +1 -1
- package/dist/adapters/github-cli-pr.test.js +58 -0
- package/dist/adapters/github-cli-pr.test.js.map +1 -1
- package/dist/adapters/pr-adapter.d.ts +28 -0
- package/dist/adapters/pr-adapter.d.ts.map +1 -1
- package/dist/commands/recurrence-stats.d.ts.map +1 -1
- package/dist/commands/recurrence-stats.js +3 -40
- package/dist/commands/recurrence-stats.js.map +1 -1
- package/dist/commands/retrospect.d.ts.map +1 -1
- package/dist/commands/retrospect.js +11 -7
- package/dist/commands/retrospect.js.map +1 -1
- package/dist/commands/triage-pr.d.ts +31 -0
- package/dist/commands/triage-pr.d.ts.map +1 -1
- package/dist/commands/triage-pr.js +137 -30
- package/dist/commands/triage-pr.js.map +1 -1
- package/dist/commands/triage-pr.test.js +64 -1
- package/dist/commands/triage-pr.test.js.map +1 -1
- package/dist/parse-nits.d.ts +24 -0
- package/dist/parse-nits.d.ts.map +1 -1
- package/dist/parse-nits.js +74 -0
- package/dist/parse-nits.js.map +1 -1
- package/dist/parse-nits.test.js +117 -1
- package/dist/parse-nits.test.js.map +1 -1
- package/dist/parsers/bot-review-parser.d.ts +50 -4
- package/dist/parsers/bot-review-parser.d.ts.map +1 -1
- package/dist/parsers/bot-review-parser.js +85 -15
- package/dist/parsers/bot-review-parser.js.map +1 -1
- package/dist/parsers/bot-review-parser.test.js +126 -1
- package/dist/parsers/bot-review-parser.test.js.map +1 -1
- package/package.json +2 -2
package/dist/parse-nits.test.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { parseCodeRabbitNits, parseCodeRabbitOutsideDiff, parseCodeRabbitReviewFindings, } from './parse-nits.js';
|
|
2
|
+
import { parseCodeRabbitNits, parseCodeRabbitOutsideDiff, parseCodeRabbitReviewFindings, parseGreptileOutsideDiff, parseGreptileReviewFindings, } from './parse-nits.js';
|
|
3
3
|
// ─── Sample CodeRabbit nit block ─────────────────────────
|
|
4
4
|
const SAMPLE_NIT_BLOCK = `<details>
|
|
5
5
|
<summary>🧹 Nitpick comments (2)</summary><blockquote>
|
|
@@ -277,4 +277,120 @@ ${SAMPLE_OUTSIDE_DIFF_BLOCK}`;
|
|
|
277
277
|
expect(findings).toHaveLength(1);
|
|
278
278
|
});
|
|
279
279
|
});
|
|
280
|
+
// ─── Greptile summary parser (marker-anchored — mmnto-ai/totem#2192) ──────────
|
|
281
|
+
//
|
|
282
|
+
// Anchored on the canonical `<!-- greptile_other_comments_section -->` marker
|
|
283
|
+
// (mmnto-ai/totem-strategy#690), NOT a sampled <details> shape — greptile edits
|
|
284
|
+
// its summary in place, so a closed PR shows the marker with content removed
|
|
285
|
+
// post-resolution. The marker placement (below the flowchart, above the
|
|
286
|
+
// `<sub>Reviews>` footer) mirrors the real strategy#689 structure; the exact
|
|
287
|
+
// rendering of findings UNDER the marker is validated against a live out-of-diff
|
|
288
|
+
// sample (this fix's own PR or the next one).
|
|
289
|
+
const GREPTILE_WITH_OUTSIDE_DIFF = `<h3>Greptile Summary</h3>
|
|
290
|
+
|
|
291
|
+
Some prose summary.
|
|
292
|
+
|
|
293
|
+
<h3>Flowchart</h3>
|
|
294
|
+
|
|
295
|
+
\`\`\`mermaid
|
|
296
|
+
flowchart TD
|
|
297
|
+
A --> B
|
|
298
|
+
\`\`\`
|
|
299
|
+
|
|
300
|
+
<!-- greptile_other_comments_section -->
|
|
301
|
+
|
|
302
|
+
\`src/scorer.ts\`: the exposure floor is accepted but never checked in Step 2.
|
|
303
|
+
|
|
304
|
+
<sub>Reviews (2): Last reviewed commit … | Re-trigger Greptile</sub>`;
|
|
305
|
+
const GREPTILE_RESOLVED = `<h3>Greptile Summary</h3>
|
|
306
|
+
|
|
307
|
+
Confidence Score: 5/5 — safe to merge.
|
|
308
|
+
|
|
309
|
+
<!-- greptile_other_comments_section -->
|
|
310
|
+
|
|
311
|
+
<sub>Reviews (3): Last reviewed commit … | Re-trigger Greptile</sub>`;
|
|
312
|
+
describe('parseGreptileOutsideDiff (marker-anchored)', () => {
|
|
313
|
+
it('extracts the section under the greptile_other_comments_section marker', () => {
|
|
314
|
+
const results = parseGreptileOutsideDiff(GREPTILE_WITH_OUTSIDE_DIFF);
|
|
315
|
+
expect(results).toHaveLength(1);
|
|
316
|
+
expect(results[0]).toContain('exposure floor');
|
|
317
|
+
});
|
|
318
|
+
it('drops the trailing <sub>Reviews</sub> footer from the extracted section', () => {
|
|
319
|
+
const results = parseGreptileOutsideDiff(GREPTILE_WITH_OUTSIDE_DIFF);
|
|
320
|
+
expect(results[0]).not.toMatch(/Re-trigger Greptile/);
|
|
321
|
+
expect(results[0]).not.toMatch(/<sub\b/i);
|
|
322
|
+
});
|
|
323
|
+
it('returns empty when the marker is present but the section is resolved/empty', () => {
|
|
324
|
+
// The post-resolution state: marker remains, content edited away.
|
|
325
|
+
expect(parseGreptileOutsideDiff(GREPTILE_RESOLVED)).toEqual([]);
|
|
326
|
+
});
|
|
327
|
+
it('returns empty when the marker is absent', () => {
|
|
328
|
+
const body = `<h3>Greptile Summary</h3>\n\nConfidence Score: 5/5\n\nSafe to merge.`;
|
|
329
|
+
expect(parseGreptileOutsideDiff(body)).toEqual([]);
|
|
330
|
+
});
|
|
331
|
+
it('returns empty array for empty string', () => {
|
|
332
|
+
expect(parseGreptileOutsideDiff('')).toEqual([]);
|
|
333
|
+
});
|
|
334
|
+
it('splits multiple findings on `---` rules outside code fences (CR #2246)', () => {
|
|
335
|
+
const body = [
|
|
336
|
+
'<!-- greptile_other_comments_section -->',
|
|
337
|
+
'',
|
|
338
|
+
'`src/a.ts`: first finding.',
|
|
339
|
+
'',
|
|
340
|
+
'---',
|
|
341
|
+
'',
|
|
342
|
+
'`src/b.ts`: second finding.',
|
|
343
|
+
'',
|
|
344
|
+
'<sub>Reviews (2): Last reviewed commit … | Re-trigger Greptile</sub>',
|
|
345
|
+
].join('\n');
|
|
346
|
+
expect(parseGreptileOutsideDiff(body)).toEqual([
|
|
347
|
+
'`src/a.ts`: first finding.',
|
|
348
|
+
'`src/b.ts`: second finding.',
|
|
349
|
+
]);
|
|
350
|
+
});
|
|
351
|
+
it('preserves fenced code blocks and does NOT split on an in-fence `---` (gemini #2246)', () => {
|
|
352
|
+
const fence = '```';
|
|
353
|
+
const body = [
|
|
354
|
+
'<!-- greptile_other_comments_section -->',
|
|
355
|
+
'',
|
|
356
|
+
'Suggested fix:',
|
|
357
|
+
`${fence}ts`,
|
|
358
|
+
'const x = 1;',
|
|
359
|
+
'---', // a rule-looking line INSIDE the fence must not split
|
|
360
|
+
'const y = 2;',
|
|
361
|
+
fence,
|
|
362
|
+
'',
|
|
363
|
+
'<sub>Reviews (1): … | Re-trigger Greptile</sub>',
|
|
364
|
+
].join('\n');
|
|
365
|
+
const results = parseGreptileOutsideDiff(body);
|
|
366
|
+
expect(results).toHaveLength(1); // not split by the in-fence `---`
|
|
367
|
+
expect(results[0]).toContain('const x = 1;'); // code preserved, not stripped
|
|
368
|
+
expect(results[0]).toContain('const y = 2;');
|
|
369
|
+
expect(results[0]).toContain(fence);
|
|
370
|
+
});
|
|
371
|
+
it('anchors footer removal to the Reviews footer, preserving an inner <sub> (CR #2246)', () => {
|
|
372
|
+
const body = [
|
|
373
|
+
'<!-- greptile_other_comments_section -->',
|
|
374
|
+
'',
|
|
375
|
+
'Finding with an inline <sub>subscript</sub> that must survive.',
|
|
376
|
+
'',
|
|
377
|
+
'<sub>Reviews (1): … | Re-trigger Greptile</sub>',
|
|
378
|
+
].join('\n');
|
|
379
|
+
const results = parseGreptileOutsideDiff(body);
|
|
380
|
+
expect(results).toHaveLength(1);
|
|
381
|
+
expect(results[0]).toContain('subscript');
|
|
382
|
+
expect(results[0]).not.toMatch(/Re-trigger Greptile/);
|
|
383
|
+
});
|
|
384
|
+
});
|
|
385
|
+
describe('parseGreptileReviewFindings (marker-anchored)', () => {
|
|
386
|
+
it('types the extracted section as outside-diff findings', () => {
|
|
387
|
+
const findings = parseGreptileReviewFindings(GREPTILE_WITH_OUTSIDE_DIFF);
|
|
388
|
+
expect(findings).toHaveLength(1);
|
|
389
|
+
expect(findings[0].type).toBe('outside-diff');
|
|
390
|
+
expect(findings[0].content).toContain('exposure floor');
|
|
391
|
+
});
|
|
392
|
+
it('returns empty array when the marker section is absent', () => {
|
|
393
|
+
expect(parseGreptileReviewFindings('## Just a normal summary.')).toEqual([]);
|
|
394
|
+
});
|
|
395
|
+
});
|
|
280
396
|
//# sourceMappingURL=parse-nits.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-nits.test.js","sourceRoot":"","sources":["../src/parse-nits.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parse-nits.test.js","sourceRoot":"","sources":["../src/parse-nits.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,8 +6,22 @@
|
|
|
6
6
|
* so that `review-learn` extracts lessons only from findings the
|
|
7
7
|
* developer actually fixed.
|
|
8
8
|
*/
|
|
9
|
+
/**
|
|
10
|
+
* The review bots whose comment formats triage-pr knows how to parse, plus
|
|
11
|
+
* `unknown` for an unrecognized author. Adding a bot is a single-place change
|
|
12
|
+
* here + its severity parser in {@link parseSeverityForTool}.
|
|
13
|
+
*
|
|
14
|
+
* NOTE: `gca` is triage's local id for `gemini-code-assist` — it intentionally
|
|
15
|
+
* diverges from the core actor-id scheme in `@mmnto/totem`'s `resolveActorId`
|
|
16
|
+
* (which uses `gemini-code-assist` and EXACT-login matching for hit-rate
|
|
17
|
+
* attribution). Triage's goal is broad recognition (surface every finding) with
|
|
18
|
+
* a compact display id; it matches coderabbit/gca by substring and greptile by
|
|
19
|
+
* its bot-login shape (see `GREPTILE_BOT_LOGIN`). The two schemes serve
|
|
20
|
+
* different purposes and are deliberately not coupled.
|
|
21
|
+
*/
|
|
22
|
+
export type BotTool = 'coderabbit' | 'gca' | 'greptile' | 'unknown';
|
|
9
23
|
export interface NormalizedBotFinding {
|
|
10
|
-
tool:
|
|
24
|
+
tool: BotTool;
|
|
11
25
|
severity: string;
|
|
12
26
|
file: string;
|
|
13
27
|
line?: number;
|
|
@@ -38,7 +52,7 @@ export interface CommentThread {
|
|
|
38
52
|
}>;
|
|
39
53
|
}
|
|
40
54
|
export declare function isBotComment(author: string): boolean;
|
|
41
|
-
export declare function detectBot(author: string):
|
|
55
|
+
export declare function detectBot(author: string): BotTool;
|
|
42
56
|
/** Extract severity from CR comment body (red circle Critical, orange circle Major, yellow circle Minor) */
|
|
43
57
|
export declare function parseCRSeverity(body: string): string;
|
|
44
58
|
/** Strip HTML wrapper tags but keep content. Unwraps <details>, <summary>, <blockquote>. */
|
|
@@ -47,6 +61,33 @@ export declare function stripHtmlWrappers(html: string): string;
|
|
|
47
61
|
export declare function extractSuggestion(body: string): string | undefined;
|
|
48
62
|
/** Extract severity from GCA comment body (SVG priority images) */
|
|
49
63
|
export declare function parseGCASeverity(body: string): string;
|
|
64
|
+
/**
|
|
65
|
+
* Extract severity from a greptile inline comment body via its P1/P2/P3
|
|
66
|
+
* priority label (greptile's severity vocabulary), mapped onto the shared
|
|
67
|
+
* high/medium/low scale that {@link mapToTriageCategory} consumes.
|
|
68
|
+
*
|
|
69
|
+
* Best-effort: greptile's inline format is less structured than CR's emoji or
|
|
70
|
+
* GCA's SVG marker, so when no explicit priority token is present this returns
|
|
71
|
+
* `info` and the body-keyword categorizer does the real bucketing. Word-bounded
|
|
72
|
+
* so `P1`/`p1` matches but a mid-token `GP1X` does not. P0 is greptile's
|
|
73
|
+
* critical/blocking level (greptile review on mmnto-ai/totem#2244) — without it,
|
|
74
|
+
* a `P0` finding would silently fall through to `info`, the opposite of safe.
|
|
75
|
+
*/
|
|
76
|
+
export declare function parseGreptileSeverity(body: string): string;
|
|
77
|
+
/**
|
|
78
|
+
* Extract greptile's documented merge-readiness Confidence Score (`N/5`, integer
|
|
79
|
+
* 0–5) from its summary comment — 5 production-ready … 0–1 critical problems
|
|
80
|
+
* (greptile docs: code-review/first-pr-review). A status signal surfaced as
|
|
81
|
+
* triage context (NOT a finding); returns `undefined` when no score is present.
|
|
82
|
+
* Parsed as `N/5`, never a percentage.
|
|
83
|
+
*/
|
|
84
|
+
export declare function parseGreptileConfidence(body: string): number | undefined;
|
|
85
|
+
/**
|
|
86
|
+
* Single source of truth for "which severity parser applies to which bot".
|
|
87
|
+
* Keeps the per-tool dispatch in one place so adding a bot does not require
|
|
88
|
+
* touching every finding-normalizer (triage-pr, extractResolved, extractPushback).
|
|
89
|
+
*/
|
|
90
|
+
export declare function parseSeverityForTool(tool: BotTool, body: string): string;
|
|
50
91
|
/** Patterns indicating human pushback (false positive signal). */
|
|
51
92
|
export declare const PUSHBACK_PATTERNS: RegExp[];
|
|
52
93
|
/**
|
|
@@ -59,8 +100,13 @@ export declare function isThreadResolved(thread: CommentThread): boolean;
|
|
|
59
100
|
* Only returns findings from threads that were resolved positively.
|
|
60
101
|
*/
|
|
61
102
|
/**
|
|
62
|
-
* Extract findings from
|
|
63
|
-
*
|
|
103
|
+
* Extract findings from review-bot SUMMARY bodies (CodeRabbit outside-diff + nits,
|
|
104
|
+
* greptile "Comments Outside Diff"). Surface-agnostic: callers pass review
|
|
105
|
+
* submission bodies (`fetchReviews`/`pr.reviews`) AND PR issue comments
|
|
106
|
+
* (`fetchIssueComments`) — bots post these standing summaries on different
|
|
107
|
+
* surfaces (CR in the review body, greptile in the issue-comment summary) and
|
|
108
|
+
* edit them in place across rounds. Overlap between surfaces is collapsed
|
|
109
|
+
* downstream by `deduplicateFindings`. Shared by triage-pr and review-learn.
|
|
64
110
|
*/
|
|
65
111
|
export declare function extractReviewBodyFindings(reviews: Array<{
|
|
66
112
|
author: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-review-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/bot-review-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,
|
|
1
|
+
{"version":3,"file":"bot-review-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/bot-review-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,OAAO,GAAG,YAAY,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,CAAC;AAEpE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,gBAAgB,CAAC,EAAE,OAAO,GAAG,iBAAiB,GAAG,MAAM,CAAC;IACxD,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACtC,uIAAuI;IACvI,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChE;AAgBD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAOpD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAMjD;AAID,4GAA4G;AAC5G,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQtD;AAED,qDAAqD;AACrD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGlE;AAID,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMrD;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM1D;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKxE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAWxE;AAID,kEAAkE;AAClE,eAAO,MAAM,iBAAiB,UAmB7B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAiC/D;AAED;;;GAGG;AACH;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAC/C,oBAAoB,EAAE,CAgCxB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,oBAAoB,EAAE,CAqCxF;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,oBAAoB,EAAE,CA+B3F"}
|
|
@@ -6,11 +6,24 @@
|
|
|
6
6
|
* so that `review-learn` extracts lessons only from findings the
|
|
7
7
|
* developer actually fixed.
|
|
8
8
|
*/
|
|
9
|
-
import { parseCodeRabbitReviewFindings } from '../parse-nits.js';
|
|
9
|
+
import { parseCodeRabbitReviewFindings, parseGreptileReviewFindings } from '../parse-nits.js';
|
|
10
10
|
// ─── Bot Detection ──────────────────────────────────
|
|
11
|
+
// greptile is matched by its bot-login SHAPE — `greptile[bot]`,
|
|
12
|
+
// `greptile-apps[bot]`, `greptile-enterprise[bot]` — rather than a bare
|
|
13
|
+
// `greptile` substring, so a human account like `alice-greptile` is NOT
|
|
14
|
+
// misclassified as a bot (which would hide real human replies in
|
|
15
|
+
// `isThreadResolved` and ingest human comments as bot findings — CR Major on
|
|
16
|
+
// mmnto-ai/totem#2244), while future bot variants are still surfaced. The
|
|
17
|
+
// reviewer's suggested regex carried a trailing `\b` that fails right after the
|
|
18
|
+
// closing `]` (non-word char at end-of-string), so it is dropped here.
|
|
19
|
+
// coderabbit / gca keep their established bare-substring match (canonical
|
|
20
|
+
// exact-login map lives in `@mmnto/totem`'s `review-catch.ts`).
|
|
21
|
+
const GREPTILE_BOT_LOGIN = /\bgreptile(?:-[^[]+)?\[bot\]/i;
|
|
11
22
|
export function isBotComment(author) {
|
|
12
23
|
const lower = author.toLowerCase();
|
|
13
|
-
return lower.includes('coderabbit') ||
|
|
24
|
+
return (lower.includes('coderabbit') ||
|
|
25
|
+
lower.includes('gemini-code-assist') ||
|
|
26
|
+
GREPTILE_BOT_LOGIN.test(author));
|
|
14
27
|
}
|
|
15
28
|
export function detectBot(author) {
|
|
16
29
|
const lower = author.toLowerCase();
|
|
@@ -18,6 +31,8 @@ export function detectBot(author) {
|
|
|
18
31
|
return 'coderabbit';
|
|
19
32
|
if (lower.includes('gemini-code-assist'))
|
|
20
33
|
return 'gca';
|
|
34
|
+
if (GREPTILE_BOT_LOGIN.test(author))
|
|
35
|
+
return 'greptile';
|
|
21
36
|
return 'unknown';
|
|
22
37
|
}
|
|
23
38
|
// ─── CodeRabbit Parser ──────────────────────────────
|
|
@@ -57,6 +72,60 @@ export function parseGCASeverity(body) {
|
|
|
57
72
|
return 'low';
|
|
58
73
|
return 'info';
|
|
59
74
|
}
|
|
75
|
+
// ─── Greptile Parser ────────────────────────────────
|
|
76
|
+
/**
|
|
77
|
+
* Extract severity from a greptile inline comment body via its P1/P2/P3
|
|
78
|
+
* priority label (greptile's severity vocabulary), mapped onto the shared
|
|
79
|
+
* high/medium/low scale that {@link mapToTriageCategory} consumes.
|
|
80
|
+
*
|
|
81
|
+
* Best-effort: greptile's inline format is less structured than CR's emoji or
|
|
82
|
+
* GCA's SVG marker, so when no explicit priority token is present this returns
|
|
83
|
+
* `info` and the body-keyword categorizer does the real bucketing. Word-bounded
|
|
84
|
+
* so `P1`/`p1` matches but a mid-token `GP1X` does not. P0 is greptile's
|
|
85
|
+
* critical/blocking level (greptile review on mmnto-ai/totem#2244) — without it,
|
|
86
|
+
* a `P0` finding would silently fall through to `info`, the opposite of safe.
|
|
87
|
+
*/
|
|
88
|
+
export function parseGreptileSeverity(body) {
|
|
89
|
+
if (/\bP0\b/i.test(body))
|
|
90
|
+
return 'critical';
|
|
91
|
+
if (/\bP1\b/i.test(body))
|
|
92
|
+
return 'high';
|
|
93
|
+
if (/\bP2\b/i.test(body))
|
|
94
|
+
return 'medium';
|
|
95
|
+
if (/\bP3\b/i.test(body))
|
|
96
|
+
return 'low';
|
|
97
|
+
return 'info';
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Extract greptile's documented merge-readiness Confidence Score (`N/5`, integer
|
|
101
|
+
* 0–5) from its summary comment — 5 production-ready … 0–1 critical problems
|
|
102
|
+
* (greptile docs: code-review/first-pr-review). A status signal surfaced as
|
|
103
|
+
* triage context (NOT a finding); returns `undefined` when no score is present.
|
|
104
|
+
* Parsed as `N/5`, never a percentage.
|
|
105
|
+
*/
|
|
106
|
+
export function parseGreptileConfidence(body) {
|
|
107
|
+
// `(?!\d)` bounds the denominator so `Confidence Score: 5/50` is not misread
|
|
108
|
+
// as `5/5` (a false merge-readiness signal) — CR review on #2246.
|
|
109
|
+
const m = body.match(/Confidence Score:\s*([0-5])\s*\/\s*5(?!\d)/i);
|
|
110
|
+
return m ? Number(m[1]) : undefined;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Single source of truth for "which severity parser applies to which bot".
|
|
114
|
+
* Keeps the per-tool dispatch in one place so adding a bot does not require
|
|
115
|
+
* touching every finding-normalizer (triage-pr, extractResolved, extractPushback).
|
|
116
|
+
*/
|
|
117
|
+
export function parseSeverityForTool(tool, body) {
|
|
118
|
+
switch (tool) {
|
|
119
|
+
case 'coderabbit':
|
|
120
|
+
return parseCRSeverity(body);
|
|
121
|
+
case 'gca':
|
|
122
|
+
return parseGCASeverity(body);
|
|
123
|
+
case 'greptile':
|
|
124
|
+
return parseGreptileSeverity(body);
|
|
125
|
+
default:
|
|
126
|
+
return 'info';
|
|
127
|
+
}
|
|
128
|
+
}
|
|
60
129
|
// ─── Resolution Filter ──────────────────────────────
|
|
61
130
|
/** Patterns indicating human pushback (false positive signal). */
|
|
62
131
|
export const PUSHBACK_PATTERNS = [
|
|
@@ -120,8 +189,13 @@ export function isThreadResolved(thread) {
|
|
|
120
189
|
* Only returns findings from threads that were resolved positively.
|
|
121
190
|
*/
|
|
122
191
|
/**
|
|
123
|
-
* Extract findings from
|
|
124
|
-
*
|
|
192
|
+
* Extract findings from review-bot SUMMARY bodies (CodeRabbit outside-diff + nits,
|
|
193
|
+
* greptile "Comments Outside Diff"). Surface-agnostic: callers pass review
|
|
194
|
+
* submission bodies (`fetchReviews`/`pr.reviews`) AND PR issue comments
|
|
195
|
+
* (`fetchIssueComments`) — bots post these standing summaries on different
|
|
196
|
+
* surfaces (CR in the review body, greptile in the issue-comment summary) and
|
|
197
|
+
* edit them in place across rounds. Overlap between surfaces is collapsed
|
|
198
|
+
* downstream by `deduplicateFindings`. Shared by triage-pr and review-learn.
|
|
125
199
|
*/
|
|
126
200
|
export function extractReviewBodyFindings(reviews) {
|
|
127
201
|
const findings = [];
|
|
@@ -130,10 +204,14 @@ export function extractReviewBodyFindings(reviews) {
|
|
|
130
204
|
continue;
|
|
131
205
|
const tool = detectBot(review.author);
|
|
132
206
|
let parsed = [];
|
|
133
|
-
// Only CodeRabbit parser is implemented for now
|
|
134
207
|
if (tool === 'coderabbit') {
|
|
135
208
|
parsed = parseCodeRabbitReviewFindings(review.body);
|
|
136
209
|
}
|
|
210
|
+
else if (tool === 'greptile') {
|
|
211
|
+
// PROVISIONAL greptile summary parser (mmnto-ai/totem#2192) — see
|
|
212
|
+
// `parseGreptileOutsideDiff`. Refine against a captured live sample.
|
|
213
|
+
parsed = parseGreptileReviewFindings(review.body);
|
|
214
|
+
}
|
|
137
215
|
for (const finding of parsed) {
|
|
138
216
|
findings.push({
|
|
139
217
|
tool,
|
|
@@ -168,11 +246,7 @@ export function extractPushbackFindings(threads) {
|
|
|
168
246
|
if (!pushbackReply)
|
|
169
247
|
continue;
|
|
170
248
|
const tool = detectBot(botComment.author);
|
|
171
|
-
const severity = tool
|
|
172
|
-
? parseCRSeverity(botComment.body)
|
|
173
|
-
: tool === 'gca'
|
|
174
|
-
? parseGCASeverity(botComment.body)
|
|
175
|
-
: 'info';
|
|
249
|
+
const severity = parseSeverityForTool(tool, botComment.body);
|
|
176
250
|
const body = stripHtmlWrappers(botComment.body);
|
|
177
251
|
const hunkMatch = thread.diffHunk.match(/@@ .+?\+(\d+)/);
|
|
178
252
|
const line = hunkMatch ? parseInt(hunkMatch[1], 10) : undefined;
|
|
@@ -198,11 +272,7 @@ export function extractResolvedBotFindings(threads) {
|
|
|
198
272
|
continue;
|
|
199
273
|
const botComment = thread.comments[0];
|
|
200
274
|
const tool = detectBot(botComment.author);
|
|
201
|
-
const severity = tool
|
|
202
|
-
? parseCRSeverity(botComment.body)
|
|
203
|
-
: tool === 'gca'
|
|
204
|
-
? parseGCASeverity(botComment.body)
|
|
205
|
-
: 'info';
|
|
275
|
+
const severity = parseSeverityForTool(tool, botComment.body);
|
|
206
276
|
const body = stripHtmlWrappers(botComment.body);
|
|
207
277
|
const suggestion = extractSuggestion(botComment.body);
|
|
208
278
|
// Extract line number from diff hunk header (@@ -a,b +c,d @@)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-review-parser.js","sourceRoot":"","sources":["../../src/parsers/bot-review-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"bot-review-parser.js","sourceRoot":"","sources":["../../src/parsers/bot-review-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAgD9F,uDAAuD;AAEvD,gEAAgE;AAChE,wEAAwE;AACxE,wEAAwE;AACxE,iEAAiE;AACjE,6EAA6E;AAC7E,0EAA0E;AAC1E,gFAAgF;AAChF,uEAAuE;AACvE,0EAA0E;AAC1E,gEAAgE;AAChE,MAAM,kBAAkB,GAAG,+BAA+B,CAAC;AAE3D,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,OAAO,CACL,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC5B,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QACpC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAChC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,YAAY,CAAC;IACtD,IAAI,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAAE,OAAO,KAAK,CAAC;IACvD,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,UAAU,CAAC;IACvD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,uDAAuD;AAEvD,4GAA4G;AAC5G,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAC7F,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACvF,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACvF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,IAAI;SACR,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;SAC7B,OAAO,CAAC,gCAAgC,EAAE,EAAE,CAAC;SAC7C,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;SAChC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,2CAA2C;SACzE,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1B,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC;AAED,uDAAuD;AAEvD,mEAAmE;AACnE,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACnF,OAAO,MAAM,CAAC;IAChB,IAAI,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC1D,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,uDAAuD;AAEvD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC;IAC5C,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACxC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC1C,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,6EAA6E;IAC7E,kEAAkE;IAClE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACpE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAa,EAAE,IAAY;IAC9D,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,YAAY;YACf,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/B,KAAK,KAAK;YACR,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAChC,KAAK,UAAU;YACb,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC;QACrC;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED,uDAAuD;AAEvD,kEAAkE;AAClE,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,mDAAmD;IACnD,kBAAkB;IAClB,kBAAkB;IAClB,mBAAmB;IACnB,0CAA0C;IAC1C,yBAAyB;IACzB,qBAAqB;IACrB,6FAA6F;IAC7F,8FAA8F;IAC9F,yFAAyF;IACzF,mGAAmG;IACnG,gGAAgG;IAChG,+FAA+F;IAC/F,gGAAgG;IAChG,kGAAkG;IAClG,2FAA2F;IAC3F,iDAAiD;IACjD,mBAAmB;CACpB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAE9B,wBAAwB;IACxB,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnD,mCAAmC;IACnC,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAErF,2CAA2C;IAC3C,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAE5C,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACtE,CAAC;IAED,4EAA4E;IAC5E,MAAM,aAAa,GAAG;QACpB,YAAY;QACZ,WAAW;QACX,gBAAgB;QAChB,cAAc;QACd,oBAAoB,EAAE,aAAa;QACnC,wBAAwB,EAAE,mBAAmB;KAC9C,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IACjE,CAAC;IAED,6CAA6C;IAC7C,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAgD;IAEhD,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,SAAS;QAE7D,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,MAAM,GAAiE,EAAE,CAAC;QAE9E,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1B,MAAM,GAAG,6BAA6B,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC;aAAM,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YAC/B,kEAAkE;YAClE,qEAAqE;YACrE,MAAM,GAAG,2BAA2B,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI;gBACJ,QAAQ,EAAE,OAAO,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;gBAC9D,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,OAAO,CAAC,OAAO;gBACrB,UAAU,EAAE,SAAS;gBACrB,gBAAgB,EAAE,MAAM;gBACxB,8EAA8E;gBAC9E,+EAA+E;gBAC/E,6DAA6D;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAwB;IAC9D,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAE5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,SAAS;QAE9D,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACrF,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAExC,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAChD,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAClD,CAAC;QACF,IAAI,CAAC,aAAa;YAAE,SAAS;QAE7B,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;QAE7D,MAAM,IAAI,GAAG,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEjE,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI;YACJ,QAAQ;YACR,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI;YACJ,IAAI;YACJ,UAAU,EAAE,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC;YAC9C,gBAAgB,EAAE,MAAM;YACxB,aAAa,EAAE,UAAU,CAAC,EAAE;YAC5B,WAAW,EAAE,UAAU;YACvB,oBAAoB,EAAE,aAAa,CAAC,IAAI;SACzC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAwB;IACjE,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAE5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAAE,SAAS;QAExC,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC;QACvC,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;QAE7D,MAAM,IAAI,GAAG,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAEtD,8DAA8D;QAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEjE,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI;YACJ,QAAQ;YACR,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI;YACJ,IAAI;YACJ,UAAU;YACV,gBAAgB,EAAE,OAAO;YACzB,aAAa,EAAE,UAAU,CAAC,EAAE;YAC5B,WAAW,EAAE,UAAU;SACxB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { detectBot, extractPushbackFindings, extractResolvedBotFindings, extractReviewBodyFindings, extractSuggestion, isBotComment, isThreadResolved, parseCRSeverity, parseGCASeverity, stripHtmlWrappers, } from './bot-review-parser.js';
|
|
2
|
+
import { detectBot, extractPushbackFindings, extractResolvedBotFindings, extractReviewBodyFindings, extractSuggestion, isBotComment, isThreadResolved, parseCRSeverity, parseGCASeverity, parseGreptileConfidence, parseGreptileSeverity, parseSeverityForTool, stripHtmlWrappers, } from './bot-review-parser.js';
|
|
3
3
|
// ─── detectBot ──────────────────────────────────────────
|
|
4
4
|
describe('detectBot', () => {
|
|
5
5
|
it('identifies coderabbitai[bot]', () => {
|
|
@@ -8,6 +8,9 @@ describe('detectBot', () => {
|
|
|
8
8
|
it('identifies gemini-code-assist[bot]', () => {
|
|
9
9
|
expect(detectBot('gemini-code-assist[bot]')).toBe('gca');
|
|
10
10
|
});
|
|
11
|
+
it('identifies greptile-apps[bot] (mmnto-ai/totem#2192)', () => {
|
|
12
|
+
expect(detectBot('greptile-apps[bot]')).toBe('greptile');
|
|
13
|
+
});
|
|
11
14
|
it('returns unknown for human authors', () => {
|
|
12
15
|
expect(detectBot('octocat')).toBe('unknown');
|
|
13
16
|
expect(detectBot('jmatt')).toBe('unknown');
|
|
@@ -21,6 +24,18 @@ describe('isBotComment', () => {
|
|
|
21
24
|
it('returns true for GCA bot', () => {
|
|
22
25
|
expect(isBotComment('gemini-code-assist[bot]')).toBe(true);
|
|
23
26
|
});
|
|
27
|
+
it('returns true for greptile bot (mmnto-ai/totem#2192)', () => {
|
|
28
|
+
expect(isBotComment('greptile-apps[bot]')).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
it('matches greptile bot variants by login shape, not a bare substring (CR Major #2244)', () => {
|
|
31
|
+
// A future bot variant is still surfaced …
|
|
32
|
+
expect(isBotComment('greptile-enterprise[bot]')).toBe(true);
|
|
33
|
+
expect(detectBot('greptile-enterprise[bot]')).toBe('greptile');
|
|
34
|
+
// … but a human whose login merely contains 'greptile' is NOT a bot
|
|
35
|
+
// (a bare-substring match would hide their replies / ingest them as findings).
|
|
36
|
+
expect(isBotComment('alice-greptile')).toBe(false);
|
|
37
|
+
expect(detectBot('alice-greptile')).toBe('unknown');
|
|
38
|
+
});
|
|
24
39
|
it('returns false for human authors', () => {
|
|
25
40
|
expect(isBotComment('octocat')).toBe(false);
|
|
26
41
|
});
|
|
@@ -61,6 +76,43 @@ describe('parseGCASeverity', () => {
|
|
|
61
76
|
expect(parseGCASeverity('Plain comment without severity')).toBe('info');
|
|
62
77
|
});
|
|
63
78
|
});
|
|
79
|
+
// ─── parseGreptileSeverity (mmnto-ai/totem#2192) ────────
|
|
80
|
+
describe('parseGreptileSeverity', () => {
|
|
81
|
+
it('maps P0 → critical (greptile P0 = blocking; mmnto-ai/totem#2244)', () => {
|
|
82
|
+
expect(parseGreptileSeverity('**P0** SQL injection')).toBe('critical');
|
|
83
|
+
});
|
|
84
|
+
it('maps P1 → high', () => {
|
|
85
|
+
expect(parseGreptileSeverity('**P1** This dereferences a possibly-null value')).toBe('high');
|
|
86
|
+
});
|
|
87
|
+
it('maps P2 → medium', () => {
|
|
88
|
+
expect(parseGreptileSeverity('P2: schema gap — missing field')).toBe('medium');
|
|
89
|
+
});
|
|
90
|
+
it('maps P3 → low', () => {
|
|
91
|
+
expect(parseGreptileSeverity('p3 nit: rename for clarity')).toBe('low');
|
|
92
|
+
});
|
|
93
|
+
it('returns info when no priority token is present', () => {
|
|
94
|
+
expect(parseGreptileSeverity('Consider extracting this into a helper')).toBe('info');
|
|
95
|
+
});
|
|
96
|
+
it('does not match a priority token embedded mid-identifier', () => {
|
|
97
|
+
expect(parseGreptileSeverity('the GP1X register is set here')).toBe('info');
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
// ─── parseSeverityForTool (single per-tool dispatch) ────
|
|
101
|
+
describe('parseSeverityForTool', () => {
|
|
102
|
+
it('dispatches coderabbit to the CR parser', () => {
|
|
103
|
+
expect(parseSeverityForTool('coderabbit', '\u{1F534} Critical: overflow')).toBe('critical');
|
|
104
|
+
});
|
|
105
|
+
it('dispatches gca to the GCA parser', () => {
|
|
106
|
+
expect(parseSeverityForTool('gca', '')).toBe('medium');
|
|
107
|
+
});
|
|
108
|
+
it('dispatches greptile to the greptile parser', () => {
|
|
109
|
+
expect(parseSeverityForTool('greptile', '**P1** null deref')).toBe('high');
|
|
110
|
+
expect(parseSeverityForTool('greptile', '**P0** rce')).toBe('critical');
|
|
111
|
+
});
|
|
112
|
+
it('returns info for an unknown tool', () => {
|
|
113
|
+
expect(parseSeverityForTool('unknown', 'anything')).toBe('info');
|
|
114
|
+
});
|
|
115
|
+
});
|
|
64
116
|
// ─── stripHtmlWrappers ──────────────────────────────────
|
|
65
117
|
describe('stripHtmlWrappers', () => {
|
|
66
118
|
it('removes details/summary/blockquote tags', () => {
|
|
@@ -236,6 +288,23 @@ describe('extractResolvedBotFindings', () => {
|
|
|
236
288
|
expect(findings[1].severity).toBe('medium');
|
|
237
289
|
expect(findings[1].suggestion).toBeUndefined();
|
|
238
290
|
});
|
|
291
|
+
it('normalizes a resolved greptile finding (mmnto-ai/totem#2192)', () => {
|
|
292
|
+
const threads = [
|
|
293
|
+
{
|
|
294
|
+
path: 'src/windtunnel-scorer.ts',
|
|
295
|
+
diffHunk: '@@ -1,3 +1,5 @@',
|
|
296
|
+
comments: [
|
|
297
|
+
{ author: 'greptile-apps[bot]', body: '**P1** Possible null dereference on `cfg`' },
|
|
298
|
+
{ author: 'dev', body: 'Fixed in abc1234' },
|
|
299
|
+
],
|
|
300
|
+
},
|
|
301
|
+
];
|
|
302
|
+
const findings = extractResolvedBotFindings(threads);
|
|
303
|
+
expect(findings).toHaveLength(1);
|
|
304
|
+
expect(findings[0].tool).toBe('greptile');
|
|
305
|
+
expect(findings[0].severity).toBe('high');
|
|
306
|
+
expect(findings[0].disposition).toBe('accepted');
|
|
307
|
+
});
|
|
239
308
|
});
|
|
240
309
|
// ─── extractPushbackFindings ──────────────────────────
|
|
241
310
|
describe('extractPushbackFindings', () => {
|
|
@@ -343,6 +412,23 @@ describe('extractPushbackFindings', () => {
|
|
|
343
412
|
expect(findings[0].tool).toBe('gca');
|
|
344
413
|
expect(findings[0].severity).toBe('high');
|
|
345
414
|
});
|
|
415
|
+
it('handles greptile bot findings (mmnto-ai/totem#2192)', () => {
|
|
416
|
+
const threads = [
|
|
417
|
+
{
|
|
418
|
+
path: 'src/windtunnel-lock.ts',
|
|
419
|
+
diffHunk: '@@ -10,3 +20,5 @@',
|
|
420
|
+
comments: [
|
|
421
|
+
{ author: 'greptile-apps[bot]', body: '**P2** Schema gap on the lock digest' },
|
|
422
|
+
{ author: 'dev', body: 'Intentional — validated upstream' },
|
|
423
|
+
],
|
|
424
|
+
},
|
|
425
|
+
];
|
|
426
|
+
const findings = extractPushbackFindings(threads);
|
|
427
|
+
expect(findings).toHaveLength(1);
|
|
428
|
+
expect(findings[0].tool).toBe('greptile');
|
|
429
|
+
expect(findings[0].severity).toBe('medium');
|
|
430
|
+
expect(findings[0].line).toBe(20);
|
|
431
|
+
});
|
|
346
432
|
});
|
|
347
433
|
// ─── decline taxonomy / disposition (mmnto-ai/totem#2124, doctrine bot-protocols.md §8.1) ───
|
|
348
434
|
describe('decline taxonomy (mmnto-ai/totem#2124)', () => {
|
|
@@ -409,5 +495,44 @@ describe('decline taxonomy (mmnto-ai/totem#2124)', () => {
|
|
|
409
495
|
expect(findings).toHaveLength(1);
|
|
410
496
|
expect(findings[0].disposition).toBeUndefined();
|
|
411
497
|
});
|
|
498
|
+
it('extractReviewBodyFindings: dispatches the greptile branch via the outside-diff marker (mmnto-ai/totem#2192)', () => {
|
|
499
|
+
// Sourced via gh api → author keeps the [bot] suffix the greptile regex needs.
|
|
500
|
+
// Marker-anchored (strategy#690), mirroring the real greptile summary shape.
|
|
501
|
+
const body = [
|
|
502
|
+
'<h3>Greptile Summary</h3>',
|
|
503
|
+
'',
|
|
504
|
+
'<!-- greptile_other_comments_section -->',
|
|
505
|
+
'',
|
|
506
|
+
'`src/scorer.ts`: exposure floor accepted but never checked.',
|
|
507
|
+
'',
|
|
508
|
+
'<sub>Reviews (1): Last reviewed commit … | Re-trigger Greptile</sub>',
|
|
509
|
+
].join('\n');
|
|
510
|
+
const findings = extractReviewBodyFindings([{ author: 'greptile-apps[bot]', body }]);
|
|
511
|
+
expect(findings).toHaveLength(1);
|
|
512
|
+
expect(findings[0].tool).toBe('greptile');
|
|
513
|
+
expect(findings[0].body).toContain('exposure floor');
|
|
514
|
+
expect(findings[0].file).toBe('(review body)');
|
|
515
|
+
});
|
|
516
|
+
it('extractReviewBodyFindings: ignores a greptile summary with no outside-diff block', () => {
|
|
517
|
+
const findings = extractReviewBodyFindings([
|
|
518
|
+
{ author: 'greptile-apps[bot]', body: '<h3>Greptile Summary</h3>\n\nConfidence Score: 5/5' },
|
|
519
|
+
]);
|
|
520
|
+
expect(findings).toEqual([]);
|
|
521
|
+
});
|
|
522
|
+
it('parseGreptileConfidence: extracts the N/5 score (mmnto-ai/totem#2192)', () => {
|
|
523
|
+
expect(parseGreptileConfidence('<h3>Confidence Score: 4/5</h3>\n\nMinor polish.')).toBe(4);
|
|
524
|
+
expect(parseGreptileConfidence('Confidence Score: 5 / 5')).toBe(5);
|
|
525
|
+
expect(parseGreptileConfidence('Confidence Score: 0/5')).toBe(0);
|
|
526
|
+
});
|
|
527
|
+
it('parseGreptileConfidence: returns undefined when no score is present', () => {
|
|
528
|
+
expect(parseGreptileConfidence('<h3>Greptile Summary</h3>\n\nSafe to merge.')).toBeUndefined();
|
|
529
|
+
// Not a percentage — must be N/5.
|
|
530
|
+
expect(parseGreptileConfidence('Confidence: 90%')).toBeUndefined();
|
|
531
|
+
});
|
|
532
|
+
it('parseGreptileConfidence: does not misread `5/50` as `5/5` (CR #2246)', () => {
|
|
533
|
+
// The `(?!\d)` denominator boundary prevents a false merge-readiness signal.
|
|
534
|
+
expect(parseGreptileConfidence('Confidence Score: 5/50')).toBeUndefined();
|
|
535
|
+
expect(parseGreptileConfidence('Confidence Score: 4/55')).toBeUndefined();
|
|
536
|
+
});
|
|
412
537
|
});
|
|
413
538
|
//# sourceMappingURL=bot-review-parser.test.js.map
|