@amplitude/wizard 1.0.0 → 1.2.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 (260) hide show
  1. package/LICENSE +25 -1
  2. package/dist/bin.js +47 -11
  3. package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.js +11 -1
  4. package/dist/src/frameworks/react-router/react-router-wizard-agent.js +65 -8
  5. package/dist/src/frameworks/vue/vue-wizard-agent.js +6 -1
  6. package/dist/src/lib/agent-interface.js +46 -0
  7. package/dist/src/lib/agent-runner.js +112 -51
  8. package/dist/src/lib/api.d.ts +35 -0
  9. package/dist/src/lib/api.js +118 -0
  10. package/dist/src/lib/commandments.js +1 -0
  11. package/dist/src/lib/constants.d.ts +1 -1
  12. package/dist/src/lib/constants.js +3 -3
  13. package/dist/src/lib/credential-resolution.js +7 -0
  14. package/dist/src/lib/framework-config.d.ts +9 -0
  15. package/dist/src/lib/mcp-with-fallback.d.ts +43 -0
  16. package/dist/src/lib/mcp-with-fallback.js +220 -0
  17. package/dist/src/lib/version-check.d.ts +17 -0
  18. package/dist/src/lib/version-check.js +72 -0
  19. package/dist/src/lib/wizard-session.d.ts +22 -7
  20. package/dist/src/lib/wizard-session.js +5 -3
  21. package/dist/src/run.d.ts +18 -1
  22. package/dist/src/run.js +104 -15
  23. package/dist/src/ui/agent-ui.d.ts +2 -0
  24. package/dist/src/ui/agent-ui.js +10 -0
  25. package/dist/src/ui/logging-ui.d.ts +2 -0
  26. package/dist/src/ui/logging-ui.js +6 -0
  27. package/dist/src/ui/tui/components/ConsoleView.js +14 -1
  28. package/dist/src/ui/tui/components/JourneyStepper.js +1 -3
  29. package/dist/src/ui/tui/flows.d.ts +0 -1
  30. package/dist/src/ui/tui/flows.js +1 -9
  31. package/dist/src/ui/tui/ink-ui.d.ts +2 -0
  32. package/dist/src/ui/tui/ink-ui.js +6 -0
  33. package/dist/src/ui/tui/screen-registry.js +0 -2
  34. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +5 -3
  35. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +124 -4
  36. package/dist/src/ui/tui/screens/OutroScreen.js +12 -3
  37. package/dist/src/ui/tui/store.d.ts +22 -3
  38. package/dist/src/ui/tui/store.js +52 -18
  39. package/dist/src/ui/tui/utils/diagnostics.js +1 -3
  40. package/dist/src/ui/wizard-ui.d.ts +8 -0
  41. package/dist/src/utils/analytics.d.ts +15 -0
  42. package/dist/src/utils/analytics.js +37 -0
  43. package/dist/src/utils/setup-utils.js +6 -1
  44. package/package.json +2 -2
  45. package/skills/integration/integration-android/SKILL.md +7 -10
  46. package/skills/integration/integration-android/references/amplitude-quickstart.md +1 -1
  47. package/skills/integration/integration-android/references/android.md +1468 -0
  48. package/skills/integration/integration-android/references/basic-integration-1.0-begin.md +3 -1
  49. package/skills/integration/integration-android/references/basic-integration-1.1-edit.md +183 -0
  50. package/skills/integration/integration-android/references/basic-integration-1.3-conclude.md +81 -11
  51. package/skills/integration/integration-angular/SKILL.md +6 -8
  52. package/skills/integration/integration-angular/references/amplitude-quickstart.md +1 -1
  53. package/skills/integration/integration-angular/references/basic-integration-1.0-begin.md +3 -1
  54. package/skills/integration/integration-angular/references/basic-integration-1.1-edit.md +183 -0
  55. package/skills/integration/integration-angular/references/basic-integration-1.3-conclude.md +81 -11
  56. package/skills/integration/integration-angular/references/browser-sdk-2.md +67 -20
  57. package/skills/integration/{integration-swift/references/analytics.md → integration-angular/references/browser-unified-sdk.md} +591 -157
  58. package/skills/integration/integration-astro-hybrid/SKILL.md +6 -13
  59. package/skills/integration/integration-astro-hybrid/references/amplitude-quickstart.md +1 -1
  60. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.0-begin.md +3 -1
  61. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.1-edit.md +183 -0
  62. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.3-conclude.md +81 -11
  63. package/skills/integration/integration-astro-hybrid/references/browser-sdk-2.md +67 -20
  64. package/skills/integration/{integration-android/references/analytics.md → integration-astro-hybrid/references/browser-unified-sdk.md} +591 -157
  65. package/skills/integration/integration-astro-ssr/SKILL.md +6 -11
  66. package/skills/integration/integration-astro-ssr/references/amplitude-quickstart.md +1 -1
  67. package/skills/integration/integration-astro-ssr/references/basic-integration-1.0-begin.md +3 -1
  68. package/skills/integration/integration-astro-ssr/references/basic-integration-1.1-edit.md +183 -0
  69. package/skills/integration/integration-astro-ssr/references/basic-integration-1.3-conclude.md +81 -11
  70. package/skills/integration/integration-astro-ssr/references/browser-sdk-2.md +67 -20
  71. package/skills/integration/{integration-javascript_node/references/analytics.md → integration-astro-ssr/references/browser-unified-sdk.md} +591 -157
  72. package/skills/integration/integration-astro-static/SKILL.md +6 -8
  73. package/skills/integration/integration-astro-static/references/amplitude-quickstart.md +1 -1
  74. package/skills/integration/integration-astro-static/references/basic-integration-1.0-begin.md +3 -1
  75. package/skills/integration/integration-astro-static/references/basic-integration-1.1-edit.md +183 -0
  76. package/skills/integration/integration-astro-static/references/basic-integration-1.3-conclude.md +81 -11
  77. package/skills/integration/integration-astro-static/references/browser-sdk-2.md +67 -20
  78. package/skills/integration/integration-astro-static/references/browser-unified-sdk.md +2212 -0
  79. package/skills/integration/integration-astro-view-transitions/SKILL.md +6 -10
  80. package/skills/integration/integration-astro-view-transitions/references/amplitude-quickstart.md +1 -1
  81. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.0-begin.md +3 -1
  82. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.1-edit.md +183 -0
  83. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.3-conclude.md +81 -11
  84. package/skills/integration/integration-astro-view-transitions/references/browser-sdk-2.md +67 -20
  85. package/skills/integration/integration-astro-view-transitions/references/browser-unified-sdk.md +2212 -0
  86. package/skills/integration/integration-django/SKILL.md +5 -16
  87. package/skills/integration/integration-django/references/amplitude-quickstart.md +1 -1
  88. package/skills/integration/integration-django/references/basic-integration-1.0-begin.md +3 -1
  89. package/skills/integration/integration-django/references/basic-integration-1.1-edit.md +183 -0
  90. package/skills/integration/integration-django/references/basic-integration-1.3-conclude.md +81 -11
  91. package/skills/integration/integration-django/references/python.md +1 -1
  92. package/skills/integration/integration-expo/SKILL.md +8 -13
  93. package/skills/integration/integration-expo/references/amplitude-quickstart.md +1 -1
  94. package/skills/integration/integration-expo/references/basic-integration-1.0-begin.md +3 -1
  95. package/skills/integration/integration-expo/references/basic-integration-1.1-edit.md +183 -0
  96. package/skills/integration/integration-expo/references/basic-integration-1.3-conclude.md +81 -11
  97. package/skills/integration/integration-expo/references/react-native-sdk.md +11 -10
  98. package/skills/integration/integration-fastapi/SKILL.md +5 -16
  99. package/skills/integration/integration-fastapi/references/amplitude-quickstart.md +1 -1
  100. package/skills/integration/integration-fastapi/references/basic-integration-1.0-begin.md +3 -1
  101. package/skills/integration/integration-fastapi/references/basic-integration-1.1-edit.md +183 -0
  102. package/skills/integration/integration-fastapi/references/basic-integration-1.3-conclude.md +81 -11
  103. package/skills/integration/integration-fastapi/references/python.md +1 -1
  104. package/skills/integration/integration-flask/SKILL.md +5 -15
  105. package/skills/integration/integration-flask/references/amplitude-quickstart.md +1 -1
  106. package/skills/integration/integration-flask/references/basic-integration-1.0-begin.md +3 -1
  107. package/skills/integration/integration-flask/references/basic-integration-1.1-edit.md +183 -0
  108. package/skills/integration/integration-flask/references/basic-integration-1.3-conclude.md +81 -11
  109. package/skills/integration/integration-flask/references/python.md +1 -1
  110. package/skills/integration/integration-javascript_node/SKILL.md +6 -12
  111. package/skills/integration/integration-javascript_node/references/amplitude-quickstart.md +1 -1
  112. package/skills/integration/integration-javascript_node/references/basic-integration-1.0-begin.md +3 -1
  113. package/skills/integration/integration-javascript_node/references/basic-integration-1.1-edit.md +183 -0
  114. package/skills/integration/integration-javascript_node/references/basic-integration-1.3-conclude.md +81 -11
  115. package/skills/integration/integration-javascript_node/references/node.md +1457 -0
  116. package/skills/integration/integration-javascript_web/SKILL.md +7 -16
  117. package/skills/integration/integration-javascript_web/references/amplitude-quickstart.md +1 -1
  118. package/skills/integration/integration-javascript_web/references/basic-integration-1.0-begin.md +3 -1
  119. package/skills/integration/integration-javascript_web/references/basic-integration-1.1-edit.md +183 -0
  120. package/skills/integration/integration-javascript_web/references/basic-integration-1.3-conclude.md +81 -11
  121. package/skills/integration/integration-javascript_web/references/browser-sdk-2.md +67 -20
  122. package/skills/integration/integration-javascript_web/references/browser-unified-sdk.md +2212 -0
  123. package/skills/integration/integration-laravel/SKILL.md +5 -11
  124. package/skills/integration/integration-laravel/references/amplitude-quickstart.md +1 -1
  125. package/skills/integration/integration-laravel/references/analytics.md +1 -1
  126. package/skills/integration/integration-laravel/references/basic-integration-1.0-begin.md +3 -1
  127. package/skills/integration/integration-laravel/references/basic-integration-1.1-edit.md +183 -0
  128. package/skills/integration/integration-laravel/references/basic-integration-1.3-conclude.md +81 -11
  129. package/skills/integration/integration-nextjs-app-router/SKILL.md +6 -13
  130. package/skills/integration/integration-nextjs-app-router/references/amplitude-quickstart.md +1 -1
  131. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.0-begin.md +3 -1
  132. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.1-edit.md +183 -0
  133. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.3-conclude.md +81 -11
  134. package/skills/integration/integration-nextjs-app-router/references/browser-sdk-2.md +67 -20
  135. package/skills/integration/integration-nextjs-app-router/references/browser-unified-sdk.md +2212 -0
  136. package/skills/integration/integration-nextjs-pages-router/SKILL.md +6 -13
  137. package/skills/integration/integration-nextjs-pages-router/references/amplitude-quickstart.md +1 -1
  138. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.0-begin.md +3 -1
  139. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.1-edit.md +183 -0
  140. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.3-conclude.md +81 -11
  141. package/skills/integration/integration-nextjs-pages-router/references/browser-sdk-2.md +67 -20
  142. package/skills/integration/integration-nextjs-pages-router/references/browser-unified-sdk.md +2212 -0
  143. package/skills/integration/integration-nuxt-3.6/SKILL.md +6 -5
  144. package/skills/integration/integration-nuxt-3.6/references/EXAMPLE.md +1 -1
  145. package/skills/integration/integration-nuxt-3.6/references/amplitude-quickstart.md +1 -1
  146. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.0-begin.md +3 -1
  147. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.1-edit.md +183 -0
  148. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.3-conclude.md +81 -11
  149. package/skills/integration/integration-nuxt-3.6/references/browser-sdk-2.md +67 -20
  150. package/skills/integration/integration-nuxt-3.6/references/browser-unified-sdk.md +2212 -0
  151. package/skills/integration/integration-nuxt-4/SKILL.md +6 -5
  152. package/skills/integration/integration-nuxt-4/references/amplitude-quickstart.md +1 -1
  153. package/skills/integration/integration-nuxt-4/references/basic-integration-1.0-begin.md +3 -1
  154. package/skills/integration/integration-nuxt-4/references/basic-integration-1.1-edit.md +183 -0
  155. package/skills/integration/integration-nuxt-4/references/basic-integration-1.3-conclude.md +81 -11
  156. package/skills/integration/integration-nuxt-4/references/browser-sdk-2.md +67 -20
  157. package/skills/integration/integration-nuxt-4/references/browser-unified-sdk.md +2212 -0
  158. package/skills/integration/integration-python/SKILL.md +8 -13
  159. package/skills/integration/integration-python/references/amplitude-quickstart.md +1 -1
  160. package/skills/integration/integration-python/references/basic-integration-1.0-begin.md +3 -1
  161. package/skills/integration/integration-python/references/basic-integration-1.1-edit.md +183 -0
  162. package/skills/integration/integration-python/references/basic-integration-1.3-conclude.md +81 -11
  163. package/skills/integration/integration-python/references/python.md +1 -1
  164. package/skills/integration/integration-react-native/SKILL.md +8 -9
  165. package/skills/integration/integration-react-native/references/amplitude-quickstart.md +1 -1
  166. package/skills/integration/integration-react-native/references/basic-integration-1.0-begin.md +3 -1
  167. package/skills/integration/integration-react-native/references/basic-integration-1.1-edit.md +183 -0
  168. package/skills/integration/integration-react-native/references/basic-integration-1.3-conclude.md +81 -11
  169. package/skills/integration/integration-react-native/references/react-native-sdk.md +11 -10
  170. package/skills/integration/integration-react-react-router-6/SKILL.md +6 -12
  171. package/skills/integration/integration-react-react-router-6/references/amplitude-quickstart.md +1 -1
  172. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.0-begin.md +3 -1
  173. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.1-edit.md +183 -0
  174. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.3-conclude.md +81 -11
  175. package/skills/integration/integration-react-react-router-6/references/browser-sdk-2.md +67 -20
  176. package/skills/integration/integration-react-react-router-6/references/browser-unified-sdk.md +2212 -0
  177. package/skills/integration/integration-react-react-router-7-data/SKILL.md +6 -12
  178. package/skills/integration/integration-react-react-router-7-data/references/amplitude-quickstart.md +1 -1
  179. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.0-begin.md +3 -1
  180. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.1-edit.md +183 -0
  181. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.3-conclude.md +81 -11
  182. package/skills/integration/integration-react-react-router-7-data/references/browser-sdk-2.md +67 -20
  183. package/skills/integration/integration-react-react-router-7-data/references/browser-unified-sdk.md +2212 -0
  184. package/skills/integration/integration-react-react-router-7-declarative/SKILL.md +6 -12
  185. package/skills/integration/integration-react-react-router-7-declarative/references/amplitude-quickstart.md +1 -1
  186. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.0-begin.md +3 -1
  187. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.1-edit.md +183 -0
  188. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.3-conclude.md +81 -11
  189. package/skills/integration/integration-react-react-router-7-declarative/references/browser-sdk-2.md +67 -20
  190. package/skills/integration/integration-react-react-router-7-declarative/references/browser-unified-sdk.md +2212 -0
  191. package/skills/integration/integration-react-react-router-7-framework/SKILL.md +6 -12
  192. package/skills/integration/integration-react-react-router-7-framework/references/amplitude-quickstart.md +1 -1
  193. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.0-begin.md +3 -1
  194. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.1-edit.md +183 -0
  195. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.3-conclude.md +81 -11
  196. package/skills/integration/integration-react-react-router-7-framework/references/browser-sdk-2.md +67 -20
  197. package/skills/integration/integration-react-react-router-7-framework/references/browser-unified-sdk.md +2212 -0
  198. package/skills/integration/integration-react-tanstack-router-code-based/SKILL.md +6 -14
  199. package/skills/integration/integration-react-tanstack-router-code-based/references/amplitude-quickstart.md +1 -1
  200. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.0-begin.md +3 -1
  201. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.1-edit.md +183 -0
  202. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.3-conclude.md +81 -11
  203. package/skills/integration/integration-react-tanstack-router-code-based/references/browser-sdk-2.md +67 -20
  204. package/skills/integration/integration-react-tanstack-router-code-based/references/browser-unified-sdk.md +2212 -0
  205. package/skills/integration/integration-react-tanstack-router-file-based/SKILL.md +6 -14
  206. package/skills/integration/integration-react-tanstack-router-file-based/references/amplitude-quickstart.md +1 -1
  207. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.0-begin.md +3 -1
  208. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.1-edit.md +183 -0
  209. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.3-conclude.md +81 -11
  210. package/skills/integration/integration-react-tanstack-router-file-based/references/browser-sdk-2.md +67 -20
  211. package/skills/integration/integration-react-tanstack-router-file-based/references/browser-unified-sdk.md +2212 -0
  212. package/skills/integration/integration-react-vite/SKILL.md +6 -12
  213. package/skills/integration/integration-react-vite/references/amplitude-quickstart.md +1 -1
  214. package/skills/integration/integration-react-vite/references/basic-integration-1.0-begin.md +3 -1
  215. package/skills/integration/integration-react-vite/references/basic-integration-1.1-edit.md +183 -0
  216. package/skills/integration/integration-react-vite/references/basic-integration-1.3-conclude.md +81 -11
  217. package/skills/integration/integration-react-vite/references/browser-sdk-2.md +67 -20
  218. package/skills/integration/integration-react-vite/references/browser-unified-sdk.md +2212 -0
  219. package/skills/integration/integration-ruby/SKILL.md +6 -10
  220. package/skills/integration/integration-ruby/references/amplitude-quickstart.md +1 -1
  221. package/skills/integration/integration-ruby/references/analytics.md +1 -1
  222. package/skills/integration/integration-ruby/references/basic-integration-1.0-begin.md +3 -1
  223. package/skills/integration/integration-ruby/references/basic-integration-1.1-edit.md +183 -0
  224. package/skills/integration/integration-ruby/references/basic-integration-1.3-conclude.md +81 -11
  225. package/skills/integration/integration-ruby-on-rails/SKILL.md +5 -14
  226. package/skills/integration/integration-ruby-on-rails/references/amplitude-quickstart.md +1 -1
  227. package/skills/integration/integration-ruby-on-rails/references/analytics.md +1 -1
  228. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.0-begin.md +3 -1
  229. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.1-edit.md +183 -0
  230. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.3-conclude.md +81 -11
  231. package/skills/integration/integration-sveltekit/SKILL.md +6 -6
  232. package/skills/integration/integration-sveltekit/references/amplitude-quickstart.md +1 -1
  233. package/skills/integration/integration-sveltekit/references/basic-integration-1.0-begin.md +3 -1
  234. package/skills/integration/integration-sveltekit/references/basic-integration-1.1-edit.md +183 -0
  235. package/skills/integration/integration-sveltekit/references/basic-integration-1.3-conclude.md +81 -11
  236. package/skills/integration/integration-sveltekit/references/browser-sdk-2.md +67 -20
  237. package/skills/integration/integration-sveltekit/references/browser-unified-sdk.md +2212 -0
  238. package/skills/integration/integration-swift/SKILL.md +9 -10
  239. package/skills/integration/integration-swift/references/amplitude-quickstart.md +1 -1
  240. package/skills/integration/integration-swift/references/basic-integration-1.0-begin.md +3 -1
  241. package/skills/integration/integration-swift/references/basic-integration-1.1-edit.md +183 -0
  242. package/skills/integration/integration-swift/references/basic-integration-1.3-conclude.md +81 -11
  243. package/skills/integration/integration-swift/references/ios.md +1480 -0
  244. package/skills/integration/integration-tanstack-start/SKILL.md +6 -17
  245. package/skills/integration/integration-tanstack-start/references/amplitude-quickstart.md +1 -1
  246. package/skills/integration/integration-tanstack-start/references/basic-integration-1.0-begin.md +3 -1
  247. package/skills/integration/integration-tanstack-start/references/basic-integration-1.1-edit.md +183 -0
  248. package/skills/integration/integration-tanstack-start/references/basic-integration-1.3-conclude.md +81 -11
  249. package/skills/integration/integration-tanstack-start/references/browser-sdk-2.md +67 -20
  250. package/skills/integration/integration-tanstack-start/references/browser-unified-sdk.md +2212 -0
  251. package/skills/integration/integration-vue-3/SKILL.md +6 -5
  252. package/skills/integration/integration-vue-3/references/amplitude-quickstart.md +1 -1
  253. package/skills/integration/integration-vue-3/references/basic-integration-1.0-begin.md +3 -1
  254. package/skills/integration/integration-vue-3/references/basic-integration-1.1-edit.md +183 -0
  255. package/skills/integration/integration-vue-3/references/basic-integration-1.3-conclude.md +81 -11
  256. package/skills/integration/integration-vue-3/references/browser-sdk-2.md +67 -20
  257. package/skills/integration/integration-vue-3/references/browser-unified-sdk.md +2212 -0
  258. package/skills/taxonomy/amplitude-chart-dashboard-plan/SKILL.md +183 -0
  259. package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +0 -12
  260. package/dist/src/ui/tui/screens/ChecklistScreen.js +0 -111
