@mmnto/cli 1.100.0 → 1.101.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/commands/doctor-parity.d.ts.map +1 -1
  2. package/dist/commands/doctor-parity.js +11 -5
  3. package/dist/commands/doctor-parity.js.map +1 -1
  4. package/dist/commands/doctor.d.ts +19 -0
  5. package/dist/commands/doctor.d.ts.map +1 -1
  6. package/dist/commands/doctor.js +132 -0
  7. package/dist/commands/doctor.js.map +1 -1
  8. package/dist/commands/doctor.test.js +1 -0
  9. package/dist/commands/doctor.test.js.map +1 -1
  10. package/dist/commands/gate-install.d.ts.map +1 -1
  11. package/dist/commands/gate-install.js +12 -3
  12. package/dist/commands/gate-install.js.map +1 -1
  13. package/dist/commands/gate-install.test.js +13 -1
  14. package/dist/commands/gate-install.test.js.map +1 -1
  15. package/dist/commands/init-templates.d.ts +57 -5
  16. package/dist/commands/init-templates.d.ts.map +1 -1
  17. package/dist/commands/init-templates.js +222 -1
  18. package/dist/commands/init-templates.js.map +1 -1
  19. package/dist/commands/init.d.ts +38 -4
  20. package/dist/commands/init.d.ts.map +1 -1
  21. package/dist/commands/init.js +196 -13
  22. package/dist/commands/init.js.map +1 -1
  23. package/dist/commands/init.test.js +13 -0
  24. package/dist/commands/init.test.js.map +1 -1
  25. package/dist/commands/install-hooks-exit-contract.test.d.ts +2 -0
  26. package/dist/commands/install-hooks-exit-contract.test.d.ts.map +1 -0
  27. package/dist/commands/install-hooks-exit-contract.test.js +508 -0
  28. package/dist/commands/install-hooks-exit-contract.test.js.map +1 -0
  29. package/dist/commands/install-hooks.d.ts +53 -0
  30. package/dist/commands/install-hooks.d.ts.map +1 -1
  31. package/dist/commands/install-hooks.js +277 -42
  32. package/dist/commands/install-hooks.js.map +1 -1
  33. package/dist/commands/mail.d.ts.map +1 -1
  34. package/dist/commands/mail.js +56 -16
  35. package/dist/commands/mail.js.map +1 -1
  36. package/dist/commands/mail.test.js +73 -0
  37. package/dist/commands/mail.test.js.map +1 -1
  38. package/dist/commands/prepare-wrapper.test.d.ts +2 -0
  39. package/dist/commands/prepare-wrapper.test.d.ts.map +1 -0
  40. package/dist/commands/prepare-wrapper.test.js +284 -0
  41. package/dist/commands/prepare-wrapper.test.js.map +1 -0
  42. package/dist/parse-nits.d.ts +20 -3
  43. package/dist/parse-nits.d.ts.map +1 -1
  44. package/dist/parse-nits.js +111 -6
  45. package/dist/parse-nits.js.map +1 -1
  46. package/dist/parse-nits.test.js +141 -0
  47. package/dist/parse-nits.test.js.map +1 -1
  48. package/dist/parsers/bot-review-parser.d.ts.map +1 -1
  49. package/dist/parsers/bot-review-parser.js +12 -2
  50. package/dist/parsers/bot-review-parser.js.map +1 -1
  51. package/package.json +2 -2
