@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.
- package/dist/commands/config-drift.test.js +5 -2
- package/dist/commands/config-drift.test.js.map +1 -1
- package/dist/commands/doctor-parity.d.ts.map +1 -1
- package/dist/commands/doctor-parity.js +57 -2
- package/dist/commands/doctor-parity.js.map +1 -1
- package/dist/commands/doctor-parity.test.js +60 -0
- package/dist/commands/doctor-parity.test.js.map +1 -1
- package/dist/commands/doctor.d.ts +19 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +132 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/doctor.test.js +1 -0
- package/dist/commands/doctor.test.js.map +1 -1
- package/dist/commands/gate-install.d.ts.map +1 -1
- package/dist/commands/gate-install.js +12 -3
- package/dist/commands/gate-install.js.map +1 -1
- package/dist/commands/gate-install.test.js +13 -1
- package/dist/commands/gate-install.test.js.map +1 -1
- package/dist/commands/init-templates.d.ts +59 -7
- package/dist/commands/init-templates.d.ts.map +1 -1
- package/dist/commands/init-templates.js +223 -2
- package/dist/commands/init-templates.js.map +1 -1
- package/dist/commands/init.d.ts +38 -4
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +196 -13
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/init.test.js +13 -0
- package/dist/commands/init.test.js.map +1 -1
- package/dist/commands/install-hooks-exit-contract.test.d.ts +2 -0
- package/dist/commands/install-hooks-exit-contract.test.d.ts.map +1 -0
- package/dist/commands/install-hooks-exit-contract.test.js +339 -0
- package/dist/commands/install-hooks-exit-contract.test.js.map +1 -0
- package/dist/commands/install-hooks.d.ts +53 -1
- package/dist/commands/install-hooks.d.ts.map +1 -1
- package/dist/commands/install-hooks.js +239 -52
- package/dist/commands/install-hooks.js.map +1 -1
- package/dist/commands/install-hooks.test.js +105 -39
- package/dist/commands/install-hooks.test.js.map +1 -1
- package/dist/commands/lint-staleness.d.ts +122 -0
- package/dist/commands/lint-staleness.d.ts.map +1 -0
- package/dist/commands/lint-staleness.js +163 -0
- package/dist/commands/lint-staleness.js.map +1 -0
- package/dist/commands/lint-staleness.test.d.ts +2 -0
- package/dist/commands/lint-staleness.test.d.ts.map +1 -0
- package/dist/commands/lint-staleness.test.js +173 -0
- package/dist/commands/lint-staleness.test.js.map +1 -0
- package/dist/commands/lint.d.ts.map +1 -1
- package/dist/commands/lint.js +142 -3
- package/dist/commands/lint.js.map +1 -1
- package/dist/commands/prepare-wrapper.test.d.ts +2 -0
- package/dist/commands/prepare-wrapper.test.d.ts.map +1 -0
- package/dist/commands/prepare-wrapper.test.js +284 -0
- package/dist/commands/prepare-wrapper.test.js.map +1 -0
- package/dist/commands/tools-hook-parity.test.d.ts +2 -0
- package/dist/commands/tools-hook-parity.test.d.ts.map +1 -0
- package/dist/commands/tools-hook-parity.test.js +37 -0
- package/dist/commands/tools-hook-parity.test.js.map +1 -0
- package/dist/commands/wrap.d.ts.map +1 -1
- package/dist/commands/wrap.js +3 -2
- package/dist/commands/wrap.js.map +1 -1
- package/dist/commands/wrap.test.js +11 -1
- package/dist/commands/wrap.test.js.map +1 -1
- 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 @@
|
|
|
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,
|
|
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"}
|
package/dist/commands/wrap.js
CHANGED
|
@@ -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
|
-
'
|
|
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,
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,4DAA4D;AAC5D,EAAE;AACF,4DAA4D;AAC5D,kEAAkE;AAClE,iEAAiE;AACjE,kEAAkE;AAClE,6DAA6D;AAC7D,qDAAqD;AACrD,EAAE;AACF,8DAA8D;AAC9D,sDAAsD;AAEtD,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACrE,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAC1E,MAAM,MAAM,CACV,WAAW,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CACjF,CAAC,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,MAAM,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YACvC,MAAM,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACpD,MAAM,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,MAAM,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YACvC,MAAM,IAAI,GAAI,GAAkB,CAAC,YAAY,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8FAA8F,EAAE,KAAK,IAAI,EAAE;QAC5G,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,MAAM,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YACvC,MAAM,IAAI,GAAI,GAAkB,CAAC,YAAY,CAAC;YAC9C,6EAA6E;YAC7E,mEAAmE;YACnE,mEAAmE;YACnE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iDAAiD,CAAC,CAAC;
|
|
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.
|
|
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.
|
|
31
|
+
"@mmnto/totem": "1.101.0"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@anthropic-ai/sdk": "^0.98.0",
|