@posthog/wizard 1.23.0 → 1.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -48,11 +48,48 @@ The following CLI arguments are available:
48
48
  | `--integration` | Integration to set up | string | | "nextjs", "astro", "react", "svelte", "react-native" | |
49
49
  | `--force-install` | Force install packages even if peer dependency checks fail | boolean | `false` | | `POSTHOG_WIZARD_FORCE_INSTALL` |
50
50
  | `--install-dir` | Directory to install PostHog in | string | | | `POSTHOG_WIZARD_INSTALL_DIR` |
51
+ | `--ci` | Enable CI mode for non-interactive execution | boolean | `false` | | `POSTHOG_WIZARD_CI` |
52
+ | `--api-key` | PostHog personal API key (phx_xxx) for authentication | string | | | `POSTHOG_WIZARD_API_KEY` |
51
53
 
52
54
  > Note: A large amount of the scaffolding for this came from the amazing Sentry
53
55
  > wizard, which you can find [here](https://github.com/getsentry/sentry-wizard)
54
56
  > 💖
55
57
 
58
+ # CI Mode
59
+
60
+ Run the wizard non-interactive executions with `--ci`:
61
+
62
+ ```bash
63
+ npx @posthog/wizard --ci --region us --api-key $POSTHOG_PERSONAL_API_KEY --install-dir .
64
+ ```
65
+
66
+ When running in CI mode (`--ci`):
67
+
68
+ - Bypasses OAuth login flow (uses personal API key directly)
69
+ - Auto-selects defaults for all prompts
70
+ - Skips MCP server installation
71
+ - Auto-continues on git warnings (uncommitted/untracked files)
72
+ - Auto-consents to AI usage
73
+
74
+ The CLI args override environment variables in CI mode.
75
+
76
+ ### Required Flags for CI Mode
77
+
78
+ - `--region`: Cloud region (`us` or `eu`)
79
+ - `--api-key`: Personal API key (`phx_xxx`) from your [PostHog settings](https://app.posthog.com/settings/user-api-keys)
80
+ - `--install-dir`: Directory to install PostHog in (e.g., `.` for current directory)
81
+
82
+ ### Required API Key Scopes
83
+
84
+ When creating your personal API key, ensure it has the following scopes enabled:
85
+
86
+ - `user:read` - Required to fetch user information
87
+ - `project:read` - Required to fetch project details and API token
88
+ - `introspection` - Required for API introspection
89
+ - `llm_gateway:read` - Required for LLM gateway access
90
+ - `dashboard:write` - Required to create dashboards
91
+ - `insight:write` - Required to create insights
92
+
56
93
  # Steal this code
57
94
 
58
95
  While the wizard works great on its own, we also find the approach used by this
package/dist/bin.js CHANGED
@@ -20,13 +20,6 @@ const mcp_1 = require("./src/mcp");
20
20
  const run_1 = require("./src/run");
21
21
  const environment_1 = require("./src/utils/environment");
22
22
  const clack_1 = __importDefault(require("./src/utils/clack"));
23
- if ((0, environment_1.isNonInteractiveEnvironment)()) {
24
- clack_1.default.intro(chalk_1.default.inverse(`PostHog Wizard`));
25
- clack_1.default.log.error('This installer requires an interactive terminal (TTY) to run.\n' +
26
- 'It appears you are running in a non-interactive environment.\n' +
27
- 'Please run the wizard in an interactive terminal.');
28
- process.exit(1);
29
- }
30
23
  if (process.env.NODE_ENV === 'test') {
31
24
  void (async () => {
32
25
  try {
@@ -69,6 +62,15 @@ if (process.env.NODE_ENV === 'test') {
69
62
  describe: 'Use local MCP server at http://localhost:8787/mcp\nenv: POSTHOG_WIZARD_LOCAL_MCP',
70
63
  type: 'boolean',
71
64
  },
65
+ ci: {
66
+ default: false,
67
+ describe: 'Enable CI mode for non-interactive execution\nenv: POSTHOG_WIZARD_CI',
68
+ type: 'boolean',
69
+ },
70
+ 'api-key': {
71
+ describe: 'PostHog personal API key (phx_xxx) for authentication\nenv: POSTHOG_WIZARD_API_KEY',
72
+ type: 'string',
73
+ },
72
74
  })
73
75
  .command(['$0'], 'Run the PostHog setup wizard', (yargs) => {
74
76
  return yargs.options({
@@ -89,6 +91,35 @@ if (process.env.NODE_ENV === 'test') {
89
91
  });
90
92
  }, (argv) => {
91
93
  const options = { ...argv };
94
+ // CI mode validation and TTY check
95
+ if (options.ci) {
96
+ // Validate required CI flags
97
+ if (!options.region) {
98
+ clack_1.default.intro(chalk_1.default.inverse(`PostHog Wizard`));
99
+ clack_1.default.log.error('CI mode requires --region (us or eu)');
100
+ process.exit(1);
101
+ }
102
+ if (!options.apiKey) {
103
+ clack_1.default.intro(chalk_1.default.inverse(`PostHog Wizard`));
104
+ clack_1.default.log.error('CI mode requires --api-key (personal API key phx_xxx)');
105
+ process.exit(1);
106
+ }
107
+ if (!options.installDir) {
108
+ clack_1.default.intro(chalk_1.default.inverse(`PostHog Wizard`));
109
+ clack_1.default.log.error('CI mode requires --install-dir (directory to install PostHog in)');
110
+ process.exit(1);
111
+ }
112
+ }
113
+ else if ((0, environment_1.isNonInteractiveEnvironment)()) {
114
+ // Original TTY error for non-CI mode
115
+ clack_1.default.intro(chalk_1.default.inverse(`PostHog Wizard`));
116
+ clack_1.default.log.error('This installer requires an interactive terminal (TTY) to run.\n' +
117
+ 'It appears you are running in a non-interactive environment.\n' +
118
+ 'Please run the wizard in an interactive terminal.\n\n' +
119
+ 'For CI/CD environments, use --ci mode:\n' +
120
+ ' npx @posthog/wizard --ci --region us --api-key phx_xxx');
121
+ process.exit(1);
122
+ }
92
123
  void (0, run_1.runWizard)(options);
93
124
  })
94
125
  .command('mcp <command>', 'MCP server management commands', (yargs) => {
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","sourceRoot":"","sources":["../bin.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { satisfies } from 'semver';\nimport { red } from './src/utils/logging';\n\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport chalk from 'chalk';\n\nconst NODE_VERSION_RANGE = '>=18.17.0';\n\n// Have to run this above the other imports because they are importing clack that\n// has the problematic imports.\nif (!satisfies(process.version, NODE_VERSION_RANGE)) {\n red(\n `PostHog wizard requires Node.js ${NODE_VERSION_RANGE}. You are using Node.js ${process.version}. Please upgrade your Node.js version.`,\n );\n process.exit(1);\n}\n\nimport { runMCPInstall, runMCPRemove } from './src/mcp';\nimport type { CloudRegion, WizardOptions } from './src/utils/types';\nimport { runWizard } from './src/run';\nimport { isNonInteractiveEnvironment } from './src/utils/environment';\nimport clack from './src/utils/clack';\n\nif (isNonInteractiveEnvironment()) {\n clack.intro(chalk.inverse(`PostHog Wizard`));\n\n clack.log.error(\n 'This installer requires an interactive terminal (TTY) to run.\\n' +\n 'It appears you are running in a non-interactive environment.\\n' +\n 'Please run the wizard in an interactive terminal.',\n );\n process.exit(1);\n}\n\nif (process.env.NODE_ENV === 'test') {\n void (async () => {\n try {\n const { server } = await import('./e2e-tests/mocks/server.js');\n server.listen({\n onUnhandledRequest: 'bypass',\n });\n } catch (error) {\n // Mock server import failed - this can happen during non-E2E tests\n }\n })();\n}\n\nyargs(hideBin(process.argv))\n .env('POSTHOG_WIZARD')\n // global options\n .options({\n debug: {\n default: false,\n describe: 'Enable verbose logging\\nenv: POSTHOG_WIZARD_DEBUG',\n type: 'boolean',\n },\n region: {\n describe: 'PostHog cloud region\\nenv: POSTHOG_WIZARD_REGION',\n choices: ['us', 'eu'],\n type: 'string',\n },\n default: {\n default: true,\n describe:\n 'Use default options for all prompts\\nenv: POSTHOG_WIZARD_DEFAULT',\n type: 'boolean',\n },\n signup: {\n default: false,\n describe:\n 'Create a new PostHog account during setup\\nenv: POSTHOG_WIZARD_SIGNUP',\n type: 'boolean',\n },\n 'local-mcp': {\n default: false,\n describe:\n 'Use local MCP server at http://localhost:8787/mcp\\nenv: POSTHOG_WIZARD_LOCAL_MCP',\n type: 'boolean',\n },\n })\n .command(\n ['$0'],\n 'Run the PostHog setup wizard',\n (yargs) => {\n return yargs.options({\n 'force-install': {\n default: false,\n describe:\n 'Force install packages even if peer dependency checks fail\\nenv: POSTHOG_WIZARD_FORCE_INSTALL',\n type: 'boolean',\n },\n 'install-dir': {\n describe:\n 'Directory to install PostHog in\\nenv: POSTHOG_WIZARD_INSTALL_DIR',\n type: 'string',\n },\n integration: {\n describe: 'Integration to set up',\n choices: ['nextjs', 'astro', 'react', 'svelte', 'react-native'],\n type: 'string',\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n void runWizard(options as unknown as WizardOptions);\n },\n )\n .command('mcp <command>', 'MCP server management commands', (yargs) => {\n return yargs\n .command(\n 'add',\n 'Install PostHog MCP server to supported clients',\n (yargs) => {\n return yargs.options({\n local: {\n default: false,\n describe:\n 'Add local development MCP server (http://localhost:8787)',\n type: 'boolean',\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n void runMCPInstall(\n options as unknown as {\n signup: boolean;\n region?: CloudRegion;\n local?: boolean;\n debug?: boolean;\n },\n );\n },\n )\n .command(\n 'remove',\n 'Remove PostHog MCP server from supported clients',\n (yargs) => {\n return yargs.options({\n local: {\n default: false,\n describe:\n 'Remove local development MCP server (http://localhost:8787)',\n type: 'boolean',\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n void runMCPRemove(options as { local?: boolean });\n },\n )\n .demandCommand(1, 'You must specify a subcommand (add or remove)')\n .help();\n })\n .help()\n .alias('help', 'h')\n .version()\n .alias('version', 'v')\n .wrap(process.stdout.isTTY ? yargs.terminalWidth() : 80).argv;\n"]}
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../bin.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { satisfies } from 'semver';\nimport { red } from './src/utils/logging';\n\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport chalk from 'chalk';\n\nconst NODE_VERSION_RANGE = '>=18.17.0';\n\n// Have to run this above the other imports because they are importing clack that\n// has the problematic imports.\nif (!satisfies(process.version, NODE_VERSION_RANGE)) {\n red(\n `PostHog wizard requires Node.js ${NODE_VERSION_RANGE}. You are using Node.js ${process.version}. Please upgrade your Node.js version.`,\n );\n process.exit(1);\n}\n\nimport { runMCPInstall, runMCPRemove } from './src/mcp';\nimport type { CloudRegion, WizardOptions } from './src/utils/types';\nimport { runWizard } from './src/run';\nimport { isNonInteractiveEnvironment } from './src/utils/environment';\nimport clack from './src/utils/clack';\n\nif (process.env.NODE_ENV === 'test') {\n void (async () => {\n try {\n const { server } = await import('./e2e-tests/mocks/server.js');\n server.listen({\n onUnhandledRequest: 'bypass',\n });\n } catch (error) {\n // Mock server import failed - this can happen during non-E2E tests\n }\n })();\n}\n\nyargs(hideBin(process.argv))\n .env('POSTHOG_WIZARD')\n // global options\n .options({\n debug: {\n default: false,\n describe: 'Enable verbose logging\\nenv: POSTHOG_WIZARD_DEBUG',\n type: 'boolean',\n },\n region: {\n describe: 'PostHog cloud region\\nenv: POSTHOG_WIZARD_REGION',\n choices: ['us', 'eu'],\n type: 'string',\n },\n default: {\n default: true,\n describe:\n 'Use default options for all prompts\\nenv: POSTHOG_WIZARD_DEFAULT',\n type: 'boolean',\n },\n signup: {\n default: false,\n describe:\n 'Create a new PostHog account during setup\\nenv: POSTHOG_WIZARD_SIGNUP',\n type: 'boolean',\n },\n 'local-mcp': {\n default: false,\n describe:\n 'Use local MCP server at http://localhost:8787/mcp\\nenv: POSTHOG_WIZARD_LOCAL_MCP',\n type: 'boolean',\n },\n ci: {\n default: false,\n describe:\n 'Enable CI mode for non-interactive execution\\nenv: POSTHOG_WIZARD_CI',\n type: 'boolean',\n },\n 'api-key': {\n describe:\n 'PostHog personal API key (phx_xxx) for authentication\\nenv: POSTHOG_WIZARD_API_KEY',\n type: 'string',\n },\n })\n .command(\n ['$0'],\n 'Run the PostHog setup wizard',\n (yargs) => {\n return yargs.options({\n 'force-install': {\n default: false,\n describe:\n 'Force install packages even if peer dependency checks fail\\nenv: POSTHOG_WIZARD_FORCE_INSTALL',\n type: 'boolean',\n },\n 'install-dir': {\n describe:\n 'Directory to install PostHog in\\nenv: POSTHOG_WIZARD_INSTALL_DIR',\n type: 'string',\n },\n integration: {\n describe: 'Integration to set up',\n choices: ['nextjs', 'astro', 'react', 'svelte', 'react-native'],\n type: 'string',\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n\n // CI mode validation and TTY check\n if (options.ci) {\n // Validate required CI flags\n if (!options.region) {\n clack.intro(chalk.inverse(`PostHog Wizard`));\n clack.log.error('CI mode requires --region (us or eu)');\n process.exit(1);\n }\n if (!options.apiKey) {\n clack.intro(chalk.inverse(`PostHog Wizard`));\n clack.log.error(\n 'CI mode requires --api-key (personal API key phx_xxx)',\n );\n process.exit(1);\n }\n if (!options.installDir) {\n clack.intro(chalk.inverse(`PostHog Wizard`));\n clack.log.error(\n 'CI mode requires --install-dir (directory to install PostHog in)',\n );\n process.exit(1);\n }\n } else if (isNonInteractiveEnvironment()) {\n // Original TTY error for non-CI mode\n clack.intro(chalk.inverse(`PostHog Wizard`));\n clack.log.error(\n 'This installer requires an interactive terminal (TTY) to run.\\n' +\n 'It appears you are running in a non-interactive environment.\\n' +\n 'Please run the wizard in an interactive terminal.\\n\\n' +\n 'For CI/CD environments, use --ci mode:\\n' +\n ' npx @posthog/wizard --ci --region us --api-key phx_xxx',\n );\n process.exit(1);\n }\n\n void runWizard(options as unknown as WizardOptions);\n },\n )\n .command('mcp <command>', 'MCP server management commands', (yargs) => {\n return yargs\n .command(\n 'add',\n 'Install PostHog MCP server to supported clients',\n (yargs) => {\n return yargs.options({\n local: {\n default: false,\n describe:\n 'Add local development MCP server (http://localhost:8787)',\n type: 'boolean',\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n void runMCPInstall(\n options as unknown as {\n signup: boolean;\n region?: CloudRegion;\n local?: boolean;\n debug?: boolean;\n },\n );\n },\n )\n .command(\n 'remove',\n 'Remove PostHog MCP server from supported clients',\n (yargs) => {\n return yargs.options({\n local: {\n default: false,\n describe:\n 'Remove local development MCP server (http://localhost:8787)',\n type: 'boolean',\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n void runMCPRemove(options as { local?: boolean });\n },\n )\n .demandCommand(1, 'You must specify a subcommand (add or remove)')\n .help();\n })\n .help()\n .alias('help', 'h')\n .version()\n .alias('version', 'v')\n .wrap(process.stdout.isTTY ? yargs.terminalWidth() : 80).argv;\n"]}
@@ -21,6 +21,9 @@ describe('CLI argument parsing', () => {
21
21
  process.env = { ...originalEnv };
22
22
  delete process.env.POSTHOG_WIZARD_REGION;
23
23
  delete process.env.POSTHOG_WIZARD_DEFAULT;
24
+ delete process.env.POSTHOG_WIZARD_CI;
25
+ delete process.env.POSTHOG_WIZARD_API_KEY;
26
+ delete process.env.POSTHOG_WIZARD_INSTALL_DIR;
24
27
  // Mock process.exit to prevent test runner from exiting
25
28
  process.exit = jest.fn();
26
29
  });
@@ -145,5 +148,93 @@ describe('CLI argument parsing', () => {
145
148
  expect(args.debug).toBe(true);
146
149
  });
147
150
  });
151
+ describe('--ci flag', () => {
152
+ test('defaults to false when not specified', async () => {
153
+ await runCLI([]);
154
+ const args = getLastCallArgs(mockRunWizard);
155
+ expect(args.ci).toBe(false);
156
+ });
157
+ test('can be set to true', async () => {
158
+ await runCLI([
159
+ '--ci',
160
+ '--region',
161
+ 'us',
162
+ '--api-key',
163
+ 'phx_test',
164
+ '--install-dir',
165
+ '/tmp/test',
166
+ ]);
167
+ const args = getLastCallArgs(mockRunWizard);
168
+ expect(args.ci).toBe(true);
169
+ });
170
+ test('requires --region when --ci is set', async () => {
171
+ await runCLI([
172
+ '--ci',
173
+ '--api-key',
174
+ 'phx_test',
175
+ '--install-dir',
176
+ '/tmp/test',
177
+ ]);
178
+ expect(process.exit).toHaveBeenCalledWith(1);
179
+ });
180
+ test('requires --api-key when --ci is set', async () => {
181
+ await runCLI(['--ci', '--region', 'us', '--install-dir', '/tmp/test']);
182
+ expect(process.exit).toHaveBeenCalledWith(1);
183
+ });
184
+ test('requires --install-dir when --ci is set', async () => {
185
+ await runCLI(['--ci', '--region', 'us', '--api-key', 'phx_test']);
186
+ expect(process.exit).toHaveBeenCalledWith(1);
187
+ });
188
+ test('passes --api-key to runWizard', async () => {
189
+ await runCLI([
190
+ '--ci',
191
+ '--region',
192
+ 'us',
193
+ '--api-key',
194
+ 'phx_test_key',
195
+ '--install-dir',
196
+ '/tmp/test',
197
+ ]);
198
+ const args = getLastCallArgs(mockRunWizard);
199
+ expect(args.apiKey).toBe('phx_test_key');
200
+ });
201
+ });
202
+ describe('CI environment variables', () => {
203
+ test('respects POSTHOG_WIZARD_CI', async () => {
204
+ process.env.POSTHOG_WIZARD_CI = 'true';
205
+ process.env.POSTHOG_WIZARD_REGION = 'us';
206
+ process.env.POSTHOG_WIZARD_API_KEY = 'phx_env_key';
207
+ process.env.POSTHOG_WIZARD_INSTALL_DIR = '/tmp/test';
208
+ await runCLI([]);
209
+ const args = getLastCallArgs(mockRunWizard);
210
+ expect(args.ci).toBe(true);
211
+ });
212
+ test('respects POSTHOG_WIZARD_API_KEY', async () => {
213
+ process.env.POSTHOG_WIZARD_CI = 'true';
214
+ process.env.POSTHOG_WIZARD_REGION = 'eu';
215
+ process.env.POSTHOG_WIZARD_API_KEY = 'phx_env_key';
216
+ process.env.POSTHOG_WIZARD_INSTALL_DIR = '/tmp/test';
217
+ await runCLI([]);
218
+ const args = getLastCallArgs(mockRunWizard);
219
+ expect(args.apiKey).toBe('phx_env_key');
220
+ });
221
+ test('CLI args override CI environment variables', async () => {
222
+ process.env.POSTHOG_WIZARD_CI = 'true';
223
+ process.env.POSTHOG_WIZARD_REGION = 'us';
224
+ process.env.POSTHOG_WIZARD_API_KEY = 'phx_env_key';
225
+ process.env.POSTHOG_WIZARD_INSTALL_DIR = '/tmp/test';
226
+ await runCLI([
227
+ '--region',
228
+ 'eu',
229
+ '--api-key',
230
+ 'phx_cli_key',
231
+ '--install-dir',
232
+ '/other/path',
233
+ ]);
234
+ const args = getLastCallArgs(mockRunWizard);
235
+ expect(args.region).toBe('eu');
236
+ expect(args.apiKey).toBe('phx_cli_key');
237
+ });
238
+ });
148
239
  });
149
240
  //# sourceMappingURL=cli.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../../src/__tests__/cli.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Mock functions must be defined before imports\nconst mockRunWizard = jest.fn();\nconst mockRunMCPInstall = jest.fn();\nconst mockRunMCPRemove = jest.fn();\n\njest.mock('../run', () => ({ runWizard: mockRunWizard }));\njest.mock('../mcp', () => ({\n runMCPInstall: mockRunMCPInstall,\n runMCPRemove: mockRunMCPRemove,\n}));\njest.mock('semver', () => ({ satisfies: () => true }));\n\ndescribe('CLI argument parsing', () => {\n const originalArgv = process.argv;\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalExit = process.exit;\n const originalEnv = { ...process.env };\n\n beforeEach(() => {\n jest.clearAllMocks();\n\n // Reset environment\n process.env = { ...originalEnv };\n delete process.env.POSTHOG_WIZARD_REGION;\n delete process.env.POSTHOG_WIZARD_DEFAULT;\n\n // Mock process.exit to prevent test runner from exiting\n process.exit = jest.fn() as any;\n });\n\n afterEach(() => {\n process.argv = originalArgv;\n process.exit = originalExit;\n process.env = originalEnv;\n jest.resetModules();\n });\n\n /**\n * Helper to run the CLI with given arguments\n */\n async function runCLI(args: string[]) {\n process.argv = ['node', 'bin.ts', ...args];\n\n jest.isolateModules(() => {\n require('../../bin.ts');\n });\n\n // Allow yargs to process\n await new Promise((resolve) => setImmediate(resolve));\n }\n\n /**\n * Helper to get the arguments passed to a mock function\n */\n function getLastCallArgs(mockFn: jest.Mock) {\n expect(mockFn).toHaveBeenCalled();\n return mockFn.mock.calls[mockFn.mock.calls.length - 1][0];\n }\n\n describe('--default flag', () => {\n test('defaults to true when not specified', async () => {\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.default).toBe(true);\n });\n\n test('can be explicitly set to false with --no-default', async () => {\n await runCLI(['--no-default']);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.default).toBe(false);\n });\n\n test('can be explicitly set to true', async () => {\n await runCLI(['--default']);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.default).toBe(true);\n });\n });\n\n describe('--region flag', () => {\n test('is undefined when not specified', async () => {\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.region).toBeUndefined();\n });\n\n test.each(['us', 'eu'])(\n 'accepts \"%s\" as a valid region',\n async (region) => {\n await runCLI(['--region', region]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.region).toBe(region);\n },\n );\n });\n\n describe('environment variables', () => {\n test('respects POSTHOG_WIZARD_REGION', async () => {\n process.env.POSTHOG_WIZARD_REGION = 'eu';\n\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.region).toBe('eu');\n });\n\n test('respects POSTHOG_WIZARD_DEFAULT', async () => {\n process.env.POSTHOG_WIZARD_DEFAULT = 'false';\n\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.default).toBe(false);\n });\n\n test('CLI args override environment variables', async () => {\n process.env.POSTHOG_WIZARD_REGION = 'us';\n process.env.POSTHOG_WIZARD_DEFAULT = 'false';\n\n await runCLI(['--region', 'eu', '--default']);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.region).toBe('eu');\n expect(args.default).toBe(true);\n });\n\n test('region is undefined when no env var or CLI arg', async () => {\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.region).toBeUndefined();\n });\n });\n\n describe('backward compatibility', () => {\n test('all existing flags continue to work', async () => {\n await runCLI([\n '--debug',\n '--signup',\n '--force-install',\n '--install-dir',\n '/custom/path',\n '--integration',\n 'nextjs',\n ]);\n\n const args = getLastCallArgs(mockRunWizard);\n\n // Existing flags\n expect(args.debug).toBe(true);\n expect(args.signup).toBe(true);\n expect(args['force-install']).toBe(true);\n expect(args['install-dir']).toBe('/custom/path');\n expect(args.integration).toBe('nextjs');\n\n // New defaults\n expect(args.default).toBe(true);\n expect(args.region).toBeUndefined();\n });\n });\n\n describe('mcp commands', () => {\n test('mcp add region is undefined when not specified', async () => {\n await runCLI(['mcp', 'add']);\n\n const args = getLastCallArgs(mockRunMCPInstall);\n expect(args.region).toBeUndefined();\n });\n\n test('mcp add respects --region flag', async () => {\n await runCLI(['mcp', 'add', '--region', 'eu']);\n\n const args = getLastCallArgs(mockRunMCPInstall);\n expect(args.region).toBe('eu');\n });\n\n test('mcp commands inherit global flags', async () => {\n await runCLI(['mcp', 'add', '--no-default', '--debug']);\n\n const args = getLastCallArgs(mockRunMCPInstall);\n expect(args.default).toBe(false);\n expect(args.debug).toBe(true);\n });\n });\n});\n"]}
1
+ {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../../src/__tests__/cli.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Mock functions must be defined before imports\nconst mockRunWizard = jest.fn();\nconst mockRunMCPInstall = jest.fn();\nconst mockRunMCPRemove = jest.fn();\n\njest.mock('../run', () => ({ runWizard: mockRunWizard }));\njest.mock('../mcp', () => ({\n runMCPInstall: mockRunMCPInstall,\n runMCPRemove: mockRunMCPRemove,\n}));\njest.mock('semver', () => ({ satisfies: () => true }));\n\ndescribe('CLI argument parsing', () => {\n const originalArgv = process.argv;\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalExit = process.exit;\n const originalEnv = { ...process.env };\n\n beforeEach(() => {\n jest.clearAllMocks();\n\n // Reset environment\n process.env = { ...originalEnv };\n delete process.env.POSTHOG_WIZARD_REGION;\n delete process.env.POSTHOG_WIZARD_DEFAULT;\n delete process.env.POSTHOG_WIZARD_CI;\n delete process.env.POSTHOG_WIZARD_API_KEY;\n delete process.env.POSTHOG_WIZARD_INSTALL_DIR;\n\n // Mock process.exit to prevent test runner from exiting\n process.exit = jest.fn() as any;\n });\n\n afterEach(() => {\n process.argv = originalArgv;\n process.exit = originalExit;\n process.env = originalEnv;\n jest.resetModules();\n });\n\n /**\n * Helper to run the CLI with given arguments\n */\n async function runCLI(args: string[]) {\n process.argv = ['node', 'bin.ts', ...args];\n\n jest.isolateModules(() => {\n require('../../bin.ts');\n });\n\n // Allow yargs to process\n await new Promise((resolve) => setImmediate(resolve));\n }\n\n /**\n * Helper to get the arguments passed to a mock function\n */\n function getLastCallArgs(mockFn: jest.Mock) {\n expect(mockFn).toHaveBeenCalled();\n return mockFn.mock.calls[mockFn.mock.calls.length - 1][0];\n }\n\n describe('--default flag', () => {\n test('defaults to true when not specified', async () => {\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.default).toBe(true);\n });\n\n test('can be explicitly set to false with --no-default', async () => {\n await runCLI(['--no-default']);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.default).toBe(false);\n });\n\n test('can be explicitly set to true', async () => {\n await runCLI(['--default']);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.default).toBe(true);\n });\n });\n\n describe('--region flag', () => {\n test('is undefined when not specified', async () => {\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.region).toBeUndefined();\n });\n\n test.each(['us', 'eu'])(\n 'accepts \"%s\" as a valid region',\n async (region) => {\n await runCLI(['--region', region]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.region).toBe(region);\n },\n );\n });\n\n describe('environment variables', () => {\n test('respects POSTHOG_WIZARD_REGION', async () => {\n process.env.POSTHOG_WIZARD_REGION = 'eu';\n\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.region).toBe('eu');\n });\n\n test('respects POSTHOG_WIZARD_DEFAULT', async () => {\n process.env.POSTHOG_WIZARD_DEFAULT = 'false';\n\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.default).toBe(false);\n });\n\n test('CLI args override environment variables', async () => {\n process.env.POSTHOG_WIZARD_REGION = 'us';\n process.env.POSTHOG_WIZARD_DEFAULT = 'false';\n\n await runCLI(['--region', 'eu', '--default']);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.region).toBe('eu');\n expect(args.default).toBe(true);\n });\n\n test('region is undefined when no env var or CLI arg', async () => {\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.region).toBeUndefined();\n });\n });\n\n describe('backward compatibility', () => {\n test('all existing flags continue to work', async () => {\n await runCLI([\n '--debug',\n '--signup',\n '--force-install',\n '--install-dir',\n '/custom/path',\n '--integration',\n 'nextjs',\n ]);\n\n const args = getLastCallArgs(mockRunWizard);\n\n // Existing flags\n expect(args.debug).toBe(true);\n expect(args.signup).toBe(true);\n expect(args['force-install']).toBe(true);\n expect(args['install-dir']).toBe('/custom/path');\n expect(args.integration).toBe('nextjs');\n\n // New defaults\n expect(args.default).toBe(true);\n expect(args.region).toBeUndefined();\n });\n });\n\n describe('mcp commands', () => {\n test('mcp add region is undefined when not specified', async () => {\n await runCLI(['mcp', 'add']);\n\n const args = getLastCallArgs(mockRunMCPInstall);\n expect(args.region).toBeUndefined();\n });\n\n test('mcp add respects --region flag', async () => {\n await runCLI(['mcp', 'add', '--region', 'eu']);\n\n const args = getLastCallArgs(mockRunMCPInstall);\n expect(args.region).toBe('eu');\n });\n\n test('mcp commands inherit global flags', async () => {\n await runCLI(['mcp', 'add', '--no-default', '--debug']);\n\n const args = getLastCallArgs(mockRunMCPInstall);\n expect(args.default).toBe(false);\n expect(args.debug).toBe(true);\n });\n });\n\n describe('--ci flag', () => {\n test('defaults to false when not specified', async () => {\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.ci).toBe(false);\n });\n\n test('can be set to true', async () => {\n await runCLI([\n '--ci',\n '--region',\n 'us',\n '--api-key',\n 'phx_test',\n '--install-dir',\n '/tmp/test',\n ]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.ci).toBe(true);\n });\n\n test('requires --region when --ci is set', async () => {\n await runCLI([\n '--ci',\n '--api-key',\n 'phx_test',\n '--install-dir',\n '/tmp/test',\n ]);\n\n expect(process.exit).toHaveBeenCalledWith(1);\n });\n\n test('requires --api-key when --ci is set', async () => {\n await runCLI(['--ci', '--region', 'us', '--install-dir', '/tmp/test']);\n\n expect(process.exit).toHaveBeenCalledWith(1);\n });\n\n test('requires --install-dir when --ci is set', async () => {\n await runCLI(['--ci', '--region', 'us', '--api-key', 'phx_test']);\n\n expect(process.exit).toHaveBeenCalledWith(1);\n });\n\n test('passes --api-key to runWizard', async () => {\n await runCLI([\n '--ci',\n '--region',\n 'us',\n '--api-key',\n 'phx_test_key',\n '--install-dir',\n '/tmp/test',\n ]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.apiKey).toBe('phx_test_key');\n });\n });\n\n describe('CI environment variables', () => {\n test('respects POSTHOG_WIZARD_CI', async () => {\n process.env.POSTHOG_WIZARD_CI = 'true';\n process.env.POSTHOG_WIZARD_REGION = 'us';\n process.env.POSTHOG_WIZARD_API_KEY = 'phx_env_key';\n process.env.POSTHOG_WIZARD_INSTALL_DIR = '/tmp/test';\n\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.ci).toBe(true);\n });\n\n test('respects POSTHOG_WIZARD_API_KEY', async () => {\n process.env.POSTHOG_WIZARD_CI = 'true';\n process.env.POSTHOG_WIZARD_REGION = 'eu';\n process.env.POSTHOG_WIZARD_API_KEY = 'phx_env_key';\n process.env.POSTHOG_WIZARD_INSTALL_DIR = '/tmp/test';\n\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.apiKey).toBe('phx_env_key');\n });\n\n test('CLI args override CI environment variables', async () => {\n process.env.POSTHOG_WIZARD_CI = 'true';\n process.env.POSTHOG_WIZARD_REGION = 'us';\n process.env.POSTHOG_WIZARD_API_KEY = 'phx_env_key';\n process.env.POSTHOG_WIZARD_INSTALL_DIR = '/tmp/test';\n\n await runCLI([\n '--region',\n 'eu',\n '--api-key',\n 'phx_cli_key',\n '--install-dir',\n '/other/path',\n ]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.region).toBe('eu');\n expect(args.apiKey).toBe('phx_cli_key');\n });\n });\n});\n"]}
@@ -74,6 +74,7 @@ async function runAstroWizard(options) {
74
74
  await (0, steps_1.addMCPServerToClientsStep)({
75
75
  cloudRegion,
76
76
  integration: constants_1.Integration.astro,
77
+ ci: options.ci,
77
78
  });
78
79
  const outroMessage = (0, messages_1.getOutroMessage)({
79
80
  options,
@@ -1 +1 @@
1
- {"version":3,"file":"astro-wizard.js","sourceRoot":"","sources":["../../../src/astro/astro-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 printWelcome,\n} from '../utils/clack-utils';\nimport { getPackageVersion } from '../utils/package-json';\nimport clack from '../utils/clack';\nimport { Integration } from '../lib/constants';\nimport { getAstroDocumentation } 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 addMCPServerToClientsStep,\n runPrettierStep,\n} from '../steps';\n\nexport async function runAstroWizard(options: WizardOptions): Promise<void> {\n printWelcome({\n wizardName: 'PostHog Astro wizard',\n });\n\n const aiConsent = await askForAIConsent(options);\n\n if (!aiConsent) {\n await abort(\n 'The Astro wizard requires AI to get setup right now. Please view the docs to setup Astro manually instead: https://posthog.com/docs/libraries/js',\n 0,\n );\n }\n\n const cloudRegion = options.cloudRegion ?? (await askForCloudRegion());\n\n await confirmContinueIfNoOrDirtyGitRepo(options);\n\n const packageJson = await getPackageDotJson(options);\n\n await ensurePackageIsInstalled(packageJson, 'astro', 'Astro');\n\n const astroVersion = getPackageVersion('astro', packageJson);\n\n if (astroVersion) {\n analytics.setTag('astro-version', astroVersion);\n }\n\n const { projectApiKey, accessToken, host, projectId } =\n await getOrAskForProjectData({\n ...options,\n cloudRegion,\n });\n\n clack.log.info('Heading to include the PostHogSnippet in your Astro project');\n\n const relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.astro,\n });\n\n const installationDocumentation = getAstroDocumentation({\n projectApiKey,\n host,\n });\n\n clack.log.info('Reviewing PostHog documentation for Astro');\n\n const filesToChange = await getFilesToChange({\n integration: Integration.astro,\n relevantFiles,\n documentation: installationDocumentation,\n accessToken,\n cloudRegion,\n projectId,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.astro,\n filesToChange,\n accessToken,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\n projectId,\n });\n\n await runPrettierStep({\n installDir: options.installDir,\n integration: Integration.astro,\n });\n\n const addedEditorRules = await addEditorRulesStep({\n installDir: options.installDir,\n rulesName: 'astro-rules.md',\n integration: Integration.astro,\n });\n\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: Integration.astro,\n });\n\n const outroMessage = getOutroMessage({\n options,\n integration: Integration.astro,\n cloudRegion,\n addedEditorRules,\n uploadedEnvVars: [],\n });\n\n clack.outro(outroMessage);\n\n await analytics.shutdown('success');\n}\n"]}
1
+ {"version":3,"file":"astro-wizard.js","sourceRoot":"","sources":["../../../src/astro/astro-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 printWelcome,\n} from '../utils/clack-utils';\nimport { getPackageVersion } from '../utils/package-json';\nimport clack from '../utils/clack';\nimport { Integration } from '../lib/constants';\nimport { getAstroDocumentation } 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 addMCPServerToClientsStep,\n runPrettierStep,\n} from '../steps';\n\nexport async function runAstroWizard(options: WizardOptions): Promise<void> {\n printWelcome({\n wizardName: 'PostHog Astro wizard',\n });\n\n const aiConsent = await askForAIConsent(options);\n\n if (!aiConsent) {\n await abort(\n 'The Astro wizard requires AI to get setup right now. Please view the docs to setup Astro manually instead: https://posthog.com/docs/libraries/js',\n 0,\n );\n }\n\n const cloudRegion = options.cloudRegion ?? (await askForCloudRegion());\n\n await confirmContinueIfNoOrDirtyGitRepo(options);\n\n const packageJson = await getPackageDotJson(options);\n\n await ensurePackageIsInstalled(packageJson, 'astro', 'Astro');\n\n const astroVersion = getPackageVersion('astro', packageJson);\n\n if (astroVersion) {\n analytics.setTag('astro-version', astroVersion);\n }\n\n const { projectApiKey, accessToken, host, projectId } =\n await getOrAskForProjectData({\n ...options,\n cloudRegion,\n });\n\n clack.log.info('Heading to include the PostHogSnippet in your Astro project');\n\n const relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.astro,\n });\n\n const installationDocumentation = getAstroDocumentation({\n projectApiKey,\n host,\n });\n\n clack.log.info('Reviewing PostHog documentation for Astro');\n\n const filesToChange = await getFilesToChange({\n integration: Integration.astro,\n relevantFiles,\n documentation: installationDocumentation,\n accessToken,\n cloudRegion,\n projectId,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.astro,\n filesToChange,\n accessToken,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\n projectId,\n });\n\n await runPrettierStep({\n installDir: options.installDir,\n integration: Integration.astro,\n });\n\n const addedEditorRules = await addEditorRulesStep({\n installDir: options.installDir,\n rulesName: 'astro-rules.md',\n integration: Integration.astro,\n });\n\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: Integration.astro,\n ci: options.ci,\n });\n\n const outroMessage = getOutroMessage({\n options,\n integration: Integration.astro,\n cloudRegion,\n addedEditorRules,\n uploadedEnvVars: [],\n });\n\n clack.outro(outroMessage);\n\n await analytics.shutdown('success');\n}\n"]}
@@ -129,6 +129,7 @@ ${chalk_1.default.cyan(config.metadata.docsUrl)}`;
129
129
  await (0, steps_1.addMCPServerToClientsStep)({
130
130
  cloudRegion,
131
131
  integration: config.metadata.integration,
132
+ ci: options.ci,
132
133
  });
133
134
  // Build outro message
134
135
  const continueUrl = options.signup
@@ -1 +1 @@
1
- {"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../../src/lib/agent-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FrameworkConfig } from './framework-config';\nimport type { WizardOptions } from '../utils/types';\nimport {\n abort,\n askForAIConsent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n isUsingTypeScript,\n printWelcome,\n askForCloudRegion,\n} from '../utils/clack-utils';\nimport { analytics } from '../utils/analytics';\nimport { WIZARD_INTERACTION_EVENT_NAME } from './constants';\nimport clack from '../utils/clack';\nimport {\n initializeAgent,\n runAgent,\n AgentSignals,\n AgentErrorType,\n} from './agent-interface';\nimport { getCloudUrlFromRegion } from '../utils/urls';\nimport chalk from 'chalk';\nimport {\n addMCPServerToClientsStep,\n uploadEnvironmentVariablesStep,\n} from '../steps';\n\n/**\n * Universal agent-powered wizard runner.\n * Handles the complete flow for any framework using PostHog MCP integration.\n */\nexport async function runAgentWizard(\n config: FrameworkConfig,\n options: WizardOptions,\n): Promise<void> {\n // Setup phase\n printWelcome({ wizardName: config.ui.welcomeMessage });\n\n clack.log.info(\n `🧙 The wizard has chosen you to try the next-generation agent integration for ${config.metadata.name}.\\n\\nStand by for the good stuff, and let the robot minders know how it goes:\\n\\nwizard@posthog.com`,\n );\n\n const aiConsent = await askForAIConsent(options);\n if (!aiConsent) {\n await abort(config.metadata.abortMessage, 0);\n }\n\n const cloudRegion = options.cloudRegion ?? (await askForCloudRegion());\n const typeScriptDetected = isUsingTypeScript(options);\n\n await confirmContinueIfNoOrDirtyGitRepo(options);\n\n // Framework detection and version\n const packageJson = await getPackageDotJson(options);\n await ensurePackageIsInstalled(\n packageJson,\n config.detection.packageName,\n config.detection.packageDisplayName,\n );\n\n const frameworkVersion = config.detection.getVersion(packageJson);\n\n // Set analytics tags for framework version\n if (frameworkVersion && config.detection.getVersionBucket) {\n const versionBucket = config.detection.getVersionBucket(frameworkVersion);\n analytics.setTag(`${config.metadata.integration}-version`, versionBucket);\n }\n\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'started agent integration',\n integration: config.metadata.integration,\n });\n\n // Get PostHog credentials\n const { projectApiKey, host, accessToken } = await getOrAskForProjectData({\n ...options,\n cloudRegion,\n });\n\n // Gather framework-specific context (e.g., Next.js router, React Native platform)\n const frameworkContext = config.metadata.gatherContext\n ? await config.metadata.gatherContext(options)\n : {};\n\n // Set analytics tags from framework context\n const contextTags = config.analytics.getTags(frameworkContext);\n Object.entries(contextTags).forEach(([key, value]) => {\n analytics.setTag(key, value);\n });\n\n // Build integration prompt\n const integrationPrompt = buildIntegrationPrompt(\n config,\n {\n frameworkVersion: frameworkVersion || 'latest',\n typescript: typeScriptDetected,\n projectApiKey,\n host,\n },\n frameworkContext,\n );\n\n // Initialize and run agent\n const spinner = clack.spinner();\n\n // Determine MCP URL: CLI flag > env var > production default\n const mcpUrl = options.localMcp\n ? 'http://localhost:8787/mcp'\n : process.env.MCP_URL || 'https://mcp.posthog.com/mcp';\n\n const agent = initializeAgent(\n {\n workingDirectory: options.installDir,\n posthogMcpUrl: mcpUrl,\n posthogApiKey: accessToken,\n posthogApiHost: host,\n },\n options,\n );\n\n const agentResult = await runAgent(\n agent,\n integrationPrompt,\n options,\n spinner,\n {\n estimatedDurationMinutes: config.ui.estimatedDurationMinutes,\n spinnerMessage: config.ui.spinnerMessage,\n successMessage: config.ui.successMessage,\n errorMessage: 'Integration failed',\n },\n );\n\n // Handle error cases detected in agent output\n if (agentResult.error === AgentErrorType.MCP_MISSING) {\n analytics.captureException(\n new Error('Agent could not access PostHog MCP server'),\n {\n integration: config.metadata.integration,\n error_type: AgentErrorType.MCP_MISSING,\n signal: AgentSignals.ERROR_MCP_MISSING,\n },\n );\n\n const errorMessage = `\n${chalk.red('❌ Could not access the PostHog MCP server')}\n\nThe wizard was unable to connect to the PostHog MCP server.\nThis could be due to a network issue or a configuration problem.\n\nPlease try again, or set up ${\n config.metadata.name\n } manually by following our documentation:\n${chalk.cyan(config.metadata.docsUrl)}`;\n\n clack.outro(errorMessage);\n await analytics.shutdown('error');\n process.exit(1);\n }\n\n if (agentResult.error === AgentErrorType.RESOURCE_MISSING) {\n analytics.captureException(\n new Error('Agent could not access setup resource'),\n {\n integration: config.metadata.integration,\n error_type: AgentErrorType.RESOURCE_MISSING,\n signal: AgentSignals.ERROR_RESOURCE_MISSING,\n },\n );\n\n const errorMessage = `\n${chalk.red('❌ Could not access the setup resource')}\n\nThe wizard could not access the setup resource. This may indicate a version mismatch or a temporary service issue.\n\nPlease try again, or set up ${\n config.metadata.name\n } manually by following our documentation:\n${chalk.cyan(config.metadata.docsUrl)}`;\n\n clack.outro(errorMessage);\n await analytics.shutdown('error');\n process.exit(1);\n }\n\n // Build environment variables from OAuth credentials\n const envVars = config.environment.getEnvVars(projectApiKey, host);\n\n // Upload environment variables to hosting providers (if configured)\n let uploadedEnvVars: string[] = [];\n if (config.environment.uploadToHosting) {\n uploadedEnvVars = await uploadEnvironmentVariablesStep(envVars, {\n integration: config.metadata.integration,\n options,\n });\n }\n\n // Add MCP server to clients\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: config.metadata.integration,\n });\n\n // Build outro message\n const continueUrl = options.signup\n ? `${getCloudUrlFromRegion(cloudRegion)}/products?source=wizard`\n : undefined;\n\n const changes = [\n ...config.ui.getOutroChanges(frameworkContext),\n Object.keys(envVars).length > 0\n ? `Added environment variables to .env file`\n : '',\n uploadedEnvVars.length > 0\n ? `Uploaded environment variables to your hosting provider`\n : '',\n ].filter(Boolean);\n\n const nextSteps = [\n ...config.ui.getOutroNextSteps(frameworkContext),\n uploadedEnvVars.length === 0 && config.environment.uploadToHosting\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${changes.map((change) => `• ${change}`).join('\\n')}\n\n${chalk.yellow('Next steps:')}\n${nextSteps.map((step) => `• ${step}`).join('\\n')}\n\nLearn more: ${chalk.cyan(config.metadata.docsUrl)}\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 us a line: wizard@posthog.com`)}`;\n\n clack.outro(outroMessage);\n\n await analytics.shutdown('success');\n}\n\n/**\n * Build the integration prompt for the agent.\n * Uses shared base prompt with optional framework-specific addendum.\n */\nfunction buildIntegrationPrompt(\n config: FrameworkConfig,\n context: {\n frameworkVersion: string;\n typescript: boolean;\n projectApiKey: string;\n host: string;\n },\n frameworkContext: Record<string, any>,\n): string {\n const additionalLines = config.prompts.getAdditionalContextLines\n ? config.prompts.getAdditionalContextLines(frameworkContext)\n : [];\n\n const additionalContext =\n additionalLines.length > 0\n ? '\\n' + additionalLines.map((line) => `- ${line}`).join('\\n')\n : '';\n\n return `You have access to the PostHog MCP server which provides an integration resource to integrate PostHog into this ${\n config.metadata.name\n } project.\n\nProject context:\n- Framework: ${config.metadata.name} ${context.frameworkVersion}\n- TypeScript: ${context.typescript ? 'Yes' : 'No'}\n- PostHog API Key: ${context.projectApiKey}\n- PostHog Host: ${context.host}${additionalContext}\n\nInstructions:\n\n1. Call the PostHog MCP's resource for setup: posthog://workflows/basic-integration/begin\n2. Follow all instructions provided; do package installation as soon as possible.\n3. Set up environment variables for PostHog in a .env file with the API key and host provided above, using the appropriate naming convention for ${\n config.metadata.name\n }. Make sure to use these environment variables in the code files you create instead of hardcoding the API key and host.\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\nBefore beginning, confirm that you can access the PostHog MCP. If the PostHog MCP is not accessible, emit the following string:\n\n${AgentSignals.ERROR_MCP_MISSING} Could not access the PostHog MCP.\n\nIf the PostHog MCP is accessible, attempt to access the setup resource. If the setup resource is not accessible, emit the following string:\n\n${AgentSignals.ERROR_RESOURCE_MISSING} Could not access the setup resource.\n\n`;\n}\n"]}
1
+ {"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../../src/lib/agent-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FrameworkConfig } from './framework-config';\nimport type { WizardOptions } from '../utils/types';\nimport {\n abort,\n askForAIConsent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n isUsingTypeScript,\n printWelcome,\n askForCloudRegion,\n} from '../utils/clack-utils';\nimport { analytics } from '../utils/analytics';\nimport { WIZARD_INTERACTION_EVENT_NAME } from './constants';\nimport clack from '../utils/clack';\nimport {\n initializeAgent,\n runAgent,\n AgentSignals,\n AgentErrorType,\n} from './agent-interface';\nimport { getCloudUrlFromRegion } from '../utils/urls';\nimport chalk from 'chalk';\nimport {\n addMCPServerToClientsStep,\n uploadEnvironmentVariablesStep,\n} from '../steps';\n\n/**\n * Universal agent-powered wizard runner.\n * Handles the complete flow for any framework using PostHog MCP integration.\n */\nexport async function runAgentWizard(\n config: FrameworkConfig,\n options: WizardOptions,\n): Promise<void> {\n // Setup phase\n printWelcome({ wizardName: config.ui.welcomeMessage });\n\n clack.log.info(\n `🧙 The wizard has chosen you to try the next-generation agent integration for ${config.metadata.name}.\\n\\nStand by for the good stuff, and let the robot minders know how it goes:\\n\\nwizard@posthog.com`,\n );\n\n const aiConsent = await askForAIConsent(options);\n if (!aiConsent) {\n await abort(config.metadata.abortMessage, 0);\n }\n\n const cloudRegion = options.cloudRegion ?? (await askForCloudRegion());\n const typeScriptDetected = isUsingTypeScript(options);\n\n await confirmContinueIfNoOrDirtyGitRepo(options);\n\n // Framework detection and version\n const packageJson = await getPackageDotJson(options);\n await ensurePackageIsInstalled(\n packageJson,\n config.detection.packageName,\n config.detection.packageDisplayName,\n );\n\n const frameworkVersion = config.detection.getVersion(packageJson);\n\n // Set analytics tags for framework version\n if (frameworkVersion && config.detection.getVersionBucket) {\n const versionBucket = config.detection.getVersionBucket(frameworkVersion);\n analytics.setTag(`${config.metadata.integration}-version`, versionBucket);\n }\n\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'started agent integration',\n integration: config.metadata.integration,\n });\n\n // Get PostHog credentials\n const { projectApiKey, host, accessToken } = await getOrAskForProjectData({\n ...options,\n cloudRegion,\n });\n\n // Gather framework-specific context (e.g., Next.js router, React Native platform)\n const frameworkContext = config.metadata.gatherContext\n ? await config.metadata.gatherContext(options)\n : {};\n\n // Set analytics tags from framework context\n const contextTags = config.analytics.getTags(frameworkContext);\n Object.entries(contextTags).forEach(([key, value]) => {\n analytics.setTag(key, value);\n });\n\n // Build integration prompt\n const integrationPrompt = buildIntegrationPrompt(\n config,\n {\n frameworkVersion: frameworkVersion || 'latest',\n typescript: typeScriptDetected,\n projectApiKey,\n host,\n },\n frameworkContext,\n );\n\n // Initialize and run agent\n const spinner = clack.spinner();\n\n // Determine MCP URL: CLI flag > env var > production default\n const mcpUrl = options.localMcp\n ? 'http://localhost:8787/mcp'\n : process.env.MCP_URL || 'https://mcp.posthog.com/mcp';\n\n const agent = initializeAgent(\n {\n workingDirectory: options.installDir,\n posthogMcpUrl: mcpUrl,\n posthogApiKey: accessToken,\n posthogApiHost: host,\n },\n options,\n );\n\n const agentResult = await runAgent(\n agent,\n integrationPrompt,\n options,\n spinner,\n {\n estimatedDurationMinutes: config.ui.estimatedDurationMinutes,\n spinnerMessage: config.ui.spinnerMessage,\n successMessage: config.ui.successMessage,\n errorMessage: 'Integration failed',\n },\n );\n\n // Handle error cases detected in agent output\n if (agentResult.error === AgentErrorType.MCP_MISSING) {\n analytics.captureException(\n new Error('Agent could not access PostHog MCP server'),\n {\n integration: config.metadata.integration,\n error_type: AgentErrorType.MCP_MISSING,\n signal: AgentSignals.ERROR_MCP_MISSING,\n },\n );\n\n const errorMessage = `\n${chalk.red('❌ Could not access the PostHog MCP server')}\n\nThe wizard was unable to connect to the PostHog MCP server.\nThis could be due to a network issue or a configuration problem.\n\nPlease try again, or set up ${\n config.metadata.name\n } manually by following our documentation:\n${chalk.cyan(config.metadata.docsUrl)}`;\n\n clack.outro(errorMessage);\n await analytics.shutdown('error');\n process.exit(1);\n }\n\n if (agentResult.error === AgentErrorType.RESOURCE_MISSING) {\n analytics.captureException(\n new Error('Agent could not access setup resource'),\n {\n integration: config.metadata.integration,\n error_type: AgentErrorType.RESOURCE_MISSING,\n signal: AgentSignals.ERROR_RESOURCE_MISSING,\n },\n );\n\n const errorMessage = `\n${chalk.red('❌ Could not access the setup resource')}\n\nThe wizard could not access the setup resource. This may indicate a version mismatch or a temporary service issue.\n\nPlease try again, or set up ${\n config.metadata.name\n } manually by following our documentation:\n${chalk.cyan(config.metadata.docsUrl)}`;\n\n clack.outro(errorMessage);\n await analytics.shutdown('error');\n process.exit(1);\n }\n\n // Build environment variables from OAuth credentials\n const envVars = config.environment.getEnvVars(projectApiKey, host);\n\n // Upload environment variables to hosting providers (if configured)\n let uploadedEnvVars: string[] = [];\n if (config.environment.uploadToHosting) {\n uploadedEnvVars = await uploadEnvironmentVariablesStep(envVars, {\n integration: config.metadata.integration,\n options,\n });\n }\n\n // Add MCP server to clients\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: config.metadata.integration,\n ci: options.ci,\n });\n\n // Build outro message\n const continueUrl = options.signup\n ? `${getCloudUrlFromRegion(cloudRegion)}/products?source=wizard`\n : undefined;\n\n const changes = [\n ...config.ui.getOutroChanges(frameworkContext),\n Object.keys(envVars).length > 0\n ? `Added environment variables to .env file`\n : '',\n uploadedEnvVars.length > 0\n ? `Uploaded environment variables to your hosting provider`\n : '',\n ].filter(Boolean);\n\n const nextSteps = [\n ...config.ui.getOutroNextSteps(frameworkContext),\n uploadedEnvVars.length === 0 && config.environment.uploadToHosting\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${changes.map((change) => `• ${change}`).join('\\n')}\n\n${chalk.yellow('Next steps:')}\n${nextSteps.map((step) => `• ${step}`).join('\\n')}\n\nLearn more: ${chalk.cyan(config.metadata.docsUrl)}\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 us a line: wizard@posthog.com`)}`;\n\n clack.outro(outroMessage);\n\n await analytics.shutdown('success');\n}\n\n/**\n * Build the integration prompt for the agent.\n * Uses shared base prompt with optional framework-specific addendum.\n */\nfunction buildIntegrationPrompt(\n config: FrameworkConfig,\n context: {\n frameworkVersion: string;\n typescript: boolean;\n projectApiKey: string;\n host: string;\n },\n frameworkContext: Record<string, any>,\n): string {\n const additionalLines = config.prompts.getAdditionalContextLines\n ? config.prompts.getAdditionalContextLines(frameworkContext)\n : [];\n\n const additionalContext =\n additionalLines.length > 0\n ? '\\n' + additionalLines.map((line) => `- ${line}`).join('\\n')\n : '';\n\n return `You have access to the PostHog MCP server which provides an integration resource to integrate PostHog into this ${\n config.metadata.name\n } project.\n\nProject context:\n- Framework: ${config.metadata.name} ${context.frameworkVersion}\n- TypeScript: ${context.typescript ? 'Yes' : 'No'}\n- PostHog API Key: ${context.projectApiKey}\n- PostHog Host: ${context.host}${additionalContext}\n\nInstructions:\n\n1. Call the PostHog MCP's resource for setup: posthog://workflows/basic-integration/begin\n2. Follow all instructions provided; do package installation as soon as possible.\n3. Set up environment variables for PostHog in a .env file with the API key and host provided above, using the appropriate naming convention for ${\n config.metadata.name\n }. Make sure to use these environment variables in the code files you create instead of hardcoding the API key and host.\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\nBefore beginning, confirm that you can access the PostHog MCP. If the PostHog MCP is not accessible, emit the following string:\n\n${AgentSignals.ERROR_MCP_MISSING} Could not access the PostHog MCP.\n\nIf the PostHog MCP is accessible, attempt to access the setup resource. If the setup resource is not accessible, emit the following string:\n\n${AgentSignals.ERROR_RESOURCE_MISSING} Could not access the setup resource.\n\n`;\n}\n"]}
@@ -104,6 +104,7 @@ async function runReactWizard(options) {
104
104
  await (0, steps_1.addMCPServerToClientsStep)({
105
105
  cloudRegion,
106
106
  integration: constants_1.Integration.react,
107
+ ci: options.ci,
107
108
  });
108
109
  const outroMessage = (0, messages_1.getOutroMessage)({
109
110
  options,
@@ -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, 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"]}
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 ci: options.ci,\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"]}
@@ -111,10 +111,9 @@ async function runReactNativeWizard(options) {
111
111
  await (0, steps_1.addMCPServerToClientsStep)({
112
112
  cloudRegion,
113
113
  integration: constants_1.Integration.reactNative,
114
+ ci: options.ci,
114
115
  });
115
- const packageManagerForOutro = await (0, clack_utils_1.getPackageManager)({
116
- installDir: options.installDir,
117
- });
116
+ const packageManagerForOutro = await (0, clack_utils_1.getPackageManager)(options);
118
117
  const outroMessage = (0, messages_1.getOutroMessage)({
119
118
  options,
120
119
  integration: constants_1.Integration.reactNative,
@@ -1 +1 @@
1
- {"version":3,"file":"react-native-wizard.js","sourceRoot":"","sources":["../../../src/react-native/react-native-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 { getReactNativeDocumentation } 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 {\n addEditorRulesStep,\n addMCPServerToClientsStep,\n runPrettierStep,\n} from '../steps';\nimport { EXPO } from '../utils/package-manager';\nimport { getOutroMessage } from '../lib/messages';\n\nexport async function runReactNativeWizard(\n options: WizardOptions,\n): Promise<void> {\n printWelcome({\n wizardName: 'PostHog React Native wizard',\n });\n\n const aiConsent = await askForAIConsent(options);\n\n if (!aiConsent) {\n await abort(\n 'The React Native wizard requires AI to get setup right now. Please view the docs to setup React Native manually instead: https://posthog.com/docs/libraries/react-native',\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-native', 'React Native');\n\n const reactNativeVersion = getPackageVersion('react-native', packageJson);\n\n if (reactNativeVersion) {\n analytics.setTag('react-native-version', reactNativeVersion);\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 isUsingExpo = hasPackageInstalled('expo', packageJson);\n\n if (isUsingExpo) {\n analytics.setTag('is-using-expo', true);\n analytics.setTag('expo-version', getPackageVersion('expo', packageJson));\n }\n\n clack.log.info(`Detected ${isUsingExpo ? 'Expo' : 'React Native'}`);\n\n const packagesToInstall = isUsingExpo\n ? [\n 'posthog-react-native',\n 'posthog-react-native-session-replay',\n 'expo-file-system',\n 'expo-application',\n 'expo-device',\n 'expo-localization',\n ]\n : [\n 'posthog-react-native',\n '@react-native-async-storage/async-storage',\n 'react-native-device-info',\n 'react-native-localize',\n ];\n\n for (const packageName of packagesToInstall) {\n await installPackage({\n packageName,\n packageNameDisplayLabel: packageName,\n alreadyInstalled: !!packageJson?.dependencies?.[packageName],\n forceInstall: options.forceInstall,\n askBeforeUpdating: false,\n installDir: options.installDir,\n integration: Integration.reactNative,\n packageManager: isUsingExpo ? EXPO : undefined,\n });\n }\n\n const relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.reactNative,\n });\n\n const installationDocumentation = getReactNativeDocumentation({\n language: typeScriptDetected ? 'typescript' : 'javascript',\n host,\n projectApiKey,\n });\n\n clack.log.info(\n `Reviewing PostHog documentation for ${\n isUsingExpo ? 'Expo' : 'React Native'\n }`,\n );\n\n const filesToChange = await getFilesToChange({\n integration: Integration.reactNative,\n relevantFiles,\n documentation: installationDocumentation,\n accessToken,\n cloudRegion,\n projectId,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.reactNative,\n filesToChange,\n accessToken,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\n projectId,\n });\n\n await runPrettierStep({\n installDir: options.installDir,\n integration: Integration.reactNative,\n });\n\n const addedEditorRules = await addEditorRulesStep({\n installDir: options.installDir,\n rulesName: 'react-native-rules.md',\n integration: Integration.reactNative,\n });\n\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: Integration.reactNative,\n });\n\n const packageManagerForOutro = await getPackageManager({\n installDir: options.installDir,\n });\n\n const outroMessage = getOutroMessage({\n options,\n integration: Integration.reactNative,\n cloudRegion,\n addedEditorRules,\n packageManager: packageManagerForOutro,\n uploadedEnvVars: [],\n });\n\n clack.outro(outroMessage);\n\n await analytics.shutdown('success');\n}\n"]}
1
+ {"version":3,"file":"react-native-wizard.js","sourceRoot":"","sources":["../../../src/react-native/react-native-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 { getReactNativeDocumentation } 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 {\n addEditorRulesStep,\n addMCPServerToClientsStep,\n runPrettierStep,\n} from '../steps';\nimport { EXPO } from '../utils/package-manager';\nimport { getOutroMessage } from '../lib/messages';\n\nexport async function runReactNativeWizard(\n options: WizardOptions,\n): Promise<void> {\n printWelcome({\n wizardName: 'PostHog React Native wizard',\n });\n\n const aiConsent = await askForAIConsent(options);\n\n if (!aiConsent) {\n await abort(\n 'The React Native wizard requires AI to get setup right now. Please view the docs to setup React Native manually instead: https://posthog.com/docs/libraries/react-native',\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-native', 'React Native');\n\n const reactNativeVersion = getPackageVersion('react-native', packageJson);\n\n if (reactNativeVersion) {\n analytics.setTag('react-native-version', reactNativeVersion);\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 isUsingExpo = hasPackageInstalled('expo', packageJson);\n\n if (isUsingExpo) {\n analytics.setTag('is-using-expo', true);\n analytics.setTag('expo-version', getPackageVersion('expo', packageJson));\n }\n\n clack.log.info(`Detected ${isUsingExpo ? 'Expo' : 'React Native'}`);\n\n const packagesToInstall = isUsingExpo\n ? [\n 'posthog-react-native',\n 'posthog-react-native-session-replay',\n 'expo-file-system',\n 'expo-application',\n 'expo-device',\n 'expo-localization',\n ]\n : [\n 'posthog-react-native',\n '@react-native-async-storage/async-storage',\n 'react-native-device-info',\n 'react-native-localize',\n ];\n\n for (const packageName of packagesToInstall) {\n await installPackage({\n packageName,\n packageNameDisplayLabel: packageName,\n alreadyInstalled: !!packageJson?.dependencies?.[packageName],\n forceInstall: options.forceInstall,\n askBeforeUpdating: false,\n installDir: options.installDir,\n integration: Integration.reactNative,\n packageManager: isUsingExpo ? EXPO : undefined,\n });\n }\n\n const relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.reactNative,\n });\n\n const installationDocumentation = getReactNativeDocumentation({\n language: typeScriptDetected ? 'typescript' : 'javascript',\n host,\n projectApiKey,\n });\n\n clack.log.info(\n `Reviewing PostHog documentation for ${\n isUsingExpo ? 'Expo' : 'React Native'\n }`,\n );\n\n const filesToChange = await getFilesToChange({\n integration: Integration.reactNative,\n relevantFiles,\n documentation: installationDocumentation,\n accessToken,\n cloudRegion,\n projectId,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.reactNative,\n filesToChange,\n accessToken,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\n projectId,\n });\n\n await runPrettierStep({\n installDir: options.installDir,\n integration: Integration.reactNative,\n });\n\n const addedEditorRules = await addEditorRulesStep({\n installDir: options.installDir,\n rulesName: 'react-native-rules.md',\n integration: Integration.reactNative,\n });\n\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: Integration.reactNative,\n ci: options.ci,\n });\n\n const packageManagerForOutro = await getPackageManager(options);\n\n const outroMessage = getOutroMessage({\n options,\n integration: Integration.reactNative,\n cloudRegion,\n addedEditorRules,\n packageManager: packageManagerForOutro,\n uploadedEnvVars: [],\n });\n\n clack.outro(outroMessage);\n\n await analytics.shutdown('success');\n}\n"]}
package/dist/src/run.d.ts CHANGED
@@ -9,6 +9,8 @@ type Args = {
9
9
  default?: boolean;
10
10
  signup?: boolean;
11
11
  localMcp?: boolean;
12
+ ci?: boolean;
13
+ apiKey?: string;
12
14
  };
13
15
  export declare function runWizard(argv: Args): Promise<void>;
14
16
  export {};
package/dist/src/run.js CHANGED
@@ -45,8 +45,13 @@ async function runWizard(argv) {
45
45
  default: finalArgs.default ?? false,
46
46
  signup: finalArgs.signup ?? false,
47
47
  localMcp: finalArgs.localMcp ?? false,
48
+ ci: finalArgs.ci ?? false,
49
+ apiKey: finalArgs.apiKey,
48
50
  };
49
51
  clack_1.default.intro(`Welcome to the PostHog setup wizard ✨`);
52
+ if (wizardOptions.ci) {
53
+ clack_1.default.log.info(chalk_1.default.dim('Running in CI mode'));
54
+ }
50
55
  const integration = finalArgs.integration ?? (await getIntegrationForSetup(wizardOptions));
51
56
  analytics_1.analytics.setTag('integration', integration);
52
57
  try {