@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
@@ -1 +1 @@
1
- {"version":3,"file":"run.test.js","sourceRoot":"","sources":["../../../src/__tests__/run.test.ts"],"names":[],"mappings":";;AAAA,gCAAmC;AACnC,sDAAqD;AACrD,kDAA+C;AAC/C,gDAA+C;AAE/C,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;AACjC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AAChC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAE5B,MAAM,kBAAkB,GAAG,6BAE1B,CAAC;AACF,MAAM,aAAa,GAAG,qBAA0C,CAAC;AAEjE,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACjC,aAAa,CAAC,gBAAgB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC3C,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAEhE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAClD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG;YACf,WAAW,EAAE,uBAAW,CAAC,MAAM;YAC/B,KAAK,EAAE,IAAI;YACX,YAAY,EAAE,KAAK;SACpB,CAAC;QAEF,kBAAkB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAEhD,MAAM,MAAM,CAAC,IAAA,eAAS,EAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAEzE,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAAC,SAAS,EAAE;YACrE,WAAW,EAAE,uBAAW,CAAC,MAAM;YAC/B,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;SACpC,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,QAAQ,GAAG,EAAE,WAAW,EAAE,uBAAW,CAAC,MAAM,EAAE,CAAC;QAErD,kBAAkB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAEhD,MAAM,IAAA,eAAS,EAAC,QAAQ,CAAC,CAAC;QAE1B,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC9D,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { runWizard } from '../run';\nimport { runAgentWizard } from '../lib/agent-runner';\nimport { analytics } from '../utils/analytics';\nimport { Integration } from '../lib/constants';\n\njest.mock('../lib/agent-runner');\njest.mock('../utils/analytics');\njest.mock('../utils/clack');\n\nconst mockRunAgentWizard = runAgentWizard as jest.MockedFunction<\n typeof runAgentWizard\n>;\nconst mockAnalytics = analytics as jest.Mocked<typeof analytics>;\n\ndescribe('runWizard error handling', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n\n mockAnalytics.setTag = jest.fn();\n mockAnalytics.captureException = jest.fn();\n mockAnalytics.shutdown = jest.fn().mockResolvedValue(undefined);\n\n jest.spyOn(process, 'exit').mockImplementation(() => {\n throw new Error('process.exit called');\n });\n });\n\n afterEach(() => {\n jest.restoreAllMocks();\n });\n\n it('should capture exception and shutdown analytics on wizard error', async () => {\n const testError = new Error('Wizard failed');\n const testArgs = {\n integration: Integration.nextjs,\n debug: true,\n forceInstall: false,\n };\n\n mockRunAgentWizard.mockRejectedValue(testError);\n\n await expect(runWizard(testArgs)).rejects.toThrow('process.exit called');\n\n expect(mockAnalytics.captureException).toHaveBeenCalledWith(testError, {\n integration: Integration.nextjs,\n arguments: JSON.stringify(testArgs),\n });\n\n expect(mockAnalytics.shutdown).toHaveBeenCalledWith('error');\n });\n\n it('should not call captureException when wizard succeeds', async () => {\n const testArgs = { integration: Integration.nextjs };\n\n mockRunAgentWizard.mockResolvedValue(undefined);\n\n await runWizard(testArgs);\n\n expect(mockAnalytics.captureException).not.toHaveBeenCalled();\n expect(mockAnalytics.shutdown).not.toHaveBeenCalled();\n });\n});\n"]}
1
+ {"version":3,"file":"run.test.js","sourceRoot":"","sources":["../../../src/__tests__/run.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { runWizard } from '../run';\nimport { runAgentWizard } from '../lib/agent-runner';\nimport { analytics } from '../utils/analytics';\nimport { Integration } from '../lib/constants';\n\njest.mock('../lib/agent-runner');\njest.mock('../utils/analytics');\njest.mock('../lib/wizard-session', () => ({\n buildSession: (args: Record<string, unknown>) => ({\n debug: false,\n forceInstall: false,\n installDir: process.cwd(),\n ci: false,\n signup: false,\n localMcp: false,\n menu: false,\n setupConfirmed: false,\n integration: null,\n frameworkContext: {},\n typescript: false,\n credentials: null,\n serviceStatus: null,\n outroData: null,\n frameworkConfig: null,\n ...args,\n }),\n}));\njest.mock('../ui', () => ({\n getUI: jest.fn().mockReturnValue({\n log: {\n info: jest.fn(),\n warn: jest.fn(),\n error: jest.fn(),\n success: jest.fn(),\n step: jest.fn(),\n },\n intro: jest.fn(),\n outro: jest.fn(),\n cancel: jest.fn(),\n note: jest.fn(),\n spinner: jest.fn().mockReturnValue({\n start: jest.fn(),\n stop: jest.fn(),\n message: jest.fn(),\n }),\n setDetectedFramework: jest.fn(),\n setCredentials: jest.fn(),\n pushStatus: jest.fn(),\n syncTodos: jest.fn(),\n setLoginUrl: jest.fn(),\n showServiceStatus: jest.fn(),\n showSettingsOverride: jest.fn(),\n startRun: jest.fn(),\n }),\n setUI: jest.fn(),\n}));\n\nconst mockRunAgentWizard = runAgentWizard as jest.MockedFunction<\n typeof runAgentWizard\n>;\nconst mockAnalytics = analytics as jest.Mocked<typeof analytics>;\n\ndescribe('runWizard error handling', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n\n mockAnalytics.setTag = jest.fn();\n mockAnalytics.captureException = jest.fn();\n mockAnalytics.shutdown = jest.fn().mockResolvedValue(undefined);\n\n jest.spyOn(process, 'exit').mockImplementation(() => {\n throw new Error('process.exit called');\n });\n });\n\n afterEach(() => {\n jest.restoreAllMocks();\n });\n\n it('should capture exception and shutdown analytics on wizard error', async () => {\n const testError = new Error('Wizard failed');\n const testArgs = {\n integration: Integration.nextjs,\n debug: true,\n forceInstall: false,\n };\n\n mockRunAgentWizard.mockRejectedValue(testError);\n\n await expect(runWizard(testArgs)).rejects.toThrow('process.exit called');\n\n expect(mockAnalytics.captureException).toHaveBeenCalledWith(testError, {});\n\n expect(mockAnalytics.shutdown).toHaveBeenCalledWith('error');\n });\n\n it('should not call captureException when wizard succeeds', async () => {\n const testArgs = { integration: Integration.nextjs };\n\n mockRunAgentWizard.mockResolvedValue(undefined);\n\n await runWizard(testArgs);\n\n expect(mockAnalytics.captureException).not.toHaveBeenCalled();\n expect(mockAnalytics.shutdown).not.toHaveBeenCalled();\n });\n});\n"]}
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /* eslint-disable @typescript-eslint/require-await */
4
+ const wizard_abort_1 = require("../utils/wizard-abort");
5
+ const analytics_1 = require("../utils/analytics");
6
+ jest.mock('../utils/analytics');
7
+ jest.mock('../ui', () => ({
8
+ getUI: jest.fn().mockReturnValue({
9
+ outro: jest.fn(),
10
+ }),
11
+ }));
12
+ const mockAnalytics = analytics_1.analytics;
13
+ const { getUI } = jest.requireMock('../ui');
14
+ describe('wizardAbort', () => {
15
+ beforeEach(() => {
16
+ jest.clearAllMocks();
17
+ (0, wizard_abort_1.clearCleanup)();
18
+ mockAnalytics.captureException = jest.fn();
19
+ mockAnalytics.shutdown = jest.fn().mockResolvedValue(undefined);
20
+ jest.spyOn(process, 'exit').mockImplementation(() => {
21
+ throw new Error('process.exit called');
22
+ });
23
+ });
24
+ afterEach(() => {
25
+ jest.restoreAllMocks();
26
+ });
27
+ it('calls analytics.shutdown, getUI().outro, and process.exit in order', async () => {
28
+ const callOrder = [];
29
+ mockAnalytics.shutdown.mockImplementation(async () => {
30
+ callOrder.push('shutdown');
31
+ });
32
+ getUI().outro.mockImplementation(() => {
33
+ callOrder.push('outro');
34
+ });
35
+ await expect((0, wizard_abort_1.wizardAbort)()).rejects.toThrow('process.exit called');
36
+ expect(callOrder).toEqual(['shutdown', 'outro']);
37
+ expect(process.exit).toHaveBeenCalledWith(1);
38
+ });
39
+ it('uses default message and exit code when called with no options', async () => {
40
+ await expect((0, wizard_abort_1.wizardAbort)()).rejects.toThrow('process.exit called');
41
+ expect(getUI().outro).toHaveBeenCalledWith('Wizard setup cancelled.');
42
+ expect(mockAnalytics.shutdown).toHaveBeenCalledWith('cancelled');
43
+ expect(process.exit).toHaveBeenCalledWith(1);
44
+ });
45
+ it('uses custom message and exit code', async () => {
46
+ await expect((0, wizard_abort_1.wizardAbort)({ message: 'Custom failure', exitCode: 2 })).rejects.toThrow('process.exit called');
47
+ expect(getUI().outro).toHaveBeenCalledWith('Custom failure');
48
+ expect(process.exit).toHaveBeenCalledWith(2);
49
+ });
50
+ it('captures error in analytics and shuts down as error when error is provided', async () => {
51
+ const error = new Error('something broke');
52
+ await expect((0, wizard_abort_1.wizardAbort)({ error })).rejects.toThrow('process.exit called');
53
+ expect(mockAnalytics.captureException).toHaveBeenCalledWith(error, {});
54
+ expect(mockAnalytics.shutdown).toHaveBeenCalledWith('error');
55
+ });
56
+ it('does not capture error when no error is provided', async () => {
57
+ await expect((0, wizard_abort_1.wizardAbort)()).rejects.toThrow('process.exit called');
58
+ expect(mockAnalytics.captureException).not.toHaveBeenCalled();
59
+ });
60
+ it('includes WizardError context in analytics capture', async () => {
61
+ const error = new wizard_abort_1.WizardError('MCP missing', {
62
+ integration: 'nextjs',
63
+ error_type: 'MCP_MISSING',
64
+ });
65
+ await expect((0, wizard_abort_1.wizardAbort)({ error })).rejects.toThrow('process.exit called');
66
+ expect(mockAnalytics.captureException).toHaveBeenCalledWith(error, {
67
+ integration: 'nextjs',
68
+ error_type: 'MCP_MISSING',
69
+ });
70
+ });
71
+ it('runs registered cleanup functions before analytics and display', async () => {
72
+ const callOrder = [];
73
+ (0, wizard_abort_1.registerCleanup)(() => callOrder.push('cleanup1'));
74
+ (0, wizard_abort_1.registerCleanup)(() => callOrder.push('cleanup2'));
75
+ mockAnalytics.shutdown.mockImplementation(async () => {
76
+ callOrder.push('shutdown');
77
+ });
78
+ getUI().outro.mockImplementation(() => {
79
+ callOrder.push('outro');
80
+ });
81
+ await expect((0, wizard_abort_1.wizardAbort)()).rejects.toThrow('process.exit called');
82
+ expect(callOrder).toEqual(['cleanup1', 'cleanup2', 'shutdown', 'outro']);
83
+ });
84
+ it('does not block exit when a cleanup function throws', async () => {
85
+ (0, wizard_abort_1.registerCleanup)(() => {
86
+ throw new Error('cleanup failed');
87
+ });
88
+ (0, wizard_abort_1.registerCleanup)(() => {
89
+ /* this should still run */
90
+ });
91
+ await expect((0, wizard_abort_1.wizardAbort)()).rejects.toThrow('process.exit called');
92
+ expect(mockAnalytics.shutdown).toHaveBeenCalled();
93
+ expect(getUI().outro).toHaveBeenCalled();
94
+ expect(process.exit).toHaveBeenCalledWith(1);
95
+ });
96
+ it('shuts down analytics as "cancelled" when no error is provided', async () => {
97
+ await expect((0, wizard_abort_1.wizardAbort)({ message: 'Bad input' })).rejects.toThrow('process.exit called');
98
+ expect(mockAnalytics.shutdown).toHaveBeenCalledWith('cancelled');
99
+ });
100
+ });
101
+ describe('abort() delegates to wizardAbort()', () => {
102
+ beforeEach(() => {
103
+ jest.clearAllMocks();
104
+ (0, wizard_abort_1.clearCleanup)();
105
+ mockAnalytics.captureException = jest.fn();
106
+ mockAnalytics.shutdown = jest.fn().mockResolvedValue(undefined);
107
+ jest.spyOn(process, 'exit').mockImplementation(() => {
108
+ throw new Error('process.exit called');
109
+ });
110
+ });
111
+ afterEach(() => {
112
+ jest.restoreAllMocks();
113
+ });
114
+ it('abort() calls wizardAbort with message and exitCode', async () => {
115
+ const { abort } = await import('../utils/setup-utils.js');
116
+ await expect(abort('Test abort', 3)).rejects.toThrow('process.exit called');
117
+ expect(getUI().outro).toHaveBeenCalledWith('Test abort');
118
+ expect(process.exit).toHaveBeenCalledWith(3);
119
+ });
120
+ it('abort() uses defaults when called with no args', async () => {
121
+ const { abort } = await import('../utils/setup-utils.js');
122
+ await expect(abort()).rejects.toThrow('process.exit called');
123
+ expect(getUI().outro).toHaveBeenCalledWith('Wizard setup cancelled.');
124
+ expect(process.exit).toHaveBeenCalledWith(1);
125
+ });
126
+ });
127
+ //# sourceMappingURL=wizard-abort.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard-abort.test.js","sourceRoot":"","sources":["../../../src/__tests__/wizard-abort.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/require-await */\nimport {\n wizardAbort,\n WizardError,\n registerCleanup,\n clearCleanup,\n} from '../utils/wizard-abort';\nimport { analytics } from '../utils/analytics';\n\njest.mock('../utils/analytics');\njest.mock('../ui', () => ({\n getUI: jest.fn().mockReturnValue({\n outro: jest.fn(),\n }),\n}));\n\nconst mockAnalytics = analytics as jest.Mocked<typeof analytics>;\nconst { getUI } = jest.requireMock('../ui');\n\ndescribe('wizardAbort', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n clearCleanup();\n\n mockAnalytics.captureException = jest.fn();\n mockAnalytics.shutdown = jest.fn().mockResolvedValue(undefined);\n\n jest.spyOn(process, 'exit').mockImplementation(() => {\n throw new Error('process.exit called');\n });\n });\n\n afterEach(() => {\n jest.restoreAllMocks();\n });\n\n it('calls analytics.shutdown, getUI().outro, and process.exit in order', async () => {\n const callOrder: string[] = [];\n mockAnalytics.shutdown.mockImplementation(async () => {\n callOrder.push('shutdown');\n });\n getUI().outro.mockImplementation(() => {\n callOrder.push('outro');\n });\n\n await expect(wizardAbort()).rejects.toThrow('process.exit called');\n\n expect(callOrder).toEqual(['shutdown', 'outro']);\n expect(process.exit).toHaveBeenCalledWith(1);\n });\n\n it('uses default message and exit code when called with no options', async () => {\n await expect(wizardAbort()).rejects.toThrow('process.exit called');\n\n expect(getUI().outro).toHaveBeenCalledWith('Wizard setup cancelled.');\n expect(mockAnalytics.shutdown).toHaveBeenCalledWith('cancelled');\n expect(process.exit).toHaveBeenCalledWith(1);\n });\n\n it('uses custom message and exit code', async () => {\n await expect(\n wizardAbort({ message: 'Custom failure', exitCode: 2 }),\n ).rejects.toThrow('process.exit called');\n\n expect(getUI().outro).toHaveBeenCalledWith('Custom failure');\n expect(process.exit).toHaveBeenCalledWith(2);\n });\n\n it('captures error in analytics and shuts down as error when error is provided', async () => {\n const error = new Error('something broke');\n\n await expect(wizardAbort({ error })).rejects.toThrow('process.exit called');\n\n expect(mockAnalytics.captureException).toHaveBeenCalledWith(error, {});\n expect(mockAnalytics.shutdown).toHaveBeenCalledWith('error');\n });\n\n it('does not capture error when no error is provided', async () => {\n await expect(wizardAbort()).rejects.toThrow('process.exit called');\n\n expect(mockAnalytics.captureException).not.toHaveBeenCalled();\n });\n\n it('includes WizardError context in analytics capture', async () => {\n const error = new WizardError('MCP missing', {\n integration: 'nextjs',\n error_type: 'MCP_MISSING',\n });\n\n await expect(wizardAbort({ error })).rejects.toThrow('process.exit called');\n\n expect(mockAnalytics.captureException).toHaveBeenCalledWith(error, {\n integration: 'nextjs',\n error_type: 'MCP_MISSING',\n });\n });\n\n it('runs registered cleanup functions before analytics and display', async () => {\n const callOrder: string[] = [];\n\n registerCleanup(() => callOrder.push('cleanup1'));\n registerCleanup(() => callOrder.push('cleanup2'));\n mockAnalytics.shutdown.mockImplementation(async () => {\n callOrder.push('shutdown');\n });\n getUI().outro.mockImplementation(() => {\n callOrder.push('outro');\n });\n\n await expect(wizardAbort()).rejects.toThrow('process.exit called');\n\n expect(callOrder).toEqual(['cleanup1', 'cleanup2', 'shutdown', 'outro']);\n });\n\n it('does not block exit when a cleanup function throws', async () => {\n registerCleanup(() => {\n throw new Error('cleanup failed');\n });\n registerCleanup(() => {\n /* this should still run */\n });\n\n await expect(wizardAbort()).rejects.toThrow('process.exit called');\n\n expect(mockAnalytics.shutdown).toHaveBeenCalled();\n expect(getUI().outro).toHaveBeenCalled();\n expect(process.exit).toHaveBeenCalledWith(1);\n });\n\n it('shuts down analytics as \"cancelled\" when no error is provided', async () => {\n await expect(wizardAbort({ message: 'Bad input' })).rejects.toThrow(\n 'process.exit called',\n );\n\n expect(mockAnalytics.shutdown).toHaveBeenCalledWith('cancelled');\n });\n});\n\ndescribe('abort() delegates to wizardAbort()', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n clearCleanup();\n\n mockAnalytics.captureException = jest.fn();\n mockAnalytics.shutdown = jest.fn().mockResolvedValue(undefined);\n\n jest.spyOn(process, 'exit').mockImplementation(() => {\n throw new Error('process.exit called');\n });\n });\n\n afterEach(() => {\n jest.restoreAllMocks();\n });\n\n it('abort() calls wizardAbort with message and exitCode', async () => {\n const { abort } = await import('../utils/setup-utils.js');\n\n await expect(abort('Test abort', 3)).rejects.toThrow('process.exit called');\n\n expect(getUI().outro).toHaveBeenCalledWith('Test abort');\n expect(process.exit).toHaveBeenCalledWith(3);\n });\n\n it('abort() uses defaults when called with no args', async () => {\n const { abort } = await import('../utils/setup-utils.js');\n\n await expect(abort()).rejects.toThrow('process.exit called');\n\n expect(getUI().outro).toHaveBeenCalledWith('Wizard setup cancelled.');\n expect(process.exit).toHaveBeenCalledWith(1);\n });\n});\n"]}
@@ -1,4 +1,4 @@
1
- import type { FrameworkConfig } from '../lib/framework-config';
1
+ import type { FrameworkConfig } from '../../lib/framework-config';
2
2
  type AndroidContext = {
3
3
  kotlinVersion?: string;
4
4
  };
