@posthog/wizard 1.1.0 → 1.2.1

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 (51) hide show
  1. package/dist/bin.js +60 -4
  2. package/dist/bin.js.map +1 -1
  3. package/dist/src/lib/helper-functions.d.ts +1 -0
  4. package/dist/src/lib/helper-functions.js +6 -0
  5. package/dist/src/lib/helper-functions.js.map +1 -0
  6. package/dist/src/mcp.d.ts +9 -0
  7. package/dist/src/mcp.js +69 -0
  8. package/dist/src/mcp.js.map +1 -0
  9. package/dist/src/nextjs/nextjs-wizard.js +5 -3
  10. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  11. package/dist/src/react/react-wizard.js +4 -1
  12. package/dist/src/react/react-wizard.js.map +1 -1
  13. package/dist/src/react-native/react-native-wizard.js +4 -1
  14. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  15. package/dist/src/run.d.ts +1 -1
  16. package/dist/src/run.js +1 -4
  17. package/dist/src/run.js.map +1 -1
  18. package/dist/src/steps/__tests__/add-editor-rules.test.js +0 -10
  19. package/dist/src/steps/__tests__/add-editor-rules.test.js.map +1 -1
  20. package/dist/src/steps/add-editor-rules.d.ts +1 -2
  21. package/dist/src/steps/add-editor-rules.js +1 -22
  22. package/dist/src/steps/add-editor-rules.js.map +1 -1
  23. package/dist/src/steps/add-mcp-server-to-clients/MCPClient.d.ts +7 -0
  24. package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js +8 -0
  25. package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js.map +1 -0
  26. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.d.ts +1 -0
  27. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.js +318 -0
  28. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.js.map +1 -0
  29. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/cursor.test.d.ts +1 -0
  30. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/cursor.test.js +443 -0
  31. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/cursor.test.js.map +1 -0
  32. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +40 -0
  33. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +119 -0
  34. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js.map +1 -0
  35. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.d.ts +40 -0
  36. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +112 -0
  37. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js.map +1 -0
  38. package/dist/src/steps/add-mcp-server-to-clients/defaults.d.ts +35 -0
  39. package/dist/src/steps/add-mcp-server-to-clients/defaults.js +29 -0
  40. package/dist/src/steps/add-mcp-server-to-clients/defaults.js.map +1 -0
  41. package/dist/src/steps/add-mcp-server-to-clients/index.d.ts +15 -0
  42. package/dist/src/steps/add-mcp-server-to-clients/index.js +152 -0
  43. package/dist/src/steps/add-mcp-server-to-clients/index.js.map +1 -0
  44. package/dist/src/steps/index.d.ts +2 -0
  45. package/dist/src/steps/index.js +2 -0
  46. package/dist/src/steps/index.js.map +1 -1
  47. package/dist/src/svelte/svelte-wizard.js +4 -1
  48. package/dist/src/svelte/svelte-wizard.js.map +1 -1
  49. package/dist/src/utils/clack-utils.d.ts +1 -1
  50. package/dist/src/utils/clack-utils.js.map +1 -1
  51. package/package.json +3 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../../../src/steps/add-mcp-server-to-clients/clients/claude.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 ClaudeMCPConfig = DefaultMCPClientConfig;\n\nexport type ClaudeMCPConfig = z.infer<typeof DefaultMCPClientConfig>;\n\nexport class ClaudeMCPClient extends MCPClient {\n name = 'Claude Desktop';\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 const homeDir = os.homedir();\n const isWindows = process.platform === 'win32';\n const isMac = process.platform === 'darwin';\n\n if (isMac) {\n return path.join(\n homeDir,\n 'Library',\n 'Application Support',\n 'Claude',\n 'claude_desktop_config.json',\n );\n }\n\n if (isWindows) {\n return path.join(\n process.env.APPDATA || '',\n 'Claude',\n 'claude_desktop_config.json',\n );\n }\n\n throw new Error(`Unsupported platform: ${process.platform}`);\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 = ClaudeMCPConfig.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: ClaudeMCPConfig = { mcpServers: {} };\n\n if (fs.existsSync(configPath)) {\n try {\n const existingContent = await fs.promises.readFile(configPath, 'utf8');\n existingConfig = ClaudeMCPConfig.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 try {\n const configContent = await fs.promises.readFile(configPath, 'utf8');\n const config = ClaudeMCPConfig.parse(JSON.parse(configContent));\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 } catch {\n // If we can't read or parse the config, there's nothing to remove\n }\n }\n}\n"]}
@@ -0,0 +1,40 @@
1
+ import { MCPClient } from '../MCPClient';
2
+ import { DefaultMCPClientConfig } from '../defaults';
3
+ import { z } from 'zod';
4
+ export declare const CursorMCPConfig: z.ZodObject<{
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>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ command: string;
11
+ args: string[];
12
+ env: Record<string, string>;
13
+ }, {
14
+ command: string;
15
+ args: string[];
16
+ env: Record<string, string>;
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
+ }>;
31
+ export type CursorMCPConfig = z.infer<typeof DefaultMCPClientConfig>;
32
+ export declare class CursorMCPClient extends MCPClient {
33
+ name: string;
34
+ constructor();
35
+ isClientSupported(): boolean;
36
+ private getConfigPath;
37
+ isServerInstalled(): Promise<boolean>;
38
+ addServer(apiKey: string): Promise<void>;
39
+ removeServer(): Promise<void>;
40
+ }
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.CursorMCPClient = exports.CursorMCPConfig = void 0;
37
+ const MCPClient_1 = require("../MCPClient");
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const os = __importStar(require("os"));
41
+ const defaults_1 = require("../defaults");
42
+ const lodash_1 = require("lodash");
43
+ exports.CursorMCPConfig = defaults_1.DefaultMCPClientConfig;
44
+ class CursorMCPClient extends MCPClient_1.MCPClient {
45
+ name = 'Cursor';
46
+ constructor() {
47
+ super();
48
+ }
49
+ isClientSupported() {
50
+ return process.platform === 'darwin' || process.platform === 'win32';
51
+ }
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
+ }
109
+ }
110
+ }
111
+ exports.CursorMCPClient = CursorMCPClient;
112
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,35 @@
1
+ import z from 'zod';
2
+ export declare const DefaultMCPClientConfig: z.ZodObject<{
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>;
7
+ }, "strip", z.ZodTypeAny, {
8
+ command: string;
9
+ args: string[];
10
+ env: Record<string, string>;
11
+ }, {
12
+ command: string;
13
+ args: string[];
14
+ env: Record<string, string>;
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
+ }>;
29
+ export declare const getDefaultServerConfig: (apiKey: string) => {
30
+ command: string;
31
+ args: string[];
32
+ env: {
33
+ POSTHOG_AUTH_HEADER: string;
34
+ };
35
+ };
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getDefaultServerConfig = exports.DefaultMCPClientConfig = void 0;
7
+ const zod_1 = __importDefault(require("zod"));
8
+ exports.DefaultMCPClientConfig = zod_1.default.object({
9
+ 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()),
13
+ })),
14
+ });
15
+ const getDefaultServerConfig = (apiKey) => ({
16
+ command: 'npx',
17
+ args: [
18
+ '-y',
19
+ 'mcp-remote@latest',
20
+ 'https://mcp.posthog.com/sse',
21
+ '--header',
22
+ `Authorization:\${POSTHOG_AUTH_HEADER}`,
23
+ ],
24
+ env: {
25
+ POSTHOG_AUTH_HEADER: `Bearer ${apiKey}`,
26
+ },
27
+ });
28
+ exports.getDefaultServerConfig = getDefaultServerConfig;
29
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,15 @@
1
+ import type { Integration } from '../../lib/constants';
2
+ import { MCPClient } from './MCPClient';
3
+ import type { CloudRegion } from '../../utils/types';
4
+ export declare const getSupportedClients: () => MCPClient[];
5
+ export declare const addMCPServerToClientsStep: ({ integration, cloudRegion, askPermission, }: {
6
+ integration?: Integration;
7
+ cloudRegion?: CloudRegion;
8
+ askPermission?: boolean;
9
+ }) => Promise<string[]>;
10
+ export declare const removeMCPServerFromClientsStep: ({ integration, }: {
11
+ integration?: Integration;
12
+ }) => Promise<string[]>;
13
+ export declare const getInstalledClients: () => Promise<MCPClient[]>;
14
+ export declare const addMCPServer: (clients: MCPClient[], personalApiKey: string) => Promise<void>;
15
+ export declare const removeMCPServer: (clients: MCPClient[]) => Promise<void>;
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.removeMCPServer = exports.addMCPServer = exports.getInstalledClients = exports.removeMCPServerFromClientsStep = exports.addMCPServerToClientsStep = exports.getSupportedClients = void 0;
7
+ const telemetry_1 = require("../../telemetry");
8
+ const analytics_1 = require("../../utils/analytics");
9
+ const clack_1 = __importDefault(require("../../utils/clack"));
10
+ const clack_utils_1 = require("../../utils/clack-utils");
11
+ const cursor_1 = require("./clients/cursor");
12
+ const claude_1 = require("./clients/claude");
13
+ const mcp_1 = require("../../mcp");
14
+ const getSupportedClients = () => {
15
+ return [new cursor_1.CursorMCPClient(), new claude_1.ClaudeMCPClient()].filter((client) => client.isClientSupported());
16
+ };
17
+ exports.getSupportedClients = getSupportedClients;
18
+ const addMCPServerToClientsStep = async ({ integration, cloudRegion, askPermission = true, }) => {
19
+ const region = cloudRegion ?? (await (0, clack_utils_1.askForCloudRegion)());
20
+ if (region === 'eu') {
21
+ if (!askPermission) {
22
+ await (0, clack_utils_1.abort)('The MCP server is not available in the EU region. It is coming soon!');
23
+ }
24
+ return [];
25
+ }
26
+ const hasPermission = askPermission
27
+ ? await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
28
+ message: 'Would you like to install the PostHog MCP server to use PostHog in your editor?',
29
+ options: [
30
+ { value: true, label: 'Yes' },
31
+ { value: false, label: 'No' },
32
+ ],
33
+ }), integration)
34
+ : true;
35
+ if (!hasPermission) {
36
+ return [];
37
+ }
38
+ const clients = (0, exports.getSupportedClients)();
39
+ const installedClients = await (0, exports.getInstalledClients)();
40
+ if (installedClients.length > 0) {
41
+ clack_1.default.log.warn(`The PostHog MCP server is already configured for:
42
+
43
+ ${installedClients.map((c) => `- ${c.name}`).join('\n ')}`);
44
+ const reinstall = await clack_1.default.select({
45
+ message: 'Would you like to reinstall it?',
46
+ options: [
47
+ {
48
+ value: true,
49
+ label: 'Yes',
50
+ hint: 'Reinstall the MCP server',
51
+ },
52
+ {
53
+ value: false,
54
+ label: 'No',
55
+ hint: 'Keep the existing installation',
56
+ },
57
+ ],
58
+ });
59
+ if (!reinstall) {
60
+ analytics_1.analytics.capture('wizard interaction', {
61
+ action: 'declined to reinstall mcp servers',
62
+ clients: installedClients.map((c) => c.name),
63
+ integration,
64
+ });
65
+ return [];
66
+ }
67
+ await (0, exports.removeMCPServer)(installedClients);
68
+ clack_1.default.log.info('Removed existing installation.');
69
+ }
70
+ const personalApiKey = await (0, mcp_1.getPersonalApiKey)({ cloudRegion: region });
71
+ await (0, telemetry_1.traceStep)('adding mcp servers', async () => {
72
+ await (0, exports.addMCPServer)(clients, personalApiKey);
73
+ });
74
+ clack_1.default.log.success(`Added the PostHog MCP server to:
75
+ ${clients.map((c) => `- ${c.name}`).join('\n ')} `);
76
+ analytics_1.analytics.capture('wizard interaction', {
77
+ action: 'added mcp servers',
78
+ clients: clients.map((c) => c.name),
79
+ integration,
80
+ });
81
+ return clients.map((c) => c.name);
82
+ };
83
+ exports.addMCPServerToClientsStep = addMCPServerToClientsStep;
84
+ const removeMCPServerFromClientsStep = async ({ integration, }) => {
85
+ const installedClients = await (0, exports.getInstalledClients)();
86
+ if (installedClients.length === 0) {
87
+ analytics_1.analytics.capture('wizard interaction', {
88
+ action: 'no mcp servers to remove',
89
+ integration,
90
+ });
91
+ return [];
92
+ }
93
+ const removeServers = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
94
+ message: `Found the PostHog MCP server in ${installedClients.length} clients. Would you like to remove it?`,
95
+ options: [
96
+ {
97
+ value: true,
98
+ label: 'Yes',
99
+ hint: `Remove PostHog MCP server`,
100
+ },
101
+ {
102
+ value: false,
103
+ label: 'No',
104
+ hint: 'Keep the MCP server configuration',
105
+ },
106
+ ],
107
+ }), integration);
108
+ if (!removeServers) {
109
+ analytics_1.analytics.capture('wizard interaction', {
110
+ action: 'declined to remove mcp servers',
111
+ clients: installedClients.map((c) => c.name),
112
+ integration,
113
+ });
114
+ await (0, clack_utils_1.abort)('The MCP server was not removed.');
115
+ return [];
116
+ }
117
+ const results = await (0, telemetry_1.traceStep)('removing mcp servers', async () => {
118
+ await (0, exports.removeMCPServer)(installedClients);
119
+ return installedClients.map((c) => c.name);
120
+ });
121
+ analytics_1.analytics.capture('wizard interaction', {
122
+ action: 'removed mcp servers',
123
+ clients: results,
124
+ integration,
125
+ });
126
+ return results;
127
+ };
128
+ exports.removeMCPServerFromClientsStep = removeMCPServerFromClientsStep;
129
+ const getInstalledClients = async () => {
130
+ const clients = (0, exports.getSupportedClients)();
131
+ const installedClients = [];
132
+ for (const client of clients) {
133
+ if (await client.isServerInstalled()) {
134
+ installedClients.push(client);
135
+ }
136
+ }
137
+ return installedClients;
138
+ };
139
+ exports.getInstalledClients = getInstalledClients;
140
+ const addMCPServer = async (clients, personalApiKey) => {
141
+ for (const client of clients) {
142
+ await client.addServer(personalApiKey);
143
+ }
144
+ };
145
+ exports.addMCPServer = addMCPServer;
146
+ const removeMCPServer = async (clients) => {
147
+ for (const client of clients) {
148
+ await client.removeServer();
149
+ }
150
+ };
151
+ exports.removeMCPServer = removeMCPServer;
152
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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 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"]}
@@ -2,3 +2,5 @@ export * from './add-editor-rules';
2
2
  export * from './create-pr';
