claudeup 1.8.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 (301) 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/{dist → src}/prerunner/index.js +31 -41
  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 +0 -1
  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.map +0 -1
  137. package/dist/services/claude-runner.d.ts +0 -7
  138. package/dist/services/claude-runner.d.ts.map +0 -1
  139. package/dist/services/claude-runner.js.map +0 -1
  140. package/dist/services/claude-settings.d.ts +0 -73
  141. package/dist/services/claude-settings.d.ts.map +0 -1
  142. package/dist/services/claude-settings.js.map +0 -1
  143. package/dist/services/local-marketplace.d.ts +0 -111
  144. package/dist/services/local-marketplace.d.ts.map +0 -1
  145. package/dist/services/local-marketplace.js +0 -599
  146. package/dist/services/local-marketplace.js.map +0 -1
  147. package/dist/services/mcp-registry.d.ts +0 -10
  148. package/dist/services/mcp-registry.d.ts.map +0 -1
  149. package/dist/services/mcp-registry.js.map +0 -1
  150. package/dist/services/plugin-manager.d.ts +0 -65
  151. package/dist/services/plugin-manager.d.ts.map +0 -1
  152. package/dist/services/plugin-manager.js.map +0 -1
  153. package/dist/services/plugin-mcp-config.d.ts +0 -52
  154. package/dist/services/plugin-mcp-config.d.ts.map +0 -1
  155. package/dist/services/plugin-mcp-config.js.map +0 -1
  156. package/dist/services/update-cache.d.ts +0 -21
  157. package/dist/services/update-cache.d.ts.map +0 -1
  158. package/dist/services/update-cache.js.map +0 -1
  159. package/dist/services/version-check.d.ts +0 -20
  160. package/dist/services/version-check.d.ts.map +0 -1
  161. package/dist/services/version-check.js.map +0 -1
  162. package/dist/types/index.d.ts +0 -105
  163. package/dist/types/index.d.ts.map +0 -1
  164. package/dist/types/index.js +0 -2
  165. package/dist/types/index.js.map +0 -1
  166. package/dist/ui/InkApp.d.ts +0 -5
  167. package/dist/ui/InkApp.d.ts.map +0 -1
  168. package/dist/ui/InkApp.js +0 -188
  169. package/dist/ui/InkApp.js.map +0 -1
  170. package/dist/ui/components/CategoryHeader.d.ts +0 -16
  171. package/dist/ui/components/CategoryHeader.d.ts.map +0 -1
  172. package/dist/ui/components/CategoryHeader.js +0 -11
  173. package/dist/ui/components/CategoryHeader.js.map +0 -1
  174. package/dist/ui/components/ScrollableList.d.ts +0 -16
  175. package/dist/ui/components/ScrollableList.d.ts.map +0 -1
  176. package/dist/ui/components/ScrollableList.js.map +0 -1
  177. package/dist/ui/components/SearchInput.d.ts +0 -18
  178. package/dist/ui/components/SearchInput.d.ts.map +0 -1
  179. package/dist/ui/components/SearchInput.js +0 -30
  180. package/dist/ui/components/SearchInput.js.map +0 -1
  181. package/dist/ui/components/TabBar.d.ts +0 -8
  182. package/dist/ui/components/TabBar.d.ts.map +0 -1
  183. package/dist/ui/components/TabBar.js +0 -18
  184. package/dist/ui/components/TabBar.js.map +0 -1
  185. package/dist/ui/components/layout/Footer.d.ts +0 -14
  186. package/dist/ui/components/layout/Footer.d.ts.map +0 -1
  187. package/dist/ui/components/layout/Footer.js +0 -23
  188. package/dist/ui/components/layout/Footer.js.map +0 -1
  189. package/dist/ui/components/layout/Header.d.ts +0 -4
  190. package/dist/ui/components/layout/Header.d.ts.map +0 -1
  191. package/dist/ui/components/layout/Header.js +0 -25
  192. package/dist/ui/components/layout/Header.js.map +0 -1
  193. package/dist/ui/components/layout/Panel.d.ts +0 -22
  194. package/dist/ui/components/layout/Panel.d.ts.map +0 -1
  195. package/dist/ui/components/layout/Panel.js +0 -8
  196. package/dist/ui/components/layout/Panel.js.map +0 -1
  197. package/dist/ui/components/layout/ProgressBar.d.ts +0 -12
  198. package/dist/ui/components/layout/ProgressBar.d.ts.map +0 -1
  199. package/dist/ui/components/layout/ProgressBar.js +0 -16
  200. package/dist/ui/components/layout/ProgressBar.js.map +0 -1
  201. package/dist/ui/components/layout/ScopeTabs.d.ts +0 -12
  202. package/dist/ui/components/layout/ScopeTabs.d.ts.map +0 -1
  203. package/dist/ui/components/layout/ScopeTabs.js +0 -8
  204. package/dist/ui/components/layout/ScopeTabs.js.map +0 -1
  205. package/dist/ui/components/layout/ScreenLayout.d.ts +0 -30
  206. package/dist/ui/components/layout/ScreenLayout.d.ts.map +0 -1
  207. package/dist/ui/components/layout/ScreenLayout.js +0 -23
  208. package/dist/ui/components/layout/ScreenLayout.js.map +0 -1
  209. package/dist/ui/components/layout/index.d.ts +0 -7
  210. package/dist/ui/components/layout/index.d.ts.map +0 -1
  211. package/dist/ui/components/layout/index.js +0 -7
  212. package/dist/ui/components/layout/index.js.map +0 -1
  213. package/dist/ui/components/modals/ConfirmModal.d.ts +0 -14
  214. package/dist/ui/components/modals/ConfirmModal.d.ts.map +0 -1
  215. package/dist/ui/components/modals/ConfirmModal.js +0 -15
  216. package/dist/ui/components/modals/ConfirmModal.js.map +0 -1
  217. package/dist/ui/components/modals/InputModal.d.ts +0 -16
  218. package/dist/ui/components/modals/InputModal.d.ts.map +0 -1
  219. package/dist/ui/components/modals/InputModal.js +0 -23
  220. package/dist/ui/components/modals/InputModal.js.map +0 -1
  221. package/dist/ui/components/modals/LoadingModal.d.ts +0 -8
  222. package/dist/ui/components/modals/LoadingModal.d.ts.map +0 -1
  223. package/dist/ui/components/modals/LoadingModal.js +0 -8
  224. package/dist/ui/components/modals/LoadingModal.js.map +0 -1
  225. package/dist/ui/components/modals/MessageModal.d.ts +0 -14
  226. package/dist/ui/components/modals/MessageModal.d.ts.map +0 -1
  227. package/dist/ui/components/modals/MessageModal.js +0 -17
  228. package/dist/ui/components/modals/MessageModal.js.map +0 -1
  229. package/dist/ui/components/modals/ModalContainer.d.ts +0 -7
  230. package/dist/ui/components/modals/ModalContainer.d.ts.map +0 -1
  231. package/dist/ui/components/modals/ModalContainer.js +0 -38
  232. package/dist/ui/components/modals/ModalContainer.js.map +0 -1
  233. package/dist/ui/components/modals/SelectModal.d.ts +0 -17
  234. package/dist/ui/components/modals/SelectModal.d.ts.map +0 -1
  235. package/dist/ui/components/modals/SelectModal.js +0 -33
  236. package/dist/ui/components/modals/SelectModal.js.map +0 -1
  237. package/dist/ui/components/modals/index.d.ts +0 -7
  238. package/dist/ui/components/modals/index.d.ts.map +0 -1
  239. package/dist/ui/components/modals/index.js +0 -7
  240. package/dist/ui/components/modals/index.js.map +0 -1
  241. package/dist/ui/hooks/index.d.ts +0 -3
  242. package/dist/ui/hooks/index.d.ts.map +0 -1
  243. package/dist/ui/hooks/index.js +0 -3
  244. package/dist/ui/hooks/index.js.map +0 -1
  245. package/dist/ui/hooks/useAsyncData.d.ts +0 -40
  246. package/dist/ui/hooks/useAsyncData.d.ts.map +0 -1
  247. package/dist/ui/hooks/useAsyncData.js.map +0 -1
  248. package/dist/ui/hooks/useKeyboardNavigation.d.ts +0 -27
  249. package/dist/ui/hooks/useKeyboardNavigation.d.ts.map +0 -1
  250. package/dist/ui/hooks/useKeyboardNavigation.js +0 -82
  251. package/dist/ui/hooks/useKeyboardNavigation.js.map +0 -1
  252. package/dist/ui/screens/CliToolsScreen.d.ts +0 -4
  253. package/dist/ui/screens/CliToolsScreen.d.ts.map +0 -1
  254. package/dist/ui/screens/CliToolsScreen.js.map +0 -1
  255. package/dist/ui/screens/EnvVarsScreen.d.ts +0 -4
  256. package/dist/ui/screens/EnvVarsScreen.d.ts.map +0 -1
  257. package/dist/ui/screens/EnvVarsScreen.js +0 -145
  258. package/dist/ui/screens/EnvVarsScreen.js.map +0 -1
  259. package/dist/ui/screens/McpRegistryScreen.d.ts +0 -4
  260. package/dist/ui/screens/McpRegistryScreen.d.ts.map +0 -1
  261. package/dist/ui/screens/McpRegistryScreen.js.map +0 -1
  262. package/dist/ui/screens/McpScreen.d.ts +0 -4
  263. package/dist/ui/screens/McpScreen.d.ts.map +0 -1
  264. package/dist/ui/screens/McpScreen.js.map +0 -1
  265. package/dist/ui/screens/ModelSelectorScreen.d.ts +0 -4
  266. package/dist/ui/screens/ModelSelectorScreen.d.ts.map +0 -1
  267. package/dist/ui/screens/ModelSelectorScreen.js +0 -143
  268. package/dist/ui/screens/ModelSelectorScreen.js.map +0 -1
  269. package/dist/ui/screens/PluginsScreen.d.ts +0 -4
  270. package/dist/ui/screens/PluginsScreen.d.ts.map +0 -1
  271. package/dist/ui/screens/PluginsScreen.js.map +0 -1
  272. package/dist/ui/screens/StatusLineScreen.d.ts +0 -4
  273. package/dist/ui/screens/StatusLineScreen.d.ts.map +0 -1
  274. package/dist/ui/screens/StatusLineScreen.js +0 -197
  275. package/dist/ui/screens/StatusLineScreen.js.map +0 -1
  276. package/dist/ui/screens/index.d.ts +0 -8
  277. package/dist/ui/screens/index.d.ts.map +0 -1
  278. package/dist/ui/screens/index.js +0 -8
  279. package/dist/ui/screens/index.js.map +0 -1
  280. package/dist/ui/state/AppContext.d.ts +0 -40
  281. package/dist/ui/state/AppContext.d.ts.map +0 -1
  282. package/dist/ui/state/AppContext.js.map +0 -1
  283. package/dist/ui/state/DimensionsContext.d.ts +0 -27
  284. package/dist/ui/state/DimensionsContext.d.ts.map +0 -1
  285. package/dist/ui/state/DimensionsContext.js.map +0 -1
  286. package/dist/ui/state/reducer.d.ts +0 -4
  287. package/dist/ui/state/reducer.d.ts.map +0 -1
  288. package/dist/ui/state/reducer.js.map +0 -1
  289. package/dist/ui/state/types.d.ts +0 -266
  290. package/dist/ui/state/types.d.ts.map +0 -1
  291. package/dist/ui/state/types.js +0 -2
  292. package/dist/ui/state/types.js.map +0 -1
  293. package/dist/utils/command-utils.d.ts +0 -8
  294. package/dist/utils/command-utils.d.ts.map +0 -1
  295. package/dist/utils/command-utils.js.map +0 -1
  296. package/dist/utils/fuzzy-search.d.ts +0 -33
  297. package/dist/utils/fuzzy-search.d.ts.map +0 -1
  298. package/dist/utils/fuzzy-search.js.map +0 -1
  299. package/dist/utils/string-utils.d.ts +0 -24
  300. package/dist/utils/string-utils.d.ts.map +0 -1
  301. package/dist/utils/string-utils.js.map +0 -1
