@claudetools/cli 0.13.13 → 0.13.15

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 (368) hide show
  1. package/dist/__tests__/factories.d.ts +173 -0
  2. package/dist/__tests__/factories.d.ts.map +1 -0
  3. package/dist/__tests__/factories.js +150 -0
  4. package/dist/__tests__/factories.js.map +1 -0
  5. package/dist/__tests__/helpers.d.ts +36 -0
  6. package/dist/__tests__/helpers.d.ts.map +1 -0
  7. package/dist/__tests__/helpers.js +52 -0
  8. package/dist/__tests__/helpers.js.map +1 -0
  9. package/dist/analytics/index.d.ts +14 -0
  10. package/dist/analytics/index.d.ts.map +1 -0
  11. package/dist/analytics/index.js +259 -0
  12. package/dist/analytics/index.js.map +1 -0
  13. package/dist/analytics/session.d.ts +17 -0
  14. package/dist/analytics/session.d.ts.map +1 -0
  15. package/dist/analytics/session.js +130 -0
  16. package/dist/analytics/session.js.map +1 -0
  17. package/dist/analytics/token-tracker.d.ts +48 -0
  18. package/dist/analytics/token-tracker.d.ts.map +1 -0
  19. package/dist/analytics/token-tracker.js +269 -0
  20. package/dist/analytics/token-tracker.js.map +1 -0
  21. package/dist/analytics/tracker.d.ts +33 -0
  22. package/dist/analytics/tracker.d.ts.map +1 -0
  23. package/dist/analytics/tracker.js +210 -0
  24. package/dist/analytics/tracker.js.map +1 -0
  25. package/dist/api-keys/index.d.ts +15 -0
  26. package/dist/api-keys/index.d.ts.map +1 -0
  27. package/dist/api-keys/index.js +228 -0
  28. package/dist/api-keys/index.js.map +1 -0
  29. package/dist/auth/config.d.ts +15 -0
  30. package/dist/auth/config.d.ts.map +1 -0
  31. package/dist/auth/config.js +67 -0
  32. package/dist/auth/config.js.map +1 -0
  33. package/dist/auth/index.d.ts +8 -0
  34. package/dist/auth/index.d.ts.map +1 -0
  35. package/dist/auth/index.js +299 -0
  36. package/dist/auth/index.js.map +1 -0
  37. package/dist/auth/keychain.d.ts +21 -0
  38. package/dist/auth/keychain.d.ts.map +1 -0
  39. package/dist/auth/keychain.js +256 -0
  40. package/dist/auth/keychain.js.map +1 -0
  41. package/dist/billing/index.d.ts +7 -0
  42. package/dist/billing/index.d.ts.map +1 -0
  43. package/dist/billing/index.js +233 -0
  44. package/dist/billing/index.js.map +1 -0
  45. package/dist/cli.js +291 -43
  46. package/dist/cli.js.map +1 -1
  47. package/dist/commands/hook.d.ts +12 -0
  48. package/dist/commands/hook.d.ts.map +1 -0
  49. package/dist/commands/hook.js +190 -0
  50. package/dist/commands/hook.js.map +1 -0
  51. package/dist/commands/keys.d.ts +4 -0
  52. package/dist/commands/keys.d.ts.map +1 -0
  53. package/dist/commands/keys.js +43 -0
  54. package/dist/commands/keys.js.map +1 -0
  55. package/dist/commands/mcp.d.ts +4 -0
  56. package/dist/commands/mcp.d.ts.map +1 -0
  57. package/dist/commands/mcp.js +43 -0
  58. package/dist/commands/mcp.js.map +1 -0
  59. package/dist/commands/project.d.ts +4 -0
  60. package/dist/commands/project.d.ts.map +1 -0
  61. package/dist/commands/project.js +68 -0
  62. package/dist/commands/project.js.map +1 -0
  63. package/dist/commands/skill.d.ts +4 -0
  64. package/dist/commands/skill.d.ts.map +1 -0
  65. package/dist/commands/skill.js +37 -0
  66. package/dist/commands/skill.js.map +1 -0
  67. package/dist/commands/stacks.d.ts +4 -0
  68. package/dist/commands/stacks.d.ts.map +1 -0
  69. package/dist/commands/stacks.js +103 -0
  70. package/dist/commands/stacks.js.map +1 -0
  71. package/dist/commands/stats.d.ts +4 -0
  72. package/dist/commands/stats.d.ts.map +1 -0
  73. package/dist/commands/stats.js +6 -0
  74. package/dist/commands/stats.js.map +1 -0
  75. package/dist/commands/sync.d.ts +4 -0
  76. package/dist/commands/sync.d.ts.map +1 -0
  77. package/dist/commands/sync.js +60 -0
  78. package/dist/commands/sync.js.map +1 -0
  79. package/dist/commands/update.d.ts +4 -0
  80. package/dist/commands/update.d.ts.map +1 -0
  81. package/dist/commands/update.js +63 -0
  82. package/dist/commands/update.js.map +1 -0
  83. package/dist/daemon/client.d.ts +107 -0
  84. package/dist/daemon/client.d.ts.map +1 -0
  85. package/dist/daemon/client.js +250 -0
  86. package/dist/daemon/client.js.map +1 -0
  87. package/dist/daemon/health.d.ts +38 -0
  88. package/dist/daemon/health.d.ts.map +1 -0
  89. package/dist/daemon/health.js +212 -0
  90. package/dist/daemon/health.js.map +1 -0
  91. package/dist/daemon/index.d.ts +34 -0
  92. package/dist/daemon/index.d.ts.map +1 -0
  93. package/dist/daemon/index.js +197 -0
  94. package/dist/daemon/index.js.map +1 -0
  95. package/dist/daemon/protocol.d.ts +144 -0
  96. package/dist/daemon/protocol.d.ts.map +1 -0
  97. package/dist/daemon/protocol.js +5 -0
  98. package/dist/daemon/protocol.js.map +1 -0
  99. package/dist/gamification/index.d.ts +13 -0
  100. package/dist/gamification/index.d.ts.map +1 -0
  101. package/dist/gamification/index.js +120 -0
  102. package/dist/gamification/index.js.map +1 -0
  103. package/dist/gamification/types.d.ts +34 -0
  104. package/dist/gamification/types.d.ts.map +1 -0
  105. package/dist/gamification/types.js +5 -0
  106. package/dist/gamification/types.js.map +1 -0
  107. package/dist/hooks/index.d.ts +65 -0
  108. package/dist/hooks/index.d.ts.map +1 -0
  109. package/dist/hooks/index.js +403 -0
  110. package/dist/hooks/index.js.map +1 -0
  111. package/dist/lib/api.d.ts +29 -0
  112. package/dist/lib/api.d.ts.map +1 -0
  113. package/dist/lib/api.js +213 -0
  114. package/dist/lib/api.js.map +1 -0
  115. package/dist/lib/browser.d.ts +6 -0
  116. package/dist/lib/browser.d.ts.map +1 -0
  117. package/dist/lib/browser.js +14 -0
  118. package/dist/lib/browser.js.map +1 -0
  119. package/dist/lib/channel-config.d.ts +10 -0
  120. package/dist/lib/channel-config.d.ts.map +1 -0
  121. package/dist/lib/channel-config.js +48 -0
  122. package/dist/lib/channel-config.js.map +1 -0
  123. package/dist/lib/command-runner.d.ts +16 -0
  124. package/dist/lib/command-runner.d.ts.map +1 -0
  125. package/dist/lib/command-runner.js +59 -0
  126. package/dist/lib/command-runner.js.map +1 -0
  127. package/dist/lib/command-utils.d.ts +22 -0
  128. package/dist/lib/command-utils.d.ts.map +1 -0
  129. package/dist/lib/command-utils.js +88 -0
  130. package/dist/lib/command-utils.js.map +1 -0
  131. package/dist/lib/error-handler.d.ts +13 -0
  132. package/dist/lib/error-handler.d.ts.map +1 -0
  133. package/dist/lib/error-handler.js +70 -0
  134. package/dist/lib/error-handler.js.map +1 -0
  135. package/dist/lib/errors.d.ts +35 -0
  136. package/dist/lib/errors.d.ts.map +1 -0
  137. package/dist/lib/errors.js +70 -0
  138. package/dist/lib/errors.js.map +1 -0
  139. package/dist/lib/exit.d.ts +10 -0
  140. package/dist/lib/exit.d.ts.map +1 -0
  141. package/dist/lib/exit.js +21 -0
  142. package/dist/lib/exit.js.map +1 -0
  143. package/dist/lib/formatters.d.ts +65 -0
  144. package/dist/lib/formatters.d.ts.map +1 -0
  145. package/dist/lib/formatters.js +180 -0
  146. package/dist/lib/formatters.js.map +1 -0
  147. package/dist/lib/hybrid-data.d.ts +47 -0
  148. package/dist/lib/hybrid-data.d.ts.map +1 -0
  149. package/dist/lib/hybrid-data.js +326 -0
  150. package/dist/lib/hybrid-data.js.map +1 -0
  151. package/dist/lib/local-store.d.ts +113 -0
  152. package/dist/lib/local-store.d.ts.map +1 -0
  153. package/dist/lib/local-store.js +220 -0
  154. package/dist/lib/local-store.js.map +1 -0
  155. package/dist/lib/machine-id.d.ts +8 -0
  156. package/dist/lib/machine-id.d.ts.map +1 -0
  157. package/dist/lib/machine-id.js +39 -0
  158. package/dist/lib/machine-id.js.map +1 -0
  159. package/dist/lib/network.d.ts +15 -0
  160. package/dist/lib/network.d.ts.map +1 -0
  161. package/dist/lib/network.js +46 -0
  162. package/dist/lib/network.js.map +1 -0
  163. package/dist/lib/theme.d.ts +77 -0
  164. package/dist/lib/theme.d.ts.map +1 -0
  165. package/dist/lib/theme.js +137 -0
  166. package/dist/lib/theme.js.map +1 -0
  167. package/dist/lib/tool-availability.d.ts +13 -0
  168. package/dist/lib/tool-availability.d.ts.map +1 -0
  169. package/dist/lib/tool-availability.js +48 -0
  170. package/dist/lib/tool-availability.js.map +1 -0
  171. package/dist/lib/update-checker.d.ts +21 -0
  172. package/dist/lib/update-checker.d.ts.map +1 -0
  173. package/dist/lib/update-checker.js +110 -0
  174. package/dist/lib/update-checker.js.map +1 -0
  175. package/dist/lib/validation.d.ts +30 -0
  176. package/dist/lib/validation.d.ts.map +1 -0
  177. package/dist/lib/validation.js +82 -0
  178. package/dist/lib/validation.js.map +1 -0
  179. package/dist/lib/validators.d.ts +18 -0
  180. package/dist/lib/validators.d.ts.map +1 -0
  181. package/dist/lib/validators.js +30 -0
  182. package/dist/lib/validators.js.map +1 -0
  183. package/dist/marketplace/api.d.ts +24 -0
  184. package/dist/marketplace/api.d.ts.map +1 -0
  185. package/dist/marketplace/api.js +92 -0
  186. package/dist/marketplace/api.js.map +1 -0
  187. package/dist/marketplace/index.d.ts +13 -0
  188. package/dist/marketplace/index.d.ts.map +1 -0
  189. package/dist/marketplace/index.js +155 -0
  190. package/dist/marketplace/index.js.map +1 -0
  191. package/dist/marketplace/installer.d.ts +18 -0
  192. package/dist/marketplace/installer.d.ts.map +1 -0
  193. package/dist/marketplace/installer.js +184 -0
  194. package/dist/marketplace/installer.js.map +1 -0
  195. package/dist/mcp/api.d.ts +93 -0
  196. package/dist/mcp/api.d.ts.map +1 -0
  197. package/dist/mcp/api.js +106 -0
  198. package/dist/mcp/api.js.map +1 -0
  199. package/dist/mcp/config.d.ts +72 -0
  200. package/dist/mcp/config.d.ts.map +1 -0
  201. package/dist/mcp/config.js +156 -0
  202. package/dist/mcp/config.js.map +1 -0
  203. package/dist/mcp/index.d.ts +54 -0
  204. package/dist/mcp/index.d.ts.map +1 -0
  205. package/dist/mcp/index.js +381 -0
  206. package/dist/mcp/index.js.map +1 -0
  207. package/dist/mcp/prompt.clean.d.ts +25 -0
  208. package/dist/mcp/prompt.clean.d.ts.map +1 -0
  209. package/dist/mcp/prompt.clean.js +206 -0
  210. package/dist/mcp/prompt.clean.js.map +1 -0
  211. package/dist/mcp/prompt.d.ts +52 -0
  212. package/dist/mcp/prompt.d.ts.map +1 -0
  213. package/dist/mcp/prompt.js +210 -0
  214. package/dist/mcp/prompt.js.map +1 -0
  215. package/dist/mcp/secrets.clean.d.ts +18 -0
  216. package/dist/mcp/secrets.clean.d.ts.map +1 -0
  217. package/dist/mcp/secrets.clean.js +357 -0
  218. package/dist/mcp/secrets.clean.js.map +1 -0
  219. package/dist/mcp/secrets.d.ts +46 -0
  220. package/dist/mcp/secrets.d.ts.map +1 -0
  221. package/dist/mcp/secrets.js +339 -0
  222. package/dist/mcp/secrets.js.map +1 -0
  223. package/dist/memory/index.d.ts +14 -0
  224. package/dist/memory/index.d.ts.map +1 -0
  225. package/dist/memory/index.js +98 -0
  226. package/dist/memory/index.js.map +1 -0
  227. package/dist/onboard/agents-md-builder.d.ts.map +1 -1
  228. package/dist/onboard/agents-md-builder.js +45 -0
  229. package/dist/onboard/agents-md-builder.js.map +1 -1
  230. package/dist/onboard/claude-inference.d.ts.map +1 -1
  231. package/dist/onboard/claude-inference.js +15 -4
  232. package/dist/onboard/claude-inference.js.map +1 -1
  233. package/dist/onboard/context7-fetcher.d.ts +1 -1
  234. package/dist/onboard/context7-fetcher.d.ts.map +1 -1
  235. package/dist/onboard/context7-fetcher.js +50 -16
  236. package/dist/onboard/context7-fetcher.js.map +1 -1
  237. package/dist/onboard/docs-builder.d.ts.map +1 -1
  238. package/dist/onboard/docs-builder.js +523 -50
  239. package/dist/onboard/docs-builder.js.map +1 -1
  240. package/dist/onboard/index.d.ts.map +1 -1
  241. package/dist/onboard/index.js +74 -25
  242. package/dist/onboard/index.js.map +1 -1
  243. package/dist/onboard/stack-detector.d.ts.map +1 -1
  244. package/dist/onboard/stack-detector.js +5 -55
  245. package/dist/onboard/stack-detector.js.map +1 -1
  246. package/dist/project/constants.d.ts +21 -0
  247. package/dist/project/constants.d.ts.map +1 -0
  248. package/dist/project/constants.js +21 -0
  249. package/dist/project/constants.js.map +1 -0
  250. package/dist/project/format.d.ts +16 -0
  251. package/dist/project/format.d.ts.map +1 -0
  252. package/dist/project/format.js +40 -0
  253. package/dist/project/format.js.map +1 -0
  254. package/dist/project/git.d.ts +28 -0
  255. package/dist/project/git.d.ts.map +1 -0
  256. package/dist/project/git.js +93 -0
  257. package/dist/project/git.js.map +1 -0
  258. package/dist/project/index.d.ts +36 -0
  259. package/dist/project/index.d.ts.map +1 -0
  260. package/dist/project/index.js +272 -0
  261. package/dist/project/index.js.map +1 -0
  262. package/dist/project/mapper.d.ts +27 -0
  263. package/dist/project/mapper.d.ts.map +1 -0
  264. package/dist/project/mapper.js +64 -0
  265. package/dist/project/mapper.js.map +1 -0
  266. package/dist/project/storage.d.ts +71 -0
  267. package/dist/project/storage.d.ts.map +1 -0
  268. package/dist/project/storage.js +274 -0
  269. package/dist/project/storage.js.map +1 -0
  270. package/dist/project/sync-bridge.d.ts +33 -0
  271. package/dist/project/sync-bridge.d.ts.map +1 -0
  272. package/dist/project/sync-bridge.js +155 -0
  273. package/dist/project/sync-bridge.js.map +1 -0
  274. package/dist/project/types.d.ts +107 -0
  275. package/dist/project/types.d.ts.map +1 -0
  276. package/dist/project/types.js +77 -0
  277. package/dist/project/types.js.map +1 -0
  278. package/dist/publish/index.d.ts +4 -0
  279. package/dist/publish/index.d.ts.map +1 -0
  280. package/dist/publish/index.js +92 -0
  281. package/dist/publish/index.js.map +1 -0
  282. package/dist/setup.d.ts.map +1 -1
  283. package/dist/setup.js +29 -10
  284. package/dist/setup.js.map +1 -1
  285. package/dist/skills/index.d.ts +51 -0
  286. package/dist/skills/index.d.ts.map +1 -0
  287. package/dist/skills/index.js +509 -0
  288. package/dist/skills/index.js.map +1 -0
  289. package/dist/stacks/check.d.ts +2 -0
  290. package/dist/stacks/check.d.ts.map +1 -0
  291. package/dist/stacks/check.js +144 -0
  292. package/dist/stacks/check.js.map +1 -0
  293. package/dist/stacks/diff.d.ts +11 -0
  294. package/dist/stacks/diff.d.ts.map +1 -0
  295. package/dist/stacks/diff.js +123 -0
  296. package/dist/stacks/diff.js.map +1 -0
  297. package/dist/stacks/index.d.ts +17 -0
  298. package/dist/stacks/index.d.ts.map +1 -0
  299. package/dist/stacks/index.js +525 -0
  300. package/dist/stacks/index.js.map +1 -0
  301. package/dist/stacks/index.refactored.d.ts.map +1 -0
  302. package/dist/stacks/index.refactored.js.map +1 -0
  303. package/dist/stacks/io.d.ts +11 -0
  304. package/dist/stacks/io.d.ts.map +1 -0
  305. package/dist/stacks/io.js +179 -0
  306. package/dist/stacks/io.js.map +1 -0
  307. package/dist/stacks/rollback.d.ts +5 -0
  308. package/dist/stacks/rollback.d.ts.map +1 -0
  309. package/dist/stacks/rollback.js +162 -0
  310. package/dist/stacks/rollback.js.map +1 -0
  311. package/dist/stacks/types.d.ts +70 -0
  312. package/dist/stacks/types.d.ts.map +1 -0
  313. package/dist/stacks/types.js +6 -0
  314. package/dist/stacks/types.js.map +1 -0
  315. package/dist/stacks/utils.d.ts +9 -0
  316. package/dist/stacks/utils.d.ts.map +1 -0
  317. package/dist/stacks/utils.js +11 -0
  318. package/dist/stacks/utils.js.map +1 -0
  319. package/dist/start/index.d.ts +23 -0
  320. package/dist/start/index.d.ts.map +1 -0
  321. package/dist/start/index.js +386 -0
  322. package/dist/start/index.js.map +1 -0
  323. package/dist/sync/index.d.ts +49 -0
  324. package/dist/sync/index.d.ts.map +1 -0
  325. package/dist/sync/index.js +207 -0
  326. package/dist/sync/index.js.map +1 -0
  327. package/dist/sync-engine/__tests__/test-helpers.d.ts +14 -0
  328. package/dist/sync-engine/__tests__/test-helpers.d.ts.map +1 -0
  329. package/dist/sync-engine/__tests__/test-helpers.js +73 -0
  330. package/dist/sync-engine/__tests__/test-helpers.js.map +1 -0
  331. package/dist/sync-engine/client.d.ts +128 -0
  332. package/dist/sync-engine/client.d.ts.map +1 -0
  333. package/dist/sync-engine/client.js +289 -0
  334. package/dist/sync-engine/client.js.map +1 -0
  335. package/dist/sync-engine/health.d.ts +38 -0
  336. package/dist/sync-engine/health.d.ts.map +1 -0
  337. package/dist/sync-engine/health.js +259 -0
  338. package/dist/sync-engine/health.js.map +1 -0
  339. package/dist/sync-engine/index.d.ts +34 -0
  340. package/dist/sync-engine/index.d.ts.map +1 -0
  341. package/dist/sync-engine/index.js +197 -0
  342. package/dist/sync-engine/index.js.map +1 -0
  343. package/dist/sync-engine/protocol.d.ts +153 -0
  344. package/dist/sync-engine/protocol.d.ts.map +1 -0
  345. package/dist/sync-engine/protocol.js +5 -0
  346. package/dist/sync-engine/protocol.js.map +1 -0
  347. package/dist/tasks/index.d.ts +14 -0
  348. package/dist/tasks/index.d.ts.map +1 -0
  349. package/dist/tasks/index.js +109 -0
  350. package/dist/tasks/index.js.map +1 -0
  351. package/dist/team/index.d.ts +12 -0
  352. package/dist/team/index.d.ts.map +1 -0
  353. package/dist/team/index.js +151 -0
  354. package/dist/team/index.js.map +1 -0
  355. package/dist/updater.d.ts +5 -5
  356. package/dist/updater.d.ts.map +1 -1
  357. package/dist/updater.js +24 -88
  358. package/dist/updater.js.map +1 -1
  359. package/dist/usage/index.d.ts +10 -0
  360. package/dist/usage/index.d.ts.map +1 -0
  361. package/dist/usage/index.js +104 -0
  362. package/dist/usage/index.js.map +1 -0
  363. package/dist/webhooks/index.d.ts +7 -0
  364. package/dist/webhooks/index.d.ts.map +1 -0
  365. package/dist/webhooks/index.js +81 -0
  366. package/dist/webhooks/index.js.map +1 -0
  367. package/package.json +26 -15
  368. package/scripts/postinstall.js +282 -0
