@posthog/wizard 2.7.0 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/README.md +11 -0
  2. package/dist/bin.js +289 -162
  3. package/dist/bin.js.map +1 -1
  4. package/dist/src/__tests__/cli.test.js +92 -59
  5. package/dist/src/__tests__/cli.test.js.map +1 -1
  6. package/dist/src/__tests__/wizard-abort.test.js +34 -13
  7. package/dist/src/__tests__/wizard-abort.test.js.map +1 -1
  8. package/dist/src/frameworks/android/android-wizard-agent.js +2 -2
  9. package/dist/src/frameworks/android/android-wizard-agent.js.map +1 -1
  10. package/dist/src/frameworks/angular/angular-wizard-agent.js +2 -2
  11. package/dist/src/frameworks/angular/angular-wizard-agent.js.map +1 -1
  12. package/dist/src/frameworks/astro/astro-wizard-agent.js +2 -2
  13. package/dist/src/frameworks/astro/astro-wizard-agent.js.map +1 -1
  14. package/dist/src/frameworks/django/django-wizard-agent.js +2 -2
  15. package/dist/src/frameworks/django/django-wizard-agent.js.map +1 -1
  16. package/dist/src/frameworks/fastapi/fastapi-wizard-agent.js +2 -2
  17. package/dist/src/frameworks/fastapi/fastapi-wizard-agent.js.map +1 -1
  18. package/dist/src/frameworks/flask/flask-wizard-agent.js +2 -2
  19. package/dist/src/frameworks/flask/flask-wizard-agent.js.map +1 -1
  20. package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.js +2 -2
  21. package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.js.map +1 -1
  22. package/dist/src/frameworks/javascript-web/javascript-web-wizard-agent.js +2 -2
  23. package/dist/src/frameworks/javascript-web/javascript-web-wizard-agent.js.map +1 -1
  24. package/dist/src/frameworks/laravel/laravel-wizard-agent.js +2 -2
  25. package/dist/src/frameworks/laravel/laravel-wizard-agent.js.map +1 -1
  26. package/dist/src/frameworks/nextjs/nextjs-wizard-agent.js +2 -2
  27. package/dist/src/frameworks/nextjs/nextjs-wizard-agent.js.map +1 -1
  28. package/dist/src/frameworks/nuxt/nuxt-wizard-agent.js +2 -2
  29. package/dist/src/frameworks/nuxt/nuxt-wizard-agent.js.map +1 -1
  30. package/dist/src/frameworks/python/python-wizard-agent.js +2 -2
  31. package/dist/src/frameworks/python/python-wizard-agent.js.map +1 -1
  32. package/dist/src/frameworks/rails/rails-wizard-agent.js +2 -2
  33. package/dist/src/frameworks/rails/rails-wizard-agent.js.map +1 -1
  34. package/dist/src/frameworks/react-native/react-native-wizard-agent.js +2 -2
  35. package/dist/src/frameworks/react-native/react-native-wizard-agent.js.map +1 -1
  36. package/dist/src/frameworks/react-router/react-router-wizard-agent.js +2 -2
  37. package/dist/src/frameworks/react-router/react-router-wizard-agent.js.map +1 -1
  38. package/dist/src/frameworks/ruby/ruby-wizard-agent.js +2 -2
  39. package/dist/src/frameworks/ruby/ruby-wizard-agent.js.map +1 -1
  40. package/dist/src/frameworks/svelte/svelte-wizard-agent.js +2 -2
  41. package/dist/src/frameworks/svelte/svelte-wizard-agent.js.map +1 -1
  42. package/dist/src/frameworks/swift/swift-wizard-agent.js +2 -2
  43. package/dist/src/frameworks/swift/swift-wizard-agent.js.map +1 -1
  44. package/dist/src/frameworks/tanstack-router/tanstack-router-wizard-agent.js +2 -2
  45. package/dist/src/frameworks/tanstack-router/tanstack-router-wizard-agent.js.map +1 -1
  46. package/dist/src/frameworks/tanstack-start/tanstack-start-wizard-agent.js +2 -2
  47. package/dist/src/frameworks/tanstack-start/tanstack-start-wizard-agent.js.map +1 -1
  48. package/dist/src/frameworks/vue/vue-wizard-agent.js +2 -2
  49. package/dist/src/frameworks/vue/vue-wizard-agent.js.map +1 -1
  50. package/dist/src/lib/__tests__/agent-interface.test.js +29 -1
  51. package/dist/src/lib/__tests__/agent-interface.test.js.map +1 -1
  52. package/dist/src/lib/agent/__tests__/agent-prompt.test.js +57 -0
  53. package/dist/src/lib/agent/__tests__/agent-prompt.test.js.map +1 -0
  54. package/dist/src/lib/{agent-interface.d.ts → agent/agent-interface.d.ts} +18 -6
  55. package/dist/src/lib/{agent-interface.js → agent/agent-interface.js} +63 -13
  56. package/dist/src/lib/agent/agent-interface.js.map +1 -0
  57. package/dist/src/lib/agent/agent-prompt.d.ts +23 -0
  58. package/dist/src/lib/agent/agent-prompt.js +47 -0
  59. package/dist/src/lib/agent/agent-prompt.js.map +1 -0
  60. package/dist/src/lib/agent/agent-runner.d.ts +78 -0
  61. package/dist/src/lib/agent/agent-runner.js +323 -0
  62. package/dist/src/lib/agent/agent-runner.js.map +1 -0
  63. package/dist/src/lib/agent/commandments.js.map +1 -0
  64. package/dist/src/lib/constants.d.ts +10 -1
  65. package/dist/src/lib/constants.js +13 -1
  66. package/dist/src/lib/constants.js.map +1 -1
  67. package/dist/src/lib/detection/__tests__/context.test.js +72 -0
  68. package/dist/src/lib/detection/__tests__/context.test.js.map +1 -0
  69. package/dist/src/lib/detection/__tests__/features.test.d.ts +1 -0
  70. package/dist/src/lib/detection/__tests__/features.test.js +75 -0
  71. package/dist/src/lib/detection/__tests__/features.test.js.map +1 -0
  72. package/dist/src/lib/detection/__tests__/package-manager.test.d.ts +1 -0
  73. package/dist/src/lib/{__tests__/package-manager-detection.test.js → detection/__tests__/package-manager.test.js} +25 -25
  74. package/dist/src/lib/detection/__tests__/package-manager.test.js.map +1 -0
  75. package/dist/src/lib/detection/context.d.ts +31 -0
  76. package/dist/src/lib/detection/context.js +92 -0
  77. package/dist/src/lib/detection/context.js.map +1 -0
  78. package/dist/src/lib/detection/features.d.ts +16 -0
  79. package/dist/src/lib/detection/features.js +56 -0
  80. package/dist/src/lib/detection/features.js.map +1 -0
  81. package/dist/src/lib/detection/framework.d.ts +14 -0
  82. package/dist/src/lib/detection/framework.js +35 -0
  83. package/dist/src/lib/detection/framework.js.map +1 -0
  84. package/dist/src/lib/detection/index.d.ts +3 -0
  85. package/dist/src/lib/detection/index.js +11 -0
  86. package/dist/src/lib/detection/index.js.map +1 -0
  87. package/dist/src/lib/{package-manager-detection.js → detection/package-manager.js} +3 -3
  88. package/dist/src/lib/detection/package-manager.js.map +1 -0
  89. package/dist/src/lib/framework-config.d.ts +1 -1
  90. package/dist/src/lib/framework-config.js.map +1 -1
  91. package/dist/src/lib/health-checks/endpoints.js +2 -1
  92. package/dist/src/lib/health-checks/endpoints.js.map +1 -1
  93. package/dist/src/lib/middleware/benchmark.js +1 -1
  94. package/dist/src/lib/middleware/benchmark.js.map +1 -1
  95. package/dist/src/lib/middleware/benchmarks/compaction-tracker.js +1 -1
  96. package/dist/src/lib/middleware/benchmarks/compaction-tracker.js.map +1 -1
  97. package/dist/src/lib/middleware/benchmarks/json-writer.js +1 -1
  98. package/dist/src/lib/middleware/benchmarks/json-writer.js.map +1 -1
  99. package/dist/src/lib/middleware/benchmarks/summary.js +1 -1
  100. package/dist/src/lib/middleware/benchmarks/summary.js.map +1 -1
  101. package/dist/src/lib/middleware/config.js +1 -1
  102. package/dist/src/lib/middleware/config.js.map +1 -1
  103. package/dist/src/lib/version.d.ts +1 -1
  104. package/dist/src/lib/version.js +1 -1
  105. package/dist/src/lib/version.js.map +1 -1
  106. package/dist/src/lib/wizard-session.d.ts +20 -7
  107. package/dist/src/lib/wizard-session.js +4 -0
  108. package/dist/src/lib/wizard-session.js.map +1 -1
  109. package/dist/src/lib/wizard-tools.d.ts +28 -1
  110. package/dist/src/lib/wizard-tools.js +24 -0
  111. package/dist/src/lib/wizard-tools.js.map +1 -1
  112. package/dist/src/lib/workflows/__tests__/agent-skill.test.d.ts +1 -0
  113. package/dist/src/lib/workflows/__tests__/agent-skill.test.js +66 -0
  114. package/dist/src/lib/workflows/__tests__/agent-skill.test.js.map +1 -0
  115. package/dist/src/lib/workflows/__tests__/revenue-analytics-detect.test.d.ts +1 -0
  116. package/dist/src/lib/workflows/__tests__/revenue-analytics-detect.test.js +101 -0
  117. package/dist/src/lib/workflows/__tests__/revenue-analytics-detect.test.js.map +1 -0
  118. package/dist/src/lib/workflows/__tests__/workflow-registry.test.d.ts +1 -0
  119. package/dist/src/lib/workflows/__tests__/workflow-registry.test.js +32 -0
  120. package/dist/src/lib/workflows/__tests__/workflow-registry.test.js.map +1 -0
  121. package/dist/src/lib/workflows/__tests__/workflow-step.test.d.ts +1 -0
  122. package/dist/src/lib/workflows/__tests__/workflow-step.test.js +54 -0
  123. package/dist/src/lib/workflows/__tests__/workflow-step.test.js.map +1 -0
  124. package/dist/src/lib/workflows/agent-skill/index.d.ts +44 -0
  125. package/dist/src/lib/workflows/agent-skill/index.js +47 -0
  126. package/dist/src/lib/workflows/agent-skill/index.js.map +1 -0
  127. package/dist/src/lib/workflows/agent-skill/steps.d.ts +8 -0
  128. package/dist/src/lib/workflows/agent-skill/steps.js +32 -0
  129. package/dist/src/lib/workflows/agent-skill/steps.js.map +1 -0
  130. package/dist/src/lib/workflows/posthog-integration/detect.d.ts +12 -0
  131. package/dist/src/lib/workflows/posthog-integration/detect.js +57 -0
  132. package/dist/src/lib/workflows/posthog-integration/detect.js.map +1 -0
  133. package/dist/src/lib/workflows/posthog-integration/index.d.ts +3 -0
  134. package/dist/src/lib/workflows/posthog-integration/index.js +152 -0
  135. package/dist/src/lib/workflows/posthog-integration/index.js.map +1 -0
  136. package/dist/src/lib/workflows/posthog-integration/steps.d.ts +9 -0
  137. package/dist/src/lib/workflows/posthog-integration/steps.js +100 -0
  138. package/dist/src/lib/workflows/posthog-integration/steps.js.map +1 -0
  139. package/dist/src/lib/workflows/revenue-analytics/detect.d.ts +40 -0
  140. package/dist/src/lib/workflows/revenue-analytics/detect.js +156 -0
  141. package/dist/src/lib/workflows/revenue-analytics/detect.js.map +1 -0
  142. package/dist/src/lib/workflows/revenue-analytics/index.d.ts +4 -0
  143. package/dist/src/lib/workflows/revenue-analytics/index.js +30 -0
  144. package/dist/src/lib/workflows/revenue-analytics/index.js.map +1 -0
  145. package/dist/src/lib/workflows/revenue-analytics/steps.d.ts +8 -0
  146. package/dist/src/lib/workflows/revenue-analytics/steps.js +48 -0
  147. package/dist/src/lib/workflows/revenue-analytics/steps.js.map +1 -0
  148. package/dist/src/lib/workflows/workflow-registry.d.ts +18 -0
  149. package/dist/src/lib/workflows/workflow-registry.js +32 -0
  150. package/dist/src/lib/workflows/workflow-registry.js.map +1 -0
  151. package/dist/src/lib/workflows/workflow-step.d.ts +126 -0
  152. package/dist/src/lib/workflows/workflow-step.js +28 -0
  153. package/dist/src/lib/workflows/workflow-step.js.map +1 -0
  154. package/dist/src/steps/add-mcp-server-to-clients/index.d.ts +2 -1
  155. package/dist/src/steps/add-mcp-server-to-clients/index.js.map +1 -1
  156. package/dist/src/ui/logging-ui.d.ts +6 -3
  157. package/dist/src/ui/logging-ui.js +7 -0
  158. package/dist/src/ui/logging-ui.js.map +1 -1
  159. package/dist/src/ui/tui/__tests__/flows.test.d.ts +1 -0
  160. package/dist/src/ui/tui/__tests__/flows.test.js +115 -0
  161. package/dist/src/ui/tui/__tests__/flows.test.js.map +1 -0
  162. package/dist/src/ui/tui/__tests__/router.test.d.ts +1 -0
  163. package/dist/src/ui/tui/__tests__/router.test.js +87 -0
  164. package/dist/src/ui/tui/__tests__/router.test.js.map +1 -0
  165. package/dist/src/ui/tui/__tests__/store.test.js +100 -10
  166. package/dist/src/ui/tui/__tests__/store.test.js.map +1 -1
  167. package/dist/src/ui/tui/flows.d.ts +17 -6
  168. package/dist/src/ui/tui/flows.js +28 -52
  169. package/dist/src/ui/tui/flows.js.map +1 -1
  170. package/dist/src/ui/tui/ink-ui.d.ts +6 -3
  171. package/dist/src/ui/tui/ink-ui.js +7 -0
  172. package/dist/src/ui/tui/ink-ui.js.map +1 -1
  173. package/dist/src/ui/tui/primitives/ProgressList.d.ts +3 -1
  174. package/dist/src/ui/tui/primitives/ProgressList.js +2 -2
  175. package/dist/src/ui/tui/primitives/ProgressList.js.map +1 -1
  176. package/dist/src/ui/tui/router.js +1 -1
  177. package/dist/src/ui/tui/router.js.map +1 -1
  178. package/dist/src/ui/tui/screen-registry.js +2 -0
  179. package/dist/src/ui/tui/screen-registry.js.map +1 -1
  180. package/dist/src/ui/tui/screens/ManagedSettingsScreen.js.map +1 -1
  181. package/dist/src/ui/tui/screens/OutroScreen.js +1 -1
  182. package/dist/src/ui/tui/screens/OutroScreen.js.map +1 -1
  183. package/dist/src/ui/tui/screens/RevenueIntroScreen.d.ts +16 -0
  184. package/dist/src/ui/tui/screens/RevenueIntroScreen.js +64 -0
  185. package/dist/src/ui/tui/screens/RevenueIntroScreen.js.map +1 -0
  186. package/dist/src/ui/tui/screens/RunScreen.js +1 -1
  187. package/dist/src/ui/tui/screens/RunScreen.js.map +1 -1
  188. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js.map +1 -1
  189. package/dist/src/ui/tui/screens/health/HealthCheckScreen.js +2 -2
  190. package/dist/src/ui/tui/screens/health/HealthCheckScreen.js.map +1 -1
  191. package/dist/src/ui/tui/start-tui.js +2 -2
  192. package/dist/src/ui/tui/start-tui.js.map +1 -1
  193. package/dist/src/ui/tui/store.d.ts +46 -21
  194. package/dist/src/ui/tui/store.js +105 -47
  195. package/dist/src/ui/tui/store.js.map +1 -1
  196. package/dist/src/ui/wizard-ui.d.ts +13 -3
  197. package/dist/src/ui/wizard-ui.js.map +1 -1
  198. package/dist/src/utils/__tests__/provisioning.test.d.ts +1 -0
  199. package/dist/src/utils/__tests__/provisioning.test.js +192 -0
  200. package/dist/src/utils/__tests__/provisioning.test.js.map +1 -0
  201. package/dist/src/utils/file-utils.d.ts +8 -0
  202. package/dist/src/utils/file-utils.js +32 -0
  203. package/dist/src/utils/file-utils.js.map +1 -1
  204. package/dist/src/utils/provisioning.d.ts +25 -0
  205. package/dist/src/utils/provisioning.js +191 -0
  206. package/dist/src/utils/provisioning.js.map +1 -0
  207. package/dist/src/utils/setup-utils.d.ts +4 -1
  208. package/dist/src/utils/setup-utils.js +46 -2
  209. package/dist/src/utils/setup-utils.js.map +1 -1
  210. package/dist/src/utils/types.d.ts +4 -0
  211. package/dist/src/utils/types.js.map +1 -1
  212. package/dist/src/utils/wizard-abort.d.ts +3 -0
  213. package/dist/src/utils/wizard-abort.js +5 -3
  214. package/dist/src/utils/wizard-abort.js.map +1 -1
  215. package/npm-shrinkwrap.json +2 -2
  216. package/package.json +1 -1
  217. package/dist/src/__tests__/run.test.js +0 -95
  218. package/dist/src/__tests__/run.test.js.map +0 -1
  219. package/dist/src/lib/__tests__/package-manager-detection.test.js.map +0 -1
  220. package/dist/src/lib/agent-interface.js.map +0 -1
  221. package/dist/src/lib/agent-runner.d.ts +0 -9
  222. package/dist/src/lib/agent-runner.js +0 -383
  223. package/dist/src/lib/agent-runner.js.map +0 -1
  224. package/dist/src/lib/commandments.js.map +0 -1
  225. package/dist/src/lib/package-manager-detection.js.map +0 -1
  226. package/dist/src/run.d.ts +0 -22
  227. package/dist/src/run.js +0 -152
  228. package/dist/src/run.js.map +0 -1
  229. /package/dist/src/{__tests__/run.test.d.ts → lib/agent/__tests__/agent-prompt.test.d.ts} +0 -0
  230. /package/dist/src/lib/{commandments.d.ts → agent/commandments.d.ts} +0 -0
  231. /package/dist/src/lib/{commandments.js → agent/commandments.js} +0 -0
  232. /package/dist/src/lib/{__tests__/package-manager-detection.test.d.ts → detection/__tests__/context.test.d.ts} +0 -0
  233. /package/dist/src/lib/{package-manager-detection.d.ts → detection/package-manager.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RevenueIntroScreen.js","sourceRoot":"","sources":["../../../../../src/ui/tui/screens/RevenueIntroScreen.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * RevenueIntroScreen — Welcome screen for the revenue analytics flow.\n *\n * Renders one of two states:\n * - Detection succeeded: shows detected SDKs + continue/cancel\n * - Detection failed: shows the error + exit prompt\n *\n * Reads `frameworkContext.detectError` and `frameworkContext.detectedPosthogSdks`\n * / `detectedStripeSdks` set by detectRevenuePrerequisites().\n */\n\nimport path from 'path';\nimport { Box, Text } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '../store.js';\nimport { PickerMenu } from '../primitives/index.js';\nimport {\n POSTHOG_SDKS,\n STRIPE_SDKS,\n type RevenueDetectError,\n} from '../../../lib/workflows/revenue-analytics/index.js';\n\ninterface RevenueIntroScreenProps {\n store: WizardStore;\n}\n\nconst WizardTitle = () => (\n <Text bold>\n <Text color=\"#1D4AFF\">{'\\u2588'}</Text>\n <Text color=\"#F54E00\">{'\\u2588'}</Text>\n <Text color=\"#F9BD2B\">{'\\u2588'}</Text>\n {' Revenue Analytics Wizard 💸'}\n </Text>\n);\n\nconst DetectErrorView = ({ error }: { error: RevenueDetectError }) => (\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 />\n </Box>\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={error} />\n </Box>\n </Box>\n\n <PickerMenu\n options={[{ label: 'Exit', value: 'exit' }]}\n onSelect={() => process.exit(1)}\n />\n </Box>\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\nexport const RevenueIntroScreen = ({ store }: RevenueIntroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\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 if (detectError) {\n return <DetectErrorView error={detectError} />;\n }\n\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 />\n\n <Box flexDirection=\"column\" alignItems=\"center\" marginTop={1}>\n <Box marginTop={1}>\n <Text>Let's wire up your revenue dashboards with Stripe!</Text>\n </Box>\n </Box>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>\n <Text>\n Directory <Text color=\"green\">{'\\u2714'}</Text>{' '}\n </Text>\n <Text>\n {'/'}\n {path.basename(session.installDir)}\n </Text>\n </Text>\n\n {detectedPosthogSdks.length > 0 && (\n <Text>\n <Text>\n PostHog <Text color=\"green\">{'\\u2714'}</Text>{' '}\n </Text>\n <Text>{detectedPosthogSdks.join(', ')} (detected)</Text>\n </Text>\n )}\n\n {detectedStripeSdks.length > 0 && (\n <Text>\n <Text>\n Stripe <Text color=\"green\">{'\\u2714'}</Text>{' '}\n </Text>\n <Text>{detectedStripeSdks.join(', ')} (detected)</Text>\n </Text>\n )}\n\n {detectedPackagePaths.length > 1 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor>\n Found in {detectedPackagePaths.length} packages:\n </Text>\n {detectedPackagePaths.map((p) => (\n <Text key={p} dimColor>\n {' '}\n {'\\u2022'} {p}\n </Text>\n ))}\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor>What the wizard will do next:</Text>\n <Text dimColor>\n {'\\u2022'} Links Stripe customers and their purchases to PostHog\n persons\n </Text>\n <Text dimColor>\n {'\\u2022'} Unlocks analytics like revenue per user, top customers,\n and lifetime value\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <PickerMenu\n options={[\n { label: 'Continue', value: 'continue' },\n { label: 'Cancel', value: 'cancel' },\n ]}\n onSelect={(value) => {\n const choice = Array.isArray(value) ? value[0] : value;\n if (choice === 'cancel') {\n process.exit(0);\n } else {\n store.completeSetup();\n }\n }}\n />\n </Box>\n </Box>\n </Box>\n );\n};\n"]}
