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 CHANGED
File without changes
@@ -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;AAEnE;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,EAAE,CAarD;AAGD,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,sBAAsB,EACtB,2BAA2B,GAC5B,CAAC;AAGF,cAAc,YAAY,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"}
@@ -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
@@ -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;AAEnE;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,wBAAwB;QACxB,uBAAuB,EAAE;QACzB,sBAAsB,EAAE;QACxB,yBAAyB,EAAE;QAC3B,2BAA2B,EAAE;QAE7B,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,sBAAsB,EACtB,2BAA2B,GAC5B,CAAC;AAEF,sBAAsB;AACtB,cAAc,YAAY,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
- * Installs a skill from GitHub, Gist, URL, or local path.
5
- * Supports SKILL.md format (industry standard for Claude Code and OpenAI Codex).
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,EAAiE,MAAM,aAAa,CAAC;AA4I9G,wBAAgB,yBAAyB,IAAI,WAAW,CAyHvD"}
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
- * Installs a skill from GitHub, Gist, URL, or local path.
5
- * Supports SKILL.md format (industry standard for Claude Code and OpenAI Codex).
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 (SKILL.md or skill.yaml)
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
- // Convert to skill.yaml format for compatibility
59
- return `schema: "1.0"\nname: ${content.name}\nversion: ${content.version}\ndescription: ${JSON.stringify(content.description)}\ninstructions: |\n${content.instructions.split('\n').map((l) => ' ' + l).join('\n')}`;
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
- return yamlContent;
64
+ const result = parseSkillYaml(yamlContent);
65
+ if (result.success && result.data) {
66
+ return result.data;
67
+ }
71
68
  }
72
69
  catch {
73
- // Try next path/branch
70
+ // Try next
74
71
  }
75
72
  }
76
73
  }
77
- throw new Error(`Could not find SKILL.md or skill.yaml in repository ${repo}`);
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
- return file.content;
88
+ const result = parseSkillYaml(file.content);
89
+ if (result.success && result.data) {
90
+ return result.data;
91
+ }
93
92
  }
94
93
  }
