@skillsmith/mcp-server 0.3.0 → 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 (314) hide show
  1. package/package.json +1 -1
  2. package/dist/.tsbuildinfo +0 -1
  3. package/dist/src/__tests__/get-skill.test.d.ts +0 -6
  4. package/dist/src/__tests__/get-skill.test.d.ts.map +0 -1
  5. package/dist/src/__tests__/get-skill.test.js +0 -88
  6. package/dist/src/__tests__/get-skill.test.js.map +0 -1
  7. package/dist/src/__tests__/middleware/errorFormatter.test.d.ts +0 -7
  8. package/dist/src/__tests__/middleware/errorFormatter.test.d.ts.map +0 -1
  9. package/dist/src/__tests__/middleware/errorFormatter.test.js +0 -304
  10. package/dist/src/__tests__/middleware/errorFormatter.test.js.map +0 -1
  11. package/dist/src/__tests__/middleware/license.test.d.ts +0 -7
  12. package/dist/src/__tests__/middleware/license.test.d.ts.map +0 -1
  13. package/dist/src/__tests__/middleware/license.test.js +0 -500
  14. package/dist/src/__tests__/middleware/license.test.js.map +0 -1
  15. package/dist/src/__tests__/search.test.d.ts +0 -6
  16. package/dist/src/__tests__/search.test.d.ts.map +0 -1
  17. package/dist/src/__tests__/search.test.js +0 -86
  18. package/dist/src/__tests__/search.test.js.map +0 -1
  19. package/dist/src/__tests__/test-utils.d.ts +0 -20
  20. package/dist/src/__tests__/test-utils.d.ts.map +0 -1
  21. package/dist/src/__tests__/test-utils.js +0 -91
  22. package/dist/src/__tests__/test-utils.js.map +0 -1
  23. package/dist/src/context/index.d.ts +0 -19
  24. package/dist/src/context/index.d.ts.map +0 -1
  25. package/dist/src/context/index.js +0 -25
  26. package/dist/src/context/index.js.map +0 -1
  27. package/dist/src/context/project-detector.d.ts +0 -145
  28. package/dist/src/context/project-detector.d.ts.map +0 -1
  29. package/dist/src/context/project-detector.js +0 -321
  30. package/dist/src/context/project-detector.js.map +0 -1
  31. package/dist/src/context.d.ts +0 -157
  32. package/dist/src/context.d.ts.map +0 -1
  33. package/dist/src/context.js +0 -231
  34. package/dist/src/context.js.map +0 -1
  35. package/dist/src/core-shim.d.ts +0 -7
  36. package/dist/src/core-shim.d.ts.map +0 -1
  37. package/dist/src/core-shim.js +0 -9
  38. package/dist/src/core-shim.js.map +0 -1
  39. package/dist/src/health/healthCheck.d.ts +0 -88
  40. package/dist/src/health/healthCheck.d.ts.map +0 -1
  41. package/dist/src/health/healthCheck.js +0 -117
  42. package/dist/src/health/healthCheck.js.map +0 -1
  43. package/dist/src/health/index.d.ts +0 -21
  44. package/dist/src/health/index.d.ts.map +0 -1
  45. package/dist/src/health/index.js +0 -21
  46. package/dist/src/health/index.js.map +0 -1
  47. package/dist/src/health/readinessCheck.d.ts +0 -139
  48. package/dist/src/health/readinessCheck.d.ts.map +0 -1
  49. package/dist/src/health/readinessCheck.js +0 -266
  50. package/dist/src/health/readinessCheck.js.map +0 -1
  51. package/dist/src/index.d.ts +0 -9
  52. package/dist/src/index.d.ts.map +0 -1
  53. package/dist/src/index.js +0 -236
  54. package/dist/src/index.js.map +0 -1
  55. package/dist/src/index.test.d.ts +0 -2
  56. package/dist/src/index.test.d.ts.map +0 -1
  57. package/dist/src/index.test.js +0 -43
  58. package/dist/src/index.test.js.map +0 -1
  59. package/dist/src/logger.d.ts +0 -26
  60. package/dist/src/logger.d.ts.map +0 -1
  61. package/dist/src/logger.js +0 -179
  62. package/dist/src/logger.js.map +0 -1
  63. package/dist/src/middleware/__tests__/csp.test.d.ts +0 -2
  64. package/dist/src/middleware/__tests__/csp.test.d.ts.map +0 -1
  65. package/dist/src/middleware/__tests__/csp.test.js +0 -390
  66. package/dist/src/middleware/__tests__/csp.test.js.map +0 -1
  67. package/dist/src/middleware/csp.d.ts +0 -103
  68. package/dist/src/middleware/csp.d.ts.map +0 -1
  69. package/dist/src/middleware/csp.js +0 -273
  70. package/dist/src/middleware/csp.js.map +0 -1
  71. package/dist/src/middleware/degradation.d.ts +0 -105
  72. package/dist/src/middleware/degradation.d.ts.map +0 -1
  73. package/dist/src/middleware/degradation.js +0 -319
  74. package/dist/src/middleware/degradation.js.map +0 -1
  75. package/dist/src/middleware/errorFormatter.d.ts +0 -119
  76. package/dist/src/middleware/errorFormatter.d.ts.map +0 -1
  77. package/dist/src/middleware/errorFormatter.js +0 -294
  78. package/dist/src/middleware/errorFormatter.js.map +0 -1
  79. package/dist/src/middleware/index.d.ts +0 -11
  80. package/dist/src/middleware/index.d.ts.map +0 -1
  81. package/dist/src/middleware/index.js +0 -16
  82. package/dist/src/middleware/index.js.map +0 -1
  83. package/dist/src/middleware/license.d.ts +0 -169
  84. package/dist/src/middleware/license.d.ts.map +0 -1
  85. package/dist/src/middleware/license.js +0 -292
  86. package/dist/src/middleware/license.js.map +0 -1
  87. package/dist/src/middleware/quota.d.ts +0 -182
  88. package/dist/src/middleware/quota.d.ts.map +0 -1
  89. package/dist/src/middleware/quota.js +0 -309
  90. package/dist/src/middleware/quota.js.map +0 -1
  91. package/dist/src/middleware/toolFeatureMapping.d.ts +0 -36
  92. package/dist/src/middleware/toolFeatureMapping.d.ts.map +0 -1
  93. package/dist/src/middleware/toolFeatureMapping.js +0 -96
  94. package/dist/src/middleware/toolFeatureMapping.js.map +0 -1
  95. package/dist/src/onboarding/first-run.d.ts +0 -65
  96. package/dist/src/onboarding/first-run.d.ts.map +0 -1
  97. package/dist/src/onboarding/first-run.js +0 -79
  98. package/dist/src/onboarding/first-run.js.map +0 -1
  99. package/dist/src/onboarding/index.d.ts +0 -7
  100. package/dist/src/onboarding/index.d.ts.map +0 -1
  101. package/dist/src/onboarding/index.js +0 -7
  102. package/dist/src/onboarding/index.js.map +0 -1
  103. package/dist/src/onboarding/install-assets.d.ts +0 -27
  104. package/dist/src/onboarding/install-assets.d.ts.map +0 -1
  105. package/dist/src/onboarding/install-assets.js +0 -128
  106. package/dist/src/onboarding/install-assets.js.map +0 -1
  107. package/dist/src/suggestions/index.d.ts +0 -21
  108. package/dist/src/suggestions/index.d.ts.map +0 -1
  109. package/dist/src/suggestions/index.js +0 -20
  110. package/dist/src/suggestions/index.js.map +0 -1
  111. package/dist/src/suggestions/suggestion-engine.d.ts +0 -185
  112. package/dist/src/suggestions/suggestion-engine.d.ts.map +0 -1
  113. package/dist/src/suggestions/suggestion-engine.js +0 -352
  114. package/dist/src/suggestions/suggestion-engine.js.map +0 -1
  115. package/dist/src/suggestions/types.d.ts +0 -88
  116. package/dist/src/suggestions/types.d.ts.map +0 -1
  117. package/dist/src/suggestions/types.js +0 -21
  118. package/dist/src/suggestions/types.js.map +0 -1
  119. package/dist/src/tools/analyze.d.ts +0 -151
  120. package/dist/src/tools/analyze.d.ts.map +0 -1
  121. package/dist/src/tools/analyze.js +0 -205
  122. package/dist/src/tools/analyze.js.map +0 -1
  123. package/dist/src/tools/compare.d.ts +0 -149
  124. package/dist/src/tools/compare.d.ts.map +0 -1
  125. package/dist/src/tools/compare.js +0 -464
  126. package/dist/src/tools/compare.js.map +0 -1
  127. package/dist/src/tools/get-skill.d.ts +0 -107
  128. package/dist/src/tools/get-skill.d.ts.map +0 -1
  129. package/dist/src/tools/get-skill.js +0 -260
  130. package/dist/src/tools/get-skill.js.map +0 -1
  131. package/dist/src/tools/index.d.ts +0 -20
  132. package/dist/src/tools/index.d.ts.map +0 -1
  133. package/dist/src/tools/index.js +0 -20
  134. package/dist/src/tools/index.js.map +0 -1
  135. package/dist/src/tools/install.d.ts +0 -122
  136. package/dist/src/tools/install.d.ts.map +0 -1
  137. package/dist/src/tools/install.js +0 -326
  138. package/dist/src/tools/install.js.map +0 -1
  139. package/dist/src/tools/recommend.d.ts +0 -169
  140. package/dist/src/tools/recommend.d.ts.map +0 -1
  141. package/dist/src/tools/recommend.js +0 -357
  142. package/dist/src/tools/recommend.js.map +0 -1
  143. package/dist/src/tools/search.d.ts +0 -114
  144. package/dist/src/tools/search.d.ts.map +0 -1
  145. package/dist/src/tools/search.js +0 -247
  146. package/dist/src/tools/search.js.map +0 -1
  147. package/dist/src/tools/suggest.d.ts +0 -181
  148. package/dist/src/tools/suggest.d.ts.map +0 -1
  149. package/dist/src/tools/suggest.js +0 -310
  150. package/dist/src/tools/suggest.js.map +0 -1
  151. package/dist/src/tools/uninstall.d.ts +0 -123
  152. package/dist/src/tools/uninstall.d.ts.map +0 -1
  153. package/dist/src/tools/uninstall.js +0 -250
  154. package/dist/src/tools/uninstall.js.map +0 -1
  155. package/dist/src/tools/validate.d.ts +0 -122
  156. package/dist/src/tools/validate.d.ts.map +0 -1
  157. package/dist/src/tools/validate.js +0 -497
  158. package/dist/src/tools/validate.js.map +0 -1
  159. package/dist/src/utils/installed-skills.d.ts +0 -101
  160. package/dist/src/utils/installed-skills.d.ts.map +0 -1
  161. package/dist/src/utils/installed-skills.js +0 -220
  162. package/dist/src/utils/installed-skills.js.map +0 -1
  163. package/dist/src/utils/validation.d.ts +0 -95
  164. package/dist/src/utils/validation.d.ts.map +0 -1
  165. package/dist/src/utils/validation.js +0 -186
  166. package/dist/src/utils/validation.js.map +0 -1
  167. package/dist/src/webhooks/index.d.ts +0 -8
  168. package/dist/src/webhooks/index.d.ts.map +0 -1
  169. package/dist/src/webhooks/index.js +0 -9
  170. package/dist/src/webhooks/index.js.map +0 -1
  171. package/dist/src/webhooks/webhook-endpoint.d.ts +0 -149
  172. package/dist/src/webhooks/webhook-endpoint.d.ts.map +0 -1
  173. package/dist/src/webhooks/webhook-endpoint.js +0 -339
  174. package/dist/src/webhooks/webhook-endpoint.js.map +0 -1
  175. package/dist/tests/compare.test.d.ts +0 -6
  176. package/dist/tests/compare.test.d.ts.map +0 -1
  177. package/dist/tests/compare.test.js +0 -225
  178. package/dist/tests/compare.test.js.map +0 -1
  179. package/dist/tests/context/project-detector.test.d.ts +0 -6
  180. package/dist/tests/context/project-detector.test.d.ts.map +0 -1
  181. package/dist/tests/context/project-detector.test.js +0 -719
  182. package/dist/tests/context/project-detector.test.js.map +0 -1
  183. package/dist/tests/e2e/compare.e2e.test.d.ts +0 -10
  184. package/dist/tests/e2e/compare.e2e.test.d.ts.map +0 -1
  185. package/dist/tests/e2e/compare.e2e.test.js +0 -296
  186. package/dist/tests/e2e/compare.e2e.test.js.map +0 -1
  187. package/dist/tests/e2e/install-flow.e2e.test.d.ts +0 -10
  188. package/dist/tests/e2e/install-flow.e2e.test.d.ts.map +0 -1
  189. package/dist/tests/e2e/install-flow.e2e.test.js +0 -229
  190. package/dist/tests/e2e/install-flow.e2e.test.js.map +0 -1
  191. package/dist/tests/e2e/recommend.e2e.test.d.ts +0 -12
  192. package/dist/tests/e2e/recommend.e2e.test.d.ts.map +0 -1
  193. package/dist/tests/e2e/recommend.e2e.test.js +0 -357
  194. package/dist/tests/e2e/recommend.e2e.test.js.map +0 -1
  195. package/dist/tests/e2e/skill-flow.e2e.test.d.ts +0 -10
  196. package/dist/tests/e2e/skill-flow.e2e.test.d.ts.map +0 -1
  197. package/dist/tests/e2e/skill-flow.e2e.test.js +0 -311
  198. package/dist/tests/e2e/skill-flow.e2e.test.js.map +0 -1
  199. package/dist/tests/e2e/suggest.e2e.test.d.ts +0 -13
  200. package/dist/tests/e2e/suggest.e2e.test.d.ts.map +0 -1
  201. package/dist/tests/e2e/suggest.e2e.test.js +0 -367
  202. package/dist/tests/e2e/suggest.e2e.test.js.map +0 -1
  203. package/dist/tests/e2e/utils/baseline-collector.d.ts +0 -107
  204. package/dist/tests/e2e/utils/baseline-collector.d.ts.map +0 -1
  205. package/dist/tests/e2e/utils/baseline-collector.js +0 -211
  206. package/dist/tests/e2e/utils/baseline-collector.js.map +0 -1
  207. package/dist/tests/e2e/utils/hardcoded-detector.d.ts +0 -46
  208. package/dist/tests/e2e/utils/hardcoded-detector.d.ts.map +0 -1
  209. package/dist/tests/e2e/utils/hardcoded-detector.js +0 -255
  210. package/dist/tests/e2e/utils/hardcoded-detector.js.map +0 -1
  211. package/dist/tests/e2e/utils/index.d.ts +0 -7
  212. package/dist/tests/e2e/utils/index.d.ts.map +0 -1
  213. package/dist/tests/e2e/utils/index.js +0 -7
  214. package/dist/tests/e2e/utils/index.js.map +0 -1
  215. package/dist/tests/e2e/utils/linear-reporter.d.ts +0 -60
  216. package/dist/tests/e2e/utils/linear-reporter.d.ts.map +0 -1
  217. package/dist/tests/e2e/utils/linear-reporter.js +0 -232
  218. package/dist/tests/e2e/utils/linear-reporter.js.map +0 -1
  219. package/dist/tests/health.test.d.ts +0 -9
  220. package/dist/tests/health.test.d.ts.map +0 -1
  221. package/dist/tests/health.test.js +0 -308
  222. package/dist/tests/health.test.js.map +0 -1
  223. package/dist/tests/integration/analyze.integration.test.d.ts +0 -2
  224. package/dist/tests/integration/analyze.integration.test.d.ts.map +0 -1
  225. package/dist/tests/integration/analyze.integration.test.js +0 -244
  226. package/dist/tests/integration/analyze.integration.test.js.map +0 -1
  227. package/dist/tests/integration/compare.integration.test.d.ts +0 -2
  228. package/dist/tests/integration/compare.integration.test.d.ts.map +0 -1
  229. package/dist/tests/integration/compare.integration.test.js +0 -120
  230. package/dist/tests/integration/compare.integration.test.js.map +0 -1
  231. package/dist/tests/integration/fixtures/test-skills.d.ts +0 -62
  232. package/dist/tests/integration/fixtures/test-skills.d.ts.map +0 -1
  233. package/dist/tests/integration/fixtures/test-skills.js +0 -644
  234. package/dist/tests/integration/fixtures/test-skills.js.map +0 -1
  235. package/dist/tests/integration/get-skill.integration.test.d.ts +0 -6
  236. package/dist/tests/integration/get-skill.integration.test.d.ts.map +0 -1
  237. package/dist/tests/integration/get-skill.integration.test.js +0 -203
  238. package/dist/tests/integration/get-skill.integration.test.js.map +0 -1
  239. package/dist/tests/integration/github-api.integration.test.d.ts +0 -14
  240. package/dist/tests/integration/github-api.integration.test.d.ts.map +0 -1
  241. package/dist/tests/integration/github-api.integration.test.js +0 -190
  242. package/dist/tests/integration/github-api.integration.test.js.map +0 -1
  243. package/dist/tests/integration/install.integration.test.d.ts +0 -6
  244. package/dist/tests/integration/install.integration.test.d.ts.map +0 -1
  245. package/dist/tests/integration/install.integration.test.js +0 -282
  246. package/dist/tests/integration/install.integration.test.js.map +0 -1
  247. package/dist/tests/integration/recommend.integration.test.d.ts +0 -2
  248. package/dist/tests/integration/recommend.integration.test.d.ts.map +0 -1
  249. package/dist/tests/integration/recommend.integration.test.js +0 -217
  250. package/dist/tests/integration/recommend.integration.test.js.map +0 -1
  251. package/dist/tests/integration/search.integration.test.d.ts +0 -6
  252. package/dist/tests/integration/search.integration.test.d.ts.map +0 -1
  253. package/dist/tests/integration/search.integration.test.js +0 -229
  254. package/dist/tests/integration/search.integration.test.js.map +0 -1
  255. package/dist/tests/integration/setup.d.ts +0 -74
  256. package/dist/tests/integration/setup.d.ts.map +0 -1
  257. package/dist/tests/integration/setup.js +0 -131
  258. package/dist/tests/integration/setup.js.map +0 -1
  259. package/dist/tests/integration/uninstall.integration.test.d.ts +0 -6
  260. package/dist/tests/integration/uninstall.integration.test.d.ts.map +0 -1
  261. package/dist/tests/integration/uninstall.integration.test.js +0 -296
  262. package/dist/tests/integration/uninstall.integration.test.js.map +0 -1
  263. package/dist/tests/integration/validate.integration.test.d.ts +0 -2
  264. package/dist/tests/integration/validate.integration.test.d.ts.map +0 -1
  265. package/dist/tests/integration/validate.integration.test.js +0 -181
  266. package/dist/tests/integration/validate.integration.test.js.map +0 -1
  267. package/dist/tests/onboarding/first-run.test.d.ts +0 -7
  268. package/dist/tests/onboarding/first-run.test.d.ts.map +0 -1
  269. package/dist/tests/onboarding/first-run.test.js +0 -264
  270. package/dist/tests/onboarding/first-run.test.js.map +0 -1
  271. package/dist/tests/performance/search-performance.test.d.ts +0 -10
  272. package/dist/tests/performance/search-performance.test.d.ts.map +0 -1
  273. package/dist/tests/performance/search-performance.test.js +0 -222
  274. package/dist/tests/performance/search-performance.test.js.map +0 -1
  275. package/dist/tests/recommend.test.d.ts +0 -6
  276. package/dist/tests/recommend.test.d.ts.map +0 -1
  277. package/dist/tests/recommend.test.js +0 -210
  278. package/dist/tests/recommend.test.js.map +0 -1
  279. package/dist/tests/suggestions/suggestion-engine.test.d.ts +0 -6
  280. package/dist/tests/suggestions/suggestion-engine.test.d.ts.map +0 -1
  281. package/dist/tests/suggestions/suggestion-engine.test.js +0 -448
  282. package/dist/tests/suggestions/suggestion-engine.test.js.map +0 -1
  283. package/dist/tests/test-utils.d.ts +0 -74
  284. package/dist/tests/test-utils.d.ts.map +0 -1
  285. package/dist/tests/test-utils.js +0 -98
  286. package/dist/tests/test-utils.js.map +0 -1
  287. package/dist/tests/tools.test.d.ts +0 -5
  288. package/dist/tests/tools.test.d.ts.map +0 -1
  289. package/dist/tests/tools.test.js +0 -138
  290. package/dist/tests/tools.test.js.map +0 -1
  291. package/dist/tests/unit/installed-skills.test.d.ts +0 -6
  292. package/dist/tests/unit/installed-skills.test.d.ts.map +0 -1
  293. package/dist/tests/unit/installed-skills.test.js +0 -285
  294. package/dist/tests/unit/installed-skills.test.js.map +0 -1
  295. package/dist/tests/unit/logger.test.d.ts +0 -6
  296. package/dist/tests/unit/logger.test.d.ts.map +0 -1
  297. package/dist/tests/unit/logger.test.js +0 -281
  298. package/dist/tests/unit/logger.test.js.map +0 -1
  299. package/dist/tests/validate.test.d.ts +0 -5
  300. package/dist/tests/validate.test.d.ts.map +0 -1
  301. package/dist/tests/validate.test.js +0 -303
  302. package/dist/tests/validate.test.js.map +0 -1
  303. package/dist/tests/webhooks/proxy-trust.security.test.d.ts +0 -8
  304. package/dist/tests/webhooks/proxy-trust.security.test.d.ts.map +0 -1
  305. package/dist/tests/webhooks/proxy-trust.security.test.js +0 -145
  306. package/dist/tests/webhooks/proxy-trust.security.test.js.map +0 -1
  307. package/dist/tests/webhooks/rate-limiter.security.test.d.ts +0 -8
  308. package/dist/tests/webhooks/rate-limiter.security.test.d.ts.map +0 -1
  309. package/dist/tests/webhooks/rate-limiter.security.test.js +0 -122
  310. package/dist/tests/webhooks/rate-limiter.security.test.js.map +0 -1
  311. package/dist/vitest.config.d.ts +0 -6
  312. package/dist/vitest.config.d.ts.map +0 -1
  313. package/dist/vitest.config.js +0 -13
  314. 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,65 +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
