@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.
Files changed (73) hide show
  1. package/dist/adapters/github-cli-pr.d.ts +8 -0
  2. package/dist/adapters/github-cli-pr.d.ts.map +1 -1
  3. package/dist/adapters/github-cli-pr.js +34 -1
  4. package/dist/adapters/github-cli-pr.js.map +1 -1
  5. package/dist/adapters/pr-adapter.d.ts +8 -0
  6. package/dist/adapters/pr-adapter.d.ts.map +1 -1
  7. package/dist/commands/extract.d.ts +1 -0
  8. package/dist/commands/extract.d.ts.map +1 -1
  9. package/dist/commands/extract.js +1 -1
  10. package/dist/commands/extract.js.map +1 -1
  11. package/dist/commands/ledger-analyzer.d.ts.map +1 -1
  12. package/dist/commands/ledger-analyzer.js +2 -0
  13. package/dist/commands/ledger-analyzer.js.map +1 -1
  14. package/dist/commands/review-learn.d.ts.map +1 -1
  15. package/dist/commands/review-learn.js +38 -1
  16. package/dist/commands/review-learn.js.map +1 -1
  17. package/dist/commands/shield.d.ts +1 -0
  18. package/dist/commands/shield.d.ts.map +1 -1
  19. package/dist/commands/shield.js +59 -5
  20. package/dist/commands/shield.js.map +1 -1
  21. package/dist/commands/triage-pr.d.ts +4 -1
  22. package/dist/commands/triage-pr.d.ts.map +1 -1
  23. package/dist/commands/triage-pr.js +262 -3
  24. package/dist/commands/triage-pr.js.map +1 -1
  25. package/dist/exemptions/__tests__/exemption-engine.test.d.ts +2 -0
  26. package/dist/exemptions/__tests__/exemption-engine.test.d.ts.map +1 -0
  27. package/dist/exemptions/__tests__/exemption-engine.test.js +317 -0
  28. package/dist/exemptions/__tests__/exemption-engine.test.js.map +1 -0
  29. package/dist/exemptions/exemption-engine.d.ts +27 -0
  30. package/dist/exemptions/exemption-engine.d.ts.map +1 -0
  31. package/dist/exemptions/exemption-engine.js +193 -0
  32. package/dist/exemptions/exemption-engine.js.map +1 -0
  33. package/dist/exemptions/exemption-schema.d.ts +127 -0
  34. package/dist/exemptions/exemption-schema.d.ts.map +1 -0
  35. package/dist/exemptions/exemption-schema.js +32 -0
  36. package/dist/exemptions/exemption-schema.js.map +1 -0
  37. package/dist/exemptions/exemption-store.d.ts +22 -0
  38. package/dist/exemptions/exemption-store.d.ts.map +1 -0
  39. package/dist/exemptions/exemption-store.js +80 -0
  40. package/dist/exemptions/exemption-store.js.map +1 -0
  41. package/dist/index.js +4 -2
  42. package/dist/index.js.map +1 -1
  43. package/dist/parsers/bot-review-parser.d.ts +8 -0
  44. package/dist/parsers/bot-review-parser.d.ts.map +1 -1
  45. package/dist/parsers/bot-review-parser.js +48 -11
  46. package/dist/parsers/bot-review-parser.js.map +1 -1
  47. package/dist/parsers/bot-review-parser.test.js +108 -1
  48. package/dist/parsers/bot-review-parser.test.js.map +1 -1
  49. package/dist/services/__tests__/deferred-issuer.test.d.ts +2 -0
  50. package/dist/services/__tests__/deferred-issuer.test.d.ts.map +1 -0
  51. package/dist/services/__tests__/deferred-issuer.test.js +115 -0
  52. package/dist/services/__tests__/deferred-issuer.test.js.map +1 -0
  53. package/dist/services/__tests__/fix-dispatcher.test.d.ts +2 -0
  54. package/dist/services/__tests__/fix-dispatcher.test.d.ts.map +1 -0
  55. package/dist/services/__tests__/fix-dispatcher.test.js +129 -0
  56. package/dist/services/__tests__/fix-dispatcher.test.js.map +1 -0
  57. package/dist/services/deferred-issuer.d.ts +17 -0
  58. package/dist/services/deferred-issuer.d.ts.map +1 -0
  59. package/dist/services/deferred-issuer.js +64 -0
  60. package/dist/services/deferred-issuer.js.map +1 -0
  61. package/dist/services/fix-dispatcher.d.ts +19 -0
  62. package/dist/services/fix-dispatcher.d.ts.map +1 -0
  63. package/dist/services/fix-dispatcher.js +100 -0
  64. package/dist/services/fix-dispatcher.js.map +1 -0
  65. package/dist/utils/__tests__/milestone-inference.test.d.ts +2 -0
  66. package/dist/utils/__tests__/milestone-inference.test.d.ts.map +1 -0
  67. package/dist/utils/__tests__/milestone-inference.test.js +35 -0
  68. package/dist/utils/__tests__/milestone-inference.test.js.map +1 -0
  69. package/dist/utils/milestone-inference.d.ts +6 -0
  70. package/dist/utils/milestone-inference.d.ts.map +1 -0
  71. package/dist/utils/milestone-inference.js +15 -0
  72. package/dist/utils/milestone-inference.js.map +1 -0
  73. package/package.json +2 -2
