@skillsmith/mcp-server 0.4.9 → 0.4.11
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/CHANGELOG.md +16 -6
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/__tests__/get-skill.api-path.test.d.ts +10 -0
- package/dist/src/__tests__/get-skill.api-path.test.d.ts.map +1 -0
- package/dist/src/__tests__/get-skill.api-path.test.js +189 -0
- package/dist/src/__tests__/get-skill.api-path.test.js.map +1 -0
- package/dist/src/__tests__/test-utils.d.ts +25 -0
- package/dist/src/__tests__/test-utils.d.ts.map +1 -1
- package/dist/src/__tests__/test-utils.js +45 -0
- package/dist/src/__tests__/test-utils.js.map +1 -1
- package/dist/src/__tests__/utils/validation.test.js +32 -1
- package/dist/src/__tests__/utils/validation.test.js.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/tools/analytics.d.ts +8 -8
- package/dist/src/tools/audit-tools.d.ts +6 -6
- package/dist/src/tools/compliance-tools.d.ts +2 -2
- package/dist/src/tools/get-skill.d.ts.map +1 -1
- package/dist/src/tools/get-skill.js +29 -2
- package/dist/src/tools/get-skill.js.map +1 -1
- package/dist/src/tools/integration-tools.d.ts +8 -8
- package/dist/src/tools/publish.types.d.ts +2 -2
- package/dist/src/tools/rbac-tools.d.ts +4 -4
- package/dist/src/tools/recommend.types.d.ts +3 -3
- package/dist/src/tools/registry-tools.d.ts +6 -6
- package/dist/src/tools/skill-diff.d.ts +2 -2
- package/dist/src/tools/sso-tools.d.ts +2 -2
- package/dist/src/tools/suggest.d.ts +4 -4
- package/dist/src/tools/team-workspace.d.ts +4 -4
- package/dist/src/tools/uninstall.d.ts +1 -1
- package/dist/src/utils/validation.d.ts +24 -0
- package/dist/src/utils/validation.d.ts.map +1 -1
- package/dist/src/utils/validation.js +38 -0
- package/dist/src/utils/validation.js.map +1 -1
- package/package.json +2 -2
- package/server.json +7 -3
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-4240: API-path tests for executeGetSkill
|
|
3
|
+
*
|
|
4
|
+
* These exercise the `!context.apiClient.isOffline()` branch of get-skill.ts,
|
|
5
|
+
* which the pre-existing get-skill.test.ts cannot reach (it seeds a local
|
|
6
|
+
* SQLite context in offline mode). The fixture-driven context comes from
|
|
7
|
+
* createApiMockContext — see test-utils.ts.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=get-skill.api-path.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-skill.api-path.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/get-skill.api-path.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-4240: API-path tests for executeGetSkill
|
|
3
|
+
*
|
|
4
|
+
* These exercise the `!context.apiClient.isOffline()` branch of get-skill.ts,
|
|
5
|
+
* which the pre-existing get-skill.test.ts cannot reach (it seeds a local
|
|
6
|
+
* SQLite context in offline mode). The fixture-driven context comes from
|
|
7
|
+
* createApiMockContext — see test-utils.ts.
|
|
8
|
+
*/
|
|
9
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
10
|
+
import { executeGetSkill } from '../tools/get-skill.js';
|
|
11
|
+
import { createApiMockContext } from './test-utils.js';
|
|
12
|
+
let context;
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
context?.db.close();
|
|
15
|
+
context = undefined;
|
|
16
|
+
});
|
|
17
|
+
describe('executeGetSkill (API path)', () => {
|
|
18
|
+
describe('category mapping', () => {
|
|
19
|
+
it('prefers the API-provided category over tag inference', async () => {
|
|
20
|
+
// Tags are empty, but API says the skill is a database skill.
|
|
21
|
+
// Tag-inference alone would return "other" — the fix makes
|
|
22
|
+
// categories[] win.
|
|
23
|
+
context = createApiMockContext({
|
|
24
|
+
apiSkill: {
|
|
25
|
+
id: 'microsoft/azure-resource-manager-redis-dotnet',
|
|
26
|
+
name: 'azure-resource-manager-redis-dotnet',
|
|
27
|
+
author: 'microsoft',
|
|
28
|
+
trust_tier: 'verified',
|
|
29
|
+
tags: ['agent-skills', 'azure', 'sdk'],
|
|
30
|
+
},
|
|
31
|
+
categories: ['Database'],
|
|
32
|
+
});
|
|
33
|
+
const result = await executeGetSkill({ id: 'microsoft/azure-resource-manager-redis-dotnet' }, context);
|
|
34
|
+
expect(result.skill.category).toBe('database');
|
|
35
|
+
});
|
|
36
|
+
it('normalizes plural API category names to the singular enum form', async () => {
|
|
37
|
+
context = createApiMockContext({
|
|
38
|
+
apiSkill: {
|
|
39
|
+
id: 'x/y',
|
|
40
|
+
name: 'y',
|
|
41
|
+
trust_tier: 'community',
|
|
42
|
+
tags: [],
|
|
43
|
+
},
|
|
44
|
+
categories: ['integrations'], // DB uses plural; enum is singular
|
|
45
|
+
});
|
|
46
|
+
const result = await executeGetSkill({ id: 'x/y' }, context);
|
|
47
|
+
expect(result.skill.category).toBe('integration');
|
|
48
|
+
});
|
|
49
|
+
it('falls back to tag inference when API returns an empty categories array', async () => {
|
|
50
|
+
context = createApiMockContext({
|
|
51
|
+
apiSkill: {
|
|
52
|
+
id: 'x/y',
|
|
53
|
+
name: 'y',
|
|
54
|
+
trust_tier: 'community',
|
|
55
|
+
tags: ['jest', 'testing'],
|
|
56
|
+
},
|
|
57
|
+
categories: [],
|
|
58
|
+
});
|
|
59
|
+
const result = await executeGetSkill({ id: 'x/y' }, context);
|
|
60
|
+
expect(result.skill.category).toBe('testing');
|
|
61
|
+
});
|
|
62
|
+
it('falls back to tag inference when API returns an unmappable category', async () => {
|
|
63
|
+
context = createApiMockContext({
|
|
64
|
+
apiSkill: {
|
|
65
|
+
id: 'x/y',
|
|
66
|
+
name: 'y',
|
|
67
|
+
trust_tier: 'community',
|
|
68
|
+
tags: ['jest'],
|
|
69
|
+
},
|
|
70
|
+
categories: ['product'], // present in DB, not in SkillCategory enum
|
|
71
|
+
});
|
|
72
|
+
const result = await executeGetSkill({ id: 'x/y' }, context);
|
|
73
|
+
expect(result.skill.category).toBe('testing');
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe('security summary derivation', () => {
|
|
77
|
+
it('returns passed=true for a clean scanned skill', async () => {
|
|
78
|
+
context = createApiMockContext({
|
|
79
|
+
apiSkill: {
|
|
80
|
+
id: 'x/y',
|
|
81
|
+
name: 'y',
|
|
82
|
+
trust_tier: 'verified',
|
|
83
|
+
last_scanned_at: '2026-02-18T05:07:13.844Z',
|
|
84
|
+
security_score: 0,
|
|
85
|
+
security_findings: [],
|
|
86
|
+
quarantined: false,
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
const result = await executeGetSkill({ id: 'x/y' }, context);
|
|
90
|
+
expect(result.skill.security).toEqual({
|
|
91
|
+
passed: true,
|
|
92
|
+
riskScore: 0,
|
|
93
|
+
findingsCount: 0,
|
|
94
|
+
scannedAt: '2026-02-18T05:07:13.844Z',
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
it('returns passed=false for a quarantined skill', async () => {
|
|
98
|
+
context = createApiMockContext({
|
|
99
|
+
apiSkill: {
|
|
100
|
+
id: 'x/y',
|
|
101
|
+
name: 'y',
|
|
102
|
+
trust_tier: 'community',
|
|
103
|
+
last_scanned_at: '2026-02-18T05:07:13.844Z',
|
|
104
|
+
security_score: 85,
|
|
105
|
+
security_findings: [{}, {}, {}],
|
|
106
|
+
quarantined: true,
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
const result = await executeGetSkill({ id: 'x/y' }, context);
|
|
110
|
+
expect(result.skill.security?.passed).toBe(false);
|
|
111
|
+
expect(result.skill.security?.findingsCount).toBe(3);
|
|
112
|
+
expect(result.skill.security?.riskScore).toBe(85);
|
|
113
|
+
});
|
|
114
|
+
it('returns passed=null when a scan timestamp exists but no score', async () => {
|
|
115
|
+
context = createApiMockContext({
|
|
116
|
+
apiSkill: {
|
|
117
|
+
id: 'x/y',
|
|
118
|
+
name: 'y',
|
|
119
|
+
trust_tier: 'community',
|
|
120
|
+
last_scanned_at: '2026-02-18T05:07:13.844Z',
|
|
121
|
+
security_score: null,
|
|
122
|
+
security_findings: null,
|
|
123
|
+
quarantined: false,
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
const result = await executeGetSkill({ id: 'x/y' }, context);
|
|
127
|
+
expect(result.skill.security?.passed).toBeNull();
|
|
128
|
+
expect(result.skill.security?.riskScore).toBeNull();
|
|
129
|
+
expect(result.skill.security?.findingsCount).toBe(0);
|
|
130
|
+
});
|
|
131
|
+
it('omits security entirely when the skill has never been scanned', async () => {
|
|
132
|
+
context = createApiMockContext({
|
|
133
|
+
apiSkill: {
|
|
134
|
+
id: 'x/y',
|
|
135
|
+
name: 'y',
|
|
136
|
+
trust_tier: 'community',
|
|
137
|
+
last_scanned_at: null,
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
const result = await executeGetSkill({ id: 'x/y' }, context);
|
|
141
|
+
// The extension renders undefined and { passed: null } identically
|
|
142
|
+
// in getSecurityScanHtml, so omission is preferable to shipping a
|
|
143
|
+
// noisy placeholder object.
|
|
144
|
+
expect(result.skill.security).toBeUndefined();
|
|
145
|
+
});
|
|
146
|
+
it('derives findingsCount from the security_findings jsonb array', async () => {
|
|
147
|
+
context = createApiMockContext({
|
|
148
|
+
apiSkill: {
|
|
149
|
+
id: 'x/y',
|
|
150
|
+
name: 'y',
|
|
151
|
+
trust_tier: 'community',
|
|
152
|
+
last_scanned_at: '2026-02-18T05:07:13.844Z',
|
|
153
|
+
security_score: 30,
|
|
154
|
+
security_findings: [{ rule: 'hardcoded-secret' }, { rule: 'weak-hash' }],
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
const result = await executeGetSkill({ id: 'x/y' }, context);
|
|
158
|
+
expect(result.skill.security?.findingsCount).toBe(2);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
describe('repository URL passthrough', () => {
|
|
162
|
+
it('maps repo_url to skill.repository', async () => {
|
|
163
|
+
const url = 'https://github.com/microsoft/skills/tree/main/.github/skills/azure-resource-manager-redis-dotnet';
|
|
164
|
+
context = createApiMockContext({
|
|
165
|
+
apiSkill: {
|
|
166
|
+
id: 'x/y',
|
|
167
|
+
name: 'y',
|
|
168
|
+
trust_tier: 'verified',
|
|
169
|
+
repo_url: url,
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
const result = await executeGetSkill({ id: 'x/y' }, context);
|
|
173
|
+
expect(result.skill.repository).toBe(url);
|
|
174
|
+
});
|
|
175
|
+
it('leaves skill.repository undefined when repo_url is null', async () => {
|
|
176
|
+
context = createApiMockContext({
|
|
177
|
+
apiSkill: {
|
|
178
|
+
id: 'x/y',
|
|
179
|
+
name: 'y',
|
|
180
|
+
trust_tier: 'community',
|
|
181
|
+
repo_url: null,
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
const result = await executeGetSkill({ id: 'x/y' }, context);
|
|
185
|
+
expect(result.skill.repository).toBeUndefined();
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
//# sourceMappingURL=get-skill.api-path.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-skill.api-path.test.js","sourceRoot":"","sources":["../../../src/__tests__/get-skill.api-path.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAoB,MAAM,iBAAiB,CAAA;AAExE,IAAI,OAAgC,CAAA;AAEpC,SAAS,CAAC,GAAG,EAAE;IACb,OAAO,EAAE,EAAE,CAAC,KAAK,EAAE,CAAA;IACnB,OAAO,GAAG,SAAS,CAAA;AACrB,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,8DAA8D;YAC9D,2DAA2D;YAC3D,oBAAoB;YACpB,OAAO,GAAG,oBAAoB,CAAC;gBAC7B,QAAQ,EAAE;oBACR,EAAE,EAAE,+CAA+C;oBACnD,IAAI,EAAE,qCAAqC;oBAC3C,MAAM,EAAE,WAAW;oBACnB,UAAU,EAAE,UAAU;oBACtB,IAAI,EAAE,CAAC,cAAc,EAAE,OAAO,EAAE,KAAK,CAAC;iBACvC;gBACD,UAAU,EAAE,CAAC,UAAU,CAAC;aACzB,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,eAAe,CAClC,EAAE,EAAE,EAAE,+CAA+C,EAAE,EACvD,OAAO,CACR,CAAA;YAED,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAChD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC9E,OAAO,GAAG,oBAAoB,CAAC;gBAC7B,QAAQ,EAAE;oBACR,EAAE,EAAE,KAAK;oBACT,IAAI,EAAE,GAAG;oBACT,UAAU,EAAE,WAAW;oBACvB,IAAI,EAAE,EAAE;iBACT;gBACD,UAAU,EAAE,CAAC,cAAc,CAAC,EAAE,mCAAmC;aAClE,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAA;YAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;YACtF,OAAO,GAAG,oBAAoB,CAAC;gBAC7B,QAAQ,EAAE;oBACR,EAAE,EAAE,KAAK;oBACT,IAAI,EAAE,GAAG;oBACT,UAAU,EAAE,WAAW;oBACvB,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;iBAC1B;gBACD,UAAU,EAAE,EAAE;aACf,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAA;YAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACnF,OAAO,GAAG,oBAAoB,CAAC;gBAC7B,QAAQ,EAAE;oBACR,EAAE,EAAE,KAAK;oBACT,IAAI,EAAE,GAAG;oBACT,UAAU,EAAE,WAAW;oBACvB,IAAI,EAAE,CAAC,MAAM,CAAC;iBACf;gBACD,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE,2CAA2C;aACrE,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAA;YAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,OAAO,GAAG,oBAAoB,CAAC;gBAC7B,QAAQ,EAAE;oBACR,EAAE,EAAE,KAAK;oBACT,IAAI,EAAE,GAAG;oBACT,UAAU,EAAE,UAAU;oBACtB,eAAe,EAAE,0BAA0B;oBAC3C,cAAc,EAAE,CAAC;oBACjB,iBAAiB,EAAE,EAAE;oBACrB,WAAW,EAAE,KAAK;iBACnB;aACF,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAA;YAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;gBACpC,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,CAAC;gBACZ,aAAa,EAAE,CAAC;gBAChB,SAAS,EAAE,0BAA0B;aACtC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,OAAO,GAAG,oBAAoB,CAAC;gBAC7B,QAAQ,EAAE;oBACR,EAAE,EAAE,KAAK;oBACT,IAAI,EAAE,GAAG;oBACT,UAAU,EAAE,WAAW;oBACvB,eAAe,EAAE,0BAA0B;oBAC3C,cAAc,EAAE,EAAE;oBAClB,iBAAiB,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;oBAC/B,WAAW,EAAE,IAAI;iBAClB;aACF,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAA;YAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACjD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACpD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC7E,OAAO,GAAG,oBAAoB,CAAC;gBAC7B,QAAQ,EAAE;oBACR,EAAE,EAAE,KAAK;oBACT,IAAI,EAAE,GAAG;oBACT,UAAU,EAAE,WAAW;oBACvB,eAAe,EAAE,0BAA0B;oBAC3C,cAAc,EAAE,IAAI;oBACpB,iBAAiB,EAAE,IAAI;oBACvB,WAAW,EAAE,KAAK;iBACnB;aACF,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAA;YAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;YAChD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAA;YACnD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC7E,OAAO,GAAG,oBAAoB,CAAC;gBAC7B,QAAQ,EAAE;oBACR,EAAE,EAAE,KAAK;oBACT,IAAI,EAAE,GAAG;oBACT,UAAU,EAAE,WAAW;oBACvB,eAAe,EAAE,IAAI;iBACtB;aACF,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAA;YAC5D,mEAAmE;YACnE,kEAAkE;YAClE,4BAA4B;YAC5B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAA;QAC/C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;YAC5E,OAAO,GAAG,oBAAoB,CAAC;gBAC7B,QAAQ,EAAE;oBACR,EAAE,EAAE,KAAK;oBACT,IAAI,EAAE,GAAG;oBACT,UAAU,EAAE,WAAW;oBACvB,eAAe,EAAE,0BAA0B;oBAC3C,cAAc,EAAE,EAAE;oBAClB,iBAAiB,EAAE,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;iBACzE;aACF,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAA;YAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,GAAG,GACP,kGAAkG,CAAA;YACpG,OAAO,GAAG,oBAAoB,CAAC;gBAC7B,QAAQ,EAAE;oBACR,EAAE,EAAE,KAAK;oBACT,IAAI,EAAE,GAAG;oBACT,UAAU,EAAE,UAAU;oBACtB,QAAQ,EAAE,GAAG;iBACd;aACF,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAA;YAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC3C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,OAAO,GAAG,oBAAoB,CAAC;gBAC7B,QAAQ,EAAE;oBACR,EAAE,EAAE,KAAK;oBACT,IAAI,EAAE,GAAG;oBACT,UAAU,EAAE,WAAW;oBACvB,QAAQ,EAAE,IAAI;iBACf;aACF,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAA;YAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,aAAa,EAAE,CAAA;QACjD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Test utilities for MCP server tests
|
|
3
3
|
* @see SMI-792: Database initialization
|
|
4
|
+
* @see SMI-4240: createApiMockContext for API-path coverage
|
|
4
5
|
*/
|
|
6
|
+
import type { ApiSkill } from '@skillsmith/core';
|
|
5
7
|
import { type ToolContext } from '../context.js';
|
|
6
8
|
export type { ToolContext };
|
|
7
9
|
/**
|
|
@@ -17,4 +19,27 @@ export declare function seedTestData(context: ToolContext): void;
|
|
|
17
19
|
* Create a seeded test context
|
|
18
20
|
*/
|
|
19
21
|
export declare function createSeededTestContext(): ToolContext;
|
|
22
|
+
/**
|
|
23
|
+
* SMI-4240: Minimal `ApiSkill` fields every mock fixture must provide.
|
|
24
|
+
* Anything not listed here is optional and filled with sensible defaults.
|
|
25
|
+
*/
|
|
26
|
+
export type ApiSkillFixtureInput = Partial<ApiSkill> & Pick<ApiSkill, 'id' | 'name'> & {
|
|
27
|
+
trust_tier?: ApiSkill['trust_tier'];
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* SMI-4240: Create a ToolContext wired to an in-memory apiClient mock so
|
|
31
|
+
* get-skill / search / recommend tests can exercise the API path
|
|
32
|
+
* (`!isOffline()` branch) without touching the network.
|
|
33
|
+
*
|
|
34
|
+
* Pass a partial `ApiSkill`; defaults are filled in to satisfy the real
|
|
35
|
+
* response validators. If the test calls `apiClient.getSkill(id)` with
|
|
36
|
+
* an ID that doesn't match the fixture, the mock throws an Error whose
|
|
37
|
+
* message matches the API client's own "Skill not found" shape so the
|
|
38
|
+
* tool's fallback logic behaves identically to production.
|
|
39
|
+
*/
|
|
40
|
+
export declare function createApiMockContext(opts: {
|
|
41
|
+
apiSkill: ApiSkillFixtureInput;
|
|
42
|
+
/** Category names joined by the edge function; defaults to `[]`. */
|
|
43
|
+
categories?: string[];
|
|
44
|
+
}): ToolContext;
|
|
20
45
|
//# sourceMappingURL=test-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-utils.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAgC,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC9E,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,eAAe,CAAA;AAEnE,YAAY,EAAE,WAAW,EAAE,CAAA;AAE3B;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,WAAW,CAK/C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAqEvD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,WAAW,CAIrD;AAED;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAClD,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAC,GAAG;IAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAA;CAAE,CAAA;AAEzE;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,QAAQ,EAAE,oBAAoB,CAAA;IAC9B,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACtB,GAAG,WAAW,CAsCd"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Test utilities for MCP server tests
|
|
3
3
|
* @see SMI-792: Database initialization
|
|
4
|
+
* @see SMI-4240: createApiMockContext for API-path coverage
|
|
4
5
|
*/
|
|
5
6
|
import { createToolContext } from '../context.js';
|
|
6
7
|
/**
|
|
@@ -88,4 +89,48 @@ export function createSeededTestContext() {
|
|
|
88
89
|
seedTestData(context);
|
|
89
90
|
return context;
|
|
90
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* SMI-4240: Create a ToolContext wired to an in-memory apiClient mock so
|
|
94
|
+
* get-skill / search / recommend tests can exercise the API path
|
|
95
|
+
* (`!isOffline()` branch) without touching the network.
|
|
96
|
+
*
|
|
97
|
+
* Pass a partial `ApiSkill`; defaults are filled in to satisfy the real
|
|
98
|
+
* response validators. If the test calls `apiClient.getSkill(id)` with
|
|
99
|
+
* an ID that doesn't match the fixture, the mock throws an Error whose
|
|
100
|
+
* message matches the API client's own "Skill not found" shape so the
|
|
101
|
+
* tool's fallback logic behaves identically to production.
|
|
102
|
+
*/
|
|
103
|
+
export function createApiMockContext(opts) {
|
|
104
|
+
const context = createToolContext({
|
|
105
|
+
dbPath: ':memory:',
|
|
106
|
+
apiClientConfig: { offlineMode: false },
|
|
107
|
+
});
|
|
108
|
+
const fixture = {
|
|
109
|
+
id: opts.apiSkill.id,
|
|
110
|
+
name: opts.apiSkill.name,
|
|
111
|
+
description: opts.apiSkill.description ?? null,
|
|
112
|
+
author: opts.apiSkill.author ?? null,
|
|
113
|
+
repo_url: opts.apiSkill.repo_url ?? null,
|
|
114
|
+
quality_score: opts.apiSkill.quality_score ?? null,
|
|
115
|
+
trust_tier: opts.apiSkill.trust_tier ?? 'community',
|
|
116
|
+
tags: opts.apiSkill.tags ?? [],
|
|
117
|
+
stars: opts.apiSkill.stars ?? null,
|
|
118
|
+
created_at: opts.apiSkill.created_at ?? '2026-01-01T00:00:00.000Z',
|
|
119
|
+
updated_at: opts.apiSkill.updated_at ?? '2026-01-01T00:00:00.000Z',
|
|
120
|
+
categories: opts.categories ?? opts.apiSkill.categories ?? [],
|
|
121
|
+
security_score: opts.apiSkill.security_score,
|
|
122
|
+
last_scanned_at: opts.apiSkill.last_scanned_at,
|
|
123
|
+
security_findings: opts.apiSkill.security_findings,
|
|
124
|
+
quarantined: opts.apiSkill.quarantined,
|
|
125
|
+
};
|
|
126
|
+
const apiClient = context.apiClient;
|
|
127
|
+
apiClient.isOffline = () => false;
|
|
128
|
+
apiClient.getSkill = async (id) => {
|
|
129
|
+
if (id !== fixture.id) {
|
|
130
|
+
throw new Error(`[mock] Skill "${id}" not found`);
|
|
131
|
+
}
|
|
132
|
+
return { data: fixture };
|
|
133
|
+
};
|
|
134
|
+
return context;
|
|
135
|
+
}
|
|
91
136
|
//# sourceMappingURL=test-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../../src/__tests__/test-utils.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../../src/__tests__/test-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Tests for validation functions to increase branch coverage.
|
|
5
5
|
*/
|
|
6
6
|
import { describe, it, expect } from 'vitest';
|
|
7
|
-
import { parseSkillId, mapTrustTierToDb, mapTrustTierFromDb, extractCategoryFromTags, } from '../../utils/validation.js';
|
|
7
|
+
import { parseSkillId, mapTrustTierToDb, mapTrustTierFromDb, extractCategoryFromTags, normalizeApiCategory, } from '../../utils/validation.js';
|
|
8
8
|
describe('Validation Utilities', () => {
|
|
9
9
|
describe('parseSkillId', () => {
|
|
10
10
|
it('should parse 2-part skill ID (author/name)', () => {
|
|
@@ -78,5 +78,36 @@ describe('Validation Utilities', () => {
|
|
|
78
78
|
expect(extractCategoryFromTags(['random', 'tags'])).toBe('other');
|
|
79
79
|
});
|
|
80
80
|
});
|
|
81
|
+
describe('normalizeApiCategory', () => {
|
|
82
|
+
it('should lowercase display-name categories', () => {
|
|
83
|
+
expect(normalizeApiCategory('Database')).toBe('database');
|
|
84
|
+
expect(normalizeApiCategory('Other')).toBe('other');
|
|
85
|
+
expect(normalizeApiCategory('Science')).toBe('science');
|
|
86
|
+
});
|
|
87
|
+
it('should replace slash with dash for compound enum values', () => {
|
|
88
|
+
expect(normalizeApiCategory('AI/ML')).toBe('ai-ml');
|
|
89
|
+
});
|
|
90
|
+
it('should strip trailing "s" when the singular form matches the enum (SMI-4240 schema drift)', () => {
|
|
91
|
+
// Production DB has "integrations" (plural) but enum has "integration" (singular).
|
|
92
|
+
expect(normalizeApiCategory('integrations')).toBe('integration');
|
|
93
|
+
expect(normalizeApiCategory('Integrations')).toBe('integration');
|
|
94
|
+
});
|
|
95
|
+
it('should return null for categories not in the enum', () => {
|
|
96
|
+
// "product" exists in production DB categories table but not in SkillCategory.
|
|
97
|
+
expect(normalizeApiCategory('product')).toBeNull();
|
|
98
|
+
expect(normalizeApiCategory('made-up-category')).toBeNull();
|
|
99
|
+
});
|
|
100
|
+
it('should return null for missing input (caller falls back to tag inference)', () => {
|
|
101
|
+
expect(normalizeApiCategory(undefined)).toBeNull();
|
|
102
|
+
expect(normalizeApiCategory(null)).toBeNull();
|
|
103
|
+
expect(normalizeApiCategory('')).toBeNull();
|
|
104
|
+
});
|
|
105
|
+
it('should not singularize enum values that legitimately end in "s" without producing false matches', () => {
|
|
106
|
+
// No current enum value ends in "s", but guard against regressions if one is added.
|
|
107
|
+
// If someone adds e.g. "docs" to the enum, this test ensures a direct match wins over stripping.
|
|
108
|
+
const result = normalizeApiCategory('development');
|
|
109
|
+
expect(result).toBe('development');
|
|
110
|
+
});
|
|
111
|
+
});
|
|
81
112
|
});
|
|
82
113
|
//# sourceMappingURL=validation.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../../../src/__tests__/utils/validation.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../../../src/__tests__/utils/validation.test.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -46,7 +46,7 @@ import { checkForUpdates, formatUpdateNotification } from '@skillsmith/core';
|
|
|
46
46
|
import { createLicenseMiddleware } from './middleware/license.js';
|
|
47
47
|
import { createQuotaMiddleware } from './middleware/quota.js';
|
|
48
48
|
// Package version - keep in sync with package.json
|
|
49
|
-
const PACKAGE_VERSION = '0.4.
|
|
49
|
+
const PACKAGE_VERSION = '0.4.11';
|
|
50
50
|
const PACKAGE_NAME = '@skillsmith/mcp-server';
|
|
51
51
|
import { installBundledSkills, installUserDocs, getUserGuidePath, } from './onboarding/install-assets.js';
|
|
52
52
|
// SMI-2679: Quota enforcement middleware — module-level singletons, initialized once
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAEpC,uDAAuD;AACvD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAA;AAElG,wDAAwD;AACxD,OAAO,EAAE,mBAAmB,EAAoB,MAAM,cAAc,CAAA;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAA;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AACzF,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,EACL,gCAAgC,EAChC,yBAAyB,EACzB,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AACpF,OAAO,EACL,gCAAgC,EAChC,+BAA+B,GAChC,MAAM,2BAA2B,CAAA;AAClC,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AACjG,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EACL,UAAU,EACV,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,GACb,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAC5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,mDAAmD;AACnD,MAAM,eAAe,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,9 +16,9 @@ export { periodDays, generateDailyTrend } from './analytics.stub.js';
|
|
|
16
16
|
export declare const teamAnalyticsDashboardInputSchema: z.ZodObject<{
|
|
17
17
|
period: z.ZodDefault<z.ZodOptional<z.ZodEnum<["7d", "30d", "90d"]>>>;
|
|
18
18
|
}, "strip", z.ZodTypeAny, {
|
|
19
|
-
period: "7d" | "
|
|
19
|
+
period: "7d" | "90d" | "30d";
|
|
20
20
|
}, {
|
|
21
|
-
period?: "7d" | "
|
|
21
|
+
period?: "7d" | "90d" | "30d" | undefined;
|
|
22
22
|
}>;
|
|
23
23
|
export type TeamAnalyticsDashboardInput = z.infer<typeof teamAnalyticsDashboardInputSchema>;
|
|
24
24
|
export declare const teamUsageReportInputSchema: z.ZodObject<{
|
|
@@ -26,20 +26,20 @@ export declare const teamUsageReportInputSchema: z.ZodObject<{
|
|
|
26
26
|
format: z.ZodDefault<z.ZodOptional<z.ZodEnum<["summary", "detailed"]>>>;
|
|
27
27
|
}, "strip", z.ZodTypeAny, {
|
|
28
28
|
format: "summary" | "detailed";
|
|
29
|
-
period: "7d" | "
|
|
29
|
+
period: "7d" | "90d" | "30d";
|
|
30
30
|
}, {
|
|
31
31
|
format?: "summary" | "detailed" | undefined;
|
|
32
|
-
period?: "7d" | "
|
|
32
|
+
period?: "7d" | "90d" | "30d" | undefined;
|
|
33
33
|
}>;
|
|
34
34
|
export type TeamUsageReportInput = z.infer<typeof teamUsageReportInputSchema>;
|
|
35
35
|
export declare const analyticsDashboardInputSchema: z.ZodObject<{
|
|
36
36
|
period: z.ZodDefault<z.ZodOptional<z.ZodEnum<["7d", "30d", "90d"]>>>;
|
|
37
37
|
includeRecommendations: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
38
38
|
}, "strip", z.ZodTypeAny, {
|
|
39
|
-
period: "7d" | "
|
|
39
|
+
period: "7d" | "90d" | "30d";
|
|
40
40
|
includeRecommendations: boolean;
|
|
41
41
|
}, {
|
|
42
|
-
period?: "7d" | "
|
|
42
|
+
period?: "7d" | "90d" | "30d" | undefined;
|
|
43
43
|
includeRecommendations?: boolean | undefined;
|
|
44
44
|
}>;
|
|
45
45
|
export type AnalyticsDashboardInput = z.infer<typeof analyticsDashboardInputSchema>;
|
|
@@ -48,10 +48,10 @@ export declare const usageReportInputSchema: z.ZodObject<{
|
|
|
48
48
|
format: z.ZodDefault<z.ZodOptional<z.ZodEnum<["summary", "detailed", "csv"]>>>;
|
|
49
49
|
}, "strip", z.ZodTypeAny, {
|
|
50
50
|
format: "summary" | "detailed" | "csv";
|
|
51
|
-
period: "7d" | "
|
|
51
|
+
period: "7d" | "90d" | "30d";
|
|
52
52
|
}, {
|
|
53
53
|
format?: "summary" | "detailed" | "csv" | undefined;
|
|
54
|
-
period?: "7d" | "
|
|
54
|
+
period?: "7d" | "90d" | "30d" | undefined;
|
|
55
55
|
}>;
|
|
56
56
|
export type UsageReportInput = z.infer<typeof usageReportInputSchema>;
|
|
57
57
|
export declare const teamAnalyticsDashboardToolSchema: {
|
|
@@ -38,20 +38,20 @@ export declare const auditQueryInputSchema: z.ZodObject<{
|
|
|
38
38
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
39
39
|
}, "strip", z.ZodTypeAny, {
|
|
40
40
|
limit?: number | undefined;
|
|
41
|
-
result?: "warning" | "success" | "failure" | undefined;
|
|
42
|
-
actor?: string | undefined;
|
|
43
|
-
resource?: string | undefined;
|
|
44
41
|
startDate?: string | undefined;
|
|
45
42
|
endDate?: string | undefined;
|
|
46
43
|
eventType?: string | undefined;
|
|
47
|
-
}, {
|
|
48
|
-
limit?: number | undefined;
|
|
49
|
-
result?: "warning" | "success" | "failure" | undefined;
|
|
50
44
|
actor?: string | undefined;
|
|
51
45
|
resource?: string | undefined;
|
|
46
|
+
result?: "warning" | "success" | "failure" | undefined;
|
|
47
|
+
}, {
|
|
48
|
+
limit?: number | undefined;
|
|
52
49
|
startDate?: string | undefined;
|
|
53
50
|
endDate?: string | undefined;
|
|
54
51
|
eventType?: string | undefined;
|
|
52
|
+
actor?: string | undefined;
|
|
53
|
+
resource?: string | undefined;
|
|
54
|
+
result?: "warning" | "success" | "failure" | undefined;
|
|
55
55
|
}>;
|
|
56
56
|
export type AuditQueryInput = z.infer<typeof auditQueryInputSchema>;
|
|
57
57
|
export declare const siemExportInputSchema: z.ZodObject<{
|
|
@@ -18,11 +18,11 @@ export declare const complianceReportInputSchema: z.ZodObject<{
|
|
|
18
18
|
includeUserActivity: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
19
19
|
}, "strip", z.ZodTypeAny, {
|
|
20
20
|
format: "json" | "soc2" | "cyclonedx";
|
|
21
|
-
period: "
|
|
21
|
+
period: "90d" | "30d" | "365d";
|
|
22
22
|
includeUserActivity: boolean;
|
|
23
23
|
}, {
|
|
24
24
|
format: "json" | "soc2" | "cyclonedx";
|
|
25
|
-
period?: "
|
|
25
|
+
period?: "90d" | "30d" | "365d" | undefined;
|
|
26
26
|
includeUserActivity?: boolean | undefined;
|
|
27
27
|
}>;
|
|
28
28
|
export type ComplianceReportInput = z.infer<typeof complianceReportInputSchema>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-skill.d.ts","sourceRoot":"","sources":["../../../src/tools/get-skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAEL,KAAK,gBAAgB,
|
|
1
|
+
{"version":3,"file":"get-skill.d.ts","sourceRoot":"","sources":["../../../src/tools/get-skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAEL,KAAK,gBAAgB,EAQtB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAQhD;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;EAE9B,CAAA;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;CAa9B,CAAA;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,EAAE,EAAE,MAAM,CAAA;CACX;AAID;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,gBAAgB,CAAC,CA6L3B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CA0GrE"}
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
*/
|
|
24
24
|
import { z } from 'zod';
|
|
25
25
|
import { TrustTierDescriptions, SkillsmithError, ErrorCodes, trackSkillView, } from '@skillsmith/core';
|
|
26
|
-
import { isValidSkillId, mapTrustTierFromDb, extractCategoryFromTags } from '../utils/validation.js';
|
|
26
|
+
import { isValidSkillId, mapTrustTierFromDb, extractCategoryFromTags, normalizeApiCategory, } from '../utils/validation.js';
|
|
27
27
|
/**
|
|
28
28
|
* Zod schema for get-skill input validation
|
|
29
29
|
*/
|
|
@@ -89,6 +89,27 @@ export async function executeGetSkill(input, context) {
|
|
|
89
89
|
// SMI-3672: Request content alongside metadata
|
|
90
90
|
const apiResponse = await context.apiClient.getSkill(skillId, { includeContent: true });
|
|
91
91
|
const apiSkill = apiResponse.data;
|
|
92
|
+
// SMI-4240: Derive security summary from the API response so the extension
|
|
93
|
+
// can render real scan status instead of falling back to "Not scanned"
|
|
94
|
+
// for every skill. Schema-confirmed via Wave 0: no dedicated
|
|
95
|
+
// security_findings_count column exists — count is derived from the
|
|
96
|
+
// security_findings jsonb array. Skills that have never been scanned
|
|
97
|
+
// return `undefined` (the extension treats undefined and { passed: null }
|
|
98
|
+
// identically in getSecurityScanHtml).
|
|
99
|
+
const security = apiSkill.last_scanned_at == null
|
|
100
|
+
? undefined
|
|
101
|
+
: {
|
|
102
|
+
passed: apiSkill.quarantined === true
|
|
103
|
+
? false
|
|
104
|
+
: apiSkill.security_score == null
|
|
105
|
+
? null
|
|
106
|
+
: true,
|
|
107
|
+
riskScore: apiSkill.security_score ?? null,
|
|
108
|
+
findingsCount: Array.isArray(apiSkill.security_findings)
|
|
109
|
+
? apiSkill.security_findings.length
|
|
110
|
+
: 0,
|
|
111
|
+
scannedAt: apiSkill.last_scanned_at,
|
|
112
|
+
};
|
|
92
113
|
// Convert API skill to MCP skill format
|
|
93
114
|
const skill = {
|
|
94
115
|
id: apiSkill.id,
|
|
@@ -97,12 +118,18 @@ export async function executeGetSkill(input, context) {
|
|
|
97
118
|
author: apiSkill.author || 'unknown',
|
|
98
119
|
repository: apiSkill.repo_url || undefined,
|
|
99
120
|
version: undefined,
|
|
100
|
-
|
|
121
|
+
// SMI-4240: Prefer the category joined from skill_categories by the API
|
|
122
|
+
// (populated by the indexer's classifier) over tag-based inference.
|
|
123
|
+
// normalizeApiCategory handles case/slash/pluralization drift between
|
|
124
|
+
// the DB categories table and the SkillCategory enum; null falls back
|
|
125
|
+
// to tag inference for skills where the API didn't return a category.
|
|
126
|
+
category: normalizeApiCategory(apiSkill.categories?.[0]) ?? extractCategoryFromTags(apiSkill.tags),
|
|
101
127
|
trustTier: mapTrustTierFromDb(apiSkill.trust_tier),
|
|
102
128
|
score: Math.round((apiSkill.quality_score ?? 0) * 100),
|
|
103
129
|
scoreBreakdown: undefined,
|
|
104
130
|
tags: apiSkill.tags || [],
|
|
105
131
|
installCommand: 'claude skill add ' + apiSkill.id,
|
|
132
|
+
security,
|
|
106
133
|
// SMI-1577: Handle optional date fields with sentinel value
|
|
107
134
|
createdAt: apiSkill.created_at ?? '1970-01-01T00:00:00.000Z',
|
|
108
135
|
updatedAt: apiSkill.updated_at ?? '1970-01-01T00:00:00.000Z',
|