@mmnto/cli 1.3.17 → 1.3.19
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/assets/compiled-baseline.js +4 -4
- package/dist/commands/eject.d.ts +15 -0
- package/dist/commands/eject.d.ts.map +1 -1
- package/dist/commands/eject.js +52 -18
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/eject.test.js +147 -1
- package/dist/commands/eject.test.js.map +1 -1
- package/dist/commands/install-hooks.d.ts +2 -0
- package/dist/commands/install-hooks.d.ts.map +1 -1
- package/dist/commands/install-hooks.js +64 -12
- package/dist/commands/install-hooks.js.map +1 -1
- package/dist/commands/install-hooks.test.js +86 -2
- package/dist/commands/install-hooks.test.js.map +1 -1
- package/dist/commands/sync.d.ts +1 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +9 -1
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/sync.test.d.ts +2 -0
- package/dist/commands/sync.test.d.ts.map +1 -0
- package/dist/commands/sync.test.js +68 -0
- package/dist/commands/sync.test.js.map +1 -0
- package/dist/commands/wrap.d.ts.map +1 -1
- package/dist/commands/wrap.js +29 -7
- package/dist/commands/wrap.js.map +1 -1
- package/dist/commands/wrap.test.js +6 -0
- package/dist/commands/wrap.test.js.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -292,7 +292,7 @@ export const COMPILED_BASELINE_RULES = [
|
|
|
292
292
|
category: 'style',
|
|
293
293
|
},
|
|
294
294
|
{
|
|
295
|
-
lessonHash: '
|
|
295
|
+
lessonHash: 'dd4542e69ec3d5a1',
|
|
296
296
|
lessonHeading: 'The shell option in spawn() calls should be omitted',
|
|
297
297
|
pattern: '',
|
|
298
298
|
message: 'Omit shell:true when spawn args are an array. Note: only catches inline array literals, not variable args or two-arg form.',
|
|
@@ -305,7 +305,7 @@ export const COMPILED_BASELINE_RULES = [
|
|
|
305
305
|
category: 'style',
|
|
306
306
|
},
|
|
307
307
|
{
|
|
308
|
-
lessonHash: '
|
|
308
|
+
lessonHash: 'c0f2a3fd2956184e',
|
|
309
309
|
lessonHeading: 'PID-based process liveness checks (process.kill(pid, 0))',
|
|
310
310
|
pattern: '',
|
|
311
311
|
message: 'PID-based process liveness checks (process.kill(pid, 0))',
|
|
@@ -318,7 +318,7 @@ export const COMPILED_BASELINE_RULES = [
|
|
|
318
318
|
category: 'style',
|
|
319
319
|
},
|
|
320
320
|
{
|
|
321
|
-
lessonHash: '
|
|
321
|
+
lessonHash: 'df326a7c29885525',
|
|
322
322
|
lessonHeading: 'Perform explicit null and type checks on the results',
|
|
323
323
|
pattern: '',
|
|
324
324
|
message: 'Perform explicit null and type checks on the results',
|
|
@@ -331,7 +331,7 @@ export const COMPILED_BASELINE_RULES = [
|
|
|
331
331
|
category: 'style',
|
|
332
332
|
},
|
|
333
333
|
{
|
|
334
|
-
lessonHash: '
|
|
334
|
+
lessonHash: '5cbf4ee7e76975d4',
|
|
335
335
|
lessonHeading: 'The @ast-grep/napi findAll method accepts both string',
|
|
336
336
|
pattern: '',
|
|
337
337
|
message: 'The @ast-grep/napi findAll method accepts both string',
|
package/dist/commands/eject.d.ts
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
export interface EjectSummary {
|
|
2
|
+
removed: string[];
|
|
3
|
+
scrubbed: string[];
|
|
4
|
+
skipped: string[];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Remove the Totem section from the post-merge git hook.
|
|
8
|
+
* Deletes the file entirely if it only contains the Totem hook.
|
|
9
|
+
*/
|
|
10
|
+
export declare function scrubPostMergeHook(cwd: string, summary: EjectSummary): void;
|
|
11
|
+
/**
|
|
12
|
+
* Remove the Totem section from the post-checkout git hook.
|
|
13
|
+
* Deletes the file entirely if it only contains the Totem hook.
|
|
14
|
+
*/
|
|
15
|
+
export declare function scrubPostCheckoutHook(cwd: string, summary: EjectSummary): void;
|
|
1
16
|
export interface EjectOptions {
|
|
2
17
|
force?: boolean;
|
|
3
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eject.d.ts","sourceRoot":"","sources":["../../src/commands/eject.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"eject.d.ts","sourceRoot":"","sources":["../../src/commands/eject.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA4ED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAE3E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAE9E;AAqJD,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DvE"}
|
package/dist/commands/eject.js
CHANGED
|
@@ -6,6 +6,9 @@ import { log } from '../ui.js';
|
|
|
6
6
|
// ─── Constants ──────────────────────────────────────────
|
|
7
7
|
const TAG = 'Eject';
|
|
8
8
|
const TOTEM_HOOK_MARKER = '[totem] post-merge hook';
|
|
9
|
+
const TOTEM_HOOK_END = '[totem] end post-merge';
|
|
10
|
+
const TOTEM_CHECKOUT_MARKER = '[totem] post-checkout hook';
|
|
11
|
+
const TOTEM_CHECKOUT_END = '[totem] end post-checkout';
|
|
9
12
|
const TOTEM_FILE_MARKER = '// [totem] auto-generated';
|
|
10
13
|
/** Files that may have AI reflex blocks appended by `totem init`. */
|
|
11
14
|
const REFLEX_FILES = ['CLAUDE.md', '.cursorrules'];
|
|
@@ -17,51 +20,81 @@ const TOTEM_SCAFFOLDED_FILES = [
|
|
|
17
20
|
'.totem/hooks/shield-gate.cjs',
|
|
18
21
|
];
|
|
19
22
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
23
|
+
* Generic hook scrubber — removes Totem block from a git hook file.
|
|
24
|
+
* Uses deterministic end marker when present, falls back to heuristic for old format.
|
|
22
25
|
*/
|
|
23
|
-
function
|
|
24
|
-
const
|
|
26
|
+
function scrubHook(cwd, summary, hookName, startMarker, endMarker) {
|
|
27
|
+
const hookFileName = `.git/hooks/${hookName}`;
|
|
28
|
+
const hookPath = path.join(cwd, hookFileName);
|
|
25
29
|
if (!fs.existsSync(hookPath)) {
|
|
26
|
-
summary.skipped.push(
|
|
30
|
+
summary.skipped.push(`${hookFileName} (not found)`);
|
|
27
31
|
return;
|
|
28
32
|
}
|
|
29
33
|
const content = fs.readFileSync(hookPath, 'utf-8');
|
|
30
|
-
if (!content.includes(
|
|
31
|
-
summary.skipped.push(
|
|
34
|
+
if (!content.includes(startMarker)) {
|
|
35
|
+
summary.skipped.push(`${hookFileName} (no Totem section)`);
|
|
32
36
|
return;
|
|
33
37
|
}
|
|
34
|
-
|
|
38
|
+
const endSentinel = `# ${endMarker}`;
|
|
39
|
+
const hasEndMarker = content.includes(endSentinel);
|
|
35
40
|
const lines = content.split('\n');
|
|
36
41
|
const filtered = [];
|
|
37
42
|
let inTotemBlock = false;
|
|
38
43
|
for (const line of lines) {
|
|
39
|
-
if (line.includes(
|
|
44
|
+
if (line.includes(startMarker)) {
|
|
40
45
|
inTotemBlock = true;
|
|
41
46
|
continue;
|
|
42
47
|
}
|
|
43
48
|
if (inTotemBlock) {
|
|
44
|
-
|
|
49
|
+
if (hasEndMarker) {
|
|
50
|
+
// New format: skip everything until exact end sentinel line
|
|
51
|
+
if (line.trim() === endSentinel) {
|
|
52
|
+
inTotemBlock = false;
|
|
53
|
+
}
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
// Old format (no end marker): skip known totem lines only
|
|
45
57
|
if (line === '' ||
|
|
58
|
+
line.trim() === '' ||
|
|
46
59
|
line.startsWith('echo "[totem]') ||
|
|
47
|
-
line.startsWith('(')
|
|
48
|
-
line.trim() === '') {
|
|
60
|
+
line.startsWith('(')) {
|
|
49
61
|
continue;
|
|
50
62
|
}
|
|
63
|
+
// Unrecognised line — stop skipping to protect user content
|
|
51
64
|
inTotemBlock = false;
|
|
52
65
|
}
|
|
53
66
|
filtered.push(line);
|
|
54
67
|
}
|
|
55
68
|
const remaining = filtered.join('\n').trim();
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
69
|
+
try {
|
|
70
|
+
if (!remaining || remaining === '#!/bin/sh') {
|
|
71
|
+
fs.unlinkSync(hookPath);
|
|
72
|
+
summary.removed.push(hookFileName);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
fs.writeFileSync(hookPath, remaining + '\n', 'utf-8');
|
|
76
|
+
summary.scrubbed.push(hookFileName);
|
|
77
|
+
}
|
|
59
78
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
summary.
|
|
79
|
+
catch (err) {
|
|
80
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
81
|
+
summary.skipped.push(`${hookFileName} (${msg})`);
|
|
63
82
|
}
|
|
64
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* Remove the Totem section from the post-merge git hook.
|
|
86
|
+
* Deletes the file entirely if it only contains the Totem hook.
|
|
87
|
+
*/
|
|
88
|
+
export function scrubPostMergeHook(cwd, summary) {
|
|
89
|
+
scrubHook(cwd, summary, 'post-merge', TOTEM_HOOK_MARKER, TOTEM_HOOK_END);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Remove the Totem section from the post-checkout git hook.
|
|
93
|
+
* Deletes the file entirely if it only contains the Totem hook.
|
|
94
|
+
*/
|
|
95
|
+
export function scrubPostCheckoutHook(cwd, summary) {
|
|
96
|
+
scrubHook(cwd, summary, 'post-checkout', TOTEM_CHECKOUT_MARKER, TOTEM_CHECKOUT_END);
|
|
97
|
+
}
|
|
65
98
|
/**
|
|
66
99
|
* Remove scaffolded files that are fully owned by Totem.
|
|
67
100
|
* Only removes files that contain the Totem marker to avoid deleting user files.
|
|
@@ -217,6 +250,7 @@ export async function ejectCommand(options) {
|
|
|
217
250
|
const summary = { removed: [], scrubbed: [], skipped: [] };
|
|
218
251
|
// 1. Scrub git hooks
|
|
219
252
|
scrubPostMergeHook(cwd, summary);
|
|
253
|
+
scrubPostCheckoutHook(cwd, summary);
|
|
220
254
|
// 2. Remove scaffolded Gemini/Claude hook files
|
|
221
255
|
removeScaffoldedFiles(cwd, summary);
|
|
222
256
|
// 3. Scrub Claude settings.local.json
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eject.js","sourceRoot":"","sources":["../../src/commands/eject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,2DAA2D;AAE3D,MAAM,GAAG,GAAG,OAAO,CAAC;AACpB,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AACpD,MAAM,iBAAiB,GAAG,2BAA2B,CAAC;AAEtD,qEAAqE;AACrE,MAAM,YAAY,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;AAEnD,sEAAsE;AACtE,MAAM,sBAAsB,GAAG;IAC7B,+BAA+B;IAC/B,6BAA6B;IAC7B,yBAAyB;IACzB,8BAA8B;CAC/B,CAAC;AAUF;;;GAGG;AACH,SAAS,
|
|
1
|
+
{"version":3,"file":"eject.js","sourceRoot":"","sources":["../../src/commands/eject.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import * as fs from 'node:fs';
|
|
|
2
2
|
import * as os from 'node:os';
|
|
3
3
|
import * as path from 'node:path';
|
|
4
4
|
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
|
-
import { ejectCommand } from './eject.js';
|
|
5
|
+
import { ejectCommand, scrubPostCheckoutHook, scrubPostMergeHook } from './eject.js';
|
|
6
6
|
function makeTmpDir() {
|
|
7
7
|
return fs.mkdtempSync(path.join(os.tmpdir(), 'totem-eject-'));
|
|
8
8
|
}
|
|
@@ -95,5 +95,151 @@ describe('ejectCommand', () => {
|
|
|
95
95
|
await ejectCommand({ force: true });
|
|
96
96
|
// Should not throw
|
|
97
97
|
});
|
|
98
|
+
it('removes post-merge hook with new conditional format (if/fi block)', async () => {
|
|
99
|
+
const hookPath = path.join(cwd, '.git', 'hooks', 'post-merge');
|
|
100
|
+
fs.writeFileSync(hookPath, `#!/bin/sh
|
|
101
|
+
# [totem] post-merge hook — background re-index after pull/merge.
|
|
102
|
+
|
|
103
|
+
# Only sync when lessons changed (suppress errors if ORIG_HEAD is missing)
|
|
104
|
+
if git diff-tree -r --name-only ORIG_HEAD HEAD 2>/dev/null | grep -q '\\.totem/lessons/'; then
|
|
105
|
+
(pnpm exec totem sync --incremental --quiet > .git/totem-sync.log 2>&1) &
|
|
106
|
+
fi
|
|
107
|
+
# [totem] end post-merge
|
|
108
|
+
`);
|
|
109
|
+
await ejectCommand({ force: true });
|
|
110
|
+
expect(fs.existsSync(hookPath)).toBe(false);
|
|
111
|
+
});
|
|
112
|
+
it('preserves non-Totem content when scrubbing new conditional format', async () => {
|
|
113
|
+
const hookPath = path.join(cwd, '.git', 'hooks', 'post-merge');
|
|
114
|
+
fs.writeFileSync(hookPath, `#!/bin/sh
|
|
115
|
+
echo "my custom hook"
|
|
116
|
+
# [totem] post-merge hook — background re-index after pull/merge.
|
|
117
|
+
|
|
118
|
+
# Only sync when lessons changed (suppress errors if ORIG_HEAD is missing)
|
|
119
|
+
if git diff-tree -r --name-only ORIG_HEAD HEAD 2>/dev/null | grep -q '\\.totem/lessons/'; then
|
|
120
|
+
(pnpm exec totem sync --incremental --quiet > .git/totem-sync.log 2>&1) &
|
|
121
|
+
fi
|
|
122
|
+
# [totem] end post-merge
|
|
123
|
+
`);
|
|
124
|
+
await ejectCommand({ force: true });
|
|
125
|
+
expect(fs.existsSync(hookPath)).toBe(true);
|
|
126
|
+
const content = fs.readFileSync(hookPath, 'utf-8');
|
|
127
|
+
expect(content).toContain('my custom hook');
|
|
128
|
+
expect(content).not.toContain('[totem]');
|
|
129
|
+
expect(content).not.toContain('ORIG_HEAD');
|
|
130
|
+
expect(content).not.toContain('fi');
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
// ─── scrubPostMergeHook (direct unit tests) ─────────
|
|
134
|
+
describe('scrubPostMergeHook', () => {
|
|
135
|
+
let cwd;
|
|
136
|
+
beforeEach(() => {
|
|
137
|
+
cwd = makeTmpDir();
|
|
138
|
+
fs.mkdirSync(path.join(cwd, '.git', 'hooks'), { recursive: true });
|
|
139
|
+
});
|
|
140
|
+
afterEach(() => {
|
|
141
|
+
fs.rmSync(cwd, { recursive: true, force: true });
|
|
142
|
+
});
|
|
143
|
+
it('scrubs new conditional hook format (if/fi block)', () => {
|
|
144
|
+
const hookPath = path.join(cwd, '.git', 'hooks', 'post-merge');
|
|
145
|
+
fs.writeFileSync(hookPath, `#!/bin/sh
|
|
146
|
+
# [totem] post-merge hook — background re-index after pull/merge.
|
|
147
|
+
|
|
148
|
+
# Only sync when lessons changed (suppress errors if ORIG_HEAD is missing)
|
|
149
|
+
if git diff-tree -r --name-only ORIG_HEAD HEAD 2>/dev/null | grep -q '\\.totem/lessons/'; then
|
|
150
|
+
(pnpm exec totem sync --incremental --quiet > .git/totem-sync.log 2>&1) &
|
|
151
|
+
fi
|
|
152
|
+
# [totem] end post-merge
|
|
153
|
+
`);
|
|
154
|
+
const summary = { removed: [], scrubbed: [], skipped: [] };
|
|
155
|
+
scrubPostMergeHook(cwd, summary);
|
|
156
|
+
expect(fs.existsSync(hookPath)).toBe(false);
|
|
157
|
+
expect(summary.removed).toContain('.git/hooks/post-merge');
|
|
158
|
+
});
|
|
159
|
+
it('scrubs old unconditional hook format', () => {
|
|
160
|
+
const hookPath = path.join(cwd, '.git', 'hooks', 'post-merge');
|
|
161
|
+
fs.writeFileSync(hookPath, '#!/bin/sh\n# [totem] post-merge hook — background re-index after pull/merge.\n\necho "[totem] Triggering background re-index..."\n(pnpm exec totem sync --incremental > .git/totem-sync.log 2>&1) &\n');
|
|
162
|
+
const summary = { removed: [], scrubbed: [], skipped: [] };
|
|
163
|
+
scrubPostMergeHook(cwd, summary);
|
|
164
|
+
expect(fs.existsSync(hookPath)).toBe(false);
|
|
165
|
+
expect(summary.removed).toContain('.git/hooks/post-merge');
|
|
166
|
+
});
|
|
167
|
+
it('preserves non-totem content when scrubbing', () => {
|
|
168
|
+
const hookPath = path.join(cwd, '.git', 'hooks', 'post-merge');
|
|
169
|
+
fs.writeFileSync(hookPath, `#!/bin/sh
|
|
170
|
+
echo "deploy notification"
|
|
171
|
+
# [totem] post-merge hook — background re-index after pull/merge.
|
|
172
|
+
|
|
173
|
+
# Only sync when lessons changed (suppress errors if ORIG_HEAD is missing)
|
|
174
|
+
if git diff-tree -r --name-only ORIG_HEAD HEAD 2>/dev/null | grep -q '\\.totem/lessons/'; then
|
|
175
|
+
(pnpm exec totem sync --incremental --quiet > .git/totem-sync.log 2>&1) &
|
|
176
|
+
fi
|
|
177
|
+
# [totem] end post-merge
|
|
178
|
+
`);
|
|
179
|
+
const summary = { removed: [], scrubbed: [], skipped: [] };
|
|
180
|
+
scrubPostMergeHook(cwd, summary);
|
|
181
|
+
expect(fs.existsSync(hookPath)).toBe(true);
|
|
182
|
+
const content = fs.readFileSync(hookPath, 'utf-8');
|
|
183
|
+
expect(content).toContain('deploy notification');
|
|
184
|
+
expect(content).not.toContain('[totem]');
|
|
185
|
+
expect(summary.scrubbed).toContain('.git/hooks/post-merge');
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
// ─── scrubPostCheckoutHook (direct unit tests) ──────
|
|
189
|
+
describe('scrubPostCheckoutHook', () => {
|
|
190
|
+
let cwd;
|
|
191
|
+
beforeEach(() => {
|
|
192
|
+
cwd = makeTmpDir();
|
|
193
|
+
fs.mkdirSync(path.join(cwd, '.git', 'hooks'), { recursive: true });
|
|
194
|
+
});
|
|
195
|
+
afterEach(() => {
|
|
196
|
+
fs.rmSync(cwd, { recursive: true, force: true });
|
|
197
|
+
});
|
|
198
|
+
it('removes post-checkout hook with end marker', () => {
|
|
199
|
+
const hookPath = path.join(cwd, '.git', 'hooks', 'post-checkout');
|
|
200
|
+
fs.writeFileSync(hookPath, `#!/bin/sh
|
|
201
|
+
# [totem] post-checkout hook — background re-index on branch switch.
|
|
202
|
+
|
|
203
|
+
# $1 = previous HEAD, $2 = new HEAD, $3 = checkout type (1=branch, 0=file)
|
|
204
|
+
# Skip file checkouts — only sync on branch switches
|
|
205
|
+
if [ "$3" = "0" ]; then
|
|
206
|
+
exit 0
|
|
207
|
+
fi
|
|
208
|
+
|
|
209
|
+
# Only sync when .totem/ files differ between branches
|
|
210
|
+
if git diff --name-only "$1" "$2" 2>/dev/null | grep -q '\\.totem/'; then
|
|
211
|
+
(pnpm exec totem sync --incremental --quiet > .git/totem-sync.log 2>&1) &
|
|
212
|
+
fi
|
|
213
|
+
# [totem] end post-checkout
|
|
214
|
+
`);
|
|
215
|
+
const summary = { removed: [], scrubbed: [], skipped: [] };
|
|
216
|
+
scrubPostCheckoutHook(cwd, summary);
|
|
217
|
+
expect(fs.existsSync(hookPath)).toBe(false);
|
|
218
|
+
expect(summary.removed).toContain('.git/hooks/post-checkout');
|
|
219
|
+
});
|
|
220
|
+
it('preserves non-Totem content in post-checkout hook', () => {
|
|
221
|
+
const hookPath = path.join(cwd, '.git', 'hooks', 'post-checkout');
|
|
222
|
+
fs.writeFileSync(hookPath, `#!/bin/sh
|
|
223
|
+
echo "deploy notification"
|
|
224
|
+
# [totem] post-checkout hook — background re-index on branch switch.
|
|
225
|
+
|
|
226
|
+
# $1 = previous HEAD, $2 = new HEAD, $3 = checkout type (1=branch, 0=file)
|
|
227
|
+
if [ "$3" = "0" ]; then
|
|
228
|
+
exit 0
|
|
229
|
+
fi
|
|
230
|
+
|
|
231
|
+
if git diff --name-only "$1" "$2" 2>/dev/null | grep -q '\\.totem/'; then
|
|
232
|
+
(pnpm exec totem sync --incremental --quiet > .git/totem-sync.log 2>&1) &
|
|
233
|
+
fi
|
|
234
|
+
# [totem] end post-checkout
|
|
235
|
+
`);
|
|
236
|
+
const summary = { removed: [], scrubbed: [], skipped: [] };
|
|
237
|
+
scrubPostCheckoutHook(cwd, summary);
|
|
238
|
+
expect(fs.existsSync(hookPath)).toBe(true);
|
|
239
|
+
const content = fs.readFileSync(hookPath, 'utf-8');
|
|
240
|
+
expect(content).toContain('deploy notification');
|
|
241
|
+
expect(content).not.toContain('[totem]');
|
|
242
|
+
expect(summary.scrubbed).toContain('.git/hooks/post-checkout');
|
|
243
|
+
});
|
|
98
244
|
});
|
|
99
245
|
//# sourceMappingURL=eject.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eject.test.js","sourceRoot":"","sources":["../../src/commands/eject.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"eject.test.js","sourceRoot":"","sources":["../../src/commands/eject.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import * as readline from 'node:readline/promises';
|
|
|
2
2
|
export declare const TOTEM_PRECOMMIT_MARKER = "[totem] pre-commit hook";
|
|
3
3
|
export declare const TOTEM_PREPUSH_MARKER = "[totem] pre-push hook";
|
|
4
4
|
export declare function detectTotemPrefix(cwd: string): string;
|
|
5
|
+
export declare function buildPostCheckoutHookContent(syncCmd: string): string;
|
|
5
6
|
export declare function installPostMergeHook(cwd: string, rl: readline.Interface): Promise<void>;
|
|
6
7
|
export declare function buildPreCommitHook(): string;
|
|
7
8
|
export declare function buildPrePushHook(shieldCmd: string): string;
|
|
@@ -25,6 +26,7 @@ export interface HooksCommandResult {
|
|
|
25
26
|
preCommit: 'installed' | 'exists' | 'appended' | 'skipped-non-shell';
|
|
26
27
|
prePush: 'installed' | 'exists' | 'appended' | 'skipped-non-shell';
|
|
27
28
|
postMerge: 'installed' | 'exists' | 'appended' | 'skipped-non-shell';
|
|
29
|
+
postCheckout: 'installed' | 'exists' | 'appended' | 'skipped-non-shell';
|
|
28
30
|
}
|
|
29
31
|
/**
|
|
30
32
|
* Non-interactive hook installer for `totem hooks` and `prepare` scripts.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-hooks.d.ts","sourceRoot":"","sources":["../../src/commands/install-hooks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"install-hooks.d.ts","sourceRoot":"","sources":["../../src/commands/install-hooks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AAQnD,eAAO,MAAM,sBAAsB,4BAA4B,CAAC;AAChE,eAAO,MAAM,oBAAoB,0BAA0B,CAAC;AAI5D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMrD;AAkBD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAwBpE;AAwFD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA0D7F;AAID,wBAAgB,kBAAkB,IAAI,MAAM,CAa3C;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAW1D;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,mBAAmB,CAoC3D;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,mBAAmB,CAAC;IACjF,OAAO,EAAE,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,mBAAmB,CAAC;CAChF;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,QAAQ,CAAC,SAAS,GACrB,OAAO,CAAC,qBAAqB,CAAC,CAuDhC;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CA4BzD;AAID,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,mBAAmB,CAAC;IACrE,OAAO,EAAE,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,mBAAmB,CAAC;IACnE,SAAS,EAAE,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,mBAAmB,CAAC;IACrE,YAAY,EAAE,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,mBAAmB,CAAC;CACzE;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CA+CjF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CA8BxD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAqD5D"}
|
|
@@ -4,6 +4,9 @@ import { stdin as input, stdout as output } from 'node:process';
|
|
|
4
4
|
import * as readline from 'node:readline/promises';
|
|
5
5
|
import { resolveGitRoot } from '../git.js';
|
|
6
6
|
const TOTEM_HOOK_MARKER = '[totem] post-merge hook';
|
|
7
|
+
const TOTEM_HOOK_END = '[totem] end post-merge';
|
|
8
|
+
const TOTEM_CHECKOUT_MARKER = '[totem] post-checkout hook';
|
|
9
|
+
const TOTEM_CHECKOUT_END = '[totem] end post-checkout';
|
|
7
10
|
export const TOTEM_PRECOMMIT_MARKER = '[totem] pre-commit hook';
|
|
8
11
|
export const TOTEM_PREPUSH_MARKER = '[totem] pre-push hook';
|
|
9
12
|
export function detectTotemPrefix(cwd) {
|
|
@@ -16,14 +19,42 @@ export function detectTotemPrefix(cwd) {
|
|
|
16
19
|
return 'npx totem';
|
|
17
20
|
}
|
|
18
21
|
function detectSyncCommand(cwd) {
|
|
19
|
-
return `${detectTotemPrefix(cwd)} sync --incremental`;
|
|
22
|
+
return `${detectTotemPrefix(cwd)} sync --incremental --quiet`;
|
|
20
23
|
}
|
|
21
24
|
function buildHookContent(syncCmd) {
|
|
22
25
|
return `#!/bin/sh
|
|
23
26
|
# ${TOTEM_HOOK_MARKER} — background re-index after pull/merge.
|
|
24
27
|
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
# Only sync when lessons changed (suppress errors if ORIG_HEAD is missing)
|
|
29
|
+
if git diff-tree -r --name-only ORIG_HEAD HEAD 2>/dev/null | grep -q '\\.totem/lessons/'; then
|
|
30
|
+
(${syncCmd} > .git/totem-sync.log 2>&1) &
|
|
31
|
+
fi
|
|
32
|
+
# ${TOTEM_HOOK_END}
|
|
33
|
+
`;
|
|
34
|
+
}
|
|
35
|
+
export function buildPostCheckoutHookContent(syncCmd) {
|
|
36
|
+
return `#!/bin/sh
|
|
37
|
+
# ${TOTEM_CHECKOUT_MARKER} — background re-index on branch switch.
|
|
38
|
+
|
|
39
|
+
# $1 = previous HEAD, $2 = new HEAD, $3 = checkout type (1=branch, 0=file)
|
|
40
|
+
# Skip file checkouts — only sync on branch switches
|
|
41
|
+
if [ "$3" = "0" ]; then
|
|
42
|
+
exit 0
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
# Handle initial checkout (null SHA) — sync if .totem/ exists
|
|
46
|
+
if [ "$1" = "0000000000000000000000000000000000000000" ]; then
|
|
47
|
+
if [ -d ".totem" ]; then
|
|
48
|
+
(${syncCmd} > .git/totem-sync.log 2>&1) &
|
|
49
|
+
fi
|
|
50
|
+
exit 0
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
# Only sync when .totem/ files differ between branches
|
|
54
|
+
if git diff --name-only "$1" "$2" 2>/dev/null | grep -q '\\.totem/'; then
|
|
55
|
+
(${syncCmd} > .git/totem-sync.log 2>&1) &
|
|
56
|
+
fi
|
|
57
|
+
# ${TOTEM_CHECKOUT_END}
|
|
27
58
|
`;
|
|
28
59
|
}
|
|
29
60
|
function detectHookManager(cwd) {
|
|
@@ -67,6 +98,9 @@ function printHookManagerGuidance(manager, syncCmd, shieldCmd) {
|
|
|
67
98
|
console.error('');
|
|
68
99
|
console.error(' # .husky/post-merge — background re-index');
|
|
69
100
|
console.error(` ${syncCmd}`);
|
|
101
|
+
console.error('');
|
|
102
|
+
console.error(' # .husky/post-checkout — background re-index on branch switch');
|
|
103
|
+
console.error(` ${syncCmd}`);
|
|
70
104
|
break;
|
|
71
105
|
case 'lefthook':
|
|
72
106
|
console.error('[Totem] Detected lefthook. Add to your lefthook.yml:');
|
|
@@ -82,13 +116,18 @@ function printHookManagerGuidance(manager, syncCmd, shieldCmd) {
|
|
|
82
116
|
console.error(' commands:');
|
|
83
117
|
console.error(' totem-sync:');
|
|
84
118
|
console.error(` run: ${syncCmd}`);
|
|
119
|
+
console.error(' post-checkout:');
|
|
120
|
+
console.error(' commands:');
|
|
121
|
+
console.error(' totem-sync-checkout:');
|
|
122
|
+
console.error(` run: ${syncCmd}`);
|
|
85
123
|
break;
|
|
86
124
|
case 'simple-git-hooks':
|
|
87
125
|
console.error('[Totem] Detected simple-git-hooks. Add to your package.json:');
|
|
88
126
|
console.error(' "simple-git-hooks": {');
|
|
89
127
|
console.error(' "pre-commit": "branch=$(git rev-parse --abbrev-ref HEAD); if [ \\"$branch\\" = main ] || [ \\"$branch\\" = master ]; then echo \\"[Totem] Direct commits to $branch blocked.\\" && exit 1; fi",');
|
|
90
128
|
console.error(` "pre-push": "if [ -f \\".totem/compiled-rules.json\\" ]; then ${shieldCmd}; fi",`);
|
|
91
|
-
console.error(` "post-merge": "${syncCmd}"
|
|
129
|
+
console.error(` "post-merge": "${syncCmd}",`);
|
|
130
|
+
console.error(` "post-checkout": "${syncCmd}"`);
|
|
92
131
|
console.error(' }');
|
|
93
132
|
break;
|
|
94
133
|
}
|
|
@@ -120,14 +159,12 @@ export async function installPostMergeHook(cwd, rl) {
|
|
|
120
159
|
console.log('[Totem] Post-merge hook already installed.');
|
|
121
160
|
return;
|
|
122
161
|
}
|
|
123
|
-
// Append to existing hook
|
|
162
|
+
// Append to existing hook — reuse buildHookContent, strip shebang
|
|
124
163
|
const separator = existing.endsWith('\n') ? '' : '\n';
|
|
125
|
-
const appendBlock =
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
(
|
|
129
|
-
`;
|
|
130
|
-
fs.appendFileSync(hookPath, appendBlock);
|
|
164
|
+
const appendBlock = buildHookContent(syncCmd)
|
|
165
|
+
.replace(/^#!\/bin\/sh\n/, '')
|
|
166
|
+
.trimStart();
|
|
167
|
+
fs.appendFileSync(hookPath, separator + '\n' + appendBlock);
|
|
131
168
|
console.log('[Totem] Appended post-merge hook to existing hook file.');
|
|
132
169
|
return;
|
|
133
170
|
}
|
|
@@ -249,6 +286,17 @@ export async function installHooksCommand() {
|
|
|
249
286
|
try {
|
|
250
287
|
await installEnforcementHooks(cwd, rl);
|
|
251
288
|
await installPostMergeHook(cwd, rl);
|
|
289
|
+
// Silently install post-checkout alongside post-merge (same guard — only if post-merge was accepted)
|
|
290
|
+
const gitRoot = resolveGitRoot(cwd);
|
|
291
|
+
if (gitRoot && !detectHookManager(gitRoot)) {
|
|
292
|
+
const hooksDir = path.join(gitRoot, '.git', 'hooks');
|
|
293
|
+
const postMerge = path.join(hooksDir, 'post-merge');
|
|
294
|
+
const hasPostMerge = fs.existsSync(postMerge) && fs.readFileSync(postMerge, 'utf-8').includes(TOTEM_HOOK_MARKER);
|
|
295
|
+
if (hasPostMerge) {
|
|
296
|
+
const syncCmd = detectSyncCommand(gitRoot);
|
|
297
|
+
installGitHook(hooksDir, 'post-checkout', buildPostCheckoutHookContent(syncCmd), TOTEM_CHECKOUT_MARKER);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
252
300
|
}
|
|
253
301
|
finally {
|
|
254
302
|
rl.close();
|
|
@@ -280,7 +328,9 @@ export function installHooksNonInteractive(cwd) {
|
|
|
280
328
|
const prePush = installGitHook(hooksDir, 'pre-push', buildPrePushHook(shieldCmd), TOTEM_PREPUSH_MARKER);
|
|
281
329
|
const postMergeContent = buildHookContent(syncCmd);
|
|
282
330
|
const postMerge = installGitHook(hooksDir, 'post-merge', postMergeContent, TOTEM_HOOK_MARKER);
|
|
283
|
-
|
|
331
|
+
const postCheckoutContent = buildPostCheckoutHookContent(syncCmd);
|
|
332
|
+
const postCheckout = installGitHook(hooksDir, 'post-checkout', postCheckoutContent, TOTEM_CHECKOUT_MARKER);
|
|
333
|
+
return { preCommit, prePush, postMerge, postCheckout };
|
|
284
334
|
}
|
|
285
335
|
/**
|
|
286
336
|
* Check that all Totem hooks are installed. Returns true if all present.
|
|
@@ -295,6 +345,7 @@ export function checkHooksInstalled(cwd) {
|
|
|
295
345
|
{ file: 'pre-commit', marker: TOTEM_PRECOMMIT_MARKER },
|
|
296
346
|
{ file: 'pre-push', marker: TOTEM_PREPUSH_MARKER },
|
|
297
347
|
{ file: 'post-merge', marker: TOTEM_HOOK_MARKER },
|
|
348
|
+
{ file: 'post-checkout', marker: TOTEM_CHECKOUT_MARKER },
|
|
298
349
|
];
|
|
299
350
|
let allPresent = true;
|
|
300
351
|
for (const { file, marker } of markers) {
|
|
@@ -343,6 +394,7 @@ export function hooksCommand(opts) {
|
|
|
343
394
|
{ name: 'pre-commit', status: result.preCommit },
|
|
344
395
|
{ name: 'pre-push', status: result.prePush },
|
|
345
396
|
{ name: 'post-merge', status: result.postMerge },
|
|
397
|
+
{ name: 'post-checkout', status: result.postCheckout },
|
|
346
398
|
];
|
|
347
399
|
for (const { name, status } of actions) {
|
|
348
400
|
switch (status) {
|