package/bin/claudeup.js CHANGED
@@ -1,6 +1,24 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env bun
2
2
 
3
- import('../dist/main.js').catch((err) => {
3
+ // Check Bun version
4
+ const bunVersion = process.versions.bun;
5
+ if (!bunVersion) {
6
+ console.error('Error: claudeup v3.0.0+ requires Bun runtime.');
7
+ console.error('Please install Bun: https://bun.sh');
8
+ console.error('');
9
+ console.error('Quick install:');
10
+ console.error(' curl -fsSL https://bun.sh/install | bash');
11
+ process.exit(1);
12
+ }
13
+
14
+ const [major] = bunVersion.split('.').map(Number);
15
+ if (major < 1) {
16
+ console.error(`Error: claudeup requires Bun >=1.0.0 (current: ${bunVersion})`);
17
+ console.error('Please upgrade Bun: bun upgrade');
18
+ process.exit(1);
19
+ }
20
+
21
+ import('../src/main.tsx').catch((err) => {
4
22
  console.error('Failed to start claudeup:', err.message);
5
23
  process.exit(1);
6
24
  });
package/package.json CHANGED
@@ -1,18 +1,15 @@
1
1
  {
2
2
  "name": "claudeup",
3
- "version": "1.8.0",
3
+ "version": "3.3.0",
4
4
  "description": "TUI tool for managing Claude Code plugins, MCPs, and configuration",
5
5
  "type": "module",
6
- "main": "dist/main.js",
6
+ "main": "src/main.tsx",
7
7
  "bin": {
8
8
  "claudeup": "bin/claudeup.js"
9
9
  },
10
10
  "scripts": {
11
- "build": "tsc",
11
+ "start": "bun run src/main.tsx",
12
12
  "dev": "bun --watch src/main.tsx",
13
- "dev:tsc": "tsc -w",
14
- "start": "node dist/main.js",
15
- "start:bun": "bun run src/main.tsx",
16
13
  "lint": "npm run eslint",
17
14
  "format": "biome format --write src/",
18
15
  "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"",
@@ -30,7 +27,7 @@
30
27
  "plugins",
31
28
  "tui",
32
29
  "cli",
33
- "ink",
30
+ "opentui",
34
31
  "react"
35
32
  ],
36
33
  "author": "Jack Rudenko <i@madappgang.com>",
@@ -44,32 +41,26 @@
44
41
  },
45
42
  "homepage": "https://github.com/MadAppGang/claude-code/tree/main/tools/claudeup#readme",
46
43
  "engines": {
47
- "node": ">=18.0.0"
44
+ "bun": ">=1.0.0"
48
45
  },
49
46
  "files": [
50
47
  "bin/",
51
- "dist/"
48
+ "src/"
52
49
  ],
53
50
  "dependencies": {
54
- "@inkjs/ui": "^2.0.0",
55
- "@pppp606/ink-chart": "^0.2.3",
51
+ "@opentui/core": "^0.1.75",
52
+ "@opentui/react": "^0.1.75",
56
53
  "chalk": "^5.3.0",
57
54
  "fs-extra": "^11.2.0",
58
- "ink": "^5.1.0",
59
- "ink-chart": "^0.1.1",
60
- "ink-markdown": "^1.0.4",
61
- "ink-spinner": "^5.0.0",
62
- "ink-text-input": "^6.0.0",
63
- "react": "^18.3.1",
55
+ "react": "^19.0.0",
64
56
  "semver": "^7.6.3"
65
57
  },
66
58
  "devDependencies": {
67
59
  "@biomejs/biome": "^1.9.4",
68
60
  "@types/fs-extra": "^11.0.4",
69
61
  "@types/node": "^22.9.0",
70
- "@types/react": "^18.3.18",
62
+ "@types/react": "^19.0.0",
71
63
  "@types/semver": "^7.5.8",
72
- "ink-testing-library": "^4.0.0",
73
64
  "typescript": "^5.6.3"
74
65
  },
75
66
  "templateOSS": {
@@ -0,0 +1,123 @@
1
+ export const cliTools = [
2
+ {
3
+ name: "claudeup",
4
+ displayName: "claudeup",
5
+ description: "TUI tool for managing Claude Code plugins, MCPs, and configuration",
6
+ installCommand: "npm install -g claudeup",
7
+ checkCommand: "claudeup --version",
8
+ website: "https://github.com/MadAppGang/claude-code/tree/main/tools/claudeup",
9
+ category: "ai-coding",
10
+ packageManager: "npm",
11
+ packageName: "claudeup",
12
+ },
13
+ {
14
+ name: "claudemem",
15
+ displayName: "Claudemem",
16
+ description: "Local semantic code search for Claude Code with vector embeddings",
17
+ installCommand: "npm install -g claude-codemem",
18
+ checkCommand: "claudemem --version",
19
+ website: "https://github.com/MadAppGang/claudemem",
20
+ category: "ai-coding",
21
+ packageManager: "npm",
22
+ packageName: "claude-codemem",
23
+ },
24
+ {
25
+ name: "claudish",
26
+ displayName: "Claudish",
27
+ description: "Run Claude Code with OpenRouter models (Grok, GPT-5, Gemini)",
28
+ installCommand: "npm install -g claudish",
29
+ checkCommand: "claudish --version",
30
+ website: "https://github.com/MadAppGang/claudish",
31
+ category: "ai-coding",
32
+ packageManager: "npm",
33
+ packageName: "claudish",
34
+ },
35
+ {
36
+ name: "claude",
37
+ displayName: "Claude Code",
38
+ description: "Anthropic official agentic coding tool",
39
+ installCommand: "npm install -g @anthropic-ai/claude-code",
40
+ checkCommand: "claude --version",
41
+ website: "https://claude.ai/code",
42
+ category: "ai-coding",
43
+ packageManager: "npm",
44
+ packageName: "@anthropic-ai/claude-code",
45
+ },
46
+ {
47
+ name: "codex",
48
+ displayName: "OpenAI Codex",
49
+ description: "Lightweight coding agent from OpenAI that runs in your terminal",
50
+ installCommand: "npm install -g @openai/codex",
51
+ checkCommand: "codex --version",
52
+ website: "https://github.com/openai/codex",
53
+ category: "ai-coding",
54
+ packageManager: "npm",
55
+ packageName: "@openai/codex",
56
+ },
57
+ {
58
+ name: "gemini",
59
+ displayName: "Gemini CLI",
60
+ description: "Google AI agent with 1M token context, free tier available",
61
+ installCommand: "npm install -g @google/gemini-cli",
62
+ checkCommand: "gemini --version",
63
+ website: "https://github.com/google-gemini/gemini-cli",
64
+ category: "ai-coding",
65
+ packageManager: "npm",
66
+ packageName: "@google/gemini-cli",
67
+ },
68
+ {
69
+ name: "qwen",
70
+ displayName: "Qwen Code",
71
+ description: "Alibaba coding agent optimized for Qwen3-Coder models",
72
+ installCommand: "npm install -g @qwen-code/qwen-code",
73
+ checkCommand: "qwen --version",
74
+ website: "https://github.com/QwenLM/qwen-code",
75
+ category: "ai-coding",
76
+ packageManager: "npm",
77
+ packageName: "@qwen-code/qwen-code",
78
+ },
79
+ {
80
+ name: "cline",
81
+ displayName: "Cline",
82
+ description: "Autonomous coding agent with plan & act, checkpoints, browser use",
83
+ installCommand: "npm install -g cline",
84
+ checkCommand: "cline --version",
85
+ website: "https://cline.bot",
86
+ category: "ai-coding",
87
+ packageManager: "npm",
88
+ packageName: "cline",
89
+ },
90
+ {
91
+ name: "opencode",
92
+ displayName: "OpenCode",
93
+ description: "Open source AI coding agent trusted by 400k+ developers",
94
+ installCommand: "npm install -g opencode-ai",
95
+ checkCommand: "opencode --version",
96
+ website: "https://opencode.ai",
97
+ category: "ai-coding",
98
+ packageManager: "npm",
99
+ packageName: "opencode-ai",
100
+ },
101
+ {
102
+ name: "aider",
103
+ displayName: "Aider",
104
+ description: "AI pair programming - works with Claude, GPT-4, local models",
105
+ installCommand: "pip install aider-install && aider-install",
106
+ checkCommand: "aider --version",
107
+ website: "https://aider.chat",
108
+ category: "ai-coding",
109
+ packageManager: "pip",
110
+ packageName: "aider-chat",
111
+ },
112
+ {
113
+ name: "crush",
114
+ displayName: "Crush",
115
+ description: "AI coding assistant from Charm with terminal-native UX",
116
+ installCommand: "npm install -g @charmland/crush",
117
+ checkCommand: "crush --version",
118
+ website: "https://github.com/charmbracelet/crush",
119
+ category: "ai-coding",
120
+ packageManager: "npm",
121
+ packageName: "@charmland/crush",
122
+ },
123
+ ];
@@ -0,0 +1,140 @@
1
+ export interface CliTool {
2
+ name: string;
3
+ displayName: string;
4
+ description: string;
5
+ installCommand: string;
6
+ checkCommand: string;
7
+ website: string;
8
+ category: "ai-coding" | "utility";
9
+ packageManager: "npm" | "pip";
10
+ packageName: string;
11
+ }
12
+
13
+ export const cliTools: CliTool[] = [
14
+ {
15
+ name: "claudeup",
16
+ displayName: "claudeup",
17
+ description:
18
+ "TUI tool for managing Claude Code plugins, MCPs, and configuration",
19
+ installCommand: "npm install -g claudeup",
20
+ checkCommand: "claudeup --version",
21
+ website:
22
+ "https://github.com/MadAppGang/claude-code/tree/main/tools/claudeup",
23
+ category: "ai-coding",
24
+ packageManager: "npm",
25
+ packageName: "claudeup",
26
+ },
27
+ {
28
+ name: "claudemem",
29
+ displayName: "Claudemem",
30
+ description:
31
+ "Local semantic code search for Claude Code with vector embeddings",
32
+ installCommand: "npm install -g claude-codemem",
33
+ checkCommand: "claudemem --version",
34
+ website: "https://github.com/MadAppGang/claudemem",
35
+ category: "ai-coding",
36
+ packageManager: "npm",
37
+ packageName: "claude-codemem",
38
+ },
39
+ {
40
+ name: "claudish",
41
+ displayName: "Claudish",
42
+ description: "Run Claude Code with OpenRouter models (Grok, GPT-5, Gemini)",
43
+ installCommand: "npm install -g claudish",
44
+ checkCommand: "claudish --version",
45
+ website: "https://github.com/MadAppGang/claudish",
46
+ category: "ai-coding",
47
+ packageManager: "npm",
48
+ packageName: "claudish",
49
+ },
50
+ {
51
+ name: "claude",
52
+ displayName: "Claude Code",
53
+ description: "Anthropic official agentic coding tool",
54
+ installCommand: "npm install -g @anthropic-ai/claude-code",
55
+ checkCommand: "claude --version",
56
+ website: "https://claude.ai/code",
57
+ category: "ai-coding",
58
+ packageManager: "npm",
59
+ packageName: "@anthropic-ai/claude-code",
60
+ },
61
+ {
62
+ name: "codex",
63
+ displayName: "OpenAI Codex",
64
+ description:
65
+ "Lightweight coding agent from OpenAI that runs in your terminal",
66
+ installCommand: "npm install -g @openai/codex",
67
+ checkCommand: "codex --version",
68
+ website: "https://github.com/openai/codex",
69
+ category: "ai-coding",
70
+ packageManager: "npm",
71
+ packageName: "@openai/codex",
72
+ },
73
+ {
74
+ name: "gemini",
75
+ displayName: "Gemini CLI",
76
+ description: "Google AI agent with 1M token context, free tier available",
77
+ installCommand: "npm install -g @google/gemini-cli",
78
+ checkCommand: "gemini --version",
79
+ website: "https://github.com/google-gemini/gemini-cli",
80
+ category: "ai-coding",
81
+ packageManager: "npm",
82
+ packageName: "@google/gemini-cli",
83
+ },
84
+ {
85
+ name: "qwen",
86
+ displayName: "Qwen Code",
87
+ description: "Alibaba coding agent optimized for Qwen3-Coder models",
88
+ installCommand: "npm install -g @qwen-code/qwen-code",
89
+ checkCommand: "qwen --version",
90
+ website: "https://github.com/QwenLM/qwen-code",
91
+ category: "ai-coding",
92
+ packageManager: "npm",
93
+ packageName: "@qwen-code/qwen-code",
94
+ },
95
+ {
96
+ name: "cline",
97
+ displayName: "Cline",
98
+ description:
99
+ "Autonomous coding agent with plan & act, checkpoints, browser use",
100
+ installCommand: "npm install -g cline",
101
+ checkCommand: "cline --version",
102
+ website: "https://cline.bot",
103
+ category: "ai-coding",
104
+ packageManager: "npm",
105
+ packageName: "cline",
106
+ },
107
+ {
108
+ name: "opencode",
109
+ displayName: "OpenCode",
110
+ description: "Open source AI coding agent trusted by 400k+ developers",
111
+ installCommand: "npm install -g opencode-ai",
112
+ checkCommand: "opencode --version",
113
+ website: "https://opencode.ai",
114
+ category: "ai-coding",
115
+ packageManager: "npm",
116
+ packageName: "opencode-ai",
117
+ },
118
+ {
119
+ name: "aider",
120
+ displayName: "Aider",
121
+ description: "AI pair programming - works with Claude, GPT-4, local models",
122
+ installCommand: "pip install aider-install && aider-install",
123
+ checkCommand: "aider --version",
124
+ website: "https://aider.chat",
125
+ category: "ai-coding",
126
+ packageManager: "pip",
127
+ packageName: "aider-chat",
128
+ },
129
+ {
130
+ name: "crush",
131
+ displayName: "Crush",
132
+ description: "AI coding assistant from Charm with terminal-native UX",
133
+ installCommand: "npm install -g @charmland/crush",
134
+ checkCommand: "crush --version",
135
+ website: "https://github.com/charmbracelet/crush",
136
+ category: "ai-coding",
137
+ packageManager: "npm",
138
+ packageName: "@charmland/crush",
139
+ },
140
+ ];
@@ -1,34 +1,34 @@
1
- import { formatMarketplaceName } from '../utils/string-utils.js';
1
+ import { formatMarketplaceName } from "../utils/string-utils.js";
2
2
  export const defaultMarketplaces = [
3
3
  {
4
- name: 'mag-claude-plugins',
5
- displayName: 'MadAppGang Plugins',
4
+ name: "mag-claude-plugins",
5
+ displayName: "MadAppGang Plugins",
6
6
  source: {
7
- source: 'github',
8
- repo: 'MadAppGang/claude-code',
7
+ source: "github",
8
+ repo: "MadAppGang/claude-code",
9
9
  },
10
- description: 'Professional plugins for frontend, backend, and code analysis',
10
+ description: "Professional plugins for frontend, backend, and code analysis",
11
11
  official: false,
12
12
  featured: true, // Always show plugins (expanded by default)
13
13
  },
14
14
  {
15
- name: 'claude-plugins-official',
16
- displayName: 'Anthropic Official',
15
+ name: "claude-plugins-official",
16
+ displayName: "Anthropic Official",
17
17
  source: {
18
- source: 'github',
19
- repo: 'anthropics/claude-plugins-official',
18
+ source: "github",
19
+ repo: "anthropics/claude-plugins-official",
20
20
  },
21
- description: 'Official Anthropic-managed directory of high quality Claude Code plugins',
21
+ description: "Official Anthropic-managed directory of high quality Claude Code plugins",
22
22
  official: true,
23
23
  },
24
24
  {
25
- name: 'claude-code-plugins',
26
- displayName: 'Anthropic Deprecated',
25
+ name: "claude-code-plugins",
26
+ displayName: "Anthropic Deprecated",
27
27
  source: {
28
- source: 'github',
29
- repo: 'anthropics/claude-code',
28
+ source: "github",
29
+ repo: "anthropics/claude-code",
30
30
  },
31
- description: 'Legacy demo plugins from Anthropic (deprecated - use Official instead)',
31
+ description: "Legacy demo plugins from Anthropic (deprecated - use Official instead)",
32
32
  official: true,
33
33
  },
34
34
  ];
@@ -44,7 +44,7 @@ export function getAllMarketplaces(localMarketplaces) {
44
44
  // Primary source: local cache (what's actually cloned)
45
45
  if (localMarketplaces) {
46
46
  for (const [name, local] of localMarketplaces) {
47
- const repo = local.gitRepo || '';
47
+ const repo = local.gitRepo || "";
48
48
  if (repo)
49
49
  seenRepos.add(repo.toLowerCase());
50
50
  // Check if this marketplace has defaults (for official/featured flags)
@@ -52,16 +52,16 @@ export function getAllMarketplaces(localMarketplaces) {
52
52
  all.set(name, {
53
53
  name,
54
54
  displayName: local.name || formatMarketplaceName(name),
55
- source: { source: 'github', repo },
56
- description: local.description || '',
57
- official: defaultMp?.official ?? repo.toLowerCase().includes('anthropics/'),
55
+ source: { source: "github", repo },
56
+ description: local.description || "",
57
+ official: defaultMp?.official ?? repo.toLowerCase().includes("anthropics/"),
58
58
  featured: defaultMp?.featured,
59
59
  });
60
60
  }
61
61
  }
62
62
  // Fallback: hardcoded defaults (only if their repo isn't already represented)
63
63
  for (const mp of defaultMarketplaces) {
64
- const repo = mp.source.repo?.toLowerCase() || '';
64
+ const repo = mp.source.repo?.toLowerCase() || "";
65
65
  if (!all.has(mp.name) && !seenRepos.has(repo)) {
66
66
  all.set(mp.name, mp);
67
67
  if (repo)
@@ -71,8 +71,8 @@ export function getAllMarketplaces(localMarketplaces) {
71
71
  // Sort: MadAppGang first, then alphabetically
72
72
  return Array.from(all.values()).sort((a, b) => {
73
73
  // MadAppGang always first
74
- const aIsMag = a.source.repo?.toLowerCase().includes('madappgang/');
75
- const bIsMag = b.source.repo?.toLowerCase().includes('madappgang/');
74
+ const aIsMag = a.source.repo?.toLowerCase().includes("madappgang/");
75
+ const bIsMag = b.source.repo?.toLowerCase().includes("madappgang/");
76
76
  if (aIsMag && !bIsMag)
77
77
  return -1;
78
78
  if (!aIsMag && bIsMag)
@@ -81,4 +81,3 @@ export function getAllMarketplaces(localMarketplaces) {
81
81
  return (a.displayName || a.name).localeCompare(b.displayName || b.name);
82
82
  });
83
83
  }
84
- //# sourceMappingURL=marketplaces.js.map
@@ -0,0 +1,95 @@
1
+ import type { Marketplace } from "../types/index.js";
2
+ import type { LocalMarketplace } from "../services/local-marketplace.js";
3
+ import { formatMarketplaceName } from "../utils/string-utils.js";
4
+
5
+ export const defaultMarketplaces: Marketplace[] = [
6
+ {
7
+ name: "mag-claude-plugins",
8
+ displayName: "MadAppGang Plugins",
9
+ source: {
10
+ source: "github",
11
+ repo: "MadAppGang/claude-code",
12
+ },
13
+ description:
14
+ "Professional plugins for frontend, backend, and code analysis",
15
+ official: false,
16
+ featured: true, // Always show plugins (expanded by default)
17
+ },
18
+ {
19
+ name: "claude-plugins-official",
20
+ displayName: "Anthropic Official",
21
+ source: {
22
+ source: "github",
23
+ repo: "anthropics/claude-plugins-official",
24
+ },
25
+ description:
26
+ "Official Anthropic-managed directory of high quality Claude Code plugins",
27
+ official: true,
28
+ },
29
+ {
30
+ name: "claude-code-plugins",
31
+ displayName: "Anthropic Deprecated",
32
+ source: {
33
+ source: "github",
34
+ repo: "anthropics/claude-code",
35
+ },
36
+ description:
37
+ "Legacy demo plugins from Anthropic (deprecated - use Official instead)",
38
+ official: true,
39
+ },
40
+ ];
41
+
42
+ export function getMarketplaceByName(name: string): Marketplace | undefined {
43
+ return defaultMarketplaces.find((m) => m.name === name);
44
+ }
45
+
46
+ // Get all available marketplaces from local cache + hardcoded defaults
47
+ // Local cache is primary source of truth, defaults are fallback
48
+ // Deduplicates by repo URL to avoid showing same marketplace twice
49
+ export function getAllMarketplaces(
50
+ localMarketplaces?: Map<string, LocalMarketplace>,
51
+ ): Marketplace[] {
52
+ const all = new Map<string, Marketplace>();
53
+ const seenRepos = new Set<string>();
54
+
55
+ // Primary source: local cache (what's actually cloned)
56
+ if (localMarketplaces) {
57
+ for (const [name, local] of localMarketplaces) {
58
+ const repo = local.gitRepo || "";
59
+ if (repo) seenRepos.add(repo.toLowerCase());
60
+
61
+ // Check if this marketplace has defaults (for official/featured flags)
62
+ const defaultMp = defaultMarketplaces.find((m) => m.name === name);
63
+
64
+ all.set(name, {
65
+ name,
66
+ displayName: local.name || formatMarketplaceName(name),
67
+ source: { source: "github" as const, repo },
68
+ description: local.description || "",
69
+ official:
70
+ defaultMp?.official ?? repo.toLowerCase().includes("anthropics/"),
71
+ featured: defaultMp?.featured,
72
+ });
73
+ }
74
+ }
75
+
76
+ // Fallback: hardcoded defaults (only if their repo isn't already represented)
77
+ for (const mp of defaultMarketplaces) {
78
+ const repo = mp.source.repo?.toLowerCase() || "";
79
+ if (!all.has(mp.name) && !seenRepos.has(repo)) {
80
+ all.set(mp.name, mp);
81
+ if (repo) seenRepos.add(repo);
82
+ }
83
+ }
84
+
85
+ // Sort: MadAppGang first, then alphabetically
86
+ return Array.from(all.values()).sort((a, b) => {
87
+ // MadAppGang always first
88
+ const aIsMag = a.source.repo?.toLowerCase().includes("madappgang/");
89
+ const bIsMag = b.source.repo?.toLowerCase().includes("madappgang/");
90
+ if (aIsMag && !bIsMag) return -1;
91
+ if (!aIsMag && bIsMag) return 1;
92
+ // Then alphabetically by display name
93
+ return (a.displayName || a.name).localeCompare(b.displayName || b.name);
94
+ });
95
+ }