package/LICENSE CHANGED
@@ -1,6 +1,30 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 Amplitude
3
+ Copyright (c) 2026 Amplitude, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
23
+ --------------------------------------------------------------------------------
24
+
25
+ MIT License
26
+
27
+ Copyright (c) 2025 PostHog
4
28
 
5
29
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
30
  of this software and associated documentation files (the "Software"), to deal
package/dist/bin.js CHANGED
@@ -295,6 +295,7 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
295
295
  if (!options.installDir)
296
296
  options.installDir = process.cwd();
297
297
  const session = await buildSessionFromOptions(options);
298
+ session.agent = true;
298
299
  await resolveNonInteractiveCredentials(session, options, 'agent', agentUI);
299
300
  await lazyRunWizard(options, session);
300
301
  })();
@@ -354,16 +355,18 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
354
355
  const { resolveCredentials } = await import('./src/lib/credential-resolution.js');
355
356
  await resolveCredentials(session);
356
357
  // Resolve org/workspace display names so /whoami shows them.
358
+ // Also extracts the numeric analytics project ID for MCP event detection.
357
359
  // Fire-and-forget so it doesn't block startup.
358
360
  if (session.region && session.selectedOrgId) {
359
361
  const { getStoredUser, getStoredToken } = await import('./src/utils/ampli-settings.js');
360
- const { fetchAmplitudeUser } = await import('./src/lib/api.js');
362
+ const { fetchAmplitudeUser, extractProjectId } = await import('./src/lib/api.js');
361
363
  const storedUser = getStoredUser();
362
364
  const realUser = storedUser && storedUser.id !== 'pending' ? storedUser : null;
363
365
  const zone = session.region;
364
366
  const storedToken = realUser
365
367
  ? getStoredToken(realUser.id, realUser.zone)
366
368
  : getStoredToken(undefined, zone);
369
+ logToFile(`[bin] fire-and-forget: storedToken=${storedToken ? 'found' : 'null'}`);
367
370
  if (storedToken) {
368
371
  fetchAmplitudeUser(storedToken.idToken, zone)
369
372
  .then((userInfo) => {
@@ -372,16 +375,44 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
372
375
  session.userEmail = userInfo.email;
373
376
  changed = true;
374
377
  }
378
+ if (userInfo.email) {
379
+ analytics.setDistinctId(userInfo.email);
380
+ analytics.identifyUser({
381
+ email: userInfo.email,
382
+ org_id: session.selectedOrgId ?? undefined,
383
+ org_name: session.selectedOrgName ?? undefined,
384
+ workspace_id: session.selectedWorkspaceId ?? undefined,
385
+ workspace_name: session.selectedWorkspaceName ?? undefined,
386
+ project_id: session.selectedProjectId,
387
+ project_name: session.selectedProjectName,
388
+ region: session.region,
389
+ integration: session.integration,
390
+ });
391
+ }
375
392
  if (session.selectedOrgId) {
376
- const org = userInfo.orgs.find((o) => o.id === session.selectedOrgId);
393
+ // Fall back to the first org if the stored ID is stale
394
+ // (e.g. session checkpoint from a different account).
395
+ const org = userInfo.orgs.find((o) => o.id === session.selectedOrgId) ?? userInfo.orgs[0];
396
+ logToFile(`[bin] fire-and-forget: orgs=${userInfo.orgs
397
+ .map((o) => o.id)
398
+ .join(',')}, looking for ${session.selectedOrgId}, using=${org?.id ?? 'none'}`);
377
399
  if (org) {
378
400
  session.selectedOrgName = org.name;
379
401
  changed = true;
402
+ // Fall back to the first workspace if the stored ID is stale.
380
403
  const ws = session.selectedWorkspaceId
381
- ? org.workspaces.find((w) => w.id === session.selectedWorkspaceId)
382
- : undefined;
404
+ ? org.workspaces.find((w) => w.id === session.selectedWorkspaceId) ?? org.workspaces[0]
405
+ : org.workspaces[0];
383
406
  if (ws) {
384
407
  session.selectedWorkspaceName = ws.name;
408
+ // Extract the analytics project ID from the lowest-rank environment.
409
+ const projectId = extractProjectId(ws);
410
+ logToFile(`[bin] project ID resolution: environments=${ws.environments?.length ?? 'null'}, projectId=${projectId}`);
411
+ if (projectId)
412
+ session.selectedProjectId = projectId;
413
+ }
414
+ else {
415
+ logToFile(`[bin] project ID resolution: no workspaces in org ${org.id}`);
385
416
  }
386
417
  }
387
418
  }
@@ -389,8 +420,8 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
389
420
  tui.store.emitChange();
390
421
  }
391
422
  })
