@varveai/adit-hooks 0.3.0 → 0.3.1

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.
@@ -0,0 +1,16 @@
1
+ /**
2
+ * OpenAI Codex platform adapter.
3
+ *
4
+ * Maps Codex's hook events to ADIT's internal model.
5
+ * Supports all Codex clients: CLI, desktop App, and IDE Extension.
6
+ * All clients share the same hooks.json format and event schema.
7
+ * Handles installation into .codex/hooks.json.
8
+ *
9
+ * Key differences from Claude Code:
10
+ * - Timeout is in **seconds** (not milliseconds)
11
+ * - SessionStart uses matcher "startup|resume"
12
+ * - PostToolUse uses matcher "Bash"
13
+ */
14
+ import type { PlatformAdapter } from "./types.js";
15
+ export declare const codexAdapter: PlatformAdapter;
16
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EACV,eAAe,EAMhB,MAAM,YAAY,CAAC;AAsBpB,eAAO,MAAM,YAAY,EAAE,eAqN1B,CAAC"}
@@ -0,0 +1,220 @@
1
+ /**
2
+ * OpenAI Codex platform adapter.
3
+ *
4
+ * Maps Codex's hook events to ADIT's internal model.
5
+ * Supports all Codex clients: CLI, desktop App, and IDE Extension.
6
+ * All clients share the same hooks.json format and event schema.
7
+ * Handles installation into .codex/hooks.json.
8
+ *
9
+ * Key differences from Claude Code:
10
+ * - Timeout is in **seconds** (not milliseconds)
11
+ * - SessionStart uses matcher "startup|resume"
12
+ * - PostToolUse uses matcher "Bash"
13
+ */
14
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
15
+ import { join } from "node:path";
16
+ /** Timeout for Codex hooks — in SECONDS (not ms like Claude Code) */
17
+ const HOOK_TIMEOUT = 30;
18
+ const HOOK_MAPPINGS = [
19
+ { platformEvent: "SessionStart", aditHandler: "session-start", matcher: "startup|resume" },
20
+ { platformEvent: "UserPromptSubmit", aditHandler: "prompt-submit" },
21
+ { platformEvent: "Stop", aditHandler: "stop" },
22
+ { platformEvent: "PostToolUse", aditHandler: "notification", matcher: "Bash" },
23
+ ];
24
+ /** Map Codex CLI platform events to ADIT hook types (derived from HOOK_MAPPINGS) */
25
+ const PLATFORM_TO_ADIT = Object.fromEntries(HOOK_MAPPINGS.map((m) => [m.platformEvent, m.aditHandler]));
26
+ /** Check if a command string is an ADIT hook (matches both npx and resolved-path formats) */
27
+ function isAditHookCommand(command) {
28
+ return command.includes("adit-hook") || command.includes("hooks/dist/index.js");
29
+ }
30
+ export const codexAdapter = {
31
+ platform: "codex",
32
+ displayName: "Codex",
33
+ hookMappings: HOOK_MAPPINGS,
34
+ parseInput(raw, hookType) {
35
+ const aditHookType = PLATFORM_TO_ADIT[hookType] ?? hookType;
36
+ const cwd = raw.cwd ?? process.cwd();
37
+ return {
38
+ cwd,
39
+ hookType: aditHookType,
40
+ platformCli: "codex",
41
+ platformSessionId: raw.session_id,
42
+ transcriptPath: raw.transcript_path,
43
+ // Prompt
44
+ prompt: raw.prompt,
45
+ // Stop
46
+ stopReason: raw.stop_reason,
47
+ lastAssistantMessage: raw.last_assistant_message,
48
+ stopHookActive: raw.stop_hook_active,
49
+ // Tool use (from PostToolUse)
50
+ toolName: raw.tool_name,
51
+ toolInput: raw.tool_input,
52
+ toolOutput: raw.tool_response,
53
+ // Session lifecycle
54
+ sessionSource: raw.source,
55
+ sessionEndReason: raw.reason,
56
+ // Common metadata (present in all events)
57
+ permissionMode: raw.permission_mode,
58
+ model: raw.model,
59
+ rawPlatformData: raw,
60
+ };
61
+ },
62
+ generateHookConfig(aditBinaryPath) {
63
+ const makeHookEntry = (command) => [
64
+ { hooks: [{ type: "command", command: `CODEX=1 ${command}`, timeout: HOOK_TIMEOUT }] },
65
+ ];
66
+ const makeMatcherEntry = (matcher, command) => [
67
+ { matcher, hooks: [{ type: "command", command: `CODEX=1 ${command}`, timeout: HOOK_TIMEOUT }] },
68
+ ];
69
+ return {
70
+ configPath: ".codex/hooks.json",
71
+ content: {
72
+ hooks: {
73
+ SessionStart: makeMatcherEntry("startup|resume", `${aditBinaryPath} session-start`),
74
+ UserPromptSubmit: makeHookEntry(`${aditBinaryPath} prompt-submit`),
75
+ Stop: makeHookEntry(`${aditBinaryPath} stop`),
76
+ PostToolUse: makeMatcherEntry("Bash", `${aditBinaryPath} notification`),
77
+ },
78
+ },
79
+ };
80
+ },
81
+ async validateInstallation(projectRoot) {
82
+ const checks = [];
83
+ // Check .codex directory exists
84
+ const codexDir = join(projectRoot, ".codex");
85
+ const codexDirExists = existsSync(codexDir);
86
+ checks.push({
87
+ name: ".codex directory",
88
+ ok: codexDirExists,
89
+ detail: codexDirExists ? codexDir : "Not found",
90
+ });
91
+ // Check hooks file for hook configuration
92
+ const hooksPath = join(projectRoot, ".codex", "hooks.json");
93
+ let hooksFound = false;
94
+ let hooksDetail = "No hook configuration found";
95
+ const requiredHooks = HOOK_MAPPINGS.map((m) => m.platformEvent);
96
+ const missingHooks = [];
97
+ if (existsSync(hooksPath)) {
98
+ try {
99
+ const hooksConfig = JSON.parse(readFileSync(hooksPath, "utf-8"));
100
+ if (!hooksConfig.hooks) {
101
+ hooksDetail = "No hooks section found in hooks.json";
102
+ }
103
+ else {
104
+ for (const hookName of requiredHooks) {
105
+ const entries = hooksConfig.hooks[hookName];
106
+ if (!Array.isArray(entries)) {
107
+ missingHooks.push(hookName);
108
+ continue;
109
+ }
110
+ const hasAdit = entries.some((entry) => {
111
+ if (typeof entry.command === "string" && isAditHookCommand(entry.command))
112
+ return true;
113
+ if (Array.isArray(entry.hooks)) {
114
+ return entry.hooks.some((h) => typeof h.command === "string" && isAditHookCommand(h.command));
115
+ }
116
+ return false;
117
+ });
118
+ if (!hasAdit)
119
+ missingHooks.push(hookName);
120
+ }
121
+ hooksFound = missingHooks.length === 0;
122
+ hooksDetail = hooksFound
123
+ ? `All hooks registered in ${hooksPath}`
124
+ : `Missing hooks: ${missingHooks.join(", ")}`;
125
+ }
126
+ }
127
+ catch {
128
+ hooksDetail = `Failed to parse ${hooksPath}`;
129
+ }
130
+ }
131
+ checks.push({
132
+ name: "Hook configuration",
133
+ ok: hooksFound,
134
+ detail: hooksDetail,
135
+ });
136
+ return {
137
+ valid: checks.every((c) => c.ok),
138
+ checks,
139
+ };
140
+ },
141
+ async installHooks(projectRoot, aditBinaryPath) {
142
+ const codexDir = join(projectRoot, ".codex");
143
+ if (!existsSync(codexDir)) {
144
+ mkdirSync(codexDir, { recursive: true });
145
+ }
146
+ const hooksPath = join(codexDir, "hooks.json");
147
+ let hooksConfig = {};
148
+ if (existsSync(hooksPath)) {
149
+ try {
150
+ hooksConfig = JSON.parse(readFileSync(hooksPath, "utf-8"));
151
+ }
152
+ catch {
153
+ // Start fresh if hooks are invalid
154
+ }
155
+ }
156
+ const hookConfig = this.generateHookConfig(aditBinaryPath);
157
+ const existingHooks = hooksConfig.hooks ?? {};
158
+ const newHooks = hookConfig.content.hooks;
159
+ // Merge hook entries per event key: preserve other tools' hooks,
160
+ // remove stale ADIT entries, then append new ADIT entries.
161
+ const mergedHooks = { ...existingHooks };
162
+ for (const [eventKey, aditEntries] of Object.entries(newHooks)) {
163
+ const existing = Array.isArray(mergedHooks[eventKey]) ? mergedHooks[eventKey] : [];
164
+ // Remove stale ADIT entries (same logic as uninstallHooks)
165
+ const nonAditEntries = existing.filter((raw) => {
166
+ const entry = raw;
167
+ if (typeof entry.command === "string" && isAditHookCommand(entry.command))
168
+ return false;
169
+ if (Array.isArray(entry.hooks)) {
170
+ return !entry.hooks.some((h) => typeof h.command === "string" && isAditHookCommand(h.command));
171
+ }
172
+ return true;
173
+ });
174
+ // Append new ADIT entries after other tools' hooks
175
+ mergedHooks[eventKey] = [...nonAditEntries, ...aditEntries];
176
+ }
177
+ hooksConfig.hooks = mergedHooks;
178
+ writeFileSync(hooksPath, JSON.stringify(hooksConfig, null, 2) + "\n");
179
+ },
180
+ getResumeCommand(_projectRoot) {
181
+ return "codex --continue";
182
+ },
183
+ async uninstallHooks(projectRoot) {
184
+ const hooksPath = join(projectRoot, ".codex", "hooks.json");
185
+ if (!existsSync(hooksPath))
186
+ return;
187
+ try {
188
+ const hooksConfig = JSON.parse(readFileSync(hooksPath, "utf-8"));
189
+ if (!hooksConfig.hooks)
190
+ return;
191
+ // Remove ADIT hook entries
192
+ for (const hookName of Object.keys(hooksConfig.hooks)) {
193
+ const entries = hooksConfig.hooks[hookName];
194
+ if (!Array.isArray(entries))
195
+ continue;
196
+ hooksConfig.hooks[hookName] = entries.filter((entry) => {
197
+ if (typeof entry.command === "string" && isAditHookCommand(entry.command))
198
+ return false;
199
+ if (Array.isArray(entry.hooks)) {
200
+ return !entry.hooks.some((h) => typeof h.command === "string" && isAditHookCommand(h.command));
201
+ }
202
+ return true;
203
+ });
204
+ // Clean up empty arrays
205
+ if (hooksConfig.hooks[hookName].length === 0) {
206
+ delete hooksConfig.hooks[hookName];
207
+ }
208
+ }
209
+ // Clean up empty hooks object
210
+ if (Object.keys(hooksConfig.hooks).length === 0) {
211
+ delete hooksConfig.hooks;
212
+ }
213
+ writeFileSync(hooksPath, JSON.stringify(hooksConfig, null, 2) + "\n");
214
+ }
215
+ catch {
216
+ // Ignore parse errors
217
+ }
218
+ },
219
+ };
220
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Cursor IDE platform adapter.
3
+ *
4
+ * Maps Cursor's hook events to ADIT's internal model.
5
+ * Handles installation into .cursor/hooks.json.
6
+ */
7
+ import type { PlatformAdapter } from "./types.js";
8
+ /**
9
+ * Extract the last assistant message text from a Cursor transcript JSONL file.
10
+ *
11
+ * Cursor's stop event does not include the assistant's response text — only
12
+ * `status` and `transcript_path`. The actual response is in the JSONL transcript.
13
+ *
14
+ * Reads the tail of the file for efficiency, then scans backwards for the
15
+ * last `role: "assistant"` entry with text content.
16
+ */
17
+ export declare function extractLastAssistantMessage(transcriptPath: string): string | undefined;
18
+ export declare const cursorAdapter: PlatformAdapter;
19
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/adapters/cursor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,eAAe,EAMhB,MAAM,YAAY,CAAC;AAuCpB;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA0CtF;AAoBD,eAAO,MAAM,aAAa,EAAE,eA+P3B,CAAC"}
@@ -0,0 +1,330 @@
1
+ /**
2
+ * Cursor IDE platform adapter.
3
+ *
4
+ * Maps Cursor's hook events to ADIT's internal model.
5
+ * Handles installation into .cursor/hooks.json.
6
+ */
7
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, openSync, readSync, closeSync, statSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ /**
10
+ * Read the tail of a file (last N bytes) and split into lines.
11
+ * Returns lines in original order (oldest first).
12
+ */
13
+ function readTailLines(filePath, maxLines = 512) {
14
+ const CHUNK = 4096;
15
+ const stat = statSync(filePath);
16
+ const fileSize = stat.size;
17
+ if (fileSize === 0)
18
+ return [];
19
+ const fd = openSync(filePath, "r");
20
+ try {
21
+ const chunks = [];
22
+ let bytesRead = 0;
23
+ let lineCount = 0;
24
+ // Read backwards from end of file
25
+ let position = fileSize;
26
+ while (position > 0 && lineCount < maxLines) {
27
+ const readSize = Math.min(CHUNK, position);
28
+ position -= readSize;
29
+ const buf = Buffer.alloc(readSize);
30
+ readSync(fd, buf, 0, readSize, position);
31
+ chunks.unshift(buf);
32
+ bytesRead += readSize;
33
+ lineCount += buf.toString("utf8").split("\n").length - 1;
34
+ }
35
+ const content = Buffer.concat(chunks).toString("utf8");
36
+ const lines = content.split("\n").filter((l) => l.trim().length > 0);
37
+ // Keep only the last maxLines
38
+ return lines.slice(-maxLines);
39
+ }
40
+ finally {
41
+ closeSync(fd);
42
+ }
43
+ }
44
+ /**
45
+ * Extract the last assistant message text from a Cursor transcript JSONL file.
46
+ *
47
+ * Cursor's stop event does not include the assistant's response text — only
48
+ * `status` and `transcript_path`. The actual response is in the JSONL transcript.
49
+ *
50
+ * Reads the tail of the file for efficiency, then scans backwards for the
51
+ * last `role: "assistant"` entry with text content.
52
+ */
53
+ export function extractLastAssistantMessage(transcriptPath) {
54
+ try {
55
+ if (!existsSync(transcriptPath))
56
+ return undefined;
57
+ const findAssistantText = (lines) => {
58
+ for (let i = lines.length - 1; i >= 0; i--) {
59
+ try {
60
+ const entry = JSON.parse(lines[i]);
61
+ if (entry.role !== "assistant")
62
+ continue;
63
+ const content = entry.message?.content;
64
+ if (!Array.isArray(content))
65
+ continue;
66
+ const texts = content
67
+ .filter((c) => c.type === "text" && typeof c.text === "string")
68
+ .map((c) => c.text)
69
+ .filter((t) => t.trim().length > 0);
70
+ if (texts.length > 0)
71
+ return texts.join("\n");
72
+ }
73
+ catch {
74
+ // Skip malformed lines
75
+ }
76
+ }
77
+ return undefined;
78
+ };
79
+ // Fast path: parse a large tail window first.
80
+ const tailLines = readTailLines(transcriptPath, 512);
81
+ const fromTail = findAssistantText(tailLines);
82
+ if (fromTail)
83
+ return fromTail;
84
+ // Fallback: if tail window misses due to very noisy tool events,
85
+ // scan the full transcript to guarantee best-effort extraction.
86
+ const fullContent = readFileSync(transcriptPath, "utf-8");
87
+ const fullLines = fullContent.split("\n").filter((l) => l.trim().length > 0);
88
+ return findAssistantText(fullLines);
89
+ }
90
+ catch {
91
+ return undefined;
92
+ }
93
+ }
94
+ const HOOK_MAPPINGS = [
95
+ { platformEvent: "beforeSubmitPrompt", aditHandler: "prompt-submit" },
96
+ { platformEvent: "stop", aditHandler: "stop" },
97
+ { platformEvent: "sessionStart", aditHandler: "session-start" },
98
+ { platformEvent: "sessionEnd", aditHandler: "session-end" },
99
+ { platformEvent: "afterAgentResponse", aditHandler: "notification" },
100
+ ];
101
+ /** Map Cursor platform events to ADIT hook types (derived from HOOK_MAPPINGS) */
102
+ const PLATFORM_TO_ADIT = Object.fromEntries(HOOK_MAPPINGS.map((m) => [m.platformEvent, m.aditHandler]));
103
+ /** Check if a command string is an ADIT hook */
104
+ function isAditHookCommand(command) {
105
+ return command.includes("adit-hook") || command.includes("hooks/dist/index.js");
106
+ }
107
+ export const cursorAdapter = {
108
+ platform: "cursor",
109
+ displayName: "Cursor",
110
+ hookMappings: HOOK_MAPPINGS,
111
+ parseInput(raw, hookType) {
112
+ const aditHookType = PLATFORM_TO_ADIT[hookType] ?? hookType;
113
+ // Cursor sends workspace_roots as array; fall back to CURSOR_PROJECT_DIR env
114
+ const workspaceRoots = raw.workspace_roots;
115
+ const cwd = workspaceRoots?.[0]
116
+ ?? process.env.CURSOR_PROJECT_DIR
117
+ ?? process.cwd();
118
+ // Cursor sends conversation_id for most events, session_id for session lifecycle
119
+ const platformSessionId = raw.conversation_id
120
+ ?? raw.session_id
121
+ ?? undefined;
122
+ // transcript_path or env var CURSOR_TRANSCRIPT_PATH
123
+ const transcriptPath = raw.transcript_path
124
+ ?? process.env.CURSOR_TRANSCRIPT_PATH
125
+ ?? undefined;
126
+ return {
127
+ cwd,
128
+ hookType: aditHookType,
129
+ platformCli: "cursor",
130
+ platformSessionId,
131
+ transcriptPath,
132
+ // Prompt (from beforeSubmitPrompt)
133
+ prompt: raw.prompt,
134
+ // Model (common field)
135
+ model: raw.model,
136
+ // Stop (from stop event — Cursor sends status, not stop_reason;
137
+ // assistant message must be read from transcript JSONL)
138
+ stopReason: raw.status,
139
+ lastAssistantMessage: aditHookType === "stop" && transcriptPath
140
+ ? extractLastAssistantMessage(transcriptPath)
141
+ : undefined,
142
+ // Notification (from afterAgentResponse)
143
+ notificationMessage: raw.message,
144
+ notificationType: raw.notification_type,
145
+ // Session lifecycle
146
+ sessionSource: raw.composer_mode,
147
+ sessionEndReason: raw.reason,
148
+ rawPlatformData: raw,
149
+ };
150
+ },
151
+ generateHookConfig(aditBinaryPath) {
152
+ // Cursor uses flat format: { command, type, timeout }
153
+ // Timeout is in SECONDS (not milliseconds like Claude Code)
154
+ const makeHookEntry = (command) => [
155
+ { command: `CURSOR=1 ${command}`, type: "command", timeout: 10 },
156
+ ];
157
+ return {
158
+ configPath: ".cursor/hooks.json",
159
+ content: {
160
+ hooks: {
161
+ beforeSubmitPrompt: makeHookEntry(`${aditBinaryPath} prompt-submit`),
162
+ stop: makeHookEntry(`${aditBinaryPath} stop`),
163
+ sessionStart: makeHookEntry(`${aditBinaryPath} session-start`),
164
+ sessionEnd: makeHookEntry(`${aditBinaryPath} session-end`),
165
+ afterAgentResponse: makeHookEntry(`${aditBinaryPath} notification`),
166
+ },
167
+ },
168
+ };
169
+ },
170
+ async validateInstallation(projectRoot) {
171
+ const checks = [];
172
+ // Check .cursor directory exists
173
+ const cursorDir = join(projectRoot, ".cursor");
174
+ const cursorDirExists = existsSync(cursorDir);
175
+ checks.push({
176
+ name: ".cursor directory",
177
+ ok: cursorDirExists,
178
+ detail: cursorDirExists ? cursorDir : "Not found",
179
+ });
180
+ // Check hooks file for hook configuration
181
+ const hooksPath = join(projectRoot, ".cursor", "hooks.json");
182
+ let hooksFound = false;
183
+ let hooksDetail = "No hook configuration found";
184
+ const requiredHooks = HOOK_MAPPINGS.map((m) => m.platformEvent);
185
+ const missingHooks = [];
186
+ if (existsSync(hooksPath)) {
187
+ try {
188
+ const hooksConfig = JSON.parse(readFileSync(hooksPath, "utf-8"));
189
+ if (!hooksConfig.hooks) {
190
+ hooksDetail = "No hooks section found in hooks.json";
191
+ }
192
+ else {
193
+ for (const hookName of requiredHooks) {
194
+ const entries = hooksConfig.hooks[hookName];
195
+ if (!Array.isArray(entries)) {
196
+ missingHooks.push(hookName);
197
+ continue;
198
+ }
199
+ const hasAdit = entries.some((entry) => {
200
+ if (typeof entry.command === "string" && isAditHookCommand(entry.command))
201
+ return true;
202
+ if (Array.isArray(entry.hooks)) {
203
+ return entry.hooks.some((h) => typeof h.command === "string" && isAditHookCommand(h.command));
204
+ }
205
+ return false;
206
+ });
207
+ if (!hasAdit)
208
+ missingHooks.push(hookName);
209
+ }
210
+ hooksFound = missingHooks.length === 0;
211
+ hooksDetail = hooksFound
212
+ ? `All hooks registered in ${hooksPath}`
213
+ : `Missing hooks: ${missingHooks.join(", ")}`;
214
+ }
215
+ }
216
+ catch {
217
+ hooksDetail = `Failed to parse ${hooksPath}`;
218
+ }
219
+ }
220
+ checks.push({
221
+ name: "Hook configuration",
222
+ ok: hooksFound,
223
+ detail: hooksDetail,
224
+ });
225
+ return {
226
+ valid: checks.every((c) => c.ok),
227
+ checks,
228
+ };
229
+ },
230
+ async installHooks(projectRoot, aditBinaryPath) {
231
+ const cursorDir = join(projectRoot, ".cursor");
232
+ if (!existsSync(cursorDir)) {
233
+ mkdirSync(cursorDir, { recursive: true });
234
+ }
235
+ const hooksPath = join(cursorDir, "hooks.json");
236
+ let hooksConfig = {};
237
+ if (existsSync(hooksPath)) {
238
+ try {
239
+ hooksConfig = JSON.parse(readFileSync(hooksPath, "utf-8"));
240
+ }
241
+ catch {
242
+ // Start fresh if hooks are invalid
243
+ }
244
+ }
245
+ const hookConfig = this.generateHookConfig(aditBinaryPath);
246
+ const existingHooks = hooksConfig.hooks ?? {};
247
+ // Clean up legacy Claude Code format entries (from previous ADIT versions
248
+ // that used Claude Code event names: UserPromptSubmit, Stop, etc.)
249
+ const legacyEventKeys = ["UserPromptSubmit", "Stop", "SessionStart", "SessionEnd", "Notification"];
250
+ for (const legacyKey of legacyEventKeys) {
251
+ if (Array.isArray(existingHooks[legacyKey])) {
252
+ existingHooks[legacyKey] = existingHooks[legacyKey].filter((raw) => {
253
+ const entry = raw;
254
+ if (typeof entry.command === "string" && isAditHookCommand(entry.command))
255
+ return false;
256
+ if (Array.isArray(entry.hooks)) {
257
+ return !entry.hooks.some((h) => typeof h.command === "string" && isAditHookCommand(h.command));
258
+ }
259
+ return true;
260
+ });
261
+ if (existingHooks[legacyKey].length === 0) {
262
+ delete existingHooks[legacyKey];
263
+ }
264
+ }
265
+ }
266
+ const newHooks = hookConfig.content.hooks;
267
+ // Merge hook entries per event key: preserve other tools' hooks,
268
+ // remove stale ADIT entries, then append new ADIT entries.
269
+ const mergedHooks = { ...existingHooks };
270
+ for (const [eventKey, aditEntries] of Object.entries(newHooks)) {
271
+ const existing = Array.isArray(mergedHooks[eventKey]) ? mergedHooks[eventKey] : [];
272
+ // Remove stale ADIT entries (same logic as uninstallHooks)
273
+ const nonAditEntries = existing.filter((raw) => {
274
+ const entry = raw;
275
+ if (typeof entry.command === "string" && isAditHookCommand(entry.command))
276
+ return false;
277
+ if (Array.isArray(entry.hooks)) {
278
+ return !entry.hooks.some((h) => typeof h.command === "string" && isAditHookCommand(h.command));
279
+ }
280
+ return true;
281
+ });
282
+ // Append new ADIT entries after other tools' hooks
283
+ mergedHooks[eventKey] = [...nonAditEntries, ...aditEntries];
284
+ }
285
+ hooksConfig.hooks = mergedHooks;
286
+ writeFileSync(hooksPath, JSON.stringify(hooksConfig, null, 2) + "\n");
287
+ },
288
+ getResumeCommand(_projectRoot) {
289
+ return null;
290
+ },
291
+ async uninstallHooks(projectRoot) {
292
+ const hooksPath = join(projectRoot, ".cursor", "hooks.json");
293
+ if (!existsSync(hooksPath))
294
+ return;
295
+ try {
296
+ const hooksConfig = JSON.parse(readFileSync(hooksPath, "utf-8"));
297
+ if (!hooksConfig.hooks)
298
+ return;
299
+ // Also clean up legacy Claude Code format event keys
300
+ const allEventKeys = [...Object.keys(hooksConfig.hooks), "UserPromptSubmit", "Stop", "SessionStart", "SessionEnd", "Notification"];
301
+ // Remove ADIT hook entries
302
+ for (const hookName of allEventKeys) {
303
+ const entries = hooksConfig.hooks[hookName];
304
+ if (!Array.isArray(entries))
305
+ continue;
306
+ hooksConfig.hooks[hookName] = entries.filter((entry) => {
307
+ if (typeof entry.command === "string" && isAditHookCommand(entry.command))
308
+ return false;
309
+ if (Array.isArray(entry.hooks)) {
310
+ return !entry.hooks.some((h) => typeof h.command === "string" && isAditHookCommand(h.command));
311
+ }
312
+ return true;
313
+ });
314
+ // Clean up empty arrays
315
+ if (hooksConfig.hooks[hookName].length === 0) {
316
+ delete hooksConfig.hooks[hookName];
317
+ }
318
+ }
319
+ // Clean up empty hooks object
320
+ if (Object.keys(hooksConfig.hooks).length === 0) {
321
+ delete hooksConfig.hooks;
322
+ }
323
+ writeFileSync(hooksPath, JSON.stringify(hooksConfig, null, 2) + "\n");
324
+ }
325
+ catch {
326
+ // Ignore parse errors
327
+ }
328
+ },
329
+ };
330
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/adapters/cursor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Google Gemini CLI platform adapter.
3
+ *
4
+ * Maps Gemini CLI's hook events to ADIT's internal model.
5
+ * Handles installation into .gemini/settings.json.
6
+ */
7
+ import type { PlatformAdapter } from "./types.js";
8
+ export declare const geminiAdapter: PlatformAdapter;
9
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/adapters/gemini.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,eAAe,EAMhB,MAAM,YAAY,CAAC;AAqBpB,eAAO,MAAM,aAAa,EAAE,eAyN3B,CAAC"}