@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
@@ -43,8 +43,8 @@ exports.getDjangoProjectTypeName = getDjangoProjectTypeName;
43
43
  exports.findDjangoSettingsFile = findDjangoSettingsFile;
44
44
  exports.findDjangoUrlsFile = findDjangoUrlsFile;
45
45
  const fast_glob_1 = __importDefault(require("fast-glob"));
46
- const clack_1 = __importDefault(require("../utils/clack"));
47
- const semver_1 = require("../utils/semver");
46
+ const ui_1 = require("../../ui");
47
+ const semver_1 = require("../../utils/semver");
48
48
  const fs = __importStar(require("node:fs"));
49
49
  const path = __importStar(require("node:path"));
50
50
  var DjangoProjectType;
@@ -186,21 +186,21 @@ async function getDjangoProjectType(options) {
186
186
  const { installDir } = options;
187
187
  // Check for Wagtail first (CMS)
188
188
  if (await hasWagtail({ installDir })) {
189
- clack_1.default.log.info('Detected Django with Wagtail CMS');
189
+ (0, ui_1.getUI)().setDetectedFramework('Django with Wagtail CMS');
190
190
  return DjangoProjectType.WAGTAIL;
191
191
  }
192
192
  // Check for Django REST Framework
193
193
  if (await hasDRF({ installDir })) {
194
- clack_1.default.log.info('Detected Django REST Framework project');
194
+ (0, ui_1.getUI)().setDetectedFramework('Django REST Framework');
195
195
  return DjangoProjectType.DRF;
196
196
  }
197
197
  // Check for Django Channels
198
198
  if (await hasChannels({ installDir })) {
199
- clack_1.default.log.info('Detected Django Channels project');
199
+ (0, ui_1.getUI)().setDetectedFramework('Django Channels');
200
200
  return DjangoProjectType.CHANNELS;
201
201
  }
202
202
  // Default to standard Django
203
- clack_1.default.log.info('Detected standard Django project');
203
+ (0, ui_1.getUI)().setDetectedFramework('Django');
204
204
  return DjangoProjectType.STANDARD;
205
205
  }
