@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
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":";;;AAQA,8DAeC;AAOD,sDAKC;AAnCD,IAAY,WAMX;AAND,WAAY,WAAW;IACrB,gCAAiB,CAAA;IACjB,8BAAe,CAAA;IACf,gCAAiB,CAAA;IACjB,2CAA4B,CAAA;IAC5B,8BAAe,CAAA;AACjB,CAAC,EANW,WAAW,2BAAX,WAAW,QAMtB;AAED,SAAgB,yBAAyB,CAAC,IAAY;IACpD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,WAAW,CAAC,MAAM;YACrB,OAAO,SAAS,CAAC;QACnB,KAAK,WAAW,CAAC,KAAK;YACpB,OAAO,OAAO,CAAC;QACjB,KAAK,WAAW,CAAC,WAAW;YAC1B,OAAO,cAAc,CAAC;QACxB,KAAK,WAAW,CAAC,MAAM;YACrB,OAAO,QAAQ,CAAC;QAClB,KAAK,WAAW,CAAC,KAAK;YACpB,OAAO,OAAO,CAAC;QACjB;YACE,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAOD,SAAgB,qBAAqB;IACnC,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC;QACrD,IAAI,EAAE,yBAAyB,CAAC,IAAI,CAAC;QACrC,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC,CAAC;AACN,CAAC;AAOY,QAAA,MAAM,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,QAAQ,CACpD,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAC3B,CAAC;AAEW,QAAA,KAAK,GAAG,KAAK,CAAC;AAEd,QAAA,WAAW,GAAG,cAAM;IAC/B,CAAC,CAAC,uBAAuB;IACzB,CAAC,CAAC,wBAAwB,CAAC;AAChB,QAAA,UAAU,GAAG,0CAA0C,CAAC;AACxD,QAAA,gBAAgB,GAAG,cAAM;IACpC,CAAC,CAAC,uBAAuB;IACzB,CAAC,CAAC,0BAA0B,CAAC;AAClB,QAAA,0CAA0C,GAAG,gBAAgB,CAAC;AAC9D,QAAA,kBAAkB,GAAG,gCAAgC,CAAC;AACtD,QAAA,qBAAqB,GAAG,gCAAgC,CAAC","sourcesContent":["export enum Integration {\n nextjs = 'nextjs',\n react = 'react',\n svelte = 'svelte',\n reactNative = 'react-native',\n astro = 'astro',\n}\n\nexport function getIntegrationDescription(type: string): string {\n switch (type) {\n case Integration.nextjs:\n return 'Next.js';\n case Integration.react:\n return 'React';\n case Integration.reactNative:\n return 'React Native';\n case Integration.svelte:\n return 'Svelte';\n case Integration.astro:\n return 'Astro';\n default:\n throw new Error(`Unknown integration ${type}`);\n }\n}\n\ntype IntegrationChoice = {\n name: string;\n value: string;\n};\n\nexport function getIntegrationChoices(): IntegrationChoice[] {\n return Object.keys(Integration).map((type: string) => ({\n name: getIntegrationDescription(type),\n value: type,\n }));\n}\n\nexport interface Args {\n debug: boolean;\n integration: Integration;\n}\n\nexport const IS_DEV = ['test', 'development'].includes(\n process.env.NODE_ENV ?? '',\n);\n\nexport const DEBUG = false;\n\nexport const DEFAULT_URL = IS_DEV\n ? 'http://localhost:8010'\n : 'https://us.posthog.com';\nexport const ISSUES_URL = 'https://github.com/posthog/wizard/issues';\nexport const DEFAULT_HOST_URL = IS_DEV\n ? 'http://localhost:8010'\n : 'https://us.i.posthog.com';\nexport const ANALYTICS_POSTHOG_PUBLIC_PROJECT_WRITE_KEY = 'sTMFPsFhdP1Ssg';\nexport const ANALYTICS_HOST_URL = 'https://internal-j.posthog.com';\nexport const DUMMY_PROJECT_API_KEY = '_YOUR_POSTHOG_PROJECT_API_KEY_';\n"]}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":";;;AAiBA,8DAeC;AAOD,sDAKC;AA5CD,IAAY,WAMX;AAND,WAAY,WAAW;IACrB,gCAAiB,CAAA;IACjB,8BAAe,CAAA;IACf,gCAAiB,CAAA;IACjB,2CAA4B,CAAA;IAC5B,8BAAe,CAAA;AACjB,CAAC,EANW,WAAW,2BAAX,WAAW,QAMtB;AAED,IAAY,qBAEX;AAFD,WAAY,qBAAqB;IAC/B,kDAAyB,CAAA;AAC3B,CAAC,EAFW,qBAAqB,qCAArB,qBAAqB,QAEhC;AAED,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,kCAAiB,CAAA;IACjB,gCAAe,CAAA;AACjB,CAAC,EAHW,aAAa,6BAAb,aAAa,QAGxB;AAED,SAAgB,yBAAyB,CAAC,IAAY;IACpD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,WAAW,CAAC,MAAM;YACrB,OAAO,SAAS,CAAC;QACnB,KAAK,WAAW,CAAC,KAAK;YACpB,OAAO,OAAO,CAAC;QACjB,KAAK,WAAW,CAAC,WAAW;YAC1B,OAAO,cAAc,CAAC;QACxB,KAAK,WAAW,CAAC,MAAM;YACrB,OAAO,QAAQ,CAAC;QAClB,KAAK,WAAW,CAAC,KAAK;YACpB,OAAO,OAAO,CAAC;QACjB;YACE,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAOD,SAAgB,qBAAqB;IACnC,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC;QACrD,IAAI,EAAE,yBAAyB,CAAC,IAAI,CAAC;QACrC,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC,CAAC;AACN,CAAC;AAOY,QAAA,MAAM,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,QAAQ,CACpD,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAC3B,CAAC;AAEW,QAAA,KAAK,GAAG,KAAK,CAAC;AAEd,QAAA,WAAW,GAAG,cAAM;IAC/B,CAAC,CAAC,uBAAuB;IACzB,CAAC,CAAC,wBAAwB,CAAC;AAChB,QAAA,UAAU,GAAG,0CAA0C,CAAC;AACxD,QAAA,gBAAgB,GAAG,cAAM;IACpC,CAAC,CAAC,uBAAuB;IACzB,CAAC,CAAC,0BAA0B,CAAC;AAClB,QAAA,0CAA0C,GAAG,gBAAgB,CAAC;AAC9D,QAAA,kBAAkB,GAAG,gCAAgC,CAAC;AACtD,QAAA,qBAAqB,GAAG,gCAAgC,CAAC;AAEzD,QAAA,oBAAoB,GAAG,0CAA0C,CAAC;AAClE,QAAA,oBAAoB,GAAG,0CAA0C,CAAC;AAClE,QAAA,qBAAqB,GAAG,0CAA0C,CAAC;AACnE,QAAA,UAAU,GAAG,IAAI,CAAC;AAElB,QAAA,6BAA6B,GAAG,oBAAoB,CAAC","sourcesContent":["export enum Integration {\n nextjs = 'nextjs',\n react = 'react',\n svelte = 'svelte',\n reactNative = 'react-native',\n astro = 'astro',\n}\n\nexport enum FeatureFlagDefinition {\n NextV2 = 'wizard-next-v2',\n}\n\nexport enum WizardVariant {\n Legacy = 'legacy',\n Agent = 'agent',\n}\n\nexport function getIntegrationDescription(type: string): string {\n switch (type) {\n case Integration.nextjs:\n return 'Next.js';\n case Integration.react:\n return 'React';\n case Integration.reactNative:\n return 'React Native';\n case Integration.svelte:\n return 'Svelte';\n case Integration.astro:\n return 'Astro';\n default:\n throw new Error(`Unknown integration ${type}`);\n }\n}\n\ntype IntegrationChoice = {\n name: string;\n value: string;\n};\n\nexport function getIntegrationChoices(): IntegrationChoice[] {\n return Object.keys(Integration).map((type: string) => ({\n name: getIntegrationDescription(type),\n value: type,\n }));\n}\n\nexport interface Args {\n debug: boolean;\n integration: Integration;\n}\n\nexport const IS_DEV = ['test', 'development'].includes(\n process.env.NODE_ENV ?? '',\n);\n\nexport const DEBUG = false;\n\nexport const DEFAULT_URL = IS_DEV\n ? 'http://localhost:8010'\n : 'https://us.posthog.com';\nexport const ISSUES_URL = 'https://github.com/posthog/wizard/issues';\nexport const DEFAULT_HOST_URL = IS_DEV\n ? 'http://localhost:8010'\n : 'https://us.i.posthog.com';\nexport const ANALYTICS_POSTHOG_PUBLIC_PROJECT_WRITE_KEY = 'sTMFPsFhdP1Ssg';\nexport const ANALYTICS_HOST_URL = 'https://internal-j.posthog.com';\nexport const DUMMY_PROJECT_API_KEY = '_YOUR_POSTHOG_PROJECT_API_KEY_';\n\nexport const POSTHOG_US_CLIENT_ID = 'c4Rdw8DIxgtQfA80IiSnGKlNX8QN00cFWF00QQhM';\nexport const POSTHOG_EU_CLIENT_ID = 'bx2C5sZRN03TkdjraCcetvQFPGH6N2Y9vRLkcKEy';\nexport const POSTHOG_DEV_CLIENT_ID = 'DC5uRLVbGI02YQ82grxgnK6Qn12SXWpCqdPb60oZ';\nexport const OAUTH_PORT = 8239;\n\nexport const WIZARD_INTERACTION_EVENT_NAME = 'wizard interaction';\n"]}
package/dist/src/mcp.d.ts CHANGED
@@ -2,8 +2,11 @@ import type { CloudRegion } from './utils/types';
2
2
  export declare const runMCPInstall: (options: {
3
3
  signup: boolean;
4
4
  region?: CloudRegion;
5
+ local?: boolean;
6
+ }) => Promise<void>;
7
+ export declare const runMCPRemove: (options?: {
8
+ local?: boolean;
5
9
  }) => Promise<void>;
6
- export declare const runMCPRemove: () => Promise<void>;
7
10
  export declare const getPersonalApiKey: (options: {
8
11
  cloudRegion: CloudRegion;
9
12
  }) => Promise<string>;
