@mmnto/cli 1.6.1 → 1.6.2

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 (66) hide show
  1. package/dist/commands/check.js +2 -2
  2. package/dist/commands/check.test.js +9 -8
  3. package/dist/commands/check.test.js.map +1 -1
  4. package/dist/commands/config-drift.test.js +5 -4
  5. package/dist/commands/config-drift.test.js.map +1 -1
  6. package/dist/commands/config.d.ts +4 -0
  7. package/dist/commands/config.d.ts.map +1 -0
  8. package/dist/commands/config.js +39 -0
  9. package/dist/commands/config.js.map +1 -0
  10. package/dist/commands/config.test.d.ts +2 -0
  11. package/dist/commands/config.test.d.ts.map +1 -0
  12. package/dist/commands/config.test.js +117 -0
  13. package/dist/commands/config.test.js.map +1 -0
  14. package/dist/commands/docs.d.ts +1 -1
  15. package/dist/commands/docs.js +2 -2
  16. package/dist/commands/eject.d.ts.map +1 -1
  17. package/dist/commands/eject.js +1 -1
  18. package/dist/commands/eject.js.map +1 -1
  19. package/dist/commands/exemption.d.ts +7 -0
  20. package/dist/commands/exemption.d.ts.map +1 -0
  21. package/dist/commands/exemption.js +166 -0
  22. package/dist/commands/exemption.js.map +1 -0
  23. package/dist/commands/exemption.test.d.ts +2 -0
  24. package/dist/commands/exemption.test.d.ts.map +1 -0
  25. package/dist/commands/exemption.test.js +258 -0
  26. package/dist/commands/exemption.test.js.map +1 -0
  27. package/dist/commands/init-templates.d.ts +4 -4
  28. package/dist/commands/init-templates.js +5 -5
  29. package/dist/commands/init.d.ts.map +1 -1
  30. package/dist/commands/init.js +5 -3
  31. package/dist/commands/init.js.map +1 -1
  32. package/dist/commands/install-hooks.d.ts +3 -3
  33. package/dist/commands/install-hooks.d.ts.map +1 -1
  34. package/dist/commands/install-hooks.js +55 -56
  35. package/dist/commands/install-hooks.js.map +1 -1
  36. package/dist/commands/install-hooks.test.js +134 -77
  37. package/dist/commands/install-hooks.test.js.map +1 -1
  38. package/dist/commands/lesson.d.ts +3 -0
  39. package/dist/commands/lesson.d.ts.map +1 -0
  40. package/dist/commands/lesson.js +90 -0
  41. package/dist/commands/lesson.js.map +1 -0
  42. package/dist/commands/lesson.test.d.ts +2 -0
  43. package/dist/commands/lesson.test.d.ts.map +1 -0
  44. package/dist/commands/lesson.test.js +187 -0
  45. package/dist/commands/lesson.test.js.map +1 -0
  46. package/dist/commands/lint.d.ts.map +1 -1
  47. package/dist/commands/lint.js +52 -0
  48. package/dist/commands/lint.js.map +1 -1
  49. package/dist/commands/review-alias.test.d.ts +2 -0
  50. package/dist/commands/review-alias.test.d.ts.map +1 -0
  51. package/dist/commands/review-alias.test.js +49 -0
  52. package/dist/commands/review-alias.test.js.map +1 -0
  53. package/dist/commands/rule.d.ts +4 -0
  54. package/dist/commands/rule.d.ts.map +1 -0
  55. package/dist/commands/rule.js +154 -0
  56. package/dist/commands/rule.js.map +1 -0
  57. package/dist/commands/rule.test.d.ts +2 -0
  58. package/dist/commands/rule.test.d.ts.map +1 -0
  59. package/dist/commands/rule.test.js +315 -0
  60. package/dist/commands/rule.test.js.map +1 -0
  61. package/dist/commands/shield.js +5 -5
  62. package/dist/commands/spec-templates.d.ts +1 -1
  63. package/dist/commands/spec-templates.js +1 -1
  64. package/dist/index.js +226 -37
  65. package/dist/index.js.map +1 -1
  66. package/package.json +2 -2
