@posthog/wizard 2.6.2 → 2.8.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 (59) hide show
  1. package/dist/bin.js +5 -0
  2. package/dist/bin.js.map +1 -1
  3. package/dist/src/lib/__tests__/cloudflare-detection.test.d.ts +1 -0
  4. package/dist/src/lib/__tests__/cloudflare-detection.test.js +119 -0
  5. package/dist/src/lib/__tests__/cloudflare-detection.test.js.map +1 -0
  6. package/dist/src/lib/agent-runner.js +17 -3
  7. package/dist/src/lib/agent-runner.js.map +1 -1
  8. package/dist/src/lib/cloudflare-detection.d.ts +14 -0
  9. package/dist/src/lib/cloudflare-detection.js +74 -0
  10. package/dist/src/lib/cloudflare-detection.js.map +1 -0
  11. package/dist/src/lib/constants.d.ts +4 -1
  12. package/dist/src/lib/constants.js +4 -1
  13. package/dist/src/lib/constants.js.map +1 -1
  14. package/dist/src/lib/middleware/config.js +4 -4
  15. package/dist/src/lib/middleware/config.js.map +1 -1
  16. package/dist/src/lib/version.d.ts +1 -1
  17. package/dist/src/lib/version.js +1 -1
  18. package/dist/src/lib/version.js.map +1 -1
  19. package/dist/src/lib/wizard-session.d.ts +6 -0
  20. package/dist/src/lib/wizard-session.js +4 -0
  21. package/dist/src/lib/wizard-session.js.map +1 -1
  22. package/dist/src/run.d.ts +1 -0
  23. package/dist/src/run.js +6 -0
  24. package/dist/src/run.js.map +1 -1
  25. package/dist/src/steps/add-mcp-server-to-clients/defaults.js +5 -5
  26. package/dist/src/steps/add-mcp-server-to-clients/defaults.js.map +1 -1
  27. package/dist/src/ui/tui/__tests__/store.test.js +26 -2
  28. package/dist/src/ui/tui/__tests__/store.test.js.map +1 -1
  29. package/dist/src/ui/tui/flows.d.ts +1 -0
  30. package/dist/src/ui/tui/flows.js +6 -1
  31. package/dist/src/ui/tui/flows.js.map +1 -1
  32. package/dist/src/ui/tui/screen-registry.js +2 -0
  33. package/dist/src/ui/tui/screen-registry.js.map +1 -1
  34. package/dist/src/ui/tui/screens/OutroScreen.js +2 -2
  35. package/dist/src/ui/tui/screens/OutroScreen.js.map +1 -1
  36. package/dist/src/ui/tui/screens/SkillsScreen.d.ts +14 -0
  37. package/dist/src/ui/tui/screens/SkillsScreen.js +71 -0
  38. package/dist/src/ui/tui/screens/SkillsScreen.js.map +1 -0
  39. package/dist/src/ui/tui/store.d.ts +2 -0
  40. package/dist/src/ui/tui/store.js +12 -0
  41. package/dist/src/ui/tui/store.js.map +1 -1
  42. package/dist/src/utils/__tests__/provisioning.test.d.ts +1 -0
  43. package/dist/src/utils/__tests__/provisioning.test.js +192 -0
  44. package/dist/src/utils/__tests__/provisioning.test.js.map +1 -0
  45. package/dist/src/utils/debug.d.ts +6 -0
  46. package/dist/src/utils/debug.js +16 -0
  47. package/dist/src/utils/debug.js.map +1 -1
  48. package/dist/src/utils/oauth.js +1 -1
  49. package/dist/src/utils/oauth.js.map +1 -1
  50. package/dist/src/utils/provisioning.d.ts +25 -0
  51. package/dist/src/utils/provisioning.js +191 -0
  52. package/dist/src/utils/provisioning.js.map +1 -0
  53. package/dist/src/utils/setup-utils.d.ts +4 -1
  54. package/dist/src/utils/setup-utils.js +46 -2
  55. package/dist/src/utils/setup-utils.js.map +1 -1
  56. package/dist/src/utils/types.d.ts +4 -0
  57. package/dist/src/utils/types.js.map +1 -1
  58. package/npm-shrinkwrap.json +2 -2
  59. package/package.json +8 -4
package/dist/bin.js CHANGED
@@ -76,6 +76,10 @@ if (process.env.NODE_ENV === 'test') {
76
76
  describe: 'PostHog project ID to use (optional; when not set, uses default from API key or OAuth)\nenv: POSTHOG_WIZARD_PROJECT_ID',
77
77
  type: 'string',
78
78
  },
79
+ email: {
80
+ describe: 'Email address for account creation (used with --signup)\nenv: POSTHOG_WIZARD_EMAIL',
81
+ type: 'string',
82
+ },
79
83
  })