3
3
  export * from './run-prettier';
4
4
  export * from './add-or-update-environment-variables';
5
+ export * from './add-mcp-server-to-clients';
6
+ export * from './upload-environment-variables';
@@ -18,4 +18,6 @@ __exportStar(require("./add-editor-rules"), exports);
18
18
  __exportStar(require("./create-pr"), exports);
19
19
  __exportStar(require("./run-prettier"), exports);
20
20
  __exportStar(require("./add-or-update-environment-variables"), exports);
21
+ __exportStar(require("./add-mcp-server-to-clients"), exports);
22
+ __exportStar(require("./upload-environment-variables"), exports);
21
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/steps/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,8CAA4B;AAC5B,iDAA+B;AAC/B,wEAAsD","sourcesContent":["export * from './add-editor-rules';\nexport * from './create-pr';\nexport * from './run-prettier';\nexport * from './add-or-update-environment-variables';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/steps/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,8CAA4B;AAC5B,iDAA+B;AAC/B,wEAAsD;AACtD,8DAA4C;AAC5C,iEAA+C","sourcesContent":["export * from './add-editor-rules';\nexport * from './create-pr';\nexport * from './run-prettier';\nexport * from './add-or-update-environment-variables';\nexport * from './add-mcp-server-to-clients';\nexport * from './upload-environment-variables';\n"]}
@@ -98,7 +98,10 @@ async function runSvelteWizard(options) {
98
98
  installDir: options.installDir,
99
99
  rulesName: 'svelte-rules.md',
100
100
  integration: constants_1.Integration.svelte,
101
- default: options.default,
101
+ });
102
+ await (0, steps_1.addMCPServerToClientsStep)({
103
+ cloudRegion,
104
+ integration: constants_1.Integration.svelte,
102
105
  });
