claudeup 0.6.4 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/bin/claudeup.js +1 -1
  2. package/dist/data/marketplaces.d.ts +2 -0
  3. package/dist/data/marketplaces.d.ts.map +1 -1
  4. package/dist/data/marketplaces.js +51 -8
  5. package/dist/data/marketplaces.js.map +1 -1
  6. package/dist/data/mcp-servers.d.ts.map +1 -1
  7. package/dist/data/mcp-servers.js +82 -0
  8. package/dist/data/mcp-servers.js.map +1 -1
  9. package/dist/index.js +8 -5
  10. package/dist/index.js.map +1 -1
  11. package/dist/main.d.ts +3 -0
  12. package/dist/main.d.ts.map +1 -0
  13. package/dist/main.js +79 -0
  14. package/dist/main.js.map +1 -0
  15. package/dist/services/claude-settings.d.ts +8 -1
  16. package/dist/services/claude-settings.d.ts.map +1 -1
  17. package/dist/services/claude-settings.js +79 -0
  18. package/dist/services/claude-settings.js.map +1 -1
  19. package/dist/services/local-marketplace.d.ts +76 -0
  20. package/dist/services/local-marketplace.d.ts.map +1 -0
  21. package/dist/services/local-marketplace.js +340 -0
  22. package/dist/services/local-marketplace.js.map +1 -0
  23. package/dist/services/plugin-manager.d.ts +39 -2
  24. package/dist/services/plugin-manager.d.ts.map +1 -1
  25. package/dist/services/plugin-manager.js +259 -9
  26. package/dist/services/plugin-manager.js.map +1 -1
  27. package/dist/services/plugin-mcp-config.d.ts +52 -0
  28. package/dist/services/plugin-mcp-config.d.ts.map +1 -0
  29. package/dist/services/plugin-mcp-config.js +176 -0
  30. package/dist/services/plugin-mcp-config.js.map +1 -0
  31. package/dist/types/index.d.ts +6 -1
  32. package/dist/types/index.d.ts.map +1 -1
  33. package/dist/ui/InkApp.d.ts +5 -0
  34. package/dist/ui/InkApp.d.ts.map +1 -0
  35. package/dist/ui/InkApp.js +175 -0
  36. package/dist/ui/InkApp.js.map +1 -0
  37. package/dist/ui/components/CategoryHeader.d.ts +16 -0
  38. package/dist/ui/components/CategoryHeader.d.ts.map +1 -0
  39. package/dist/ui/components/CategoryHeader.js +11 -0
  40. package/dist/ui/components/CategoryHeader.js.map +1 -0
  41. package/dist/ui/components/ScrollableList.d.ts +16 -0
  42. package/dist/ui/components/ScrollableList.d.ts.map +1 -0
  43. package/dist/ui/components/ScrollableList.js +35 -0
  44. package/dist/ui/components/ScrollableList.js.map +1 -0
  45. package/dist/ui/components/SearchInput.d.ts +18 -0
  46. package/dist/ui/components/SearchInput.d.ts.map +1 -0
  47. package/dist/ui/components/SearchInput.js +30 -0
  48. package/dist/ui/components/SearchInput.js.map +1 -0
  49. package/dist/ui/components/TabBar.d.ts +8 -0
  50. package/dist/ui/components/TabBar.d.ts.map +1 -0
  51. package/dist/ui/components/TabBar.js +18 -0
  52. package/dist/ui/components/TabBar.js.map +1 -0
  53. package/dist/ui/components/layout/Footer.d.ts +14 -0
  54. package/dist/ui/components/layout/Footer.d.ts.map +1 -0
  55. package/dist/ui/components/layout/Footer.js +23 -0
  56. package/dist/ui/components/layout/Footer.js.map +1 -0
  57. package/dist/ui/components/layout/Header.d.ts +4 -0
  58. package/dist/ui/components/layout/Header.d.ts.map +1 -0
  59. package/dist/ui/components/layout/Header.js +25 -0
  60. package/dist/ui/components/layout/Header.js.map +1 -0
  61. package/dist/ui/components/layout/Panel.d.ts +22 -0
  62. package/dist/ui/components/layout/Panel.d.ts.map +1 -0
  63. package/dist/ui/components/layout/Panel.js +8 -0
  64. package/dist/ui/components/layout/Panel.js.map +1 -0
  65. package/dist/ui/components/layout/ProgressBar.d.ts +12 -0
  66. package/dist/ui/components/layout/ProgressBar.d.ts.map +1 -0
  67. package/dist/ui/components/layout/ProgressBar.js +16 -0
  68. package/dist/ui/components/layout/ProgressBar.js.map +1 -0
  69. package/dist/ui/components/layout/ScopeTabs.d.ts +12 -0
  70. package/dist/ui/components/layout/ScopeTabs.d.ts.map +1 -0
  71. package/dist/ui/components/layout/ScopeTabs.js +8 -0
  72. package/dist/ui/components/layout/ScopeTabs.js.map +1 -0
  73. package/dist/ui/components/layout/ScreenLayout.d.ts +30 -0
  74. package/dist/ui/components/layout/ScreenLayout.d.ts.map +1 -0
  75. package/dist/ui/components/layout/ScreenLayout.js +23 -0
  76. package/dist/ui/components/layout/ScreenLayout.js.map +1 -0
  77. package/dist/ui/components/layout/index.d.ts +7 -0
  78. package/dist/ui/components/layout/index.d.ts.map +1 -0
  79. package/dist/ui/components/layout/index.js +7 -0
  80. package/dist/ui/components/layout/index.js.map +1 -0
  81. package/dist/ui/components/modals/ConfirmModal.d.ts +14 -0
  82. package/dist/ui/components/modals/ConfirmModal.d.ts.map +1 -0
  83. package/dist/ui/components/modals/ConfirmModal.js +15 -0
  84. package/dist/ui/components/modals/ConfirmModal.js.map +1 -0
  85. package/dist/ui/components/modals/InputModal.d.ts +16 -0
  86. package/dist/ui/components/modals/InputModal.d.ts.map +1 -0
  87. package/dist/ui/components/modals/InputModal.js +23 -0
  88. package/dist/ui/components/modals/InputModal.js.map +1 -0
  89. package/dist/ui/components/modals/LoadingModal.d.ts +8 -0
  90. package/dist/ui/components/modals/LoadingModal.d.ts.map +1 -0
  91. package/dist/ui/components/modals/LoadingModal.js +8 -0
  92. package/dist/ui/components/modals/LoadingModal.js.map +1 -0
  93. package/dist/ui/components/modals/MessageModal.d.ts +14 -0
  94. package/dist/ui/components/modals/MessageModal.d.ts.map +1 -0
  95. package/dist/ui/components/modals/MessageModal.js +17 -0
  96. package/dist/ui/components/modals/MessageModal.js.map +1 -0
  97. package/dist/ui/components/modals/ModalContainer.d.ts +7 -0
  98. package/dist/ui/components/modals/ModalContainer.d.ts.map +1 -0
  99. package/dist/ui/components/modals/ModalContainer.js +38 -0
  100. package/dist/ui/components/modals/ModalContainer.js.map +1 -0
  101. package/dist/ui/components/modals/SelectModal.d.ts +17 -0
  102. package/dist/ui/components/modals/SelectModal.d.ts.map +1 -0
  103. package/dist/ui/components/modals/SelectModal.js +33 -0
  104. package/dist/ui/components/modals/SelectModal.js.map +1 -0
  105. package/dist/ui/components/modals/index.d.ts +7 -0
  106. package/dist/ui/components/modals/index.d.ts.map +1 -0
  107. package/dist/ui/components/modals/index.js +7 -0
  108. package/dist/ui/components/modals/index.js.map +1 -0
  109. package/dist/ui/hooks/index.d.ts +3 -0
  110. package/dist/ui/hooks/index.d.ts.map +1 -0
  111. package/dist/ui/hooks/index.js +3 -0
  112. package/dist/ui/hooks/index.js.map +1 -0
  113. package/dist/ui/hooks/useAsyncData.d.ts +40 -0
  114. package/dist/ui/hooks/useAsyncData.d.ts.map +1 -0
  115. package/dist/ui/hooks/useAsyncData.js +78 -0
  116. package/dist/ui/hooks/useAsyncData.js.map +1 -0
  117. package/dist/ui/hooks/useKeyboardNavigation.d.ts +27 -0
  118. package/dist/ui/hooks/useKeyboardNavigation.d.ts.map +1 -0
  119. package/dist/ui/hooks/useKeyboardNavigation.js +82 -0
  120. package/dist/ui/hooks/useKeyboardNavigation.js.map +1 -0
  121. package/dist/ui/screens/CliToolsScreen.d.ts +4 -0
  122. package/dist/ui/screens/CliToolsScreen.d.ts.map +1 -0
  123. package/dist/ui/screens/CliToolsScreen.js +268 -0
  124. package/dist/ui/screens/CliToolsScreen.js.map +1 -0
  125. package/dist/ui/screens/EnvVarsScreen.d.ts +4 -0
  126. package/dist/ui/screens/EnvVarsScreen.d.ts.map +1 -0
  127. package/dist/ui/screens/EnvVarsScreen.js +145 -0
  128. package/dist/ui/screens/EnvVarsScreen.js.map +1 -0
  129. package/dist/ui/screens/McpRegistryScreen.d.ts +4 -0
  130. package/dist/ui/screens/McpRegistryScreen.d.ts.map +1 -0
  131. package/dist/ui/screens/McpRegistryScreen.js +226 -0
  132. package/dist/ui/screens/McpRegistryScreen.js.map +1 -0
  133. package/dist/ui/screens/McpScreen.d.ts +4 -0
  134. package/dist/ui/screens/McpScreen.d.ts.map +1 -0
  135. package/dist/ui/screens/McpScreen.js +222 -0
  136. package/dist/ui/screens/McpScreen.js.map +1 -0
  137. package/dist/ui/screens/ModelSelectorScreen.d.ts +4 -0
  138. package/dist/ui/screens/ModelSelectorScreen.d.ts.map +1 -0
  139. package/dist/ui/screens/ModelSelectorScreen.js +143 -0
  140. package/dist/ui/screens/ModelSelectorScreen.js.map +1 -0
  141. package/dist/ui/screens/PluginsScreen.d.ts +4 -0
  142. package/dist/ui/screens/PluginsScreen.d.ts.map +1 -0
  143. package/dist/ui/screens/PluginsScreen.js +818 -0
  144. package/dist/ui/screens/PluginsScreen.js.map +1 -0
  145. package/dist/ui/screens/StatusLineScreen.d.ts +4 -0
  146. package/dist/ui/screens/StatusLineScreen.d.ts.map +1 -0
  147. package/dist/ui/screens/StatusLineScreen.js +197 -0
  148. package/dist/ui/screens/StatusLineScreen.js.map +1 -0
  149. package/dist/ui/screens/index.d.ts +8 -0
  150. package/dist/ui/screens/index.d.ts.map +1 -0
  151. package/dist/ui/screens/index.js +8 -0
  152. package/dist/ui/screens/index.js.map +1 -0
  153. package/dist/ui/state/AppContext.d.ts +40 -0
  154. package/dist/ui/state/AppContext.d.ts.map +1 -0
  155. package/dist/ui/state/AppContext.js +162 -0
  156. package/dist/ui/state/AppContext.js.map +1 -0
  157. package/dist/ui/state/DimensionsContext.d.ts +25 -0
  158. package/dist/ui/state/DimensionsContext.d.ts.map +1 -0
  159. package/dist/ui/state/DimensionsContext.js +68 -0
  160. package/dist/ui/state/DimensionsContext.js.map +1 -0
  161. package/dist/ui/state/reducer.d.ts +4 -0
  162. package/dist/ui/state/reducer.d.ts.map +1 -0
  163. package/dist/ui/state/reducer.js +412 -0
  164. package/dist/ui/state/reducer.js.map +1 -0
  165. package/dist/ui/state/types.d.ts +266 -0
  166. package/dist/ui/state/types.d.ts.map +1 -0
  167. package/dist/ui/state/types.js +2 -0
  168. package/dist/ui/state/types.js.map +1 -0
  169. package/dist/utils/fuzzy-search.d.ts +33 -0
  170. package/dist/utils/fuzzy-search.d.ts.map +1 -0
  171. package/dist/utils/fuzzy-search.js +102 -0
  172. package/dist/utils/fuzzy-search.js.map +1 -0
  173. package/dist/utils/string-utils.d.ts +24 -0
  174. package/dist/utils/string-utils.d.ts.map +1 -0
  175. package/dist/utils/string-utils.js +62 -0
  176. package/dist/utils/string-utils.js.map +1 -0
  177. package/package.json +19 -7
  178. package/dist/ui/app.d.ts +0 -38
  179. package/dist/ui/app.d.ts.map +0 -1
  180. package/dist/ui/app.js +0 -590
  181. package/dist/ui/app.js.map +0 -1
  182. package/dist/ui/screens/cli-tools.d.ts +0 -4
  183. package/dist/ui/screens/cli-tools.d.ts.map +0 -1
  184. package/dist/ui/screens/cli-tools.js +0 -369
  185. package/dist/ui/screens/cli-tools.js.map +0 -1
  186. package/dist/ui/screens/env-vars.d.ts +0 -3
  187. package/dist/ui/screens/env-vars.d.ts.map +0 -1
  188. package/dist/ui/screens/env-vars.js +0 -119
  189. package/dist/ui/screens/env-vars.js.map +0 -1
  190. package/dist/ui/screens/main-menu.d.ts +0 -3
  191. package/dist/ui/screens/main-menu.d.ts.map +0 -1
  192. package/dist/ui/screens/main-menu.js +0 -110
  193. package/dist/ui/screens/main-menu.js.map +0 -1
  194. package/dist/ui/screens/mcp-registry.d.ts +0 -10
  195. package/dist/ui/screens/mcp-registry.d.ts.map +0 -1
  196. package/dist/ui/screens/mcp-registry.js +0 -310
  197. package/dist/ui/screens/mcp-registry.js.map +0 -1
  198. package/dist/ui/screens/mcp-setup.d.ts +0 -4
  199. package/dist/ui/screens/mcp-setup.d.ts.map +0 -1
  200. package/dist/ui/screens/mcp-setup.js +0 -492
  201. package/dist/ui/screens/mcp-setup.js.map +0 -1
  202. package/dist/ui/screens/plugins.d.ts +0 -3
  203. package/dist/ui/screens/plugins.d.ts.map +0 -1
  204. package/dist/ui/screens/plugins.js +0 -443
  205. package/dist/ui/screens/plugins.js.map +0 -1
  206. package/dist/ui/screens/statusline.d.ts +0 -5
  207. package/dist/ui/screens/statusline.d.ts.map +0 -1
  208. package/dist/ui/screens/statusline.js +0 -235
  209. package/dist/ui/screens/statusline.js.map +0 -1
