@mnemonik/codex-hooks 0.8.16 → 0.8.18

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/hook.js CHANGED
@@ -176,6 +176,7 @@ async function handlePreEdit(input, config) {
176
176
  event: 'PreToolUse',
177
177
  toolName: input.tool_name ?? '',
178
178
  toolArgs: input.tool_input,
179
+ eventId: input.tool_use_id,
179
180
  filePaths: existingTargets.map((t) => t.path),
180
181
  });
181
182
  if (!injectionsResult?.ok) {
@@ -247,6 +248,7 @@ async function handlePreBash(input, config) {
247
248
  event: 'PreToolUse',
248
249
  toolName: input.tool_name ?? 'Bash',
249
250
  toolArgs: input.tool_input,
251
+ eventId: input.tool_use_id,
250
252
  });
251
253
  if (!injectionsResp?.ok) {
252
254
  await emitGateFired(input, config, 'Bash', 'advisory', injectionsResp ? 'no_match' : 'unreachable');
@@ -329,6 +331,16 @@ function resolveMcpToolArgs(raw) {
329
331
  return { code: obj.code.slice(0, MAX_TOOL_ARGS_BYTES) };
330
332
  return undefined;
331
333
  }
334
+ /** MCP CallToolResult success is optional-isError=false by specification. */
335
+ function mcpResultSucceeded(result) {
336
+ if (!result || typeof result !== 'object' || Array.isArray(result))
337
+ return false;
338
+ const record = result;
339
+ return (record.isError !== true &&
340
+ record.is_error !== true &&
341
+ record.ok !== false &&
342
+ !('error' in record && record.error != null));
343
+ }
332
344
  /**
333
345
  * PreToolUse handler for the `mcp__mnemonik__.*` matcher. Calls the server's
334
346
  * ordering-rule engine and maps the verdict to a Codex output shape.
@@ -392,63 +404,60 @@ async function handlePreMcp(input, config) {
392
404
  async function handlePostTool(input, config) {
393
405
  const tool = input.tool_name ?? '';
394
406
  const targets = extractToolFileTargets(tool, input.tool_input, input.cwd);
395
- for (const target of targets) {
396
- await trackIdeEdit({
397
- server: config.server,
398
- apiKey: config.apiKey,
399
- sessionId: sessionId(input),
400
- filePath: target.path,
401
- cwd: input.cwd,
402
- });
403
- }
404
- if (MNEMONIK_MCP_PREFIX.test(tool) && config.apiKey && input.tool_response !== undefined) {
407
+ const editConfirmations = await Promise.all(targets.map((target) => trackIdeEdit({
408
+ server: config.server,
409
+ apiKey: config.apiKey,
410
+ sessionId: sessionId(input),
411
+ filePath: target.path,
412
+ cwd: input.cwd,
413
+ eventId: input.tool_use_id,
414
+ })));
415
+ const editsConfirmed = editConfirmations.every(Boolean);
416
+ if (targets.length > 0 && !editsConfirmed)
417
+ writeAllow();
418
+ const isMnemonikMcpExecution = MNEMONIK_MCP_PREFIX.test(tool) && input.tool_response !== undefined;
419
+ const projectId = config.apiKey ? (await findProjectIdentity(input.cwd))?.projectId : undefined;
420
+ if (isMnemonikMcpExecution && config.apiKey) {
405
421
  await fetchMcpRecord({
406
422
  server: config.server,
407
423
  apiKey: config.apiKey,
408
424
  cwd: input.cwd,
409
- projectId: (await findProjectIdentity(input.cwd))?.projectId,
425
+ projectId,
410
426
  codexSessionId: sessionId(input),
411
427
  tool,
412
428
  args: (input.tool_input ?? {}),
413
429
  result: input.tool_response,
414
430
  });
415
- // temporal-grounding Phase 1 (best-effort on Codex) — forward tool identity
416
- // on a PostToolUse /injections so the server's host-agnostic epoch writer can
417
- // mark the code_search obligation for Codex too. Codex fires MCP PostToolUse
418
- // hooks only intermittently (official docs), so this is best-effort and the
419
- // 'either'-precedence MCP-side floor still covers the gaps. Runs regardless of
420
- // CHECKPOINT_PRESSURE (that gate governs checkpoint prose, not the epoch
421
- // write). Fail-open; response ignored.
422
- await fetchInjections({
423
- server: config.server,
424
- apiKey: config.apiKey,
425
- cwd: input.cwd,
426
- projectId: (await findProjectIdentity(input.cwd))?.projectId,
427
- codexSessionId: sessionId(input),
428
- event: 'PostToolUse',
429
- toolName: tool,
430
- toolArgs: resolveMcpToolArgs(input.tool_input),
431
- });
432
431
  }
433
- // Checkpoint volume pressure (T2/T3/T4/T5). PostToolUse fires after every tool
434
- // including apply_patch edits and Codex injects additionalContext on this
435
- // event (PreToolUse cannot, per the Codex hooks contract). The edit tracking
436
- // above runs first so the server's file count includes this tool. Discreet,
437
- // never blocks. CHECKPOINT_PRESSURE=off is the kill switch.
438
- if (CHECKPOINT_PRESSURE !== 'off' && config.apiKey) {
432
+ // One PostToolUse lookup owns both concerns, but Mnemonik MCP results are
433
+ // always observe-only: persist their lifecycle metadata without consuming or
434
+ // rendering a checkpoint candidate on the result that may have satisfied it.
435
+ // Visible volume pressure belongs to the next non-Mnemonik PostToolUse.
436
+ if (config.apiKey && (CHECKPOINT_PRESSURE !== 'off' || isMnemonikMcpExecution)) {
439
437
  const injectionsResp = await fetchInjections({
440
438
  server: config.server,
441
439
  apiKey: config.apiKey,
442
440
  cwd: input.cwd,
443
- projectId: (await findProjectIdentity(input.cwd))?.projectId,
441
+ projectId,
444
442
  codexSessionId: sessionId(input),
445
443
  event: 'PostToolUse',
444
+ eventId: input.tool_use_id,
445
+ ...(isMnemonikMcpExecution
446
+ ? {
447
+ toolName: tool,
448
+ toolArgs: resolveMcpToolArgs(input.tool_input),
449
+ toolSucceeded: mcpResultSucceeded(input.tool_response),
450
+ observeOnly: true,
451
+ }
452
+ : {}),
446
453
  });
447
- const checkpoint = injectionsResp?.ok && Array.isArray(injectionsResp.injections)
448
- ? injectionsResp.injections.find((inj) => inj.signal === 'checkpoint_required')
449
- : undefined;
450
- if (checkpoint) {
451
- writeOutput(additionalContext(input.hook_event_name, trimContext(renderVisibleMnemonikText(checkpoint.envelope), 4_000)));
454
+ if (CHECKPOINT_PRESSURE !== 'off' && !isMnemonikMcpExecution) {
455
+ const checkpoint = injectionsResp?.ok && Array.isArray(injectionsResp.injections)
456
+ ? injectionsResp.injections.find((inj) => inj.signal === 'checkpoint_required')
457
+ : undefined;
458
+ if (checkpoint) {
459
+ writeOutput(additionalContext(input.hook_event_name, trimContext(renderVisibleMnemonikText(checkpoint.envelope), 4_000)));
460
+ }
452
461
  }
453
462
  }
454
463
  writeAllow();
package/dist/hook.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hook.js","sourceRoot":"","sources":["../src/hook.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hook.js","sourceRoot":"","sources":["../src/hook.ts"],"names":[],"mappings":"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"}
package/dist/install.d.ts CHANGED
@@ -4,23 +4,22 @@ interface HookCommand {
4
4
  command: string;
5
5
  timeout?: number;
6
6
  statusMessage?: string;
7
+ [k: string]: unknown;
7
8
  }
8
9
  interface HookGroup {
9
10
  matcher?: string;
10
11
  hooks?: HookCommand[];
12
+ [k: string]: unknown;
11
13
  }
12
14
  type InstallTarget = 'host' | 'project';
13
15
  /**
14
- * Codex app-server-backed desktop/IDE threads currently start with
15
- * `sessionStartSource: null` (observed via `codex debug app-server
16
- * send-message-v2` on 0.142.0), so a SessionStart matcher such as
17
- * `startup|resume|clear` suppresses the hook entirely on the path we care
18
- * about most. Leave SessionStart unfiltered and let the dispatcher self-skip
19
- * compact resumes at runtime instead.
16
+ * App-server-backed Codex threads can start with sessionStartSource=null, so
17
+ * SessionStart must remain unfiltered. Compact resumes are skipped at runtime.
20
18
  */
21
19
  declare const SESSION_START_MATCHER: string | undefined;
22
20
  declare function buildHookEntry(dispatcher: string, timeout?: number): HookCommand;
23
21
  declare function patchHookGroup(groups: HookGroup[] | undefined, matcher: string | undefined, entry: HookCommand): HookGroup[];
22
+ /** Edit only the canonical [features] table; same-named keys elsewhere stay. */
24
23
  declare function ensureCodexHooksFeature(configToml: string): string;
25
24
  declare function parseArgs(argv: string[]): {
26
25
  target: InstallTarget;
package/dist/install.js CHANGED
@@ -1,98 +1,170 @@
1
1
  #!/usr/bin/env node
2
2
  import { existsSync, realpathSync } from 'node:fs';
3
- import { mkdir, readFile, writeFile } from 'node:fs/promises';
4
- import { dirname, join, resolve } from 'node:path';
3
+ import { join, resolve } from 'node:path';
5
4
  import { fileURLToPath } from 'node:url';
5
+ import { atomicWriteTransaction, buildManagedCommand, canonicalizeConfigTargets, installerConfigLockPath, installDurableRuntime, isManagedCommand, parseManagedCommand, readTextIfExists, resolvePackageRoot, resolveRuntimeParent, withFileLocks, } from './lib/installerSupport.js';
6
6
  const HOOK_TAG = 'mnemonik-codex-hooks';
7
+ const HOOK_OWNER = 'codex-hooks';
8
+ const PACKAGE_NAME = '@mnemonik/codex-hooks';
7
9
  /**
8
- * Codex app-server-backed desktop/IDE threads currently start with
9
- * `sessionStartSource: null` (observed via `codex debug app-server
10
- * send-message-v2` on 0.142.0), so a SessionStart matcher such as
11
- * `startup|resume|clear` suppresses the hook entirely on the path we care
12
- * about most. Leave SessionStart unfiltered and let the dispatcher self-skip
13
- * compact resumes at runtime instead.
10
+ * App-server-backed Codex threads can start with sessionStartSource=null, so
11
+ * SessionStart must remain unfiltered. Compact resumes are skipped at runtime.
14
12
  */
15
13
  const SESSION_START_MATCHER = undefined;
16
14
  function resolveDispatcherPath() {
17
- const here = fileURLToPath(import.meta.url);
18
- return resolve(dirname(here), 'hook.js');
15
+ return resolve(fileURLToPath(new URL('./hook.js', import.meta.url)));
19
16
  }
20
- // Hook exec timeout is 5s here (Codex) vs 30s in @mnemonik/cursor-hooks
21
- // (install.ts buildHookEntry). The asymmetry is intentional and host-driven:
22
- // Codex fires MCP hooks intermittently and expects fast dispatchers, while
23
- // Cursor's afterMCPExecution can carry larger tool payloads. Do NOT "unify"
24
- // these to one value — it would force both packages to republish for no gain.
25
17
  function buildHookEntry(dispatcher, timeout = 5) {
26
18
  return {
27
19
  type: 'command',
28
- command: `node ${JSON.stringify(dispatcher)}`,
20
+ command: buildManagedCommand(dispatcher, HOOK_OWNER),
29
21
  timeout,
30
22
  };
31
23
  }
32
- function isMnemonikGroup(group) {
33
- if (group.matcher === HOOK_TAG)
34
- return true;
35
- return Boolean(group.hooks?.some((h) => typeof h.command === 'string' && h.command.includes('codex-hooks')));
24
+ function isMnemonikHookCommand(command, currentDispatcher) {
25
+ return isManagedCommand(command, HOOK_OWNER, PACKAGE_NAME, 'hook.js', currentDispatcher);
36
26
  }
37
27
  function patchHookGroup(groups, matcher, entry) {
38
- const filtered = (groups ?? []).filter((g) => !isMnemonikGroup(g));
28
+ const currentDispatcher = parseManagedCommand(entry.command, HOOK_OWNER) ?? undefined;
29
+ const filtered = removeMnemonikHookGroups(groups, currentDispatcher);
39
30
  const group = { hooks: [entry] };
40
31
  if (matcher !== undefined)
41
32
  group.matcher = matcher;
42
33
  filtered.push(group);
43
34
  return filtered;
44
35
  }
45
- async function readHooksJson(path) {
46
- if (!existsSync(path))
47
- return {};
48
- try {
49
- const raw = await readFile(path, 'utf8');
50
- return JSON.parse(raw);
51
- }
52
- catch (err) {
53
- throw new Error(`Could not parse ${path}: ${err instanceof Error ? err.message : String(err)}`);
36
+ function removeMnemonikHookGroups(groups, currentDispatcher) {
37
+ const filtered = [];
38
+ for (const group of groups ?? []) {
39
+ const originalHooks = group.hooks ?? [];
40
+ const remainingHooks = originalHooks.filter((hook) => typeof hook.command !== 'string' || !isMnemonikHookCommand(hook.command, currentDispatcher));
41
+ const removedManagedHook = remainingHooks.length !== originalHooks.length;
42
+ if (removedManagedHook) {
43
+ if (remainingHooks.length > 0)
44
+ filtered.push({ ...group, hooks: remainingHooks });
45
+ }
46
+ else if (!(group.matcher === HOOK_TAG && originalHooks.length === 0)) {
47
+ filtered.push(group);
48
+ }
54
49
  }
50
+ return filtered;
55
51
  }
56
- async function writeJson(path, value) {
57
- await mkdir(dirname(path), { recursive: true });
58
- await writeFile(path, JSON.stringify(value, null, 2) + '\n', 'utf8');
52
+ function isRecord(value) {
53
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
59
54
  }
60
- function ensureFeatureFlag(configToml, key) {
61
- const truePattern = new RegExp(`^\\s*${key}\\s*=\\s*true\\s*$`, 'm');
62
- if (truePattern.test(configToml))
63
- return configToml;
64
- const existingPattern = new RegExp(`^\\s*${key}\\s*=.*$`, 'm');
65
- if (existingPattern.test(configToml)) {
66
- return configToml.replace(existingPattern, `${key} = true`);
55
+ function validateHooksJson(parsed) {
56
+ if (!isRecord(parsed))
57
+ throw new Error('expected a top-level JSON object');
58
+ if (parsed.hooks !== undefined) {
59
+ if (!isRecord(parsed.hooks))
60
+ throw new Error('expected "hooks" to be a JSON object');
61
+ for (const [event, groups] of Object.entries(parsed.hooks)) {
62
+ if (!Array.isArray(groups) || !groups.every(isRecord)) {
63
+ throw new Error(`expected "hooks.${event}" to be an array of hook groups`);
64
+ }
65
+ for (const group of groups) {
66
+ if (group.hooks === undefined)
67
+ continue;
68
+ if (!Array.isArray(group.hooks) || !group.hooks.every(isRecord)) {
69
+ throw new Error(`expected "hooks.${event}[].hooks" to be an array of hook objects`);
70
+ }
71
+ for (const hook of group.hooks) {
72
+ if (hook.command !== undefined && typeof hook.command !== 'string') {
73
+ throw new Error(`expected "hooks.${event}[].hooks[].command" to be a string`);
74
+ }
75
+ }
76
+ }
77
+ }
67
78
  }
68
- const featureHeader = configToml.match(/^\[features\]\s*$/m);
69
- if (!featureHeader?.index && featureHeader?.index !== 0) {
70
- const prefix = configToml.endsWith('\n') || configToml.length === 0 ? configToml : `${configToml}\n`;
71
- return `${prefix}\n[features]\n${key} = true\n`;
79
+ return parsed;
80
+ }
81
+ async function readHooksJson(path) {
82
+ const raw = await readTextIfExists(path);
83
+ if (raw === null)
84
+ return { hooksJson: {}, raw: null };
85
+ try {
86
+ return { hooksJson: validateHooksJson(JSON.parse(raw)), raw };
87
+ }
88
+ catch (error) {
89
+ throw new Error(`Could not parse ${path}: ${error instanceof Error ? error.message : String(error)}`);
72
90
  }
73
- const insertAt = featureHeader.index + featureHeader[0].length;
74
- return `${configToml.slice(0, insertAt)}\n${key} = true${configToml.slice(insertAt)}`;
75
91
  }
92
+ /** Edit only the canonical [features] table; same-named keys elsewhere stay. */
76
93
  function ensureCodexHooksFeature(configToml) {
77
- // codex_hooks is deprecated in favor of hooks; drop any stale line on upgrade
78
- const cleaned = configToml.replace(/^\s*codex_hooks\s*=.*\n?/m, '');
79
- return ensureFeatureFlag(cleaned, 'hooks');
80
- }
81
- async function ensureConfigFlag(path) {
82
- const raw = existsSync(path) ? await readFile(path, 'utf8') : '';
83
- const next = ensureCodexHooksFeature(raw);
84
- if (next !== raw) {
85
- await mkdir(dirname(path), { recursive: true });
86
- await writeFile(path, next.endsWith('\n') ? next : `${next}\n`, 'utf8');
94
+ const newline = configToml.includes('\r\n') ? '\r\n' : '\n';
95
+ const trailingNewline = configToml.endsWith('\n');
96
+ const lines = configToml.split(/\r?\n/);
97
+ if (trailingNewline)
98
+ lines.pop();
99
+ const featureHeaders = [];
100
+ for (let index = 0; index < lines.length; index += 1) {
101
+ if (/^\s*\[\s*(?:features|"features"|'features')\s*\]\s*(?:#.*)?$/.test(lines[index])) {
102
+ featureHeaders.push(index);
103
+ }
87
104
  }
105
+ if (featureHeaders.length > 1)
106
+ throw new Error('Duplicate [features] tables in Codex config');
107
+ if (featureHeaders.length === 0) {
108
+ const firstTable = lines.findIndex((line) => /^\s*\[\[?.+?\]\]?\s*(?:#.*)?$/.test(line));
109
+ const rootLines = firstTable === -1 ? lines : lines.slice(0, firstTable);
110
+ if (rootLines.some((line) => /^\s*(?:features|"features"|'features')\s*(?:=|\.)/.test(line))) {
111
+ throw new Error('Unsupported inline or dotted features table representation in Codex config');
112
+ }
113
+ const prefix = configToml.length === 0
114
+ ? ''
115
+ : configToml.endsWith('\n')
116
+ ? configToml
117
+ : `${configToml}${newline}`;
118
+ return `${prefix}${prefix ? newline : ''}[features]${newline}hooks = true${newline}`;
119
+ }
120
+ const start = featureHeaders[0];
121
+ let end = lines.length;
122
+ for (let index = start + 1; index < lines.length; index += 1) {
123
+ if (/^\s*\[\[?.+?\]\]?\s*(?:#.*)?$/.test(lines[index])) {
124
+ end = index;
125
+ break;
126
+ }
127
+ }
128
+ const section = [];
129
+ let sawHooks = false;
130
+ for (const line of lines.slice(start + 1, end)) {
131
+ if (/^\s*(?:codex_hooks|"codex_hooks"|'codex_hooks')\s*=/.test(line))
132
+ continue;
133
+ const hooks = line.match(/^(\s*)(?:hooks|"hooks"|'hooks')\s*=.*?(\s+#.*)?$/);
134
+ if (!hooks) {
135
+ section.push(line);
136
+ continue;
137
+ }
138
+ if (sawHooks)
139
+ throw new Error('Duplicate hooks keys in Codex [features] table');
140
+ sawHooks = true;
141
+ section.push(`${hooks[1]}hooks = true${hooks[2] ?? ''}`);
142
+ }
143
+ if (!sawHooks)
144
+ section.unshift('hooks = true');
145
+ return `${[...lines.slice(0, start + 1), ...section, ...lines.slice(end)].join(newline)}${trailingNewline ? newline : ''}`;
88
146
  }
89
147
  function parseArgs(argv) {
90
148
  let target = 'host';
149
+ let explicitTarget = null;
150
+ let sawInstall = false;
91
151
  for (const arg of argv) {
152
+ if (arg === 'install' && !sawInstall) {
153
+ sawInstall = true;
154
+ continue;
155
+ }
156
+ let parsedTarget;
92
157
  if (arg === '--scope=project')
93
- target = 'project';
158
+ parsedTarget = 'project';
94
159
  else if (arg === '--scope=user' || arg === '--scope=host')
95
- target = 'host';
160
+ parsedTarget = 'host';
161
+ else
162
+ throw new Error(`Unknown installer argument: ${arg}`);
163
+ if (explicitTarget && explicitTarget !== parsedTarget) {
164
+ throw new Error('Conflicting --scope arguments');
165
+ }
166
+ explicitTarget = parsedTarget;
167
+ target = parsedTarget;
96
168
  }
97
169
  return { target };
98
170
  }
@@ -101,39 +173,104 @@ function resolveCodexDir(target, cwd, env = process.env) {
101
173
  return join(cwd, '.codex');
102
174
  if (env.CODEX_HOME?.trim())
103
175
  return resolve(env.CODEX_HOME);
104
- const home = env.HOME ?? env.USERPROFILE;
105
- if (!home) {
176
+ const home = env.HOME?.trim() || env.USERPROFILE?.trim();
177
+ if (!home)
106
178
  throw new Error('Could not determine home directory for Codex host install');
107
- }
108
179
  return join(home, '.codex');
109
180
  }
181
+ function removeMnemonikHooks(hooksJson, currentDispatcher) {
182
+ if (!hooksJson.hooks)
183
+ return false;
184
+ let changed = false;
185
+ for (const [event, groups] of Object.entries(hooksJson.hooks)) {
186
+ const remaining = removeMnemonikHookGroups(groups, currentDispatcher);
187
+ const eventChanged = remaining.length !== groups.length ||
188
+ remaining.some((group, index) => group !== groups[index]);
189
+ if (!eventChanged)
190
+ continue;
191
+ changed = true;
192
+ if (remaining.length === 0)
193
+ delete hooksJson.hooks[event];
194
+ else
195
+ hooksJson.hooks[event] = remaining;
196
+ }
197
+ return changed;
198
+ }
110
199
  async function main(argv) {
111
200
  const { target } = parseArgs(argv);
112
201
  const cwd = process.cwd();
113
202
  const codexDir = resolveCodexDir(target, cwd);
114
- const hooksPath = join(codexDir, 'hooks.json');
115
- const configPath = join(codexDir, 'config.toml');
203
+ const requestedHooksPath = join(codexDir, 'hooks.json');
204
+ const requestedConfigPath = join(codexDir, 'config.toml');
205
+ const alternateDir = resolveCodexDir(target === 'host' ? 'project' : 'host', cwd);
206
+ const requestedAlternateHooksPath = join(alternateDir, 'hooks.json');
207
+ const [hooksPath, alternateHooksPath, configPath] = await canonicalizeConfigTargets([
208
+ requestedHooksPath,
209
+ requestedAlternateHooksPath,
210
+ requestedConfigPath,
211
+ ]);
212
+ if (configPath === hooksPath || configPath === alternateHooksPath) {
213
+ throw new Error('Codex hooks.json and config.toml must not alias the same file');
214
+ }
215
+ const runtimeParent = resolveRuntimeParent();
116
216
  const dispatcher = resolveDispatcherPath();
117
217
  if (!existsSync(dispatcher)) {
118
218
  console.error(`mnemonik-codex-hooks: dispatcher not found at ${dispatcher}. Did the package install correctly?`);
119
219
  return 1;
120
220
  }
121
- const hooksJson = await readHooksJson(hooksPath);
122
- const hooks = (hooksJson.hooks ?? {});
123
- const entry = buildHookEntry(dispatcher);
124
- hooks.SessionStart = patchHookGroup(hooks.SessionStart, SESSION_START_MATCHER, buildHookEntry(dispatcher));
125
- hooks.UserPromptSubmit = patchHookGroup(hooks.UserPromptSubmit, undefined, buildHookEntry(dispatcher));
126
- hooks.PreToolUse = patchHookGroup(hooks.PreToolUse, 'Bash|shell|apply_patch|Edit|Write|mcp__mnemonik__.*', entry);
127
- hooks.PostToolUse = patchHookGroup(hooks.PostToolUse, 'apply_patch|Edit|Write|mcp__mnemonik__.*', buildHookEntry(dispatcher));
128
- hooks.Stop = patchHookGroup(hooks.Stop, undefined, buildHookEntry(dispatcher));
129
- hooksJson.hooks = hooks;
130
- await writeJson(hooksPath, hooksJson);
131
- await ensureConfigFlag(configPath);
221
+ let installedDispatcher = dispatcher;
222
+ let alternateMigrated = false;
223
+ await withFileLocks([
224
+ installerConfigLockPath(hooksPath, runtimeParent),
225
+ installerConfigLockPath(alternateHooksPath, runtimeParent),
226
+ installerConfigLockPath(configPath, runtimeParent),
227
+ ], async () => {
228
+ const { hooksJson, raw: hooksRaw } = await readHooksJson(hooksPath);
229
+ const configRaw = await readTextIfExists(configPath);
230
+ const nextConfig = ensureCodexHooksFeature(configRaw ?? '');
231
+ const alternate = alternateHooksPath === hooksPath ? null : await readHooksJson(alternateHooksPath);
232
+ // Validate the requested hooks/config and the alternate hooks file before
233
+ // installing the runtime or mutating any configuration.
234
+ const runtime = await installDurableRuntime({
235
+ sourcePackageRoot: resolvePackageRoot(import.meta.url),
236
+ runtimeParent,
237
+ runtimeName: HOOK_OWNER,
238
+ entrypoints: ['hook.js'],
239
+ });
240
+ installedDispatcher = runtime.entrypoints['hook.js'];
241
+ const entry = buildHookEntry(installedDispatcher);
242
+ const hooks = (hooksJson.hooks ?? {});
243
+ hooks.SessionStart = patchHookGroup(hooks.SessionStart, SESSION_START_MATCHER, entry);
244
+ hooks.UserPromptSubmit = patchHookGroup(hooks.UserPromptSubmit, undefined, entry);
245
+ hooks.PreToolUse = patchHookGroup(hooks.PreToolUse, 'Bash|shell|apply_patch|Edit|Write|mcp__mnemonik__.*', entry);
246
+ hooks.PostToolUse = patchHookGroup(hooks.PostToolUse, 'apply_patch|Edit|Write|mcp__mnemonik__.*', entry);
247
+ hooks.Stop = patchHookGroup(hooks.Stop, undefined, entry);
248
+ hooksJson.hooks = hooks;
249
+ const nextHooks = `${JSON.stringify(hooksJson, null, 2)}\n`;
250
+ const changes = [
251
+ { path: configPath, expected: configRaw, next: nextConfig },
252
+ { path: hooksPath, expected: hooksRaw, next: nextHooks },
253
+ ];
254
+ if (alternate !== null && alternate.raw !== null) {
255
+ alternateMigrated = removeMnemonikHooks(alternate.hooksJson, dispatcher);
256
+ if (alternateMigrated) {
257
+ changes.push({
258
+ path: alternateHooksPath,
259
+ expected: alternate.raw,
260
+ next: `${JSON.stringify(alternate.hooksJson, null, 2)}\n`,
261
+ });
262
+ }
263
+ }
264
+ await atomicWriteTransaction(changes);
265
+ });
132
266
  console.log([
133
- `mnemonik-codex-hooks: wired into ${hooksPath}`,
267
+ `mnemonik-codex-hooks: wired into ${requestedHooksPath}`,
134
268
  ` target -> ${target}`,
135
- ` feature flag -> ${configPath}`,
136
- ` dispatcher -> ${dispatcher}`,
269
+ ...(alternateMigrated
270
+ ? [` migration -> removed duplicate Mnemonik hooks from ${requestedAlternateHooksPath}`]
271
+ : []),
272
+ ` feature flag -> ${requestedConfigPath}`,
273
+ ` dispatcher -> ${installedDispatcher}`,
137
274
  '',
138
275
  'Installed Codex hooks only. This does not install or modify skills, rules, AGENTS.md, .mnemonik.json, or MCP config.',
139
276
  'Bash policy reminders are server-driven. The dispatcher posts the command to /api/v1/hooks/policy-reminder; matched policies come back as a systemMessage. No per-kind knobs in the client.',
@@ -155,8 +292,8 @@ function isDirectExecution() {
155
292
  if (isDirectExecution()) {
156
293
  main(process.argv.slice(2))
157
294
  .then((code) => process.exit(code))
158
- .catch((err) => {
159
- console.error(`mnemonik-codex-hooks: ${err instanceof Error ? err.message : String(err)}`);
295
+ .catch((error) => {
296
+ console.error(`mnemonik-codex-hooks: ${error instanceof Error ? error.message : String(error)}`);
160
297
  process.exit(1);
161
298
  });
162
299
  }