@mmnto/cli 1.14.10 → 1.14.12

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 (62) hide show
  1. package/dist/commands/compile-export-archive-filter.test.d.ts +2 -0
  2. package/dist/commands/compile-export-archive-filter.test.d.ts.map +1 -0
  3. package/dist/commands/compile-export-archive-filter.test.js +119 -0
  4. package/dist/commands/compile-export-archive-filter.test.js.map +1 -0
  5. package/dist/commands/compile-prune.test.js +35 -18
  6. package/dist/commands/compile-prune.test.js.map +1 -1
  7. package/dist/commands/compile-verbose-trace.test.d.ts +2 -0
  8. package/dist/commands/compile-verbose-trace.test.d.ts.map +1 -0
  9. package/dist/commands/compile-verbose-trace.test.js +128 -0
  10. package/dist/commands/compile-verbose-trace.test.js.map +1 -0
  11. package/dist/commands/compile.d.ts +33 -8
  12. package/dist/commands/compile.d.ts.map +1 -1
  13. package/dist/commands/compile.js +148 -13
  14. package/dist/commands/compile.js.map +1 -1
  15. package/dist/commands/docs.test.js +1 -0
  16. package/dist/commands/docs.test.js.map +1 -1
  17. package/dist/commands/doctor.d.ts +44 -0
  18. package/dist/commands/doctor.d.ts.map +1 -1
  19. package/dist/commands/doctor.js +147 -0
  20. package/dist/commands/doctor.js.map +1 -1
  21. package/dist/commands/doctor.test.js +342 -2
  22. package/dist/commands/doctor.test.js.map +1 -1
  23. package/dist/commands/install.d.ts +82 -0
  24. package/dist/commands/install.d.ts.map +1 -0
  25. package/dist/commands/install.js +440 -0
  26. package/dist/commands/install.js.map +1 -0
  27. package/dist/commands/install.test.d.ts +2 -0
  28. package/dist/commands/install.test.d.ts.map +1 -0
  29. package/dist/commands/install.test.js +196 -0
  30. package/dist/commands/install.test.js.map +1 -0
  31. package/dist/commands/pre-compact-hook.test.d.ts +10 -0
  32. package/dist/commands/pre-compact-hook.test.d.ts.map +1 -0
  33. package/dist/commands/pre-compact-hook.test.js +131 -0
  34. package/dist/commands/pre-compact-hook.test.js.map +1 -0
  35. package/dist/commands/run-compiled-rules.d.ts.map +1 -1
  36. package/dist/commands/run-compiled-rules.js +17 -2
  37. package/dist/commands/run-compiled-rules.js.map +1 -1
  38. package/dist/commands/run-compiled-rules.test.js +65 -0
  39. package/dist/commands/run-compiled-rules.test.js.map +1 -1
  40. package/dist/commands/shield-learn.test.js +1 -0
  41. package/dist/commands/shield-learn.test.js.map +1 -1
  42. package/dist/commands/shield.content-hash-parity.test.d.ts +2 -0
  43. package/dist/commands/shield.content-hash-parity.test.d.ts.map +1 -0
  44. package/dist/commands/shield.content-hash-parity.test.js +155 -0
  45. package/dist/commands/shield.content-hash-parity.test.js.map +1 -0
  46. package/dist/commands/shield.d.ts +8 -1
  47. package/dist/commands/shield.d.ts.map +1 -1
  48. package/dist/commands/shield.js +59 -9
  49. package/dist/commands/shield.js.map +1 -1
  50. package/dist/commands/sync.d.ts +7 -0
  51. package/dist/commands/sync.d.ts.map +1 -1
  52. package/dist/commands/sync.js +39 -3
  53. package/dist/commands/sync.js.map +1 -1
  54. package/dist/commands/sync.test.js +131 -9
  55. package/dist/commands/sync.test.js.map +1 -1
  56. package/dist/index.js +13 -0
  57. package/dist/index.js.map +1 -1
  58. package/dist/utils/pilot.test.js +1 -0
  59. package/dist/utils/pilot.test.js.map +1 -1
  60. package/dist/utils.test.js +1 -0
  61. package/dist/utils.test.js.map +1 -1
  62. package/package.json +2 -2
