@posthog/wizard 2.13.1 → 2.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +0 -26
- package/README.md +1 -1
- package/dist/TextBlock-B3cm43YY.js +244 -0
- package/dist/TextBlock-B3cm43YY.js.map +1 -0
- package/dist/{add-mcp-server-to-clients-D1IyBa9u.js → add-mcp-server-to-clients-DVdyI6SQ.js} +7 -7
- package/dist/{add-mcp-server-to-clients-D1IyBa9u.js.map → add-mcp-server-to-clients-DVdyI6SQ.js.map} +1 -1
- package/dist/{agent-interface-D9DeIikl.js → agent-interface-BJoqBI04.js} +533 -255
- package/dist/agent-interface-BJoqBI04.js.map +1 -0
- package/dist/{agent-runner-B41-Iig3.js → agent-runner-oJ7Wyhl7.js} +102 -20
- package/dist/agent-runner-oJ7Wyhl7.js.map +1 -0
- package/dist/analytics-Cz_p0Xus.js +2 -0
- package/dist/{analytics-Cek5hIwm.js → analytics-kUCNQQJm.js} +2 -2
- package/dist/{analytics-Cek5hIwm.js.map → analytics-kUCNQQJm.js.map} +1 -1
- package/dist/bin.js +951 -141
- package/dist/bin.js.map +1 -1
- package/dist/{debug-B2BH87dh.js → debug-BH8HMBNX.js} +26 -21
- package/dist/debug-BH8HMBNX.js.map +1 -0
- package/dist/{debug-BNWsxaDm.js → debug-CgsJTJOO.js} +1 -1
- package/dist/{defaults-GbLPuHxj.js → defaults-DgKAzsD1.js} +1 -1
- package/dist/{defaults-GbLPuHxj.js.map → defaults-DgKAzsD1.js.map} +1 -1
- package/dist/{detection-BFl2AYV6.js → detection-DWNUEyek.js} +4 -4
- package/dist/detection-DWNUEyek.js.map +1 -0
- package/dist/{file-8iNrXHkG.js → file-BKbKreWF.js} +1 -1
- package/dist/{file-8iNrXHkG.js.map → file-BKbKreWF.js.map} +1 -1
- package/dist/{file-utils-DnTSiTJw.js → file-utils-DPmgn9Vm.js} +1 -1
- package/dist/{file-utils-DnTSiTJw.js.map → file-utils-DPmgn9Vm.js.map} +1 -1
- package/dist/{package-json-F_7oktsp.js → package-json-DZpnf6vU.js} +8 -10
- package/dist/package-json-DZpnf6vU.js.map +1 -0
- package/dist/package-json-_4PEss19.js +2 -0
- package/dist/{package-manager-BBTvHn9i.js → package-manager-DmDoOiaW.js} +2 -2
- package/dist/{package-manager-BBTvHn9i.js.map → package-manager-DmDoOiaW.js.map} +1 -1
- package/dist/{posthog-vm0k9PKS.js → posthog-BbQf_Hzq.js} +1 -1
- package/dist/{posthog-vm0k9PKS.js.map → posthog-BbQf_Hzq.js.map} +1 -1
- package/dist/posthog-integration-DZgP-ysj.js +1012 -0
- package/dist/posthog-integration-DZgP-ysj.js.map +1 -0
- package/dist/{provisioning-DRwH4skH.js → provisioning-Buqple4U.js} +3 -3
- package/dist/{provisioning-DRwH4skH.js.map → provisioning-Buqple4U.js.map} +1 -1
- package/dist/provisioning-CAf6fMWM.js +2 -0
- package/dist/{registry-CZjMhhsK.js → registry-PGYX7928.js} +5 -5
- package/dist/{registry-CZjMhhsK.js.map → registry-PGYX7928.js.map} +1 -1
- package/dist/setup-utils-LGtFkuI1.js +2 -0
- package/dist/{setup-utils-DGUR4Djo.js → setup-utils-xt6Z8gik.js} +77 -107
- package/dist/setup-utils-xt6Z8gik.js.map +1 -0
- package/dist/{AuditChecksViewer-CjBCZjxG.js → slides-0xga1duy.js} +626 -1058
- package/dist/slides-0xga1duy.js.map +1 -0
- package/dist/smoke-test-ci.sh +4 -4
- package/dist/{start-playground-DPYl5WR-.js → start-playground-DYElnFW1.js} +259 -10
- package/dist/start-playground-DYElnFW1.js.map +1 -0
- package/dist/{start-tui-Cj_4BhK8.js → start-tui-BBhG-LSW.js} +288 -446
- package/dist/start-tui-BBhG-LSW.js.map +1 -0
- package/dist/{steps-BFD76-MP.js → steps-B9mb9qRe.js} +7 -7
- package/dist/{steps-BFD76-MP.js.map → steps-B9mb9qRe.js.map} +1 -1
- package/dist/{task-stream-CX7Uf6EM.js → task-stream-DUpUZmFQ.js} +8 -8
- package/dist/task-stream-DUpUZmFQ.js.map +1 -0
- package/dist/telemetry-BFwKBgCJ.js +13 -0
- package/dist/telemetry-BFwKBgCJ.js.map +1 -0
- package/dist/{wizard-abort-54DpTnUi.js → wizard-abort-DWwOHzHR.js} +3 -3
- package/dist/{wizard-abort-54DpTnUi.js.map → wizard-abort-DWwOHzHR.js.map} +1 -1
- package/dist/{wizard-abort-CZH03nD0.js → wizard-abort-Djz2J6p9.js} +1 -1
- package/dist/wizard-session-CPhhll4P.js +2 -0
- package/dist/{wizard-session-BcNJTl2I.js → wizard-session-CsI33S4_.js} +6 -3
- package/dist/wizard-session-CsI33S4_.js.map +1 -0
- package/dist/wizard-ui-YdGFRyu_.js.map +1 -1
- package/package.json +3 -2
- package/dist/AuditChecksViewer-CjBCZjxG.js.map +0 -1
- package/dist/agent-interface-D9DeIikl.js.map +0 -1
- package/dist/agent-runner-B41-Iig3.js.map +0 -1
- package/dist/analytics-CpbY05Lf.js +0 -2
- package/dist/debug-B2BH87dh.js.map +0 -1
- package/dist/detection-BFl2AYV6.js.map +0 -1
- package/dist/package-json-BzVey4Bd.js +0 -2
- package/dist/package-json-F_7oktsp.js.map +0 -1
- package/dist/posthog-integration-vFBuSN5U.js +0 -259
- package/dist/posthog-integration-vFBuSN5U.js.map +0 -1
- package/dist/provisioning--RCv39tI.js +0 -2
- package/dist/router-COhhuIW3.js +0 -135
- package/dist/router-COhhuIW3.js.map +0 -1
- package/dist/setup-utils-DGUR4Djo.js.map +0 -1
- package/dist/setup-utils-eh1450iu.js +0 -2
- package/dist/start-playground-DPYl5WR-.js.map +0 -1
- package/dist/start-tui-Cj_4BhK8.js.map +0 -1
- package/dist/task-stream-CX7Uf6EM.js.map +0 -1
- package/dist/telemetry-DCyjsXhw.js +0 -13
- package/dist/telemetry-DCyjsXhw.js.map +0 -1
- package/dist/wizard-session-BQC9vy9Z.js +0 -2
- package/dist/wizard-session-BcNJTl2I.js.map +0 -1
- package/npm-shrinkwrap.json +0 -2931
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","names":["baseConfig"],"sources":["../src/utils/environment.ts","../src/lib/workflows/revenue-analytics/detect.ts","../src/lib/workflows/revenue-analytics/steps.ts","../src/lib/workflows/revenue-analytics/index.ts","../src/lib/workflows/agent-skill/steps.ts","../src/lib/workflows/agent-skill/index.ts","../src/lib/workflows/audit/detect.ts","../src/lib/workflows/audit/seed.ts","../src/lib/workflows/audit/index.ts","../src/lib/workflows/audit-3000/index.ts","../src/lib/workflows/posthog-doctor/steps.ts","../src/lib/workflows/posthog-doctor/types.ts","../src/lib/workflows/posthog-doctor/fetch.ts","../src/lib/workflows/posthog-doctor/kind-metadata.ts","../src/lib/workflows/posthog-doctor/index.ts","../src/lib/workflows/workflow-registry.ts","../bin.ts"],"sourcesContent":["import readEnvModule from 'read-env';\n\nconst readEnv =\n typeof readEnvModule === 'function'\n ? readEnvModule\n : (readEnvModule as any).default;\nimport { tryGetPackageJson } from './setup-utils';\nimport type { WizardOptions } from './types';\nimport fg from 'fast-glob';\nimport { IS_DEV } from '../lib/constants';\n\nexport function isNonInteractiveEnvironment(): boolean {\n if (IS_DEV) {\n return false;\n }\n\n if (!process.stdout.isTTY || !process.stderr.isTTY) {\n return true;\n }\n\n return false;\n}\n\nexport function readEnvironment(): Record<string, unknown> {\n const result = readEnv('POSTHOG_WIZARD');\n\n return result;\n}\n\nexport async function detectEnvVarPrefix(\n options: WizardOptions,\n): Promise<string> {\n const packageJson = await tryGetPackageJson(options);\n if (!packageJson) return 'VITE_PUBLIC_';\n\n const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };\n const has = (name: string) => name in deps;\n const hasAnyFile = async (patterns: string[]) => {\n const matches = await fg(patterns, {\n cwd: options.installDir,\n absolute: false,\n onlyFiles: true,\n ignore: ['**/node_modules/**'],\n });\n return matches.length > 0;\n };\n\n // --- Next.js\n if (has('next') || (await hasAnyFile(['**/next.config.{js,ts,mjs,cjs}']))) {\n return 'NEXT_PUBLIC_';\n }\n\n // --- Create React App\n if (\n has('react-scripts') ||\n has('create-react-app') ||\n (await hasAnyFile(['**/config-overrides.js']))\n ) {\n return 'REACT_APP_';\n }\n\n // --- Vite (vanilla, TanStack, Solid, etc.)\n // Note: Vite does not need PUBLIC_ but we use it to follow the docs, to improve the chances of an LLM getting it right.\n if (has('vite') || (await hasAnyFile(['**/vite.config.{js,ts,mjs,cjs}']))) {\n return 'VITE_PUBLIC_';\n }\n\n // --- SvelteKit\n if (\n has('@sveltejs/kit') ||\n (await hasAnyFile(['**/svelte.config.{js,ts}']))\n ) {\n return 'PUBLIC_';\n }\n\n // --- TanStack Start (uses Vite)\n if (\n has('@tanstack/start') ||\n (await hasAnyFile(['**/tanstack.config.{js,ts}']))\n ) {\n return 'VITE_PUBLIC_';\n }\n\n // --- SolidStart (uses Vite)\n if (has('solid-start') || (await hasAnyFile(['**/solid.config.{js,ts}']))) {\n return 'VITE_PUBLIC_';\n }\n\n // --- Astro\n if (has('astro') || (await hasAnyFile(['**/astro.config.{js,ts,mjs}']))) {\n return 'PUBLIC_';\n }\n\n // We default to Vite if we can't detect a specific framework, since it's the most commonly used.\n return 'VITE_PUBLIC_';\n}\n","/**\n * Revenue analytics prerequisite detection.\n *\n * Scans the project for PostHog + Stripe SDKs and writes results\n * into frameworkContext for the intro screen to render.\n */\n\nimport type { Dirent } from 'fs';\nimport { readFileSync, readdirSync, existsSync, statSync } from 'fs';\nimport { join, relative } from 'path';\nimport { IGNORED_DIRS } from '../../../utils/file-utils.js';\nimport type { WizardSession } from '../../wizard-session.js';\nimport type { AbortCase } from '../../agent/agent-runner.js';\n\nexport const POSTHOG_SDKS = [\n 'posthog-js',\n 'posthog-node',\n 'posthog-react-native',\n 'posthog-android',\n 'posthog-ios',\n];\n\nexport const STRIPE_SDKS = [\n 'stripe',\n '@stripe/stripe-js',\n '@stripe/react-stripe-js',\n];\n\ninterface PackageMatch {\n /** Path to the package.json relative to installDir */\n path: string;\n posthogSdks: string[];\n stripeSdks: string[];\n}\n\n/**\n * Structured detection errors. The screen renders each kind into JSX\n * with proper formatting — keeps error data separate from presentation.\n */\nexport type RevenueDetectError =\n | {\n kind: 'bad-directory';\n path: string;\n reason: 'missing' | 'not-dir' | 'unreadable';\n }\n | { kind: 'no-package-json' }\n | { kind: 'no-sdks'; scannedCount: number }\n | { kind: 'missing-posthog'; foundStripe: string[] }\n | { kind: 'missing-stripe'; foundPosthog: string[] };\n\n/** `[ABORT] <reason>` cases the revenue analytics skill can emit. */\nexport const REVENUE_ABORT_CASES: AbortCase[] = [\n {\n // Skill emits: [ABORT] Could not find a PostHog distinct_id\n match: /^could not find a posthog distinct_id$/i,\n message: 'Could not find a PostHog distinct_id',\n body:\n 'The agent could not find PostHog distinct_id usage in your codebase. ' +\n 'Your users must be identified in PostHog before they can be tagged in Stripe. ' +\n 'Please identify your users and try again.',\n docsUrl: 'https://posthog.com/docs/product-analytics/identify',\n },\n {\n // Skill emits: [ABORT] Could not find a Stripe integration\n match: /^could not find a stripe integration$/i,\n message: 'Could not find a Stripe integration',\n body:\n 'The Wizard could not find an existing Stripe customer, charge, ' +\n 'subscription, or other Stripe operations. Please run the Revenue ' +\n 'Analytics Wizard on a project with an existing Stripe integration.',\n docsUrl: 'https://posthog.com/docs/revenue-analytics',\n },\n];\n\n/**\n * Recursively find all package.json files under installDir (max depth 3),\n * skipping common ignored directories. Returns matches with detected SDKs.\n */\nfunction findPackageJsons(installDir: string, maxDepth = 3): PackageMatch[] {\n const matches: PackageMatch[] = [];\n\n function scan(dir: string, depth: number): void {\n if (depth > maxDepth) return;\n\n let entries: Dirent[];\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (entry.name.startsWith('.') && entry.name !== '.') continue;\n if (IGNORED_DIRS.has(entry.name)) continue;\n\n const fullPath = join(dir, entry.name);\n\n if (entry.isFile() && entry.name === 'package.json') {\n try {\n const pkg = JSON.parse(readFileSync(fullPath, 'utf-8')) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const depNames = [\n ...Object.keys(pkg.dependencies ?? {}),\n ...Object.keys(pkg.devDependencies ?? {}),\n ];\n const posthogSdks = depNames.filter((d) => POSTHOG_SDKS.includes(d));\n const stripeSdks = depNames.filter((d) => STRIPE_SDKS.includes(d));\n matches.push({\n path: relative(installDir, fullPath) || 'package.json',\n posthogSdks,\n stripeSdks,\n });\n } catch {\n // Skip malformed package.json\n }\n } else if (entry.isDirectory()) {\n scan(fullPath, depth + 1);\n }\n }\n }\n\n scan(installDir, 0);\n return matches;\n}\n\n/**\n * Scan `session.installDir` for PostHog + Stripe SDKs. Writes detection\n * results into frameworkContext via the callback — either the detected\n * SDK lists (for the intro screen) or a `RevenueDetectError` on failure.\n *\n * The skill install happens later in the bootstrap runner, not here.\n */\nexport function detectRevenuePrerequisites(\n session: WizardSession,\n setFrameworkContext: (key: string, value: unknown) => void,\n): void {\n const fail = (error: RevenueDetectError) =>\n setFrameworkContext('detectError', error);\n\n const installDir = session.installDir;\n\n // Verify the install directory exists and is readable\n if (!existsSync(installDir)) {\n fail({ kind: 'bad-directory', path: installDir, reason: 'missing' });\n return;\n }\n try {\n if (!statSync(installDir).isDirectory()) {\n fail({ kind: 'bad-directory', path: installDir, reason: 'not-dir' });\n return;\n }\n } catch {\n fail({ kind: 'bad-directory', path: installDir, reason: 'unreadable' });\n return;\n }\n\n // Find all package.json files (root + monorepo subpackages)\n const matches = findPackageJsons(installDir);\n\n if (matches.length === 0) {\n fail({ kind: 'no-package-json' });\n return;\n }\n\n // Aggregate detected SDKs across all package.json files\n const allPosthogSdks = new Set<string>();\n const allStripeSdks = new Set<string>();\n for (const match of matches) {\n for (const sdk of match.posthogSdks) allPosthogSdks.add(sdk);\n for (const sdk of match.stripeSdks) allStripeSdks.add(sdk);\n }\n\n const detectedPosthogSdks = [...allPosthogSdks];\n const detectedStripeSdks = [...allStripeSdks];\n\n if (detectedPosthogSdks.length === 0 && detectedStripeSdks.length === 0) {\n fail({ kind: 'no-sdks', scannedCount: matches.length });\n return;\n }\n\n if (detectedPosthogSdks.length === 0) {\n fail({ kind: 'missing-posthog', foundStripe: detectedStripeSdks });\n return;\n }\n\n if (detectedStripeSdks.length === 0) {\n fail({ kind: 'missing-stripe', foundPosthog: detectedPosthogSdks });\n return;\n }\n\n setFrameworkContext('detectedPosthogSdks', detectedPosthogSdks);\n setFrameworkContext('detectedStripeSdks', detectedStripeSdks);\n setFrameworkContext(\n 'detectedPackagePaths',\n matches\n .filter((m) => m.posthogSdks.length > 0 || m.stripeSdks.length > 0)\n .map((m) => m.path),\n );\n}\n","/**\n * Revenue analytics workflow step list.\n *\n * The detect step checks for PostHog + Stripe SDKs. The skill install\n * and agent run live in the workflow runner (see agent-runner.ts).\n */\n\nimport type { Workflow } from '../workflow-step.js';\nimport { RunPhase } from '../../wizard-session.js';\nimport { detectRevenuePrerequisites } from './detect.js';\n\nexport const REVENUE_ANALYTICS_WORKFLOW: Workflow = [\n {\n id: 'detect',\n label: 'Detecting prerequisites',\n // Headless step: no screen, no gate. onReady fires after bin.ts\n // assigns the session — the hook scans for PostHog + Stripe SDKs\n // and writes the results (or a detectError) to frameworkContext\n // for the intro screen to render.\n onReady: (ctx) =>\n detectRevenuePrerequisites(ctx.session, ctx.setFrameworkContext),\n },\n {\n id: 'intro',\n label: 'Welcome',\n screen: 'revenue-intro',\n gate: (session) => session.setupConfirmed,\n },\n {\n id: 'auth',\n label: 'Authentication',\n screen: 'auth',\n isComplete: (session) => session.credentials !== null,\n },\n {\n id: 'run',\n label: 'Revenue analytics',\n screen: 'run',\n isComplete: (session) =>\n session.runPhase === RunPhase.Completed ||\n session.runPhase === RunPhase.Error,\n },\n {\n id: 'outro',\n label: 'Done',\n screen: 'outro',\n isComplete: (session) => session.outroDismissed,\n },\n {\n id: 'skills',\n label: 'Skills',\n screen: 'keep-skills',\n },\n];\n","import type { WorkflowConfig } from '../workflow-step.js';\nimport { REVENUE_ANALYTICS_WORKFLOW } from './steps.js';\nimport { REVENUE_ABORT_CASES } from './detect.js';\n\nexport const revenueAnalyticsConfig: WorkflowConfig = {\n command: 'revenue',\n description: 'Set up PostHog revenue analytics (e.g. Stripe integration)',\n flowKey: 'revenue-analytics-setup',\n steps: REVENUE_ANALYTICS_WORKFLOW,\n run: {\n skillId: 'revenue-analytics-setup',\n integrationLabel: 'revenue-analytics-setup',\n customPrompt: () => 'Set up revenue analytics for this project.',\n successMessage: 'Revenue analytics configured!',\n reportFile: 'posthog-revenue-report.md',\n docsUrl: 'https://posthog.com/docs/revenue-analytics',\n spinnerMessage: 'Setting up revenue analytics...',\n estimatedDurationMinutes: 5,\n abortCases: REVENUE_ABORT_CASES,\n },\n requires: ['posthog-integration'],\n};\n\nexport { REVENUE_ANALYTICS_WORKFLOW } from './steps.js';\nexport {\n detectRevenuePrerequisites,\n POSTHOG_SDKS,\n STRIPE_SDKS,\n type RevenueDetectError,\n} from './detect.js';\n","/**\n * Generic agent skill step list.\n *\n * Minimal flow: auth → run → outro → skills.\n * No detection, no setup, no MCP.\n */\n\nimport type { Workflow } from '../workflow-step.js';\nimport { RunPhase } from '../../wizard-session.js';\n\nexport const AGENT_SKILL_STEPS: Workflow = [\n {\n id: 'intro',\n label: 'Welcome',\n screen: 'agent-skill-intro',\n gate: (session) => session.setupConfirmed,\n },\n {\n id: 'auth',\n label: 'Authentication',\n screen: 'auth',\n isComplete: (session) => session.credentials !== null,\n },\n {\n id: 'run',\n label: 'Running',\n screen: 'run',\n isComplete: (session) =>\n session.runPhase === RunPhase.Completed ||\n session.runPhase === RunPhase.Error,\n },\n {\n id: 'outro',\n label: 'Done',\n screen: 'outro',\n isComplete: (session) => session.outroDismissed,\n },\n {\n id: 'skills',\n label: 'Skills',\n screen: 'keep-skills',\n },\n];\n","/**\n * Generic agent skill workflow factory.\n *\n * Creates a WorkflowConfig for any context-mill skill. Provide a\n * skill ID and basic UI config — the factory handles the rest.\n *\n * Usage:\n * createSkillWorkflow({\n * skillId: 'error-tracking-setup',\n * command: 'errors',\n * flowKey: 'error-tracking',\n * description: 'Set up PostHog error tracking',\n * integrationLabel: 'error-tracking',\n * successMessage: 'Error tracking configured!',\n * reportFile: 'posthog-error-tracking-report.md',\n * docsUrl: 'https://posthog.com/docs/error-tracking',\n * spinnerMessage: 'Setting up error tracking...',\n * estimatedDurationMinutes: 5,\n * })\n */\n\nimport type { WorkflowConfig } from '../workflow-step.js';\nimport type { WorkflowRun, AbortCase } from '../../agent/agent-runner.js';\nimport { AGENT_SKILL_STEPS } from './steps.js';\n\nexport interface SkillWorkflowOptions {\n /** Context-mill skill ID to install */\n skillId: string;\n /** CLI subcommand name */\n command: string;\n /** Unique flow key — must match a Flow enum entry */\n flowKey: string;\n /** CLI description shown in --help */\n description: string;\n /** Analytics integration label */\n integrationLabel: string;\n /** Custom prompt instruction. Appended after default project prompt. */\n customPrompt?: string;\n successMessage: string;\n reportFile: string;\n docsUrl: string;\n spinnerMessage: string;\n estimatedDurationMinutes: number;\n /** Other workflow flowKeys that must be satisfied first */\n requires?: string[];\n /** Override the default outro. Receives the same args as WorkflowRun.buildOutroData. */\n buildOutroData?: WorkflowRun['buildOutroData'];\n /** Known `[ABORT] <reason>` cases the skill can emit. */\n abortCases?: AbortCase[];\n}\n\nexport function createSkillWorkflow(\n opts: SkillWorkflowOptions,\n): WorkflowConfig {\n return {\n command: opts.command,\n description: opts.description,\n flowKey: opts.flowKey,\n steps: AGENT_SKILL_STEPS,\n reportFile: opts.reportFile,\n run: {\n skillId: opts.skillId,\n integrationLabel: opts.integrationLabel,\n customPrompt: opts.customPrompt ? () => opts.customPrompt! : undefined,\n successMessage: opts.successMessage,\n reportFile: opts.reportFile,\n docsUrl: opts.docsUrl,\n spinnerMessage: opts.spinnerMessage,\n estimatedDurationMinutes: opts.estimatedDurationMinutes,\n buildOutroData: opts.buildOutroData,\n abortCases: opts.abortCases,\n },\n requires: opts.requires,\n };\n}\n\nexport { AGENT_SKILL_STEPS } from './steps.js';\n","import type { AbortCase } from '../../agent/agent-runner.js';\n\n/** `[ABORT] <reason>` cases the audit skill can emit. Reason strings are\n * defined in the skill's `Abort statuses` section. */\nexport const AUDIT_ABORT_CASES: AbortCase[] = [\n {\n match: /^no posthog sdk found$/i,\n message: 'No PostHog SDK found',\n body:\n 'The audit needs an existing PostHog integration to review. No PostHog ' +\n 'SDK appears in this project’s dependency manifests. Run the basic ' +\n 'integration workflow to install PostHog first, then re-run the audit.',\n docsUrl: 'https://posthog.com/docs/getting-started/install',\n },\n];\n","import fs from 'fs';\nimport path from 'path';\nimport { logToFile } from '../../../utils/debug';\nimport { AUDIT_CHECKS_FILE, type AuditCheck } from './types.js';\n\n/** The 10 data-integrity checks the audit runs. */\nexport const AUDIT_SEED_CHECKS: AuditCheck[] = [\n {\n id: 'sdk-installed',\n area: 'Installation',\n label: 'PostHog SDK installed',\n status: 'pending',\n },\n {\n id: 'sdk-up-to-date',\n area: 'Installation',\n label: 'SDK version up to date',\n status: 'pending',\n },\n {\n id: 'init-correct',\n area: 'Installation',\n label: 'Initialization is correct',\n status: 'pending',\n },\n {\n id: 'identify-stable-distinct-id',\n area: 'Identification',\n label: 'Stable distinct_id (not session UUID)',\n status: 'pending',\n },\n {\n id: 'identify-not-late',\n area: 'Identification',\n label: 'identify() called before captures / flag evals',\n status: 'pending',\n },\n {\n id: 'cross-runtime-distinct-id',\n area: 'Identification',\n label: 'Same distinct_id across client and server',\n status: 'pending',\n },\n {\n id: 'identify-reset-on-logout',\n area: 'Identification',\n label: 'reset() called on logout / account switch',\n status: 'pending',\n },\n {\n id: 'capture-event-names-static',\n area: 'Event Capture',\n label: 'Event names are static and consistent',\n status: 'pending',\n },\n {\n id: 'capture-uses-proxy',\n area: 'Event Capture',\n label: 'Captures route through a reverse proxy',\n status: 'pending',\n },\n {\n id: 'capture-growth-events',\n area: 'Event Capture',\n label: 'Key activation events captured',\n status: 'pending',\n },\n];\n\n/** Atomically write the seeded ledger to the project's audit checks file. */\nexport function seedAuditLedger(installDir: string): void {\n const target = path.join(installDir, AUDIT_CHECKS_FILE);\n const tmp = `${target}.tmp`;\n fs.writeFileSync(tmp, JSON.stringify(AUDIT_SEED_CHECKS, null, 2), 'utf8');\n fs.renameSync(tmp, target);\n logToFile(\n `seedAuditLedger: wrote ${AUDIT_SEED_CHECKS.length} entries to ${target}`,\n );\n}\n","import {\n AGENT_SKILL_STEPS,\n createSkillWorkflow,\n} from '../agent-skill/index.js';\nimport type { Workflow, WorkflowConfig } from '../workflow-step.js';\nimport type { WorkflowRun } from '../../agent/agent-runner.js';\nimport type { WizardSession } from '../../wizard-session.js';\nimport { AUDIT_ABORT_CASES } from './detect.js';\nimport { AUDIT_CHECKS_KEY, AUDIT_REPORT_FILE } from './types.js';\nimport { AUDIT_SEED_CHECKS, seedAuditLedger } from './seed.js';\n\n/** Audit-specific screens for the shared agent-skill pipeline. */\nconst AUDIT_SCREEN_BY_STEP: Record<string, string> = {\n intro: 'audit-intro',\n run: 'audit-run',\n outro: 'audit-outro',\n};\n\nconst seedBeforeAuditRun = (session: WizardSession): void => {\n seedAuditLedger(session.installDir);\n session.frameworkContext[AUDIT_CHECKS_KEY] = AUDIT_SEED_CHECKS;\n};\n\nconst withAuditScreens = (steps: Workflow): Workflow =>\n steps.map((step) => {\n const override = AUDIT_SCREEN_BY_STEP[step.id];\n return override ? { ...step, screen: override } : step;\n });\n\nconst auditSteps: Workflow = withAuditScreens(AGENT_SKILL_STEPS);\n\nconst baseConfig = createSkillWorkflow({\n skillId: 'audit',\n command: 'audit',\n flowKey: 'audit',\n description:\n 'Audit an existing PostHog integration for correctness and best practices',\n integrationLabel: 'audit',\n customPrompt:\n 'Run a comprehensive audit of the existing PostHog integration. Follow the skill workflow steps in order. Do not modify any project files — only create the final audit report.',\n successMessage:\n 'Audit complete! You can view the audit report at ./posthog-audit-report.md',\n reportFile: AUDIT_REPORT_FILE,\n docsUrl: 'https://posthog.com/docs/product-analytics/best-practices',\n spinnerMessage: 'Auditing PostHog integration...',\n estimatedDurationMinutes: 5,\n requires: ['posthog-integration'],\n abortCases: AUDIT_ABORT_CASES,\n});\n\nconst auditRun = async (session: WizardSession): Promise<WorkflowRun> => {\n seedBeforeAuditRun(session);\n\n if (!baseConfig.run) {\n throw new Error('Audit workflow has no run configuration.');\n }\n\n return typeof baseConfig.run === 'function'\n ? baseConfig.run(session)\n : baseConfig.run;\n};\n\nexport const auditConfig: WorkflowConfig = {\n ...baseConfig,\n steps: auditSteps,\n run: auditRun,\n};\n","import fs from 'fs';\nimport path from 'path';\nimport {\n AGENT_SKILL_STEPS,\n createSkillWorkflow,\n} from '../agent-skill/index.js';\nimport type { Workflow, WorkflowConfig } from '../workflow-step.js';\nimport type { WorkflowRun } from '../../agent/agent-runner.js';\nimport type { WizardSession } from '../../wizard-session.js';\nimport { AUDIT_ABORT_CASES } from '../audit/detect.js';\nimport {\n AUDIT_CHECKS_FILE,\n AUDIT_CHECKS_KEY,\n type AuditCheck,\n} from '../audit/types.js';\nimport { AUDIT_SEED_CHECKS } from '../audit/seed.js';\nimport { logToFile } from '../../../utils/debug';\n\nconst AUDIT3000_REPORT_FILE = 'posthog-audit-3000-report.md';\n\n// Extra checks the v3000 audit adds on top of the base 10. IDs must match\n// those referenced in the audit-3000 skill's step files (Event Quality,\n// stale feature-flag review, session replay [fix + optimize], per-product\n// use-case expansion, and phase markers for the post-flags chain).\nconst AUDIT3000_EXTRA_CHECKS: AuditCheck[] = [\n // ── Event Quality (Step 5) ──\n {\n id: 'event-naming-standardization',\n area: 'Event Quality',\n label: 'Event naming convention is consistent',\n status: 'pending',\n },\n {\n id: 'event-duplicates-and-bloat',\n area: 'Event Quality',\n label: 'No duplicate or bloated event capture',\n status: 'pending',\n },\n {\n id: 'event-quality-context-review',\n area: 'Event Quality',\n label: 'Event property context reviewed',\n status: 'pending',\n },\n {\n id: 'event-usage-coverage',\n area: 'Event Quality',\n label: 'Captured events match insights / dashboards usage',\n status: 'pending',\n },\n // ── Feature Flags (Step 6) ──\n {\n id: 'stale-feature-flags-reviewed',\n area: 'Feature Flags',\n label: 'Stale feature flags reviewed',\n status: 'pending',\n },\n // ── Session Replay — fix (Step 6b) ──\n {\n id: 'replay-minimum-duration-set',\n area: 'Session Replay',\n label: 'Minimum duration set on init',\n status: 'pending',\n },\n {\n id: 'replay-mask-config',\n area: 'Session Replay',\n label: 'Mask config covers sensitive surfaces',\n status: 'pending',\n },\n {\n id: 'replay-disabled-in-test-envs',\n area: 'Session Replay',\n label: 'Disabled in test / CI environments',\n status: 'pending',\n },\n {\n id: 'replay-strict-minimum-duration',\n area: 'Session Replay',\n label: 'Strict minimum duration enforced',\n status: 'pending',\n },\n // ── Session Replay — optimize (Step 6b cost wave) ──\n {\n id: 'replay-sampling-rate',\n area: 'Session Replay — Optimize',\n label: 'Sampling rate tuned for cost',\n status: 'pending',\n },\n {\n id: 'replay-triggers-configured',\n area: 'Session Replay — Optimize',\n label: 'Triggers configured (event / URL / flag)',\n status: 'pending',\n },\n {\n id: 'replay-network-recording-filtered',\n area: 'Session Replay — Optimize',\n label: 'Network recording filtered',\n status: 'pending',\n },\n {\n id: 'replay-mobile-sampling',\n area: 'Session Replay — Optimize',\n label: 'Mobile sampling configured',\n status: 'pending',\n },\n // ── Use Case: Expansion (Step 9) ──\n {\n id: 'expansion-product-analytics',\n area: 'Use Case: Expansion',\n label: 'Product analytics coverage',\n status: 'pending',\n },\n {\n id: 'expansion-error-tracking',\n area: 'Use Case: Expansion',\n label: 'Error tracking coverage',\n status: 'pending',\n },\n {\n id: 'expansion-llm-observability',\n area: 'Use Case: Expansion',\n label: 'LLM observability coverage',\n status: 'pending',\n },\n {\n id: 'expansion-session-replay',\n area: 'Use Case: Expansion',\n label: 'Session replay coverage',\n status: 'pending',\n },\n {\n id: 'expansion-feature-flags',\n area: 'Use Case: Expansion',\n label: 'Feature flags coverage',\n status: 'pending',\n },\n {\n id: 'expansion-surveys',\n area: 'Use Case: Expansion',\n label: 'Surveys coverage',\n status: 'pending',\n },\n {\n id: 'expansion-logs',\n area: 'Use Case: Expansion',\n label: 'Logs coverage',\n status: 'pending',\n },\n {\n id: 'expansion-web-analytics',\n area: 'Use Case: Expansion',\n label: 'Web analytics coverage',\n status: 'pending',\n },\n // ── Additional Sections (Steps 7, 8, 10 phase markers) ──\n // Tracked in the ledger so the UI can surface \"did it run / was it\n // skipped\" alongside the regular checks. use-case-expansion is omitted\n // because the eight `expansion-*` checks above cover that phase.\n {\n id: 'customer-enrichment',\n area: 'Additional Sections',\n label: 'Customer enrichment (Harmonic + PDL)',\n status: 'pending',\n },\n {\n id: 'use-case-match',\n area: 'Additional Sections',\n label: 'Use-case match',\n status: 'pending',\n },\n {\n id: 'final-report',\n area: 'Additional Sections',\n label: 'Final audit report written',\n status: 'pending',\n },\n];\n\nconst AUDIT3000_SEED_CHECKS: AuditCheck[] = [\n ...AUDIT_SEED_CHECKS,\n ...AUDIT3000_EXTRA_CHECKS,\n];\n\n// Audit-3000 has its own arcade-flavoured intro / run / outro screens. The\n// shared audit screens stay reserved for the original `audit` workflow.\nconst AUDIT3000_SCREEN_BY_STEP: Record<string, string> = {\n intro: 'audit-3000-intro',\n run: 'audit-3000-run',\n outro: 'audit-3000-outro',\n};\n\nconst seedAudit3000Ledger = (installDir: string): void => {\n const target = path.join(installDir, AUDIT_CHECKS_FILE);\n const tmp = `${target}.tmp`;\n fs.writeFileSync(tmp, JSON.stringify(AUDIT3000_SEED_CHECKS, null, 2), 'utf8');\n fs.renameSync(tmp, target);\n logToFile(\n `seedAudit3000Ledger: wrote ${AUDIT3000_SEED_CHECKS.length} entries to ${target}`,\n );\n};\n\nconst seedBeforeAudit3000Run = (session: WizardSession): void => {\n seedAudit3000Ledger(session.installDir);\n session.frameworkContext[AUDIT_CHECKS_KEY] = AUDIT3000_SEED_CHECKS;\n};\n\nconst withAudit3000Screens = (steps: Workflow): Workflow =>\n steps.map((step) => {\n const override = AUDIT3000_SCREEN_BY_STEP[step.id];\n return override ? { ...step, screen: override } : step;\n });\n\nconst audit3000Steps: Workflow = withAudit3000Screens(AGENT_SKILL_STEPS);\n\nconst baseConfig = createSkillWorkflow({\n skillId: 'audit-3000',\n command: 'audit-3000',\n flowKey: 'audit-3000',\n description:\n 'Audit an existing PostHog integration (v3000 — adds event quality, stale-flag hygiene, customer enrichment, use-case match)',\n integrationLabel: 'audit-3000',\n customPrompt:\n 'Run the audit-3000 skill end-to-end. Follow the step chain starting at references/1-version.md. Do not modify any project files — only create the final audit report and (when enrichment is enabled) the enrichment report.',\n successMessage: `Audit complete! View the report at ./${AUDIT3000_REPORT_FILE}`,\n reportFile: AUDIT3000_REPORT_FILE,\n docsUrl: 'https://posthog.com/docs/product-analytics/best-practices',\n spinnerMessage: 'Running PostHog Audit 3000...',\n estimatedDurationMinutes: 6,\n requires: ['posthog-integration'],\n abortCases: AUDIT_ABORT_CASES,\n});\n\nconst audit3000Run = async (session: WizardSession): Promise<WorkflowRun> => {\n seedBeforeAudit3000Run(session);\n\n if (!baseConfig.run) {\n throw new Error('audit-3000 workflow has no run configuration.');\n }\n\n return typeof baseConfig.run === 'function'\n ? baseConfig.run(session)\n : baseConfig.run;\n};\n\nexport const audit3000Config: WorkflowConfig = {\n ...baseConfig,\n steps: audit3000Steps,\n run: audit3000Run,\n};\n","import type { Workflow } from '../workflow-step.js';\n\nexport const POSTHOG_DOCTOR_WORKFLOW: Workflow = [\n {\n id: 'intro',\n label: 'Welcome',\n screen: 'doctor-intro',\n gate: (session) => session.setupConfirmed,\n },\n {\n id: 'auth',\n label: 'Authentication',\n screen: 'auth',\n isComplete: (session) => session.credentials !== null,\n },\n {\n id: 'report',\n label: 'Doctor report',\n screen: 'doctor-report',\n isComplete: (session) => session.outroData !== null,\n },\n {\n id: 'outro',\n label: 'Done',\n screen: 'outro',\n isComplete: (session) => session.outroDismissed,\n },\n];\n","import { z } from 'zod';\n\nexport const HealthIssueSeveritySchema = z.enum([\n 'critical',\n 'warning',\n 'info',\n]);\nexport type HealthIssueSeverity = z.infer<typeof HealthIssueSeveritySchema>;\n\nexport const HealthIssueStatusSchema = z.enum(['active', 'resolved']);\n\nexport const HealthIssueSchema = z.object({\n id: z.string(),\n kind: z.string(),\n severity: HealthIssueSeveritySchema,\n status: HealthIssueStatusSchema,\n dismissed: z.boolean(),\n created_at: z.string(),\n updated_at: z.string(),\n resolved_at: z.string().nullable().optional(),\n});\nexport type HealthIssue = z.infer<typeof HealthIssueSchema>;\n\nexport const HealthIssueListResponseSchema = z.object({\n results: z.array(HealthIssueSchema),\n count: z.number().optional(),\n next: z.string().nullable().optional(),\n previous: z.string().nullable().optional(),\n});\nexport type HealthIssueListResponse = z.infer<\n typeof HealthIssueListResponseSchema\n>;\n\nexport interface HealthIssueSummary {\n total: number;\n by_severity: Record<HealthIssueSeverity, number>;\n}\n","import axios from 'axios';\nimport { analytics } from '../../../utils/analytics';\nimport { handleApiError } from '../../api';\nimport { WIZARD_USER_AGENT } from '../../constants';\nimport { HealthIssueListResponseSchema, type HealthIssue } from './types';\n\nexport async function fetchHealthIssues(\n accessToken: string,\n baseUrl: string,\n projectId: number,\n): Promise<HealthIssue[]> {\n const endpoint = `/api/environments/${projectId}/health_issues/`;\n const url = `${baseUrl}${endpoint}?status=active&dismissed=false&limit=250`;\n try {\n const response = await axios.get(url, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n });\n return HealthIssueListResponseSchema.parse(response.data).results;\n } catch (error) {\n const apiError = handleApiError(error, 'fetch health issues');\n analytics.captureException(apiError, { endpoint, baseUrl, projectId });\n throw apiError;\n }\n}\n","import { POSTHOG_DOCS_URL } from '../../constants';\n\nexport interface KindMeta {\n title: string;\n description: string;\n docsUrl: string;\n}\n\nexport const KIND_METADATA: Record<string, KindMeta> = {\n ingestion_lag: {\n title: 'Ingestion is delayed',\n description:\n 'Events are being received but are taking longer than usual to appear.',\n docsUrl: `${POSTHOG_DOCS_URL}/support/troubleshooting`,\n },\n ingestion_warning: {\n title: 'Ingestion warnings on recent events',\n description:\n 'Some recent events were rejected or flagged by the ingestion pipeline.',\n docsUrl: `${POSTHOG_DOCS_URL}/support/troubleshooting`,\n },\n sdk_outdated: {\n title: 'SDK version is out of date',\n description:\n 'One or more SDKs are running an old version. Upgrade to get the latest fixes.',\n docsUrl: `${POSTHOG_DOCS_URL}/libraries`,\n },\n no_live_events: {\n title: 'No $pageview or $screen events in the last 30 days',\n description:\n 'PostHog is not receiving page or screen events from this project.',\n docsUrl: `${POSTHOG_DOCS_URL}/getting-started/install`,\n },\n no_pageleave_events: {\n title: '$pageleave events not being sent',\n description:\n 'Enable pageleave tracking to power bounce rate and session duration.',\n docsUrl: `${POSTHOG_DOCS_URL}/libraries/js#config`,\n },\n scroll_depth: {\n title: 'Scroll depth tracking disabled',\n description:\n 'Turn on scroll depth to capture how far users read each page.',\n docsUrl: `${POSTHOG_DOCS_URL}/libraries/js#config`,\n },\n authorized_urls: {\n title: 'No authorized URLs configured',\n description:\n 'Some web analytics filters require at least one authorized URL to work.',\n docsUrl: `${POSTHOG_DOCS_URL}/web-analytics/faq`,\n },\n reverse_proxy: {\n title: 'No reverse proxy detected',\n description: 'A reverse proxy reduces data loss from ad blockers.',\n docsUrl: `${POSTHOG_DOCS_URL}/advanced/proxy`,\n },\n web_vitals: {\n title: 'Web Vitals tracking disabled',\n description:\n 'Enable Web Vitals to capture LCP, CLS and other performance metrics.',\n docsUrl: `${POSTHOG_DOCS_URL}/web-analytics/web-vitals`,\n },\n materialized_view_failure: {\n title: 'A materialized view is failing',\n description: 'A data modeling pipeline failed its most recent run.',\n docsUrl: `${POSTHOG_DOCS_URL}/data-warehouse`,\n },\n external_data_failure: {\n title: 'External data source is failing',\n description: 'An external data source sync failed and data may be stale.',\n docsUrl: `${POSTHOG_DOCS_URL}/data-warehouse/sources`,\n },\n};\n\nexport const UNKNOWN_KIND_META: KindMeta = {\n title: 'Unknown issue',\n description:\n 'PostHog reported an issue kind the wizard does not yet recognize.',\n docsUrl: POSTHOG_DOCS_URL,\n};\n\nexport function getKindMeta(kind: string): KindMeta {\n return KIND_METADATA[kind] ?? { ...UNKNOWN_KIND_META, title: kind };\n}\n","import type { WorkflowConfig } from '../workflow-step.js';\nimport { POSTHOG_DOCTOR_WORKFLOW } from './steps.js';\n\nexport const posthogDoctorConfig: WorkflowConfig = {\n command: 'doctor',\n description:\n 'Diagnose your PostHog project for configuration issues and setup warnings',\n flowKey: 'posthog-doctor',\n steps: POSTHOG_DOCTOR_WORKFLOW,\n};\n\nexport { POSTHOG_DOCTOR_WORKFLOW } from './steps.js';\nexport { fetchHealthIssues } from './fetch.js';\nexport { getKindMeta, KIND_METADATA } from './kind-metadata.js';\nexport type { KindMeta } from './kind-metadata.js';\nexport type {\n HealthIssue,\n HealthIssueSeverity,\n HealthIssueSummary,\n} from './types.js';\n","/**\n * Central registry of all wizard workflows.\n *\n * Adding a new workflow:\n * 1. Create src/lib/workflows/<name>/ with index.ts exporting a WorkflowConfig\n * 2. Import and add it to WORKFLOW_REGISTRY below\n * 3. Add a matching Flow enum entry in src/ui/tui/flows.ts\n * 4. (If custom intro screen) add to src/ui/tui/screen-registry.tsx\n *\n * flows.ts, store.ts, and bin.ts all derive their wiring from this array —\n * no need to touch those files when adding a workflow.\n */\n\nimport type { WorkflowConfig } from './workflow-step.js';\nimport { posthogIntegrationConfig } from './posthog-integration/index.js';\nimport { revenueAnalyticsConfig } from './revenue-analytics/index.js';\nimport { auditConfig } from './audit/index.js';\nimport { audit3000Config } from './audit-3000/index.js';\nimport { posthogDoctorConfig } from './posthog-doctor/index.js';\n\nexport const WORKFLOW_REGISTRY: WorkflowConfig[] = [\n posthogIntegrationConfig,\n revenueAnalyticsConfig,\n auditConfig,\n audit3000Config,\n posthogDoctorConfig,\n];\n\n/** Look up a workflow config by its flowKey. */\nexport function getWorkflowConfig(flowKey: string): WorkflowConfig | undefined {\n return WORKFLOW_REGISTRY.find((c) => c.flowKey === flowKey);\n}\n\n/** All workflow configs that are exposed as CLI subcommands. */\nexport function getSubcommandWorkflows(): WorkflowConfig[] {\n return WORKFLOW_REGISTRY.filter((c) => c.command != null);\n}\n","#!/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 { isNonInteractiveEnvironment } from './src/utils/environment';\nimport { getUI, setUI } from './src/ui';\nimport { LoggingUI } from './src/ui/logging-ui';\nimport { getSubcommandWorkflows } from './src/lib/workflows/workflow-registry';\nimport type { WorkflowConfig } from './src/lib/workflows/workflow-step';\nimport type { WizardSession } from './src/lib/wizard-session';\nimport { POSTHOG_DOCS_URL } from './src/lib/constants';\nimport { runtimeEnv } from '@env';\n\n// Test mock server — only loaded when NODE_ENV is 'test'.\n// In production builds, tsdown replaces process.env.NODE_ENV with 'production',\n// making this block dead code.\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\n/** Shared yargs options for skill-based workflow subcommands. */\nconst skillSubcommandOptions = {\n debug: {\n default: false,\n describe: 'Enable verbose logging',\n type: 'boolean' as const,\n },\n 'install-dir': {\n describe: 'Directory to install in',\n type: 'string' as const,\n },\n 'local-mcp': {\n default: false,\n describe: 'Use local MCP server',\n type: 'boolean' as const,\n },\n benchmark: {\n default: false,\n describe: 'Run in benchmark mode',\n type: 'boolean' as const,\n },\n 'yara-report': {\n default: false,\n describe: 'Print YARA scanner summary',\n type: 'boolean' as const,\n hidden: true,\n },\n};\n\nconst cli = yargs(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 signup (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 skill: {\n describe:\n 'Run a specific context-mill skill by ID\\nenv: POSTHOG_WIZARD_SKILL',\n type: 'string',\n },\n name: {\n describe:\n 'Name for account creation with --ci --signup\\nenv: POSTHOG_WIZARD_NAME',\n type: 'string',\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n\n // CI mode validation and TTY check\n if (options.ci) {\n if (!options.region) options.region = 'us';\n if (!options.installDir) {\n setUI(new LoggingUI());\n getUI().intro('PostHog Wizard');\n getUI().log.error(\n 'CI mode requires --install-dir (directory to install in)',\n );\n process.exit(1);\n return;\n }\n if (!options.apiKey && !options.signup) {\n setUI(new LoggingUI());\n getUI().intro('PostHog Wizard');\n getUI().log.error(\n 'CI mode requires --api-key (personal API key phx_xxx). ' +\n 'To create a new account instead, use --signup --email you@example.com.',\n );\n process.exit(1);\n return;\n }\n if (!options.apiKey && options.signup && !options.email) {\n setUI(new LoggingUI());\n getUI().intro('PostHog Wizard');\n getUI().log.error(\n 'CI --signup requires --email to create a new account.',\n );\n process.exit(1);\n return;\n }\n void (async () => {\n // If --signup but no existing key, provision a new account first and\n // use its personal API key for the rest of the CI install.\n if (!options.apiKey && options.signup) {\n setUI(new LoggingUI());\n getUI().intro('PostHog Wizard');\n try {\n const { provisionNewAccount } = await import(\n './src/utils/provisioning.js'\n );\n const signupRegion = (options.region as string).toUpperCase() as\n | 'US'\n | 'EU';\n getUI().log.info(\n `Provisioning new PostHog account for ${String(\n options.email,\n )} in ${signupRegion}...`,\n );\n const result = await provisionNewAccount(\n options.email as string,\n options.name ?? '',\n signupRegion,\n );\n if (!result.personalApiKey) {\n getUI().log.error(\n 'Provisioning succeeded but no personal API key was returned — cannot continue install.',\n );\n process.exit(1);\n return;\n }\n getUI().log.success('Account ready.');\n getUI().log.info(` Project API Key: ${result.projectApiKey}`);\n getUI().log.info(` Personal API Key: ${result.personalApiKey}`);\n getUI().log.info(` Host: ${result.host}`);\n options.apiKey = result.personalApiKey;\n if (options.projectId == null) {\n options.projectId = result.projectId;\n }\n } catch (error) {\n const msg =\n error instanceof Error ? error.message : String(error);\n getUI().log.error(`Provisioning failed: ${msg}`);\n process.exit(1);\n return;\n }\n }\n\n const { posthogIntegrationConfig } = await import(\n './src/lib/workflows/posthog-integration/index.js'\n );\n const { FRAMEWORK_REGISTRY } = await import('./src/lib/registry.js');\n const { detectFramework, gatherFrameworkContext } = await import(\n './src/lib/detection/index.js'\n );\n const { analytics } = await import('./src/utils/analytics.js');\n const { wizardAbort } = await import('./src/utils/wizard-abort.js');\n\n // preRun: honor --integration, else auto-detect, then gather\n // framework context. Bypasses onReady hooks by design.\n runWizardCI(posthogIntegrationConfig, options, async (session) => {\n const integration =\n session.integration ??\n (await detectFramework(session.installDir));\n if (!integration) {\n await wizardAbort({\n message:\n 'Could not auto-detect your framework. Please specify --integration on the command line.',\n });\n return;\n }\n session.integration = integration;\n analytics.setTag('integration', integration);\n\n const frameworkConfig = FRAMEWORK_REGISTRY[integration];\n session.frameworkConfig = frameworkConfig;\n\n const context = await gatherFrameworkContext(frameworkConfig, {\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: true,\n menu: session.menu,\n benchmark: session.benchmark,\n yaraReport: session.yaraReport,\n });\n for (const [key, value] of Object.entries(context)) {\n if (!(key in session.frameworkContext)) {\n session.frameworkContext[key] = value;\n }\n }\n });\n })().catch(() => {\n process.exit(1);\n });\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 if (options.skill) {\n // Run a specific skill by ID\n void (async () => {\n const { createSkillWorkflow } = await import(\n './src/lib/workflows/agent-skill/index.js'\n );\n const skillId = options.skill as string;\n const config = createSkillWorkflow({\n skillId,\n command: 'skill',\n flowKey: 'agent-skill',\n description: `Run skill: ${skillId}`,\n integrationLabel: skillId,\n successMessage: `${skillId} completed!`,\n reportFile: `posthog-${skillId}-report.md`,\n docsUrl: POSTHOG_DOCS_URL,\n spinnerMessage: `Running ${skillId}...`,\n estimatedDurationMinutes: 5,\n });\n runWizard(config, { ...options, skillId });\n })();\n } else {\n // Interactive TTY: run core-integration through the unified workflow path.\n // Same codepath as `npx @posthog/wizard integrate`.\n void (async () => {\n const { posthogIntegrationConfig } = await import(\n './src/lib/workflows/posthog-integration/index.js'\n );\n runWizard(posthogIntegrationConfig, options);\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\ncli.command(\n 'provision',\n 'Create a new PostHog account (headless, no TUI)',\n (yargs) => {\n return yargs\n .options({\n email: {\n describe: 'Email address for the new account',\n type: 'string' as const,\n demandOption: true,\n },\n region: {\n describe: 'Cloud region (us or eu)',\n choices: ['us', 'eu'] as const,\n default: 'us',\n },\n name: {\n describe: 'Name for the new account',\n type: 'string' as const,\n default: '',\n },\n json: {\n describe:\n 'Emit JSON result to stdout (defaults to true when stdout is not a TTY)',\n type: 'boolean' as const,\n },\n })\n .example('wizard provision --email matt+test@posthog.com --region us', '')\n .example(\n 'wizard provision --email user@example.com --region eu --json',\n '',\n );\n },\n (argv) => {\n const email = argv.email;\n const region = argv.region.toUpperCase() as 'US' | 'EU';\n const name = argv.name ?? '';\n const jsonMode =\n argv.json === undefined ? !process.stdout.isTTY : argv.json;\n\n if (!jsonMode) {\n setUI(new LoggingUI());\n }\n\n void (async () => {\n try {\n const { provisionNewAccount } = await import(\n './src/utils/provisioning.js'\n );\n if (!jsonMode) {\n getUI().log.info(`Provisioning account for ${email} in ${region}...`);\n }\n const result = await provisionNewAccount(email, name, region);\n if (jsonMode) {\n process.stdout.write(`${JSON.stringify(result)}\\n`);\n } else {\n getUI().log.success('Account provisioned successfully:');\n getUI().log.info(` API Key: ${result.projectApiKey}`);\n getUI().log.info(` Host: ${result.host}`);\n getUI().log.info(` Project ID: ${result.projectId}`);\n getUI().log.info(` Account ID: ${result.accountId}`);\n getUI().log.info(` Access Token: ${result.accessToken}`);\n getUI().log.info(` Refresh Token: ${result.refreshToken}`);\n if (result.personalApiKey) {\n getUI().log.info(` Personal API Key: ${result.personalApiKey}`);\n }\n }\n process.exit(0);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n const code = msg.includes('already associated')\n ? 'email_exists'\n : 'provisioning_failed';\n if (jsonMode) {\n process.stderr.write(`${JSON.stringify({ error: msg, code })}\\n`);\n } else {\n getUI().log.error(`Provisioning failed: ${msg}`);\n }\n process.exit(1);\n }\n })();\n },\n);\n\n// ── Skill-based workflow subcommands (derived from registry) ─────────\nfor (const wfConfig of getSubcommandWorkflows()) {\n cli.command(\n wfConfig.command!,\n wfConfig.description,\n (y) => y.options(skillSubcommandOptions),\n (argv) => {\n const options = { ...argv };\n if (options.ci) {\n runWizardCI(wfConfig, options);\n } else {\n runWizard(wfConfig, options);\n }\n },\n );\n}\n\ncli\n .help()\n .alias('help', 'h')\n .version()\n .alias('version', 'v')\n .wrap(process.stdout.isTTY ? cli.terminalWidth() : 80).argv;\n\n/**\n * Run a full wizard workflow in the TUI. Handles the full lifecycle: start TUI,\n * build session, run detection, wait for intro gate, execute the\n * agent pipeline, wait for outro dismissal, then exit.\n */\nfunction runWizard(\n config: WorkflowConfig,\n options: Record<string, unknown>,\n): void {\n void (async () => {\n try {\n const installDir = (options.installDir as string) || process.cwd();\n\n const { startTUI } = await import('./src/ui/tui/start-tui.js');\n const { buildSession } = await import('./src/lib/wizard-session.js');\n const { TaskStreamPush } = await import('./src/lib/task-stream/index.js');\n const { FileDestination } = await import(\n './src/lib/task-stream/destinations/file.js'\n );\n const { PostHogDestination } = await import(\n './src/lib/task-stream/destinations/posthog.js'\n );\n const { analytics } = await import('./src/utils/analytics.js');\n\n const tui = startTUI(WIZARD_VERSION, config.flowKey as any);\n\n const session = buildSession({\n debug: options.debug as boolean | undefined,\n forceInstall: options.forceInstall as boolean | undefined,\n localMcp: options.localMcp as boolean | undefined,\n installDir,\n ci: false,\n signup: options.signup as boolean | undefined,\n apiKey: options.apiKey as string | undefined,\n projectId: options.projectId as string | undefined,\n email: options.email as string | undefined,\n menu: options.menu as boolean | undefined,\n integration: options.integration as any,\n benchmark: options.benchmark as boolean | undefined,\n yaraReport: options.yaraReport as boolean | undefined,\n });\n session.workflowLabel = config.flowKey;\n if (options.skillId) {\n session.skillId = options.skillId as string;\n }\n\n tui.store.session = session;\n\n // Task stream — pushes state to external consumers on task changes\n const taskStream = new TaskStreamPush({\n store: tui.store,\n workflowId: config.flowKey,\n destinations: [new FileDestination(), new PostHogDestination()],\n });\n tui.store.onTasksChanged = () => void taskStream.push();\n\n await tui.store.runReadyHooks();\n await tui.store.getGate('intro');\n await tui.store.getGate('health-check');\n\n const skipAgent = config.run == null;\n\n if (skipAgent) {\n const { getOrAskForProjectData } = await import(\n './src/utils/setup-utils.js'\n );\n const { projectApiKey, host, accessToken, projectId } =\n await getOrAskForProjectData({\n signup: session.signup,\n ci: session.ci,\n apiKey: session.apiKey,\n projectId: session.projectId,\n });\n tui.store.setCredentials({\n accessToken,\n projectApiKey,\n host,\n projectId,\n });\n } else {\n const { runAgent } = await import('./src/lib/agent/agent-runner.js');\n await runAgent(config, tui.store.session);\n }\n\n const isDone = (): boolean =>\n skipAgent\n ? tui.store.session.outroDismissed\n : tui.store.session.skillsComplete;\n\n await new Promise<void>((resolve) => {\n const unsub = tui.store.subscribe(() => {\n if (isDone()) {\n unsub();\n resolve();\n }\n });\n if (isDone()) {\n unsub();\n resolve();\n }\n });\n\n try {\n await taskStream.dispose();\n } catch (error) {\n analytics.captureException(error as Error);\n }\n tui.unmount();\n process.exit(0);\n } catch (err) {\n if (runtimeEnv('DEBUG') || runtimeEnv('POSTHOG_WIZARD_DEBUG')) {\n console.error('TUI init failed:', err); // eslint-disable-line no-console\n }\n }\n })();\n}\n\n/**\n * CI-mode pipeline shared by every non-interactive entry point.\n *\n * Validates flags, builds a `ci:true` session, runs `preRun` (or the\n * workflow's `onReady` hooks by default), executes `runAgent`, and\n * routes any failure through `wizardAbort`. `wizardAbort` owns all\n * exits — never add a raw `process.exit` here.\n */\nfunction runWizardCI(\n config: WorkflowConfig,\n options: Record<string, unknown>,\n preRun?: (session: WizardSession) => Promise<void>,\n): void {\n setUI(new LoggingUI());\n if (!options.region) options.region = 'us';\n if (!options.apiKey) {\n getUI().intro('PostHog Wizard');\n getUI().log.error('CI mode requires --api-key (personal API key phx_xxx)');\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 in)',\n );\n process.exit(1);\n }\n\n void (async () => {\n const path = await import('path');\n const { buildSession } = await import('./src/lib/wizard-session.js');\n const { readEnvironment } = await import('./src/utils/environment.js');\n const { readApiKeyFromEnv } = await import('./src/utils/env-api-key.js');\n const { configureLogFileFromEnvironment, logToFile } = await import(\n './src/utils/debug.js'\n );\n const { wizardAbort, WizardError } = await import(\n './src/utils/wizard-abort.js'\n );\n\n configureLogFileFromEnvironment();\n\n const env = readEnvironment();\n const apiKey =\n (options.apiKey as string) ?? readApiKeyFromEnv() ?? undefined;\n const installDir = path.isAbsolute(options.installDir as string)\n ? (options.installDir as string)\n : path.join(process.cwd(), options.installDir as string);\n\n const session = buildSession({\n debug: options.debug as boolean | undefined,\n forceInstall: options.forceInstall as boolean | undefined,\n installDir,\n ci: true,\n signup: options.signup as boolean | undefined,\n localMcp: options.localMcp as boolean | undefined,\n apiKey,\n email: options.email as string | undefined,\n menu: options.menu as boolean | undefined,\n integration: options.integration as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n projectId: options.projectId as string | undefined,\n benchmark: options.benchmark as boolean | undefined,\n yaraReport: options.yaraReport as boolean | undefined,\n ...env,\n });\n session.workflowLabel = config.flowKey;\n const runDef = typeof config.run === 'object' ? config.run : null;\n\n getUI().intro('Welcome to the PostHog setup wizard');\n getUI().log.info(`Running ${config.flowKey} in CI mode`);\n\n try {\n if (preRun) {\n await preRun(session);\n } else {\n // Run onReady hooks against a minimal store-less context.\n const readyCtx = {\n session,\n setFrameworkContext: (key: string, value: unknown) => {\n session.frameworkContext[key] = value;\n },\n setFrameworkConfig: () => undefined,\n setDetectedFramework: () => undefined,\n setUnsupportedVersion: () => undefined,\n addDiscoveredFeature: () => undefined,\n setDetectionComplete: () => undefined,\n };\n for (const step of config.steps) {\n if (step.onReady) {\n await step.onReady(readyCtx);\n }\n }\n\n // Surface detectError written by the workflow's detect hook.\n const detectError = session.frameworkContext.detectError as\n | { kind: string; [k: string]: unknown }\n | undefined;\n if (detectError) {\n await wizardAbort({\n message: `Prerequisites not met: ${detectError.kind}\\n\\nSee ${\n runDef?.docsUrl ?? POSTHOG_DOCS_URL\n }`,\n error: new WizardError(`${config.flowKey} prerequisites failed`, {\n integration: config.flowKey,\n detect_error_kind: detectError.kind,\n }),\n });\n }\n }\n\n const { runAgent } = await import('./src/lib/agent/agent-runner.js');\n await runAgent(config, session);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n const errorStack =\n error instanceof Error && error.stack ? error.stack : undefined;\n\n logToFile(`[bin.ts CI] ERROR: ${errorMessage}`);\n if (errorStack) logToFile(`[bin.ts CI] STACK: ${errorStack}`);\n\n const debugInfo = session.debug && errorStack ? `\\n\\n${errorStack}` : '';\n const docsUrl =\n session.frameworkConfig?.metadata.docsUrl ??\n runDef?.docsUrl ??\n POSTHOG_DOCS_URL;\n await wizardAbort({\n message: `Something went wrong: ${errorMessage}\\n\\nYou can read the documentation at ${docsUrl} to set up manually.${debugInfo}`,\n error: error as Error,\n });\n }\n })().catch(() => {\n process.exit(1);\n });\n}\n"],"mappings":"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b,UAAU;EACV,MAAM;EACP;CACD,aAAa;EACX,SAAS;EACT,UAAU;EACV,MAAM;EACP;CACD,WAAW;EACT,SAAS;EACT,UAAU;EACV,MAAM;EACP;CACD,eAAe;EACb,SAAS;EACT,UAAU;EACV,MAAM;EACN,QAAQ;EACT;CACF;AAED,MAAM,MAAM,MAAM,QAAQ,QAAQ,KAAK,CAAC,CACrC,IAAI,iBAAiB,CAErB,QAAQ;CACP,OAAO;EACL,SAAS;EACT,UAAU;EACV,MAAM;EACP;CACD,QAAQ;EACN,UAAU;EACV,SAAS,CAAC,MAAM,KAAK;EACrB,MAAM;EACP;CACD,SAAS;EACP,SAAS;EACT,UACE;EACF,MAAM;EACP;CACD,QAAQ;EACN,SAAS;EACT,UACE;EACF,MAAM;EACP;CACD,aAAa;EACX,SAAS;EACT,UACE;EACF,MAAM;EACP;CACD,IAAI;EACF,SAAS;EACT,UACE;EACF,MAAM;EACP;CACD,WAAW;EACT,UACE;EACF,MAAM;EACP;CACD,cAAc;EACZ,UACE;EACF,MAAM;EACP;CACD,OAAO;EACL,UACE;EACF,MAAM;EACP;CACF,CAAC,CACD,QACC,CAAC,KAAK,EACN,iCACC,UAAU;AACT,QAAO,MAAM,QAAQ;EACnB,iBAAiB;GACf,SAAS;GACT,UACE;GACF,MAAM;GACP;EACD,eAAe;GACb,UACE;GACF,MAAM;GACP;EACD,YAAY;GACV,SAAS;GACT,UAAU;GACV,MAAM;GACP;EACD,aAAa;GACX,UAAU;GACV,SAAS;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACD;GACD,MAAM;GACP;EACD,MAAM;GACJ,SAAS;GACT,UACE;GACF,MAAM;GACP;EACD,WAAW;GACT,SAAS;GACT,UACE;GACF,MAAM;GACP;EACD,eAAe;GACb,SAAS;GACT,UACE;GACF,MAAM;GACN,QAAQ;GACT;EACD,OAAO;GACL,UACE;GACF,MAAM;GACP;EACD,MAAM;GACJ,UACE;GACF,MAAM;GACP;EACF,CAAC;IAEH,SAAS;CACR,MAAM,UAAU,EAAE,GAAG,MAAM;AAG3B,KAAI,QAAQ,IAAI;AAC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"}
|
|
1
|
+
{"version":3,"file":"bin.js","names":["getContentBlocks","baseConfig","agentSkillContentBlocks"],"sources":["../src/utils/environment.ts","../src/lib/programs/revenue-analytics/detect.ts","../src/lib/programs/revenue-analytics/steps.ts","../src/lib/programs/agent-skill/content/index.tsx","../src/lib/programs/revenue-analytics/index.ts","../src/lib/programs/agent-skill/steps.ts","../src/lib/programs/agent-skill/index.ts","../src/lib/programs/audit/detect.ts","../src/lib/programs/audit/seed.ts","../src/lib/programs/audit/index.ts","../src/lib/programs/events-audit/steps.ts","../src/lib/programs/events-audit/index.ts","../src/lib/programs/audit-3000/index.ts","../src/lib/programs/posthog-doctor/steps.ts","../src/lib/programs/posthog-doctor/types.ts","../src/lib/programs/posthog-doctor/fetch.ts","../src/lib/programs/posthog-doctor/kind-metadata.ts","../src/lib/programs/posthog-doctor/index.ts","../src/lib/programs/migration/steps.ts","../src/lib/programs/migration/content/vendor-stack.tsx","../src/lib/programs/migration/content/free-tier.tsx","../src/lib/programs/migration/content/pricing-structure.tsx","../src/lib/programs/migration/content/index.tsx","../src/lib/programs/migration/index.ts","../src/lib/programs/mcp/index.ts","../src/lib/programs/program-registry.ts","../bin.ts"],"sourcesContent":["import readEnvModule from 'read-env';\n\nconst readEnv =\n typeof readEnvModule === 'function'\n ? readEnvModule\n : (readEnvModule as any).default;\nimport { tryGetPackageJson } from './setup-utils';\nimport type { WizardOptions } from './types';\nimport fg from 'fast-glob';\nimport { IS_DEV } from '../lib/constants';\n\nexport function isNonInteractiveEnvironment(): boolean {\n if (IS_DEV) {\n return false;\n }\n\n if (!process.stdout.isTTY || !process.stderr.isTTY) {\n return true;\n }\n\n return false;\n}\n\nexport function readEnvironment(): Record<string, unknown> {\n const result = readEnv('POSTHOG_WIZARD');\n\n return result;\n}\n\nexport async function detectEnvVarPrefix(\n options: WizardOptions,\n): Promise<string> {\n const packageJson = await tryGetPackageJson(options);\n if (!packageJson) return 'VITE_PUBLIC_';\n\n const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };\n const has = (name: string) => name in deps;\n const hasAnyFile = async (patterns: string[]) => {\n const matches = await fg(patterns, {\n cwd: options.installDir,\n absolute: false,\n onlyFiles: true,\n ignore: ['**/node_modules/**'],\n });\n return matches.length > 0;\n };\n\n // --- Next.js\n if (has('next') || (await hasAnyFile(['**/next.config.{js,ts,mjs,cjs}']))) {\n return 'NEXT_PUBLIC_';\n }\n\n // --- Create React App\n if (\n has('react-scripts') ||\n has('create-react-app') ||\n (await hasAnyFile(['**/config-overrides.js']))\n ) {\n return 'REACT_APP_';\n }\n\n // --- Vite (vanilla, TanStack, Solid, etc.)\n // Note: Vite does not need PUBLIC_ but we use it to follow the docs, to improve the chances of an LLM getting it right.\n if (has('vite') || (await hasAnyFile(['**/vite.config.{js,ts,mjs,cjs}']))) {\n return 'VITE_PUBLIC_';\n }\n\n // --- SvelteKit\n if (\n has('@sveltejs/kit') ||\n (await hasAnyFile(['**/svelte.config.{js,ts}']))\n ) {\n return 'PUBLIC_';\n }\n\n // --- TanStack Start (uses Vite)\n if (\n has('@tanstack/start') ||\n (await hasAnyFile(['**/tanstack.config.{js,ts}']))\n ) {\n return 'VITE_PUBLIC_';\n }\n\n // --- SolidStart (uses Vite)\n if (has('solid-start') || (await hasAnyFile(['**/solid.config.{js,ts}']))) {\n return 'VITE_PUBLIC_';\n }\n\n // --- Astro\n if (has('astro') || (await hasAnyFile(['**/astro.config.{js,ts,mjs}']))) {\n return 'PUBLIC_';\n }\n\n // We default to Vite if we can't detect a specific framework, since it's the most commonly used.\n return 'VITE_PUBLIC_';\n}\n","/**\n * Revenue analytics prerequisite detection.\n *\n * Scans the project for PostHog + Stripe SDKs and writes results\n * into frameworkContext for the intro screen to render.\n */\n\nimport type { Dirent } from 'fs';\nimport { readFileSync, readdirSync, existsSync, statSync } from 'fs';\nimport { join, relative } from 'path';\nimport { IGNORED_DIRS } from '../../../utils/file-utils.js';\nimport type { WizardSession } from '../../wizard-session.js';\nimport type { AbortCase } from '../../agent/agent-runner.js';\n\nexport const POSTHOG_SDKS = [\n 'posthog-js',\n 'posthog-node',\n 'posthog-react-native',\n 'posthog-android',\n 'posthog-ios',\n];\n\nexport const STRIPE_SDKS = [\n 'stripe',\n '@stripe/stripe-js',\n '@stripe/react-stripe-js',\n];\n\ninterface PackageMatch {\n /** Path to the package.json relative to installDir */\n path: string;\n posthogSdks: string[];\n stripeSdks: string[];\n}\n\n/**\n * Structured detection errors. The screen renders each kind into JSX\n * with proper formatting — keeps error data separate from presentation.\n */\nexport type RevenueDetectError =\n | {\n kind: 'bad-directory';\n path: string;\n reason: 'missing' | 'not-dir' | 'unreadable';\n }\n | { kind: 'no-package-json' }\n | { kind: 'no-sdks'; scannedCount: number }\n | { kind: 'missing-posthog'; foundStripe: string[] }\n | { kind: 'missing-stripe'; foundPosthog: string[] };\n\n/** `[ABORT] <reason>` cases the revenue analytics skill can emit. */\nexport const REVENUE_ABORT_CASES: AbortCase[] = [\n {\n // Skill emits: [ABORT] Could not find a PostHog distinct_id\n match: /^could not find a posthog distinct_id$/i,\n message: 'Could not find a PostHog distinct_id',\n body:\n 'The agent could not find PostHog distinct_id usage in your codebase. ' +\n 'Your users must be identified in PostHog before they can be tagged in Stripe. ' +\n 'Please identify your users and try again.',\n docsUrl: 'https://posthog.com/docs/product-analytics/identify',\n },\n {\n // Skill emits: [ABORT] Could not find a Stripe integration\n match: /^could not find a stripe integration$/i,\n message: 'Could not find a Stripe integration',\n body:\n 'The Wizard could not find an existing Stripe customer, charge, ' +\n 'subscription, or other Stripe operations. Please run the Revenue ' +\n 'Analytics Wizard on a project with an existing Stripe integration.',\n docsUrl: 'https://posthog.com/docs/revenue-analytics',\n },\n];\n\n/**\n * Recursively find all package.json files under installDir (max depth 3),\n * skipping common ignored directories. Returns matches with detected SDKs.\n */\nfunction findPackageJsons(installDir: string, maxDepth = 3): PackageMatch[] {\n const matches: PackageMatch[] = [];\n\n function scan(dir: string, depth: number): void {\n if (depth > maxDepth) return;\n\n let entries: Dirent[];\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (entry.name.startsWith('.') && entry.name !== '.') continue;\n if (IGNORED_DIRS.has(entry.name)) continue;\n\n const fullPath = join(dir, entry.name);\n\n if (entry.isFile() && entry.name === 'package.json') {\n try {\n const pkg = JSON.parse(readFileSync(fullPath, 'utf-8')) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const depNames = [\n ...Object.keys(pkg.dependencies ?? {}),\n ...Object.keys(pkg.devDependencies ?? {}),\n ];\n const posthogSdks = depNames.filter((d) => POSTHOG_SDKS.includes(d));\n const stripeSdks = depNames.filter((d) => STRIPE_SDKS.includes(d));\n matches.push({\n path: relative(installDir, fullPath) || 'package.json',\n posthogSdks,\n stripeSdks,\n });\n } catch {\n // Skip malformed package.json\n }\n } else if (entry.isDirectory()) {\n scan(fullPath, depth + 1);\n }\n }\n }\n\n scan(installDir, 0);\n return matches;\n}\n\n/**\n * Scan `session.installDir` for PostHog + Stripe SDKs. Writes detection\n * results into frameworkContext via the callback — either the detected\n * SDK lists (for the intro screen) or a `RevenueDetectError` on failure.\n *\n * The skill install happens later in the bootstrap runner, not here.\n */\nexport function detectRevenuePrerequisites(\n session: WizardSession,\n setFrameworkContext: (key: string, value: unknown) => void,\n): void {\n const fail = (error: RevenueDetectError) =>\n setFrameworkContext('detectError', error);\n\n const installDir = session.installDir;\n\n // Verify the install directory exists and is readable\n if (!existsSync(installDir)) {\n fail({ kind: 'bad-directory', path: installDir, reason: 'missing' });\n return;\n }\n try {\n if (!statSync(installDir).isDirectory()) {\n fail({ kind: 'bad-directory', path: installDir, reason: 'not-dir' });\n return;\n }\n } catch {\n fail({ kind: 'bad-directory', path: installDir, reason: 'unreadable' });\n return;\n }\n\n // Find all package.json files (root + monorepo subpackages)\n const matches = findPackageJsons(installDir);\n\n if (matches.length === 0) {\n fail({ kind: 'no-package-json' });\n return;\n }\n\n // Aggregate detected SDKs across all package.json files\n const allPosthogSdks = new Set<string>();\n const allStripeSdks = new Set<string>();\n for (const match of matches) {\n for (const sdk of match.posthogSdks) allPosthogSdks.add(sdk);\n for (const sdk of match.stripeSdks) allStripeSdks.add(sdk);\n }\n\n const detectedPosthogSdks = [...allPosthogSdks];\n const detectedStripeSdks = [...allStripeSdks];\n\n if (detectedPosthogSdks.length === 0 && detectedStripeSdks.length === 0) {\n fail({ kind: 'no-sdks', scannedCount: matches.length });\n return;\n }\n\n if (detectedPosthogSdks.length === 0) {\n fail({ kind: 'missing-posthog', foundStripe: detectedStripeSdks });\n return;\n }\n\n if (detectedStripeSdks.length === 0) {\n fail({ kind: 'missing-stripe', foundPosthog: detectedPosthogSdks });\n return;\n }\n\n setFrameworkContext('detectedPosthogSdks', detectedPosthogSdks);\n setFrameworkContext('detectedStripeSdks', detectedStripeSdks);\n setFrameworkContext(\n 'detectedPackagePaths',\n matches\n .filter((m) => m.posthogSdks.length > 0 || m.stripeSdks.length > 0)\n .map((m) => m.path),\n );\n}\n","/**\n * Revenue analytics program step list.\n *\n * The detect step checks for PostHog + Stripe SDKs. The skill install\n * and agent run live in the program runner (see agent-runner.ts).\n */\n\nimport type { ProgramStep } from '../program-step.js';\nimport { RunPhase } from '../../wizard-session.js';\nimport { detectRevenuePrerequisites } from './detect.js';\n\nexport const REVENUE_ANALYTICS_PROGRAM: ProgramStep[] = [\n {\n id: 'detect',\n label: 'Detecting prerequisites',\n // Headless step: no screen, no gate. onReady fires after bin.ts\n // assigns the session — the hook scans for PostHog + Stripe SDKs\n // and writes the results (or a detectError) to frameworkContext\n // for the intro screen to render.\n onReady: (ctx) =>\n detectRevenuePrerequisites(ctx.session, ctx.setFrameworkContext),\n },\n {\n id: 'intro',\n label: 'Welcome',\n screenId: 'revenue-intro',\n gate: (session) => session.setupConfirmed,\n },\n {\n id: 'auth',\n label: 'Authentication',\n screenId: 'auth',\n isComplete: (session) => session.credentials !== null,\n },\n {\n id: 'run',\n label: 'Revenue analytics',\n screenId: 'run',\n isComplete: (session) =>\n session.runPhase === RunPhase.Completed ||\n session.runPhase === RunPhase.Error,\n },\n {\n id: 'outro',\n label: 'Done',\n screenId: 'outro',\n isComplete: (session) => session.outroDismissed,\n },\n {\n id: 'skills',\n label: 'Skills',\n screenId: 'keep-skills',\n },\n];\n","/**\n * Agent-skill learn-deck — the short three-line sequence shown while a\n * skill-based program (audit, revenue-analytics, agent-skill, etc.)\n * runs. Skill programs don't need the full PostHog onboarding narrative.\n */\n\nimport { Text } from 'ink';\nimport type { WizardStore } from '../../../../ui/tui/store.js';\nimport { TextRevealMode } from '../../../../ui/tui/primitives/TextBlock.js';\nimport type { ContentBlock } from '../../../../ui/tui/primitives/content-types.js';\n\nexport const getContentBlocks = (store?: WizardStore): ContentBlock[] => {\n const skillId = store?.session.skillId ?? 'unknown';\n return [\n {\n content: 'Welcome.',\n pause: 3000,\n mode: TextRevealMode.Typewriter,\n animationInterval: 160,\n },\n { content: 'The Wizard is an agent.', pause: 4000 },\n {\n pause: 60000,\n content: (\n <Text>\n Running the <Text color=\"cyan\">{skillId}</Text> skill...\n </Text>\n ),\n },\n ];\n};\n","import type { ProgramConfig } from '../program-step.js';\nimport { WIZARD_TOOL_NAMES } from '../../wizard-tools.js';\nimport { REVENUE_ANALYTICS_PROGRAM } from './steps.js';\nimport { REVENUE_ABORT_CASES } from './detect.js';\nimport { getContentBlocks } from './content/index.js';\n\nexport const revenueAnalyticsConfig: ProgramConfig = {\n command: 'revenue',\n description: 'Set up PostHog revenue analytics (e.g. Stripe integration)',\n id: 'revenue-analytics-setup',\n steps: REVENUE_ANALYTICS_PROGRAM,\n getContentBlocks,\n allowedTools: ['Agent'],\n disallowedTools: [WIZARD_TOOL_NAMES.wizardAsk],\n run: {\n skillId: 'revenue-analytics-setup',\n integrationLabel: 'revenue-analytics-setup',\n customPrompt: () => 'Set up revenue analytics for this project.',\n successMessage: 'Revenue analytics configured!',\n reportFile: 'posthog-revenue-report.md',\n docsUrl: 'https://posthog.com/docs/revenue-analytics',\n spinnerMessage: 'Setting up revenue analytics...',\n estimatedDurationMinutes: 5,\n abortCases: REVENUE_ABORT_CASES,\n },\n requires: ['posthog-integration'],\n};\n\nexport { REVENUE_ANALYTICS_PROGRAM } from './steps.js';\nexport {\n detectRevenuePrerequisites,\n POSTHOG_SDKS,\n STRIPE_SDKS,\n type RevenueDetectError,\n} from './detect.js';\n","/**\n * Generic agent skill step list.\n *\n * Minimal flow: auth → run → outro → skills.\n * No detection, no setup, no MCP.\n */\n\nimport type { ProgramStep } from '../program-step.js';\nimport { RunPhase } from '../../wizard-session.js';\n\nexport const AGENT_SKILL_STEPS: ProgramStep[] = [\n {\n id: 'intro',\n label: 'Welcome',\n screenId: 'agent-skill-intro',\n gate: (session) => session.setupConfirmed,\n },\n {\n id: 'auth',\n label: 'Authentication',\n screenId: 'auth',\n isComplete: (session) => session.credentials !== null,\n },\n {\n id: 'run',\n label: 'Running',\n screenId: 'run',\n isComplete: (session) =>\n session.runPhase === RunPhase.Completed ||\n session.runPhase === RunPhase.Error,\n },\n {\n id: 'outro',\n label: 'Done',\n screenId: 'outro',\n isComplete: (session) => session.outroDismissed,\n },\n {\n id: 'skills',\n label: 'Skills',\n screenId: 'keep-skills',\n },\n];\n","/**\n * Generic agent skill program factory.\n *\n * Creates a ProgramConfig for any context-mill skill. Provide a\n * skill ID and basic UI config — the factory handles the rest.\n *\n * Usage:\n * createSkillProgram({\n * skillId: 'error-tracking-setup',\n * command: 'errors',\n * id: 'error-tracking',\n * description: 'Set up PostHog error tracking',\n * integrationLabel: 'error-tracking',\n * successMessage: 'Error tracking configured!',\n * reportFile: 'posthog-error-tracking-report.md',\n * docsUrl: 'https://posthog.com/docs/error-tracking',\n * spinnerMessage: 'Setting up error tracking...',\n * estimatedDurationMinutes: 5,\n * })\n */\n\nimport type { ProgramConfig } from '../program-step.js';\nimport type { ProgramRun, AbortCase } from '../../agent/agent-runner.js';\nimport { AGENT_SKILL_STEPS } from './steps.js';\nimport { getContentBlocks } from './content/index.js';\n\nexport interface SkillProgramOptions {\n /** Context-mill skill ID to install */\n skillId: string;\n /** CLI subcommand name */\n command: string;\n /** Unique flow key — must match a Program enum entry */\n id: string;\n /** CLI description shown in --help */\n description: string;\n /** Analytics integration label */\n integrationLabel: string;\n /** Custom prompt instruction. Appended after default project prompt. */\n customPrompt?: string;\n successMessage: string;\n reportFile: string;\n docsUrl: string;\n spinnerMessage: string;\n estimatedDurationMinutes: number;\n /** Other program ids that must be satisfied first */\n requires?: string[];\n /** Override the default outro. Receives the same args as ProgramRun.buildOutroData. */\n buildOutroData?: ProgramRun['buildOutroData'];\n /** Known `[ABORT] <reason>` cases the skill can emit. */\n abortCases?: AbortCase[];\n}\n\nexport function createSkillProgram(opts: SkillProgramOptions): ProgramConfig {\n return {\n command: opts.command,\n description: opts.description,\n id: opts.id,\n skillId: opts.skillId,\n steps: AGENT_SKILL_STEPS,\n reportFile: opts.reportFile,\n getContentBlocks,\n run: {\n skillId: opts.skillId,\n integrationLabel: opts.integrationLabel,\n customPrompt: opts.customPrompt ? () => opts.customPrompt! : undefined,\n successMessage: opts.successMessage,\n reportFile: opts.reportFile,\n docsUrl: opts.docsUrl,\n spinnerMessage: opts.spinnerMessage,\n estimatedDurationMinutes: opts.estimatedDurationMinutes,\n buildOutroData: opts.buildOutroData,\n abortCases: opts.abortCases,\n },\n requires: opts.requires,\n };\n}\n\nexport { AGENT_SKILL_STEPS } from './steps.js';\n","import type { AbortCase } from '../../agent/agent-runner.js';\n\n/** `[ABORT] <reason>` cases the audit skill can emit. Reason strings are\n * defined in the skill's `Abort statuses` section. */\nexport const AUDIT_ABORT_CASES: AbortCase[] = [\n {\n match: /^no posthog sdk found$/i,\n message: 'No PostHog SDK found',\n body:\n 'The audit needs an existing PostHog integration to review. No PostHog ' +\n 'SDK appears in this project’s dependency manifests. Run the basic ' +\n 'integration program to install PostHog first, then re-run the audit.',\n docsUrl: 'https://posthog.com/docs/getting-started/install',\n },\n];\n","import fs from 'fs';\nimport path from 'path';\nimport { logToFile } from '../../../utils/debug';\nimport { AUDIT_CHECKS_FILE, type AuditCheck } from './types.js';\n\n/** The 10 data-integrity checks the audit runs. */\nexport const AUDIT_SEED_CHECKS: AuditCheck[] = [\n {\n id: 'sdk-installed',\n area: 'Installation',\n label: 'PostHog SDK installed',\n status: 'pending',\n },\n {\n id: 'sdk-up-to-date',\n area: 'Installation',\n label: 'SDK version up to date',\n status: 'pending',\n },\n {\n id: 'init-correct',\n area: 'Installation',\n label: 'Initialization is correct',\n status: 'pending',\n },\n {\n id: 'identify-stable-distinct-id',\n area: 'Identification',\n label: 'Stable distinct_id (not session UUID)',\n status: 'pending',\n },\n {\n id: 'identify-not-late',\n area: 'Identification',\n label: 'identify() called before captures / flag evals',\n status: 'pending',\n },\n {\n id: 'cross-runtime-distinct-id',\n area: 'Identification',\n label: 'Same distinct_id across client and server',\n status: 'pending',\n },\n {\n id: 'identify-reset-on-logout',\n area: 'Identification',\n label: 'reset() called on logout / account switch',\n status: 'pending',\n },\n {\n id: 'capture-event-names-static',\n area: 'Event Capture',\n label: 'Event names are static and consistent',\n status: 'pending',\n },\n {\n id: 'capture-uses-proxy',\n area: 'Event Capture',\n label: 'Captures route through a reverse proxy',\n status: 'pending',\n },\n {\n id: 'capture-growth-events',\n area: 'Event Capture',\n label: 'Key activation events captured',\n status: 'pending',\n },\n];\n\n/** Atomically write the seeded ledger to the project's audit checks file. */\nexport function seedAuditLedger(installDir: string): void {\n const target = path.join(installDir, AUDIT_CHECKS_FILE);\n const tmp = `${target}.tmp`;\n fs.writeFileSync(tmp, JSON.stringify(AUDIT_SEED_CHECKS, null, 2), 'utf8');\n fs.renameSync(tmp, target);\n logToFile(\n `seedAuditLedger: wrote ${AUDIT_SEED_CHECKS.length} entries to ${target}`,\n );\n}\n","import { AGENT_SKILL_STEPS, createSkillProgram } from '../agent-skill/index.js';\nimport type { ProgramStep, ProgramConfig } from '../program-step.js';\nimport type { ProgramRun } from '../../agent/agent-runner.js';\nimport type { WizardSession } from '../../wizard-session.js';\nimport { WIZARD_TOOL_NAMES } from '../../wizard-tools.js';\nimport { AUDIT_ABORT_CASES } from './detect.js';\nimport { AUDIT_CHECKS_KEY, AUDIT_REPORT_FILE } from './types.js';\nimport { AUDIT_SEED_CHECKS, seedAuditLedger } from './seed.js';\n\n/** Audit-specific screens for the shared agent-skill pipeline. */\nconst AUDIT_SCREEN_BY_STEP: Record<string, string> = {\n intro: 'audit-intro',\n run: 'audit-run',\n outro: 'audit-outro',\n};\n\nconst seedBeforeAuditRun = (session: WizardSession): void => {\n seedAuditLedger(session.installDir);\n session.frameworkContext[AUDIT_CHECKS_KEY] = AUDIT_SEED_CHECKS;\n};\n\nconst withAuditScreens = (steps: ProgramStep[]): ProgramStep[] =>\n steps.map((step) => {\n const override = AUDIT_SCREEN_BY_STEP[step.id];\n return override ? { ...step, screenId: override } : step;\n });\n\nconst auditSteps: ProgramStep[] = withAuditScreens(AGENT_SKILL_STEPS);\n\nconst baseConfig = createSkillProgram({\n skillId: 'audit',\n command: 'audit',\n id: 'audit',\n description:\n 'Audit an existing PostHog integration for correctness and best practices',\n integrationLabel: 'audit',\n customPrompt:\n 'Run a comprehensive audit of the existing PostHog integration. Follow the skill program steps in order. Do not modify any project files — only create the final audit report.',\n successMessage:\n 'Audit complete! You can view the audit report at ./posthog-audit-report.md',\n reportFile: AUDIT_REPORT_FILE,\n docsUrl: 'https://posthog.com/docs/product-analytics/best-practices',\n spinnerMessage: 'Auditing PostHog integration...',\n estimatedDurationMinutes: 5,\n requires: ['posthog-integration'],\n abortCases: AUDIT_ABORT_CASES,\n});\n\nconst auditRun = async (session: WizardSession): Promise<ProgramRun> => {\n seedBeforeAuditRun(session);\n\n if (!baseConfig.run) {\n throw new Error('Audit program has no run configuration.');\n }\n\n return typeof baseConfig.run === 'function'\n ? baseConfig.run(session)\n : baseConfig.run;\n};\n\nexport const auditConfig: ProgramConfig = {\n ...baseConfig,\n steps: auditSteps,\n run: auditRun,\n allowedTools: ['Agent'],\n disallowedTools: [WIZARD_TOOL_NAMES.wizardAsk],\n};\n","/**\n * Events-audit program.\n *\n * Mirrors the posthog-integration step list, except:\n * - The initial framework detection step is omitted — the events-audit\n * skill handles detection at agent run time.\n * - The intro step uses the audit intro screen (no framework selection\n * logic) instead of the integration intro.\n */\n\nimport type { ProgramStep } from '../program-step.js';\nimport type { WizardSession } from '../../wizard-session.js';\nimport { RunPhase } from '../../wizard-session.js';\nimport {\n evaluateWizardReadiness,\n WizardReadiness,\n SIGNUP_WIZARD_READINESS_CONFIG,\n getBlockingServiceKeys,\n} from '../../health-checks/readiness.js';\n\nfunction needsSetup(session: WizardSession): boolean {\n const config = session.frameworkConfig;\n if (!config?.metadata.setup?.questions) return false;\n\n return config.metadata.setup.questions.some(\n (q: { key: string }) => !(q.key in session.frameworkContext),\n );\n}\n\nfunction healthCheckReady(session: WizardSession): boolean {\n if (!session.readinessResult) return false;\n\n if (session.signup) {\n const hardBlocking = getBlockingServiceKeys(\n session.readinessResult.health,\n SIGNUP_WIZARD_READINESS_CONFIG,\n );\n const defaultBlocking = getBlockingServiceKeys(\n session.readinessResult.health,\n );\n if (hardBlocking.length === 0 && defaultBlocking.length === 0) return true;\n return session.outageDismissed;\n }\n\n if (session.readinessResult.decision === WizardReadiness.No) {\n return session.outageDismissed;\n }\n return true;\n}\n\nexport const EVENTS_AUDIT_PROGRAM: ProgramStep[] = [\n {\n id: 'intro',\n label: 'Welcome',\n screenId: 'audit-intro',\n gate: (session) => session.setupConfirmed,\n },\n {\n id: 'health-check',\n label: 'Health check',\n screenId: 'health-check',\n gate: healthCheckReady,\n onInit: (ctx) => {\n evaluateWizardReadiness()\n .then((readiness) => {\n ctx.setReadinessResult(readiness);\n })\n .catch(() => {\n ctx.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n });\n },\n },\n {\n id: 'setup',\n label: 'Setup',\n screenId: 'setup',\n show: needsSetup,\n isComplete: (session) => !needsSetup(session),\n },\n {\n id: 'auth',\n label: 'Authentication',\n screenId: 'auth',\n isComplete: (session) => session.credentials !== null,\n },\n {\n id: 'run',\n label: 'Events audit',\n screenId: 'audit-run',\n isComplete: (session) =>\n session.runPhase === RunPhase.Completed ||\n session.runPhase === RunPhase.Error,\n },\n {\n id: 'mcp',\n label: 'MCP servers',\n screenId: 'mcp',\n isComplete: (session) => session.mcpComplete,\n },\n {\n id: 'outro',\n label: 'Done',\n screenId: 'audit-outro',\n isComplete: (session) => session.outroDismissed,\n },\n {\n id: 'keep-skills',\n label: 'Keep Skills',\n screenId: 'keep-skills',\n },\n];\n","import type { ProgramConfig } from '../program-step.js';\nimport type { ProgramRun } from '../../agent/agent-runner.js';\nimport type { WizardSession } from '../../wizard-session.js';\nimport { OutroKind } from '../../wizard-session.js';\nimport { SPINNER_MESSAGE } from '../../framework-config.js';\nimport { isUsingTypeScript } from '../../../utils/setup-utils.js';\nimport { getCloudUrlFromRegion } from '../../../utils/urls.js';\nimport { WIZARD_TOOL_NAMES } from '../../wizard-tools.js';\nimport { EVENTS_AUDIT_PROGRAM } from './steps.js';\nimport { AUDIT_CHECKS_KEY } from '../audit/types.js';\nimport { AUDIT_SEED_CHECKS, seedAuditLedger } from '../audit/seed.js';\n\nexport const SETUP_REPORT_FILE = 'posthog-events-audit-report.md';\n\nconst DOCS_URL = 'https://posthog.com/docs/product-analytics/best-practices';\n\nexport const eventsAuditConfig: ProgramConfig = {\n command: 'events-audit',\n description: 'Audit PostHog event tracking in this project',\n id: 'events-audit',\n skillId: 'events-audit',\n steps: EVENTS_AUDIT_PROGRAM,\n // Top-level reportFile so AuditRunScreen can resolve the report path\n // synchronously without unwrapping the deferred `run` function.\n reportFile: SETUP_REPORT_FILE,\n allowedTools: ['Agent'],\n disallowedTools: [WIZARD_TOOL_NAMES.wizardAsk],\n\n run: (session: WizardSession): Promise<ProgramRun> => {\n const typeScriptDetected = isUsingTypeScript({\n installDir: session.installDir,\n });\n session.typescript = typeScriptDetected;\n\n // Seed the audit ledger so AuditRunScreen has something to render\n // before the agent emits its first check update.\n seedAuditLedger(session.installDir);\n session.frameworkContext[AUDIT_CHECKS_KEY] = AUDIT_SEED_CHECKS;\n\n return Promise.resolve({\n skillId: 'events-audit',\n integrationLabel: 'events-audit',\n spinnerMessage: SPINNER_MESSAGE,\n successMessage:\n 'Events audit complete! You can view the report at ./posthog-events-audit-report.md',\n estimatedDurationMinutes: 5,\n reportFile: SETUP_REPORT_FILE,\n docsUrl: DOCS_URL,\n errorMessage: 'Events audit failed',\n additionalFeatureQueue: session.additionalFeatureQueue,\n\n customPrompt: (ctx) =>\n `Audit PostHog event capture in this project. Do not modify any project files — produce a read-only report only.\n\nProject context:\n- PostHog Project ID: ${ctx.projectId}\n- TypeScript: ${typeScriptDetected ? 'Yes' : 'No'}\n- PostHog public token: ${ctx.projectApiKey}\n- PostHog Host: ${ctx.host}\n`,\n\n buildOutroData: (sess, _credentials, cloudRegion) => {\n const cloudUrl = cloudRegion\n ? getCloudUrlFromRegion(cloudRegion)\n : undefined;\n const continueUrl =\n sess.signup && cloudUrl\n ? `${cloudUrl}/products?source=wizard`\n : undefined;\n // The agent emits `[DASHBOARD_URL] <url>` once it creates the\n // dashboard; the SDK-message interceptor stores it on the session.\n // Fall back to the dashboards index if nothing was emitted.\n const dashboardUrl =\n sess.dashboardUrl ?? (cloudUrl ? `${cloudUrl}/dashboard` : undefined);\n\n return {\n kind: OutroKind.Success as const,\n message: 'Your events audit was successful',\n reportFile: SETUP_REPORT_FILE,\n changes: [],\n docsUrl: DOCS_URL,\n continueUrl,\n dashboardUrl,\n };\n },\n });\n },\n};\n\nexport { EVENTS_AUDIT_PROGRAM } from './steps.js';\n","import fs from 'fs';\nimport path from 'path';\nimport { AGENT_SKILL_STEPS, createSkillProgram } from '../agent-skill/index.js';\nimport type { ProgramStep, ProgramConfig } from '../program-step.js';\nimport type { ProgramRun } from '../../agent/agent-runner.js';\nimport type { WizardSession } from '../../wizard-session.js';\nimport { WIZARD_TOOL_NAMES } from '../../wizard-tools.js';\nimport { AUDIT_ABORT_CASES } from '../audit/detect.js';\nimport {\n AUDIT_CHECKS_FILE,\n AUDIT_CHECKS_KEY,\n type AuditCheck,\n} from '../audit/types.js';\nimport { AUDIT_SEED_CHECKS } from '../audit/seed.js';\nimport { logToFile } from '../../../utils/debug';\n\nconst AUDIT3000_REPORT_FILE = 'posthog-audit-3000-report.md';\n\n// Extra checks the v3000 audit adds on top of the base 10. IDs must match\n// those referenced in the audit-3000 skill's step files (Event Quality,\n// stale feature-flag review, session replay [fix + optimize], per-product\n// use-case expansion, and phase markers for the post-flags chain).\nconst AUDIT3000_EXTRA_CHECKS: AuditCheck[] = [\n // ── Event Quality (Step 5) ──\n {\n id: 'event-naming-standardization',\n area: 'Event Quality',\n label: 'Event naming convention is consistent',\n status: 'pending',\n },\n {\n id: 'event-duplicates-and-bloat',\n area: 'Event Quality',\n label: 'No duplicate or bloated event capture',\n status: 'pending',\n },\n {\n id: 'event-quality-context-review',\n area: 'Event Quality',\n label: 'Event property context reviewed',\n status: 'pending',\n },\n {\n id: 'event-usage-coverage',\n area: 'Event Quality',\n label: 'Captured events match insights / dashboards usage',\n status: 'pending',\n },\n // ── Feature Flags (Step 6) ──\n {\n id: 'stale-feature-flags-reviewed',\n area: 'Feature Flags',\n label: 'Stale feature flags reviewed',\n status: 'pending',\n },\n // ── Session Replay — fix (Step 6b) ──\n {\n id: 'replay-minimum-duration-set',\n area: 'Session Replay',\n label: 'Minimum duration set on init',\n status: 'pending',\n },\n {\n id: 'replay-mask-config',\n area: 'Session Replay',\n label: 'Mask config covers sensitive surfaces',\n status: 'pending',\n },\n {\n id: 'replay-disabled-in-test-envs',\n area: 'Session Replay',\n label: 'Disabled in test / CI environments',\n status: 'pending',\n },\n {\n id: 'replay-strict-minimum-duration',\n area: 'Session Replay',\n label: 'Strict minimum duration enforced',\n status: 'pending',\n },\n // ── Session Replay — optimize (Step 6b cost wave) ──\n {\n id: 'replay-sampling-rate',\n area: 'Session Replay — Optimize',\n label: 'Sampling rate tuned for cost',\n status: 'pending',\n },\n {\n id: 'replay-triggers-configured',\n area: 'Session Replay — Optimize',\n label: 'Triggers configured (event / URL / flag)',\n status: 'pending',\n },\n {\n id: 'replay-network-recording-filtered',\n area: 'Session Replay — Optimize',\n label: 'Network recording filtered',\n status: 'pending',\n },\n {\n id: 'replay-mobile-sampling',\n area: 'Session Replay — Optimize',\n label: 'Mobile sampling configured',\n status: 'pending',\n },\n // ── Use Case: Expansion (Step 9) ──\n {\n id: 'expansion-product-analytics',\n area: 'Use Case: Expansion',\n label: 'Product analytics coverage',\n status: 'pending',\n },\n {\n id: 'expansion-error-tracking',\n area: 'Use Case: Expansion',\n label: 'Error tracking coverage',\n status: 'pending',\n },\n {\n id: 'expansion-llm-observability',\n area: 'Use Case: Expansion',\n label: 'LLM observability coverage',\n status: 'pending',\n },\n {\n id: 'expansion-session-replay',\n area: 'Use Case: Expansion',\n label: 'Session replay coverage',\n status: 'pending',\n },\n {\n id: 'expansion-feature-flags',\n area: 'Use Case: Expansion',\n label: 'Feature flags coverage',\n status: 'pending',\n },\n {\n id: 'expansion-surveys',\n area: 'Use Case: Expansion',\n label: 'Surveys coverage',\n status: 'pending',\n },\n {\n id: 'expansion-logs',\n area: 'Use Case: Expansion',\n label: 'Logs coverage',\n status: 'pending',\n },\n {\n id: 'expansion-web-analytics',\n area: 'Use Case: Expansion',\n label: 'Web analytics coverage',\n status: 'pending',\n },\n // ── Additional Sections (Steps 7, 8, 10 phase markers) ──\n // Tracked in the ledger so the UI can surface \"did it run / was it\n // skipped\" alongside the regular checks. use-case-expansion is omitted\n // because the eight `expansion-*` checks above cover that phase.\n {\n id: 'customer-enrichment',\n area: 'Additional Sections',\n label: 'Customer enrichment (Harmonic + PDL)',\n status: 'pending',\n },\n {\n id: 'use-case-match',\n area: 'Additional Sections',\n label: 'Use-case match',\n status: 'pending',\n },\n {\n id: 'final-report',\n area: 'Additional Sections',\n label: 'Final audit report written',\n status: 'pending',\n },\n];\n\nconst AUDIT3000_SEED_CHECKS: AuditCheck[] = [\n ...AUDIT_SEED_CHECKS,\n ...AUDIT3000_EXTRA_CHECKS,\n];\n\n// Audit-3000 has its own arcade-flavoured intro / run / outro screens. The\n// shared audit screens stay reserved for the original `audit` program.\nconst AUDIT3000_SCREEN_BY_STEP: Record<string, string> = {\n intro: 'audit-3000-intro',\n run: 'audit-3000-run',\n outro: 'audit-3000-outro',\n};\n\nconst seedAudit3000Ledger = (installDir: string): void => {\n const target = path.join(installDir, AUDIT_CHECKS_FILE);\n const tmp = `${target}.tmp`;\n fs.writeFileSync(tmp, JSON.stringify(AUDIT3000_SEED_CHECKS, null, 2), 'utf8');\n fs.renameSync(tmp, target);\n logToFile(\n `seedAudit3000Ledger: wrote ${AUDIT3000_SEED_CHECKS.length} entries to ${target}`,\n );\n};\n\nconst seedBeforeAudit3000Run = (session: WizardSession): void => {\n seedAudit3000Ledger(session.installDir);\n session.frameworkContext[AUDIT_CHECKS_KEY] = AUDIT3000_SEED_CHECKS;\n};\n\nconst withAudit3000Screens = (steps: ProgramStep[]): ProgramStep[] =>\n steps.map((step) => {\n const override = AUDIT3000_SCREEN_BY_STEP[step.id];\n return override ? { ...step, screenId: override } : step;\n });\n\nconst audit3000Steps: ProgramStep[] = withAudit3000Screens(AGENT_SKILL_STEPS);\n\nconst baseConfig = createSkillProgram({\n skillId: 'audit-3000',\n command: 'audit-3000',\n id: 'audit-3000',\n description:\n 'Audit an existing PostHog integration (v3000 — adds event quality, stale-flag hygiene, customer enrichment, use-case match)',\n integrationLabel: 'audit-3000',\n customPrompt:\n 'Run the audit-3000 skill end-to-end. Follow the step chain starting at references/1-version.md. Do not modify any project files — only create the final audit report and (when enrichment is enabled) the enrichment report.',\n successMessage: `Audit complete! View the report at ./${AUDIT3000_REPORT_FILE}`,\n reportFile: AUDIT3000_REPORT_FILE,\n docsUrl: 'https://posthog.com/docs/product-analytics/best-practices',\n spinnerMessage: 'Running PostHog Audit 3000...',\n estimatedDurationMinutes: 6,\n requires: ['posthog-integration'],\n abortCases: AUDIT_ABORT_CASES,\n});\n\nconst audit3000Run = async (session: WizardSession): Promise<ProgramRun> => {\n seedBeforeAudit3000Run(session);\n\n if (!baseConfig.run) {\n throw new Error('audit-3000 program has no run configuration.');\n }\n\n return typeof baseConfig.run === 'function'\n ? baseConfig.run(session)\n : baseConfig.run;\n};\n\nexport const audit3000Config: ProgramConfig = {\n ...baseConfig,\n steps: audit3000Steps,\n run: audit3000Run,\n allowedTools: ['Agent'],\n disallowedTools: [WIZARD_TOOL_NAMES.wizardAsk],\n};\n","import type { ProgramStep } from '../program-step.js';\n\nexport const POSTHOG_DOCTOR_PROGRAM: ProgramStep[] = [\n {\n id: 'intro',\n label: 'Welcome',\n screenId: 'doctor-intro',\n gate: (session) => session.setupConfirmed,\n },\n {\n id: 'auth',\n label: 'Authentication',\n screenId: 'auth',\n isComplete: (session) => session.credentials !== null,\n },\n {\n id: 'report',\n label: 'Doctor report',\n screenId: 'doctor-report',\n isComplete: (session) => session.outroData !== null,\n },\n {\n id: 'outro',\n label: 'Done',\n screenId: 'outro',\n isComplete: (session) => session.outroDismissed,\n },\n];\n","import { z } from 'zod';\n\nexport const HealthIssueSeveritySchema = z.enum([\n 'critical',\n 'warning',\n 'info',\n]);\nexport type HealthIssueSeverity = z.infer<typeof HealthIssueSeveritySchema>;\n\nexport const HealthIssueStatusSchema = z.enum(['active', 'resolved']);\n\nexport const HealthIssueSchema = z.object({\n id: z.string(),\n kind: z.string(),\n severity: HealthIssueSeveritySchema,\n status: HealthIssueStatusSchema,\n dismissed: z.boolean(),\n created_at: z.string(),\n updated_at: z.string(),\n resolved_at: z.string().nullable().optional(),\n});\nexport type HealthIssue = z.infer<typeof HealthIssueSchema>;\n\nexport const HealthIssueListResponseSchema = z.object({\n results: z.array(HealthIssueSchema),\n count: z.number().optional(),\n next: z.string().nullable().optional(),\n previous: z.string().nullable().optional(),\n});\nexport type HealthIssueListResponse = z.infer<\n typeof HealthIssueListResponseSchema\n>;\n\nexport interface HealthIssueSummary {\n total: number;\n by_severity: Record<HealthIssueSeverity, number>;\n}\n","import axios from 'axios';\nimport { analytics } from '../../../utils/analytics';\nimport { handleApiError } from '../../api';\nimport { WIZARD_USER_AGENT } from '../../constants';\nimport { HealthIssueListResponseSchema, type HealthIssue } from './types';\n\nexport async function fetchHealthIssues(\n accessToken: string,\n baseUrl: string,\n projectId: number,\n): Promise<HealthIssue[]> {\n const endpoint = `/api/environments/${projectId}/health_issues/`;\n const url = `${baseUrl}${endpoint}?status=active&dismissed=false&limit=250`;\n try {\n const response = await axios.get(url, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n });\n return HealthIssueListResponseSchema.parse(response.data).results;\n } catch (error) {\n const apiError = handleApiError(error, 'fetch health issues');\n analytics.captureException(apiError, { endpoint, baseUrl, projectId });\n throw apiError;\n }\n}\n","import { POSTHOG_DOCS_URL } from '../../constants';\n\nexport interface KindMeta {\n title: string;\n description: string;\n docsUrl: string;\n}\n\nexport const KIND_METADATA: Record<string, KindMeta> = {\n ingestion_lag: {\n title: 'Ingestion is delayed',\n description:\n 'Events are being received but are taking longer than usual to appear.',\n docsUrl: `${POSTHOG_DOCS_URL}/support/troubleshooting`,\n },\n ingestion_warning: {\n title: 'Ingestion warnings on recent events',\n description:\n 'Some recent events were rejected or flagged by the ingestion pipeline.',\n docsUrl: `${POSTHOG_DOCS_URL}/support/troubleshooting`,\n },\n sdk_outdated: {\n title: 'SDK version is out of date',\n description:\n 'One or more SDKs are running an old version. Upgrade to get the latest fixes.',\n docsUrl: `${POSTHOG_DOCS_URL}/libraries`,\n },\n no_live_events: {\n title: 'No $pageview or $screen events in the last 30 days',\n description:\n 'PostHog is not receiving page or screen events from this project.',\n docsUrl: `${POSTHOG_DOCS_URL}/getting-started/install`,\n },\n no_pageleave_events: {\n title: '$pageleave events not being sent',\n description:\n 'Enable pageleave tracking to power bounce rate and session duration.',\n docsUrl: `${POSTHOG_DOCS_URL}/libraries/js#config`,\n },\n scroll_depth: {\n title: 'Scroll depth tracking disabled',\n description:\n 'Turn on scroll depth to capture how far users read each page.',\n docsUrl: `${POSTHOG_DOCS_URL}/libraries/js#config`,\n },\n authorized_urls: {\n title: 'No authorized URLs configured',\n description:\n 'Some web analytics filters require at least one authorized URL to work.',\n docsUrl: `${POSTHOG_DOCS_URL}/web-analytics/faq`,\n },\n reverse_proxy: {\n title: 'No reverse proxy detected',\n description: 'A reverse proxy reduces data loss from ad blockers.',\n docsUrl: `${POSTHOG_DOCS_URL}/advanced/proxy`,\n },\n web_vitals: {\n title: 'Web Vitals tracking disabled',\n description:\n 'Enable Web Vitals to capture LCP, CLS and other performance metrics.',\n docsUrl: `${POSTHOG_DOCS_URL}/web-analytics/web-vitals`,\n },\n materialized_view_failure: {\n title: 'A materialized view is failing',\n description: 'A data modeling pipeline failed its most recent run.',\n docsUrl: `${POSTHOG_DOCS_URL}/data-warehouse`,\n },\n external_data_failure: {\n title: 'External data source is failing',\n description: 'An external data source sync failed and data may be stale.',\n docsUrl: `${POSTHOG_DOCS_URL}/data-warehouse/sources`,\n },\n};\n\nexport const UNKNOWN_KIND_META: KindMeta = {\n title: 'Unknown issue',\n description:\n 'PostHog reported an issue kind the wizard does not yet recognize.',\n docsUrl: POSTHOG_DOCS_URL,\n};\n\nexport function getKindMeta(kind: string): KindMeta {\n return KIND_METADATA[kind] ?? { ...UNKNOWN_KIND_META, title: kind };\n}\n","import type { ProgramConfig } from '../program-step.js';\nimport { WIZARD_TOOL_NAMES } from '../../wizard-tools.js';\nimport { POSTHOG_DOCTOR_PROGRAM } from './steps.js';\n\nexport const posthogDoctorConfig: ProgramConfig = {\n command: 'doctor',\n description:\n 'Diagnose your PostHog project for configuration issues and setup warnings',\n id: 'posthog-doctor',\n steps: POSTHOG_DOCTOR_PROGRAM,\n allowedTools: ['Agent'],\n disallowedTools: [WIZARD_TOOL_NAMES.wizardAsk],\n};\n\nexport { POSTHOG_DOCTOR_PROGRAM } from './steps.js';\nexport { fetchHealthIssues } from './fetch.js';\nexport { getKindMeta, KIND_METADATA } from './kind-metadata.js';\nexport type { KindMeta } from './kind-metadata.js';\nexport type {\n HealthIssue,\n HealthIssueSeverity,\n HealthIssueSummary,\n} from './types.js';\n","import type { ProgramStep } from '../program-step.js';\nimport { RunPhase } from '../../wizard-session.js';\n\nexport const MIGRATION_PROGRAM: ProgramStep[] = [\n {\n id: 'intro',\n label: 'Welcome',\n screenId: 'migration-intro',\n gate: (session) => session.setupConfirmed,\n },\n {\n id: 'auth',\n label: 'Authentication',\n screenId: 'auth',\n isComplete: (session) => session.credentials !== null,\n },\n {\n id: 'run',\n label: 'Migration',\n screenId: 'run',\n isComplete: (session) =>\n session.runPhase === RunPhase.Completed ||\n session.runPhase === RunPhase.Error,\n },\n {\n id: 'outro',\n label: 'Done',\n screenId: 'outro',\n isComplete: (session) => session.outroDismissed,\n },\n {\n id: 'skills',\n label: 'Skills',\n screenId: 'keep-skills',\n },\n];\n","/**\n * Vendor cost stack — the multi-tool baseline a typical migration target has\n * before consolidating onto PostHog. Numbers from each vendor's published\n * starter pricing.\n */\n\nimport { Text } from 'ink';\nimport type { ContentBlock } from '../../../../ui/tui/primitives/content-types.js';\n\nexport const VENDOR_STACK_BLOCK: ContentBlock = {\n type: 'lines',\n interval: 600,\n pause: 9000,\n lines: [\n <Text bold>{' Typical pre-migration stack'}</Text>,\n <Text> </Text>,\n <Text>\n <Text color=\"gray\">{' Sentry'}</Text>\n <Text>{' error tracking '}</Text>\n <Text color=\"red\">{'$26/mo+'}</Text>\n </Text>,\n <Text>\n <Text color=\"gray\">{' LaunchDarkly'}</Text>\n <Text>{' feature flags '}</Text>\n <Text color=\"red\">{'$8.33/mo+'}</Text>\n </Text>,\n <Text>\n <Text color=\"gray\">{' Amplitude'}</Text>\n <Text>{' product analytics '}</Text>\n <Text color=\"red\">{'$49/mo+'}</Text>\n </Text>,\n <Text>\n <Text color=\"gray\">{' Braintrust'}</Text>\n <Text>{' LLM analytics '}</Text>\n <Text color=\"red\">{'$50/mo+'}</Text>\n </Text>,\n <Text color=\"gray\">{' ─────────────────────────────────────'}</Text>,\n <Text>\n <Text>{' Total'}</Text>\n <Text>{' '}</Text>\n <Text bold color=\"red\">\n {'$133/mo+'}\n </Text>\n </Text>,\n <Text dimColor>{' plus ~450KB of JavaScript SDKs'}</Text>,\n ],\n};\n","/**\n * PostHog free-tier highlights — the numbers a migrating team gets back when\n * they consolidate. Sourced from posthog.com/pricing.md.\n */\n\nimport { Text } from 'ink';\nimport { Colors } from '../../../../ui/tui/styles.js';\nimport type { ContentBlock } from '../../../../ui/tui/primitives/content-types.js';\n\nexport const FREE_TIER_BLOCK: ContentBlock = {\n type: 'lines',\n interval: 400,\n pause: 9000,\n lines: [\n <Text bold>{' Free every month, on every product'}</Text>,\n <Text> </Text>,\n <Text>\n <Text color={Colors.accent}>{' 1,000,000 '}</Text>\n <Text>events </Text>\n <Text dimColor>product analytics</Text>\n </Text>,\n <Text>\n <Text color={Colors.accent}>{' 1,000,000 '}</Text>\n <Text>requests </Text>\n <Text dimColor>feature flags + experiments</Text>\n </Text>,\n <Text>\n <Text color={Colors.accent}>{' 5,000 '}</Text>\n <Text>recordings </Text>\n <Text dimColor>session replay</Text>\n </Text>,\n <Text>\n <Text color={Colors.accent}>{' 100,000 '}</Text>\n <Text>exceptions </Text>\n <Text dimColor>error tracking</Text>\n </Text>,\n <Text>\n <Text color={Colors.accent}>{' 100,000 '}</Text>\n <Text>events </Text>\n <Text dimColor>LLM analytics</Text>\n </Text>,\n <Text>\n <Text color={Colors.accent}>{' 50 GB '}</Text>\n <Text>logs </Text>\n <Text dimColor>logs</Text>\n </Text>,\n <Text>\n <Text color={Colors.accent}>{' 1,500 '}</Text>\n <Text>responses </Text>\n <Text dimColor>surveys</Text>\n </Text>,\n <Text>\n <Text color={Colors.accent}>{' 1,000,000 '}</Text>\n <Text>rows </Text>\n <Text dimColor>data warehouse</Text>\n </Text>,\n ],\n};\n","/**\n * Pricing structure block — what happens after the free tier.\n */\n\nimport { Text } from 'ink';\nimport { Colors } from '../../../../ui/tui/styles.js';\nimport type { ContentBlock } from '../../../../ui/tui/primitives/content-types.js';\n\nexport const PRICING_STRUCTURE_BLOCK: ContentBlock = {\n type: 'lines',\n interval: 500,\n pause: 8000,\n lines: [\n <Text bold>{' After the free tier'}</Text>,\n <Text> </Text>,\n <Text>\n <Text color={Colors.accent}>{' $0 '}</Text>\n <Text>base price · pay only for what you use</Text>\n </Text>,\n <Text>\n <Text color={Colors.accent}>{' ◆ '}</Text>\n <Text>per-event prices decrease with volume</Text>\n </Text>,\n <Text>\n <Text color={Colors.accent}>{' ◆ '}</Text>\n <Text>no per-seat charges — your whole team is included</Text>\n </Text>,\n <Text>\n <Text color={Colors.accent}>{' ◆ '}</Text>\n <Text>web analytics bundled with product analytics</Text>\n </Text>,\n <Text>\n <Text color={Colors.accent}>{' ◆ '}</Text>\n <Text>experiments bundled with feature flags</Text>\n </Text>,\n <Text>\n <Text color={Colors.accent}>{' ◆ '}</Text>\n <Text>revenue analytics bundled with data warehouse</Text>\n </Text>,\n ],\n};\n","/**\n * Migration learn deck (statsig variant). Statsig is the only `migrate`\n * variant today, so this deck plays as-is when the wizard runs\n * `migrate --product=statsig`. Three movements:\n *\n * 1. Welcome and reassure.\n * 2. What to expect — the migration is replacement-only, takes a few\n * minutes, leaves the build green.\n * 3. What's a little different — how flags and experiments work in\n * PostHog, presented as right-way guidance rather than gotchas.\n *\n * FF/experiments guidance paraphrased from PostHog public docs:\n * - posthog.com/docs/feature-flags/best-practices\n * - posthog.com/docs/feature-flags/common-questions\n * - posthog.com/docs/experiments/best-practices\n */\n\nimport { Text } from 'ink';\nimport type { WizardStore } from '../../../../ui/tui/store.js';\nimport { Colors } from '../../../../ui/tui/styles.js';\nimport { TextRevealMode } from '../../../../ui/tui/primitives/TextBlock.js';\nimport type { ContentBlock } from '../../../../ui/tui/primitives/content-types.js';\nimport { StatusPeekTrigger } from '../../../../ui/tui/components/StatusPeekTrigger.js';\nimport { PRODUCT_SUITE_BLOCK } from '../../posthog-integration/content/product-suite.js';\nimport { LINE_CHART_BLOCK } from '../../posthog-integration/content/line-chart.js';\nimport { FUNNEL_BLOCK } from '../../posthog-integration/content/funnel.js';\nimport { VENDOR_STACK_BLOCK } from './vendor-stack.js';\nimport { FREE_TIER_BLOCK } from './free-tier.js';\nimport { PRICING_STRUCTURE_BLOCK } from './pricing-structure.js';\n\nexport const getContentBlocks = (store?: WizardStore): ContentBlock[] => [\n // ── Welcome ────────────────────────────────────────────────────────────\n {\n content: 'Hello.',\n pause: 3000,\n mode: TextRevealMode.Typewriter,\n animationInterval: 160,\n },\n\n { content: 'The Wizard is an agent.', pause: 4000 },\n\n {\n content:\n 'As we speak, it’s making a plan to migrate from Statsig to PostHog.',\n pause: 6000,\n },\n\n {\n content: 'PostHog covers the cost of running this agent.',\n pause: 4000,\n },\n\n { type: 'clear', pause: 2000 },\n\n {\n pause: 5000,\n persist: true,\n content: <StatusPeekTrigger store={store} />,\n },\n\n {\n pause: 6000,\n persist: true,\n content: (\n <Text>\n Press{' '}\n <Text color={Colors.accent} bold>\n S\n </Text>{' '}\n to expand or collapse the status.\n </Text>\n ),\n },\n\n { type: 'clear', pause: 2000 },\n\n // ── What to expect ─────────────────────────────────────────────────────\n { content: 'Here’s what to expect.', pause: 3000 },\n\n { content: 'The migration takes about ten minutes.', pause: 3000 },\n\n {\n content:\n 'Every Statsig call gets replaced in place with its PostHog equivalent.',\n pause: 5500,\n },\n\n {\n content:\n 'Nothing new gets added. No extra captures, no surprise instrumentation.',\n pause: 5500,\n },\n\n {\n content:\n 'The Statsig package gets removed at the end. We’ll run build and lint to clean up after ourselves.',\n pause: 6500,\n },\n\n { type: 'clear', pause: 2000 },\n\n // ── What's a little different ─────────────────────────────────────────\n {\n content: 'A few things work a little differently in PostHog.',\n pause: 4500,\n },\n\n {\n content: (\n <Text>\n Flags evaluate against a stable user. Call{' '}\n <Text bold color={Colors.accent}>\n identify()\n </Text>{' '}\n first, then check the flag.\n </Text>\n ),\n pause: 6000,\n persist: true,\n },\n\n {\n content:\n 'For anything in the first paint, evaluate server-side and bootstrap the values into the client.',\n pause: 6500,\n },\n\n {\n content: (\n <Text>\n In production, route requests through a reverse proxy to avoid ad\n blockers breaking your flags.{'\\n'}\n <Text dimColor>https://posthog.com/docs/advanced/proxy</Text>\n </Text>\n ),\n pause: 6500,\n persist: true,\n },\n\n {\n content:\n 'When a flag reaches 100% rollout, retire it. Flags are signals, not switches.',\n pause: 5500,\n },\n\n {\n content: (\n <Text>\n Name flags descriptively. No double negatives. Reflect the return type.{' '}\n <Text dimColor>For example </Text>\n <Text bold>show-new-checkout</Text>\n <Text dimColor>.</Text>\n </Text>\n ),\n pause: 6500,\n persist: true,\n },\n\n { type: 'clear', pause: 1500 },\n\n // ── Experiments ────────────────────────────────────────────────────────\n {\n content: (\n <Text bold color={Colors.accent}>\n Experiments\n </Text>\n ),\n pause: 2500,\n persist: true,\n },\n\n {\n content:\n 'Change one thing per variant. Multiple changes in one variant blur the result.',\n pause: 5500,\n },\n\n {\n content:\n 'Decide the running time up front. PostHog includes a sample-size and duration calculator in the setup flow.',\n pause: 6500,\n },\n\n {\n content: 'Roll out to 5–10% first. Watch the metrics. Then increase.',\n pause: 5000,\n },\n\n {\n content:\n 'Exclude users who already completed the flow. They can’t be affected by the test.',\n pause: 5500,\n },\n\n { type: 'clear', pause: 1500 },\n\n // ── Close ──────────────────────────────────────────────────────────────\n {\n content: 'Flags and experiments live alongside the rest of your data.',\n pause: 4500,\n },\n\n {\n content: 'Ship behind a flag, watch replays, check analytics for impact.',\n pause: 4500,\n },\n\n { type: 'clear', pause: 1500 },\n\n {\n content:\n 'PostHog also provides every other analytics and AI tool to build your product.',\n pause: 4500,\n },\n\n PRODUCT_SUITE_BLOCK,\n\n { type: 'clear', pause: 1500 },\n\n {\n content: 'And consolidating onto one platform saves real money.',\n pause: 4500,\n },\n\n { content: 'Here’s the math.', pause: 1500 },\n\n VENDOR_STACK_BLOCK,\n\n { type: 'clear', pause: 1500 },\n\n {\n content: 'Pricing is usage-based, with a generous free tier.',\n pause: 4000,\n },\n\n FREE_TIER_BLOCK,\n\n { type: 'clear', pause: 1500 },\n\n PRICING_STRUCTURE_BLOCK,\n\n { type: 'clear', pause: 1500 },\n\n {\n content: 'Gain clarity and really understand your users.',\n pause: 4000,\n },\n\n { content: 'Use trends to measure growth.', pause: 2500 },\n\n LINE_CHART_BLOCK,\n\n { type: 'clear', pause: 500 },\n\n { content: 'Use funnels to reveal bottlenecks.', pause: 2500 },\n\n FUNNEL_BLOCK,\n];\n","import type { ProgramConfig } from '../program-step.js';\nimport type { AbortCase } from '../../agent/agent-runner.js';\nimport { WIZARD_TOOL_NAMES } from '../../wizard-tools.js';\nimport { MIGRATION_PROGRAM } from './steps.js';\nimport { getContentBlocks } from './content/index.js';\n\nconst MIGRATION_REPORT_FILE = 'migration-report.md';\n\nconst MIGRATION_ABORT_CASES: AbortCase[] = [\n {\n match: /^no source-sdk calls found$/i,\n message: 'No source-SDK calls found',\n body:\n 'The migration needs an existing third-party SDK to migrate from. No ' +\n 'calls to the source SDK appear anywhere in this project. If you ' +\n \"haven't installed PostHog yet, you don't need this command — run \" +\n '`npx @posthog/wizard@latest` to add PostHog from scratch.',\n },\n];\n\n/**\n * Map each `--product=<id>` choice to the context-mill skill ID that handles\n * it. Adding a variant: drop a new row here. The CLI `choices` and the\n * runtime lookup both read from this map, so the two stay in sync.\n */\nconst PRODUCT_TO_SKILL_ID = {\n statsig: 'migrate-statsig',\n} as const;\n\ntype MigrateProduct = keyof typeof PRODUCT_TO_SKILL_ID;\nconst MIGRATE_PRODUCTS = Object.keys(PRODUCT_TO_SKILL_ID) as MigrateProduct[];\n\nexport const migrationConfig: ProgramConfig = {\n command: 'migrate',\n description: 'Migrate to PostHog from another analytics provider',\n id: 'migration',\n skillId: PRODUCT_TO_SKILL_ID.statsig,\n steps: MIGRATION_PROGRAM,\n reportFile: MIGRATION_REPORT_FILE,\n getContentBlocks,\n allowedTools: ['Agent'],\n disallowedTools: [WIZARD_TOOL_NAMES.wizardAsk],\n cliOptions: {\n product: {\n describe: 'Source SDK to migrate from',\n type: 'string',\n choices: MIGRATE_PRODUCTS,\n demandOption: true,\n },\n },\n mapCliOptions: (argv) => ({\n skillId: PRODUCT_TO_SKILL_ID[argv.product as MigrateProduct],\n }),\n run: {\n skillId: PRODUCT_TO_SKILL_ID.statsig,\n integrationLabel: 'migration',\n customPrompt: () =>\n 'Migrate this project from its existing third-party analytics, ' +\n 'feature-flag, and observability tools to PostHog. Run the `migrate` ' +\n 'skill end-to-end: follow the step chain starting at ' +\n 'references/1-presence.md. Only replace existing source-SDK call sites ' +\n 'with PostHog equivalents — make zero unrelated changes and no ' +\n `net-new instrumentation. The final report is written to ./${MIGRATION_REPORT_FILE}.`,\n successMessage: `Migration complete! View the report at ./${MIGRATION_REPORT_FILE}`,\n reportFile: MIGRATION_REPORT_FILE,\n docsUrl: '',\n spinnerMessage: 'Migrating to PostHog...',\n estimatedDurationMinutes: 8,\n abortCases: MIGRATION_ABORT_CASES,\n },\n requires: ['posthog-integration'],\n};\n\nexport { MIGRATION_PROGRAM } from './steps.js';\n","/**\n * MCP add/remove programs.\n *\n * These don't run the agent pipeline — they're TUI-only flows invoked\n * by the `mcp add` / `mcp remove` subcommands in bin.ts. They live in\n * the program registry so the screen sequence is derived alongside\n * every other program (no special-cases in screen-sequences.ts).\n */\n\nimport type { ProgramConfig } from '../program-step.js';\n\nexport const mcpAddConfig: ProgramConfig = {\n id: 'mcp-add',\n description: 'Add PostHog MCP server to supported clients',\n steps: [\n {\n id: 'mcp-add',\n label: 'Add MCP server',\n screenId: 'mcp-add',\n isComplete: (s) => s.mcpComplete,\n },\n ],\n};\n\nexport const mcpRemoveConfig: ProgramConfig = {\n id: 'mcp-remove',\n description: 'Remove PostHog MCP server from supported clients',\n steps: [\n {\n id: 'mcp-remove',\n label: 'Remove MCP server',\n screenId: 'mcp-remove',\n isComplete: (s) => s.mcpComplete,\n },\n ],\n};\n","/**\n * Central registry of all wizard programs.\n *\n * Adding a new program:\n * 1. Create src/lib/programs/<name>/ with index.ts exporting a ProgramConfig\n * 2. Import and add it to PROGRAM_REGISTRY below\n * 3. (If custom intro screen) add to src/ui/tui/screen-registry.tsx\n *\n * screen-sequences.ts, store.ts, and bin.ts all derive their wiring from\n * this array — no need to touch those files when adding a program.\n */\n\nimport type { ProgramConfig } from './program-step.js';\nimport { posthogIntegrationConfig } from './posthog-integration/index.js';\nimport { revenueAnalyticsConfig } from './revenue-analytics/index.js';\nimport { auditConfig } from './audit/index.js';\nimport { eventsAuditConfig } from './events-audit/index.js';\nimport { audit3000Config } from './audit-3000/index.js';\nimport { posthogDoctorConfig } from './posthog-doctor/index.js';\nimport { migrationConfig } from './migration/index.js';\nimport { AGENT_SKILL_STEPS } from './agent-skill/index.js';\nimport { getContentBlocks as agentSkillContentBlocks } from './agent-skill/content/index.js';\nimport { mcpAddConfig, mcpRemoveConfig } from './mcp/index.js';\n\n// Generic skill program — invoked when the wizard runs an arbitrary\n// context-mill skill chosen at runtime (session.skillId) rather than a\n// registered named program. No CLI command, no run config.\nconst agentSkillConfig: ProgramConfig = {\n id: 'agent-skill',\n description: 'Run an arbitrary context-mill skill',\n steps: AGENT_SKILL_STEPS,\n getContentBlocks: agentSkillContentBlocks,\n allowedTools: ['Agent'],\n};\n\nexport const PROGRAM_REGISTRY = [\n posthogIntegrationConfig,\n revenueAnalyticsConfig,\n auditConfig,\n eventsAuditConfig,\n audit3000Config,\n posthogDoctorConfig,\n migrationConfig,\n agentSkillConfig,\n mcpAddConfig,\n mcpRemoveConfig,\n] as const satisfies readonly ProgramConfig[];\n\n/**\n * Typed program names. Values come from each config's `id`, so there's\n * no parallel string list to keep in sync — adding `Program.Foo` here is\n * just exposing `fooConfig.id` under a friendly name for call sites.\n */\nexport const Program = {\n PostHogIntegration: posthogIntegrationConfig.id,\n RevenueAnalyticsSetup: revenueAnalyticsConfig.id,\n Migration: migrationConfig.id,\n Audit: auditConfig.id,\n EventsAudit: eventsAuditConfig.id,\n Audit3000: audit3000Config.id,\n PosthogDoctor: posthogDoctorConfig.id,\n AgentSkill: agentSkillConfig.id,\n McpAdd: mcpAddConfig.id,\n McpRemove: mcpRemoveConfig.id,\n} as const;\n\n/** Compile-time union of every registered program id. */\nexport type ProgramId = (typeof PROGRAM_REGISTRY)[number]['id'];\n\n/**\n * Look up a program config by its id. `ProgramId` is a union of every\n * registered id, so the lookup is statically guaranteed to find a match\n * — the `!` is a load-bearing assertion of that invariant, not a hope.\n */\nexport function getProgramConfig(id: ProgramId): ProgramConfig {\n return PROGRAM_REGISTRY.find((c) => c.id === id)!;\n}\n\n/** All program configs that are exposed as CLI subcommands. */\nexport function getSubcommandPrograms(): ProgramConfig[] {\n return PROGRAM_REGISTRY.filter((c) => c.command != null);\n}\n","#!/usr/bin/env node\nimport { satisfies } from 'semver';\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 // eslint-disable-next-line no-console\n console.log(\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 { isNonInteractiveEnvironment } from './src/utils/environment';\nimport { getUI, setUI } from './src/ui';\nimport { LoggingUI } from './src/ui/logging-ui';\nimport {\n getSubcommandPrograms,\n Program,\n} from './src/lib/programs/program-registry';\nimport type { ProgramConfig } from './src/lib/programs/program-step';\nimport type { WizardSession } from './src/lib/wizard-session';\nimport { POSTHOG_DOCS_URL } from './src/lib/constants';\nimport { runtimeEnv } from '@env';\n\n// Test mock server — only loaded when NODE_ENV is 'test'.\n// In production builds, tsdown replaces process.env.NODE_ENV with 'production',\n// making this block dead code.\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\n/** Shared yargs options for skill-based program subcommands. */\nconst skillSubcommandOptions = {\n debug: {\n default: false,\n describe: 'Enable verbose logging',\n type: 'boolean' as const,\n },\n 'install-dir': {\n describe: 'Directory to install in',\n type: 'string' as const,\n },\n 'local-mcp': {\n default: false,\n describe: 'Use local MCP server',\n type: 'boolean' as const,\n },\n benchmark: {\n default: false,\n describe: 'Run in benchmark mode',\n type: 'boolean' as const,\n },\n 'yara-report': {\n default: false,\n describe: 'Print YARA scanner summary',\n type: 'boolean' as const,\n hidden: true,\n },\n};\n\nconst cli = yargs(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 signup (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 skill: {\n describe:\n 'Run a specific context-mill skill by ID\\nenv: POSTHOG_WIZARD_SKILL',\n type: 'string',\n },\n name: {\n describe:\n 'Name for account creation with --ci --signup\\nenv: POSTHOG_WIZARD_NAME',\n type: 'string',\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n\n // CI mode validation and TTY check\n if (options.ci) {\n if (!options.region) options.region = 'us';\n if (!options.installDir) {\n setUI(new LoggingUI());\n getUI().intro('PostHog Wizard');\n getUI().log.error(\n 'CI mode requires --install-dir (directory to install in)',\n );\n process.exit(1);\n return;\n }\n if (!options.apiKey && !options.signup) {\n setUI(new LoggingUI());\n getUI().intro('PostHog Wizard');\n getUI().log.error(\n 'CI mode requires --api-key (personal API key phx_xxx). ' +\n 'To create a new account instead, use --signup --email you@example.com.',\n );\n process.exit(1);\n return;\n }\n if (!options.apiKey && options.signup && !options.email) {\n setUI(new LoggingUI());\n getUI().intro('PostHog Wizard');\n getUI().log.error(\n 'CI --signup requires --email to create a new account.',\n );\n process.exit(1);\n return;\n }\n // Warn (don't fail) on unexpected key prefix — `phx_` is the personal\n // API key the LLM Gateway expects.\n if (options.apiKey) {\n const apiKeyValue = String(options.apiKey);\n if (!apiKeyValue.startsWith('phx_')) {\n setUI(new LoggingUI());\n getUI().intro('PostHog Wizard');\n const prefix = apiKeyValue.slice(0, 4);\n let hint = '';\n if (prefix === 'pha_') {\n hint =\n ' (pha_ is an OAuth access token — CI mode expects a personal API key)';\n } else if (prefix === 'phc_') {\n hint =\n ' (phc_ is a project/client key — CI mode expects a personal API key)';\n }\n getUI().log.warn(\n `--api-key does not start with \"phx_\"${hint}. Continuing anyway, but the LLM Gateway may reject it with a 401.`,\n );\n }\n }\n void (async () => {\n // If --signup but no existing key, provision a new account first and\n // use its personal API key for the rest of the CI install.\n if (!options.apiKey && options.signup) {\n setUI(new LoggingUI());\n getUI().intro('PostHog Wizard');\n try {\n const { provisionNewAccount } = await import(\n './src/utils/provisioning.js'\n );\n const signupRegion = (options.region as string).toUpperCase() as\n | 'US'\n | 'EU';\n getUI().log.info(\n `Provisioning new PostHog account for ${String(\n options.email,\n )} in ${signupRegion}...`,\n );\n const result = await provisionNewAccount(\n options.email as string,\n options.name ?? '',\n signupRegion,\n );\n if (!result.personalApiKey) {\n getUI().log.error(\n 'Provisioning succeeded but no personal API key was returned — cannot continue install.',\n );\n process.exit(1);\n return;\n }\n getUI().log.success('Account ready.');\n getUI().log.info(` Project API Key: ${result.projectApiKey}`);\n getUI().log.info(` Personal API Key: ${result.personalApiKey}`);\n getUI().log.info(` Host: ${result.host}`);\n options.apiKey = result.personalApiKey;\n if (options.projectId == null) {\n options.projectId = result.projectId;\n }\n } catch (error) {\n const msg =\n error instanceof Error ? error.message : String(error);\n getUI().log.error(`Provisioning failed: ${msg}`);\n process.exit(1);\n return;\n }\n }\n\n const { posthogIntegrationConfig } = await import(\n './src/lib/programs/posthog-integration/index.js'\n );\n const { FRAMEWORK_REGISTRY } = await import('./src/lib/registry.js');\n const { detectFramework, gatherFrameworkContext } = await import(\n './src/lib/detection/index.js'\n );\n const { analytics } = await import('./src/utils/analytics.js');\n const { wizardAbort } = await import('./src/utils/wizard-abort.js');\n\n // preRun: honor --integration, else auto-detect, then gather\n // framework context. Bypasses onReady hooks by design.\n runWizardCI(posthogIntegrationConfig, options, async (session) => {\n const integration =\n session.integration ??\n (await detectFramework(session.installDir));\n if (!integration) {\n await wizardAbort({\n message:\n 'Could not auto-detect your framework. Please specify --integration on the command line.',\n });\n return;\n }\n session.integration = integration;\n analytics.setTag('integration', integration);\n\n const frameworkConfig = FRAMEWORK_REGISTRY[integration];\n session.frameworkConfig = frameworkConfig;\n\n const context = await gatherFrameworkContext(frameworkConfig, {\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: true,\n menu: session.menu,\n benchmark: session.benchmark,\n yaraReport: session.yaraReport,\n });\n for (const [key, value] of Object.entries(context)) {\n if (!(key in session.frameworkContext)) {\n session.frameworkContext[key] = value;\n }\n }\n });\n })().catch(() => {\n process.exit(1);\n });\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 if (options.skill) {\n // Run a specific skill by ID\n void (async () => {\n const { createSkillProgram } = await import(\n './src/lib/programs/agent-skill/index.js'\n );\n const skillId = options.skill as string;\n const config = createSkillProgram({\n skillId,\n command: 'skill',\n id: 'agent-skill',\n description: `Run skill: ${skillId}`,\n integrationLabel: skillId,\n successMessage: `${skillId} completed!`,\n reportFile: `posthog-${skillId}-report.md`,\n docsUrl: POSTHOG_DOCS_URL,\n spinnerMessage: `Running ${skillId}...`,\n estimatedDurationMinutes: 5,\n });\n runWizard(config, { ...options, skillId });\n })();\n } else {\n // Interactive TTY: run core-integration through the unified program path.\n // Same codepath as `npx @posthog/wizard integrate`.\n void (async () => {\n const { posthogIntegrationConfig } = await import(\n './src/lib/programs/posthog-integration/index.js'\n );\n runWizard(posthogIntegrationConfig, options);\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 tui = startTUI(WIZARD_VERSION, Program.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 tui = startTUI(WIZARD_VERSION, Program.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\ncli.command(\n 'provision',\n 'Create a new PostHog account (headless, no TUI)',\n (yargs) => {\n return yargs\n .options({\n email: {\n describe: 'Email address for the new account',\n type: 'string' as const,\n demandOption: true,\n },\n region: {\n describe: 'Cloud region (us or eu)',\n choices: ['us', 'eu'] as const,\n default: 'us',\n },\n name: {\n describe: 'Name for the new account',\n type: 'string' as const,\n default: '',\n },\n json: {\n describe:\n 'Emit JSON result to stdout (defaults to true when stdout is not a TTY)',\n type: 'boolean' as const,\n },\n })\n .example('wizard provision --email matt+test@posthog.com --region us', '')\n .example(\n 'wizard provision --email user@example.com --region eu --json',\n '',\n );\n },\n (argv) => {\n const email = argv.email;\n const region = argv.region.toUpperCase() as 'US' | 'EU';\n const name = argv.name ?? '';\n const jsonMode =\n argv.json === undefined ? !process.stdout.isTTY : argv.json;\n\n if (!jsonMode) {\n setUI(new LoggingUI());\n }\n\n void (async () => {\n try {\n const { provisionNewAccount } = await import(\n './src/utils/provisioning.js'\n );\n if (!jsonMode) {\n getUI().log.info(`Provisioning account for ${email} in ${region}...`);\n }\n const result = await provisionNewAccount(email, name, region);\n if (jsonMode) {\n process.stdout.write(`${JSON.stringify(result)}\\n`);\n } else {\n getUI().log.success('Account provisioned successfully:');\n getUI().log.info(` API Key: ${result.projectApiKey}`);\n getUI().log.info(` Host: ${result.host}`);\n getUI().log.info(` Project ID: ${result.projectId}`);\n getUI().log.info(` Account ID: ${result.accountId}`);\n getUI().log.info(` Access Token: ${result.accessToken}`);\n getUI().log.info(` Refresh Token: ${result.refreshToken}`);\n if (result.personalApiKey) {\n getUI().log.info(` Personal API Key: ${result.personalApiKey}`);\n }\n }\n process.exit(0);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n const code = msg.includes('already associated')\n ? 'email_exists'\n : 'provisioning_failed';\n if (jsonMode) {\n process.stderr.write(`${JSON.stringify({ error: msg, code })}\\n`);\n } else {\n getUI().log.error(`Provisioning failed: ${msg}`);\n }\n process.exit(1);\n }\n })();\n },\n);\n\n// ── Skill-based program subcommands (derived from registry) ─────────\nfor (const programConfig of getSubcommandPrograms()) {\n cli.command(\n programConfig.command!,\n programConfig.description,\n (y) =>\n y.options({\n ...skillSubcommandOptions,\n ...(programConfig.cliOptions ?? {}),\n }),\n (argv) => {\n const extras =\n programConfig.mapCliOptions?.(argv as Record<string, unknown>) ?? {};\n const options = { ...argv, ...extras };\n if (options.ci) {\n runWizardCI(programConfig, options);\n } else {\n runWizard(programConfig, options);\n }\n },\n );\n}\n\ncli\n .help()\n .alias('help', 'h')\n .version()\n .alias('version', 'v')\n .wrap(process.stdout.isTTY ? cli.terminalWidth() : 80).argv;\n\n/**\n * Run a full wizard program in the TUI. Handles the full lifecycle: start TUI,\n * build session, run detection, wait for intro gate, execute the\n * agent pipeline, wait for outro dismissal, then exit.\n */\nfunction runWizard(\n config: ProgramConfig,\n options: Record<string, unknown>,\n): void {\n void (async () => {\n try {\n const installDir = (options.installDir as string) || process.cwd();\n\n const { startTUI } = await import('./src/ui/tui/start-tui.js');\n const { buildSession } = await import('./src/lib/wizard-session.js');\n const { TaskStreamPush } = await import('./src/lib/task-stream/index.js');\n const { FileDestination } = await import(\n './src/lib/task-stream/destinations/file.js'\n );\n const { PostHogDestination } = await import(\n './src/lib/task-stream/destinations/posthog.js'\n );\n const { analytics } = await import('./src/utils/analytics.js');\n\n const tui = startTUI(WIZARD_VERSION, config.id as any);\n\n const session = buildSession({\n debug: options.debug as boolean | undefined,\n forceInstall: options.forceInstall as boolean | undefined,\n localMcp: options.localMcp as boolean | undefined,\n installDir,\n ci: false,\n signup: options.signup as boolean | undefined,\n apiKey: options.apiKey as string | undefined,\n projectId: options.projectId as string | undefined,\n email: options.email as string | undefined,\n menu: options.menu as boolean | undefined,\n integration: options.integration as any,\n benchmark: options.benchmark as boolean | undefined,\n yaraReport: options.yaraReport as boolean | undefined,\n });\n session.programLabel = config.id;\n if (options.skillId) {\n session.skillId = options.skillId as string;\n } else if (config.skillId) {\n session.skillId = config.skillId;\n }\n\n tui.store.session = session;\n\n // Task stream — pushes state to external consumers on task changes\n const taskStream = new TaskStreamPush({\n store: tui.store,\n programId: config.id,\n destinations: [new FileDestination(), new PostHogDestination()],\n });\n tui.store.onTasksChanged = () => void taskStream.push();\n\n await tui.store.runReadyHooks();\n await tui.store.getGate('intro');\n await tui.store.getGate('health-check');\n\n const skipAgent = config.run == null;\n\n if (skipAgent) {\n const { getOrAskForProjectData } = await import(\n './src/utils/setup-utils.js'\n );\n const { projectApiKey, host, accessToken, projectId } =\n await getOrAskForProjectData({\n signup: session.signup,\n ci: session.ci,\n apiKey: session.apiKey,\n projectId: session.projectId,\n });\n tui.store.setCredentials({\n accessToken,\n projectApiKey,\n host,\n projectId,\n });\n } else {\n const { runAgent } = await import('./src/lib/agent/agent-runner.js');\n await runAgent(config, tui.store.session);\n }\n\n const isDone = (): boolean =>\n skipAgent\n ? tui.store.session.outroDismissed\n : tui.store.session.skillsComplete;\n\n await new Promise<void>((resolve) => {\n const unsub = tui.store.subscribe(() => {\n if (isDone()) {\n unsub();\n resolve();\n }\n });\n if (isDone()) {\n unsub();\n resolve();\n }\n });\n\n try {\n await taskStream.dispose();\n } catch (error) {\n analytics.captureException(error as Error);\n }\n tui.unmount();\n process.exit(0);\n } catch (err) {\n if (runtimeEnv('DEBUG') || runtimeEnv('POSTHOG_WIZARD_DEBUG')) {\n console.error('TUI init failed:', err); // eslint-disable-line no-console\n }\n }\n })();\n}\n\n/**\n * CI-mode pipeline shared by every non-interactive entry point.\n *\n * Validates flags, builds a `ci:true` session, runs `preRun` (or the\n * program's `onReady` hooks by default), executes `runAgent`, and\n * routes any failure through `wizardAbort`. `wizardAbort` owns all\n * exits — never add a raw `process.exit` here.\n */\nfunction runWizardCI(\n config: ProgramConfig,\n options: Record<string, unknown>,\n preRun?: (session: WizardSession) => Promise<void>,\n): void {\n setUI(new LoggingUI());\n if (!options.region) options.region = 'us';\n if (!options.apiKey) {\n getUI().intro('PostHog Wizard');\n getUI().log.error('CI mode requires --api-key (personal API key phx_xxx)');\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 in)',\n );\n process.exit(1);\n }\n\n void (async () => {\n const path = await import('path');\n const { buildSession } = await import('./src/lib/wizard-session.js');\n const { readEnvironment } = await import('./src/utils/environment.js');\n const { readApiKeyFromEnv } = await import('./src/utils/env-api-key.js');\n const { configureLogFileFromEnvironment, logToFile } = await import(\n './src/utils/debug.js'\n );\n const { wizardAbort, WizardError } = await import(\n './src/utils/wizard-abort.js'\n );\n\n configureLogFileFromEnvironment();\n\n const env = readEnvironment();\n const apiKey =\n (options.apiKey as string) ?? readApiKeyFromEnv() ?? undefined;\n const installDir = path.isAbsolute(options.installDir as string)\n ? (options.installDir as string)\n : path.join(process.cwd(), options.installDir as string);\n\n const session = buildSession({\n debug: options.debug as boolean | undefined,\n forceInstall: options.forceInstall as boolean | undefined,\n installDir,\n ci: true,\n signup: options.signup as boolean | undefined,\n localMcp: options.localMcp as boolean | undefined,\n apiKey,\n email: options.email as string | undefined,\n menu: options.menu as boolean | undefined,\n integration: options.integration as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n projectId: options.projectId as string | undefined,\n benchmark: options.benchmark as boolean | undefined,\n yaraReport: options.yaraReport as boolean | undefined,\n ...env,\n });\n session.programLabel = config.id;\n if (config.skillId) {\n session.skillId = config.skillId;\n }\n const runDef = typeof config.run === 'object' ? config.run : null;\n\n getUI().intro('Welcome to the PostHog setup wizard');\n getUI().log.info(`Running ${config.id} in CI mode`);\n\n try {\n if (preRun) {\n await preRun(session);\n } else {\n // Run onReady hooks against a minimal store-less context.\n const readyCtx = {\n session,\n setFrameworkContext: (key: string, value: unknown) => {\n session.frameworkContext[key] = value;\n },\n setFrameworkConfig: () => undefined,\n setDetectedFramework: () => undefined,\n setUnsupportedVersion: () => undefined,\n addDiscoveredFeature: () => undefined,\n setDetectionComplete: () => undefined,\n };\n for (const step of config.steps) {\n if (step.onReady) {\n await step.onReady(readyCtx);\n }\n }\n\n // Surface detectError written by the program's detect hook.\n const detectError = session.frameworkContext.detectError as\n | { kind: string; [k: string]: unknown }\n | undefined;\n if (detectError) {\n await wizardAbort({\n message: `Prerequisites not met: ${detectError.kind}\\n\\nSee ${\n runDef?.docsUrl ?? POSTHOG_DOCS_URL\n }`,\n error: new WizardError(`${config.id} prerequisites failed`, {\n integration: config.id,\n detect_error_kind: detectError.kind,\n }),\n });\n }\n }\n\n const { runAgent } = await import('./src/lib/agent/agent-runner.js');\n await runAgent(config, session);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n const errorStack =\n error instanceof Error && error.stack ? error.stack : undefined;\n\n logToFile(`[bin.ts CI] ERROR: ${errorMessage}`);\n if (errorStack) logToFile(`[bin.ts CI] STACK: ${errorStack}`);\n\n const debugInfo = session.debug && errorStack ? `\\n\\n${errorStack}` : '';\n const docsUrl =\n session.frameworkConfig?.metadata.docsUrl ??\n runDef?.docsUrl ??\n POSTHOG_DOCS_URL;\n await wizardAbort({\n message: `Something went wrong: ${errorMessage}\\n\\nYou can read the documentation at ${docsUrl} to set up manually.${debugInfo}`,\n error: error as Error,\n });\n }\n })().catch(() => {\n process.exit(1);\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,MAAM,UACJ,OAAO,kBAAkB,aACrB,gBACC,cAAsB;AAM7B,SAAgB,8BAAuC;AAKrD,KAAI,CAAC,QAAQ,OAAO,SAAS,CAAC,QAAQ,OAAO,MAC3C,QAAO;AAGT,QAAO;;AAGT,SAAgB,kBAA2C;AAGzD,QAFe,QAAQ,iBAAiB;;;;ACV1C,MAAa,eAAe;CAC1B;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,cAAc;CACzB;CACA;CACA;CACD;;AAyBD,MAAa,sBAAmC,CAC9C;CAEE,OAAO;CACP,SAAS;CACT,MACE;CAGF,SAAS;CACV,EACD;CAEE,OAAO;CACP,SAAS;CACT,MACE;CAGF,SAAS;CACV,CACF;;;;;AAMD,SAAS,iBAAiB,YAAoB,WAAW,GAAmB;CAC1E,MAAM,UAA0B,EAAE;CAElC,SAAS,KAAK,KAAa,OAAqB;AAC9C,MAAI,QAAQ,SAAU;EAEtB,IAAI;AACJ,MAAI;AACF,aAAU,YAAY,KAAK,EAAE,eAAe,MAAM,CAAC;UAC7C;AACN;;AAGF,OAAK,MAAM,SAAS,SAAS;AAC3B,OAAI,MAAM,KAAK,WAAW,IAAI,IAAI,MAAM,SAAS,IAAK;AACtD,OAAI,aAAa,IAAI,MAAM,KAAK,CAAE;GAElC,MAAM,WAAW,KAAK,KAAK,MAAM,KAAK;AAEtC,OAAI,MAAM,QAAQ,IAAI,MAAM,SAAS,eACnC,KAAI;IACF,MAAM,MAAM,KAAK,MAAM,aAAa,UAAU,QAAQ,CAAC;IAIvD,MAAM,WAAW,CACf,GAAG,OAAO,KAAK,IAAI,gBAAgB,EAAE,CAAC,EACtC,GAAG,OAAO,KAAK,IAAI,mBAAmB,EAAE,CAAC,CAC1C;IACD,MAAM,cAAc,SAAS,QAAQ,MAAM,aAAa,SAAS,EAAE,CAAC;IACpE,MAAM,aAAa,SAAS,QAAQ,MAAM,YAAY,SAAS,EAAE,CAAC;AAClE,YAAQ,KAAK;KACX,MAAM,SAAS,YAAY,SAAS,IAAI;KACxC;KACA;KACD,CAAC;WACI;YAGC,MAAM,aAAa,CAC5B,MAAK,UAAU,QAAQ,EAAE;;;AAK/B,MAAK,YAAY,EAAE;AACnB,QAAO;;;;;;;;;AAUT,SAAgB,2BACd,SACA,qBACM;CACN,MAAM,QAAQ,UACZ,oBAAoB,eAAe,MAAM;CAE3C,MAAM,aAAa,QAAQ;AAG3B,KAAI,CAAC,WAAW,WAAW,EAAE;AAC3B,OAAK;GAAE,MAAM;GAAiB,MAAM;GAAY,QAAQ;GAAW,CAAC;AACpE;;AAEF,KAAI;AACF,MAAI,CAAC,SAAS,WAAW,CAAC,aAAa,EAAE;AACvC,QAAK;IAAE,MAAM;IAAiB,MAAM;IAAY,QAAQ;IAAW,CAAC;AACpE;;SAEI;AACN,OAAK;GAAE,MAAM;GAAiB,MAAM;GAAY,QAAQ;GAAc,CAAC;AACvE;;CAIF,MAAM,UAAU,iBAAiB,WAAW;AAE5C,KAAI,QAAQ,WAAW,GAAG;AACxB,OAAK,EAAE,MAAM,mBAAmB,CAAC;AACjC;;CAIF,MAAM,iCAAiB,IAAI,KAAa;CACxC,MAAM,gCAAgB,IAAI,KAAa;AACvC,MAAK,MAAM,SAAS,SAAS;AAC3B,OAAK,MAAM,OAAO,MAAM,YAAa,gBAAe,IAAI,IAAI;AAC5D,OAAK,MAAM,OAAO,MAAM,WAAY,eAAc,IAAI,IAAI;;CAG5D,MAAM,sBAAsB,CAAC,GAAG,eAAe;CAC/C,MAAM,qBAAqB,CAAC,GAAG,cAAc;AAE7C,KAAI,oBAAoB,WAAW,KAAK,mBAAmB,WAAW,GAAG;AACvE,OAAK;GAAE,MAAM;GAAW,cAAc,QAAQ;GAAQ,CAAC;AACvD;;AAGF,KAAI,oBAAoB,WAAW,GAAG;AACpC,OAAK;GAAE,MAAM;GAAmB,aAAa;GAAoB,CAAC;AAClE;;AAGF,KAAI,mBAAmB,WAAW,GAAG;AACnC,OAAK;GAAE,MAAM;GAAkB,cAAc;GAAqB,CAAC;AACnE;;AAGF,qBAAoB,uBAAuB,oBAAoB;AAC/D,qBAAoB,sBAAsB,mBAAmB;AAC7D,qBACE,wBACA,QACG,QAAQ,MAAM,EAAE,YAAY,SAAS,KAAK,EAAE,WAAW,SAAS,EAAE,CAClE,KAAK,MAAM,EAAE,KAAK,CACtB;;;;AC5LH,MAAa,4BAA2C;CACtD;EACE,IAAI;EACJ,OAAO;EAKP,UAAU,QACR,2BAA2B,IAAI,SAAS,IAAI,oBAAoB;EACnE;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,OAAO,YAAY,QAAQ;EAC5B;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,aAAa,YAAY,QAAQ,gBAAgB;EAClD;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,aAAa,YACX,QAAQ,aAAA,eACR,QAAQ,aAAA;EACX;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,aAAa,YAAY,QAAQ;EAClC;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACX;CACF;;;;;;;;AC1CD,MAAaA,sBAAoB,UAAwC;AAEvE,QAAO;EACL;GACE,SAAS;GACT,OAAO;GACP,MAAA;GACA,mBAAmB;GACpB;EACD;GAAE,SAAS;GAA2B,OAAO;GAAM;EACnD;GACE,OAAO;GACP,SACE,qBAAC,MAAD,EAAA,UAAA;IAAM;IACQ,oBAAC,MAAD;KAAM,OAAM;eAbhB,OAAO,QAAQ,WAAW;KAaa,CAAA;;IAC1C,EAAA,CAAA;GAEV;EACF;;;;ACvBH,MAAa,yBAAwC;CACnD,SAAS;CACT,aAAa;CACb,IAAI;CACJ,OAAO;CACP,kBAAA;CACA,cAAc,CAAC,QAAQ;CACvB,iBAAiB,CAAC,kBAAkB,UAAU;CAC9C,KAAK;EACH,SAAS;EACT,kBAAkB;EAClB,oBAAoB;EACpB,gBAAgB;EAChB,YAAY;EACZ,SAAS;EACT,gBAAgB;EAChB,0BAA0B;EAC1B,YAAY;EACb;CACD,UAAU,CAAC,sBAAsB;CAClC;;;AChBD,MAAa,oBAAmC;CAC9C;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,OAAO,YAAY,QAAQ;EAC5B;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,aAAa,YAAY,QAAQ,gBAAgB;EAClD;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,aAAa,YACX,QAAQ,aAAA,eACR,QAAQ,aAAA;EACX;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,aAAa,YAAY,QAAQ;EAClC;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACX;CACF;;;;ACUD,SAAgB,mBAAmB,MAA0C;AAC3E,QAAO;EACL,SAAS,KAAK;EACd,aAAa,KAAK;EAClB,IAAI,KAAK;EACT,SAAS,KAAK;EACd,OAAO;EACP,YAAY,KAAK;EACjB,kBAAA;EACA,KAAK;GACH,SAAS,KAAK;GACd,kBAAkB,KAAK;GACvB,cAAc,KAAK,qBAAqB,KAAK,eAAgB,KAAA;GAC7D,gBAAgB,KAAK;GACrB,YAAY,KAAK;GACjB,SAAS,KAAK;GACd,gBAAgB,KAAK;GACrB,0BAA0B,KAAK;GAC/B,gBAAgB,KAAK;GACrB,YAAY,KAAK;GAClB;EACD,UAAU,KAAK;EAChB;;;;;;ACtEH,MAAa,oBAAiC,CAC5C;CACE,OAAO;CACP,SAAS;CACT,MACE;CAGF,SAAS;CACV,CACF;;;;ACRD,MAAa,oBAAkC;CAC7C;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACF;;AAGD,SAAgB,gBAAgB,YAA0B;CACxD,MAAM,SAAS,KAAK,KAAK,YAAY,kBAAkB;CACvD,MAAM,MAAM,GAAG,OAAO;AACtB,IAAG,cAAc,KAAK,KAAK,UAAU,mBAAmB,MAAM,EAAE,EAAE,OAAO;AACzE,IAAG,WAAW,KAAK,OAAO;AAC1B,WACE,0BAA0B,kBAAkB,OAAO,cAAc,SAClE;;;;;ACnEH,MAAM,uBAA+C;CACnD,OAAO;CACP,KAAK;CACL,OAAO;CACR;AAED,MAAM,sBAAsB,YAAiC;AAC3D,iBAAgB,QAAQ,WAAW;AACnC,SAAQ,iBAAiB,oBAAoB;;AAG/C,MAAM,oBAAoB,UACxB,MAAM,KAAK,SAAS;CAClB,MAAM,WAAW,qBAAqB,KAAK;AAC3C,QAAO,WAAW;EAAE,GAAG;EAAM,UAAU;EAAU,GAAG;EACpD;AAEJ,MAAM,aAA4B,iBAAiB,kBAAkB;AAErE,MAAMC,eAAa,mBAAmB;CACpC,SAAS;CACT,SAAS;CACT,IAAI;CACJ,aACE;CACF,kBAAkB;CAClB,cACE;CACF,gBACE;CACF,YAAY;CACZ,SAAS;CACT,gBAAgB;CAChB,0BAA0B;CAC1B,UAAU,CAAC,sBAAsB;CACjC,YAAY;CACb,CAAC;AAEF,MAAM,WAAW,OAAO,YAAgD;AACtE,oBAAmB,QAAQ;AAE3B,KAAI,CAACA,aAAW,IACd,OAAM,IAAI,MAAM,0CAA0C;AAG5D,QAAO,OAAOA,aAAW,QAAQ,aAC7BA,aAAW,IAAI,QAAQ,GACvBA,aAAW;;AAGjB,MAAa,cAA6B;CACxC,GAAGA;CACH,OAAO;CACP,KAAK;CACL,cAAc,CAAC,QAAQ;CACvB,iBAAiB,CAAC,kBAAkB,UAAU;CAC/C;;;AC9CD,SAAS,WAAW,SAAiC;CACnD,MAAM,SAAS,QAAQ;AACvB,KAAI,CAAC,QAAQ,SAAS,OAAO,UAAW,QAAO;AAE/C,QAAO,OAAO,SAAS,MAAM,UAAU,MACpC,MAAuB,EAAE,EAAE,OAAO,QAAQ,kBAC5C;;AAGH,SAAS,iBAAiB,SAAiC;AACzD,KAAI,CAAC,QAAQ,gBAAiB,QAAO;AAErC,KAAI,QAAQ,QAAQ;EAClB,MAAM,eAAe,uBACnB,QAAQ,gBAAgB,QACxB,+BACD;EACD,MAAM,kBAAkB,uBACtB,QAAQ,gBAAgB,OACzB;AACD,MAAI,aAAa,WAAW,KAAK,gBAAgB,WAAW,EAAG,QAAO;AACtE,SAAO,QAAQ;;AAGjB,KAAI,QAAQ,gBAAgB,aAAA,KAC1B,QAAO,QAAQ;AAEjB,QAAO;;AAGT,MAAa,uBAAsC;CACjD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,OAAO,YAAY,QAAQ;EAC5B;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,MAAM;EACN,SAAS,QAAQ;AACf,4BAAyB,CACtB,MAAM,cAAc;AACnB,QAAI,mBAAmB,UAAU;KACjC,CACD,YAAY;AACX,QAAI,mBAAmB;KACrB,UAAA;KACA,QAAQ,EAAE;KACV,SAAS,EAAE;KACZ,CAAC;KACF;;EAEP;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,MAAM;EACN,aAAa,YAAY,CAAC,WAAW,QAAQ;EAC9C;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,aAAa,YAAY,QAAQ,gBAAgB;EAClD;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,aAAa,YACX,QAAQ,aAAA,eACR,QAAQ,aAAA;EACX;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,aAAa,YAAY,QAAQ;EAClC;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,aAAa,YAAY,QAAQ;EAClC;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACX;CACF;;;ACtGD,MAAa,oBAAoB;AAEjC,MAAM,WAAW;AAEjB,MAAa,oBAAmC;CAC9C,SAAS;CACT,aAAa;CACb,IAAI;CACJ,SAAS;CACT,OAAO;CAGP,YAAY;CACZ,cAAc,CAAC,QAAQ;CACvB,iBAAiB,CAAC,kBAAkB,UAAU;CAE9C,MAAM,YAAgD;EACpD,MAAM,qBAAqB,kBAAkB,EAC3C,YAAY,QAAQ,YACrB,CAAC;AACF,UAAQ,aAAa;AAIrB,kBAAgB,QAAQ,WAAW;AACnC,UAAQ,iBAAiB,oBAAoB;AAE7C,SAAO,QAAQ,QAAQ;GACrB,SAAS;GACT,kBAAkB;GAClB,gBAAgB;GAChB,gBACE;GACF,0BAA0B;GAC1B,YAAY;GACZ,SAAS;GACT,cAAc;GACd,wBAAwB,QAAQ;GAEhC,eAAe,QACb;;;wBAGgB,IAAI,UAAU;gBACtB,qBAAqB,QAAQ,KAAK;0BACxB,IAAI,cAAc;kBAC1B,IAAI,KAAK;;GAGrB,iBAAiB,MAAM,cAAc,gBAAgB;IACnD,MAAM,WAAW,cACb,sBAAsB,YAAY,GAClC,KAAA;AAWJ,WAAO;KACL,MAAA;KACA,SAAS;KACT,YAAY;KACZ,SAAS,EAAE;KACX,SAAS;KACT,aAfA,KAAK,UAAU,WACX,GAAG,SAAS,2BACZ,KAAA;KAcJ,cATA,KAAK,iBAAiB,WAAW,GAAG,SAAS,cAAc,KAAA;KAU5D;;GAEJ,CAAC;;CAEL;;;ACvED,MAAM,wBAAwB;AAM9B,MAAM,yBAAuC;CAE3C;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CAED;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CAED;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CAED;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CAED;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CAKD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACF;AAED,MAAM,wBAAsC,CAC1C,GAAG,mBACH,GAAG,uBACJ;AAID,MAAM,2BAAmD;CACvD,OAAO;CACP,KAAK;CACL,OAAO;CACR;AAED,MAAM,uBAAuB,eAA6B;CACxD,MAAM,SAAS,KAAK,KAAK,YAAY,kBAAkB;CACvD,MAAM,MAAM,GAAG,OAAO;AACtB,IAAG,cAAc,KAAK,KAAK,UAAU,uBAAuB,MAAM,EAAE,EAAE,OAAO;AAC7E,IAAG,WAAW,KAAK,OAAO;AAC1B,WACE,8BAA8B,sBAAsB,OAAO,cAAc,SAC1E;;AAGH,MAAM,0BAA0B,YAAiC;AAC/D,qBAAoB,QAAQ,WAAW;AACvC,SAAQ,iBAAiB,oBAAoB;;AAG/C,MAAM,wBAAwB,UAC5B,MAAM,KAAK,SAAS;CAClB,MAAM,WAAW,yBAAyB,KAAK;AAC/C,QAAO,WAAW;EAAE,GAAG;EAAM,UAAU;EAAU,GAAG;EACpD;AAEJ,MAAM,iBAAgC,qBAAqB,kBAAkB;AAE7E,MAAM,aAAa,mBAAmB;CACpC,SAAS;CACT,SAAS;CACT,IAAI;CACJ,aACE;CACF,kBAAkB;CAClB,cACE;CACF,gBAAgB,wCAAwC;CACxD,YAAY;CACZ,SAAS;CACT,gBAAgB;CAChB,0BAA0B;CAC1B,UAAU,CAAC,sBAAsB;CACjC,YAAY;CACb,CAAC;AAEF,MAAM,eAAe,OAAO,YAAgD;AAC1E,wBAAuB,QAAQ;AAE/B,KAAI,CAAC,WAAW,IACd,OAAM,IAAI,MAAM,+CAA+C;AAGjE,QAAO,OAAO,WAAW,QAAQ,aAC7B,WAAW,IAAI,QAAQ,GACvB,WAAW;;AAGjB,MAAa,kBAAiC;CAC5C,GAAG;CACH,OAAO;CACP,KAAK;CACL,cAAc,CAAC,QAAQ;CACvB,iBAAiB,CAAC,kBAAkB,UAAU;CAC/C;;;ACxPD,MAAa,yBAAwC;CACnD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,OAAO,YAAY,QAAQ;EAC5B;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,aAAa,YAAY,QAAQ,gBAAgB;EAClD;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,aAAa,YAAY,QAAQ,cAAc;EAChD;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,aAAa,YAAY,QAAQ;EAClC;CACF;;;ACzBD,MAAa,4BAA4B,EAAE,KAAK;CAC9C;CACA;CACA;CACD,CAAC;AAGF,MAAa,0BAA0B,EAAE,KAAK,CAAC,UAAU,WAAW,CAAC;AAErE,MAAa,oBAAoB,EAAE,OAAO;CACxC,IAAI,EAAE,QAAQ;CACd,MAAM,EAAE,QAAQ;CAChB,UAAU;CACV,QAAQ;CACR,WAAW,EAAE,SAAS;CACtB,YAAY,EAAE,QAAQ;CACtB,YAAY,EAAE,QAAQ;CACtB,aAAa,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU;CAC9C,CAAC;AAGF,MAAa,gCAAgC,EAAE,OAAO;CACpD,SAAS,EAAE,MAAM,kBAAkB;CACnC,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU;CACtC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU;CAC3C,CAAC;;;ACtBF,eAAsB,kBACpB,aACA,SACA,WACwB;CACxB,MAAM,WAAW,qBAAqB,UAAU;CAChD,MAAM,MAAM,GAAG,UAAU,SAAS;AAClC,KAAI;EACF,MAAM,WAAW,MAAM,MAAM,IAAI,KAAK,EACpC,SAAS;GACP,eAAe,UAAU;GACzB,cAAc;GACf,EACF,CAAC;AACF,SAAO,8BAA8B,MAAM,SAAS,KAAK,CAAC;UACnD,OAAO;EACd,MAAM,WAAW,eAAe,OAAO,sBAAsB;AAC7D,YAAU,iBAAiB,UAAU;GAAE;GAAU;GAAS;GAAW,CAAC;AACtE,QAAM;;;;;AChBV,MAAa,gBAA0C;CACrD,eAAe;EACb,OAAO;EACP,aACE;EACF,SAAS,GAAG,iBAAiB;EAC9B;CACD,mBAAmB;EACjB,OAAO;EACP,aACE;EACF,SAAS,GAAG,iBAAiB;EAC9B;CACD,cAAc;EACZ,OAAO;EACP,aACE;EACF,SAAS,GAAG,iBAAiB;EAC9B;CACD,gBAAgB;EACd,OAAO;EACP,aACE;EACF,SAAS,GAAG,iBAAiB;EAC9B;CACD,qBAAqB;EACnB,OAAO;EACP,aACE;EACF,SAAS,GAAG,iBAAiB;EAC9B;CACD,cAAc;EACZ,OAAO;EACP,aACE;EACF,SAAS,GAAG,iBAAiB;EAC9B;CACD,iBAAiB;EACf,OAAO;EACP,aACE;EACF,SAAS,GAAG,iBAAiB;EAC9B;CACD,eAAe;EACb,OAAO;EACP,aAAa;EACb,SAAS,GAAG,iBAAiB;EAC9B;CACD,YAAY;EACV,OAAO;EACP,aACE;EACF,SAAS,GAAG,iBAAiB;EAC9B;CACD,2BAA2B;EACzB,OAAO;EACP,aAAa;EACb,SAAS,GAAG,iBAAiB;EAC9B;CACD,uBAAuB;EACrB,OAAO;EACP,aAAa;EACb,SAAS,GAAG,iBAAiB;EAC9B;CACF;AAED,MAAa,oBAA8B;CACzC,OAAO;CACP,aACE;CACF,SAAS;CACV;AAED,SAAgB,YAAY,MAAwB;AAClD,QAAO,cAAc,SAAS;EAAE,GAAG;EAAmB,OAAO;EAAM;;;;AC9ErE,MAAa,sBAAqC;CAChD,SAAS;CACT,aACE;CACF,IAAI;CACJ,OAAO;CACP,cAAc,CAAC,QAAQ;CACvB,iBAAiB,CAAC,kBAAkB,UAAU;CAC/C;;;ACTD,MAAa,oBAAmC;CAC9C;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,OAAO,YAAY,QAAQ;EAC5B;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,aAAa,YAAY,QAAQ,gBAAgB;EAClD;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,aAAa,YACX,QAAQ,aAAA,eACR,QAAQ,aAAA;EACX;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,aAAa,YAAY,QAAQ;EAClC;CACD;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACX;CACF;;;;;;;;AC1BD,MAAa,qBAAmC;CAC9C,MAAM;CACN,UAAU;CACV,OAAO;CACP,OAAO;EACL,oBAAC,MAAD;GAAM,MAAA;aAAM;GAAuC,CAAA;EACnD,oBAAC,MAAD,EAAA,UAAM,KAAQ,CAAA;EACd,qBAAC,MAAD,EAAA,UAAA;GACE,oBAAC,MAAD;IAAM,OAAM;cAAQ;IAAkB,CAAA;GACtC,oBAAC,MAAD,EAAA,UAAO,iCAAuC,CAAA;GAC9C,oBAAC,MAAD;IAAM,OAAM;cAAO;IAAiB,CAAA;GAC/B,EAAA,CAAA;EACP,qBAAC,MAAD,EAAA,UAAA;GACE,oBAAC,MAAD;IAAM,OAAM;cAAQ;IAAwB,CAAA;GAC5C,oBAAC,MAAD,EAAA,UAAO,2BAAiC,CAAA;GACxC,oBAAC,MAAD;IAAM,OAAM;cAAO;IAAmB,CAAA;GACjC,EAAA,CAAA;EACP,qBAAC,MAAD,EAAA,UAAA;GACE,oBAAC,MAAD;IAAM,OAAM;cAAQ;IAAqB,CAAA;GACzC,oBAAC,MAAD,EAAA,UAAO,8BAAoC,CAAA;GAC3C,oBAAC,MAAD;IAAM,OAAM;cAAO;IAAiB,CAAA;GAC/B,EAAA,CAAA;EACP,qBAAC,MAAD,EAAA,UAAA;GACE,oBAAC,MAAD;IAAM,OAAM;cAAQ;IAAsB,CAAA;GAC1C,oBAAC,MAAD,EAAA,UAAO,6BAAmC,CAAA;GAC1C,oBAAC,MAAD;IAAM,OAAM;cAAO;IAAiB,CAAA;GAC/B,EAAA,CAAA;EACP,oBAAC,MAAD;GAAM,OAAM;aAAQ;GAAiD,CAAA;EACrE,qBAAC,MAAD,EAAA,UAAA;GACE,oBAAC,MAAD,EAAA,UAAO,WAAiB,CAAA;GACxB,oBAAC,MAAD,EAAA,UAAO,kCAAwC,CAAA;GAC/C,oBAAC,MAAD;IAAM,MAAA;IAAK,OAAM;cACd;IACI,CAAA;GACF,EAAA,CAAA;EACP,oBAAC,MAAD;GAAM,UAAA;aAAU;GAA0C,CAAA;EAC3D;CACF;;;;;;;ACrCD,MAAa,kBAAgC;CAC3C,MAAM;CACN,UAAU;CACV,OAAO;CACP,OAAO;EACL,oBAAC,MAAD;GAAM,MAAA;aAAM;GAA8C,CAAA;EAC1D,oBAAC,MAAD,EAAA,UAAM,KAAQ,CAAA;EACd,qBAAC,MAAD,EAAA,UAAA;GACE,oBAAC,MAAD;IAAM,OAAO,OAAO;cAAS;IAAuB,CAAA;GACpD,oBAAC,MAAD,EAAA,UAAM,WAAc,CAAA;GACpB,oBAAC,MAAD;IAAM,UAAA;cAAS;IAAwB,CAAA;GAClC,EAAA,CAAA;EACP,qBAAC,MAAD,EAAA,UAAA;GACE,oBAAC,MAAD;IAAM,OAAO,OAAO;cAAS;IAAuB,CAAA;GACpD,oBAAC,MAAD,EAAA,UAAM,aAAgB,CAAA;GACtB,oBAAC,MAAD;IAAM,UAAA;cAAS;IAAkC,CAAA;GAC5C,EAAA,CAAA;EACP,qBAAC,MAAD,EAAA,UAAA;GACE,oBAAC,MAAD;IAAM,OAAO,OAAO;cAAS;IAAuB,CAAA;GACpD,oBAAC,MAAD,EAAA,UAAM,eAAkB,CAAA;GACxB,oBAAC,MAAD;IAAM,UAAA;cAAS;IAAqB,CAAA;GAC/B,EAAA,CAAA;EACP,qBAAC,MAAD,EAAA,UAAA;GACE,oBAAC,MAAD;IAAM,OAAO,OAAO;cAAS;IAAuB,CAAA;GACpD,oBAAC,MAAD,EAAA,UAAM,eAAkB,CAAA;GACxB,oBAAC,MAAD;IAAM,UAAA;cAAS;IAAqB,CAAA;GAC/B,EAAA,CAAA;EACP,qBAAC,MAAD,EAAA,UAAA;GACE,oBAAC,MAAD;IAAM,OAAO,OAAO;cAAS;IAAuB,CAAA;GACpD,oBAAC,MAAD,EAAA,UAAM,WAAc,CAAA;GACpB,oBAAC,MAAD;IAAM,UAAA;cAAS;IAAoB,CAAA;GAC9B,EAAA,CAAA;EACP,qBAAC,MAAD,EAAA,UAAA;GACE,oBAAC,MAAD;IAAM,OAAO,OAAO;cAAS;IAAuB,CAAA;GACpD,oBAAC,MAAD,EAAA,UAAM,SAAY,CAAA;GAClB,oBAAC,MAAD;IAAM,UAAA;cAAS;IAAW,CAAA;GACrB,EAAA,CAAA;EACP,qBAAC,MAAD,EAAA,UAAA;GACE,oBAAC,MAAD;IAAM,OAAO,OAAO;cAAS;IAAuB,CAAA;GACpD,oBAAC,MAAD,EAAA,UAAM,cAAiB,CAAA;GACvB,oBAAC,MAAD;IAAM,UAAA;cAAS;IAAc,CAAA;GACxB,EAAA,CAAA;EACP,qBAAC,MAAD,EAAA,UAAA;GACE,oBAAC,MAAD;IAAM,OAAO,OAAO;cAAS;IAAuB,CAAA;GACpD,oBAAC,MAAD,EAAA,UAAM,SAAY,CAAA;GAClB,oBAAC,MAAD;IAAM,UAAA;cAAS;IAAqB,CAAA;GAC/B,EAAA,CAAA;EACR;CACF;;;;;;ACjDD,MAAa,0BAAwC;CACnD,MAAM;CACN,UAAU;CACV,OAAO;CACP,OAAO;EACL,oBAAC,MAAD;GAAM,MAAA;aAAM;GAA+B,CAAA;EAC3C,oBAAC,MAAD,EAAA,UAAM,KAAQ,CAAA;EACd,qBAAC,MAAD,EAAA,UAAA,CACE,oBAAC,MAAD;GAAM,OAAO,OAAO;aAAS;GAAe,CAAA,EAC5C,oBAAC,MAAD,EAAA,UAAM,0CAA6C,CAAA,CAC9C,EAAA,CAAA;EACP,qBAAC,MAAD,EAAA,UAAA,CACE,oBAAC,MAAD;GAAM,OAAO,OAAO;aAAS;GAAc,CAAA,EAC3C,oBAAC,MAAD,EAAA,UAAM,yCAA4C,CAAA,CAC7C,EAAA,CAAA;EACP,qBAAC,MAAD,EAAA,UAAA,CACE,oBAAC,MAAD;GAAM,OAAO,OAAO;aAAS;GAAc,CAAA,EAC3C,oBAAC,MAAD,EAAA,UAAM,qDAAwD,CAAA,CACzD,EAAA,CAAA;EACP,qBAAC,MAAD,EAAA,UAAA,CACE,oBAAC,MAAD;GAAM,OAAO,OAAO;aAAS;GAAc,CAAA,EAC3C,oBAAC,MAAD,EAAA,UAAM,gDAAmD,CAAA,CACpD,EAAA,CAAA;EACP,qBAAC,MAAD,EAAA,UAAA,CACE,oBAAC,MAAD;GAAM,OAAO,OAAO;aAAS;GAAc,CAAA,EAC3C,oBAAC,MAAD,EAAA,UAAM,0CAA6C,CAAA,CAC9C,EAAA,CAAA;EACP,qBAAC,MAAD,EAAA,UAAA,CACE,oBAAC,MAAD;GAAM,OAAO,OAAO;aAAS;GAAc,CAAA,EAC3C,oBAAC,MAAD,EAAA,UAAM,iDAAoD,CAAA,CACrD,EAAA,CAAA;EACR;CACF;;;;;;;;;;;;;;;;;;;ACVD,MAAa,oBAAoB,UAAwC;CAEvE;EACE,SAAS;EACT,OAAO;EACP,MAAA;EACA,mBAAmB;EACpB;CAED;EAAE,SAAS;EAA2B,OAAO;EAAM;CAEnD;EACE,SACE;EACF,OAAO;EACR;CAED;EACE,SAAS;EACT,OAAO;EACR;CAED;EAAE,MAAM;EAAS,OAAO;EAAM;CAE9B;EACE,OAAO;EACP,SAAS;EACT,SAAS,oBAAC,mBAAD,EAA0B,OAAS,CAAA;EAC7C;CAED;EACE,OAAO;EACP,SAAS;EACT,SACE,qBAAC,MAAD,EAAA,UAAA;GAAM;GACE;GACN,oBAAC,MAAD;IAAM,OAAO,OAAO;IAAQ,MAAA;cAAK;IAE1B,CAAA;GAAC;GAAI;GAEP,EAAA,CAAA;EAEV;CAED;EAAE,MAAM;EAAS,OAAO;EAAM;CAG9B;EAAE,SAAS;EAA0B,OAAO;EAAM;CAElD;EAAE,SAAS;EAA0C,OAAO;EAAM;CAElE;EACE,SACE;EACF,OAAO;EACR;CAED;EACE,SACE;EACF,OAAO;EACR;CAED;EACE,SACE;EACF,OAAO;EACR;CAED;EAAE,MAAM;EAAS,OAAO;EAAM;CAG9B;EACE,SAAS;EACT,OAAO;EACR;CAED;EACE,SACE,qBAAC,MAAD,EAAA,UAAA;GAAM;GACuC;GAC3C,oBAAC,MAAD;IAAM,MAAA;IAAK,OAAO,OAAO;cAAQ;IAE1B,CAAA;GAAC;GAAI;GAEP,EAAA,CAAA;EAET,OAAO;EACP,SAAS;EACV;CAED;EACE,SACE;EACF,OAAO;EACR;CAED;EACE,SACE,qBAAC,MAAD,EAAA,UAAA;GAAM;GAE0B;GAC9B,oBAAC,MAAD;IAAM,UAAA;cAAS;IAA8C,CAAA;GACxD,EAAA,CAAA;EAET,OAAO;EACP,SAAS;EACV;CAED;EACE,SACE;EACF,OAAO;EACR;CAED;EACE,SACE,qBAAC,MAAD,EAAA,UAAA;GAAM;GACoE;GACxE,oBAAC,MAAD;IAAM,UAAA;cAAS;IAAmB,CAAA;GAClC,oBAAC,MAAD;IAAM,MAAA;cAAK;IAAwB,CAAA;GACnC,oBAAC,MAAD;IAAM,UAAA;cAAS;IAAQ,CAAA;GAClB,EAAA,CAAA;EAET,OAAO;EACP,SAAS;EACV;CAED;EAAE,MAAM;EAAS,OAAO;EAAM;CAG9B;EACE,SACE,oBAAC,MAAD;GAAM,MAAA;GAAK,OAAO,OAAO;aAAQ;GAE1B,CAAA;EAET,OAAO;EACP,SAAS;EACV;CAED;EACE,SACE;EACF,OAAO;EACR;CAED;EACE,SACE;EACF,OAAO;EACR;CAED;EACE,SAAS;EACT,OAAO;EACR;CAED;EACE,SACE;EACF,OAAO;EACR;CAED;EAAE,MAAM;EAAS,OAAO;EAAM;CAG9B;EACE,SAAS;EACT,OAAO;EACR;CAED;EACE,SAAS;EACT,OAAO;EACR;CAED;EAAE,MAAM;EAAS,OAAO;EAAM;CAE9B;EACE,SACE;EACF,OAAO;EACR;CAED;CAEA;EAAE,MAAM;EAAS,OAAO;EAAM;CAE9B;EACE,SAAS;EACT,OAAO;EACR;CAED;EAAE,SAAS;EAAoB,OAAO;EAAM;CAE5C;CAEA;EAAE,MAAM;EAAS,OAAO;EAAM;CAE9B;EACE,SAAS;EACT,OAAO;EACR;CAED;CAEA;EAAE,MAAM;EAAS,OAAO;EAAM;CAE9B;CAEA;EAAE,MAAM;EAAS,OAAO;EAAM;CAE9B;EACE,SAAS;EACT,OAAO;EACR;CAED;EAAE,SAAS;EAAiC,OAAO;EAAM;CAEzD;CAEA;EAAE,MAAM;EAAS,OAAO;EAAK;CAE7B;EAAE,SAAS;EAAsC,OAAO;EAAM;CAE9D;CACD;;;AC3PD,MAAM,wBAAwB;AAE9B,MAAM,wBAAqC,CACzC;CACE,OAAO;CACP,SAAS;CACT,MACE;CAIH,CACF;;;;;;AAOD,MAAM,sBAAsB,EAC1B,SAAS,mBACV;AAGD,MAAM,mBAAmB,OAAO,KAAK,oBAAoB;AAEzD,MAAa,kBAAiC;CAC5C,SAAS;CACT,aAAa;CACb,IAAI;CACJ,SAAS,oBAAoB;CAC7B,OAAO;CACP,YAAY;CACZ;CACA,cAAc,CAAC,QAAQ;CACvB,iBAAiB,CAAC,kBAAkB,UAAU;CAC9C,YAAY,EACV,SAAS;EACP,UAAU;EACV,MAAM;EACN,SAAS;EACT,cAAc;EACf,EACF;CACD,gBAAgB,UAAU,EACxB,SAAS,oBAAoB,KAAK,UACnC;CACD,KAAK;EACH,SAAS,oBAAoB;EAC7B,kBAAkB;EAClB,oBACE,yXAK6D,sBAAsB;EACrF,gBAAgB,4CAA4C;EAC5D,YAAY;EACZ,SAAS;EACT,gBAAgB;EAChB,0BAA0B;EAC1B,YAAY;EACb;CACD,UAAU,CAAC,sBAAsB;CAClC;;;AC5DD,MAAa,eAA8B;CACzC,IAAI;CACJ,aAAa;CACb,OAAO,CACL;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,aAAa,MAAM,EAAE;EACtB,CACF;CACF;AAED,MAAa,kBAAiC;CAC5C,IAAI;CACJ,aAAa;CACb,OAAO,CACL;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,aAAa,MAAM,EAAE;EACtB,CACF;CACF;;;ACRD,MAAM,mBAAkC;CACtC,IAAI;CACJ,aAAa;CACb,OAAO;CACP,kBAAkBC;CAClB,cAAc,CAAC,QAAQ;CACxB;AAED,MAAa,mBAAmB;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;;;AAOD,MAAa,UAAU;CACrB,oBAAoB,yBAAyB;CAC7C,uBAAuB,uBAAuB;CAC9C,WAAW,gBAAgB;CAC3B,OAAO,YAAY;CACnB,aAAa,kBAAkB;CAC/B,WAAW,gBAAgB;CAC3B,eAAe,oBAAoB;CACnC,YAAY,iBAAiB;CAC7B,QAAQ,aAAa;CACrB,WAAW,gBAAgB;CAC5B;;;;;;AAUD,SAAgB,iBAAiB,IAA8B;AAC7D,QAAO,iBAAiB,MAAM,MAAM,EAAE,OAAO,GAAG;;;AAIlD,SAAgB,wBAAyC;AACvD,QAAO,iBAAiB,QAAQ,MAAM,EAAE,WAAW,KAAK;;;;ACzE1D,MAAM,iBAAiB;AAEvB,MAAM,qBAAqB;AAI3B,IAAI,CAAC,UAAU,QAAQ,SAAS,mBAAmB,EAAE;AAEnD,SAAQ,IACN,mCAAmC,mBAAmB,0BAA0B,QAAQ,QAAQ,wCACjG;AACD,SAAQ,KAAK,EAAE;;;AAgCjB,MAAM,yBAAyB;CAC7B,OAAO;EACL,SAAS;EACT,UAAU;EACV,MAAM;EACP;CACD,eAAe;EACb,UAAU;EACV,MAAM;EACP;CACD,aAAa;EACX,SAAS;EACT,UAAU;EACV,MAAM;EACP;CACD,WAAW;EACT,SAAS;EACT,UAAU;EACV,MAAM;EACP;CACD,eAAe;EACb,SAAS;EACT,UAAU;EACV,MAAM;EACN,QAAQ;EACT;CACF;AAED,MAAM,MAAM,MAAM,QAAQ,QAAQ,KAAK,CAAC,CACrC,IAAI,iBAAiB,CAErB,QAAQ;CACP,OAAO;EACL,SAAS;EACT,UAAU;EACV,MAAM;EACP;CACD,QAAQ;EACN,UAAU;EACV,SAAS,CAAC,MAAM,KAAK;EACrB,MAAM;EACP;CACD,SAAS;EACP,SAAS;EACT,UACE;EACF,MAAM;EACP;CACD,QAAQ;EACN,SAAS;EACT,UACE;EACF,MAAM;EACP;CACD,aAAa;EACX,SAAS;EACT,UACE;EACF,MAAM;EACP;CACD,IAAI;EACF,SAAS;EACT,UACE;EACF,MAAM;EACP;CACD,WAAW;EACT,UACE;EACF,MAAM;EACP;CACD,cAAc;EACZ,UACE;EACF,MAAM;EACP;CACD,OAAO;EACL,UACE;EACF,MAAM;EACP;CACF,CAAC,CACD,QACC,CAAC,KAAK,EACN,iCACC,UAAU;AACT,QAAO,MAAM,QAAQ;EACnB,iBAAiB;GACf,SAAS;GACT,UACE;GACF,MAAM;GACP;EACD,eAAe;GACb,UACE;GACF,MAAM;GACP;EACD,YAAY;GACV,SAAS;GACT,UAAU;GACV,MAAM;GACP;EACD,aAAa;GACX,UAAU;GACV,SAAS;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACD;GACD,MAAM;GACP;EACD,MAAM;GACJ,SAAS;GACT,UACE;GACF,MAAM;GACP;EACD,WAAW;GACT,SAAS;GACT,UACE;GACF,MAAM;GACP;EACD,eAAe;GACb,SAAS;GACT,UACE;GACF,MAAM;GACN,QAAQ;GACT;EACD,OAAO;GACL,UACE;GACF,MAAM;GACP;EACD,MAAM;GACJ,UACE;GACF,MAAM;GACP;EACF,CAAC;IAEH,SAAS;CACR,MAAM,UAAU,EAAE,GAAG,MAAM;AAG3B,KAAI,QAAQ,IAAI;AACd,MAAI,CAAC,QAAQ,OAAQ,SAAQ,SAAS;AACtC,MAAI,CAAC,QAAQ,YAAY;AACvB,SAAM,IAAI,WAAW,CAAC;AACtB,UAAO,CAAC,MAAM,iBAAiB;AAC/B,UAAO,CAAC,IAAI,MACV,2DACD;A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"}
|