agentikit 0.0.3

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,580 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { loadSearchIndex, buildSearchText } from "./indexer";
5
+ import { TfIdfAdapter } from "./similarity";
6
+ const IS_WINDOWS = process.platform === "win32";
7
+ const TOOL_EXTENSIONS = new Set([".sh", ".ts", ".js", ".ps1", ".cmd", ".bat"]);
8
+ const DEFAULT_LIMIT = 20;
9
+ export function resolveStashDir() {
10
+ const raw = process.env.AGENTIKIT_STASH_DIR?.trim();
11
+ if (!raw) {
12
+ throw new Error("AGENTIKIT_STASH_DIR is not set. Set it to your Agentikit stash path.");
13
+ }
14
+ const stashDir = path.resolve(raw);
15
+ let stat;
16
+ try {
17
+ stat = fs.statSync(stashDir);
18
+ }
19
+ catch {
20
+ throw new Error(`Unable to read AGENTIKIT_STASH_DIR at "${stashDir}".`);
21
+ }
22
+ if (!stat.isDirectory()) {
23
+ throw new Error(`AGENTIKIT_STASH_DIR must point to a directory: "${stashDir}".`);
24
+ }
25
+ return stashDir;
26
+ }
27
+ export function agentikitSearch(input) {
28
+ const query = input.query.trim().toLowerCase();
29
+ const searchType = input.type ?? "any";
30
+ const limit = normalizeLimit(input.limit);
31
+ const stashDir = resolveStashDir();
32
+ // Try semantic search via persisted index
33
+ const semanticHits = trySemanticSearch(query, searchType, limit, stashDir);
34
+ if (semanticHits) {
35
+ return {
36
+ stashDir,
37
+ hits: semanticHits,
38
+ tip: semanticHits.length === 0 ? "No matching stash assets were found. Try running 'agentikit index' to rebuild." : undefined,
39
+ };
40
+ }
41
+ // Fallback: substring matching (no index built yet)
42
+ const assets = indexAssets(stashDir, searchType);
43
+ const hits = assets
44
+ .filter((asset) => asset.name.toLowerCase().includes(query))
45
+ .sort(compareAssets)
46
+ .slice(0, limit)
47
+ .map((asset) => assetToSearchHit(asset, stashDir));
48
+ return {
49
+ stashDir,
50
+ hits,
51
+ tip: hits.length === 0 ? "No matching stash assets were found." : undefined,
52
+ };
53
+ }
54
+ function trySemanticSearch(query, searchType, limit, stashDir) {
55
+ const index = loadSearchIndex();
56
+ if (!index || !index.entries || index.entries.length === 0)
57
+ return null;
58
+ if (index.stashDir !== stashDir)
59
+ return null;
60
+ const scoredEntries = index.entries.map((ie) => ({
61
+ id: `${ie.entry.type}:${ie.entry.name}`,
62
+ text: buildSearchText(ie.entry),
63
+ entry: ie.entry,
64
+ path: ie.path,
65
+ }));
66
+ let adapter;
67
+ if (index.tfidf) {
68
+ adapter = TfIdfAdapter.deserialize(index.tfidf, scoredEntries);
69
+ }
70
+ else {
71
+ adapter = new TfIdfAdapter();
72
+ adapter.buildIndex(scoredEntries);
73
+ }
74
+ const typeFilter = searchType === "any" ? undefined : searchType;
75
+ const results = adapter.search(query, limit, typeFilter);
76
+ return results.map((r) => {
77
+ const hit = {
78
+ type: r.entry.type,
79
+ name: r.entry.name,
80
+ path: r.path,
81
+ openRef: makeOpenRef(r.entry.type, r.entry.name),
82
+ description: r.entry.description,
83
+ tags: r.entry.tags,
84
+ score: r.score,
85
+ };
86
+ if (r.entry.type === "tool") {
87
+ try {
88
+ const toolInfo = buildToolInfo(stashDir, r.path);
89
+ hit.runCmd = toolInfo.runCmd;
90
+ hit.kind = toolInfo.kind;
91
+ }
92
+ catch {
93
+ // Tool file may have been removed since indexing
94
+ }
95
+ }
96
+ return hit;
97
+ });
98
+ }
99
+ export function agentikitOpen(input) {
100
+ const parsed = parseOpenRef(input.ref);
101
+ const stashDir = resolveStashDir();
102
+ const assetPath = resolveAssetPath(stashDir, parsed.type, parsed.name);
103
+ const content = fs.readFileSync(assetPath, "utf8");
104
+ switch (parsed.type) {
105
+ case "skill":
106
+ return {
107
+ type: "skill",
108
+ name: parsed.name,
109
+ path: assetPath,
110
+ content,
111
+ };
112
+ case "command": {
113
+ const parsedMd = parseFrontmatter(content);
114
+ return {
115
+ type: "command",
116
+ name: parsed.name,
117
+ path: assetPath,
118
+ description: toStringOrUndefined(parsedMd.data.description),
119
+ template: parsedMd.content,
120
+ };
121
+ }
122
+ case "agent": {
123
+ const parsedMd = parseFrontmatter(content);
124
+ return {
125
+ type: "agent",
126
+ name: parsed.name,
127
+ path: assetPath,
128
+ description: toStringOrUndefined(parsedMd.data.description),
129
+ prompt: parsedMd.content,
130
+ toolPolicy: parsedMd.data.tools,
131
+ modelHint: parsedMd.data.model,
132
+ };
133
+ }
134
+ case "tool": {
135
+ const toolInfo = buildToolInfo(stashDir, assetPath);
136
+ return {
137
+ type: "tool",
138
+ name: parsed.name,
139
+ path: assetPath,
140
+ runCmd: toolInfo.runCmd,
141
+ kind: toolInfo.kind,
142
+ };
143
+ }
144
+ }
145
+ }
146
+ export function agentikitRun(input) {
147
+ const parsed = parseOpenRef(input.ref);
148
+ if (parsed.type !== "tool") {
149
+ throw new Error(`agentikitRun only supports tool refs. Got: "${parsed.type}".`);
150
+ }
151
+ const stashDir = resolveStashDir();
152
+ const assetPath = resolveAssetPath(stashDir, "tool", parsed.name);
153
+ const toolInfo = buildToolInfo(stashDir, assetPath);
154
+ if (toolInfo.install) {
155
+ const installResult = runToolExecution(toolInfo.install);
156
+ if (installResult.exitCode !== 0) {
157
+ return {
158
+ type: "tool",
159
+ name: parsed.name,
160
+ path: assetPath,
161
+ output: installResult.output,
162
+ exitCode: installResult.exitCode,
163
+ };
164
+ }
165
+ }
166
+ const runResult = runToolExecution(toolInfo.execute);
167
+ return {
168
+ type: "tool",
169
+ name: parsed.name,
170
+ path: assetPath,
171
+ output: runResult.output,
172
+ exitCode: runResult.exitCode,
173
+ };
174
+ }
175
+ function assetToSearchHit(asset, stashDir) {
176
+ if (asset.type !== "tool") {
177
+ return {
178
+ type: asset.type,
179
+ name: asset.name,
180
+ path: asset.path,
181
+ openRef: makeOpenRef(asset.type, asset.name),
182
+ };
183
+ }
184
+ const toolInfo = buildToolInfo(stashDir, asset.path);
185
+ return {
186
+ type: "tool",
187
+ name: asset.name,
188
+ path: asset.path,
189
+ openRef: makeOpenRef("tool", asset.name),
190
+ runCmd: toolInfo.runCmd,
191
+ kind: toolInfo.kind,
192
+ };
193
+ }
194
+ function normalizeLimit(limit) {
195
+ if (typeof limit !== "number" || Number.isNaN(limit) || limit <= 0) {
196
+ return DEFAULT_LIMIT;
197
+ }
198
+ return Math.min(Math.floor(limit), 200);
199
+ }
200
+ const ASSET_INDEXERS = {
201
+ tool: {
202
+ dir: "tools",
203
+ collect(root, file) {
204
+ if (!TOOL_EXTENSIONS.has(path.extname(file).toLowerCase()))
205
+ return undefined;
206
+ return { type: "tool", name: toPosix(path.relative(root, file)), path: file };
207
+ },
208
+ },
209
+ skill: {
210
+ dir: "skills",
211
+ collect(root, file) {
212
+ if (path.basename(file) !== "SKILL.md")
213
+ return undefined;
214
+ const relDir = toPosix(path.dirname(path.relative(root, file)));
215
+ if (!relDir || relDir === ".")
216
+ return undefined;
217
+ return { type: "skill", name: relDir, path: file };
218
+ },
219
+ },
220
+ command: {
221
+ dir: "commands",
222
+ collect(root, file) {
223
+ if (path.extname(file).toLowerCase() !== ".md")
224
+ return undefined;
225
+ return { type: "command", name: toPosix(path.relative(root, file)), path: file };
226
+ },
227
+ },
228
+ agent: {
229
+ dir: "agents",
230
+ collect(root, file) {
231
+ if (path.extname(file).toLowerCase() !== ".md")
232
+ return undefined;
233
+ return { type: "agent", name: toPosix(path.relative(root, file)), path: file };
234
+ },
235
+ },
236
+ };
237
+ function indexAssets(stashDir, type) {
238
+ const assets = [];
239
+ const types = type === "any" ? Object.keys(ASSET_INDEXERS) : [type];
240
+ for (const assetType of types) {
241
+ const indexer = ASSET_INDEXERS[assetType];
242
+ const root = path.join(stashDir, indexer.dir);
243
+ walkFiles(root, (file) => {
244
+ const asset = indexer.collect(root, file);
245
+ if (asset)
246
+ assets.push(asset);
247
+ });
248
+ }
249
+ return assets;
250
+ }
251
+ function walkFiles(root, onFile) {
252
+ if (!fs.existsSync(root))
253
+ return;
254
+ const stack = [root];
255
+ while (stack.length > 0) {
256
+ const current = stack.pop();
257
+ if (!current)
258
+ continue;
259
+ const entries = fs.readdirSync(current, { withFileTypes: true });
260
+ for (const entry of entries) {
261
+ const fullPath = path.join(current, entry.name);
262
+ if (entry.isDirectory()) {
263
+ stack.push(fullPath);
264
+ }
265
+ else if (entry.isFile()) {
266
+ onFile(fullPath);
267
+ }
268
+ }
269
+ }
270
+ }
271
+ function compareAssets(a, b) {
272
+ if (a.type !== b.type)
273
+ return a.type.localeCompare(b.type);
274
+ return a.name.localeCompare(b.name);
275
+ }
276
+ function parseOpenRef(ref) {
277
+ const separator = ref.indexOf(":");
278
+ if (separator <= 0) {
279
+ throw new Error("Invalid open ref. Expected format '<type>:<name>'.");
280
+ }
281
+ const rawType = ref.slice(0, separator);
282
+ const rawName = ref.slice(separator + 1);
283
+ if (!isAssetType(rawType)) {
284
+ throw new Error(`Invalid open ref type: "${rawType}".`);
285
+ }
286
+ let name;
287
+ try {
288
+ name = decodeURIComponent(rawName);
289
+ }
290
+ catch {
291
+ throw new Error("Invalid open ref encoding.");
292
+ }
293
+ const normalized = path.posix.normalize(name.replace(/\\/g, "/"));
294
+ if (!name
295
+ || name.includes("\0")
296
+ || /^[A-Za-z]:/.test(name)
297
+ || path.posix.isAbsolute(normalized)
298
+ || normalized === ".."
299
+ || normalized.startsWith("../")) {
300
+ throw new Error("Invalid open ref name.");
301
+ }
302
+ return { type: rawType, name: normalized };
303
+ }
304
+ function makeOpenRef(type, name) {
305
+ return `${type}:${encodeURIComponent(name)}`;
306
+ }
307
+ function resolveAssetPath(stashDir, type, name) {
308
+ const root = path.join(stashDir, type === "tool" ? "tools" : `${type}s`);
309
+ const target = type === "skill" ? path.join(root, name, "SKILL.md") : path.join(root, name);
310
+ const resolvedRoot = resolveAndValidateTypeRoot(root, type, name);
311
+ const resolvedTarget = path.resolve(target);
312
+ if (!isWithin(resolvedTarget, resolvedRoot)) {
313
+ throw new Error("Ref resolves outside the stash root.");
314
+ }
315
+ if (!fs.existsSync(resolvedTarget) || !fs.statSync(resolvedTarget).isFile()) {
316
+ throw new Error(`Stash asset not found for ref: ${type}:${name}`);
317
+ }
318
+ const realTarget = fs.realpathSync(resolvedTarget);
319
+ if (!isWithin(realTarget, resolvedRoot)) {
320
+ throw new Error("Ref resolves outside the stash root.");
321
+ }
322
+ if (type === "tool" && !TOOL_EXTENSIONS.has(path.extname(resolvedTarget).toLowerCase())) {
323
+ throw new Error("Tool ref must resolve to a .sh, .ts, .js, .ps1, .cmd, or .bat file.");
324
+ }
325
+ return realTarget;
326
+ }
327
+ function resolveAndValidateTypeRoot(root, type, name) {
328
+ const rootStat = readTypeRootStat(root, type, name);
329
+ if (!rootStat.isDirectory()) {
330
+ throw new Error(`Stash type root is not a directory for ref: ${type}:${name}`);
331
+ }
332
+ return fs.realpathSync(root);
333
+ }
334
+ function readTypeRootStat(root, type, name) {
335
+ try {
336
+ return fs.statSync(root);
337
+ }
338
+ catch (error) {
339
+ if (hasErrnoCode(error, "ENOENT")) {
340
+ throw new Error(`Stash type root not found for ref: ${type}:${name}`);
341
+ }
342
+ throw error;
343
+ }
344
+ }
345
+ function buildToolInfo(stashDir, filePath) {
346
+ const ext = path.extname(filePath).toLowerCase();
347
+ if (ext === ".sh") {
348
+ return {
349
+ runCmd: `bash ${shellQuote(filePath)}`,
350
+ kind: "bash",
351
+ execute: { command: "bash", args: [filePath] },
352
+ };
353
+ }
354
+ if (ext === ".ps1") {
355
+ return {
356
+ runCmd: `powershell -ExecutionPolicy Bypass -File ${shellQuote(filePath)}`,
357
+ kind: "powershell",
358
+ execute: { command: "powershell", args: ["-ExecutionPolicy", "Bypass", "-File", filePath] },
359
+ };
360
+ }
361
+ if (ext === ".cmd" || ext === ".bat") {
362
+ return {
363
+ runCmd: `cmd /c ${shellQuote(filePath)}`,
364
+ kind: "cmd",
365
+ execute: { command: "cmd", args: ["/c", filePath] },
366
+ };
367
+ }
368
+ if (ext !== ".ts" && ext !== ".js") {
369
+ throw new Error(`Unsupported tool extension: ${ext}`);
370
+ }
371
+ const toolsRoot = path.resolve(path.join(stashDir, "tools"));
372
+ const pkgDir = findNearestPackageDir(path.dirname(filePath), toolsRoot);
373
+ if (!pkgDir) {
374
+ return {
375
+ runCmd: `bun ${shellQuote(filePath)}`,
376
+ kind: "bun",
377
+ execute: { command: "bun", args: [filePath] },
378
+ };
379
+ }
380
+ const installFlag = process.env.AGENTIKIT_BUN_INSTALL;
381
+ const shouldInstall = installFlag === "1" || installFlag === "true" || installFlag === "yes";
382
+ const quotedPkgDir = shellQuote(pkgDir);
383
+ const quotedFilePath = shellQuote(filePath);
384
+ const cdCmd = IS_WINDOWS ? `cd /d ${quotedPkgDir}` : `cd ${quotedPkgDir}`;
385
+ const chain = IS_WINDOWS ? " & " : " && ";
386
+ return {
387
+ runCmd: shouldInstall
388
+ ? `${cdCmd}${chain}bun install${chain}bun ${quotedFilePath}`
389
+ : `${cdCmd}${chain}bun ${quotedFilePath}`,
390
+ kind: "bun",
391
+ install: shouldInstall ? { command: "bun", args: ["install"], cwd: pkgDir } : undefined,
392
+ execute: { command: "bun", args: [filePath], cwd: pkgDir },
393
+ };
394
+ }
395
+ function findNearestPackageDir(startDir, toolsRoot) {
396
+ let current = path.resolve(startDir);
397
+ const root = path.resolve(toolsRoot);
398
+ while (isWithin(current, root)) {
399
+ if (fs.existsSync(path.join(current, "package.json"))) {
400
+ return current;
401
+ }
402
+ if (current === root)
403
+ return undefined;
404
+ current = path.dirname(current);
405
+ }
406
+ return undefined;
407
+ }
408
+ function isWithin(candidate, root) {
409
+ const normalizedRoot = normalizeFsPathForComparison(path.resolve(root));
410
+ const normalizedCandidate = normalizeFsPathForComparison(path.resolve(candidate));
411
+ const rel = path.relative(normalizedRoot, normalizedCandidate);
412
+ return rel === "" || (!rel.startsWith("..") && !path.isAbsolute(rel));
413
+ }
414
+ function normalizeFsPathForComparison(value) {
415
+ return process.platform === "win32" ? value.toLowerCase() : value;
416
+ }
417
+ function toPosix(input) {
418
+ return input.split(path.sep).join("/");
419
+ }
420
+ function parseFrontmatter(raw) {
421
+ const match = raw.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
422
+ if (!match) {
423
+ return { data: {}, content: raw };
424
+ }
425
+ const data = {};
426
+ let currentKey = null;
427
+ let nested = null;
428
+ for (const line of match[1].split(/\r?\n/)) {
429
+ const indented = line.match(/^ (\w[\w-]*):\s*(.+)$/);
430
+ if (indented && currentKey && nested) {
431
+ nested[indented[1]] = parseYamlScalar(indented[2].trim());
432
+ continue;
433
+ }
434
+ const top = line.match(/^(\w[\w-]*):\s*(.*)$/);
435
+ if (!top) {
436
+ continue;
437
+ }
438
+ currentKey = top[1];
439
+ const value = top[2].trim();
440
+ if (value === "") {
441
+ nested = {};
442
+ data[currentKey] = nested;
443
+ }
444
+ else {
445
+ nested = null;
446
+ data[currentKey] = parseYamlScalar(value);
447
+ }
448
+ }
449
+ return { data, content: match[2] };
450
+ }
451
+ function parseYamlScalar(value) {
452
+ if (value === "")
453
+ return "";
454
+ if (value === "true")
455
+ return true;
456
+ if (value === "false")
457
+ return false;
458
+ const asNumber = Number(value);
459
+ if (!Number.isNaN(asNumber))
460
+ return asNumber;
461
+ if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
462
+ return value.slice(1, -1);
463
+ }
464
+ return value;
465
+ }
466
+ function isAssetType(type) {
467
+ return type === "tool" || type === "skill" || type === "command" || type === "agent";
468
+ }
469
+ function toStringOrUndefined(value) {
470
+ return typeof value === "string" && value.trim() ? value : undefined;
471
+ }
472
+ function shellQuote(input) {
473
+ if (/[\r\n\t\0]/.test(input)) {
474
+ throw new Error("Unsupported control characters in stash path.");
475
+ }
476
+ if (IS_WINDOWS) {
477
+ return `"${input.replace(/"/g, '""')}"`;
478
+ }
479
+ const escaped = input
480
+ .replace(/\\/g, "\\\\")
481
+ .replace(/"/g, '\\"')
482
+ .replace(/\$/g, "\\$")
483
+ .replace(/`/g, "\\`");
484
+ return `"${escaped}"`;
485
+ }
486
+ function runToolExecution(execution) {
487
+ const result = spawnSync(execution.command, execution.args, {
488
+ cwd: execution.cwd,
489
+ encoding: "utf8",
490
+ timeout: 60_000,
491
+ });
492
+ const stdout = typeof result.stdout === "string" ? result.stdout : "";
493
+ const stderr = typeof result.stderr === "string" ? result.stderr : "";
494
+ const combinedOutput = combineProcessOutput(stdout, stderr);
495
+ if (typeof result.status === "number") {
496
+ return { output: combinedOutput, exitCode: result.status };
497
+ }
498
+ if (result.error) {
499
+ return {
500
+ output: `${combinedOutput}${result.error.message ? `\n${result.error.message}` : ""}`.trim(),
501
+ exitCode: 1,
502
+ };
503
+ }
504
+ return {
505
+ output: combinedOutput || `Unexpected process termination while running "${execution.command}": no status code or error information available.`,
506
+ exitCode: 1,
507
+ };
508
+ }
509
+ function combineProcessOutput(stdout, stderr) {
510
+ if (stdout && stderr) {
511
+ return `stdout:\n${stdout.trim()}\n\nstderr:\n${stderr.trim()}`;
512
+ }
513
+ return `${stdout}${stderr}`.trim();
514
+ }
515
+ export function agentikitInit() {
516
+ let stashDir;
517
+ const home = process.env.HOME || "";
518
+ if (IS_WINDOWS) {
519
+ const docs = process.env.USERPROFILE
520
+ ? path.join(process.env.USERPROFILE, "Documents")
521
+ : "";
522
+ if (!docs) {
523
+ throw new Error("Unable to determine Documents folder. Ensure USERPROFILE is set.");
524
+ }
525
+ stashDir = path.join(docs, "agentikit");
526
+ }
527
+ else {
528
+ if (!home) {
529
+ throw new Error("Unable to determine home directory. Set HOME.");
530
+ }
531
+ stashDir = path.join(home, "agentikit");
532
+ }
533
+ let created = false;
534
+ if (!fs.existsSync(stashDir)) {
535
+ fs.mkdirSync(stashDir, { recursive: true });
536
+ created = true;
537
+ }
538
+ for (const sub of ["tools", "skills", "commands", "agents"]) {
539
+ const subDir = path.join(stashDir, sub);
540
+ if (!fs.existsSync(subDir)) {
541
+ fs.mkdirSync(subDir, { recursive: true });
542
+ }
543
+ }
544
+ let envSet = false;
545
+ let profileUpdated;
546
+ if (IS_WINDOWS) {
547
+ const result = spawnSync("setx", ["AGENTIKIT_STASH_DIR", stashDir], {
548
+ encoding: "utf8",
549
+ timeout: 10_000,
550
+ });
551
+ envSet = result.status === 0;
552
+ }
553
+ else {
554
+ const shell = process.env.SHELL || "";
555
+ let profile;
556
+ if (shell.endsWith("/zsh")) {
557
+ profile = path.join(home, ".zshrc");
558
+ }
559
+ else if (shell.endsWith("/bash")) {
560
+ profile = path.join(home, ".bashrc");
561
+ }
562
+ else {
563
+ profile = path.join(home, ".profile");
564
+ }
565
+ const exportLine = `export AGENTIKIT_STASH_DIR="${stashDir}"`;
566
+ const existing = fs.existsSync(profile) ? fs.readFileSync(profile, "utf8") : "";
567
+ if (!existing.includes("AGENTIKIT_STASH_DIR")) {
568
+ fs.appendFileSync(profile, `\n# Agentikit stash directory\n${exportLine}\n`);
569
+ envSet = true;
570
+ profileUpdated = profile;
571
+ }
572
+ }
573
+ process.env.AGENTIKIT_STASH_DIR = stashDir;
574
+ return { stashDir, created, envSet, profileUpdated };
575
+ }
576
+ function hasErrnoCode(error, code) {
577
+ if (typeof error !== "object" || error === null || !("code" in error))
578
+ return false;
579
+ return error.code === code;
580
+ }
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "agentikit",
3
+ "version": "0.0.3",
4
+ "type": "module",
5
+ "description": "Search, open, and run extension assets from a stash directory. Works as both an OpenCode plugin and a Claude Code plugin.",
6
+ "keywords": [
7
+ "opencode",
8
+ "opencode-ai",
9
+ "opencode-plugin",
10
+ "opencode-extensions",
11
+ "claude-code",
12
+ "claude-code-plugin",
13
+ "agentikit",
14
+ "ai-agent",
15
+ "agent-framework",
16
+ "developer-tools",
17
+ "plugin",
18
+ "tools",
19
+ "skills",
20
+ "commands"
21
+ ],
22
+ "homepage": "https://github.com/itlackey/agentikit#readme",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/itlackey/agentikit.git"
26
+ },
27
+ "bugs": {
28
+ "url": "https://github.com/itlackey/agentikit/issues"
29
+ },
30
+ "license": "CC-BY-4.0",
31
+ "files": [
32
+ "dist",
33
+ "src",
34
+ ".claude-plugin",
35
+ "skills",
36
+ "commands",
37
+ "README.md"
38
+ ],
39
+ "bin": {
40
+ "agentikit": "dist/src/cli.js"
41
+ },
42
+ "main": "./dist/index.js",
43
+ "types": "./dist/index.d.ts",
44
+ "exports": {
45
+ ".": {
46
+ "types": "./dist/index.d.ts",
47
+ "default": "./dist/index.js"
48
+ }
49
+ },
50
+ "scripts": {
51
+ "build": "bun run tsc --project ./tsconfig.json --emitDeclarationOnly false --declaration false --outDir dist",
52
+ "build:types": "bun run tsc --project ./tsconfig.json",
53
+ "test": "bun test",
54
+ "prepublishOnly": "bun run build && bun run build:types"
55
+ },
56
+ "publishConfig": {
57
+ "access": "public"
58
+ },
59
+ "devDependencies": {
60
+ "@types/node": "^24.0.0",
61
+ "typescript": "^5.9.3"
62
+ },
63
+ "dependencies": {
64
+ "@opencode-ai/plugin": "^1.2.20"
65
+ }
66
+ }