@posthog/wizard 1.36.1 → 2.0.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 (464) hide show
  1. package/README.md +79 -0
  2. package/dist/bin.js +199 -12
  3. package/dist/bin.js.map +1 -1
  4. package/dist/src/__tests__/cli.test.js +7 -18
  5. package/dist/src/__tests__/cli.test.js.map +1 -1
  6. package/dist/src/__tests__/run.test.js +50 -5
  7. package/dist/src/__tests__/run.test.js.map +1 -1
  8. package/dist/src/__tests__/wizard-abort.test.js +127 -0
  9. package/dist/src/__tests__/wizard-abort.test.js.map +1 -0
  10. package/dist/src/{android → frameworks/android}/android-wizard-agent.d.ts +1 -1
  11. package/dist/src/{android → frameworks/android}/android-wizard-agent.js +2 -2
  12. package/dist/src/frameworks/android/android-wizard-agent.js.map +1 -0
  13. package/dist/src/{android → frameworks/android}/utils.d.ts +1 -1
  14. package/dist/src/{android → frameworks/android}/utils.js +1 -1
  15. package/dist/src/frameworks/android/utils.js.map +1 -0
  16. package/dist/src/{angular → frameworks/angular}/angular-wizard-agent.d.ts +1 -1
  17. package/dist/src/{angular → frameworks/angular}/angular-wizard-agent.js +9 -7
  18. package/dist/src/frameworks/angular/angular-wizard-agent.js.map +1 -0
  19. package/dist/src/{angular → frameworks/angular}/utils.js +1 -1
  20. package/dist/src/frameworks/angular/utils.js.map +1 -0
  21. package/dist/src/{astro → frameworks/astro}/astro-wizard-agent.d.ts +1 -1
  22. package/dist/src/{astro → frameworks/astro}/astro-wizard-agent.js +9 -7
  23. package/dist/src/frameworks/astro/astro-wizard-agent.js.map +1 -0
  24. package/dist/src/{astro → frameworks/astro}/utils.d.ts +2 -5
  25. package/dist/src/{astro → frameworks/astro}/utils.js +3 -52
  26. package/dist/src/frameworks/astro/utils.js.map +1 -0
  27. package/dist/src/{django → frameworks/django}/django-wizard-agent.d.ts +1 -1
  28. package/dist/src/{django → frameworks/django}/django-wizard-agent.js +3 -3
  29. package/dist/src/frameworks/django/django-wizard-agent.js.map +1 -0
  30. package/dist/src/{django → frameworks/django}/utils.d.ts +1 -1
  31. package/dist/src/{django → frameworks/django}/utils.js +6 -6
  32. package/dist/src/frameworks/django/utils.js.map +1 -0
  33. package/dist/src/frameworks/fastapi/fastapi-wizard-agent.d.ts +5 -0
  34. package/dist/src/{fastapi → frameworks/fastapi}/fastapi-wizard-agent.js +3 -32
  35. package/dist/src/frameworks/fastapi/fastapi-wizard-agent.js.map +1 -0
  36. package/dist/src/{fastapi → frameworks/fastapi}/utils.d.ts +1 -1
  37. package/dist/src/{fastapi → frameworks/fastapi}/utils.js +4 -4
  38. package/dist/src/frameworks/fastapi/utils.js.map +1 -0
  39. package/dist/src/{flask → frameworks/flask}/flask-wizard-agent.d.ts +1 -1
  40. package/dist/src/{flask → frameworks/flask}/flask-wizard-agent.js +3 -3
  41. package/dist/src/frameworks/flask/flask-wizard-agent.js.map +1 -0
  42. package/dist/src/{flask → frameworks/flask}/utils.d.ts +1 -1
  43. package/dist/src/{flask → frameworks/flask}/utils.js +7 -7
  44. package/dist/src/frameworks/flask/utils.js.map +1 -0
  45. package/dist/src/{javascript-node → frameworks/javascript-node}/javascript-node-wizard-agent.d.ts +1 -1
  46. package/dist/src/{javascript-node → frameworks/javascript-node}/javascript-node-wizard-agent.js +4 -4
  47. package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.js.map +1 -0
  48. package/dist/src/{javascript-web → frameworks/javascript-web}/javascript-web-wizard-agent.d.ts +1 -1
  49. package/dist/src/{javascript-web → frameworks/javascript-web}/javascript-web-wizard-agent.js +16 -14
  50. package/dist/src/frameworks/javascript-web/javascript-web-wizard-agent.js.map +1 -0
  51. package/dist/src/{javascript-web → frameworks/javascript-web}/utils.d.ts +6 -1
  52. package/dist/src/{javascript-web → frameworks/javascript-web}/utils.js +49 -1
  53. package/dist/src/frameworks/javascript-web/utils.js.map +1 -0
  54. package/dist/src/{laravel → frameworks/laravel}/laravel-wizard-agent.d.ts +1 -1
  55. package/dist/src/{laravel → frameworks/laravel}/laravel-wizard-agent.js +2 -2
  56. package/dist/src/frameworks/laravel/laravel-wizard-agent.js.map +1 -0
  57. package/dist/src/{laravel → frameworks/laravel}/utils.d.ts +1 -1
  58. package/dist/src/{laravel → frameworks/laravel}/utils.js +5 -5
  59. package/dist/src/frameworks/laravel/utils.js.map +1 -0
  60. package/dist/src/{nextjs → frameworks/nextjs}/nextjs-wizard-agent.d.ts +1 -1
  61. package/dist/src/{nextjs → frameworks/nextjs}/nextjs-wizard-agent.js +30 -8
  62. package/dist/src/frameworks/nextjs/nextjs-wizard-agent.js.map +1 -0
  63. package/dist/src/{nextjs → frameworks/nextjs}/utils.d.ts +5 -2
  64. package/dist/src/{nextjs → frameworks/nextjs}/utils.js +6 -20
  65. package/dist/src/frameworks/nextjs/utils.js.map +1 -0
  66. package/dist/src/{nuxt → frameworks/nuxt}/nuxt-wizard-agent.d.ts +1 -1
  67. package/dist/src/{nuxt → frameworks/nuxt}/nuxt-wizard-agent.js +11 -9
  68. package/dist/src/frameworks/nuxt/nuxt-wizard-agent.js.map +1 -0
  69. package/dist/src/{python → frameworks/python}/python-wizard-agent.d.ts +1 -1
  70. package/dist/src/{python → frameworks/python}/python-wizard-agent.js +3 -3
  71. package/dist/src/frameworks/python/python-wizard-agent.js.map +1 -0
  72. package/dist/src/{python → frameworks/python}/utils.d.ts +1 -1
  73. package/dist/src/frameworks/python/utils.js.map +1 -0
  74. package/dist/src/{rails → frameworks/rails}/rails-wizard-agent.d.ts +1 -1
  75. package/dist/src/{rails → frameworks/rails}/rails-wizard-agent.js +2 -2
  76. package/dist/src/frameworks/rails/rails-wizard-agent.js.map +1 -0
  77. package/dist/src/{rails → frameworks/rails}/utils.d.ts +1 -1
  78. package/dist/src/{rails → frameworks/rails}/utils.js +4 -4
  79. package/dist/src/frameworks/rails/utils.js.map +1 -0
  80. package/dist/src/{react-native → frameworks/react-native}/react-native-wizard-agent.d.ts +1 -1
  81. package/dist/src/{react-native → frameworks/react-native}/react-native-wizard-agent.js +9 -7
  82. package/dist/src/frameworks/react-native/react-native-wizard-agent.js.map +1 -0
  83. package/dist/src/{react-native → frameworks/react-native}/utils.d.ts +1 -1
  84. package/dist/src/{react-native → frameworks/react-native}/utils.js +7 -10
  85. package/dist/src/frameworks/react-native/utils.js.map +1 -0
  86. package/dist/src/{react-router → frameworks/react-router}/react-router-wizard-agent.d.ts +1 -1
  87. package/dist/src/{react-router → frameworks/react-router}/react-router-wizard-agent.js +15 -8
  88. package/dist/src/frameworks/react-router/react-router-wizard-agent.js.map +1 -0
  89. package/dist/src/frameworks/react-router/utils.d.ts +13 -0
  90. package/dist/src/{react-router → frameworks/react-router}/utils.js +14 -111
  91. package/dist/src/frameworks/react-router/utils.js.map +1 -0
  92. package/dist/src/{ruby → frameworks/ruby}/ruby-wizard-agent.d.ts +1 -1
  93. package/dist/src/{ruby → frameworks/ruby}/ruby-wizard-agent.js +2 -2
  94. package/dist/src/frameworks/ruby/ruby-wizard-agent.js.map +1 -0
  95. package/dist/src/{ruby → frameworks/ruby}/utils.d.ts +1 -1
  96. package/dist/src/{ruby → frameworks/ruby}/utils.js +1 -1
  97. package/dist/src/frameworks/ruby/utils.js.map +1 -0
  98. package/dist/src/{svelte → frameworks/svelte}/svelte-wizard-agent.d.ts +1 -1
  99. package/dist/src/{svelte → frameworks/svelte}/svelte-wizard-agent.js +5 -5
  100. package/dist/src/frameworks/svelte/svelte-wizard-agent.js.map +1 -0
  101. package/dist/src/{swift → frameworks/swift}/swift-wizard-agent.d.ts +1 -1
  102. package/dist/src/{swift → frameworks/swift}/swift-wizard-agent.js +2 -2
  103. package/dist/src/frameworks/swift/swift-wizard-agent.js.map +1 -0
  104. package/dist/src/{swift → frameworks/swift}/utils.d.ts +1 -1
  105. package/dist/src/frameworks/swift/utils.js.map +1 -0
  106. package/dist/src/{tanstack-router → frameworks/tanstack-router}/tanstack-router-wizard-agent.d.ts +1 -1
  107. package/dist/src/{tanstack-router → frameworks/tanstack-router}/tanstack-router-wizard-agent.js +15 -8
  108. package/dist/src/frameworks/tanstack-router/tanstack-router-wizard-agent.js.map +1 -0
  109. package/dist/src/frameworks/tanstack-router/utils.d.ts +11 -0
  110. package/dist/src/{tanstack-router → frameworks/tanstack-router}/utils.js +4 -47
  111. package/dist/src/frameworks/tanstack-router/utils.js.map +1 -0
  112. package/dist/src/{tanstack-start → frameworks/tanstack-start}/tanstack-start-wizard-agent.d.ts +1 -1
  113. package/dist/src/{tanstack-start → frameworks/tanstack-start}/tanstack-start-wizard-agent.js +9 -7
  114. package/dist/src/frameworks/tanstack-start/tanstack-start-wizard-agent.js.map +1 -0
  115. package/dist/src/{tanstack-start → frameworks/tanstack-start}/utils.js +1 -1
  116. package/dist/src/frameworks/tanstack-start/utils.js.map +1 -0
  117. package/dist/src/{vue → frameworks/vue}/vue-wizard-agent.d.ts +1 -1
  118. package/dist/src/{vue → frameworks/vue}/vue-wizard-agent.js +8 -8
  119. package/dist/src/frameworks/vue/vue-wizard-agent.js.map +1 -0
  120. package/dist/src/lib/__tests__/agent-interface.test.js +91 -19
  121. package/dist/src/lib/__tests__/agent-interface.test.js.map +1 -1
  122. package/dist/src/lib/agent-interface.d.ts +49 -2
  123. package/dist/src/lib/agent-interface.js +254 -40
  124. package/dist/src/lib/agent-interface.js.map +1 -1
  125. package/dist/src/lib/agent-runner.d.ts +4 -2
  126. package/dist/src/lib/agent-runner.js +132 -126
  127. package/dist/src/lib/agent-runner.js.map +1 -1
  128. package/dist/src/lib/api.d.ts +4 -4
  129. package/dist/src/lib/commandments.js +1 -0
  130. package/dist/src/lib/commandments.js.map +1 -1
  131. package/dist/src/lib/constants.d.ts +22 -9
  132. package/dist/src/lib/constants.js +35 -11
  133. package/dist/src/lib/constants.js.map +1 -1
  134. package/dist/src/lib/framework-config.d.ts +26 -0
  135. package/dist/src/lib/framework-config.js.map +1 -1
  136. package/dist/src/lib/health-checks/__tests__/health-checks.test.d.ts +18 -0
  137. package/dist/src/lib/health-checks/__tests__/health-checks.test.js +752 -0
  138. package/dist/src/lib/health-checks/__tests__/health-checks.test.js.map +1 -0
  139. package/dist/src/lib/health-checks/endpoints.d.ts +3 -0
  140. package/dist/src/lib/health-checks/endpoints.js +46 -0
  141. package/dist/src/lib/health-checks/endpoints.js.map +1 -0
  142. package/dist/src/lib/health-checks/index.d.ts +4 -0
  143. package/dist/src/lib/health-checks/index.js +23 -0
  144. package/dist/src/lib/health-checks/index.js.map +1 -0
  145. package/dist/src/lib/health-checks/readiness.d.ts +24 -0
  146. package/dist/src/lib/health-checks/readiness.js +119 -0
  147. package/dist/src/lib/health-checks/readiness.js.map +1 -0
  148. package/dist/src/lib/health-checks/statuspage.d.ts +9 -0
  149. package/dist/src/lib/health-checks/statuspage.js +105 -0
  150. package/dist/src/lib/health-checks/statuspage.js.map +1 -0
  151. package/dist/src/lib/health-checks/types.d.ts +31 -0
  152. package/dist/src/lib/health-checks/types.js +10 -0
  153. package/dist/src/lib/health-checks/types.js.map +1 -0
  154. package/dist/src/lib/middleware/benchmark.d.ts +2 -2
  155. package/dist/src/lib/middleware/benchmark.js +3 -3
  156. package/dist/src/lib/middleware/benchmark.js.map +1 -1
  157. package/dist/src/lib/middleware/benchmarks/json-writer.js +2 -2
  158. package/dist/src/lib/middleware/benchmarks/json-writer.js.map +1 -1
  159. package/dist/src/lib/middleware/benchmarks/summary.d.ts +2 -2
  160. package/dist/src/lib/middleware/benchmarks/summary.js +9 -9
  161. package/dist/src/lib/middleware/benchmarks/summary.js.map +1 -1
  162. package/dist/src/lib/middleware/types.d.ts +2 -2
  163. package/dist/src/lib/middleware/types.js.map +1 -1
  164. package/dist/src/lib/package-manager-detection.js +1 -1
  165. package/dist/src/lib/package-manager-detection.js.map +1 -1
  166. package/dist/src/lib/registry.js +21 -21
  167. package/dist/src/lib/registry.js.map +1 -1
  168. package/dist/src/lib/version.d.ts +1 -1
  169. package/dist/src/lib/version.js +1 -1
  170. package/dist/src/lib/version.js.map +1 -1
  171. package/dist/src/lib/wizard-session.d.ts +115 -0
  172. package/dist/src/lib/wizard-session.js +104 -0
  173. package/dist/src/lib/wizard-session.js.map +1 -0
  174. package/dist/src/lib/wizard-tools.js +13 -0
  175. package/dist/src/lib/wizard-tools.js.map +1 -1
  176. package/dist/src/run.d.ts +3 -1
  177. package/dist/src/run.js +73 -55
  178. package/dist/src/run.js.map +1 -1
  179. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/codex.test.js +18 -22
  180. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/codex.test.js.map +1 -1
  181. package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.d.ts +6 -6
  182. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +6 -6
  183. package/dist/src/steps/add-mcp-server-to-clients/clients/codex.d.ts +7 -7
  184. package/dist/src/steps/add-mcp-server-to-clients/clients/codex.js +8 -9
  185. package/dist/src/steps/add-mcp-server-to-clients/clients/codex.js.map +1 -1
  186. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.d.ts +6 -6
  187. package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.d.ts +6 -6
  188. package/dist/src/steps/add-mcp-server-to-clients/clients/zed.d.ts +6 -6
  189. package/dist/src/steps/add-mcp-server-to-clients/defaults.d.ts +6 -6
  190. package/dist/src/steps/add-mcp-server-to-clients/index.d.ts +5 -2
  191. package/dist/src/steps/add-mcp-server-to-clients/index.js +24 -107
  192. package/dist/src/steps/add-mcp-server-to-clients/index.js.map +1 -1
  193. package/dist/src/steps/add-or-update-environment-variables.js +15 -20
  194. package/dist/src/steps/add-or-update-environment-variables.js.map +1 -1
  195. package/dist/src/steps/index.d.ts +0 -1
  196. package/dist/src/steps/index.js +0 -1
  197. package/dist/src/steps/index.js.map +1 -1
  198. package/dist/src/steps/run-prettier.js +9 -11
  199. package/dist/src/steps/run-prettier.js.map +1 -1
  200. package/dist/src/steps/upload-environment-variables/EnvironmentProvider.d.ts +6 -3
  201. package/dist/src/steps/upload-environment-variables/EnvironmentProvider.js.map +1 -1
  202. package/dist/src/steps/upload-environment-variables/index.d.ts +3 -3
  203. package/dist/src/steps/upload-environment-variables/index.js +7 -35
  204. package/dist/src/steps/upload-environment-variables/index.js.map +1 -1
  205. package/dist/src/steps/upload-environment-variables/providers/vercel.d.ts +3 -2
  206. package/dist/src/steps/upload-environment-variables/providers/vercel.js +2 -2
  207. package/dist/src/steps/upload-environment-variables/providers/vercel.js.map +1 -1
  208. package/dist/src/ui/index.d.ts +8 -0
  209. package/dist/src/ui/index.js +17 -0
  210. package/dist/src/ui/index.js.map +1 -0
  211. package/dist/src/ui/logging-ui.d.ts +44 -0
  212. package/dist/src/ui/logging-ui.js +103 -0
  213. package/dist/src/ui/logging-ui.js.map +1 -0
  214. package/dist/src/ui/tui/App.d.ts +6 -0
  215. package/dist/src/ui/tui/App.js +10 -0
  216. package/dist/src/ui/tui/App.js.map +1 -0
  217. package/dist/src/ui/tui/__tests__/layout-helpers.test.js +68 -0
  218. package/dist/src/ui/tui/__tests__/layout-helpers.test.js.map +1 -0
  219. package/dist/src/ui/tui/__tests__/store.test.d.ts +1 -0
  220. package/dist/src/ui/tui/__tests__/store.test.js +723 -0
  221. package/dist/src/ui/tui/__tests__/store.test.js.map +1 -0
  222. package/dist/src/ui/tui/components/LearnCard.d.ts +10 -0
  223. package/dist/src/ui/tui/components/LearnCard.js +217 -0
  224. package/dist/src/ui/tui/components/LearnCard.js.map +1 -0
  225. package/dist/src/ui/tui/components/TipsCard.d.ts +9 -0
  226. package/dist/src/ui/tui/components/TipsCard.js +55 -0
  227. package/dist/src/ui/tui/components/TipsCard.js.map +1 -0
  228. package/dist/src/ui/tui/components/TitleBar.d.ts +6 -0
  229. package/dist/src/ui/tui/components/TitleBar.js +17 -0
  230. package/dist/src/ui/tui/components/TitleBar.js.map +1 -0
  231. package/dist/src/ui/tui/flows.d.ts +38 -0
  232. package/dist/src/ui/tui/flows.js +82 -0
  233. package/dist/src/ui/tui/flows.js.map +1 -0
  234. package/dist/src/ui/tui/hooks/useStdoutDimensions.d.ts +9 -0
  235. package/dist/src/ui/tui/hooks/useStdoutDimensions.js +37 -0
  236. package/dist/src/ui/tui/hooks/useStdoutDimensions.js.map +1 -0
  237. package/dist/src/ui/tui/ink-ui.d.ts +50 -0
  238. package/dist/src/ui/tui/ink-ui.js +108 -0
  239. package/dist/src/ui/tui/ink-ui.js.map +1 -0
  240. package/dist/src/ui/tui/package.json +1 -0
  241. package/dist/src/ui/tui/playground/PlaygroundApp.d.ts +12 -0
  242. package/dist/src/ui/tui/playground/PlaygroundApp.js +32 -0
  243. package/dist/src/ui/tui/playground/PlaygroundApp.js.map +1 -0
  244. package/dist/src/ui/tui/playground/demos/InputDemo.d.ts +4 -0
  245. package/dist/src/ui/tui/playground/demos/InputDemo.js +53 -0
  246. package/dist/src/ui/tui/playground/demos/InputDemo.js.map +1 -0
  247. package/dist/src/ui/tui/playground/demos/LayoutDemo.d.ts +5 -0
  248. package/dist/src/ui/tui/playground/demos/LayoutDemo.js +25 -0
  249. package/dist/src/ui/tui/playground/demos/LayoutDemo.js.map +1 -0
  250. package/dist/src/ui/tui/playground/demos/LogDemo.d.ts +5 -0
  251. package/dist/src/ui/tui/playground/demos/LogDemo.js +53 -0
  252. package/dist/src/ui/tui/playground/demos/LogDemo.js.map +1 -0
  253. package/dist/src/ui/tui/playground/demos/ProgressDemo.d.ts +5 -0
  254. package/dist/src/ui/tui/playground/demos/ProgressDemo.js +58 -0
  255. package/dist/src/ui/tui/playground/demos/ProgressDemo.js.map +1 -0
  256. package/dist/src/ui/tui/playground/demos/RunScreenDemo.d.ts +11 -0
  257. package/dist/src/ui/tui/playground/demos/RunScreenDemo.js +159 -0
  258. package/dist/src/ui/tui/playground/demos/RunScreenDemo.js.map +1 -0
  259. package/dist/src/ui/tui/playground/demos/WelcomeDemo.d.ts +9 -0
  260. package/dist/src/ui/tui/playground/demos/WelcomeDemo.js +15 -0
  261. package/dist/src/ui/tui/playground/demos/WelcomeDemo.js.map +1 -0
  262. package/dist/src/ui/tui/playground/start-playground.d.ts +4 -0
  263. package/dist/src/ui/tui/playground/start-playground.js +24 -0
  264. package/dist/src/ui/tui/playground/start-playground.js.map +1 -0
  265. package/dist/src/ui/tui/primitives/CardLayout.d.ts +12 -0
  266. package/dist/src/ui/tui/primitives/CardLayout.js +10 -0
  267. package/dist/src/ui/tui/primitives/CardLayout.js.map +1 -0
  268. package/dist/src/ui/tui/primitives/ConfirmationInput.d.ts +13 -0
  269. package/dist/src/ui/tui/primitives/ConfirmationInput.js +35 -0
  270. package/dist/src/ui/tui/primitives/ConfirmationInput.js.map +1 -0
  271. package/dist/src/ui/tui/primitives/ContentSequencer.d.ts +42 -0
  272. package/dist/src/ui/tui/primitives/ContentSequencer.js +137 -0
  273. package/dist/src/ui/tui/primitives/ContentSequencer.js.map +1 -0
  274. package/dist/src/ui/tui/primitives/DissolveTransition.d.ts +21 -0
  275. package/dist/src/ui/tui/primitives/DissolveTransition.js +149 -0
  276. package/dist/src/ui/tui/primitives/DissolveTransition.js.map +1 -0
  277. package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +9 -0
  278. package/dist/src/ui/tui/primitives/EventPlanViewer.js +9 -0
  279. package/dist/src/ui/tui/primitives/EventPlanViewer.js.map +1 -0
  280. package/dist/src/ui/tui/primitives/HNViewer.d.ts +7 -0
  281. package/dist/src/ui/tui/primitives/HNViewer.js +63 -0
  282. package/dist/src/ui/tui/primitives/HNViewer.js.map +1 -0
  283. package/dist/src/ui/tui/primitives/LinesBlock.d.ts +16 -0
  284. package/dist/src/ui/tui/primitives/LinesBlock.js +37 -0
  285. package/dist/src/ui/tui/primitives/LinesBlock.js.map +1 -0
  286. package/dist/src/ui/tui/primitives/LoadingBox.d.ts +8 -0
  287. package/dist/src/ui/tui/primitives/LoadingBox.js +10 -0
  288. package/dist/src/ui/tui/primitives/LoadingBox.js.map +1 -0
  289. package/dist/src/ui/tui/primitives/LogViewer.d.ts +11 -0
  290. package/dist/src/ui/tui/primitives/LogViewer.js +55 -0
  291. package/dist/src/ui/tui/primitives/LogViewer.js.map +1 -0
  292. package/dist/src/ui/tui/primitives/NodeBlock.d.ts +13 -0
  293. package/dist/src/ui/tui/primitives/NodeBlock.js +17 -0
  294. package/dist/src/ui/tui/primitives/NodeBlock.js.map +1 -0
  295. package/dist/src/ui/tui/primitives/PickerMenu.d.ts +20 -0
  296. package/dist/src/ui/tui/primitives/PickerMenu.js +134 -0
  297. package/dist/src/ui/tui/primitives/PickerMenu.js.map +1 -0
  298. package/dist/src/ui/tui/primitives/ProgressList.d.ts +15 -0
  299. package/dist/src/ui/tui/primitives/ProgressList.js +30 -0
  300. package/dist/src/ui/tui/primitives/ProgressList.js.map +1 -0
  301. package/dist/src/ui/tui/primitives/PromptLabel.d.ts +11 -0
  302. package/dist/src/ui/tui/primitives/PromptLabel.js +13 -0
  303. package/dist/src/ui/tui/primitives/PromptLabel.js.map +1 -0
  304. package/dist/src/ui/tui/primitives/ScreenContainer.d.ts +16 -0
  305. package/dist/src/ui/tui/primitives/ScreenContainer.js +36 -0
  306. package/dist/src/ui/tui/primitives/ScreenContainer.js.map +1 -0
  307. package/dist/src/ui/tui/primitives/ScreenErrorBoundary.d.ts +22 -0
  308. package/dist/src/ui/tui/primitives/ScreenErrorBoundary.js +35 -0
  309. package/dist/src/ui/tui/primitives/ScreenErrorBoundary.js.map +1 -0
  310. package/dist/src/ui/tui/primitives/SplitView.d.ts +11 -0
  311. package/dist/src/ui/tui/primitives/SplitView.js +9 -0
  312. package/dist/src/ui/tui/primitives/SplitView.js.map +1 -0
  313. package/dist/src/ui/tui/primitives/TabContainer.d.ts +23 -0
  314. package/dist/src/ui/tui/primitives/TabContainer.js +45 -0
  315. package/dist/src/ui/tui/primitives/TabContainer.js.map +1 -0
  316. package/dist/src/ui/tui/primitives/TextBlock.d.ts +41 -0
  317. package/dist/src/ui/tui/primitives/TextBlock.js +144 -0
  318. package/dist/src/ui/tui/primitives/TextBlock.js.map +1 -0
  319. package/dist/src/ui/tui/primitives/content-types.d.ts +37 -0
  320. package/dist/src/ui/tui/primitives/content-types.js +19 -0
  321. package/dist/src/ui/tui/primitives/content-types.js.map +1 -0
  322. package/dist/src/ui/tui/primitives/index.d.ts +24 -0
  323. package/dist/src/ui/tui/primitives/index.js +21 -0
  324. package/dist/src/ui/tui/primitives/index.js.map +1 -0
  325. package/dist/src/ui/tui/primitives/layout-helpers.d.ts +36 -0
  326. package/dist/src/ui/tui/primitives/layout-helpers.js +95 -0
  327. package/dist/src/ui/tui/primitives/layout-helpers.js.map +1 -0
  328. package/dist/src/ui/tui/primitives/text-helpers.d.ts +10 -0
  329. package/dist/src/ui/tui/primitives/text-helpers.js +43 -0
  330. package/dist/src/ui/tui/primitives/text-helpers.js.map +1 -0
  331. package/dist/src/ui/tui/router.d.ts +56 -0
  332. package/dist/src/ui/tui/router.js +94 -0
  333. package/dist/src/ui/tui/router.js.map +1 -0
  334. package/dist/src/ui/tui/screen-registry.d.ts +19 -0
  335. package/dist/src/ui/tui/screen-registry.js +34 -0
  336. package/dist/src/ui/tui/screen-registry.js.map +1 -0
  337. package/dist/src/ui/tui/screens/AuthScreen.d.ts +13 -0
  338. package/dist/src/ui/tui/screens/AuthScreen.js +20 -0
  339. package/dist/src/ui/tui/screens/AuthScreen.js.map +1 -0
  340. package/dist/src/ui/tui/screens/IntroScreen.d.ts +16 -0
  341. package/dist/src/ui/tui/screens/IntroScreen.js +63 -0
  342. package/dist/src/ui/tui/screens/IntroScreen.js.map +1 -0
  343. package/dist/src/ui/tui/screens/McpScreen.d.ts +24 -0
  344. package/dist/src/ui/tui/screens/McpScreen.js +112 -0
  345. package/dist/src/ui/tui/screens/McpScreen.js.map +1 -0
  346. package/dist/src/ui/tui/screens/OutageScreen.d.ts +10 -0
  347. package/dist/src/ui/tui/screens/OutageScreen.js +17 -0
  348. package/dist/src/ui/tui/screens/OutageScreen.js.map +1 -0
  349. package/dist/src/ui/tui/screens/OutroScreen.d.ts +11 -0
  350. package/dist/src/ui/tui/screens/OutroScreen.js +22 -0
  351. package/dist/src/ui/tui/screens/OutroScreen.js.map +1 -0
  352. package/dist/src/ui/tui/screens/RunScreen.d.ts +16 -0
  353. package/dist/src/ui/tui/screens/RunScreen.js +73 -0
  354. package/dist/src/ui/tui/screens/RunScreen.js.map +1 -0
  355. package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +10 -0
  356. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +24 -0
  357. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js.map +1 -0
  358. package/dist/src/ui/tui/screens/SetupScreen.d.ts +13 -0
  359. package/dist/src/ui/tui/screens/SetupScreen.js +74 -0
  360. package/dist/src/ui/tui/screens/SetupScreen.js.map +1 -0
  361. package/dist/src/ui/tui/services/mcp-installer.d.ts +21 -0
  362. package/dist/src/ui/tui/services/mcp-installer.js +58 -0
  363. package/dist/src/ui/tui/services/mcp-installer.js.map +1 -0
  364. package/dist/src/ui/tui/start-tui.d.ts +9 -0
  365. package/dist/src/ui/tui/start-tui.js +41 -0
  366. package/dist/src/ui/tui/start-tui.js.map +1 -0
  367. package/dist/src/ui/tui/store.d.ts +132 -0
  368. package/dist/src/ui/tui/store.js +320 -0
  369. package/dist/src/ui/tui/store.js.map +1 -0
  370. package/dist/src/ui/tui/styles.d.ts +31 -0
  371. package/dist/src/ui/tui/styles.js +34 -0
  372. package/dist/src/ui/tui/styles.js.map +1 -0
  373. package/dist/src/ui/wizard-ui.d.ts +64 -0
  374. package/dist/src/ui/wizard-ui.js +19 -0
  375. package/dist/src/ui/wizard-ui.js.map +1 -0
  376. package/dist/src/utils/__tests__/setup-utils.test.d.ts +1 -0
  377. package/dist/src/utils/__tests__/{clack-utils.test.js → setup-utils.test.js} +31 -22
  378. package/dist/src/utils/__tests__/setup-utils.test.js.map +1 -0
  379. package/dist/src/utils/analytics.d.ts +18 -0
  380. package/dist/src/utils/analytics.js +53 -0
  381. package/dist/src/utils/analytics.js.map +1 -1
  382. package/dist/src/utils/anthropic-status.d.ts +1 -12
  383. package/dist/src/utils/anthropic-status.js +4 -56
  384. package/dist/src/utils/anthropic-status.js.map +1 -1
  385. package/dist/src/utils/custom-headers.d.ts +9 -0
  386. package/dist/src/utils/custom-headers.js +24 -0
  387. package/dist/src/utils/custom-headers.js.map +1 -0
  388. package/dist/src/utils/debug.js +2 -2
  389. package/dist/src/utils/debug.js.map +1 -1
  390. package/dist/src/utils/environment.js +4 -2
  391. package/dist/src/utils/environment.js.map +1 -1
  392. package/dist/src/utils/oauth.js +9 -10
  393. package/dist/src/utils/oauth.js.map +1 -1
  394. package/dist/src/utils/package-manager.js +13 -13
  395. package/dist/src/utils/package-manager.js.map +1 -1
  396. package/dist/src/utils/setup-utils.d.ts +76 -0
  397. package/dist/src/utils/setup-utils.js +364 -0
  398. package/dist/src/utils/setup-utils.js.map +1 -0
  399. package/dist/src/utils/wizard-abort.d.ts +13 -0
  400. package/dist/src/utils/wizard-abort.js +57 -0
  401. package/dist/src/utils/wizard-abort.js.map +1 -0
  402. package/package.json +19 -7
  403. package/dist/src/android/android-wizard-agent.js.map +0 -1
  404. package/dist/src/android/utils.js.map +0 -1
  405. package/dist/src/angular/angular-wizard-agent.js.map +0 -1
  406. package/dist/src/angular/utils.js.map +0 -1
  407. package/dist/src/astro/astro-wizard-agent.js.map +0 -1
  408. package/dist/src/astro/utils.js.map +0 -1
  409. package/dist/src/django/django-wizard-agent.js.map +0 -1
  410. package/dist/src/django/utils.js.map +0 -1
  411. package/dist/src/fastapi/fastapi-wizard-agent.d.ts +0 -7
  412. package/dist/src/fastapi/fastapi-wizard-agent.js.map +0 -1
  413. package/dist/src/fastapi/utils.js.map +0 -1
  414. package/dist/src/flask/flask-wizard-agent.js.map +0 -1
  415. package/dist/src/flask/utils.js.map +0 -1
  416. package/dist/src/javascript-node/javascript-node-wizard-agent.js.map +0 -1
  417. package/dist/src/javascript-web/javascript-web-wizard-agent.js.map +0 -1
  418. package/dist/src/javascript-web/utils.js.map +0 -1
  419. package/dist/src/laravel/laravel-wizard-agent.js.map +0 -1
  420. package/dist/src/laravel/utils.js.map +0 -1
  421. package/dist/src/mcp.d.ts +0 -8
  422. package/dist/src/mcp.js +0 -44
  423. package/dist/src/mcp.js.map +0 -1
  424. package/dist/src/nextjs/nextjs-wizard-agent.js.map +0 -1
  425. package/dist/src/nextjs/utils.js.map +0 -1
  426. package/dist/src/nuxt/nuxt-wizard-agent.js.map +0 -1
  427. package/dist/src/python/python-wizard-agent.js.map +0 -1
  428. package/dist/src/python/utils.js.map +0 -1
  429. package/dist/src/rails/rails-wizard-agent.js.map +0 -1
  430. package/dist/src/rails/utils.js.map +0 -1
  431. package/dist/src/react-native/react-native-wizard-agent.js.map +0 -1
  432. package/dist/src/react-native/utils.js.map +0 -1
  433. package/dist/src/react-router/react-router-wizard-agent.js.map +0 -1
  434. package/dist/src/react-router/utils.d.ts +0 -19
  435. package/dist/src/react-router/utils.js.map +0 -1
  436. package/dist/src/ruby/ruby-wizard-agent.js.map +0 -1
  437. package/dist/src/ruby/utils.js.map +0 -1
  438. package/dist/src/steps/__tests__/add-editor-rules.test.js +0 -208
  439. package/dist/src/steps/__tests__/add-editor-rules.test.js.map +0 -1
  440. package/dist/src/steps/add-editor-rules.d.ts +0 -8
  441. package/dist/src/steps/add-editor-rules.js +0 -71
  442. package/dist/src/steps/add-editor-rules.js.map +0 -1
  443. package/dist/src/svelte/svelte-wizard-agent.js.map +0 -1
  444. package/dist/src/swift/swift-wizard-agent.js.map +0 -1
  445. package/dist/src/swift/utils.js.map +0 -1
  446. package/dist/src/tanstack-router/tanstack-router-wizard-agent.js.map +0 -1
  447. package/dist/src/tanstack-router/utils.d.ts +0 -17
  448. package/dist/src/tanstack-router/utils.js.map +0 -1
  449. package/dist/src/tanstack-start/tanstack-start-wizard-agent.js.map +0 -1
  450. package/dist/src/tanstack-start/utils.js.map +0 -1
  451. package/dist/src/utils/__tests__/clack-utils.test.js.map +0 -1
  452. package/dist/src/utils/clack-utils.d.ts +0 -188
  453. package/dist/src/utils/clack-utils.js +0 -705
  454. package/dist/src/utils/clack-utils.js.map +0 -1
  455. package/dist/src/utils/clack.d.ts +0 -2
  456. package/dist/src/utils/clack.js +0 -9
  457. package/dist/src/utils/clack.js.map +0 -1
  458. package/dist/src/vue/vue-wizard-agent.js.map +0 -1
  459. /package/dist/src/{steps/__tests__/add-editor-rules.test.d.ts → __tests__/wizard-abort.test.d.ts} +0 -0
  460. /package/dist/src/{angular → frameworks/angular}/utils.d.ts +0 -0
  461. /package/dist/src/{python → frameworks/python}/utils.js +0 -0
  462. /package/dist/src/{swift → frameworks/swift}/utils.js +0 -0
  463. /package/dist/src/{tanstack-start → frameworks/tanstack-start}/utils.d.ts +0 -0
  464. /package/dist/src/{utils/__tests__/clack-utils.test.d.ts → ui/tui/__tests__/layout-helpers.test.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../../../../src/ui/tui/__tests__/store.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n WizardStore,\n TaskStatus,\n Flow,\n Screen,\n Overlay,\n RunPhase,\n McpOutcome,\n} from '../store.js';\nimport { OutroKind, AdditionalFeature } from '../../../lib/wizard-session.js';\nimport { buildSession } from '../../../lib/wizard-session.js';\nimport { Integration } from '../../../lib/constants.js';\nimport { analytics } from '../../../utils/analytics.js';\n\njest.mock('../../../utils/analytics.js', () => ({\n analytics: {\n capture: jest.fn(),\n wizardCapture: jest.fn(),\n setTag: jest.fn(),\n shutdown: jest.fn().mockResolvedValue(undefined),\n },\n sessionProperties: jest.fn(() => ({})),\n}));\n\nfunction createStore(flow?: Flow): WizardStore {\n return new WizardStore(flow);\n}\n\nconst wizardCaptureMock = analytics.wizardCapture as jest.Mock;\n\ndescribe('WizardStore', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n });\n // ── Construction ─────────────────────────────────────────────────\n\n describe('constructor', () => {\n it('initialises with default state', () => {\n const store = createStore();\n expect(store.version).toBe('');\n expect(store.statusMessages).toEqual([]);\n expect(store.tasks).toEqual([]);\n expect(store.session).toEqual(buildSession({}));\n });\n\n it('defaults to Wizard flow', () => {\n const store = createStore();\n expect(store.router.activeFlow).toBe(Flow.Wizard);\n });\n\n it('accepts a custom flow', () => {\n const store = createStore(Flow.McpAdd);\n expect(store.router.activeFlow).toBe(Flow.McpAdd);\n });\n\n it('starts with version 0', () => {\n const store = createStore();\n expect(store.getVersion()).toBe(0);\n expect(store.getSnapshot()).toBe(0);\n });\n });\n\n // ── Change notification ──────────────────────────────────────────\n\n describe('change notification', () => {\n it('emitChange increments version and notifies subscribers', () => {\n const store = createStore();\n const listener = jest.fn();\n store.subscribe(listener);\n\n store.emitChange();\n\n expect(store.getVersion()).toBe(1);\n expect(listener).toHaveBeenCalledTimes(1);\n });\n\n it('version increments on each emitChange', () => {\n const store = createStore();\n store.emitChange();\n store.emitChange();\n store.emitChange();\n expect(store.getVersion()).toBe(3);\n });\n });\n\n // ── React integration (subscribe / getSnapshot) ──────────────────\n\n describe('subscribe / getSnapshot', () => {\n it('subscribe registers a listener that fires on change', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.emitChange();\n expect(cb).toHaveBeenCalledTimes(1);\n });\n\n it('subscribe returns an unsubscribe function', () => {\n const store = createStore();\n const cb = jest.fn();\n const unsub = store.subscribe(cb);\n\n unsub();\n store.emitChange();\n expect(cb).not.toHaveBeenCalled();\n });\n\n it('getSnapshot returns the current version', () => {\n const store = createStore();\n expect(store.getSnapshot()).toBe(0);\n store.emitChange();\n expect(store.getSnapshot()).toBe(1);\n });\n\n it('is compatible with useSyncExternalStore contract', () => {\n const store = createStore();\n const cb = jest.fn();\n const unsub = store.subscribe(cb);\n\n const v1 = store.getSnapshot();\n store.completeSetup();\n const v2 = store.getSnapshot();\n\n expect(v2).toBeGreaterThan(v1);\n expect(cb).toHaveBeenCalled();\n unsub();\n });\n });\n\n // ── Session setters ──────────────────────────────────────────────\n\n describe('session setters', () => {\n it('completeSetup sets setupConfirmed and resolves setupComplete promise', async () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.completeSetup();\n\n expect(store.session.setupConfirmed).toBe(true);\n await store.setupComplete;\n expect(cb).toHaveBeenCalled();\n });\n\n it('setRunPhase updates session.runPhase', () => {\n const store = createStore();\n store.setRunPhase(RunPhase.Running);\n expect(store.session.runPhase).toBe(RunPhase.Running);\n });\n\n it('setCredentials updates session.credentials', () => {\n const store = createStore();\n const creds = {\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'https://app.posthog.com',\n projectId: 42,\n };\n store.setCredentials(creds);\n expect(store.session.credentials).toEqual(creds);\n });\n\n it('setFrameworkConfig updates integration and frameworkConfig', () => {\n const store = createStore();\n const integration = Integration.nextjs;\n const config = {\n metadata: { name: 'Next.js' },\n } as WizardStore['session']['frameworkConfig'];\n\n store.setFrameworkConfig(integration, config);\n\n expect(store.session.integration).toBe(integration);\n expect(store.session.frameworkConfig).toBe(config);\n });\n\n it('setDetectionComplete marks detection done', () => {\n const store = createStore();\n expect(store.session.detectionComplete).toBe(false);\n store.setDetectionComplete();\n expect(store.session.detectionComplete).toBe(true);\n });\n\n it('setDetectedFramework sets the label', () => {\n const store = createStore();\n store.setDetectedFramework('Django');\n expect(store.session.detectedFrameworkLabel).toBe('Django');\n });\n\n it('setLoginUrl sets and clears the login URL', () => {\n const store = createStore();\n store.setLoginUrl('https://example.com/auth');\n expect(store.session.loginUrl).toBe('https://example.com/auth');\n\n store.setLoginUrl(null);\n expect(store.session.loginUrl).toBeNull();\n });\n\n it('setServiceStatus sets status info', () => {\n const store = createStore();\n const status = {\n description: 'Major outage',\n statusPageUrl: 'https://status.posthog.com',\n };\n store.setServiceStatus(status);\n expect(store.session.serviceStatus).toEqual(status);\n\n store.setServiceStatus(null);\n expect(store.session.serviceStatus).toBeNull();\n });\n\n it('setMcpComplete marks MCP step done with outcome', () => {\n const store = createStore();\n expect(store.session.mcpComplete).toBe(false);\n store.setMcpComplete(McpOutcome.Installed, ['Cursor']);\n expect(store.session.mcpComplete).toBe(true);\n expect(store.session.mcpOutcome).toBe(McpOutcome.Installed);\n expect(store.session.mcpInstalledClients).toEqual(['Cursor']);\n });\n\n it('setOutroData sets outro information', () => {\n const store = createStore();\n const data = { kind: OutroKind.Success, message: 'Done!' };\n store.setOutroData(data);\n expect(store.session.outroData).toEqual(data);\n });\n\n it('setFrameworkContext sets key-value pairs', () => {\n const store = createStore();\n store.setFrameworkContext('packageManager', 'pnpm');\n expect(store.session.frameworkContext['packageManager']).toBe('pnpm');\n\n store.setFrameworkContext('srcDir', 'src');\n expect(store.session.frameworkContext['srcDir']).toBe('src');\n });\n\n it('every setter emits exactly one change event', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.completeSetup();\n store.setRunPhase(RunPhase.Running);\n store.setCredentials(null);\n store.setDetectionComplete();\n store.setDetectedFramework('React');\n store.setLoginUrl('url');\n store.setServiceStatus(null);\n store.setMcpComplete();\n store.setOutroData({ kind: OutroKind.Success });\n store.setFrameworkContext('k', 'v');\n store.setFrameworkConfig(null, null);\n\n expect(cb).toHaveBeenCalledTimes(11);\n });\n });\n\n // ── Setter analytics events ────────────────────────────────────\n\n describe('setter analytics events', () => {\n it('completeSetup fires setup confirmed event', () => {\n const store = createStore();\n store.completeSetup();\n expect(wizardCaptureMock).toHaveBeenCalledWith(\n 'setup confirmed',\n expect.any(Object),\n );\n });\n\n it('setCredentials fires auth complete event', () => {\n const store = createStore();\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 42,\n });\n expect(wizardCaptureMock).toHaveBeenCalledWith('auth complete', {\n project_id: 42,\n });\n });\n\n it('enableFeature fires feature enabled event', () => {\n const store = createStore();\n store.enableFeature(AdditionalFeature.LLM);\n expect(wizardCaptureMock).toHaveBeenCalledWith('feature enabled', {\n feature: AdditionalFeature.LLM,\n });\n });\n\n it('setMcpComplete fires mcp complete event', () => {\n const store = createStore();\n store.setMcpComplete(McpOutcome.Installed, ['Cursor', 'VS Code']);\n expect(wizardCaptureMock).toHaveBeenCalledWith(\n 'mcp complete',\n expect.objectContaining({\n mcp_outcome: McpOutcome.Installed,\n mcp_installed_clients: ['Cursor', 'VS Code'],\n }),\n );\n });\n });\n\n // ── Screen resolution (derived state) ────────────────────────────\n\n describe('currentScreen', () => {\n it('starts at intro for Wizard flow', () => {\n const store = createStore();\n expect(store.currentScreen).toBe(Screen.Intro);\n });\n\n it('advances to auth after region is set', () => {\n const store = createStore();\n store.completeSetup();\n expect(store.currentScreen).toBe(Screen.Auth);\n });\n\n it('advances to run after credentials are set', () => {\n const store = createStore();\n store.completeSetup();\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n expect(store.currentScreen).toBe(Screen.Run);\n });\n\n it('advances to mcp after run completes', () => {\n const store = createStore();\n store.completeSetup();\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.setRunPhase(RunPhase.Completed);\n expect(store.currentScreen).toBe(Screen.Mcp);\n });\n\n it('advances to outro after mcp completes', () => {\n const store = createStore();\n store.completeSetup();\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.setRunPhase(RunPhase.Completed);\n store.setMcpComplete();\n expect(store.currentScreen).toBe(Screen.Outro);\n });\n\n it('starts at McpAdd for McpAdd flow', () => {\n const store = createStore(Flow.McpAdd);\n expect(store.currentScreen).toBe(Screen.McpAdd);\n });\n\n it('starts at McpRemove for McpRemove flow', () => {\n const store = createStore(Flow.McpRemove);\n expect(store.currentScreen).toBe(Screen.McpRemove);\n });\n });\n\n // ── Overlay navigation ───────────────────────────────────────────\n\n describe('overlay navigation', () => {\n it('pushOverlay shows the overlay over the current screen', () => {\n const store = createStore();\n store.pushOverlay(Overlay.Outage);\n expect(store.currentScreen).toBe(Overlay.Outage);\n });\n\n it('popOverlay returns to the underlying screen', () => {\n const store = createStore();\n store.pushOverlay(Overlay.Outage);\n store.popOverlay();\n expect(store.currentScreen).toBe(Screen.Intro);\n });\n\n it('pushOverlay emits change and increments version', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.pushOverlay(Overlay.Outage);\n\n expect(cb).toHaveBeenCalledTimes(1);\n expect(store.getVersion()).toBe(1);\n });\n\n it('popOverlay emits change and increments version', () => {\n const store = createStore();\n store.pushOverlay(Overlay.Outage);\n\n const cb = jest.fn();\n store.subscribe(cb);\n store.popOverlay();\n\n expect(cb).toHaveBeenCalledTimes(1);\n });\n\n it('pushOverlay sets direction to push', () => {\n const store = createStore();\n store.pushOverlay(Overlay.Outage);\n expect(store.lastNavDirection).toBe('push');\n });\n\n it('popOverlay sets direction to pop', () => {\n const store = createStore();\n store.pushOverlay(Overlay.Outage);\n store.popOverlay();\n expect(store.lastNavDirection).toBe('pop');\n });\n });\n\n // ── Agent observation state ──────────────────────────────────────\n\n describe('statusMessages', () => {\n it('pushStatus appends messages', () => {\n const store = createStore();\n store.pushStatus('Installing SDK...');\n store.pushStatus('Configuring...');\n expect(store.statusMessages).toEqual([\n 'Installing SDK...',\n 'Configuring...',\n ]);\n });\n\n it('pushStatus emits change', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.pushStatus('msg');\n expect(cb).toHaveBeenCalledTimes(1);\n });\n });\n\n describe('tasks', () => {\n it('setTasks replaces the task list', () => {\n const store = createStore();\n const tasks = [\n { label: 'Install SDK', status: TaskStatus.Pending, done: false },\n { label: 'Configure', status: TaskStatus.Pending, done: false },\n ];\n store.setTasks(tasks);\n expect(store.tasks).toEqual(tasks);\n });\n\n it('updateTask marks a task as done', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Install SDK', status: TaskStatus.Pending, done: false },\n ]);\n\n store.updateTask(0, true);\n\n expect(store.tasks[0].done).toBe(true);\n expect(store.tasks[0].status).toBe(TaskStatus.Completed);\n });\n\n it('updateTask marks a task as not done', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Install SDK', status: TaskStatus.Completed, done: true },\n ]);\n\n store.updateTask(0, false);\n\n expect(store.tasks[0].done).toBe(false);\n expect(store.tasks[0].status).toBe(TaskStatus.Pending);\n });\n\n it('updateTask is a no-op for out-of-bounds index', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Install SDK', status: TaskStatus.Pending, done: false },\n ]);\n\n const cb = jest.fn();\n store.subscribe(cb);\n store.updateTask(99, true);\n\n expect(cb).not.toHaveBeenCalled();\n });\n });\n\n describe('syncTodos', () => {\n it('maps incoming todos to TaskItems', () => {\n const store = createStore();\n store.syncTodos([\n { content: 'Install SDK', status: 'pending' },\n { content: 'Configure', status: 'completed' },\n ]);\n\n expect(store.tasks).toHaveLength(2);\n expect(store.tasks[0]).toEqual({\n label: 'Install SDK',\n activeForm: undefined,\n status: TaskStatus.Pending,\n done: false,\n });\n expect(store.tasks[1]).toEqual({\n label: 'Configure',\n activeForm: undefined,\n status: TaskStatus.Completed,\n done: true,\n });\n });\n\n it('retains completed tasks not in the incoming list', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Old done task', status: TaskStatus.Completed, done: true },\n { label: 'Old pending task', status: TaskStatus.Pending, done: false },\n ]);\n\n store.syncTodos([{ content: 'New task', status: 'pending' }]);\n\n // Old done task is retained, old pending task is dropped\n expect(store.tasks).toHaveLength(2);\n expect(store.tasks[0].label).toBe('Old done task');\n expect(store.tasks[1].label).toBe('New task');\n });\n\n it('does not duplicate completed tasks that appear in both', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Shared task', status: TaskStatus.Completed, done: true },\n ]);\n\n store.syncTodos([{ content: 'Shared task', status: 'completed' }]);\n\n // Should not have duplicates — incomingLabels includes \"Shared task\",\n // so the retained filter excludes it\n expect(store.tasks).toHaveLength(1);\n expect(store.tasks[0].label).toBe('Shared task');\n });\n\n it('preserves activeForm from incoming todos', () => {\n const store = createStore();\n store.syncTodos([\n {\n content: 'Installing',\n status: 'in_progress',\n activeForm: 'Installing SDK...',\n },\n ]);\n\n expect(store.tasks[0].activeForm).toBe('Installing SDK...');\n });\n\n it('emits change', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n store.syncTodos([{ content: 'task', status: 'pending' }]);\n expect(cb).toHaveBeenCalled();\n });\n });\n\n // ── Navigation direction ─────────────────────────────────────────\n\n describe('lastNavDirection', () => {\n it('starts as null', () => {\n const store = createStore();\n expect(store.lastNavDirection).toBeNull();\n });\n\n it('is set to push on emitChange', () => {\n const store = createStore();\n store.emitChange();\n expect(store.lastNavDirection).toBe('push');\n });\n });\n\n // ── Concurrent / rapid-fire mutations ─────────────────────────────\n\n describe('concurrent mutations', () => {\n it('rapid-fire setters each increment version by 1', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.completeSetup();\n store.setRunPhase(RunPhase.Running);\n store.pushStatus('msg1');\n store.pushStatus('msg2');\n store.setDetectedFramework('React');\n\n expect(store.getVersion()).toBe(5);\n expect(cb).toHaveBeenCalledTimes(5);\n });\n\n it('subscriber sees consistent state during a setter call', () => {\n const store = createStore();\n const snapshots: { confirmed: boolean; version: number }[] = [];\n\n store.subscribe(() => {\n snapshots.push({\n confirmed: store.session.setupConfirmed,\n version: store.getSnapshot(),\n });\n });\n\n store.completeSetup();\n\n expect(snapshots).toEqual([{ confirmed: true, version: 1 }]);\n });\n\n it('multiple subscribers all see the same state', () => {\n const store = createStore();\n const results: number[] = [];\n\n store.subscribe(() => results.push(store.getSnapshot()));\n store.subscribe(() => results.push(store.getSnapshot()));\n store.subscribe(() => results.push(store.getSnapshot()));\n\n store.completeSetup();\n\n // All 3 subscribers should see version 1\n expect(results).toEqual([1, 1, 1]);\n });\n\n it('subscriber that mutates store during notification triggers additional notifications', () => {\n const store = createStore();\n const versions: number[] = [];\n\n // First subscriber triggers another mutation\n store.subscribe(() => {\n versions.push(store.getSnapshot());\n if (\n store.session.setupConfirmed &&\n store.session.runPhase === RunPhase.Idle\n ) {\n store.setRunPhase(RunPhase.Running);\n }\n });\n\n store.completeSetup();\n\n // Should see version 1 (from completeSetup) and version 2 (from setRunPhase)\n expect(versions).toEqual([1, 2]);\n expect(store.session.runPhase).toBe(RunPhase.Running);\n });\n\n it('interleaved overlay and session mutations are all visible', () => {\n const store = createStore();\n const screens: string[] = [];\n\n store.subscribe(() => {\n screens.push(store.currentScreen);\n });\n\n store.completeSetup(); // -> auth\n store.pushOverlay(Overlay.Outage); // -> outage\n store.setCredentials({\n // -> outage (overlay still on top)\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.popOverlay(); // -> run\n\n expect(screens).toEqual([\n Screen.Auth,\n Overlay.Outage,\n Overlay.Outage,\n Screen.Run,\n ]);\n });\n\n it('unsubscribing mid-notification does not affect other subscribers', () => {\n const store = createStore();\n const log: string[] = [];\n\n store.subscribe(() => {\n log.push('sub1');\n });\n\n const unsub2 = store.subscribe(() => {\n log.push('sub2');\n });\n\n store.subscribe(() => {\n log.push('sub3');\n });\n\n store.emitChange();\n expect(log).toEqual(['sub1', 'sub2', 'sub3']);\n\n // Unsub the second listener\n unsub2();\n log.length = 0;\n store.emitChange();\n expect(log).toEqual(['sub1', 'sub3']);\n });\n });\n\n // ── Multiple subscribers ─────────────────────────────────────────\n\n describe('multiple subscribers', () => {\n it('supports many concurrent subscribers', () => {\n const store = createStore();\n const callbacks = Array.from({ length: 50 }, () => jest.fn());\n const unsubs = callbacks.map((cb) => store.subscribe(cb));\n\n store.emitChange();\n\n callbacks.forEach((cb) => expect(cb).toHaveBeenCalledTimes(1));\n\n // Unsubscribe all\n unsubs.forEach((unsub) => unsub());\n store.emitChange();\n\n // No more notifications\n callbacks.forEach((cb) => expect(cb).toHaveBeenCalledTimes(1));\n });\n\n it('double-unsubscribe is safe', () => {\n const store = createStore();\n const cb = jest.fn();\n const unsub = store.subscribe(cb);\n\n unsub();\n unsub(); // should not throw\n\n store.emitChange();\n expect(cb).not.toHaveBeenCalled();\n });\n });\n\n // ── Edge cases ───────────────────────────────────────────────────\n\n describe('edge cases', () => {\n it('setFrameworkContext overwrites existing keys', () => {\n const store = createStore();\n store.setFrameworkContext('key', 'value1');\n store.setFrameworkContext('key', 'value2');\n expect(store.session.frameworkContext['key']).toBe('value2');\n });\n\n it('setFrameworkConfig with null integration and config', () => {\n const store = createStore();\n store.setFrameworkConfig(null, null);\n expect(store.session.integration).toBeNull();\n expect(store.session.frameworkConfig).toBeNull();\n });\n\n it('pushStatus with empty string', () => {\n const store = createStore();\n store.pushStatus('');\n expect(store.statusMessages).toEqual(['']);\n });\n\n it('syncTodos with empty array clears non-completed tasks', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Pending', status: TaskStatus.Pending, done: false },\n { label: 'Done', status: TaskStatus.Completed, done: true },\n ]);\n\n store.syncTodos([]);\n\n // Only the completed task is retained\n expect(store.tasks).toEqual([\n { label: 'Done', status: TaskStatus.Completed, done: true },\n ]);\n });\n\n it('syncTodos with unknown status defaults to Pending', () => {\n const store = createStore();\n store.syncTodos([{ content: 'Task', status: '' }]);\n expect(store.tasks[0].status).toBe(TaskStatus.Pending);\n });\n\n it('updateTask with negative index is a no-op', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Task', status: TaskStatus.Pending, done: false },\n ]);\n const cb = jest.fn();\n store.subscribe(cb);\n store.updateTask(-1, true);\n expect(cb).not.toHaveBeenCalled();\n });\n\n it('popOverlay on empty stack does not crash', () => {\n const store = createStore();\n expect(() => store.popOverlay()).not.toThrow();\n expect(store.currentScreen).toBe(Screen.Intro);\n });\n\n it('screen advances to outro on RunPhase.Error too', () => {\n const store = createStore();\n store.completeSetup();\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.setRunPhase(RunPhase.Error);\n // Run is \"complete\" (either Completed or Error), so we advance past it\n expect(store.currentScreen).toBe(Screen.Mcp);\n });\n\n it('completeSetup can only resolve the promise once', async () => {\n const store = createStore();\n store.completeSetup();\n store.completeSetup(); // second call — promise already resolved\n\n await store.setupComplete;\n expect(store.session.setupConfirmed).toBe(true);\n });\n\n it('version property (string) is independent from internal _version counter', () => {\n const store = createStore();\n store.version = '1.2.3';\n expect(store.version).toBe('1.2.3');\n expect(store.getVersion()).toBe(0);\n\n store.emitChange();\n expect(store.version).toBe('1.2.3');\n expect(store.getVersion()).toBe(1);\n });\n });\n\n // ── Full wizard flow simulation ──────────────────────────────────\n\n describe('full wizard flow', () => {\n it('walks through the entire wizard flow correctly', () => {\n const store = createStore();\n const screenHistory: string[] = [];\n store.subscribe(() => screenHistory.push(store.currentScreen));\n\n expect(store.currentScreen).toBe(Screen.Intro);\n\n // Step 1: Confirm setup\n store.completeSetup();\n expect(store.currentScreen).toBe(Screen.Auth);\n\n // Step 2: Authenticate\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'https://app.posthog.com',\n projectId: 1,\n });\n expect(store.currentScreen).toBe(Screen.Run);\n\n // Step 3: Start and complete run\n store.setRunPhase(RunPhase.Running);\n expect(store.currentScreen).toBe(Screen.Run);\n\n store.setRunPhase(RunPhase.Completed);\n expect(store.currentScreen).toBe(Screen.Mcp);\n\n // Step 4: Complete MCP\n store.setMcpComplete();\n expect(store.currentScreen).toBe(Screen.Outro);\n\n // Verify version was bumped for each setter call\n expect(store.getVersion()).toBe(5);\n });\n });\n\n // ── setupComplete promise ────────────────────────────────────────\n\n describe('setupComplete', () => {\n it('resolves when completeSetup is called', async () => {\n const store = createStore();\n store.completeSetup();\n await store.setupComplete;\n expect(store.session.setupConfirmed).toBe(true);\n });\n\n it('is a promise that can be awaited before completeSetup is called', async () => {\n const store = createStore();\n\n let resolved = false;\n void store.setupComplete.then(() => {\n resolved = true;\n });\n\n // Not yet resolved\n await Promise.resolve(); // flush microtasks\n expect(resolved).toBe(false);\n\n store.completeSetup();\n await store.setupComplete;\n expect(resolved).toBe(true);\n });\n });\n});\n"]}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * LearnCard — PostHog educational content with animated text reveal.
