@mmnto/cli 1.102.0 → 1.103.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.
@@ -1 +1 @@
1
- {"version":3,"file":"init-templates.d.ts","sourceRoot":"","sources":["../../src/commands/init-templates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init-templates.d.ts","sourceRoot":"","sources":["../../src/commands/init-templates.ts"],"names":[],"mappings":"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"}
@@ -124,6 +124,24 @@ export function isBoundedOwnedFile(content, marker, endMarker) {
124
124
  // `owner/repo` qualifier and NOT followed by an alpha/dash character
125
125
  // (excludes anchor-style IDs like `#section-2`).
126
126
  export const BARE_REF_REGEX_SOURCE = '(?<!\\b[\\w-]+/[\\w-]+)#(\\d+)(?![-\\w])';
127
+ // ─── Auto-close keyword regex (mmnto-ai/totem#1762) ──────────────────────
128
+ //
129
+ // The CANONICAL source is `@mmnto/totem`'s `AUTO_CLOSE_REGEX_SOURCE`
130
+ // (packages/core/src/autoclose/matcher.ts) — the ONE shared evaluator that D1
131
+ // (PR-time check) and D2 (post-merge reconciliation) consume. This is a LOCAL
132
+ // MIRROR, not an independent copy: init-templates must NOT statically
133
+ // value-import from the heavy core barrel (the cold-start rule,
134
+ // mmnto-ai/totem#2339 — it pulls LanceDB into every `--help`), and these
135
+ // template constants are evaluated at module top-level so a deferred
136
+ // `await import()` is not possible. The mirror is drift-LOCKED by the
137
+ // init.test.ts assertions that render the templates and assert each inlines
138
+ // `JSON.stringify(<core AUTO_CLOSE_REGEX_SOURCE>)`; if this literal ever drifts
139
+ // from core's, those tests fail. Update BOTH in the same change.
140
+ const AUTO_CLOSE_REGEX_SOURCE = '\\b(?:closed|closes|close|fixed|fixes|fix|resolved|resolves|resolve)\\b' +
141
+ '(?:\\s*:\\s*|\\s+)' +
142
+ '(?:https?://github\\.com/([A-Za-z0-9._-]+/[A-Za-z0-9._-]+)/(?:issues|pull)/(\\d+)' +
143
+ '|([A-Za-z0-9._-]+/[A-Za-z0-9._-]+)#(\\d+)' +
144
+ '|#(\\d+))';
127
145
  // --- Gemini CLI hook templates ---
128
146
  /**
129
147
  * The ownership/presence marker that opens BOTH whole-file SessionStart hook
@@ -166,18 +184,67 @@ try {
166
184
  ${TOTEM_FILE_END}
167
185
  `;
168
186
  export const GEMINI_BEFORE_TOOL = `// [totem] auto-generated — Gemini CLI BeforeTool hook
169
- // Intercepts:
170
- // 1. git push/commit → run \`totem lint\` before proceeding (existing shield-gate behavior)
171
- // 2. write_file/edit_fileblock bare cross-repo refs in substrate paths
172
- // (xrepo-qualify-refs, sealed in mmnto-ai/totem-strategy#145)
187
+ // Intercepts (Gemini CLI write tools are write_file + replace — there is NO
188
+ // edit_file; docs.gemini file-system tools + gemini-cli#20321):
189
+ // Guard 1: git push/commitrun \`totem lint\` before proceeding (shield-gate)
190
+ // Rule 1: write_file/replace → block bare cross-repo refs in substrate paths —
191
+ // xrepo-qualify-refs, sealed in mmnto-ai/totem-strategy#145 (SHA c488888b).
192
+ // Rule 2: write_file/replace → block GitHub auto-close keywords adjacent to an
193
+ // issue ref in **/*.md (EXEMPT .github/**, .totem/**) — design of
194
+ // record mmnto-ai/totem#1762; sibling seal pending its own PR.
173
195
  const { execSync } = require('child_process');
174
196
 
175
197
  const BARE_REF_REGEX_SOURCE = ${JSON.stringify(BARE_REF_REGEX_SOURCE)};
198
+ // Single-sourced from @mmnto/totem's AUTO_CLOSE_REGEX_SOURCE (mmnto-ai/totem#1762);
199
+ // inlined for the rendered standalone hook the way BARE_REF_REGEX_SOURCE is.
200
+ const AUTO_CLOSE_REGEX_SOURCE = ${JSON.stringify(AUTO_CLOSE_REGEX_SOURCE)};
176
201
  const SCOPED_PATH_RE = /(\\.handoff[\\\\\\/]|\\.journal[\\\\\\/]|\\.md$)/i;
202
+ const MD_PATH_RE = /\\.md$/i;
203
+ // EXEMPT .github/** (intentional close keywords) and .totem/** (tool/agent-authored
204
+ // lessons etc. — never a GitHub auto-close surface). NOT .changeset/**: changeset
205
+ // prose is composed into the Version-Packages PR DESCRIPTION (an auto-close
206
+ // surface — verified on PR mmnto-ai/totem#2474); use totem-context there.
207
+ const GITHUB_EXEMPT_RE = /(^|[\\\\\\/])\\.(github|totem)[\\\\\\/]/i;
177
208
  const SUPPRESS_DIRECTIVE_RE = /<!--\\s*totem-context:/;
178
209
 
210
+ // mmnto-ai/totem#1762: any close-keyword (close/fix/resolve inflections) adjacent
211
+ // to an issue ref in narrative markdown can auto-close a linked issue when the
212
+ // text reaches a PR body / commit message — genuine OR negated. Presence
213
+ // invariant, zero semantics (no negation parser). Scoped to **/*.md, EXEMPT
214
+ // .github/** (PR/issue templates where close keywords are intentional).
215
+ function checkAutoCloseKeywords(toolName, toolInput) {
216
+ if (toolName !== 'write_file' && toolName !== 'edit_file' && toolName !== 'replace') return;
217
+ const input = (typeof toolInput === 'object' && toolInput !== null) ? toolInput : {};
218
+ const filePath = String(input.file_path || input.path || '');
219
+ if (!MD_PATH_RE.test(filePath) || GITHUB_EXEMPT_RE.test(filePath)) return;
220
+ const content = input.content !== undefined ? input.content : input.new_string;
221
+ if (typeof content !== 'string') return;
222
+
223
+ const lines = content.split(/\\r?\\n/);
224
+ const filtered = [];
225
+ for (let i = 0; i < lines.length; i++) {
226
+ const line = lines[i];
227
+ const prev = i > 0 ? lines[i - 1] : '';
228
+ if (SUPPRESS_DIRECTIVE_RE.test(line) || SUPPRESS_DIRECTIVE_RE.test(prev)) continue;
229
+ filtered.push(line);
230
+ }
231
+ const re = new RegExp(AUTO_CLOSE_REGEX_SOURCE, 'gi');
232
+ const matches = [...filtered.join('\\n').matchAll(re)];
233
+ if (matches.length === 0) return;
234
+
235
+ // Group layout: 1+2 = URL owner/repo+N; 3+4 = qualified owner/repo+N; 5 = bare N.
236
+ const refs = matches.slice(0, 5).map((m) => (m[1] ? m[1] + '#' + m[2] : m[3] ? m[3] + '#' + m[4] : '#' + m[5])).join(', ');
237
+ throw new Error(
238
+ '[totem BeforeTool] GitHub auto-close keyword adjacent to issue ref in write to ' + filePath + ': ' + refs + '\\n' +
239
+ 'GitHub auto-closes linked issues from a PR body / commit message carrying this pattern (even under negation).\\n' +
240
+ 'Rephrase to a non-keyword form (\`references\` / \`see\` / \`tracks\`).\\n' +
241
+ 'For verbatim quotation, prefix with a \`<!-- totem-context: <reason> -->\` directive on the preceding line.\\n' +
242
+ 'mmnto-ai/totem#1762.',
243
+ );
244
+ }
245
+
179
246
  function checkXrepoQualifyRefs(toolName, toolInput) {
180
- if (toolName !== 'write_file' && toolName !== 'edit_file') return;
247
+ if (toolName !== 'write_file' && toolName !== 'edit_file' && toolName !== 'replace') return;
181
248
  const input = (typeof toolInput === 'object' && toolInput !== null) ? toolInput : {};
182
249
  const filePath = String(input.file_path || input.path || '');
183
250
  if (!SCOPED_PATH_RE.test(filePath)) return;
@@ -198,7 +265,7 @@ function checkXrepoQualifyRefs(toolName, toolInput) {
198
265
 
199
266
  const refs = matches.slice(0, 5).map((m) => '#' + m[1]).join(', ');
200
267
  throw new Error(
201
- '[totem PreWriteShield] Bare PR/issue reference(s) in write to ' + filePath + ': ' + refs + '. ' +
268
+ '[totem BeforeTool] Bare PR/issue reference(s) in write to ' + filePath + ': ' + refs + '. ' +
202
269
  'Qualify each as <owner>/<repo>#NNN (e.g., mmnto-ai/totem#1234). ' +
203
270
  'For verbatim quotation, prefix with a <!-- totem-context: <reason> --> directive on the preceding line. ' +
204
271
  'Sealed in mmnto-ai/totem-strategy#145.',
@@ -206,6 +273,7 @@ function checkXrepoQualifyRefs(toolName, toolInput) {
206
273
  }
207
274
 
208
275
  module.exports = function beforeTool(toolName, toolInput) {
276
+ checkAutoCloseKeywords(toolName, toolInput);
209
277
  checkXrepoQualifyRefs(toolName, toolInput);
210
278
 
211
279
  if (toolName !== 'run_shell_command') return;
@@ -261,6 +329,13 @@ export const CLAUDE_PRETOOLUSE_ENTRY = {
261
329
  // before they hit disk. Eliminates the agent friction loop where a write
262
330
  // only fails at commit-time (`totem lint` pre-commit).
263
331
  //
332
+ // ALSO enforces the GitHub auto-close guard (mmnto-ai/totem#1762): any
333
+ // close-keyword (close/fix/resolve inflections) adjacent to an issue ref in a
334
+ // **/*.md write (EXEMPT .github/**, .totem/**) is blocked before it can reach a
335
+ // PR body / commit message and accidentally auto-close a linked issue — presence
336
+ // invariant, zero semantics, no negation parser. Shares @mmnto/totem's
337
+ // AUTO_CLOSE_REGEX_SOURCE (the one shared evaluator).
338
+ //
264
339
  // Exit-code contract is load-bearing — see hook source for details.
265
340
  //
266
341
  // Per OQ 2 of mmnto-ai/totem#1846 design: this entry installs into
@@ -270,8 +345,10 @@ export const CLAUDE_PRETOOLUSE_ENTRY = {
270
345
  // architectural distinction between seal-anchored substrate enforcement
271
346
  // and per-developer command interception.
272
347
  export const CLAUDE_PREWRITESHIELD = `// [totem] auto-generated — Claude Code PreWriteShield hook
273
- // Write-time enforcement of xrepo-qualify-refs.
274
- // Sealed in mmnto-ai/totem-strategy#145 (seal SHA c488888b).
348
+ // Rule 1: xrepo-qualify-refs (bare cross-repo refs) —
349
+ // sealed in mmnto-ai/totem-strategy#145 (seal SHA c488888b).
350
+ // Rule 2: GitHub auto-close keyword guard —
351
+ // design of record mmnto-ai/totem#1762; sibling seal pending its own PR.
275
352
  //
276
353
  // Mirrors the compiled rule pattern at lessonHash "xrepo-qualify-refs"
277
354
  // in mmnto-ai/totem-strategy:.totem/compiled-rules.json.
@@ -287,7 +364,16 @@ export const CLAUDE_PREWRITESHIELD = `// [totem] auto-generated — Claude Code
287
364
  'use strict';
288
365
 
289
366
  const BARE_REF_REGEX_SOURCE = ${JSON.stringify(BARE_REF_REGEX_SOURCE)};
367
+ // Single-sourced from @mmnto/totem's AUTO_CLOSE_REGEX_SOURCE (mmnto-ai/totem#1762);
368
+ // inlined for the rendered standalone .cjs the way BARE_REF_REGEX_SOURCE is.
369
+ const AUTO_CLOSE_REGEX_SOURCE = ${JSON.stringify(AUTO_CLOSE_REGEX_SOURCE)};
290
370
  const SCOPED_PATH_RE = /(\\.handoff[\\\\\\/]|\\.journal[\\\\\\/]|\\.md$)/i;
371
+ const AUTO_CLOSE_MD_RE = /\\.md$/i;
372
+ // EXEMPT .github/** (intentional close keywords) and .totem/** (tool/agent-authored
373
+ // content — never a GitHub auto-close surface). NOT .changeset/**: changeset prose
374
+ // is composed into the Version-Packages PR DESCRIPTION (an auto-close surface —
375
+ // verified on PR mmnto-ai/totem#2474); the totem-context directive is the escape.
376
+ const AUTO_CLOSE_GITHUB_RE = /(^|[\\\\\\/])\\.(github|totem)[\\\\\\/]/i;
291
377
  const SUPPRESS_DIRECTIVE_RE = /<!--\\s*totem-context:/;
292
378
 
293
379
  let stdin = '';
@@ -332,8 +418,31 @@ process.stdin.on('end', () => {
332
418
  filtered.push(line);
333
419
  }
334
420
 
421
+ const joined = filtered.join('\\n');
422
+
423
+ // ── Auto-close keyword guard (mmnto-ai/totem#1762): **/*.md, EXEMPT .github/**, .totem/** ──
424
+ // Presence invariant, zero semantics: any close-keyword adjacent to an issue
425
+ // ref (genuine OR negated) is blocked. Checked before the bare-ref arm because
426
+ // accidental upstream-issue closure is the higher-blast-radius failure.
427
+ if (AUTO_CLOSE_MD_RE.test(filePath) && !AUTO_CLOSE_GITHUB_RE.test(filePath)) {
428
+ const acRe = new RegExp(AUTO_CLOSE_REGEX_SOURCE, 'gi');
429
+ const acMatches = [...joined.matchAll(acRe)];
430
+ if (acMatches.length > 0) {
431
+ // Group layout: 1+2 = URL owner/repo+N; 3+4 = qualified owner/repo+N; 5 = bare N.
432
+ const acRefs = acMatches.slice(0, 5).map((m) => (m[1] ? m[1] + '#' + m[2] : m[3] ? m[3] + '#' + m[4] : '#' + m[5])).join(', ');
433
+ process.stderr.write(
434
+ '[totem PreWriteShield] GitHub auto-close keyword adjacent to issue ref in write to ' + filePath + ': ' + acRefs + '\\n' +
435
+ 'GitHub auto-closes linked issues from a PR body / commit message carrying this pattern (even under negation).\\n' +
436
+ 'Rephrase to a non-keyword form (\`references\` / \`see\` / \`tracks\`).\\n' +
437
+ 'For verbatim quotation, prefix with a \`<!-- totem-context: <reason> -->\` directive on the preceding line.\\n' +
438
+ 'mmnto-ai/totem#1762.\\n',
439
+ );
440
+ process.exit(2);
441
+ }
442
+ }
443
+
335
444
  const re = new RegExp(BARE_REF_REGEX_SOURCE, 'g');
336
- const matches = [...filtered.join('\\n').matchAll(re)];
445
+ const matches = [...joined.matchAll(re)];
337
446
  if (matches.length === 0) {
338
447
  process.exit(0);
339
448
  }
@@ -1 +1 @@
1
- {"version":3,"file":"init-templates.js","sourceRoot":"","sources":["../../src/commands/init-templates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init-templates.js","sourceRoot":"","sources":["../../src/commands/init-templates.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import * as fs from 'node:fs';
3
3
  import * as os from 'node:os';
4
4
  import * as path from 'node:path';
5
5
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
6
- import { LedgerEventSchema, resolveSelfAgents } from '@mmnto/totem';
6
+ import { AUTO_CLOSE_REGEX_SOURCE, LedgerEventSchema, resolveSelfAgents } from '@mmnto/totem';
7
7
  import { UNIVERSAL_BASELINE_LESSONS, UNIVERSAL_BASELINE_MARKDOWN, UNIVERSAL_BASELINE_MARKER, } from '../assets/universal-baseline.js';
8
8
  import { cleanTmpDir } from '../test-utils.js';
9
9
  import { buildNpxCommand, detectEmbeddingTier, detectReflexStatus, generateConfig, initCommand, installBaselineLessons, OLLAMA_FLOOR_DEFAULT_BASE_URL, probeOllamaFloor, REFLEX_VERSION, scaffoldClaudeHooks, scaffoldClaudeSessionStart, scaffoldClaudeSkill, scaffoldClaudeWriteShield, scaffoldFile, scaffoldMcpConfig, upgradeReflexes, } from './init.js';
@@ -1179,6 +1179,12 @@ describe('CLAUDE_PREWRITESHIELD template', () => {
1179
1179
  it('cites the seal at mmnto-ai/totem-strategy#145', () => {
1180
1180
  expect(CLAUDE_PREWRITESHIELD).toContain('mmnto-ai/totem-strategy#145');
1181
1181
  });
1182
+ it('inlines the shared AUTO_CLOSE_REGEX_SOURCE (mmnto-ai/totem#1762, JSON-encoded)', () => {
1183
+ expect(CLAUDE_PREWRITESHIELD).toContain(JSON.stringify(AUTO_CLOSE_REGEX_SOURCE));
1184
+ });
1185
+ it('cites the auto-close issue mmnto-ai/totem#1762', () => {
1186
+ expect(CLAUDE_PREWRITESHIELD).toContain('mmnto-ai/totem#1762');
1187
+ });
1182
1188
  });
1183
1189
  describe('PreWriteShield runtime behavior', () => {
1184
1190
  let tmpDir;
@@ -1291,6 +1297,96 @@ describe('PreWriteShield runtime behavior', () => {
1291
1297
  });
1292
1298
  expect(result.exitCode).toBe(0);
1293
1299
  });
1300
+ // ─── Auto-close keyword guard (mmnto-ai/totem#1762) ───────────────────────
1301
+ it('exits 2 on a close keyword adjacent to an issue ref in a **/*.md write', () => {
1302
+ const result = runHook({
1303
+ tool_name: 'Write',
1304
+ tool_input: { file_path: 'docs/x.md', content: 'Closes #131' },
1305
+ });
1306
+ expect(result.exitCode).toBe(2);
1307
+ expect(result.stderr).toMatch(/auto-close/i);
1308
+ expect(result.stderr).toContain('#131');
1309
+ });
1310
+ it('exits 2 even under NEGATION (presence invariant — the #2471 shape)', () => {
1311
+ const result = runHook({
1312
+ tool_name: 'Write',
1313
+ tool_input: { file_path: '.journal/t.md', content: 'Does not close #2466' },
1314
+ });
1315
+ expect(result.exitCode).toBe(2);
1316
+ expect(result.stderr).toMatch(/auto-close/i);
1317
+ expect(result.stderr).toContain('#2466');
1318
+ });
1319
+ it('exits 2 on a QUALIFIED close ref (owner/repo#N still auto-closes)', () => {
1320
+ const result = runHook({
1321
+ tool_name: 'Write',
1322
+ tool_input: { file_path: 'docs/x.md', content: 'Closes mmnto-ai/totem#131' },
1323
+ });
1324
+ expect(result.exitCode).toBe(2);
1325
+ expect(result.stderr).toMatch(/auto-close/i);
1326
+ });
1327
+ it('exits 2 on the issue-URL close form (kimi BLOCKING-1)', () => {
1328
+ const result = runHook({
1329
+ tool_name: 'Write',
1330
+ tool_input: {
1331
+ file_path: 'docs/x.md',
1332
+ content: 'Fixes https://github.com/mmnto-ai/totem/issues/2466',
1333
+ },
1334
+ });
1335
+ expect(result.exitCode).toBe(2);
1336
+ expect(result.stderr).toMatch(/auto-close/i);
1337
+ expect(result.stderr).toContain('mmnto-ai/totem#2466');
1338
+ });
1339
+ it('EXEMPTS .github/** from the auto-close guard (AC-4 — keywords intentional there)', () => {
1340
+ // Qualified ref so the sealed bare-ref arm (unchanged) also stays quiet; this
1341
+ // isolates the auto-close .github exemption.
1342
+ const result = runHook({
1343
+ tool_name: 'Write',
1344
+ tool_input: {
1345
+ file_path: '.github/PULL_REQUEST_TEMPLATE.md',
1346
+ content: 'Closes mmnto-ai/totem#131',
1347
+ },
1348
+ });
1349
+ expect(result.exitCode).toBe(0);
1350
+ });
1351
+ it('EXEMPTS .totem/** from the auto-close guard (gemini #2 — tool/agent-authored content)', () => {
1352
+ // Qualified ref isolates the auto-close .totem exemption from the sealed
1353
+ // bare-ref rule (which still applies to .totem/*.md — out of this slice's scope).
1354
+ const result = runHook({
1355
+ tool_name: 'Write',
1356
+ tool_input: { file_path: '.totem/lessons/x.md', content: 'Closes mmnto-ai/totem#131' },
1357
+ });
1358
+ expect(result.exitCode).toBe(0);
1359
+ });
1360
+ it('does NOT exempt .changeset/** (its prose is composed into the VP-PR description)', () => {
1361
+ // gemini #2 DECLINED half: changeset prose lands in the Version-Packages PR
1362
+ // description (an auto-close surface — verified on PR mmnto-ai/totem#2474).
1363
+ const result = runHook({
1364
+ tool_name: 'Write',
1365
+ tool_input: { file_path: '.changeset/happy-lions.md', content: 'Fixes mmnto-ai/totem#131' },
1366
+ });
1367
+ expect(result.exitCode).toBe(2);
1368
+ expect(result.stderr).toMatch(/auto-close/i);
1369
+ });
1370
+ it('respects the suppression-directive bypass for a verbatim-quoted close keyword', () => {
1371
+ const result = runHook({
1372
+ tool_name: 'Write',
1373
+ tool_input: {
1374
+ file_path: 'docs/x.md',
1375
+ content: '<!-- totem-context: verbatim quotation of a historical commit -->\nThe commit said closes #131.',
1376
+ },
1377
+ });
1378
+ expect(result.exitCode).toBe(0);
1379
+ });
1380
+ it('exits 0 on a non-keyword issue reference in markdown (references/see form)', () => {
1381
+ const result = runHook({
1382
+ tool_name: 'Write',
1383
+ tool_input: {
1384
+ file_path: 'docs/x.md',
1385
+ content: 'references mmnto-ai/totem#131 and see mmnto-ai/totem#5',
1386
+ },
1387
+ });
1388
+ expect(result.exitCode).toBe(0);
1389
+ });
1294
1390
  });
1295
1391
  describe('CLAUDE_SESSION_START runtime behavior (A.3.a ledger write)', () => {
1296
1392
  // Fail-fast guard for the spawned hook process, matching the 30s timeout
@@ -1369,10 +1465,16 @@ describe('CLAUDE_SESSION_START runtime behavior (A.3.a ledger write)', () => {
1369
1465
  }
1370
1466
  });
1371
1467
  });
1372
- describe('GEMINI_BEFORE_TOOL write_file/edit_file extension', () => {
1373
- it('extends BeforeTool with write_file/edit_file branch', () => {
1374
- expect(GEMINI_BEFORE_TOOL).toContain("'write_file'");
1375
- expect(GEMINI_BEFORE_TOOL).toContain("'edit_file'");
1468
+ describe('GEMINI_BEFORE_TOOL write_file/replace extension', () => {
1469
+ it('gates BOTH check functions on write_file + replace (+ legacy edit_file)', () => {
1470
+ // Gemini CLI's real write tools are `write_file` + `replace` — there is NO
1471
+ // `edit_file` (docs.gemini file-system tools; gemini-cli#20321). Every check
1472
+ // function must list `replace`, else surgical edits bypass the hook
1473
+ // (gemini #1). `edit_file` is kept for backward-safety.
1474
+ const gates = [...GEMINI_BEFORE_TOOL.matchAll(/toolName !== '([a-z_]+)'/g)].map((m) => m[1]);
1475
+ for (const wanted of ['write_file', 'replace']) {
1476
+ expect(gates.filter((g) => g === wanted).length).toBeGreaterThanOrEqual(2);
1477
+ }
1376
1478
  });
1377
1479
  it('inlines BARE_REF_REGEX_SOURCE in write-tool branch (JSON-encoded for safe JS string-literal embedding)', () => {
1378
1480
  expect(GEMINI_BEFORE_TOOL).toContain(JSON.stringify(BARE_REF_REGEX_SOURCE));
@@ -1384,6 +1486,85 @@ describe('GEMINI_BEFORE_TOOL write_file/edit_file extension', () => {
1384
1486
  it('cites the seal at mmnto-ai/totem-strategy#145 in BeforeTool extension', () => {
1385
1487
  expect(GEMINI_BEFORE_TOOL).toContain('mmnto-ai/totem-strategy#145');
1386
1488
  });
1489
+ it('inlines the shared AUTO_CLOSE_REGEX_SOURCE (mmnto-ai/totem#1762, parity with PreWriteShield)', () => {
1490
+ expect(GEMINI_BEFORE_TOOL).toContain(JSON.stringify(AUTO_CLOSE_REGEX_SOURCE));
1491
+ });
1492
+ it('wires the auto-close check into beforeTool and cites mmnto-ai/totem#1762', () => {
1493
+ expect(GEMINI_BEFORE_TOOL).toContain('checkAutoCloseKeywords(toolName, toolInput)');
1494
+ expect(GEMINI_BEFORE_TOOL).toContain('mmnto-ai/totem#1762');
1495
+ });
1496
+ });
1497
+ describe('GEMINI_BEFORE_TOOL auto-close runtime behavior (mmnto-ai/totem#1762)', () => {
1498
+ let tmpDir;
1499
+ let hookPath;
1500
+ beforeEach(() => {
1501
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-gemini-beforetool-'));
1502
+ hookPath = path.join(tmpDir, 'BeforeTool.js');
1503
+ fs.writeFileSync(hookPath, GEMINI_BEFORE_TOOL, 'utf-8');
1504
+ });
1505
+ afterEach(() => {
1506
+ cleanTmpDir(tmpDir);
1507
+ });
1508
+ /** Require the rendered hook fresh and report whether it threw. */
1509
+ function runBeforeTool(tool, input) {
1510
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
1511
+ const beforeTool = require(hookPath);
1512
+ try {
1513
+ beforeTool(tool, input);
1514
+ return { threw: false, message: '' };
1515
+ }
1516
+ catch (err) {
1517
+ return { threw: true, message: err instanceof Error ? err.message : String(err) };
1518
+ }
1519
+ }
1520
+ it('throws (blocks) on a close keyword adjacent to an issue ref in a **/*.md write, even negated', () => {
1521
+ const r = runBeforeTool('write_file', {
1522
+ file_path: 'docs/x.md',
1523
+ content: 'Does not close #2466',
1524
+ });
1525
+ expect(r.threw).toBe(true);
1526
+ expect(r.message).toMatch(/auto-close/i);
1527
+ expect(r.message).toContain('#2466');
1528
+ });
1529
+ it('blocks the auto-close rule via the real `replace` edit tool (gemini #1)', () => {
1530
+ const r = runBeforeTool('replace', {
1531
+ file_path: 'docs/x.md',
1532
+ new_string: 'Fixes https://github.com/mmnto-ai/totem/issues/2466',
1533
+ });
1534
+ expect(r.threw).toBe(true);
1535
+ expect(r.message).toContain('mmnto-ai/totem#2466');
1536
+ });
1537
+ it('blocks the xrepo bare-ref rule via `replace` too (fixes the same pre-existing gap)', () => {
1538
+ const r = runBeforeTool('replace', { file_path: '.journal/x.md', new_string: 'see #9 above' });
1539
+ expect(r.threw).toBe(true);
1540
+ expect(r.message).toMatch(/Bare PR\/issue/i);
1541
+ });
1542
+ it('uses the [totem BeforeTool] prefix, not [totem PreWriteShield] (gemini #3)', () => {
1543
+ const r = runBeforeTool('write_file', { file_path: 'docs/x.md', content: 'Closes #5' });
1544
+ expect(r.message).toContain('[totem BeforeTool]');
1545
+ expect(r.message).not.toContain('PreWriteShield');
1546
+ });
1547
+ it('exempts .github/** (qualified ref keeps the bare-ref arm quiet too)', () => {
1548
+ const r = runBeforeTool('write_file', {
1549
+ file_path: '.github/x.md',
1550
+ content: 'Closes mmnto-ai/totem#5',
1551
+ });
1552
+ expect(r.threw).toBe(false);
1553
+ });
1554
+ it('exempts .totem/** from the auto-close rule (gemini #2)', () => {
1555
+ const r = runBeforeTool('write_file', {
1556
+ file_path: '.totem/lessons/x.md',
1557
+ content: 'Closes mmnto-ai/totem#5',
1558
+ });
1559
+ expect(r.threw).toBe(false);
1560
+ });
1561
+ it('does not throw on a non-keyword reference form', () => {
1562
+ const r = runBeforeTool('edit_file', {
1563
+ file_path: 'docs/x.md',
1564
+ new_string: 'see mmnto-ai/totem#5',
1565
+ });
1566
+ expect(r.threw).toBe(false);
1567
+ });
1387
1568
  });
1388
1569
  describe('scaffoldClaudeSkill (mmnto-ai/totem#1890 Phase C slice 3)', () => {
1389
1570
  let tmpDir;