skillstore 0.0.1 → 0.1.1

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.
Files changed (55) hide show
  1. package/README.md +199 -0
  2. package/dist/cli/index.d.ts +3 -0
  3. package/dist/cli/index.d.ts.map +1 -0
  4. package/dist/cli/index.js +21 -0
  5. package/dist/cli/index.js.map +1 -0
  6. package/dist/commands/install.d.ts +35 -0
  7. package/dist/commands/install.d.ts.map +1 -0
  8. package/dist/commands/install.js +272 -0
  9. package/dist/commands/install.js.map +1 -0
  10. package/dist/commands/plugin/index.d.ts +3 -0
  11. package/dist/commands/plugin/index.d.ts.map +1 -0
  12. package/dist/commands/plugin/index.js +13 -0
  13. package/dist/commands/plugin/index.js.map +1 -0
  14. package/dist/commands/plugin/info.d.ts +9 -0
  15. package/dist/commands/plugin/info.d.ts.map +1 -0
  16. package/dist/commands/plugin/info.js +75 -0
  17. package/dist/commands/plugin/info.js.map +1 -0
  18. package/dist/commands/plugin/install.d.ts +29 -0
  19. package/dist/commands/plugin/install.d.ts.map +1 -0
  20. package/dist/commands/plugin/install.js +140 -0
  21. package/dist/commands/plugin/install.js.map +1 -0
  22. package/dist/commands/plugin/list.d.ts +22 -0
  23. package/dist/commands/plugin/list.d.ts.map +1 -0
  24. package/dist/commands/plugin/list.js +76 -0
  25. package/dist/commands/plugin/list.js.map +1 -0
  26. package/dist/index.d.ts +11 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +13 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/lib/plugin-api.d.ts +155 -0
  31. package/dist/lib/plugin-api.d.ts.map +1 -0
  32. package/dist/lib/plugin-api.js +173 -0
  33. package/dist/lib/plugin-api.js.map +1 -0
  34. package/dist/lib/plugin-config.d.ts +56 -0
  35. package/dist/lib/plugin-config.d.ts.map +1 -0
  36. package/dist/lib/plugin-config.js +64 -0
  37. package/dist/lib/plugin-config.js.map +1 -0
  38. package/dist/lib/plugin-download.d.ts +36 -0
  39. package/dist/lib/plugin-download.d.ts.map +1 -0
  40. package/dist/lib/plugin-download.js +134 -0
  41. package/dist/lib/plugin-download.js.map +1 -0
  42. package/dist/lib/plugin-logger.d.ts +79 -0
  43. package/dist/lib/plugin-logger.d.ts.map +1 -0
  44. package/dist/lib/plugin-logger.js +173 -0
  45. package/dist/lib/plugin-logger.js.map +1 -0
  46. package/dist/lib/plugin-verify.d.ts +35 -0
  47. package/dist/lib/plugin-verify.d.ts.map +1 -0
  48. package/dist/lib/plugin-verify.js +97 -0
  49. package/dist/lib/plugin-verify.js.map +1 -0
  50. package/dist/lib/skill-api.d.ts +33 -0
  51. package/dist/lib/skill-api.d.ts.map +1 -0
  52. package/dist/lib/skill-api.js +64 -0
  53. package/dist/lib/skill-api.js.map +1 -0
  54. package/package.json +56 -17
  55. package/src/index.js +0 -16
