@mmnto/cli 1.99.0 → 1.101.0

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 (63) hide show
  1. package/dist/commands/config-drift.test.js +5 -2
  2. package/dist/commands/config-drift.test.js.map +1 -1
  3. package/dist/commands/doctor-parity.d.ts.map +1 -1
  4. package/dist/commands/doctor-parity.js +57 -2
  5. package/dist/commands/doctor-parity.js.map +1 -1
  6. package/dist/commands/doctor-parity.test.js +60 -0
  7. package/dist/commands/doctor-parity.test.js.map +1 -1
  8. package/dist/commands/doctor.d.ts +19 -0
  9. package/dist/commands/doctor.d.ts.map +1 -1
  10. package/dist/commands/doctor.js +132 -0
  11. package/dist/commands/doctor.js.map +1 -1
  12. package/dist/commands/doctor.test.js +1 -0
  13. package/dist/commands/doctor.test.js.map +1 -1
  14. package/dist/commands/gate-install.d.ts.map +1 -1
  15. package/dist/commands/gate-install.js +12 -3
  16. package/dist/commands/gate-install.js.map +1 -1
  17. package/dist/commands/gate-install.test.js +13 -1
  18. package/dist/commands/gate-install.test.js.map +1 -1
  19. package/dist/commands/init-templates.d.ts +59 -7
  20. package/dist/commands/init-templates.d.ts.map +1 -1
  21. package/dist/commands/init-templates.js +223 -2
  22. package/dist/commands/init-templates.js.map +1 -1
  23. package/dist/commands/init.d.ts +38 -4
  24. package/dist/commands/init.d.ts.map +1 -1
  25. package/dist/commands/init.js +196 -13
  26. package/dist/commands/init.js.map +1 -1
  27. package/dist/commands/init.test.js +13 -0
  28. package/dist/commands/init.test.js.map +1 -1
  29. package/dist/commands/install-hooks-exit-contract.test.d.ts +2 -0
  30. package/dist/commands/install-hooks-exit-contract.test.d.ts.map +1 -0
  31. package/dist/commands/install-hooks-exit-contract.test.js +339 -0
  32. package/dist/commands/install-hooks-exit-contract.test.js.map +1 -0
  33. package/dist/commands/install-hooks.d.ts +53 -1
  34. package/dist/commands/install-hooks.d.ts.map +1 -1
  35. package/dist/commands/install-hooks.js +239 -52
  36. package/dist/commands/install-hooks.js.map +1 -1
  37. package/dist/commands/install-hooks.test.js +105 -39
  38. package/dist/commands/install-hooks.test.js.map +1 -1
  39. package/dist/commands/lint-staleness.d.ts +122 -0
  40. package/dist/commands/lint-staleness.d.ts.map +1 -0
  41. package/dist/commands/lint-staleness.js +163 -0
  42. package/dist/commands/lint-staleness.js.map +1 -0
  43. package/dist/commands/lint-staleness.test.d.ts +2 -0
  44. package/dist/commands/lint-staleness.test.d.ts.map +1 -0
  45. package/dist/commands/lint-staleness.test.js +173 -0
  46. package/dist/commands/lint-staleness.test.js.map +1 -0
  47. package/dist/commands/lint.d.ts.map +1 -1
  48. package/dist/commands/lint.js +142 -3
  49. package/dist/commands/lint.js.map +1 -1
  50. package/dist/commands/prepare-wrapper.test.d.ts +2 -0
  51. package/dist/commands/prepare-wrapper.test.d.ts.map +1 -0
  52. package/dist/commands/prepare-wrapper.test.js +284 -0
  53. package/dist/commands/prepare-wrapper.test.js.map +1 -0
  54. package/dist/commands/tools-hook-parity.test.d.ts +2 -0
  55. package/dist/commands/tools-hook-parity.test.d.ts.map +1 -0
  56. package/dist/commands/tools-hook-parity.test.js +37 -0
  57. package/dist/commands/tools-hook-parity.test.js.map +1 -0
  58. package/dist/commands/wrap.d.ts.map +1 -1
  59. package/dist/commands/wrap.js +3 -2
  60. package/dist/commands/wrap.js.map +1 -1
  61. package/dist/commands/wrap.test.js +11 -1
  62. package/dist/commands/wrap.test.js.map +1 -1
  63. package/package.json +2 -2
