skillpkg-mcp-server 0.3.0 โ 0.4.0
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.js +0 -0
- package/dist/tools/index.d.ts +2 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/install-skill.d.ts +2 -2
- package/dist/tools/install-skill.d.ts.map +1 -1
- package/dist/tools/install-skill.js +164 -98
- package/dist/tools/install-skill.js.map +1 -1
- package/dist/tools/sync-skills.d.ts +9 -0
- package/dist/tools/sync-skills.d.ts.map +1 -0
- package/dist/tools/sync-skills.js +179 -0
- package/dist/tools/sync-skills.js.map +1 -0
- package/dist/tools/uninstall-skill.d.ts +2 -1
- package/dist/tools/uninstall-skill.d.ts.map +1 -1
- package/dist/tools/uninstall-skill.js +82 -14
- package/dist/tools/uninstall-skill.js.map +1 -1
- package/package.json +10 -10
package/dist/cli.js
CHANGED
|
File without changes
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -12,10 +12,11 @@ import { createInstallSkillHandler } from './install-skill.js';
|
|
|
12
12
|
import { createUninstallSkillHandler } from './uninstall-skill.js';
|
|
13
13
|
import { createSkillInfoHandler } from './skill-info.js';
|
|
14
14
|
import { createRecommendSkillHandler } from './recommend-skill.js';
|
|
15
|
+
import { createSyncSkillsHandler } from './sync-skills.js';
|
|
15
16
|
/**
|
|
16
17
|
* Create all tool handlers
|
|
17
18
|
*/
|
|
18
19
|
export declare function createAllToolHandlers(): ToolHandler[];
|
|
19
|
-
export { createListSkillsHandler, createLoadSkillHandler, createSearchSkillsHandler, createInstallSkillHandler, createUninstallSkillHandler, createSkillInfoHandler, createRecommendSkillHandler, };
|
|
20
|
+
export { createListSkillsHandler, createLoadSkillHandler, createSearchSkillsHandler, createInstallSkillHandler, createUninstallSkillHandler, createSyncSkillsHandler, createSkillInfoHandler, createRecommendSkillHandler, };
|
|
20
21
|
export * from './utils.js';
|
|
21
22
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,EAAE,CAcrD;AAGD,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,GAC5B,CAAC;AAGF,cAAc,YAAY,CAAC"}
|
package/dist/tools/index.js
CHANGED
|
@@ -12,6 +12,7 @@ import { createInstallSkillHandler } from './install-skill.js';
|
|
|
12
12
|
import { createUninstallSkillHandler } from './uninstall-skill.js';
|
|
13
13
|
import { createSkillInfoHandler } from './skill-info.js';
|
|
14
14
|
import { createRecommendSkillHandler } from './recommend-skill.js';
|
|
15
|
+
import { createSyncSkillsHandler } from './sync-skills.js';
|
|
15
16
|
/**
|
|
16
17
|
* Create all tool handlers
|
|
17
18
|
*/
|
|
@@ -22,6 +23,7 @@ export function createAllToolHandlers() {
|
|
|
22
23
|
createLoadSkillHandler(),
|
|
23
24
|
createInstallSkillHandler(),
|
|
24
25
|
createUninstallSkillHandler(),
|
|
26
|
+
createSyncSkillsHandler(),
|
|
25
27
|
// Search & Discovery
|
|
26
28
|
createSearchSkillsHandler(),
|
|
27
29
|
createSkillInfoHandler(),
|
|
@@ -29,7 +31,7 @@ export function createAllToolHandlers() {
|
|
|
29
31
|
];
|
|
30
32
|
}
|
|
31
33
|
// Export individual handlers for selective use
|
|
32
|
-
export { createListSkillsHandler, createLoadSkillHandler, createSearchSkillsHandler, createInstallSkillHandler, createUninstallSkillHandler, createSkillInfoHandler, createRecommendSkillHandler, };
|
|
34
|
+
export { createListSkillsHandler, createLoadSkillHandler, createSearchSkillsHandler, createInstallSkillHandler, createUninstallSkillHandler, createSyncSkillsHandler, createSkillInfoHandler, createRecommendSkillHandler, };
|
|
33
35
|
// Re-export utilities
|
|
34
36
|
export * from './utils.js';
|
|
35
37
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,2BAA2B;AAC3B,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,2BAA2B;AAC3B,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,wBAAwB;QACxB,uBAAuB,EAAE;QACzB,sBAAsB,EAAE;QACxB,yBAAyB,EAAE;QAC3B,2BAA2B,EAAE;QAC7B,uBAAuB,EAAE;QAEzB,qBAAqB;QACrB,yBAAyB,EAAE;QAC3B,sBAAsB,EAAE;QACxB,2BAA2B,EAAE;KAC9B,CAAC;AACJ,CAAC;AAED,+CAA+C;AAC/C,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,GAC5B,CAAC;AAEF,sBAAsB;AACtB,cAAc,YAAY,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tool: install_skill
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* v2.0: Uses new Installer module with dependency resolution.
|
|
5
|
+
* Returns dependency info and MCP requirements.
|
|
6
6
|
*/
|
|
7
7
|
import type { ToolHandler } from '../types.js';
|
|
8
8
|
export declare function createInstallSkillHandler(): ToolHandler;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-skill.d.ts","sourceRoot":"","sources":["../../src/tools/install-skill.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"install-skill.d.ts","sourceRoot":"","sources":["../../src/tools/install-skill.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAiC,MAAM,aAAa,CAAC;AA6N9E,wBAAgB,yBAAyB,IAAI,WAAW,CAyHvD"}
|
|
@@ -1,37 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tool: install_skill
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* v2.0: Uses new Installer module with dependency resolution.
|
|
5
|
+
* Returns dependency info and MCP requirements.
|
|
6
6
|
*/
|
|
7
7
|
import { getStore, successResult, errorResult, validateString, validateScope } from './utils.js';
|
|
8
8
|
import { InvalidSourceError } from '../types.js';
|
|
9
|
-
import { parse as parseSkillYaml, detectSkillMd, fetchSkillMdContent } from 'skillpkg-core';
|
|
10
|
-
/**
|
|
11
|
-
* Parse source string to determine source type
|
|
12
|
-
*/
|
|
9
|
+
import { parse as parseSkillYaml, detectSkillMd, fetchSkillMdContent, createInstaller, createStateManager, createConfigManager, } from 'skillpkg-core';
|
|
13
10
|
function parseSource(source) {
|
|
14
|
-
// GitHub: github:user/repo or user/repo
|
|
15
11
|
if (source.startsWith('github:')) {
|
|
16
12
|
return { type: 'github', value: source.slice(7) };
|
|
17
13
|
}
|
|
18
14
|
if (/^[a-zA-Z0-9_-]+\/[a-zA-Z0-9_.-]+$/.test(source)) {
|
|
19
15
|
return { type: 'github', value: source };
|
|
20
16
|
}
|
|
21
|
-
// Gist: gist:id
|
|
22
17
|
if (source.startsWith('gist:')) {
|
|
23
18
|
return { type: 'gist', value: source.slice(5) };
|
|
24
19
|
}
|
|
25
|
-
// URL: https:// or http://
|
|
26
20
|
if (source.startsWith('https://') || source.startsWith('http://')) {
|
|
27
21
|
return { type: 'url', value: source };
|
|
28
22
|
}
|
|
29
|
-
// Local path: starts with ./ or / or contains path separators
|
|
30
23
|
if (source.startsWith('./') || source.startsWith('/') || source.startsWith('../')) {
|
|
31
24
|
return { type: 'local', value: source };
|
|
32
25
|
}
|
|
33
|
-
// Simple skill names are no longer supported (no central registry)
|
|
34
|
-
// Suggest using github:owner/repo format instead
|
|
35
26
|
throw new InvalidSourceError(`Invalid source "${source}". Use one of: github:owner/repo, gist:id, https://url, or ./local/path`);
|
|
36
27
|
}
|
|
37
28
|
/**
|
|
@@ -45,18 +36,21 @@ async function fetchSkillFromUrl(url) {
|
|
|
45
36
|
return response.text();
|
|
46
37
|
}
|
|
47
38
|
/**
|
|
48
|
-
* Fetch skill from GitHub repo
|
|
49
|
-
* Uses shared logic from skillpkg-core
|
|
39
|
+
* Fetch skill from GitHub repo
|
|
50
40
|
*/
|
|
51
41
|
async function fetchSkillFromGitHub(repo) {
|
|
52
42
|
const token = process.env.GITHUB_TOKEN;
|
|
53
|
-
// Try SKILL.md first using core's detection
|
|
54
43
|
const detection = await detectSkillMd(repo, token);
|
|
55
44
|
if (detection.hasSkill && detection.skillFile) {
|
|
56
45
|
const content = await fetchSkillMdContent(repo, detection.skillFile, token);
|
|
57
46
|
if (content) {
|
|
58
|
-
|
|
59
|
-
|
|
47
|
+
return {
|
|
48
|
+
schema: '1.0',
|
|
49
|
+
name: content.name,
|
|
50
|
+
version: content.version,
|
|
51
|
+
description: content.description,
|
|
52
|
+
instructions: content.instructions,
|
|
53
|
+
};
|
|
60
54
|
}
|
|
61
55
|
}
|
|
62
56
|
// Fall back to skill.yaml
|
|
@@ -67,14 +61,17 @@ async function fetchSkillFromGitHub(repo) {
|
|
|
67
61
|
const url = `https://raw.githubusercontent.com/${repo}/${branch}/${path}`;
|
|
68
62
|
try {
|
|
69
63
|
const yamlContent = await fetchSkillFromUrl(url);
|
|
70
|
-
|
|
64
|
+
const result = parseSkillYaml(yamlContent);
|
|
65
|
+
if (result.success && result.data) {
|
|
66
|
+
return result.data;
|
|
67
|
+
}
|
|
71
68
|
}
|
|
72
69
|
catch {
|
|
73
|
-
// Try next
|
|
70
|
+
// Try next
|
|
74
71
|
}
|
|
75
72
|
}
|
|
76
73
|
}
|
|
77
|
-
|
|
74
|
+
return null;
|
|
78
75
|
}
|
|
79
76
|
/**
|
|
80
77
|
* Fetch skill from Gist
|
|
@@ -86,13 +83,15 @@ async function fetchSkillFromGist(gistId) {
|
|
|
86
83
|
throw new Error(`Failed to fetch gist ${gistId}: ${response.status}`);
|
|
87
84
|
}
|
|
88
85
|
const gist = (await response.json());
|
|
89
|
-
// Look for skill.yaml or skill.yml
|
|
90
86
|
for (const [filename, file] of Object.entries(gist.files)) {
|
|
91
87
|
if (filename === 'skill.yaml' || filename === 'skill.yml') {
|
|
92
|
-
|
|
88
|
+
const result = parseSkillYaml(file.content);
|
|
89
|
+
if (result.success && result.data) {
|
|
90
|
+
return result.data;
|
|
91
|
+
}
|
|
93
92
|
}
|
|
94
93
|
}
|
|
95
|
-
|
|
94
|
+
return null;
|
|
96
95
|
}
|
|
97
96
|
/**
|
|
98
97
|
* Fetch skill from local path
|
|
@@ -101,40 +100,114 @@ async function fetchSkillFromLocal(path) {
|
|
|
101
100
|
const fs = await import('fs/promises');
|
|
102
101
|
const nodePath = await import('path');
|
|
103
102
|
let skillPath = path;
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
103
|
+
try {
|
|
104
|
+
const stat = await fs.stat(path);
|
|
105
|
+
if (stat.isDirectory()) {
|
|
106
|
+
const candidates = ['SKILL.md', 'skill.yaml', 'skill.yml'];
|
|
107
|
+
for (const candidate of candidates) {
|
|
108
|
+
const fullPath = nodePath.join(path, candidate);
|
|
109
|
+
try {
|
|
110
|
+
await fs.access(fullPath);
|
|
111
|
+
skillPath = fullPath;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Try next
|
|
116
|
+
}
|
|
114
117
|
}
|
|
115
|
-
|
|
116
|
-
|
|
118
|
+
}
|
|
119
|
+
const content = await fs.readFile(skillPath, 'utf-8');
|
|
120
|
+
// Check if SKILL.md format
|
|
121
|
+
if (skillPath.endsWith('.md')) {
|
|
122
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
|
|
123
|
+
if (match) {
|
|
124
|
+
const { parse: parseYaml } = await import('yaml');
|
|
125
|
+
const frontmatter = parseYaml(match[1]);
|
|
126
|
+
return {
|
|
127
|
+
schema: '1.0',
|
|
128
|
+
name: frontmatter.name,
|
|
129
|
+
version: frontmatter.version || '1.0.0',
|
|
130
|
+
description: frontmatter.description || '',
|
|
131
|
+
instructions: match[2],
|
|
132
|
+
dependencies: frontmatter.dependencies,
|
|
133
|
+
};
|
|
117
134
|
}
|
|
118
135
|
}
|
|
136
|
+
// Parse as YAML
|
|
137
|
+
const result = parseSkillYaml(content);
|
|
138
|
+
if (result.success && result.data) {
|
|
139
|
+
return result.data;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Create a SkillFetcherAdapter
|
|
149
|
+
*/
|
|
150
|
+
function createFetcher() {
|
|
151
|
+
return {
|
|
152
|
+
async fetchMetadata(source) {
|
|
153
|
+
const skill = await fetchSkillBySource(source);
|
|
154
|
+
if (!skill)
|
|
155
|
+
return null;
|
|
156
|
+
return {
|
|
157
|
+
name: skill.name,
|
|
158
|
+
version: skill.version,
|
|
159
|
+
dependencies: skill.dependencies,
|
|
160
|
+
};
|
|
161
|
+
},
|
|
162
|
+
async fetchSkill(source) {
|
|
163
|
+
return fetchSkillBySource(source);
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
async function fetchSkillBySource(source) {
|
|
168
|
+
try {
|
|
169
|
+
const { type, value } = parseSource(source);
|
|
170
|
+
switch (type) {
|
|
171
|
+
case 'github':
|
|
172
|
+
return fetchSkillFromGitHub(value);
|
|
173
|
+
case 'gist':
|
|
174
|
+
return fetchSkillFromGist(value);
|
|
175
|
+
case 'url': {
|
|
176
|
+
const content = await fetchSkillFromUrl(value);
|
|
177
|
+
const result = parseSkillYaml(content);
|
|
178
|
+
return result.success && result.data ? result.data : null;
|
|
179
|
+
}
|
|
180
|
+
case 'local':
|
|
181
|
+
return fetchSkillFromLocal(value);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return null;
|
|
119
186
|
}
|
|
120
|
-
return fs.readFile(skillPath, 'utf-8');
|
|
121
187
|
}
|
|
122
188
|
export function createInstallSkillHandler() {
|
|
123
189
|
return {
|
|
124
190
|
name: 'install_skill',
|
|
125
|
-
description: `Install a skill from various sources
|
|
191
|
+
description: `Install a skill from various sources with dependency resolution.
|
|
192
|
+
|
|
193
|
+
Supports SKILL.md format (industry standard for Claude Code and OpenAI Codex).
|
|
126
194
|
|
|
127
195
|
Supported source formats:
|
|
128
196
|
โข GitHub: github:user/repo or user/repo (e.g., "anthropics/claude-code-skills")
|
|
129
197
|
โข Gist: gist:id (e.g., "gist:abc123")
|
|
130
198
|
โข URL: https://... (direct link to SKILL.md or skill.yaml)
|
|
131
|
-
โข Local: ./path or /absolute/path (local file or directory)
|
|
199
|
+
โข Local: ./path or /absolute/path (local file or directory)
|
|
200
|
+
|
|
201
|
+
Returns:
|
|
202
|
+
โข List of installed skills (including dependencies)
|
|
203
|
+
โข MCP servers required by the skill
|
|
204
|
+
โข Suggestions for next steps`,
|
|
132
205
|
inputSchema: {
|
|
133
206
|
type: 'object',
|
|
134
207
|
properties: {
|
|
135
208
|
source: {
|
|
136
209
|
type: 'string',
|
|
137
|
-
description: 'Source to install from:
|
|
210
|
+
description: 'Source to install from: github:user/repo, gist:id, URL, or local path',
|
|
138
211
|
},
|
|
139
212
|
scope: {
|
|
140
213
|
type: 'string',
|
|
@@ -150,70 +223,63 @@ Supported source formats:
|
|
|
150
223
|
try {
|
|
151
224
|
const sourceStr = validateString(input.source, 'source');
|
|
152
225
|
const scope = validateScope(input.scope, 'local');
|
|
153
|
-
//
|
|
226
|
+
// Normalize source
|
|
154
227
|
const { type, value } = parseSource(sourceStr);
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
break;
|
|
167
|
-
case 'local':
|
|
168
|
-
skillContent = await fetchSkillFromLocal(value);
|
|
169
|
-
break;
|
|
228
|
+
const normalizedSource = type === 'github' ? `github:${value}` : sourceStr;
|
|
229
|
+
// Get project path (cwd for MCP server context)
|
|
230
|
+
const cwd = process.cwd();
|
|
231
|
+
// Create installer
|
|
232
|
+
const stateManager = createStateManager();
|
|
233
|
+
const configManager = createConfigManager();
|
|
234
|
+
const storeManager = getStore(scope);
|
|
235
|
+
const fetcher = createFetcher();
|
|
236
|
+
// Initialize store if needed
|
|
237
|
+
if (!(await storeManager.isInitialized())) {
|
|
238
|
+
await storeManager.init();
|
|
170
239
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
240
|
+
const installer = createInstaller(stateManager, configManager, storeManager, fetcher);
|
|
241
|
+
// Run installation
|
|
242
|
+
const result = await installer.install(cwd, normalizedSource);
|
|
243
|
+
if (!result.success) {
|
|
244
|
+
const errors = result.errors.join('; ');
|
|
245
|
+
return errorResult(`Installation failed: ${errors}`);
|
|
176
246
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
|
|
247
|
+
// Build response
|
|
248
|
+
const installed = result.skills.filter((s) => s.action === 'installed');
|
|
249
|
+
const updated = result.skills.filter((s) => s.action === 'updated');
|
|
250
|
+
const skipped = result.skills.filter((s) => s.action === 'skipped');
|
|
251
|
+
const lines = [];
|
|
252
|
+
if (installed.length > 0) {
|
|
253
|
+
lines.push(`โ
Installed ${installed.length} skill(s):`);
|
|
254
|
+
for (const skill of installed) {
|
|
255
|
+
const note = skill.transitive ? ` (dependency of ${skill.requiredBy})` : '';
|
|
256
|
+
lines.push(` โข ${skill.name} v${skill.version}${note}`);
|
|
257
|
+
}
|
|
182
258
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
success: true,
|
|
189
|
-
skill: {
|
|
190
|
-
id: `${scope}:${skill.name}`,
|
|
191
|
-
name: skill.name,
|
|
192
|
-
version: skill.version,
|
|
193
|
-
source: sourceStr,
|
|
194
|
-
installedAt: new Date().toISOString(),
|
|
195
|
-
},
|
|
196
|
-
message: `Updated "${skill.name}" to v${skill.version} in ${scope} scope.`,
|
|
197
|
-
};
|
|
198
|
-
return successResult(output.message);
|
|
259
|
+
if (updated.length > 0) {
|
|
260
|
+
lines.push(`๐ Updated ${updated.length} skill(s):`);
|
|
261
|
+
for (const skill of updated) {
|
|
262
|
+
lines.push(` โข ${skill.name} v${skill.version}`);
|
|
263
|
+
}
|
|
199
264
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
265
|
+
if (skipped.length > 0) {
|
|
266
|
+
lines.push(`โญ๏ธ Skipped ${skipped.length} already installed skill(s)`);
|
|
267
|
+
}
|
|
268
|
+
// MCP requirements
|
|
269
|
+
if (result.mcpRequired.length > 0) {
|
|
270
|
+
lines.push('');
|
|
271
|
+
lines.push('โ ๏ธ MCP servers required:');
|
|
272
|
+
for (const mcp of result.mcpRequired) {
|
|
273
|
+
lines.push(` โข ${mcp}`);
|
|
274
|
+
}
|
|
275
|
+
lines.push(' Configure these in your skillpkg.json or install manually.');
|
|
276
|
+
}
|
|
277
|
+
// Next steps
|
|
278
|
+
lines.push('');
|
|
279
|
+
lines.push('๐ Next steps:');
|
|
280
|
+
lines.push(' โข Run `skillpkg sync` to sync to AI platforms');
|
|
281
|
+
lines.push(' โข Run `skillpkg tree` to see dependency tree');
|
|
282
|
+
return successResult(lines.join('\n'));
|
|
217
283
|
}
|
|
218
284
|
catch (error) {
|
|
219
285
|
if (error instanceof InvalidSourceError) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../../src/tools/install-skill.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACjG,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,
|
|
1
|
+
{"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../../src/tools/install-skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool: sync_skills
|
|
3
|
+
*
|
|
4
|
+
* v2.0: Syncs installed skills to AI platform directories.
|
|
5
|
+
* Supports multiple targets with incremental sync.
|
|
6
|
+
*/
|
|
7
|
+
import type { ToolHandler } from '../types.js';
|
|
8
|
+
export declare function createSyncSkillsHandler(): ToolHandler;
|
|
9
|
+
//# sourceMappingURL=sync-skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-skills.d.ts","sourceRoot":"","sources":["../../src/tools/sync-skills.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,aAAa,CAAC;AAwD3D,wBAAgB,uBAAuB,IAAI,WAAW,CAsKrD"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool: sync_skills
|
|
3
|
+
*
|
|
4
|
+
* v2.0: Syncs installed skills to AI platform directories.
|
|
5
|
+
* Supports multiple targets with incremental sync.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile } from 'fs/promises';
|
|
8
|
+
import { existsSync } from 'fs';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
import { getStore, successResult, errorResult, validateScope } from './utils.js';
|
|
11
|
+
import { createSyncer, getImplementedTargets, getTargetConfig, } from 'skillpkg-core';
|
|
12
|
+
/**
|
|
13
|
+
* Load skills from store and convert to SkillContent map
|
|
14
|
+
*/
|
|
15
|
+
async function loadSkillsFromStore(storeDir, skillNames) {
|
|
16
|
+
const skills = new Map();
|
|
17
|
+
const skillsDir = join(storeDir, 'skills');
|
|
18
|
+
for (const name of skillNames) {
|
|
19
|
+
const skillYamlPath = join(skillsDir, name, 'skill.yaml');
|
|
20
|
+
if (!existsSync(skillYamlPath)) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const rawContent = await readFile(skillYamlPath, 'utf-8');
|
|
25
|
+
// Parse YAML frontmatter-style or direct YAML
|
|
26
|
+
const { parse } = await import('yaml');
|
|
27
|
+
const parsed = parse(rawContent);
|
|
28
|
+
skills.set(name, {
|
|
29
|
+
name: parsed.name || name,
|
|
30
|
+
version: parsed.version || '1.0.0',
|
|
31
|
+
rawContent,
|
|
32
|
+
bodyContent: parsed.instructions || rawContent,
|
|
33
|
+
frontmatter: parsed,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Skip invalid skills
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return skills;
|
|
41
|
+
}
|
|
42
|
+
export function createSyncSkillsHandler() {
|
|
43
|
+
return {
|
|
44
|
+
name: 'sync_skills',
|
|
45
|
+
description: `Sync installed skills to AI platform directories.
|
|
46
|
+
|
|
47
|
+
Syncs skills from the skillpkg store to platform-specific directories:
|
|
48
|
+
โข claude-code โ .claude/skills/
|
|
49
|
+
โข cursor โ .cursor/skills/
|
|
50
|
+
โข codex โ .codex/skills/
|
|
51
|
+
โข copilot โ .github/copilot/skills/
|
|
52
|
+
โข windsurf โ .windsurf/skills/
|
|
53
|
+
|
|
54
|
+
Currently implemented: claude-code (others reserved for future)
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
โข List of synced skills with status (created/updated/unchanged)
|
|
58
|
+
โข Summary of changes made
|
|
59
|
+
โข Any errors encountered`,
|
|
60
|
+
inputSchema: {
|
|
61
|
+
type: 'object',
|
|
62
|
+
properties: {
|
|
63
|
+
scope: {
|
|
64
|
+
type: 'string',
|
|
65
|
+
enum: ['local', 'global'],
|
|
66
|
+
default: 'local',
|
|
67
|
+
description: 'Scope to sync from: local (project) or global (~/.skillpkg)',
|
|
68
|
+
},
|
|
69
|
+
target: {
|
|
70
|
+
type: 'string',
|
|
71
|
+
description: 'Target platform to sync to (default: all implemented targets). Options: claude-code',
|
|
72
|
+
},
|
|
73
|
+
dryRun: {
|
|
74
|
+
type: 'boolean',
|
|
75
|
+
default: false,
|
|
76
|
+
description: 'Preview sync without making changes',
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
required: [],
|
|
80
|
+
},
|
|
81
|
+
async execute(args) {
|
|
82
|
+
const input = args;
|
|
83
|
+
try {
|
|
84
|
+
const scope = validateScope(input.scope, 'local');
|
|
85
|
+
const dryRun = input.dryRun ?? false;
|
|
86
|
+
// Get project path
|
|
87
|
+
const cwd = process.cwd();
|
|
88
|
+
// Get store
|
|
89
|
+
const store = getStore(scope);
|
|
90
|
+
// Check if store is initialized
|
|
91
|
+
if (!(await store.isInitialized())) {
|
|
92
|
+
return errorResult(`No skills installed in ${scope} scope.`, 'Install skills first using install_skill.');
|
|
93
|
+
}
|
|
94
|
+
// Get skill names from store
|
|
95
|
+
const skillNames = await store.getSkillNames();
|
|
96
|
+
if (skillNames.length === 0) {
|
|
97
|
+
return errorResult('No skills to sync.', 'Install skills first using install_skill.');
|
|
98
|
+
}
|
|
99
|
+
// Load skills from store as SkillContent
|
|
100
|
+
const storeDir = store.getStoreDir();
|
|
101
|
+
const skills = await loadSkillsFromStore(storeDir, skillNames);
|
|
102
|
+
if (skills.size === 0) {
|
|
103
|
+
return errorResult('No valid skills to sync.', 'Check skill files in the store.');
|
|
104
|
+
}
|
|
105
|
+
// Determine targets
|
|
106
|
+
const implementedTargets = getImplementedTargets();
|
|
107
|
+
const implementedIds = implementedTargets.map((t) => t.id);
|
|
108
|
+
let targetIds;
|
|
109
|
+
if (input.target) {
|
|
110
|
+
// Validate target
|
|
111
|
+
if (!implementedIds.includes(input.target)) {
|
|
112
|
+
return errorResult(`Target "${input.target}" is not implemented.`, `Available targets: ${implementedIds.join(', ')}`);
|
|
113
|
+
}
|
|
114
|
+
targetIds = [input.target];
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
// All implemented targets
|
|
118
|
+
targetIds = implementedIds;
|
|
119
|
+
}
|
|
120
|
+
// Create syncer
|
|
121
|
+
const syncer = createSyncer();
|
|
122
|
+
// Sync to each target
|
|
123
|
+
const lines = [];
|
|
124
|
+
let totalCreated = 0;
|
|
125
|
+
let totalUpdated = 0;
|
|
126
|
+
let totalUnchanged = 0;
|
|
127
|
+
if (dryRun) {
|
|
128
|
+
lines.push('๐ Dry run mode - no changes will be made');
|
|
129
|
+
lines.push('');
|
|
130
|
+
}
|
|
131
|
+
for (const targetId of targetIds) {
|
|
132
|
+
const targetConfig = getTargetConfig(targetId);
|
|
133
|
+
lines.push(`๐ Target: ${targetConfig.displayName} (${targetConfig.outputPath})`);
|
|
134
|
+
const result = await syncer.syncToTarget(cwd, skills, targetConfig, { dryRun });
|
|
135
|
+
if (!result.success) {
|
|
136
|
+
lines.push(` โ Error: ${result.errors.join(', ')}`);
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
// Count results from files array
|
|
140
|
+
const created = result.files.filter((f) => f.action === 'created').length;
|
|
141
|
+
const updated = result.files.filter((f) => f.action === 'updated').length;
|
|
142
|
+
const unchanged = result.files.filter((f) => f.action === 'unchanged').length;
|
|
143
|
+
totalCreated += created;
|
|
144
|
+
totalUpdated += updated;
|
|
145
|
+
totalUnchanged += unchanged;
|
|
146
|
+
if (created > 0 || updated > 0) {
|
|
147
|
+
lines.push(` โ
${created} created, ${updated} updated, ${unchanged} unchanged`);
|
|
148
|
+
}
|
|
149
|
+
else if (unchanged > 0) {
|
|
150
|
+
lines.push(` โญ๏ธ All ${unchanged} skills already up to date`);
|
|
151
|
+
}
|
|
152
|
+
// Show details for created/updated
|
|
153
|
+
for (const file of result.files) {
|
|
154
|
+
if (file.action === 'created') {
|
|
155
|
+
lines.push(` + ${file.skillName || file.path}`);
|
|
156
|
+
}
|
|
157
|
+
else if (file.action === 'updated') {
|
|
158
|
+
lines.push(` ~ ${file.skillName || file.path}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Summary
|
|
163
|
+
lines.push('');
|
|
164
|
+
if (dryRun) {
|
|
165
|
+
lines.push(`๐ Would sync: ${totalCreated} create, ${totalUpdated} update, ${totalUnchanged} unchanged`);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
lines.push(`๐ Synced: ${totalCreated} created, ${totalUpdated} updated, ${totalUnchanged} unchanged`);
|
|
169
|
+
}
|
|
170
|
+
return successResult(lines.join('\n'));
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
174
|
+
return errorResult(`Failed to sync skills: ${message}`);
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=sync-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-skills.js","sourceRoot":"","sources":["../../src/tools/sync-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tool: uninstall_skill
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* v2.0: Uses new Installer module with dependency checking.
|
|
5
|
+
* Returns dependency warnings and supports force uninstall.
|
|
5
6
|
*/
|
|
6
7
|
import type { ToolHandler } from '../types.js';
|
|
7
8
|
export declare function createUninstallSkillHandler(): ToolHandler;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall-skill.d.ts","sourceRoot":"","sources":["../../src/tools/uninstall-skill.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"uninstall-skill.d.ts","sourceRoot":"","sources":["../../src/tools/uninstall-skill.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAmC,MAAM,aAAa,CAAC;AAuBhF,wBAAgB,2BAA2B,IAAI,WAAW,CAiIzD"}
|
|
@@ -1,13 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tool: uninstall_skill
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* v2.0: Uses new Installer module with dependency checking.
|
|
5
|
+
* Returns dependency warnings and supports force uninstall.
|
|
5
6
|
*/
|
|
6
7
|
import { getStore, successResult, errorResult, validateString, validateScope } from './utils.js';
|
|
8
|
+
import { createInstaller, createStateManager, createConfigManager, } from 'skillpkg-core';
|
|
9
|
+
/**
|
|
10
|
+
* Create a minimal fetcher adapter (not used for uninstall but required by Installer)
|
|
11
|
+
*/
|
|
12
|
+
function createMinimalFetcher() {
|
|
13
|
+
return {
|
|
14
|
+
async fetchMetadata() {
|
|
15
|
+
return null;
|
|
16
|
+
},
|
|
17
|
+
async fetchSkill() {
|
|
18
|
+
return null;
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
7
22
|
export function createUninstallSkillHandler() {
|
|
8
23
|
return {
|
|
9
24
|
name: 'uninstall_skill',
|
|
10
|
-
description:
|
|
25
|
+
description: `Uninstall a skill by name. Checks for dependencies before removal.
|
|
26
|
+
|
|
27
|
+
If other skills depend on this skill, uninstall will fail unless force=true.
|
|
28
|
+
Use the 'why' command to see what depends on a skill.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
โข Success message with removed skill info
|
|
32
|
+
โข Warning if skill had dependents (with force=true)
|
|
33
|
+
โข Error if skill has dependents (without force)`,
|
|
11
34
|
inputSchema: {
|
|
12
35
|
type: 'object',
|
|
13
36
|
properties: {
|
|
@@ -21,6 +44,11 @@ export function createUninstallSkillHandler() {
|
|
|
21
44
|
default: 'local',
|
|
22
45
|
description: 'Scope to uninstall from: local (project) or global (~/.skillpkg)',
|
|
23
46
|
},
|
|
47
|
+
force: {
|
|
48
|
+
type: 'boolean',
|
|
49
|
+
default: false,
|
|
50
|
+
description: 'Force uninstall even if other skills depend on this one',
|
|
51
|
+
},
|
|
24
52
|
},
|
|
25
53
|
required: ['id'],
|
|
26
54
|
},
|
|
@@ -29,26 +57,66 @@ export function createUninstallSkillHandler() {
|
|
|
29
57
|
try {
|
|
30
58
|
const skillName = validateString(input.id, 'id');
|
|
31
59
|
const scope = validateScope(input.scope, 'local');
|
|
32
|
-
const
|
|
60
|
+
const force = input.force ?? false;
|
|
61
|
+
// Get project path (cwd for MCP server context)
|
|
62
|
+
const cwd = process.cwd();
|
|
63
|
+
// Create installer
|
|
64
|
+
const stateManager = createStateManager();
|
|
65
|
+
const configManager = createConfigManager();
|
|
66
|
+
const storeManager = getStore(scope);
|
|
67
|
+
const fetcher = createMinimalFetcher();
|
|
33
68
|
// Check if store is initialized
|
|
34
|
-
if (!(await
|
|
69
|
+
if (!(await storeManager.isInitialized())) {
|
|
35
70
|
return errorResult(`No skills installed in ${scope} scope.`, 'Use list_skills to see installed skills.');
|
|
36
71
|
}
|
|
37
72
|
// Check if skill exists
|
|
38
|
-
const exists = await
|
|
73
|
+
const exists = await storeManager.hasSkill(skillName);
|
|
39
74
|
if (!exists) {
|
|
40
75
|
return errorResult(`Skill "${skillName}" is not installed in ${scope} scope.`, 'Use list_skills to see installed skills.');
|
|
41
76
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if (!
|
|
45
|
-
|
|
77
|
+
const installer = createInstaller(stateManager, configManager, storeManager, fetcher);
|
|
78
|
+
// Check for dependents (unless force)
|
|
79
|
+
if (!force) {
|
|
80
|
+
const check = await installer.canUninstall(cwd, skillName);
|
|
81
|
+
if (!check.canUninstall) {
|
|
82
|
+
const dependentsList = check.dependents.join(', ');
|
|
83
|
+
return errorResult(`Cannot uninstall "${skillName}" - other skills depend on it:\n ${dependentsList}`, `Use force=true to uninstall anyway, or uninstall the dependent skills first.`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Perform uninstall
|
|
87
|
+
const result = await installer.uninstall(cwd, skillName, {
|
|
88
|
+
force,
|
|
89
|
+
removeOrphans: true,
|
|
90
|
+
});
|
|
91
|
+
if (!result.success) {
|
|
92
|
+
const errors = result.errors.join('; ');
|
|
93
|
+
return errorResult(`Uninstall failed: ${errors}`);
|
|
94
|
+
}
|
|
95
|
+
// Build response
|
|
96
|
+
const lines = [];
|
|
97
|
+
// Main skill removed
|
|
98
|
+
if (result.removed.includes(skillName)) {
|
|
99
|
+
lines.push(`โ
Uninstalled "${skillName}" from ${scope} scope.`);
|
|
100
|
+
}
|
|
101
|
+
// Orphan dependencies removed
|
|
102
|
+
if (result.orphansRemoved.length > 0) {
|
|
103
|
+
lines.push('');
|
|
104
|
+
lines.push(`๐งน Cleaned up ${result.orphansRemoved.length} orphan dependencies:`);
|
|
105
|
+
for (const orphan of result.orphansRemoved) {
|
|
106
|
+
lines.push(` โข ${orphan}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Force warning (check if we had dependents before)
|
|
110
|
+
if (force) {
|
|
111
|
+
// Can't determine from result if there were dependents, but force was used
|
|
112
|
+
lines.push('');
|
|
113
|
+
lines.push('โ ๏ธ Note: Force uninstall was used. Check that dependent skills still work.');
|
|
46
114
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return successResult(
|
|
115
|
+
// Next steps
|
|
116
|
+
lines.push('');
|
|
117
|
+
lines.push('๐ Next steps:');
|
|
118
|
+
lines.push(' โข Run `skillpkg sync` to update platform directories');
|
|
119
|
+
return successResult(lines.join('\n'));
|
|
52
120
|
}
|
|
53
121
|
catch (error) {
|
|
54
122
|
const message = error instanceof Error ? error.message : String(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall-skill.js","sourceRoot":"","sources":["../../src/tools/uninstall-skill.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"uninstall-skill.js","sourceRoot":"","sources":["../../src/tools/uninstall-skill.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skillpkg-mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "MCP Server for skillpkg - Enable AI agents to search, install, and manage skills via Model Context Protocol",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -17,13 +17,6 @@
|
|
|
17
17
|
"files": [
|
|
18
18
|
"dist"
|
|
19
19
|
],
|
|
20
|
-
"scripts": {
|
|
21
|
-
"build": "tsc",
|
|
22
|
-
"dev": "tsc --watch",
|
|
23
|
-
"typecheck": "tsc --noEmit",
|
|
24
|
-
"test": "vitest run",
|
|
25
|
-
"test:watch": "vitest"
|
|
26
|
-
},
|
|
27
20
|
"keywords": [
|
|
28
21
|
"mcp",
|
|
29
22
|
"model-context-protocol",
|
|
@@ -53,12 +46,19 @@
|
|
|
53
46
|
},
|
|
54
47
|
"dependencies": {
|
|
55
48
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
56
|
-
"skillpkg-core": "^0.
|
|
49
|
+
"skillpkg-core": "^0.4.0",
|
|
57
50
|
"yaml": "^2.8.2"
|
|
58
51
|
},
|
|
59
52
|
"devDependencies": {
|
|
60
53
|
"@types/node": "^20.10.0",
|
|
61
54
|
"typescript": "^5.3.0",
|
|
62
55
|
"vitest": "^1.2.0"
|
|
56
|
+
},
|
|
57
|
+
"scripts": {
|
|
58
|
+
"build": "tsc",
|
|
59
|
+
"dev": "tsc --watch",
|
|
60
|
+
"typecheck": "tsc --noEmit",
|
|
61
|
+
"test": "vitest run",
|
|
62
|
+
"test:watch": "vitest"
|
|
63
63
|
}
|
|
64
|
-
}
|
|
64
|
+
}
|