@@ -39,7 +39,7 @@ export const RunScreen = ({ store }) => {
39
39
  }
40
40
  const statuses = store.statusMessages.length > 0 ? store.statusMessages : undefined;
41
41
  const leftPane = store.learnCardComplete ? (_jsx(TipsCard, { store: store })) : (_jsx(LearnCard, { store: store, onComplete: () => store.setLearnCardComplete() }));
42
- const progressList = _jsx(ProgressList, { items: progressItems, title: "Tasks" });
42
+ const progressList = (_jsx(ProgressList, { items: progressItems, title: "Tasks", workflowLabel: store.session.workflowLabel, skillId: store.session.skillId }));
43
43
  // On narrow terminals, drop the learn pane and show only progress
44
44
  const statusComponent = columns < 80 ? (_jsx(Box, { flexDirection: "column", flexGrow: 1, children: progressList })) : (_jsx(SplitView, { left: leftPane, right: progressList }));
45
45
  const tabs = [
@@ -1 +1 @@
1
- {"version":3,"file":"RunScreen.js","sourceRoot":"","sources":["../../../../../src/ui/tui/screens/RunScreen.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * RunScreen — Tabbed observational view of the agent run.\n *\n * Two tabs:\n * - Status: SplitView with LearnCard (left) + ProgressList (right)\n * - Logs: LogViewer tailing the wizard log file\n *\n * No prompts — the agent runs headlessly.\n * LearnCard shows animated educational content and reacts to discovered features.\n */\n\nimport { useSyncExternalStore } from 'react';\nimport { Box } from 'ink';\nimport type { WizardStore } from '../store.js';\nimport {\n TabContainer,\n SplitView,\n ProgressList,\n LogViewer,\n EventPlanViewer,\n HNViewer,\n} from '../primitives/index.js';\nimport type { ProgressItem } from '../primitives/index.js';\nimport { ADDITIONAL_FEATURE_LABELS } from '../../../lib/wizard-session.js';\nimport { LearnCard } from '../components/LearnCard.js';\nimport { TipsCard } from '../components/TipsCard.js';\nimport { useStdoutDimensions } from '../hooks/useStdoutDimensions.js';\n\nconst LOG_FILE = '/tmp/posthog-wizard.log';\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 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 const leftPane = store.learnCardComplete ? (\n <TipsCard store={store} />\n ) : (\n <LearnCard store={store} onComplete={() => store.setLearnCardComplete()} />\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 {\n id: 'status',\n label: 'Status',\n component: statusComponent,\n },\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={LOG_FILE} />,\n },\n {\n id: 'hn',\n label: 'HN',\n component: <HNViewer />,\n },\n ];\n\n return (\n <TabContainer\n tabs={tabs}\n statusMessage={statuses}\n expandableStatus\n store={store}\n />\n );\n};\n"]}
1
+ {"version":3,"file":"RunScreen.js","sourceRoot":"","sources":["../../../../../src/ui/tui/screens/RunScreen.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * RunScreen — Tabbed observational view of the agent run.\n *\n * Two tabs:\n * - Status: SplitView with LearnCard (left) + ProgressList (right)\n * - Logs: LogViewer tailing the wizard log file\n *\n * No prompts — the agent runs headlessly.\n * LearnCard shows animated educational content and reacts to discovered features.\n */\n\nimport { useSyncExternalStore } from 'react';\nimport { Box } from 'ink';\nimport type { WizardStore } from '../store.js';\nimport {\n TabContainer,\n SplitView,\n ProgressList,\n LogViewer,\n EventPlanViewer,\n HNViewer,\n} from '../primitives/index.js';\nimport type { ProgressItem } from '../primitives/index.js';\nimport { ADDITIONAL_FEATURE_LABELS } from '../../../lib/wizard-session.js';\nimport { LearnCard } from '../components/LearnCard.js';\nimport { TipsCard } from '../components/TipsCard.js';\nimport { useStdoutDimensions } from '../hooks/useStdoutDimensions.js';\n\nconst LOG_FILE = '/tmp/posthog-wizard.log';\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 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 const leftPane = store.learnCardComplete ? (\n <TipsCard store={store} />\n ) : (\n <LearnCard store={store} onComplete={() => store.setLearnCardComplete()} />\n );\n const progressList = (\n <ProgressList\n items={progressItems}\n title=\"Tasks\"\n workflowLabel={store.session.workflowLabel}\n skillId={store.session.skillId}\n />\n );\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 {\n id: 'status',\n label: 'Status',\n component: statusComponent,\n },\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={LOG_FILE} />,\n },\n {\n id: 'hn',\n label: 'HN',\n component: <HNViewer />,\n },\n ];\n\n return (\n <TabContainer\n tabs={tabs}\n statusMessage={statuses}\n expandableStatus\n store={store}\n />\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsOverrideScreen.js","sourceRoot":"","sources":["../../../../../src/ui/tui/screens/SettingsOverrideScreen.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAGrC,SAAS,UAAU,CAAC,MAA8B;IAChD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,uBAAuB,CAAC;QACjC,KAAK,SAAS;YACZ,OAAO,+DAA+D,CAAC;QACzE;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAMD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,EACrC,KAAK,GACuB,EAAE,EAAE;IAChC,oBAAoB,CAClB,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,EAC3B,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAC1B,CAAC;IAEF,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE7E,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,MAAC,YAAY,IACX,WAAW,EAAC,KAAK,EACjB,KAAK,EAAE,GAAG,KAAK,CAAC,OAAO,oBAAoB,EAC3C,KAAK,EAAE,EAAE,EACT,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,EAC1D,MAAM,EACJ,KAAC,iBAAiB,IAChB,OAAO,EAAC,yCAAyC,EACjD,YAAY,EAAC,2BAA2B,EACxC,WAAW,EAAC,YAAY,EACxB,SAAS,EAAE,GAAG,EAAE;gBACd,MAAM,EAAE,GAAG,KAAK,CAAC,4BAA4B,EAAE,CAAC;gBAChD,IAAI,CAAC,EAAE,EAAE,CAAC;oBACR,WAAW,CAAC,sCAAsC,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC,EACD,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAC/B,aAGH,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAC3B,MAAC,GAAG,IAAuB,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aAC/D,MAAC,IAAI,wCACmB,GAAG,EACzB,KAAC,IAAI,IAAC,IAAI,kBAAE,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAQ,cAC1C,EACP,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAE,CAAC,YACvC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAC1B,MAAC,IAAI,eACF,KAAK,CAAC,MAAM,EAAE,GAAG,EAClB,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,kBACtB,GAAG,GACC,KAJE,GAAG,CAKP,CACR,CAAC,GACE,KAdE,QAAQ,CAAC,MAAM,CAenB,CACP,CAAC,EACF,KAAC,IAAI,IAAC,QAAQ,8JAGP,IACM,CAChB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { Box, Text } from 'ink';\nimport { useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '../store.js';\nimport { ConfirmationInput, ModalOverlay } from '../primitives/index.js';\nimport { Icons } from '../styles.js';\nimport type { SettingsConflictSource } from '../../../lib/agent-interface.js';\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"]}
1
+ {"version":3,"file":"SettingsOverrideScreen.js","sourceRoot":"","sources":["../../../../../src/ui/tui/screens/SettingsOverrideScreen.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAGrC,SAAS,UAAU,CAAC,MAA8B;IAChD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,uBAAuB,CAAC;QACjC,KAAK,SAAS;YACZ,OAAO,+DAA+D,CAAC;QACzE;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAMD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,EACrC,KAAK,GACuB,EAAE,EAAE;IAChC,oBAAoB,CAClB,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,EAC3B,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAC1B,CAAC;IAEF,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE7E,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,MAAC,YAAY,IACX,WAAW,EAAC,KAAK,EACjB,KAAK,EAAE,GAAG,KAAK,CAAC,OAAO,oBAAoB,EAC3C,KAAK,EAAE,EAAE,EACT,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,EAC1D,MAAM,EACJ,KAAC,iBAAiB,IAChB,OAAO,EAAC,yCAAyC,EACjD,YAAY,EAAC,2BAA2B,EACxC,WAAW,EAAC,YAAY,EACxB,SAAS,EAAE,GAAG,EAAE;gBACd,MAAM,EAAE,GAAG,KAAK,CAAC,4BAA4B,EAAE,CAAC;gBAChD,IAAI,CAAC,EAAE,EAAE,CAAC;oBACR,WAAW,CAAC,sCAAsC,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC,EACD,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAC/B,aAGH,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAC3B,MAAC,GAAG,IAAuB,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aAC/D,MAAC,IAAI,wCACmB,GAAG,EACzB,KAAC,IAAI,IAAC,IAAI,kBAAE,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAQ,cAC1C,EACP,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAE,CAAC,YACvC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAC1B,MAAC,IAAI,eACF,KAAK,CAAC,MAAM,EAAE,GAAG,EAClB,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,kBACtB,GAAG,GACC,KAJE,GAAG,CAKP,CACR,CAAC,GACE,KAdE,QAAQ,CAAC,MAAM,CAenB,CACP,CAAC,EACF,KAAC,IAAI,IAAC,QAAQ,8JAGP,IACM,CAChB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { Box, Text } from 'ink';\nimport { useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '../store.js';\nimport { ConfirmationInput, ModalOverlay } from '../primitives/index.js';\nimport { Icons } from '../styles.js';\nimport type { SettingsConflictSource } from '../../../lib/agent/agent-interface.js';\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"]}
@@ -16,6 +16,7 @@ import { getBlockingServiceKeys } from '../../../../lib/health-checks/readiness.
16
16
  import { ServiceHealthStatus } from '../../../../lib/health-checks/types.js';
17
17
  import { wizardAbort } from '../../../../utils/wizard-abort.js';
18
18
  import { fetchSkillMenu, downloadSkill } from '../../../../lib/wizard-tools.js';
19
+ import { REMOTE_SKILLS_BASE_URL } from '../../../../lib/constants.js';
19
20
  const EXAMPLE_PROMPT = 'Integrate PostHog into this project using the skill files in .posthog/skills/. Read SKILL.md first, then follow the numbered workflow files in order.';
20
21
  const SkillsDownloadedScreen = () => {
21
22
  useInput(() => {
@@ -52,8 +53,7 @@ export const HealthCheckScreen = ({ store }) => {
52
53
  if (downloading)
53
54
  return;
54
55
  setDownloading(true);
55
- const skillsBaseUrl = 'https://github.com/PostHog/context-mill/releases/latest/download';
56
- const menu = await fetchSkillMenu(skillsBaseUrl);
56
+ const menu = await fetchSkillMenu(REMOTE_SKILLS_BASE_URL);
57
57
  if (menu) {
58
58
  const prefix = `integration-${integration}`;
59
59
  const skills = (menu.categories['integration'] ?? []).filter((s) => s.id.startsWith(prefix));
@@ -1 +1 @@
1
- {"version":3,"file":"HealthCheckScreen.js","sourceRoot":"","sources":["../../../../../../src/ui/tui/screens/health/HealthCheckScreen.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * HealthCheckScreen — Flow 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 '../../store.js';\nimport {\n ConfirmationInput,\n LoadingBox,\n ModalOverlay,\n} from '../../primitives/index.js';\nimport { Colors, Icons } from '../../styles.js';\nimport { ServiceHealthList } from '../../components/ServiceHealthList.js';\nimport { getBlockingServiceKeys } from '../../../../lib/health-checks/readiness.js';\nimport { ServiceHealthStatus } from '../../../../lib/health-checks/types.js';\nimport { wizardAbort } from '../../../../utils/wizard-abort.js';\nimport { fetchSkillMenu, downloadSkill } from '../../../../lib/wizard-tools.js';\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 workflow 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 // Healthy or warnings — isComplete returns true, router skips past.\n // This branch only renders for a single frame before advancing.\n const blockingKeys = getBlockingServiceKeys(result.health);\n if (blockingKeys.length === 0) return null;\n\n const isGithubReleasesDown = blockingKeys.includes('githubReleases');\n const canDownloadSkills =\n result.health.githubReleases.status === ServiceHealthStatus.Healthy;\n const integration = store.session.integration;\n\n const title = `Ongoing service disruptions`;\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 : 'The Wizard may not work reliably while services are affected.';\n\n const handleDownloadAndExit = async () => {\n if (downloading) return;\n setDownloading(true);\n const skillsBaseUrl =\n 'https://github.com/PostHog/context-mill/releases/latest/download';\n const menu = await fetchSkillMenu(skillsBaseUrl);\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 // Blocking outage — show service list with Continue/Exit\n return (\n <ModalOverlay\n borderColor=\"red\"\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={blockingKeys}\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"]}
1
+ {"version":3,"file":"HealthCheckScreen.js","sourceRoot":"","sources":["../../../../../../src/ui/tui/screens/health/HealthCheckScreen.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * HealthCheckScreen — Flow 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 '../../store.js';\nimport {\n ConfirmationInput,\n LoadingBox,\n ModalOverlay,\n} from '../../primitives/index.js';\nimport { Colors, Icons } from '../../styles.js';\nimport { ServiceHealthList } from '../../components/ServiceHealthList.js';\nimport { getBlockingServiceKeys } from '../../../../lib/health-checks/readiness.js';\nimport { ServiceHealthStatus } from '../../../../lib/health-checks/types.js';\nimport { wizardAbort } from '../../../../utils/wizard-abort.js';\nimport { fetchSkillMenu, downloadSkill } from '../../../../lib/wizard-tools.js';\nimport { REMOTE_SKILLS_BASE_URL } from '../../../../lib/constants.js';\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 workflow 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 // Healthy or warnings — isComplete returns true, router skips past.\n // This branch only renders for a single frame before advancing.\n const blockingKeys = getBlockingServiceKeys(result.health);\n if (blockingKeys.length === 0) return null;\n\n const isGithubReleasesDown = blockingKeys.includes('githubReleases');\n const canDownloadSkills =\n result.health.githubReleases.status === ServiceHealthStatus.Healthy;\n const integration = store.session.integration;\n\n const title = `Ongoing service disruptions`;\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 : 'The Wizard may not work reliably while services are affected.';\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 // Blocking outage — show service list with Continue/Exit\n return (\n <ModalOverlay\n borderColor=\"red\"\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={blockingKeys}\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"]}
@@ -14,7 +14,7 @@ const CURSOR_HOME = '\x1b[H';
14
14
  const BG_BLACK = '\x1b[48;2;0;0;0m';
15
15
  /** Set background to true black, clear screen, cursor to top-left. */
16
16
  const FORCE_DARK = BG_BLACK + CLEAR_SCREEN + CURSOR_HOME;
17
- export function startTUI(version, flow = Flow.Wizard) {
17
+ export function startTUI(version, flow = Flow.PostHogIntegration) {
18
18
  // Force dark background regardless of terminal theme
19
19
  process.stdout.write(FORCE_DARK);
20
20
  const store = new WizardStore(flow);
@@ -35,7 +35,7 @@ export function startTUI(version, flow = Flow.Wizard) {
35
35
  cleanup();
36
36
  },
37
37
  store,
38
- waitForSetup: () => store.setupComplete,
38
+ waitForSetup: () => store.getGate('intro'),
39
39
  };
40
40
  }
41
41
  //# sourceMappingURL=start-tui.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"start-tui.js","sourceRoot":"","sources":["../../../../src/ui/tui/start-tui.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,wBAAwB;AACxB,MAAM,WAAW,GAAG,SAAS,CAAC;AAC9B,MAAM,YAAY,GAAG,SAAS,CAAC;AAC/B,MAAM,WAAW,GAAG,QAAQ,CAAC;AAC7B,MAAM,QAAQ,GAAG,kBAAkB,CAAC;AAEpC,sEAAsE;AACtE,MAAM,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,CAAC;AAEzD,MAAM,UAAU,QAAQ,CACtB,OAAe,EACf,OAAa,IAAI,CAAC,MAAM;IAMxB,qDAAqD;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAEjC,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;IACpC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;IAExB,oBAAoB;IACpB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/B,KAAK,CAAC,KAAK,CAAC,CAAC;IAEb,qBAAqB;IACrB,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAEtE,yBAAyB;IACzB,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,YAAY,GAAG,WAAW,CAAC,CAAC;IACjE,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE5B,OAAO;QACL,OAAO,EAAE,GAAG,EAAE;YACZ,UAAU,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK;QACL,YAAY,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,aAAa;KACxC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * start-tui.ts — Sets up the Ink TUI renderer and InkUI.\n */\n\nimport { render } from 'ink';\nimport { createElement } from 'react';\nimport { WizardStore, Flow } from './store.js';\nimport { InkUI } from './ink-ui.js';\nimport { setUI } from '../index.js';\nimport { App } from './App.js';\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';\n\n/** Set background to true black, clear screen, cursor to top-left. */\nconst FORCE_DARK = BG_BLACK + CLEAR_SCREEN + CURSOR_HOME;\n\nexport function startTUI(\n version: string,\n flow: Flow = Flow.Wizard,\n): {\n unmount: () => void;\n store: WizardStore;\n waitForSetup: () => Promise<void>;\n} {\n // Force dark background regardless of terminal theme\n process.stdout.write(FORCE_DARK);\n\n const store = new WizardStore(flow);\n store.version = version;\n\n // Swap in the InkUI\n const inkUI = new InkUI(store);\n setUI(inkUI);\n\n // Render the Ink app\n const { unmount: inkUnmount } = render(createElement(App, { store }));\n\n // Reset terminal on exit\n const cleanup = () => {\n process.stdout.write(RESET_ATTRS + CLEAR_SCREEN + CURSOR_HOME);\n };\n process.on('exit', cleanup);\n\n return {\n unmount: () => {\n inkUnmount();\n cleanup();\n },\n store,\n waitForSetup: () => store.setupComplete,\n };\n}\n"]}
1
+ {"version":3,"file":"start-tui.js","sourceRoot":"","sources":["../../../../src/ui/tui/start-tui.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,wBAAwB;AACxB,MAAM,WAAW,GAAG,SAAS,CAAC;AAC9B,MAAM,YAAY,GAAG,SAAS,CAAC;AAC/B,MAAM,WAAW,GAAG,QAAQ,CAAC;AAC7B,MAAM,QAAQ,GAAG,kBAAkB,CAAC;AAEpC,sEAAsE;AACtE,MAAM,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,CAAC;AAEzD,MAAM,UAAU,QAAQ,CACtB,OAAe,EACf,OAAa,IAAI,CAAC,kBAAkB;IAMpC,qDAAqD;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAEjC,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;IACpC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;IAExB,oBAAoB;IACpB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/B,KAAK,CAAC,KAAK,CAAC,CAAC;IAEb,qBAAqB;IACrB,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAEtE,yBAAyB;IACzB,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,YAAY,GAAG,WAAW,CAAC,CAAC;IACjE,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE5B,OAAO;QACL,OAAO,EAAE,GAAG,EAAE;YACZ,UAAU,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK;QACL,YAAY,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;KAC3C,CAAC;AACJ,CAAC","sourcesContent":["/**\n * start-tui.ts — Sets up the Ink TUI renderer and InkUI.\n */\n\nimport { render } from 'ink';\nimport { createElement } from 'react';\nimport { WizardStore, Flow } from './store.js';\nimport { InkUI } from './ink-ui.js';\nimport { setUI } from '../index.js';\nimport { App } from './App.js';\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';\n\n/** Set background to true black, clear screen, cursor to top-left. */\nconst FORCE_DARK = BG_BLACK + CLEAR_SCREEN + CURSOR_HOME;\n\nexport function startTUI(\n version: string,\n flow: Flow = Flow.PostHogIntegration,\n): {\n unmount: () => void;\n store: WizardStore;\n waitForSetup: () => Promise<void>;\n} {\n // Force dark background regardless of terminal theme\n process.stdout.write(FORCE_DARK);\n\n const store = new WizardStore(flow);\n store.version = version;\n\n // Swap in the InkUI\n const inkUI = new InkUI(store);\n setUI(inkUI);\n\n // Render the Ink app\n const { unmount: inkUnmount } = render(createElement(App, { store }));\n\n // Reset terminal on exit\n const cleanup = () => {\n process.stdout.write(RESET_ATTRS + CLEAR_SCREEN + CURSOR_HOME);\n };\n process.on('exit', cleanup);\n\n return {\n unmount: () => {\n inkUnmount();\n cleanup();\n },\n store,\n waitForSetup: () => store.getGate('intro'),\n };\n}\n"]}
@@ -2,16 +2,20 @@
2
2
  * WizardStore — Nanostore-backed reactive store for the TUI.
3
3
  * React components subscribe via useSyncExternalStore.
4
4
  *
5
- * Navigation is delegated to WizardRouter.
6
- * The active screen is derived from session state not imperatively set.
7
- * Overlays (settings-override, port-conflict) are the only imperative navigation.
5
+ * The active screen is derived from session state — WizardRouter walks
6
+ * the flow and shows the first step whose `isComplete` is still false.
7
+ *
8
+ * Define a step `gate` if your screen needs to await user interactions.
9
+ * bin.ts calls `await store.getGate(stepId)` to pause until the gate
10
+ * predicate becomes true.
8
11
  *
9
12
  * All session mutations that affect screen resolution go through
10
13
  * explicit setters so emitChange() is always called.
11
14
  */
12
15
  import { TaskStatus } from '../wizard-ui.js';
13
16
  import { type WizardSession, type OutroData, type DiscoveredFeature, AdditionalFeature, McpOutcome, RunPhase } from '../../lib/wizard-session.js';
14
- import type { SettingsConflict } from '../../lib/agent-interface.js';
17
+ import type { SettingsConflict } from '../../lib/agent/agent-interface.js';
18
+ import type { WizardReadinessResult } from '../../lib/health-checks/readiness.js';
15
19
  import { WizardRouter, type ScreenName, Screen, Overlay, Flow } from './router.js';
16
20
  export { TaskStatus, Screen, Overlay, Flow, RunPhase, McpOutcome };
17
21
  export type { ScreenName, OutroData, WizardSession };
@@ -39,32 +43,52 @@ export declare class WizardStore {
39
43
  private _lastScreen;
40
44
  /** Hooks run when transitioning onto a screen. */
41
45
  private _enterScreenHooks;
46
+ /** Gate promises derived from workflow step definitions. */
47
+ private _gates;
42
48
  version: string;
43
49
  /** Navigation router — resolves active screen from session state. */
44
50
  readonly router: WizardRouter;
45
- /**
46
- * Setup promise — IntroScreen resolves this when the user confirms.
47
- * bin.ts awaits it before calling runWizard.
48
- */
49
- private _resolveSetup;
50
- readonly setupComplete: Promise<void>;
51
51
  /** Blocks agent execution until the settings-override overlay is dismissed. */
52
52
  private _resolveSettingsOverride;
53
53
  private _backupAndFixSettings;
54
54
  /** Blocks OAuth flow until the port-conflict overlay is dismissed. */
55
55
  private _resolvePortConflict;
56
+ constructor(flow?: Flow);
56
57
  /**
57
- * Resolves when the health-check screen is done either auto-advanced
58
- * (healthy) or user-dismissed (outage). bin.ts awaits this before runWizard().
58
+ * Scan workflow steps for gate predicates and onInit callbacks.
59
+ * Creates gate promises and fires init work.
59
60
  */
60
- private _resolveHealthGate;
61
- readonly healthGateComplete: Promise<void>;
62
- constructor(flow?: Flow);
61
+ private _initFromWorkflow;
62
+ /**
63
+ * Run all `onReady` hooks declared by the current flow's steps, in
64
+ * order. Must be called after `store.session = session` so hooks see
65
+ * the real installDir. bin.ts calls this generically — it doesn't
66
+ * need to know which workflow has which pre-flow work.
67
+ */
68
+ runReadyHooks(): Promise<void>;
69
+ /**
70
+ * Get a gate promise by step ID — the primary blocking checkpoint API
71
+ * for bin.ts. `await store.getGate('...')` parks the caller until the
72
+ * corresponding workflow step's gate predicate flips to true (if the
73
+ * predicate stays false, the caller stays parked indefinitely — the
74
+ * TUI keeps rendering so the user can resolve whatever is blocking).
75
+ *
76
+ * If the workflow doesn't define a step with this ID, or the step
77
+ * has no `gate` predicate, this returns an already-resolved promise
78
+ * so bin.ts flows straight through. This lets workflows opt in to
79
+ * gates on a per-step basis without bin.ts needing to know which
80
+ * gates exist in which flow.
81
+ */
82
+ getGate(stepId: string): Promise<void>;
63
83
  /**
64
- * Kick off the health check. Stores the result and resolves the
65
- * health gate if non-blocking.
84
+ * Re-evaluate every gate predicate against the current session and
85
+ * resolve any whose predicate now returns true. Called after every
86
+ * emitChange(), so gates unblock as soon as the session mutation
87
+ * that satisfies them lands. Gates only resolve once — a predicate
88
+ * that goes true → false → true will NOT re-block a caller that
89
+ * already awaited through.
66
90
  */
67
- private _initHealthCheck;
91
+ private _checkGates;
68
92
  get session(): WizardSession;
69
93
  set session(value: WizardSession);
70
94
  get statusMessages(): string[];
@@ -73,7 +97,7 @@ export declare class WizardStore {
73
97
  get statusExpanded(): boolean;
74
98
  toggleStatusExpanded(): void;
75
99
  setStatusExpanded(expanded: boolean): void;
76
- /** Unblocks bin.ts via the setupComplete promise. */
100
+ /** Sets setupConfirmed. Gate resolves via _checkGates(). */
77
101
  completeSetup(): void;
78
102
  setRunPhase(phase: RunPhase): void;
79
103
  setCredentials(credentials: WizardSession['credentials']): void;
@@ -86,8 +110,8 @@ export declare class WizardStore {
86
110
  docsUrl: string;
87
111
  }): void;
88
112
  setLoginUrl(url: string | null): void;
89
- setReadinessResult(result: import('../../lib/health-checks/readiness.js').WizardReadinessResult | null): void;
90
- /** User dismissed the blocking outage screen. Unblocks bin.ts. */
113
+ setReadinessResult(result: WizardReadinessResult | null): void;
114
+ /** User dismissed the blocking outage screen. Gate resolves via _checkGates(). */
91
115
  dismissOutage(): void;
92
116
  /**
93
117
  * Push the settings-override overlay and return a promise that blocks
@@ -133,6 +157,7 @@ export declare class WizardStore {
133
157
  /**
134
158
  * Notify React that state has changed.
135
159
  * The router re-resolves the active screen on next render.
160
+ * Gate predicates are checked and resolved if ready.
136
161
  */
137
162
  emitChange(): void;
138
163
  pushOverlay(overlay: Overlay): void;
@@ -2,9 +2,12 @@
2
2
  * WizardStore — Nanostore-backed reactive store for the TUI.
3
3
  * React components subscribe via useSyncExternalStore.
4
4
  *
5
- * Navigation is delegated to WizardRouter.
6
- * The active screen is derived from session state not imperatively set.
7
- * Overlays (settings-override, port-conflict) are the only imperative navigation.
5
+ * The active screen is derived from session state — WizardRouter walks
6
+ * the flow and shows the first step whose `isComplete` is still false.
7
+ *
8
+ * Define a step `gate` if your screen needs to await user interactions.
9
+ * bin.ts calls `await store.getGate(stepId)` to pause until the gate
10
+ * predicate becomes true.
8
11
  *
9
12
  * All session mutations that affect screen resolution go through
10
13
  * explicit setters so emitChange() is always called.
@@ -14,7 +17,7 @@ import { TaskStatus } from '../wizard-ui.js';
14
17
  import { AdditionalFeature, McpOutcome, RunPhase, buildSession, } from '../../lib/wizard-session.js';
15
18
  import { WizardRouter, Screen, Overlay, Flow, } from './router.js';
16
19
  import { analytics, sessionProperties } from '../../utils/analytics.js';
17
- import { evaluateWizardReadiness, WizardReadiness, } from '../../lib/health-checks/readiness.js';
20
+ import { WORKFLOW_STEPS } from './flows.js';
18
21
  export { TaskStatus, Screen, Overlay, Flow, RunPhase, McpOutcome };
19
22
  export class WizardStore {
20
23
  // ── Internal nanostore atoms ─────────────────────────────────────
@@ -30,61 +33,116 @@ export class WizardStore {
30
33
  _lastScreen = null;
31
34
  /** Hooks run when transitioning onto a screen. */
32
35
  _enterScreenHooks = new Map();
36
+ /** Gate promises derived from workflow step definitions. */
37
+ _gates = new Map();
33
38
  version = '';
34
39
  /** Navigation router — resolves active screen from session state. */
35
40
  router;
36
- /**
37
- * Setup promise — IntroScreen resolves this when the user confirms.
38
- * bin.ts awaits it before calling runWizard.
39
- */
40
- _resolveSetup;
41
- setupComplete = new Promise((resolve) => {
42
- this._resolveSetup = resolve;
43
- });
44
41
  /** Blocks agent execution until the settings-override overlay is dismissed. */
45
42
  _resolveSettingsOverride = null;
46
43
  _backupAndFixSettings = null;
47
44
  /** Blocks OAuth flow until the port-conflict overlay is dismissed. */
48
45
  _resolvePortConflict = null;
46
+ constructor(flow = Flow.PostHogIntegration) {
47
+ this.router = new WizardRouter(flow);
48
+ this._initFromWorkflow(flow);
49
+ }
49
50
  /**
50
- * Resolves when the health-check screen is done either auto-advanced
51
- * (healthy) or user-dismissed (outage). bin.ts awaits this before runWizard().
51
+ * Scan workflow steps for gate predicates and onInit callbacks.
52
+ * Creates gate promises and fires init work.
52
53
  */
53
- _resolveHealthGate;
54
- healthGateComplete = new Promise((resolve) => {
55
- this._resolveHealthGate = resolve;
56
- });
57
- constructor(flow = Flow.Wizard) {
58
- this.router = new WizardRouter(flow);
59
- // Fire health check immediately for Wizard flow so results arrive
60
- // while the user is still on IntroScreen.
61
- if (flow === Flow.Wizard) {
62
- this._initHealthCheck();
54
+ _initFromWorkflow(flow) {
55
+ const steps = WORKFLOW_STEPS[flow];
56
+ if (!steps)
57
+ return;
58
+ // Create gate promises from steps that define them
59
+ for (const step of steps) {
60
+ if (step.gate) {
61
+ let resolve;
62
+ const promise = new Promise((r) => {
63
+ resolve = r;
64
+ });
65
+ this._gates.set(step.id, {
66
+ predicate: step.gate,
67
+ promise,
68
+ resolve,
69
+ resolved: false,
70
+ });
71
+ }
63
72
  }
64
- else {
65
- this._resolveHealthGate();
73
+ // Run onInit callbacks with a minimal context interface.
74
+ // Arrow functions capture `this` from _initFromWorkflow so we don't
75
+ // need to alias it.
76
+ const getSession = () => this.session;
77
+ const ctx = {
78
+ get session() {
79
+ return getSession();
80
+ },
81
+ setReadinessResult: (r) => this.setReadinessResult(r),
82
+ setFrameworkContext: (k, v) => this.setFrameworkContext(k, v),
83
+ emitChange: () => this.emitChange(),
84
+ };
85
+ for (const step of steps) {
86
+ step.onInit?.(ctx);
66
87
  }
67
88
  }
68
89
  /**
69
- * Kick off the health check. Stores the result and resolves the
70
- * health gate if non-blocking.
90
+ * Run all `onReady` hooks declared by the current flow's steps, in
91
+ * order. Must be called after `store.session = session` so hooks see
92
+ * the real installDir. bin.ts calls this generically — it doesn't
93
+ * need to know which workflow has which pre-flow work.
71
94
  */
72
- _initHealthCheck() {
73
- evaluateWizardReadiness()
74
- .then((readiness) => {
75
- this.setReadinessResult(readiness);
76
- if (readiness.decision !== WizardReadiness.No) {
77
- this._resolveHealthGate();
95
+ async runReadyHooks() {
96
+ const steps = WORKFLOW_STEPS[this.router.activeFlow];
97
+ if (!steps)
98
+ return;
99
+ const ctx = {
100
+ session: this.session,
101
+ setFrameworkContext: (k, v) => this.setFrameworkContext(k, v),
102
+ setFrameworkConfig: (i, c) => this.setFrameworkConfig(i, c),
103
+ setDetectedFramework: (l) => this.setDetectedFramework(l),
104
+ setUnsupportedVersion: (info) => this.setUnsupportedVersion(info),
105
+ addDiscoveredFeature: (f) => this.addDiscoveredFeature(f),
106
+ setDetectionComplete: () => this.setDetectionComplete(),
107
+ };
108
+ for (const step of steps) {
109
+ if (step.onReady) {
110
+ await step.onReady(ctx);
78
111
  }
79
- })
80
- .catch(() => {
81
- this.setReadinessResult({
82
- decision: WizardReadiness.Yes,
83
- health: {},
84
- reasons: [],
85
- });
86
- this._resolveHealthGate();
87
- });
112
+ }
113
+ }
114
+ // ── Gate API ────────────────────────────────────────────────────
115
+ /**
116
+ * Get a gate promise by step ID — the primary blocking checkpoint API
117
+ * for bin.ts. `await store.getGate('...')` parks the caller until the
118
+ * corresponding workflow step's gate predicate flips to true (if the
119
+ * predicate stays false, the caller stays parked indefinitely — the
120
+ * TUI keeps rendering so the user can resolve whatever is blocking).
121
+ *
122
+ * If the workflow doesn't define a step with this ID, or the step
123
+ * has no `gate` predicate, this returns an already-resolved promise
124
+ * so bin.ts flows straight through. This lets workflows opt in to
125
+ * gates on a per-step basis without bin.ts needing to know which
126
+ * gates exist in which flow.
127
+ */
128
+ getGate(stepId) {
129
+ return this._gates.get(stepId)?.promise ?? Promise.resolve();
130
+ }
131
+ /**
132
+ * Re-evaluate every gate predicate against the current session and
133
+ * resolve any whose predicate now returns true. Called after every
134
+ * emitChange(), so gates unblock as soon as the session mutation
135
+ * that satisfies them lands. Gates only resolve once — a predicate
136
+ * that goes true → false → true will NOT re-block a caller that
137
+ * already awaited through.
138
+ */
139
+ _checkGates() {
140
+ for (const [, gate] of this._gates) {
141
+ if (!gate.resolved && gate.predicate(this.session)) {
142
+ gate.resolved = true;
143
+ gate.resolve();
144
+ }
145
+ }
88
146
  }
89
147
  // ── State accessors (read from atoms) ────────────────────────────
90
148
  get session() {
@@ -118,11 +176,10 @@ export class WizardStore {
118
176
  // ── Session setters ─────────────────────────────────────────────
119
177
  // Every setter that affects screen resolution calls emitChange().
120
178
  // Business logic calls these instead of mutating session directly.
121
- /** Unblocks bin.ts via the setupComplete promise. */
179
+ /** Sets setupConfirmed. Gate resolves via _checkGates(). */
122
180
  completeSetup() {
123
181
  this.$session.setKey('setupConfirmed', true);
124
182
  analytics.wizardCapture('setup confirmed', sessionProperties(this.session));
125
- this._resolveSetup();
126
183
  this.emitChange();
127
184
  }
128
185
  setRunPhase(phase) {
@@ -162,10 +219,9 @@ export class WizardStore {
162
219
  this.$session.setKey('readinessResult', result);
163
220
  this.emitChange();
164
221
  }
165
- /** User dismissed the blocking outage screen. Unblocks bin.ts. */
222
+ /** User dismissed the blocking outage screen. Gate resolves via _checkGates(). */
166
223
  dismissOutage() {
167
224
  this.$session.setKey('outageDismissed', true);
168
- this._resolveHealthGate();
169
225
  this.emitChange();
170
226
  }
171
227
  /**
@@ -297,10 +353,12 @@ export class WizardStore {
297
353
  /**
298
354
  * Notify React that state has changed.
299
355
  * The router re-resolves the active screen on next render.
356
+ * Gate predicates are checked and resolved if ready.
300
357
  */
301
358
  emitChange() {
302
359
  this.router._setDirection('push');
303
360
  this.$version.set(this.$version.get() + 1);
361
+ this._checkGates();
304
362
  this._detectTransition();
305
363
  }
306
364
  // ── Overlay navigation ──────────────────────────────────────────