@mmnto/cli 1.119.0 → 1.121.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 (72) hide show
  1. package/dist/commands/config-drift.test.js +10 -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 +21 -6
  5. package/dist/commands/doctor-parity.js.map +1 -1
  6. package/dist/commands/doctor-parity.test.js +14 -7
  7. package/dist/commands/doctor-parity.test.js.map +1 -1
  8. package/dist/commands/doctor.d.ts +21 -1
  9. package/dist/commands/doctor.d.ts.map +1 -1
  10. package/dist/commands/doctor.js +167 -9
  11. package/dist/commands/doctor.js.map +1 -1
  12. package/dist/commands/doctor.test.js +234 -6
  13. package/dist/commands/doctor.test.js.map +1 -1
  14. package/dist/commands/ecl-gc.d.ts.map +1 -1
  15. package/dist/commands/ecl-gc.js +38 -5
  16. package/dist/commands/ecl-gc.js.map +1 -1
  17. package/dist/commands/ecl-gc.test.js +71 -0
  18. package/dist/commands/ecl-gc.test.js.map +1 -1
  19. package/dist/commands/eject-totemdir.test.d.ts +8 -0
  20. package/dist/commands/eject-totemdir.test.d.ts.map +1 -0
  21. package/dist/commands/eject-totemdir.test.js +101 -0
  22. package/dist/commands/eject-totemdir.test.js.map +1 -0
  23. package/dist/commands/eject.d.ts +30 -5
  24. package/dist/commands/eject.d.ts.map +1 -1
  25. package/dist/commands/eject.js +145 -31
  26. package/dist/commands/eject.js.map +1 -1
  27. package/dist/commands/eject.test.js +3 -3
  28. package/dist/commands/eject.test.js.map +1 -1
  29. package/dist/commands/gemini-sessionstart-contract.test.js +50 -0
  30. package/dist/commands/gemini-sessionstart-contract.test.js.map +1 -1
  31. package/dist/commands/hook-totemdir-render.test.d.ts +23 -0
  32. package/dist/commands/hook-totemdir-render.test.d.ts.map +1 -0
  33. package/dist/commands/hook-totemdir-render.test.js +288 -0
  34. package/dist/commands/hook-totemdir-render.test.js.map +1 -0
  35. package/dist/commands/init-templates.d.ts +6 -6
  36. package/dist/commands/init-templates.d.ts.map +1 -1
  37. package/dist/commands/init-templates.js +105 -19
  38. package/dist/commands/init-templates.js.map +1 -1
  39. package/dist/commands/init.test.js +136 -12
  40. package/dist/commands/init.test.js.map +1 -1
  41. package/dist/commands/install-hooks-exit-contract.test.js +6 -6
  42. package/dist/commands/install-hooks-exit-contract.test.js.map +1 -1
  43. package/dist/commands/install-hooks.d.ts +162 -12
  44. package/dist/commands/install-hooks.d.ts.map +1 -1
  45. package/dist/commands/install-hooks.js +381 -92
  46. package/dist/commands/install-hooks.js.map +1 -1
  47. package/dist/commands/install-hooks.test.js +446 -158
  48. package/dist/commands/install-hooks.test.js.map +1 -1
  49. package/dist/commands/link.d.ts.map +1 -1
  50. package/dist/commands/link.js +71 -16
  51. package/dist/commands/link.js.map +1 -1
  52. package/dist/commands/link.test.d.ts +9 -0
  53. package/dist/commands/link.test.d.ts.map +1 -0
  54. package/dist/commands/link.test.js +92 -0
  55. package/dist/commands/link.test.js.map +1 -0
  56. package/dist/commands/mail.d.ts +48 -2
  57. package/dist/commands/mail.d.ts.map +1 -1
  58. package/dist/commands/mail.js +76 -2
  59. package/dist/commands/mail.js.map +1 -1
  60. package/dist/commands/mail.test.js +177 -0
  61. package/dist/commands/mail.test.js.map +1 -1
  62. package/dist/commands/pre-push-gate-matrix.test.js +9 -2
  63. package/dist/commands/pre-push-gate-matrix.test.js.map +1 -1
  64. package/dist/commands/rule.test.js +30 -0
  65. package/dist/commands/rule.test.js.map +1 -1
  66. package/dist/commands/shield.js +1 -1
  67. package/dist/commands/shield.js.map +1 -1
  68. package/dist/commands/tools-hook-parity.test.js +7 -3
  69. package/dist/commands/tools-hook-parity.test.js.map +1 -1
  70. package/dist/index.js +9 -0
  71. package/dist/index.js.map +1 -1
  72. package/package.json +2 -2
