@posthog/wizard 2.17.0 → 2.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{add-mcp-server-to-clients-D4PK6ulR.js → add-mcp-server-to-clients-DnPwZl1P.js} +5 -5
- package/dist/{add-mcp-server-to-clients-D4PK6ulR.js.map → add-mcp-server-to-clients-DnPwZl1P.js.map} +1 -1
- package/dist/{agent-interface-7t5DBo2A.js → agent-interface-C2VEF-BD.js} +109 -53
- package/dist/agent-interface-C2VEF-BD.js.map +1 -0
- package/dist/{agent-runner-CTkKLVhp.js → agent-runner-Dw8cjZoN.js} +11 -9
- package/dist/{agent-runner-CTkKLVhp.js.map → agent-runner-Dw8cjZoN.js.map} +1 -1
- package/dist/{analytics-DN_Gy87F.js → analytics-C-zcTO6g.js} +26 -4
- package/dist/analytics-C-zcTO6g.js.map +1 -0
- package/dist/{api-serd0SMY.js → api-B3MWP3vm.js} +3 -3
- package/dist/{api-serd0SMY.js.map → api-B3MWP3vm.js.map} +1 -1
- package/dist/bin.js +232 -77
- package/dist/bin.js.map +1 -1
- package/dist/{ci-install-BbJ7c3WK.js → ci-install-DLuSmSq6.js} +4 -4
- package/dist/{ci-install-BbJ7c3WK.js.map → ci-install-DLuSmSq6.js.map} +1 -1
- package/dist/{debug-BI-Js0PB.js → debug--gQGudnY.js} +1 -1
- package/dist/{debug-Bx7nvCWW.js → debug-BorYMfpE.js} +2 -2
- package/dist/{debug-Bx7nvCWW.js.map → debug-BorYMfpE.js.map} +1 -1
- package/dist/{defaults-CPH6eWhN.js → defaults-DA3-9dHT.js} +1 -1
- package/dist/{defaults-CPH6eWhN.js.map → defaults-DA3-9dHT.js.map} +1 -1
- package/dist/{env-api-key-B3gE9Un0.js → env-api-key-MlzJYAvt.js} +1 -1
- package/dist/{env-api-key-B3gE9Un0.js.map → env-api-key-MlzJYAvt.js.map} +1 -1
- package/dist/{environment-CiZVSSYt.js → environment-DIOtLqTQ.js} +3 -3
- package/dist/{environment-CiZVSSYt.js.map → environment-DIOtLqTQ.js.map} +1 -1
- package/dist/{file-utils-Dy9JncCo.js → file-utils-VAXoyXVA.js} +1 -1
- package/dist/{file-utils-Dy9JncCo.js.map → file-utils-VAXoyXVA.js.map} +1 -1
- package/dist/{interactive-BwIzklw0.js → interactive-DjGjlvY3.js} +2 -2
- package/dist/{interactive-BwIzklw0.js.map → interactive-DjGjlvY3.js.map} +1 -1
- package/dist/{mcp-prompt-streaming-8U9Qs9EV.js → mcp-prompt-streaming-Dm47tmiy.js} +4 -4
- package/dist/{mcp-prompt-streaming-8U9Qs9EV.js.map → mcp-prompt-streaming-Dm47tmiy.js.map} +1 -1
- package/dist/{non-interactive-DTaZnVq_.js → non-interactive-C2f3Gwva.js} +2 -2
- package/dist/{non-interactive-DTaZnVq_.js.map → non-interactive-C2f3Gwva.js.map} +1 -1
- package/dist/{package-manager-CKQLR20D.js → package-manager-Bl2KOUFK.js} +2 -2
- package/dist/{package-manager-CKQLR20D.js.map → package-manager-Bl2KOUFK.js.map} +1 -1
- package/dist/{playground-CR81Mwe3.js → playground-ZLG68cvx.js} +4 -4
- package/dist/{playground-CR81Mwe3.js.map → playground-ZLG68cvx.js.map} +1 -1
- package/dist/{posthog-BrLFkaji.js → posthog-Cr37rnla.js} +1 -1
- package/dist/{posthog-BrLFkaji.js.map → posthog-Cr37rnla.js.map} +1 -1
- package/dist/{posthog-integration-Bv7987YJ.js → posthog-integration-B_DLodqr.js} +280 -13
- package/dist/posthog-integration-B_DLodqr.js.map +1 -0
- package/dist/{provisioning-C96Kw-9D.js → provisioning-Bk4E6VYn.js} +3 -3
- package/dist/{provisioning-C96Kw-9D.js.map → provisioning-Bk4E6VYn.js.map} +1 -1
- package/dist/{registry-B9k73FKR.js → registry-DMM3UmZD.js} +4 -4
- package/dist/{registry-B9k73FKR.js.map → registry-DMM3UmZD.js.map} +1 -1
- package/dist/{setup-utils-Bpfsap9L.js → setup-utils-Df9ezAjZ.js} +40 -33
- package/dist/setup-utils-Df9ezAjZ.js.map +1 -0
- package/dist/{slides-DRbBgsdd.js → slides-DwvXZ8iS.js} +23 -7
- package/dist/slides-DwvXZ8iS.js.map +1 -0
- package/dist/{start-tui-BZ7rEf3e.js → start-tui-P9aMwBzt.js} +15 -16
- package/dist/{start-tui-BZ7rEf3e.js.map → start-tui-P9aMwBzt.js.map} +1 -1
- package/dist/{steps-DDx35170.js → steps-RCRZbLjZ.js} +6 -6
- package/dist/{steps-DDx35170.js.map → steps-RCRZbLjZ.js.map} +1 -1
- package/dist/{task-stream-BI8rJg9H.js → task-stream-CZRj6auI.js} +2 -2
- package/dist/{task-stream-BI8rJg9H.js.map → task-stream-CZRj6auI.js.map} +1 -1
- package/dist/{telemetry-ByYtIfW0.js → telemetry-CMbVbpaY.js} +2 -2
- package/dist/{telemetry-ByYtIfW0.js.map → telemetry-CMbVbpaY.js.map} +1 -1
- package/dist/{urls-CTCJIxbR.js → urls-BzG_Jtw9.js} +2 -2
- package/dist/{urls-CTCJIxbR.js.map → urls-BzG_Jtw9.js.map} +1 -1
- package/dist/{wizard-abort-QdRxGQp_.js → wizard-abort-Dl8WJQgJ.js} +1 -1
- package/dist/{wizard-abort-CY0ibdq1.js → wizard-abort-QuKm_B5z.js} +3 -3
- package/dist/{wizard-abort-CY0ibdq1.js.map → wizard-abort-QuKm_B5z.js.map} +1 -1
- package/package.json +1 -1
- package/dist/TextBlock-D0Ep3zC9.js +0 -275
- package/dist/TextBlock-D0Ep3zC9.js.map +0 -1
- package/dist/agent-interface-7t5DBo2A.js.map +0 -1
- package/dist/analytics-DN_Gy87F.js.map +0 -1
- package/dist/posthog-integration-Bv7987YJ.js.map +0 -1
- package/dist/setup-utils-Bpfsap9L.js.map +0 -1
- package/dist/skill-CPqcV8zp.js +0 -29
- package/dist/skill-CPqcV8zp.js.map +0 -1
- package/dist/slides-DRbBgsdd.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-tui-BZ7rEf3e.js","names":["DetectErrorBody","VARIANT_DISPLAY_NAME","fs","FINDING_STATUSES","isFinding","fallbackSlide","openLink","ActiveSlide","WritingReport","groupByArea","groupIcon","GroupHeader","NEON_PINK","NEON_BLUE","NEON_GOLD","NEON_PINK","NEON_GOLD","NEON_BLUE","NEON_PINK","NEON_GOLD","NEON_BLUE","countByStatus","NEON_BLUE","NEON_GOLD","NEON_PINK","getSkillContentBlocks","runPluginInstall"],"sources":["../src/ui/tui/ink-ui.ts","../src/ui/tui/screens/health/HealthCheckScreen.tsx","../src/ui/tui/screens/doctor/DoctorIntroScreen.tsx","../src/ui/tui/screens/doctor/DoctorReportScreen.tsx","../src/ui/tui/screens/SettingsOverrideScreen.tsx","../src/ui/tui/screens/ManagedSettingsScreen.tsx","../src/ui/tui/screens/PortConflictScreen.tsx","../src/ui/tui/screens/ManualAuthCodeScreen.tsx","../src/ui/tui/screens/IntroScreenLayout.tsx","../src/ui/tui/screens/SkillSourceInfo.tsx","../src/ui/tui/screens/PostHogIntegrationIntroScreen.tsx","../src/ui/tui/screens/RevenueIntroScreen.tsx","../src/ui/tui/screens/MigrationIntroScreen.tsx","../src/ui/tui/screens/SourceMapsIntroScreen.tsx","../src/ui/tui/screens/SourceMapsOutroScreen.tsx","../src/ui/tui/screens/AgentSkillIntroScreen.tsx","../src/ui/tui/screens/audit/AuditIntroScreen.tsx","../src/ui/tui/hooks/file-watcher.ts","../src/ui/tui/screens/audit/AuditAreaPane.tsx","../src/ui/tui/screens/audit/slides/events-audit/detectSdk.tsx","../src/ui/tui/screens/audit/slides/events-audit/scanSites.tsx","../src/ui/tui/screens/audit/slides/events-audit/enrichSites.tsx","../src/ui/tui/screens/audit/slides/events-audit/queryVolume.tsx","../src/ui/tui/screens/audit/slides/events-audit/writeReport.tsx","../src/ui/tui/screens/audit/slides/events-audit/createDashboard.tsx","../src/ui/tui/screens/audit/slides/events-audit/uploadNotebook.tsx","../src/ui/tui/screens/audit/slides/events-audit/index.ts","../src/ui/tui/screens/audit/PendingChecksList.tsx","../src/ui/tui/screens/audit/AuditRunScreen.tsx","../src/ui/tui/screens/audit/AuditChecksOutroSection.tsx","../src/ui/tui/screens/audit/AuditOutroScreen.tsx","../src/ui/tui/screens/audit-3000/arcade-colors.ts","../src/ui/tui/screens/audit-3000/Audit3000IntroScreen.tsx","../src/ui/tui/screens/audit-3000/Audit3000AreaPane.tsx","../src/ui/tui/screens/audit-3000/Audit3000ChecksPanel.tsx","../src/ui/tui/screens/audit-3000/hedgehog-runner-engine.ts","../src/ui/tui/screens/audit-3000/HedgehogRunner.tsx","../src/ui/tui/screens/audit-3000/Audit3000RunScreen.tsx","../src/ui/tui/screens/audit-3000/Audit3000OutroScreen.tsx","../src/ui/tui/screens/SetupScreen.tsx","../src/ui/tui/screens/AuthScreen.tsx","../src/ui/tui/screens/RunScreen.tsx","../src/ui/tui/screens/KeepSkillsScreen.tsx","../src/ui/tui/screens/OutroScreen.tsx","../src/ui/tui/screens/ExitScreen.tsx","../src/ui/tui/screens/AuthErrorScreen.tsx","../src/ui/tui/screens/WizardAskScreen.tsx","../src/steps/add-mcp-server-to-clients/browser-client.ts","../src/ui/tui/services/mcp-installer.ts","../src/ui/tui/services/mcp-suggested-prompts-services.ts","../src/ui/tui/screen-registry.tsx","../src/ui/tui/App.tsx","../src/ui/tui/start-tui.ts"],"sourcesContent":["/**\n * InkUI — Ink-backed implementation of WizardUI.\n *\n * Translates business logic calls into store setter calls.\n * No direct session mutation. No imperative screen transitions.\n * The router derives the active screen from session state.\n */\n\nimport type { WizardUI, SpinnerHandle, AuthErrorDetail } from '@ui/wizard-ui';\nimport type { WizardStore } from './store.js';\nimport type { SettingsConflict } from '@lib/agent/agent-interface';\nimport type { WizardReadinessResult } from '@lib/health-checks/readiness';\nimport type { ApiUser } from '@lib/api';\nimport type {\n AskAnswers,\n OutroData,\n PendingQuestion,\n} from '@lib/wizard-session';\nimport { RunPhase, OutroKind } from '@lib/wizard-session';\n\n// Strip ANSI escape codes (chalk formatting) from strings\n// eslint-disable-next-line no-control-regex\nconst ANSI_RE = /\\x1b\\[[0-9;]*m/g;\nfunction stripAnsi(s: string): string {\n return s.replace(ANSI_RE, '');\n}\n\nexport class InkUI implements WizardUI {\n constructor(private store: WizardStore) {}\n\n intro(message: string): void {\n this.store.pushStatus(message);\n }\n\n outro(message: string): void {\n this.store.pushStatus(stripAnsi(message));\n\n // Outro data is pushed by agent-runner via setOutroData() above. If it\n // wasn't (e.g. CI path where outro is called directly with just a\n // message), fall back to a minimal success record so the screen still\n // renders something useful.\n const existing = this.store.session.outroData;\n if (!existing) {\n this.store.setOutroData({\n kind: OutroKind.Success,\n message: stripAnsi(message),\n });\n }\n\n // Signal that the main work is done — router resolves to mcp or outro\n if (this.store.session.runPhase === RunPhase.Running) {\n this.store.setRunPhase(RunPhase.Completed);\n }\n }\n\n outroError(data: OutroData): void {\n this.store.setOutroData(data);\n // Advance router past the run step so the outro screen renders\n if (this.store.session.runPhase !== RunPhase.Error) {\n this.store.setRunPhase(RunPhase.Error);\n }\n }\n\n waitForOutroDismissed(): Promise<void> {\n return new Promise((resolve) => {\n if (this.store.session.outroDismissed) {\n resolve();\n return;\n }\n const unsub = this.store.subscribe(() => {\n if (this.store.session.outroDismissed) {\n unsub();\n resolve();\n }\n });\n });\n }\n\n setCredentials(credentials: {\n accessToken: string;\n projectApiKey: string;\n host: string;\n projectId: number;\n }): void {\n this.store.setCredentials(credentials);\n }\n\n setRoleAtOrganization(role: string | null): void {\n this.store.setRoleAtOrganization(role);\n }\n\n setApiUser(user: ApiUser | null): void {\n this.store.setApiUser(user);\n }\n\n setDetectedFramework(label: string): void {\n this.store.setDetectedFramework(label);\n }\n\n onEnterScreen(screen: string, fn: () => void): void {\n this.store.onEnterScreen(\n screen as Parameters<WizardStore['onEnterScreen']>[0],\n fn,\n );\n }\n\n setLoginUrl(url: string | null): void {\n this.store.setLoginUrl(url);\n }\n\n setAuthorizeUrl(url: string | null): void {\n this.store.setAuthorizeUrl(url);\n }\n\n showBlockingOutage(result: WizardReadinessResult): Promise<void> {\n // In the TUI, the HealthCheckScreen handles outage display.\n // This is only called from agent-runner for the CI fallback path.\n this.store.setReadinessResult(result);\n return Promise.resolve();\n }\n\n setReadinessWarnings(result: WizardReadinessResult): void {\n this.store.setReadinessResult(result);\n }\n\n showPortConflict(processInfo: {\n command: string;\n pid: string;\n port: number;\n user: string;\n }): Promise<void> {\n return this.store.showPortConflict(processInfo);\n }\n\n waitForManualAuthCode(): Promise<string> {\n return this.store.waitForManualAuthCode();\n }\n\n showSettingsOverride(\n conflicts: SettingsConflict[],\n backupAndFix: () => boolean,\n ): Promise<void> {\n return this.store.showSettingsOverride(conflicts, backupAndFix);\n }\n\n showAuthError(detail?: AuthErrorDetail): void {\n this.store.showAuthError(detail);\n }\n\n requestQuestion(question: PendingQuestion): Promise<AskAnswers> {\n return this.store.requestQuestion(question);\n }\n\n startRun(): void {\n this.store.setRunPhase(RunPhase.Running);\n }\n\n cancel(message: string): void {\n this.store.pushStatus(message);\n }\n\n log = {\n info: (message: string): void => {\n this.store.pushStatus(message);\n },\n warn: (message: string): void => {\n this.store.pushStatus(message);\n },\n error: (message: string): void => {\n this.store.pushStatus(message);\n },\n success: (message: string): void => {\n this.store.pushStatus(message);\n },\n step: (message: string): void => {\n this.store.pushStatus(message);\n },\n };\n\n note(message: string): void {\n this.store.pushStatus(message);\n }\n\n spinner(): SpinnerHandle {\n return {\n start: (message?: string) => {\n if (message) this.store.pushStatus(message);\n },\n stop: (message?: string) => {\n if (message) this.store.pushStatus(message);\n },\n message: (msg?: string) => {\n if (msg) this.store.pushStatus(msg);\n },\n };\n }\n\n pushStatus(message: string): void {\n this.store.pushStatus(message);\n }\n\n syncTodos(\n todos: Array<{ content: string; status: string; activeForm?: string }>,\n ): void {\n this.store.syncTodos(todos);\n }\n\n setEventPlan(events: Array<{ name: string; description: string }>): void {\n this.store.setEventPlan(events);\n }\n\n setDashboardUrl(url: string): void {\n this.store.setDashboardUrl(url);\n }\n\n setNotebookUrl(url: string): void {\n this.store.setNotebookUrl(url);\n }\n\n setOutroData(data: OutroData): void {\n // Merge in URLs the agent emitted via `[DASHBOARD_URL]` / `[NOTEBOOK_URL]`\n // markers. These land on the live store during the run; agent-runner's\n // `session` snapshot misses them (setKey forks the reference). The live\n // store wins over the `data` payload so a real emission always beats any\n // fallback the program's buildOutroData may have computed from the stale\n // snapshot (e.g. events-audit defaults dashboardUrl to `${cloudUrl}/dashboard`).\n const live = this.store.session;\n this.store.setOutroData({\n ...data,\n dashboardUrl: live.dashboardUrl ?? data.dashboardUrl ?? undefined,\n notebookUrl: live.notebookUrl ?? data.notebookUrl ?? undefined,\n });\n }\n\n setFrameworkContext(key: string, value: unknown): void {\n this.store.setFrameworkContext(key, value);\n }\n}\n","/**\n * HealthCheckScreen — Program screen between Intro and Auth.\n *\n * Three states:\n * 1. Checking: spinner while health check runs\n * 2. Healthy: isComplete returns true, router auto-advances to Auth\n * 3. Blocking outage: shows affected services with Continue/Exit\n */\n\nimport { Box, Text, useInput } from 'ink';\nimport { useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport {\n ConfirmationInput,\n LoadingBox,\n ModalOverlay,\n} from '@ui/tui/primitives/index';\nimport { Colors, Icons } from '@ui/tui/styles';\nimport { ServiceHealthList } from '@ui/tui/components/ServiceHealthList';\nimport {\n getBlockingServiceKeys,\n SIGNUP_WIZARD_READINESS_CONFIG,\n} from '@lib/health-checks/readiness';\nimport { ServiceHealthStatus } from '@lib/health-checks/types';\nimport { wizardAbort } from '@utils/wizard-abort';\nimport { fetchSkillMenu, downloadSkill } from '@lib/wizard-tools';\nimport { REMOTE_SKILLS_BASE_URL } from '@lib/constants';\n\ninterface HealthCheckScreenProps {\n store: WizardStore;\n}\n\nconst EXAMPLE_PROMPT =\n 'Integrate PostHog into this project using the skill files in .posthog/skills/. Read SKILL.md first, then follow the numbered program files in order.';\n\nconst SkillsDownloadedScreen = () => {\n useInput(() => {\n process.exit(0);\n });\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text color=\"green\" bold>\n {Icons.check} Skills downloaded to .posthog/skills/\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text>\n You can continue setup with another agent using this prompt:\n </Text>\n <Box marginTop={1} paddingLeft={2}>\n <Text color=\"cyan\">{EXAMPLE_PROMPT}</Text>\n </Box>\n </Box>\n\n <Box marginTop={1}>\n <Text color={Colors.muted}>Press any key to exit</Text>\n </Box>\n </Box>\n );\n};\n\nexport const HealthCheckScreen = ({ store }: HealthCheckScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const [downloaded, setDownloaded] = useState(false);\n const [downloading, setDownloading] = useState(false);\n\n const result = store.session.readinessResult;\n\n if (downloaded) {\n return <SkillsDownloadedScreen />;\n }\n\n // Still checking — show spinner\n if (!result) {\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <LoadingBox message=\"Checking service status...\" />\n </Box>\n );\n }\n\n const isSignup = store.session.signup;\n const blockingKeys = getBlockingServiceKeys(\n result.health,\n isSignup ? SIGNUP_WIZARD_READINESS_CONFIG : undefined,\n );\n\n // Signup has a narrower block list (only posthog + llm-gateway), so\n // services like Anthropic can be degraded without blocking. Surface\n // those as dismissable warnings instead of silently proceeding.\n const warningKeys = isSignup\n ? getBlockingServiceKeys(result.health).filter(\n (k) => !blockingKeys.includes(k),\n )\n : [];\n\n const hasHardBlock = blockingKeys.length > 0;\n const displayKeys = hasHardBlock ? blockingKeys : warningKeys;\n if (displayKeys.length === 0) return null;\n\n const isGithubReleasesDown =\n hasHardBlock && blockingKeys.includes('githubReleases');\n const canDownloadSkills =\n result.health.githubReleases.status === ServiceHealthStatus.Healthy;\n const integration = store.session.integration;\n\n const title = hasHardBlock\n ? 'Ongoing service disruptions'\n : 'Service disruption detected';\n\n const docsUrl = store.session.frameworkConfig?.metadata.docsUrl;\n const description = isGithubReleasesDown\n ? \"The Wizard can't download necessary skills from GitHub Releases right now.\"\n : hasHardBlock\n ? 'The Wizard cannot start while these services are down.'\n : 'Some services are degraded. You can continue, but parts of the wizard may not work reliably.';\n\n const handleDownloadAndExit = async () => {\n if (downloading) return;\n setDownloading(true);\n const menu = await fetchSkillMenu(REMOTE_SKILLS_BASE_URL);\n if (menu) {\n const prefix = `integration-${integration}`;\n const skills = (menu.categories['integration'] ?? []).filter((s) =>\n s.id.startsWith(prefix),\n );\n for (const skill of skills) {\n downloadSkill(skill, store.session.installDir, '.posthog/skills');\n }\n }\n setDownloaded(true);\n };\n\n const handleCancel =\n canDownloadSkills && !isGithubReleasesDown\n ? () => void handleDownloadAndExit()\n : () => void wizardAbort({ message: 'Exited due to service outage.' });\n\n const cancelLabel =\n canDownloadSkills && !isGithubReleasesDown\n ? downloading\n ? 'Downloading...'\n : 'Download skills & Exit [Esc]'\n : 'Exit [Esc]';\n\n return (\n <ModalOverlay\n borderColor={hasHardBlock ? 'red' : 'yellow'}\n title={title}\n width={72}\n footer={\n isGithubReleasesDown ? (\n <ConfirmationInput\n message=\"\"\n confirmLabel=\"\"\n cancelLabel=\"Exit [Esc]\"\n onConfirm={() =>\n void wizardAbort({ message: 'Exited due to service outage.' })\n }\n onCancel={() =>\n void wizardAbort({ message: 'Exited due to service outage.' })\n }\n />\n ) : (\n <ConfirmationInput\n message=\"Continue anyway?\"\n confirmLabel=\"Continue [Enter]\"\n cancelLabel={cancelLabel}\n onConfirm={() => store.dismissOutage()}\n onCancel={handleCancel}\n />\n )\n }\n >\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box marginBottom={1}>\n <Text>\n <Text color=\"red\">{Icons.squareFilled}</Text>\n <Text dimColor> Down </Text>\n <Text color=\"#DC9300\">{Icons.squareFilled}</Text>\n <Text dimColor> Degraded</Text>\n </Text>\n </Box>\n\n <ServiceHealthList\n health={result.health}\n filterKeys={displayKeys}\n showHealthy={false}\n />\n </Box>\n\n <Text dimColor>{description}</Text>\n\n {isGithubReleasesDown && docsUrl && (\n <Box marginTop={1}>\n <Text>\n Set up manually: <Text color=\"cyan\">{docsUrl}</Text>\n </Text>\n </Box>\n )}\n\n {canDownloadSkills && !isGithubReleasesDown && (\n <Box marginTop={1}>\n <Text>\n You can still download the PostHog integration skills and continue\n with another agent.\n </Text>\n </Box>\n )}\n </ModalOverlay>\n );\n};\n","import { Box, Text } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { PickerMenu } from '@ui/tui/primitives/index';\nimport { Colors, Icons } from '@ui/tui/styles';\n\ninterface DoctorIntroScreenProps {\n store: WizardStore;\n}\n\nexport const DoctorIntroScreen = ({ store }: DoctorIntroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color={Colors.accent}>\n PostHog Doctor\n </Text>\n <Text dimColor>\n Scan your project configuration for issues that may need attention.\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text>The wizard will:</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n <Text>{Icons.bullet} Sign you in to PostHog</Text>\n <Text>\n {Icons.bullet} Fetch active health issues for your project\n </Text>\n <Text>\n {Icons.bullet} Show you what needs to be resolved, with docs links\n </Text>\n </Box>\n </Box>\n\n <PickerMenu\n options={[\n { label: 'Continue', value: 'continue' },\n { label: 'Cancel', value: 'cancel' },\n ]}\n onSelect={(value) => {\n if (value === 'cancel') {\n process.exit(0);\n } else {\n store.completeSetup();\n }\n }}\n />\n </Box>\n );\n};\n","import { Box, Text } from 'ink';\nimport { useEffect, useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { LoadingBox, PickerMenu } from '@ui/tui/primitives/index';\nimport { Colors, Icons } from '@ui/tui/styles';\nimport {\n fetchHealthIssues,\n type HealthIssue,\n} from '@lib/programs/posthog-doctor/index';\nimport { getUiHostFromHost } from '@utils/urls';\nimport { OutroKind } from '@lib/wizard-session';\nimport { ApiError } from '@lib/api';\nimport { POSTHOG_DOCS_URL } from '@lib/constants';\nimport { IssueTable, SEVERITY_LABEL, SEVERITY_ORDER } from './IssueTable.js';\n\ninterface DoctorReportScreenProps {\n store: WizardStore;\n}\n\ntype FetchState =\n | { kind: 'loading' }\n | { kind: 'ready'; issues: HealthIssue[] }\n | { kind: 'error'; message: string };\n\nexport const DoctorReportScreen = ({ store }: DoctorReportScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const { credentials } = store.session;\n const accessToken = credentials?.accessToken;\n const host = credentials?.host;\n const projectId = credentials?.projectId;\n\n const [state, setState] = useState<FetchState>({ kind: 'loading' });\n\n useEffect(() => {\n if (!accessToken || !host || projectId == null) return;\n let cancelled = false;\n void (async () => {\n try {\n const issues = await fetchHealthIssues(accessToken, host, projectId);\n if (!cancelled) {\n setState({ kind: 'ready', issues });\n }\n } catch (err) {\n if (!cancelled) {\n const message =\n err instanceof ApiError && err.statusCode === 401\n ? 'Your PostHog session has expired. Re-run the wizard to sign in again.'\n : err instanceof Error\n ? err.message\n : String(err);\n setState({ kind: 'error', message });\n }\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [accessToken, host, projectId]);\n\n if (!credentials) {\n return <LoadingBox message=\"Waiting for authentication...\" />;\n }\n\n if (state.kind === 'loading') {\n return (\n <Box flexDirection=\"column\">\n <Header host={credentials.host} projectId={credentials.projectId} />\n <LoadingBox message=\"Fetching health issues...\" />\n </Box>\n );\n }\n\n const healthUrl = `${getUiHostFromHost(credentials.host)}/project/${\n credentials.projectId\n }/health`;\n\n if (state.kind === 'error') {\n return (\n <Box flexDirection=\"column\">\n <Header host={credentials.host} projectId={credentials.projectId} />\n <Box flexDirection=\"column\" marginY={1}>\n <Text color={Colors.error} bold>\n {Icons.squareFilled} Failed to fetch health issues\n </Text>\n <Text dimColor>{state.message}</Text>\n </Box>\n <PickerMenu\n options={[{ label: 'Continue', value: 'continue' }]}\n onSelect={() => {\n store.setOutroData({\n kind: OutroKind.Error,\n message: 'Failed to fetch health issues',\n body: state.message,\n docsUrl: POSTHOG_DOCS_URL,\n });\n }}\n />\n </Box>\n );\n }\n\n const { issues } = state;\n\n if (issues.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Header host={credentials.host} projectId={credentials.projectId} />\n <Box marginY={1}>\n <Text color={Colors.success} bold>\n {Icons.check} No active issues — you're all set!\n </Text>\n </Box>\n <PickerMenu\n options={[{ label: 'Continue', value: 'continue' }]}\n onSelect={() => {\n store.setOutroData({\n kind: OutroKind.Success,\n message: 'No active issues — your project looks healthy.',\n docsUrl: POSTHOG_DOCS_URL,\n continueUrl: healthUrl,\n });\n }}\n />\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <Header host={credentials.host} projectId={credentials.projectId} />\n <Box marginTop={1}>\n <Text>{formatSummaryLine(issues)}</Text>\n </Box>\n\n <Box flexDirection=\"column\" marginBottom={1}>\n <IssueTable issues={issues} />\n </Box>\n\n <PickerMenu\n options={[{ label: 'Continue', value: 'continue' }]}\n onSelect={() => {\n store.setOutroData({\n kind: OutroKind.Success,\n message: `Found ${issues.length} active issue${\n issues.length === 1 ? '' : 's'\n }.`,\n body: 'Open the dashboard in PostHog to dismiss or resolve issues.',\n docsUrl: POSTHOG_DOCS_URL,\n continueUrl: healthUrl,\n });\n }}\n />\n </Box>\n );\n};\n\nconst Header = ({ host, projectId }: { host: string; projectId: number }) => (\n <Box flexDirection=\"column\">\n <Text bold color={Colors.accent}>\n PostHog Doctor Report\n </Text>\n <Text dimColor>\n Project {projectId} {Icons.bullet} {host}\n </Text>\n </Box>\n);\n\nfunction formatSummaryLine(issues: HealthIssue[]): string {\n const parts: string[] = [];\n for (const sev of SEVERITY_ORDER) {\n const n = issues.filter((i) => i.severity === sev).length;\n if (n > 0) parts.push(`${n} ${SEVERITY_LABEL[sev].toLowerCase()}`);\n }\n const suffix = parts.length > 0 ? `: ${parts.join(', ')}` : '';\n return `${issues.length} active issue${\n issues.length === 1 ? '' : 's'\n }${suffix}`;\n}\n","import { Box, Text } from 'ink';\nimport { useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { ConfirmationInput, ModalOverlay } from '@ui/tui/primitives/index';\nimport { Icons } from '@ui/tui/styles';\nimport type { SettingsConflictSource } from '@lib/agent/agent-interface';\n\nfunction sourcePath(source: SettingsConflictSource): string {\n switch (source) {\n case 'project':\n return '.claude/settings.json';\n case 'managed':\n return '/Library/Application Support/ClaudeCode/managed-settings.json';\n default:\n return source;\n }\n}\n\ninterface SettingsOverrideScreenProps {\n store: WizardStore;\n}\n\nexport const SettingsOverrideScreen = ({\n store,\n}: SettingsOverrideScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const [feedback, setFeedback] = useState<string | null>(null);\n const conflicts = store.session.settingsConflicts?.filter((c) => c.writable);\n\n if (!conflicts || conflicts.length === 0) {\n return null;\n }\n\n return (\n <ModalOverlay\n borderColor=\"red\"\n title={`${Icons.warning} Settings conflict`}\n width={64}\n feedback={feedback ? `${Icons.warning} ${feedback}` : null}\n footer={\n <ConfirmationInput\n message=\"Back up to .wizard-backup and continue?\"\n confirmLabel=\"Backup & continue [Enter]\"\n cancelLabel=\"Exit [Esc]\"\n onConfirm={() => {\n const ok = store.backupAndFixSettingsOverride();\n if (!ok) {\n setFeedback('Could not back up the settings file.');\n }\n }}\n onCancel={() => process.exit(1)}\n />\n }\n >\n {conflicts.map((conflict) => (\n <Box key={conflict.source} flexDirection=\"column\" marginBottom={1}>\n <Text>\n Your settings file at{' '}\n <Text bold>{sourcePath(conflict.source)}</Text> sets:\n </Text>\n <Box flexDirection=\"column\" paddingLeft={2}>\n {conflict.keys.map((key) => (\n <Text key={key}>\n {Icons.bullet}{' '}\n <Text color=\"yellow\" bold>\n {key}\n </Text>\n </Text>\n ))}\n </Box>\n </Box>\n ))}\n <Text dimColor>\n These settings override credentials and prevent the Wizard from reaching\n the PostHog LLM Gateway. We can back up the file and continue.\n </Text>\n </ModalOverlay>\n );\n};\n","/**\n * ManagedSettingsScreen — Modal when IT/org-managed settings contain overrides\n * that block the Wizard from reaching the PostHog LLM Gateway.\n *\n * Unlike SettingsOverrideScreen, the wizard cannot back up or modify these files.\n * The user must contact their IT administrator to resolve the conflict.\n */\n\nimport { Box, Text } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { ConfirmationInput, ModalOverlay } from '@ui/tui/primitives/index';\nimport { Icons } from '@ui/tui/styles';\nimport type { SettingsConflict } from '@lib/agent/agent-interface';\n\nfunction sourceLabel(source: SettingsConflict['source']): string {\n switch (source) {\n case 'managed':\n return 'Managed settings (IT/org-managed)';\n case 'project':\n return '.claude/settings.json';\n default:\n return source;\n }\n}\n\ninterface ManagedSettingsScreenProps {\n store: WizardStore;\n}\n\nexport const ManagedSettingsScreen = ({\n store,\n}: ManagedSettingsScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const conflicts = store.session.settingsConflicts;\n const readOnlyConflicts = conflicts?.filter((c) => !c.writable);\n\n if (!readOnlyConflicts || readOnlyConflicts.length === 0) {\n return null;\n }\n\n return (\n <ModalOverlay\n borderColor=\"red\"\n title={`${Icons.warning} Organization settings conflict`}\n width={68}\n footer={\n <ConfirmationInput\n message=\"Contact your IT administrator to resolve this.\"\n confirmLabel=\"\"\n cancelLabel=\"Exit [Esc]\"\n onConfirm={() => process.exit(1)}\n onCancel={() => process.exit(1)}\n />\n }\n >\n <Text dimColor>\n Your organization's managed settings contain overrides that prevent\n the Wizard from reaching the PostHog LLM Gateway.\n </Text>\n {readOnlyConflicts.map((conflict) => (\n <Box key={conflict.source} flexDirection=\"column\" marginTop={1}>\n <Text bold>{sourceLabel(conflict.source)}</Text>\n <Box flexDirection=\"column\" paddingLeft={2}>\n {conflict.keys.map((key) => (\n <Text key={key}>\n {Icons.bullet}{' '}\n <Text color=\"yellow\" bold>\n {key}\n </Text>\n </Text>\n ))}\n </Box>\n </Box>\n ))}\n <Box marginTop={1}>\n <Text dimColor>\n Try running \"claude auth logout\" or contact your IT administrator to\n resolve this.\n </Text>\n </Box>\n </ModalOverlay>\n );\n};\n","/**\n * PortConflictScreen — Modal when all OAuth port candidates are occupied.\n *\n * Shows every port the wizard tried and asks the user to free them manually.\n */\n\nimport { Box, Text } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { OAUTH_PORTS } from '@lib/constants';\nimport { ConfirmationInput, ModalOverlay } from '@ui/tui/primitives/index';\n\ninterface PortConflictScreenProps {\n store: WizardStore;\n}\n\nexport const PortConflictScreen = ({ store }: PortConflictScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const processInfo = store.session.portConflictProcess;\n\n if (!processInfo) return null;\n\n return (\n <ModalOverlay\n borderColor=\"#DC9300\"\n title=\"OAuth ports in use\"\n width={72}\n footer={\n <ConfirmationInput\n message=\"Retry after freeing ports?\"\n confirmLabel=\"Retry [Enter]\"\n cancelLabel=\"Exit [Esc]\"\n onConfirm={() => store.resolvePortConflict()}\n onCancel={() => process.exit(1)}\n />\n }\n >\n <Text>\n The wizard needs a local port for OAuth. We tried these ports which are\n all in use:\n </Text>\n <Box flexDirection=\"column\" marginY={1} paddingLeft={2} gap={0}>\n {OAUTH_PORTS.map((port) => (\n <Text key={port}>\n <Text dimColor>Port </Text>\n <Text bold>{port}</Text>\n </Text>\n ))}\n </Box>\n <Text dimColor>Please free one of these ports and retry.</Text>\n </ModalOverlay>\n );\n};\n","/**\n * ManualAuthCodeScreen — Paste an OAuth authorization code by hand.\n *\n * Fallback for headless/remote shells where the browser can't reach the\n * wizard's local callback server. Shows the direct authorize URL (the localhost\n * one is unreachable from another machine), then the user pastes either the\n * full callback URL the browser was redirected to\n * (`http://localhost:8239/callback?code=...`) or just the code. On submit we\n * extract the code and resolve the in-flight OAuth flow; bad input shows inline\n * feedback without leaving the screen.\n *\n * Opened from AuthScreen via a keypress; Esc dismisses it.\n */\n\nimport { Box, Text, useInput } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { Colors, Icons } from '@ui/tui/styles';\nimport { extractOAuthCode } from '@utils/oauth';\n\ninterface ManualAuthCodeScreenProps {\n store: WizardStore;\n}\n\nexport const ManualAuthCodeScreen = ({ store }: ManualAuthCodeScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const { session } = store;\n const [error, setError] = useState<string | null>(null);\n\n // Esc cancels and returns to the waiting auth screen.\n useInput((_input, key) => {\n if (key.escape) {\n store.dismissManualAuthCode();\n }\n });\n\n const handleSubmit = (value: string): void => {\n const code = extractOAuthCode(value);\n if (!code) {\n setError(\n \"Couldn't find a code in that input. Paste the full callback URL or just the code.\",\n );\n return;\n }\n store.submitManualAuthCode(code);\n };\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box marginBottom={1}>\n <Text bold color={Colors.accent}>\n {Icons.diamond} Paste authorization code\n </Text>\n </Box>\n\n {session.authorizeUrl && (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text dimColor>\n On a remote/headless machine the local login link won't open. Open\n this URL in a browser on any machine to authorize:\n </Text>\n {/* No border + flexShrink={0}: Ink won't hard-wrap the URL, so it\n stays one continuous string the terminal soft-wraps — copies clean\n instead of being chopped across bordered, indented rows. */}\n <Box flexShrink={0} marginTop={1}>\n <Text color=\"cyan\">{session.authorizeUrl}</Text>\n </Box>\n </Box>\n )}\n\n <Text>\n After authorizing, paste the callback URL it lands on — or just the code\n from it — here:\n </Text>\n <Box marginTop={1} width=\"100%\">\n <TextInput\n placeholder=\"http://localhost:8239/callback?code=… or the code\"\n onSubmit={handleSubmit}\n />\n </Box>\n\n {error && (\n <Box marginTop={1}>\n <Text color=\"yellow\">{error}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text>\n <Text color={Colors.accent}>ENTER</Text>\n <Text dimColor> submit</Text>\n <Text dimColor> · </Text>\n <Text color={Colors.accent}>ESC</Text>\n <Text dimColor> cancel</Text>\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * IntroScreenLayout ��� Shared visual shell for all program intro screens.\n *\n * Purely presentational — no store subscription. Parent components own\n * the store subscription and pass derived data as props.\n *\n * Slots:\n * body — free-form content below the title bar (copy, spinners, pickers, etc.)\n * children — between detection rows and menu (extra info, warnings)\n * errorView — replaces the entire body for fatal error states\n */\n\nimport path from 'path';\nimport { Box, Text } from 'ink';\nimport type { ReactNode } from 'react';\nimport { PickerMenu } from '@ui/tui/primitives/index';\n\nexport interface DetectionRow {\n label: string;\n value: string;\n suffix?: string;\n}\n\ninterface IntroScreenLayoutProps {\n /** Absolute path to the project directory */\n installDir: string;\n\n /** Title text after the colored blocks, e.g. \"PostHog Wizard 🦔\" */\n title?: string;\n\n /** Show the default \"We'll use AI…\" / \".env*…\" subtitle. Default true. */\n showSubtitle?: boolean;\n\n /** Free-form content below the title (copy, spinners, pickers, notices) */\n body?: ReactNode;\n\n /** Show the detection block (Directory, detection rows, Program, Skill). Default true. */\n showDetection?: boolean;\n\n /** Extra detection row items rendered as \"Label ✔ value suffix\" */\n detectionRows?: DetectionRow[];\n\n /** Content rendered between detection rows and the menu */\n children?: ReactNode;\n\n /** Menu options. Pass null to hide the menu entirely. */\n menuOptions?: { label: string; value: string }[] | null;\n\n /** Called when the user picks a menu option */\n onSelect?: (value: string) => void;\n\n /** Program label shown at the bottom */\n programLabel?: string | null;\n\n /** Skill ID shown at the bottom */\n skillId?: string | null;\n\n /** Replaces the entire body (topContent + rows + children + menu) for fatal error views */\n errorView?: ReactNode;\n}\n\nconst WizardTitle = ({ title }: { title: string }) => (\n <Text bold>\n <Text color=\"#1D4AFF\">{'\\u2588'}</Text>\n <Text color=\"#F54E00\">{'\\u2588'}</Text>\n <Text color=\"#F9BD2B\">{'\\u2588'}</Text> {title}\n </Text>\n);\n\nexport const IntroScreenLayout = ({\n installDir,\n title = 'PostHog Wizard 🦔',\n showSubtitle = true,\n body,\n showDetection = true,\n detectionRows,\n children,\n menuOptions,\n onSelect,\n programLabel,\n skillId,\n errorView,\n}: IntroScreenLayoutProps) => {\n // Default menu: Continue / Cancel\n const resolvedMenuOptions =\n menuOptions === undefined\n ? [\n { label: 'Continue', value: 'continue' },\n { label: 'Cancel', value: 'cancel' },\n ]\n : menuOptions;\n\n if (errorView) {\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Box flexDirection=\"column\" alignItems=\"center\" marginBottom={1}>\n <WizardTitle title={title} />\n </Box>\n {errorView}\n </Box>\n );\n }\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Box flexDirection=\"column\" alignItems=\"center\">\n <WizardTitle title={title} />\n\n {showSubtitle && (\n <Box flexDirection=\"column\" alignItems=\"center\" marginTop={1}>\n <Text dimColor>\n We'll use AI to analyze your project and complete work.\n </Text>\n <Text dimColor>\n .env* file contents will not leave your machine.\n </Text>\n </Box>\n )}\n\n {body && (\n <Box flexDirection=\"column\" alignItems=\"center\" marginTop={1}>\n {body}\n </Box>\n )}\n </Box>\n\n {children}\n\n {showDetection && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text>\n <Text>\n Directory <Text color=\"green\">{'\\u2714'}</Text>{' '}\n </Text>\n <Text>\n {'/'}\n {path.basename(installDir)}\n </Text>\n </Text>\n\n {detectionRows?.map((row) => (\n <Text key={row.label}>\n <Text>\n {row.label} <Text color=\"green\">{'\\u2714'}</Text>{' '}\n </Text>\n <Text>\n {row.value}\n {row.suffix ? ` ${row.suffix}` : ''}\n </Text>\n </Text>\n ))}\n\n {programLabel && (\n <Text>\n Program{' '}\n <Text color=\"green\">{'\\u2714'}</Text> {programLabel}\n </Text>\n )}\n\n {programLabel === 'agent-skill' && skillId && (\n <Text>\n Skill{' '}\n <Text color=\"green\">{'\\u2714'}</Text> {skillId}\n </Text>\n )}\n </Box>\n )}\n\n <Box width={24}>\n {resolvedMenuOptions && onSelect && (\n <Box justifyContent=\"center\">\n <PickerMenu\n key={resolvedMenuOptions.map((o) => o.value).join(',')}\n options={resolvedMenuOptions}\n onSelect={(value) => {\n const choice = Array.isArray(value) ? value[0] : value;\n onSelect(choice);\n }}\n />\n </Box>\n )}\n </Box>\n </Box>\n </>\n );\n};\n","/**\n * Shared \"Skill: <id> / URL: <downloadUrl>\" block for intro screens.\n *\n * `useSkillEntry` fetches the entry from the skill menu and re-runs when\n * `skillId` or `local` change. The previous fetch is cancelled (its result\n * is ignored) so a session that flips `local=false → true` mid-mount picks\n * up the right base URL.\n *\n * `<SkillSourceInfo>` renders the block, taking the entry as a prop so the\n * caller can reuse the same hook result for additional UI (e.g. showing\n * `skillEntry.name`) without invoking the hook twice.\n */\n\nimport { Box, Text } from 'ink';\nimport { useEffect, useState } from 'react';\nimport { fetchSkillMenu, type SkillEntry } from '@lib/wizard-tools';\nimport { getSkillsBaseUrl } from '@lib/constants';\n\nexport function useSkillEntry(\n skillId: string | null,\n local: boolean,\n): { skillEntry: SkillEntry | null; fetchFailed: boolean } {\n const [skillEntry, setSkillEntry] = useState<SkillEntry | null>(null);\n const [fetchFailed, setFetchFailed] = useState(false);\n\n useEffect(() => {\n if (!skillId) {\n setFetchFailed(true);\n return;\n }\n let cancelled = false;\n setSkillEntry(null);\n setFetchFailed(false);\n void fetchSkillMenu(getSkillsBaseUrl(local)).then((menu) => {\n if (cancelled) return;\n if (!menu) {\n setFetchFailed(true);\n return;\n }\n const match = Object.values(menu.categories)\n .flat()\n .find((s) => s.id === skillId);\n if (match) setSkillEntry(match);\n else setFetchFailed(true);\n });\n return () => {\n cancelled = true;\n };\n }, [skillId, local]);\n\n return { skillEntry, fetchFailed };\n}\n\ninterface SkillSourceInfoProps {\n skillId: string | null;\n skillEntry: SkillEntry | null;\n fetchFailed: boolean;\n}\n\nexport const SkillSourceInfo = ({\n skillId,\n skillEntry,\n fetchFailed,\n}: SkillSourceInfoProps) => (\n <Box flexDirection=\"column\">\n <Text>\n Skill:{' '}\n <Text italic color=\"cyan\">\n {skillId ?? 'unknown'}\n </Text>\n </Text>\n <Text>\n URL:{' '}\n <Text color=\"cyan\">\n {skillEntry?.downloadUrl ??\n (fetchFailed ? 'unavailable' : 'Loading...')}\n </Text>\n </Text>\n </Box>\n);\n","/**\n * PostHogIntegrationIntroScreen — Intro screen for the core PostHog integration.\n *\n * Composes IntroScreenLayout with framework-detection-specific state:\n * 1. Detecting: spinner while detection runs\n * 2. Detection failed: framework picker\n * 3. Unsupported version: upgrade prompt\n * 4. Detection succeeded: continue/change-framework/cancel\n */\n\nimport { Box, Text } from 'ink';\nimport { spawnSync } from 'node:child_process';\nimport type { ReactNode } from 'react';\nimport { useEffect, useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport {\n Integration,\n WIZARD_TOOLS_MENU_FLAG_KEY,\n} from '@lib/constants';\nimport { PickerMenu, LoadingBox } from '@ui/tui/primitives/index';\nimport { IntroScreenLayout, type DetectionRow } from './IntroScreenLayout.js';\nimport { SkillSourceInfo, useSkillEntry } from './SkillSourceInfo.js';\nimport { releaseTerminal } from '@ui/tui/start-tui';\nimport { analytics } from '@utils/analytics';\n\nconst TOOLS = [\n { label: 'Troubleshoot Integration', command: 'doctor' },\n] as const;\n\ntype View = 'default' | 'more-info' | 'tools';\n\nfunction launchTool(command: string, installDir: string): never {\n releaseTerminal();\n const result = spawnSync(\n process.execPath,\n [process.argv[1], command, `--install-dir=${installDir}`],\n { stdio: 'inherit' },\n );\n process.exit(result.status ?? 0);\n}\n\n/** Framework picker shown when auto-detection fails. */\nconst FrameworkPicker = ({\n store,\n onComplete,\n}: {\n store: WizardStore;\n onComplete?: () => void;\n}) => {\n const options = Object.values(Integration).map((value) => ({\n label: value,\n value,\n }));\n\n return (\n <PickerMenu<Integration>\n centered\n columns={2}\n message=\"Select your framework\"\n options={options}\n onSelect={(value) => {\n const integration = Array.isArray(value) ? value[0] : value;\n void import('@lib/registry').then(\n ({ FRAMEWORK_REGISTRY }) => {\n const config = FRAMEWORK_REGISTRY[integration];\n store.setFrameworkConfig(integration, config);\n store.setDetectedFramework(config.metadata.name);\n onComplete?.();\n },\n );\n }}\n />\n );\n};\n\ninterface PostHogIntegrationIntroScreenProps {\n store: WizardStore;\n}\n\nexport const PostHogIntegrationIntroScreen = ({\n store,\n}: PostHogIntegrationIntroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const [pickingFramework, setPickingFramework] = useState(false);\n const [manuallySelected, setManuallySelected] = useState(false);\n const [view, setView] = useState<View>('default');\n const [toolsEnabled, setToolsEnabled] = useState(false);\n\n useEffect(() => {\n let cancelled = false;\n void analytics.getAllFlagsForWizard().then((flags) => {\n const value = flags[WIZARD_TOOLS_MENU_FLAG_KEY];\n if (!cancelled && value && value !== 'false') setToolsEnabled(true);\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n const { session } = store;\n const config = session.frameworkConfig;\n const frameworkLabel =\n session.detectedFrameworkLabel ?? config?.metadata.name;\n const { skillEntry, fetchFailed } = useSkillEntry(\n session.skillId,\n session.localMcp,\n );\n const detecting = !session.detectionComplete;\n const needsFrameworkPick =\n session.detectionComplete && !session.frameworkConfig;\n const unsupported = session.unsupportedVersion;\n const showContinue =\n session.frameworkConfig !== null &&\n !detecting &&\n !pickingFramework &&\n view === 'default' &&\n !unsupported;\n\n // ── Title ──────────────────────────────────────────────────────────\n\n const title = detecting ? 'PostHog Wizard starting up' : 'PostHog Wizard 🦔';\n\n // ── Description ────────────────────────────────────────────────────\n\n let body: ReactNode = null;\n\n if (detecting) {\n body = (\n <Box marginY={1}>\n <LoadingBox message=\"Detecting project framework...\" />\n </Box>\n );\n } else if (needsFrameworkPick && !pickingFramework) {\n body = (\n <>\n <Box marginY={1}>\n <Text dimColor>Could not auto-detect your framework.</Text>\n </Box>\n <FrameworkPicker\n store={store}\n onComplete={() => setPickingFramework(false)}\n />\n </>\n );\n } else if (pickingFramework) {\n body = (\n <FrameworkPicker\n store={store}\n onComplete={() => setPickingFramework(false)}\n />\n );\n } else if (view === 'more-info') {\n body = (\n <Box flexDirection=\"column\" width={56} flexShrink={0}>\n <Text>\n The wizard is an agent that executes PostHog tasks. Its code is open\n source: <Text color=\"cyan\">https://github.com/PostHog/wizard</Text>\n </Text>\n <Box flexDirection=\"column\" marginTop={1}>\n <Text>\n The{' '}\n <Text italic color=\"cyan\">\n {session.programLabel}\n </Text>{' '}\n program installs the PostHog SDKs, instruments event tracking, and\n integrates the following dev tools for your application:\n </Text>\n </Box>\n <Box flexDirection=\"column\" marginTop={1} paddingLeft={4}>\n <Text>{`\\u2022`} Product Analytics</Text>\n <Text>{`\\u2022`} Web Analytics</Text>\n <Text>{`\\u2022`} Session Replay</Text>\n <Text>{`\\u2022`} Error Tracking</Text>\n </Box>\n <Box flexDirection=\"column\" marginTop={1}>\n <Text>If you prefer your own AI setup, download the skill:</Text>\n <Box marginTop={1}>\n <SkillSourceInfo\n skillId={session.skillId}\n skillEntry={skillEntry}\n fetchFailed={fetchFailed}\n />\n </Box>\n </Box>\n </Box>\n );\n } else if (showContinue) {\n body = (\n <>\n <Box>\n <Text>Let's do two hours of work in eight minutes.</Text>\n </Box>\n </>\n );\n }\n\n // ── Detection rows ─────────────────────────────────────────────────\n\n const detectionRows: DetectionRow[] = [];\n if (frameworkLabel) {\n const suffixParts: string[] = [];\n if (!manuallySelected) suffixParts.push('(detected)');\n if (config?.metadata.beta) suffixParts.push('[BETA]');\n\n detectionRows.push({\n label: 'Framework',\n value: frameworkLabel,\n suffix: suffixParts.join(' ') || undefined,\n });\n }\n\n // ── Children (between rows and menu) ───────────────────────────────\n\n let bodyChildren: ReactNode = null;\n\n if (config?.metadata.preRunNotice) {\n bodyChildren = <Text color=\"yellow\">{config.metadata.preRunNotice}</Text>;\n }\n\n if (unsupported) {\n bodyChildren = (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"#DC9300\">\n Version {unsupported.current} is not supported by the wizard. Please\n upgrade to {unsupported.minimum} or later.\n </Text>\n <Text dimColor>Manual setup guide: {unsupported.docsUrl}</Text>\n <Box marginTop={1}>\n <Text dimColor>\n Did we get this wrong? You can also select another framework.\n </Text>\n </Box>\n <PickerMenu\n options={[\n { label: 'Select another framework', value: 'framework' },\n { label: 'Exit', value: 'exit' },\n ]}\n onSelect={(value) => {\n const choice = Array.isArray(value) ? value[0] : value;\n if (choice === 'framework') {\n setPickingFramework(true);\n setManuallySelected(true);\n } else {\n process.exit(0);\n }\n }}\n />\n </Box>\n );\n }\n\n // ── Menu ───────────────────────────────────────────────────────────\n\n let menuOptions: { label: string; value: string }[] | null = null;\n\n if (view === 'tools') {\n menuOptions = [\n ...TOOLS.map((t) => ({ label: t.label, value: t.command })),\n { label: 'Back', value: 'back' },\n ];\n } else if (view === 'more-info') {\n menuOptions = [{ label: 'Back', value: 'back' }];\n } else if (showContinue) {\n menuOptions = [\n { label: 'Continue', value: 'continue' },\n { label: 'Change framework', value: 'framework' },\n ...(toolsEnabled ? [{ label: 'Tools', value: 'tools' }] : []),\n { label: 'More info', value: 'more-info' },\n { label: 'Cancel', value: 'cancel' },\n ];\n }\n\n const handleSelect = (value: string) => {\n if (view === 'tools') {\n if (value === 'back') setView('default');\n else launchTool(value, session.installDir);\n return;\n }\n if (value === 'cancel') {\n process.exit(0);\n } else if (value === 'framework') {\n setPickingFramework(true);\n setManuallySelected(true);\n } else if (value === 'more-info') {\n setView('more-info');\n } else if (value === 'tools') {\n setView('tools');\n } else if (value === 'back') {\n setView('default');\n } else {\n store.completeSetup();\n }\n };\n\n // ── Render ─────────────────────────────────────────────────────────\n\n return (\n <IntroScreenLayout\n installDir={session.installDir}\n title={title}\n showSubtitle={view === 'default'}\n body={body}\n showDetection={showContinue}\n detectionRows={detectionRows}\n menuOptions={unsupported ? null : menuOptions}\n onSelect={handleSelect}\n programLabel={session.programLabel}\n skillId={session.skillId}\n >\n {bodyChildren}\n </IntroScreenLayout>\n );\n};\n","/**\n * RevenueIntroScreen — Welcome screen for the revenue analytics flow.\n *\n * Composes IntroScreenLayout with SDK-detection-specific state:\n * - Detection succeeded: shows detected PostHog + Stripe SDKs, continue/cancel\n * - Detection failed: shows the error via errorView + exit prompt\n *\n * Reads `frameworkContext.detectError` and `frameworkContext.detectedPosthogSdks`\n * / `detectedStripeSdks` set by detectRevenuePrerequisites().\n */\n\nimport { Box, Text } from 'ink';\nimport { useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { PickerMenu } from '@ui/tui/primitives/index';\nimport { IntroScreenLayout, type DetectionRow } from './IntroScreenLayout.js';\nimport {\n POSTHOG_SDKS,\n STRIPE_SDKS,\n type RevenueDetectError,\n} from '@lib/programs/revenue-analytics/index';\n\ninterface RevenueIntroScreenProps {\n store: WizardStore;\n}\n\nexport const RevenueIntroScreen = ({ store }: RevenueIntroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const [showingMoreInfo, setShowingMoreInfo] = useState(false);\n\n const { session } = store;\n const detectError = session.frameworkContext.detectError as\n | RevenueDetectError\n | undefined;\n const detectedPosthogSdks =\n (session.frameworkContext.detectedPosthogSdks as string[] | undefined) ??\n [];\n const detectedStripeSdks =\n (session.frameworkContext.detectedStripeSdks as string[] | undefined) ?? [];\n const detectedPackagePaths =\n (session.frameworkContext.detectedPackagePaths as string[] | undefined) ??\n [];\n\n // ── Detection rows ─────────────────────────────────────────────────\n\n const detectionRows: DetectionRow[] = [];\n if (detectedPosthogSdks.length > 0) {\n detectionRows.push({\n label: 'PostHog SDK',\n value: detectedPosthogSdks.join(', '),\n });\n }\n if (detectedStripeSdks.length > 0) {\n detectionRows.push({\n label: 'Stripe SDK',\n value: detectedStripeSdks.join(', '),\n });\n }\n\n // ── Body ────────────────────────────────────────────────────────────\n\n const body = showingMoreInfo ? (\n <Box flexDirection=\"column\" width={56} flexShrink={0}>\n <Text>\n The wizard is an agent that executes PostHog tasks. Its code is open\n source: <Text color=\"cyan\">https://github.com/PostHog/wizard</Text>.\n </Text>\n <Box flexDirection=\"column\" marginTop={1}>\n <Text>\n The{' '}\n <Text italic color=\"cyan\">\n {session.programLabel}\n </Text>{' '}\n program links Stripe customers and purchases to PostHog product data\n and persons. It unlocks insights like:\n </Text>\n </Box>\n <Box flexDirection=\"column\" marginTop={1} paddingLeft={4}>\n <Text>{'\\u2022'} Revenue per user</Text>\n <Text>{'\\u2022'} Lifetime value</Text>\n <Text>{'\\u2022'} MRR / churn tracking</Text>\n </Box>\n </Box>\n ) : (\n <>\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text>Let's create revenue analytics with Stripe and PostHog.</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n <Text>Link purchases to product data.</Text>\n </Box>\n </Box>\n\n {detectedPackagePaths.length > 1 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor>Found in {detectedPackagePaths.length} packages:</Text>\n {detectedPackagePaths.map((p) => (\n <Text key={p} dimColor>\n {' '}\n {'\\u2022'} {p}\n </Text>\n ))}\n </Box>\n )}\n </>\n );\n\n // ── Error view ─────────────────────────────────────────────────────\n\n const errorView = detectError ? (\n <>\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color=\"red\" bold>\n {'\\u2718'} Cannot set up revenue analytics\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n <DetectErrorBody error={detectError} />\n </Box>\n </Box>\n\n <PickerMenu\n options={[{ label: 'Exit', value: 'exit' }]}\n onSelect={() => process.exit(1)}\n />\n </>\n ) : undefined;\n\n // ── Menu ───────────────────────────────────────────────────────────\n const menuOptions = showingMoreInfo\n ? [{ label: 'Back', value: 'back' }]\n : [\n { label: 'Continue', value: 'continue' },\n { label: 'More info', value: 'more-info' },\n { label: 'Cancel', value: 'cancel' },\n ];\n // ── Render ─────────────────────────────────────────────────────────\n\n return (\n <IntroScreenLayout\n installDir={session.installDir}\n showSubtitle={!showingMoreInfo}\n body={body}\n showDetection={!showingMoreInfo}\n detectionRows={detectionRows}\n errorView={errorView}\n programLabel={session.programLabel}\n skillId={session.skillId}\n menuOptions={menuOptions}\n onSelect={(value) => {\n if (value === 'cancel') {\n process.exit(0);\n } else if (value === 'more-info') {\n setShowingMoreInfo(true);\n } else if (value === 'back') {\n setShowingMoreInfo(false);\n } else {\n store.completeSetup();\n }\n }}\n />\n );\n};\n\nconst DetectErrorBody = ({ error }: { error: RevenueDetectError }) => {\n switch (error.kind) {\n case 'bad-directory': {\n const reasonText = {\n missing: 'does not exist',\n 'not-dir': 'is not a directory',\n unreadable: 'could not be accessed',\n }[error.reason];\n return (\n <>\n <Text>This path {reasonText}:</Text>\n <Text dimColor>\n {' '}\n {error.path}\n </Text>\n </>\n );\n }\n\n case 'no-package-json':\n return (\n <>\n <Text>No package.json found in this directory.</Text>\n <Text dimColor>\n Revenue analytics currently supports Node.js / TypeScript projects.\n </Text>\n <Text dimColor>Run this command from your project root.</Text>\n </>\n );\n\n case 'no-sdks':\n return (\n <>\n <Text>\n Neither PostHog nor Stripe SDKs detected (scanned{' '}\n {error.scannedCount} package.json file\n {error.scannedCount === 1 ? '' : 's'}).\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text>Revenue analytics requires:</Text>\n <Text dimColor>\n {' \\u2022'} A PostHog SDK ({POSTHOG_SDKS.slice(0, 3).join(', ')},\n …)\n </Text>\n <Text dimColor>\n {' \\u2022'} A Stripe SDK ({STRIPE_SDKS.join(', ')})\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text dimColor>\n Install Stripe and run <Text bold>npx @posthog/wizard</Text> to\n set up PostHog.\n </Text>\n </Box>\n </>\n );\n\n case 'missing-posthog':\n return (\n <>\n <Text>\n Found Stripe ({error.foundStripe.join(', ')}) but no PostHog SDK.\n </Text>\n <Box marginTop={1}>\n <Text dimColor>\n Run <Text bold>npx @posthog/wizard</Text> first to set up the base\n PostHog integration.\n </Text>\n </Box>\n </>\n );\n\n case 'missing-stripe':\n return (\n <>\n <Text>\n Found PostHog ({error.foundPosthog.join(', ')}) but no Stripe SDK.\n </Text>\n <Text dimColor>\n Revenue analytics currently supports Stripe only.\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>Install one of:</Text>\n {STRIPE_SDKS.map((sdk) => (\n <Text key={sdk} dimColor>\n {' \\u2022'} {sdk}\n </Text>\n ))}\n </Box>\n </>\n );\n }\n};\n","import { Box, Text } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { IntroScreenLayout } from './IntroScreenLayout.js';\n\ninterface MigrationIntroScreenProps {\n store: WizardStore;\n}\n\nexport const MigrationIntroScreen = ({ store }: MigrationIntroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const { session } = store;\n\n const body = (\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text>Let's migrate this project to PostHog.</Text>\n </Box>\n );\n\n return (\n <IntroScreenLayout\n installDir={session.installDir}\n body={body}\n programLabel={session.programLabel}\n skillId={session.skillId}\n menuOptions={[\n { label: 'Continue', value: 'continue' },\n { label: 'Cancel', value: 'cancel' },\n ]}\n onSelect={(value) => {\n if (value === 'cancel') {\n process.exit(0);\n } else {\n store.completeSetup();\n }\n }}\n />\n );\n};\n","/**\n * SourceMapsIntroScreen — Welcome screen for the source-maps upload flow.\n *\n * Reads detection results from frameworkContext (written by\n * detectSourceMapsPrerequisites). On success: shows the detected platform.\n * On failure: shows the structured error with an Exit prompt.\n */\n\nimport { Box, Text } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { PickerMenu } from '@ui/tui/primitives/index';\nimport { IntroScreenLayout, type DetectionRow } from './IntroScreenLayout.js';\nimport {\n SOURCE_MAPS_CONTEXT_KEYS,\n VARIANT_DISPLAY_NAME,\n type SkillVariant,\n type SourceMapsDetectError,\n} from '@lib/programs/error-tracking-upload-source-maps/index';\n\ninterface SourceMapsIntroScreenProps {\n store: WizardStore;\n}\n\nexport const SourceMapsIntroScreen = ({\n store,\n}: SourceMapsIntroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const { session } = store;\n const detectError = session.frameworkContext[\n SOURCE_MAPS_CONTEXT_KEYS.detectError\n ] as SourceMapsDetectError | undefined;\n const variant = session.frameworkContext[\n SOURCE_MAPS_CONTEXT_KEYS.skillVariant\n ] as SkillVariant | undefined;\n const displayName = session.frameworkContext[\n SOURCE_MAPS_CONTEXT_KEYS.displayName\n ] as string | undefined;\n const packagePaths =\n (session.frameworkContext[SOURCE_MAPS_CONTEXT_KEYS.packagePaths] as\n | string[]\n | undefined) ?? [];\n\n const detectionRows: DetectionRow[] = [];\n if (displayName) {\n detectionRows.push({ label: 'Platform', value: displayName });\n }\n if (variant) {\n detectionRows.push({\n label: 'Skill',\n value: `error-tracking-upload-source-maps-${variant}`,\n });\n }\n\n const body = (\n <>\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text>Upload source maps for accurate error stack traces.</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n <Text>The agent will wire it into your build.</Text>\n </Box>\n </Box>\n\n {packagePaths.length > 1 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor>Found {packagePaths.length} package.json files:</Text>\n {packagePaths.map((p) => (\n <Text key={p} dimColor>\n {' '}\n {'•'} {p}\n </Text>\n ))}\n </Box>\n )}\n </>\n );\n\n const errorView = detectError ? (\n <>\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color=\"red\" bold>\n {'✘'} Cannot set up source map upload\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n <DetectErrorBody error={detectError} />\n </Box>\n </Box>\n\n <PickerMenu\n options={[{ label: 'Exit', value: 'exit' }]}\n onSelect={() => process.exit(1)}\n />\n </>\n ) : undefined;\n\n const menuOptions = [\n { label: 'Continue', value: 'continue' },\n { label: 'Cancel', value: 'cancel' },\n ];\n\n return (\n <IntroScreenLayout\n installDir={session.installDir}\n body={body}\n showDetection={true}\n detectionRows={detectionRows}\n errorView={errorView}\n programLabel={session.programLabel}\n skillId={session.skillId}\n menuOptions={menuOptions}\n onSelect={(value) => {\n if (value === 'cancel') {\n process.exit(0);\n } else {\n store.completeSetup();\n }\n }}\n />\n );\n};\n\nconst SOURCE_MAP_DOCS =\n 'https://posthog.com/docs/error-tracking/upload-source-maps';\nconst ERROR_TRACKING_INSTALL_DOCS =\n 'https://posthog.com/docs/error-tracking/installation';\nconst WIZARD_ISSUES_URL = 'https://github.com/PostHog/wizard/issues';\n\n/**\n * Platforms PostHog Error Tracking supports with published source-map / symbol\n * upload docs, but that the wizard can't automate yet. The user (or their own\n * coding agent) can follow these docs to wire it up by hand. Anything not in\n * this map falls through to the generic \"not supported yet\" message — we don't\n * hardcode the full supported-platform list (it lives in the docs and changes\n * server-side), we just point there.\n */\nconst NATIVE_PLATFORM_DOCS: Record<string, { label: string; url: string }> = {\n ios: {\n label: 'iOS',\n url: 'https://posthog.com/docs/error-tracking/upload-source-maps/ios',\n },\n android: {\n label: 'Android',\n url: 'https://posthog.com/docs/error-tracking/upload-mappings/android',\n },\n 'react-native': {\n label: 'React Native',\n url: 'https://posthog.com/docs/error-tracking/upload-source-maps/react-native',\n },\n flutter: {\n label: 'Flutter',\n url: 'https://posthog.com/docs/error-tracking/upload-source-maps/flutter',\n },\n};\n\nconst DetectErrorBody = ({ error }: { error: SourceMapsDetectError }) => {\n switch (error.kind) {\n case 'bad-directory': {\n const reasonText = {\n missing: 'does not exist',\n 'not-dir': 'is not a directory',\n unreadable: 'could not be accessed',\n }[error.reason];\n return (\n <>\n <Text>This path {reasonText}:</Text>\n <Text dimColor>\n {' '}\n {error.path}\n </Text>\n </>\n );\n }\n\n case 'no-project-files':\n return (\n <>\n <Text>No recognizable project files were found.</Text>\n <Text dimColor>\n Source map upload needs a package.json, Xcode project, Gradle build,\n or Flutter pubspec.yaml.\n </Text>\n <Text dimColor>Run this command from your project root.</Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>How source map upload works:</Text>\n <Text dimColor>\n {' '}\n {SOURCE_MAP_DOCS}\n </Text>\n </Box>\n </>\n );\n\n case 'unsupported-platform': {\n const native = NATIVE_PLATFORM_DOCS[error.detected];\n\n // Native mobile: PostHog Error Tracking supports it and we have docs —\n // the wizard just can't automate source-map upload for it yet. Hand the\n // user a path forward rather than a dead end.\n if (native) {\n return (\n <>\n <Text>\n The wizard can't set up source map upload for {native.label} yet.\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>\n PostHog Error Tracking does support {native.label}. You can set\n it up yourself by following the docs below — or hand them to\n your own coding agent to do it for you:\n </Text>\n <Box marginTop={1}>\n <Text dimColor>{native.url}</Text>\n </Box>\n </Box>\n </>\n );\n }\n\n // Everything else (e.g. Rust): source map upload doesn't apply, and the\n // stack may not be supported by Error Tracking at all. Don't promise docs\n // that don't exist — point at the supported-platform list instead.\n return (\n <>\n <Text>Source map upload isn't supported for this stack yet.</Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>\n Check which platforms PostHog Error Tracking supports:\n </Text>\n <Box marginTop={1}>\n <Text dimColor>{ERROR_TRACKING_INSTALL_DOCS}</Text>\n </Box>\n <Box marginTop={1}>\n <Text dimColor>\n If yours isn't listed and you'd like it added, open an issue at{' '}\n {WIZARD_ISSUES_URL} with details about your build setup.\n </Text>\n </Box>\n </Box>\n </>\n );\n }\n\n case 'no-posthog-sdk': {\n const platformLabel =\n VARIANT_DISPLAY_NAME[error.platform] ?? error.platform;\n return (\n <>\n <Text>Detected {platformLabel} but no PostHog SDK is installed.</Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>\n Source map upload only resolves stack traces from errors the SDK\n reports. Run <Text bold>npx @posthog/wizard</Text> first to\n install the SDK, then run this command again.\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>\n Set up source map upload for {platformLabel}:\n </Text>\n <Text dimColor>\n {' '}\n {SOURCE_MAP_DOCS}\n </Text>\n </Box>\n </Box>\n </>\n );\n }\n }\n};\n","/**\n * SourceMapsOutroScreen — post-run summary for the source-maps upload flow.\n *\n * Unlike the generic OutroScreen, this spells out the operational facts a user\n * needs to actually get de-minified stack traces: that packages were installed\n * and upload credentials written to .env, plus the three gotchas (builds\n * upload, run the build, mirror the env vars in CI). All static guidance —\n * driven only by the program's `buildOutroData` (kind / message / report /\n * docs), no per-run data.\n */\n\nimport { join } from 'node:path';\nimport type { ReactNode } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { OutroKind } from '@lib/wizard-session';\nimport { Colors } from '@ui/tui/styles';\n\ninterface SourceMapsOutroScreenProps {\n store: WizardStore;\n}\n\nexport const SourceMapsOutroScreen = ({\n store,\n}: SourceMapsOutroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n useInput(() => {\n store.setOutroDismissed();\n });\n\n const outroData = store.session.outroData;\n\n if (!outroData) {\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text dimColor>Finishing up...</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n {outroData.kind === OutroKind.Success && (\n <Box flexDirection=\"column\">\n <Text color={Colors.success} bold>\n ✔ {outroData.message || 'Source maps wired up!'}\n </Text>\n\n <Section title=\"What the wizard did\">\n <Text>• Installed the packages needed for source map upload.</Text>\n <Text>\n • Wrote the PostHog upload credentials to your{' '}\n <Text bold>.env</Text> file.\n </Text>\n </Section>\n\n <Section title=\"How uploads work now\">\n <Text>\n • Every <Text bold>build</Text> now uploads source maps to PostHog\n automatically — no extra command to remember.\n </Text>\n <Text>\n • Run your app from the <Text bold>built output</Text>. Source\n maps only resolve for errors thrown by the build that was\n uploaded.\n </Text>\n <Text>\n • In <Text bold>CI</Text>, make sure the build job exposes the\n same env vars the wizard added to your <Text bold>.env</Text>.\n </Text>\n </Section>\n\n {outroData.reportFile && (\n <Box marginTop={1}>\n <Text>\n Details in{' '}\n <Text bold>\n {join(store.session.installDir, outroData.reportFile)}\n </Text>\n </Text>\n </Box>\n )}\n\n {outroData.docsUrl && (\n <Box marginTop={1}>\n <Text>\n Learn more:{' '}\n <Text color={Colors.primary}>{outroData.docsUrl}</Text>\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text dimColor>\n Note: This wizard uses an LLM agent to analyze and modify your\n project. Please review the changes made.\n </Text>\n </Box>\n <Text dimColor>\n How did this work for you? Drop us a line: wizard@posthog.com\n </Text>\n </Box>\n )}\n\n {outroData.kind === OutroKind.Error && (\n <Box flexDirection=\"column\">\n <Text color={Colors.error} bold>\n ✘ {outroData.message || 'An error occurred'}\n </Text>\n {outroData.body && (\n <Box marginTop={1}>\n <Text dimColor>{outroData.body}</Text>\n </Box>\n )}\n {outroData.docsUrl && (\n <Box marginTop={1}>\n <Text>\n Docs: <Text color={Colors.primary}>{outroData.docsUrl}</Text>\n </Text>\n </Box>\n )}\n </Box>\n )}\n\n {outroData.kind === OutroKind.Cancel && (\n <Text color=\"yellow\">■ {outroData.message || 'Cancelled'}</Text>\n )}\n\n <Box marginTop={1}>\n <Text color={Colors.muted}>Press any key to continue</Text>\n </Box>\n </Box>\n );\n};\n\nconst Section = ({\n title,\n children,\n}: {\n title: string;\n children: ReactNode;\n}) => (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={Colors.primary} bold>\n {title}:\n </Text>\n {children}\n </Box>\n);\n","/**\n * AgentSkillIntroScreen — Default intro for generic agent-skill programs.\n *\n * Programs that need a different intro ship their own screen component\n * (see audit/AuditIntroScreen.tsx).\n */\n\nimport { Box, Text } from 'ink';\nimport type { ReactNode } from 'react';\nimport { useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { IntroScreenLayout } from './IntroScreenLayout.js';\nimport { SkillSourceInfo, useSkillEntry } from './SkillSourceInfo.js';\n\ninterface AgentSkillIntroScreenProps {\n store: WizardStore;\n}\n\nexport const AgentSkillIntroScreen = ({\n store,\n}: AgentSkillIntroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const [showingMoreInfo, setShowingMoreInfo] = useState(false);\n\n const { session } = store;\n const skillId = session.skillId ?? 'unknown';\n const { skillEntry, fetchFailed } = useSkillEntry(skillId, session.localMcp);\n\n let body: ReactNode;\n\n if (showingMoreInfo) {\n body = (\n <Box flexDirection=\"column\" width={56} flexShrink={0}>\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text>\n The wizard is an agent that executes PostHog tasks. Its code is open\n source: <Text color=\"cyan\">https://github.com/PostHog/wizard</Text>\n </Text>\n </Box>\n <SkillSourceInfo\n skillId={skillId}\n skillEntry={skillEntry}\n fetchFailed={fetchFailed}\n />\n <Box marginTop={1}>\n <Text dimColor>\n {skillEntry?.name ?? (fetchFailed ? skillId : 'Loading...')}\n </Text>\n </Box>\n </Box>\n );\n } else {\n body = (\n <Text>\n Let's run the{' '}\n <Text italic color=\"cyan\">\n {skillId}\n </Text>{' '}\n skill.\n </Text>\n );\n }\n\n const menuOptions = showingMoreInfo\n ? [{ label: 'Back', value: 'back' }]\n : [\n { label: 'Continue', value: 'continue' },\n { label: 'More info', value: 'more-info' },\n { label: 'Cancel', value: 'cancel' },\n ];\n\n const handleSelect = (value: string) => {\n if (value === 'cancel') process.exit(0);\n else if (value === 'more-info') setShowingMoreInfo(true);\n else if (value === 'back') setShowingMoreInfo(false);\n else store.completeSetup();\n };\n\n return (\n <IntroScreenLayout\n installDir={session.installDir}\n showSubtitle={!showingMoreInfo}\n body={body}\n showDetection={!showingMoreInfo}\n programLabel={session.programLabel}\n skillId={session.skillId}\n menuOptions={menuOptions}\n onSelect={handleSelect}\n />\n );\n};\n","import { Box, Text } from 'ink';\nimport { useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { IntroScreenLayout } from '@ui/tui/screens/IntroScreenLayout';\nimport { SkillSourceInfo, useSkillEntry } from '@ui/tui/screens/SkillSourceInfo';\n\ninterface AuditIntroScreenProps {\n store: WizardStore;\n}\n\nexport const AuditIntroScreen = ({ store }: AuditIntroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const [showingMoreInfo, setShowingMoreInfo] = useState(false);\n const { session } = store;\n // bin.ts seeds session.skillId from ProgramConfig.skillId before render,\n // so audit and events-audit pick up their respective skill metadata here.\n const skillId = session.skillId ?? 'audit';\n const { skillEntry, fetchFailed } = useSkillEntry(skillId, session.localMcp);\n\n const body = showingMoreInfo ? (\n <Box flexDirection=\"column\" width={56}>\n <Box marginBottom={1}>\n <Text>\n The wizard is an agent that executes PostHog tasks. Its code is open\n source: <Text color=\"cyan\">https://github.com/PostHog/wizard</Text>\n </Text>\n </Box>\n\n <Text>\n The{' '}\n <Text color=\"cyan\" italic>\n {skillId}\n </Text>{' '}\n program reviews your project's PostHog integration against best\n practices to help you capture high-quality events and writes a report\n for suggested actions. Nothing in your project will be modified.\n </Text>\n <Box marginTop={1}>\n <SkillSourceInfo\n skillId={skillId}\n skillEntry={skillEntry}\n fetchFailed={fetchFailed}\n />\n </Box>\n </Box>\n ) : (\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text>Let's review your existing PostHog setup for best practices.</Text>\n </Box>\n );\n\n const menuOptions = showingMoreInfo\n ? [{ label: 'Back', value: 'back' }]\n : [\n { label: 'Continue', value: 'continue' },\n { label: 'More info', value: 'more-info' },\n { label: 'Cancel', value: 'cancel' },\n ];\n\n const handleSelect = (value: string) => {\n if (value === 'cancel') process.exit(0);\n else if (value === 'more-info') setShowingMoreInfo(true);\n else if (value === 'back') setShowingMoreInfo(false);\n else store.completeSetup();\n };\n\n return (\n <IntroScreenLayout\n installDir={session.installDir}\n body={body}\n showDetection={!showingMoreInfo}\n programLabel={session.programLabel}\n skillId={session.skillId}\n menuOptions={menuOptions}\n onSelect={handleSelect}\n />\n );\n};\n","/**\n * File watcher (UI concern).\n *\n * `fs.watch` alone is unreliable for atomic-rename writes (which is how Claude\n * rewrites JSON files), so the watcher pairs `fs.watch` with a continuous\n * mtime-polled re-read. The poll catches missed events; the watch keeps\n * latency low when it does fire. We dedupe with `mtimeMs` so steady-state\n * polls cost a single `stat`.\n *\n * Screens that need to mirror an agent-emitted JSON file into the store call\n * `useFileWatcher(absolutePath, onUpdate)`; the watcher starts on mount and\n * tears down on unmount.\n */\n\nimport * as fs from 'fs';\nimport { useEffect } from 'react';\n\nconst DEFAULT_POLL_INTERVAL_MS = 5000;\nconst DEFAULT_ATTACH_RETRY_INTERVAL_MS = 1000;\n\nexport interface FileWatcherHandle {\n stop(): void;\n}\n\nexport interface FileWatcherOptions {\n /** ms between mtime checks once the file exists. */\n pollIntervalMs?: number;\n /** ms between attach attempts while waiting for the file to appear. */\n attachRetryIntervalMs?: number;\n}\n\n/** Watch `path` for JSON updates and call `onUpdate(parsed)` whenever the\n * file's mtime changes and the contents are valid JSON. Caller must invoke\n * `handle.stop()` to release the watcher. */\nexport function startFileWatcher(\n path: string,\n onUpdate: (parsed: unknown) => void,\n options: FileWatcherOptions = {},\n): FileWatcherHandle {\n const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const attachRetryIntervalMs =\n options.attachRetryIntervalMs ?? DEFAULT_ATTACH_RETRY_INTERVAL_MS;\n\n const watchers: fs.FSWatcher[] = [];\n const intervals: Array<ReturnType<typeof setInterval>> = [];\n let lastMtimeMs = 0;\n\n const read = (force = false) => {\n try {\n const stat = fs.statSync(path);\n if (!force && stat.mtimeMs === lastMtimeMs) return;\n lastMtimeMs = stat.mtimeMs;\n const parsed: unknown = JSON.parse(fs.readFileSync(path, 'utf-8'));\n onUpdate(parsed);\n } catch {\n // File missing or not yet valid JSON.\n }\n };\n\n intervals.push(setInterval(() => read(), pollIntervalMs));\n\n try {\n watchers.push(fs.watch(path, () => read(true)));\n read(true);\n } catch {\n // File doesn't exist yet — retry attaching the watch periodically until\n // it appears. The poll above already covers updates; this just upgrades\n // latency once the file shows up.\n const attachInterval = setInterval(() => {\n try {\n fs.accessSync(path);\n clearInterval(attachInterval);\n const idx = intervals.indexOf(attachInterval);\n if (idx >= 0) intervals.splice(idx, 1);\n watchers.push(fs.watch(path, () => read(true)));\n } catch {\n // Still waiting.\n }\n }, attachRetryIntervalMs);\n intervals.push(attachInterval);\n }\n\n return {\n stop() {\n for (const w of watchers) w.close();\n for (const i of intervals) clearInterval(i);\n },\n };\n}\n\n/** React hook wrapping `startFileWatcher`. Starts on mount, stops on unmount\n * or when `path` changes. `onUpdate` and `options` are captured at mount\n * time — change `path` to restart with a new callback. */\nexport function useFileWatcher(\n path: string,\n onUpdate: (parsed: unknown) => void,\n options: FileWatcherOptions = {},\n): void {\n useEffect(() => {\n const handle = startFileWatcher(path, onUpdate, options);\n return () => handle.stop();\n // `onUpdate` and `options` are intentionally omitted from deps — the\n // watcher captures them at mount time and the path drives restarts.\n }, [path]);\n}\n","/**\n * AuditAreaPane — left-pane slide that follows whatever area the agent is\n * currently checking, plus a wrap-up state once every check is resolved\n * and the agent has moved on to writing the report.\n *\n * Three states, gated top-down on the ledger:\n * 1. firstPending defined → render the slide for that area\n * 2. checks empty → blank (the seed hook fires before\n * this screen mounts in practice;\n * this is just defensive)\n * 3. all checks non-pending → \"writing report\" wrap-up\n *\n * Pressing `O` opens the active slide's docs URL.\n */\n\nimport { Fragment } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { spawn } from 'node:child_process';\nimport { Colors } from '@ui/tui/styles';\nimport { type AuditCheck } from '@lib/programs/audit/types';\nimport { AUDIT_AREA_SLIDES, type AreaSlide } from './slides/index.js';\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\nconst FINDING_STATUSES: AuditCheck['status'][] = [\n 'error',\n 'warning',\n 'suggestion',\n];\n\nconst isFinding = (c: AuditCheck) => FINDING_STATUSES.includes(c.status);\n\nconst fallbackSlide = (area: string): AreaSlide => ({\n area,\n intro: [`Verifying ${area.toLowerCase()}…`],\n docsUrl: '',\n});\n\nconst openLink = (url: string) => {\n const cmd =\n process.platform === 'darwin'\n ? 'open'\n : process.platform === 'win32'\n ? 'cmd'\n : 'xdg-open';\n const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];\n spawn(cmd, args, { detached: true, stdio: 'ignore' }).unref();\n};\n\n// ── Component ────────────────────────────────────────────────────────\n\ninterface AuditAreaPaneProps {\n checks: AuditCheck[];\n reportPath: string;\n /** Slide registry to look the active area up in. Defaults to the doctor\n * (`audit` program) slides; events-audit passes its own 6-phase set. */\n slides?: AreaSlide[];\n /** Dashboard URL once the agent emits `[DASHBOARD_URL]`. Shown as a sticky\n * footer so the user can grab the link while later phases still run. */\n dashboardUrl?: string | null;\n /** Notebook URL once the agent emits `[NOTEBOOK_URL]`. Same sticky-footer\n * treatment as the dashboard URL. */\n notebookUrl?: string | null;\n}\n\nexport const AuditAreaPane = ({\n checks,\n reportPath,\n slides = AUDIT_AREA_SLIDES,\n dashboardUrl,\n notebookUrl,\n}: AuditAreaPaneProps) => {\n const pendingChecks = checks.filter((c) => c.status === 'pending');\n const activeArea = pendingChecks[0]?.area;\n const slide = activeArea\n ? slides.find((s) => s.area === activeArea) ?? fallbackSlide(activeArea)\n : null;\n\n useInput((input) => {\n if (input.toLowerCase() === 'o' && slide?.docsUrl) {\n openLink(slide.docsUrl);\n }\n });\n\n const urlsFooter =\n dashboardUrl || notebookUrl ? (\n <UrlsFooter dashboardUrl={dashboardUrl} notebookUrl={notebookUrl} />\n ) : null;\n\n // Active area — agent is still resolving checks for this slide's area.\n if (slide) {\n const hasFindings = checks.some(isFinding);\n return (\n <Box flexDirection=\"column\">\n <ActiveSlide slide={slide} hasFindings={hasFindings} />\n {urlsFooter}\n </Box>\n );\n }\n\n // Ledger empty — the seed hook fires synchronously at intro `onReady`,\n // so this only happens if the seed file write failed. Render nothing\n // rather than misleading the user with a \"wrapped up\" message.\n if (checks.length === 0) {\n return null;\n }\n\n // Every check is resolved and the agent is composing the report.\n return (\n <Box flexDirection=\"column\">\n <WritingReport reportPath={reportPath} />\n {urlsFooter}\n </Box>\n );\n};\n\n// ── States ───────────────────────────────────────────────────────────\n\nconst ActiveSlide = ({\n slide,\n hasFindings,\n}: {\n slide: AreaSlide;\n hasFindings: boolean;\n}) => (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold color={Colors.accent}>\n Verifying {slide.area.toLowerCase()}\n </Text>\n <Box height={1} />\n\n {slide.visual}\n {slide.intro.map((paragraph, i) => (\n <Fragment key={i}>\n {i > 0 && <Box height={1} />}\n <Text>{paragraph}</Text>\n </Fragment>\n ))}\n\n <Box marginTop={1}>\n <Text dimColor>\n {slide.docsUrl && (\n <>\n [<Text color={Colors.accent}>O</Text>] Learn more\n </>\n )}\n {hasFindings && (\n <>\n {slide.docsUrl && ' '}[<Text color={Colors.accent}>→</Text>] View\n issues\n </>\n )}\n </Text>\n </Box>\n </Box>\n);\n\nconst UrlsFooter = ({\n dashboardUrl,\n notebookUrl,\n}: {\n dashboardUrl?: string | null;\n notebookUrl?: string | null;\n}) => (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text dimColor>{'─'.repeat(40)}</Text>\n {dashboardUrl && (\n <Text>\n Dashboard: <Text color=\"cyan\">{dashboardUrl}</Text>\n </Text>\n )}\n {notebookUrl && (\n <Text>\n Notebook: <Text color=\"cyan\">{notebookUrl}</Text>\n </Text>\n )}\n </Box>\n);\n\nconst WritingReport = ({ reportPath }: { reportPath: string }) => (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold color={Colors.accent}>\n We've wrapped up the review.\n </Text>\n <Box height={1} />\n <Text>\n To help you get the most out of your PostHog integration, we're preparing\n a report for you at <Text color=\"cyan\">{reportPath}</Text>.\n </Text>\n <Box height={1} />\n <Text>\n We'll cover what we checked and suggest where we can improve the existing\n integration.\n </Text>\n <Box height={1} />\n <Text dimColor>Hang tight!</Text>\n </Box>\n);\n","import { Text } from 'ink';\nimport { VisualBox, type AreaSlide } from '../shared.js';\n\nconst DetectVisual = () => (\n <VisualBox>\n <Text dimColor>package.json</Text>\n <Text>\n <Text dimColor>{' └─ '}</Text>\n <Text color=\"green\">posthog-js</Text>\n <Text dimColor>{' ^1.200.0'}</Text>\n </Text>\n <Text dimColor>requirements.txt</Text>\n <Text>\n <Text dimColor>{' └─ '}</Text>\n <Text color=\"green\">posthog</Text>\n <Text dimColor>{' ==4.0.1'}</Text>\n </Text>\n </VisualBox>\n);\n\nexport const DetectSdkSlide: AreaSlide = {\n area: 'Detect SDK',\n intro: [\n 'First we find which PostHog SDKs your project uses. The audit needs to know the right languages and frameworks before it looks at any code.',\n 'Only dependency manifests get read here: package.json, requirements.txt, go.mod, and similar files. Source files come in a later step.',\n 'If your project is a monorepo with more than one SDK, we handle each one.',\n ],\n visual: <DetectVisual />,\n docsUrl: 'https://posthog.com/docs/libraries',\n};\n","import { Text } from 'ink';\nimport { VisualBox, type AreaSlide } from '../shared.js';\n\nconst ScanVisual = () => (\n <VisualBox>\n <Text dimColor>grep -rn 'posthog\\.(capture|identify|group)'</Text>\n <Text>\n <Text color=\"cyan\">src/checkout/Checkout.tsx:88</Text>\n <Text dimColor>{' posthog.capture(...)'}</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">src/auth/login.ts:42</Text>\n <Text dimColor>{' posthog.identify(...)'}</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">src/onboarding/step.tsx:17</Text>\n <Text dimColor>{' posthog.capture(...)'}</Text>\n </Text>\n </VisualBox>\n);\n\nexport const ScanSitesSlide: AreaSlide = {\n area: 'Scan capture sites',\n intro: [\n 'Next we map every place your code captures PostHog events. This is the inventory the rest of the audit builds on.',\n 'We search your project for PostHog SDK calls: capture, identify, group, and more. No source files are opened yet, that comes in the next step.',\n \"Test files are excluded so they don't pollute the inventory.\",\n ],\n visual: <ScanVisual />,\n docsUrl: 'https://posthog.com/docs/product-analytics/capture-events',\n};\n","import { Text } from 'ink';\nimport { VisualBox, type AreaSlide } from '../shared.js';\n\nconst EnrichVisual = () => (\n <VisualBox>\n <Text dimColor>orchestrator</Text>\n <Text dimColor>{' │'}</Text>\n <Text>\n <Text dimColor>{' ├─ '}</Text>\n <Text color=\"cyan\">subagent 1</Text>\n <Text dimColor>{' → part-1.json'}</Text>\n </Text>\n <Text>\n <Text dimColor>{' ├─ '}</Text>\n <Text color=\"cyan\">subagent 2</Text>\n <Text dimColor>{' → part-2.json'}</Text>\n </Text>\n <Text>\n <Text dimColor>{' └─ '}</Text>\n <Text color=\"cyan\">subagent N</Text>\n <Text dimColor>{' → part-N.json'}</Text>\n </Text>\n </VisualBox>\n);\n\nexport const EnrichSitesSlide: AreaSlide = {\n area: 'Enrich',\n intro: [\n 'Now we look inside each file that captures events. The goal is to know not just that an event fires, but what it is, where it lives, and what data goes with it.',\n 'For every capture site we pull out the event name, the properties, the area of your codebase it sits in, and the surrounding function or component.',\n 'This is the only step that opens source files. Large codebases run in parallel so it finishes in one pass.',\n ],\n visual: <EnrichVisual />,\n docsUrl: 'https://posthog.com/docs/product-analytics/best-practices',\n};\n","import { Text } from 'ink';\nimport { VisualBox, type AreaSlide } from '../shared.js';\n\nconst QueryVisual = () => (\n <VisualBox>\n <Text dimColor>{'SELECT event, count() AS volume_30d'}</Text>\n <Text dimColor>\n {'FROM events WHERE timestamp > now() - INTERVAL 30 DAY'}\n </Text>\n <Text dimColor>{'GROUP BY event ORDER BY volume_30d DESC'}</Text>\n <Text> </Text>\n <Text>\n <Text color=\"cyan\">{'pageview '}</Text>\n <Text color=\"green\">{'12,430'}</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">{'signup_completed '}</Text>\n <Text color=\"green\">{' 840'}</Text>\n </Text>\n </VisualBox>\n);\n\nexport const QueryVolumeSlide: AreaSlide = {\n area: 'Query PostHog',\n intro: [\n 'We ask PostHog how often each event in the inventory has fired in the last 30 days.',\n \"Events your code captures but PostHog has never seen are flagged as phantoms. Phantoms usually mean a typo, a dead code path, or instrumentation that hasn't shipped yet. Worth cleaning up.\",\n \"If PostHog isn't reachable the audit still finishes. The report just notes where volume numbers would have gone.\",\n ],\n visual: <QueryVisual />,\n docsUrl: 'https://posthog.com/docs/product-analytics/sql',\n};\n","import { Text } from 'ink';\nimport { VisualBox, type AreaSlide } from '../shared.js';\n\nconst ReportVisual = () => (\n <VisualBox>\n <Text dimColor>posthog-events-audit-report.md</Text>\n <Text>\n <Text dimColor>{' # '}</Text>\n <Text>Identity & segmentation</Text>\n </Text>\n <Text>\n <Text dimColor>{' # '}</Text>\n <Text>Coverage map</Text>\n </Text>\n <Text>\n <Text dimColor>{' # '}</Text>\n <Text>Data quality</Text>\n </Text>\n <Text>\n <Text dimColor>{' # '}</Text>\n <Text>Events by file & area</Text>\n </Text>\n </VisualBox>\n);\n\nexport const WriteReportSlide: AreaSlide = {\n area: 'Write report',\n intro: [\n 'We package everything we found into one report at ./posthog-events-audit-report.md. This is what you hand to the team.',\n 'The report covers how users get identified, which parts of your codebase capture which events, data quality issues like duplicates and phantoms, and a volume map of every event your code captures.',\n 'Nothing in your project is modified. The report is the only file you keep.',\n ],\n visual: <ReportVisual />,\n docsUrl: 'https://posthog.com/docs/product-analytics/best-practices',\n};\n","import { Text } from 'ink';\nimport { VisualBox, type AreaSlide } from '../shared.js';\n\nconst DashboardVisual = () => (\n <VisualBox>\n <Text dimColor>events audit dashboard</Text>\n <Text>\n <Text color=\"cyan\">{'pageview '}</Text>\n <Text color=\"green\">{'████████████'}</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">{'signup '}</Text>\n <Text color=\"green\">{'████████'}</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">{'activated '}</Text>\n <Text color=\"green\">{'█████'}</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">{'purchased '}</Text>\n <Text color=\"green\">{'██'}</Text>\n </Text>\n </VisualBox>\n);\n\nexport const CreateDashboardSlide: AreaSlide = {\n area: 'Create dashboard',\n intro: [\n 'Finally we build a live PostHog dashboard for the events your code captures. Use it to watch volume over time, spot new phantoms, and see how traffic shifts as you ship changes.',\n 'Open the dashboard from the wrap-up screen when the audit completes.',\n ],\n visual: <DashboardVisual />,\n docsUrl: 'https://posthog.com/docs/product-analytics/dashboards',\n};\n","import { Text } from 'ink';\nimport { VisualBox, type AreaSlide } from '../shared.js';\n\nconst NotebookVisual = () => (\n <VisualBox>\n <Text dimColor>posthog-events-audit-report.md</Text>\n <Text dimColor>{' │'}</Text>\n <Text>\n <Text dimColor>{' ▼ '}</Text>\n <Text color=\"cyan\">PostHog notebook</Text>\n </Text>\n <Text dimColor>{' # Identity & segmentation'}</Text>\n <Text dimColor>{' # Coverage map'}</Text>\n <Text dimColor>{' # Events by file & area'}</Text>\n </VisualBox>\n);\n\nexport const UploadNotebookSlide: AreaSlide = {\n area: 'Upload notebook',\n intro: [\n 'Next we upload the report into a PostHog notebook so you can share it with your team as a URL.',\n 'Hang tight.',\n 'The markdown file on disk is still there for you to read locally.',\n ],\n visual: <NotebookVisual />,\n docsUrl: 'https://posthog.com/docs/notebooks',\n};\n","/**\n * Slide registry for the events-audit program. Each entry is keyed by\n * `AuditCheck.area` and corresponds to one phase of the 6-phase pipeline.\n *\n * `AuditAreaPane` looks up the active phase's slide here when the active\n * program is events-audit.\n */\n\nimport type { AreaSlide } from '../shared.js';\nimport { DetectSdkSlide } from './detectSdk.js';\nimport { ScanSitesSlide } from './scanSites.js';\nimport { EnrichSitesSlide } from './enrichSites.js';\nimport { QueryVolumeSlide } from './queryVolume.js';\nimport { WriteReportSlide } from './writeReport.js';\nimport { CreateDashboardSlide } from './createDashboard.js';\nimport { UploadNotebookSlide } from './uploadNotebook.js';\n\nexport const EVENTS_AUDIT_AREA_SLIDES: AreaSlide[] = [\n DetectSdkSlide,\n ScanSitesSlide,\n EnrichSitesSlide,\n QueryVolumeSlide,\n WriteReportSlide,\n CreateDashboardSlide,\n UploadNotebookSlide,\n];\n","import { Box, Text } from 'ink';\nimport { Spinner } from '@inkjs/ui';\nimport {\n AUDIT_SEVERITY_STYLE,\n type AuditCheck,\n} from '@lib/programs/audit/types';\nimport { Colors, Icons } from '@ui/tui/styles';\nimport { LoadingBox } from '@ui/tui/primitives/index';\nimport { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions';\n\ninterface PendingChecksListProps {\n checks: AuditCheck[];\n}\n\ninterface Group {\n area: string;\n checks: AuditCheck[];\n}\n\nfunction groupByArea(checks: AuditCheck[]): Group[] {\n const order: string[] = [];\n const map = new Map<string, AuditCheck[]>();\n for (const c of checks) {\n if (!map.has(c.area)) {\n map.set(c.area, []);\n order.push(c.area);\n }\n map.get(c.area)!.push(c);\n }\n return order.map((area) => ({ area, checks: map.get(area)! }));\n}\n\nfunction groupIcon(group: Group): { icon: string; color: string } {\n const total = group.checks.length;\n const complete = group.checks.filter((c) => c.status !== 'pending').length;\n if (complete === 0) return { icon: Icons.squareOpen, color: Colors.muted };\n if (complete === total)\n return { icon: Icons.squareFilled, color: Colors.success };\n return { icon: Icons.triangleRight, color: Colors.primary };\n}\n\nconst GroupHeader = ({\n group,\n showIcon,\n isActive,\n}: {\n group: Group;\n showIcon: boolean;\n isActive: boolean;\n}) => {\n const complete = group.checks.filter((c) => c.status !== 'pending').length;\n const total = group.checks.length;\n const { icon, color } = groupIcon(group);\n return (\n <Box>\n {isActive ? (\n <Box marginRight={1}>\n <Spinner />\n </Box>\n ) : showIcon ? (\n <Text>\n <Text color={color}>{icon}</Text>{' '}\n </Text>\n ) : null}\n <Text>\n <Text bold>{group.area}</Text>{' '}\n <Text dimColor>\n ({complete}/{total})\n </Text>\n </Text>\n </Box>\n );\n};\n\nconst CheckRow = ({ check }: { check: AuditCheck }) => {\n const { glyph, color } = AUDIT_SEVERITY_STYLE[check.status];\n return (\n <Text>\n <Text color={color}>{glyph}</Text>\n <Text dimColor={check.status === 'pending'}> {check.label}</Text>\n </Text>\n );\n};\n\nconst COLLAPSE_BELOW_ROWS = 24;\n\nexport const PendingChecksList = ({ checks }: PendingChecksListProps) => {\n const [, termRows] = useStdoutDimensions();\n\n if (checks.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>Checks</Text>\n <Text> </Text>\n <LoadingBox message=\"Seeding audit checklist...\" />\n </Box>\n );\n }\n\n const groups = groupByArea(checks);\n const activeIndex = groups.findIndex((g) =>\n g.checks.some((c) => c.status === 'pending'),\n );\n const collapsed = termRows < COLLAPSE_BELOW_ROWS;\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>Checks</Text>\n <Text> </Text>\n {collapsed\n ? groups.map((group, i) => (\n <GroupHeader\n key={group.area}\n group={group}\n showIcon\n isActive={i === activeIndex}\n />\n ))\n : groups.map((group, i) => (\n <Box\n key={group.area}\n flexDirection=\"column\"\n marginTop={i === 0 ? 0 : 1}\n >\n <GroupHeader\n group={group}\n showIcon={false}\n isActive={i === activeIndex}\n />\n {group.checks.map((c) => (\n <CheckRow key={c.id} check={c} />\n ))}\n </Box>\n ))}\n </Box>\n );\n};\n","import { useSyncExternalStore } from 'react';\nimport { join } from 'node:path';\nimport { Box } from 'ink';\nimport type { WizardStore } from '@ui/tui/store';\nimport {\n TabContainer,\n SplitView,\n LogViewer,\n HNViewer,\n} from '@ui/tui/primitives/index';\nimport { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions';\nimport { useFileWatcher } from '@ui/tui/hooks/file-watcher';\nimport { AuditChecksViewer } from './AuditChecksViewer/AuditChecksViewer.js';\nimport { AuditAreaPane } from './AuditAreaPane.js';\nimport { AUDIT_AREA_SLIDES } from './slides/index.js';\nimport { EVENTS_AUDIT_AREA_SLIDES } from './slides/events-audit/index.js';\nimport { PendingChecksList } from './PendingChecksList.js';\nimport {\n AUDIT_CHECKS_FILE,\n AUDIT_CHECKS_KEY,\n AUDIT_REPORT_FILE,\n coerceAuditChecks,\n getAuditChecks,\n} from '@lib/programs/audit/types';\nimport { getProgramConfig } from '@lib/programs/program-registry';\nimport { WIZARD_LOG_FILE } from '@utils/paths';\n\ninterface AuditRunScreenProps {\n store: WizardStore;\n}\n\nexport const AuditRunScreen = ({ store }: AuditRunScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n // Mirror the agent's audit ledger into the store.\n useFileWatcher(join(store.session.installDir, AUDIT_CHECKS_FILE), (parsed) =>\n store.setFrameworkContext(AUDIT_CHECKS_KEY, coerceAuditChecks(parsed)),\n );\n\n const statuses =\n store.statusMessages.length > 0 ? store.statusMessages : undefined;\n\n const [columns] = useStdoutDimensions();\n const checks = getAuditChecks(store.session);\n const reportFile =\n getProgramConfig(store.router.activeProgram).reportFile ??\n AUDIT_REPORT_FILE;\n const reportPath = `./${reportFile}`;\n const pendingChecksList = <PendingChecksList checks={checks} />;\n const slides =\n store.session.skillId === 'events-audit'\n ? EVENTS_AUDIT_AREA_SLIDES\n : AUDIT_AREA_SLIDES;\n const areaPane = (\n <AuditAreaPane\n checks={checks}\n reportPath={reportPath}\n slides={slides}\n dashboardUrl={store.session.dashboardUrl}\n notebookUrl={store.session.notebookUrl}\n />\n );\n\n // Narrow terminals: drop the area pane.\n const statusComponent =\n columns < 80 ? (\n <Box flexDirection=\"column\" flexGrow={1}>\n {pendingChecksList}\n </Box>\n ) : (\n <SplitView left={areaPane} right={pendingChecksList} />\n );\n\n const tabs = [\n { id: 'status', label: 'Status', component: statusComponent },\n {\n id: 'audit-checks',\n label: 'Audit plan',\n component: <AuditChecksViewer checks={checks} />,\n },\n {\n id: 'logs',\n label: 'Tail logs',\n component: <LogViewer filePath={WIZARD_LOG_FILE} />,\n },\n { id: 'hn', label: 'HN', component: <HNViewer /> },\n ];\n\n return (\n <TabContainer\n tabs={tabs}\n statusMessage={statuses}\n expandableStatus\n store={store}\n />\n );\n};\n","import { Box, Text } from 'ink';\nimport {\n AUDIT_SEVERITY_STYLE,\n type AuditCheck,\n} from '@lib/programs/audit/types';\nimport { relativeToInstallDir } from '@utils/paths';\n\ninterface AuditChecksOutroSectionProps {\n checks: AuditCheck[];\n installDir: string;\n}\n\nconst MAX_VISIBLE = 6;\n\nexport const AuditChecksOutroSection = ({\n checks,\n installDir,\n}: AuditChecksOutroSectionProps) => {\n if (checks.length === 0) return null;\n\n const errors = checks.filter((c) => c.status === 'error');\n const warnings = checks.filter((c) => c.status === 'warning');\n const suggestions = checks.filter((c) => c.status === 'suggestion');\n const problematic = [...errors, ...warnings, ...suggestions];\n\n const visible = problematic.slice(0, MAX_VISIBLE);\n const hidden = problematic.length - visible.length;\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"cyan\" bold>\n Items audited:\n </Text>\n <Text dimColor>\n {checks.length} checks · {errors.length} errors · {warnings.length}{' '}\n warnings · {suggestions.length} suggestions\n </Text>\n {problematic.length === 0 ? (\n <Text color=\"green\">{'•'} No issues found.</Text>\n ) : (\n <>\n {visible.map((item) => {\n const style = AUDIT_SEVERITY_STYLE[item.status];\n return (\n <Box key={item.id} flexDirection=\"column\" marginTop={1}>\n <Text>\n <Text color={style.color}>{style.glyph}</Text>{' '}\n <Text bold>{item.label}</Text>{' '}\n <Text dimColor>({item.area})</Text>\n </Text>\n {item.file && (\n <Text dimColor>\n {' '}\n {relativeToInstallDir(item.file, installDir)}\n </Text>\n )}\n </Box>\n );\n })}\n {hidden > 0 && (\n <Text dimColor>\n … and {hidden} more. See the report for details.\n </Text>\n )}\n </>\n )}\n </Box>\n );\n};\n","/**\n * AuditOutroScreen — Audit-specific post-run summary. Renders the standard\n * success / error / cancel views with the audit checks summary inlined into\n * the success body. The report path shown in the success headline comes from\n * the program's `successMessage`, so this screen is program-agnostic.\n */\n\nimport { join } from 'node:path';\nimport { Box, Text, useInput } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { OutroKind } from '@lib/wizard-session';\nimport { Colors } from '@ui/tui/styles';\nimport { getAuditChecks } from '@lib/programs/audit/types';\nimport { AuditChecksOutroSection } from './AuditChecksOutroSection.js';\n\ninterface AuditOutroScreenProps {\n store: WizardStore;\n}\n\nexport const AuditOutroScreen = ({ store }: AuditOutroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n useInput(() => {\n store.setOutroDismissed();\n });\n\n const outroData = store.session.outroData;\n\n if (!outroData) {\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text dimColor>Finishing up...</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n {outroData.kind === OutroKind.Success && (\n <Box flexDirection=\"column\">\n <Text color=\"green\" bold>\n ✔ {outroData.message || 'Audit complete!'}\n </Text>\n\n {outroData.dashboardUrl && (\n <Box marginTop={1}>\n <Text>\n Dashboard: <Text color=\"cyan\">{outroData.dashboardUrl}</Text>\n </Text>\n </Box>\n )}\n\n {outroData.notebookUrl && (\n <Box marginTop={1}>\n <Text>\n Notebook: <Text color=\"cyan\">{outroData.notebookUrl}</Text>\n </Text>\n </Box>\n )}\n\n {outroData.reportFile && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"cyan\" bold>\n Report saved to:\n </Text>\n <Text>\n {join(store.session.installDir, outroData.reportFile)}\n </Text>\n <Text dimColor>\n A markdown file in your project folder. Open it in any editor to\n read the full audit.\n </Text>\n </Box>\n )}\n\n <AuditChecksOutroSection\n checks={getAuditChecks(store.session)}\n installDir={store.session.installDir}\n />\n\n {outroData.docsUrl && (\n <Box marginTop={1}>\n <Text>\n Learn more: <Text color=\"cyan\">{outroData.docsUrl}</Text>\n </Text>\n </Box>\n )}\n </Box>\n )}\n\n {outroData.kind === OutroKind.Error && (\n <Box flexDirection=\"column\">\n <Text color=\"red\" bold>\n ✘ {outroData.message || 'An error occurred'}\n </Text>\n {outroData.body && (\n <Box marginTop={1}>\n <Text dimColor>{outroData.body}</Text>\n </Box>\n )}\n </Box>\n )}\n\n {outroData.kind === OutroKind.Cancel && (\n <Text color=\"yellow\">■ {outroData.message || 'Cancelled'}</Text>\n )}\n\n <Box marginTop={1}>\n <Text color={Colors.muted}>Press any key to continue</Text>\n </Box>\n </Box>\n );\n};\n","// PostHog brand palette, tuned for the arcade theme. Shared by the\n// audit-3000 intro panel and the hedgehog runner mini-game.\nexport const NEON_PINK = '#F54E00';\nexport const NEON_BLUE = '#1D4AFF';\nexport const NEON_GOLD = '#F9BD2B';\n","import { Box, Text } from 'ink';\nimport { useEffect, useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { IntroScreenLayout } from '@ui/tui/screens/IntroScreenLayout';\nimport { SkillSourceInfo, useSkillEntry } from '@ui/tui/screens/SkillSourceInfo';\nimport { NEON_BLUE, NEON_GOLD, NEON_PINK } from './arcade-colors.js';\n\nconst AUDIT3000_SKILL_ID = 'audit-3000';\n\nconst ArcadeBanner = () => {\n // Blink the \"INSERT COIN\" tagline once per 600ms — classic attract-mode\n // pacing without burning Ink with rapid re-renders.\n const [blinkOn, setBlinkOn] = useState(true);\n useEffect(() => {\n const id = setInterval(() => setBlinkOn((v) => !v), 600);\n return () => clearInterval(id);\n }, []);\n\n const top = '\\u250F' + '\\u2501'.repeat(32) + '\\u2513';\n const bottom = '\\u2517' + '\\u2501'.repeat(32) + '\\u251B';\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text bold color={NEON_PINK}>\n {top}\n </Text>\n <Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n <Text bold color={NEON_GOLD}>\n {' A U D I T '}\n </Text>\n <Text bold color={NEON_BLUE}>\n {'-'}\n </Text>\n <Text bold color={NEON_GOLD}>\n {' 3 0 0 0 '}\n </Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n </Text>\n <Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n <Text dimColor={!blinkOn} color={NEON_BLUE}>\n {' \\u25B6 INSERT COIN TO PLAY \\u25C0 '}\n </Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n </Text>\n <Text bold color={NEON_PINK}>\n {bottom}\n </Text>\n </Box>\n );\n};\n\ninterface Audit3000IntroScreenProps {\n store: WizardStore;\n}\n\nexport const Audit3000IntroScreen = ({ store }: Audit3000IntroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const [showingMoreInfo, setShowingMoreInfo] = useState(false);\n const { session } = store;\n const { skillEntry, fetchFailed } = useSkillEntry(\n AUDIT3000_SKILL_ID,\n session.localMcp,\n );\n\n const body = showingMoreInfo ? (\n <Box flexDirection=\"column\" width={56}>\n <Box marginBottom={1}>\n <Text>\n The wizard is an agent that executes PostHog tasks. Its code is open\n source: <Text color=\"cyan\">https://github.com/PostHog/wizard</Text>\n </Text>\n </Box>\n\n <Text>\n The{' '}\n <Text color=\"cyan\" italic>\n {AUDIT3000_SKILL_ID}\n </Text>{' '}\n program reviews your PostHog integration across 34 checks — SDK install,\n identification, event capture, event quality, stale feature flag\n hygiene, session replay (fix + optimize), and use-case expansion across\n 8 PostHog products. When enrichment is available it also produces a\n company profile and use-case match. Nothing in your project is modified.\n </Text>\n <Box marginTop={1}>\n <Text>\n Results stream live to the{' '}\n <Text color=\"cyan\" bold>\n Hi-score Table\n </Text>{' '}\n tab during the run — that's your live report. When the audit\n finishes, the same report is also exported to{' '}\n <Text color=\"cyan\">./posthog-audit-3000-report.md</Text> in your\n project folder.\n </Text>\n </Box>\n <Box marginTop={1}>\n <SkillSourceInfo\n skillId={AUDIT3000_SKILL_ID}\n skillEntry={skillEntry}\n fetchFailed={fetchFailed}\n />\n </Box>\n </Box>\n ) : (\n <Box flexDirection=\"column\" alignItems=\"center\">\n <ArcadeBanner />\n <Box marginTop={1} flexDirection=\"column\" alignItems=\"center\">\n <Text bold>34 checks. 9 levels. 1 final report.</Text>\n <Text dimColor>\n High-score your PostHog integration before the boss fight.\n </Text>\n <Box marginTop={1}>\n <Text dimColor>\n Live report: <Text color={NEON_GOLD}>Hi-score Table</Text> tab ·\n Export: ./posthog-audit-3000-report.md\n </Text>\n </Box>\n </Box>\n </Box>\n );\n\n const menuOptions = showingMoreInfo\n ? [{ label: 'Back', value: 'back' }]\n : [\n { label: 'PRESS START', value: 'continue' },\n { label: 'More info', value: 'more-info' },\n { label: 'Cancel', value: 'cancel' },\n ];\n\n const handleSelect = (value: string) => {\n if (value === 'cancel') process.exit(0);\n else if (value === 'more-info') setShowingMoreInfo(true);\n else if (value === 'back') setShowingMoreInfo(false);\n else store.completeSetup();\n };\n\n return (\n <IntroScreenLayout\n installDir={session.installDir}\n body={body}\n showDetection={!showingMoreInfo}\n programLabel={session.programLabel}\n skillId={session.skillId}\n menuOptions={menuOptions}\n onSelect={handleSelect}\n />\n );\n};\n","/**\n * Audit-3000 right pane — arcade-flavoured fork of `AuditAreaPane`.\n *\n * Mirrors the audit pane's three-state logic (active slide → empty →\n * wrap-up) but routes through the audit-3000 slide registry and uses\n * \"LEVEL N: <area>\" framing instead of \"Verifying ...\".\n */\n\nimport { Fragment } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { spawn } from 'node:child_process';\nimport { Colors } from '@ui/tui/styles';\nimport { type AuditCheck } from '@lib/programs/audit/types';\nimport { AUDIT_3000_AREA_SLIDES, type AreaSlide } from './slides/index.js';\n\nconst FINDING_STATUSES: AuditCheck['status'][] = [\n 'error',\n 'warning',\n 'suggestion',\n];\n\nconst isFinding = (c: AuditCheck) => FINDING_STATUSES.includes(c.status);\n\nconst fallbackSlide = (area: string): AreaSlide => ({\n area,\n intro: [`Now playing: ${area.toLowerCase()}\\u2026`],\n docsUrl: '',\n});\n\nconst openLink = (url: string) => {\n const cmd =\n process.platform === 'darwin'\n ? 'open'\n : process.platform === 'win32'\n ? 'cmd'\n : 'xdg-open';\n const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];\n spawn(cmd, args, { detached: true, stdio: 'ignore' }).unref();\n};\n\ninterface Audit3000AreaPaneProps {\n checks: AuditCheck[];\n reportPath: string;\n}\n\nexport const Audit3000AreaPane = ({\n checks,\n reportPath,\n}: Audit3000AreaPaneProps) => {\n const pendingChecks = checks.filter((c) => c.status === 'pending');\n const activeArea = pendingChecks[0]?.area;\n const slide = activeArea\n ? AUDIT_3000_AREA_SLIDES.find((s) => s.area === activeArea) ??\n fallbackSlide(activeArea)\n : null;\n\n const levelIndex = activeArea\n ? AUDIT_3000_AREA_SLIDES.findIndex((s) => s.area === activeArea)\n : -1;\n const level = levelIndex >= 0 ? levelIndex + 1 : null;\n\n useInput((input) => {\n if (input.toLowerCase() === 'o' && slide?.docsUrl) {\n openLink(slide.docsUrl);\n }\n });\n\n if (slide) {\n const hasFindings = checks.some(isFinding);\n return (\n <ActiveSlide slide={slide} level={level} hasFindings={hasFindings} />\n );\n }\n\n if (checks.length === 0) {\n return null;\n }\n\n return <WritingReport reportPath={reportPath} />;\n};\n\nconst ActiveSlide = ({\n slide,\n level,\n hasFindings,\n}: {\n slide: AreaSlide;\n level: number | null;\n hasFindings: boolean;\n}) => (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold color={Colors.accent}>\n {level ? `LEVEL ${level}: ` : ''}\n {slide.area.toUpperCase()}\n </Text>\n <Box height={1} />\n\n {slide.visual}\n {slide.intro.map((paragraph, i) => (\n <Fragment key={i}>\n {i > 0 && <Box height={1} />}\n <Text>{paragraph}</Text>\n </Fragment>\n ))}\n\n <Box marginTop={1}>\n <Text dimColor>\n {slide.docsUrl && (\n <>\n [<Text color={Colors.accent}>O</Text>] Learn more\n </>\n )}\n {hasFindings && (\n <>\n {slide.docsUrl && ' '}[\n <Text color={Colors.accent}>{'\\u2192'}</Text>] View issues\n </>\n )}\n </Text>\n </Box>\n </Box>\n);\n\nconst WritingReport = ({ reportPath }: { reportPath: string }) => (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold color={Colors.accent}>\n STAGE CLEAR.\n </Text>\n <Box height={1} />\n <Text>\n All checks resolved. Compiling your high-score reel at{' '}\n <Text color=\"cyan\">{reportPath}</Text>.\n </Text>\n <Box height={1} />\n <Text>\n The report covers everything we checked, what we found, and what to do\n next.\n </Text>\n <Box height={1} />\n <Text dimColor>{'Stand by\\u2026'}</Text>\n </Box>\n);\n","/**\n * Audit-3000 left pane on the Run screen. Arcade-flavoured fork of the\n * audit program's `PendingChecksList`: a running score banner sits on\n * top, then the area-level \"level\" headers underneath.\n *\n * Per-check rows are deliberately omitted here — the Hi-score Table tab\n * has the full check-by-check breakdown. This pane is the at-a-glance\n * stage overview.\n */\n\nimport { Box, Text } from 'ink';\nimport { Spinner } from '@inkjs/ui';\nimport {\n type AuditCheck,\n type AuditStatus,\n} from '@lib/programs/audit/types';\nimport { Colors, Icons } from '@ui/tui/styles';\nimport { LoadingBox } from '@ui/tui/primitives/index';\n\nconst NEON_PINK = '#F54E00';\nconst NEON_GOLD = '#F9BD2B';\nconst NEON_BLUE = '#1D4AFF';\n\ninterface Audit3000ChecksPanelProps {\n checks: AuditCheck[];\n}\n\ninterface Group {\n area: string;\n checks: AuditCheck[];\n}\n\nfunction groupByArea(checks: AuditCheck[]): Group[] {\n const order: string[] = [];\n const map = new Map<string, AuditCheck[]>();\n for (const c of checks) {\n if (!map.has(c.area)) {\n map.set(c.area, []);\n order.push(c.area);\n }\n map.get(c.area)!.push(c);\n }\n return order.map((area) => ({ area, checks: map.get(area)! }));\n}\n\nfunction countByStatus(checks: AuditCheck[]): Record<AuditStatus, number> {\n const counts: Record<AuditStatus, number> = {\n pending: 0,\n pass: 0,\n error: 0,\n warning: 0,\n suggestion: 0,\n };\n for (const c of checks) counts[c.status] += 1;\n return counts;\n}\n\nconst ScoreBanner = ({ checks }: { checks: AuditCheck[] }) => {\n const counts = countByStatus(checks);\n const resolved = checks.length - counts.pending;\n const issues = counts.error + counts.warning + counts.suggestion;\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text>\n <Text bold color={NEON_PINK}>\n {'SCORE '}\n </Text>\n <Text bold color={NEON_GOLD}>\n {resolved.toString().padStart(2, '0')}\n </Text>\n <Text dimColor>{' / '}</Text>\n <Text bold>{checks.length.toString().padStart(2, '0')}</Text>\n </Text>\n <Text>\n <Text color=\"green\">{`PASS \\u25B2 ${counts.pass}`}</Text>\n <Text>{' '}</Text>\n <Text color={NEON_PINK}>{`MISS \\u25BC ${issues}`}</Text>\n <Text>{' '}</Text>\n <Text dimColor>{`QUEUE \\u25CB ${counts.pending}`}</Text>\n </Text>\n </Box>\n );\n};\n\nfunction groupIcon(group: Group): { icon: string; color: string } {\n const total = group.checks.length;\n const complete = group.checks.filter((c) => c.status !== 'pending').length;\n if (complete === 0) return { icon: Icons.squareOpen, color: Colors.muted };\n if (complete === total)\n return { icon: Icons.squareFilled, color: Colors.success };\n return { icon: Icons.triangleRight, color: Colors.primary };\n}\n\nconst GroupHeader = ({\n group,\n level,\n showIcon,\n isActive,\n}: {\n group: Group;\n level: number;\n showIcon: boolean;\n isActive: boolean;\n}) => {\n const complete = group.checks.filter((c) => c.status !== 'pending').length;\n const total = group.checks.length;\n const { icon, color } = groupIcon(group);\n return (\n <Box>\n {isActive ? (\n <Box marginRight={1}>\n <Spinner />\n </Box>\n ) : showIcon ? (\n <Text>\n <Text color={color}>{icon}</Text>{' '}\n </Text>\n ) : null}\n <Text>\n <Text color={NEON_BLUE} bold>{`L${level} `}</Text>\n <Text bold>{group.area}</Text>{' '}\n <Text dimColor>\n ({complete}/{total})\n </Text>\n </Text>\n </Box>\n );\n};\n\nexport const Audit3000ChecksPanel = ({ checks }: Audit3000ChecksPanelProps) => {\n if (checks.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>AUDIT-3000</Text>\n <Text> </Text>\n <LoadingBox message=\"Booting up arcade cabinet...\" />\n </Box>\n );\n }\n\n const groups = groupByArea(checks);\n const activeIndex = groups.findIndex((g) =>\n g.checks.some((c) => c.status === 'pending'),\n );\n\n return (\n <Box flexDirection=\"column\">\n <Text bold color={NEON_PINK}>\n AUDIT-3000\n </Text>\n <Text> </Text>\n <ScoreBanner checks={checks} />\n {groups.map((group, i) => (\n <GroupHeader\n key={group.area}\n group={group}\n level={i + 1}\n showIcon\n isActive={i === activeIndex}\n />\n ))}\n <Box marginTop={1}>\n <Text dimColor>\n Full breakdown: <Text color={NEON_GOLD}>Hi-score table (report)</Text>{' '}\n tab\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Hedgehog Runner — pure game engine.\n *\n * No Ink, React, or stdout imports. All state transitions are pure functions\n * so the game is deterministic given an RNG seed and unit-testable in\n * isolation from the TUI.\n *\n * The playfield is a fixed grid:\n * row 0: sky (rings can spawn here when hedgehog is mid-jump)\n * row 1: air (hedgehog occupies this row mid-jump; rings spawn here)\n * row 2: ground (hedgehog default position; spikes spawn here)\n *\n * Obstacles enter at the right edge (PLAYFIELD_WIDTH - 1) and move left one\n * column per tick. The hedgehog sits at HEDGEHOG_COL. Collision triggers when\n * an obstacle reaches HEDGEHOG_COL while occupying the same row as the\n * hedgehog.\n */\n\nexport const PLAYFIELD_WIDTH = 40;\nexport const HEDGEHOG_COL = 4;\nexport const GROUND_ROW = 2;\nexport const AIR_ROW = 1;\nexport const JUMP_DURATION_TICKS = 8;\nexport const SPAWN_COOLDOWN_MIN = 6;\nexport const SPAWN_COOLDOWN_MAX = 14;\nexport const RING_VALUE = 5;\n\nexport type HedgehogState = 'grounded' | 'jumping';\n\nexport interface Obstacle {\n kind: 'spike' | 'ring';\n x: number;\n row: number;\n}\n\nexport interface GameState {\n hedgehogState: HedgehogState;\n hedgehogRow: number;\n jumpFramesRemaining: number;\n obstacles: Obstacle[];\n score: number;\n hiScore: number;\n isGameOver: boolean;\n tick: number;\n ticksUntilNextSpawn: number;\n rngSeed: number;\n}\n\n// Mulberry32 — deterministic PRNG, used so tests can assert exact sequences.\nfunction nextRandom(seed: number): { value: number; nextSeed: number } {\n let t = (seed + 0x6d2b79f5) >>> 0;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n const value = ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n return { value, nextSeed: t >>> 0 };\n}\n\nfunction randomInt(seed: number, min: number, max: number) {\n const { value, nextSeed } = nextRandom(seed);\n return {\n value: min + Math.floor(value * (max - min + 1)),\n nextSeed,\n };\n}\n\nexport function initialState(hiScore = 0, rngSeed = 1): GameState {\n return {\n hedgehogState: 'grounded',\n hedgehogRow: GROUND_ROW,\n jumpFramesRemaining: 0,\n obstacles: [],\n score: 0,\n hiScore,\n isGameOver: false,\n tick: 0,\n ticksUntilNextSpawn: SPAWN_COOLDOWN_MIN,\n rngSeed,\n };\n}\n\nexport function jump(state: GameState): GameState {\n if (state.isGameOver) return state;\n if (state.hedgehogState !== 'grounded') return state;\n return {\n ...state,\n hedgehogState: 'jumping',\n hedgehogRow: AIR_ROW,\n jumpFramesRemaining: JUMP_DURATION_TICKS,\n };\n}\n\nexport function restart(state: GameState): GameState {\n return initialState(state.hiScore, state.rngSeed);\n}\n\nexport function tick(state: GameState): GameState {\n if (state.isGameOver) return state;\n\n let { hedgehogState, hedgehogRow, jumpFramesRemaining } = state;\n if (hedgehogState === 'jumping') {\n jumpFramesRemaining -= 1;\n if (jumpFramesRemaining <= 0) {\n hedgehogState = 'grounded';\n hedgehogRow = GROUND_ROW;\n jumpFramesRemaining = 0;\n }\n }\n\n const movedObstacles: Obstacle[] = [];\n let scoreDelta = 1;\n let hit = false;\n for (const obs of state.obstacles) {\n const next = { ...obs, x: obs.x - 1 };\n if (next.x < 0) continue;\n if (next.x === HEDGEHOG_COL && next.row === hedgehogRow) {\n if (next.kind === 'spike') {\n hit = true;\n movedObstacles.push(next);\n continue;\n }\n // Ring collected — score it and drop from the field.\n scoreDelta += RING_VALUE;\n continue;\n }\n movedObstacles.push(next);\n }\n\n let rngSeed = state.rngSeed;\n let ticksUntilNextSpawn = state.ticksUntilNextSpawn - 1;\n if (ticksUntilNextSpawn <= 0) {\n const kindRoll = nextRandom(rngSeed);\n rngSeed = kindRoll.nextSeed;\n const kind: Obstacle['kind'] = kindRoll.value < 0.65 ? 'spike' : 'ring';\n const row = kind === 'spike' ? GROUND_ROW : AIR_ROW;\n movedObstacles.push({ kind, x: PLAYFIELD_WIDTH - 1, row });\n\n const cooldown = randomInt(rngSeed, SPAWN_COOLDOWN_MIN, SPAWN_COOLDOWN_MAX);\n rngSeed = cooldown.nextSeed;\n ticksUntilNextSpawn = cooldown.value;\n }\n\n const score = state.score + scoreDelta;\n const isGameOver = hit;\n const hiScore = isGameOver ? Math.max(state.hiScore, score) : state.hiScore;\n\n return {\n hedgehogState,\n hedgehogRow,\n jumpFramesRemaining,\n obstacles: movedObstacles,\n score,\n hiScore,\n isGameOver,\n tick: state.tick + 1,\n ticksUntilNextSpawn,\n rngSeed,\n };\n}\n","/**\n * HedgehogRunner — playable arcade game shown while the audit runs.\n *\n * Game state lives in the parent (Audit3000RunScreen) so it survives tab\n * switches. This component owns the render loop (setInterval) and key\n * bindings; when the user switches tabs the component unmounts, the\n * interval clears, and state freezes in the parent — free pause behaviour.\n */\n\nimport { Box, Text } from 'ink';\nimport { Fragment, useEffect, type Dispatch, type SetStateAction } from 'react';\nimport { Colors } from '@ui/tui/styles';\nimport { NEON_BLUE, NEON_GOLD, NEON_PINK } from './arcade-colors.js';\nimport { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions';\nimport {\n useKeyBindings,\n KeyMatch,\n type KeyBinding,\n} from '@ui/tui/hooks/useKeyBindings';\nimport {\n HEDGEHOG_COL,\n PLAYFIELD_WIDTH,\n jump,\n restart,\n tick,\n type GameState,\n} from './hedgehog-runner-engine.js';\n\nconst TICK_MS = 150;\nconst PLAYFIELD_ROWS = 3;\nconst MIN_TERMINAL_COLUMNS = 50;\nconst HEDGEHOG_GLYPH = 'O';\nconst SPIKE_GLYPH = '^';\nconst RING_GLYPH = 'o';\nconst GROUND_GLYPH = '=';\n\ninterface HedgehogRunnerProps {\n state: GameState;\n onChange: Dispatch<SetStateAction<GameState>>;\n}\n\nconst pad4 = (n: number) => String(n).padStart(4, '0');\n\nexport const HedgehogRunner = ({ state, onChange }: HedgehogRunnerProps) => {\n const [columns] = useStdoutDimensions();\n\n useEffect(() => {\n const id = setInterval(() => {\n onChange((prev) => tick(prev));\n }, TICK_MS);\n return () => clearInterval(id);\n }, [onChange]);\n\n const bindings: KeyBinding[] = [\n {\n match: KeyMatch.Space,\n label: 'space',\n action: 'jump',\n handler: () => onChange((prev) => jump(prev)),\n },\n {\n match: 'r',\n label: 'r',\n action: 'restart',\n handler: () =>\n onChange((prev) => (prev.isGameOver ? restart(prev) : prev)),\n },\n ];\n useKeyBindings('hedgehog-runner', bindings);\n\n if (columns < MIN_TERMINAL_COLUMNS) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text dimColor>\n Widen the terminal to at least {MIN_TERMINAL_COLUMNS} columns to play\n Hedgehog Runner.\n </Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Box>\n <Text bold color={NEON_BLUE}>\n SCORE {pad4(state.score)}\n </Text>\n <Text>{' '}</Text>\n <Text bold color={NEON_GOLD}>\n HI {pad4(state.hiScore)}\n </Text>\n {state.isGameOver && (\n <>\n <Text>{' '}</Text>\n <Text bold color=\"red\">\n ✱ GAME OVER ✱\n </Text>\n </>\n )}\n </Box>\n\n {Array.from({ length: PLAYFIELD_ROWS }, (_, row) => (\n <PlayfieldRow key={row} row={row} state={state} />\n ))}\n\n <Text color={Colors.muted}>{GROUND_GLYPH.repeat(PLAYFIELD_WIDTH)}</Text>\n </Box>\n );\n};\n\ninterface PlayfieldRowProps {\n row: number;\n state: GameState;\n}\n\nconst PlayfieldRow = ({ row, state }: PlayfieldRowProps) => {\n const cells: Array<{ ch: string; color?: string; bold?: boolean }> = [];\n for (let x = 0; x < PLAYFIELD_WIDTH; x++) {\n if (x === HEDGEHOG_COL && row === state.hedgehogRow) {\n cells.push({ ch: HEDGEHOG_GLYPH, color: NEON_PINK, bold: true });\n continue;\n }\n const obstacle = state.obstacles.find((o) => o.x === x && o.row === row);\n if (obstacle) {\n cells.push(\n obstacle.kind === 'spike'\n ? { ch: SPIKE_GLYPH, color: 'red', bold: true }\n : { ch: RING_GLYPH, color: NEON_GOLD, bold: true },\n );\n continue;\n }\n cells.push({ ch: ' ' });\n }\n return (\n <Text>\n {cells.map((c, i) => (\n <Fragment key={i}>\n {c.color ? (\n <Text color={c.color} bold={c.bold}>\n {c.ch}\n </Text>\n ) : (\n c.ch\n )}\n </Fragment>\n ))}\n </Text>\n );\n};\n","import { useState, useSyncExternalStore } from 'react';\nimport { join } from 'node:path';\nimport { Box } from 'ink';\nimport type { WizardStore } from '@ui/tui/store';\nimport {\n TabContainer,\n SplitView,\n LogViewer,\n HNViewer,\n} from '@ui/tui/primitives/index';\nimport { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions';\nimport { useFileWatcher } from '@ui/tui/hooks/file-watcher';\nimport { AuditChecksViewer } from '@ui/tui/screens/audit/AuditChecksViewer/AuditChecksViewer';\nimport { Audit3000AreaPane } from './Audit3000AreaPane.js';\nimport { Audit3000ChecksPanel } from './Audit3000ChecksPanel.js';\nimport { HedgehogRunner } from './HedgehogRunner.js';\nimport { initialState } from './hedgehog-runner-engine.js';\nimport {\n AUDIT_CHECKS_FILE,\n AUDIT_CHECKS_KEY,\n coerceAuditChecks,\n getAuditChecks,\n} from '@lib/programs/audit/types';\nimport { getProgramConfig } from '@lib/programs/program-registry';\nimport { WIZARD_LOG_FILE } from '@utils/paths';\n\nconst AUDIT_3000_REPORT_FILE_FALLBACK = 'posthog-audit-3000-report.md';\n\ninterface Audit3000RunScreenProps {\n store: WizardStore;\n}\n\nexport const Audit3000RunScreen = ({ store }: Audit3000RunScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n // Mirror the agent's audit ledger into the store. The audit-3000 skill\n // writes to the same `.posthog-audit-checks.json` path the original\n // audit uses, so the file watcher key is shared.\n useFileWatcher(join(store.session.installDir, AUDIT_CHECKS_FILE), (parsed) =>\n store.setFrameworkContext(AUDIT_CHECKS_KEY, coerceAuditChecks(parsed)),\n );\n\n const statuses =\n store.statusMessages.length > 0 ? store.statusMessages : undefined;\n\n const [columns] = useStdoutDimensions();\n // Game state is lifted here so it survives tab switches — the HedgehogRunner\n // unmounts whenever the user views another tab, but the score / position /\n // obstacles stay frozen until they switch back.\n const [gameState, setGameState] = useState(() => initialState());\n const checks = getAuditChecks(store.session);\n const reportFile =\n getProgramConfig(store.router.activeProgram).reportFile ??\n AUDIT_3000_REPORT_FILE_FALLBACK;\n const reportPath = `./${reportFile}`;\n const checksPanel = <Audit3000ChecksPanel checks={checks} />;\n const areaPane = (\n <Audit3000AreaPane checks={checks} reportPath={reportPath} />\n );\n\n // Narrow terminals: drop the area pane.\n const statusComponent =\n columns < 80 ? (\n <Box flexDirection=\"column\" flexGrow={1}>\n {checksPanel}\n </Box>\n ) : (\n <SplitView left={areaPane} right={checksPanel} />\n );\n\n const tabs = [\n { id: 'status', label: 'Arcade', component: statusComponent },\n {\n id: 'audit-checks',\n label: 'Hi-score table (report)',\n component: <AuditChecksViewer checks={checks} />,\n },\n {\n id: 'play',\n label: 'Play',\n component: <HedgehogRunner state={gameState} onChange={setGameState} />,\n },\n {\n id: 'logs',\n label: 'Tail logs',\n component: <LogViewer filePath={WIZARD_LOG_FILE} />,\n },\n { id: 'hn', label: 'HN', component: <HNViewer /> },\n ];\n\n return (\n <TabContainer\n tabs={tabs}\n statusMessage={statuses}\n expandableStatus\n store={store}\n />\n );\n};\n","/**\n * Audit3000OutroScreen — high-score-style summary after a v3000 audit run.\n *\n * On success: arcade FINAL SCORE banner with pass / miss tallies, the\n * absolute report path, and the standard problematic-items list.\n *\n * Error and cancel branches mirror `AuditOutroScreen` so failure modes\n * stay legible without arcade dressing.\n */\n\nimport { join } from 'node:path';\nimport { Box, Text, useInput } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { OutroKind } from '@lib/wizard-session';\nimport { Colors } from '@ui/tui/styles';\nimport {\n getAuditChecks,\n type AuditCheck,\n type AuditStatus,\n} from '@lib/programs/audit/types';\nimport { AuditChecksOutroSection } from '@ui/tui/screens/audit/AuditChecksOutroSection';\n\nconst NEON_PINK = '#F54E00';\nconst NEON_GOLD = '#F9BD2B';\nconst NEON_BLUE = '#1D4AFF';\n\nconst PANEL_WIDTH = 48;\n\nconst padCenter = (s: string, width: number): string => {\n if (s.length >= width) return s;\n const total = width - s.length;\n const left = Math.floor(total / 2);\n const right = total - left;\n return ' '.repeat(left) + s + ' '.repeat(right);\n};\n\nfunction countByStatus(checks: AuditCheck[]): Record<AuditStatus, number> {\n const counts: Record<AuditStatus, number> = {\n pending: 0,\n pass: 0,\n error: 0,\n warning: 0,\n suggestion: 0,\n };\n for (const c of checks) counts[c.status] += 1;\n return counts;\n}\n\nconst FinalScorePanel = ({ checks }: { checks: AuditCheck[] }) => {\n const counts = countByStatus(checks);\n const resolved = checks.length - counts.pending;\n const issues = counts.error + counts.warning + counts.suggestion;\n\n const top = '\\u250F' + '\\u2501'.repeat(PANEL_WIDTH) + '\\u2513';\n const bottom = '\\u2517' + '\\u2501'.repeat(PANEL_WIDTH) + '\\u251B';\n const sep = '\\u2520' + '\\u2500'.repeat(PANEL_WIDTH) + '\\u2528';\n\n const row = (content: string) => (\n <Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n <Text>{content}</Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n </Text>\n );\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold color={NEON_PINK}>\n {top}\n </Text>\n {row(padCenter('GAME OVER', PANEL_WIDTH))}\n <Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n <Text color={NEON_GOLD}>\n {padCenter(\n `FINAL SCORE ${resolved} / ${checks.length}`,\n PANEL_WIDTH,\n )}\n </Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n </Text>\n <Text color={NEON_PINK}>{sep}</Text>\n <Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n <Text color=\"green\">\n {padCenter(`PASS \\u25B2 ${counts.pass}`, PANEL_WIDTH)}\n </Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n </Text>\n <Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n <Text color={NEON_BLUE}>\n {padCenter(`MISS \\u25BC ${issues}`, PANEL_WIDTH)}\n </Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n </Text>\n <Text bold color={NEON_PINK}>\n {bottom}\n </Text>\n </Box>\n );\n};\n\ninterface Audit3000OutroScreenProps {\n store: WizardStore;\n}\n\nexport const Audit3000OutroScreen = ({ store }: Audit3000OutroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n useInput(() => {\n store.setOutroDismissed();\n });\n\n const outroData = store.session.outroData;\n\n if (!outroData) {\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text dimColor>{'Counting your tokens\\u2026'}</Text>\n </Box>\n );\n }\n\n const checks = getAuditChecks(store.session);\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n {outroData.kind === OutroKind.Success && (\n <Box flexDirection=\"column\">\n <FinalScorePanel checks={checks} />\n\n <Box marginTop={1}>\n <Text bold color=\"green\">\n {'\\u2714'} {outroData.message || 'AUDIT-3000 complete!'}\n </Text>\n </Box>\n\n {outroData.reportFile && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold color=\"cyan\">\n High-score reel saved to:\n </Text>\n <Text>\n {join(store.session.installDir, outroData.reportFile)}\n </Text>\n <Text dimColor>\n A markdown file in your project folder — open it in any editor\n to read the full audit.\n </Text>\n </Box>\n )}\n\n <AuditChecksOutroSection\n checks={checks}\n installDir={store.session.installDir}\n />\n\n {outroData.docsUrl && (\n <Box marginTop={1}>\n <Text>\n Learn more: <Text color=\"cyan\">{outroData.docsUrl}</Text>\n </Text>\n </Box>\n )}\n </Box>\n )}\n\n {outroData.kind === OutroKind.Error && (\n <Box flexDirection=\"column\">\n <Text color=\"red\" bold>\n {'\\u2718'} {outroData.message || 'An error occurred'}\n </Text>\n {outroData.body && (\n <Box marginTop={1}>\n <Text dimColor>{outroData.body}</Text>\n </Box>\n )}\n </Box>\n )}\n\n {outroData.kind === OutroKind.Cancel && (\n <Text color=\"yellow\">\n {'\\u25A0'} {outroData.message || 'Cancelled'}\n </Text>\n )}\n\n <Box marginTop={1}>\n <Text color={Colors.muted}>Press any key to continue</Text>\n </Box>\n </Box>\n );\n};\n","/**\n * SetupScreen — Generic framework disambiguation.\n *\n * Iterates unresolved setup questions from the FrameworkConfig\n * and renders a PickerMenu for each. If all questions are auto-resolved,\n * this screen is skipped entirely (the router skips it via its show() predicate).\n */\n\nimport { Box, Text } from 'ink';\nimport { useState, useEffect } from 'react';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { PickerMenu } from '@ui/tui/primitives/index';\nimport { Colors } from '@ui/tui/styles';\nimport type { SetupQuestion } from '@lib/framework-config';\n\ninterface SetupScreenProps {\n store: WizardStore;\n}\n\nexport const SetupScreen = ({ store }: SetupScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const config = store.session.frameworkConfig;\n const questions = config?.metadata.setup?.questions ?? [];\n\n // Track which question index we're currently showing\n const [currentIndex, setCurrentIndex] = useState(0);\n const [resolving, setResolving] = useState(true);\n\n // On mount, run auto-detection for all questions\n useEffect(() => {\n void (async () => {\n for (const q of questions) {\n // Skip if already resolved (e.g. by CLI arg)\n if (q.key in store.session.frameworkContext) continue;\n\n try {\n const detected = await q.detect({\n installDir: store.session.installDir,\n });\n if (detected !== null) {\n store.setFrameworkContext(q.key, detected);\n }\n } catch {\n // Detection failed — will ask the user\n }\n }\n setResolving(false);\n\n // If all resolved, the router's isComplete predicate will\n // resolve past this screen on the next render cycle.\n })();\n }, []);\n\n if (resolving) {\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text dimColor>Detecting project configuration...</Text>\n </Box>\n );\n }\n\n // Get unresolved questions\n const unresolved = questions.filter(\n (q: SetupQuestion) => !(q.key in store.session.frameworkContext),\n );\n\n if (unresolved.length === 0) {\n // All resolved — should have already advanced\n return null;\n }\n\n const question = unresolved[currentIndex] ?? unresolved[0];\n if (!question) return null;\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color={Colors.accent}>\n Project Setup\n </Text>\n {config && (\n <Text dimColor>Configuring {config.metadata.name} integration</Text>\n )}\n </Box>\n\n <PickerMenu<string>\n message={question.message}\n options={question.options.map((o) => ({\n label: o.label,\n value: o.value,\n hint: o.hint,\n }))}\n onSelect={(value) => {\n const selected = Array.isArray(value) ? value[0] : value;\n store.setFrameworkContext(question.key, selected);\n\n // Check if more unresolved questions remain\n const remaining = unresolved.filter(\n (q: SetupQuestion) =>\n q.key !== question.key &&\n !(q.key in store.session.frameworkContext),\n );\n\n if (remaining.length > 0) {\n setCurrentIndex((i) => i + 1);\n }\n // When no remaining questions, setFrameworkContext already\n // triggered emitChange — router resolves past this screen.\n }}\n />\n </Box>\n );\n};\n","/**\n * AuthScreen — Shown while waiting for OAuth authentication.\n *\n * Displays framework detection results, beta/disclosure notices,\n * a waiting spinner, and the login URL when available.\n * The router resolves past this screen once session.credentials is set.\n */\n\nimport { Box, Text } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { LoadingBox } from '@ui/tui/primitives/index';\nimport { useKeyBindings } from '@ui/tui/hooks/useKeyBindings';\nimport { Colors } from '@ui/tui/styles';\n\ninterface AuthScreenProps {\n store: WizardStore;\n}\n\nexport const AuthScreen = ({ store }: AuthScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const { session } = store;\n\n // While the OAuth flow is waiting (loginUrl set), let the user paste the\n // callback URL/code by hand — the fallback for headless/remote shells where\n // the browser can't reach the local callback server.\n const canPasteCode = Boolean(session.loginUrl);\n useKeyBindings(\n 'auth',\n canPasteCode\n ? [\n {\n match: ['p', 'P'],\n label: 'P',\n action: 'paste auth code',\n handler: () => store.showManualAuthCode(),\n },\n ]\n : [],\n );\n const config = session.frameworkConfig;\n const frameworkLabel =\n session.detectedFrameworkLabel ?? config?.metadata.name;\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color={Colors.accent}>\n PostHog Setup Wizard\n </Text>\n\n {frameworkLabel && (\n <Text>\n <Text color=\"green\">{'\\u2714'} </Text>\n <Text>Framework: {frameworkLabel}</Text>\n </Text>\n )}\n\n {config?.metadata.beta && (\n <Text color=\"yellow\">\n [BETA] The {config.metadata.name} wizard is in beta. Questions or\n feedback? Email wizard@posthog.com\n </Text>\n )}\n\n {config?.metadata.preRunNotice && (\n <Text color=\"yellow\">{config.metadata.preRunNotice}</Text>\n )}\n </Box>\n\n <LoadingBox message=\"Waiting for authentication...\" />\n\n {session.loginUrl && (\n <Box marginTop={1} marginBottom={1} flexDirection=\"column\">\n {/* Literal \\n — sibling <Box> spacers squeeze to 0 under flex\n height pressure, letting cmd-click slurp /authorize + 'y'. */}\n <Text>\n <Text dimColor>\n If the browser didn't open, copy and paste this URL:\n </Text>\n {'\\n\\n'}\n <Text color=\"cyan\">{session.loginUrl}</Text>\n </Text>\n <Box marginTop={1}>\n <Text dimColor>\n On a remote machine or devbox? Press{' '}\n <Text color={Colors.accent}>[P]</Text> to paste the callback URL.\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n","/**\n * RunScreen — Default observational view of the agent run.\n *\n * Tabs: Status (LearnCard + ProgressList), Event plan (when present),\n * Tail logs, HN. Programs that need a different tab list ship their own\n * screen component (see audit/AuditRunScreen.tsx).\n */\n\nimport { useMemo, useSyncExternalStore } from 'react';\nimport { join } from 'node:path';\nimport { Box } from 'ink';\nimport type { WizardStore } from '@ui/tui/store';\nimport {\n TabContainer,\n SplitView,\n ProgressList,\n LogViewer,\n EventPlanViewer,\n HNViewer,\n} from '@ui/tui/primitives/index';\nimport type { ProgressItem } from '@ui/tui/primitives/index';\nimport { ADDITIONAL_FEATURE_LABELS } from '@lib/wizard-session';\nimport { LearnCard } from '@ui/tui/components/LearnCard';\nimport { TipsCard } from '@ui/tui/components/TipsCard';\nimport { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions';\nimport { useFileWatcher } from '@ui/tui/hooks/file-watcher';\nimport { EVENT_PLAN_FILE } from '@lib/programs/posthog-integration/index';\nimport { getProgramConfig } from '@lib/programs/program-registry';\nimport { getContentBlocks as getSkillContentBlocks } from '@lib/programs/agent-skill/content/index';\n\nimport { WIZARD_LOG_FILE } from '@utils/paths';\n\ninterface RunScreenProps {\n store: WizardStore;\n}\n\nexport const RunScreen = ({ store }: RunScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n // Mirror the agent's `.posthog-events.json` plan into the store so the\n // Event plan tab appears as soon as the agent emits the file.\n useFileWatcher(join(store.session.installDir, EVENT_PLAN_FILE), (parsed) => {\n if (!Array.isArray(parsed)) return;\n store.setEventPlan(\n parsed.map((e: Record<string, unknown>) => ({\n name: (e.name ?? e.event ?? '') as string,\n description: (e.description ?? '') as string,\n })),\n );\n });\n\n const [columns] = useStdoutDimensions();\n\n const progressItems: ProgressItem[] = store.tasks.map((t) => ({\n label: t.label,\n activeForm: t.activeForm,\n status: t.status,\n }));\n\n // When all tasks are done but the queue has features, show a transitional item\n const queue = store.session.additionalFeatureQueue;\n const allDone =\n progressItems.length > 0 &&\n progressItems.every((t) => t.status === 'completed');\n if (allDone && queue.length > 0) {\n const nextLabel = ADDITIONAL_FEATURE_LABELS[queue[0]];\n progressItems.push({\n label: `Set up ${nextLabel}`,\n activeForm: `Setting up ${nextLabel}...`,\n status: 'in_progress',\n });\n }\n\n const statuses =\n store.statusMessages.length > 0 ? store.statusMessages : undefined;\n\n // Each program owns its content deck (program/content/index.tsx)\n // and wires it onto its ProgramConfig.getContentBlocks. Fall back to the\n // agent-skill deck for runtime-created configs (e.g. `--skill <id>`) that\n // aren't in the static registry.\n const activeProgram = store.router.activeProgram;\n const learnBlocks = useMemo(() => {\n const getBlocks =\n getProgramConfig(activeProgram).getContentBlocks ?? getSkillContentBlocks;\n return getBlocks(store);\n }, [store, activeProgram]);\n\n const leftPane = store.learnCardComplete ? (\n <TipsCard store={store} />\n ) : (\n <LearnCard\n store={store}\n blocks={learnBlocks}\n onComplete={() => store.setLearnCardComplete()}\n />\n );\n const progressList = <ProgressList items={progressItems} title=\"Tasks\" />;\n\n // On narrow terminals, drop the learn pane and show only progress\n const statusComponent =\n columns < 80 ? (\n <Box flexDirection=\"column\" flexGrow={1}>\n {progressList}\n </Box>\n ) : (\n <SplitView left={leftPane} right={progressList} />\n );\n\n const tabs = [\n { id: 'status', label: 'Status', component: statusComponent },\n ...(store.eventPlan.length > 0\n ? [\n {\n id: 'events',\n label: 'Event plan',\n component: <EventPlanViewer events={store.eventPlan} />,\n },\n ]\n : []),\n {\n id: 'logs',\n label: 'Tail logs',\n component: <LogViewer filePath={WIZARD_LOG_FILE} />,\n },\n { id: 'hn', label: 'HN', component: <HNViewer /> },\n ];\n\n return (\n <TabContainer\n tabs={tabs}\n statusMessage={statuses}\n expandableStatus\n store={store}\n />\n );\n};\n","/**\n * KeepSkillsScreen — Ask whether to keep installed skills in .claude/skills/.\n *\n * Shown after the outro summary so users see the agent's output first,\n * then decide whether to keep the skills that powered it.\n *\n * When done, calls store.setSkillsComplete() and exits the process.\n */\n\nimport { Box, Text } from 'ink';\nimport { useState, useEffect } from 'react';\nimport { useSyncExternalStore } from 'react';\nimport { readdir, rm, access } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nconst WIZARD_MARKER = '.posthog-wizard';\nimport type { WizardStore } from '@ui/tui/store';\nimport { ConfirmationInput } from '@ui/tui/primitives/index';\nimport { Colors } from '@ui/tui/styles';\nimport { CONTEXT_MILL_URL } from '@lib/constants';\n\ninterface KeepSkillsScreenProps {\n store: WizardStore;\n}\n\ninterface SkillEntry {\n name: string;\n children: string[];\n}\n\nenum Phase {\n Loading = 'loading',\n Ask = 'ask',\n Removing = 'removing',\n Done = 'done',\n}\n\nexport const KeepSkillsScreen = ({ store }: KeepSkillsScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const [phase, setPhase] = useState<Phase>(Phase.Loading);\n const [skills, setSkills] = useState<SkillEntry[]>([]);\n\n const skillsDir = join(store.session.installDir, '.claude', 'skills');\n\n useEffect(() => {\n void (async () => {\n try {\n const entries = await readdir(skillsDir, { withFileTypes: true });\n const dirs = entries.filter((e) => e.isDirectory());\n const result: SkillEntry[] = [];\n for (const dir of dirs) {\n try {\n await access(join(skillsDir, dir.name, WIZARD_MARKER));\n } catch {\n continue;\n }\n const children = (await readdir(join(skillsDir, dir.name))).filter(\n (c) => c !== WIZARD_MARKER,\n );\n result.push({ name: dir.name, children });\n }\n if (result.length === 0) {\n store.setSkillsComplete(true);\n process.exit(0);\n }\n setSkills(result);\n setPhase(Phase.Ask);\n } catch {\n store.setSkillsComplete(true);\n process.exit(0);\n }\n })();\n }, []); // eslint-disable-line\n\n const handleKeep = () => {\n store.setSkillsComplete(true);\n process.exit(0);\n };\n\n const handleRemove = async () => {\n setPhase(Phase.Removing);\n for (const skill of skills) {\n try {\n await rm(join(skillsDir, skill.name), {\n recursive: true,\n force: true,\n });\n } catch {\n // Best-effort removal\n }\n }\n try {\n const remaining = await readdir(skillsDir);\n if (remaining.length === 0) {\n await rm(skillsDir, { recursive: true, force: true });\n }\n } catch {\n // Best-effort cleanup\n }\n setPhase(Phase.Done);\n // Give React a tick to paint the \"Skills removed.\" message before exit\n setTimeout(() => {\n store.setSkillsComplete(false);\n process.exit(0);\n }, 600);\n };\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text bold color={Colors.accent}>\n Keep the skills?\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n {phase === Phase.Loading && (\n <Text dimColor>Checking installed skills...</Text>\n )}\n\n {phase === Phase.Ask && (\n <>\n <Text dimColor>\n The wizard installed open-source skills that help AI coding agents\n integrate PostHog into your project:\n </Text>\n <Box marginTop={1} flexDirection=\"column\" marginLeft={2}>\n <Text dimColor>.claude/</Text>\n <Text dimColor> skills/</Text>\n {skills.map((skill) => (\n <Box key={skill.name} flexDirection=\"column\">\n <Text dimColor> {skill.name}/</Text>\n {skill.children.map((child) => (\n <Text key={child} dimColor>\n {' '}\n {child}\n </Text>\n ))}\n </Box>\n ))}\n </Box>\n <Box marginTop={1}>\n <Text dimColor>\n Source: <Text color=\"cyan\">{CONTEXT_MILL_URL}</Text>\n </Text>\n </Box>\n <Box marginTop={1}>\n <ConfirmationInput\n message=\"Keep the installed skills?\"\n confirmLabel=\"Keep [Enter]\"\n cancelLabel=\"Remove [Esc]\"\n onConfirm={handleKeep}\n onCancel={() => void handleRemove()}\n />\n </Box>\n </>\n )}\n\n {phase === Phase.Removing && <Text dimColor>Removing skills...</Text>}\n\n {phase === Phase.Done && <Text dimColor>Skills removed.</Text>}\n </Box>\n </Box>\n );\n};\n","/**\n * OutroScreen — Default post-run summary.\n *\n * Renders the success / error / cancel views from `outroData`. Programs\n * that need a different success view (e.g. with extra summary content)\n * ship their own screen component (see audit/AuditOutroScreen.tsx).\n */\n\nimport { Box, Text, useInput } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { OutroKind } from '@lib/wizard-session';\nimport { Colors } from '@ui/tui/styles';\n\ninterface OutroScreenProps {\n store: WizardStore;\n}\n\nexport const OutroScreen = ({ store }: OutroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n useInput(() => {\n store.setOutroDismissed();\n });\n\n const outroData = store.session.outroData;\n\n if (!outroData) {\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text dimColor>Finishing up...</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n {outroData.kind === OutroKind.Success && (\n <Box flexDirection=\"column\">\n <Text color=\"green\" bold>\n ✔ {outroData.message || 'Done!'}\n </Text>\n\n {outroData.body && (\n <Box marginTop={1}>\n <Text dimColor>{outroData.body}</Text>\n </Box>\n )}\n\n {outroData.reportFile && (\n <Box marginTop={1}>\n <Text>\n Check <Text bold>./{outroData.reportFile}</Text> for details\n </Text>\n </Box>\n )}\n\n {outroData.changes && outroData.changes.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"cyan\" bold>\n What the agent did:\n </Text>\n {outroData.changes.map((change, i) => (\n <Text key={i}>• {change}</Text>\n ))}\n </Box>\n )}\n\n {store.eventPlan.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"cyan\" bold>\n Events added:\n </Text>\n {store.eventPlan.map((event) => (\n <Text key={event.name}>\n • <Text bold>{event.name}</Text>\n <Text dimColor> {event.description}</Text>\n </Text>\n ))}\n </Box>\n )}\n\n {outroData.dashboardUrl && (\n <Box marginTop={1}>\n <Text>\n We've also made you a dashboard:{' '}\n <Text color=\"cyan\">{outroData.dashboardUrl}</Text>\n </Text>\n </Box>\n )}\n\n {outroData.notebookUrl && (\n <Box marginTop={1}>\n <Text>\n And uploaded the report to a PostHog notebook:{' '}\n <Text color=\"cyan\">{outroData.notebookUrl}</Text>\n </Text>\n </Box>\n )}\n\n {outroData.docsUrl && (\n <Box marginTop={1}>\n <Text>\n Learn more: <Text color=\"cyan\">{outroData.docsUrl}</Text>\n </Text>\n </Box>\n )}\n\n {outroData.continueUrl && (\n <Box>\n <Text>\n Continue onboarding:{' '}\n <Text color=\"cyan\">{outroData.continueUrl}</Text>\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text dimColor>\n Note: This wizard uses an LLM agent to analyze and modify your\n project. Please review the changes made.\n </Text>\n </Box>\n <Text dimColor>\n How did this work for you? Drop us a line: wizard@posthog.com\n </Text>\n </Box>\n )}\n\n {outroData.kind === OutroKind.Error && (\n <Box flexDirection=\"column\">\n <Text color=\"red\" bold>\n ✘ {outroData.message || 'An error occurred'}\n </Text>\n\n {outroData.body && (\n <Box marginTop={1}>\n <Text dimColor>{outroData.body}</Text>\n </Box>\n )}\n\n {outroData.docsUrl && (\n <Box marginTop={1}>\n <Text>\n Docs: <Text color=\"cyan\">{outroData.docsUrl}</Text>\n </Text>\n </Box>\n )}\n </Box>\n )}\n\n {outroData.kind === OutroKind.Cancel && (\n <Box flexDirection=\"column\">\n <Text color=\"yellow\">■ {outroData.message || 'Cancelled'}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={Colors.muted}>Press any key to continue</Text>\n </Box>\n </Box>\n );\n};\n","/**\n * ExitScreen — Final step in every program.\n *\n * Renders nothing. Immediately exits the process.\n * The cleanup handler in start-tui.ts handles the exit summary line.\n */\n\nimport { useEffect } from 'react';\n\nexport const ExitScreen = () => {\n useEffect(() => {\n process.exit(0);\n }, []);\n\n return null;\n};\n","/**\n * AuthErrorScreen — Shown when the PostHog LLM Gateway returns a 401.\n *\n * Two distinct causes:\n * 1. Claude Code settings.json / managed-settings overrides ANTHROPIC_*\n * env vars — auth conflict. Tell the user to log out of Claude Code.\n * 2. The PostHog API key itself was rejected — bad prefix, missing scope,\n * expired, or wrong region. Don't blame Claude Code in this case.\n */\n\nimport { Box, Text, useInput } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { Colors } from '@ui/tui/styles';\n\ninterface AuthErrorScreenProps {\n store: WizardStore;\n}\n\nexport const AuthErrorScreen = ({ store }: AuthErrorScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n useInput(() => {\n process.exit(1);\n });\n\n const detail = store.session.authErrorDetail;\n const hasSettingsConflict = detail?.hasSettingsConflict ?? true;\n const logFilePath = detail?.logFilePath;\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text color=\"red\" bold>\n {'✘'} Authentication error\n </Text>\n\n {hasSettingsConflict ? (\n <>\n <Box flexDirection=\"column\" marginTop={1}>\n <Text>\n The Wizard couldn't connect to the PostHog LLM Gateway. Claude\n Code settings on this machine are overriding the Wizard's\n credentials.\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n Try logging out of Claude Code temporarily and re-running the\n Wizard:\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginTop={1} paddingLeft={2}>\n <Text color=\"cyan\">claude auth logout</Text>\n </Box>\n </>\n ) : (\n <>\n <Box flexDirection=\"column\" marginTop={1}>\n <Text>\n The PostHog LLM Gateway rejected the API key. Common causes:\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginTop={1} paddingLeft={2}>\n <Text>\n {'•'} Wrong key type — pass a personal API key (\n <Text color=\"cyan\">phx_xxx</Text>).\n </Text>\n <Text dimColor>\n {' '}pha_ is an OAuth access token, phc_ is a project key.\n </Text>\n <Text>\n {'•'} Missing scope — the key needs{' '}\n <Text color=\"cyan\">llm_gateway:read</Text>.\n </Text>\n <Text>{'•'} Expired or revoked key.</Text>\n <Text>\n {'•'} Region mismatch — <Text color=\"cyan\">--region</Text> must\n match where the key was issued (us vs eu).\n </Text>\n </Box>\n </>\n )}\n\n {logFilePath && (\n <Box marginTop={1}>\n <Text dimColor>Verbose log: {logFilePath}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={Colors.muted}>Press any key to exit</Text>\n </Box>\n </Box>\n );\n};\n","/**\n * WizardAskScreen — Overlay for the `wizard_ask` MCP tool.\n *\n * Walks the agent's question list one at a time and accumulates answers.\n * When the user submits the last question, the store resolves the\n * pending request and the overlay pops, returning the agent to its run.\n */\n\nimport { Box, Text } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { ModalOverlay, PickerMenu } from '@ui/tui/primitives/index';\nimport { Colors, Icons } from '@ui/tui/styles';\nimport type { AskAnswers, AskQuestion } from '@lib/wizard-session';\n\ninterface WizardAskScreenProps {\n store: WizardStore;\n}\n\nexport const WizardAskScreen = ({ store }: WizardAskScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const pending = store.session.pendingQuestion;\n\n // Index of the question currently being answered. Resets when a fresh\n // pending request arrives.\n const [index, setIndex] = useState(0);\n const [answers, setAnswers] = useState<AskAnswers>({});\n const [lastPendingId, setLastPendingId] = useState<string | null>(null);\n\n if (!pending) return null;\n\n // Reset accumulator state when the agent opens a new request mid-session.\n if (pending.id !== lastPendingId) {\n setLastPendingId(pending.id);\n setIndex(0);\n setAnswers({});\n return null;\n }\n\n const question = pending.questions[index];\n if (!question) return null;\n\n const total = pending.questions.length;\n const progress = total > 1 ? `Question ${index + 1} of ${total}` : null;\n\n const submit = (value: string | string[]) => {\n const next: AskAnswers = { ...answers, [question.id]: value };\n if (index + 1 < total) {\n setAnswers(next);\n setIndex(index + 1);\n return;\n }\n store.resolvePendingQuestion(next);\n };\n\n return (\n <ModalOverlay\n borderColor={Colors.accent}\n title={`${Icons.diamond} ${pending.source}`}\n titleColor={Colors.accent}\n width={72}\n >\n {progress && (\n <Box marginBottom={1}>\n <Text dimColor>{progress}</Text>\n </Box>\n )}\n <Box flexDirection=\"column\">\n <Text>{question.prompt}</Text>\n </Box>\n <Box marginTop={1}>\n {/* `key` forces React to remount the input when the question changes\n so per-question internal state (typed buffer, picker focus) doesn't\n bleed across questions. */}\n <QuestionInput\n key={`${pending.id}:${question.id}`}\n question={question}\n onSubmit={submit}\n />\n </Box>\n </ModalOverlay>\n );\n};\n\ninterface QuestionInputProps {\n question: AskQuestion;\n onSubmit: (value: string | string[]) => void;\n}\n\nconst QuestionInput = ({ question, onSubmit }: QuestionInputProps) => {\n switch (question.kind) {\n case 'single':\n return (\n <PickerMenu<string>\n options={(question.options ?? []).map((o) => ({\n label: o.label,\n value: o.value,\n }))}\n onSelect={(value) => {\n const v = Array.isArray(value) ? value[0] : value;\n onSubmit(v);\n }}\n />\n );\n\n case 'multi':\n return (\n <PickerMenu<string>\n mode=\"multi\"\n options={(question.options ?? []).map((o) => ({\n label: o.label,\n value: o.value,\n }))}\n onSelect={(value) => {\n const v = Array.isArray(value) ? value : [value];\n onSubmit(v);\n }}\n />\n );\n\n case 'text':\n return (\n // `width=\"100%\"` on both the column and the hint row anchors them to\n // the modal's content width — without it, Ink/Yoga shrinks the column\n // to fit its widest child, so the right-aligned hint walks left/right\n // as the typed text changes width.\n <Box flexDirection=\"column\" width=\"100%\">\n <TextInput\n placeholder=\"Type your answer\"\n onSubmit={(value) => onSubmit(value)}\n />\n <Box marginTop={1} width=\"100%\" justifyContent=\"flex-end\">\n <Text>\n <Text color={Colors.accent}>ENTER</Text>\n <Text dimColor> submit</Text>\n </Text>\n </Box>\n </Box>\n );\n }\n};\n","/**\n * Capability for MCP clients that are connected by opening a hosted page in\n * the browser rather than writing a local config or running a CLI install.\n *\n * Mirrors the PluginCapable pattern in plugin-client.ts: the client carries the\n * URL and instruction text (product knowledge); the TUI renders whatever the\n * capability surfaces (generic machinery).\n */\n\nexport interface BrowserFinishable {\n /** URL the user opens to finish connecting (also shown as copy-paste fallback). */\n connectorUrl: string;\n /** One-line instruction shown after the page opens. */\n finishInstruction: string;\n}\n\nexport function isBrowserFinishable<T>(c: T): c is T & BrowserFinishable {\n return (\n typeof c === 'object' &&\n c !== null &&\n 'connectorUrl' in c &&\n 'finishInstruction' in c\n );\n}\n","/**\n * McpInstaller — service layer between McpScreen and MCP business logic.\n *\n * Decouples the screen from step internals. Testable, swappable,\n * no dynamic imports in React components.\n */\n\nimport {\n getSupportedClients,\n removeMCPServer,\n getInstalledClients,\n getSupportedPluginClients,\n installPlugins as runPluginInstall,\n} from '@steps/add-mcp-server-to-clients/index';\nimport { ALL_FEATURE_VALUES } from '@steps/add-mcp-server-to-clients/defaults';\nimport { isPluginCapable } from '@steps/add-mcp-server-to-clients/plugin-client';\nimport { isBrowserFinishable } from '@steps/add-mcp-server-to-clients/browser-client';\nimport { logToFile } from '@utils/debug';\nimport { analytics } from '@utils/analytics';\n\nexport interface McpClientInfo {\n name: string;\n supportsPlugin: boolean;\n /**\n * Set for clients connected by opening a hosted page in the browser. The\n * Done screen renders this so the user knows to finish setup in the browser.\n */\n finish?: { url: string; instruction: string };\n}\n\nexport interface McpInstaller {\n /** Detect which MCP-capable editors are available on this machine. */\n detectClients(): Promise<McpClientInfo[]>;\n\n /** Install the PostHog MCP server to the given clients. Returns names of successfully installed clients. */\n install(\n clientNames: string[],\n features?: string[],\n apiKey?: string,\n ): Promise<string[]>;\n\n /** Remove the PostHog MCP server from all installed clients. Returns names of removed clients. */\n remove(): Promise<string[]>;\n\n /** Install the PostHog AI plugin to supported clients. Best-effort: failures do not affect MCP outcome. */\n installPlugins(clientNames: string[]): Promise<string[]>;\n}\n\n/**\n * Production McpInstaller backed by real MCP client detection and installation.\n */\nexport function createMcpInstaller(): McpInstaller {\n // Cache the raw MCPClient objects so install() can reference them by name\n let cachedClients: Array<{ name: string; raw: unknown }> = [];\n\n return {\n async detectClients(): Promise<McpClientInfo[]> {\n const supported = await getSupportedClients();\n cachedClients = supported.map((c) => ({ name: c.name, raw: c }));\n return supported.map((c) => ({\n name: c.name,\n supportsPlugin: isPluginCapable(c) && c.supportsPlugin(),\n finish: isBrowserFinishable(c)\n ? { url: c.connectorUrl, instruction: c.finishInstruction }\n : undefined,\n }));\n },\n\n async install(\n clientNames: string[],\n features?: string[],\n apiKey?: string,\n ): Promise<string[]> {\n const resolvedFeatures = features ?? [...ALL_FEATURE_VALUES];\n const toInstall = cachedClients\n .filter((c) => clientNames.includes(c.name))\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map((c) => c.raw as any);\n\n if (toInstall.length === 0) {\n logToFile(\n `[McpInstaller] No clients matched. clientNames=${JSON.stringify(\n clientNames,\n )}, cached=${JSON.stringify(cachedClients.map((c) => c.name))}`,\n );\n return [];\n }\n\n const installed: string[] = [];\n for (const client of toInstall) {\n try {\n const result = await client.addServer(\n apiKey,\n resolvedFeatures,\n false,\n );\n if (result?.success) {\n installed.push(client.name as string);\n } else {\n logToFile(\n `[McpInstaller] addServer returned success=false for ${client.name}`,\n );\n }\n } catch (err) {\n logToFile(\n `[McpInstaller] addServer threw for ${client.name}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n }\n return installed;\n },\n\n async remove(): Promise<string[]> {\n const installed = await getInstalledClients();\n if (installed.length === 0) return [];\n await removeMCPServer(installed);\n return installed.map((c) => c.name);\n },\n\n async installPlugins(clientNames: string[]): Promise<string[]> {\n const rawClients = cachedClients\n .filter((c) => clientNames.includes(c.name))\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map((c) => c.raw as any);\n\n const pluginClients = getSupportedPluginClients(rawClients);\n const installed = await runPluginInstall(pluginClients);\n\n analytics.wizardCapture('mcp plugins installed', {\n clients: installed,\n attempted: pluginClients.map((c) => c.name),\n });\n\n return installed;\n },\n };\n}\n","/**\n * McpSuggestedPromptsServices — service layer between\n * McpSuggestedPromptsScreen and the network. Decouples the screen from\n * OAuth and the streaming-agent run so the playground can inject mocks\n * (skip login, canned streaming responses) without a special-case\n * branch in the screen itself.\n *\n * Mirrors the McpInstaller pattern: thin interface, production factory\n * that wires the real implementation, no dynamic imports in the React\n * tree.\n */\n\nimport type { Credentials } from '@lib/wizard-session';\nimport { getOrAskForProjectData } from '@utils/setup-utils';\nimport { Program } from '@lib/programs/program-registry';\nimport type { WizardStore } from '@ui/tui/store';\nimport type { ApiUser } from '@lib/api';\n\n/**\n * Discriminated union covering every kind of streamed event the screen\n * needs to render. Production yields these from Claude SDK messages;\n * the playground yields them from canned scripts.\n */\nexport type AgentChunk =\n | { kind: 'text'; text: string }\n | { kind: 'tool-call'; toolName: string; detail: string }\n | { kind: 'tool-result'; toolName: string; detail: string }\n | { kind: 'error'; text: string }\n /** Stream completed. `sessionId` is the SDK session ID of the just-\n * completed turn; pass it back as `resumeSessionId` on a follow-up\n * call to continue the conversation with full history. */\n | { kind: 'done'; sessionId?: string };\n\nexport interface McpSuggestedPromptsServices {\n /**\n * Kicks off the OAuth dance. Production wires this to\n * `getOrAskForProjectData`; the playground returns canned values\n * after a fake delay.\n *\n * While the promise is pending, the implementation is expected to set\n * `session.loginUrl` (via `store.setLoginUrl`) so the screen can\n * render the URL inline. Mocks may set/clear this URL too if they\n * want to exercise the spinner + URL layout.\n */\n performLogin(): Promise<{\n credentials: Credentials;\n roleAtOrganization: string | null;\n user: ApiUser | null;\n }>;\n\n /**\n * Run a prompt against Claude with the PostHog MCP server available\n * for tool use. Yields chunks as the agent streams. Caller is\n * responsible for honoring the abort signal — implementations should\n * also short-circuit when `signal.aborted` becomes true.\n *\n * In production this calls the Claude Agent SDK's `query()` with the\n * user's OAuth token as the MCP Bearer. In the playground, the demo\n * provides canned scripts.\n */\n runPromptStreaming(args: {\n prompt: string;\n credentials: Credentials;\n signal: AbortSignal;\n /** When set, resume the named SDK session so the agent sees the\n * earlier turns as context. Used by follow-up picks; omitted on\n * the first prompt and after `[p]` restarts the conversation. */\n resumeSessionId?: string;\n }): AsyncIterable<AgentChunk>;\n}\n\n/**\n * Production services. The `runPromptStreaming` implementation lives\n * in a separate module so the heavy SDK import is only paid when\n * actually invoked.\n */\nexport function createMcpSuggestedPromptsServices(\n _store: WizardStore,\n): McpSuggestedPromptsServices {\n return {\n performLogin: async () => {\n const result = await getOrAskForProjectData({\n signup: false,\n ci: false,\n apiKey: undefined,\n projectId: undefined,\n email: undefined,\n region: undefined,\n // Widens the OAuth scope grant: base `WIZARD_OAUTH_SCOPES` plus\n // read on every product surface (flags, experiments, surveys,\n // replays, errors, web/LLM analytics, cohorts, persons) plus\n // annotation read/write. Persistence writes (dashboard, insight,\n // notebook) come for free from the base set. See\n // `src/lib/oauth/program-scopes.ts`.\n programId: Program.McpTutorial,\n });\n return {\n credentials: {\n accessToken: result.accessToken,\n projectApiKey: result.projectApiKey,\n host: result.host,\n projectId: result.projectId,\n },\n roleAtOrganization: result.roleAtOrganization,\n user: result.user,\n };\n },\n\n runPromptStreaming: (args) => runProductionPromptStreaming(args),\n };\n}\n\nasync function* runProductionPromptStreaming(args: {\n prompt: string;\n credentials: Credentials;\n signal: AbortSignal;\n resumeSessionId?: string;\n}): AsyncIterable<AgentChunk> {\n // Defer the SDK import to call time — the playground never hits\n // this path (it overrides the whole service object), so demo\n // sessions don't pay the SDK load cost.\n const { runMcpPromptViaSdk } = await import(\n '@lib/agent/mcp-prompt-streaming'\n );\n yield* runMcpPromptViaSdk(args);\n}\n","/**\n * ScreenId registry — maps screen names to React components.\n *\n * Adding a new screen:\n * 1. Create the component in screens/ (or screens/<program>/).\n * 2. Add a `ScreenId` enum entry in screen-sequences.ts.\n * 3. Add an entry here.\n * 4. Reference the screen by name in the program's `steps` array.\n */\n\nimport type { ReactNode } from 'react';\nimport type { WizardStore } from './store.js';\nimport { ScreenId, Overlay, type ScreenName } from './router.js';\n\nimport { HealthCheckScreen } from './screens/health/HealthCheckScreen.js';\nimport { DoctorIntroScreen } from './screens/doctor/DoctorIntroScreen.js';\nimport { DoctorReportScreen } from './screens/doctor/DoctorReportScreen.js';\nimport { SettingsOverrideScreen } from './screens/SettingsOverrideScreen.js';\nimport { ManagedSettingsScreen } from './screens/ManagedSettingsScreen.js';\nimport { PortConflictScreen } from './screens/PortConflictScreen.js';\nimport { ManualAuthCodeScreen } from './screens/ManualAuthCodeScreen.js';\nimport { PostHogIntegrationIntroScreen } from './screens/PostHogIntegrationIntroScreen.js';\nimport { RevenueIntroScreen } from './screens/RevenueIntroScreen.js';\nimport { MigrationIntroScreen } from './screens/MigrationIntroScreen.js';\nimport { SourceMapsIntroScreen } from './screens/SourceMapsIntroScreen.js';\nimport { SourceMapsOutroScreen } from './screens/SourceMapsOutroScreen.js';\nimport { AgentSkillIntroScreen } from './screens/AgentSkillIntroScreen.js';\nimport { AuditIntroScreen } from './screens/audit/AuditIntroScreen.js';\nimport { AuditRunScreen } from './screens/audit/AuditRunScreen.js';\nimport { AuditOutroScreen } from './screens/audit/AuditOutroScreen.js';\nimport { Audit3000IntroScreen } from './screens/audit-3000/Audit3000IntroScreen.js';\nimport { Audit3000RunScreen } from './screens/audit-3000/Audit3000RunScreen.js';\nimport { Audit3000OutroScreen } from './screens/audit-3000/Audit3000OutroScreen.js';\nimport { SetupScreen } from './screens/SetupScreen.js';\nimport { AuthScreen } from './screens/AuthScreen.js';\nimport { RunScreen } from './screens/RunScreen.js';\nimport { McpScreen } from './screens/McpScreen.js';\nimport { McpSuggestedPromptsScreen } from './screens/McpSuggestedPromptsScreen.js';\nimport { KeepSkillsScreen } from './screens/KeepSkillsScreen.js';\nimport { OutroScreen } from './screens/OutroScreen.js';\nimport { ExitScreen } from './screens/ExitScreen.js';\nimport { AuthErrorScreen } from './screens/AuthErrorScreen.js';\nimport { WizardAskScreen } from './screens/WizardAskScreen.js';\nimport { createMcpInstaller } from './services/mcp-installer.js';\nimport type { McpInstaller } from './services/mcp-installer.js';\nimport { createMcpSuggestedPromptsServices } from './services/mcp-suggested-prompts-services.js';\nimport type { McpSuggestedPromptsServices } from './services/mcp-suggested-prompts-services.js';\n\nexport interface ScreenServices {\n mcpInstaller: McpInstaller;\n mcpSuggestedPromptsServices: McpSuggestedPromptsServices;\n}\n\nexport function createServices(store: WizardStore): ScreenServices {\n return {\n mcpInstaller: createMcpInstaller(),\n mcpSuggestedPromptsServices: createMcpSuggestedPromptsServices(store),\n };\n}\n\nexport function createScreens(\n store: WizardStore,\n services: ScreenServices,\n): Record<ScreenName, ReactNode> {\n return {\n // Overlays\n [Overlay.SettingsOverride]: <SettingsOverrideScreen store={store} />,\n [Overlay.ManagedSettings]: <ManagedSettingsScreen store={store} />,\n [Overlay.PortConflict]: <PortConflictScreen store={store} />,\n [Overlay.ManualAuthCode]: <ManualAuthCodeScreen store={store} />,\n [Overlay.AuthError]: <AuthErrorScreen store={store} />,\n [Overlay.WizardAsk]: <WizardAskScreen store={store} />,\n\n // Wizard flow\n [ScreenId.Intro]: <PostHogIntegrationIntroScreen store={store} />,\n [ScreenId.RevenueIntro]: <RevenueIntroScreen store={store} />,\n [ScreenId.SourceMapsIntro]: <SourceMapsIntroScreen store={store} />,\n [ScreenId.SourceMapsOutro]: <SourceMapsOutroScreen store={store} />,\n [ScreenId.MigrationIntro]: <MigrationIntroScreen store={store} />,\n [ScreenId.AgentSkillIntro]: <AgentSkillIntroScreen store={store} />,\n [ScreenId.AuditIntro]: <AuditIntroScreen store={store} />,\n [ScreenId.AuditRun]: <AuditRunScreen store={store} />,\n [ScreenId.AuditOutro]: <AuditOutroScreen store={store} />,\n [ScreenId.Audit3000Intro]: <Audit3000IntroScreen store={store} />,\n [ScreenId.Audit3000Run]: <Audit3000RunScreen store={store} />,\n [ScreenId.Audit3000Outro]: <Audit3000OutroScreen store={store} />,\n [ScreenId.HealthCheck]: <HealthCheckScreen store={store} />,\n [ScreenId.DoctorIntro]: <DoctorIntroScreen store={store} />,\n [ScreenId.DoctorReport]: <DoctorReportScreen store={store} />,\n [ScreenId.Setup]: <SetupScreen store={store} />,\n [ScreenId.Auth]: <AuthScreen store={store} />,\n [ScreenId.Run]: <RunScreen store={store} />,\n [ScreenId.Mcp]: (\n <McpScreen store={store} installer={services.mcpInstaller} />\n ),\n [ScreenId.McpSuggestedPrompts]: (\n <McpSuggestedPromptsScreen\n store={store}\n services={services.mcpSuggestedPromptsServices}\n />\n ),\n [ScreenId.KeepSkills]: <KeepSkillsScreen store={store} />,\n [ScreenId.Outro]: <OutroScreen store={store} />,\n [ScreenId.Exit]: <ExitScreen />,\n\n // Standalone MCP flows\n [ScreenId.McpAdd]: (\n <McpScreen store={store} installer={services.mcpInstaller} />\n ),\n [ScreenId.McpRemove]: (\n <McpScreen\n store={store}\n installer={services.mcpInstaller}\n mode=\"remove\"\n />\n ),\n };\n}\n","import { useMemo } from 'react';\nimport { ScreenContainer } from './primitives/index.js';\nimport type { WizardStore } from './store.js';\nimport { createScreens, createServices } from './screen-registry.js';\n\ninterface AppProps {\n store: WizardStore;\n}\n\nexport const App = ({ store }: AppProps) => {\n const services = useMemo(() => createServices(store), [store]);\n const screens = useMemo(\n () => createScreens(store, services),\n [store, services],\n );\n\n return <ScreenContainer store={store} screens={screens} />;\n};\n","/**\n * start-tui.ts — Sets up the Ink TUI renderer and InkUI.\n *\n * Renders in the terminal's alternate screen buffer so the wizard\n * doesn't pollute scrollback history. On exit, the previous terminal\n * content is restored and a single exit summary line is printed.\n */\n\nimport { render } from 'ink';\nimport { createElement } from 'react';\nimport { WizardStore, Program, type ProgramId } from './store.js';\nimport { InkUI } from './ink-ui.js';\nimport { setUI } from '@ui/index';\nimport { App } from './App.js';\nimport { OutroKind } from '@lib/wizard-session';\n\n// ANSI escape sequences\nconst RESET_ATTRS = '\\x1b[0m';\nconst CLEAR_SCREEN = '\\x1b[2J';\nconst CURSOR_HOME = '\\x1b[H';\nconst BG_BLACK = '\\x1b[48;2;0;0;0m';\nconst ENTER_ALT_SCREEN = '\\x1b[?1049h';\nconst LEAVE_ALT_SCREEN = '\\x1b[?1049l';\nconst GREEN = '\\x1b[32m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\n\nexport function releaseTerminal(): void {\n process.stdout.write(RESET_ATTRS + LEAVE_ALT_SCREEN);\n}\n\nfunction getExitLine(store: WizardStore): string {\n const outro = store.session.outroData;\n const label = store.session.programLabel ?? 'Wizard';\n\n if (outro?.kind === OutroKind.Success) {\n const message = outro.message ?? `${label} completed successfully.`;\n const reportSuffix =\n outro.reportFile && !message.includes(outro.reportFile)\n ? ` Check ./${outro.reportFile} for details.`\n : '';\n return `${GREEN}${BOLD}\\u2714${RESET_ATTRS} ${message}${reportSuffix}`;\n }\n\n return `${DIM}${label} exited.${RESET_ATTRS}`;\n}\n\nexport function startTUI(\n version: string,\n program: ProgramId = Program.PostHogIntegration,\n): {\n unmount: () => void;\n store: WizardStore;\n waitForSetup: () => Promise<void>;\n} {\n // Enter alternate screen buffer, then set up dark background\n process.stdout.write(\n ENTER_ALT_SCREEN + BG_BLACK + CLEAR_SCREEN + CURSOR_HOME,\n );\n\n const store = new WizardStore(program);\n store.version = version;\n\n const inkUI = new InkUI(store);\n setUI(inkUI);\n\n const { unmount: inkUnmount } = render(createElement(App, { store }));\n\n // On exit: unmount Ink, leave alt screen (restores previous content),\n // then print exit summary line into the main buffer.\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n inkUnmount();\n releaseTerminal();\n process.stdout.write(getExitLine(store) + '\\n');\n };\n process.on('exit', cleanup);\n\n return {\n unmount: cleanup,\n store,\n waitForSetup: () => store.getGate('intro'),\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"start-tui-P9aMwBzt.js","names":["DetectErrorBody","VARIANT_DISPLAY_NAME","fs","FINDING_STATUSES","isFinding","fallbackSlide","openLink","ActiveSlide","WritingReport","groupByArea","groupIcon","GroupHeader","NEON_PINK","NEON_BLUE","NEON_GOLD","NEON_PINK","NEON_GOLD","NEON_BLUE","NEON_PINK","NEON_GOLD","NEON_BLUE","countByStatus","NEON_BLUE","NEON_GOLD","NEON_PINK","getSkillContentBlocks","runPluginInstall"],"sources":["../src/ui/tui/ink-ui.ts","../src/ui/tui/screens/health/HealthCheckScreen.tsx","../src/ui/tui/screens/doctor/DoctorIntroScreen.tsx","../src/ui/tui/screens/doctor/DoctorReportScreen.tsx","../src/ui/tui/screens/SettingsOverrideScreen.tsx","../src/ui/tui/screens/ManagedSettingsScreen.tsx","../src/ui/tui/screens/PortConflictScreen.tsx","../src/ui/tui/screens/ManualAuthCodeScreen.tsx","../src/ui/tui/screens/IntroScreenLayout.tsx","../src/ui/tui/screens/SkillSourceInfo.tsx","../src/ui/tui/screens/PostHogIntegrationIntroScreen.tsx","../src/ui/tui/screens/RevenueIntroScreen.tsx","../src/ui/tui/screens/MigrationIntroScreen.tsx","../src/ui/tui/screens/SourceMapsIntroScreen.tsx","../src/ui/tui/screens/SourceMapsOutroScreen.tsx","../src/ui/tui/screens/AgentSkillIntroScreen.tsx","../src/ui/tui/screens/audit/AuditIntroScreen.tsx","../src/ui/tui/hooks/file-watcher.ts","../src/ui/tui/screens/audit/AuditAreaPane.tsx","../src/ui/tui/screens/audit/slides/events-audit/detectSdk.tsx","../src/ui/tui/screens/audit/slides/events-audit/scanSites.tsx","../src/ui/tui/screens/audit/slides/events-audit/enrichSites.tsx","../src/ui/tui/screens/audit/slides/events-audit/queryVolume.tsx","../src/ui/tui/screens/audit/slides/events-audit/writeReport.tsx","../src/ui/tui/screens/audit/slides/events-audit/createDashboard.tsx","../src/ui/tui/screens/audit/slides/events-audit/uploadNotebook.tsx","../src/ui/tui/screens/audit/slides/events-audit/index.ts","../src/ui/tui/screens/audit/PendingChecksList.tsx","../src/ui/tui/screens/audit/AuditRunScreen.tsx","../src/ui/tui/screens/audit/AuditChecksOutroSection.tsx","../src/ui/tui/screens/audit/AuditOutroScreen.tsx","../src/ui/tui/screens/audit-3000/arcade-colors.ts","../src/ui/tui/screens/audit-3000/Audit3000IntroScreen.tsx","../src/ui/tui/screens/audit-3000/Audit3000AreaPane.tsx","../src/ui/tui/screens/audit-3000/Audit3000ChecksPanel.tsx","../src/ui/tui/screens/audit-3000/hedgehog-runner-engine.ts","../src/ui/tui/screens/audit-3000/HedgehogRunner.tsx","../src/ui/tui/screens/audit-3000/Audit3000RunScreen.tsx","../src/ui/tui/screens/audit-3000/Audit3000OutroScreen.tsx","../src/ui/tui/screens/SetupScreen.tsx","../src/ui/tui/screens/AuthScreen.tsx","../src/ui/tui/screens/RunScreen.tsx","../src/ui/tui/screens/KeepSkillsScreen.tsx","../src/ui/tui/screens/OutroScreen.tsx","../src/ui/tui/screens/ExitScreen.tsx","../src/ui/tui/screens/AuthErrorScreen.tsx","../src/ui/tui/screens/WizardAskScreen.tsx","../src/steps/add-mcp-server-to-clients/browser-client.ts","../src/ui/tui/services/mcp-installer.ts","../src/ui/tui/services/mcp-suggested-prompts-services.ts","../src/ui/tui/screen-registry.tsx","../src/ui/tui/App.tsx","../src/ui/tui/start-tui.ts"],"sourcesContent":["/**\n * InkUI — Ink-backed implementation of WizardUI.\n *\n * Translates business logic calls into store setter calls.\n * No direct session mutation. No imperative screen transitions.\n * The router derives the active screen from session state.\n */\n\nimport type { WizardUI, SpinnerHandle, AuthErrorDetail } from '@ui/wizard-ui';\nimport type { WizardStore } from './store.js';\nimport type { SettingsConflict } from '@lib/agent/agent-interface';\nimport type { WizardReadinessResult } from '@lib/health-checks/readiness';\nimport type { ApiUser } from '@lib/api';\nimport type {\n AskAnswers,\n OutroData,\n PendingQuestion,\n} from '@lib/wizard-session';\nimport { RunPhase, OutroKind } from '@lib/wizard-session';\n\n// Strip ANSI escape codes (chalk formatting) from strings\n// eslint-disable-next-line no-control-regex\nconst ANSI_RE = /\\x1b\\[[0-9;]*m/g;\nfunction stripAnsi(s: string): string {\n return s.replace(ANSI_RE, '');\n}\n\nexport class InkUI implements WizardUI {\n constructor(private store: WizardStore) {}\n\n intro(message: string): void {\n this.store.pushStatus(message);\n }\n\n outro(message: string): void {\n this.store.pushStatus(stripAnsi(message));\n\n // Outro data is pushed by agent-runner via setOutroData() above. If it\n // wasn't (e.g. CI path where outro is called directly with just a\n // message), fall back to a minimal success record so the screen still\n // renders something useful.\n const existing = this.store.session.outroData;\n if (!existing) {\n this.store.setOutroData({\n kind: OutroKind.Success,\n message: stripAnsi(message),\n });\n }\n\n // Signal that the main work is done — router resolves to mcp or outro\n if (this.store.session.runPhase === RunPhase.Running) {\n this.store.setRunPhase(RunPhase.Completed);\n }\n }\n\n outroError(data: OutroData): void {\n this.store.setOutroData(data);\n // Advance router past the run step so the outro screen renders\n if (this.store.session.runPhase !== RunPhase.Error) {\n this.store.setRunPhase(RunPhase.Error);\n }\n }\n\n waitForOutroDismissed(): Promise<void> {\n return new Promise((resolve) => {\n if (this.store.session.outroDismissed) {\n resolve();\n return;\n }\n const unsub = this.store.subscribe(() => {\n if (this.store.session.outroDismissed) {\n unsub();\n resolve();\n }\n });\n });\n }\n\n setCredentials(credentials: {\n accessToken: string;\n projectApiKey: string;\n host: string;\n projectId: number;\n }): void {\n this.store.setCredentials(credentials);\n }\n\n setRoleAtOrganization(role: string | null): void {\n this.store.setRoleAtOrganization(role);\n }\n\n setApiUser(user: ApiUser | null): void {\n this.store.setApiUser(user);\n }\n\n setDetectedFramework(label: string): void {\n this.store.setDetectedFramework(label);\n }\n\n onEnterScreen(screen: string, fn: () => void): void {\n this.store.onEnterScreen(\n screen as Parameters<WizardStore['onEnterScreen']>[0],\n fn,\n );\n }\n\n setLoginUrl(url: string | null): void {\n this.store.setLoginUrl(url);\n }\n\n setAuthorizeUrl(url: string | null): void {\n this.store.setAuthorizeUrl(url);\n }\n\n showBlockingOutage(result: WizardReadinessResult): Promise<void> {\n // In the TUI, the HealthCheckScreen handles outage display.\n // This is only called from agent-runner for the CI fallback path.\n this.store.setReadinessResult(result);\n return Promise.resolve();\n }\n\n setReadinessWarnings(result: WizardReadinessResult): void {\n this.store.setReadinessResult(result);\n }\n\n showPortConflict(processInfo: {\n command: string;\n pid: string;\n port: number;\n user: string;\n }): Promise<void> {\n return this.store.showPortConflict(processInfo);\n }\n\n waitForManualAuthCode(): Promise<string> {\n return this.store.waitForManualAuthCode();\n }\n\n showSettingsOverride(\n conflicts: SettingsConflict[],\n backupAndFix: () => boolean,\n ): Promise<void> {\n return this.store.showSettingsOverride(conflicts, backupAndFix);\n }\n\n showAuthError(detail?: AuthErrorDetail): void {\n this.store.showAuthError(detail);\n }\n\n requestQuestion(question: PendingQuestion): Promise<AskAnswers> {\n return this.store.requestQuestion(question);\n }\n\n startRun(): void {\n this.store.setRunPhase(RunPhase.Running);\n }\n\n cancel(message: string): void {\n this.store.pushStatus(message);\n }\n\n log = {\n info: (message: string): void => {\n this.store.pushStatus(message);\n },\n warn: (message: string): void => {\n this.store.pushStatus(message);\n },\n error: (message: string): void => {\n this.store.pushStatus(message);\n },\n success: (message: string): void => {\n this.store.pushStatus(message);\n },\n step: (message: string): void => {\n this.store.pushStatus(message);\n },\n };\n\n note(message: string): void {\n this.store.pushStatus(message);\n }\n\n spinner(): SpinnerHandle {\n return {\n start: (message?: string) => {\n if (message) this.store.pushStatus(message);\n },\n stop: (message?: string) => {\n if (message) this.store.pushStatus(message);\n },\n message: (msg?: string) => {\n if (msg) this.store.pushStatus(msg);\n },\n };\n }\n\n pushStatus(message: string): void {\n this.store.pushStatus(message);\n }\n\n syncTodos(\n todos: Array<{ content: string; status: string; activeForm?: string }>,\n ): void {\n this.store.syncTodos(todos);\n }\n\n setEventPlan(events: Array<{ name: string; description: string }>): void {\n this.store.setEventPlan(events);\n }\n\n setDashboardUrl(url: string): void {\n this.store.setDashboardUrl(url);\n }\n\n setNotebookUrl(url: string): void {\n this.store.setNotebookUrl(url);\n }\n\n setOutroData(data: OutroData): void {\n // Merge in URLs the agent emitted via `[DASHBOARD_URL]` / `[NOTEBOOK_URL]`\n // markers. These land on the live store during the run; agent-runner's\n // `session` snapshot misses them (setKey forks the reference). The live\n // store wins over the `data` payload so a real emission always beats any\n // fallback the program's buildOutroData may have computed from the stale\n // snapshot (e.g. events-audit defaults dashboardUrl to `${cloudUrl}/dashboard`).\n const live = this.store.session;\n this.store.setOutroData({\n ...data,\n dashboardUrl: live.dashboardUrl ?? data.dashboardUrl ?? undefined,\n notebookUrl: live.notebookUrl ?? data.notebookUrl ?? undefined,\n });\n }\n\n setFrameworkContext(key: string, value: unknown): void {\n this.store.setFrameworkContext(key, value);\n }\n}\n","/**\n * HealthCheckScreen — Program screen between Intro and Auth.\n *\n * Three states:\n * 1. Checking: spinner while health check runs\n * 2. Healthy: isComplete returns true, router auto-advances to Auth\n * 3. Blocking outage: shows affected services with Continue/Exit\n */\n\nimport { Box, Text, useInput } from 'ink';\nimport { useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport {\n ConfirmationInput,\n LoadingBox,\n ModalOverlay,\n} from '@ui/tui/primitives/index';\nimport { Colors, Icons } from '@ui/tui/styles';\nimport { ServiceHealthList } from '@ui/tui/components/ServiceHealthList';\nimport {\n getBlockingServiceKeys,\n SIGNUP_WIZARD_READINESS_CONFIG,\n} from '@lib/health-checks/readiness';\nimport { ServiceHealthStatus } from '@lib/health-checks/types';\nimport { wizardAbort } from '@utils/wizard-abort';\nimport { fetchSkillMenu, downloadSkill } from '@lib/wizard-tools';\nimport { REMOTE_SKILLS_BASE_URL } from '@lib/constants';\n\ninterface HealthCheckScreenProps {\n store: WizardStore;\n}\n\nconst EXAMPLE_PROMPT =\n 'Integrate PostHog into this project using the skill files in .posthog/skills/. Read SKILL.md first, then follow the numbered program files in order.';\n\nconst SkillsDownloadedScreen = () => {\n useInput(() => {\n process.exit(0);\n });\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text color=\"green\" bold>\n {Icons.check} Skills downloaded to .posthog/skills/\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text>\n You can continue setup with another agent using this prompt:\n </Text>\n <Box marginTop={1} paddingLeft={2}>\n <Text color=\"cyan\">{EXAMPLE_PROMPT}</Text>\n </Box>\n </Box>\n\n <Box marginTop={1}>\n <Text color={Colors.muted}>Press any key to exit</Text>\n </Box>\n </Box>\n );\n};\n\nexport const HealthCheckScreen = ({ store }: HealthCheckScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const [downloaded, setDownloaded] = useState(false);\n const [downloading, setDownloading] = useState(false);\n\n const result = store.session.readinessResult;\n\n if (downloaded) {\n return <SkillsDownloadedScreen />;\n }\n\n // Still checking — show spinner\n if (!result) {\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <LoadingBox message=\"Checking service status...\" />\n </Box>\n );\n }\n\n const isSignup = store.session.signup;\n const blockingKeys = getBlockingServiceKeys(\n result.health,\n isSignup ? SIGNUP_WIZARD_READINESS_CONFIG : undefined,\n );\n\n // Signup has a narrower block list (only posthog + llm-gateway), so\n // services like Anthropic can be degraded without blocking. Surface\n // those as dismissable warnings instead of silently proceeding.\n const warningKeys = isSignup\n ? getBlockingServiceKeys(result.health).filter(\n (k) => !blockingKeys.includes(k),\n )\n : [];\n\n const hasHardBlock = blockingKeys.length > 0;\n const displayKeys = hasHardBlock ? blockingKeys : warningKeys;\n if (displayKeys.length === 0) return null;\n\n const isGithubReleasesDown =\n hasHardBlock && blockingKeys.includes('githubReleases');\n const canDownloadSkills =\n result.health.githubReleases.status === ServiceHealthStatus.Healthy;\n const integration = store.session.integration;\n\n const title = hasHardBlock\n ? 'Ongoing service disruptions'\n : 'Service disruption detected';\n\n const docsUrl = store.session.frameworkConfig?.metadata.docsUrl;\n const description = isGithubReleasesDown\n ? \"The Wizard can't download necessary skills from GitHub Releases right now.\"\n : hasHardBlock\n ? 'The Wizard cannot start while these services are down.'\n : 'Some services are degraded. You can continue, but parts of the wizard may not work reliably.';\n\n const handleDownloadAndExit = async () => {\n if (downloading) return;\n setDownloading(true);\n const menu = await fetchSkillMenu(REMOTE_SKILLS_BASE_URL);\n if (menu) {\n const prefix = `integration-${integration}`;\n const skills = (menu.categories['integration'] ?? []).filter((s) =>\n s.id.startsWith(prefix),\n );\n for (const skill of skills) {\n downloadSkill(skill, store.session.installDir, '.posthog/skills');\n }\n }\n setDownloaded(true);\n };\n\n const handleCancel =\n canDownloadSkills && !isGithubReleasesDown\n ? () => void handleDownloadAndExit()\n : () => void wizardAbort({ message: 'Exited due to service outage.' });\n\n const cancelLabel =\n canDownloadSkills && !isGithubReleasesDown\n ? downloading\n ? 'Downloading...'\n : 'Download skills & Exit [Esc]'\n : 'Exit [Esc]';\n\n return (\n <ModalOverlay\n borderColor={hasHardBlock ? 'red' : 'yellow'}\n title={title}\n width={72}\n footer={\n isGithubReleasesDown ? (\n <ConfirmationInput\n message=\"\"\n confirmLabel=\"\"\n cancelLabel=\"Exit [Esc]\"\n onConfirm={() =>\n void wizardAbort({ message: 'Exited due to service outage.' })\n }\n onCancel={() =>\n void wizardAbort({ message: 'Exited due to service outage.' })\n }\n />\n ) : (\n <ConfirmationInput\n message=\"Continue anyway?\"\n confirmLabel=\"Continue [Enter]\"\n cancelLabel={cancelLabel}\n onConfirm={() => store.dismissOutage()}\n onCancel={handleCancel}\n />\n )\n }\n >\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box marginBottom={1}>\n <Text>\n <Text color=\"red\">{Icons.squareFilled}</Text>\n <Text dimColor> Down </Text>\n <Text color=\"#DC9300\">{Icons.squareFilled}</Text>\n <Text dimColor> Degraded</Text>\n </Text>\n </Box>\n\n <ServiceHealthList\n health={result.health}\n filterKeys={displayKeys}\n showHealthy={false}\n />\n </Box>\n\n <Text dimColor>{description}</Text>\n\n {isGithubReleasesDown && docsUrl && (\n <Box marginTop={1}>\n <Text>\n Set up manually: <Text color=\"cyan\">{docsUrl}</Text>\n </Text>\n </Box>\n )}\n\n {canDownloadSkills && !isGithubReleasesDown && (\n <Box marginTop={1}>\n <Text>\n You can still download the PostHog integration skills and continue\n with another agent.\n </Text>\n </Box>\n )}\n </ModalOverlay>\n );\n};\n","import { Box, Text } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { PickerMenu } from '@ui/tui/primitives/index';\nimport { Colors, Icons } from '@ui/tui/styles';\n\ninterface DoctorIntroScreenProps {\n store: WizardStore;\n}\n\nexport const DoctorIntroScreen = ({ store }: DoctorIntroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color={Colors.accent}>\n PostHog Doctor\n </Text>\n <Text dimColor>\n Scan your project configuration for issues that may need attention.\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text>The wizard will:</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n <Text>{Icons.bullet} Sign you in to PostHog</Text>\n <Text>\n {Icons.bullet} Fetch active health issues for your project\n </Text>\n <Text>\n {Icons.bullet} Show you what needs to be resolved, with docs links\n </Text>\n </Box>\n </Box>\n\n <PickerMenu\n options={[\n { label: 'Continue', value: 'continue' },\n { label: 'Cancel', value: 'cancel' },\n ]}\n onSelect={(value) => {\n if (value === 'cancel') {\n process.exit(0);\n } else {\n store.completeSetup();\n }\n }}\n />\n </Box>\n );\n};\n","import { Box, Text } from 'ink';\nimport { useEffect, useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { LoadingBox, PickerMenu } from '@ui/tui/primitives/index';\nimport { Colors, Icons } from '@ui/tui/styles';\nimport {\n fetchHealthIssues,\n type HealthIssue,\n} from '@lib/programs/posthog-doctor/index';\nimport { getUiHostFromHost } from '@utils/urls';\nimport { OutroKind } from '@lib/wizard-session';\nimport { ApiError } from '@lib/api';\nimport { POSTHOG_DOCS_URL } from '@lib/constants';\nimport { IssueTable, SEVERITY_LABEL, SEVERITY_ORDER } from './IssueTable.js';\n\ninterface DoctorReportScreenProps {\n store: WizardStore;\n}\n\ntype FetchState =\n | { kind: 'loading' }\n | { kind: 'ready'; issues: HealthIssue[] }\n | { kind: 'error'; message: string };\n\nexport const DoctorReportScreen = ({ store }: DoctorReportScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const { credentials } = store.session;\n const accessToken = credentials?.accessToken;\n const host = credentials?.host;\n const projectId = credentials?.projectId;\n\n const [state, setState] = useState<FetchState>({ kind: 'loading' });\n\n useEffect(() => {\n if (!accessToken || !host || projectId == null) return;\n let cancelled = false;\n void (async () => {\n try {\n const issues = await fetchHealthIssues(accessToken, host, projectId);\n if (!cancelled) {\n setState({ kind: 'ready', issues });\n }\n } catch (err) {\n if (!cancelled) {\n const message =\n err instanceof ApiError && err.statusCode === 401\n ? 'Your PostHog session has expired. Re-run the wizard to sign in again.'\n : err instanceof Error\n ? err.message\n : String(err);\n setState({ kind: 'error', message });\n }\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [accessToken, host, projectId]);\n\n if (!credentials) {\n return <LoadingBox message=\"Waiting for authentication...\" />;\n }\n\n if (state.kind === 'loading') {\n return (\n <Box flexDirection=\"column\">\n <Header host={credentials.host} projectId={credentials.projectId} />\n <LoadingBox message=\"Fetching health issues...\" />\n </Box>\n );\n }\n\n const healthUrl = `${getUiHostFromHost(credentials.host)}/project/${\n credentials.projectId\n }/health`;\n\n if (state.kind === 'error') {\n return (\n <Box flexDirection=\"column\">\n <Header host={credentials.host} projectId={credentials.projectId} />\n <Box flexDirection=\"column\" marginY={1}>\n <Text color={Colors.error} bold>\n {Icons.squareFilled} Failed to fetch health issues\n </Text>\n <Text dimColor>{state.message}</Text>\n </Box>\n <PickerMenu\n options={[{ label: 'Continue', value: 'continue' }]}\n onSelect={() => {\n store.setOutroData({\n kind: OutroKind.Error,\n message: 'Failed to fetch health issues',\n body: state.message,\n docsUrl: POSTHOG_DOCS_URL,\n });\n }}\n />\n </Box>\n );\n }\n\n const { issues } = state;\n\n if (issues.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Header host={credentials.host} projectId={credentials.projectId} />\n <Box marginY={1}>\n <Text color={Colors.success} bold>\n {Icons.check} No active issues — you're all set!\n </Text>\n </Box>\n <PickerMenu\n options={[{ label: 'Continue', value: 'continue' }]}\n onSelect={() => {\n store.setOutroData({\n kind: OutroKind.Success,\n message: 'No active issues — your project looks healthy.',\n docsUrl: POSTHOG_DOCS_URL,\n continueUrl: healthUrl,\n });\n }}\n />\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <Header host={credentials.host} projectId={credentials.projectId} />\n <Box marginTop={1}>\n <Text>{formatSummaryLine(issues)}</Text>\n </Box>\n\n <Box flexDirection=\"column\" marginBottom={1}>\n <IssueTable issues={issues} />\n </Box>\n\n <PickerMenu\n options={[{ label: 'Continue', value: 'continue' }]}\n onSelect={() => {\n store.setOutroData({\n kind: OutroKind.Success,\n message: `Found ${issues.length} active issue${\n issues.length === 1 ? '' : 's'\n }.`,\n body: 'Open the dashboard in PostHog to dismiss or resolve issues.',\n docsUrl: POSTHOG_DOCS_URL,\n continueUrl: healthUrl,\n });\n }}\n />\n </Box>\n );\n};\n\nconst Header = ({ host, projectId }: { host: string; projectId: number }) => (\n <Box flexDirection=\"column\">\n <Text bold color={Colors.accent}>\n PostHog Doctor Report\n </Text>\n <Text dimColor>\n Project {projectId} {Icons.bullet} {host}\n </Text>\n </Box>\n);\n\nfunction formatSummaryLine(issues: HealthIssue[]): string {\n const parts: string[] = [];\n for (const sev of SEVERITY_ORDER) {\n const n = issues.filter((i) => i.severity === sev).length;\n if (n > 0) parts.push(`${n} ${SEVERITY_LABEL[sev].toLowerCase()}`);\n }\n const suffix = parts.length > 0 ? `: ${parts.join(', ')}` : '';\n return `${issues.length} active issue${\n issues.length === 1 ? '' : 's'\n }${suffix}`;\n}\n","import { Box, Text } from 'ink';\nimport { useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { ConfirmationInput, ModalOverlay } from '@ui/tui/primitives/index';\nimport { Icons } from '@ui/tui/styles';\nimport type { SettingsConflictSource } from '@lib/agent/agent-interface';\n\nfunction sourcePath(source: SettingsConflictSource): string {\n switch (source) {\n case 'project':\n return '.claude/settings.json';\n case 'managed':\n return '/Library/Application Support/ClaudeCode/managed-settings.json';\n default:\n return source;\n }\n}\n\ninterface SettingsOverrideScreenProps {\n store: WizardStore;\n}\n\nexport const SettingsOverrideScreen = ({\n store,\n}: SettingsOverrideScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const [feedback, setFeedback] = useState<string | null>(null);\n const conflicts = store.session.settingsConflicts?.filter((c) => c.writable);\n\n if (!conflicts || conflicts.length === 0) {\n return null;\n }\n\n return (\n <ModalOverlay\n borderColor=\"red\"\n title={`${Icons.warning} Settings conflict`}\n width={64}\n feedback={feedback ? `${Icons.warning} ${feedback}` : null}\n footer={\n <ConfirmationInput\n message=\"Back up to .wizard-backup and continue?\"\n confirmLabel=\"Backup & continue [Enter]\"\n cancelLabel=\"Exit [Esc]\"\n onConfirm={() => {\n const ok = store.backupAndFixSettingsOverride();\n if (!ok) {\n setFeedback('Could not back up the settings file.');\n }\n }}\n onCancel={() => process.exit(1)}\n />\n }\n >\n {conflicts.map((conflict) => (\n <Box key={conflict.source} flexDirection=\"column\" marginBottom={1}>\n <Text>\n Your settings file at{' '}\n <Text bold>{sourcePath(conflict.source)}</Text> sets:\n </Text>\n <Box flexDirection=\"column\" paddingLeft={2}>\n {conflict.keys.map((key) => (\n <Text key={key}>\n {Icons.bullet}{' '}\n <Text color=\"yellow\" bold>\n {key}\n </Text>\n </Text>\n ))}\n </Box>\n </Box>\n ))}\n <Text dimColor>\n These settings override credentials and prevent the Wizard from reaching\n the PostHog LLM Gateway. We can back up the file and continue.\n </Text>\n </ModalOverlay>\n );\n};\n","/**\n * ManagedSettingsScreen — Modal when IT/org-managed settings contain overrides\n * that block the Wizard from reaching the PostHog LLM Gateway.\n *\n * Unlike SettingsOverrideScreen, the wizard cannot back up or modify these files.\n * The user must contact their IT administrator to resolve the conflict.\n */\n\nimport { Box, Text } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { ConfirmationInput, ModalOverlay } from '@ui/tui/primitives/index';\nimport { Icons } from '@ui/tui/styles';\nimport type { SettingsConflict } from '@lib/agent/agent-interface';\n\nfunction sourceLabel(source: SettingsConflict['source']): string {\n switch (source) {\n case 'managed':\n return 'Managed settings (IT/org-managed)';\n case 'project':\n return '.claude/settings.json';\n default:\n return source;\n }\n}\n\ninterface ManagedSettingsScreenProps {\n store: WizardStore;\n}\n\nexport const ManagedSettingsScreen = ({\n store,\n}: ManagedSettingsScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const conflicts = store.session.settingsConflicts;\n const readOnlyConflicts = conflicts?.filter((c) => !c.writable);\n\n if (!readOnlyConflicts || readOnlyConflicts.length === 0) {\n return null;\n }\n\n return (\n <ModalOverlay\n borderColor=\"red\"\n title={`${Icons.warning} Organization settings conflict`}\n width={68}\n footer={\n <ConfirmationInput\n message=\"Contact your IT administrator to resolve this.\"\n confirmLabel=\"\"\n cancelLabel=\"Exit [Esc]\"\n onConfirm={() => process.exit(1)}\n onCancel={() => process.exit(1)}\n />\n }\n >\n <Text dimColor>\n Your organization's managed settings contain overrides that prevent\n the Wizard from reaching the PostHog LLM Gateway.\n </Text>\n {readOnlyConflicts.map((conflict) => (\n <Box key={conflict.source} flexDirection=\"column\" marginTop={1}>\n <Text bold>{sourceLabel(conflict.source)}</Text>\n <Box flexDirection=\"column\" paddingLeft={2}>\n {conflict.keys.map((key) => (\n <Text key={key}>\n {Icons.bullet}{' '}\n <Text color=\"yellow\" bold>\n {key}\n </Text>\n </Text>\n ))}\n </Box>\n </Box>\n ))}\n <Box marginTop={1}>\n <Text dimColor>\n Try running \"claude auth logout\" or contact your IT administrator to\n resolve this.\n </Text>\n </Box>\n </ModalOverlay>\n );\n};\n","/**\n * PortConflictScreen — Modal when all OAuth port candidates are occupied.\n *\n * Shows every port the wizard tried and asks the user to free them manually.\n */\n\nimport { Box, Text } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { OAUTH_PORTS } from '@lib/constants';\nimport { ConfirmationInput, ModalOverlay } from '@ui/tui/primitives/index';\n\ninterface PortConflictScreenProps {\n store: WizardStore;\n}\n\nexport const PortConflictScreen = ({ store }: PortConflictScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const processInfo = store.session.portConflictProcess;\n\n if (!processInfo) return null;\n\n return (\n <ModalOverlay\n borderColor=\"#DC9300\"\n title=\"OAuth ports in use\"\n width={72}\n footer={\n <ConfirmationInput\n message=\"Retry after freeing ports?\"\n confirmLabel=\"Retry [Enter]\"\n cancelLabel=\"Exit [Esc]\"\n onConfirm={() => store.resolvePortConflict()}\n onCancel={() => process.exit(1)}\n />\n }\n >\n <Text>\n The wizard needs a local port for OAuth. We tried these ports which are\n all in use:\n </Text>\n <Box flexDirection=\"column\" marginY={1} paddingLeft={2} gap={0}>\n {OAUTH_PORTS.map((port) => (\n <Text key={port}>\n <Text dimColor>Port </Text>\n <Text bold>{port}</Text>\n </Text>\n ))}\n </Box>\n <Text dimColor>Please free one of these ports and retry.</Text>\n </ModalOverlay>\n );\n};\n","/**\n * ManualAuthCodeScreen — Paste an OAuth authorization code by hand.\n *\n * Fallback for headless/remote shells where the browser can't reach the\n * wizard's local callback server. Shows the direct authorize URL (the localhost\n * one is unreachable from another machine), then the user pastes either the\n * full callback URL the browser was redirected to\n * (`http://localhost:8239/callback?code=...`) or just the code. On submit we\n * extract the code and resolve the in-flight OAuth flow; bad input shows inline\n * feedback without leaving the screen.\n *\n * Opened from AuthScreen via a keypress; Esc dismisses it.\n */\n\nimport { Box, Text, useInput } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { Colors, Icons } from '@ui/tui/styles';\nimport { extractOAuthCode } from '@utils/oauth';\n\ninterface ManualAuthCodeScreenProps {\n store: WizardStore;\n}\n\nexport const ManualAuthCodeScreen = ({ store }: ManualAuthCodeScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const { session } = store;\n const [error, setError] = useState<string | null>(null);\n\n // Esc cancels and returns to the waiting auth screen.\n useInput((_input, key) => {\n if (key.escape) {\n store.dismissManualAuthCode();\n }\n });\n\n const handleSubmit = (value: string): void => {\n const code = extractOAuthCode(value);\n if (!code) {\n setError(\n \"Couldn't find a code in that input. Paste the full callback URL or just the code.\",\n );\n return;\n }\n store.submitManualAuthCode(code);\n };\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box marginBottom={1}>\n <Text bold color={Colors.accent}>\n {Icons.diamond} Paste authorization code\n </Text>\n </Box>\n\n {session.authorizeUrl && (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text dimColor>\n On a remote/headless machine the local login link won't open. Open\n this URL in a browser on any machine to authorize:\n </Text>\n {/* No border + flexShrink={0}: Ink won't hard-wrap the URL, so it\n stays one continuous string the terminal soft-wraps — copies clean\n instead of being chopped across bordered, indented rows. */}\n <Box flexShrink={0} marginTop={1}>\n <Text color=\"cyan\">{session.authorizeUrl}</Text>\n </Box>\n </Box>\n )}\n\n <Text>\n After authorizing, paste the callback URL it lands on — or just the code\n from it — here:\n </Text>\n <Box marginTop={1} width=\"100%\">\n <TextInput\n placeholder=\"http://localhost:8239/callback?code=… or the code\"\n onSubmit={handleSubmit}\n />\n </Box>\n\n {error && (\n <Box marginTop={1}>\n <Text color=\"yellow\">{error}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text>\n <Text color={Colors.accent}>ENTER</Text>\n <Text dimColor> submit</Text>\n <Text dimColor> · </Text>\n <Text color={Colors.accent}>ESC</Text>\n <Text dimColor> cancel</Text>\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * IntroScreenLayout ��� Shared visual shell for all program intro screens.\n *\n * Purely presentational — no store subscription. Parent components own\n * the store subscription and pass derived data as props.\n *\n * Slots:\n * body — free-form content below the title bar (copy, spinners, pickers, etc.)\n * children — between detection rows and menu (extra info, warnings)\n * errorView — replaces the entire body for fatal error states\n */\n\nimport path from 'path';\nimport { Box, Text } from 'ink';\nimport type { ReactNode } from 'react';\nimport { PickerMenu } from '@ui/tui/primitives/index';\n\nexport interface DetectionRow {\n label: string;\n value: string;\n suffix?: string;\n}\n\ninterface IntroScreenLayoutProps {\n /** Absolute path to the project directory */\n installDir: string;\n\n /** Title text after the colored blocks, e.g. \"PostHog Wizard 🦔\" */\n title?: string;\n\n /** Show the default \"We'll use AI…\" / \".env*…\" subtitle. Default true. */\n showSubtitle?: boolean;\n\n /** Free-form content below the title (copy, spinners, pickers, notices) */\n body?: ReactNode;\n\n /** Show the detection block (Directory, detection rows, Program, Skill). Default true. */\n showDetection?: boolean;\n\n /** Extra detection row items rendered as \"Label ✔ value suffix\" */\n detectionRows?: DetectionRow[];\n\n /** Content rendered between detection rows and the menu */\n children?: ReactNode;\n\n /** Menu options. Pass null to hide the menu entirely. */\n menuOptions?: { label: string; value: string }[] | null;\n\n /** Called when the user picks a menu option */\n onSelect?: (value: string) => void;\n\n /** Program label shown at the bottom */\n programLabel?: string | null;\n\n /** Skill ID shown at the bottom */\n skillId?: string | null;\n\n /** Replaces the entire body (topContent + rows + children + menu) for fatal error views */\n errorView?: ReactNode;\n}\n\nconst WizardTitle = ({ title }: { title: string }) => (\n <Text bold>\n <Text color=\"#1D4AFF\">{'\\u2588'}</Text>\n <Text color=\"#F54E00\">{'\\u2588'}</Text>\n <Text color=\"#F9BD2B\">{'\\u2588'}</Text> {title}\n </Text>\n);\n\nexport const IntroScreenLayout = ({\n installDir,\n title = 'PostHog Wizard 🦔',\n showSubtitle = true,\n body,\n showDetection = true,\n detectionRows,\n children,\n menuOptions,\n onSelect,\n programLabel,\n skillId,\n errorView,\n}: IntroScreenLayoutProps) => {\n // Default menu: Continue / Cancel\n const resolvedMenuOptions =\n menuOptions === undefined\n ? [\n { label: 'Continue', value: 'continue' },\n { label: 'Cancel', value: 'cancel' },\n ]\n : menuOptions;\n\n if (errorView) {\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Box flexDirection=\"column\" alignItems=\"center\" marginBottom={1}>\n <WizardTitle title={title} />\n </Box>\n {errorView}\n </Box>\n );\n }\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Box flexDirection=\"column\" alignItems=\"center\">\n <WizardTitle title={title} />\n\n {showSubtitle && (\n <Box flexDirection=\"column\" alignItems=\"center\" marginTop={1}>\n <Text dimColor>\n We'll use AI to analyze your project and complete work.\n </Text>\n <Text dimColor>\n .env* file contents will not leave your machine.\n </Text>\n </Box>\n )}\n\n {body && (\n <Box flexDirection=\"column\" alignItems=\"center\" marginTop={1}>\n {body}\n </Box>\n )}\n </Box>\n\n {children}\n\n {showDetection && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text>\n <Text>\n Directory <Text color=\"green\">{'\\u2714'}</Text>{' '}\n </Text>\n <Text>\n {'/'}\n {path.basename(installDir)}\n </Text>\n </Text>\n\n {detectionRows?.map((row) => (\n <Text key={row.label}>\n <Text>\n {row.label} <Text color=\"green\">{'\\u2714'}</Text>{' '}\n </Text>\n <Text>\n {row.value}\n {row.suffix ? ` ${row.suffix}` : ''}\n </Text>\n </Text>\n ))}\n\n {programLabel && (\n <Text>\n Program{' '}\n <Text color=\"green\">{'\\u2714'}</Text> {programLabel}\n </Text>\n )}\n\n {programLabel === 'agent-skill' && skillId && (\n <Text>\n Skill{' '}\n <Text color=\"green\">{'\\u2714'}</Text> {skillId}\n </Text>\n )}\n </Box>\n )}\n\n <Box width={24}>\n {resolvedMenuOptions && onSelect && (\n <Box justifyContent=\"center\">\n <PickerMenu\n key={resolvedMenuOptions.map((o) => o.value).join(',')}\n options={resolvedMenuOptions}\n onSelect={(value) => {\n const choice = Array.isArray(value) ? value[0] : value;\n onSelect(choice);\n }}\n />\n </Box>\n )}\n </Box>\n </Box>\n </>\n );\n};\n","/**\n * Shared \"Skill: <id> / URL: <downloadUrl>\" block for intro screens.\n *\n * `useSkillEntry` fetches the entry from the skill menu and re-runs when\n * `skillId` or `local` change. The previous fetch is cancelled (its result\n * is ignored) so a session that flips `local=false → true` mid-mount picks\n * up the right base URL.\n *\n * `<SkillSourceInfo>` renders the block, taking the entry as a prop so the\n * caller can reuse the same hook result for additional UI (e.g. showing\n * `skillEntry.name`) without invoking the hook twice.\n */\n\nimport { Box, Text } from 'ink';\nimport { useEffect, useState } from 'react';\nimport { fetchSkillMenu, type SkillEntry } from '@lib/wizard-tools';\nimport { getSkillsBaseUrl } from '@lib/constants';\n\nexport function useSkillEntry(\n skillId: string | null,\n local: boolean,\n): { skillEntry: SkillEntry | null; fetchFailed: boolean } {\n const [skillEntry, setSkillEntry] = useState<SkillEntry | null>(null);\n const [fetchFailed, setFetchFailed] = useState(false);\n\n useEffect(() => {\n if (!skillId) {\n setFetchFailed(true);\n return;\n }\n let cancelled = false;\n setSkillEntry(null);\n setFetchFailed(false);\n void fetchSkillMenu(getSkillsBaseUrl(local)).then((menu) => {\n if (cancelled) return;\n if (!menu) {\n setFetchFailed(true);\n return;\n }\n const match = Object.values(menu.categories)\n .flat()\n .find((s) => s.id === skillId);\n if (match) setSkillEntry(match);\n else setFetchFailed(true);\n });\n return () => {\n cancelled = true;\n };\n }, [skillId, local]);\n\n return { skillEntry, fetchFailed };\n}\n\ninterface SkillSourceInfoProps {\n skillId: string | null;\n skillEntry: SkillEntry | null;\n fetchFailed: boolean;\n}\n\nexport const SkillSourceInfo = ({\n skillId,\n skillEntry,\n fetchFailed,\n}: SkillSourceInfoProps) => (\n <Box flexDirection=\"column\">\n <Text>\n Skill:{' '}\n <Text italic color=\"cyan\">\n {skillId ?? 'unknown'}\n </Text>\n </Text>\n <Text>\n URL:{' '}\n <Text color=\"cyan\">\n {skillEntry?.downloadUrl ??\n (fetchFailed ? 'unavailable' : 'Loading...')}\n </Text>\n </Text>\n </Box>\n);\n","/**\n * PostHogIntegrationIntroScreen — Intro screen for the core PostHog integration.\n *\n * Composes IntroScreenLayout with framework-detection-specific state:\n * 1. Detecting: spinner while detection runs\n * 2. Detection failed: framework picker\n * 3. Unsupported version: upgrade prompt\n * 4. Detection succeeded: continue/change-framework/cancel\n */\n\nimport { Box, Text } from 'ink';\nimport { spawnSync } from 'node:child_process';\nimport type { ReactNode } from 'react';\nimport { useEffect, useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport {\n Integration,\n WIZARD_TOOLS_MENU_FLAG_KEY,\n} from '@lib/constants';\nimport { PickerMenu, LoadingBox } from '@ui/tui/primitives/index';\nimport { IntroScreenLayout, type DetectionRow } from './IntroScreenLayout.js';\nimport { SkillSourceInfo, useSkillEntry } from './SkillSourceInfo.js';\nimport { releaseTerminal } from '@ui/tui/start-tui';\nimport { analytics } from '@utils/analytics';\n\nconst TOOLS = [\n { label: 'Troubleshoot Integration', command: 'doctor' },\n] as const;\n\ntype View = 'default' | 'more-info' | 'tools';\n\nfunction launchTool(command: string, installDir: string): never {\n releaseTerminal();\n const result = spawnSync(\n process.execPath,\n [process.argv[1], command, `--install-dir=${installDir}`],\n { stdio: 'inherit' },\n );\n process.exit(result.status ?? 0);\n}\n\n/** Framework picker shown when auto-detection fails. */\nconst FrameworkPicker = ({\n store,\n onComplete,\n}: {\n store: WizardStore;\n onComplete?: () => void;\n}) => {\n const options = Object.values(Integration).map((value) => ({\n label: value,\n value,\n }));\n\n return (\n <PickerMenu<Integration>\n centered\n columns={2}\n message=\"Select your framework\"\n options={options}\n onSelect={(value) => {\n const integration = Array.isArray(value) ? value[0] : value;\n void import('@lib/registry').then(\n ({ FRAMEWORK_REGISTRY }) => {\n const config = FRAMEWORK_REGISTRY[integration];\n store.setFrameworkConfig(integration, config);\n store.setDetectedFramework(config.metadata.name);\n onComplete?.();\n },\n );\n }}\n />\n );\n};\n\ninterface PostHogIntegrationIntroScreenProps {\n store: WizardStore;\n}\n\nexport const PostHogIntegrationIntroScreen = ({\n store,\n}: PostHogIntegrationIntroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const [pickingFramework, setPickingFramework] = useState(false);\n const [manuallySelected, setManuallySelected] = useState(false);\n const [view, setView] = useState<View>('default');\n const [toolsEnabled, setToolsEnabled] = useState(false);\n\n useEffect(() => {\n let cancelled = false;\n void analytics.getAllFlagsForWizard().then((flags) => {\n const value = flags[WIZARD_TOOLS_MENU_FLAG_KEY];\n if (!cancelled && value && value !== 'false') setToolsEnabled(true);\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n const { session } = store;\n const config = session.frameworkConfig;\n const frameworkLabel =\n session.detectedFrameworkLabel ?? config?.metadata.name;\n const { skillEntry, fetchFailed } = useSkillEntry(\n session.skillId,\n session.localMcp,\n );\n const detecting = !session.detectionComplete;\n const needsFrameworkPick =\n session.detectionComplete && !session.frameworkConfig;\n const unsupported = session.unsupportedVersion;\n const showContinue =\n session.frameworkConfig !== null &&\n !detecting &&\n !pickingFramework &&\n view === 'default' &&\n !unsupported;\n\n // ── Title ──────────────────────────────────────────────────────────\n\n const title = detecting ? 'PostHog Wizard starting up' : 'PostHog Wizard 🦔';\n\n // ── Description ────────────────────────────────────────────────────\n\n let body: ReactNode = null;\n\n if (detecting) {\n body = (\n <Box marginY={1}>\n <LoadingBox message=\"Detecting project framework...\" />\n </Box>\n );\n } else if (needsFrameworkPick && !pickingFramework) {\n body = (\n <>\n <Box marginY={1}>\n <Text dimColor>Could not auto-detect your framework.</Text>\n </Box>\n <FrameworkPicker\n store={store}\n onComplete={() => setPickingFramework(false)}\n />\n </>\n );\n } else if (pickingFramework) {\n body = (\n <FrameworkPicker\n store={store}\n onComplete={() => setPickingFramework(false)}\n />\n );\n } else if (view === 'more-info') {\n body = (\n <Box flexDirection=\"column\" width={56} flexShrink={0}>\n <Text>\n The wizard is an agent that executes PostHog tasks. Its code is open\n source: <Text color=\"cyan\">https://github.com/PostHog/wizard</Text>\n </Text>\n <Box flexDirection=\"column\" marginTop={1}>\n <Text>\n The{' '}\n <Text italic color=\"cyan\">\n {session.programLabel}\n </Text>{' '}\n program installs the PostHog SDKs, instruments event tracking, and\n integrates the following dev tools for your application:\n </Text>\n </Box>\n <Box flexDirection=\"column\" marginTop={1} paddingLeft={4}>\n <Text>{`\\u2022`} Product Analytics</Text>\n <Text>{`\\u2022`} Web Analytics</Text>\n <Text>{`\\u2022`} Session Replay</Text>\n <Text>{`\\u2022`} Error Tracking</Text>\n </Box>\n <Box flexDirection=\"column\" marginTop={1}>\n <Text>If you prefer your own AI setup, download the skill:</Text>\n <Box marginTop={1}>\n <SkillSourceInfo\n skillId={session.skillId}\n skillEntry={skillEntry}\n fetchFailed={fetchFailed}\n />\n </Box>\n </Box>\n </Box>\n );\n } else if (showContinue) {\n body = (\n <>\n <Box>\n <Text>Let's do two hours of work in eight minutes.</Text>\n </Box>\n </>\n );\n }\n\n // ── Detection rows ─────────────────────────────────────────────────\n\n const detectionRows: DetectionRow[] = [];\n if (frameworkLabel) {\n const suffixParts: string[] = [];\n if (!manuallySelected) suffixParts.push('(detected)');\n if (config?.metadata.beta) suffixParts.push('[BETA]');\n\n detectionRows.push({\n label: 'Framework',\n value: frameworkLabel,\n suffix: suffixParts.join(' ') || undefined,\n });\n }\n\n // ── Children (between rows and menu) ───────────────────────────────\n\n let bodyChildren: ReactNode = null;\n\n if (config?.metadata.preRunNotice) {\n bodyChildren = <Text color=\"yellow\">{config.metadata.preRunNotice}</Text>;\n }\n\n if (unsupported) {\n bodyChildren = (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"#DC9300\">\n Version {unsupported.current} is not supported by the wizard. Please\n upgrade to {unsupported.minimum} or later.\n </Text>\n <Text dimColor>Manual setup guide: {unsupported.docsUrl}</Text>\n <Box marginTop={1}>\n <Text dimColor>\n Did we get this wrong? You can also select another framework.\n </Text>\n </Box>\n <PickerMenu\n options={[\n { label: 'Select another framework', value: 'framework' },\n { label: 'Exit', value: 'exit' },\n ]}\n onSelect={(value) => {\n const choice = Array.isArray(value) ? value[0] : value;\n if (choice === 'framework') {\n setPickingFramework(true);\n setManuallySelected(true);\n } else {\n process.exit(0);\n }\n }}\n />\n </Box>\n );\n }\n\n // ── Menu ───────────────────────────────────────────────────────────\n\n let menuOptions: { label: string; value: string }[] | null = null;\n\n if (view === 'tools') {\n menuOptions = [\n ...TOOLS.map((t) => ({ label: t.label, value: t.command })),\n { label: 'Back', value: 'back' },\n ];\n } else if (view === 'more-info') {\n menuOptions = [{ label: 'Back', value: 'back' }];\n } else if (showContinue) {\n menuOptions = [\n { label: 'Continue', value: 'continue' },\n { label: 'Change framework', value: 'framework' },\n ...(toolsEnabled ? [{ label: 'Tools', value: 'tools' }] : []),\n { label: 'More info', value: 'more-info' },\n { label: 'Cancel', value: 'cancel' },\n ];\n }\n\n const handleSelect = (value: string) => {\n if (view === 'tools') {\n if (value === 'back') setView('default');\n else launchTool(value, session.installDir);\n return;\n }\n if (value === 'cancel') {\n process.exit(0);\n } else if (value === 'framework') {\n setPickingFramework(true);\n setManuallySelected(true);\n } else if (value === 'more-info') {\n setView('more-info');\n } else if (value === 'tools') {\n setView('tools');\n } else if (value === 'back') {\n setView('default');\n } else {\n store.completeSetup();\n }\n };\n\n // ── Render ─────────────────────────────────────────────────────────\n\n return (\n <IntroScreenLayout\n installDir={session.installDir}\n title={title}\n showSubtitle={view === 'default'}\n body={body}\n showDetection={showContinue}\n detectionRows={detectionRows}\n menuOptions={unsupported ? null : menuOptions}\n onSelect={handleSelect}\n programLabel={session.programLabel}\n skillId={session.skillId}\n >\n {bodyChildren}\n </IntroScreenLayout>\n );\n};\n","/**\n * RevenueIntroScreen — Welcome screen for the revenue analytics flow.\n *\n * Composes IntroScreenLayout with SDK-detection-specific state:\n * - Detection succeeded: shows detected PostHog + Stripe SDKs, continue/cancel\n * - Detection failed: shows the error via errorView + exit prompt\n *\n * Reads `frameworkContext.detectError` and `frameworkContext.detectedPosthogSdks`\n * / `detectedStripeSdks` set by detectRevenuePrerequisites().\n */\n\nimport { Box, Text } from 'ink';\nimport { useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { PickerMenu } from '@ui/tui/primitives/index';\nimport { IntroScreenLayout, type DetectionRow } from './IntroScreenLayout.js';\nimport {\n POSTHOG_SDKS,\n STRIPE_SDKS,\n type RevenueDetectError,\n} from '@lib/programs/revenue-analytics/index';\n\ninterface RevenueIntroScreenProps {\n store: WizardStore;\n}\n\nexport const RevenueIntroScreen = ({ store }: RevenueIntroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const [showingMoreInfo, setShowingMoreInfo] = useState(false);\n\n const { session } = store;\n const detectError = session.frameworkContext.detectError as\n | RevenueDetectError\n | undefined;\n const detectedPosthogSdks =\n (session.frameworkContext.detectedPosthogSdks as string[] | undefined) ??\n [];\n const detectedStripeSdks =\n (session.frameworkContext.detectedStripeSdks as string[] | undefined) ?? [];\n const detectedPackagePaths =\n (session.frameworkContext.detectedPackagePaths as string[] | undefined) ??\n [];\n\n // ── Detection rows ─────────────────────────────────────────────────\n\n const detectionRows: DetectionRow[] = [];\n if (detectedPosthogSdks.length > 0) {\n detectionRows.push({\n label: 'PostHog SDK',\n value: detectedPosthogSdks.join(', '),\n });\n }\n if (detectedStripeSdks.length > 0) {\n detectionRows.push({\n label: 'Stripe SDK',\n value: detectedStripeSdks.join(', '),\n });\n }\n\n // ── Body ────────────────────────────────────────────────────────────\n\n const body = showingMoreInfo ? (\n <Box flexDirection=\"column\" width={56} flexShrink={0}>\n <Text>\n The wizard is an agent that executes PostHog tasks. Its code is open\n source: <Text color=\"cyan\">https://github.com/PostHog/wizard</Text>.\n </Text>\n <Box flexDirection=\"column\" marginTop={1}>\n <Text>\n The{' '}\n <Text italic color=\"cyan\">\n {session.programLabel}\n </Text>{' '}\n program links Stripe customers and purchases to PostHog product data\n and persons. It unlocks insights like:\n </Text>\n </Box>\n <Box flexDirection=\"column\" marginTop={1} paddingLeft={4}>\n <Text>{'\\u2022'} Revenue per user</Text>\n <Text>{'\\u2022'} Lifetime value</Text>\n <Text>{'\\u2022'} MRR / churn tracking</Text>\n </Box>\n </Box>\n ) : (\n <>\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text>Let's create revenue analytics with Stripe and PostHog.</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n <Text>Link purchases to product data.</Text>\n </Box>\n </Box>\n\n {detectedPackagePaths.length > 1 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor>Found in {detectedPackagePaths.length} packages:</Text>\n {detectedPackagePaths.map((p) => (\n <Text key={p} dimColor>\n {' '}\n {'\\u2022'} {p}\n </Text>\n ))}\n </Box>\n )}\n </>\n );\n\n // ── Error view ─────────────────────────────────────────────────────\n\n const errorView = detectError ? (\n <>\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color=\"red\" bold>\n {'\\u2718'} Cannot set up revenue analytics\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n <DetectErrorBody error={detectError} />\n </Box>\n </Box>\n\n <PickerMenu\n options={[{ label: 'Exit', value: 'exit' }]}\n onSelect={() => process.exit(1)}\n />\n </>\n ) : undefined;\n\n // ── Menu ───────────────────────────────────────────────────────────\n const menuOptions = showingMoreInfo\n ? [{ label: 'Back', value: 'back' }]\n : [\n { label: 'Continue', value: 'continue' },\n { label: 'More info', value: 'more-info' },\n { label: 'Cancel', value: 'cancel' },\n ];\n // ── Render ─────────────────────────────────────────────────────────\n\n return (\n <IntroScreenLayout\n installDir={session.installDir}\n showSubtitle={!showingMoreInfo}\n body={body}\n showDetection={!showingMoreInfo}\n detectionRows={detectionRows}\n errorView={errorView}\n programLabel={session.programLabel}\n skillId={session.skillId}\n menuOptions={menuOptions}\n onSelect={(value) => {\n if (value === 'cancel') {\n process.exit(0);\n } else if (value === 'more-info') {\n setShowingMoreInfo(true);\n } else if (value === 'back') {\n setShowingMoreInfo(false);\n } else {\n store.completeSetup();\n }\n }}\n />\n );\n};\n\nconst DetectErrorBody = ({ error }: { error: RevenueDetectError }) => {\n switch (error.kind) {\n case 'bad-directory': {\n const reasonText = {\n missing: 'does not exist',\n 'not-dir': 'is not a directory',\n unreadable: 'could not be accessed',\n }[error.reason];\n return (\n <>\n <Text>This path {reasonText}:</Text>\n <Text dimColor>\n {' '}\n {error.path}\n </Text>\n </>\n );\n }\n\n case 'no-package-json':\n return (\n <>\n <Text>No package.json found in this directory.</Text>\n <Text dimColor>\n Revenue analytics currently supports Node.js / TypeScript projects.\n </Text>\n <Text dimColor>Run this command from your project root.</Text>\n </>\n );\n\n case 'no-sdks':\n return (\n <>\n <Text>\n Neither PostHog nor Stripe SDKs detected (scanned{' '}\n {error.scannedCount} package.json file\n {error.scannedCount === 1 ? '' : 's'}).\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text>Revenue analytics requires:</Text>\n <Text dimColor>\n {' \\u2022'} A PostHog SDK ({POSTHOG_SDKS.slice(0, 3).join(', ')},\n …)\n </Text>\n <Text dimColor>\n {' \\u2022'} A Stripe SDK ({STRIPE_SDKS.join(', ')})\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text dimColor>\n Install Stripe and run <Text bold>npx @posthog/wizard</Text> to\n set up PostHog.\n </Text>\n </Box>\n </>\n );\n\n case 'missing-posthog':\n return (\n <>\n <Text>\n Found Stripe ({error.foundStripe.join(', ')}) but no PostHog SDK.\n </Text>\n <Box marginTop={1}>\n <Text dimColor>\n Run <Text bold>npx @posthog/wizard</Text> first to set up the base\n PostHog integration.\n </Text>\n </Box>\n </>\n );\n\n case 'missing-stripe':\n return (\n <>\n <Text>\n Found PostHog ({error.foundPosthog.join(', ')}) but no Stripe SDK.\n </Text>\n <Text dimColor>\n Revenue analytics currently supports Stripe only.\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>Install one of:</Text>\n {STRIPE_SDKS.map((sdk) => (\n <Text key={sdk} dimColor>\n {' \\u2022'} {sdk}\n </Text>\n ))}\n </Box>\n </>\n );\n }\n};\n","import { Box, Text } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { IntroScreenLayout } from './IntroScreenLayout.js';\n\ninterface MigrationIntroScreenProps {\n store: WizardStore;\n}\n\nexport const MigrationIntroScreen = ({ store }: MigrationIntroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const { session } = store;\n\n const body = (\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text>Let's migrate this project to PostHog.</Text>\n </Box>\n );\n\n return (\n <IntroScreenLayout\n installDir={session.installDir}\n body={body}\n programLabel={session.programLabel}\n skillId={session.skillId}\n menuOptions={[\n { label: 'Continue', value: 'continue' },\n { label: 'Cancel', value: 'cancel' },\n ]}\n onSelect={(value) => {\n if (value === 'cancel') {\n process.exit(0);\n } else {\n store.completeSetup();\n }\n }}\n />\n );\n};\n","/**\n * SourceMapsIntroScreen — Welcome screen for the source-maps upload flow.\n *\n * Reads detection results from frameworkContext (written by\n * detectSourceMapsPrerequisites). On success: shows the detected platform.\n * On failure: shows the structured error with an Exit prompt.\n */\n\nimport { Box, Text } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { PickerMenu } from '@ui/tui/primitives/index';\nimport { IntroScreenLayout, type DetectionRow } from './IntroScreenLayout.js';\nimport {\n SOURCE_MAPS_CONTEXT_KEYS,\n VARIANT_DISPLAY_NAME,\n type SkillVariant,\n type SourceMapsDetectError,\n} from '@lib/programs/error-tracking-upload-source-maps/index';\n\ninterface SourceMapsIntroScreenProps {\n store: WizardStore;\n}\n\nexport const SourceMapsIntroScreen = ({\n store,\n}: SourceMapsIntroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const { session } = store;\n const detectError = session.frameworkContext[\n SOURCE_MAPS_CONTEXT_KEYS.detectError\n ] as SourceMapsDetectError | undefined;\n const variant = session.frameworkContext[\n SOURCE_MAPS_CONTEXT_KEYS.skillVariant\n ] as SkillVariant | undefined;\n const displayName = session.frameworkContext[\n SOURCE_MAPS_CONTEXT_KEYS.displayName\n ] as string | undefined;\n const packagePaths =\n (session.frameworkContext[SOURCE_MAPS_CONTEXT_KEYS.packagePaths] as\n | string[]\n | undefined) ?? [];\n\n const detectionRows: DetectionRow[] = [];\n if (displayName) {\n detectionRows.push({ label: 'Platform', value: displayName });\n }\n if (variant) {\n detectionRows.push({\n label: 'Skill',\n value: `error-tracking-upload-source-maps-${variant}`,\n });\n }\n\n const body = (\n <>\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text>Upload source maps for accurate error stack traces.</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n <Text>The agent will wire it into your build.</Text>\n </Box>\n </Box>\n\n {packagePaths.length > 1 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor>Found {packagePaths.length} package.json files:</Text>\n {packagePaths.map((p) => (\n <Text key={p} dimColor>\n {' '}\n {'•'} {p}\n </Text>\n ))}\n </Box>\n )}\n </>\n );\n\n const errorView = detectError ? (\n <>\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color=\"red\" bold>\n {'✘'} Cannot set up source map upload\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n <DetectErrorBody error={detectError} />\n </Box>\n </Box>\n\n <PickerMenu\n options={[{ label: 'Exit', value: 'exit' }]}\n onSelect={() => process.exit(1)}\n />\n </>\n ) : undefined;\n\n const menuOptions = [\n { label: 'Continue', value: 'continue' },\n { label: 'Cancel', value: 'cancel' },\n ];\n\n return (\n <IntroScreenLayout\n installDir={session.installDir}\n body={body}\n showDetection={true}\n detectionRows={detectionRows}\n errorView={errorView}\n programLabel={session.programLabel}\n skillId={session.skillId}\n menuOptions={menuOptions}\n onSelect={(value) => {\n if (value === 'cancel') {\n process.exit(0);\n } else {\n store.completeSetup();\n }\n }}\n />\n );\n};\n\nconst SOURCE_MAP_DOCS =\n 'https://posthog.com/docs/error-tracking/upload-source-maps';\nconst ERROR_TRACKING_INSTALL_DOCS =\n 'https://posthog.com/docs/error-tracking/installation';\nconst WIZARD_ISSUES_URL = 'https://github.com/PostHog/wizard/issues';\n\n/**\n * Platforms PostHog Error Tracking supports with published source-map / symbol\n * upload docs, but that the wizard can't automate yet. The user (or their own\n * coding agent) can follow these docs to wire it up by hand. Anything not in\n * this map falls through to the generic \"not supported yet\" message — we don't\n * hardcode the full supported-platform list (it lives in the docs and changes\n * server-side), we just point there.\n */\nconst NATIVE_PLATFORM_DOCS: Record<string, { label: string; url: string }> = {\n ios: {\n label: 'iOS',\n url: 'https://posthog.com/docs/error-tracking/upload-source-maps/ios',\n },\n android: {\n label: 'Android',\n url: 'https://posthog.com/docs/error-tracking/upload-mappings/android',\n },\n 'react-native': {\n label: 'React Native',\n url: 'https://posthog.com/docs/error-tracking/upload-source-maps/react-native',\n },\n flutter: {\n label: 'Flutter',\n url: 'https://posthog.com/docs/error-tracking/upload-source-maps/flutter',\n },\n};\n\nconst DetectErrorBody = ({ error }: { error: SourceMapsDetectError }) => {\n switch (error.kind) {\n case 'bad-directory': {\n const reasonText = {\n missing: 'does not exist',\n 'not-dir': 'is not a directory',\n unreadable: 'could not be accessed',\n }[error.reason];\n return (\n <>\n <Text>This path {reasonText}:</Text>\n <Text dimColor>\n {' '}\n {error.path}\n </Text>\n </>\n );\n }\n\n case 'no-project-files':\n return (\n <>\n <Text>No recognizable project files were found.</Text>\n <Text dimColor>\n Source map upload needs a package.json, Xcode project, Gradle build,\n or Flutter pubspec.yaml.\n </Text>\n <Text dimColor>Run this command from your project root.</Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>How source map upload works:</Text>\n <Text dimColor>\n {' '}\n {SOURCE_MAP_DOCS}\n </Text>\n </Box>\n </>\n );\n\n case 'unsupported-platform': {\n const native = NATIVE_PLATFORM_DOCS[error.detected];\n\n // Native mobile: PostHog Error Tracking supports it and we have docs —\n // the wizard just can't automate source-map upload for it yet. Hand the\n // user a path forward rather than a dead end.\n if (native) {\n return (\n <>\n <Text>\n The wizard can't set up source map upload for {native.label} yet.\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>\n PostHog Error Tracking does support {native.label}. You can set\n it up yourself by following the docs below — or hand them to\n your own coding agent to do it for you:\n </Text>\n <Box marginTop={1}>\n <Text dimColor>{native.url}</Text>\n </Box>\n </Box>\n </>\n );\n }\n\n // Everything else (e.g. Rust): source map upload doesn't apply, and the\n // stack may not be supported by Error Tracking at all. Don't promise docs\n // that don't exist — point at the supported-platform list instead.\n return (\n <>\n <Text>Source map upload isn't supported for this stack yet.</Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>\n Check which platforms PostHog Error Tracking supports:\n </Text>\n <Box marginTop={1}>\n <Text dimColor>{ERROR_TRACKING_INSTALL_DOCS}</Text>\n </Box>\n <Box marginTop={1}>\n <Text dimColor>\n If yours isn't listed and you'd like it added, open an issue at{' '}\n {WIZARD_ISSUES_URL} with details about your build setup.\n </Text>\n </Box>\n </Box>\n </>\n );\n }\n\n case 'no-posthog-sdk': {\n const platformLabel =\n VARIANT_DISPLAY_NAME[error.platform] ?? error.platform;\n return (\n <>\n <Text>Detected {platformLabel} but no PostHog SDK is installed.</Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>\n Source map upload only resolves stack traces from errors the SDK\n reports. Run <Text bold>npx @posthog/wizard</Text> first to\n install the SDK, then run this command again.\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>\n Set up source map upload for {platformLabel}:\n </Text>\n <Text dimColor>\n {' '}\n {SOURCE_MAP_DOCS}\n </Text>\n </Box>\n </Box>\n </>\n );\n }\n }\n};\n","/**\n * SourceMapsOutroScreen — post-run summary for the source-maps upload flow.\n *\n * Unlike the generic OutroScreen, this spells out the operational facts a user\n * needs to actually get de-minified stack traces: that packages were installed\n * and upload credentials written to .env, plus the three gotchas (builds\n * upload, run the build, mirror the env vars in CI). All static guidance —\n * driven only by the program's `buildOutroData` (kind / message / report /\n * docs), no per-run data.\n */\n\nimport { join } from 'node:path';\nimport type { ReactNode } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { OutroKind } from '@lib/wizard-session';\nimport { Colors } from '@ui/tui/styles';\n\ninterface SourceMapsOutroScreenProps {\n store: WizardStore;\n}\n\nexport const SourceMapsOutroScreen = ({\n store,\n}: SourceMapsOutroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n useInput(() => {\n store.setOutroDismissed();\n });\n\n const outroData = store.session.outroData;\n\n if (!outroData) {\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text dimColor>Finishing up...</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n {outroData.kind === OutroKind.Success && (\n <Box flexDirection=\"column\">\n <Text color={Colors.success} bold>\n ✔ {outroData.message || 'Source maps wired up!'}\n </Text>\n\n <Section title=\"What the wizard did\">\n <Text>• Installed the packages needed for source map upload.</Text>\n <Text>\n • Wrote the PostHog upload credentials to your{' '}\n <Text bold>.env</Text> file.\n </Text>\n </Section>\n\n <Section title=\"How uploads work now\">\n <Text>\n • Every <Text bold>build</Text> now uploads source maps to PostHog\n automatically — no extra command to remember.\n </Text>\n <Text>\n • Run your app from the <Text bold>built output</Text>. Source\n maps only resolve for errors thrown by the build that was\n uploaded.\n </Text>\n <Text>\n • In <Text bold>CI</Text>, make sure the build job exposes the\n same env vars the wizard added to your <Text bold>.env</Text>.\n </Text>\n </Section>\n\n {outroData.reportFile && (\n <Box marginTop={1}>\n <Text>\n Details in{' '}\n <Text bold>\n {join(store.session.installDir, outroData.reportFile)}\n </Text>\n </Text>\n </Box>\n )}\n\n {outroData.docsUrl && (\n <Box marginTop={1}>\n <Text>\n Learn more:{' '}\n <Text color={Colors.primary}>{outroData.docsUrl}</Text>\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text dimColor>\n Note: This wizard uses an LLM agent to analyze and modify your\n project. Please review the changes made.\n </Text>\n </Box>\n <Text dimColor>\n How did this work for you? Drop us a line: wizard@posthog.com\n </Text>\n </Box>\n )}\n\n {outroData.kind === OutroKind.Error && (\n <Box flexDirection=\"column\">\n <Text color={Colors.error} bold>\n ✘ {outroData.message || 'An error occurred'}\n </Text>\n {outroData.body && (\n <Box marginTop={1}>\n <Text dimColor>{outroData.body}</Text>\n </Box>\n )}\n {outroData.docsUrl && (\n <Box marginTop={1}>\n <Text>\n Docs: <Text color={Colors.primary}>{outroData.docsUrl}</Text>\n </Text>\n </Box>\n )}\n </Box>\n )}\n\n {outroData.kind === OutroKind.Cancel && (\n <Text color=\"yellow\">■ {outroData.message || 'Cancelled'}</Text>\n )}\n\n <Box marginTop={1}>\n <Text color={Colors.muted}>Press any key to continue</Text>\n </Box>\n </Box>\n );\n};\n\nconst Section = ({\n title,\n children,\n}: {\n title: string;\n children: ReactNode;\n}) => (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={Colors.primary} bold>\n {title}:\n </Text>\n {children}\n </Box>\n);\n","/**\n * AgentSkillIntroScreen — Default intro for generic agent-skill programs.\n *\n * Programs that need a different intro ship their own screen component\n * (see audit/AuditIntroScreen.tsx).\n */\n\nimport { Box, Text } from 'ink';\nimport type { ReactNode } from 'react';\nimport { useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { IntroScreenLayout } from './IntroScreenLayout.js';\nimport { SkillSourceInfo, useSkillEntry } from './SkillSourceInfo.js';\n\ninterface AgentSkillIntroScreenProps {\n store: WizardStore;\n}\n\nexport const AgentSkillIntroScreen = ({\n store,\n}: AgentSkillIntroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const [showingMoreInfo, setShowingMoreInfo] = useState(false);\n\n const { session } = store;\n const skillId = session.skillId ?? 'unknown';\n const { skillEntry, fetchFailed } = useSkillEntry(skillId, session.localMcp);\n\n let body: ReactNode;\n\n if (showingMoreInfo) {\n body = (\n <Box flexDirection=\"column\" width={56} flexShrink={0}>\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text>\n The wizard is an agent that executes PostHog tasks. Its code is open\n source: <Text color=\"cyan\">https://github.com/PostHog/wizard</Text>\n </Text>\n </Box>\n <SkillSourceInfo\n skillId={skillId}\n skillEntry={skillEntry}\n fetchFailed={fetchFailed}\n />\n <Box marginTop={1}>\n <Text dimColor>\n {skillEntry?.name ?? (fetchFailed ? skillId : 'Loading...')}\n </Text>\n </Box>\n </Box>\n );\n } else {\n body = (\n <Text>\n Let's run the{' '}\n <Text italic color=\"cyan\">\n {skillId}\n </Text>{' '}\n skill.\n </Text>\n );\n }\n\n const menuOptions = showingMoreInfo\n ? [{ label: 'Back', value: 'back' }]\n : [\n { label: 'Continue', value: 'continue' },\n { label: 'More info', value: 'more-info' },\n { label: 'Cancel', value: 'cancel' },\n ];\n\n const handleSelect = (value: string) => {\n if (value === 'cancel') process.exit(0);\n else if (value === 'more-info') setShowingMoreInfo(true);\n else if (value === 'back') setShowingMoreInfo(false);\n else store.completeSetup();\n };\n\n return (\n <IntroScreenLayout\n installDir={session.installDir}\n showSubtitle={!showingMoreInfo}\n body={body}\n showDetection={!showingMoreInfo}\n programLabel={session.programLabel}\n skillId={session.skillId}\n menuOptions={menuOptions}\n onSelect={handleSelect}\n />\n );\n};\n","import { Box, Text } from 'ink';\nimport { useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { IntroScreenLayout } from '@ui/tui/screens/IntroScreenLayout';\nimport { SkillSourceInfo, useSkillEntry } from '@ui/tui/screens/SkillSourceInfo';\n\ninterface AuditIntroScreenProps {\n store: WizardStore;\n}\n\nexport const AuditIntroScreen = ({ store }: AuditIntroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const [showingMoreInfo, setShowingMoreInfo] = useState(false);\n const { session } = store;\n // bin.ts seeds session.skillId from ProgramConfig.skillId before render,\n // so audit and events-audit pick up their respective skill metadata here.\n const skillId = session.skillId ?? 'audit';\n const { skillEntry, fetchFailed } = useSkillEntry(skillId, session.localMcp);\n\n const body = showingMoreInfo ? (\n <Box flexDirection=\"column\" width={56}>\n <Box marginBottom={1}>\n <Text>\n The wizard is an agent that executes PostHog tasks. Its code is open\n source: <Text color=\"cyan\">https://github.com/PostHog/wizard</Text>\n </Text>\n </Box>\n\n <Text>\n The{' '}\n <Text color=\"cyan\" italic>\n {skillId}\n </Text>{' '}\n program reviews your project's PostHog integration against best\n practices to help you capture high-quality events and writes a report\n for suggested actions. Nothing in your project will be modified.\n </Text>\n <Box marginTop={1}>\n <SkillSourceInfo\n skillId={skillId}\n skillEntry={skillEntry}\n fetchFailed={fetchFailed}\n />\n </Box>\n </Box>\n ) : (\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text>Let's review your existing PostHog setup for best practices.</Text>\n </Box>\n );\n\n const menuOptions = showingMoreInfo\n ? [{ label: 'Back', value: 'back' }]\n : [\n { label: 'Continue', value: 'continue' },\n { label: 'More info', value: 'more-info' },\n { label: 'Cancel', value: 'cancel' },\n ];\n\n const handleSelect = (value: string) => {\n if (value === 'cancel') process.exit(0);\n else if (value === 'more-info') setShowingMoreInfo(true);\n else if (value === 'back') setShowingMoreInfo(false);\n else store.completeSetup();\n };\n\n return (\n <IntroScreenLayout\n installDir={session.installDir}\n body={body}\n showDetection={!showingMoreInfo}\n programLabel={session.programLabel}\n skillId={session.skillId}\n menuOptions={menuOptions}\n onSelect={handleSelect}\n />\n );\n};\n","/**\n * File watcher (UI concern).\n *\n * `fs.watch` alone is unreliable for atomic-rename writes (which is how Claude\n * rewrites JSON files), so the watcher pairs `fs.watch` with a continuous\n * mtime-polled re-read. The poll catches missed events; the watch keeps\n * latency low when it does fire. We dedupe with `mtimeMs` so steady-state\n * polls cost a single `stat`.\n *\n * Screens that need to mirror an agent-emitted JSON file into the store call\n * `useFileWatcher(absolutePath, onUpdate)`; the watcher starts on mount and\n * tears down on unmount.\n */\n\nimport * as fs from 'fs';\nimport { useEffect } from 'react';\n\nconst DEFAULT_POLL_INTERVAL_MS = 5000;\nconst DEFAULT_ATTACH_RETRY_INTERVAL_MS = 1000;\n\nexport interface FileWatcherHandle {\n stop(): void;\n}\n\nexport interface FileWatcherOptions {\n /** ms between mtime checks once the file exists. */\n pollIntervalMs?: number;\n /** ms between attach attempts while waiting for the file to appear. */\n attachRetryIntervalMs?: number;\n}\n\n/** Watch `path` for JSON updates and call `onUpdate(parsed)` whenever the\n * file's mtime changes and the contents are valid JSON. Caller must invoke\n * `handle.stop()` to release the watcher. */\nexport function startFileWatcher(\n path: string,\n onUpdate: (parsed: unknown) => void,\n options: FileWatcherOptions = {},\n): FileWatcherHandle {\n const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const attachRetryIntervalMs =\n options.attachRetryIntervalMs ?? DEFAULT_ATTACH_RETRY_INTERVAL_MS;\n\n const watchers: fs.FSWatcher[] = [];\n const intervals: Array<ReturnType<typeof setInterval>> = [];\n let lastMtimeMs = 0;\n\n const read = (force = false) => {\n try {\n const stat = fs.statSync(path);\n if (!force && stat.mtimeMs === lastMtimeMs) return;\n lastMtimeMs = stat.mtimeMs;\n const parsed: unknown = JSON.parse(fs.readFileSync(path, 'utf-8'));\n onUpdate(parsed);\n } catch {\n // File missing or not yet valid JSON.\n }\n };\n\n intervals.push(setInterval(() => read(), pollIntervalMs));\n\n try {\n watchers.push(fs.watch(path, () => read(true)));\n read(true);\n } catch {\n // File doesn't exist yet — retry attaching the watch periodically until\n // it appears. The poll above already covers updates; this just upgrades\n // latency once the file shows up.\n const attachInterval = setInterval(() => {\n try {\n fs.accessSync(path);\n clearInterval(attachInterval);\n const idx = intervals.indexOf(attachInterval);\n if (idx >= 0) intervals.splice(idx, 1);\n watchers.push(fs.watch(path, () => read(true)));\n } catch {\n // Still waiting.\n }\n }, attachRetryIntervalMs);\n intervals.push(attachInterval);\n }\n\n return {\n stop() {\n for (const w of watchers) w.close();\n for (const i of intervals) clearInterval(i);\n },\n };\n}\n\n/** React hook wrapping `startFileWatcher`. Starts on mount, stops on unmount\n * or when `path` changes. `onUpdate` and `options` are captured at mount\n * time — change `path` to restart with a new callback. */\nexport function useFileWatcher(\n path: string,\n onUpdate: (parsed: unknown) => void,\n options: FileWatcherOptions = {},\n): void {\n useEffect(() => {\n const handle = startFileWatcher(path, onUpdate, options);\n return () => handle.stop();\n // `onUpdate` and `options` are intentionally omitted from deps — the\n // watcher captures them at mount time and the path drives restarts.\n }, [path]);\n}\n","/**\n * AuditAreaPane — left-pane slide that follows whatever area the agent is\n * currently checking, plus a wrap-up state once every check is resolved\n * and the agent has moved on to writing the report.\n *\n * Three states, gated top-down on the ledger:\n * 1. firstPending defined → render the slide for that area\n * 2. checks empty → blank (the seed hook fires before\n * this screen mounts in practice;\n * this is just defensive)\n * 3. all checks non-pending → \"writing report\" wrap-up\n *\n * Pressing `O` opens the active slide's docs URL.\n */\n\nimport { Fragment } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { spawn } from 'node:child_process';\nimport { Colors } from '@ui/tui/styles';\nimport { type AuditCheck } from '@lib/programs/audit/types';\nimport { AUDIT_AREA_SLIDES, type AreaSlide } from './slides/index.js';\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\nconst FINDING_STATUSES: AuditCheck['status'][] = [\n 'error',\n 'warning',\n 'suggestion',\n];\n\nconst isFinding = (c: AuditCheck) => FINDING_STATUSES.includes(c.status);\n\nconst fallbackSlide = (area: string): AreaSlide => ({\n area,\n intro: [`Verifying ${area.toLowerCase()}…`],\n docsUrl: '',\n});\n\nconst openLink = (url: string) => {\n const cmd =\n process.platform === 'darwin'\n ? 'open'\n : process.platform === 'win32'\n ? 'cmd'\n : 'xdg-open';\n const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];\n spawn(cmd, args, { detached: true, stdio: 'ignore' }).unref();\n};\n\n// ── Component ────────────────────────────────────────────────────────\n\ninterface AuditAreaPaneProps {\n checks: AuditCheck[];\n reportPath: string;\n /** Slide registry to look the active area up in. Defaults to the doctor\n * (`audit` program) slides; events-audit passes its own 6-phase set. */\n slides?: AreaSlide[];\n /** Dashboard URL once the agent emits `[DASHBOARD_URL]`. Shown as a sticky\n * footer so the user can grab the link while later phases still run. */\n dashboardUrl?: string | null;\n /** Notebook URL once the agent emits `[NOTEBOOK_URL]`. Same sticky-footer\n * treatment as the dashboard URL. */\n notebookUrl?: string | null;\n}\n\nexport const AuditAreaPane = ({\n checks,\n reportPath,\n slides = AUDIT_AREA_SLIDES,\n dashboardUrl,\n notebookUrl,\n}: AuditAreaPaneProps) => {\n const pendingChecks = checks.filter((c) => c.status === 'pending');\n const activeArea = pendingChecks[0]?.area;\n const slide = activeArea\n ? slides.find((s) => s.area === activeArea) ?? fallbackSlide(activeArea)\n : null;\n\n useInput((input) => {\n if (input.toLowerCase() === 'o' && slide?.docsUrl) {\n openLink(slide.docsUrl);\n }\n });\n\n const urlsFooter =\n dashboardUrl || notebookUrl ? (\n <UrlsFooter dashboardUrl={dashboardUrl} notebookUrl={notebookUrl} />\n ) : null;\n\n // Active area — agent is still resolving checks for this slide's area.\n if (slide) {\n const hasFindings = checks.some(isFinding);\n return (\n <Box flexDirection=\"column\">\n <ActiveSlide slide={slide} hasFindings={hasFindings} />\n {urlsFooter}\n </Box>\n );\n }\n\n // Ledger empty — the seed hook fires synchronously at intro `onReady`,\n // so this only happens if the seed file write failed. Render nothing\n // rather than misleading the user with a \"wrapped up\" message.\n if (checks.length === 0) {\n return null;\n }\n\n // Every check is resolved and the agent is composing the report.\n return (\n <Box flexDirection=\"column\">\n <WritingReport reportPath={reportPath} />\n {urlsFooter}\n </Box>\n );\n};\n\n// ── States ───────────────────────────────────────────────────────────\n\nconst ActiveSlide = ({\n slide,\n hasFindings,\n}: {\n slide: AreaSlide;\n hasFindings: boolean;\n}) => (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold color={Colors.accent}>\n Verifying {slide.area.toLowerCase()}\n </Text>\n <Box height={1} />\n\n {slide.visual}\n {slide.intro.map((paragraph, i) => (\n <Fragment key={i}>\n {i > 0 && <Box height={1} />}\n <Text>{paragraph}</Text>\n </Fragment>\n ))}\n\n <Box marginTop={1}>\n <Text dimColor>\n {slide.docsUrl && (\n <>\n [<Text color={Colors.accent}>O</Text>] Learn more\n </>\n )}\n {hasFindings && (\n <>\n {slide.docsUrl && ' '}[<Text color={Colors.accent}>→</Text>] View\n issues\n </>\n )}\n </Text>\n </Box>\n </Box>\n);\n\nconst UrlsFooter = ({\n dashboardUrl,\n notebookUrl,\n}: {\n dashboardUrl?: string | null;\n notebookUrl?: string | null;\n}) => (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text dimColor>{'─'.repeat(40)}</Text>\n {dashboardUrl && (\n <Text>\n Dashboard: <Text color=\"cyan\">{dashboardUrl}</Text>\n </Text>\n )}\n {notebookUrl && (\n <Text>\n Notebook: <Text color=\"cyan\">{notebookUrl}</Text>\n </Text>\n )}\n </Box>\n);\n\nconst WritingReport = ({ reportPath }: { reportPath: string }) => (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold color={Colors.accent}>\n We've wrapped up the review.\n </Text>\n <Box height={1} />\n <Text>\n To help you get the most out of your PostHog integration, we're preparing\n a report for you at <Text color=\"cyan\">{reportPath}</Text>.\n </Text>\n <Box height={1} />\n <Text>\n We'll cover what we checked and suggest where we can improve the existing\n integration.\n </Text>\n <Box height={1} />\n <Text dimColor>Hang tight!</Text>\n </Box>\n);\n","import { Text } from 'ink';\nimport { VisualBox, type AreaSlide } from '../shared.js';\n\nconst DetectVisual = () => (\n <VisualBox>\n <Text dimColor>package.json</Text>\n <Text>\n <Text dimColor>{' └─ '}</Text>\n <Text color=\"green\">posthog-js</Text>\n <Text dimColor>{' ^1.200.0'}</Text>\n </Text>\n <Text dimColor>requirements.txt</Text>\n <Text>\n <Text dimColor>{' └─ '}</Text>\n <Text color=\"green\">posthog</Text>\n <Text dimColor>{' ==4.0.1'}</Text>\n </Text>\n </VisualBox>\n);\n\nexport const DetectSdkSlide: AreaSlide = {\n area: 'Detect SDK',\n intro: [\n 'First we find which PostHog SDKs your project uses. The audit needs to know the right languages and frameworks before it looks at any code.',\n 'Only dependency manifests get read here: package.json, requirements.txt, go.mod, and similar files. Source files come in a later step.',\n 'If your project is a monorepo with more than one SDK, we handle each one.',\n ],\n visual: <DetectVisual />,\n docsUrl: 'https://posthog.com/docs/libraries',\n};\n","import { Text } from 'ink';\nimport { VisualBox, type AreaSlide } from '../shared.js';\n\nconst ScanVisual = () => (\n <VisualBox>\n <Text dimColor>grep -rn 'posthog\\.(capture|identify|group)'</Text>\n <Text>\n <Text color=\"cyan\">src/checkout/Checkout.tsx:88</Text>\n <Text dimColor>{' posthog.capture(...)'}</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">src/auth/login.ts:42</Text>\n <Text dimColor>{' posthog.identify(...)'}</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">src/onboarding/step.tsx:17</Text>\n <Text dimColor>{' posthog.capture(...)'}</Text>\n </Text>\n </VisualBox>\n);\n\nexport const ScanSitesSlide: AreaSlide = {\n area: 'Scan capture sites',\n intro: [\n 'Next we map every place your code captures PostHog events. This is the inventory the rest of the audit builds on.',\n 'We search your project for PostHog SDK calls: capture, identify, group, and more. No source files are opened yet, that comes in the next step.',\n \"Test files are excluded so they don't pollute the inventory.\",\n ],\n visual: <ScanVisual />,\n docsUrl: 'https://posthog.com/docs/product-analytics/capture-events',\n};\n","import { Text } from 'ink';\nimport { VisualBox, type AreaSlide } from '../shared.js';\n\nconst EnrichVisual = () => (\n <VisualBox>\n <Text dimColor>orchestrator</Text>\n <Text dimColor>{' │'}</Text>\n <Text>\n <Text dimColor>{' ├─ '}</Text>\n <Text color=\"cyan\">subagent 1</Text>\n <Text dimColor>{' → part-1.json'}</Text>\n </Text>\n <Text>\n <Text dimColor>{' ├─ '}</Text>\n <Text color=\"cyan\">subagent 2</Text>\n <Text dimColor>{' → part-2.json'}</Text>\n </Text>\n <Text>\n <Text dimColor>{' └─ '}</Text>\n <Text color=\"cyan\">subagent N</Text>\n <Text dimColor>{' → part-N.json'}</Text>\n </Text>\n </VisualBox>\n);\n\nexport const EnrichSitesSlide: AreaSlide = {\n area: 'Enrich',\n intro: [\n 'Now we look inside each file that captures events. The goal is to know not just that an event fires, but what it is, where it lives, and what data goes with it.',\n 'For every capture site we pull out the event name, the properties, the area of your codebase it sits in, and the surrounding function or component.',\n 'This is the only step that opens source files. Large codebases run in parallel so it finishes in one pass.',\n ],\n visual: <EnrichVisual />,\n docsUrl: 'https://posthog.com/docs/product-analytics/best-practices',\n};\n","import { Text } from 'ink';\nimport { VisualBox, type AreaSlide } from '../shared.js';\n\nconst QueryVisual = () => (\n <VisualBox>\n <Text dimColor>{'SELECT event, count() AS volume_30d'}</Text>\n <Text dimColor>\n {'FROM events WHERE timestamp > now() - INTERVAL 30 DAY'}\n </Text>\n <Text dimColor>{'GROUP BY event ORDER BY volume_30d DESC'}</Text>\n <Text> </Text>\n <Text>\n <Text color=\"cyan\">{'pageview '}</Text>\n <Text color=\"green\">{'12,430'}</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">{'signup_completed '}</Text>\n <Text color=\"green\">{' 840'}</Text>\n </Text>\n </VisualBox>\n);\n\nexport const QueryVolumeSlide: AreaSlide = {\n area: 'Query PostHog',\n intro: [\n 'We ask PostHog how often each event in the inventory has fired in the last 30 days.',\n \"Events your code captures but PostHog has never seen are flagged as phantoms. Phantoms usually mean a typo, a dead code path, or instrumentation that hasn't shipped yet. Worth cleaning up.\",\n \"If PostHog isn't reachable the audit still finishes. The report just notes where volume numbers would have gone.\",\n ],\n visual: <QueryVisual />,\n docsUrl: 'https://posthog.com/docs/product-analytics/sql',\n};\n","import { Text } from 'ink';\nimport { VisualBox, type AreaSlide } from '../shared.js';\n\nconst ReportVisual = () => (\n <VisualBox>\n <Text dimColor>posthog-events-audit-report.md</Text>\n <Text>\n <Text dimColor>{' # '}</Text>\n <Text>Identity & segmentation</Text>\n </Text>\n <Text>\n <Text dimColor>{' # '}</Text>\n <Text>Coverage map</Text>\n </Text>\n <Text>\n <Text dimColor>{' # '}</Text>\n <Text>Data quality</Text>\n </Text>\n <Text>\n <Text dimColor>{' # '}</Text>\n <Text>Events by file & area</Text>\n </Text>\n </VisualBox>\n);\n\nexport const WriteReportSlide: AreaSlide = {\n area: 'Write report',\n intro: [\n 'We package everything we found into one report at ./posthog-events-audit-report.md. This is what you hand to the team.',\n 'The report covers how users get identified, which parts of your codebase capture which events, data quality issues like duplicates and phantoms, and a volume map of every event your code captures.',\n 'Nothing in your project is modified. The report is the only file you keep.',\n ],\n visual: <ReportVisual />,\n docsUrl: 'https://posthog.com/docs/product-analytics/best-practices',\n};\n","import { Text } from 'ink';\nimport { VisualBox, type AreaSlide } from '../shared.js';\n\nconst DashboardVisual = () => (\n <VisualBox>\n <Text dimColor>events audit dashboard</Text>\n <Text>\n <Text color=\"cyan\">{'pageview '}</Text>\n <Text color=\"green\">{'████████████'}</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">{'signup '}</Text>\n <Text color=\"green\">{'████████'}</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">{'activated '}</Text>\n <Text color=\"green\">{'█████'}</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">{'purchased '}</Text>\n <Text color=\"green\">{'██'}</Text>\n </Text>\n </VisualBox>\n);\n\nexport const CreateDashboardSlide: AreaSlide = {\n area: 'Create dashboard',\n intro: [\n 'Finally we build a live PostHog dashboard for the events your code captures. Use it to watch volume over time, spot new phantoms, and see how traffic shifts as you ship changes.',\n 'Open the dashboard from the wrap-up screen when the audit completes.',\n ],\n visual: <DashboardVisual />,\n docsUrl: 'https://posthog.com/docs/product-analytics/dashboards',\n};\n","import { Text } from 'ink';\nimport { VisualBox, type AreaSlide } from '../shared.js';\n\nconst NotebookVisual = () => (\n <VisualBox>\n <Text dimColor>posthog-events-audit-report.md</Text>\n <Text dimColor>{' │'}</Text>\n <Text>\n <Text dimColor>{' ▼ '}</Text>\n <Text color=\"cyan\">PostHog notebook</Text>\n </Text>\n <Text dimColor>{' # Identity & segmentation'}</Text>\n <Text dimColor>{' # Coverage map'}</Text>\n <Text dimColor>{' # Events by file & area'}</Text>\n </VisualBox>\n);\n\nexport const UploadNotebookSlide: AreaSlide = {\n area: 'Upload notebook',\n intro: [\n 'Next we upload the report into a PostHog notebook so you can share it with your team as a URL.',\n 'Hang tight.',\n 'The markdown file on disk is still there for you to read locally.',\n ],\n visual: <NotebookVisual />,\n docsUrl: 'https://posthog.com/docs/notebooks',\n};\n","/**\n * Slide registry for the events-audit program. Each entry is keyed by\n * `AuditCheck.area` and corresponds to one phase of the 6-phase pipeline.\n *\n * `AuditAreaPane` looks up the active phase's slide here when the active\n * program is events-audit.\n */\n\nimport type { AreaSlide } from '../shared.js';\nimport { DetectSdkSlide } from './detectSdk.js';\nimport { ScanSitesSlide } from './scanSites.js';\nimport { EnrichSitesSlide } from './enrichSites.js';\nimport { QueryVolumeSlide } from './queryVolume.js';\nimport { WriteReportSlide } from './writeReport.js';\nimport { CreateDashboardSlide } from './createDashboard.js';\nimport { UploadNotebookSlide } from './uploadNotebook.js';\n\nexport const EVENTS_AUDIT_AREA_SLIDES: AreaSlide[] = [\n DetectSdkSlide,\n ScanSitesSlide,\n EnrichSitesSlide,\n QueryVolumeSlide,\n WriteReportSlide,\n CreateDashboardSlide,\n UploadNotebookSlide,\n];\n","import { Box, Text } from 'ink';\nimport { Spinner } from '@inkjs/ui';\nimport {\n AUDIT_SEVERITY_STYLE,\n type AuditCheck,\n} from '@lib/programs/audit/types';\nimport { Colors, Icons } from '@ui/tui/styles';\nimport { LoadingBox } from '@ui/tui/primitives/index';\nimport { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions';\n\ninterface PendingChecksListProps {\n checks: AuditCheck[];\n}\n\ninterface Group {\n area: string;\n checks: AuditCheck[];\n}\n\nfunction groupByArea(checks: AuditCheck[]): Group[] {\n const order: string[] = [];\n const map = new Map<string, AuditCheck[]>();\n for (const c of checks) {\n if (!map.has(c.area)) {\n map.set(c.area, []);\n order.push(c.area);\n }\n map.get(c.area)!.push(c);\n }\n return order.map((area) => ({ area, checks: map.get(area)! }));\n}\n\nfunction groupIcon(group: Group): { icon: string; color: string } {\n const total = group.checks.length;\n const complete = group.checks.filter((c) => c.status !== 'pending').length;\n if (complete === 0) return { icon: Icons.squareOpen, color: Colors.muted };\n if (complete === total)\n return { icon: Icons.squareFilled, color: Colors.success };\n return { icon: Icons.triangleRight, color: Colors.primary };\n}\n\nconst GroupHeader = ({\n group,\n showIcon,\n isActive,\n}: {\n group: Group;\n showIcon: boolean;\n isActive: boolean;\n}) => {\n const complete = group.checks.filter((c) => c.status !== 'pending').length;\n const total = group.checks.length;\n const { icon, color } = groupIcon(group);\n return (\n <Box>\n {isActive ? (\n <Box marginRight={1}>\n <Spinner />\n </Box>\n ) : showIcon ? (\n <Text>\n <Text color={color}>{icon}</Text>{' '}\n </Text>\n ) : null}\n <Text>\n <Text bold>{group.area}</Text>{' '}\n <Text dimColor>\n ({complete}/{total})\n </Text>\n </Text>\n </Box>\n );\n};\n\nconst CheckRow = ({ check }: { check: AuditCheck }) => {\n const { glyph, color } = AUDIT_SEVERITY_STYLE[check.status];\n return (\n <Text>\n <Text color={color}>{glyph}</Text>\n <Text dimColor={check.status === 'pending'}> {check.label}</Text>\n </Text>\n );\n};\n\nconst COLLAPSE_BELOW_ROWS = 24;\n\nexport const PendingChecksList = ({ checks }: PendingChecksListProps) => {\n const [, termRows] = useStdoutDimensions();\n\n if (checks.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>Checks</Text>\n <Text> </Text>\n <LoadingBox message=\"Seeding audit checklist...\" />\n </Box>\n );\n }\n\n const groups = groupByArea(checks);\n const activeIndex = groups.findIndex((g) =>\n g.checks.some((c) => c.status === 'pending'),\n );\n const collapsed = termRows < COLLAPSE_BELOW_ROWS;\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>Checks</Text>\n <Text> </Text>\n {collapsed\n ? groups.map((group, i) => (\n <GroupHeader\n key={group.area}\n group={group}\n showIcon\n isActive={i === activeIndex}\n />\n ))\n : groups.map((group, i) => (\n <Box\n key={group.area}\n flexDirection=\"column\"\n marginTop={i === 0 ? 0 : 1}\n >\n <GroupHeader\n group={group}\n showIcon={false}\n isActive={i === activeIndex}\n />\n {group.checks.map((c) => (\n <CheckRow key={c.id} check={c} />\n ))}\n </Box>\n ))}\n </Box>\n );\n};\n","import { useSyncExternalStore } from 'react';\nimport { join } from 'node:path';\nimport { Box } from 'ink';\nimport type { WizardStore } from '@ui/tui/store';\nimport {\n TabContainer,\n SplitView,\n LogViewer,\n HNViewer,\n} from '@ui/tui/primitives/index';\nimport { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions';\nimport { useFileWatcher } from '@ui/tui/hooks/file-watcher';\nimport { AuditChecksViewer } from './AuditChecksViewer/AuditChecksViewer.js';\nimport { AuditAreaPane } from './AuditAreaPane.js';\nimport { AUDIT_AREA_SLIDES } from './slides/index.js';\nimport { EVENTS_AUDIT_AREA_SLIDES } from './slides/events-audit/index.js';\nimport { PendingChecksList } from './PendingChecksList.js';\nimport {\n AUDIT_CHECKS_FILE,\n AUDIT_CHECKS_KEY,\n AUDIT_REPORT_FILE,\n coerceAuditChecks,\n getAuditChecks,\n} from '@lib/programs/audit/types';\nimport { getProgramConfig } from '@lib/programs/program-registry';\nimport { WIZARD_LOG_FILE } from '@utils/paths';\n\ninterface AuditRunScreenProps {\n store: WizardStore;\n}\n\nexport const AuditRunScreen = ({ store }: AuditRunScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n // Mirror the agent's audit ledger into the store.\n useFileWatcher(join(store.session.installDir, AUDIT_CHECKS_FILE), (parsed) =>\n store.setFrameworkContext(AUDIT_CHECKS_KEY, coerceAuditChecks(parsed)),\n );\n\n const statuses =\n store.statusMessages.length > 0 ? store.statusMessages : undefined;\n\n const [columns] = useStdoutDimensions();\n const checks = getAuditChecks(store.session);\n const reportFile =\n getProgramConfig(store.router.activeProgram).reportFile ??\n AUDIT_REPORT_FILE;\n const reportPath = `./${reportFile}`;\n const pendingChecksList = <PendingChecksList checks={checks} />;\n const slides =\n store.session.skillId === 'events-audit'\n ? EVENTS_AUDIT_AREA_SLIDES\n : AUDIT_AREA_SLIDES;\n const areaPane = (\n <AuditAreaPane\n checks={checks}\n reportPath={reportPath}\n slides={slides}\n dashboardUrl={store.session.dashboardUrl}\n notebookUrl={store.session.notebookUrl}\n />\n );\n\n // Narrow terminals: drop the area pane.\n const statusComponent =\n columns < 80 ? (\n <Box flexDirection=\"column\" flexGrow={1}>\n {pendingChecksList}\n </Box>\n ) : (\n <SplitView left={areaPane} right={pendingChecksList} />\n );\n\n const tabs = [\n { id: 'status', label: 'Status', component: statusComponent },\n {\n id: 'audit-checks',\n label: 'Audit plan',\n component: <AuditChecksViewer checks={checks} />,\n },\n {\n id: 'logs',\n label: 'Tail logs',\n component: <LogViewer filePath={WIZARD_LOG_FILE} />,\n },\n { id: 'hn', label: 'HN', component: <HNViewer /> },\n ];\n\n return (\n <TabContainer\n tabs={tabs}\n statusMessage={statuses}\n expandableStatus\n store={store}\n />\n );\n};\n","import { Box, Text } from 'ink';\nimport {\n AUDIT_SEVERITY_STYLE,\n type AuditCheck,\n} from '@lib/programs/audit/types';\nimport { relativeToInstallDir } from '@utils/paths';\n\ninterface AuditChecksOutroSectionProps {\n checks: AuditCheck[];\n installDir: string;\n}\n\nconst MAX_VISIBLE = 6;\n\nexport const AuditChecksOutroSection = ({\n checks,\n installDir,\n}: AuditChecksOutroSectionProps) => {\n if (checks.length === 0) return null;\n\n const errors = checks.filter((c) => c.status === 'error');\n const warnings = checks.filter((c) => c.status === 'warning');\n const suggestions = checks.filter((c) => c.status === 'suggestion');\n const problematic = [...errors, ...warnings, ...suggestions];\n\n const visible = problematic.slice(0, MAX_VISIBLE);\n const hidden = problematic.length - visible.length;\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"cyan\" bold>\n Items audited:\n </Text>\n <Text dimColor>\n {checks.length} checks · {errors.length} errors · {warnings.length}{' '}\n warnings · {suggestions.length} suggestions\n </Text>\n {problematic.length === 0 ? (\n <Text color=\"green\">{'•'} No issues found.</Text>\n ) : (\n <>\n {visible.map((item) => {\n const style = AUDIT_SEVERITY_STYLE[item.status];\n return (\n <Box key={item.id} flexDirection=\"column\" marginTop={1}>\n <Text>\n <Text color={style.color}>{style.glyph}</Text>{' '}\n <Text bold>{item.label}</Text>{' '}\n <Text dimColor>({item.area})</Text>\n </Text>\n {item.file && (\n <Text dimColor>\n {' '}\n {relativeToInstallDir(item.file, installDir)}\n </Text>\n )}\n </Box>\n );\n })}\n {hidden > 0 && (\n <Text dimColor>\n … and {hidden} more. See the report for details.\n </Text>\n )}\n </>\n )}\n </Box>\n );\n};\n","/**\n * AuditOutroScreen — Audit-specific post-run summary. Renders the standard\n * success / error / cancel views with the audit checks summary inlined into\n * the success body. The report path shown in the success headline comes from\n * the program's `successMessage`, so this screen is program-agnostic.\n */\n\nimport { join } from 'node:path';\nimport { Box, Text, useInput } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { OutroKind } from '@lib/wizard-session';\nimport { Colors } from '@ui/tui/styles';\nimport { getAuditChecks } from '@lib/programs/audit/types';\nimport { AuditChecksOutroSection } from './AuditChecksOutroSection.js';\n\ninterface AuditOutroScreenProps {\n store: WizardStore;\n}\n\nexport const AuditOutroScreen = ({ store }: AuditOutroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n useInput(() => {\n store.setOutroDismissed();\n });\n\n const outroData = store.session.outroData;\n\n if (!outroData) {\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text dimColor>Finishing up...</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n {outroData.kind === OutroKind.Success && (\n <Box flexDirection=\"column\">\n <Text color=\"green\" bold>\n ✔ {outroData.message || 'Audit complete!'}\n </Text>\n\n {outroData.dashboardUrl && (\n <Box marginTop={1}>\n <Text>\n Dashboard: <Text color=\"cyan\">{outroData.dashboardUrl}</Text>\n </Text>\n </Box>\n )}\n\n {outroData.notebookUrl && (\n <Box marginTop={1}>\n <Text>\n Notebook: <Text color=\"cyan\">{outroData.notebookUrl}</Text>\n </Text>\n </Box>\n )}\n\n {outroData.reportFile && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"cyan\" bold>\n Report saved to:\n </Text>\n <Text>\n {join(store.session.installDir, outroData.reportFile)}\n </Text>\n <Text dimColor>\n A markdown file in your project folder. Open it in any editor to\n read the full audit.\n </Text>\n </Box>\n )}\n\n <AuditChecksOutroSection\n checks={getAuditChecks(store.session)}\n installDir={store.session.installDir}\n />\n\n {outroData.docsUrl && (\n <Box marginTop={1}>\n <Text>\n Learn more: <Text color=\"cyan\">{outroData.docsUrl}</Text>\n </Text>\n </Box>\n )}\n </Box>\n )}\n\n {outroData.kind === OutroKind.Error && (\n <Box flexDirection=\"column\">\n <Text color=\"red\" bold>\n ✘ {outroData.message || 'An error occurred'}\n </Text>\n {outroData.body && (\n <Box marginTop={1}>\n <Text dimColor>{outroData.body}</Text>\n </Box>\n )}\n </Box>\n )}\n\n {outroData.kind === OutroKind.Cancel && (\n <Text color=\"yellow\">■ {outroData.message || 'Cancelled'}</Text>\n )}\n\n <Box marginTop={1}>\n <Text color={Colors.muted}>Press any key to continue</Text>\n </Box>\n </Box>\n );\n};\n","// PostHog brand palette, tuned for the arcade theme. Shared by the\n// audit-3000 intro panel and the hedgehog runner mini-game.\nexport const NEON_PINK = '#F54E00';\nexport const NEON_BLUE = '#1D4AFF';\nexport const NEON_GOLD = '#F9BD2B';\n","import { Box, Text } from 'ink';\nimport { useEffect, useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { IntroScreenLayout } from '@ui/tui/screens/IntroScreenLayout';\nimport { SkillSourceInfo, useSkillEntry } from '@ui/tui/screens/SkillSourceInfo';\nimport { NEON_BLUE, NEON_GOLD, NEON_PINK } from './arcade-colors.js';\n\nconst AUDIT3000_SKILL_ID = 'audit-3000';\n\nconst ArcadeBanner = () => {\n // Blink the \"INSERT COIN\" tagline once per 600ms — classic attract-mode\n // pacing without burning Ink with rapid re-renders.\n const [blinkOn, setBlinkOn] = useState(true);\n useEffect(() => {\n const id = setInterval(() => setBlinkOn((v) => !v), 600);\n return () => clearInterval(id);\n }, []);\n\n const top = '\\u250F' + '\\u2501'.repeat(32) + '\\u2513';\n const bottom = '\\u2517' + '\\u2501'.repeat(32) + '\\u251B';\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text bold color={NEON_PINK}>\n {top}\n </Text>\n <Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n <Text bold color={NEON_GOLD}>\n {' A U D I T '}\n </Text>\n <Text bold color={NEON_BLUE}>\n {'-'}\n </Text>\n <Text bold color={NEON_GOLD}>\n {' 3 0 0 0 '}\n </Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n </Text>\n <Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n <Text dimColor={!blinkOn} color={NEON_BLUE}>\n {' \\u25B6 INSERT COIN TO PLAY \\u25C0 '}\n </Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n </Text>\n <Text bold color={NEON_PINK}>\n {bottom}\n </Text>\n </Box>\n );\n};\n\ninterface Audit3000IntroScreenProps {\n store: WizardStore;\n}\n\nexport const Audit3000IntroScreen = ({ store }: Audit3000IntroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const [showingMoreInfo, setShowingMoreInfo] = useState(false);\n const { session } = store;\n const { skillEntry, fetchFailed } = useSkillEntry(\n AUDIT3000_SKILL_ID,\n session.localMcp,\n );\n\n const body = showingMoreInfo ? (\n <Box flexDirection=\"column\" width={56}>\n <Box marginBottom={1}>\n <Text>\n The wizard is an agent that executes PostHog tasks. Its code is open\n source: <Text color=\"cyan\">https://github.com/PostHog/wizard</Text>\n </Text>\n </Box>\n\n <Text>\n The{' '}\n <Text color=\"cyan\" italic>\n {AUDIT3000_SKILL_ID}\n </Text>{' '}\n program reviews your PostHog integration across 34 checks — SDK install,\n identification, event capture, event quality, stale feature flag\n hygiene, session replay (fix + optimize), and use-case expansion across\n 8 PostHog products. When enrichment is available it also produces a\n company profile and use-case match. Nothing in your project is modified.\n </Text>\n <Box marginTop={1}>\n <Text>\n Results stream live to the{' '}\n <Text color=\"cyan\" bold>\n Hi-score Table\n </Text>{' '}\n tab during the run — that's your live report. When the audit\n finishes, the same report is also exported to{' '}\n <Text color=\"cyan\">./posthog-audit-3000-report.md</Text> in your\n project folder.\n </Text>\n </Box>\n <Box marginTop={1}>\n <SkillSourceInfo\n skillId={AUDIT3000_SKILL_ID}\n skillEntry={skillEntry}\n fetchFailed={fetchFailed}\n />\n </Box>\n </Box>\n ) : (\n <Box flexDirection=\"column\" alignItems=\"center\">\n <ArcadeBanner />\n <Box marginTop={1} flexDirection=\"column\" alignItems=\"center\">\n <Text bold>34 checks. 9 levels. 1 final report.</Text>\n <Text dimColor>\n High-score your PostHog integration before the boss fight.\n </Text>\n <Box marginTop={1}>\n <Text dimColor>\n Live report: <Text color={NEON_GOLD}>Hi-score Table</Text> tab ·\n Export: ./posthog-audit-3000-report.md\n </Text>\n </Box>\n </Box>\n </Box>\n );\n\n const menuOptions = showingMoreInfo\n ? [{ label: 'Back', value: 'back' }]\n : [\n { label: 'PRESS START', value: 'continue' },\n { label: 'More info', value: 'more-info' },\n { label: 'Cancel', value: 'cancel' },\n ];\n\n const handleSelect = (value: string) => {\n if (value === 'cancel') process.exit(0);\n else if (value === 'more-info') setShowingMoreInfo(true);\n else if (value === 'back') setShowingMoreInfo(false);\n else store.completeSetup();\n };\n\n return (\n <IntroScreenLayout\n installDir={session.installDir}\n body={body}\n showDetection={!showingMoreInfo}\n programLabel={session.programLabel}\n skillId={session.skillId}\n menuOptions={menuOptions}\n onSelect={handleSelect}\n />\n );\n};\n","/**\n * Audit-3000 right pane — arcade-flavoured fork of `AuditAreaPane`.\n *\n * Mirrors the audit pane's three-state logic (active slide → empty →\n * wrap-up) but routes through the audit-3000 slide registry and uses\n * \"LEVEL N: <area>\" framing instead of \"Verifying ...\".\n */\n\nimport { Fragment } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { spawn } from 'node:child_process';\nimport { Colors } from '@ui/tui/styles';\nimport { type AuditCheck } from '@lib/programs/audit/types';\nimport { AUDIT_3000_AREA_SLIDES, type AreaSlide } from './slides/index.js';\n\nconst FINDING_STATUSES: AuditCheck['status'][] = [\n 'error',\n 'warning',\n 'suggestion',\n];\n\nconst isFinding = (c: AuditCheck) => FINDING_STATUSES.includes(c.status);\n\nconst fallbackSlide = (area: string): AreaSlide => ({\n area,\n intro: [`Now playing: ${area.toLowerCase()}\\u2026`],\n docsUrl: '',\n});\n\nconst openLink = (url: string) => {\n const cmd =\n process.platform === 'darwin'\n ? 'open'\n : process.platform === 'win32'\n ? 'cmd'\n : 'xdg-open';\n const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];\n spawn(cmd, args, { detached: true, stdio: 'ignore' }).unref();\n};\n\ninterface Audit3000AreaPaneProps {\n checks: AuditCheck[];\n reportPath: string;\n}\n\nexport const Audit3000AreaPane = ({\n checks,\n reportPath,\n}: Audit3000AreaPaneProps) => {\n const pendingChecks = checks.filter((c) => c.status === 'pending');\n const activeArea = pendingChecks[0]?.area;\n const slide = activeArea\n ? AUDIT_3000_AREA_SLIDES.find((s) => s.area === activeArea) ??\n fallbackSlide(activeArea)\n : null;\n\n const levelIndex = activeArea\n ? AUDIT_3000_AREA_SLIDES.findIndex((s) => s.area === activeArea)\n : -1;\n const level = levelIndex >= 0 ? levelIndex + 1 : null;\n\n useInput((input) => {\n if (input.toLowerCase() === 'o' && slide?.docsUrl) {\n openLink(slide.docsUrl);\n }\n });\n\n if (slide) {\n const hasFindings = checks.some(isFinding);\n return (\n <ActiveSlide slide={slide} level={level} hasFindings={hasFindings} />\n );\n }\n\n if (checks.length === 0) {\n return null;\n }\n\n return <WritingReport reportPath={reportPath} />;\n};\n\nconst ActiveSlide = ({\n slide,\n level,\n hasFindings,\n}: {\n slide: AreaSlide;\n level: number | null;\n hasFindings: boolean;\n}) => (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold color={Colors.accent}>\n {level ? `LEVEL ${level}: ` : ''}\n {slide.area.toUpperCase()}\n </Text>\n <Box height={1} />\n\n {slide.visual}\n {slide.intro.map((paragraph, i) => (\n <Fragment key={i}>\n {i > 0 && <Box height={1} />}\n <Text>{paragraph}</Text>\n </Fragment>\n ))}\n\n <Box marginTop={1}>\n <Text dimColor>\n {slide.docsUrl && (\n <>\n [<Text color={Colors.accent}>O</Text>] Learn more\n </>\n )}\n {hasFindings && (\n <>\n {slide.docsUrl && ' '}[\n <Text color={Colors.accent}>{'\\u2192'}</Text>] View issues\n </>\n )}\n </Text>\n </Box>\n </Box>\n);\n\nconst WritingReport = ({ reportPath }: { reportPath: string }) => (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold color={Colors.accent}>\n STAGE CLEAR.\n </Text>\n <Box height={1} />\n <Text>\n All checks resolved. Compiling your high-score reel at{' '}\n <Text color=\"cyan\">{reportPath}</Text>.\n </Text>\n <Box height={1} />\n <Text>\n The report covers everything we checked, what we found, and what to do\n next.\n </Text>\n <Box height={1} />\n <Text dimColor>{'Stand by\\u2026'}</Text>\n </Box>\n);\n","/**\n * Audit-3000 left pane on the Run screen. Arcade-flavoured fork of the\n * audit program's `PendingChecksList`: a running score banner sits on\n * top, then the area-level \"level\" headers underneath.\n *\n * Per-check rows are deliberately omitted here — the Hi-score Table tab\n * has the full check-by-check breakdown. This pane is the at-a-glance\n * stage overview.\n */\n\nimport { Box, Text } from 'ink';\nimport { Spinner } from '@inkjs/ui';\nimport {\n type AuditCheck,\n type AuditStatus,\n} from '@lib/programs/audit/types';\nimport { Colors, Icons } from '@ui/tui/styles';\nimport { LoadingBox } from '@ui/tui/primitives/index';\n\nconst NEON_PINK = '#F54E00';\nconst NEON_GOLD = '#F9BD2B';\nconst NEON_BLUE = '#1D4AFF';\n\ninterface Audit3000ChecksPanelProps {\n checks: AuditCheck[];\n}\n\ninterface Group {\n area: string;\n checks: AuditCheck[];\n}\n\nfunction groupByArea(checks: AuditCheck[]): Group[] {\n const order: string[] = [];\n const map = new Map<string, AuditCheck[]>();\n for (const c of checks) {\n if (!map.has(c.area)) {\n map.set(c.area, []);\n order.push(c.area);\n }\n map.get(c.area)!.push(c);\n }\n return order.map((area) => ({ area, checks: map.get(area)! }));\n}\n\nfunction countByStatus(checks: AuditCheck[]): Record<AuditStatus, number> {\n const counts: Record<AuditStatus, number> = {\n pending: 0,\n pass: 0,\n error: 0,\n warning: 0,\n suggestion: 0,\n };\n for (const c of checks) counts[c.status] += 1;\n return counts;\n}\n\nconst ScoreBanner = ({ checks }: { checks: AuditCheck[] }) => {\n const counts = countByStatus(checks);\n const resolved = checks.length - counts.pending;\n const issues = counts.error + counts.warning + counts.suggestion;\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text>\n <Text bold color={NEON_PINK}>\n {'SCORE '}\n </Text>\n <Text bold color={NEON_GOLD}>\n {resolved.toString().padStart(2, '0')}\n </Text>\n <Text dimColor>{' / '}</Text>\n <Text bold>{checks.length.toString().padStart(2, '0')}</Text>\n </Text>\n <Text>\n <Text color=\"green\">{`PASS \\u25B2 ${counts.pass}`}</Text>\n <Text>{' '}</Text>\n <Text color={NEON_PINK}>{`MISS \\u25BC ${issues}`}</Text>\n <Text>{' '}</Text>\n <Text dimColor>{`QUEUE \\u25CB ${counts.pending}`}</Text>\n </Text>\n </Box>\n );\n};\n\nfunction groupIcon(group: Group): { icon: string; color: string } {\n const total = group.checks.length;\n const complete = group.checks.filter((c) => c.status !== 'pending').length;\n if (complete === 0) return { icon: Icons.squareOpen, color: Colors.muted };\n if (complete === total)\n return { icon: Icons.squareFilled, color: Colors.success };\n return { icon: Icons.triangleRight, color: Colors.primary };\n}\n\nconst GroupHeader = ({\n group,\n level,\n showIcon,\n isActive,\n}: {\n group: Group;\n level: number;\n showIcon: boolean;\n isActive: boolean;\n}) => {\n const complete = group.checks.filter((c) => c.status !== 'pending').length;\n const total = group.checks.length;\n const { icon, color } = groupIcon(group);\n return (\n <Box>\n {isActive ? (\n <Box marginRight={1}>\n <Spinner />\n </Box>\n ) : showIcon ? (\n <Text>\n <Text color={color}>{icon}</Text>{' '}\n </Text>\n ) : null}\n <Text>\n <Text color={NEON_BLUE} bold>{`L${level} `}</Text>\n <Text bold>{group.area}</Text>{' '}\n <Text dimColor>\n ({complete}/{total})\n </Text>\n </Text>\n </Box>\n );\n};\n\nexport const Audit3000ChecksPanel = ({ checks }: Audit3000ChecksPanelProps) => {\n if (checks.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>AUDIT-3000</Text>\n <Text> </Text>\n <LoadingBox message=\"Booting up arcade cabinet...\" />\n </Box>\n );\n }\n\n const groups = groupByArea(checks);\n const activeIndex = groups.findIndex((g) =>\n g.checks.some((c) => c.status === 'pending'),\n );\n\n return (\n <Box flexDirection=\"column\">\n <Text bold color={NEON_PINK}>\n AUDIT-3000\n </Text>\n <Text> </Text>\n <ScoreBanner checks={checks} />\n {groups.map((group, i) => (\n <GroupHeader\n key={group.area}\n group={group}\n level={i + 1}\n showIcon\n isActive={i === activeIndex}\n />\n ))}\n <Box marginTop={1}>\n <Text dimColor>\n Full breakdown: <Text color={NEON_GOLD}>Hi-score table (report)</Text>{' '}\n tab\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Hedgehog Runner — pure game engine.\n *\n * No Ink, React, or stdout imports. All state transitions are pure functions\n * so the game is deterministic given an RNG seed and unit-testable in\n * isolation from the TUI.\n *\n * The playfield is a fixed grid:\n * row 0: sky (rings can spawn here when hedgehog is mid-jump)\n * row 1: air (hedgehog occupies this row mid-jump; rings spawn here)\n * row 2: ground (hedgehog default position; spikes spawn here)\n *\n * Obstacles enter at the right edge (PLAYFIELD_WIDTH - 1) and move left one\n * column per tick. The hedgehog sits at HEDGEHOG_COL. Collision triggers when\n * an obstacle reaches HEDGEHOG_COL while occupying the same row as the\n * hedgehog.\n */\n\nexport const PLAYFIELD_WIDTH = 40;\nexport const HEDGEHOG_COL = 4;\nexport const GROUND_ROW = 2;\nexport const AIR_ROW = 1;\nexport const JUMP_DURATION_TICKS = 8;\nexport const SPAWN_COOLDOWN_MIN = 6;\nexport const SPAWN_COOLDOWN_MAX = 14;\nexport const RING_VALUE = 5;\n\nexport type HedgehogState = 'grounded' | 'jumping';\n\nexport interface Obstacle {\n kind: 'spike' | 'ring';\n x: number;\n row: number;\n}\n\nexport interface GameState {\n hedgehogState: HedgehogState;\n hedgehogRow: number;\n jumpFramesRemaining: number;\n obstacles: Obstacle[];\n score: number;\n hiScore: number;\n isGameOver: boolean;\n tick: number;\n ticksUntilNextSpawn: number;\n rngSeed: number;\n}\n\n// Mulberry32 — deterministic PRNG, used so tests can assert exact sequences.\nfunction nextRandom(seed: number): { value: number; nextSeed: number } {\n let t = (seed + 0x6d2b79f5) >>> 0;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n const value = ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n return { value, nextSeed: t >>> 0 };\n}\n\nfunction randomInt(seed: number, min: number, max: number) {\n const { value, nextSeed } = nextRandom(seed);\n return {\n value: min + Math.floor(value * (max - min + 1)),\n nextSeed,\n };\n}\n\nexport function initialState(hiScore = 0, rngSeed = 1): GameState {\n return {\n hedgehogState: 'grounded',\n hedgehogRow: GROUND_ROW,\n jumpFramesRemaining: 0,\n obstacles: [],\n score: 0,\n hiScore,\n isGameOver: false,\n tick: 0,\n ticksUntilNextSpawn: SPAWN_COOLDOWN_MIN,\n rngSeed,\n };\n}\n\nexport function jump(state: GameState): GameState {\n if (state.isGameOver) return state;\n if (state.hedgehogState !== 'grounded') return state;\n return {\n ...state,\n hedgehogState: 'jumping',\n hedgehogRow: AIR_ROW,\n jumpFramesRemaining: JUMP_DURATION_TICKS,\n };\n}\n\nexport function restart(state: GameState): GameState {\n return initialState(state.hiScore, state.rngSeed);\n}\n\nexport function tick(state: GameState): GameState {\n if (state.isGameOver) return state;\n\n let { hedgehogState, hedgehogRow, jumpFramesRemaining } = state;\n if (hedgehogState === 'jumping') {\n jumpFramesRemaining -= 1;\n if (jumpFramesRemaining <= 0) {\n hedgehogState = 'grounded';\n hedgehogRow = GROUND_ROW;\n jumpFramesRemaining = 0;\n }\n }\n\n const movedObstacles: Obstacle[] = [];\n let scoreDelta = 1;\n let hit = false;\n for (const obs of state.obstacles) {\n const next = { ...obs, x: obs.x - 1 };\n if (next.x < 0) continue;\n if (next.x === HEDGEHOG_COL && next.row === hedgehogRow) {\n if (next.kind === 'spike') {\n hit = true;\n movedObstacles.push(next);\n continue;\n }\n // Ring collected — score it and drop from the field.\n scoreDelta += RING_VALUE;\n continue;\n }\n movedObstacles.push(next);\n }\n\n let rngSeed = state.rngSeed;\n let ticksUntilNextSpawn = state.ticksUntilNextSpawn - 1;\n if (ticksUntilNextSpawn <= 0) {\n const kindRoll = nextRandom(rngSeed);\n rngSeed = kindRoll.nextSeed;\n const kind: Obstacle['kind'] = kindRoll.value < 0.65 ? 'spike' : 'ring';\n const row = kind === 'spike' ? GROUND_ROW : AIR_ROW;\n movedObstacles.push({ kind, x: PLAYFIELD_WIDTH - 1, row });\n\n const cooldown = randomInt(rngSeed, SPAWN_COOLDOWN_MIN, SPAWN_COOLDOWN_MAX);\n rngSeed = cooldown.nextSeed;\n ticksUntilNextSpawn = cooldown.value;\n }\n\n const score = state.score + scoreDelta;\n const isGameOver = hit;\n const hiScore = isGameOver ? Math.max(state.hiScore, score) : state.hiScore;\n\n return {\n hedgehogState,\n hedgehogRow,\n jumpFramesRemaining,\n obstacles: movedObstacles,\n score,\n hiScore,\n isGameOver,\n tick: state.tick + 1,\n ticksUntilNextSpawn,\n rngSeed,\n };\n}\n","/**\n * HedgehogRunner — playable arcade game shown while the audit runs.\n *\n * Game state lives in the parent (Audit3000RunScreen) so it survives tab\n * switches. This component owns the render loop (setInterval) and key\n * bindings; when the user switches tabs the component unmounts, the\n * interval clears, and state freezes in the parent — free pause behaviour.\n */\n\nimport { Box, Text } from 'ink';\nimport { Fragment, useEffect, type Dispatch, type SetStateAction } from 'react';\nimport { Colors } from '@ui/tui/styles';\nimport { NEON_BLUE, NEON_GOLD, NEON_PINK } from './arcade-colors.js';\nimport { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions';\nimport {\n useKeyBindings,\n KeyMatch,\n type KeyBinding,\n} from '@ui/tui/hooks/useKeyBindings';\nimport {\n HEDGEHOG_COL,\n PLAYFIELD_WIDTH,\n jump,\n restart,\n tick,\n type GameState,\n} from './hedgehog-runner-engine.js';\n\nconst TICK_MS = 150;\nconst PLAYFIELD_ROWS = 3;\nconst MIN_TERMINAL_COLUMNS = 50;\nconst HEDGEHOG_GLYPH = 'O';\nconst SPIKE_GLYPH = '^';\nconst RING_GLYPH = 'o';\nconst GROUND_GLYPH = '=';\n\ninterface HedgehogRunnerProps {\n state: GameState;\n onChange: Dispatch<SetStateAction<GameState>>;\n}\n\nconst pad4 = (n: number) => String(n).padStart(4, '0');\n\nexport const HedgehogRunner = ({ state, onChange }: HedgehogRunnerProps) => {\n const [columns] = useStdoutDimensions();\n\n useEffect(() => {\n const id = setInterval(() => {\n onChange((prev) => tick(prev));\n }, TICK_MS);\n return () => clearInterval(id);\n }, [onChange]);\n\n const bindings: KeyBinding[] = [\n {\n match: KeyMatch.Space,\n label: 'space',\n action: 'jump',\n handler: () => onChange((prev) => jump(prev)),\n },\n {\n match: 'r',\n label: 'r',\n action: 'restart',\n handler: () =>\n onChange((prev) => (prev.isGameOver ? restart(prev) : prev)),\n },\n ];\n useKeyBindings('hedgehog-runner', bindings);\n\n if (columns < MIN_TERMINAL_COLUMNS) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text dimColor>\n Widen the terminal to at least {MIN_TERMINAL_COLUMNS} columns to play\n Hedgehog Runner.\n </Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Box>\n <Text bold color={NEON_BLUE}>\n SCORE {pad4(state.score)}\n </Text>\n <Text>{' '}</Text>\n <Text bold color={NEON_GOLD}>\n HI {pad4(state.hiScore)}\n </Text>\n {state.isGameOver && (\n <>\n <Text>{' '}</Text>\n <Text bold color=\"red\">\n ✱ GAME OVER ✱\n </Text>\n </>\n )}\n </Box>\n\n {Array.from({ length: PLAYFIELD_ROWS }, (_, row) => (\n <PlayfieldRow key={row} row={row} state={state} />\n ))}\n\n <Text color={Colors.muted}>{GROUND_GLYPH.repeat(PLAYFIELD_WIDTH)}</Text>\n </Box>\n );\n};\n\ninterface PlayfieldRowProps {\n row: number;\n state: GameState;\n}\n\nconst PlayfieldRow = ({ row, state }: PlayfieldRowProps) => {\n const cells: Array<{ ch: string; color?: string; bold?: boolean }> = [];\n for (let x = 0; x < PLAYFIELD_WIDTH; x++) {\n if (x === HEDGEHOG_COL && row === state.hedgehogRow) {\n cells.push({ ch: HEDGEHOG_GLYPH, color: NEON_PINK, bold: true });\n continue;\n }\n const obstacle = state.obstacles.find((o) => o.x === x && o.row === row);\n if (obstacle) {\n cells.push(\n obstacle.kind === 'spike'\n ? { ch: SPIKE_GLYPH, color: 'red', bold: true }\n : { ch: RING_GLYPH, color: NEON_GOLD, bold: true },\n );\n continue;\n }\n cells.push({ ch: ' ' });\n }\n return (\n <Text>\n {cells.map((c, i) => (\n <Fragment key={i}>\n {c.color ? (\n <Text color={c.color} bold={c.bold}>\n {c.ch}\n </Text>\n ) : (\n c.ch\n )}\n </Fragment>\n ))}\n </Text>\n );\n};\n","import { useState, useSyncExternalStore } from 'react';\nimport { join } from 'node:path';\nimport { Box } from 'ink';\nimport type { WizardStore } from '@ui/tui/store';\nimport {\n TabContainer,\n SplitView,\n LogViewer,\n HNViewer,\n} from '@ui/tui/primitives/index';\nimport { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions';\nimport { useFileWatcher } from '@ui/tui/hooks/file-watcher';\nimport { AuditChecksViewer } from '@ui/tui/screens/audit/AuditChecksViewer/AuditChecksViewer';\nimport { Audit3000AreaPane } from './Audit3000AreaPane.js';\nimport { Audit3000ChecksPanel } from './Audit3000ChecksPanel.js';\nimport { HedgehogRunner } from './HedgehogRunner.js';\nimport { initialState } from './hedgehog-runner-engine.js';\nimport {\n AUDIT_CHECKS_FILE,\n AUDIT_CHECKS_KEY,\n coerceAuditChecks,\n getAuditChecks,\n} from '@lib/programs/audit/types';\nimport { getProgramConfig } from '@lib/programs/program-registry';\nimport { WIZARD_LOG_FILE } from '@utils/paths';\n\nconst AUDIT_3000_REPORT_FILE_FALLBACK = 'posthog-audit-3000-report.md';\n\ninterface Audit3000RunScreenProps {\n store: WizardStore;\n}\n\nexport const Audit3000RunScreen = ({ store }: Audit3000RunScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n // Mirror the agent's audit ledger into the store. The audit-3000 skill\n // writes to the same `.posthog-audit-checks.json` path the original\n // audit uses, so the file watcher key is shared.\n useFileWatcher(join(store.session.installDir, AUDIT_CHECKS_FILE), (parsed) =>\n store.setFrameworkContext(AUDIT_CHECKS_KEY, coerceAuditChecks(parsed)),\n );\n\n const statuses =\n store.statusMessages.length > 0 ? store.statusMessages : undefined;\n\n const [columns] = useStdoutDimensions();\n // Game state is lifted here so it survives tab switches — the HedgehogRunner\n // unmounts whenever the user views another tab, but the score / position /\n // obstacles stay frozen until they switch back.\n const [gameState, setGameState] = useState(() => initialState());\n const checks = getAuditChecks(store.session);\n const reportFile =\n getProgramConfig(store.router.activeProgram).reportFile ??\n AUDIT_3000_REPORT_FILE_FALLBACK;\n const reportPath = `./${reportFile}`;\n const checksPanel = <Audit3000ChecksPanel checks={checks} />;\n const areaPane = (\n <Audit3000AreaPane checks={checks} reportPath={reportPath} />\n );\n\n // Narrow terminals: drop the area pane.\n const statusComponent =\n columns < 80 ? (\n <Box flexDirection=\"column\" flexGrow={1}>\n {checksPanel}\n </Box>\n ) : (\n <SplitView left={areaPane} right={checksPanel} />\n );\n\n const tabs = [\n { id: 'status', label: 'Arcade', component: statusComponent },\n {\n id: 'audit-checks',\n label: 'Hi-score table (report)',\n component: <AuditChecksViewer checks={checks} />,\n },\n {\n id: 'play',\n label: 'Play',\n component: <HedgehogRunner state={gameState} onChange={setGameState} />,\n },\n {\n id: 'logs',\n label: 'Tail logs',\n component: <LogViewer filePath={WIZARD_LOG_FILE} />,\n },\n { id: 'hn', label: 'HN', component: <HNViewer /> },\n ];\n\n return (\n <TabContainer\n tabs={tabs}\n statusMessage={statuses}\n expandableStatus\n store={store}\n />\n );\n};\n","/**\n * Audit3000OutroScreen — high-score-style summary after a v3000 audit run.\n *\n * On success: arcade FINAL SCORE banner with pass / miss tallies, the\n * absolute report path, and the standard problematic-items list.\n *\n * Error and cancel branches mirror `AuditOutroScreen` so failure modes\n * stay legible without arcade dressing.\n */\n\nimport { join } from 'node:path';\nimport { Box, Text, useInput } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { OutroKind } from '@lib/wizard-session';\nimport { Colors } from '@ui/tui/styles';\nimport {\n getAuditChecks,\n type AuditCheck,\n type AuditStatus,\n} from '@lib/programs/audit/types';\nimport { AuditChecksOutroSection } from '@ui/tui/screens/audit/AuditChecksOutroSection';\n\nconst NEON_PINK = '#F54E00';\nconst NEON_GOLD = '#F9BD2B';\nconst NEON_BLUE = '#1D4AFF';\n\nconst PANEL_WIDTH = 48;\n\nconst padCenter = (s: string, width: number): string => {\n if (s.length >= width) return s;\n const total = width - s.length;\n const left = Math.floor(total / 2);\n const right = total - left;\n return ' '.repeat(left) + s + ' '.repeat(right);\n};\n\nfunction countByStatus(checks: AuditCheck[]): Record<AuditStatus, number> {\n const counts: Record<AuditStatus, number> = {\n pending: 0,\n pass: 0,\n error: 0,\n warning: 0,\n suggestion: 0,\n };\n for (const c of checks) counts[c.status] += 1;\n return counts;\n}\n\nconst FinalScorePanel = ({ checks }: { checks: AuditCheck[] }) => {\n const counts = countByStatus(checks);\n const resolved = checks.length - counts.pending;\n const issues = counts.error + counts.warning + counts.suggestion;\n\n const top = '\\u250F' + '\\u2501'.repeat(PANEL_WIDTH) + '\\u2513';\n const bottom = '\\u2517' + '\\u2501'.repeat(PANEL_WIDTH) + '\\u251B';\n const sep = '\\u2520' + '\\u2500'.repeat(PANEL_WIDTH) + '\\u2528';\n\n const row = (content: string) => (\n <Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n <Text>{content}</Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n </Text>\n );\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold color={NEON_PINK}>\n {top}\n </Text>\n {row(padCenter('GAME OVER', PANEL_WIDTH))}\n <Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n <Text color={NEON_GOLD}>\n {padCenter(\n `FINAL SCORE ${resolved} / ${checks.length}`,\n PANEL_WIDTH,\n )}\n </Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n </Text>\n <Text color={NEON_PINK}>{sep}</Text>\n <Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n <Text color=\"green\">\n {padCenter(`PASS \\u25B2 ${counts.pass}`, PANEL_WIDTH)}\n </Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n </Text>\n <Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n <Text color={NEON_BLUE}>\n {padCenter(`MISS \\u25BC ${issues}`, PANEL_WIDTH)}\n </Text>\n <Text bold color={NEON_PINK}>\n {'\\u2503'}\n </Text>\n </Text>\n <Text bold color={NEON_PINK}>\n {bottom}\n </Text>\n </Box>\n );\n};\n\ninterface Audit3000OutroScreenProps {\n store: WizardStore;\n}\n\nexport const Audit3000OutroScreen = ({ store }: Audit3000OutroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n useInput(() => {\n store.setOutroDismissed();\n });\n\n const outroData = store.session.outroData;\n\n if (!outroData) {\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text dimColor>{'Counting your tokens\\u2026'}</Text>\n </Box>\n );\n }\n\n const checks = getAuditChecks(store.session);\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n {outroData.kind === OutroKind.Success && (\n <Box flexDirection=\"column\">\n <FinalScorePanel checks={checks} />\n\n <Box marginTop={1}>\n <Text bold color=\"green\">\n {'\\u2714'} {outroData.message || 'AUDIT-3000 complete!'}\n </Text>\n </Box>\n\n {outroData.reportFile && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold color=\"cyan\">\n High-score reel saved to:\n </Text>\n <Text>\n {join(store.session.installDir, outroData.reportFile)}\n </Text>\n <Text dimColor>\n A markdown file in your project folder — open it in any editor\n to read the full audit.\n </Text>\n </Box>\n )}\n\n <AuditChecksOutroSection\n checks={checks}\n installDir={store.session.installDir}\n />\n\n {outroData.docsUrl && (\n <Box marginTop={1}>\n <Text>\n Learn more: <Text color=\"cyan\">{outroData.docsUrl}</Text>\n </Text>\n </Box>\n )}\n </Box>\n )}\n\n {outroData.kind === OutroKind.Error && (\n <Box flexDirection=\"column\">\n <Text color=\"red\" bold>\n {'\\u2718'} {outroData.message || 'An error occurred'}\n </Text>\n {outroData.body && (\n <Box marginTop={1}>\n <Text dimColor>{outroData.body}</Text>\n </Box>\n )}\n </Box>\n )}\n\n {outroData.kind === OutroKind.Cancel && (\n <Text color=\"yellow\">\n {'\\u25A0'} {outroData.message || 'Cancelled'}\n </Text>\n )}\n\n <Box marginTop={1}>\n <Text color={Colors.muted}>Press any key to continue</Text>\n </Box>\n </Box>\n );\n};\n","/**\n * SetupScreen — Generic framework disambiguation.\n *\n * Iterates unresolved setup questions from the FrameworkConfig\n * and renders a PickerMenu for each. If all questions are auto-resolved,\n * this screen is skipped entirely (the router skips it via its show() predicate).\n */\n\nimport { Box, Text } from 'ink';\nimport { useState, useEffect } from 'react';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { PickerMenu } from '@ui/tui/primitives/index';\nimport { Colors } from '@ui/tui/styles';\nimport type { SetupQuestion } from '@lib/framework-config';\n\ninterface SetupScreenProps {\n store: WizardStore;\n}\n\nexport const SetupScreen = ({ store }: SetupScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const config = store.session.frameworkConfig;\n const questions = config?.metadata.setup?.questions ?? [];\n\n // Track which question index we're currently showing\n const [currentIndex, setCurrentIndex] = useState(0);\n const [resolving, setResolving] = useState(true);\n\n // On mount, run auto-detection for all questions\n useEffect(() => {\n void (async () => {\n for (const q of questions) {\n // Skip if already resolved (e.g. by CLI arg)\n if (q.key in store.session.frameworkContext) continue;\n\n try {\n const detected = await q.detect({\n installDir: store.session.installDir,\n });\n if (detected !== null) {\n store.setFrameworkContext(q.key, detected);\n }\n } catch {\n // Detection failed — will ask the user\n }\n }\n setResolving(false);\n\n // If all resolved, the router's isComplete predicate will\n // resolve past this screen on the next render cycle.\n })();\n }, []);\n\n if (resolving) {\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text dimColor>Detecting project configuration...</Text>\n </Box>\n );\n }\n\n // Get unresolved questions\n const unresolved = questions.filter(\n (q: SetupQuestion) => !(q.key in store.session.frameworkContext),\n );\n\n if (unresolved.length === 0) {\n // All resolved — should have already advanced\n return null;\n }\n\n const question = unresolved[currentIndex] ?? unresolved[0];\n if (!question) return null;\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color={Colors.accent}>\n Project Setup\n </Text>\n {config && (\n <Text dimColor>Configuring {config.metadata.name} integration</Text>\n )}\n </Box>\n\n <PickerMenu<string>\n message={question.message}\n options={question.options.map((o) => ({\n label: o.label,\n value: o.value,\n hint: o.hint,\n }))}\n onSelect={(value) => {\n const selected = Array.isArray(value) ? value[0] : value;\n store.setFrameworkContext(question.key, selected);\n\n // Check if more unresolved questions remain\n const remaining = unresolved.filter(\n (q: SetupQuestion) =>\n q.key !== question.key &&\n !(q.key in store.session.frameworkContext),\n );\n\n if (remaining.length > 0) {\n setCurrentIndex((i) => i + 1);\n }\n // When no remaining questions, setFrameworkContext already\n // triggered emitChange — router resolves past this screen.\n }}\n />\n </Box>\n );\n};\n","/**\n * AuthScreen — Shown while waiting for OAuth authentication.\n *\n * Displays framework detection results, beta/disclosure notices,\n * a waiting spinner, and the login URL when available.\n * The router resolves past this screen once session.credentials is set.\n */\n\nimport { Box, Text } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { LoadingBox } from '@ui/tui/primitives/index';\nimport { useKeyBindings } from '@ui/tui/hooks/useKeyBindings';\nimport { Colors } from '@ui/tui/styles';\n\ninterface AuthScreenProps {\n store: WizardStore;\n}\n\nexport const AuthScreen = ({ store }: AuthScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const { session } = store;\n\n // While the OAuth flow is waiting (loginUrl set), let the user paste the\n // callback URL/code by hand — the fallback for headless/remote shells where\n // the browser can't reach the local callback server.\n const canPasteCode = Boolean(session.loginUrl);\n useKeyBindings(\n 'auth',\n canPasteCode\n ? [\n {\n match: ['p', 'P'],\n label: 'P',\n action: 'paste auth code',\n handler: () => store.showManualAuthCode(),\n },\n ]\n : [],\n );\n const config = session.frameworkConfig;\n const frameworkLabel =\n session.detectedFrameworkLabel ?? config?.metadata.name;\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color={Colors.accent}>\n PostHog Setup Wizard\n </Text>\n\n {frameworkLabel && (\n <Text>\n <Text color=\"green\">{'\\u2714'} </Text>\n <Text>Framework: {frameworkLabel}</Text>\n </Text>\n )}\n\n {config?.metadata.beta && (\n <Text color=\"yellow\">\n [BETA] The {config.metadata.name} wizard is in beta. Questions or\n feedback? Email wizard@posthog.com\n </Text>\n )}\n\n {config?.metadata.preRunNotice && (\n <Text color=\"yellow\">{config.metadata.preRunNotice}</Text>\n )}\n </Box>\n\n <LoadingBox message=\"Waiting for authentication...\" />\n\n {session.loginUrl && (\n <Box marginTop={1} marginBottom={1} flexDirection=\"column\">\n {/* Literal \\n — sibling <Box> spacers squeeze to 0 under flex\n height pressure, letting cmd-click slurp /authorize + 'y'. */}\n <Text>\n <Text dimColor>\n If the browser didn't open, copy and paste this URL:\n </Text>\n {'\\n\\n'}\n <Text color=\"cyan\">{session.loginUrl}</Text>\n </Text>\n <Box marginTop={1}>\n <Text dimColor>\n On a remote machine or devbox? Press{' '}\n <Text color={Colors.accent}>[P]</Text> to paste the callback URL.\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n","/**\n * RunScreen — Default observational view of the agent run.\n *\n * Tabs: Status (LearnCard + ProgressList), Event plan (when present),\n * Tail logs, HN. Programs that need a different tab list ship their own\n * screen component (see audit/AuditRunScreen.tsx).\n */\n\nimport { useMemo, useSyncExternalStore } from 'react';\nimport { join } from 'node:path';\nimport { Box } from 'ink';\nimport type { WizardStore } from '@ui/tui/store';\nimport {\n TabContainer,\n SplitView,\n ProgressList,\n LogViewer,\n EventPlanViewer,\n HNViewer,\n} from '@ui/tui/primitives/index';\nimport type { ProgressItem } from '@ui/tui/primitives/index';\nimport { ADDITIONAL_FEATURE_LABELS } from '@lib/wizard-session';\nimport { LearnCard } from '@ui/tui/components/LearnCard';\nimport { TipsCard } from '@ui/tui/components/TipsCard';\nimport { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions';\nimport { useFileWatcher } from '@ui/tui/hooks/file-watcher';\nimport { EVENT_PLAN_FILE } from '@lib/programs/posthog-integration/index';\nimport { getProgramConfig } from '@lib/programs/program-registry';\nimport { getContentBlocks as getSkillContentBlocks } from '@lib/programs/agent-skill/content/index';\n\nimport { WIZARD_LOG_FILE } from '@utils/paths';\n\ninterface RunScreenProps {\n store: WizardStore;\n}\n\nexport const RunScreen = ({ store }: RunScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n // Mirror the agent's `.posthog-events.json` plan into the store so the\n // Event plan tab appears as soon as the agent emits the file.\n useFileWatcher(join(store.session.installDir, EVENT_PLAN_FILE), (parsed) => {\n if (!Array.isArray(parsed)) return;\n store.setEventPlan(\n parsed.map((e: Record<string, unknown>) => ({\n name: (e.name ?? e.event ?? '') as string,\n description: (e.description ?? '') as string,\n })),\n );\n });\n\n const [columns] = useStdoutDimensions();\n\n const progressItems: ProgressItem[] = store.tasks.map((t) => ({\n label: t.label,\n activeForm: t.activeForm,\n status: t.status,\n }));\n\n // When all tasks are done but the queue has features, show a transitional item\n const queue = store.session.additionalFeatureQueue;\n const allDone =\n progressItems.length > 0 &&\n progressItems.every((t) => t.status === 'completed');\n if (allDone && queue.length > 0) {\n const nextLabel = ADDITIONAL_FEATURE_LABELS[queue[0]];\n progressItems.push({\n label: `Set up ${nextLabel}`,\n activeForm: `Setting up ${nextLabel}...`,\n status: 'in_progress',\n });\n }\n\n const statuses =\n store.statusMessages.length > 0 ? store.statusMessages : undefined;\n\n // Each program owns its content deck (program/content/index.tsx)\n // and wires it onto its ProgramConfig.getContentBlocks. Fall back to the\n // agent-skill deck for runtime-created configs (e.g. `wizard skill <id>`)\n // that aren't in the static registry.\n const activeProgram = store.router.activeProgram;\n const learnBlocks = useMemo(() => {\n const getBlocks =\n getProgramConfig(activeProgram).getContentBlocks ?? getSkillContentBlocks;\n return getBlocks(store);\n }, [store, activeProgram]);\n\n const leftPane = store.learnCardComplete ? (\n <TipsCard store={store} />\n ) : (\n <LearnCard\n store={store}\n blocks={learnBlocks}\n onComplete={() => store.setLearnCardComplete()}\n />\n );\n const progressList = <ProgressList items={progressItems} title=\"Tasks\" />;\n\n // On narrow terminals, drop the learn pane and show only progress\n const statusComponent =\n columns < 80 ? (\n <Box flexDirection=\"column\" flexGrow={1}>\n {progressList}\n </Box>\n ) : (\n <SplitView left={leftPane} right={progressList} />\n );\n\n const tabs = [\n { id: 'status', label: 'Status', component: statusComponent },\n ...(store.eventPlan.length > 0\n ? [\n {\n id: 'events',\n label: 'Event plan',\n component: <EventPlanViewer events={store.eventPlan} />,\n },\n ]\n : []),\n {\n id: 'logs',\n label: 'Tail logs',\n component: <LogViewer filePath={WIZARD_LOG_FILE} />,\n },\n { id: 'hn', label: 'HN', component: <HNViewer /> },\n ];\n\n return (\n <TabContainer\n tabs={tabs}\n statusMessage={statuses}\n expandableStatus\n store={store}\n />\n );\n};\n","/**\n * KeepSkillsScreen — Ask whether to keep installed skills in .claude/skills/.\n *\n * Shown after the outro summary so users see the agent's output first,\n * then decide whether to keep the skills that powered it.\n *\n * When done, calls store.setSkillsComplete() and exits the process.\n */\n\nimport { Box, Text } from 'ink';\nimport { useState, useEffect } from 'react';\nimport { useSyncExternalStore } from 'react';\nimport { readdir, rm, access } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nconst WIZARD_MARKER = '.posthog-wizard';\nimport type { WizardStore } from '@ui/tui/store';\nimport { ConfirmationInput } from '@ui/tui/primitives/index';\nimport { Colors } from '@ui/tui/styles';\nimport { CONTEXT_MILL_URL } from '@lib/constants';\n\ninterface KeepSkillsScreenProps {\n store: WizardStore;\n}\n\ninterface SkillEntry {\n name: string;\n children: string[];\n}\n\nenum Phase {\n Loading = 'loading',\n Ask = 'ask',\n Removing = 'removing',\n Done = 'done',\n}\n\nexport const KeepSkillsScreen = ({ store }: KeepSkillsScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const [phase, setPhase] = useState<Phase>(Phase.Loading);\n const [skills, setSkills] = useState<SkillEntry[]>([]);\n\n const skillsDir = join(store.session.installDir, '.claude', 'skills');\n\n useEffect(() => {\n void (async () => {\n try {\n const entries = await readdir(skillsDir, { withFileTypes: true });\n const dirs = entries.filter((e) => e.isDirectory());\n const result: SkillEntry[] = [];\n for (const dir of dirs) {\n try {\n await access(join(skillsDir, dir.name, WIZARD_MARKER));\n } catch {\n continue;\n }\n const children = (await readdir(join(skillsDir, dir.name))).filter(\n (c) => c !== WIZARD_MARKER,\n );\n result.push({ name: dir.name, children });\n }\n if (result.length === 0) {\n store.setSkillsComplete(true);\n process.exit(0);\n }\n setSkills(result);\n setPhase(Phase.Ask);\n } catch {\n store.setSkillsComplete(true);\n process.exit(0);\n }\n })();\n }, []); // eslint-disable-line\n\n const handleKeep = () => {\n store.setSkillsComplete(true);\n process.exit(0);\n };\n\n const handleRemove = async () => {\n setPhase(Phase.Removing);\n for (const skill of skills) {\n try {\n await rm(join(skillsDir, skill.name), {\n recursive: true,\n force: true,\n });\n } catch {\n // Best-effort removal\n }\n }\n try {\n const remaining = await readdir(skillsDir);\n if (remaining.length === 0) {\n await rm(skillsDir, { recursive: true, force: true });\n }\n } catch {\n // Best-effort cleanup\n }\n setPhase(Phase.Done);\n // Give React a tick to paint the \"Skills removed.\" message before exit\n setTimeout(() => {\n store.setSkillsComplete(false);\n process.exit(0);\n }, 600);\n };\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text bold color={Colors.accent}>\n Keep the skills?\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n {phase === Phase.Loading && (\n <Text dimColor>Checking installed skills...</Text>\n )}\n\n {phase === Phase.Ask && (\n <>\n <Text dimColor>\n The wizard installed open-source skills that help AI coding agents\n integrate PostHog into your project:\n </Text>\n <Box marginTop={1} flexDirection=\"column\" marginLeft={2}>\n <Text dimColor>.claude/</Text>\n <Text dimColor> skills/</Text>\n {skills.map((skill) => (\n <Box key={skill.name} flexDirection=\"column\">\n <Text dimColor> {skill.name}/</Text>\n {skill.children.map((child) => (\n <Text key={child} dimColor>\n {' '}\n {child}\n </Text>\n ))}\n </Box>\n ))}\n </Box>\n <Box marginTop={1}>\n <Text dimColor>\n Source: <Text color=\"cyan\">{CONTEXT_MILL_URL}</Text>\n </Text>\n </Box>\n <Box marginTop={1}>\n <ConfirmationInput\n message=\"Keep the installed skills?\"\n confirmLabel=\"Keep [Enter]\"\n cancelLabel=\"Remove [Esc]\"\n onConfirm={handleKeep}\n onCancel={() => void handleRemove()}\n />\n </Box>\n </>\n )}\n\n {phase === Phase.Removing && <Text dimColor>Removing skills...</Text>}\n\n {phase === Phase.Done && <Text dimColor>Skills removed.</Text>}\n </Box>\n </Box>\n );\n};\n","/**\n * OutroScreen — Default post-run summary.\n *\n * Renders the success / error / cancel views from `outroData`. Programs\n * that need a different success view (e.g. with extra summary content)\n * ship their own screen component (see audit/AuditOutroScreen.tsx).\n */\n\nimport { Box, Text, useInput } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { OutroKind } from '@lib/wizard-session';\nimport { Colors } from '@ui/tui/styles';\n\ninterface OutroScreenProps {\n store: WizardStore;\n}\n\nexport const OutroScreen = ({ store }: OutroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n useInput(() => {\n store.setOutroDismissed();\n });\n\n const outroData = store.session.outroData;\n\n if (!outroData) {\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text dimColor>Finishing up...</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n {outroData.kind === OutroKind.Success && (\n <Box flexDirection=\"column\">\n <Text color=\"green\" bold>\n ✔ {outroData.message || 'Done!'}\n </Text>\n\n {outroData.body && (\n <Box marginTop={1}>\n <Text dimColor>{outroData.body}</Text>\n </Box>\n )}\n\n {outroData.reportFile && (\n <Box marginTop={1}>\n <Text>\n Check <Text bold>./{outroData.reportFile}</Text> for details\n </Text>\n </Box>\n )}\n\n {outroData.changes && outroData.changes.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"cyan\" bold>\n What the agent did:\n </Text>\n {outroData.changes.map((change, i) => (\n <Text key={i}>• {change}</Text>\n ))}\n </Box>\n )}\n\n {store.eventPlan.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"cyan\" bold>\n Events added:\n </Text>\n {store.eventPlan.map((event) => (\n <Text key={event.name}>\n • <Text bold>{event.name}</Text>\n <Text dimColor> {event.description}</Text>\n </Text>\n ))}\n </Box>\n )}\n\n {outroData.dashboardUrl && (\n <Box marginTop={1}>\n <Text>\n We've also made you a dashboard:{' '}\n <Text color=\"cyan\">{outroData.dashboardUrl}</Text>\n </Text>\n </Box>\n )}\n\n {outroData.notebookUrl && (\n <Box marginTop={1}>\n <Text>\n And uploaded the report to a PostHog notebook:{' '}\n <Text color=\"cyan\">{outroData.notebookUrl}</Text>\n </Text>\n </Box>\n )}\n\n {outroData.docsUrl && (\n <Box marginTop={1}>\n <Text>\n Learn more: <Text color=\"cyan\">{outroData.docsUrl}</Text>\n </Text>\n </Box>\n )}\n\n {outroData.continueUrl && (\n <Box>\n <Text>\n Continue onboarding:{' '}\n <Text color=\"cyan\">{outroData.continueUrl}</Text>\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text dimColor>\n Note: This wizard uses an LLM agent to analyze and modify your\n project. Please review the changes made.\n </Text>\n </Box>\n <Text dimColor>\n How did this work for you? Drop us a line: wizard@posthog.com\n </Text>\n </Box>\n )}\n\n {outroData.kind === OutroKind.Error && (\n <Box flexDirection=\"column\">\n <Text color=\"red\" bold>\n ✘ {outroData.message || 'An error occurred'}\n </Text>\n\n {outroData.body && (\n <Box marginTop={1}>\n <Text dimColor>{outroData.body}</Text>\n </Box>\n )}\n\n {outroData.docsUrl && (\n <Box marginTop={1}>\n <Text>\n Docs: <Text color=\"cyan\">{outroData.docsUrl}</Text>\n </Text>\n </Box>\n )}\n </Box>\n )}\n\n {outroData.kind === OutroKind.Cancel && (\n <Box flexDirection=\"column\">\n <Text color=\"yellow\">■ {outroData.message || 'Cancelled'}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={Colors.muted}>Press any key to continue</Text>\n </Box>\n </Box>\n );\n};\n","/**\n * ExitScreen — Final step in every program.\n *\n * Renders nothing. Immediately exits the process.\n * The cleanup handler in start-tui.ts handles the exit summary line.\n */\n\nimport { useEffect } from 'react';\n\nexport const ExitScreen = () => {\n useEffect(() => {\n process.exit(0);\n }, []);\n\n return null;\n};\n","/**\n * AuthErrorScreen — Shown when the PostHog LLM Gateway returns a 401.\n *\n * Two distinct causes:\n * 1. Claude Code settings.json / managed-settings overrides ANTHROPIC_*\n * env vars — auth conflict. Tell the user to log out of Claude Code.\n * 2. The PostHog API key itself was rejected — bad prefix, missing scope,\n * expired, or wrong region. Don't blame Claude Code in this case.\n */\n\nimport { Box, Text, useInput } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { Colors } from '@ui/tui/styles';\n\ninterface AuthErrorScreenProps {\n store: WizardStore;\n}\n\nexport const AuthErrorScreen = ({ store }: AuthErrorScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n useInput(() => {\n process.exit(1);\n });\n\n const detail = store.session.authErrorDetail;\n const hasSettingsConflict = detail?.hasSettingsConflict ?? true;\n const logFilePath = detail?.logFilePath;\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text color=\"red\" bold>\n {'✘'} Authentication error\n </Text>\n\n {hasSettingsConflict ? (\n <>\n <Box flexDirection=\"column\" marginTop={1}>\n <Text>\n The Wizard couldn't connect to the PostHog LLM Gateway. Claude\n Code settings on this machine are overriding the Wizard's\n credentials.\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n Try logging out of Claude Code temporarily and re-running the\n Wizard:\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginTop={1} paddingLeft={2}>\n <Text color=\"cyan\">claude auth logout</Text>\n </Box>\n </>\n ) : (\n <>\n <Box flexDirection=\"column\" marginTop={1}>\n <Text>\n The PostHog LLM Gateway rejected the API key. Common causes:\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginTop={1} paddingLeft={2}>\n <Text>\n {'•'} Wrong key type — pass a personal API key (\n <Text color=\"cyan\">phx_xxx</Text>).\n </Text>\n <Text dimColor>\n {' '}pha_ is an OAuth access token, phc_ is a project key.\n </Text>\n <Text>\n {'•'} Missing scope — the key needs{' '}\n <Text color=\"cyan\">llm_gateway:read</Text>.\n </Text>\n <Text>{'•'} Expired or revoked key.</Text>\n <Text>\n {'•'} Region mismatch — <Text color=\"cyan\">--region</Text> must\n match where the key was issued (us vs eu).\n </Text>\n </Box>\n </>\n )}\n\n {logFilePath && (\n <Box marginTop={1}>\n <Text dimColor>Verbose log: {logFilePath}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={Colors.muted}>Press any key to exit</Text>\n </Box>\n </Box>\n );\n};\n","/**\n * WizardAskScreen — Overlay for the `wizard_ask` MCP tool.\n *\n * Walks the agent's question list one at a time and accumulates answers.\n * When the user submits the last question, the store resolves the\n * pending request and the overlay pops, returning the agent to its run.\n */\n\nimport { Box, Text } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '@ui/tui/store';\nimport { ModalOverlay, PickerMenu } from '@ui/tui/primitives/index';\nimport { Colors, Icons } from '@ui/tui/styles';\nimport type { AskAnswers, AskQuestion } from '@lib/wizard-session';\n\ninterface WizardAskScreenProps {\n store: WizardStore;\n}\n\nexport const WizardAskScreen = ({ store }: WizardAskScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const pending = store.session.pendingQuestion;\n\n // Index of the question currently being answered. Resets when a fresh\n // pending request arrives.\n const [index, setIndex] = useState(0);\n const [answers, setAnswers] = useState<AskAnswers>({});\n const [lastPendingId, setLastPendingId] = useState<string | null>(null);\n\n if (!pending) return null;\n\n // Reset accumulator state when the agent opens a new request mid-session.\n if (pending.id !== lastPendingId) {\n setLastPendingId(pending.id);\n setIndex(0);\n setAnswers({});\n return null;\n }\n\n const question = pending.questions[index];\n if (!question) return null;\n\n const total = pending.questions.length;\n const progress = total > 1 ? `Question ${index + 1} of ${total}` : null;\n\n const submit = (value: string | string[]) => {\n const next: AskAnswers = { ...answers, [question.id]: value };\n if (index + 1 < total) {\n setAnswers(next);\n setIndex(index + 1);\n return;\n }\n store.resolvePendingQuestion(next);\n };\n\n return (\n <ModalOverlay\n borderColor={Colors.accent}\n title={`${Icons.diamond} ${pending.source}`}\n titleColor={Colors.accent}\n width={72}\n >\n {progress && (\n <Box marginBottom={1}>\n <Text dimColor>{progress}</Text>\n </Box>\n )}\n <Box flexDirection=\"column\">\n <Text>{question.prompt}</Text>\n </Box>\n <Box marginTop={1}>\n {/* `key` forces React to remount the input when the question changes\n so per-question internal state (typed buffer, picker focus) doesn't\n bleed across questions. */}\n <QuestionInput\n key={`${pending.id}:${question.id}`}\n question={question}\n onSubmit={submit}\n />\n </Box>\n </ModalOverlay>\n );\n};\n\ninterface QuestionInputProps {\n question: AskQuestion;\n onSubmit: (value: string | string[]) => void;\n}\n\nconst QuestionInput = ({ question, onSubmit }: QuestionInputProps) => {\n switch (question.kind) {\n case 'single':\n return (\n <PickerMenu<string>\n options={(question.options ?? []).map((o) => ({\n label: o.label,\n value: o.value,\n }))}\n onSelect={(value) => {\n const v = Array.isArray(value) ? value[0] : value;\n onSubmit(v);\n }}\n />\n );\n\n case 'multi':\n return (\n <PickerMenu<string>\n mode=\"multi\"\n options={(question.options ?? []).map((o) => ({\n label: o.label,\n value: o.value,\n }))}\n onSelect={(value) => {\n const v = Array.isArray(value) ? value : [value];\n onSubmit(v);\n }}\n />\n );\n\n case 'text':\n return (\n // `width=\"100%\"` on both the column and the hint row anchors them to\n // the modal's content width — without it, Ink/Yoga shrinks the column\n // to fit its widest child, so the right-aligned hint walks left/right\n // as the typed text changes width.\n <Box flexDirection=\"column\" width=\"100%\">\n <TextInput\n placeholder=\"Type your answer\"\n onSubmit={(value) => onSubmit(value)}\n />\n <Box marginTop={1} width=\"100%\" justifyContent=\"flex-end\">\n <Text>\n <Text color={Colors.accent}>ENTER</Text>\n <Text dimColor> submit</Text>\n </Text>\n </Box>\n </Box>\n );\n }\n};\n","/**\n * Capability for MCP clients that are connected by opening a hosted page in\n * the browser rather than writing a local config or running a CLI install.\n *\n * Mirrors the PluginCapable pattern in plugin-client.ts: the client carries the\n * URL and instruction text (product knowledge); the TUI renders whatever the\n * capability surfaces (generic machinery).\n */\n\nexport interface BrowserFinishable {\n /** URL the user opens to finish connecting (also shown as copy-paste fallback). */\n connectorUrl: string;\n /** One-line instruction shown after the page opens. */\n finishInstruction: string;\n}\n\nexport function isBrowserFinishable<T>(c: T): c is T & BrowserFinishable {\n return (\n typeof c === 'object' &&\n c !== null &&\n 'connectorUrl' in c &&\n 'finishInstruction' in c\n );\n}\n","/**\n * McpInstaller — service layer between McpScreen and MCP business logic.\n *\n * Decouples the screen from step internals. Testable, swappable,\n * no dynamic imports in React components.\n */\n\nimport {\n getSupportedClients,\n removeMCPServer,\n getInstalledClients,\n getSupportedPluginClients,\n installPlugins as runPluginInstall,\n} from '@steps/add-mcp-server-to-clients/index';\nimport { ALL_FEATURE_VALUES } from '@steps/add-mcp-server-to-clients/defaults';\nimport { isPluginCapable } from '@steps/add-mcp-server-to-clients/plugin-client';\nimport { isBrowserFinishable } from '@steps/add-mcp-server-to-clients/browser-client';\nimport { logToFile } from '@utils/debug';\nimport { analytics } from '@utils/analytics';\n\nexport interface McpClientInfo {\n name: string;\n supportsPlugin: boolean;\n /**\n * Set for clients connected by opening a hosted page in the browser. The\n * Done screen renders this so the user knows to finish setup in the browser.\n */\n finish?: { url: string; instruction: string };\n}\n\nexport interface McpInstaller {\n /** Detect which MCP-capable editors are available on this machine. */\n detectClients(): Promise<McpClientInfo[]>;\n\n /** Install the PostHog MCP server to the given clients. Returns names of successfully installed clients. */\n install(\n clientNames: string[],\n features?: string[],\n apiKey?: string,\n ): Promise<string[]>;\n\n /** Remove the PostHog MCP server from all installed clients. Returns names of removed clients. */\n remove(): Promise<string[]>;\n\n /** Install the PostHog AI plugin to supported clients. Best-effort: failures do not affect MCP outcome. */\n installPlugins(clientNames: string[]): Promise<string[]>;\n}\n\n/**\n * Production McpInstaller backed by real MCP client detection and installation.\n */\nexport function createMcpInstaller(): McpInstaller {\n // Cache the raw MCPClient objects so install() can reference them by name\n let cachedClients: Array<{ name: string; raw: unknown }> = [];\n\n return {\n async detectClients(): Promise<McpClientInfo[]> {\n const supported = await getSupportedClients();\n cachedClients = supported.map((c) => ({ name: c.name, raw: c }));\n return supported.map((c) => ({\n name: c.name,\n supportsPlugin: isPluginCapable(c) && c.supportsPlugin(),\n finish: isBrowserFinishable(c)\n ? { url: c.connectorUrl, instruction: c.finishInstruction }\n : undefined,\n }));\n },\n\n async install(\n clientNames: string[],\n features?: string[],\n apiKey?: string,\n ): Promise<string[]> {\n const resolvedFeatures = features ?? [...ALL_FEATURE_VALUES];\n const toInstall = cachedClients\n .filter((c) => clientNames.includes(c.name))\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map((c) => c.raw as any);\n\n if (toInstall.length === 0) {\n logToFile(\n `[McpInstaller] No clients matched. clientNames=${JSON.stringify(\n clientNames,\n )}, cached=${JSON.stringify(cachedClients.map((c) => c.name))}`,\n );\n return [];\n }\n\n const installed: string[] = [];\n for (const client of toInstall) {\n try {\n const result = await client.addServer(\n apiKey,\n resolvedFeatures,\n false,\n );\n if (result?.success) {\n installed.push(client.name as string);\n } else {\n logToFile(\n `[McpInstaller] addServer returned success=false for ${client.name}`,\n );\n }\n } catch (err) {\n logToFile(\n `[McpInstaller] addServer threw for ${client.name}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n }\n return installed;\n },\n\n async remove(): Promise<string[]> {\n const installed = await getInstalledClients();\n if (installed.length === 0) return [];\n await removeMCPServer(installed);\n return installed.map((c) => c.name);\n },\n\n async installPlugins(clientNames: string[]): Promise<string[]> {\n const rawClients = cachedClients\n .filter((c) => clientNames.includes(c.name))\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map((c) => c.raw as any);\n\n const pluginClients = getSupportedPluginClients(rawClients);\n const installed = await runPluginInstall(pluginClients);\n\n analytics.wizardCapture('mcp plugins installed', {\n clients: installed,\n attempted: pluginClients.map((c) => c.name),\n });\n\n return installed;\n },\n };\n}\n","/**\n * McpSuggestedPromptsServices — service layer between\n * McpSuggestedPromptsScreen and the network. Decouples the screen from\n * OAuth and the streaming-agent run so the playground can inject mocks\n * (skip login, canned streaming responses) without a special-case\n * branch in the screen itself.\n *\n * Mirrors the McpInstaller pattern: thin interface, production factory\n * that wires the real implementation, no dynamic imports in the React\n * tree.\n */\n\nimport type { Credentials } from '@lib/wizard-session';\nimport { getOrAskForProjectData } from '@utils/setup-utils';\nimport { Program } from '@lib/programs/program-registry';\nimport type { WizardStore } from '@ui/tui/store';\nimport type { ApiUser } from '@lib/api';\n\n/**\n * Discriminated union covering every kind of streamed event the screen\n * needs to render. Production yields these from Claude SDK messages;\n * the playground yields them from canned scripts.\n */\nexport type AgentChunk =\n | { kind: 'text'; text: string }\n | { kind: 'tool-call'; toolName: string; detail: string }\n | { kind: 'tool-result'; toolName: string; detail: string }\n | { kind: 'error'; text: string }\n /** Stream completed. `sessionId` is the SDK session ID of the just-\n * completed turn; pass it back as `resumeSessionId` on a follow-up\n * call to continue the conversation with full history. */\n | { kind: 'done'; sessionId?: string };\n\nexport interface McpSuggestedPromptsServices {\n /**\n * Kicks off the OAuth dance. Production wires this to\n * `getOrAskForProjectData`; the playground returns canned values\n * after a fake delay.\n *\n * While the promise is pending, the implementation is expected to set\n * `session.loginUrl` (via `store.setLoginUrl`) so the screen can\n * render the URL inline. Mocks may set/clear this URL too if they\n * want to exercise the spinner + URL layout.\n */\n performLogin(): Promise<{\n credentials: Credentials;\n roleAtOrganization: string | null;\n user: ApiUser | null;\n }>;\n\n /**\n * Run a prompt against Claude with the PostHog MCP server available\n * for tool use. Yields chunks as the agent streams. Caller is\n * responsible for honoring the abort signal — implementations should\n * also short-circuit when `signal.aborted` becomes true.\n *\n * In production this calls the Claude Agent SDK's `query()` with the\n * user's OAuth token as the MCP Bearer. In the playground, the demo\n * provides canned scripts.\n */\n runPromptStreaming(args: {\n prompt: string;\n credentials: Credentials;\n signal: AbortSignal;\n /** When set, resume the named SDK session so the agent sees the\n * earlier turns as context. Used by follow-up picks; omitted on\n * the first prompt and after `[p]` restarts the conversation. */\n resumeSessionId?: string;\n }): AsyncIterable<AgentChunk>;\n}\n\n/**\n * Production services. The `runPromptStreaming` implementation lives\n * in a separate module so the heavy SDK import is only paid when\n * actually invoked.\n */\nexport function createMcpSuggestedPromptsServices(\n _store: WizardStore,\n): McpSuggestedPromptsServices {\n return {\n performLogin: async () => {\n const result = await getOrAskForProjectData({\n signup: false,\n ci: false,\n apiKey: undefined,\n projectId: undefined,\n email: undefined,\n region: undefined,\n // Widens the OAuth scope grant: base `WIZARD_OAUTH_SCOPES` plus\n // read on every product surface (flags, experiments, surveys,\n // replays, errors, web/LLM analytics, cohorts, persons) plus\n // annotation read/write. Persistence writes (dashboard, insight,\n // notebook) come for free from the base set. See\n // `src/lib/oauth/program-scopes.ts`.\n programId: Program.McpTutorial,\n });\n return {\n credentials: {\n accessToken: result.accessToken,\n projectApiKey: result.projectApiKey,\n host: result.host,\n projectId: result.projectId,\n },\n roleAtOrganization: result.roleAtOrganization,\n user: result.user,\n };\n },\n\n runPromptStreaming: (args) => runProductionPromptStreaming(args),\n };\n}\n\nasync function* runProductionPromptStreaming(args: {\n prompt: string;\n credentials: Credentials;\n signal: AbortSignal;\n resumeSessionId?: string;\n}): AsyncIterable<AgentChunk> {\n // Defer the SDK import to call time — the playground never hits\n // this path (it overrides the whole service object), so demo\n // sessions don't pay the SDK load cost.\n const { runMcpPromptViaSdk } = await import(\n '@lib/agent/mcp-prompt-streaming'\n );\n yield* runMcpPromptViaSdk(args);\n}\n","/**\n * ScreenId registry — maps screen names to React components.\n *\n * Adding a new screen:\n * 1. Create the component in screens/ (or screens/<program>/).\n * 2. Add a `ScreenId` enum entry in screen-sequences.ts.\n * 3. Add an entry here.\n * 4. Reference the screen by name in the program's `steps` array.\n */\n\nimport type { ReactNode } from 'react';\nimport type { WizardStore } from './store.js';\nimport { ScreenId, Overlay, type ScreenName } from './router.js';\n\nimport { HealthCheckScreen } from './screens/health/HealthCheckScreen.js';\nimport { DoctorIntroScreen } from './screens/doctor/DoctorIntroScreen.js';\nimport { DoctorReportScreen } from './screens/doctor/DoctorReportScreen.js';\nimport { SettingsOverrideScreen } from './screens/SettingsOverrideScreen.js';\nimport { ManagedSettingsScreen } from './screens/ManagedSettingsScreen.js';\nimport { PortConflictScreen } from './screens/PortConflictScreen.js';\nimport { ManualAuthCodeScreen } from './screens/ManualAuthCodeScreen.js';\nimport { PostHogIntegrationIntroScreen } from './screens/PostHogIntegrationIntroScreen.js';\nimport { RevenueIntroScreen } from './screens/RevenueIntroScreen.js';\nimport { MigrationIntroScreen } from './screens/MigrationIntroScreen.js';\nimport { SourceMapsIntroScreen } from './screens/SourceMapsIntroScreen.js';\nimport { SourceMapsOutroScreen } from './screens/SourceMapsOutroScreen.js';\nimport { AgentSkillIntroScreen } from './screens/AgentSkillIntroScreen.js';\nimport { AuditIntroScreen } from './screens/audit/AuditIntroScreen.js';\nimport { AuditRunScreen } from './screens/audit/AuditRunScreen.js';\nimport { AuditOutroScreen } from './screens/audit/AuditOutroScreen.js';\nimport { Audit3000IntroScreen } from './screens/audit-3000/Audit3000IntroScreen.js';\nimport { Audit3000RunScreen } from './screens/audit-3000/Audit3000RunScreen.js';\nimport { Audit3000OutroScreen } from './screens/audit-3000/Audit3000OutroScreen.js';\nimport { SetupScreen } from './screens/SetupScreen.js';\nimport { AuthScreen } from './screens/AuthScreen.js';\nimport { RunScreen } from './screens/RunScreen.js';\nimport { McpScreen } from './screens/McpScreen.js';\nimport { McpSuggestedPromptsScreen } from './screens/McpSuggestedPromptsScreen.js';\nimport { KeepSkillsScreen } from './screens/KeepSkillsScreen.js';\nimport { OutroScreen } from './screens/OutroScreen.js';\nimport { ExitScreen } from './screens/ExitScreen.js';\nimport { AuthErrorScreen } from './screens/AuthErrorScreen.js';\nimport { WizardAskScreen } from './screens/WizardAskScreen.js';\nimport { createMcpInstaller } from './services/mcp-installer.js';\nimport type { McpInstaller } from './services/mcp-installer.js';\nimport { createMcpSuggestedPromptsServices } from './services/mcp-suggested-prompts-services.js';\nimport type { McpSuggestedPromptsServices } from './services/mcp-suggested-prompts-services.js';\n\nexport interface ScreenServices {\n mcpInstaller: McpInstaller;\n mcpSuggestedPromptsServices: McpSuggestedPromptsServices;\n}\n\nexport function createServices(store: WizardStore): ScreenServices {\n return {\n mcpInstaller: createMcpInstaller(),\n mcpSuggestedPromptsServices: createMcpSuggestedPromptsServices(store),\n };\n}\n\nexport function createScreens(\n store: WizardStore,\n services: ScreenServices,\n): Record<ScreenName, ReactNode> {\n return {\n // Overlays\n [Overlay.SettingsOverride]: <SettingsOverrideScreen store={store} />,\n [Overlay.ManagedSettings]: <ManagedSettingsScreen store={store} />,\n [Overlay.PortConflict]: <PortConflictScreen store={store} />,\n [Overlay.ManualAuthCode]: <ManualAuthCodeScreen store={store} />,\n [Overlay.AuthError]: <AuthErrorScreen store={store} />,\n [Overlay.WizardAsk]: <WizardAskScreen store={store} />,\n\n // Wizard flow\n [ScreenId.Intro]: <PostHogIntegrationIntroScreen store={store} />,\n [ScreenId.RevenueIntro]: <RevenueIntroScreen store={store} />,\n [ScreenId.SourceMapsIntro]: <SourceMapsIntroScreen store={store} />,\n [ScreenId.SourceMapsOutro]: <SourceMapsOutroScreen store={store} />,\n [ScreenId.MigrationIntro]: <MigrationIntroScreen store={store} />,\n [ScreenId.AgentSkillIntro]: <AgentSkillIntroScreen store={store} />,\n [ScreenId.AuditIntro]: <AuditIntroScreen store={store} />,\n [ScreenId.AuditRun]: <AuditRunScreen store={store} />,\n [ScreenId.AuditOutro]: <AuditOutroScreen store={store} />,\n [ScreenId.Audit3000Intro]: <Audit3000IntroScreen store={store} />,\n [ScreenId.Audit3000Run]: <Audit3000RunScreen store={store} />,\n [ScreenId.Audit3000Outro]: <Audit3000OutroScreen store={store} />,\n [ScreenId.HealthCheck]: <HealthCheckScreen store={store} />,\n [ScreenId.DoctorIntro]: <DoctorIntroScreen store={store} />,\n [ScreenId.DoctorReport]: <DoctorReportScreen store={store} />,\n [ScreenId.Setup]: <SetupScreen store={store} />,\n [ScreenId.Auth]: <AuthScreen store={store} />,\n [ScreenId.Run]: <RunScreen store={store} />,\n [ScreenId.Mcp]: (\n <McpScreen store={store} installer={services.mcpInstaller} />\n ),\n [ScreenId.McpSuggestedPrompts]: (\n <McpSuggestedPromptsScreen\n store={store}\n services={services.mcpSuggestedPromptsServices}\n />\n ),\n [ScreenId.KeepSkills]: <KeepSkillsScreen store={store} />,\n [ScreenId.Outro]: <OutroScreen store={store} />,\n [ScreenId.Exit]: <ExitScreen />,\n\n // Standalone MCP flows\n [ScreenId.McpAdd]: (\n <McpScreen store={store} installer={services.mcpInstaller} />\n ),\n [ScreenId.McpRemove]: (\n <McpScreen\n store={store}\n installer={services.mcpInstaller}\n mode=\"remove\"\n />\n ),\n };\n}\n","import { useMemo } from 'react';\nimport { ScreenContainer } from './primitives/index.js';\nimport type { WizardStore } from './store.js';\nimport { createScreens, createServices } from './screen-registry.js';\n\ninterface AppProps {\n store: WizardStore;\n}\n\nexport const App = ({ store }: AppProps) => {\n const services = useMemo(() => createServices(store), [store]);\n const screens = useMemo(\n () => createScreens(store, services),\n [store, services],\n );\n\n return <ScreenContainer store={store} screens={screens} />;\n};\n","/**\n * start-tui.ts — Sets up the Ink TUI renderer and InkUI.\n *\n * Renders in the terminal's alternate screen buffer so the wizard\n * doesn't pollute scrollback history. On exit, the previous terminal\n * content is restored and a single exit summary line is printed.\n */\n\nimport { render } from 'ink';\nimport { createElement } from 'react';\nimport { WizardStore, Program, type ProgramId } from './store.js';\nimport { InkUI } from './ink-ui.js';\nimport { setUI } from '@ui/index';\nimport { App } from './App.js';\nimport { OutroKind } from '@lib/wizard-session';\n\n// ANSI escape sequences\nconst RESET_ATTRS = '\\x1b[0m';\nconst CLEAR_SCREEN = '\\x1b[2J';\nconst CURSOR_HOME = '\\x1b[H';\nconst BG_BLACK = '\\x1b[48;2;0;0;0m';\nconst ENTER_ALT_SCREEN = '\\x1b[?1049h';\nconst LEAVE_ALT_SCREEN = '\\x1b[?1049l';\nconst GREEN = '\\x1b[32m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\n\nexport function releaseTerminal(): void {\n process.stdout.write(RESET_ATTRS + LEAVE_ALT_SCREEN);\n}\n\nfunction getExitLine(store: WizardStore): string {\n const outro = store.session.outroData;\n const label = store.session.programLabel ?? 'Wizard';\n\n if (outro?.kind === OutroKind.Success) {\n const message = outro.message ?? `${label} completed successfully.`;\n const reportSuffix =\n outro.reportFile && !message.includes(outro.reportFile)\n ? ` Check ./${outro.reportFile} for details.`\n : '';\n return `${GREEN}${BOLD}\\u2714${RESET_ATTRS} ${message}${reportSuffix}`;\n }\n\n return `${DIM}${label} exited.${RESET_ATTRS}`;\n}\n\nexport function startTUI(\n version: string,\n program: ProgramId = Program.PostHogIntegration,\n): {\n unmount: () => void;\n store: WizardStore;\n waitForSetup: () => Promise<void>;\n} {\n // Enter alternate screen buffer, then set up dark background\n process.stdout.write(\n ENTER_ALT_SCREEN + BG_BLACK + CLEAR_SCREEN + CURSOR_HOME,\n );\n\n const store = new WizardStore(program);\n store.version = version;\n\n const inkUI = new InkUI(store);\n setUI(inkUI);\n\n const { unmount: inkUnmount } = render(createElement(App, { store }));\n\n // On exit: unmount Ink, leave alt screen (restores previous content),\n // then print exit summary line into the main buffer.\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n inkUnmount();\n releaseTerminal();\n process.stdout.write(getExitLine(store) + '\\n');\n };\n process.on('exit', cleanup);\n\n return {\n unmount: cleanup,\n store,\n waitForSetup: () => store.getGate('intro'),\n };\n}\n"],"mappings":"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"}
|