@@ -37,12 +37,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.ANDROID_AGENT_CONFIG = void 0;
40
- const constants_1 = require("../lib/constants");
40
+ const constants_1 = require("../../lib/constants");
41
41
  const fast_glob_1 = __importDefault(require("fast-glob"));
42
42
  const fs = __importStar(require("node:fs"));
43
43
  const path = __importStar(require("node:path"));
44
44
  const utils_1 = require("./utils");
45
- const package_manager_detection_1 = require("../lib/package-manager-detection");
45
+ const package_manager_detection_1 = require("../../lib/package-manager-detection");
46
46
  exports.ANDROID_AGENT_CONFIG = {
47
47
  metadata: {
48
48
  name: 'Android (Kotlin)',
@@ -0,0 +1 @@
1
+ {"version":3,"file":"android-wizard-agent.js","sourceRoot":"","sources":["../../../../src/frameworks/android/android-wizard-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/* Android (Kotlin) 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 fg from 'fast-glob';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport {\n getKotlinVersion,\n getKotlinVersionBucket,\n getMinSdkVersion,\n} from './utils';\nimport { gradlePackageManager } from '../../lib/package-manager-detection';\n\ntype AndroidContext = {\n kotlinVersion?: string;\n};\n\nexport const ANDROID_AGENT_CONFIG: FrameworkConfig<AndroidContext> = {\n metadata: {\n name: 'Android (Kotlin)',\n integration: Integration.android,\n beta: true,\n docsUrl: 'https://posthog.com/docs/libraries/android',\n gatherContext: (options: WizardOptions) => {\n const kotlinVersion = getKotlinVersion(options);\n return Promise.resolve({ kotlinVersion });\n },\n },\n\n detection: {\n packageName: 'posthog-android',\n packageDisplayName: 'Android (Kotlin)',\n usesPackageJson: false,\n getVersion: () => undefined,\n getVersionBucket: (version: string) => getKotlinVersionBucket(version),\n // This is actually pretty high for a minimum, but android apis aren't super stable.\n minimumVersion: '21.0.0',\n getInstalledVersion: (options: WizardOptions) => getMinSdkVersion(options),\n detectPackageManager: gradlePackageManager,\n detect: async (options) => {\n const { installDir } = options;\n\n // Strategy 1: Check for build.gradle(.kts) with Android plugin\n for (const name of ['build.gradle', 'build.gradle.kts']) {\n const buildGradlePath = path.join(installDir, name);\n if (fs.existsSync(buildGradlePath)) {\n const content = fs.readFileSync(buildGradlePath, 'utf-8');\n if (\n content.includes('com.android.application') ||\n content.includes('com.android.library') ||\n content.includes('com.android.tools.build:gradle')\n ) {\n return true;\n }\n }\n }\n\n // Strategy 2: Check for AndroidManifest.xml with Kotlin source files\n // This could be an issue if we have Flutter in the mix, but we'll figure that out later.\n const manifestFiles = await fg('**/AndroidManifest.xml', {\n cwd: installDir,\n ignore: ['**/build/**', '**/node_modules/**', '**/.gradle/**'],\n });\n\n if (manifestFiles.length > 0) {\n const kotlinFiles = await fg('**/*.kt', {\n cwd: installDir,\n ignore: ['**/build/**', '**/node_modules/**', '**/.gradle/**'],\n });\n if (kotlinFiles.length > 0) {\n return true;\n }\n }\n\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 ...(context.kotlinVersion\n ? { kotlinVersion: getKotlinVersionBucket(context.kotlinVersion) }\n : {}),\n }),\n },\n\n prompts: {\n projectTypeDetection:\n 'This is an Android/Kotlin project. Look for build.gradle or build.gradle.kts files, AndroidManifest.xml, and Kotlin source files (.kt) to confirm.',\n packageInstallation:\n 'Add the PostHog Android SDK dependency to the app-level build.gradle(.kts) file. Use implementation(\"com.posthog:posthog-android:<VERSION>\"). Check the existing dependency format (Groovy vs Kotlin DSL) and match it.',\n getAdditionalContextLines: (context) => {\n const lines = [\n `Framework docs ID: android (use posthog://docs/frameworks/android for documentation)`,\n ];\n\n if (context.kotlinVersion) {\n lines.push(`Kotlin version: ${context.kotlinVersion}`);\n }\n\n return lines;\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 5,\n getOutroChanges: () => [\n `Analyzed your Android project structure`,\n `Added the PostHog Android SDK dependency`,\n `Configured PostHog initialization in your Application class`,\n `Added event capture and user identification`,\n ],\n getOutroNextSteps: () => [\n 'Build and run your app to see PostHog in action',\n 'Visit your PostHog dashboard to see incoming events',\n 'Check out the PostHog Android docs for advanced features like feature flags and session replay',\n ],\n },\n};\n"]}
@@ -1,4 +1,4 @@
1
- import type { WizardOptions } from '../utils/types';
1
+ import type { WizardOptions } from '../../utils/types';
2
2
  /**
3
3
  * Extract minSdk from the app-level build.gradle(.kts).
4
4
  * Returns the value as a semver-like string (e.g. "24" from minSdk = 24).
@@ -39,7 +39,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.getKotlinVersionBucket = void 0;
40
40
  exports.getMinSdkVersion = getMinSdkVersion;
41
41
  exports.getKotlinVersion = getKotlinVersion;
42
- const semver_1 = require("../utils/semver");
42
+ const semver_1 = require("../../utils/semver");
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":"utils.js","sourceRoot":"","sources":["../../../../src/frameworks/android/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,4CAsBC;AAOD,4CAuBC;AA/DD,+CAAyD;AACzD,0DAA2B;AAC3B,4CAA8B;AAC9B,gDAAkC;AAElC,MAAM,eAAe,GAAG,CAAC,aAAa,EAAE,eAAe,EAAE,oBAAoB,CAAC,CAAC;AAE/E;;;GAGG;AACI,KAAK,UAAU,gBAAgB,CACpC,OAAsB;IAEtB,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAE/B,MAAM,UAAU,GAAG,MAAM,IAAA,mBAAE,EAAC,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,EAAE;QACtE,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,eAAe;KACxB,CAAC,CAAC;IAEH,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACtE,2DAA2D;YAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;YAC/D,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAEY,QAAA,sBAAsB,GAAG,IAAA,4BAAmB,GAAE,CAAC;AAE5D;;GAEG;AACH,SAAgB,gBAAgB,CAAC,OAAsB;IACrD,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI;QACjB,cAAc;QACd,kBAAkB;QAClB,2BAA2B;KAC5B,EAAE,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,SAAS;QAEvC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEnD,yEAAyE;QACzE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC5E,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QAE3B,wCAAwC;QACxC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACnE,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import type { WizardOptions } from '../../utils/types';\nimport { createVersionBucket } from '../../utils/semver';\nimport fg from 'fast-glob';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nconst IGNORE_PATTERNS = ['**/build/**', '**/.gradle/**', '**/node_modules/**'];\n\n/**\n * Extract minSdk from the app-level build.gradle(.kts).\n * Returns the value as a semver-like string (e.g. \"24\" from minSdk = 24).\n */\nexport async function getMinSdkVersion(\n options: WizardOptions,\n): Promise<string | undefined> {\n const { installDir } = options;\n\n const buildFiles = await fg(['**/build.gradle', '**/build.gradle.kts'], {\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n for (const file of buildFiles) {\n try {\n const content = fs.readFileSync(path.join(installDir, file), 'utf-8');\n // Match: minSdk = 24, minSdkVersion 21, minSdkVersion = 21\n const match = content.match(/minSdk(?:Version)?\\s*=?\\s*(\\d+)/);\n if (match) return match[1];\n } catch {\n continue;\n }\n }\n\n return undefined;\n}\n\nexport const getKotlinVersionBucket = createVersionBucket();\n\n/**\n * Read the root or app-level build.gradle(.kts) and extract the Kotlin version.\n */\nexport function getKotlinVersion(options: WizardOptions): string | undefined {\n const { installDir } = options;\n\n for (const name of [\n 'build.gradle',\n 'build.gradle.kts',\n 'gradle/libs.versions.toml',\n ]) {\n const filePath = path.join(installDir, name);\n if (!fs.existsSync(filePath)) continue;\n\n const content = fs.readFileSync(filePath, 'utf-8');\n\n // build.gradle: kotlinVersion = \"2.0.21\" or ext.kotlin_version = '1.9.0'\n const match = content.match(/kotlin[_-]?[Vv]ersion\\s*=\\s*[\"']([^\"']+)[\"']/);\n if (match) return match[1];\n\n // libs.versions.toml: kotlin = \"2.0.21\"\n const tomlMatch = content.match(/^kotlin\\s*=\\s*[\"']([^\"']+)[\"']/m);\n if (tomlMatch) return tomlMatch[1];\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 AngularContext = Record<string, unknown>;
3
3
  export declare const ANGULAR_AGENT_CONFIG: FrameworkConfig<AngularContext>;
4
4
  export {};
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ANGULAR_AGENT_CONFIG = void 0;
4
- const package_manager_detection_1 = require("../lib/package-manager-detection");
5
- const constants_1 = require("../lib/constants");
6
- const package_json_1 = require("../utils/package-json");
7
- const clack_utils_1 = require("../utils/clack-utils");
4
+ const package_manager_detection_1 = require("../../lib/package-manager-detection");
5
+ const constants_1 = require("../../lib/constants");
6
+ const package_json_1 = require("../../utils/package-json");
7
+ const setup_utils_1 = require("../../utils/setup-utils");
8
8
  const utils_1 = require("./utils");
9
9
  exports.ANGULAR_AGENT_CONFIG = {
10
10
  metadata: {
@@ -19,11 +19,13 @@ exports.ANGULAR_AGENT_CONFIG = {
19
19
  getVersionBucket: utils_1.getAngularVersionBucket,
20
20
  minimumVersion: '19.0.0',
21
21
  getInstalledVersion: async (options) => {
22
- const packageJson = await (0, clack_utils_1.getPackageDotJson)(options);
23
- return (0, package_json_1.getPackageVersion)('@angular/core', packageJson);
22
+ const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
23
+ return packageJson
24
+ ? (0, package_json_1.getPackageVersion)('@angular/core', packageJson)
25
+ : undefined;
24
26
  },
25
27
  detect: async (options) => {
26
- const packageJson = await (0, clack_utils_1.tryGetPackageJson)(options);
28
+ const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
27
29
  return packageJson
28
30
  ? (0, package_json_1.hasPackageInstalled)('@angular/core', packageJson)
29
31
  : false;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular-wizard-agent.js","sourceRoot":"","sources":["../../../../src/frameworks/angular/angular-wizard-agent.ts"],"names":[],"mappings":";;;AAGA,mFAAgF;AAChF,mDAAkD;AAClD,2DAIkC;AAClC,yDAA4D;AAC5D,mCAAkD;AAIrC,QAAA,oBAAoB,GAAoC;IACnE,QAAQ,EAAE;QACR,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,uBAAW,CAAC,OAAO;QAChC,OAAO,EAAE,4CAA4C;KACtD;IAED,SAAS,EAAE;QACT,WAAW,EAAE,eAAe;QAC5B,kBAAkB,EAAE,SAAS;QAC7B,UAAU,EAAE,CAAC,WAAoB,EAAE,EAAE,CACnC,IAAA,gCAAiB,EAAC,eAAe,EAAE,WAA6B,CAAC;QACnE,gBAAgB,EAAE,+BAAuB;QACzC,cAAc,EAAE,QAAQ;QACxB,mBAAmB,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE;YACpD,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;YACrD,OAAO,WAAW;gBAChB,CAAC,CAAC,IAAA,gCAAiB,EAAC,eAAe,EAAE,WAAW,CAAC;gBACjD,CAAC,CAAC,SAAS,CAAC;QAChB,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACxB,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;YACrD,OAAO,WAAW;gBAChB,CAAC,CAAC,IAAA,kCAAmB,EAAC,eAAe,EAAE,WAAW,CAAC;gBACnD,CAAC,CAAC,KAAK,CAAC;QACZ,CAAC;QACD,oBAAoB,EAAE,qDAAyB;KAChD;IAED,WAAW,EAAE;QACX,eAAe,EAAE,KAAK;QACtB,UAAU,EAAE,CAAC,MAAc,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC;YAC7C,kBAAkB,EAAE,MAAM;YAC1B,mBAAmB,EAAE,IAAI;SAC1B,CAAC;KACH;IAED,SAAS,EAAE;QACT,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;KACpB;IAED,OAAO,EAAE;QACP,oBAAoB,EAClB,2IAA2I;QAC7I,yBAAyB,EAAE,GAAG,EAAE;YAC9B,MAAM,WAAW,GAAG,SAAS,CAAC;YAE9B,OAAO;gBACL,sBAAsB,WAAW,mCAAmC,WAAW,qBAAqB;gBACpG,6FAA6F;gBAC7F,2FAA2F;aAC5F,CAAC;QACJ,CAAC;KACF;IAED,EAAE,EAAE;QACF,cAAc,EAAE,8BAA8B;QAC9C,wBAAwB,EAAE,CAAC;QAC3B,eAAe,EAAE,GAAG,EAAE,CAAC;YACrB,yCAAyC;YACzC,wCAAwC;YACxC,0CAA0C;SAC3C;QACD,iBAAiB,EAAE,GAAG,EAAE,CAAC;YACvB,wEAAwE;YACxE,qDAAqD;SACtD;KACF;CACF,CAAC","sourcesContent":["/* Angular wizard using posthog-agent with PostHog MCP */\nimport type { WizardOptions } from '../../utils/types';\nimport type { FrameworkConfig } from '../../lib/framework-config';\nimport { detectNodePackageManagers } from '../../lib/package-manager-detection';\nimport { Integration } from '../../lib/constants';\nimport {\n getPackageVersion,\n hasPackageInstalled,\n type PackageDotJson,\n} from '../../utils/package-json';\nimport { tryGetPackageJson } from '../../utils/setup-utils';\nimport { getAngularVersionBucket } from './utils';\n\ntype AngularContext = Record<string, unknown>;\n\nexport const ANGULAR_AGENT_CONFIG: FrameworkConfig<AngularContext> = {\n metadata: {\n name: 'Angular',\n integration: Integration.angular,\n docsUrl: 'https://posthog.com/docs/libraries/angular',\n },\n\n detection: {\n packageName: '@angular/core',\n packageDisplayName: 'Angular',\n getVersion: (packageJson: unknown) =>\n getPackageVersion('@angular/core', packageJson as PackageDotJson),\n getVersionBucket: getAngularVersionBucket,\n minimumVersion: '19.0.0',\n getInstalledVersion: async (options: WizardOptions) => {\n const packageJson = await tryGetPackageJson(options);\n return packageJson\n ? getPackageVersion('@angular/core', packageJson)\n : undefined;\n },\n detect: async (options) => {\n const packageJson = await tryGetPackageJson(options);\n return packageJson\n ? hasPackageInstalled('@angular/core', packageJson)\n : false;\n },\n detectPackageManager: detectNodePackageManagers,\n },\n\n environment: {\n uploadToHosting: false,\n getEnvVars: (apiKey: string, host: string) => ({\n NG_APP_POSTHOG_KEY: apiKey,\n NG_APP_POSTHOG_HOST: host,\n }),\n },\n\n analytics: {\n getTags: () => ({}),\n },\n\n prompts: {\n projectTypeDetection:\n 'This is an Angular project. Look for package.json, angular.json, and lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml) to confirm.',\n getAdditionalContextLines: () => {\n const frameworkId = 'angular';\n\n return [\n `Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,\n 'Angular uses dependency injection for services. PostHog should be initialized as a service.',\n 'For standalone components, ensure PostHog is properly provided in the application config.',\n ];\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 8,\n getOutroChanges: () => [\n `Analyzed your Angular project structure`,\n `Created and configured PostHog service`,\n `Integrated PostHog into your application`,\n ],\n getOutroNextSteps: () => [\n 'Start your development server with `ng serve` to see PostHog in action',\n 'Visit your PostHog dashboard to see incoming events',\n ],\n },\n};\n"]}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getAngularVersionBucket = void 0;
4
- const semver_1 = require("../utils/semver");
4
+ const semver_1 = require("../../utils/semver");
5
5
  /**
6
6
  * Get Angular version bucket for analytics
7
7
  */
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/frameworks/angular/utils.ts"],"names":[],"mappings":";;;AAAA,+CAAyD;AAEzD;;GAEG;AACU,QAAA,uBAAuB,GAAG,IAAA,4BAAmB,GAAE,CAAC","sourcesContent":["import { createVersionBucket } from '../../utils/semver';\n\n/**\n * Get Angular version bucket for analytics\n */\nexport const getAngularVersionBucket = createVersionBucket();\n"]}
@@ -1,4 +1,4 @@
1
- import type { FrameworkConfig } from '../lib/framework-config';
1
+ import type { FrameworkConfig } from '../../lib/framework-config';
2
2
  import { AstroRenderingMode } from './utils';
3
3
  type AstroContext = {
4
4
  renderingMode?: AstroRenderingMode;
@@ -1,10 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ASTRO_AGENT_CONFIG = void 0;
4
- const package_manager_detection_1 = require("../lib/package-manager-detection");
5
- const constants_1 = require("../lib/constants");
6
- const package_json_1 = require("../utils/package-json");
7
- const clack_utils_1 = require("../utils/clack-utils");
4
+ const package_manager_detection_1 = require("../../lib/package-manager-detection");
5
+ const constants_1 = require("../../lib/constants");
6
+ const package_json_1 = require("../../utils/package-json");
7
+ const setup_utils_1 = require("../../utils/setup-utils");
8
+ const ui_1 = require("../../ui");
8
9
  const utils_1 = require("./utils");
9
10
  exports.ASTRO_AGENT_CONFIG = {
10
11
  metadata: {
@@ -13,6 +14,7 @@ exports.ASTRO_AGENT_CONFIG = {
13
14
  docsUrl: 'https://posthog.com/docs/libraries/astro',
14
15
  gatherContext: async (options) => {
15
16
  const renderingMode = await (0, utils_1.getAstroRenderingMode)(options);
17
+ (0, ui_1.getUI)().setDetectedFramework(`Astro ${(0, utils_1.getAstroRenderingModeName)(renderingMode)}`);
16
18
  return { renderingMode };
17
19
  },
18
20
  },
@@ -23,11 +25,11 @@ exports.ASTRO_AGENT_CONFIG = {
23
25
  getVersionBucket: utils_1.getAstroVersionBucket,
24
26
  minimumVersion: '4.0.0',
25
27
  getInstalledVersion: async (options) => {
26
- const packageJson = await (0, clack_utils_1.getPackageDotJson)(options);
27
- return (0, package_json_1.getPackageVersion)('astro', packageJson);
28
+ const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
29
+ return packageJson ? (0, package_json_1.getPackageVersion)('astro', packageJson) : undefined;
28
30
  },
29
31
  detect: async (options) => {
30
- const packageJson = await (0, clack_utils_1.tryGetPackageJson)(options);
32
+ const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
31
33
  return packageJson ? (0, package_json_1.hasPackageInstalled)('astro', packageJson) : false;
32
34
  },
33
35
  detectPackageManager: package_manager_detection_1.detectNodePackageManagers,
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astro-wizard-agent.js","sourceRoot":"","sources":["../../../../src/frameworks/astro/astro-wizard-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/* Astro wizard using posthog-agent with PostHog MCP */\nimport type { WizardOptions } from '../../utils/types';\nimport type { FrameworkConfig } from '../../lib/framework-config';\nimport { detectNodePackageManagers } from '../../lib/package-manager-detection';\nimport { Integration } from '../../lib/constants';\nimport {\n getPackageVersion,\n hasPackageInstalled,\n type PackageDotJson,\n} from '../../utils/package-json';\nimport { tryGetPackageJson } from '../../utils/setup-utils';\nimport { getUI } from '../../ui';\nimport {\n getAstroRenderingMode,\n getAstroVersionBucket,\n getAstroRenderingModeName,\n AstroRenderingMode,\n} from './utils';\n\ntype AstroContext = {\n renderingMode?: AstroRenderingMode;\n};\n\nexport const ASTRO_AGENT_CONFIG: FrameworkConfig<AstroContext> = {\n metadata: {\n name: 'Astro',\n integration: Integration.astro,\n docsUrl: 'https://posthog.com/docs/libraries/astro',\n gatherContext: async (options: WizardOptions) => {\n const renderingMode = await getAstroRenderingMode(options);\n getUI().setDetectedFramework(\n `Astro ${getAstroRenderingModeName(renderingMode)}`,\n );\n return { renderingMode };\n },\n },\n\n detection: {\n packageName: 'astro',\n packageDisplayName: 'Astro',\n getVersion: (packageJson: unknown) =>\n getPackageVersion('astro', packageJson as PackageDotJson),\n getVersionBucket: getAstroVersionBucket,\n minimumVersion: '4.0.0',\n getInstalledVersion: async (options: WizardOptions) => {\n const packageJson = await tryGetPackageJson(options);\n return packageJson ? getPackageVersion('astro', packageJson) : undefined;\n },\n detect: async (options) => {\n const packageJson = await tryGetPackageJson(options);\n return packageJson ? hasPackageInstalled('astro', packageJson) : false;\n },\n detectPackageManager: detectNodePackageManagers,\n },\n\n environment: {\n uploadToHosting: true,\n getEnvVars: (apiKey: string, host: string) => ({\n PUBLIC_POSTHOG_KEY: apiKey,\n PUBLIC_POSTHOG_HOST: host,\n }),\n },\n\n analytics: {\n getTags: (context) => ({\n 'rendering-mode': context.renderingMode ?? 'static',\n }),\n },\n\n prompts: {\n projectTypeDetection:\n 'This is a JavaScript/TypeScript project. Look for package.json and lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb) to confirm.',\n getAdditionalContextLines: (context) => {\n const modeName = getAstroRenderingModeName(\n context.renderingMode ?? AstroRenderingMode.STATIC,\n );\n\n // Map rendering mode to framework ID for MCP docs resource\n const frameworkIdMap: Record<AstroRenderingMode, string> = {\n [AstroRenderingMode.STATIC]: 'astro-static',\n [AstroRenderingMode.VIEW_TRANSITIONS]: 'astro-view-transitions',\n [AstroRenderingMode.SSR]: 'astro-ssr',\n [AstroRenderingMode.HYBRID]: 'astro-hybrid',\n };\n\n const frameworkId =\n frameworkIdMap[context.renderingMode ?? AstroRenderingMode.STATIC];\n\n const lines = [\n `Rendering mode: ${modeName}`,\n `Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,\n ];\n\n // Add mode-specific guidance\n if (context.renderingMode === AstroRenderingMode.VIEW_TRANSITIONS) {\n lines.push(\n 'IMPORTANT: Use window.__posthog_initialized guard to prevent re-initialization during soft navigation',\n );\n lines.push(\n \"IMPORTANT: Set capture_pageview: 'history_change' for automatic pageview tracking\",\n );\n }\n\n if (\n context.renderingMode === AstroRenderingMode.SSR ||\n context.renderingMode === AstroRenderingMode.HYBRID\n ) {\n lines.push(\n 'IMPORTANT: Use posthog-node for server-side tracking in API routes',\n );\n lines.push(\n 'IMPORTANT: Create a singleton pattern for the posthog-node client',\n );\n }\n\n return lines;\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 6,\n getOutroChanges: (context) => {\n const modeName = getAstroRenderingModeName(\n context.renderingMode ?? AstroRenderingMode.STATIC,\n );\n const changes = [\n `Analyzed your Astro project structure (${modeName})`,\n `Created PostHog component with is:inline script`,\n `Integrated PostHog into your layout`,\n ];\n\n if (\n context.renderingMode === AstroRenderingMode.SSR ||\n context.renderingMode === AstroRenderingMode.HYBRID\n ) {\n changes.push(`Set up posthog-node for server-side tracking`);\n }\n\n if (context.renderingMode === AstroRenderingMode.VIEW_TRANSITIONS) {\n changes.push(\n `Added initialization guard for view transitions compatibility`,\n );\n }\n\n return changes;\n },\n getOutroNextSteps: () => {\n return [\n 'Start your development server to see PostHog in action',\n 'Visit your PostHog dashboard to see incoming events',\n ];\n },\n },\n};\n"]}
@@ -1,4 +1,4 @@
1
- import type { WizardOptions } from '../utils/types';
1
+ import type { WizardOptions } from '../../utils/types';
2
2
  export declare const getAstroVersionBucket: (version: string | undefined) => string;
3
3
  export declare enum AstroRenderingMode {
4
4
  STATIC = "static",
@@ -8,10 +8,7 @@ export declare enum AstroRenderingMode {
8
8
  }
9
9
  export declare const IGNORE_PATTERNS: string[];
10
10
  /**
11
- * Detect the Astro rendering mode by analyzing:
12
- * 1. astro.config.* for output mode
13
- * 2. Package.json for adapters
14
- * 3. Source files for view transitions usage
11
+ * Detect the Astro rendering mode. Pure — always resolves (Astro detection is reliable).
15
12
  */
16
13
  export declare function getAstroRenderingMode({ installDir, }: Pick<WizardOptions, 'installDir'>): Promise<AstroRenderingMode>;
17
14
  export declare const getAstroRenderingModeName: (mode: AstroRenderingMode) => string;
@@ -8,10 +8,7 @@ exports.getAstroRenderingMode = getAstroRenderingMode;
8
8
  const fast_glob_1 = __importDefault(require("fast-glob"));
9
9
  const promises_1 = __importDefault(require("fs/promises"));
10
10
  const path_1 = __importDefault(require("path"));
11
- const clack_utils_1 = require("../utils/clack-utils");
12
- const clack_1 = __importDefault(require("../utils/clack"));
13
- const constants_1 = require("../lib/constants");
14
- const semver_1 = require("../utils/semver");
11
+ const semver_1 = require("../../utils/semver");
15
12
  exports.getAstroVersionBucket = (0, semver_1.createVersionBucket)();
16
13
  var AstroRenderingMode;
17
14
  (function (AstroRenderingMode) {
@@ -26,13 +23,9 @@ exports.IGNORE_PATTERNS = [
26
23
  '**/.astro/**',
27
24
  ];
28
25
  /**
29
- * Detect the Astro rendering mode by analyzing:
30
- * 1. astro.config.* for output mode
31
- * 2. Package.json for adapters
32
- * 3. Source files for view transitions usage
26
+ * Detect the Astro rendering mode. Pure — always resolves (Astro detection is reliable).
33
27
  */
34
28
  async function getAstroRenderingMode({ installDir, }) {
35
- // Check for astro config file
36
29
  const configMatches = await (0, fast_glob_1.default)('astro.config.@(mjs|ts|js)', {
37
30
  dot: true,
38
31
  cwd: installDir,
@@ -41,7 +34,6 @@ async function getAstroRenderingMode({ installDir, }) {
41
34
  let hasAdapter = false;
42
35
  let outputMode = null;
43
36
  let usesViewTransitions = false;
44
- // Check package.json for adapters
45
37
  try {
46
38
  const packageJsonPath = path_1.default.join(installDir, 'package.json');
47
39
  const packageJsonContent = await promises_1.default.readFile(packageJsonPath, 'utf-8');
@@ -50,7 +42,6 @@ async function getAstroRenderingMode({ installDir, }) {
50
42
  ...packageJson.dependencies,
51
43
  ...packageJson.devDependencies,
52
44
  };
53
- // Check for Astro adapters (node, vercel, netlify, cloudflare, etc.)
54
45
  hasAdapter = Object.keys(allDeps).some((dep) => dep.startsWith('@astrojs/') &&
55
46
  (dep.includes('node') ||
56
47
  dep.includes('vercel') ||
@@ -61,12 +52,10 @@ async function getAstroRenderingMode({ installDir, }) {
61
52
  catch {
62
53
  // package.json not found or invalid
63
54
  }
64
- // Parse astro config for output mode
65
55
  if (configMatches.length > 0) {
66
56
  try {
67
57
  const configPath = path_1.default.join(installDir, configMatches[0]);
68
58
  const configContent = await promises_1.default.readFile(configPath, 'utf-8');
69
- // Simple regex to detect output mode
70
59
  const outputMatch = configContent.match(/output:\s*['"](\w+)['"]/);
71
60
  if (outputMatch) {
72
61
  outputMode = outputMatch[1];
@@ -76,14 +65,12 @@ async function getAstroRenderingMode({ installDir, }) {
76
65
  // Config file not readable
77
66
  }
78
67
  }
79
- // Check for view transitions usage
80
68
  const viewTransitionMatches = await (0, fast_glob_1.default)('**/*.@(astro|ts|tsx|js|jsx)', {
81
69
  dot: true,
82
70
  cwd: installDir,
83
71
  ignore: exports.IGNORE_PATTERNS,
84
72
  });
85
73
  for (const file of viewTransitionMatches.slice(0, 20)) {
86
- // Check first 20 files
87
74
  try {
88
75
  const filePath = path_1.default.join(installDir, file);
89
76
  const content = await promises_1.default.readFile(filePath, 'utf-8');
@@ -98,52 +85,16 @@ async function getAstroRenderingMode({ installDir, }) {
98
85
  // File not readable
99
86
  }
100
87
  }
101
- // Determine rendering mode based on findings
102
88
  if (usesViewTransitions) {
103
- clack_1.default.log.info(`Detected Astro with View Transitions (ClientRouter) 🔄`);
104
89
  return AstroRenderingMode.VIEW_TRANSITIONS;
105
90
  }
106
91
  if (outputMode === 'server' && hasAdapter) {
107
- clack_1.default.log.info(`Detected Astro SSR mode 🖥️`);
108
92
  return AstroRenderingMode.SSR;
109
93
  }
110
- // In Astro 5, 'static' is the default and supports per-page SSR opt-in when an adapter is present
111
- // This is the "hybrid" pattern even if output mode isn't explicitly set
112
94
  if (hasAdapter) {
113
- clack_1.default.log.info(`Detected Astro hybrid mode 🔀`);
114
95
  return AstroRenderingMode.HYBRID;
115
96
  }
116
- if (!hasAdapter) {
117
- clack_1.default.log.info(`Detected Astro static mode 📄`);
118
- return AstroRenderingMode.STATIC;
119
- }
120
- // If detection is ambiguous, ask the user
121
- const result = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
122
- message: 'What rendering mode is your Astro project using?',
123
- options: [
124
- {
125
- label: (0, exports.getAstroRenderingModeName)(AstroRenderingMode.STATIC),
126
- value: AstroRenderingMode.STATIC,
127
- hint: 'Pre-rendered static HTML (default)',
128
- },
129
- {
130
- label: (0, exports.getAstroRenderingModeName)(AstroRenderingMode.VIEW_TRANSITIONS),
131
- value: AstroRenderingMode.VIEW_TRANSITIONS,
132
- hint: 'Static with ClientRouter for SPA-like navigation',
133
- },
134
- {
135
- label: (0, exports.getAstroRenderingModeName)(AstroRenderingMode.HYBRID),
136
- value: AstroRenderingMode.HYBRID,
137
- hint: 'Mostly static with some SSR pages',
138
- },
139
- {
140
- label: (0, exports.getAstroRenderingModeName)(AstroRenderingMode.SSR),
141
- value: AstroRenderingMode.SSR,
142
- hint: 'Full server-side rendering',
143
- },
144
- ],
145
- }), constants_1.Integration.astro);
146
- return result;
97
+ return AstroRenderingMode.STATIC;
147
98
  }
148
99
  const getAstroRenderingModeName = (mode) => {
149
100
  switch (mode) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/frameworks/astro/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import fg from 'fast-glob';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport type { WizardOptions } from '../../utils/types';\nimport { createVersionBucket } from '../../utils/semver';\n\nexport const getAstroVersionBucket = createVersionBucket();\n\nexport enum AstroRenderingMode {\n STATIC = 'static',\n SSR = 'ssr',\n HYBRID = 'hybrid',\n VIEW_TRANSITIONS = 'view-transitions',\n}\n\nexport const IGNORE_PATTERNS = [\n '**/node_modules/**',\n '**/dist/**',\n '**/.astro/**',\n];\n\n/**\n * Detect the Astro rendering mode. Pure — always resolves (Astro detection is reliable).\n */\nexport async function getAstroRenderingMode({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<AstroRenderingMode> {\n const configMatches = await fg('astro.config.@(mjs|ts|js)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n let hasAdapter = false;\n let outputMode: string | null = null;\n let usesViewTransitions = false;\n\n try {\n const packageJsonPath = path.join(installDir, 'package.json');\n const packageJsonContent = await fs.readFile(packageJsonPath, 'utf-8');\n const packageJson = JSON.parse(packageJsonContent);\n const allDeps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n hasAdapter = Object.keys(allDeps).some(\n (dep) =>\n dep.startsWith('@astrojs/') &&\n (dep.includes('node') ||\n dep.includes('vercel') ||\n dep.includes('netlify') ||\n dep.includes('cloudflare') ||\n dep.includes('deno')),\n );\n } catch {\n // package.json not found or invalid\n }\n\n if (configMatches.length > 0) {\n try {\n const configPath = path.join(installDir, configMatches[0]);\n const configContent = await fs.readFile(configPath, 'utf-8');\n const outputMatch = configContent.match(/output:\\s*['\"](\\w+)['\"]/);\n if (outputMatch) {\n outputMode = outputMatch[1];\n }\n } catch {\n // Config file not readable\n }\n }\n\n const viewTransitionMatches = await fg('**/*.@(astro|ts|tsx|js|jsx)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n for (const file of viewTransitionMatches.slice(0, 20)) {\n try {\n const filePath = path.join(installDir, file);\n const content = await fs.readFile(filePath, 'utf-8');\n if (\n content.includes('ClientRouter') ||\n content.includes('ViewTransitions') ||\n content.includes('astro:transitions')\n ) {\n usesViewTransitions = true;\n break;\n }\n } catch {\n // File not readable\n }\n }\n\n if (usesViewTransitions) {\n return AstroRenderingMode.VIEW_TRANSITIONS;\n }\n\n if (outputMode === 'server' && hasAdapter) {\n return AstroRenderingMode.SSR;\n }\n\n if (hasAdapter) {\n return AstroRenderingMode.HYBRID;\n }\n\n return AstroRenderingMode.STATIC;\n}\n\nexport const getAstroRenderingModeName = (mode: AstroRenderingMode): string => {\n switch (mode) {\n case AstroRenderingMode.STATIC:\n return 'Static (SSG)';\n case AstroRenderingMode.VIEW_TRANSITIONS:\n return 'View Transitions';\n case AstroRenderingMode.SSR:\n return 'Server (SSR)';\n case AstroRenderingMode.HYBRID:\n return 'Hybrid';\n default:\n return 'Static';\n }\n};\n"]}
@@ -1,4 +1,4 @@
1
- import type { FrameworkConfig } from '../lib/framework-config';
1
+ import type { FrameworkConfig } from '../../lib/framework-config';
2
2
  import { DjangoProjectType } from './utils';
3
3
  type DjangoContext = {
4
4
  projectType?: DjangoProjectType;
@@ -37,9 +37,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.DJANGO_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":"django-wizard-agent.js","sourceRoot":"","sources":["../../../../src/frameworks/django/django-wizard-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/* Django 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 getDjangoVersion,\n getDjangoProjectType,\n getDjangoProjectTypeName,\n getDjangoVersionBucket,\n DjangoProjectType,\n findDjangoSettingsFile,\n} from './utils';\n\ntype DjangoContext = {\n projectType?: DjangoProjectType;\n settingsFile?: string;\n};\n\nexport const DJANGO_AGENT_CONFIG: FrameworkConfig<DjangoContext> = {\n metadata: {\n name: 'Django',\n integration: Integration.django,\n beta: true,\n docsUrl: 'https://posthog.com/docs/libraries/django',\n unsupportedVersionDocsUrl: 'https://posthog.com/docs/libraries/python',\n gatherContext: async (options: WizardOptions) => {\n const projectType = await getDjangoProjectType(options);\n const settingsFile = await findDjangoSettingsFile(options);\n return { projectType, settingsFile };\n },\n },\n\n detection: {\n packageName: 'django',\n packageDisplayName: 'Django',\n usesPackageJson: false,\n getVersion: () => undefined,\n getVersionBucket: getDjangoVersionBucket,\n minimumVersion: '3.0.0',\n getInstalledVersion: (options: WizardOptions) => getDjangoVersion(options),\n detect: async (options) => {\n const { installDir } = options;\n\n const managePyMatches = await fg('**/manage.py', {\n cwd: installDir,\n ignore: ['**/venv/**', '**/.venv/**', '**/env/**', '**/.env/**'],\n });\n\n if (managePyMatches.length > 0) {\n for (const match of managePyMatches) {\n try {\n const content = fs.readFileSync(\n path.join(installDir, match),\n 'utf-8',\n );\n // Check for actual Django imports and usage\n if (\n content.includes('from django') ||\n content.includes('import django') ||\n content.includes('DJANGO_SETTINGS_MODULE') ||\n /execute_from_command_line/.test(content)\n ) {\n return true;\n }\n } catch {\n continue;\n }\n }\n }\n\n const requirementsFiles = await fg(\n ['**/requirements*.txt', '**/pyproject.toml', '**/setup.py'],\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 // Match Django as a package requirement, not in comments or other text\n // Look for: django, django>=, django==, django~=, Django (capitalized)\n if (\n /^django([>=~!<\\s]|$)/im.test(content) ||\n /[\"']django[\"']/i.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/Django project. Look for requirements.txt, pyproject.toml, setup.py, Pipfile, or manage.py to confirm.',\n getAdditionalContextLines: (context) => {\n const projectTypeName = context.projectType\n ? getDjangoProjectTypeName(context.projectType)\n : 'unknown';\n\n // Map project type to framework ID for MCP docs resource\n const frameworkIdMap: Record<DjangoProjectType, string> = {\n [DjangoProjectType.STANDARD]: 'django',\n [DjangoProjectType.DRF]: 'django',\n [DjangoProjectType.WAGTAIL]: 'django',\n [DjangoProjectType.CHANNELS]: 'django',\n };\n\n const frameworkId = context.projectType\n ? frameworkIdMap[context.projectType]\n : 'django';\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.settingsFile) {\n lines.push(`Settings file: ${context.settingsFile}`);\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 ? getDjangoProjectTypeName(context.projectType)\n : 'Django';\n return [\n `Analyzed your ${projectTypeName} project structure`,\n `Installed the PostHog Python package`,\n `Configured PostHog in your Django settings`,\n `Added PostHog middleware for automatic event tracking`,\n ];\n },\n getOutroNextSteps: () => [\n 'Start your Django development server to see PostHog in action',\n 'Visit your PostHog dashboard to see incoming events',\n 'Use identify_context() within new_context() 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 DjangoProjectType {
3
3
  STANDARD = "standard",// Traditional Django project (django-admin startproject)
4
4
  DRF = "drf",// Django REST Framework API