3
+ */
4
+ import type { WizardStore } from '../store.js';
5
+ interface LearnCardProps {
6
+ store?: WizardStore;
7
+ onComplete?: () => void;
8
+ }
9
+ export declare const LearnCard: ({ store, onComplete }: LearnCardProps) => import("react/jsx-runtime").JSX.Element;
10
+ export {};
@@ -0,0 +1,217 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * LearnCard — PostHog educational content with animated text reveal.
4
+ */
5
+ import { Box, Text } from 'ink';
6
+ import { useEffect, useMemo, useRef } from 'react';
7
+ import { Colors } from '../styles.js';
8
+ import { ContentSequencer, TextRevealMode } from '../primitives/index.js';
9
+ import { useStdoutDimensions } from '../hooks/useStdoutDimensions.js';
10
+ import { COLLAPSED_COUNT, EXPANDED_COUNT } from '../primitives/TabContainer.js';
11
+ /**
12
+ * StatusPeekTrigger — Fires the status bar expansion once, renders nothing.
13
+ * The peek is guarded by peekedRef so re-mounts are safe.
14
+ */
15
+ const StatusPeekTrigger = ({ store, duration = 10000, peekedRef, }) => {
16
+ useEffect(() => {
17
+ if (peekedRef.current)
18
+ return;
19
+ peekedRef.current = true;
20
+ store?.setStatusExpanded(true);
21
+ // No cleanup — the store call is safe after unmount and the component
22
+ // may be evicted before the timer fires (non-persist NodeBlock).
23
+ setTimeout(() => {
24
+ store?.setStatusExpanded(false);
25
+ }, duration);
26
+ }, [store, duration, peekedRef]);
27
+ return _jsx(Text, { children: "You can view the Wizard's status below." });
28
+ };
29
+ const POSTHOG_DATA_FLOW = {
30
+ type: 'lines',
31
+ interval: 500,
32
+ pause: 8000,
33
+ // Box is 30 chars wide between │ borders.
34
+ // Labels: 1-char indent. Arrows: " ↓ " (5). Sub-items: " │ " (7).
35
+ lines: [
36
+ _jsx(Text, { color: "gray", children: ' ┌──────────────────────────────┐' }),
37
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' │ ' }), _jsx(Text, { bold: true, color: "cyan", children: "Your App" }), _jsx(Text, { color: "gray", children: ' │' })] }),
38
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' │ │ ' }), _jsx(Text, { children: "posthog.capture()" }), _jsx(Text, { color: "gray", children: ' │' })] }),
39
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' │ │ ' }), _jsx(Text, { dimColor: true, children: "custom events" }), _jsx(Text, { color: "gray", children: ' │' })] }),
40
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' │ │ ' }), _jsx(Text, { dimColor: true, children: "custom properties" }), _jsx(Text, { color: "gray", children: ' │' })] }),
41
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' │ │ ' }), _jsx(Text, { dimColor: true, children: "person profiles" }), _jsx(Text, { color: "gray", children: ' │' })] }),
42
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' │ ↓ ' }), _jsx(Text, { dimColor: true, children: "groups" }), _jsx(Text, { color: "gray", children: ' │' })] }),
43
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' │ ' }), _jsx(Text, { bold: true, color: Colors.accent, children: "PostHog SDK" }), _jsx(Text, { color: "gray", children: ' │' })] }),
44
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' │ ↓ ' }), _jsx(Text, { children: "HTTP" }), _jsx(Text, { color: "gray", children: ' │' })] }),
45
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' │ ' }), _jsx(Text, { bold: true, color: Colors.accent, children: "PostHog Cloud" }), _jsx(Text, { color: "gray", children: ' │' })] }),
46
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' │ ↓ ' }), _jsx(Text, { children: "query + visualize" }), _jsx(Text, { color: "gray", children: ' │' })] }),
47
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' │ ' }), _jsx(Text, { bold: true, color: "green", children: "Dashboards & Insights" }), _jsx(Text, { color: "gray", children: ' │' })] }),
48
+ _jsx(Text, { color: "gray", children: ' └──────────────────────────────┘' }),
49
+ ],
50
+ };
51
+ const PRODUCT_SUITE_BLOCK = {
52
+ type: 'lines',
53
+ interval: 1000,
54
+ pause: 15000,
55
+ lines: [
56
+ _jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: ' ◆ ' }), 'Product Analytics ', _jsx(Text, { color: "cyan", children: '◆ ' }), 'Error Tracking'] }),
57
+ _jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: ' ◆ ' }), 'Web Analytics ', _jsx(Text, { color: "cyan", children: '◆ ' }), 'Session Replay'] }),
58
+ _jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: ' ◆ ' }), 'Feature Flags ', _jsx(Text, { color: "cyan", children: '◆ ' }), 'Data Pipelines'] }),
59
+ _jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: ' ◆ ' }), 'Experiments ', _jsx(Text, { color: "cyan", children: '◆ ' }), 'Data Warehouse'] }),
60
+ _jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: ' ◆ ' }), 'LLM Analytics ', _jsx(Text, { color: "cyan", children: '◆ ' }), 'Surveys'] }),
61
+ _jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: ' ◆ ' }), 'Workflows ', _jsx(Text, { color: "cyan", children: '◆ ' }), 'Logs'] }),
62
+ _jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: ' ◆ ' }), 'Product Tours ', _jsx(Text, { color: "cyan", children: '◆ ' }), 'Support'] }),
63
+ _jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: ' ◆ ' }), 'Revenue Analytics ', _jsx(Text, { color: "cyan", children: '◆ ' }), 'Endpoints'] }),
64
+ _jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: ' ◆ ' }), 'Customer Analytics'] }),
65
+ ],
66
+ };
67
+ const LINE_CHART_BLOCK = {
68
+ type: 'lines',
69
+ interval: 300,
70
+ pause: 6000,
71
+ lines: [
72
+ _jsx(Text, { bold: true, children: ' Trends · user signups (monthly)' }),
73
+ _jsx(Text, { children: " " }),
74
+ // 10k
75
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' 10k ┤' }), ' ', _jsx(Text, { color: "cyan", children: '╭──' }), _jsx(Text, { dimColor: true, children: ' 9,575' })] }),
76
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' │' }), ' ', _jsx(Text, { color: "cyan", children: '╭╯' })] }),
77
+ // 7.5k
78
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' 7.5k ┤' }), ' ', _jsx(Text, { color: "cyan", children: '╭╯' })] }),
79
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' │' }), ' ', _jsx(Text, { color: "cyan", children: '╭─╯' })] }),
80
+ // 5k
81
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' 5k ┤' }), ' ', _jsx(Text, { color: "cyan", children: '╭─╯' })] }),
82
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' │' }), ' ', _jsx(Text, { color: "cyan", children: '╭──╯' })] }),
83
+ // 2.5k
84
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' 2.5k ┤' }), ' ', _jsx(Text, { color: "cyan", children: '╭───╯' })] }),
85
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' │' }), ' ', _jsx(Text, { color: "cyan", children: '╭──────╯' })] }),
86
+ // 0
87
+ _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: ' 0 ┤' }), _jsx(Text, { color: "cyan", children: '──────╯' })] }),
88
+ // X-axis
89
+ _jsx(Text, { color: "gray", children: ' └┬─────┬─────┬─────┬─────┬──' }),
90
+ _jsx(Text, { dimColor: true, children: ' May Aug Nov Feb May' }),
91
+ ],
92
+ };
93
+ const FUNNEL_BLOCK = {
94
+ type: 'lines',
95
+ interval: 200,
96
+ pause: 8000,
97
+ lines: [
98
+ _jsx(Text, { bold: true, children: ' Funnel · ride conversion' }),
99
+ _jsx(Text, { children: " " }),
100
+ // Step 1
101
+ _jsxs(Text, { children: [' ', _jsx(Text, { bold: true, children: "1" }), ' app_launched', ' ', _jsx(Text, { bold: true, color: "green", children: "100.00%" })] }),
102
+ _jsx(Text, { color: "cyan", children: ' ██████████████████████████████' }),
103
+ _jsx(Text, { dimColor: true, children: ' → 1,200 users' }),
104
+ _jsx(Text, { children: " " }),
105
+ // Step 2
106
+ _jsxs(Text, { children: [' ', _jsx(Text, { bold: true, children: "2" }), ' ride_requested', ' ', _jsx(Text, { dimColor: true, children: 'avg 2m 30s' }), ' ', _jsx(Text, { bold: true, color: "green", children: "72.00%" })] }),
107
+ _jsxs(Text, { children: [' ', _jsx(Text, { color: "cyan", children: '██████████████████████' }), _jsx(Text, { dimColor: true, children: '░░░░░░░░░' })] }),
108
+ _jsxs(Text, { children: [' ', _jsx(Text, { dimColor: true, children: "\u2192 864 users" }), ' ', _jsx(Text, { color: "red", children: "\u2198" }), _jsx(Text, { dimColor: true, children: ' 336 (28%)' })] }),
109
+ _jsx(Text, { children: " " }),
110
+ // Step 3
111
+ _jsxs(Text, { children: [' ', _jsx(Text, { bold: true, children: "3" }), ' ride_accepted', ' ', _jsx(Text, { dimColor: true, children: 'avg 5m 12s' }), ' ', _jsx(Text, { bold: true, color: "green", children: "51.00%" })] }),
112
+ _jsxs(Text, { children: [' ', _jsx(Text, { color: "cyan", children: '██████████████████' }), _jsx(Text, { dimColor: true, children: '░░░░░░░░░░░░░' })] }),
113
+ _jsxs(Text, { children: [' ', _jsx(Text, { dimColor: true, children: "\u2192 612 users" }), ' ', _jsx(Text, { color: "red", children: "\u2198" }), _jsx(Text, { dimColor: true, children: ' 252 (29%)' })] }),
114
+ _jsx(Text, { children: " " }),
115
+ // Step 4
116
+ _jsxs(Text, { children: [' ', _jsx(Text, { bold: true, children: "4" }), ' ride_started', ' ', _jsx(Text, { dimColor: true, children: 'avg 1m 45s' }), ' ', _jsx(Text, { bold: true, color: "green", children: "38.00%" })] }),
117
+ _jsxs(Text, { children: [' ', _jsx(Text, { color: "cyan", children: '█████████████' }), _jsx(Text, { dimColor: true, children: '░░░░░░░░░░░░░░░░░░' })] }),
118
+ _jsxs(Text, { children: [' ', _jsx(Text, { dimColor: true, children: "\u2192 456 users" }), ' ', _jsx(Text, { color: "red", children: "\u2198" }), _jsx(Text, { dimColor: true, children: ' 156 (25%)' })] }),
119
+ ],
120
+ };
121
+ /** Fixed chrome: ScreenContainer (3) + TabContainer tab bar (2) */
122
+ const FIXED_CHROME = 5;
123
+ const HEADER_ROWS = 2; // title + spacer
124
+ const MIN_CONTENT_ROWS = 6;
125
+ export const LearnCard = ({ store, onComplete }) => {
126
+ const peekedRef = useRef(false);
127
+ const [columns, rows] = useStdoutDimensions();
128
+ const blocks = useMemo(() => [
129
+ {
130
+ content: 'Welcome.',
131
+ pause: 3000,
132
+ mode: TextRevealMode.Typewriter,
133
+ animationInterval: 160,
134
+ },
135
+ { content: 'The Wizard is an agent.', pause: 4000 },
136
+ {
137
+ content: 'It handles the entire PostHog setup process on your behalf.',
138
+ pause: 5000,
139
+ },
140
+ {
141
+ content: "As we speak, it's building a plan to set up PostHog in your project.",
142
+ pause: 6000,
143
+ },
144
+ { type: 'clear', pause: 2000 },
145
+ {
146
+ pause: 5000,
147
+ persist: true,
148
+ content: _jsx(StatusPeekTrigger, { store: store, peekedRef: peekedRef }),
149
+ },
150
+ {
151
+ pause: 6000,
152
+ content: (_jsxs(Text, { children: ["Press", ' ', _jsx(Text, { color: Colors.accent, bold: true, children: "S" }), ' ', "to expand or collapse the status."] })),
153
+ },
154
+ { type: 'clear', pause: 2000 },
155
+ {
156
+ content: 'It takes about eight minutes.',
157
+ pause: 2000,
158
+ },
159
+ {
160
+ content: 'So grab some coffee ☕️.',
161
+ pause: 2000,
162
+ },
163
+ {
164
+ content: 'Or stick around and learn about PostHog.',
165
+ pause: 5000,
166
+ },
167
+ { type: 'clear', pause: 3000 },
168
+ {
169
+ content: 'Events are the foundation of the PostHog platform.',
170
+ pause: 4000,
171
+ },
172
+ {
173
+ content: 'Every time an action is performed in your codebase — like button clicks, function calls, or thrown errors — we can capture an event.',
174
+ pause: 6000,
175
+ },
176
+ {
177
+ content: 'Events are sent to PostHog and joined with other product data.',
178
+ pause: 6000,
179
+ },
180
+ { type: 'clear', pause: 1000 },
181
+ { content: "Here's the flow.", pause: 1000 },
182
+ POSTHOG_DATA_FLOW,
183
+ { type: 'clear', pause: 2000 },
184
+ {
185
+ content: 'With enough event data, you can answer powerful questions about your product.',
186
+ pause: 4000,
187
+ },
188
+ { content: 'And create insights.', pause: 4000 },
189
+ { type: 'clear', pause: 500 },
190
+ { content: 'Like trends to measure growth.', pause: 2500 },
191
+ LINE_CHART_BLOCK,
192
+ { type: 'clear', pause: 500 },
193
+ { content: 'Or funnels to reveal bottlenecks.', pause: 2500 },
194
+ FUNNEL_BLOCK,
195
+ { type: 'clear', pause: 1000 },
196
+ {
197
+ content: 'Use those signals to decide what to build next.',
198
+ pause: 4000,
199
+ },
200
+ { content: 'PostHog has all the dev tools you need.', pause: 3000 },
201
+ PRODUCT_SUITE_BLOCK,
202
+ ], [store]);
203
+ // Dynamic status bar height: messages + border when present
204
+ const hasStatus = store ? store.statusMessages.length > 0 : false;
205
+ const statusBarRows = hasStatus
206
+ ? (store?.statusExpanded ? EXPANDED_COUNT : COLLAPSED_COUNT) + 1
207
+ : 0;
208
+ const contentHeight = rows - FIXED_CHROME - statusBarRows;
209
+ const tooSmall = contentHeight < MIN_CONTENT_ROWS;
210
+ const maxHeight = Math.max(1, contentHeight - HEADER_ROWS);
211
+ // Half of clamped content width, minus paddingX on both sides
212
+ const paneWidth = Math.floor((Math.min(120, columns) - 2) / 2) - 2;
213
+ // Always render so ContentSequencer stays mounted (preserves activeIdx).
214
+ // When too small, hide visually via display="none".
215
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 1, display: tooSmall ? 'none' : 'flex', children: [_jsx(Text, { bold: true, color: Colors.accent, children: "Learn" }), _jsx(Box, { height: 1 }), _jsx(ContentSequencer, { blocks: blocks, mode: TextRevealMode.SentenceBySentence, maxHeight: maxHeight, availableWidth: paneWidth, startDelay: 2000, initialBlockIdx: store?.learnCardBlockIdx ?? 0, onBlockChange: (idx) => store?.setLearnCardBlockIdx(idx), onSequenceComplete: onComplete })] }));
216
+ };
217
+ //# sourceMappingURL=LearnCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LearnCard.js","sourceRoot":"","sources":["../../../../../src/ui/tui/components/LearnCard.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * LearnCard — PostHog educational content with animated text reveal.\n */\n\nimport { Box, Text } from 'ink';\nimport { useEffect, useMemo, useRef } from 'react';\nimport { Colors } from '../styles.js';\nimport type { WizardStore } from '../store.js';\nimport { ContentSequencer, TextRevealMode } from '../primitives/index.js';\nimport type { ContentBlock } from '../primitives/index.js';\nimport { useStdoutDimensions } from '../hooks/useStdoutDimensions.js';\nimport { COLLAPSED_COUNT, EXPANDED_COUNT } from '../primitives/TabContainer.js';\n\n/**\n * StatusPeekTrigger — Fires the status bar expansion once, renders nothing.\n * The peek is guarded by peekedRef so re-mounts are safe.\n */\nconst StatusPeekTrigger = ({\n store,\n duration = 10000,\n peekedRef,\n}: {\n store?: WizardStore;\n duration?: number;\n peekedRef: ReturnType<typeof useRef<boolean>>;\n}) => {\n useEffect(() => {\n if (peekedRef.current) return;\n peekedRef.current = true;\n store?.setStatusExpanded(true);\n // No cleanup — the store call is safe after unmount and the component\n // may be evicted before the timer fires (non-persist NodeBlock).\n setTimeout(() => {\n store?.setStatusExpanded(false);\n }, duration);\n }, [store, duration, peekedRef]);\n\n return <Text>You can view the Wizard&apos;s status below.</Text>;\n};\n\nconst POSTHOG_DATA_FLOW: ContentBlock = {\n type: 'lines',\n interval: 500,\n pause: 8000,\n // Box is 30 chars wide between │ borders.\n // Labels: 1-char indent. Arrows: \" ↓ \" (5). Sub-items: \" │ \" (7).\n lines: [\n <Text color=\"gray\">{' ┌──────────────────────────────┐'}</Text>,\n <Text>\n <Text color=\"gray\">{' │ '}</Text>\n <Text bold color=\"cyan\">\n Your App\n </Text>\n <Text color=\"gray\">{' │'}</Text>\n </Text>,\n <Text>\n <Text color=\"gray\">{' │ │ '}</Text>\n <Text>posthog.capture()</Text>\n <Text color=\"gray\">{' │'}</Text>\n </Text>,\n <Text>\n <Text color=\"gray\">{' │ │ '}</Text>\n <Text dimColor>custom events</Text>\n <Text color=\"gray\">{' │'}</Text>\n </Text>,\n <Text>\n <Text color=\"gray\">{' │ │ '}</Text>\n <Text dimColor>custom properties</Text>\n <Text color=\"gray\">{' │'}</Text>\n </Text>,\n <Text>\n <Text color=\"gray\">{' │ │ '}</Text>\n <Text dimColor>person profiles</Text>\n <Text color=\"gray\">{' │'}</Text>\n </Text>,\n <Text>\n <Text color=\"gray\">{' │ ↓ '}</Text>\n <Text dimColor>groups</Text>\n <Text color=\"gray\">{' │'}</Text>\n </Text>,\n <Text>\n <Text color=\"gray\">{' │ '}</Text>\n <Text bold color={Colors.accent}>\n PostHog SDK\n </Text>\n <Text color=\"gray\">{' │'}</Text>\n </Text>,\n <Text>\n <Text color=\"gray\">{' │ ↓ '}</Text>\n <Text>HTTP</Text>\n <Text color=\"gray\">{' │'}</Text>\n </Text>,\n <Text>\n <Text color=\"gray\">{' │ '}</Text>\n <Text bold color={Colors.accent}>\n PostHog Cloud\n </Text>\n <Text color=\"gray\">{' │'}</Text>\n </Text>,\n <Text>\n <Text color=\"gray\">{' │ ↓ '}</Text>\n <Text>query + visualize</Text>\n <Text color=\"gray\">{' │'}</Text>\n </Text>,\n <Text>\n <Text color=\"gray\">{' │ '}</Text>\n <Text bold color=\"green\">\n Dashboards & Insights\n </Text>\n <Text color=\"gray\">{' │'}</Text>\n </Text>,\n <Text color=\"gray\">{' └──────────────────────────────┘'}</Text>,\n ],\n};\n\nconst PRODUCT_SUITE_BLOCK: ContentBlock = {\n type: 'lines',\n interval: 1000,\n pause: 15000,\n lines: [\n <Text>\n <Text color=\"cyan\">{' ◆ '}</Text>\n {'Product Analytics '}\n <Text color=\"cyan\">{'◆ '}</Text>\n {'Error Tracking'}\n </Text>,\n <Text>\n <Text color=\"cyan\">{' ◆ '}</Text>\n {'Web Analytics '}\n <Text color=\"cyan\">{'◆ '}</Text>\n {'Session Replay'}\n </Text>,\n <Text>\n <Text color=\"cyan\">{' ◆ '}</Text>\n {'Feature Flags '}\n <Text color=\"cyan\">{'◆ '}</Text>\n {'Data Pipelines'}\n </Text>,\n <Text>\n <Text color=\"cyan\">{' ◆ '}</Text>\n {'Experiments '}\n <Text color=\"cyan\">{'◆ '}</Text>\n {'Data Warehouse'}\n </Text>,\n <Text>\n <Text color=\"cyan\">{' ◆ '}</Text>\n {'LLM Analytics '}\n <Text color=\"cyan\">{'◆ '}</Text>\n {'Surveys'}\n </Text>,\n <Text>\n <Text color=\"cyan\">{' ◆ '}</Text>\n {'Workflows '}\n <Text color=\"cyan\">{'◆ '}</Text>\n {'Logs'}\n </Text>,\n <Text>\n <Text color=\"cyan\">{' ◆ '}</Text>\n {'Product Tours '}\n <Text color=\"cyan\">{'◆ '}</Text>\n {'Support'}\n </Text>,\n <Text>\n <Text color=\"cyan\">{' ◆ '}</Text>\n {'Revenue Analytics '}\n <Text color=\"cyan\">{'◆ '}</Text>\n {'Endpoints'}\n </Text>,\n <Text>\n <Text color=\"cyan\">{' ◆ '}</Text>\n {'Customer Analytics'}\n </Text>,\n ],\n};\n\nconst LINE_CHART_BLOCK: ContentBlock = {\n type: 'lines',\n interval: 300,\n pause: 6000,\n lines: [\n <Text bold>{' Trends · user signups (monthly)'}</Text>,\n <Text> </Text>,\n // 10k\n <Text>\n <Text color=\"gray\">{' 10k ┤'}</Text>\n {' '}\n <Text color=\"cyan\">{'╭──'}</Text>\n <Text dimColor>{' 9,575'}</Text>\n </Text>,\n <Text>\n <Text color=\"gray\">{' │'}</Text>\n {' '}\n <Text color=\"cyan\">{'╭╯'}</Text>\n </Text>,\n // 7.5k\n <Text>\n <Text color=\"gray\">{' 7.5k ┤'}</Text>\n {' '}\n <Text color=\"cyan\">{'╭╯'}</Text>\n </Text>,\n <Text>\n <Text color=\"gray\">{' │'}</Text>\n {' '}\n <Text color=\"cyan\">{'╭─╯'}</Text>\n </Text>,\n // 5k\n <Text>\n <Text color=\"gray\">{' 5k ┤'}</Text>\n {' '}\n <Text color=\"cyan\">{'╭─╯'}</Text>\n </Text>,\n <Text>\n <Text color=\"gray\">{' │'}</Text>\n {' '}\n <Text color=\"cyan\">{'╭──╯'}</Text>\n </Text>,\n // 2.5k\n <Text>\n <Text color=\"gray\">{' 2.5k ┤'}</Text>\n {' '}\n <Text color=\"cyan\">{'╭───╯'}</Text>\n </Text>,\n <Text>\n <Text color=\"gray\">{' │'}</Text>\n {' '}\n <Text color=\"cyan\">{'╭──────╯'}</Text>\n </Text>,\n // 0\n <Text>\n <Text color=\"gray\">{' 0 ┤'}</Text>\n <Text color=\"cyan\">{'──────╯'}</Text>\n </Text>,\n // X-axis\n <Text color=\"gray\">{' └┬─────┬─────┬─────┬─────┬──'}</Text>,\n <Text dimColor>{' May Aug Nov Feb May'}</Text>,\n ],\n};\n\nconst FUNNEL_BLOCK: ContentBlock = {\n type: 'lines',\n interval: 200,\n pause: 8000,\n lines: [\n <Text bold>{' Funnel · ride conversion'}</Text>,\n <Text> </Text>,\n // Step 1\n <Text>\n {' '}\n <Text bold>1</Text>\n {' app_launched'}\n {' '}\n <Text bold color=\"green\">\n 100.00%\n </Text>\n </Text>,\n <Text color=\"cyan\">{' ██████████████████████████████'}</Text>,\n <Text dimColor>{' → 1,200 users'}</Text>,\n <Text> </Text>,\n // Step 2\n <Text>\n {' '}\n <Text bold>2</Text>\n {' ride_requested'}\n {' '}\n <Text dimColor>{'avg 2m 30s'}</Text>\n {' '}\n <Text bold color=\"green\">\n 72.00%\n </Text>\n </Text>,\n <Text>\n {' '}\n <Text color=\"cyan\">{'██████████████████████'}</Text>\n <Text dimColor>{'░░░░░░░░░'}</Text>\n </Text>,\n <Text>\n {' '}\n <Text dimColor>→ 864 users</Text>\n {' '}\n <Text color=\"red\">↘</Text>\n <Text dimColor>{' 336 (28%)'}</Text>\n </Text>,\n <Text> </Text>,\n // Step 3\n <Text>\n {' '}\n <Text bold>3</Text>\n {' ride_accepted'}\n {' '}\n <Text dimColor>{'avg 5m 12s'}</Text>\n {' '}\n <Text bold color=\"green\">\n 51.00%\n </Text>\n </Text>,\n <Text>\n {' '}\n <Text color=\"cyan\">{'██████████████████'}</Text>\n <Text dimColor>{'░░░░░░░░░░░░░'}</Text>\n </Text>,\n <Text>\n {' '}\n <Text dimColor>→ 612 users</Text>\n {' '}\n <Text color=\"red\">↘</Text>\n <Text dimColor>{' 252 (29%)'}</Text>\n </Text>,\n <Text> </Text>,\n // Step 4\n <Text>\n {' '}\n <Text bold>4</Text>\n {' ride_started'}\n {' '}\n <Text dimColor>{'avg 1m 45s'}</Text>\n {' '}\n <Text bold color=\"green\">\n 38.00%\n </Text>\n </Text>,\n <Text>\n {' '}\n <Text color=\"cyan\">{'█████████████'}</Text>\n <Text dimColor>{'░░░░░░░░░░░░░░░░░░'}</Text>\n </Text>,\n <Text>\n {' '}\n <Text dimColor>→ 456 users</Text>\n {' '}\n <Text color=\"red\">↘</Text>\n <Text dimColor>{' 156 (25%)'}</Text>\n </Text>,\n ],\n};\n\n/** Fixed chrome: ScreenContainer (3) + TabContainer tab bar (2) */\nconst FIXED_CHROME = 5;\nconst HEADER_ROWS = 2; // title + spacer\nconst MIN_CONTENT_ROWS = 6;\n\ninterface LearnCardProps {\n store?: WizardStore;\n onComplete?: () => void;\n}\n\nexport const LearnCard = ({ store, onComplete }: LearnCardProps) => {\n const peekedRef = useRef(false);\n const [columns, rows] = useStdoutDimensions();\n\n const blocks = useMemo<ContentBlock[]>(\n () => [\n {\n content: 'Welcome.',\n pause: 3000,\n mode: TextRevealMode.Typewriter,\n animationInterval: 160,\n },\n\n { content: 'The Wizard is an agent.', pause: 4000 },\n\n {\n content: 'It handles the entire PostHog setup process on your behalf.',\n pause: 5000,\n },\n\n {\n content:\n \"As we speak, it's building a plan to set up PostHog in your project.\",\n pause: 6000,\n },\n\n { type: 'clear', pause: 2000 },\n\n {\n pause: 5000,\n persist: true,\n content: <StatusPeekTrigger store={store} peekedRef={peekedRef} />,\n },\n\n {\n pause: 6000,\n content: (\n <Text>\n Press{' '}\n <Text color={Colors.accent} bold>\n S\n </Text>{' '}\n to expand or collapse the status.\n </Text>\n ),\n },\n\n { type: 'clear', pause: 2000 },\n\n {\n content: 'It takes about eight minutes.',\n pause: 2000,\n },\n\n {\n content: 'So grab some coffee ☕️.',\n pause: 2000,\n },\n\n {\n content: 'Or stick around and learn about PostHog.',\n pause: 5000,\n },\n\n { type: 'clear', pause: 3000 },\n\n {\n content: 'Events are the foundation of the PostHog platform.',\n pause: 4000,\n },\n\n {\n content:\n 'Every time an action is performed in your codebase — like button clicks, function calls, or thrown errors — we can capture an event.',\n pause: 6000,\n },\n\n {\n content:\n 'Events are sent to PostHog and joined with other product data.',\n pause: 6000,\n },\n\n { type: 'clear', pause: 1000 },\n\n { content: \"Here's the flow.\", pause: 1000 },\n\n POSTHOG_DATA_FLOW,\n\n { type: 'clear', pause: 2000 },\n\n {\n content:\n 'With enough event data, you can answer powerful questions about your product.',\n pause: 4000,\n },\n\n { content: 'And create insights.', pause: 4000 },\n\n { type: 'clear', pause: 500 },\n\n { content: 'Like trends to measure growth.', pause: 2500 },\n\n LINE_CHART_BLOCK,\n\n { type: 'clear', pause: 500 },\n\n { content: 'Or funnels to reveal bottlenecks.', pause: 2500 },\n\n FUNNEL_BLOCK,\n\n { type: 'clear', pause: 1000 },\n\n {\n content: 'Use those signals to decide what to build next.',\n pause: 4000,\n },\n\n { content: 'PostHog has all the dev tools you need.', pause: 3000 },\n\n PRODUCT_SUITE_BLOCK,\n ],\n [store],\n );\n\n // Dynamic status bar height: messages + border when present\n const hasStatus = store ? store.statusMessages.length > 0 : false;\n const statusBarRows = hasStatus\n ? (store?.statusExpanded ? EXPANDED_COUNT : COLLAPSED_COUNT) + 1\n : 0;\n\n const contentHeight = rows - FIXED_CHROME - statusBarRows;\n const tooSmall = contentHeight < MIN_CONTENT_ROWS;\n\n const maxHeight = Math.max(1, contentHeight - HEADER_ROWS);\n // Half of clamped content width, minus paddingX on both sides\n const paneWidth = Math.floor((Math.min(120, columns) - 2) / 2) - 2;\n\n // Always render so ContentSequencer stays mounted (preserves activeIdx).\n // When too small, hide visually via display=\"none\".\n return (\n <Box\n flexDirection=\"column\"\n paddingX={1}\n display={tooSmall ? 'none' : 'flex'}\n >\n <Text bold color={Colors.accent}>\n Learn\n </Text>\n <Box height={1} />\n <ContentSequencer\n blocks={blocks}\n mode={TextRevealMode.SentenceBySentence}\n maxHeight={maxHeight}\n availableWidth={paneWidth}\n startDelay={2000}\n initialBlockIdx={store?.learnCardBlockIdx ?? 0}\n onBlockChange={(idx) => store?.setLearnCardBlockIdx(idx)}\n onSequenceComplete={onComplete}\n />\n </Box>\n );\n};\n"]}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * TipsCard — Shows PostHog tips during the agent run.
3
+ * Reactively shows/hides tips based on discovered features.
4
+ * Supports toggling additional features via key bindings.
5
+ */
6
+ import type { WizardStore } from '../store.js';
7
+ export declare const TipsCard: ({ store }: {
8
+ store: WizardStore;
9
+ }) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,55 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * TipsCard — Shows PostHog tips during the agent run.
4
+ * Reactively shows/hides tips based on discovered features.
5
+ * Supports toggling additional features via key bindings.
6
+ */
7
+ import { Box, Text, useInput } from 'ink';
8
+ import { Colors, Icons } from '../styles.js';
9
+ import { DiscoveredFeature, AdditionalFeature, } from '../../../lib/wizard-session.js';
10
+ const TIPS = [
11
+ {
12
+ id: 'persons',
13
+ title: 'You can also track people and groups with PostHog',
14
+ description: "Events can be associated with the humans who generate them, letting you understand a specific user or customer's situation.",
15
+ },
16
+ {
17
+ id: 'properties',
18
+ title: 'Get way more detail using properties',
19
+ description: 'Events and person records can have any properties you want. Track things like how they found your website, what subscription tier they choose, and much more.',
20
+ },
21
+ {
22
+ id: 'stripe',
23
+ title: 'You can track Stripe revenue with PostHog',
24
+ description: 'Add Stripe as a data source while you wait:',
25
+ url: 'https://app.posthog.com/project/data-warehouse/new-source?kind=Stripe',
26
+ visible: (store) => store.session.discoveredFeatures.includes(DiscoveredFeature.Stripe),
27
+ },
28
+ {
29
+ id: 'llm',
30
+ title: 'PostHog can also help you track your LLM costs',
31
+ description: '',
32
+ visible: (store) => store.session.discoveredFeatures.includes(DiscoveredFeature.LLM),
33
+ toggle: {
34
+ key: 'l',
35
+ feature: AdditionalFeature.LLM,
36
+ enabledLabel: 'LLM analytics setup queued next',
37
+ prompt: 'We detected LLM dependencies in your project.',
38
+ isEnabled: (store) => store.session.llmOptIn,
39
+ },
40
+ },
41
+ ];
42
+ export const TipsCard = ({ store }) => {
43
+ useInput((input) => {
44
+ for (const tip of TIPS) {
45
+ if (tip.toggle &&
46
+ input.toLowerCase() === tip.toggle.key &&
47
+ (!tip.visible || tip.visible(store)) &&
48
+ !tip.toggle.isEnabled(store)) {
49
+ store.enableFeature(tip.toggle.feature);
50
+ }
51
+ }
52
+ });
53
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 1, children: [_jsx(Text, { bold: true, color: Colors.accent, children: "Tips" }), _jsx(Box, { height: 1 }), TIPS.filter((tip) => !tip.visible || tip.visible(store)).map((tip) => (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Text, { children: [_jsxs(Text, { color: Colors.accent, children: [Icons.diamond, " "] }), _jsx(Text, { bold: true, children: tip.title })] }), tip.toggle ? (tip.toggle.isEnabled(store) ? (_jsxs(Text, { color: Colors.success, children: [Icons.check, " ", tip.toggle.enabledLabel] })) : (_jsxs(Text, { dimColor: true, children: [tip.toggle.prompt, " Press", ' ', _jsx(Text, { bold: true, color: Colors.accent, children: tip.toggle.key.toUpperCase() }), ' ', "to enable."] }))) : (_jsxs(Text, { dimColor: true, children: [tip.description, tip.url && (_jsxs(_Fragment, { children: [' ', _jsx(Text, { color: "cyan", children: tip.url })] }))] }))] }, tip.id)))] }));
54
+ };
55
+ //# sourceMappingURL=TipsCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TipsCard.js","sourceRoot":"","sources":["../../../../../src/ui/tui/components/TipsCard.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * TipsCard — Shows PostHog tips during the agent run.\n * Reactively shows/hides tips based on discovered features.\n * Supports toggling additional features via key bindings.\n */\n\nimport { Box, Text, useInput } from 'ink';\nimport type { WizardStore } from '../store.js';\nimport { Colors, Icons } from '../styles.js';\nimport {\n DiscoveredFeature,\n AdditionalFeature,\n} from '../../../lib/wizard-session.js';\n\n/** A discrete tip shown in the TipsCard during the agent run. */\ninterface Tip {\n /** Unique identifier */\n id: string;\n /** Title line */\n title: string;\n /** Description shown below the title */\n description: string;\n /** Optional URL shown after the description */\n url?: string;\n /** When provided, the tip is only shown if this returns true */\n visible?: (store: WizardStore) => boolean;\n /** Optional key binding that toggles an AdditionalFeature */\n toggle?: {\n /** The key the user presses (lowercase) */\n key: string;\n /** The additional feature to enqueue */\n feature: AdditionalFeature;\n /** Label shown when toggled on */\n enabledLabel: string;\n /** Prompt shown when not yet toggled */\n prompt: string;\n /** Returns true if already toggled */\n isEnabled: (store: WizardStore) => boolean;\n };\n}\n\nconst TIPS: Tip[] = [\n {\n id: 'persons',\n title: 'You can also track people and groups with PostHog',\n description:\n \"Events can be associated with the humans who generate them, letting you understand a specific user or customer's situation.\",\n },\n {\n id: 'properties',\n title: 'Get way more detail using properties',\n description:\n 'Events and person records can have any properties you want. Track things like how they found your website, what subscription tier they choose, and much more.',\n },\n {\n id: 'stripe',\n title: 'You can track Stripe revenue with PostHog',\n description: 'Add Stripe as a data source while you wait:',\n url: 'https://app.posthog.com/project/data-warehouse/new-source?kind=Stripe',\n visible: (store) =>\n store.session.discoveredFeatures.includes(DiscoveredFeature.Stripe),\n },\n {\n id: 'llm',\n title: 'PostHog can also help you track your LLM costs',\n description: '',\n visible: (store) =>\n store.session.discoveredFeatures.includes(DiscoveredFeature.LLM),\n toggle: {\n key: 'l',\n feature: AdditionalFeature.LLM,\n enabledLabel: 'LLM analytics setup queued next',\n prompt: 'We detected LLM dependencies in your project.',\n isEnabled: (store) => store.session.llmOptIn,\n },\n },\n];\n\nexport const TipsCard = ({ store }: { store: WizardStore }) => {\n useInput((input) => {\n for (const tip of TIPS) {\n if (\n tip.toggle &&\n input.toLowerCase() === tip.toggle.key &&\n (!tip.visible || tip.visible(store)) &&\n !tip.toggle.isEnabled(store)\n ) {\n store.enableFeature(tip.toggle.feature);\n }\n }\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold color={Colors.accent}>\n Tips\n </Text>\n <Box height={1} />\n\n {TIPS.filter((tip) => !tip.visible || tip.visible(store)).map((tip) => (\n <Box key={tip.id} flexDirection=\"column\" marginBottom={1}>\n <Text>\n <Text color={Colors.accent}>{Icons.diamond} </Text>\n <Text bold>{tip.title}</Text>\n </Text>\n\n {tip.toggle ? (\n tip.toggle.isEnabled(store) ? (\n <Text color={Colors.success}>\n {Icons.check} {tip.toggle.enabledLabel}\n </Text>\n ) : (\n <Text dimColor>\n {tip.toggle.prompt} Press{' '}\n <Text bold color={Colors.accent}>\n {tip.toggle.key.toUpperCase()}\n </Text>{' '}\n to enable.\n </Text>\n )\n ) : (\n <Text dimColor>\n {tip.description}\n {tip.url && (\n <>\n {' '}\n <Text color=\"cyan\">{tip.url}</Text>\n </>\n )}\n </Text>\n )}\n </Box>\n ))}\n </Box>\n );\n};\n"]}
@@ -0,0 +1,6 @@
1
+ interface TitleBarProps {
2
+ version: string;
3
+ width: number;
4
+ }
5
+ export declare const TitleBar: ({ version, width }: TitleBarProps) => import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -0,0 +1,17 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { Colors } from '../styles.js';
4
+ const FEEDBACK = 'Feedback: wizard@posthog.com ';
5
+ const FEEDBACK_SHORT = ' wizard@posthog.com ';
6
+ export const TitleBar = ({ version, width }) => {
7
+ const fullTitle = ` PostHog Wizard v${version}`;
8
+ const needShort = width < fullTitle.length + FEEDBACK.length;
9
+ const feedback = needShort ? FEEDBACK_SHORT : FEEDBACK;
10
+ const title = needShort && fullTitle.length + feedback.length > width
11
+ ? ` Wizard v${version}`
12
+ : fullTitle;
13
+ const gap = Math.max(0, width - title.length - feedback.length);
14
+ const padding = ' '.repeat(gap);
15
+ return (_jsx(Box, { width: width, overflow: "hidden", children: _jsxs(Text, { backgroundColor: Colors.accent, color: "black", bold: true, children: [title, padding, feedback] }) }));
16
+ };
17
+ //# sourceMappingURL=TitleBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TitleBar.js","sourceRoot":"","sources":["../../../../../src/ui/tui/components/TitleBar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,QAAQ,GAAG,+BAA+B,CAAC;AACjD,MAAM,cAAc,GAAG,sBAAsB,CAAC;AAO9C,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAiB,EAAE,EAAE;IAC5D,MAAM,SAAS,GAAG,oBAAoB,OAAO,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC7D,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC;IACvD,MAAM,KAAK,GACT,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,KAAK;QACrD,CAAC,CAAC,YAAY,OAAO,EAAE;QACvB,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEhC,OAAO,CACL,KAAC,GAAG,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAC,QAAQ,YAClC,MAAC,IAAI,IAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAC,OAAO,EAAC,IAAI,mBACrD,KAAK,EACL,OAAO,EACP,QAAQ,IACJ,GACH,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { Box, Text } from 'ink';\nimport { Colors } from '../styles.js';\n\nconst FEEDBACK = 'Feedback: wizard@posthog.com ';\nconst FEEDBACK_SHORT = ' wizard@posthog.com ';\n\ninterface TitleBarProps {\n version: string;\n width: number;\n}\n\nexport const TitleBar = ({ version, width }: TitleBarProps) => {\n const fullTitle = ` PostHog Wizard v${version}`;\n const needShort = width < fullTitle.length + FEEDBACK.length;\n const feedback = needShort ? FEEDBACK_SHORT : FEEDBACK;\n const title =\n needShort && fullTitle.length + feedback.length > width\n ? ` Wizard v${version}`\n : fullTitle;\n const gap = Math.max(0, width - title.length - feedback.length);\n const padding = ' '.repeat(gap);\n\n return (\n <Box width={width} overflow=\"hidden\">\n <Text backgroundColor={Colors.accent} color=\"black\" bold>\n {title}\n {padding}\n {feedback}\n </Text>\n </Box>\n );\n};\n"]}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Flow pipelines — declarative screen sequences for each wizard flow.
3
+ *
4
+ * Owns the Screen and Flow enums (re-exported by router.ts) to avoid
5
+ * circular imports between router ↔ flows.
6
+ *
7
+ * Each entry defines a screen, optional visibility predicate, and
8
+ * optional completion predicate. The router walks the active flow
9
+ * to resolve which screen to show.
10
+ */
11
+ import { type WizardSession } from '../../lib/wizard-session.js';
12
+ /** Screens that participate in linear flows */
13
+ export declare enum Screen {
14
+ Intro = "intro",
15
+ Setup = "setup",
16
+ Auth = "auth",
17
+ Run = "run",
18
+ Mcp = "mcp",
19
+ Outro = "outro",
20
+ McpAdd = "mcp-add",
21
+ McpRemove = "mcp-remove"
22
+ }
23
+ /** Named flows the router can run */
24
+ export declare enum Flow {
25
+ Wizard = "wizard",
26
+ McpAdd = "mcp-add",
27
+ McpRemove = "mcp-remove"
28
+ }
29
+ export interface FlowEntry {
30
+ /** Screen to show */
31
+ screen: Screen;
32
+ /** If provided, screen is skipped when this returns false. Omit = always show. */
33
+ show?: (session: WizardSession) => boolean;
34
+ /** If provided, screen is considered complete when this returns true. */
35
+ isComplete?: (session: WizardSession) => boolean;
36
+ }
37
+ /** All flow pipelines. Add new screens by appending entries. */
38
+ export declare const FLOWS: Record<Flow, FlowEntry[]>;