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
@@ -0,0 +1,76 @@
1
+ export interface LocalMarketplacePlugin {
2
+ name: string;
3
+ version: string;
4
+ description: string;
5
+ source?: string;
6
+ category?: string;
7
+ author?: {
8
+ name: string;
9
+ email?: string;
10
+ };
11
+ strict?: boolean;
12
+ lspServers?: Record<string, unknown>;
13
+ agents?: string[];
14
+ commands?: string[];
15
+ skills?: string[];
16
+ mcpServers?: string[];
17
+ }
18
+ export interface LocalMarketplace {
19
+ name: string;
20
+ description: string;
21
+ plugins: LocalMarketplacePlugin[];
22
+ gitRepo?: string;
23
+ }
24
+ /**
25
+ * Add a marketplace to known_marketplaces.json
26
+ */
27
+ export declare function addToKnownMarketplaces(name: string, repo: string): Promise<void>;
28
+ /**
29
+ * Remove a marketplace from known_marketplaces.json
30
+ */
31
+ export declare function removeFromKnownMarketplaces(name: string): Promise<void>;
32
+ /**
33
+ * Scan local marketplace cache and return marketplace info
34
+ */
35
+ export declare function scanLocalMarketplaces(): Promise<Map<string, LocalMarketplace>>;
36
+ /**
37
+ * Get a specific local marketplace by name
38
+ */
39
+ export declare function getLocalMarketplace(name: string): Promise<LocalMarketplace | undefined>;
40
+ /**
41
+ * Check if a marketplace exists in local cache
42
+ */
43
+ export declare function hasLocalMarketplace(name: string): Promise<boolean>;
44
+ export interface RefreshResult {
45
+ name: string;
46
+ success: boolean;
47
+ updated: boolean;
48
+ error?: string;
49
+ }
50
+ export interface RefreshProgress {
51
+ current: number;
52
+ total: number;
53
+ name: string;
54
+ }
55
+ export type ProgressCallback = (progress: RefreshProgress) => void;
56
+ /**
57
+ * Refresh all local marketplaces by running git pull on each
58
+ * Returns results for each marketplace
59
+ * @param onProgress - Optional callback for progress updates
60
+ */
61
+ export declare function refreshLocalMarketplaces(onProgress?: ProgressCallback): Promise<RefreshResult[]>;
62
+ export interface CloneResult {
63
+ success: boolean;
64
+ name: string;
65
+ error?: string;
66
+ }
67
+ /**
68
+ * Clone a marketplace from GitHub repo
69
+ * @param repo - GitHub repo in format "owner/repo" or "https://github.com/owner/repo"
70
+ */
71
+ export declare function cloneMarketplace(repo: string): Promise<CloneResult>;
72
+ /**
73
+ * Delete a marketplace directory from local cache
74
+ */
75
+ export declare function deleteMarketplace(name: string): Promise<void>;
76
+ //# sourceMappingURL=local-marketplace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-marketplace.d.ts","sourceRoot":"","sources":["../../src/services/local-marketplace.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAE1C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAmCD;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQtF;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7E;AA+BD;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CA+FpF;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAG7F;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAIxE;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA8CD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;AAEnE;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,aAAa,EAAE,CAAC,CA6B1B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAmEzE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBnE"}
@@ -0,0 +1,340 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ import { execSync, exec as execCb } from 'node:child_process';
5
+ import { promisify } from 'node:util';
6
+ const execAsync = promisify(execCb);
7
+ const CLAUDE_PLUGINS_DIR = path.join(os.homedir(), '.claude', 'plugins', 'marketplaces');
8
+ const KNOWN_MARKETPLACES_FILE = path.join(os.homedir(), '.claude', 'plugins', 'known_marketplaces.json');
9
+ /**
10
+ * Read known_marketplaces.json (Claude Code's internal marketplace tracking)
11
+ */
12
+ async function readKnownMarketplaces() {
13
+ try {
14
+ if (await fs.pathExists(KNOWN_MARKETPLACES_FILE)) {
15
+ return await fs.readJson(KNOWN_MARKETPLACES_FILE);
16
+ }
17
+ }
18
+ catch {
19
+ // Return empty if can't read
20
+ }
21
+ return {};
22
+ }
23
+ /**
24
+ * Write known_marketplaces.json
25
+ */
26
+ async function writeKnownMarketplaces(data) {
27
+ await fs.ensureDir(path.dirname(KNOWN_MARKETPLACES_FILE));
28
+ await fs.writeJson(KNOWN_MARKETPLACES_FILE, data, { spaces: 2 });
29
+ }
30
+ /**
31
+ * Add a marketplace to known_marketplaces.json
32
+ */
33
+ export async function addToKnownMarketplaces(name, repo) {
34
+ const known = await readKnownMarketplaces();
35
+ known[name] = {
36
+ source: { source: 'github', repo },
37
+ installLocation: path.join(CLAUDE_PLUGINS_DIR, name),
38
+ lastUpdated: new Date().toISOString(),
39
+ };
40
+ await writeKnownMarketplaces(known);
41
+ }
42
+ /**
43
+ * Remove a marketplace from known_marketplaces.json
44
+ */
45
+ export async function removeFromKnownMarketplaces(name) {
46
+ const known = await readKnownMarketplaces();
47
+ if (known[name]) {
48
+ delete known[name];
49
+ await writeKnownMarketplaces(known);
50
+ }
51
+ }
52
+ /**
53
+ * Get git remote URL from a marketplace directory
54
+ */
55
+ function getGitRemote(marketplacePath) {
56
+ try {
57
+ const gitDir = path.join(marketplacePath, '.git');
58
+ if (!fs.existsSync(gitDir))
59
+ return undefined;
60
+ const result = execSync('git remote get-url origin', {
61
+ cwd: marketplacePath,
62
+ encoding: 'utf-8',
63
+ timeout: 5000,
64
+ }).trim();
65
+ // Convert SSH URL to HTTPS format: git@github.com:user/repo.git -> user/repo
66
+ if (result.startsWith('git@github.com:')) {
67
+ return result.replace('git@github.com:', '').replace(/\.git$/, '');
68
+ }
69
+ // HTTPS URL: https://github.com/user/repo -> user/repo
70
+ if (result.includes('github.com')) {
71
+ const match = result.match(/github\.com[/:]([^/]+\/[^/\s.]+)/);
72
+ if (match)
73
+ return match[1].replace(/\.git$/, '');
74
+ }
75
+ return undefined;
76
+ }
77
+ catch {
78
+ return undefined;
79
+ }
80
+ }
81
+ /**
82
+ * Scan local marketplace cache and return marketplace info
83
+ */
84
+ export async function scanLocalMarketplaces() {
85
+ const marketplaces = new Map();
86
+ if (!(await fs.pathExists(CLAUDE_PLUGINS_DIR))) {
87
+ return marketplaces;
88
+ }
89
+ try {
90
+ const entries = await fs.readdir(CLAUDE_PLUGINS_DIR, { withFileTypes: true });
91
+ for (const entry of entries) {
92
+ if (!entry.isDirectory())
93
+ continue;
94
+ const marketplacePath = path.join(CLAUDE_PLUGINS_DIR, entry.name);
95
+ const manifestPath = path.join(marketplacePath, '.claude-plugin', 'marketplace.json');
96
+ if (!(await fs.pathExists(manifestPath)))
97
+ continue;
98
+ try {
99
+ const manifest = await fs.readJson(manifestPath);
100
+ const gitRepo = getGitRemote(marketplacePath);
101
+ const plugins = [];
102
+ if (manifest.plugins && Array.isArray(manifest.plugins)) {
103
+ for (const plugin of manifest.plugins) {
104
+ // Try to scan plugin directory for component counts
105
+ let agents = [];
106
+ let commands = [];
107
+ let skills = [];
108
+ let mcpServers = [];
109
+ if (plugin.source) {
110
+ const pluginPath = path.join(marketplacePath, plugin.source.replace('./', ''));
111
+ try {
112
+ // Scan for agents
113
+ const agentsDir = path.join(pluginPath, 'agents');
114
+ if (await fs.pathExists(agentsDir)) {
115
+ const agentFiles = await fs.readdir(agentsDir);
116
+ agents = agentFiles.filter(f => f.endsWith('.md')).map(f => f.replace('.md', ''));
117
+ }
118
+ // Scan for commands
119
+ const commandsDir = path.join(pluginPath, 'commands');
120
+ if (await fs.pathExists(commandsDir)) {
121
+ const cmdFiles = await fs.readdir(commandsDir);
122
+ commands = cmdFiles.filter(f => f.endsWith('.md')).map(f => f.replace('.md', ''));
123
+ }
124
+ // Scan for skills
125
+ const skillsDir = path.join(pluginPath, 'skills');
126
+ if (await fs.pathExists(skillsDir)) {
127
+ const skillFiles = await fs.readdir(skillsDir);
128
+ skills = skillFiles.filter(f => f.endsWith('.md') || (fs.statSync(path.join(skillsDir, f)).isDirectory()));
129
+ }
130
+ // Scan for MCP servers
131
+ const mcpDir = path.join(pluginPath, 'mcp-servers');
132
+ if (await fs.pathExists(mcpDir)) {
133
+ const mcpFiles = await fs.readdir(mcpDir);
134
+ mcpServers = mcpFiles.filter(f => f.endsWith('.json')).map(f => f.replace('.json', ''));
135
+ }
136
+ }
137
+ catch {
138
+ // Ignore scan errors
139
+ }
140
+ }
141
+ plugins.push({
142
+ name: plugin.name,
143
+ version: plugin.version || '0.0.0',
144
+ description: plugin.description || '',
145
+ source: plugin.source,
146
+ category: plugin.category,
147
+ author: plugin.author,
148
+ strict: plugin.strict,
149
+ lspServers: plugin.lspServers,
150
+ agents,
151
+ commands,
152
+ skills,
153
+ mcpServers,
154
+ });
155
+ }
156
+ }
157
+ marketplaces.set(entry.name, {
158
+ name: manifest.name || entry.name,
159
+ description: manifest.description || manifest.metadata?.description || '',
160
+ plugins,
161
+ gitRepo,
162
+ });
163
+ }
164
+ catch {
165
+ // Skip invalid marketplace
166
+ }
167
+ }
168
+ }
169
+ catch {
170
+ // Return empty if can't read directory
171
+ }
172
+ return marketplaces;
173
+ }
174
+ /**
175
+ * Get a specific local marketplace by name
176
+ */
177
+ export async function getLocalMarketplace(name) {
178
+ const marketplaces = await scanLocalMarketplaces();
179
+ return marketplaces.get(name);
180
+ }
181
+ /**
182
+ * Check if a marketplace exists in local cache
183
+ */
184
+ export async function hasLocalMarketplace(name) {
185
+ const marketplacePath = path.join(CLAUDE_PLUGINS_DIR, name);
186
+ const manifestPath = path.join(marketplacePath, '.claude-plugin', 'marketplace.json');
187
+ return fs.pathExists(manifestPath);
188
+ }
189
+ /**
190
+ * Refresh a single local marketplace by running git pull (async, non-blocking)
191
+ */
192
+ async function refreshSingleMarketplace(marketplacePath, name) {
193
+ try {
194
+ const gitDir = path.join(marketplacePath, '.git');
195
+ if (!fs.existsSync(gitDir)) {
196
+ return { name, success: false, updated: false, error: 'Not a git repository' };
197
+ }
198
+ // Get current HEAD before pull (async)
199
+ const { stdout: beforeHead } = await execAsync('git rev-parse HEAD', {
200
+ cwd: marketplacePath,
201
+ timeout: 5000,
202
+ });
203
+ // Run git pull (async) - suppress all output to prevent interference with TUI
204
+ await execAsync('git pull --ff-only >/dev/null 2>&1', {
205
+ cwd: marketplacePath,
206
+ timeout: 30000, // 30s timeout for network operation
207
+ shell: '/bin/bash',
208
+ });
209
+ // Get HEAD after pull (async)
210
+ const { stdout: afterHead } = await execAsync('git rev-parse HEAD', {
211
+ cwd: marketplacePath,
212
+ timeout: 5000,
213
+ });
214
+ return {
215
+ name,
216
+ success: true,
217
+ updated: beforeHead.trim() !== afterHead.trim(),
218
+ };
219
+ }
220
+ catch (error) {
221
+ return {
222
+ name,
223
+ success: false,
224
+ updated: false,
225
+ error: error instanceof Error ? error.message : 'Unknown error',
226
+ };
227
+ }
228
+ }
229
+ /**
230
+ * Refresh all local marketplaces by running git pull on each
231
+ * Returns results for each marketplace
232
+ * @param onProgress - Optional callback for progress updates
233
+ */
234
+ export async function refreshLocalMarketplaces(onProgress) {
235
+ const results = [];
236
+ if (!(await fs.pathExists(CLAUDE_PLUGINS_DIR))) {
237
+ return results;
238
+ }
239
+ try {
240
+ const entries = await fs.readdir(CLAUDE_PLUGINS_DIR, { withFileTypes: true });
241
+ const directories = entries.filter((entry) => entry.isDirectory());
242
+ const total = directories.length;
243
+ let completed = 0;
244
+ // Run git pull on all marketplaces in parallel, but track progress
245
+ const promises = directories.map(async (entry) => {
246
+ const marketplacePath = path.join(CLAUDE_PLUGINS_DIR, entry.name);
247
+ const result = await refreshSingleMarketplace(marketplacePath, entry.name);
248
+ completed++;
249
+ onProgress?.({ current: completed, total, name: entry.name });
250
+ return result;
251
+ });
252
+ const settled = await Promise.all(promises);
253
+ results.push(...settled);
254
+ }
255
+ catch {
256
+ // Return empty results if can't read directory
257
+ }
258
+ return results;
259
+ }
260
+ /**
261
+ * Clone a marketplace from GitHub repo
262
+ * @param repo - GitHub repo in format "owner/repo" or "https://github.com/owner/repo"
263
+ */
264
+ export async function cloneMarketplace(repo) {
265
+ // Normalize repo format: extract "owner/repo" from various inputs
266
+ let normalizedRepo = repo.trim();
267
+ // Handle full URL: https://github.com/owner/repo or https://github.com/owner/repo.git
268
+ if (normalizedRepo.includes('github.com')) {
269
+ const match = normalizedRepo.match(/github\.com[/:]([^/]+\/[^/\s.]+)/);
270
+ if (match) {
271
+ normalizedRepo = match[1].replace(/\.git$/, '');
272
+ }
273
+ }
274
+ // Validate format: owner/repo with alphanumeric, underscore, hyphen only (NO dots to prevent ..)
275
+ if (!normalizedRepo.match(/^[a-zA-Z0-9_-]+\/[a-zA-Z0-9_-]+$/)) {
276
+ return { success: false, name: '', error: 'Invalid repo format. Use owner/repo (letters, numbers, hyphens, underscores only)' };
277
+ }
278
+ // Extract marketplace name from repo (last part)
279
+ const repoName = normalizedRepo.split('/')[1];
280
+ // Defense in depth: explicitly reject path traversal attempts
281
+ if (repoName.includes('..') || repoName.includes('/') || repoName.includes('\\')) {
282
+ return { success: false, name: '', error: 'Invalid repository name' };
283
+ }
284
+ // Ensure plugins directory exists
285
+ await fs.ensureDir(CLAUDE_PLUGINS_DIR);
286
+ const marketplacePath = path.join(CLAUDE_PLUGINS_DIR, repoName);
287
+ // Verify resolved path is within expected directory (defense in depth)
288
+ const resolvedPath = path.resolve(marketplacePath);
289
+ if (!resolvedPath.startsWith(path.resolve(CLAUDE_PLUGINS_DIR))) {
290
+ return { success: false, name: '', error: 'Invalid path detected' };
291
+ }
292
+ // Check if already exists
293
+ if (await fs.pathExists(marketplacePath)) {
294
+ return { success: false, name: repoName, error: 'Marketplace already exists' };
295
+ }
296
+ try {
297
+ // Clone the repository - suppress output to prevent TUI interference
298
+ const cloneUrl = `https://github.com/${normalizedRepo}.git`;
299
+ await execAsync(`git clone --depth 1 "${cloneUrl}" "${marketplacePath}" >/dev/null 2>&1`, {
300
+ timeout: 60000, // 60s timeout for clone
301
+ shell: '/bin/bash',
302
+ });
303
+ // Verify it's a valid marketplace (has .claude-plugin/marketplace.json)
304
+ const manifestPath = path.join(marketplacePath, '.claude-plugin', 'marketplace.json');
305
+ if (!(await fs.pathExists(manifestPath))) {
306
+ // Not a valid marketplace, clean up
307
+ await fs.remove(marketplacePath);
308
+ return { success: false, name: repoName, error: 'Not a valid marketplace (no .claude-plugin/marketplace.json)' };
309
+ }
310
+ return { success: true, name: repoName };
311
+ }
312
+ catch (error) {
313
+ // Clean up on failure
314
+ await fs.remove(marketplacePath).catch(() => { });
315
+ return {
316
+ success: false,
317
+ name: repoName,
318
+ error: error instanceof Error ? error.message : 'Clone failed',
319
+ };
320
+ }
321
+ }
322
+ /**
323
+ * Delete a marketplace directory from local cache
324
+ */
325
+ export async function deleteMarketplace(name) {
326
+ // Validate name doesn't contain path traversal
327
+ if (name.includes('..') || name.includes('/') || name.includes('\\')) {
328
+ throw new Error('Invalid marketplace name');
329
+ }
330
+ const marketplacePath = path.join(CLAUDE_PLUGINS_DIR, name);
331
+ // Verify path is within expected directory (defense in depth)
332
+ const resolvedPath = path.resolve(marketplacePath);
333
+ if (!resolvedPath.startsWith(path.resolve(CLAUDE_PLUGINS_DIR))) {
334
+ throw new Error('Invalid marketplace path');
335
+ }
336
+ if (await fs.pathExists(marketplacePath)) {
337
+ await fs.remove(marketplacePath);
338
+ }
339
+ }
340
+ //# sourceMappingURL=local-marketplace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-marketplace.js","sourceRoot":"","sources":["../../src/services/local-marketplace.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,45 @@
1
+ import { type LocalMarketplace, type RefreshResult, type ProgressCallback } from './local-marketplace.js';
2
+ export interface ScopeStatus {
3
+ enabled: boolean;
4
+ version?: string;
5
+ }
1
6
  export interface PluginInfo {
2
7
  id: string;
3
8
  name: string;
4
- version: string;
9
+ version: string | null;
5
10
  description: string;
6
11
  marketplace: string;
7
12
  marketplaceDisplay: string;
8
13
  enabled: boolean;
9
14
  installedVersion?: string;
10
15
  hasUpdate?: boolean;
16
+ userScope?: ScopeStatus;
17
+ projectScope?: ScopeStatus;
18
+ localScope?: ScopeStatus;
19
+ category?: string;
20
+ author?: {
21
+ name: string;
22
+ email?: string;
23
+ };
24
+ homepage?: string;
25
+ tags?: string[];
26
+ agents?: string[];
27
+ commands?: string[];
28
+ skills?: string[];
29
+ mcpServers?: string[];
30
+ lspServers?: Record<string, unknown>;
11
31
  }
