@posthog/wizard 1.2.1 → 1.2.2

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.
Files changed (20) hide show
  1. package/dist/src/steps/add-mcp-server-to-clients/MCPClient.d.ts +19 -3
  2. package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js +102 -1
  3. package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js.map +1 -1
  4. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.js +34 -16
  5. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.js.map +1 -1
  6. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +42 -29
  7. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +6 -61
  8. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js.map +1 -1
  9. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.d.ts +42 -29
  10. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +5 -62
  11. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js.map +1 -1
  12. package/dist/src/steps/add-mcp-server-to-clients/defaults.d.ts +38 -22
  13. package/dist/src/steps/add-mcp-server-to-clients/defaults.js +7 -5
  14. package/dist/src/steps/add-mcp-server-to-clients/defaults.js.map +1 -1
  15. package/dist/src/steps/add-mcp-server-to-clients/index.js +2 -2
  16. package/dist/src/steps/add-mcp-server-to-clients/index.js.map +1 -1
  17. package/package.json +1 -1
  18. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/cursor.test.d.ts +0 -1
  19. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/cursor.test.js +0 -443
  20. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/cursor.test.js.map +0 -1
@@ -1,40 +1,53 @@
1
- import { MCPClient } from '../MCPClient';
1
+ import { DefaultMCPClient } from '../MCPClient';
2
2
  import { DefaultMCPClientConfig } from '../defaults';
3
3
  import { z } from 'zod';
4
4
  export declare const CursorMCPConfig: z.ZodObject<{
5
5
  mcpServers: z.ZodRecord<z.ZodString, z.ZodObject<{
6
- command: z.ZodString;
7
- args: z.ZodArray<z.ZodString, "many">;
8
- env: z.ZodRecord<z.ZodString, z.ZodString>;
6
+ command: z.ZodOptional<z.ZodString>;
7
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
8
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
9
9
  }, "strip", z.ZodTypeAny, {
10
- command: string;
11
- args: string[];
12
- env: Record<string, string>;
10
+ command?: string | undefined;
11
+ args?: string[] | undefined;
12
+ env?: Record<string, string> | undefined;
13
13
  }, {
14
- command: string;
15
- args: string[];
16
- env: Record<string, string>;
14
+ command?: string | undefined;
15
+ args?: string[] | undefined;
16
+ env?: Record<string, string> | undefined;
17
17
  }>>;
18
- }, "strip", z.ZodTypeAny, {
19
- mcpServers: Record<string, {
20
- command: string;
21
- args: string[];
22
- env: Record<string, string>;
23
- }>;
24
- }, {
25
- mcpServers: Record<string, {
26
- command: string;
27
- args: string[];
28
- env: Record<string, string>;
29
- }>;
30
- }>;
18
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
19
+ mcpServers: z.ZodRecord<z.ZodString, z.ZodObject<{
20
+ command: z.ZodOptional<z.ZodString>;
21
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
22
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
23
+ }, "strip", z.ZodTypeAny, {
24
+ command?: string | undefined;
25
+ args?: string[] | undefined;
26
+ env?: Record<string, string> | undefined;
27
+ }, {
28
+ command?: string | undefined;
29
+ args?: string[] | undefined;
30
+ env?: Record<string, string> | undefined;
31
+ }>>;
32
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
33
+ mcpServers: z.ZodRecord<z.ZodString, z.ZodObject<{
34
+ command: z.ZodOptional<z.ZodString>;
35
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
36
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
37
+ }, "strip", z.ZodTypeAny, {
38
+ command?: string | undefined;
39
+ args?: string[] | undefined;
40
+ env?: Record<string, string> | undefined;
41
+ }, {
42
+ command?: string | undefined;
43
+ args?: string[] | undefined;
44
+ env?: Record<string, string> | undefined;
45
+ }>>;
46
+ }, z.ZodTypeAny, "passthrough">>;
31
47
  export type CursorMCPConfig = z.infer<typeof DefaultMCPClientConfig>;
