@posthog/wizard 1.24.0 → 1.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/lib/agent-interface.d.ts +7 -1
- package/dist/src/lib/agent-interface.js +121 -28
- package/dist/src/lib/agent-interface.js.map +1 -1
- package/dist/src/lib/agent-runner.d.ts +1 -1
- package/dist/src/lib/agent-runner.js +41 -13
- package/dist/src/lib/agent-runner.js.map +1 -1
- package/dist/src/lib/config.d.ts +12 -1
- package/dist/src/lib/config.js +22 -0
- package/dist/src/lib/config.js.map +1 -1
- package/dist/src/lib/constants.d.ts +5 -1
- package/dist/src/lib/constants.js +8 -1
- package/dist/src/lib/constants.js.map +1 -1
- package/dist/src/lib/framework-config.d.ts +8 -6
- package/dist/src/lib/framework-config.js +12 -0
- package/dist/src/lib/framework-config.js.map +1 -1
- package/dist/src/lib/safe-tools.d.ts +2 -0
- package/dist/src/lib/safe-tools.js +215 -0
- package/dist/src/lib/safe-tools.js.map +1 -0
- package/dist/src/mcp.d.ts +0 -3
- package/dist/src/mcp.js +2 -32
- package/dist/src/mcp.js.map +1 -1
- package/dist/src/nextjs/nextjs-wizard-agent.js +0 -3
- package/dist/src/nextjs/nextjs-wizard-agent.js.map +1 -1
- package/dist/src/react-router/react-router-wizard-agent.d.ts +5 -0
- package/dist/src/react-router/react-router-wizard-agent.js +151 -0
- package/dist/src/react-router/react-router-wizard-agent.js.map +1 -0
- package/dist/src/react-router/utils.d.ts +19 -0
- package/dist/src/react-router/utils.js +276 -0
- package/dist/src/react-router/utils.js.map +1 -0
- package/dist/src/run.js +13 -0
- package/dist/src/run.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/MCPClient.d.ts +5 -4
- package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js +6 -6
- package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/__tests__/defaults.test.d.ts +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/__tests__/defaults.test.js +92 -0
- package/dist/src/steps/add-mcp-server-to-clients/__tests__/defaults.test.js.map +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.js +11 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.d.ts +2 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.js +5 -3
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/codex.d.ts +2 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/codex.js +2 -2
- package/dist/src/steps/add-mcp-server-to-clients/clients/codex.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.d.ts +3 -2
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +4 -4
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.d.ts +3 -2
- package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.js +4 -4
- package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/zed.d.ts +3 -2
- package/dist/src/steps/add-mcp-server-to-clients/clients/zed.js +4 -4
- package/dist/src/steps/add-mcp-server-to-clients/clients/zed.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/defaults.d.ts +8 -8
- package/dist/src/steps/add-mcp-server-to-clients/defaults.js +34 -13
- package/dist/src/steps/add-mcp-server-to-clients/defaults.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/index.d.ts +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/index.js +4 -5
- package/dist/src/steps/add-mcp-server-to-clients/index.js.map +1 -1
- package/package.json +1 -1
package/dist/src/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"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","sourcesContent":["import { abortIfCancelled } from './utils/clack-utils';\n\nimport { runNextjsWizardAgent } from './nextjs/nextjs-wizard-agent';\nimport type { CloudRegion, WizardOptions } from './utils/types';\n\nimport {\n getIntegrationDescription,\n Integration,\n FeatureFlagDefinition,\n} from './lib/constants';\nimport { readEnvironment } from './utils/environment';\nimport clack from './utils/clack';\nimport path from 'path';\nimport { INTEGRATION_CONFIG, INTEGRATION_ORDER } from './lib/config';\nimport { runReactWizard } from './react/react-wizard';\nimport { analytics } from './utils/analytics';\nimport { runSvelteWizard } from './svelte/svelte-wizard';\nimport { runReactNativeWizard } from './react-native/react-native-wizard';\nimport { runAstroWizard } from './astro/astro-wizard';\nimport { runReactRouterWizardAgent } from './react-router/react-router-wizard-agent';\nimport { EventEmitter } from 'events';\nimport chalk from 'chalk';\nimport { RateLimitError } from './utils/errors';\n\nEventEmitter.defaultMaxListeners = 50;\n\ntype Args = {\n integration?: Integration;\n debug?: boolean;\n forceInstall?: boolean;\n installDir?: string;\n region?: CloudRegion;\n default?: boolean;\n signup?: boolean;\n localMcp?: boolean;\n ci?: boolean;\n apiKey?: string;\n};\n\nexport async function runWizard(argv: Args) {\n const finalArgs = {\n ...argv,\n ...readEnvironment(),\n };\n\n let resolvedInstallDir: string;\n if (finalArgs.installDir) {\n if (path.isAbsolute(finalArgs.installDir)) {\n resolvedInstallDir = finalArgs.installDir;\n } else {\n resolvedInstallDir = path.join(process.cwd(), finalArgs.installDir);\n }\n } else {\n resolvedInstallDir = process.cwd();\n }\n\n const wizardOptions: WizardOptions = {\n debug: finalArgs.debug ?? false,\n forceInstall: finalArgs.forceInstall ?? false,\n installDir: resolvedInstallDir,\n cloudRegion: finalArgs.region ?? undefined,\n default: finalArgs.default ?? false,\n signup: finalArgs.signup ?? false,\n localMcp: finalArgs.localMcp ?? false,\n ci: finalArgs.ci ?? false,\n apiKey: finalArgs.apiKey,\n };\n\n clack.intro(`Welcome to the PostHog setup wizard ✨`);\n\n if (wizardOptions.ci) {\n clack.log.info(chalk.dim('Running in CI mode'));\n }\n\n const integration =\n finalArgs.integration ?? (await getIntegrationForSetup(wizardOptions));\n\n analytics.setTag('integration', integration);\n\n try {\n switch (integration) {\n case Integration.nextjs:\n await runNextjsWizardAgent(wizardOptions);\n break;\n case Integration.react:\n await runReactWizard(wizardOptions);\n break;\n case Integration.svelte:\n await runSvelteWizard(wizardOptions);\n break;\n case Integration.reactNative:\n await runReactNativeWizard(wizardOptions);\n break;\n case Integration.astro:\n await runAstroWizard(wizardOptions);\n break;\n case Integration.reactRouter: {\n const flagValue = await analytics.getFeatureFlag(\n FeatureFlagDefinition.ReactRouter,\n );\n // In CI mode, bypass feature flags and always use the React Router wizard\n if (wizardOptions.ci || flagValue === true) {\n await runReactRouterWizardAgent(wizardOptions);\n } else {\n await runReactWizard(wizardOptions);\n }\n break;\n }\n default:\n clack.log.error('No setup wizard selected!');\n }\n } catch (error) {\n analytics.captureException(error as Error, {\n integration,\n arguments: JSON.stringify(finalArgs),\n });\n\n await analytics.shutdown('error');\n\n if (error instanceof RateLimitError) {\n clack.log.error('Wizard usage limit reached. Please try again later.');\n } else {\n clack.log.error(\n `Something went wrong. You can read the documentation at ${chalk.cyan(\n `${INTEGRATION_CONFIG[integration].docsUrl}`,\n )} to set up PostHog manually.`,\n );\n }\n process.exit(1);\n }\n}\n\nasync function detectIntegration(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<Integration | undefined> {\n const integrationConfigs = Object.entries(INTEGRATION_CONFIG).sort(\n ([a], [b]) =>\n INTEGRATION_ORDER.indexOf(a as Integration) -\n INTEGRATION_ORDER.indexOf(b as Integration),\n );\n\n for (const [integration, config] of integrationConfigs) {\n const detected = await config.detect(options);\n if (detected) {\n return integration as Integration;\n }\n }\n}\n\nasync function getIntegrationForSetup(\n options: Pick<WizardOptions, 'installDir'>,\n) {\n const detectedIntegration = await detectIntegration(options);\n\n if (detectedIntegration) {\n clack.log.success(\n `Detected integration: ${getIntegrationDescription(detectedIntegration)}`,\n );\n return detectedIntegration;\n }\n\n const integration: Integration = await abortIfCancelled(\n clack.select({\n message: 'What do you want to set up?',\n options: [\n { value: Integration.nextjs, label: 'Next.js' },\n { value: Integration.astro, label: 'Astro' },\n { value: Integration.react, label: 'React' },\n { value: Integration.reactRouter, label: 'React Router' },\n { value: Integration.svelte, label: 'Svelte' },\n { value: Integration.reactNative, label: 'React Native' },\n ],\n }),\n );\n\n return integration;\n}\n"]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import type { CloudRegion } from '../../utils/types';
|
|
1
2
|
export type MCPServerConfig = Record<string, unknown>;
|
|
2
3
|
export declare abstract class MCPClient {
|
|
3
4
|
name: string;
|
|
4
5
|
abstract getConfigPath(): Promise<string>;
|
|
5
6
|
abstract getServerPropertyName(): string;
|
|
6
7
|
abstract isServerInstalled(local?: boolean): Promise<boolean>;
|
|
7
|
-
abstract addServer(apiKey
|
|
8
|
+
abstract addServer(apiKey?: string, selectedFeatures?: string[], local?: boolean, region?: CloudRegion): Promise<{
|
|
8
9
|
success: boolean;
|
|
9
10
|
}>;
|
|
10
11
|
abstract removeServer(local?: boolean): Promise<{
|
|
@@ -16,12 +17,12 @@ export declare abstract class DefaultMCPClient extends MCPClient {
|
|
|
16
17
|
name: string;
|
|
17
18
|
constructor();
|
|
18
19
|
getServerPropertyName(): string;
|
|
19
|
-
getServerConfig(apiKey: string, type: 'sse' | 'streamable-http', selectedFeatures?: string[], local?: boolean): MCPServerConfig;
|
|
20
|
+
getServerConfig(apiKey: string | undefined, type: 'sse' | 'streamable-http', selectedFeatures?: string[], local?: boolean, region?: CloudRegion): MCPServerConfig;
|
|
20
21
|
isServerInstalled(local?: boolean): Promise<boolean>;
|
|
21
|
-
addServer(apiKey
|
|
22
|
+
addServer(apiKey?: string, selectedFeatures?: string[], local?: boolean, region?: CloudRegion): Promise<{
|
|
22
23
|
success: boolean;
|
|
23
24
|
}>;
|
|
24
|
-
_addServerType(apiKey: string, type: 'sse' | 'streamable-http', selectedFeatures?: string[], local?: boolean): Promise<{
|
|
25
|
+
_addServerType(apiKey: string | undefined, type: 'sse' | 'streamable-http', selectedFeatures?: string[], local?: boolean, region?: CloudRegion): Promise<{
|
|
25
26
|
success: boolean;
|
|
26
27
|
}>;
|
|
27
28
|
removeServer(local?: boolean): Promise<{
|
|
@@ -50,8 +50,8 @@ class DefaultMCPClient extends MCPClient {
|
|
|
50
50
|
getServerPropertyName() {
|
|
51
51
|
return 'mcpServers';
|
|
52
52
|
}
|
|
53
|
-
getServerConfig(apiKey, type, selectedFeatures, local) {
|
|
54
|
-
return (0, defaults_1.getDefaultServerConfig)(apiKey, type, selectedFeatures, local);
|
|
53
|
+
getServerConfig(apiKey, type, selectedFeatures, local, region) {
|
|
54
|
+
return (0, defaults_1.getDefaultServerConfig)(apiKey, type, selectedFeatures, local, region);
|
|
55
55
|
}
|
|
56
56
|
async isServerInstalled(local) {
|
|
57
57
|
try {
|
|
@@ -69,10 +69,10 @@ class DefaultMCPClient extends MCPClient {
|
|
|
69
69
|
return false;
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
|
-
async addServer(apiKey, selectedFeatures, local) {
|
|
73
|
-
return this._addServerType(apiKey, 'sse', selectedFeatures, local);
|
|
72
|
+
async addServer(apiKey, selectedFeatures, local, region) {
|
|
73
|
+
return this._addServerType(apiKey, 'sse', selectedFeatures, local, region);
|
|
74
74
|
}
|
|
75
|
-
async _addServerType(apiKey, type, selectedFeatures, local) {
|
|
75
|
+
async _addServerType(apiKey, type, selectedFeatures, local, region) {
|
|
76
76
|
try {
|
|
77
77
|
const configPath = await this.getConfigPath();
|
|
78
78
|
const configDir = path.dirname(configPath);
|
|
@@ -84,7 +84,7 @@ class DefaultMCPClient extends MCPClient {
|
|
|
84
84
|
configContent = await fs.promises.readFile(configPath, 'utf8');
|
|
85
85
|
existingConfig = jsonc.parse(configContent) || {};
|
|
86
86
|
}
|
|
87
|
-
const newServerConfig = this.getServerConfig(apiKey, type, selectedFeatures, local);
|
|
87
|
+
const newServerConfig = this.getServerConfig(apiKey, type, selectedFeatures, local, region);
|
|
88
88
|
const typedConfig = existingConfig;
|
|
89
89
|
if (!typedConfig[serverPropertyName]) {
|
|
90
90
|
typedConfig[serverPropertyName] = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MCPClient.js","sourceRoot":"","sources":["../../../../src/steps/add-mcp-server-to-clients/MCPClient.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,oDAAsC;AACtC,yCAAoD;
|
|
1
|
+
{"version":3,"file":"MCPClient.js","sourceRoot":"","sources":["../../../../src/steps/add-mcp-server-to-clients/MCPClient.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as jsonc from 'jsonc-parser';\nimport { getDefaultServerConfig } from './defaults';\nimport type { CloudRegion } from '../../utils/types';\n\nexport type MCPServerConfig = Record<string, unknown>;\n\nexport abstract class MCPClient {\n name: string;\n abstract getConfigPath(): Promise<string>;\n abstract getServerPropertyName(): string;\n abstract isServerInstalled(local?: boolean): Promise<boolean>;\n abstract addServer(\n apiKey?: string,\n selectedFeatures?: string[],\n local?: boolean,\n region?: CloudRegion,\n ): Promise<{ success: boolean }>;\n abstract removeServer(local?: boolean): Promise<{ success: boolean }>;\n abstract isClientSupported(): Promise<boolean>;\n}\n\nexport abstract class DefaultMCPClient extends MCPClient {\n name = 'Default';\n\n constructor() {\n super();\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(\n apiKey: string | undefined,\n type: 'sse' | 'streamable-http',\n selectedFeatures?: string[],\n local?: boolean,\n region?: CloudRegion,\n ): MCPServerConfig {\n return getDefaultServerConfig(\n apiKey,\n type,\n selectedFeatures,\n local,\n region,\n );\n }\n\n async isServerInstalled(local?: boolean): Promise<boolean> {\n try {\n const configPath = await this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return false;\n }\n\n const configContent = await fs.promises.readFile(configPath, 'utf8');\n const config = jsonc.parse(configContent) as Record<string, any>;\n const serverPropertyName = this.getServerPropertyName();\n const serverName = local ? 'posthog-local' : 'posthog';\n\n return (\n serverPropertyName in config && serverName in config[serverPropertyName]\n );\n } catch {\n return false;\n }\n }\n\n async addServer(\n apiKey?: string,\n selectedFeatures?: string[],\n local?: boolean,\n region?: CloudRegion,\n ): Promise<{ success: boolean }> {\n return this._addServerType(apiKey, 'sse', selectedFeatures, local, region);\n }\n\n async _addServerType(\n apiKey: string | undefined,\n type: 'sse' | 'streamable-http',\n selectedFeatures?: string[],\n local?: boolean,\n region?: CloudRegion,\n ): Promise<{ success: boolean }> {\n try {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n await fs.promises.mkdir(configDir, { recursive: true });\n\n const serverPropertyName = this.getServerPropertyName();\n let configContent = '';\n let existingConfig = {};\n\n if (fs.existsSync(configPath)) {\n configContent = await fs.promises.readFile(configPath, 'utf8');\n existingConfig = jsonc.parse(configContent) || {};\n }\n\n const newServerConfig = this.getServerConfig(\n apiKey,\n type,\n selectedFeatures,\n local,\n region,\n );\n const typedConfig = existingConfig as Record<string, any>;\n if (!typedConfig[serverPropertyName]) {\n typedConfig[serverPropertyName] = {};\n }\n const serverName = local ? 'posthog-local' : 'posthog';\n typedConfig[serverPropertyName][serverName] = newServerConfig;\n\n const edits = jsonc.modify(\n configContent,\n [serverPropertyName, serverName],\n newServerConfig,\n {\n formattingOptions: {\n tabSize: 2,\n insertSpaces: true,\n },\n },\n );\n\n const modifiedContent = jsonc.applyEdits(configContent, edits);\n\n await fs.promises.writeFile(configPath, modifiedContent, 'utf8');\n\n return { success: true };\n } catch {\n return { success: false };\n }\n }\n\n async removeServer(local?: boolean): Promise<{ success: boolean }> {\n try {\n const configPath = await this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return { success: false };\n }\n\n const configContent = await fs.promises.readFile(configPath, 'utf8');\n const config = jsonc.parse(configContent) as Record<string, any>;\n const serverPropertyName = this.getServerPropertyName();\n\n const serverName = local ? 'posthog-local' : 'posthog';\n\n if (\n serverPropertyName in config &&\n serverName in config[serverPropertyName]\n ) {\n const edits = jsonc.modify(\n configContent,\n [serverPropertyName, serverName],\n undefined,\n {\n formattingOptions: {\n tabSize: 2,\n insertSpaces: true,\n },\n },\n );\n\n const modifiedContent = jsonc.applyEdits(configContent, edits);\n\n await fs.promises.writeFile(configPath, modifiedContent, 'utf8');\n\n return { success: true };\n }\n } catch {\n //\n }\n\n return { success: false };\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const defaults_1 = require("../defaults");
|
|
4
|
+
describe('defaults', () => {
|
|
5
|
+
describe('buildMCPUrl', () => {
|
|
6
|
+
it('should build base URL for streamable-http type', () => {
|
|
7
|
+
const url = (0, defaults_1.buildMCPUrl)('streamable-http');
|
|
8
|
+
expect(url).toBe('https://mcp.posthog.com/mcp');
|
|
9
|
+
});
|
|
10
|
+
it('should build base URL for sse type', () => {
|
|
11
|
+
const url = (0, defaults_1.buildMCPUrl)('sse');
|
|
12
|
+
expect(url).toBe('https://mcp.posthog.com/sse');
|
|
13
|
+
});
|
|
14
|
+
it('should use localhost for local mode', () => {
|
|
15
|
+
const url = (0, defaults_1.buildMCPUrl)('streamable-http', undefined, true);
|
|
16
|
+
expect(url).toBe('http://localhost:8787/mcp');
|
|
17
|
+
});
|
|
18
|
+
it('should add features param when not all features selected', () => {
|
|
19
|
+
const url = (0, defaults_1.buildMCPUrl)('streamable-http', ['dashboards', 'insights']);
|
|
20
|
+
expect(url).toBe('https://mcp.posthog.com/mcp?features=dashboards,insights');
|
|
21
|
+
});
|
|
22
|
+
it('should add region param for EU region', () => {
|
|
23
|
+
const url = (0, defaults_1.buildMCPUrl)('streamable-http', undefined, false, 'eu');
|
|
24
|
+
expect(url).toBe('https://mcp.posthog.com/mcp?region=eu');
|
|
25
|
+
});
|
|
26
|
+
it('should not add region param for US region (default)', () => {
|
|
27
|
+
const url = (0, defaults_1.buildMCPUrl)('streamable-http', undefined, false, 'us');
|
|
28
|
+
expect(url).toBe('https://mcp.posthog.com/mcp');
|
|
29
|
+
});
|
|
30
|
+
it('should not add region param in local mode', () => {
|
|
31
|
+
const url = (0, defaults_1.buildMCPUrl)('streamable-http', undefined, true, 'eu');
|
|
32
|
+
expect(url).toBe('http://localhost:8787/mcp');
|
|
33
|
+
});
|
|
34
|
+
it('should combine features and region params', () => {
|
|
35
|
+
const url = (0, defaults_1.buildMCPUrl)('streamable-http', ['dashboards'], false, 'eu');
|
|
36
|
+
expect(url).toBe('https://mcp.posthog.com/mcp?features=dashboards®ion=eu');
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
describe('getDefaultServerConfig', () => {
|
|
40
|
+
it('should return config with auth header when API key provided', () => {
|
|
41
|
+
const config = (0, defaults_1.getDefaultServerConfig)('phx_test123', 'sse');
|
|
42
|
+
expect(config).toEqual({
|
|
43
|
+
command: 'npx',
|
|
44
|
+
args: [
|
|
45
|
+
'-y',
|
|
46
|
+
'mcp-remote@latest',
|
|
47
|
+
'https://mcp.posthog.com/sse',
|
|
48
|
+
'--header',
|
|
49
|
+
'Authorization:${POSTHOG_AUTH_HEADER}',
|
|
50
|
+
],
|
|
51
|
+
env: {
|
|
52
|
+
POSTHOG_AUTH_HEADER: 'Bearer phx_test123',
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
it('should return config without auth header for OAuth mode (no API key)', () => {
|
|
57
|
+
const config = (0, defaults_1.getDefaultServerConfig)(undefined, 'sse');
|
|
58
|
+
expect(config).toEqual({
|
|
59
|
+
command: 'npx',
|
|
60
|
+
args: ['-y', 'mcp-remote@latest', 'https://mcp.posthog.com/sse'],
|
|
61
|
+
});
|
|
62
|
+
expect(config).not.toHaveProperty('env');
|
|
63
|
+
});
|
|
64
|
+
it('should include region in URL for EU users in OAuth mode', () => {
|
|
65
|
+
const config = (0, defaults_1.getDefaultServerConfig)(undefined, 'streamable-http', undefined, false, 'eu');
|
|
66
|
+
expect(config.args).toContain('https://mcp.posthog.com/mcp?region=eu');
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe('getNativeHTTPServerConfig', () => {
|
|
70
|
+
it('should return config with headers when API key provided', () => {
|
|
71
|
+
const config = (0, defaults_1.getNativeHTTPServerConfig)('phx_test123', 'streamable-http');
|
|
72
|
+
expect(config).toEqual({
|
|
73
|
+
url: 'https://mcp.posthog.com/mcp',
|
|
74
|
+
headers: {
|
|
75
|
+
Authorization: 'Bearer phx_test123',
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
it('should return config without headers for OAuth mode (no API key)', () => {
|
|
80
|
+
const config = (0, defaults_1.getNativeHTTPServerConfig)(undefined, 'streamable-http');
|
|
81
|
+
expect(config).toEqual({
|
|
82
|
+
url: 'https://mcp.posthog.com/mcp',
|
|
83
|
+
});
|
|
84
|
+
expect(config).not.toHaveProperty('headers');
|
|
85
|
+
});
|
|
86
|
+
it('should include region in URL for EU users', () => {
|
|
87
|
+
const config = (0, defaults_1.getNativeHTTPServerConfig)(undefined, 'streamable-http', undefined, false, 'eu');
|
|
88
|
+
expect(config.url).toBe('https://mcp.posthog.com/mcp?region=eu');
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
//# sourceMappingURL=defaults.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.test.js","sourceRoot":"","sources":["../../../../../src/steps/add-mcp-server-to-clients/__tests__/defaults.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n buildMCPUrl,\n getDefaultServerConfig,\n getNativeHTTPServerConfig,\n} from '../defaults';\n\ndescribe('defaults', () => {\n describe('buildMCPUrl', () => {\n it('should build base URL for streamable-http type', () => {\n const url = buildMCPUrl('streamable-http');\n expect(url).toBe('https://mcp.posthog.com/mcp');\n });\n\n it('should build base URL for sse type', () => {\n const url = buildMCPUrl('sse');\n expect(url).toBe('https://mcp.posthog.com/sse');\n });\n\n it('should use localhost for local mode', () => {\n const url = buildMCPUrl('streamable-http', undefined, true);\n expect(url).toBe('http://localhost:8787/mcp');\n });\n\n it('should add features param when not all features selected', () => {\n const url = buildMCPUrl('streamable-http', ['dashboards', 'insights']);\n expect(url).toBe(\n 'https://mcp.posthog.com/mcp?features=dashboards,insights',\n );\n });\n\n it('should add region param for EU region', () => {\n const url = buildMCPUrl('streamable-http', undefined, false, 'eu');\n expect(url).toBe('https://mcp.posthog.com/mcp?region=eu');\n });\n\n it('should not add region param for US region (default)', () => {\n const url = buildMCPUrl('streamable-http', undefined, false, 'us');\n expect(url).toBe('https://mcp.posthog.com/mcp');\n });\n\n it('should not add region param in local mode', () => {\n const url = buildMCPUrl('streamable-http', undefined, true, 'eu');\n expect(url).toBe('http://localhost:8787/mcp');\n });\n\n it('should combine features and region params', () => {\n const url = buildMCPUrl('streamable-http', ['dashboards'], false, 'eu');\n expect(url).toBe(\n 'https://mcp.posthog.com/mcp?features=dashboards®ion=eu',\n );\n });\n });\n\n describe('getDefaultServerConfig', () => {\n it('should return config with auth header when API key provided', () => {\n const config = getDefaultServerConfig('phx_test123', 'sse');\n expect(config).toEqual({\n command: 'npx',\n args: [\n '-y',\n 'mcp-remote@latest',\n 'https://mcp.posthog.com/sse',\n '--header',\n 'Authorization:${POSTHOG_AUTH_HEADER}',\n ],\n env: {\n POSTHOG_AUTH_HEADER: 'Bearer phx_test123',\n },\n });\n });\n\n it('should return config without auth header for OAuth mode (no API key)', () => {\n const config = getDefaultServerConfig(undefined, 'sse');\n expect(config).toEqual({\n command: 'npx',\n args: ['-y', 'mcp-remote@latest', 'https://mcp.posthog.com/sse'],\n });\n expect(config).not.toHaveProperty('env');\n });\n\n it('should include region in URL for EU users in OAuth mode', () => {\n const config = getDefaultServerConfig(\n undefined,\n 'streamable-http',\n undefined,\n false,\n 'eu',\n );\n expect(config.args).toContain('https://mcp.posthog.com/mcp?region=eu');\n });\n });\n\n describe('getNativeHTTPServerConfig', () => {\n it('should return config with headers when API key provided', () => {\n const config = getNativeHTTPServerConfig(\n 'phx_test123',\n 'streamable-http',\n );\n expect(config).toEqual({\n url: 'https://mcp.posthog.com/mcp',\n headers: {\n Authorization: 'Bearer phx_test123',\n },\n });\n });\n\n it('should return config without headers for OAuth mode (no API key)', () => {\n const config = getNativeHTTPServerConfig(undefined, 'streamable-http');\n expect(config).toEqual({\n url: 'https://mcp.posthog.com/mcp',\n });\n expect(config).not.toHaveProperty('headers');\n });\n\n it('should include region in URL for EU users', () => {\n const config = getNativeHTTPServerConfig(\n undefined,\n 'streamable-http',\n undefined,\n false,\n 'eu',\n );\n expect(config.url).toBe('https://mcp.posthog.com/mcp?region=eu');\n });\n });\n});\n"]}
|
|
@@ -268,7 +268,17 @@ describe('ClaudeMCPClient', () => {
|
|
|
268
268
|
it('should call getDefaultServerConfig with the provided API key', async () => {
|
|
269
269
|
existsSyncMock.mockReturnValue(false);
|
|
270
270
|
await client.addServer(mockApiKey);
|
|
271
|
-
expect(getDefaultServerConfigMock).toHaveBeenCalledWith(mockApiKey, 'sse', undefined, undefined);
|
|
271
|
+
expect(getDefaultServerConfigMock).toHaveBeenCalledWith(mockApiKey, 'sse', undefined, undefined, undefined);
|
|
272
|
+
});
|
|
273
|
+
it('should call getDefaultServerConfig with undefined API key for OAuth mode', async () => {
|
|
274
|
+
existsSyncMock.mockReturnValue(false);
|
|
275
|
+
await client.addServer(undefined);
|
|
276
|
+
expect(getDefaultServerConfigMock).toHaveBeenCalledWith(undefined, 'sse', undefined, undefined, undefined);
|
|
277
|
+
});
|
|
278
|
+
it('should pass region parameter to getDefaultServerConfig', async () => {
|
|
279
|
+
existsSyncMock.mockReturnValue(false);
|
|
280
|
+
await client.addServer(mockApiKey, undefined, undefined, 'eu');
|
|
281
|
+
expect(getDefaultServerConfigMock).toHaveBeenCalledWith(mockApiKey, 'sse', undefined, undefined, 'eu');
|
|
272
282
|
});
|
|
273
283
|
});
|
|
274
284
|
describe('removeServer', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.test.js","sourceRoot":"","sources":["../../../../../../src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.ts"],"names":[],"mappings":"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","sourcesContent":["// We use the ClaudeMCPClient as a reference to test the DefaultMCPClient\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { ClaudeMCPClient } from '../claude';\nimport { getDefaultServerConfig } from '../../defaults';\n\njest.mock('fs', () => ({\n promises: {\n mkdir: jest.fn(),\n readFile: jest.fn(),\n writeFile: jest.fn(),\n },\n existsSync: jest.fn(),\n}));\n\njest.mock('os', () => ({\n homedir: jest.fn(),\n}));\n\njest.mock('../../defaults', () => ({\n DefaultMCPClientConfig: {\n parse: jest.fn(),\n },\n getDefaultServerConfig: jest.fn(),\n}));\n\ndescribe('ClaudeMCPClient', () => {\n let client: ClaudeMCPClient;\n const mockHomeDir = '/mock/home';\n const mockApiKey = 'test-api-key';\n const mockServerConfig = {\n command: 'npx',\n args: ['-y', 'mcp-remote@latest'],\n env: { POSTHOG_AUTH_HEADER: `Bearer ${mockApiKey}` },\n };\n\n const mkdirMock = fs.promises.mkdir as jest.Mock;\n const readFileMock = fs.promises.readFile as jest.Mock;\n const writeFileMock = fs.promises.writeFile as jest.Mock;\n const existsSyncMock = fs.existsSync as jest.Mock;\n const homedirMock = os.homedir as jest.Mock;\n const getDefaultServerConfigMock = getDefaultServerConfig as jest.Mock;\n\n const originalPlatform = process.platform;\n\n beforeEach(() => {\n client = new ClaudeMCPClient();\n jest.clearAllMocks();\n homedirMock.mockReturnValue(mockHomeDir);\n getDefaultServerConfigMock.mockReturnValue(mockServerConfig);\n\n // Mock the Zod schema parse method\n const { DefaultMCPClientConfig } = require('../../defaults');\n DefaultMCPClientConfig.parse.mockImplementation((data: any) => data);\n });\n\n afterEach(() => {\n Object.defineProperty(process, 'platform', {\n value: originalPlatform,\n writable: true,\n });\n });\n\n describe('constructor', () => {\n it('should set the correct name', () => {\n expect(client.name).toBe('Claude Desktop');\n });\n });\n\n describe('isClientSupported', () => {\n it('should return true for macOS', async () => {\n Object.defineProperty(process, 'platform', {\n value: 'darwin',\n writable: true,\n });\n await expect(client.isClientSupported()).resolves.toBe(true);\n });\n\n it('should return true for Windows', async () => {\n Object.defineProperty(process, 'platform', {\n value: 'win32',\n writable: true,\n });\n await expect(client.isClientSupported()).resolves.toBe(true);\n });\n\n it('should return false for Linux', async () => {\n Object.defineProperty(process, 'platform', {\n value: 'linux',\n writable: true,\n });\n await expect(client.isClientSupported()).resolves.toBe(false);\n });\n\n it('should return false for other platforms', async () => {\n Object.defineProperty(process, 'platform', {\n value: 'freebsd',\n writable: true,\n });\n await expect(client.isClientSupported()).resolves.toBe(false);\n });\n });\n\n describe('getConfigPath', () => {\n it('should return correct path for macOS', async () => {\n Object.defineProperty(process, 'platform', {\n value: 'darwin',\n writable: true,\n });\n\n const configPath = await client.getConfigPath();\n expect(configPath).toBe(\n path.join(\n mockHomeDir,\n 'Library',\n 'Application Support',\n 'Claude',\n 'claude_desktop_config.json',\n ),\n );\n });\n\n it('should return correct path for Windows', async () => {\n Object.defineProperty(process, 'platform', {\n value: 'win32',\n writable: true,\n });\n\n const mockAppData = 'C:\\\\Users\\\\Test\\\\AppData\\\\Roaming';\n process.env.APPDATA = mockAppData;\n\n const configPath = await client.getConfigPath();\n expect(configPath).toBe(\n path.join(mockAppData, 'Claude', 'claude_desktop_config.json'),\n );\n });\n\n it('should throw error for unsupported platform', async () => {\n Object.defineProperty(process, 'platform', {\n value: 'linux',\n writable: true,\n });\n\n await expect(client.getConfigPath()).rejects.toThrow(\n 'Unsupported platform: linux',\n );\n });\n });\n\n describe('isServerInstalled', () => {\n beforeEach(() => {\n Object.defineProperty(process, 'platform', {\n value: 'darwin',\n writable: true,\n });\n });\n\n it('should return false when config file does not exist', async () => {\n existsSyncMock.mockReturnValue(false);\n\n const result = await client.isServerInstalled();\n expect(result).toBe(false);\n });\n\n it('should return false when config file exists but posthog server is not configured', async () => {\n existsSyncMock.mockReturnValue(true);\n const configData = {\n mcpServers: {\n otherServer: mockServerConfig,\n },\n };\n readFileMock.mockResolvedValue(JSON.stringify(configData));\n\n const result = await client.isServerInstalled();\n expect(result).toBe(false);\n });\n\n it('should return true when posthog server is configured', async () => {\n existsSyncMock.mockReturnValue(true);\n const configData = {\n mcpServers: {\n posthog: mockServerConfig,\n otherServer: mockServerConfig,\n },\n };\n readFileMock.mockResolvedValue(JSON.stringify(configData));\n\n const result = await client.isServerInstalled();\n expect(result).toBe(true);\n });\n\n it('should return false when config file is invalid JSON', async () => {\n existsSyncMock.mockReturnValue(true);\n readFileMock.mockResolvedValue('invalid json');\n\n const result = await client.isServerInstalled();\n expect(result).toBe(false);\n });\n\n it('should return false when readFile throws an error', async () => {\n existsSyncMock.mockReturnValue(true);\n readFileMock.mockRejectedValue(new Error('File read error'));\n\n const result = await client.isServerInstalled();\n expect(result).toBe(false);\n });\n });\n\n describe('addServer', () => {\n beforeEach(() => {\n Object.defineProperty(process, 'platform', {\n value: 'darwin',\n writable: true,\n });\n });\n\n it('should create config directory and add server when config file does not exist', async () => {\n existsSyncMock.mockReturnValue(false);\n\n await client.addServer(mockApiKey);\n\n const expectedConfigPath = path.join(\n mockHomeDir,\n 'Library',\n 'Application Support',\n 'Claude',\n 'claude_desktop_config.json',\n );\n const expectedConfigDir = path.dirname(expectedConfigPath);\n\n expect(mkdirMock).toHaveBeenCalledWith(expectedConfigDir, {\n recursive: true,\n });\n\n expect(writeFileMock).toHaveBeenCalledWith(\n expectedConfigPath,\n JSON.stringify(\n {\n mcpServers: {\n posthog: mockServerConfig,\n },\n },\n null,\n 2,\n ),\n 'utf8',\n );\n });\n\n it('should merge with existing config when config file exists', async () => {\n existsSyncMock.mockReturnValue(true);\n const existingConfig = {\n mcpServers: {\n existingServer: {\n command: 'existing',\n args: [],\n env: {},\n },\n },\n };\n readFileMock.mockResolvedValue(JSON.stringify(existingConfig));\n\n await client.addServer(mockApiKey);\n\n expect(writeFileMock).toHaveBeenCalledWith(\n expect.any(String),\n JSON.stringify(\n {\n mcpServers: {\n existingServer: existingConfig.mcpServers.existingServer,\n posthog: mockServerConfig,\n },\n },\n null,\n 2,\n ),\n 'utf8',\n );\n });\n\n it('should not overwrite existing config when it is invalid', async () => {\n existsSyncMock.mockReturnValue(true);\n readFileMock.mockResolvedValue(\n JSON.stringify({\n invalidKey: {\n existingServer: {\n command: 'existing',\n args: [],\n env: {},\n },\n },\n x: 'y',\n }),\n );\n\n await client.addServer(mockApiKey);\n\n expect(writeFileMock).toHaveBeenCalledWith(\n expect.any(String),\n JSON.stringify(\n {\n invalidKey: {\n existingServer: {\n command: 'existing',\n args: [],\n env: {},\n },\n },\n x: 'y',\n mcpServers: {\n posthog: mockServerConfig,\n },\n },\n null,\n 2,\n ),\n 'utf8',\n );\n });\n\n it('should call getDefaultServerConfig with the provided API key', async () => {\n existsSyncMock.mockReturnValue(false);\n\n await client.addServer(mockApiKey);\n\n expect(getDefaultServerConfigMock).toHaveBeenCalledWith(\n mockApiKey,\n 'sse',\n undefined,\n undefined,\n );\n });\n });\n\n describe('removeServer', () => {\n beforeEach(() => {\n Object.defineProperty(process, 'platform', {\n value: 'darwin',\n writable: true,\n });\n });\n\n it('should do nothing when config file does not exist', async () => {\n existsSyncMock.mockReturnValue(false);\n\n await client.removeServer();\n\n expect(readFileMock).not.toHaveBeenCalled();\n expect(writeFileMock).not.toHaveBeenCalled();\n });\n\n it('should remove posthog server from config', async () => {\n existsSyncMock.mockReturnValue(true);\n const configWithPosthog = {\n mcpServers: {\n posthog: mockServerConfig,\n otherServer: {\n command: 'other',\n args: [],\n env: {},\n },\n },\n };\n readFileMock.mockResolvedValue(JSON.stringify(configWithPosthog));\n\n await client.removeServer();\n\n expect(writeFileMock).toHaveBeenCalledWith(\n expect.any(String),\n JSON.stringify(\n {\n mcpServers: {\n otherServer: configWithPosthog.mcpServers.otherServer,\n },\n },\n null,\n 2,\n ),\n 'utf8',\n );\n });\n\n it('should do nothing when posthog server is not in config', async () => {\n existsSyncMock.mockReturnValue(true);\n const configWithoutPosthog = {\n mcpServers: {\n otherServer: {\n command: 'other',\n args: [],\n env: {},\n },\n },\n };\n readFileMock.mockResolvedValue(JSON.stringify(configWithoutPosthog));\n\n await client.removeServer();\n\n expect(writeFileMock).not.toHaveBeenCalled();\n });\n\n it('should handle invalid JSON gracefully', async () => {\n existsSyncMock.mockReturnValue(true);\n readFileMock.mockResolvedValue('invalid json');\n\n await client.removeServer();\n\n expect(writeFileMock).not.toHaveBeenCalled();\n });\n\n it('should handle file read errors gracefully', async () => {\n existsSyncMock.mockReturnValue(true);\n readFileMock.mockRejectedValue(new Error('File read error'));\n\n await client.removeServer();\n\n expect(writeFileMock).not.toHaveBeenCalled();\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"claude.test.js","sourceRoot":"","sources":["../../../../../../src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.ts"],"names":[],"mappings":"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","sourcesContent":["// We use the ClaudeMCPClient as a reference to test the DefaultMCPClient\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { ClaudeMCPClient } from '../claude';\nimport { getDefaultServerConfig } from '../../defaults';\n\njest.mock('fs', () => ({\n promises: {\n mkdir: jest.fn(),\n readFile: jest.fn(),\n writeFile: jest.fn(),\n },\n existsSync: jest.fn(),\n}));\n\njest.mock('os', () => ({\n homedir: jest.fn(),\n}));\n\njest.mock('../../defaults', () => ({\n DefaultMCPClientConfig: {\n parse: jest.fn(),\n },\n getDefaultServerConfig: jest.fn(),\n}));\n\ndescribe('ClaudeMCPClient', () => {\n let client: ClaudeMCPClient;\n const mockHomeDir = '/mock/home';\n const mockApiKey = 'test-api-key';\n const mockServerConfig = {\n command: 'npx',\n args: ['-y', 'mcp-remote@latest'],\n env: { POSTHOG_AUTH_HEADER: `Bearer ${mockApiKey}` },\n };\n\n const mkdirMock = fs.promises.mkdir as jest.Mock;\n const readFileMock = fs.promises.readFile as jest.Mock;\n const writeFileMock = fs.promises.writeFile as jest.Mock;\n const existsSyncMock = fs.existsSync as jest.Mock;\n const homedirMock = os.homedir as jest.Mock;\n const getDefaultServerConfigMock = getDefaultServerConfig as jest.Mock;\n\n const originalPlatform = process.platform;\n\n beforeEach(() => {\n client = new ClaudeMCPClient();\n jest.clearAllMocks();\n homedirMock.mockReturnValue(mockHomeDir);\n getDefaultServerConfigMock.mockReturnValue(mockServerConfig);\n\n // Mock the Zod schema parse method\n const { DefaultMCPClientConfig } = require('../../defaults');\n DefaultMCPClientConfig.parse.mockImplementation((data: any) => data);\n });\n\n afterEach(() => {\n Object.defineProperty(process, 'platform', {\n value: originalPlatform,\n writable: true,\n });\n });\n\n describe('constructor', () => {\n it('should set the correct name', () => {\n expect(client.name).toBe('Claude Desktop');\n });\n });\n\n describe('isClientSupported', () => {\n it('should return true for macOS', async () => {\n Object.defineProperty(process, 'platform', {\n value: 'darwin',\n writable: true,\n });\n await expect(client.isClientSupported()).resolves.toBe(true);\n });\n\n it('should return true for Windows', async () => {\n Object.defineProperty(process, 'platform', {\n value: 'win32',\n writable: true,\n });\n await expect(client.isClientSupported()).resolves.toBe(true);\n });\n\n it('should return false for Linux', async () => {\n Object.defineProperty(process, 'platform', {\n value: 'linux',\n writable: true,\n });\n await expect(client.isClientSupported()).resolves.toBe(false);\n });\n\n it('should return false for other platforms', async () => {\n Object.defineProperty(process, 'platform', {\n value: 'freebsd',\n writable: true,\n });\n await expect(client.isClientSupported()).resolves.toBe(false);\n });\n });\n\n describe('getConfigPath', () => {\n it('should return correct path for macOS', async () => {\n Object.defineProperty(process, 'platform', {\n value: 'darwin',\n writable: true,\n });\n\n const configPath = await client.getConfigPath();\n expect(configPath).toBe(\n path.join(\n mockHomeDir,\n 'Library',\n 'Application Support',\n 'Claude',\n 'claude_desktop_config.json',\n ),\n );\n });\n\n it('should return correct path for Windows', async () => {\n Object.defineProperty(process, 'platform', {\n value: 'win32',\n writable: true,\n });\n\n const mockAppData = 'C:\\\\Users\\\\Test\\\\AppData\\\\Roaming';\n process.env.APPDATA = mockAppData;\n\n const configPath = await client.getConfigPath();\n expect(configPath).toBe(\n path.join(mockAppData, 'Claude', 'claude_desktop_config.json'),\n );\n });\n\n it('should throw error for unsupported platform', async () => {\n Object.defineProperty(process, 'platform', {\n value: 'linux',\n writable: true,\n });\n\n await expect(client.getConfigPath()).rejects.toThrow(\n 'Unsupported platform: linux',\n );\n });\n });\n\n describe('isServerInstalled', () => {\n beforeEach(() => {\n Object.defineProperty(process, 'platform', {\n value: 'darwin',\n writable: true,\n });\n });\n\n it('should return false when config file does not exist', async () => {\n existsSyncMock.mockReturnValue(false);\n\n const result = await client.isServerInstalled();\n expect(result).toBe(false);\n });\n\n it('should return false when config file exists but posthog server is not configured', async () => {\n existsSyncMock.mockReturnValue(true);\n const configData = {\n mcpServers: {\n otherServer: mockServerConfig,\n },\n };\n readFileMock.mockResolvedValue(JSON.stringify(configData));\n\n const result = await client.isServerInstalled();\n expect(result).toBe(false);\n });\n\n it('should return true when posthog server is configured', async () => {\n existsSyncMock.mockReturnValue(true);\n const configData = {\n mcpServers: {\n posthog: mockServerConfig,\n otherServer: mockServerConfig,\n },\n };\n readFileMock.mockResolvedValue(JSON.stringify(configData));\n\n const result = await client.isServerInstalled();\n expect(result).toBe(true);\n });\n\n it('should return false when config file is invalid JSON', async () => {\n existsSyncMock.mockReturnValue(true);\n readFileMock.mockResolvedValue('invalid json');\n\n const result = await client.isServerInstalled();\n expect(result).toBe(false);\n });\n\n it('should return false when readFile throws an error', async () => {\n existsSyncMock.mockReturnValue(true);\n readFileMock.mockRejectedValue(new Error('File read error'));\n\n const result = await client.isServerInstalled();\n expect(result).toBe(false);\n });\n });\n\n describe('addServer', () => {\n beforeEach(() => {\n Object.defineProperty(process, 'platform', {\n value: 'darwin',\n writable: true,\n });\n });\n\n it('should create config directory and add server when config file does not exist', async () => {\n existsSyncMock.mockReturnValue(false);\n\n await client.addServer(mockApiKey);\n\n const expectedConfigPath = path.join(\n mockHomeDir,\n 'Library',\n 'Application Support',\n 'Claude',\n 'claude_desktop_config.json',\n );\n const expectedConfigDir = path.dirname(expectedConfigPath);\n\n expect(mkdirMock).toHaveBeenCalledWith(expectedConfigDir, {\n recursive: true,\n });\n\n expect(writeFileMock).toHaveBeenCalledWith(\n expectedConfigPath,\n JSON.stringify(\n {\n mcpServers: {\n posthog: mockServerConfig,\n },\n },\n null,\n 2,\n ),\n 'utf8',\n );\n });\n\n it('should merge with existing config when config file exists', async () => {\n existsSyncMock.mockReturnValue(true);\n const existingConfig = {\n mcpServers: {\n existingServer: {\n command: 'existing',\n args: [],\n env: {},\n },\n },\n };\n readFileMock.mockResolvedValue(JSON.stringify(existingConfig));\n\n await client.addServer(mockApiKey);\n\n expect(writeFileMock).toHaveBeenCalledWith(\n expect.any(String),\n JSON.stringify(\n {\n mcpServers: {\n existingServer: existingConfig.mcpServers.existingServer,\n posthog: mockServerConfig,\n },\n },\n null,\n 2,\n ),\n 'utf8',\n );\n });\n\n it('should not overwrite existing config when it is invalid', async () => {\n existsSyncMock.mockReturnValue(true);\n readFileMock.mockResolvedValue(\n JSON.stringify({\n invalidKey: {\n existingServer: {\n command: 'existing',\n args: [],\n env: {},\n },\n },\n x: 'y',\n }),\n );\n\n await client.addServer(mockApiKey);\n\n expect(writeFileMock).toHaveBeenCalledWith(\n expect.any(String),\n JSON.stringify(\n {\n invalidKey: {\n existingServer: {\n command: 'existing',\n args: [],\n env: {},\n },\n },\n x: 'y',\n mcpServers: {\n posthog: mockServerConfig,\n },\n },\n null,\n 2,\n ),\n 'utf8',\n );\n });\n\n it('should call getDefaultServerConfig with the provided API key', async () => {\n existsSyncMock.mockReturnValue(false);\n\n await client.addServer(mockApiKey);\n\n expect(getDefaultServerConfigMock).toHaveBeenCalledWith(\n mockApiKey,\n 'sse',\n undefined,\n undefined,\n undefined,\n );\n });\n\n it('should call getDefaultServerConfig with undefined API key for OAuth mode', async () => {\n existsSyncMock.mockReturnValue(false);\n\n await client.addServer(undefined);\n\n expect(getDefaultServerConfigMock).toHaveBeenCalledWith(\n undefined,\n 'sse',\n undefined,\n undefined,\n undefined,\n );\n });\n\n it('should pass region parameter to getDefaultServerConfig', async () => {\n existsSyncMock.mockReturnValue(false);\n\n await client.addServer(mockApiKey, undefined, undefined, 'eu');\n\n expect(getDefaultServerConfigMock).toHaveBeenCalledWith(\n mockApiKey,\n 'sse',\n undefined,\n undefined,\n 'eu',\n );\n });\n });\n\n describe('removeServer', () => {\n beforeEach(() => {\n Object.defineProperty(process, 'platform', {\n value: 'darwin',\n writable: true,\n });\n });\n\n it('should do nothing when config file does not exist', async () => {\n existsSyncMock.mockReturnValue(false);\n\n await client.removeServer();\n\n expect(readFileMock).not.toHaveBeenCalled();\n expect(writeFileMock).not.toHaveBeenCalled();\n });\n\n it('should remove posthog server from config', async () => {\n existsSyncMock.mockReturnValue(true);\n const configWithPosthog = {\n mcpServers: {\n posthog: mockServerConfig,\n otherServer: {\n command: 'other',\n args: [],\n env: {},\n },\n },\n };\n readFileMock.mockResolvedValue(JSON.stringify(configWithPosthog));\n\n await client.removeServer();\n\n expect(writeFileMock).toHaveBeenCalledWith(\n expect.any(String),\n JSON.stringify(\n {\n mcpServers: {\n otherServer: configWithPosthog.mcpServers.otherServer,\n },\n },\n null,\n 2,\n ),\n 'utf8',\n );\n });\n\n it('should do nothing when posthog server is not in config', async () => {\n existsSyncMock.mockReturnValue(true);\n const configWithoutPosthog = {\n mcpServers: {\n otherServer: {\n command: 'other',\n args: [],\n env: {},\n },\n },\n };\n readFileMock.mockResolvedValue(JSON.stringify(configWithoutPosthog));\n\n await client.removeServer();\n\n expect(writeFileMock).not.toHaveBeenCalled();\n });\n\n it('should handle invalid JSON gracefully', async () => {\n existsSyncMock.mockReturnValue(true);\n readFileMock.mockResolvedValue('invalid json');\n\n await client.removeServer();\n\n expect(writeFileMock).not.toHaveBeenCalled();\n });\n\n it('should handle file read errors gracefully', async () => {\n existsSyncMock.mockReturnValue(true);\n readFileMock.mockRejectedValue(new Error('File read error'));\n\n await client.removeServer();\n\n expect(writeFileMock).not.toHaveBeenCalled();\n });\n });\n});\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { DefaultMCPClient } from '../MCPClient';
|
|
2
2
|
import { DefaultMCPClientConfig } from '../defaults';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
+
import type { CloudRegion } from '../../../utils/types';
|
|
4
5
|
export declare const ClaudeCodeMCPConfig: z.ZodObject<{
|
|
5
6
|
mcpServers: z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodObject<{
|
|
6
7
|
command: z.ZodOptional<z.ZodString>;
|
|
@@ -80,7 +81,7 @@ export declare class ClaudeCodeMCPClient extends DefaultMCPClient {
|
|
|
80
81
|
isClientSupported(): Promise<boolean>;
|
|
81
82
|
isServerInstalled(local?: boolean): Promise<boolean>;
|
|
82
83
|
getConfigPath(): Promise<string>;
|
|
83
|
-
addServer(apiKey
|
|
84
|
+
addServer(apiKey?: string, selectedFeatures?: string[], local?: boolean, region?: CloudRegion): Promise<{
|
|
84
85
|
success: boolean;
|
|
85
86
|
}>;
|
|
86
87
|
removeServer(local?: boolean): Promise<{
|
|
@@ -124,14 +124,16 @@ class ClaudeCodeMCPClient extends MCPClient_1.DefaultMCPClient {
|
|
|
124
124
|
getConfigPath() {
|
|
125
125
|
throw new Error('Not implemented');
|
|
126
126
|
}
|
|
127
|
-
addServer(apiKey, selectedFeatures, local) {
|
|
127
|
+
addServer(apiKey, selectedFeatures, local, region) {
|
|
128
128
|
const claudeBinary = this.findClaudeBinary();
|
|
129
129
|
if (!claudeBinary) {
|
|
130
130
|
return Promise.resolve({ success: false });
|
|
131
131
|
}
|
|
132
132
|
const serverName = local ? 'posthog-local' : 'posthog';
|
|
133
|
-
const url = (0, defaults_1.buildMCPUrl)('streamable-http', selectedFeatures, local);
|
|
134
|
-
|
|
133
|
+
const url = (0, defaults_1.buildMCPUrl)('streamable-http', selectedFeatures, local, region);
|
|
134
|
+
// OAuth mode: no auth header
|
|
135
|
+
const authArgs = apiKey ? `--header "Authorization: Bearer ${apiKey}"` : '';
|
|
136
|
+
const command = `${claudeBinary} mcp add --transport http ${serverName} ${url} ${authArgs} -s user`.trim();
|
|
135
137
|
try {
|
|
136
138
|
(0, child_process_1.execSync)(command);
|
|
137
139
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../../../src/steps/add-mcp-server-to-clients/clients/claude-code.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAAgD;AAChD,0CAAkE;AAElE,iDAAyC;AACzC,wDAAqD;AACrD,gDAA6C;
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../../../src/steps/add-mcp-server-to-clients/clients/claude-code.ts"],"names":[],"mappings":"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","sourcesContent":["import { DefaultMCPClient } from '../MCPClient';\nimport { buildMCPUrl, DefaultMCPClientConfig } from '../defaults';\nimport { z } from 'zod';\nimport { execSync } from 'child_process';\nimport { analytics } from '../../../utils/analytics';\nimport { debug } from '../../../utils/debug';\nimport type { CloudRegion } from '../../../utils/types';\nimport * as os from 'os';\nimport * as path from 'path';\nimport * as fs from 'fs';\n\nexport const ClaudeCodeMCPConfig = DefaultMCPClientConfig;\n\nexport type ClaudeCodeMCPConfig = z.infer<typeof DefaultMCPClientConfig>;\n\nexport class ClaudeCodeMCPClient extends DefaultMCPClient {\n name = 'Claude Code';\n private claudeBinaryPath: string | null = null;\n\n constructor() {\n super();\n }\n\n private findClaudeBinary(): string | null {\n if (this.claudeBinaryPath) {\n return this.claudeBinaryPath;\n }\n\n // Common installation paths for Claude Code CLI\n const possiblePaths = [\n path.join(os.homedir(), '.claude', 'local', 'claude'),\n '/usr/local/bin/claude',\n '/opt/homebrew/bin/claude',\n ];\n\n for (const claudePath of possiblePaths) {\n if (fs.existsSync(claudePath)) {\n debug(` Found claude binary at: ${claudePath}`);\n this.claudeBinaryPath = claudePath;\n return claudePath;\n }\n }\n\n // Try PATH as fallback\n try {\n execSync('command -v claude', { stdio: 'pipe' });\n debug(' Found claude in PATH');\n this.claudeBinaryPath = 'claude';\n return 'claude';\n } catch {\n // Not in PATH\n }\n\n return null;\n }\n\n isClientSupported(): Promise<boolean> {\n try {\n debug(' Checking for Claude Code...');\n const claudeBinary = this.findClaudeBinary();\n\n if (!claudeBinary) {\n debug(' Claude Code not found. Installation paths checked:');\n debug(` - ${path.join(os.homedir(), '.claude', 'local', 'claude')}`);\n debug(` - /usr/local/bin/claude`);\n debug(` - /opt/homebrew/bin/claude`);\n debug(` - PATH`);\n return Promise.resolve(false);\n }\n\n const output = execSync(`${claudeBinary} --version`, { stdio: 'pipe' });\n const version = output.toString().trim();\n debug(` Claude Code detected: ${version}`);\n return Promise.resolve(true);\n } catch (error) {\n debug(\n ` Claude Code check failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n return Promise.resolve(false);\n }\n }\n\n isServerInstalled(local?: boolean): Promise<boolean> {\n try {\n const claudeBinary = this.findClaudeBinary();\n if (!claudeBinary) {\n return Promise.resolve(false);\n }\n\n // check if specific server name exists in output\n const output = execSync(`${claudeBinary} mcp list`, {\n stdio: 'pipe',\n });\n\n const outputStr = output.toString();\n const serverName = local ? 'posthog-local' : 'posthog';\n\n if (outputStr.includes(serverName)) {\n return Promise.resolve(true);\n }\n } catch {\n //\n }\n\n return Promise.resolve(false);\n }\n\n getConfigPath(): Promise<string> {\n throw new Error('Not implemented');\n }\n\n addServer(\n apiKey?: string,\n selectedFeatures?: string[],\n local?: boolean,\n region?: CloudRegion,\n ): Promise<{ success: boolean }> {\n const claudeBinary = this.findClaudeBinary();\n if (!claudeBinary) {\n return Promise.resolve({ success: false });\n }\n\n const serverName = local ? 'posthog-local' : 'posthog';\n const url = buildMCPUrl('streamable-http', selectedFeatures, local, region);\n\n // OAuth mode: no auth header\n const authArgs = apiKey ? `--header \"Authorization: Bearer ${apiKey}\"` : '';\n const command =\n `${claudeBinary} mcp add --transport http ${serverName} ${url} ${authArgs} -s user`.trim();\n\n try {\n execSync(command);\n } catch (error) {\n analytics.captureException(\n new Error(\n `Failed to add server to Claude Code: ${\n error instanceof Error ? error.message : String(error)\n }`,\n ),\n );\n return Promise.resolve({ success: false });\n }\n\n return Promise.resolve({ success: true });\n }\n\n removeServer(local?: boolean): Promise<{ success: boolean }> {\n const claudeBinary = this.findClaudeBinary();\n if (!claudeBinary) {\n return Promise.resolve({ success: false });\n }\n\n const serverName = local ? 'posthog-local' : 'posthog';\n const command = `${claudeBinary} mcp remove --scope user ${serverName}`;\n\n try {\n execSync(command);\n } catch (error) {\n analytics.captureException(\n new Error(\n `Failed to remove server from Claude Code: ${\n error instanceof Error ? error.message : String(error)\n }`,\n ),\n );\n return Promise.resolve({ success: false });\n }\n\n return Promise.resolve({ success: true });\n }\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { DefaultMCPClient } from '../MCPClient';
|
|
3
3
|
import { DefaultMCPClientConfig } from '../defaults';
|
|
4
|
+
import type { CloudRegion } from '../../../utils/types';
|
|
4
5
|
export declare const CodexMCPConfig: z.ZodObject<{
|
|
5
6
|
mcpServers: z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodObject<{
|
|
6
7
|
command: z.ZodOptional<z.ZodString>;
|
|
@@ -78,7 +79,7 @@ export declare class CodexMCPClient extends DefaultMCPClient {
|
|
|
78
79
|
isClientSupported(): Promise<boolean>;
|
|
79
80
|
getConfigPath(): Promise<string>;
|
|
80
81
|
isServerInstalled(local?: boolean): Promise<boolean>;
|
|
81
|
-
addServer(apiKey: string, selectedFeatures?: string[], local?: boolean): Promise<{
|
|
82
|
+
addServer(apiKey: string, selectedFeatures?: string[], local?: boolean, region?: CloudRegion): Promise<{
|
|
82
83
|
success: boolean;
|
|
83
84
|
}>;
|
|
84
85
|
removeServer(local?: boolean): Promise<{
|
|
@@ -43,8 +43,8 @@ class CodexMCPClient extends MCPClient_1.DefaultMCPClient {
|
|
|
43
43
|
return Promise.resolve(false);
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
-
addServer(apiKey, selectedFeatures, local) {
|
|
47
|
-
const config = (0, defaults_1.getDefaultServerConfig)(apiKey, 'sse', selectedFeatures, local);
|
|
46
|
+
addServer(apiKey, selectedFeatures, local, region) {
|
|
47
|
+
const config = (0, defaults_1.getDefaultServerConfig)(apiKey, 'sse', selectedFeatures, local, region);
|
|
48
48
|
const serverName = local ? 'posthog-local' : 'posthog';
|
|
49
49
|
const args = ['mcp', 'add', serverName];
|
|
50
50
|
if (config.env) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../../../src/steps/add-mcp-server-to-clients/clients/codex.ts"],"names":[],"mappings":";;;AACA,2DAAyD;AAEzD,4CAAgD;AAChD,0CAA6E;
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../../../src/steps/add-mcp-server-to-clients/clients/codex.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\nimport { execSync, spawnSync } from 'node:child_process';\n\nimport { DefaultMCPClient } from '../MCPClient';\nimport { DefaultMCPClientConfig, getDefaultServerConfig } from '../defaults';\nimport type { CloudRegion } from '../../../utils/types';\n\nimport { analytics } from '../../../utils/analytics';\n\nexport const CodexMCPConfig = DefaultMCPClientConfig;\n\nexport type CodexMCPConfig = z.infer<typeof DefaultMCPClientConfig>;\n\nexport class CodexMCPClient extends DefaultMCPClient {\n name = 'Codex CLI';\n\n constructor() {\n super();\n }\n\n isClientSupported(): Promise<boolean> {\n try {\n execSync('codex --version', { stdio: 'ignore' });\n return Promise.resolve(true);\n } catch {\n return Promise.resolve(false);\n }\n }\n\n getConfigPath(): Promise<string> {\n throw new Error('Not implemented');\n }\n\n isServerInstalled(local?: boolean): Promise<boolean> {\n const serverName = local ? 'posthog-local' : 'posthog';\n\n try {\n const result = spawnSync('codex', ['mcp', 'list', '--json'], {\n encoding: 'utf-8',\n });\n\n if (result.error || result.status !== 0) {\n return Promise.resolve(false);\n }\n\n const stdout = result.stdout?.trim();\n if (!stdout) {\n return Promise.resolve(false);\n }\n\n const servers = JSON.parse(stdout) as Array<{ name: string }>;\n return Promise.resolve(\n servers.some((server) => server.name === serverName),\n );\n } catch {\n return Promise.resolve(false);\n }\n }\n\n addServer(\n apiKey: string,\n selectedFeatures?: string[],\n local?: boolean,\n region?: CloudRegion,\n ): Promise<{ success: boolean }> {\n const config = getDefaultServerConfig(\n apiKey,\n 'sse',\n selectedFeatures,\n local,\n region,\n );\n const serverName = local ? 'posthog-local' : 'posthog';\n\n const args = ['mcp', 'add', serverName];\n\n if (config.env) {\n for (const [key, value] of Object.entries(config.env)) {\n args.push('--env', `${key}=${value}`);\n }\n }\n\n args.push('--', config.command, ...(config.args ?? []));\n\n const result = spawnSync('codex', args, { stdio: 'ignore' });\n\n if (result.error || result.status !== 0) {\n analytics.captureException(\n new Error('Failed to add server to Codex CLI.'),\n );\n return Promise.resolve({ success: false });\n }\n\n return Promise.resolve({ success: true });\n }\n\n removeServer(local?: boolean): Promise<{ success: boolean }> {\n const serverName = local ? 'posthog-local' : 'posthog';\n const result = spawnSync('codex', ['mcp', 'remove', serverName], {\n stdio: 'ignore',\n });\n\n if (result.error || result.status !== 0) {\n analytics.captureException(\n new Error('Failed to remove server from Codex CLI.'),\n );\n return Promise.resolve({ success: false });\n }\n\n return Promise.resolve({ success: true });\n }\n}\n\nexport default CodexMCPClient;\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { DefaultMCPClient, MCPServerConfig } from '../MCPClient';
|
|
2
2
|
import { DefaultMCPClientConfig } from '../defaults';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
+
import type { CloudRegion } from '../../../utils/types';
|
|
4
5
|
export declare const CursorMCPConfig: z.ZodObject<{
|
|
5
6
|
mcpServers: z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodObject<{
|
|
6
7
|
command: z.ZodOptional<z.ZodString>;
|
|
@@ -77,8 +78,8 @@ export declare class CursorMCPClient extends DefaultMCPClient {
|
|
|
77
78
|
constructor();
|
|
78
79
|
isClientSupported(): Promise<boolean>;
|
|
79
80
|
getConfigPath(): Promise<string>;
|
|
80
|
-
getServerConfig(apiKey: string, type: 'sse' | 'streamable-http', selectedFeatures?: string[], local?: boolean): MCPServerConfig;
|
|
81
|
-
addServer(apiKey
|
|
81
|
+
getServerConfig(apiKey: string | undefined, type: 'sse' | 'streamable-http', selectedFeatures?: string[], local?: boolean, region?: CloudRegion): MCPServerConfig;
|
|
82
|
+
addServer(apiKey?: string, selectedFeatures?: string[], local?: boolean, region?: CloudRegion): Promise<{
|
|
82
83
|
success: boolean;
|
|
83
84
|
}>;
|
|
84
85
|
}
|
|
@@ -50,11 +50,11 @@ class CursorMCPClient extends MCPClient_1.DefaultMCPClient {
|
|
|
50
50
|
async getConfigPath() {
|
|
51
51
|
return Promise.resolve(path.join(os.homedir(), '.cursor', 'mcp.json'));
|
|
52
52
|
}
|
|
53
|
-
getServerConfig(apiKey, type, selectedFeatures, local) {
|
|
54
|
-
return (0, defaults_1.getNativeHTTPServerConfig)(apiKey, type, selectedFeatures, local);
|
|
53
|
+
getServerConfig(apiKey, type, selectedFeatures, local, region) {
|
|
54
|
+
return (0, defaults_1.getNativeHTTPServerConfig)(apiKey, type, selectedFeatures, local, region);
|
|
55
55
|
}
|
|
56
|
-
async addServer(apiKey, selectedFeatures, local) {
|
|
57
|
-
return this._addServerType(apiKey, 'streamable-http', selectedFeatures, local);
|
|
56
|
+
async addServer(apiKey, selectedFeatures, local, region) {
|
|
57
|
+
return this._addServerType(apiKey, 'streamable-http', selectedFeatures, local, region);
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
exports.CursorMCPClient = CursorMCPClient;
|