@@ -0,0 +1,284 @@
1
+ /**
2
+ * Init-distributed prepare wrapper (mmnto-ai/totem#2410 PR-B).
3
+ *
4
+ * Three surfaces:
5
+ * - PREPARE_WRAPPER behavior: write the template to a temp dir + execute it with
6
+ * `process.execPath` against a hermetic fake `@mmnto/cli` (mkdtemp + cleanup;
7
+ * nothing global mocked). Exit-code contract: MODULE_NOT_FOUND → 0 + skip line;
8
+ * child exit propagated verbatim; a corrupt/missing bin → 1.
9
+ * - wirePreparePackageJson: absent → set; canonical → unchanged; different →
10
+ * untouched (byte-identical); missing / unparseable manifests.
11
+ * - checkPrepareWrapper (doctor row): present+wired → pass; absent / miswired /
12
+ * drifted → warn with the right remedy; owner-repo / user-owned → skip.
13
+ *
14
+ * The wrapper spawns are short-lived synchronous `node` invocations with cwd pinned
15
+ * to the hermetic temp dir (so resolution never leaks to the real repo's node_modules);
16
+ * every temp dir is torn down in afterEach.
17
+ */
18
+ import { spawnSync } from 'node:child_process';
19
+ import * as fs from 'node:fs';
20
+ import * as os from 'node:os';
21
+ import * as path from 'node:path';
22
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
23
+ import { cleanTmpDir } from '../test-utils.js';
24
+ import { checkPrepareWrapper } from './doctor.js';
25
+ import { wirePreparePackageJson } from './init.js';
26
+ import { PREPARE_SCRIPT_COMMAND, PREPARE_WRAPPER, TOTEM_FILE_END, TOTEM_FILE_MARKER, } from './init-templates.js';
27
+ // ─── PREPARE_WRAPPER: exit-code behavior ─────────────────────────────
28
+ describe('PREPARE_WRAPPER — exit-code contract', () => {
29
+ let tmpDir;
30
+ let wrapperPath;
31
+ const cliDir = () => path.join(tmpDir, 'node_modules', '@mmnto', 'cli');
32
+ /** Plant a fake `@mmnto/cli` with the given bin filename + body (undefined body = no bin file). */
33
+ function plantFakeCli(binFile, binBody) {
34
+ fs.mkdirSync(cliDir(), { recursive: true });
35
+ fs.writeFileSync(path.join(cliDir(), 'package.json'), JSON.stringify({ name: '@mmnto/cli', version: '0.0.0', bin: { totem: `./${binFile}` } }));
36
+ if (binBody !== undefined) {
37
+ fs.writeFileSync(path.join(cliDir(), binFile), binBody);
38
+ }
39
+ }
40
+ /** Run the wrapper with cwd pinned to the hermetic temp dir. */
41
+ function runWrapper() {
42
+ const r = spawnSync(process.execPath, [wrapperPath], { cwd: tmpDir, encoding: 'utf8' });
43
+ return { status: r.status, stderr: r.stderr ?? '' };
44
+ }
45
+ beforeEach(() => {
46
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-2410b-wrap-'));
47
+ wrapperPath = path.join(tmpDir, 'prepare.cjs');
48
+ fs.writeFileSync(wrapperPath, PREPARE_WRAPPER, 'utf-8');
49
+ });
50
+ afterEach(() => {
51
+ cleanTmpDir(tmpDir);
52
+ });
53
+ it('(a) @mmnto/cli not resolvable → exit 0 + a declared-skip stderr line', () => {
54
+ const { status, stderr } = runWrapper();
55
+ expect(status).toBe(0);
56
+ expect(stderr).toContain('@mmnto/cli is not installed');
57
+ expect(stderr).toContain('skipping hook install');
58
+ });
59
+ it('(b) fake @mmnto/cli whose bin exits 0 → wrapper exits 0', () => {
60
+ plantFakeCli('cli-bin.js', 'process.exit(0);\n');
61
+ expect(runWrapper().status).toBe(0);
62
+ });
63
+ it('(c) fake bin exits 3 → wrapper propagates 3 (a genuine hook-install failure fails prepare loud)', () => {
64
+ plantFakeCli('cli-bin.js', 'process.exit(3);\n');
65
+ expect(runWrapper().status).toBe(3);
66
+ });
67
+ it('(d) resolution ok but the bin file is missing (corrupt install) → exit 1', () => {
68
+ // package.json resolves + declares a bin, but the bin JS does not exist → the
69
+ // spawned `node <missing>` exits 1, which the wrapper propagates verbatim.
70
+ plantFakeCli('missing-bin.js', undefined);
71
+ expect(runWrapper().status).toBe(1);
72
+ });
73
+ it('never spawns through a shell (spawnSync argv form; no shell:true) — the marker opens the file', () => {
74
+ // Structural guard: the emitted wrapper drives node via an argv array, not a
75
+ // shell string (the Windows quoting class, mmnto-ai/totem#2351).
76
+ expect(PREPARE_WRAPPER.trimStart().startsWith(TOTEM_FILE_MARKER)).toBe(true);
77
+ expect(PREPARE_WRAPPER).toContain("spawnSync(process.execPath, [binJs, 'hook', 'install']");
78
+ expect(PREPARE_WRAPPER).not.toContain('shell: true');
79
+ expect(PREPARE_WRAPPER).not.toContain('execSync');
80
+ });
81
+ });
82
+ // ─── wirePreparePackageJson: wiring matrix ───────────────────────────
83
+ describe('wirePreparePackageJson — wiring matrix', () => {
84
+ let tmpDir;
85
+ const pkgPath = () => path.join(tmpDir, 'package.json');
86
+ beforeEach(() => {
87
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-2410b-wire-'));
88
+ });
89
+ afterEach(() => {
90
+ cleanTmpDir(tmpDir);
91
+ });
92
+ it('no prepare script → sets it (wired)', () => {
93
+ fs.writeFileSync(pkgPath(), JSON.stringify({ name: 'consumer', scripts: { build: 'tsc' } }, null, 2) + '\n');
94
+ const r = wirePreparePackageJson(pkgPath());
95
+ expect(r.action).toBe('wired');
96
+ const parsed = JSON.parse(fs.readFileSync(pkgPath(), 'utf-8'));
97
+ expect(parsed.scripts.prepare).toBe(PREPARE_SCRIPT_COMMAND);
98
+ // Existing key order preserved; prepare appended after build.
99
+ expect(Object.keys(parsed.scripts)).toEqual(['build', 'prepare']);
100
+ // Trailing newline preserved.
101
+ expect(fs.readFileSync(pkgPath(), 'utf-8').endsWith('}\n')).toBe(true);
102
+ });
103
+ it('no scripts block at all → creates scripts with prepare (wired)', () => {
104
+ fs.writeFileSync(pkgPath(), JSON.stringify({ name: 'consumer' }, null, 2) + '\n');
105
+ const r = wirePreparePackageJson(pkgPath());
106
+ expect(r.action).toBe('wired');
107
+ expect(JSON.parse(fs.readFileSync(pkgPath(), 'utf-8')).scripts.prepare).toBe(PREPARE_SCRIPT_COMMAND);
108
+ });
109
+ it('prepare already exactly canonical → unchanged (exists), byte-identical', () => {
110
+ const raw = JSON.stringify({ name: 'consumer', scripts: { prepare: PREPARE_SCRIPT_COMMAND } }, null, 2) +
111
+ '\n';
112
+ fs.writeFileSync(pkgPath(), raw);
113
+ const r = wirePreparePackageJson(pkgPath());
114
+ expect(r.action).toBe('exists');
115
+ expect(fs.readFileSync(pkgPath(), 'utf-8')).toBe(raw);
116
+ });
117
+ it('a DIFFERENT existing prepare → declined + byte-identical (no overwrite of user content)', () => {
118
+ const raw = JSON.stringify({ name: 'consumer', scripts: { prepare: 'husky install' } }, null, 2) + '\n';
119
+ fs.writeFileSync(pkgPath(), raw);
120
+ const r = wirePreparePackageJson(pkgPath());
121
+ expect(r.action).toBe('declined');
122
+ expect(r.existing).toBe('husky install');
123
+ // The whole file is preserved verbatim.
124
+ expect(fs.readFileSync(pkgPath(), 'utf-8')).toBe(raw);
125
+ });
126
+ it('a non-string prepare value → declined + byte-identical (never clobber weird user content)', () => {
127
+ const raw = JSON.stringify({ name: 'consumer', scripts: { prepare: { weird: true } } }, null, 2) + '\n';
128
+ fs.writeFileSync(pkgPath(), raw);
129
+ const r = wirePreparePackageJson(pkgPath());
130
+ expect(r.action).toBe('declined');
131
+ expect(fs.readFileSync(pkgPath(), 'utf-8')).toBe(raw);
132
+ });
133
+ it('no package.json → missing (nothing to wire)', () => {
134
+ expect(wirePreparePackageJson(pkgPath()).action).toBe('missing');
135
+ });
136
+ it('invalid JSON → unparseable (surfaced, never a crash), byte-identical', () => {
137
+ const raw = '{ not valid json ]';
138
+ fs.writeFileSync(pkgPath(), raw);
139
+ const r = wirePreparePackageJson(pkgPath());
140
+ expect(r.action).toBe('unparseable');
141
+ expect(r.err).toBeDefined();
142
+ expect(fs.readFileSync(pkgPath(), 'utf-8')).toBe(raw);
143
+ });
144
+ // F1 (mmnto-ai/totem#2416): a non-object JSON root must not crash at `.scripts` or be
145
+ // written into — validate the shape and decline as unparseable.
146
+ it.each([
147
+ ['null root', 'null'],
148
+ ['scalar root', '5'],
149
+ ['string root', '"hi"'],
150
+ ['array root', '[]'],
151
+ ])('%s → unparseable + byte-identical (never dereferenced or written)', (_label, raw) => {
152
+ fs.writeFileSync(pkgPath(), raw);
153
+ const r = wirePreparePackageJson(pkgPath());
154
+ expect(r.action).toBe('unparseable');
155
+ expect(r.err).toBeDefined();
156
+ expect(fs.readFileSync(pkgPath(), 'utf-8')).toBe(raw);
157
+ });
158
+ it('a present-but-non-object `scripts` → unparseable + byte-identical (never clobbered)', () => {
159
+ // The pre-fix bug: a non-object `scripts` fell through to the wire branch and was
160
+ // silently REPLACED by `{ prepare: ... }`. It must be declined as unparseable.
161
+ const raw = JSON.stringify({ name: 'consumer', scripts: 'oops-a-string' }, null, 2) + '\n';
162
+ fs.writeFileSync(pkgPath(), raw);
163
+ const r = wirePreparePackageJson(pkgPath());
164
+ expect(r.action).toBe('unparseable');
165
+ expect(fs.readFileSync(pkgPath(), 'utf-8')).toBe(raw);
166
+ });
167
+ // F5 (mmnto-ai/totem#2416): a write that throws is a DISTINCT discriminant from a
168
+ // read/parse/shape problem.
169
+ it('a write failure → write-failed (distinct from unparseable)', () => {
170
+ const raw = JSON.stringify({ name: 'consumer' }, null, 2) + '\n';
171
+ fs.writeFileSync(pkgPath(), raw);
172
+ fs.chmodSync(pkgPath(), 0o444); // read-only → read+parse succeed, writeFileSync throws (EPERM/EACCES)
173
+ try {
174
+ const r = wirePreparePackageJson(pkgPath());
175
+ expect(r.action).toBe('write-failed');
176
+ expect(r.err).toBeDefined();
177
+ }
178
+ finally {
179
+ // Restore write perms so cleanup can remove the temp dir.
180
+ fs.chmodSync(pkgPath(), 0o644);
181
+ }
182
+ });
183
+ });
184
+ // ─── checkPrepareWrapper: doctor sensor row ──────────────────────────
185
+ describe('checkPrepareWrapper — doctor parity row (sensor, never gates)', () => {
186
+ let tmpDir;
187
+ const wrapperPath = () => path.join(tmpDir, '.totem', 'prepare.cjs');
188
+ const pkgPath = () => path.join(tmpDir, 'package.json');
189
+ function writeWrapper(content) {
190
+ fs.mkdirSync(path.dirname(wrapperPath()), { recursive: true });
191
+ fs.writeFileSync(wrapperPath(), content, 'utf-8');
192
+ }
193
+ function writePkg(pkg) {
194
+ fs.writeFileSync(pkgPath(), JSON.stringify(pkg, null, 2) + '\n');
195
+ }
196
+ beforeEach(() => {
197
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-2410b-doc-'));
198
+ });
199
+ afterEach(() => {
200
+ cleanTmpDir(tmpDir);
201
+ });
202
+ it('present + canonical + wired → pass', async () => {
203
+ writeWrapper(PREPARE_WRAPPER);
204
+ writePkg({ name: 'consumer', scripts: { prepare: PREPARE_SCRIPT_COMMAND } });
205
+ const r = await checkPrepareWrapper(tmpDir);
206
+ expect(r.status).toBe('pass');
207
+ });
208
+ it('wrapper absent + no prepare → warn, remedy names totem init', async () => {
209
+ writePkg({ name: 'consumer', scripts: { build: 'tsc' } });
210
+ const r = await checkPrepareWrapper(tmpDir);
211
+ expect(r.status).toBe('warn');
212
+ expect(r.remediation).toBe('totem init');
213
+ });
214
+ it('wrapper present + canonical but prepare NOT wired → warn (miswired), remedy totem init', async () => {
215
+ writeWrapper(PREPARE_WRAPPER);
216
+ writePkg({ name: 'consumer', scripts: {} });
217
+ const r = await checkPrepareWrapper(tmpDir);
218
+ expect(r.status).toBe('warn');
219
+ expect(r.remediation).toBe('totem init');
220
+ expect(r.message).toContain('not wired');
221
+ });
222
+ it('wrapper present + marker-headed + BOUNDED but drifted → warn, remedy is bare totem hook install', async () => {
223
+ writeWrapper(`${TOTEM_FILE_MARKER} — drifted\nconsole.log("stale");\n${TOTEM_FILE_END}\n`);
224
+ writePkg({ name: 'consumer', scripts: { prepare: PREPARE_SCRIPT_COMMAND } });
225
+ const r = await checkPrepareWrapper(tmpDir);
226
+ expect(r.status).toBe('warn');
227
+ expect(r.remediation).toBe('totem hook install');
228
+ expect(r.message).toContain('drifted');
229
+ });
230
+ // F3 (mmnto-ai/totem#2416): a marker-headed but UNBOUNDED drifted wrapper (no end
231
+ // marker) is not bare-repairable — the remedy must name --force.
232
+ it('wrapper present + marker-headed but UNBOUNDED drifted → warn, remedy is totem hook install --force', async () => {
233
+ writeWrapper(`${TOTEM_FILE_MARKER} — drifted, no end marker\nconsole.log("stale");\n`);
234
+ writePkg({ name: 'consumer', scripts: { prepare: PREPARE_SCRIPT_COMMAND } });
235
+ const r = await checkPrepareWrapper(tmpDir);
236
+ expect(r.status).toBe('warn');
237
+ expect(r.remediation).toBe('totem hook install --force');
238
+ expect(r.message).toContain('drifted');
239
+ });
240
+ // F2 (mmnto-ai/totem#2416): a wrapper that EXISTS but cannot be read must warn with the
241
+ // read-failure detail, not fall through to the user-owned skip. A directory-at-path makes
242
+ // existsSync true while readFileSync throws EISDIR (cross-platform).
243
+ it('wrapper present but unreadable (EISDIR) → warn naming the read failure, not a user-owned skip', async () => {
244
+ fs.mkdirSync(path.join(tmpDir, '.totem', 'prepare.cjs'), { recursive: true });
245
+ writePkg({ name: 'consumer', scripts: { prepare: PREPARE_SCRIPT_COMMAND } });
246
+ const r = await checkPrepareWrapper(tmpDir);
247
+ expect(r.status).toBe('warn');
248
+ expect(r.message).toContain('could not read');
249
+ expect(r.message).not.toContain('user-owned');
250
+ });
251
+ // F4 (mmnto-ai/totem#2416): canonical wrapper present but a DIFFERENT prepare exists —
252
+ // `totem init` deliberately declines that, so the remedy must be the manual line.
253
+ it('wrapper present + canonical but a DIFFERENT prepare → warn, remedy is the manual line (not totem init)', async () => {
254
+ writeWrapper(PREPARE_WRAPPER);
255
+ writePkg({ name: 'consumer', scripts: { prepare: 'husky install' } });
256
+ const r = await checkPrepareWrapper(tmpDir);
257
+ expect(r.status).toBe('warn');
258
+ expect(r.remediation).toContain('add or chain');
259
+ expect(r.remediation).not.toBe('totem init');
260
+ });
261
+ it('owner-repo exception: wrapper absent + a DIFFERENT user-managed prepare → skip (no nudge)', async () => {
262
+ writePkg({ name: 'owner', scripts: { prepare: 'node tools/install-hooks.js' } });
263
+ const r = await checkPrepareWrapper(tmpDir);
264
+ expect(r.status).toBe('skip');
265
+ });
266
+ it('user-owned .totem/prepare.cjs (no Totem marker) → skip (left as-is)', async () => {
267
+ writeWrapper('// my own prepare helper\nconsole.log("mine");\n');
268
+ writePkg({ name: 'consumer', scripts: { prepare: 'node .totem/prepare.cjs' } });
269
+ const r = await checkPrepareWrapper(tmpDir);
270
+ expect(r.status).toBe('skip');
271
+ });
272
+ it('no package.json → skip (nothing to wire)', async () => {
273
+ const r = await checkPrepareWrapper(tmpDir);
274
+ expect(r.status).toBe('skip');
275
+ });
276
+ it('wired canonical but wrapper file missing → warn, remedy totem init', async () => {
277
+ writePkg({ name: 'consumer', scripts: { prepare: PREPARE_SCRIPT_COMMAND } });
278
+ const r = await checkPrepareWrapper(tmpDir);
279
+ expect(r.status).toBe('warn');
280
+ expect(r.remediation).toBe('totem init');
281
+ expect(r.message).toContain('missing');
282
+ });
283
+ });
284
+ //# sourceMappingURL=prepare-wrapper.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare-wrapper.test.js","sourceRoot":"","sources":["../../src/commands/prepare-wrapper.test.ts"],"names":[],"mappings":"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"}
@@ -40,12 +40,29 @@ export declare function parseGreptileReviewFindings(body: string): Array<{
40
40
  type: 'outside-diff';
41
41
  content: string;
42
42
  }>;
