@skillsmith/mcp-server 0.2.3 → 0.3.1

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 (315) hide show
  1. package/package.json +3 -2
  2. package/src/assets/docs/USER_GUIDE.md +192 -0
  3. package/src/assets/skills/skillsmith/SKILL.md +147 -0
  4. package/src/assets/skills/skillsmith/docs/QUOTAS.md +182 -0
  5. package/src/assets/skills/skillsmith/docs/SECURITY.md +174 -0
  6. package/src/assets/skills/skillsmith/docs/TRUST_TIERS.md +142 -0
  7. package/dist/.tsbuildinfo +0 -1
  8. package/dist/src/__tests__/get-skill.test.d.ts +0 -6
  9. package/dist/src/__tests__/get-skill.test.d.ts.map +0 -1
  10. package/dist/src/__tests__/get-skill.test.js +0 -88
  11. package/dist/src/__tests__/get-skill.test.js.map +0 -1
  12. package/dist/src/__tests__/middleware/errorFormatter.test.d.ts +0 -7
  13. package/dist/src/__tests__/middleware/errorFormatter.test.d.ts.map +0 -1
  14. package/dist/src/__tests__/middleware/errorFormatter.test.js +0 -304
  15. package/dist/src/__tests__/middleware/errorFormatter.test.js.map +0 -1
  16. package/dist/src/__tests__/middleware/license.test.d.ts +0 -7
  17. package/dist/src/__tests__/middleware/license.test.d.ts.map +0 -1
  18. package/dist/src/__tests__/middleware/license.test.js +0 -500
  19. package/dist/src/__tests__/middleware/license.test.js.map +0 -1
  20. package/dist/src/__tests__/search.test.d.ts +0 -6
  21. package/dist/src/__tests__/search.test.d.ts.map +0 -1
  22. package/dist/src/__tests__/search.test.js +0 -86
  23. package/dist/src/__tests__/search.test.js.map +0 -1
  24. package/dist/src/__tests__/test-utils.d.ts +0 -20
  25. package/dist/src/__tests__/test-utils.d.ts.map +0 -1
  26. package/dist/src/__tests__/test-utils.js +0 -91
  27. package/dist/src/__tests__/test-utils.js.map +0 -1
  28. package/dist/src/context/index.d.ts +0 -19
  29. package/dist/src/context/index.d.ts.map +0 -1
  30. package/dist/src/context/index.js +0 -25
  31. package/dist/src/context/index.js.map +0 -1
  32. package/dist/src/context/project-detector.d.ts +0 -145
  33. package/dist/src/context/project-detector.d.ts.map +0 -1
  34. package/dist/src/context/project-detector.js +0 -321
  35. package/dist/src/context/project-detector.js.map +0 -1
  36. package/dist/src/context.d.ts +0 -135
  37. package/dist/src/context.d.ts.map +0 -1
  38. package/dist/src/context.js +0 -191
  39. package/dist/src/context.js.map +0 -1
  40. package/dist/src/core-shim.d.ts +0 -7
  41. package/dist/src/core-shim.d.ts.map +0 -1
  42. package/dist/src/core-shim.js +0 -9
  43. package/dist/src/core-shim.js.map +0 -1
  44. package/dist/src/health/healthCheck.d.ts +0 -88
  45. package/dist/src/health/healthCheck.d.ts.map +0 -1
  46. package/dist/src/health/healthCheck.js +0 -117
  47. package/dist/src/health/healthCheck.js.map +0 -1
  48. package/dist/src/health/index.d.ts +0 -21
  49. package/dist/src/health/index.d.ts.map +0 -1
  50. package/dist/src/health/index.js +0 -21
  51. package/dist/src/health/index.js.map +0 -1
  52. package/dist/src/health/readinessCheck.d.ts +0 -139
  53. package/dist/src/health/readinessCheck.d.ts.map +0 -1
  54. package/dist/src/health/readinessCheck.js +0 -266
  55. package/dist/src/health/readinessCheck.js.map +0 -1
  56. package/dist/src/index.d.ts +0 -8
  57. package/dist/src/index.d.ts.map +0 -1
  58. package/dist/src/index.js +0 -178
  59. package/dist/src/index.js.map +0 -1
  60. package/dist/src/index.test.d.ts +0 -2
  61. package/dist/src/index.test.d.ts.map +0 -1
  62. package/dist/src/index.test.js +0 -43
  63. package/dist/src/index.test.js.map +0 -1
  64. package/dist/src/logger.d.ts +0 -26
  65. package/dist/src/logger.d.ts.map +0 -1
  66. package/dist/src/logger.js +0 -179
  67. package/dist/src/logger.js.map +0 -1
  68. package/dist/src/middleware/__tests__/csp.test.d.ts +0 -2
  69. package/dist/src/middleware/__tests__/csp.test.d.ts.map +0 -1
  70. package/dist/src/middleware/__tests__/csp.test.js +0 -390
  71. package/dist/src/middleware/__tests__/csp.test.js.map +0 -1
  72. package/dist/src/middleware/csp.d.ts +0 -103
  73. package/dist/src/middleware/csp.d.ts.map +0 -1
  74. package/dist/src/middleware/csp.js +0 -273
  75. package/dist/src/middleware/csp.js.map +0 -1
  76. package/dist/src/middleware/degradation.d.ts +0 -105
  77. package/dist/src/middleware/degradation.d.ts.map +0 -1
  78. package/dist/src/middleware/degradation.js +0 -319
  79. package/dist/src/middleware/degradation.js.map +0 -1
  80. package/dist/src/middleware/errorFormatter.d.ts +0 -119
  81. package/dist/src/middleware/errorFormatter.d.ts.map +0 -1
  82. package/dist/src/middleware/errorFormatter.js +0 -294
  83. package/dist/src/middleware/errorFormatter.js.map +0 -1
  84. package/dist/src/middleware/index.d.ts +0 -11
  85. package/dist/src/middleware/index.d.ts.map +0 -1
  86. package/dist/src/middleware/index.js +0 -16
  87. package/dist/src/middleware/index.js.map +0 -1
  88. package/dist/src/middleware/license.d.ts +0 -169
  89. package/dist/src/middleware/license.d.ts.map +0 -1
  90. package/dist/src/middleware/license.js +0 -292
  91. package/dist/src/middleware/license.js.map +0 -1
  92. package/dist/src/middleware/quota.d.ts +0 -182
  93. package/dist/src/middleware/quota.d.ts.map +0 -1
  94. package/dist/src/middleware/quota.js +0 -309
  95. package/dist/src/middleware/quota.js.map +0 -1
  96. package/dist/src/middleware/toolFeatureMapping.d.ts +0 -36
  97. package/dist/src/middleware/toolFeatureMapping.d.ts.map +0 -1
  98. package/dist/src/middleware/toolFeatureMapping.js +0 -96
  99. package/dist/src/middleware/toolFeatureMapping.js.map +0 -1
  100. package/dist/src/onboarding/first-run.d.ts +0 -64
  101. package/dist/src/onboarding/first-run.d.ts.map +0 -1
  102. package/dist/src/onboarding/first-run.js +0 -77
  103. package/dist/src/onboarding/first-run.js.map +0 -1
  104. package/dist/src/onboarding/index.d.ts +0 -7
  105. package/dist/src/onboarding/index.d.ts.map +0 -1
  106. package/dist/src/onboarding/index.js +0 -7
  107. package/dist/src/onboarding/index.js.map +0 -1
  108. package/dist/src/suggestions/index.d.ts +0 -21
  109. package/dist/src/suggestions/index.d.ts.map +0 -1
  110. package/dist/src/suggestions/index.js +0 -20
  111. package/dist/src/suggestions/index.js.map +0 -1
  112. package/dist/src/suggestions/suggestion-engine.d.ts +0 -185
  113. package/dist/src/suggestions/suggestion-engine.d.ts.map +0 -1
  114. package/dist/src/suggestions/suggestion-engine.js +0 -352
  115. package/dist/src/suggestions/suggestion-engine.js.map +0 -1
  116. package/dist/src/suggestions/types.d.ts +0 -88
  117. package/dist/src/suggestions/types.d.ts.map +0 -1
  118. package/dist/src/suggestions/types.js +0 -21
  119. package/dist/src/suggestions/types.js.map +0 -1
  120. package/dist/src/tools/analyze.d.ts +0 -151
  121. package/dist/src/tools/analyze.d.ts.map +0 -1
  122. package/dist/src/tools/analyze.js +0 -205
  123. package/dist/src/tools/analyze.js.map +0 -1
  124. package/dist/src/tools/compare.d.ts +0 -149
  125. package/dist/src/tools/compare.d.ts.map +0 -1
  126. package/dist/src/tools/compare.js +0 -464
  127. package/dist/src/tools/compare.js.map +0 -1
  128. package/dist/src/tools/get-skill.d.ts +0 -107
  129. package/dist/src/tools/get-skill.d.ts.map +0 -1
  130. package/dist/src/tools/get-skill.js +0 -260
  131. package/dist/src/tools/get-skill.js.map +0 -1
  132. package/dist/src/tools/index.d.ts +0 -20
  133. package/dist/src/tools/index.d.ts.map +0 -1
  134. package/dist/src/tools/index.js +0 -20
  135. package/dist/src/tools/index.js.map +0 -1
  136. package/dist/src/tools/install.d.ts +0 -122
  137. package/dist/src/tools/install.d.ts.map +0 -1
  138. package/dist/src/tools/install.js +0 -326
  139. package/dist/src/tools/install.js.map +0 -1
  140. package/dist/src/tools/recommend.d.ts +0 -169
  141. package/dist/src/tools/recommend.d.ts.map +0 -1
  142. package/dist/src/tools/recommend.js +0 -357
  143. package/dist/src/tools/recommend.js.map +0 -1
  144. package/dist/src/tools/search.d.ts +0 -114
  145. package/dist/src/tools/search.d.ts.map +0 -1
  146. package/dist/src/tools/search.js +0 -247
  147. package/dist/src/tools/search.js.map +0 -1
  148. package/dist/src/tools/suggest.d.ts +0 -181
  149. package/dist/src/tools/suggest.d.ts.map +0 -1
  150. package/dist/src/tools/suggest.js +0 -310
  151. package/dist/src/tools/suggest.js.map +0 -1
  152. package/dist/src/tools/uninstall.d.ts +0 -123
  153. package/dist/src/tools/uninstall.d.ts.map +0 -1
  154. package/dist/src/tools/uninstall.js +0 -250
  155. package/dist/src/tools/uninstall.js.map +0 -1
  156. package/dist/src/tools/validate.d.ts +0 -122
  157. package/dist/src/tools/validate.d.ts.map +0 -1
  158. package/dist/src/tools/validate.js +0 -497
  159. package/dist/src/tools/validate.js.map +0 -1
  160. package/dist/src/utils/installed-skills.d.ts +0 -101
  161. package/dist/src/utils/installed-skills.d.ts.map +0 -1
  162. package/dist/src/utils/installed-skills.js +0 -220
  163. package/dist/src/utils/installed-skills.js.map +0 -1
  164. package/dist/src/utils/validation.d.ts +0 -95
  165. package/dist/src/utils/validation.d.ts.map +0 -1
  166. package/dist/src/utils/validation.js +0 -186
  167. package/dist/src/utils/validation.js.map +0 -1
  168. package/dist/src/webhooks/index.d.ts +0 -8
  169. package/dist/src/webhooks/index.d.ts.map +0 -1
  170. package/dist/src/webhooks/index.js +0 -9
  171. package/dist/src/webhooks/index.js.map +0 -1
  172. package/dist/src/webhooks/webhook-endpoint.d.ts +0 -149
  173. package/dist/src/webhooks/webhook-endpoint.d.ts.map +0 -1
  174. package/dist/src/webhooks/webhook-endpoint.js +0 -339
  175. package/dist/src/webhooks/webhook-endpoint.js.map +0 -1
  176. package/dist/tests/compare.test.d.ts +0 -6
  177. package/dist/tests/compare.test.d.ts.map +0 -1
  178. package/dist/tests/compare.test.js +0 -225
  179. package/dist/tests/compare.test.js.map +0 -1
  180. package/dist/tests/context/project-detector.test.d.ts +0 -6
  181. package/dist/tests/context/project-detector.test.d.ts.map +0 -1
  182. package/dist/tests/context/project-detector.test.js +0 -719
  183. package/dist/tests/context/project-detector.test.js.map +0 -1
  184. package/dist/tests/e2e/compare.e2e.test.d.ts +0 -10
  185. package/dist/tests/e2e/compare.e2e.test.d.ts.map +0 -1
  186. package/dist/tests/e2e/compare.e2e.test.js +0 -296
  187. package/dist/tests/e2e/compare.e2e.test.js.map +0 -1
  188. package/dist/tests/e2e/install-flow.e2e.test.d.ts +0 -10
  189. package/dist/tests/e2e/install-flow.e2e.test.d.ts.map +0 -1
  190. package/dist/tests/e2e/install-flow.e2e.test.js +0 -229
  191. package/dist/tests/e2e/install-flow.e2e.test.js.map +0 -1
  192. package/dist/tests/e2e/recommend.e2e.test.d.ts +0 -12
  193. package/dist/tests/e2e/recommend.e2e.test.d.ts.map +0 -1
  194. package/dist/tests/e2e/recommend.e2e.test.js +0 -357
  195. package/dist/tests/e2e/recommend.e2e.test.js.map +0 -1
  196. package/dist/tests/e2e/skill-flow.e2e.test.d.ts +0 -10
  197. package/dist/tests/e2e/skill-flow.e2e.test.d.ts.map +0 -1
  198. package/dist/tests/e2e/skill-flow.e2e.test.js +0 -311
  199. package/dist/tests/e2e/skill-flow.e2e.test.js.map +0 -1
  200. package/dist/tests/e2e/suggest.e2e.test.d.ts +0 -13
  201. package/dist/tests/e2e/suggest.e2e.test.d.ts.map +0 -1
  202. package/dist/tests/e2e/suggest.e2e.test.js +0 -367
  203. package/dist/tests/e2e/suggest.e2e.test.js.map +0 -1
  204. package/dist/tests/e2e/utils/baseline-collector.d.ts +0 -107
  205. package/dist/tests/e2e/utils/baseline-collector.d.ts.map +0 -1
  206. package/dist/tests/e2e/utils/baseline-collector.js +0 -211
  207. package/dist/tests/e2e/utils/baseline-collector.js.map +0 -1
  208. package/dist/tests/e2e/utils/hardcoded-detector.d.ts +0 -46
  209. package/dist/tests/e2e/utils/hardcoded-detector.d.ts.map +0 -1
  210. package/dist/tests/e2e/utils/hardcoded-detector.js +0 -255
  211. package/dist/tests/e2e/utils/hardcoded-detector.js.map +0 -1
  212. package/dist/tests/e2e/utils/index.d.ts +0 -7
  213. package/dist/tests/e2e/utils/index.d.ts.map +0 -1
  214. package/dist/tests/e2e/utils/index.js +0 -7
  215. package/dist/tests/e2e/utils/index.js.map +0 -1
  216. package/dist/tests/e2e/utils/linear-reporter.d.ts +0 -60
  217. package/dist/tests/e2e/utils/linear-reporter.d.ts.map +0 -1
  218. package/dist/tests/e2e/utils/linear-reporter.js +0 -232
  219. package/dist/tests/e2e/utils/linear-reporter.js.map +0 -1
  220. package/dist/tests/health.test.d.ts +0 -9
  221. package/dist/tests/health.test.d.ts.map +0 -1
  222. package/dist/tests/health.test.js +0 -308
  223. package/dist/tests/health.test.js.map +0 -1
  224. package/dist/tests/integration/analyze.integration.test.d.ts +0 -2
  225. package/dist/tests/integration/analyze.integration.test.d.ts.map +0 -1
  226. package/dist/tests/integration/analyze.integration.test.js +0 -244
  227. package/dist/tests/integration/analyze.integration.test.js.map +0 -1
  228. package/dist/tests/integration/compare.integration.test.d.ts +0 -2
  229. package/dist/tests/integration/compare.integration.test.d.ts.map +0 -1
  230. package/dist/tests/integration/compare.integration.test.js +0 -120
  231. package/dist/tests/integration/compare.integration.test.js.map +0 -1
  232. package/dist/tests/integration/fixtures/test-skills.d.ts +0 -62
  233. package/dist/tests/integration/fixtures/test-skills.d.ts.map +0 -1
  234. package/dist/tests/integration/fixtures/test-skills.js +0 -644
  235. package/dist/tests/integration/fixtures/test-skills.js.map +0 -1
  236. package/dist/tests/integration/get-skill.integration.test.d.ts +0 -6
  237. package/dist/tests/integration/get-skill.integration.test.d.ts.map +0 -1
  238. package/dist/tests/integration/get-skill.integration.test.js +0 -203
  239. package/dist/tests/integration/get-skill.integration.test.js.map +0 -1
  240. package/dist/tests/integration/github-api.integration.test.d.ts +0 -14
  241. package/dist/tests/integration/github-api.integration.test.d.ts.map +0 -1
  242. package/dist/tests/integration/github-api.integration.test.js +0 -190
  243. package/dist/tests/integration/github-api.integration.test.js.map +0 -1
  244. package/dist/tests/integration/install.integration.test.d.ts +0 -6
  245. package/dist/tests/integration/install.integration.test.d.ts.map +0 -1
  246. package/dist/tests/integration/install.integration.test.js +0 -282
  247. package/dist/tests/integration/install.integration.test.js.map +0 -1
  248. package/dist/tests/integration/recommend.integration.test.d.ts +0 -2
  249. package/dist/tests/integration/recommend.integration.test.d.ts.map +0 -1
  250. package/dist/tests/integration/recommend.integration.test.js +0 -217
  251. package/dist/tests/integration/recommend.integration.test.js.map +0 -1
  252. package/dist/tests/integration/search.integration.test.d.ts +0 -6
  253. package/dist/tests/integration/search.integration.test.d.ts.map +0 -1
  254. package/dist/tests/integration/search.integration.test.js +0 -229
  255. package/dist/tests/integration/search.integration.test.js.map +0 -1
  256. package/dist/tests/integration/setup.d.ts +0 -74
  257. package/dist/tests/integration/setup.d.ts.map +0 -1
  258. package/dist/tests/integration/setup.js +0 -131
  259. package/dist/tests/integration/setup.js.map +0 -1
  260. package/dist/tests/integration/uninstall.integration.test.d.ts +0 -6
  261. package/dist/tests/integration/uninstall.integration.test.d.ts.map +0 -1
  262. package/dist/tests/integration/uninstall.integration.test.js +0 -296
  263. package/dist/tests/integration/uninstall.integration.test.js.map +0 -1
  264. package/dist/tests/integration/validate.integration.test.d.ts +0 -2
  265. package/dist/tests/integration/validate.integration.test.d.ts.map +0 -1
  266. package/dist/tests/integration/validate.integration.test.js +0 -181
  267. package/dist/tests/integration/validate.integration.test.js.map +0 -1
  268. package/dist/tests/onboarding/first-run.test.d.ts +0 -7
  269. package/dist/tests/onboarding/first-run.test.d.ts.map +0 -1
  270. package/dist/tests/onboarding/first-run.test.js +0 -258
  271. package/dist/tests/onboarding/first-run.test.js.map +0 -1
  272. package/dist/tests/performance/search-performance.test.d.ts +0 -10
  273. package/dist/tests/performance/search-performance.test.d.ts.map +0 -1
  274. package/dist/tests/performance/search-performance.test.js +0 -222
  275. package/dist/tests/performance/search-performance.test.js.map +0 -1
  276. package/dist/tests/recommend.test.d.ts +0 -6
  277. package/dist/tests/recommend.test.d.ts.map +0 -1
  278. package/dist/tests/recommend.test.js +0 -210
  279. package/dist/tests/recommend.test.js.map +0 -1
  280. package/dist/tests/suggestions/suggestion-engine.test.d.ts +0 -6
  281. package/dist/tests/suggestions/suggestion-engine.test.d.ts.map +0 -1
  282. package/dist/tests/suggestions/suggestion-engine.test.js +0 -448
  283. package/dist/tests/suggestions/suggestion-engine.test.js.map +0 -1
  284. package/dist/tests/test-utils.d.ts +0 -74
  285. package/dist/tests/test-utils.d.ts.map +0 -1
  286. package/dist/tests/test-utils.js +0 -98
  287. package/dist/tests/test-utils.js.map +0 -1
  288. package/dist/tests/tools.test.d.ts +0 -5
  289. package/dist/tests/tools.test.d.ts.map +0 -1
  290. package/dist/tests/tools.test.js +0 -138
  291. package/dist/tests/tools.test.js.map +0 -1
  292. package/dist/tests/unit/installed-skills.test.d.ts +0 -6
  293. package/dist/tests/unit/installed-skills.test.d.ts.map +0 -1
  294. package/dist/tests/unit/installed-skills.test.js +0 -285
  295. package/dist/tests/unit/installed-skills.test.js.map +0 -1
  296. package/dist/tests/unit/logger.test.d.ts +0 -6
  297. package/dist/tests/unit/logger.test.d.ts.map +0 -1
  298. package/dist/tests/unit/logger.test.js +0 -281
  299. package/dist/tests/unit/logger.test.js.map +0 -1
  300. package/dist/tests/validate.test.d.ts +0 -5
  301. package/dist/tests/validate.test.d.ts.map +0 -1
  302. package/dist/tests/validate.test.js +0 -303
  303. package/dist/tests/validate.test.js.map +0 -1
  304. package/dist/tests/webhooks/proxy-trust.security.test.d.ts +0 -8
  305. package/dist/tests/webhooks/proxy-trust.security.test.d.ts.map +0 -1
  306. package/dist/tests/webhooks/proxy-trust.security.test.js +0 -145
  307. package/dist/tests/webhooks/proxy-trust.security.test.js.map +0 -1
  308. package/dist/tests/webhooks/rate-limiter.security.test.d.ts +0 -8
  309. package/dist/tests/webhooks/rate-limiter.security.test.d.ts.map +0 -1
  310. package/dist/tests/webhooks/rate-limiter.security.test.js +0 -122
  311. package/dist/tests/webhooks/rate-limiter.security.test.js.map +0 -1
  312. package/dist/vitest.config.d.ts +0 -6
  313. package/dist/vitest.config.d.ts.map +0 -1
  314. package/dist/vitest.config.js +0 -13
  315. package/dist/vitest.config.js.map +0 -1
