@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
package/README.md CHANGED
@@ -197,3 +197,82 @@ To make your version of a tool usable with a one-line `npx` command:
197
197
  2. Run [`npm publish`](https://docs.npmjs.com/cli/v7/commands/npm-publish) from
198
198
  your project directory
199
199
  3. Now you can run it with `npx yourpackagename`
200
+
201
+ # Health checks
202
+
203
+ `src/lib/health-checks/` checks external status pages and PostHog-owned
204
+ services before the wizard runs to decide whether it can proceed. The entry
205
+ point is `evaluateWizardReadiness()`, which returns one of three values:
206
+
207
+ | Decision | Meaning |
208
+ | ------------------- | --------------------------------------------------------------- |
209
+ | `yes` | All services healthy — proceed normally. |
210
+ | `yes_with_warnings` | Some services degraded but no critical dependency is down. |
211
+ | `no` | A critical dependency is down or degraded — do not run. |
212
+
213
+ ### Module layout
214
+
215
+ | File | Responsibility |
216
+ | --- | --- |
217
+ | `types.ts` | Enums, interfaces (`ServiceHealthStatus`, `AllServicesHealth`, etc.) |
218
+ | `statuspage.ts` | Statuspage.io v2 API helpers + checks for Anthropic, PostHog, GitHub, npm, Cloudflare |
219
+ | `endpoints.ts` | Direct endpoint checks for LLM Gateway (`/_liveness`) and MCP (`/`) |
220
+ | `readiness.ts` | `checkAllExternalServices`, `evaluateWizardReadiness`, readiness config |
221
+ | `index.ts` | Barrel re-export |
222
+ | `testme.md` | Test running instructions and endpoint reference |
223
+
224
+ ## What blocks a run
225
+
226
+ The `DEFAULT_WIZARD_READINESS_CONFIG` in `readiness.ts` controls this. It has
227
+ two arrays:
228
+
229
+ - **`downBlocksRun`** — if any of these report status **Down**, readiness is
230
+ **No**.
231
+ - **`degradedBlocksRun`** — if any of these report **Degraded** (or worse),
232
+ readiness is **No**.
233
+
234
+ ### Current defaults
235
+
236
+ ```ts
237
+ downBlocksRun: ['anthropic', 'posthogOverall', 'npmOverall', 'llmGateway', 'mcp'],
238
+ degradedBlocksRun: ['anthropic'],
239
+ ```
240
+
241
+ ## Smoke test helper (`scripts/smoke-test-ci.sh`)
242
+
243
+ This repo includes a helper script to run a full end‑to‑end smoke test of the wizard packaged in a tarball against a real app from [`posthog/wizard-workbench`](https://github.com/PostHog/wizard-workbench). This will catch certain packaging issues that might not be caught by other tests.
244
+
245
+ **Prerequisites**
246
+
247
+ - Point to a `wizard-workbench` checkout either by:
248
+ - Setting `WIZARD_WORKBENCH_ROOT=/absolute/path/to/wizard-workbench`, or
249
+ - Cloning `wizard-workbench` next to this repo (so it lives at `../wizard-workbench`).
250
+ - Set `POSTHOG_PERSONAL_API_KEY` either in your shell or in `../wizard-workbench/.env`.
251
+ - (Optional) Set `POSTHOG_PROJECT_ID` to target a specific PostHog project.
252
+
253
+ **Usage**
254
+
255
+ ```bash
256
+ # Default app: next-js/15-app-router-todo
257
+ ./scripts/smoke-test-ci.sh
258
+
259
+ # Specify a different app from wizard-workbench/apps
260
+ ./scripts/smoke-test-ci.sh next-js/15-pages-router-saas
261
+
262
+ # With API key (and optional project ID) inline
263
+ POSTHOG_PERSONAL_API_KEY=phx_your_key_here \
264
+ POSTHOG_PROJECT_ID=12345 \
265
+ ./scripts/smoke-test-ci.sh next-js/15-pages-router-saas
266
+
267
+ # Pointing at a custom wizard-workbench checkout
268
+ WIZARD_WORKBENCH_ROOT=/path/to/wizard-workbench \
269
+ ./scripts/smoke-test-ci.sh
270
+ ```
271
+
272
+ The script will:
273
+
274
+ - Build and pack the wizard
275
+ - Copy the selected app into a temp directory
276
+ - Install dependencies for the app
277
+ - Install the packed wizard tarball into an isolated temp project
278
+ - Run `wizard` in `--ci` mode against the copied app and perform basic post‑install checks
package/dist/bin.js CHANGED
@@ -9,6 +9,21 @@ const logging_1 = require("./src/utils/logging");
9
9
  const yargs_1 = __importDefault(require("yargs"));
10
10
  const helpers_1 = require("yargs/helpers");
11
11
  const chalk_1 = __importDefault(require("chalk"));
12
+ const fs_1 = require("fs");
13
+ const path_1 = require("path");
14
+ const WIZARD_VERSION = (() => {
15
+ // npm/pnpm set this when running via package scripts
16
+ if (process.env.npm_package_version)
17
+ return process.env.npm_package_version;
18
+ // Fallback: read package.json relative to this file
19
+ try {
20
+ const pkg = JSON.parse((0, fs_1.readFileSync)((0, path_1.resolve)((0, path_1.dirname)(__filename), '..', 'package.json'), 'utf-8'));
21
+ return pkg.version ?? 'unknown';
22
+ }
23
+ catch {
24
+ return 'unknown';
25
+ }
26
+ })();
12
27
  const NODE_VERSION_RANGE = '>=18.17.0';
13
28
  // Have to run this above the other imports because they are importing clack that
14
29
  // has the problematic imports.
@@ -16,10 +31,10 @@ if (!(0, semver_1.satisfies)(process.version, NODE_VERSION_RANGE)) {
16
31
  (0, logging_1.red)(`PostHog wizard requires Node.js ${NODE_VERSION_RANGE}. You are using Node.js ${process.version}. Please upgrade your Node.js version.`);
17
32
  process.exit(1);
18
33
  }
19
- const mcp_1 = require("./src/mcp");
20
34
  const run_1 = require("./src/run");
21
35
  const environment_1 = require("./src/utils/environment");
22
- const clack_1 = __importDefault(require("./src/utils/clack"));
36
+ const ui_1 = require("./src/ui");
37
+ const logging_ui_1 = require("./src/ui/logging-ui");
23
38
  if (process.env.NODE_ENV === 'test') {
24
39
  void (async () => {
25
40
  try {
@@ -82,6 +97,11 @@ if (process.env.NODE_ENV === 'test') {
82
97
  describe: 'Directory to install PostHog in\nenv: POSTHOG_WIZARD_INSTALL_DIR',
83
98
  type: 'string',
84
99
  },
100
+ playground: {
101
+ default: false,
102
+ describe: 'Launch the TUI primitives playground',
103
+ type: 'boolean',
104
+ },
85
105
  integration: {
86
106
  describe: 'Integration to set up',
87
107
  choices: [
@@ -110,28 +130,155 @@ if (process.env.NODE_ENV === 'test') {
110
130
  const options = { ...argv };
111
131
  // CI mode validation and TTY check
112
132
  if (options.ci) {
133
+ // Use LoggingUI for CI mode (no dependencies, no prompts)
134
+ (0, ui_1.setUI)(new logging_ui_1.LoggingUI());
113
135
  if (!options.apiKey) {
114
- clack_1.default.intro(chalk_1.default.inverse(`PostHog Wizard`));
115
- clack_1.default.log.error('CI mode requires --api-key (personal API key phx_xxx)');
136
+ (0, ui_1.getUI)().intro(chalk_1.default.inverse(`PostHog Wizard`));
137
+ (0, ui_1.getUI)().log.error('CI mode requires --api-key (personal API key phx_xxx)');
116
138
  process.exit(1);
117
139
  }
118
140
  if (!options.installDir) {
119
- clack_1.default.intro(chalk_1.default.inverse(`PostHog Wizard`));
120
- clack_1.default.log.error('CI mode requires --install-dir (directory to install PostHog in)');
141
+ (0, ui_1.getUI)().intro(chalk_1.default.inverse(`PostHog Wizard`));
142
+ (0, ui_1.getUI)().log.error('CI mode requires --install-dir (directory to install PostHog in)');
121
143
  process.exit(1);
122
144
  }
145
+ void (0, run_1.runWizard)(options);
123
146
  }
124
147
  else if ((0, environment_1.isNonInteractiveEnvironment)()) {
125
- // Original TTY error for non-CI mode
126
- clack_1.default.intro(chalk_1.default.inverse(`PostHog Wizard`));
127
- clack_1.default.log.error('This installer requires an interactive terminal (TTY) to run.\n' +
148
+ // Non-interactive non-CI: error out
149
+ (0, ui_1.getUI)().intro(chalk_1.default.inverse(`PostHog Wizard`));
150
+ (0, ui_1.getUI)().log.error('This installer requires an interactive terminal (TTY) to run.\n' +
128
151
  'It appears you are running in a non-interactive environment.\n' +
129
152
  'Please run the wizard in an interactive terminal.\n\n' +
130
153
  'For CI/CD environments, use --ci mode:\n' +
131
154
  ' npx @posthog/wizard --ci --api-key phx_xxx --install-dir .');
132
155
  process.exit(1);
133
156
  }
134
- void (0, run_1.runWizard)(options);
157
+ else if (options.playground) {
158
+ // Playground mode: launch the TUI primitives playground
159
+ void (async () => {
160
+ const { startPlayground } = await import('./src/ui/tui/playground/start-playground.js');
161
+ startPlayground(WIZARD_VERSION);
162
+ })();
163
+ }
164
+ else {
165
+ // Interactive TTY: launch the Ink TUI
166
+ void (async () => {
167
+ try {
168
+ const { startTUI } = await import('./src/ui/tui/start-tui.js');
169
+ const { buildSession } = await import('./src/lib/wizard-session.js');
170
+ const tui = startTUI(WIZARD_VERSION);
171
+ // Build session from CLI args and attach to store
172
+ const session = buildSession({
173
+ debug: options.debug,
174
+ forceInstall: options.forceInstall,
175
+ installDir: options.installDir,
176
+ ci: false,
177
+ signup: options.signup,
178
+ localMcp: options.localMcp,
179
+ apiKey: options.apiKey,
180
+ menu: options.menu,
181
+ integration: options.integration,
182
+ benchmark: options.benchmark,
183
+ projectId: options.projectId,
184
+ });
185
+ tui.store.session = session;
186
+ // Detect framework while IntroScreen shows its spinner.
187
+ // Runs concurrently — IntroScreen reacts when detection completes.
188
+ const { FRAMEWORK_REGISTRY } = await import('./src/lib/registry.js');
189
+ const { detectIntegration } = await import('./src/run.js');
190
+ const installDir = session.installDir ?? process.cwd();
191
+ const { DETECTION_TIMEOUT_MS } = await import('./src/lib/constants.js');
192
+ const detectedIntegration = await Promise.race([
193
+ detectIntegration(installDir),
194
+ new Promise((resolve) => setTimeout(() => resolve(undefined), DETECTION_TIMEOUT_MS)),
195
+ ]);
196
+ if (detectedIntegration) {
197
+ const config = FRAMEWORK_REGISTRY[detectedIntegration];
198
+ // Run gatherContext for the friendly variant label
199
+ if (config.metadata.gatherContext) {
200
+ try {
201
+ const context = await Promise.race([
202
+ config.metadata.gatherContext({
203
+ installDir,
204
+ debug: session.debug,
205
+ forceInstall: session.forceInstall,
206
+ default: false,
207
+ signup: session.signup,
208
+ localMcp: session.localMcp,
209
+ ci: session.ci,
210
+ menu: session.menu,
211
+ benchmark: session.benchmark,
212
+ }),
213
+ new Promise((resolve) => setTimeout(() => resolve({}), DETECTION_TIMEOUT_MS)),
214
+ ]);
215
+ for (const [key, value] of Object.entries(context)) {
216
+ if (!(key in session.frameworkContext)) {
217
+ tui.store.setFrameworkContext(key, value);
218
+ }
219
+ }
220
+ }
221
+ catch {
222
+ // Detection failed — will show generic name
223
+ }
224
+ }
225
+ tui.store.setFrameworkConfig(detectedIntegration, config);
226
+ if (!session.detectedFrameworkLabel) {
227
+ tui.store.setDetectedFramework(config.metadata.name);
228
+ }
229
+ }
230
+ // Feature discovery — deterministic scan of package.json deps
231
+ try {
232
+ const { readFileSync } = await import('fs');
233
+ const pkgPath = require('path').join(installDir, 'package.json');
234
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
235
+ const allDeps = {
236
+ ...pkg.dependencies,
237
+ ...pkg.devDependencies,
238
+ };
239
+ const depNames = Object.keys(allDeps);
240
+ const { DiscoveredFeature } = await import('./src/lib/wizard-session.js');
241
+ if (depNames.some((d) => ['stripe', '@stripe/stripe-js'].includes(d))) {
242
+ tui.store.addDiscoveredFeature(DiscoveredFeature.Stripe);
243
+ }
244
+ // LLM SDK detection — sourced from PostHog LLM analytics skill
245
+ const LLM_PACKAGES = [
246
+ 'openai',
247
+ '@anthropic-ai/sdk',
248
+ 'ai',
249
+ '@ai-sdk/openai',
250
+ 'langchain',
251
+ '@langchain/openai',
252
+ '@langchain/langgraph',
253
+ '@google/generative-ai',
254
+ '@google/genai',
255
+ '@instructor-ai/instructor',
256
+ '@mastra/core',
257
+ 'portkey-ai',
258
+ ];
259
+ if (depNames.some((d) => LLM_PACKAGES.includes(d))) {
260
+ tui.store.addDiscoveredFeature(DiscoveredFeature.LLM);
261
+ }
262
+ }
263
+ catch {
264
+ // No package.json or parse error — skip feature discovery
265
+ }
266
+ // Signal detection is done — IntroScreen shows picker or results
267
+ tui.store.setDetectionComplete();
268
+ // Wait for IntroScreen confirmation
269
+ await tui.waitForSetup();
270
+ await (0, run_1.runWizard)(options, tui.store.session);
271
+ // Keep the outro screen visible — let process.exit() handle cleanup
272
+ }
273
+ catch (err) {
274
+ // TUI unavailable (e.g., in test environment) — continue with default UI
275
+ if (process.env.DEBUG || process.env.POSTHOG_WIZARD_DEBUG) {
276
+ console.error('TUI init failed:', err); // eslint-disable-line no-console
277
+ }
278
+ await (0, run_1.runWizard)(options);
279
+ }
280
+ })();
281
+ }
135
282
  })
136
283
  .command('mcp <command>', 'MCP server management commands', (yargs) => {
137
284
  return yargs
@@ -145,7 +292,27 @@ if (process.env.NODE_ENV === 'test') {
145
292
  });
146
293
  }, (argv) => {
147
294
  const options = { ...argv };
148
- void (0, mcp_1.runMCPInstall)(options);
295
+ void (async () => {
296
+ try {
297
+ const { startTUI } = await import('./src/ui/tui/start-tui.js');
298
+ const { buildSession } = await import('./src/lib/wizard-session.js');
299
+ const { Flow } = await import('./src/ui/tui/router.js');
300
+ const tui = startTUI(WIZARD_VERSION, Flow.McpAdd);
301
+ const session = buildSession({
302
+ debug: options.debug,
303
+ localMcp: options.local,
304
+ });
305
+ tui.store.session = session;
306
+ }
307
+ catch {
308
+ // TUI unavailable — fallback to logging
309
+ (0, ui_1.setUI)(new logging_ui_1.LoggingUI());
310
+ const { addMCPServerToClientsStep } = await import('./src/steps/add-mcp-server-to-clients/index.js');
311
+ await addMCPServerToClientsStep({
312
+ local: options.local,
313
+ });
314
+ }
315
+ })();
149
316
  })
150
317
  .command('remove', 'Remove PostHog MCP server from supported clients', (yargs) => {
151
318
  return yargs.options({
@@ -157,7 +324,27 @@ if (process.env.NODE_ENV === 'test') {
157
324
  });
158
325
  }, (argv) => {
159
326
  const options = { ...argv };
160
- void (0, mcp_1.runMCPRemove)(options);
327
+ void (async () => {
328
+ try {
329
+ const { startTUI } = await import('./src/ui/tui/start-tui.js');
330
+ const { buildSession } = await import('./src/lib/wizard-session.js');
331
+ const { Flow } = await import('./src/ui/tui/router.js');
332
+ const tui = startTUI(WIZARD_VERSION, Flow.McpRemove);
333
+ const session = buildSession({
334
+ debug: options.debug,
335
+ localMcp: options.local,
336
+ });
337
+ tui.store.session = session;
338
+ }
339
+ catch {
340
+ // TUI unavailable — fallback to logging
341
+ (0, ui_1.setUI)(new logging_ui_1.LoggingUI());
342
+ const { removeMCPServerFromClientsStep } = await import('./src/steps/add-mcp-server-to-clients/index.js');
343
+ await removeMCPServerFromClientsStep({
344
+ local: options.local,
345
+ });
346
+ }
347
+ })();
161
348
  })
162
349
  .demandCommand(1, 'You must specify a subcommand (add or remove)')
163
350
  .help();
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","sourceRoot":"","sources":["../bin.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { satisfies } from 'semver';\nimport { red } from './src/utils/logging';\n\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport chalk from 'chalk';\n\nconst NODE_VERSION_RANGE = '>=18.17.0';\n\n// Have to run this above the other imports because they are importing clack that\n// has the problematic imports.\nif (!satisfies(process.version, NODE_VERSION_RANGE)) {\n red(\n `PostHog wizard requires Node.js ${NODE_VERSION_RANGE}. You are using Node.js ${process.version}. Please upgrade your Node.js version.`,\n );\n process.exit(1);\n}\n\nimport { runMCPInstall, runMCPRemove } from './src/mcp';\nimport { runWizard } from './src/run';\nimport { isNonInteractiveEnvironment } from './src/utils/environment';\nimport clack from './src/utils/clack';\n\nif (process.env.NODE_ENV === 'test') {\n void (async () => {\n try {\n const { server } = await import('./e2e-tests/mocks/server.js');\n server.listen({\n onUnhandledRequest: 'bypass',\n });\n } catch (error) {\n // Mock server import failed - this can happen during non-E2E tests\n }\n })();\n}\n\nyargs(hideBin(process.argv))\n .env('POSTHOG_WIZARD')\n // global options\n .options({\n debug: {\n default: false,\n describe: 'Enable verbose logging\\nenv: POSTHOG_WIZARD_DEBUG',\n type: 'boolean',\n },\n default: {\n default: true,\n describe:\n 'Use default options for all prompts\\nenv: POSTHOG_WIZARD_DEFAULT',\n type: 'boolean',\n },\n signup: {\n default: false,\n describe:\n 'Create a new PostHog account during setup\\nenv: POSTHOG_WIZARD_SIGNUP',\n type: 'boolean',\n },\n 'local-mcp': {\n default: false,\n describe:\n 'Use local MCP server at http://localhost:8787/mcp\\nenv: POSTHOG_WIZARD_LOCAL_MCP',\n type: 'boolean',\n },\n ci: {\n default: false,\n describe:\n 'Enable CI mode for non-interactive execution\\nenv: POSTHOG_WIZARD_CI',\n type: 'boolean',\n },\n 'api-key': {\n describe:\n 'PostHog personal API key (phx_xxx) for authentication\\nenv: POSTHOG_WIZARD_API_KEY',\n type: 'string',\n },\n 'project-id': {\n describe:\n 'PostHog project ID to use (optional; when not set, uses default from API key or OAuth)\\nenv: POSTHOG_WIZARD_PROJECT_ID',\n type: 'string',\n },\n })\n .command(\n ['$0'],\n 'Run the PostHog setup wizard',\n (yargs) => {\n return yargs.options({\n 'force-install': {\n default: false,\n describe:\n 'Force install packages even if peer dependency checks fail\\nenv: POSTHOG_WIZARD_FORCE_INSTALL',\n type: 'boolean',\n },\n 'install-dir': {\n describe:\n 'Directory to install PostHog in\\nenv: POSTHOG_WIZARD_INSTALL_DIR',\n type: 'string',\n },\n integration: {\n describe: 'Integration to set up',\n choices: [\n 'nextjs',\n 'astro',\n 'react',\n 'svelte',\n 'react-native',\n 'tanstack-router',\n 'tanstack-start',\n ],\n type: 'string',\n },\n menu: {\n default: false,\n describe:\n 'Show menu for manual integration selection instead of auto-detecting\\nenv: POSTHOG_WIZARD_MENU',\n type: 'boolean',\n },\n benchmark: {\n default: false,\n describe:\n 'Run in benchmark mode with per-phase token tracking\\nenv: POSTHOG_WIZARD_BENCHMARK',\n type: 'boolean',\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n\n // CI mode validation and TTY check\n if (options.ci) {\n if (!options.apiKey) {\n clack.intro(chalk.inverse(`PostHog Wizard`));\n clack.log.error(\n 'CI mode requires --api-key (personal API key phx_xxx)',\n );\n process.exit(1);\n }\n if (!options.installDir) {\n clack.intro(chalk.inverse(`PostHog Wizard`));\n clack.log.error(\n 'CI mode requires --install-dir (directory to install PostHog in)',\n );\n process.exit(1);\n }\n } else if (isNonInteractiveEnvironment()) {\n // Original TTY error for non-CI mode\n clack.intro(chalk.inverse(`PostHog Wizard`));\n clack.log.error(\n 'This installer requires an interactive terminal (TTY) to run.\\n' +\n 'It appears you are running in a non-interactive environment.\\n' +\n 'Please run the wizard in an interactive terminal.\\n\\n' +\n 'For CI/CD environments, use --ci mode:\\n' +\n ' npx @posthog/wizard --ci --api-key phx_xxx --install-dir .',\n );\n process.exit(1);\n }\n\n void runWizard(options as unknown as Parameters<typeof runWizard>[0]);\n },\n )\n .command('mcp <command>', 'MCP server management commands', (yargs) => {\n return yargs\n .command(\n 'add',\n 'Install PostHog MCP server to supported clients',\n (yargs) => {\n return yargs.options({\n local: {\n default: false,\n describe:\n 'Add local development MCP server (http://localhost:8787)',\n type: 'boolean',\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n void runMCPInstall(\n options as unknown as {\n signup: boolean;\n local?: boolean;\n debug?: boolean;\n },\n );\n },\n )\n .command(\n 'remove',\n 'Remove PostHog MCP server from supported clients',\n (yargs) => {\n return yargs.options({\n local: {\n default: false,\n describe:\n 'Remove local development MCP server (http://localhost:8787)',\n type: 'boolean',\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n void runMCPRemove(options as { local?: boolean });\n },\n )\n .demandCommand(1, 'You must specify a subcommand (add or remove)')\n .help();\n })\n .help()\n .alias('help', 'h')\n .version()\n .alias('version', 'v')\n .wrap(process.stdout.isTTY ? yargs.terminalWidth() : 80).argv;\n"]}
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../bin.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { satisfies } from 'semver';\nimport { red } from './src/utils/logging';\n\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport chalk from 'chalk';\n\nimport { readFileSync } from 'fs';\nimport { resolve, dirname } from 'path';\n\nconst WIZARD_VERSION = (() => {\n // npm/pnpm set this when running via package scripts\n if (process.env.npm_package_version) return process.env.npm_package_version;\n // Fallback: read package.json relative to this file\n try {\n const pkg = JSON.parse(\n readFileSync(resolve(dirname(__filename), '..', 'package.json'), 'utf-8'),\n );\n return pkg.version ?? 'unknown';\n } catch {\n return 'unknown';\n }\n})();\n\nconst NODE_VERSION_RANGE = '>=18.17.0';\n\n// Have to run this above the other imports because they are importing clack that\n// has the problematic imports.\nif (!satisfies(process.version, NODE_VERSION_RANGE)) {\n red(\n `PostHog wizard requires Node.js ${NODE_VERSION_RANGE}. You are using Node.js ${process.version}. Please upgrade your Node.js version.`,\n );\n process.exit(1);\n}\n\nimport { runWizard } from './src/run';\nimport { isNonInteractiveEnvironment } from './src/utils/environment';\nimport { getUI, setUI } from './src/ui';\nimport { LoggingUI } from './src/ui/logging-ui';\n\nif (process.env.NODE_ENV === 'test') {\n void (async () => {\n try {\n const { server } = await import('./e2e-tests/mocks/server.js');\n server.listen({\n onUnhandledRequest: 'bypass',\n });\n } catch (error) {\n // Mock server import failed - this can happen during non-E2E tests\n }\n })();\n}\n\nyargs(hideBin(process.argv))\n .env('POSTHOG_WIZARD')\n // global options\n .options({\n debug: {\n default: false,\n describe: 'Enable verbose logging\\nenv: POSTHOG_WIZARD_DEBUG',\n type: 'boolean',\n },\n default: {\n default: true,\n describe:\n 'Use default options for all prompts\\nenv: POSTHOG_WIZARD_DEFAULT',\n type: 'boolean',\n },\n signup: {\n default: false,\n describe:\n 'Create a new PostHog account during setup\\nenv: POSTHOG_WIZARD_SIGNUP',\n type: 'boolean',\n },\n 'local-mcp': {\n default: false,\n describe:\n 'Use local MCP server at http://localhost:8787/mcp\\nenv: POSTHOG_WIZARD_LOCAL_MCP',\n type: 'boolean',\n },\n ci: {\n default: false,\n describe:\n 'Enable CI mode for non-interactive execution\\nenv: POSTHOG_WIZARD_CI',\n type: 'boolean',\n },\n 'api-key': {\n describe:\n 'PostHog personal API key (phx_xxx) for authentication\\nenv: POSTHOG_WIZARD_API_KEY',\n type: 'string',\n },\n 'project-id': {\n describe:\n 'PostHog project ID to use (optional; when not set, uses default from API key or OAuth)\\nenv: POSTHOG_WIZARD_PROJECT_ID',\n type: 'string',\n },\n })\n .command(\n ['$0'],\n 'Run the PostHog setup wizard',\n (yargs) => {\n return yargs.options({\n 'force-install': {\n default: false,\n describe:\n 'Force install packages even if peer dependency checks fail\\nenv: POSTHOG_WIZARD_FORCE_INSTALL',\n type: 'boolean',\n },\n 'install-dir': {\n describe:\n 'Directory to install PostHog in\\nenv: POSTHOG_WIZARD_INSTALL_DIR',\n type: 'string',\n },\n playground: {\n default: false,\n describe: 'Launch the TUI primitives playground',\n type: 'boolean',\n },\n integration: {\n describe: 'Integration to set up',\n choices: [\n 'nextjs',\n 'astro',\n 'react',\n 'svelte',\n 'react-native',\n 'tanstack-router',\n 'tanstack-start',\n ],\n type: 'string',\n },\n menu: {\n default: false,\n describe:\n 'Show menu for manual integration selection instead of auto-detecting\\nenv: POSTHOG_WIZARD_MENU',\n type: 'boolean',\n },\n benchmark: {\n default: false,\n describe:\n 'Run in benchmark mode with per-phase token tracking\\nenv: POSTHOG_WIZARD_BENCHMARK',\n type: 'boolean',\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n\n // CI mode validation and TTY check\n if (options.ci) {\n // Use LoggingUI for CI mode (no dependencies, no prompts)\n setUI(new LoggingUI());\n if (!options.apiKey) {\n getUI().intro(chalk.inverse(`PostHog Wizard`));\n getUI().log.error(\n 'CI mode requires --api-key (personal API key phx_xxx)',\n );\n process.exit(1);\n }\n if (!options.installDir) {\n getUI().intro(chalk.inverse(`PostHog Wizard`));\n getUI().log.error(\n 'CI mode requires --install-dir (directory to install PostHog in)',\n );\n process.exit(1);\n }\n\n void runWizard(options as Parameters<typeof runWizard>[0]);\n } else if (isNonInteractiveEnvironment()) {\n // Non-interactive non-CI: error out\n getUI().intro(chalk.inverse(`PostHog Wizard`));\n getUI().log.error(\n 'This installer requires an interactive terminal (TTY) to run.\\n' +\n 'It appears you are running in a non-interactive environment.\\n' +\n 'Please run the wizard in an interactive terminal.\\n\\n' +\n 'For CI/CD environments, use --ci mode:\\n' +\n ' npx @posthog/wizard --ci --api-key phx_xxx --install-dir .',\n );\n process.exit(1);\n } else if (options.playground) {\n // Playground mode: launch the TUI primitives playground\n void (async () => {\n const { startPlayground } = await import(\n './src/ui/tui/playground/start-playground.js'\n );\n startPlayground(WIZARD_VERSION);\n })();\n } else {\n // Interactive TTY: launch the Ink TUI\n void (async () => {\n try {\n const { startTUI } = await import('./src/ui/tui/start-tui.js');\n const { buildSession } = await import(\n './src/lib/wizard-session.js'\n );\n\n const tui = startTUI(WIZARD_VERSION);\n\n // Build session from CLI args and attach to store\n const session = buildSession({\n debug: options.debug as boolean | undefined,\n forceInstall: options.forceInstall as boolean | undefined,\n installDir: options.installDir as string | undefined,\n ci: false,\n signup: options.signup as boolean | undefined,\n localMcp: options.localMcp as boolean | undefined,\n apiKey: options.apiKey as string | undefined,\n menu: options.menu as boolean | undefined,\n integration: options.integration as Parameters<\n typeof buildSession\n >[0]['integration'],\n benchmark: options.benchmark as boolean | undefined,\n projectId: options.projectId as string | undefined,\n });\n tui.store.session = session;\n\n // Detect framework while IntroScreen shows its spinner.\n // Runs concurrently — IntroScreen reacts when detection completes.\n const { FRAMEWORK_REGISTRY } = await import(\n './src/lib/registry.js'\n );\n const { detectIntegration } = await import('./src/run.js');\n const installDir = session.installDir ?? process.cwd();\n\n const { DETECTION_TIMEOUT_MS } = await import(\n './src/lib/constants.js'\n );\n const detectedIntegration = await Promise.race([\n detectIntegration(installDir),\n new Promise<undefined>((resolve) =>\n setTimeout(() => resolve(undefined), DETECTION_TIMEOUT_MS),\n ),\n ]);\n\n if (detectedIntegration) {\n const config = FRAMEWORK_REGISTRY[detectedIntegration];\n\n // Run gatherContext for the friendly variant label\n if (config.metadata.gatherContext) {\n try {\n const context = await Promise.race([\n config.metadata.gatherContext({\n installDir,\n debug: session.debug,\n forceInstall: session.forceInstall,\n default: false,\n signup: session.signup,\n localMcp: session.localMcp,\n ci: session.ci,\n menu: session.menu,\n benchmark: session.benchmark,\n }),\n new Promise<Record<string, never>>((resolve) =>\n setTimeout(() => resolve({}), DETECTION_TIMEOUT_MS),\n ),\n ]);\n for (const [key, value] of Object.entries(context)) {\n if (!(key in session.frameworkContext)) {\n tui.store.setFrameworkContext(key, value);\n }\n }\n } catch {\n // Detection failed — will show generic name\n }\n }\n\n tui.store.setFrameworkConfig(detectedIntegration, config);\n\n if (!session.detectedFrameworkLabel) {\n tui.store.setDetectedFramework(config.metadata.name);\n }\n }\n\n // Feature discovery — deterministic scan of package.json deps\n try {\n const { readFileSync } = await import('fs');\n const pkgPath = require('path').join(installDir, 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n const allDeps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n const depNames = Object.keys(allDeps);\n\n const { DiscoveredFeature } = await import(\n './src/lib/wizard-session.js'\n );\n\n if (\n depNames.some((d) =>\n ['stripe', '@stripe/stripe-js'].includes(d),\n )\n ) {\n tui.store.addDiscoveredFeature(DiscoveredFeature.Stripe);\n }\n\n // LLM SDK detection — sourced from PostHog LLM analytics skill\n const LLM_PACKAGES = [\n 'openai',\n '@anthropic-ai/sdk',\n 'ai',\n '@ai-sdk/openai',\n 'langchain',\n '@langchain/openai',\n '@langchain/langgraph',\n '@google/generative-ai',\n '@google/genai',\n '@instructor-ai/instructor',\n '@mastra/core',\n 'portkey-ai',\n ];\n if (depNames.some((d) => LLM_PACKAGES.includes(d))) {\n tui.store.addDiscoveredFeature(DiscoveredFeature.LLM);\n }\n } catch {\n // No package.json or parse error — skip feature discovery\n }\n\n // Signal detection is done — IntroScreen shows picker or results\n tui.store.setDetectionComplete();\n\n // Wait for IntroScreen confirmation\n await tui.waitForSetup();\n\n await runWizard(\n options as Parameters<typeof runWizard>[0],\n tui.store.session,\n );\n\n // Keep the outro screen visible — let process.exit() handle cleanup\n } catch (err) {\n // TUI unavailable (e.g., in test environment) — continue with default UI\n if (process.env.DEBUG || process.env.POSTHOG_WIZARD_DEBUG) {\n console.error('TUI init failed:', err); // eslint-disable-line no-console\n }\n await runWizard(options as Parameters<typeof runWizard>[0]);\n }\n })();\n }\n },\n )\n .command('mcp <command>', 'MCP server management commands', (yargs) => {\n return yargs\n .command(\n 'add',\n 'Install PostHog MCP server to supported clients',\n (yargs) => {\n return yargs.options({\n local: {\n default: false,\n describe:\n 'Add local development MCP server (http://localhost:8787)',\n type: 'boolean',\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n void (async () => {\n try {\n const { startTUI } = await import('./src/ui/tui/start-tui.js');\n const { buildSession } = await import(\n './src/lib/wizard-session.js'\n );\n\n const { Flow } = await import('./src/ui/tui/router.js');\n const tui = startTUI(WIZARD_VERSION, Flow.McpAdd);\n const session = buildSession({\n debug: options.debug,\n localMcp: options.local,\n });\n tui.store.session = session;\n } catch {\n // TUI unavailable — fallback to logging\n setUI(new LoggingUI());\n const { addMCPServerToClientsStep } = await import(\n './src/steps/add-mcp-server-to-clients/index.js'\n );\n await addMCPServerToClientsStep({\n local: options.local,\n });\n }\n })();\n },\n )\n .command(\n 'remove',\n 'Remove PostHog MCP server from supported clients',\n (yargs) => {\n return yargs.options({\n local: {\n default: false,\n describe:\n 'Remove local development MCP server (http://localhost:8787)',\n type: 'boolean',\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n void (async () => {\n try {\n const { startTUI } = await import('./src/ui/tui/start-tui.js');\n const { buildSession } = await import(\n './src/lib/wizard-session.js'\n );\n\n const { Flow } = await import('./src/ui/tui/router.js');\n const tui = startTUI(WIZARD_VERSION, Flow.McpRemove);\n const session = buildSession({\n debug: options.debug,\n localMcp: options.local,\n });\n tui.store.session = session;\n } catch {\n // TUI unavailable — fallback to logging\n setUI(new LoggingUI());\n const { removeMCPServerFromClientsStep } = await import(\n './src/steps/add-mcp-server-to-clients/index.js'\n );\n await removeMCPServerFromClientsStep({\n local: options.local,\n });\n }\n })();\n },\n )\n .demandCommand(1, 'You must specify a subcommand (add or remove)')\n .help();\n })\n .help()\n .alias('help', 'h')\n .version()\n .alias('version', 'v')\n .wrap(process.stdout.isTTY ? yargs.terminalWidth() : 80).argv;\n"]}
@@ -2,14 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // Mock functions must be defined before imports
4
4
  const mockRunWizard = jest.fn();
5
- const mockRunMCPInstall = jest.fn();
6
- const mockRunMCPRemove = jest.fn();
7
5
  jest.mock('../run', () => ({ runWizard: mockRunWizard }));
8
- jest.mock('../mcp', () => ({
9
- runMCPInstall: mockRunMCPInstall,
10
- runMCPRemove: mockRunMCPRemove,
11
- }));
12
6
  jest.mock('semver', () => ({ satisfies: () => true }));
7
+ jest.mock('../ui/tui/start-tui', () => ({
8
+ startTUI: () => ({ unmount: jest.fn(), store: { session: {} } }),
9
+ }));
10
+ jest.mock('../lib/wizard-session', () => ({
11
+ buildSession: (args) => args,
12
+ }));
13
13
  describe('CLI argument parsing', () => {
14
14
  const originalArgv = process.argv;
15
15
  // eslint-disable-next-line @typescript-eslint/unbound-method
@@ -103,18 +103,7 @@ describe('CLI argument parsing', () => {
103
103
  expect(args.default).toBe(true);
104
104
  });
105
105
  });
106
- describe('mcp commands', () => {
107
- test('mcp add calls runMCPInstall', async () => {
108
- await runCLI(['mcp', 'add']);
109
- expect(mockRunMCPInstall).toHaveBeenCalled();
110
- });
111
- test('mcp commands inherit global flags', async () => {
112
- await runCLI(['mcp', 'add', '--no-default', '--debug']);
113
- const args = getLastCallArgs(mockRunMCPInstall);
114
- expect(args.default).toBe(false);
115
- expect(args.debug).toBe(true);
116
- });
117
- });
106
+ // MCP commands now launch TUI — tested via integration tests
118
107
  describe('--ci flag', () => {
119
108
  test('defaults to false when not specified', async () => {
120
109
  await runCLI([]);
@@ -1 +1 @@
1
- {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../../src/__tests__/cli.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Mock functions must be defined before imports\nconst mockRunWizard = jest.fn();\nconst mockRunMCPInstall = jest.fn();\nconst mockRunMCPRemove = jest.fn();\n\njest.mock('../run', () => ({ runWizard: mockRunWizard }));\njest.mock('../mcp', () => ({\n runMCPInstall: mockRunMCPInstall,\n runMCPRemove: mockRunMCPRemove,\n}));\njest.mock('semver', () => ({ satisfies: () => true }));\n\ndescribe('CLI argument parsing', () => {\n const originalArgv = process.argv;\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalExit = process.exit;\n const originalEnv = { ...process.env };\n\n beforeEach(() => {\n jest.clearAllMocks();\n\n // Reset environment\n process.env = { ...originalEnv };\n delete process.env.POSTHOG_WIZARD_DEFAULT;\n delete process.env.POSTHOG_WIZARD_CI;\n delete process.env.POSTHOG_WIZARD_API_KEY;\n delete process.env.POSTHOG_WIZARD_INSTALL_DIR;\n\n // Mock process.exit to prevent test runner from exiting\n process.exit = jest.fn() as any;\n });\n\n afterEach(() => {\n process.argv = originalArgv;\n process.exit = originalExit;\n process.env = originalEnv;\n jest.resetModules();\n });\n\n /**\n * Helper to run the CLI with given arguments\n */\n async function runCLI(args: string[]) {\n process.argv = ['node', 'bin.ts', ...args];\n\n jest.isolateModules(() => {\n require('../../bin.ts');\n });\n\n // Allow yargs to process\n await new Promise((resolve) => setImmediate(resolve));\n }\n\n /**\n * Helper to get the arguments passed to a mock function\n */\n function getLastCallArgs(mockFn: jest.Mock) {\n expect(mockFn).toHaveBeenCalled();\n return mockFn.mock.calls[mockFn.mock.calls.length - 1][0];\n }\n\n describe('--default flag', () => {\n test('defaults to true when not specified', async () => {\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.default).toBe(true);\n });\n\n test('can be explicitly set to false with --no-default', async () => {\n await runCLI(['--no-default']);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.default).toBe(false);\n });\n\n test('can be explicitly set to true', async () => {\n await runCLI(['--default']);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.default).toBe(true);\n });\n });\n\n describe('environment variables', () => {\n test('respects POSTHOG_WIZARD_DEFAULT', async () => {\n process.env.POSTHOG_WIZARD_DEFAULT = 'false';\n\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.default).toBe(false);\n });\n\n test('CLI args override environment variables', async () => {\n process.env.POSTHOG_WIZARD_DEFAULT = 'false';\n\n await runCLI(['--default']);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.default).toBe(true);\n });\n });\n\n describe('backward compatibility', () => {\n test('all existing flags continue to work', async () => {\n await runCLI([\n '--debug',\n '--signup',\n '--force-install',\n '--install-dir',\n '/custom/path',\n '--integration',\n 'nextjs',\n ]);\n\n const args = getLastCallArgs(mockRunWizard);\n\n // Existing flags\n expect(args.debug).toBe(true);\n expect(args.signup).toBe(true);\n expect(args['force-install']).toBe(true);\n expect(args['install-dir']).toBe('/custom/path');\n expect(args.integration).toBe('nextjs');\n\n // New defaults\n expect(args.default).toBe(true);\n });\n });\n\n describe('mcp commands', () => {\n test('mcp add calls runMCPInstall', async () => {\n await runCLI(['mcp', 'add']);\n\n expect(mockRunMCPInstall).toHaveBeenCalled();\n });\n\n test('mcp commands inherit global flags', async () => {\n await runCLI(['mcp', 'add', '--no-default', '--debug']);\n\n const args = getLastCallArgs(mockRunMCPInstall);\n expect(args.default).toBe(false);\n expect(args.debug).toBe(true);\n });\n });\n\n describe('--ci flag', () => {\n test('defaults to false when not specified', async () => {\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.ci).toBe(false);\n });\n\n test('can be set to true', async () => {\n await runCLI([\n '--ci',\n '--api-key',\n 'phx_test',\n '--install-dir',\n '/tmp/test',\n ]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.ci).toBe(true);\n });\n\n test('requires --api-key when --ci is set', async () => {\n await runCLI(['--ci', '--install-dir', '/tmp/test']);\n\n expect(process.exit).toHaveBeenCalledWith(1);\n });\n\n test('requires --install-dir when --ci is set', async () => {\n await runCLI(['--ci', '--api-key', 'phx_test']);\n\n expect(process.exit).toHaveBeenCalledWith(1);\n });\n\n test('passes --api-key to runWizard', async () => {\n await runCLI([\n '--ci',\n '--api-key',\n 'phx_test_key',\n '--install-dir',\n '/tmp/test',\n ]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.apiKey).toBe('phx_test_key');\n });\n });\n\n describe('CI environment variables', () => {\n test('respects POSTHOG_WIZARD_CI', async () => {\n process.env.POSTHOG_WIZARD_CI = 'true';\n process.env.POSTHOG_WIZARD_API_KEY = 'phx_env_key';\n process.env.POSTHOG_WIZARD_INSTALL_DIR = '/tmp/test';\n\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.ci).toBe(true);\n });\n\n test('respects POSTHOG_WIZARD_API_KEY', async () => {\n process.env.POSTHOG_WIZARD_CI = 'true';\n process.env.POSTHOG_WIZARD_API_KEY = 'phx_env_key';\n process.env.POSTHOG_WIZARD_INSTALL_DIR = '/tmp/test';\n\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.apiKey).toBe('phx_env_key');\n });\n\n test('CLI args override CI environment variables', async () => {\n process.env.POSTHOG_WIZARD_CI = 'true';\n process.env.POSTHOG_WIZARD_API_KEY = 'phx_env_key';\n process.env.POSTHOG_WIZARD_INSTALL_DIR = '/tmp/test';\n\n await runCLI([\n '--api-key',\n 'phx_cli_key',\n '--install-dir',\n '/other/path',\n ]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.apiKey).toBe('phx_cli_key');\n });\n });\n});\n"]}
1
+ {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../../src/__tests__/cli.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Mock functions must be defined before imports\nconst mockRunWizard = jest.fn();\n\njest.mock('../run', () => ({ runWizard: mockRunWizard }));\njest.mock('semver', () => ({ satisfies: () => true }));\njest.mock('../ui/tui/start-tui', () => ({\n startTUI: () => ({ unmount: jest.fn(), store: { session: {} } }),\n}));\njest.mock('../lib/wizard-session', () => ({\n buildSession: (args: Record<string, unknown>) => args,\n}));\n\ndescribe('CLI argument parsing', () => {\n const originalArgv = process.argv;\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalExit = process.exit;\n const originalEnv = { ...process.env };\n\n beforeEach(() => {\n jest.clearAllMocks();\n\n // Reset environment\n process.env = { ...originalEnv };\n delete process.env.POSTHOG_WIZARD_DEFAULT;\n delete process.env.POSTHOG_WIZARD_CI;\n delete process.env.POSTHOG_WIZARD_API_KEY;\n delete process.env.POSTHOG_WIZARD_INSTALL_DIR;\n\n // Mock process.exit to prevent test runner from exiting\n process.exit = jest.fn() as any;\n });\n\n afterEach(() => {\n process.argv = originalArgv;\n process.exit = originalExit;\n process.env = originalEnv;\n jest.resetModules();\n });\n\n /**\n * Helper to run the CLI with given arguments\n */\n async function runCLI(args: string[]) {\n process.argv = ['node', 'bin.ts', ...args];\n\n jest.isolateModules(() => {\n require('../../bin.ts');\n });\n\n // Allow yargs to process\n await new Promise((resolve) => setImmediate(resolve));\n }\n\n /**\n * Helper to get the arguments passed to a mock function\n */\n function getLastCallArgs(mockFn: jest.Mock) {\n expect(mockFn).toHaveBeenCalled();\n return mockFn.mock.calls[mockFn.mock.calls.length - 1][0];\n }\n\n describe('--default flag', () => {\n test('defaults to true when not specified', async () => {\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.default).toBe(true);\n });\n\n test('can be explicitly set to false with --no-default', async () => {\n await runCLI(['--no-default']);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.default).toBe(false);\n });\n\n test('can be explicitly set to true', async () => {\n await runCLI(['--default']);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.default).toBe(true);\n });\n });\n\n describe('environment variables', () => {\n test('respects POSTHOG_WIZARD_DEFAULT', async () => {\n process.env.POSTHOG_WIZARD_DEFAULT = 'false';\n\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.default).toBe(false);\n });\n\n test('CLI args override environment variables', async () => {\n process.env.POSTHOG_WIZARD_DEFAULT = 'false';\n\n await runCLI(['--default']);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.default).toBe(true);\n });\n });\n\n describe('backward compatibility', () => {\n test('all existing flags continue to work', async () => {\n await runCLI([\n '--debug',\n '--signup',\n '--force-install',\n '--install-dir',\n '/custom/path',\n '--integration',\n 'nextjs',\n ]);\n\n const args = getLastCallArgs(mockRunWizard);\n\n // Existing flags\n expect(args.debug).toBe(true);\n expect(args.signup).toBe(true);\n expect(args['force-install']).toBe(true);\n expect(args['install-dir']).toBe('/custom/path');\n expect(args.integration).toBe('nextjs');\n\n // New defaults\n expect(args.default).toBe(true);\n });\n });\n\n // MCP commands now launch TUI — tested via integration tests\n\n describe('--ci flag', () => {\n test('defaults to false when not specified', async () => {\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.ci).toBe(false);\n });\n\n test('can be set to true', async () => {\n await runCLI([\n '--ci',\n '--api-key',\n 'phx_test',\n '--install-dir',\n '/tmp/test',\n ]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.ci).toBe(true);\n });\n\n test('requires --api-key when --ci is set', async () => {\n await runCLI(['--ci', '--install-dir', '/tmp/test']);\n\n expect(process.exit).toHaveBeenCalledWith(1);\n });\n\n test('requires --install-dir when --ci is set', async () => {\n await runCLI(['--ci', '--api-key', 'phx_test']);\n\n expect(process.exit).toHaveBeenCalledWith(1);\n });\n\n test('passes --api-key to runWizard', async () => {\n await runCLI([\n '--ci',\n '--api-key',\n 'phx_test_key',\n '--install-dir',\n '/tmp/test',\n ]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.apiKey).toBe('phx_test_key');\n });\n });\n\n describe('CI environment variables', () => {\n test('respects POSTHOG_WIZARD_CI', async () => {\n process.env.POSTHOG_WIZARD_CI = 'true';\n process.env.POSTHOG_WIZARD_API_KEY = 'phx_env_key';\n process.env.POSTHOG_WIZARD_INSTALL_DIR = '/tmp/test';\n\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.ci).toBe(true);\n });\n\n test('respects POSTHOG_WIZARD_API_KEY', async () => {\n process.env.POSTHOG_WIZARD_CI = 'true';\n process.env.POSTHOG_WIZARD_API_KEY = 'phx_env_key';\n process.env.POSTHOG_WIZARD_INSTALL_DIR = '/tmp/test';\n\n await runCLI([]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.apiKey).toBe('phx_env_key');\n });\n\n test('CLI args override CI environment variables', async () => {\n process.env.POSTHOG_WIZARD_CI = 'true';\n process.env.POSTHOG_WIZARD_API_KEY = 'phx_env_key';\n process.env.POSTHOG_WIZARD_INSTALL_DIR = '/tmp/test';\n\n await runCLI([\n '--api-key',\n 'phx_cli_key',\n '--install-dir',\n '/other/path',\n ]);\n\n const args = getLastCallArgs(mockRunWizard);\n expect(args.apiKey).toBe('phx_cli_key');\n });\n });\n});\n"]}
@@ -6,7 +6,55 @@ const analytics_1 = require("../utils/analytics");
6
6
  const constants_1 = require("../lib/constants");
7
7
  jest.mock('../lib/agent-runner');
8
8
  jest.mock('../utils/analytics');
9
- jest.mock('../utils/clack');
9
+ jest.mock('../lib/wizard-session', () => ({
10
+ buildSession: (args) => ({
11
+ debug: false,
12
+ forceInstall: false,
13
+ installDir: process.cwd(),
14
+ ci: false,
15
+ signup: false,
16
+ localMcp: false,
17
+ menu: false,
18
+ setupConfirmed: false,
19
+ integration: null,
20
+ frameworkContext: {},
21
+ typescript: false,
22
+ credentials: null,
23
+ serviceStatus: null,
24
+ outroData: null,
25
+ frameworkConfig: null,
26
+ ...args,
27
+ }),
28
+ }));
29
+ jest.mock('../ui', () => ({
30
+ getUI: jest.fn().mockReturnValue({
31
+ log: {
32
+ info: jest.fn(),
33
+ warn: jest.fn(),
34
+ error: jest.fn(),
35
+ success: jest.fn(),
36
+ step: jest.fn(),
37
+ },
38
+ intro: jest.fn(),
39
+ outro: jest.fn(),
40
+ cancel: jest.fn(),
41
+ note: jest.fn(),
42
+ spinner: jest.fn().mockReturnValue({
43
+ start: jest.fn(),
44
+ stop: jest.fn(),
45
+ message: jest.fn(),
46
+ }),
47
+ setDetectedFramework: jest.fn(),
48
+ setCredentials: jest.fn(),
49
+ pushStatus: jest.fn(),
50
+ syncTodos: jest.fn(),
51
+ setLoginUrl: jest.fn(),
52
+ showServiceStatus: jest.fn(),
53
+ showSettingsOverride: jest.fn(),
54
+ startRun: jest.fn(),
55
+ }),
56
+ setUI: jest.fn(),
57
+ }));
10
58
  const mockRunAgentWizard = agent_runner_1.runAgentWizard;
11
59
  const mockAnalytics = analytics_1.analytics;
12
60
  describe('runWizard error handling', () => {
@@ -31,10 +79,7 @@ describe('runWizard error handling', () => {
31
79
  };
32
80
  mockRunAgentWizard.mockRejectedValue(testError);
33
81
  await expect((0, run_1.runWizard)(testArgs)).rejects.toThrow('process.exit called');
34
- expect(mockAnalytics.captureException).toHaveBeenCalledWith(testError, {
35
- integration: constants_1.Integration.nextjs,
36
- arguments: JSON.stringify(testArgs),
37
- });
82
+ expect(mockAnalytics.captureException).toHaveBeenCalledWith(testError, {});
38
83
  expect(mockAnalytics.shutdown).toHaveBeenCalledWith('error');
39
84
  });
40
85
  it('should not call captureException when wizard succeeds', async () => {