95
- throw new Error(`No skill.yaml found in gist ${gistId}`);
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
- const stat = await fs.stat(path);
105
- if (stat.isDirectory()) {
106
- // Look for skill.yaml in directory
107
- const candidates = ['skill.yaml', 'skill.yml'];
108
- for (const candidate of candidates) {
109
- const fullPath = nodePath.join(path, candidate);
110
- try {
111
- await fs.access(fullPath);
112
- skillPath = fullPath;
113
- break;
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
- catch {
116
- // Try next
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. Supports SKILL.md format (industry standard for Claude Code and OpenAI Codex).
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: skill-name, github:user/repo, gist:id, URL, or local path',
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
- // Parse the source
226
+ // Normalize source
154
227
  const { type, value } = parseSource(sourceStr);
155
- // Fetch skill content based on source type
156
- let skillContent;
157
- switch (type) {
158
- case 'github':
159
- skillContent = await fetchSkillFromGitHub(value);
160
- break;
161
- case 'gist':
162
- skillContent = await fetchSkillFromGist(value);
163
- break;
164
- case 'url':
165
- skillContent = await fetchSkillFromUrl(value);
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
- // Parse the skill content
172
- const parseResult = parseSkillYaml(skillContent);
173
- if (!parseResult.success || !parseResult.data) {
174
- const errors = parseResult.errors?.map((e) => e.message).join(', ') || 'Unknown parse error';
175
- return errorResult(`Invalid skill.yaml: ${errors}`);
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
- const skill = parseResult.data;
178
- // Get the store and initialize if needed
179
- const store = getStore(scope);
180
- if (!(await store.isInitialized())) {
181
- await store.init();
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
- // Check if already installed
184
- if (await store.hasSkill(skill.name)) {
185
- // Update instead of error
186
- await store.updateSkill(skill.name, skill);
187
- const output = {
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
- // Add the skill
201
- await store.addSkill(skill, {
202
- source: type === 'local' ? 'local' : 'import',
203
- sourceUrl: sourceStr,
204
- });
205
- const output = {
206
- success: true,
207
- skill: {
208
- id: `${scope}:${skill.name}`,
209
- name: skill.name,
210
- version: skill.version,
211
- source: sourceStr,
212
- installedAt: new Date().toISOString(),
213
- },
214
- message: `Successfully installed "${skill.name}" v${skill.version} to ${scope} scope.`,
215
- };
216
- return successResult(output.message);
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,EAAE,KAAK,IAAI,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAE5F;;GAEG;AACH,SAAS,WAAW,CAAC,MAAc;IACjC,wCAAwC;IACxC,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,CAAC;IACD,IAAI,mCAAmC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC3C,CAAC;IAED,gBAAgB;IAChB,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,CAAC;IAED,2BAA2B;IAC3B,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAClE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACxC,CAAC;IAED,8DAA8D;IAC9D,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAClF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC1C,CAAC;IAED,mEAAmE;IACnE,iDAAiD;IACjD,MAAM,IAAI,kBAAkB,CAC1B,mBAAmB,MAAM,yEAAyE,CACnG,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAAC,GAAW;IAC1C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,KAAK,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,oBAAoB,CAAC,IAAY;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAEvC,4CAA4C;IAC5C,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEnD,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC5E,IAAI,OAAO,EAAE,CAAC;YACZ,iDAAiD;YACjD,OAAO,wBAAwB,OAAO,CAAC,IAAI,cAAc,OAAO,CAAC,OAAO,kBAAkB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,sBAAsB,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxN,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,MAAM,cAAc,GAAG,CAAC,YAAY,EAAE,WAAW,EAAE,oBAAoB,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE5C,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,qCAAqC,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YAC1E,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;gBACjD,OAAO,WAAW,CAAC;YACrB,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,uDAAuD,IAAI,EAAE,CAAC,CAAC;AACjF,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAAC,MAAc;IAC9C,MAAM,MAAM,GAAG,gCAAgC,MAAM,EAAE,CAAC;IACxD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;IAErC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;IAEF,mCAAmC;IACnC,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,IAAI,QAAQ,KAAK,YAAY,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC,OAAO,CAAC;QACtB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAAC,IAAY;IAC7C,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IAEtC,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEjC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,mCAAmC;QACnC,MAAM,UAAU,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAC/C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAChD,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC1B,SAAS,GAAG,QAAQ,CAAC;gBACrB,MAAM;YACR,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE;;;;;;4DAM2C;QACxD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,mFAAmF;iBACjG;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;oBACzB,OAAO,EAAE,OAAO;oBAChB,WAAW,EAAE,2DAA2D;iBACzE;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB;QAED,KAAK,CAAC,OAAO,CAAC,IAAa;YACzB,MAAM,KAAK,GAAG,IAAyB,CAAC;YAExC,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACzD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBAElD,mBAAmB;gBACnB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;gBAE/C,2CAA2C;gBAC3C,IAAI,YAAoB,CAAC;gBAEzB,QAAQ,IAAI,EAAE,CAAC;oBACb,KAAK,QAAQ;wBACX,YAAY,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC;wBACjD,MAAM;oBAER,KAAK,MAAM;wBACT,YAAY,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC;wBAC/C,MAAM;oBAER,KAAK,KAAK;wBACR,YAAY,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;wBAC9C,MAAM;oBAER,KAAK,OAAO;wBACV,YAAY,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;wBAChD,MAAM;gBACV,CAAC;gBAED,0BAA0B;gBAC1B,MAAM,WAAW,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;gBACjD,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;oBAC9C,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,qBAAqB,CAAC;oBAC7F,OAAO,WAAW,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAC;gBACtD,CAAC;gBAED,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC;gBAE/B,yCAAyC;gBACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC9B,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;oBACnC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;gBACrB,CAAC;gBAED,6BAA6B;gBAC7B,IAAI,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrC,0BAA0B;oBAC1B,MAAM,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBAE3C,MAAM,MAAM,GAAuB;wBACjC,OAAO,EAAE,IAAI;wBACb,KAAK,EAAE;4BACL,EAAE,EAAE,GAAG,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE;4BAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;4BAChB,OAAO,EAAE,KAAK,CAAC,OAAO;4BACtB,MAAM,EAAE,SAAS;4BACjB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;yBACtC;wBACD,OAAO,EAAE,YAAY,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,OAAO,OAAO,KAAK,SAAS;qBAC3E,CAAC;oBAEF,OAAO,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACvC,CAAC;gBAED,gBAAgB;gBAChB,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE;oBAC1B,MAAM,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;oBAC7C,SAAS,EAAE,SAAS;iBACrB,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAuB;oBACjC,OAAO,EAAE,IAAI;oBACb,KAAK,EAAE;wBACL,EAAE,EAAE,GAAG,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE;wBAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,MAAM,EAAE,SAAS;wBACjB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;qBACtC;oBACD,OAAO,EAAE,2BAA2B,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,OAAO,OAAO,KAAK,SAAS;iBACvF,CAAC;gBAEF,OAAO,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;oBACxC,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACpC,CAAC;gBACD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,OAAO,WAAW,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
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
- * Removes an installed skill.
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;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAyD,MAAM,aAAa,CAAC;AAGtG,wBAAgB,2BAA2B,IAAI,WAAW,CAkEzD"}
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
- * Removes an installed skill.
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: 'Uninstall a skill by name. Removes it from the specified scope.',
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 store = getStore(scope);
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 store.isInitialized())) {
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 store.hasSkill(skillName);
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
- // Remove the skill
43
- const removed = await store.removeSkill(skillName);
44
- if (!removed) {
45
- return errorResult(`Failed to uninstall skill "${skillName}".`);
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
- const output = {
48
- success: true,
49
- message: `Successfully uninstalled "${skillName}" from ${scope} scope.`,
50
- };
51
- return successResult(output.message);
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;;;;GAIG;AAGH,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEjG,MAAM,UAAU,2BAA2B;IACzC,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,iEAAiE;QAC9E,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,EAAE,EAAE;oBACF,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gCAAgC;iBAC9C;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;oBACzB,OAAO,EAAE,OAAO;oBAChB,WAAW,EAAE,kEAAkE;iBAChF;aACF;YACD,QAAQ,EAAE,CAAC,IAAI,CAAC;SACjB;QAED,KAAK,CAAC,OAAO,CAAC,IAAa;YACzB,MAAM,KAAK,GAAG,IAA2B,CAAC;YAE1C,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBACjD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBAElD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAE9B,gCAAgC;gBAChC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;oBACnC,OAAO,WAAW,CAChB,0BAA0B,KAAK,SAAS,EACxC,0CAA0C,CAC3C,CAAC;gBACJ,CAAC;gBAED,wBAAwB;gBACxB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,WAAW,CAChB,UAAU,SAAS,yBAAyB,KAAK,SAAS,EAC1D,0CAA0C,CAC3C,CAAC;gBACJ,CAAC;gBAED,mBAAmB;gBACnB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;gBAEnD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO,WAAW,CAAC,8BAA8B,SAAS,IAAI,CAAC,CAAC;gBAClE,CAAC;gBAED,MAAM,MAAM,GAAyB;oBACnC,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,6BAA6B,SAAS,UAAU,KAAK,SAAS;iBACxE,CAAC;gBAEF,OAAO,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,OAAO,WAAW,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
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.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.2.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
+ }