claudeup 1.7.0 → 3.3.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 (302) hide show
  1. package/bin/claudeup.js +20 -2
  2. package/package.json +10 -19
  3. package/src/data/cli-tools.js +123 -0
  4. package/src/data/cli-tools.ts +140 -0
  5. package/{dist → src}/data/marketplaces.js +23 -24
  6. package/src/data/marketplaces.ts +95 -0
  7. package/src/data/mcp-servers.js +509 -0
  8. package/src/data/mcp-servers.ts +526 -0
  9. package/src/data/statuslines.js +159 -0
  10. package/src/data/statuslines.ts +188 -0
  11. package/src/index.js +4 -0
  12. package/src/index.ts +5 -0
  13. package/{dist → src}/main.js +46 -47
  14. package/src/main.tsx +145 -0
  15. package/src/opentui.d.ts +191 -0
  16. package/src/prerunner/index.js +87 -0
  17. package/src/prerunner/index.ts +124 -0
  18. package/{dist → src}/services/claude-runner.js +9 -10
  19. package/src/services/claude-runner.ts +31 -0
  20. package/{dist → src}/services/claude-settings.js +72 -33
  21. package/src/services/claude-settings.ts +934 -0
  22. package/src/services/local-marketplace.js +339 -0
  23. package/src/services/local-marketplace.ts +489 -0
  24. package/{dist → src}/services/mcp-registry.js +13 -14
  25. package/src/services/mcp-registry.ts +105 -0
  26. package/{dist → src}/services/plugin-manager.js +61 -13
  27. package/src/services/plugin-manager.ts +693 -0
  28. package/{dist → src}/services/plugin-mcp-config.js +19 -18
  29. package/src/services/plugin-mcp-config.ts +242 -0
  30. package/{dist → src}/services/update-cache.js +7 -8
  31. package/src/services/update-cache.ts +78 -0
  32. package/{dist → src}/services/version-check.js +15 -14
  33. package/src/services/version-check.ts +122 -0
  34. package/src/types/index.js +1 -0
  35. package/src/types/index.ts +141 -0
  36. package/src/ui/App.js +213 -0
  37. package/src/ui/App.tsx +359 -0
  38. package/src/ui/components/CategoryHeader.js +9 -0
  39. package/src/ui/components/CategoryHeader.tsx +41 -0
  40. package/{dist → src}/ui/components/ScrollableList.js +19 -6
  41. package/src/ui/components/ScrollableList.tsx +98 -0
  42. package/src/ui/components/SearchInput.js +19 -0
  43. package/src/ui/components/SearchInput.tsx +56 -0
  44. package/src/ui/components/StyledText.js +39 -0
  45. package/src/ui/components/StyledText.tsx +70 -0
  46. package/src/ui/components/TabBar.js +38 -0
  47. package/src/ui/components/TabBar.tsx +88 -0
  48. package/src/ui/components/layout/Panel.js +6 -0
  49. package/src/ui/components/layout/Panel.tsx +62 -0
  50. package/src/ui/components/layout/ProgressBar.js +14 -0
  51. package/src/ui/components/layout/ProgressBar.tsx +47 -0
  52. package/src/ui/components/layout/ScopeTabs.js +6 -0
  53. package/src/ui/components/layout/ScopeTabs.tsx +53 -0
  54. package/src/ui/components/layout/ScreenLayout.js +21 -0
  55. package/src/ui/components/layout/ScreenLayout.tsx +147 -0
  56. package/src/ui/components/layout/index.js +4 -0
  57. package/src/ui/components/layout/index.ts +4 -0
  58. package/src/ui/components/modals/ConfirmModal.js +14 -0
  59. package/src/ui/components/modals/ConfirmModal.tsx +59 -0
  60. package/src/ui/components/modals/InputModal.js +16 -0
  61. package/src/ui/components/modals/InputModal.tsx +68 -0
  62. package/src/ui/components/modals/LoadingModal.js +14 -0
  63. package/src/ui/components/modals/LoadingModal.tsx +40 -0
  64. package/src/ui/components/modals/MessageModal.js +16 -0
  65. package/src/ui/components/modals/MessageModal.tsx +64 -0
  66. package/src/ui/components/modals/ModalContainer.js +56 -0
  67. package/src/ui/components/modals/ModalContainer.tsx +104 -0
  68. package/src/ui/components/modals/SelectModal.js +26 -0
  69. package/src/ui/components/modals/SelectModal.tsx +82 -0
  70. package/src/ui/components/modals/index.js +6 -0
  71. package/src/ui/components/modals/index.ts +6 -0
  72. package/src/ui/hooks/index.js +3 -0
  73. package/src/ui/hooks/index.ts +3 -0
  74. package/{dist → src}/ui/hooks/useAsyncData.js +21 -22
  75. package/src/ui/hooks/useAsyncData.ts +127 -0
  76. package/src/ui/hooks/useKeyboard.js +13 -0
  77. package/src/ui/hooks/useKeyboard.ts +26 -0
  78. package/src/ui/hooks/useKeyboardHandler.js +39 -0
  79. package/src/ui/hooks/useKeyboardHandler.ts +63 -0
  80. package/{dist → src}/ui/screens/CliToolsScreen.js +60 -54
  81. package/src/ui/screens/CliToolsScreen.tsx +468 -0
  82. package/src/ui/screens/EnvVarsScreen.js +154 -0
  83. package/src/ui/screens/EnvVarsScreen.tsx +269 -0
  84. package/{dist → src}/ui/screens/McpRegistryScreen.js +56 -55
  85. package/src/ui/screens/McpRegistryScreen.tsx +331 -0
  86. package/{dist → src}/ui/screens/McpScreen.js +46 -47
  87. package/src/ui/screens/McpScreen.tsx +392 -0
  88. package/src/ui/screens/ModelSelectorScreen.js +292 -0
  89. package/src/ui/screens/ModelSelectorScreen.tsx +441 -0
  90. package/{dist → src}/ui/screens/PluginsScreen.js +305 -293
  91. package/src/ui/screens/PluginsScreen.tsx +1231 -0
  92. package/src/ui/screens/StatusLineScreen.js +200 -0
  93. package/src/ui/screens/StatusLineScreen.tsx +411 -0
  94. package/src/ui/screens/index.js +7 -0
  95. package/src/ui/screens/index.ts +7 -0
  96. package/src/ui/state/AnimationContext.js +34 -0
  97. package/src/ui/state/AnimationContext.tsx +76 -0
  98. package/{dist → src}/ui/state/AppContext.js +31 -32
  99. package/src/ui/state/AppContext.tsx +235 -0
  100. package/{dist → src}/ui/state/DimensionsContext.js +16 -17
  101. package/src/ui/state/DimensionsContext.tsx +144 -0
  102. package/{dist → src}/ui/state/reducer.js +89 -90
  103. package/src/ui/state/reducer.ts +467 -0
  104. package/src/ui/state/types.js +1 -0
  105. package/src/ui/state/types.ts +273 -0
  106. package/{dist → src}/utils/command-utils.js +3 -4
  107. package/src/utils/command-utils.ts +20 -0
  108. package/{dist → src}/utils/fuzzy-search.js +2 -3
  109. package/src/utils/fuzzy-search.ts +138 -0
  110. package/{dist → src}/utils/string-utils.js +6 -6
  111. package/src/utils/string-utils.ts +88 -0
  112. package/dist/data/cli-tools.d.ts +0 -13
  113. package/dist/data/cli-tools.d.ts.map +0 -1
  114. package/dist/data/cli-tools.js +0 -124
  115. package/dist/data/cli-tools.js.map +0 -1
  116. package/dist/data/marketplaces.d.ts +0 -6
  117. package/dist/data/marketplaces.d.ts.map +0 -1
  118. package/dist/data/marketplaces.js.map +0 -1
  119. package/dist/data/mcp-servers.d.ts +0 -8
  120. package/dist/data/mcp-servers.d.ts.map +0 -1
  121. package/dist/data/mcp-servers.js +0 -503
  122. package/dist/data/mcp-servers.js.map +0 -1
  123. package/dist/data/statuslines.d.ts +0 -10
  124. package/dist/data/statuslines.d.ts.map +0 -1
  125. package/dist/data/statuslines.js +0 -160
  126. package/dist/data/statuslines.js.map +0 -1
  127. package/dist/index.d.ts +0 -3
  128. package/dist/index.d.ts.map +0 -1
  129. package/dist/index.js +0 -90
  130. package/dist/index.js.map +0 -1
  131. package/dist/main.d.ts +0 -3
  132. package/dist/main.d.ts.map +0 -1
  133. package/dist/main.js.map +0 -1
  134. package/dist/prerunner/index.d.ts +0 -7
  135. package/dist/prerunner/index.d.ts.map +0 -1
  136. package/dist/prerunner/index.js +0 -64
  137. package/dist/prerunner/index.js.map +0 -1
  138. package/dist/services/claude-runner.d.ts +0 -7
  139. package/dist/services/claude-runner.d.ts.map +0 -1
  140. package/dist/services/claude-runner.js.map +0 -1
  141. package/dist/services/claude-settings.d.ts +0 -73
  142. package/dist/services/claude-settings.d.ts.map +0 -1
  143. package/dist/services/claude-settings.js.map +0 -1
  144. package/dist/services/local-marketplace.d.ts +0 -111
  145. package/dist/services/local-marketplace.d.ts.map +0 -1
  146. package/dist/services/local-marketplace.js +0 -599
  147. package/dist/services/local-marketplace.js.map +0 -1
  148. package/dist/services/mcp-registry.d.ts +0 -10
  149. package/dist/services/mcp-registry.d.ts.map +0 -1
  150. package/dist/services/mcp-registry.js.map +0 -1
  151. package/dist/services/plugin-manager.d.ts +0 -65
  152. package/dist/services/plugin-manager.d.ts.map +0 -1
  153. package/dist/services/plugin-manager.js.map +0 -1
  154. package/dist/services/plugin-mcp-config.d.ts +0 -52
  155. package/dist/services/plugin-mcp-config.d.ts.map +0 -1
  156. package/dist/services/plugin-mcp-config.js.map +0 -1
  157. package/dist/services/update-cache.d.ts +0 -16
  158. package/dist/services/update-cache.d.ts.map +0 -1
  159. package/dist/services/update-cache.js.map +0 -1
  160. package/dist/services/version-check.d.ts +0 -20
  161. package/dist/services/version-check.d.ts.map +0 -1
  162. package/dist/services/version-check.js.map +0 -1
  163. package/dist/types/index.d.ts +0 -105
  164. package/dist/types/index.d.ts.map +0 -1
  165. package/dist/types/index.js +0 -2
  166. package/dist/types/index.js.map +0 -1
  167. package/dist/ui/InkApp.d.ts +0 -5
  168. package/dist/ui/InkApp.d.ts.map +0 -1
  169. package/dist/ui/InkApp.js +0 -188
  170. package/dist/ui/InkApp.js.map +0 -1
  171. package/dist/ui/components/CategoryHeader.d.ts +0 -16
  172. package/dist/ui/components/CategoryHeader.d.ts.map +0 -1
  173. package/dist/ui/components/CategoryHeader.js +0 -11
  174. package/dist/ui/components/CategoryHeader.js.map +0 -1
  175. package/dist/ui/components/ScrollableList.d.ts +0 -16
  176. package/dist/ui/components/ScrollableList.d.ts.map +0 -1
  177. package/dist/ui/components/ScrollableList.js.map +0 -1
  178. package/dist/ui/components/SearchInput.d.ts +0 -18
  179. package/dist/ui/components/SearchInput.d.ts.map +0 -1
  180. package/dist/ui/components/SearchInput.js +0 -30
  181. package/dist/ui/components/SearchInput.js.map +0 -1
  182. package/dist/ui/components/TabBar.d.ts +0 -8
  183. package/dist/ui/components/TabBar.d.ts.map +0 -1
  184. package/dist/ui/components/TabBar.js +0 -18
  185. package/dist/ui/components/TabBar.js.map +0 -1
  186. package/dist/ui/components/layout/Footer.d.ts +0 -14
  187. package/dist/ui/components/layout/Footer.d.ts.map +0 -1
  188. package/dist/ui/components/layout/Footer.js +0 -23
  189. package/dist/ui/components/layout/Footer.js.map +0 -1
  190. package/dist/ui/components/layout/Header.d.ts +0 -4
  191. package/dist/ui/components/layout/Header.d.ts.map +0 -1
  192. package/dist/ui/components/layout/Header.js +0 -25
  193. package/dist/ui/components/layout/Header.js.map +0 -1
  194. package/dist/ui/components/layout/Panel.d.ts +0 -22
  195. package/dist/ui/components/layout/Panel.d.ts.map +0 -1
  196. package/dist/ui/components/layout/Panel.js +0 -8
  197. package/dist/ui/components/layout/Panel.js.map +0 -1
  198. package/dist/ui/components/layout/ProgressBar.d.ts +0 -12
  199. package/dist/ui/components/layout/ProgressBar.d.ts.map +0 -1
  200. package/dist/ui/components/layout/ProgressBar.js +0 -16
  201. package/dist/ui/components/layout/ProgressBar.js.map +0 -1
  202. package/dist/ui/components/layout/ScopeTabs.d.ts +0 -12
  203. package/dist/ui/components/layout/ScopeTabs.d.ts.map +0 -1
  204. package/dist/ui/components/layout/ScopeTabs.js +0 -8
  205. package/dist/ui/components/layout/ScopeTabs.js.map +0 -1
  206. package/dist/ui/components/layout/ScreenLayout.d.ts +0 -30
  207. package/dist/ui/components/layout/ScreenLayout.d.ts.map +0 -1
  208. package/dist/ui/components/layout/ScreenLayout.js +0 -23
  209. package/dist/ui/components/layout/ScreenLayout.js.map +0 -1
  210. package/dist/ui/components/layout/index.d.ts +0 -7
  211. package/dist/ui/components/layout/index.d.ts.map +0 -1
  212. package/dist/ui/components/layout/index.js +0 -7
  213. package/dist/ui/components/layout/index.js.map +0 -1
  214. package/dist/ui/components/modals/ConfirmModal.d.ts +0 -14
  215. package/dist/ui/components/modals/ConfirmModal.d.ts.map +0 -1
  216. package/dist/ui/components/modals/ConfirmModal.js +0 -15
  217. package/dist/ui/components/modals/ConfirmModal.js.map +0 -1
  218. package/dist/ui/components/modals/InputModal.d.ts +0 -16
  219. package/dist/ui/components/modals/InputModal.d.ts.map +0 -1
  220. package/dist/ui/components/modals/InputModal.js +0 -23
  221. package/dist/ui/components/modals/InputModal.js.map +0 -1
  222. package/dist/ui/components/modals/LoadingModal.d.ts +0 -8
  223. package/dist/ui/components/modals/LoadingModal.d.ts.map +0 -1
  224. package/dist/ui/components/modals/LoadingModal.js +0 -8
  225. package/dist/ui/components/modals/LoadingModal.js.map +0 -1
  226. package/dist/ui/components/modals/MessageModal.d.ts +0 -14
  227. package/dist/ui/components/modals/MessageModal.d.ts.map +0 -1
  228. package/dist/ui/components/modals/MessageModal.js +0 -17
  229. package/dist/ui/components/modals/MessageModal.js.map +0 -1
  230. package/dist/ui/components/modals/ModalContainer.d.ts +0 -7
  231. package/dist/ui/components/modals/ModalContainer.d.ts.map +0 -1
  232. package/dist/ui/components/modals/ModalContainer.js +0 -38
  233. package/dist/ui/components/modals/ModalContainer.js.map +0 -1
  234. package/dist/ui/components/modals/SelectModal.d.ts +0 -17
  235. package/dist/ui/components/modals/SelectModal.d.ts.map +0 -1
  236. package/dist/ui/components/modals/SelectModal.js +0 -33
  237. package/dist/ui/components/modals/SelectModal.js.map +0 -1
  238. package/dist/ui/components/modals/index.d.ts +0 -7
  239. package/dist/ui/components/modals/index.d.ts.map +0 -1
  240. package/dist/ui/components/modals/index.js +0 -7
  241. package/dist/ui/components/modals/index.js.map +0 -1
  242. package/dist/ui/hooks/index.d.ts +0 -3
  243. package/dist/ui/hooks/index.d.ts.map +0 -1
  244. package/dist/ui/hooks/index.js +0 -3
  245. package/dist/ui/hooks/index.js.map +0 -1
  246. package/dist/ui/hooks/useAsyncData.d.ts +0 -40
  247. package/dist/ui/hooks/useAsyncData.d.ts.map +0 -1
  248. package/dist/ui/hooks/useAsyncData.js.map +0 -1
  249. package/dist/ui/hooks/useKeyboardNavigation.d.ts +0 -27
  250. package/dist/ui/hooks/useKeyboardNavigation.d.ts.map +0 -1
  251. package/dist/ui/hooks/useKeyboardNavigation.js +0 -82
  252. package/dist/ui/hooks/useKeyboardNavigation.js.map +0 -1
  253. package/dist/ui/screens/CliToolsScreen.d.ts +0 -4
  254. package/dist/ui/screens/CliToolsScreen.d.ts.map +0 -1
  255. package/dist/ui/screens/CliToolsScreen.js.map +0 -1
  256. package/dist/ui/screens/EnvVarsScreen.d.ts +0 -4
  257. package/dist/ui/screens/EnvVarsScreen.d.ts.map +0 -1
  258. package/dist/ui/screens/EnvVarsScreen.js +0 -145
  259. package/dist/ui/screens/EnvVarsScreen.js.map +0 -1
  260. package/dist/ui/screens/McpRegistryScreen.d.ts +0 -4
  261. package/dist/ui/screens/McpRegistryScreen.d.ts.map +0 -1
  262. package/dist/ui/screens/McpRegistryScreen.js.map +0 -1
  263. package/dist/ui/screens/McpScreen.d.ts +0 -4
  264. package/dist/ui/screens/McpScreen.d.ts.map +0 -1
  265. package/dist/ui/screens/McpScreen.js.map +0 -1
  266. package/dist/ui/screens/ModelSelectorScreen.d.ts +0 -4
  267. package/dist/ui/screens/ModelSelectorScreen.d.ts.map +0 -1
  268. package/dist/ui/screens/ModelSelectorScreen.js +0 -143
  269. package/dist/ui/screens/ModelSelectorScreen.js.map +0 -1
  270. package/dist/ui/screens/PluginsScreen.d.ts +0 -4
  271. package/dist/ui/screens/PluginsScreen.d.ts.map +0 -1
  272. package/dist/ui/screens/PluginsScreen.js.map +0 -1
  273. package/dist/ui/screens/StatusLineScreen.d.ts +0 -4
  274. package/dist/ui/screens/StatusLineScreen.d.ts.map +0 -1
  275. package/dist/ui/screens/StatusLineScreen.js +0 -197
  276. package/dist/ui/screens/StatusLineScreen.js.map +0 -1
  277. package/dist/ui/screens/index.d.ts +0 -8
  278. package/dist/ui/screens/index.d.ts.map +0 -1
  279. package/dist/ui/screens/index.js +0 -8
  280. package/dist/ui/screens/index.js.map +0 -1
  281. package/dist/ui/state/AppContext.d.ts +0 -40
  282. package/dist/ui/state/AppContext.d.ts.map +0 -1
  283. package/dist/ui/state/AppContext.js.map +0 -1
  284. package/dist/ui/state/DimensionsContext.d.ts +0 -27
  285. package/dist/ui/state/DimensionsContext.d.ts.map +0 -1
  286. package/dist/ui/state/DimensionsContext.js.map +0 -1
  287. package/dist/ui/state/reducer.d.ts +0 -4
  288. package/dist/ui/state/reducer.d.ts.map +0 -1
  289. package/dist/ui/state/reducer.js.map +0 -1
  290. package/dist/ui/state/types.d.ts +0 -266
  291. package/dist/ui/state/types.d.ts.map +0 -1
  292. package/dist/ui/state/types.js +0 -2
  293. package/dist/ui/state/types.js.map +0 -1
  294. package/dist/utils/command-utils.d.ts +0 -8
  295. package/dist/utils/command-utils.d.ts.map +0 -1
  296. package/dist/utils/command-utils.js.map +0 -1
  297. package/dist/utils/fuzzy-search.d.ts +0 -33
  298. package/dist/utils/fuzzy-search.d.ts.map +0 -1
  299. package/dist/utils/fuzzy-search.js.map +0 -1
  300. package/dist/utils/string-utils.d.ts +0 -24
  301. package/dist/utils/string-utils.d.ts.map +0 -1
  302. package/dist/utils/string-utils.js.map +0 -1
