@agentplugins/adapter-gemini 0.1.0

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 ADDED
@@ -0,0 +1,46 @@
1
+ # @agentplugins/adapter-gemini
2
+
3
+ > AgentPlugins platform adapter for [Google Gemini CLI](https://ai.google.dev/gemini-cli/docs).
4
+
5
+ Compiles a universal `PluginManifest` into a Gemini CLI **extension**: `gemini-extension.json` manifest, hook wiring, and MCP server config. Inline handlers are wrapped as command scripts.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @agentplugins/adapter-gemini
11
+ ```
12
+
13
+ Typically installed transitively via [`@agentplugins/cli`](https://www.npmjs.com/package/@agentplugins/cli).
14
+
15
+ ## Usage
16
+
17
+ ```typescript
18
+ import { createGeminiAdapter } from '@agentplugins/adapter-gemini';
19
+
20
+ const adapter = createGeminiAdapter();
21
+ const output = await adapter.compile(manifest);
22
+ ```
23
+
24
+ Or via the CLI:
25
+
26
+ ```bash
27
+ npx agentplugins build --target gemini
28
+ ```
29
+
30
+ ## Output shape
31
+
32
+ A successful build writes to `dist/gemini/`:
33
+
34
+ ```
35
+ dist/gemini/
36
+ ├── gemini-extension.json
37
+ ├── hooks/
38
+ │ └── hooks.json
39
+ └── .mcp.json
40
+ ```
41
+
42
+ Install with: `gemini extensions install ./dist/gemini`
43
+
44
+ ## License
45
+
46
+ MIT
package/dist/index.cjs ADDED
@@ -0,0 +1,347 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ GeminiAdapter: () => GeminiAdapter,
24
+ createGeminiAdapter: () => createGeminiAdapter,
25
+ default: () => index_default,
26
+ geminiAdapter: () => geminiAdapter
27
+ });
28
+ module.exports = __toCommonJS(index_exports);
29
+ var import_core = require("@agentplugins/core");
30
+ var GEMINI_LIFECYCLE_EVENTS = [
31
+ "AfterAgent",
32
+ "AfterModel",
33
+ "AfterTool",
34
+ "BeforeAgent",
35
+ "BeforeModel",
36
+ "BeforeTool",
37
+ "BeforeToolSelection",
38
+ "Notification",
39
+ "PreCompress",
40
+ "SessionEnd",
41
+ "SessionStart"
42
+ ];
43
+ var UNIVERSAL_TO_GEMINI = {
44
+ sessionStart: "SessionStart",
45
+ preToolUse: "BeforeTool",
46
+ // BeforeTool can block (exit 2); BeforeToolSelection cannot
47
+ postToolUse: "AfterTool",
48
+ userPromptSubmit: "BeforeAgent",
49
+ subagentStart: "BeforeAgent",
50
+ // no direct equivalent — closest match
51
+ preCompact: "PreCompress",
52
+ sessionEnd: "SessionEnd",
53
+ notification: "Notification"
54
+ };
55
+ var UNSUPPORTED_HOOKS = [
56
+ "userPromptExpansion",
57
+ "permissionRequest",
58
+ "permissionDenied",
59
+ "postToolUseFailure",
60
+ "postCompact",
61
+ "stop",
62
+ "stopFailure",
63
+ "fileChanged",
64
+ "cwdChanged",
65
+ "setup"
66
+ ];
67
+ var KEBAB_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
68
+ var SEMVER_RE = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
69
+ function validateGeminiManifest(plugin) {
70
+ const issues = [];
71
+ if (!plugin.name) {
72
+ issues.push({
73
+ severity: import_core.Severity.ERROR,
74
+ message: "Gemini manifest requires 'name' (kebab-case)."
75
+ });
76
+ } else if (!KEBAB_RE.test(plugin.name)) {
77
+ issues.push({
78
+ severity: import_core.Severity.ERROR,
79
+ message: `Gemini extension name must be kebab-case (got "${plugin.name}").`
80
+ });
81
+ }
82
+ if (!plugin.version) {
83
+ issues.push({
84
+ severity: import_core.Severity.ERROR,
85
+ message: "Gemini manifest requires 'version' (SemVer)."
86
+ });
87
+ } else if (!SEMVER_RE.test(plugin.version)) {
88
+ issues.push({
89
+ severity: import_core.Severity.ERROR,
90
+ message: `Gemini extension version must be SemVer (got "${plugin.version}").`
91
+ });
92
+ }
93
+ const hooks = plugin.hooks ? Object.values(plugin.hooks).filter(Boolean) : [];
94
+ for (const hook of hooks) {
95
+ if (UNSUPPORTED_HOOKS.includes(hook.hookName)) {
96
+ issues.push({
97
+ severity: import_core.Severity.WARNING,
98
+ message: `Hook "${hook.hookName}" is not supported by Gemini CLI and will be ignored.`
99
+ });
100
+ }
101
+ if (!UNIVERSAL_TO_GEMINI[hook.hookName]) {
102
+ issues.push({
103
+ severity: import_core.Severity.WARNING,
104
+ message: `Hook "${hook.hookName}" has no Gemini equivalent and will be skipped.`
105
+ });
106
+ }
107
+ }
108
+ for (const hook of hooks) {
109
+ if (hook.handlerType === "file") {
110
+ issues.push({
111
+ severity: import_core.Severity.WARNING,
112
+ message: 'Gemini CLI prefers inline handlers; "file" handlers are wrapped in temporary scripts.'
113
+ });
114
+ }
115
+ }
116
+ for (const setting of plugin.settings ?? []) {
117
+ const ev = `${plugin.name.toUpperCase()}_${setting.title.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`;
118
+ if (!/^[A-Z_][A-Z0-9_]*$/.test(ev)) {
119
+ issues.push({
120
+ severity: import_core.Severity.WARNING,
121
+ message: `Setting "${setting.title}" envVar "${ev}" does not follow UPPER_SNAKE_CASE convention.`
122
+ });
123
+ }
124
+ if (ev.startsWith("GEMINI_")) {
125
+ issues.push({
126
+ severity: import_core.Severity.WARNING,
127
+ message: `Setting "${setting.title}" envVar "${ev}" may collide with Gemini reserved variables.`
128
+ });
129
+ }
130
+ }
131
+ return issues;
132
+ }
133
+ function wrapInlineHandler(script, hookName, geminiEvent) {
134
+ const cleanScript = script.trim();
135
+ const isNode = cleanScript.startsWith("#!/usr/bin/env node") || cleanScript.startsWith("#!/usr/bin/node");
136
+ if (isNode) {
137
+ return `${cleanScript}`;
138
+ }
139
+ return `#!/usr/bin/env node
140
+ // Auto-generated Gemini hook wrapper for "${hookName}" \u2192 ${geminiEvent}
141
+ // ${(/* @__PURE__ */ new Date()).toISOString()}
142
+
143
+ const { spawn } = require("child_process");
144
+ const path = require("path");
145
+
146
+ // Accumulate stdin JSON payload
147
+ let input = "";
148
+ process.stdin.setEncoding("utf8");
149
+ process.stdin.on("data", (chunk) => { input += chunk; });
150
+ process.stdin.on("end", () => {
151
+ let payload = {};
152
+ try { payload = JSON.parse(input); } catch { /* ignore malformed stdin */ }
153
+
154
+ const child = spawn(process.execPath, [__filename + ".impl.js"], {
155
+ stdio: ["pipe", "inherit", "inherit"],
156
+ env: { ...process.env, GEMINI_HOOK_PAYLOAD: JSON.stringify(payload) },
157
+ });
158
+
159
+ child.stdin.write(input);
160
+ child.stdin.end();
161
+
162
+ child.on("exit", (code) => {
163
+ // Gemini exit-code contract
164
+ if (code === 0) process.exit(0); // allow
165
+ if (code === 2) process.exit(2); // block
166
+ process.exit(1); // warning
167
+ });
168
+ });
169
+ `;
170
+ }
171
+ function wrapFileHandler(filePath) {
172
+ return `#!/usr/bin/env node
173
+ // Auto-generated Gemini file-handler proxy
174
+ const { spawn } = require("child_process");
175
+ const path = require("path");
176
+
177
+ let input = "";
178
+ process.stdin.setEncoding("utf8");
179
+ process.stdin.on("data", (chunk) => { input += chunk; });
180
+ process.stdin.on("end", () => {
181
+ const child = spawn(process.execPath, [path.resolve(__dirname, "${filePath.replace(
182
+ /"/g,
183
+ '\\"'
184
+ )}")], {
185
+ stdio: ["pipe", "inherit", "inherit"],
186
+ env: process.env,
187
+ });
188
+ child.stdin.write(input);
189
+ child.stdin.end();
190
+ child.on("exit", (code) => {
191
+ if (code === 0) process.exit(0);
192
+ if (code === 2) process.exit(2);
193
+ process.exit(1);
194
+ });
195
+ });
196
+ `;
197
+ }
198
+ function substituteVariables(cmd) {
199
+ return cmd;
200
+ }
201
+ function sanitizeEnvVar(name) {
202
+ const sanitized = name.replace(/[^a-zA-Z0-9_]/g, "_").replace(/^[0-9]/, "_").toUpperCase();
203
+ if (sanitized.startsWith("GEMINI_")) {
204
+ return "EXT_" + sanitized.substring(7);
205
+ }
206
+ return sanitized;
207
+ }
208
+ var GeminiAdapter = class {
209
+ constructor() {
210
+ this.name = "gemini";
211
+ this.displayName = "Google Gemini CLI";
212
+ this.supportedHooks = [
213
+ "sessionStart",
214
+ "preToolUse",
215
+ "postToolUse",
216
+ "userPromptSubmit",
217
+ "subagentStart",
218
+ "preCompact",
219
+ "sessionEnd",
220
+ "notification"
221
+ ];
222
+ this.supportedHandlers = ["inline", "file"];
223
+ this.manifestPath = "gemini-extension.json";
224
+ this.manifestFormat = "json";
225
+ }
226
+ validate(plugin) {
227
+ return validateGeminiManifest(plugin);
228
+ }
229
+ compile(plugin) {
230
+ const issues = this.validate(plugin);
231
+ const files = [];
232
+ const hooks = plugin.hooks ? Object.values(plugin.hooks).filter(Boolean) : [];
233
+ const geminiManifest = {
234
+ name: plugin.name,
235
+ version: plugin.version
236
+ };
237
+ if (plugin.description) {
238
+ geminiManifest.description = plugin.description;
239
+ }
240
+ const meta = plugin.metadata ?? {};
241
+ if (meta.mcpServers) geminiManifest.mcpServers = meta.mcpServers;
242
+ if (meta.contextFileName) geminiManifest.contextFileName = meta.contextFileName;
243
+ if (meta.excludeTools) geminiManifest.excludeTools = meta.excludeTools;
244
+ if (meta.plan) geminiManifest.plan = meta.plan;
245
+ if (meta.themes) geminiManifest.themes = meta.themes;
246
+ if (plugin.settings && plugin.settings.length > 0) {
247
+ geminiManifest.settings = plugin.settings.map((s) => ({
248
+ name: s.title,
249
+ description: s.description ?? "",
250
+ envVar: sanitizeEnvVar(`${plugin.name.toUpperCase()}_${s.title.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`),
251
+ sensitive: s.sensitive === true
252
+ }));
253
+ }
254
+ files.push({
255
+ path: this.manifestPath,
256
+ content: JSON.stringify(geminiManifest, null, 2)
257
+ });
258
+ const hooksJson = {};
259
+ for (const event of GEMINI_LIFECYCLE_EVENTS) {
260
+ hooksJson[event] = [];
261
+ }
262
+ for (const hook of hooks) {
263
+ const geminiEvent = UNIVERSAL_TO_GEMINI[hook.hookName];
264
+ if (!geminiEvent) continue;
265
+ const hookFileName = `hook-${hook.hookName}.js`;
266
+ const hookFilePath = `hooks/${hookFileName}`;
267
+ let scriptContent;
268
+ if (hook.handlerType === "file" && hook.script) {
269
+ scriptContent = wrapFileHandler(hook.script);
270
+ } else {
271
+ scriptContent = wrapInlineHandler(
272
+ hook.script ?? "// no-op",
273
+ hook.hookName,
274
+ geminiEvent
275
+ );
276
+ }
277
+ if (hook.handlerType !== "file") {
278
+ files.push({
279
+ path: hookFilePath,
280
+ content: hook.script ?? "// no-op"
281
+ });
282
+ }
283
+ const command = `node \${extensionPath}/${hookFilePath}`;
284
+ hooksJson[geminiEvent].push({
285
+ command: substituteVariables(command),
286
+ ...hook.cwd ? { cwd: hook.cwd } : {},
287
+ ...hook.settingRef ? { settingEnvVar: sanitizeEnvVar(hook.settingRef) } : {}
288
+ });
289
+ if (geminiEvent === "AfterAgent" && hook.metadata?.ralphLoop) {
290
+ hooksJson["AfterAgent"].push({
291
+ command: substituteVariables(
292
+ `node \${extensionPath}/${hookFilePath} --ralph-loop`
293
+ ),
294
+ ...hook.cwd ? { cwd: hook.cwd } : {}
295
+ });
296
+ }
297
+ }
298
+ for (const event of GEMINI_LIFECYCLE_EVENTS) {
299
+ if (hooksJson[event].length === 0) {
300
+ delete hooksJson[event];
301
+ }
302
+ }
303
+ files.push({
304
+ path: "hooks/hooks.json",
305
+ content: JSON.stringify(hooksJson, null, 2)
306
+ });
307
+ files.push({
308
+ path: "README.md",
309
+ content: `# ${plugin.name} \u2014 Gemini Extension
310
+
311
+ Generated by AgentPlugins for the Google Gemini CLI platform.
312
+
313
+ ## Install
314
+
315
+ Place this folder in your Gemini extensions directory and reload.
316
+
317
+ ## Settings
318
+
319
+ ${(geminiManifest.settings ?? []).map((s) => `- \`${s.envVar}\` \u2014 ${s.description}${s.sensitive ? " (sensitive)" : ""}`).join("\n") || "_No settings configured._"}
320
+
321
+ ## Hooks
322
+
323
+ | Universal Hook | Gemini Event | Command |
324
+ |---------------|--------------|---------|
325
+ ${Object.values(plugin.hooks ?? {}).filter((h) => h !== void 0 && "hookName" in h).filter((h) => UNIVERSAL_TO_GEMINI[h.hookName]).map((h) => `| \`${h.hookName}\` | \`${UNIVERSAL_TO_GEMINI[h.hookName]}\` | \`node hooks/hook-${h.hookName}.js\` |`).join("\n") || "_No hooks configured._"}
326
+
327
+ ## Exit-code contract
328
+
329
+ - \`0\` \u2014 success / allow
330
+ - \`2\` \u2014 block / reject
331
+ - other \u2014 warning (logged, not blocking)
332
+ `
333
+ });
334
+ return { files, manifest: geminiManifest, warnings: [], issues };
335
+ }
336
+ };
337
+ var geminiAdapter = new GeminiAdapter();
338
+ function createGeminiAdapter() {
339
+ return new GeminiAdapter();
340
+ }
341
+ var index_default = geminiAdapter;
342
+ // Annotate the CommonJS export names for ESM import in node:
343
+ 0 && (module.exports = {
344
+ GeminiAdapter,
345
+ createGeminiAdapter,
346
+ geminiAdapter
347
+ });
@@ -0,0 +1,40 @@
1
+ import { PlatformAdapter, TargetPlatform, UniversalHookName, HandlerType, PluginManifest, ValidationIssue, AdapterOutput } from '@agentplugins/core';
2
+
3
+ /**
4
+ * @agentplugins/adapter-gemini
5
+ *
6
+ * Platform adapter for the Google Gemini CLI extension system.
7
+ * Generates `gemini-extension.json` manifests and the `hooks/hooks.json`
8
+ * command-map with JSON stdin/stdout protocol wrappers.
9
+ *
10
+ * ## Exit-code contract
11
+ * - 0 → success / allow
12
+ * - 2 → block / reject
13
+ * - any other → warning (logged but not blocking)
14
+ *
15
+ * ## Variable substitution
16
+ * `${extensionPath}` → absolute path to the extension root
17
+ * `${workspacePath}` → absolute path to the current workspace
18
+ * `${/}` → platform-specific path separator
19
+ *
20
+ * ## Settings / env-var sanitization
21
+ * Settings are declared in the manifest with `envVar` names.
22
+ * Sensitive values are redacted from logs.
23
+ */
24
+
25
+ declare class GeminiAdapter implements PlatformAdapter {
26
+ readonly name: TargetPlatform;
27
+ readonly displayName = "Google Gemini CLI";
28
+ readonly supportedHooks: readonly UniversalHookName[];
29
+ readonly supportedHandlers: readonly HandlerType[];
30
+ readonly manifestPath = "gemini-extension.json";
31
+ readonly manifestFormat: "json";
32
+ validate(plugin: PluginManifest): ValidationIssue[];
33
+ compile(plugin: PluginManifest): AdapterOutput;
34
+ }
35
+ /** Singleton adapter instance. */
36
+ declare const geminiAdapter: GeminiAdapter;
37
+ /** Factory function for creating a new Gemini adapter instance. */
38
+ declare function createGeminiAdapter(): PlatformAdapter;
39
+
40
+ export { GeminiAdapter, createGeminiAdapter, geminiAdapter as default, geminiAdapter };
@@ -0,0 +1,40 @@
1
+ import { PlatformAdapter, TargetPlatform, UniversalHookName, HandlerType, PluginManifest, ValidationIssue, AdapterOutput } from '@agentplugins/core';
2
+
3
+ /**
4
+ * @agentplugins/adapter-gemini
5
+ *
6
+ * Platform adapter for the Google Gemini CLI extension system.
7
+ * Generates `gemini-extension.json` manifests and the `hooks/hooks.json`
8
+ * command-map with JSON stdin/stdout protocol wrappers.
9
+ *
10
+ * ## Exit-code contract
11
+ * - 0 → success / allow
12
+ * - 2 → block / reject
13
+ * - any other → warning (logged but not blocking)
14
+ *
15
+ * ## Variable substitution
16
+ * `${extensionPath}` → absolute path to the extension root
17
+ * `${workspacePath}` → absolute path to the current workspace
18
+ * `${/}` → platform-specific path separator
19
+ *
20
+ * ## Settings / env-var sanitization
21
+ * Settings are declared in the manifest with `envVar` names.
22
+ * Sensitive values are redacted from logs.
23
+ */
24
+
25
+ declare class GeminiAdapter implements PlatformAdapter {
26
+ readonly name: TargetPlatform;
27
+ readonly displayName = "Google Gemini CLI";
28
+ readonly supportedHooks: readonly UniversalHookName[];
29
+ readonly supportedHandlers: readonly HandlerType[];
30
+ readonly manifestPath = "gemini-extension.json";
31
+ readonly manifestFormat: "json";
32
+ validate(plugin: PluginManifest): ValidationIssue[];
33
+ compile(plugin: PluginManifest): AdapterOutput;
34
+ }
35
+ /** Singleton adapter instance. */
36
+ declare const geminiAdapter: GeminiAdapter;
37
+ /** Factory function for creating a new Gemini adapter instance. */
38
+ declare function createGeminiAdapter(): PlatformAdapter;
39
+
40
+ export { GeminiAdapter, createGeminiAdapter, geminiAdapter as default, geminiAdapter };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,aAAa,EAElB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAEjB,MAAM,mBAAmB,CAAC;AAuS3B,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAY;IACzC,QAAQ,CAAC,WAAW,uBAAuB;IAE3C,QAAQ,CAAC,cAAc,EAAE,SAAS,iBAAiB,EAAE,CASnD;IAEF,QAAQ,CAAC,iBAAiB,EAAE,SAAS,WAAW,EAAE,CAAsB;IAExE,QAAQ,CAAC,YAAY,2BAA2B;IAChD,QAAQ,CAAC,cAAc,EAAG,MAAM,CAAU;IAE1C,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,eAAe,EAAE;IAInD,OAAO,CAAC,MAAM,EAAE,cAAc,GAAG,aAAa;CA8I/C;AAED,kCAAkC;AAClC,eAAO,MAAM,aAAa,eAAsB,CAAC;AAEjD,mEAAmE;AACnE,wBAAgB,mBAAmB,IAAI,eAAe,CAErD;AAED,eAAe,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,322 @@
1
+ // src/index.ts
2
+ import {
3
+ Severity
4
+ } from "@agentplugins/core";
5
+ var GEMINI_LIFECYCLE_EVENTS = [
6
+ "AfterAgent",
7
+ "AfterModel",
8
+ "AfterTool",
9
+ "BeforeAgent",
10
+ "BeforeModel",
11
+ "BeforeTool",
12
+ "BeforeToolSelection",
13
+ "Notification",
14
+ "PreCompress",
15
+ "SessionEnd",
16
+ "SessionStart"
17
+ ];
18
+ var UNIVERSAL_TO_GEMINI = {
19
+ sessionStart: "SessionStart",
20
+ preToolUse: "BeforeTool",
21
+ // BeforeTool can block (exit 2); BeforeToolSelection cannot
22
+ postToolUse: "AfterTool",
23
+ userPromptSubmit: "BeforeAgent",
24
+ subagentStart: "BeforeAgent",
25
+ // no direct equivalent — closest match
26
+ preCompact: "PreCompress",
27
+ sessionEnd: "SessionEnd",
28
+ notification: "Notification"
29
+ };
30
+ var UNSUPPORTED_HOOKS = [
31
+ "userPromptExpansion",
32
+ "permissionRequest",
33
+ "permissionDenied",
34
+ "postToolUseFailure",
35
+ "postCompact",
36
+ "stop",
37
+ "stopFailure",
38
+ "fileChanged",
39
+ "cwdChanged",
40
+ "setup"
41
+ ];
42
+ var KEBAB_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
43
+ var SEMVER_RE = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
44
+ function validateGeminiManifest(plugin) {
45
+ const issues = [];
46
+ if (!plugin.name) {
47
+ issues.push({
48
+ severity: Severity.ERROR,
49
+ message: "Gemini manifest requires 'name' (kebab-case)."
50
+ });
51
+ } else if (!KEBAB_RE.test(plugin.name)) {
52
+ issues.push({
53
+ severity: Severity.ERROR,
54
+ message: `Gemini extension name must be kebab-case (got "${plugin.name}").`
55
+ });
56
+ }
57
+ if (!plugin.version) {
58
+ issues.push({
59
+ severity: Severity.ERROR,
60
+ message: "Gemini manifest requires 'version' (SemVer)."
61
+ });
62
+ } else if (!SEMVER_RE.test(plugin.version)) {
63
+ issues.push({
64
+ severity: Severity.ERROR,
65
+ message: `Gemini extension version must be SemVer (got "${plugin.version}").`
66
+ });
67
+ }
68
+ const hooks = plugin.hooks ? Object.values(plugin.hooks).filter(Boolean) : [];
69
+ for (const hook of hooks) {
70
+ if (UNSUPPORTED_HOOKS.includes(hook.hookName)) {
71
+ issues.push({
72
+ severity: Severity.WARNING,
73
+ message: `Hook "${hook.hookName}" is not supported by Gemini CLI and will be ignored.`
74
+ });
75
+ }
76
+ if (!UNIVERSAL_TO_GEMINI[hook.hookName]) {
77
+ issues.push({
78
+ severity: Severity.WARNING,
79
+ message: `Hook "${hook.hookName}" has no Gemini equivalent and will be skipped.`
80
+ });
81
+ }
82
+ }
83
+ for (const hook of hooks) {
84
+ if (hook.handlerType === "file") {
85
+ issues.push({
86
+ severity: Severity.WARNING,
87
+ message: 'Gemini CLI prefers inline handlers; "file" handlers are wrapped in temporary scripts.'
88
+ });
89
+ }
90
+ }
91
+ for (const setting of plugin.settings ?? []) {
92
+ const ev = `${plugin.name.toUpperCase()}_${setting.title.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`;
93
+ if (!/^[A-Z_][A-Z0-9_]*$/.test(ev)) {
94
+ issues.push({
95
+ severity: Severity.WARNING,
96
+ message: `Setting "${setting.title}" envVar "${ev}" does not follow UPPER_SNAKE_CASE convention.`
97
+ });
98
+ }
99
+ if (ev.startsWith("GEMINI_")) {
100
+ issues.push({
101
+ severity: Severity.WARNING,
102
+ message: `Setting "${setting.title}" envVar "${ev}" may collide with Gemini reserved variables.`
103
+ });
104
+ }
105
+ }
106
+ return issues;
107
+ }
108
+ function wrapInlineHandler(script, hookName, geminiEvent) {
109
+ const cleanScript = script.trim();
110
+ const isNode = cleanScript.startsWith("#!/usr/bin/env node") || cleanScript.startsWith("#!/usr/bin/node");
111
+ if (isNode) {
112
+ return `${cleanScript}`;
113
+ }
114
+ return `#!/usr/bin/env node
115
+ // Auto-generated Gemini hook wrapper for "${hookName}" \u2192 ${geminiEvent}
116
+ // ${(/* @__PURE__ */ new Date()).toISOString()}
117
+
118
+ const { spawn } = require("child_process");
119
+ const path = require("path");
120
+
121
+ // Accumulate stdin JSON payload
122
+ let input = "";
123
+ process.stdin.setEncoding("utf8");
124
+ process.stdin.on("data", (chunk) => { input += chunk; });
125
+ process.stdin.on("end", () => {
126
+ let payload = {};
127
+ try { payload = JSON.parse(input); } catch { /* ignore malformed stdin */ }
128
+
129
+ const child = spawn(process.execPath, [__filename + ".impl.js"], {
130
+ stdio: ["pipe", "inherit", "inherit"],
131
+ env: { ...process.env, GEMINI_HOOK_PAYLOAD: JSON.stringify(payload) },
132
+ });
133
+
134
+ child.stdin.write(input);
135
+ child.stdin.end();
136
+
137
+ child.on("exit", (code) => {
138
+ // Gemini exit-code contract
139
+ if (code === 0) process.exit(0); // allow
140
+ if (code === 2) process.exit(2); // block
141
+ process.exit(1); // warning
142
+ });
143
+ });
144
+ `;
145
+ }
146
+ function wrapFileHandler(filePath) {
147
+ return `#!/usr/bin/env node
148
+ // Auto-generated Gemini file-handler proxy
149
+ const { spawn } = require("child_process");
150
+ const path = require("path");
151
+
152
+ let input = "";
153
+ process.stdin.setEncoding("utf8");
154
+ process.stdin.on("data", (chunk) => { input += chunk; });
155
+ process.stdin.on("end", () => {
156
+ const child = spawn(process.execPath, [path.resolve(__dirname, "${filePath.replace(
157
+ /"/g,
158
+ '\\"'
159
+ )}")], {
160
+ stdio: ["pipe", "inherit", "inherit"],
161
+ env: process.env,
162
+ });
163
+ child.stdin.write(input);
164
+ child.stdin.end();
165
+ child.on("exit", (code) => {
166
+ if (code === 0) process.exit(0);
167
+ if (code === 2) process.exit(2);
168
+ process.exit(1);
169
+ });
170
+ });
171
+ `;
172
+ }
173
+ function substituteVariables(cmd) {
174
+ return cmd;
175
+ }
176
+ function sanitizeEnvVar(name) {
177
+ const sanitized = name.replace(/[^a-zA-Z0-9_]/g, "_").replace(/^[0-9]/, "_").toUpperCase();
178
+ if (sanitized.startsWith("GEMINI_")) {
179
+ return "EXT_" + sanitized.substring(7);
180
+ }
181
+ return sanitized;
182
+ }
183
+ var GeminiAdapter = class {
184
+ constructor() {
185
+ this.name = "gemini";
186
+ this.displayName = "Google Gemini CLI";
187
+ this.supportedHooks = [
188
+ "sessionStart",
189
+ "preToolUse",
190
+ "postToolUse",
191
+ "userPromptSubmit",
192
+ "subagentStart",
193
+ "preCompact",
194
+ "sessionEnd",
195
+ "notification"
196
+ ];
197
+ this.supportedHandlers = ["inline", "file"];
198
+ this.manifestPath = "gemini-extension.json";
199
+ this.manifestFormat = "json";
200
+ }
201
+ validate(plugin) {
202
+ return validateGeminiManifest(plugin);
203
+ }
204
+ compile(plugin) {
205
+ const issues = this.validate(plugin);
206
+ const files = [];
207
+ const hooks = plugin.hooks ? Object.values(plugin.hooks).filter(Boolean) : [];
208
+ const geminiManifest = {
209
+ name: plugin.name,
210
+ version: plugin.version
211
+ };
212
+ if (plugin.description) {
213
+ geminiManifest.description = plugin.description;
214
+ }
215
+ const meta = plugin.metadata ?? {};
216
+ if (meta.mcpServers) geminiManifest.mcpServers = meta.mcpServers;
217
+ if (meta.contextFileName) geminiManifest.contextFileName = meta.contextFileName;
218
+ if (meta.excludeTools) geminiManifest.excludeTools = meta.excludeTools;
219
+ if (meta.plan) geminiManifest.plan = meta.plan;
220
+ if (meta.themes) geminiManifest.themes = meta.themes;
221
+ if (plugin.settings && plugin.settings.length > 0) {
222
+ geminiManifest.settings = plugin.settings.map((s) => ({
223
+ name: s.title,
224
+ description: s.description ?? "",
225
+ envVar: sanitizeEnvVar(`${plugin.name.toUpperCase()}_${s.title.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`),
226
+ sensitive: s.sensitive === true
227
+ }));
228
+ }
229
+ files.push({
230
+ path: this.manifestPath,
231
+ content: JSON.stringify(geminiManifest, null, 2)
232
+ });
233
+ const hooksJson = {};
234
+ for (const event of GEMINI_LIFECYCLE_EVENTS) {
235
+ hooksJson[event] = [];
236
+ }
237
+ for (const hook of hooks) {
238
+ const geminiEvent = UNIVERSAL_TO_GEMINI[hook.hookName];
239
+ if (!geminiEvent) continue;
240
+ const hookFileName = `hook-${hook.hookName}.js`;
241
+ const hookFilePath = `hooks/${hookFileName}`;
242
+ let scriptContent;
243
+ if (hook.handlerType === "file" && hook.script) {
244
+ scriptContent = wrapFileHandler(hook.script);
245
+ } else {
246
+ scriptContent = wrapInlineHandler(
247
+ hook.script ?? "// no-op",
248
+ hook.hookName,
249
+ geminiEvent
250
+ );
251
+ }
252
+ if (hook.handlerType !== "file") {
253
+ files.push({
254
+ path: hookFilePath,
255
+ content: hook.script ?? "// no-op"
256
+ });
257
+ }
258
+ const command = `node \${extensionPath}/${hookFilePath}`;
259
+ hooksJson[geminiEvent].push({
260
+ command: substituteVariables(command),
261
+ ...hook.cwd ? { cwd: hook.cwd } : {},
262
+ ...hook.settingRef ? { settingEnvVar: sanitizeEnvVar(hook.settingRef) } : {}
263
+ });
264
+ if (geminiEvent === "AfterAgent" && hook.metadata?.ralphLoop) {
265
+ hooksJson["AfterAgent"].push({
266
+ command: substituteVariables(
267
+ `node \${extensionPath}/${hookFilePath} --ralph-loop`
268
+ ),
269
+ ...hook.cwd ? { cwd: hook.cwd } : {}
270
+ });
271
+ }
272
+ }
273
+ for (const event of GEMINI_LIFECYCLE_EVENTS) {
274
+ if (hooksJson[event].length === 0) {
275
+ delete hooksJson[event];
276
+ }
277
+ }
278
+ files.push({
279
+ path: "hooks/hooks.json",
280
+ content: JSON.stringify(hooksJson, null, 2)
281
+ });
282
+ files.push({
283
+ path: "README.md",
284
+ content: `# ${plugin.name} \u2014 Gemini Extension
285
+
286
+ Generated by AgentPlugins for the Google Gemini CLI platform.
287
+
288
+ ## Install
289
+
290
+ Place this folder in your Gemini extensions directory and reload.
291
+
292
+ ## Settings
293
+
294
+ ${(geminiManifest.settings ?? []).map((s) => `- \`${s.envVar}\` \u2014 ${s.description}${s.sensitive ? " (sensitive)" : ""}`).join("\n") || "_No settings configured._"}
295
+
296
+ ## Hooks
297
+
298
+ | Universal Hook | Gemini Event | Command |
299
+ |---------------|--------------|---------|
300
+ ${Object.values(plugin.hooks ?? {}).filter((h) => h !== void 0 && "hookName" in h).filter((h) => UNIVERSAL_TO_GEMINI[h.hookName]).map((h) => `| \`${h.hookName}\` | \`${UNIVERSAL_TO_GEMINI[h.hookName]}\` | \`node hooks/hook-${h.hookName}.js\` |`).join("\n") || "_No hooks configured._"}
301
+
302
+ ## Exit-code contract
303
+
304
+ - \`0\` \u2014 success / allow
305
+ - \`2\` \u2014 block / reject
306
+ - other \u2014 warning (logged, not blocking)
307
+ `
308
+ });
309
+ return { files, manifest: geminiManifest, warnings: [], issues };
310
+ }
311
+ };
312
+ var geminiAdapter = new GeminiAdapter();
313
+ function createGeminiAdapter() {
314
+ return new GeminiAdapter();
315
+ }
316
+ var index_default = geminiAdapter;
317
+ export {
318
+ GeminiAdapter,
319
+ createGeminiAdapter,
320
+ index_default as default,
321
+ geminiAdapter
322
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@agentplugins/adapter-gemini",
3
+ "version": "0.1.0",
4
+ "description": "AgentPlugins platform adapter for Google Gemini CLI extensions",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "require": "./dist/index.cjs",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "scripts": {
16
+ "build": "tsup src/index.ts --format cjs,esm --dts",
17
+ "dev": "tsup src/index.ts --format cjs,esm --dts --watch",
18
+ "clean": "rm -rf dist"
19
+ },
20
+ "dependencies": {
21
+ "@agentplugins/core": "workspace:*"
22
+ },
23
+ "devDependencies": {
24
+ "tsup": "^8.0.0",
25
+ "typescript": "^5.3.0"
26
+ },
27
+ "files": [
28
+ "dist",
29
+ "README.md"
30
+ ],
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "license": "MIT"
35
+ }