bashbros 0.1.2 → 0.1.4
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/README.md +727 -265
- package/dist/adapters-JAZGGNVP.js +9 -0
- package/dist/chunk-4XZ64P4V.js +47 -0
- package/dist/chunk-4XZ64P4V.js.map +1 -0
- package/dist/{chunk-XCZMQRSX.js → chunk-7OEWYFN3.js} +745 -541
- package/dist/chunk-7OEWYFN3.js.map +1 -0
- package/dist/{chunk-SQCP6IYB.js → chunk-CG6VEHJM.js} +3 -2
- package/dist/chunk-CG6VEHJM.js.map +1 -0
- package/dist/{chunk-DLP2O6PN.js → chunk-EMLEJVJZ.js} +102 -1
- package/dist/chunk-EMLEJVJZ.js.map +1 -0
- package/dist/chunk-IUUBCPMV.js +166 -0
- package/dist/chunk-IUUBCPMV.js.map +1 -0
- package/dist/chunk-J6ONXY6N.js +146 -0
- package/dist/chunk-J6ONXY6N.js.map +1 -0
- package/dist/chunk-KYDMPE4N.js +224 -0
- package/dist/chunk-KYDMPE4N.js.map +1 -0
- package/dist/chunk-LJE4EPIU.js +56 -0
- package/dist/chunk-LJE4EPIU.js.map +1 -0
- package/dist/chunk-LZYW7XQO.js +339 -0
- package/dist/chunk-LZYW7XQO.js.map +1 -0
- package/dist/{chunk-YUMNBQAY.js → chunk-RDNSS3ME.js} +587 -12
- package/dist/chunk-RDNSS3ME.js.map +1 -0
- package/dist/{chunk-BW6XCOJH.js → chunk-RTZ4QWG2.js} +2 -2
- package/dist/chunk-RTZ4QWG2.js.map +1 -0
- package/dist/chunk-SDN6TAGD.js +157 -0
- package/dist/chunk-SDN6TAGD.js.map +1 -0
- package/dist/chunk-T5ONCUHZ.js +198 -0
- package/dist/chunk-T5ONCUHZ.js.map +1 -0
- package/dist/cli.js +1182 -251
- package/dist/cli.js.map +1 -1
- package/dist/{config-JLLOTFLI.js → config-I5NCK3RJ.js} +2 -2
- package/dist/copilot-cli-5WJWK5YT.js +9 -0
- package/dist/{db-OBKEXRTP.js → db-ETWTBXAE.js} +2 -2
- package/dist/db-checks-2YOVECD4.js +133 -0
- package/dist/db-checks-2YOVECD4.js.map +1 -0
- package/dist/{display-6LZ2HBCU.js → display-UH7KEHOW.js} +3 -3
- package/dist/display-UH7KEHOW.js.map +1 -0
- package/dist/gemini-cli-3563EELZ.js +9 -0
- package/dist/gemini-cli-3563EELZ.js.map +1 -0
- package/dist/index.d.ts +195 -72
- package/dist/index.js +119 -398
- package/dist/index.js.map +1 -1
- package/dist/{ollama-HY35OHW4.js → ollama-5JVKNFOV.js} +2 -2
- package/dist/ollama-5JVKNFOV.js.map +1 -0
- package/dist/opencode-DRCY275R.js +9 -0
- package/dist/opencode-DRCY275R.js.map +1 -0
- package/dist/profiles-7CLN6TAT.js +9 -0
- package/dist/profiles-7CLN6TAT.js.map +1 -0
- package/dist/setup-YS27MOPE.js +124 -0
- package/dist/setup-YS27MOPE.js.map +1 -0
- package/dist/static/index.html +4815 -2007
- package/dist/store-WJ5Y7MOE.js +9 -0
- package/dist/store-WJ5Y7MOE.js.map +1 -0
- package/dist/writer-3NAVABN6.js +12 -0
- package/dist/writer-3NAVABN6.js.map +1 -0
- package/package.json +77 -68
- package/dist/chunk-BW6XCOJH.js.map +0 -1
- package/dist/chunk-DLP2O6PN.js.map +0 -1
- package/dist/chunk-SQCP6IYB.js.map +0 -1
- package/dist/chunk-XCZMQRSX.js.map +0 -1
- package/dist/chunk-YUMNBQAY.js.map +0 -1
- /package/dist/{config-JLLOTFLI.js.map → adapters-JAZGGNVP.js.map} +0 -0
- /package/dist/{db-OBKEXRTP.js.map → config-I5NCK3RJ.js.map} +0 -0
- /package/dist/{display-6LZ2HBCU.js.map → copilot-cli-5WJWK5YT.js.map} +0 -0
- /package/dist/{ollama-HY35OHW4.js.map → db-ETWTBXAE.js.map} +0 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/hooks/gemini-cli.ts
|
|
4
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
5
|
+
import { join } from "path";
|
|
6
|
+
import { execFileSync } from "child_process";
|
|
7
|
+
var GEMINI_DIR_NAME = ".gemini";
|
|
8
|
+
var GEMINI_SETTINGS_FILE = "settings.json";
|
|
9
|
+
var BASHBROS_HOOK_MARKER = "# bashbros-managed";
|
|
10
|
+
var GeminiCLIHooks = class {
|
|
11
|
+
/**
|
|
12
|
+
* Check if Gemini CLI is installed (project .gemini dir exists or gemini command on PATH)
|
|
13
|
+
*/
|
|
14
|
+
static isGeminiInstalled(projectDir) {
|
|
15
|
+
const dir = projectDir || process.cwd();
|
|
16
|
+
const geminiDir = join(dir, GEMINI_DIR_NAME);
|
|
17
|
+
if (existsSync(geminiDir)) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const cmd = process.platform === "win32" ? "where" : "which";
|
|
22
|
+
execFileSync(cmd, ["gemini"], { stdio: "pipe", timeout: 3e3 });
|
|
23
|
+
return true;
|
|
24
|
+
} catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Load current Gemini settings from project-scoped .gemini/settings.json
|
|
30
|
+
*/
|
|
31
|
+
static loadSettings(projectDir) {
|
|
32
|
+
const dir = projectDir || process.cwd();
|
|
33
|
+
const settingsPath = join(dir, GEMINI_DIR_NAME, GEMINI_SETTINGS_FILE);
|
|
34
|
+
if (!existsSync(settingsPath)) {
|
|
35
|
+
return {};
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const content = readFileSync(settingsPath, "utf-8");
|
|
39
|
+
return JSON.parse(content);
|
|
40
|
+
} catch {
|
|
41
|
+
return {};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Save Gemini settings to project-scoped .gemini/settings.json
|
|
46
|
+
*/
|
|
47
|
+
static saveSettings(settings, projectDir) {
|
|
48
|
+
const dir = projectDir || process.cwd();
|
|
49
|
+
const geminiDir = join(dir, GEMINI_DIR_NAME);
|
|
50
|
+
if (!existsSync(geminiDir)) {
|
|
51
|
+
mkdirSync(geminiDir, { recursive: true });
|
|
52
|
+
}
|
|
53
|
+
writeFileSync(
|
|
54
|
+
join(geminiDir, GEMINI_SETTINGS_FILE),
|
|
55
|
+
JSON.stringify(settings, null, 2),
|
|
56
|
+
"utf-8"
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Install BashBros hooks into Gemini CLI
|
|
61
|
+
*/
|
|
62
|
+
static install(projectDir) {
|
|
63
|
+
if (!this.isGeminiInstalled(projectDir)) {
|
|
64
|
+
return {
|
|
65
|
+
success: false,
|
|
66
|
+
message: "Gemini CLI not found. Install Gemini CLI or initialize a .gemini directory first."
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const settings = this.loadSettings(projectDir);
|
|
70
|
+
if (!settings.hooks) {
|
|
71
|
+
settings.hooks = {};
|
|
72
|
+
}
|
|
73
|
+
if (this.isInstalled(settings)) {
|
|
74
|
+
return {
|
|
75
|
+
success: true,
|
|
76
|
+
message: "BashBros hooks already installed."
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const beforeToolHook = {
|
|
80
|
+
matcher: "run_shell_command",
|
|
81
|
+
hooks: [{
|
|
82
|
+
name: "bashbros-gate",
|
|
83
|
+
type: "command",
|
|
84
|
+
command: `bashbros gemini-gate ${BASHBROS_HOOK_MARKER}`
|
|
85
|
+
}]
|
|
86
|
+
};
|
|
87
|
+
const afterToolHook = {
|
|
88
|
+
matcher: "run_shell_command",
|
|
89
|
+
hooks: [{
|
|
90
|
+
name: "bashbros-record",
|
|
91
|
+
type: "command",
|
|
92
|
+
command: `bashbros gemini-record ${BASHBROS_HOOK_MARKER}`
|
|
93
|
+
}]
|
|
94
|
+
};
|
|
95
|
+
const sessionEndHook = {
|
|
96
|
+
hooks: [{
|
|
97
|
+
name: "bashbros-session-end",
|
|
98
|
+
type: "command",
|
|
99
|
+
command: `bashbros session-end ${BASHBROS_HOOK_MARKER}`
|
|
100
|
+
}]
|
|
101
|
+
};
|
|
102
|
+
settings.hooks.BeforeTool = [
|
|
103
|
+
...settings.hooks.BeforeTool || [],
|
|
104
|
+
beforeToolHook
|
|
105
|
+
];
|
|
106
|
+
settings.hooks.AfterTool = [
|
|
107
|
+
...settings.hooks.AfterTool || [],
|
|
108
|
+
afterToolHook
|
|
109
|
+
];
|
|
110
|
+
settings.hooks.SessionEnd = [
|
|
111
|
+
...settings.hooks.SessionEnd || [],
|
|
112
|
+
sessionEndHook
|
|
113
|
+
];
|
|
114
|
+
this.saveSettings(settings, projectDir);
|
|
115
|
+
return {
|
|
116
|
+
success: true,
|
|
117
|
+
message: "BashBros hooks installed successfully."
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Uninstall BashBros hooks from Gemini CLI
|
|
122
|
+
*/
|
|
123
|
+
static uninstall(projectDir) {
|
|
124
|
+
if (!this.isGeminiInstalled(projectDir)) {
|
|
125
|
+
return {
|
|
126
|
+
success: false,
|
|
127
|
+
message: "Gemini CLI not found."
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
const settings = this.loadSettings(projectDir);
|
|
131
|
+
if (!settings.hooks) {
|
|
132
|
+
return {
|
|
133
|
+
success: true,
|
|
134
|
+
message: "No hooks to uninstall."
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
const filterToolHooks = (hooks) => {
|
|
138
|
+
if (!hooks) return [];
|
|
139
|
+
return hooks.filter(
|
|
140
|
+
(h) => !h.hooks.some((hook) => hook.command.includes(BASHBROS_HOOK_MARKER))
|
|
141
|
+
);
|
|
142
|
+
};
|
|
143
|
+
const filterSessionHooks = (hooks) => {
|
|
144
|
+
if (!hooks) return [];
|
|
145
|
+
return hooks.filter(
|
|
146
|
+
(h) => !h.hooks.some((hook) => hook.command.includes(BASHBROS_HOOK_MARKER))
|
|
147
|
+
);
|
|
148
|
+
};
|
|
149
|
+
settings.hooks.BeforeTool = filterToolHooks(settings.hooks.BeforeTool);
|
|
150
|
+
settings.hooks.AfterTool = filterToolHooks(settings.hooks.AfterTool);
|
|
151
|
+
settings.hooks.SessionEnd = filterSessionHooks(settings.hooks.SessionEnd);
|
|
152
|
+
if (settings.hooks.BeforeTool?.length === 0) delete settings.hooks.BeforeTool;
|
|
153
|
+
if (settings.hooks.AfterTool?.length === 0) delete settings.hooks.AfterTool;
|
|
154
|
+
if (settings.hooks.SessionEnd?.length === 0) delete settings.hooks.SessionEnd;
|
|
155
|
+
if (Object.keys(settings.hooks).length === 0) delete settings.hooks;
|
|
156
|
+
this.saveSettings(settings, projectDir);
|
|
157
|
+
return {
|
|
158
|
+
success: true,
|
|
159
|
+
message: "BashBros hooks uninstalled successfully."
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Check if BashBros hooks are installed
|
|
164
|
+
*/
|
|
165
|
+
static isInstalled(settings) {
|
|
166
|
+
const s = settings || this.loadSettings();
|
|
167
|
+
if (!s.hooks) return false;
|
|
168
|
+
const hasMarker = (hooks) => {
|
|
169
|
+
if (!hooks) return false;
|
|
170
|
+
return hooks.some(
|
|
171
|
+
(h) => h.hooks.some((hook) => hook.command.includes(BASHBROS_HOOK_MARKER))
|
|
172
|
+
);
|
|
173
|
+
};
|
|
174
|
+
return hasMarker(s.hooks.BeforeTool) || hasMarker(s.hooks.AfterTool) || hasMarker(s.hooks.SessionEnd);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get hook status
|
|
178
|
+
*/
|
|
179
|
+
static getStatus(projectDir) {
|
|
180
|
+
const geminiInstalled = this.isGeminiInstalled(projectDir);
|
|
181
|
+
const settings = geminiInstalled ? this.loadSettings(projectDir) : {};
|
|
182
|
+
const hooksInstalled = this.isInstalled(settings);
|
|
183
|
+
const hooks = [];
|
|
184
|
+
if (settings.hooks?.BeforeTool) hooks.push("BeforeTool (gate)");
|
|
185
|
+
if (settings.hooks?.AfterTool) hooks.push("AfterTool (record)");
|
|
186
|
+
if (settings.hooks?.SessionEnd) hooks.push("SessionEnd (report)");
|
|
187
|
+
return {
|
|
188
|
+
geminiInstalled,
|
|
189
|
+
hooksInstalled,
|
|
190
|
+
hooks
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
export {
|
|
196
|
+
GeminiCLIHooks
|
|
197
|
+
};
|
|
198
|
+
//# sourceMappingURL=chunk-T5ONCUHZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/gemini-cli.ts"],"sourcesContent":["/**\r\n * Gemini CLI Hook Integration\r\n * Seamlessly integrate BashBros with Gemini CLI\r\n */\r\n\r\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs'\r\nimport { join } from 'path'\r\nimport { execFileSync } from 'child_process'\r\n\r\nexport interface GeminiSettings {\r\n hooks?: {\r\n BeforeTool?: GeminiToolHookConfig[]\r\n AfterTool?: GeminiToolHookConfig[]\r\n SessionEnd?: GeminiSessionHookConfig[]\r\n }\r\n [key: string]: unknown\r\n}\r\n\r\ninterface GeminiHookEntry {\r\n name: string\r\n type: string\r\n command: string\r\n}\r\n\r\ninterface GeminiToolHookConfig {\r\n matcher?: string\r\n hooks: GeminiHookEntry[]\r\n}\r\n\r\ninterface GeminiSessionHookConfig {\r\n hooks: GeminiHookEntry[]\r\n}\r\n\r\nconst GEMINI_DIR_NAME = '.gemini'\r\nconst GEMINI_SETTINGS_FILE = 'settings.json'\r\nconst BASHBROS_HOOK_MARKER = '# bashbros-managed'\r\n\r\nexport class GeminiCLIHooks {\r\n /**\r\n * Check if Gemini CLI is installed (project .gemini dir exists or gemini command on PATH)\r\n */\r\n static isGeminiInstalled(projectDir?: string): boolean {\r\n const dir = projectDir || process.cwd()\r\n const geminiDir = join(dir, GEMINI_DIR_NAME)\r\n\r\n // Check for .gemini directory in project\r\n if (existsSync(geminiDir)) {\r\n return true\r\n }\r\n\r\n // Check for gemini command on PATH\r\n try {\r\n const cmd = process.platform === 'win32' ? 'where' : 'which'\r\n execFileSync(cmd, ['gemini'], { stdio: 'pipe', timeout: 3000 })\r\n return true\r\n } catch {\r\n return false\r\n }\r\n }\r\n\r\n /**\r\n * Load current Gemini settings from project-scoped .gemini/settings.json\r\n */\r\n static loadSettings(projectDir?: string): GeminiSettings {\r\n const dir = projectDir || process.cwd()\r\n const settingsPath = join(dir, GEMINI_DIR_NAME, GEMINI_SETTINGS_FILE)\r\n\r\n if (!existsSync(settingsPath)) {\r\n return {}\r\n }\r\n\r\n try {\r\n const content = readFileSync(settingsPath, 'utf-8')\r\n return JSON.parse(content)\r\n } catch {\r\n return {}\r\n }\r\n }\r\n\r\n /**\r\n * Save Gemini settings to project-scoped .gemini/settings.json\r\n */\r\n static saveSettings(settings: GeminiSettings, projectDir?: string): void {\r\n const dir = projectDir || process.cwd()\r\n const geminiDir = join(dir, GEMINI_DIR_NAME)\r\n\r\n if (!existsSync(geminiDir)) {\r\n mkdirSync(geminiDir, { recursive: true })\r\n }\r\n\r\n writeFileSync(\r\n join(geminiDir, GEMINI_SETTINGS_FILE),\r\n JSON.stringify(settings, null, 2),\r\n 'utf-8'\r\n )\r\n }\r\n\r\n /**\r\n * Install BashBros hooks into Gemini CLI\r\n */\r\n static install(projectDir?: string): { success: boolean; message: string } {\r\n if (!this.isGeminiInstalled(projectDir)) {\r\n return {\r\n success: false,\r\n message: 'Gemini CLI not found. Install Gemini CLI or initialize a .gemini directory first.'\r\n }\r\n }\r\n\r\n const settings = this.loadSettings(projectDir)\r\n\r\n // Initialize hooks if not present\r\n if (!settings.hooks) {\r\n settings.hooks = {}\r\n }\r\n\r\n // Check if already installed\r\n if (this.isInstalled(settings)) {\r\n return {\r\n success: true,\r\n message: 'BashBros hooks already installed.'\r\n }\r\n }\r\n\r\n // Add BeforeTool hook for shell commands\r\n const beforeToolHook: GeminiToolHookConfig = {\r\n matcher: 'run_shell_command',\r\n hooks: [{\r\n name: 'bashbros-gate',\r\n type: 'command',\r\n command: `bashbros gemini-gate ${BASHBROS_HOOK_MARKER}`\r\n }]\r\n }\r\n\r\n // Add AfterTool hook for recording\r\n const afterToolHook: GeminiToolHookConfig = {\r\n matcher: 'run_shell_command',\r\n hooks: [{\r\n name: 'bashbros-record',\r\n type: 'command',\r\n command: `bashbros gemini-record ${BASHBROS_HOOK_MARKER}`\r\n }]\r\n }\r\n\r\n // Add SessionEnd hook for reports\r\n const sessionEndHook: GeminiSessionHookConfig = {\r\n hooks: [{\r\n name: 'bashbros-session-end',\r\n type: 'command',\r\n command: `bashbros session-end ${BASHBROS_HOOK_MARKER}`\r\n }]\r\n }\r\n\r\n // Merge with existing hooks\r\n settings.hooks.BeforeTool = [\r\n ...(settings.hooks.BeforeTool || []),\r\n beforeToolHook\r\n ]\r\n\r\n settings.hooks.AfterTool = [\r\n ...(settings.hooks.AfterTool || []),\r\n afterToolHook\r\n ]\r\n\r\n settings.hooks.SessionEnd = [\r\n ...(settings.hooks.SessionEnd || []),\r\n sessionEndHook\r\n ]\r\n\r\n this.saveSettings(settings, projectDir)\r\n\r\n return {\r\n success: true,\r\n message: 'BashBros hooks installed successfully.'\r\n }\r\n }\r\n\r\n /**\r\n * Uninstall BashBros hooks from Gemini CLI\r\n */\r\n static uninstall(projectDir?: string): { success: boolean; message: string } {\r\n if (!this.isGeminiInstalled(projectDir)) {\r\n return {\r\n success: false,\r\n message: 'Gemini CLI not found.'\r\n }\r\n }\r\n\r\n const settings = this.loadSettings(projectDir)\r\n\r\n if (!settings.hooks) {\r\n return {\r\n success: true,\r\n message: 'No hooks to uninstall.'\r\n }\r\n }\r\n\r\n // Remove BashBros hooks by filtering entries containing the marker\r\n const filterToolHooks = (hooks: GeminiToolHookConfig[] | undefined): GeminiToolHookConfig[] => {\r\n if (!hooks) return []\r\n return hooks.filter(h =>\r\n !h.hooks.some(hook => hook.command.includes(BASHBROS_HOOK_MARKER))\r\n )\r\n }\r\n\r\n const filterSessionHooks = (hooks: GeminiSessionHookConfig[] | undefined): GeminiSessionHookConfig[] => {\r\n if (!hooks) return []\r\n return hooks.filter(h =>\r\n !h.hooks.some(hook => hook.command.includes(BASHBROS_HOOK_MARKER))\r\n )\r\n }\r\n\r\n settings.hooks.BeforeTool = filterToolHooks(settings.hooks.BeforeTool)\r\n settings.hooks.AfterTool = filterToolHooks(settings.hooks.AfterTool)\r\n settings.hooks.SessionEnd = filterSessionHooks(settings.hooks.SessionEnd)\r\n\r\n // Clean up empty arrays\r\n if (settings.hooks.BeforeTool?.length === 0) delete settings.hooks.BeforeTool\r\n if (settings.hooks.AfterTool?.length === 0) delete settings.hooks.AfterTool\r\n if (settings.hooks.SessionEnd?.length === 0) delete settings.hooks.SessionEnd\r\n if (Object.keys(settings.hooks).length === 0) delete settings.hooks\r\n\r\n this.saveSettings(settings, projectDir)\r\n\r\n return {\r\n success: true,\r\n message: 'BashBros hooks uninstalled successfully.'\r\n }\r\n }\r\n\r\n /**\r\n * Check if BashBros hooks are installed\r\n */\r\n static isInstalled(settings?: GeminiSettings): boolean {\r\n const s = settings || this.loadSettings()\r\n\r\n if (!s.hooks) return false\r\n\r\n const hasMarker = (hooks: (GeminiToolHookConfig | GeminiSessionHookConfig)[] | undefined): boolean => {\r\n if (!hooks) return false\r\n return hooks.some(h =>\r\n h.hooks.some(hook => hook.command.includes(BASHBROS_HOOK_MARKER))\r\n )\r\n }\r\n\r\n return hasMarker(s.hooks.BeforeTool) ||\r\n hasMarker(s.hooks.AfterTool) ||\r\n hasMarker(s.hooks.SessionEnd)\r\n }\r\n\r\n /**\r\n * Get hook status\r\n */\r\n static getStatus(projectDir?: string): {\r\n geminiInstalled: boolean\r\n hooksInstalled: boolean\r\n hooks: string[]\r\n } {\r\n const geminiInstalled = this.isGeminiInstalled(projectDir)\r\n const settings = geminiInstalled ? this.loadSettings(projectDir) : {}\r\n const hooksInstalled = this.isInstalled(settings)\r\n\r\n const hooks: string[] = []\r\n if (settings.hooks?.BeforeTool) hooks.push('BeforeTool (gate)')\r\n if (settings.hooks?.AfterTool) hooks.push('AfterTool (record)')\r\n if (settings.hooks?.SessionEnd) hooks.push('SessionEnd (report)')\r\n\r\n return {\r\n geminiInstalled,\r\n hooksInstalled,\r\n hooks\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
|