@mmnto/cli 1.14.0 → 1.14.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 (49) hide show
  1. package/dist/commands/compile-prune.test.d.ts +2 -0
  2. package/dist/commands/compile-prune.test.d.ts.map +1 -0
  3. package/dist/commands/compile-prune.test.js +116 -0
  4. package/dist/commands/compile-prune.test.js.map +1 -0
  5. package/dist/commands/compile.d.ts +37 -0
  6. package/dist/commands/compile.d.ts.map +1 -1
  7. package/dist/commands/compile.js +91 -4
  8. package/dist/commands/compile.js.map +1 -1
  9. package/dist/commands/doctor.d.ts +1 -1
  10. package/dist/commands/doctor.js +2 -2
  11. package/dist/commands/doctor.js.map +1 -1
  12. package/dist/commands/doctor.test.js +1 -1
  13. package/dist/commands/doctor.test.js.map +1 -1
  14. package/dist/commands/handoff.d.ts +17 -37
  15. package/dist/commands/handoff.d.ts.map +1 -1
  16. package/dist/commands/handoff.js +120 -273
  17. package/dist/commands/handoff.js.map +1 -1
  18. package/dist/commands/handoff.test.js +64 -277
  19. package/dist/commands/handoff.test.js.map +1 -1
  20. package/dist/commands/lint.d.ts.map +1 -1
  21. package/dist/commands/lint.js +2 -1
  22. package/dist/commands/lint.js.map +1 -1
  23. package/dist/commands/run-compiled-rules.d.ts +2 -0
  24. package/dist/commands/run-compiled-rules.d.ts.map +1 -1
  25. package/dist/commands/run-compiled-rules.js +63 -5
  26. package/dist/commands/run-compiled-rules.js.map +1 -1
  27. package/dist/commands/run-compiled-rules.test.js +382 -0
  28. package/dist/commands/run-compiled-rules.test.js.map +1 -1
  29. package/dist/commands/shield.js +2 -2
  30. package/dist/commands/shield.js.map +1 -1
  31. package/dist/commands/shield.test.js +1 -1
  32. package/dist/commands/shield.test.js.map +1 -1
  33. package/dist/help.d.ts.map +1 -1
  34. package/dist/help.js +0 -1
  35. package/dist/help.js.map +1 -1
  36. package/dist/index.js +8 -10
  37. package/dist/index.js.map +1 -1
  38. package/dist/utils.d.ts.map +1 -1
  39. package/dist/utils.js +0 -1
  40. package/dist/utils.js.map +1 -1
  41. package/package.json +2 -2
  42. package/dist/schemas/handoff-checkpoint.d.ts +0 -34
  43. package/dist/schemas/handoff-checkpoint.d.ts.map +0 -1
  44. package/dist/schemas/handoff-checkpoint.js +0 -13
  45. package/dist/schemas/handoff-checkpoint.js.map +0 -1
  46. package/dist/schemas/handoff-checkpoint.test.d.ts +0 -2
  47. package/dist/schemas/handoff-checkpoint.test.d.ts.map +0 -1
  48. package/dist/schemas/handoff-checkpoint.test.js +0 -65
  49. package/dist/schemas/handoff-checkpoint.test.js.map +0 -1
@@ -1,10 +1,9 @@
1
1
  import * as fs from 'node:fs';
2
2
  import * as os from 'node:os';
3
3
  import * as path from 'node:path';
4
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
5
- import { HandoffCheckpointSchema } from '../schemas/handoff-checkpoint.js';
4
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
6
5
  import { cleanTmpDir } from '../test-utils.js';
7
- import { buildLiteHandoff, gatherDeterministicState, parseSemanticFields, readRecentLessons, resolveCheckpointPath, writeCheckpoint, } from './handoff.js';
6
+ import { buildJournalScaffold, readRecentLessons, resolveJournalPath, slugFromBranch, } from './handoff.js';
8
7
  describe('readRecentLessons', () => {
9
8
  let tmpDir;
10
9
  const totemDir = '.totem';
@@ -48,295 +47,83 @@ describe('readRecentLessons', () => {
48
47
  expect(result).not.toContain('Lesson 0\n');
49
48
  });
50
49
  });
