claudeup 0.6.4 → 1.0.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 (205) 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/types/index.d.ts +6 -1
  28. package/dist/types/index.d.ts.map +1 -1
  29. package/dist/ui/InkApp.d.ts +5 -0
  30. package/dist/ui/InkApp.d.ts.map +1 -0
  31. package/dist/ui/InkApp.js +175 -0
  32. package/dist/ui/InkApp.js.map +1 -0
  33. package/dist/ui/components/CategoryHeader.d.ts +16 -0
  34. package/dist/ui/components/CategoryHeader.d.ts.map +1 -0
  35. package/dist/ui/components/CategoryHeader.js +11 -0
  36. package/dist/ui/components/CategoryHeader.js.map +1 -0
  37. package/dist/ui/components/ScrollableList.d.ts +16 -0
  38. package/dist/ui/components/ScrollableList.d.ts.map +1 -0
  39. package/dist/ui/components/ScrollableList.js +35 -0
  40. package/dist/ui/components/ScrollableList.js.map +1 -0
  41. package/dist/ui/components/SearchInput.d.ts +18 -0
  42. package/dist/ui/components/SearchInput.d.ts.map +1 -0
  43. package/dist/ui/components/SearchInput.js +30 -0
  44. package/dist/ui/components/SearchInput.js.map +1 -0
  45. package/dist/ui/components/TabBar.d.ts +8 -0
  46. package/dist/ui/components/TabBar.d.ts.map +1 -0
  47. package/dist/ui/components/TabBar.js +18 -0
  48. package/dist/ui/components/TabBar.js.map +1 -0
  49. package/dist/ui/components/layout/Footer.d.ts +14 -0
  50. package/dist/ui/components/layout/Footer.d.ts.map +1 -0
  51. package/dist/ui/components/layout/Footer.js +23 -0
  52. package/dist/ui/components/layout/Footer.js.map +1 -0
  53. package/dist/ui/components/layout/Header.d.ts +4 -0
  54. package/dist/ui/components/layout/Header.d.ts.map +1 -0
  55. package/dist/ui/components/layout/Header.js +25 -0
  56. package/dist/ui/components/layout/Header.js.map +1 -0
  57. package/dist/ui/components/layout/Panel.d.ts +22 -0
  58. package/dist/ui/components/layout/Panel.d.ts.map +1 -0
  59. package/dist/ui/components/layout/Panel.js +8 -0
  60. package/dist/ui/components/layout/Panel.js.map +1 -0
  61. package/dist/ui/components/layout/ProgressBar.d.ts +12 -0
  62. package/dist/ui/components/layout/ProgressBar.d.ts.map +1 -0
  63. package/dist/ui/components/layout/ProgressBar.js +16 -0
  64. package/dist/ui/components/layout/ProgressBar.js.map +1 -0
  65. package/dist/ui/components/layout/ScopeTabs.d.ts +12 -0
  66. package/dist/ui/components/layout/ScopeTabs.d.ts.map +1 -0
  67. package/dist/ui/components/layout/ScopeTabs.js +8 -0
  68. package/dist/ui/components/layout/ScopeTabs.js.map +1 -0
  69. package/dist/ui/components/layout/ScreenLayout.d.ts +30 -0
  70. package/dist/ui/components/layout/ScreenLayout.d.ts.map +1 -0
  71. package/dist/ui/components/layout/ScreenLayout.js +23 -0
  72. package/dist/ui/components/layout/ScreenLayout.js.map +1 -0
  73. package/dist/ui/components/layout/index.d.ts +7 -0
  74. package/dist/ui/components/layout/index.d.ts.map +1 -0
  75. package/dist/ui/components/layout/index.js +7 -0
  76. package/dist/ui/components/layout/index.js.map +1 -0
  77. package/dist/ui/components/modals/ConfirmModal.d.ts +14 -0
  78. package/dist/ui/components/modals/ConfirmModal.d.ts.map +1 -0
  79. package/dist/ui/components/modals/ConfirmModal.js +15 -0
  80. package/dist/ui/components/modals/ConfirmModal.js.map +1 -0
  81. package/dist/ui/components/modals/InputModal.d.ts +16 -0
  82. package/dist/ui/components/modals/InputModal.d.ts.map +1 -0
  83. package/dist/ui/components/modals/InputModal.js +23 -0
  84. package/dist/ui/components/modals/InputModal.js.map +1 -0
  85. package/dist/ui/components/modals/LoadingModal.d.ts +8 -0
  86. package/dist/ui/components/modals/LoadingModal.d.ts.map +1 -0
  87. package/dist/ui/components/modals/LoadingModal.js +8 -0
  88. package/dist/ui/components/modals/LoadingModal.js.map +1 -0
  89. package/dist/ui/components/modals/MessageModal.d.ts +14 -0
  90. package/dist/ui/components/modals/MessageModal.d.ts.map +1 -0
  91. package/dist/ui/components/modals/MessageModal.js +17 -0
  92. package/dist/ui/components/modals/MessageModal.js.map +1 -0
  93. package/dist/ui/components/modals/ModalContainer.d.ts +7 -0
  94. package/dist/ui/components/modals/ModalContainer.d.ts.map +1 -0
  95. package/dist/ui/components/modals/ModalContainer.js +38 -0
  96. package/dist/ui/components/modals/ModalContainer.js.map +1 -0
  97. package/dist/ui/components/modals/SelectModal.d.ts +17 -0
  98. package/dist/ui/components/modals/SelectModal.d.ts.map +1 -0
  99. package/dist/ui/components/modals/SelectModal.js +33 -0
  100. package/dist/ui/components/modals/SelectModal.js.map +1 -0
  101. package/dist/ui/components/modals/index.d.ts +7 -0
  102. package/dist/ui/components/modals/index.d.ts.map +1 -0
  103. package/dist/ui/components/modals/index.js +7 -0
  104. package/dist/ui/components/modals/index.js.map +1 -0
  105. package/dist/ui/hooks/index.d.ts +3 -0
  106. package/dist/ui/hooks/index.d.ts.map +1 -0
  107. package/dist/ui/hooks/index.js +3 -0
  108. package/dist/ui/hooks/index.js.map +1 -0
  109. package/dist/ui/hooks/useAsyncData.d.ts +40 -0
  110. package/dist/ui/hooks/useAsyncData.d.ts.map +1 -0
  111. package/dist/ui/hooks/useAsyncData.js +78 -0
  112. package/dist/ui/hooks/useAsyncData.js.map +1 -0
  113. package/dist/ui/hooks/useKeyboardNavigation.d.ts +27 -0
  114. package/dist/ui/hooks/useKeyboardNavigation.d.ts.map +1 -0
  115. package/dist/ui/hooks/useKeyboardNavigation.js +82 -0
  116. package/dist/ui/hooks/useKeyboardNavigation.js.map +1 -0
  117. package/dist/ui/screens/CliToolsScreen.d.ts +4 -0
  118. package/dist/ui/screens/CliToolsScreen.d.ts.map +1 -0
  119. package/dist/ui/screens/CliToolsScreen.js +268 -0
  120. package/dist/ui/screens/CliToolsScreen.js.map +1 -0
  121. package/dist/ui/screens/EnvVarsScreen.d.ts +4 -0
  122. package/dist/ui/screens/EnvVarsScreen.d.ts.map +1 -0
  123. package/dist/ui/screens/EnvVarsScreen.js +145 -0
  124. package/dist/ui/screens/EnvVarsScreen.js.map +1 -0
  125. package/dist/ui/screens/McpRegistryScreen.d.ts +4 -0
  126. package/dist/ui/screens/McpRegistryScreen.d.ts.map +1 -0
  127. package/dist/ui/screens/McpRegistryScreen.js +226 -0
  128. package/dist/ui/screens/McpRegistryScreen.js.map +1 -0
  129. package/dist/ui/screens/McpScreen.d.ts +4 -0
  130. package/dist/ui/screens/McpScreen.d.ts.map +1 -0
  131. package/dist/ui/screens/McpScreen.js +222 -0
  132. package/dist/ui/screens/McpScreen.js.map +1 -0
  133. package/dist/ui/screens/ModelSelectorScreen.d.ts +4 -0
  134. package/dist/ui/screens/ModelSelectorScreen.d.ts.map +1 -0
  135. package/dist/ui/screens/ModelSelectorScreen.js +143 -0
  136. package/dist/ui/screens/ModelSelectorScreen.js.map +1 -0
  137. package/dist/ui/screens/PluginsScreen.d.ts +4 -0
  138. package/dist/ui/screens/PluginsScreen.d.ts.map +1 -0
  139. package/dist/ui/screens/PluginsScreen.js +747 -0
  140. package/dist/ui/screens/PluginsScreen.js.map +1 -0
  141. package/dist/ui/screens/StatusLineScreen.d.ts +4 -0
  142. package/dist/ui/screens/StatusLineScreen.d.ts.map +1 -0
  143. package/dist/ui/screens/StatusLineScreen.js +197 -0
  144. package/dist/ui/screens/StatusLineScreen.js.map +1 -0
  145. package/dist/ui/screens/index.d.ts +8 -0
  146. package/dist/ui/screens/index.d.ts.map +1 -0
  147. package/dist/ui/screens/index.js +8 -0
  148. package/dist/ui/screens/index.js.map +1 -0
  149. package/dist/ui/state/AppContext.d.ts +40 -0
  150. package/dist/ui/state/AppContext.d.ts.map +1 -0
  151. package/dist/ui/state/AppContext.js +162 -0
  152. package/dist/ui/state/AppContext.js.map +1 -0
  153. package/dist/ui/state/DimensionsContext.d.ts +25 -0
  154. package/dist/ui/state/DimensionsContext.d.ts.map +1 -0
  155. package/dist/ui/state/DimensionsContext.js +68 -0
  156. package/dist/ui/state/DimensionsContext.js.map +1 -0
  157. package/dist/ui/state/reducer.d.ts +4 -0
  158. package/dist/ui/state/reducer.d.ts.map +1 -0
  159. package/dist/ui/state/reducer.js +412 -0
  160. package/dist/ui/state/reducer.js.map +1 -0
  161. package/dist/ui/state/types.d.ts +266 -0
  162. package/dist/ui/state/types.d.ts.map +1 -0
  163. package/dist/ui/state/types.js +2 -0
  164. package/dist/ui/state/types.js.map +1 -0
  165. package/dist/utils/fuzzy-search.d.ts +33 -0
  166. package/dist/utils/fuzzy-search.d.ts.map +1 -0
  167. package/dist/utils/fuzzy-search.js +102 -0
  168. package/dist/utils/fuzzy-search.js.map +1 -0
  169. package/dist/utils/string-utils.d.ts +24 -0
  170. package/dist/utils/string-utils.d.ts.map +1 -0
  171. package/dist/utils/string-utils.js +62 -0
  172. package/dist/utils/string-utils.js.map +1 -0
  173. package/package.json +19 -7
  174. package/dist/ui/app.d.ts +0 -38
  175. package/dist/ui/app.d.ts.map +0 -1
  176. package/dist/ui/app.js +0 -590
  177. package/dist/ui/app.js.map +0 -1
  178. package/dist/ui/screens/cli-tools.d.ts +0 -4
  179. package/dist/ui/screens/cli-tools.d.ts.map +0 -1
  180. package/dist/ui/screens/cli-tools.js +0 -369
  181. package/dist/ui/screens/cli-tools.js.map +0 -1
  182. package/dist/ui/screens/env-vars.d.ts +0 -3
  183. package/dist/ui/screens/env-vars.d.ts.map +0 -1
  184. package/dist/ui/screens/env-vars.js +0 -119
  185. package/dist/ui/screens/env-vars.js.map +0 -1
  186. package/dist/ui/screens/main-menu.d.ts +0 -3
  187. package/dist/ui/screens/main-menu.d.ts.map +0 -1
  188. package/dist/ui/screens/main-menu.js +0 -110
  189. package/dist/ui/screens/main-menu.js.map +0 -1
  190. package/dist/ui/screens/mcp-registry.d.ts +0 -10
  191. package/dist/ui/screens/mcp-registry.d.ts.map +0 -1
  192. package/dist/ui/screens/mcp-registry.js +0 -310
  193. package/dist/ui/screens/mcp-registry.js.map +0 -1
  194. package/dist/ui/screens/mcp-setup.d.ts +0 -4
  195. package/dist/ui/screens/mcp-setup.d.ts.map +0 -1
  196. package/dist/ui/screens/mcp-setup.js +0 -492
  197. package/dist/ui/screens/mcp-setup.js.map +0 -1
  198. package/dist/ui/screens/plugins.d.ts +0 -3
  199. package/dist/ui/screens/plugins.d.ts.map +0 -1
  200. package/dist/ui/screens/plugins.js +0 -443
  201. package/dist/ui/screens/plugins.js.map +0 -1
  202. package/dist/ui/screens/statusline.d.ts +0 -5
  203. package/dist/ui/screens/statusline.d.ts.map +0 -1
  204. package/dist/ui/screens/statusline.js +0 -235
  205. package/dist/ui/screens/statusline.js.map +0 -1
