@skillsmith/mcp-server 0.4.8 → 0.4.10

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 (54) hide show
  1. package/CHANGELOG.md +17 -1
  2. package/README.md +3 -2
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/src/__tests__/get-skill.api-path.test.d.ts +10 -0
  5. package/dist/src/__tests__/get-skill.api-path.test.d.ts.map +1 -0
  6. package/dist/src/__tests__/get-skill.api-path.test.js +189 -0
  7. package/dist/src/__tests__/get-skill.api-path.test.js.map +1 -0
  8. package/dist/src/__tests__/test-utils.d.ts +25 -0
  9. package/dist/src/__tests__/test-utils.d.ts.map +1 -1
  10. package/dist/src/__tests__/test-utils.js +45 -0
  11. package/dist/src/__tests__/test-utils.js.map +1 -1
  12. package/dist/src/__tests__/utils/validation.test.js +32 -1
  13. package/dist/src/__tests__/utils/validation.test.js.map +1 -1
  14. package/dist/src/index.js +1 -1
  15. package/dist/src/tools/audit-tools.d.ts +6 -6
  16. package/dist/src/tools/get-skill.d.ts.map +1 -1
  17. package/dist/src/tools/get-skill.js +29 -2
  18. package/dist/src/tools/get-skill.js.map +1 -1
  19. package/dist/src/tools/install.d.ts.map +1 -1
  20. package/dist/src/tools/install.js +9 -1
  21. package/dist/src/tools/install.js.map +1 -1
  22. package/dist/src/tools/integration-tools.d.ts +8 -8
  23. package/dist/src/tools/publish.types.d.ts +1 -1
  24. package/dist/src/tools/rbac-tools.d.ts +4 -4
  25. package/dist/src/tools/recommend.types.d.ts +3 -3
  26. package/dist/src/tools/registry-tools.d.ts +2 -2
  27. package/dist/src/tools/skill-diff.d.ts +2 -2
  28. package/dist/src/tools/skill-pack-audit.d.ts +22 -1
  29. package/dist/src/tools/skill-pack-audit.d.ts.map +1 -1
  30. package/dist/src/tools/skill-pack-audit.helpers.d.ts +53 -0
  31. package/dist/src/tools/skill-pack-audit.helpers.d.ts.map +1 -0
  32. package/dist/src/tools/skill-pack-audit.helpers.js +181 -0
  33. package/dist/src/tools/skill-pack-audit.helpers.js.map +1 -0
  34. package/dist/src/tools/skill-pack-audit.js +122 -5
  35. package/dist/src/tools/skill-pack-audit.js.map +1 -1
  36. package/dist/src/tools/skill-pack-audit.types.d.ts +70 -0
  37. package/dist/src/tools/skill-pack-audit.types.d.ts.map +1 -0
  38. package/dist/src/tools/skill-pack-audit.types.js +8 -0
  39. package/dist/src/tools/skill-pack-audit.types.js.map +1 -0
  40. package/dist/src/tools/sso-tools.d.ts +2 -2
  41. package/dist/src/tools/suggest.d.ts +4 -4
  42. package/dist/src/tools/team-workspace.d.ts +4 -4
  43. package/dist/src/tools/uninstall.d.ts +1 -1
  44. package/dist/src/tools/validate.helpers.d.ts.map +1 -1
  45. package/dist/src/tools/validate.helpers.js +15 -0
  46. package/dist/src/tools/validate.helpers.js.map +1 -1
  47. package/dist/src/utils/validation.d.ts +24 -0
  48. package/dist/src/utils/validation.d.ts.map +1 -1
  49. package/dist/src/utils/validation.js +38 -0
  50. package/dist/src/utils/validation.js.map +1 -1
  51. package/dist/tests/unit/skill-pack-audit.test.js +225 -0
  52. package/dist/tests/unit/skill-pack-audit.test.js.map +1 -1
  53. package/package.json +2 -2
  54. package/server.json +2 -2
