@posthog/wizard 1.14.0 → 1.16.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.
Files changed (76) hide show
  1. package/dist/bin.js +17 -4
  2. package/dist/bin.js.map +1 -1
  3. package/dist/src/__tests__/run.test.js +1 -0
  4. package/dist/src/__tests__/run.test.js.map +1 -1
  5. package/dist/src/astro/astro-wizard.js +5 -3
  6. package/dist/src/astro/astro-wizard.js.map +1 -1
  7. package/dist/src/lib/agent-interface.d.ts +27 -0
  8. package/dist/src/lib/agent-interface.js +161 -0
  9. package/dist/src/lib/agent-interface.js.map +1 -0
  10. package/dist/src/lib/api.d.ts +75 -0
  11. package/dist/src/lib/api.js +102 -0
  12. package/dist/src/lib/api.js.map +1 -0
  13. package/dist/src/lib/constants.d.ts +12 -0
  14. package/dist/src/lib/constants.js +15 -1
  15. package/dist/src/lib/constants.js.map +1 -1
  16. package/dist/src/mcp.d.ts +4 -1
  17. package/dist/src/mcp.js +6 -3
  18. package/dist/src/mcp.js.map +1 -1
  19. package/dist/src/nextjs/event-setup.js +5 -3
  20. package/dist/src/nextjs/event-setup.js.map +1 -1
  21. package/dist/src/nextjs/nextjs-wizard-agent.d.ts +5 -0
  22. package/dist/src/nextjs/nextjs-wizard-agent.js +146 -0
  23. package/dist/src/nextjs/nextjs-wizard-agent.js.map +1 -0
  24. package/dist/src/nextjs/nextjs-wizard.js +5 -3
  25. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  26. package/dist/src/react/react-wizard.js +5 -3
  27. package/dist/src/react/react-wizard.js.map +1 -1
  28. package/dist/src/react-native/react-native-wizard.js +5 -3
  29. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  30. package/dist/src/run.js +69 -2
  31. package/dist/src/run.js.map +1 -1
  32. package/dist/src/steps/add-mcp-server-to-clients/MCPClient.d.ts +8 -8
  33. package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js +16 -13
  34. package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js.map +1 -1
  35. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.js +1 -1
  36. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.js.map +1 -1
  37. package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.d.ts +3 -3
  38. package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.js +12 -8
  39. package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.js.map +1 -1
  40. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.d.ts +1 -1
  41. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +2 -2
  42. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js.map +1 -1
  43. package/dist/src/steps/add-mcp-server-to-clients/defaults.d.ts +1 -1
  44. package/dist/src/steps/add-mcp-server-to-clients/defaults.js +3 -2
  45. package/dist/src/steps/add-mcp-server-to-clients/defaults.js.map +1 -1
  46. package/dist/src/steps/add-mcp-server-to-clients/index.d.ts +7 -5
  47. package/dist/src/steps/add-mcp-server-to-clients/index.js +16 -14
  48. package/dist/src/steps/add-mcp-server-to-clients/index.js.map +1 -1
  49. package/dist/src/svelte/svelte-wizard.js +5 -3
  50. package/dist/src/svelte/svelte-wizard.js.map +1 -1
  51. package/dist/src/utils/__tests__/analytics.test.js +9 -0
  52. package/dist/src/utils/__tests__/analytics.test.js.map +1 -1
  53. package/dist/src/utils/analytics.d.ts +2 -0
  54. package/dist/src/utils/analytics.js +18 -1
  55. package/dist/src/utils/analytics.js.map +1 -1
  56. package/dist/src/utils/clack-utils.d.ts +2 -1
  57. package/dist/src/utils/clack-utils.js +31 -60
  58. package/dist/src/utils/clack-utils.js.map +1 -1
  59. package/dist/src/utils/errors.d.ts +3 -0
  60. package/dist/src/utils/errors.js +11 -0
  61. package/dist/src/utils/errors.js.map +1 -0
  62. package/dist/src/utils/file-utils.d.ts +9 -6
  63. package/dist/src/utils/file-utils.js +9 -6
  64. package/dist/src/utils/file-utils.js.map +1 -1
  65. package/dist/src/utils/oauth.d.ts +35 -0
  66. package/dist/src/utils/oauth.js +212 -0
  67. package/dist/src/utils/oauth.js.map +1 -0
  68. package/dist/src/utils/query.d.ts +3 -2
  69. package/dist/src/utils/query.js +48 -3
  70. package/dist/src/utils/query.js.map +1 -1
  71. package/dist/src/utils/types.d.ts +1 -1
  72. package/dist/src/utils/types.js.map +1 -1
  73. package/dist/src/utils/urls.d.ts +2 -0
  74. package/dist/src/utils/urls.js +24 -4
  75. package/dist/src/utils/urls.js.map +1 -1
  76. package/package.json +6 -2
@@ -50,8 +50,8 @@ 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
- async addServer(apiKey, selectedFeatures) {
54
- return this._addServerType(apiKey, 'sse', selectedFeatures);
53
+ async addServer(apiKey, selectedFeatures, local) {
54
+ return this._addServerType(apiKey, 'sse', selectedFeatures, local);
55
55
  }
56
56
  }
57
57
  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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;IAED,KAAK,CAAC,SAAS,CACb,MAAc,EACd,gBAA2B;QAE3B,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;IAC9D,CAAC;CACF;AAvBD,0CAuBC","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 async addServer(\n apiKey: string,\n selectedFeatures?: string[],\n ): Promise<{ success: boolean }> {\n return this._addServerType(apiKey, 'sse', selectedFeatures);\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;IAED,KAAK,CAAC,SAAS,CACb,MAAc,EACd,gBAA2B,EAC3B,KAAe;QAEf,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC;IACrE,CAAC;CACF;AAxBD,0CAwBC","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 async addServer(\n apiKey: string,\n selectedFeatures?: string[],\n local?: boolean,\n ): Promise<{ success: boolean }> {\n return this._addServerType(apiKey, 'sse', selectedFeatures, local);\n }\n}\n"]}
@@ -61,7 +61,7 @@ export declare const AVAILABLE_FEATURES: {
61
61
  };
62
62
  export declare const ALL_FEATURE_VALUES: string[];
63
63
  type MCPServerType = 'sse' | 'streamable-http';
