@posthog/wizard 1.36.0 → 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 (487) hide show
  1. package/README.md +80 -3
  2. package/dist/bin.js +200 -24
  3. package/dist/bin.js.map +1 -1
  4. package/dist/src/__tests__/cli.test.js +10 -74
  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 +131 -136
  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 +23 -8
  132. package/dist/src/lib/constants.js +36 -8
  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 -3
  177. package/dist/src/run.js +73 -56
  178. package/dist/src/run.js.map +1 -1
  179. package/dist/src/steps/add-mcp-server-to-clients/MCPClient.d.ts +4 -5
  180. package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js +6 -6
  181. package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js.map +1 -1
  182. package/dist/src/steps/add-mcp-server-to-clients/__tests__/defaults.test.js +1 -21
  183. package/dist/src/steps/add-mcp-server-to-clients/__tests__/defaults.test.js.map +1 -1
  184. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.js +2 -7
  185. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.js.map +1 -1
  186. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/codex.test.js +18 -22
  187. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/codex.test.js.map +1 -1
  188. package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.d.ts +7 -8
  189. package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.js +2 -2
  190. package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.js.map +1 -1
  191. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +6 -6
  192. package/dist/src/steps/add-mcp-server-to-clients/clients/codex.d.ts +7 -8
  193. package/dist/src/steps/add-mcp-server-to-clients/clients/codex.js +9 -10
  194. package/dist/src/steps/add-mcp-server-to-clients/clients/codex.js.map +1 -1
  195. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.d.ts +8 -9
  196. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +4 -4
  197. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js.map +1 -1
  198. package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.d.ts +8 -9
  199. package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.js +4 -4
  200. package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.js.map +1 -1
  201. package/dist/src/steps/add-mcp-server-to-clients/clients/zed.d.ts +8 -9
  202. package/dist/src/steps/add-mcp-server-to-clients/clients/zed.js +4 -4
  203. package/dist/src/steps/add-mcp-server-to-clients/clients/zed.js.map +1 -1
  204. package/dist/src/steps/add-mcp-server-to-clients/defaults.d.ts +9 -10
  205. package/dist/src/steps/add-mcp-server-to-clients/defaults.js +6 -13
  206. package/dist/src/steps/add-mcp-server-to-clients/defaults.js.map +1 -1
  207. package/dist/src/steps/add-mcp-server-to-clients/index.d.ts +6 -5
  208. package/dist/src/steps/add-mcp-server-to-clients/index.js +26 -110
  209. package/dist/src/steps/add-mcp-server-to-clients/index.js.map +1 -1
  210. package/dist/src/steps/add-or-update-environment-variables.js +15 -20
  211. package/dist/src/steps/add-or-update-environment-variables.js.map +1 -1
  212. package/dist/src/steps/index.d.ts +0 -1
  213. package/dist/src/steps/index.js +0 -1
  214. package/dist/src/steps/index.js.map +1 -1
  215. package/dist/src/steps/run-prettier.js +9 -11
  216. package/dist/src/steps/run-prettier.js.map +1 -1
  217. package/dist/src/steps/upload-environment-variables/EnvironmentProvider.d.ts +6 -3
  218. package/dist/src/steps/upload-environment-variables/EnvironmentProvider.js.map +1 -1
  219. package/dist/src/steps/upload-environment-variables/index.d.ts +3 -3
  220. package/dist/src/steps/upload-environment-variables/index.js +7 -35
  221. package/dist/src/steps/upload-environment-variables/index.js.map +1 -1
  222. package/dist/src/steps/upload-environment-variables/providers/vercel.d.ts +3 -2
  223. package/dist/src/steps/upload-environment-variables/providers/vercel.js +2 -2
  224. package/dist/src/steps/upload-environment-variables/providers/vercel.js.map +1 -1
  225. package/dist/src/ui/index.d.ts +8 -0
  226. package/dist/src/ui/index.js +17 -0
  227. package/dist/src/ui/index.js.map +1 -0
  228. package/dist/src/ui/logging-ui.d.ts +44 -0
  229. package/dist/src/ui/logging-ui.js +103 -0
  230. package/dist/src/ui/logging-ui.js.map +1 -0
  231. package/dist/src/ui/tui/App.d.ts +6 -0
  232. package/dist/src/ui/tui/App.js +10 -0
  233. package/dist/src/ui/tui/App.js.map +1 -0
  234. package/dist/src/ui/tui/__tests__/layout-helpers.test.js +68 -0
  235. package/dist/src/ui/tui/__tests__/layout-helpers.test.js.map +1 -0
  236. package/dist/src/ui/tui/__tests__/store.test.d.ts +1 -0
  237. package/dist/src/ui/tui/__tests__/store.test.js +723 -0
  238. package/dist/src/ui/tui/__tests__/store.test.js.map +1 -0
  239. package/dist/src/ui/tui/components/LearnCard.d.ts +10 -0
  240. package/dist/src/ui/tui/components/LearnCard.js +217 -0
  241. package/dist/src/ui/tui/components/LearnCard.js.map +1 -0
  242. package/dist/src/ui/tui/components/TipsCard.d.ts +9 -0
  243. package/dist/src/ui/tui/components/TipsCard.js +55 -0
  244. package/dist/src/ui/tui/components/TipsCard.js.map +1 -0
  245. package/dist/src/ui/tui/components/TitleBar.d.ts +6 -0
  246. package/dist/src/ui/tui/components/TitleBar.js +17 -0
  247. package/dist/src/ui/tui/components/TitleBar.js.map +1 -0
  248. package/dist/src/ui/tui/flows.d.ts +38 -0
  249. package/dist/src/ui/tui/flows.js +82 -0
  250. package/dist/src/ui/tui/flows.js.map +1 -0
  251. package/dist/src/ui/tui/hooks/useStdoutDimensions.d.ts +9 -0
  252. package/dist/src/ui/tui/hooks/useStdoutDimensions.js +37 -0
  253. package/dist/src/ui/tui/hooks/useStdoutDimensions.js.map +1 -0
  254. package/dist/src/ui/tui/ink-ui.d.ts +50 -0
  255. package/dist/src/ui/tui/ink-ui.js +108 -0
  256. package/dist/src/ui/tui/ink-ui.js.map +1 -0
  257. package/dist/src/ui/tui/package.json +1 -0
  258. package/dist/src/ui/tui/playground/PlaygroundApp.d.ts +12 -0
  259. package/dist/src/ui/tui/playground/PlaygroundApp.js +32 -0
  260. package/dist/src/ui/tui/playground/PlaygroundApp.js.map +1 -0
  261. package/dist/src/ui/tui/playground/demos/InputDemo.d.ts +4 -0
  262. package/dist/src/ui/tui/playground/demos/InputDemo.js +53 -0
  263. package/dist/src/ui/tui/playground/demos/InputDemo.js.map +1 -0
  264. package/dist/src/ui/tui/playground/demos/LayoutDemo.d.ts +5 -0
  265. package/dist/src/ui/tui/playground/demos/LayoutDemo.js +25 -0
  266. package/dist/src/ui/tui/playground/demos/LayoutDemo.js.map +1 -0
  267. package/dist/src/ui/tui/playground/demos/LogDemo.d.ts +5 -0
  268. package/dist/src/ui/tui/playground/demos/LogDemo.js +53 -0
  269. package/dist/src/ui/tui/playground/demos/LogDemo.js.map +1 -0
  270. package/dist/src/ui/tui/playground/demos/ProgressDemo.d.ts +5 -0
  271. package/dist/src/ui/tui/playground/demos/ProgressDemo.js +58 -0
  272. package/dist/src/ui/tui/playground/demos/ProgressDemo.js.map +1 -0
  273. package/dist/src/ui/tui/playground/demos/RunScreenDemo.d.ts +11 -0
  274. package/dist/src/ui/tui/playground/demos/RunScreenDemo.js +159 -0
  275. package/dist/src/ui/tui/playground/demos/RunScreenDemo.js.map +1 -0
  276. package/dist/src/ui/tui/playground/demos/WelcomeDemo.d.ts +9 -0
  277. package/dist/src/ui/tui/playground/demos/WelcomeDemo.js +15 -0
  278. package/dist/src/ui/tui/playground/demos/WelcomeDemo.js.map +1 -0
  279. package/dist/src/ui/tui/playground/start-playground.d.ts +4 -0
  280. package/dist/src/ui/tui/playground/start-playground.js +24 -0
  281. package/dist/src/ui/tui/playground/start-playground.js.map +1 -0
  282. package/dist/src/ui/tui/primitives/CardLayout.d.ts +12 -0
  283. package/dist/src/ui/tui/primitives/CardLayout.js +10 -0
  284. package/dist/src/ui/tui/primitives/CardLayout.js.map +1 -0
  285. package/dist/src/ui/tui/primitives/ConfirmationInput.d.ts +13 -0
  286. package/dist/src/ui/tui/primitives/ConfirmationInput.js +35 -0
  287. package/dist/src/ui/tui/primitives/ConfirmationInput.js.map +1 -0
  288. package/dist/src/ui/tui/primitives/ContentSequencer.d.ts +42 -0
  289. package/dist/src/ui/tui/primitives/ContentSequencer.js +137 -0
  290. package/dist/src/ui/tui/primitives/ContentSequencer.js.map +1 -0
  291. package/dist/src/ui/tui/primitives/DissolveTransition.d.ts +21 -0
  292. package/dist/src/ui/tui/primitives/DissolveTransition.js +149 -0
  293. package/dist/src/ui/tui/primitives/DissolveTransition.js.map +1 -0
  294. package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +9 -0
  295. package/dist/src/ui/tui/primitives/EventPlanViewer.js +9 -0
  296. package/dist/src/ui/tui/primitives/EventPlanViewer.js.map +1 -0
  297. package/dist/src/ui/tui/primitives/HNViewer.d.ts +7 -0
  298. package/dist/src/ui/tui/primitives/HNViewer.js +63 -0
  299. package/dist/src/ui/tui/primitives/HNViewer.js.map +1 -0
  300. package/dist/src/ui/tui/primitives/LinesBlock.d.ts +16 -0
  301. package/dist/src/ui/tui/primitives/LinesBlock.js +37 -0
  302. package/dist/src/ui/tui/primitives/LinesBlock.js.map +1 -0
  303. package/dist/src/ui/tui/primitives/LoadingBox.d.ts +8 -0
  304. package/dist/src/ui/tui/primitives/LoadingBox.js +10 -0
  305. package/dist/src/ui/tui/primitives/LoadingBox.js.map +1 -0
  306. package/dist/src/ui/tui/primitives/LogViewer.d.ts +11 -0
  307. package/dist/src/ui/tui/primitives/LogViewer.js +55 -0
  308. package/dist/src/ui/tui/primitives/LogViewer.js.map +1 -0
  309. package/dist/src/ui/tui/primitives/NodeBlock.d.ts +13 -0
  310. package/dist/src/ui/tui/primitives/NodeBlock.js +17 -0
  311. package/dist/src/ui/tui/primitives/NodeBlock.js.map +1 -0
  312. package/dist/src/ui/tui/primitives/PickerMenu.d.ts +20 -0
  313. package/dist/src/ui/tui/primitives/PickerMenu.js +134 -0
  314. package/dist/src/ui/tui/primitives/PickerMenu.js.map +1 -0
  315. package/dist/src/ui/tui/primitives/ProgressList.d.ts +15 -0
  316. package/dist/src/ui/tui/primitives/ProgressList.js +30 -0
  317. package/dist/src/ui/tui/primitives/ProgressList.js.map +1 -0
  318. package/dist/src/ui/tui/primitives/PromptLabel.d.ts +11 -0
  319. package/dist/src/ui/tui/primitives/PromptLabel.js +13 -0
  320. package/dist/src/ui/tui/primitives/PromptLabel.js.map +1 -0
  321. package/dist/src/ui/tui/primitives/ScreenContainer.d.ts +16 -0
  322. package/dist/src/ui/tui/primitives/ScreenContainer.js +36 -0
  323. package/dist/src/ui/tui/primitives/ScreenContainer.js.map +1 -0
  324. package/dist/src/ui/tui/primitives/ScreenErrorBoundary.d.ts +22 -0
  325. package/dist/src/ui/tui/primitives/ScreenErrorBoundary.js +35 -0
  326. package/dist/src/ui/tui/primitives/ScreenErrorBoundary.js.map +1 -0
  327. package/dist/src/ui/tui/primitives/SplitView.d.ts +11 -0
  328. package/dist/src/ui/tui/primitives/SplitView.js +9 -0
  329. package/dist/src/ui/tui/primitives/SplitView.js.map +1 -0
  330. package/dist/src/ui/tui/primitives/TabContainer.d.ts +23 -0
  331. package/dist/src/ui/tui/primitives/TabContainer.js +45 -0
  332. package/dist/src/ui/tui/primitives/TabContainer.js.map +1 -0
  333. package/dist/src/ui/tui/primitives/TextBlock.d.ts +41 -0
  334. package/dist/src/ui/tui/primitives/TextBlock.js +144 -0
  335. package/dist/src/ui/tui/primitives/TextBlock.js.map +1 -0
  336. package/dist/src/ui/tui/primitives/content-types.d.ts +37 -0
  337. package/dist/src/ui/tui/primitives/content-types.js +19 -0
  338. package/dist/src/ui/tui/primitives/content-types.js.map +1 -0
  339. package/dist/src/ui/tui/primitives/index.d.ts +24 -0
  340. package/dist/src/ui/tui/primitives/index.js +21 -0
  341. package/dist/src/ui/tui/primitives/index.js.map +1 -0
  342. package/dist/src/ui/tui/primitives/layout-helpers.d.ts +36 -0
  343. package/dist/src/ui/tui/primitives/layout-helpers.js +95 -0
  344. package/dist/src/ui/tui/primitives/layout-helpers.js.map +1 -0
  345. package/dist/src/ui/tui/primitives/text-helpers.d.ts +10 -0
  346. package/dist/src/ui/tui/primitives/text-helpers.js +43 -0
  347. package/dist/src/ui/tui/primitives/text-helpers.js.map +1 -0
  348. package/dist/src/ui/tui/router.d.ts +56 -0
  349. package/dist/src/ui/tui/router.js +94 -0
  350. package/dist/src/ui/tui/router.js.map +1 -0
  351. package/dist/src/ui/tui/screen-registry.d.ts +19 -0
  352. package/dist/src/ui/tui/screen-registry.js +34 -0
  353. package/dist/src/ui/tui/screen-registry.js.map +1 -0
  354. package/dist/src/ui/tui/screens/AuthScreen.d.ts +13 -0
  355. package/dist/src/ui/tui/screens/AuthScreen.js +20 -0
  356. package/dist/src/ui/tui/screens/AuthScreen.js.map +1 -0
  357. package/dist/src/ui/tui/screens/IntroScreen.d.ts +16 -0
  358. package/dist/src/ui/tui/screens/IntroScreen.js +63 -0
  359. package/dist/src/ui/tui/screens/IntroScreen.js.map +1 -0
  360. package/dist/src/ui/tui/screens/McpScreen.d.ts +24 -0
  361. package/dist/src/ui/tui/screens/McpScreen.js +112 -0
  362. package/dist/src/ui/tui/screens/McpScreen.js.map +1 -0
  363. package/dist/src/ui/tui/screens/OutageScreen.d.ts +10 -0
  364. package/dist/src/ui/tui/screens/OutageScreen.js +17 -0
  365. package/dist/src/ui/tui/screens/OutageScreen.js.map +1 -0
  366. package/dist/src/ui/tui/screens/OutroScreen.d.ts +11 -0
  367. package/dist/src/ui/tui/screens/OutroScreen.js +22 -0
  368. package/dist/src/ui/tui/screens/OutroScreen.js.map +1 -0
  369. package/dist/src/ui/tui/screens/RunScreen.d.ts +16 -0
  370. package/dist/src/ui/tui/screens/RunScreen.js +73 -0
  371. package/dist/src/ui/tui/screens/RunScreen.js.map +1 -0
  372. package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +10 -0
  373. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +24 -0
  374. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js.map +1 -0
  375. package/dist/src/ui/tui/screens/SetupScreen.d.ts +13 -0
  376. package/dist/src/ui/tui/screens/SetupScreen.js +74 -0
  377. package/dist/src/ui/tui/screens/SetupScreen.js.map +1 -0
  378. package/dist/src/ui/tui/services/mcp-installer.d.ts +21 -0
  379. package/dist/src/ui/tui/services/mcp-installer.js +58 -0
  380. package/dist/src/ui/tui/services/mcp-installer.js.map +1 -0
  381. package/dist/src/ui/tui/start-tui.d.ts +9 -0
  382. package/dist/src/ui/tui/start-tui.js +41 -0
  383. package/dist/src/ui/tui/start-tui.js.map +1 -0
  384. package/dist/src/ui/tui/store.d.ts +132 -0
  385. package/dist/src/ui/tui/store.js +320 -0
  386. package/dist/src/ui/tui/store.js.map +1 -0
  387. package/dist/src/ui/tui/styles.d.ts +31 -0
  388. package/dist/src/ui/tui/styles.js +34 -0
  389. package/dist/src/ui/tui/styles.js.map +1 -0
  390. package/dist/src/ui/wizard-ui.d.ts +64 -0
  391. package/dist/src/ui/wizard-ui.js +19 -0
  392. package/dist/src/ui/wizard-ui.js.map +1 -0
  393. package/dist/src/utils/__tests__/setup-utils.test.d.ts +1 -0
  394. package/dist/src/utils/__tests__/{clack-utils.test.js → setup-utils.test.js} +31 -22
  395. package/dist/src/utils/__tests__/setup-utils.test.js.map +1 -0
  396. package/dist/src/utils/analytics.d.ts +18 -0
  397. package/dist/src/utils/analytics.js +53 -0
  398. package/dist/src/utils/analytics.js.map +1 -1
  399. package/dist/src/utils/anthropic-status.d.ts +1 -12
  400. package/dist/src/utils/anthropic-status.js +4 -56
  401. package/dist/src/utils/anthropic-status.js.map +1 -1
  402. package/dist/src/utils/custom-headers.d.ts +9 -0
  403. package/dist/src/utils/custom-headers.js +24 -0
  404. package/dist/src/utils/custom-headers.js.map +1 -0
  405. package/dist/src/utils/debug.js +2 -2
  406. package/dist/src/utils/debug.js.map +1 -1
  407. package/dist/src/utils/environment.js +4 -2
  408. package/dist/src/utils/environment.js.map +1 -1
  409. package/dist/src/utils/oauth.d.ts +0 -2
  410. package/dist/src/utils/oauth.js +18 -21
  411. package/dist/src/utils/oauth.js.map +1 -1
  412. package/dist/src/utils/package-manager.js +13 -13
  413. package/dist/src/utils/package-manager.js.map +1 -1
  414. package/dist/src/utils/setup-utils.d.ts +76 -0
  415. package/dist/src/utils/setup-utils.js +364 -0
  416. package/dist/src/utils/setup-utils.js.map +1 -0
  417. package/dist/src/utils/types.d.ts +0 -4
  418. package/dist/src/utils/types.js.map +1 -1
  419. package/dist/src/utils/urls.d.ts +1 -1
  420. package/dist/src/utils/urls.js +22 -9
  421. package/dist/src/utils/urls.js.map +1 -1
  422. package/dist/src/utils/wizard-abort.d.ts +13 -0
  423. package/dist/src/utils/wizard-abort.js +57 -0
  424. package/dist/src/utils/wizard-abort.js.map +1 -0
  425. package/package.json +19 -7
  426. package/dist/src/android/android-wizard-agent.js.map +0 -1
  427. package/dist/src/android/utils.js.map +0 -1
  428. package/dist/src/angular/angular-wizard-agent.js.map +0 -1
  429. package/dist/src/angular/utils.js.map +0 -1
  430. package/dist/src/astro/astro-wizard-agent.js.map +0 -1
  431. package/dist/src/astro/utils.js.map +0 -1
  432. package/dist/src/django/django-wizard-agent.js.map +0 -1
  433. package/dist/src/django/utils.js.map +0 -1
  434. package/dist/src/fastapi/fastapi-wizard-agent.d.ts +0 -7
  435. package/dist/src/fastapi/fastapi-wizard-agent.js.map +0 -1
  436. package/dist/src/fastapi/utils.js.map +0 -1
  437. package/dist/src/flask/flask-wizard-agent.js.map +0 -1
  438. package/dist/src/flask/utils.js.map +0 -1
  439. package/dist/src/javascript-node/javascript-node-wizard-agent.js.map +0 -1
  440. package/dist/src/javascript-web/javascript-web-wizard-agent.js.map +0 -1
  441. package/dist/src/javascript-web/utils.js.map +0 -1
  442. package/dist/src/laravel/laravel-wizard-agent.js.map +0 -1
  443. package/dist/src/laravel/utils.js.map +0 -1
  444. package/dist/src/mcp.d.ts +0 -10
  445. package/dist/src/mcp.js +0 -45
  446. package/dist/src/mcp.js.map +0 -1
  447. package/dist/src/nextjs/nextjs-wizard-agent.js.map +0 -1
  448. package/dist/src/nextjs/utils.js.map +0 -1
  449. package/dist/src/nuxt/nuxt-wizard-agent.js.map +0 -1
  450. package/dist/src/python/python-wizard-agent.js.map +0 -1
  451. package/dist/src/python/utils.js.map +0 -1
  452. package/dist/src/rails/rails-wizard-agent.js.map +0 -1
  453. package/dist/src/rails/utils.js.map +0 -1
  454. package/dist/src/react-native/react-native-wizard-agent.js.map +0 -1
  455. package/dist/src/react-native/utils.js.map +0 -1
  456. package/dist/src/react-router/react-router-wizard-agent.js.map +0 -1
  457. package/dist/src/react-router/utils.d.ts +0 -19
  458. package/dist/src/react-router/utils.js.map +0 -1
  459. package/dist/src/ruby/ruby-wizard-agent.js.map +0 -1
  460. package/dist/src/ruby/utils.js.map +0 -1
  461. package/dist/src/steps/__tests__/add-editor-rules.test.js +0 -208
  462. package/dist/src/steps/__tests__/add-editor-rules.test.js.map +0 -1
  463. package/dist/src/steps/add-editor-rules.d.ts +0 -8
  464. package/dist/src/steps/add-editor-rules.js +0 -71
  465. package/dist/src/steps/add-editor-rules.js.map +0 -1
  466. package/dist/src/svelte/svelte-wizard-agent.js.map +0 -1
  467. package/dist/src/swift/swift-wizard-agent.js.map +0 -1
  468. package/dist/src/swift/utils.js.map +0 -1
  469. package/dist/src/tanstack-router/tanstack-router-wizard-agent.js.map +0 -1
  470. package/dist/src/tanstack-router/utils.d.ts +0 -17
  471. package/dist/src/tanstack-router/utils.js.map +0 -1
  472. package/dist/src/tanstack-start/tanstack-start-wizard-agent.js.map +0 -1
  473. package/dist/src/tanstack-start/utils.js.map +0 -1
  474. package/dist/src/utils/__tests__/clack-utils.test.js.map +0 -1
  475. package/dist/src/utils/clack-utils.d.ts +0 -190
  476. package/dist/src/utils/clack-utils.js +0 -728
  477. package/dist/src/utils/clack-utils.js.map +0 -1
  478. package/dist/src/utils/clack.d.ts +0 -2
  479. package/dist/src/utils/clack.js +0 -9
  480. package/dist/src/utils/clack.js.map +0 -1
  481. package/dist/src/vue/vue-wizard-agent.js.map +0 -1
  482. /package/dist/src/{steps/__tests__/add-editor-rules.test.d.ts → __tests__/wizard-abort.test.d.ts} +0 -0
  483. /package/dist/src/{angular → frameworks/angular}/utils.d.ts +0 -0
  484. /package/dist/src/{python → frameworks/python}/utils.js +0 -0
  485. /package/dist/src/{swift → frameworks/swift}/utils.js +0 -0
  486. /package/dist/src/{tanstack-start → frameworks/tanstack-start}/utils.d.ts +0 -0
  487. /package/dist/src/{utils/__tests__/clack-utils.test.d.ts → ui/tui/__tests__/layout-helpers.test.d.ts} +0 -0
