@skillsmith/mcp-server 0.3.3 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +5 -3
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/__tests__/context.test.d.ts +10 -0
  4. package/dist/src/__tests__/context.test.d.ts.map +1 -0
  5. package/dist/src/__tests__/context.test.js +345 -0
  6. package/dist/src/__tests__/context.test.js.map +1 -0
  7. package/dist/src/__tests__/get-skill.test.d.ts +1 -0
  8. package/dist/src/__tests__/get-skill.test.d.ts.map +1 -1
  9. package/dist/src/__tests__/get-skill.test.js +84 -0
  10. package/dist/src/__tests__/get-skill.test.js.map +1 -1
  11. package/dist/src/__tests__/middleware/license.test.js +180 -78
  12. package/dist/src/__tests__/middleware/license.test.js.map +1 -1
  13. package/dist/src/__tests__/search.test.js +2 -1
  14. package/dist/src/__tests__/search.test.js.map +1 -1
  15. package/dist/src/__tests__/utils/validation.test.d.ts +7 -0
  16. package/dist/src/__tests__/utils/validation.test.d.ts.map +1 -0
  17. package/dist/src/__tests__/utils/validation.test.js +82 -0
  18. package/dist/src/__tests__/utils/validation.test.js.map +1 -0
  19. package/dist/src/context.d.ts +16 -0
  20. package/dist/src/context.d.ts.map +1 -1
  21. package/dist/src/context.js +57 -9
  22. package/dist/src/context.js.map +1 -1
  23. package/dist/src/index.js +1 -1
  24. package/dist/src/index.js.map +1 -1
  25. package/dist/src/llm/failover.d.ts +200 -0
  26. package/dist/src/llm/failover.d.ts.map +1 -0
  27. package/dist/src/llm/failover.js +329 -0
  28. package/dist/src/llm/failover.js.map +1 -0
  29. package/dist/src/middleware/license.d.ts +5 -0
  30. package/dist/src/middleware/license.d.ts.map +1 -1
  31. package/dist/src/middleware/license.js +2 -1
  32. package/dist/src/middleware/license.js.map +1 -1
  33. package/dist/src/tools/compare.d.ts +3 -102
  34. package/dist/src/tools/compare.d.ts.map +1 -1
  35. package/dist/src/tools/compare.helpers.d.ts +36 -0
  36. package/dist/src/tools/compare.helpers.d.ts.map +1 -0
  37. package/dist/src/tools/compare.helpers.js +252 -0
  38. package/dist/src/tools/compare.helpers.js.map +1 -0
  39. package/dist/src/tools/compare.js +6 -288
  40. package/dist/src/tools/compare.js.map +1 -1
  41. package/dist/src/tools/compare.types.d.ts +133 -0
  42. package/dist/src/tools/compare.types.d.ts.map +1 -0
  43. package/dist/src/tools/compare.types.js +45 -0
  44. package/dist/src/tools/compare.types.js.map +1 -0
  45. package/dist/src/tools/get-skill.d.ts.map +1 -1
  46. package/dist/src/tools/get-skill.js +35 -2
  47. package/dist/src/tools/get-skill.js.map +1 -1
  48. package/dist/src/tools/install.d.ts +6 -60
  49. package/dist/src/tools/install.d.ts.map +1 -1
  50. package/dist/src/tools/install.helpers.d.ts +82 -0
  51. package/dist/src/tools/install.helpers.d.ts.map +1 -0
  52. package/dist/src/tools/install.helpers.js +324 -0
  53. package/dist/src/tools/install.helpers.js.map +1 -0
  54. package/dist/src/tools/install.js +117 -252
  55. package/dist/src/tools/install.js.map +1 -1
  56. package/dist/src/tools/install.types.d.ts +114 -0
  57. package/dist/src/tools/install.types.d.ts.map +1 -0
  58. package/dist/src/tools/install.types.js +91 -0
  59. package/dist/src/tools/install.types.js.map +1 -0
  60. package/dist/src/tools/recommend.d.ts +2 -148
  61. package/dist/src/tools/recommend.d.ts.map +1 -1
  62. package/dist/src/tools/recommend.helpers.d.ts +42 -0
  63. package/dist/src/tools/recommend.helpers.d.ts.map +1 -0
  64. package/dist/src/tools/recommend.helpers.js +155 -0
  65. package/dist/src/tools/recommend.helpers.js.map +1 -0
  66. package/dist/src/tools/recommend.js +75 -140
  67. package/dist/src/tools/recommend.js.map +1 -1
  68. package/dist/src/tools/recommend.types.d.ts +164 -0
  69. package/dist/src/tools/recommend.types.d.ts.map +1 -0
  70. package/dist/src/tools/recommend.types.js +87 -0
  71. package/dist/src/tools/recommend.types.js.map +1 -0
  72. package/dist/src/tools/search.d.ts +18 -4
  73. package/dist/src/tools/search.d.ts.map +1 -1
  74. package/dist/src/tools/search.js +60 -12
  75. package/dist/src/tools/search.js.map +1 -1
  76. package/dist/src/tools/validate.d.ts +3 -70
  77. package/dist/src/tools/validate.d.ts.map +1 -1
  78. package/dist/src/tools/validate.helpers.d.ts +22 -0
  79. package/dist/src/tools/validate.helpers.d.ts.map +1 -0
  80. package/dist/src/tools/validate.helpers.js +276 -0
  81. package/dist/src/tools/validate.helpers.js.map +1 -0
  82. package/dist/src/tools/validate.js +4 -337
  83. package/dist/src/tools/validate.js.map +1 -1
  84. package/dist/src/tools/validate.types.d.ts +96 -0
  85. package/dist/src/tools/validate.types.d.ts.map +1 -0
  86. package/dist/src/tools/validate.types.js +71 -0
  87. package/dist/src/tools/validate.types.js.map +1 -0
  88. package/dist/src/webhooks/index.d.ts +1 -0
  89. package/dist/src/webhooks/index.d.ts.map +1 -1
  90. package/dist/src/webhooks/index.js +2 -0
  91. package/dist/src/webhooks/index.js.map +1 -1
  92. package/dist/src/webhooks/stripe-webhook-endpoint.d.ts +68 -0
  93. package/dist/src/webhooks/stripe-webhook-endpoint.d.ts.map +1 -0
  94. package/dist/src/webhooks/stripe-webhook-endpoint.js +213 -0
  95. package/dist/src/webhooks/stripe-webhook-endpoint.js.map +1 -0
  96. package/dist/tests/integration/install.integration.test.js +148 -1
  97. package/dist/tests/integration/install.integration.test.js.map +1 -1
  98. package/dist/tests/integration/recommend.integration.test.js +2 -1
  99. package/dist/tests/integration/recommend.integration.test.js.map +1 -1
  100. package/dist/tests/llm/failover.test.d.ts +13 -0
  101. package/dist/tests/llm/failover.test.d.ts.map +1 -0
  102. package/dist/tests/llm/failover.test.js +250 -0
  103. package/dist/tests/llm/failover.test.js.map +1 -0
  104. package/dist/tests/recommend.test.js +133 -1
  105. package/dist/tests/recommend.test.js.map +1 -1
  106. package/dist/tests/tools.test.d.ts +1 -0
  107. package/dist/tests/tools.test.d.ts.map +1 -1
  108. package/dist/tests/tools.test.js +59 -1
  109. package/dist/tests/tools.test.js.map +1 -1
  110. package/dist/tests/unit/compare-helpers.test.d.ts +8 -0
  111. package/dist/tests/unit/compare-helpers.test.d.ts.map +1 -0
  112. package/dist/tests/unit/compare-helpers.test.js +224 -0
  113. package/dist/tests/unit/compare-helpers.test.js.map +1 -0
  114. package/dist/tests/unit/install-helpers.test.d.ts +8 -0
  115. package/dist/tests/unit/install-helpers.test.d.ts.map +1 -0
  116. package/dist/tests/unit/install-helpers.test.js +460 -0
  117. package/dist/tests/unit/install-helpers.test.js.map +1 -0
  118. package/dist/tests/unit/recommend-helpers.test.d.ts +8 -0
  119. package/dist/tests/unit/recommend-helpers.test.d.ts.map +1 -0
  120. package/dist/tests/unit/recommend-helpers.test.js +117 -0
  121. package/dist/tests/unit/recommend-helpers.test.js.map +1 -0
  122. package/dist/tests/unit/validate-helpers.test.d.ts +8 -0
  123. package/dist/tests/unit/validate-helpers.test.d.ts.map +1 -0
  124. package/dist/tests/unit/validate-helpers.test.js +243 -0
  125. package/dist/tests/unit/validate-helpers.test.js.map +1 -0
  126. package/package.json +1 -1
  127. package/src/assets/docs/USER_GUIDE.md +0 -220
  128. package/src/assets/skills/skillsmith/docs/QUOTAS.md +0 -182
  129. package/src/assets/skills/skillsmith/docs/SECURITY.md +0 -174
  130. package/src/assets/skills/skillsmith/docs/TRUST_TIERS.md +0 -142
