skillstore 0.1.3 → 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/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/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,134 @@
|
|
|
1
|
+
import { defineCommand } from 'citty';
|
|
2
|
+
import { readdir, access } from 'node:fs/promises';
|
|
3
|
+
import { writeSkillLock, LOCK_VERSION } from '../lib/skill-lock.js';
|
|
4
|
+
import { fetchSkillManifest, SkillApiError } from '../lib/skill-api.js';
|
|
5
|
+
import { getPluginConfig } from '../lib/plugin-config.js';
|
|
6
|
+
import { logger } from '../lib/plugin-logger.js';
|
|
7
|
+
import { CANONICAL_SKILLS_DIR } from '../lib/agents.js';
|
|
8
|
+
/**
|
|
9
|
+
* Generate lock file from installed skills
|
|
10
|
+
*/
|
|
11
|
+
export default defineCommand({
|
|
12
|
+
meta: {
|
|
13
|
+
name: 'generate-lock',
|
|
14
|
+
description: 'Generate lock file from installed skills',
|
|
15
|
+
},
|
|
16
|
+
args: {
|
|
17
|
+
dir: {
|
|
18
|
+
type: 'string',
|
|
19
|
+
description: 'Directory to scan for skills',
|
|
20
|
+
default: CANONICAL_SKILLS_DIR,
|
|
21
|
+
},
|
|
22
|
+
'dry-run': {
|
|
23
|
+
type: 'boolean',
|
|
24
|
+
description: 'Show what would be generated without writing',
|
|
25
|
+
default: false,
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
async run({ args }) {
|
|
29
|
+
const { dir, 'dry-run': dryRun } = args;
|
|
30
|
+
try {
|
|
31
|
+
logger.info(`Scanning ${dir}...`);
|
|
32
|
+
// Check if directory exists
|
|
33
|
+
try {
|
|
34
|
+
await access(dir);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
logger.error(`Directory not found: ${dir}`);
|
|
38
|
+
console.log('');
|
|
39
|
+
console.log('No skills are installed yet.');
|
|
40
|
+
console.log('To add a skill, run:');
|
|
41
|
+
console.log(' npx skillstore add <skill-slug>');
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// List skill directories
|
|
45
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
46
|
+
const skillDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);
|
|
47
|
+
if (skillDirs.length === 0) {
|
|
48
|
+
logger.info('No skill directories found.');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const config = getPluginConfig({});
|
|
52
|
+
console.log('');
|
|
53
|
+
logger.info(`Found ${skillDirs.length} skill director${skillDirs.length > 1 ? 'ies' : 'y'}`);
|
|
54
|
+
console.log('');
|
|
55
|
+
const matched = [];
|
|
56
|
+
const skipped = [];
|
|
57
|
+
for (const slug of skillDirs) {
|
|
58
|
+
// Skip hidden directories
|
|
59
|
+
if (slug.startsWith('.')) {
|
|
60
|
+
skipped.push({ slug, reason: 'hidden directory' });
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
// Try to fetch manifest from skillstore.io
|
|
65
|
+
const manifest = await fetchSkillManifest(config, slug);
|
|
66
|
+
matched.push({
|
|
67
|
+
slug,
|
|
68
|
+
version: manifest.skill.version,
|
|
69
|
+
zipHash: manifest.skill.zipHash,
|
|
70
|
+
source: 'skillstore',
|
|
71
|
+
installedAt: new Date().toISOString(),
|
|
72
|
+
updatedAt: new Date().toISOString(),
|
|
73
|
+
});
|
|
74
|
+
console.log(` ✓ ${slug} (v${manifest.skill.version})`);
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
if (err instanceof SkillApiError && err.statusCode === 404) {
|
|
78
|
+
skipped.push({ slug, reason: 'not from skillstore.io' });
|
|
79
|
+
console.log(` ✗ ${slug} (not found on skillstore.io)`);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
skipped.push({
|
|
83
|
+
slug,
|
|
84
|
+
reason: err instanceof Error ? err.message : 'unknown error',
|
|
85
|
+
});
|
|
86
|
+
console.log(` ✗ ${slug} (error: ${err instanceof Error ? err.message : 'unknown'})`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
console.log('');
|
|
91
|
+
if (matched.length === 0) {
|
|
92
|
+
logger.warn('No skills matched with skillstore.io');
|
|
93
|
+
console.log('');
|
|
94
|
+
console.log('Skills not from skillstore.io cannot be tracked for updates.');
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
// Build lock file
|
|
98
|
+
const lock = {
|
|
99
|
+
version: LOCK_VERSION,
|
|
100
|
+
skills: {},
|
|
101
|
+
};
|
|
102
|
+
for (const entry of matched) {
|
|
103
|
+
lock.skills[entry.slug] = entry;
|
|
104
|
+
}
|
|
105
|
+
if (dryRun) {
|
|
106
|
+
logger.success('Dry run complete - lock file not written');
|
|
107
|
+
console.log('');
|
|
108
|
+
console.log('Would generate lock file with:');
|
|
109
|
+
console.log(` - ${matched.length} skill${matched.length > 1 ? 's' : ''} from skillstore.io`);
|
|
110
|
+
if (skipped.length > 0) {
|
|
111
|
+
console.log(` - ${skipped.length} skipped (not from skillstore.io)`);
|
|
112
|
+
}
|
|
113
|
+
console.log('');
|
|
114
|
+
console.log(JSON.stringify(lock, null, 2));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// Write lock file
|
|
118
|
+
await writeSkillLock(lock);
|
|
119
|
+
logger.success(`Generated lock file with ${matched.length} skill${matched.length > 1 ? 's' : ''}`);
|
|
120
|
+
if (skipped.length > 0) {
|
|
121
|
+
console.log('');
|
|
122
|
+
console.log(`Skipped (${skipped.length}):`);
|
|
123
|
+
for (const skip of skipped) {
|
|
124
|
+
console.log(` - ${skip.slug}: ${skip.reason}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
logger.error('Failed to generate lock file', err instanceof Error ? err : undefined);
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
//# sourceMappingURL=generate-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-lock.js","sourceRoot":"","sources":["../../src/commands/generate-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAIA;;GAEG;;;;;;;;AACH,wBAuDG"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { defineCommand } from 'citty';
|
|
2
|
+
import { getAllLockedSkills } from '../lib/skill-lock.js';
|
|
3
|
+
import { logger } from '../lib/plugin-logger.js';
|
|
4
|
+
/**
|
|
5
|
+
* List installed skills
|
|
6
|
+
*/
|
|
7
|
+
export default defineCommand({
|
|
8
|
+
meta: {
|
|
9
|
+
name: 'list',
|
|
10
|
+
description: 'List installed skills',
|
|
11
|
+
},
|
|
12
|
+
args: {
|
|
13
|
+
json: {
|
|
14
|
+
type: 'boolean',
|
|
15
|
+
description: 'Output as JSON',
|
|
16
|
+
default: false,
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
async run({ args }) {
|
|
20
|
+
const { json: outputJson } = args;
|
|
21
|
+
try {
|
|
22
|
+
const skills = await getAllLockedSkills();
|
|
23
|
+
if (outputJson) {
|
|
24
|
+
console.log(JSON.stringify(skills, null, 2));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (skills.length === 0) {
|
|
28
|
+
logger.info('No skills installed.');
|
|
29
|
+
console.log('');
|
|
30
|
+
console.log('To add a skill, run:');
|
|
31
|
+
console.log(' npx skillstore add <skill-slug>');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
console.log('');
|
|
35
|
+
console.log(`Installed skills (${skills.length}):`);
|
|
36
|
+
console.log('');
|
|
37
|
+
// Sort by updatedAt (most recent first)
|
|
38
|
+
const sortedSkills = skills.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
|
|
39
|
+
for (let i = 0; i < sortedSkills.length; i++) {
|
|
40
|
+
const skill = sortedSkills[i];
|
|
41
|
+
const isLast = i === sortedSkills.length - 1;
|
|
42
|
+
const prefix = isLast ? '└─' : '├─';
|
|
43
|
+
const relativeTime = getRelativeTime(new Date(skill.updatedAt));
|
|
44
|
+
console.log(` ${prefix} ${skill.slug} v${skill.version} (${relativeTime})`);
|
|
45
|
+
}
|
|
46
|
+
console.log('');
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
logger.error('Failed to list skills', err instanceof Error ? err : undefined);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
/**
|
|
55
|
+
* Get relative time string
|
|
56
|
+
*/
|
|
57
|
+
function getRelativeTime(date) {
|
|
58
|
+
const now = new Date();
|
|
59
|
+
const diffMs = now.getTime() - date.getTime();
|
|
60
|
+
const diffSeconds = Math.floor(diffMs / 1000);
|
|
61
|
+
const diffMinutes = Math.floor(diffSeconds / 60);
|
|
62
|
+
const diffHours = Math.floor(diffMinutes / 60);
|
|
63
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
64
|
+
const diffWeeks = Math.floor(diffDays / 7);
|
|
65
|
+
const diffMonths = Math.floor(diffDays / 30);
|
|
66
|
+
if (diffSeconds < 60) {
|
|
67
|
+
return 'just now';
|
|
68
|
+
}
|
|
69
|
+
else if (diffMinutes < 60) {
|
|
70
|
+
return `${diffMinutes} minute${diffMinutes > 1 ? 's' : ''} ago`;
|
|
71
|
+
}
|
|
72
|
+
else if (diffHours < 24) {
|
|
73
|
+
return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;
|
|
74
|
+
}
|
|
75
|
+
else if (diffDays === 1) {
|
|
76
|
+
return 'yesterday';
|
|
77
|
+
}
|
|
78
|
+
else if (diffDays < 7) {
|
|
79
|
+
return `${diffDays} days ago`;
|
|
80
|
+
}
|
|
81
|
+
else if (diffWeeks === 1) {
|
|
82
|
+
return '1 week ago';
|
|
83
|
+
}
|
|
84
|
+
else if (diffWeeks < 4) {
|
|
85
|
+
return `${diffWeeks} weeks ago`;
|
|
86
|
+
}
|
|
87
|
+
else if (diffMonths === 1) {
|
|
88
|
+
return '1 month ago';
|
|
89
|
+
}
|
|
90
|
+
else if (diffMonths < 12) {
|
|
91
|
+
return `${diffMonths} months ago`;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
return date.toLocaleDateString();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Update installed skills
|
|
3
|
+
*/
|
|
4
|
+
declare const _default: import("citty").CommandDef<{
|
|
5
|
+
slug: {
|
|
6
|
+
type: "positional";
|
|
7
|
+
description: string;
|
|
8
|
+
required: false;
|
|
9
|
+
};
|
|
10
|
+
'skip-verify': {
|
|
11
|
+
type: "boolean";
|
|
12
|
+
description: string;
|
|
13
|
+
default: false;
|
|
14
|
+
};
|
|
15
|
+
'dry-run': {
|
|
16
|
+
type: "boolean";
|
|
17
|
+
description: string;
|
|
18
|
+
default: false;
|
|
19
|
+
};
|
|
20
|
+
}>;
|
|
21
|
+
export default _default;
|
|
22
|
+
//# sourceMappingURL=update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAYA;;GAEG;;;;;;;;;;;;;;;;;;AACH,wBAoMG"}
|
|
@@ -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"}
|