@@ -0,0 +1,288 @@
1
+ /**
2
+ * `totemDir` rendering across the managed git-hook family (mmnto-ai/totem#2692).
3
+ *
4
+ * Two things are pinned here:
5
+ *
6
+ * 1. **Byte-identity at the default (C3).** Rendering at
7
+ * `{ tier: 'standard', totemDir: '.totem', fallbackCmd: 'pnpm dlx @mmnto/cli' }`
8
+ * must produce EXACTLY today's `tools/{pre-commit,pre-push,post-merge}`. This
9
+ * is what makes the slice non-breaking: no consumer's installed hooks drift
10
+ * on upgrade, and `tools/` never has to be regenerated. (The dedicated
11
+ * `tools-hook-parity.test.ts` binds the same three files; this file states
12
+ * the property as the FLOOR the custom-dir assertions are measured against.)
13
+ *
14
+ * 2. **Nothing is left hardcoded (C1/C4).** Under a custom `totemDir` no hook
15
+ * body may carry a `.totem` literal anywhere — not in the reader, not in a
16
+ * `[ -f ]` guard, not in a `grep` pattern, not in a comment — and the value
17
+ * must land through the right quoting regime per site.
18
+ *
19
+ * The resolver (`resolveHookRenderOptions`) is exercised against real config
20
+ * files in a temp dir, since it is the ONE seam every writer goes through.
21
+ */
22
+ import * as fs from 'node:fs';
23
+ import * as os from 'node:os';
24
+ import * as path from 'node:path';
25
+ import { fileURLToPath } from 'node:url';
26
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
27
+ import { hasUnrenderableHookChar } from '@mmnto/totem';
28
+ import { cleanTmpDir } from '../test-utils.js';
29
+ import { assertRenderableTotemDir, buildHookContent, buildPostCheckoutHookContent, buildPreCommitHook, buildPrePushHook, DEFAULT_TOTEM_DIR, getFallbackCommand, hasUnrenderableTotemDirChar, hookTotemDirProblem, resolveHookRenderOptions, } from './install-hooks.js';
30
+ const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../..');
31
+ const DEFAULT_RENDER = {
32
+ tier: 'standard',
33
+ totemDir: DEFAULT_TOTEM_DIR,
34
+ fallbackCmd: 'pnpm dlx @mmnto/cli',
35
+ };
36
+ /** Every hook body, rendered at one set of options. */
37
+ function renderAll(render) {
38
+ return [
39
+ { name: 'pre-commit', body: buildPreCommitHook(render) },
40
+ { name: 'pre-push', body: buildPrePushHook(render) },
41
+ { name: 'post-merge', body: buildHookContent(render) },
42
+ { name: 'post-checkout', body: buildPostCheckoutHookContent(render) },
43
+ ];
44
+ }
45
+ // ─── C3: byte-identity at the default ────────────────────
46
+ describe('default render is byte-identical to the shipped tools/ hooks (C3)', () => {
47
+ it.each([
48
+ ['pre-commit', () => buildPreCommitHook(DEFAULT_RENDER)],
49
+ ['pre-push', () => buildPrePushHook(DEFAULT_RENDER)],
50
+ ['post-merge', () => buildHookContent(DEFAULT_RENDER)],
51
+ ])('tools/%s', (file, render) => {
52
+ // The repo pins no totemDir and no tier, and resolves the pnpm fallback —
53
+ // exactly DEFAULT_RENDER (guarded below so a lockfile change is loud).
54
+ expect(getFallbackCommand(REPO_ROOT)).toBe(DEFAULT_RENDER.fallbackCmd);
55
+ expect(fs.readFileSync(path.join(REPO_ROOT, 'tools', file), 'utf-8')).toBe(render());
56
+ });
57
+ it('the strict arm is byte-stable at the default too (tools/ ships standard)', () => {
58
+ const strict = buildPreCommitHook({ ...DEFAULT_RENDER, tier: 'strict' });
59
+ const standard = buildPreCommitHook(DEFAULT_RENDER);
60
+ // Only the tier assignment differs; the rendered reader path is the same.
61
+ expect(strict).toContain('TOTEM_HOOK_TIER="strict"');
62
+ expect(standard).toContain('TOTEM_HOOK_TIER="standard"');
63
+ expect(strict.replace('TOTEM_HOOK_TIER="strict"', 'TOTEM_HOOK_TIER="standard"')).toBe(standard);
64
+ });
65
+ it('post-merge and post-checkout render identically for both tiers (the A10 sensor premise)', () => {
66
+ // `doctor`'s totemDir sensor renders each canonical at the tier the installed
67
+ // hook's block declares; the two tier-less hooks carry no tier line, so their
68
+ // render must not depend on it — pinned here rather than assumed.
69
+ for (const totemDir of [DEFAULT_TOTEM_DIR, 'knowledge']) {
70
+ const standard = { ...DEFAULT_RENDER, totemDir, tier: 'standard' };
71
+ const strict = { ...DEFAULT_RENDER, totemDir, tier: 'strict' };
72
+ expect(buildHookContent(strict)).toBe(buildHookContent(standard));
73
+ expect(buildPostCheckoutHookContent(strict)).toBe(buildPostCheckoutHookContent(standard));
74
+ }
75
+ });
76
+ });
77
+ // ─── C1/C4: a custom totemDir reaches every site ─────────
78
+ describe('a custom totemDir is rendered into every hook site (C1/C4)', () => {
79
+ const CUSTOM = 'knowledge';
80
+ const render = { ...DEFAULT_RENDER, totemDir: CUSTOM };
81
+ it('leaves NO `.totem` literal in any hook body', () => {
82
+ for (const { name, body } of renderAll(render)) {
83
+ expect(body, `${name} still carries a hardcoded .totem`).not.toContain('.totem');
84
+ }
85
+ });
86
+ it('pre-commit reads the run store as a JSON literal at the configured dir', () => {
87
+ const hook = buildPreCommitHook({ ...render, tier: 'strict' });
88
+ // JSON.stringify is the quoting regime for the JS string inside the
89
+ // single-quoted `node -e '…'` reader.
90
+ expect(hook).toContain(`const dir = ${JSON.stringify(`${CUSTOM}/artifacts/runs`)};`);
91
+ // ...and both BLOCKED messages name the same rendered directory.
92
+ expect(hook).toContain(`${CUSTOM}/artifacts/runs/ unreadable`);
93
+ expect(hook).toContain(`no totem spec run artifact under ${CUSTOM}/artifacts/runs/`);
94
+ });
95
+ it('pre-push guards are shell-quoted at the configured dir', () => {
96
+ const hook = buildPrePushHook(render);
97
+ expect(hook).toContain(`if [ -f "${CUSTOM}/compile-manifest.json" ]; then`);
98
+ expect(hook).toContain(`if [ -f "${CUSTOM}/compiled-rules.json" ]; then`);
99
+ expect(hook).toContain(`[ -f "README.md" ] && [ -f "${CUSTOM}/compiled-rules.json" ]`);
100
+ });
101
+ it('the two grep filters are BRE-escaped at the configured dir', () => {
102
+ // `knowledge` carries no BRE metacharacter, so it renders verbatim...
103
+ expect(buildHookContent(render)).toContain(`grep -q '${CUSTOM}/lessons/'`);
104
+ expect(buildPostCheckoutHookContent(render)).toContain(`grep -q '${CUSTOM}/'`);
105
+ // ...while a dotted directory has its `.` escaped, exactly as `.totem` does
106
+ // in the shipped hooks (a bare `.` would match any character).
107
+ const dotted = { ...DEFAULT_RENDER, totemDir: '.knowledge' };
108
+ expect(buildHookContent(dotted)).toContain(String.raw `grep -q '\.knowledge/lessons/'`);
109
+ expect(buildPostCheckoutHookContent(dotted)).toContain(String.raw `grep -q '\.knowledge/'`);
110
+ });
111
+ it('post-checkout tests the configured dir for existence', () => {
112
+ expect(buildPostCheckoutHookContent(render)).toContain(`[ -d "${CUSTOM}" ]`);
113
+ });
114
+ it('a dollar sign or a backtick is refused rather than re-quoted (amendment A2)', () => {
115
+ // `$` and a backtick are the only characters that would stay ACTIVE inside the
116
+ // double-quoted `sh` words the guards use. Refusing them (instead of switching
117
+ // those values to single quotes) keeps ONE quoting regime for every `sh` site —
118
+ // the plain double-quoted form `tools/*` ships — so there is no second form to
119
+ // get wrong.
120
+ for (const bad of ['a$b', 'a`b']) {
121
+ expect(() => buildPrePushHook({ ...DEFAULT_RENDER, totemDir: bad })).toThrow(/Refusing to render git hooks/);
122
+ expect(() => buildPostCheckoutHookContent({ ...DEFAULT_RENDER, totemDir: bad })).toThrow(/Refusing to render git hooks/);
123
+ }
124
+ // ...and an accepted value never renders a single-quoted guard word.
125
+ expect(buildPrePushHook(render)).not.toContain(`[ -f '${CUSTOM}/`);
126
+ expect(buildPostCheckoutHookContent(render)).not.toContain(`[ -d '${CUSTOM}'`);
127
+ });
128
+ });
129
+ // ─── C4: the refusal ─────────────────────────────────────
130
+ describe('an unrenderable totemDir is refused loudly (C4)', () => {
131
+ it.each([
132
+ ['a single quote', "it's"],
133
+ ['a double quote', 'a"b'],
134
+ ['a backslash', 'a\\b'],
135
+ ['a dollar sign', 'a$b'],
136
+ ['a backtick', 'a`b'],
137
+ ['a newline', 'a\nb'],
138
+ ['a control character', `a${String.fromCharCode(7)}b`],
139
+ ['a non-ASCII character (git C-quotes it in the paths the diff filters read)', 'ünïcode'],
140
+ ])('refuses %s, naming the value', (_label, totemDir) => {
141
+ let message = '';
142
+ try {
143
+ assertRenderableTotemDir(totemDir);
144
+ }
145
+ catch (err) {
146
+ message = err instanceof Error ? err.message : String(err);
147
+ }
148
+ expect(message).toContain('Refusing to render git hooks');
149
+ // The message must NAME the offending value so the operator can find it.
150
+ expect(message).toContain(JSON.stringify(totemDir));
151
+ // ...and point at the fix.
152
+ expect(message).toContain('totem hook install --force');
153
+ });
154
+ it.each([
155
+ ['buildPreCommitHook', (o) => buildPreCommitHook(o)],
156
+ ['buildPrePushHook', (o) => buildPrePushHook(o)],
157
+ ['buildHookContent', (o) => buildHookContent(o)],
158
+ ['buildPostCheckoutHookContent', (o) => buildPostCheckoutHookContent(o)],
159
+ ])('%s refuses rather than rendering an injectable hook', (_name, build) => {
160
+ expect(() => build({ ...DEFAULT_RENDER, totemDir: "x';rm -rf /;'" })).toThrow(/Refusing to render git hooks/);
161
+ });
162
+ it('accepts the ordinary shapes', () => {
163
+ for (const ok of ['.totem', 'knowledge', 'a/b/c', '.totem-2', 'dir with spaces']) {
164
+ expect(() => assertRenderableTotemDir(ok)).not.toThrow();
165
+ }
166
+ });
167
+ // Amendment A7 (falsification F2.2–F2.5): shapes the schema still accepts
168
+ // (other verbs can use them) but no hook could ever govern — each renders a
169
+ // diff filter that never matches, or an absolute reader path.
170
+ it.each([
171
+ ['an empty value', '', /empty totemDir/],
172
+ ['the config directory itself', '.', /names the config directory itself/],
173
+ ['a trailing slash', 'knowledge/', /trailing slash/],
174
+ ["a '.' segment", './knowledge', /'\.' segment/],
175
+ ["a '..' segment", '../shared', /'\.\.' segment/],
176
+ ['a leading dash', '-x', /leading '-'/],
177
+ ])('refuses %s — a shape the diff filters could never match (A7)', (_label, totemDir, reason) => {
178
+ expect(hookTotemDirProblem(totemDir)).toMatch(reason);
179
+ expect(() => assertRenderableTotemDir(totemDir)).toThrow(/Refusing to render git hooks/);
180
+ });
181
+ it('the installer backstop and the @mmnto/totem schema refuse the SAME characters', () => {
182
+ // The two predicates are declared in two packages; pin them equal over every
183
+ // ASCII code point plus a few beyond so they cannot drift apart.
184
+ const samples = [];
185
+ for (let code = 0; code < 0x80; code++)
186
+ samples.push(`a${String.fromCharCode(code)}b`);
187
+ samples.push('ünïcode', `a${String.fromCharCode(0xa0)}b`, `a${String.fromCharCode(0x2028)}b`);
188
+ for (const sample of samples) {
189
+ expect(hasUnrenderableTotemDirChar(sample), JSON.stringify(sample)).toBe(hasUnrenderableHookChar(sample));
190
+ }
191
+ });
192
+ });
193
+ // ─── C1: the resolver ────────────────────────────────────
194
+ describe('resolveHookRenderOptions — the one config→render seam (C1)', () => {
195
+ let tmpDir;
196
+ beforeEach(() => {
197
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-render-opts-'));
198
+ // A lockfile so fallbackCmd is deterministic across machines.
199
+ fs.writeFileSync(path.join(tmpDir, 'pnpm-lock.yaml'), '');
200
+ });
201
+ afterEach(() => {
202
+ cleanTmpDir(tmpDir);
203
+ });
204
+ function writeConfig(body) {
205
+ fs.writeFileSync(path.join(tmpDir, 'totem.yaml'), body, 'utf-8');
206
+ }
207
+ const BASE_TARGETS = 'targets:\n - glob: "docs/*.md"\n type: lesson\n strategy: markdown-heading\n';
208
+ it('reads totemDir and hooks.tier from the repo config', async () => {
209
+ writeConfig(`${BASE_TARGETS}totemDir: knowledge\nhooks:\n tier: strict\n`);
210
+ const render = await resolveHookRenderOptions(tmpDir);
211
+ expect(render.totemDir).toBe('knowledge');
212
+ expect(render.tier).toBe('strict');
213
+ expect(render.fallbackCmd).toBe('pnpm dlx @mmnto/cli');
214
+ expect(render.configPath).toBe(path.join(tmpDir, 'totem.yaml'));
215
+ });
216
+ it('an explicit flag overrides the configured tier — never the configured totemDir', async () => {
217
+ writeConfig(`${BASE_TARGETS}totemDir: knowledge\nhooks:\n tier: strict\n`);
218
+ const render = await resolveHookRenderOptions(tmpDir, { tier: 'standard' });
219
+ expect(render.tier).toBe('standard');
220
+ expect(render.totemDir).toBe('knowledge');
221
+ });
222
+ it('falls back to the schema default when the config pins no totemDir', async () => {
223
+ writeConfig(BASE_TARGETS);
224
+ const render = await resolveHookRenderOptions(tmpDir);
225
+ expect(render.totemDir).toBe(DEFAULT_TOTEM_DIR);
226
+ expect(render.tier).toBe('standard');
227
+ });
228
+ it('a config that resolves but will not load degrades to the defaults LOUDLY (A8)', async () => {
229
+ writeConfig('targets: [oh no: {');
230
+ const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
231
+ try {
232
+ const render = await resolveHookRenderOptions(tmpDir);
233
+ expect(render.totemDir).toBe(DEFAULT_TOTEM_DIR);
234
+ expect(render.tier).toBe('standard');
235
+ expect(render.configPath).toBeUndefined();
236
+ expect(render.configError).toBeDefined();
237
+ // ONE line names the file and says the defaults were rendered — the
238
+ // silent→loud shape: a repo whose config says otherwise never gets `.totem`
239
+ // hooks without a word.
240
+ expect(errorSpy).toHaveBeenCalledTimes(1);
241
+ const line = String(errorSpy.mock.calls[0]?.[0]);
242
+ expect(line).toContain('totem.yaml');
243
+ expect(line).toContain("totemDir '.totem'");
244
+ expect(line).toContain('totem hook install --force');
245
+ }
246
+ finally {
247
+ errorSpy.mockRestore();
248
+ }
249
+ });
250
+ it('a totemDir the schema refines out is a LOUD default, never a silent `.totem` (A8)', async () => {
251
+ writeConfig(`${BASE_TARGETS}totemDir: a$b\n`);
252
+ const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
253
+ try {
254
+ const render = await resolveHookRenderOptions(tmpDir);
255
+ expect(render.totemDir).toBe(DEFAULT_TOTEM_DIR);
256
+ expect(render.configError).toMatch(/totemDir/);
257
+ expect(errorSpy).toHaveBeenCalledTimes(1);
258
+ }
259
+ finally {
260
+ errorSpy.mockRestore();
261
+ }
262
+ });
263
+ it('a trailing slash in the config is normalised away before rendering (A7)', async () => {
264
+ writeConfig(`${BASE_TARGETS}totemDir: knowledge/\n`);
265
+ const render = await resolveHookRenderOptions(tmpDir);
266
+ expect(render.totemDir).toBe('knowledge');
267
+ expect(buildHookContent(render)).toContain(`grep -q 'knowledge/lessons/'`);
268
+ });
269
+ it('a repo-local totemDir the hooks cannot govern REFUSES at resolve time (A7)', async () => {
270
+ for (const bad of ['.', '../shared', '-x']) {
271
+ writeConfig(`${BASE_TARGETS}totemDir: ${JSON.stringify(bad)}\n`);
272
+ await expect(resolveHookRenderOptions(tmpDir)).rejects.toThrow(/Refusing to render git hooks/);
273
+ }
274
+ });
275
+ it('the resolved options render the hook the WRITER agrees with (init-after-write)', async () => {
276
+ // `totem init` writes the config, THEN installs hooks — so the hook must be
277
+ // rendered from what is on disk at that moment, not from the flags init was
278
+ // called with. Simulate exactly that ordering.
279
+ writeConfig(`${BASE_TARGETS}totemDir: knowledge\n`);
280
+ const render = await resolveHookRenderOptions(tmpDir);
281
+ const hook = buildPreCommitHook({ ...render, tier: 'strict' });
282
+ // The run store `totem spec` writes for this config is <totemDir>/artifacts/runs;
283
+ // the hook's reader must name the same path.
284
+ expect(hook).toContain(`const dir = "knowledge/artifacts/runs";`);
285
+ expect(hook).not.toContain('.totem');
286
+ });
287
+ });
288
+ //# sourceMappingURL=hook-totemdir-render.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-totemdir-render.test.js","sourceRoot":"","sources":["../../src/commands/hook-totemdir-render.test.ts"],"names":[],"mappings":"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"}