claude-code-marketplace 0.5.6 → 0.5.8

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/README.md CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  A web-based dashboard for browsing, installing, and managing [Claude Code](https://docs.anthropic.com/en/docs/claude-code) plugins across multiple marketplaces.
4
4
 
5
- [![npm](https://img.shields.io/npm/v/claude-code-marketplace)](https://www.npmjs.com/package/claude-code-marketplace)
5
+ [![npm version](https://img.shields.io/npm/v/claude-code-marketplace)](https://www.npmjs.com/package/claude-code-marketplace)
6
+ [![license](https://img.shields.io/npm/l/claude-code-marketplace)](LICENSE)
7
+ [![npm downloads](https://img.shields.io/npm/dm/claude-code-marketplace)](https://www.npmjs.com/package/claude-code-marketplace)
6
8
 
7
9
  <p align="center">
8
10
  <img src="assets/main-dark.png" alt="Marketplace — dark theme" width="100%">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-marketplace",
3
- "version": "0.5.6",
3
+ "version": "0.5.8",
4
4
  "description": "Web UI for browsing and managing Claude Code marketplace plugins",
5
5
  "main": "server.js",
6
6
  "bin": {
package/public/app.js CHANGED
@@ -589,7 +589,7 @@ function renderDetailComponents(pluginId, comps, hasDirAccess) {
589
589
 
590
590
  let readmeHtml = '';
591
591
  if (comps._readmePath && hasDirAccess) {
592
- readmeHtml = `<div class="readme-comp-item" onclick="openContentModal('${esc(pluginId)}', '${esc(comps._readmePath)}', 'readme')">
592
+ readmeHtml = `<div class="readme-comp-item" onclick="openContentModal('${escJs(pluginId)}', '${escJs(comps._readmePath)}', 'readme')">
593
593
  <span class="icon">${ICONS.readme}</span> ${esc(comps._readmePath)}
594
594
  </div>`;
595
595
  }
@@ -615,7 +615,7 @@ function renderDetailComponents(pluginId, comps, hasDirAccess) {
615
615
  const clickPath = configFile || (dir ? `${dir}/${name}` : name);
616
616
  const cls = hasDirAccess ? '' : ' disabled';
617
617
  const click = hasDirAccess
618
- ? ` onclick="openContentModal('${esc(pluginId)}', '${esc(clickPath)}', '${esc(type)}')"`
618
+ ? ` onclick="openContentModal('${escJs(pluginId)}', '${escJs(clickPath)}', '${escJs(type)}')"`
619
619
  : '';
620
620
  html += `<div class="detail-comp-item${cls}"${click}>
621
621
  <span class="icon">${type === 'skills' ? ICONS.folder : ICONS.file}</span>
@@ -1299,6 +1299,12 @@ function handleKeydown(e) {
1299
1299
  return;
1300
1300
  }
1301
1301
 
1302
+ if (matchKey(e, 't')) {
1303
+ e.preventDefault();
1304
+ toggleTheme();
1305
+ return;
1306
+ }
1307
+
1302
1308
  const rows = getVisibleRows();
1303
1309
  const idx = getFocusedIndex(rows);
1304
1310
 
package/public/index.html CHANGED
@@ -134,6 +134,7 @@
134
134
  <tr><td><kbd>S</kbd></td><td>Focus scope filter</td></tr>
135
135
  <tr><td><kbd>E</kbd></td><td>Expand / Collapse all</td></tr>
136
136
  <tr><td><kbd>R</kbd></td><td>Refresh data</td></tr>
137
+ <tr><td><kbd>T</kbd></td><td>Toggle theme</td></tr>
137
138
  <tr><td><kbd>Esc</kbd></td><td>Close panel / blur input</td></tr>
138
139
  </table>
139
140
  </div>
package/server.js CHANGED
@@ -374,7 +374,7 @@ function countComponents(pluginDir, meta = {}) {
374
374
  const data = readJsonSafe(mcpFile);
375
375
  if (data) {
376
376
  result.mcpServers = Object.keys(data.mcpServers || data);
377
- if (result.mcpServers.length) configFiles.mcpServers = mcpPath;
377
+ if (result.mcpServers.length) configFiles.mcpServers = toUnixPath(mcpPath);
378
378
  }
379
379
  }
380
380
 
@@ -386,7 +386,7 @@ function countComponents(pluginDir, meta = {}) {
386
386
  if (data) {
387
387
  const hooksObj = data.hooks || data;
388
388
  result.hooks = Object.keys(hooksObj).filter(k => k !== 'description');
389
- if (result.hooks.length) configFiles.hooks = hooksPath;
389
+ if (result.hooks.length) configFiles.hooks = toUnixPath(hooksPath);
390
390
  }
391
391
  }
392
392
 
@@ -397,7 +397,7 @@ function countComponents(pluginDir, meta = {}) {
397
397
  const data = readJsonSafe(lspFile);
398
398
  if (data) {
399
399
  result.lspServers = Object.keys(data.lspServers || data);
400
- if (result.lspServers.length) configFiles.lspServers = lspPath;
400
+ if (result.lspServers.length) configFiles.lspServers = toUnixPath(lspPath);
401
401
  }
402
402
  }
403
403
 
@@ -427,9 +427,8 @@ const VIRTUAL_PREFIX = '_custom/';
427
427
  const SCOPE_LABELS = { user: 'User Customizations', project: 'Project Customizations' };
428
428
  const EMPTY_SCOPE = { installed: false, enabled: false, version: null, installPath: null };
429
429
 
430
- function scanCustomizations(basePath, scope) {
430
+ function rescanVirtualComponents(basePath, scope) {
431
431
  const components = countComponents(basePath);
432
-
433
432
  // Strip .md extensions from command/agent names for cleaner display
434
433
  components.commands = components.commands.map(n => n.replace(/\.md$/, ''));
435
434
  components.agents = components.agents.map(n => n.replace(/\.md$/, ''));
@@ -461,6 +460,12 @@ function scanCustomizations(basePath, scope) {
461
460
  }
462
461
  if (claudeMdFiles.length) components.claudeMd = claudeMdFiles;
463
462
 
463
+ return components;
464
+ }
465
+
466
+ function scanCustomizations(basePath, scope) {
467
+ const components = rescanVirtualComponents(basePath, scope);
468
+
464
469
  const hasAny = Object.values(components).some(v => Array.isArray(v) && v.length > 0);
465
470
  if (!hasAny) return null;
466
471
 
@@ -605,7 +610,10 @@ app.get('/api/plugins/:pluginId/components', (req, res) => {
605
610
  const plugin = findPlugin(pluginId, mktData);
606
611
 
607
612
  if (plugin?.isVirtual) {
608
- return res.json({ ...plugin.components, _pluginDir: plugin._pluginDir });
613
+ const scope = plugin.fullId.replace(VIRTUAL_PREFIX, '');
614
+ const comps = rescanVirtualComponents(plugin._pluginDir, scope);
615
+ comps._pluginDir = plugin._pluginDir;
616
+ return res.json(comps);
609
617
  }
610
618
  if (!plugin?._pluginDir) return res.status(404).json({ error: 'Plugin directory not found', pluginId });
611
619