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
@@ -1,13 +1,13 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useEffect, useCallback, useState, useRef } from 'react';
3
- import { Box, Text, useInput } from 'ink';
4
- import { exec, execSync } from 'child_process';
5
- import { promisify } from 'util';
6
- import { useApp, useModal } from '../state/AppContext.js';
7
- import { useDimensions } from '../state/DimensionsContext.js';
8
- import { ScreenLayout } from '../components/layout/index.js';
9
- import { ScrollableList } from '../components/ScrollableList.js';
10
- import { cliTools } from '../../data/cli-tools.js';
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "@opentui/react/jsx-runtime";
2
+ import { useEffect, useCallback, useState, useRef } from "react";
3
+ import { exec, execSync } from "child_process";
4
+ import { promisify } from "util";
5
+ import { useApp, useModal } from "../state/AppContext.js";
6
+ import { useDimensions } from "../state/DimensionsContext.js";
7
+ import { useKeyboard } from "../hooks/useKeyboard.js";
8
+ import { ScreenLayout } from "../components/layout/index.js";
9
+ import { ScrollableList } from "../components/ScrollableList.js";
10
+ import { cliTools } from "../../data/cli-tools.js";
11
11
  const execAsync = promisify(exec);
12
12
  // Session-level cache
13
13
  let cachedToolStatuses = null;
@@ -22,11 +22,11 @@ function parseVersion(versionOutput) {
22
22
  }