392
- .catch(() => {
393
- // Non-fatal /whoami will just show (none)
423
+ .catch((err) => {
424
+ logToFile(`[bin] fire-and-forget fetchAmplitudeUser failed: ${err instanceof Error ? err.message : String(err)}`);
394
425
  });
395
426
  }
396
427
  }
@@ -429,7 +460,7 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
429
460
  const { analytics } = await import('./src/utils/analytics.js');
430
461
  analytics.applyOptOut();
431
462
  const { FRAMEWORK_REGISTRY } = await import('./src/lib/registry.js');
432
- const { detectIntegration } = await import('./src/run.js');
463
+ const { detectAllFrameworks } = await import('./src/run.js');
433
464
  const installDir = session.installDir ?? process.cwd();
434
465
  // Verbose startup diagnostics — always written to the log file;
435
466
  // visible in the RunScreen "Logs" tab.
@@ -515,6 +546,8 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
515
546
  });
516
547
  // Populate user email for /whoami display
517
548
  session.userEmail = userInfo.email;
549
+ analytics.setDistinctId(userInfo.email);
550
+ analytics.identifyUser({ email: userInfo.email });
518
551
  // Signal AuthScreen — triggers org/workspace/API key pickers
519
552
  tui.store.setOAuthComplete({
520
553
  accessToken: auth.accessToken,
@@ -532,11 +565,13 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
532
565
  })();