@@ -0,0 +1,100 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { safeExec } from '@mmnto/totem';
4
+ const FIX_SYSTEM_PROMPT = `You are a code fix agent. Given a file and a review finding, produce the COMPLETE fixed file content.
5
+
6
+ Rules:
7
+ - Output ONLY the fixed file content inside a single code block
8
+ - Do NOT add explanations before or after the code block
9
+ - Make the MINIMAL change needed to address the finding
10
+ - Do NOT refactor surrounding code or add features
11
+ - Preserve all existing formatting, comments, and structure`;
12
+ /**
13
+ * Apply a fix for a single finding: read file, LLM patch, write, commit, return SHA.
14
+ * Sequential — no concurrency concerns.
15
+ */
16
+ export async function dispatchFix(opts) {
17
+ const { filePath, line, findingBody, findingTool, cwd, onLog } = opts;
18
+ // 1. Validate and read the target file
19
+ const absPath = path.resolve(cwd, filePath);
20
+ if (!absPath.startsWith(path.resolve(cwd))) {
21
+ return { applied: false, reason: `Path traversal blocked: ${filePath}` };
22
+ }
23
+ let originalContent;
24
+ try {
25
+ originalContent = fs.readFileSync(absPath, 'utf-8');
26
+ }
27
+ catch (err) {
28
+ const msg = err instanceof Error ? err.message : String(err);
29
+ return { applied: false, reason: `Cannot read ${filePath}: ${msg}` };
30
+ }
31
+ // 2. Build prompt
32
+ const lineContext = line != null ? `The finding is at line ${line}.` : '';
33
+ const prompt = [
34
+ FIX_SYSTEM_PROMPT,
35
+ '',
36
+ `=== FILE: ${filePath} ===`,
37
+ '```',
38
+ originalContent,
39
+ '```',
40
+ '',
41
+ `=== FINDING (${findingTool}) ===`,
42
+ lineContext,
43
+ findingBody,
44
+ '',
45
+ `Output the complete fixed file content in a single code block.`,
46
+ ].join('\n');
47
+ // 3. Call LLM
48
+ onLog?.(`Generating fix for ${filePath}...`);
49
+ let response;
50
+ try {
51
+ response = await opts.runOrchestrator(prompt);
52
+ }
53
+ catch (err) {
54
+ const msg = err instanceof Error ? err.message : String(err);
55
+ return { applied: false, reason: `LLM call failed: ${msg}` };
56
+ }
57
+ if (!response) {
58
+ return { applied: false, reason: 'No response from LLM' };
59
+ }
60
+ // 4. Extract code block from response
61
+ const codeMatch = response.match(/```(?:\w+)?\s*\n([\s\S]*?)```/);
62
+ if (!codeMatch?.[1]) {
63
+ return { applied: false, reason: 'Could not extract code block from LLM response' };
64
+ }
65
+ const fixedContent = codeMatch[1];
66
+ // 5. Check if content actually changed
67
+ if (fixedContent.trim() === originalContent.trim()) {
68
+ onLog?.(`No changes needed for ${filePath}`);
69
+ return { applied: false, reason: 'LLM returned unchanged content' };
70
+ }
71
+ // 6. Write fixed file
72
+ fs.writeFileSync(absPath, fixedContent, 'utf-8');
73
+ // 7. Commit (rollback file on failure)
74
+ const summaryLine = findingBody
75
+ .split('\n')
76
+ .find((l) => l.trim())
77
+ ?.replace(/^[#*>\-\s]+/, '')
78
+ .slice(0, 60) ?? 'bot review fix';
79
+ const commitMsg = `fix: ${summaryLine}\n\nFinding: ${findingTool} on ${filePath}${line != null ? `:${line}` : ''}`;
80
+ try {
81
+ safeExec('git', ['add', filePath], { cwd });
82
+ safeExec('git', ['commit', '-m', commitMsg], { cwd });
83
+ const sha = safeExec('git', ['rev-parse', '--short', 'HEAD'], { cwd }).trim();
84
+ onLog?.(`Committed fix: ${sha}`);
85
+ return { applied: true, commitSha: sha };
86
+ }
87
+ catch (err) {
88
+ // Rollback: restore original content and unstage
89
+ try {
90
+ fs.writeFileSync(absPath, originalContent, 'utf-8');
91
+ safeExec('git', ['reset', 'HEAD', '--', filePath], { cwd });
92
+ }
93
+ catch {
94
+ // Best-effort rollback
95
+ }
96
+ const msg = err instanceof Error ? err.message : String(err);
97
+ return { applied: false, reason: `Git commit failed (rolled back): ${msg}` };
98
+ }
99
+ }
100
+ //# sourceMappingURL=fix-dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-dispatcher.js","sourceRoot":"","sources":["../../src/services/fix-dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=milestone-inference.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"milestone-inference.test.d.ts","sourceRoot":"","sources":["../../../src/utils/__tests__/milestone-inference.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { inferNextMilestone } from '../milestone-inference.js';
3
+ describe('inferNextMilestone', () => {
4
+ it('bumps minor version: 1.6.0 → 1.7.0', () => {
5
+ expect(inferNextMilestone('1.6.0')).toBe('1.7.0');
6
+ });
7
+ it('preserves v prefix: v1.6.0 → v1.7.0', () => {
8
+ expect(inferNextMilestone('v1.6.0')).toBe('v1.7.0');
9
+ });
10
+ it('strips title suffix: 1.6.0 — Pipeline Maturity → 1.7.0', () => {
11
+ expect(inferNextMilestone('1.6.0 — Pipeline Maturity')).toBe('1.7.0');
12
+ });
13
+ it('bumps major milestone: v2.0.0 → v2.1.0', () => {
14
+ expect(inferNextMilestone('v2.0.0')).toBe('v2.1.0');
15
+ });
16
+ it('bumps from 0.0.1 → 0.1.0', () => {
17
+ expect(inferNextMilestone('0.0.1')).toBe('0.1.0');
18
+ });
19
+ it('returns undefined for non-semver string: Sprint 4', () => {
20
+ expect(inferNextMilestone('Sprint 4')).toBeUndefined();
21
+ });
22
+ it('returns undefined for non-semver string: MVP', () => {
23
+ expect(inferNextMilestone('MVP')).toBeUndefined();
24
+ });
25
+ it('returns undefined for undefined input', () => {
26
+ expect(inferNextMilestone(undefined)).toBeUndefined();
27
+ });
28
+ it('returns undefined for null input', () => {
29
+ expect(inferNextMilestone(null)).toBeUndefined();
30
+ });
31
+ it('returns undefined for empty string', () => {
32
+ expect(inferNextMilestone('')).toBeUndefined();
33
+ });
34
+ });
35
+ //# sourceMappingURL=milestone-inference.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"milestone-inference.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/milestone-inference.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,kBAAkB,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Infer the next milestone from the current one by bumping the minor version.
3
+ * Returns undefined for non-semver strings.
4
+ */
5
+ export declare function inferNextMilestone(current: string | undefined | null): string | undefined;
6
+ //# sourceMappingURL=milestone-inference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"milestone-inference.d.ts","sourceRoot":"","sources":["../../src/utils/milestone-inference.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAOzF"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Infer the next milestone from the current one by bumping the minor version.
3
+ * Returns undefined for non-semver strings.
4
+ */
5
+ export function inferNextMilestone(current) {
6
+ if (!current)
7
+ return undefined;
8
+ // Match milestone titles like "1.6.0", "v1.6.0", "1.6.0 — Pipeline Maturity"
9
+ const match = current.match(/^(v?)(\d+)\.(\d+)\.(\d+)/);
10
+ if (!match)
11
+ return undefined;
12
+ const [, prefix, major, minor, _patch] = match;
13
+ return `${prefix}${major}.${Number(minor) + 1}.0`;
14
+ }
15
+ //# sourceMappingURL=milestone-inference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"milestone-inference.js","sourceRoot":"","sources":["../../src/utils/milestone-inference.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAkC;IACnE,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,6EAA6E;IAC7E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;IAC/C,OAAO,GAAG,MAAM,GAAG,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmnto/cli",
3
- "version": "1.5.10",
3
+ "version": "1.6.0",
4
4
  "description": "CLI for Totem — AI persistent memory and context layer",
5
5
  "type": "module",
6
6
  "bin": {
@@ -23,7 +23,7 @@
23
23
  "smol-toml": "^1.6.1",
24
24
  "yaml": "^2.4.0",
25
25
  "zod": "^3.24.0",
26
- "@mmnto/totem": "1.5.10"
26
+ "@mmnto/totem": "1.6.0"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@anthropic-ai/sdk": "^0.78.0",