@@ -0,0 +1,284 @@
1
+ /**
2
+ * Init-distributed prepare wrapper (mmnto-ai/totem#2410 PR-B).
3
+ *
4
+ * Three surfaces:
5
+ * - PREPARE_WRAPPER behavior: write the template to a temp dir + execute it with
6
+ * `process.execPath` against a hermetic fake `@mmnto/cli` (mkdtemp + cleanup;
7
+ * nothing global mocked). Exit-code contract: MODULE_NOT_FOUND → 0 + skip line;
8
+ * child exit propagated verbatim; a corrupt/missing bin → 1.
9
+ * - wirePreparePackageJson: absent → set; canonical → unchanged; different →
10
+ * untouched (byte-identical); missing / unparseable manifests.
11
+ * - checkPrepareWrapper (doctor row): present+wired → pass; absent / miswired /
12
+ * drifted → warn with the right remedy; owner-repo / user-owned → skip.
13
+ *
14
+ * The wrapper spawns are short-lived synchronous `node` invocations with cwd pinned
15
+ * to the hermetic temp dir (so resolution never leaks to the real repo's node_modules);
16
+ * every temp dir is torn down in afterEach.
17
+ */
18
+ import { spawnSync } from 'node:child_process';
19
+ import * as fs from 'node:fs';
20
+ import * as os from 'node:os';
21
+ import * as path from 'node:path';
22
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
23
+ import { cleanTmpDir } from '../test-utils.js';
24
+ import { checkPrepareWrapper } from './doctor.js';
25
+ import { wirePreparePackageJson } from './init.js';
26
+ import { PREPARE_SCRIPT_COMMAND, PREPARE_WRAPPER, TOTEM_FILE_END, TOTEM_FILE_MARKER, } from './init-templates.js';
27
+ // ─── PREPARE_WRAPPER: exit-code behavior ─────────────────────────────
28
+ describe('PREPARE_WRAPPER — exit-code contract', () => {
29
+ let tmpDir;
30
+ let wrapperPath;
31
+ const cliDir = () => path.join(tmpDir, 'node_modules', '@mmnto', 'cli');
32
+ /** Plant a fake `@mmnto/cli` with the given bin filename + body (undefined body = no bin file). */
33
+ function plantFakeCli(binFile, binBody) {
34
+ fs.mkdirSync(cliDir(), { recursive: true });
35
+ fs.writeFileSync(path.join(cliDir(), 'package.json'), JSON.stringify({ name: '@mmnto/cli', version: '0.0.0', bin: { totem: `./${binFile}` } }));
36
+ if (binBody !== undefined) {
37
+ fs.writeFileSync(path.join(cliDir(), binFile), binBody);
38
+ }
39
+ }
40
+ /** Run the wrapper with cwd pinned to the hermetic temp dir. */
41
+ function runWrapper() {
42
+ const r = spawnSync(process.execPath, [wrapperPath], { cwd: tmpDir, encoding: 'utf8' });
43
+ return { status: r.status, stderr: r.stderr ?? '' };
44
+ }
45
+ beforeEach(() => {
46
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-2410b-wrap-'));
47
+ wrapperPath = path.join(tmpDir, 'prepare.cjs');
48
+ fs.writeFileSync(wrapperPath, PREPARE_WRAPPER, 'utf-8');
49
+ });
50
+ afterEach(() => {
51
+ cleanTmpDir(tmpDir);
52
+ });
53
+ it('(a) @mmnto/cli not resolvable → exit 0 + a declared-skip stderr line', () => {
54
+ const { status, stderr } = runWrapper();
55
+ expect(status).toBe(0);
56
+ expect(stderr).toContain('@mmnto/cli is not installed');
57
+ expect(stderr).toContain('skipping hook install');
58
+ });
59
+ it('(b) fake @mmnto/cli whose bin exits 0 → wrapper exits 0', () => {
60
+ plantFakeCli('cli-bin.js', 'process.exit(0);\n');
61
+ expect(runWrapper().status).toBe(0);
62
+ });
63
+ it('(c) fake bin exits 3 → wrapper propagates 3 (a genuine hook-install failure fails prepare loud)', () => {
64
+ plantFakeCli('cli-bin.js', 'process.exit(3);\n');
65
+ expect(runWrapper().status).toBe(3);
66
+ });
67
+ it('(d) resolution ok but the bin file is missing (corrupt install) → exit 1', () => {
68
+ // package.json resolves + declares a bin, but the bin JS does not exist → the
69
+ // spawned `node <missing>` exits 1, which the wrapper propagates verbatim.
70
+ plantFakeCli('missing-bin.js', undefined);
71
+ expect(runWrapper().status).toBe(1);
72
+ });
73
+ it('never spawns through a shell (spawnSync argv form; no shell:true) — the marker opens the file', () => {
74
+ // Structural guard: the emitted wrapper drives node via an argv array, not a
75
+ // shell string (the Windows quoting class, mmnto-ai/totem#2351).
76
+ expect(PREPARE_WRAPPER.trimStart().startsWith(TOTEM_FILE_MARKER)).toBe(true);
77
+ expect(PREPARE_WRAPPER).toContain("spawnSync(process.execPath, [binJs, 'hook', 'install']");
78
+ expect(PREPARE_WRAPPER).not.toContain('shell: true');
79
+ expect(PREPARE_WRAPPER).not.toContain('execSync');
80
+ });
81
+ });
82
+ // ─── wirePreparePackageJson: wiring matrix ───────────────────────────
83
+ describe('wirePreparePackageJson — wiring matrix', () => {
84
+ let tmpDir;
85
+ const pkgPath = () => path.join(tmpDir, 'package.json');
86
+ beforeEach(() => {
87
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-2410b-wire-'));
88
+ });
89
+ afterEach(() => {
90
+ cleanTmpDir(tmpDir);
91
+ });
92
+ it('no prepare script → sets it (wired)', () => {
93
+ fs.writeFileSync(pkgPath(), JSON.stringify({ name: 'consumer', scripts: { build: 'tsc' } }, null, 2) + '\n');
94
+ const r = wirePreparePackageJson(pkgPath());
95
+ expect(r.action).toBe('wired');
96
+ const parsed = JSON.parse(fs.readFileSync(pkgPath(), 'utf-8'));
97
+ expect(parsed.scripts.prepare).toBe(PREPARE_SCRIPT_COMMAND);
98
+ // Existing key order preserved; prepare appended after build.
99
+ expect(Object.keys(parsed.scripts)).toEqual(['build', 'prepare']);
100
+ // Trailing newline preserved.
101
+ expect(fs.readFileSync(pkgPath(), 'utf-8').endsWith('}\n')).toBe(true);
102
+ });
103
+ it('no scripts block at all → creates scripts with prepare (wired)', () => {
104
+ fs.writeFileSync(pkgPath(), JSON.stringify({ name: 'consumer' }, null, 2) + '\n');
105
+ const r = wirePreparePackageJson(pkgPath());
106
+ expect(r.action).toBe('wired');
107
+ expect(JSON.parse(fs.readFileSync(pkgPath(), 'utf-8')).scripts.prepare).toBe(PREPARE_SCRIPT_COMMAND);
108
+ });
109
+ it('prepare already exactly canonical → unchanged (exists), byte-identical', () => {
110
+ const raw = JSON.stringify({ name: 'consumer', scripts: { prepare: PREPARE_SCRIPT_COMMAND } }, null, 2) +
111
+ '\n';
112
+ fs.writeFileSync(pkgPath(), raw);
113
+ const r = wirePreparePackageJson(pkgPath());
114
+ expect(r.action).toBe('exists');
115
+ expect(fs.readFileSync(pkgPath(), 'utf-8')).toBe(raw);
116
+ });
117
+ it('a DIFFERENT existing prepare → declined + byte-identical (no overwrite of user content)', () => {
118
+ const raw = JSON.stringify({ name: 'consumer', scripts: { prepare: 'husky install' } }, null, 2) + '\n';
119
+ fs.writeFileSync(pkgPath(), raw);
120
+ const r = wirePreparePackageJson(pkgPath());
121
+ expect(r.action).toBe('declined');
122
+ expect(r.existing).toBe('husky install');
123
+ // The whole file is preserved verbatim.
124
+ expect(fs.readFileSync(pkgPath(), 'utf-8')).toBe(raw);
125
+ });
126
+ it('a non-string prepare value → declined + byte-identical (never clobber weird user content)', () => {
127
+ const raw = JSON.stringify({ name: 'consumer', scripts: { prepare: { weird: true } } }, null, 2) + '\n';
128
+ fs.writeFileSync(pkgPath(), raw);
129
+ const r = wirePreparePackageJson(pkgPath());
130
+ expect(r.action).toBe('declined');
131
+ expect(fs.readFileSync(pkgPath(), 'utf-8')).toBe(raw);
132
+ });
133
+ it('no package.json → missing (nothing to wire)', () => {
134
+ expect(wirePreparePackageJson(pkgPath()).action).toBe('missing');
135
+ });
136
+ it('invalid JSON → unparseable (surfaced, never a crash), byte-identical', () => {
137
+ const raw = '{ not valid json ]';
138
+ fs.writeFileSync(pkgPath(), raw);
139
+ const r = wirePreparePackageJson(pkgPath());
140
+ expect(r.action).toBe('unparseable');
141
+ expect(r.err).toBeDefined();
142
+ expect(fs.readFileSync(pkgPath(), 'utf-8')).toBe(raw);
143
+ });
144
+ // F1 (mmnto-ai/totem#2416): a non-object JSON root must not crash at `.scripts` or be
145
+ // written into — validate the shape and decline as unparseable.
146
+ it.each([
147
+ ['null root', 'null'],
148
+ ['scalar root', '5'],
149
+ ['string root', '"hi"'],
150
+ ['array root', '[]'],
151
+ ])('%s → unparseable + byte-identical (never dereferenced or written)', (_label, raw) => {
152
+ fs.writeFileSync(pkgPath(), raw);
153
+ const r = wirePreparePackageJson(pkgPath());
154
+ expect(r.action).toBe('unparseable');
155
+ expect(r.err).toBeDefined();
156
+ expect(fs.readFileSync(pkgPath(), 'utf-8')).toBe(raw);
157
+ });
158
+ it('a present-but-non-object `scripts` → unparseable + byte-identical (never clobbered)', () => {
159
+ // The pre-fix bug: a non-object `scripts` fell through to the wire branch and was
160
+ // silently REPLACED by `{ prepare: ... }`. It must be declined as unparseable.
161
+ const raw = JSON.stringify({ name: 'consumer', scripts: 'oops-a-string' }, null, 2) + '\n';
162
+ fs.writeFileSync(pkgPath(), raw);
163
+ const r = wirePreparePackageJson(pkgPath());
164
+ expect(r.action).toBe('unparseable');
165
+ expect(fs.readFileSync(pkgPath(), 'utf-8')).toBe(raw);
166
+ });
167
+ // F5 (mmnto-ai/totem#2416): a write that throws is a DISTINCT discriminant from a
168
+ // read/parse/shape problem.
169
+ it('a write failure → write-failed (distinct from unparseable)', () => {
170
+ const raw = JSON.stringify({ name: 'consumer' }, null, 2) + '\n';
171
+ fs.writeFileSync(pkgPath(), raw);
172
+ fs.chmodSync(pkgPath(), 0o444); // read-only → read+parse succeed, writeFileSync throws (EPERM/EACCES)
173
+ try {
174
+ const r = wirePreparePackageJson(pkgPath());
175
+ expect(r.action).toBe('write-failed');
176
+ expect(r.err).toBeDefined();
177
+ }
178
+ finally {
179
+ // Restore write perms so cleanup can remove the temp dir.
180
+ fs.chmodSync(pkgPath(), 0o644);
181
+ }
182
+ });
183
+ });
184
+ // ─── checkPrepareWrapper: doctor sensor row ──────────────────────────
185
+ describe('checkPrepareWrapper — doctor parity row (sensor, never gates)', () => {
186
+ let tmpDir;
187
+ const wrapperPath = () => path.join(tmpDir, '.totem', 'prepare.cjs');
188
+ const pkgPath = () => path.join(tmpDir, 'package.json');
189
+ function writeWrapper(content) {
190
+ fs.mkdirSync(path.dirname(wrapperPath()), { recursive: true });
191
+ fs.writeFileSync(wrapperPath(), content, 'utf-8');
192
+ }
193
+ function writePkg(pkg) {
194
+ fs.writeFileSync(pkgPath(), JSON.stringify(pkg, null, 2) + '\n');
195
+ }
196
+ beforeEach(() => {
197
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-2410b-doc-'));
198
+ });
199
+ afterEach(() => {
200
+ cleanTmpDir(tmpDir);
201
+ });
202
+ it('present + canonical + wired → pass', async () => {
203
+ writeWrapper(PREPARE_WRAPPER);
204
+ writePkg({ name: 'consumer', scripts: { prepare: PREPARE_SCRIPT_COMMAND } });
205
+ const r = await checkPrepareWrapper(tmpDir);
206
+ expect(r.status).toBe('pass');
207
+ });
208
+ it('wrapper absent + no prepare → warn, remedy names totem init', async () => {
209
+ writePkg({ name: 'consumer', scripts: { build: 'tsc' } });
210
+ const r = await checkPrepareWrapper(tmpDir);
211
+ expect(r.status).toBe('warn');
212
+ expect(r.remediation).toBe('totem init');
213
+ });
214
+ it('wrapper present + canonical but prepare NOT wired → warn (miswired), remedy totem init', async () => {
215
+ writeWrapper(PREPARE_WRAPPER);
216
+ writePkg({ name: 'consumer', scripts: {} });
217
+ const r = await checkPrepareWrapper(tmpDir);
218
+ expect(r.status).toBe('warn');
219
+ expect(r.remediation).toBe('totem init');
220
+ expect(r.message).toContain('not wired');
221
+ });
222
+ it('wrapper present + marker-headed + BOUNDED but drifted → warn, remedy is bare totem hook install', async () => {
223
+ writeWrapper(`${TOTEM_FILE_MARKER} — drifted\nconsole.log("stale");\n${TOTEM_FILE_END}\n`);
224
+ writePkg({ name: 'consumer', scripts: { prepare: PREPARE_SCRIPT_COMMAND } });
225
+ const r = await checkPrepareWrapper(tmpDir);
226
+ expect(r.status).toBe('warn');
227
+ expect(r.remediation).toBe('totem hook install');
228
+ expect(r.message).toContain('drifted');
229
+ });
230
+ // F3 (mmnto-ai/totem#2416): a marker-headed but UNBOUNDED drifted wrapper (no end
231
+ // marker) is not bare-repairable — the remedy must name --force.
232
+ it('wrapper present + marker-headed but UNBOUNDED drifted → warn, remedy is totem hook install --force', async () => {
233
+ writeWrapper(`${TOTEM_FILE_MARKER} — drifted, no end marker\nconsole.log("stale");\n`);
234
+ writePkg({ name: 'consumer', scripts: { prepare: PREPARE_SCRIPT_COMMAND } });
235
+ const r = await checkPrepareWrapper(tmpDir);
236
+ expect(r.status).toBe('warn');
237
+ expect(r.remediation).toBe('totem hook install --force');
238
+ expect(r.message).toContain('drifted');
239
+ });
240
+ // F2 (mmnto-ai/totem#2416): a wrapper that EXISTS but cannot be read must warn with the
241
+ // read-failure detail, not fall through to the user-owned skip. A directory-at-path makes
242
+ // existsSync true while readFileSync throws EISDIR (cross-platform).
243
+ it('wrapper present but unreadable (EISDIR) → warn naming the read failure, not a user-owned skip', async () => {
244
+ fs.mkdirSync(path.join(tmpDir, '.totem', 'prepare.cjs'), { recursive: true });
245
+ writePkg({ name: 'consumer', scripts: { prepare: PREPARE_SCRIPT_COMMAND } });
246
+ const r = await checkPrepareWrapper(tmpDir);
247
+ expect(r.status).toBe('warn');
248
+ expect(r.message).toContain('could not read');
249
+ expect(r.message).not.toContain('user-owned');
250
+ });
251
+ // F4 (mmnto-ai/totem#2416): canonical wrapper present but a DIFFERENT prepare exists —
252
+ // `totem init` deliberately declines that, so the remedy must be the manual line.
253
+ it('wrapper present + canonical but a DIFFERENT prepare → warn, remedy is the manual line (not totem init)', async () => {
254
+ writeWrapper(PREPARE_WRAPPER);
255
+ writePkg({ name: 'consumer', scripts: { prepare: 'husky install' } });
256
+ const r = await checkPrepareWrapper(tmpDir);
257
+ expect(r.status).toBe('warn');
258
+ expect(r.remediation).toContain('add or chain');
259
+ expect(r.remediation).not.toBe('totem init');
260
+ });
261
+ it('owner-repo exception: wrapper absent + a DIFFERENT user-managed prepare → skip (no nudge)', async () => {
262
+ writePkg({ name: 'owner', scripts: { prepare: 'node tools/install-hooks.js' } });
263
+ const r = await checkPrepareWrapper(tmpDir);
264
+ expect(r.status).toBe('skip');
265
+ });
266
+ it('user-owned .totem/prepare.cjs (no Totem marker) → skip (left as-is)', async () => {
267
+ writeWrapper('// my own prepare helper\nconsole.log("mine");\n');
268
+ writePkg({ name: 'consumer', scripts: { prepare: 'node .totem/prepare.cjs' } });
269
+ const r = await checkPrepareWrapper(tmpDir);
270
+ expect(r.status).toBe('skip');
271
+ });
272
+ it('no package.json → skip (nothing to wire)', async () => {
273
+ const r = await checkPrepareWrapper(tmpDir);
274
+ expect(r.status).toBe('skip');
275
+ });
276
+ it('wired canonical but wrapper file missing → warn, remedy totem init', async () => {
277
+ writePkg({ name: 'consumer', scripts: { prepare: PREPARE_SCRIPT_COMMAND } });
278
+ const r = await checkPrepareWrapper(tmpDir);
279
+ expect(r.status).toBe('warn');
280
+ expect(r.remediation).toBe('totem init');
281
+ expect(r.message).toContain('missing');
282
+ });
283
+ });
284
+ //# sourceMappingURL=prepare-wrapper.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare-wrapper.test.js","sourceRoot":"","sources":["../../src/commands/prepare-wrapper.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tools-hook-parity.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-hook-parity.test.d.ts","sourceRoot":"","sources":["../../src/commands/tools-hook-parity.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { describe, expect, it } from 'vitest';
5
+ import { buildHookContent, buildPreCommitHook, buildPrePushHook, getFallbackCommand, } from './install-hooks.js';
6
+ // Bind the repo-local `tools/{pre-commit,pre-push,post-merge}` hook scripts — which
7
+ // `package.json`'s `prepare` (`node tools/install-hooks.js`) copies into `.git/hooks`
8
+ // on every install — to the CLI template builders that `totem hook install --force`
9
+ // uses. If a template changes without regenerating tools/, the copied scripts silently
10
+ // re-drift from the CLI-canonical hooks and stomp them on the next `pnpm install`
11
+ // (mmnto-ai/totem#2404). A failure here means tools/ must be regenerated in lockstep
12
+ // (byte-for-byte) with the builders before merging the template change.
13
+ const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../..');
14
+ const TOOLS_DIR = path.join(REPO_ROOT, 'tools');
15
+ // This repo pins no `hooks.tier` in totem.config.ts, so the installer's effective tier
16
+ // is the default 'standard'. The fallback command derives from the repo's lockfile
17
+ // exactly as the installer and doctor do (getFallbackCommand).
18
+ const TIER = 'standard';
19
+ const FALLBACK_CMD = getFallbackCommand(REPO_ROOT);
20
+ function readTool(hook) {
21
+ return fs.readFileSync(path.join(TOOLS_DIR, hook), 'utf-8');
22
+ }
23
+ describe('tools/ hook scripts match the CLI template builders (mmnto-ai/totem#2404)', () => {
24
+ it('resolves the pnpm-based fallback command for this repo', () => {
25
+ expect(FALLBACK_CMD).toBe('pnpm dlx @mmnto/cli');
26
+ });
27
+ it('tools/pre-commit is byte-identical to buildPreCommitHook output', () => {
28
+ expect(readTool('pre-commit')).toBe(buildPreCommitHook(TIER));
29
+ });
30
+ it('tools/pre-push is byte-identical to buildPrePushHook output', () => {
31
+ expect(readTool('pre-push')).toBe(buildPrePushHook(FALLBACK_CMD, TIER));
32
+ });
33
+ it('tools/post-merge is byte-identical to buildHookContent output', () => {
34
+ expect(readTool('post-merge')).toBe(buildHookContent(FALLBACK_CMD));
35
+ });
36
+ });
37
+ //# sourceMappingURL=tools-hook-parity.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-hook-parity.test.js","sourceRoot":"","sources":["../../src/commands/tools-hook-parity.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAE5B,oFAAoF;AACpF,sFAAsF;AACtF,oFAAoF;AACpF,uFAAuF;AACvF,kFAAkF;AAClF,qFAAqF;AACrF,wEAAwE;AAExE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;AAC5F,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAEhD,uFAAuF;AACvF,mFAAmF;AACnF,+DAA+D;AAC/D,MAAM,IAAI,GAAG,UAAmB,CAAC;AACjC,MAAM,YAAY,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;AAEnD,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED,QAAQ,CAAC,2EAA2E,EAAE,GAAG,EAAE;IACzF,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../src/commands/wrap.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,GAAG,SAAS,CAAC;AAInB,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB5F;AAID,OAAO,EAAE,GAAG,EAAE,CAAC"}
1
+ {"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../src/commands/wrap.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,GAAG,SAAS,CAAC;AAInB,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B5F;AAID,OAAO,EAAE,GAAG,EAAE,CAAC"}
@@ -41,11 +41,12 @@ export async function wrapCommand(_prNumbers, _options) {
41
41
  ' pnpm exec totem lesson extract <pr-numbers> --yes',
42
42
  ' pnpm exec totem sync',
43
43
  ' pnpm exec totem lesson compile --export',
44
- ' git checkout HEAD -- .totem/compiled-rules.json',
44
+ ' (review new rules; archive bad ones: pnpm exec totem lesson archive <hash> --reason "...")',
45
45
  ' pnpm run format',
46
- ' git add .totem/lessons/ .github/copilot-instructions.md .junie/skills/totem-rules/rules.md',
46
+ ' git add .totem/lessons/ .totem/compiled-rules.json .totem/compile-manifest.json .github/copilot-instructions.md .junie/skills/totem-rules/rules.md',
47
47
  " git commit -m 'chore: totem postmerge lessons for <prs>'",
48
48
  '',
49
+ 'Full sequence: .claude/skills/postmerge/SKILL.md',
49
50
  'Tracking: mmnto-ai/totem#1361',
50
51
  ].join('\n'));