@@ -42,8 +42,8 @@ exports.getFlaskProjectType = getFlaskProjectType;
42
42
  exports.getFlaskProjectTypeName = getFlaskProjectTypeName;
43
43
  exports.findFlaskAppFile = findFlaskAppFile;
44
44
  const fast_glob_1 = __importDefault(require("fast-glob"));
45
- const clack_1 = __importDefault(require("../utils/clack"));
46
- const semver_1 = require("../utils/semver");
45
+ const ui_1 = require("../../ui");
46
+ const semver_1 = require("../../utils/semver");
47
47
  const fs = __importStar(require("node:fs"));
48
48
  const path = __importStar(require("node:path"));
49
49
  var FlaskProjectType;
@@ -246,26 +246,26 @@ async function getFlaskProjectType(options) {
246
246
  const { installDir } = options;
247
247
  // Check for Flask-RESTX first (most specific - includes Swagger)
248
248
  if (await hasFlaskRESTX({ installDir })) {
249
- clack_1.default.log.info('Detected Flask-RESTX project');
249
+ (0, ui_1.getUI)().setDetectedFramework('Flask-RESTX');
250
250
  return FlaskProjectType.RESTX;
251
251
  }
252
252
  // Check for flask-smorest (OpenAPI-first)
253
253
  if (await hasFlaskSmorest({ installDir })) {
254
- clack_1.default.log.info('Detected flask-smorest project');
254
+ (0, ui_1.getUI)().setDetectedFramework('flask-smorest');
255
255
  return FlaskProjectType.SMOREST;
256
256
  }
257
257
  // Check for Flask-RESTful
258
258
  if (await hasFlaskRESTful({ installDir })) {
259
- clack_1.default.log.info('Detected Flask-RESTful project');
259
+ (0, ui_1.getUI)().setDetectedFramework('Flask-RESTful');
260
260
  return FlaskProjectType.RESTFUL;
261
261
  }
262
262
  // Check for Blueprints (large app structure)
263
263
  if (await hasBlueprints({ installDir })) {
264
- clack_1.default.log.info('Detected Flask project with Blueprints');
264
+ (0, ui_1.getUI)().setDetectedFramework('Flask with Blueprints');
265
265
  return FlaskProjectType.BLUEPRINT;
266
266
  }
267
267
  // Default to standard Flask
268
- clack_1.default.log.info('Detected standard Flask project');
268
+ (0, ui_1.getUI)().setDetectedFramework('Flask');
269
269
  return FlaskProjectType.STANDARD;
270
270
  }
