@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.
- package/dist/commands/compile-prune.test.d.ts +2 -0
- package/dist/commands/compile-prune.test.d.ts.map +1 -0
- package/dist/commands/compile-prune.test.js +116 -0
- package/dist/commands/compile-prune.test.js.map +1 -0
- package/dist/commands/compile.d.ts +37 -0
- package/dist/commands/compile.d.ts.map +1 -1
- package/dist/commands/compile.js +91 -4
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/doctor.d.ts +1 -1
- package/dist/commands/doctor.js +2 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/doctor.test.js +1 -1
- package/dist/commands/doctor.test.js.map +1 -1
- package/dist/commands/handoff.d.ts +17 -37
- package/dist/commands/handoff.d.ts.map +1 -1
- package/dist/commands/handoff.js +120 -273
- package/dist/commands/handoff.js.map +1 -1
- package/dist/commands/handoff.test.js +64 -277
- package/dist/commands/handoff.test.js.map +1 -1
- package/dist/commands/lint.d.ts.map +1 -1
- package/dist/commands/lint.js +2 -1
- package/dist/commands/lint.js.map +1 -1
- package/dist/commands/run-compiled-rules.d.ts +2 -0
- package/dist/commands/run-compiled-rules.d.ts.map +1 -1
- package/dist/commands/run-compiled-rules.js +63 -5
- package/dist/commands/run-compiled-rules.js.map +1 -1
- package/dist/commands/run-compiled-rules.test.js +382 -0
- package/dist/commands/run-compiled-rules.test.js.map +1 -1
- package/dist/commands/shield.js +2 -2
- package/dist/commands/shield.js.map +1 -1
- package/dist/commands/shield.test.js +1 -1
- package/dist/commands/shield.test.js.map +1 -1
- package/dist/help.d.ts.map +1 -1
- package/dist/help.js +0 -1
- package/dist/help.js.map +1 -1
- package/dist/index.js +8 -10
- package/dist/index.js.map +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +0 -1
- package/dist/utils.js.map +1 -1
- package/package.json +2 -2
- package/dist/schemas/handoff-checkpoint.d.ts +0 -34
- package/dist/schemas/handoff-checkpoint.d.ts.map +0 -1
- package/dist/schemas/handoff-checkpoint.js +0 -13
- package/dist/schemas/handoff-checkpoint.js.map +0 -1
- package/dist/schemas/handoff-checkpoint.test.d.ts +0 -2
- package/dist/schemas/handoff-checkpoint.test.d.ts.map +0 -1
- package/dist/schemas/handoff-checkpoint.test.js +0 -65
- 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
|
|
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 {
|
|
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
|
-
// ───
|
|
52
|
-
describe('
|
|
53
|
-
it('
|
|
54
|
-
|
|
55
|
-
expect(
|
|
56
|
-
expect(
|
|
57
|
-
expect(
|
|
58
|
-
expect(
|
|
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('
|
|
61
|
-
const
|
|
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('
|
|
70
|
-
const output =
|
|
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 =
|
|
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
|
|
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
|
-
|
|
84
|
-
|
|
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('
|
|
338
|
-
const
|
|
339
|
-
|
|
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,
|
|
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"}
|
package/dist/commands/lint.js
CHANGED
|
@@ -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":"AAYA,uDAAuD;AAEvD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB;IACpD,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IAC1D,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IAC/E,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;IAErE,MAAM,GAAG,GAAG,MAAM,CAAC;IACnB,MAAM,MAAM,GAAiB,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC;IACtD,MAAM,aAAa,GAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAChE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,gBAAgB,CACxB,qBAAqB,MAAM,oCAAoC,EAC/D,8CAA8C,EAC9C,gBAAgB,CACjB,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,CAAC;IACb,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;IAE5C,mEAAmE;IACnE,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;QAC9E,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,MAAM,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;YAChF,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC9D,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;YACvD,IAAI,gBAAgB,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;gBAC7C,KAAK,CAAC,IAAI,CACR,GAAG,EACH,
|
|
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;
|
|
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
|
|
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
|
-
|
|
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) {
|