@skillsmith/mcp-server 0.1.0

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 (306) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/src/__tests__/get-skill.test.d.ts +6 -0
  3. package/dist/src/__tests__/get-skill.test.d.ts.map +1 -0
  4. package/dist/src/__tests__/get-skill.test.js +88 -0
  5. package/dist/src/__tests__/get-skill.test.js.map +1 -0
  6. package/dist/src/__tests__/middleware/errorFormatter.test.d.ts +7 -0
  7. package/dist/src/__tests__/middleware/errorFormatter.test.d.ts.map +1 -0
  8. package/dist/src/__tests__/middleware/errorFormatter.test.js +304 -0
  9. package/dist/src/__tests__/middleware/errorFormatter.test.js.map +1 -0
  10. package/dist/src/__tests__/middleware/license.test.d.ts +7 -0
  11. package/dist/src/__tests__/middleware/license.test.d.ts.map +1 -0
  12. package/dist/src/__tests__/middleware/license.test.js +500 -0
  13. package/dist/src/__tests__/middleware/license.test.js.map +1 -0
  14. package/dist/src/__tests__/search.test.d.ts +6 -0
  15. package/dist/src/__tests__/search.test.d.ts.map +1 -0
  16. package/dist/src/__tests__/search.test.js +86 -0
  17. package/dist/src/__tests__/search.test.js.map +1 -0
  18. package/dist/src/__tests__/test-utils.d.ts +19 -0
  19. package/dist/src/__tests__/test-utils.d.ts.map +1 -0
  20. package/dist/src/__tests__/test-utils.js +87 -0
  21. package/dist/src/__tests__/test-utils.js.map +1 -0
  22. package/dist/src/context/index.d.ts +19 -0
  23. package/dist/src/context/index.d.ts.map +1 -0
  24. package/dist/src/context/index.js +25 -0
  25. package/dist/src/context/index.js.map +1 -0
  26. package/dist/src/context/project-detector.d.ts +145 -0
  27. package/dist/src/context/project-detector.d.ts.map +1 -0
  28. package/dist/src/context/project-detector.js +321 -0
  29. package/dist/src/context/project-detector.js.map +1 -0
  30. package/dist/src/context.d.ts +100 -0
  31. package/dist/src/context.d.ts.map +1 -0
  32. package/dist/src/context.js +157 -0
  33. package/dist/src/context.js.map +1 -0
  34. package/dist/src/core-shim.d.ts +7 -0
  35. package/dist/src/core-shim.d.ts.map +1 -0
  36. package/dist/src/core-shim.js +9 -0
  37. package/dist/src/core-shim.js.map +1 -0
  38. package/dist/src/health/healthCheck.d.ts +88 -0
  39. package/dist/src/health/healthCheck.d.ts.map +1 -0
  40. package/dist/src/health/healthCheck.js +117 -0
  41. package/dist/src/health/healthCheck.js.map +1 -0
  42. package/dist/src/health/index.d.ts +21 -0
  43. package/dist/src/health/index.d.ts.map +1 -0
  44. package/dist/src/health/index.js +21 -0
  45. package/dist/src/health/index.js.map +1 -0
  46. package/dist/src/health/readinessCheck.d.ts +139 -0
  47. package/dist/src/health/readinessCheck.d.ts.map +1 -0
  48. package/dist/src/health/readinessCheck.js +266 -0
  49. package/dist/src/health/readinessCheck.js.map +1 -0
  50. package/dist/src/index.d.ts +8 -0
  51. package/dist/src/index.d.ts.map +1 -0
  52. package/dist/src/index.js +178 -0
  53. package/dist/src/index.js.map +1 -0
  54. package/dist/src/index.test.d.ts +2 -0
  55. package/dist/src/index.test.d.ts.map +1 -0
  56. package/dist/src/index.test.js +43 -0
  57. package/dist/src/index.test.js.map +1 -0
  58. package/dist/src/logger.d.ts +26 -0
  59. package/dist/src/logger.d.ts.map +1 -0
  60. package/dist/src/logger.js +179 -0
  61. package/dist/src/logger.js.map +1 -0
  62. package/dist/src/middleware/__tests__/csp.test.d.ts +2 -0
  63. package/dist/src/middleware/__tests__/csp.test.d.ts.map +1 -0
  64. package/dist/src/middleware/__tests__/csp.test.js +389 -0
  65. package/dist/src/middleware/__tests__/csp.test.js.map +1 -0
  66. package/dist/src/middleware/csp.d.ts +87 -0
  67. package/dist/src/middleware/csp.d.ts.map +1 -0
  68. package/dist/src/middleware/csp.js +273 -0
  69. package/dist/src/middleware/csp.js.map +1 -0
  70. package/dist/src/middleware/degradation.d.ts +99 -0
  71. package/dist/src/middleware/degradation.d.ts.map +1 -0
  72. package/dist/src/middleware/degradation.js +315 -0
  73. package/dist/src/middleware/degradation.js.map +1 -0
  74. package/dist/src/middleware/errorFormatter.d.ts +119 -0
  75. package/dist/src/middleware/errorFormatter.d.ts.map +1 -0
  76. package/dist/src/middleware/errorFormatter.js +294 -0
  77. package/dist/src/middleware/errorFormatter.js.map +1 -0
  78. package/dist/src/middleware/index.d.ts +10 -0
  79. package/dist/src/middleware/index.d.ts.map +1 -0
  80. package/dist/src/middleware/index.js +14 -0
  81. package/dist/src/middleware/index.js.map +1 -0
  82. package/dist/src/middleware/license.d.ts +161 -0
  83. package/dist/src/middleware/license.d.ts.map +1 -0
  84. package/dist/src/middleware/license.js +281 -0
  85. package/dist/src/middleware/license.js.map +1 -0
  86. package/dist/src/middleware/toolFeatureMapping.d.ts +36 -0
  87. package/dist/src/middleware/toolFeatureMapping.d.ts.map +1 -0
  88. package/dist/src/middleware/toolFeatureMapping.js +90 -0
  89. package/dist/src/middleware/toolFeatureMapping.js.map +1 -0
  90. package/dist/src/onboarding/first-run.d.ts +64 -0
  91. package/dist/src/onboarding/first-run.d.ts.map +1 -0
  92. package/dist/src/onboarding/first-run.js +77 -0
  93. package/dist/src/onboarding/first-run.js.map +1 -0
  94. package/dist/src/onboarding/index.d.ts +7 -0
  95. package/dist/src/onboarding/index.d.ts.map +1 -0
  96. package/dist/src/onboarding/index.js +7 -0
  97. package/dist/src/onboarding/index.js.map +1 -0
  98. package/dist/src/suggestions/index.d.ts +21 -0
  99. package/dist/src/suggestions/index.d.ts.map +1 -0
  100. package/dist/src/suggestions/index.js +20 -0
  101. package/dist/src/suggestions/index.js.map +1 -0
  102. package/dist/src/suggestions/suggestion-engine.d.ts +185 -0
  103. package/dist/src/suggestions/suggestion-engine.d.ts.map +1 -0
  104. package/dist/src/suggestions/suggestion-engine.js +352 -0
  105. package/dist/src/suggestions/suggestion-engine.js.map +1 -0
  106. package/dist/src/suggestions/types.d.ts +88 -0
  107. package/dist/src/suggestions/types.d.ts.map +1 -0
  108. package/dist/src/suggestions/types.js +21 -0
  109. package/dist/src/suggestions/types.js.map +1 -0
  110. package/dist/src/tools/analyze.d.ts +151 -0
  111. package/dist/src/tools/analyze.d.ts.map +1 -0
  112. package/dist/src/tools/analyze.js +205 -0
  113. package/dist/src/tools/analyze.js.map +1 -0
  114. package/dist/src/tools/compare.d.ts +149 -0
  115. package/dist/src/tools/compare.d.ts.map +1 -0
  116. package/dist/src/tools/compare.js +464 -0
  117. package/dist/src/tools/compare.js.map +1 -0
  118. package/dist/src/tools/get-skill.d.ts +116 -0
  119. package/dist/src/tools/get-skill.d.ts.map +1 -0
  120. package/dist/src/tools/get-skill.js +224 -0
  121. package/dist/src/tools/get-skill.js.map +1 -0
  122. package/dist/src/tools/index.d.ts +20 -0
  123. package/dist/src/tools/index.d.ts.map +1 -0
  124. package/dist/src/tools/index.js +20 -0
  125. package/dist/src/tools/index.js.map +1 -0
  126. package/dist/src/tools/install.d.ts +122 -0
  127. package/dist/src/tools/install.d.ts.map +1 -0
  128. package/dist/src/tools/install.js +314 -0
  129. package/dist/src/tools/install.js.map +1 -0
  130. package/dist/src/tools/recommend.d.ts +171 -0
  131. package/dist/src/tools/recommend.d.ts.map +1 -0
  132. package/dist/src/tools/recommend.js +325 -0
  133. package/dist/src/tools/recommend.js.map +1 -0
  134. package/dist/src/tools/search.d.ts +121 -0
  135. package/dist/src/tools/search.d.ts.map +1 -0
  136. package/dist/src/tools/search.js +249 -0
  137. package/dist/src/tools/search.js.map +1 -0
  138. package/dist/src/tools/suggest.d.ts +181 -0
  139. package/dist/src/tools/suggest.d.ts.map +1 -0
  140. package/dist/src/tools/suggest.js +342 -0
  141. package/dist/src/tools/suggest.js.map +1 -0
  142. package/dist/src/tools/uninstall.d.ts +123 -0
  143. package/dist/src/tools/uninstall.d.ts.map +1 -0
  144. package/dist/src/tools/uninstall.js +250 -0
  145. package/dist/src/tools/uninstall.js.map +1 -0
  146. package/dist/src/tools/validate.d.ts +122 -0
  147. package/dist/src/tools/validate.d.ts.map +1 -0
  148. package/dist/src/tools/validate.js +497 -0
  149. package/dist/src/tools/validate.js.map +1 -0
  150. package/dist/src/utils/installed-skills.d.ts +101 -0
  151. package/dist/src/utils/installed-skills.d.ts.map +1 -0
  152. package/dist/src/utils/installed-skills.js +220 -0
  153. package/dist/src/utils/installed-skills.js.map +1 -0
  154. package/dist/src/utils/validation.d.ts +76 -0
  155. package/dist/src/utils/validation.d.ts.map +1 -0
  156. package/dist/src/utils/validation.js +153 -0
  157. package/dist/src/utils/validation.js.map +1 -0
  158. package/dist/src/webhooks/index.d.ts +8 -0
  159. package/dist/src/webhooks/index.d.ts.map +1 -0
  160. package/dist/src/webhooks/index.js +9 -0
  161. package/dist/src/webhooks/index.js.map +1 -0
  162. package/dist/src/webhooks/webhook-endpoint.d.ts +149 -0
  163. package/dist/src/webhooks/webhook-endpoint.d.ts.map +1 -0
  164. package/dist/src/webhooks/webhook-endpoint.js +339 -0
  165. package/dist/src/webhooks/webhook-endpoint.js.map +1 -0
  166. package/dist/tests/compare.test.d.ts +6 -0
  167. package/dist/tests/compare.test.d.ts.map +1 -0
  168. package/dist/tests/compare.test.js +225 -0
  169. package/dist/tests/compare.test.js.map +1 -0
  170. package/dist/tests/context/project-detector.test.d.ts +6 -0
  171. package/dist/tests/context/project-detector.test.d.ts.map +1 -0
  172. package/dist/tests/context/project-detector.test.js +719 -0
  173. package/dist/tests/context/project-detector.test.js.map +1 -0
  174. package/dist/tests/e2e/compare.e2e.test.d.ts +10 -0
  175. package/dist/tests/e2e/compare.e2e.test.d.ts.map +1 -0
  176. package/dist/tests/e2e/compare.e2e.test.js +286 -0
  177. package/dist/tests/e2e/compare.e2e.test.js.map +1 -0
  178. package/dist/tests/e2e/install-flow.e2e.test.d.ts +10 -0
  179. package/dist/tests/e2e/install-flow.e2e.test.d.ts.map +1 -0
  180. package/dist/tests/e2e/install-flow.e2e.test.js +209 -0
  181. package/dist/tests/e2e/install-flow.e2e.test.js.map +1 -0
  182. package/dist/tests/e2e/recommend.e2e.test.d.ts +12 -0
  183. package/dist/tests/e2e/recommend.e2e.test.d.ts.map +1 -0
  184. package/dist/tests/e2e/recommend.e2e.test.js +347 -0
  185. package/dist/tests/e2e/recommend.e2e.test.js.map +1 -0
  186. package/dist/tests/e2e/skill-flow.e2e.test.d.ts +10 -0
  187. package/dist/tests/e2e/skill-flow.e2e.test.d.ts.map +1 -0
  188. package/dist/tests/e2e/skill-flow.e2e.test.js +280 -0
  189. package/dist/tests/e2e/skill-flow.e2e.test.js.map +1 -0
  190. package/dist/tests/e2e/suggest.e2e.test.d.ts +13 -0
  191. package/dist/tests/e2e/suggest.e2e.test.d.ts.map +1 -0
  192. package/dist/tests/e2e/suggest.e2e.test.js +347 -0
  193. package/dist/tests/e2e/suggest.e2e.test.js.map +1 -0
  194. package/dist/tests/e2e/utils/baseline-collector.d.ts +107 -0
  195. package/dist/tests/e2e/utils/baseline-collector.d.ts.map +1 -0
  196. package/dist/tests/e2e/utils/baseline-collector.js +211 -0
  197. package/dist/tests/e2e/utils/baseline-collector.js.map +1 -0
  198. package/dist/tests/e2e/utils/hardcoded-detector.d.ts +46 -0
  199. package/dist/tests/e2e/utils/hardcoded-detector.d.ts.map +1 -0
  200. package/dist/tests/e2e/utils/hardcoded-detector.js +255 -0
  201. package/dist/tests/e2e/utils/hardcoded-detector.js.map +1 -0
  202. package/dist/tests/e2e/utils/index.d.ts +7 -0
  203. package/dist/tests/e2e/utils/index.d.ts.map +1 -0
  204. package/dist/tests/e2e/utils/index.js +7 -0
  205. package/dist/tests/e2e/utils/index.js.map +1 -0
  206. package/dist/tests/e2e/utils/linear-reporter.d.ts +60 -0
  207. package/dist/tests/e2e/utils/linear-reporter.d.ts.map +1 -0
  208. package/dist/tests/e2e/utils/linear-reporter.js +232 -0
  209. package/dist/tests/e2e/utils/linear-reporter.js.map +1 -0
  210. package/dist/tests/health.test.d.ts +9 -0
  211. package/dist/tests/health.test.d.ts.map +1 -0
  212. package/dist/tests/health.test.js +308 -0
  213. package/dist/tests/health.test.js.map +1 -0
  214. package/dist/tests/integration/analyze.integration.test.d.ts +2 -0
  215. package/dist/tests/integration/analyze.integration.test.d.ts.map +1 -0
  216. package/dist/tests/integration/analyze.integration.test.js +244 -0
  217. package/dist/tests/integration/analyze.integration.test.js.map +1 -0
  218. package/dist/tests/integration/compare.integration.test.d.ts +2 -0
  219. package/dist/tests/integration/compare.integration.test.d.ts.map +1 -0
  220. package/dist/tests/integration/compare.integration.test.js +120 -0
  221. package/dist/tests/integration/compare.integration.test.js.map +1 -0
  222. package/dist/tests/integration/fixtures/test-skills.d.ts +62 -0
  223. package/dist/tests/integration/fixtures/test-skills.d.ts.map +1 -0
  224. package/dist/tests/integration/fixtures/test-skills.js +644 -0
  225. package/dist/tests/integration/fixtures/test-skills.js.map +1 -0
  226. package/dist/tests/integration/get-skill.integration.test.d.ts +6 -0
  227. package/dist/tests/integration/get-skill.integration.test.d.ts.map +1 -0
  228. package/dist/tests/integration/get-skill.integration.test.js +203 -0
  229. package/dist/tests/integration/get-skill.integration.test.js.map +1 -0
  230. package/dist/tests/integration/github-api.integration.test.d.ts +14 -0
  231. package/dist/tests/integration/github-api.integration.test.d.ts.map +1 -0
  232. package/dist/tests/integration/github-api.integration.test.js +190 -0
  233. package/dist/tests/integration/github-api.integration.test.js.map +1 -0
  234. package/dist/tests/integration/install.integration.test.d.ts +6 -0
  235. package/dist/tests/integration/install.integration.test.d.ts.map +1 -0
  236. package/dist/tests/integration/install.integration.test.js +282 -0
  237. package/dist/tests/integration/install.integration.test.js.map +1 -0
  238. package/dist/tests/integration/recommend.integration.test.d.ts +2 -0
  239. package/dist/tests/integration/recommend.integration.test.d.ts.map +1 -0
  240. package/dist/tests/integration/recommend.integration.test.js +215 -0
  241. package/dist/tests/integration/recommend.integration.test.js.map +1 -0
  242. package/dist/tests/integration/search.integration.test.d.ts +6 -0
  243. package/dist/tests/integration/search.integration.test.d.ts.map +1 -0
  244. package/dist/tests/integration/search.integration.test.js +229 -0
  245. package/dist/tests/integration/search.integration.test.js.map +1 -0
  246. package/dist/tests/integration/setup.d.ts +71 -0
  247. package/dist/tests/integration/setup.d.ts.map +1 -0
  248. package/dist/tests/integration/setup.js +124 -0
  249. package/dist/tests/integration/setup.js.map +1 -0
  250. package/dist/tests/integration/uninstall.integration.test.d.ts +6 -0
  251. package/dist/tests/integration/uninstall.integration.test.d.ts.map +1 -0
  252. package/dist/tests/integration/uninstall.integration.test.js +296 -0
  253. package/dist/tests/integration/uninstall.integration.test.js.map +1 -0
  254. package/dist/tests/integration/validate.integration.test.d.ts +2 -0
  255. package/dist/tests/integration/validate.integration.test.d.ts.map +1 -0
  256. package/dist/tests/integration/validate.integration.test.js +181 -0
  257. package/dist/tests/integration/validate.integration.test.js.map +1 -0
  258. package/dist/tests/onboarding/first-run.test.d.ts +7 -0
  259. package/dist/tests/onboarding/first-run.test.d.ts.map +1 -0
  260. package/dist/tests/onboarding/first-run.test.js +258 -0
  261. package/dist/tests/onboarding/first-run.test.js.map +1 -0
  262. package/dist/tests/performance/search-performance.test.d.ts +10 -0
  263. package/dist/tests/performance/search-performance.test.d.ts.map +1 -0
  264. package/dist/tests/performance/search-performance.test.js +218 -0
  265. package/dist/tests/performance/search-performance.test.js.map +1 -0
  266. package/dist/tests/recommend.test.d.ts +6 -0
  267. package/dist/tests/recommend.test.d.ts.map +1 -0
  268. package/dist/tests/recommend.test.js +208 -0
  269. package/dist/tests/recommend.test.js.map +1 -0
  270. package/dist/tests/suggestions/suggestion-engine.test.d.ts +6 -0
  271. package/dist/tests/suggestions/suggestion-engine.test.d.ts.map +1 -0
  272. package/dist/tests/suggestions/suggestion-engine.test.js +448 -0
  273. package/dist/tests/suggestions/suggestion-engine.test.js.map +1 -0
  274. package/dist/tests/test-utils.d.ts +74 -0
  275. package/dist/tests/test-utils.d.ts.map +1 -0
  276. package/dist/tests/test-utils.js +98 -0
  277. package/dist/tests/test-utils.js.map +1 -0
  278. package/dist/tests/tools.test.d.ts +5 -0
  279. package/dist/tests/tools.test.d.ts.map +1 -0
  280. package/dist/tests/tools.test.js +138 -0
  281. package/dist/tests/tools.test.js.map +1 -0
  282. package/dist/tests/unit/installed-skills.test.d.ts +6 -0
  283. package/dist/tests/unit/installed-skills.test.d.ts.map +1 -0
  284. package/dist/tests/unit/installed-skills.test.js +285 -0
  285. package/dist/tests/unit/installed-skills.test.js.map +1 -0
  286. package/dist/tests/unit/logger.test.d.ts +6 -0
  287. package/dist/tests/unit/logger.test.d.ts.map +1 -0
  288. package/dist/tests/unit/logger.test.js +281 -0
  289. package/dist/tests/unit/logger.test.js.map +1 -0
  290. package/dist/tests/validate.test.d.ts +5 -0
  291. package/dist/tests/validate.test.d.ts.map +1 -0
  292. package/dist/tests/validate.test.js +303 -0
  293. package/dist/tests/validate.test.js.map +1 -0
  294. package/dist/tests/webhooks/proxy-trust.security.test.d.ts +8 -0
  295. package/dist/tests/webhooks/proxy-trust.security.test.d.ts.map +1 -0
  296. package/dist/tests/webhooks/proxy-trust.security.test.js +145 -0
  297. package/dist/tests/webhooks/proxy-trust.security.test.js.map +1 -0
  298. package/dist/tests/webhooks/rate-limiter.security.test.d.ts +8 -0
  299. package/dist/tests/webhooks/rate-limiter.security.test.d.ts.map +1 -0
  300. package/dist/tests/webhooks/rate-limiter.security.test.js +122 -0
  301. package/dist/tests/webhooks/rate-limiter.security.test.js.map +1 -0
  302. package/dist/vitest.config.d.ts +6 -0
  303. package/dist/vitest.config.d.ts.map +1 -0
  304. package/dist/vitest.config.js +13 -0
  305. package/dist/vitest.config.js.map +1 -0
  306. package/package.json +63 -0