51
- // ─── buildLiteHandoff ───────────────────────────────
52
- describe('buildLiteHandoff', () => {
53
- it('generates clean working tree snapshot', () => {
54
- const output = buildLiteHandoff('main', '', '', 'abc1234 initial commit', '## Lesson 1\nContent');
55
- expect(output).toContain('main; clean working tree');
56
- expect(output).toContain('Working tree is clean.');
57
- expect(output).toContain('abc1234 initial commit');
58
- expect(output).toContain('lines in lessons file'); // totem-ignore
50
+ // ─── slugFromBranch ───────────────────────────────────
51
+ describe('slugFromBranch', () => {
52
+ it('returns session for main/master/HEAD', () => {
53
+ expect(slugFromBranch('main')).toBe('session');
54
+ expect(slugFromBranch('master')).toBe('session');
55
+ expect(slugFromBranch('HEAD')).toBe('session');
56
+ expect(slugFromBranch('')).toBe('session');
57
+ expect(slugFromBranch('(unknown)')).toBe('session');
58
+ });
59
+ it('strips common prefixes', () => {
60
+ expect(slugFromBranch('feat/add-logging')).toBe('add-logging');
61
+ expect(slugFromBranch('fix/null-pointer')).toBe('null-pointer');
62
+ expect(slugFromBranch('chore/cleanup-deps')).toBe('cleanup-deps');
63
+ expect(slugFromBranch('hotfix/1304-sweep')).toBe('1304-sweep');
64
+ });
65
+ it('sanitizes special characters', () => {
66
+ expect(slugFromBranch('feat/UPPER_case')).toBe('upper-case');
67
+ expect(slugFromBranch('feat/dots.and.slashes')).toBe('dots-and-slashes');
68
+ });
69
+ it('truncates long branch names to 60 chars', () => {
70
+ const long = 'feat/' + 'a'.repeat(100);
71
+ const slug = slugFromBranch(long);
72
+ expect(slug.length).toBeLessThanOrEqual(60);
73
+ });
74
+ });
75
+ // ─── resolveJournalPath ───────────────────────────────
76
+ describe('resolveJournalPath', () => {
77
+ it('uses --out path when specified', () => {
78
+ const result = resolveJournalPath('/repo', '.totem', 'main', '/custom/path.md');
79
+ expect(result).toBe('/custom/path.md');
59
80
  });
60
- it('generates dirty working tree snapshot', () => {
61
- const output = buildLiteHandoff('feat/test', ' M src/app.ts\n?? new-file.ts', ' src/app.ts | 5 ++---', 'def5678 second commit\nabc1234 first commit', '');
81
+ it('builds date-slug path under .totem/journal/', () => {
82
+ const result = resolveJournalPath('/repo', '.totem', 'feat/add-logging');
83
+ expect(result).toMatch(/\.totem[/\\]journal[/\\]\d{4}-\d{2}-\d{2}-add-logging\.md$/);
84
+ });
85
+ it('uses session slug for main branch', () => {
86
+ const result = resolveJournalPath('/repo', '.totem', 'main');
87
+ expect(result).toMatch(/\.totem[/\\]journal[/\\]\d{4}-\d{2}-\d{2}-session\.md$/);
88
+ });
89
+ });
90
+ // ─── buildJournalScaffold ─────────────────────────────
91
+ describe('buildJournalScaffold', () => {
92
+ it('includes human-editable sections at the top', () => {
93
+ const output = buildJournalScaffold('main', '', '', 'abc1234 initial commit', '');
94
+ expect(output).toContain('## What Shipped');
95
+ expect(output).toContain('## Architectural Decisions');
96
+ expect(output).toContain('## Open Tickets');
97
+ expect(output).toContain('## Next Steps');
98
+ });
99
+ it('includes deterministic git state below the separator', () => {
100
+ const output = buildJournalScaffold('feat/test', ' M src/app.ts', ' src/app.ts | 5 ++---', 'def5678 second commit', '');
62
101
  expect(output).toContain('feat/test; dirty working tree');
63
102
  expect(output).toContain('M src/app.ts');
64
- expect(output).toContain('new-file.ts');
65
103
  expect(output).toContain('5 ++---');
66
104
  expect(output).toContain('def5678 second commit');
67
- expect(output).toContain('No lessons file found.');
68
105
  });
69
- it('handles empty commits and lessons', () => {
70
- const output = buildLiteHandoff('main', '', '', '', '');
106
+ it('shows clean working tree when status is empty', () => {
107
+ const output = buildJournalScaffold('main', '', '', '', '');
71
108
  expect(output).toContain('clean working tree');
109
+ expect(output).toContain('Working tree is clean.');
72
110
  expect(output).toContain('No commits found.');
73
111
  expect(output).toContain('No lessons file found.');
74
112
  });
75
113
  it('strips ANSI escape sequences from git output', () => {
76
- const output = buildLiteHandoff('\x1b[32mmain\x1b[0m', ' \x1b[31mM\x1b[0m src/app.ts', ' src/app.ts | 5 \x1b[32m++\x1b[31m---\x1b[0m', '\x1b[33mabc1234\x1b[0m initial commit', '');
114
+ const output = buildJournalScaffold('\x1b[32mmain\x1b[0m', ' \x1b[31mM\x1b[0m src/app.ts', ' src/app.ts | 5 \x1b[32m++\x1b[31m---\x1b[0m', '\x1b[33mabc1234\x1b[0m initial commit', '');
77
115
  expect(output).not.toContain('\x1b[');
78
- expect(output).toContain('main; dirty working tree');
79
- expect(output).toContain('M src/app.ts');
116
+ expect(output).toContain('main');
80
117
  expect(output).toContain('abc1234 initial commit');
81
118
  });
82
- });
83
- // ─── gatherDeterministicState ───────────────────────
84
- vi.mock('../git.js', async (importOriginal) => {
85
- const actual = (await importOriginal());
86
- return {
87
- ...actual,
88
- getGitBranch: vi.fn().mockReturnValue('main'),
89
- getGitStatus: vi.fn().mockReturnValue(''),
90
- };
91
- });
92
- describe('gatherDeterministicState', () => {
93
- let mockGetGitBranch;
94
- let mockGetGitStatus;
95
- beforeEach(async () => {
96
- const git = await import('../git.js');
97
- mockGetGitBranch = git.getGitBranch;
98
- mockGetGitStatus = git.getGitStatus;
99
- });
100
- afterEach(() => {
101
- vi.restoreAllMocks();
102
- });
103
- it('extracts active files from git status safely handling detached HEAD', async () => {
104
- mockGetGitBranch.mockImplementation(() => {
105
- throw new Error('not a git repository');
106
- });
107
- mockGetGitStatus.mockReturnValue(' M src/foo.ts\n?? src/bar.ts\nA src/baz.ts');
108
- const result = await gatherDeterministicState('/tmp/test');
109
- expect(result.branch).toBe('HEAD');
110
- expect(result.active_files).toContain('src/foo.ts');
111
- expect(result.active_files).toContain('src/bar.ts');
112
- expect(result.active_files).toContain('src/baz.ts');
113
- expect(result.active_files).toHaveLength(3);
114
- });
115
- it('extracts active files from normal branch', async () => {
116
- mockGetGitBranch.mockReturnValue('feat/checkpoint');
117
- mockGetGitStatus.mockReturnValue(' M src/app.ts\n?? README.md');
118
- const result = await gatherDeterministicState('/tmp/test');
119
- expect(result.branch).toBe('feat/checkpoint');
120
- expect(result.active_files).toEqual(['README.md', 'src/app.ts']);
121
- });
122
- it('returns empty active_files when working tree is clean', async () => {
123
- mockGetGitBranch.mockReturnValue('main');
124
- mockGetGitStatus.mockReturnValue('');
125
- const result = await gatherDeterministicState('/tmp/test');
126
- expect(result.active_files).toEqual([]);
127
- });
128
- it('sets checkpoint_version to 1 and timestamp is valid ISO', async () => {
129
- mockGetGitBranch.mockReturnValue('main');
130
- mockGetGitStatus.mockReturnValue('');
131
- const result = await gatherDeterministicState('/tmp/test');
132
- expect(result.checkpoint_version).toBe(1);
133
- const parsed = new Date(result.timestamp);
134
- expect(parsed.toISOString()).toBe(result.timestamp);
135
- expect(result.open_prs).toEqual([]);
136
- });
137
- it('strips C-style quotes from paths with spaces', async () => {
138
- mockGetGitBranch.mockReturnValue('main');
139
- mockGetGitStatus.mockReturnValue(' M "src/my file.ts"\n?? "docs/read me.md"');
140
- const result = await gatherDeterministicState('/tmp/test');
141
- expect(result.active_files).toEqual(['docs/read me.md', 'src/my file.ts']);
142
- });
143
- it('falls back to HEAD when getGitBranch returns empty string', async () => {
144
- mockGetGitBranch.mockReturnValue('');
145
- mockGetGitStatus.mockReturnValue('');
146
- const result = await gatherDeterministicState('/tmp/test');
147
- expect(result.branch).toBe('HEAD');
148
- });
149
- it('falls back to HEAD when getGitBranch returns (unknown)', async () => {
150
- mockGetGitBranch.mockReturnValue('(unknown)');
151
- mockGetGitStatus.mockReturnValue('');
152
- const result = await gatherDeterministicState('/tmp/test');
153
- expect(result.branch).toBe('HEAD');
154
- });
155
- });
156
- // ─── parseSemanticFields (Task 3) ───────────────────
157
- describe('parseSemanticFields', () => {
158
- it('extracts sections from markdown', () => {
159
- const markdown = [
160
- '### Branch & State',
161
- 'feat/test; dirty working tree.',
162
- '',
163
- '### What Was Done',
164
- '- Implemented the schema validation',
165
- '- Added unit tests for the parser',
166
- '',
167
- '### Uncommitted Changes',
168
- '- Modified handoff.ts with new logic',
169
- '',
170
- '### Lessons & Traps',
171
- '- Always validate with Zod before writing',
172
- '- Watch out for Windows path separators',
173
- '',
174
- '### Next Steps',
175
- '1. Wire up the atomic file writer',
176
- '2. Add integration tests',
177
- '3. Run the full test suite',
178
- ].join('\n');
179
- const result = parseSemanticFields(markdown);
180
- expect(result.completed).toEqual([
181
- 'Implemented the schema validation',
182
- 'Added unit tests for the parser',
183
- ]);
184
- expect(result.remaining).toEqual([
185
- 'Wire up the atomic file writer',
186
- 'Add integration tests',
187
- 'Run the full test suite',
188
- ]);
189
- expect(result.context_hints).toEqual([
190
- 'Always validate with Zod before writing',
191
- 'Watch out for Windows path separators',
192
- ]);
193
- expect(result.pending_decisions).toEqual(['Modified handoff.ts with new logic']);
194
- });
195
- it('returns empty arrays for malformed input', () => {
196
- const empty = parseSemanticFields('');
197
- expect(empty.completed).toEqual([]);
198
- expect(empty.remaining).toEqual([]);
199
- expect(empty.pending_decisions).toEqual([]);
200
- expect(empty.context_hints).toEqual([]);
201
- const garbage = parseSemanticFields('foo bar baz\nno headings here\n!!!');
202
- expect(garbage.completed).toEqual([]);
203
- expect(garbage.remaining).toEqual([]);
204
- expect(garbage.pending_decisions).toEqual([]);
205
- expect(garbage.context_hints).toEqual([]);
206
- });
207
- it('handles ## headings as well as ###', () => {
208
- const markdown = [
209
- '## What Was Done',
210
- '- Finished the feature',
211
- '',
212
- '## Next Steps',
213
- '- Deploy to staging',
214
- ].join('\n');
215
- const result = parseSemanticFields(markdown);
216
- expect(result.completed).toEqual(['Finished the feature']);
217
- expect(result.remaining).toEqual(['Deploy to staging']);
218
- });
219
- it('handles non-bullet content lines', () => {
220
- const markdown = ['### What Was Done', 'Implemented the schema.', 'Added tests.'].join('\n');
221
- const result = parseSemanticFields(markdown);
222
- expect(result.completed).toEqual(['Implemented the schema.', 'Added tests.']);
223
- });
224
- });
225
- // ─── Lite mode checkpoint (Task 3) ──────────────────
226
- describe('lite mode checkpoint', () => {
227
- it('bypasses LLM execution when lite flag is provided and returns empty semantic arrays', async () => {
228
- const git = await import('../git.js');
229
- const mockBranch = git.getGitBranch;
230
- const mockStatus = git.getGitStatus;
231
- mockBranch.mockReturnValue('feat/lite-test');
232
- mockStatus.mockReturnValue(' M src/foo.ts');
233
- const state = await gatherDeterministicState('/tmp/test');
234
- const checkpoint = HandoffCheckpointSchema.parse(state);
235
- expect(checkpoint.checkpoint_version).toBe(1);
236
- expect(checkpoint.branch).toBe('feat/lite-test');
237
- expect(checkpoint.active_files).toEqual(['src/foo.ts']);
238
- expect(checkpoint.completed).toEqual([]);
239
- expect(checkpoint.remaining).toEqual([]);
240
- expect(checkpoint.pending_decisions).toEqual([]);
241
- expect(checkpoint.context_hints).toEqual([]);
242
- });
243
- });
244
- // ─── writeCheckpoint & resolveCheckpointPath (Task 4) ───
245
- describe('writeCheckpoint', () => {
246
- let tmpDir;
247
- beforeEach(() => {
248
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-checkpoint-'));
249
- });
250
- afterEach(() => {
251
- cleanTmpDir(tmpDir);
252
- });
253
- it('writes checkpoint json atomically alongside markdown', () => {
254
- const mdPath = path.join(tmpDir, 'handoff.md');
255
- const jsonPath = path.join(tmpDir, 'handoff.json');
256
- fs.writeFileSync(mdPath, '### Branch & State\nmain; clean.', 'utf-8');
257
- const checkpoint = HandoffCheckpointSchema.parse({
258
- checkpoint_version: 1,
259
- timestamp: new Date().toISOString(),
260
- branch: 'main',
261
- active_files: ['src/app.ts'],
262
- completed: ['Implemented feature X'],
263
- remaining: ['Add tests'],
264
- });
265
- writeCheckpoint(jsonPath, checkpoint);
266
- expect(fs.existsSync(mdPath)).toBe(true);
267
- expect(fs.existsSync(jsonPath)).toBe(true);
268
- const raw = JSON.parse(fs.readFileSync(jsonPath, 'utf-8'));
269
- const parsed = HandoffCheckpointSchema.parse(raw);
270
- expect(parsed.branch).toBe('main');
271
- expect(parsed.active_files).toEqual(['src/app.ts']);
272
- expect(parsed.completed).toEqual(['Implemented feature X']);
273
- expect(parsed.remaining).toEqual(['Add tests']);
274
- expect(fs.existsSync(jsonPath + '.tmp')).toBe(false);
275
- });
276
- it('creates parent directories if they do not exist', () => {
277
- const nested = path.join(tmpDir, 'deep', 'nested');
278
- const jsonPath = path.join(nested, 'checkpoint.json');
279
- const checkpoint = HandoffCheckpointSchema.parse({
280
- checkpoint_version: 1,
281
- timestamp: new Date().toISOString(),
282
- branch: 'main',
283
- active_files: [],
284
- });
285
- writeCheckpoint(jsonPath, checkpoint);
286
- expect(fs.existsSync(jsonPath)).toBe(true);
287
- });
288
- it('writes checkpoint to .totem/handoff.json when no --out specified', () => {
289
- const totemDir = path.join(tmpDir, '.totem');
290
- fs.mkdirSync(totemDir, { recursive: true });
291
- const jsonPath = resolveCheckpointPath(tmpDir, '.totem');
292
- expect(jsonPath).toBe(path.join(tmpDir, '.totem', 'handoff.json'));
293
- const checkpoint = HandoffCheckpointSchema.parse({
294
- checkpoint_version: 1,
295
- timestamp: new Date().toISOString(),
296
- branch: 'feat/no-out',
297
- active_files: ['src/index.ts'],
298
- completed: ['Setup project'],
299
- });
300
- writeCheckpoint(jsonPath, checkpoint);
301
- expect(fs.existsSync(jsonPath)).toBe(true);
302
- const raw = JSON.parse(fs.readFileSync(jsonPath, 'utf-8'));
303
- const parsed = HandoffCheckpointSchema.parse(raw);
304
- expect(parsed.branch).toBe('feat/no-out');
305
- expect(parsed.active_files).toEqual(['src/index.ts']);
306
- });
307
- });
308
- // ─── resolveCheckpointPath ──────────────────────────
309
- describe('resolveCheckpointPath', () => {
310
- let tmpDir;
311
- beforeEach(() => {
312
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-resolve-'));
313
- });
314
- afterEach(() => {
315
- cleanTmpDir(tmpDir);
316
- });
317
- it('returns .json companion when --out has .md extension', () => {
318
- const result = resolveCheckpointPath(tmpDir, '.totem', '/some/path/handoff.md');
319
- expect(result).toBe('/some/path/handoff.json');
320
- });
321
- it('returns .json companion when --out has no extension', () => {
322
- const result = resolveCheckpointPath(tmpDir, '.totem', '/some/path/handoff');
323
- expect(result).toBe('/some/path/handoff.json');
324
- });
325
- it('returns totemDir/handoff.json when no --out', () => {
326
- const result = resolveCheckpointPath(tmpDir, '.totem');
327
- expect(result).toBe(path.join(tmpDir, '.totem', 'handoff.json'));
328
- });
329
- it('uses custom totemDir when configured', () => {
330
- const result = resolveCheckpointPath(tmpDir, '.governance');
331
- expect(result).toBe(path.join(tmpDir, '.governance', 'handoff.json'));
332
- });
333
- it('replaces .txt extension with .json', () => {
334
- const result = resolveCheckpointPath(tmpDir, '.totem', '/output/report.txt');
335
- expect(result).toBe('/output/report.json');
119
+ it('includes lesson line count when lessons exist', () => {
120
+ const output = buildJournalScaffold('main', '', '', '', 'Line 1\nLine 2\nLine 3');
121
+ expect(output).toContain('3 lines in lessons file');
336
122
  });
337
- it('avoids collision when --out already ends in .json', () => {
338
- const result = resolveCheckpointPath(tmpDir, '.totem', '/output/handoff.json');
339
- expect(result).toBe('/output/handoff.checkpoint.json');
123
+ it('includes date in the title heading', () => {
124
+ const output = buildJournalScaffold('feat/test', '', '', '', '');
125
+ // Should start with # YYYY-MM-DD — feat/test
126
+ expect(output).toMatch(/^# \d{4}-\d{2}-\d{2} — feat\/test/);
340
127
  });
341
128
  });
342
129
  //# sourceMappingURL=handoff.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handoff.test.js","sourceRoot":"","sources":["../../src/commands/handoff.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handoff.test.js","sourceRoot":"","sources":["../../src/commands/handoff.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkGrE"}
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmGrE"}
@@ -27,7 +27,7 @@ export async function lintCommand(options) {
27
27
  const lessonsDir = path.join(cwd, config.totemDir, 'lessons');
28
28
  const currentInputHash = generateInputHash(lessonsDir);
29
29
  if (currentInputHash !== manifest.input_hash) {
30
- uiLog.warn(TAG, "Compile manifest is stale — lessons changed since last compile. Run 'totem compile' to update.");
30
+ uiLog.warn(TAG, "Compile manifest is stale — lessons changed since last compile. Run 'totem lesson compile' to update.");
31
31
  }
32
32
  }
33
33
  }
@@ -50,6 +50,7 @@ export async function lintCommand(options) {
50
50
  ignorePatterns: allIgnore,
51
51
  tag: TAG,
52
52
  configRoot,
53
+ isStaged: !!options.staged,
53
54
  });
54
55
  // Post PR comment if requested (zero-API-keys invariant: only behind --pr-comment flag)
55
56
  if (options.prComment == null)
@@ -1 +1 @@
1
- {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,8 @@ export interface RunCompiledRulesOptions {
11
11
  tag: string;
12
12
  /** Absolute path to config root — used for cache paths instead of cwd */
13
13
  configRoot?: string;
14
+ /** True if we are linting staged changes only */
15
+ isStaged?: boolean;
14
16
  }
15
17
  export interface RunCompiledRulesResult {
16
18
  violations: Violation[];
@@ -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,EAAoB,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE5F,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;CACrB;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,CAwSjC"}
1
+ {"version":3,"file":"run-compiled-rules.d.ts","sourceRoot":"","sources":["../../src/commands/run-compiled-rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAoB,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE5F,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,CAmXjC"}
@@ -9,8 +9,8 @@ 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, saveRuleMetrics, setCoreLogger, TotemError, } = await import('@mmnto/totem');
13
- const { diff, cwd, totemDir, format, outPath, exportPaths, ignorePatterns, tag } = options;
12
+ const { applyAstRulesToAdditions, applyRulesToAdditions, enrichWithAstContext, extractAddedLines, loadCompiledRules, loadRuleMetrics, matchesGlob, recordContextHit, recordSuppression, recordTrigger, resolveGitRoot, safeExec, saveRuleMetrics, setCoreLogger, TotemError, } = await import('@mmnto/totem');
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) });
16
16
  try {
@@ -22,7 +22,26 @@ export async function runCompiledRules(options) {
22
22
  throw new TotemError('NO_RULES', `No compiled rules found at ${totemDir}/${COMPILED_RULES_FILE}.`, "Run 'totem compile' to generate rules.");
23
23
  }
24
24
  log.info(tag, `Running ${rules.length} rules (zero LLM)...`);
25
- // Extract additions, exclude compiled rules file and export targets
25
+ // Extract additions, exclude compiled rules file, export targets, and binary files
26
+ const BINARY_EXTENSIONS = new Set([
27
+ '.png',
28
+ '.jpg',
29
+ '.jpeg',
30
+ '.gif',
31
+ '.mp4',
32
+ '.pdf',
33
+ '.zip',
34
+ '.tar',
35
+ '.gz',
36
+ '.woff',
37
+ '.woff2',
38
+ '.eot',
39
+ '.ttf',
40
+ '.mp3',
41
+ '.wav',
42
+ '.ico',
43
+ '.bin',
44
+ ]);
26
45
  const rulesRelPath = path.join(totemDir, COMPILED_RULES_FILE).replace(/\\/g, '/');
27
46
  const excluded = new Set([rulesRelPath]);
28
47
  if (exportPaths) {
@@ -32,10 +51,14 @@ export async function runCompiledRules(options) {
32
51
  }
33
52
  const additions = extractAddedLines(diff)
34
53
  .filter((a) => !excluded.has(a.file))
54
+ .filter((a) => !BINARY_EXTENSIONS.has(path.extname(a.file).toLowerCase()))
35
55
  .filter((a) => !ignorePatterns || !ignorePatterns.some((pattern) => matchesGlob(a.file, pattern)));
56
+ // Resolve repo root once — git diff paths are always repo-root-relative,
57
+ // so both staged and non-staged paths need the repo root for file resolution.
58
+ const repoRoot = resolveGitRoot(cwd);
36
59
  // Enrich with AST context
37
60
  try {
38
- await enrichWithAstContext(additions, { cwd });
61
+ await enrichWithAstContext(additions, { cwd: repoRoot ?? cwd });
39
62
  const classified = additions.filter((a) => a.astContext !== undefined).length;
40
63
  if (classified > 0) {
41
64
  log.dim(tag, `AST classified ${classified}/${additions.length} additions`);
@@ -75,9 +98,44 @@ export async function runCompiledRules(options) {
75
98
  if (astRules.length > 0) {
76
99
  log.dim(tag, `Running ${astRules.length} AST rule(s)...`);
77
100
  try {
78
- astViolations = await applyAstRulesToAdditions(rules, additions, cwd, ruleEventCallback, (msg) => log.warn(tag, msg));
101
+ const workingDirectory = repoRoot ?? cwd;
102
+ let readStrategy = undefined;
103
+ if (isStaged) {
104
+ if (repoRoot) {
105
+ readStrategy = async (filePath) => {
106
+ try {
107
+ // 1. Detect symlinks explicitly (git ls-files -s returns mode 120000).
108
+ // The `--` separator prevents filePath values starting with `-` from
109
+ // being interpreted as git options.
110
+ const lsOutput = safeExec('git', ['ls-files', '--recurse-submodules', '-s', '--', filePath], { cwd: repoRoot, env: { ...process.env, LC_ALL: 'C' } });
111
+ if (lsOutput.startsWith('120000 ')) {
112
+ return null; // Explicitly exclude symlinks from AST checks
113
+ }
114
+ // 2. Read staged content
115
+ const content = safeExec('git', ['show', `:${filePath}`], {
116
+ cwd: repoRoot,
117
+ trim: false,
118
+ env: { ...process.env, LC_ALL: 'C' },
119
+ });
120
+ // 3. Normalize CRLF to LF specifically for the staged callback
121
+ // Disk-read callback preserves existing behavior per Invariant #4.
122
+ return content.replace(/\r\n/g, '\n');
123
+ }
124
+ catch (err) {
125
+ // Explicit throw per Failure Mode 1 decision
126
+ throw new TotemError('STAGED_READ_FAILED', `Failed to read staged content for ${filePath}`, `git show :${filePath} failed. The file may not exist in the index or may be staged for deletion. Ensure --staged is used correctly.`, { cause: err });
127
+ }
128
+ };
129
+ }
130
+ }
131
+ astViolations = await applyAstRulesToAdditions(rules, additions, workingDirectory, ruleEventCallback, (msg) => log.warn(tag, msg), readStrategy);
79
132
  }
80
133
  catch (err) {
134
+ // STAGED_READ_FAILED must propagate — the pre-commit guarantee depends
135
+ // on surfacing staged-read failures rather than silently falling back.
136
+ if (err instanceof TotemError && err.code === 'STAGED_READ_FAILED') {
137
+ throw err;
138
+ }
81
139
  const msg = err instanceof Error ? err.message : String(err);
82
140
  const isWasmFailure = /not initialized|wasm|web-tree-sitter/i.test(msg);
83
141
  if (process.env['TOTEM_LITE'] === '1' && isWasmFailure) {