@mmnto/cli 1.15.10 → 1.16.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 (31) hide show
  1. package/dist/commands/recurrence-stats.d.ts +19 -0
  2. package/dist/commands/recurrence-stats.d.ts.map +1 -0
  3. package/dist/commands/recurrence-stats.js +412 -0
  4. package/dist/commands/recurrence-stats.js.map +1 -0
  5. package/dist/commands/recurrence-stats.test.d.ts +2 -0
  6. package/dist/commands/recurrence-stats.test.d.ts.map +1 -0
  7. package/dist/commands/recurrence-stats.test.js +379 -0
  8. package/dist/commands/recurrence-stats.test.js.map +1 -0
  9. package/dist/commands/shield-estimate.d.ts +24 -0
  10. package/dist/commands/shield-estimate.d.ts.map +1 -0
  11. package/dist/commands/shield-estimate.js +55 -0
  12. package/dist/commands/shield-estimate.js.map +1 -0
  13. package/dist/commands/shield-estimate.test.d.ts +2 -0
  14. package/dist/commands/shield-estimate.test.d.ts.map +1 -0
  15. package/dist/commands/shield-estimate.test.js +309 -0
  16. package/dist/commands/shield-estimate.test.js.map +1 -0
  17. package/dist/commands/shield-templates.d.ts +9 -0
  18. package/dist/commands/shield-templates.d.ts.map +1 -1
  19. package/dist/commands/shield-templates.js +9 -0
  20. package/dist/commands/shield-templates.js.map +1 -1
  21. package/dist/commands/shield.d.ts +13 -0
  22. package/dist/commands/shield.d.ts.map +1 -1
  23. package/dist/commands/shield.js +33 -0
  24. package/dist/commands/shield.js.map +1 -1
  25. package/dist/commands/stats.d.ts +7 -1
  26. package/dist/commands/stats.d.ts.map +1 -1
  27. package/dist/commands/stats.js +10 -1
  28. package/dist/commands/stats.js.map +1 -1
  29. package/dist/index.js +39 -3
  30. package/dist/index.js.map +1 -1
  31. package/package.json +2 -2
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `totem stats --pattern-recurrence` — cross-PR recurrence clustering.
3
+ *
4
+ * Substrate of mmnto-ai/totem#1715. Fetches bot-review findings across
5
+ * the most recent N merged PRs (configurable via --history-depth, default
6
+ * 50, capped at 200), folds in trap-ledger override events as co-equal
7
+ * findings, clusters by normalized signature, filters out clusters
8
+ * already covered by an existing compiled rule, and writes the survivors
9
+ * at `.totem/recurrence-stats.json` plus a stdout summary.
10
+ *
11
+ * No LLM. No GitHub API writes. Stateless per invocation.
12
+ */
13
+ export interface RunRecurrenceStatsOptions {
14
+ threshold?: number;
15
+ historyDepth?: number;
16
+ yes?: boolean;
17
+ }
18
+ export declare function runRecurrenceStats(options?: RunRecurrenceStatsOptions): Promise<void>;
19
+ //# sourceMappingURL=recurrence-stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recurrence-stats.d.ts","sourceRoot":"","sources":["../../src/commands/recurrence-stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAqBH,MAAM,WAAW,yBAAyB;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAyCD,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,yBAA8B,GAAG,OAAO,CAAC,IAAI,CAAC,CAkX/F"}
@@ -0,0 +1,412 @@
1
+ /**
2
+ * `totem stats --pattern-recurrence` — cross-PR recurrence clustering.
3
+ *
4
+ * Substrate of mmnto-ai/totem#1715. Fetches bot-review findings across
5
+ * the most recent N merged PRs (configurable via --history-depth, default
6
+ * 50, capped at 200), folds in trap-ledger override events as co-equal
7
+ * findings, clusters by normalized signature, filters out clusters
8
+ * already covered by an existing compiled rule, and writes the survivors
9
+ * at `.totem/recurrence-stats.json` plus a stdout summary.
10
+ *
11
+ * No LLM. No GitHub API writes. Stateless per invocation.
12
+ */
13
+ // totem-context: type-only imports above are erased at compile time and don't
14
+ // violate the lazy-import command policy (mmnto-ai/totem#1729 CR R1). All
15
+ // runtime imports (node:fs, node:path, zod, @mmnto/totem, helpers, adapters)
16
+ // are dynamic — see runRecurrenceStats body.
17
+ // ─── Constants ───────────────────────────────────────
18
+ const TAG = 'Recurrence';
19
+ const DEFAULT_THRESHOLD = 5;
20
+ const DEFAULT_HISTORY_DEPTH = 50;
21
+ const MAX_HISTORY_DEPTH = 200;
22
+ const MAX_SAMPLE_BODIES = 3;
23
+ const MAX_PATHS = 10;
24
+ const COVERAGE_JACCARD_THRESHOLD = 0.6;
25
+ function toSeverityBucket(tool, severity) {
26
+ const s = severity.toLowerCase();
27
+ if (tool === 'override')
28
+ return 'medium';
29
+ if (tool === 'coderabbit') {
30
+ if (s === 'critical')
31
+ return 'critical';
32
+ if (s === 'major')
33
+ return 'high';
34
+ if (s === 'minor')
35
+ return 'medium';
36
+ return 'low';
37
+ }
38
+ if (tool === 'gca') {
39
+ if (s === 'high')
40
+ return 'high';
41
+ if (s === 'medium')
42
+ return 'medium';
43
+ if (s === 'low')
44
+ return 'low';
45
+ return 'low';
46
+ }
47
+ // unknown tool / synthesized review-body
48
+ if (s === 'critical')
49
+ return 'critical';
50
+ if (s === 'high' || s === 'major')
51
+ return 'high';
52
+ if (s === 'medium' || s === 'minor' || s === 'warning')
53
+ return 'medium';
54
+ if (s === 'low' || s === 'info')
55
+ return 'low';
56
+ return 'nit';
57
+ }
58
+ // ─── Main entrypoint ────────────────────────────────
59
+ export async function runRecurrenceStats(options = {}) {
60
+ // Dynamic imports per `packages/cli/src/commands/**` lazy-import policy
61
+ // (mmnto-ai/totem#1729 CR R1).
62
+ const fs = await import('node:fs');
63
+ const path = await import('node:path');
64
+ const { z } = await import('zod');
65
+ const { GitHubCliPrAdapter } = await import('../adapters/github-cli-pr.js');
66
+ const { handleGhError, ghFetchAndParse } = await import('../adapters/gh-utils.js');
67
+ const { log } = await import('../ui.js');
68
+ const { isBotComment, detectBot, parseCRSeverity, parseGCASeverity, stripHtmlWrappers, extractSuggestion, extractReviewBodyFindings, } = await import('../parsers/bot-review-parser.js');
69
+ const { computeSignature, jaccard, loadCompiledRules, normalizeFindingBody, readLedgerEvents, tokenizeForJaccard, } = await import('@mmnto/totem');
70
+ const { loadConfig, resolveConfigPath } = await import('../utils.js');
71
+ // Schema is local to the run path so the zod import stays lazy.
72
+ const GhMergedPrListItemSchema = z.object({
73
+ number: z.number(),
74
+ mergedAt: z.string().nullable().optional(),
75
+ });
76
+ const cwd = process.cwd();
77
+ // 1. Validate + clamp options
78
+ const threshold = clampThreshold(options.threshold);
79
+ let historyDepth = clampHistoryDepth(options.historyDepth);
80
+ if (options.historyDepth !== undefined && options.historyDepth > MAX_HISTORY_DEPTH) {
81
+ log.warn(TAG, `--history-depth ${options.historyDepth} exceeds cap of ${MAX_HISTORY_DEPTH}; using ${MAX_HISTORY_DEPTH} instead.`);
82
+ historyDepth = MAX_HISTORY_DEPTH;
83
+ }
84
+ log.info(TAG, `Scanning up to ${historyDepth} merged PR(s); threshold=${threshold}.`);
85
+ // 2. Fetch the most recent merged PRs via gh
86
+ let prList = [];
87
+ try {
88
+ prList = ghFetchAndParse([
89
+ 'pr',
90
+ 'list',
91
+ '--state',
92
+ 'merged',
93
+ '--limit',
94
+ String(historyDepth),
95
+ '--json',
96
+ 'number,mergedAt',
97
+ ], z.array(GhMergedPrListItemSchema), 'merged PR list', cwd);
98
+ }
99
+ catch (err) {
100
+ // ghFetchAndParse already wraps via handleGhError on its own throw path,
101
+ // but if anything slipped through wrap it here for the same hint surface.
102
+ handleGhError(err, 'merged PR list');
103
+ throw err;
104
+ }
105
+ log.info(TAG, `Found ${prList.length} merged PR(s).`);
106
+ // 3. Per-PR fetch + finding extraction
107
+ const adapter = new GitHubCliPrAdapter(cwd);
108
+ const annotated = [];
109
+ const prsScanned = [];
110
+ for (const pr of prList) {
111
+ const prNum = pr.number;
112
+ try {
113
+ const prData = adapter.fetchPr(prNum);
114
+ const reviewComments = adapter.fetchReviewComments(prNum);
115
+ // Group threads by root id
116
+ const threads = groupThreadsByRoot(reviewComments);
117
+ const botThreads = threads.filter((t) => t.comments.length > 0 && isBotComment(t.comments[0].author));
118
+ // Inline bot findings
119
+ const inlineFindings = [];
120
+ for (const thread of botThreads) {
121
+ const botComment = thread.comments[0];
122
+ if (!botComment)
123
+ continue;
124
+ const tool = detectBot(botComment.author);
125
+ const severity = tool === 'coderabbit'
126
+ ? parseCRSeverity(botComment.body)
127
+ : tool === 'gca'
128
+ ? parseGCASeverity(botComment.body)
129
+ : 'info';
130
+ const body = stripHtmlWrappers(botComment.body);
131
+ const suggestion = extractSuggestion(botComment.body);
132
+ const hunkMatch = thread.diffHunk.match(/@@ .+?\+(\d+)/);
133
+ const line = hunkMatch ? parseInt(hunkMatch[1], 10) : undefined;
134
+ inlineFindings.push({
135
+ tool,
136
+ severity,
137
+ file: thread.path,
138
+ line,
139
+ body,
140
+ suggestion,
141
+ resolutionSignal: 'none',
142
+ rootCommentId: botComment.id,
143
+ });
144
+ }
145
+ // Review-body findings (CR outside-diff + nits)
146
+ const reviewBodyFindings = extractReviewBodyFindings(prData.reviews);
147
+ const allFindings = [...inlineFindings, ...reviewBodyFindings];
148
+ // Use the PR's mergedAt as observation timestamp (best available).
149
+ const observedAt = pr.mergedAt ?? new Date().toISOString();
150
+ for (const f of allFindings) {
151
+ annotated.push({
152
+ finding: f,
153
+ prNumber: String(prNum),
154
+ observedAt,
155
+ });
156
+ }
157
+ prsScanned.push(String(prNum));
158
+ // totem-context: per-PR catch swallows transient errors by design — log + continue with partial data per the mmnto-ai/totem#1715 failure-mode table; the scan must not abort on rate-limit / adapter failures, and prsScanned < historyDepth surfaces partial coverage in the final report.
159
+ }
160
+ catch (err) {
161
+ const msg = err instanceof Error ? err.message : String(err);
162
+ log.warn(TAG, `PR #${prNum}: skipped (${msg})`);
163
+ continue;
164
+ }
165
+ }
166
+ log.info(TAG, `Scanned ${prsScanned.length}/${prList.length} PR(s); collected ${annotated.length} bot finding(s).`);
167
+ // 4. Trap-ledger overrides as co-equal findings (Q4)
168
+ const config = await loadConfig(resolveConfigPath(cwd));
169
+ const totemDir = path.join(cwd, config.totemDir);
170
+ const ledgerEvents = readLedgerEvents(totemDir, (msg) => log.warn(TAG, msg));
171
+ const overrideEvents = ledgerEvents.filter((e) => e.type === 'override');
172
+ for (const event of overrideEvents) {
173
+ const synthetic = {
174
+ tool: 'unknown',
175
+ severity: 'medium',
176
+ file: event.file,
177
+ line: event.line,
178
+ body: event.justification,
179
+ resolutionSignal: 'none',
180
+ };
181
+ annotated.push({
182
+ finding: synthetic,
183
+ prNumber: undefined,
184
+ observedAt: event.timestamp,
185
+ });
186
+ }
187
+ if (overrideEvents.length > 0) {
188
+ log.info(TAG, `Folded in ${overrideEvents.length} trap-ledger override event(s).`);
189
+ }
190
+ const clusters = new Map();
191
+ for (const a of annotated) {
192
+ const isOverride = a.prNumber === undefined;
193
+ const tool = isOverride ? 'override' : a.finding.tool;
194
+ const normalized = normalizeFindingBody(a.finding.body);
195
+ if (normalized.length === 0)
196
+ continue;
197
+ const signature = computeSignature(normalized);
198
+ const bucket = toSeverityBucket(tool, a.finding.severity);
199
+ let cluster = clusters.get(signature);
200
+ if (!cluster) {
201
+ cluster = {
202
+ signature,
203
+ tools: new Set(),
204
+ severityBuckets: [],
205
+ occurrences: 0,
206
+ prs: new Set(),
207
+ sampleBodies: [],
208
+ firstSeen: a.observedAt,
209
+ lastSeen: a.observedAt,
210
+ paths: new Set(),
211
+ normalizedBody: normalized,
212
+ };
213
+ clusters.set(signature, cluster);
214
+ }
215
+ cluster.tools.add(tool);
216
+ cluster.severityBuckets.push(bucket);
217
+ cluster.occurrences += 1;
218
+ if (a.prNumber !== undefined)
219
+ cluster.prs.add(a.prNumber);
220
+ if (cluster.sampleBodies.length < MAX_SAMPLE_BODIES) {
221
+ cluster.sampleBodies.push(a.finding.body);
222
+ }
223
+ if (a.observedAt < cluster.firstSeen)
224
+ cluster.firstSeen = a.observedAt;
225
+ if (a.observedAt > cluster.lastSeen)
226
+ cluster.lastSeen = a.observedAt;
227
+ if (a.finding.file && a.finding.file !== '(review body)') {
228
+ if (cluster.paths.size < MAX_PATHS)
229
+ cluster.paths.add(a.finding.file);
230
+ }
231
+ }
232
+ // 6. Coverage filter against compiled rules
233
+ const rulesPath = path.join(totemDir, 'compiled-rules.json');
234
+ let compiledRules = [];
235
+ try {
236
+ compiledRules = loadCompiledRules(rulesPath);
237
+ // totem-context: missing/malformed compiled-rules.json disables coverage routing only — every cluster lands in headline `patterns` with `coveredByRule: false` per the mmnto-ai/totem#1715 failure-mode table. The scan must not abort on a missing manifest.
238
+ }
239
+ catch (err) {
240
+ const msg = err instanceof Error ? err.message : String(err);
241
+ log.warn(TAG, `Could not load compiled rules: ${msg} — coverage check disabled.`);
242
+ compiledRules = [];
243
+ }
244
+ // Pre-tokenize rule messages once.
245
+ const ruleTokenSets = compiledRules.map((r) => tokenizeForJaccard(r.message ?? ''));
246
+ // 7. Materialize patterns
247
+ const allPatterns = [];
248
+ for (const cluster of clusters.values()) {
249
+ const tools = [...cluster.tools];
250
+ const tool = tools.length > 1 ? 'mixed' : (tools[0] ?? 'unknown');
251
+ const severityBucket = pickDominantSeverity(cluster.severityBuckets);
252
+ // Coverage heuristic: max Jaccard across all rule messages ≥ 0.6
253
+ const findingTokens = tokenizeForJaccard(cluster.normalizedBody);
254
+ let maxJaccard = 0;
255
+ for (const ruleTokens of ruleTokenSets) {
256
+ const v = jaccard(findingTokens, ruleTokens);
257
+ if (v > maxJaccard)
258
+ maxJaccard = v;
259
+ }
260
+ const coveredByRule = maxJaccard >= COVERAGE_JACCARD_THRESHOLD;
261
+ const prs = [...cluster.prs].sort((a, b) => Number(a) - Number(b));
262
+ const paths = [...cluster.paths].sort((a, b) => a.localeCompare(b));
263
+ allPatterns.push({
264
+ signature: cluster.signature,
265
+ tool,
266
+ severityBucket,
267
+ occurrences: cluster.occurrences,
268
+ prs,
269
+ sampleBodies: cluster.sampleBodies,
270
+ firstSeen: cluster.firstSeen,
271
+ lastSeen: cluster.lastSeen,
272
+ paths,
273
+ coveredByRule,
274
+ });
275
+ }
276
+ // 8. Split into headline + covered, apply threshold to headline only
277
+ const headlinePatterns = allPatterns
278
+ .filter((p) => !p.coveredByRule)
279
+ .filter((p) => p.occurrences >= threshold)
280
+ .sort((a, b) => b.occurrences - a.occurrences);
281
+ const coveredPatterns = allPatterns
282
+ .filter((p) => p.coveredByRule)
283
+ .sort((a, b) => b.occurrences - a.occurrences);
284
+ // 9. Output preparation
285
+ const outputPath = path.join(totemDir, 'recurrence-stats.json');
286
+ const lastUpdated = new Date().toISOString();
287
+ const stats = {
288
+ version: 1,
289
+ lastUpdated,
290
+ thresholdApplied: threshold,
291
+ historyDepth,
292
+ prsScanned,
293
+ patterns: headlinePatterns,
294
+ coveredPatterns,
295
+ };
296
+ // 10. Overwrite confirmation if file exists with newer lastUpdated
297
+ if (fs.existsSync(outputPath)) {
298
+ let existingNewer = false;
299
+ try {
300
+ const raw = fs.readFileSync(outputPath, 'utf-8');
301
+ const parsed = JSON.parse(raw);
302
+ if (typeof parsed.lastUpdated === 'string') {
303
+ existingNewer = parsed.lastUpdated > lastUpdated;
304
+ }
305
+ // totem-context: best-effort read — an unparseable existing file is treated as "not newer" so the overwrite path proceeds rather than erroring. Atomic temp+rename below protects user data; log.warn surfaces parse failures for diagnostics.
306
+ }
307
+ catch (err) {
308
+ const msg = err instanceof Error ? err.message : String(err);
309
+ log.warn(TAG, `Could not read existing recurrence-stats.json: ${msg}`);
310
+ }
311
+ if (existingNewer) {
312
+ const proceed = await confirmOverwrite(outputPath, options.yes ?? false, log);
313
+ if (!proceed) {
314
+ log.warn(TAG, 'Overwrite declined; not writing recurrence-stats.json.');
315
+ return;
316
+ }
317
+ }
318
+ }
319
+ // 11. Atomic write — unique temp filename (PID + epoch ms + random) so
320
+ // concurrent invocations don't race on the same .tmp path
321
+ // (mmnto-ai/totem#1729 CR R1 + R2). PID alone is identical across
322
+ // in-process awaits and Date.now() can collide on the same ms; the
323
+ // random suffix closes both gaps deterministically.
324
+ fs.mkdirSync(totemDir, { recursive: true });
325
+ const crypto = await import('node:crypto');
326
+ const tmp = `${outputPath}.${process.pid}.${Date.now()}.${crypto.randomUUID()}.tmp`;
327
+ try {
328
+ fs.writeFileSync(tmp, JSON.stringify(stats, null, 2) + '\n', 'utf-8');
329
+ fs.renameSync(tmp, outputPath);
330
+ }
331
+ finally {
332
+ // Defensive cleanup if rename failed mid-flight.
333
+ if (fs.existsSync(tmp))
334
+ fs.rmSync(tmp, { force: true });
335
+ }
336
+ // 12. Stdout summary (via log → stderr; mirrors statsCommand voice)
337
+ log.info(TAG, `Wrote ${outputPath}`);
338
+ log.info(TAG, `Patterns at-or-above threshold ${threshold}: ${headlinePatterns.length} (covered: ${coveredPatterns.length}, scanned PRs: ${prsScanned.length}/${historyDepth}).`);
339
+ if (headlinePatterns.length > 0) {
340
+ log.info(TAG, 'Top recurrences:');
341
+ for (const p of headlinePatterns.slice(0, 5)) {
342
+ const snippet = (p.sampleBodies[0] ?? '').replace(/\s+/g, ' ').slice(0, 80);
343
+ log.dim(TAG, ` [${p.signature}] ${p.occurrences}x across ${p.prs.length} PR(s): ${snippet}`);
344
+ }
345
+ }
346
+ else {
347
+ log.dim(TAG, ' (none — all clusters below threshold or covered by existing rules)');
348
+ }
349
+ }
350
+ function groupThreadsByRoot(comments) {
351
+ const byId = new Map();
352
+ for (const c of comments)
353
+ byId.set(c.id, c);
354
+ const threadMap = new Map();
355
+ for (const c of comments) {
356
+ const rootId = c.inReplyToId ?? c.id;
357
+ const thread = threadMap.get(rootId) ?? [];
358
+ thread.push(c);
359
+ threadMap.set(rootId, thread);
360
+ }
361
+ const threads = [];
362
+ for (const [rootId, threadComments] of threadMap) {
363
+ threadComments.sort((a, b) => {
364
+ if (!a.createdAt || !b.createdAt)
365
+ return 0;
366
+ return a.createdAt.localeCompare(b.createdAt);
367
+ });
368
+ const root = byId.get(rootId) ?? threadComments[0];
369
+ threads.push({
370
+ path: root.path,
371
+ diffHunk: root.diffHunk,
372
+ comments: threadComments.map((c) => ({ id: c.id, author: c.author, body: c.body })),
373
+ });
374
+ }
375
+ return threads;
376
+ }
377
+ function clampThreshold(input) {
378
+ if (input === undefined || !Number.isFinite(input) || input < 1)
379
+ return DEFAULT_THRESHOLD;
380
+ return Math.floor(input);
381
+ }
382
+ function clampHistoryDepth(input) {
383
+ if (input === undefined || !Number.isFinite(input) || input < 1)
384
+ return DEFAULT_HISTORY_DEPTH;
385
+ return Math.min(MAX_HISTORY_DEPTH, Math.floor(input));
386
+ }
387
+ /** Pick the highest-severity bucket present in the cluster. */
388
+ function pickDominantSeverity(buckets) {
389
+ const order = ['critical', 'high', 'medium', 'low', 'nit'];
390
+ for (const candidate of order) {
391
+ if (buckets.includes(candidate))
392
+ return candidate;
393
+ }
394
+ return 'nit';
395
+ }
396
+ async function confirmOverwrite(outputPath, yesFlag, log) {
397
+ if (yesFlag)
398
+ return true;
399
+ if (!process.stdin.isTTY) {
400
+ log.warn(TAG, `Existing ${outputPath} is newer; pass --yes to overwrite in non-interactive mode.`);
401
+ return false;
402
+ }
403
+ const { confirm, isCancel } = await import('@clack/prompts');
404
+ const ans = await confirm({
405
+ message: `Existing ${outputPath} is newer. Overwrite?`,
406
+ initialValue: false,
407
+ });
408
+ if (isCancel(ans))
409
+ return false;
410
+ return ans === true;
411
+ }
412
+ //# sourceMappingURL=recurrence-stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recurrence-stats.js","sourceRoot":"","sources":["../../src/commands/recurrence-stats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=recurrence-stats.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recurrence-stats.test.d.ts","sourceRoot":"","sources":["../../src/commands/recurrence-stats.test.ts"],"names":[],"mappings":""}