@claudetools/cli 0.13.13 → 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 +15 -4
- 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,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Interactive Prompting
|
|
3
|
+
*
|
|
4
|
+
* Handles interactive prompting for MCP server environment variables
|
|
5
|
+
* with support for masked input, optional values, and help URLs.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Environment variable template from MCP manifest
|
|
9
|
+
*/
|
|
10
|
+
export interface EnvVarTemplate {
|
|
11
|
+
required: boolean;
|
|
12
|
+
sensitive: boolean;
|
|
13
|
+
description: string;
|
|
14
|
+
helpUrl?: string;
|
|
15
|
+
default?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Collected environment variable value
|
|
19
|
+
*/
|
|
20
|
+
export interface EnvVarValue {
|
|
21
|
+
value: string;
|
|
22
|
+
isSecret: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Prompt for all environment variables from a template
|
|
26
|
+
*/
|
|
27
|
+
export declare function promptEnvVars(envTemplate: Record<string, EnvVarTemplate>, _serverName: string): Promise<Record<string, EnvVarValue>>;
|
|
28
|
+
/**
|
|
29
|
+
* Prompt for re-configuration of specific variables
|
|
30
|
+
*/
|
|
31
|
+
export declare function promptUpdateEnvVars(envTemplate: Record<string, EnvVarTemplate>, existingSecrets: string[], _serverName: string): Promise<Record<string, EnvVarValue>>;
|
|
32
|
+
/**
|
|
33
|
+
* Confirm an action
|
|
34
|
+
*/
|
|
35
|
+
export declare function confirm(message: string, defaultValue?: boolean): Promise<boolean>;
|
|
36
|
+
/**
|
|
37
|
+
* Display a success message
|
|
38
|
+
*/
|
|
39
|
+
export declare function showSuccess(message: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* Display an error message
|
|
42
|
+
*/
|
|
43
|
+
export declare function showError(message: string): void;
|
|
44
|
+
/**
|
|
45
|
+
* Display an info message
|
|
46
|
+
*/
|
|
47
|
+
export declare function showInfo(message: string): void;
|
|
48
|
+
/**
|
|
49
|
+
* Mask a secret value for display
|
|
50
|
+
*/
|
|
51
|
+
export declare function maskSecret(value: string): string;
|
|
52
|
+
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/mcp/prompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;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,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;CACnB;AAiFD;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EAC3C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAmDtC;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EAC3C,eAAe,EAAE,MAAM,EAAE,EACzB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CA+CtC;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBrF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKhD"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Interactive Prompting
|
|
3
|
+
*
|
|
4
|
+
* Handles interactive prompting for MCP server environment variables
|
|
5
|
+
* with support for masked input, optional values, and help URLs.
|
|
6
|
+
*/
|
|
7
|
+
import * as readline from 'readline';
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
/**
|
|
10
|
+
* Create readline interface for terminal input
|
|
11
|
+
*/
|
|
12
|
+
function createReadline() {
|
|
13
|
+
return readline.createInterface({
|
|
14
|
+
input: process.stdin,
|
|
15
|
+
output: process.stdout,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Prompt for a single value with optional masking
|
|
20
|
+
*/
|
|
21
|
+
async function promptValue(rl, prompt, options = {}) {
|
|
22
|
+
return new Promise((resolve) => {
|
|
23
|
+
if (options.mask) {
|
|
24
|
+
// For masked input, we need to handle it specially
|
|
25
|
+
const stdin = process.stdin;
|
|
26
|
+
const stdout = process.stdout;
|
|
27
|
+
stdout.write(prompt);
|
|
28
|
+
let value = '';
|
|
29
|
+
const wasRaw = stdin.isRaw;
|
|
30
|
+
if (stdin.isTTY) {
|
|
31
|
+
stdin.setRawMode(true);
|
|
32
|
+
}
|
|
33
|
+
stdin.resume();
|
|
34
|
+
const onData = (char) => {
|
|
35
|
+
const c = char.toString('utf8');
|
|
36
|
+
switch (c) {
|
|
37
|
+
case '\n':
|
|
38
|
+
case '\r':
|
|
39
|
+
case '\u0004': // Ctrl-D
|
|
40
|
+
stdin.setRawMode(wasRaw ?? false);
|
|
41
|
+
stdin.pause();
|
|
42
|
+
stdin.removeListener('data', onData);
|
|
43
|
+
stdout.write('\n');
|
|
44
|
+
resolve(value || options.defaultValue || '');
|
|
45
|
+
return;
|
|
46
|
+
case '\u0003': // Ctrl-C
|
|
47
|
+
stdin.setRawMode(wasRaw ?? false);
|
|
48
|
+
process.exit(0);
|
|
49
|
+
case '\u007F': // Backspace
|
|
50
|
+
if (value.length > 0) {
|
|
51
|
+
value = value.slice(0, -1);
|
|
52
|
+
stdout.write('\b \b');
|
|
53
|
+
}
|
|
54
|
+
return;
|
|
55
|
+
default:
|
|
56
|
+
value += c;
|
|
57
|
+
stdout.write('*');
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
stdin.on('data', onData);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// Normal input
|
|
64
|
+
const displayPrompt = options.defaultValue
|
|
65
|
+
? `${prompt} [${options.defaultValue}] `
|
|
66
|
+
: prompt;
|
|
67
|
+
rl.question(displayPrompt, (answer) => {
|
|
68
|
+
resolve(answer || options.defaultValue || '');
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Prompt for all environment variables from a template
|
|
75
|
+
*/
|
|
76
|
+
export async function promptEnvVars(envTemplate, _serverName) {
|
|
77
|
+
const rl = createReadline();
|
|
78
|
+
const values = {};
|
|
79
|
+
console.log();
|
|
80
|
+
console.log(chalk.bold(' This server requires configuration:'));
|
|
81
|
+
console.log();
|
|
82
|
+
try {
|
|
83
|
+
for (const [name, template] of Object.entries(envTemplate)) {
|
|
84
|
+
// Display variable info
|
|
85
|
+
const requiredLabel = template.required ? chalk.red('required') : chalk.dim('optional');
|
|
86
|
+
console.log(` ${chalk.cyan(name)} (${requiredLabel})`);
|
|
87
|
+
if (template.description) {
|
|
88
|
+
console.log(` ${chalk.dim(template.description)}`);
|
|
89
|
+
}
|
|
90
|
+
if (template.helpUrl) {
|
|
91
|
+
console.log(` ${chalk.dim('Get one at:')} ${chalk.blue(template.helpUrl)}`);
|
|
92
|
+
}
|
|
93
|
+
// Prompt for value
|
|
94
|
+
const prompt = template.sensitive ? ' > Enter value: ' : ' > ';
|
|
95
|
+
const value = await promptValue(rl, prompt, {
|
|
96
|
+
mask: template.sensitive,
|
|
97
|
+
defaultValue: template.default,
|
|
98
|
+
});
|
|
99
|
+
// Handle empty values
|
|
100
|
+
if (!value && template.required) {
|
|
101
|
+
console.log(chalk.red(` Error: ${name} is required`));
|
|
102
|
+
rl.close();
|
|
103
|
+
throw new Error(`Required value not provided: ${name}`);
|
|
104
|
+
}
|
|
105
|
+
// Store value if provided
|
|
106
|
+
if (value) {
|
|
107
|
+
values[name] = {
|
|
108
|
+
value,
|
|
109
|
+
isSecret: template.sensitive,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
console.log();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
rl.close();
|
|
117
|
+
}
|
|
118
|
+
return values;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Prompt for re-configuration of specific variables
|
|
122
|
+
*/
|
|
123
|
+
export async function promptUpdateEnvVars(envTemplate, existingSecrets, _serverName) {
|
|
124
|
+
const rl = createReadline();
|
|
125
|
+
const values = {};
|
|
126
|
+
console.log();
|
|
127
|
+
console.log(chalk.bold(' Update environment variables:'));
|
|
128
|
+
console.log(chalk.dim(' (Press Enter to keep existing value)'));
|
|
129
|
+
console.log();
|
|
130
|
+
try {
|
|
131
|
+
for (const [name, template] of Object.entries(envTemplate)) {
|
|
132
|
+
const hasExisting = existingSecrets.includes(name);
|
|
133
|
+
// Display variable info
|
|
134
|
+
const statusLabel = hasExisting ? chalk.green('configured') : chalk.yellow('not set');
|
|
135
|
+
console.log(` ${chalk.cyan(name)} (${statusLabel})`);
|
|
136
|
+
if (template.description) {
|
|
137
|
+
console.log(` ${chalk.dim(template.description)}`);
|
|
138
|
+
}
|
|
139
|
+
// Prompt for value
|
|
140
|
+
const prompt = hasExisting
|
|
141
|
+
? ' > New value (or Enter to keep): '
|
|
142
|
+
: template.sensitive
|
|
143
|
+
? ' > Enter value: '
|
|
144
|
+
: ' > ';
|
|
145
|
+
const value = await promptValue(rl, prompt, {
|
|
146
|
+
mask: template.sensitive,
|
|
147
|
+
});
|
|
148
|
+
// Store value if provided
|
|
149
|
+
if (value) {
|
|
150
|
+
values[name] = {
|
|
151
|
+
value,
|
|
152
|
+
isSecret: template.sensitive,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
console.log();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
rl.close();
|
|
160
|
+
}
|
|
161
|
+
return values;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Confirm an action
|
|
165
|
+
*/
|
|
166
|
+
export async function confirm(message, defaultValue = false) {
|
|
167
|
+
const rl = createReadline();
|
|
168
|
+
const suffix = defaultValue ? '[Y/n]' : '[y/N]';
|
|
169
|
+
const prompt = `${message} ${suffix} `;
|
|
170
|
+
return new Promise((resolve) => {
|
|
171
|
+
rl.question(prompt, (answer) => {
|
|
172
|
+
rl.close();
|
|
173
|
+
const normalized = answer.toLowerCase().trim();
|
|
174
|
+
if (normalized === '') {
|
|
175
|
+
resolve(defaultValue);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
resolve(normalized === 'y' || normalized === 'yes');
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Display a success message
|
|
185
|
+
*/
|
|
186
|
+
export function showSuccess(message) {
|
|
187
|
+
console.log(chalk.green(` ${message}`));
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Display an error message
|
|
191
|
+
*/
|
|
192
|
+
export function showError(message) {
|
|
193
|
+
console.log(chalk.red(` ${message}`));
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Display an info message
|
|
197
|
+
*/
|
|
198
|
+
export function showInfo(message) {
|
|
199
|
+
console.log(chalk.dim(` ${message}`));
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Mask a secret value for display
|
|
203
|
+
*/
|
|
204
|
+
export function maskSecret(value) {
|
|
205
|
+
if (value.length <= 4) {
|
|
206
|
+
return '****';
|
|
207
|
+
}
|
|
208
|
+
return value.slice(0, 2) + '*'.repeat(Math.min(value.length - 4, 8)) + value.slice(-2);
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/mcp/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Secrets Management
|
|
3
|
+
*
|
|
4
|
+
* Stores MCP server credentials in system keychain with namespace:
|
|
5
|
+
* mcp/<server-name>/<variable-name>
|
|
6
|
+
*
|
|
7
|
+
* Falls back to encrypted file storage when keychain unavailable.
|
|
8
|
+
*/
|
|
9
|
+
export declare function setMcpSecret(server: string, variable: string, value: string): Promise<void>;
|
|
10
|
+
export declare function getMcpSecret(server: string, variable: string): Promise<string | null>;
|
|
11
|
+
export declare function deleteMcpSecret(server: string, variable: string): Promise<void>;
|
|
12
|
+
export declare function deleteMcpSecrets(server: string): Promise<void>;
|
|
13
|
+
export declare function listMcpSecrets(server: string): Promise<string[]>;
|
|
14
|
+
export declare function hasMcpSecret(server: string, variable: string): Promise<boolean>;
|
|
15
|
+
export declare function resolveKeychainRef(ref: string): Promise<string | null>;
|
|
16
|
+
export declare function isKeychainRef(value: string): boolean;
|
|
17
|
+
export declare function buildKeychainRef(server: string, variable: string): string;
|
|
18
|
+
//# sourceMappingURL=secrets.clean.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.clean.d.ts","sourceRoot":"","sources":["../../src/mcp/secrets.clean.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAkGH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcjG;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgB3F;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAarF;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASpE;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYtE;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGrF;AAyPD,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAa5E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzE"}
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Secrets Management
|
|
3
|
+
*
|
|
4
|
+
* Stores MCP server credentials in system keychain with namespace:
|
|
5
|
+
* mcp/<server-name>/<variable-name>
|
|
6
|
+
*
|
|
7
|
+
* Falls back to encrypted file storage when keychain unavailable.
|
|
8
|
+
*/
|
|
9
|
+
import { homedir, hostname, userInfo } from 'os';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import { existsSync, readFileSync, writeFileSync, unlinkSync, mkdirSync, readdirSync, rmSync, } from 'fs';
|
|
12
|
+
import { createCipheriv, createDecipheriv, randomBytes, pbkdf2Sync, createHash } from 'crypto';
|
|
13
|
+
import { execFileSync } from 'child_process';
|
|
14
|
+
// ============ Constants ============
|
|
15
|
+
const SERVICE_NAME = 'claudetools-mcp';
|
|
16
|
+
const CREDENTIALS_DIR = join(homedir(), '.claudetools', 'mcp-secrets');
|
|
17
|
+
const ENCRYPTION_ALGORITHM = 'aes-256-gcm';
|
|
18
|
+
const PBKDF2_ITERATIONS = 100000;
|
|
19
|
+
// ============ Keytar Management ============
|
|
20
|
+
let keytarModule = undefined;
|
|
21
|
+
async function loadKeytar() {
|
|
22
|
+
if (keytarModule === undefined) {
|
|
23
|
+
keytarModule = null;
|
|
24
|
+
try {
|
|
25
|
+
const module = (await import(/* webpackIgnore: true */ 'keytar'));
|
|
26
|
+
keytarModule = module.default || module;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Keytar not available, will use file fallback
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return keytarModule;
|
|
33
|
+
}
|
|
34
|
+
// ============ Namespace Helpers ============
|
|
35
|
+
/**
|
|
36
|
+
* Validate server/variable name to prevent path traversal in file storage.
|
|
37
|
+
*/
|
|
38
|
+
function validateSecretName(name, label) {
|
|
39
|
+
if (!name || name.length === 0) {
|
|
40
|
+
throw new Error(`${label} name must not be empty`);
|
|
41
|
+
}
|
|
42
|
+
if (name.includes('/') || name.includes('\\') || name.includes('..')) {
|
|
43
|
+
throw new Error(`${label} name "${name}" contains invalid characters. ` +
|
|
44
|
+
'Names must not contain path separators (/, \\) or ".." sequences.');
|
|
45
|
+
}
|
|
46
|
+
if (!/^[a-zA-Z0-9._-]+$/.test(name)) {
|
|
47
|
+
throw new Error(`${label} name "${name}" contains invalid characters. ` +
|
|
48
|
+
'Only alphanumeric characters, hyphens, underscores, and dots are allowed.');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function buildAccountName(server, variable) {
|
|
52
|
+
validateSecretName(server, 'Server');
|
|
53
|
+
validateSecretName(variable, 'Variable');
|
|
54
|
+
return `mcp/${server}/${variable}`;
|
|
55
|
+
}
|
|
56
|
+
function buildServerPrefix(server) {
|
|
57
|
+
return `mcp/${server}/`;
|
|
58
|
+
}
|
|
59
|
+
function extractVariableFromAccount(account, prefix) {
|
|
60
|
+
return account.slice(prefix.length);
|
|
61
|
+
}
|
|
62
|
+
// ============ Public API ============
|
|
63
|
+
export async function setMcpSecret(server, variable, value) {
|
|
64
|
+
const account = buildAccountName(server, variable);
|
|
65
|
+
const kt = await loadKeytar();
|
|
66
|
+
if (kt) {
|
|
67
|
+
try {
|
|
68
|
+
await kt.setPassword(SERVICE_NAME, account, value);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Fall through to file storage
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
await storeToFile(server, variable, value);
|
|
76
|
+
}
|
|
77
|
+
export async function getMcpSecret(server, variable) {
|
|
78
|
+
const account = buildAccountName(server, variable);
|
|
79
|
+
const kt = await loadKeytar();
|
|
80
|
+
if (kt) {
|
|
81
|
+
try {
|
|
82
|
+
const password = await kt.getPassword(SERVICE_NAME, account);
|
|
83
|
+
if (password) {
|
|
84
|
+
return password;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Fall through to file storage
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return getFromFile(server, variable);
|
|
92
|
+
}
|
|
93
|
+
export async function deleteMcpSecret(server, variable) {
|
|
94
|
+
const account = buildAccountName(server, variable);
|
|
95
|
+
const kt = await loadKeytar();
|
|
96
|
+
if (kt) {
|
|
97
|
+
try {
|
|
98
|
+
await kt.deletePassword(SERVICE_NAME, account);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Ignore errors
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
deleteFromFile(server, variable);
|
|
105
|
+
}
|
|
106
|
+
export async function deleteMcpSecrets(server) {
|
|
107
|
+
validateSecretName(server, 'Server');
|
|
108
|
+
const prefix = buildServerPrefix(server);
|
|
109
|
+
// Delete from keychain
|
|
110
|
+
await deleteKeychainCredentials(prefix);
|
|
111
|
+
// Delete encrypted files
|
|
112
|
+
deleteServerFiles(server);
|
|
113
|
+
}
|
|
114
|
+
export async function listMcpSecrets(server) {
|
|
115
|
+
validateSecretName(server, 'Server');
|
|
116
|
+
const prefix = buildServerPrefix(server);
|
|
117
|
+
const variablesSet = new Set();
|
|
118
|
+
// Collect from keychain
|
|
119
|
+
await collectKeychainVariables(prefix, variablesSet);
|
|
120
|
+
// Collect from files
|
|
121
|
+
collectFileVariables(server, variablesSet);
|
|
122
|
+
return Array.from(variablesSet);
|
|
123
|
+
}
|
|
124
|
+
export async function hasMcpSecret(server, variable) {
|
|
125
|
+
const secret = await getMcpSecret(server, variable);
|
|
126
|
+
return secret !== null;
|
|
127
|
+
}
|
|
128
|
+
// ============ Keychain Operations ============
|
|
129
|
+
async function deleteKeychainCredentials(prefix) {
|
|
130
|
+
const kt = await loadKeytar();
|
|
131
|
+
if (!kt)
|
|
132
|
+
return;
|
|
133
|
+
try {
|
|
134
|
+
const credentials = await kt.findCredentials(SERVICE_NAME);
|
|
135
|
+
const deletePromises = credentials
|
|
136
|
+
.filter((cred) => cred.account.startsWith(prefix))
|
|
137
|
+
.map((cred) => kt.deletePassword(SERVICE_NAME, cred.account));
|
|
138
|
+
await Promise.all(deletePromises);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// Ignore errors
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async function collectKeychainVariables(prefix, variablesSet) {
|
|
145
|
+
const kt = await loadKeytar();
|
|
146
|
+
if (!kt)
|
|
147
|
+
return;
|
|
148
|
+
try {
|
|
149
|
+
const credentials = await kt.findCredentials(SERVICE_NAME);
|
|
150
|
+
credentials
|
|
151
|
+
.filter((cred) => cred.account.startsWith(prefix))
|
|
152
|
+
.forEach((cred) => {
|
|
153
|
+
const variable = extractVariableFromAccount(cred.account, prefix);
|
|
154
|
+
variablesSet.add(variable);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// Ignore errors
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// ============ File Operations ============
|
|
162
|
+
function ensureDir(dir) {
|
|
163
|
+
if (!existsSync(dir)) {
|
|
164
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
function getSecretFilePath(server, variable) {
|
|
168
|
+
return join(CREDENTIALS_DIR, server, `${variable}.enc`);
|
|
169
|
+
}
|
|
170
|
+
async function storeToFile(server, variable, value) {
|
|
171
|
+
const serverDir = join(CREDENTIALS_DIR, server);
|
|
172
|
+
ensureDir(serverDir);
|
|
173
|
+
const encryptedData = encryptValue(value);
|
|
174
|
+
const filePath = getSecretFilePath(server, variable);
|
|
175
|
+
writeFileSync(filePath, JSON.stringify(encryptedData), { mode: 0o600 });
|
|
176
|
+
}
|
|
177
|
+
function getFromFile(server, variable) {
|
|
178
|
+
try {
|
|
179
|
+
const filePath = getSecretFilePath(server, variable);
|
|
180
|
+
if (!existsSync(filePath)) {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
184
|
+
const data = JSON.parse(content);
|
|
185
|
+
if (data.version !== 1) {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
return decryptValue(data);
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
function deleteFromFile(server, variable) {
|
|
195
|
+
const filePath = getSecretFilePath(server, variable);
|
|
196
|
+
if (existsSync(filePath)) {
|
|
197
|
+
unlinkSync(filePath);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function deleteServerFiles(server) {
|
|
201
|
+
const serverDir = join(CREDENTIALS_DIR, server);
|
|
202
|
+
if (existsSync(serverDir)) {
|
|
203
|
+
try {
|
|
204
|
+
rmSync(serverDir, { recursive: true });
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
// Ignore errors
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
function collectFileVariables(server, variablesSet) {
|
|
212
|
+
const serverDir = join(CREDENTIALS_DIR, server);
|
|
213
|
+
if (!existsSync(serverDir))
|
|
214
|
+
return;
|
|
215
|
+
try {
|
|
216
|
+
const files = readdirSync(serverDir).filter((f) => f.endsWith('.enc'));
|
|
217
|
+
files.forEach((file) => {
|
|
218
|
+
const variable = file.slice(0, -4); // Remove .enc
|
|
219
|
+
variablesSet.add(variable);
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
// Ignore errors
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// ============ Encryption ============
|
|
227
|
+
function encryptValue(value) {
|
|
228
|
+
const machineSalt = getMachineSalt();
|
|
229
|
+
const salt = randomBytes(32);
|
|
230
|
+
const key = pbkdf2Sync(machineSalt, salt, PBKDF2_ITERATIONS, 32, 'sha256');
|
|
231
|
+
const iv = randomBytes(16);
|
|
232
|
+
const cipher = createCipheriv(ENCRYPTION_ALGORITHM, key, iv);
|
|
233
|
+
let encrypted = cipher.update(value, 'utf8', 'hex');
|
|
234
|
+
encrypted += cipher.final('hex');
|
|
235
|
+
const authTag = cipher.getAuthTag();
|
|
236
|
+
return {
|
|
237
|
+
version: 1,
|
|
238
|
+
salt: salt.toString('hex'),
|
|
239
|
+
iv: iv.toString('hex'),
|
|
240
|
+
authTag: authTag.toString('hex'),
|
|
241
|
+
data: encrypted,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
function decryptValue(data) {
|
|
245
|
+
const machineSalt = getMachineSalt();
|
|
246
|
+
const salt = Buffer.from(data.salt, 'hex');
|
|
247
|
+
const key = pbkdf2Sync(machineSalt, salt, PBKDF2_ITERATIONS, 32, 'sha256');
|
|
248
|
+
const iv = Buffer.from(data.iv, 'hex');
|
|
249
|
+
const authTag = Buffer.from(data.authTag, 'hex');
|
|
250
|
+
const decipher = createDecipheriv(ENCRYPTION_ALGORITHM, key, iv);
|
|
251
|
+
decipher.setAuthTag(authTag);
|
|
252
|
+
let decrypted = decipher.update(data.data, 'hex', 'utf8');
|
|
253
|
+
decrypted += decipher.final('utf8');
|
|
254
|
+
return decrypted;
|
|
255
|
+
}
|
|
256
|
+
// ============ Machine ID ============
|
|
257
|
+
function getMachineSalt() {
|
|
258
|
+
const machineId = getMachineId();
|
|
259
|
+
if (machineId) {
|
|
260
|
+
return machineId;
|
|
261
|
+
}
|
|
262
|
+
// Fallback: use or create a persistent random salt (same pattern as auth/keychain.ts)
|
|
263
|
+
return getOrCreatePersistentSalt();
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Get or create a persistent random salt stored in ~/.claudetools/.salt
|
|
267
|
+
* Avoids predictable key derivation from hostname+username.
|
|
268
|
+
*/
|
|
269
|
+
function getOrCreatePersistentSalt() {
|
|
270
|
+
const saltPath = join(homedir(), '.claudetools', '.salt');
|
|
271
|
+
try {
|
|
272
|
+
if (existsSync(saltPath)) {
|
|
273
|
+
const salt = readFileSync(saltPath, 'utf-8').trim();
|
|
274
|
+
if (salt && salt.length === 64) { // 32 bytes hex = 64 chars
|
|
275
|
+
return salt;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
// Continue to generate new salt
|
|
281
|
+
}
|
|
282
|
+
// Generate new random salt
|
|
283
|
+
const salt = randomBytes(32).toString('hex');
|
|
284
|
+
try {
|
|
285
|
+
const configDir = join(homedir(), '.claudetools');
|
|
286
|
+
if (!existsSync(configDir)) {
|
|
287
|
+
mkdirSync(configDir, { recursive: true, mode: 0o700 });
|
|
288
|
+
}
|
|
289
|
+
writeFileSync(saltPath, salt, { mode: 0o600 });
|
|
290
|
+
return salt;
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
// Last resort: predictable fallback
|
|
294
|
+
const fallback = `${hostname()}-${userInfo().username}`;
|
|
295
|
+
return createHash('sha256').update(fallback).digest('hex');
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
function getMachineId() {
|
|
299
|
+
try {
|
|
300
|
+
switch (process.platform) {
|
|
301
|
+
case 'darwin':
|
|
302
|
+
return getMacOsMachineId();
|
|
303
|
+
case 'linux':
|
|
304
|
+
return getLinuxMachineId();
|
|
305
|
+
case 'win32':
|
|
306
|
+
return getWindowsMachineId();
|
|
307
|
+
default:
|
|
308
|
+
return null;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
return null;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
function getMacOsMachineId() {
|
|
316
|
+
// Use execFileSync to avoid shell injection; parse output in JS instead of piping through grep
|
|
317
|
+
const output = execFileSync('ioreg', ['-rd1', '-c', 'IOPlatformExpertDevice'], {
|
|
318
|
+
encoding: 'utf-8',
|
|
319
|
+
timeout: 5000,
|
|
320
|
+
});
|
|
321
|
+
const match = output.match(/"IOPlatformUUID"\s*=\s*"([^"]+)"/);
|
|
322
|
+
return match?.[1] || null;
|
|
323
|
+
}
|
|
324
|
+
function getLinuxMachineId() {
|
|
325
|
+
if (existsSync('/etc/machine-id')) {
|
|
326
|
+
return readFileSync('/etc/machine-id', 'utf-8').trim();
|
|
327
|
+
}
|
|
328
|
+
if (existsSync('/var/lib/dbus/machine-id')) {
|
|
329
|
+
return readFileSync('/var/lib/dbus/machine-id', 'utf-8').trim();
|
|
330
|
+
}
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
function getWindowsMachineId() {
|
|
334
|
+
const output = execFileSync('reg', ['query', 'HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography', '/v', 'MachineGuid'], { encoding: 'utf-8', timeout: 5000 });
|
|
335
|
+
const match = output.match(/MachineGuid\s+REG_SZ\s+(\S+)/);
|
|
336
|
+
return match?.[1] || null;
|
|
337
|
+
}
|
|
338
|
+
// ============ Keychain Reference Helpers ============
|
|
339
|
+
export async function resolveKeychainRef(ref) {
|
|
340
|
+
const match = ref.match(/^\$\{keychain:mcp\/([^/]+)\/([^}]+)\}$/);
|
|
341
|
+
if (!match) {
|
|
342
|
+
return null;
|
|
343
|
+
}
|
|
344
|
+
const server = match[1];
|
|
345
|
+
const variable = match[2];
|
|
346
|
+
if (!server || !variable) {
|
|
347
|
+
return null;
|
|
348
|
+
}
|
|
349
|
+
return getMcpSecret(server, variable);
|
|
350
|
+
}
|
|
351
|
+
export function isKeychainRef(value) {
|
|
352
|
+
return /^\$\{keychain:mcp\/[^/]+\/[^}]+\}$/.test(value);
|
|
353
|
+
}
|
|
354
|
+
export function buildKeychainRef(server, variable) {
|
|
355
|
+
return `\${keychain:mcp/${server}/${variable}}`;
|
|
356
|
+
}
|
|
357
|
+
//# sourceMappingURL=secrets.clean.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.clean.js","sourceRoot":"","sources":["../../src/mcp/secrets.clean.ts"],"names":[],"mappings":"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"}
|