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 CHANGED
@@ -3,12 +3,20 @@ import { defineCommand, runMain } from 'citty';
3
3
  const main = defineCommand({
4
4
  meta: {
5
5
  name: 'skillstore',
6
- version: '0.1.0',
6
+ version: '0.2.0',
7
7
  description: 'Skillstore CLI - Manage AI skills for Claude, Codex, and Claude Code',
8
8
  },
9
9
  subCommands: {
10
- // Primary command: install skills or plugins
11
- install: () => import('../commands/install.js').then((m) => m.default),
10
+ // Primary command: add skills or plugins
11
+ add: () => import('../commands/add.js').then((m) => m.default),
12
+ // List installed skills
13
+ list: () => import('../commands/list.js').then((m) => m.default),
14
+ // Check for updates
15
+ check: () => import('../commands/check.js').then((m) => m.default),
16
+ // Update skills
17
+ update: () => import('../commands/update.js').then((m) => m.default),
18
+ // Generate lock file
19
+ 'generate-lock': () => import('../commands/generate-lock.js').then((m) => m.default),
12
20
  // Plugin management (info, list)
13
21
  plugin: () => import('../commands/plugin/index.js').then((m) => m.default),
14
22
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE/C,MAAM,IAAI,GAAG,aAAa,CAAC;IAC1B,IAAI,EAAE;QACL,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,sEAAsE;KACnF;IACD,WAAW,EAAE;QACZ,6CAA6C;QAC7C,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACtE,iCAAiC;QACjC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;KAC1E;IACD,KAAK;QACJ,0EAA0E;QAC1E,qEAAqE;IACtE,CAAC;CACD,CAAC,CAAC;AAEH,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE/C,MAAM,IAAI,GAAG,aAAa,CAAC;IAC1B,IAAI,EAAE;QACL,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,sEAAsE;KACnF;IACD,WAAW,EAAE;QACZ,yCAAyC;QACzC,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9D,wBAAwB;QACxB,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAChE,oBAAoB;QACpB,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAClE,gBAAgB;QAChB,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACpE,qBAAqB;QACrB,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACpF,iCAAiC;QACjC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;KAC1E;IACD,KAAK;QACJ,0EAA0E;QAC1E,qEAAqE;IACtE,CAAC;CACD,CAAC,CAAC;AAEH,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Unified add command
3
+ *
4
+ * - `skillstore add <slug>` → Add single skill
5
+ * - `skillstore add @<plugin>` → Add plugin (skill collection)
6
+ */
7
+ declare const _default: import("citty").CommandDef<{
8
+ target: {
9
+ type: "positional";
10
+ description: string;
11
+ required: true;
12
+ };
13
+ agent: {
14
+ type: "string";
15
+ alias: string;
16
+ description: string;
17
+ };
18
+ global: {
19
+ type: "boolean";
20
+ alias: string;
21
+ description: string;
22
+ default: true;
23
+ };
24
+ 'skip-verify': {
25
+ type: "boolean";
26
+ description: string;
27
+ default: false;
28
+ };
29
+ 'dry-run': {
30
+ type: "boolean";
31
+ description: string;
32
+ default: false;
33
+ };
34
+ overwrite: {
35
+ type: "boolean";
36
+ description: string;
37
+ default: false;
38
+ };
39
+ }>;
40
+ export default _default;
41
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAkCA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACH,wBAmFG"}
@@ -0,0 +1,374 @@
1
+ import { defineCommand } from 'citty';
2
+ import { mkdir, writeFile } from 'node:fs/promises';
3
+ import { dirname, join } from 'node:path';
4
+ import { getPluginConfig } from '../lib/plugin-config.js';
5
+ import { fetchManifest, reportInstallation, reportSkillInstall, PluginApiError, } from '../lib/plugin-api.js';
6
+ import { fetchSkillManifest, downloadSkillZip, SkillApiError } from '../lib/skill-api.js';
7
+ import { verifyManifest, verifySkillManifest, verifyZipHash } from '../lib/plugin-verify.js';
8
+ import { downloadAllSkills, printDownloadSummary } from '../lib/plugin-download.js';
9
+ import { logger } from '../lib/plugin-logger.js';
10
+ import { agents, detectInstalledAgents, getAgentsByIds, isValidAgentId, CANONICAL_SKILLS_DIR, } from '../lib/agents.js';
11
+ import { addToLock, getLockEntry } from '../lib/skill-lock.js';
12
+ import { installToAgents, getCanonicalSkillPath } from '../lib/installer.js';
13
+ /**
14
+ * Normalize skill/plugin slug
15
+ * Converts "owner/name" format to "owner-name" format
16
+ */
17
+ function normalizeSlug(slug) {
18
+ return slug.replace(/\//g, '-');
19
+ }
20
+ /**
21
+ * Unified add command
22
+ *
23
+ * - `skillstore add <slug>` → Add single skill
24
+ * - `skillstore add @<plugin>` → Add plugin (skill collection)
25
+ */
26
+ export default defineCommand({
27
+ meta: {
28
+ name: 'add',
29
+ description: 'Add skills or plugins from skillstore.io',
30
+ },
31
+ args: {
32
+ target: {
33
+ type: 'positional',
34
+ description: 'Skill slug or @plugin to add',
35
+ required: true,
36
+ },
37
+ agent: {
38
+ type: 'string',
39
+ alias: 'a',
40
+ description: 'Target specific agents (comma-separated)',
41
+ },
42
+ global: {
43
+ type: 'boolean',
44
+ alias: 'g',
45
+ description: 'Install to user-level (~/) instead of project-level',
46
+ default: true, // Default to global for skillstore
47
+ },
48
+ 'skip-verify': {
49
+ type: 'boolean',
50
+ description: 'Skip manifest signature verification',
51
+ default: false,
52
+ },
53
+ 'dry-run': {
54
+ type: 'boolean',
55
+ description: 'Show what would be installed without actually installing',
56
+ default: false,
57
+ },
58
+ overwrite: {
59
+ type: 'boolean',
60
+ description: 'Overwrite existing files',
61
+ default: false,
62
+ },
63
+ },
64
+ async run({ args }) {
65
+ const { target, agent: agentArg, global: isGlobal, 'skip-verify': skipVerify, 'dry-run': dryRun, overwrite, } = args;
66
+ // Detect if target is a plugin (@prefix) or skill
67
+ const isPlugin = target.startsWith('@');
68
+ const rawSlug = isPlugin ? target.slice(1) : target;
69
+ // Normalize slug: convert "owner/name" format to "owner-name"
70
+ const slug = normalizeSlug(rawSlug);
71
+ // Determine target agents
72
+ let targetAgents;
73
+ if (agentArg) {
74
+ // Parse comma-separated agent IDs
75
+ const agentIds = agentArg.split(',').map((s) => s.trim());
76
+ const invalidIds = agentIds.filter((id) => !isValidAgentId(id));
77
+ if (invalidIds.length > 0) {
78
+ logger.error(`Invalid agent ID(s): ${invalidIds.join(', ')}`);
79
+ console.log('');
80
+ console.log('Valid agents: claude-code, cursor, windsurf, cline, codex, continue, etc.');
81
+ process.exit(1);
82
+ }
83
+ targetAgents = getAgentsByIds(agentIds);
84
+ }
85
+ else {
86
+ // Auto-detect installed agents
87
+ targetAgents = detectInstalledAgents();
88
+ if (targetAgents.length === 0) {
89
+ logger.warn('No AI coding agents detected. Installing to Claude Code by default.');
90
+ targetAgents = [agents['claude-code']];
91
+ }
92
+ }
93
+ if (isPlugin) {
94
+ await addPlugin(slug, { targetAgents, isGlobal, skipVerify, dryRun, overwrite });
95
+ }
96
+ else {
97
+ await addSkill(slug, { targetAgents, isGlobal, skipVerify, dryRun, overwrite });
98
+ }
99
+ },
100
+ });
101
+ /**
102
+ * Add a single skill
103
+ */
104
+ async function addSkill(slug, options) {
105
+ const { targetAgents, isGlobal, skipVerify, dryRun, overwrite } = options;
106
+ const config = getPluginConfig({
107
+ installDir: CANONICAL_SKILLS_DIR, // Use canonical dir for extraction
108
+ skipVerify,
109
+ dryRun,
110
+ });
111
+ logger.info(`Adding skill: ${slug}`);
112
+ logger.info(`Target agents: ${targetAgents.map((a) => a.name).join(', ')}`);
113
+ if (dryRun) {
114
+ logger.warn('Dry run mode - no files will be written');
115
+ }
116
+ try {
117
+ // Step 1: Fetch skill manifest
118
+ logger.startSpinner('Fetching skill manifest...');
119
+ const manifest = await fetchSkillManifest(config, slug);
120
+ logger.spinnerSuccess(`Found skill: "${manifest.skill.name}"`);
121
+ // Step 2: Verify manifest signature
122
+ if (!skipVerify) {
123
+ logger.startSpinner('Verifying manifest signature...');
124
+ const verifyResult = await verifySkillManifest(manifest);
125
+ if (!verifyResult.valid) {
126
+ logger.spinnerError('Manifest verification failed');
127
+ logger.error(verifyResult.error || 'Unknown verification error');
128
+ process.exit(1);
129
+ }
130
+ logger.spinnerSuccess('Manifest verified');
131
+ }
132
+ else {
133
+ logger.warn('Skipping signature verification');
134
+ }
135
+ // Step 3: Show skill info
136
+ logger.box(`Skill: ${manifest.skill.name}`, [
137
+ `Slug: ${manifest.skill.slug}`,
138
+ `Version: ${manifest.skill.version}`,
139
+ `Author: ${manifest.skill.author || 'Unknown'}`,
140
+ ]);
141
+ // Step 4: Check if already installed
142
+ const existingLock = await getLockEntry(slug);
143
+ if (existingLock && !overwrite) {
144
+ if (existingLock.zipHash === manifest.skill.zipHash) {
145
+ logger.warn(`Skill "${slug}" is already installed (v${existingLock.version})`);
146
+ logger.info('Use --overwrite to reinstall');
147
+ return;
148
+ }
149
+ logger.info(`Updating "${slug}" from v${existingLock.version} to v${manifest.skill.version}`);
150
+ }
151
+ if (dryRun) {
152
+ logger.success('Dry run complete - no files were written');
153
+ console.log('');
154
+ console.log(`Would install to: ${getCanonicalSkillPath(slug)}`);
155
+ console.log(`Would symlink to: ${targetAgents.map((a) => a.name).join(', ')}`);
156
+ return;
157
+ }
158
+ // Step 5: Download skill ZIP
159
+ logger.startSpinner('Downloading skill...');
160
+ const zipBuffer = await downloadSkillZip(config, slug);
161
+ logger.spinnerSuccess('Downloaded skill package');
162
+ // Step 6: Verify ZIP hash
163
+ if (!skipVerify) {
164
+ logger.startSpinner('Verifying content integrity...');
165
+ if (!verifyZipHash(zipBuffer, manifest.skill.zipHash)) {
166
+ logger.spinnerError('Content verification failed');
167
+ logger.error('ZIP hash mismatch - content may be corrupted or tampered');
168
+ process.exit(1);
169
+ }
170
+ logger.spinnerSuccess('Content verified');
171
+ }
172
+ // Step 7: Extract ZIP to canonical location
173
+ logger.startSpinner('Extracting files...');
174
+ const canonicalPath = getCanonicalSkillPath(slug);
175
+ await extractZip(zipBuffer, canonicalPath);
176
+ logger.spinnerSuccess('Extracted files');
177
+ // Step 8: Create symlinks to agents
178
+ logger.startSpinner('Creating symlinks to agents...');
179
+ const installResult = await installToAgents(slug, targetAgents, { global: isGlobal });
180
+ if (installResult.successCount > 0) {
181
+ logger.spinnerSuccess(`Linked to ${installResult.successCount} agent${installResult.successCount > 1 ? 's' : ''}`);
182
+ }
183
+ else {
184
+ logger.spinnerError('Failed to link to any agents');
185
+ }
186
+ // Show symlink results
187
+ for (const result of installResult.agents) {
188
+ if (result.success) {
189
+ if (result.symlinkFailed) {
190
+ logger.warn(` ${result.agentId}: copied (symlink failed)`);
191
+ }
192
+ else {
193
+ logger.debug(` ${result.agentId}: symlinked`);
194
+ }
195
+ }
196
+ else {
197
+ logger.error(` ${result.agentId}: ${result.error}`);
198
+ }
199
+ }
200
+ // Step 9: Update lock file
201
+ await addToLock({
202
+ slug,
203
+ version: manifest.skill.version,
204
+ zipHash: manifest.skill.zipHash,
205
+ source: 'skillstore',
206
+ installedAt: new Date().toISOString(),
207
+ });
208
+ logger.debug('Updated lock file');
209
+ // Step 10: Report installation (non-blocking telemetry)
210
+ try {
211
+ await reportSkillInstall(config, slug);
212
+ logger.debug('Installation telemetry reported');
213
+ }
214
+ catch {
215
+ logger.debug('Failed to report telemetry (non-critical)');
216
+ }
217
+ logger.success(`Skill "${manifest.skill.name}" added successfully!`);
218
+ console.log('');
219
+ console.log(`Installed to: ${canonicalPath}`);
220
+ console.log(`Agents: ${installResult.agents.filter((r) => r.success).map((r) => r.agentId).join(', ')}`);
221
+ }
222
+ catch (err) {
223
+ logger.stopSpinner();
224
+ if (err instanceof SkillApiError) {
225
+ if (err.statusCode === 404) {
226
+ logger.error(`Skill "${slug}" not found`);
227
+ console.log('');
228
+ console.log('Tip: Use @ prefix to add a plugin, e.g.:');
229
+ console.log(` npx skillstore add @${slug}`);
230
+ }
231
+ else {
232
+ logger.error(`API error: ${err.message}`);
233
+ }
234
+ }
235
+ else {
236
+ logger.error('Installation failed', err instanceof Error ? err : undefined);
237
+ }
238
+ process.exit(1);
239
+ }
240
+ }
241
+ /**
242
+ * Add a plugin (skill collection)
243
+ */
244
+ async function addPlugin(slug, options) {
245
+ const { targetAgents, isGlobal, skipVerify, dryRun, overwrite } = options;
246
+ // For plugins, use first agent's path as install dir (legacy behavior)
247
+ // TODO: Update plugin download to use multi-agent installation
248
+ const installDir = isGlobal
249
+ ? targetAgents[0]?.globalPath || agents['claude-code'].globalPath
250
+ : join(process.cwd(), targetAgents[0]?.projectPath || '.claude/skills');
251
+ const config = getPluginConfig({
252
+ installDir,
253
+ skipVerify,
254
+ dryRun,
255
+ });
256
+ logger.info(`Adding plugin: @${slug}`);
257
+ logger.info(`Target directory: ${config.installDir}`);
258
+ if (dryRun) {
259
+ logger.warn('Dry run mode - no files will be written');
260
+ }
261
+ try {
262
+ // Step 1: Fetch manifest
263
+ logger.startSpinner('Fetching plugin manifest...');
264
+ const manifest = await fetchManifest(config, slug);
265
+ logger.spinnerSuccess(`Fetched manifest for "${manifest.plugin.name}"`);
266
+ // Step 2: Verify manifest
267
+ if (!skipVerify) {
268
+ logger.startSpinner('Verifying manifest signature...');
269
+ const verifyResult = await verifyManifest(manifest, { skipSignature: skipVerify });
270
+ if (!verifyResult.valid) {
271
+ logger.spinnerError('Manifest verification failed');
272
+ logger.error(verifyResult.error || 'Unknown verification error');
273
+ process.exit(1);
274
+ }
275
+ if (verifyResult.error) {
276
+ logger.spinnerSuccess('Manifest structure valid');
277
+ logger.warn(verifyResult.error);
278
+ }
279
+ else {
280
+ logger.spinnerSuccess('Manifest verified');
281
+ }
282
+ }
283
+ else {
284
+ logger.warn('Skipping manifest signature verification');
285
+ }
286
+ // Step 3: Show plugin info
287
+ logger.box(`Plugin: ${manifest.plugin.name}`, [
288
+ `Version: ${manifest.plugin.version}`,
289
+ `Skills: ${manifest.skills.length}`,
290
+ `Generated: ${new Date(manifest.generatedAt).toLocaleDateString()}`,
291
+ ]);
292
+ // Step 4: Download skills
293
+ logger.info('');
294
+ const downloadResult = await downloadAllSkills(config, manifest.skills, {
295
+ overwrite,
296
+ verifyHash: !skipVerify,
297
+ });
298
+ // Step 5: Print summary
299
+ printDownloadSummary(downloadResult);
300
+ // Step 6: Report installation (non-blocking)
301
+ if (!dryRun && downloadResult.success > 0) {
302
+ try {
303
+ const reportResult = await reportInstallation(config, slug, 'cli');
304
+ if (reportResult.duplicate) {
305
+ logger.debug('Installation already recorded');
306
+ }
307
+ else if (reportResult.success) {
308
+ logger.debug('Installation reported successfully');
309
+ }
310
+ }
311
+ catch {
312
+ logger.debug('Failed to report installation (non-critical)');
313
+ }
314
+ // Report telemetry for each successfully installed skill
315
+ const successfulSkills = downloadResult.results.filter((r) => r.success && !r.skipped);
316
+ if (successfulSkills.length > 0) {
317
+ // Report in parallel, non-blocking
318
+ Promise.all(successfulSkills.map((r) => reportSkillInstall(config, r.slug))).catch(() => {
319
+ logger.debug('Telemetry reporting failed (non-critical)');
320
+ });
321
+ }
322
+ }
323
+ // Final status
324
+ if (downloadResult.failed > 0) {
325
+ logger.warn(`Installation completed with ${downloadResult.failed} failures`);
326
+ process.exit(1);
327
+ }
328
+ else if (dryRun) {
329
+ logger.success('Dry run complete - no files were written');
330
+ }
331
+ else {
332
+ logger.success(`Plugin "@${manifest.plugin.slug}" added successfully!`);
333
+ }
334
+ }
335
+ catch (err) {
336
+ logger.stopSpinner();
337
+ if (err instanceof PluginApiError) {
338
+ if (err.statusCode === 404) {
339
+ logger.error(`Plugin "@${slug}" not found`);
340
+ console.log('');
341
+ console.log('Tip: Without @ prefix to add a single skill, e.g.:');
342
+ console.log(` npx skillstore add ${slug}`);
343
+ }
344
+ else if (err.statusCode === 403) {
345
+ logger.error('Access denied - plugin may be private or require purchase');
346
+ }
347
+ else {
348
+ logger.error(`API error: ${err.message}`);
349
+ }
350
+ }
351
+ else {
352
+ logger.error('Installation failed', err instanceof Error ? err : undefined);
353
+ }
354
+ process.exit(1);
355
+ }
356
+ }
357
+ /**
358
+ * Extract ZIP buffer to directory
359
+ */
360
+ async function extractZip(buffer, targetDir) {
361
+ // Use fflate for extraction
362
+ const { unzipSync } = await import('fflate');
363
+ const data = new Uint8Array(buffer);
364
+ const unzipped = unzipSync(data);
365
+ for (const [path, content] of Object.entries(unzipped)) {
366
+ // Skip directories (they end with /)
367
+ if (path.endsWith('/'))
368
+ continue;
369
+ const fullPath = join(targetDir, path);
370
+ await mkdir(dirname(fullPath), { recursive: true });
371
+ await writeFile(fullPath, Buffer.from(content));
372
+ }
373
+ }
374
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Check for available skill updates
3
+ */
4
+ declare const _default: import("citty").CommandDef<{
5
+ json: {
6
+ type: "boolean";
7
+ description: string;
8
+ default: false;
9
+ };
10
+ }>;
11
+ export default _default;
12
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAaA;;GAEG;;;;;;;;AACH,wBA0IG"}
@@ -0,0 +1,133 @@
1
+ import { defineCommand } from 'citty';
2
+ import { getAllLockedSkills } from '../lib/skill-lock.js';
3
+ import { fetchSkillManifest, SkillApiError } from '../lib/skill-api.js';
4
+ import { getPluginConfig } from '../lib/plugin-config.js';
5
+ import { logger } from '../lib/plugin-logger.js';
6
+ /**
7
+ * Check for available skill updates
8
+ */
9
+ export default defineCommand({
10
+ meta: {
11
+ name: 'check',
12
+ description: 'Check for available skill updates',
13
+ },
14
+ args: {
15
+ json: {
16
+ type: 'boolean',
17
+ description: 'Output as JSON',
18
+ default: false,
19
+ },
20
+ },
21
+ async run({ args }) {
22
+ const { json: outputJson } = args;
23
+ try {
24
+ const skills = await getAllLockedSkills();
25
+ if (skills.length === 0) {
26
+ if (outputJson) {
27
+ console.log(JSON.stringify({ skills: [], updates: 0 }));
28
+ }
29
+ else {
30
+ logger.info('No skills installed.');
31
+ console.log('');
32
+ console.log('To add a skill, run:');
33
+ console.log(' npx skillstore add <skill-slug>');
34
+ }
35
+ return;
36
+ }
37
+ const config = getPluginConfig({});
38
+ if (!outputJson) {
39
+ logger.info('Checking for updates...');
40
+ console.log('');
41
+ }
42
+ const updates = [];
43
+ const upToDate = [];
44
+ const errors = [];
45
+ // Check each skill
46
+ for (const skill of skills) {
47
+ try {
48
+ const manifest = await fetchSkillManifest(config, skill.slug);
49
+ const info = {
50
+ skill,
51
+ currentVersion: skill.version,
52
+ latestVersion: manifest.skill.version,
53
+ hasUpdate: skill.zipHash !== manifest.skill.zipHash,
54
+ };
55
+ if (info.hasUpdate) {
56
+ updates.push(info);
57
+ }
58
+ else {
59
+ upToDate.push(info);
60
+ }
61
+ }
62
+ catch (err) {
63
+ if (err instanceof SkillApiError && err.statusCode === 404) {
64
+ errors.push({ slug: skill.slug, error: 'Skill no longer available' });
65
+ }
66
+ else {
67
+ errors.push({
68
+ slug: skill.slug,
69
+ error: err instanceof Error ? err.message : 'Unknown error',
70
+ });
71
+ }
72
+ }
73
+ }
74
+ if (outputJson) {
75
+ console.log(JSON.stringify({
76
+ updates: updates.map((u) => ({
77
+ slug: u.skill.slug,
78
+ currentVersion: u.currentVersion,
79
+ latestVersion: u.latestVersion,
80
+ })),
81
+ upToDate: upToDate.map((u) => u.skill.slug),
82
+ errors,
83
+ }, null, 2));
84
+ return;
85
+ }
86
+ // Display updates available
87
+ if (updates.length > 0) {
88
+ console.log(`Updates available (${updates.length}):`);
89
+ for (let i = 0; i < updates.length; i++) {
90
+ const update = updates[i];
91
+ const isLast = i === updates.length - 1;
92
+ const prefix = isLast ? '└─' : '├─';
93
+ console.log(` ${prefix} ${update.skill.slug} v${update.currentVersion} → v${update.latestVersion}`);
94
+ }
95
+ console.log('');
96
+ }
97
+ // Display up-to-date skills
98
+ if (upToDate.length > 0) {
99
+ console.log(`No updates (${upToDate.length}):`);
100
+ for (let i = 0; i < upToDate.length; i++) {
101
+ const skill = upToDate[i];
102
+ const isLast = i === upToDate.length - 1;
103
+ const prefix = isLast ? '└─' : '├─';
104
+ console.log(` ${prefix} ${skill.skill.slug} v${skill.currentVersion} (latest)`);
105
+ }
106
+ console.log('');
107
+ }
108
+ // Display errors
109
+ if (errors.length > 0) {
110
+ console.log(`Errors (${errors.length}):`);
111
+ for (let i = 0; i < errors.length; i++) {
112
+ const err = errors[i];
113
+ const isLast = i === errors.length - 1;
114
+ const prefix = isLast ? '└─' : '├─';
115
+ console.log(` ${prefix} ${err.slug} (${err.error})`);
116
+ }
117
+ console.log('');
118
+ }
119
+ // Summary
120
+ if (updates.length > 0) {
121
+ logger.info(`Run 'skillstore update' to install ${updates.length} update${updates.length > 1 ? 's' : ''}.`);
122
+ }
123
+ else {
124
+ logger.success('All skills are up to date!');
125
+ }
126
+ }
127
+ catch (err) {
128
+ logger.error('Failed to check for updates', err instanceof Error ? err : undefined);
129
+ process.exit(1);
130
+ }
131
+ },
132
+ });
133
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Generate lock file from installed skills
3
+ */
4
+ declare const _default: import("citty").CommandDef<{
5
+ dir: {
6
+ type: "string";
7
+ description: string;
8
+ default: string;
9
+ };
10
+ 'dry-run': {
11
+ type: "boolean";
12
+ description: string;
13
+ default: false;
14
+ };
15
+ }>;
16
+ export default _default;
17
+ //# sourceMappingURL=generate-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-lock.d.ts","sourceRoot":"","sources":["../../src/commands/generate-lock.ts"],"names":[],"mappings":"AAQA;;GAEG;;;;;;;;;;;;;AACH,wBAyIG"}