@@ -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":"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"}
@@ -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;;;GAGG;AAEH,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"}
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;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAoB,MAAM,eAAe,CAAA;AAInE;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,iBAAiB,CAAC;QACvB,MAAM,EAAE,UAAU;QAClB,eAAe,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;KACvC,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAoB;IAC/C,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAA;IAEnC,kBAAkB;IAClB,eAAe,CAAC,MAAM,CAAC;QACrB,EAAE,EAAE,kBAAkB;QACtB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,kEAAkE;QAC/E,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,kDAAkD;QAC3D,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,UAAU;QACrB,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,sBAAsB,EAAE,YAAY,CAAC;KAC9D,CAAC,CAAA;IAEF,eAAe,CAAC,MAAM,CAAC;QACrB,EAAE,EAAE,qBAAqB;QACzB,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,kDAAkD;QAC/D,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,qDAAqD;QAC9D,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,UAAU;QACrB,IAAI,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,CAAC;KACxD,CAAC,CAAA;IAEF,eAAe,CAAC,MAAM,CAAC;QACrB,EAAE,EAAE,uBAAuB;QAC3B,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,+CAA+C;QAC5D,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,qDAAqD;QAC9D,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,WAAW;QACtB,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC;KACjD,CAAC,CAAA;IAEF,eAAe,CAAC,MAAM,CAAC;QACrB,EAAE,EAAE,yBAAyB;QAC7B,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,yDAAyD;QACtE,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,uDAAuD;QAChE,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,WAAW;QACtB,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC;KACxD,CAAC,CAAA;IAEF,eAAe,CAAC,MAAM,CAAC;QACrB,EAAE,EAAE,0BAA0B;QAC9B,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,mDAAmD;QAChE,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,wDAAwD;QACjE,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,WAAW;QACtB,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,gBAAgB,CAAC;KAC3D,CAAC,CAAA;IAEF,eAAe,CAAC,MAAM,CAAC;QACrB,EAAE,EAAE,oBAAoB;QACxB,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,0CAA0C;QACvD,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,kDAAkD;QAC3D,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,cAAc;QACzB,IAAI,EAAE,CAAC,eAAe,EAAE,SAAS,EAAE,KAAK,CAAC;KAC1C,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAA;IACnC,YAAY,CAAC,OAAO,CAAC,CAAA;IACrB,OAAO,OAAO,CAAA;AAChB,CAAC"}
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":"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"}
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.8';
49
+ const PACKAGE_VERSION = '0.4.9';
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
@@ -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<{
@@ -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,EAOtB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD;;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,CA8J3B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CA0GrE"}
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
- category: extractCategoryFromTags(apiSkill.tags),
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',
@@ -1 +1 @@
1
- {"version":3,"file":"get-skill.js","sourceRoot":"","sources":["../../../src/tools/get-skill.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get-skill.js","sourceRoot":"","sources":["../../../src/tools/get-skill.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/tools/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAO1E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAG3C,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAc9F;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,YAAY,EACnB,QAAQ,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,aAAa,CAAC,CAmDxB"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/tools/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAO1E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAG3C,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAc9F;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,YAAY,EACnB,QAAQ,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,aAAa,CAAC,CA4DxB"}
@@ -13,7 +13,7 @@
13
13
  * - Adds conflict resolution (three-way merge, backup) on top
14
14
  * - Wires onProgress to MCP protocol notifications
15
15
  */
16
- import { SkillInstallationService, } from '@skillsmith/core';
16
+ import { SkillInstallationService, emitInstallEvent, } from '@skillsmith/core';
17
17
  import { getToolContext } from '../context.js';
18
18
  import { loadManifest, lookupSkillFromRegistry } from './install.helpers.js';
19
19
  // SMI-1867: Conflict resolution logic (extracted per governance review)
@@ -77,6 +77,7 @@ export async function installSkill(input, _context) {
77
77
  }
78
78
  }
79
79
  // Delegate to core service
80
+ const installStart = Date.now();
80
81
  const result = await service.install(input.skillId, {
81
82
  force: input.force,
82
83
  skipScan: input.skipScan,
@@ -84,6 +85,13 @@ export async function installSkill(input, _context) {
84
85
  conflictAction: input.conflictAction,
85
86
  confirmed: input.confirmed,
86
87
  });
88
+ // SMI-4182: fire-and-forget install telemetry for usage report funnel
89
+ void emitInstallEvent({
90
+ skillId: input.skillId,
91
+ source: 'mcp',
92
+ success: result.success,
93
+ durationMs: Date.now() - installStart,
94
+ });
87
95
  return result;
88
96
  }
89
97
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/tools/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/tools/install.ts"],"names":[],"mappings":"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"}