23
23
  async function isInstalledViaHomebrew(toolName) {
24
24
  try {
25
- const { stdout } = await execAsync('brew list --formula 2>/dev/null', {
25
+ const { stdout } = await execAsync("brew list --formula 2>/dev/null", {
26
26
  timeout: 2000,
27
- shell: '/bin/bash',
27
+ shell: "/bin/bash",
28
28
  });
29
- const formulas = stdout.trim().split('\n');
29
+ const formulas = stdout.trim().split("\n");
30
30
  return formulas.some((f) => f.trim() === toolName);
31
31
  }
32
32
  catch {
@@ -55,7 +55,7 @@ async function getLatestPipVersion(packageName) {
55
55
  try {
56
56
  const { stdout } = await execAsync(`pip index versions ${packageName} 2>/dev/null | head -1`, {
57
57
  timeout: 10000,
58
- shell: '/bin/bash',
58
+ shell: "/bin/bash",
59
59
  });
60
60
  const match = stdout.trim().match(/\(([^)]+)\)/);
61
61
  return match ? match[1] : undefined;
@@ -65,7 +65,7 @@ async function getLatestPipVersion(packageName) {
65
65
  }
66
66
  }
67
67
  async function getLatestVersion(tool) {
68
- if (tool.packageManager === 'npm') {
68
+ if (tool.packageManager === "npm") {
69
69
  return getLatestNpmVersion(tool.packageName);
70
70
  }
71
71
  else {
@@ -91,12 +91,13 @@ export function CliToolsScreen() {
91
91
  const modal = useModal();
92
92
  const dimensions = useDimensions();
93
93
  const [toolStatuses, setToolStatuses] = useState(() => {
94
- return cachedToolStatuses || cliTools.map((tool) => ({
95
- tool,
96
- installed: false,
97
- installedVersion: undefined,
98
- checking: true,
99
- }));
94
+ return (cachedToolStatuses ||
95
+ cliTools.map((tool) => ({
96
+ tool,
97
+ installed: false,
98
+ installedVersion: undefined,
99
+ checking: true,
100
+ })));
100
101
  });
101
102
  const statusesRef = useRef(toolStatuses);
102
103
  statusesRef.current = toolStatuses;
@@ -140,24 +141,24 @@ export function CliToolsScreen() {
140
141
  }
141
142
  }, [fetchVersionInfo, toolStatuses]);
142
143
  // Keyboard handling
143
- useInput((input, key) => {
144
+ useKeyboard((event) => {
144
145
  if (state.isSearching || state.modal)
145
146
  return;
146
- if (key.upArrow || input === 'k') {
147
+ if (event.name === "up" || event.name === "k") {
147
148
  const newIndex = Math.max(0, cliToolsState.selectedIndex - 1);
148
- dispatch({ type: 'CLITOOLS_SELECT', index: newIndex });
149
+ dispatch({ type: "CLITOOLS_SELECT", index: newIndex });
149
150
  }
150
- else if (key.downArrow || input === 'j') {
151
+ else if (event.name === "down" || event.name === "j") {
151
152
  const newIndex = Math.min(toolStatuses.length - 1, cliToolsState.selectedIndex + 1);
152
- dispatch({ type: 'CLITOOLS_SELECT', index: newIndex });
153
+ dispatch({ type: "CLITOOLS_SELECT", index: newIndex });
153
154
  }
154
- else if (input === 'r') {
155
+ else if (event.name === "r") {
155
156
  handleRefresh();
156
157
  }
157
- else if (input === 'a') {
158
+ else if (event.name === "a") {
158
159
  handleUpdateAll();
159
160
  }
160
- else if (key.return) {
161
+ else if (event.name === "enter") {
161
162
  handleInstall();
162
163
  }
163
164
  });
@@ -177,8 +178,14 @@ export function CliToolsScreen() {
177
178
  if (!status)
178
179
  return;
179
180
  const { tool, installed, hasUpdate } = status;
180
- const action = !installed ? 'Installing' : hasUpdate ? 'Updating' : 'Reinstalling';
181
- const viaHomebrew = installed ? await isInstalledViaHomebrew(tool.name) : false;
181
+ const action = !installed
182
+ ? "Installing"
183
+ : hasUpdate
184
+ ? "Updating"
185
+ : "Reinstalling";
186
+ const viaHomebrew = installed
187
+ ? await isInstalledViaHomebrew(tool.name)
188
+ : false;
182
189
  let command;
183
190
  if (!installed) {
184
191
  command = tool.installCommand;
@@ -192,22 +199,22 @@ export function CliToolsScreen() {
192
199
  modal.loading(`${action} ${tool.displayName}...`);
193
200
  try {
194
201
  execSync(command, {
195
- encoding: 'utf-8',
196
- stdio: 'pipe',
197
- shell: '/bin/bash',
202
+ encoding: "utf-8",
203
+ stdio: "pipe",
204
+ shell: "/bin/bash",
198
205
  });
199
206
  modal.hideModal();
200
207
  handleRefresh();
201
208
  }
202
209
  catch (error) {
203
210
  modal.hideModal();
204
- await modal.message('Error', `Failed to ${action.toLowerCase()} ${tool.displayName}.\n\nTry running manually:\n${command}`, 'error');
211
+ await modal.message("Error", `Failed to ${action.toLowerCase()} ${tool.displayName}.\n\nTry running manually:\n${command}`, "error");
205
212
  }
206
213
  };
207
214
  const handleUpdateAll = async () => {
208
215
  const updatable = toolStatuses.filter((s) => s.hasUpdate);
209
216
  if (updatable.length === 0) {
210
- await modal.message('Up to Date', 'All tools are already up to date.', 'info');
217
+ await modal.message("Up to Date", "All tools are already up to date.", "info");
211
218
  return;
212
219
  }
213
220
  modal.loading(`Updating ${updatable.length} tool(s)...`);
@@ -218,9 +225,9 @@ export function CliToolsScreen() {
218
225
  : status.tool.installCommand;
219
226
  try {
220
227
  execSync(command, {
221
- encoding: 'utf-8',
222
- stdio: 'pipe',
223
- shell: '/bin/bash',
228
+ encoding: "utf-8",
229
+ stdio: "pipe",
230
+ shell: "/bin/bash",
224
231
  });
225
232
  }
226
233
  catch {
@@ -234,35 +241,34 @@ export function CliToolsScreen() {
234
241
  const selectedStatus = toolStatuses[cliToolsState.selectedIndex];
235
242
  const renderDetail = () => {
236
243
  if (!selectedStatus) {
237
- return (_jsx(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", flexGrow: 1, children: _jsx(Text, { color: "gray", children: "Select a tool to see details" }) }));
244
+ return (_jsx("box", { flexDirection: "column", alignItems: "center", justifyContent: "center", flexGrow: 1, children: _jsx("text", { fg: "gray", children: "Select a tool to see details" }) }));
238
245
  }
239
- const { tool, installed, installedVersion, latestVersion, hasUpdate, checking } = selectedStatus;
240
- return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { marginBottom: 1, children: [_jsxs(Text, { bold: true, color: "cyan", children: ["\u2699 ", tool.displayName] }), hasUpdate && _jsx(Text, { color: "yellow", children: " \u2B06" })] }), _jsx(Text, { color: "gray", children: tool.description }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: "gray", children: "Status " }), !installed ? (_jsx(Text, { color: "gray", children: "\u25CB Not installed" })) : checking ? (_jsx(Text, { color: "green", children: "\u25CF Checking..." })) : hasUpdate ? (_jsx(Text, { color: "yellow", children: "\u25CF Update available" })) : (_jsx(Text, { color: "green", children: "\u25CF Up to date" }))] }), installedVersion && (_jsxs(Box, { children: [_jsx(Text, { color: "gray", children: "Installed " }), _jsxs(Text, { color: "green", children: ["v", installedVersion] })] })), latestVersion && (_jsxs(Box, { children: [_jsx(Text, { color: "gray", children: "Latest " }), _jsxs(Text, { color: "white", children: ["v", latestVersion] })] })), _jsxs(Box, { children: [_jsx(Text, { color: "gray", children: "Website " }), _jsx(Text, { color: "blue", children: tool.website })] })] }), _jsx(Box, { marginTop: 2, children: !installed ? (_jsxs(Box, { children: [_jsxs(Text, { backgroundColor: "green", color: "black", children: [' ', "Enter", ' '] }), _jsx(Text, { color: "gray", children: " Install" })] })) : hasUpdate ? (_jsxs(Box, { children: [_jsxs(Text, { backgroundColor: "yellow", color: "black", children: [' ', "Enter", ' '] }), _jsxs(Text, { color: "gray", children: [" Update to v", latestVersion] })] })) : (_jsxs(Box, { children: [_jsxs(Text, { backgroundColor: "gray", color: "white", children: [' ', "Enter", ' '] }), _jsx(Text, { color: "gray", children: " Reinstall" })] })) })] }));
246
+ const { tool, installed, installedVersion, latestVersion, hasUpdate, checking, } = selectedStatus;
247
+ return (_jsxs("box", { flexDirection: "column", children: [_jsxs("box", { marginBottom: 1, children: [_jsx("text", { fg: "cyan", children: _jsxs("strong", { children: ["\u2699 ", tool.displayName] }) }), hasUpdate && _jsx("text", { fg: "yellow", children: " \u2B06" })] }), _jsx("text", { fg: "gray", children: tool.description }), _jsxs("box", { marginTop: 1, flexDirection: "column", children: [_jsxs("box", { children: [_jsx("text", { fg: "gray", children: "Status " }), !installed ? (_jsx("text", { fg: "gray", children: "\u25CB Not installed" })) : checking ? (_jsx("text", { fg: "green", children: "\u25CF Checking..." })) : hasUpdate ? (_jsx("text", { fg: "yellow", children: "\u25CF Update available" })) : (_jsx("text", { fg: "green", children: "\u25CF Up to date" }))] }), installedVersion && (_jsxs("box", { children: [_jsx("text", { fg: "gray", children: "Installed " }), _jsxs("text", { fg: "green", children: ["v", installedVersion] })] })), latestVersion && (_jsxs("box", { children: [_jsx("text", { fg: "gray", children: "Latest " }), _jsxs("text", { fg: "white", children: ["v", latestVersion] })] })), _jsxs("box", { children: [_jsx("text", { fg: "gray", children: "Website " }), _jsx("text", { fg: "blue", children: tool.website })] })] }), _jsx("box", { marginTop: 2, children: !installed ? (_jsxs("box", { children: [_jsxs("text", { bg: "green", fg: "black", children: [" ", "Enter", " "] }), _jsx("text", { fg: "gray", children: " Install" })] })) : hasUpdate ? (_jsxs("box", { children: [_jsxs("text", { bg: "yellow", fg: "black", children: [" ", "Enter", " "] }), _jsxs("text", { fg: "gray", children: [" Update to v", latestVersion] })] })) : (_jsxs("box", { children: [_jsxs("text", { bg: "gray", fg: "white", children: [" ", "Enter", " "] }), _jsx("text", { fg: "gray", children: " Reinstall" })] })) })] }));
241
248
  };
242
249
  const renderListItem = (status, _idx, isSelected) => {
243
250
  const { tool, installed, installedVersion, hasUpdate, checking } = status;
244
251
  let icon;
245
252
  let iconColor;
246
253
  if (!installed) {
247
- icon = '';
248
- iconColor = 'gray';
254
+ icon = "";
255
+ iconColor = "gray";
249
256
  }
250
257
  else if (hasUpdate) {
251
- icon = '';
252
- iconColor = 'yellow';
258
+ icon = "";
259
+ iconColor = "yellow";
253
260
  }
254
261
  else {
255
- icon = '';
256
- iconColor = 'green';
262
+ icon = "";
263
+ iconColor = "green";
257
264
  }
258
- const versionText = installedVersion ? `v${installedVersion}` : '';
259
- return isSelected ? (_jsxs(Text, { backgroundColor: "magenta", color: "white", wrap: "truncate", children: [' ', icon, " ", tool.displayName, " ", versionText, checking ? '...' : '', ' '] })) : (_jsxs(Text, { wrap: "truncate", children: [_jsx(Text, { color: iconColor, children: icon }), _jsxs(Text, { color: "white", children: [" ", tool.displayName] }), versionText && _jsxs(Text, { color: "green", children: [" ", versionText] }), checking && _jsx(Text, { color: "gray", children: "..." })] }));
265
+ const versionText = installedVersion ? `v${installedVersion}` : "";
266
+ return isSelected ? (_jsxs("text", { bg: "magenta", fg: "white", children: [" ", icon, " ", tool.displayName, " ", versionText, checking ? "..." : "", " "] })) : (_jsxs("text", { children: [_jsx("span", { fg: iconColor, children: icon }), _jsxs("span", { fg: "white", children: [" ", tool.displayName] }), versionText && _jsxs("span", { fg: "green", children: [" ", versionText] }), checking && _jsx("span", { fg: "gray", children: "..." })] }));
260
267
  };
261
268
  // Calculate stats for status line
262
- const installedCount = toolStatuses.filter(s => s.installed).length;
263
- const updateCount = toolStatuses.filter(s => s.hasUpdate).length;
264
- const statusContent = (_jsxs(_Fragment, { children: [_jsx(Text, { color: "gray", children: "Installed: " }), _jsxs(Text, { color: "cyan", children: [installedCount, "/", toolStatuses.length] }), updateCount > 0 && (_jsxs(_Fragment, { children: [_jsx(Text, { color: "gray", children: " \u2502 Updates: " }), _jsx(Text, { color: "yellow", children: updateCount })] }))] }));
269
+ const installedCount = toolStatuses.filter((s) => s.installed).length;
270
+ const updateCount = toolStatuses.filter((s) => s.hasUpdate).length;
271
+ const statusContent = (_jsxs(_Fragment, { children: [_jsx("text", { fg: "gray", children: "Installed: " }), _jsxs("text", { fg: "cyan", children: [installedCount, "/", toolStatuses.length] }), updateCount > 0 && (_jsxs(_Fragment, { children: [_jsx("text", { fg: "gray", children: " \u2502 Updates: " }), _jsx("text", { fg: "yellow", children: updateCount })] }))] }));
265
272
  return (_jsx(ScreenLayout, { title: "claudeup CLI Tools", currentScreen: "cli-tools", statusLine: statusContent, footerHints: "\u2191\u2193:nav \u2502 Enter:install \u2502 a:update all \u2502 r:refresh", listPanel: _jsx(ScrollableList, { items: toolStatuses, selectedIndex: cliToolsState.selectedIndex, renderItem: renderListItem, maxHeight: dimensions.listPanelHeight }), detailPanel: renderDetail() }));
266
273
  }
267
274
  export default CliToolsScreen;
268
- //# sourceMappingURL=CliToolsScreen.js.map