@agentplugins/core 0.1.0 → 0.2.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/dist/store.js ADDED
@@ -0,0 +1,620 @@
1
+ /**
2
+ * AgentPlugins Universal Store
3
+ *
4
+ * Manages the universal plugin store at ~/.agents/plugins/<name>/.
5
+ * Clones plugins from GitHub, symlinks them into every detected agent harness.
6
+ * Skills.sh compatible — reads SKILL.md and scans ~/.agents/skills/.
7
+ */
8
+ import { homedir } from 'node:os';
9
+ import { join, basename } from 'node:path';
10
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, rmSync, symlinkSync, unlinkSync, lstatSync, readlinkSync, renameSync, } from 'node:fs';
11
+ import { execSync } from 'node:child_process';
12
+ // ─── Embedded Agent Registry (from spec/v1/agent-paths.json) ─────────────────
13
+ export const AGENT_PATHS = [
14
+ {
15
+ name: 'claude',
16
+ displayName: 'Claude Code',
17
+ skillPath: '~/.claude/skills',
18
+ binary: 'claude',
19
+ manifestPath: '~/.claude.json',
20
+ },
21
+ {
22
+ name: 'codex',
23
+ displayName: 'Codex CLI',
24
+ skillPath: '~/.codex/skills',
25
+ binary: 'codex',
26
+ manifestPath: '~/.codex/config.json',
27
+ },
28
+ {
29
+ name: 'opencode',
30
+ displayName: 'OpenCode',
31
+ skillPath: '~/.config/opencode/skills',
32
+ binary: 'opencode',
33
+ manifestPath: '~/.config/opencode/config.json',
34
+ },
35
+ {
36
+ name: 'kimi',
37
+ displayName: 'Kimi',
38
+ skillPath: '~/.kimi/skills',
39
+ binary: 'kimi',
40
+ manifestPath: '~/.kimi/config.json',
41
+ },
42
+ {
43
+ name: 'gemini',
44
+ displayName: 'Gemini CLI',
45
+ skillPath: '~/.gemini/skills',
46
+ binary: 'gemini',
47
+ manifestPath: '~/.gemini/settings.json',
48
+ },
49
+ {
50
+ name: 'copilot',
51
+ displayName: 'GitHub Copilot CLI',
52
+ skillPath: '~/.copilot/skills',
53
+ binary: 'copilot',
54
+ manifestPath: '~/.copilot/config.json',
55
+ },
56
+ {
57
+ name: 'pimono',
58
+ displayName: 'Pi Mono',
59
+ skillPath: '~/.pi/extensions',
60
+ binary: 'pi',
61
+ manifestPath: '~/.pi/config.json',
62
+ },
63
+ ];
64
+ // ─── Path Helpers ────────────────────────────────────────────────────────────
65
+ /** Expand ~ to the home directory */
66
+ export function expandHome(p) {
67
+ if (p.startsWith('~/'))
68
+ return join(homedir(), p.slice(2));
69
+ if (p === '~')
70
+ return homedir();
71
+ return p;
72
+ }
73
+ /** Universal plugin store path: ~/.agents/plugins */
74
+ export function getStorePath() {
75
+ return join(homedir(), '.agents', 'plugins');
76
+ }
77
+ /** Skills.sh compatibility path: ~/.agents/skills */
78
+ export function getSkillsCompatPath() {
79
+ return join(homedir(), '.agents', 'skills');
80
+ }
81
+ /** Path for a specific plugin in the store */
82
+ export function getPluginStorePath(name) {
83
+ return join(getStorePath(), name);
84
+ }
85
+ /** Path to the meta file for a plugin */
86
+ export function getMetaPath(name) {
87
+ return join(getPluginStorePath(name), '.agentplugins-meta.json');
88
+ }
89
+ // ─── Agent Detection ─────────────────────────────────────────────────────────
90
+ export function getAgentPaths() {
91
+ return AGENT_PATHS;
92
+ }
93
+ /** Check if a binary is available on PATH */
94
+ function isBinaryAvailable(binary) {
95
+ try {
96
+ const cmd = process.platform === 'win32' ? `where ${binary}` : `which ${binary}`;
97
+ execSync(cmd, { stdio: 'ignore' });
98
+ return true;
99
+ }
100
+ catch {
101
+ return false;
102
+ }
103
+ }
104
+ /**
105
+ * Detect installed agent harnesses.
106
+ * An agent is "detected" if its binary is on PATH or its skillPath exists.
107
+ */
108
+ export function detectAgents() {
109
+ return AGENT_PATHS.map((entry) => {
110
+ const skillPath = expandHome(entry.skillPath);
111
+ const binaryFound = isBinaryAvailable(entry.binary);
112
+ const skillPathExists = existsSync(skillPath);
113
+ return {
114
+ name: entry.name,
115
+ displayName: entry.displayName,
116
+ skillPath,
117
+ binary: entry.binary,
118
+ binaryFound,
119
+ skillPathExists,
120
+ manifestPath: expandHome(entry.manifestPath),
121
+ };
122
+ });
123
+ }
124
+ /** Get only agents that are actually installed (binary or skill path) */
125
+ export function getDetectedAgents() {
126
+ return detectAgents().filter((a) => a.binaryFound || a.skillPathExists);
127
+ }
128
+ // ─── URL Normalization ───────────────────────────────────────────────────────
129
+ /**
130
+ * Normalize a plugin source URL.
131
+ * Accepts: https://github.com/u/r, git@github.com:u/r.git, u/r
132
+ */
133
+ export function normalizeSource(source) {
134
+ let url = source.trim();
135
+ // Shorthand: user/repo → full GitHub URL
136
+ if (!url.includes('://') && !url.startsWith('git@') && /^[a-zA-Z0-9_-]+\/[a-zA-Z0-9_.-]+$/.test(url)) {
137
+ url = `https://github.com/${url}`;
138
+ }
139
+ // SSH → HTTPS
140
+ if (url.startsWith('git@github.com:')) {
141
+ const path = url.slice('git@github.com:'.length);
142
+ url = `https://github.com/${path}`;
143
+ }
144
+ // Strip trailing .git
145
+ if (url.endsWith('.git')) {
146
+ url = url.slice(0, -4);
147
+ }
148
+ // Strip trailing slash
149
+ url = url.replace(/\/$/, '');
150
+ return url;
151
+ }
152
+ /** Extract the repo name from a GitHub URL */
153
+ export function extractRepoName(source) {
154
+ const normalized = normalizeSource(source);
155
+ const parts = normalized.split('/');
156
+ return parts[parts.length - 1] || 'unknown-plugin';
157
+ }
158
+ // ─── Store Operations ────────────────────────────────────────────────────────
159
+ /** Ensure the store and skills-compat directories exist */
160
+ export function initStore() {
161
+ mkdirSync(getStorePath(), { recursive: true });
162
+ mkdirSync(getSkillsCompatPath(), { recursive: true });
163
+ }
164
+ /**
165
+ * Clone a git repository to a destination directory.
166
+ * Returns the commit hash.
167
+ * Throws on failure.
168
+ */
169
+ export function cloneRepo(source, dest) {
170
+ const url = normalizeSource(source);
171
+ execSync(`git clone --depth 1 "${url}" "${dest}"`, { stdio: 'pipe' });
172
+ return execSync('git rev-parse HEAD', { cwd: dest, encoding: 'utf-8' }).trim();
173
+ }
174
+ /** Pull latest changes in a repo directory. Returns new commit hash. */
175
+ export function pullRepo(dir) {
176
+ execSync('git pull --ff-only', { cwd: dir, stdio: 'pipe' });
177
+ return execSync('git rev-parse HEAD', { cwd: dir, encoding: 'utf-8' }).trim();
178
+ }
179
+ // ─── Manifest Finding ────────────────────────────────────────────────────────
180
+ const MANIFEST_CANDIDATES = [
181
+ 'agentplugins.config.json',
182
+ 'manifest.json',
183
+ 'package.json',
184
+ ];
185
+ /**
186
+ * Find and parse a JSON manifest in a directory.
187
+ * Does NOT handle TypeScript configs (callers should use jiti for those).
188
+ * Falls back to SKILL.md synthesis for Skills.sh compatibility.
189
+ */
190
+ export function findManifestInDir(dir) {
191
+ // Try JSON manifests
192
+ for (const candidate of MANIFEST_CANDIDATES) {
193
+ const fullPath = join(dir, candidate);
194
+ if (existsSync(fullPath)) {
195
+ try {
196
+ const raw = readFileSync(fullPath, 'utf-8');
197
+ const data = JSON.parse(raw);
198
+ // For package.json, extract the manifest-like fields
199
+ if (candidate === 'package.json') {
200
+ if (!data['name'] || typeof data['name'] !== 'string')
201
+ continue;
202
+ const manifest = {
203
+ name: data['name'],
204
+ version: data['version'] || '0.0.0',
205
+ description: data['description'] || `Plugin ${data['name']}`,
206
+ };
207
+ // Check for agentplugins field in package.json
208
+ if (data['agentplugins'] && typeof data['agentplugins'] === 'object') {
209
+ Object.assign(manifest, data['agentplugins']);
210
+ }
211
+ return { path: candidate, manifest, type: 'json' };
212
+ }
213
+ // Validate it has a name field
214
+ if (!data['name'])
215
+ continue;
216
+ return { path: candidate, manifest: data, type: 'json' };
217
+ }
218
+ catch {
219
+ continue;
220
+ }
221
+ }
222
+ }
223
+ // Try SKILL.md (Skills.sh compatibility)
224
+ const skillPath = join(dir, 'SKILL.md');
225
+ if (existsSync(skillPath)) {
226
+ const content = readFileSync(skillPath, 'utf-8');
227
+ const manifest = synthesizeFromSkillMd(content, basename(dir));
228
+ return { path: 'SKILL.md', manifest, type: 'skill-md' };
229
+ }
230
+ return null;
231
+ }
232
+ /** Synthesize a minimal manifest from a SKILL.md file (Skills.sh compat) */
233
+ function synthesizeFromSkillMd(content, fallbackName) {
234
+ // Parse YAML frontmatter if present
235
+ let name = fallbackName;
236
+ let description = `Skills.sh plugin: ${fallbackName}`;
237
+ const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
238
+ if (fmMatch) {
239
+ const frontmatter = fmMatch[1];
240
+ const nameMatch = frontmatter.match(/^name:\s*(.+)$/m);
241
+ const descMatch = frontmatter.match(/^description:\s*(.+)$/m);
242
+ if (nameMatch)
243
+ name = nameMatch[1].trim();
244
+ if (descMatch)
245
+ description = descMatch[1].trim();
246
+ }
247
+ return {
248
+ name,
249
+ version: '0.0.0',
250
+ description,
251
+ skills: [{ name, description, content }],
252
+ };
253
+ }
254
+ // ─── Plugin Meta ─────────────────────────────────────────────────────────────
255
+ /** Read the meta file for a plugin */
256
+ export function readMeta(name) {
257
+ const metaPath = getMetaPath(name);
258
+ if (!existsSync(metaPath))
259
+ return null;
260
+ try {
261
+ return JSON.parse(readFileSync(metaPath, 'utf-8'));
262
+ }
263
+ catch {
264
+ return null;
265
+ }
266
+ }
267
+ /** Write the meta file for a plugin */
268
+ export function writeMeta(meta) {
269
+ const metaPath = getMetaPath(meta.name);
270
+ writeFileSync(metaPath, JSON.stringify(meta, null, 2), 'utf-8');
271
+ }
272
+ /**
273
+ * Install a plugin into the store from a cloned directory.
274
+ * Moves the directory to the store, writes meta, creates symlinks.
275
+ */
276
+ export function installPlugin(cloneDir, opts) {
277
+ initStore();
278
+ const storePath = getPluginStorePath(opts.name);
279
+ // Remove existing if present
280
+ if (existsSync(storePath)) {
281
+ // Unlink existing symlinks first
282
+ for (const agent of getDetectedAgents()) {
283
+ unlinkPluginSymlink(opts.name, agent);
284
+ }
285
+ rmSync(storePath, { recursive: true, force: true });
286
+ }
287
+ // Move clone to store
288
+ renameSync(cloneDir, storePath);
289
+ // Write meta
290
+ const now = new Date().toISOString();
291
+ const meta = {
292
+ name: opts.name,
293
+ source: normalizeSource(opts.source),
294
+ commit: opts.commit,
295
+ installedAt: now,
296
+ updatedAt: now,
297
+ manifestPath: opts.manifestPath,
298
+ version: opts.version,
299
+ };
300
+ writeFileSync(getMetaPath(opts.name), JSON.stringify(meta, null, 2), 'utf-8');
301
+ // Create symlinks
302
+ const symlinks = [];
303
+ if (opts.symlink !== false) {
304
+ const agents = getDetectedAgents();
305
+ for (const agent of agents) {
306
+ const info = symlinkPlugin(opts.name, agent);
307
+ if (info)
308
+ symlinks.push(info);
309
+ }
310
+ }
311
+ return { meta, symlinks };
312
+ }
313
+ /**
314
+ * Full add flow: clone from source, find manifest, install.
315
+ * Returns null if no manifest is found (caller can try TS loading).
316
+ */
317
+ export function addPluginFromSource(source) {
318
+ initStore();
319
+ const repoName = extractRepoName(source);
320
+ const tempDir = join(getStorePath(), `.tmp-${repoName}-${Date.now()}`);
321
+ // Clean up temp dir if it exists
322
+ if (existsSync(tempDir))
323
+ rmSync(tempDir, { recursive: true, force: true });
324
+ // Clone
325
+ const commit = cloneRepo(source, tempDir);
326
+ // Find manifest
327
+ const manifestResult = findManifestInDir(tempDir);
328
+ if (!manifestResult) {
329
+ // Return null — caller may try TS config via jiti
330
+ return null;
331
+ }
332
+ const name = manifestResult.manifest['name'];
333
+ const version = manifestResult.manifest['version'] || '0.0.0';
334
+ return installPlugin(tempDir, {
335
+ source,
336
+ name,
337
+ commit,
338
+ manifestPath: manifestResult.path,
339
+ version,
340
+ });
341
+ }
342
+ /** Remove a plugin: unlink all symlinks, delete from store */
343
+ export function removePlugin(name) {
344
+ const storePath = getPluginStorePath(name);
345
+ if (!existsSync(storePath)) {
346
+ throw new Error(`Plugin "${name}" is not installed`);
347
+ }
348
+ // Unlink symlinks from all agents
349
+ for (const agent of detectAgents()) {
350
+ unlinkPluginSymlink(name, agent);
351
+ }
352
+ // Also unlink from skills-compat
353
+ const skillsLink = join(getSkillsCompatPath(), name);
354
+ if (existsSync(skillsLink)) {
355
+ unlinkSync(skillsLink);
356
+ }
357
+ // Remove from store
358
+ rmSync(storePath, { recursive: true, force: true });
359
+ }
360
+ /** List all installed plugins */
361
+ export function listPlugins() {
362
+ const storePath = getStorePath();
363
+ if (!existsSync(storePath))
364
+ return [];
365
+ const agents = detectAgents();
366
+ const entries = readdirSync(storePath);
367
+ return entries
368
+ .filter((entry) => !entry.startsWith('.tmp-'))
369
+ .map((name) => {
370
+ const pluginPath = join(storePath, name);
371
+ if (!lstatSync(pluginPath).isDirectory())
372
+ return null;
373
+ const meta = readMeta(name);
374
+ const symlinks = getSymlinks(name, agents);
375
+ // Try to parse manifest
376
+ let manifest = null;
377
+ if (meta) {
378
+ const manifestFullPath = join(pluginPath, meta.manifestPath);
379
+ if (existsSync(manifestFullPath)) {
380
+ try {
381
+ if (meta.manifestPath.endsWith('.json') || meta.manifestPath === 'package.json') {
382
+ manifest = JSON.parse(readFileSync(manifestFullPath, 'utf-8'));
383
+ }
384
+ else if (meta.manifestPath === 'SKILL.md') {
385
+ const result = findManifestInDir(pluginPath);
386
+ manifest = result?.manifest ?? null;
387
+ }
388
+ }
389
+ catch {
390
+ manifest = null;
391
+ }
392
+ }
393
+ }
394
+ return {
395
+ meta: meta ?? {
396
+ name,
397
+ source: 'unknown',
398
+ commit: 'unknown',
399
+ installedAt: 'unknown',
400
+ updatedAt: 'unknown',
401
+ manifestPath: 'unknown',
402
+ version: 'unknown',
403
+ },
404
+ path: pluginPath,
405
+ manifest,
406
+ symlinks,
407
+ };
408
+ })
409
+ .filter((p) => p !== null);
410
+ }
411
+ /** Get detailed info about a single plugin */
412
+ export function getPluginInfo(name) {
413
+ const storePath = getPluginStorePath(name);
414
+ if (!existsSync(storePath))
415
+ return null;
416
+ const meta = readMeta(name);
417
+ const agents = detectAgents();
418
+ const symlinks = getSymlinks(name, agents);
419
+ let manifest = null;
420
+ if (meta) {
421
+ const manifestFullPath = join(storePath, meta.manifestPath);
422
+ if (existsSync(manifestFullPath)) {
423
+ try {
424
+ if (meta.manifestPath.endsWith('.json') || meta.manifestPath === 'package.json') {
425
+ manifest = JSON.parse(readFileSync(manifestFullPath, 'utf-8'));
426
+ }
427
+ else if (meta.manifestPath === 'SKILL.md') {
428
+ const result = findManifestInDir(storePath);
429
+ manifest = result?.manifest ?? null;
430
+ }
431
+ }
432
+ catch {
433
+ manifest = null;
434
+ }
435
+ }
436
+ }
437
+ return {
438
+ meta: meta ?? {
439
+ name,
440
+ source: 'unknown',
441
+ commit: 'unknown',
442
+ installedAt: 'unknown',
443
+ updatedAt: 'unknown',
444
+ manifestPath: 'unknown',
445
+ version: 'unknown',
446
+ },
447
+ path: storePath,
448
+ manifest,
449
+ symlinks,
450
+ };
451
+ }
452
+ /** Update a plugin: git pull + update meta + refresh symlinks */
453
+ export function updatePlugin(name) {
454
+ const storePath = getPluginStorePath(name);
455
+ if (!existsSync(storePath)) {
456
+ throw new Error(`Plugin "${name}" is not installed`);
457
+ }
458
+ const oldMeta = readMeta(name);
459
+ if (!oldMeta) {
460
+ throw new Error(`Plugin "${name}" has no meta file — corrupted install`);
461
+ }
462
+ // Pull latest
463
+ const newCommit = pullRepo(storePath);
464
+ // Re-find manifest (in case it changed)
465
+ const manifestResult = findManifestInDir(storePath);
466
+ const version = manifestResult?.manifest['version'] || oldMeta.version;
467
+ const manifestPath = manifestResult?.path || oldMeta.manifestPath;
468
+ const updatedMeta = {
469
+ ...oldMeta,
470
+ commit: newCommit,
471
+ updatedAt: new Date().toISOString(),
472
+ version,
473
+ manifestPath,
474
+ };
475
+ writeFileSync(getMetaPath(name), JSON.stringify(updatedMeta, null, 2), 'utf-8');
476
+ // Refresh symlinks
477
+ for (const agent of getDetectedAgents()) {
478
+ unlinkPluginSymlink(name, agent);
479
+ symlinkPlugin(name, agent);
480
+ }
481
+ return updatedMeta;
482
+ }
483
+ // ─── Symlink Operations ──────────────────────────────────────────────────────
484
+ /**
485
+ * Create a symlink from agent's skillPath to the plugin store dir.
486
+ * Returns null if the agent's skillPath doesn't exist.
487
+ */
488
+ export function symlinkPlugin(pluginName, agent) {
489
+ if (!agent.skillPathExists && !agent.binaryFound)
490
+ return null;
491
+ // Ensure the agent's skillPath exists
492
+ mkdirSync(agent.skillPath, { recursive: true });
493
+ const linkPath = join(agent.skillPath, pluginName);
494
+ const targetPath = getPluginStorePath(pluginName);
495
+ // Remove existing symlink/file if present
496
+ if (existsSync(linkPath) || isSymlink(linkPath)) {
497
+ try {
498
+ unlinkSync(linkPath);
499
+ }
500
+ catch {
501
+ rmSync(linkPath, { recursive: true, force: true });
502
+ }
503
+ }
504
+ // Create symlink (relative for portability)
505
+ try {
506
+ symlinkSync(targetPath, linkPath, 'dir');
507
+ }
508
+ catch {
509
+ // If symlink fails (e.g., permissions on Windows), return null
510
+ return null;
511
+ }
512
+ return {
513
+ agent: agent.name,
514
+ agentDisplayName: agent.displayName,
515
+ linkPath,
516
+ targetPath,
517
+ valid: existsSync(targetPath),
518
+ };
519
+ }
520
+ /** Remove a plugin's symlink from an agent's skillPath */
521
+ export function unlinkPluginSymlink(pluginName, agent) {
522
+ const linkPath = join(agent.skillPath, pluginName);
523
+ if (isSymlink(linkPath)) {
524
+ try {
525
+ unlinkSync(linkPath);
526
+ }
527
+ catch {
528
+ // ignore
529
+ }
530
+ }
531
+ else if (existsSync(linkPath) && lstatSync(linkPath).isDirectory()) {
532
+ // Not a symlink but a real dir — leave it alone
533
+ }
534
+ }
535
+ /** Get all symlinks for a plugin across agents */
536
+ export function getSymlinks(pluginName, agents) {
537
+ const detectedAgents = agents ?? detectAgents();
538
+ const results = [];
539
+ for (const agent of detectedAgents) {
540
+ const linkPath = join(agent.skillPath, pluginName);
541
+ if (isSymlink(linkPath)) {
542
+ const targetPath = readlinkSync(linkPath);
543
+ results.push({
544
+ agent: agent.name,
545
+ agentDisplayName: agent.displayName,
546
+ linkPath,
547
+ targetPath,
548
+ valid: existsSync(targetPath),
549
+ });
550
+ }
551
+ else if (existsSync(linkPath) && lstatSync(linkPath).isDirectory()) {
552
+ // Real directory (not a symlink) — report it as a non-symlink install
553
+ results.push({
554
+ agent: agent.name,
555
+ agentDisplayName: agent.displayName,
556
+ linkPath,
557
+ targetPath: linkPath,
558
+ valid: true,
559
+ });
560
+ }
561
+ }
562
+ return results;
563
+ }
564
+ /** Check if a path is a symlink */
565
+ function isSymlink(p) {
566
+ try {
567
+ return lstatSync(p).isSymbolicLink();
568
+ }
569
+ catch {
570
+ return false;
571
+ }
572
+ }
573
+ /** Run diagnostics on the store, agents, and symlinks */
574
+ export function runDoctor() {
575
+ const storePath = getStorePath();
576
+ const skillsCompatPath = getSkillsCompatPath();
577
+ const storeExists = existsSync(storePath);
578
+ const skillsCompatExists = existsSync(skillsCompatPath);
579
+ const agents = detectAgents();
580
+ const plugins = listPlugins();
581
+ const issues = [];
582
+ // Store checks
583
+ if (!storeExists) {
584
+ issues.push({ level: 'info', message: 'Plugin store does not exist yet — run `agentplugins add` to create it' });
585
+ }
586
+ // Skills compat
587
+ if (!skillsCompatExists) {
588
+ issues.push({ level: 'info', message: 'Skills.sh compat directory does not exist yet' });
589
+ }
590
+ // Agent checks
591
+ const detectedCount = agents.filter((a) => a.binaryFound || a.skillPathExists).length;
592
+ if (detectedCount === 0) {
593
+ issues.push({ level: 'warning', message: 'No agent harnesses detected — install Claude, Codex, or another supported agent' });
594
+ }
595
+ for (const agent of agents) {
596
+ if (agent.binaryFound && !agent.skillPathExists) {
597
+ issues.push({ level: 'info', message: `${agent.displayName} binary found but skill path (${agent.skillPath}) does not exist — will be created on first add` });
598
+ }
599
+ }
600
+ // Symlink checks
601
+ for (const plugin of plugins) {
602
+ const invalidSymlinks = plugin.symlinks.filter((s) => !s.valid);
603
+ for (const s of invalidSymlinks) {
604
+ issues.push({ level: 'error', message: `Plugin "${plugin.meta.name}" has a broken symlink for ${s.agentDisplayName}: ${s.linkPath}` });
605
+ }
606
+ if (plugin.symlinks.length === 0 && detectedCount > 0) {
607
+ issues.push({ level: 'warning', message: `Plugin "${plugin.meta.name}" has no symlinks — run \`agentplugins update ${plugin.meta.name}\` to fix` });
608
+ }
609
+ }
610
+ return {
611
+ storePath,
612
+ storeExists,
613
+ skillsCompatPath,
614
+ skillsCompatExists,
615
+ agents,
616
+ plugins,
617
+ issues,
618
+ };
619
+ }
620
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}