@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 +46 -0
- package/dist/index.cjs +347 -0
- package/dist/index.d.cts +40 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +322 -0
- package/dist/index.js.map +1 -0
- package/package.json +35 -0
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
|
+
});
|
package/dist/index.d.cts
ADDED
|
@@ -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 };
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|