@mmnto/cli 1.14.17 → 1.15.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.
@@ -0,0 +1,525 @@
1
+ import * as fs from 'node:fs';
2
+ import * as os from 'node:os';
3
+ import * as path from 'node:path';
4
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
+ import { cleanTmpDir } from '../test-utils.js';
6
+ function makeTmpDir(prefix = 'totem-gov-') {
7
+ // Canonicalize via `realpathSync.native` so the tmp path collapses to the
8
+ // same form `git rev-parse --show-toplevel` returns. `.native` is required
9
+ // because plain `realpathSync` resolves POSIX symlinks (macOS `/tmp ->
10
+ // /private/tmp`) but NOT Windows 8.3 short names (`C:\Users\RUNNER~1\...`
11
+ // → `C:\Users\runneradmin\...`). Without `.native`, path-equality
12
+ // assertions fail on windows-latest CI while passing on macos and ubuntu.
13
+ return fs.realpathSync.native(fs.mkdtempSync(path.join(os.tmpdir(), prefix)));
14
+ }
15
+ function initGit(dir) {
16
+ // Minimal git scaffold to satisfy `git rev-parse --show-toplevel`.
17
+ fs.mkdirSync(path.join(dir, '.git'), { recursive: true });
18
+ fs.writeFileSync(path.join(dir, '.git', 'HEAD'), 'ref: refs/heads/main\n', 'utf-8');
19
+ fs.writeFileSync(path.join(dir, '.git', 'config'), '[core]\n\trepositoryformatversion = 0\n', 'utf-8');
20
+ fs.mkdirSync(path.join(dir, '.git', 'objects'), { recursive: true });
21
+ fs.mkdirSync(path.join(dir, '.git', 'refs', 'heads'), { recursive: true });
22
+ }
23
+ describe('resolveGovernancePaths', () => {
24
+ let tmpDir;
25
+ let originalCwd;
26
+ beforeEach(() => {
27
+ tmpDir = makeTmpDir();
28
+ originalCwd = process.cwd();
29
+ });
30
+ afterEach(() => {
31
+ process.chdir(originalCwd);
32
+ cleanTmpDir(tmpDir);
33
+ });
34
+ it('resolves submodule strategy path when `.strategy/` exists alongside cwd', async () => {
35
+ initGit(tmpDir);
36
+ const strategyDir = path.join(tmpDir, '.strategy');
37
+ fs.mkdirSync(path.join(strategyDir, 'proposals', 'active'), { recursive: true });
38
+ fs.mkdirSync(path.join(strategyDir, 'adr'), { recursive: true });
39
+ const { resolveGovernancePaths } = await import('./governance.js');
40
+ const paths = resolveGovernancePaths(tmpDir, 'proposal');
41
+ expect(paths.rootDir).toBe(path.normalize(strategyDir));
42
+ expect(paths.targetDir).toBe(path.normalize(path.join(strategyDir, 'proposals', 'active')));
43
+ expect(paths.dashboardFile).toBe(path.normalize(path.join(strategyDir, 'README.md')));
44
+ expect(paths.templatePath).toBe(path.normalize(path.join(strategyDir, 'templates', 'proposal.md')));
45
+ });
46
+ it('resolves standalone strategy path when submodule prefix is missing', async () => {
47
+ initGit(tmpDir);
48
+ // Standalone strategy repo — `proposals/active/` lives at the git root, no `.strategy/` prefix.
49
+ fs.mkdirSync(path.join(tmpDir, 'proposals', 'active'), { recursive: true });
50
+ fs.mkdirSync(path.join(tmpDir, 'adr'), { recursive: true });
51
+ const { resolveGovernancePaths } = await import('./governance.js');
52
+ const paths = resolveGovernancePaths(tmpDir, 'adr');
53
+ expect(paths.rootDir).toBe(path.normalize(tmpDir));
54
+ expect(paths.targetDir).toBe(path.normalize(path.join(tmpDir, 'adr')));
55
+ expect(paths.dashboardFile).toBe(path.normalize(path.join(tmpDir, 'README.md')));
56
+ expect(paths.templatePath).toBe(path.normalize(path.join(tmpDir, 'templates', 'adr.md')));
57
+ });
58
+ it('throws TotemError when cwd is not inside a git repository', async () => {
59
+ // tmpDir has no `.git/`; resolveGitRoot returns null.
60
+ const { resolveGovernancePaths } = await import('./governance.js');
61
+ expect(() => resolveGovernancePaths(tmpDir, 'proposal')).toThrow(/not inside a git repo/i);
62
+ });
63
+ it('throws TotemError when no strategy layout is found', async () => {
64
+ initGit(tmpDir);
65
+ // Neither `.strategy/proposals/` nor top-level `proposals/`.
66
+ const { resolveGovernancePaths } = await import('./governance.js');
67
+ expect(() => resolveGovernancePaths(tmpDir, 'proposal')).toThrow(/strategy/i);
68
+ });
69
+ });
70
+ describe('getNextArtifactId', () => {
71
+ let tmpDir;
72
+ beforeEach(() => {
73
+ tmpDir = makeTmpDir('totem-gov-id-');
74
+ });
75
+ afterEach(() => {
76
+ cleanTmpDir(tmpDir);
77
+ });
78
+ it('returns 001 when target directory is empty', async () => {
79
+ const { getNextArtifactId } = await import('./governance.js');
80
+ expect(getNextArtifactId(tmpDir)).toBe('001');
81
+ });
82
+ it('returns 001 when target directory does not exist', async () => {
83
+ const missing = path.join(tmpDir, 'never-created');
84
+ const { getNextArtifactId } = await import('./governance.js');
85
+ expect(getNextArtifactId(missing)).toBe('001');
86
+ });
87
+ it('calculates correct next id when numerical gaps exist in directory', async () => {
88
+ // Seed with 001 and 003 — next must be 004, NOT 002 (gap logic).
89
+ fs.writeFileSync(path.join(tmpDir, '001-a.md'), '# A\n', 'utf-8');
90
+ fs.writeFileSync(path.join(tmpDir, '003-b.md'), '# B\n', 'utf-8');
91
+ const { getNextArtifactId } = await import('./governance.js');
92
+ expect(getNextArtifactId(tmpDir)).toBe('004');
93
+ });
94
+ it('ignores files that do not match the NNN-title.md pattern', async () => {
95
+ fs.writeFileSync(path.join(tmpDir, 'README.md'), '# R\n', 'utf-8');
96
+ fs.writeFileSync(path.join(tmpDir, 'notes.txt'), 'x', 'utf-8');
97
+ fs.writeFileSync(path.join(tmpDir, '42-not-padded.md'), '# x\n', 'utf-8');
98
+ fs.writeFileSync(path.join(tmpDir, '010-valid.md'), '# v\n', 'utf-8');
99
+ const { getNextArtifactId } = await import('./governance.js');
100
+ expect(getNextArtifactId(tmpDir)).toBe('011');
101
+ });
102
+ it('throws when NNN-prefix space is saturated (>999)', async () => {
103
+ fs.writeFileSync(path.join(tmpDir, '999-final.md'), '# x\n', 'utf-8');
104
+ const { getNextArtifactId } = await import('./governance.js');
105
+ expect(() => getNextArtifactId(tmpDir)).toThrow(/saturated|overflow|999/i);
106
+ });
107
+ });
108
+ describe('formatArtifactFilename', () => {
109
+ it('produces kebab-case with NNN- prefix', async () => {
110
+ const { formatArtifactFilename } = await import('./governance.js');
111
+ expect(formatArtifactFilename('001', 'Feature Branch Workflow')).toBe('001-feature-branch-workflow.md');
112
+ });
113
+ it('sanitizes special characters into hyphens', async () => {
114
+ const { formatArtifactFilename } = await import('./governance.js');
115
+ expect(formatArtifactFilename('042', 'LLM caching (v2) / Verifier')).toBe('042-llm-caching-v2-verifier.md');
116
+ });
117
+ it('is deterministic across runs for the same title', async () => {
118
+ const { formatArtifactFilename } = await import('./governance.js');
119
+ const a = formatArtifactFilename('007', 'Totem Ingestion Pipeline');
120
+ const b = formatArtifactFilename('007', 'Totem Ingestion Pipeline');
121
+ expect(a).toBe(b);
122
+ expect(a).toBe('007-totem-ingestion-pipeline.md');
123
+ });
124
+ it('throws when title sanitization produces an empty slug', async () => {
125
+ const { formatArtifactFilename } = await import('./governance.js');
126
+ expect(() => formatArtifactFilename('001', '!!!---???')).toThrow(/empty slug/i);
127
+ });
128
+ it('collapses runs of hyphens and trims leading/trailing hyphens', async () => {
129
+ const { formatArtifactFilename } = await import('./governance.js');
130
+ expect(formatArtifactFilename('050', ' ---Alpha Beta--- ')).toBe('050-alpha-beta.md');
131
+ });
132
+ });
133
+ describe('sanitizeArtifactTitle', () => {
134
+ it('replaces newlines, tabs, and other C0 control characters with spaces', async () => {
135
+ const { sanitizeArtifactTitle } = await import('./governance.js');
136
+ expect(sanitizeArtifactTitle('Fix\n## Fake Heading')).toBe('Fix ## Fake Heading');
137
+ expect(sanitizeArtifactTitle('Multi\tline\rtext')).toBe('Multi line text');
138
+ expect(sanitizeArtifactTitle('bellecho')).toBe('bell echo');
139
+ });
140
+ it('strips DEL (0x7F)', async () => {
141
+ const { sanitizeArtifactTitle } = await import('./governance.js');
142
+ expect(sanitizeArtifactTitle('helloworld')).toBe('hello world');
143
+ });
144
+ it('collapses runs of whitespace and trims edges', async () => {
145
+ const { sanitizeArtifactTitle } = await import('./governance.js');
146
+ expect(sanitizeArtifactTitle(' multiple spaces ')).toBe('multiple spaces');
147
+ });
148
+ it('preserves `#` and other markdown-meaningful characters that stay single-line-safe', async () => {
149
+ const { sanitizeArtifactTitle } = await import('./governance.js');
150
+ // `#` inside a single-line heading is still part of the h1, so we don't strip it.
151
+ expect(sanitizeArtifactTitle('Add # char support')).toBe('Add # char support');
152
+ // Same for `$`, `{`, `}` — the template renderer uses a keyed replacer so
153
+ // these cannot inject further substitutions.
154
+ expect(sanitizeArtifactTitle('Handle $foo and {{X}}')).toBe('Handle $foo and {{X}}');
155
+ });
156
+ });
157
+ describe('renderArtifactTemplate', () => {
158
+ let tmpDir;
159
+ beforeEach(() => {
160
+ tmpDir = makeTmpDir('totem-gov-tpl-');
161
+ });
162
+ afterEach(() => {
163
+ cleanTmpDir(tmpDir);
164
+ });
165
+ it('generates fallback template when physical template file is missing', async () => {
166
+ const missingTemplate = path.join(tmpDir, 'templates', 'proposal.md');
167
+ const { renderArtifactTemplate } = await import('./governance.js');
168
+ const rendered = renderArtifactTemplate({
169
+ type: 'proposal',
170
+ id: '005',
171
+ title: 'Ingestion Pipeline',
172
+ templatePath: missingTemplate,
173
+ date: '2026-04-21',
174
+ });
175
+ // Exact heading form for Proposals per ADR-091 — space separator.
176
+ expect(rendered).toContain('# Proposal 005: Ingestion Pipeline');
177
+ expect(rendered).toContain('**Status:** Draft');
178
+ expect(rendered).toContain('**Date:** 2026-04-21');
179
+ });
180
+ it('emits `# ADR NNN: Title` heading with space separator for adr type', async () => {
181
+ const { renderArtifactTemplate } = await import('./governance.js');
182
+ const rendered = renderArtifactTemplate({
183
+ type: 'adr',
184
+ id: '091',
185
+ title: 'Five-Stage Ingestion',
186
+ templatePath: path.join(tmpDir, 'nonexistent.md'),
187
+ date: '2026-04-21',
188
+ });
189
+ expect(rendered).toContain('# ADR 091: Five-Stage Ingestion');
190
+ // Defensive: must NOT use a hyphen separator (common GPT-style slip).
191
+ expect(rendered).not.toContain('# ADR-091');
192
+ expect(rendered).not.toContain('# ADR 091 -');
193
+ expect(rendered).toContain('**Status:** Draft');
194
+ expect(rendered).toContain('**Date:** 2026-04-21');
195
+ });
196
+ it('reads from disk and substitutes {{TITLE}} and {{DATE}} when template exists', async () => {
197
+ const tplDir = path.join(tmpDir, 'templates');
198
+ fs.mkdirSync(tplDir, { recursive: true });
199
+ const tplPath = path.join(tplDir, 'proposal.md');
200
+ fs.writeFileSync(tplPath, '# Proposal: {{TITLE}}\n\n**Date:** {{DATE}}\n\nBody here.\n', 'utf-8');
201
+ const { renderArtifactTemplate } = await import('./governance.js');
202
+ const rendered = renderArtifactTemplate({
203
+ type: 'proposal',
204
+ id: '012',
205
+ title: 'Example',
206
+ templatePath: tplPath,
207
+ date: '2026-04-21',
208
+ });
209
+ expect(rendered).toContain('# Proposal: Example');
210
+ expect(rendered).toContain('**Date:** 2026-04-21');
211
+ expect(rendered).not.toContain('{{TITLE}}');
212
+ expect(rendered).not.toContain('{{DATE}}');
213
+ });
214
+ it('replaces ALL occurrences of template variables', async () => {
215
+ const tplDir = path.join(tmpDir, 'templates');
216
+ fs.mkdirSync(tplDir, { recursive: true });
217
+ const tplPath = path.join(tplDir, 'adr.md');
218
+ fs.writeFileSync(tplPath, '{{TITLE}} / {{TITLE}} / {{DATE}} / {{DATE}}\n', 'utf-8');
219
+ const { renderArtifactTemplate } = await import('./governance.js');
220
+ const rendered = renderArtifactTemplate({
221
+ type: 'adr',
222
+ id: '001',
223
+ title: 'X',
224
+ templatePath: tplPath,
225
+ date: '2026-04-21',
226
+ });
227
+ // Both occurrences of each variable should be substituted.
228
+ expect(rendered).toBe('X / X / 2026-04-21 / 2026-04-21\n');
229
+ });
230
+ it('renders titles containing `$` characters literally (no back-reference interpretation)', async () => {
231
+ // `String.prototype.replace` interprets `$&`, `$1`, etc. in the
232
+ // replacement string as back-references. Titles can legitimately
233
+ // contain `$` (prices, shell variable names, etc.) and must not be
234
+ // mangled. The implementation uses a replacer-function form to dodge
235
+ // this trap; see PR #1429 for the canonical bug class.
236
+ const tplDir = path.join(tmpDir, 'templates');
237
+ fs.mkdirSync(tplDir, { recursive: true });
238
+ const tplPath = path.join(tplDir, 'proposal.md');
239
+ fs.writeFileSync(tplPath, '# {{TITLE}}\n', 'utf-8');
240
+ const { renderArtifactTemplate } = await import('./governance.js');
241
+ const rendered = renderArtifactTemplate({
242
+ type: 'proposal',
243
+ id: '001',
244
+ title: 'Fix $foo and $& and $1 in ledger',
245
+ templatePath: tplPath,
246
+ date: '2026-04-22',
247
+ });
248
+ expect(rendered).toBe('# Fix $foo and $& and $1 in ledger\n');
249
+ });
250
+ it('resists template-token injection from user-provided title (single-pass)', async () => {
251
+ // A naive sequential-replace implementation substitutes `{{DATE}}` from
252
+ // the title in pass 1, then the pass-2 DATE regex matches the freshly-
253
+ // inserted `{{DATE}}` and swaps in the date value. GCA caught this on
254
+ // PR #1615. Single-pass regex with keyed lookup eliminates the class.
255
+ const tplDir = path.join(tmpDir, 'templates');
256
+ fs.mkdirSync(tplDir, { recursive: true });
257
+ const tplPath = path.join(tplDir, 'adr.md');
258
+ fs.writeFileSync(tplPath, '{{TITLE}} / {{DATE}}\n', 'utf-8');
259
+ const { renderArtifactTemplate } = await import('./governance.js');
260
+ const rendered = renderArtifactTemplate({
261
+ type: 'adr',
262
+ id: '001',
263
+ title: '{{DATE}}',
264
+ templatePath: tplPath,
265
+ date: '2026-04-22',
266
+ });
267
+ // Title stays literal. The `{{DATE}}` in the template body resolves;
268
+ // the `{{DATE}}` inside the title does NOT.
269
+ expect(rendered).toBe('{{DATE}} / 2026-04-22\n');
270
+ });
271
+ });
272
+ describe('runPostScaffoldHooks', () => {
273
+ let tmpDir;
274
+ beforeEach(() => {
275
+ tmpDir = makeTmpDir('totem-gov-hooks-');
276
+ });
277
+ afterEach(() => {
278
+ cleanTmpDir(tmpDir);
279
+ });
280
+ it('runs docs:inject then git add on the two target paths', async () => {
281
+ const calls = [];
282
+ const exec = (cmd, args, cwdArg) => {
283
+ calls.push({ cmd, args, cwd: cwdArg });
284
+ };
285
+ const { runPostScaffoldHooks } = await import('./governance.js');
286
+ const result = runPostScaffoldHooks({
287
+ rootDir: tmpDir,
288
+ newFilePath: path.join(tmpDir, 'proposals', 'active', '001-x.md'),
289
+ dashboardFile: path.join(tmpDir, 'README.md'),
290
+ exec,
291
+ });
292
+ expect(result.dashboardRefreshed).toBe(true);
293
+ expect(result.staged).toBe(true);
294
+ expect(calls).toHaveLength(2);
295
+ expect(calls[0].cmd).toBe('pnpm');
296
+ expect(calls[0].args).toEqual(['run', 'docs:inject']);
297
+ expect(calls[0].cwd).toBe(tmpDir);
298
+ expect(calls[1].cmd).toBe('git');
299
+ // git add must stage ONLY the two specific paths, never `-A` or `.`.
300
+ expect(calls[1].args[0]).toBe('add');
301
+ expect(calls[1].args.slice(1)).toEqual([
302
+ path.join(tmpDir, 'proposals', 'active', '001-x.md'),
303
+ path.join(tmpDir, 'README.md'),
304
+ ]);
305
+ expect(calls[1].args).not.toContain('-A');
306
+ expect(calls[1].args).not.toContain('.');
307
+ });
308
+ it('stages artifact and readme without crashing if docs:inject fails', async () => {
309
+ const warnings = [];
310
+ const origWarn = console.error;
311
+ console.error = (msg) => {
312
+ warnings.push(String(msg));
313
+ };
314
+ try {
315
+ const calls = [];
316
+ const exec = (cmd, args) => {
317
+ calls.push({ cmd, args });
318
+ if (cmd === 'pnpm' && args.includes('docs:inject')) {
319
+ throw new Error('Command failed: pnpm run docs:inject\nMissing script: docs:inject');
320
+ }
321
+ };
322
+ const { runPostScaffoldHooks } = await import('./governance.js');
323
+ const result = runPostScaffoldHooks({
324
+ rootDir: tmpDir,
325
+ newFilePath: path.join(tmpDir, 'proposals', 'active', '001-x.md'),
326
+ dashboardFile: path.join(tmpDir, 'README.md'),
327
+ exec,
328
+ });
329
+ expect(result.dashboardRefreshed).toBe(false);
330
+ // git add still ran despite docs:inject failure (the artifact exists).
331
+ expect(result.staged).toBe(true);
332
+ const gitCall = calls.find((c) => c.cmd === 'git');
333
+ expect(gitCall).toBeDefined();
334
+ expect(gitCall.args[0]).toBe('add');
335
+ // A warning surfaced about the missing script.
336
+ const combined = warnings.join('\n');
337
+ expect(combined).toMatch(/docs:inject/i);
338
+ }
339
+ finally {
340
+ console.error = origWarn;
341
+ }
342
+ });
343
+ it('reports staged:false when git add fails but does not throw', async () => {
344
+ const warnings = [];
345
+ const origWarn = console.error;
346
+ console.error = (msg) => {
347
+ warnings.push(String(msg));
348
+ };
349
+ try {
350
+ const exec = (cmd, args) => {
351
+ if (cmd === 'git' && args[0] === 'add') {
352
+ throw new Error('fatal: pathspec did not match any files');
353
+ }
354
+ };
355
+ const { runPostScaffoldHooks } = await import('./governance.js');
356
+ const result = runPostScaffoldHooks({
357
+ rootDir: tmpDir,
358
+ newFilePath: path.join(tmpDir, 'proposals', 'active', '001-x.md'),
359
+ dashboardFile: path.join(tmpDir, 'README.md'),
360
+ exec,
361
+ });
362
+ expect(result.dashboardRefreshed).toBe(true);
363
+ expect(result.staged).toBe(false);
364
+ expect(warnings.join('\n')).toMatch(/stage|git add/i);
365
+ }
366
+ finally {
367
+ console.error = origWarn;
368
+ }
369
+ });
370
+ });
371
+ describe('scaffoldGovernanceArtifact (orchestrator)', () => {
372
+ let tmpDir;
373
+ let originalCwd;
374
+ beforeEach(() => {
375
+ tmpDir = makeTmpDir('totem-gov-orch-');
376
+ originalCwd = process.cwd();
377
+ });
378
+ afterEach(() => {
379
+ process.chdir(originalCwd);
380
+ cleanTmpDir(tmpDir);
381
+ });
382
+ it('creates file on disk with proposal heading and default Status/Date', async () => {
383
+ initGit(tmpDir);
384
+ fs.mkdirSync(path.join(tmpDir, 'proposals', 'active'), { recursive: true });
385
+ fs.mkdirSync(path.join(tmpDir, 'adr'), { recursive: true });
386
+ const calls = [];
387
+ const exec = (cmd, args) => {
388
+ calls.push({ cmd, args });
389
+ };
390
+ const { scaffoldGovernanceArtifact } = await import('./governance.js');
391
+ const result = scaffoldGovernanceArtifact({
392
+ type: 'proposal',
393
+ title: 'Feature Branch Workflow',
394
+ cwd: tmpDir,
395
+ }, { exec, date: '2026-04-21' });
396
+ expect(result.filename).toBe('001-feature-branch-workflow.md');
397
+ expect(result.id).toBe('001');
398
+ expect(result.dashboardRefreshed).toBe(true);
399
+ expect(result.staged).toBe(true);
400
+ const written = fs.readFileSync(result.filePath, 'utf-8');
401
+ expect(written).toContain('# Proposal 001: Feature Branch Workflow');
402
+ expect(written).toContain('**Status:** Draft');
403
+ expect(written).toContain('**Date:** 2026-04-21');
404
+ // git add ran with exactly the two paths.
405
+ const gitCall = calls.find((c) => c.cmd === 'git');
406
+ expect(gitCall.args).toEqual(['add', result.filePath, path.join(tmpDir, 'README.md')]);
407
+ });
408
+ it('creates file on disk with adr heading (space separator)', async () => {
409
+ initGit(tmpDir);
410
+ fs.mkdirSync(path.join(tmpDir, 'proposals', 'active'), { recursive: true });
411
+ fs.mkdirSync(path.join(tmpDir, 'adr'), { recursive: true });
412
+ const exec = () => { };
413
+ const { scaffoldGovernanceArtifact } = await import('./governance.js');
414
+ const result = scaffoldGovernanceArtifact({ type: 'adr', title: 'Database Sharding', cwd: tmpDir }, { exec, date: '2026-04-21' });
415
+ expect(result.filename).toBe('001-database-sharding.md');
416
+ const written = fs.readFileSync(result.filePath, 'utf-8');
417
+ // ADR-091 heading form with SPACE separator.
418
+ expect(written).toContain('# ADR 001: Database Sharding');
419
+ expect(written).not.toContain('# ADR-001');
420
+ });
421
+ it('sanitizes titles carrying newlines or control characters before templating', async () => {
422
+ // Caught by CodeRabbit on PR #1615. A title with embedded newlines
423
+ // would otherwise inject fresh markdown blocks into the scaffolded
424
+ // artifact. Orchestrator sanitizes at the entry so both filename and
425
+ // template body see the cleaned form.
426
+ initGit(tmpDir);
427
+ fs.mkdirSync(path.join(tmpDir, 'proposals', 'active'), { recursive: true });
428
+ const exec = () => { };
429
+ const { scaffoldGovernanceArtifact } = await import('./governance.js');
430
+ const result = scaffoldGovernanceArtifact({
431
+ type: 'proposal',
432
+ title: 'Fix the thing\n## Injected Fake Heading\n- Not a real list',
433
+ cwd: tmpDir,
434
+ }, { exec, date: '2026-04-22' });
435
+ const written = fs.readFileSync(result.filePath, 'utf-8');
436
+ // Heading is a single line; no injected newline-bounded blocks.
437
+ const lines = written.split('\n');
438
+ expect(lines[0]).toBe('# Proposal 001: Fix the thing ## Injected Fake Heading - Not a real list');
439
+ // Ensure no fresh `##` heading or `-` list item appears at line-start
440
+ // anywhere in the body above the template's own `## Problem Statement`.
441
+ const bodyLines = lines.slice(0, lines.findIndex((l) => l === '## Problem Statement'));
442
+ const injectedHeading = bodyLines.find((l, i) => i > 0 && l.startsWith('## '));
443
+ expect(injectedHeading).toBeUndefined();
444
+ });
445
+ it('creates file on disk even when docs:inject is missing', async () => {
446
+ initGit(tmpDir);
447
+ fs.mkdirSync(path.join(tmpDir, 'proposals', 'active'), { recursive: true });
448
+ const origWarn = console.error;
449
+ console.error = () => { };
450
+ try {
451
+ const exec = (cmd, args) => {
452
+ if (cmd === 'pnpm' && args.includes('docs:inject')) {
453
+ throw new Error('Missing script: "docs:inject"');
454
+ }
455
+ };
456
+ const { scaffoldGovernanceArtifact } = await import('./governance.js');
457
+ const result = scaffoldGovernanceArtifact({ type: 'proposal', title: 'Test', cwd: tmpDir }, { exec, date: '2026-04-21' });
458
+ expect(result.dashboardRefreshed).toBe(false);
459
+ // File must still be on disk despite docs:inject failing.
460
+ expect(fs.existsSync(result.filePath)).toBe(true);
461
+ }
462
+ finally {
463
+ console.error = origWarn;
464
+ }
465
+ });
466
+ it('respects gap numbering when seeding 001 + 003 (next is 004)', async () => {
467
+ initGit(tmpDir);
468
+ const target = path.join(tmpDir, 'proposals', 'active');
469
+ fs.mkdirSync(target, { recursive: true });
470
+ fs.writeFileSync(path.join(target, '001-alpha.md'), '# a\n', 'utf-8');
471
+ fs.writeFileSync(path.join(target, '003-beta.md'), '# b\n', 'utf-8');
472
+ const { scaffoldGovernanceArtifact } = await import('./governance.js');
473
+ const result = scaffoldGovernanceArtifact({ type: 'proposal', title: 'Gamma', cwd: tmpDir }, { exec: () => { }, date: '2026-04-21' });
474
+ expect(result.id).toBe('004');
475
+ expect(result.filename).toBe('004-gamma.md');
476
+ });
477
+ it('throws TotemError on exact filename collision without overwriting', async () => {
478
+ initGit(tmpDir);
479
+ const target = path.join(tmpDir, 'proposals', 'active');
480
+ fs.mkdirSync(target, { recursive: true });
481
+ // Seed with the exact filename the scaffolder would generate for this title:
482
+ // id=001 + slug='collide' ⇒ '001-collide.md'. We force this by ALSO seeding a
483
+ // higher-numbered file so getNextArtifactId returns 002, then we seed 002-collide.md
484
+ // so the collision path fires. Simpler: seed 001-keep-slot.md then 002-collide.md
485
+ // and ask for title 'Collide' — next id is 003, no collision. To force one, we
486
+ // patch the target so 001 is empty-of-slug but we put a pre-existing file at
487
+ // the exact next path:
488
+ const existingPath = path.join(target, '001-collide.md');
489
+ fs.writeFileSync(existingPath, 'ORIGINAL CONTENT — DO NOT OVERWRITE\n', 'utf-8');
490
+ // Drop a higher-numbered file so `getNextArtifactId` yields 002, NOT 001.
491
+ // Wait — this test is about EXACT collision. Reset: we want the computed
492
+ // filename to equal an existing file. The way to force that is to mock
493
+ // `getNextArtifactId` — but we don't have DI there. Instead, we seed:
494
+ // 001-collide.md (existing, will collide)
495
+ // and DELETE other files so next id would also be 001? No — next id is
496
+ // always max+1. So for exact collision we need the slug AND id to match
497
+ // a pre-existing file. Since id is always new, collision only happens if
498
+ // a NNN-slug.md with the same slug as our title already exists at the
499
+ // computed id. That can't happen via getNextArtifactId alone — UNLESS
500
+ // we allow the test to reach in via the `forceId` seam (test-only).
501
+ //
502
+ // Expose an optional `forceId` injection for deterministic collision tests.
503
+ fs.writeFileSync(path.join(target, '002-other.md'), '# other\n', 'utf-8');
504
+ const { scaffoldGovernanceArtifact } = await import('./governance.js');
505
+ expect(() => scaffoldGovernanceArtifact({ type: 'proposal', title: 'Collide', cwd: tmpDir }, { exec: () => { }, date: '2026-04-21', forceId: '001' })).toThrow(/already exists/i);
506
+ // Original content preserved.
507
+ expect(fs.readFileSync(existingPath, 'utf-8')).toBe('ORIGINAL CONTENT — DO NOT OVERWRITE\n');
508
+ });
509
+ it('throws TotemError BEFORE touching disk when title sanitizes to empty', async () => {
510
+ initGit(tmpDir);
511
+ fs.mkdirSync(path.join(tmpDir, 'proposals', 'active'), { recursive: true });
512
+ const execCalls = [];
513
+ const exec = (cmd) => {
514
+ execCalls.push(cmd);
515
+ };
516
+ const { scaffoldGovernanceArtifact } = await import('./governance.js');
517
+ expect(() => scaffoldGovernanceArtifact({ type: 'proposal', title: '???', cwd: tmpDir }, { exec, date: '2026-04-21' })).toThrow(/empty slug/i);
518
+ // No hooks ran — failure fired before exec seam was reached.
519
+ expect(execCalls).toEqual([]);
520
+ // No files written.
521
+ const entries = fs.readdirSync(path.join(tmpDir, 'proposals', 'active'));
522
+ expect(entries).toEqual([]);
523
+ });
524
+ });
525
+ //# sourceMappingURL=governance.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governance.test.js","sourceRoot":"","sources":["../../src/utils/governance.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmnto/cli",
3
- "version": "1.14.17",
3
+ "version": "1.15.1",
4
4
  "description": "CLI for Totem — AI persistent memory and context layer",
5
5
  "type": "module",
6
6
  "bin": {
@@ -24,7 +24,7 @@
24
24
  "smol-toml": "^1.6.1",
25
25
  "yaml": "^2.4.0",
26
26
  "zod": "^3.24.0",
27
- "@mmnto/totem": "1.14.17"
27
+ "@mmnto/totem": "1.15.1"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@anthropic-ai/sdk": "^0.78.0",