@skillsmith/mcp-server 0.4.2 → 0.4.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 (219) hide show
  1. package/README.md +11 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/__tests__/LocalIndexer.test.js +158 -0
  4. package/dist/src/__tests__/LocalIndexer.test.js.map +1 -1
  5. package/dist/src/__tests__/compare.test.d.ts +8 -0
  6. package/dist/src/__tests__/compare.test.d.ts.map +1 -0
  7. package/dist/src/__tests__/compare.test.js +162 -0
  8. package/dist/src/__tests__/compare.test.js.map +1 -0
  9. package/dist/src/__tests__/context.async.test.d.ts +8 -0
  10. package/dist/src/__tests__/context.async.test.d.ts.map +1 -0
  11. package/dist/src/__tests__/context.async.test.js +223 -0
  12. package/dist/src/__tests__/context.async.test.js.map +1 -0
  13. package/dist/src/__tests__/middleware/errorFormatter.builders.test.d.ts +10 -0
  14. package/dist/src/__tests__/middleware/errorFormatter.builders.test.d.ts.map +1 -0
  15. package/dist/src/__tests__/middleware/errorFormatter.builders.test.js +93 -0
  16. package/dist/src/__tests__/middleware/errorFormatter.builders.test.js.map +1 -0
  17. package/dist/src/__tests__/middleware/license-renewal.test.d.ts +10 -0
  18. package/dist/src/__tests__/middleware/license-renewal.test.d.ts.map +1 -0
  19. package/dist/src/__tests__/middleware/license-renewal.test.js +152 -0
  20. package/dist/src/__tests__/middleware/license-renewal.test.js.map +1 -0
  21. package/dist/src/__tests__/middleware/quota-helpers.test.d.ts +9 -0
  22. package/dist/src/__tests__/middleware/quota-helpers.test.d.ts.map +1 -0
  23. package/dist/src/__tests__/middleware/quota-helpers.test.js +105 -0
  24. package/dist/src/__tests__/middleware/quota-helpers.test.js.map +1 -0
  25. package/dist/src/__tests__/middleware/quota.test.d.ts +12 -0
  26. package/dist/src/__tests__/middleware/quota.test.d.ts.map +1 -0
  27. package/dist/src/__tests__/middleware/quota.test.js +189 -0
  28. package/dist/src/__tests__/middleware/quota.test.js.map +1 -0
  29. package/dist/src/__tests__/recommend-online-path.test.d.ts +10 -0
  30. package/dist/src/__tests__/recommend-online-path.test.d.ts.map +1 -0
  31. package/dist/src/__tests__/recommend-online-path.test.js +225 -0
  32. package/dist/src/__tests__/recommend-online-path.test.js.map +1 -0
  33. package/dist/src/__tests__/recommend.test.d.ts +2 -0
  34. package/dist/src/__tests__/recommend.test.d.ts.map +1 -1
  35. package/dist/src/__tests__/recommend.test.js +14 -2
  36. package/dist/src/__tests__/recommend.test.js.map +1 -1
  37. package/dist/src/__tests__/search-online-path.test.d.ts +10 -0
  38. package/dist/src/__tests__/search-online-path.test.d.ts.map +1 -0
  39. package/dist/src/__tests__/search-online-path.test.js +140 -0
  40. package/dist/src/__tests__/search-online-path.test.js.map +1 -0
  41. package/dist/src/__tests__/search.test.js +153 -5
  42. package/dist/src/__tests__/search.test.js.map +1 -1
  43. package/dist/src/context/project-detector.d.ts.map +1 -1
  44. package/dist/src/context/project-detector.js +1 -0
  45. package/dist/src/context/project-detector.js.map +1 -1
  46. package/dist/src/context.async.d.ts +48 -0
  47. package/dist/src/context.async.d.ts.map +1 -0
  48. package/dist/src/context.async.js +217 -0
  49. package/dist/src/context.async.js.map +1 -0
  50. package/dist/src/context.d.ts +5 -145
  51. package/dist/src/context.d.ts.map +1 -1
  52. package/dist/src/context.helpers.d.ts +25 -0
  53. package/dist/src/context.helpers.d.ts.map +1 -0
  54. package/dist/src/context.helpers.js +49 -0
  55. package/dist/src/context.helpers.js.map +1 -0
  56. package/dist/src/context.js +13 -228
  57. package/dist/src/context.js.map +1 -1
  58. package/dist/src/context.types.d.ts +112 -0
  59. package/dist/src/context.types.d.ts.map +1 -0
  60. package/dist/src/context.types.js +10 -0
  61. package/dist/src/context.types.js.map +1 -0
  62. package/dist/src/health/readinessCheck.d.ts +1 -1
  63. package/dist/src/health/readinessCheck.d.ts.map +1 -1
  64. package/dist/src/index.js +25 -152
  65. package/dist/src/index.js.map +1 -1
  66. package/dist/src/indexer/FrontmatterParser.d.ts +6 -0
  67. package/dist/src/indexer/FrontmatterParser.d.ts.map +1 -1
  68. package/dist/src/indexer/FrontmatterParser.js +15 -0
  69. package/dist/src/indexer/FrontmatterParser.js.map +1 -1
  70. package/dist/src/indexer/LocalIndexer.d.ts +4 -0
  71. package/dist/src/indexer/LocalIndexer.d.ts.map +1 -1
  72. package/dist/src/indexer/LocalIndexer.js +3 -0
  73. package/dist/src/indexer/LocalIndexer.js.map +1 -1
  74. package/dist/src/middleware/degradation.d.ts.map +1 -1
  75. package/dist/src/middleware/degradation.js +8 -0
  76. package/dist/src/middleware/degradation.js.map +1 -1
  77. package/dist/src/middleware/errorFormatter.builders.d.ts +49 -0
  78. package/dist/src/middleware/errorFormatter.builders.d.ts.map +1 -0
  79. package/dist/src/middleware/errorFormatter.builders.js +237 -0
  80. package/dist/src/middleware/errorFormatter.builders.js.map +1 -0
  81. package/dist/src/middleware/errorFormatter.d.ts +5 -100
  82. package/dist/src/middleware/errorFormatter.d.ts.map +1 -1
  83. package/dist/src/middleware/errorFormatter.js +16 -238
  84. package/dist/src/middleware/errorFormatter.js.map +1 -1
  85. package/dist/src/middleware/errorFormatter.types.d.ts +81 -0
  86. package/dist/src/middleware/errorFormatter.types.d.ts.map +1 -0
  87. package/dist/src/middleware/errorFormatter.types.js +34 -0
  88. package/dist/src/middleware/errorFormatter.types.js.map +1 -0
  89. package/dist/src/middleware/toolFeatureMapping.d.ts +1 -1
  90. package/dist/src/middleware/toolFeatureMapping.d.ts.map +1 -1
  91. package/dist/src/middleware/toolFeatureMapping.js +10 -0
  92. package/dist/src/middleware/toolFeatureMapping.js.map +1 -1
  93. package/dist/src/tool-dispatch.d.ts +27 -0
  94. package/dist/src/tool-dispatch.d.ts.map +1 -0
  95. package/dist/src/tool-dispatch.js +142 -0
  96. package/dist/src/tool-dispatch.js.map +1 -0
  97. package/dist/src/tools/LocalSkillSearch.d.ts.map +1 -1
  98. package/dist/src/tools/LocalSkillSearch.js +4 -0
  99. package/dist/src/tools/LocalSkillSearch.js.map +1 -1
  100. package/dist/src/tools/compare.types.d.ts +5 -1
  101. package/dist/src/tools/compare.types.d.ts.map +1 -1
  102. package/dist/src/tools/compare.types.js.map +1 -1
  103. package/dist/src/tools/get-skill.d.ts.map +1 -1
  104. package/dist/src/tools/get-skill.js +30 -0
  105. package/dist/src/tools/get-skill.js.map +1 -1
  106. package/dist/src/tools/index.d.ts +8 -0
  107. package/dist/src/tools/index.d.ts.map +1 -1
  108. package/dist/src/tools/index.js +8 -0
  109. package/dist/src/tools/index.js.map +1 -1
  110. package/dist/src/tools/install.d.ts +7 -58
  111. package/dist/src/tools/install.d.ts.map +1 -1
  112. package/dist/src/tools/install.dep-helpers.d.ts +41 -0
  113. package/dist/src/tools/install.dep-helpers.d.ts.map +1 -0
  114. package/dist/src/tools/install.dep-helpers.js +68 -0
  115. package/dist/src/tools/install.dep-helpers.js.map +1 -0
  116. package/dist/src/tools/install.dep-helpers.test.d.ts +6 -0
  117. package/dist/src/tools/install.dep-helpers.test.d.ts.map +1 -0
  118. package/dist/src/tools/install.dep-helpers.test.js +109 -0
  119. package/dist/src/tools/install.dep-helpers.test.js.map +1 -0
  120. package/dist/src/tools/install.js +49 -109
  121. package/dist/src/tools/install.js.map +1 -1
  122. package/dist/src/tools/install.optimize.d.ts +46 -0
  123. package/dist/src/tools/install.optimize.d.ts.map +1 -0
  124. package/dist/src/tools/install.optimize.js +67 -0
  125. package/dist/src/tools/install.optimize.js.map +1 -0
  126. package/dist/src/tools/install.tool.d.ts +44 -0
  127. package/dist/src/tools/install.tool.d.ts.map +1 -0
  128. package/dist/src/tools/install.tool.js +44 -0
  129. package/dist/src/tools/install.tool.js.map +1 -0
  130. package/dist/src/tools/install.types.d.ts +14 -1
  131. package/dist/src/tools/install.types.d.ts.map +1 -1
  132. package/dist/src/tools/install.types.js.map +1 -1
  133. package/dist/src/tools/outdated.d.ts +101 -0
  134. package/dist/src/tools/outdated.d.ts.map +1 -0
  135. package/dist/src/tools/outdated.js +214 -0
  136. package/dist/src/tools/outdated.js.map +1 -0
  137. package/dist/src/tools/outdated.test.d.ts +6 -0
  138. package/dist/src/tools/outdated.test.d.ts.map +1 -0
  139. package/dist/src/tools/outdated.test.js +287 -0
  140. package/dist/src/tools/outdated.test.js.map +1 -0
  141. package/dist/src/tools/recommend.d.ts +2 -4
  142. package/dist/src/tools/recommend.d.ts.map +1 -1
  143. package/dist/src/tools/recommend.format.d.ts +28 -0
  144. package/dist/src/tools/recommend.format.d.ts.map +1 -0
  145. package/dist/src/tools/recommend.format.js +111 -0
  146. package/dist/src/tools/recommend.format.js.map +1 -0
  147. package/dist/src/tools/recommend.js +6 -97
  148. package/dist/src/tools/recommend.js.map +1 -1
  149. package/dist/src/tools/recommend.types.d.ts +2 -2
  150. package/dist/src/tools/search.d.ts +24 -21
  151. package/dist/src/tools/search.d.ts.map +1 -1
  152. package/dist/src/tools/search.formatter.d.ts +30 -0
  153. package/dist/src/tools/search.formatter.d.ts.map +1 -0
  154. package/dist/src/tools/search.formatter.js +64 -0
  155. package/dist/src/tools/search.formatter.js.map +1 -0
  156. package/dist/src/tools/search.js +55 -54
  157. package/dist/src/tools/search.js.map +1 -1
  158. package/dist/src/tools/skill-audit.d.ts +98 -0
  159. package/dist/src/tools/skill-audit.d.ts.map +1 -0
  160. package/dist/src/tools/skill-audit.js +105 -0
  161. package/dist/src/tools/skill-audit.js.map +1 -0
  162. package/dist/src/tools/skill-audit.test.d.ts +6 -0
  163. package/dist/src/tools/skill-audit.test.d.ts.map +1 -0
  164. package/dist/src/tools/skill-audit.test.js +121 -0
  165. package/dist/src/tools/skill-audit.test.js.map +1 -0
  166. package/dist/src/tools/skill-diff.d.ts +107 -0
  167. package/dist/src/tools/skill-diff.d.ts.map +1 -0
  168. package/dist/src/tools/skill-diff.js +268 -0
  169. package/dist/src/tools/skill-diff.js.map +1 -0
  170. package/dist/src/tools/skill-diff.test.d.ts +6 -0
  171. package/dist/src/tools/skill-diff.test.d.ts.map +1 -0
  172. package/dist/src/tools/skill-diff.test.js +260 -0
  173. package/dist/src/tools/skill-diff.test.js.map +1 -0
  174. package/dist/src/tools/skill-pack-audit.d.ts +96 -0
  175. package/dist/src/tools/skill-pack-audit.d.ts.map +1 -0
  176. package/dist/src/tools/skill-pack-audit.js +183 -0
  177. package/dist/src/tools/skill-pack-audit.js.map +1 -0
  178. package/dist/src/tools/skill-updates.d.ts +1 -1
  179. package/dist/src/tools/skill-updates.d.ts.map +1 -1
  180. package/dist/src/tools/uninstall.d.ts.map +1 -1
  181. package/dist/src/tools/uninstall.js +9 -0
  182. package/dist/src/tools/uninstall.js.map +1 -1
  183. package/dist/src/tools/validate.d.ts.map +1 -1
  184. package/dist/src/tools/validate.dep.test.d.ts +6 -0
  185. package/dist/src/tools/validate.dep.test.d.ts.map +1 -0
  186. package/dist/src/tools/validate.dep.test.js +77 -0
  187. package/dist/src/tools/validate.dep.test.js.map +1 -0
  188. package/dist/src/tools/validate.helpers.d.ts +12 -0
  189. package/dist/src/tools/validate.helpers.d.ts.map +1 -1
  190. package/dist/src/tools/validate.helpers.js +90 -19
  191. package/dist/src/tools/validate.helpers.js.map +1 -1
  192. package/dist/src/tools/validate.js +3 -1
  193. package/dist/src/tools/validate.js.map +1 -1
  194. package/dist/src/utils/validation.d.ts +13 -0
  195. package/dist/src/utils/validation.d.ts.map +1 -1
  196. package/dist/src/utils/validation.js +27 -0
  197. package/dist/src/utils/validation.js.map +1 -1
  198. package/dist/tests/health.test.js +4 -4
  199. package/dist/tests/health.test.js.map +1 -1
  200. package/dist/tests/integration/recommend.integration.test.js +3 -0
  201. package/dist/tests/integration/recommend.integration.test.js.map +1 -1
  202. package/dist/tests/integration/setup.d.ts +4 -1
  203. package/dist/tests/integration/setup.d.ts.map +1 -1
  204. package/dist/tests/integration/setup.js +6 -1
  205. package/dist/tests/integration/setup.js.map +1 -1
  206. package/dist/tests/integration/validate.integration.test.js +4 -2
  207. package/dist/tests/integration/validate.integration.test.js.map +1 -1
  208. package/dist/tests/recommend.test.js +3 -0
  209. package/dist/tests/recommend.test.js.map +1 -1
  210. package/dist/tests/unit/skill-pack-audit.test.d.ts +8 -0
  211. package/dist/tests/unit/skill-pack-audit.test.d.ts.map +1 -0
  212. package/dist/tests/unit/skill-pack-audit.test.js +342 -0
  213. package/dist/tests/unit/skill-pack-audit.test.js.map +1 -0
  214. package/dist/tests/unit/validate-helpers.test.js +99 -2
  215. package/dist/tests/unit/validate-helpers.test.js.map +1 -1
  216. package/dist/tests/validate.test.js +4 -0
  217. package/dist/tests/validate.test.js.map +1 -1
  218. package/package.json +2 -2
  219. package/server.json +2 -2
