agent-switchboard 0.4.11 → 0.4.15

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.
@@ -57,13 +57,6 @@ export declare function getHooksDir(): string;
57
57
  * Local plugin sources can be placed here and referenced by short name.
58
58
  */
59
59
  export declare function getPluginsDir(): string;
60
- /**
61
- * Returns the directory for remote source clones (~/.asb/plugins/.cache/).
62
- * Migrates transparently from the legacy ~/.asb/marketplaces/ location.
63
- * Without namespace: returns the base cache dir.
64
- * With namespace: returns the namespace-specific dir.
65
- */
66
- export declare function getSourceCacheDir(namespace?: string): string;
67
60
  /**
68
61
  * Returns the home directory for installed agent apps (Claude Code, OpenCode, etc.)
69
62
  * Can be overridden via `ASB_AGENTS_HOME`; falls back to the OS user home.
@@ -72,7 +65,12 @@ export declare function getAgentsHome(): string;
72
65
  /** Platform-specific roots for common agent apps */
73
66
  export declare function getClaudeDir(): string;
74
67
  export declare function getCodexDir(): string;
68
+ export declare function getProjectCodexDir(projectRoot: string): string;
75
69
  export declare function getCodexAgentsDir(): string;
70
+ export declare function getCodexHooksDir(): string;
71
+ export declare function getProjectCodexHooksDir(projectRoot: string): string;
72
+ export declare function getCodexHooksJsonPath(): string;
73
+ export declare function getProjectCodexHooksJsonPath(projectRoot: string): string;
76
74
  export declare function getGeminiDir(): string;
77
75
  export declare function getCursorDir(): string;
78
76
  export declare function getOpencodeRoot(): string;