32
- export declare class CursorMCPClient extends MCPClient {
48
+ export declare class CursorMCPClient extends DefaultMCPClient {
33
49
  name: string;
34
50
  constructor();
35
- isClientSupported(): boolean;
36
- private getConfigPath;
37
- isServerInstalled(): Promise<boolean>;
38
- addServer(apiKey: string): Promise<void>;
39
- removeServer(): Promise<void>;
51
+ isClientSupported(): Promise<boolean>;
52
+ getConfigPath(): Promise<string>;
40
53
  }
@@ -35,77 +35,20 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.CursorMCPClient = exports.CursorMCPConfig = void 0;
37
37
  const MCPClient_1 = require("../MCPClient");
38
- const fs = __importStar(require("fs"));
39
38
  const path = __importStar(require("path"));
40
39
  const os = __importStar(require("os"));
41
40
  const defaults_1 = require("../defaults");
42
- const lodash_1 = require("lodash");
43
41
  exports.CursorMCPConfig = defaults_1.DefaultMCPClientConfig;
44
- class CursorMCPClient extends MCPClient_1.MCPClient {
42
+ class CursorMCPClient extends MCPClient_1.DefaultMCPClient {
45
43
  name = 'Cursor';
46
44
  constructor() {
47
45
  super();
48
46
  }
49
- isClientSupported() {
50
- return process.platform === 'darwin' || process.platform === 'win32';
47
+ async isClientSupported() {
48
+ return Promise.resolve(process.platform === 'darwin' || process.platform === 'win32');
51
49
  }
52
- getConfigPath() {
53
- return path.join(os.homedir(), '.cursor', 'mcp.json');
54
- }
55
- async isServerInstalled() {
56
- try {
57
- const configPath = this.getConfigPath();
58
- if (!fs.existsSync(configPath)) {
59
- return false;
60
- }
61
- const configContent = await fs.promises.readFile(configPath, 'utf8');
62
- const config = exports.CursorMCPConfig.parse(JSON.parse(configContent));
63
- return 'posthog' in config.mcpServers;
64
- }
65
- catch {
66
- return false;
67
- }
68
- }
69
- async addServer(apiKey) {
70
- const configPath = this.getConfigPath();
71
- const configDir = path.dirname(configPath);
72
- await fs.promises.mkdir(configDir, { recursive: true });
73
- let existingConfig = { mcpServers: {} };
74
- if (fs.existsSync(configPath)) {
75
- try {
76
- const existingContent = await fs.promises.readFile(configPath, 'utf8');
77
- existingConfig = exports.CursorMCPConfig.parse(JSON.parse(existingContent));
78
- }
79
- catch {
80
- existingConfig = { mcpServers: {} };
81
- }
82
- }
83
- const newServerConfig = {
84
- mcpServers: {
85
- posthog: (0, defaults_1.getDefaultServerConfig)(apiKey),
86
- },
87
- };
88
- const mergedConfig = (0, lodash_1.merge)({}, existingConfig, newServerConfig);
89
- await fs.promises.writeFile(configPath, JSON.stringify(mergedConfig, null, 2), 'utf8');
90
- }
91
- async removeServer() {
92
- const configPath = this.getConfigPath();
93
- if (!fs.existsSync(configPath)) {
94
- return;
95
- }
96
- let config;
97
- try {
98
- const configContent = await fs.promises.readFile(configPath, 'utf8');
99
- config = exports.CursorMCPConfig.parse(JSON.parse(configContent));
100
- }
101
- catch {
102
- // If we can't read or parse the config, there's nothing to remove
103
- return;
104
- }
105
- if (config.mcpServers && 'posthog' in config.mcpServers) {
106
- delete config.mcpServers.posthog;
107
- await fs.promises.writeFile(configPath, JSON.stringify(config, null, 2), 'utf8');
108
- }
50
+ async getConfigPath() {
51
+ return Promise.resolve(path.join(os.homedir(), '.cursor', 'mcp.json'));
109
52
  }
110
53
  }
111
54
  exports.CursorMCPClient = CursorMCPClient;
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../../../src/steps/add-mcp-server-to-clients/clients/cursor.ts"],"names":[],"mappings":"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","sourcesContent":["import { MCPClient } from '../MCPClient';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { DefaultMCPClientConfig, getDefaultServerConfig } from '../defaults';\nimport { z } from 'zod';\nimport { merge } from 'lodash';\n\nexport const CursorMCPConfig = DefaultMCPClientConfig;\n\nexport type CursorMCPConfig = z.infer<typeof DefaultMCPClientConfig>;\n\nexport class CursorMCPClient extends MCPClient {\n name = 'Cursor';\n\n constructor() {\n super();\n }\n\n isClientSupported(): boolean {\n return process.platform === 'darwin' || process.platform === 'win32';\n }\n\n private getConfigPath(): string {\n return path.join(os.homedir(), '.cursor', 'mcp.json');\n }\n\n async isServerInstalled(): Promise<boolean> {\n try {\n const configPath = 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 = CursorMCPConfig.parse(JSON.parse(configContent));\n\n return 'posthog' in config.mcpServers;\n } catch {\n return false;\n }\n }\n\n async addServer(apiKey: string): Promise<void> {\n const configPath = this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n await fs.promises.mkdir(configDir, { recursive: true });\n\n let existingConfig: CursorMCPConfig = { mcpServers: {} };\n\n if (fs.existsSync(configPath)) {\n try {\n const existingContent = await fs.promises.readFile(configPath, 'utf8');\n existingConfig = CursorMCPConfig.parse(JSON.parse(existingContent));\n } catch {\n existingConfig = { mcpServers: {} };\n }\n }\n\n const newServerConfig = {\n mcpServers: {\n posthog: getDefaultServerConfig(apiKey),\n },\n };\n\n const mergedConfig = merge({}, existingConfig, newServerConfig);\n\n await fs.promises.writeFile(\n configPath,\n JSON.stringify(mergedConfig, null, 2),\n 'utf8',\n );\n }\n\n async removeServer(): Promise<void> {\n const configPath = this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return;\n }\n\n let config: CursorMCPConfig;\n\n try {\n const configContent = await fs.promises.readFile(configPath, 'utf8');\n config = CursorMCPConfig.parse(JSON.parse(configContent));\n } catch {\n // If we can't read or parse the config, there's nothing to remove\n return;\n }\n\n if (config.mcpServers && 'posthog' in config.mcpServers) {\n delete config.mcpServers.posthog;\n\n await fs.promises.writeFile(\n configPath,\n JSON.stringify(config, null, 2),\n 'utf8',\n );\n }\n }\n}\n"]}
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../../../src/steps/add-mcp-server-to-clients/clients/cursor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAAgD;AAChD,2CAA6B;AAC7B,uCAAyB;AACzB,0CAAqD;AAGxC,QAAA,eAAe,GAAG,iCAAsB,CAAC;AAItD,MAAa,eAAgB,SAAQ,4BAAgB;IACnD,IAAI,GAAG,QAAQ,CAAC;IAEhB;QACE,KAAK,EAAE,CAAC;IACV,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,OAAO,OAAO,CAAC,OAAO,CACpB,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,CAC9D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IACzE,CAAC;CACF;AAhBD,0CAgBC","sourcesContent":["import { DefaultMCPClient } from '../MCPClient';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { DefaultMCPClientConfig } from '../defaults';\nimport { z } from 'zod';\n\nexport const CursorMCPConfig = DefaultMCPClientConfig;\n\nexport type CursorMCPConfig = z.infer<typeof DefaultMCPClientConfig>;\n\nexport class CursorMCPClient extends DefaultMCPClient {\n name = 'Cursor';\n\n constructor() {\n super();\n }\n\n async isClientSupported(): Promise<boolean> {\n return Promise.resolve(\n process.platform === 'darwin' || process.platform === 'win32',\n );\n }\n\n async getConfigPath(): Promise<string> {\n return Promise.resolve(path.join(os.homedir(), '.cursor', 'mcp.json'));\n }\n}\n"]}
@@ -1,31 +1,47 @@
1
1
  import z from 'zod';
2
2
  export declare const DefaultMCPClientConfig: z.ZodObject<{
3
3
  mcpServers: z.ZodRecord<z.ZodString, z.ZodObject<{
4
- command: z.ZodString;
5
- args: z.ZodArray<z.ZodString, "many">;
6
- env: z.ZodRecord<z.ZodString, z.ZodString>;
4
+ command: z.ZodOptional<z.ZodString>;
5
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
6
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
7
7
  }, "strip", z.ZodTypeAny, {
8
- command: string;
9
- args: string[];
10
- env: Record<string, string>;
8
+ command?: string | undefined;
9
+ args?: string[] | undefined;
10
+ env?: Record<string, string> | undefined;
11
11
  }, {
12
- command: string;
13
- args: string[];
14
- env: Record<string, string>;
12
+ command?: string | undefined;
13
+ args?: string[] | undefined;
14
+ env?: Record<string, string> | undefined;
15
15
  }>>;
16
- }, "strip", z.ZodTypeAny, {
17
- mcpServers: Record<string, {
18
- command: string;
19
- args: string[];
20
- env: Record<string, string>;
21
- }>;
22
- }, {
23
- mcpServers: Record<string, {
24
- command: string;
25
- args: string[];
26
- env: Record<string, string>;
27
- }>;
28
- }>;
16
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
17
+ mcpServers: z.ZodRecord<z.ZodString, z.ZodObject<{
18
+ command: z.ZodOptional<z.ZodString>;
19
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
20
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
21
+ }, "strip", z.ZodTypeAny, {
22
+ command?: string | undefined;
23
+ args?: string[] | undefined;
24
+ env?: Record<string, string> | undefined;
25
+ }, {
26
+ command?: string | undefined;
27
+ args?: string[] | undefined;
28
+ env?: Record<string, string> | undefined;
29
+ }>>;
30
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
31
+ mcpServers: z.ZodRecord<z.ZodString, z.ZodObject<{
32
+ command: z.ZodOptional<z.ZodString>;
33
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
34
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
35
+ }, "strip", z.ZodTypeAny, {
36
+ command?: string | undefined;
37
+ args?: string[] | undefined;
38
+ env?: Record<string, string> | undefined;
39
+ }, {
40
+ command?: string | undefined;
41
+ args?: string[] | undefined;
42
+ env?: Record<string, string> | undefined;
43
+ }>>;
44
+ }, z.ZodTypeAny, "passthrough">>;
29
45
  export declare const getDefaultServerConfig: (apiKey: string) => {
30
46
  command: string;
31
47
  args: string[];
@@ -5,13 +5,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getDefaultServerConfig = exports.DefaultMCPClientConfig = void 0;
7
7
  const zod_1 = __importDefault(require("zod"));
8
- exports.DefaultMCPClientConfig = zod_1.default.object({
8
+ exports.DefaultMCPClientConfig = zod_1.default
9
+ .object({
9
10
  mcpServers: zod_1.default.record(zod_1.default.string(), zod_1.default.object({
10
- command: zod_1.default.string(),
11
- args: zod_1.default.array(zod_1.default.string()),
12
- env: zod_1.default.record(zod_1.default.string(), zod_1.default.string()),
11
+ command: zod_1.default.string().optional(),
12
+ args: zod_1.default.array(zod_1.default.string()).optional(),
13
+ env: zod_1.default.record(zod_1.default.string(), zod_1.default.string()).optional(),
13
14
  })),
14
- });
15
+ })
16
+ .passthrough();
15
17
  const getDefaultServerConfig = (apiKey) => ({
16
18
  command: 'npx',
17
19
  args: [
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../../src/steps/add-mcp-server-to-clients/defaults.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAoB;AAEP,QAAA,sBAAsB,GAAG,aAAC,CAAC,MAAM,CAAC;IAC7C,UAAU,EAAE,aAAC,CAAC,MAAM,CAClB,aAAC,CAAC,MAAM,EAAE,EACV,aAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,aAAC,CAAC,MAAM,EAAE;QACnB,IAAI,EAAE,aAAC,CAAC,KAAK,CAAC,aAAC,CAAC,MAAM,EAAE,CAAC;QACzB,GAAG,EAAE,aAAC,CAAC,MAAM,CAAC,aAAC,CAAC,MAAM,EAAE,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC;KACtC,CAAC,CACH;CACF,CAAC,CAAC;AAEI,MAAM,sBAAsB,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IACzD,OAAO,EAAE,KAAK;IACd,IAAI,EAAE;QACJ,IAAI;QACJ,mBAAmB;QACnB,6BAA6B;QAC7B,UAAU;QACV,uCAAuC;KACxC;IACD,GAAG,EAAE;QACH,mBAAmB,EAAE,UAAU,MAAM,EAAE;KACxC;CACF,CAAC,CAAC;AAZU,QAAA,sBAAsB,0BAYhC","sourcesContent":["import z from 'zod';\n\nexport const DefaultMCPClientConfig = z.object({\n mcpServers: z.record(\n z.string(),\n z.object({\n command: z.string(),\n args: z.array(z.string()),\n env: z.record(z.string(), z.string()),\n }),\n ),\n});\n\nexport const getDefaultServerConfig = (apiKey: string) => ({\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 ${apiKey}`,\n },\n});\n"]}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../../src/steps/add-mcp-server-to-clients/defaults.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAoB;AAEP,QAAA,sBAAsB,GAAG,aAAC;KACpC,MAAM,CAAC;IACN,UAAU,EAAE,aAAC,CAAC,MAAM,CAClB,aAAC,CAAC,MAAM,EAAE,EACV,aAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC9B,IAAI,EAAE,aAAC,CAAC,KAAK,CAAC,aAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACpC,GAAG,EAAE,aAAC,CAAC,MAAM,CAAC,aAAC,CAAC,MAAM,EAAE,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;KACjD,CAAC,CACH;CACF,CAAC;KACD,WAAW,EAAE,CAAC;AAEV,MAAM,sBAAsB,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IACzD,OAAO,EAAE,KAAK;IACd,IAAI,EAAE;QACJ,IAAI;QACJ,mBAAmB;QACnB,6BAA6B;QAC7B,UAAU;QACV,uCAAuC;KACxC;IACD,GAAG,EAAE;QACH,mBAAmB,EAAE,UAAU,MAAM,EAAE;KACxC;CACF,CAAC,CAAC;AAZU,QAAA,sBAAsB,0BAYhC","sourcesContent":["import z from 'zod';\n\nexport const DefaultMCPClientConfig = z\n .object({\n mcpServers: z.record(\n z.string(),\n z.object({\n command: z.string().optional(),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n }),\n ),\n })\n .passthrough();\n\nexport const getDefaultServerConfig = (apiKey: string) => ({\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 ${apiKey}`,\n },\n});\n"]}
@@ -41,7 +41,7 @@ const addMCPServerToClientsStep = async ({ integration, cloudRegion, askPermissi
41
41
  clack_1.default.log.warn(`The PostHog MCP server is already configured for:
42
42
 
43
43
  ${installedClients.map((c) => `- ${c.name}`).join('\n ')}`);
44
- const reinstall = await clack_1.default.select({
44
+ const reinstall = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
45
45
  message: 'Would you like to reinstall it?',
46
46
  options: [
47
47
  {
@@ -55,7 +55,7 @@ const addMCPServerToClientsStep = async ({ integration, cloudRegion, askPermissi
55
55
  hint: 'Keep the existing installation',
56
56
  },
57
57
  ],
58
- });
58
+ }), integration);
59
59
  if (!reinstall) {
60
60
  analytics_1.analytics.capture('wizard interaction', {
61
61
  action: 'declined to reinstall mcp servers',
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/steps/add-mcp-server-to-clients/index.ts"],"names":[],"mappings":";;;;;;AACA,+CAA4C;AAC5C,qDAAkD;AAClD,8DAAsC;AACtC,yDAIiC;AAEjC,6CAAmD;AACnD,6CAAmD;AACnD,mCAA8C;AAGvC,MAAM,mBAAmB,GAAG,GAAgB,EAAE;IACnD,OAAO,CAAC,IAAI,wBAAe,EAAE,EAAE,IAAI,wBAAe,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CACtE,MAAM,CAAC,iBAAiB,EAAE,CAC3B,CAAC;AACJ,CAAC,CAAC;AAJW,QAAA,mBAAmB,uBAI9B;AAEK,MAAM,yBAAyB,GAAG,KAAK,EAAE,EAC9C,WAAW,EACX,WAAW,EACX,aAAa,GAAG,IAAI,GAKrB,EAAqB,EAAE;IACtB,MAAM,MAAM,GAAG,WAAW,IAAI,CAAC,MAAM,IAAA,+BAAiB,GAAE,CAAC,CAAC;IAE1D,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAA,mBAAK,EACT,sEAAsE,CACvE,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,aAAa,GAAG,aAAa;QACjC,CAAC,CAAC,MAAM,IAAA,8BAAgB,EACpB,eAAK,CAAC,MAAM,CAAC;YACX,OAAO,EACL,iFAAiF;YACnF,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC7B,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;aAC9B;SACF,CAAC,EACF,WAAW,CACZ;QACH,CAAC,CAAC,IAAI,CAAC;IAET,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,2BAAmB,GAAE,CAAC;IAEtC,MAAM,gBAAgB,GAAG,MAAM,IAAA,2BAAmB,GAAE,CAAC;IAErD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,eAAK,CAAC,GAAG,CAAC,IAAI,CACZ;;IAEF,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CACxD,CAAC;QAEF,MAAM,SAAS,GAAG,MAAM,eAAK,CAAC,MAAM,CAAC;YACnC,OAAO,EAAE,iCAAiC;YAC1C,OAAO,EAAE;gBACP;oBACE,KAAK,EAAE,IAAI;oBACX,KAAK,EAAE,KAAK;oBACZ,IAAI,EAAE,0BAA0B;iBACjC;gBACD;oBACE,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,IAAI;oBACX,IAAI,EAAE,gCAAgC;iBACvC;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,qBAAS,CAAC,OAAO,CAAC,oBAAoB,EAAE;gBACtC,MAAM,EAAE,mCAAmC;gBAC3C,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC5C,WAAW;aACZ,CAAC,CAAC;YAEH,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,IAAA,uBAAe,EAAC,gBAAgB,CAAC,CAAC;QACxC,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,IAAA,uBAAiB,EAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;IAExE,MAAM,IAAA,qBAAS,EAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,IAAA,oBAAY,EAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,eAAK,CAAC,GAAG,CAAC,OAAO,CACf;IACA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAClD,CAAC;IAEF,qBAAS,CAAC,OAAO,CAAC,oBAAoB,EAAE;QACtC,MAAM,EAAE,mBAAmB;QAC3B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACnC,WAAW;KACZ,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC,CAAC;AAjGW,QAAA,yBAAyB,6BAiGpC;AAEK,MAAM,8BAA8B,GAAG,KAAK,EAAE,EACnD,WAAW,GAGZ,EAAqB,EAAE;IACtB,MAAM,gBAAgB,GAAG,MAAM,IAAA,2BAAmB,GAAE,CAAC;IAErD,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,qBAAS,CAAC,OAAO,CAAC,oBAAoB,EAAE;YACtC,MAAM,EAAE,0BAA0B;YAClC,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,aAAa,GAAY,MAAM,IAAA,8BAAgB,EACnD,eAAK,CAAC,MAAM,CAAC;QACX,OAAO,EAAE,mCAAmC,gBAAgB,CAAC,MAAM,wCAAwC;QAC3G,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,2BAA2B;aAClC;YACD;gBACE,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,mCAAmC;aAC1C;SACF;KACF,CAAC,EACF,WAAW,CACZ,CAAC;IAEF,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,qBAAS,CAAC,OAAO,CAAC,oBAAoB,EAAE;YACtC,MAAM,EAAE,gCAAgC;YACxC,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5C,WAAW;SACZ,CAAC,CAAC;QAEH,MAAM,IAAA,mBAAK,EAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAS,EAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,IAAA,uBAAe,EAAC,gBAAgB,CAAC,CAAC;QAExC,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,qBAAS,CAAC,OAAO,CAAC,oBAAoB,EAAE;QACtC,MAAM,EAAE,qBAAqB;QAC7B,OAAO,EAAE,OAAO;QAChB,WAAW;KACZ,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AA1DW,QAAA,8BAA8B,kCA0DzC;AAEK,MAAM,mBAAmB,GAAG,KAAK,IAA0B,EAAE;IAClE,MAAM,OAAO,GAAG,IAAA,2BAAmB,GAAE,CAAC;IAEtC,MAAM,gBAAgB,GAAgB,EAAE,CAAC;IAEzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,MAAM,CAAC,iBAAiB,EAAE,EAAE,CAAC;YACrC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC,CAAC;AAZW,QAAA,mBAAmB,uBAY9B;AAEK,MAAM,YAAY,GAAG,KAAK,EAC/B,OAAoB,EACpB,cAAsB,EACP,EAAE;IACjB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACzC,CAAC;AACH,CAAC,CAAC;AAPW,QAAA,YAAY,gBAOvB;AAEK,MAAM,eAAe,GAAG,KAAK,EAAE,OAAoB,EAAiB,EAAE;IAC3E,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC,CAAC;AAJW,QAAA,eAAe,mBAI1B","sourcesContent":["import type { Integration } from '../../lib/constants';\nimport { traceStep } from '../../telemetry';\nimport { analytics } from '../../utils/analytics';\nimport clack from '../../utils/clack';\nimport {\n abort,\n abortIfCancelled,\n askForCloudRegion,\n} from '../../utils/clack-utils';\nimport { MCPClient } from './MCPClient';\nimport { CursorMCPClient } from './clients/cursor';\nimport { ClaudeMCPClient } from './clients/claude';\nimport { getPersonalApiKey } from '../../mcp';\nimport type { CloudRegion } from '../../utils/types';\n\nexport const getSupportedClients = (): MCPClient[] => {\n return [new CursorMCPClient(), new ClaudeMCPClient()].filter((client) =>\n client.isClientSupported(),\n );\n};\n\nexport const addMCPServerToClientsStep = async ({\n integration,\n cloudRegion,\n askPermission = true,\n}: {\n integration?: Integration;\n cloudRegion?: CloudRegion;\n askPermission?: boolean;\n}): Promise<string[]> => {\n const region = cloudRegion ?? (await askForCloudRegion());\n\n if (region === 'eu') {\n if (!askPermission) {\n await abort(\n 'The MCP server is not available in the EU region. It is coming soon!',\n );\n }\n return [];\n }\n\n const hasPermission = askPermission\n ? await abortIfCancelled(\n clack.select({\n message:\n 'Would you like to install the PostHog MCP server to use PostHog in your editor?',\n options: [\n { value: true, label: 'Yes' },\n { value: false, label: 'No' },\n ],\n }),\n integration,\n )\n : true;\n\n if (!hasPermission) {\n return [];\n }\n\n const clients = getSupportedClients();\n\n const installedClients = await getInstalledClients();\n\n if (installedClients.length > 0) {\n clack.log.warn(\n `The PostHog MCP server is already configured for:\n\n ${installedClients.map((c) => `- ${c.name}`).join('\\n ')}`,\n );\n\n const reinstall = await clack.select({\n message: 'Would you like to reinstall it?',\n options: [\n {\n value: true,\n label: 'Yes',\n hint: 'Reinstall the MCP server',\n },\n {\n value: false,\n label: 'No',\n hint: 'Keep the existing installation',\n },\n ],\n });\n\n if (!reinstall) {\n analytics.capture('wizard interaction', {\n action: 'declined to reinstall mcp servers',\n clients: installedClients.map((c) => c.name),\n integration,\n });\n\n return [];\n }\n\n await removeMCPServer(installedClients);\n clack.log.info('Removed existing installation.');\n }\n\n const personalApiKey = await getPersonalApiKey({ cloudRegion: region });\n\n await traceStep('adding mcp servers', async () => {\n await addMCPServer(clients, personalApiKey);\n });\n\n clack.log.success(\n `Added the PostHog MCP server to:\n ${clients.map((c) => `- ${c.name}`).join('\\n ')} `,\n );\n\n analytics.capture('wizard interaction', {\n action: 'added mcp servers',\n clients: clients.map((c) => c.name),\n integration,\n });\n\n return clients.map((c) => c.name);\n};\n\nexport const removeMCPServerFromClientsStep = async ({\n integration,\n}: {\n integration?: Integration;\n}): Promise<string[]> => {\n const installedClients = await getInstalledClients();\n\n if (installedClients.length === 0) {\n analytics.capture('wizard interaction', {\n action: 'no mcp servers to remove',\n integration,\n });\n return [];\n }\n\n const removeServers: boolean = await abortIfCancelled(\n clack.select({\n message: `Found the PostHog MCP server in ${installedClients.length} clients. Would you like to remove it?`,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: `Remove PostHog MCP server`,\n },\n {\n value: false,\n label: 'No',\n hint: 'Keep the MCP server configuration',\n },\n ],\n }),\n integration,\n );\n\n if (!removeServers) {\n analytics.capture('wizard interaction', {\n action: 'declined to remove mcp servers',\n clients: installedClients.map((c) => c.name),\n integration,\n });\n\n await abort('The MCP server was not removed.');\n return [];\n }\n\n const results = await traceStep('removing mcp servers', async () => {\n await removeMCPServer(installedClients);\n\n return installedClients.map((c) => c.name);\n });\n\n analytics.capture('wizard interaction', {\n action: 'removed mcp servers',\n clients: results,\n integration,\n });\n\n return results;\n};\n\nexport const getInstalledClients = async (): Promise<MCPClient[]> => {\n const clients = getSupportedClients();\n\n const installedClients: MCPClient[] = [];\n\n for (const client of clients) {\n if (await client.isServerInstalled()) {\n installedClients.push(client);\n }\n }\n\n return installedClients;\n};\n\nexport const addMCPServer = async (\n clients: MCPClient[],\n personalApiKey: string,\n): Promise<void> => {\n for (const client of clients) {\n await client.addServer(personalApiKey);\n }\n};\n\nexport const removeMCPServer = async (clients: MCPClient[]): Promise<void> => {\n for (const client of clients) {\n await client.removeServer();\n }\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/steps/add-mcp-server-to-clients/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Integration } from '../../lib/constants';\nimport { traceStep } from '../../telemetry';\nimport { analytics } from '../../utils/analytics';\nimport clack from '../../utils/clack';\nimport {\n abort,\n abortIfCancelled,\n askForCloudRegion,\n} from '../../utils/clack-utils';\nimport { MCPClient } from './MCPClient';\nimport { CursorMCPClient } from './clients/cursor';\nimport { ClaudeMCPClient } from './clients/claude';\nimport { getPersonalApiKey } from '../../mcp';\nimport type { CloudRegion } from '../../utils/types';\n\nexport const getSupportedClients = (): MCPClient[] => {\n return [new CursorMCPClient(), new ClaudeMCPClient()].filter((client) =>\n client.isClientSupported(),\n );\n};\n\nexport const addMCPServerToClientsStep = async ({\n integration,\n cloudRegion,\n askPermission = true,\n}: {\n integration?: Integration;\n cloudRegion?: CloudRegion;\n askPermission?: boolean;\n}): Promise<string[]> => {\n const region = cloudRegion ?? (await askForCloudRegion());\n\n if (region === 'eu') {\n if (!askPermission) {\n await abort(\n 'The MCP server is not available in the EU region. It is coming soon!',\n );\n }\n return [];\n }\n\n const hasPermission = askPermission\n ? await abortIfCancelled(\n clack.select({\n message:\n 'Would you like to install the PostHog MCP server to use PostHog in your editor?',\n options: [\n { value: true, label: 'Yes' },\n { value: false, label: 'No' },\n ],\n }),\n integration,\n )\n : true;\n\n if (!hasPermission) {\n return [];\n }\n\n const clients = getSupportedClients();\n\n const installedClients = await getInstalledClients();\n\n if (installedClients.length > 0) {\n clack.log.warn(\n `The PostHog MCP server is already configured for:\n\n ${installedClients.map((c) => `- ${c.name}`).join('\\n ')}`,\n );\n\n const reinstall = await abortIfCancelled(\n clack.select({\n message: 'Would you like to reinstall it?',\n options: [\n {\n value: true,\n label: 'Yes',\n hint: 'Reinstall the MCP server',\n },\n {\n value: false,\n label: 'No',\n hint: 'Keep the existing installation',\n },\n ],\n }),\n integration,\n );\n\n if (!reinstall) {\n analytics.capture('wizard interaction', {\n action: 'declined to reinstall mcp servers',\n clients: installedClients.map((c) => c.name),\n integration,\n });\n\n return [];\n }\n\n await removeMCPServer(installedClients);\n clack.log.info('Removed existing installation.');\n }\n\n const personalApiKey = await getPersonalApiKey({ cloudRegion: region });\n\n await traceStep('adding mcp servers', async () => {\n await addMCPServer(clients, personalApiKey);\n });\n\n clack.log.success(\n `Added the PostHog MCP server to:\n ${clients.map((c) => `- ${c.name}`).join('\\n ')} `,\n );\n\n analytics.capture('wizard interaction', {\n action: 'added mcp servers',\n clients: clients.map((c) => c.name),\n integration,\n });\n\n return clients.map((c) => c.name);\n};\n\nexport const removeMCPServerFromClientsStep = async ({\n integration,\n}: {\n integration?: Integration;\n}): Promise<string[]> => {\n const installedClients = await getInstalledClients();\n\n if (installedClients.length === 0) {\n analytics.capture('wizard interaction', {\n action: 'no mcp servers to remove',\n integration,\n });\n return [];\n }\n\n const removeServers: boolean = await abortIfCancelled(\n clack.select({\n message: `Found the PostHog MCP server in ${installedClients.length} clients. Would you like to remove it?`,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: `Remove PostHog MCP server`,\n },\n {\n value: false,\n label: 'No',\n hint: 'Keep the MCP server configuration',\n },\n ],\n }),\n integration,\n );\n\n if (!removeServers) {\n analytics.capture('wizard interaction', {\n action: 'declined to remove mcp servers',\n clients: installedClients.map((c) => c.name),\n integration,\n });\n\n await abort('The MCP server was not removed.');\n return [];\n }\n\n const results = await traceStep('removing mcp servers', async () => {\n await removeMCPServer(installedClients);\n\n return installedClients.map((c) => c.name);\n });\n\n analytics.capture('wizard interaction', {\n action: 'removed mcp servers',\n clients: results,\n integration,\n });\n\n return results;\n};\n\nexport const getInstalledClients = async (): Promise<MCPClient[]> => {\n const clients = getSupportedClients();\n\n const installedClients: MCPClient[] = [];\n\n for (const client of clients) {\n if (await client.isServerInstalled()) {\n installedClients.push(client);\n }\n }\n\n return installedClients;\n};\n\nexport const addMCPServer = async (\n clients: MCPClient[],\n personalApiKey: string,\n): Promise<void> => {\n for (const client of clients) {\n await client.addServer(personalApiKey);\n }\n};\n\nexport const removeMCPServer = async (clients: MCPClient[]): Promise<void> => {\n for (const client of clients) {\n await client.removeServer();\n }\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@posthog/wizard",
3
- "version": "1.2.1",
3
+ "version": "1.2.2",
4
4
  "homepage": "https://github.com/posthog/wizard",
5
5
  "repository": "https://github.com/posthog/wizard",
6
6
  "description": "The PostHog wizard helps you to configure your project",