80
84
  .command(['$0'], 'Run the PostHog setup wizard', (yargs) => {
81
85
  return yargs.options({
@@ -178,6 +182,7 @@ if (process.env.NODE_ENV === 'test') {
178
182
  signup: options.signup,
179
183
  localMcp: options.localMcp,
180
184
  apiKey: options.apiKey,
185
+ email: options.email,
181
186
  menu: options.menu,
182
187
  integration: options.integration,
183
188
  benchmark: options.benchmark,
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 { VERSION } from './src/lib/version.js';\n\nconst WIZARD_VERSION = VERSION;\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 { runWizard } from './src/run';\nimport { isNonInteractiveEnvironment } from './src/utils/environment';\nimport { getUI, setUI } from './src/ui';\nimport { LoggingUI } from './src/ui/logging-ui';\nimport type { Integration } from './src/lib/constants';\nimport type { FrameworkConfig } from './src/lib/framework-config';\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 'project-id': {\n describe:\n 'PostHog project ID to use (optional; when not set, uses default from API key or OAuth)\\nenv: POSTHOG_WIZARD_PROJECT_ID',\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 playground: {\n default: false,\n describe: 'Launch the TUI primitives playground',\n type: 'boolean',\n },\n integration: {\n describe: 'Integration to set up',\n choices: [\n 'nextjs',\n 'astro',\n 'react',\n 'svelte',\n 'react-native',\n 'tanstack-router',\n 'tanstack-start',\n ],\n type: 'string',\n },\n menu: {\n default: false,\n describe:\n 'Show menu for manual integration selection instead of auto-detecting\\nenv: POSTHOG_WIZARD_MENU',\n type: 'boolean',\n },\n benchmark: {\n default: false,\n describe:\n 'Run in benchmark mode with per-phase token tracking\\nenv: POSTHOG_WIZARD_BENCHMARK',\n type: 'boolean',\n },\n 'yara-report': {\n default: false,\n describe:\n 'Print YARA scanner summary after the agent run\\nenv: POSTHOG_WIZARD_YARA_REPORT',\n type: 'boolean',\n hidden: true,\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n\n // CI mode validation and TTY check\n if (options.ci) {\n // Use LoggingUI for CI mode (no dependencies, no prompts)\n setUI(new LoggingUI());\n // Default region to 'us' if not specified\n if (!options.region) {\n options.region = 'us';\n }\n if (!options.apiKey) {\n getUI().intro(`PostHog Wizard`);\n getUI().log.error(\n 'CI mode requires --api-key (personal API key phx_xxx)',\n );\n process.exit(1);\n }\n if (!options.installDir) {\n getUI().intro(`PostHog Wizard`);\n getUI().log.error(\n 'CI mode requires --install-dir (directory to install PostHog in)',\n );\n process.exit(1);\n }\n\n void runWizard(options as Parameters<typeof runWizard>[0]);\n } else if (isNonInteractiveEnvironment()) {\n // Non-interactive non-CI: error out\n getUI().intro(`PostHog Wizard`);\n getUI().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 } else if (options.playground) {\n // Playground mode: launch the TUI primitives playground\n void (async () => {\n const { startPlayground } = await import(\n './src/ui/tui/playground/start-playground.js'\n );\n (startPlayground as (version: string) => void)(WIZARD_VERSION);\n })();\n } else {\n // Interactive TTY: launch the Ink TUI\n void (async () => {\n try {\n const { startTUI } = await import('./src/ui/tui/start-tui.js');\n const { buildSession } = await import(\n './src/lib/wizard-session.js'\n );\n\n const tui = startTUI(WIZARD_VERSION);\n\n // Build session from CLI args and attach to store\n const session = buildSession({\n debug: options.debug as boolean | undefined,\n forceInstall: options.forceInstall as boolean | undefined,\n installDir: options.installDir as string | undefined,\n ci: false,\n signup: options.signup as boolean | undefined,\n localMcp: options.localMcp as boolean | undefined,\n apiKey: options.apiKey as string | undefined,\n menu: options.menu as boolean | undefined,\n integration: options.integration as Parameters<\n typeof buildSession\n >[0]['integration'],\n benchmark: options.benchmark as boolean | undefined,\n yaraReport: options.yaraReport as boolean | undefined,\n projectId: options.projectId as string | undefined,\n });\n tui.store.session = session;\n\n // Detect framework while IntroScreen shows its spinner.\n // Runs concurrently — IntroScreen reacts when detection completes.\n const { FRAMEWORK_REGISTRY } = (await import(\n './src/lib/registry.js'\n )) as { FRAMEWORK_REGISTRY: Record<Integration, FrameworkConfig> };\n const { detectIntegration } = (await import('./src/run.js')) as {\n detectIntegration: (\n installDir: string,\n ) => Promise<Integration | undefined>;\n };\n const installDir = session.installDir ?? process.cwd();\n\n const { DETECTION_TIMEOUT_MS } = (await import(\n './src/lib/constants.js'\n )) as { DETECTION_TIMEOUT_MS: number };\n\n const detectedIntegration = await Promise.race([\n detectIntegration(installDir),\n new Promise<undefined>((resolve) =>\n setTimeout(() => resolve(undefined), DETECTION_TIMEOUT_MS),\n ),\n ]);\n\n if (detectedIntegration) {\n const config = FRAMEWORK_REGISTRY[detectedIntegration];\n\n // Run gatherContext for the friendly variant label\n if (config.metadata.gatherContext) {\n try {\n const context = await Promise.race([\n config.metadata.gatherContext({\n installDir,\n debug: session.debug,\n forceInstall: session.forceInstall,\n default: false,\n signup: session.signup,\n localMcp: session.localMcp,\n ci: session.ci,\n menu: session.menu,\n benchmark: session.benchmark,\n yaraReport: session.yaraReport,\n }),\n new Promise<Record<string, never>>((resolve) =>\n setTimeout(() => resolve({}), DETECTION_TIMEOUT_MS),\n ),\n ]);\n for (const [key, value] of Object.entries(context)) {\n if (!(key in session.frameworkContext)) {\n tui.store.setFrameworkContext(key, value);\n }\n }\n } catch {\n // Detection failed — will show generic name\n }\n }\n\n tui.store.setFrameworkConfig(detectedIntegration, config);\n\n if (!session.detectedFrameworkLabel) {\n tui.store.setDetectedFramework(config.metadata.name);\n }\n\n // Early version check — surface on IntroScreen before user proceeds\n if (\n config.detection.minimumVersion &&\n config.detection.getInstalledVersion\n ) {\n const semver = await import('semver');\n const version = await config.detection.getInstalledVersion({\n installDir,\n debug: session.debug,\n forceInstall: session.forceInstall,\n default: false,\n signup: session.signup,\n localMcp: session.localMcp,\n ci: session.ci,\n menu: session.menu,\n benchmark: session.benchmark,\n yaraReport: session.yaraReport,\n });\n if (version) {\n const coerced = semver.coerce(version);\n if (\n coerced &&\n semver.lt(coerced, config.detection.minimumVersion)\n ) {\n tui.store.setUnsupportedVersion({\n current: version,\n minimum: config.detection.minimumVersion,\n docsUrl:\n config.metadata.unsupportedVersionDocsUrl ??\n config.metadata.docsUrl,\n });\n }\n }\n }\n }\n\n // Feature discovery — deterministic scan of package.json deps\n try {\n const { readFileSync } = await import('fs');\n const pkgPath = require('path').join(installDir, 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n const allDeps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n const depNames = Object.keys(allDeps);\n\n const { DiscoveredFeature } = await import(\n './src/lib/wizard-session.js'\n );\n\n if (\n depNames.some((d) =>\n ['stripe', '@stripe/stripe-js'].includes(d),\n )\n ) {\n tui.store.addDiscoveredFeature(DiscoveredFeature.Stripe);\n }\n\n // LLM SDK detection — sourced from PostHog LLM analytics skill\n const LLM_PACKAGES = [\n 'openai',\n '@anthropic-ai/sdk',\n 'ai',\n '@ai-sdk/openai',\n 'langchain',\n '@langchain/openai',\n '@langchain/langgraph',\n '@google/generative-ai',\n '@google/genai',\n '@instructor-ai/instructor',\n '@mastra/core',\n 'portkey-ai',\n ];\n if (depNames.some((d) => LLM_PACKAGES.includes(d))) {\n tui.store.addDiscoveredFeature(DiscoveredFeature.LLM);\n }\n } catch {\n // No package.json or parse error — skip feature discovery\n }\n\n // Signal detection is done — IntroScreen shows picker or results\n tui.store.setDetectionComplete();\n\n // Wait for IntroScreen confirmation\n await tui.waitForSetup();\n\n // Ensure health check has completed before starting the wizard.\n // The flow gate on Intro (readinessResult !== null) keeps the\n // TUI on IntroScreen until this resolves. If blocking, the\n // outage overlay was already pushed in the .then() callback.\n await tui.store.healthGateComplete;\n\n await runWizard(\n options as Parameters<typeof runWizard>[0],\n tui.store.session,\n );\n\n // Keep the outro screen visible — let process.exit() handle cleanup\n } catch (err) {\n // TUI unavailable (e.g., in test environment) — continue with default UI\n if (process.env.DEBUG || process.env.POSTHOG_WIZARD_DEBUG) {\n console.error('TUI init failed:', err); // eslint-disable-line no-console\n }\n await runWizard(options as Parameters<typeof runWizard>[0]);\n }\n })();\n }\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 features: {\n describe:\n 'Comma-separated list of features to enable (default: all)',\n type: 'string',\n },\n 'api-key': {\n describe:\n 'PostHog personal API key (phx_xxx) for MCP authentication',\n type: 'string',\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n const mcpFeatures = options.features\n ?.split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n void (async () => {\n const { readApiKeyFromEnv } = await import(\n './src/utils/env-api-key.js'\n );\n const apiKey =\n (options.apiKey as string | undefined) || readApiKeyFromEnv();\n\n try {\n const { startTUI } = await import('./src/ui/tui/start-tui.js');\n const { buildSession } = await import(\n './src/lib/wizard-session.js'\n );\n\n const { Flow } = await import('./src/ui/tui/router.js');\n const tui = startTUI(WIZARD_VERSION, Flow.McpAdd);\n const session = buildSession({\n debug: options.debug,\n localMcp: options.local,\n mcpFeatures,\n apiKey,\n });\n tui.store.session = session;\n } catch {\n // TUI unavailable — fallback to logging\n setUI(new LoggingUI());\n const { addMCPServerToClientsStep } = await import(\n './src/steps/add-mcp-server-to-clients/index.js'\n );\n await addMCPServerToClientsStep({\n local: options.local,\n features: mcpFeatures,\n apiKey,\n });\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 (async () => {\n try {\n const { startTUI } = await import('./src/ui/tui/start-tui.js');\n const { buildSession } = await import(\n './src/lib/wizard-session.js'\n );\n\n const { Flow } = await import('./src/ui/tui/router.js');\n const tui = startTUI(WIZARD_VERSION, Flow.McpRemove);\n const session = buildSession({\n debug: options.debug,\n localMcp: options.local,\n });\n tui.store.session = session;\n } catch {\n // TUI unavailable — fallback to logging\n setUI(new LoggingUI());\n const { removeMCPServerFromClientsStep } = await import(\n './src/steps/add-mcp-server-to-clients/index.js'\n );\n await removeMCPServerFromClientsStep({\n local: options.local,\n });\n }\n })();\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 { VERSION } from './src/lib/version.js';\n\nconst WIZARD_VERSION = VERSION;\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 { runWizard } from './src/run';\nimport { isNonInteractiveEnvironment } from './src/utils/environment';\nimport { getUI, setUI } from './src/ui';\nimport { LoggingUI } from './src/ui/logging-ui';\nimport type { Integration } from './src/lib/constants';\nimport type { FrameworkConfig } from './src/lib/framework-config';\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 'project-id': {\n describe:\n 'PostHog project ID to use (optional; when not set, uses default from API key or OAuth)\\nenv: POSTHOG_WIZARD_PROJECT_ID',\n type: 'string',\n },\n email: {\n describe:\n 'Email address for account creation (used with --signup)\\nenv: POSTHOG_WIZARD_EMAIL',\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 playground: {\n default: false,\n describe: 'Launch the TUI primitives playground',\n type: 'boolean',\n },\n integration: {\n describe: 'Integration to set up',\n choices: [\n 'nextjs',\n 'astro',\n 'react',\n 'svelte',\n 'react-native',\n 'tanstack-router',\n 'tanstack-start',\n ],\n type: 'string',\n },\n menu: {\n default: false,\n describe:\n 'Show menu for manual integration selection instead of auto-detecting\\nenv: POSTHOG_WIZARD_MENU',\n type: 'boolean',\n },\n benchmark: {\n default: false,\n describe:\n 'Run in benchmark mode with per-phase token tracking\\nenv: POSTHOG_WIZARD_BENCHMARK',\n type: 'boolean',\n },\n 'yara-report': {\n default: false,\n describe:\n 'Print YARA scanner summary after the agent run\\nenv: POSTHOG_WIZARD_YARA_REPORT',\n type: 'boolean',\n hidden: true,\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n\n // CI mode validation and TTY check\n if (options.ci) {\n // Use LoggingUI for CI mode (no dependencies, no prompts)\n setUI(new LoggingUI());\n // Default region to 'us' if not specified\n if (!options.region) {\n options.region = 'us';\n }\n if (!options.apiKey) {\n getUI().intro(`PostHog Wizard`);\n getUI().log.error(\n 'CI mode requires --api-key (personal API key phx_xxx)',\n );\n process.exit(1);\n }\n if (!options.installDir) {\n getUI().intro(`PostHog Wizard`);\n getUI().log.error(\n 'CI mode requires --install-dir (directory to install PostHog in)',\n );\n process.exit(1);\n }\n\n void runWizard(options as Parameters<typeof runWizard>[0]);\n } else if (isNonInteractiveEnvironment()) {\n // Non-interactive non-CI: error out\n getUI().intro(`PostHog Wizard`);\n getUI().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 } else if (options.playground) {\n // Playground mode: launch the TUI primitives playground\n void (async () => {\n const { startPlayground } = await import(\n './src/ui/tui/playground/start-playground.js'\n );\n (startPlayground as (version: string) => void)(WIZARD_VERSION);\n })();\n } else {\n // Interactive TTY: launch the Ink TUI\n void (async () => {\n try {\n const { startTUI } = await import('./src/ui/tui/start-tui.js');\n const { buildSession } = await import(\n './src/lib/wizard-session.js'\n );\n\n const tui = startTUI(WIZARD_VERSION);\n\n // Build session from CLI args and attach to store\n const session = buildSession({\n debug: options.debug as boolean | undefined,\n forceInstall: options.forceInstall as boolean | undefined,\n installDir: options.installDir as string | undefined,\n ci: false,\n signup: options.signup as boolean | undefined,\n localMcp: options.localMcp as boolean | undefined,\n apiKey: options.apiKey as string | undefined,\n email: options.email,\n menu: options.menu as boolean | undefined,\n integration: options.integration as Parameters<\n typeof buildSession\n >[0]['integration'],\n benchmark: options.benchmark as boolean | undefined,\n yaraReport: options.yaraReport as boolean | undefined,\n projectId: options.projectId as string | undefined,\n });\n tui.store.session = session;\n\n // Detect framework while IntroScreen shows its spinner.\n // Runs concurrently — IntroScreen reacts when detection completes.\n const { FRAMEWORK_REGISTRY } = (await import(\n './src/lib/registry.js'\n )) as { FRAMEWORK_REGISTRY: Record<Integration, FrameworkConfig> };\n const { detectIntegration } = (await import('./src/run.js')) as {\n detectIntegration: (\n installDir: string,\n ) => Promise<Integration | undefined>;\n };\n const installDir = session.installDir ?? process.cwd();\n\n const { DETECTION_TIMEOUT_MS } = (await import(\n './src/lib/constants.js'\n )) as { DETECTION_TIMEOUT_MS: number };\n\n const detectedIntegration = await Promise.race([\n detectIntegration(installDir),\n new Promise<undefined>((resolve) =>\n setTimeout(() => resolve(undefined), DETECTION_TIMEOUT_MS),\n ),\n ]);\n\n if (detectedIntegration) {\n const config = FRAMEWORK_REGISTRY[detectedIntegration];\n\n // Run gatherContext for the friendly variant label\n if (config.metadata.gatherContext) {\n try {\n const context = await Promise.race([\n config.metadata.gatherContext({\n installDir,\n debug: session.debug,\n forceInstall: session.forceInstall,\n default: false,\n signup: session.signup,\n localMcp: session.localMcp,\n ci: session.ci,\n menu: session.menu,\n benchmark: session.benchmark,\n yaraReport: session.yaraReport,\n }),\n new Promise<Record<string, never>>((resolve) =>\n setTimeout(() => resolve({}), DETECTION_TIMEOUT_MS),\n ),\n ]);\n for (const [key, value] of Object.entries(context)) {\n if (!(key in session.frameworkContext)) {\n tui.store.setFrameworkContext(key, value);\n }\n }\n } catch {\n // Detection failed — will show generic name\n }\n }\n\n tui.store.setFrameworkConfig(detectedIntegration, config);\n\n if (!session.detectedFrameworkLabel) {\n tui.store.setDetectedFramework(config.metadata.name);\n }\n\n // Early version check — surface on IntroScreen before user proceeds\n if (\n config.detection.minimumVersion &&\n config.detection.getInstalledVersion\n ) {\n const semver = await import('semver');\n const version = await config.detection.getInstalledVersion({\n installDir,\n debug: session.debug,\n forceInstall: session.forceInstall,\n default: false,\n signup: session.signup,\n localMcp: session.localMcp,\n ci: session.ci,\n menu: session.menu,\n benchmark: session.benchmark,\n yaraReport: session.yaraReport,\n });\n if (version) {\n const coerced = semver.coerce(version);\n if (\n coerced &&\n semver.lt(coerced, config.detection.minimumVersion)\n ) {\n tui.store.setUnsupportedVersion({\n current: version,\n minimum: config.detection.minimumVersion,\n docsUrl:\n config.metadata.unsupportedVersionDocsUrl ??\n config.metadata.docsUrl,\n });\n }\n }\n }\n }\n\n // Feature discovery — deterministic scan of package.json deps\n try {\n const { readFileSync } = await import('fs');\n const pkgPath = require('path').join(installDir, 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n const allDeps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n const depNames = Object.keys(allDeps);\n\n const { DiscoveredFeature } = await import(\n './src/lib/wizard-session.js'\n );\n\n if (\n depNames.some((d) =>\n ['stripe', '@stripe/stripe-js'].includes(d),\n )\n ) {\n tui.store.addDiscoveredFeature(DiscoveredFeature.Stripe);\n }\n\n // LLM SDK detection — sourced from PostHog LLM analytics skill\n const LLM_PACKAGES = [\n 'openai',\n '@anthropic-ai/sdk',\n 'ai',\n '@ai-sdk/openai',\n 'langchain',\n '@langchain/openai',\n '@langchain/langgraph',\n '@google/generative-ai',\n '@google/genai',\n '@instructor-ai/instructor',\n '@mastra/core',\n 'portkey-ai',\n ];\n if (depNames.some((d) => LLM_PACKAGES.includes(d))) {\n tui.store.addDiscoveredFeature(DiscoveredFeature.LLM);\n }\n } catch {\n // No package.json or parse error — skip feature discovery\n }\n\n // Signal detection is done — IntroScreen shows picker or results\n tui.store.setDetectionComplete();\n\n // Wait for IntroScreen confirmation\n await tui.waitForSetup();\n\n // Ensure health check has completed before starting the wizard.\n // The flow gate on Intro (readinessResult !== null) keeps the\n // TUI on IntroScreen until this resolves. If blocking, the\n // outage overlay was already pushed in the .then() callback.\n await tui.store.healthGateComplete;\n\n await runWizard(\n options as Parameters<typeof runWizard>[0],\n tui.store.session,\n );\n\n // Keep the outro screen visible — let process.exit() handle cleanup\n } catch (err) {\n // TUI unavailable (e.g., in test environment) — continue with default UI\n if (process.env.DEBUG || process.env.POSTHOG_WIZARD_DEBUG) {\n console.error('TUI init failed:', err); // eslint-disable-line no-console\n }\n await runWizard(options as Parameters<typeof runWizard>[0]);\n }\n })();\n }\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 features: {\n describe:\n 'Comma-separated list of features to enable (default: all)',\n type: 'string',\n },\n 'api-key': {\n describe:\n 'PostHog personal API key (phx_xxx) for MCP authentication',\n type: 'string',\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n const mcpFeatures = options.features\n ?.split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n void (async () => {\n const { readApiKeyFromEnv } = await import(\n './src/utils/env-api-key.js'\n );\n const apiKey =\n (options.apiKey as string | undefined) || readApiKeyFromEnv();\n\n try {\n const { startTUI } = await import('./src/ui/tui/start-tui.js');\n const { buildSession } = await import(\n './src/lib/wizard-session.js'\n );\n\n const { Flow } = await import('./src/ui/tui/router.js');\n const tui = startTUI(WIZARD_VERSION, Flow.McpAdd);\n const session = buildSession({\n debug: options.debug,\n localMcp: options.local,\n mcpFeatures,\n apiKey,\n });\n tui.store.session = session;\n } catch {\n // TUI unavailable — fallback to logging\n setUI(new LoggingUI());\n const { addMCPServerToClientsStep } = await import(\n './src/steps/add-mcp-server-to-clients/index.js'\n );\n await addMCPServerToClientsStep({\n local: options.local,\n features: mcpFeatures,\n apiKey,\n });\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 (async () => {\n try {\n const { startTUI } = await import('./src/ui/tui/start-tui.js');\n const { buildSession } = await import(\n './src/lib/wizard-session.js'\n );\n\n const { Flow } = await import('./src/ui/tui/router.js');\n const tui = startTUI(WIZARD_VERSION, Flow.McpRemove);\n const session = buildSession({\n debug: options.debug,\n localMcp: options.local,\n });\n tui.store.session = session;\n } catch {\n // TUI unavailable — fallback to logging\n setUI(new LoggingUI());\n const { removeMCPServerFromClientsStep } = await import(\n './src/steps/add-mcp-server-to-clients/index.js'\n );\n await removeMCPServerFromClientsStep({\n local: options.local,\n });\n }\n })();\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"]}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const fs = __importStar(require("fs"));
37
+ const path = __importStar(require("path"));
38
+ const os = __importStar(require("os"));
39
+ const cloudflare_detection_1 = require("../cloudflare-detection");
40
+ jest.mock('../../utils/debug');
41
+ function makeTmpDir() {
42
+ return fs.mkdtempSync(path.join(os.tmpdir(), 'cloudflare-detect-'));
43
+ }
44
+ function cleanup(dir) {
45
+ fs.rmSync(dir, { recursive: true, force: true });
46
+ }
47
+ function writePackageJson(dir, pkg) {
48
+ fs.writeFileSync(path.join(dir, 'package.json'), JSON.stringify(pkg));
49
+ }
50
+ describe('detectCloudflareTarget', () => {
51
+ let tmpDir;
52
+ beforeEach(() => {
53
+ tmpDir = makeTmpDir();
54
+ });
55
+ afterEach(() => cleanup(tmpDir));
56
+ it('returns false for an empty directory', async () => {
57
+ expect(await (0, cloudflare_detection_1.detectCloudflareTarget)(tmpDir)).toBe(false);
58
+ });
59
+ // -------------------------------------------------------------------------
60
+ // Criterion 1: wrangler config files
61
+ // -------------------------------------------------------------------------
62
+ describe('wrangler config detection', () => {
63
+ it('detects wrangler.toml', async () => {
64
+ fs.writeFileSync(path.join(tmpDir, 'wrangler.toml'), 'name = "app"');
65
+ expect(await (0, cloudflare_detection_1.detectCloudflareTarget)(tmpDir)).toBe(true);
66
+ });
67
+ it('detects wrangler.jsonc', async () => {
68
+ fs.writeFileSync(path.join(tmpDir, 'wrangler.jsonc'), '{}');
69
+ expect(await (0, cloudflare_detection_1.detectCloudflareTarget)(tmpDir)).toBe(true);
70
+ });
71
+ it('detects wrangler.json', async () => {
72
+ fs.writeFileSync(path.join(tmpDir, 'wrangler.json'), '{}');
73
+ expect(await (0, cloudflare_detection_1.detectCloudflareTarget)(tmpDir)).toBe(true);
74
+ });
75
+ it('detects wrangler config even when package.json is missing', async () => {
76
+ fs.writeFileSync(path.join(tmpDir, 'wrangler.toml'), 'name = "app"');
77
+ expect(await (0, cloudflare_detection_1.detectCloudflareTarget)(tmpDir)).toBe(true);
78
+ });
79
+ });
80
+ // -------------------------------------------------------------------------
81
+ // Criterion 2: Cloudflare adapter/platform packages
82
+ // -------------------------------------------------------------------------
83
+ describe('package dependency detection', () => {
84
+ it.each([
85
+ '@react-router/cloudflare',
86
+ '@astrojs/cloudflare',
87
+ '@sveltejs/adapter-cloudflare',
88
+ '@sveltejs/adapter-cloudflare-workers',
89
+ '@cloudflare/workers-types',
90
+ 'wrangler',
91
+ ])('detects %s in dependencies', async (pkgName) => {
92
+ writePackageJson(tmpDir, { dependencies: { [pkgName]: '^1.0.0' } });
93
+ expect(await (0, cloudflare_detection_1.detectCloudflareTarget)(tmpDir)).toBe(true);
94
+ });
95
+ it('detects Cloudflare package in devDependencies', async () => {
96
+ writePackageJson(tmpDir, {
97
+ devDependencies: { wrangler: '^3.0.0' },
98
+ });
99
+ expect(await (0, cloudflare_detection_1.detectCloudflareTarget)(tmpDir)).toBe(true);
100
+ });
101
+ it('returns false when no Cloudflare packages are present', async () => {
102
+ writePackageJson(tmpDir, {
103
+ dependencies: { react: '^19.0.0', next: '^15.0.0' },
104
+ });
105
+ expect(await (0, cloudflare_detection_1.detectCloudflareTarget)(tmpDir)).toBe(false);
106
+ });
107
+ it('returns false for an invalid package.json', async () => {
108
+ fs.writeFileSync(path.join(tmpDir, 'package.json'), 'not json');
109
+ expect(await (0, cloudflare_detection_1.detectCloudflareTarget)(tmpDir)).toBe(false);
110
+ });
111
+ it('does not match packages whose names merely contain "cloudflare"', async () => {
112
+ writePackageJson(tmpDir, {
113
+ dependencies: { 'some-cloudflare-lookalike': '^1.0.0' },
114
+ });
115
+ expect(await (0, cloudflare_detection_1.detectCloudflareTarget)(tmpDir)).toBe(false);
116
+ });
117
+ });
118
+ });
119
+ //# sourceMappingURL=cloudflare-detection.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-detection.test.js","sourceRoot":"","sources":["../../../../src/lib/__tests__/cloudflare-detection.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { detectCloudflareTarget } from '../cloudflare-detection';\n\njest.mock('../../utils/debug');\n\nfunction makeTmpDir(): string {\n return fs.mkdtempSync(path.join(os.tmpdir(), 'cloudflare-detect-'));\n}\n\nfunction cleanup(dir: string): void {\n fs.rmSync(dir, { recursive: true, force: true });\n}\n\nfunction writePackageJson(dir: string, pkg: Record<string, unknown>): void {\n fs.writeFileSync(path.join(dir, 'package.json'), JSON.stringify(pkg));\n}\n\ndescribe('detectCloudflareTarget', () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = makeTmpDir();\n });\n afterEach(() => cleanup(tmpDir));\n\n it('returns false for an empty directory', async () => {\n expect(await detectCloudflareTarget(tmpDir)).toBe(false);\n });\n\n // -------------------------------------------------------------------------\n // Criterion 1: wrangler config files\n // -------------------------------------------------------------------------\n\n describe('wrangler config detection', () => {\n it('detects wrangler.toml', async () => {\n fs.writeFileSync(path.join(tmpDir, 'wrangler.toml'), 'name = \"app\"');\n expect(await detectCloudflareTarget(tmpDir)).toBe(true);\n });\n\n it('detects wrangler.jsonc', async () => {\n fs.writeFileSync(path.join(tmpDir, 'wrangler.jsonc'), '{}');\n expect(await detectCloudflareTarget(tmpDir)).toBe(true);\n });\n\n it('detects wrangler.json', async () => {\n fs.writeFileSync(path.join(tmpDir, 'wrangler.json'), '{}');\n expect(await detectCloudflareTarget(tmpDir)).toBe(true);\n });\n\n it('detects wrangler config even when package.json is missing', async () => {\n fs.writeFileSync(path.join(tmpDir, 'wrangler.toml'), 'name = \"app\"');\n expect(await detectCloudflareTarget(tmpDir)).toBe(true);\n });\n });\n\n // -------------------------------------------------------------------------\n // Criterion 2: Cloudflare adapter/platform packages\n // -------------------------------------------------------------------------\n\n describe('package dependency detection', () => {\n it.each([\n '@react-router/cloudflare',\n '@astrojs/cloudflare',\n '@sveltejs/adapter-cloudflare',\n '@sveltejs/adapter-cloudflare-workers',\n '@cloudflare/workers-types',\n 'wrangler',\n ])('detects %s in dependencies', async (pkgName) => {\n writePackageJson(tmpDir, { dependencies: { [pkgName]: '^1.0.0' } });\n expect(await detectCloudflareTarget(tmpDir)).toBe(true);\n });\n\n it('detects Cloudflare package in devDependencies', async () => {\n writePackageJson(tmpDir, {\n devDependencies: { wrangler: '^3.0.0' },\n });\n expect(await detectCloudflareTarget(tmpDir)).toBe(true);\n });\n\n it('returns false when no Cloudflare packages are present', async () => {\n writePackageJson(tmpDir, {\n dependencies: { react: '^19.0.0', next: '^15.0.0' },\n });\n expect(await detectCloudflareTarget(tmpDir)).toBe(false);\n });\n\n it('returns false for an invalid package.json', async () => {\n fs.writeFileSync(path.join(tmpDir, 'package.json'), 'not json');\n expect(await detectCloudflareTarget(tmpDir)).toBe(false);\n });\n\n it('does not match packages whose names merely contain \"cloudflare\"', async () => {\n writePackageJson(tmpDir, {\n dependencies: { 'some-cloudflare-lookalike': '^1.0.0' },\n });\n expect(await detectCloudflareTarget(tmpDir)).toBe(false);\n });\n });\n});\n"]}
@@ -48,6 +48,7 @@ const debug_1 = require("../utils/debug");
48
48
  const benchmark_1 = require("./middleware/benchmark");
49
49
  const wizard_abort_1 = require("../utils/wizard-abort");
50
50
  const yara_hooks_1 = require("./yara-hooks");
51
+ const cloudflare_detection_1 = require("./cloudflare-detection");
51
52
  /**
52
53
  * Build a WizardOptions bag from a WizardSession (for code that still expects WizardOptions).
53
54
  */
@@ -170,6 +171,8 @@ async function runAgentWizard(config, session) {
170
171
  signup: session.signup,
171
172
  ci: session.ci,
172
173
  apiKey: session.apiKey,
174
+ email: session.email,
175
+ region: session.region,
173
176
  projectId: session.projectId,
174
177
  });
175
178
  session.credentials = { accessToken, projectApiKey, host, projectId };
@@ -182,13 +185,21 @@ async function runAgentWizard(config, session) {
182
185
  Object.entries(contextTags).forEach(([key, value]) => {
183
186
  analytics_1.analytics.setTag(key, value);
184
187
  });
188
+ // Detect Cloudflare Workers target and fetch runtime reference if needed
189
+ const isCloudflare = await (0, cloudflare_detection_1.detectCloudflareTarget)(session.installDir);
190
+ let cloudflareReference = null;
191
+ if (isCloudflare) {
192
+ (0, debug_1.logToFile)('[agent-runner] Cloudflare Workers target detected');
193
+ analytics_1.analytics.setTag('cloudflare', 'true');
194
+ cloudflareReference = await (0, cloudflare_detection_1.fetchCloudflareReference)(skillsBaseUrl);
195
+ }
185
196
  const integrationPrompt = buildIntegrationPrompt(config, {
186
197
  frameworkVersion: frameworkVersion || 'latest',
187
198
  typescript: typeScriptDetected,
188
199
  projectApiKey,
189
200
  host,
190
201
  projectId,
191
- }, frameworkContext);
202
+ }, frameworkContext, cloudflareReference);
192
203
  // Initialize and run agent
193
204
  const spinner = (0, ui_1.getUI)().spinner();
194
205
  // Evaluate all feature flags at the start of the run so they can be sent to the LLM gateway
@@ -325,13 +336,16 @@ async function runAgentWizard(config, session) {
325
336
  /**
326
337
  * Build the integration prompt for the agent.
327
338
  */
328
- function buildIntegrationPrompt(config, context, frameworkContext) {
339
+ function buildIntegrationPrompt(config, context, frameworkContext, cloudflareReference) {
329
340
  const additionalLines = config.prompts.getAdditionalContextLines
330
341
  ? config.prompts.getAdditionalContextLines(frameworkContext)
331
342
  : [];
332
343
  const additionalContext = additionalLines.length > 0
333
344
  ? '\n' + additionalLines.map((line) => `- ${line}`).join('\n')
334
345
  : '';
346
+ const runtimeOverrides = cloudflareReference
347
+ ? `\n\n---\n\n${cloudflareReference}`
348
+ : '';
335
349
  return `You have access to the PostHog MCP server which provides skills to integrate PostHog into this ${config.metadata.name} project.
336
350
 
337
351
  Project context:
@@ -364,7 +378,7 @@ STEP 5: Set up environment variables for PostHog using the wizard-tools MCP serv
364
378
  - Reference these environment variables in the code files you create instead of hardcoding the public token and host.
365
379
 
366
380
  Important: Use the detect_package_manager tool (from the wizard-tools MCP server) to determine which package manager the project uses. Do not manually search for lockfiles or config files. Always install packages as a background task. Don't await completion; proceed with other work immediately after starting the installation. You must read a file immediately before attempting to write it, even if you have previously read it; failure to do so will cause a tool failure.
367
-
381
+ ${runtimeOverrides}
368
382
 
369
383
  `;
370
384
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../../src/lib/agent-runner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoEA,wCAsUC;AA1YD,yDAI4B;AAC5B,qDAAiE;AACjE,sDAI8B;AAG9B,2CAA4D;AAC5D,kDAA+C;AAC/C,8BAA8B;AAC9B,uDAS2B;AAC3B,wCAAsD;AAEtD,+CAAiC;AACjC,yDAGmC;AACnC,0CAAyE;AACzE,sDAAiE;AACjE,wDAI+B;AAC/B,6CAAiE;AAEjE;;GAEG;AACH,SAAS,gBAAgB,CAAC,OAAsB;IAC9C,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,cAAc,CAClC,MAAuB,EACvB,OAAsB;IAEtB,IAAA,mBAAW,GAAE,CAAC;IACd,IAAA,iBAAS,EAAC,oCAAoC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IAE7E,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,IAAA,uBAAe,GAAE,CAAC;IACpB,CAAC;IAED,gBAAgB;IAChB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,IAAI,MAAM,CAAC,SAAS,CAAC,mBAAmB,EAAE,CAAC;QAC5E,IAAA,iBAAS,EAAC,iCAAiC,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,mBAAmB,CACxD,gBAAgB,CAAC,OAAO,CAAC,CAC1B,CAAC;QACF,IAAI,OAAO,EAAE,CAAC;YACZ,IAAA,iBAAS,EACP,0BAA0B,OAAO,YAAY,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,CAC/E,CAAC;YACF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,OAAO,IAAI,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC;gBACnE,MAAM,OAAO,GACX,MAAM,CAAC,QAAQ,CAAC,yBAAyB,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACvE,MAAM,IAAA,0BAAW,EAAC;oBAChB,OAAO,EACL,yCAAyC,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,OAAO,IAAI;wBAC5E,cAAc,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,aAAa;wBAClF,0CAA0C;wBAC1C,SAAS,MAAM,CAAC,QAAQ,CAAC,IAAI,cAAc,OAAO,EAAE;iBACvD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ;QACpC,CAAC,CAAC,uBAAuB;QACzB,CAAC,CAAC,kEAAkE,CAAC;IAEvE,2EAA2E;IAC3E,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7B,IAAA,iBAAS,EAAC,4CAA4C,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,MAAM,IAAA,mCAAuB,GAAE,CAAC;QAClD,IAAA,iBAAS,EAAC,4BAA4B,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5D,IAAI,SAAS,CAAC,QAAQ,KAAK,2BAAe,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,IAAA,UAAK,GAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,SAAS,CAAC,QAAQ,KAAK,2BAAe,CAAC,eAAe,EAAE,CAAC;YAClE,IAAA,UAAK,GAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,kEAAkE;IAClE,MAAM,iBAAiB,GAAG,IAAA,2CAAyB,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxE,IAAA,iBAAS,EACP,sCACE,iBAAiB,CAAC,MAAM,GAAG,CAAC;QAC1B,CAAC,CAAC,iBAAiB;aACd,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;aAC9C,IAAI,CAAC,IAAI,CAAC;QACf,CAAC,CAAC,MACN,EAAE,CACH,CAAC;IAEF,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,gDAAgD;QAChD,KAAK,MAAM,QAAQ,IAAI,iBAAiB,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YACtE,qBAAS,CAAC,aAAa,CAAC,4BAA4B,EAAE;gBACpD,KAAK;gBACL,IAAI,EAAE,QAAQ,CAAC,IAAI;aACpB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAA,UAAK,GAAE,CAAC,oBAAoB,CAAC,iBAAiB,EAAE,GAAG,EAAE,CACzD,IAAA,4CAA0B,EAAC,OAAO,CAAC,UAAU,CAAC,CAC/C,CAAC;QACF,IAAA,iBAAS,EAAC,2CAA2C,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,kBAAkB,GAAG,IAAA,+BAAiB,EAAC;QAC3C,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC,CAAC;IACH,OAAO,CAAC,UAAU,GAAG,kBAAkB,CAAC;IAExC,kCAAkC;IAClC,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC,eAAe,KAAK,KAAK,CAAC;IACnE,IAAI,WAAW,GAA0B,IAAI,CAAC;IAC9C,IAAI,gBAAoC,CAAC;IAEzC,IAAI,eAAe,EAAE,CAAC;QACpB,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1E,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;YACzE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC;gBACpE,IAAA,UAAK,GAAE,CAAC,GAAG,CAAC,IAAI,CACd,GAAG,MAAM,CAAC,SAAS,CAAC,kBAAkB,+EAA+E,CACtH,CAAC;YACJ,CAAC;YACD,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,IAAA,UAAK,GAAE,CAAC,GAAG,CAAC,IAAI,CACd,4EAA4E,CAC7E,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,2CAA2C;IAC3C,IAAI,gBAAgB,IAAI,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC;QAC1D,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;QAC1E,qBAAS,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,UAAU,EAAE,aAAa,CAAC,CAAC;IAC5E,CAAC;IAED,qBAAS,CAAC,aAAa,CAAC,eAAe,EAAE;QACvC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;KACzC,CAAC,CAAC;IAEH,4DAA4D;IAC5D,IAAA,iBAAS,EAAC,+BAA+B,CAAC,CAAC;IAC3C,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,GAChE,MAAM,IAAA,oCAAsB,EAAC;QAC3B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;IAEL,OAAO,CAAC,WAAW,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAEtE,uEAAuE;IACvE,IAAA,UAAK,GAAE,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAE5C,oEAAoE;IACpE,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAElD,4CAA4C;IAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/D,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACnD,qBAAS,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,sBAAsB,CAC9C,MAAM,EACN;QACE,gBAAgB,EAAE,gBAAgB,IAAI,QAAQ;QAC9C,UAAU,EAAE,kBAAkB;QAC9B,aAAa;QACb,IAAI;QACJ,SAAS;KACV,EACD,gBAAgB,CACjB,CAAC;IAEF,2BAA2B;IAC3B,MAAM,OAAO,GAAG,IAAA,UAAK,GAAE,CAAC,OAAO,EAAE,CAAC;IAElC,4FAA4F;IAC5F,MAAM,WAAW,GAAG,MAAM,qBAAS,CAAC,oBAAoB,EAAE,CAAC;IAC3D,MAAM,cAAc,GAAG,IAAA,qCAAmB,EAAC,WAAW,CAAC,CAAC;IAExD,6DAA6D;IAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ;QAC7B,CAAC,CAAC,2BAA2B;QAC7B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO;YACnB,CAAC,WAAW,KAAK,IAAI;gBACnB,CAAC,CAAC,gCAAgC;gBAClC,CAAC,CAAC,6BAA6B,CAAC,CAAC;IAEvC,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,IAAA,uCAAqB,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxE,IAAA,UAAK,GAAE,CAAC,aAAa,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAEhD,uFAAuF;IACvF,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,IAAA,8BAAe,EAAC,GAAG,EAAE;YACnB,MAAM,UAAU,GAAG,IAAA,4BAAe,GAAE,CAAC;YACrC,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,IAAA,6BAAgB,GAAE,CAAC;gBACnC,IAAA,UAAK,GAAE,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,UAAU,GAAG,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAA,UAAK,GAAE,CAAC,QAAQ,EAAE,CAAC;IAEnB,MAAM,KAAK,GAAG,MAAM,IAAA,iCAAe,EACjC;QACE,gBAAgB,EAAE,OAAO,CAAC,UAAU;QACpC,aAAa,EAAE,MAAM;QACrB,aAAa,EAAE,WAAW;QAC1B,cAAc,EAAE,IAAI;QACpB,oBAAoB,EAAE,MAAM,CAAC,QAAQ,CAAC,oBAAoB;QAC1D,oBAAoB,EAAE,MAAM,CAAC,SAAS,CAAC,oBAAoB;QAC3D,aAAa;QACb,WAAW;QACX,cAAc;KACf,EACD,gBAAgB,CAAC,OAAO,CAAC,CAC1B,CAAC;IAEF,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS;QAClC,CAAC,CAAC,IAAA,mCAAuB,EAAC,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC7D,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,WAAW,GAAG,MAAM,IAAA,0BAAQ,EAChC,KAAK,EACL,iBAAiB,EACjB,gBAAgB,CAAC,OAAO,CAAC,EACzB,OAAO,EACP;QACE,wBAAwB,EAAE,MAAM,CAAC,EAAE,CAAC,wBAAwB;QAC5D,cAAc,EAAE,kCAAe;QAC/B,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC,cAAc;QACxC,YAAY,EAAE,oBAAoB;QAClC,sBAAsB,EAAE,OAAO,CAAC,sBAAsB;KACvD,EACD,UAAU,CACX,CAAC;IAEF,8CAA8C;IAC9C,IAAI,WAAW,CAAC,KAAK,KAAK,gCAAc,CAAC,WAAW,EAAE,CAAC;QACrD,MAAM,IAAA,0BAAW,EAAC;YAChB,OAAO,EAAE,2MAA2M,MAAM,CAAC,QAAQ,CAAC,IAAI,8CAA8C,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE;YAC/S,KAAK,EAAE,IAAI,0BAAW,CAAC,2CAA2C,EAAE;gBAClE,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;gBACxC,UAAU,EAAE,gCAAc,CAAC,WAAW;gBACtC,MAAM,EAAE,8BAAY,CAAC,iBAAiB;aACvC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED,IAAI,WAAW,CAAC,KAAK,KAAK,gCAAc,CAAC,gBAAgB,EAAE,CAAC;QAC1D,MAAM,IAAA,0BAAW,EAAC;YAChB,OAAO,EAAE,4LAA4L,MAAM,CAAC,QAAQ,CAAC,IAAI,8CAA8C,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE;YAChS,KAAK,EAAE,IAAI,0BAAW,CAAC,uCAAuC,EAAE;gBAC9D,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;gBACxC,UAAU,EAAE,gCAAc,CAAC,gBAAgB;gBAC3C,MAAM,EAAE,8BAAY,CAAC,sBAAsB;aAC5C,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED,IAAI,WAAW,CAAC,KAAK,KAAK,gCAAc,CAAC,cAAc,EAAE,CAAC;QACxD,MAAM,IAAA,0BAAW,EAAC;YAChB,OAAO,EACL,0OAA0O;YAC5O,KAAK,EAAE,IAAI,0BAAW,CAAC,iCAAiC,EAAE;gBACxD,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;gBACxC,UAAU,EAAE,gCAAc,CAAC,cAAc;aAC1C,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED,IACE,WAAW,CAAC,KAAK,KAAK,gCAAc,CAAC,UAAU;QAC/C,WAAW,CAAC,KAAK,KAAK,gCAAc,CAAC,SAAS,EAC9C,CAAC;QACD,qBAAS,CAAC,aAAa,CAAC,iBAAiB,EAAE;YACzC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;YACxC,UAAU,EAAE,WAAW,CAAC,KAAK;YAC7B,aAAa,EAAE,WAAW,CAAC,OAAO;SACnC,CAAC,CAAC;QAEH,MAAM,IAAA,0BAAW,EAAC;YAChB,OAAO,EAAE,gBACP,WAAW,CAAC,OAAO,IAAI,eACzB,qDAAqD;YACrD,KAAK,EAAE,IAAI,0BAAW,CAAC,cAAc,WAAW,CAAC,OAAO,EAAE,EAAE;gBAC1D,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;gBACxC,UAAU,EAAE,WAAW,CAAC,KAAK;aAC9B,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED,qDAAqD;IACrD,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAEnE,kEAAkE;IAClE,IAAI,eAAe,GAAa,EAAE,CAAC;IACnC,IAAI,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;QACvC,MAAM,EAAE,8BAA8B,EAAE,GAAG,MAAM,MAAM,CACrD,mBAAmB,CACpB,CAAC;QACF,eAAe,GAAG,MAAM,8BAA8B,CAAC,OAAO,EAAE;YAC9D,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;YACxC,OAAO;SACR,CAAC,CAAC;QACH,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,qBAAS,CAAC,OAAO,CAAC,yCAA6B,EAAE;gBAC/C,MAAM,EAAE,0BAA0B;gBAClC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;gBACxC,cAAc,EAAE,eAAe,CAAC,MAAM;gBACtC,aAAa,EAAE,eAAe;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,4DAA4D;IAE5D,gDAAgD;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM;QAChC,CAAC,CAAC,GAAG,IAAA,4BAAqB,EAAC,WAAW,CAAC,yBAAyB;QAChE,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,OAAO,GAAG;QACd,GAAG,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,gBAAgB,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;YAC7B,CAAC,CAAC,0CAA0C;YAC5C,CAAC,CAAC,EAAE;QACN,eAAe,CAAC,MAAM,GAAG,CAAC;YACxB,CAAC,CAAC,yDAAyD;YAC3D,CAAC,CAAC,EAAE;KACP,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAElB,OAAO,CAAC,SAAS,GAAG;QAClB,IAAI,EAAE,0BAAS,CAAC,OAAO;QACvB,OAAO;QACP,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO;QAChC,WAAW;KACZ,CAAC;IAEF,IAAA,UAAK,GAAE,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAEjD,MAAM,qBAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAC7B,MAAuB,EACvB,OAMC,EACD,gBAAyC;IAEzC,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,yBAAyB;QAC9D,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,gBAAgB,CAAC;QAC5D,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,iBAAiB,GACrB,eAAe,CAAC,MAAM,GAAG,CAAC;QACxB,CAAC,CAAC,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9D,CAAC,CAAC,EAAE,CAAC;IAET,OAAO,kGACL,MAAM,CAAC,QAAQ,CAAC,IAClB;;;wBAGsB,OAAO,CAAC,SAAS;eAC1B,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,gBAAgB;gBAC/C,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;0BACvB,OAAO,CAAC,aAAa;kBAC7B,OAAO,CAAC,IAAI;kBACZ,MAAM,CAAC,OAAO,CAAC,oBAAoB;0BAEjD,MAAM,CAAC,OAAO,CAAC,mBAAmB,IAAI,+CACxC,GAAG,iBAAiB;;;;;8BAMjB,8BAAY,CAAC,iBACf;;;sDAIE,8BAAY,CAAC,sBACf;;;;;;;;;;;kJAYE,MAAM,CAAC,QAAQ,CAAC,IAClB;;;;;;CAMF,CAAC;AACF,CAAC","sourcesContent":["import {\n DEFAULT_PACKAGE_INSTALLATION,\n SPINNER_MESSAGE,\n type FrameworkConfig,\n} from './framework-config';\nimport { type WizardSession, OutroKind } from './wizard-session';\nimport {\n tryGetPackageJson,\n isUsingTypeScript,\n getOrAskForProjectData,\n} from '../utils/setup-utils';\nimport type { PackageDotJson } from '../utils/package-json';\nimport type { WizardOptions } from '../utils/types';\nimport { WIZARD_INTERACTION_EVENT_NAME } from './constants';\nimport { analytics } from '../utils/analytics';\nimport { getUI } from '../ui';\nimport {\n initializeAgent,\n runAgent,\n AgentSignals,\n AgentErrorType,\n buildWizardMetadata,\n checkAllSettingsConflicts,\n backupAndFixClaudeSettings,\n restoreClaudeSettings,\n} from './agent-interface';\nimport { getCloudUrlFromRegion } from '../utils/urls';\n\nimport * as semver from 'semver';\nimport {\n evaluateWizardReadiness,\n WizardReadiness,\n} from './health-checks/readiness';\nimport { enableDebugLogs, initLogFile, logToFile } from '../utils/debug';\nimport { createBenchmarkPipeline } from './middleware/benchmark';\nimport {\n wizardAbort,\n WizardError,\n registerCleanup,\n} from '../utils/wizard-abort';\nimport { formatScanReport, writeScanReport } from './yara-hooks';\n\n/**\n * Build a WizardOptions bag from a WizardSession (for code that still expects WizardOptions).\n */\nfunction sessionToOptions(session: WizardSession): WizardOptions {\n return {\n installDir: session.installDir,\n debug: session.debug,\n forceInstall: session.forceInstall,\n default: false,\n signup: session.signup,\n localMcp: session.localMcp,\n ci: session.ci,\n menu: session.menu,\n benchmark: session.benchmark,\n projectId: session.projectId,\n apiKey: session.apiKey,\n yaraReport: session.yaraReport,\n };\n}\n\n/**\n * Universal agent-powered wizard runner.\n * Handles the complete flow for any framework using PostHog MCP integration.\n *\n * All user decisions come from the session — no UI prompts.\n */\nexport async function runAgentWizard(\n config: FrameworkConfig,\n session: WizardSession,\n): Promise<void> {\n initLogFile();\n logToFile(`[agent-runner] START integration=${config.metadata.integration}`);\n\n if (session.debug) {\n enableDebugLogs();\n }\n\n // Version check\n if (config.detection.minimumVersion && config.detection.getInstalledVersion) {\n logToFile('[agent-runner] checking version');\n const version = await config.detection.getInstalledVersion(\n sessionToOptions(session),\n );\n if (version) {\n logToFile(\n `[agent-runner] version=${version} minimum=${config.detection.minimumVersion}`,\n );\n const coerced = semver.coerce(version);\n if (coerced && semver.lt(coerced, config.detection.minimumVersion)) {\n const docsUrl =\n config.metadata.unsupportedVersionDocsUrl ?? config.metadata.docsUrl;\n await wizardAbort({\n message:\n `Sorry: the wizard can't help you with ${config.metadata.name} ${version}. ` +\n `Upgrade to ${config.metadata.name} ${config.detection.minimumVersion} or later, ` +\n `or check out the manual setup guide.\\n\\n` +\n `Setup ${config.metadata.name} manually: ${docsUrl}`,\n });\n }\n }\n }\n\n // Compute skills server URL (needed for agent tool calls)\n const skillsBaseUrl = session.localMcp\n ? 'http://localhost:8765'\n : 'https://github.com/PostHog/context-mill/releases/latest/download';\n\n // Check all external service health (skip if TUI already ran it in bin.ts)\n if (!session.readinessResult) {\n logToFile('[agent-runner] evaluating wizard readiness');\n const readiness = await evaluateWizardReadiness();\n logToFile(`[agent-runner] readiness=${readiness.decision}`);\n if (readiness.decision === WizardReadiness.No) {\n await getUI().showBlockingOutage(readiness);\n } else if (readiness.decision === WizardReadiness.YesWithWarnings) {\n getUI().setReadinessWarnings(readiness);\n }\n }\n\n // Check ALL settings sources for blocking overrides before login.\n const settingsConflicts = checkAllSettingsConflicts(session.installDir);\n logToFile(\n `[agent-runner] settings conflicts: ${\n settingsConflicts.length > 0\n ? settingsConflicts\n .map((c) => `${c.source}(${c.keys.join(',')})`)\n .join('; ')\n : 'none'\n }`,\n );\n\n if (settingsConflicts.length > 0) {\n // Capture analytics for each conflict variation\n for (const conflict of settingsConflicts) {\n const level = conflict.source === 'managed' ? 'org' : conflict.source;\n analytics.wizardCapture('settings conflict detected', {\n level,\n keys: conflict.keys,\n });\n }\n\n await getUI().showSettingsOverride(settingsConflicts, () =>\n backupAndFixClaudeSettings(session.installDir),\n );\n logToFile('[agent-runner] settings override resolved');\n }\n\n const typeScriptDetected = isUsingTypeScript({\n installDir: session.installDir,\n });\n session.typescript = typeScriptDetected;\n\n // Framework detection and version\n const usesPackageJson = config.detection.usesPackageJson !== false;\n let packageJson: PackageDotJson | null = null;\n let frameworkVersion: string | undefined;\n\n if (usesPackageJson) {\n packageJson = await tryGetPackageJson({ installDir: session.installDir });\n if (packageJson) {\n const { hasPackageInstalled } = await import('../utils/package-json.js');\n if (!hasPackageInstalled(config.detection.packageName, packageJson)) {\n getUI().log.warn(\n `${config.detection.packageDisplayName} does not seem to be installed. Continuing anyway — the agent will handle it.`,\n );\n }\n frameworkVersion = config.detection.getVersion(packageJson);\n } else {\n getUI().log.warn(\n 'Could not find package.json. Continuing anyway — the agent will handle it.',\n );\n }\n } else {\n frameworkVersion = config.detection.getVersion(null);\n }\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.wizardCapture('agent started', {\n integration: config.metadata.integration,\n });\n\n // Get PostHog credentials (region auto-detected from token)\n logToFile('[agent-runner] starting OAuth');\n const { projectApiKey, host, accessToken, projectId, cloudRegion } =\n await getOrAskForProjectData({\n signup: session.signup,\n ci: session.ci,\n apiKey: session.apiKey,\n projectId: session.projectId,\n });\n\n session.credentials = { accessToken, projectApiKey, host, projectId };\n\n // Notify TUI that credentials are available (resolves past AuthScreen)\n getUI().setCredentials(session.credentials);\n\n // Framework context was already gathered by SetupScreen + detection\n const frameworkContext = session.frameworkContext;\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 const integrationPrompt = buildIntegrationPrompt(\n config,\n {\n frameworkVersion: frameworkVersion || 'latest',\n typescript: typeScriptDetected,\n projectApiKey,\n host,\n projectId,\n },\n frameworkContext,\n );\n\n // Initialize and run agent\n const spinner = getUI().spinner();\n\n // Evaluate all feature flags at the start of the run so they can be sent to the LLM gateway\n const wizardFlags = await analytics.getAllFlagsForWizard();\n const wizardMetadata = buildWizardMetadata(wizardFlags);\n\n // Determine MCP URL: CLI flag > env var > production default\n const mcpUrl = session.localMcp\n ? 'http://localhost:8787/mcp'\n : process.env.MCP_URL ||\n (cloudRegion === 'eu'\n ? 'https://mcp-eu.posthog.com/mcp'\n : 'https://mcp.posthog.com/mcp');\n\n const restoreSettings = () => restoreClaudeSettings(session.installDir);\n getUI().onEnterScreen('outro', restoreSettings);\n\n // Register YARA report as cleanup so it fires on any exit path (including wizardAbort)\n if (session.yaraReport) {\n registerCleanup(() => {\n const reportPath = writeScanReport();\n if (reportPath) {\n const summary = formatScanReport();\n getUI().log.info(`YARA scan report: ${reportPath}${summary ?? ''}`);\n }\n });\n }\n\n getUI().startRun();\n\n const agent = await initializeAgent(\n {\n workingDirectory: session.installDir,\n posthogMcpUrl: mcpUrl,\n posthogApiKey: accessToken,\n posthogApiHost: host,\n additionalMcpServers: config.metadata.additionalMcpServers,\n detectPackageManager: config.detection.detectPackageManager,\n skillsBaseUrl,\n wizardFlags,\n wizardMetadata,\n },\n sessionToOptions(session),\n );\n\n const middleware = session.benchmark\n ? createBenchmarkPipeline(spinner, sessionToOptions(session))\n : undefined;\n\n const agentResult = await runAgent(\n agent,\n integrationPrompt,\n sessionToOptions(session),\n spinner,\n {\n estimatedDurationMinutes: config.ui.estimatedDurationMinutes,\n spinnerMessage: SPINNER_MESSAGE,\n successMessage: config.ui.successMessage,\n errorMessage: 'Integration failed',\n additionalFeatureQueue: session.additionalFeatureQueue,\n },\n middleware,\n );\n\n // Handle error cases detected in agent output\n if (agentResult.error === AgentErrorType.MCP_MISSING) {\n await wizardAbort({\n message: `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 ${config.metadata.name} manually by following our documentation:\\n${config.metadata.docsUrl}`,\n error: new WizardError('Agent could not access PostHog MCP server', {\n integration: config.metadata.integration,\n error_type: AgentErrorType.MCP_MISSING,\n signal: AgentSignals.ERROR_MCP_MISSING,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.RESOURCE_MISSING) {\n await wizardAbort({\n message: `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 ${config.metadata.name} manually by following our documentation:\\n${config.metadata.docsUrl}`,\n error: new WizardError('Agent could not access setup resource', {\n integration: config.metadata.integration,\n error_type: AgentErrorType.RESOURCE_MISSING,\n signal: AgentSignals.ERROR_RESOURCE_MISSING,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.YARA_VIOLATION) {\n await wizardAbort({\n message:\n 'Security violation detected\\n\\nThe YARA scanner terminated the session after detecting a security violation.\\nThis may indicate prompt injection, poisoned skill files, or a policy breach.\\n\\nPlease report this to: wizard@posthog.com',\n error: new WizardError('YARA scanner terminated session', {\n integration: config.metadata.integration,\n error_type: AgentErrorType.YARA_VIOLATION,\n }),\n });\n }\n\n if (\n agentResult.error === AgentErrorType.RATE_LIMIT ||\n agentResult.error === AgentErrorType.API_ERROR\n ) {\n analytics.wizardCapture('agent api error', {\n integration: config.metadata.integration,\n error_type: agentResult.error,\n error_message: agentResult.message,\n });\n\n await wizardAbort({\n message: `API Error\\n\\n${\n agentResult.message || 'Unknown error'\n }\\n\\nPlease report this error to: wizard@posthog.com`,\n error: new WizardError(`API error: ${agentResult.message}`, {\n integration: config.metadata.integration,\n error_type: agentResult.error,\n }),\n });\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 (auto-accept)\n let uploadedEnvVars: string[] = [];\n if (config.environment.uploadToHosting) {\n const { uploadEnvironmentVariablesStep } = await import(\n '../steps/index.js'\n );\n uploadedEnvVars = await uploadEnvironmentVariablesStep(envVars, {\n integration: config.metadata.integration,\n session,\n });\n if (uploadedEnvVars.length > 0) {\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'wizard_env_vars_uploaded',\n integration: config.metadata.integration,\n variable_count: uploadedEnvVars.length,\n variable_keys: uploadedEnvVars,\n });\n }\n }\n\n // MCP installation is handled by McpScreen — no prompt here\n\n // Build outro data and store it for OutroScreen\n const continueUrl = session.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 session.outroData = {\n kind: OutroKind.Success,\n changes,\n docsUrl: config.metadata.docsUrl,\n continueUrl,\n };\n\n getUI().outro(`Successfully installed PostHog!`);\n\n await analytics.shutdown('success');\n}\n\n/**\n * Build the integration prompt for the agent.\n */\nfunction buildIntegrationPrompt(\n config: FrameworkConfig,\n context: {\n frameworkVersion: string;\n typescript: boolean;\n projectApiKey: string;\n host: string;\n projectId: number;\n },\n frameworkContext: Record<string, unknown>,\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 skills to integrate PostHog into this ${\n config.metadata.name\n } project.\n\nProject context:\n- PostHog Project ID: ${context.projectId}\n- Framework: ${config.metadata.name} ${context.frameworkVersion}\n- TypeScript: ${context.typescript ? 'Yes' : 'No'}\n- PostHog public token: ${context.projectApiKey}\n- PostHog Host: ${context.host}\n- Project type: ${config.prompts.projectTypeDetection}\n- Package installation: ${\n config.prompts.packageInstallation ?? DEFAULT_PACKAGE_INSTALLATION\n }${additionalContext}\n\nInstructions (follow these steps IN ORDER - do not skip or reorder):\n\nSTEP 1: Call load_skill_menu (from the wizard-tools MCP server) to see available skills.\n If the tool fails, emit: ${\n AgentSignals.ERROR_MCP_MISSING\n } Could not load skill menu and halt.\n\n Choose a skill from the \\`integration\\` category that matches this project's framework. Do NOT pick skills from other categories (llm-analytics, error-tracking, feature-flags, omnibus, etc.) — those are handled separately.\n If no suitable integration skill is found, emit: ${\n AgentSignals.ERROR_RESOURCE_MISSING\n } Could not find a suitable skill for this project.\n\nSTEP 2: Call install_skill (from the wizard-tools MCP server) with the chosen skill ID (e.g., \"integration-nextjs-app-router\").\n Do NOT run any shell commands to install skills.\n\nSTEP 3: Load the installed skill's SKILL.md file to understand what references are available.\n\nSTEP 4: Follow the skill's workflow files in sequence. Look for numbered workflow files in the references (e.g., files with patterns like \"1.0-\", \"1.1-\", \"1.2-\"). Start with the first one and proceed through each step until completion. Each workflow file will tell you what to do and which file comes next. Never directly write PostHog tokens directly to code files; always use environment variables.\n\nSTEP 5: Set up environment variables for PostHog using the wizard-tools MCP server (this runs locally — secret values never leave the machine):\n - Use check_env_keys to see which keys already exist in the project's .env file (e.g. .env.local or .env).\n - Use set_env_values to create or update the PostHog public token and host, using the appropriate environment variable naming convention for ${\n config.metadata.name\n }, which you'll find in example code. The tool will also ensure .gitignore coverage. Don't assume the presence of keys means the value is up to date. Write the correct value each time.\n - Reference these environment variables in the code files you create instead of hardcoding the public token and host.\n\nImportant: Use the detect_package_manager tool (from the wizard-tools MCP server) to determine which package manager the project uses. Do not manually search for lockfiles or config files. Always install packages as a background task. Don't await completion; proceed with other work immediately after starting the installation. You must read a file immediately before attempting to write it, even if you have previously read it; failure to do so will cause a tool failure.\n\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 {\n DEFAULT_PACKAGE_INSTALLATION,\n SPINNER_MESSAGE,\n type FrameworkConfig,\n} from './framework-config';\nimport { type WizardSession, OutroKind } from './wizard-session';\nimport {\n tryGetPackageJson,\n isUsingTypeScript,\n getOrAskForProjectData,\n} from '../utils/setup-utils';\nimport type { PackageDotJson } from '../utils/package-json';\nimport type { WizardOptions } from '../utils/types';\nimport { WIZARD_INTERACTION_EVENT_NAME } from './constants';\nimport { analytics } from '../utils/analytics';\nimport { getUI } from '../ui';\nimport {\n initializeAgent,\n runAgent,\n AgentSignals,\n AgentErrorType,\n buildWizardMetadata,\n checkAllSettingsConflicts,\n backupAndFixClaudeSettings,\n restoreClaudeSettings,\n} from './agent-interface';\nimport { getCloudUrlFromRegion } from '../utils/urls';\n\nimport * as semver from 'semver';\nimport {\n evaluateWizardReadiness,\n WizardReadiness,\n} from './health-checks/readiness';\nimport { enableDebugLogs, initLogFile, logToFile } from '../utils/debug';\nimport { createBenchmarkPipeline } from './middleware/benchmark';\nimport {\n wizardAbort,\n WizardError,\n registerCleanup,\n} from '../utils/wizard-abort';\nimport { formatScanReport, writeScanReport } from './yara-hooks';\nimport {\n detectCloudflareTarget,\n fetchCloudflareReference,\n} from './cloudflare-detection';\n\n/**\n * Build a WizardOptions bag from a WizardSession (for code that still expects WizardOptions).\n */\nfunction sessionToOptions(session: WizardSession): WizardOptions {\n return {\n installDir: session.installDir,\n debug: session.debug,\n forceInstall: session.forceInstall,\n default: false,\n signup: session.signup,\n localMcp: session.localMcp,\n ci: session.ci,\n menu: session.menu,\n benchmark: session.benchmark,\n projectId: session.projectId,\n apiKey: session.apiKey,\n yaraReport: session.yaraReport,\n };\n}\n\n/**\n * Universal agent-powered wizard runner.\n * Handles the complete flow for any framework using PostHog MCP integration.\n *\n * All user decisions come from the session — no UI prompts.\n */\nexport async function runAgentWizard(\n config: FrameworkConfig,\n session: WizardSession,\n): Promise<void> {\n initLogFile();\n logToFile(`[agent-runner] START integration=${config.metadata.integration}`);\n\n if (session.debug) {\n enableDebugLogs();\n }\n\n // Version check\n if (config.detection.minimumVersion && config.detection.getInstalledVersion) {\n logToFile('[agent-runner] checking version');\n const version = await config.detection.getInstalledVersion(\n sessionToOptions(session),\n );\n if (version) {\n logToFile(\n `[agent-runner] version=${version} minimum=${config.detection.minimumVersion}`,\n );\n const coerced = semver.coerce(version);\n if (coerced && semver.lt(coerced, config.detection.minimumVersion)) {\n const docsUrl =\n config.metadata.unsupportedVersionDocsUrl ?? config.metadata.docsUrl;\n await wizardAbort({\n message:\n `Sorry: the wizard can't help you with ${config.metadata.name} ${version}. ` +\n `Upgrade to ${config.metadata.name} ${config.detection.minimumVersion} or later, ` +\n `or check out the manual setup guide.\\n\\n` +\n `Setup ${config.metadata.name} manually: ${docsUrl}`,\n });\n }\n }\n }\n\n // Compute skills server URL (needed for agent tool calls)\n const skillsBaseUrl = session.localMcp\n ? 'http://localhost:8765'\n : 'https://github.com/PostHog/context-mill/releases/latest/download';\n\n // Check all external service health (skip if TUI already ran it in bin.ts)\n if (!session.readinessResult) {\n logToFile('[agent-runner] evaluating wizard readiness');\n const readiness = await evaluateWizardReadiness();\n logToFile(`[agent-runner] readiness=${readiness.decision}`);\n if (readiness.decision === WizardReadiness.No) {\n await getUI().showBlockingOutage(readiness);\n } else if (readiness.decision === WizardReadiness.YesWithWarnings) {\n getUI().setReadinessWarnings(readiness);\n }\n }\n\n // Check ALL settings sources for blocking overrides before login.\n const settingsConflicts = checkAllSettingsConflicts(session.installDir);\n logToFile(\n `[agent-runner] settings conflicts: ${\n settingsConflicts.length > 0\n ? settingsConflicts\n .map((c) => `${c.source}(${c.keys.join(',')})`)\n .join('; ')\n : 'none'\n }`,\n );\n\n if (settingsConflicts.length > 0) {\n // Capture analytics for each conflict variation\n for (const conflict of settingsConflicts) {\n const level = conflict.source === 'managed' ? 'org' : conflict.source;\n analytics.wizardCapture('settings conflict detected', {\n level,\n keys: conflict.keys,\n });\n }\n\n await getUI().showSettingsOverride(settingsConflicts, () =>\n backupAndFixClaudeSettings(session.installDir),\n );\n logToFile('[agent-runner] settings override resolved');\n }\n\n const typeScriptDetected = isUsingTypeScript({\n installDir: session.installDir,\n });\n session.typescript = typeScriptDetected;\n\n // Framework detection and version\n const usesPackageJson = config.detection.usesPackageJson !== false;\n let packageJson: PackageDotJson | null = null;\n let frameworkVersion: string | undefined;\n\n if (usesPackageJson) {\n packageJson = await tryGetPackageJson({ installDir: session.installDir });\n if (packageJson) {\n const { hasPackageInstalled } = await import('../utils/package-json.js');\n if (!hasPackageInstalled(config.detection.packageName, packageJson)) {\n getUI().log.warn(\n `${config.detection.packageDisplayName} does not seem to be installed. Continuing anyway — the agent will handle it.`,\n );\n }\n frameworkVersion = config.detection.getVersion(packageJson);\n } else {\n getUI().log.warn(\n 'Could not find package.json. Continuing anyway — the agent will handle it.',\n );\n }\n } else {\n frameworkVersion = config.detection.getVersion(null);\n }\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.wizardCapture('agent started', {\n integration: config.metadata.integration,\n });\n\n // Get PostHog credentials (region auto-detected from token)\n logToFile('[agent-runner] starting OAuth');\n const { projectApiKey, host, accessToken, projectId, cloudRegion } =\n await getOrAskForProjectData({\n signup: session.signup,\n ci: session.ci,\n apiKey: session.apiKey,\n email: session.email,\n region: session.region,\n projectId: session.projectId,\n });\n\n session.credentials = { accessToken, projectApiKey, host, projectId };\n\n // Notify TUI that credentials are available (resolves past AuthScreen)\n getUI().setCredentials(session.credentials);\n\n // Framework context was already gathered by SetupScreen + detection\n const frameworkContext = session.frameworkContext;\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 // Detect Cloudflare Workers target and fetch runtime reference if needed\n const isCloudflare = await detectCloudflareTarget(session.installDir);\n let cloudflareReference: string | null = null;\n if (isCloudflare) {\n logToFile('[agent-runner] Cloudflare Workers target detected');\n analytics.setTag('cloudflare', 'true');\n cloudflareReference = await fetchCloudflareReference(skillsBaseUrl);\n }\n\n const integrationPrompt = buildIntegrationPrompt(\n config,\n {\n frameworkVersion: frameworkVersion || 'latest',\n typescript: typeScriptDetected,\n projectApiKey,\n host,\n projectId,\n },\n frameworkContext,\n cloudflareReference,\n );\n\n // Initialize and run agent\n const spinner = getUI().spinner();\n\n // Evaluate all feature flags at the start of the run so they can be sent to the LLM gateway\n const wizardFlags = await analytics.getAllFlagsForWizard();\n const wizardMetadata = buildWizardMetadata(wizardFlags);\n\n // Determine MCP URL: CLI flag > env var > production default\n const mcpUrl = session.localMcp\n ? 'http://localhost:8787/mcp'\n : process.env.MCP_URL ||\n (cloudRegion === 'eu'\n ? 'https://mcp-eu.posthog.com/mcp'\n : 'https://mcp.posthog.com/mcp');\n\n const restoreSettings = () => restoreClaudeSettings(session.installDir);\n getUI().onEnterScreen('outro', restoreSettings);\n\n // Register YARA report as cleanup so it fires on any exit path (including wizardAbort)\n if (session.yaraReport) {\n registerCleanup(() => {\n const reportPath = writeScanReport();\n if (reportPath) {\n const summary = formatScanReport();\n getUI().log.info(`YARA scan report: ${reportPath}${summary ?? ''}`);\n }\n });\n }\n\n getUI().startRun();\n\n const agent = await initializeAgent(\n {\n workingDirectory: session.installDir,\n posthogMcpUrl: mcpUrl,\n posthogApiKey: accessToken,\n posthogApiHost: host,\n additionalMcpServers: config.metadata.additionalMcpServers,\n detectPackageManager: config.detection.detectPackageManager,\n skillsBaseUrl,\n wizardFlags,\n wizardMetadata,\n },\n sessionToOptions(session),\n );\n\n const middleware = session.benchmark\n ? createBenchmarkPipeline(spinner, sessionToOptions(session))\n : undefined;\n\n const agentResult = await runAgent(\n agent,\n integrationPrompt,\n sessionToOptions(session),\n spinner,\n {\n estimatedDurationMinutes: config.ui.estimatedDurationMinutes,\n spinnerMessage: SPINNER_MESSAGE,\n successMessage: config.ui.successMessage,\n errorMessage: 'Integration failed',\n additionalFeatureQueue: session.additionalFeatureQueue,\n },\n middleware,\n );\n\n // Handle error cases detected in agent output\n if (agentResult.error === AgentErrorType.MCP_MISSING) {\n await wizardAbort({\n message: `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 ${config.metadata.name} manually by following our documentation:\\n${config.metadata.docsUrl}`,\n error: new WizardError('Agent could not access PostHog MCP server', {\n integration: config.metadata.integration,\n error_type: AgentErrorType.MCP_MISSING,\n signal: AgentSignals.ERROR_MCP_MISSING,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.RESOURCE_MISSING) {\n await wizardAbort({\n message: `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 ${config.metadata.name} manually by following our documentation:\\n${config.metadata.docsUrl}`,\n error: new WizardError('Agent could not access setup resource', {\n integration: config.metadata.integration,\n error_type: AgentErrorType.RESOURCE_MISSING,\n signal: AgentSignals.ERROR_RESOURCE_MISSING,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.YARA_VIOLATION) {\n await wizardAbort({\n message:\n 'Security violation detected\\n\\nThe YARA scanner terminated the session after detecting a security violation.\\nThis may indicate prompt injection, poisoned skill files, or a policy breach.\\n\\nPlease report this to: wizard@posthog.com',\n error: new WizardError('YARA scanner terminated session', {\n integration: config.metadata.integration,\n error_type: AgentErrorType.YARA_VIOLATION,\n }),\n });\n }\n\n if (\n agentResult.error === AgentErrorType.RATE_LIMIT ||\n agentResult.error === AgentErrorType.API_ERROR\n ) {\n analytics.wizardCapture('agent api error', {\n integration: config.metadata.integration,\n error_type: agentResult.error,\n error_message: agentResult.message,\n });\n\n await wizardAbort({\n message: `API Error\\n\\n${\n agentResult.message || 'Unknown error'\n }\\n\\nPlease report this error to: wizard@posthog.com`,\n error: new WizardError(`API error: ${agentResult.message}`, {\n integration: config.metadata.integration,\n error_type: agentResult.error,\n }),\n });\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 (auto-accept)\n let uploadedEnvVars: string[] = [];\n if (config.environment.uploadToHosting) {\n const { uploadEnvironmentVariablesStep } = await import(\n '../steps/index.js'\n );\n uploadedEnvVars = await uploadEnvironmentVariablesStep(envVars, {\n integration: config.metadata.integration,\n session,\n });\n if (uploadedEnvVars.length > 0) {\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'wizard_env_vars_uploaded',\n integration: config.metadata.integration,\n variable_count: uploadedEnvVars.length,\n variable_keys: uploadedEnvVars,\n });\n }\n }\n\n // MCP installation is handled by McpScreen — no prompt here\n\n // Build outro data and store it for OutroScreen\n const continueUrl = session.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 session.outroData = {\n kind: OutroKind.Success,\n changes,\n docsUrl: config.metadata.docsUrl,\n continueUrl,\n };\n\n getUI().outro(`Successfully installed PostHog!`);\n\n await analytics.shutdown('success');\n}\n\n/**\n * Build the integration prompt for the agent.\n */\nfunction buildIntegrationPrompt(\n config: FrameworkConfig,\n context: {\n frameworkVersion: string;\n typescript: boolean;\n projectApiKey: string;\n host: string;\n projectId: number;\n },\n frameworkContext: Record<string, unknown>,\n cloudflareReference?: string | null,\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 const runtimeOverrides = cloudflareReference\n ? `\\n\\n---\\n\\n${cloudflareReference}`\n : '';\n\n return `You have access to the PostHog MCP server which provides skills to integrate PostHog into this ${\n config.metadata.name\n } project.\n\nProject context:\n- PostHog Project ID: ${context.projectId}\n- Framework: ${config.metadata.name} ${context.frameworkVersion}\n- TypeScript: ${context.typescript ? 'Yes' : 'No'}\n- PostHog public token: ${context.projectApiKey}\n- PostHog Host: ${context.host}\n- Project type: ${config.prompts.projectTypeDetection}\n- Package installation: ${\n config.prompts.packageInstallation ?? DEFAULT_PACKAGE_INSTALLATION\n }${additionalContext}\n\nInstructions (follow these steps IN ORDER - do not skip or reorder):\n\nSTEP 1: Call load_skill_menu (from the wizard-tools MCP server) to see available skills.\n If the tool fails, emit: ${\n AgentSignals.ERROR_MCP_MISSING\n } Could not load skill menu and halt.\n\n Choose a skill from the \\`integration\\` category that matches this project's framework. Do NOT pick skills from other categories (llm-analytics, error-tracking, feature-flags, omnibus, etc.) — those are handled separately.\n If no suitable integration skill is found, emit: ${\n AgentSignals.ERROR_RESOURCE_MISSING\n } Could not find a suitable skill for this project.\n\nSTEP 2: Call install_skill (from the wizard-tools MCP server) with the chosen skill ID (e.g., \"integration-nextjs-app-router\").\n Do NOT run any shell commands to install skills.\n\nSTEP 3: Load the installed skill's SKILL.md file to understand what references are available.\n\nSTEP 4: Follow the skill's workflow files in sequence. Look for numbered workflow files in the references (e.g., files with patterns like \"1.0-\", \"1.1-\", \"1.2-\"). Start with the first one and proceed through each step until completion. Each workflow file will tell you what to do and which file comes next. Never directly write PostHog tokens directly to code files; always use environment variables.\n\nSTEP 5: Set up environment variables for PostHog using the wizard-tools MCP server (this runs locally — secret values never leave the machine):\n - Use check_env_keys to see which keys already exist in the project's .env file (e.g. .env.local or .env).\n - Use set_env_values to create or update the PostHog public token and host, using the appropriate environment variable naming convention for ${\n config.metadata.name\n }, which you'll find in example code. The tool will also ensure .gitignore coverage. Don't assume the presence of keys means the value is up to date. Write the correct value each time.\n - Reference these environment variables in the code files you create instead of hardcoding the public token and host.\n\nImportant: Use the detect_package_manager tool (from the wizard-tools MCP server) to determine which package manager the project uses. Do not manually search for lockfiles or config files. Always install packages as a background task. Don't await completion; proceed with other work immediately after starting the installation. You must read a file immediately before attempting to write it, even if you have previously read it; failure to do so will cause a tool failure.\n${runtimeOverrides}\n\n`;\n}\n"]}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Detect whether the project targets Cloudflare Workers.
3
+ *
4
+ * Checks for:
5
+ * 1. wrangler.toml / wrangler.jsonc / wrangler.json in project root
6
+ * 2. Cloudflare adapter packages in dependencies (@react-router/cloudflare,
7
+ * @astrojs/cloudflare, @sveltejs/adapter-cloudflare, etc.)
8
+ */
9
+ export declare function detectCloudflareTarget(installDir: string): Promise<boolean>;
10
+ /**
11
+ * Fetch the Cloudflare Workers reference from the skills server.
12
+ * Returns the markdown content, or null on failure.
13
+ */
14
+ export declare function fetchCloudflareReference(skillsBaseUrl: string): Promise<string | null>;
@@ -0,0 +1,74 @@
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.detectCloudflareTarget = detectCloudflareTarget;
7
+ exports.fetchCloudflareReference = fetchCloudflareReference;
8
+ const fast_glob_1 = __importDefault(require("fast-glob"));
9
+ const debug_1 = require("../utils/debug");
10
+ const setup_utils_1 = require("../utils/setup-utils");
11
+ const CLOUDFLARE_PACKAGES = [
12
+ '@react-router/cloudflare',
13
+ '@astrojs/cloudflare',
14
+ '@sveltejs/adapter-cloudflare',
15
+ '@sveltejs/adapter-cloudflare-workers',
16
+ '@cloudflare/workers-types',
17
+ 'wrangler',
18
+ ];
19
+ /**
20
+ * Detect whether the project targets Cloudflare Workers.
21
+ *
22
+ * Checks for:
23
+ * 1. wrangler.toml / wrangler.jsonc / wrangler.json in project root
24
+ * 2. Cloudflare adapter packages in dependencies (@react-router/cloudflare,
25
+ * @astrojs/cloudflare, @sveltejs/adapter-cloudflare, etc.)
26
+ */
27
+ async function detectCloudflareTarget(installDir) {
28
+ // Check for wrangler config files
29
+ const wranglerFiles = await (0, fast_glob_1.default)('wrangler.@(toml|jsonc|json)', {
30
+ cwd: installDir,
31
+ dot: true,
32
+ });
33
+ if (wranglerFiles.length > 0) {
34
+ (0, debug_1.logToFile)(`[cloudflare-detection] detected via wrangler config: ${wranglerFiles[0]}`);
35
+ return true;
36
+ }
37
+ // Check for Cloudflare adapter/platform packages in deps
38
+ const packageJson = await (0, setup_utils_1.tryGetPackageJson)({ installDir });
39
+ if (!packageJson)
40
+ return false;
41
+ const allDeps = {
42
+ ...packageJson.dependencies,
43
+ ...packageJson.devDependencies,
44
+ };
45
+ const cloudflarePackages = Object.keys(allDeps).filter((dep) => CLOUDFLARE_PACKAGES.includes(dep));
46
+ if (cloudflarePackages.length > 0) {
47
+ (0, debug_1.logToFile)(`[cloudflare-detection] detected via packages: ${cloudflarePackages.join(', ')}`);
48
+ return true;
49
+ }
50
+ return false;
51
+ }
52
+ /**
53
+ * Fetch the Cloudflare Workers reference from the skills server.
54
+ * Returns the markdown content, or null on failure.
55
+ */
56
+ async function fetchCloudflareReference(skillsBaseUrl) {
57
+ try {
58
+ const url = `${skillsBaseUrl}/cloudflare-workers.md`;
59
+ (0, debug_1.logToFile)(`[cloudflare-detection] fetching reference from ${url}`);
60
+ const resp = await fetch(url);
61
+ if (resp.ok) {
62
+ const text = await resp.text();
63
+ (0, debug_1.logToFile)(`[cloudflare-detection] loaded reference (${text.length} chars)`);
64
+ return text;
65
+ }
66
+ (0, debug_1.logToFile)(`[cloudflare-detection] reference fetch failed: HTTP ${resp.status}`);
67
+ return null;
68
+ }
69
+ catch (err) {
70
+ (0, debug_1.logToFile)(`[cloudflare-detection] reference fetch error: ${err.message}`);
71
+ return null;
72
+ }
73
+ }
74
+ //# sourceMappingURL=cloudflare-detection.js.map