skillstore 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +11 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/add.d.ts +41 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +374 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/check.d.ts +12 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +133 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/generate-lock.d.ts +17 -0
- package/dist/commands/generate-lock.d.ts.map +1 -0
- package/dist/commands/generate-lock.js +134 -0
- package/dist/commands/generate-lock.js.map +1 -0
- package/dist/commands/install.js +44 -20
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/list.d.ts +12 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +97 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/update.d.ts +22 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +203 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/lib/agents.d.ts +38 -0
- package/dist/lib/agents.d.ts.map +1 -0
- package/dist/lib/agents.js +223 -0
- package/dist/lib/agents.js.map +1 -0
- package/dist/lib/installer.d.ts +82 -0
- package/dist/lib/installer.d.ts.map +1 -0
- package/dist/lib/installer.js +226 -0
- package/dist/lib/installer.js.map +1 -0
- package/dist/lib/plugin-verify.d.ts +19 -0
- package/dist/lib/plugin-verify.d.ts.map +1 -1
- package/dist/lib/plugin-verify.js +66 -0
- package/dist/lib/plugin-verify.js.map +1 -1
- package/dist/lib/skill-api.d.ts +18 -0
- package/dist/lib/skill-api.d.ts.map +1 -1
- package/dist/lib/skill-api.js +31 -0
- package/dist/lib/skill-api.js.map +1 -1
- package/dist/lib/skill-lock.d.ts +64 -0
- package/dist/lib/skill-lock.d.ts.map +1 -0
- package/dist/lib/skill-lock.js +101 -0
- package/dist/lib/skill-lock.js.map +1 -0
- package/package.json +6 -1
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { defineCommand } from 'citty';
|
|
2
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { getAllLockedSkills, addToLock } from '../lib/skill-lock.js';
|
|
5
|
+
import { fetchSkillManifest, downloadSkillZip, SkillApiError } from '../lib/skill-api.js';
|
|
6
|
+
import { verifySkillManifest, verifyZipHash } from '../lib/plugin-verify.js';
|
|
7
|
+
import { getPluginConfig } from '../lib/plugin-config.js';
|
|
8
|
+
import { logger } from '../lib/plugin-logger.js';
|
|
9
|
+
import { detectInstalledAgents, agents, CANONICAL_SKILLS_DIR } from '../lib/agents.js';
|
|
10
|
+
import { installToAgents, getCanonicalSkillPath } from '../lib/installer.js';
|
|
11
|
+
import { reportSkillInstall } from '../lib/plugin-api.js';
|
|
12
|
+
/**
|
|
13
|
+
* Update installed skills
|
|
14
|
+
*/
|
|
15
|
+
export default defineCommand({
|
|
16
|
+
meta: {
|
|
17
|
+
name: 'update',
|
|
18
|
+
description: 'Update installed skills to latest versions',
|
|
19
|
+
},
|
|
20
|
+
args: {
|
|
21
|
+
slug: {
|
|
22
|
+
type: 'positional',
|
|
23
|
+
description: 'Specific skill to update (optional, updates all if not specified)',
|
|
24
|
+
required: false,
|
|
25
|
+
},
|
|
26
|
+
'skip-verify': {
|
|
27
|
+
type: 'boolean',
|
|
28
|
+
description: 'Skip manifest signature verification',
|
|
29
|
+
default: false,
|
|
30
|
+
},
|
|
31
|
+
'dry-run': {
|
|
32
|
+
type: 'boolean',
|
|
33
|
+
description: 'Show what would be updated without actually updating',
|
|
34
|
+
default: false,
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
async run({ args }) {
|
|
38
|
+
const { slug, 'skip-verify': skipVerify, 'dry-run': dryRun } = args;
|
|
39
|
+
try {
|
|
40
|
+
const skills = await getAllLockedSkills();
|
|
41
|
+
if (skills.length === 0) {
|
|
42
|
+
logger.info('No skills installed.');
|
|
43
|
+
console.log('');
|
|
44
|
+
console.log('To add a skill, run:');
|
|
45
|
+
console.log(' npx skillstore add <skill-slug>');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// Filter to specific skill if provided
|
|
49
|
+
let skillsToCheck;
|
|
50
|
+
if (slug) {
|
|
51
|
+
const found = skills.find((s) => s.slug === slug);
|
|
52
|
+
if (!found) {
|
|
53
|
+
logger.error(`Skill "${slug}" is not installed.`);
|
|
54
|
+
console.log('');
|
|
55
|
+
console.log('Installed skills:');
|
|
56
|
+
for (const s of skills) {
|
|
57
|
+
console.log(` - ${s.slug}`);
|
|
58
|
+
}
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
skillsToCheck = [found];
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
skillsToCheck = skills;
|
|
65
|
+
}
|
|
66
|
+
const config = getPluginConfig({
|
|
67
|
+
installDir: CANONICAL_SKILLS_DIR,
|
|
68
|
+
skipVerify,
|
|
69
|
+
dryRun,
|
|
70
|
+
});
|
|
71
|
+
logger.info(`Checking ${skillsToCheck.length} skill${skillsToCheck.length > 1 ? 's' : ''} for updates...`);
|
|
72
|
+
if (dryRun) {
|
|
73
|
+
logger.warn('Dry run mode - no files will be written');
|
|
74
|
+
}
|
|
75
|
+
// Find skills that need updates
|
|
76
|
+
const updates = [];
|
|
77
|
+
for (const skill of skillsToCheck) {
|
|
78
|
+
try {
|
|
79
|
+
const manifest = await fetchSkillManifest(config, skill.slug);
|
|
80
|
+
if (skill.zipHash !== manifest.skill.zipHash) {
|
|
81
|
+
updates.push({
|
|
82
|
+
skill,
|
|
83
|
+
latestVersion: manifest.skill.version,
|
|
84
|
+
latestHash: manifest.skill.zipHash,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
if (err instanceof SkillApiError && err.statusCode === 404) {
|
|
90
|
+
logger.warn(`Skill "${skill.slug}" no longer available, skipping`);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
logger.warn(`Failed to check "${skill.slug}": ${err instanceof Error ? err.message : 'Unknown error'}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (updates.length === 0) {
|
|
98
|
+
logger.success('All skills are up to date!');
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
console.log('');
|
|
102
|
+
console.log(`Updates available (${updates.length}):`);
|
|
103
|
+
for (const update of updates) {
|
|
104
|
+
console.log(` - ${update.skill.slug} v${update.skill.version} → v${update.latestVersion}`);
|
|
105
|
+
}
|
|
106
|
+
console.log('');
|
|
107
|
+
if (dryRun) {
|
|
108
|
+
logger.success('Dry run complete - no files were written');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
// Detect agents for symlinking
|
|
112
|
+
let targetAgents = detectInstalledAgents();
|
|
113
|
+
if (targetAgents.length === 0) {
|
|
114
|
+
targetAgents = [agents['claude-code']];
|
|
115
|
+
}
|
|
116
|
+
// Update each skill
|
|
117
|
+
let successCount = 0;
|
|
118
|
+
let failCount = 0;
|
|
119
|
+
for (const update of updates) {
|
|
120
|
+
const { skill, latestVersion } = update;
|
|
121
|
+
try {
|
|
122
|
+
logger.startSpinner(`Updating ${skill.slug}...`);
|
|
123
|
+
// Fetch manifest
|
|
124
|
+
const manifest = await fetchSkillManifest(config, skill.slug);
|
|
125
|
+
// Verify manifest signature
|
|
126
|
+
if (!skipVerify) {
|
|
127
|
+
const verifyResult = await verifySkillManifest(manifest);
|
|
128
|
+
if (!verifyResult.valid) {
|
|
129
|
+
logger.spinnerError(`${skill.slug}: Manifest verification failed`);
|
|
130
|
+
failCount++;
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Download ZIP
|
|
135
|
+
const zipBuffer = await downloadSkillZip(config, skill.slug);
|
|
136
|
+
// Verify ZIP hash
|
|
137
|
+
if (!skipVerify) {
|
|
138
|
+
if (!verifyZipHash(zipBuffer, manifest.skill.zipHash)) {
|
|
139
|
+
logger.spinnerError(`${skill.slug}: Content verification failed`);
|
|
140
|
+
failCount++;
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Extract to canonical location
|
|
145
|
+
const canonicalPath = getCanonicalSkillPath(skill.slug);
|
|
146
|
+
await extractZip(zipBuffer, canonicalPath);
|
|
147
|
+
// Update symlinks (in case agents changed)
|
|
148
|
+
await installToAgents(skill.slug, targetAgents, { global: true });
|
|
149
|
+
// Update lock file
|
|
150
|
+
await addToLock({
|
|
151
|
+
slug: skill.slug,
|
|
152
|
+
version: manifest.skill.version,
|
|
153
|
+
zipHash: manifest.skill.zipHash,
|
|
154
|
+
source: 'skillstore',
|
|
155
|
+
installedAt: skill.installedAt,
|
|
156
|
+
});
|
|
157
|
+
// Report telemetry
|
|
158
|
+
try {
|
|
159
|
+
await reportSkillInstall(config, skill.slug);
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// Ignore telemetry errors
|
|
163
|
+
}
|
|
164
|
+
logger.spinnerSuccess(`${skill.slug}: v${skill.version} → v${latestVersion}`);
|
|
165
|
+
successCount++;
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
logger.spinnerError(`${skill.slug}: ${err instanceof Error ? err.message : 'Unknown error'}`);
|
|
169
|
+
failCount++;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
console.log('');
|
|
173
|
+
if (failCount > 0) {
|
|
174
|
+
logger.warn(`Updated ${successCount} skill${successCount !== 1 ? 's' : ''}, ${failCount} failed`);
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
logger.success(`Updated ${successCount} skill${successCount !== 1 ? 's' : ''} successfully!`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
logger.stopSpinner();
|
|
183
|
+
logger.error('Update failed', err instanceof Error ? err : undefined);
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
/**
|
|
189
|
+
* Extract ZIP buffer to directory
|
|
190
|
+
*/
|
|
191
|
+
async function extractZip(buffer, targetDir) {
|
|
192
|
+
const { unzipSync } = await import('fflate');
|
|
193
|
+
const data = new Uint8Array(buffer);
|
|
194
|
+
const unzipped = unzipSync(data);
|
|
195
|
+
for (const [path, content] of Object.entries(unzipped)) {
|
|
196
|
+
if (path.endsWith('/'))
|
|
197
|
+
continue;
|
|
198
|
+
const fullPath = join(targetDir, path);
|
|
199
|
+
await mkdir(dirname(fullPath), { recursive: true });
|
|
200
|
+
await writeFile(fullPath, Buffer.from(content));
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Registry
|
|
3
|
+
*
|
|
4
|
+
* Defines supported AI coding agents and their skill installation paths.
|
|
5
|
+
* Based on add-skill (skills.sh) agent definitions.
|
|
6
|
+
*/
|
|
7
|
+
/** Agent configuration */
|
|
8
|
+
export interface AgentConfig {
|
|
9
|
+
/** Unique identifier (e.g., 'claude-code') */
|
|
10
|
+
id: string;
|
|
11
|
+
/** Display name (e.g., 'Claude Code') */
|
|
12
|
+
name: string;
|
|
13
|
+
/** Project-level skills directory (relative path) */
|
|
14
|
+
projectPath: string;
|
|
15
|
+
/** Global skills directory (absolute path) */
|
|
16
|
+
globalPath: string;
|
|
17
|
+
/** Check if this agent is installed */
|
|
18
|
+
detectInstalled: () => boolean;
|
|
19
|
+
}
|
|
20
|
+
/** All supported agent IDs */
|
|
21
|
+
export type AgentId = 'amp' | 'antigravity' | 'claude-code' | 'clawdbot' | 'cline' | 'codex' | 'command-code' | 'continue' | 'crush' | 'cursor' | 'droid' | 'gemini-cli' | 'github-copilot' | 'goose' | 'kilo' | 'kiro-cli' | 'mcpjam' | 'opencode' | 'openhands' | 'pi' | 'qoder' | 'qwen-code' | 'roo' | 'trae' | 'windsurf' | 'zencoder' | 'neovate';
|
|
22
|
+
/** Canonical skill storage location (shared across agents) */
|
|
23
|
+
export declare const CANONICAL_SKILLS_DIR: string;
|
|
24
|
+
/** Lock file location */
|
|
25
|
+
export declare const LOCK_FILE_PATH: string;
|
|
26
|
+
/** All supported agents */
|
|
27
|
+
export declare const agents: Record<AgentId, AgentConfig>;
|
|
28
|
+
/** Get all agent IDs */
|
|
29
|
+
export declare function getAllAgentIds(): AgentId[];
|
|
30
|
+
/** Get agent config by ID */
|
|
31
|
+
export declare function getAgentById(id: AgentId): AgentConfig;
|
|
32
|
+
/** Detect which agents are installed on this system */
|
|
33
|
+
export declare function detectInstalledAgents(): AgentConfig[];
|
|
34
|
+
/** Get agent configs by IDs */
|
|
35
|
+
export declare function getAgentsByIds(ids: AgentId[]): AgentConfig[];
|
|
36
|
+
/** Check if an agent ID is valid */
|
|
37
|
+
export declare function isValidAgentId(id: string): id is AgentId;
|
|
38
|
+
//# sourceMappingURL=agents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,0BAA0B;AAC1B,MAAM,WAAW,WAAW;IAC3B,8CAA8C;IAC9C,EAAE,EAAE,MAAM,CAAC;IACX,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,eAAe,EAAE,MAAM,OAAO,CAAC;CAC/B;AAED,8BAA8B;AAC9B,MAAM,MAAM,OAAO,GAChB,KAAK,GACL,aAAa,GACb,aAAa,GACb,UAAU,GACV,OAAO,GACP,OAAO,GACP,cAAc,GACd,UAAU,GACV,OAAO,GACP,QAAQ,GACR,OAAO,GACP,YAAY,GACZ,gBAAgB,GAChB,OAAO,GACP,MAAM,GACN,UAAU,GACV,QAAQ,GACR,UAAU,GACV,WAAW,GACX,IAAI,GACJ,OAAO,GACP,WAAW,GACX,KAAK,GACL,MAAM,GACN,UAAU,GACV,UAAU,GACV,SAAS,CAAC;AAKb,8DAA8D;AAC9D,eAAO,MAAM,oBAAoB,QAAkC,CAAC;AAEpE,yBAAyB;AACzB,eAAO,MAAM,cAAc,QAA4C,CAAC;AAExE,2BAA2B;AAC3B,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,CAmM/C,CAAC;AAEF,wBAAwB;AACxB,wBAAgB,cAAc,IAAI,OAAO,EAAE,CAE1C;AAED,6BAA6B;AAC7B,wBAAgB,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,WAAW,CAErD;AAED,uDAAuD;AACvD,wBAAgB,qBAAqB,IAAI,WAAW,EAAE,CAErD;AAED,+BAA+B;AAC/B,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAE5D;AAED,oCAAoC;AACpC,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,OAAO,CAExD"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
const home = homedir();
|
|
5
|
+
const codexHome = process.env.CODEX_HOME?.trim() || join(home, '.codex');
|
|
6
|
+
/** Canonical skill storage location (shared across agents) */
|
|
7
|
+
export const CANONICAL_SKILLS_DIR = join(home, '.agents', 'skills');
|
|
8
|
+
/** Lock file location */
|
|
9
|
+
export const LOCK_FILE_PATH = join(home, '.agents', '.skill-lock.json');
|
|
10
|
+
/** All supported agents */
|
|
11
|
+
export const agents = {
|
|
12
|
+
amp: {
|
|
13
|
+
id: 'amp',
|
|
14
|
+
name: 'Amp',
|
|
15
|
+
projectPath: '.agents/skills',
|
|
16
|
+
globalPath: join(home, '.config/agents/skills'),
|
|
17
|
+
detectInstalled: () => existsSync(join(home, '.config/amp')),
|
|
18
|
+
},
|
|
19
|
+
antigravity: {
|
|
20
|
+
id: 'antigravity',
|
|
21
|
+
name: 'Antigravity',
|
|
22
|
+
projectPath: '.agent/skills',
|
|
23
|
+
globalPath: join(home, '.gemini/antigravity/global_skills'),
|
|
24
|
+
detectInstalled: () => existsSync(join(process.cwd(), '.agent')) ||
|
|
25
|
+
existsSync(join(home, '.gemini/antigravity')),
|
|
26
|
+
},
|
|
27
|
+
'claude-code': {
|
|
28
|
+
id: 'claude-code',
|
|
29
|
+
name: 'Claude Code',
|
|
30
|
+
projectPath: '.claude/skills',
|
|
31
|
+
globalPath: join(home, '.claude/skills'),
|
|
32
|
+
detectInstalled: () => existsSync(join(home, '.claude')),
|
|
33
|
+
},
|
|
34
|
+
clawdbot: {
|
|
35
|
+
id: 'clawdbot',
|
|
36
|
+
name: 'Clawdbot',
|
|
37
|
+
projectPath: 'skills',
|
|
38
|
+
globalPath: join(home, '.clawdbot/skills'),
|
|
39
|
+
detectInstalled: () => existsSync(join(home, '.clawdbot')),
|
|
40
|
+
},
|
|
41
|
+
cline: {
|
|
42
|
+
id: 'cline',
|
|
43
|
+
name: 'Cline',
|
|
44
|
+
projectPath: '.cline/skills',
|
|
45
|
+
globalPath: join(home, '.cline/skills'),
|
|
46
|
+
detectInstalled: () => existsSync(join(home, '.cline')),
|
|
47
|
+
},
|
|
48
|
+
codex: {
|
|
49
|
+
id: 'codex',
|
|
50
|
+
name: 'Codex',
|
|
51
|
+
projectPath: '.codex/skills',
|
|
52
|
+
globalPath: join(codexHome, 'skills'),
|
|
53
|
+
detectInstalled: () => existsSync(codexHome) || existsSync('/etc/codex'),
|
|
54
|
+
},
|
|
55
|
+
'command-code': {
|
|
56
|
+
id: 'command-code',
|
|
57
|
+
name: 'Command Code',
|
|
58
|
+
projectPath: '.commandcode/skills',
|
|
59
|
+
globalPath: join(home, '.commandcode/skills'),
|
|
60
|
+
detectInstalled: () => existsSync(join(home, '.commandcode')),
|
|
61
|
+
},
|
|
62
|
+
continue: {
|
|
63
|
+
id: 'continue',
|
|
64
|
+
name: 'Continue',
|
|
65
|
+
projectPath: '.continue/skills',
|
|
66
|
+
globalPath: join(home, '.continue/skills'),
|
|
67
|
+
detectInstalled: () => existsSync(join(process.cwd(), '.continue')) || existsSync(join(home, '.continue')),
|
|
68
|
+
},
|
|
69
|
+
crush: {
|
|
70
|
+
id: 'crush',
|
|
71
|
+
name: 'Crush',
|
|
72
|
+
projectPath: '.crush/skills',
|
|
73
|
+
globalPath: join(home, '.config/crush/skills'),
|
|
74
|
+
detectInstalled: () => existsSync(join(home, '.config/crush')),
|
|
75
|
+
},
|
|
76
|
+
cursor: {
|
|
77
|
+
id: 'cursor',
|
|
78
|
+
name: 'Cursor',
|
|
79
|
+
projectPath: '.cursor/skills',
|
|
80
|
+
globalPath: join(home, '.cursor/skills'),
|
|
81
|
+
detectInstalled: () => existsSync(join(home, '.cursor')),
|
|
82
|
+
},
|
|
83
|
+
droid: {
|
|
84
|
+
id: 'droid',
|
|
85
|
+
name: 'Droid',
|
|
86
|
+
projectPath: '.factory/skills',
|
|
87
|
+
globalPath: join(home, '.factory/skills'),
|
|
88
|
+
detectInstalled: () => existsSync(join(home, '.factory')),
|
|
89
|
+
},
|
|
90
|
+
'gemini-cli': {
|
|
91
|
+
id: 'gemini-cli',
|
|
92
|
+
name: 'Gemini CLI',
|
|
93
|
+
projectPath: '.gemini/skills',
|
|
94
|
+
globalPath: join(home, '.gemini/skills'),
|
|
95
|
+
detectInstalled: () => existsSync(join(home, '.gemini')),
|
|
96
|
+
},
|
|
97
|
+
'github-copilot': {
|
|
98
|
+
id: 'github-copilot',
|
|
99
|
+
name: 'GitHub Copilot',
|
|
100
|
+
projectPath: '.github/skills',
|
|
101
|
+
globalPath: join(home, '.copilot/skills'),
|
|
102
|
+
detectInstalled: () => existsSync(join(process.cwd(), '.github')) || existsSync(join(home, '.copilot')),
|
|
103
|
+
},
|
|
104
|
+
goose: {
|
|
105
|
+
id: 'goose',
|
|
106
|
+
name: 'Goose',
|
|
107
|
+
projectPath: '.goose/skills',
|
|
108
|
+
globalPath: join(home, '.config/goose/skills'),
|
|
109
|
+
detectInstalled: () => existsSync(join(home, '.config/goose')),
|
|
110
|
+
},
|
|
111
|
+
kilo: {
|
|
112
|
+
id: 'kilo',
|
|
113
|
+
name: 'Kilo Code',
|
|
114
|
+
projectPath: '.kilocode/skills',
|
|
115
|
+
globalPath: join(home, '.kilocode/skills'),
|
|
116
|
+
detectInstalled: () => existsSync(join(home, '.kilocode')),
|
|
117
|
+
},
|
|
118
|
+
'kiro-cli': {
|
|
119
|
+
id: 'kiro-cli',
|
|
120
|
+
name: 'Kiro CLI',
|
|
121
|
+
projectPath: '.kiro/skills',
|
|
122
|
+
globalPath: join(home, '.kiro/skills'),
|
|
123
|
+
detectInstalled: () => existsSync(join(home, '.kiro')),
|
|
124
|
+
},
|
|
125
|
+
mcpjam: {
|
|
126
|
+
id: 'mcpjam',
|
|
127
|
+
name: 'MCPJam',
|
|
128
|
+
projectPath: '.mcpjam/skills',
|
|
129
|
+
globalPath: join(home, '.mcpjam/skills'),
|
|
130
|
+
detectInstalled: () => existsSync(join(home, '.mcpjam')),
|
|
131
|
+
},
|
|
132
|
+
opencode: {
|
|
133
|
+
id: 'opencode',
|
|
134
|
+
name: 'OpenCode',
|
|
135
|
+
projectPath: '.opencode/skills',
|
|
136
|
+
globalPath: join(home, '.config/opencode/skills'),
|
|
137
|
+
detectInstalled: () => existsSync(join(home, '.config/opencode')) || existsSync(join(home, '.claude/skills')),
|
|
138
|
+
},
|
|
139
|
+
openhands: {
|
|
140
|
+
id: 'openhands',
|
|
141
|
+
name: 'OpenHands',
|
|
142
|
+
projectPath: '.openhands/skills',
|
|
143
|
+
globalPath: join(home, '.openhands/skills'),
|
|
144
|
+
detectInstalled: () => existsSync(join(home, '.openhands')),
|
|
145
|
+
},
|
|
146
|
+
pi: {
|
|
147
|
+
id: 'pi',
|
|
148
|
+
name: 'Pi',
|
|
149
|
+
projectPath: '.pi/skills',
|
|
150
|
+
globalPath: join(home, '.pi/agent/skills'),
|
|
151
|
+
detectInstalled: () => existsSync(join(home, '.pi/agent')),
|
|
152
|
+
},
|
|
153
|
+
qoder: {
|
|
154
|
+
id: 'qoder',
|
|
155
|
+
name: 'Qoder',
|
|
156
|
+
projectPath: '.qoder/skills',
|
|
157
|
+
globalPath: join(home, '.qoder/skills'),
|
|
158
|
+
detectInstalled: () => existsSync(join(home, '.qoder')),
|
|
159
|
+
},
|
|
160
|
+
'qwen-code': {
|
|
161
|
+
id: 'qwen-code',
|
|
162
|
+
name: 'Qwen Code',
|
|
163
|
+
projectPath: '.qwen/skills',
|
|
164
|
+
globalPath: join(home, '.qwen/skills'),
|
|
165
|
+
detectInstalled: () => existsSync(join(home, '.qwen')),
|
|
166
|
+
},
|
|
167
|
+
roo: {
|
|
168
|
+
id: 'roo',
|
|
169
|
+
name: 'Roo Code',
|
|
170
|
+
projectPath: '.roo/skills',
|
|
171
|
+
globalPath: join(home, '.roo/skills'),
|
|
172
|
+
detectInstalled: () => existsSync(join(home, '.roo')),
|
|
173
|
+
},
|
|
174
|
+
trae: {
|
|
175
|
+
id: 'trae',
|
|
176
|
+
name: 'Trae',
|
|
177
|
+
projectPath: '.trae/skills',
|
|
178
|
+
globalPath: join(home, '.trae/skills'),
|
|
179
|
+
detectInstalled: () => existsSync(join(home, '.trae')),
|
|
180
|
+
},
|
|
181
|
+
windsurf: {
|
|
182
|
+
id: 'windsurf',
|
|
183
|
+
name: 'Windsurf',
|
|
184
|
+
projectPath: '.windsurf/skills',
|
|
185
|
+
globalPath: join(home, '.codeium/windsurf/skills'),
|
|
186
|
+
detectInstalled: () => existsSync(join(home, '.codeium/windsurf')),
|
|
187
|
+
},
|
|
188
|
+
zencoder: {
|
|
189
|
+
id: 'zencoder',
|
|
190
|
+
name: 'Zencoder',
|
|
191
|
+
projectPath: '.zencoder/skills',
|
|
192
|
+
globalPath: join(home, '.zencoder/skills'),
|
|
193
|
+
detectInstalled: () => existsSync(join(home, '.zencoder')),
|
|
194
|
+
},
|
|
195
|
+
neovate: {
|
|
196
|
+
id: 'neovate',
|
|
197
|
+
name: 'Neovate',
|
|
198
|
+
projectPath: '.neovate/skills',
|
|
199
|
+
globalPath: join(home, '.neovate/skills'),
|
|
200
|
+
detectInstalled: () => existsSync(join(home, '.neovate')),
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
/** Get all agent IDs */
|
|
204
|
+
export function getAllAgentIds() {
|
|
205
|
+
return Object.keys(agents);
|
|
206
|
+
}
|
|
207
|
+
/** Get agent config by ID */
|
|
208
|
+
export function getAgentById(id) {
|
|
209
|
+
return agents[id];
|
|
210
|
+
}
|
|
211
|
+
/** Detect which agents are installed on this system */
|
|
212
|
+
export function detectInstalledAgents() {
|
|
213
|
+
return Object.values(agents).filter((agent) => agent.detectInstalled());
|
|
214
|
+
}
|
|
215
|
+
/** Get agent configs by IDs */
|
|
216
|
+
export function getAgentsByIds(ids) {
|
|
217
|
+
return ids.map((id) => agents[id]).filter(Boolean);
|
|
218
|
+
}
|
|
219
|
+
/** Check if an agent ID is valid */
|
|
220
|
+
export function isValidAgentId(id) {
|
|
221
|
+
return id in agents;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { type AgentConfig, type AgentId } from './agents.js';
|
|
2
|
+
/**
|
|
3
|
+
* Skill Installer
|
|
4
|
+
*
|
|
5
|
+
* Handles installation of skills to multiple agent directories
|
|
6
|
+
* using symlinks for efficient storage.
|
|
7
|
+
*/
|
|
8
|
+
export type InstallMode = 'symlink' | 'copy';
|
|
9
|
+
export interface InstallResult {
|
|
10
|
+
success: boolean;
|
|
11
|
+
agentId: AgentId;
|
|
12
|
+
path: string;
|
|
13
|
+
canonicalPath?: string;
|
|
14
|
+
mode: InstallMode;
|
|
15
|
+
symlinkFailed?: boolean;
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface MultiAgentInstallResult {
|
|
19
|
+
slug: string;
|
|
20
|
+
canonicalPath: string;
|
|
21
|
+
agents: InstallResult[];
|
|
22
|
+
success: boolean;
|
|
23
|
+
successCount: number;
|
|
24
|
+
failCount: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Sanitizes a filename/directory name to prevent path traversal attacks
|
|
28
|
+
*/
|
|
29
|
+
export declare function sanitizeName(name: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Get canonical skill directory path
|
|
32
|
+
*/
|
|
33
|
+
export declare function getCanonicalSkillPath(slug: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Get agent-specific skill path
|
|
36
|
+
*/
|
|
37
|
+
export declare function getAgentSkillPath(slug: string, agent: AgentConfig, options?: {
|
|
38
|
+
global?: boolean;
|
|
39
|
+
cwd?: string;
|
|
40
|
+
}): string;
|
|
41
|
+
/**
|
|
42
|
+
* Install skill to canonical location (for later symlinking)
|
|
43
|
+
* This should be called AFTER extracting the ZIP to canonical path
|
|
44
|
+
*/
|
|
45
|
+
export declare function ensureCanonicalDir(slug: string): Promise<string>;
|
|
46
|
+
/**
|
|
47
|
+
* Create symlink from agent skill directory to canonical location
|
|
48
|
+
*/
|
|
49
|
+
export declare function symlinkToAgent(slug: string, agent: AgentConfig, options?: {
|
|
50
|
+
global?: boolean;
|
|
51
|
+
cwd?: string;
|
|
52
|
+
}): Promise<InstallResult>;
|
|
53
|
+
/**
|
|
54
|
+
* Install skill to multiple agents
|
|
55
|
+
* Assumes ZIP has already been extracted to canonical location
|
|
56
|
+
*/
|
|
57
|
+
export declare function installToAgents(slug: string, agents: AgentConfig[], options?: {
|
|
58
|
+
global?: boolean;
|
|
59
|
+
cwd?: string;
|
|
60
|
+
}): Promise<MultiAgentInstallResult>;
|
|
61
|
+
/**
|
|
62
|
+
* Check if skill is installed for an agent
|
|
63
|
+
*/
|
|
64
|
+
export declare function isSkillInstalledForAgent(slug: string, agent: AgentConfig, options?: {
|
|
65
|
+
global?: boolean;
|
|
66
|
+
cwd?: string;
|
|
67
|
+
}): Promise<boolean>;
|
|
68
|
+
/**
|
|
69
|
+
* Check if skill exists in canonical location
|
|
70
|
+
*/
|
|
71
|
+
export declare function isSkillInCanonical(slug: string): Promise<boolean>;
|
|
72
|
+
/**
|
|
73
|
+
* Remove skill from canonical location and all agent symlinks
|
|
74
|
+
*/
|
|
75
|
+
export declare function removeSkill(slug: string, agents: AgentConfig[], options?: {
|
|
76
|
+
global?: boolean;
|
|
77
|
+
cwd?: string;
|
|
78
|
+
}): Promise<{
|
|
79
|
+
removed: AgentId[];
|
|
80
|
+
failed: AgentId[];
|
|
81
|
+
}>;
|
|
82
|
+
//# sourceMappingURL=installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/lib/installer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,OAAO,EAAwB,MAAM,aAAa,CAAC;AAEnF;;;;;GAKG;AAEH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,CAAC;AAE7C,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAcjD;AAYD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAChC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9C,MAAM,CAUR;AA8CD;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAStE;AAED;;GAEG;AACH,wBAAsB,cAAc,CACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9C,OAAO,CAAC,aAAa,CAAC,CA+CxB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACpC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,EAAE,EACrB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9C,OAAO,CAAC,uBAAuB,CAAC,CAmBlC;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC7C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9C,OAAO,CAAC,OAAO,CAAC,CASlB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASvE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,EAAE,EACrB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9C,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,CAwBpD"}
|