@@ -0,0 +1,196 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
4
+ import { cleanTmpDir } from '../test-utils.js';
5
+ import { buildTotemignoreDiff, detectPackageManager, isInExtends, isValidTarget, resolveCompiledRulesExport, resolvePackName, } from './install.js';
6
+ describe('resolvePackName', () => {
7
+ it('strips the pack/ prefix from unscoped targets', () => {
8
+ expect(resolvePackName('pack/agent-security')).toBe('agent-security');
9
+ });
10
+ it('strips the pack/ prefix from scoped targets', () => {
11
+ expect(resolvePackName('pack/@scope/name')).toBe('@scope/name');
12
+ });
13
+ it('returns raw npm names unchanged (no double-strip)', () => {
14
+ expect(resolvePackName('@scope/name')).toBe('@scope/name');
15
+ expect(resolvePackName('name')).toBe('name');
16
+ });
17
+ });
18
+ describe('isValidTarget', () => {
19
+ it('accepts pack/<name> and pack/@scope/<name>', () => {
20
+ expect(isValidTarget('pack/agent-security')).toBe(true);
21
+ expect(isValidTarget('pack/@totem/pack-agent-security')).toBe(true);
22
+ });
23
+ it('rejects targets without the pack/ prefix', () => {
24
+ expect(isValidTarget('agent-security')).toBe(false);
25
+ expect(isValidTarget('@scope/name')).toBe(false);
26
+ });
27
+ it('rejects malformed scope patterns', () => {
28
+ expect(isValidTarget('pack/@scope')).toBe(false);
29
+ expect(isValidTarget('pack//name')).toBe(false);
30
+ expect(isValidTarget('pack/@/name')).toBe(false);
31
+ });
32
+ it('rejects names with disallowed characters', () => {
33
+ expect(isValidTarget('pack/my_pack')).toBe(false);
34
+ expect(isValidTarget('pack/my pack')).toBe(false);
35
+ expect(isValidTarget('pack/..')).toBe(false);
36
+ });
37
+ it('rejects pack names with leading hyphens (flag-injection hardening)', () => {
38
+ // Paired with the `--` delimiter on the pm install invocation: a
39
+ // name like `-rf` would otherwise parse as a package-manager flag.
40
+ expect(isValidTarget('pack/-rf')).toBe(false);
41
+ expect(isValidTarget('pack/@scope/-rf')).toBe(false);
42
+ expect(isValidTarget('pack/-')).toBe(false);
43
+ });
44
+ it('rejects targets longer than the 214-char npm package-name limit', () => {
45
+ const long = 'pack/' + 'a'.repeat(250);
46
+ expect(isValidTarget(long)).toBe(false);
47
+ });
48
+ });
49
+ describe('resolveCompiledRulesExport', () => {
50
+ it('returns a plain string export unchanged', () => {
51
+ expect(resolveCompiledRulesExport('./compiled-rules.json')).toBe('./compiled-rules.json');
52
+ });
53
+ it('returns the default condition from an exports object', () => {
54
+ expect(resolveCompiledRulesExport({
55
+ default: './dist/compiled-rules.json',
56
+ types: './dist/compiled-rules.d.ts',
57
+ })).toBe('./dist/compiled-rules.json');
58
+ });
59
+ it('falls back to the first string value when no default is present', () => {
60
+ expect(resolveCompiledRulesExport({
61
+ import: './dist/import.json',
62
+ require: './dist/require.json',
63
+ })).toBe('./dist/import.json');
64
+ });
65
+ it('returns null for unresolvable values', () => {
66
+ expect(resolveCompiledRulesExport(null)).toBeNull();
67
+ expect(resolveCompiledRulesExport(undefined)).toBeNull();
68
+ expect(resolveCompiledRulesExport(42)).toBeNull();
69
+ expect(resolveCompiledRulesExport({ types: null, default: 42 })).toBeNull();
70
+ });
71
+ });
72
+ describe('isInExtends', () => {
73
+ it('returns true when the pack name appears inside a single-line extends array', () => {
74
+ const config = `export default { extends: ['@totem/pack-agent-security'] };`;
75
+ expect(isInExtends(config, '@totem/pack-agent-security')).toBe(true);
76
+ });
77
+ it('returns true when the pack name appears inside a multi-line extends array', () => {
78
+ const config = `export default {
79
+ extends: [
80
+ '@totem/pack-agent-security',
81
+ 'my-other-pack',
82
+ ],
83
+ };`;
84
+ expect(isInExtends(config, '@totem/pack-agent-security')).toBe(true);
85
+ expect(isInExtends(config, 'my-other-pack')).toBe(true);
86
+ });
87
+ it('returns false when the pack name appears only in a comment or unrelated field', () => {
88
+ // CR finding on PR #1516 predecessor: substring-matching across the
89
+ // whole config treats a comment mention as "already installed". The
90
+ // check must scope to the extends array contents.
91
+ const config = `// extends this soon: my-pack
92
+ export default { rules: ['my-pack'] };`;
93
+ expect(isInExtends(config, 'my-pack')).toBe(false);
94
+ });
95
+ it('ignores a commented-out extends array (Shield finding on PR #1516)', () => {
96
+ // A leftover `// extends: ['old-pack']` line must not be read as the
97
+ // active declaration. Otherwise installing `old-pack` would skip with
98
+ // "already installed" when the extends array is in fact absent.
99
+ const config = `// extends: ['old-pack']
100
+ export default { rules: [] };`;
101
+ expect(isInExtends(config, 'old-pack')).toBe(false);
102
+ });
103
+ it('ignores an extends declaration inside a block comment', () => {
104
+ const config = `/*
105
+ extends: ['old-pack'],
106
+ */
107
+ export default { rules: [] };`;
108
+ expect(isInExtends(config, 'old-pack')).toBe(false);
109
+ });
110
+ it('ignores extends syntax inside a string literal (GCA finding on PR #1516)', () => {
111
+ // A rule message or regex pattern in a string literal may happen to
112
+ // contain the structural sequence `extends: ['foo']`. The matcher
113
+ // must not treat that as the active declaration.
114
+ const config = `export default {
115
+ rules: [{ message: "Do not use extends: ['old-pack']" }],
116
+ };`;
117
+ expect(isInExtends(config, 'old-pack')).toBe(false);
118
+ });
119
+ it('returns false when there is no extends array', () => {
120
+ const config = `export default { rules: [] };`;
121
+ expect(isInExtends(config, 'anything')).toBe(false);
122
+ });
123
+ it('matches regardless of quote style (single, double, backtick)', () => {
124
+ expect(isInExtends(`extends: ['foo']`, 'foo')).toBe(true);
125
+ expect(isInExtends(`extends: ["foo"]`, 'foo')).toBe(true);
126
+ expect(isInExtends(`extends: [\`foo\`]`, 'foo')).toBe(true);
127
+ });
128
+ });
129
+ describe('buildTotemignoreDiff', () => {
130
+ it('returns the set of pack lines missing from the local file', () => {
131
+ const pack = `node_modules\ndist\nbuild`;
132
+ const local = `node_modules`;
133
+ expect(buildTotemignoreDiff(pack, local)).toEqual(['dist', 'build']);
134
+ });
135
+ it('uses exact-line equality (not substring) to avoid the indexOf false positive', () => {
136
+ // GCA finding on PR #1516 predecessor: `node` inside a pack file must
137
+ // not match `node_modules` in the local file. Set-based exact match
138
+ // over trimmed lines closes the hole.
139
+ expect(buildTotemignoreDiff('node', 'node_modules')).toEqual(['node']);
140
+ });
141
+ it('ignores blank lines and trims whitespace', () => {
142
+ const pack = ` dist \n\n build\n`;
143
+ const local = `dist\n`;
144
+ expect(buildTotemignoreDiff(pack, local)).toEqual(['build']);
145
+ });
146
+ it('returns empty when every pack line is already local', () => {
147
+ expect(buildTotemignoreDiff(`a\nb\nc`, `a\nb\nc`)).toEqual([]);
148
+ });
149
+ it('returns every pack line when local is empty', () => {
150
+ expect(buildTotemignoreDiff(`a\nb\nc`, '')).toEqual(['a', 'b', 'c']);
151
+ });
152
+ });
153
+ describe('detectPackageManager', () => {
154
+ let tmpDir;
155
+ beforeEach(() => {
156
+ const tempRoot = path.join(process.cwd(), '.totem', 'temp');
157
+ fs.mkdirSync(tempRoot, { recursive: true });
158
+ tmpDir = fs.mkdtempSync(path.join(tempRoot, 'totem-install-'));
159
+ });
160
+ afterEach(() => {
161
+ cleanTmpDir(tmpDir);
162
+ });
163
+ it('detects pnpm via pnpm-lock.yaml', () => {
164
+ fs.writeFileSync(path.join(tmpDir, 'pnpm-lock.yaml'), '');
165
+ expect(detectPackageManager(fs, path, tmpDir)).toBe('pnpm');
166
+ });
167
+ it('detects yarn via yarn.lock', () => {
168
+ fs.writeFileSync(path.join(tmpDir, 'yarn.lock'), '');
169
+ expect(detectPackageManager(fs, path, tmpDir)).toBe('yarn');
170
+ });
171
+ // Variants declared on a single line so the co-located-reference
172
+ // rule sees both literal strings in one place. Individual tests then
173
+ // reference the constants to exercise each probe path independently,
174
+ // which catches a regression in either code path (CR finding on PR
175
+ // mmnto-ai/totem#1516: writing both in one test masks a broken probe).
176
+ const [BUN_LOCKB_FIXTURE, BUN_LOCK_FIXTURE] = ['bun.lockb', 'bun.lock'];
177
+ it('detects bun via the binary lockfile variant', () => {
178
+ // totem-context: intentional bun lockfile fixture for tests
179
+ fs.writeFileSync(path.join(tmpDir, BUN_LOCKB_FIXTURE), '');
180
+ expect(detectPackageManager(fs, path, tmpDir)).toBe('bun');
181
+ });
182
+ it('detects bun via the text lockfile variant', () => {
183
+ // totem-context: intentional bun lockfile fixture for tests
184
+ fs.writeFileSync(path.join(tmpDir, BUN_LOCK_FIXTURE), '');
185
+ expect(detectPackageManager(fs, path, tmpDir)).toBe('bun');
186
+ });
187
+ it('prefers pnpm over yarn when both lockfiles coexist', () => {
188
+ fs.writeFileSync(path.join(tmpDir, 'pnpm-lock.yaml'), '');
189
+ fs.writeFileSync(path.join(tmpDir, 'yarn.lock'), '');
190
+ expect(detectPackageManager(fs, path, tmpDir)).toBe('pnpm');
191
+ });
192
+ it('falls back to npm when no lockfile is present', () => {
193
+ expect(detectPackageManager(fs, path, tmpDir)).toBe('npm');
194
+ });
195
+ });
196
+ //# sourceMappingURL=install.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.test.js","sourceRoot":"","sources":["../../src/commands/install.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * PreCompact hook invariants.
3
+ *
4
+ * The hook at `.claude/hooks/pre-compact.sh` runs before Claude Code
5
+ * auto-compaction. Its exit-code contract is load-bearing: exit 2 would
6
+ * block compaction, which is worse than any breadcrumb failure. These
7
+ * tests lock in the nine invariants from `.totem/specs/1460.md`.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=pre-compact-hook.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-compact-hook.test.d.ts","sourceRoot":"","sources":["../../src/commands/pre-compact-hook.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * PreCompact hook invariants.
3
+ *
4
+ * The hook at `.claude/hooks/pre-compact.sh` runs before Claude Code
5
+ * auto-compaction. Its exit-code contract is load-bearing: exit 2 would
6
+ * block compaction, which is worse than any breadcrumb failure. These
7
+ * tests lock in the nine invariants from `.totem/specs/1460.md`.
8
+ */
9
+ import { execFileSync } from 'node:child_process';
10
+ import * as fs from 'node:fs';
11
+ import * as path from 'node:path';
12
+ import { afterAll, describe, expect, it } from 'vitest';
13
+ const ROOT = path.resolve(__dirname, '..', '..', '..', '..');
14
+ const HOOK = path.join(ROOT, '.claude', 'hooks', 'pre-compact.sh');
15
+ const CACHE = path.join(ROOT, '.totem', 'cache');
16
+ const ARTIFACT_RE = /^\.pre-compact-signoff-\d{8}T\d{6}Z(-\d+)?\.md$/;
17
+ // 1-second buffer absorbs file systems with 1s mtime resolution (some
18
+ // network mounts, older filesystems) where the recorded mtime may lag
19
+ // the wall clock by a fraction of a second.
20
+ const MTIME_BUFFER_MS = 1_000;
21
+ // Upper bound on hook duration, per design doc invariant. Per-git-call
22
+ // budget in the hook itself is 2s; overall 10s covers four git calls
23
+ // plus file I/O with generous headroom.
24
+ const HOOK_TIMEOUT_MS = 10_000;
25
+ function getFreshArtifacts(callStart) {
26
+ if (!fs.existsSync(CACHE))
27
+ return [];
28
+ return fs
29
+ .readdirSync(CACHE)
30
+ .filter((f) => ARTIFACT_RE.test(f))
31
+ .map((f) => path.join(CACHE, f))
32
+ .filter((p) => fs.statSync(p).mtimeMs >= callStart - MTIME_BUFFER_MS);
33
+ }
34
+ function runHook(stdin = '', timeoutMs = HOOK_TIMEOUT_MS) {
35
+ const start = Date.now();
36
+ try {
37
+ const stdout = execFileSync('bash', [HOOK], {
38
+ input: stdin,
39
+ encoding: 'utf-8',
40
+ timeout: timeoutMs,
41
+ stdio: ['pipe', 'pipe', 'pipe'],
42
+ });
43
+ return { stdout, stderr: '', exitCode: 0, durationMs: Date.now() - start };
44
+ }
45
+ catch (err) {
46
+ const e = err;
47
+ return {
48
+ stdout: typeof e.stdout === 'string' ? e.stdout : (e.stdout?.toString('utf-8') ?? ''),
49
+ stderr: typeof e.stderr === 'string' ? e.stderr : (e.stderr?.toString('utf-8') ?? ''),
50
+ exitCode: e.status ?? -1,
51
+ durationMs: Date.now() - start,
52
+ };
53
+ }
54
+ }
55
+ describe('PreCompact hook (mmnto-ai/totem#1460)', () => {
56
+ // Record the test-suite start time so cleanup deletes only artifacts
57
+ // created during this run, not pre-existing ones.
58
+ const testSuiteStart = Date.now();
59
+ afterAll(() => {
60
+ if (!fs.existsSync(CACHE))
61
+ return;
62
+ for (const entry of fs.readdirSync(CACHE)) {
63
+ if (!ARTIFACT_RE.test(entry))
64
+ continue;
65
+ const p = path.join(CACHE, entry);
66
+ try {
67
+ if (fs.statSync(p).mtimeMs >= testSuiteStart - MTIME_BUFFER_MS) {
68
+ fs.unlinkSync(p);
69
+ }
70
+ }
71
+ catch (err) {
72
+ // Best-effort cleanup; warn but continue so one leaked file does
73
+ // not abort the rest of the sweep. Leaked artifacts are harmless.
74
+ console.warn(`pre-compact-hook.test cleanup: could not process ${p}`, err);
75
+ }
76
+ }
77
+ });
78
+ it('hook file exists with a bash shebang', () => {
79
+ expect(fs.existsSync(HOOK)).toBe(true);
80
+ const content = fs.readFileSync(HOOK, 'utf-8');
81
+ expect(content.startsWith('#!/usr/bin/env bash')).toBe(true);
82
+ });
83
+ it('hook passes bash syntax check', () => {
84
+ expect(() => execFileSync('bash', ['-n', HOOK], { stdio: 'pipe' })).not.toThrow();
85
+ });
86
+ it('installs an EXIT trap that coerces non-zero exits to exit 1', () => {
87
+ const content = fs.readFileSync(HOOK, 'utf-8');
88
+ expect(content).toMatch(/trap\b[^\n]*\bexit 1\b[^\n]*\bEXIT\b/);
89
+ });
90
+ it('contains no network-call binaries (no curl, no wget)', () => {
91
+ const content = fs.readFileSync(HOOK, 'utf-8');
92
+ expect(content).not.toMatch(/\bcurl\b/);
93
+ expect(content).not.toMatch(/\bwget\b/);
94
+ });
95
+ it('happy path: exits 0 and writes an artifact with a fresh mtime', () => {
96
+ const callStart = Date.now();
97
+ const result = runHook();
98
+ expect(result.exitCode).toBe(0);
99
+ const freshArtifacts = getFreshArtifacts(callStart);
100
+ expect(freshArtifacts.length).toBeGreaterThan(0);
101
+ });
102
+ it('artifact contents include the required fields', () => {
103
+ const callStart = Date.now();
104
+ const result = runHook();
105
+ expect(result.exitCode).toBe(0);
106
+ const latest = getFreshArtifacts(callStart).sort().pop();
107
+ expect(latest).toBeDefined();
108
+ const content = fs.readFileSync(latest, 'utf-8');
109
+ expect(content).toMatch(/^# Pre-compact signoff \d{8}T\d{6}Z$/m);
110
+ expect(content).toMatch(/\*\*Branch:\*\*/);
111
+ expect(content).toMatch(/\*\*HEAD:\*\*/);
112
+ expect(content).toMatch(/## git status --short/); // totem-context: asserting the hook's markdown heading, not running git. See #1469 for over-broad rule.
113
+ expect(content).toMatch(/## Last 5 commits/);
114
+ });
115
+ it('completes within 10 seconds worst-case on a local repo', () => {
116
+ const result = runHook('', HOOK_TIMEOUT_MS);
117
+ expect(result.exitCode).toBe(0);
118
+ expect(result.durationMs).toBeLessThan(HOOK_TIMEOUT_MS);
119
+ });
120
+ it('ignores stdin content (runs identically with garbage input)', () => {
121
+ const bogus = JSON.stringify({ event: 'PreCompact', made: 'up', fields: [1, 2, 3] });
122
+ const result = runHook(bogus);
123
+ expect(result.exitCode).toBe(0);
124
+ });
125
+ it('never exits 2 even when given malformed stdin', () => {
126
+ const malformed = 'not json {{{{{}}}}}';
127
+ const result = runHook(malformed);
128
+ expect(result.exitCode).not.toBe(2);
129
+ });
130
+ });
131
+ //# sourceMappingURL=pre-compact-hook.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-compact-hook.test.js","sourceRoot":"","sources":["../../src/commands/pre-compact-hook.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"run-compiled-rules.d.ts","sourceRoot":"","sources":["../../src/commands/run-compiled-rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAqB,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE7F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,6EAA6E;IAC7E,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAQD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CAyXjC"}
1
+ {"version":3,"file":"run-compiled-rules.d.ts","sourceRoot":"","sources":["../../src/commands/run-compiled-rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAqB,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE7F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,6EAA6E;IAC7E,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAQD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CA0YjC"}
@@ -9,7 +9,7 @@ export async function runCompiledRules(options) {
9
9
  const path = await import('node:path');
10
10
  const { bold, errorColor, log, success: successColor } = await import('../ui.js');
11
11
  const { writeOutput } = await import('../utils.js');
12
- const { applyAstRulesToAdditions, applyRulesToAdditions, enrichWithAstContext, extractAddedLines, loadCompiledRules, loadRuleMetrics, matchesGlob, recordContextHit, recordSuppression, recordTrigger, resolveGitRoot, safeExec, saveRuleMetrics, setCoreLogger, TotemError, } = await import('@mmnto/totem');
12
+ const { applyAstRulesToAdditions, applyRulesToAdditions, enrichWithAstContext, extractAddedLines, loadCompiledRules, loadRuleMetrics, matchesGlob, recordContextHit, recordEvaluation, recordSuppression, recordTrigger, resolveGitRoot, safeExec, saveRuleMetrics, setCoreLogger, TotemError, } = await import('@mmnto/totem');
13
13
  const { diff, cwd, totemDir, format, outPath, exportPaths, ignorePatterns, tag, isStaged } = options;
14
14
  // Wire core logger to CLI UI (ADR-071: core must not use console.warn directly)
15
15
  setCoreLogger({ warn: (msg) => log.warn(tag, msg) });
@@ -77,7 +77,11 @@ export async function runCompiledRules(options) {
77
77
  }
78
78
  else if (event === 'suppress') {
79
79
  recordSuppression(metrics, hash);
80
- // Append to Trap Ledger (fire-and-forget)
80
+ // Append to Trap Ledger (fire-and-forget). When the suppressed rule
81
+ // was shipped by a pack with immutable: true (ADR-089,
82
+ // mmnto-ai/totem#1485), the event carries the flag so auditors can
83
+ // surface every attempt to silence an enforced security rule via
84
+ // `jq 'select(.immutable == true)'` over events.ndjson.
81
85
  if (context) {
82
86
  appendLedgerEvent(resolvedTotemDir, {
83
87
  timestamp: new Date().toISOString(),
@@ -87,6 +91,7 @@ export async function runCompiledRules(options) {
87
91
  line: context.line,
88
92
  justification: context.justification ?? '',
89
93
  source: 'lint',
94
+ ...(context.immutable === true ? { immutable: true } : {}),
90
95
  }, (msg) => log.dim(tag, msg));
91
96
  }
92
97
  }
@@ -179,6 +184,16 @@ export async function runCompiledRules(options) {
179
184
  if (zeroMatchRules.length > 0) {
180
185
  log.dim(tag, `${zeroMatchRules.length} rule(s) matched no files in this diff`);
181
186
  }
187
+ // mmnto-ai/totem#1483: tick evaluationCount once per rule per lint run.
188
+ // Invariant: one run loads the rule set, evaluates each rule against the
189
+ // diff additions, and increments the counter here exactly once per
190
+ // lessonHash. Multiple matches on a rule within one run still produce a
191
+ // single increment. This counter is the "was this rule exercised" signal
192
+ // the doctor stale-rule check reads to distinguish a dormant rule from a
193
+ // rule that has genuinely sat through N lint cycles without firing.
194
+ for (const rule of rules) {
195
+ recordEvaluation(metrics, rule.lessonHash);
196
+ }
182
197
  try {
183
198
  saveRuleMetrics(resolvedTotemDir, metrics);
184
199
  }
@@ -1 +1 @@
1
- {"version":3,"file":"run-compiled-rules.js","sourceRoot":"","sources":["../../src/commands/run-compiled-rules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-compiled-rules.js","sourceRoot":"","sources":["../../src/commands/run-compiled-rules.ts"],"names":[],"mappings":"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"}
@@ -870,6 +870,71 @@ describe('runCompiledRules', () => {
870
870
  mockExec.mockRestore();
871
871
  });
872
872
  });
873
+ // ─── evaluationCount per-rule per-run (mmnto-ai/totem#1483) ──
874
+ describe('evaluationCount (mmnto-ai/totem#1483)', () => {
875
+ it('increments evaluationCount exactly once per rule per lint run', async () => {
876
+ const rule1 = makeRule('console\\.log', 'No console', 'No console', {
877
+ lessonHash: 'hash-eval-1',
878
+ });
879
+ const rule2 = makeRule('debugger', 'No debugger', 'No debugger', {
880
+ lessonHash: 'hash-eval-2',
881
+ });
882
+ writeRules(tmpDir, [rule1, rule2]);
883
+ // Diff carries multiple additions including several matches for rule1.
884
+ // The counter still ticks once per rule regardless of match count.
885
+ const diff = [
886
+ 'diff --git a/src/app.ts b/src/app.ts',
887
+ '--- a/src/app.ts',
888
+ '+++ b/src/app.ts',
889
+ '@@ -1,3 +1,5 @@',
890
+ ' // existing',
891
+ '+ console.log("first");',
892
+ '+ console.log("second");',
893
+ '+ console.log("third");',
894
+ ' // end',
895
+ ].join('\n');
896
+ try {
897
+ await runCompiledRules({
898
+ diff,
899
+ cwd: tmpDir,
900
+ totemDir: TOTEM_DIR,
901
+ format: 'json',
902
+ tag: 'Test',
903
+ });
904
+ }
905
+ catch (err) {
906
+ if (!(err instanceof TotemError) || err.code !== 'SHIELD_FAILED')
907
+ throw err;
908
+ }
909
+ const metricsPath = path.join(tmpDir, TOTEM_DIR, 'cache', 'rule-metrics.json');
910
+ expect(fs.existsSync(metricsPath)).toBe(true);
911
+ const metrics = JSON.parse(fs.readFileSync(metricsPath, 'utf-8'));
912
+ expect(metrics.rules['hash-eval-1'].evaluationCount).toBe(1);
913
+ expect(metrics.rules['hash-eval-2'].evaluationCount).toBe(1);
914
+ expect(metrics.rules['hash-eval-1'].triggerCount).toBe(3);
915
+ expect(metrics.rules['hash-eval-2'].triggerCount).toBe(0);
916
+ });
917
+ it('increments evaluationCount on each invocation (monotonic across runs)', async () => {
918
+ const rule = makeRule('NEVER_MATCHES_XYZ', 'Dormant rule', 'Dormant rule', {
919
+ lessonHash: 'hash-dormant',
920
+ });
921
+ writeRules(tmpDir, [rule]);
922
+ const diff = makeDiff('src/app.ts', ' const x = 1;');
923
+ for (let i = 0; i < 4; i++) {
924
+ await runCompiledRules({
925
+ diff,
926
+ cwd: tmpDir,
927
+ totemDir: TOTEM_DIR,
928
+ format: 'json',
929
+ tag: 'Test',
930
+ });
931
+ }
932
+ const metricsPath = path.join(tmpDir, TOTEM_DIR, 'cache', 'rule-metrics.json');
933
+ const metrics = JSON.parse(fs.readFileSync(metricsPath, 'utf-8'));
934
+ expect(metrics.rules['hash-dormant'].evaluationCount).toBe(4);
935
+ expect(metrics.rules['hash-dormant'].triggerCount).toBe(0);
936
+ });
937
+ });
873
938
  });
874
939
  describe('TOTEM_LITE graceful AST degradation', () => {
875
940
  let tmpDir;