64
- export declare const getDefaultServerConfig: (apiKey: string, type: MCPServerType, selectedFeatures?: string[]) => {
64
+ export declare const getDefaultServerConfig: (apiKey: string, type: MCPServerType, selectedFeatures?: string[], local?: boolean) => {
65
65
  command: string;
66
66
  args: string[];
67
67
  env: {
@@ -61,8 +61,9 @@ exports.AVAILABLE_FEATURES = {
61
61
  exports.ALL_FEATURE_VALUES = Object.values(exports.AVAILABLE_FEATURES)
62
62
  .flat()
63
63
  .map((feature) => feature.value);
64
- const getDefaultServerConfig = (apiKey, type, selectedFeatures) => {
65
- const baseUrl = `https://mcp.posthog.com/${type === 'sse' ? 'sse' : 'mcp'}`;
64
+ const getDefaultServerConfig = (apiKey, type, selectedFeatures, local) => {
65
+ const host = local ? 'localhost:8787' : 'mcp.posthog.com';
66
+ const baseUrl = `${host}/${type === 'sse' ? 'sse' : 'mcp'}`;
66
67
  const isAllFeaturesSelected = selectedFeatures &&
67
68
  selectedFeatures.length === exports.ALL_FEATURE_VALUES.length &&
68
69
  exports.ALL_FEATURE_VALUES.every((feature) => selectedFeatures.includes(feature));
@@ -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;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;AAEJ,QAAA,kBAAkB,GAAG;IAChC,kBAAkB,EAAE;QAClB;YACE,KAAK,EAAE,YAAY;YACnB,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,mCAAmC;SAC1C;QACD;YACE,KAAK,EAAE,UAAU;YACjB,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,oCAAoC;SAC3C;QACD;YACE,KAAK,EAAE,aAAa;YACpB,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,yBAAyB;SAChC;QACD;YACE,KAAK,EAAE,eAAe;YACtB,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE,6BAA6B;SACpC;KACF;IACD,mBAAmB,EAAE;QACnB;YACE,KAAK,EAAE,gBAAgB;YACvB,KAAK,EAAE,gBAAgB;YACvB,IAAI,EAAE,gCAAgC;SACvC;QACD,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,yBAAyB,EAAE;KAC5E;IACD,uBAAuB,EAAE;QACvB;YACE,KAAK,EAAE,WAAW;YAClB,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,qCAAqC;SAC5C;QACD;YACE,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE,8BAA8B;SACrC;KACF;CACF,CAAC;AAEW,QAAA,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,0BAAkB,CAAC;KAChE,IAAI,EAAE;KACN,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAI5B,MAAM,sBAAsB,GAAG,CACpC,MAAc,EACd,IAAmB,EACnB,gBAA2B,EAC3B,EAAE;IACF,MAAM,OAAO,GAAG,2BAA2B,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAE5E,MAAM,qBAAqB,GACzB,gBAAgB;QAChB,gBAAgB,CAAC,MAAM,KAAK,0BAAkB,CAAC,MAAM;QACrD,0BAAkB,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5E,MAAM,eAAe,GACnB,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,qBAAqB;QACvE,CAAC,CAAC,GAAG,OAAO,aAAa,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACrD,CAAC,CAAC,OAAO,CAAC;IAEd,OAAO;QACL,OAAO,EAAE,KAAK;QACd,IAAI,EAAE;YACJ,IAAI;YACJ,mBAAmB;YACnB,eAAe;YACf,UAAU;YACV,uCAAuC;SACxC;QACD,GAAG,EAAE;YACH,mBAAmB,EAAE,UAAU,MAAM,EAAE;SACxC;KACF,CAAC;AACJ,CAAC,CAAC;AA9BW,QAAA,sBAAsB,0BA8BjC","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 AVAILABLE_FEATURES = {\n 'Data & Analytics': [\n {\n value: 'dashboards',\n label: 'Dashboards',\n hint: 'Dashboard creation and management',\n },\n {\n value: 'insights',\n label: 'Insights',\n hint: 'Analytics insights and SQL queries',\n },\n {\n value: 'experiments',\n label: 'Experiments',\n hint: 'A/B testing experiments',\n },\n {\n value: 'llm-analytics',\n label: 'LLM Analytics',\n hint: 'LLM usage and cost tracking',\n },\n ],\n 'Development Tools': [\n {\n value: 'error-tracking',\n label: 'Error Tracking',\n hint: 'Error monitoring and debugging',\n },\n { value: 'flags', label: 'Feature Flags', hint: 'Feature flag management' },\n ],\n 'Platform & Management': [\n {\n value: 'workspace',\n label: 'Workspace',\n hint: 'Organization and project management',\n },\n {\n value: 'docs',\n label: 'Documentation',\n hint: 'PostHog documentation search',\n },\n ],\n};\n\nexport const ALL_FEATURE_VALUES = Object.values(AVAILABLE_FEATURES)\n .flat()\n .map((feature) => feature.value);\n\ntype MCPServerType = 'sse' | 'streamable-http';\n\nexport const getDefaultServerConfig = (\n apiKey: string,\n type: MCPServerType,\n selectedFeatures?: string[],\n) => {\n const baseUrl = `https://mcp.posthog.com/${type === 'sse' ? 'sse' : 'mcp'}`;\n\n const isAllFeaturesSelected =\n selectedFeatures &&\n selectedFeatures.length === ALL_FEATURE_VALUES.length &&\n ALL_FEATURE_VALUES.every((feature) => selectedFeatures.includes(feature));\n\n const urlWithFeatures =\n selectedFeatures && selectedFeatures.length > 0 && !isAllFeaturesSelected\n ? `${baseUrl}?features=${selectedFeatures.join(',')}`\n : baseUrl;\n\n return {\n command: 'npx',\n args: [\n '-y',\n 'mcp-remote@latest',\n urlWithFeatures,\n '--header',\n `Authorization:\\${POSTHOG_AUTH_HEADER}`,\n ],\n env: {\n POSTHOG_AUTH_HEADER: `Bearer ${apiKey}`,\n },\n };\n};\n"]}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../../src/steps/add-mcp-server-to-clients/defaults.ts"],"names":[],"mappings":"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","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 AVAILABLE_FEATURES = {\n 'Data & Analytics': [\n {\n value: 'dashboards',\n label: 'Dashboards',\n hint: 'Dashboard creation and management',\n },\n {\n value: 'insights',\n label: 'Insights',\n hint: 'Analytics insights and SQL queries',\n },\n {\n value: 'experiments',\n label: 'Experiments',\n hint: 'A/B testing experiments',\n },\n {\n value: 'llm-analytics',\n label: 'LLM Analytics',\n hint: 'LLM usage and cost tracking',\n },\n ],\n 'Development Tools': [\n {\n value: 'error-tracking',\n label: 'Error Tracking',\n hint: 'Error monitoring and debugging',\n },\n { value: 'flags', label: 'Feature Flags', hint: 'Feature flag management' },\n ],\n 'Platform & Management': [\n {\n value: 'workspace',\n label: 'Workspace',\n hint: 'Organization and project management',\n },\n {\n value: 'docs',\n label: 'Documentation',\n hint: 'PostHog documentation search',\n },\n ],\n};\n\nexport const ALL_FEATURE_VALUES = Object.values(AVAILABLE_FEATURES)\n .flat()\n .map((feature) => feature.value);\n\ntype MCPServerType = 'sse' | 'streamable-http';\n\nexport const getDefaultServerConfig = (\n apiKey: string,\n type: MCPServerType,\n selectedFeatures?: string[],\n local?: boolean,\n) => {\n const host = local ? 'localhost:8787' : 'mcp.posthog.com';\n const baseUrl = `${host}/${type === 'sse' ? 'sse' : 'mcp'}`;\n\n const isAllFeaturesSelected =\n selectedFeatures &&\n selectedFeatures.length === ALL_FEATURE_VALUES.length &&\n ALL_FEATURE_VALUES.every((feature) => selectedFeatures.includes(feature));\n\n const urlWithFeatures =\n selectedFeatures && selectedFeatures.length > 0 && !isAllFeaturesSelected\n ? `${baseUrl}?features=${selectedFeatures.join(',')}`\n : baseUrl;\n\n return {\n command: 'npx',\n args: [\n '-y',\n 'mcp-remote@latest',\n urlWithFeatures,\n '--header',\n `Authorization:\\${POSTHOG_AUTH_HEADER}`,\n ],\n env: {\n POSTHOG_AUTH_HEADER: `Bearer ${apiKey}`,\n },\n };\n};\n"]}
@@ -2,14 +2,16 @@ import type { Integration } from '../../lib/constants';
2
2
  import { MCPClient } from './MCPClient';
3
3
  import type { CloudRegion } from '../../utils/types';
4
4
  export declare const getSupportedClients: () => Promise<MCPClient[]>;
5
- export declare const addMCPServerToClientsStep: ({ integration, cloudRegion, askPermission, }: {
5
+ export declare const addMCPServerToClientsStep: ({ integration, cloudRegion, askPermission, local, }: {
6
6
  integration?: Integration;
7
7
  cloudRegion?: CloudRegion;
8
8
  askPermission?: boolean;
9
+ local?: boolean;
9
10
  }) => Promise<string[]>;
10
- export declare const removeMCPServerFromClientsStep: ({ integration, }: {
11
+ export declare const removeMCPServerFromClientsStep: ({ integration, local, }: {
11
12
  integration?: Integration;
13
+ local?: boolean;
12
14
  }) => Promise<string[]>;
13
- export declare const getInstalledClients: () => Promise<MCPClient[]>;
14
- export declare const addMCPServer: (clients: MCPClient[], personalApiKey: string, selectedFeatures?: string[]) => Promise<void>;
15
- export declare const removeMCPServer: (clients: MCPClient[]) => Promise<void>;
15
+ export declare const getInstalledClients: (local?: boolean) => Promise<MCPClient[]>;
16
+ export declare const addMCPServer: (clients: MCPClient[], personalApiKey: string, selectedFeatures?: string[], local?: boolean) => Promise<void>;
17
+ export declare const removeMCPServer: (clients: MCPClient[], local?: boolean) => Promise<void>;
@@ -33,11 +33,13 @@ const getSupportedClients = async () => {
33
33
  return supportedClients;
34
34
  };
35
35
  exports.getSupportedClients = getSupportedClients;
36
- const addMCPServerToClientsStep = async ({ integration, cloudRegion, askPermission = true, }) => {
36
+ const addMCPServerToClientsStep = async ({ integration, cloudRegion, askPermission = true, local = false, }) => {
37
37
  const region = cloudRegion ?? (await (0, clack_utils_1.askForCloudRegion)());
38
38
  const hasPermission = askPermission
39
39
  ? await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
40
- message: 'Would you like to install the MCP server to use PostHog in your editor?',
40
+ message: local
41
+ ? 'Would you like to install the local development MCP server?'
42
+ : 'Would you like to install the MCP server to use PostHog in your editor?',
41
43
  options: [
42
44
  { value: true, label: 'Yes' },
43
45
  { value: false, label: 'No' },
@@ -66,7 +68,7 @@ const addMCPServerToClientsStep = async ({ integration, cloudRegion, askPermissi
66
68
  required: true,
67
69
  }), integration);
68
70
  const clients = supportedClients.filter((client) => selectedClientNames.includes(client.name));
69
- const installedClients = await (0, exports.getInstalledClients)();
71
+ const installedClients = await (0, exports.getInstalledClients)(local);
70
72
  if (installedClients.length > 0) {
71
73
  clack_1.default.log.warn(`The MCP server is already configured for:
72
74
  ${installedClients.map((c) => `- ${c.name}`).join('\n ')}`);
@@ -93,12 +95,12 @@ const addMCPServerToClientsStep = async ({ integration, cloudRegion, askPermissi
93
95
  });
94
96
  return [];
95
97
  }
96
- await (0, exports.removeMCPServer)(installedClients);
98
+ await (0, exports.removeMCPServer)(installedClients, local);
97
99
  clack_1.default.log.info('Removed existing installation.');
98
100
  }
99
101
  const personalApiKey = await (0, mcp_1.getPersonalApiKey)({ cloudRegion: region });
100
102
  await (0, telemetry_1.traceStep)('adding mcp servers', async () => {
101
- await (0, exports.addMCPServer)(clients, personalApiKey, selectedFeatures);
103
+ await (0, exports.addMCPServer)(clients, personalApiKey, selectedFeatures, local);
102
104
  });
103
105
  clack_1.default.log.success(`Added the MCP server to:
104
106
  ${clients.map((c) => `- ${c.name}`).join('\n ')} `);
@@ -110,8 +112,8 @@ const addMCPServerToClientsStep = async ({ integration, cloudRegion, askPermissi
110
112
  return clients.map((c) => c.name);
111
113
  };
112
114
  exports.addMCPServerToClientsStep = addMCPServerToClientsStep;
113
- const removeMCPServerFromClientsStep = async ({ integration, }) => {
114
- const installedClients = await (0, exports.getInstalledClients)();
115
+ const removeMCPServerFromClientsStep = async ({ integration, local = false, }) => {
116
+ const installedClients = await (0, exports.getInstalledClients)(local);
115
117
  if (installedClients.length === 0) {
116
118
  analytics_1.analytics.capture('wizard interaction', {
117
119
  action: 'no mcp servers to remove',
@@ -137,7 +139,7 @@ const removeMCPServerFromClientsStep = async ({ integration, }) => {
137
139
  return [];
138
140
  }
139
141
  const results = await (0, telemetry_1.traceStep)('removing mcp servers', async () => {
140
- await (0, exports.removeMCPServer)(clientsToRemove);
142
+ await (0, exports.removeMCPServer)(clientsToRemove, local);
141
143
  return clientsToRemove.map((c) => c.name);
142
144
  });
143
145
  analytics_1.analytics.capture('wizard interaction', {
@@ -148,26 +150,26 @@ const removeMCPServerFromClientsStep = async ({ integration, }) => {
148
150
  return results;
149
151
  };
150
152
  exports.removeMCPServerFromClientsStep = removeMCPServerFromClientsStep;
151
- const getInstalledClients = async () => {
153
+ const getInstalledClients = async (local) => {
152
154
  const clients = await (0, exports.getSupportedClients)();
153
155
  const installedClients = [];
154
156
  for (const client of clients) {
155
- if (await client.isServerInstalled()) {
157
+ if (await client.isServerInstalled(local)) {
156
158
  installedClients.push(client);
157
159
  }
158
160
  }
159
161
  return installedClients;
160
162
  };
161
163
  exports.getInstalledClients = getInstalledClients;
162
- const addMCPServer = async (clients, personalApiKey, selectedFeatures) => {
164
+ const addMCPServer = async (clients, personalApiKey, selectedFeatures, local) => {
163
165
  for (const client of clients) {
164
- await client.addServer(personalApiKey, selectedFeatures);
166
+ await client.addServer(personalApiKey, selectedFeatures, local);
165
167
  }
166
168
  };
167
169
  exports.addMCPServer = addMCPServer;
168
- const removeMCPServer = async (clients) => {
170
+ const removeMCPServer = async (clients, local) => {
169
171
  for (const client of clients) {
170
- await client.removeServer();
172
+ await client.removeServer(local);
171
173
  }
172
174
  };
173
175
  exports.removeMCPServer = removeMCPServer;
@@ -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,kDAA0B;AAC1B,yDAA8E;AAE9E,6CAAmD;AACnD,6CAAmD;AACnD,mCAA8C;AAE9C,uDAA4D;AAC5D,qEAAsE;AACtE,uCAA0C;AAC1C,yCAAoE;AAE7D,MAAM,mBAAmB,GAAG,KAAK,IAA0B,EAAE;IAClE,MAAM,UAAU,GAAG;QACjB,IAAI,wBAAe,EAAE;QACrB,IAAI,wBAAe,EAAE;QACrB,IAAI,iCAAmB,EAAE;QACzB,IAAI,2CAAsB,EAAE;QAC5B,IAAI,eAAS,EAAE;KAChB,CAAC;IACF,MAAM,gBAAgB,GAAgB,EAAE,CAAC;IAEzC,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,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;AAjBW,QAAA,mBAAmB,uBAiB9B;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,MAAM,aAAa,GAAG,aAAa;QACjC,CAAC,CAAC,MAAM,IAAA,8BAAgB,EACpB,eAAK,CAAC,MAAM,CAAC;YACX,OAAO,EACL,yEAAyE;YAC3E,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,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC5D,MAAM,gBAAgB,GAAG,MAAM,IAAA,8BAAgB,EAC7C,gBAAgB,CAAC;QACf,OAAO,EAAE,qDAAqD,eAAK,CAAC,GAAG,CACrE,kEAAkE,CACnE,EAAE;QACH,OAAO,EAAE,6BAAkB;QAC3B,aAAa,EAAE,CAAC,GAAG,6BAAkB,CAAC;QACtC,QAAQ,EAAE,KAAK;KAChB,CAAC,EACF,WAAW,CACZ,CAAC;IAEF,MAAM,gBAAgB,GAAG,MAAM,IAAA,2BAAmB,GAAE,CAAC;IAErD,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACvD,MAAM,mBAAmB,GAAG,MAAM,IAAA,8BAAgB,EAChD,WAAW,CAAC;QACV,OAAO,EAAE,0DAA0D,eAAK,CAAC,GAAG,CAC1E,kEAAkE,CACnE,EAAE;QACH,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACzC,KAAK,EAAE,MAAM,CAAC,IAAI;YAClB,KAAK,EAAE,MAAM,CAAC,IAAI;SACnB,CAAC,CAAC;QACH,aAAa,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5D,QAAQ,EAAE,IAAI;KACf,CAAC,EACF,WAAW,CACZ,CAAC;IAEF,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CACjD,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAC1C,CAAC;IAEF,MAAM,gBAAgB,GAAG,MAAM,IAAA,2BAAmB,GAAE,CAAC;IAErD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,eAAK,CAAC,GAAG,CAAC,IAAI,CACZ;IACF,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,IAAA,8BAAgB,EACtC,eAAK,CAAC,MAAM,CAAC;YACX,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,EACF,WAAW,CACZ,CAAC;QAEF,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,EAAE,gBAAgB,CAAC,CAAC;IAChE,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;AA3HW,QAAA,yBAAyB,6BA2HpC;AAEK,MAAM,8BAA8B,GAAG,KAAK,EAAE,EACnD,WAAW,GAGZ,EAAqB,EAAE;IACtB,MAAM,gBAAgB,GAAG,MAAM,IAAA,2BAAmB,GAAE,CAAC;IACrD,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,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACvD,MAAM,mBAAmB,GAAG,MAAM,IAAA,8BAAgB,EAChD,WAAW,CAAC;QACV,OAAO,EAAE,uDAAuD,eAAK,CAAC,GAAG,CACvE,kEAAkE,CACnE,EAAE;QACH,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACzC,KAAK,EAAE,MAAM,CAAC,IAAI;YAClB,KAAK,EAAE,MAAM,CAAC,IAAI;SACnB,CAAC,CAAC;QACH,aAAa,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;KAC7D,CAAC,EACF,WAAW,CACZ,CAAC;IAEF,MAAM,eAAe,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CACzD,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAC1C,CAAC;IAEF,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,qBAAS,CAAC,OAAO,CAAC,oBAAoB,EAAE;YACtC,MAAM,EAAE,qCAAqC;YAC7C,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAS,EAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,IAAA,uBAAe,EAAC,eAAe,CAAC,CAAC;QACvC,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5C,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;AArDW,QAAA,8BAA8B,kCAqDzC;AAEK,MAAM,mBAAmB,GAAG,KAAK,IAA0B,EAAE;IAClE,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAmB,GAAE,CAAC;IAC5C,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;AAXW,QAAA,mBAAmB,uBAW9B;AAEK,MAAM,YAAY,GAAG,KAAK,EAC/B,OAAoB,EACpB,cAAsB,EACtB,gBAA2B,EACZ,EAAE;IACjB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC,CAAC;AARW,QAAA,YAAY,gBAQvB;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 chalk from 'chalk';\nimport { abortIfCancelled, askForCloudRegion } 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';\nimport { ClaudeCodeMCPClient } from './clients/claude-code';\nimport { VisualStudioCodeClient } from './clients/visual-studio-code';\nimport { ZedClient } from './clients/zed';\nimport { AVAILABLE_FEATURES, ALL_FEATURE_VALUES } from './defaults';\n\nexport const getSupportedClients = async (): Promise<MCPClient[]> => {\n const allClients = [\n new CursorMCPClient(),\n new ClaudeMCPClient(),\n new ClaudeCodeMCPClient(),\n new VisualStudioCodeClient(),\n new ZedClient(),\n ];\n const supportedClients: MCPClient[] = [];\n\n for (const client of allClients) {\n if (await client.isClientSupported()) {\n supportedClients.push(client);\n }\n }\n\n return supportedClients;\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 const hasPermission = askPermission\n ? await abortIfCancelled(\n clack.select({\n message:\n 'Would you like to install the 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 { groupMultiselect } = await import('@clack/prompts');\n const selectedFeatures = await abortIfCancelled(\n groupMultiselect({\n message: `Select which PostHog features to enable as tools: ${chalk.dim(\n '(Toggle: Space, Confirm: Enter, Toggle All: A, Cancel: CTRL + C)',\n )}`,\n options: AVAILABLE_FEATURES,\n initialValues: [...ALL_FEATURE_VALUES],\n required: false,\n }),\n integration,\n );\n\n const supportedClients = await getSupportedClients();\n\n const { multiselect } = await import('@clack/prompts');\n const selectedClientNames = await abortIfCancelled(\n multiselect({\n message: `Select which MCP clients to install the MCP server to: ${chalk.dim(\n '(Toggle: Space, Confirm: Enter, Toggle All: A, Cancel: CTRL + C)',\n )}`,\n options: supportedClients.map((client) => ({\n value: client.name,\n label: client.name,\n })),\n initialValues: supportedClients.map((client) => client.name),\n required: true,\n }),\n integration,\n );\n\n const clients = supportedClients.filter((client) =>\n selectedClientNames.includes(client.name),\n );\n\n const installedClients = await getInstalledClients();\n\n if (installedClients.length > 0) {\n clack.log.warn(\n `The MCP server is already configured for:\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, selectedFeatures);\n });\n\n clack.log.success(\n `Added the 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 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 { multiselect } = await import('@clack/prompts');\n const selectedClientNames = await abortIfCancelled(\n multiselect({\n message: `Select which clients to remove the MCP server from: ${chalk.dim(\n '(Toggle: Space, Confirm: Enter, Toggle All: A, Cancel: CTRL + C)',\n )}`,\n options: installedClients.map((client) => ({\n value: client.name,\n label: client.name,\n })),\n initialValues: installedClients.map((client) => client.name),\n }),\n integration,\n );\n\n const clientsToRemove = installedClients.filter((client) =>\n selectedClientNames.includes(client.name),\n );\n\n if (clientsToRemove.length === 0) {\n analytics.capture('wizard interaction', {\n action: 'no mcp servers selected for removal',\n integration,\n });\n return [];\n }\n\n const results = await traceStep('removing mcp servers', async () => {\n await removeMCPServer(clientsToRemove);\n return clientsToRemove.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 = await getSupportedClients();\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 selectedFeatures?: string[],\n): Promise<void> => {\n for (const client of clients) {\n await client.addServer(personalApiKey, selectedFeatures);\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 chalk from 'chalk';\nimport { abortIfCancelled, askForCloudRegion } 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';\nimport { ClaudeCodeMCPClient } from './clients/claude-code';\nimport { VisualStudioCodeClient } from './clients/visual-studio-code';\nimport { ZedClient } from './clients/zed';\nimport { AVAILABLE_FEATURES, ALL_FEATURE_VALUES } from './defaults';\n\nexport const getSupportedClients = async (): Promise<MCPClient[]> => {\n const allClients = [\n new CursorMCPClient(),\n new ClaudeMCPClient(),\n new ClaudeCodeMCPClient(),\n new VisualStudioCodeClient(),\n new ZedClient(),\n ];\n const supportedClients: MCPClient[] = [];\n\n for (const client of allClients) {\n if (await client.isClientSupported()) {\n supportedClients.push(client);\n }\n }\n\n return supportedClients;\n};\n\nexport const addMCPServerToClientsStep = async ({\n integration,\n cloudRegion,\n askPermission = true,\n local = false,\n}: {\n integration?: Integration;\n cloudRegion?: CloudRegion;\n askPermission?: boolean;\n local?: boolean;\n}): Promise<string[]> => {\n const region = cloudRegion ?? (await askForCloudRegion());\n\n const hasPermission = askPermission\n ? await abortIfCancelled(\n clack.select({\n message: local\n ? 'Would you like to install the local development MCP server?'\n : 'Would you like to install the 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 { groupMultiselect } = await import('@clack/prompts');\n const selectedFeatures = await abortIfCancelled(\n groupMultiselect({\n message: `Select which PostHog features to enable as tools: ${chalk.dim(\n '(Toggle: Space, Confirm: Enter, Toggle All: A, Cancel: CTRL + C)',\n )}`,\n options: AVAILABLE_FEATURES,\n initialValues: [...ALL_FEATURE_VALUES],\n required: false,\n }),\n integration,\n );\n\n const supportedClients = await getSupportedClients();\n\n const { multiselect } = await import('@clack/prompts');\n const selectedClientNames = await abortIfCancelled(\n multiselect({\n message: `Select which MCP clients to install the MCP server to: ${chalk.dim(\n '(Toggle: Space, Confirm: Enter, Toggle All: A, Cancel: CTRL + C)',\n )}`,\n options: supportedClients.map((client) => ({\n value: client.name,\n label: client.name,\n })),\n initialValues: supportedClients.map((client) => client.name),\n required: true,\n }),\n integration,\n );\n\n const clients = supportedClients.filter((client) =>\n selectedClientNames.includes(client.name),\n );\n\n const installedClients = await getInstalledClients(local);\n\n if (installedClients.length > 0) {\n clack.log.warn(\n `The MCP server is already configured for:\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, local);\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, selectedFeatures, local);\n });\n\n clack.log.success(\n `Added the 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 local = false,\n}: {\n integration?: Integration;\n local?: boolean;\n}): Promise<string[]> => {\n const installedClients = await getInstalledClients(local);\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 { multiselect } = await import('@clack/prompts');\n const selectedClientNames = await abortIfCancelled(\n multiselect({\n message: `Select which clients to remove the MCP server from: ${chalk.dim(\n '(Toggle: Space, Confirm: Enter, Toggle All: A, Cancel: CTRL + C)',\n )}`,\n options: installedClients.map((client) => ({\n value: client.name,\n label: client.name,\n })),\n initialValues: installedClients.map((client) => client.name),\n }),\n integration,\n );\n\n const clientsToRemove = installedClients.filter((client) =>\n selectedClientNames.includes(client.name),\n );\n\n if (clientsToRemove.length === 0) {\n analytics.capture('wizard interaction', {\n action: 'no mcp servers selected for removal',\n integration,\n });\n return [];\n }\n\n const results = await traceStep('removing mcp servers', async () => {\n await removeMCPServer(clientsToRemove, local);\n return clientsToRemove.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 (\n local?: boolean,\n): Promise<MCPClient[]> => {\n const clients = await getSupportedClients();\n const installedClients: MCPClient[] = [];\n\n for (const client of clients) {\n if (await client.isServerInstalled(local)) {\n installedClients.push(client);\n }\n }\n\n return installedClients;\n};\n\nexport const addMCPServer = async (\n clients: MCPClient[],\n personalApiKey: string,\n selectedFeatures?: string[],\n local?: boolean,\n): Promise<void> => {\n for (const client of clients) {\n await client.addServer(personalApiKey, selectedFeatures, local);\n }\n};\n\nexport const removeMCPServer = async (\n clients: MCPClient[],\n local?: boolean,\n): Promise<void> => {\n for (const client of clients) {\n await client.removeServer(local);\n }\n};\n"]}
@@ -33,7 +33,7 @@ async function runSvelteWizard(options) {
33
33
  if (svelteVersion) {
34
34
  analytics_1.analytics.setTag('svelte-version', svelteVersion);
35
35
  }
36
- const { projectApiKey, wizardHash, host } = await (0, clack_utils_1.getOrAskForProjectData)({
36
+ const { projectApiKey, accessToken, host, projectId } = await (0, clack_utils_1.getOrAskForProjectData)({
37
37
  ...options,
38
38
  cloudRegion,
39
39
  });
@@ -70,16 +70,18 @@ async function runSvelteWizard(options) {
70
70
  integration: constants_1.Integration.svelte,
71
71
  relevantFiles,
72
72
  documentation: installationDocumentation,
73
- wizardHash,
73
+ accessToken,
74
74
  cloudRegion,
75
+ projectId,
75
76
  });
76
77
  await (0, file_utils_1.generateFileChangesForIntegration)({
77
78
  integration: constants_1.Integration.svelte,
78
79
  filesToChange,
79
- wizardHash,
80
+ accessToken,
80
81
  installDir: options.installDir,
81
82
  documentation: installationDocumentation,
82
83
  cloudRegion,
84
+ projectId,
83
85
  });
84
86
  const { relativeEnvFilePath, addedEnvVariables } = await (0, steps_1.addOrUpdateEnvironmentVariablesStep)({
85
87
  variables: {
@@ -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 {\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"]}
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, accessToken, host, projectId } =\n 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 accessToken,\n cloudRegion,\n projectId,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.svelte,\n filesToChange,\n accessToken,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\n projectId,\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"]}
@@ -29,6 +29,7 @@ describe('Analytics', () => {
29
29
  analytics.captureException(error, properties);
30
30
  expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(error, 'test-uuid', {
31
31
  team: 'growth',
32
+ $app_name: 'wizard',
32
33
  ...properties,
33
34
  });
34
35
  });
@@ -39,6 +40,7 @@ describe('Analytics', () => {
39
40
  analytics.captureException(error, properties);
40
41
  expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(error, 'test-uuid', {
41
42
  team: 'growth',
43
+ $app_name: 'wizard',
42
44
  testTag: 'testValue',
43
45
  ...properties,
44
46
  });
@@ -50,6 +52,7 @@ describe('Analytics', () => {
50
52
  analytics.captureException(error);
51
53
  expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(error, distinctId, {
52
54
  team: 'growth',
55
+ $app_name: 'wizard',
53
56
  });
54
57
  });
55
58
  it('should capture exception without properties when not provided', () => {
@@ -57,6 +60,7 @@ describe('Analytics', () => {
57
60
  analytics.captureException(error);
58
61
  expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(error, 'test-uuid', {
59
62
  team: 'growth',
63
+ $app_name: 'wizard',
60
64
  });
61
65
  });
62
66
  it('should merge tags with provided properties', () => {
@@ -67,6 +71,7 @@ describe('Analytics', () => {
67
71
  analytics.captureException(error, properties);
68
72
  expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(error, 'test-uuid', {
69
73
  team: 'growth',
74
+ $app_name: 'wizard',
70
75
  environment: 'test',
71
76
  version: '1.0.0',
72
77
  integration: 'nextjs',
@@ -80,6 +85,7 @@ describe('Analytics', () => {
80
85
  analytics.captureException(error, properties);
81
86
  expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(error, 'test-uuid', {
82
87
  team: 'growth',
88
+ $app_name: 'wizard',
83
89
  integration: 'react',
84
90
  });
85
91
  });
@@ -88,6 +94,7 @@ describe('Analytics', () => {
88
94
  analytics.captureException(error);
89
95
  expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(error, 'test-uuid', {
90
96
  team: 'growth',
97
+ $app_name: 'wizard',
91
98
  });
92
99
  });
93
100
  });
@@ -103,6 +110,7 @@ describe('Analytics', () => {
103
110
  });
104
111
  expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(error, 'test-uuid', {
105
112
  team: 'growth',
113
+ $app_name: 'wizard',
106
114
  integration: 'nextjs',
107
115
  forceInstall: true,
108
116
  debug: false,
@@ -118,6 +126,7 @@ describe('Analytics', () => {
118
126
  analytics.captureException(error);
119
127
  expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(error, distinctId, {
120
128
  team: 'growth',
129
+ $app_name: 'wizard',
121
130
  integration: 'svelte',
122
131
  });
123
132
  });
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.test.js","sourceRoot":"","sources":["../../../../src/utils/__tests__/analytics.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Analytics } from '../analytics';\nimport { PostHog } from 'posthog-node';\nimport { v4 as uuidv4 } from 'uuid';\n\njest.mock('posthog-node');\njest.mock('uuid');\n\nconst mockUuidv4 = uuidv4 as jest.MockedFunction<typeof uuidv4>;\nconst MockedPostHog = PostHog as jest.MockedClass<typeof PostHog>;\n\ndescribe('Analytics', () => {\n let analytics: Analytics;\n let mockPostHogInstance: jest.Mocked<PostHog>;\n\n beforeEach(() => {\n jest.clearAllMocks();\n mockUuidv4.mockReturnValue('test-uuid' as any);\n\n mockPostHogInstance = {\n capture: jest.fn(),\n captureException: jest.fn(),\n alias: jest.fn(),\n shutdown: jest.fn().mockResolvedValue(undefined),\n } as any;\n\n MockedPostHog.mockImplementation(() => mockPostHogInstance);\n\n analytics = new Analytics();\n });\n\n describe('captureException', () => {\n it('should capture exception with error object and properties', () => {\n const error = new Error('Test error');\n const properties = { integration: 'nextjs' };\n\n analytics.captureException(error, properties);\n\n expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(\n error,\n 'test-uuid',\n {\n team: 'growth',\n ...properties,\n },\n );\n });\n\n it('should capture exception with tags included in properties', () => {\n const error = new Error('Test error');\n const properties = { integration: 'nextjs' };\n\n analytics.setTag('testTag', 'testValue');\n analytics.captureException(error, properties);\n\n expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(\n error,\n 'test-uuid',\n {\n team: 'growth',\n testTag: 'testValue',\n ...properties,\n },\n );\n });\n\n it('should capture exception with distinct ID when set', () => {\n const error = new Error('Test error');\n const distinctId = 'user-123';\n\n analytics.setDistinctId(distinctId);\n analytics.captureException(error);\n\n expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(\n error,\n distinctId,\n {\n team: 'growth',\n },\n );\n });\n\n it('should capture exception without properties when not provided', () => {\n const error = new Error('Test error');\n\n analytics.captureException(error);\n\n expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(\n error,\n 'test-uuid',\n {\n team: 'growth',\n },\n );\n });\n\n it('should merge tags with provided properties', () => {\n const error = new Error('Test error');\n const properties = { integration: 'nextjs', step: 'installation' };\n\n analytics.setTag('environment', 'test');\n analytics.setTag('version', '1.0.0');\n analytics.captureException(error, properties);\n\n expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(\n error,\n 'test-uuid',\n {\n team: 'growth',\n environment: 'test',\n version: '1.0.0',\n integration: 'nextjs',\n step: 'installation',\n },\n );\n });\n\n it('should override tags with properties when keys conflict', () => {\n const error = new Error('Test error');\n const properties = { integration: 'react' };\n\n analytics.setTag('integration', 'nextjs');\n analytics.captureException(error, properties);\n\n expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(\n error,\n 'test-uuid',\n {\n team: 'growth',\n integration: 'react',\n },\n );\n });\n\n it('should always include team:growth property in exceptions', () => {\n const error = new Error('Test error');\n\n analytics.captureException(error);\n\n expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(\n error,\n 'test-uuid',\n {\n team: 'growth',\n },\n );\n });\n });\n\n describe('integration with other methods', () => {\n it('should work correctly with setTag and captureException', () => {\n const error = new Error('Test error');\n\n analytics.setTag('integration', 'nextjs');\n analytics.setTag('forceInstall', true);\n analytics.setTag('debug', false);\n\n analytics.captureException(error, {\n arguments: JSON.stringify({ installDir: '/test' }),\n step: 'wizard-execution',\n });\n\n expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(\n error,\n 'test-uuid',\n {\n team: 'growth',\n integration: 'nextjs',\n forceInstall: true,\n debug: false,\n arguments: JSON.stringify({ installDir: '/test' }),\n step: 'wizard-execution',\n },\n );\n });\n\n it('should work correctly with setDistinctId and captureException', () => {\n const error = new Error('Test error');\n const distinctId = 'user-456';\n\n analytics.setDistinctId(distinctId);\n analytics.setTag('integration', 'svelte');\n analytics.captureException(error);\n\n expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(\n error,\n distinctId,\n {\n team: 'growth',\n integration: 'svelte',\n },\n );\n });\n });\n});\n"]}
1
+ {"version":3,"file":"analytics.test.js","sourceRoot":"","sources":["../../../../src/utils/__tests__/analytics.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Analytics } from '../analytics';\nimport { PostHog } from 'posthog-node';\nimport { v4 as uuidv4 } from 'uuid';\n\njest.mock('posthog-node');\njest.mock('uuid');\n\nconst mockUuidv4 = uuidv4 as jest.MockedFunction<typeof uuidv4>;\nconst MockedPostHog = PostHog as jest.MockedClass<typeof PostHog>;\n\ndescribe('Analytics', () => {\n let analytics: Analytics;\n let mockPostHogInstance: jest.Mocked<PostHog>;\n\n beforeEach(() => {\n jest.clearAllMocks();\n mockUuidv4.mockReturnValue('test-uuid' as any);\n\n mockPostHogInstance = {\n capture: jest.fn(),\n captureException: jest.fn(),\n alias: jest.fn(),\n shutdown: jest.fn().mockResolvedValue(undefined),\n } as any;\n\n MockedPostHog.mockImplementation(() => mockPostHogInstance);\n\n analytics = new Analytics();\n });\n\n describe('captureException', () => {\n it('should capture exception with error object and properties', () => {\n const error = new Error('Test error');\n const properties = { integration: 'nextjs' };\n\n analytics.captureException(error, properties);\n\n expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(\n error,\n 'test-uuid',\n {\n team: 'growth',\n $app_name: 'wizard',\n ...properties,\n },\n );\n });\n\n it('should capture exception with tags included in properties', () => {\n const error = new Error('Test error');\n const properties = { integration: 'nextjs' };\n\n analytics.setTag('testTag', 'testValue');\n analytics.captureException(error, properties);\n\n expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(\n error,\n 'test-uuid',\n {\n team: 'growth',\n $app_name: 'wizard',\n testTag: 'testValue',\n ...properties,\n },\n );\n });\n\n it('should capture exception with distinct ID when set', () => {\n const error = new Error('Test error');\n const distinctId = 'user-123';\n\n analytics.setDistinctId(distinctId);\n analytics.captureException(error);\n\n expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(\n error,\n distinctId,\n {\n team: 'growth',\n $app_name: 'wizard',\n },\n );\n });\n\n it('should capture exception without properties when not provided', () => {\n const error = new Error('Test error');\n\n analytics.captureException(error);\n\n expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(\n error,\n 'test-uuid',\n {\n team: 'growth',\n $app_name: 'wizard',\n },\n );\n });\n\n it('should merge tags with provided properties', () => {\n const error = new Error('Test error');\n const properties = { integration: 'nextjs', step: 'installation' };\n\n analytics.setTag('environment', 'test');\n analytics.setTag('version', '1.0.0');\n analytics.captureException(error, properties);\n\n expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(\n error,\n 'test-uuid',\n {\n team: 'growth',\n $app_name: 'wizard',\n environment: 'test',\n version: '1.0.0',\n integration: 'nextjs',\n step: 'installation',\n },\n );\n });\n\n it('should override tags with properties when keys conflict', () => {\n const error = new Error('Test error');\n const properties = { integration: 'react' };\n\n analytics.setTag('integration', 'nextjs');\n analytics.captureException(error, properties);\n\n expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(\n error,\n 'test-uuid',\n {\n team: 'growth',\n $app_name: 'wizard',\n integration: 'react',\n },\n );\n });\n\n it('should always include team:growth property in exceptions', () => {\n const error = new Error('Test error');\n\n analytics.captureException(error);\n\n expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(\n error,\n 'test-uuid',\n {\n team: 'growth',\n $app_name: 'wizard',\n },\n );\n });\n });\n\n describe('integration with other methods', () => {\n it('should work correctly with setTag and captureException', () => {\n const error = new Error('Test error');\n\n analytics.setTag('integration', 'nextjs');\n analytics.setTag('forceInstall', true);\n analytics.setTag('debug', false);\n\n analytics.captureException(error, {\n arguments: JSON.stringify({ installDir: '/test' }),\n step: 'wizard-execution',\n });\n\n expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(\n error,\n 'test-uuid',\n {\n team: 'growth',\n $app_name: 'wizard',\n integration: 'nextjs',\n forceInstall: true,\n debug: false,\n arguments: JSON.stringify({ installDir: '/test' }),\n step: 'wizard-execution',\n },\n );\n });\n\n it('should work correctly with setDistinctId and captureException', () => {\n const error = new Error('Test error');\n const distinctId = 'user-456';\n\n analytics.setDistinctId(distinctId);\n analytics.setTag('integration', 'svelte');\n analytics.captureException(error);\n\n expect(mockPostHogInstance.captureException).toHaveBeenCalledWith(\n error,\n distinctId,\n {\n team: 'growth',\n $app_name: 'wizard',\n integration: 'svelte',\n },\n );\n });\n });\n});\n"]}
@@ -3,11 +3,13 @@ export declare class Analytics {
3
3
  private tags;
4
4
  private distinctId?;
5
5
  private anonymousId;
6
+ private appName;
6
7
  constructor();
7
8
  setDistinctId(distinctId: string): void;
8
9
  setTag(key: string, value: string | boolean | number | null | undefined): void;
9
10
  captureException(error: Error, properties?: Record<string, unknown>): void;
10
11
  capture(eventName: string, properties?: Record<string, unknown>): void;
12
+ getFeatureFlag(flagKey: string): Promise<string | boolean | undefined>;
11
13
  shutdown(status: 'success' | 'error' | 'cancelled'): Promise<void>;
12
14
  }
13
15
  export declare const analytics: Analytics;
@@ -4,11 +4,13 @@ exports.analytics = exports.Analytics = void 0;
4
4
  const posthog_node_1 = require("posthog-node");
5
5
  const constants_1 = require("../lib/constants");
6
6
  const uuid_1 = require("uuid");
7
+ const debug_1 = require("./debug");
7
8
  class Analytics {
8
9
  client;
9
10
  tags = {};
10
11
  distinctId;
11
12
  anonymousId;
13
+ appName = 'wizard';
12
14
  constructor() {
13
15
  this.client = new posthog_node_1.PostHog(constants_1.ANALYTICS_POSTHOG_PUBLIC_PROJECT_WRITE_KEY, {
14
16
  host: constants_1.ANALYTICS_HOST_URL,
@@ -16,7 +18,7 @@ class Analytics {
16
18
  flushInterval: 0,
17
19
  enableExceptionAutocapture: true,
18
20
  });
19
- this.tags = {};
21
+ this.tags = { $app_name: this.appName };
20
22
  this.anonymousId = (0, uuid_1.v4)();
21
23
  this.distinctId = undefined;
22
24
  }
@@ -47,6 +49,21 @@ class Analytics {
47
49
  },
48
50
  });
49
51
  }
52
+ async getFeatureFlag(flagKey) {
53
+ try {
54
+ const distinctId = this.distinctId ?? this.anonymousId;
55
+ return await this.client.getFeatureFlag(flagKey, distinctId, {
56
+ sendFeatureFlagEvents: true,
57
+ personProperties: {
58
+ $app_name: this.appName,
59
+ },
60
+ });
61
+ }
62
+ catch (error) {
63
+ (0, debug_1.debug)('Failed to get feature flag:', flagKey, error);
64
+ return undefined;
65
+ }
66
+ }
50
67
  async shutdown(status) {
51
68
  if (Object.keys(this.tags).length === 0) {
52
69
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../../src/utils/analytics.ts"],"names":[],"mappings":";;;AAAA,+CAAuC;AACvC,gDAG0B;AAC1B,+BAAoC;AACpC,MAAa,SAAS;IACZ,MAAM,CAAU;IAChB,IAAI,GACV,EAAE,CAAC;IACG,UAAU,CAAU;IACpB,WAAW,CAAS;IAE5B;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,sBAAO,CAAC,sDAA0C,EAAE;YACpE,IAAI,EAAE,8BAAkB;YACxB,OAAO,EAAE,CAAC;YACV,aAAa,EAAE,CAAC;YAChB,0BAA0B,EAAE,IAAI;SACjC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QAEf,IAAI,CAAC,WAAW,GAAG,IAAA,SAAM,GAAE,CAAC;QAE5B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,aAAa,CAAC,UAAkB;QAC9B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAChB,UAAU;YACV,KAAK,EAAE,IAAI,CAAC,WAAW;SACxB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,GAAW,EAAE,KAAmD;QACrE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,gBAAgB,CAAC,KAAY,EAAE,aAAsC,EAAE;QACrE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE;YACvE,IAAI,EAAE,QAAQ;YACd,GAAG,IAAI,CAAC,IAAI;YACZ,GAAG,UAAU;SACd,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,SAAiB,EAAE,UAAoC;QAC7D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YAClB,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW;YAC/C,KAAK,EAAE,SAAS;YAChB,UAAU,EAAE;gBACV,GAAG,IAAI,CAAC,IAAI;gBACZ,GAAG,UAAU;aACd;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAyC;QACtD,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YAClB,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW;YAC/C,KAAK,EAAE,uBAAuB;YAC9B,UAAU,EAAE;gBACV,MAAM;gBACN,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;CACF;AArED,8BAqEC;AAEY,QAAA,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC","sourcesContent":["import { PostHog } from 'posthog-node';\nimport {\n ANALYTICS_HOST_URL,\n ANALYTICS_POSTHOG_PUBLIC_PROJECT_WRITE_KEY,\n} from '../lib/constants';\nimport { v4 as uuidv4 } from 'uuid';\nexport class Analytics {\n private client: PostHog;\n private tags: Record<string, string | boolean | number | null | undefined> =\n {};\n private distinctId?: string;\n private anonymousId: string;\n\n constructor() {\n this.client = new PostHog(ANALYTICS_POSTHOG_PUBLIC_PROJECT_WRITE_KEY, {\n host: ANALYTICS_HOST_URL,\n flushAt: 1,\n flushInterval: 0,\n enableExceptionAutocapture: true,\n });\n\n this.tags = {};\n\n this.anonymousId = uuidv4();\n\n this.distinctId = undefined;\n }\n\n setDistinctId(distinctId: string) {\n this.distinctId = distinctId;\n this.client.alias({\n distinctId,\n alias: this.anonymousId,\n });\n }\n\n setTag(key: string, value: string | boolean | number | null | undefined) {\n this.tags[key] = value;\n }\n\n captureException(error: Error, properties: Record<string, unknown> = {}) {\n this.client.captureException(error, this.distinctId ?? this.anonymousId, {\n team: 'growth',\n ...this.tags,\n ...properties,\n });\n }\n\n capture(eventName: string, properties?: Record<string, unknown>) {\n this.client.capture({\n distinctId: this.distinctId ?? this.anonymousId,\n event: eventName,\n properties: {\n ...this.tags,\n ...properties,\n },\n });\n }\n\n async shutdown(status: 'success' | 'error' | 'cancelled') {\n if (Object.keys(this.tags).length === 0) {\n return;\n }\n\n this.client.capture({\n distinctId: this.distinctId ?? this.anonymousId,\n event: 'setup wizard finished',\n properties: {\n status,\n tags: this.tags,\n },\n });\n\n await this.client.shutdown();\n }\n}\n\nexport const analytics = new Analytics();\n"]}
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../../src/utils/analytics.ts"],"names":[],"mappings":"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","sourcesContent":["import { PostHog } from 'posthog-node';\nimport {\n ANALYTICS_HOST_URL,\n ANALYTICS_POSTHOG_PUBLIC_PROJECT_WRITE_KEY,\n} from '../lib/constants';\nimport { v4 as uuidv4 } from 'uuid';\nimport { debug } from './debug';\nexport class Analytics {\n private client: PostHog;\n private tags: Record<string, string | boolean | number | null | undefined> =\n {};\n private distinctId?: string;\n private anonymousId: string;\n private appName = 'wizard';\n\n constructor() {\n this.client = new PostHog(ANALYTICS_POSTHOG_PUBLIC_PROJECT_WRITE_KEY, {\n host: ANALYTICS_HOST_URL,\n flushAt: 1,\n flushInterval: 0,\n enableExceptionAutocapture: true,\n });\n\n this.tags = { $app_name: this.appName };\n\n this.anonymousId = uuidv4();\n\n this.distinctId = undefined;\n }\n\n setDistinctId(distinctId: string) {\n this.distinctId = distinctId;\n this.client.alias({\n distinctId,\n alias: this.anonymousId,\n });\n }\n\n setTag(key: string, value: string | boolean | number | null | undefined) {\n this.tags[key] = value;\n }\n\n captureException(error: Error, properties: Record<string, unknown> = {}) {\n this.client.captureException(error, this.distinctId ?? this.anonymousId, {\n team: 'growth',\n ...this.tags,\n ...properties,\n });\n }\n\n capture(eventName: string, properties?: Record<string, unknown>) {\n this.client.capture({\n distinctId: this.distinctId ?? this.anonymousId,\n event: eventName,\n properties: {\n ...this.tags,\n ...properties,\n },\n });\n }\n\n async getFeatureFlag(flagKey: string): Promise<string | boolean | undefined> {\n try {\n const distinctId = this.distinctId ?? this.anonymousId;\n return await this.client.getFeatureFlag(flagKey, distinctId, {\n sendFeatureFlagEvents: true,\n personProperties: {\n $app_name: this.appName,\n },\n });\n } catch (error) {\n debug('Failed to get feature flag:', flagKey, error);\n return undefined;\n }\n }\n\n async shutdown(status: 'success' | 'error' | 'cancelled') {\n if (Object.keys(this.tags).length === 0) {\n return;\n }\n\n this.client.capture({\n distinctId: this.distinctId ?? this.anonymousId,\n event: 'setup wizard finished',\n properties: {\n status,\n tags: this.tags,\n },\n });\n\n await this.client.shutdown();\n }\n}\n\nexport const analytics = new Analytics();\n"]}
@@ -88,9 +88,10 @@ export declare function isUsingTypeScript({ installDir, }: Pick<WizardOptions, '
88
88
  export declare function getOrAskForProjectData(_options: Pick<WizardOptions, 'signup'> & {
89
89
  cloudRegion: CloudRegion;
90
90
  }): Promise<{
91
- wizardHash: string;
92
91
  host: string;
93
92
  projectApiKey: string;
93
+ accessToken: string;
94
+ projectId: number;
94
95
  }>;
95
96
  /**
96
97
  * Asks users if they have a config file for @param tool (e.g. Vite).