12
32
  export interface MarketplacePlugin {
13
33
  name: string;
14
- version: string;
34
+ version: string | null;
15
35
  description: string;
36
+ category?: string;
37
+ author?: {
38
+ name: string;
39
+ email?: string;
40
+ };
41
+ homepage?: string;
42
+ tags?: string[];
16
43
  }
17
44
  export declare function fetchMarketplacePlugins(marketplaceName: string, repo: string): Promise<MarketplacePlugin[]>;
18
45
  export declare function getAvailablePlugins(projectPath?: string): Promise<PluginInfo[]>;
@@ -20,4 +47,14 @@ export declare function getGlobalAvailablePlugins(): Promise<PluginInfo[]>;
20
47
  export declare function saveInstalledPluginVersion(pluginId: string, version: string, projectPath?: string): Promise<void>;
21
48
  export declare function removeInstalledPluginVersion(pluginId: string, projectPath?: string): Promise<void>;
22
49
  export declare function clearMarketplaceCache(): void;
50
+ export declare function getLocalMarketplacesInfo(): Promise<Map<string, LocalMarketplace>>;
51
+ /**
52
+ * Refresh all marketplace data:
53
+ * 1. Git pull on all local marketplaces
54
+ * 2. Clear all caches (forces re-fetch from GitHub and re-scan of local)
55
+ * Returns results from git pull operations
56
+ * @param onProgress - Optional callback for progress updates
57
+ */
58
+ export declare function refreshAllMarketplaces(onProgress?: ProgressCallback): Promise<RefreshResult[]>;
59
+ export type { RefreshResult, ProgressCallback };
23
60
  //# sourceMappingURL=plugin-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-manager.d.ts","sourceRoot":"","sources":["../../src/services/plugin-manager.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAKD,wBAAsB,uBAAuB,CAC3C,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAsC9B;AAED,wBAAsB,mBAAmB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA0CrF;AAED,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CA0CvE;AAyBD,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAKf;AAGD,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAMf;AAGD,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
1
+ {"version":3,"file":"plugin-manager.d.ts","sourceRoot":"","sources":["../../src/services/plugin-manager.ts"],"names":[],"mappings":"AAYA,OAAO,EAAmD,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAM3J,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,UAAU,CAAC,EAAE,WAAW,CAAC;IAEzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAKD,wBAAsB,uBAAuB,CAC3C,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAkE9B;AAED,wBAAsB,mBAAmB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAyJrF;AAED,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CA0JvE;AA0BD,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAKf;AAGD,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAMf;AAGD,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AAWD,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAEvF;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,aAAa,EAAE,CAAC,CAQ1B;AAGD,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC"}