@varveai/adit-hooks 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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"}
@@ -0,0 +1,216 @@
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 { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ const HOOK_MAPPINGS = [
10
+ { platformEvent: "SessionStart", aditHandler: "session-start" },
11
+ { platformEvent: "BeforeAgent", aditHandler: "prompt-submit" },
12
+ { platformEvent: "AfterAgent", aditHandler: "stop" },
13
+ { platformEvent: "SessionEnd", aditHandler: "session-end" },
14
+ { platformEvent: "AfterTool", aditHandler: "notification" },
15
+ { platformEvent: "Notification", aditHandler: "notification" },
16
+ ];
17
+ /** Map Gemini CLI platform events to ADIT hook types (derived from HOOK_MAPPINGS) */
18
+ const PLATFORM_TO_ADIT = Object.fromEntries(HOOK_MAPPINGS.map((m) => [m.platformEvent, m.aditHandler]));
19
+ /** Check if a command string is an ADIT hook (matches both npx and resolved-path formats) */
20
+ function isAditHookCommand(command) {
21
+ return command.includes("adit-hook") || command.includes("hooks/dist/index.js");
22
+ }
23
+ export const geminiAdapter = {
24
+ platform: "gemini",
25
+ displayName: "Gemini CLI",
26
+ hookMappings: HOOK_MAPPINGS,
27
+ parseInput(raw, hookType) {
28
+ const aditHookType = PLATFORM_TO_ADIT[hookType] ?? hookType;
29
+ const cwd = raw.cwd ?? process.cwd();
30
+ return {
31
+ cwd,
32
+ hookType: aditHookType,
33
+ platformCli: "gemini",
34
+ platformSessionId: raw.session_id,
35
+ transcriptPath: raw.transcript_path,
36
+ // Prompt
37
+ prompt: raw.prompt,
38
+ // Tool use
39
+ toolName: raw.tool_name,
40
+ toolInput: raw.tool_input,
41
+ toolOutput: raw.tool_response,
42
+ // Stop
43
+ stopReason: raw.stop_reason,
44
+ lastAssistantMessage: raw.prompt_response,
45
+ stopHookActive: raw.stop_hook_active,
46
+ // Notification
47
+ notificationMessage: raw.message,
48
+ notificationTitle: raw.title,
49
+ notificationType: raw.notification_type,
50
+ // Session lifecycle
51
+ sessionSource: raw.source,
52
+ sessionEndReason: raw.reason,
53
+ // Common metadata
54
+ permissionMode: raw.permission_mode,
55
+ model: raw.model,
56
+ rawPlatformData: raw,
57
+ };
58
+ },
59
+ generateHookConfig(aditBinaryPath) {
60
+ const makeHookEntry = (command) => [
61
+ { hooks: [{ type: "command", command: `CLAUDE_CODE= GEMINI=1 ${command}`, timeout: 5000 }] },
62
+ ];
63
+ return {
64
+ configPath: ".gemini/settings.json",
65
+ content: {
66
+ hooks: {
67
+ SessionStart: makeHookEntry(`${aditBinaryPath} session-start`),
68
+ BeforeAgent: makeHookEntry(`${aditBinaryPath} prompt-submit`),
69
+ AfterAgent: makeHookEntry(`${aditBinaryPath} stop`),
70
+ SessionEnd: makeHookEntry(`${aditBinaryPath} session-end`),
71
+ AfterTool: makeHookEntry(`${aditBinaryPath} notification`),
72
+ Notification: makeHookEntry(`${aditBinaryPath} notification`),
73
+ },
74
+ },
75
+ };
76
+ },
77
+ async validateInstallation(projectRoot) {
78
+ const checks = [];
79
+ // Check .gemini directory exists
80
+ const geminiDir = join(projectRoot, ".gemini");
81
+ const geminiDirExists = existsSync(geminiDir);
82
+ checks.push({
83
+ name: ".gemini directory",
84
+ ok: geminiDirExists,
85
+ detail: geminiDirExists ? geminiDir : "Not found",
86
+ });
87
+ // Check settings file for hook configuration
88
+ const settingsPath = join(projectRoot, ".gemini", "settings.json");
89
+ let hooksFound = false;
90
+ let hooksDetail = "No hook configuration found";
91
+ const requiredHooks = HOOK_MAPPINGS.map((m) => m.platformEvent);
92
+ const missingHooks = [];
93
+ if (existsSync(settingsPath)) {
94
+ try {
95
+ const settings = JSON.parse(readFileSync(settingsPath, "utf-8"));
96
+ if (!settings.hooks) {
97
+ hooksDetail = "No hooks section in settings.json";
98
+ }
99
+ else {
100
+ for (const hookName of requiredHooks) {
101
+ const entries = settings.hooks[hookName];
102
+ if (!Array.isArray(entries)) {
103
+ missingHooks.push(hookName);
104
+ continue;
105
+ }
106
+ const hasAdit = entries.some((entry) => {
107
+ if (typeof entry.command === "string" && isAditHookCommand(entry.command))
108
+ return true;
109
+ if (Array.isArray(entry.hooks)) {
110
+ return entry.hooks.some((h) => typeof h.command === "string" && isAditHookCommand(h.command));
111
+ }
112
+ return false;
113
+ });
114
+ if (!hasAdit)
115
+ missingHooks.push(hookName);
116
+ }
117
+ hooksFound = missingHooks.length === 0;
118
+ hooksDetail = hooksFound
119
+ ? `All hooks registered in ${settingsPath}`
120
+ : `Missing hooks: ${missingHooks.join(", ")}`;
121
+ }
122
+ }
123
+ catch {
124
+ hooksDetail = `Failed to parse ${settingsPath}`;
125
+ }
126
+ }
127
+ checks.push({
128
+ name: "Hook configuration",
129
+ ok: hooksFound,
130
+ detail: hooksDetail,
131
+ });
132
+ return {
133
+ valid: checks.every((c) => c.ok),
134
+ checks,
135
+ };
136
+ },
137
+ async installHooks(projectRoot, aditBinaryPath) {
138
+ const geminiDir = join(projectRoot, ".gemini");
139
+ if (!existsSync(geminiDir)) {
140
+ mkdirSync(geminiDir, { recursive: true });
141
+ }
142
+ const settingsPath = join(geminiDir, "settings.json");
143
+ let settings = {};
144
+ if (existsSync(settingsPath)) {
145
+ try {
146
+ settings = JSON.parse(readFileSync(settingsPath, "utf-8"));
147
+ }
148
+ catch {
149
+ // Start fresh if settings are invalid
150
+ }
151
+ }
152
+ const hookConfig = this.generateHookConfig(aditBinaryPath);
153
+ const existingHooks = settings.hooks ?? {};
154
+ const newHooks = hookConfig.content.hooks;
155
+ // Merge hook entries per event key: preserve other tools' hooks,
156
+ // remove stale ADIT entries, then append new ADIT entries.
157
+ const mergedHooks = { ...existingHooks };
158
+ for (const [eventKey, aditEntries] of Object.entries(newHooks)) {
159
+ const existing = Array.isArray(mergedHooks[eventKey]) ? mergedHooks[eventKey] : [];
160
+ // Remove stale ADIT entries (same logic as uninstallHooks)
161
+ const nonAditEntries = existing.filter((raw) => {
162
+ const entry = raw;
163
+ if (typeof entry.command === "string" && isAditHookCommand(entry.command))
164
+ return false;
165
+ if (Array.isArray(entry.hooks)) {
166
+ return !entry.hooks.some((h) => typeof h.command === "string" && isAditHookCommand(h.command));
167
+ }
168
+ return true;
169
+ });
170
+ // Append new ADIT entries after other tools' hooks
171
+ mergedHooks[eventKey] = [...nonAditEntries, ...aditEntries];
172
+ }
173
+ settings.hooks = mergedHooks;
174
+ writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + "\n");
175
+ },
176
+ getResumeCommand(_projectRoot) {
177
+ return "gemini";
178
+ },
179
+ async uninstallHooks(projectRoot) {
180
+ const settingsPath = join(projectRoot, ".gemini", "settings.json");
181
+ if (!existsSync(settingsPath))
182
+ return;
183
+ try {
184
+ const settings = JSON.parse(readFileSync(settingsPath, "utf-8"));
185
+ if (!settings.hooks)
186
+ return;
187
+ // Remove ADIT hook entries
188
+ for (const hookName of Object.keys(settings.hooks)) {
189
+ const entries = settings.hooks[hookName];
190
+ if (!Array.isArray(entries))
191
+ continue;
192
+ settings.hooks[hookName] = entries.filter((entry) => {
193
+ if (typeof entry.command === "string" && isAditHookCommand(entry.command))
194
+ return false;
195
+ if (Array.isArray(entry.hooks)) {
196
+ return !entry.hooks.some((h) => typeof h.command === "string" && isAditHookCommand(h.command));
197
+ }
198
+ return true;
199
+ });
200
+ // Clean up empty arrays
201
+ if (settings.hooks[hookName].length === 0) {
202
+ delete settings.hooks[hookName];
203
+ }
204
+ }
205
+ // Clean up empty hooks object
206
+ if (Object.keys(settings.hooks).length === 0) {
207
+ delete settings.hooks;
208
+ }
209
+ writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + "\n");
210
+ }
211
+ catch {
212
+ // Ignore parse errors
213
+ }
214
+ },
215
+ };
216
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/adapters/gemini.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,11 @@ export type { PlatformAdapter, HookMapping, NormalizedHookInput, PlatformHookCon
2
2
  export { claudeCodeAdapter } from "./claude-code.js";
3
3
  export { claudeVscodeAdapter } from "./claude-vscode.js";
4
4
  export { opencodeAdapter } from "./opencode.js";
5
- export { createStubAdapter, cursorAdapter, copilotAdapter, codexAdapter, otherAdapter } from "./stub.js";
6
- export { getAdapter, listAdapters, registerAdapter, detectPlatform, detectPlatforms } from "./registry.js";
5
+ export { createStubAdapter, copilotAdapter, otherAdapter } from "./stub.js";
6
+ export { cursorAdapter } from "./cursor.js";
7
+ export { codexAdapter } from "./codex.js";
8
+ export { geminiAdapter } from "./gemini.js";
9
+ export { getAdapter, listAdapters, registerAdapter, detectPlatform, detectPlatformFromPayload, detectPlatforms } from "./registry.js";
7
10
  /**
8
11
  * Resolve the absolute path to the adit-hook binary for reliable invocation.
9
12
  * Navigates from this module's location to the entry point (dist/index.js),
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,eAAe,EACf,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzG,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE3G;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAc9C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,eAAe,EACf,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEtI;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAc9C"}
@@ -4,8 +4,11 @@ import { existsSync } from "node:fs";
4
4
  export { claudeCodeAdapter } from "./claude-code.js";
5
5
  export { claudeVscodeAdapter } from "./claude-vscode.js";
6
6
  export { opencodeAdapter } from "./opencode.js";
7
- export { createStubAdapter, cursorAdapter, copilotAdapter, codexAdapter, otherAdapter } from "./stub.js";
8
- export { getAdapter, listAdapters, registerAdapter, detectPlatform, detectPlatforms } from "./registry.js";
7
+ export { createStubAdapter, copilotAdapter, otherAdapter } from "./stub.js";
8
+ export { cursorAdapter } from "./cursor.js";
9
+ export { codexAdapter } from "./codex.js";
10
+ export { geminiAdapter } from "./gemini.js";
11
+ export { getAdapter, listAdapters, registerAdapter, detectPlatform, detectPlatformFromPayload, detectPlatforms } from "./registry.js";
9
12
  /**
10
13
  * Resolve the absolute path to the adit-hook binary for reliable invocation.
11
14
  * Navigates from this module's location to the entry point (dist/index.js),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAYrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzG,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE3G;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,IAAI,CAAC;QACH,sEAAsE;QACtE,qEAAqE;QACrE,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,OAAO,SAAS,UAAU,GAAG,CAAC;QAChC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kBAAkB;IACpB,CAAC;IACD,kEAAkE;IAClE,OAAO,WAAW,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAYrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEtI;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,IAAI,CAAC;QACH,sEAAsE;QACtE,qEAAqE;QACrE,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,OAAO,SAAS,UAAU,GAAG,CAAC;QAChC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kBAAkB;IACpB,CAAC;IACD,kEAAkE;IAClE,OAAO,WAAW,CAAC;AACrB,CAAC"}