206
206
  /**
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/frameworks/django/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 DjangoProjectType {\n STANDARD = 'standard', // Traditional Django project (django-admin startproject)\n DRF = 'drf', // Django REST Framework API\n WAGTAIL = 'wagtail', // Wagtail CMS\n CHANNELS = 'channels', // Django Channels (async/websockets)\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];\n\n/**\n * Get Django version bucket for analytics\n */\nexport const getDjangoVersionBucket = createVersionBucket();\n\n/**\n * Extract Django version from requirements files or pyproject.toml\n */\nexport async function getDjangoVersion(\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 (Django==4.2.0 or Django>=4.0)\n const requirementsMatch = content.match(\n /[Dd]jango[=<>~!]+([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 /[Dd]jango[\"\\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 Django REST Framework is installed\n */\nasync function hasDRF({\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('djangorestframework')) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n // Also check INSTALLED_APPS in settings\n const settingsFiles = await fg('**/settings.py', {\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n for (const settingsFile of settingsFiles) {\n try {\n const content = fs.readFileSync(\n path.join(installDir, settingsFile),\n 'utf-8',\n );\n if (content.includes('rest_framework')) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n return false;\n}\n\n/**\n * Check if Wagtail is installed\n */\nasync function hasWagtail({\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('wagtail')) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n return false;\n}\n\n/**\n * Check if Django Channels is installed\n */\nasync function hasChannels({\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('channels')) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n return false;\n}\n\n/**\n * Detect Django project type\n */\nexport async function getDjangoProjectType(\n options: WizardOptions,\n): Promise<DjangoProjectType> {\n const { installDir } = options;\n\n // Check for Wagtail first (CMS)\n if (await hasWagtail({ installDir })) {\n getUI().setDetectedFramework('Django with Wagtail CMS');\n return DjangoProjectType.WAGTAIL;\n }\n\n // Check for Django REST Framework\n if (await hasDRF({ installDir })) {\n getUI().setDetectedFramework('Django REST Framework');\n return DjangoProjectType.DRF;\n }\n\n // Check for Django Channels\n if (await hasChannels({ installDir })) {\n getUI().setDetectedFramework('Django Channels');\n return DjangoProjectType.CHANNELS;\n }\n\n // Default to standard Django\n getUI().setDetectedFramework('Django');\n return DjangoProjectType.STANDARD;\n}\n\n/**\n * Get human-readable name for Django project type\n */\nexport function getDjangoProjectTypeName(\n projectType: DjangoProjectType,\n): string {\n switch (projectType) {\n case DjangoProjectType.STANDARD:\n return 'Standard Django';\n case DjangoProjectType.DRF:\n return 'Django REST Framework';\n case DjangoProjectType.WAGTAIL:\n return 'Wagtail CMS';\n case DjangoProjectType.CHANNELS:\n return 'Django Channels';\n }\n}\n\n/**\n * Find the main Django settings file\n */\nexport async function findDjangoSettingsFile(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<string | undefined> {\n const { installDir } = options;\n\n // Look for settings.py files\n const settingsFiles = await fg('**/settings.py', {\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n if (settingsFiles.length === 0) {\n // Try settings/__init__.py for split settings\n const splitSettingsFiles = await fg('**/settings/__init__.py', {\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n if (splitSettingsFiles.length > 0) {\n return splitSettingsFiles[0];\n }\n\n return undefined;\n }\n\n // If multiple settings files, prefer the one next to manage.py or in root\n if (settingsFiles.length === 1) {\n return settingsFiles[0];\n }\n\n // Try to find the main settings file by looking for ROOT_URLCONF\n for (const settingsFile of settingsFiles) {\n try {\n const content = fs.readFileSync(\n path.join(installDir, settingsFile),\n 'utf-8',\n );\n if (content.includes('ROOT_URLCONF')) {\n return settingsFile;\n }\n } catch {\n continue;\n }\n }\n\n // Default to first found\n return settingsFiles[0];\n}\n\n/**\n * Find the main Django urls.py file\n */\nexport async function findDjangoUrlsFile(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<string | undefined> {\n const { installDir } = options;\n\n // First, try to find the root urls.py referenced in settings\n const settingsFile = await findDjangoSettingsFile(options);\n if (settingsFile) {\n try {\n const settingsContent = fs.readFileSync(\n path.join(installDir, settingsFile),\n 'utf-8',\n );\n const urlconfMatch = settingsContent.match(\n /ROOT_URLCONF\\s*=\\s*['\"]([^'\"]+)['\"]/,\n );\n if (urlconfMatch) {\n const urlconfPath = urlconfMatch[1].replace(/\\./g, '/') + '.py';\n const fullPath = path.join(installDir, urlconfPath);\n if (fs.existsSync(fullPath)) {\n return urlconfPath;\n }\n }\n } catch {\n // Fall through to glob search\n }\n }\n\n // Fallback to glob search\n const urlsFiles = await fg('**/urls.py', {\n cwd: installDir,\n ignore: [...IGNORE_PATTERNS, '**/admin/**'],\n });\n\n if (urlsFiles.length === 0) {\n return undefined;\n }\n\n // Prefer urls.py files that contain urlpatterns\n for (const urlsFile of urlsFiles) {\n try {\n const content = fs.readFileSync(path.join(installDir, urlsFile), 'utf-8');\n if (content.includes('urlpatterns')) {\n return urlsFile;\n }\n } catch {\n continue;\n }\n }\n\n return urlsFiles[0];\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import type { FrameworkConfig } from '../../lib/framework-config';
2
+ /**
3
+ * FastAPI framework configuration for the universal agent runner
4
+ */
5
+ export declare const FASTAPI_AGENT_CONFIG: FrameworkConfig;
@@ -37,15 +37,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.FASTAPI_AGENT_CONFIG = void 0;
40
- exports.runFastAPIWizardAgent = runFastAPIWizardAgent;
41
- const framework_config_1 = require("../lib/framework-config");
42
- const package_manager_detection_1 = require("../lib/package-manager-detection");
43
- const debug_1 = require("../utils/debug");
44
- const agent_runner_1 = require("../lib/agent-runner");
45
- const constants_1 = require("../lib/constants");
46
- const clack_1 = __importDefault(require("../utils/clack"));
47
- const chalk_1 = __importDefault(require("chalk"));
48
- const semver = __importStar(require("semver"));
40
+ const framework_config_1 = require("../../lib/framework-config");
41
+ const package_manager_detection_1 = require("../../lib/package-manager-detection");
42
+ const constants_1 = require("../../lib/constants");
49
43
  const utils_1 = require("./utils");
50
44
  const fast_glob_1 = __importDefault(require("fast-glob"));
51
45
  const fs = __importStar(require("node:fs"));
@@ -53,7 +47,6 @@ const path = __importStar(require("node:path"));
53
47
  /**
54
48
  * FastAPI framework configuration for the universal agent runner
55
49
  */
56
- const MINIMUM_FASTAPI_VERSION = '0.100.0';
57
50
  exports.FASTAPI_AGENT_CONFIG = {
58
51
  metadata: {
59
52
  name: 'FastAPI',
@@ -195,26 +188,4 @@ exports.FASTAPI_AGENT_CONFIG = {
195
188
  ],
196
189
  },
197
190
  };
198
- /**
199
- * FastAPI wizard powered by the universal agent runner.
200
- */
201
- async function runFastAPIWizardAgent(options) {
202
- if (options.debug) {
203
- (0, debug_1.enableDebugLogs)();
204
- }
205
- // Check FastAPI version - agent wizard requires >= 0.100.0
206
- const fastapiVersion = await (0, utils_1.getFastAPIVersion)(options);
207
- if (fastapiVersion) {
208
- const coercedVersion = semver.coerce(fastapiVersion);
209
- if (coercedVersion && semver.lt(coercedVersion, MINIMUM_FASTAPI_VERSION)) {
210
- const docsUrl = exports.FASTAPI_AGENT_CONFIG.metadata.unsupportedVersionDocsUrl ??
211
- exports.FASTAPI_AGENT_CONFIG.metadata.docsUrl;
212
- clack_1.default.log.warn(`Sorry: the wizard can't help you with FastAPI ${fastapiVersion}. Upgrade to FastAPI ${MINIMUM_FASTAPI_VERSION} or later, or check out the manual setup guide.`);
213
- clack_1.default.log.info(`Setup FastAPI manually: ${chalk_1.default.cyan(docsUrl)}`);
214
- clack_1.default.outro('PostHog wizard will see you next time!');
215
- return;
216
- }
217
- }
218
- await (0, agent_runner_1.runAgentWizard)(exports.FASTAPI_AGENT_CONFIG, options);
219
- }
220
191
  //# sourceMappingURL=fastapi-wizard-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastapi-wizard-agent.js","sourceRoot":"","sources":["../../../../src/frameworks/fastapi/fastapi-wizard-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/* FastAPI wizard using posthog-agent with PostHog MCP */\nimport type { WizardOptions } from '../../utils/types';\nimport type { FrameworkConfig } from '../../lib/framework-config';\nimport { PYTHON_PACKAGE_INSTALLATION } from '../../lib/framework-config';\nimport { detectPythonPackageManagers } from '../../lib/package-manager-detection';\nimport { Integration } from '../../lib/constants';\nimport {\n getFastAPIVersion,\n getFastAPIProjectType,\n getFastAPIProjectTypeName,\n getFastAPIVersionBucket,\n FastAPIProjectType,\n findFastAPIAppFile,\n} from './utils';\nimport fg from 'fast-glob';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * FastAPI framework configuration for the universal agent runner\n */\n\nexport const FASTAPI_AGENT_CONFIG: FrameworkConfig = {\n metadata: {\n name: 'FastAPI',\n integration: Integration.fastapi,\n docsUrl: 'https://posthog.com/docs/libraries/python',\n unsupportedVersionDocsUrl: 'https://posthog.com/docs/libraries/python',\n gatherContext: async (options: WizardOptions) => {\n const projectType = await getFastAPIProjectType(options);\n const appFile = await findFastAPIAppFile(options);\n return { projectType, appFile };\n },\n },\n\n detection: {\n packageName: 'fastapi',\n packageDisplayName: 'FastAPI',\n usesPackageJson: false,\n getVersion: (_packageJson: any) => {\n // For FastAPI, we don't use package.json. Version is extracted separately\n // from requirements.txt or pyproject.toml in the wizard entry point\n return undefined;\n },\n getVersionBucket: getFastAPIVersionBucket,\n getInstalledVersion: getFastAPIVersion,\n detect: async (options) => {\n const { installDir } = options;\n\n // Note: Django and Flask are checked before FastAPI in INTEGRATION_ORDER,\n // so if we get here, the project is not a Django or Flask project.\n\n // Check for FastAPI in requirements files\n const requirementsFiles = await fg(\n [\n '**/requirements*.txt',\n '**/pyproject.toml',\n '**/setup.py',\n '**/Pipfile',\n ],\n {\n cwd: installDir,\n ignore: ['**/venv/**', '**/.venv/**', '**/env/**', '**/.env/**'],\n },\n );\n\n for (const reqFile of requirementsFiles) {\n try {\n const content = fs.readFileSync(\n path.join(installDir, reqFile),\n 'utf-8',\n );\n // Check for fastapi package (case-insensitive)\n // Match \"fastapi\" as a standalone package\n if (\n /^fastapi([<>=~!]|$|\\s)/im.test(content) ||\n /[\"']fastapi[\"']/i.test(content)\n ) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n // Check for FastAPI app patterns in Python files\n const pyFiles = await fg(\n ['**/main.py', '**/app.py', '**/application.py', '**/__init__.py'],\n {\n cwd: installDir,\n ignore: [\n '**/venv/**',\n '**/.venv/**',\n '**/env/**',\n '**/.env/**',\n '**/__pycache__/**',\n ],\n },\n );\n\n for (const pyFile of pyFiles) {\n try {\n const content = fs.readFileSync(\n path.join(installDir, pyFile),\n 'utf-8',\n );\n if (\n content.includes('from fastapi import') ||\n content.includes('import fastapi') ||\n /FastAPI\\s*\\(/.test(content)\n ) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n return false;\n },\n detectPackageManager: detectPythonPackageManagers,\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: any) => {\n const projectType = context.projectType as FastAPIProjectType;\n return {\n projectType: projectType || 'unknown',\n };\n },\n },\n\n prompts: {\n packageInstallation: PYTHON_PACKAGE_INSTALLATION,\n projectTypeDetection:\n 'This is a Python/FastAPI project. Look for requirements.txt, pyproject.toml, setup.py, Pipfile, or main.py/app.py to confirm.',\n getAdditionalContextLines: (context: any) => {\n const projectType = context.projectType as FastAPIProjectType;\n const projectTypeName = projectType\n ? getFastAPIProjectTypeName(projectType)\n : 'unknown';\n\n // Map project type to framework ID for MCP docs resource\n const frameworkIdMap: Record<FastAPIProjectType, string> = {\n [FastAPIProjectType.STANDARD]: 'fastapi',\n [FastAPIProjectType.ROUTER]: 'fastapi',\n [FastAPIProjectType.FULLSTACK]: 'fastapi',\n };\n\n const frameworkId = projectType ? frameworkIdMap[projectType] : 'fastapi';\n\n const lines = [\n `Project type: ${projectTypeName}`,\n `Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,\n ];\n\n if (context.appFile) {\n lines.push(`App file: ${context.appFile}`);\n }\n\n return lines;\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 5,\n getOutroChanges: (context: any) => {\n const projectType = context.projectType as FastAPIProjectType;\n const projectTypeName = projectType\n ? getFastAPIProjectTypeName(projectType)\n : 'FastAPI';\n return [\n `Analyzed your ${projectTypeName} project structure`,\n `Installed the PostHog Python package`,\n `Configured PostHog in your FastAPI application`,\n `Added PostHog initialization with lifespan event handling`,\n ];\n },\n getOutroNextSteps: () => [\n 'Start your FastAPI development server to see PostHog in action',\n 'Visit your PostHog dashboard to see incoming 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 FastAPIProjectType {
3
3
  STANDARD = "standard",// Basic FastAPI app
4
4
  ROUTER = "router",// FastAPI with APIRouter
@@ -44,7 +44,7 @@ exports.getFastAPIProjectTypeName = getFastAPIProjectTypeName;
44
44
  exports.findFastAPIAppFile = findFastAPIAppFile;
45
45
  const semver_1 = require("semver");
46
46
  const fast_glob_1 = __importDefault(require("fast-glob"));
47
- const clack_1 = __importDefault(require("../utils/clack"));
47
+ const ui_1 = require("../../ui");
48
48
  const fs = __importStar(require("node:fs"));
49
49
  const path = __importStar(require("node:path"));
50
50
  var FastAPIProjectType;
@@ -177,16 +177,16 @@ async function getFastAPIProjectType(options) {
177
177
  const { installDir } = options;
178
178
  // Check for fullstack pattern (templates)
179
179
  if (await hasTemplates({ installDir })) {
180
- clack_1.default.log.info('Detected FastAPI fullstack project with templates');
180
+ (0, ui_1.getUI)().setDetectedFramework('FastAPI fullstack with templates');
181
181
  return FastAPIProjectType.FULLSTACK;
182
182
  }
183
183
  // Check for APIRouter (modular structure)
184
184
  if (await hasAPIRouter({ installDir })) {
185
- clack_1.default.log.info('Detected FastAPI project with APIRouter');
185
+ (0, ui_1.getUI)().setDetectedFramework('FastAPI with APIRouter');
186
186
  return FastAPIProjectType.ROUTER;
187
187
  }
188
188
  // Default to standard FastAPI
189
- clack_1.default.log.info('Detected standard FastAPI project');
189
+ (0, ui_1.getUI)().setDetectedFramework('FastAPI');
190
190
  return FastAPIProjectType.STANDARD;
191
191
  }
192
192
  /**
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/frameworks/fastapi/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { major, minVersion } from 'semver';\nimport fg from 'fast-glob';\nimport { getUI } from '../../ui';\nimport type { WizardOptions } from '../../utils/types';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nexport enum FastAPIProjectType {\n STANDARD = 'standard', // Basic FastAPI app\n ROUTER = 'router', // FastAPI with APIRouter\n FULLSTACK = 'fullstack', // FastAPI with templates (Jinja2)\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];\n\n/**\n * Get FastAPI version bucket for analytics\n */\nexport function getFastAPIVersionBucket(version: string | undefined): string {\n if (!version) {\n return 'none';\n }\n\n try {\n const minVer = minVersion(version);\n if (!minVer) {\n return 'invalid';\n }\n const majorVersion = major(minVer);\n // FastAPI 0.x is still the common version range\n if (majorVersion === 0) {\n return '0.x';\n }\n return `${majorVersion}.x`;\n } catch {\n return 'unknown';\n }\n}\n\n/**\n * Extract FastAPI version from requirements files or pyproject.toml\n */\nexport async function getFastAPIVersion(\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 (fastapi==0.109.0 or fastapi>=0.100)\n const requirementsMatch = content.match(\n /[Ff]ast[Aa][Pp][Ii][=<>~!]+([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]ast[Aa][Pp][Ii][\"\\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 app uses FastAPI APIRouter\n */\nasync function hasAPIRouter({\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('APIRouter(') ||\n content.includes('include_router(') ||\n content.includes('from fastapi import APIRouter')\n ) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n return false;\n}\n\n/**\n * Check if app uses Jinja2 templates (fullstack pattern)\n */\nasync function hasTemplates({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<boolean> {\n // Check for Jinja2Templates usage 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('Jinja2Templates') ||\n content.includes('from fastapi.templating import')\n ) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n // Check for templates directory\n const templateDirs = await fg(['**/templates'], {\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n onlyDirectories: true,\n });\n\n return templateDirs.length > 0;\n}\n\n/**\n * Detect FastAPI project type\n */\nexport async function getFastAPIProjectType(\n options: WizardOptions,\n): Promise<FastAPIProjectType> {\n const { installDir } = options;\n\n // Check for fullstack pattern (templates)\n if (await hasTemplates({ installDir })) {\n getUI().setDetectedFramework('FastAPI fullstack with templates');\n return FastAPIProjectType.FULLSTACK;\n }\n\n // Check for APIRouter (modular structure)\n if (await hasAPIRouter({ installDir })) {\n getUI().setDetectedFramework('FastAPI with APIRouter');\n return FastAPIProjectType.ROUTER;\n }\n\n // Default to standard FastAPI\n getUI().setDetectedFramework('FastAPI');\n return FastAPIProjectType.STANDARD;\n}\n\n/**\n * Get human-readable name for FastAPI project type\n */\nexport function getFastAPIProjectTypeName(\n projectType: FastAPIProjectType,\n): string {\n switch (projectType) {\n case FastAPIProjectType.STANDARD:\n return 'Standard FastAPI';\n case FastAPIProjectType.ROUTER:\n return 'FastAPI with APIRouter';\n case FastAPIProjectType.FULLSTACK:\n return 'FastAPI Fullstack';\n }\n}\n\n/**\n * Find the main FastAPI app file\n */\nexport async function findFastAPIAppFile(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<string | undefined> {\n const { installDir } = options;\n\n // Common FastAPI app file patterns\n const commonPatterns = [\n '**/main.py',\n '**/app.py',\n '**/application.py',\n '**/api.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 FastAPI() instantiation\n for (const appFile of appFiles) {\n try {\n const content = fs.readFileSync(path.join(installDir, appFile), 'utf-8');\n // Check for FastAPI app instantiation\n if (\n content.includes('FastAPI(') ||\n content.includes('from fastapi import FastAPI')\n ) {\n return appFile;\n }\n } catch {\n continue;\n }\n }\n\n // If no file with FastAPI() 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 (content.includes('FastAPI(')) {\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
  import { FlaskProjectType } from './utils';
3
3
  type FlaskContext = {
4
4
  projectType?: FlaskProjectType;
@@ -37,9 +37,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.FLASK_AGENT_CONFIG = void 0;
40
- const framework_config_1 = require("../lib/framework-config");
41
- const package_manager_detection_1 = require("../lib/package-manager-detection");
42
- const constants_1 = require("../lib/constants");
40
+ const framework_config_1 = require("../../lib/framework-config");
41
+ const package_manager_detection_1 = require("../../lib/package-manager-detection");
42
+ const constants_1 = require("../../lib/constants");
43
43
  const fast_glob_1 = __importDefault(require("fast-glob"));
44
44
  const fs = __importStar(require("node:fs"));
45
45
  const path = __importStar(require("node:path"));
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flask-wizard-agent.js","sourceRoot":"","sources":["../../../../src/frameworks/flask/flask-wizard-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/* Flask wizard using posthog-agent with PostHog MCP */\nimport type { WizardOptions } from '../../utils/types';\nimport type { FrameworkConfig } from '../../lib/framework-config';\nimport { PYTHON_PACKAGE_INSTALLATION } from '../../lib/framework-config';\nimport { detectPythonPackageManagers } 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 getFlaskVersion,\n getFlaskProjectType,\n getFlaskProjectTypeName,\n getFlaskVersionBucket,\n FlaskProjectType,\n findFlaskAppFile,\n} from './utils';\n\ntype FlaskContext = {\n projectType?: FlaskProjectType;\n appFile?: string;\n};\n\nexport const FLASK_AGENT_CONFIG: FrameworkConfig<FlaskContext> = {\n metadata: {\n name: 'Flask',\n integration: Integration.flask,\n beta: true,\n docsUrl: 'https://posthog.com/docs/libraries/python',\n unsupportedVersionDocsUrl: 'https://posthog.com/docs/libraries/python',\n gatherContext: async (options: WizardOptions) => {\n const projectType = await getFlaskProjectType(options);\n const appFile = await findFlaskAppFile(options);\n return { projectType, appFile };\n },\n },\n\n detection: {\n packageName: 'flask',\n packageDisplayName: 'Flask',\n usesPackageJson: false,\n getVersion: () => undefined,\n getVersionBucket: getFlaskVersionBucket,\n minimumVersion: '2.0.0',\n getInstalledVersion: (options: WizardOptions) => getFlaskVersion(options),\n detect: async (options) => {\n const { installDir } = options;\n\n const requirementsFiles = await fg(\n [\n '**/requirements*.txt',\n '**/pyproject.toml',\n '**/setup.py',\n '**/Pipfile',\n ],\n {\n cwd: installDir,\n ignore: ['**/venv/**', '**/.venv/**', '**/env/**', '**/.env/**'],\n },\n );\n\n for (const reqFile of requirementsFiles) {\n try {\n const content = fs.readFileSync(\n path.join(installDir, reqFile),\n 'utf-8',\n );\n if (\n /^flask([<>=~!]|$|\\s)/im.test(content) ||\n /[\"']flask[\"']/i.test(content)\n ) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n const pyFiles = await fg(\n ['**/app.py', '**/wsgi.py', '**/application.py', '**/__init__.py'],\n {\n cwd: installDir,\n ignore: [\n '**/venv/**',\n '**/.venv/**',\n '**/env/**',\n '**/.env/**',\n '**/__pycache__/**',\n ],\n },\n );\n\n for (const pyFile of pyFiles) {\n try {\n const content = fs.readFileSync(\n path.join(installDir, pyFile),\n 'utf-8',\n );\n if (\n content.includes('from flask import') ||\n content.includes('import flask') ||\n /Flask\\s*\\(/.test(content)\n ) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n return false;\n },\n detectPackageManager: detectPythonPackageManagers,\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 }),\n },\n\n prompts: {\n packageInstallation: PYTHON_PACKAGE_INSTALLATION,\n projectTypeDetection:\n 'This is a Python/Flask project. Look for requirements.txt, pyproject.toml, setup.py, Pipfile, or app.py/wsgi.py to confirm.',\n getAdditionalContextLines: (context) => {\n const projectTypeName = context.projectType\n ? getFlaskProjectTypeName(context.projectType)\n : 'unknown';\n\n // Map project type to framework ID for MCP docs resource\n const frameworkIdMap: Record<FlaskProjectType, string> = {\n [FlaskProjectType.STANDARD]: 'flask',\n [FlaskProjectType.RESTFUL]: 'flask',\n [FlaskProjectType.RESTX]: 'flask',\n [FlaskProjectType.SMOREST]: 'flask',\n [FlaskProjectType.BLUEPRINT]: 'flask',\n };\n\n const frameworkId = context.projectType\n ? frameworkIdMap[context.projectType]\n : 'flask';\n\n const lines = [\n `Project type: ${projectTypeName}`,\n `Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,\n ];\n\n if (context.appFile) {\n lines.push(`App file: ${context.appFile}`);\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 ? getFlaskProjectTypeName(context.projectType)\n : 'Flask';\n return [\n `Analyzed your ${projectTypeName} project structure`,\n `Installed the PostHog Python package`,\n `Configured PostHog in your Flask application`,\n `Added PostHog initialization with automatic event tracking`,\n ];\n },\n getOutroNextSteps: () => [\n 'Start your Flask development server to see PostHog in action',\n 'Visit your PostHog dashboard to see incoming 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 FlaskProjectType {
3
3
  STANDARD = "standard",// Basic Flask app
4
4
  RESTFUL = "restful",// Flask-RESTful API
@@ -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"]}