43
+ /** One entry from a CR review-body section, with the per-file attribution the
44
+ * nested `<summary>path/to/file.ts (N)</summary>` block carries when present. */
45
+ export interface CrSectionEntry {
46
+ content: string;
47
+ file?: string;
48
+ }
49
+ /**
50
+ * Extract ACTIONABLE entries from CodeRabbit's "Additional comments"
51
+ * review-body section (mmnto-ai/totem#2414 specimen 2: an actionable body-only
52
+ * finding that never becomes an inline thread — #2413's lazy-import finding).
53
+ * The section is mostly verification notes, so an entry qualifies only when it
54
+ * carries the finding template's severity tag; bare LGTMs never surface.
55
+ */
56
+ export declare function parseCodeRabbitAdditionalComments(body: string): CrSectionEntry[];
43
57
  /**
44
- * Combined parser that extracts both nitpick and outside-diff findings
45
- * from a CodeRabbit review body, returning typed results.
58
+ * Combined parser that extracts nitpick, outside-diff, and actionable
59
+ * body-only ("Additional comments") findings from a CodeRabbit review body,
60
+ * returning typed results with per-file attribution where the section nests it
61
+ * (mmnto-ai/totem#2414).
46
62
  */
47
63
  export declare function parseCodeRabbitReviewFindings(body: string): Array<{
48
- type: 'nitpick' | 'outside-diff';
64
+ type: 'nitpick' | 'outside-diff' | 'body-only';
49
65
  content: string;
66
+ file?: string;
50
67
  }>;