@@ -0,0 +1,260 @@
1
+ /**
2
+ * @fileoverview Tests for skill-diff.ts MCP tool
3
+ * @see SMI-skill-version-tracking Wave 2
4
+ */
5
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
6
+ import { executeSkillDiff, skillDiffInputSchema } from './skill-diff.js';
7
+ // ============================================================================
8
+ // Mock context
9
+ // ============================================================================
10
+ const mockContext = {};
11
+ // ============================================================================
12
+ // Fixtures
13
+ // ============================================================================
14
+ const OLD_CONTENT = `---
15
+ name: test-skill
16
+ version: 1.0.0
17
+ ---
18
+
19
+ ## Overview
20
+
21
+ A test skill.
22
+
23
+ ## Usage
24
+
25
+ Run with /test.
26
+
27
+ ## Configuration
28
+
29
+ Set env vars.
30
+ `;
31
+ const NEW_CONTENT_MINOR = `---
32
+ name: test-skill
33
+ version: 1.1.0
34
+ ---
35
+
36
+ ## Overview
37
+
38
+ A test skill.
39
+
40
+ ## Usage
41
+
42
+ Run with /test.
43
+
44
+ ## Configuration
45
+
46
+ Set env vars.
47
+
48
+ ## Examples
49
+
50
+ Here are some examples.
51
+ `;
52
+ const NEW_CONTENT_MAJOR = `---
53
+ name: test-skill
54
+ version: 2.0.0
55
+ ---
56
+
57
+ ## Overview
58
+
59
+ A test skill.
60
+
61
+ ## Usage
62
+
63
+ Run with /test.
64
+ `;
65
+ const NEW_CONTENT_PATCH = `---
66
+ name: test-skill
67
+ version: 1.0.1
68
+ ---
69
+
70
+ ## Overview
71
+
72
+ An updated test skill.
73
+
74
+ ## Usage
75
+
76
+ Run with /test now.
77
+
78
+ ## Configuration
79
+
80
+ Updated env vars.
81
+ `;
82
+ const NEW_CONTENT_WITH_CHANGELOG = `---
83
+ name: test-skill
84
+ version: 1.0.1
85
+ changelog: "Fixed a bug in configuration handling"
86
+ ---
87
+
88
+ ## Overview
89
+
90
+ An updated test skill.
91
+
92
+ ## Usage
93
+
94
+ Run with /test.
95
+
96
+ ## Configuration
97
+
98
+ Updated env vars.
99
+ `;
100
+ // ============================================================================
101
+ // Tests
102
+ // ============================================================================
103
+ describe('executeSkillDiff', () => {
104
+ beforeEach(() => {
105
+ vi.clearAllMocks();
106
+ });
107
+ describe('SkillDiffResponse schema', () => {
108
+ it('returns a valid SkillDiffResponse for a minor update', async () => {
109
+ const result = await executeSkillDiff({
110
+ skillId: 'anthropic/test-skill',
111
+ oldContent: OLD_CONTENT,
112
+ newContent: NEW_CONTENT_MINOR,
113
+ hasLocalModifications: false,
114
+ trustTier: 'community',
115
+ }, mockContext);
116
+ // Verify all required fields are present
117
+ expect(result).toHaveProperty('skill', 'anthropic/test-skill');
118
+ expect(result).toHaveProperty('changeType');
119
+ expect(result).toHaveProperty('sectionsAdded');
120
+ expect(result).toHaveProperty('sectionsRemoved');
121
+ expect(result).toHaveProperty('sectionsModified');
122
+ expect(result).toHaveProperty('riskScoreDelta');
123
+ expect(result).toHaveProperty('changelog');
124
+ expect(result).toHaveProperty('recommendation');
125
+ // Type assertions
126
+ expect(['major', 'minor', 'patch', 'unknown']).toContain(result.changeType);
127
+ expect(Array.isArray(result.sectionsAdded)).toBe(true);
128
+ expect(Array.isArray(result.sectionsRemoved)).toBe(true);
129
+ expect(Array.isArray(result.sectionsModified)).toBe(true);
130
+ expect(['auto-update', 'review-then-update', 'manual-review-required']).toContain(result.recommendation);
131
+ });
132
+ it('detects added sections correctly', async () => {
133
+ const result = await executeSkillDiff({
134
+ skillId: 'test/skill',
135
+ oldContent: OLD_CONTENT,
136
+ newContent: NEW_CONTENT_MINOR,
137
+ hasLocalModifications: false,
138
+ trustTier: 'community',
139
+ }, mockContext);
140
+ expect(result.sectionsAdded).toContain('Examples');
141
+ expect(result.sectionsRemoved).toHaveLength(0);
142
+ });
143
+ it('detects removed sections correctly', async () => {
144
+ const result = await executeSkillDiff({
145
+ skillId: 'test/skill',
146
+ oldContent: OLD_CONTENT,
147
+ newContent: NEW_CONTENT_MAJOR,
148
+ hasLocalModifications: false,
149
+ trustTier: 'community',
150
+ }, mockContext);
151
+ expect(result.sectionsRemoved).toContain('Configuration');
152
+ expect(result.sectionsAdded).toHaveLength(0);
153
+ });
154
+ it('detects modified sections correctly', async () => {
155
+ const result = await executeSkillDiff({
156
+ skillId: 'test/skill',
157
+ oldContent: OLD_CONTENT,
158
+ newContent: NEW_CONTENT_PATCH,
159
+ hasLocalModifications: false,
160
+ trustTier: 'community',
161
+ }, mockContext);
162
+ // Body text changed but no headings added/removed
163
+ expect(result.sectionsRemoved).toHaveLength(0);
164
+ expect(result.sectionsAdded).toHaveLength(0);
165
+ expect(result.sectionsModified.length).toBeGreaterThan(0);
166
+ });
167
+ it('returns riskScoreDelta when scores are provided', async () => {
168
+ const result = await executeSkillDiff({
169
+ skillId: 'test/skill',
170
+ oldContent: OLD_CONTENT,
171
+ newContent: NEW_CONTENT_PATCH,
172
+ oldRiskScore: 10,
173
+ newRiskScore: 30,
174
+ hasLocalModifications: false,
175
+ trustTier: 'community',
176
+ }, mockContext);
177
+ expect(result.riskScoreDelta).toBe(20);
178
+ });
179
+ it('returns null riskScoreDelta when scores are not provided', async () => {
180
+ const result = await executeSkillDiff({
181
+ skillId: 'test/skill',
182
+ oldContent: OLD_CONTENT,
183
+ newContent: NEW_CONTENT_PATCH,
184
+ hasLocalModifications: false,
185
+ trustTier: 'community',
186
+ }, mockContext);
187
+ expect(result.riskScoreDelta).toBeNull();
188
+ });
189
+ it('extracts changelog from frontmatter', async () => {
190
+ const result = await executeSkillDiff({
191
+ skillId: 'test/skill',
192
+ oldContent: OLD_CONTENT,
193
+ newContent: NEW_CONTENT_WITH_CHANGELOG,
194
+ hasLocalModifications: false,
195
+ trustTier: 'community',
196
+ }, mockContext);
197
+ expect(result.changelog).toContain('Fixed a bug');
198
+ });
199
+ it('returns null changelog when none present', async () => {
200
+ const result = await executeSkillDiff({
201
+ skillId: 'test/skill',
202
+ oldContent: OLD_CONTENT,
203
+ newContent: NEW_CONTENT_PATCH,
204
+ hasLocalModifications: false,
205
+ trustTier: 'community',
206
+ }, mockContext);
207
+ expect(result.changelog).toBeNull();
208
+ });
209
+ });
210
+ describe('recommendation based on changeType', () => {
211
+ it('returns auto-update for patch + verified + changelog', async () => {
212
+ const result = await executeSkillDiff({
213
+ skillId: 'test/skill',
214
+ oldContent: OLD_CONTENT,
215
+ newContent: NEW_CONTENT_WITH_CHANGELOG,
216
+ hasLocalModifications: false,
217
+ trustTier: 'verified',
218
+ }, mockContext);
219
+ expect(result.recommendation).toBe('auto-update');
220
+ });
221
+ it('returns manual-review-required for major + local mods + risk increase', async () => {
222
+ const result = await executeSkillDiff({
223
+ skillId: 'test/skill',
224
+ oldContent: OLD_CONTENT,
225
+ newContent: NEW_CONTENT_MAJOR,
226
+ oldRiskScore: 10,
227
+ newRiskScore: 60,
228
+ hasLocalModifications: true,
229
+ trustTier: 'community',
230
+ }, mockContext);
231
+ expect(result.recommendation).toBe('manual-review-required');
232
+ });
233
+ });
234
+ describe('input validation', () => {
235
+ it('rejects empty skillId', () => {
236
+ expect(() => skillDiffInputSchema.parse({
237
+ skillId: '',
238
+ oldContent: 'old',
239
+ newContent: 'new',
240
+ })).toThrow();
241
+ });
242
+ it('rejects empty oldContent', () => {
243
+ expect(() => skillDiffInputSchema.parse({
244
+ skillId: 'test/skill',
245
+ oldContent: '',
246
+ newContent: 'new',
247
+ })).toThrow();
248
+ });
249
+ it('accepts optional fields', () => {
250
+ const parsed = skillDiffInputSchema.parse({
251
+ skillId: 'test/skill',
252
+ oldContent: 'old content',
253
+ newContent: 'new content',
254
+ });
255
+ expect(parsed.hasLocalModifications).toBe(false);
256
+ expect(parsed.trustTier).toBe('community');
257
+ });
258
+ });
259
+ });
260
+ //# sourceMappingURL=skill-diff.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-diff.test.js","sourceRoot":"","sources":["../../../src/tools/skill-diff.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * @fileoverview skill_pack_audit MCP tool — detect version drift in a skill pack
3
+ * @module @skillsmith/mcp-server/tools/skill-pack-audit
4
+ * @see SMI-2905: Skill registry version drift detection
5
+ *
6
+ * Scans a skill pack directory (pack_path/skills/{name}/SKILL.md), reads each
7
+ * skill's bundled version: frontmatter, and compares it against the latest
8
+ * semver recorded in the local skill_versions registry cache.
9
+ *
10
+ * Status values:
11
+ * - current — bundled version matches registry
12
+ * - outdated — registry has a newer version
13
+ * - ahead — bundled version is newer than registry cache
14
+ * - no_registry_data — skill not found in local skill_versions cache
15
+ * - missing_version — SKILL.md has no valid version: field
16
+ *
17
+ * Tier gate: Individual (version_tracking feature flag).
18
+ * Community users see a graceful license error response, never a hard throw.
19
+ */
20
+ import { z } from 'zod';
21
+ import type { ToolContext } from '../context.js';
22
+ /**
23
+ * Input schema for skill_pack_audit tool
24
+ */
25
+ export declare const skillPackAuditInputSchema: z.ZodObject<{
26
+ pack_path: z.ZodString;
27
+ }, "strip", z.ZodTypeAny, {
28
+ pack_path: string;
29
+ }, {
30
+ pack_path: string;
31
+ }>;
32
+ export type SkillPackAuditInput = z.infer<typeof skillPackAuditInputSchema>;
33
+ /**
34
+ * Drift status for a single skill in the pack
35
+ */
36
+ export type PackSkillStatus = 'current' | 'outdated' | 'ahead' | 'no_registry_data' | 'missing_version';
37
+ /**
38
+ * Per-skill audit result
39
+ */
40
+ export interface PackSkillEntry {
41
+ /** Skill name from SKILL.md frontmatter (falls back to directory name) */
42
+ name: string;
43
+ /** Version string from the pack's SKILL.md frontmatter, or null if absent */
44
+ bundledVersion: string | null;
45
+ /** Latest semver from the local skill_versions registry cache, or null */
46
+ registryVersion: string | null;
47
+ /** Registry skill identifier (e.g. "author/skill-name") or null if not found */
48
+ skillId: string | null;
49
+ /** Drift status */
50
+ status: PackSkillStatus;
51
+ }
52
+ /**
53
+ * Full response from skill_pack_audit tool
54
+ */
55
+ export interface SkillPackAuditResponse {
56
+ /** Resolved absolute path to the pack */
57
+ packPath: string;
58
+ /** Total number of skills found in the pack */
59
+ skillCount: number;
60
+ /** Number of skills where bundled version differs from registry (outdated + ahead) */
61
+ driftCount: number;
62
+ /** Number of skills not found in the local registry cache */
63
+ noRegistryDataCount: number;
64
+ /** Per-skill audit results, sorted alphabetically by name */
65
+ skills: PackSkillEntry[];
66
+ }
67
+ /**
68
+ * MCP tool definition for skill_pack_audit
69
+ */
70
+ export declare const skillPackAuditToolSchema: {
71
+ name: "skill_pack_audit";
72
+ description: string;
73
+ inputSchema: {
74
+ type: "object";
75
+ properties: {
76
+ pack_path: {
77
+ type: string;
78
+ description: string;
79
+ };
80
+ };
81
+ required: string[];
82
+ };
83
+ };
84
+ /**
85
+ * Execute the skill_pack_audit tool.
86
+ *
87
+ * Scans pack_path/skills/{name}/SKILL.md, parses each skill's name and version
88
+ * from frontmatter, and compares the bundled version against the most recently
89
+ * recorded semver in the local skill_versions table (matched by skill name suffix).
90
+ *
91
+ * @param input Validated tool input
92
+ * @param context Tool context with database connection
93
+ * @returns SkillPackAuditResponse with per-skill drift status
94
+ */
95
+ export declare function executeSkillPackAudit(input: SkillPackAuditInput, context: ToolContext): Promise<SkillPackAuditResponse>;
96
+ //# sourceMappingURL=skill-pack-audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-pack-audit.d.ts","sourceRoot":"","sources":["../../../src/tools/skill-pack-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAMhD;;GAEG;AACH,eAAO,MAAM,yBAAyB;;;;;;EAQpC,CAAA;AAEF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAE3E;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,UAAU,GACV,OAAO,GACP,kBAAkB,GAClB,iBAAiB,CAAA;AAErB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAA;IACZ,6EAA6E;IAC7E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,0EAA0E;IAC1E,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,gFAAgF;IAChF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,mBAAmB;IACnB,MAAM,EAAE,eAAe,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAA;IAChB,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAA;IAClB,sFAAsF;IACtF,UAAU,EAAE,MAAM,CAAA;IAClB,6DAA6D;IAC7D,mBAAmB,EAAE,MAAM,CAAA;IAC3B,6DAA6D;IAC7D,MAAM,EAAE,cAAc,EAAE,CAAA;CACzB;AAMD;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;CAkBpC,CAAA;AA4BD;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,mBAAmB,EAC1B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,sBAAsB,CAAC,CAuGjC"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * @fileoverview skill_pack_audit MCP tool — detect version drift in a skill pack
3
+ * @module @skillsmith/mcp-server/tools/skill-pack-audit
4
+ * @see SMI-2905: Skill registry version drift detection
5
+ *
6
+ * Scans a skill pack directory (pack_path/skills/{name}/SKILL.md), reads each
7
+ * skill's bundled version: frontmatter, and compares it against the latest
8
+ * semver recorded in the local skill_versions registry cache.
9
+ *
10
+ * Status values:
11
+ * - current — bundled version matches registry
12
+ * - outdated — registry has a newer version
13
+ * - ahead — bundled version is newer than registry cache
14
+ * - no_registry_data — skill not found in local skill_versions cache
15
+ * - missing_version — SKILL.md has no valid version: field
16
+ *
17
+ * Tier gate: Individual (version_tracking feature flag).
18
+ * Community users see a graceful license error response, never a hard throw.
19
+ */
20
+ import { z } from 'zod';
21
+ import { promises as fs } from 'fs';
22
+ import { join, resolve, sep } from 'path';
23
+ import { SkillsmithError, ErrorCodes } from '@skillsmith/core';
24
+ import { parseYamlFrontmatter, hasPathTraversal } from './validate.helpers.js';
25
+ // ============================================================================
26
+ // Input / Output types
27
+ // ============================================================================
28
+ /**
29
+ * Input schema for skill_pack_audit tool
30
+ */
31
+ export const skillPackAuditInputSchema = z.object({
32
+ pack_path: z
33
+ .string()
34
+ .min(1)
35
+ .describe('Absolute path to the skill pack root directory. ' +
36
+ 'Must contain a skills/ subdirectory with skill folders each containing SKILL.md.'),
37
+ });
38
+ // ============================================================================
39
+ // Tool schema (MCP tool definition)
40
+ // ============================================================================
41
+ /**
42
+ * MCP tool definition for skill_pack_audit
43
+ */
44
+ export const skillPackAuditToolSchema = {
45
+ name: 'skill_pack_audit',
46
+ description: 'Audit a skill pack directory for version drift by comparing each bundled SKILL.md ' +
47
+ 'version against the Skillsmith registry cache. Reports which skills are current, ' +
48
+ 'outdated, ahead, or missing from the registry. ' +
49
+ 'Requires Individual tier or higher.',
50
+ inputSchema: {
51
+ type: 'object',
52
+ properties: {
53
+ pack_path: {
54
+ type: 'string',
55
+ description: 'Absolute path to the skill pack root directory (must contain a skills/ subdirectory).',
56
+ },
57
+ },
58
+ required: ['pack_path'],
59
+ },
60
+ };
61
+ // ============================================================================
62
+ // Internal helpers
63
+ // ============================================================================
64
+ /**
65
+ * Compare two semver strings.
66
+ * Returns: 1 if a > b, -1 if a < b, 0 if equal.
67
+ * Both inputs must be valid "X.Y.Z" semver strings.
68
+ */
69
+ function compareSemver(a, b) {
70
+ const pa = a.split('.').map(Number);
71
+ const pb = b.split('.').map(Number);
72
+ for (let i = 0; i < 3; i++) {
73
+ if ((pa[i] ?? 0) > (pb[i] ?? 0))
74
+ return 1;
75
+ if ((pa[i] ?? 0) < (pb[i] ?? 0))
76
+ return -1;
77
+ }
78
+ return 0;
79
+ }
80
+ /** Semver validation regex — matches only X.Y.Z (no pre-release) */
81
+ const SEMVER_RE = /^\d+\.\d+\.\d+$/;
82
+ // ============================================================================
83
+ // Execution
84
+ // ============================================================================
85
+ /**
86
+ * Execute the skill_pack_audit tool.
87
+ *
88
+ * Scans pack_path/skills/{name}/SKILL.md, parses each skill's name and version
89
+ * from frontmatter, and compares the bundled version against the most recently
90
+ * recorded semver in the local skill_versions table (matched by skill name suffix).
91
+ *
92
+ * @param input Validated tool input
93
+ * @param context Tool context with database connection
94
+ * @returns SkillPackAuditResponse with per-skill drift status
95
+ */
96
+ export async function executeSkillPackAudit(input, context) {
97
+ // Security: reject path traversal in the pack_path itself
98
+ if (hasPathTraversal(input.pack_path)) {
99
+ throw new SkillsmithError(ErrorCodes.VALIDATION_INVALID_TYPE, 'pack_path contains a path traversal pattern');
100
+ }
101
+ const packPath = resolve(input.pack_path);
102
+ const skillsDir = join(packPath, 'skills');
103
+ // Discover subdirectories in skills/
104
+ let skillDirNames;
105
+ try {
106
+ const entries = await fs.readdir(skillsDir, { withFileTypes: true });
107
+ skillDirNames = entries.filter((e) => e.isDirectory()).map((e) => e.name);
108
+ }
109
+ catch {
110
+ throw new SkillsmithError(ErrorCodes.SKILL_NOT_FOUND, `No skills/ directory found at ${skillsDir}`);
111
+ }
112
+ if (skillDirNames.length > 500) {
113
+ throw new SkillsmithError(ErrorCodes.VALIDATION_INVALID_TYPE, `Pack contains ${skillDirNames.length} skill directories; maximum is 500`);
114
+ }
115
+ const skills = [];
116
+ for (const dirName of skillDirNames) {
117
+ const skillMdPath = join(skillsDir, dirName, 'SKILL.md');
118
+ let resolvedMdPath;
119
+ try {
120
+ resolvedMdPath = await fs.realpath(skillMdPath);
121
+ }
122
+ catch {
123
+ continue;
124
+ }
125
+ if (!resolvedMdPath.startsWith(packPath + sep))
126
+ continue;
127
+ let content;
128
+ try {
129
+ content = await fs.readFile(resolvedMdPath, 'utf-8');
130
+ }
131
+ catch {
132
+ continue;
133
+ }
134
+ const metadata = parseYamlFrontmatter(content);
135
+ const name = typeof metadata?.name === 'string' && metadata.name ? metadata.name : dirName;
136
+ const rawVersion = typeof metadata?.version === 'string' ? metadata.version : null;
137
+ const bundledVersion = rawVersion && SEMVER_RE.test(rawVersion) ? rawVersion : null;
138
+ // Look up the most recently recorded registry version for this skill name.
139
+ // skill_id format is "author/skill-name"; we match by name suffix.
140
+ // Escape LIKE special characters in name to prevent injection.
141
+ // Backslash must be escaped first (before adding backslash-prefixed escapes for % and _).
142
+ const escapedName = name.replace(/\\/g, '\\\\').replace(/%/g, '\\%').replace(/_/g, '\\_');
143
+ const row = context.db
144
+ .prepare(`SELECT skill_id, semver
145
+ FROM skill_versions
146
+ WHERE skill_id LIKE '%/' || ? ESCAPE '\\'
147
+ ORDER BY recorded_at DESC
148
+ LIMIT 1`)
149
+ .get(escapedName);
150
+ let status;
151
+ let registryVersion = null;
152
+ let skillId = null;
153
+ if (!bundledVersion) {
154
+ status = 'missing_version';
155
+ }
156
+ else if (!row || !row.semver || !SEMVER_RE.test(row.semver)) {
157
+ status = 'no_registry_data';
158
+ }
159
+ else {
160
+ registryVersion = row.semver;
161
+ skillId = row.skill_id;
162
+ const cmp = compareSemver(bundledVersion, registryVersion);
163
+ if (cmp === 0)
164
+ status = 'current';
165
+ else if (cmp < 0)
166
+ status = 'outdated';
167
+ else
168
+ status = 'ahead';
169
+ }
170
+ skills.push({ name, bundledVersion, registryVersion, skillId, status });
171
+ }
172
+ skills.sort((a, b) => a.name.localeCompare(b.name));
173
+ const driftCount = skills.filter((s) => s.status === 'outdated' || s.status === 'ahead').length;
174
+ const noRegistryDataCount = skills.filter((s) => s.status === 'no_registry_data').length;
175
+ return {
176
+ packPath,
177
+ skillCount: skills.length,
178
+ driftCount,
179
+ noRegistryDataCount,
180
+ skills,
181
+ };
182
+ }
183
+ //# sourceMappingURL=skill-pack-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-pack-audit.js","sourceRoot":"","sources":["../../../src/tools/skill-pack-audit.ts"],"names":[],"mappings":"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"}
@@ -34,7 +34,7 @@ export interface SkillUpdateInfo {
34
34
  skillId: string;
35
35
  /** 8-char prefix of the oldest recorded hash in skill_versions (earliest registry sync) */
36
36
  installedHash: string;
37
- /** 8-char prefix of the most-recent recorded hash in skill_versions (latest registry sync) */
37
+ /** 8-char prefix of the most-recent recorded hash (current registry state) */
38
38
  latestHash: string;
39
39
  /** Optional semver from the latest version record */
40
40
  semver: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"skill-updates.d.ts","sourceRoot":"","sources":["../../../src/tools/skill-updates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAMhD;;GAEG;AACH,eAAO,MAAM,uBAAuB;IAClC,2DAA2D;;;;;;EAK3D,CAAA;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAEvE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAA;IACf,2FAA2F;IAC3F,aAAa,EAAE,MAAM,CAAA;IACrB,8FAA8F;IAC9F,UAAU,EAAE,MAAM,CAAA;IAClB,qDAAqD;IACrD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAA;IACf,qEAAqE;IACrE,MAAM,EAAE,OAAO,CAAA;IACf,oEAAoE;IACpE,eAAe,EAAE,OAAO,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,8CAA8C;IAC9C,gBAAgB,EAAE,MAAM,CAAA;IACxB,wBAAwB;IACxB,MAAM,EAAE,eAAe,EAAE,CAAA;CAC1B;AAMD;;GAEG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;CAiBlC,CAAA;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,oBAAoB,CAAC,CAqD/B"}
1
+ {"version":3,"file":"skill-updates.d.ts","sourceRoot":"","sources":["../../../src/tools/skill-updates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAMhD;;GAEG;AACH,eAAO,MAAM,uBAAuB;IAClC,2DAA2D;;;;;;EAK3D,CAAA;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAEvE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAA;IACf,2FAA2F;IAC3F,aAAa,EAAE,MAAM,CAAA;IACrB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAA;IAClB,qDAAqD;IACrD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAA;IACf,qEAAqE;IACrE,MAAM,EAAE,OAAO,CAAA;IACf,oEAAoE;IACpE,eAAe,EAAE,OAAO,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,8CAA8C;IAC9C,gBAAgB,EAAE,MAAM,CAAA;IACxB,wBAAwB;IACxB,MAAM,EAAE,eAAe,EAAE,CAAA;CAC1B;AAMD;;GAEG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;CAiBlC,CAAA;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,oBAAoB,CAAC,CAqD/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/tools/uninstall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD,eAAO,MAAM,oBAAoB;;;;;;;;;EAG/B,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAGjE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAiFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,cAAc,EACrB,QAAQ,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,eAAe,CAAC,CAuF1B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAG7D;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;CAiBzB,CAAA;AAED,eAAe,aAAa,CAAA"}
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/tools/uninstall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD,eAAO,MAAM,oBAAoB;;;;;;;;;EAG/B,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAGjE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAiFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,cAAc,EACrB,QAAQ,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,eAAe,CAAC,CAgG1B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAG7D;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;CAiBzB,CAAA;AAED,eAAe,aAAa,CAAA"}
@@ -189,6 +189,15 @@ export async function uninstallSkill(input, _context) {
189
189
  }
190
190
  // Already removed, continue to update manifest
191
191
  }
192
+ // SMI-3137: Clean up dependency records
193
+ if (_context?.skillDependencyRepository) {
194
+ try {
195
+ _context.skillDependencyRepository.clearAll(skillEntry.id);
196
+ }
197
+ catch {
198
+ // Dependency cleanup is best-effort — table may not exist pre-migration
199
+ }
200
+ }
192
201
  // Update manifest
193
202
  delete manifest.installedSkills[skillName];
194
203
  await saveManifest(manifest);
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/tools/uninstall.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/tools/uninstall.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/tools/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAmB,MAAM,qBAAqB,CAAA;AAY3F,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC3F,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAE7E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,aAAa,EACpB,QAAQ,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAqF3B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAqD1E"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/tools/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAmB,MAAM,qBAAqB,CAAA;AAa3F,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC3F,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAE7E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,aAAa,EACpB,QAAQ,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAwF3B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAqD1E"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview Unit tests for validateDependencies helper
3
+ * @see SMI-3137: Wave 4 — Surface dependency intelligence
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=validate.dep.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.dep.test.d.ts","sourceRoot":"","sources":["../../../src/tools/validate.dep.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}