533
566
  // ── Framework detection ────────────────────────────────
534
567
  // Runs concurrently with auth while AuthScreen shows.
568
+ // Each detector has its own per-framework timeout internally,
569
+ // so no outer timeout is needed.
535
570
  const detectionTask = (async () => {
536
- const detectedIntegration = await Promise.race([
537
- detectIntegration(installDir),
538
- new Promise((resolve) => setTimeout(() => resolve(undefined), DETECTION_TIMEOUT_MS)),
539
- ]);
571
+ const results = await detectAllFrameworks(installDir);
572
+ // Store full results on session for diagnostics
573
+ session.detectionResults = results;
574
+ const detectedIntegration = results.find((r) => r.detected)?.integration;
540
575
  if (detectedIntegration) {
541
576
  const config = FRAMEWORK_REGISTRY[detectedIntegration];
542
577
  // Run gatherContext for the friendly variant label
@@ -903,6 +938,7 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
903
938
  if (storedToken) {
904
939
  session.credentials = {
905
940
  accessToken: storedToken.accessToken,
941
+ idToken: storedToken.idToken,
906
942
  projectApiKey: '',
907
943
  host: getHostFromRegion(zone),
908
944
  projectId: 0,
@@ -2,8 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.JAVASCRIPT_NODE_AGENT_CONFIG = void 0;
4
4
  const constants_1 = require("../../lib/constants");
5
+ const package_json_1 = require("../../utils/package-json");
5
6
  const setup_utils_1 = require("../../utils/setup-utils");
6
7
  const package_manager_detection_1 = require("../../lib/package-manager-detection");
8
+ const utils_1 = require("../javascript-web/utils");
7
9
  exports.JAVASCRIPT_NODE_AGENT_CONFIG = {
8
10
  metadata: {
9
11
  name: 'Node.js',
@@ -19,7 +21,15 @@ exports.JAVASCRIPT_NODE_AGENT_CONFIG = {
19
21
  detectPackageManager: package_manager_detection_1.detectNodePackageManagers,
20
22
  detect: async (options) => {
21
23
  const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
22
- return !!packageJson;
24
+ if (!packageJson)
25
+ return false;
26
+ // Don't claim projects that belong to a specific framework
27
+ for (const frameworkPkg of utils_1.FRAMEWORK_PACKAGES) {
28
+ if ((0, package_json_1.hasPackageInstalled)(frameworkPkg, packageJson)) {
29
+ return false;
30
+ }
31
+ }
32
+ return true;
23
33
  },
24
34
  },
25
35
  environment: {
@@ -7,6 +7,36 @@ const package_json_1 = require("../../utils/package-json");
7
7
  const setup_utils_1 = require("../../utils/setup-utils");
8
8
  const ui_1 = require("../../ui");
9
9
  const utils_1 = require("./utils");
10
+ const REACT_ROUTER_MINIMUM_VERSION = '6.0.0';
11
+ const TANSTACK_MINIMUM_VERSION = '1.0.0';
12
+ // Priority matches gatherContext: TanStack Start > TanStack Router > react-router
13
+ function getReactRouterVersionCheckInfo(packageJson) {
14
+ const tanstackStartVersion = (0, package_json_1.getPackageVersion)('@tanstack/react-start', packageJson);
15
+ if (tanstackStartVersion) {
16
+ return {
17
+ version: tanstackStartVersion,
18
+ minimumVersion: TANSTACK_MINIMUM_VERSION,
19
+ packageDisplayName: 'TanStack Start',
20
+ };
21
+ }
22
+ const tanstackRouterVersion = (0, package_json_1.getPackageVersion)('@tanstack/react-router', packageJson);
23
+ if (tanstackRouterVersion) {
24
+ return {
25
+ version: tanstackRouterVersion,
26
+ minimumVersion: TANSTACK_MINIMUM_VERSION,
27
+ packageDisplayName: 'TanStack Router',
28
+ };
29
+ }
30
+ const reactRouterVersion = (0, package_json_1.getPackageVersion)('react-router', packageJson);
31
+ if (reactRouterVersion) {
32
+ return {
33
+ version: reactRouterVersion,
34
+ minimumVersion: REACT_ROUTER_MINIMUM_VERSION,
35
+ packageDisplayName: 'React Router',
36
+ };
37
+ }
38
+ return {};
39
+ }
10
40
  exports.REACT_ROUTER_AGENT_CONFIG = {
11
41
  metadata: {
12
42
  name: 'React Router',
@@ -14,6 +44,19 @@ exports.REACT_ROUTER_AGENT_CONFIG = {
14
44
  docsUrl: 'https://amplitude.com/docs/sdks/analytics/browser/browser-sdk-2',
15
45
  unsupportedVersionDocsUrl: 'https://amplitude.com/docs/sdks/analytics/browser/browser-sdk-2',
16
46
  gatherContext: async (options) => {
47
+ const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
48
+ // TanStack Start / TanStack Router share the same browser SDK setup
49
+ if (packageJson &&
50
+ (0, package_json_1.hasPackageInstalled)('@tanstack/react-start', packageJson)) {
51
+ (0, ui_1.getUI)().setDetectedFramework('TanStack Start');
52
+ return { routerMode: utils_1.ReactRouterMode.V7_FRAMEWORK };
53
+ }
54
+ if (packageJson &&
55
+ (0, package_json_1.hasPackageInstalled)('@tanstack/react-router', packageJson)) {
56
+ (0, ui_1.getUI)().setDetectedFramework('TanStack Router');
57
+ return {};
58
+ }
59
+ // Standard React Router detection
17
60
  const routerMode = await (0, utils_1.getReactRouterMode)(options);
18
61
  if (routerMode) {
19
62
  (0, ui_1.getUI)().setDetectedFramework(`React Router ${(0, utils_1.getReactRouterModeName)(routerMode)}`);
@@ -25,20 +68,34 @@ exports.REACT_ROUTER_AGENT_CONFIG = {
25
68
  detection: {
26
69
  packageName: 'react-router',
27
70
  packageDisplayName: 'React Router',
28
- getVersion: (packageJson) => (0, package_json_1.getPackageVersion)('react-router', packageJson),
71
+ getVersion: (packageJson) => {
72
+ const pkg = packageJson;
73
+ // Priority matches gatherContext: TanStack Start > TanStack Router > react-router
74
+ return ((0, package_json_1.getPackageVersion)('@tanstack/react-start', pkg) ??
75
+ (0, package_json_1.getPackageVersion)('@tanstack/react-router', pkg) ??
76
+ (0, package_json_1.getPackageVersion)('react-router', pkg));
77
+ },
29
78
  getVersionBucket: utils_1.getReactRouterVersionBucket,
30
- minimumVersion: '6.0.0',
79
+ minimumVersion: REACT_ROUTER_MINIMUM_VERSION,
31
80
  getInstalledVersion: async (options) => {
32
81
  const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
33
- return packageJson
34
- ? (0, package_json_1.getPackageVersion)('react-router', packageJson)
35
- : undefined;
82
+ if (!packageJson)
83
+ return undefined;
84
+ return getReactRouterVersionCheckInfo(packageJson).version;
85
+ },
86
+ getVersionCheckInfo: async (options) => {
87
+ const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
88
+ if (!packageJson)
89
+ return {};
90
+ return getReactRouterVersionCheckInfo(packageJson);
36
91
  },
37
92
  detect: async (options) => {
38
93
  const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
39
- return packageJson
40
- ? (0, package_json_1.hasPackageInstalled)('react-router', packageJson)
41
- : false;
94
+ if (!packageJson)
95
+ return false;
96
+ return ((0, package_json_1.hasPackageInstalled)('react-router', packageJson) ||
97
+ (0, package_json_1.hasPackageInstalled)('@tanstack/react-router', packageJson) ||
98
+ (0, package_json_1.hasPackageInstalled)('@tanstack/react-start', packageJson));
42
99
  },
43
100
  detectPackageManager: package_manager_detection_1.detectNodePackageManagers,
44
101
  },
@@ -25,7 +25,12 @@ exports.VUE_AGENT_CONFIG = {
25
25
  },
26
26
  detect: async (options) => {
27
27
  const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
28
- return packageJson ? (0, package_json_1.hasPackageInstalled)('vue', packageJson) : false;
28
+ if (!packageJson)
29
+ return false;
30
+ // Nuxt projects have both 'vue' and 'nuxt' — don't claim them
31
+ if ((0, package_json_1.hasPackageInstalled)('nuxt', packageJson))
32
+ return false;
33
+ return (0, package_json_1.hasPackageInstalled)('vue', packageJson);
29
34
  },
30
35
  detectPackageManager: package_manager_detection_1.detectNodePackageManagers,
31
36
  },
@@ -799,6 +799,9 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
799
799
  // Event plan file watcher — cleaned up in finally block
800
800
  let eventPlanWatcher;
801
801
  let eventPlanInterval;
802
+ // Dashboard file watcher — cleaned up in finally block
803
+ let dashboardWatcher;
804
+ let dashboardInterval;
802
805
  try {
803
806
  // Tools needed for the wizard:
804
807
  // - File operations: Read, Write, Edit
@@ -861,6 +864,46 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
861
864
  }
862
865
  }, 1000);
863
866
  }
867
+ // Watch for .amplitude-dashboard.json written by the agent after dashboard creation.
868
+ // Parses the dashboard URL and forwards it to the UI so ChecklistScreen can
869
+ // surface a direct link without requiring any further user action.
870
+ // workingDirectory is the CLI install dir (process.cwd() or --install-dir),
871
+ // not untrusted network input. The filename is a hardcoded constant.
872
+ const dashboardFilePath = path_1.default.join(agentConfig.workingDirectory, '.amplitude-dashboard.json'); // nosemgrep
873
+ const dashboardFileSchema = zod_1.z.object({
874
+ dashboardUrl: zod_1.z.string().url(),
875
+ });
876
+ const readDashboardFile = () => {
877
+ try {
878
+ const content = fs.readFileSync(dashboardFilePath, 'utf-8');
879
+ const result = dashboardFileSchema.safeParse(JSON.parse(content));
880
+ if (result.success) {
881
+ (0, ui_1.getUI)().setDashboardUrl(result.data.dashboardUrl);
882
+ }
883
+ }
884
+ catch {
885
+ // File doesn't exist or isn't valid JSON yet
886
+ }
887
+ };
888
+ try {
889
+ dashboardWatcher = fs.watch(dashboardFilePath, () => readDashboardFile());
890
+ readDashboardFile();
891
+ }
892
+ catch {
893
+ // File doesn't exist yet — poll until it appears
894
+ dashboardInterval = setInterval(() => {
895
+ try {
896
+ fs.accessSync(dashboardFilePath);
897
+ readDashboardFile();
898
+ clearInterval(dashboardInterval);
899
+ dashboardInterval = undefined;
900
+ dashboardWatcher = fs.watch(dashboardFilePath, () => readDashboardFile());
901
+ }
902
+ catch {
903
+ // Still waiting
904
+ }
905
+ }, 1000);
906
+ }
864
907
  // Retry loop: if the agent stalls (no message for the configured timeout), abort
865
908
  // and re-run with a fresh AbortController and prompt stream. Up to MAX_RETRIES.
866
909
  const MAX_RETRIES = 3;
@@ -1151,6 +1194,9 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
1151
1194
  eventPlanWatcher?.close();
1152
1195
  if (eventPlanInterval)
1153
1196
  clearInterval(eventPlanInterval);
1197
+ dashboardWatcher?.close();
1198
+ if (dashboardInterval)
1199
+ clearInterval(dashboardInterval);
1154
1200
  }
1155
1201
  }
1156
1202
  /**
@@ -1,37 +1,4 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  Object.defineProperty(exports, "__esModule", { value: true });
36
3
  exports.runAgentWizard = runAgentWizard;
37
4
  const framework_config_1 = require("./framework-config");
@@ -42,7 +9,7 @@ const ui_1 = require("../ui");
42
9
  const agent_interface_1 = require("./agent-interface");
43
10
  const urls_1 = require("../utils/urls");
44
11
  const constants_js_1 = require("./constants.js");
45
- const semver = __importStar(require("semver"));
12
+ const version_check_1 = require("./version-check");
46
13
  const debug_1 = require("../utils/debug");
47
14
  const benchmark_1 = require("./middleware/benchmark");
48
15
  const wizard_abort_1 = require("../utils/wizard-abort");
@@ -76,19 +43,23 @@ async function runAgentWizard(config, session) {
76
43
  (0, debug_1.enableDebugLogs)();
77
44
  }
78
45
  // Version check
79
- if (config.detection.minimumVersion && config.detection.getInstalledVersion) {
80
- const version = await config.detection.getInstalledVersion(sessionToOptions(session));
81
- (0, debug_1.logToFile)(`[runAgentWizard] detected version: ${version}`);
82
- if (version) {
83
- const coerced = semver.coerce(version);
84
- if (coerced && semver.lt(coerced, config.detection.minimumVersion)) {
85
- (0, debug_1.logToFile)(`[runAgentWizard] version ${version} is less than minimum required ${config.detection.minimumVersion}`);
86
- const docsUrl = config.metadata.unsupportedVersionDocsUrl ?? config.metadata.docsUrl;
87
- (0, debug_1.logToFile)(`[runAgentWizard] directing user to manual setup guide: ${docsUrl}`);
88
- (0, ui_1.getUI)().cancel(`The wizard requires ${config.metadata.name} ${config.detection.minimumVersion} or later, but found version ${version}. Upgrade your ${config.metadata.name} version to use the wizard, or follow the manual setup guide.`, { docsUrl });
89
- (0, debug_1.logToFile)('[runAgentWizard] cancel displayed to user');
90
- return;
91
- }
46
+ if (config.detection.getInstalledVersion ||
47
+ config.detection.getVersionCheckInfo) {
48
+ const versionCheckInfo = await (0, version_check_1.getVersionCheckInfo)(config.detection, sessionToOptions(session));
49
+ (0, debug_1.logToFile)(`[runAgentWizard] detected version: ${versionCheckInfo.version}`);
50
+ const versionWarning = (0, version_check_1.getVersionWarning)(versionCheckInfo, {
51
+ coerceVersion: true,
52
+ });
53
+ if (versionWarning) {
54
+ (0, debug_1.logToFile)(`[runAgentWizard] ${versionWarning}`);
55
+ const docsUrl = config.metadata.unsupportedVersionDocsUrl ?? config.metadata.docsUrl;
56
+ (0, debug_1.logToFile)(`[runAgentWizard] directing user to manual setup guide: ${docsUrl}`);
57
+ const minimumVersion = versionCheckInfo.minimumVersion ?? config.detection.minimumVersion;
58
+ const packageDisplayName = versionCheckInfo.packageDisplayName ?? config.metadata.name;
59
+ const version = versionCheckInfo.version ?? 'unknown';
60
+ (0, ui_1.getUI)().cancel(`The wizard requires ${packageDisplayName} ${minimumVersion} or later, but found version ${version}. Upgrade your ${packageDisplayName} version to use the wizard, or follow the manual setup guide.`, { docsUrl });
61
+ (0, debug_1.logToFile)('[runAgentWizard] cancel displayed to user');
62
+ return;
92
63
  }
93
64
  }
94
65
  // Setup phase — informational only, no prompts
@@ -112,12 +83,14 @@ async function runAgentWizard(config, session) {
112
83
  if (usesPackageJson) {
113
84
  packageJson = await (0, setup_utils_1.tryGetPackageJson)({ installDir: session.installDir });
114
85
  if (packageJson) {
115
- // Log warning if package not installed, but continue (agent handles it)
116
- const { hasPackageInstalled } = await import('../utils/package-json.js');
117
- if (!hasPackageInstalled(config.detection.packageName, packageJson)) {
86
+ frameworkVersion = config.detection.getVersion(packageJson);
87
+ // Log warning if package not found, but continue (agent handles it).
88
+ // Uses getVersion() rather than checking packageName directly so
89
+ // frameworks that match multiple packages (e.g. React Router +
90
+ // TanStack) don't trigger false "not installed" warnings.
91
+ if (!frameworkVersion) {
118
92
  (0, ui_1.getUI)().log.warn(`${config.detection.packageDisplayName} does not seem to be installed. Continuing anyway — the agent will handle it.`);
119
93
  }
120
- frameworkVersion = config.detection.getVersion(packageJson);
121
94
  }
122
95
  else {
123
96
  (0, ui_1.getUI)().log.warn('Could not find package.json. Continuing anyway — the agent will handle it.');
@@ -310,6 +283,11 @@ async function runAgentWizard(config, session) {
310
283
  });
311
284
  }
312
285
  // MCP installation is handled by McpScreen — no prompt here
286
+ // Data ingestion check — agent mode only (not CI).
287
+ // Poll via MCP until events arrive, then emit a structured result event.
288
+ if (session.agent) {
289
+ await pollForDataIngestion(session, accessToken, cloudRegion);
290
+ }
313
291
  // Build outro data and store it for OutroScreen
314
292
  const continueUrl = session.signup
315
293
  ? constants_js_1.OUTBOUND_URLS.products(cloudRegion)
@@ -332,6 +310,89 @@ async function runAgentWizard(config, session) {
332
310
  (0, ui_1.getUI)().outro(`Successfully installed Amplitude!`);
333
311
  await analytics_1.analytics.shutdown('success');
334
312
  }
313
+ /**
314
+ * Poll the Amplitude MCP server for event ingestion in agent mode.
315
+ *
316
+ * Emits structured NDJSON events via the AgentUI:
317
+ * - `status` events every poll cycle while waiting
318
+ * - `result` event when events are detected (includes event names)
319
+ * - `log` warning if the timeout is reached without detecting events
320
+ *
321
+ * Skipped silently if no project ID can be resolved (e.g. --api-key flow).
322
+ *
323
+ * @param session - wizard session (must have session.agent === true)
324
+ * @param accessToken - OAuth access token for MCP Bearer auth
325
+ * @param cloudRegion - us | eu, used to resolve project ID lazily if needed
326
+ */
327
+ async function pollForDataIngestion(session, accessToken, cloudRegion) {
328
+ const { fetchHasAnyEventsMcp, fetchAmplitudeUser } = await import('../lib/api.js');
329
+ const { logToFile } = await import('../utils/debug.js');
330
+ const POLL_INTERVAL_MS = 30_000;
331
+ // Allow override for testing; default 30 minutes.
332
+ const MAX_WAIT_MS = Number(process.env.DATA_INGESTION_TIMEOUT_MS) || 30 * 60 * 1000;
333
+ // Resolve the numeric analytics project ID.
334
+ // It is set by resolveEnvironmentSelection for the environment-picker path,
335
+ // and by the fire-and-forget in bin.ts for the TUI path.
336
+ // If still missing, try a single fetchAmplitudeUser call.
337
+ let projectId = session.selectedProjectId ?? null;
338
+ if (!projectId) {
339
+ try {
340
+ const userInfo = await fetchAmplitudeUser(accessToken, cloudRegion);
341
+ const org = session.selectedOrgId
342
+ ? userInfo.orgs.find((o) => o.id === session.selectedOrgId)
343
+ : userInfo.orgs[0];
344
+ const ws = org && session.selectedWorkspaceId
345
+ ? org.workspaces.find((w) => w.id === session.selectedWorkspaceId)
346
+ : org?.workspaces[0];
347
+ projectId =
348
+ ws?.environments
349
+ ?.slice()
350
+ .sort((a, b) => a.rank - b.rank)
351
+ .find((e) => e.app?.id)?.app?.id ?? null;
352
+ if (projectId)
353
+ session.selectedProjectId = projectId;
354
+ }
355
+ catch (err) {
356
+ logToFile(`[pollForDataIngestion] could not resolve projectId: ${err instanceof Error ? err.message : String(err)}`);
357
+ }
358
+ }
359
+ if (!projectId) {
360
+ logToFile('[pollForDataIngestion] no projectId — skipping ingestion check');
361
+ return;
362
+ }
363
+ const ui = (0, ui_1.getUI)();
364
+ ui.pushStatus('Waiting for events — run your app and trigger some actions');
365
+ const deadline = Date.now() + MAX_WAIT_MS;
366
+ let pollCount = 0;
367
+ while (Date.now() < deadline) {
368
+ pollCount++;
369
+ logToFile(`[pollForDataIngestion] poll #${pollCount} projectId=${projectId}`);
370
+ try {
371
+ const result = await fetchHasAnyEventsMcp(accessToken, projectId);
372
+ if (result.hasEvents) {
373
+ logToFile(`[pollForDataIngestion] events detected: ${result.activeEventNames.join(', ')}`);
374
+ // Emit a structured result event so callers can act on it.
375
+ ui.setEventIngestionDetected(result.activeEventNames);
376
+ ui.log.success(`Events detected: ${result.activeEventNames.length > 0
377
+ ? result.activeEventNames.join(', ')
378
+ : '(events flowing)'}`);
379
+ session.dataIngestionConfirmed = true;
380
+ return;
381
+ }
382
+ }
383
+ catch (err) {
384
+ logToFile(`[pollForDataIngestion] poll error: ${err instanceof Error ? err.message : String(err)}`);
385
+ }
386
+ // Wait before the next poll, but bail early if deadline passed.
387
+ const remaining = deadline - Date.now();
388
+ if (remaining <= 0)
389
+ break;
390
+ await new Promise((resolve) => setTimeout(resolve, Math.min(POLL_INTERVAL_MS, remaining)));
391
+ }
392
+ logToFile('[pollForDataIngestion] timeout reached without detecting events');
393
+ ui.log.warn('No events detected within the timeout window. ' +
394
+ 'Run your app to send events, then check your Amplitude dashboard.');
395
+ }
335
396
  /**
336
397
  * Build the integration prompt for the agent.
337
398
  */
@@ -16,6 +16,14 @@ export type AmplitudeOrg = {
16
16
  }> | null;
17
17
  }>;
18
18
  };
19
+ /** Shared workspace type for environment helpers. */
20
+ export type AmplitudeWorkspace = AmplitudeOrg['workspaces'][number];
21
+ /**
22
+ * Extract the primary analytics project ID from a workspace.
23
+ * Picks the lowest-rank environment that has an app ID.
24
+ * Returns null if no such environment exists.
25
+ */
26
+ export declare function extractProjectId(ws: AmplitudeWorkspace): string | null;
19
27
  export type AmplitudeUserInfo = {
20
28
  id: string;
21
29
  firstName: string;
@@ -72,6 +80,33 @@ export type AmplitudeSource = {
72
80
  };
73
81
  /** Fetches sources for a specific branch version. */
74
82
  export declare function fetchSources(idToken: string, zone: AmplitudeZone, orgId: string, workspaceId: string, branchId: string, versionId: string): Promise<AmplitudeSource[]>;
83
+ export interface McpUser {
84
+ /** Amplitude's internal ID (always present) */
85
+ amplitudeId: string;
86
+ /** App-assigned user ID if setUserId() was called, otherwise null */
87
+ userId: string | null;
88
+ }
89
+ export interface McpEventsResult {
90
+ hasEvents: boolean;
91
+ /** Kept for API compatibility — always empty (query_dataset was removed from MCP server) */
92
+ csvRows: unknown[][];
93
+ /** Active event names from get_events (isActive=true), up to 10 */
94
+ activeEventNames: string[];
95
+ /** Recent users who fired events, up to 5 */
96
+ activeUsers: McpUser[];
97
+ }
98
+ /**
99
+ * Checks whether the project has received any events via the Amplitude MCP server.
100
+ * Uses get_users with `_all` as the primary signal (userCount > 0 → events exist),
101
+ * then fetches get_events for display names.
102
+ *
103
+ * Falls back to a Claude agent with the Amplitude MCP configured if the direct
104
+ * HTTP call fails, so the check survives MCP API drift.
105
+ *
106
+ * Requires the numeric analytics project ID (from workspace.environments[].app.id),
107
+ * not the workspace UUID. Returns false on any error so callers can fall through.
108
+ */
109
+ export declare function fetchHasAnyEventsMcp(accessToken: string, projectId: string): Promise<McpEventsResult>;
75
110
  export type ProjectActivationStatus = {
76
111
  /** SDK/snippet has been installed (default event tracking source detected) */
77
112
  hasDetSource: boolean;