@@ -103,27 +103,6 @@ export function getHooksDir() {
103
103
  export function getPluginsDir() {
104
104
  return path.join(getConfigDir(), 'plugins');
105
105
  }
106
- /**
107
- * Returns the directory for remote source clones (~/.asb/plugins/.cache/).
108
- * Migrates transparently from the legacy ~/.asb/marketplaces/ location.
109
- * Without namespace: returns the base cache dir.
110
- * With namespace: returns the namespace-specific dir.
111
- */
112
- export function getSourceCacheDir(namespace) {
113
- const newBase = path.join(getPluginsDir(), '.cache');
114
- const legacyBase = path.join(getConfigDir(), 'marketplaces');
115
- if (!fs.existsSync(newBase) && fs.existsSync(legacyBase)) {
116
- try {
117
- fs.mkdirSync(path.dirname(newBase), { recursive: true });
118
- fs.renameSync(legacyBase, newBase);
119
- }
120
- catch {
121
- if (!fs.existsSync(newBase))
122
- throw new Error('Failed to migrate marketplaces/ to plugins/.cache/');
123
- }
124
- }
125
- return namespace ? path.join(newBase, namespace) : newBase;
126
- }
127
106
  /**
128
107
  * Returns the home directory for installed agent apps (Claude Code, OpenCode, etc.)
129
108
  * Can be overridden via `ASB_AGENTS_HOME`; falls back to the OS user home.
@@ -141,9 +120,24 @@ export function getClaudeDir() {
141
120
  export function getCodexDir() {
142
121
  return path.join(getAgentsHome(), '.codex');
143
122
  }
123
+ export function getProjectCodexDir(projectRoot) {
124
+ return path.join(path.resolve(projectRoot), '.codex');
125
+ }
144
126
  export function getCodexAgentsDir() {
145
127
  return path.join(getCodexDir(), 'agents');
146
128
  }
129
+ export function getCodexHooksDir() {
130
+ return path.join(getCodexDir(), 'hooks');
131
+ }
132
+ export function getProjectCodexHooksDir(projectRoot) {
133
+ return path.join(getProjectCodexDir(projectRoot), 'hooks');
134
+ }
135
+ export function getCodexHooksJsonPath() {
136
+ return path.join(getCodexDir(), 'hooks.json');
137
+ }
138
+ export function getProjectCodexHooksJsonPath(projectRoot) {
139
+ return path.join(getProjectCodexDir(projectRoot), 'hooks.json');
140
+ }
147
141
  export function getGeminiDir() {
148
142
  return path.join(getAgentsHome(), '.gemini');
149
143
  }
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,8CAA8C;AAC9C,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,mCAAmC;AACnC,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AAE/C;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC7C,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAElD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAErD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC7C,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,UAAU,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAChD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,UAAU,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAkB;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,QAAQ,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,cAAc,CAAC,CAAC;IAE7D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;IACrD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IACrD,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;AACtB,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO;QACjC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC;QACnD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAG,QAAkB;IACnD,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACzD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,WAAmB;IAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACnE,CAAC;AAED,2GAA2G;AAC3G,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,WAAmB;IACxD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,WAAmB,EAAE,GAAG,QAAkB;IAC/E,OAAO,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC;AACrE,CAAC;AAED,0BAA0B;AAC1B,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,cAAc,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,eAAe,CAAC,CAAC;AACpD,CAAC;AAID,MAAM,aAAa,GAAgC;IACjD,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,SAAS;CACrB,CAAC;AAEF,MAAM,gBAAgB,GAAgC;IACpD,IAAI,EAAE,OAAO;IACb,SAAS,EAAE,UAAU;CACtB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAoB;IACrD,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACvC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;QACtB,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,OAAO,CAAC,CAAC;QACpE,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACxD;YACE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,iBAAiB,CAAC,OAAoB;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AACpE,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,cAAc,CAAC,OAAoB;IACjD,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;QACtB,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,IAAI,CACd,IAAI,EACJ,SAAS,EACT,qBAAqB,EACrB,QAAQ,EACR,4BAA4B,CAC7B,CAAC;QACJ,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,4BAA4B,CAAC,CAAC;QACvF,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,4BAA4B,CAAC,CAAC;QAC5E;YACE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,4BAA4B,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Codex hook distribution: writes hooks.json and copies bundle files.
3
+ *
4
+ * Codex reads hooks from ~/.codex/hooks.json (global) and
5
+ * <project>/.codex/hooks.json (project scope). Unlike Claude Code which
6
+ * embeds hooks inside settings.json, Codex uses a dedicated file.
7
+ *
8
+ * Codex only supports: command handlers, 5 event types, no ${HOOK_DIR}
9
+ * runtime expansion. ASB must filter unsupported entries and rewrite
10
+ * bundle paths to absolute paths before writing.
11
+ */
12
+ import type { ConfigScope } from '../config/scope.js';
13
+ import type { DistributionResult } from '../library/distribute.js';
14
+ import type { BundleDistributionResult } from '../library/distribute-bundle.js';
15
+ import type { HookEntry } from './library.js';
16
+ type CodexPlatform = 'codex';
17
+ export interface CodexHookDistributeOptions {
18
+ scope?: ConfigScope;
19
+ selected: readonly HookEntry[];
20
+ dryRun?: boolean;
21
+ projectMode?: 'managed' | 'exclusive' | 'none';
22
+ }
23
+ export declare function distributeCodexHooks(options: CodexHookDistributeOptions): {
24
+ results: Array<DistributionResult<CodexPlatform> | BundleDistributionResult<CodexPlatform>>;
25
+ };
26
+ export {};
@@ -0,0 +1,370 @@
1
+ /**
2
+ * Codex hook distribution: writes hooks.json and copies bundle files.
3
+ *
4
+ * Codex reads hooks from ~/.codex/hooks.json (global) and
5
+ * <project>/.codex/hooks.json (project scope). Unlike Claude Code which
6
+ * embeds hooks inside settings.json, Codex uses a dedicated file.
7
+ *
8
+ * Codex only supports: command handlers, 5 event types, no ${HOOK_DIR}
9
+ * runtime expansion. ASB must filter unsupported entries and rewrite
10
+ * bundle paths to absolute paths before writing.
11
+ */
12
+ import fs from 'node:fs';
13
+ import os from 'node:os';
14
+ import path from 'node:path';
15
+ import { ensureTrustEntry } from '../agents/codex.js';
16
+ import { getCodexConfigPath, getCodexDir, getCodexHooksJsonPath, getProjectCodexDir, getProjectCodexHooksJsonPath, } from '../config/paths.js';
17
+ import { distributeBundle } from '../library/distribute-bundle.js';
18
+ import { ensureParentDir, rmDirRecursive } from '../library/fs.js';
19
+ import { listHookBundleFiles } from './library.js';
20
+ import { HOOK_DIR_PLACEHOLDER } from './schema.js';
21
+ const CODEX_SUPPORTED_EVENTS = new Set([
22
+ 'PreToolUse',
23
+ 'PostToolUse',
24
+ 'SessionStart',
25
+ 'UserPromptSubmit',
26
+ 'Stop',
27
+ ]);
28
+ const CODEX_SUPPORTED_HANDLER_TYPES = new Set(['command']);
29
+ // biome-ignore lint/suspicious/noTemplateCurlyInString: intentional literal placeholder
30
+ const CLAUDE_PLUGIN_ROOT_HOOKS_PREFIX = '${CLAUDE_PLUGIN_ROOT}/hooks';
31
+ // biome-ignore lint/suspicious/noTemplateCurlyInString: intentional literal placeholder
32
+ const CLAUDE_PLUGIN_ROOT_HOOKS_PREFIX_WINDOWS = '${CLAUDE_PLUGIN_ROOT}\\hooks';
33
+ const ASB_MANAGED_KEY = '_asb_managed_hooks';
34
+ const ASB_HOOKS_SUBDIR = 'asb';
35
+ // ---------------------------------------------------------------------------
36
+ // Path helpers
37
+ // ---------------------------------------------------------------------------
38
+ function resolveHooksJsonPath(scope) {
39
+ const projectRoot = scope?.project?.trim();
40
+ if (projectRoot && projectRoot.length > 0) {
41
+ return getProjectCodexHooksJsonPath(projectRoot);
42
+ }
43
+ return getCodexHooksJsonPath();
44
+ }
45
+ function resolveHooksBundleParentDir(scope) {
46
+ const projectRoot = scope?.project?.trim();
47
+ if (projectRoot && projectRoot.length > 0) {
48
+ return path.join(getProjectCodexDir(projectRoot), 'hooks', ASB_HOOKS_SUBDIR);
49
+ }
50
+ return path.join(getCodexDir(), 'hooks', ASB_HOOKS_SUBDIR);
51
+ }
52
+ function resolveHookBundleTargetDir(entry, scope) {
53
+ return path.join(resolveHooksBundleParentDir(scope), entry.id);
54
+ }
55
+ // ---------------------------------------------------------------------------
56
+ // Portable path helpers
57
+ // ---------------------------------------------------------------------------
58
+ function preferHomeVar(command) {
59
+ const home = os.homedir();
60
+ if (!command.includes(home))
61
+ return command;
62
+ return command.replaceAll(home, '$HOME');
63
+ }
64
+ function filterForCodex(entries) {
65
+ const result = [];
66
+ for (const entry of entries) {
67
+ const filteredHooks = {};
68
+ for (const [event, groups] of Object.entries(entry.hooks)) {
69
+ if (!CODEX_SUPPORTED_EVENTS.has(event))
70
+ continue;
71
+ const filteredGroups = [];
72
+ for (const group of groups) {
73
+ const filteredHandlers = (group.hooks ?? []).filter((h) => CODEX_SUPPORTED_HANDLER_TYPES.has(h.type ?? ''));
74
+ if (filteredHandlers.length > 0) {
75
+ filteredGroups.push({ ...group, hooks: filteredHandlers });
76
+ }
77
+ }
78
+ if (filteredGroups.length > 0) {
79
+ filteredHooks[event] = filteredGroups;
80
+ }
81
+ }
82
+ if (Object.keys(filteredHooks).length > 0) {
83
+ result.push({ entry, hooks: filteredHooks });
84
+ }
85
+ }
86
+ return result;
87
+ }
88
+ // ---------------------------------------------------------------------------
89
+ // hooks.json I/O
90
+ // ---------------------------------------------------------------------------
91
+ function readHooksJson(filePath) {
92
+ try {
93
+ if (fs.existsSync(filePath)) {
94
+ return {
95
+ ok: true,
96
+ data: JSON.parse(fs.readFileSync(filePath, 'utf-8')),
97
+ };
98
+ }
99
+ }
100
+ catch (err) {
101
+ return { ok: false, error: err instanceof Error ? err.message : String(err) };
102
+ }
103
+ return { ok: true, data: {} };
104
+ }
105
+ function writeHooksJson(filePath, data) {
106
+ ensureParentDir(filePath);
107
+ fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\n`, 'utf-8');
108
+ }
109
+ // ---------------------------------------------------------------------------
110
+ // Config merge
111
+ // ---------------------------------------------------------------------------
112
+ function rewriteHookDir(hooks, distributedDir) {
113
+ const result = {};
114
+ for (const [event, groups] of Object.entries(hooks)) {
115
+ result[event] = groups.map((group) => ({
116
+ ...group,
117
+ hooks: (group.hooks ?? []).map((handler) => {
118
+ if (typeof handler.command !== 'string')
119
+ return handler;
120
+ return {
121
+ ...handler,
122
+ command: preferHomeVar(handler.command
123
+ .replaceAll(HOOK_DIR_PLACEHOLDER, distributedDir)
124
+ .replaceAll(CLAUDE_PLUGIN_ROOT_HOOKS_PREFIX, distributedDir)
125
+ .replaceAll(CLAUDE_PLUGIN_ROOT_HOOKS_PREFIX_WINDOWS, distributedDir)),
126
+ };
127
+ }),
128
+ }));
129
+ }
130
+ return result;
131
+ }
132
+ function mergeHooksIntoFile(fileData, filteredEntries, scope) {
133
+ const existingHooks = (fileData.hooks ?? {});
134
+ // Remove previously ASB-managed matcher groups
135
+ const cleanedHooks = {};
136
+ for (const [event, groups] of Object.entries(existingHooks)) {
137
+ const kept = groups.filter((g) => g._asb_source !== true);
138
+ if (kept.length > 0)
139
+ cleanedHooks[event] = kept;
140
+ }
141
+ // Merge filtered entries
142
+ for (const { entry, hooks } of filteredEntries) {
143
+ const resolvedHooks = entry.isBundle
144
+ ? rewriteHookDir(hooks, resolveHookBundleTargetDir(entry, scope))
145
+ : hooks;
146
+ for (const [event, groups] of Object.entries(resolvedHooks)) {
147
+ if (!cleanedHooks[event])
148
+ cleanedHooks[event] = [];
149
+ for (const group of groups) {
150
+ cleanedHooks[event].push({ ...group, _asb_source: true });
151
+ }
152
+ }
153
+ }
154
+ fileData.hooks = cleanedHooks;
155
+ fileData[ASB_MANAGED_KEY] = filteredEntries.map((f) => f.entry.id);
156
+ }
157
+ // ---------------------------------------------------------------------------
158
+ // Orphan cleanup for bundles
159
+ // ---------------------------------------------------------------------------
160
+ function cleanOrphanBundleDirs(activeIds, scope, dryRun) {
161
+ const parentDir = resolveHooksBundleParentDir(scope);
162
+ const results = [];
163
+ if (!fs.existsSync(parentDir))
164
+ return results;
165
+ try {
166
+ const entries = fs.readdirSync(parentDir, { withFileTypes: true });
167
+ for (const entry of entries) {
168
+ if (!entry.isDirectory())
169
+ continue;
170
+ if (activeIds.has(entry.name))
171
+ continue;
172
+ const dirPath = path.join(parentDir, entry.name);
173
+ try {
174
+ if (!dryRun)
175
+ rmDirRecursive(dirPath);
176
+ results.push({
177
+ platform: 'codex',
178
+ targetDir: dirPath,
179
+ status: 'deleted',
180
+ reason: 'orphan',
181
+ entryId: entry.name,
182
+ });
183
+ }
184
+ catch (error) {
185
+ const msg = error instanceof Error ? error.message : String(error);
186
+ results.push({
187
+ platform: 'codex',
188
+ targetDir: dirPath,
189
+ status: 'error',
190
+ error: `Failed to delete orphan: ${msg}`,
191
+ entryId: entry.name,
192
+ });
193
+ }
194
+ }
195
+ }
196
+ catch {
197
+ // Ignore directory read errors
198
+ }
199
+ return results;
200
+ }
201
+ // ---------------------------------------------------------------------------
202
+ // Codex prerequisites: feature flag + project trust
203
+ // ---------------------------------------------------------------------------
204
+ function ensureCodexHooksFeature(results) {
205
+ const configPath = getCodexConfigPath();
206
+ if (!fs.existsSync(configPath))
207
+ return;
208
+ const content = fs.readFileSync(configPath, 'utf-8');
209
+ if (content.includes('codex_hooks') && content.includes('true'))
210
+ return;
211
+ // Feature not explicitly enabled - add warning result
212
+ results.push({
213
+ platform: 'codex',
214
+ filePath: configPath,
215
+ status: 'written',
216
+ reason: 'codex_hooks feature flag may not be enabled in config.toml',
217
+ });
218
+ }
219
+ function ensureProjectTrust(projectRoot, results) {
220
+ const globalPath = getCodexConfigPath();
221
+ const globalContent = fs.existsSync(globalPath) ? fs.readFileSync(globalPath, 'utf-8') : '';
222
+ const trustResult = ensureTrustEntry(globalContent, projectRoot);
223
+ if (trustResult.warning) {
224
+ results.push({
225
+ platform: 'codex',
226
+ filePath: globalPath,
227
+ status: 'skipped',
228
+ reason: trustResult.warning,
229
+ });
230
+ }
231
+ if (trustResult.changed) {
232
+ ensureParentDir(globalPath);
233
+ fs.writeFileSync(globalPath, trustResult.content, 'utf-8');
234
+ results.push({
235
+ platform: 'codex',
236
+ filePath: globalPath,
237
+ status: 'written',
238
+ reason: 'added project trust entry',
239
+ });
240
+ }
241
+ }
242
+ export function distributeCodexHooks(options) {
243
+ const { scope, selected, dryRun = false, projectMode } = options;
244
+ if (scope?.project && projectMode === 'none') {
245
+ return { results: [] };
246
+ }
247
+ const results = [];
248
+ // Ensure Codex hooks feature flag is enabled
249
+ if (!dryRun) {
250
+ ensureCodexHooksFeature(results);
251
+ }
252
+ // Ensure project trust for project-scoped distribution
253
+ if (!dryRun && scope?.project) {
254
+ ensureProjectTrust(scope.project, results);
255
+ }
256
+ // Filter entries for Codex compatibility
257
+ const filteredEntries = filterForCodex(selected);
258
+ // Pre-validate hooks.json before making any filesystem changes
259
+ const hooksJsonPath = resolveHooksJsonPath(scope);
260
+ const fileResult = readHooksJson(hooksJsonPath);
261
+ if (!fileResult.ok) {
262
+ results.push({
263
+ platform: 'codex',
264
+ filePath: hooksJsonPath,
265
+ status: 'error',
266
+ error: `Cannot read hooks.json, aborting merge: ${fileResult.error}`,
267
+ });
268
+ return { results };
269
+ }
270
+ const fileData = fileResult.data;
271
+ // Validate hooks field shape: must be a Record<string, array> or absent
272
+ if (fileData.hooks !== undefined) {
273
+ if (typeof fileData.hooks !== 'object' ||
274
+ fileData.hooks === null ||
275
+ Array.isArray(fileData.hooks)) {
276
+ results.push({
277
+ platform: 'codex',
278
+ filePath: hooksJsonPath,
279
+ status: 'error',
280
+ error: 'hooks.json has invalid shape: "hooks" must be an object',
281
+ });
282
+ return { results };
283
+ }
284
+ for (const [event, groups] of Object.entries(fileData.hooks)) {
285
+ if (!Array.isArray(groups)) {
286
+ results.push({
287
+ platform: 'codex',
288
+ filePath: hooksJsonPath,
289
+ status: 'error',
290
+ error: `hooks.json has invalid shape: "hooks.${event}" must be an array`,
291
+ });
292
+ return { results };
293
+ }
294
+ }
295
+ }
296
+ // Phase 1: Copy bundle files (only after validation passes)
297
+ const bundleEntries = filteredEntries.filter((f) => f.entry.isBundle).map((f) => f.entry);
298
+ if (bundleEntries.length > 0) {
299
+ const bundleOutcome = distributeBundle({
300
+ section: 'hooks',
301
+ selected: bundleEntries,
302
+ platforms: ['codex'],
303
+ resolveTargetDir: (_p, entry) => resolveHookBundleTargetDir(entry, scope),
304
+ listFiles: listHookBundleFiles,
305
+ getId: (entry) => entry.id,
306
+ scope,
307
+ dryRun,
308
+ });
309
+ results.push(...bundleOutcome.results);
310
+ }
311
+ // Clean up orphan bundle directories
312
+ const activeBundleIds = new Set(bundleEntries.map((e) => e.id));
313
+ results.push(...cleanOrphanBundleDirs(activeBundleIds, scope, dryRun));
314
+ // Phase 2: Merge hook configs into hooks.json
315
+ const previouslyManaged = (fileData[ASB_MANAGED_KEY] ?? []);
316
+ // Check for existing ASB groups
317
+ const existingHooks = (fileData.hooks ?? {});
318
+ const hasAsbGroups = Object.values(existingHooks).some((groups) => groups.some((g) => g._asb_source === true));
319
+ if (filteredEntries.length === 0 && previouslyManaged.length === 0 && !hasAsbGroups) {
320
+ return { results };
321
+ }
322
+ const before = JSON.stringify(fileData);
323
+ mergeHooksIntoFile(fileData, filteredEntries, scope);
324
+ // Clean up empty state: if no hooks remain, remove the file entirely
325
+ const mergedHooks = fileData.hooks;
326
+ const totalGroups = Object.values(mergedHooks).reduce((sum, groups) => sum + groups.length, 0);
327
+ const hasNoHooks = totalGroups === 0;
328
+ if (hasNoHooks && filteredEntries.length === 0) {
329
+ // Remove ASB tracking keys
330
+ delete fileData[ASB_MANAGED_KEY];
331
+ // If file has only hooks (now empty) and ASB keys, consider deleting
332
+ const remainingKeys = Object.keys(fileData).filter((k) => k !== 'hooks');
333
+ if (remainingKeys.length === 0 && fs.existsSync(hooksJsonPath) && !dryRun) {
334
+ fs.unlinkSync(hooksJsonPath);
335
+ results.push({
336
+ platform: 'codex',
337
+ filePath: hooksJsonPath,
338
+ status: 'deleted',
339
+ reason: 'no hooks remain',
340
+ });
341
+ return { results };
342
+ }
343
+ }
344
+ const after = JSON.stringify(fileData);
345
+ if (before === after) {
346
+ results.push({
347
+ platform: 'codex',
348
+ filePath: hooksJsonPath,
349
+ status: 'skipped',
350
+ reason: 'up-to-date',
351
+ });
352
+ }
353
+ else if (dryRun) {
354
+ const reason = filteredEntries.length === 0 ? 'hooks cleared' : `${filteredEntries.length} hook(s) merged`;
355
+ results.push({ platform: 'codex', filePath: hooksJsonPath, status: 'written', reason });
356
+ }
357
+ else {
358
+ try {
359
+ writeHooksJson(hooksJsonPath, fileData);
360
+ const reason = filteredEntries.length === 0 ? 'hooks cleared' : `${filteredEntries.length} hook(s) merged`;
361
+ results.push({ platform: 'codex', filePath: hooksJsonPath, status: 'written', reason });
362
+ }
363
+ catch (error) {
364
+ const msg = error instanceof Error ? error.message : String(error);
365
+ results.push({ platform: 'codex', filePath: hooksJsonPath, status: 'error', error: msg });
366
+ }
367
+ }
368
+ return { results };
369
+ }
370
+ //# sourceMappingURL=codex-distribute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-distribute.js","sourceRoot":"","sources":["../../src/hooks/codex-distribute.ts"],"names":[],"mappings":"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"}
@@ -14,14 +14,14 @@
14
14
  import type { ConfigScope } from '../config/scope.js';
15
15
  import type { DistributionResult } from '../library/distribute.js';
16
16
  import type { BundleDistributionResult } from '../library/distribute-bundle.js';
17
- export type HookPlatform = 'claude-code';
17
+ export type HookPlatform = 'claude-code' | 'codex';
18
18
  export interface HookDistributionOutcome {
19
19
  results: Array<DistributionResult<HookPlatform> | BundleDistributionResult<HookPlatform>>;
20
20
  }
21
21
  /**
22
- * Distribute hooks to Claude Code:
22
+ * Distribute hooks to active targets (Claude Code, Codex, etc.):
23
23
  * 1. Copy bundle files for bundle-type hooks
24
- * 2. Merge all active hook configs into settings.json
24
+ * 2. Merge all active hook configs into each target's config
25
25
  * 3. Clean up orphan bundle directories
26
26
  */
27
27
  export declare function distributeHooks(scope?: ConfigScope, activeAppIds?: string[], assumeInstalled?: ReadonlySet<string>, options?: {