@@ -1,5 +1,9 @@
1
- import { getConfiguredMarketplaces, getEnabledPlugins, readSettings, writeSettings, getGlobalConfiguredMarketplaces, getGlobalEnabledPlugins, getGlobalInstalledPluginVersions, } from './claude-settings.js';
1
+ import { getConfiguredMarketplaces, getEnabledPlugins, readSettings, writeSettings, getGlobalConfiguredMarketplaces, getGlobalEnabledPlugins, getGlobalInstalledPluginVersions, getLocalEnabledPlugins, getLocalInstalledPluginVersions, } from './claude-settings.js';
2
2
  import { defaultMarketplaces } from '../data/marketplaces.js';
3
+ import { scanLocalMarketplaces, refreshLocalMarketplaces } from './local-marketplace.js';
4
+ import { formatMarketplaceName, isValidGitHubRepo, parsePluginId } from '../utils/string-utils.js';
5
+ // Cache for local marketplaces (session-level) - Promise-based to prevent race conditions
6
+ let localMarketplacesPromise = null;
3
7
  // Session-level cache for fetched marketplace data (no TTL - persists until explicit refresh)
4
8
  const marketplaceCache = new Map();
5
9
  export async function fetchMarketplacePlugins(marketplaceName, repo) {
@@ -8,22 +12,39 @@ export async function fetchMarketplacePlugins(marketplaceName, repo) {
8
12
  if (cached) {
9
13
  return cached;
10
14
  }
15
+ // Validate repo format to prevent SSRF
16
+ if (!isValidGitHubRepo(repo)) {
17
+ console.error(`Invalid GitHub repo format: ${repo}`);
18
+ return [];
19
+ }
11
20
  try {
12
21
  // Fetch marketplace.json from GitHub
13
22
  const url = `https://raw.githubusercontent.com/${repo}/main/.claude-plugin/marketplace.json`;
14
- const response = await fetch(url);
23
+ const response = await fetch(url, {
24
+ signal: AbortSignal.timeout(10000), // 10s timeout
25
+ });
15
26
  if (!response.ok) {
16
27
  console.error(`Failed to fetch marketplace: ${response.status}`);
17
28
  return [];
18
29
  }
30
+ // Validate content-type
31
+ const contentType = response.headers.get('content-type');
32
+ if (contentType && !contentType.includes('application/json') && !contentType.includes('text/plain')) {
33
+ console.error(`Invalid content-type for marketplace: ${contentType}`);
34
+ return [];
35
+ }
19
36
  const data = (await response.json());
20
37
  const plugins = [];
21
38
  if (data.plugins && Array.isArray(data.plugins)) {
22
39
  for (const plugin of data.plugins) {
23
40
  plugins.push({
24
41
  name: plugin.name,
25
- version: plugin.version || '0.0.0',
42
+ version: plugin.version || null,
26
43
  description: plugin.description || '',
44
+ category: plugin.category,
45
+ author: plugin.author,
46
+ homepage: plugin.homepage,
47
+ tags: plugin.tags,
27
48
  });
28
49
  }
29
50
  }
@@ -40,11 +61,32 @@ export async function getAvailablePlugins(projectPath) {
40
61
  const configuredMarketplaces = await getConfiguredMarketplaces(projectPath);
41
62
  const enabledPlugins = await getEnabledPlugins(projectPath);
42
63
  const installedVersions = await getInstalledPluginVersions(projectPath);
64
+ // Fetch all scopes for per-scope status
65
+ const userEnabledPlugins = await getGlobalEnabledPlugins();
66
+ const userInstalledVersions = await getGlobalInstalledPluginVersions();
67
+ const projectEnabledPlugins = await getEnabledPlugins(projectPath);
68
+ const projectInstalledVersions = await getInstalledPluginVersions(projectPath);
69
+ const localEnabledPlugins = await getLocalEnabledPlugins(projectPath);
70
+ const localInstalledVersions = await getLocalInstalledPluginVersions(projectPath);
43
71
  const plugins = [];
44
- // Get all marketplace names (configured + defaults)
72
+ const seenPluginIds = new Set();
73
+ // Helper to build scope status
74
+ const buildScopeStatus = (pluginId) => ({
75
+ userScope: userEnabledPlugins[pluginId] !== undefined
76
+ ? { enabled: userEnabledPlugins[pluginId], version: userInstalledVersions[pluginId] }
77
+ : undefined,
78
+ projectScope: projectEnabledPlugins[pluginId] !== undefined
79
+ ? { enabled: projectEnabledPlugins[pluginId], version: projectInstalledVersions[pluginId] }
80
+ : undefined,
81
+ localScope: localEnabledPlugins[pluginId] !== undefined
82
+ ? { enabled: localEnabledPlugins[pluginId], version: localInstalledVersions[pluginId] }
83
+ : undefined,
84
+ });
85
+ // Get all marketplace names (configured + official defaults)
86
+ // Always include official marketplaces so users can browse them
45
87
  const marketplaceNames = new Set();
46
88
  for (const mp of defaultMarketplaces) {
47
- if (configuredMarketplaces[mp.name]) {
89
+ if (configuredMarketplaces[mp.name] || mp.official) {
48
90
  marketplaceNames.add(mp.name);
49
91
  }
50
92
  }
@@ -58,6 +100,8 @@ export async function getAvailablePlugins(projectPath) {
58
100
  const pluginId = `${plugin.name}@${mpName}`;
59
101
  const installedVersion = installedVersions[pluginId];
60
102
  const isEnabled = enabledPlugins[pluginId] === true;
103
+ const scopeStatus = buildScopeStatus(pluginId);
104
+ seenPluginIds.add(pluginId);
61
105
  plugins.push({
62
106
  id: pluginId,
63
107
  name: plugin.name,
@@ -67,21 +111,120 @@ export async function getAvailablePlugins(projectPath) {
67
111
  marketplaceDisplay: marketplace.displayName,
68
112
  enabled: isEnabled,
69
113
  installedVersion: installedVersion,
70
- hasUpdate: installedVersion ? compareVersions(plugin.version, installedVersion) > 0 : false,
114
+ hasUpdate: installedVersion && plugin.version ? compareVersions(plugin.version, installedVersion) > 0 : false,
115
+ ...scopeStatus,
116
+ category: plugin.category,
117
+ author: plugin.author,
118
+ homepage: plugin.homepage,
119
+ tags: plugin.tags,
120
+ });
121
+ }
122
+ }
123
+ // Fetch ALL plugins from local marketplace caches (for marketplaces not in defaults)
124
+ const localMarketplaces = await getLocalMarketplaces();
125
+ for (const [mpName, localMp] of localMarketplaces) {
126
+ // Skip if already fetched from defaults
127
+ if (marketplaceNames.has(mpName))
128
+ continue;
129
+ // Add ALL plugins from this local marketplace cache
130
+ for (const localPlugin of localMp.plugins) {
131
+ const pluginId = `${localPlugin.name}@${mpName}`;
132
+ if (seenPluginIds.has(pluginId))
133
+ continue;
134
+ const installedVersion = installedVersions[pluginId];
135
+ const isEnabled = enabledPlugins[pluginId] === true;
136
+ const scopeStatus = buildScopeStatus(pluginId);
137
+ seenPluginIds.add(pluginId);
138
+ plugins.push({
139
+ id: pluginId,
140
+ name: localPlugin.name,
141
+ version: localPlugin.version,
142
+ description: localPlugin.description || '',
143
+ marketplace: mpName,
144
+ marketplaceDisplay: localMp.name || formatMarketplaceName(mpName),
145
+ enabled: isEnabled,
146
+ installedVersion: installedVersion,
147
+ hasUpdate: installedVersion ? compareVersions(localPlugin.version, installedVersion) > 0 : false,
148
+ ...scopeStatus,
149
+ category: localPlugin.category,
150
+ author: localPlugin.author,
151
+ agents: localPlugin.agents,
152
+ commands: localPlugin.commands,
153
+ skills: localPlugin.skills,
154
+ mcpServers: localPlugin.mcpServers,
155
+ lspServers: localPlugin.lspServers,
71
156
  });
72
157
  }
73
158
  }
159
+ // Add orphaned plugins (enabled/installed but not in any cache)
160
+ const allPluginIds = new Set([
161
+ ...Object.keys(enabledPlugins),
162
+ ...Object.keys(installedVersions),
163
+ ]);
164
+ for (const pluginId of allPluginIds) {
165
+ if (seenPluginIds.has(pluginId))
166
+ continue;
167
+ const parsed = parsePluginId(pluginId);
168
+ if (!parsed)
169
+ continue;
170
+ const { pluginName, marketplace: mpName } = parsed;
171
+ const installedVersion = installedVersions[pluginId];
172
+ const isEnabled = enabledPlugins[pluginId] === true;
173
+ const scopeStatus = buildScopeStatus(pluginId);
174
+ // Try to get plugin info from local marketplace cache (fallback)
175
+ const localMp = localMarketplaces.get(mpName);
176
+ const localPlugin = localMp?.plugins.find((p) => p.name === pluginName);
177
+ const latestVersion = localPlugin?.version || installedVersion || 'unknown';
178
+ const description = localPlugin?.description || 'Installed plugin';
179
+ const hasUpdate = installedVersion && localPlugin?.version
180
+ ? compareVersions(localPlugin.version, installedVersion) > 0
181
+ : false;
182
+ plugins.push({
183
+ id: pluginId,
184
+ name: pluginName,
185
+ version: latestVersion,
186
+ description,
187
+ marketplace: mpName,
188
+ marketplaceDisplay: localMp?.name || formatMarketplaceName(mpName),
189
+ enabled: isEnabled,
190
+ installedVersion: installedVersion,
191
+ hasUpdate,
192
+ ...scopeStatus,
193
+ });
194
+ }
74
195
  return plugins;
75
196
  }
76
197
  export async function getGlobalAvailablePlugins() {
77
198
  const configuredMarketplaces = await getGlobalConfiguredMarketplaces();
78
199
  const enabledPlugins = await getGlobalEnabledPlugins();
79
200
  const installedVersions = await getGlobalInstalledPluginVersions();
201
+ // Fetch all scopes for per-scope status display
202
+ const userEnabledPlugins = await getGlobalEnabledPlugins();
203
+ const userInstalledVersions = await getGlobalInstalledPluginVersions();
204
+ // Also fetch project and local scope for complete status display
205
+ const projectEnabledPlugins = await getEnabledPlugins();
206
+ const projectInstalledVersions = await getInstalledPluginVersions();
207
+ const localEnabledPlugins = await getLocalEnabledPlugins();
208
+ const localInstalledVersions = await getLocalInstalledPluginVersions();
80
209
  const plugins = [];
81
- // Get all marketplace names (configured + defaults)
210
+ const seenPluginIds = new Set();
211
+ // Helper to build scope status (show all scopes)
212
+ const buildScopeStatus = (pluginId) => ({
213
+ userScope: userEnabledPlugins[pluginId] !== undefined
214
+ ? { enabled: userEnabledPlugins[pluginId], version: userInstalledVersions[pluginId] }
215
+ : undefined,
216
+ projectScope: projectEnabledPlugins[pluginId] !== undefined
217
+ ? { enabled: projectEnabledPlugins[pluginId], version: projectInstalledVersions[pluginId] }
218
+ : undefined,
219
+ localScope: localEnabledPlugins[pluginId] !== undefined
220
+ ? { enabled: localEnabledPlugins[pluginId], version: localInstalledVersions[pluginId] }
221
+ : undefined,
222
+ });
223
+ // Get all marketplace names (configured + official defaults)
224
+ // Always include official marketplaces so users can browse them
82
225
  const marketplaceNames = new Set();
83
226
  for (const mp of defaultMarketplaces) {
84
- if (configuredMarketplaces[mp.name]) {
227
+ if (configuredMarketplaces[mp.name] || mp.official) {
85
228
  marketplaceNames.add(mp.name);
86
229
  }
87
230
  }
@@ -95,6 +238,8 @@ export async function getGlobalAvailablePlugins() {
95
238
  const pluginId = `${plugin.name}@${mpName}`;
96
239
  const installedVersion = installedVersions[pluginId];
97
240
  const isEnabled = enabledPlugins[pluginId] === true;
241
+ const scopeStatus = buildScopeStatus(pluginId);
242
+ seenPluginIds.add(pluginId);
98
243
  plugins.push({
99
244
  id: pluginId,
100
245
  name: plugin.name,
@@ -104,14 +249,93 @@ export async function getGlobalAvailablePlugins() {
104
249
  marketplaceDisplay: marketplace.displayName,
105
250
  enabled: isEnabled,
106
251
  installedVersion: installedVersion,
107
- hasUpdate: installedVersion ? compareVersions(plugin.version, installedVersion) > 0 : false,
252
+ hasUpdate: installedVersion && plugin.version ? compareVersions(plugin.version, installedVersion) > 0 : false,
253
+ ...scopeStatus,
254
+ category: plugin.category,
255
+ author: plugin.author,
256
+ homepage: plugin.homepage,
257
+ tags: plugin.tags,
108
258
  });
109
259
  }
110
260
  }
261
+ // Fetch ALL plugins from local marketplace caches (for marketplaces not in defaults)
262
+ const localMarketplaces = await getLocalMarketplaces();
263
+ for (const [mpName, localMp] of localMarketplaces) {
264
+ // Skip if already fetched from defaults
265
+ if (marketplaceNames.has(mpName))
266
+ continue;
267
+ // Add ALL plugins from this local marketplace cache
268
+ for (const localPlugin of localMp.plugins) {
269
+ const pluginId = `${localPlugin.name}@${mpName}`;
270
+ if (seenPluginIds.has(pluginId))
271
+ continue;
272
+ const installedVersion = installedVersions[pluginId];
273
+ const isEnabled = enabledPlugins[pluginId] === true;
274
+ const scopeStatus = buildScopeStatus(pluginId);
275
+ seenPluginIds.add(pluginId);
276
+ plugins.push({
277
+ id: pluginId,
278
+ name: localPlugin.name,
279
+ version: localPlugin.version,
280
+ description: localPlugin.description || '',
281
+ marketplace: mpName,
282
+ marketplaceDisplay: localMp.name || formatMarketplaceName(mpName),
283
+ enabled: isEnabled,
284
+ installedVersion: installedVersion,
285
+ hasUpdate: installedVersion ? compareVersions(localPlugin.version, installedVersion) > 0 : false,
286
+ ...scopeStatus,
287
+ category: localPlugin.category,
288
+ author: localPlugin.author,
289
+ agents: localPlugin.agents,
290
+ commands: localPlugin.commands,
291
+ skills: localPlugin.skills,
292
+ mcpServers: localPlugin.mcpServers,
293
+ lspServers: localPlugin.lspServers,
294
+ });
295
+ }
296
+ }
297
+ // Add orphaned plugins (enabled/installed but not in any cache)
298
+ const allPluginIds = new Set([
299
+ ...Object.keys(enabledPlugins),
300
+ ...Object.keys(installedVersions),
301
+ ]);
302
+ for (const pluginId of allPluginIds) {
303
+ if (seenPluginIds.has(pluginId))
304
+ continue;
305
+ const parsed = parsePluginId(pluginId);
306
+ if (!parsed)
307
+ continue;
308
+ const { pluginName, marketplace: mpName } = parsed;
309
+ const installedVersion = installedVersions[pluginId];
310
+ const isEnabled = enabledPlugins[pluginId] === true;
311
+ const scopeStatus = buildScopeStatus(pluginId);
312
+ // Try to get plugin info from local marketplace cache (fallback)
313
+ const localMp = localMarketplaces.get(mpName);
314
+ const localPlugin = localMp?.plugins.find((p) => p.name === pluginName);
315
+ const latestVersion = localPlugin?.version || installedVersion || 'unknown';
316
+ const description = localPlugin?.description || 'Installed plugin';
317
+ const hasUpdate = installedVersion && localPlugin?.version
318
+ ? compareVersions(localPlugin.version, installedVersion) > 0
319
+ : false;
320
+ plugins.push({
321
+ id: pluginId,
322
+ name: pluginName,
323
+ version: latestVersion,
324
+ description,
325
+ marketplace: mpName,
326
+ marketplaceDisplay: localMp?.name || formatMarketplaceName(mpName),
327
+ enabled: isEnabled,
328
+ ...scopeStatus,
329
+ installedVersion: installedVersion,
330
+ hasUpdate,
331
+ });
332
+ }
111
333
  return plugins;
112
334
  }
113
335
  // Simple version comparison (returns 1 if a > b, -1 if a < b, 0 if equal)
114
336
  function compareVersions(a, b) {
337
+ if (!a || !b)
338
+ return 0;
115
339
  const partsA = a.replace(/^v/, '').split('.').map(Number);
116
340
  const partsB = b.replace(/^v/, '').split('.').map(Number);
117
341
  for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {
@@ -147,5 +371,31 @@ export async function removeInstalledPluginVersion(pluginId, projectPath) {
147
371
  // Clear marketplace cache
148
372
  export function clearMarketplaceCache() {
149
373
  marketplaceCache.clear();
374
+ localMarketplacesPromise = null;
375
+ }
376
+ // Get local marketplaces (with Promise-based caching to prevent race conditions)
377
+ async function getLocalMarketplaces() {
378
+ if (localMarketplacesPromise === null) {
379
+ localMarketplacesPromise = scanLocalMarketplaces();
380
+ }
381
+ return localMarketplacesPromise;
382
+ }
383
+ // Export local marketplaces for use in other modules
384
+ export async function getLocalMarketplacesInfo() {
385
+ return getLocalMarketplaces();
386
+ }
387
+ /**
388
+ * Refresh all marketplace data:
389
+ * 1. Git pull on all local marketplaces
390
+ * 2. Clear all caches (forces re-fetch from GitHub and re-scan of local)
391
+ * Returns results from git pull operations
392
+ * @param onProgress - Optional callback for progress updates
393
+ */
394
+ export async function refreshAllMarketplaces(onProgress) {
395
+ // First, git pull all local marketplaces
396
+ const results = await refreshLocalMarketplaces(onProgress);
397
+ // Then clear all caches to force fresh data
398
+ clearMarketplaceCache();
399
+ return results;
150
400
  }
151
401
  //# sourceMappingURL=plugin-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-manager.js","sourceRoot":"","sources":["../../src/services/plugin-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin-manager.js","sourceRoot":"","sources":["../../src/services/plugin-manager.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ export interface McpServer {
6
6
  env?: Record<string, string>;
7
7
  type?: 'http';
8
8
  url?: string;
9
- category: 'browser' | 'ai' | 'design' | 'dev-tools' | 'cloud' | 'database' | 'productivity';
9
+ category: 'browser' | 'ai' | 'design' | 'dev-tools' | 'cloud' | 'database' | 'productivity' | 'seo';
10
10
  requiresConfig?: boolean;
11
11
  configFields?: ConfigField[];
12
12
  }
@@ -28,6 +28,11 @@ export interface Marketplace {
28
28
  description: string;
29
29
  official?: boolean;
30
30
  }
31
+ export interface DiscoveredMarketplace {
32
+ name: string;
33
+ source: 'default' | 'configured' | 'inferred';
34
+ config?: MarketplaceSource;
35
+ }
31
36
  export interface Plugin {
32
37
  name: string;
33
38
  version: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ export declare const VERSION = "1.0.0";
3
+ export declare function App(): React.ReactElement;
4
+ export default App;
5
+ //# sourceMappingURL=InkApp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InkApp.d.ts","sourceRoot":"","sources":["../../src/ui/InkApp.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAkBnD,eAAO,MAAM,OAAO,UAAU,CAAC;AAkN/B,wBAAgB,GAAG,IAAI,KAAK,CAAC,YAAY,CAMxC;AAED,eAAe,GAAG,CAAC"}
@@ -0,0 +1,175 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { Box, Text, useApp as useInkApp, useInput, useStdout } from 'ink';
4
+ import fs from 'node:fs';
5
+ import { AppProvider, useApp, useNavigation, useModal } from './state/AppContext.js';
6
+ import { DimensionsProvider, useDimensions } from './state/DimensionsContext.js';
7
+ // Header removed as per new design
8
+ import { ModalContainer } from './components/modals/index.js';
9
+ import { PluginsScreen, McpScreen, McpRegistryScreen, StatusLineScreen, EnvVarsScreen, CliToolsScreen, } from './screens/index.js';
10
+ import { refreshLocalMarketplaces } from '../services/local-marketplace.js';
11
+ export const VERSION = '1.0.0';
12
+ function Router() {
13
+ const { state } = useApp();
14
+ const { currentRoute } = state;
15
+ switch (currentRoute.screen) {
16
+ case 'plugins':
17
+ return _jsx(PluginsScreen, {});
18
+ case 'mcp':
19
+ return _jsx(McpScreen, {});
20
+ case 'mcp-registry':
21
+ return _jsx(McpRegistryScreen, {});
22
+ case 'statusline':
23
+ return _jsx(StatusLineScreen, {});
24
+ case 'env-vars':
25
+ return _jsx(EnvVarsScreen, {});
26
+ case 'cli-tools':
27
+ return _jsx(CliToolsScreen, {});
28
+ default:
29
+ return _jsx(PluginsScreen, {});
30
+ }
31
+ }
32
+ function GlobalKeyHandler({ onDebugToggle }) {
33
+ const { state } = useApp();
34
+ const { navigateToScreen } = useNavigation();
35
+ const { exit } = useInkApp();
36
+ const modal = useModal();
37
+ const { stdout } = useStdout();
38
+ useInput((input, key) => {
39
+ // Debug key - always available
40
+ if (input === 'D' && key.shift) {
41
+ onDebugToggle();
42
+ // Also write debug info to file
43
+ const debugInfo = {
44
+ timestamp: new Date().toISOString(),
45
+ terminal: { rows: stdout?.rows, columns: stdout?.columns },
46
+ state: {
47
+ currentRoute: state.currentRoute,
48
+ isSearching: state.isSearching,
49
+ modal: state.modal ? { type: state.modal.type } : null,
50
+ plugins: {
51
+ scope: state.plugins.scope,
52
+ selectedIndex: state.plugins.selectedIndex,
53
+ searchQuery: state.plugins.searchQuery,
54
+ marketplacesStatus: state.plugins.marketplaces.status,
55
+ pluginsStatus: state.plugins.plugins.status,
56
+ },
57
+ },
58
+ };
59
+ fs.writeFileSync('/tmp/claudeup-debug.json', JSON.stringify(debugInfo, null, 2));
60
+ return;
61
+ }
62
+ // Don't handle keys when modal is open or searching
63
+ if (state.modal || state.isSearching)
64
+ return;
65
+ // Global navigation shortcuts (1-5) - include mcp-registry as it's a sub-screen of mcp
66
+ const isTopLevel = ['plugins', 'mcp', 'mcp-registry', 'statusline', 'env-vars', 'cli-tools'].includes(state.currentRoute.screen);
67
+ if (isTopLevel) {
68
+ if (input === '1')
69
+ navigateToScreen('plugins');
70
+ else if (input === '2')
71
+ navigateToScreen('mcp');
72
+ else if (input === '3')
73
+ navigateToScreen('statusline');
74
+ else if (input === '4')
75
+ navigateToScreen('env-vars');
76
+ else if (input === '5')
77
+ navigateToScreen('cli-tools');
78
+ // Tab navigation cycling
79
+ if (key.tab) {
80
+ const screens = ['plugins', 'mcp', 'statusline', 'env-vars', 'cli-tools'];
81
+ const currentIndex = screens.indexOf(state.currentRoute.screen);
82
+ if (currentIndex !== -1) {
83
+ const nextIndex = key.shift
84
+ ? (currentIndex - 1 + screens.length) % screens.length
85
+ : (currentIndex + 1) % screens.length;
86
+ navigateToScreen(screens[nextIndex]);
87
+ }
88
+ }
89
+ }
90
+ // Escape/q to go back or exit
91
+ if (key.escape || input === 'q') {
92
+ if (state.currentRoute.screen === 'plugins') {
93
+ // On home screen, exit immediately
94
+ exit();
95
+ }
96
+ else if (state.currentRoute.screen === 'mcp-registry') {
97
+ // Go back to MCP from registry
98
+ navigateToScreen('mcp');
99
+ }
100
+ else {
101
+ // Go back to plugins (home)
102
+ navigateToScreen('plugins');
103
+ }
104
+ }
105
+ // ? for help
106
+ if (input === '?') {
107
+ modal.message('claudeup Help', `Navigation
108
+ ↑/↓ or j/k Move selection
109
+ Enter Select / Toggle
110
+ Escape or q Back / Quit
111
+ ? This help
112
+
113
+ Quick Navigation
114
+ 1 Plugins 4 Env Vars
115
+ 2 MCP Servers 5 CLI Tools
116
+ 3 Status Line
117
+
118
+ Plugin Actions
119
+ u Update d Uninstall
120
+ a Update All r Refresh
121
+
122
+ MCP Servers
123
+ / Search local + remote
124
+ r Browse MCP registry`, 'info');
125
+ }
126
+ });
127
+ return null;
128
+ }
129
+ function ProgressIndicator({ message, current, total }) {
130
+ let progressText = message;
131
+ if (current !== undefined && total !== undefined && total > 0) {
132
+ const barWidth = 20;
133
+ const filled = Math.round((current / total) * barWidth);
134
+ const empty = barWidth - filled;
135
+ progressText += ` [${'█'.repeat(filled)}${'░'.repeat(empty)}] ${current}/${total}`;
136
+ }
137
+ return (_jsxs(Box, { paddingX: 1, children: [_jsx(Text, { color: "cyan", children: "\u27F3 " }), _jsx(Text, { children: progressText })] }));
138
+ }
139
+ function AppContentInner({ showDebug, onDebugToggle }) {
140
+ const { state, dispatch } = useApp();
141
+ const { progress } = state;
142
+ const dimensions = useDimensions();
143
+ // Auto-refresh marketplaces on startup
144
+ useEffect(() => {
145
+ const noRefresh = process.argv.includes('--no-refresh');
146
+ if (noRefresh)
147
+ return;
148
+ dispatch({ type: 'SHOW_PROGRESS', state: { message: 'Syncing marketplaces...' } });
149
+ refreshLocalMarketplaces((prog) => {
150
+ dispatch({
151
+ type: 'UPDATE_PROGRESS',
152
+ state: { message: `Syncing ${prog.name}...`, current: prog.current, total: prog.total },
153
+ });
154
+ })
155
+ .then(() => {
156
+ dispatch({ type: 'HIDE_PROGRESS' });
157
+ dispatch({ type: 'DATA_REFRESH_COMPLETE' });
158
+ })
159
+ .catch(() => {
160
+ dispatch({ type: 'HIDE_PROGRESS' });
161
+ });
162
+ }, [dispatch]);
163
+ return (_jsxs(Box, { flexDirection: "column", height: dimensions.terminalHeight, children: [showDebug && (_jsx(Box, { paddingX: 1, children: _jsxs(Text, { color: "yellow", dimColor: true, children: ["DEBUG: ", dimensions.terminalWidth, "x", dimensions.terminalHeight, " | content=", dimensions.contentHeight, " | screen=", state.currentRoute.screen] }) })), progress && _jsx(ProgressIndicator, { ...progress }), _jsx(Box, { flexDirection: "column", height: dimensions.contentHeight, paddingX: 1, overflow: "hidden", children: _jsx(Router, {}) }), _jsx(GlobalKeyHandler, { onDebugToggle: onDebugToggle }), _jsx(ModalContainer, {})] }));
164
+ }
165
+ function AppContent() {
166
+ const { state } = useApp();
167
+ const { progress } = state;
168
+ const [showDebug, setShowDebug] = useState(false);
169
+ return (_jsx(DimensionsProvider, { showProgress: !!progress, showDebug: showDebug, children: _jsx(AppContentInner, { showDebug: showDebug, onDebugToggle: () => setShowDebug(s => !s) }) }));
170
+ }
171
+ export function App() {
172
+ return (_jsx(AppProvider, { children: _jsx(AppContent, {}) }));
173
+ }
174
+ export default App;
175
+ //# sourceMappingURL=InkApp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InkApp.js","sourceRoot":"","sources":["../../src/ui/InkApp.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ interface CategoryHeaderProps {
3
+ /** Category title */
4
+ title: string;
5
+ /** Status badge (e.g., "✓ Configured", "3 plugins") */
6
+ status?: string;
7
+ /** Status badge color */
8
+ statusColor?: string;
9
+ /** Whether category is expanded */
10
+ expanded?: boolean;
11
+ /** Number of items in category */
12
+ count?: number;
13
+ }
14
+ export declare function CategoryHeader({ title, status, statusColor, expanded, count, }: CategoryHeaderProps): React.ReactElement;
15
+ export default CategoryHeader;
16
+ //# sourceMappingURL=CategoryHeader.d.ts.map