@@ -1,599 +0,0 @@
1
- import fs from 'fs-extra';
2
- import path from 'node:path';
3
- import os from 'node:os';
4
- import { execSync, exec as execCb } from 'node:child_process';
5
- import { promisify } from 'node:util';
6
- const execAsync = promisify(execCb);
7
- const CLAUDE_PLUGINS_DIR = path.join(os.homedir(), '.claude', 'plugins', 'marketplaces');
8
- const KNOWN_MARKETPLACES_FILE = path.join(os.homedir(), '.claude', 'plugins', 'known_marketplaces.json');
9
- /**
10
- * Read known_marketplaces.json (Claude Code's internal marketplace tracking)
11
- */
12
- async function readKnownMarketplaces() {
13
- try {
14
- if (await fs.pathExists(KNOWN_MARKETPLACES_FILE)) {
15
- return await fs.readJson(KNOWN_MARKETPLACES_FILE);
16
- }
17
- }
18
- catch {
19
- // Return empty if can't read
20
- }
21
- return {};
22
- }
23
- /**
24
- * Write known_marketplaces.json
25
- */
26
- async function writeKnownMarketplaces(data) {
27
- await fs.ensureDir(path.dirname(KNOWN_MARKETPLACES_FILE));
28
- await fs.writeJson(KNOWN_MARKETPLACES_FILE, data, { spaces: 2 });
29
- }
30
- /**
31
- * Add a marketplace to known_marketplaces.json
32
- */
33
- export async function addToKnownMarketplaces(name, repo) {
34
- const known = await readKnownMarketplaces();
35
- known[name] = {
36
- source: { source: 'github', repo },
37
- installLocation: path.join(CLAUDE_PLUGINS_DIR, name),
38
- lastUpdated: new Date().toISOString(),
39
- };
40
- await writeKnownMarketplaces(known);
41
- }
42
- /**
43
- * Remove a marketplace from known_marketplaces.json
44
- */
45
- export async function removeFromKnownMarketplaces(name) {
46
- const known = await readKnownMarketplaces();
47
- if (known[name]) {
48
- delete known[name];
49
- await writeKnownMarketplaces(known);
50
- }
51
- }
52
- /**
53
- * Get git remote URL from a marketplace directory
54
- */
55
- function getGitRemote(marketplacePath) {
56
- try {
57
- const gitDir = path.join(marketplacePath, '.git');
58
- if (!fs.existsSync(gitDir))
59
- return undefined;
60
- const result = execSync('git remote get-url origin', {
61
- cwd: marketplacePath,
62
- encoding: 'utf-8',
63
- timeout: 5000,
64
- }).trim();
65
- // Convert SSH URL to HTTPS format: git@github.com:user/repo.git -> user/repo
66
- if (result.startsWith('git@github.com:')) {
67
- return result.replace('git@github.com:', '').replace(/\.git$/, '');
68
- }
69
- // HTTPS URL: https://github.com/user/repo -> user/repo
70
- if (result.includes('github.com')) {
71
- const match = result.match(/github\.com[/:]([^/]+\/[^/\s.]+)/);
72
- if (match)
73
- return match[1].replace(/\.git$/, '');
74
- }
75
- return undefined;
76
- }
77
- catch {
78
- return undefined;
79
- }
80
- }
81
- /**
82
- * Scan a single marketplace directory and return marketplace info
83
- */
84
- async function scanSingleMarketplace(marketplacePath, marketplaceName) {
85
- const manifestPath = path.join(marketplacePath, '.claude-plugin', 'marketplace.json');
86
- if (!(await fs.pathExists(manifestPath)))
87
- return null;
88
- try {
89
- const manifest = await fs.readJson(manifestPath);
90
- const gitRepo = getGitRemote(marketplacePath);
91
- const plugins = [];
92
- const validManifestPlugins = [];
93
- let manifestModified = false;
94
- if (manifest.plugins && Array.isArray(manifest.plugins)) {
95
- for (const plugin of manifest.plugins) {
96
- // Try to scan plugin directory for component counts
97
- let agents = [];
98
- let commands = [];
99
- let skills = [];
100
- let mcpServers = [];
101
- // Handle both string sources (local paths) and object sources (remote URLs)
102
- const sourceStr = typeof plugin.source === 'string' ? plugin.source : null;
103
- if (sourceStr) {
104
- const pluginPath = path.join(marketplacePath, sourceStr.replace('./', ''));
105
- // Remove plugins whose source directory doesn't exist
106
- if (!(await fs.pathExists(pluginPath))) {
107
- manifestModified = true;
108
- continue;
109
- }
110
- try {
111
- // Scan for agents
112
- const agentsDir = path.join(pluginPath, 'agents');
113
- if (await fs.pathExists(agentsDir)) {
114
- const agentFiles = await fs.readdir(agentsDir);
115
- agents = agentFiles.filter((f) => f.endsWith('.md')).map((f) => f.replace('.md', ''));
116
- }
117
- // Scan for commands
118
- const commandsDir = path.join(pluginPath, 'commands');
119
- if (await fs.pathExists(commandsDir)) {
120
- const cmdFiles = await fs.readdir(commandsDir);
121
- commands = cmdFiles.filter((f) => f.endsWith('.md')).map((f) => f.replace('.md', ''));
122
- }
123
- // Scan for skills
124
- const skillsDir = path.join(pluginPath, 'skills');
125
- if (await fs.pathExists(skillsDir)) {
126
- const skillFiles = await fs.readdir(skillsDir);
127
- skills = skillFiles.filter((f) => f.endsWith('.md') || fs.statSync(path.join(skillsDir, f)).isDirectory());
128
- }
129
- // Scan for MCP servers
130
- const mcpDir = path.join(pluginPath, 'mcp-servers');
131
- if (await fs.pathExists(mcpDir)) {
132
- const mcpFiles = await fs.readdir(mcpDir);
133
- mcpServers = mcpFiles.filter((f) => f.endsWith('.json')).map((f) => f.replace('.json', ''));
134
- }
135
- }
136
- catch {
137
- // Ignore scan errors
138
- }
139
- }
140
- validManifestPlugins.push(plugin);
141
- plugins.push({
142
- name: plugin.name,
143
- version: plugin.version || '0.0.0',
144
- description: plugin.description || '',
145
- source: plugin.source,
146
- category: plugin.category,
147
- author: plugin.author,
148
- strict: plugin.strict,
149
- lspServers: plugin.lspServers,
150
- agents,
151
- commands,
152
- skills,
153
- mcpServers,
154
- });
155
- }
156
- }
157
- // Update marketplace.json if we removed invalid plugins
158
- if (manifestModified) {
159
- manifest.plugins = validManifestPlugins;
160
- await fs.writeJson(manifestPath, manifest, { spaces: 2 });
161
- }
162
- return {
163
- name: manifest.name || marketplaceName,
164
- description: manifest.description || manifest.metadata?.description || '',
165
- plugins,
166
- gitRepo,
167
- };
168
- }
169
- catch {
170
- return null;
171
- }
172
- }
173
- /**
174
- * Scan local marketplace cache and return marketplace info
175
- * Includes both:
176
- * - Marketplaces in ~/.claude/plugins/marketplaces/
177
- * - Directory-based marketplaces from known_marketplaces.json
178
- */
179
- export async function scanLocalMarketplaces() {
180
- const marketplaces = new Map();
181
- // 1. Scan marketplaces from the standard directory
182
- if (await fs.pathExists(CLAUDE_PLUGINS_DIR)) {
183
- try {
184
- const entries = await fs.readdir(CLAUDE_PLUGINS_DIR, { withFileTypes: true });
185
- for (const entry of entries) {
186
- if (!entry.isDirectory())
187
- continue;
188
- const marketplacePath = path.join(CLAUDE_PLUGINS_DIR, entry.name);
189
- const marketplace = await scanSingleMarketplace(marketplacePath, entry.name);
190
- if (marketplace) {
191
- marketplaces.set(entry.name, marketplace);
192
- }
193
- }
194
- }
195
- catch {
196
- // Ignore read errors
197
- }
198
- }
199
- // 2. Add directory-based marketplaces from known_marketplaces.json
200
- try {
201
- const known = await readKnownMarketplaces();
202
- for (const [name, entry] of Object.entries(known)) {
203
- // Only add if it's a directory source AND not already in the map
204
- if (entry.source.source === 'directory' && entry.installLocation && !marketplaces.has(name)) {
205
- if (await fs.pathExists(entry.installLocation)) {
206
- const marketplace = await scanSingleMarketplace(entry.installLocation, name);
207
- if (marketplace) {
208
- marketplaces.set(name, marketplace);
209
- }
210
- }
211
- }
212
- }
213
- }
214
- catch {
215
- // Ignore errors reading known_marketplaces
216
- }
217
- return marketplaces;
218
- }
219
- /**
220
- * Get a specific local marketplace by name
221
- */
222
- export async function getLocalMarketplace(name) {
223
- const marketplaces = await scanLocalMarketplaces();
224
- return marketplaces.get(name);
225
- }
226
- /**
227
- * Check if a marketplace exists in local cache
228
- */
229
- export async function hasLocalMarketplace(name) {
230
- const marketplacePath = path.join(CLAUDE_PLUGINS_DIR, name);
231
- const manifestPath = path.join(marketplacePath, '.claude-plugin', 'marketplace.json');
232
- return fs.pathExists(manifestPath);
233
- }
234
- /**
235
- * Get the GitHub repo for a marketplace from known_marketplaces.json or defaults
236
- */
237
- async function getMarketplaceRepo(name) {
238
- // Check known_marketplaces.json first
239
- const known = await readKnownMarketplaces();
240
- if (known[name]?.source?.repo) {
241
- return known[name].source.repo;
242
- }
243
- // Fallback to hardcoded defaults
244
- const defaults = {
245
- 'claude-plugins-official': 'anthropics/claude-plugins-official',
246
- 'claude-code-plugins': 'anthropics/claude-code',
247
- 'mag-claude-plugins': 'MadAppGang/claude-code',
248
- };
249
- return defaults[name];
250
- }
251
- /**
252
- * Re-clone a corrupted marketplace (missing .git folder)
253
- */
254
- async function recloneCorruptedMarketplace(marketplacePath, _name, repo) {
255
- try {
256
- // Remove corrupted directory
257
- await fs.remove(marketplacePath);
258
- // Re-clone
259
- const cloneUrl = `https://github.com/${repo}.git`;
260
- await execAsync(`git clone --depth 1 "${cloneUrl}" "${marketplacePath}" >/dev/null 2>&1`, {
261
- timeout: 60000, // 60s timeout for clone
262
- shell: '/bin/bash',
263
- });
264
- // Verify clone succeeded
265
- const gitDir = path.join(marketplacePath, '.git');
266
- if (!fs.existsSync(gitDir)) {
267
- return { success: false, error: 'Re-clone failed: .git folder not created' };
268
- }
269
- return { success: true };
270
- }
271
- catch (error) {
272
- return {
273
- success: false,
274
- error: error instanceof Error ? error.message : 'Re-clone failed',
275
- };
276
- }
277
- }
278
- /**
279
- * Refresh a single local marketplace by running git pull (async, non-blocking)
280
- * Auto-repairs corrupted marketplaces (missing .git folder) by re-cloning
281
- */
282
- async function refreshSingleMarketplace(marketplacePath, name) {
283
- try {
284
- const gitDir = path.join(marketplacePath, '.git');
285
- if (!fs.existsSync(gitDir)) {
286
- // Corrupted marketplace - attempt auto-repair by re-cloning
287
- const repo = await getMarketplaceRepo(name);
288
- if (!repo) {
289
- return { name, success: false, updated: false, error: 'Corrupted (missing .git) - unknown repo, cannot auto-repair' };
290
- }
291
- const recloneResult = await recloneCorruptedMarketplace(marketplacePath, name, repo);
292
- if (recloneResult.success) {
293
- return { name, success: true, updated: true, error: 'Auto-repaired: re-cloned corrupted marketplace' };
294
- }
295
- return { name, success: false, updated: false, error: `Auto-repair failed: ${recloneResult.error}` };
296
- }
297
- // Get current HEAD before pull (async)
298
- const { stdout: beforeHead } = await execAsync('git rev-parse HEAD', {
299
- cwd: marketplacePath,
300
- timeout: 5000,
301
- });
302
- // Run git pull (async) - suppress all output to prevent interference with TUI
303
- await execAsync('git pull --ff-only >/dev/null 2>&1', {
304
- cwd: marketplacePath,
305
- timeout: 30000, // 30s timeout for network operation
306
- shell: '/bin/bash',
307
- });
308
- // Get HEAD after pull (async)
309
- const { stdout: afterHead } = await execAsync('git rev-parse HEAD', {
310
- cwd: marketplacePath,
311
- timeout: 5000,
312
- });
313
- return {
314
- name,
315
- success: true,
316
- updated: beforeHead.trim() !== afterHead.trim(),
317
- };
318
- }
319
- catch (error) {
320
- return {
321
- name,
322
- success: false,
323
- updated: false,
324
- error: error instanceof Error ? error.message : 'Unknown error',
325
- };
326
- }
327
- }
328
- /**
329
- * Refresh all local marketplaces by running git pull on each
330
- * Returns results for each marketplace
331
- * Includes both:
332
- * - Marketplaces in ~/.claude/plugins/marketplaces/
333
- * - Directory-based marketplaces from known_marketplaces.json (if they're git repos)
334
- * @param onProgress - Optional callback for progress updates
335
- */
336
- export async function refreshLocalMarketplaces(onProgress) {
337
- const results = [];
338
- // Collect all marketplace paths to refresh
339
- const marketplacesToRefresh = [];
340
- // 1. Add marketplaces from the standard directory
341
- if (await fs.pathExists(CLAUDE_PLUGINS_DIR)) {
342
- try {
343
- const entries = await fs.readdir(CLAUDE_PLUGINS_DIR, { withFileTypes: true });
344
- for (const entry of entries) {
345
- if (entry.isDirectory()) {
346
- marketplacesToRefresh.push({
347
- name: entry.name,
348
- path: path.join(CLAUDE_PLUGINS_DIR, entry.name),
349
- });
350
- }
351
- }
352
- }
353
- catch {
354
- // Ignore read errors
355
- }
356
- }
357
- // 2. Add directory-based marketplaces from known_marketplaces.json
358
- try {
359
- const known = await readKnownMarketplaces();
360
- for (const [name, entry] of Object.entries(known)) {
361
- // Only add if it's a directory source AND not already in the list
362
- if (entry.source.source === 'directory' &&
363
- entry.installLocation &&
364
- !marketplacesToRefresh.some((m) => m.name === name)) {
365
- // Check if it exists and is a git repo
366
- const gitDir = path.join(entry.installLocation, '.git');
367
- if (fs.existsSync(gitDir)) {
368
- marketplacesToRefresh.push({
369
- name,
370
- path: entry.installLocation,
371
- });
372
- }
373
- }
374
- }
375
- }
376
- catch {
377
- // Ignore errors reading known_marketplaces
378
- }
379
- if (marketplacesToRefresh.length === 0) {
380
- return results;
381
- }
382
- const total = marketplacesToRefresh.length;
383
- let completed = 0;
384
- // Run git pull on all marketplaces in parallel, but track progress
385
- const promises = marketplacesToRefresh.map(async ({ name, path: mpPath }) => {
386
- const result = await refreshSingleMarketplace(mpPath, name);
387
- completed++;
388
- onProgress?.({ current: completed, total, name });
389
- return result;
390
- });
391
- const settled = await Promise.all(promises);
392
- results.push(...settled);
393
- return results;
394
- }
395
- /**
396
- * Clone a marketplace from GitHub repo
397
- * @param repo - GitHub repo in format "owner/repo" or "https://github.com/owner/repo"
398
- */
399
- export async function cloneMarketplace(repo) {
400
- // Normalize repo format: extract "owner/repo" from various inputs
401
- let normalizedRepo = repo.trim();
402
- // Handle full URL: https://github.com/owner/repo or https://github.com/owner/repo.git
403
- if (normalizedRepo.includes('github.com')) {
404
- const match = normalizedRepo.match(/github\.com[/:]([^/]+\/[^/\s.]+)/);
405
- if (match) {
406
- normalizedRepo = match[1].replace(/\.git$/, '');
407
- }
408
- }
409
- // Validate format: owner/repo with alphanumeric, underscore, hyphen only (NO dots to prevent ..)
410
- if (!normalizedRepo.match(/^[a-zA-Z0-9_-]+\/[a-zA-Z0-9_-]+$/)) {
411
- return { success: false, name: '', error: 'Invalid repo format. Use owner/repo (letters, numbers, hyphens, underscores only)' };
412
- }
413
- // Extract marketplace name from repo (last part)
414
- const repoName = normalizedRepo.split('/')[1];
415
- // Defense in depth: explicitly reject path traversal attempts
416
- if (repoName.includes('..') || repoName.includes('/') || repoName.includes('\\')) {
417
- return { success: false, name: '', error: 'Invalid repository name' };
418
- }
419
- // Ensure plugins directory exists
420
- await fs.ensureDir(CLAUDE_PLUGINS_DIR);
421
- const marketplacePath = path.join(CLAUDE_PLUGINS_DIR, repoName);
422
- // Verify resolved path is within expected directory (defense in depth)
423
- const resolvedPath = path.resolve(marketplacePath);
424
- if (!resolvedPath.startsWith(path.resolve(CLAUDE_PLUGINS_DIR))) {
425
- return { success: false, name: '', error: 'Invalid path detected' };
426
- }
427
- // Check if already exists
428
- if (await fs.pathExists(marketplacePath)) {
429
- return { success: false, name: repoName, error: 'Marketplace already exists' };
430
- }
431
- try {
432
- // Clone the repository - suppress output to prevent TUI interference
433
- const cloneUrl = `https://github.com/${normalizedRepo}.git`;
434
- await execAsync(`git clone --depth 1 "${cloneUrl}" "${marketplacePath}" >/dev/null 2>&1`, {
435
- timeout: 60000, // 60s timeout for clone
436
- shell: '/bin/bash',
437
- });
438
- // Verify it's a valid marketplace (has .claude-plugin/marketplace.json)
439
- const manifestPath = path.join(marketplacePath, '.claude-plugin', 'marketplace.json');
440
- if (!(await fs.pathExists(manifestPath))) {
441
- // Not a valid marketplace, clean up
442
- await fs.remove(marketplacePath);
443
- return { success: false, name: repoName, error: 'Not a valid marketplace (no .claude-plugin/marketplace.json)' };
444
- }
445
- return { success: true, name: repoName };
446
- }
447
- catch (error) {
448
- // Clean up on failure
449
- await fs.remove(marketplacePath).catch(() => { });
450
- return {
451
- success: false,
452
- name: repoName,
453
- error: error instanceof Error ? error.message : 'Clone failed',
454
- };
455
- }
456
- }
457
- /**
458
- * Delete a marketplace directory from local cache
459
- */
460
- export async function deleteMarketplace(name) {
461
- // Validate name doesn't contain path traversal
462
- if (name.includes('..') || name.includes('/') || name.includes('\\')) {
463
- throw new Error('Invalid marketplace name');
464
- }
465
- const marketplacePath = path.join(CLAUDE_PLUGINS_DIR, name);
466
- // Verify path is within expected directory (defense in depth)
467
- const resolvedPath = path.resolve(marketplacePath);
468
- if (!resolvedPath.startsWith(path.resolve(CLAUDE_PLUGINS_DIR))) {
469
- throw new Error('Invalid marketplace path');
470
- }
471
- if (await fs.pathExists(marketplacePath)) {
472
- await fs.remove(marketplacePath);
473
- }
474
- }
475
- /**
476
- * Repair a plugin's plugin.json by adding missing agents/commands/skills arrays
477
- * based on what files exist on disk.
478
- *
479
- * This fixes plugins where the author forgot to add the arrays to plugin.json,
480
- * causing Claude Code to not load the agents/commands even though files exist.
481
- */
482
- export async function repairPluginJson(pluginPath) {
483
- const pluginJsonPath = path.join(pluginPath, '.claude-plugin', 'plugin.json');
484
- const pluginName = path.basename(pluginPath);
485
- const result = {
486
- repaired: false,
487
- pluginName,
488
- added: { agents: [], commands: [], skills: [] },
489
- };
490
- if (!(await fs.pathExists(pluginJsonPath))) {
491
- return result;
492
- }
493
- try {
494
- const pluginJson = await fs.readJson(pluginJsonPath);
495
- let modified = false;
496
- // Scan and add agents if array is missing
497
- const agentsDir = path.join(pluginPath, 'agents');
498
- if (await fs.pathExists(agentsDir)) {
499
- const files = (await fs.readdir(agentsDir))
500
- .filter((f) => f.endsWith('.md'))
501
- .map((f) => `./agents/${f}`);
502
- if (files.length > 0 && !pluginJson.agents) {
503
- pluginJson.agents = files;
504
- result.added.agents = files;
505
- modified = true;
506
- }
507
- }
508
- // Scan and add commands if array is missing
509
- const commandsDir = path.join(pluginPath, 'commands');
510
- if (await fs.pathExists(commandsDir)) {
511
- const files = (await fs.readdir(commandsDir))
512
- .filter((f) => f.endsWith('.md'))
513
- .map((f) => `./commands/${f}`);
514
- if (files.length > 0 && !pluginJson.commands) {
515
- pluginJson.commands = files;
516
- result.added.commands = files;
517
- modified = true;
518
- }
519
- }
520
- // Scan and add skills if array is missing
521
- const skillsDir = path.join(pluginPath, 'skills');
522
- if (await fs.pathExists(skillsDir)) {
523
- const entries = await fs.readdir(skillsDir, { withFileTypes: true });
524
- const skills = entries
525
- .filter((e) => e.isDirectory() || e.name.endsWith('.md'))
526
- .map((e) => `./skills/${e.name}`);
527
- if (skills.length > 0 && !pluginJson.skills) {
528
- pluginJson.skills = skills;
529
- result.added.skills = skills;
530
- modified = true;
531
- }
532
- }
533
- if (modified) {
534
- await fs.writeJson(pluginJsonPath, pluginJson, { spaces: 2 });
535
- result.repaired = true;
536
- }
537
- }
538
- catch {
539
- // Ignore repair errors for individual plugins
540
- }
541
- return result;
542
- }
543
- /**
544
- * Repair all plugins in a marketplace
545
- */
546
- export async function repairMarketplacePlugins(marketplaceName) {
547
- const result = {
548
- marketplace: marketplaceName,
549
- repaired: [],
550
- };
551
- const marketplacePath = path.join(CLAUDE_PLUGINS_DIR, marketplaceName);
552
- const manifestPath = path.join(marketplacePath, '.claude-plugin', 'marketplace.json');
553
- if (!(await fs.pathExists(manifestPath))) {
554
- return result;
555
- }
556
- try {
557
- const manifest = await fs.readJson(manifestPath);
558
- if (manifest.plugins && Array.isArray(manifest.plugins)) {
559
- for (const plugin of manifest.plugins) {
560
- if (plugin.source) {
561
- const pluginPath = path.join(marketplacePath, plugin.source.replace('./', ''));
562
- const repairResult = await repairPluginJson(pluginPath);
563
- if (repairResult.repaired) {
564
- result.repaired.push(repairResult);
565
- }
566
- }
567
- }
568
- }
569
- }
570
- catch {
571
- // Ignore errors
572
- }
573
- return result;
574
- }
575
- /**
576
- * Repair all plugins in all marketplaces
577
- */
578
- export async function repairAllMarketplaces() {
579
- const results = [];
580
- if (!(await fs.pathExists(CLAUDE_PLUGINS_DIR))) {
581
- return results;
582
- }
583
- try {
584
- const entries = await fs.readdir(CLAUDE_PLUGINS_DIR, { withFileTypes: true });
585
- for (const entry of entries) {
586
- if (!entry.isDirectory())
587
- continue;
588
- const repairResult = await repairMarketplacePlugins(entry.name);
589
- if (repairResult.repaired.length > 0) {
590
- results.push(repairResult);
591
- }
592
- }
593
- }
594
- catch {
595
- // Return empty on error
596
- }
597
- return results;
598
- }
599
- //# sourceMappingURL=local-marketplace.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"local-marketplace.js","sourceRoot":"","sources":["../../src/services/local-marketplace.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- import type { McpRegistryServer, McpRegistryResponse } from '../types/index.js';
2
- export interface SearchOptions {
3
- query?: string;
4
- limit?: number;
5
- cursor?: string;
6
- }
7
- export declare function searchMcpServers(options?: SearchOptions): Promise<McpRegistryResponse>;
8
- export declare function getPopularServers(limit?: number): Promise<McpRegistryServer[]>;
9
- export declare function formatDate(dateStr?: string): string;
10
- //# sourceMappingURL=mcp-registry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-registry.d.ts","sourceRoot":"","sources":["../../src/services/mcp-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAMhF,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA+DhG;AAED,wBAAsB,iBAAiB,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAIhF;AAED,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAanD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-registry.js","sourceRoot":"","sources":["../../src/services/mcp-registry.ts"],"names":[],"mappings":"AAEA,2CAA2C;AAC3C,qDAAqD;AACrD,MAAM,gBAAgB,GAAG,6CAA6C,CAAC;AAQvE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAyB,EAAE;IAChE,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEnD,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,IAAI,KAAK;QAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,IAAI,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEzC,MAAM,GAAG,GAAG,GAAG,gBAAgB,YAAY,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IAE/D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,OAAO,EAAE;YACP,QAAQ,EAAE,kBAAkB;SAC7B;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,IAAI,GAAQ,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAExC,yDAAyD;IACzD,iDAAiD;IACjD,8DAA8D;IAC9D,MAAM,OAAO,GAAwB,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SACtD,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,yCAAyC;QAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,2CAA2C,CAAC,CAAC;QAEvE,yDAAyD;QACzD,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,IAAI,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9B,CAAC;aAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,qEAAqE;YACrE,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC/B,GAAG,GAAG,GAAG,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QAChD,CAAC;QAED,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,GAAG;YACH,iBAAiB,EAAE,MAAM,CAAC,WAAW,IAAI,gBAAgB;YACzD,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,eAAe,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG;YACvC,gBAAgB,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY;YACpD,YAAY,EAAE,IAAI,EAAE,WAAW;SAChC,CAAC;IACJ,CAAC,CAAC;QACF,yCAAyC;SACxC,MAAM,CAAC,CAAC,CAAoB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC;QAClD,sCAAsC;SACrC,IAAI,CAAC,CAAC,CAAoB,EAAE,CAAoB,EAAE,EAAE;QACnD,IAAI,CAAC,CAAC,CAAC,YAAY;YAAE,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,CAAC,CAAC,YAAY;YAAE,OAAO,CAAC,CAAC,CAAC;QAC/B,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC;IACjF,CAAC,CAAC,CAAC;IAEL,OAAO;QACL,OAAO;QACP,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,IAAI,IAAI,CAAC,WAAW;KAC3D,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAK,GAAG,EAAE;IAChD,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,qDAAqD;IACrD,OAAO,QAAQ,CAAC,OAAO,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAE5D,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACnC,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IACvC,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,GAAG,QAAQ,OAAO,CAAC;IAC5C,IAAI,QAAQ,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC;IAC7D,IAAI,QAAQ,GAAG,GAAG;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC;IAChE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC;AAC9C,CAAC"}