@@ -1,309 +0,0 @@
1
- // SPDX-License-Identifier: Elastic-2.0
2
- // Copyright 2024-2025 Smith Horn Group Ltd
3
- import { buildQuotaExceededResponse } from './errorFormatter.js';
4
- // ============================================================================
5
- // Configuration
6
- // ============================================================================
7
- /**
8
- * Tier quota limits (API calls per month)
9
- * -1 represents unlimited
10
- */
11
- const TIER_QUOTAS = {
12
- community: 1_000,
13
- individual: 10_000,
14
- team: 100_000,
15
- enterprise: -1, // Unlimited
16
- };
17
- /**
18
- * Configuration for the upgrade URL
19
- */
20
- const UPGRADE_URL = 'https://skillsmith.app/upgrade';
21
- // ============================================================================
22
- // In-Memory Storage (Default)
23
- // ============================================================================
24
- /**
25
- * Simple in-memory storage for quota tracking
26
- * Note: This resets on server restart. Use a database-backed storage
27
- * in production via the storage option.
28
- */
29
- class InMemoryQuotaStorage {
30
- usage = new Map();
31
- async getUsage(customerId) {
32
- const now = new Date();
33
- const existing = this.usage.get(customerId);
34
- // If we have existing data and it's still in the current period, return it
35
- if (existing && existing.periodEnd > now) {
36
- return existing;
37
- }
38
- // Otherwise, create a new period
39
- const periodStart = this.getMonthStart(now);
40
- const periodEnd = this.getMonthEnd(now);
41
- const newUsage = { used: 0, periodStart, periodEnd };
42
- this.usage.set(customerId, newUsage);
43
- return newUsage;
44
- }
45
- async incrementUsage(customerId, cost) {
46
- const usage = await this.getUsage(customerId);
47
- usage.used += cost;
48
- }
49
- async initializePeriod(customerId, _limit) {
50
- const now = new Date();
51
- this.usage.set(customerId, {
52
- used: 0,
53
- periodStart: this.getMonthStart(now),
54
- periodEnd: this.getMonthEnd(now),
55
- });
56
- }
57
- getMonthStart(date) {
58
- return new Date(date.getFullYear(), date.getMonth(), 1);
59
- }
60
- getMonthEnd(date) {
61
- return new Date(date.getFullYear(), date.getMonth() + 1, 1);
62
- }
63
- }
64
- // ============================================================================
65
- // Helper Functions
66
- // ============================================================================
67
- /**
68
- * Get the warning level based on percentage used
69
- */
70
- function getWarningLevel(percentUsed) {
71
- if (percentUsed >= 100)
72
- return 100;
73
- if (percentUsed >= 90)
74
- return 90;
75
- if (percentUsed >= 80)
76
- return 80;
77
- return 0;
78
- }
79
- /**
80
- * Get warning message based on level and current usage
81
- */
82
- function getWarningMessage(warningLevel, used, limit, _tier) {
83
- if (warningLevel === 0)
84
- return undefined;
85
- const remaining = Math.max(0, limit - used);
86
- switch (warningLevel) {
87
- case 100:
88
- return `API quota exceeded (${used.toLocaleString()}/${limit.toLocaleString()} calls). Upgrade to continue.`;
89
- case 90:
90
- return `Warning: 90% of API quota used (${remaining.toLocaleString()} calls remaining). Consider upgrading.`;
91
- case 80:
92
- return `Notice: 80% of API quota used (${remaining.toLocaleString()} calls remaining).`;
93
- default:
94
- return undefined;
95
- }
96
- }
97
- /**
98
- * Generate a customer ID from license info
99
- * Falls back to 'anonymous' for community users without an organization ID
100
- */
101
- function getCustomerId(licenseInfo, providedId) {
102
- if (providedId)
103
- return providedId;
104
- if (licenseInfo?.organizationId)
105
- return licenseInfo.organizationId;
106
- return 'anonymous';
107
- }
108
- // ============================================================================
109
- // Quota Middleware Factory
110
- // ============================================================================
111
- /**
112
- * Create a quota enforcement middleware
113
- *
114
- * @param options - Configuration options
115
- * @returns Quota middleware instance
116
- *
117
- * @example
118
- * ```typescript
119
- * import { createQuotaMiddleware } from './middleware/quota.js';
120
- * import { createLicenseMiddleware } from './middleware/license.js';
121
- *
122
- * const licenseMiddleware = createLicenseMiddleware();
123
- * const quotaMiddleware = createQuotaMiddleware();
124
- *
125
- * // In tool handler:
126
- * async function handleTool(toolName: string, params: unknown) {
127
- * const licenseInfo = await licenseMiddleware.getLicenseInfo();
128
- * const quotaResult = await quotaMiddleware.checkAndTrack(toolName, licenseInfo);
129
- *
130
- * if (!quotaResult.allowed) {
131
- * return quotaMiddleware.buildExceededResponse(quotaResult);
132
- * }
133
- *
134
- * // Execute tool...
135
- * const result = await executeTool(toolName, params);
136
- *
137
- * // Add quota metadata to response
138
- * return {
139
- * ...result,
140
- * _meta: {
141
- * ...result._meta,
142
- * quota: quotaMiddleware.buildMetadata(quotaResult),
143
- * },
144
- * };
145
- * }
146
- * ```
147
- */
148
- export function createQuotaMiddleware(options = {}) {
149
- const { defaultCost = 1, trackUnlimited = false, storage = new InMemoryQuotaStorage() } = options;
150
- async function checkAndTrack(toolName, licenseInfo, customerId) {
151
- const tier = licenseInfo?.tier ?? 'community';
152
- const limit = TIER_QUOTAS[tier];
153
- const effectiveCustomerId = getCustomerId(licenseInfo, customerId);
154
- // Enterprise tier has unlimited quota
155
- if (limit === -1) {
156
- if (trackUnlimited) {
157
- await storage.incrementUsage(effectiveCustomerId, defaultCost);
158
- }
159
- return {
160
- allowed: true,
161
- remaining: -1,
162
- limit: -1,
163
- percentUsed: 0,
164
- warningLevel: 0,
165
- resetAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000), // 30 days from now
166
- };
167
- }
168
- // Get current usage
169
- const usage = await storage.getUsage(effectiveCustomerId);
170
- const currentUsed = usage.used;
171
- const newUsed = currentUsed + defaultCost;
172
- // Check if quota would be exceeded
173
- if (newUsed > limit) {
174
- const percentUsed = (currentUsed / limit) * 100;
175
- return {
176
- allowed: false,
177
- remaining: Math.max(0, limit - currentUsed),
178
- limit,
179
- percentUsed,
180
- warningLevel: 100,
181
- resetAt: usage.periodEnd,
182
- message: getWarningMessage(100, currentUsed, limit, tier),
183
- upgradeUrl: `${UPGRADE_URL}?reason=quota_exceeded&tier=${tier}`,
184
- };
185
- }
186
- // Increment usage
187
- await storage.incrementUsage(effectiveCustomerId, defaultCost);
188
- // Calculate warning level
189
- const percentUsed = (newUsed / limit) * 100;
190
- const warningLevel = getWarningLevel(percentUsed);
191
- return {
192
- allowed: true,
193
- remaining: limit - newUsed,
194
- limit,
195
- percentUsed,
196
- warningLevel,
197
- resetAt: usage.periodEnd,
198
- message: getWarningMessage(warningLevel, newUsed, limit, tier),
199
- upgradeUrl: warningLevel >= 90 ? `${UPGRADE_URL}?reason=quota_warning&tier=${tier}` : undefined,
200
- };
201
- }
202
- async function getStatus(licenseInfo, customerId) {
203
- const tier = licenseInfo?.tier ?? 'community';
204
- const limit = TIER_QUOTAS[tier];
205
- const effectiveCustomerId = getCustomerId(licenseInfo, customerId);
206
- // Enterprise tier has unlimited quota
207
- if (limit === -1) {
208
- return {
209
- allowed: true,
210
- remaining: -1,
211
- limit: -1,
212
- percentUsed: 0,
213
- warningLevel: 0,
214
- resetAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000),
215
- };
216
- }
217
- // Get current usage without incrementing
218
- const usage = await storage.getUsage(effectiveCustomerId);
219
- const percentUsed = (usage.used / limit) * 100;
220
- const warningLevel = getWarningLevel(percentUsed);
221
- return {
222
- allowed: usage.used < limit,
223
- remaining: Math.max(0, limit - usage.used),
224
- limit,
225
- percentUsed,
226
- warningLevel,
227
- resetAt: usage.periodEnd,
228
- message: getWarningMessage(warningLevel, usage.used, limit, tier),
229
- upgradeUrl: warningLevel >= 90 ? `${UPGRADE_URL}?reason=quota_warning&tier=${tier}` : undefined,
230
- };
231
- }
232
- function buildMetadata(result) {
233
- return {
234
- remaining: result.remaining,
235
- limit: result.limit,
236
- resetAt: result.resetAt.toISOString(),
237
- warning: result.message,
238
- };
239
- }
240
- function buildExceededResponse(result) {
241
- const used = result.limit - result.remaining;
242
- return buildQuotaExceededResponse('API calls', used, result.limit);
243
- }
244
- return {
245
- checkAndTrack,
246
- getStatus,
247
- buildMetadata,
248
- buildExceededResponse,
249
- };
250
- }
251
- // ============================================================================
252
- // Higher-Order Function for Tool Wrapping
253
- // ============================================================================
254
- /**
255
- * Wrap a tool handler with quota enforcement
256
- *
257
- * @param handler - The original tool handler
258
- * @param licenseMiddleware - License middleware instance
259
- * @param quotaMiddleware - Quota middleware instance
260
- * @returns Wrapped handler with quota enforcement
261
- *
262
- * @example
263
- * ```typescript
264
- * const searchHandler = withQuotaEnforcement(
265
- * originalSearchHandler,
266
- * licenseMiddleware,
267
- * quotaMiddleware
268
- * );
269
- * ```
270
- */
271
- export function withQuotaEnforcement(handler, licenseMiddleware, quotaMiddleware) {
272
- return async (toolName, params) => {
273
- const licenseInfo = await licenseMiddleware.getLicenseInfo();
274
- const quotaResult = await quotaMiddleware.checkAndTrack(toolName, licenseInfo);
275
- if (!quotaResult.allowed) {
276
- return quotaMiddleware.buildExceededResponse(quotaResult);
277
- }
278
- // Execute the original handler
279
- const result = await handler(params);
280
- // Note: In a real implementation, you would add quota metadata to the result
281
- // This requires knowing the result structure, which varies by tool
282
- return result;
283
- };
284
- }
285
- // ============================================================================
286
- // Utility Functions
287
- // ============================================================================
288
- /**
289
- * Check if a tier has unlimited quota
290
- */
291
- export function isUnlimitedTier(tier) {
292
- return TIER_QUOTAS[tier] === -1;
293
- }
294
- /**
295
- * Get the quota limit for a tier
296
- */
297
- export function getQuotaLimit(tier) {
298
- return TIER_QUOTAS[tier];
299
- }
300
- /**
301
- * Format quota remaining for display
302
- */
303
- export function formatQuotaRemaining(remaining, limit) {
304
- if (limit === -1) {
305
- return 'Unlimited';
306
- }
307
- return `${remaining.toLocaleString()} / ${limit.toLocaleString()}`;
308
- }
309
- //# sourceMappingURL=quota.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"quota.js","sourceRoot":"","sources":["../../../src/middleware/quota.ts"],"names":[],"mappings":"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"}
@@ -1,36 +0,0 @@
1
- /**
2
- * Tool-to-Feature mapping for license validation
3
- *
4
- * Maps MCP tool names to their required feature flags.
5
- * null = community feature (no license required)
6
- * string = feature flag that must be enabled in the license
7
- *
8
- * @see SMI-1055: Add license middleware to MCP server
9
- * @see SMI-1091: Unified tier feature definitions across packages
10
- */
11
- /**
12
- * Feature flags for enterprise licensing
13
- *
14
- * This type mirrors the canonical FeatureFlag from @skillsmith/enterprise.
15
- * We define it locally because @skillsmith/enterprise is an optional peer
16
- * dependency that may not be installed for community users.
17
- *
18
- * @see packages/enterprise/src/license/FeatureFlags.ts for canonical definition
19
- */
20
- export type FeatureFlag = 'basic_analytics' | 'email_support' | 'private_skills' | 'team_workspaces' | 'usage_analytics' | 'priority_support' | 'sso_saml' | 'rbac' | 'audit_logging' | 'siem_export' | 'compliance_reports' | 'private_registry' | 'custom_integrations' | 'advanced_analytics';
21
- /**
22
- * Mapping of tool names to their required feature flags
23
- *
24
- * null = community tool (no license required)
25
- * FeatureFlag = requires that feature to be enabled in license
26
- */
27
- export declare const TOOL_FEATURES: Record<string, FeatureFlag | null>;
28
- /**
29
- * Human-readable names for feature flags
30
- */
31
- export declare const FEATURE_DISPLAY_NAMES: Record<FeatureFlag, string>;
32
- /**
33
- * Tier information for upgrade messaging
34
- */
35
- export declare const FEATURE_TIERS: Record<FeatureFlag, 'individual' | 'team' | 'enterprise'>;
36
- //# sourceMappingURL=toolFeatureMapping.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"toolFeatureMapping.d.ts","sourceRoot":"","sources":["../../../src/middleware/toolFeatureMapping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAEnB,iBAAiB,GACjB,eAAe,GAEf,gBAAgB,GAChB,iBAAiB,GACjB,iBAAiB,GACjB,kBAAkB,GAElB,UAAU,GACV,MAAM,GACN,eAAe,GACf,aAAa,GACb,oBAAoB,GACpB,kBAAkB,GAElB,qBAAqB,GACrB,oBAAoB,CAAA;AAExB;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAoC5D,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAmB7D,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,YAAY,GAAG,MAAM,GAAG,YAAY,CAmBnF,CAAA"}
@@ -1,96 +0,0 @@
1
- /**
2
- * Tool-to-Feature mapping for license validation
3
- *
4
- * Maps MCP tool names to their required feature flags.
5
- * null = community feature (no license required)
6
- * string = feature flag that must be enabled in the license
7
- *
8
- * @see SMI-1055: Add license middleware to MCP server
9
- * @see SMI-1091: Unified tier feature definitions across packages
10
- */
11
- /**
12
- * Mapping of tool names to their required feature flags
13
- *
14
- * null = community tool (no license required)
15
- * FeatureFlag = requires that feature to be enabled in license
16
- */
17
- export const TOOL_FEATURES = {
18
- // Core tools - no feature required (null = community)
19
- search: null,
20
- get_skill: null,
21
- install_skill: null,
22
- uninstall_skill: null,
23
- skill_recommend: null,
24
- skill_validate: null,
25
- skill_compare: null,
26
- skill_suggest: null,
27
- // Team tools - require team features
28
- publish_private: 'private_skills',
29
- team_workspace: 'team_workspaces',
30
- share_skill: 'team_workspaces',
31
- // Enterprise tools - require enterprise features
32
- configure_sso: 'sso_saml',
33
- sso_settings: 'sso_saml',
34
- audit_export: 'audit_logging',
35
- audit_query: 'audit_logging',
36
- rbac_manage: 'rbac',
37
- rbac_assign_role: 'rbac',
38
- rbac_create_policy: 'rbac',
39
- siem_export: 'siem_export',
40
- compliance_report: 'compliance_reports',
41
- private_registry_publish: 'private_registry',
42
- private_registry_manage: 'private_registry',
43
- // Analytics tools
44
- analytics_dashboard: 'advanced_analytics',
45
- usage_report: 'advanced_analytics',
46
- // Integration tools
47
- webhook_configure: 'custom_integrations',
48
- api_key_manage: 'custom_integrations',
49
- };
50
- /**
51
- * Human-readable names for feature flags
52
- */
53
- export const FEATURE_DISPLAY_NAMES = {
54
- // Individual tier features
55
- basic_analytics: 'Basic Analytics',
56
- email_support: 'Email Support',
57
- // Team tier features
58
- private_skills: 'Private Skills',
59
- team_workspaces: 'Team Workspaces',
60
- usage_analytics: 'Usage Analytics',
61
- priority_support: 'Priority Support',
62
- // Enterprise tier features
63
- sso_saml: 'SSO/SAML Integration',
64
- rbac: 'Role-Based Access Control',
65
- audit_logging: 'Audit Logging',
66
- siem_export: 'SIEM Export',
67
- compliance_reports: 'Compliance Reports',
68
- private_registry: 'Private Registry',
69
- // Additional features
70
- custom_integrations: 'Custom Integrations',
71
- advanced_analytics: 'Advanced Analytics',
72
- };
73
- /**
74
- * Tier information for upgrade messaging
75
- */
76
- export const FEATURE_TIERS = {
77
- // Individual tier features
78
- basic_analytics: 'individual',
79
- email_support: 'individual',
80
- // Team tier features
81
- private_skills: 'team',
82
- team_workspaces: 'team',
83
- usage_analytics: 'team',
84
- priority_support: 'team',
85
- // Enterprise tier features
86
- sso_saml: 'enterprise',
87
- rbac: 'enterprise',
88
- audit_logging: 'enterprise',
89
- siem_export: 'enterprise',
90
- compliance_reports: 'enterprise',
91
- private_registry: 'enterprise',
92
- // Additional features
93
- custom_integrations: 'enterprise',
94
- advanced_analytics: 'enterprise',
95
- };
96
- //# sourceMappingURL=toolFeatureMapping.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"toolFeatureMapping.js","sourceRoot":"","sources":["../../../src/middleware/toolFeatureMapping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA+BH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAuC;IAC/D,sDAAsD;IACtD,MAAM,EAAE,IAAI;IACZ,SAAS,EAAE,IAAI;IACf,aAAa,EAAE,IAAI;IACnB,eAAe,EAAE,IAAI;IACrB,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,IAAI;IAEnB,qCAAqC;IACrC,eAAe,EAAE,gBAAgB;IACjC,cAAc,EAAE,iBAAiB;IACjC,WAAW,EAAE,iBAAiB;IAE9B,iDAAiD;IACjD,aAAa,EAAE,UAAU;IACzB,YAAY,EAAE,UAAU;IACxB,YAAY,EAAE,eAAe;IAC7B,WAAW,EAAE,eAAe;IAC5B,WAAW,EAAE,MAAM;IACnB,gBAAgB,EAAE,MAAM;IACxB,kBAAkB,EAAE,MAAM;IAC1B,WAAW,EAAE,aAAa;IAC1B,iBAAiB,EAAE,oBAAoB;IACvC,wBAAwB,EAAE,kBAAkB;IAC5C,uBAAuB,EAAE,kBAAkB;IAE3C,kBAAkB;IAClB,mBAAmB,EAAE,oBAAoB;IACzC,YAAY,EAAE,oBAAoB;IAElC,oBAAoB;IACpB,iBAAiB,EAAE,qBAAqB;IACxC,cAAc,EAAE,qBAAqB;CACtC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAgC;IAChE,2BAA2B;IAC3B,eAAe,EAAE,iBAAiB;IAClC,aAAa,EAAE,eAAe;IAC9B,qBAAqB;IACrB,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,iBAAiB;IAClC,eAAe,EAAE,iBAAiB;IAClC,gBAAgB,EAAE,kBAAkB;IACpC,2BAA2B;IAC3B,QAAQ,EAAE,sBAAsB;IAChC,IAAI,EAAE,2BAA2B;IACjC,aAAa,EAAE,eAAe;IAC9B,WAAW,EAAE,aAAa;IAC1B,kBAAkB,EAAE,oBAAoB;IACxC,gBAAgB,EAAE,kBAAkB;IACpC,sBAAsB;IACtB,mBAAmB,EAAE,qBAAqB;IAC1C,kBAAkB,EAAE,oBAAoB;CACzC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAA8D;IACtF,2BAA2B;IAC3B,eAAe,EAAE,YAAY;IAC7B,aAAa,EAAE,YAAY;IAC3B,qBAAqB;IACrB,cAAc,EAAE,MAAM;IACtB,eAAe,EAAE,MAAM;IACvB,eAAe,EAAE,MAAM;IACvB,gBAAgB,EAAE,MAAM;IACxB,2BAA2B;IAC3B,QAAQ,EAAE,YAAY;IACtB,IAAI,EAAE,YAAY;IAClB,aAAa,EAAE,YAAY;IAC3B,WAAW,EAAE,YAAY;IACzB,kBAAkB,EAAE,YAAY;IAChC,gBAAgB,EAAE,YAAY;IAC9B,sBAAsB;IACtB,mBAAmB,EAAE,YAAY;IACjC,kBAAkB,EAAE,YAAY;CACjC,CAAA"}
@@ -1,64 +0,0 @@
1
- /**
2
- * SMI-911: First Run Detection and Tier 1 Skill Auto-Installation
3
- *
4
- * Detects first run of Skillsmith MCP server and provides:
5
- * - First run detection via marker file
6
- * - Tier 1 skills list for auto-installation
7
- * - Welcome message formatting
8
- *
9
- * Tier 1 skills (from research doc):
10
- * - varlock (score: 95) - Security foundation
11
- * - commit (score: 92) - Git workflow
12
- * - governance (score: 88) - Code quality
13
- */
14
- /**
15
- * Skillsmith configuration directory
16
- */
17
- export declare const SKILLSMITH_DIR: string;
18
- /**
19
- * Marker file indicating first run is complete
20
- */
21
- export declare const FIRST_RUN_MARKER: string;
22
- /**
23
- * Tier 1 skill definition
24
- */
25
- export interface Tier1Skill {
26
- /** Full skill ID (e.g., 'anthropic/varlock') */
27
- id: string;
28
- /** Short name for display */
29
- name: string;
30
- /** Quality score from research (0-100) */
31
- score: number;
32
- }
33
- /**
34
- * Tier 1 skills to auto-install on first run
35
- *
36
- * These are the highest-value, lowest-friction skills identified
37
- * in the skill prioritization research.
38
- */
39
- export declare const TIER1_SKILLS: readonly Tier1Skill[];
40
- /**
41
- * Check if this is the first run of Skillsmith
42
- *
43
- * First run is detected by the absence of the marker file
44
- * at ~/.skillsmith/.first-run-complete
45
- *
46
- * @returns true if this is the first run, false otherwise
47
- */
48
- export declare function isFirstRun(): boolean;
49
- /**
50
- * Mark first run as complete
51
- *
52
- * Creates the marker file at ~/.skillsmith/.first-run-complete
53
- * with the current timestamp. Also ensures the .skillsmith
54
- * directory exists.
55
- */
56
- export declare function markFirstRunComplete(): void;
57
- /**
58
- * Generate welcome message after first run setup
59
- *
60
- * @param installedSkills - List of skill names that were installed
61
- * @returns Formatted welcome message
62
- */
63
- export declare function getWelcomeMessage(installedSkills: string[]): string;
64
- //# sourceMappingURL=first-run.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"first-run.d.ts","sourceRoot":"","sources":["../../../src/onboarding/first-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH;;GAEG;AACH,eAAO,MAAM,cAAc,QAAiC,CAAA;AAE5D;;GAEG;AACH,eAAO,MAAM,gBAAgB,QAA8C,CAAA;AAE3E;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAA;IACV,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAIpC,CAAA;AAEV;;;;;;;GAOG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,MAAM,CAWnE"}
@@ -1,77 +0,0 @@
1
- /**
2
- * SMI-911: First Run Detection and Tier 1 Skill Auto-Installation
3
- *
4
- * Detects first run of Skillsmith MCP server and provides:
5
- * - First run detection via marker file
6
- * - Tier 1 skills list for auto-installation
7
- * - Welcome message formatting
8
- *
9
- * Tier 1 skills (from research doc):
10
- * - varlock (score: 95) - Security foundation
11
- * - commit (score: 92) - Git workflow
12
- * - governance (score: 88) - Code quality
13
- */
14
- import { existsSync, mkdirSync, writeFileSync } from 'fs';
15
- import { join } from 'path';
16
- import { homedir } from 'os';
17
- /**
18
- * Skillsmith configuration directory
19
- */
20
- export const SKILLSMITH_DIR = join(homedir(), '.skillsmith');
21
- /**
22
- * Marker file indicating first run is complete
23
- */
24
- export const FIRST_RUN_MARKER = join(SKILLSMITH_DIR, '.first-run-complete');
25
- /**
26
- * Tier 1 skills to auto-install on first run
27
- *
28
- * These are the highest-value, lowest-friction skills identified
29
- * in the skill prioritization research.
30
- */
31
- export const TIER1_SKILLS = [
32
- { id: 'anthropic/varlock', name: 'varlock', score: 95 },
33
- { id: 'anthropic/commit', name: 'commit', score: 92 },
34
- { id: 'anthropic/governance', name: 'governance', score: 88 },
35
- ];
36
- /**
37
- * Check if this is the first run of Skillsmith
38
- *
39
- * First run is detected by the absence of the marker file
40
- * at ~/.skillsmith/.first-run-complete
41
- *
42
- * @returns true if this is the first run, false otherwise
43
- */
44
- export function isFirstRun() {
45
- return !existsSync(FIRST_RUN_MARKER);
46
- }
47
- /**
48
- * Mark first run as complete
49
- *
50
- * Creates the marker file at ~/.skillsmith/.first-run-complete
51
- * with the current timestamp. Also ensures the .skillsmith
52
- * directory exists.
53
- */
54
- export function markFirstRunComplete() {
55
- if (!existsSync(SKILLSMITH_DIR)) {
56
- mkdirSync(SKILLSMITH_DIR, { recursive: true });
57
- }
58
- writeFileSync(FIRST_RUN_MARKER, new Date().toISOString());
59
- }
60
- /**
61
- * Generate welcome message after first run setup
62
- *
63
- * @param installedSkills - List of skill names that were installed
64
- * @returns Formatted welcome message
65
- */
66
- export function getWelcomeMessage(installedSkills) {
67
- const skillList = installedSkills.map((s) => ` - ${s}`).join('\n');
68
- return `
69
- Welcome to Skillsmith!
70
-
71
- Essential skills installed:
72
- ${skillList}
73
-
74
- Try: "Write a commit message" to see the commit skill in action.
75
- `.trim();
76
- }
77
- //# sourceMappingURL=first-run.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"first-run.js","sourceRoot":"","sources":["../../../src/onboarding/first-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAE5B;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAA;AAE5D;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,EAAE,qBAAqB,CAAC,CAAA;AAc3E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;IACvD,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;IACrD,EAAE,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE;CACrD,CAAA;AAEV;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAA;AACtC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAChD,CAAC;IACD,aAAa,CAAC,gBAAgB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;AAC3D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,eAAyB;IACzD,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEnE,OAAO;;;;EAIP,SAAS;;;CAGV,CAAC,IAAI,EAAE,CAAA;AACR,CAAC"}
@@ -1,7 +0,0 @@
1
- /**
2
- * SMI-911: Onboarding Module
3
- *
4
- * Exports first-run detection and Tier 1 skill auto-installation functionality.
5
- */
6
- export { SKILLSMITH_DIR, FIRST_RUN_MARKER, TIER1_SKILLS, isFirstRun, markFirstRunComplete, getWelcomeMessage, type Tier1Skill, } from './first-run.js';
7
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/onboarding/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,iBAAiB,EACjB,KAAK,UAAU,GAChB,MAAM,gBAAgB,CAAA"}
@@ -1,7 +0,0 @@
1
- /**
2
- * SMI-911: Onboarding Module
3
- *
4
- * Exports first-run detection and Tier 1 skill auto-installation functionality.
5
- */
6
- export { SKILLSMITH_DIR, FIRST_RUN_MARKER, TIER1_SKILLS, isFirstRun, markFirstRunComplete, getWelcomeMessage, } from './first-run.js';
7
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/onboarding/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,iBAAiB,GAElB,MAAM,gBAAgB,CAAA"}
@@ -1,21 +0,0 @@
1
- /**
2
- * @fileoverview Suggestion Module Exports
3
- * @module @skillsmith/mcp-server/suggestions
4
- * @see SMI-913: Contextual skill suggestions after first success
5
- *
6
- * Re-exports all suggestion-related types and the SuggestionEngine class.
7
- *
8
- * @example
9
- * import {
10
- * SuggestionEngine,
11
- * type SkillSuggestion,
12
- * type SuggestionConfig,
13
- * type SuggestionState,
14
- * } from './suggestions';
15
- *
16
- * const engine = new SuggestionEngine();
17
- * const suggestions = engine.getSuggestions(context);
18
- */
19
- export { SuggestionEngine } from './suggestion-engine.js';
20
- export type { SkillSuggestion, SuggestionConfig, SuggestionState } from './types.js';
21
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/suggestions/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAEzD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA"}