@@ -0,0 +1,315 @@
1
+ /**
2
+ * SMI-1060: Graceful Degradation Middleware
3
+ *
4
+ * Middleware that wraps tool handlers with graceful degradation,
5
+ * returning helpful messages instead of hard errors when features
6
+ * are unavailable.
7
+ */
8
+ import { createLicenseMiddleware, getRequiredFeature, } from './license.js';
9
+ import { TOOL_FEATURES, FEATURE_DISPLAY_NAMES, FEATURE_TIERS, } from './toolFeatureMapping.js';
10
+ // ============================================================================
11
+ // Constants
12
+ // ============================================================================
13
+ const BASE_URL = 'https://skillsmith.io';
14
+ /**
15
+ * Pricing information for each tier
16
+ */
17
+ const TIER_PRICING = {
18
+ community: '$0/month',
19
+ team: '$25/user/month',
20
+ enterprise: '$55/user/month',
21
+ };
22
+ /**
23
+ * Feature descriptions for upgrade prompts
24
+ */
25
+ const FEATURE_DESCRIPTIONS = {
26
+ // Team tier features
27
+ private_skills: 'Create and manage private skills for your organization',
28
+ team_workspaces: 'Collaborate with your team on shared skill collections',
29
+ usage_analytics: 'Track skill usage and adoption across your organization',
30
+ priority_support: 'Get faster response times from our support team',
31
+ // Enterprise tier features
32
+ sso_saml: 'Integrate with your identity provider for secure single sign-on',
33
+ rbac: 'Fine-grained access control with custom roles and permissions',
34
+ audit_logging: 'Comprehensive audit trail for compliance and security',
35
+ siem_export: 'Export audit logs to your SIEM platform for centralized monitoring',
36
+ compliance_reports: 'Generate compliance reports for SOC2, HIPAA, and other standards',
37
+ private_registry: 'Host a private registry of skills for your organization',
38
+ // Additional features
39
+ custom_integrations: 'Build custom integrations with your tools',
40
+ advanced_analytics: 'In-depth usage analytics and reporting',
41
+ };
42
+ // ============================================================================
43
+ // Default Logger
44
+ // ============================================================================
45
+ /**
46
+ * Default no-op logger
47
+ */
48
+ const noopLogger = {
49
+ log: () => { },
50
+ };
51
+ /**
52
+ * Console logger for degradation events
53
+ */
54
+ export const consoleDegradationLogger = {
55
+ log: (event) => {
56
+ const prefix = event.action === 'degraded' ? '[UPGRADE REQUIRED]' : `[${event.action.toUpperCase()}]`;
57
+ console.log(`${prefix} ${event.toolName}: ${event.message || 'No message'}`);
58
+ },
59
+ };
60
+ // ============================================================================
61
+ // Upgrade Message Generators
62
+ // ============================================================================
63
+ /**
64
+ * Create an upgrade prompt for a denied feature
65
+ */
66
+ function createUpgradePrompt(feature, currentTier) {
67
+ const displayName = FEATURE_DISPLAY_NAMES[feature];
68
+ const requiredTier = FEATURE_TIERS[feature];
69
+ const pricing = TIER_PRICING[requiredTier];
70
+ return `${displayName} requires ${requiredTier.charAt(0).toUpperCase() + requiredTier.slice(1)} tier (${pricing}). Upgrade at ${BASE_URL}/upgrade?tier=${requiredTier}&feature=${feature}`;
71
+ }
72
+ /**
73
+ * Create a detailed upgrade message with feature description
74
+ */
75
+ function createDetailedUpgradeMessage(feature, currentTier) {
76
+ const displayName = FEATURE_DISPLAY_NAMES[feature];
77
+ const description = FEATURE_DESCRIPTIONS[feature];
78
+ const requiredTier = FEATURE_TIERS[feature];
79
+ const pricing = TIER_PRICING[requiredTier];
80
+ const currentPricing = TIER_PRICING[currentTier];
81
+ return [
82
+ `Feature Unavailable: ${displayName}`,
83
+ '',
84
+ description,
85
+ '',
86
+ `Current tier: ${currentTier.charAt(0).toUpperCase() + currentTier.slice(1)} (${currentPricing})`,
87
+ `Required tier: ${requiredTier.charAt(0).toUpperCase() + requiredTier.slice(1)} (${pricing})`,
88
+ '',
89
+ `Upgrade to unlock: ${BASE_URL}/upgrade?tier=${requiredTier}&feature=${feature}`,
90
+ `Compare plans: ${BASE_URL}/pricing?highlight=${feature}&current=${currentTier}`,
91
+ ].join('\n');
92
+ }
93
+ /**
94
+ * Get tier comparison message
95
+ */
96
+ export function getTierComparisonMessage() {
97
+ return [
98
+ 'Skillsmith Pricing Tiers',
99
+ '========================',
100
+ '',
101
+ 'Community ($0/month)',
102
+ '----------------------------------------',
103
+ ' - Core features: search, install, recommend, validate, compare',
104
+ '',
105
+ 'Team ($25/user/month)',
106
+ '----------------------------------------',
107
+ ' - Private Skills',
108
+ ' - Team Workspaces',
109
+ ' - Priority Support',
110
+ '',
111
+ 'Enterprise ($55/user/month)',
112
+ '----------------------------------------',
113
+ ' - SSO/SAML Integration',
114
+ ' - Role-Based Access Control',
115
+ ' - Audit Logging',
116
+ ' - Custom Integrations',
117
+ ' - Advanced Analytics',
118
+ '',
119
+ `Learn more: ${BASE_URL}/pricing`,
120
+ ].join('\n');
121
+ }
122
+ // ============================================================================
123
+ // Graceful Degradation Response
124
+ // ============================================================================
125
+ /**
126
+ * Create a graceful degradation response for an unavailable feature
127
+ */
128
+ function createGracefulDegradationResponse(toolName, feature, currentTier, validationResult) {
129
+ const requiredTier = FEATURE_TIERS[feature];
130
+ const displayName = FEATURE_DISPLAY_NAMES[feature];
131
+ const response = {
132
+ status: 'upgrade_required',
133
+ feature: {
134
+ id: feature,
135
+ name: displayName,
136
+ description: FEATURE_DESCRIPTIONS[feature],
137
+ },
138
+ tiers: {
139
+ current: {
140
+ id: currentTier,
141
+ pricing: TIER_PRICING[currentTier],
142
+ },
143
+ required: {
144
+ id: requiredTier,
145
+ pricing: TIER_PRICING[requiredTier],
146
+ },
147
+ },
148
+ upgrade: {
149
+ message: createUpgradePrompt(feature, currentTier),
150
+ detailedMessage: createDetailedUpgradeMessage(feature, currentTier),
151
+ url: `${BASE_URL}/upgrade?tier=${requiredTier}&feature=${feature}&tool=${toolName}`,
152
+ pricingUrl: `${BASE_URL}/pricing?highlight=${feature}&current=${currentTier}`,
153
+ },
154
+ alternatives: getCommunityAlternatives(toolName),
155
+ };
156
+ return {
157
+ content: [
158
+ {
159
+ type: 'text',
160
+ text: JSON.stringify(response, null, 2),
161
+ },
162
+ ],
163
+ isError: false,
164
+ _meta: {
165
+ upgradeRequired: true,
166
+ feature,
167
+ requiredTier,
168
+ upgradeUrl: response.upgrade.url,
169
+ },
170
+ };
171
+ }
172
+ /**
173
+ * Get community-tier alternatives for a premium tool
174
+ */
175
+ function getCommunityAlternatives(toolName) {
176
+ // Map of premium tools to their community alternatives
177
+ const alternatives = {
178
+ publish_private: ['search', 'get_skill', 'install_skill'],
179
+ team_workspace: ['search', 'install_skill'],
180
+ share_skill: ['search', 'skill_compare'],
181
+ configure_sso: ['search'],
182
+ audit_export: ['search'],
183
+ audit_query: ['search'],
184
+ rbac_manage: ['search'],
185
+ rbac_assign_role: ['search'],
186
+ rbac_create_policy: ['search'],
187
+ analytics_dashboard: ['search', 'skill_recommend'],
188
+ usage_report: ['search'],
189
+ webhook_configure: ['search'],
190
+ api_key_manage: ['search'],
191
+ };
192
+ return alternatives[toolName] || ['search', 'get_skill', 'install_skill'];
193
+ }
194
+ // ============================================================================
195
+ // Middleware Factory
196
+ // ============================================================================
197
+ /**
198
+ * Create the degradation middleware
199
+ *
200
+ * This middleware wraps tool handlers to provide graceful degradation
201
+ * when features are unavailable due to license restrictions.
202
+ *
203
+ * @param options - Middleware configuration options
204
+ * @returns Middleware wrapper function
205
+ *
206
+ * @example
207
+ * ```typescript
208
+ * const middleware = createDegradationMiddleware({
209
+ * logger: consoleDegradationLogger,
210
+ * verbose: true,
211
+ * });
212
+ *
213
+ * const wrappedHandler = middleware.wrapHandler('audit_query', originalHandler);
214
+ * ```
215
+ */
216
+ export function createDegradationMiddleware(options = {}) {
217
+ const licenseMiddleware = options.licenseMiddleware ?? createLicenseMiddleware();
218
+ const logger = options.logger ?? noopLogger;
219
+ /**
220
+ * Wrap a tool handler with graceful degradation
221
+ */
222
+ async function wrapHandler(toolName, handler, request) {
223
+ // Check if tool requires a license
224
+ const requiredFeature = getRequiredFeature(toolName);
225
+ // Community tools always pass through
226
+ if (requiredFeature === null) {
227
+ logger.log({
228
+ timestamp: new Date().toISOString(),
229
+ toolName,
230
+ feature: null,
231
+ tier: 'community',
232
+ action: 'allowed',
233
+ message: 'Community tool - no license required',
234
+ });
235
+ return handler(request);
236
+ }
237
+ // Check license for the required feature
238
+ const validationResult = await licenseMiddleware.checkFeature(requiredFeature);
239
+ if (validationResult.valid) {
240
+ const licenseInfo = await licenseMiddleware.getLicenseInfo();
241
+ logger.log({
242
+ timestamp: new Date().toISOString(),
243
+ toolName,
244
+ feature: requiredFeature,
245
+ tier: licenseInfo?.tier ?? 'community',
246
+ action: 'allowed',
247
+ message: 'Feature available in license',
248
+ });
249
+ return handler(request);
250
+ }
251
+ // Feature not available - return graceful degradation response
252
+ const licenseInfo = await licenseMiddleware.getLicenseInfo();
253
+ const currentTier = licenseInfo?.tier ?? 'community';
254
+ logger.log({
255
+ timestamp: new Date().toISOString(),
256
+ toolName,
257
+ feature: requiredFeature,
258
+ tier: currentTier,
259
+ action: 'degraded',
260
+ message: `Feature ${requiredFeature} requires upgrade`,
261
+ });
262
+ return createGracefulDegradationResponse(toolName, requiredFeature, currentTier, validationResult);
263
+ }
264
+ /**
265
+ * Create a wrapped handler function
266
+ */
267
+ function createWrappedHandler(toolName, handler) {
268
+ return async (request) => {
269
+ return wrapHandler(toolName, handler, request);
270
+ };
271
+ }
272
+ /**
273
+ * Check if a tool would be degraded for the current license
274
+ */
275
+ async function wouldDegrade(toolName) {
276
+ const requiredFeature = getRequiredFeature(toolName);
277
+ if (requiredFeature === null) {
278
+ return false;
279
+ }
280
+ const validationResult = await licenseMiddleware.checkFeature(requiredFeature);
281
+ return !validationResult.valid;
282
+ }
283
+ /**
284
+ * Get degradation status for all tools
285
+ */
286
+ async function getDegradationStatus() {
287
+ const status = new Map();
288
+ for (const toolName of Object.keys(TOOL_FEATURES)) {
289
+ status.set(toolName, await wouldDegrade(toolName));
290
+ }
291
+ return status;
292
+ }
293
+ /**
294
+ * Get upgrade prompt for a tool
295
+ */
296
+ async function getUpgradePrompt(toolName) {
297
+ const requiredFeature = getRequiredFeature(toolName);
298
+ if (requiredFeature === null) {
299
+ return null;
300
+ }
301
+ const licenseInfo = await licenseMiddleware.getLicenseInfo();
302
+ const currentTier = licenseInfo?.tier ?? 'community';
303
+ return createUpgradePrompt(requiredFeature, currentTier);
304
+ }
305
+ return {
306
+ wrapHandler,
307
+ createWrappedHandler,
308
+ wouldDegrade,
309
+ getDegradationStatus,
310
+ getUpgradePrompt,
311
+ getTierComparisonMessage,
312
+ licenseMiddleware,
313
+ };
314
+ }
315
+ //# sourceMappingURL=degradation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"degradation.js","sourceRoot":"","sources":["../../../src/middleware/degradation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * SMI-1061: MCP Error Formatter for License Errors
3
+ *
4
+ * Formats license errors into MCP protocol-compliant error responses
5
+ * with actionable information for clients.
6
+ */
7
+ /**
8
+ * MCP-formatted error response content
9
+ */
10
+ export interface MCPErrorContent {
11
+ type: 'text';
12
+ text: string;
13
+ }
14
+ /**
15
+ * MCP-formatted error response
16
+ */
17
+ export interface MCPErrorResponse {
18
+ content: MCPErrorContent[];
19
+ isError: true;
20
+ _meta?: {
21
+ upgradeUrl?: string;
22
+ errorCode?: string;
23
+ recoverable?: boolean;
24
+ };
25
+ }
26
+ /**
27
+ * License error details structure (mirrors the enterprise package)
28
+ */
29
+ export interface LicenseErrorDetails {
30
+ code: string;
31
+ message: string;
32
+ feature?: string;
33
+ currentTier?: string;
34
+ requiredTier?: string;
35
+ upgradeUrl?: string;
36
+ context?: Record<string, unknown>;
37
+ timestamp?: string;
38
+ }
39
+ /**
40
+ * Interface for license errors (duck-typed for optional enterprise package)
41
+ */
42
+ export interface LicenseErrorLike {
43
+ code?: string;
44
+ message: string;
45
+ feature?: string;
46
+ currentTier?: string;
47
+ requiredTier?: string;
48
+ upgradeUrl?: string;
49
+ context?: Record<string, unknown>;
50
+ timestamp?: Date;
51
+ toJSON?: () => Record<string, unknown>;
52
+ }
53
+ /**
54
+ * Format a license error into an MCP-compliant error response
55
+ *
56
+ * @param error - The license error to format
57
+ * @returns MCP-formatted error response
58
+ *
59
+ * @example
60
+ * ```typescript
61
+ * import { formatLicenseError } from './middleware/errorFormatter.js';
62
+ *
63
+ * try {
64
+ * await checkFeature('audit_logging');
65
+ * } catch (error) {
66
+ * if (isLicenseError(error)) {
67
+ * return formatLicenseError(error);
68
+ * }
69
+ * throw error;
70
+ * }
71
+ * ```
72
+ */
73
+ export declare function formatLicenseError(error: LicenseErrorLike): MCPErrorResponse;
74
+ /**
75
+ * Format a generic error for MCP response
76
+ *
77
+ * Use this for non-license errors that still need MCP formatting.
78
+ */
79
+ export declare function formatGenericError(error: Error, code?: string): MCPErrorResponse;
80
+ /**
81
+ * Get a user-friendly message for an error code
82
+ */
83
+ export declare function getUserFriendlyMessage(code: string): string;
84
+ /**
85
+ * Configuration for upgrade URLs
86
+ */
87
+ export interface UpgradeUrlConfig {
88
+ baseUrl?: string;
89
+ includeFeature?: boolean;
90
+ includeTiers?: boolean;
91
+ includeSource?: boolean;
92
+ }
93
+ /**
94
+ * Generate a customized upgrade URL with tracking parameters
95
+ */
96
+ export declare function generateUpgradeUrl(error: LicenseErrorLike, config?: Partial<UpgradeUrlConfig>): string;
97
+ /**
98
+ * Build an upgrade required response
99
+ *
100
+ * Use this when a feature requires an upgrade but isn't a full error.
101
+ */
102
+ export declare function buildUpgradeRequiredResponse(feature: string, currentTier: string, requiredTier: string): MCPErrorResponse;
103
+ /**
104
+ * Build a license expired response with renewal URL
105
+ */
106
+ export declare function buildLicenseExpiredResponse(expiredAt?: Date): MCPErrorResponse;
107
+ /**
108
+ * Build a quota exceeded response
109
+ */
110
+ export declare function buildQuotaExceededResponse(quotaType: string, current: number, max: number): MCPErrorResponse;
111
+ /**
112
+ * Check if an object looks like a license error
113
+ */
114
+ export declare function isLicenseErrorLike(error: unknown): error is LicenseErrorLike;
115
+ /**
116
+ * Safely convert any error to MCP format
117
+ */
118
+ export declare function safeFormatError(error: unknown): MCPErrorResponse;
119
+ //# sourceMappingURL=errorFormatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorFormatter.d.ts","sourceRoot":"","sources":["../../../src/middleware/errorFormatter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,eAAe,EAAE,CAAA;IAC1B,OAAO,EAAE,IAAI,CAAA;IACb,KAAK,CAAC,EAAE;QACN,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,WAAW,CAAC,EAAE,OAAO,CAAA;KACtB,CAAA;CACF;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACvC;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,CAsD5E;AAYD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,SAAmB,GAAG,gBAAgB,CAmB1F;AAsBD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3D;AAMD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AASD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,gBAAgB,EACvB,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACrC,MAAM,CA0BR;AAMD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,gBAAgB,CAgClB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,CAAC,EAAE,IAAI,GAAG,gBAAgB,CA8B9E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GACV,gBAAgB,CAgClB;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAiB5E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAUhE"}