- * - skill-builder (score: 90) - Custom skill creation
14
- */
15
- /**
16
- * Skillsmith configuration directory
17
- */
18
- export declare const SKILLSMITH_DIR: string;
19
- /**
20
- * Marker file indicating first run is complete
21
- */
22
- export declare const FIRST_RUN_MARKER: string;
23
- /**
24
- * Tier 1 skill definition
25
- */
26
- export interface Tier1Skill {
27
- /** Full skill ID (e.g., 'anthropic/varlock') */
28
- id: string;
29
- /** Short name for display */
30
- name: string;
31
- /** Quality score from research (0-100) */
32
- score: number;
33
- }
34
- /**
35
- * Tier 1 skills to auto-install on first run
36
- *
37
- * These are the highest-value, lowest-friction skills identified
38
- * in the skill prioritization research.
39
- */
40
- export declare const TIER1_SKILLS: readonly Tier1Skill[];
41
- /**
42
- * Check if this is the first run of Skillsmith
43
- *
44
- * First run is detected by the absence of the marker file
45
- * at ~/.skillsmith/.first-run-complete
46
- *
47
- * @returns true if this is the first run, false otherwise
48
- */
49
- export declare function isFirstRun(): boolean;
50
- /**
51
- * Mark first run as complete
52
- *
53
- * Creates the marker file at ~/.skillsmith/.first-run-complete
54
- * with the current timestamp. Also ensures the .skillsmith
55
- * directory exists.
56
- */
57
- export declare function markFirstRunComplete(): void;
58
- /**
59
- * Generate welcome message after first run setup
60
- *
61
- * @param installedSkills - List of skill names that were installed
62
- * @returns Formatted welcome message
63
- */
64
- export declare function getWelcomeMessage(installedSkills: string[]): string;
65
- //# 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;;;;;;;;;;;;;GAaG;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,EAKpC,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,79 +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
- * - skill-builder (score: 90) - Custom skill creation
14
- */
15
- import { existsSync, mkdirSync, writeFileSync } from 'fs';
16
- import { join } from 'path';
17
- import { homedir } from 'os';
18
- /**
19
- * Skillsmith configuration directory
20
- */
21
- export const SKILLSMITH_DIR = join(homedir(), '.skillsmith');
22
- /**
23
- * Marker file indicating first run is complete
24
- */
25
- export const FIRST_RUN_MARKER = join(SKILLSMITH_DIR, '.first-run-complete');
26
- /**
27
- * Tier 1 skills to auto-install on first run
28
- *
29
- * These are the highest-value, lowest-friction skills identified
30
- * in the skill prioritization research.
31
- */
32
- export const TIER1_SKILLS = [
33
- { id: 'anthropic/varlock', name: 'varlock', score: 95 },
34
- { id: 'anthropic/commit', name: 'commit', score: 92 },
35
- { id: 'anthropic/skill-builder', name: 'skill-builder', score: 90 },
36
- { id: 'anthropic/governance', name: 'governance', score: 88 },
37
- ];
38
- /**
39
- * Check if this is the first run of Skillsmith
40
- *
41
- * First run is detected by the absence of the marker file
42
- * at ~/.skillsmith/.first-run-complete
43
- *
44
- * @returns true if this is the first run, false otherwise
45
- */
46
- export function isFirstRun() {
47
- return !existsSync(FIRST_RUN_MARKER);
48
- }
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 function markFirstRunComplete() {
57
- if (!existsSync(SKILLSMITH_DIR)) {
58
- mkdirSync(SKILLSMITH_DIR, { recursive: true });
59
- }
60
- writeFileSync(FIRST_RUN_MARKER, new Date().toISOString());
61
- }
62
- /**
63
- * Generate welcome message after first run setup
64
- *
65
- * @param installedSkills - List of skill names that were installed
66
- * @returns Formatted welcome message
67
- */
68
- export function getWelcomeMessage(installedSkills) {
69
- const skillList = installedSkills.map((s) => ` - ${s}`).join('\n');
70
- return `
71
- Welcome to Skillsmith!
72
-
73
- Essential skills installed:
74
- ${skillList}
75
-
76
- Try: "Write a commit message" to see the commit skill in action.
77
- `.trim();
78
- }
79
- //# 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;;;;;;;;;;;;;GAaG;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,yBAAyB,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,EAAE;IACnE,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,27 +0,0 @@
1
- /**
2
- * SMI-XXXX: Install Bundled Assets on First Run
3
- *
4
- * Installs the skillsmith skill and user documentation
5
- * from the npm package's bundled assets.
6
- */
7
- /**
8
- * Install bundled skills from package assets
9
- *
10
- * Copies skills from src/assets/skills/ to ~/.claude/skills/
11
- *
12
- * @returns Array of installed skill names
13
- */
14
- export declare function installBundledSkills(): string[];
15
- /**
16
- * Install user documentation to ~/.skillsmith/docs/
17
- *
18
- * @returns true if docs were installed, false otherwise
19
- */
20
- export declare function installUserDocs(): boolean;
21
- /**
22
- * Get path to user guide for --docs flag
23
- *
24
- * @returns Path to USER_GUIDE.md if it exists, undefined otherwise
25
- */
26
- export declare function getUserGuidePath(): string | undefined;
27
- //# sourceMappingURL=install-assets.d.ts.map