103
106
  const outroMessage = (0, messages_1.getOutroMessage)({
104
107
  options,
@@ -1 +1 @@
1
- {"version":3,"file":"svelte-wizard.js","sourceRoot":"","sources":["../../../src/svelte/svelte-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n\nimport {\n abort,\n askForAIConsent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n} from '../utils/clack-utils';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport clack from '../utils/clack';\nimport { Integration } from '../lib/constants';\nimport { getSvelteDocumentation } from './docs';\nimport { analytics } from '../utils/analytics';\nimport {\n generateFileChangesForIntegration,\n getFilesToChange,\n getRelevantFilesForIntegration,\n} from '../utils/file-utils';\nimport type { WizardOptions } from '../utils/types';\nimport { askForCloudRegion } from '../utils/clack-utils';\nimport { addEditorRulesStep } from '../steps/add-editor-rules';\nimport { getOutroMessage } from '../lib/messages';\nimport { addOrUpdateEnvironmentVariablesStep, runPrettierStep } from '../steps';\n\nexport async function runSvelteWizard(options: WizardOptions): Promise<void> {\n printWelcome({\n wizardName: 'PostHog Svelte wizard',\n });\n\n const aiConsent = await askForAIConsent(options);\n\n if (!aiConsent) {\n await abort(\n 'The Svelte wizard requires AI to get setup right now. Please view the docs to setup Svelte manually instead: https://posthog.com/docs/libraries/svelte',\n 0,\n );\n }\n\n const cloudRegion = options.cloudRegion ?? (await askForCloudRegion());\n\n const typeScriptDetected = isUsingTypeScript(options);\n\n await confirmContinueIfNoOrDirtyGitRepo(options);\n\n const packageJson = await getPackageDotJson(options);\n\n await ensurePackageIsInstalled(packageJson, '@sveltejs/kit', '@sveltejs/kit');\n\n const svelteVersion = getPackageVersion('@sveltejs/kit', packageJson);\n\n if (svelteVersion) {\n analytics.setTag('svelte-version', svelteVersion);\n }\n\n const { projectApiKey, wizardHash, host } = await getOrAskForProjectData({\n ...options,\n cloudRegion,\n });\n\n const sdkAlreadyInstalled = hasPackageInstalled('posthog-js', packageJson);\n\n analytics.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n const { packageManager: packageManagerFromInstallStep } =\n await installPackage({\n packageName: 'posthog-js',\n packageNameDisplayLabel: 'posthog-js',\n alreadyInstalled: !!packageJson?.dependencies?.['posthog-js'],\n forceInstall: options.forceInstall,\n askBeforeUpdating: false,\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n await installPackage({\n packageName: 'posthog-node',\n packageNameDisplayLabel: 'posthog-node',\n packageManager: packageManagerFromInstallStep,\n alreadyInstalled: !!packageJson?.dependencies?.['posthog-node'],\n forceInstall: options.forceInstall,\n askBeforeUpdating: false,\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const installationDocumentation = getSvelteDocumentation({\n language: typeScriptDetected ? 'typescript' : 'javascript',\n });\n\n clack.log.info(`Reviewing PostHog documentation for Svelte`);\n\n const filesToChange = await getFilesToChange({\n integration: Integration.svelte,\n relevantFiles,\n documentation: installationDocumentation,\n wizardHash,\n cloudRegion,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.svelte,\n filesToChange,\n wizardHash,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\n });\n\n const { relativeEnvFilePath, addedEnvVariables } =\n await addOrUpdateEnvironmentVariablesStep({\n variables: {\n ['PUBLIC_POSTHOG_KEY']: projectApiKey,\n ['PUBLIC_POSTHOG_HOST']: host,\n },\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager(options));\n\n await runPrettierStep({\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const addedEditorRules = await addEditorRulesStep({\n installDir: options.installDir,\n rulesName: 'svelte-rules.md',\n integration: Integration.svelte,\n default: options.default,\n });\n\n const outroMessage = getOutroMessage({\n options,\n integration: Integration.svelte,\n cloudRegion,\n addedEditorRules,\n packageManager: packageManagerForOutro,\n envFileChanged: addedEnvVariables ? relativeEnvFilePath : undefined,\n uploadedEnvVars: [],\n });\n\n clack.outro(outroMessage);\n\n await analytics.shutdown('success');\n}\n"]}
1
+ {"version":3,"file":"svelte-wizard.js","sourceRoot":"","sources":["../../../src/svelte/svelte-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n\nimport {\n abort,\n askForAIConsent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n} from '../utils/clack-utils';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport clack from '../utils/clack';\nimport { Integration } from '../lib/constants';\nimport { getSvelteDocumentation } from './docs';\nimport { analytics } from '../utils/analytics';\nimport {\n generateFileChangesForIntegration,\n getFilesToChange,\n getRelevantFilesForIntegration,\n} from '../utils/file-utils';\nimport type { WizardOptions } from '../utils/types';\nimport { askForCloudRegion } from '../utils/clack-utils';\nimport { addEditorRulesStep } from '../steps/add-editor-rules';\nimport { getOutroMessage } from '../lib/messages';\nimport {\n addMCPServerToClientsStep,\n addOrUpdateEnvironmentVariablesStep,\n runPrettierStep,\n} from '../steps';\n\nexport async function runSvelteWizard(options: WizardOptions): Promise<void> {\n printWelcome({\n wizardName: 'PostHog Svelte wizard',\n });\n\n const aiConsent = await askForAIConsent(options);\n\n if (!aiConsent) {\n await abort(\n 'The Svelte wizard requires AI to get setup right now. Please view the docs to setup Svelte manually instead: https://posthog.com/docs/libraries/svelte',\n 0,\n );\n }\n\n const cloudRegion = options.cloudRegion ?? (await askForCloudRegion());\n\n const typeScriptDetected = isUsingTypeScript(options);\n\n await confirmContinueIfNoOrDirtyGitRepo(options);\n\n const packageJson = await getPackageDotJson(options);\n\n await ensurePackageIsInstalled(packageJson, '@sveltejs/kit', '@sveltejs/kit');\n\n const svelteVersion = getPackageVersion('@sveltejs/kit', packageJson);\n\n if (svelteVersion) {\n analytics.setTag('svelte-version', svelteVersion);\n }\n\n const { projectApiKey, wizardHash, host } = await getOrAskForProjectData({\n ...options,\n cloudRegion,\n });\n\n const sdkAlreadyInstalled = hasPackageInstalled('posthog-js', packageJson);\n\n analytics.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n const { packageManager: packageManagerFromInstallStep } =\n await installPackage({\n packageName: 'posthog-js',\n packageNameDisplayLabel: 'posthog-js',\n alreadyInstalled: !!packageJson?.dependencies?.['posthog-js'],\n forceInstall: options.forceInstall,\n askBeforeUpdating: false,\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n await installPackage({\n packageName: 'posthog-node',\n packageNameDisplayLabel: 'posthog-node',\n packageManager: packageManagerFromInstallStep,\n alreadyInstalled: !!packageJson?.dependencies?.['posthog-node'],\n forceInstall: options.forceInstall,\n askBeforeUpdating: false,\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const installationDocumentation = getSvelteDocumentation({\n language: typeScriptDetected ? 'typescript' : 'javascript',\n });\n\n clack.log.info(`Reviewing PostHog documentation for Svelte`);\n\n const filesToChange = await getFilesToChange({\n integration: Integration.svelte,\n relevantFiles,\n documentation: installationDocumentation,\n wizardHash,\n cloudRegion,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.svelte,\n filesToChange,\n wizardHash,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\n });\n\n const { relativeEnvFilePath, addedEnvVariables } =\n await addOrUpdateEnvironmentVariablesStep({\n variables: {\n ['PUBLIC_POSTHOG_KEY']: projectApiKey,\n ['PUBLIC_POSTHOG_HOST']: host,\n },\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager(options));\n\n await runPrettierStep({\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const addedEditorRules = await addEditorRulesStep({\n installDir: options.installDir,\n rulesName: 'svelte-rules.md',\n integration: Integration.svelte,\n });\n\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: Integration.svelte,\n });\n\n const outroMessage = getOutroMessage({\n options,\n integration: Integration.svelte,\n cloudRegion,\n addedEditorRules,\n packageManager: packageManagerForOutro,\n envFileChanged: addedEnvVariables ? relativeEnvFilePath : undefined,\n uploadedEnvVars: [],\n });\n\n clack.outro(outroMessage);\n\n await analytics.shutdown('success');\n}\n"]}
@@ -84,7 +84,7 @@ export declare function isUsingTypeScript({ installDir, }: Pick<WizardOptions, '
84
84
  * @param options wizard options
85
85
  * @returns project data (token, url)
86
86
  */
87
- export declare function getOrAskForProjectData(_options: WizardOptions & {
87
+ export declare function getOrAskForProjectData(_options: Pick<WizardOptions, 'signup'> & {
88
88
  cloudRegion: CloudRegion;
89
89
  }): Promise<{
90
90
  wizardHash: string;