@@ -0,0 +1,173 @@
1
+ import { getManifestUrl, getInstallUrl, getPluginInfoUrl, getPluginListUrl, getTelemetryUrl, } from './plugin-config.js';
2
+ /** API Error */
3
+ export class PluginApiError extends Error {
4
+ statusCode;
5
+ code;
6
+ constructor(message, statusCode, code) {
7
+ super(message);
8
+ this.statusCode = statusCode;
9
+ this.code = code;
10
+ this.name = 'PluginApiError';
11
+ }
12
+ }
13
+ /**
14
+ * Fetch plugin manifest for installation
15
+ */
16
+ export async function fetchManifest(config, pluginSlug) {
17
+ const url = getManifestUrl(config, pluginSlug);
18
+ const response = await fetch(url, {
19
+ method: 'GET',
20
+ headers: {
21
+ Accept: 'application/json',
22
+ },
23
+ signal: AbortSignal.timeout(config.timeout),
24
+ });
25
+ if (!response.ok) {
26
+ const errorText = await response.text().catch(() => 'Unknown error');
27
+ let errorData = {};
28
+ try {
29
+ errorData = JSON.parse(errorText);
30
+ }
31
+ catch {
32
+ // Not JSON
33
+ }
34
+ throw new PluginApiError(errorData.error || `Failed to fetch manifest: ${response.statusText}`, response.status, errorData.code);
35
+ }
36
+ const manifest = (await response.json());
37
+ return manifest;
38
+ }
39
+ /**
40
+ * Fetch plugin info/details
41
+ */
42
+ export async function fetchPluginInfo(config, pluginSlug) {
43
+ const url = getPluginInfoUrl(config, pluginSlug);
44
+ const response = await fetch(url, {
45
+ method: 'GET',
46
+ headers: {
47
+ Accept: 'application/json',
48
+ },
49
+ signal: AbortSignal.timeout(config.timeout),
50
+ });
51
+ if (!response.ok) {
52
+ const errorText = await response.text().catch(() => 'Unknown error');
53
+ let errorData = {};
54
+ try {
55
+ errorData = JSON.parse(errorText);
56
+ }
57
+ catch {
58
+ // Not JSON
59
+ }
60
+ throw new PluginApiError(errorData.error || `Failed to fetch plugin info: ${response.statusText}`, response.status, errorData.code);
61
+ }
62
+ const result = (await response.json());
63
+ return result.data;
64
+ }
65
+ /**
66
+ * Fetch plugin list
67
+ */
68
+ export async function fetchPluginList(config, options = {}) {
69
+ const url = new URL(getPluginListUrl(config));
70
+ if (options.type)
71
+ url.searchParams.set('type', options.type);
72
+ if (options.pricing)
73
+ url.searchParams.set('pricing', options.pricing);
74
+ if (options.limit)
75
+ url.searchParams.set('limit', String(options.limit));
76
+ if (options.page)
77
+ url.searchParams.set('page', String(options.page));
78
+ const response = await fetch(url.toString(), {
79
+ method: 'GET',
80
+ headers: {
81
+ Accept: 'application/json',
82
+ },
83
+ signal: AbortSignal.timeout(config.timeout),
84
+ });
85
+ if (!response.ok) {
86
+ throw new PluginApiError(`Failed to fetch plugin list: ${response.statusText}`, response.status);
87
+ }
88
+ return (await response.json());
89
+ }
90
+ /**
91
+ * Report installation to the API
92
+ */
93
+ export async function reportInstallation(config, pluginSlug, method = 'cli') {
94
+ const url = getInstallUrl(config, pluginSlug);
95
+ const response = await fetch(url, {
96
+ method: 'POST',
97
+ headers: {
98
+ 'Content-Type': 'application/json',
99
+ Accept: 'application/json',
100
+ },
101
+ body: JSON.stringify({ method }),
102
+ signal: AbortSignal.timeout(config.timeout),
103
+ });
104
+ // Accept both success and rate-limited responses
105
+ const result = (await response.json());
106
+ return result;
107
+ }
108
+ /**
109
+ * Download skill content from the API
110
+ */
111
+ export async function downloadSkill(config, downloadUrl) {
112
+ // downloadUrl is relative, construct full URL
113
+ const fullUrl = downloadUrl.startsWith('http')
114
+ ? downloadUrl
115
+ : `${config.apiBaseUrl.replace('/api', '')}${downloadUrl}`;
116
+ const response = await fetch(fullUrl, {
117
+ method: 'GET',
118
+ signal: AbortSignal.timeout(config.timeout),
119
+ });
120
+ if (!response.ok) {
121
+ throw new PluginApiError(`Failed to download skill: ${response.statusText}`, response.status);
122
+ }
123
+ return await response.text();
124
+ }
125
+ /**
126
+ * Report skill telemetry event (effectiveness tracking)
127
+ *
128
+ * Used to track skill usage for quality scoring.
129
+ * Non-blocking - failures don't interrupt normal operation.
130
+ */
131
+ export async function reportSkillTelemetry(config, event) {
132
+ const url = getTelemetryUrl(config);
133
+ try {
134
+ const response = await fetch(url, {
135
+ method: 'POST',
136
+ headers: {
137
+ 'Content-Type': 'application/json',
138
+ Accept: 'application/json',
139
+ },
140
+ body: JSON.stringify(event),
141
+ signal: AbortSignal.timeout(5000), // Short timeout for non-critical telemetry
142
+ });
143
+ if (!response.ok) {
144
+ // Non-critical - return error but don't throw
145
+ return {
146
+ success: false,
147
+ error: `HTTP ${response.status}: ${response.statusText}`,
148
+ };
149
+ }
150
+ return (await response.json());
151
+ }
152
+ catch (err) {
153
+ // Non-critical - return error but don't throw
154
+ return {
155
+ success: false,
156
+ error: err instanceof Error ? err.message : 'Unknown error',
157
+ };
158
+ }
159
+ }
160
+ /**
161
+ * Report skill installation event
162
+ *
163
+ * Tracks when a skill is installed via CLI.
164
+ */
165
+ export async function reportSkillInstall(config, skillSlug, toolName = 'claude_code') {
166
+ return reportSkillTelemetry(config, {
167
+ skill_slug: skillSlug,
168
+ event_type: 'invocation',
169
+ tool_name: toolName,
170
+ tool_version: '1.0.0', // CLI version
171
+ });
172
+ }
173
+ //# sourceMappingURL=plugin-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-api.js","sourceRoot":"","sources":["../../src/lib/plugin-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Plugin CLI Configuration
3
+ *
4
+ * Manages default settings for plugin installation and API access.
5
+ */
6
+ /** Default installation directory for skills */
7
+ export declare const DEFAULT_INSTALL_DIR = ".claude/skills";
8
+ /** Skillstore API base URL */
9
+ export declare const API_BASE_URL: string;
10
+ /** Request timeout in milliseconds */
11
+ export declare const REQUEST_TIMEOUT = 30000;
12
+ /** Maximum concurrent skill downloads */
13
+ export declare const MAX_CONCURRENT_DOWNLOADS = 5;
14
+ export interface PluginConfig {
15
+ /** Base URL for the Skillstore API */
16
+ apiBaseUrl: string;
17
+ /** Directory to install skills into */
18
+ installDir: string;
19
+ /** Request timeout in milliseconds */
20
+ timeout: number;
21
+ /** Maximum concurrent downloads */
22
+ maxConcurrent: number;
23
+ /** Skip manifest signature verification */
24
+ skipVerify: boolean;
25
+ /** Dry run mode - don't write files */
26
+ dryRun: boolean;
27
+ }
28
+ /**
29
+ * Get plugin configuration from environment and CLI args
30
+ */
31
+ export declare function getPluginConfig(options?: Partial<PluginConfig>): PluginConfig;
32
+ /**
33
+ * Resolve the full path for a skill within the install directory
34
+ */
35
+ export declare function getSkillPath(config: PluginConfig, skillSlug: string): string;
36
+ /**
37
+ * Get the API endpoint for a specific plugin manifest
38
+ */
39
+ export declare function getManifestUrl(config: PluginConfig, pluginSlug: string): string;
40
+ /**
41
+ * Get the API endpoint for recording an installation
42
+ */
43
+ export declare function getInstallUrl(config: PluginConfig, pluginSlug: string): string;
44
+ /**
45
+ * Get the API endpoint for plugin info
46
+ */
47
+ export declare function getPluginInfoUrl(config: PluginConfig, pluginSlug: string): string;
48
+ /**
49
+ * Get the API endpoint for plugin listing
50
+ */
51
+ export declare function getPluginListUrl(config: PluginConfig): string;
52
+ /**
53
+ * Get the API endpoint for telemetry/effectiveness tracking
54
+ */
55
+ export declare function getTelemetryUrl(config: PluginConfig): string;
56
+ //# sourceMappingURL=plugin-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-config.d.ts","sourceRoot":"","sources":["../../src/lib/plugin-config.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,gDAAgD;AAChD,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AAEpD,8BAA8B;AAC9B,eAAO,MAAM,YAAY,QACqC,CAAC;AAE/D,sCAAsC;AACtC,eAAO,MAAM,eAAe,QAAS,CAAC;AAEtC,yCAAyC;AACzC,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,MAAM,WAAW,YAAY;IAC5B,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,UAAU,EAAE,OAAO,CAAC;IACpB,uCAAuC;IACvC,MAAM,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,GAAG,YAAY,CASjF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAE7D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAE5D"}
@@ -0,0 +1,64 @@
1
+ import { resolve } from 'node:path';
2
+ /**
3
+ * Plugin CLI Configuration
4
+ *
5
+ * Manages default settings for plugin installation and API access.
6
+ */
7
+ /** Default installation directory for skills */
8
+ export const DEFAULT_INSTALL_DIR = '.claude/skills';
9
+ /** Skillstore API base URL */
10
+ export const API_BASE_URL = process.env.SKILLSTORE_API_URL || 'https://skillstore.io/api';
11
+ /** Request timeout in milliseconds */
12
+ export const REQUEST_TIMEOUT = 30_000;
13
+ /** Maximum concurrent skill downloads */
14
+ export const MAX_CONCURRENT_DOWNLOADS = 5;
15
+ /**
16
+ * Get plugin configuration from environment and CLI args
17
+ */
18
+ export function getPluginConfig(options = {}) {
19
+ return {
20
+ apiBaseUrl: options.apiBaseUrl || API_BASE_URL,
21
+ installDir: resolve(process.cwd(), options.installDir || DEFAULT_INSTALL_DIR),
22
+ timeout: options.timeout || REQUEST_TIMEOUT,
23
+ maxConcurrent: options.maxConcurrent || MAX_CONCURRENT_DOWNLOADS,
24
+ skipVerify: options.skipVerify || false,
25
+ dryRun: options.dryRun || false,
26
+ };
27
+ }
28
+ /**
29
+ * Resolve the full path for a skill within the install directory
30
+ */
31
+ export function getSkillPath(config, skillSlug) {
32
+ return resolve(config.installDir, skillSlug);
33
+ }
34
+ /**
35
+ * Get the API endpoint for a specific plugin manifest
36
+ */
37
+ export function getManifestUrl(config, pluginSlug) {
38
+ return `${config.apiBaseUrl}/plugins/${pluginSlug}/manifest`;
39
+ }
40
+ /**
41
+ * Get the API endpoint for recording an installation
42
+ */
43
+ export function getInstallUrl(config, pluginSlug) {
44
+ return `${config.apiBaseUrl}/plugins/${pluginSlug}/install`;
45
+ }
46
+ /**
47
+ * Get the API endpoint for plugin info
48
+ */
49
+ export function getPluginInfoUrl(config, pluginSlug) {
50
+ return `${config.apiBaseUrl}/plugins/${pluginSlug}`;
51
+ }
52
+ /**
53
+ * Get the API endpoint for plugin listing
54
+ */
55
+ export function getPluginListUrl(config) {
56
+ return `${config.apiBaseUrl}/plugins`;
57
+ }
58
+ /**
59
+ * Get the API endpoint for telemetry/effectiveness tracking
60
+ */
61
+ export function getTelemetryUrl(config) {
62
+ return `${config.apiBaseUrl}/telemetry/effectiveness`;
63
+ }
64
+ //# sourceMappingURL=plugin-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-config.js","sourceRoot":"","sources":["../../src/lib/plugin-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;;GAIG;AAEH,gDAAgD;AAChD,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAEpD,8BAA8B;AAC9B,MAAM,CAAC,MAAM,YAAY,GACxB,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,2BAA2B,CAAC;AAE/D,sCAAsC;AACtC,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AAEtC,yCAAyC;AACzC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAiB1C;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,UAAiC,EAAE;IAClE,OAAO;QACN,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,YAAY;QAC9C,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;QAC7E,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,eAAe;QAC3C,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,wBAAwB;QAChE,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,KAAK;QACvC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;KAC/B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAoB,EAAE,SAAiB;IACnE,OAAO,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAoB,EAAE,UAAkB;IACtE,OAAO,GAAG,MAAM,CAAC,UAAU,YAAY,UAAU,WAAW,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAoB,EAAE,UAAkB;IACrE,OAAO,GAAG,MAAM,CAAC,UAAU,YAAY,UAAU,UAAU,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAoB,EAAE,UAAkB;IACxE,OAAO,GAAG,MAAM,CAAC,UAAU,YAAY,UAAU,EAAE,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAoB;IACpD,OAAO,GAAG,MAAM,CAAC,UAAU,UAAU,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAoB;IACnD,OAAO,GAAG,MAAM,CAAC,UAAU,0BAA0B,CAAC;AACvD,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { PluginConfig } from './plugin-config.js';
2
+ import type { ManifestSkill } from './plugin-api.js';
3
+ /**
4
+ * Plugin Skill Downloader
5
+ *
6
+ * Downloads skills from the Skillstore API with concurrent downloads,
7
+ * progress tracking, and content hash verification.
8
+ */
9
+ /** Download result for a single skill */
10
+ export interface SkillDownloadResult {
11
+ slug: string;
12
+ success: boolean;
13
+ path?: string;
14
+ error?: string;
15
+ skipped?: boolean;
16
+ }
17
+ /** Download summary */
18
+ export interface DownloadSummary {
19
+ total: number;
20
+ success: number;
21
+ failed: number;
22
+ skipped: number;
23
+ results: SkillDownloadResult[];
24
+ }
25
+ /**
26
+ * Download all skills from a manifest with concurrent downloads
27
+ */
28
+ export declare function downloadAllSkills(config: PluginConfig, skills: ManifestSkill[], options?: {
29
+ overwrite?: boolean;
30
+ verifyHash?: boolean;
31
+ }): Promise<DownloadSummary>;
32
+ /**
33
+ * Print download summary
34
+ */
35
+ export declare function printDownloadSummary(summary: DownloadSummary): void;
36
+ //# sourceMappingURL=plugin-download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-download.d.ts","sourceRoot":"","sources":["../../src/lib/plugin-download.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAKrD;;;;;GAKG;AAEH,yCAAyC;AACzC,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,uBAAuB;AACvB,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACtC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,aAAa,EAAE,EACvB,OAAO,GAAE;IACR,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CAChB,GACJ,OAAO,CAAC,eAAe,CAAC,CA8C1B;AA0ED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAuBnE"}
@@ -0,0 +1,134 @@
1
+ import { mkdir, writeFile, access } from 'node:fs/promises';
2
+ import { dirname, join } from 'node:path';
3
+ import { downloadSkill } from './plugin-api.js';
4
+ import { verifyContentHash } from './plugin-verify.js';
5
+ import { logger } from './plugin-logger.js';
6
+ /**
7
+ * Download all skills from a manifest with concurrent downloads
8
+ */
9
+ export async function downloadAllSkills(config, skills, options = {}) {
10
+ const { overwrite = false, verifyHash = true } = options;
11
+ const results = [];
12
+ let success = 0;
13
+ let failed = 0;
14
+ let skipped = 0;
15
+ // Start progress tracking
16
+ logger.startProgress(skills.length, 'Downloading skills');
17
+ // Process skills in batches for concurrency
18
+ const batchSize = config.maxConcurrent;
19
+ for (let i = 0; i < skills.length; i += batchSize) {
20
+ const batch = skills.slice(i, i + batchSize);
21
+ const batchResults = await Promise.all(batch.map((skill) => downloadSingleSkill(config, skill, { overwrite, verifyHash })));
22
+ for (const result of batchResults) {
23
+ results.push(result);
24
+ if (result.success) {
25
+ if (result.skipped) {
26
+ skipped++;
27
+ }
28
+ else {
29
+ success++;
30
+ }
31
+ }
32
+ else {
33
+ failed++;
34
+ }
35
+ logger.incrementProgress();
36
+ }
37
+ }
38
+ logger.completeProgress();
39
+ return {
40
+ total: skills.length,
41
+ success,
42
+ failed,
43
+ skipped,
44
+ results,
45
+ };
46
+ }
47
+ /**
48
+ * Download a single skill
49
+ */
50
+ async function downloadSingleSkill(config, skill, options) {
51
+ const skillPath = join(config.installDir, `${skill.slug}.md`);
52
+ try {
53
+ // Check if skill already exists
54
+ if (!options.overwrite) {
55
+ try {
56
+ await access(skillPath);
57
+ // File exists, skip
58
+ return {
59
+ slug: skill.slug,
60
+ success: true,
61
+ path: skillPath,
62
+ skipped: true,
63
+ };
64
+ }
65
+ catch {
66
+ // File doesn't exist, continue with download
67
+ }
68
+ }
69
+ // Dry run mode - don't actually download
70
+ if (config.dryRun) {
71
+ return {
72
+ slug: skill.slug,
73
+ success: true,
74
+ path: skillPath,
75
+ skipped: true,
76
+ };
77
+ }
78
+ // Download skill content
79
+ const content = await downloadSkill(config, skill.downloadUrl);
80
+ // Verify content hash if enabled
81
+ if (options.verifyHash && skill.contentHash) {
82
+ const hashValid = verifyContentHash(content, skill.contentHash);
83
+ if (!hashValid) {
84
+ return {
85
+ slug: skill.slug,
86
+ success: false,
87
+ error: 'Content hash verification failed',
88
+ };
89
+ }
90
+ }
91
+ // Ensure directory exists
92
+ await mkdir(dirname(skillPath), { recursive: true });
93
+ // Write skill file
94
+ await writeFile(skillPath, content, 'utf-8');
95
+ return {
96
+ slug: skill.slug,
97
+ success: true,
98
+ path: skillPath,
99
+ };
100
+ }
101
+ catch (err) {
102
+ return {
103
+ slug: skill.slug,
104
+ success: false,
105
+ error: err instanceof Error ? err.message : 'Unknown error',
106
+ };
107
+ }
108
+ }
109
+ /**
110
+ * Print download summary
111
+ */
112
+ export function printDownloadSummary(summary) {
113
+ console.log('');
114
+ console.log('Download Summary:');
115
+ for (const result of summary.results) {
116
+ if (result.success) {
117
+ if (result.skipped) {
118
+ logger.skillSummary(result.slug, 'skipped');
119
+ }
120
+ else {
121
+ logger.skillSummary(result.slug, 'installed');
122
+ }
123
+ }
124
+ else {
125
+ logger.skillSummary(result.slug, 'failed');
126
+ if (result.error) {
127
+ console.log(` Error: ${result.error}`);
128
+ }
129
+ }
130
+ }
131
+ console.log('');
132
+ console.log(`Total: ${summary.total} | Installed: ${summary.success} | Skipped: ${summary.skipped} | Failed: ${summary.failed}`);
133
+ }
134
+ //# sourceMappingURL=plugin-download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-download.js","sourceRoot":"","sources":["../../src/lib/plugin-download.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ export interface ProgressState {
2
+ current: number;
3
+ total: number;
4
+ label: string;
5
+ }
6
+ declare class PluginLogger {
7
+ private progressState;
8
+ private spinnerInterval;
9
+ private spinnerFrames;
10
+ private spinnerIndex;
11
+ /**
12
+ * Log info message
13
+ */
14
+ info(message: string): void;
15
+ /**
16
+ * Log success message
17
+ */
18
+ success(message: string): void;
19
+ /**
20
+ * Log warning message
21
+ */
22
+ warn(message: string): void;
23
+ /**
24
+ * Log error message
25
+ */
26
+ error(message: string, err?: Error): void;
27
+ /**
28
+ * Log debug message (only in DEBUG mode)
29
+ */
30
+ debug(message: string): void;
31
+ /**
32
+ * Start a spinner with message
33
+ */
34
+ startSpinner(message: string): void;
35
+ /**
36
+ * Stop the spinner
37
+ */
38
+ stopSpinner(): void;
39
+ /**
40
+ * Complete spinner with success
41
+ */
42
+ spinnerSuccess(message: string): void;
43
+ /**
44
+ * Complete spinner with error
45
+ */
46
+ spinnerError(message: string): void;
47
+ /**
48
+ * Start progress tracking
49
+ */
50
+ startProgress(total: number, label: string): void;
51
+ /**
52
+ * Update progress
53
+ */
54
+ updateProgress(current: number): void;
55
+ /**
56
+ * Increment progress by 1
57
+ */
58
+ incrementProgress(): void;
59
+ /**
60
+ * Complete progress
61
+ */
62
+ completeProgress(): void;
63
+ /**
64
+ * Render progress bar
65
+ */
66
+ private renderProgress;
67
+ /**
68
+ * Print a box with content
69
+ */
70
+ box(title: string, content: string[]): void;
71
+ /**
72
+ * Print skill installation summary
73
+ */
74
+ skillSummary(slug: string, status: 'installed' | 'skipped' | 'failed'): void;
75
+ }
76
+ /** Singleton logger instance */
77
+ export declare const logger: PluginLogger;
78
+ export {};
79
+ //# sourceMappingURL=plugin-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-logger.d.ts","sourceRoot":"","sources":["../../src/lib/plugin-logger.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACd;AAED,cAAM,YAAY;IACjB,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,aAAa,CAAsD;IAC3E,OAAO,CAAC,YAAY,CAAK;IAEzB;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI;IAOzC;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM5B;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAcnC;;OAEG;IACH,WAAW,IAAI,IAAI;IAQnB;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKrC;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKnC;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKjD;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAOrC;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAOzB;;OAEG;IACH,gBAAgB,IAAI,IAAI;IASxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAetB;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAe3C;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI;CAS5E;AAED,gCAAgC;AAChC,eAAO,MAAM,MAAM,cAAqB,CAAC"}