@claudetools/cli 0.13.12 → 0.13.15
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/dist/__tests__/factories.d.ts +173 -0
- package/dist/__tests__/factories.d.ts.map +1 -0
- package/dist/__tests__/factories.js +150 -0
- package/dist/__tests__/factories.js.map +1 -0
- package/dist/__tests__/helpers.d.ts +36 -0
- package/dist/__tests__/helpers.d.ts.map +1 -0
- package/dist/__tests__/helpers.js +52 -0
- package/dist/__tests__/helpers.js.map +1 -0
- package/dist/analytics/index.d.ts +14 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +259 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/session.d.ts +17 -0
- package/dist/analytics/session.d.ts.map +1 -0
- package/dist/analytics/session.js +130 -0
- package/dist/analytics/session.js.map +1 -0
- package/dist/analytics/token-tracker.d.ts +48 -0
- package/dist/analytics/token-tracker.d.ts.map +1 -0
- package/dist/analytics/token-tracker.js +269 -0
- package/dist/analytics/token-tracker.js.map +1 -0
- package/dist/analytics/tracker.d.ts +33 -0
- package/dist/analytics/tracker.d.ts.map +1 -0
- package/dist/analytics/tracker.js +210 -0
- package/dist/analytics/tracker.js.map +1 -0
- package/dist/api-keys/index.d.ts +15 -0
- package/dist/api-keys/index.d.ts.map +1 -0
- package/dist/api-keys/index.js +228 -0
- package/dist/api-keys/index.js.map +1 -0
- package/dist/auth/config.d.ts +15 -0
- package/dist/auth/config.d.ts.map +1 -0
- package/dist/auth/config.js +67 -0
- package/dist/auth/config.js.map +1 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +299 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/keychain.d.ts +21 -0
- package/dist/auth/keychain.d.ts.map +1 -0
- package/dist/auth/keychain.js +256 -0
- package/dist/auth/keychain.js.map +1 -0
- package/dist/billing/index.d.ts +7 -0
- package/dist/billing/index.d.ts.map +1 -0
- package/dist/billing/index.js +233 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/cli.js +291 -43
- package/dist/cli.js.map +1 -1
- package/dist/commands/hook.d.ts +12 -0
- package/dist/commands/hook.d.ts.map +1 -0
- package/dist/commands/hook.js +190 -0
- package/dist/commands/hook.js.map +1 -0
- package/dist/commands/keys.d.ts +4 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +43 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/mcp.d.ts +4 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +43 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/project.d.ts +4 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +68 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/skill.d.ts +4 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +37 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/stacks.d.ts +4 -0
- package/dist/commands/stacks.d.ts.map +1 -0
- package/dist/commands/stacks.js +103 -0
- package/dist/commands/stacks.js.map +1 -0
- package/dist/commands/stats.d.ts +4 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +6 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/sync.d.ts +4 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +60 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/update.d.ts +4 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +63 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/daemon/client.d.ts +107 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +250 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/health.d.ts +38 -0
- package/dist/daemon/health.d.ts.map +1 -0
- package/dist/daemon/health.js +212 -0
- package/dist/daemon/health.js.map +1 -0
- package/dist/daemon/index.d.ts +34 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +197 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/protocol.d.ts +144 -0
- package/dist/daemon/protocol.d.ts.map +1 -0
- package/dist/daemon/protocol.js +5 -0
- package/dist/daemon/protocol.js.map +1 -0
- package/dist/gamification/index.d.ts +13 -0
- package/dist/gamification/index.d.ts.map +1 -0
- package/dist/gamification/index.js +120 -0
- package/dist/gamification/index.js.map +1 -0
- package/dist/gamification/types.d.ts +34 -0
- package/dist/gamification/types.d.ts.map +1 -0
- package/dist/gamification/types.js +5 -0
- package/dist/gamification/types.js.map +1 -0
- package/dist/hooks/index.d.ts +65 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +403 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/lib/api.d.ts +29 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +213 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/browser.d.ts +6 -0
- package/dist/lib/browser.d.ts.map +1 -0
- package/dist/lib/browser.js +14 -0
- package/dist/lib/browser.js.map +1 -0
- package/dist/lib/channel-config.d.ts +10 -0
- package/dist/lib/channel-config.d.ts.map +1 -0
- package/dist/lib/channel-config.js +48 -0
- package/dist/lib/channel-config.js.map +1 -0
- package/dist/lib/command-runner.d.ts +16 -0
- package/dist/lib/command-runner.d.ts.map +1 -0
- package/dist/lib/command-runner.js +59 -0
- package/dist/lib/command-runner.js.map +1 -0
- package/dist/lib/command-utils.d.ts +22 -0
- package/dist/lib/command-utils.d.ts.map +1 -0
- package/dist/lib/command-utils.js +88 -0
- package/dist/lib/command-utils.js.map +1 -0
- package/dist/lib/error-handler.d.ts +13 -0
- package/dist/lib/error-handler.d.ts.map +1 -0
- package/dist/lib/error-handler.js +70 -0
- package/dist/lib/error-handler.js.map +1 -0
- package/dist/lib/errors.d.ts +35 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +70 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/exit.d.ts +10 -0
- package/dist/lib/exit.d.ts.map +1 -0
- package/dist/lib/exit.js +21 -0
- package/dist/lib/exit.js.map +1 -0
- package/dist/lib/formatters.d.ts +65 -0
- package/dist/lib/formatters.d.ts.map +1 -0
- package/dist/lib/formatters.js +180 -0
- package/dist/lib/formatters.js.map +1 -0
- package/dist/lib/hybrid-data.d.ts +47 -0
- package/dist/lib/hybrid-data.d.ts.map +1 -0
- package/dist/lib/hybrid-data.js +326 -0
- package/dist/lib/hybrid-data.js.map +1 -0
- package/dist/lib/local-store.d.ts +113 -0
- package/dist/lib/local-store.d.ts.map +1 -0
- package/dist/lib/local-store.js +220 -0
- package/dist/lib/local-store.js.map +1 -0
- package/dist/lib/machine-id.d.ts +8 -0
- package/dist/lib/machine-id.d.ts.map +1 -0
- package/dist/lib/machine-id.js +39 -0
- package/dist/lib/machine-id.js.map +1 -0
- package/dist/lib/network.d.ts +15 -0
- package/dist/lib/network.d.ts.map +1 -0
- package/dist/lib/network.js +46 -0
- package/dist/lib/network.js.map +1 -0
- package/dist/lib/theme.d.ts +77 -0
- package/dist/lib/theme.d.ts.map +1 -0
- package/dist/lib/theme.js +137 -0
- package/dist/lib/theme.js.map +1 -0
- package/dist/lib/tool-availability.d.ts +13 -0
- package/dist/lib/tool-availability.d.ts.map +1 -0
- package/dist/lib/tool-availability.js +48 -0
- package/dist/lib/tool-availability.js.map +1 -0
- package/dist/lib/update-checker.d.ts +21 -0
- package/dist/lib/update-checker.d.ts.map +1 -0
- package/dist/lib/update-checker.js +110 -0
- package/dist/lib/update-checker.js.map +1 -0
- package/dist/lib/validation.d.ts +30 -0
- package/dist/lib/validation.d.ts.map +1 -0
- package/dist/lib/validation.js +82 -0
- package/dist/lib/validation.js.map +1 -0
- package/dist/lib/validators.d.ts +18 -0
- package/dist/lib/validators.d.ts.map +1 -0
- package/dist/lib/validators.js +30 -0
- package/dist/lib/validators.js.map +1 -0
- package/dist/marketplace/api.d.ts +24 -0
- package/dist/marketplace/api.d.ts.map +1 -0
- package/dist/marketplace/api.js +92 -0
- package/dist/marketplace/api.js.map +1 -0
- package/dist/marketplace/index.d.ts +13 -0
- package/dist/marketplace/index.d.ts.map +1 -0
- package/dist/marketplace/index.js +155 -0
- package/dist/marketplace/index.js.map +1 -0
- package/dist/marketplace/installer.d.ts +18 -0
- package/dist/marketplace/installer.d.ts.map +1 -0
- package/dist/marketplace/installer.js +184 -0
- package/dist/marketplace/installer.js.map +1 -0
- package/dist/mcp/api.d.ts +93 -0
- package/dist/mcp/api.d.ts.map +1 -0
- package/dist/mcp/api.js +106 -0
- package/dist/mcp/api.js.map +1 -0
- package/dist/mcp/config.d.ts +72 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +156 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/index.d.ts +54 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +381 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/prompt.clean.d.ts +25 -0
- package/dist/mcp/prompt.clean.d.ts.map +1 -0
- package/dist/mcp/prompt.clean.js +206 -0
- package/dist/mcp/prompt.clean.js.map +1 -0
- package/dist/mcp/prompt.d.ts +52 -0
- package/dist/mcp/prompt.d.ts.map +1 -0
- package/dist/mcp/prompt.js +210 -0
- package/dist/mcp/prompt.js.map +1 -0
- package/dist/mcp/secrets.clean.d.ts +18 -0
- package/dist/mcp/secrets.clean.d.ts.map +1 -0
- package/dist/mcp/secrets.clean.js +357 -0
- package/dist/mcp/secrets.clean.js.map +1 -0
- package/dist/mcp/secrets.d.ts +46 -0
- package/dist/mcp/secrets.d.ts.map +1 -0
- package/dist/mcp/secrets.js +339 -0
- package/dist/mcp/secrets.js.map +1 -0
- package/dist/memory/index.d.ts +14 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +98 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/onboard/agents-md-builder.d.ts.map +1 -1
- package/dist/onboard/agents-md-builder.js +45 -0
- package/dist/onboard/agents-md-builder.js.map +1 -1
- package/dist/onboard/claude-inference.d.ts.map +1 -1
- package/dist/onboard/claude-inference.js +31 -5
- package/dist/onboard/claude-inference.js.map +1 -1
- package/dist/onboard/context7-fetcher.d.ts +1 -1
- package/dist/onboard/context7-fetcher.d.ts.map +1 -1
- package/dist/onboard/context7-fetcher.js +50 -16
- package/dist/onboard/context7-fetcher.js.map +1 -1
- package/dist/onboard/docs-builder.d.ts.map +1 -1
- package/dist/onboard/docs-builder.js +523 -50
- package/dist/onboard/docs-builder.js.map +1 -1
- package/dist/onboard/index.d.ts.map +1 -1
- package/dist/onboard/index.js +74 -25
- package/dist/onboard/index.js.map +1 -1
- package/dist/onboard/stack-detector.d.ts.map +1 -1
- package/dist/onboard/stack-detector.js +5 -55
- package/dist/onboard/stack-detector.js.map +1 -1
- package/dist/project/constants.d.ts +21 -0
- package/dist/project/constants.d.ts.map +1 -0
- package/dist/project/constants.js +21 -0
- package/dist/project/constants.js.map +1 -0
- package/dist/project/format.d.ts +16 -0
- package/dist/project/format.d.ts.map +1 -0
- package/dist/project/format.js +40 -0
- package/dist/project/format.js.map +1 -0
- package/dist/project/git.d.ts +28 -0
- package/dist/project/git.d.ts.map +1 -0
- package/dist/project/git.js +93 -0
- package/dist/project/git.js.map +1 -0
- package/dist/project/index.d.ts +36 -0
- package/dist/project/index.d.ts.map +1 -0
- package/dist/project/index.js +272 -0
- package/dist/project/index.js.map +1 -0
- package/dist/project/mapper.d.ts +27 -0
- package/dist/project/mapper.d.ts.map +1 -0
- package/dist/project/mapper.js +64 -0
- package/dist/project/mapper.js.map +1 -0
- package/dist/project/storage.d.ts +71 -0
- package/dist/project/storage.d.ts.map +1 -0
- package/dist/project/storage.js +274 -0
- package/dist/project/storage.js.map +1 -0
- package/dist/project/sync-bridge.d.ts +33 -0
- package/dist/project/sync-bridge.d.ts.map +1 -0
- package/dist/project/sync-bridge.js +155 -0
- package/dist/project/sync-bridge.js.map +1 -0
- package/dist/project/types.d.ts +107 -0
- package/dist/project/types.d.ts.map +1 -0
- package/dist/project/types.js +77 -0
- package/dist/project/types.js.map +1 -0
- package/dist/publish/index.d.ts +4 -0
- package/dist/publish/index.d.ts.map +1 -0
- package/dist/publish/index.js +92 -0
- package/dist/publish/index.js.map +1 -0
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +29 -10
- package/dist/setup.js.map +1 -1
- package/dist/skills/index.d.ts +51 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +509 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/stacks/check.d.ts +2 -0
- package/dist/stacks/check.d.ts.map +1 -0
- package/dist/stacks/check.js +144 -0
- package/dist/stacks/check.js.map +1 -0
- package/dist/stacks/diff.d.ts +11 -0
- package/dist/stacks/diff.d.ts.map +1 -0
- package/dist/stacks/diff.js +123 -0
- package/dist/stacks/diff.js.map +1 -0
- package/dist/stacks/index.d.ts +17 -0
- package/dist/stacks/index.d.ts.map +1 -0
- package/dist/stacks/index.js +525 -0
- package/dist/stacks/index.js.map +1 -0
- package/dist/stacks/index.refactored.d.ts.map +1 -0
- package/dist/stacks/index.refactored.js.map +1 -0
- package/dist/stacks/io.d.ts +11 -0
- package/dist/stacks/io.d.ts.map +1 -0
- package/dist/stacks/io.js +179 -0
- package/dist/stacks/io.js.map +1 -0
- package/dist/stacks/rollback.d.ts +5 -0
- package/dist/stacks/rollback.d.ts.map +1 -0
- package/dist/stacks/rollback.js +162 -0
- package/dist/stacks/rollback.js.map +1 -0
- package/dist/stacks/types.d.ts +70 -0
- package/dist/stacks/types.d.ts.map +1 -0
- package/dist/stacks/types.js +6 -0
- package/dist/stacks/types.js.map +1 -0
- package/dist/stacks/utils.d.ts +9 -0
- package/dist/stacks/utils.d.ts.map +1 -0
- package/dist/stacks/utils.js +11 -0
- package/dist/stacks/utils.js.map +1 -0
- package/dist/start/index.d.ts +23 -0
- package/dist/start/index.d.ts.map +1 -0
- package/dist/start/index.js +386 -0
- package/dist/start/index.js.map +1 -0
- package/dist/sync/index.d.ts +49 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +207 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync-engine/__tests__/test-helpers.d.ts +14 -0
- package/dist/sync-engine/__tests__/test-helpers.d.ts.map +1 -0
- package/dist/sync-engine/__tests__/test-helpers.js +73 -0
- package/dist/sync-engine/__tests__/test-helpers.js.map +1 -0
- package/dist/sync-engine/client.d.ts +128 -0
- package/dist/sync-engine/client.d.ts.map +1 -0
- package/dist/sync-engine/client.js +289 -0
- package/dist/sync-engine/client.js.map +1 -0
- package/dist/sync-engine/health.d.ts +38 -0
- package/dist/sync-engine/health.d.ts.map +1 -0
- package/dist/sync-engine/health.js +259 -0
- package/dist/sync-engine/health.js.map +1 -0
- package/dist/sync-engine/index.d.ts +34 -0
- package/dist/sync-engine/index.d.ts.map +1 -0
- package/dist/sync-engine/index.js +197 -0
- package/dist/sync-engine/index.js.map +1 -0
- package/dist/sync-engine/protocol.d.ts +153 -0
- package/dist/sync-engine/protocol.d.ts.map +1 -0
- package/dist/sync-engine/protocol.js +5 -0
- package/dist/sync-engine/protocol.js.map +1 -0
- package/dist/tasks/index.d.ts +14 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js +109 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/team/index.d.ts +12 -0
- package/dist/team/index.d.ts.map +1 -0
- package/dist/team/index.js +151 -0
- package/dist/team/index.js.map +1 -0
- package/dist/updater.d.ts +5 -5
- package/dist/updater.d.ts.map +1 -1
- package/dist/updater.js +24 -88
- package/dist/updater.js.map +1 -1
- package/dist/usage/index.d.ts +10 -0
- package/dist/usage/index.d.ts.map +1 -0
- package/dist/usage/index.js +104 -0
- package/dist/usage/index.js.map +1 -0
- package/dist/webhooks/index.d.ts +7 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +81 -0
- package/dist/webhooks/index.js.map +1 -0
- package/package.json +26 -15
- package/scripts/postinstall.js +282 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { getApiClient } from '../lib/api.js';
|
|
2
|
+
/**
|
|
3
|
+
* Safely extract an Extension from a raw API response object.
|
|
4
|
+
* Uses optional chaining and defaults instead of unsafe `as` casts.
|
|
5
|
+
*/
|
|
6
|
+
function parseExtension(ext, type) {
|
|
7
|
+
const id = typeof ext.id === 'string' ? ext.id : '';
|
|
8
|
+
const slug = typeof ext.slug === 'string' ? ext.slug : '';
|
|
9
|
+
const name = typeof ext.name === 'string' ? ext.name : slug;
|
|
10
|
+
const description = typeof ext.description === 'string' ? ext.description : '';
|
|
11
|
+
const downloadCount = typeof ext.downloadCount === 'number' ? ext.downloadCount : 0;
|
|
12
|
+
const createdAt = typeof ext.createdAt === 'string' ? ext.createdAt : new Date().toISOString();
|
|
13
|
+
const updatedAt = typeof ext.updatedAt === 'string' ? ext.updatedAt : createdAt;
|
|
14
|
+
const bodyContent = typeof ext.bodyContent === 'string' ? ext.bodyContent : undefined;
|
|
15
|
+
const npmPackage = typeof ext.npmPackage === 'string' ? ext.npmPackage : undefined;
|
|
16
|
+
// Parse author/submitter safely
|
|
17
|
+
const rawSubmitter = ext.submitter;
|
|
18
|
+
const author = rawSubmitter
|
|
19
|
+
&& typeof rawSubmitter.id === 'string'
|
|
20
|
+
&& typeof rawSubmitter.name === 'string'
|
|
21
|
+
? { id: rawSubmitter.id, name: rawSubmitter.name }
|
|
22
|
+
: { id: '', name: 'Unknown' };
|
|
23
|
+
return {
|
|
24
|
+
id,
|
|
25
|
+
slug,
|
|
26
|
+
name,
|
|
27
|
+
type,
|
|
28
|
+
description,
|
|
29
|
+
author,
|
|
30
|
+
downloads: downloadCount,
|
|
31
|
+
createdAt,
|
|
32
|
+
updatedAt,
|
|
33
|
+
content: bodyContent,
|
|
34
|
+
config: type === 'mcp-server' && npmPackage
|
|
35
|
+
? { command: 'npx', args: ['-y', npmPackage] }
|
|
36
|
+
: undefined,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export async function searchExtensions(query, type, limit = 20) {
|
|
40
|
+
const client = getApiClient({ authenticated: false });
|
|
41
|
+
const params = new URLSearchParams();
|
|
42
|
+
if (query)
|
|
43
|
+
params.set('q', query);
|
|
44
|
+
if (type)
|
|
45
|
+
params.set('type', type);
|
|
46
|
+
params.set('limit', String(limit));
|
|
47
|
+
const response = await client.get(`/extensions?${params}`);
|
|
48
|
+
if (!response.success || !response.data) {
|
|
49
|
+
throw new Error('Failed to search extensions');
|
|
50
|
+
}
|
|
51
|
+
return response.data;
|
|
52
|
+
}
|
|
53
|
+
export async function getExtension(typeOrSlug, slug) {
|
|
54
|
+
const client = getApiClient({ authenticated: false });
|
|
55
|
+
// If called with (type, slug) — use specific endpoint
|
|
56
|
+
if (slug) {
|
|
57
|
+
const type = typeOrSlug;
|
|
58
|
+
const response = await client.get(`/extensions/${type}/${slug}`);
|
|
59
|
+
if (!response.success || !response.data) {
|
|
60
|
+
throw new Error(`Extension not found: ${type}/${slug}`);
|
|
61
|
+
}
|
|
62
|
+
return parseExtension(response.data.extension, type);
|
|
63
|
+
}
|
|
64
|
+
// If called with (slug) only — search across all types
|
|
65
|
+
const slugOnly = typeOrSlug;
|
|
66
|
+
const types = ['skill', 'agent', 'hook', 'mcp-server'];
|
|
67
|
+
// Try all 4 types in parallel for better performance
|
|
68
|
+
const lookupResults = await Promise.allSettled(types.map(async (type) => {
|
|
69
|
+
const response = await client.get(`/extensions/${type}/${slugOnly}`);
|
|
70
|
+
if (response.success && response.data) {
|
|
71
|
+
return parseExtension(response.data.extension, type);
|
|
72
|
+
}
|
|
73
|
+
throw new Error(`Not found as ${type}`);
|
|
74
|
+
}));
|
|
75
|
+
// Return the first successful result
|
|
76
|
+
for (const lookupResult of lookupResults) {
|
|
77
|
+
if (lookupResult.status === 'fulfilled') {
|
|
78
|
+
return lookupResult.value;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
throw new Error(`Extension not found: ${slugOnly}`);
|
|
82
|
+
}
|
|
83
|
+
export async function trackDownload(slug) {
|
|
84
|
+
try {
|
|
85
|
+
const client = getApiClient({ authenticated: true });
|
|
86
|
+
await client.post(`/extensions/${slug}/download`, {});
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Silently fail - tracking is non-critical
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/marketplace/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface SearchOptions {
|
|
2
|
+
type?: string;
|
|
3
|
+
json?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare function runSearch(query?: string, options?: SearchOptions): Promise<void>;
|
|
6
|
+
export declare function runInstall(slug: string): Promise<void>;
|
|
7
|
+
export declare function runUninstall(slug: string, type?: string): Promise<void>;
|
|
8
|
+
interface ListOptions {
|
|
9
|
+
json?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function runList(options?: ListOptions): Promise<void>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/marketplace/index.ts"],"names":[],"mappings":"AAWA,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC1F;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC5D;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+C7E;AAED,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,OAAO,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCtE"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { requireAuth } from '../auth/config.js';
|
|
2
|
+
import { searchExtensions, getExtension, trackDownload } from './api.js';
|
|
3
|
+
import { installExtension, uninstallExtension, listInstalledExtensions, } from './installer.js';
|
|
4
|
+
import { theme, formatSuccess, formatStep } from '../lib/theme.js';
|
|
5
|
+
import { emptyState } from '../lib/formatters.js';
|
|
6
|
+
import { showXpGain } from '../gamification/index.js';
|
|
7
|
+
export async function runSearch(query, options = {}) {
|
|
8
|
+
try {
|
|
9
|
+
const result = await searchExtensions(query, options.type, 20);
|
|
10
|
+
if (options.json) {
|
|
11
|
+
console.log(JSON.stringify(result, null, 2));
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (result.extensions.length === 0) {
|
|
15
|
+
emptyState('No extensions found.', 'Try a different search query.');
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
console.log();
|
|
19
|
+
console.log(` ${theme.bold(`Found ${result.total} extension${result.total === 1 ? '' : 's'}`)}`);
|
|
20
|
+
console.log();
|
|
21
|
+
for (const ext of result.extensions) {
|
|
22
|
+
console.log(` ${theme.symbols.arrow} ${theme.highlight(ext.slug)} ${theme.muted(`(${ext.type})`)}`);
|
|
23
|
+
console.log(` ${theme.muted(ext.description)}`);
|
|
24
|
+
console.log(` ${theme.muted(`Author: ${ext.author.name} | Downloads: ${ext.downloads}`)}`);
|
|
25
|
+
console.log();
|
|
26
|
+
}
|
|
27
|
+
console.log(` ${theme.muted(`Install with: ${theme.command('claudetools install <slug>')}`)}`);
|
|
28
|
+
console.log();
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
if (error instanceof Error) {
|
|
32
|
+
throw new Error(`Search failed: ${error.message}`);
|
|
33
|
+
}
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export async function runInstall(slug) {
|
|
38
|
+
await requireAuth();
|
|
39
|
+
try {
|
|
40
|
+
console.log(` ${formatStep(`Fetching extension: ${slug}...`)}`);
|
|
41
|
+
const extension = await getExtension(slug);
|
|
42
|
+
console.log(` ${formatStep(`Installing ${extension.type}: ${extension.name}...`)}`);
|
|
43
|
+
await installExtension(extension);
|
|
44
|
+
// Track download (silently fails if it doesn't work)
|
|
45
|
+
await trackDownload(slug);
|
|
46
|
+
console.log();
|
|
47
|
+
console.log(` ${formatSuccess(`Installed ${extension.name} successfully!`)}`);
|
|
48
|
+
// Show usage hints based on type
|
|
49
|
+
switch (extension.type) {
|
|
50
|
+
case 'skill':
|
|
51
|
+
console.log(` ${theme.muted(`Use with: @${slug} or reference in your agent configs`)}`);
|
|
52
|
+
break;
|
|
53
|
+
case 'agent':
|
|
54
|
+
console.log(` ${theme.muted(`Use with: @${slug} in Claude Code`)}`);
|
|
55
|
+
break;
|
|
56
|
+
case 'hook':
|
|
57
|
+
console.log(` ${theme.muted(`Hook installed to: ~/.claude/hooks/${slug}.sh`)}`);
|
|
58
|
+
break;
|
|
59
|
+
case 'mcp-server':
|
|
60
|
+
console.log(` ${theme.muted('MCP server added to: ~/.claude/mcp.json')}`);
|
|
61
|
+
console.log(` ${theme.muted('Restart Claude Code to activate.')}`);
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
void showXpGain('extension_install');
|
|
65
|
+
console.log();
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (error instanceof Error) {
|
|
69
|
+
throw new Error(`Install failed: ${error.message}`);
|
|
70
|
+
}
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export async function runUninstall(slug, type) {
|
|
75
|
+
try {
|
|
76
|
+
let resolvedType = type;
|
|
77
|
+
// If type not provided, detect from installed extensions
|
|
78
|
+
if (!resolvedType) {
|
|
79
|
+
const installed = listInstalledExtensions();
|
|
80
|
+
const matchingExtensions = installed.filter((ext) => ext.slug === slug);
|
|
81
|
+
if (matchingExtensions.length === 0) {
|
|
82
|
+
console.log();
|
|
83
|
+
console.log(` ${theme.error(`Extension not found: ${slug}`)}`);
|
|
84
|
+
console.log();
|
|
85
|
+
console.log(` ${theme.muted('No installed extension matches that slug.')}`);
|
|
86
|
+
console.log(` ${theme.muted(`List installed extensions: ${theme.command('claudetools list')}`)}`);
|
|
87
|
+
console.log();
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
if (matchingExtensions.length === 1 && matchingExtensions[0]) {
|
|
91
|
+
resolvedType = matchingExtensions[0].type;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
// Multiple types found - list them for the user
|
|
95
|
+
const availableTypes = matchingExtensions.map((ext) => ext.type);
|
|
96
|
+
console.log();
|
|
97
|
+
console.log(` ${theme.warning(`"${slug}" is installed as multiple types: ${availableTypes.join(', ')}`)}`);
|
|
98
|
+
console.log();
|
|
99
|
+
console.log(` ${theme.muted('Please specify the type:')}`);
|
|
100
|
+
for (const availableType of availableTypes) {
|
|
101
|
+
console.log(` ${theme.command(`claudetools uninstall ${slug} ${availableType}`)}`);
|
|
102
|
+
}
|
|
103
|
+
console.log();
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
console.log(` ${formatStep(`Uninstalling ${resolvedType}: ${slug}...`)}`);
|
|
108
|
+
await uninstallExtension(slug, resolvedType);
|
|
109
|
+
console.log();
|
|
110
|
+
console.log(` ${formatSuccess(`Uninstalled ${slug} successfully!`)}`);
|
|
111
|
+
console.log();
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
if (error instanceof Error) {
|
|
115
|
+
throw new Error(`Uninstall failed: ${error.message}`);
|
|
116
|
+
}
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export async function runList(options = {}) {
|
|
121
|
+
try {
|
|
122
|
+
const installed = listInstalledExtensions();
|
|
123
|
+
if (options.json) {
|
|
124
|
+
console.log(JSON.stringify(installed, null, 2));
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (installed.length === 0) {
|
|
128
|
+
console.log('\nNo extensions installed.\n');
|
|
129
|
+
console.log('Search for extensions: claudetools search <query>');
|
|
130
|
+
console.log('Install extensions: claudetools install <slug>\n');
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
console.log(`\nInstalled extensions (${installed.length}):\n`);
|
|
134
|
+
const byType = {};
|
|
135
|
+
for (const ext of installed) {
|
|
136
|
+
const typeList = byType[ext.type] ?? (byType[ext.type] = []);
|
|
137
|
+
typeList.push(ext);
|
|
138
|
+
}
|
|
139
|
+
for (const [type, exts] of Object.entries(byType)) {
|
|
140
|
+
console.log(`${type}s:`);
|
|
141
|
+
for (const ext of exts) {
|
|
142
|
+
console.log(` - ${ext.slug}`);
|
|
143
|
+
}
|
|
144
|
+
console.log();
|
|
145
|
+
}
|
|
146
|
+
console.log('Uninstall with: claudetools uninstall <slug> <type>\n');
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
if (error instanceof Error) {
|
|
150
|
+
throw new Error(`List failed: ${error.message}`);
|
|
151
|
+
}
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/marketplace/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Extension } from './api.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validates an extension slug to prevent path traversal and injection attacks.
|
|
4
|
+
* Mirrors the Rust validation in packages/claudetools-sync/src/install/mod.rs.
|
|
5
|
+
*
|
|
6
|
+
* Allowed characters: [a-zA-Z0-9_-]
|
|
7
|
+
* Must be non-empty and at most MAX_SLUG_LENGTH characters.
|
|
8
|
+
*/
|
|
9
|
+
export declare function validateSlug(slug: string): void;
|
|
10
|
+
export interface InstalledExtension {
|
|
11
|
+
slug: string;
|
|
12
|
+
type: string;
|
|
13
|
+
path: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function installExtension(extension: Extension): Promise<void>;
|
|
16
|
+
export declare function uninstallExtension(slug: string, type: string): Promise<void>;
|
|
17
|
+
export declare function listInstalledExtensions(): InstalledExtension[];
|
|
18
|
+
//# sourceMappingURL=installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/marketplace/installer.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAWrC;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAsB/C;AAQD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB1E;AA8CD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwClF;AAED,wBAAgB,uBAAuB,IAAI,kBAAkB,EAAE,CAsD9D"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync, unlinkSync, chmodSync, readdirSync, } from 'fs';
|
|
2
|
+
import { homedir } from 'os';
|
|
3
|
+
import { join, basename } from 'path';
|
|
4
|
+
import { setMcpServer, removeMcpServer, listMcpServers, hasMcpServer, getSettingsPath } from '../mcp/config.js';
|
|
5
|
+
const CLAUDE_DIR = join(homedir(), '.claude');
|
|
6
|
+
const SKILLS_DIR = join(CLAUDE_DIR, 'skills');
|
|
7
|
+
const AGENTS_DIR = join(CLAUDE_DIR, 'agents');
|
|
8
|
+
const HOOKS_DIR = join(CLAUDE_DIR, 'hooks');
|
|
9
|
+
/** Maximum allowed slug length to prevent abuse */
|
|
10
|
+
const MAX_SLUG_LENGTH = 128;
|
|
11
|
+
/**
|
|
12
|
+
* Validates an extension slug to prevent path traversal and injection attacks.
|
|
13
|
+
* Mirrors the Rust validation in packages/claudetools-sync/src/install/mod.rs.
|
|
14
|
+
*
|
|
15
|
+
* Allowed characters: [a-zA-Z0-9_-]
|
|
16
|
+
* Must be non-empty and at most MAX_SLUG_LENGTH characters.
|
|
17
|
+
*/
|
|
18
|
+
export function validateSlug(slug) {
|
|
19
|
+
if (!slug || slug.length === 0) {
|
|
20
|
+
throw new Error('Extension slug must not be empty');
|
|
21
|
+
}
|
|
22
|
+
if (slug.length > MAX_SLUG_LENGTH) {
|
|
23
|
+
throw new Error(`Extension slug exceeds maximum length of ${MAX_SLUG_LENGTH} characters: ${slug.slice(0, 32)}...`);
|
|
24
|
+
}
|
|
25
|
+
if (slug.includes('..') || slug.includes('/') || slug.includes('\\')) {
|
|
26
|
+
throw new Error(`Extension slug contains path traversal characters: ${slug}`);
|
|
27
|
+
}
|
|
28
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(slug)) {
|
|
29
|
+
throw new Error(`Extension slug contains invalid characters (only alphanumeric, hyphens, underscores allowed): ${slug}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function ensureDir(dir) {
|
|
33
|
+
if (!existsSync(dir)) {
|
|
34
|
+
mkdirSync(dir, { recursive: true, mode: 0o755 });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export async function installExtension(extension) {
|
|
38
|
+
validateSlug(extension.slug);
|
|
39
|
+
ensureDir(CLAUDE_DIR);
|
|
40
|
+
switch (extension.type) {
|
|
41
|
+
case 'skill':
|
|
42
|
+
await installSkill(extension);
|
|
43
|
+
break;
|
|
44
|
+
case 'agent':
|
|
45
|
+
await installAgent(extension);
|
|
46
|
+
break;
|
|
47
|
+
case 'hook':
|
|
48
|
+
await installHook(extension);
|
|
49
|
+
break;
|
|
50
|
+
case 'mcp-server':
|
|
51
|
+
await installMcpServer(extension);
|
|
52
|
+
break;
|
|
53
|
+
default:
|
|
54
|
+
throw new Error(`Unknown extension type: ${extension.type}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function installSkill(extension) {
|
|
58
|
+
ensureDir(SKILLS_DIR);
|
|
59
|
+
const filePath = join(SKILLS_DIR, `${extension.slug}.md`);
|
|
60
|
+
if (!extension.content) {
|
|
61
|
+
throw new Error('Extension content is missing');
|
|
62
|
+
}
|
|
63
|
+
writeFileSync(filePath, extension.content, { mode: 0o644 });
|
|
64
|
+
}
|
|
65
|
+
async function installAgent(extension) {
|
|
66
|
+
ensureDir(AGENTS_DIR);
|
|
67
|
+
const filePath = join(AGENTS_DIR, `${extension.slug}.md`);
|
|
68
|
+
if (!extension.content) {
|
|
69
|
+
throw new Error('Extension content is missing');
|
|
70
|
+
}
|
|
71
|
+
writeFileSync(filePath, extension.content, { mode: 0o644 });
|
|
72
|
+
}
|
|
73
|
+
async function installHook(extension) {
|
|
74
|
+
ensureDir(HOOKS_DIR);
|
|
75
|
+
const filePath = join(HOOKS_DIR, `${extension.slug}.sh`);
|
|
76
|
+
if (!extension.content) {
|
|
77
|
+
throw new Error('Extension content is missing');
|
|
78
|
+
}
|
|
79
|
+
writeFileSync(filePath, extension.content, { mode: 0o755 });
|
|
80
|
+
chmodSync(filePath, 0o755);
|
|
81
|
+
}
|
|
82
|
+
async function installMcpServer(extension) {
|
|
83
|
+
if (!extension.config) {
|
|
84
|
+
throw new Error('MCP server configuration is missing');
|
|
85
|
+
}
|
|
86
|
+
// Use settings.json (Claude Code standard) instead of legacy mcp.json
|
|
87
|
+
const config = extension.config;
|
|
88
|
+
setMcpServer(extension.slug, config);
|
|
89
|
+
}
|
|
90
|
+
export async function uninstallExtension(slug, type) {
|
|
91
|
+
validateSlug(slug);
|
|
92
|
+
switch (type) {
|
|
93
|
+
case 'skill': {
|
|
94
|
+
const filePath = join(SKILLS_DIR, `${slug}.md`);
|
|
95
|
+
if (existsSync(filePath)) {
|
|
96
|
+
unlinkSync(filePath);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
throw new Error(`Skill not found: ${slug}`);
|
|
100
|
+
}
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
case 'agent': {
|
|
104
|
+
const filePath = join(AGENTS_DIR, `${slug}.md`);
|
|
105
|
+
if (existsSync(filePath)) {
|
|
106
|
+
unlinkSync(filePath);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
throw new Error(`Agent not found: ${slug}`);
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
case 'hook': {
|
|
114
|
+
const filePath = join(HOOKS_DIR, `${slug}.sh`);
|
|
115
|
+
if (existsSync(filePath)) {
|
|
116
|
+
unlinkSync(filePath);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
throw new Error(`Hook not found: ${slug}`);
|
|
120
|
+
}
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
case 'mcp-server': {
|
|
124
|
+
if (!hasMcpServer(slug)) {
|
|
125
|
+
throw new Error(`MCP server not found: ${slug}`);
|
|
126
|
+
}
|
|
127
|
+
removeMcpServer(slug);
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
default:
|
|
131
|
+
throw new Error(`Unknown extension type: ${type}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
export function listInstalledExtensions() {
|
|
135
|
+
const installed = [];
|
|
136
|
+
// List skills
|
|
137
|
+
if (existsSync(SKILLS_DIR)) {
|
|
138
|
+
const skills = readdirSync(SKILLS_DIR).filter((f) => f.endsWith('.md'));
|
|
139
|
+
for (const skill of skills) {
|
|
140
|
+
const slug = basename(skill, '.md');
|
|
141
|
+
installed.push({
|
|
142
|
+
slug,
|
|
143
|
+
type: 'skill',
|
|
144
|
+
path: join(SKILLS_DIR, skill),
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// List agents
|
|
149
|
+
if (existsSync(AGENTS_DIR)) {
|
|
150
|
+
const agents = readdirSync(AGENTS_DIR).filter((f) => f.endsWith('.md'));
|
|
151
|
+
for (const agent of agents) {
|
|
152
|
+
const slug = basename(agent, '.md');
|
|
153
|
+
installed.push({
|
|
154
|
+
slug,
|
|
155
|
+
type: 'agent',
|
|
156
|
+
path: join(AGENTS_DIR, agent),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// List hooks
|
|
161
|
+
if (existsSync(HOOKS_DIR)) {
|
|
162
|
+
const hooks = readdirSync(HOOKS_DIR).filter((f) => f.endsWith('.sh'));
|
|
163
|
+
for (const hook of hooks) {
|
|
164
|
+
const slug = basename(hook, '.sh');
|
|
165
|
+
installed.push({
|
|
166
|
+
slug,
|
|
167
|
+
type: 'hook',
|
|
168
|
+
path: join(HOOKS_DIR, hook),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// List MCP servers (from settings.json)
|
|
173
|
+
const mcpServers = listMcpServers();
|
|
174
|
+
const settingsPath = getSettingsPath();
|
|
175
|
+
for (const slug of Object.keys(mcpServers)) {
|
|
176
|
+
installed.push({
|
|
177
|
+
slug,
|
|
178
|
+
type: 'mcp-server',
|
|
179
|
+
path: settingsPath,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
return installed;
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/marketplace/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Marketplace API
|
|
3
|
+
*
|
|
4
|
+
* Fetches MCP server manifests from the ClaudeTools marketplace.
|
|
5
|
+
* All MCPs must be curated (submitted for review) before installation.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Environment variable template
|
|
9
|
+
*/
|
|
10
|
+
export interface EnvVarTemplate {
|
|
11
|
+
required: boolean;
|
|
12
|
+
sensitive: boolean;
|
|
13
|
+
description: string;
|
|
14
|
+
helpUrl?: string;
|
|
15
|
+
default?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* MCP server manifest from marketplace
|
|
19
|
+
*/
|
|
20
|
+
export interface McpManifest {
|
|
21
|
+
id: string;
|
|
22
|
+
name: string;
|
|
23
|
+
slug: string;
|
|
24
|
+
description: string;
|
|
25
|
+
source: string;
|
|
26
|
+
version: string;
|
|
27
|
+
author: {
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
};
|
|
31
|
+
envTemplate?: Record<string, EnvVarTemplate>;
|
|
32
|
+
command: string;
|
|
33
|
+
args: string[];
|
|
34
|
+
downloads: number;
|
|
35
|
+
verified: boolean;
|
|
36
|
+
createdAt: string;
|
|
37
|
+
updatedAt: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Search result for MCP servers
|
|
41
|
+
*/
|
|
42
|
+
export interface McpSearchResult {
|
|
43
|
+
servers: McpManifest[];
|
|
44
|
+
total: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* MCP submission request
|
|
48
|
+
*/
|
|
49
|
+
export interface McpSubmission {
|
|
50
|
+
source: string;
|
|
51
|
+
description?: string;
|
|
52
|
+
envTemplate?: Record<string, EnvVarTemplate>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* MCP submission response
|
|
56
|
+
*/
|
|
57
|
+
export interface McpSubmissionResult {
|
|
58
|
+
id: string;
|
|
59
|
+
status: 'pending' | 'approved' | 'rejected';
|
|
60
|
+
message?: string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Fetch MCP manifest from marketplace
|
|
64
|
+
*/
|
|
65
|
+
export declare function getMcpManifest(slug: string): Promise<McpManifest>;
|
|
66
|
+
/**
|
|
67
|
+
* Search for MCP servers in marketplace
|
|
68
|
+
*/
|
|
69
|
+
export declare function searchMcpServers(query?: string, limit?: number): Promise<McpSearchResult>;
|
|
70
|
+
/**
|
|
71
|
+
* Submit an MCP server for review
|
|
72
|
+
*/
|
|
73
|
+
export declare function submitMcpServer(submission: McpSubmission): Promise<McpSubmissionResult>;
|
|
74
|
+
/**
|
|
75
|
+
* Track MCP download (for analytics)
|
|
76
|
+
*/
|
|
77
|
+
export declare function trackMcpDownload(slug: string): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Parse source string to command and args
|
|
80
|
+
*/
|
|
81
|
+
export declare function parseSource(source: string): {
|
|
82
|
+
command: string;
|
|
83
|
+
args: string[];
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Check if an MCP is from the official MCP organization
|
|
87
|
+
*/
|
|
88
|
+
export declare function isOfficialMcp(manifest: McpManifest): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Format MCP source for display
|
|
91
|
+
*/
|
|
92
|
+
export declare function formatSource(source: string): string;
|
|
93
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/mcp/api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CASvE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,eAAe,CAAC,CAc3F;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAS7F;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOlE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CA4B/E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAM5D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQnD"}
|