@@ -43,9 +43,11 @@ export function detectTotemPrefix(cwd) {
43
43
  * Never exits early to avoid killing chained user hooks.
44
44
  */
45
45
  export function buildResolveBlock(fallbackCmd) {
46
- return `# Resolve totem command
46
+ return `# Resolve totem command — prefer local workspace build over published package
47
47
  if command -v totem >/dev/null 2>&1; then
48
48
  TOTEM_CMD="totem"
49
+ elif [ -f pnpm-workspace.yaml ] && pnpm exec totem --version >/dev/null 2>&1; then
50
+ TOTEM_CMD="pnpm exec totem"
49
51
  elif [ -f package.json ]; then
50
52
  TOTEM_CMD="${fallbackCmd}"
51
53
  else
@@ -104,7 +106,7 @@ export function generateHookHelpers(gitRoot, fallbackCmd) {
104
106
  const postMerge = buildHookContent(fallbackCmd);
105
107
  const postCheckout = buildPostCheckoutHookContent(fallbackCmd);
106
108
  const preCommit = buildPreCommitHook();
107
- const prePush = buildPrePushHook(fallbackCmd);
109
+ const prePush = buildPrePushHook();
108
110
  fs.writeFileSync(path.join(hooksDir, 'post-merge.sh'), postMerge, { mode: 0o755 });
109
111
  fs.writeFileSync(path.join(hooksDir, 'post-checkout.sh'), postCheckout, { mode: 0o755 });
110
112
  fs.writeFileSync(path.join(hooksDir, 'pre-commit.sh'), preCommit, { mode: 0o755 });
@@ -157,7 +159,7 @@ function printHookManagerGuidance(manager) {
157
159
  console.error(' run: sh .totem/hooks/pre-commit.sh');
158
160
  console.error(' pre-push:');
159
161
  console.error(' commands:');
160
- console.error(' totem-shield:');
162
+ console.error(' totem-review:');
161
163
  console.error(' run: sh .totem/hooks/pre-push.sh');
162
164
  console.error(' post-merge:');
163
165
  console.error(' commands:');
@@ -242,55 +244,57 @@ if [ "$branch" = "main" ] || [ "$branch" = "master" ]; then
242
244
  fi
243
245
  `;
244
246
  }
245
- const SHIELD_AUTO_REFRESH_MARKER = 'Shield flag stale';
246
- export function buildPrePushHook(fallbackCmd) {
247
+ export function buildPrePushHook() {
247
248
  return `#!/bin/sh
248
- # ${TOTEM_PREPUSH_MARKER} — run compiled rules before push.
249
+ # ${TOTEM_PREPUSH_MARKER} — fast read-only checkpoint.
249
250
  # Override with: git push --no-verify
250
251
 
251
- # Only run shield when compiled rules exist (zero Node startup penalty otherwise).
252
- # Uses if/fi block so this is safe to append to existing hooks without early termination.
252
+ # Only gate when compiled rules exist (totem is configured)
253
253
  if [ -f ".totem/compiled-rules.json" ]; then
254
- ${buildResolveBlock(fallbackCmd)}
255
254
 
256
- # Auto-verify compile manifest
257
- if [ -n "$TOTEM_CMD" ] && [ -f ".totem/compile-manifest.json" ]; then
258
- if ! $TOTEM_CMD verify-manifest > /dev/null 2>&1; then
259
- echo "[totem] Compile manifest is stale. Running totem compile..."
260
- if $TOTEM_CMD compile; then
261
- echo "[totem] Push aborted: compile manifest was updated."
262
- echo "[totem] Please commit the updated .totem/ files and push again."
263
- exit 1
264
- else
265
- echo "[totem] Push aborted: auto-compile failed. Run 'totem compile' manually."
266
- exit 1
267
- fi
268
- fi
255
+ # Lint must have passed for current HEAD (core gate)
256
+ if [ ! -f ".totem/cache/.lint-passed" ]; then
257
+ echo "[totem] Push blocked: lint has not passed. Run 'totem lint' or /prepush." >&2
258
+ exit 1
269
259
  fi
270
-
271
- if [ -n "$TOTEM_CMD" ]; then
272
- if ! $TOTEM_CMD lint; then
273
- exit 1
274
- fi
260
+ LINT_SHA=$(cat .totem/cache/.lint-passed 2>/dev/null | tr -d '[:space:]')
261
+ if [ -z "$LINT_SHA" ]; then
262
+ echo "[totem] Push blocked: lint flag is empty or unreadable. Run 'totem lint' or /prepush." >&2
263
+ exit 1
275
264
  fi
276
-
277
- # Shield auto-refresh re-run shield if flag is stale (#1045)
278
- if [ -f ".totem/cache/.shield-passed" ] && [ -n "$TOTEM_CMD" ]; then
279
- SHIELD_SHA=$(cat .totem/cache/.shield-passed | tr -d '[:space:]')
280
- HEAD_SHA=$(git rev-parse HEAD)
281
- if [ "$SHIELD_SHA" != "$HEAD_SHA" ]; then
282
- if git merge-base --is-ancestor "$SHIELD_SHA" "$HEAD_SHA" 2>/dev/null; then
283
- echo "[totem] ${SHIELD_AUTO_REFRESH_MARKER}. Auto-refreshing..."
284
- else
285
- echo "[totem] ${SHIELD_AUTO_REFRESH_MARKER} (rebase detected). Auto-refreshing..."
265
+ HEAD_SHA=$(git rev-parse HEAD 2>/dev/null)
266
+ if [ "$LINT_SHA" != "$HEAD_SHA" ]; then
267
+ # Ancestry check: lint may still be valid if only non-target files changed
268
+ if git merge-base --is-ancestor "$LINT_SHA" "$HEAD_SHA" 2>/dev/null; then
269
+ # Read target globs from cache, fall back to common source extensions
270
+ if [ -f ".totem/cache/.target-globs" ]; then
271
+ TARGET_GLOBS=$(cat .totem/cache/.target-globs 2>/dev/null | xargs)
272
+ fi
273
+ if [ -z "$TARGET_GLOBS" ]; then
274
+ TARGET_GLOBS="*.ts *.tsx *.js *.jsx"
286
275
  fi
287
- # TODO(telemetry): pass execution context (hook vs manual) for friction index (1.8.0)
288
- if ! $TOTEM_CMD shield; then
289
- echo "[totem] Shield auto-refresh failed. Fix issues and retry."
276
+ # Check if any target files changed since lint passed
277
+ # shellcheck disable=SC2086
278
+ set -f # disable globbing so *.ts is passed as pathspec, not expanded
279
+ SRC_CHANGES=$(git diff --name-only "$LINT_SHA" "$HEAD_SHA" -- $TARGET_GLOBS 2>/dev/null)
280
+ set +f
281
+ if [ -n "$SRC_CHANGES" ]; then
282
+ echo "[totem] Push blocked: source files changed since lint passed." >&2
283
+ echo "[totem] Changed files:" >&2
284
+ echo "$SRC_CHANGES" | while read -r f; do echo "[totem] $f" >&2; done
285
+ echo "[totem] Run 'totem lint' or /prepush to re-validate." >&2
290
286
  exit 1
291
287
  fi
288
+ # Non-target changes only (docs, tests, config) — lint still valid
289
+ else
290
+ echo "[totem] Push blocked: lint passed for a non-ancestor commit (rebase?)." >&2
291
+ echo "[totem] lint SHA: $LINT_SHA" >&2
292
+ echo "[totem] HEAD SHA: $HEAD_SHA" >&2
293
+ echo "[totem] Run 'totem lint' or /prepush to re-validate." >&2
294
+ exit 1
292
295
  fi
293
296
  fi
297
+
294
298
  fi
295
299
  `;
296
300
  }
@@ -355,9 +359,8 @@ export async function installEnforcementHooks(cwd, rl) {
355
359
  return skip;
356
360
  }
357
361
  const hooksDir = path.join(gitRoot, '.git', 'hooks');
358
- const fallbackCmd = getFallbackCommand(gitRoot);
359
362
  const preCommit = installGitHook(hooksDir, 'pre-commit', buildPreCommitHook(), TOTEM_PRECOMMIT_MARKER);
360
- const prePush = installGitHook(hooksDir, 'pre-push', buildPrePushHook(fallbackCmd), TOTEM_PREPUSH_MARKER);
363
+ const prePush = installGitHook(hooksDir, 'pre-push', buildPrePushHook(), TOTEM_PREPUSH_MARKER);
361
364
  // Warn about non-shell hooks that Totem cannot safely append to
362
365
  if (preCommit === 'skipped-non-shell') {
363
366
  console.error('[Totem] Warning: pre-commit hook uses a non-shell interpreter. Manually integrate branch protection into your existing hook.');
@@ -409,7 +412,7 @@ export function installHooksNonInteractive(cwd) {
409
412
  }
410
413
  const hooksDir = path.join(gitRoot, '.git', 'hooks');
411
414
  const preCommit = installGitHook(hooksDir, 'pre-commit', buildPreCommitHook(), TOTEM_PRECOMMIT_MARKER);
412
- const prePush = installGitHook(hooksDir, 'pre-push', buildPrePushHook(fallbackCmd), TOTEM_PREPUSH_MARKER);
415
+ const prePush = installGitHook(hooksDir, 'pre-push', buildPrePushHook(), TOTEM_PREPUSH_MARKER);
413
416
  const postMergeContent = buildHookContent(fallbackCmd);
414
417
  const postMerge = installGitHook(hooksDir, 'post-merge', postMergeContent, TOTEM_HOOK_MARKER);
415
418
  const postCheckoutContent = buildPostCheckoutHookContent(fallbackCmd);
@@ -499,8 +502,8 @@ export function hooksCommand(opts) {
499
502
  }
500
503
  // ─── Silent hook upgrade ──────────────────────────────
501
504
  /**
502
- * Silently upgrade the pre-push hook if it was installed by Totem but lacks
503
- * the shield auto-refresh logic added in #1045.
505
+ * Silently upgrade the pre-push hook if it was installed by Totem but uses
506
+ * the old command-executing format instead of the new flag-checking format.
504
507
  *
505
508
  * Returns true if the hook was upgraded, false otherwise.
506
509
  */
@@ -513,19 +516,14 @@ export function upgradePrePushHookIfNeeded(cwd) {
513
516
  if (!fs.existsSync(hookPath))
514
517
  return false;
515
518
  const content = fs.readFileSync(hookPath, 'utf-8');
516
- // Only upgrade hooks that Totem owns (have our marker) but lack auto-refresh
519
+ // Only upgrade hooks that Totem owns (have our marker)
517
520
  if (!content.includes(TOTEM_PREPUSH_MARKER))
518
521
  return false;
519
- if (content.includes(SHIELD_AUTO_REFRESH_MARKER))
520
- return false;
521
522
  // Splice only the totem-managed block, preserving any user-appended content.
522
- // The totem block starts at the marker comment and ends at the matching top-level `fi`.
523
523
  const markerIdx = content.indexOf(`# ${TOTEM_PREPUSH_MARKER}`);
524
524
  if (markerIdx === -1)
525
525
  return false;
526
526
  // Find the end of the totem block by balancing if/fi depth.
527
- // Can't use first or last `fi` — the block has nested if/fi pairs,
528
- // and user content after the block may also contain if/fi.
529
527
  const afterMarker = content.slice(markerIdx);
530
528
  const ifFiPattern = /^\s*(if\s|fi\s*$)/gm;
531
529
  let depth = 0;
@@ -550,18 +548,19 @@ export function upgradePrePushHookIfNeeded(cwd) {
550
548
  }
551
549
  if (endOffset === -1)
552
550
  return false;
551
+ // Upgrade if: totem-managed block already uses new format (check block only, not user content)
552
+ const existingTotemBlock = afterMarker.slice(0, endOffset);
553
+ if (existingTotemBlock.includes('.lint-passed'))
554
+ return false;
553
555
  const blockEnd = markerIdx + endOffset;
554
556
  // Build the replacement block (strip shebang — we're splicing into existing file)
555
- const fallbackCmd = getFallbackCommand(gitRoot);
556
- const newBlock = buildPrePushHook(fallbackCmd)
557
+ const newBlock = buildPrePushHook()
557
558
  .replace(/^#!\/bin\/sh\n/, '')
558
559
  .trimStart();
559
560
  // Splice: preserve everything before and after the totem block
560
561
  const before = content.slice(0, markerIdx);
561
562
  const after = content.slice(blockEnd);
562
563
  const upgraded = before + newBlock.trimEnd() + after;
563
- // TODO(telemetry): when the Workflow Friction Index (1.8.0) is built,
564
- // pass execution context (hook-triggered vs manual) here for measurement
565
564
  fs.writeFileSync(hookPath, upgraded);
566
565
  try {
567
566
  fs.chmodSync(hookPath, 0o755);
@@ -572,7 +571,7 @@ export function upgradePrePushHookIfNeeded(cwd) {
572
571
  return true;
573
572
  }
574
573
  catch {
575
- // Silent upgrade is best-effort — never crash shield for a hook upgrade failure
574
+ // Silent upgrade is best-effort — never crash review for a hook upgrade failure
576
575
  return false;
577
576
  }
578
577
  }
@@ -1 +1 @@
1
- {"version":3,"file":"install-hooks.js","sourceRoot":"","sources":["../../src/commands/install-hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install-hooks.js","sourceRoot":"","sources":["../../src/commands/install-hooks.ts"],"names":[],"mappings":"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"}
@@ -114,6 +114,14 @@ describe('buildResolveBlock', () => {
114
114
  const block = buildResolveBlock('pnpm dlx @mmnto/cli');
115
115
  expect(block).toContain('[ -f package.json ]');
116
116
  });
117
+ it('prefers pnpm exec totem in workspace before dlx fallback', () => {
118
+ const block = buildResolveBlock('pnpm dlx @mmnto/cli');
119
+ expect(block).toContain('pnpm-workspace.yaml');
120
+ expect(block).toContain('TOTEM_CMD="pnpm exec totem"');
121
+ const workspaceIdx = block.indexOf('pnpm-workspace.yaml');
122
+ const dlxIdx = block.indexOf('pnpm dlx @mmnto/cli');
123
+ expect(workspaceIdx).toBeLessThan(dlxIdx);
124
+ });
117
125
  });
118
126
  describe('buildPreCommitHook', () => {
119
127
  it('contains the marker for idempotency', () => {
@@ -140,80 +148,87 @@ describe('buildPreCommitHook', () => {
140
148
  });
141
149
  });
142
150
  describe('buildPrePushHook', () => {
143
- const fallbackCmd = 'pnpm dlx @mmnto/cli';
144
151
  it('contains the marker for idempotency', () => {
145
- const hook = buildPrePushHook(fallbackCmd);
152
+ const hook = buildPrePushHook();
146
153
  expect(hook).toContain(TOTEM_PREPUSH_MARKER);
147
154
  });
148
- it('only runs shield when compiled-rules.json exists (if/fi, safe for appending)', () => {
149
- const hook = buildPrePushHook(fallbackCmd);
150
- expect(hook).toContain('if [ -f ".totem/compiled-rules.json" ]; then');
151
- expect(hook).toContain('fi');
152
- // Must use if/fi guard, NOT `&& exit 0` which would terminate appended hooks early
153
- expect(hook).not.toContain('&& exit 0');
154
- });
155
- it('includes the resolve block for dynamic command resolution', () => {
156
- const hook = buildPrePushHook(fallbackCmd);
157
- expect(hook).toContain('command -v totem');
158
- expect(hook).toContain('TOTEM_CMD=');
159
- });
160
- it('runs lint via $TOTEM_CMD', () => {
161
- const hook = buildPrePushHook(fallbackCmd);
162
- expect(hook).toContain('$TOTEM_CMD lint');
155
+ it('starts with a shebang', () => {
156
+ const hook = buildPrePushHook();
157
+ expect(hook).toMatch(/^#!\/bin\/sh\n/);
163
158
  });
164
159
  it('mentions --no-verify override', () => {
165
- const hook = buildPrePushHook(fallbackCmd);
160
+ const hook = buildPrePushHook();
166
161
  expect(hook).toContain('git push --no-verify');
167
162
  });
168
- it('starts with a shebang', () => {
169
- const hook = buildPrePushHook(fallbackCmd);
170
- expect(hook).toMatch(/^#!\/bin\/sh\n/);
171
- });
172
- it('uses the provided fallback command in the resolve block', () => {
173
- const npxHook = buildPrePushHook('npx @mmnto/cli');
174
- expect(npxHook).toContain('TOTEM_CMD="npx @mmnto/cli"');
175
- const yarnHook = buildPrePushHook('yarn dlx @mmnto/cli');
176
- expect(yarnHook).toContain('TOTEM_CMD="yarn dlx @mmnto/cli"');
177
- });
178
- it('includes verify-manifest block before lint', () => {
179
- const hook = buildPrePushHook(fallbackCmd);
180
- expect(hook).toContain('verify-manifest');
181
- expect(hook).toContain('compile-manifest.json');
182
- expect(hook).toContain('$TOTEM_CMD compile');
183
- // verify-manifest block must appear before lint
184
- const verifyIdx = hook.indexOf('verify-manifest');
185
- const lintIdx = hook.indexOf('$TOTEM_CMD lint');
186
- expect(verifyIdx).toBeLessThan(lintIdx);
187
- });
188
- it('aborts push after auto-compile so updated files can be committed', () => {
189
- const hook = buildPrePushHook(fallbackCmd);
190
- expect(hook).toContain('Push aborted: compile manifest was updated');
191
- expect(hook).toContain('Please commit the updated .totem/ files and push again');
192
- expect(hook).toContain('exit 1');
163
+ it('only gates when compiled-rules.json exists', () => {
164
+ const hook = buildPrePushHook();
165
+ expect(hook).toContain('if [ -f ".totem/compiled-rules.json" ]; then');
193
166
  });
194
- it('aborts push when auto-compile fails', () => {
195
- const hook = buildPrePushHook(fallbackCmd);
196
- expect(hook).toContain("Push aborted: auto-compile failed. Run 'totem compile' manually.");
167
+ it('checks .lint-passed flag', () => {
168
+ const hook = buildPrePushHook();
169
+ expect(hook).toContain('.totem/cache/.lint-passed');
197
170
  });
198
- it('generates script with shield auto-refresh logic', () => {
199
- const hook = buildPrePushHook(fallbackCmd);
200
- expect(hook).toContain('Shield flag stale');
201
- expect(hook).toContain('.totem/cache/.shield-passed');
171
+ it('validates lint flag SHA against HEAD', () => {
172
+ const hook = buildPrePushHook();
202
173
  expect(hook).toContain('git rev-parse HEAD');
203
- expect(hook).toContain('$TOTEM_CMD shield');
204
- expect(hook).toContain('Shield auto-refresh failed');
205
- });
206
- it('places shield auto-refresh after lint block', () => {
207
- const hook = buildPrePushHook(fallbackCmd);
208
- const lintIdx = hook.indexOf('$TOTEM_CMD lint');
209
- const shieldIdx = hook.indexOf('Shield flag stale');
210
- expect(lintIdx).toBeGreaterThan(-1);
211
- expect(shieldIdx).toBeGreaterThan(lintIdx);
212
- });
213
- it('checks merge-base ancestry for stale flag detection', () => {
214
- const hook = buildPrePushHook(fallbackCmd);
174
+ expect(hook).toContain('LINT_SHA');
175
+ expect(hook).toContain('HEAD_SHA');
176
+ });
177
+ it('does not execute any totem commands', () => {
178
+ const hook = buildPrePushHook();
179
+ expect(hook).not.toContain('$TOTEM_CMD');
180
+ // "totem lint" appears in error messages but not as a command invocation
181
+ expect(hook).not.toMatch(/^\s+totem\s+(lint|review|shield|compile)\b/m);
182
+ expect(hook).not.toContain('pnpm');
183
+ expect(hook).not.toContain('node ');
184
+ });
185
+ it('does not include resolve block', () => {
186
+ const hook = buildPrePushHook();
187
+ expect(hook).not.toContain('command -v totem');
188
+ expect(hook).not.toContain('TOTEM_CMD=');
189
+ });
190
+ it('uses POSIX-compatible syntax only', () => {
191
+ const hook = buildPrePushHook();
192
+ // Must use [ ] not [[ ]]
193
+ expect(hook).not.toContain('[[');
194
+ expect(hook).not.toContain(']]');
195
+ });
196
+ it('prints actionable error messages when blocking', () => {
197
+ const hook = buildPrePushHook();
198
+ expect(hook).toContain('Push blocked');
199
+ expect(hook).toContain('/prepush');
200
+ });
201
+ it('prints diagnostic details when source files changed', () => {
202
+ const hook = buildPrePushHook();
203
+ expect(hook).toContain('Changed files');
204
+ });
205
+ it('prints SHA mismatch details on non-ancestor block', () => {
206
+ const hook = buildPrePushHook();
207
+ expect(hook).toContain('lint SHA');
208
+ expect(hook).toContain('HEAD SHA');
209
+ });
210
+ it('includes ancestry-aware lint validation', () => {
211
+ const hook = buildPrePushHook();
215
212
  expect(hook).toContain('git merge-base --is-ancestor');
216
- expect(hook).toContain('rebase detected');
213
+ expect(hook).toContain('LINT_SHA');
214
+ });
215
+ it('reads target globs from cache file', () => {
216
+ const hook = buildPrePushHook();
217
+ expect(hook).toContain('.totem/cache/.target-globs');
218
+ expect(hook).toContain('TARGET_GLOBS');
219
+ });
220
+ it('falls back to common source extensions when no target-globs cache', () => {
221
+ const hook = buildPrePushHook();
222
+ expect(hook).toContain('*.ts *.tsx *.js *.jsx');
223
+ });
224
+ it('uses git diff to check for source file changes', () => {
225
+ const hook = buildPrePushHook();
226
+ expect(hook).toContain('git diff --name-only');
227
+ expect(hook).toContain('SRC_CHANGES');
228
+ });
229
+ it('handles non-ancestor commits (rebase)', () => {
230
+ const hook = buildPrePushHook();
231
+ expect(hook).toContain('non-ancestor');
217
232
  });
218
233
  });
219
234
  describe('installGitHook', () => {
@@ -263,13 +278,13 @@ describe('installGitHook', () => {
263
278
  const hookPath = path.join(hooksDir, 'pre-push');
264
279
  const userHook = '#!/bin/sh\nrun_my_tests\n';
265
280
  fs.writeFileSync(hookPath, userHook);
266
- installGitHook(hooksDir, 'pre-push', buildPrePushHook('npx @mmnto/cli'), TOTEM_PREPUSH_MARKER);
281
+ installGitHook(hooksDir, 'pre-push', buildPrePushHook(), TOTEM_PREPUSH_MARKER);
267
282
  const written = fs.readFileSync(hookPath, 'utf-8');
268
283
  expect(written).toContain('run_my_tests');
269
284
  expect(written).toContain(TOTEM_PREPUSH_MARKER);
270
285
  });
271
286
  it('is idempotent — double install does not duplicate', () => {
272
- const content = buildPrePushHook('npx @mmnto/cli');
287
+ const content = buildPrePushHook();
273
288
  installGitHook(hooksDir, 'pre-push', content, TOTEM_PREPUSH_MARKER);
274
289
  installGitHook(hooksDir, 'pre-push', content, TOTEM_PREPUSH_MARKER);
275
290
  const written = fs.readFileSync(path.join(hooksDir, 'pre-push'), 'utf-8');
@@ -291,7 +306,7 @@ describe('installGitHook', () => {
291
306
  const hookPath = path.join(hooksDir, 'pre-push');
292
307
  const pythonHook = '#!/usr/bin/env python3\nimport subprocess\n';
293
308
  fs.writeFileSync(hookPath, pythonHook);
294
- const result = installGitHook(hooksDir, 'pre-push', buildPrePushHook('npx @mmnto/cli'), TOTEM_PREPUSH_MARKER);
309
+ const result = installGitHook(hooksDir, 'pre-push', buildPrePushHook(), TOTEM_PREPUSH_MARKER);
295
310
  expect(result).toBe('skipped-non-shell');
296
311
  const written = fs.readFileSync(hookPath, 'utf-8');
297
312
  expect(written).toBe(pythonHook); // File untouched
@@ -326,7 +341,7 @@ describe('installGitHook', () => {
326
341
  });
327
342
  it('handles pre-commit and pre-push independently', () => {
328
343
  installGitHook(hooksDir, 'pre-commit', buildPreCommitHook(), TOTEM_PRECOMMIT_MARKER);
329
- installGitHook(hooksDir, 'pre-push', buildPrePushHook('pnpm dlx @mmnto/cli'), TOTEM_PREPUSH_MARKER);
344
+ installGitHook(hooksDir, 'pre-push', buildPrePushHook(), TOTEM_PREPUSH_MARKER);
330
345
  expect(fs.existsSync(path.join(hooksDir, 'pre-commit'))).toBe(true);
331
346
  expect(fs.existsSync(path.join(hooksDir, 'pre-push'))).toBe(true);
332
347
  const preCommit = fs.readFileSync(path.join(hooksDir, 'pre-commit'), 'utf-8');
@@ -354,15 +369,15 @@ describe('generateHookHelpers', () => {
354
369
  expect(fs.existsSync(path.join(hooksDir, 'pre-commit.sh'))).toBe(true);
355
370
  expect(fs.existsSync(path.join(hooksDir, 'pre-push.sh'))).toBe(true);
356
371
  });
357
- it('generated scripts contain the resolve block', () => {
372
+ it('generated scripts contain expected content', () => {
358
373
  generateHookHelpers(tmpDir, 'pnpm dlx @mmnto/cli');
359
374
  const hooksDir = path.join(tmpDir, '.totem', 'hooks');
360
375
  const postMerge = fs.readFileSync(path.join(hooksDir, 'post-merge.sh'), 'utf-8');
361
376
  expect(postMerge).toContain('command -v totem');
362
377
  expect(postMerge).toContain('$TOTEM_CMD');
363
378
  const prePush = fs.readFileSync(path.join(hooksDir, 'pre-push.sh'), 'utf-8');
364
- expect(prePush).toContain('command -v totem');
365
- expect(prePush).toContain('$TOTEM_CMD lint');
379
+ expect(prePush).toContain(TOTEM_PREPUSH_MARKER);
380
+ expect(prePush).toContain('.lint-passed');
366
381
  });
367
382
  it('is idempotent — calling twice does not error', () => {
368
383
  generateHookHelpers(tmpDir, 'pnpm dlx @mmnto/cli');
@@ -619,12 +634,12 @@ describe('upgradePrePushHookIfNeeded', () => {
619
634
  }
620
635
  /** Canonical totem block: shebang stripped, trimmed — the expected upgrade output. */
621
636
  function expectedTotemBlock() {
622
- return buildPrePushHook('pnpm dlx @mmnto/cli')
637
+ return buildPrePushHook()
623
638
  .replace(/^#!\/bin\/sh\n/, '')
624
639
  .trim();
625
640
  }
626
- it('upgrades old hook with marker but no auto-refresh', () => {
627
- // Install an old-style hook that has the marker but lacks shield auto-refresh
641
+ it('upgrades old command-executing hook to flag-checking format', () => {
642
+ // Install an old-style hook that executes $TOTEM_CMD lint
628
643
  const hooksDir = path.join(tmpDir, '.git', 'hooks');
629
644
  fs.mkdirSync(hooksDir, { recursive: true });
630
645
  const oldHook = `#!/bin/sh
@@ -642,7 +657,8 @@ fi
642
657
  const upgraded = upgradePrePushHookIfNeeded(tmpDir);
643
658
  expect(upgraded).toBe(true);
644
659
  const content = fs.readFileSync(path.join(hooksDir, 'pre-push'), 'utf-8');
645
- expect(content).toContain('Shield flag stale');
660
+ expect(content).toContain('.lint-passed');
661
+ expect(content).not.toContain('$TOTEM_CMD');
646
662
  expect(content).toContain(TOTEM_PREPUSH_MARKER);
647
663
  // Full block comparison: extracted totem block must match canonical output
648
664
  const actual = extractTotemBlock(content);
@@ -658,7 +674,7 @@ fi
658
674
  const content = fs.readFileSync(path.join(hooksDir, 'pre-push'), 'utf-8');
659
675
  expect(content).toBe(userHook); // File untouched
660
676
  });
661
- it('skips hook that already has auto-refresh logic', () => {
677
+ it('skips hook that already uses flag-checking format', () => {
662
678
  // Install the current-version hook via non-interactive installer
663
679
  installHooksNonInteractive(tmpDir);
664
680
  const hooksDir = path.join(tmpDir, '.git', 'hooks');
@@ -700,8 +716,9 @@ fi
700
716
  const upgraded = upgradePrePushHookIfNeeded(tmpDir);
701
717
  expect(upgraded).toBe(true);
702
718
  const content = fs.readFileSync(path.join(hooksDir, 'pre-push'), 'utf-8');
703
- // New totem block should have auto-refresh
704
- expect(content).toContain('Shield flag stale');
719
+ // New totem block should use flag-checking format
720
+ expect(content).toContain('.lint-passed');
721
+ expect(content).not.toContain('$TOTEM_CMD');
705
722
  // User content should be preserved
706
723
  expect(content).toContain('curl -X POST https://hooks.example.com/deploy');
707
724
  expect(content).toContain('My custom deploy notification');
@@ -787,5 +804,45 @@ fi
787
804
  const actual = extractTotemBlock(content);
788
805
  expect(actual).toBe(expectedTotemBlock());
789
806
  });
807
+ it('upgrades hook with auto-refresh and $TOTEM_CMD to flag-checking format', () => {
808
+ const hooksDir = path.join(tmpDir, '.git', 'hooks');
809
+ fs.mkdirSync(hooksDir, { recursive: true });
810
+ // Simulate a hook with the auto-refresh logic still using $TOTEM_CMD
811
+ const oldHook = `#!/bin/sh
812
+ # ${TOTEM_PREPUSH_MARKER} — run compiled rules before push.
813
+ # Override with: git push --no-verify
814
+
815
+ if [ -f ".totem/compiled-rules.json" ]; then
816
+ TOTEM_CMD="totem"
817
+ if [ -n "$TOTEM_CMD" ]; then
818
+ if ! $TOTEM_CMD lint; then
819
+ exit 1
820
+ fi
821
+ fi
822
+
823
+ if [ -f ".totem/cache/.shield-passed" ] && [ -n "$TOTEM_CMD" ]; then
824
+ SHIELD_SHA=$(cat .totem/cache/.shield-passed | tr -d '[:space:]')
825
+ HEAD_SHA=$(git rev-parse HEAD)
826
+ if [ "$SHIELD_SHA" != "$HEAD_SHA" ]; then
827
+ echo "[totem] Shield flag stale. Auto-refreshing..."
828
+ if ! $TOTEM_CMD review; then
829
+ echo "[totem] Review auto-refresh failed. Fix issues and retry."
830
+ exit 1
831
+ fi
832
+ fi
833
+ fi
834
+ fi
835
+ `;
836
+ fs.writeFileSync(path.join(hooksDir, 'pre-push'), oldHook);
837
+ const upgraded = upgradePrePushHookIfNeeded(tmpDir);
838
+ expect(upgraded).toBe(true);
839
+ const content = fs.readFileSync(path.join(hooksDir, 'pre-push'), 'utf-8');
840
+ // Must not contain any $TOTEM_CMD — new format is read-only
841
+ expect(content).not.toContain('$TOTEM_CMD');
842
+ expect(content).toContain('.lint-passed');
843
+ // Full block comparison
844
+ const actual = extractTotemBlock(content);
845
+ expect(actual).toBe(expectedTotemBlock());
846
+ });
790
847
  });
791
848
  //# sourceMappingURL=install-hooks.test.js.map