51
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"wrap.js","sourceRoot":"","sources":["../../src/commands/wrap.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAE3D,MAAM,GAAG,GAAG,MAAM,CAAC;AAUnB,2DAA2D;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAoB,EAAE,QAAqB;IAC3E,oEAAoE;IACpE,sEAAsE;IACtE,sEAAsE;IACtE,iEAAiE;IACjE,kCAAkC;IAClC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IAEpD,MAAM,IAAI,UAAU,CAClB,gBAAgB,EAChB,0FAA0F,EAC1F;QACE,oCAAoC;QACpC,EAAE;QACF,qDAAqD;QACrD,wBAAwB;QACxB,2CAA2C;QAC3C,mDAAmD;QACnD,mBAAmB;QACnB,8FAA8F;QAC9F,4DAA4D;QAC5D,EAAE;QACF,+BAA+B;KAChC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,8DAA8D;AAC9D,OAAO,EAAE,GAAG,EAAE,CAAC"}
1
+ {"version":3,"file":"wrap.js","sourceRoot":"","sources":["../../src/commands/wrap.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAE3D,MAAM,GAAG,GAAG,MAAM,CAAC;AAUnB,2DAA2D;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAoB,EAAE,QAAqB;IAC3E,oEAAoE;IACpE,sEAAsE;IACtE,sEAAsE;IACtE,iEAAiE;IACjE,kCAAkC;IAClC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IAEpD,MAAM,IAAI,UAAU,CAClB,gBAAgB,EAChB,0FAA0F,EAC1F;QACE,oCAAoC;QACpC,EAAE;QACF,qDAAqD;QACrD,wBAAwB;QACxB,2CAA2C;QAC3C,8FAA8F;QAC9F,mBAAmB;QACnB,sJAAsJ;QACtJ,4DAA4D;QAC5D,EAAE;QACF,kDAAkD;QAClD,+BAA+B;KAChC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,8DAA8D;AAC9D,OAAO,EAAE,GAAG,EAAE,CAAC"}
@@ -54,7 +54,17 @@ describe('wrapCommand (retired)', () => {
54
54
  expect(hint).toContain('totem lesson extract');
55
55
  expect(hint).toContain('totem sync');
56
56
  expect(hint).toContain('totem lesson compile --export');
57
- expect(hint).toContain('git checkout HEAD -- .totem/compiled-rules.json');
57
+ // Curation goes through the atomic archive, not a rules-file revert:
58
+ // `git checkout HEAD -- .totem/compiled-rules.json` desyncs the
59
+ // compile-manifest input/output hashes (postmerge SKILL forbids it).
60
+ expect(hint).toContain('totem lesson archive');
61
+ expect(hint).not.toContain('git checkout HEAD -- .totem/compiled-rules.json');
62
+ // The rules + manifest artifacts must be staged so the revert is
63
+ // unnecessary in the first place.
64
+ expect(hint).toContain('.totem/compiled-rules.json');
65
+ expect(hint).toContain('.totem/compile-manifest.json');
66
+ // Points at the canonical long-form sequence.
67
+ expect(hint).toContain('.claude/skills/postmerge/SKILL.md');
58
68
  }
59
69
  });
60
70
  });
@@ -1 +1 @@
1
- {"version":3,"file":"wrap.test.js","sourceRoot":"","sources":["../../src/commands/wrap.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wrap.test.js","sourceRoot":"","sources":["../../src/commands/wrap.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.99.0",
3
+ "version": "1.101.0",
4
4
  "description": "Totem: local-first toolkit that keeps AI-agent work queryable, enforceable, and derivable as plain files in your codebase",
5
5
  "type": "module",
6
6
  "engines": {
@@ -28,7 +28,7 @@
28
28
  "smol-toml": "^1.6.1",
29
29
  "yaml": "^2.4.0",
30
30
  "zod": "^3.24.0",
31
- "@mmnto/totem": "1.99.0"
31
+ "@mmnto/totem": "1.101.0"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@anthropic-ai/sdk": "^0.98.0",