@@ -0,0 +1,92 @@
1
+ import { getApiClient } from '../lib/api.js';
2
+ /**
3
+ * Safely extract an Extension from a raw API response object.
4
+ * Uses optional chaining and defaults instead of unsafe `as` casts.
5
+ */
6
+ function parseExtension(ext, type) {
7
+ const id = typeof ext.id === 'string' ? ext.id : '';
8
+ const slug = typeof ext.slug === 'string' ? ext.slug : '';
9
+ const name = typeof ext.name === 'string' ? ext.name : slug;
10
+ const description = typeof ext.description === 'string' ? ext.description : '';
11
+ const downloadCount = typeof ext.downloadCount === 'number' ? ext.downloadCount : 0;
12
+ const createdAt = typeof ext.createdAt === 'string' ? ext.createdAt : new Date().toISOString();
13
+ const updatedAt = typeof ext.updatedAt === 'string' ? ext.updatedAt : createdAt;
14
+ const bodyContent = typeof ext.bodyContent === 'string' ? ext.bodyContent : undefined;
15
+ const npmPackage = typeof ext.npmPackage === 'string' ? ext.npmPackage : undefined;
16
+ // Parse author/submitter safely
17
+ const rawSubmitter = ext.submitter;
18
+ const author = rawSubmitter
19
+ && typeof rawSubmitter.id === 'string'
20
+ && typeof rawSubmitter.name === 'string'
21
+ ? { id: rawSubmitter.id, name: rawSubmitter.name }
22
+ : { id: '', name: 'Unknown' };
23
+ return {
24
+ id,
25
+ slug,
26
+ name,
27
+ type,
28
+ description,
29
+ author,
30
+ downloads: downloadCount,
31
+ createdAt,
32
+ updatedAt,
33
+ content: bodyContent,
34
+ config: type === 'mcp-server' && npmPackage
35
+ ? { command: 'npx', args: ['-y', npmPackage] }
36
+ : undefined,
37
+ };
38
+ }
39
+ export async function searchExtensions(query, type, limit = 20) {
40
+ const client = getApiClient({ authenticated: false });
41
+ const params = new URLSearchParams();
42
+ if (query)
43
+ params.set('q', query);
44
+ if (type)
45
+ params.set('type', type);
46
+ params.set('limit', String(limit));
47
+ const response = await client.get(`/extensions?${params}`);
48
+ if (!response.success || !response.data) {
49
+ throw new Error('Failed to search extensions');
50
+ }
51
+ return response.data;
52
+ }
53
+ export async function getExtension(typeOrSlug, slug) {
54
+ const client = getApiClient({ authenticated: false });
55
+ // If called with (type, slug) — use specific endpoint
56
+ if (slug) {
57
+ const type = typeOrSlug;
58
+ const response = await client.get(`/extensions/${type}/${slug}`);
59
+ if (!response.success || !response.data) {
60
+ throw new Error(`Extension not found: ${type}/${slug}`);
61
+ }
62
+ return parseExtension(response.data.extension, type);
63
+ }
64
+ // If called with (slug) only — search across all types
65
+ const slugOnly = typeOrSlug;
66
+ const types = ['skill', 'agent', 'hook', 'mcp-server'];
67
+ // Try all 4 types in parallel for better performance
68
+ const lookupResults = await Promise.allSettled(types.map(async (type) => {
69
+ const response = await client.get(`/extensions/${type}/${slugOnly}`);
70
+ if (response.success && response.data) {
71
+ return parseExtension(response.data.extension, type);
72
+ }
73
+ throw new Error(`Not found as ${type}`);
74
+ }));
75
+ // Return the first successful result
76
+ for (const lookupResult of lookupResults) {
77
+ if (lookupResult.status === 'fulfilled') {
78
+ return lookupResult.value;
79
+ }
80
+ }
81
+ throw new Error(`Extension not found: ${slugOnly}`);
82
+ }
83
+ export async function trackDownload(slug) {
84
+ try {
85
+ const client = getApiClient({ authenticated: true });
86
+ await client.post(`/extensions/${slug}/download`, {});
87
+ }
88
+ catch {
89
+ // Silently fail - tracking is non-critical
90
+ }
91
+ }
92
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/marketplace/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ interface SearchOptions {
2
+ type?: string;
3
+ json?: boolean;
4
+ }
5
+ export declare function runSearch(query?: string, options?: SearchOptions): Promise<void>;
6
+ export declare function runInstall(slug: string): Promise<void>;
7
+ export declare function runUninstall(slug: string, type?: string): Promise<void>;
8
+ interface ListOptions {
9
+ json?: boolean;
10
+ }
11
+ export declare function runList(options?: ListOptions): Promise<void>;
12
+ export {};
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/marketplace/index.ts"],"names":[],"mappings":"AAWA,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC1F;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC5D;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+C7E;AAED,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,OAAO,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCtE"}
@@ -0,0 +1,155 @@
1
+ import { requireAuth } from '../auth/config.js';
2
+ import { searchExtensions, getExtension, trackDownload } from './api.js';
3
+ import { installExtension, uninstallExtension, listInstalledExtensions, } from './installer.js';
4
+ import { theme, formatSuccess, formatStep } from '../lib/theme.js';
5
+ import { emptyState } from '../lib/formatters.js';
6
+ import { showXpGain } from '../gamification/index.js';
7
+ export async function runSearch(query, options = {}) {
8
+ try {
9
+ const result = await searchExtensions(query, options.type, 20);
10
+ if (options.json) {
11
+ console.log(JSON.stringify(result, null, 2));
12
+ return;
13
+ }
14
+ if (result.extensions.length === 0) {
15
+ emptyState('No extensions found.', 'Try a different search query.');
16
+ return;
17
+ }
18
+ console.log();
19
+ console.log(` ${theme.bold(`Found ${result.total} extension${result.total === 1 ? '' : 's'}`)}`);
20
+ console.log();
21
+ for (const ext of result.extensions) {
22
+ console.log(` ${theme.symbols.arrow} ${theme.highlight(ext.slug)} ${theme.muted(`(${ext.type})`)}`);
23
+ console.log(` ${theme.muted(ext.description)}`);
24
+ console.log(` ${theme.muted(`Author: ${ext.author.name} | Downloads: ${ext.downloads}`)}`);
25
+ console.log();
26
+ }
27
+ console.log(` ${theme.muted(`Install with: ${theme.command('claudetools install <slug>')}`)}`);
28
+ console.log();
29
+ }
30
+ catch (error) {
31
+ if (error instanceof Error) {
32
+ throw new Error(`Search failed: ${error.message}`);
33
+ }
34
+ throw error;
35
+ }
36
+ }
37
+ export async function runInstall(slug) {
38
+ await requireAuth();
39
+ try {
40
+ console.log(` ${formatStep(`Fetching extension: ${slug}...`)}`);
41
+ const extension = await getExtension(slug);
42
+ console.log(` ${formatStep(`Installing ${extension.type}: ${extension.name}...`)}`);
43
+ await installExtension(extension);
44
+ // Track download (silently fails if it doesn't work)
45
+ await trackDownload(slug);
46
+ console.log();
47
+ console.log(` ${formatSuccess(`Installed ${extension.name} successfully!`)}`);
48
+ // Show usage hints based on type
49
+ switch (extension.type) {
50
+ case 'skill':
51
+ console.log(` ${theme.muted(`Use with: @${slug} or reference in your agent configs`)}`);
52
+ break;
53
+ case 'agent':
54
+ console.log(` ${theme.muted(`Use with: @${slug} in Claude Code`)}`);
55
+ break;
56
+ case 'hook':
57
+ console.log(` ${theme.muted(`Hook installed to: ~/.claude/hooks/${slug}.sh`)}`);
58
+ break;
59
+ case 'mcp-server':
60
+ console.log(` ${theme.muted('MCP server added to: ~/.claude/mcp.json')}`);
61
+ console.log(` ${theme.muted('Restart Claude Code to activate.')}`);
62
+ break;
63
+ }
64
+ void showXpGain('extension_install');
65
+ console.log();
66
+ }
67
+ catch (error) {
68
+ if (error instanceof Error) {
69
+ throw new Error(`Install failed: ${error.message}`);
70
+ }
71
+ throw error;
72
+ }
73
+ }
74
+ export async function runUninstall(slug, type) {
75
+ try {
76
+ let resolvedType = type;
77
+ // If type not provided, detect from installed extensions
78
+ if (!resolvedType) {
79
+ const installed = listInstalledExtensions();
80
+ const matchingExtensions = installed.filter((ext) => ext.slug === slug);
81
+ if (matchingExtensions.length === 0) {
82
+ console.log();
83
+ console.log(` ${theme.error(`Extension not found: ${slug}`)}`);
84
+ console.log();
85
+ console.log(` ${theme.muted('No installed extension matches that slug.')}`);
86
+ console.log(` ${theme.muted(`List installed extensions: ${theme.command('claudetools list')}`)}`);
87
+ console.log();
88
+ process.exit(1);
89
+ }
90
+ if (matchingExtensions.length === 1 && matchingExtensions[0]) {
91
+ resolvedType = matchingExtensions[0].type;
92
+ }
93
+ else {
94
+ // Multiple types found - list them for the user
95
+ const availableTypes = matchingExtensions.map((ext) => ext.type);
96
+ console.log();
97
+ console.log(` ${theme.warning(`"${slug}" is installed as multiple types: ${availableTypes.join(', ')}`)}`);
98
+ console.log();
99
+ console.log(` ${theme.muted('Please specify the type:')}`);
100
+ for (const availableType of availableTypes) {
101
+ console.log(` ${theme.command(`claudetools uninstall ${slug} ${availableType}`)}`);
102
+ }
103
+ console.log();
104
+ process.exit(1);
105
+ }
106
+ }
107
+ console.log(` ${formatStep(`Uninstalling ${resolvedType}: ${slug}...`)}`);
108
+ await uninstallExtension(slug, resolvedType);
109
+ console.log();
110
+ console.log(` ${formatSuccess(`Uninstalled ${slug} successfully!`)}`);
111
+ console.log();
112
+ }
113
+ catch (error) {
114
+ if (error instanceof Error) {
115
+ throw new Error(`Uninstall failed: ${error.message}`);
116
+ }
117
+ throw error;
118
+ }
119
+ }
120
+ export async function runList(options = {}) {
121
+ try {
122
+ const installed = listInstalledExtensions();
123
+ if (options.json) {
124
+ console.log(JSON.stringify(installed, null, 2));
125
+ return;
126
+ }
127
+ if (installed.length === 0) {
128
+ console.log('\nNo extensions installed.\n');
129
+ console.log('Search for extensions: claudetools search <query>');
130
+ console.log('Install extensions: claudetools install <slug>\n');
131
+ return;
132
+ }
133
+ console.log(`\nInstalled extensions (${installed.length}):\n`);
134
+ const byType = {};
135
+ for (const ext of installed) {
136
+ const typeList = byType[ext.type] ?? (byType[ext.type] = []);
137
+ typeList.push(ext);
138
+ }
139
+ for (const [type, exts] of Object.entries(byType)) {
140
+ console.log(`${type}s:`);
141
+ for (const ext of exts) {
142
+ console.log(` - ${ext.slug}`);
143
+ }
144
+ console.log();
145
+ }
146
+ console.log('Uninstall with: claudetools uninstall <slug> <type>\n');
147
+ }
148
+ catch (error) {
149
+ if (error instanceof Error) {
150
+ throw new Error(`List failed: ${error.message}`);
151
+ }
152
+ throw error;
153
+ }
154
+ }
155
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/marketplace/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { Extension } from './api.js';
2
+ /**
3
+ * Validates an extension slug to prevent path traversal and injection attacks.
4
+ * Mirrors the Rust validation in packages/claudetools-sync/src/install/mod.rs.
5
+ *
6
+ * Allowed characters: [a-zA-Z0-9_-]
7
+ * Must be non-empty and at most MAX_SLUG_LENGTH characters.
8
+ */
9
+ export declare function validateSlug(slug: string): void;
10
+ export interface InstalledExtension {
11
+ slug: string;
12
+ type: string;
13
+ path: string;
14
+ }
15
+ export declare function installExtension(extension: Extension): Promise<void>;
16
+ export declare function uninstallExtension(slug: string, type: string): Promise<void>;
17
+ export declare function listInstalledExtensions(): InstalledExtension[];
18
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/marketplace/installer.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAWrC;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAsB/C;AAQD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB1E;AA8CD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwClF;AAED,wBAAgB,uBAAuB,IAAI,kBAAkB,EAAE,CAsD9D"}
@@ -0,0 +1,184 @@
1
+ import { existsSync, mkdirSync, writeFileSync, unlinkSync, chmodSync, readdirSync, } from 'fs';
2
+ import { homedir } from 'os';
3
+ import { join, basename } from 'path';
4
+ import { setMcpServer, removeMcpServer, listMcpServers, hasMcpServer, getSettingsPath } from '../mcp/config.js';
5
+ const CLAUDE_DIR = join(homedir(), '.claude');
6
+ const SKILLS_DIR = join(CLAUDE_DIR, 'skills');
7
+ const AGENTS_DIR = join(CLAUDE_DIR, 'agents');
8
+ const HOOKS_DIR = join(CLAUDE_DIR, 'hooks');
9
+ /** Maximum allowed slug length to prevent abuse */
10
+ const MAX_SLUG_LENGTH = 128;
11
+ /**
12
+ * Validates an extension slug to prevent path traversal and injection attacks.
13
+ * Mirrors the Rust validation in packages/claudetools-sync/src/install/mod.rs.
14
+ *
15
+ * Allowed characters: [a-zA-Z0-9_-]
16
+ * Must be non-empty and at most MAX_SLUG_LENGTH characters.
17
+ */
18
+ export function validateSlug(slug) {
19
+ if (!slug || slug.length === 0) {
20
+ throw new Error('Extension slug must not be empty');
21
+ }
22
+ if (slug.length > MAX_SLUG_LENGTH) {
23
+ throw new Error(`Extension slug exceeds maximum length of ${MAX_SLUG_LENGTH} characters: ${slug.slice(0, 32)}...`);
24
+ }
25
+ if (slug.includes('..') || slug.includes('/') || slug.includes('\\')) {
26
+ throw new Error(`Extension slug contains path traversal characters: ${slug}`);
27
+ }
28
+ if (!/^[a-zA-Z0-9_-]+$/.test(slug)) {
29
+ throw new Error(`Extension slug contains invalid characters (only alphanumeric, hyphens, underscores allowed): ${slug}`);
30
+ }
31
+ }
32
+ function ensureDir(dir) {
33
+ if (!existsSync(dir)) {
34
+ mkdirSync(dir, { recursive: true, mode: 0o755 });
35
+ }
36
+ }
37
+ export async function installExtension(extension) {
38
+ validateSlug(extension.slug);
39
+ ensureDir(CLAUDE_DIR);
40
+ switch (extension.type) {
41
+ case 'skill':
42
+ await installSkill(extension);
43
+ break;
44
+ case 'agent':
45
+ await installAgent(extension);
46
+ break;
47
+ case 'hook':
48
+ await installHook(extension);
49
+ break;
50
+ case 'mcp-server':
51
+ await installMcpServer(extension);
52
+ break;
53
+ default:
54
+ throw new Error(`Unknown extension type: ${extension.type}`);
55
+ }
56
+ }
57
+ async function installSkill(extension) {
58
+ ensureDir(SKILLS_DIR);
59
+ const filePath = join(SKILLS_DIR, `${extension.slug}.md`);
60
+ if (!extension.content) {
61
+ throw new Error('Extension content is missing');
62
+ }
63
+ writeFileSync(filePath, extension.content, { mode: 0o644 });
64
+ }
65
+ async function installAgent(extension) {
66
+ ensureDir(AGENTS_DIR);
67
+ const filePath = join(AGENTS_DIR, `${extension.slug}.md`);
68
+ if (!extension.content) {
69
+ throw new Error('Extension content is missing');
70
+ }
71
+ writeFileSync(filePath, extension.content, { mode: 0o644 });
72
+ }
73
+ async function installHook(extension) {
74
+ ensureDir(HOOKS_DIR);
75
+ const filePath = join(HOOKS_DIR, `${extension.slug}.sh`);
76
+ if (!extension.content) {
77
+ throw new Error('Extension content is missing');
78
+ }
79
+ writeFileSync(filePath, extension.content, { mode: 0o755 });
80
+ chmodSync(filePath, 0o755);
81
+ }
82
+ async function installMcpServer(extension) {
83
+ if (!extension.config) {
84
+ throw new Error('MCP server configuration is missing');
85
+ }
86
+ // Use settings.json (Claude Code standard) instead of legacy mcp.json
87
+ const config = extension.config;
88
+ setMcpServer(extension.slug, config);
89
+ }
90
+ export async function uninstallExtension(slug, type) {
91
+ validateSlug(slug);
92
+ switch (type) {
93
+ case 'skill': {
94
+ const filePath = join(SKILLS_DIR, `${slug}.md`);
95
+ if (existsSync(filePath)) {
96
+ unlinkSync(filePath);
97
+ }
98
+ else {
99
+ throw new Error(`Skill not found: ${slug}`);
100
+ }
101
+ break;
102
+ }
103
+ case 'agent': {
104
+ const filePath = join(AGENTS_DIR, `${slug}.md`);
105
+ if (existsSync(filePath)) {
106
+ unlinkSync(filePath);
107
+ }
108
+ else {
109
+ throw new Error(`Agent not found: ${slug}`);
110
+ }
111
+ break;
112
+ }
113
+ case 'hook': {
114
+ const filePath = join(HOOKS_DIR, `${slug}.sh`);
115
+ if (existsSync(filePath)) {
116
+ unlinkSync(filePath);
117
+ }
118
+ else {
119
+ throw new Error(`Hook not found: ${slug}`);
120
+ }
121
+ break;
122
+ }
123
+ case 'mcp-server': {
124
+ if (!hasMcpServer(slug)) {
125
+ throw new Error(`MCP server not found: ${slug}`);
126
+ }
127
+ removeMcpServer(slug);
128
+ break;
129
+ }
130
+ default:
131
+ throw new Error(`Unknown extension type: ${type}`);
132
+ }
133
+ }
134
+ export function listInstalledExtensions() {
135
+ const installed = [];
136
+ // List skills
137
+ if (existsSync(SKILLS_DIR)) {
138
+ const skills = readdirSync(SKILLS_DIR).filter((f) => f.endsWith('.md'));
139
+ for (const skill of skills) {
140
+ const slug = basename(skill, '.md');
141
+ installed.push({
142
+ slug,
143
+ type: 'skill',
144
+ path: join(SKILLS_DIR, skill),
145
+ });
146
+ }
147
+ }
148
+ // List agents
149
+ if (existsSync(AGENTS_DIR)) {
150
+ const agents = readdirSync(AGENTS_DIR).filter((f) => f.endsWith('.md'));
151
+ for (const agent of agents) {
152
+ const slug = basename(agent, '.md');
153
+ installed.push({
154
+ slug,
155
+ type: 'agent',
156
+ path: join(AGENTS_DIR, agent),
157
+ });
158
+ }
159
+ }
160
+ // List hooks
161
+ if (existsSync(HOOKS_DIR)) {
162
+ const hooks = readdirSync(HOOKS_DIR).filter((f) => f.endsWith('.sh'));
163
+ for (const hook of hooks) {
164
+ const slug = basename(hook, '.sh');
165
+ installed.push({
166
+ slug,
167
+ type: 'hook',
168
+ path: join(HOOKS_DIR, hook),
169
+ });
170
+ }
171
+ }
172
+ // List MCP servers (from settings.json)
173
+ const mcpServers = listMcpServers();
174
+ const settingsPath = getSettingsPath();
175
+ for (const slug of Object.keys(mcpServers)) {
176
+ installed.push({
177
+ slug,
178
+ type: 'mcp-server',
179
+ path: settingsPath,
180
+ });
181
+ }
182
+ return installed;
183
+ }
184
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/marketplace/installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * MCP Marketplace API
3
+ *
4
+ * Fetches MCP server manifests from the ClaudeTools marketplace.
5
+ * All MCPs must be curated (submitted for review) before installation.
6
+ */
7
+ /**
8
+ * Environment variable template
9
+ */
10
+ export interface EnvVarTemplate {
11
+ required: boolean;
12
+ sensitive: boolean;
13
+ description: string;
14
+ helpUrl?: string;
15
+ default?: string;
16
+ }
17
+ /**
18
+ * MCP server manifest from marketplace
19
+ */
20
+ export interface McpManifest {
21
+ id: string;
22
+ name: string;
23
+ slug: string;
24
+ description: string;
25
+ source: string;
26
+ version: string;
27
+ author: {
28
+ id: string;
29
+ name: string;
30
+ };
31
+ envTemplate?: Record<string, EnvVarTemplate>;
32
+ command: string;
33
+ args: string[];
34
+ downloads: number;
35
+ verified: boolean;
36
+ createdAt: string;
37
+ updatedAt: string;
38
+ }
39
+ /**
40
+ * Search result for MCP servers
41
+ */
42
+ export interface McpSearchResult {
43
+ servers: McpManifest[];
44
+ total: number;
45
+ }
46
+ /**
47
+ * MCP submission request
48
+ */
49
+ export interface McpSubmission {
50
+ source: string;
51
+ description?: string;
52
+ envTemplate?: Record<string, EnvVarTemplate>;
53
+ }
54
+ /**
55
+ * MCP submission response
56
+ */
57
+ export interface McpSubmissionResult {
58
+ id: string;
59
+ status: 'pending' | 'approved' | 'rejected';
60
+ message?: string;
61
+ }
62
+ /**
63
+ * Fetch MCP manifest from marketplace
64
+ */
65
+ export declare function getMcpManifest(slug: string): Promise<McpManifest>;
66
+ /**
67
+ * Search for MCP servers in marketplace
68
+ */
69
+ export declare function searchMcpServers(query?: string, limit?: number): Promise<McpSearchResult>;
70
+ /**
71
+ * Submit an MCP server for review
72
+ */
73
+ export declare function submitMcpServer(submission: McpSubmission): Promise<McpSubmissionResult>;
74
+ /**
75
+ * Track MCP download (for analytics)
76
+ */
77
+ export declare function trackMcpDownload(slug: string): Promise<void>;
78
+ /**
79
+ * Parse source string to command and args
80
+ */
81
+ export declare function parseSource(source: string): {
82
+ command: string;
83
+ args: string[];
84
+ };
85
+ /**
86
+ * Check if an MCP is from the official MCP organization
87
+ */
88
+ export declare function isOfficialMcp(manifest: McpManifest): boolean;
89
+ /**
90
+ * Format MCP source for display
91
+ */
92
+ export declare function formatSource(source: string): string;
93
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/mcp/api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CASvE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,eAAe,CAAC,CAc3F;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAS7F;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOlE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CA4B/E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAM5D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQnD"}