@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,309 @@
1
+ import * as fs from 'node:fs';
2
+ import * as os from 'node:os';
3
+ import * as path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
6
+ import { cleanTmpDir } from '../test-utils.js';
7
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
+ // ─── Mocks ──────────────────────────────────────────────
9
+ //
10
+ // `shield-estimate.ts` lazy-imports `../git.js`, `./run-compiled-rules.js`,
11
+ // and `../ui.js` per the dynamic-imports-in-CLI policy (CR R1 on
12
+ // `mmnto-ai/totem#1729`). vi.mock is hoisted, so these stubs are in place
13
+ // before runEstimate's dynamic imports resolve.
14
+ vi.mock('../git.js', async () => {
15
+ const actual = await vi.importActual('../git.js');
16
+ return {
17
+ ...actual,
18
+ getDiffForReview: vi.fn(),
19
+ };
20
+ });
21
+ vi.mock('./run-compiled-rules.js', () => ({
22
+ runCompiledRules: vi.fn(),
23
+ }));
24
+ vi.mock('../ui.js', () => ({
25
+ log: {
26
+ info: vi.fn(),
27
+ success: vi.fn(),
28
+ warn: vi.fn(),
29
+ error: vi.fn(),
30
+ dim: vi.fn(),
31
+ },
32
+ }));
33
+ // Stub config loading so the second describe block (which exercises
34
+ // shieldCommand directly) can run without scaffolding a real
35
+ // totem.config.ts on disk. Same shape as `lint.test.ts`.
36
+ vi.mock('../utils.js', async () => {
37
+ const actual = await vi.importActual('../utils.js');
38
+ return {
39
+ ...actual,
40
+ resolveConfigPath: (cwd) => path.join(cwd, 'totem.config.ts'),
41
+ loadConfig: async () => ({
42
+ targets: [],
43
+ totemDir: '.totem',
44
+ ignorePatterns: [],
45
+ }),
46
+ loadEnv: () => { },
47
+ };
48
+ });
49
+ const gitModule = await import('../git.js');
50
+ const rcrModule = await import('./run-compiled-rules.js');
51
+ const uiModule = await import('../ui.js');
52
+ const mockGetDiffForReview = vi.mocked(gitModule.getDiffForReview);
53
+ const mockRunCompiledRules = vi.mocked(rcrModule.runCompiledRules);
54
+ const mockLog = vi.mocked(uiModule.log);
55
+ // ─── Helpers ────────────────────────────────────────────
56
+ function makeConfig() {
57
+ // Minimal TotemConfig surface that runEstimate touches: totemDir +
58
+ // ignorePatterns. The real schema has more fields but they are not
59
+ // read on the estimate path.
60
+ return {
61
+ totemDir: '.totem',
62
+ ignorePatterns: ['package-lock.json', '*.snap'],
63
+ };
64
+ }
65
+ const SAMPLE_DIFF = 'diff --git a/foo.ts b/foo.ts\n--- a/foo.ts\n+++ b/foo.ts\n@@ -1 +1,2 @@\n existing\n+new line\n';
66
+ function diffResult(overrides = {}) {
67
+ return {
68
+ diff: SAMPLE_DIFF,
69
+ changedFiles: ['foo.ts'],
70
+ source: 'uncommitted',
71
+ ...overrides,
72
+ };
73
+ }
74
+ function runCompiledRulesPassResult() {
75
+ return {
76
+ violations: [],
77
+ rules: [],
78
+ output: 'PASS',
79
+ findings: [],
80
+ regexTimeouts: [],
81
+ };
82
+ }
83
+ // ─── Tests ──────────────────────────────────────────────
84
+ describe('runEstimate', () => {
85
+ let tmpDir;
86
+ let originalCwd;
87
+ beforeEach(() => {
88
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-estimate-'));
89
+ originalCwd = process.cwd();
90
+ mockGetDiffForReview.mockReset();
91
+ mockRunCompiledRules.mockReset();
92
+ for (const fn of Object.values(mockLog)) {
93
+ fn.mockReset();
94
+ }
95
+ });
96
+ afterEach(() => {
97
+ process.chdir(originalCwd);
98
+ cleanTmpDir(tmpDir);
99
+ });
100
+ // ─── Empty-diff branch ────────────────────────────
101
+ it('returns clean and skips runCompiledRules when getDiffForReview returns null', async () => {
102
+ mockGetDiffForReview.mockResolvedValue(null);
103
+ const { runEstimate } = await import('./shield-estimate.js');
104
+ await expect(runEstimate({ estimate: true }, makeConfig(), tmpDir, tmpDir)).resolves.toBeUndefined();
105
+ expect(mockRunCompiledRules).not.toHaveBeenCalled();
106
+ // Empty-diff branch logs the "No changes detected" line under the
107
+ // Estimate tag — never under Review.
108
+ const noChangesCall = mockLog.info.mock.calls.find((c) => String(c[1]).includes('No changes detected. Nothing to estimate.'));
109
+ expect(noChangesCall).toBeDefined();
110
+ expect(noChangesCall[0]).toBe('Estimate');
111
+ });
112
+ // ─── Tag invariant ────────────────────────────────
113
+ it('passes the Estimate tag (never Review) to getDiffForReview and runCompiledRules', async () => {
114
+ mockGetDiffForReview.mockResolvedValue(diffResult());
115
+ mockRunCompiledRules.mockResolvedValue(runCompiledRulesPassResult());
116
+ const { runEstimate } = await import('./shield-estimate.js');
117
+ await runEstimate({ estimate: true }, makeConfig(), tmpDir, tmpDir);
118
+ // getDiffForReview's 4th arg is the tag.
119
+ expect(mockGetDiffForReview).toHaveBeenCalledTimes(1);
120
+ expect(mockGetDiffForReview.mock.calls[0][3]).toBe('Estimate');
121
+ // runCompiledRules.tag must be Estimate.
122
+ expect(mockRunCompiledRules).toHaveBeenCalledTimes(1);
123
+ const rcrArgs = mockRunCompiledRules.mock.calls[0][0];
124
+ expect(rcrArgs.tag).toBe('Estimate');
125
+ // No log line on the estimate path may use the Review tag.
126
+ for (const call of mockLog.info.mock.calls) {
127
+ expect(call[0]).not.toBe('Review');
128
+ }
129
+ });
130
+ it('emits a [Estimate] preamble before delegating to getDiffForReview', async () => {
131
+ mockGetDiffForReview.mockResolvedValue(diffResult());
132
+ mockRunCompiledRules.mockResolvedValue(runCompiledRulesPassResult());
133
+ const { runEstimate } = await import('./shield-estimate.js');
134
+ await runEstimate({ estimate: true }, makeConfig(), tmpDir, tmpDir);
135
+ const preambleCall = mockLog.info.mock.calls.find((c) => String(c[1]).includes('Pre-flight prediction'));
136
+ expect(preambleCall).toBeDefined();
137
+ expect(preambleCall[0]).toBe('Estimate');
138
+ });
139
+ // ─── Diff pass-through ────────────────────────────
140
+ it('forwards the diff returned by getDiffForReview unchanged to runCompiledRules', async () => {
141
+ mockGetDiffForReview.mockResolvedValue(diffResult());
142
+ mockRunCompiledRules.mockResolvedValue(runCompiledRulesPassResult());
143
+ const { runEstimate } = await import('./shield-estimate.js');
144
+ await runEstimate({ estimate: true }, makeConfig(), tmpDir, tmpDir);
145
+ const rcrArgs = mockRunCompiledRules.mock.calls[0][0];
146
+ expect(rcrArgs.diff).toBe(SAMPLE_DIFF);
147
+ });
148
+ it('forwards ignorePatterns from config into runCompiledRules', async () => {
149
+ mockGetDiffForReview.mockResolvedValue(diffResult());
150
+ mockRunCompiledRules.mockResolvedValue(runCompiledRulesPassResult());
151
+ const { runEstimate } = await import('./shield-estimate.js');
152
+ await runEstimate({ estimate: true }, makeConfig(), tmpDir, tmpDir);
153
+ const rcrArgs = mockRunCompiledRules.mock.calls[0][0];
154
+ expect(rcrArgs.ignorePatterns).toEqual(['package-lock.json', '*.snap']);
155
+ });
156
+ it('forwards configRoot, totemDir, and isStaged into runCompiledRules', async () => {
157
+ mockGetDiffForReview.mockResolvedValue(diffResult({ source: 'staged' }));
158
+ mockRunCompiledRules.mockResolvedValue(runCompiledRulesPassResult());
159
+ const configRoot = path.join(tmpDir, 'sub-root');
160
+ const { runEstimate } = await import('./shield-estimate.js');
161
+ await runEstimate({ estimate: true, staged: true }, makeConfig(), tmpDir, configRoot);
162
+ const rcrArgs = mockRunCompiledRules.mock.calls[0][0];
163
+ expect(rcrArgs.configRoot).toBe(configRoot);
164
+ expect(rcrArgs.totemDir).toBe('.totem');
165
+ expect(rcrArgs.isStaged).toBe(true);
166
+ });
167
+ // mmnto-ai/totem#1732 CR R2 — `--diff` outranks `--staged` in
168
+ // `getDiffForReview`. `isStaged` must follow the resolved
169
+ // `DiffForReviewSource`, not the raw CLI flag, so the staged-index
170
+ // read strategy only kicks in for genuinely staged runs.
171
+ it('derives isStaged from diffResult.source, not options.staged, when both --diff and --staged are passed', async () => {
172
+ mockGetDiffForReview.mockResolvedValue(diffResult({ source: 'explicit-range' }));
173
+ mockRunCompiledRules.mockResolvedValue(runCompiledRulesPassResult());
174
+ const { runEstimate } = await import('./shield-estimate.js');
175
+ await runEstimate({ estimate: true, staged: true, diff: 'main...HEAD' }, makeConfig(), tmpDir, tmpDir);
176
+ const rcrArgs = mockRunCompiledRules.mock.calls[0][0];
177
+ expect(rcrArgs.isStaged).toBe(false);
178
+ });
179
+ it.each([
180
+ ['uncommitted', false],
181
+ ['branch-vs-base', false],
182
+ ['explicit-range', false],
183
+ ['staged', true],
184
+ ])('isStaged is true iff resolved source is "staged" (source=%s → isStaged=%s)', async (source, expected) => {
185
+ mockGetDiffForReview.mockResolvedValue(diffResult({ source }));
186
+ mockRunCompiledRules.mockResolvedValue(runCompiledRulesPassResult());
187
+ const { runEstimate } = await import('./shield-estimate.js');
188
+ await runEstimate({ estimate: true }, makeConfig(), tmpDir, tmpDir);
189
+ const rcrArgs = mockRunCompiledRules.mock.calls[0][0];
190
+ expect(rcrArgs.isStaged).toBe(expected);
191
+ });
192
+ it('forwards options.out as outPath into runCompiledRules', async () => {
193
+ mockGetDiffForReview.mockResolvedValue(diffResult());
194
+ mockRunCompiledRules.mockResolvedValue(runCompiledRulesPassResult());
195
+ const { runEstimate } = await import('./shield-estimate.js');
196
+ await runEstimate({ estimate: true, out: 'estimate.txt' }, makeConfig(), tmpDir, tmpDir);
197
+ const rcrArgs = mockRunCompiledRules.mock.calls[0][0];
198
+ expect(rcrArgs.outPath).toBe('estimate.txt');
199
+ // Format is always 'text' on the estimate path — SARIF/JSON are
200
+ // lint's territory and `runReview` already rejects --format.
201
+ expect(rcrArgs.format).toBe('text');
202
+ });
203
+ // ─── Diff-source resolution branches ──────────────
204
+ it.each([
205
+ ['explicit-range', { estimate: true, diff: 'HEAD^..HEAD' }],
206
+ ['staged', { estimate: true, staged: true }],
207
+ ['uncommitted', { estimate: true }],
208
+ ['branch-vs-base', { estimate: true }],
209
+ ])('honors getDiffForReview source resolution for %s', async (source, options) => {
210
+ mockGetDiffForReview.mockResolvedValue(diffResult({ source }));
211
+ mockRunCompiledRules.mockResolvedValue(runCompiledRulesPassResult());
212
+ const { runEstimate } = await import('./shield-estimate.js');
213
+ await runEstimate(options, makeConfig(), tmpDir, tmpDir);
214
+ // Whatever source getDiffForReview chose, the diff is the one
215
+ // passed to runCompiledRules.
216
+ expect(mockRunCompiledRules.mock.calls[0][0].diff).toBe(SAMPLE_DIFF);
217
+ // And the options object is forwarded to getDiffForReview so it
218
+ // can do its own implicit-source label logging.
219
+ expect(mockGetDiffForReview).toHaveBeenCalledWith(options, expect.any(Object), tmpDir, 'Estimate');
220
+ });
221
+ // ─── Exit code parity with lint ───────────────────
222
+ it('lets SHIELD_FAILED from runCompiledRules propagate (matches lint exit semantics)', async () => {
223
+ mockGetDiffForReview.mockResolvedValue(diffResult());
224
+ const { TotemError } = await import('@mmnto/totem');
225
+ mockRunCompiledRules.mockRejectedValue(new TotemError('SHIELD_FAILED', 'Violations detected', 'Fix the violations above.'));
226
+ const { runEstimate } = await import('./shield-estimate.js');
227
+ await expect(runEstimate({ estimate: true }, makeConfig(), tmpDir, tmpDir)).rejects.toMatchObject({ code: 'SHIELD_FAILED' });
228
+ });
229
+ it('completes without throwing on a clean pass (zero violations)', async () => {
230
+ mockGetDiffForReview.mockResolvedValue(diffResult());
231
+ mockRunCompiledRules.mockResolvedValue(runCompiledRulesPassResult());
232
+ const { runEstimate } = await import('./shield-estimate.js');
233
+ await expect(runEstimate({ estimate: true }, makeConfig(), tmpDir, tmpDir)).resolves.toBeUndefined();
234
+ });
235
+ // ─── No-LLM invariant ─────────────────────────────
236
+ it('never imports the orchestrator or embedding modules from shield-estimate.ts', async () => {
237
+ // Static-source check: a regex-grep over the on-disk shield-estimate
238
+ // source asserts no LLM-path import exists. This catches a future
239
+ // drift where someone adds `runOrchestrator` or `requireEmbedding`
240
+ // to the estimator without going through code review. Pairs with
241
+ // the runtime tag-invariant tests above.
242
+ const estimatePath = path.join(__dirname, 'shield-estimate.ts');
243
+ const source = fs.readFileSync(estimatePath, 'utf-8');
244
+ // Forbidden symbols anywhere in the file — including `import`,
245
+ // re-exports, or string references. shield-templates.ts is a pure
246
+ // constants module so importing ESTIMATE_DISPLAY_TAG from it is
247
+ // safe; the ban is on the LLM/embedding/Lance surfaces.
248
+ expect(source).not.toMatch(/runOrchestrator/);
249
+ expect(source).not.toMatch(/requireEmbedding/);
250
+ expect(source).not.toMatch(/LanceStore/);
251
+ expect(source).not.toMatch(/createEmbedder/);
252
+ // ../utils.js exposes both runOrchestrator and orchestrator
253
+ // helpers; importing it would silently widen the surface even if
254
+ // none of those symbols are referenced. Block the import path
255
+ // outright.
256
+ expect(source).not.toMatch(/from ['"]\.\.\/utils\.js['"]/);
257
+ });
258
+ });
259
+ // ─── Incompatibility table — driven through shieldCommand ─
260
+ describe('shieldCommand --estimate incompatibility guard', () => {
261
+ let tmpDir;
262
+ let originalCwd;
263
+ beforeEach(() => {
264
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-est-incompat-'));
265
+ originalCwd = process.cwd();
266
+ process.chdir(tmpDir);
267
+ fs.writeFileSync(path.join(tmpDir, 'totem.config.ts'), 'export default {};', 'utf-8');
268
+ mockGetDiffForReview.mockReset();
269
+ mockRunCompiledRules.mockReset();
270
+ });
271
+ afterEach(() => {
272
+ process.chdir(originalCwd);
273
+ cleanTmpDir(tmpDir);
274
+ vi.restoreAllMocks();
275
+ });
276
+ it.each([
277
+ ['learn', { learn: true }, '--learn'],
278
+ ['autoCapture', { autoCapture: true }, '--auto-capture'],
279
+ ['override', { override: 'this is a long enough reason' }, '--override'],
280
+ ['suppress', { suppress: ['some-label'] }, '--suppress'],
281
+ ['fresh', { fresh: true }, '--fresh'],
282
+ ['mode-standard', { mode: 'standard' }, '--mode'],
283
+ ['mode-structural', { mode: 'structural' }, '--mode'],
284
+ ['raw', { raw: true }, '--raw'],
285
+ ])('throws CONFIG_INVALID when --estimate is combined with %s', async (_name, extra, expectedFlag) => {
286
+ const { shieldCommand } = await import('./shield.js');
287
+ const { TotemConfigError } = await import('@mmnto/totem');
288
+ const promise = shieldCommand({ estimate: true, ...extra });
289
+ await expect(promise).rejects.toBeInstanceOf(TotemConfigError);
290
+ await expect(promise).rejects.toMatchObject({ code: 'CONFIG_INVALID' });
291
+ await expect(promise).rejects.toThrow(new RegExp(`${expectedFlag.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')} is incompatible with --estimate`));
292
+ });
293
+ it('does NOT trip the --override length check when --estimate is set', async () => {
294
+ // Without --estimate, a 5-char --override would throw "must be at
295
+ // least 10 characters". With --estimate, the incompatibility guard
296
+ // fires first and the error names the actual conflict.
297
+ const { shieldCommand } = await import('./shield.js');
298
+ await expect(shieldCommand({ estimate: true, override: 'short' })).rejects.toThrow(/--override is incompatible with --estimate/);
299
+ });
300
+ it('treats an empty --suppress array as compatible (commander accumulator default)', async () => {
301
+ // Commander seeds --suppress with `[]`. An empty array MUST NOT
302
+ // trigger the incompatibility error — only a non-empty array
303
+ // counts as the user actually passing --suppress.
304
+ mockGetDiffForReview.mockResolvedValue(null);
305
+ const { shieldCommand } = await import('./shield.js');
306
+ await expect(shieldCommand({ estimate: true, suppress: [] })).resolves.toBeUndefined();
307
+ });
308
+ });
309
+ //# sourceMappingURL=shield-estimate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shield-estimate.test.js","sourceRoot":"","sources":["../../src/commands/shield-estimate.test.ts"],"names":[],"mappings":"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"}
@@ -32,6 +32,15 @@ export declare const TAG = "Shield";
32
32
  * config-key lookup (e.g. `runOrchestrator({ tag: TAG })`).
33
33
  */
34
34
  export declare const DISPLAY_TAG = "Review";
35
+ /**
36
+ * User-visible log prefix for the `totem review --estimate` pre-flight
37
+ * deterministic-rule run (mmnto-ai/totem#1714). Distinct from
38
+ * `DISPLAY_TAG` so estimator output is unmistakably labeled as a
39
+ * forecast rather than a final LLM verdict. Every `log.info` /
40
+ * `log.dim` / `log.warn` call emitted from the estimate code path
41
+ * (`shield-estimate.ts`) MUST use this constant, never `DISPLAY_TAG`.
42
+ */
43
+ export declare const ESTIMATE_DISPLAY_TAG = "Estimate";
35
44
  export declare const MAX_DIFF_CHARS = 50000;
36
45
  export declare const QUERY_DIFF_TRUNCATE = 2000;
37
46
  export declare const SPEC_SEARCH_POOL = 15;
@@ -1 +1 @@
1
- {"version":3,"file":"shield-templates.d.ts","sourceRoot":"","sources":["../../src/commands/shield-templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,GAAG,WAAW,CAAC;AAE5B;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,WAAW,CAAC;AACpC,eAAO,MAAM,cAAc,QAAS,CAAC;AACrC,eAAO,MAAM,mBAAmB,OAAQ,CAAC;AACzC,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAC7C,eAAO,MAAM,cAAc,MAAM,CAAC;AAIlC,eAAO,MAAM,2BAA2B,yCAAuC,CAAC;AAChF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;EAM9B,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGxC,CAAC;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAIpF,eAAO,MAAM,aAAa,g6EAqCzB,CAAC;AAEF,OAAO,EAAE,aAAa,IAAI,oBAAoB,EAAE,CAAC;AAIjD,eAAO,MAAM,gBAAgB,6vFA+C5B,CAAC;AAIF,eAAO,MAAM,wBAAwB,kuFAqCpC,CAAC;AAIF,eAAO,MAAM,2BAA2B,mhIA2DvC,CAAC;AAIF,eAAO,MAAM,0BAA0B,0yCA6BtC,CAAC;AAOF,eAAO,MAAM,UAAU,QAC4E,CAAC"}
1
+ {"version":3,"file":"shield-templates.d.ts","sourceRoot":"","sources":["../../src/commands/shield-templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,GAAG,WAAW,CAAC;AAE5B;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,WAAW,CAAC;AAEpC;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,aAAa,CAAC;AAE/C,eAAO,MAAM,cAAc,QAAS,CAAC;AACrC,eAAO,MAAM,mBAAmB,OAAQ,CAAC;AACzC,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAC7C,eAAO,MAAM,cAAc,MAAM,CAAC;AAIlC,eAAO,MAAM,2BAA2B,yCAAuC,CAAC;AAChF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;EAM9B,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGxC,CAAC;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAIpF,eAAO,MAAM,aAAa,g6EAqCzB,CAAC;AAEF,OAAO,EAAE,aAAa,IAAI,oBAAoB,EAAE,CAAC;AAIjD,eAAO,MAAM,gBAAgB,6vFA+C5B,CAAC;AAIF,eAAO,MAAM,wBAAwB,kuFAqCpC,CAAC;AAIF,eAAO,MAAM,2BAA2B,mhIA2DvC,CAAC;AAIF,eAAO,MAAM,0BAA0B,0yCA6BtC,CAAC;AAOF,eAAO,MAAM,UAAU,QAC4E,CAAC"}
@@ -33,6 +33,15 @@ export const TAG = 'Shield';
33
33
  * config-key lookup (e.g. `runOrchestrator({ tag: TAG })`).
34
34
  */
35
35
  export const DISPLAY_TAG = 'Review';
36
+ /**
37
+ * User-visible log prefix for the `totem review --estimate` pre-flight
38
+ * deterministic-rule run (mmnto-ai/totem#1714). Distinct from
39
+ * `DISPLAY_TAG` so estimator output is unmistakably labeled as a
40
+ * forecast rather than a final LLM verdict. Every `log.info` /
41
+ * `log.dim` / `log.warn` call emitted from the estimate code path
42
+ * (`shield-estimate.ts`) MUST use this constant, never `DISPLAY_TAG`.
43
+ */
44
+ export const ESTIMATE_DISPLAY_TAG = 'Estimate';
36
45
  export const MAX_DIFF_CHARS = 50_000;
37
46
  export const QUERY_DIFF_TRUNCATE = 2_000;
38
47
  export const SPEC_SEARCH_POOL = 15;
@@ -1 +1 @@
1
- {"version":3,"file":"shield-templates.js","sourceRoot":"","sources":["../../src/commands/shield-templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,2DAA2D;AAE3D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,QAAQ,CAAC;AAE5B;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC;AACpC,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AACrC,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AACzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AACnC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAC9B,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAElC,2DAA2D;AAE3D,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAGhF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,QAAQ,EAAE,2BAA2B;IACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IACpD,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGH,2DAA2D;AAE3D,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqC5B,CAAC;AAEF,OAAO,EAAE,aAAa,IAAI,oBAAoB,EAAE,CAAC;AAEjD,2DAA2D;AAE3D,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+C/B,CAAC;AAEF,4DAA4D;AAE5D,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCvC,CAAC;AAEF,6DAA6D;AAE7D,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2D1C,CAAC;AAEF,wDAAwD;AAExD,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BzC,CAAC;AAEF,2DAA2D;AAE3D,yFAAyF;AACzF,qFAAqF;AACrF,wHAAwH;AACxH,MAAM,CAAC,MAAM,UAAU,GACrB,iGAAiG,CAAC"}
1
+ {"version":3,"file":"shield-templates.js","sourceRoot":"","sources":["../../src/commands/shield-templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,2DAA2D;AAE3D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,QAAQ,CAAC;AAE5B;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC;AAEpC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAC;AAE/C,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AACrC,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AACzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AACnC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAC9B,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAElC,2DAA2D;AAE3D,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAGhF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,QAAQ,EAAE,2BAA2B;IACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IACpD,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGH,2DAA2D;AAE3D,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqC5B,CAAC;AAEF,OAAO,EAAE,aAAa,IAAI,oBAAoB,EAAE,CAAC;AAEjD,2DAA2D;AAE3D,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+C/B,CAAC;AAEF,4DAA4D;AAE5D,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCvC,CAAC;AAEF,6DAA6D;AAE7D,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2D1C,CAAC;AAEF,wDAAwD;AAExD,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BzC,CAAC;AAEF,2DAA2D;AAE3D,yFAAyF;AACzF,qFAAqF;AACrF,wHAAwH;AACxH,MAAM,CAAC,MAAM,UAAU,GACrB,iGAAiG,CAAC"}
@@ -78,6 +78,19 @@ export interface ShieldOptions {
78
78
  override?: string;
79
79
  suppress?: string[];
80
80
  autoCapture?: boolean;
81
+ /**
82
+ * Pre-flight deterministic-rule estimator (mmnto-ai/totem#1714). When
83
+ * true, `shieldCommand` short-circuits to `runEstimate` in
84
+ * `shield-estimate.ts`: same diff-resolution chain as the LLM review
85
+ * path, then `runCompiledRules` against `compiled-rules.json`, then
86
+ * return — no orchestrator, no embedder, no LanceDB. Output is labeled
87
+ * `[Estimate]` (`ESTIMATE_DISPLAY_TAG`) instead of `[Review]` so log
88
+ * lines unmistakably read as a forecast. Mutually incompatible with
89
+ * `--learn`, `--auto-capture`, `--override`, `--suppress`, `--fresh`,
90
+ * `--mode`, and `--raw` — these only apply to the LLM path; combining
91
+ * them throws `TotemConfigError CONFIG_INVALID`.
92
+ */
93
+ estimate?: boolean;
81
94
  }
82
95
  export declare function learnFromVerdict(verdictContent: string, diff: string, options: ShieldOptions, config: TotemConfig, cwd: string, configRoot?: string): Promise<void>;
83
96
  /** @internal — exported for testing */
@@ -1 +1 @@
1
- {"version":3,"file":"shield.d.ts","sourceRoot":"","sources":["../../src/commands/shield.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shield.d.ts","sourceRoot":"","sources":["../../src/commands/shield.ts"],"names":[],"mappings":"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"}
@@ -745,6 +745,39 @@ export async function shieldCommand(options) {
745
745
  const { filterDiffByPatterns, getDiffForReview } = await import('../git.js');
746
746
  const { classifyChangedFiles } = await import('./shield-classify.js');
747
747
  const { extractShieldContextAnnotations, extractShieldHints } = await import('./shield-hints.js');
748
+ // mmnto-ai/totem#1714: --estimate is the deterministic-rule pre-flight
749
+ // path. Reject incompatible flag combinations BEFORE any other
750
+ // validation (e.g. the --override length check below) so the user-
751
+ // facing error names the actual conflict (`--override is incompatible
752
+ // with --estimate`) instead of a misleading downstream constraint.
753
+ if (options.estimate) {
754
+ const incompatible = [
755
+ ['learn', '--learn'],
756
+ ['autoCapture', '--auto-capture'],
757
+ ['override', '--override'],
758
+ ['suppress', '--suppress'],
759
+ ['fresh', '--fresh'],
760
+ ['mode', '--mode'],
761
+ ['raw', '--raw'],
762
+ ];
763
+ for (const [key, flag] of incompatible) {
764
+ const value = options[key];
765
+ // totem-context: boolean OR in a presence-test, not a numeric-metric default — `??` would change "absent or explicitly-disabled" to "absent" and let `--fresh=false` slip through
766
+ if (value === undefined || value === false)
767
+ continue;
768
+ if (Array.isArray(value) && value.length === 0)
769
+ continue;
770
+ throw new TotemConfigError(`${flag} is incompatible with --estimate.`, 'Drop the incompatible flag, or run without --estimate.', 'CONFIG_INVALID');
771
+ }
772
+ const cwd = process.cwd();
773
+ const configPath = resolveConfigPath(cwd);
774
+ const configRoot = path.dirname(configPath);
775
+ loadEnv(cwd);
776
+ const config = await loadConfig(configPath);
777
+ const { runEstimate } = await import('./shield-estimate.js');
778
+ await runEstimate(options, config, cwd, configRoot);
779
+ return;
780
+ }
748
781
  if (options.mode && options.mode !== 'standard' && options.mode !== 'structural') {
749
782
  throw new TotemConfigError(`Invalid --mode "${options.mode}". Use "standard" or "structural".`, 'Check `totem review --help` for valid options.', 'CONFIG_INVALID');
750
783
  }