skillstore 0.1.1 → 0.1.3
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 +0 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +54 -21
- package/dist/commands/install.js.map +1 -1
- package/dist/lib/plugin-config.d.ts +2 -2
- package/dist/lib/plugin-config.d.ts.map +1 -1
- package/dist/lib/plugin-config.js +14 -3
- package/dist/lib/plugin-config.js.map +1 -1
- 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/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAkBA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACH,wBAgDG"}
|
package/dist/commands/install.js
CHANGED
|
@@ -3,10 +3,17 @@ import { mkdir, writeFile, access } from 'node:fs/promises';
|
|
|
3
3
|
import { dirname, join } from 'node:path';
|
|
4
4
|
import { getPluginConfig } from '../lib/plugin-config.js';
|
|
5
5
|
import { fetchManifest, reportInstallation, reportSkillInstall, PluginApiError } from '../lib/plugin-api.js';
|
|
6
|
-
import {
|
|
7
|
-
import { verifyManifest } from '../lib/plugin-verify.js';
|
|
6
|
+
import { fetchSkillManifest, downloadSkillZip, SkillApiError } from '../lib/skill-api.js';
|
|
7
|
+
import { verifyManifest, verifySkillManifest, verifyZipHash } from '../lib/plugin-verify.js';
|
|
8
8
|
import { downloadAllSkills, printDownloadSummary } from '../lib/plugin-download.js';
|
|
9
9
|
import { logger } from '../lib/plugin-logger.js';
|
|
10
|
+
/**
|
|
11
|
+
* Normalize skill/plugin slug
|
|
12
|
+
* Converts "owner/name" format to "owner-name" format
|
|
13
|
+
*/
|
|
14
|
+
function normalizeSlug(slug) {
|
|
15
|
+
return slug.replace(/\//g, '-');
|
|
16
|
+
}
|
|
10
17
|
/**
|
|
11
18
|
* Unified install command
|
|
12
19
|
*
|
|
@@ -31,7 +38,7 @@ export default defineCommand({
|
|
|
31
38
|
},
|
|
32
39
|
'skip-verify': {
|
|
33
40
|
type: 'boolean',
|
|
34
|
-
description: 'Skip manifest signature verification
|
|
41
|
+
description: 'Skip manifest signature verification',
|
|
35
42
|
default: false,
|
|
36
43
|
},
|
|
37
44
|
'dry-run': {
|
|
@@ -49,12 +56,14 @@ export default defineCommand({
|
|
|
49
56
|
const { target, dir, 'skip-verify': skipVerify, 'dry-run': dryRun, overwrite } = args;
|
|
50
57
|
// Detect if target is a plugin (@prefix) or skill
|
|
51
58
|
const isPlugin = target.startsWith('@');
|
|
52
|
-
const
|
|
59
|
+
const rawSlug = isPlugin ? target.slice(1) : target;
|
|
60
|
+
// Normalize slug: convert "owner/name" format to "owner-name"
|
|
61
|
+
const slug = normalizeSlug(rawSlug);
|
|
53
62
|
if (isPlugin) {
|
|
54
63
|
await installPlugin(slug, { dir, skipVerify, dryRun, overwrite });
|
|
55
64
|
}
|
|
56
65
|
else {
|
|
57
|
-
await installSkill(slug, { dir, dryRun, overwrite });
|
|
66
|
+
await installSkill(slug, { dir, skipVerify, dryRun, overwrite });
|
|
58
67
|
}
|
|
59
68
|
},
|
|
60
69
|
});
|
|
@@ -62,9 +71,10 @@ export default defineCommand({
|
|
|
62
71
|
* Install a single skill
|
|
63
72
|
*/
|
|
64
73
|
async function installSkill(slug, options) {
|
|
65
|
-
const { dir, dryRun, overwrite } = options;
|
|
74
|
+
const { dir, skipVerify, dryRun, overwrite } = options;
|
|
66
75
|
const config = getPluginConfig({
|
|
67
76
|
installDir: dir,
|
|
77
|
+
skipVerify,
|
|
68
78
|
dryRun,
|
|
69
79
|
});
|
|
70
80
|
logger.info(`Installing skill: ${slug}`);
|
|
@@ -73,18 +83,31 @@ async function installSkill(slug, options) {
|
|
|
73
83
|
logger.warn('Dry run mode - no files will be written');
|
|
74
84
|
}
|
|
75
85
|
try {
|
|
76
|
-
// Step 1: Fetch skill
|
|
77
|
-
logger.startSpinner('Fetching skill
|
|
78
|
-
const
|
|
79
|
-
logger.spinnerSuccess(`Found skill: "${
|
|
80
|
-
// Step 2:
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
+
// Step 1: Fetch skill manifest
|
|
87
|
+
logger.startSpinner('Fetching skill manifest...');
|
|
88
|
+
const manifest = await fetchSkillManifest(config, slug);
|
|
89
|
+
logger.spinnerSuccess(`Found skill: "${manifest.skill.name}"`);
|
|
90
|
+
// Step 2: Verify manifest signature
|
|
91
|
+
if (!skipVerify) {
|
|
92
|
+
logger.startSpinner('Verifying manifest signature...');
|
|
93
|
+
const verifyResult = await verifySkillManifest(manifest);
|
|
94
|
+
if (!verifyResult.valid) {
|
|
95
|
+
logger.spinnerError('Manifest verification failed');
|
|
96
|
+
logger.error(verifyResult.error || 'Unknown verification error');
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
logger.spinnerSuccess('Manifest verified');
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
logger.warn('Skipping signature verification');
|
|
103
|
+
}
|
|
104
|
+
// Step 3: Show skill info
|
|
105
|
+
logger.box(`Skill: ${manifest.skill.name}`, [
|
|
106
|
+
`Slug: ${manifest.skill.slug}`,
|
|
107
|
+
`Version: ${manifest.skill.version}`,
|
|
108
|
+
`Author: ${manifest.skill.author || 'Unknown'}`,
|
|
86
109
|
]);
|
|
87
|
-
// Step
|
|
110
|
+
// Step 4: Check if already installed
|
|
88
111
|
const skillDir = join(config.installDir, slug);
|
|
89
112
|
if (!overwrite) {
|
|
90
113
|
try {
|
|
@@ -102,15 +125,25 @@ async function installSkill(slug, options) {
|
|
|
102
125
|
console.log(`Would install to: ${skillDir}`);
|
|
103
126
|
return;
|
|
104
127
|
}
|
|
105
|
-
// Step
|
|
128
|
+
// Step 5: Download skill ZIP
|
|
106
129
|
logger.startSpinner('Downloading skill...');
|
|
107
130
|
const zipBuffer = await downloadSkillZip(config, slug);
|
|
108
131
|
logger.spinnerSuccess('Downloaded skill package');
|
|
109
|
-
// Step
|
|
132
|
+
// Step 6: Verify ZIP hash
|
|
133
|
+
if (!skipVerify) {
|
|
134
|
+
logger.startSpinner('Verifying content integrity...');
|
|
135
|
+
if (!verifyZipHash(zipBuffer, manifest.skill.zipHash)) {
|
|
136
|
+
logger.spinnerError('Content verification failed');
|
|
137
|
+
logger.error('ZIP hash mismatch - content may be corrupted or tampered');
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
logger.spinnerSuccess('Content verified');
|
|
141
|
+
}
|
|
142
|
+
// Step 7: Extract ZIP
|
|
110
143
|
logger.startSpinner('Extracting files...');
|
|
111
144
|
await extractZip(zipBuffer, config.installDir);
|
|
112
145
|
logger.spinnerSuccess('Extracted files');
|
|
113
|
-
// Step
|
|
146
|
+
// Step 8: Report installation (non-blocking telemetry)
|
|
114
147
|
try {
|
|
115
148
|
await reportSkillInstall(config, slug);
|
|
116
149
|
logger.debug('Installation telemetry reported');
|
|
@@ -118,7 +151,7 @@ async function installSkill(slug, options) {
|
|
|
118
151
|
catch {
|
|
119
152
|
logger.debug('Failed to report telemetry (non-critical)');
|
|
120
153
|
}
|
|
121
|
-
logger.success(`Skill "${
|
|
154
|
+
logger.success(`Skill "${manifest.skill.name}" installed successfully!`);
|
|
122
155
|
console.log('');
|
|
123
156
|
console.log(`Installed to: ${skillDir}`);
|
|
124
157
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Manages default settings for plugin installation and API access.
|
|
5
5
|
*/
|
|
6
|
-
/** Default installation directory for skills */
|
|
7
|
-
export declare const DEFAULT_INSTALL_DIR
|
|
6
|
+
/** Default installation directory for skills (in user's home directory) */
|
|
7
|
+
export declare const DEFAULT_INSTALL_DIR: string;
|
|
8
8
|
/** Skillstore API base URL */
|
|
9
9
|
export declare const API_BASE_URL: string;
|
|
10
10
|
/** Request timeout in milliseconds */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-config.d.ts","sourceRoot":"","sources":["../../src/lib/plugin-config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin-config.d.ts","sourceRoot":"","sources":["../../src/lib/plugin-config.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,mBAAmB,QAAuC,CAAC;AAExE,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,CAmBjF;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"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { resolve } from 'node:path';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
2
3
|
/**
|
|
3
4
|
* Plugin CLI Configuration
|
|
4
5
|
*
|
|
5
6
|
* Manages default settings for plugin installation and API access.
|
|
6
7
|
*/
|
|
7
|
-
/** Default installation directory for skills */
|
|
8
|
-
export const DEFAULT_INSTALL_DIR = '.claude/skills';
|
|
8
|
+
/** Default installation directory for skills (in user's home directory) */
|
|
9
|
+
export const DEFAULT_INSTALL_DIR = resolve(homedir(), '.claude/skills');
|
|
9
10
|
/** Skillstore API base URL */
|
|
10
11
|
export const API_BASE_URL = process.env.SKILLSTORE_API_URL || 'https://skillstore.io/api';
|
|
11
12
|
/** Request timeout in milliseconds */
|
|
@@ -16,9 +17,19 @@ export const MAX_CONCURRENT_DOWNLOADS = 5;
|
|
|
16
17
|
* Get plugin configuration from environment and CLI args
|
|
17
18
|
*/
|
|
18
19
|
export function getPluginConfig(options = {}) {
|
|
20
|
+
// If custom installDir is provided and is relative, resolve against home directory
|
|
21
|
+
let installDir = options.installDir || DEFAULT_INSTALL_DIR;
|
|
22
|
+
if (options.installDir && !options.installDir.startsWith('/') && !options.installDir.startsWith('~')) {
|
|
23
|
+
// Relative path provided - resolve against home directory
|
|
24
|
+
installDir = resolve(homedir(), options.installDir);
|
|
25
|
+
}
|
|
26
|
+
else if (options.installDir?.startsWith('~')) {
|
|
27
|
+
// Expand ~ to home directory
|
|
28
|
+
installDir = resolve(homedir(), options.installDir.slice(2));
|
|
29
|
+
}
|
|
19
30
|
return {
|
|
20
31
|
apiBaseUrl: options.apiBaseUrl || API_BASE_URL,
|
|
21
|
-
installDir
|
|
32
|
+
installDir,
|
|
22
33
|
timeout: options.timeout || REQUEST_TIMEOUT,
|
|
23
34
|
maxConcurrent: options.maxConcurrent || MAX_CONCURRENT_DOWNLOADS,
|
|
24
35
|
skipVerify: options.skipVerify || false,
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"plugin-config.js","sourceRoot":"","sources":["../../src/lib/plugin-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC;;;;GAIG;AAEH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAExE,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,mFAAmF;IACnF,IAAI,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAC3D,IAAI,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtG,0DAA0D;QAC1D,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC;SAAM,IAAI,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,6BAA6B;QAC7B,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO;QACN,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,YAAY;QAC9C,UAAU;QACV,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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { PluginManifest } from './plugin-api.js';
|
|
2
|
+
import type { SkillManifest } from './skill-api.js';
|
|
2
3
|
/**
|
|
3
4
|
* Plugin Manifest Verification
|
|
4
5
|
*
|
|
@@ -32,4 +33,22 @@ export declare function verifyContentHash(content: string, expectedHash: string)
|
|
|
32
33
|
export declare function verifyManifest(manifest: PluginManifest, options?: {
|
|
33
34
|
skipSignature?: boolean;
|
|
34
35
|
}): Promise<VerifyResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Verify skill manifest signature using HMAC-SHA256
|
|
38
|
+
*
|
|
39
|
+
* Similar to verifyManifestSignature but for single skill manifests.
|
|
40
|
+
*/
|
|
41
|
+
export declare function verifySkillManifestSignature(manifest: SkillManifest, key: string): VerifyResult;
|
|
42
|
+
/**
|
|
43
|
+
* Verify skill manifest (signature + structure)
|
|
44
|
+
*/
|
|
45
|
+
export declare function verifySkillManifest(manifest: SkillManifest, options?: {
|
|
46
|
+
skipSignature?: boolean;
|
|
47
|
+
}): Promise<VerifyResult>;
|
|
48
|
+
/**
|
|
49
|
+
* Verify ZIP content hash
|
|
50
|
+
*
|
|
51
|
+
* Computes SHA-256 hash of the ZIP buffer and compares with expected hash.
|
|
52
|
+
*/
|
|
53
|
+
export declare function verifyZipHash(zipBuffer: ArrayBuffer, expectedHash: string): boolean;
|
|
35
54
|
//# sourceMappingURL=plugin-verify.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-verify.d.ts","sourceRoot":"","sources":["../../src/lib/plugin-verify.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin-verify.d.ts","sourceRoot":"","sources":["../../src/lib/plugin-verify.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;;GAIG;AAEH,0BAA0B;AAC1B,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAQD;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,MAAM,GACT,YAAY,CA6Bd;AAgBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAMhF;AAED;;GAEG;AACH,wBAAsB,cAAc,CACnC,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GACvC,OAAO,CAAC,YAAY,CAAC,CA+BvB;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC3C,QAAQ,EAAE,aAAa,EACvB,GAAG,EAAE,MAAM,GACT,YAAY,CA6Bd;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACxC,QAAQ,EAAE,aAAa,EACvB,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GACvC,OAAO,CAAC,YAAY,CAAC,CAwBvB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAMnF"}
|
|
@@ -94,4 +94,70 @@ export async function verifyManifest(manifest, options = {}) {
|
|
|
94
94
|
}
|
|
95
95
|
return { valid: true };
|
|
96
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Verify skill manifest signature using HMAC-SHA256
|
|
99
|
+
*
|
|
100
|
+
* Similar to verifyManifestSignature but for single skill manifests.
|
|
101
|
+
*/
|
|
102
|
+
export function verifySkillManifestSignature(manifest, key) {
|
|
103
|
+
try {
|
|
104
|
+
// Extract signature and create unsigned manifest
|
|
105
|
+
const { signature, ...unsignedManifest } = manifest;
|
|
106
|
+
if (!signature) {
|
|
107
|
+
return { valid: false, error: 'Manifest has no signature' };
|
|
108
|
+
}
|
|
109
|
+
// Compute expected signature (matching server-side implementation)
|
|
110
|
+
const dataToSign = JSON.stringify(unsignedManifest, null, 0);
|
|
111
|
+
const expectedSignature = createHmac('sha256', key)
|
|
112
|
+
.update(dataToSign)
|
|
113
|
+
.digest('hex');
|
|
114
|
+
// Constant-time comparison to prevent timing attacks
|
|
115
|
+
const valid = timingSafeEqual(signature, expectedSignature);
|
|
116
|
+
if (!valid) {
|
|
117
|
+
return { valid: false, error: 'Signature verification failed' };
|
|
118
|
+
}
|
|
119
|
+
return { valid: true };
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
return {
|
|
123
|
+
valid: false,
|
|
124
|
+
error: `Verification error: ${err instanceof Error ? err.message : 'Unknown error'}`,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Verify skill manifest (signature + structure)
|
|
130
|
+
*/
|
|
131
|
+
export async function verifySkillManifest(manifest, options = {}) {
|
|
132
|
+
// Validate manifest structure
|
|
133
|
+
if (!manifest.version || manifest.version !== '1.0') {
|
|
134
|
+
return { valid: false, error: 'Unsupported manifest version' };
|
|
135
|
+
}
|
|
136
|
+
if (!manifest.skill?.slug) {
|
|
137
|
+
return { valid: false, error: 'Missing skill slug in manifest' };
|
|
138
|
+
}
|
|
139
|
+
if (!manifest.skill?.zipHash) {
|
|
140
|
+
return { valid: false, error: 'Missing zipHash in manifest' };
|
|
141
|
+
}
|
|
142
|
+
// Verify signature unless skipped
|
|
143
|
+
if (!options.skipSignature) {
|
|
144
|
+
const key = getVerificationKey();
|
|
145
|
+
const signatureResult = verifySkillManifestSignature(manifest, key);
|
|
146
|
+
if (!signatureResult.valid) {
|
|
147
|
+
return signatureResult;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return { valid: true };
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Verify ZIP content hash
|
|
154
|
+
*
|
|
155
|
+
* Computes SHA-256 hash of the ZIP buffer and compares with expected hash.
|
|
156
|
+
*/
|
|
157
|
+
export function verifyZipHash(zipBuffer, expectedHash) {
|
|
158
|
+
const hash = createHash('sha256')
|
|
159
|
+
.update(Buffer.from(zipBuffer))
|
|
160
|
+
.digest('hex');
|
|
161
|
+
return hash === expectedHash;
|
|
162
|
+
}
|
|
97
163
|
//# sourceMappingURL=plugin-verify.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-verify.js","sourceRoot":"","sources":["../../src/lib/plugin-verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,IAAI,qBAAqB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin-verify.js","sourceRoot":"","sources":["../../src/lib/plugin-verify.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/skill-api.d.ts
CHANGED
|
@@ -16,6 +16,20 @@ export interface SkillInfo {
|
|
|
16
16
|
qualityScore: number | null;
|
|
17
17
|
pluginPath: string | null;
|
|
18
18
|
}
|
|
19
|
+
/** Skill manifest for verification */
|
|
20
|
+
export interface SkillManifest {
|
|
21
|
+
version: '1.0';
|
|
22
|
+
skill: {
|
|
23
|
+
slug: string;
|
|
24
|
+
name: string;
|
|
25
|
+
version: string;
|
|
26
|
+
author?: string;
|
|
27
|
+
zipHash: string;
|
|
28
|
+
};
|
|
29
|
+
downloadUrl: string;
|
|
30
|
+
signature: string;
|
|
31
|
+
generatedAt: string;
|
|
32
|
+
}
|
|
19
33
|
/** API Error */
|
|
20
34
|
export declare class SkillApiError extends Error {
|
|
21
35
|
statusCode: number;
|
|
@@ -26,6 +40,10 @@ export declare class SkillApiError extends Error {
|
|
|
26
40
|
* Fetch skill info/details
|
|
27
41
|
*/
|
|
28
42
|
export declare function fetchSkillInfo(config: PluginConfig, skillSlug: string): Promise<SkillInfo>;
|
|
43
|
+
/**
|
|
44
|
+
* Fetch skill manifest for verification
|
|
45
|
+
*/
|
|
46
|
+
export declare function fetchSkillManifest(config: PluginConfig, skillSlug: string): Promise<SkillManifest>;
|
|
29
47
|
/**
|
|
30
48
|
* Download skill as ZIP
|
|
31
49
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-api.d.ts","sourceRoot":"","sources":["../../src/lib/skill-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;GAIG;AAEH,0BAA0B;AAC1B,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,gBAAgB;AAChB,qBAAa,aAAc,SAAQ,KAAK;IAG/B,UAAU,EAAE,MAAM;IAClB,IAAI,CAAC,EAAE,MAAM;gBAFpB,OAAO,EAAE,MAAM,EACR,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,YAAA;CAKrB;AAgBD;;GAEG;AACH,wBAAsB,cAAc,CACnC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,SAAS,CAAC,CA6BpB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACrC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,CAgBtB"}
|
|
1
|
+
{"version":3,"file":"skill-api.d.ts","sourceRoot":"","sources":["../../src/lib/skill-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;GAIG;AAEH,0BAA0B;AAC1B,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,sCAAsC;AACtC,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,gBAAgB;AAChB,qBAAa,aAAc,SAAQ,KAAK;IAG/B,UAAU,EAAE,MAAM;IAClB,IAAI,CAAC,EAAE,MAAM;gBAFpB,OAAO,EAAE,MAAM,EACR,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,YAAA;CAKrB;AAgBD;;GAEG;AACH,wBAAsB,cAAc,CACnC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,SAAS,CAAC,CA6BpB;AASD;;GAEG;AACH,wBAAsB,kBAAkB,CACvC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,CA4BxB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACrC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,CAgBtB"}
|
package/dist/lib/skill-api.js
CHANGED
|
@@ -47,6 +47,37 @@ export async function fetchSkillInfo(config, skillSlug) {
|
|
|
47
47
|
const result = (await response.json());
|
|
48
48
|
return result.data;
|
|
49
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Get the manifest URL for a skill
|
|
52
|
+
*/
|
|
53
|
+
function getSkillManifestUrl(config, skillSlug) {
|
|
54
|
+
return `${config.apiBaseUrl}/skills/${skillSlug}/manifest`;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Fetch skill manifest for verification
|
|
58
|
+
*/
|
|
59
|
+
export async function fetchSkillManifest(config, skillSlug) {
|
|
60
|
+
const url = getSkillManifestUrl(config, skillSlug);
|
|
61
|
+
const response = await fetch(url, {
|
|
62
|
+
method: 'GET',
|
|
63
|
+
headers: {
|
|
64
|
+
Accept: 'application/json',
|
|
65
|
+
},
|
|
66
|
+
signal: AbortSignal.timeout(config.timeout),
|
|
67
|
+
});
|
|
68
|
+
if (!response.ok) {
|
|
69
|
+
const errorText = await response.text().catch(() => 'Unknown error');
|
|
70
|
+
let errorData = {};
|
|
71
|
+
try {
|
|
72
|
+
errorData = JSON.parse(errorText);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Not JSON
|
|
76
|
+
}
|
|
77
|
+
throw new SkillApiError(errorData.error || `Failed to fetch manifest: ${response.statusText}`, response.status, errorData.code);
|
|
78
|
+
}
|
|
79
|
+
return (await response.json());
|
|
80
|
+
}
|
|
50
81
|
/**
|
|
51
82
|
* Download skill as ZIP
|
|
52
83
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-api.js","sourceRoot":"","sources":["../../src/lib/skill-api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"skill-api.js","sourceRoot":"","sources":["../../src/lib/skill-api.ts"],"names":[],"mappings":"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"}
|