@skillsmith/mcp-server 0.3.7 → 0.3.8
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/.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/assets/skills/skillsmith/SKILL.md +2 -65
- package/dist/src/tools/install.conflict-helpers.test.d.ts +0 -15
- package/dist/src/tools/install.conflict-helpers.test.d.ts.map +0 -1
- package/dist/src/tools/install.conflict-helpers.test.js +0 -243
- package/dist/src/tools/install.conflict-helpers.test.js.map +0 -1
- package/dist/src/tools/install.conflict.test.d.ts +0 -15
- package/dist/src/tools/install.conflict.test.d.ts.map +0 -1
- package/dist/src/tools/install.conflict.test.js +0 -354
- package/dist/src/tools/install.conflict.test.js.map +0 -1
- package/dist/src/tools/merge.test.d.ts +0 -11
- package/dist/src/tools/merge.test.d.ts.map +0 -1
- package/dist/src/tools/merge.test.js +0 -224
- package/dist/src/tools/merge.test.js.map +0 -1
- package/dist/tests/integration/install-conflict.integration.test.d.ts +0 -8
- package/dist/tests/integration/install-conflict.integration.test.d.ts.map +0 -1
- package/dist/tests/integration/install-conflict.integration.test.js +0 -384
- package/dist/tests/integration/install-conflict.integration.test.js.map +0 -1
- package/dist/tests/integration/install-trust-parsing.integration.test.d.ts +0 -13
- package/dist/tests/integration/install-trust-parsing.integration.test.d.ts.map +0 -1
- package/dist/tests/integration/install-trust-parsing.integration.test.js +0 -290
- package/dist/tests/integration/install-trust-parsing.integration.test.js.map +0 -1
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview SMI-1491 & SMI-1533: Install Tool Parsing and Trust Tier Tests
|
|
3
|
-
* @module @skillsmith/mcp-server/tests/integration/install-trust-parsing
|
|
4
|
-
* @see SMI-1491, SMI-1533, SMI-1880
|
|
5
|
-
*
|
|
6
|
-
* Split from install.integration.test.ts per governance (500 line limit)
|
|
7
|
-
*
|
|
8
|
-
* Tests cover:
|
|
9
|
-
* - SMI-1491: parseRepoUrl and parseSkillId with isRegistryId
|
|
10
|
-
* - SMI-1533: Trust-tier security scanning
|
|
11
|
-
*/
|
|
12
|
-
import { describe, it, expect, beforeAll } from 'vitest';
|
|
13
|
-
describe('Install Tool Parsing and Trust Tier Tests', () => {
|
|
14
|
-
/**
|
|
15
|
-
* SMI-1491: Tests for parseRepoUrl function
|
|
16
|
-
* Tests parsing of various repo_url formats from registry
|
|
17
|
-
*/
|
|
18
|
-
describe('SMI-1491: parseRepoUrl', () => {
|
|
19
|
-
// Local implementation matching install.ts
|
|
20
|
-
const parseRepoUrl = (repoUrl) => {
|
|
21
|
-
const url = new URL(repoUrl);
|
|
22
|
-
const parts = url.pathname.split('/').filter(Boolean);
|
|
23
|
-
const owner = parts[0];
|
|
24
|
-
const repo = parts[1];
|
|
25
|
-
if (parts.length === 2) {
|
|
26
|
-
return { owner, repo, path: '', branch: 'main' };
|
|
27
|
-
}
|
|
28
|
-
if (parts[2] === 'tree' || parts[2] === 'blob') {
|
|
29
|
-
return {
|
|
30
|
-
owner,
|
|
31
|
-
repo,
|
|
32
|
-
branch: parts[3],
|
|
33
|
-
path: parts.slice(4).join('/'),
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
return { owner, repo, path: parts.slice(2).join('/'), branch: 'main' };
|
|
37
|
-
};
|
|
38
|
-
it('should parse repo root URL', () => {
|
|
39
|
-
const result = parseRepoUrl('https://github.com/owner/repo');
|
|
40
|
-
expect(result).toEqual({
|
|
41
|
-
owner: 'owner',
|
|
42
|
-
repo: 'repo',
|
|
43
|
-
path: '',
|
|
44
|
-
branch: 'main',
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
it('should parse tree URL with main branch', () => {
|
|
48
|
-
const result = parseRepoUrl('https://github.com/owner/repo/tree/main/skills/commit');
|
|
49
|
-
expect(result).toEqual({
|
|
50
|
-
owner: 'owner',
|
|
51
|
-
repo: 'repo',
|
|
52
|
-
path: 'skills/commit',
|
|
53
|
-
branch: 'main',
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
it('should parse tree URL with custom branch', () => {
|
|
57
|
-
const result = parseRepoUrl('https://github.com/owner/repo/tree/develop/path/to/skill');
|
|
58
|
-
expect(result).toEqual({
|
|
59
|
-
owner: 'owner',
|
|
60
|
-
repo: 'repo',
|
|
61
|
-
path: 'path/to/skill',
|
|
62
|
-
branch: 'develop',
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
it('should parse blob URL', () => {
|
|
66
|
-
const result = parseRepoUrl('https://github.com/owner/repo/blob/main/SKILL.md');
|
|
67
|
-
expect(result).toEqual({
|
|
68
|
-
owner: 'owner',
|
|
69
|
-
repo: 'repo',
|
|
70
|
-
path: 'SKILL.md',
|
|
71
|
-
branch: 'main',
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
it('should handle deep nested paths', () => {
|
|
75
|
-
const result = parseRepoUrl('https://github.com/org/monorepo/tree/main/packages/skills/helper');
|
|
76
|
-
expect(result).toEqual({
|
|
77
|
-
owner: 'org',
|
|
78
|
-
repo: 'monorepo',
|
|
79
|
-
path: 'packages/skills/helper',
|
|
80
|
-
branch: 'main',
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
/**
|
|
85
|
-
* SMI-1491: Tests for updated parseSkillId with isRegistryId flag
|
|
86
|
-
*/
|
|
87
|
-
describe('SMI-1491: parseSkillId with isRegistryId', () => {
|
|
88
|
-
// Local implementation matching install.ts
|
|
89
|
-
const parseSkillId = (input) => {
|
|
90
|
-
if (input.startsWith('https://github.com/')) {
|
|
91
|
-
const url = new URL(input);
|
|
92
|
-
const parts = url.pathname.split('/').filter(Boolean);
|
|
93
|
-
return {
|
|
94
|
-
owner: parts[0],
|
|
95
|
-
repo: parts[1],
|
|
96
|
-
path: parts.slice(2).join('/') || '',
|
|
97
|
-
isRegistryId: false,
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
if (input.includes('/')) {
|
|
101
|
-
const parts = input.split('/');
|
|
102
|
-
if (parts.length === 2) {
|
|
103
|
-
return {
|
|
104
|
-
owner: parts[0],
|
|
105
|
-
repo: parts[1],
|
|
106
|
-
path: '',
|
|
107
|
-
isRegistryId: true,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
return {
|
|
111
|
-
owner: parts[0],
|
|
112
|
-
repo: parts[1],
|
|
113
|
-
path: parts.slice(2).join('/'),
|
|
114
|
-
isRegistryId: false,
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
throw new Error('Invalid skill ID format');
|
|
118
|
-
};
|
|
119
|
-
it('should mark 2-part ID as registry ID', () => {
|
|
120
|
-
const result = parseSkillId('anthropic/commit');
|
|
121
|
-
expect(result.isRegistryId).toBe(true);
|
|
122
|
-
expect(result.owner).toBe('anthropic');
|
|
123
|
-
expect(result.repo).toBe('commit');
|
|
124
|
-
});
|
|
125
|
-
it('should mark 3-part ID as direct path (not registry)', () => {
|
|
126
|
-
const result = parseSkillId('owner/repo/skill-path');
|
|
127
|
-
expect(result.isRegistryId).toBe(false);
|
|
128
|
-
expect(result.owner).toBe('owner');
|
|
129
|
-
expect(result.repo).toBe('repo');
|
|
130
|
-
expect(result.path).toBe('skill-path');
|
|
131
|
-
});
|
|
132
|
-
it('should mark full URL as not registry ID', () => {
|
|
133
|
-
const result = parseSkillId('https://github.com/owner/repo/tree/main/skill');
|
|
134
|
-
expect(result.isRegistryId).toBe(false);
|
|
135
|
-
expect(result.owner).toBe('owner');
|
|
136
|
-
expect(result.repo).toBe('repo');
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
/**
|
|
140
|
-
* SMI-1533: Trust-Tier Security Scanning Tests
|
|
141
|
-
* Tests for trust-tier sensitive security scanning in install flow
|
|
142
|
-
*/
|
|
143
|
-
describe('SMI-1533: Trust-Tier Security Scanning', () => {
|
|
144
|
-
// Import the actual validateTrustTier function from install.types.ts
|
|
145
|
-
// SMI-1718: Import from types file after re-export trimming
|
|
146
|
-
// SMI-1809: Added 'local' tier to return type
|
|
147
|
-
let validateTrustTier;
|
|
148
|
-
beforeAll(async () => {
|
|
149
|
-
const installTypesModule = await import('../../src/tools/install.types.js');
|
|
150
|
-
validateTrustTier = installTypesModule.validateTrustTier;
|
|
151
|
-
});
|
|
152
|
-
// Scanner options per trust tier (matching install.ts)
|
|
153
|
-
// SMI-1809: Added 'local' tier options
|
|
154
|
-
const TRUST_TIER_SCANNER_OPTIONS = {
|
|
155
|
-
verified: { riskThreshold: 70, maxContentLength: 2_000_000 },
|
|
156
|
-
community: { riskThreshold: 40, maxContentLength: 1_000_000 },
|
|
157
|
-
local: { riskThreshold: 100, maxContentLength: 10_000_000 },
|
|
158
|
-
experimental: { riskThreshold: 25, maxContentLength: 500_000 },
|
|
159
|
-
unknown: { riskThreshold: 20, maxContentLength: 250_000 },
|
|
160
|
-
};
|
|
161
|
-
describe('validateTrustTier', () => {
|
|
162
|
-
it('should return "unknown" for null input', () => {
|
|
163
|
-
expect(validateTrustTier(null)).toBe('unknown');
|
|
164
|
-
});
|
|
165
|
-
it('should return "unknown" for undefined input', () => {
|
|
166
|
-
expect(validateTrustTier(undefined)).toBe('unknown');
|
|
167
|
-
});
|
|
168
|
-
it('should return "unknown" for empty string', () => {
|
|
169
|
-
expect(validateTrustTier('')).toBe('unknown');
|
|
170
|
-
});
|
|
171
|
-
it('should validate "verified" tier', () => {
|
|
172
|
-
expect(validateTrustTier('verified')).toBe('verified');
|
|
173
|
-
expect(validateTrustTier('VERIFIED')).toBe('verified');
|
|
174
|
-
expect(validateTrustTier('Verified')).toBe('verified');
|
|
175
|
-
});
|
|
176
|
-
it('should validate "community" tier', () => {
|
|
177
|
-
expect(validateTrustTier('community')).toBe('community');
|
|
178
|
-
expect(validateTrustTier('COMMUNITY')).toBe('community');
|
|
179
|
-
});
|
|
180
|
-
it('should validate "experimental" tier', () => {
|
|
181
|
-
expect(validateTrustTier('experimental')).toBe('experimental');
|
|
182
|
-
expect(validateTrustTier('EXPERIMENTAL')).toBe('experimental');
|
|
183
|
-
});
|
|
184
|
-
it('should return "unknown" for invalid tier values', () => {
|
|
185
|
-
expect(validateTrustTier('invalid')).toBe('unknown');
|
|
186
|
-
expect(validateTrustTier('premium')).toBe('unknown');
|
|
187
|
-
expect(validateTrustTier('trusted')).toBe('unknown');
|
|
188
|
-
expect(validateTrustTier('official')).toBe('unknown');
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
describe('Scanner Options per Trust Tier', () => {
|
|
192
|
-
it('should have highest threshold for verified tier', () => {
|
|
193
|
-
expect(TRUST_TIER_SCANNER_OPTIONS.verified.riskThreshold).toBe(70);
|
|
194
|
-
expect(TRUST_TIER_SCANNER_OPTIONS.verified.maxContentLength).toBe(2_000_000);
|
|
195
|
-
});
|
|
196
|
-
it('should have standard threshold for community tier', () => {
|
|
197
|
-
expect(TRUST_TIER_SCANNER_OPTIONS.community.riskThreshold).toBe(40);
|
|
198
|
-
expect(TRUST_TIER_SCANNER_OPTIONS.community.maxContentLength).toBe(1_000_000);
|
|
199
|
-
});
|
|
200
|
-
it('should have lower threshold for experimental tier', () => {
|
|
201
|
-
expect(TRUST_TIER_SCANNER_OPTIONS.experimental.riskThreshold).toBe(25);
|
|
202
|
-
expect(TRUST_TIER_SCANNER_OPTIONS.experimental.maxContentLength).toBe(500_000);
|
|
203
|
-
});
|
|
204
|
-
it('should have strictest threshold for unknown tier', () => {
|
|
205
|
-
expect(TRUST_TIER_SCANNER_OPTIONS.unknown.riskThreshold).toBe(20);
|
|
206
|
-
expect(TRUST_TIER_SCANNER_OPTIONS.unknown.maxContentLength).toBe(250_000);
|
|
207
|
-
});
|
|
208
|
-
it('should have progressively stricter thresholds', () => {
|
|
209
|
-
expect(TRUST_TIER_SCANNER_OPTIONS.verified.riskThreshold).toBeGreaterThan(TRUST_TIER_SCANNER_OPTIONS.community.riskThreshold);
|
|
210
|
-
expect(TRUST_TIER_SCANNER_OPTIONS.community.riskThreshold).toBeGreaterThan(TRUST_TIER_SCANNER_OPTIONS.experimental.riskThreshold);
|
|
211
|
-
expect(TRUST_TIER_SCANNER_OPTIONS.experimental.riskThreshold).toBeGreaterThan(TRUST_TIER_SCANNER_OPTIONS.unknown.riskThreshold);
|
|
212
|
-
});
|
|
213
|
-
it('should have progressively smaller content limits', () => {
|
|
214
|
-
expect(TRUST_TIER_SCANNER_OPTIONS.verified.maxContentLength).toBeGreaterThan(TRUST_TIER_SCANNER_OPTIONS.community.maxContentLength);
|
|
215
|
-
expect(TRUST_TIER_SCANNER_OPTIONS.community.maxContentLength).toBeGreaterThan(TRUST_TIER_SCANNER_OPTIONS.experimental.maxContentLength);
|
|
216
|
-
expect(TRUST_TIER_SCANNER_OPTIONS.experimental.maxContentLength).toBeGreaterThan(TRUST_TIER_SCANNER_OPTIONS.unknown.maxContentLength);
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
describe('Trust Tier Selection Logic', () => {
|
|
220
|
-
it('should use unknown tier for direct GitHub URLs', () => {
|
|
221
|
-
// Direct GitHub URLs bypass registry lookup, so no trust tier available
|
|
222
|
-
const input = 'https://github.com/random/untrusted-skill';
|
|
223
|
-
const isDirectUrl = input.startsWith('https://github.com/');
|
|
224
|
-
const trustTier = isDirectUrl ? 'unknown' : 'community';
|
|
225
|
-
expect(trustTier).toBe('unknown');
|
|
226
|
-
expect(TRUST_TIER_SCANNER_OPTIONS[trustTier].riskThreshold).toBe(20);
|
|
227
|
-
});
|
|
228
|
-
it('should use registry trust tier when available', () => {
|
|
229
|
-
// Simulating registry lookup returning a trust tier
|
|
230
|
-
const registryResponse = {
|
|
231
|
-
trust_tier: 'verified',
|
|
232
|
-
repo_url: 'https://github.com/anthropic/official-skill',
|
|
233
|
-
};
|
|
234
|
-
const trustTier = validateTrustTier(registryResponse.trust_tier);
|
|
235
|
-
expect(trustTier).toBe('verified');
|
|
236
|
-
expect(TRUST_TIER_SCANNER_OPTIONS[trustTier].riskThreshold).toBe(70);
|
|
237
|
-
});
|
|
238
|
-
it('should fall back to unknown for missing registry trust tier', () => {
|
|
239
|
-
const registryResponse = {
|
|
240
|
-
trust_tier: null,
|
|
241
|
-
repo_url: 'https://github.com/user/skill',
|
|
242
|
-
};
|
|
243
|
-
const trustTier = validateTrustTier(registryResponse.trust_tier);
|
|
244
|
-
expect(trustTier).toBe('unknown');
|
|
245
|
-
});
|
|
246
|
-
});
|
|
247
|
-
describe('Security Scan Behavior by Trust Tier', () => {
|
|
248
|
-
it('should pass more content for verified skills', () => {
|
|
249
|
-
const largeContent = 'x'.repeat(1_500_000); // 1.5MB
|
|
250
|
-
const verifiedLimit = TRUST_TIER_SCANNER_OPTIONS.verified.maxContentLength;
|
|
251
|
-
const communityLimit = TRUST_TIER_SCANNER_OPTIONS.community.maxContentLength;
|
|
252
|
-
// Content exceeds community limit but not verified limit
|
|
253
|
-
expect(largeContent.length).toBeLessThan(verifiedLimit);
|
|
254
|
-
expect(largeContent.length).toBeGreaterThan(communityLimit);
|
|
255
|
-
});
|
|
256
|
-
it('should apply strictest scanning for unknown sources', () => {
|
|
257
|
-
const unknownOptions = TRUST_TIER_SCANNER_OPTIONS.unknown;
|
|
258
|
-
// Verify strictest settings
|
|
259
|
-
expect(unknownOptions.riskThreshold).toBe(20);
|
|
260
|
-
expect(unknownOptions.maxContentLength).toBe(250_000);
|
|
261
|
-
// These are the strictest values
|
|
262
|
-
Object.values(TRUST_TIER_SCANNER_OPTIONS).forEach((options) => {
|
|
263
|
-
expect(unknownOptions.riskThreshold).toBeLessThanOrEqual(options.riskThreshold);
|
|
264
|
-
expect(unknownOptions.maxContentLength).toBeLessThanOrEqual(options.maxContentLength);
|
|
265
|
-
});
|
|
266
|
-
});
|
|
267
|
-
});
|
|
268
|
-
describe('Error Message Context', () => {
|
|
269
|
-
// Helper function to generate tier context string
|
|
270
|
-
const getTierContext = (tier) => tier === 'unknown'
|
|
271
|
-
? ' (Direct GitHub install - strictest scanning applied)'
|
|
272
|
-
: tier === 'experimental'
|
|
273
|
-
? ' (Experimental skill - aggressive scanning applied)'
|
|
274
|
-
: '';
|
|
275
|
-
it('should include trust tier in error context for unknown tier', () => {
|
|
276
|
-
const tierContext = getTierContext('unknown');
|
|
277
|
-
expect(tierContext).toContain('strictest scanning');
|
|
278
|
-
});
|
|
279
|
-
it('should include trust tier in error context for experimental tier', () => {
|
|
280
|
-
const tierContext = getTierContext('experimental');
|
|
281
|
-
expect(tierContext).toContain('aggressive scanning');
|
|
282
|
-
});
|
|
283
|
-
it('should have no extra context for verified/community tiers', () => {
|
|
284
|
-
expect(getTierContext('verified')).toBe('');
|
|
285
|
-
expect(getTierContext('community')).toBe('');
|
|
286
|
-
});
|
|
287
|
-
});
|
|
288
|
-
});
|
|
289
|
-
});
|
|
290
|
-
//# sourceMappingURL=install-trust-parsing.integration.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"install-trust-parsing.integration.test.js","sourceRoot":"","sources":["../../../tests/integration/install-trust-parsing.integration.test.ts"],"names":[],"mappings":"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"}
|