@@ -0,0 +1,266 @@
1
+ import type { Marketplace, McpServer, StatusLineConfig } from '../../types/index.js';
2
+ import type { PluginInfo } from '../../services/plugin-manager.js';
3
+ export type Screen = 'plugins' | 'mcp' | 'mcp-registry' | 'statusline' | 'env-vars' | 'cli-tools' | 'model-selector';
4
+ export type Route = {
5
+ screen: 'plugins';
6
+ } | {
7
+ screen: 'mcp';
8
+ } | {
9
+ screen: 'mcp-registry';
10
+ query?: string;
11
+ } | {
12
+ screen: 'statusline';
13
+ } | {
14
+ screen: 'env-vars';
15
+ } | {
16
+ screen: 'cli-tools';
17
+ } | {
18
+ screen: 'model-selector';
19
+ };
20
+ export type AsyncData<T> = {
21
+ status: 'idle';
22
+ } | {
23
+ status: 'loading';
24
+ } | {
25
+ status: 'success';
26
+ data: T;
27
+ } | {
28
+ status: 'error';
29
+ error: Error;
30
+ };
31
+ export interface SelectOption {
32
+ label: string;
33
+ value: string;
34
+ description?: string;
35
+ }
36
+ export type ModalState = {
37
+ type: 'confirm';
38
+ title: string;
39
+ message: string;
40
+ onConfirm: () => void;
41
+ onCancel: () => void;
42
+ } | {
43
+ type: 'input';
44
+ title: string;
45
+ label: string;
46
+ defaultValue?: string;
47
+ onSubmit: (value: string) => void;
48
+ onCancel: () => void;
49
+ } | {
50
+ type: 'select';
51
+ title: string;
52
+ message: string;
53
+ options: SelectOption[];
54
+ onSelect: (value: string) => void;
55
+ onCancel: () => void;
56
+ } | {
57
+ type: 'message';
58
+ title: string;
59
+ message: string;
60
+ variant: 'info' | 'success' | 'error';
61
+ onDismiss: () => void;
62
+ } | {
63
+ type: 'loading';
64
+ message: string;
65
+ };
66
+ export interface ProgressState {
67
+ message: string;
68
+ current?: number;
69
+ total?: number;
70
+ }
71
+ export interface PluginsScreenState {
72
+ scope: 'project' | 'global';
73
+ collapsedMarketplaces: Set<string>;
74
+ selectedIndex: number;
75
+ searchQuery: string;
76
+ marketplaces: AsyncData<Marketplace[]>;
77
+ plugins: AsyncData<PluginInfo[]>;
78
+ }
79
+ export interface McpScreenState {
80
+ selectedIndex: number;
81
+ servers: AsyncData<McpServer[]>;
82
+ installedServers: Record<string, boolean>;
83
+ }
84
+ export interface McpRegistryScreenState {
85
+ searchQuery: string;
86
+ selectedIndex: number;
87
+ servers: AsyncData<McpServer[]>;
88
+ }
89
+ export interface StatusLineScreenState {
90
+ scope: 'project' | 'global';
91
+ selectedIndex: number;
92
+ presets: AsyncData<StatusLineConfig[]>;
93
+ currentPreset: string | null;
94
+ }
95
+ export interface EnvVarsScreenState {
96
+ selectedIndex: number;
97
+ variables: AsyncData<Record<string, string>>;
98
+ }
99
+ export interface CliTool {
100
+ name: string;
101
+ displayName: string;
102
+ description: string;
103
+ installCommand: string;
104
+ checkCommand: string;
105
+ homebrewFormula?: string;
106
+ npmPackage?: string;
107
+ installedVersion?: string;
108
+ latestVersion?: string;
109
+ hasUpdate?: boolean;
110
+ isInstalled: boolean;
111
+ isChecking: boolean;
112
+ }
113
+ export interface CliToolsScreenState {
114
+ selectedIndex: number;
115
+ tools: AsyncData<CliTool[]>;
116
+ }
117
+ export interface ModelSelectorScreenState {
118
+ selectedIndex: number;
119
+ searchQuery: string;
120
+ taskSize: 'large' | 'small';
121
+ }
122
+ export interface AppState {
123
+ currentRoute: Route;
124
+ projectPath: string;
125
+ modal: ModalState | null;
126
+ progress: ProgressState | null;
127
+ isSearching: boolean;
128
+ dataRefreshVersion: number;
129
+ plugins: PluginsScreenState;
130
+ mcp: McpScreenState;
131
+ mcpRegistry: McpRegistryScreenState;
132
+ statusline: StatusLineScreenState;
133
+ envVars: EnvVarsScreenState;
134
+ cliTools: CliToolsScreenState;
135
+ modelSelector: ModelSelectorScreenState;
136
+ }
137
+ export type AppAction = {
138
+ type: 'NAVIGATE';
139
+ route: Route;
140
+ } | {
141
+ type: 'PLUGINS_SET_SCOPE';
142
+ scope: 'project' | 'global';
143
+ } | {
144
+ type: 'PLUGINS_TOGGLE_SCOPE';
145
+ } | {
146
+ type: 'PLUGINS_TOGGLE_MARKETPLACE';
147
+ name: string;
148
+ } | {
149
+ type: 'PLUGINS_SELECT';
150
+ index: number;
151
+ } | {
152
+ type: 'PLUGINS_SET_SEARCH';
153
+ query: string;
154
+ } | {
155
+ type: 'PLUGINS_DATA_LOADING';
156
+ } | {
157
+ type: 'PLUGINS_DATA_SUCCESS';
158
+ marketplaces: Marketplace[];
159
+ plugins: PluginInfo[];
160
+ } | {
161
+ type: 'PLUGINS_DATA_ERROR';
162
+ error: Error;
163
+ } | {
164
+ type: 'MCP_SELECT';
165
+ index: number;
166
+ } | {
167
+ type: 'MCP_DATA_LOADING';
168
+ } | {
169
+ type: 'MCP_DATA_SUCCESS';
170
+ servers: McpServer[];
171
+ installedServers: Record<string, boolean>;
172
+ } | {
173
+ type: 'MCP_DATA_ERROR';
174
+ error: Error;
175
+ } | {
176
+ type: 'MCP_REGISTRY_SET_QUERY';
177
+ query: string;
178
+ } | {
179
+ type: 'MCPREGISTRY_SEARCH';
180
+ query: string;
181
+ } | {
182
+ type: 'MCPREGISTRY_SELECT';
183
+ index: number;
184
+ } | {
185
+ type: 'MCP_REGISTRY_SELECT';
186
+ index: number;
187
+ } | {
188
+ type: 'MCP_REGISTRY_DATA_LOADING';
189
+ } | {
190
+ type: 'MCP_REGISTRY_DATA_SUCCESS';
191
+ servers: McpServer[];
192
+ } | {
193
+ type: 'MCP_REGISTRY_DATA_ERROR';
194
+ error: Error;
195
+ } | {
196
+ type: 'STATUSLINE_SET_SCOPE';
197
+ scope: 'project' | 'global';
198
+ } | {
199
+ type: 'STATUSLINE_TOGGLE_SCOPE';
200
+ } | {
201
+ type: 'STATUSLINE_SELECT';
202
+ index: number;
203
+ } | {
204
+ type: 'STATUSLINE_DATA_LOADING';
205
+ } | {
206
+ type: 'STATUSLINE_DATA_SUCCESS';
207
+ presets: StatusLineConfig[];
208
+ currentPreset: string | null;
209
+ } | {
210
+ type: 'STATUSLINE_DATA_ERROR';
211
+ error: Error;
212
+ } | {
213
+ type: 'ENVVARS_SELECT';
214
+ index: number;
215
+ } | {
216
+ type: 'ENVVARS_DATA_LOADING';
217
+ } | {
218
+ type: 'ENVVARS_DATA_SUCCESS';
219
+ variables: Record<string, string>;
220
+ } | {
221
+ type: 'ENVVARS_DATA_ERROR';
222
+ error: Error;
223
+ } | {
224
+ type: 'CLITOOLS_SELECT';
225
+ index: number;
226
+ } | {
227
+ type: 'CLITOOLS_DATA_LOADING';
228
+ } | {
229
+ type: 'CLITOOLS_DATA_SUCCESS';
230
+ tools: CliTool[];
231
+ } | {
232
+ type: 'CLITOOLS_DATA_ERROR';
233
+ error: Error;
234
+ } | {
235
+ type: 'CLITOOLS_UPDATE_TOOL';
236
+ name: string;
237
+ updates: Partial<CliTool>;
238
+ } | {
239
+ type: 'MODEL_SELECTOR_SELECT';
240
+ index: number;
241
+ } | {
242
+ type: 'MODEL_SELECTOR_SET_SEARCH';
243
+ query: string;
244
+ } | {
245
+ type: 'MODEL_SELECTOR_SET_TASK_SIZE';
246
+ size: 'large' | 'small';
247
+ } | {
248
+ type: 'SHOW_MODAL';
249
+ modal: ModalState;
250
+ } | {
251
+ type: 'HIDE_MODAL';
252
+ } | {
253
+ type: 'SHOW_PROGRESS';
254
+ state: ProgressState;
255
+ } | {
256
+ type: 'UPDATE_PROGRESS';
257
+ state: ProgressState;
258
+ } | {
259
+ type: 'HIDE_PROGRESS';
260
+ } | {
261
+ type: 'SET_SEARCHING';
262
+ isSearching: boolean;
263
+ } | {
264
+ type: 'DATA_REFRESH_COMPLETE';
265
+ };
266
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ui/state/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/ui/state/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Simple fuzzy search utility for filtering lists
3
+ * Uses a scoring algorithm that rewards:
4
+ * - Consecutive character matches
5
+ * - Matches at word boundaries
6
+ * - Matches at start of string
7
+ */
8
+ export interface FuzzyMatch<T> {
9
+ item: T;
10
+ score: number;
11
+ matches: number[];
12
+ }
13
+ /**
14
+ * Calculate fuzzy match score for a query against a target string
15
+ * Returns null if no match, otherwise returns score and match indices
16
+ */
17
+ export declare function fuzzyMatch(query: string, target: string): {
18
+ score: number;
19
+ matches: number[];
20
+ } | null;
21
+ /**
22
+ * Filter and sort items by fuzzy match score
23
+ */
24
+ export declare function fuzzyFilter<T>(items: T[], query: string, getText: (item: T) => string): FuzzyMatch<T>[];
25
+ /**
26
+ * Highlight matched characters in a string
27
+ * Returns array of { text, highlighted } segments
28
+ */
29
+ export declare function highlightMatches(text: string, matches: number[]): Array<{
30
+ text: string;
31
+ highlighted: boolean;
32
+ }>;
33
+ //# sourceMappingURL=fuzzy-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuzzy-search.d.ts","sourceRoot":"","sources":["../../src/utils/fuzzy-search.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CA+CrG;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAC3B,UAAU,CAAC,CAAC,CAAC,EAAE,CAsBjB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EAAE,GAChB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAAC,CA6B/C"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Simple fuzzy search utility for filtering lists
3
+ * Uses a scoring algorithm that rewards:
4
+ * - Consecutive character matches
5
+ * - Matches at word boundaries
6
+ * - Matches at start of string
7
+ */
8
+ /**
9
+ * Calculate fuzzy match score for a query against a target string
10
+ * Returns null if no match, otherwise returns score and match indices
11
+ */
12
+ export function fuzzyMatch(query, target) {
13
+ if (!query)
14
+ return { score: 1, matches: [] };
15
+ const queryLower = query.toLowerCase();
16
+ const targetLower = target.toLowerCase();
17
+ let queryIdx = 0;
18
+ let score = 0;
19
+ const matches = [];
20
+ let prevMatchIdx = -1;
21
+ for (let i = 0; i < targetLower.length && queryIdx < queryLower.length; i++) {
22
+ if (targetLower[i] === queryLower[queryIdx]) {
23
+ matches.push(i);
24
+ // Bonus for consecutive matches
25
+ if (prevMatchIdx === i - 1) {
26
+ score += 5;
27
+ }
28
+ // Bonus for matching at word boundary
29
+ if (i === 0 || /[\s\-_.]/.test(target[i - 1])) {
30
+ score += 10;
31
+ }
32
+ // Bonus for matching at start
33
+ if (i === 0) {
34
+ score += 15;
35
+ }
36
+ // Base score for each match
37
+ score += 1;
38
+ prevMatchIdx = i;
39
+ queryIdx++;
40
+ }
41
+ }
42
+ // All query characters must be found
43
+ if (queryIdx !== queryLower.length) {
44
+ return null;
45
+ }
46
+ // Penalty for longer strings (prefer shorter, more precise matches)
47
+ score -= Math.floor(target.length / 10);
48
+ return { score, matches };
49
+ }
50
+ /**
51
+ * Filter and sort items by fuzzy match score
52
+ */
53
+ export function fuzzyFilter(items, query, getText) {
54
+ if (!query.trim()) {
55
+ return items.map(item => ({ item, score: 1, matches: [] }));
56
+ }
57
+ const results = [];
58
+ for (const item of items) {
59
+ const text = getText(item);
60
+ const match = fuzzyMatch(query, text);
61
+ if (match) {
62
+ results.push({
63
+ item,
64
+ score: match.score,
65
+ matches: match.matches,
66
+ });
67
+ }
68
+ }
69
+ // Sort by score descending
70
+ return results.sort((a, b) => b.score - a.score);
71
+ }
72
+ /**
73
+ * Highlight matched characters in a string
74
+ * Returns array of { text, highlighted } segments
75
+ */
76
+ export function highlightMatches(text, matches) {
77
+ if (matches.length === 0) {
78
+ return [{ text, highlighted: false }];
79
+ }
80
+ const matchSet = new Set(matches);
81
+ const segments = [];
82
+ let currentSegment = '';
83
+ let isHighlighted = matchSet.has(0);
84
+ for (let i = 0; i < text.length; i++) {
85
+ const shouldHighlight = matchSet.has(i);
86
+ if (shouldHighlight !== isHighlighted) {
87
+ if (currentSegment) {
88
+ segments.push({ text: currentSegment, highlighted: isHighlighted });
89
+ }
90
+ currentSegment = text[i];
91
+ isHighlighted = shouldHighlight;
92
+ }
93
+ else {
94
+ currentSegment += text[i];
95
+ }
96
+ }
97
+ if (currentSegment) {
98
+ segments.push({ text: currentSegment, highlighted: isHighlighted });
99
+ }
100
+ return segments;
101
+ }
102
+ //# sourceMappingURL=fuzzy-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuzzy-search.js","sourceRoot":"","sources":["../../src/utils/fuzzy-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Shared string utilities for claudeup
3
+ */
4
+ /**
5
+ * Format marketplace name for display
6
+ * e.g., "mag-claude-plugins" -> "Mag Claude Plugins"
7
+ */
8
+ export declare function formatMarketplaceName(name: string): string;
9
+ /**
10
+ * Validate GitHub repository format (org/repo)
11
+ * Prevents SSRF via malicious repo strings
12
+ */
13
+ export declare function isValidGitHubRepo(repo: string): boolean;
14
+ /**
15
+ * Parse plugin ID into components
16
+ * Format: pluginName@marketplaceName
17
+ */
18
+ export interface ParsedPluginId {
19
+ pluginName: string;
20
+ marketplace: string;
21
+ raw: string;
22
+ }
23
+ export declare function parsePluginId(pluginId: string): ParsedPluginId | null;
24
+ //# sourceMappingURL=string-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string-utils.d.ts","sourceRoot":"","sources":["../../src/utils/string-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA4BvD;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAwBrE"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Shared string utilities for claudeup
3
+ */
4
+ /**
5
+ * Format marketplace name for display
6
+ * e.g., "mag-claude-plugins" -> "Mag Claude Plugins"
7
+ */
8
+ export function formatMarketplaceName(name) {
9
+ return name
10
+ .split(/[-_]/)
11
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
12
+ .join(' ');
13
+ }
14
+ /**
15
+ * Validate GitHub repository format (org/repo)
16
+ * Prevents SSRF via malicious repo strings
17
+ */
18
+ export function isValidGitHubRepo(repo) {
19
+ if (!repo || typeof repo !== 'string') {
20
+ return false;
21
+ }
22
+ // Must match GitHub username/repo format
23
+ // Username: alphanumeric, hyphens (no consecutive, not start/end)
24
+ // Repo: alphanumeric, hyphens, underscores, dots
25
+ const GITHUB_REPO_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]\/[a-zA-Z0-9_.-]+$/;
26
+ // Allow single-char usernames too
27
+ const GITHUB_REPO_PATTERN_SHORT = /^[a-zA-Z0-9]\/[a-zA-Z0-9_.-]+$/;
28
+ if (!GITHUB_REPO_PATTERN.test(repo) && !GITHUB_REPO_PATTERN_SHORT.test(repo)) {
29
+ return false;
30
+ }
31
+ // Blocklist suspicious patterns
32
+ const BLOCKLIST = [
33
+ /\.\./, // Path traversal
34
+ /@/, // URL authority injection
35
+ /:/, // Port specification
36
+ /\s/, // Whitespace
37
+ /%/, // URL encoding
38
+ /\\/, // Backslash
39
+ ];
40
+ return !BLOCKLIST.some((pattern) => pattern.test(repo));
41
+ }
42
+ export function parsePluginId(pluginId) {
43
+ if (!pluginId || typeof pluginId !== 'string') {
44
+ return null;
45
+ }
46
+ const trimmed = pluginId.trim();
47
+ const atIndex = trimmed.lastIndexOf('@');
48
+ if (atIndex <= 0) {
49
+ return null;
50
+ }
51
+ const pluginName = trimmed.slice(0, atIndex).trim();
52
+ const marketplace = trimmed.slice(atIndex + 1).trim();
53
+ if (!pluginName || !marketplace) {
54
+ return null;
55
+ }
56
+ return {
57
+ pluginName,
58
+ marketplace,
59
+ raw: trimmed,
60
+ };
61
+ }
62
+ //# sourceMappingURL=string-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string-utils.js","sourceRoot":"","sources":["../../src/utils/string-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,IAAI;SACR,KAAK,CAAC,MAAM,CAAC;SACb,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,yCAAyC;IACzC,kEAAkE;IAClE,iDAAiD;IACjD,MAAM,mBAAmB,GAAG,wDAAwD,CAAC;IAErF,kCAAkC;IAClC,MAAM,yBAAyB,GAAG,gCAAgC,CAAC;IAEnE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gCAAgC;IAChC,MAAM,SAAS,GAAG;QAChB,MAAM,EAAY,iBAAiB;QACnC,GAAG,EAAe,0BAA0B;QAC5C,GAAG,EAAe,qBAAqB;QACvC,IAAI,EAAc,aAAa;QAC/B,GAAG,EAAe,eAAe;QACjC,IAAI,EAAc,YAAY;KAC/B,CAAC;IAEF,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1D,CAAC;AAYD,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAEzC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEtD,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,UAAU;QACV,WAAW;QACX,GAAG,EAAE,OAAO;KACb,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,17 +1,18 @@
1
1
  {
2
2
  "name": "claudeup",
3
- "version": "0.6.4",
3
+ "version": "1.1.0",
4
4
  "description": "TUI tool for managing Claude Code plugins, MCPs, and configuration",
5
5
  "type": "module",
6
- "main": "dist/index.js",
6
+ "main": "dist/main.js",
7
7
  "bin": {
8
8
  "claudeup": "bin/claudeup.js"
9
9
  },
10
10
  "scripts": {
11
11
  "build": "tsc",
12
- "dev": "tsc -w",
13
- "start": "node dist/index.js",
14
- "start:bun": "bun run src/index.ts",
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",
15
16
  "lint": "npm run eslint",
16
17
  "format": "biome format --write src/",
17
18
  "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"",
@@ -28,7 +29,9 @@
28
29
  "mcp",
29
30
  "plugins",
30
31
  "tui",
31
- "cli"
32
+ "cli",
33
+ "ink",
34
+ "react"
32
35
  ],
33
36
  "author": "Jack Rudenko <i@madappgang.com>",
34
37
  "license": "MIT",
@@ -48,16 +51,25 @@
48
51
  "dist/"
49
52
  ],