271
271
  /**
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/frameworks/flask/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import fg from 'fast-glob';\nimport { getUI } from '../../ui';\nimport type { WizardOptions } from '../../utils/types';\nimport { createVersionBucket } from '../../utils/semver';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nexport enum FlaskProjectType {\n STANDARD = 'standard', // Basic Flask app\n RESTFUL = 'restful', // Flask-RESTful API\n RESTX = 'restx', // Flask-RESTX (Swagger docs)\n SMOREST = 'smorest', // flask-smorest (OpenAPI)\n BLUEPRINT = 'blueprint', // Large app with blueprints\n}\n\nconst IGNORE_PATTERNS = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/venv/**',\n '**/.venv/**',\n '**/env/**',\n '**/.env/**',\n '**/__pycache__/**',\n '**/migrations/**',\n '**/instance/**',\n];\n\n/**\n * Get Flask version bucket for analytics\n */\nexport const getFlaskVersionBucket = createVersionBucket();\n\n/**\n * Extract Flask version from requirements files or pyproject.toml\n */\nexport async function getFlaskVersion(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<string | undefined> {\n const { installDir } = options;\n\n // Check requirements files\n const requirementsFiles = await fg(\n ['**/requirements*.txt', '**/pyproject.toml', '**/setup.py', '**/Pipfile'],\n {\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n },\n );\n\n for (const reqFile of requirementsFiles) {\n try {\n const content = fs.readFileSync(path.join(installDir, reqFile), 'utf-8');\n\n // Try to extract version from requirements.txt format (Flask==3.0.0 or flask>=2.0)\n const requirementsMatch = content.match(\n /[Ff]lask[=<>~!]+([0-9]+\\.[0-9]+(?:\\.[0-9]+)?)/,\n );\n if (requirementsMatch) {\n return requirementsMatch[1];\n }\n\n // Try to extract from pyproject.toml format\n const pyprojectMatch = content.match(\n /[Ff]lask[\"\\s]*[=<>~!]+\\s*[\"']?([0-9]+\\.[0-9]+(?:\\.[0-9]+)?)/,\n );\n if (pyprojectMatch) {\n return pyprojectMatch[1];\n }\n } catch {\n // Skip files that can't be read\n continue;\n }\n }\n\n return undefined;\n}\n\n/**\n * Check if Flask-RESTful is installed\n */\nasync function hasFlaskRESTful({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<boolean> {\n const requirementsFiles = await fg(\n ['**/requirements*.txt', '**/pyproject.toml', '**/Pipfile'],\n {\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n },\n );\n\n for (const reqFile of requirementsFiles) {\n try {\n const content = fs.readFileSync(path.join(installDir, reqFile), 'utf-8');\n if (\n content.includes('flask-restful') ||\n content.includes('Flask-RESTful')\n ) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n // Also check imports in Python files\n const pyFiles = await fg(['**/*.py'], {\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n for (const pyFile of pyFiles) {\n try {\n const content = fs.readFileSync(path.join(installDir, pyFile), 'utf-8');\n if (\n content.includes('from flask_restful import') ||\n content.includes('import flask_restful')\n ) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n return false;\n}\n\n/**\n * Check if Flask-RESTX is installed\n */\nasync function hasFlaskRESTX({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<boolean> {\n const requirementsFiles = await fg(\n ['**/requirements*.txt', '**/pyproject.toml', '**/Pipfile'],\n {\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n },\n );\n\n for (const reqFile of requirementsFiles) {\n try {\n const content = fs.readFileSync(path.join(installDir, reqFile), 'utf-8');\n if (content.includes('flask-restx') || content.includes('Flask-RESTX')) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n // Also check imports in Python files\n const pyFiles = await fg(['**/*.py'], {\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n for (const pyFile of pyFiles) {\n try {\n const content = fs.readFileSync(path.join(installDir, pyFile), 'utf-8');\n if (\n content.includes('from flask_restx import') ||\n content.includes('import flask_restx')\n ) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n return false;\n}\n\n/**\n * Check if flask-smorest is installed\n */\nasync function hasFlaskSmorest({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<boolean> {\n const requirementsFiles = await fg(\n ['**/requirements*.txt', '**/pyproject.toml', '**/Pipfile'],\n {\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n },\n );\n\n for (const reqFile of requirementsFiles) {\n try {\n const content = fs.readFileSync(path.join(installDir, reqFile), 'utf-8');\n if (content.includes('flask-smorest')) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n // Also check imports in Python files\n const pyFiles = await fg(['**/*.py'], {\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n for (const pyFile of pyFiles) {\n try {\n const content = fs.readFileSync(path.join(installDir, pyFile), 'utf-8');\n if (\n content.includes('from flask_smorest import') ||\n content.includes('import flask_smorest')\n ) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n return false;\n}\n\n/**\n * Check if app uses Flask Blueprints\n */\nasync function hasBlueprints({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<boolean> {\n const pyFiles = await fg(['**/*.py'], {\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n for (const pyFile of pyFiles) {\n try {\n const content = fs.readFileSync(path.join(installDir, pyFile), 'utf-8');\n if (\n content.includes('Blueprint(') ||\n content.includes('register_blueprint(') ||\n content.includes('from flask import Blueprint')\n ) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n return false;\n}\n\n/**\n * Detect Flask project type\n */\nexport async function getFlaskProjectType(\n options: WizardOptions,\n): Promise<FlaskProjectType> {\n const { installDir } = options;\n\n // Check for Flask-RESTX first (most specific - includes Swagger)\n if (await hasFlaskRESTX({ installDir })) {\n getUI().setDetectedFramework('Flask-RESTX');\n return FlaskProjectType.RESTX;\n }\n\n // Check for flask-smorest (OpenAPI-first)\n if (await hasFlaskSmorest({ installDir })) {\n getUI().setDetectedFramework('flask-smorest');\n return FlaskProjectType.SMOREST;\n }\n\n // Check for Flask-RESTful\n if (await hasFlaskRESTful({ installDir })) {\n getUI().setDetectedFramework('Flask-RESTful');\n return FlaskProjectType.RESTFUL;\n }\n\n // Check for Blueprints (large app structure)\n if (await hasBlueprints({ installDir })) {\n getUI().setDetectedFramework('Flask with Blueprints');\n return FlaskProjectType.BLUEPRINT;\n }\n\n // Default to standard Flask\n getUI().setDetectedFramework('Flask');\n return FlaskProjectType.STANDARD;\n}\n\n/**\n * Get human-readable name for Flask project type\n */\nexport function getFlaskProjectTypeName(projectType: FlaskProjectType): string {\n switch (projectType) {\n case FlaskProjectType.STANDARD:\n return 'Standard Flask';\n case FlaskProjectType.RESTFUL:\n return 'Flask-RESTful';\n case FlaskProjectType.RESTX:\n return 'Flask-RESTX';\n case FlaskProjectType.SMOREST:\n return 'flask-smorest';\n case FlaskProjectType.BLUEPRINT:\n return 'Flask with Blueprints';\n }\n}\n\n/**\n * Find the main Flask app file\n */\nexport async function findFlaskAppFile(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<string | undefined> {\n const { installDir } = options;\n\n // Common Flask app file patterns\n const commonPatterns = [\n '**/app.py',\n '**/wsgi.py',\n '**/application.py',\n '**/run.py',\n '**/main.py',\n '**/__init__.py',\n ];\n\n const appFiles = await fg(commonPatterns, {\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n // Look for files with Flask() instantiation or create_app() factory\n for (const appFile of appFiles) {\n try {\n const content = fs.readFileSync(path.join(installDir, appFile), 'utf-8');\n // Check for Flask app instantiation or application factory\n if (\n content.includes('Flask(__name__)') ||\n content.includes('Flask(') ||\n content.includes('def create_app(')\n ) {\n return appFile;\n }\n } catch {\n continue;\n }\n }\n\n // If no file with Flask() found, check all Python files\n const allPyFiles = await fg(['**/*.py'], {\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n for (const pyFile of allPyFiles) {\n try {\n const content = fs.readFileSync(path.join(installDir, pyFile), 'utf-8');\n if (\n content.includes('Flask(__name__)') ||\n content.includes('def create_app(')\n ) {\n return pyFile;\n }\n } catch {\n continue;\n }\n }\n\n // Return first common pattern file if exists\n if (appFiles.length > 0) {\n return appFiles[0];\n }\n\n return undefined;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { FrameworkConfig } from '../lib/framework-config';
1
+ import type { FrameworkConfig } from '../../lib/framework-config';
2
2
  type JavaScriptNodeContext = Record<string, unknown>;
3
3
  export declare const JAVASCRIPT_NODE_AGENT_CONFIG: FrameworkConfig<JavaScriptNodeContext>;
4
4
  export {};
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.JAVASCRIPT_NODE_AGENT_CONFIG = void 0;
4
- const constants_1 = require("../lib/constants");
5
- const clack_utils_1 = require("../utils/clack-utils");
6
- const package_manager_detection_1 = require("../lib/package-manager-detection");
4
+ const constants_1 = require("../../lib/constants");
5
+ const setup_utils_1 = require("../../utils/setup-utils");
6
+ const package_manager_detection_1 = require("../../lib/package-manager-detection");
7
7
  exports.JAVASCRIPT_NODE_AGENT_CONFIG = {
8
8
  metadata: {
9
9
  name: 'Node.js',
@@ -18,7 +18,7 @@ exports.JAVASCRIPT_NODE_AGENT_CONFIG = {
18
18
  getVersion: () => undefined,
19
19
  detectPackageManager: package_manager_detection_1.detectNodePackageManagers,
20
20
  detect: async (options) => {
21
- const packageJson = await (0, clack_utils_1.tryGetPackageJson)(options);
21
+ const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
22
22
  return !!packageJson;
23
23
  },
24
24
  },
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript-node-wizard-agent.js","sourceRoot":"","sources":["../../../../src/frameworks/javascript-node/javascript-node-wizard-agent.ts"],"names":[],"mappings":";;;AAEA,mDAAkD;AAClD,yDAA4D;AAC5D,mFAAgF;AAInE,QAAA,4BAA4B,GACvC;IACE,QAAQ,EAAE;QACR,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,uBAAW,CAAC,cAAc;QACvC,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,yCAAyC;KACnD;IAED,SAAS,EAAE;QACT,WAAW,EAAE,cAAc;QAC3B,kBAAkB,EAAE,SAAS;QAC7B,eAAe,EAAE,KAAK;QACtB,UAAU,EAAE,GAAG,EAAE,CAAC,SAAS;QAC3B,oBAAoB,EAAE,qDAAyB;QAC/C,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACxB,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;YACrD,OAAO,CAAC,CAAC,WAAW,CAAC;QACvB,CAAC;KACF;IAED,WAAW,EAAE;QACX,eAAe,EAAE,KAAK;QACtB,UAAU,EAAE,CAAC,MAAc,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC;YAC7C,eAAe,EAAE,MAAM;YACvB,YAAY,EAAE,IAAI;SACnB,CAAC;KACH;IAED,SAAS,EAAE;QACT,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;KACpB;IAED,OAAO,EAAE;QACP,oBAAoB,EAClB,wFAAwF;QAC1F,mBAAmB,EACjB,qKAAqK;QACvK,yBAAyB,EAAE,GAAG,EAAE,CAAC;YAC/B,sGAAsG;SACvG;KACF;IAED,EAAE,EAAE;QACF,cAAc,EAAE,8BAA8B;QAC9C,wBAAwB,EAAE,CAAC;QAC3B,eAAe,EAAE,GAAG,EAAE,CAAC;YACrB,yCAAyC;YACzC,oCAAoC;YACpC,0DAA0D;YAC1D,iDAAiD;YACjD,iEAAiE;SAClE;QACD,iBAAiB,EAAE,GAAG,EAAE,CAAC;YACvB,wDAAwD;YACxD,qEAAqE;YACrE,wEAAwE;YACxE,mEAAmE;YACnE,qDAAqD;SACtD;KACF;CACF,CAAC","sourcesContent":["/* Generic Node.js language wizard using posthog-agent with PostHog MCP */\nimport type { FrameworkConfig } from '../../lib/framework-config';\nimport { Integration } from '../../lib/constants';\nimport { tryGetPackageJson } from '../../utils/setup-utils';\nimport { detectNodePackageManagers } from '../../lib/package-manager-detection';\n\ntype JavaScriptNodeContext = Record<string, unknown>;\n\nexport const JAVASCRIPT_NODE_AGENT_CONFIG: FrameworkConfig<JavaScriptNodeContext> =\n {\n metadata: {\n name: 'Node.js',\n integration: Integration.javascriptNode,\n beta: true,\n docsUrl: 'https://posthog.com/docs/libraries/node',\n },\n\n detection: {\n packageName: 'posthog-node',\n packageDisplayName: 'Node.js',\n usesPackageJson: false,\n getVersion: () => undefined,\n detectPackageManager: detectNodePackageManagers,\n detect: async (options) => {\n const packageJson = await tryGetPackageJson(options);\n return !!packageJson;\n },\n },\n\n environment: {\n uploadToHosting: false,\n getEnvVars: (apiKey: string, host: string) => ({\n POSTHOG_API_KEY: apiKey,\n POSTHOG_HOST: host,\n }),\n },\n\n analytics: {\n getTags: () => ({}),\n },\n\n prompts: {\n projectTypeDetection:\n 'This is a server-side Node.js project. Look for package.json and lockfiles to confirm.',\n packageInstallation:\n 'Use npm, yarn, pnpm, or bun based on the existing lockfile (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb). Install posthog-node as a regular dependency.',\n getAdditionalContextLines: () => [\n `Framework docs ID: javascript_node (use posthog://docs/frameworks/javascript_node for documentation)`,\n ],\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 5,\n getOutroChanges: () => [\n `Analyzed your Node.js project structure`,\n `Installed the posthog-node package`,\n `Created PostHog initialization with proper configuration`,\n `Configured graceful shutdown for event flushing`,\n `Added example code for events, feature flags, and error capture`,\n ],\n getOutroNextSteps: () => [\n 'Use the PostHog client instance for all tracking calls',\n 'Call posthog.shutdown() on application exit to flush pending events',\n 'NEVER send PII in event properties (no emails, names, or user content)',\n 'Use posthog.capture() for events and posthog.identify() for users',\n 'Visit your PostHog dashboard to see incoming events',\n ],\n },\n };\n"]}
@@ -1,3 +1,3 @@
1
- import type { FrameworkConfig } from '../lib/framework-config';
1
+ import type { FrameworkConfig } from '../../lib/framework-config';
2
2
  import { type JavaScriptContext } from './utils';
3
3
  export declare const JAVASCRIPT_WEB_AGENT_CONFIG: FrameworkConfig<JavaScriptContext>;
@@ -34,13 +34,13 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.JAVASCRIPT_WEB_AGENT_CONFIG = void 0;
37
- const constants_1 = require("../lib/constants");
37
+ const constants_1 = require("../../lib/constants");
38
38
  const fs = __importStar(require("node:fs"));
39
39
  const path = __importStar(require("node:path"));
40
- const package_json_1 = require("../utils/package-json");
41
- const clack_utils_1 = require("../utils/clack-utils");
40
+ const package_json_1 = require("../../utils/package-json");
41
+ const setup_utils_1 = require("../../utils/setup-utils");
42
42
  const utils_1 = require("./utils");
43
- const package_manager_detection_1 = require("../lib/package-manager-detection");
43
+ const package_manager_detection_1 = require("../../lib/package-manager-detection");
44
44
  exports.JAVASCRIPT_WEB_AGENT_CONFIG = {
45
45
  metadata: {
46
46
  name: 'JavaScript (Web)',
@@ -61,7 +61,7 @@ exports.JAVASCRIPT_WEB_AGENT_CONFIG = {
61
61
  getVersion: () => undefined,
62
62
  detectPackageManager: package_manager_detection_1.detectNodePackageManagers,
63
63
  detect: async (options) => {
64
- const packageJson = await (0, clack_utils_1.tryGetPackageJson)(options);
64
+ const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
65
65
  if (!packageJson) {
66
66
  return false;
67
67
  }
@@ -71,25 +71,27 @@ exports.JAVASCRIPT_WEB_AGENT_CONFIG = {
71
71
  return false;
72
72
  }
73
73
  }
74
- // Ensure this is actually a JS project, not just a package.json for tooling
75
74
  const { installDir } = options;
76
- // Check for a lockfile
75
+ // Has (index.html OR has a bundler) AND is a JavaScript project
76
+ const hasIndexHtmlFlag = (0, utils_1.hasIndexHtml)(options);
77
+ const bundler = (0, utils_1.detectBundler)(options);
78
+ const hasBundler = !!bundler;
77
79
  const hasLockfile = [
78
80
  'package-lock.json',
79
81
  'yarn.lock',
80
82
  'pnpm-lock.yaml',
81
83
  'bun.lockb',
82
84
  'bun.lock',
85
+ 'deno.lock',
83
86
  ].some((lockfile) => fs.existsSync(path.join(installDir, lockfile)));
84
- if (hasLockfile) {
87
+ // We only treat this as JS Web if there's BOTH:
88
+ // - a lockfile, and
89
+ // - at least one frontend signal (index.html or bundler)
90
+ if (hasLockfile && (hasIndexHtmlFlag || hasBundler)) {
85
91
  return true;
86
92
  }
87
- // Fallback: check if package.json has actual dependencies
88
- const hasDeps = (packageJson.dependencies &&
89
- Object.keys(packageJson.dependencies).length > 0) ||
90
- (packageJson.devDependencies &&
91
- Object.keys(packageJson.devDependencies).length > 0);
92
- return !!hasDeps;
93
+ // Otherwise Node/Backend (handled by javascriptNode fallback)
94
+ return false;
93
95
  },
94
96
  },
95
97
  environment: {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript-web-wizard-agent.js","sourceRoot":"","sources":["../../../../src/frameworks/javascript-web/javascript-web-wizard-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/* Generic JavaScript Web (client-side) wizard using posthog-agent with PostHog MCP */\nimport type { WizardOptions } from '../../utils/types';\nimport type { FrameworkConfig } from '../../lib/framework-config';\nimport { Integration } from '../../lib/constants';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { hasPackageInstalled } from '../../utils/package-json';\nimport { tryGetPackageJson } from '../../utils/setup-utils';\nimport {\n FRAMEWORK_PACKAGES,\n detectJsPackageManager,\n detectBundler,\n hasIndexHtml,\n type JavaScriptContext,\n} from './utils';\nimport { detectNodePackageManagers } from '../../lib/package-manager-detection';\n\nexport const JAVASCRIPT_WEB_AGENT_CONFIG: FrameworkConfig<JavaScriptContext> = {\n metadata: {\n name: 'JavaScript (Web)',\n integration: Integration.javascript_web,\n beta: true,\n docsUrl: 'https://posthog.com/docs/libraries/js',\n gatherContext: (options: WizardOptions) => {\n const packageManagerName = detectJsPackageManager(options);\n const hasTypeScript = fs.existsSync(\n path.join(options.installDir, 'tsconfig.json'),\n );\n const hasBundler = detectBundler(options);\n return Promise.resolve({ packageManagerName, hasTypeScript, hasBundler });\n },\n },\n\n detection: {\n packageName: 'posthog-js',\n packageDisplayName: 'JavaScript (Web)',\n usesPackageJson: false,\n getVersion: () => undefined,\n detectPackageManager: detectNodePackageManagers,\n detect: async (options) => {\n const packageJson = await tryGetPackageJson(options);\n if (!packageJson) {\n return false;\n }\n\n // Exclude projects with known framework packages\n for (const frameworkPkg of FRAMEWORK_PACKAGES) {\n if (hasPackageInstalled(frameworkPkg, packageJson)) {\n return false;\n }\n }\n\n const { installDir } = options;\n\n // Has (index.html OR has a bundler) AND is a JavaScript project\n const hasIndexHtmlFlag = hasIndexHtml(options);\n\n const bundler = detectBundler(options);\n const hasBundler = !!bundler;\n\n const hasLockfile = [\n 'package-lock.json',\n 'yarn.lock',\n 'pnpm-lock.yaml',\n 'bun.lockb',\n 'bun.lock',\n 'deno.lock',\n ].some((lockfile) => fs.existsSync(path.join(installDir, lockfile)));\n\n // We only treat this as JS Web if there's BOTH:\n // - a lockfile, and\n // - at least one frontend signal (index.html or bundler)\n if (hasLockfile && (hasIndexHtmlFlag || hasBundler)) {\n return true;\n }\n\n // Otherwise → Node/Backend (handled by javascriptNode fallback)\n return false;\n },\n },\n\n environment: {\n uploadToHosting: false,\n getEnvVars: (apiKey: string, host: string) => ({\n POSTHOG_API_KEY: apiKey,\n POSTHOG_HOST: host,\n }),\n },\n\n analytics: {\n getTags: (context) => {\n const tags: Record<string, string> = {\n packageManager: context.packageManagerName ?? 'unknown',\n };\n if (context.hasBundler) {\n tags.bundler = context.hasBundler;\n }\n return tags;\n },\n },\n\n prompts: {\n projectTypeDetection:\n 'This is a JavaScript/TypeScript project. Look for package.json and lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb) to confirm.',\n packageInstallation:\n 'Look for lockfiles to determine the package manager (npm, yarn, pnpm, bun). Do not manually edit package.json.',\n getAdditionalContextLines: (context) => {\n const lines = [\n `Package manager: ${context.packageManagerName ?? 'unknown'}`,\n `Has TypeScript: ${context.hasTypeScript ? 'yes' : 'no'}`,\n `Framework docs ID: js (use posthog://docs/frameworks/js for documentation if available)`,\n `Project type: Generic JavaScript/TypeScript application (no specific framework detected)`,\n ];\n\n if (context.hasBundler) {\n lines.unshift(`Bundler: ${context.hasBundler}`);\n }\n\n return lines;\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 5,\n getOutroChanges: (context) => {\n const packageManagerName =\n context.packageManagerName ?? 'package manager';\n return [\n `Analyzed your JavaScript project structure`,\n `Installed the posthog-js package using ${packageManagerName}`,\n `Created PostHog initialization code`,\n `Configured autocapture, error tracking, and event capture`,\n ];\n },\n getOutroNextSteps: () => [\n 'Ensure posthog.init() is called before any capture calls',\n 'Autocapture tracks clicks, form submissions, and pageviews automatically',\n 'Use posthog.capture() for custom events and posthog.identify() for users',\n 'NEVER send PII in event properties (no emails, names, or user content)',\n 'Visit your PostHog dashboard to see incoming events',\n ],\n },\n};\n"]}
@@ -1,4 +1,4 @@
1
- import type { WizardOptions } from '../utils/types';
1
+ import type { WizardOptions } from '../../utils/types';
2
2
  export type JavaScriptContext = {
3
3
  packageManagerName?: string;
4
4
  hasTypeScript?: boolean;
@@ -21,3 +21,8 @@ export declare function detectJsPackageManager(options: Pick<WizardOptions, 'ins
21
21
  * Detect the bundler used in the project by checking package.json dependencies.
22
22
  */
23
23
  export declare function detectBundler(options: Pick<WizardOptions, 'installDir'>): string | undefined;
24
+ /**
25
+ * Heuristic: check if there is an index.html anywhere in the project,
26
+ * ignoring common build and dependency directories.
27
+ */
28
+ export declare function hasIndexHtml(options: Pick<WizardOptions, 'installDir'>): boolean;
@@ -36,9 +36,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.FRAMEWORK_PACKAGES = void 0;
37
37
  exports.detectJsPackageManager = detectJsPackageManager;
38
38
  exports.detectBundler = detectBundler;
39
+ exports.hasIndexHtml = hasIndexHtml;
39
40
  const fs = __importStar(require("node:fs"));
40
41
  const path = __importStar(require("node:path"));
41
- const package_manager_1 = require("../utils/package-manager");
42
+ const package_manager_1 = require("../../utils/package-manager");
43
+ const INDEX_HTML_MAX_DEPTH = 6;
44
+ const INDEX_HTML_IGNORE_DIRS = new Set([
45
+ 'node_modules',
46
+ '.git',
47
+ '.next',
48
+ 'dist',
49
+ 'build',
50
+ '.turbo',
51
+ '.cache',
52
+ ]);
42
53
  /**
43
54
  * Packages that indicate a specific framework integration exists.
44
55
  * If any of these are in package.json, we should NOT match as generic JavaScript.
@@ -96,4 +107,41 @@ function detectBundler(options) {
96
107
  return undefined;
97
108
  }
98
109
  }
110
+ /**
111
+ * Heuristic: check if there is an index.html anywhere in the project,
112
+ * ignoring common build and dependency directories.
113
+ */
114
+ function hasIndexHtml(options) {
115
+ const root = options.installDir;
116
+ function search(dir, depth) {
117
+ if (depth > INDEX_HTML_MAX_DEPTH) {
118
+ return false;
119
+ }
120
+ const base = path.basename(dir);
121
+ if (INDEX_HTML_IGNORE_DIRS.has(base)) {
122
+ return false;
123
+ }
124
+ let entries;
125
+ try {
126
+ entries = fs.readdirSync(dir, { withFileTypes: true });
127
+ }
128
+ catch {
129
+ return false;
130
+ }
131
+ for (const entry of entries) {
132
+ if (entry.isFile() && entry.name.toLowerCase() === 'index.html') {
133
+ return true;
134
+ }
135
+ }
136
+ for (const entry of entries) {
137
+ if (entry.isDirectory()) {
138
+ if (search(path.join(dir, entry.name), depth + 1)) {
139
+ return true;
140
+ }
141
+ }
142
+ }
143
+ return false;
144
+ }
145
+ return search(root, 0);
146
+ }
99
147
  //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/frameworks/javascript-web/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { detectAllPackageManagers } from '../../utils/package-manager';\nimport type { WizardOptions } from '../../utils/types';\n\nexport type JavaScriptContext = {\n packageManagerName?: string;\n hasTypeScript?: boolean;\n hasBundler?: string;\n};\n\nconst INDEX_HTML_MAX_DEPTH = 6;\nconst INDEX_HTML_IGNORE_DIRS = new Set([\n 'node_modules',\n '.git',\n '.next',\n 'dist',\n 'build',\n '.turbo',\n '.cache',\n]);\n\n/**\n * Packages that indicate a specific framework integration exists.\n * If any of these are in package.json, we should NOT match as generic JavaScript.\n *\n * When adding a new JS framework integration to the wizard,\n * add its detection package here too.\n */\nexport const FRAMEWORK_PACKAGES = [\n 'next',\n 'nuxt',\n 'vue',\n 'react-router',\n '@tanstack/react-start',\n '@tanstack/react-router',\n 'react-native',\n '@angular/core',\n 'astro',\n '@sveltejs/kit',\n] as const;\n\n/**\n * Detect the JS package manager for the project by checking lockfiles.\n * Reuses the existing package manager detection infrastructure.\n */\nexport function detectJsPackageManager(\n options: Pick<WizardOptions, 'installDir'>,\n): string {\n const detected = detectAllPackageManagers(options);\n if (detected.length > 0) {\n return detected[0].label;\n }\n return 'unknown';\n}\n\n/**\n * Detect the bundler used in the project by checking package.json dependencies.\n */\nexport function detectBundler(\n options: Pick<WizardOptions, 'installDir'>,\n): string | undefined {\n try {\n const content = fs.readFileSync(\n path.join(options.installDir, 'package.json'),\n 'utf-8',\n );\n const pkg = JSON.parse(content);\n const allDeps: Record<string, string> = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n\n if (allDeps['vite']) return 'vite';\n if (allDeps['webpack']) return 'webpack';\n if (allDeps['esbuild']) return 'esbuild';\n if (allDeps['parcel']) return 'parcel';\n if (allDeps['rollup']) return 'rollup';\n return undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Heuristic: check if there is an index.html anywhere in the project,\n * ignoring common build and dependency directories.\n */\nexport function hasIndexHtml(\n options: Pick<WizardOptions, 'installDir'>,\n): boolean {\n const root = options.installDir;\n\n function search(dir: string, depth: number): boolean {\n if (depth > INDEX_HTML_MAX_DEPTH) {\n return false;\n }\n\n const base = path.basename(dir);\n if (INDEX_HTML_IGNORE_DIRS.has(base)) {\n return false;\n }\n\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return false;\n }\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.toLowerCase() === 'index.html') {\n return true;\n }\n }\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (search(path.join(dir, entry.name), depth + 1)) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n return search(root, 0);\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { FrameworkConfig } from '../lib/framework-config';
1
+ import type { FrameworkConfig } from '../../lib/framework-config';
2
2
  import { LaravelProjectType } from './utils';
3
3
  type LaravelContext = {
4
4
  projectType?: LaravelProjectType;
@@ -37,8 +37,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.LARAVEL_AGENT_CONFIG = void 0;
40
- const package_manager_detection_1 = require("../lib/package-manager-detection");
41
- const constants_1 = require("../lib/constants");
40
+ const package_manager_detection_1 = require("../../lib/package-manager-detection");
41
+ const constants_1 = require("../../lib/constants");
42
42
  const fast_glob_1 = __importDefault(require("fast-glob"));
43
43
  const fs = __importStar(require("node:fs"));
44
44
  const path = __importStar(require("node:path"));
@@ -0,0 +1 @@
1
+ {"version":3,"file":"laravel-wizard-agent.js","sourceRoot":"","sources":["../../../../src/frameworks/laravel/laravel-wizard-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/* Laravel wizard using posthog-agent with PostHog MCP */\nimport type { WizardOptions } from '../../utils/types';\nimport type { FrameworkConfig } from '../../lib/framework-config';\nimport { composerPackageManager } from '../../lib/package-manager-detection';\nimport { Integration } from '../../lib/constants';\nimport fg from 'fast-glob';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport {\n getLaravelVersion,\n getLaravelProjectType,\n getLaravelProjectTypeName,\n getLaravelVersionBucket,\n LaravelProjectType,\n findLaravelServiceProvider,\n findLaravelBootstrapFile,\n detectLaravelStructure,\n} from './utils';\n\ntype LaravelContext = {\n projectType?: LaravelProjectType;\n serviceProvider?: string;\n bootstrapFile?: string;\n laravelStructure?: string;\n};\n\nexport const LARAVEL_AGENT_CONFIG: FrameworkConfig<LaravelContext> = {\n metadata: {\n name: 'Laravel',\n integration: Integration.laravel,\n beta: true,\n docsUrl: 'https://posthog.com/docs/libraries/php',\n unsupportedVersionDocsUrl: 'https://posthog.com/docs/libraries/php',\n gatherContext: async (options: WizardOptions) => {\n const projectType = await getLaravelProjectType(options);\n const serviceProvider = await findLaravelServiceProvider(options);\n const bootstrapFile = findLaravelBootstrapFile(options);\n const laravelStructure = detectLaravelStructure(options);\n\n return {\n projectType,\n serviceProvider,\n bootstrapFile,\n laravelStructure,\n };\n },\n },\n\n detection: {\n packageName: 'laravel/framework',\n packageDisplayName: 'Laravel',\n usesPackageJson: false,\n getVersion: () => undefined,\n getVersionBucket: getLaravelVersionBucket,\n minimumVersion: '9.0.0',\n getInstalledVersion: (options: WizardOptions) =>\n Promise.resolve(getLaravelVersion(options)),\n detect: async (options) => {\n const { installDir } = options;\n\n const artisanPath = path.join(installDir, 'artisan');\n if (fs.existsSync(artisanPath)) {\n try {\n const content = fs.readFileSync(artisanPath, 'utf-8');\n if (content.includes('Laravel') || content.includes('Artisan')) {\n return true;\n }\n } catch {\n // Continue to other checks\n }\n }\n\n const composerPath = path.join(installDir, 'composer.json');\n if (fs.existsSync(composerPath)) {\n try {\n const content = fs.readFileSync(composerPath, 'utf-8');\n const composer = JSON.parse(content);\n if (\n composer.require?.['laravel/framework'] ||\n composer['require-dev']?.['laravel/framework']\n ) {\n return true;\n }\n } catch {\n // Continue to other checks\n }\n }\n\n const hasLaravelStructure = await fg(\n ['**/bootstrap/app.php', '**/app/Http/Kernel.php'],\n { cwd: installDir, ignore: ['**/vendor/**'] },\n );\n\n return hasLaravelStructure.length > 0;\n },\n detectPackageManager: composerPackageManager,\n },\n\n environment: {\n uploadToHosting: false,\n getEnvVars: (apiKey: string, host: string) => ({\n POSTHOG_API_KEY: apiKey,\n POSTHOG_HOST: host,\n }),\n },\n\n analytics: {\n getTags: (context) => ({\n projectType: context.projectType || 'unknown',\n laravelStructure: context.laravelStructure || 'unknown',\n }),\n },\n\n prompts: {\n projectTypeDetection:\n 'This is a PHP/Laravel project. Look for composer.json, artisan CLI, and app/ directory structure to confirm. Check for Laravel-specific packages like laravel/framework.',\n packageInstallation:\n 'Use Composer to install packages. Run `composer require posthog/posthog-php` without pinning a specific version.',\n getAdditionalContextLines: (context) => {\n const projectTypeName = context.projectType\n ? getLaravelProjectTypeName(context.projectType)\n : 'unknown';\n\n const lines = [\n `Project type: ${projectTypeName}`,\n `Framework docs ID: php (use posthog://docs/frameworks/php for documentation)`,\n `Laravel structure: ${context.laravelStructure} (affects where to add configuration)`,\n ];\n\n if (context.serviceProvider) {\n lines.push(`Service provider: ${context.serviceProvider}`);\n }\n\n if (context.bootstrapFile) {\n lines.push(`Bootstrap file: ${context.bootstrapFile}`);\n }\n\n // Add Laravel-specific guidance based on version structure\n if (context.laravelStructure === 'latest') {\n lines.push(\n 'Note: Laravel 11+ uses simplified bootstrap/app.php for middleware and providers',\n );\n } else {\n lines.push(\n 'Note: Use app/Http/Kernel.php for middleware, app/Providers for service providers',\n );\n }\n\n return lines;\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 5,\n getOutroChanges: (context) => {\n const projectTypeName = context.projectType\n ? getLaravelProjectTypeName(context.projectType)\n : 'Laravel';\n\n const changes = [\n `Analyzed your ${projectTypeName} project structure`,\n `Installed the PostHog PHP package via Composer`,\n `Configured PostHog in your Laravel application`,\n ];\n\n if (context.laravelStructure === 'latest') {\n changes.push('Added PostHog initialization to bootstrap/app.php');\n } else {\n changes.push('Created a PostHog service provider for initialization');\n }\n\n if (context.projectType === LaravelProjectType.INERTIA) {\n changes.push('Configured PostHog to work with Inertia.js');\n }\n\n if (context.projectType === LaravelProjectType.LIVEWIRE) {\n changes.push('Configured PostHog to work with Livewire');\n }\n\n return changes;\n },\n getOutroNextSteps: () => [\n 'Start your Laravel development server with `php artisan serve`',\n 'Visit your PostHog dashboard to see incoming events',\n 'Use PostHog::capture() to track custom events',\n 'Use PostHog::identify() to associate events with users',\n ],\n },\n};\n"]}
@@ -1,4 +1,4 @@
1
- import type { WizardOptions } from '../utils/types';
1
+ import type { WizardOptions } from '../../utils/types';
2
2
  export declare enum LaravelProjectType {
3
3
  STANDARD = "standard",// Basic Laravel app
4
4
  INERTIA = "inertia",// Inertia.js (Vue/React SPA) - may need JS SDK too
@@ -45,8 +45,8 @@ exports.findLaravelServiceProvider = findLaravelServiceProvider;
45
45
  exports.findLaravelBootstrapFile = findLaravelBootstrapFile;
46
46
  exports.detectLaravelStructure = detectLaravelStructure;
47
47
  const fast_glob_1 = __importDefault(require("fast-glob"));
48
- const clack_1 = __importDefault(require("../utils/clack"));
49
- const semver_1 = require("../utils/semver");
48
+ const ui_1 = require("../../ui");
49
+ const semver_1 = require("../../utils/semver");
50
50
  const fs = __importStar(require("node:fs"));
51
51
  const path = __importStar(require("node:path"));
52
52
  var LaravelProjectType;
@@ -171,15 +171,15 @@ async function hasLivewire(options) {
171
171
  async function getLaravelProjectType(options) {
172
172
  // Check for SPA/Reactive frameworks (important to detect - affects SDK needs)
173
173
  if (await hasInertia(options)) {
174
- clack_1.default.log.info('Detected Laravel with Inertia.js');
174
+ (0, ui_1.getUI)().setDetectedFramework('Laravel with Inertia.js');
175
175
  return LaravelProjectType.INERTIA;
176
176
  }
177
177
  if (await hasLivewire(options)) {
178
- clack_1.default.log.info('Detected Laravel with Livewire');
178
+ (0, ui_1.getUI)().setDetectedFramework('Laravel with Livewire');
179
179
  return LaravelProjectType.LIVEWIRE;
180
180
  }
181
181
  // Default to standard
182
- clack_1.default.log.info('Detected standard Laravel project');
182
+ (0, ui_1.getUI)().setDetectedFramework('Laravel');
183
183
  return LaravelProjectType.STANDARD;
184
184
  }
185
185
  /**
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/frameworks/laravel/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import fg from 'fast-glob';\nimport { getUI } from '../../ui';\nimport type { WizardOptions } from '../../utils/types';\nimport { createVersionBucket } from '../../utils/semver';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nexport enum LaravelProjectType {\n STANDARD = 'standard', // Basic Laravel app\n INERTIA = 'inertia', // Inertia.js (Vue/React SPA) - may need JS SDK too\n LIVEWIRE = 'livewire', // Livewire (reactive components, includes Filament)\n}\n\n/**\n * Ignore patterns for Laravel projects\n */\nconst LARAVEL_IGNORE_PATTERNS = [\n '**/node_modules/**',\n '**/vendor/**',\n '**/storage/**',\n '**/bootstrap/cache/**',\n '**/.phpunit.cache/**',\n '**/public/build/**',\n '**/public/hot/**',\n];\n\n/**\n * Get Laravel version bucket for analytics\n */\nexport const getLaravelVersionBucket = createVersionBucket();\n\n/**\n * Read and parse composer.json\n */\nexport function getComposerJson(\n options: Pick<WizardOptions, 'installDir'>,\n): Record<string, any> | undefined {\n const { installDir } = options;\n\n const composerPath = path.join(installDir, 'composer.json');\n try {\n const content = fs.readFileSync(composerPath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Check if a package is installed (present in composer.json)\n */\nfunction hasComposerPackage(\n packageName: string,\n options: Pick<WizardOptions, 'installDir'>,\n): boolean {\n const composer = getComposerJson(options);\n if (!composer) return false;\n\n return !!(\n composer.require?.[packageName] || composer['require-dev']?.[packageName]\n );\n}\n\n/**\n * Extract version for a package from composer.json\n */\nfunction getComposerPackageVersion(\n packageName: string,\n options: Pick<WizardOptions, 'installDir'>,\n): string | undefined {\n const composer = getComposerJson(options);\n if (!composer) return undefined;\n\n const version =\n composer.require?.[packageName] || composer['require-dev']?.[packageName];\n if (version) {\n // Clean version string (remove ^, ~, >=, etc.)\n return version.replace(/^[\\^~>=<]+/, '');\n }\n\n return undefined;\n}\n\n/**\n * Check if a pattern exists in PHP source files\n */\nasync function hasLaravelCodePattern(\n pattern: RegExp | string,\n options: Pick<WizardOptions, 'installDir'>,\n filePatterns: string[] = ['**/*.php'],\n): Promise<boolean> {\n const { installDir } = options;\n\n const phpFiles = await fg(filePatterns, {\n cwd: installDir,\n ignore: LARAVEL_IGNORE_PATTERNS,\n });\n\n const searchPattern =\n typeof pattern === 'string' ? new RegExp(pattern) : pattern;\n\n for (const phpFile of phpFiles) {\n try {\n const content = fs.readFileSync(path.join(installDir, phpFile), 'utf-8');\n if (searchPattern.test(content)) return true;\n } catch {\n continue;\n }\n }\n\n return false;\n}\n\n/**\n * Get Laravel version from composer.json\n */\nexport function getLaravelVersion(\n options: Pick<WizardOptions, 'installDir'>,\n): string | undefined {\n return getComposerPackageVersion('laravel/framework', options);\n}\n\n/**\n * Get human-readable name for Laravel project type\n */\nexport function getLaravelProjectTypeName(\n projectType: LaravelProjectType,\n): string {\n switch (projectType) {\n case LaravelProjectType.STANDARD:\n return 'Standard Laravel';\n case LaravelProjectType.INERTIA:\n return 'Laravel with Inertia.js';\n case LaravelProjectType.LIVEWIRE:\n return 'Laravel with Livewire';\n default:\n return 'Laravel';\n }\n}\n\n/**\n * Check for Inertia.js\n */\nasync function hasInertia(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<boolean> {\n return (\n hasComposerPackage('inertiajs/inertia-laravel', options) ||\n (await hasLaravelCodePattern(/Inertia::render|inertia\\(/, options))\n );\n}\n\n/**\n * Check for Livewire\n */\nasync function hasLivewire(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<boolean> {\n return (\n hasComposerPackage('livewire/livewire', options) ||\n (await hasLaravelCodePattern(/extends\\s+Component|@livewire/, options))\n );\n}\n\n/**\n * Detect Laravel project type\n */\nexport async function getLaravelProjectType(\n options: WizardOptions,\n): Promise<LaravelProjectType> {\n // Check for SPA/Reactive frameworks (important to detect - affects SDK needs)\n if (await hasInertia(options)) {\n getUI().setDetectedFramework('Laravel with Inertia.js');\n return LaravelProjectType.INERTIA;\n }\n if (await hasLivewire(options)) {\n getUI().setDetectedFramework('Laravel with Livewire');\n return LaravelProjectType.LIVEWIRE;\n }\n\n // Default to standard\n getUI().setDetectedFramework('Laravel');\n return LaravelProjectType.STANDARD;\n}\n\n/**\n * Find the main service provider file\n */\nexport async function findLaravelServiceProvider(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<string | undefined> {\n const { installDir } = options;\n\n // Look for AppServiceProvider first (most common place for setup)\n const appServiceProvider = path.join(\n installDir,\n 'app/Providers/AppServiceProvider.php',\n );\n\n if (fs.existsSync(appServiceProvider)) {\n return 'app/Providers/AppServiceProvider.php';\n }\n\n // Fall back to searching for any service provider\n const providers = await fg(['**/app/Providers/*ServiceProvider.php'], {\n cwd: installDir,\n ignore: LARAVEL_IGNORE_PATTERNS,\n });\n\n return providers[0];\n}\n\n/**\n * Find the bootstrap file (differs between Laravel versions)\n */\nexport function findLaravelBootstrapFile(\n options: Pick<WizardOptions, 'installDir'>,\n): string | undefined {\n const { installDir } = options;\n\n // Laravel 11+ uses bootstrap/app.php with new structure\n const bootstrapApp = path.join(installDir, 'bootstrap/app.php');\n if (fs.existsSync(bootstrapApp)) {\n return 'bootstrap/app.php';\n }\n\n // Older Laravel uses app/Http/Kernel.php\n const httpKernel = path.join(installDir, 'app/Http/Kernel.php');\n if (fs.existsSync(httpKernel)) {\n return 'app/Http/Kernel.php';\n }\n\n return undefined;\n}\n\n/**\n * Detect Laravel version structure for configuration guidance\n */\nexport function detectLaravelStructure(\n options: Pick<WizardOptions, 'installDir'>,\n): 'legacy' | 'modern' | 'latest' {\n const version = getLaravelVersion(options);\n if (!version) return 'modern';\n\n try {\n const majorVersion = parseInt(version.split('.')[0], 10);\n if (majorVersion >= 11) return 'latest'; // Laravel 11+ (new structure)\n if (majorVersion >= 9) return 'modern'; // Laravel 9-10\n return 'legacy'; // Laravel 8 and below\n } catch {\n return 'modern';\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { FrameworkConfig } from '../lib/framework-config';
1
+ import type { FrameworkConfig } from '../../lib/framework-config';
2
2
  import { NextJsRouter } from './utils';
3
3
  type NextjsContext = {
4
4
  router?: NextJsRouter;
@@ -1,10 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NEXTJS_AGENT_CONFIG = void 0;
4
- const package_manager_detection_1 = require("../lib/package-manager-detection");
5
- const constants_1 = require("../lib/constants");
6
- const package_json_1 = require("../utils/package-json");
7
- const clack_utils_1 = require("../utils/clack-utils");
4
+ const package_manager_detection_1 = require("../../lib/package-manager-detection");
5
+ const constants_1 = require("../../lib/constants");
6
+ const package_json_1 = require("../../utils/package-json");
7
+ const setup_utils_1 = require("../../utils/setup-utils");
8
+ const ui_1 = require("../../ui");
8
9
  const utils_1 = require("./utils");
9
10
  exports.NEXTJS_AGENT_CONFIG = {
10
11
  metadata: {
@@ -14,7 +15,28 @@ exports.NEXTJS_AGENT_CONFIG = {
14
15
  unsupportedVersionDocsUrl: 'https://posthog.com/docs/libraries/next-js',
15
16
  gatherContext: async (options) => {
16
17
  const router = await (0, utils_1.getNextJsRouter)(options);
17
- return { router };
18
+ if (router) {
19
+ const emoji = router === utils_1.NextJsRouter.APP_ROUTER ? '\u{1F4F1}' : '\u{1F4C3}';
20
+ (0, ui_1.getUI)().setDetectedFramework(`Next.js ${(0, utils_1.getNextJsRouterName)(router)} ${emoji}`);
21
+ return { router };
22
+ }
23
+ return {};
24
+ },
25
+ setup: {
26
+ questions: [
27
+ {
28
+ key: 'router',
29
+ message: 'Which Next.js router are you using?',
30
+ options: [
31
+ { label: 'App Router', value: utils_1.NextJsRouter.APP_ROUTER },
32
+ { label: 'Pages Router', value: utils_1.NextJsRouter.PAGES_ROUTER },
33
+ ],
34
+ detect: async (opts) => {
35
+ const result = await (0, utils_1.getNextJsRouter)(opts);
36
+ return result;
37
+ },
38
+ },
39
+ ],
18
40
  },
19
41
  },
20
42
  detection: {
@@ -24,11 +46,11 @@ exports.NEXTJS_AGENT_CONFIG = {
24
46
  getVersionBucket: utils_1.getNextJsVersionBucket,
25
47
  minimumVersion: '15.3.0',
26
48
  getInstalledVersion: async (options) => {
27
- const packageJson = await (0, clack_utils_1.getPackageDotJson)(options);
28
- return (0, package_json_1.getPackageVersion)('next', packageJson);
49
+ const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
50
+ return packageJson ? (0, package_json_1.getPackageVersion)('next', packageJson) : undefined;
29
51
  },
30
52
  detect: async (options) => {
31
- const packageJson = await (0, clack_utils_1.tryGetPackageJson)(options);
53
+ const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
32
54
  return packageJson ? (0, package_json_1.hasPackageInstalled)('next', packageJson) : false;
33
55
  },
34
56
  detectPackageManager: package_manager_detection_1.detectNodePackageManagers,
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs-wizard-agent.js","sourceRoot":"","sources":["../../../../src/frameworks/nextjs/nextjs-wizard-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/* Simplified Next.js wizard using posthog-agent with PostHog MCP */\nimport type { WizardOptions } from '../../utils/types';\nimport type { FrameworkConfig } from '../../lib/framework-config';\nimport { detectNodePackageManagers } from '../../lib/package-manager-detection';\nimport { Integration } from '../../lib/constants';\nimport {\n getPackageVersion,\n hasPackageInstalled,\n type PackageDotJson,\n} from '../../utils/package-json';\nimport { tryGetPackageJson } from '../../utils/setup-utils';\nimport { getUI } from '../../ui';\nimport {\n getNextJsRouter,\n getNextJsVersionBucket,\n getNextJsRouterName,\n NextJsRouter,\n} from './utils';\n\ntype NextjsContext = {\n router?: NextJsRouter;\n};\n\nexport const NEXTJS_AGENT_CONFIG: FrameworkConfig<NextjsContext> = {\n metadata: {\n name: 'Next.js',\n integration: Integration.nextjs,\n docsUrl: 'https://posthog.com/docs/libraries/next-js',\n unsupportedVersionDocsUrl: 'https://posthog.com/docs/libraries/next-js',\n gatherContext: async (options: WizardOptions) => {\n const router = await getNextJsRouter(options);\n if (router) {\n const emoji =\n router === NextJsRouter.APP_ROUTER ? '\\u{1F4F1}' : '\\u{1F4C3}';\n getUI().setDetectedFramework(\n `Next.js ${getNextJsRouterName(router)} ${emoji}`,\n );\n return { router };\n }\n return {};\n },\n setup: {\n questions: [\n {\n key: 'router',\n message: 'Which Next.js router are you using?',\n options: [\n { label: 'App Router', value: NextJsRouter.APP_ROUTER },\n { label: 'Pages Router', value: NextJsRouter.PAGES_ROUTER },\n ],\n detect: async (opts) => {\n const result = await getNextJsRouter(opts);\n return result;\n },\n },\n ],\n },\n },\n\n detection: {\n packageName: 'next',\n packageDisplayName: 'Next.js',\n getVersion: (packageJson: unknown) =>\n getPackageVersion('next', packageJson as PackageDotJson),\n getVersionBucket: getNextJsVersionBucket,\n minimumVersion: '15.3.0',\n getInstalledVersion: async (options: WizardOptions) => {\n const packageJson = await tryGetPackageJson(options);\n return packageJson ? getPackageVersion('next', packageJson) : undefined;\n },\n detect: async (options) => {\n const packageJson = await tryGetPackageJson(options);\n return packageJson ? hasPackageInstalled('next', packageJson) : false;\n },\n detectPackageManager: detectNodePackageManagers,\n },\n\n environment: {\n uploadToHosting: true,\n getEnvVars: (apiKey: string, host: string) => ({\n NEXT_PUBLIC_POSTHOG_KEY: apiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n }),\n },\n\n analytics: {\n getTags: (context) => ({\n router: context.router === NextJsRouter.APP_ROUTER ? 'app' : 'pages',\n }),\n },\n\n prompts: {\n projectTypeDetection:\n 'This is a JavaScript/TypeScript project. Look for package.json and lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb) to confirm.',\n getAdditionalContextLines: (context) => {\n const routerType =\n context.router === NextJsRouter.APP_ROUTER ? 'app' : 'pages';\n return [`Router: ${routerType}`];\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 8,\n getOutroChanges: (context) => {\n const router = context.router ?? NextJsRouter.APP_ROUTER;\n const routerName = getNextJsRouterName(router);\n return [\n `Analyzed your Next.js project structure (${routerName})`,\n `Created and configured PostHog initializers`,\n `Integrated PostHog into your application`,\n ];\n },\n getOutroNextSteps: () => {\n return [\n 'Start your development server to see PostHog in action',\n 'Visit your PostHog dashboard to see incoming events',\n ];\n },\n },\n};\n"]}
@@ -1,9 +1,12 @@
1
- import type { WizardOptions } from '../utils/types';
1
+ import type { WizardOptions } from '../../utils/types';
2
2
  export declare const getNextJsVersionBucket: (version: string | undefined) => string;
3
3
  export declare enum NextJsRouter {
4
4
  APP_ROUTER = "app-router",
5
5
  PAGES_ROUTER = "pages-router"
6
6
  }
7
7
  export declare const IGNORE_PATTERNS: string[];
8
- export declare function getNextJsRouter({ installDir, }: Pick<WizardOptions, 'installDir'>): Promise<NextJsRouter>;
8
+ /**
9
+ * Detect Next.js router type. Pure — returns null if ambiguous.
10
+ */
11
+ export declare function getNextJsRouter({ installDir, }: Pick<WizardOptions, 'installDir'>): Promise<NextJsRouter | null>;
9
12
  export declare const getNextJsRouterName: (router: NextJsRouter) => "app router" | "pages router";
@@ -6,10 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getNextJsRouterName = exports.IGNORE_PATTERNS = exports.NextJsRouter = exports.getNextJsVersionBucket = void 0;
7
7
  exports.getNextJsRouter = getNextJsRouter;
8
8
  const fast_glob_1 = __importDefault(require("fast-glob"));
9
- const clack_utils_1 = require("../utils/clack-utils");
10
- const clack_1 = __importDefault(require("../utils/clack"));
11
- const constants_1 = require("../lib/constants");
12
- const semver_1 = require("../utils/semver");
9
+ const semver_1 = require("../../utils/semver");
13
10
  exports.getNextJsVersionBucket = (0, semver_1.createVersionBucket)();
14
11
  var NextJsRouter;
15
12
  (function (NextJsRouter) {
@@ -23,6 +20,9 @@ exports.IGNORE_PATTERNS = [
23
20
  '**/public/**',
24
21
  '**/.next/**',
25
22
  ];
23
+ /**
24
+ * Detect Next.js router type. Pure — returns null if ambiguous.
25
+ */
26
26
  async function getNextJsRouter({ installDir, }) {
27
27
  const pagesMatches = await (0, fast_glob_1.default)('**/pages/_app.@(ts|tsx|js|jsx)', {
28
28
  dot: true,
@@ -37,27 +37,13 @@ async function getNextJsRouter({ installDir, }) {
37
37
  });
38
38
  const hasAppDir = appMatches.length > 0;
39
39
  if (hasPagesDir && !hasAppDir) {
40
- clack_1.default.log.info(`Detected ${(0, exports.getNextJsRouterName)(NextJsRouter.PAGES_ROUTER)} 📃`);
41
40
  return NextJsRouter.PAGES_ROUTER;
42
41
  }
43
42
  if (hasAppDir && !hasPagesDir) {
44
- clack_1.default.log.info(`Detected ${(0, exports.getNextJsRouterName)(NextJsRouter.APP_ROUTER)} 📱`);
45
43
  return NextJsRouter.APP_ROUTER;
46
44
  }
47
- const result = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
48
- message: 'What router are you using?',
49
- options: [
50
- {
51
- label: (0, exports.getNextJsRouterName)(NextJsRouter.APP_ROUTER),
52
- value: NextJsRouter.APP_ROUTER,
53
- },
54
- {
55
- label: (0, exports.getNextJsRouterName)(NextJsRouter.PAGES_ROUTER),
56
- value: NextJsRouter.PAGES_ROUTER,
57
- },
58
- ],
59
- }), constants_1.Integration.nextjs);
60
- return result;
45
+ // Ambiguous (both or neither) — return null, SetupScreen handles it
46
+ return null;
61
47
  }
62
48
  const getNextJsRouterName = (router) => {
63
49
  return router === NextJsRouter.APP_ROUTER ? 'app router' : 'pages router';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/frameworks/nextjs/utils.ts"],"names":[],"mappings":";;;;;;AAsBA,0CA6BC;AAnDD,0DAA2B;AAE3B,+CAAyD;AAE5C,QAAA,sBAAsB,GAAG,IAAA,4BAAmB,GAAE,CAAC;AAE5D,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,yCAAyB,CAAA;IACzB,6CAA6B,CAAA;AAC/B,CAAC,EAHW,YAAY,4BAAZ,YAAY,QAGvB;AAEY,QAAA,eAAe,GAAG;IAC7B,oBAAoB;IACpB,YAAY;IACZ,aAAa;IACb,cAAc;IACd,aAAa;CACd,CAAC;AAEF;;GAEG;AACI,KAAK,UAAU,eAAe,CAAC,EACpC,UAAU,GACwB;IAClC,MAAM,YAAY,GAAG,MAAM,IAAA,mBAAE,EAAC,gCAAgC,EAAE;QAC9D,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,uBAAe;KACxB,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAE5C,MAAM,UAAU,GAAG,MAAM,IAAA,mBAAE,EAAC,mCAAmC,EAAE;QAC/D,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,uBAAe;KACxB,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IAExC,IAAI,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9B,OAAO,YAAY,CAAC,YAAY,CAAC;IACnC,CAAC;IAED,IAAI,SAAS,IAAI,CAAC,WAAW,EAAE,CAAC;QAC9B,OAAO,YAAY,CAAC,UAAU,CAAC;IACjC,CAAC;IAED,oEAAoE;IACpE,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,MAAM,mBAAmB,GAAG,CAAC,MAAoB,EAAE,EAAE;IAC1D,OAAO,MAAM,KAAK,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC;AAC5E,CAAC,CAAC;AAFW,QAAA,mBAAmB,uBAE9B","sourcesContent":["import fg from 'fast-glob';\nimport type { WizardOptions } from '../../utils/types';\nimport { createVersionBucket } from '../../utils/semver';\n\nexport const getNextJsVersionBucket = createVersionBucket();\n\nexport enum NextJsRouter {\n APP_ROUTER = 'app-router',\n PAGES_ROUTER = 'pages-router',\n}\n\nexport const IGNORE_PATTERNS = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/public/**',\n '**/.next/**',\n];\n\n/**\n * Detect Next.js router type. Pure — returns null if ambiguous.\n */\nexport async function getNextJsRouter({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<NextJsRouter | null> {\n const pagesMatches = await fg('**/pages/_app.@(ts|tsx|js|jsx)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n const hasPagesDir = pagesMatches.length > 0;\n\n const appMatches = await fg('**/app/**/layout.@(ts|tsx|js|jsx)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n const hasAppDir = appMatches.length > 0;\n\n if (hasPagesDir && !hasAppDir) {\n return NextJsRouter.PAGES_ROUTER;\n }\n\n if (hasAppDir && !hasPagesDir) {\n return NextJsRouter.APP_ROUTER;\n }\n\n // Ambiguous (both or neither) — return null, SetupScreen handles it\n return null;\n}\n\nexport const getNextJsRouterName = (router: NextJsRouter) => {\n return router === NextJsRouter.APP_ROUTER ? 'app router' : 'pages router';\n};\n"]}
@@ -1,4 +1,4 @@
1
- import type { FrameworkConfig } from '../lib/framework-config';
1
+ import type { FrameworkConfig } from '../../lib/framework-config';
2
2
  type NuxtContext = {
3
3
  versionBucket?: string;
4
4
  };