claudeup 1.7.0 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/claudeup.js +20 -2
- package/package.json +10 -19
- package/src/data/cli-tools.js +123 -0
- package/src/data/cli-tools.ts +140 -0
- package/{dist → src}/data/marketplaces.js +23 -24
- package/src/data/marketplaces.ts +95 -0
- package/src/data/mcp-servers.js +509 -0
- package/src/data/mcp-servers.ts +526 -0
- package/src/data/statuslines.js +159 -0
- package/src/data/statuslines.ts +188 -0
- package/src/index.js +4 -0
- package/src/index.ts +5 -0
- package/{dist → src}/main.js +46 -47
- package/src/main.tsx +145 -0
- package/src/opentui.d.ts +191 -0
- package/src/prerunner/index.js +87 -0
- package/src/prerunner/index.ts +124 -0
- package/{dist → src}/services/claude-runner.js +9 -10
- package/src/services/claude-runner.ts +31 -0
- package/{dist → src}/services/claude-settings.js +72 -33
- package/src/services/claude-settings.ts +934 -0
- package/src/services/local-marketplace.js +339 -0
- package/src/services/local-marketplace.ts +489 -0
- package/{dist → src}/services/mcp-registry.js +13 -14
- package/src/services/mcp-registry.ts +105 -0
- package/{dist → src}/services/plugin-manager.js +61 -13
- package/src/services/plugin-manager.ts +693 -0
- package/{dist → src}/services/plugin-mcp-config.js +19 -18
- package/src/services/plugin-mcp-config.ts +242 -0
- package/{dist → src}/services/update-cache.js +7 -8
- package/src/services/update-cache.ts +78 -0
- package/{dist → src}/services/version-check.js +15 -14
- package/src/services/version-check.ts +122 -0
- package/src/types/index.js +1 -0
- package/src/types/index.ts +141 -0
- package/src/ui/App.js +213 -0
- package/src/ui/App.tsx +359 -0
- package/src/ui/components/CategoryHeader.js +9 -0
- package/src/ui/components/CategoryHeader.tsx +41 -0
- package/{dist → src}/ui/components/ScrollableList.js +19 -6
- package/src/ui/components/ScrollableList.tsx +98 -0
- package/src/ui/components/SearchInput.js +19 -0
- package/src/ui/components/SearchInput.tsx +56 -0
- package/src/ui/components/StyledText.js +39 -0
- package/src/ui/components/StyledText.tsx +70 -0
- package/src/ui/components/TabBar.js +38 -0
- package/src/ui/components/TabBar.tsx +88 -0
- package/src/ui/components/layout/Panel.js +6 -0
- package/src/ui/components/layout/Panel.tsx +62 -0
- package/src/ui/components/layout/ProgressBar.js +14 -0
- package/src/ui/components/layout/ProgressBar.tsx +47 -0
- package/src/ui/components/layout/ScopeTabs.js +6 -0
- package/src/ui/components/layout/ScopeTabs.tsx +53 -0
- package/src/ui/components/layout/ScreenLayout.js +21 -0
- package/src/ui/components/layout/ScreenLayout.tsx +147 -0
- package/src/ui/components/layout/index.js +4 -0
- package/src/ui/components/layout/index.ts +4 -0
- package/src/ui/components/modals/ConfirmModal.js +14 -0
- package/src/ui/components/modals/ConfirmModal.tsx +59 -0
- package/src/ui/components/modals/InputModal.js +16 -0
- package/src/ui/components/modals/InputModal.tsx +68 -0
- package/src/ui/components/modals/LoadingModal.js +14 -0
- package/src/ui/components/modals/LoadingModal.tsx +40 -0
- package/src/ui/components/modals/MessageModal.js +16 -0
- package/src/ui/components/modals/MessageModal.tsx +64 -0
- package/src/ui/components/modals/ModalContainer.js +56 -0
- package/src/ui/components/modals/ModalContainer.tsx +104 -0
- package/src/ui/components/modals/SelectModal.js +26 -0
- package/src/ui/components/modals/SelectModal.tsx +82 -0
- package/src/ui/components/modals/index.js +6 -0
- package/src/ui/components/modals/index.ts +6 -0
- package/src/ui/hooks/index.js +3 -0
- package/src/ui/hooks/index.ts +3 -0
- package/{dist → src}/ui/hooks/useAsyncData.js +21 -22
- package/src/ui/hooks/useAsyncData.ts +127 -0
- package/src/ui/hooks/useKeyboard.js +13 -0
- package/src/ui/hooks/useKeyboard.ts +26 -0
- package/src/ui/hooks/useKeyboardHandler.js +39 -0
- package/src/ui/hooks/useKeyboardHandler.ts +63 -0
- package/{dist → src}/ui/screens/CliToolsScreen.js +60 -54
- package/src/ui/screens/CliToolsScreen.tsx +468 -0
- package/src/ui/screens/EnvVarsScreen.js +154 -0
- package/src/ui/screens/EnvVarsScreen.tsx +269 -0
- package/{dist → src}/ui/screens/McpRegistryScreen.js +56 -55
- package/src/ui/screens/McpRegistryScreen.tsx +331 -0
- package/{dist → src}/ui/screens/McpScreen.js +46 -47
- package/src/ui/screens/McpScreen.tsx +392 -0
- package/src/ui/screens/ModelSelectorScreen.js +292 -0
- package/src/ui/screens/ModelSelectorScreen.tsx +441 -0
- package/{dist → src}/ui/screens/PluginsScreen.js +305 -293
- package/src/ui/screens/PluginsScreen.tsx +1231 -0
- package/src/ui/screens/StatusLineScreen.js +200 -0
- package/src/ui/screens/StatusLineScreen.tsx +411 -0
- package/src/ui/screens/index.js +7 -0
- package/src/ui/screens/index.ts +7 -0
- package/src/ui/state/AnimationContext.js +34 -0
- package/src/ui/state/AnimationContext.tsx +76 -0
- package/{dist → src}/ui/state/AppContext.js +31 -32
- package/src/ui/state/AppContext.tsx +235 -0
- package/{dist → src}/ui/state/DimensionsContext.js +16 -17
- package/src/ui/state/DimensionsContext.tsx +144 -0
- package/{dist → src}/ui/state/reducer.js +89 -90
- package/src/ui/state/reducer.ts +467 -0
- package/src/ui/state/types.js +1 -0
- package/src/ui/state/types.ts +273 -0
- package/{dist → src}/utils/command-utils.js +3 -4
- package/src/utils/command-utils.ts +20 -0
- package/{dist → src}/utils/fuzzy-search.js +2 -3
- package/src/utils/fuzzy-search.ts +138 -0
- package/{dist → src}/utils/string-utils.js +6 -6
- package/src/utils/string-utils.ts +88 -0
- package/dist/data/cli-tools.d.ts +0 -13
- package/dist/data/cli-tools.d.ts.map +0 -1
- package/dist/data/cli-tools.js +0 -124
- package/dist/data/cli-tools.js.map +0 -1
- package/dist/data/marketplaces.d.ts +0 -6
- package/dist/data/marketplaces.d.ts.map +0 -1
- package/dist/data/marketplaces.js.map +0 -1
- package/dist/data/mcp-servers.d.ts +0 -8
- package/dist/data/mcp-servers.d.ts.map +0 -1
- package/dist/data/mcp-servers.js +0 -503
- package/dist/data/mcp-servers.js.map +0 -1
- package/dist/data/statuslines.d.ts +0 -10
- package/dist/data/statuslines.d.ts.map +0 -1
- package/dist/data/statuslines.js +0 -160
- package/dist/data/statuslines.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -90
- package/dist/index.js.map +0 -1
- package/dist/main.d.ts +0 -3
- package/dist/main.d.ts.map +0 -1
- package/dist/main.js.map +0 -1
- package/dist/prerunner/index.d.ts +0 -7
- package/dist/prerunner/index.d.ts.map +0 -1
- package/dist/prerunner/index.js +0 -64
- package/dist/prerunner/index.js.map +0 -1
- package/dist/services/claude-runner.d.ts +0 -7
- package/dist/services/claude-runner.d.ts.map +0 -1
- package/dist/services/claude-runner.js.map +0 -1
- package/dist/services/claude-settings.d.ts +0 -73
- package/dist/services/claude-settings.d.ts.map +0 -1
- package/dist/services/claude-settings.js.map +0 -1
- package/dist/services/local-marketplace.d.ts +0 -111
- package/dist/services/local-marketplace.d.ts.map +0 -1
- package/dist/services/local-marketplace.js +0 -599
- package/dist/services/local-marketplace.js.map +0 -1
- package/dist/services/mcp-registry.d.ts +0 -10
- package/dist/services/mcp-registry.d.ts.map +0 -1
- package/dist/services/mcp-registry.js.map +0 -1
- package/dist/services/plugin-manager.d.ts +0 -65
- package/dist/services/plugin-manager.d.ts.map +0 -1
- package/dist/services/plugin-manager.js.map +0 -1
- package/dist/services/plugin-mcp-config.d.ts +0 -52
- package/dist/services/plugin-mcp-config.d.ts.map +0 -1
- package/dist/services/plugin-mcp-config.js.map +0 -1
- package/dist/services/update-cache.d.ts +0 -16
- package/dist/services/update-cache.d.ts.map +0 -1
- package/dist/services/update-cache.js.map +0 -1
- package/dist/services/version-check.d.ts +0 -20
- package/dist/services/version-check.d.ts.map +0 -1
- package/dist/services/version-check.js.map +0 -1
- package/dist/types/index.d.ts +0 -105
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -2
- package/dist/types/index.js.map +0 -1
- package/dist/ui/InkApp.d.ts +0 -5
- package/dist/ui/InkApp.d.ts.map +0 -1
- package/dist/ui/InkApp.js +0 -188
- package/dist/ui/InkApp.js.map +0 -1
- package/dist/ui/components/CategoryHeader.d.ts +0 -16
- package/dist/ui/components/CategoryHeader.d.ts.map +0 -1
- package/dist/ui/components/CategoryHeader.js +0 -11
- package/dist/ui/components/CategoryHeader.js.map +0 -1
- package/dist/ui/components/ScrollableList.d.ts +0 -16
- package/dist/ui/components/ScrollableList.d.ts.map +0 -1
- package/dist/ui/components/ScrollableList.js.map +0 -1
- package/dist/ui/components/SearchInput.d.ts +0 -18
- package/dist/ui/components/SearchInput.d.ts.map +0 -1
- package/dist/ui/components/SearchInput.js +0 -30
- package/dist/ui/components/SearchInput.js.map +0 -1
- package/dist/ui/components/TabBar.d.ts +0 -8
- package/dist/ui/components/TabBar.d.ts.map +0 -1
- package/dist/ui/components/TabBar.js +0 -18
- package/dist/ui/components/TabBar.js.map +0 -1
- package/dist/ui/components/layout/Footer.d.ts +0 -14
- package/dist/ui/components/layout/Footer.d.ts.map +0 -1
- package/dist/ui/components/layout/Footer.js +0 -23
- package/dist/ui/components/layout/Footer.js.map +0 -1
- package/dist/ui/components/layout/Header.d.ts +0 -4
- package/dist/ui/components/layout/Header.d.ts.map +0 -1
- package/dist/ui/components/layout/Header.js +0 -25
- package/dist/ui/components/layout/Header.js.map +0 -1
- package/dist/ui/components/layout/Panel.d.ts +0 -22
- package/dist/ui/components/layout/Panel.d.ts.map +0 -1
- package/dist/ui/components/layout/Panel.js +0 -8
- package/dist/ui/components/layout/Panel.js.map +0 -1
- package/dist/ui/components/layout/ProgressBar.d.ts +0 -12
- package/dist/ui/components/layout/ProgressBar.d.ts.map +0 -1
- package/dist/ui/components/layout/ProgressBar.js +0 -16
- package/dist/ui/components/layout/ProgressBar.js.map +0 -1
- package/dist/ui/components/layout/ScopeTabs.d.ts +0 -12
- package/dist/ui/components/layout/ScopeTabs.d.ts.map +0 -1
- package/dist/ui/components/layout/ScopeTabs.js +0 -8
- package/dist/ui/components/layout/ScopeTabs.js.map +0 -1
- package/dist/ui/components/layout/ScreenLayout.d.ts +0 -30
- package/dist/ui/components/layout/ScreenLayout.d.ts.map +0 -1
- package/dist/ui/components/layout/ScreenLayout.js +0 -23
- package/dist/ui/components/layout/ScreenLayout.js.map +0 -1
- package/dist/ui/components/layout/index.d.ts +0 -7
- package/dist/ui/components/layout/index.d.ts.map +0 -1
- package/dist/ui/components/layout/index.js +0 -7
- package/dist/ui/components/layout/index.js.map +0 -1
- package/dist/ui/components/modals/ConfirmModal.d.ts +0 -14
- package/dist/ui/components/modals/ConfirmModal.d.ts.map +0 -1
- package/dist/ui/components/modals/ConfirmModal.js +0 -15
- package/dist/ui/components/modals/ConfirmModal.js.map +0 -1
- package/dist/ui/components/modals/InputModal.d.ts +0 -16
- package/dist/ui/components/modals/InputModal.d.ts.map +0 -1
- package/dist/ui/components/modals/InputModal.js +0 -23
- package/dist/ui/components/modals/InputModal.js.map +0 -1
- package/dist/ui/components/modals/LoadingModal.d.ts +0 -8
- package/dist/ui/components/modals/LoadingModal.d.ts.map +0 -1
- package/dist/ui/components/modals/LoadingModal.js +0 -8
- package/dist/ui/components/modals/LoadingModal.js.map +0 -1
- package/dist/ui/components/modals/MessageModal.d.ts +0 -14
- package/dist/ui/components/modals/MessageModal.d.ts.map +0 -1
- package/dist/ui/components/modals/MessageModal.js +0 -17
- package/dist/ui/components/modals/MessageModal.js.map +0 -1
- package/dist/ui/components/modals/ModalContainer.d.ts +0 -7
- package/dist/ui/components/modals/ModalContainer.d.ts.map +0 -1
- package/dist/ui/components/modals/ModalContainer.js +0 -38
- package/dist/ui/components/modals/ModalContainer.js.map +0 -1
- package/dist/ui/components/modals/SelectModal.d.ts +0 -17
- package/dist/ui/components/modals/SelectModal.d.ts.map +0 -1
- package/dist/ui/components/modals/SelectModal.js +0 -33
- package/dist/ui/components/modals/SelectModal.js.map +0 -1
- package/dist/ui/components/modals/index.d.ts +0 -7
- package/dist/ui/components/modals/index.d.ts.map +0 -1
- package/dist/ui/components/modals/index.js +0 -7
- package/dist/ui/components/modals/index.js.map +0 -1
- package/dist/ui/hooks/index.d.ts +0 -3
- package/dist/ui/hooks/index.d.ts.map +0 -1
- package/dist/ui/hooks/index.js +0 -3
- package/dist/ui/hooks/index.js.map +0 -1
- package/dist/ui/hooks/useAsyncData.d.ts +0 -40
- package/dist/ui/hooks/useAsyncData.d.ts.map +0 -1
- package/dist/ui/hooks/useAsyncData.js.map +0 -1
- package/dist/ui/hooks/useKeyboardNavigation.d.ts +0 -27
- package/dist/ui/hooks/useKeyboardNavigation.d.ts.map +0 -1
- package/dist/ui/hooks/useKeyboardNavigation.js +0 -82
- package/dist/ui/hooks/useKeyboardNavigation.js.map +0 -1
- package/dist/ui/screens/CliToolsScreen.d.ts +0 -4
- package/dist/ui/screens/CliToolsScreen.d.ts.map +0 -1
- package/dist/ui/screens/CliToolsScreen.js.map +0 -1
- package/dist/ui/screens/EnvVarsScreen.d.ts +0 -4
- package/dist/ui/screens/EnvVarsScreen.d.ts.map +0 -1
- package/dist/ui/screens/EnvVarsScreen.js +0 -145
- package/dist/ui/screens/EnvVarsScreen.js.map +0 -1
- package/dist/ui/screens/McpRegistryScreen.d.ts +0 -4
- package/dist/ui/screens/McpRegistryScreen.d.ts.map +0 -1
- package/dist/ui/screens/McpRegistryScreen.js.map +0 -1
- package/dist/ui/screens/McpScreen.d.ts +0 -4
- package/dist/ui/screens/McpScreen.d.ts.map +0 -1
- package/dist/ui/screens/McpScreen.js.map +0 -1
- package/dist/ui/screens/ModelSelectorScreen.d.ts +0 -4
- package/dist/ui/screens/ModelSelectorScreen.d.ts.map +0 -1
- package/dist/ui/screens/ModelSelectorScreen.js +0 -143
- package/dist/ui/screens/ModelSelectorScreen.js.map +0 -1
- package/dist/ui/screens/PluginsScreen.d.ts +0 -4
- package/dist/ui/screens/PluginsScreen.d.ts.map +0 -1
- package/dist/ui/screens/PluginsScreen.js.map +0 -1
- package/dist/ui/screens/StatusLineScreen.d.ts +0 -4
- package/dist/ui/screens/StatusLineScreen.d.ts.map +0 -1
- package/dist/ui/screens/StatusLineScreen.js +0 -197
- package/dist/ui/screens/StatusLineScreen.js.map +0 -1
- package/dist/ui/screens/index.d.ts +0 -8
- package/dist/ui/screens/index.d.ts.map +0 -1
- package/dist/ui/screens/index.js +0 -8
- package/dist/ui/screens/index.js.map +0 -1
- package/dist/ui/state/AppContext.d.ts +0 -40
- package/dist/ui/state/AppContext.d.ts.map +0 -1
- package/dist/ui/state/AppContext.js.map +0 -1
- package/dist/ui/state/DimensionsContext.d.ts +0 -27
- package/dist/ui/state/DimensionsContext.d.ts.map +0 -1
- package/dist/ui/state/DimensionsContext.js.map +0 -1
- package/dist/ui/state/reducer.d.ts +0 -4
- package/dist/ui/state/reducer.d.ts.map +0 -1
- package/dist/ui/state/reducer.js.map +0 -1
- package/dist/ui/state/types.d.ts +0 -266
- package/dist/ui/state/types.d.ts.map +0 -1
- package/dist/ui/state/types.js +0 -2
- package/dist/ui/state/types.js.map +0 -1
- package/dist/utils/command-utils.d.ts +0 -8
- package/dist/utils/command-utils.d.ts.map +0 -1
- package/dist/utils/command-utils.js.map +0 -1
- package/dist/utils/fuzzy-search.d.ts +0 -33
- package/dist/utils/fuzzy-search.d.ts.map +0 -1
- package/dist/utils/fuzzy-search.js.map +0 -1
- package/dist/utils/string-utils.d.ts +0 -24
- package/dist/utils/string-utils.d.ts.map +0 -1
- package/dist/utils/string-utils.js.map +0 -1
package/bin/claudeup.js
CHANGED
|
@@ -1,6 +1,24 @@
|
|
|
1
|
-
#!/usr/bin/env
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
// Check Bun version
|
|
4
|
+
const bunVersion = process.versions.bun;
|
|
5
|
+
if (!bunVersion) {
|
|
6
|
+
console.error('Error: claudeup v3.0.0+ requires Bun runtime.');
|
|
7
|
+
console.error('Please install Bun: https://bun.sh');
|
|
8
|
+
console.error('');
|
|
9
|
+
console.error('Quick install:');
|
|
10
|
+
console.error(' curl -fsSL https://bun.sh/install | bash');
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const [major] = bunVersion.split('.').map(Number);
|
|
15
|
+
if (major < 1) {
|
|
16
|
+
console.error(`Error: claudeup requires Bun >=1.0.0 (current: ${bunVersion})`);
|
|
17
|
+
console.error('Please upgrade Bun: bun upgrade');
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
import('../src/main.tsx').catch((err) => {
|
|
4
22
|
console.error('Failed to start claudeup:', err.message);
|
|
5
23
|
process.exit(1);
|
|
6
24
|
});
|
package/package.json
CHANGED
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claudeup",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.3.0",
|
|
4
4
|
"description": "TUI tool for managing Claude Code plugins, MCPs, and configuration",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "
|
|
6
|
+
"main": "src/main.tsx",
|
|
7
7
|
"bin": {
|
|
8
8
|
"claudeup": "bin/claudeup.js"
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
|
-
"
|
|
11
|
+
"start": "bun run src/main.tsx",
|
|
12
12
|
"dev": "bun --watch src/main.tsx",
|
|
13
|
-
"dev:tsc": "tsc -w",
|
|
14
|
-
"start": "node dist/main.js",
|
|
15
|
-
"start:bun": "bun run src/main.tsx",
|
|
16
13
|
"lint": "npm run eslint",
|
|
17
14
|
"format": "biome format --write src/",
|
|
18
15
|
"eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"",
|
|
@@ -30,7 +27,7 @@
|
|
|
30
27
|
"plugins",
|
|
31
28
|
"tui",
|
|
32
29
|
"cli",
|
|
33
|
-
"
|
|
30
|
+
"opentui",
|
|
34
31
|
"react"
|
|
35
32
|
],
|
|
36
33
|
"author": "Jack Rudenko <i@madappgang.com>",
|
|
@@ -44,32 +41,26 @@
|
|
|
44
41
|
},
|
|
45
42
|
"homepage": "https://github.com/MadAppGang/claude-code/tree/main/tools/claudeup#readme",
|
|
46
43
|
"engines": {
|
|
47
|
-
"
|
|
44
|
+
"bun": ">=1.0.0"
|
|
48
45
|
},
|
|
49
46
|
"files": [
|
|
50
47
|
"bin/",
|
|
51
|
-
"
|
|
48
|
+
"src/"
|
|
52
49
|
],
|
|
53
50
|
"dependencies": {
|
|
54
|
-
"@
|
|
55
|
-
"@
|
|
51
|
+
"@opentui/core": "^0.1.75",
|
|
52
|
+
"@opentui/react": "^0.1.75",
|
|
56
53
|
"chalk": "^5.3.0",
|
|
57
54
|
"fs-extra": "^11.2.0",
|
|
58
|
-
"
|
|
59
|
-
"ink-chart": "^0.1.1",
|
|
60
|
-
"ink-markdown": "^1.0.4",
|
|
61
|
-
"ink-spinner": "^5.0.0",
|
|
62
|
-
"ink-text-input": "^6.0.0",
|
|
63
|
-
"react": "^18.3.1",
|
|
55
|
+
"react": "^19.0.0",
|
|
64
56
|
"semver": "^7.6.3"
|
|
65
57
|
},
|
|
66
58
|
"devDependencies": {
|
|
67
59
|
"@biomejs/biome": "^1.9.4",
|
|
68
60
|
"@types/fs-extra": "^11.0.4",
|
|
69
61
|
"@types/node": "^22.9.0",
|
|
70
|
-
"@types/react": "^
|
|
62
|
+
"@types/react": "^19.0.0",
|
|
71
63
|
"@types/semver": "^7.5.8",
|
|
72
|
-
"ink-testing-library": "^4.0.0",
|
|
73
64
|
"typescript": "^5.6.3"
|
|
74
65
|
},
|
|
75
66
|
"templateOSS": {
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
export const cliTools = [
|
|
2
|
+
{
|
|
3
|
+
name: "claudeup",
|
|
4
|
+
displayName: "claudeup",
|
|
5
|
+
description: "TUI tool for managing Claude Code plugins, MCPs, and configuration",
|
|
6
|
+
installCommand: "npm install -g claudeup",
|
|
7
|
+
checkCommand: "claudeup --version",
|
|
8
|
+
website: "https://github.com/MadAppGang/claude-code/tree/main/tools/claudeup",
|
|
9
|
+
category: "ai-coding",
|
|
10
|
+
packageManager: "npm",
|
|
11
|
+
packageName: "claudeup",
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: "claudemem",
|
|
15
|
+
displayName: "Claudemem",
|
|
16
|
+
description: "Local semantic code search for Claude Code with vector embeddings",
|
|
17
|
+
installCommand: "npm install -g claude-codemem",
|
|
18
|
+
checkCommand: "claudemem --version",
|
|
19
|
+
website: "https://github.com/MadAppGang/claudemem",
|
|
20
|
+
category: "ai-coding",
|
|
21
|
+
packageManager: "npm",
|
|
22
|
+
packageName: "claude-codemem",
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: "claudish",
|
|
26
|
+
displayName: "Claudish",
|
|
27
|
+
description: "Run Claude Code with OpenRouter models (Grok, GPT-5, Gemini)",
|
|
28
|
+
installCommand: "npm install -g claudish",
|
|
29
|
+
checkCommand: "claudish --version",
|
|
30
|
+
website: "https://github.com/MadAppGang/claudish",
|
|
31
|
+
category: "ai-coding",
|
|
32
|
+
packageManager: "npm",
|
|
33
|
+
packageName: "claudish",
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: "claude",
|
|
37
|
+
displayName: "Claude Code",
|
|
38
|
+
description: "Anthropic official agentic coding tool",
|
|
39
|
+
installCommand: "npm install -g @anthropic-ai/claude-code",
|
|
40
|
+
checkCommand: "claude --version",
|
|
41
|
+
website: "https://claude.ai/code",
|
|
42
|
+
category: "ai-coding",
|
|
43
|
+
packageManager: "npm",
|
|
44
|
+
packageName: "@anthropic-ai/claude-code",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: "codex",
|
|
48
|
+
displayName: "OpenAI Codex",
|
|
49
|
+
description: "Lightweight coding agent from OpenAI that runs in your terminal",
|
|
50
|
+
installCommand: "npm install -g @openai/codex",
|
|
51
|
+
checkCommand: "codex --version",
|
|
52
|
+
website: "https://github.com/openai/codex",
|
|
53
|
+
category: "ai-coding",
|
|
54
|
+
packageManager: "npm",
|
|
55
|
+
packageName: "@openai/codex",
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: "gemini",
|
|
59
|
+
displayName: "Gemini CLI",
|
|
60
|
+
description: "Google AI agent with 1M token context, free tier available",
|
|
61
|
+
installCommand: "npm install -g @google/gemini-cli",
|
|
62
|
+
checkCommand: "gemini --version",
|
|
63
|
+
website: "https://github.com/google-gemini/gemini-cli",
|
|
64
|
+
category: "ai-coding",
|
|
65
|
+
packageManager: "npm",
|
|
66
|
+
packageName: "@google/gemini-cli",
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: "qwen",
|
|
70
|
+
displayName: "Qwen Code",
|
|
71
|
+
description: "Alibaba coding agent optimized for Qwen3-Coder models",
|
|
72
|
+
installCommand: "npm install -g @qwen-code/qwen-code",
|
|
73
|
+
checkCommand: "qwen --version",
|
|
74
|
+
website: "https://github.com/QwenLM/qwen-code",
|
|
75
|
+
category: "ai-coding",
|
|
76
|
+
packageManager: "npm",
|
|
77
|
+
packageName: "@qwen-code/qwen-code",
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: "cline",
|
|
81
|
+
displayName: "Cline",
|
|
82
|
+
description: "Autonomous coding agent with plan & act, checkpoints, browser use",
|
|
83
|
+
installCommand: "npm install -g cline",
|
|
84
|
+
checkCommand: "cline --version",
|
|
85
|
+
website: "https://cline.bot",
|
|
86
|
+
category: "ai-coding",
|
|
87
|
+
packageManager: "npm",
|
|
88
|
+
packageName: "cline",
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: "opencode",
|
|
92
|
+
displayName: "OpenCode",
|
|
93
|
+
description: "Open source AI coding agent trusted by 400k+ developers",
|
|
94
|
+
installCommand: "npm install -g opencode-ai",
|
|
95
|
+
checkCommand: "opencode --version",
|
|
96
|
+
website: "https://opencode.ai",
|
|
97
|
+
category: "ai-coding",
|
|
98
|
+
packageManager: "npm",
|
|
99
|
+
packageName: "opencode-ai",
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: "aider",
|
|
103
|
+
displayName: "Aider",
|
|
104
|
+
description: "AI pair programming - works with Claude, GPT-4, local models",
|
|
105
|
+
installCommand: "pip install aider-install && aider-install",
|
|
106
|
+
checkCommand: "aider --version",
|
|
107
|
+
website: "https://aider.chat",
|
|
108
|
+
category: "ai-coding",
|
|
109
|
+
packageManager: "pip",
|
|
110
|
+
packageName: "aider-chat",
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: "crush",
|
|
114
|
+
displayName: "Crush",
|
|
115
|
+
description: "AI coding assistant from Charm with terminal-native UX",
|
|
116
|
+
installCommand: "npm install -g @charmland/crush",
|
|
117
|
+
checkCommand: "crush --version",
|
|
118
|
+
website: "https://github.com/charmbracelet/crush",
|
|
119
|
+
category: "ai-coding",
|
|
120
|
+
packageManager: "npm",
|
|
121
|
+
packageName: "@charmland/crush",
|
|
122
|
+
},
|
|
123
|
+
];
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
export interface CliTool {
|
|
2
|
+
name: string;
|
|
3
|
+
displayName: string;
|
|
4
|
+
description: string;
|
|
5
|
+
installCommand: string;
|
|
6
|
+
checkCommand: string;
|
|
7
|
+
website: string;
|
|
8
|
+
category: "ai-coding" | "utility";
|
|
9
|
+
packageManager: "npm" | "pip";
|
|
10
|
+
packageName: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const cliTools: CliTool[] = [
|
|
14
|
+
{
|
|
15
|
+
name: "claudeup",
|
|
16
|
+
displayName: "claudeup",
|
|
17
|
+
description:
|
|
18
|
+
"TUI tool for managing Claude Code plugins, MCPs, and configuration",
|
|
19
|
+
installCommand: "npm install -g claudeup",
|
|
20
|
+
checkCommand: "claudeup --version",
|
|
21
|
+
website:
|
|
22
|
+
"https://github.com/MadAppGang/claude-code/tree/main/tools/claudeup",
|
|
23
|
+
category: "ai-coding",
|
|
24
|
+
packageManager: "npm",
|
|
25
|
+
packageName: "claudeup",
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: "claudemem",
|
|
29
|
+
displayName: "Claudemem",
|
|
30
|
+
description:
|
|
31
|
+
"Local semantic code search for Claude Code with vector embeddings",
|
|
32
|
+
installCommand: "npm install -g claude-codemem",
|
|
33
|
+
checkCommand: "claudemem --version",
|
|
34
|
+
website: "https://github.com/MadAppGang/claudemem",
|
|
35
|
+
category: "ai-coding",
|
|
36
|
+
packageManager: "npm",
|
|
37
|
+
packageName: "claude-codemem",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: "claudish",
|
|
41
|
+
displayName: "Claudish",
|
|
42
|
+
description: "Run Claude Code with OpenRouter models (Grok, GPT-5, Gemini)",
|
|
43
|
+
installCommand: "npm install -g claudish",
|
|
44
|
+
checkCommand: "claudish --version",
|
|
45
|
+
website: "https://github.com/MadAppGang/claudish",
|
|
46
|
+
category: "ai-coding",
|
|
47
|
+
packageManager: "npm",
|
|
48
|
+
packageName: "claudish",
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: "claude",
|
|
52
|
+
displayName: "Claude Code",
|
|
53
|
+
description: "Anthropic official agentic coding tool",
|
|
54
|
+
installCommand: "npm install -g @anthropic-ai/claude-code",
|
|
55
|
+
checkCommand: "claude --version",
|
|
56
|
+
website: "https://claude.ai/code",
|
|
57
|
+
category: "ai-coding",
|
|
58
|
+
packageManager: "npm",
|
|
59
|
+
packageName: "@anthropic-ai/claude-code",
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: "codex",
|
|
63
|
+
displayName: "OpenAI Codex",
|
|
64
|
+
description:
|
|
65
|
+
"Lightweight coding agent from OpenAI that runs in your terminal",
|
|
66
|
+
installCommand: "npm install -g @openai/codex",
|
|
67
|
+
checkCommand: "codex --version",
|
|
68
|
+
website: "https://github.com/openai/codex",
|
|
69
|
+
category: "ai-coding",
|
|
70
|
+
packageManager: "npm",
|
|
71
|
+
packageName: "@openai/codex",
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: "gemini",
|
|
75
|
+
displayName: "Gemini CLI",
|
|
76
|
+
description: "Google AI agent with 1M token context, free tier available",
|
|
77
|
+
installCommand: "npm install -g @google/gemini-cli",
|
|
78
|
+
checkCommand: "gemini --version",
|
|
79
|
+
website: "https://github.com/google-gemini/gemini-cli",
|
|
80
|
+
category: "ai-coding",
|
|
81
|
+
packageManager: "npm",
|
|
82
|
+
packageName: "@google/gemini-cli",
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: "qwen",
|
|
86
|
+
displayName: "Qwen Code",
|
|
87
|
+
description: "Alibaba coding agent optimized for Qwen3-Coder models",
|
|
88
|
+
installCommand: "npm install -g @qwen-code/qwen-code",
|
|
89
|
+
checkCommand: "qwen --version",
|
|
90
|
+
website: "https://github.com/QwenLM/qwen-code",
|
|
91
|
+
category: "ai-coding",
|
|
92
|
+
packageManager: "npm",
|
|
93
|
+
packageName: "@qwen-code/qwen-code",
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: "cline",
|
|
97
|
+
displayName: "Cline",
|
|
98
|
+
description:
|
|
99
|
+
"Autonomous coding agent with plan & act, checkpoints, browser use",
|
|
100
|
+
installCommand: "npm install -g cline",
|
|
101
|
+
checkCommand: "cline --version",
|
|
102
|
+
website: "https://cline.bot",
|
|
103
|
+
category: "ai-coding",
|
|
104
|
+
packageManager: "npm",
|
|
105
|
+
packageName: "cline",
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: "opencode",
|
|
109
|
+
displayName: "OpenCode",
|
|
110
|
+
description: "Open source AI coding agent trusted by 400k+ developers",
|
|
111
|
+
installCommand: "npm install -g opencode-ai",
|
|
112
|
+
checkCommand: "opencode --version",
|
|
113
|
+
website: "https://opencode.ai",
|
|
114
|
+
category: "ai-coding",
|
|
115
|
+
packageManager: "npm",
|
|
116
|
+
packageName: "opencode-ai",
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: "aider",
|
|
120
|
+
displayName: "Aider",
|
|
121
|
+
description: "AI pair programming - works with Claude, GPT-4, local models",
|
|
122
|
+
installCommand: "pip install aider-install && aider-install",
|
|
123
|
+
checkCommand: "aider --version",
|
|
124
|
+
website: "https://aider.chat",
|
|
125
|
+
category: "ai-coding",
|
|
126
|
+
packageManager: "pip",
|
|
127
|
+
packageName: "aider-chat",
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
name: "crush",
|
|
131
|
+
displayName: "Crush",
|
|
132
|
+
description: "AI coding assistant from Charm with terminal-native UX",
|
|
133
|
+
installCommand: "npm install -g @charmland/crush",
|
|
134
|
+
checkCommand: "crush --version",
|
|
135
|
+
website: "https://github.com/charmbracelet/crush",
|
|
136
|
+
category: "ai-coding",
|
|
137
|
+
packageManager: "npm",
|
|
138
|
+
packageName: "@charmland/crush",
|
|
139
|
+
},
|
|
140
|
+
];
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import { formatMarketplaceName } from
|
|
1
|
+
import { formatMarketplaceName } from "../utils/string-utils.js";
|
|
2
2
|
export const defaultMarketplaces = [
|
|
3
3
|
{
|
|
4
|
-
name:
|
|
5
|
-
displayName:
|
|
4
|
+
name: "mag-claude-plugins",
|
|
5
|
+
displayName: "MadAppGang Plugins",
|
|
6
6
|
source: {
|
|
7
|
-
source:
|
|
8
|
-
repo:
|
|
7
|
+
source: "github",
|
|
8
|
+
repo: "MadAppGang/claude-code",
|
|
9
9
|
},
|
|
10
|
-
description:
|
|
10
|
+
description: "Professional plugins for frontend, backend, and code analysis",
|
|
11
11
|
official: false,
|
|
12
12
|
featured: true, // Always show plugins (expanded by default)
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
|
-
name:
|
|
16
|
-
displayName:
|
|
15
|
+
name: "claude-plugins-official",
|
|
16
|
+
displayName: "Anthropic Official",
|
|
17
17
|
source: {
|
|
18
|
-
source:
|
|
19
|
-
repo:
|
|
18
|
+
source: "github",
|
|
19
|
+
repo: "anthropics/claude-plugins-official",
|
|
20
20
|
},
|
|
21
|
-
description:
|
|
21
|
+
description: "Official Anthropic-managed directory of high quality Claude Code plugins",
|
|
22
22
|
official: true,
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
|
-
name:
|
|
26
|
-
displayName:
|
|
25
|
+
name: "claude-code-plugins",
|
|
26
|
+
displayName: "Anthropic Deprecated",
|
|
27
27
|
source: {
|
|
28
|
-
source:
|
|
29
|
-
repo:
|
|
28
|
+
source: "github",
|
|
29
|
+
repo: "anthropics/claude-code",
|
|
30
30
|
},
|
|
31
|
-
description:
|
|
31
|
+
description: "Legacy demo plugins from Anthropic (deprecated - use Official instead)",
|
|
32
32
|
official: true,
|
|
33
33
|
},
|
|
34
34
|
];
|
|
@@ -44,7 +44,7 @@ export function getAllMarketplaces(localMarketplaces) {
|
|
|
44
44
|
// Primary source: local cache (what's actually cloned)
|
|
45
45
|
if (localMarketplaces) {
|
|
46
46
|
for (const [name, local] of localMarketplaces) {
|
|
47
|
-
const repo = local.gitRepo ||
|
|
47
|
+
const repo = local.gitRepo || "";
|
|
48
48
|
if (repo)
|
|
49
49
|
seenRepos.add(repo.toLowerCase());
|
|
50
50
|
// Check if this marketplace has defaults (for official/featured flags)
|
|
@@ -52,16 +52,16 @@ export function getAllMarketplaces(localMarketplaces) {
|
|
|
52
52
|
all.set(name, {
|
|
53
53
|
name,
|
|
54
54
|
displayName: local.name || formatMarketplaceName(name),
|
|
55
|
-
source: { source:
|
|
56
|
-
description: local.description ||
|
|
57
|
-
official: defaultMp?.official ?? repo.toLowerCase().includes(
|
|
55
|
+
source: { source: "github", repo },
|
|
56
|
+
description: local.description || "",
|
|
57
|
+
official: defaultMp?.official ?? repo.toLowerCase().includes("anthropics/"),
|
|
58
58
|
featured: defaultMp?.featured,
|
|
59
59
|
});
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
// Fallback: hardcoded defaults (only if their repo isn't already represented)
|
|
63
63
|
for (const mp of defaultMarketplaces) {
|
|
64
|
-
const repo = mp.source.repo?.toLowerCase() ||
|
|
64
|
+
const repo = mp.source.repo?.toLowerCase() || "";
|
|
65
65
|
if (!all.has(mp.name) && !seenRepos.has(repo)) {
|
|
66
66
|
all.set(mp.name, mp);
|
|
67
67
|
if (repo)
|
|
@@ -71,8 +71,8 @@ export function getAllMarketplaces(localMarketplaces) {
|
|
|
71
71
|
// Sort: MadAppGang first, then alphabetically
|
|
72
72
|
return Array.from(all.values()).sort((a, b) => {
|
|
73
73
|
// MadAppGang always first
|
|
74
|
-
const aIsMag = a.source.repo?.toLowerCase().includes(
|
|
75
|
-
const bIsMag = b.source.repo?.toLowerCase().includes(
|
|
74
|
+
const aIsMag = a.source.repo?.toLowerCase().includes("madappgang/");
|
|
75
|
+
const bIsMag = b.source.repo?.toLowerCase().includes("madappgang/");
|
|
76
76
|
if (aIsMag && !bIsMag)
|
|
77
77
|
return -1;
|
|
78
78
|
if (!aIsMag && bIsMag)
|
|
@@ -81,4 +81,3 @@ export function getAllMarketplaces(localMarketplaces) {
|
|
|
81
81
|
return (a.displayName || a.name).localeCompare(b.displayName || b.name);
|
|
82
82
|
});
|
|
83
83
|
}
|
|
84
|
-
//# sourceMappingURL=marketplaces.js.map
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { Marketplace } from "../types/index.js";
|
|
2
|
+
import type { LocalMarketplace } from "../services/local-marketplace.js";
|
|
3
|
+
import { formatMarketplaceName } from "../utils/string-utils.js";
|
|
4
|
+
|
|
5
|
+
export const defaultMarketplaces: Marketplace[] = [
|
|
6
|
+
{
|
|
7
|
+
name: "mag-claude-plugins",
|
|
8
|
+
displayName: "MadAppGang Plugins",
|
|
9
|
+
source: {
|
|
10
|
+
source: "github",
|
|
11
|
+
repo: "MadAppGang/claude-code",
|
|
12
|
+
},
|
|
13
|
+
description:
|
|
14
|
+
"Professional plugins for frontend, backend, and code analysis",
|
|
15
|
+
official: false,
|
|
16
|
+
featured: true, // Always show plugins (expanded by default)
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: "claude-plugins-official",
|
|
20
|
+
displayName: "Anthropic Official",
|
|
21
|
+
source: {
|
|
22
|
+
source: "github",
|
|
23
|
+
repo: "anthropics/claude-plugins-official",
|
|
24
|
+
},
|
|
25
|
+
description:
|
|
26
|
+
"Official Anthropic-managed directory of high quality Claude Code plugins",
|
|
27
|
+
official: true,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: "claude-code-plugins",
|
|
31
|
+
displayName: "Anthropic Deprecated",
|
|
32
|
+
source: {
|
|
33
|
+
source: "github",
|
|
34
|
+
repo: "anthropics/claude-code",
|
|
35
|
+
},
|
|
36
|
+
description:
|
|
37
|
+
"Legacy demo plugins from Anthropic (deprecated - use Official instead)",
|
|
38
|
+
official: true,
|
|
39
|
+
},
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
export function getMarketplaceByName(name: string): Marketplace | undefined {
|
|
43
|
+
return defaultMarketplaces.find((m) => m.name === name);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Get all available marketplaces from local cache + hardcoded defaults
|
|
47
|
+
// Local cache is primary source of truth, defaults are fallback
|
|
48
|
+
// Deduplicates by repo URL to avoid showing same marketplace twice
|
|
49
|
+
export function getAllMarketplaces(
|
|
50
|
+
localMarketplaces?: Map<string, LocalMarketplace>,
|
|
51
|
+
): Marketplace[] {
|
|
52
|
+
const all = new Map<string, Marketplace>();
|
|
53
|
+
const seenRepos = new Set<string>();
|
|
54
|
+
|
|
55
|
+
// Primary source: local cache (what's actually cloned)
|
|
56
|
+
if (localMarketplaces) {
|
|
57
|
+
for (const [name, local] of localMarketplaces) {
|
|
58
|
+
const repo = local.gitRepo || "";
|
|
59
|
+
if (repo) seenRepos.add(repo.toLowerCase());
|
|
60
|
+
|
|
61
|
+
// Check if this marketplace has defaults (for official/featured flags)
|
|
62
|
+
const defaultMp = defaultMarketplaces.find((m) => m.name === name);
|
|
63
|
+
|
|
64
|
+
all.set(name, {
|
|
65
|
+
name,
|
|
66
|
+
displayName: local.name || formatMarketplaceName(name),
|
|
67
|
+
source: { source: "github" as const, repo },
|
|
68
|
+
description: local.description || "",
|
|
69
|
+
official:
|
|
70
|
+
defaultMp?.official ?? repo.toLowerCase().includes("anthropics/"),
|
|
71
|
+
featured: defaultMp?.featured,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Fallback: hardcoded defaults (only if their repo isn't already represented)
|
|
77
|
+
for (const mp of defaultMarketplaces) {
|
|
78
|
+
const repo = mp.source.repo?.toLowerCase() || "";
|
|
79
|
+
if (!all.has(mp.name) && !seenRepos.has(repo)) {
|
|
80
|
+
all.set(mp.name, mp);
|
|
81
|
+
if (repo) seenRepos.add(repo);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Sort: MadAppGang first, then alphabetically
|
|
86
|
+
return Array.from(all.values()).sort((a, b) => {
|
|
87
|
+
// MadAppGang always first
|
|
88
|
+
const aIsMag = a.source.repo?.toLowerCase().includes("madappgang/");
|
|
89
|
+
const bIsMag = b.source.repo?.toLowerCase().includes("madappgang/");
|
|
90
|
+
if (aIsMag && !bIsMag) return -1;
|
|
91
|
+
if (!aIsMag && bIsMag) return 1;
|
|
92
|
+
// Then alphabetically by display name
|
|
93
|
+
return (a.displayName || a.name).localeCompare(b.displayName || b.name);
|
|
94
|
+
});
|
|
95
|
+
}
|