50
53
  "dependencies": {
54
+ "@inkjs/ui": "^2.0.0",
55
+ "@pppp606/ink-chart": "^0.2.3",
51
56
  "chalk": "^5.3.0",
52
57
  "fs-extra": "^11.2.0",
53
- "neo-blessed": "^0.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",
54
64
  "semver": "^7.6.3"
55
65
  },
56
66
  "devDependencies": {
57
67
  "@biomejs/biome": "^1.9.4",
58
68
  "@types/fs-extra": "^11.0.4",
59
69
  "@types/node": "^22.9.0",
70
+ "@types/react": "^18.3.18",
60
71
  "@types/semver": "^7.5.8",
72
+ "ink-testing-library": "^4.0.0",
61
73
  "typescript": "^5.6.3"
62
74
  },
63
75
  "templateOSS": {
package/dist/ui/app.d.ts DELETED
@@ -1,38 +0,0 @@
1
- import blessed from 'neo-blessed';
2
- import type { Screen } from '../types/index.js';
3
- export declare const VERSION = "0.6.4";
4
- export interface AppState {
5
- screen: blessed.Screen;
6
- currentScreen: Screen;
7
- projectPath: string;
8
- isSearching: boolean;
9
- }
10
- export declare const colors: {
11
- primary: string;
12
- secondary: string;
13
- success: string;
14
- warning: string;
15
- error: string;
16
- muted: string;
17
- bg: string;
18
- fg: string;
19
- };
20
- export declare function createApp(): AppState;
21
- export declare function navigateTo(state: AppState, screen: Screen): Promise<void>;
22
- export declare function showHelp(state: AppState): void;
23
- export declare function showLoading(state: AppState, message: string): {
24
- stop: () => void;
25
- };
26
- export declare function showMessage(state: AppState, title: string, message: string, type?: 'info' | 'success' | 'error'): Promise<void>;
27
- export declare function showConfirm(state: AppState, title: string, message: string): Promise<boolean>;
28
- export declare function showInput(state: AppState, title: string, label: string, defaultValue?: string): Promise<string | null>;
29
- export interface SelectOption {
30
- label: string;
31
- value: string;
32
- description?: string;
33
- }
34
- export declare function showSelect(state: AppState, title: string, message: string, options: SelectOption[]): Promise<string | null>;
35
- export declare function createBackground(state: AppState): blessed.BoxElement;
36
- export declare function createHeader(state: AppState, _title: string): blessed.BoxElement;
37
- export declare function createFooter(state: AppState, hints: string): blessed.BoxElement;
38
- //# sourceMappingURL=app.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/ui/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAOhD,eAAO,MAAM,OAAO,UAAU,CAAC;AAyB/B,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAGD,eAAO,MAAM,MAAM;;;;;;;;;CASlB,CAAC;AAEF,wBAAgB,SAAS,IAAI,QAAQ,CA6DpC;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiE/E;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CA+C9C;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,MAAM,GACd;IAAE,IAAI,EAAE,MAAM,IAAI,CAAA;CAAE,CAyCtB;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,GAAG,SAAS,GAAG,OAAgB,GAC1C,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAoClB;AAED,wBAAgB,SAAS,CACvB,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkHxB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,YAAY,EAAE,GACtB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+GxB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAWpE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAmChF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAU/E"}