51
68
  //# sourceMappingURL=parse-nits.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse-nits.d.ts","sourceRoot":"","sources":["../src/parse-nits.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoDH;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA4B1D;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAyBjE;AA6BD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAqB/D;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,GACX,KAAK,CAAC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAElD;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,GACX,KAAK,CAAC;IAAE,IAAI,EAAE,SAAS,GAAG,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAY9D"}
1
+ {"version":3,"file":"parse-nits.d.ts","sourceRoot":"","sources":["../src/parse-nits.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkEH;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA4B1D;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAyBjE;AA6BD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAqB/D;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,GACX,KAAK,CAAC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAElD;AAID;iFACiF;AACjF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA6ED;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CAIhF;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,GACX,KAAK,CAAC;IAAE,IAAI,EAAE,SAAS,GAAG,cAAc,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB3F"}
@@ -47,6 +47,19 @@ function stripWrapperTags(html) {
47
47
  .replace(/<\/?blockquote>/gi, '')
48
48
  .trim();
49
49
  }
50
+ /**
51
+ * CodeRabbit renders the whole "Review details" region as a markdown
52
+ * BLOCKQUOTE — every line carries a `> ` prefix, so `<details>` and its
53
+ * `<summary>` are separated by `\n> ` and the `\s*`-joined section regexes
54
+ * below never match. That is the mmnto-ai/totem#2414 live-miss shape (two
55
+ * same-day specimens): the sections were present, the parser saw none of
56
+ * them. Strip leading blockquote markers per line (nested `> > ` included)
57
+ * before any section parsing; non-blockquoted legacy bodies pass through
58
+ * unchanged.
59
+ */
60
+ function stripBlockquotePrefixes(body) {
61
+ return body.replace(/^(?:>[ \t]?)+/gm, '');
62
+ }
50
63
  /**
51
64
  * Extract nit content from CodeRabbit review bodies.
52
65
  * Finds all `<details>` blocks whose `<summary>` contains "Nitpick", "nitpick", or the broom emoji.
@@ -56,7 +69,7 @@ export function parseCodeRabbitNits(body) {
56
69
  if (!body)
57
70
  return [];
58
71
  // Strip fenced code blocks to avoid extracting fake nits from examples
59
- const stripped = body.replace(/```[\s\S]*?```/g, '');
72
+ const stripped = stripBlockquotePrefixes(body).replace(/```[\s\S]*?```/g, '');
60
73
  const nits = [];
61
74
  const nitpickRe = /<details>\s*<summary>[^<]*(?:nitpick|🧹)[^<]*<\/summary>/gi;
62
75
  let match;
@@ -90,7 +103,7 @@ export function parseCodeRabbitOutsideDiff(body) {
90
103
  if (!body)
91
104
  return [];
92
105
  // Strip fenced code blocks to avoid extracting fake matches from examples
93
- const stripped = body.replace(/```[\s\S]*?```/g, '');
106
+ const stripped = stripBlockquotePrefixes(body).replace(/```[\s\S]*?```/g, '');
94
107
  const results = [];
95
108
  const outsideDiffRe = /<details>\s*<summary>[^<]*(?:outside\s+the\s+diff|outside\s+diff\s+range)[^<]*<\/summary>/gi;
96
109
  let match;
@@ -184,17 +197,109 @@ export function parseGreptileOutsideDiff(body) {
184
197
  export function parseGreptileReviewFindings(body) {
185
198
  return parseGreptileOutsideDiff(body).map((content) => ({ type: 'outside-diff', content }));
186
199
  }
200
+ /** Split a stripped block into individual entries on CR's `---` dividers. */
201
+ function splitEntries(block) {
202
+ const cleaned = stripWrapperTags(block);
203
+ if (!cleaned)
204
+ return [];
205
+ return cleaned
206
+ .split(/\r?\n---\r?\n/)
207
+ .map((p) => p.trim())
208
+ .filter(Boolean);
209
+ }
210
+ /**
211
+ * Split a section's inner content into per-file entry lists. CR nests one
212
+ * `<details><summary>path/to/file.ts (N)</summary>` block per file inside the
213
+ * section; the path in that summary is the ONLY file attribution a body
214
+ * finding carries (stripWrapperTags used to delete it, leaving dispositions to
215
+ * hand-attribute line ranges — the #2422 round-2 exhibit). A summary must look
216
+ * path-like (`/` or `.`) to count as a file block; when the section carries no
217
+ * file blocks at all, the whole content is split flat (legacy shape).
218
+ */
219
+ function splitFileBlocks(sectionInner) {
220
+ const fileBlockRe = /<details>\s*<summary>([^<]+?)\s*\((\d+)\)<\/summary>/gi;
221
+ const entries = [];
222
+ let m;
223
+ let sawFileBlock = false;
224
+ while ((m = fileBlockRe.exec(sectionInner)) !== null) {
225
+ const file = m[1].trim();
226
+ if (!/[/.]/.test(file))
227
+ continue;
228
+ const inner = extractNestedBlock(sectionInner, m.index + m[0].length);
229
+ if (inner === null)
230
+ continue;
231
+ sawFileBlock = true;
232
+ for (const content of splitEntries(inner))
233
+ entries.push({ content, file });
234
+ // Resume the scan PAST the extracted block, not inside its content — a
235
+ // path-like <details> nested within a finding's body must never be
236
+ // re-matched as an independent sibling file block (greptile #2427 round).
237
+ fileBlockRe.lastIndex = m.index + m[0].length + inner.length;
238
+ }
239
+ if (!sawFileBlock) {
240
+ for (const content of splitEntries(sectionInner))
241
+ entries.push({ content });
242
+ }
243
+ return entries;
244
+ }
245
+ /**
246
+ * Extract file-attributed entries from every CR section whose `<summary>`
247
+ * matches `summaryPattern`. Blockquote-normalized and fence-stripped like the
248
+ * flat parsers above.
249
+ */
250
+ function extractCrSectionEntries(body, summaryPattern) {
251
+ if (!body)
252
+ return [];
253
+ const stripped = stripBlockquotePrefixes(body).replace(/```[\s\S]*?```/g, '');
254
+ const sectionRe = new RegExp(`<details>\\s*<summary>[^<]*(?:${summaryPattern.source})[^<]*</summary>`, 'gi');
255
+ const entries = [];
256
+ let match;
257
+ while ((match = sectionRe.exec(stripped)) !== null) {
258
+ const inner = extractNestedBlock(stripped, match.index + match[0].length);
259
+ if (inner === null)
260
+ continue;
261
+ entries.push(...splitFileBlocks(inner));
262
+ }
263
+ return entries;
264
+ }
187
265
  /**
188
- * Combined parser that extracts both nitpick and outside-diff findings
189
- * from a CodeRabbit review body, returning typed results.
266
+ * CR's finding template carries an italic severity tag (`_🟠 Major_`-style).
267
+ * Its presence is what separates an actionable body-only finding from the
268
+ * verification notes / LGTM lines that fill the rest of the section. Anchored
269
+ * to the concrete template shape — severity emoji + the severity word as the
270
+ * WHOLE italic span — so italic prose that merely contains the word
271
+ * (`_major version verified_`, `✅ Fixed the _minor_ nit`) never qualifies
272
+ * (#2427 review round, CR + greptile convergent).
273
+ */
274
+ const CR_SEVERITY_TAG_RE = /_(?:🔴|🟠|🟡)\s*(?:critical|major|minor)_/iu;
275
+ /**
276
+ * Extract ACTIONABLE entries from CodeRabbit's "Additional comments"
277
+ * review-body section (mmnto-ai/totem#2414 specimen 2: an actionable body-only
278
+ * finding that never becomes an inline thread — #2413's lazy-import finding).
279
+ * The section is mostly verification notes, so an entry qualifies only when it
280
+ * carries the finding template's severity tag; bare LGTMs never surface.
281
+ */
282
+ export function parseCodeRabbitAdditionalComments(body) {
283
+ return extractCrSectionEntries(body, /additional\s+comments/).filter((e) => CR_SEVERITY_TAG_RE.test(e.content));
284
+ }
285
+ /**
286
+ * Combined parser that extracts nitpick, outside-diff, and actionable
287
+ * body-only ("Additional comments") findings from a CodeRabbit review body,
288
+ * returning typed results with per-file attribution where the section nests it
289
+ * (mmnto-ai/totem#2414).
190
290
  */
191
291
  export function parseCodeRabbitReviewFindings(body) {
192
292
  const findings = [];
193
293
  for (const content of parseCodeRabbitNits(body)) {
194
294
  findings.push({ type: 'nitpick', content });
195
295
  }
196
- for (const content of parseCodeRabbitOutsideDiff(body)) {
197
- findings.push({ type: 'outside-diff', content });
296
+ // File-attributed extraction (not the flat legacy string[] surface) so a
297
+ // disposition can cite `file (outside-diff)` instead of `(review body)`.
298
+ for (const entry of extractCrSectionEntries(body, /outside\s+the\s+diff|outside\s+diff\s+range/)) {
299
+ findings.push({ type: 'outside-diff', content: entry.content, file: entry.file });
300
+ }
301
+ for (const entry of parseCodeRabbitAdditionalComments(body)) {
302
+ findings.push({ type: 'body-only', content: entry.content, file: entry.file });
198
303
  }
199
304
  return findings;
200
305
  }
@@ -1 +1 @@
1
- {"version":3,"file":"parse-nits.js","sourceRoot":"","sources":["../src/parse-nits.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parse-nits.js","sourceRoot":"","sources":["../src/parse-nits.ts"],"names":[],"mappings":"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"}