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 +3 -1
- package/package.json +1 -1
- package/public/app.js +8 -2
- package/public/index.html +1 -0
- package/server.js +14 -6
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
|
-
[](https://www.npmjs.com/package/claude-code-marketplace)
|
|
5
|
+
[](https://www.npmjs.com/package/claude-code-marketplace)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
[](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
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('${
|
|
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('${
|
|
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
|
|
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
|
-
|
|
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
|
|