package/dist/src/mcp.js CHANGED
@@ -12,10 +12,11 @@ const opn_1 = __importDefault(require("opn"));
12
12
  const urls_1 = require("./utils/urls");
13
13
  const helper_functions_1 = require("./lib/helper-functions");
14
14
  const runMCPInstall = async (options) => {
15
- clack_1.default.intro(chalk_1.default.bgGreenBright('Installing the PostHog MCP server'));
15
+ clack_1.default.intro(chalk_1.default.bgGreenBright(`Installing the PostHog MCP server ${options.local && '(local)'}`));
16
16
  await (0, add_mcp_server_to_clients_1.addMCPServerToClientsStep)({
17
17
  cloudRegion: options.region,
18
18
  askPermission: false,
19
+ local: options.local,
19
20
  });
20
21
  clack_1.default.log.message(`${chalk_1.default.greenBright('You might need to restart your MCP clients to see the changes.')}`);
21
22
  clack_1.default.log.message(`Get started with some prompts like:
@@ -26,9 +27,11 @@ const runMCPInstall = async (options) => {
26
27
  ${chalk_1.default.blueBright(`https://posthog.com/docs/model-context-protocol`)}`);
27
28
  };
28
29
  exports.runMCPInstall = runMCPInstall;
29
- const runMCPRemove = async () => {
30
+ const runMCPRemove = async (options) => {
30
31
  clack_1.default.intro(chalk_1.default.bgRed('Removing the PostHog MCP server'));
31
- const results = await (0, add_mcp_server_to_clients_1.removeMCPServerFromClientsStep)({});
32
+ const results = await (0, add_mcp_server_to_clients_1.removeMCPServerFromClientsStep)({
33
+ local: options?.local,
34
+ });
32
35
  if (results.length === 0) {
33
36
  clack_1.default.outro(`No PostHog MCP servers found to remove.`);
34
37
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/mcp.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport {\n addMCPServerToClientsStep,\n removeMCPServerFromClientsStep,\n} from './steps/add-mcp-server-to-clients';\nimport clack from './utils/clack';\nimport { abort } from './utils/clack-utils';\nimport type { CloudRegion } from './utils/types';\nimport opn from 'opn';\nimport { getCloudUrlFromRegion } from './utils/urls';\nimport { sleep } from './lib/helper-functions';\n\nexport const runMCPInstall = async (options: {\n signup: boolean;\n region?: CloudRegion;\n}) => {\n clack.intro(chalk.bgGreenBright('Installing the PostHog MCP server'));\n\n await addMCPServerToClientsStep({\n cloudRegion: options.region,\n askPermission: false,\n });\n\n clack.log.message(\n `${chalk.greenBright(\n 'You might need to restart your MCP clients to see the changes.',\n )}`,\n );\n\n clack.log.message(`Get started with some prompts like:\n- What feature flags do I have active?\n- Add a new feature flag for our homepage redesign\n- What are my most common errors?`);\n\n clack.log.message(`Check out our MCP Server documentation:\n${chalk.blueBright(`https://posthog.com/docs/model-context-protocol`)}`);\n};\n\nexport const runMCPRemove = async () => {\n clack.intro(chalk.bgRed('Removing the PostHog MCP server'));\n const results = await removeMCPServerFromClientsStep({});\n\n if (results.length === 0) {\n clack.outro(`No PostHog MCP servers found to remove.`);\n return;\n }\n\n clack.log.success(`PostHog MCP server removed from:`);\n results.map((c) => clack.log.message(`- ${c}`));\n clack.outro(\n `${chalk.green(\n 'You might need to restart your MCP clients to see the changes.\\n\\n',\n )}`,\n );\n};\n\nexport const getPersonalApiKey = async (options: {\n cloudRegion: CloudRegion;\n}): Promise<string> => {\n const cloudUrl = getCloudUrlFromRegion(options.cloudRegion);\n\n const urlToOpen = `${cloudUrl}/settings/user-api-keys?preset=mcp_server`;\n\n const spinner = clack.spinner();\n spinner.start(\n `Opening your project settings so you can get a Personal API key...`,\n );\n\n await sleep(1500);\n\n spinner.stop(\n `Opened your project settings. If the link didn't open automatically, open the following URL in your browser to get a Personal API key: \\n\\n${chalk.cyan(\n urlToOpen,\n )}`,\n );\n\n opn(urlToOpen, { wait: false }).catch(() => {\n // opn throws in environments that don't have a browser (e.g. remote shells) so we just noop here\n });\n\n const personalApiKey = await clack.password({\n message: 'Paste in your Personal API key:',\n validate(value) {\n if (value.length === 0) return `Value is required!`;\n\n if (!value.startsWith('phx_')) {\n return `That doesn't look right, are you sure you copied the right key? It should start with 'phx_'`;\n }\n },\n });\n\n if (!personalApiKey) {\n await abort('Unable to proceed without a personal API key.');\n return '';\n }\n\n return personalApiKey as string;\n};\n"]}
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/mcp.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport {\n addMCPServerToClientsStep,\n removeMCPServerFromClientsStep,\n} from './steps/add-mcp-server-to-clients';\nimport clack from './utils/clack';\nimport { abort } from './utils/clack-utils';\nimport type { CloudRegion } from './utils/types';\nimport opn from 'opn';\nimport { getCloudUrlFromRegion } from './utils/urls';\nimport { sleep } from './lib/helper-functions';\n\nexport const runMCPInstall = async (options: {\n signup: boolean;\n region?: CloudRegion;\n local?: boolean;\n}) => {\n clack.intro(\n chalk.bgGreenBright(\n `Installing the PostHog MCP server ${options.local && '(local)'}`,\n ),\n );\n\n await addMCPServerToClientsStep({\n cloudRegion: options.region,\n askPermission: false,\n local: options.local,\n });\n\n clack.log.message(\n `${chalk.greenBright(\n 'You might need to restart your MCP clients to see the changes.',\n )}`,\n );\n\n clack.log.message(`Get started with some prompts like:\n- What feature flags do I have active?\n- Add a new feature flag for our homepage redesign\n- What are my most common errors?`);\n\n clack.log.message(`Check out our MCP Server documentation:\n${chalk.blueBright(`https://posthog.com/docs/model-context-protocol`)}`);\n};\n\nexport const runMCPRemove = async (options?: { local?: boolean }) => {\n clack.intro(chalk.bgRed('Removing the PostHog MCP server'));\n const results = await removeMCPServerFromClientsStep({\n local: options?.local,\n });\n\n if (results.length === 0) {\n clack.outro(`No PostHog MCP servers found to remove.`);\n return;\n }\n\n clack.log.success(`PostHog MCP server removed from:`);\n results.map((c) => clack.log.message(`- ${c}`));\n clack.outro(\n `${chalk.green(\n 'You might need to restart your MCP clients to see the changes.\\n\\n',\n )}`,\n );\n};\n\nexport const getPersonalApiKey = async (options: {\n cloudRegion: CloudRegion;\n}): Promise<string> => {\n const cloudUrl = getCloudUrlFromRegion(options.cloudRegion);\n\n const urlToOpen = `${cloudUrl}/settings/user-api-keys?preset=mcp_server`;\n\n const spinner = clack.spinner();\n spinner.start(\n `Opening your project settings so you can get a Personal API key...`,\n );\n\n await sleep(1500);\n\n spinner.stop(\n `Opened your project settings. If the link didn't open automatically, open the following URL in your browser to get a Personal API key: \\n\\n${chalk.cyan(\n urlToOpen,\n )}`,\n );\n\n opn(urlToOpen, { wait: false }).catch(() => {\n // opn throws in environments that don't have a browser (e.g. remote shells) so we just noop here\n });\n\n const personalApiKey = await clack.password({\n message: 'Paste in your Personal API key:',\n validate(value) {\n if (value.length === 0) return `Value is required!`;\n\n if (!value.startsWith('phx_')) {\n return `That doesn't look right, are you sure you copied the right key? It should start with 'phx_'`;\n }\n },\n });\n\n if (!personalApiKey) {\n await abort('Unable to proceed without a personal API key.');\n return '';\n }\n\n return personalApiKey as string;\n};\n"]}
@@ -101,7 +101,7 @@ The event setup wizard will modify multiple files. For the best experience, comm
101
101
  }
102
102
  }
103
103
  const cloudRegion = options.cloudRegion ?? (await (0, clack_utils_1.askForCloudRegion)());
104
- const { wizardHash } = await (0, clack_utils_1.getOrAskForProjectData)({
104
+ const { accessToken, projectId } = await (0, clack_utils_1.getOrAskForProjectData)({
105
105
  ...options,
106
106
  cloudRegion,
107
107
  });
@@ -197,7 +197,8 @@ The event setup wizard will modify multiple files. For the best experience, comm
197
197
  model: 'gemini-2.5-flash',
198
198
  region: cloudRegion,
199
199
  schema: FileSelectionSchema,
200
- wizardHash,
200
+ accessToken,
201
+ projectId,
201
202
  });
202
203
  selectedFiles = response.files;
203
204
  s.stop(`Selected ${selectedFiles.length} files for event tracking`);
@@ -292,7 +293,8 @@ The event setup wizard will modify multiple files. For the best experience, comm
292
293
  model: 'gemini-2.5-pro',
293
294
  region: cloudRegion,
294
295
  schema: EnhancedFileSchema,
295
- wizardHash,
296
+ accessToken,
297
+ projectId,
296
298
  });
297
299
  // Apply changes immediately
298
300
  if (response.content !== fileContent) {
@@ -1 +1 @@
1
- {"version":3,"file":"event-setup.js","sourceRoot":"","sources":["../../../src/nextjs/event-setup.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n abort,\n getOrAskForProjectData,\n askForCloudRegion,\n getPackageDotJson,\n getUncommittedOrUntrackedFiles,\n isInGitRepo,\n abortIfCancelled,\n} from '../utils/clack-utils';\nimport clack from '../utils/clack';\nimport { WizardOptions } from '../utils/types';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport chalk from 'chalk';\nimport { query } from '../utils/query';\nimport { z } from 'zod';\nimport { getAllFilesInProject, updateFile } from '../utils/file-utils';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport * as semver from 'semver';\nimport { enableDebugLogs, debug } from '../utils/debug';\nimport { analytics } from '../utils/analytics';\n\n// Analytics constants\nconst WIZARD_INTERACTION = 'wizard interaction';\nconst INTEGRATION_NAME = 'event-setup';\n\n// Schema for file selection from AI\nconst FileSelectionSchema = z.object({\n files: z.array(z.string()).max(10),\n});\n\n// Schema for enhanced file with events\nconst EnhancedFileSchema = z.object({\n filePath: z.string(),\n content: z.string(),\n events: z.array(\n z.object({\n name: z.string(),\n description: z.string(),\n }),\n ),\n});\n\nexport async function runEventSetupWizard(\n options: WizardOptions,\n): Promise<void> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n clack.intro(\n `Let's do a first pass on PostHog event tracking for your project.\n \n We'll start by analyzing your project structure, then choose up to ten files to enhance. Use git to discard any events you're not happy with.\n\n This will give you a starting point, then you can add any events that we missed.\n `,\n );\n\n // Check for uncommitted changes\n if (isInGitRepo()) {\n const uncommittedOrUntrackedFiles = getUncommittedOrUntrackedFiles();\n if (uncommittedOrUntrackedFiles.length) {\n clack.log.warn(\n `You have uncommitted or untracked files in your repo:\n\n${uncommittedOrUntrackedFiles.join('\\n')}\n\nThe event setup wizard will modify multiple files. For the best experience, commit or stash your changes first.`,\n );\n const continueWithDirtyRepo = await abortIfCancelled(\n clack.confirm({\n message: 'Do you want to continue anyway?',\n }),\n );\n if (!continueWithDirtyRepo) {\n analytics.capture(WIZARD_INTERACTION, {\n action: 'aborted due to uncommitted changes',\n integration: INTEGRATION_NAME,\n });\n return abort('Please commit your changes and try again.', 0);\n }\n analytics.capture(WIZARD_INTERACTION, {\n action: 'continued with uncommitted changes',\n integration: INTEGRATION_NAME,\n });\n }\n }\n\n const cloudRegion = options.cloudRegion ?? (await askForCloudRegion());\n\n const { wizardHash } = await getOrAskForProjectData({\n ...options,\n cloudRegion,\n });\n\n // Check if this is a Next.js 15.3+ project with instrumentation-client\n const packageJson = await getPackageDotJson(options);\n const isNextJs = hasPackageInstalled('next', packageJson);\n\n if (!isNextJs) {\n return abort('This feature is only available for Next.js projects.');\n }\n\n const nextVersion = getPackageVersion('next', packageJson);\n const isNext15_3Plus = nextVersion && semver.gte(nextVersion, '15.3.0');\n\n analytics.setTag('nextjs-version', nextVersion);\n\n if (!isNext15_3Plus) {\n analytics.capture(WIZARD_INTERACTION, {\n action: 'aborted due to nextjs version',\n integration: INTEGRATION_NAME,\n nextjsVersion: nextVersion,\n });\n return abort('This feature requires Next.js 15.3.0 or higher.');\n }\n\n // Check for instrumentation-client file\n const allFiles = await getAllFilesInProject(options.installDir);\n const instrumentationFiles = allFiles.filter(\n (f) =>\n f.includes('instrumentation') &&\n (f.endsWith('.ts') || f.endsWith('.js')) &&\n (f.includes('client') || f.includes('Client')),\n );\n\n if (instrumentationFiles.length === 0) {\n analytics.capture(WIZARD_INTERACTION, {\n action: 'aborted due to missing instrumentation-client',\n integration: INTEGRATION_NAME,\n });\n return abort(\n 'No instrumentation-client file found. Please set up Next.js instrumentation-client first. Try using this wizard to do it!',\n );\n }\n\n analytics.capture(WIZARD_INTERACTION, {\n action: 'started event setup',\n integration: INTEGRATION_NAME,\n instrumentationFilesCount: instrumentationFiles.length,\n });\n\n // Get the project file tree\n const s = clack.spinner();\n s.start('Analyzing your project structure');\n\n const projectFiles = await getAllFilesInProject(options.installDir);\n const relativeFiles = projectFiles\n .map((f) => path.relative(options.installDir, f))\n .filter((f) => {\n // Exclude instrumentation files and next.config\n const isInstrumentation =\n f.includes('instrumentation') &&\n (f.endsWith('.ts') || f.endsWith('.js'));\n const isNextConfig = f.startsWith('next.config.') || f === 'next.config';\n return !isInstrumentation && !isNextConfig;\n });\n\n debug('Total files found:', projectFiles.length);\n debug('Files after filtering:', relativeFiles.length);\n s.stop('Project structure analyzed');\n\n analytics.capture(WIZARD_INTERACTION, {\n action: 'analyzed project structure',\n integration: INTEGRATION_NAME,\n totalFiles: projectFiles.length,\n eligibleFiles: relativeFiles.length,\n });\n\n // Send file tree to AI to get 10 most useful files\n s.start('Selecting some files to enhance with events...');\n\n const fileSelectionPrompt = `Given this Next.js 15.3+ project structure and package.json, select up to 10 CLIENT-SIDE FILES for adding PostHog analytics events.\n \n IMPORTANT: Only select files that:\n - Have \"use client\" directive at the top, OR\n - Use React hooks (useState, useEffect, etc.), OR \n - Have event handlers (onClick, onSubmit, onChange)\n \n DO NOT select:\n - API routes (files in /api/ or route.ts/route.js files)\n - Server Components (files without \"use client\" and no hooks/handlers)\n - Layout files (layout.tsx/layout.js)\n - Configuration files\n - Pure utility files\n \n Focus on:\n - User interaction points (buttons, forms, navigation)\n - Key user flows (auth, checkout, main features)\n - Business-critical paths\n - Files that represent important user actions\n \n Package.json:\n ${JSON.stringify(packageJson, null, 2)}\n \n Project files:\n ${relativeFiles.join('\\n')}\n \n Return file paths for client-side files ONLY that would benefit most from analytics tracking. If there are fewer than 10 suitable client files, return only those.`;\n\n let selectedFiles: string[] = [];\n try {\n const response = await query({\n message: fileSelectionPrompt,\n model: 'gemini-2.5-flash',\n region: cloudRegion,\n schema: FileSelectionSchema,\n wizardHash,\n });\n selectedFiles = response.files;\n s.stop(`Selected ${selectedFiles.length} files for event tracking`);\n analytics.capture(WIZARD_INTERACTION, {\n action: 'selected files for tracking',\n integration: INTEGRATION_NAME,\n filesSelected: selectedFiles.length,\n });\n } catch (error) {\n s.stop('Failed to select files');\n analytics.capture(WIZARD_INTERACTION, {\n action: 'file selection failed',\n integration: INTEGRATION_NAME,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n return abort('Could not analyze project structure. Please try again.');\n }\n\n // Read the selected files and enhance them with events\n clack.log.info('Files selected for event tracking:');\n selectedFiles.forEach((file, index) => {\n clack.log.info(` ${index + 1}. ${file}`);\n });\n\n const enhancedFiles: Array<{\n filePath: string;\n events: Array<{ name: string; description: string }>;\n }> = [];\n\n clack.log.info(\n \"\\nEnhancing files with event tracking. Changes will be applied as they come in. Use your git interface to review new events. Feel free to toss anything you don't like...\",\n );\n\n for (const filePath of selectedFiles) {\n const fileSpinner = clack.spinner();\n fileSpinner.start(`Analyzing ${filePath}`);\n\n try {\n const fullPath = path.join(options.installDir, filePath);\n const fileContent = await fs.readFile(fullPath, 'utf8');\n\n const enhancePrompt = `You are enhancing a REAL production, client-side Next.js file with PostHog analytics. This is NOT an example or tutorial - add events to the ACTUAL code provided.\n \n - REQUIRED: import posthog from 'posthog-js'\n - Track events with: posthog.capture('event-name', { property: 'value' })\n - NEVER import PostHogClient from '@/app/posthog'\n - NEVER create functions with 'use server'\n\n CRITICAL INSTRUCTIONS:\n - This is a REAL file from a production codebase\n - DO NOT add placeholder comments like \"// In a real app...\" or \"// This is an example...\"\n - DO NOT modify the existing business logic or add simulation code\n - DO NOT add any tutorial-style comments\n - ONLY add PostHog event tracking to the existing, real functionality\n - DO NOT create wrapper functions around existing functions just to add tracking\n - Add tracking code directly inside existing functions where appropriate\n - NEVER import new packages or libraries that aren't already used in the file\n - ONLY use imports that already exist in the file or the PostHog imports specified\n - DO NOT assume any authentication library (Clerk, Auth.js, etc.) is available\n \n FORBIDDEN - NEVER DO THESE:\n - NEVER add 'use client' or 'use server' directives at the top of the file, or in functions\n - NEVER define new server actions (functions with \"use server\") in Client Components\n - NEVER create inline \"use server\" functions in files that have \"use client\"\n - NEVER use useEffect to track page views or component renders\n - NEVER track events like \"page_viewed\", \"form_viewed\", \"component_rendered\", \"flow_started\", \"page_opened\" etc\n - NEVER track that someone simply arrived at or viewed a page\n - NEVER change the file's existing client/server architecture\n - NEVER add events on component mount or render - only on actual user interactions\n - Track events on user interactions like clicks, form submissions, etc.\n \n Technical Rules:\n - This is a client-side file suitable for event tracking\n - REQUIRED IMPORT: import posthog from 'posthog-js'\n - Use the existing posthog instance for all tracking\n - Example: posthog.capture('button-clicked', { buttonId: 'submit' })\n - Focus on tracking user interactions in the UI components\n - Track events like button clicks, form submissions, navigation, etc.\n - Add 1-2 high-value events that track the ACTUAL user actions in this file\n - Use descriptive event names (lowercase-hyphenated) based on what the code ACTUALLY does\n - Include properties that capture REAL data from the existing code\n - For user identification: ONLY use user data that's already available in the code\n - DO NOT add code to fetch user IDs or authentication state if not already available in the file\n - Do not change the formatting of the file; only add events\n - Do not set timestamps on events; PostHog will do this automatically\n - Always return the entire file content, not just the changes\n - NEVER add events that correspond to page views; PostHog tracks these automatically\n - NEVER INSERT \"use client\" or \"use server\" directives\n \n File path: ${filePath}\n File content:\n ${fileContent}\n \n IMPORTANT: If this file only renders UI without any user interactions (no buttons, forms, or actions), \n or if the only possible events would be pageview-like (e.g., \"form-viewed\", \"page-opened\", \"flow-started\"),\n then SKIP THIS FILE by returning the original content unchanged. We only want to track actual user actions,\n not that someone looked at a page.\n \n Return the enhanced file with PostHog tracking added to the EXISTING functionality. List the events you added.`;\n\n const response = await query({\n message: enhancePrompt,\n model: 'gemini-2.5-pro',\n region: cloudRegion,\n schema: EnhancedFileSchema,\n wizardHash,\n });\n\n // Apply changes immediately\n if (response.content !== fileContent) {\n await updateFile(\n {\n filePath,\n oldContent: fileContent,\n newContent: response.content,\n },\n options,\n );\n\n enhancedFiles.push({\n filePath,\n events: response.events,\n });\n\n fileSpinner.stop(\n `✓ Enhanced ${filePath} with ${response.events.length} events`,\n );\n analytics.capture(WIZARD_INTERACTION, {\n action: 'enhanced file',\n integration: INTEGRATION_NAME,\n filePath,\n eventsAdded: response.events.length,\n });\n } else {\n fileSpinner.stop(`No changes needed for ${filePath}`);\n analytics.capture(WIZARD_INTERACTION, {\n action: 'file skipped',\n integration: INTEGRATION_NAME,\n filePath,\n reason: 'no events to add',\n });\n }\n } catch (error) {\n fileSpinner.stop(`✗ Failed to enhance ${filePath}`);\n debug('Error enhancing file:', error);\n analytics.capture(WIZARD_INTERACTION, {\n action: 'file enhancement failed',\n integration: INTEGRATION_NAME,\n filePath,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n // Generate event tracking report\n const generateMarkdown = () => {\n let md = `# Event tracking report\\n\\n`;\n md += `This document lists all PostHog events that have been automatically added to your Next.js application.\\n\\n`;\n md += `## Events by File\\n\\n`;\n\n enhancedFiles.forEach((file) => {\n if (file.events.length > 0) {\n md += `### ${file.filePath}\\n\\n`;\n file.events.forEach((event) => {\n md += `- **${event.name}**: ${event.description}\\n`;\n });\n md += `\\n`;\n }\n });\n\n md += `\\n## Events still awaiting implementation\\n`;\n md += `- (human: you can fill these in)`;\n\n md += `\\n---\\n\\n`;\n md += `## Next Steps\\n\\n`;\n md += `1. Review the changes made to your files\\n`;\n md += `2. Test that events are being captured correctly\\n`;\n md += `3. Create insights and dashboards in PostHog\\n`;\n md += `4. Make a list of events we missed above. Knock them out yourself, or give this file to an agent.\\n\\n`;\n md += `Learn more about what to measure with PostHog and why: https://posthog.com/docs/new-to-posthog/getting-hogpilled\\n`;\n return md;\n };\n\n const markdownContent = generateMarkdown();\n const fileName = 'event-tracking-report.md';\n const filePath = path.join(options.installDir, fileName);\n\n await fs.writeFile(filePath, markdownContent);\n\n // Summary\n const totalEvents = enhancedFiles.reduce(\n (sum, file) => sum + file.events.length,\n 0,\n );\n\n analytics.capture(WIZARD_INTERACTION, {\n action: 'event setup completed',\n integration: INTEGRATION_NAME,\n totalEvents,\n filesEnhanced: enhancedFiles.length,\n filesProcessed: selectedFiles.length,\n });\n\n analytics.setTag('event-setup-total-events', totalEvents);\n analytics.setTag('event-setup-files-enhanced', enhancedFiles.length);\n\n clack.outro(\n `Success! Added ${chalk.bold(\n totalEvents.toString(),\n )} events across ${chalk.bold(enhancedFiles.length.toString())} files.\n \n Event tracking plan saved to: ${chalk.cyan(fileName)}\n \n Next steps:\n 1. Review changes with your favorite git tool\n 2. Revert unwanted changes with ${chalk.bold('git checkout <file>')}\n 3. Test that events are being captured in your PostHog project\n 4. Create insights in PostHog\n `,\n );\n}\n"]}
1
+ {"version":3,"file":"event-setup.js","sourceRoot":"","sources":["../../../src/nextjs/event-setup.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n abort,\n getOrAskForProjectData,\n askForCloudRegion,\n getPackageDotJson,\n getUncommittedOrUntrackedFiles,\n isInGitRepo,\n abortIfCancelled,\n} from '../utils/clack-utils';\nimport clack from '../utils/clack';\nimport { WizardOptions } from '../utils/types';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport chalk from 'chalk';\nimport { query } from '../utils/query';\nimport { z } from 'zod';\nimport { getAllFilesInProject, updateFile } from '../utils/file-utils';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport * as semver from 'semver';\nimport { enableDebugLogs, debug } from '../utils/debug';\nimport { analytics } from '../utils/analytics';\n\n// Analytics constants\nconst WIZARD_INTERACTION = 'wizard interaction';\nconst INTEGRATION_NAME = 'event-setup';\n\n// Schema for file selection from AI\nconst FileSelectionSchema = z.object({\n files: z.array(z.string()).max(10),\n});\n\n// Schema for enhanced file with events\nconst EnhancedFileSchema = z.object({\n filePath: z.string(),\n content: z.string(),\n events: z.array(\n z.object({\n name: z.string(),\n description: z.string(),\n }),\n ),\n});\n\nexport async function runEventSetupWizard(\n options: WizardOptions,\n): Promise<void> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n clack.intro(\n `Let's do a first pass on PostHog event tracking for your project.\n \n We'll start by analyzing your project structure, then choose up to ten files to enhance. Use git to discard any events you're not happy with.\n\n This will give you a starting point, then you can add any events that we missed.\n `,\n );\n\n // Check for uncommitted changes\n if (isInGitRepo()) {\n const uncommittedOrUntrackedFiles = getUncommittedOrUntrackedFiles();\n if (uncommittedOrUntrackedFiles.length) {\n clack.log.warn(\n `You have uncommitted or untracked files in your repo:\n\n${uncommittedOrUntrackedFiles.join('\\n')}\n\nThe event setup wizard will modify multiple files. For the best experience, commit or stash your changes first.`,\n );\n const continueWithDirtyRepo = await abortIfCancelled(\n clack.confirm({\n message: 'Do you want to continue anyway?',\n }),\n );\n if (!continueWithDirtyRepo) {\n analytics.capture(WIZARD_INTERACTION, {\n action: 'aborted due to uncommitted changes',\n integration: INTEGRATION_NAME,\n });\n return abort('Please commit your changes and try again.', 0);\n }\n analytics.capture(WIZARD_INTERACTION, {\n action: 'continued with uncommitted changes',\n integration: INTEGRATION_NAME,\n });\n }\n }\n\n const cloudRegion = options.cloudRegion ?? (await askForCloudRegion());\n\n const { accessToken, projectId } = await getOrAskForProjectData({\n ...options,\n cloudRegion,\n });\n\n // Check if this is a Next.js 15.3+ project with instrumentation-client\n const packageJson = await getPackageDotJson(options);\n const isNextJs = hasPackageInstalled('next', packageJson);\n\n if (!isNextJs) {\n return abort('This feature is only available for Next.js projects.');\n }\n\n const nextVersion = getPackageVersion('next', packageJson);\n const isNext15_3Plus = nextVersion && semver.gte(nextVersion, '15.3.0');\n\n analytics.setTag('nextjs-version', nextVersion);\n\n if (!isNext15_3Plus) {\n analytics.capture(WIZARD_INTERACTION, {\n action: 'aborted due to nextjs version',\n integration: INTEGRATION_NAME,\n nextjsVersion: nextVersion,\n });\n return abort('This feature requires Next.js 15.3.0 or higher.');\n }\n\n // Check for instrumentation-client file\n const allFiles = await getAllFilesInProject(options.installDir);\n const instrumentationFiles = allFiles.filter(\n (f) =>\n f.includes('instrumentation') &&\n (f.endsWith('.ts') || f.endsWith('.js')) &&\n (f.includes('client') || f.includes('Client')),\n );\n\n if (instrumentationFiles.length === 0) {\n analytics.capture(WIZARD_INTERACTION, {\n action: 'aborted due to missing instrumentation-client',\n integration: INTEGRATION_NAME,\n });\n return abort(\n 'No instrumentation-client file found. Please set up Next.js instrumentation-client first. Try using this wizard to do it!',\n );\n }\n\n analytics.capture(WIZARD_INTERACTION, {\n action: 'started event setup',\n integration: INTEGRATION_NAME,\n instrumentationFilesCount: instrumentationFiles.length,\n });\n\n // Get the project file tree\n const s = clack.spinner();\n s.start('Analyzing your project structure');\n\n const projectFiles = await getAllFilesInProject(options.installDir);\n const relativeFiles = projectFiles\n .map((f) => path.relative(options.installDir, f))\n .filter((f) => {\n // Exclude instrumentation files and next.config\n const isInstrumentation =\n f.includes('instrumentation') &&\n (f.endsWith('.ts') || f.endsWith('.js'));\n const isNextConfig = f.startsWith('next.config.') || f === 'next.config';\n return !isInstrumentation && !isNextConfig;\n });\n\n debug('Total files found:', projectFiles.length);\n debug('Files after filtering:', relativeFiles.length);\n s.stop('Project structure analyzed');\n\n analytics.capture(WIZARD_INTERACTION, {\n action: 'analyzed project structure',\n integration: INTEGRATION_NAME,\n totalFiles: projectFiles.length,\n eligibleFiles: relativeFiles.length,\n });\n\n // Send file tree to AI to get 10 most useful files\n s.start('Selecting some files to enhance with events...');\n\n const fileSelectionPrompt = `Given this Next.js 15.3+ project structure and package.json, select up to 10 CLIENT-SIDE FILES for adding PostHog analytics events.\n \n IMPORTANT: Only select files that:\n - Have \"use client\" directive at the top, OR\n - Use React hooks (useState, useEffect, etc.), OR \n - Have event handlers (onClick, onSubmit, onChange)\n \n DO NOT select:\n - API routes (files in /api/ or route.ts/route.js files)\n - Server Components (files without \"use client\" and no hooks/handlers)\n - Layout files (layout.tsx/layout.js)\n - Configuration files\n - Pure utility files\n \n Focus on:\n - User interaction points (buttons, forms, navigation)\n - Key user flows (auth, checkout, main features)\n - Business-critical paths\n - Files that represent important user actions\n \n Package.json:\n ${JSON.stringify(packageJson, null, 2)}\n \n Project files:\n ${relativeFiles.join('\\n')}\n \n Return file paths for client-side files ONLY that would benefit most from analytics tracking. If there are fewer than 10 suitable client files, return only those.`;\n\n let selectedFiles: string[] = [];\n try {\n const response = await query({\n message: fileSelectionPrompt,\n model: 'gemini-2.5-flash',\n region: cloudRegion,\n schema: FileSelectionSchema,\n accessToken,\n projectId,\n });\n selectedFiles = response.files;\n s.stop(`Selected ${selectedFiles.length} files for event tracking`);\n analytics.capture(WIZARD_INTERACTION, {\n action: 'selected files for tracking',\n integration: INTEGRATION_NAME,\n filesSelected: selectedFiles.length,\n });\n } catch (error) {\n s.stop('Failed to select files');\n analytics.capture(WIZARD_INTERACTION, {\n action: 'file selection failed',\n integration: INTEGRATION_NAME,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n return abort('Could not analyze project structure. Please try again.');\n }\n\n // Read the selected files and enhance them with events\n clack.log.info('Files selected for event tracking:');\n selectedFiles.forEach((file, index) => {\n clack.log.info(` ${index + 1}. ${file}`);\n });\n\n const enhancedFiles: Array<{\n filePath: string;\n events: Array<{ name: string; description: string }>;\n }> = [];\n\n clack.log.info(\n \"\\nEnhancing files with event tracking. Changes will be applied as they come in. Use your git interface to review new events. Feel free to toss anything you don't like...\",\n );\n\n for (const filePath of selectedFiles) {\n const fileSpinner = clack.spinner();\n fileSpinner.start(`Analyzing ${filePath}`);\n\n try {\n const fullPath = path.join(options.installDir, filePath);\n const fileContent = await fs.readFile(fullPath, 'utf8');\n\n const enhancePrompt = `You are enhancing a REAL production, client-side Next.js file with PostHog analytics. This is NOT an example or tutorial - add events to the ACTUAL code provided.\n \n - REQUIRED: import posthog from 'posthog-js'\n - Track events with: posthog.capture('event-name', { property: 'value' })\n - NEVER import PostHogClient from '@/app/posthog'\n - NEVER create functions with 'use server'\n\n CRITICAL INSTRUCTIONS:\n - This is a REAL file from a production codebase\n - DO NOT add placeholder comments like \"// In a real app...\" or \"// This is an example...\"\n - DO NOT modify the existing business logic or add simulation code\n - DO NOT add any tutorial-style comments\n - ONLY add PostHog event tracking to the existing, real functionality\n - DO NOT create wrapper functions around existing functions just to add tracking\n - Add tracking code directly inside existing functions where appropriate\n - NEVER import new packages or libraries that aren't already used in the file\n - ONLY use imports that already exist in the file or the PostHog imports specified\n - DO NOT assume any authentication library (Clerk, Auth.js, etc.) is available\n \n FORBIDDEN - NEVER DO THESE:\n - NEVER add 'use client' or 'use server' directives at the top of the file, or in functions\n - NEVER define new server actions (functions with \"use server\") in Client Components\n - NEVER create inline \"use server\" functions in files that have \"use client\"\n - NEVER use useEffect to track page views or component renders\n - NEVER track events like \"page_viewed\", \"form_viewed\", \"component_rendered\", \"flow_started\", \"page_opened\" etc\n - NEVER track that someone simply arrived at or viewed a page\n - NEVER change the file's existing client/server architecture\n - NEVER add events on component mount or render - only on actual user interactions\n - Track events on user interactions like clicks, form submissions, etc.\n \n Technical Rules:\n - This is a client-side file suitable for event tracking\n - REQUIRED IMPORT: import posthog from 'posthog-js'\n - Use the existing posthog instance for all tracking\n - Example: posthog.capture('button-clicked', { buttonId: 'submit' })\n - Focus on tracking user interactions in the UI components\n - Track events like button clicks, form submissions, navigation, etc.\n - Add 1-2 high-value events that track the ACTUAL user actions in this file\n - Use descriptive event names (lowercase-hyphenated) based on what the code ACTUALLY does\n - Include properties that capture REAL data from the existing code\n - For user identification: ONLY use user data that's already available in the code\n - DO NOT add code to fetch user IDs or authentication state if not already available in the file\n - Do not change the formatting of the file; only add events\n - Do not set timestamps on events; PostHog will do this automatically\n - Always return the entire file content, not just the changes\n - NEVER add events that correspond to page views; PostHog tracks these automatically\n - NEVER INSERT \"use client\" or \"use server\" directives\n \n File path: ${filePath}\n File content:\n ${fileContent}\n \n IMPORTANT: If this file only renders UI without any user interactions (no buttons, forms, or actions), \n or if the only possible events would be pageview-like (e.g., \"form-viewed\", \"page-opened\", \"flow-started\"),\n then SKIP THIS FILE by returning the original content unchanged. We only want to track actual user actions,\n not that someone looked at a page.\n \n Return the enhanced file with PostHog tracking added to the EXISTING functionality. List the events you added.`;\n\n const response = await query({\n message: enhancePrompt,\n model: 'gemini-2.5-pro',\n region: cloudRegion,\n schema: EnhancedFileSchema,\n accessToken,\n projectId,\n });\n\n // Apply changes immediately\n if (response.content !== fileContent) {\n await updateFile(\n {\n filePath,\n oldContent: fileContent,\n newContent: response.content,\n },\n options,\n );\n\n enhancedFiles.push({\n filePath,\n events: response.events,\n });\n\n fileSpinner.stop(\n `✓ Enhanced ${filePath} with ${response.events.length} events`,\n );\n analytics.capture(WIZARD_INTERACTION, {\n action: 'enhanced file',\n integration: INTEGRATION_NAME,\n filePath,\n eventsAdded: response.events.length,\n });\n } else {\n fileSpinner.stop(`No changes needed for ${filePath}`);\n analytics.capture(WIZARD_INTERACTION, {\n action: 'file skipped',\n integration: INTEGRATION_NAME,\n filePath,\n reason: 'no events to add',\n });\n }\n } catch (error) {\n fileSpinner.stop(`✗ Failed to enhance ${filePath}`);\n debug('Error enhancing file:', error);\n analytics.capture(WIZARD_INTERACTION, {\n action: 'file enhancement failed',\n integration: INTEGRATION_NAME,\n filePath,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n // Generate event tracking report\n const generateMarkdown = () => {\n let md = `# Event tracking report\\n\\n`;\n md += `This document lists all PostHog events that have been automatically added to your Next.js application.\\n\\n`;\n md += `## Events by File\\n\\n`;\n\n enhancedFiles.forEach((file) => {\n if (file.events.length > 0) {\n md += `### ${file.filePath}\\n\\n`;\n file.events.forEach((event) => {\n md += `- **${event.name}**: ${event.description}\\n`;\n });\n md += `\\n`;\n }\n });\n\n md += `\\n## Events still awaiting implementation\\n`;\n md += `- (human: you can fill these in)`;\n\n md += `\\n---\\n\\n`;\n md += `## Next Steps\\n\\n`;\n md += `1. Review the changes made to your files\\n`;\n md += `2. Test that events are being captured correctly\\n`;\n md += `3. Create insights and dashboards in PostHog\\n`;\n md += `4. Make a list of events we missed above. Knock them out yourself, or give this file to an agent.\\n\\n`;\n md += `Learn more about what to measure with PostHog and why: https://posthog.com/docs/new-to-posthog/getting-hogpilled\\n`;\n return md;\n };\n\n const markdownContent = generateMarkdown();\n const fileName = 'event-tracking-report.md';\n const filePath = path.join(options.installDir, fileName);\n\n await fs.writeFile(filePath, markdownContent);\n\n // Summary\n const totalEvents = enhancedFiles.reduce(\n (sum, file) => sum + file.events.length,\n 0,\n );\n\n analytics.capture(WIZARD_INTERACTION, {\n action: 'event setup completed',\n integration: INTEGRATION_NAME,\n totalEvents,\n filesEnhanced: enhancedFiles.length,\n filesProcessed: selectedFiles.length,\n });\n\n analytics.setTag('event-setup-total-events', totalEvents);\n analytics.setTag('event-setup-files-enhanced', enhancedFiles.length);\n\n clack.outro(\n `Success! Added ${chalk.bold(\n totalEvents.toString(),\n )} events across ${chalk.bold(enhancedFiles.length.toString())} files.\n \n Event tracking plan saved to: ${chalk.cyan(fileName)}\n \n Next steps:\n 1. Review changes with your favorite git tool\n 2. Revert unwanted changes with ${chalk.bold('git checkout <file>')}\n 3. Test that events are being captured in your PostHog project\n 4. Create insights in PostHog\n `,\n );\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import type { WizardOptions } from '../utils/types';
2
+ /**
3
+ * Simplified Next.js wizard that delegates to PostHog MCP's /integrate command
4
+ */
5
+ export declare function runNextjsWizardAgent(options: WizardOptions): Promise<void>;
@@ -0,0 +1,146 @@
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.runNextjsWizardAgent = runNextjsWizardAgent;
7
+ /* Simplified Next.js wizard using posthog-agent with PostHog MCP */
8
+ const clack_utils_1 = require("../utils/clack-utils");
9
+ const package_json_1 = require("../utils/package-json");
10
+ const utils_1 = require("./utils");
11
+ const clack_1 = __importDefault(require("../utils/clack"));
12
+ const constants_1 = require("../lib/constants");
13
+ const analytics_1 = require("../utils/analytics");
14
+ const clack_utils_2 = require("../utils/clack-utils");
15
+ const urls_1 = require("../utils/urls");
16
+ const chalk_1 = __importDefault(require("chalk"));
17
+ const steps_1 = require("../steps");
18
+ const debug_1 = require("../utils/debug");
19
+ const agent_interface_1 = require("../lib/agent-interface");
20
+ /**
21
+ * Simplified Next.js wizard that delegates to PostHog MCP's /integrate command
22
+ */
23
+ async function runNextjsWizardAgent(options) {
24
+ if (options.debug) {
25
+ (0, debug_1.enableDebugLogs)();
26
+ }
27
+ (0, clack_utils_1.printWelcome)({
28
+ wizardName: 'PostHog Next.js wizard (agent-powered)',
29
+ });
30
+ clack_1.default.log.info('🧙 The wizard has chosen you to try the next-generation agent integration for Next.js.\n\nStand by for the good stuff, and let me know how it goes:\n\ndanilo@posthog.com');
31
+ const aiConsent = await (0, clack_utils_1.askForAIConsent)(options);
32
+ if (!aiConsent) {
33
+ await (0, clack_utils_1.abort)('This wizard uses an LLM agent to intelligently modify your project. Please view the docs to setup Next.js manually instead: https://posthog.com/docs/libraries/next-js', 0);
34
+ }
35
+ const cloudRegion = options.cloudRegion ?? (await (0, clack_utils_2.askForCloudRegion)());
36
+ const typeScriptDetected = (0, clack_utils_1.isUsingTypeScript)(options);
37
+ await (0, clack_utils_1.confirmContinueIfNoOrDirtyGitRepo)(options);
38
+ const packageJson = await (0, clack_utils_1.getPackageDotJson)(options);
39
+ await (0, clack_utils_1.ensurePackageIsInstalled)(packageJson, 'next', 'Next.js');
40
+ const nextVersion = (0, package_json_1.getPackageVersion)('next', packageJson);
41
+ analytics_1.analytics.setTag('nextjs-version', (0, utils_1.getNextJsVersionBucket)(nextVersion));
42
+ analytics_1.analytics.capture(constants_1.WIZARD_INTERACTION_EVENT_NAME, {
43
+ action: 'started agent integration',
44
+ });
45
+ const { projectApiKey, host, accessToken } = await (0, clack_utils_1.getOrAskForProjectData)({
46
+ ...options,
47
+ cloudRegion,
48
+ });
49
+ const router = await (0, utils_1.getNextJsRouter)(options);
50
+ const routerType = router === utils_1.NextJsRouter.APP_ROUTER ? 'app' : 'pages';
51
+ const spinner = clack_1.default.spinner();
52
+ const agent = (0, agent_interface_1.initializeAgent)({
53
+ workingDirectory: options.installDir,
54
+ posthogMcpUrl: 'http://mcp.posthog.com/mcp',
55
+ posthogApiKey: accessToken,
56
+ debug: false,
57
+ }, options, spinner);
58
+ const integrationPrompt = buildIntegrationPrompt({
59
+ framework: 'Next.js',
60
+ version: nextVersion || 'latest',
61
+ router: routerType,
62
+ typescript: typeScriptDetected,
63
+ projectApiKey,
64
+ host,
65
+ });
66
+ await (0, agent_interface_1.runAgent)(agent, integrationPrompt, options, spinner, {
67
+ estimatedDurationMinutes: 8,
68
+ spinnerMessage: 'Writing your PostHog setup with events, error capture and more...',
69
+ successMessage: 'PostHog integration complete',
70
+ errorMessage: 'Integration failed',
71
+ });
72
+ const { relativeEnvFilePath, addedEnvVariables } = await (0, steps_1.addOrUpdateEnvironmentVariablesStep)({
73
+ variables: {
74
+ NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,
75
+ NEXT_PUBLIC_POSTHOG_HOST: host,
76
+ },
77
+ installDir: options.installDir,
78
+ integration: constants_1.Integration.nextjs,
79
+ });
80
+ const uploadedEnvVars = await (0, steps_1.uploadEnvironmentVariablesStep)({
81
+ NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,
82
+ NEXT_PUBLIC_POSTHOG_HOST: host,
83
+ }, {
84
+ integration: constants_1.Integration.nextjs,
85
+ options,
86
+ });
87
+ await (0, steps_1.addMCPServerToClientsStep)({
88
+ cloudRegion,
89
+ integration: constants_1.Integration.nextjs,
90
+ });
91
+ const continueUrl = options.signup
92
+ ? `${(0, urls_1.getCloudUrlFromRegion)(cloudRegion)}/products?source=wizard`
93
+ : undefined;
94
+ const changes = [
95
+ addedEnvVariables
96
+ ? `Added your Project API key to your ${relativeEnvFilePath} file`
97
+ : '',
98
+ uploadedEnvVars.length > 0
99
+ ? `Uploaded your Project API key to your hosting provider`
100
+ : '',
101
+ ].filter(Boolean);
102
+ const nextSteps = [
103
+ uploadedEnvVars.length === 0
104
+ ? `Upload your Project API key to your hosting provider`
105
+ : '',
106
+ ].filter(Boolean);
107
+ const outroMessage = `
108
+ ${chalk_1.default.green('Successfully installed PostHog!')}
109
+
110
+ ${chalk_1.default.cyan('What the agent did:')}
111
+ • Analyzed your Next.js project structure (${routerType} router)
112
+ • Created and configured PostHog initializers
113
+ • Integrated PostHog into your application
114
+ ${changes.map((change) => `• ${change}`).join('\n')}
115
+
116
+ ${chalk_1.default.yellow('Next steps:')}
117
+ • Start your development server to see PostHog in action
118
+ • Visit your PostHog dashboard to see incoming events
119
+ ${nextSteps.map((step) => `• ${step}`).join('\n')}
120
+
121
+ Learn more about PostHog + Next.js: ${chalk_1.default.cyan('https://posthog.com/docs/libraries/next-js')}
122
+ ${continueUrl ? `\nContinue onboarding: ${chalk_1.default.cyan(continueUrl)}\n` : ``}
123
+ ${chalk_1.default.dim('Note: This wizard uses an LLM agent to analyze and modify your project. Please review the changes made.')}
124
+
125
+ ${chalk_1.default.dim(`How did this work for you? Drop me a line: danilo@posthog.com`)}`;
126
+ clack_1.default.outro(outroMessage);
127
+ await analytics_1.analytics.shutdown('success');
128
+ }
129
+ function buildIntegrationPrompt(context) {
130
+ return `You have access to the PostHog MCP server which provides an integration resource to integrate PostHog into this ${context.framework} project.
131
+
132
+ Project context:
133
+ - Framework: ${context.framework} ${context.version}
134
+ - Router: ${context.router}
135
+ - TypeScript: ${context.typescript ? 'Yes' : 'No'}
136
+ - PostHog API Key: ${context.projectApiKey}
137
+ - PostHog Host: ${context.host}
138
+
139
+ Instructions:
140
+ 1. Call the PostHog MCP's resource for setup: posthog://integration/workflow/setup/begin
141
+ 2. Follow all instructions provided
142
+
143
+ The PostHog MCP will provide specific integration code and instructions. Please follow them carefully. Be sure to look for lockfiles to determine the appropriate package manager to use when installing PostHog. Do not manually edit the package.json file.
144
+ `;
145
+ }
146
+ //# sourceMappingURL=nextjs-wizard-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs-wizard-agent.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/* Simplified Next.js wizard using posthog-agent with PostHog MCP */\nimport {\n abort,\n askForAIConsent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n isUsingTypeScript,\n printWelcome,\n} from '../utils/clack-utils';\nimport { getPackageVersion } from '../utils/package-json';\nimport { getNextJsRouter, getNextJsVersionBucket, NextJsRouter } from './utils';\nimport clack from '../utils/clack';\nimport { Integration, WIZARD_INTERACTION_EVENT_NAME } from '../lib/constants';\nimport { analytics } from '../utils/analytics';\nimport type { WizardOptions } from '../utils/types';\nimport { askForCloudRegion } from '../utils/clack-utils';\nimport { getCloudUrlFromRegion } from '../utils/urls';\nimport chalk from 'chalk';\nimport {\n addOrUpdateEnvironmentVariablesStep,\n addMCPServerToClientsStep,\n uploadEnvironmentVariablesStep,\n} from '../steps';\nimport { enableDebugLogs } from '../utils/debug';\nimport { initializeAgent, runAgent } from '../lib/agent-interface';\n\n/**\n * Simplified Next.js wizard that delegates to PostHog MCP's /integrate command\n */\nexport async function runNextjsWizardAgent(\n options: WizardOptions,\n): Promise<void> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n printWelcome({\n wizardName: 'PostHog Next.js wizard (agent-powered)',\n });\n\n clack.log.info(\n '🧙 The wizard has chosen you to try the next-generation agent integration for Next.js.\\n\\nStand by for the good stuff, and let me know how it goes:\\n\\ndanilo@posthog.com',\n );\n\n const aiConsent = await askForAIConsent(options);\n\n if (!aiConsent) {\n await abort(\n 'This wizard uses an LLM agent to intelligently modify your project. Please view the docs to setup Next.js manually instead: https://posthog.com/docs/libraries/next-js',\n 0,\n );\n }\n\n const cloudRegion = options.cloudRegion ?? (await askForCloudRegion());\n const typeScriptDetected = isUsingTypeScript(options);\n\n await confirmContinueIfNoOrDirtyGitRepo(options);\n\n const packageJson = await getPackageDotJson(options);\n await ensurePackageIsInstalled(packageJson, 'next', 'Next.js');\n\n const nextVersion = getPackageVersion('next', packageJson);\n analytics.setTag('nextjs-version', getNextJsVersionBucket(nextVersion));\n\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'started agent integration',\n });\n\n const { projectApiKey, host, accessToken } = await getOrAskForProjectData({\n ...options,\n cloudRegion,\n });\n\n const router = await getNextJsRouter(options);\n const routerType = router === NextJsRouter.APP_ROUTER ? 'app' : 'pages';\n\n const spinner = clack.spinner();\n\n const agent = initializeAgent(\n {\n workingDirectory: options.installDir,\n posthogMcpUrl: 'http://mcp.posthog.com/mcp',\n posthogApiKey: accessToken,\n debug: false,\n },\n options,\n spinner,\n );\n\n const integrationPrompt = buildIntegrationPrompt({\n framework: 'Next.js',\n version: nextVersion || 'latest',\n router: routerType,\n typescript: typeScriptDetected,\n projectApiKey,\n host,\n });\n\n await runAgent(agent, integrationPrompt, options, spinner, {\n estimatedDurationMinutes: 8,\n spinnerMessage:\n 'Writing your PostHog setup with events, error capture and more...',\n successMessage: 'PostHog integration complete',\n errorMessage: 'Integration failed',\n });\n\n const { relativeEnvFilePath, addedEnvVariables } =\n await addOrUpdateEnvironmentVariablesStep({\n variables: {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n },\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const uploadedEnvVars = await uploadEnvironmentVariablesStep(\n {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n },\n {\n integration: Integration.nextjs,\n options,\n },\n );\n\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: Integration.nextjs,\n });\n\n const continueUrl = options.signup\n ? `${getCloudUrlFromRegion(cloudRegion)}/products?source=wizard`\n : undefined;\n\n const changes = [\n addedEnvVariables\n ? `Added your Project API key to your ${relativeEnvFilePath} file`\n : '',\n uploadedEnvVars.length > 0\n ? `Uploaded your Project API key to your hosting provider`\n : '',\n ].filter(Boolean);\n\n const nextSteps = [\n uploadedEnvVars.length === 0\n ? `Upload your Project API key to your hosting provider`\n : '',\n ].filter(Boolean);\n\n const outroMessage = `\n${chalk.green('Successfully installed PostHog!')}\n\n${chalk.cyan('What the agent did:')}\n• Analyzed your Next.js project structure (${routerType} router)\n• Created and configured PostHog initializers\n• Integrated PostHog into your application\n${changes.map((change) => `• ${change}`).join('\\n')}\n\n${chalk.yellow('Next steps:')}\n• Start your development server to see PostHog in action\n• Visit your PostHog dashboard to see incoming events\n${nextSteps.map((step) => `• ${step}`).join('\\n')}\n\nLearn more about PostHog + Next.js: ${chalk.cyan(\n 'https://posthog.com/docs/libraries/next-js',\n )}\n${continueUrl ? `\\nContinue onboarding: ${chalk.cyan(continueUrl)}\\n` : ``}\n${chalk.dim(\n 'Note: This wizard uses an LLM agent to analyze and modify your project. Please review the changes made.',\n)}\n\n${chalk.dim(`How did this work for you? Drop me a line: danilo@posthog.com`)}`;\n\n clack.outro(outroMessage);\n\n await analytics.shutdown('success');\n}\n\nfunction buildIntegrationPrompt(context: {\n framework: string;\n version: string;\n router: string;\n typescript: boolean;\n projectApiKey: string;\n host: string;\n}): string {\n return `You have access to the PostHog MCP server which provides an integration resource to integrate PostHog into this ${\n context.framework\n } project.\n\nProject context:\n- Framework: ${context.framework} ${context.version}\n- Router: ${context.router}\n- TypeScript: ${context.typescript ? 'Yes' : 'No'}\n- PostHog API Key: ${context.projectApiKey}\n- PostHog Host: ${context.host}\n\nInstructions:\n1. Call the PostHog MCP's resource for setup: posthog://integration/workflow/setup/begin\n2. Follow all instructions provided\n\nThe PostHog MCP will provide specific integration code and instructions. Please follow them carefully. Be sure to look for lockfiles to determine the appropriate package manager to use when installing PostHog. Do not manually edit the package.json file.\n`;\n}\n"]}
@@ -65,7 +65,7 @@ async function runNextjsWizard(options) {
65
65
  await (0, clack_utils_1.ensurePackageIsInstalled)(packageJson, 'next', 'Next.js');
66
66
  const nextVersion = (0, package_json_1.getPackageVersion)('next', packageJson);
67
67
  analytics_1.analytics.setTag('nextjs-version', (0, utils_1.getNextJsVersionBucket)(nextVersion));
68
- const { projectApiKey, wizardHash, host } = await (0, clack_utils_1.getOrAskForProjectData)({
68
+ const { projectApiKey, accessToken, host, projectId } = await (0, clack_utils_1.getOrAskForProjectData)({
69
69
  ...options,
70
70
  cloudRegion,
71
71
  });
@@ -115,16 +115,18 @@ async function runNextjsWizard(options) {
115
115
  integration: constants_1.Integration.nextjs,
116
116
  relevantFiles,
117
117
  documentation: installationDocumentation,
118
- wizardHash,
118
+ accessToken,
119
119
  cloudRegion,
120
+ projectId,
120
121
  });
121
122
  await (0, file_utils_1.generateFileChangesForIntegration)({
122
123
  integration: constants_1.Integration.nextjs,
123
124
  filesToChange,
124
- wizardHash,
125
+ accessToken,
125
126
  installDir: options.installDir,
126
127
  documentation: installationDocumentation,
127
128
  cloudRegion,
129
+ projectId,
128
130
  });
129
131
  const packageManagerForOutro = packageManagerFromInstallStep ?? (await (0, clack_utils_1.getPackageManager)(options));
130
132
  await (0, steps_1.runPrettierStep)({
@@ -1 +1 @@
1
- {"version":3,"file":"nextjs-wizard.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\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 {\n getNextJsRouter,\n getNextJsRouterName,\n getNextJsVersionBucket,\n NextJsRouter,\n} from './utils';\nimport clack from '../utils/clack';\nimport { Integration } from '../lib/constants';\nimport {\n getNextjsAppRouterDocs,\n getNextjsPagesRouterDocs,\n getModernNextjsDocs,\n} 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 { getOutroMessage } from '../lib/messages';\nimport {\n addEditorRulesStep,\n addOrUpdateEnvironmentVariablesStep,\n runPrettierStep,\n addMCPServerToClientsStep,\n uploadEnvironmentVariablesStep,\n} from '../steps';\n\nimport * as semver from 'semver';\n\nexport async function runNextjsWizard(options: WizardOptions): Promise<void> {\n printWelcome({\n wizardName: 'PostHog Next.js wizard',\n });\n\n const aiConsent = await askForAIConsent(options);\n\n if (!aiConsent) {\n await abort(\n 'The Next.js wizard requires AI to get setup right now. Please view the docs to setup Next.js manually instead: https://posthog.com/docs/libraries/next-js',\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, 'next', 'Next.js');\n\n const nextVersion = getPackageVersion('next', packageJson);\n\n analytics.setTag('nextjs-version', getNextJsVersionBucket(nextVersion));\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.nextjs,\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.nextjs,\n });\n\n const relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n let installationDocumentation; // Documentation for the installation of the PostHog SDK\n\n if (instrumentationFileAvailable(nextVersion)) {\n installationDocumentation = getModernNextjsDocs({\n host,\n language: typeScriptDetected ? 'typescript' : 'javascript',\n });\n\n clack.log.info(`Reviewing PostHog documentation for Next.js`);\n } else {\n const router = await getNextJsRouter(options);\n\n installationDocumentation = getInstallationDocumentation({\n router,\n host,\n language: typeScriptDetected ? 'typescript' : 'javascript',\n });\n\n clack.log.info(\n `Reviewing PostHog documentation for ${getNextJsRouterName(router)}`,\n );\n }\n\n const filesToChange = await getFilesToChange({\n integration: Integration.nextjs,\n relevantFiles,\n documentation: installationDocumentation,\n wizardHash,\n cloudRegion,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.nextjs,\n filesToChange,\n wizardHash,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager(options));\n\n await runPrettierStep({\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const { relativeEnvFilePath, addedEnvVariables } =\n await addOrUpdateEnvironmentVariablesStep({\n variables: {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n },\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const uploadedEnvVars = await uploadEnvironmentVariablesStep(\n {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n },\n {\n integration: Integration.nextjs,\n options,\n },\n );\n\n const addedEditorRules = await addEditorRulesStep({\n rulesName: 'next-rules.md',\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: Integration.nextjs,\n });\n\n const outroMessage = getOutroMessage({\n options,\n integration: Integration.nextjs,\n cloudRegion,\n addedEditorRules,\n packageManager: packageManagerForOutro,\n envFileChanged: addedEnvVariables ? relativeEnvFilePath : undefined,\n uploadedEnvVars,\n });\n\n clack.outro(outroMessage);\n\n clack.outro(\n 'Want to try our experimental event instrumentation? Run the wizard again with this argument: npx @posthog/wizard@latest event-setup',\n );\n\n await analytics.shutdown('success');\n}\n\nfunction instrumentationFileAvailable(\n nextVersion: string | undefined,\n): boolean {\n const minimumVersion = '15.3.0'; //instrumentation-client.js|ts was introduced in 15.3\n\n if (!nextVersion) {\n return false;\n }\n const coercedNextVersion = semver.coerce(nextVersion);\n if (!coercedNextVersion) {\n return false; // Unable to parse nextVersion\n }\n return semver.gte(coercedNextVersion, minimumVersion);\n}\n\nfunction getInstallationDocumentation({\n router,\n host,\n language,\n}: {\n router: NextJsRouter;\n host: string;\n language: 'typescript' | 'javascript';\n}) {\n if (router === NextJsRouter.PAGES_ROUTER) {\n return getNextjsPagesRouterDocs({ host, language });\n }\n\n return getNextjsAppRouterDocs({ host, language });\n}\n"]}
1
+ {"version":3,"file":"nextjs-wizard.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\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 {\n getNextJsRouter,\n getNextJsRouterName,\n getNextJsVersionBucket,\n NextJsRouter,\n} from './utils';\nimport clack from '../utils/clack';\nimport { Integration } from '../lib/constants';\nimport {\n getNextjsAppRouterDocs,\n getNextjsPagesRouterDocs,\n getModernNextjsDocs,\n} 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 { getOutroMessage } from '../lib/messages';\nimport {\n addEditorRulesStep,\n addOrUpdateEnvironmentVariablesStep,\n runPrettierStep,\n addMCPServerToClientsStep,\n uploadEnvironmentVariablesStep,\n} from '../steps';\n\nimport * as semver from 'semver';\n\nexport async function runNextjsWizard(options: WizardOptions): Promise<void> {\n printWelcome({\n wizardName: 'PostHog Next.js wizard',\n });\n\n const aiConsent = await askForAIConsent(options);\n\n if (!aiConsent) {\n await abort(\n 'The Next.js wizard requires AI to get setup right now. Please view the docs to setup Next.js manually instead: https://posthog.com/docs/libraries/next-js',\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, 'next', 'Next.js');\n\n const nextVersion = getPackageVersion('next', packageJson);\n\n analytics.setTag('nextjs-version', getNextJsVersionBucket(nextVersion));\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.nextjs,\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.nextjs,\n });\n\n const relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n let installationDocumentation; // Documentation for the installation of the PostHog SDK\n\n if (instrumentationFileAvailable(nextVersion)) {\n installationDocumentation = getModernNextjsDocs({\n host,\n language: typeScriptDetected ? 'typescript' : 'javascript',\n });\n\n clack.log.info(`Reviewing PostHog documentation for Next.js`);\n } else {\n const router = await getNextJsRouter(options);\n\n installationDocumentation = getInstallationDocumentation({\n router,\n host,\n language: typeScriptDetected ? 'typescript' : 'javascript',\n });\n\n clack.log.info(\n `Reviewing PostHog documentation for ${getNextJsRouterName(router)}`,\n );\n }\n\n const filesToChange = await getFilesToChange({\n integration: Integration.nextjs,\n relevantFiles,\n documentation: installationDocumentation,\n accessToken,\n cloudRegion,\n projectId,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.nextjs,\n filesToChange,\n accessToken,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\n projectId,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager(options));\n\n await runPrettierStep({\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const { relativeEnvFilePath, addedEnvVariables } =\n await addOrUpdateEnvironmentVariablesStep({\n variables: {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n },\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const uploadedEnvVars = await uploadEnvironmentVariablesStep(\n {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n },\n {\n integration: Integration.nextjs,\n options,\n },\n );\n\n const addedEditorRules = await addEditorRulesStep({\n rulesName: 'next-rules.md',\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: Integration.nextjs,\n });\n\n const outroMessage = getOutroMessage({\n options,\n integration: Integration.nextjs,\n cloudRegion,\n addedEditorRules,\n packageManager: packageManagerForOutro,\n envFileChanged: addedEnvVariables ? relativeEnvFilePath : undefined,\n uploadedEnvVars,\n });\n\n clack.outro(outroMessage);\n\n clack.outro(\n 'Want to try our experimental event instrumentation? Run the wizard again with this argument: npx @posthog/wizard@latest event-setup',\n );\n\n await analytics.shutdown('success');\n}\n\nfunction instrumentationFileAvailable(\n nextVersion: string | undefined,\n): boolean {\n const minimumVersion = '15.3.0'; //instrumentation-client.js|ts was introduced in 15.3\n\n if (!nextVersion) {\n return false;\n }\n const coercedNextVersion = semver.coerce(nextVersion);\n if (!coercedNextVersion) {\n return false; // Unable to parse nextVersion\n }\n return semver.gte(coercedNextVersion, minimumVersion);\n}\n\nfunction getInstallationDocumentation({\n router,\n host,\n language,\n}: {\n router: NextJsRouter;\n host: string;\n language: 'typescript' | 'javascript';\n}) {\n if (router === NextJsRouter.PAGES_ROUTER) {\n return getNextjsPagesRouterDocs({ host, language });\n }\n\n return getNextjsAppRouterDocs({ host, language });\n}\n"]}
@@ -34,7 +34,7 @@ async function runReactWizard(options) {
34
34
  if (reactVersion) {
35
35
  analytics_1.analytics.setTag('react-version', reactVersion);
36
36
  }
37
- const { projectApiKey, wizardHash, host } = await (0, clack_utils_1.getOrAskForProjectData)({
37
+ const { projectApiKey, accessToken, host, projectId } = await (0, clack_utils_1.getOrAskForProjectData)({
38
38
  ...options,
39
39
  cloudRegion,
40
40
  });
@@ -63,16 +63,18 @@ async function runReactWizard(options) {
63
63
  integration: constants_1.Integration.react,
64
64
  relevantFiles,
65
65
  documentation: installationDocumentation,
66
- wizardHash,
66
+ accessToken,
67
67
  cloudRegion,
68
+ projectId,
68
69
  });
69
70
  await (0, file_utils_1.generateFileChangesForIntegration)({
70
71
  integration: constants_1.Integration.react,
71
72
  filesToChange,
72
- wizardHash,
73
+ accessToken,
73
74
  installDir: options.installDir,
74
75
  documentation: installationDocumentation,
75
76
  cloudRegion,
77
+ projectId,
76
78
  });
77
79
  const { relativeEnvFilePath, addedEnvVariables } = await (0, steps_1.addOrUpdateEnvironmentVariablesStep)({
78
80
  variables: {
@@ -1 +1 @@
1
- {"version":3,"file":"react-wizard.js","sourceRoot":"","sources":["../../../src/react/react-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 { getReactDocumentation } from './docs';\nimport { analytics } from '../utils/analytics';\nimport { detectEnvVarPrefix } from '../utils/environment';\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 { getOutroMessage } from '../lib/messages';\nimport {\n addEditorRulesStep,\n addMCPServerToClientsStep,\n addOrUpdateEnvironmentVariablesStep,\n runPrettierStep,\n} from '../steps';\nimport { uploadEnvironmentVariablesStep } from '../steps/upload-environment-variables';\n\nexport async function runReactWizard(options: WizardOptions): Promise<void> {\n printWelcome({\n wizardName: 'PostHog React wizard',\n });\n\n const aiConsent = await askForAIConsent(options);\n\n if (!aiConsent) {\n await abort(\n 'The React wizard requires AI to get setup right now. Please view the docs to setup React manually instead: https://posthog.com/docs/libraries/react',\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, 'react', 'React');\n\n const reactVersion = getPackageVersion('react', packageJson);\n\n if (reactVersion) {\n analytics.setTag('react-version', reactVersion);\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.react,\n });\n\n const relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.react,\n });\n\n const envVarPrefix = await detectEnvVarPrefix(options);\n\n const installationDocumentation = getReactDocumentation({\n language: typeScriptDetected ? 'typescript' : 'javascript',\n envVarPrefix,\n });\n\n clack.log.info(`Reviewing PostHog documentation for React`);\n\n const filesToChange = await getFilesToChange({\n integration: Integration.react,\n relevantFiles,\n documentation: installationDocumentation,\n wizardHash,\n cloudRegion,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.react,\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 [envVarPrefix + 'POSTHOG_KEY']: projectApiKey,\n [envVarPrefix + 'POSTHOG_HOST']: host,\n },\n installDir: options.installDir,\n integration: Integration.react,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager(options));\n\n await runPrettierStep({\n installDir: options.installDir,\n integration: Integration.react,\n });\n\n const addedEditorRules = await addEditorRulesStep({\n installDir: options.installDir,\n rulesName: 'react-rules.md',\n integration: Integration.react,\n });\n\n const uploadedEnvVars = await uploadEnvironmentVariablesStep(\n {\n [envVarPrefix + 'POSTHOG_KEY']: projectApiKey,\n [envVarPrefix + 'POSTHOG_HOST']: host,\n },\n {\n integration: Integration.react,\n options,\n },\n );\n\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: Integration.react,\n });\n\n const outroMessage = getOutroMessage({\n options,\n integration: Integration.react,\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":"react-wizard.js","sourceRoot":"","sources":["../../../src/react/react-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 { getReactDocumentation } from './docs';\nimport { analytics } from '../utils/analytics';\nimport { detectEnvVarPrefix } from '../utils/environment';\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 { getOutroMessage } from '../lib/messages';\nimport {\n addEditorRulesStep,\n addMCPServerToClientsStep,\n addOrUpdateEnvironmentVariablesStep,\n runPrettierStep,\n} from '../steps';\nimport { uploadEnvironmentVariablesStep } from '../steps/upload-environment-variables';\n\nexport async function runReactWizard(options: WizardOptions): Promise<void> {\n printWelcome({\n wizardName: 'PostHog React wizard',\n });\n\n const aiConsent = await askForAIConsent(options);\n\n if (!aiConsent) {\n await abort(\n 'The React wizard requires AI to get setup right now. Please view the docs to setup React manually instead: https://posthog.com/docs/libraries/react',\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, 'react', 'React');\n\n const reactVersion = getPackageVersion('react', packageJson);\n\n if (reactVersion) {\n analytics.setTag('react-version', reactVersion);\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.react,\n });\n\n const relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.react,\n });\n\n const envVarPrefix = await detectEnvVarPrefix(options);\n\n const installationDocumentation = getReactDocumentation({\n language: typeScriptDetected ? 'typescript' : 'javascript',\n envVarPrefix,\n });\n\n clack.log.info(`Reviewing PostHog documentation for React`);\n\n const filesToChange = await getFilesToChange({\n integration: Integration.react,\n relevantFiles,\n documentation: installationDocumentation,\n accessToken,\n cloudRegion,\n projectId,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.react,\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 [envVarPrefix + 'POSTHOG_KEY']: projectApiKey,\n [envVarPrefix + 'POSTHOG_HOST']: host,\n },\n installDir: options.installDir,\n integration: Integration.react,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager(options));\n\n await runPrettierStep({\n installDir: options.installDir,\n integration: Integration.react,\n });\n\n const addedEditorRules = await addEditorRulesStep({\n installDir: options.installDir,\n rulesName: 'react-rules.md',\n integration: Integration.react,\n });\n\n const uploadedEnvVars = await uploadEnvironmentVariablesStep(\n {\n [envVarPrefix + 'POSTHOG_KEY']: projectApiKey,\n [envVarPrefix + 'POSTHOG_HOST']: host,\n },\n {\n integration: Integration.react,\n options,\n },\n );\n\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: Integration.react,\n });\n\n const outroMessage = getOutroMessage({\n options,\n integration: Integration.react,\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"]}