@@ -0,0 +1,324 @@
1
+ /**
2
+ * @fileoverview Install Tool Helper Functions
3
+ * @module @skillsmith/mcp-server/tools/install.helpers
4
+ */
5
+ import * as fs from 'fs/promises';
6
+ import * as path from 'path';
7
+ import { MANIFEST_PATH, validateTrustTier, } from './install.types.js';
8
+ // ============================================================================
9
+ // Manifest Locking
10
+ // ============================================================================
11
+ /**
12
+ * SMI-1533: Lock file path for manifest operations
13
+ */
14
+ const MANIFEST_LOCK_PATH = MANIFEST_PATH + '.lock';
15
+ const LOCK_TIMEOUT_MS = 30000; // 30 seconds max wait for lock
16
+ const LOCK_RETRY_INTERVAL_MS = 100;
17
+ /**
18
+ * Acquire a file lock for manifest operations
19
+ * SMI-1533: Prevents race conditions during concurrent installs
20
+ */
21
+ export async function acquireManifestLock() {
22
+ const startTime = Date.now();
23
+ while (Date.now() - startTime < LOCK_TIMEOUT_MS) {
24
+ try {
25
+ // Try to create lock file exclusively
26
+ await fs.writeFile(MANIFEST_LOCK_PATH, String(process.pid), { flag: 'wx' });
27
+ return; // Lock acquired
28
+ }
29
+ catch (error) {
30
+ if (error.code === 'EEXIST') {
31
+ // Lock exists, check if it's stale (older than timeout)
32
+ try {
33
+ const stats = await fs.stat(MANIFEST_LOCK_PATH);
34
+ const lockAge = Date.now() - stats.mtimeMs;
35
+ if (lockAge > LOCK_TIMEOUT_MS) {
36
+ // Stale lock, remove it and retry
37
+ await fs.unlink(MANIFEST_LOCK_PATH).catch(() => { });
38
+ continue;
39
+ }
40
+ }
41
+ catch {
42
+ // Lock file disappeared, retry
43
+ continue;
44
+ }
45
+ // Wait before retrying
46
+ await new Promise((resolve) => setTimeout(resolve, LOCK_RETRY_INTERVAL_MS));
47
+ }
48
+ else {
49
+ throw error;
50
+ }
51
+ }
52
+ }
53
+ throw new Error('Failed to acquire manifest lock after ' + LOCK_TIMEOUT_MS + 'ms');
54
+ }
55
+ /**
56
+ * Release the manifest lock
57
+ */
58
+ export async function releaseManifestLock() {
59
+ try {
60
+ await fs.unlink(MANIFEST_LOCK_PATH);
61
+ }
62
+ catch {
63
+ // Ignore errors - lock may already be released
64
+ }
65
+ }
66
+ // ============================================================================
67
+ // Manifest Operations
68
+ // ============================================================================
69
+ /**
70
+ * Load or create manifest
71
+ */
72
+ export async function loadManifest() {
73
+ try {
74
+ const content = await fs.readFile(MANIFEST_PATH, 'utf-8');
75
+ return JSON.parse(content);
76
+ }
77
+ catch {
78
+ return {
79
+ version: '1.0.0',
80
+ installedSkills: {},
81
+ };
82
+ }
83
+ }
84
+ /**
85
+ * Save manifest
86
+ * SMI-1533: Uses atomic write pattern with lock
87
+ */
88
+ export async function saveManifest(manifest) {
89
+ await fs.mkdir(path.dirname(MANIFEST_PATH), { recursive: true });
90
+ // Write to temp file first, then rename for atomic operation
91
+ const tempPath = MANIFEST_PATH + '.tmp.' + process.pid;
92
+ await fs.writeFile(tempPath, JSON.stringify(manifest, null, 2));
93
+ await fs.rename(tempPath, MANIFEST_PATH);
94
+ }
95
+ /**
96
+ * SMI-1533: Safely update manifest with locking
97
+ * Prevents race conditions during concurrent install operations
98
+ */
99
+ export async function updateManifestSafely(updateFn) {
100
+ await acquireManifestLock();
101
+ try {
102
+ const manifest = await loadManifest();
103
+ const updatedManifest = updateFn(manifest);
104
+ await saveManifest(updatedManifest);
105
+ }
106
+ finally {
107
+ await releaseManifestLock();
108
+ }
109
+ }
110
+ // ============================================================================
111
+ // Parsing Functions
112
+ // ============================================================================
113
+ /**
114
+ * Parse skill ID or URL to get components
115
+ * SMI-1491: Added isRegistryId flag to detect registry skill IDs vs direct GitHub URLs
116
+ */
117
+ export function parseSkillId(input) {
118
+ // Handle full GitHub URLs - not registry IDs
119
+ if (input.startsWith('https://github.com/')) {
120
+ const url = new URL(input);
121
+ const parts = url.pathname.split('/').filter(Boolean);
122
+ return {
123
+ owner: parts[0],
124
+ repo: parts[1],
125
+ path: parts.slice(2).join('/') || '',
126
+ isRegistryId: false,
127
+ };
128
+ }
129
+ // Handle slash-separated IDs
130
+ if (input.includes('/')) {
131
+ const parts = input.split('/');
132
+ // 2-part format: Could be registry ID (author/skill-name) - needs lookup
133
+ if (parts.length === 2) {
134
+ return {
135
+ owner: parts[0],
136
+ repo: parts[1],
137
+ path: '',
138
+ isRegistryId: true, // Mark as potential registry ID for lookup
139
+ };
140
+ }
141
+ // 3+ parts: owner/repo/path format (direct GitHub reference)
142
+ return {
143
+ owner: parts[0],
144
+ repo: parts[1],
145
+ path: parts.slice(2).join('/'),
146
+ isRegistryId: false,
147
+ };
148
+ }
149
+ // Handle skill ID from registry
150
+ throw new Error('Invalid skill ID format: ' + input + '. Use owner/repo or GitHub URL.');
151
+ }
152
+ /**
153
+ * Allowed hostnames for skill installation
154
+ * SMI-1533: Restrict to trusted code hosting platforms
155
+ */
156
+ const ALLOWED_HOSTS = ['github.com', 'www.github.com'];
157
+ /**
158
+ * Parse repo_url from registry to extract GitHub components
159
+ * SMI-1491: Handles various GitHub URL formats stored in registry
160
+ */
161
+ export function parseRepoUrl(repoUrl) {
162
+ const url = new URL(repoUrl);
163
+ // SMI-1533: Validate hostname to prevent fetching from malicious sources
164
+ if (!ALLOWED_HOSTS.includes(url.hostname.toLowerCase())) {
165
+ throw new Error(`Invalid repository host: ${url.hostname}. ` +
166
+ `Only GitHub repositories are supported (${ALLOWED_HOSTS.join(', ')})`);
167
+ }
168
+ const parts = url.pathname.split('/').filter(Boolean);
169
+ const owner = parts[0];
170
+ const repo = parts[1];
171
+ // /owner/repo (skill at repo root)
172
+ if (parts.length === 2) {
173
+ return { owner, repo, path: '', branch: 'main' };
174
+ }
175
+ // /owner/repo/tree/branch/path... or /owner/repo/blob/branch/path...
176
+ if (parts[2] === 'tree' || parts[2] === 'blob') {
177
+ return {
178
+ owner,
179
+ repo,
180
+ branch: parts[3],
181
+ path: parts.slice(4).join('/'),
182
+ };
183
+ }
184
+ // Unknown format - assume path starts at index 2, default to main branch
185
+ return { owner, repo, path: parts.slice(2).join('/'), branch: 'main' };
186
+ }
187
+ // ============================================================================
188
+ // Registry Lookup
189
+ // ============================================================================
190
+ /**
191
+ * Look up skill in registry to get repo_url
192
+ * SMI-1491: Enables install to work with registry IDs like "author/skill-name"
193
+ *
194
+ * Follows API-first pattern: tries live API, falls back to local DB
195
+ */
196
+ export async function lookupSkillFromRegistry(skillId, context) {
197
+ // Try API first (primary data source)
198
+ if (!context.apiClient.isOffline()) {
199
+ try {
200
+ const response = await context.apiClient.getSkill(skillId);
201
+ if (response.data.repo_url) {
202
+ return {
203
+ repoUrl: response.data.repo_url,
204
+ name: response.data.name,
205
+ // SMI-1533: Validate trust tier for security scan configuration
206
+ trustTier: validateTrustTier(response.data.trust_tier),
207
+ };
208
+ }
209
+ // API found skill but no repo_url - it's seed data
210
+ return null;
211
+ }
212
+ catch {
213
+ // API failed, fall through to local DB
214
+ }
215
+ }
216
+ // Fallback: Local database
217
+ const dbSkill = context.skillRepository.findById(skillId);
218
+ if (dbSkill?.repoUrl) {
219
+ return {
220
+ repoUrl: dbSkill.repoUrl,
221
+ name: dbSkill.name,
222
+ // SMI-1533: Validate trust tier for security scan configuration
223
+ trustTier: validateTrustTier(dbSkill.trustTier),
224
+ };
225
+ }
226
+ return null;
227
+ }
228
+ // ============================================================================
229
+ // GitHub Fetching
230
+ // ============================================================================
231
+ /**
232
+ * Fetch file from GitHub
233
+ * SMI-1491: Added optional branch parameter to use branch from repo_url
234
+ */
235
+ export async function fetchFromGitHub(owner, repo, filePath, branch = 'main') {
236
+ const url = 'https://raw.githubusercontent.com/' + owner + '/' + repo + '/' + branch + '/' + filePath;
237
+ const response = await fetch(url);
238
+ if (!response.ok) {
239
+ // If specified branch fails and it was 'main', try 'master' as fallback
240
+ if (branch === 'main') {
241
+ const masterUrl = 'https://raw.githubusercontent.com/' + owner + '/' + repo + '/master/' + filePath;
242
+ const masterResponse = await fetch(masterUrl);
243
+ if (!masterResponse.ok) {
244
+ throw new Error('Failed to fetch ' + filePath + ': ' + response.status);
245
+ }
246
+ return masterResponse.text();
247
+ }
248
+ throw new Error('Failed to fetch ' + filePath + ': ' + response.status);
249
+ }
250
+ return response.text();
251
+ }
252
+ /**
253
+ * Validate SKILL.md content
254
+ */
255
+ export function validateSkillMd(content) {
256
+ const errors = [];
257
+ // Check for required sections
258
+ if (!content.includes('# ')) {
259
+ errors.push('Missing title (# heading)');
260
+ }
261
+ // Check minimum length
262
+ if (content.length < 100) {
263
+ errors.push('SKILL.md is too short (minimum 100 characters)');
264
+ }
265
+ return {
266
+ valid: errors.length === 0,
267
+ errors,
268
+ };
269
+ }
270
+ /**
271
+ * Generate post-install tips
272
+ */
273
+ export function generateTips(skillName) {
274
+ return [
275
+ 'Skill "' + skillName + '" installed successfully!',
276
+ 'To use this skill, mention it in Claude Code: "Use the ' + skillName + ' skill to..."',
277
+ 'View installed skills: ls ~/.claude/skills/',
278
+ 'To uninstall: use the uninstall_skill tool',
279
+ ];
280
+ }
281
+ /**
282
+ * SMI-XXX: Generate post-install tips with optimization info
283
+ */
284
+ export function generateOptimizedTips(skillName, optimizationInfo, claudeMdSnippet) {
285
+ const tips = [
286
+ 'Skill "' + skillName + '" installed successfully!',
287
+ 'To use this skill, mention it in Claude Code: "Use the ' + skillName + ' skill to..."',
288
+ 'View installed skills: ls ~/.claude/skills/',
289
+ ];
290
+ if (optimizationInfo.optimized) {
291
+ tips.push('');
292
+ tips.push('✨ Skillsmith Optimization Applied:');
293
+ if (optimizationInfo.tokenReductionPercent && optimizationInfo.tokenReductionPercent > 0) {
294
+ tips.push(` • Estimated ${optimizationInfo.tokenReductionPercent}% token reduction`);
295
+ }
296
+ if (optimizationInfo.originalLines && optimizationInfo.optimizedLines) {
297
+ tips.push(` • Optimized from ${optimizationInfo.originalLines} to ${optimizationInfo.optimizedLines} lines`);
298
+ }
299
+ if (optimizationInfo.subSkills && optimizationInfo.subSkills.length > 0) {
300
+ tips.push(` • ${optimizationInfo.subSkills.length} sub-skills created for on-demand loading`);
301
+ }
302
+ if (optimizationInfo.subagentGenerated && optimizationInfo.subagentPath) {
303
+ tips.push(` • Companion subagent generated: ${optimizationInfo.subagentPath}`);
304
+ tips.push('');
305
+ tips.push('💡 For parallel execution, delegate to the subagent instead of running directly.');
306
+ if (claudeMdSnippet) {
307
+ tips.push('');
308
+ tips.push('Add this to your CLAUDE.md for automatic delegation:');
309
+ tips.push('');
310
+ // Include a shortened version of the snippet
311
+ const shortSnippet = claudeMdSnippet
312
+ .split('\n')
313
+ .filter((line) => line.trim().length > 0)
314
+ .slice(0, 5)
315
+ .join('\n');
316
+ tips.push(shortSnippet + '\n...');
317
+ }
318
+ }
319
+ }
320
+ tips.push('');
321
+ tips.push('To uninstall: use the uninstall_skill tool');
322
+ return tips;
323
+ }
324
+ //# sourceMappingURL=install.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.helpers.js","sourceRoot":"","sources":["../../../src/tools/install.helpers.ts"],"names":[],"mappings":"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"}