@amplitude/wizard 1.0.0-beta.1 → 1.0.0-beta.5

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 (397) hide show
  1. package/README.md +171 -74
  2. package/dist/bin.js +376 -150
  3. package/dist/src/lib/agent-interface.js +64 -9
  4. package/dist/src/lib/agent-runner.js +1 -10
  5. package/dist/src/lib/api.d.ts +22 -4
  6. package/dist/src/lib/api.js +114 -12
  7. package/dist/src/lib/commandments.js +14 -1
  8. package/dist/src/lib/constants.d.ts +5 -4
  9. package/dist/src/lib/constants.js +11 -9
  10. package/dist/src/lib/credential-resolution.d.ts +45 -0
  11. package/dist/src/lib/credential-resolution.js +311 -0
  12. package/dist/src/lib/exit-codes.d.ts +10 -0
  13. package/dist/src/lib/exit-codes.js +12 -0
  14. package/dist/src/lib/feature-flags.d.ts +37 -0
  15. package/dist/src/lib/feature-flags.js +119 -0
  16. package/dist/src/lib/health-checks/statuspage.d.ts +1 -0
  17. package/dist/src/lib/health-checks/statuspage.js +5 -1
  18. package/dist/src/lib/mode-config.d.ts +14 -0
  19. package/dist/src/lib/mode-config.js +14 -0
  20. package/dist/src/lib/session-checkpoint.d.ts +27 -0
  21. package/dist/src/lib/session-checkpoint.js +134 -0
  22. package/dist/src/lib/wizard-session.d.ts +54 -1
  23. package/dist/src/lib/wizard-session.js +71 -14
  24. package/dist/src/lib/wizard-tools.js +19 -4
  25. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +3 -0
  26. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +6 -0
  27. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +3 -1
  28. package/dist/src/ui/agent-ui.d.ts +91 -0
  29. package/dist/src/ui/agent-ui.js +277 -0
  30. package/dist/src/ui/logging-ui.js +1 -1
  31. package/dist/src/ui/tui/App.d.ts +12 -0
  32. package/dist/src/ui/tui/App.js +29 -18
  33. package/dist/src/ui/tui/components/AmplitudeLogo.js +16 -17
  34. package/dist/src/ui/tui/components/AmplitudeTextLogo.d.ts +0 -2
  35. package/dist/src/ui/tui/components/AmplitudeTextLogo.js +53 -18
  36. package/dist/src/ui/tui/components/BrailleSpinner.d.ts +8 -0
  37. package/dist/src/ui/tui/components/BrailleSpinner.js +15 -0
  38. package/dist/src/ui/tui/components/ConsoleView.d.ts +8 -11
  39. package/dist/src/ui/tui/components/ConsoleView.js +52 -38
  40. package/dist/src/ui/tui/components/HeaderBar.d.ts +12 -0
  41. package/dist/src/ui/tui/components/HeaderBar.js +17 -0
  42. package/dist/src/ui/tui/components/JourneyStepper.d.ts +16 -0
  43. package/dist/src/ui/tui/components/JourneyStepper.js +83 -0
  44. package/dist/src/ui/tui/components/KeyHintBar.d.ts +19 -0
  45. package/dist/src/ui/tui/components/KeyHintBar.js +20 -0
  46. package/dist/src/ui/tui/console-commands.d.ts +1 -4
  47. package/dist/src/ui/tui/console-commands.js +48 -13
  48. package/dist/src/ui/tui/flows.d.ts +1 -1
  49. package/dist/src/ui/tui/flows.js +1 -1
  50. package/dist/src/ui/tui/hooks/useAsyncEffect.d.ts +15 -0
  51. package/dist/src/ui/tui/hooks/useAsyncEffect.js +35 -0
  52. package/dist/src/ui/tui/hooks/useWizardStore.d.ts +9 -0
  53. package/dist/src/ui/tui/hooks/useWizardStore.js +11 -0
  54. package/dist/src/ui/tui/ink-ui.js +1 -1
  55. package/dist/src/ui/tui/primitives/DissolveTransition.js +4 -5
  56. package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +3 -1
  57. package/dist/src/ui/tui/primitives/EventPlanViewer.js +8 -3
  58. package/dist/src/ui/tui/primitives/ProgressList.js +1 -1
  59. package/dist/src/ui/tui/primitives/SlashCommandInput.js +19 -4
  60. package/dist/src/ui/tui/primitives/SplitView.d.ts +2 -1
  61. package/dist/src/ui/tui/primitives/SplitView.js +10 -2
  62. package/dist/src/ui/tui/primitives/TabContainer.js +10 -2
  63. package/dist/src/ui/tui/primitives/index.d.ts +0 -1
  64. package/dist/src/ui/tui/primitives/index.js +0 -1
  65. package/dist/src/ui/tui/router.js +1 -1
  66. package/dist/src/ui/tui/screen-registry.d.ts +0 -7
  67. package/dist/src/ui/tui/screen-registry.js +13 -4
  68. package/dist/src/ui/tui/screens/ActivationOptionsScreen.d.ts +2 -2
  69. package/dist/src/ui/tui/screens/ActivationOptionsScreen.js +8 -8
  70. package/dist/src/ui/tui/screens/AuthScreen.d.ts +2 -1
  71. package/dist/src/ui/tui/screens/AuthScreen.js +144 -32
  72. package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +2 -12
  73. package/dist/src/ui/tui/screens/ChecklistScreen.js +22 -33
  74. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +3 -12
  75. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +114 -33
  76. package/dist/src/ui/tui/screens/DataSetupScreen.d.ts +3 -3
  77. package/dist/src/ui/tui/screens/DataSetupScreen.js +17 -10
  78. package/dist/src/ui/tui/screens/IntroScreen.d.ts +5 -3
  79. package/dist/src/ui/tui/screens/IntroScreen.js +132 -41
  80. package/dist/src/ui/tui/screens/LoginScreen.d.ts +1 -1
  81. package/dist/src/ui/tui/screens/LoginScreen.js +4 -4
  82. package/dist/src/ui/tui/screens/LogoutScreen.d.ts +4 -2
  83. package/dist/src/ui/tui/screens/LogoutScreen.js +17 -5
  84. package/dist/src/ui/tui/screens/McpScreen.d.ts +4 -4
  85. package/dist/src/ui/tui/screens/McpScreen.js +25 -17
  86. package/dist/src/ui/tui/screens/OutageScreen.d.ts +1 -1
  87. package/dist/src/ui/tui/screens/OutageScreen.js +5 -5
  88. package/dist/src/ui/tui/screens/OutroScreen.d.ts +5 -0
  89. package/dist/src/ui/tui/screens/OutroScreen.js +21 -15
  90. package/dist/src/ui/tui/screens/RegionSelectScreen.js +15 -13
  91. package/dist/src/ui/tui/screens/RunScreen.d.ts +7 -5
  92. package/dist/src/ui/tui/screens/RunScreen.js +102 -157
  93. package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +1 -1
  94. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +6 -5
  95. package/dist/src/ui/tui/screens/SetupScreen.d.ts +1 -1
  96. package/dist/src/ui/tui/screens/SetupScreen.js +7 -7
  97. package/dist/src/ui/tui/screens/SlackScreen.d.ts +2 -7
  98. package/dist/src/ui/tui/screens/SlackScreen.js +60 -45
  99. package/dist/src/ui/tui/session-constants.d.ts +41 -0
  100. package/dist/src/ui/tui/session-constants.js +38 -0
  101. package/dist/src/ui/tui/start-tui.d.ts +3 -1
  102. package/dist/src/ui/tui/start-tui.js +14 -10
  103. package/dist/src/ui/tui/store.d.ts +5 -1
  104. package/dist/src/ui/tui/store.js +45 -6
  105. package/dist/src/ui/tui/styles.d.ts +75 -19
  106. package/dist/src/ui/tui/styles.js +101 -19
  107. package/dist/src/ui/tui/utils/classify-error.d.ts +14 -0
  108. package/dist/src/ui/tui/utils/classify-error.js +90 -0
  109. package/dist/src/ui/tui/utils/diagnostics.d.ts +21 -0
  110. package/dist/src/ui/tui/utils/diagnostics.js +72 -0
  111. package/dist/src/ui/tui/utils/with-retry.d.ts +12 -0
  112. package/dist/src/ui/tui/utils/with-retry.js +32 -0
  113. package/dist/src/ui/tui/utils/with-timeout.d.ts +10 -0
  114. package/dist/src/ui/tui/utils/with-timeout.js +24 -0
  115. package/dist/src/utils/ampli-settings.d.ts +1 -1
  116. package/dist/src/utils/ampli-settings.js +15 -5
  117. package/dist/src/utils/analytics.d.ts +18 -0
  118. package/dist/src/utils/analytics.js +35 -3
  119. package/dist/src/utils/api-key-store.js +5 -5
  120. package/dist/src/utils/atomic-write.d.ts +15 -0
  121. package/dist/src/utils/atomic-write.js +34 -0
  122. package/dist/src/utils/setup-utils.js +2 -2
  123. package/dist/src/utils/token-refresh.d.ts +22 -0
  124. package/dist/src/utils/token-refresh.js +79 -0
  125. package/dist/src/utils/wizard-abort.js +6 -1
  126. package/package.json +16 -17
  127. package/skills/instrumentation/add-analytics-instrumentation/SKILL.md +142 -0
  128. package/skills/instrumentation/diff-intake/SKILL.md +128 -0
  129. package/skills/instrumentation/discover-analytics-patterns/SKILL.md +185 -0
  130. package/skills/instrumentation/discover-event-surfaces/SKILL.md +322 -0
  131. package/skills/instrumentation/discover-event-surfaces/references/best-practices.md +563 -0
  132. package/skills/instrumentation/instrument-events/SKILL.md +169 -0
  133. package/skills/instrumentation/instrument-events/references/best-practices.md +563 -0
  134. package/skills/integration/integration-android/SKILL.md +49 -0
  135. package/skills/integration/integration-android/references/EXAMPLE.md +1977 -0
  136. package/skills/integration/integration-android/references/amplitude-quickstart.md +1845 -0
  137. package/skills/integration/integration-android/references/analytics.md +1778 -0
  138. package/skills/integration/integration-android/references/basic-integration-1.0-begin.md +43 -0
  139. package/skills/integration/integration-android/references/basic-integration-1.1-edit.md +35 -0
  140. package/skills/integration/integration-android/references/basic-integration-1.2-revise.md +23 -0
  141. package/skills/integration/integration-android/references/basic-integration-1.3-conclude.md +57 -0
  142. package/skills/integration/integration-angular/SKILL.md +49 -0
  143. package/skills/integration/integration-angular/references/EXAMPLE.md +899 -0
  144. package/skills/integration/integration-angular/references/amplitude-quickstart.md +1845 -0
  145. package/skills/integration/integration-angular/references/basic-integration-1.0-begin.md +43 -0
  146. package/skills/integration/integration-angular/references/basic-integration-1.1-edit.md +35 -0
  147. package/skills/integration/integration-angular/references/basic-integration-1.2-revise.md +23 -0
  148. package/skills/integration/integration-angular/references/basic-integration-1.3-conclude.md +57 -0
  149. package/skills/integration/integration-angular/references/browser-sdk-2.md +4680 -0
  150. package/skills/integration/integration-astro-hybrid/SKILL.md +56 -0
  151. package/skills/integration/integration-astro-hybrid/references/EXAMPLE.md +1095 -0
  152. package/skills/integration/integration-astro-hybrid/references/amplitude-quickstart.md +1845 -0
  153. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.0-begin.md +43 -0
  154. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.1-edit.md +35 -0
  155. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.2-revise.md +23 -0
  156. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.3-conclude.md +57 -0
  157. package/skills/integration/integration-astro-hybrid/references/browser-sdk-2.md +4680 -0
  158. package/skills/integration/integration-astro-ssr/SKILL.md +52 -0
  159. package/skills/integration/integration-astro-ssr/references/EXAMPLE.md +1106 -0
  160. package/skills/integration/integration-astro-ssr/references/amplitude-quickstart.md +1845 -0
  161. package/skills/integration/integration-astro-ssr/references/basic-integration-1.0-begin.md +43 -0
  162. package/skills/integration/integration-astro-ssr/references/basic-integration-1.1-edit.md +35 -0
  163. package/skills/integration/integration-astro-ssr/references/basic-integration-1.2-revise.md +23 -0
  164. package/skills/integration/integration-astro-ssr/references/basic-integration-1.3-conclude.md +57 -0
  165. package/skills/integration/integration-astro-ssr/references/browser-sdk-2.md +4680 -0
  166. package/skills/integration/integration-astro-static/SKILL.md +49 -0
  167. package/skills/integration/integration-astro-static/references/EXAMPLE.md +910 -0
  168. package/skills/integration/integration-astro-static/references/amplitude-quickstart.md +1845 -0
  169. package/skills/integration/integration-astro-static/references/basic-integration-1.0-begin.md +43 -0
  170. package/skills/integration/integration-astro-static/references/basic-integration-1.1-edit.md +35 -0
  171. package/skills/integration/integration-astro-static/references/basic-integration-1.2-revise.md +23 -0
  172. package/skills/integration/integration-astro-static/references/basic-integration-1.3-conclude.md +57 -0
  173. package/skills/integration/integration-astro-static/references/browser-sdk-2.md +4680 -0
  174. package/skills/integration/integration-astro-view-transitions/SKILL.md +51 -0
  175. package/skills/integration/integration-astro-view-transitions/references/EXAMPLE.md +979 -0
  176. package/skills/integration/integration-astro-view-transitions/references/amplitude-quickstart.md +1845 -0
  177. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.0-begin.md +43 -0
  178. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.1-edit.md +35 -0
  179. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.2-revise.md +23 -0
  180. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.3-conclude.md +57 -0
  181. package/skills/integration/integration-astro-view-transitions/references/browser-sdk-2.md +4680 -0
  182. package/skills/integration/integration-django/SKILL.md +57 -0
  183. package/skills/integration/integration-django/references/EXAMPLE.md +1005 -0
  184. package/skills/integration/integration-django/references/amplitude-quickstart.md +1845 -0
  185. package/skills/integration/integration-django/references/basic-integration-1.0-begin.md +43 -0
  186. package/skills/integration/integration-django/references/basic-integration-1.1-edit.md +35 -0
  187. package/skills/integration/integration-django/references/basic-integration-1.2-revise.md +23 -0
  188. package/skills/integration/integration-django/references/basic-integration-1.3-conclude.md +57 -0
  189. package/skills/integration/integration-django/references/python.md +1424 -0
  190. package/skills/integration/integration-expo/SKILL.md +53 -0
  191. package/skills/integration/integration-expo/references/EXAMPLE.md +1291 -0
  192. package/skills/integration/integration-expo/references/amplitude-quickstart.md +1845 -0
  193. package/skills/integration/integration-expo/references/basic-integration-1.0-begin.md +43 -0
  194. package/skills/integration/integration-expo/references/basic-integration-1.1-edit.md +35 -0
  195. package/skills/integration/integration-expo/references/basic-integration-1.2-revise.md +23 -0
  196. package/skills/integration/integration-expo/references/basic-integration-1.3-conclude.md +57 -0
  197. package/skills/integration/integration-expo/references/react-native-sdk.md +2819 -0
  198. package/skills/integration/integration-fastapi/SKILL.md +57 -0
  199. package/skills/integration/integration-fastapi/references/EXAMPLE.md +1389 -0
  200. package/skills/integration/integration-fastapi/references/amplitude-quickstart.md +1845 -0
  201. package/skills/integration/integration-fastapi/references/basic-integration-1.0-begin.md +43 -0
  202. package/skills/integration/integration-fastapi/references/basic-integration-1.1-edit.md +35 -0
  203. package/skills/integration/integration-fastapi/references/basic-integration-1.2-revise.md +23 -0
  204. package/skills/integration/integration-fastapi/references/basic-integration-1.3-conclude.md +57 -0
  205. package/skills/integration/integration-fastapi/references/python.md +1424 -0
  206. package/skills/integration/integration-flask/SKILL.md +56 -0
  207. package/skills/integration/integration-flask/references/EXAMPLE.md +1130 -0
  208. package/skills/integration/integration-flask/references/amplitude-quickstart.md +1845 -0
  209. package/skills/integration/integration-flask/references/basic-integration-1.0-begin.md +43 -0
  210. package/skills/integration/integration-flask/references/basic-integration-1.1-edit.md +35 -0
  211. package/skills/integration/integration-flask/references/basic-integration-1.2-revise.md +23 -0
  212. package/skills/integration/integration-flask/references/basic-integration-1.3-conclude.md +57 -0
  213. package/skills/integration/integration-flask/references/python.md +1424 -0
  214. package/skills/integration/integration-javascript_node/SKILL.md +54 -0
  215. package/skills/integration/integration-javascript_node/references/EXAMPLE.md +365 -0
  216. package/skills/integration/integration-javascript_node/references/amplitude-quickstart.md +1845 -0
  217. package/skills/integration/integration-javascript_node/references/analytics.md +1778 -0
  218. package/skills/integration/integration-javascript_node/references/basic-integration-1.0-begin.md +43 -0
  219. package/skills/integration/integration-javascript_node/references/basic-integration-1.1-edit.md +35 -0
  220. package/skills/integration/integration-javascript_node/references/basic-integration-1.2-revise.md +23 -0
  221. package/skills/integration/integration-javascript_node/references/basic-integration-1.3-conclude.md +57 -0
  222. package/skills/integration/integration-javascript_web/SKILL.md +58 -0
  223. package/skills/integration/integration-javascript_web/references/EXAMPLE.md +451 -0
  224. package/skills/integration/integration-javascript_web/references/amplitude-quickstart.md +1845 -0
  225. package/skills/integration/integration-javascript_web/references/basic-integration-1.0-begin.md +43 -0
  226. package/skills/integration/integration-javascript_web/references/basic-integration-1.1-edit.md +35 -0
  227. package/skills/integration/integration-javascript_web/references/basic-integration-1.2-revise.md +23 -0
  228. package/skills/integration/integration-javascript_web/references/basic-integration-1.3-conclude.md +57 -0
  229. package/skills/integration/integration-javascript_web/references/browser-sdk-2.md +4680 -0
  230. package/skills/integration/integration-laravel/SKILL.md +52 -0
  231. package/skills/integration/integration-laravel/references/EXAMPLE.md +2039 -0
  232. package/skills/integration/integration-laravel/references/amplitude-quickstart.md +1845 -0
  233. package/skills/integration/integration-laravel/references/analytics.md +1778 -0
  234. package/skills/integration/integration-laravel/references/basic-integration-1.0-begin.md +43 -0
  235. package/skills/integration/integration-laravel/references/basic-integration-1.1-edit.md +35 -0
  236. package/skills/integration/integration-laravel/references/basic-integration-1.2-revise.md +23 -0
  237. package/skills/integration/integration-laravel/references/basic-integration-1.3-conclude.md +57 -0
  238. package/skills/integration/integration-nextjs-app-router/SKILL.md +54 -0
  239. package/skills/integration/integration-nextjs-app-router/references/EXAMPLE.md +673 -0
  240. package/skills/integration/integration-nextjs-app-router/references/amplitude-quickstart.md +1845 -0
  241. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.0-begin.md +43 -0
  242. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.1-edit.md +35 -0
  243. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.2-revise.md +23 -0
  244. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.3-conclude.md +57 -0
  245. package/skills/integration/integration-nextjs-app-router/references/browser-sdk-2.md +4680 -0
  246. package/skills/integration/integration-nextjs-pages-router/SKILL.md +54 -0
  247. package/skills/integration/integration-nextjs-pages-router/references/EXAMPLE.md +735 -0
  248. package/skills/integration/integration-nextjs-pages-router/references/amplitude-quickstart.md +1845 -0
  249. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.0-begin.md +43 -0
  250. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.1-edit.md +35 -0
  251. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.2-revise.md +23 -0
  252. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.3-conclude.md +57 -0
  253. package/skills/integration/integration-nextjs-pages-router/references/browser-sdk-2.md +4680 -0
  254. package/skills/integration/integration-nuxt-3.6/SKILL.md +46 -0
  255. package/skills/integration/integration-nuxt-3.6/references/EXAMPLE.md +8422 -0
  256. package/skills/integration/integration-nuxt-3.6/references/amplitude-quickstart.md +1845 -0
  257. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.0-begin.md +43 -0
  258. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.1-edit.md +35 -0
  259. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.2-revise.md +23 -0
  260. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.3-conclude.md +57 -0
  261. package/skills/integration/integration-nuxt-3.6/references/browser-sdk-2.md +4680 -0
  262. package/skills/integration/integration-nuxt-4/SKILL.md +46 -0
  263. package/skills/integration/integration-nuxt-4/references/EXAMPLE.md +8670 -0
  264. package/skills/integration/integration-nuxt-4/references/amplitude-quickstart.md +1845 -0
  265. package/skills/integration/integration-nuxt-4/references/basic-integration-1.0-begin.md +43 -0
  266. package/skills/integration/integration-nuxt-4/references/basic-integration-1.1-edit.md +35 -0
  267. package/skills/integration/integration-nuxt-4/references/basic-integration-1.2-revise.md +23 -0
  268. package/skills/integration/integration-nuxt-4/references/basic-integration-1.3-conclude.md +57 -0
  269. package/skills/integration/integration-nuxt-4/references/browser-sdk-2.md +4680 -0
  270. package/skills/integration/integration-python/SKILL.md +53 -0
  271. package/skills/integration/integration-python/references/EXAMPLE.md +445 -0
  272. package/skills/integration/integration-python/references/amplitude-quickstart.md +1845 -0
  273. package/skills/integration/integration-python/references/basic-integration-1.0-begin.md +43 -0
  274. package/skills/integration/integration-python/references/basic-integration-1.1-edit.md +35 -0
  275. package/skills/integration/integration-python/references/basic-integration-1.2-revise.md +23 -0
  276. package/skills/integration/integration-python/references/basic-integration-1.3-conclude.md +57 -0
  277. package/skills/integration/integration-python/references/python.md +1424 -0
  278. package/skills/integration/integration-react-native/SKILL.md +49 -0
  279. package/skills/integration/integration-react-native/references/EXAMPLE.md +2253 -0
  280. package/skills/integration/integration-react-native/references/amplitude-quickstart.md +1845 -0
  281. package/skills/integration/integration-react-native/references/basic-integration-1.0-begin.md +43 -0
  282. package/skills/integration/integration-react-native/references/basic-integration-1.1-edit.md +35 -0
  283. package/skills/integration/integration-react-native/references/basic-integration-1.2-revise.md +23 -0
  284. package/skills/integration/integration-react-native/references/basic-integration-1.3-conclude.md +57 -0
  285. package/skills/integration/integration-react-native/references/react-native-sdk.md +2819 -0
  286. package/skills/integration/integration-react-react-router-6/SKILL.md +53 -0
  287. package/skills/integration/integration-react-react-router-6/references/EXAMPLE.md +570 -0
  288. package/skills/integration/integration-react-react-router-6/references/amplitude-quickstart.md +1845 -0
  289. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.0-begin.md +43 -0
  290. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.1-edit.md +35 -0
  291. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.2-revise.md +23 -0
  292. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.3-conclude.md +57 -0
  293. package/skills/integration/integration-react-react-router-6/references/browser-sdk-2.md +4680 -0
  294. package/skills/integration/integration-react-react-router-7-data/SKILL.md +53 -0
  295. package/skills/integration/integration-react-react-router-7-data/references/EXAMPLE.md +830 -0
  296. package/skills/integration/integration-react-react-router-7-data/references/amplitude-quickstart.md +1845 -0
  297. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.0-begin.md +43 -0
  298. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.1-edit.md +35 -0
  299. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.2-revise.md +23 -0
  300. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.3-conclude.md +57 -0
  301. package/skills/integration/integration-react-react-router-7-data/references/browser-sdk-2.md +4680 -0
  302. package/skills/integration/integration-react-react-router-7-declarative/SKILL.md +53 -0
  303. package/skills/integration/integration-react-react-router-7-declarative/references/EXAMPLE.md +609 -0
  304. package/skills/integration/integration-react-react-router-7-declarative/references/amplitude-quickstart.md +1845 -0
  305. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.0-begin.md +43 -0
  306. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.1-edit.md +35 -0
  307. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.2-revise.md +23 -0
  308. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.3-conclude.md +57 -0
  309. package/skills/integration/integration-react-react-router-7-declarative/references/browser-sdk-2.md +4680 -0
  310. package/skills/integration/integration-react-react-router-7-framework/SKILL.md +53 -0
  311. package/skills/integration/integration-react-react-router-7-framework/references/EXAMPLE.md +1081 -0
  312. package/skills/integration/integration-react-react-router-7-framework/references/amplitude-quickstart.md +1845 -0
  313. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.0-begin.md +43 -0
  314. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.1-edit.md +35 -0
  315. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.2-revise.md +23 -0
  316. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.3-conclude.md +57 -0
  317. package/skills/integration/integration-react-react-router-7-framework/references/browser-sdk-2.md +4680 -0
  318. package/skills/integration/integration-react-tanstack-router-code-based/SKILL.md +57 -0
  319. package/skills/integration/integration-react-tanstack-router-code-based/references/EXAMPLE.md +659 -0
  320. package/skills/integration/integration-react-tanstack-router-code-based/references/amplitude-quickstart.md +1845 -0
  321. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.0-begin.md +43 -0
  322. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.1-edit.md +35 -0
  323. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.2-revise.md +23 -0
  324. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.3-conclude.md +57 -0
  325. package/skills/integration/integration-react-tanstack-router-code-based/references/browser-sdk-2.md +4680 -0
  326. package/skills/integration/integration-react-tanstack-router-file-based/SKILL.md +57 -0
  327. package/skills/integration/integration-react-tanstack-router-file-based/references/EXAMPLE.md +777 -0
  328. package/skills/integration/integration-react-tanstack-router-file-based/references/amplitude-quickstart.md +1845 -0
  329. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.0-begin.md +43 -0
  330. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.1-edit.md +35 -0
  331. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.2-revise.md +23 -0
  332. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.3-conclude.md +57 -0
  333. package/skills/integration/integration-react-tanstack-router-file-based/references/browser-sdk-2.md +4680 -0
  334. package/skills/integration/integration-react-vite/SKILL.md +53 -0
  335. package/skills/integration/integration-react-vite/references/EXAMPLE.md +542 -0
  336. package/skills/integration/integration-react-vite/references/amplitude-quickstart.md +1845 -0
  337. package/skills/integration/integration-react-vite/references/basic-integration-1.0-begin.md +43 -0
  338. package/skills/integration/integration-react-vite/references/basic-integration-1.1-edit.md +35 -0
  339. package/skills/integration/integration-react-vite/references/basic-integration-1.2-revise.md +23 -0
  340. package/skills/integration/integration-react-vite/references/basic-integration-1.3-conclude.md +57 -0
  341. package/skills/integration/integration-react-vite/references/browser-sdk-2.md +4680 -0
  342. package/skills/integration/integration-ruby/SKILL.md +50 -0
  343. package/skills/integration/integration-ruby/references/EXAMPLE.md +420 -0
  344. package/skills/integration/integration-ruby/references/amplitude-quickstart.md +1845 -0
  345. package/skills/integration/integration-ruby/references/analytics.md +1778 -0
  346. package/skills/integration/integration-ruby/references/basic-integration-1.0-begin.md +43 -0
  347. package/skills/integration/integration-ruby/references/basic-integration-1.1-edit.md +35 -0
  348. package/skills/integration/integration-ruby/references/basic-integration-1.2-revise.md +23 -0
  349. package/skills/integration/integration-ruby/references/basic-integration-1.3-conclude.md +57 -0
  350. package/skills/integration/integration-ruby-on-rails/SKILL.md +55 -0
  351. package/skills/integration/integration-ruby-on-rails/references/EXAMPLE.md +1013 -0
  352. package/skills/integration/integration-ruby-on-rails/references/amplitude-quickstart.md +1845 -0
  353. package/skills/integration/integration-ruby-on-rails/references/analytics.md +1778 -0
  354. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.0-begin.md +43 -0
  355. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.1-edit.md +35 -0
  356. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.2-revise.md +23 -0
  357. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.3-conclude.md +57 -0
  358. package/skills/integration/integration-sveltekit/SKILL.md +47 -0
  359. package/skills/integration/integration-sveltekit/references/EXAMPLE.md +14121 -0
  360. package/skills/integration/integration-sveltekit/references/amplitude-quickstart.md +1845 -0
  361. package/skills/integration/integration-sveltekit/references/basic-integration-1.0-begin.md +43 -0
  362. package/skills/integration/integration-sveltekit/references/basic-integration-1.1-edit.md +35 -0
  363. package/skills/integration/integration-sveltekit/references/basic-integration-1.2-revise.md +23 -0
  364. package/skills/integration/integration-sveltekit/references/basic-integration-1.3-conclude.md +57 -0
  365. package/skills/integration/integration-sveltekit/references/browser-sdk-2.md +4680 -0
  366. package/skills/integration/integration-swift/SKILL.md +49 -0
  367. package/skills/integration/integration-swift/references/EXAMPLE.md +660 -0
  368. package/skills/integration/integration-swift/references/amplitude-quickstart.md +1845 -0
  369. package/skills/integration/integration-swift/references/analytics.md +1778 -0
  370. package/skills/integration/integration-swift/references/basic-integration-1.0-begin.md +43 -0
  371. package/skills/integration/integration-swift/references/basic-integration-1.1-edit.md +35 -0
  372. package/skills/integration/integration-swift/references/basic-integration-1.2-revise.md +23 -0
  373. package/skills/integration/integration-swift/references/basic-integration-1.3-conclude.md +57 -0
  374. package/skills/integration/integration-tanstack-start/SKILL.md +58 -0
  375. package/skills/integration/integration-tanstack-start/references/EXAMPLE.md +998 -0
  376. package/skills/integration/integration-tanstack-start/references/amplitude-quickstart.md +1845 -0
  377. package/skills/integration/integration-tanstack-start/references/basic-integration-1.0-begin.md +43 -0
  378. package/skills/integration/integration-tanstack-start/references/basic-integration-1.1-edit.md +35 -0
  379. package/skills/integration/integration-tanstack-start/references/basic-integration-1.2-revise.md +23 -0
  380. package/skills/integration/integration-tanstack-start/references/basic-integration-1.3-conclude.md +57 -0
  381. package/skills/integration/integration-tanstack-start/references/browser-sdk-2.md +4680 -0
  382. package/skills/integration/integration-vue-3/SKILL.md +46 -0
  383. package/skills/integration/integration-vue-3/references/EXAMPLE.md +846 -0
  384. package/skills/integration/integration-vue-3/references/amplitude-quickstart.md +1845 -0
  385. package/skills/integration/integration-vue-3/references/basic-integration-1.0-begin.md +43 -0
  386. package/skills/integration/integration-vue-3/references/basic-integration-1.1-edit.md +35 -0
  387. package/skills/integration/integration-vue-3/references/basic-integration-1.2-revise.md +23 -0
  388. package/skills/integration/integration-vue-3/references/basic-integration-1.3-conclude.md +57 -0
  389. package/skills/integration/integration-vue-3/references/browser-sdk-2.md +4680 -0
  390. package/skills/taxonomy/amplitude-quickstart-taxonomy-agent/SKILL.md +228 -0
  391. package/dist/package.json +0 -145
  392. package/dist/src/ui/tui/components/TitleBar.d.ts +0 -6
  393. package/dist/src/ui/tui/components/TitleBar.js +0 -16
  394. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.d.ts +0 -7
  395. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.js +0 -101
  396. package/dist/src/utils/anthropic-status.d.ts +0 -17
  397. package/dist/src/utils/anthropic-status.js +0 -51
@@ -1,6 +1,6 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  /**
3
- * SlackScreen — Amplitude Slack integration setup.
3
+ * SlackScreen — Amplitude Slack integration setup (v2).
4
4
  *
5
5
  * Guides the user to connect their Slack workspace to Amplitude.
6
6
  * Since the OAuth handshake happens in the browser (Amplitude Settings),
@@ -10,12 +10,12 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
10
  * Region-aware: EU users need the "Amplitude - EU" Slack app.
11
11
  */
12
12
  import { Box, Text } from 'ink';
13
- import { useState, useEffect } from 'react';
14
- import { useSyncExternalStore } from 'react';
13
+ import { useState, useEffect, useRef } from 'react';
15
14
  import { SlackOutcome } from '../store.js';
15
+ import { useWizardStore } from '../hooks/useWizardStore.js';
16
16
  import { ConfirmationInput } from '../primitives/index.js';
17
- import { Colors } from '../styles.js';
18
- import { fetchAmplitudeUser } from '../../../lib/api.js';
17
+ import { Colors, Icons } from '../styles.js';
18
+ import { fetchSlackInstallUrl, fetchSlackConnectionStatus, } from '../../../lib/api.js';
19
19
  import { OUTBOUND_URLS } from '../../../lib/constants.js';
20
20
  import { logToFile } from '../../../utils/debug.js';
21
21
  import opn from 'opn';
@@ -26,16 +26,6 @@ var Phase;
26
26
  Phase["Waiting"] = "waiting";
27
27
  Phase["Done"] = "done";
28
28
  })(Phase || (Phase = {}));
29
- /**
30
- * Build the Amplitude settings URL for Slack connection.
31
- * Uses the org name from the API; falls back to base URL.
32
- */
33
- export function slackSettingsUrl(baseUrl, orgName) {
34
- if (orgName) {
35
- return `${baseUrl}/analytics/${encodeURIComponent(orgName)}/settings/profile`;
36
- }
37
- return `${baseUrl}/settings/profile`;
38
- }
39
29
  const markDone = (store, outcome, standalone, onComplete) => {
40
30
  if (onComplete) {
41
31
  onComplete();
@@ -48,50 +38,75 @@ const markDone = (store, outcome, standalone, onComplete) => {
48
38
  }
49
39
  };
50
40
  export const SlackScreen = ({ store, standalone = false, onComplete, }) => {
51
- useSyncExternalStore((cb) => store.subscribe(cb), () => store.getSnapshot());
41
+ useWizardStore(store);
52
42
  const [phase, setPhase] = useState(Phase.Prompt);
53
- const [resolvedOrgName, setResolvedOrgName] = useState(store.session.selectedOrgName);
43
+ const timerRef = useRef(null);
44
+ // Clear any pending timer on unmount
45
+ useEffect(() => {
46
+ return () => {
47
+ if (timerRef.current !== null)
48
+ clearTimeout(timerRef.current);
49
+ };
50
+ }, []);
54
51
  const region = store.session.region ?? 'us';
55
52
  const isEu = region === 'eu';
56
53
  const appName = isEu ? 'Amplitude - EU' : 'Amplitude';
57
- // Fetch org name from the API if it wasn't populated during the SUSI flow
58
- // (e.g. returning users, or the standalone `slack` command).
54
+ // Check if Slack is already connected on mount auto-complete if so.
59
55
  useEffect(() => {
60
- logToFile(`[SlackScreen] selectedOrgName=${store.session.selectedOrgName ?? ''} credentials=${store.session.credentials ? 'present' : 'null'} region=${region}`);
61
- if (resolvedOrgName) {
62
- logToFile(`[SlackScreen] using existing orgName=${resolvedOrgName}`);
63
- return;
64
- }
56
+ let cancelled = false;
65
57
  const credentials = store.session.credentials;
66
- if (!credentials) {
67
- logToFile(`[SlackScreen] no credentials falling back to base URL`);
68
- return;
58
+ const orgId = store.session.selectedOrgId;
59
+ logToFile(`[SlackScreen] selectedOrgName=${store.session.selectedOrgName ?? ''} credentials=${credentials ? 'present' : 'null'} region=${region}`);
60
+ // Thunder uses access_token (Hydra-validated), not id_token.
61
+ const accessToken = credentials?.accessToken;
62
+ if (accessToken && orgId) {
63
+ void fetchSlackConnectionStatus(accessToken, region, orgId).then((isConnected) => {
64
+ if (cancelled)
65
+ return;
66
+ logToFile(`[SlackScreen] slackConnectionStatus=${isConnected}`);
67
+ if (isConnected) {
68
+ setPhase(Phase.Done);
69
+ timerRef.current = setTimeout(() => {
70
+ if (!cancelled) {
71
+ markDone(store, SlackOutcome.Configured, standalone, onComplete);
72
+ }
73
+ }, 1500);
74
+ }
75
+ });
69
76
  }
70
- logToFile(`[SlackScreen] fetching org name via API`);
71
- void fetchAmplitudeUser(credentials.idToken ?? credentials.accessToken, region)
72
- .then((info) => {
73
- const name = info.orgs[0]?.name ?? null;
74
- logToFile(`[SlackScreen] API returned orgs=${JSON.stringify(info.orgs.map((o) => o.name))} using=${name}`);
75
- setResolvedOrgName(name);
76
- })
77
- .catch((err) => {
78
- logToFile(`[SlackScreen] API fetch failed: ${err instanceof Error ? err.message : String(err)}`);
79
- });
77
+ return () => {
78
+ cancelled = true;
79
+ };
80
80
  }, []);
81
- const settingsUrl = slackSettingsUrl(OUTBOUND_URLS.overview[(region ?? 'us')], resolvedOrgName);
81
+ const zone = (region ?? 'us');
82
+ const settingsUrl = OUTBOUND_URLS.slackSettings(zone, store.session.selectedOrgId);
83
+ const [openedUrl, setOpenedUrl] = useState(settingsUrl);
82
84
  const handleConnect = () => {
83
85
  setPhase(Phase.Opening);
84
- opn(settingsUrl, { wait: false }).catch(() => {
85
- /* fire-and-forget */
86
- });
87
- setTimeout(() => setPhase(Phase.Waiting), 800);
86
+ const credentials = store.session.credentials;
87
+ const orgId = store.session.selectedOrgId;
88
+ // Thunder uses access_token (Hydra-validated), not id_token.
89
+ const accessToken = credentials?.accessToken;
90
+ // Try the direct Slack OAuth URL first; fall back to settings page.
91
+ const open = (url) => {
92
+ setOpenedUrl(url);
93
+ logToFile(`[SlackScreen] opening ${url === settingsUrl ? 'settings fallback' : 'direct Slack OAuth URL'}`);
94
+ opn(url, { wait: false }).catch(() => { });
95
+ timerRef.current = setTimeout(() => setPhase(Phase.Waiting), 800);
96
+ };
97
+ if (accessToken && orgId) {
98
+ void fetchSlackInstallUrl(accessToken, zone, orgId, settingsUrl).then((directUrl) => open(directUrl ?? settingsUrl));
99
+ }
100
+ else {
101
+ open(settingsUrl);
102
+ }
88
103
  };
89
104
  const handleSkip = () => {
90
105
  markDone(store, SlackOutcome.Skipped, standalone, onComplete);
91
106
  };
92
107
  const handleDone = () => {
93
108
  setPhase(Phase.Done);
94
- setTimeout(() => markDone(store, SlackOutcome.Configured, standalone, onComplete), 1500);
109
+ timerRef.current = setTimeout(() => markDone(store, SlackOutcome.Configured, standalone, onComplete), 1500);
95
110
  };
96
- return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsx(Text, { bold: true, color: Colors.accent, children: "Slack Integration" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: Colors.muted, children: "Connect Amplitude to Slack for chart previews, dashboard sharing," }), _jsx(Text, { color: Colors.muted, children: "and real-time tracking plan notifications." }), isEu && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "yellow", children: "EU region: install the \"Amplitude - EU\" app from the Slack App Directory." }) })), phase === Phase.Prompt && (_jsx(Box, { marginTop: 1, children: _jsx(ConfirmationInput, { message: `Open Amplitude Settings to connect the "${appName}" Slack app?`, confirmLabel: "Open settings", cancelLabel: "Skip for now", onConfirm: handleConnect, onCancel: handleSkip }) })), phase === Phase.Opening && (_jsx(Text, { color: Colors.muted, children: "Opening browser..." })), phase === Phase.Waiting && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { children: ["Browser opened to ", _jsx(Text, { color: "cyan", children: settingsUrl })] }), _jsx(Text, { color: Colors.muted, children: "Go to Settings > Personal Settings > Profile and click \"Connect to Slack\"." }), _jsx(Box, { marginTop: 1, children: _jsx(ConfirmationInput, { message: "Connected to Slack?", confirmLabel: "Yes, connected", cancelLabel: "Skip for now", onConfirm: handleDone, onCancel: handleSkip }) })] })), phase === Phase.Done && (_jsx(Box, { flexDirection: "column", marginTop: 1, children: _jsxs(Text, { color: "green", bold: true, children: ['\u2714', " Slack connected! You'll get chart previews and notifications in Slack."] }) }))] })] }));
111
+ return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsx(Text, { bold: true, color: Colors.accent, children: "Slack Integration" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: Colors.secondary, children: "Connect Amplitude to Slack for chart previews, dashboard sharing," }), _jsx(Text, { color: Colors.secondary, children: "and real-time tracking plan notifications." }), isEu && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.warning, children: "EU region: install the \"Amplitude - EU\" app from the Slack App Directory." }) })), phase === Phase.Prompt && (_jsx(Box, { marginTop: 1, children: _jsx(ConfirmationInput, { message: `Connect the "${appName}" Slack app to your workspace?`, confirmLabel: "Connect", cancelLabel: "Skip for now", onConfirm: handleConnect, onCancel: handleSkip }) })), phase === Phase.Opening && (_jsxs(Text, { color: Colors.active, children: ["Opening browser", Icons.ellipsis] })), phase === Phase.Waiting && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [openedUrl === settingsUrl ? (_jsxs(_Fragment, { children: [_jsxs(Text, { color: Colors.body, children: ["Browser opened to", ' ', _jsx(Text, { color: Colors.accent, children: settingsUrl })] }), _jsxs(Text, { color: Colors.secondary, children: ["Go to Settings ", Icons.chevronRight, " Personal Settings", ' ', Icons.chevronRight, " Profile and click \"Connect to Slack\"."] }), _jsxs(Text, { color: Colors.muted, children: ["Docs:", ' ', _jsx(Text, { color: Colors.accent, children: "https://amplitude.com/docs/analytics/integrate-slack" })] })] })) : (_jsxs(_Fragment, { children: [_jsxs(Text, { color: Colors.body, children: ["Browser opened to ", _jsx(Text, { color: Colors.accent, children: "Slack" }), " for authorization."] }), _jsxs(Text, { color: Colors.secondary, children: ["Authorize the ", appName, " app in Slack to complete the connection."] }), _jsxs(Text, { color: Colors.muted, children: ["Docs:", ' ', _jsx(Text, { color: Colors.accent, children: "https://amplitude.com/docs/analytics/integrate-slack" })] })] })), _jsx(Box, { marginTop: 1, children: _jsx(ConfirmationInput, { message: "Connected to Slack?", confirmLabel: "Yes, connected", cancelLabel: "Skip for now", onConfirm: handleDone, onCancel: handleSkip }) })] })), phase === Phase.Done && (_jsx(Box, { flexDirection: "column", marginTop: 1, children: _jsxs(Text, { color: Colors.success, bold: true, children: [Icons.checkmark, " Slack connected! You'll get chart previews and notifications in Slack."] }) }))] })] }));
97
112
  };
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Inline copies of runtime constants from wizard-session.ts.
3
+ *
4
+ * tsx has an ESM/CJS dual-loading bug: when a module is first loaded as CJS
5
+ * (e.g. via a top-level import chain) and then loaded again via dynamic
6
+ * import() as ESM, named exports using the `as const` + same-name type
7
+ * pattern fail to resolve. This file provides the TUI layer with its own
8
+ * copies so it never needs runtime imports from wizard-session.ts.
9
+ *
10
+ * IMPORTANT: keep these in sync with src/lib/wizard-session.ts.
11
+ */
12
+ export declare const RunPhase: {
13
+ readonly Idle: "idle";
14
+ readonly Running: "running";
15
+ readonly Completed: "completed";
16
+ readonly Error: "error";
17
+ };
18
+ export type RunPhase = (typeof RunPhase)[keyof typeof RunPhase];
19
+ export declare const AdditionalFeature: {
20
+ readonly LLM: "llm";
21
+ };
22
+ export type AdditionalFeature = (typeof AdditionalFeature)[keyof typeof AdditionalFeature];
23
+ export declare const ADDITIONAL_FEATURE_LABELS: Record<AdditionalFeature, string>;
24
+ export declare const McpOutcome: {
25
+ readonly NoClients: "no_clients";
26
+ readonly Skipped: "skipped";
27
+ readonly Installed: "installed";
28
+ readonly Failed: "failed";
29
+ };
30
+ export type McpOutcome = (typeof McpOutcome)[keyof typeof McpOutcome];
31
+ export declare const SlackOutcome: {
32
+ readonly Skipped: "skipped";
33
+ readonly Configured: "configured";
34
+ };
35
+ export type SlackOutcome = (typeof SlackOutcome)[keyof typeof SlackOutcome];
36
+ export declare const OutroKind: {
37
+ readonly Success: "success";
38
+ readonly Error: "error";
39
+ readonly Cancel: "cancel";
40
+ };
41
+ export type OutroKind = (typeof OutroKind)[keyof typeof OutroKind];
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Inline copies of runtime constants from wizard-session.ts.
3
+ *
4
+ * tsx has an ESM/CJS dual-loading bug: when a module is first loaded as CJS
5
+ * (e.g. via a top-level import chain) and then loaded again via dynamic
6
+ * import() as ESM, named exports using the `as const` + same-name type
7
+ * pattern fail to resolve. This file provides the TUI layer with its own
8
+ * copies so it never needs runtime imports from wizard-session.ts.
9
+ *
10
+ * IMPORTANT: keep these in sync with src/lib/wizard-session.ts.
11
+ */
12
+ export const RunPhase = {
13
+ Idle: 'idle',
14
+ Running: 'running',
15
+ Completed: 'completed',
16
+ Error: 'error',
17
+ };
18
+ export const AdditionalFeature = {
19
+ LLM: 'llm',
20
+ };
21
+ export const ADDITIONAL_FEATURE_LABELS = {
22
+ [AdditionalFeature.LLM]: 'LLM analytics',
23
+ };
24
+ export const McpOutcome = {
25
+ NoClients: 'no_clients',
26
+ Skipped: 'skipped',
27
+ Installed: 'installed',
28
+ Failed: 'failed',
29
+ };
30
+ export const SlackOutcome = {
31
+ Skipped: 'skipped',
32
+ Configured: 'configured',
33
+ };
34
+ export const OutroKind = {
35
+ Success: 'success',
36
+ Error: 'error',
37
+ Cancel: 'cancel',
38
+ };
@@ -1,5 +1,7 @@
1
1
  /**
2
- * start-tui.ts — Sets up the Ink TUI renderer and InkUI.
2
+ * start-tui.ts — Sets up the Ink TUI renderer.
3
+ *
4
+ * Uses Amplitude brand colors for terminal theming.
3
5
  */
4
6
  import { WizardStore, Flow } from './store.js';
5
7
  import type { WizardSession } from '../../lib/wizard-session.js';
@@ -1,5 +1,7 @@
1
1
  /**
2
- * start-tui.ts — Sets up the Ink TUI renderer and InkUI.
2
+ * start-tui.ts — Sets up the Ink TUI renderer.
3
+ *
4
+ * Uses Amplitude brand colors for terminal theming.
3
5
  */
4
6
  import { render } from 'ink';
5
7
  import { createElement } from 'react';
@@ -7,22 +9,22 @@ import { WizardStore, Flow } from './store.js';
7
9
  import { InkUI } from './ink-ui.js';
8
10
  import { setUI } from '../index.js';
9
11
  import { App } from './App.js';
12
+ import { Brand } from './styles.js';
10
13
  // ANSI escape sequences
11
14
  const RESET_ATTRS = '\x1b[0m';
12
15
  const CLEAR_SCREEN = '\x1b[2J';
13
16
  const CURSOR_HOME = '\x1b[H';
14
17
  const BG_BLACK = '\x1b[48;2;0;0;0m';
15
- // OSC 10/11: set terminal foreground/background colors (ignored by unsupporting terminals)
16
- const OSC_FG_BRIGHT = '\x1b]10;#f4f4ff\x07';
17
- const OSC_BG_DARK = '\x1b]11;#0d0d16\x07';
18
+ // OSC 10/11: set terminal foreground/background to Amplitude brand colors
19
+ const OSC_FG = `\x1b]10;${Brand.gray10}\x07`;
20
+ const OSC_BG = `\x1b]11;${Brand.gray100}\x07`;
18
21
  // OSC 110/111: reset to user defaults
19
22
  const OSC_FG_RESET = '\x1b]110;\x07';
20
23
  const OSC_BG_RESET = '\x1b]111;\x07';
21
- /** Set foreground bright + background near-black, clear screen, cursor to top-left. */
22
- const FORCE_DARK = OSC_FG_BRIGHT + OSC_BG_DARK + BG_BLACK + CLEAR_SCREEN + CURSOR_HOME;
24
+ /** Set foreground + background to brand colors, clear screen. */
25
+ const FORCE_DARK = OSC_FG + OSC_BG + BG_BLACK + CLEAR_SCREEN + CURSOR_HOME;
23
26
  export function startTUI(version, flow = Flow.Wizard, initialSession) {
24
- // Force dark background regardless of terminal theme.
25
- // The UI adapts to whatever size the terminal already is.
27
+ // Apply brand terminal theme
26
28
  process.stdout.write(FORCE_DARK);
27
29
  const store = new WizardStore(flow);
28
30
  store.version = version;
@@ -32,8 +34,10 @@ export function startTUI(version, flow = Flow.Wizard, initialSession) {
32
34
  // Swap in the InkUI
33
35
  const inkUI = new InkUI(store);
34
36
  setUI(inkUI);
35
- // Render the Ink app
36
- const { unmount: inkUnmount } = render(createElement(App, { store }));
37
+ // Render the App — exitOnCtrlC lets Ink translate Ctrl+C into process.exit()
38
+ const { unmount: inkUnmount } = render(createElement(App, { store }), {
39
+ exitOnCtrlC: true,
40
+ });
37
41
  // Reset terminal colors on exit
38
42
  const cleanup = () => {
39
43
  process.stdout.write(OSC_FG_RESET + OSC_BG_RESET + RESET_ATTRS + CLEAR_SCREEN + CURSOR_HOME);
@@ -10,7 +10,8 @@
10
10
  * explicit setters so emitChange() is always called.
11
11
  */
12
12
  import { TaskStatus, type EventPlanDecision } from '../wizard-ui.js';
13
- import { type WizardSession, type OutroData, type DiscoveredFeature, AdditionalFeature, McpOutcome, SlackOutcome, RunPhase } from '../../lib/wizard-session.js';
13
+ import { type WizardSession, type OutroData, type DiscoveredFeature } from '../../lib/wizard-session.js';
14
+ import { AdditionalFeature, McpOutcome, SlackOutcome, RunPhase } from './session-constants.js';
14
15
  import { WizardRouter, type ScreenName, Screen, Overlay, Flow } from './router.js';
15
16
  export { TaskStatus, Screen, Overlay, Flow, RunPhase, McpOutcome, SlackOutcome, };
16
17
  export type { ScreenName, OutroData, WizardSession };
@@ -97,6 +98,7 @@ export declare class WizardStore {
97
98
  setRunPhase(phase: RunPhase): void;
98
99
  setCredentials(credentials: WizardSession['credentials']): void;
99
100
  setApiKeyNotice(notice: string | null): void;
101
+ setSelectedProjectName(name: string | null): void;
100
102
  setFrameworkConfig(integration: WizardSession['integration'], config: WizardSession['frameworkConfig']): void;
101
103
  setDetectionComplete(): void;
102
104
  setDetectedFramework(label: string): void;
@@ -188,6 +190,8 @@ export declare class WizardStore {
188
190
  /**
189
191
  * Enable an additional feature: enqueue it for the stop hook
190
192
  * and set any feature-specific session flags.
193
+ * Respects Amplitude Experiment feature flags — if the corresponding
194
+ * flag is off the feature is silently skipped.
191
195
  */
192
196
  enableFeature(feature: AdditionalFeature): void;
193
197
  setAmplitudePreDetected(): void;
@@ -11,9 +11,12 @@
11
11
  */
12
12
  import { atom, map } from 'nanostores';
13
13
  import { TaskStatus } from '../wizard-ui.js';
14
- import { AdditionalFeature, McpOutcome, SlackOutcome, RunPhase, buildSession, } from '../../lib/wizard-session.js';
14
+ import { buildSession, } from '../../lib/wizard-session.js';
15
+ import { AdditionalFeature, McpOutcome, SlackOutcome, RunPhase, } from './session-constants.js';
15
16
  import { WizardRouter, Screen, Overlay, Flow, } from './router.js';
16
17
  import { analytics, sessionPropertiesCompact } from '../../utils/analytics.js';
18
+ // Inlined to avoid tsx ESM resolution bug with dynamic import().
19
+ const FLAG_LLM_ANALYTICS = 'wizard-llm-analytics';
17
20
  export { TaskStatus, Screen, Overlay, Flow, RunPhase, McpOutcome, SlackOutcome, };
18
21
  export class WizardStore {
19
22
  // ── Internal nanostore atoms ─────────────────────────────────────
@@ -62,6 +65,7 @@ export class WizardStore {
62
65
  }
63
66
  set session(value) {
64
67
  this.$session.set(value);
68
+ this.emitChange();
65
69
  }
66
70
  get commandMode() {
67
71
  return this.$commandMode.get();
@@ -128,6 +132,10 @@ export class WizardStore {
128
132
  this.$session.setKey('apiKeyNotice', notice);
129
133
  this.emitChange();
130
134
  }
135
+ setSelectedProjectName(name) {
136
+ this.$session.setKey('selectedProjectName', name);
137
+ this.emitChange();
138
+ }
131
139
  setFrameworkConfig(integration, config) {
132
140
  this.$session.setKey('integration', integration);
133
141
  this.$session.setKey('frameworkConfig', config);
@@ -148,6 +156,19 @@ export class WizardStore {
148
156
  setRegion(region) {
149
157
  this.$session.setKey('region', region);
150
158
  this.$session.setKey('regionForced', false);
159
+ // Persist region to project-level ampli.json so next run uses the right zone.
160
+ // Only writes if OrgId/WorkspaceId already exist (otherwise writeAmpliConfig
161
+ // would create a partial config).
162
+ const session = this.$session.get();
163
+ if (session.selectedOrgId && session.selectedWorkspaceId) {
164
+ void import('../../lib/ampli-config.js').then(({ writeAmpliConfig }) => {
165
+ writeAmpliConfig(session.installDir, {
166
+ OrgId: session.selectedOrgId,
167
+ WorkspaceId: session.selectedWorkspaceId,
168
+ Zone: region,
169
+ });
170
+ });
171
+ }
151
172
  this.emitChange();
152
173
  }
153
174
  /** Force the RegionSelect screen to re-appear (/region command). */
@@ -355,9 +376,13 @@ export class WizardStore {
355
376
  this.$session.setKey('selectedOrgName', org.name);
356
377
  this.$session.setKey('selectedWorkspaceId', workspace.id);
357
378
  this.$session.setKey('selectedWorkspaceName', workspace.name);
358
- // Write ampli.json to the project directory
379
+ // Write ampli.json to the project directory.
380
+ // Use session.region (user-confirmed) over pendingAuthCloudRegion (auto-detected)
381
+ // so that /region changes are respected.
359
382
  void import('../../lib/ampli-config.js').then(({ writeAmpliConfig }) => {
360
- const zone = this.$session.get().pendingAuthCloudRegion ?? 'us';
383
+ const zone = this.$session.get().region ??
384
+ this.$session.get().pendingAuthCloudRegion ??
385
+ 'us';
361
386
  writeAmpliConfig(installDir, {
362
387
  OrgId: org.id,
363
388
  WorkspaceId: workspace.id,
@@ -398,21 +423,35 @@ export class WizardStore {
398
423
  }
399
424
  addDiscoveredFeature(feature) {
400
425
  if (!this.session.discoveredFeatures.includes(feature)) {
401
- this.session.discoveredFeatures.push(feature);
426
+ this.$session.setKey('discoveredFeatures', [
427
+ ...this.session.discoveredFeatures,
428
+ feature,
429
+ ]);
402
430
  this.emitChange();
403
431
  }
404
432
  }
405
433
  /**
406
434
  * Enable an additional feature: enqueue it for the stop hook
407
435
  * and set any feature-specific session flags.
436
+ * Respects Amplitude Experiment feature flags — if the corresponding
437
+ * flag is off the feature is silently skipped.
408
438
  */
409
439
  enableFeature(feature) {
440
+ // Gate LLM analytics behind the wizard-llm-analytics feature flag
441
+ if (feature === AdditionalFeature.LLM) {
442
+ if (!analytics.isFeatureFlagEnabled(FLAG_LLM_ANALYTICS)) {
443
+ return;
444
+ }
445
+ }
410
446
  if (!this.session.additionalFeatureQueue.includes(feature)) {
411
- this.session.additionalFeatureQueue.push(feature);
447
+ this.$session.setKey('additionalFeatureQueue', [
448
+ ...this.session.additionalFeatureQueue,
449
+ feature,
450
+ ]);
412
451
  }
413
452
  // Feature-specific flags
414
453
  if (feature === AdditionalFeature.LLM) {
415
- this.session.llmOptIn = true;
454
+ this.$session.setKey('llmOptIn', true);
416
455
  }
417
456
  analytics.wizardCapture('Feature Enabled', { feature });
418
457
  this.emitChange();
@@ -1,6 +1,80 @@
1
1
  /**
2
- * Shared style constants for TUI layout primitives.
2
+ * Design tokens Amplitude brand palette + modern TUI primitives.
3
+ *
4
+ * Colors sourced from brand.amplitude.com/creative/color.
5
+ * Optimised for dark terminal backgrounds (Gray 100 base).
3
6
  */
7
+ export declare const Brand: {
8
+ readonly darkBlue: "#001A4F";
9
+ readonly blue: "#1E61F0";
10
+ readonly blueOnDark: "#4083FF";
11
+ readonly lilac: "#6980FF";
12
+ readonly violet: "#A373FF";
13
+ readonly pink: "#FF7D78";
14
+ readonly amber: "#F59E0B";
15
+ readonly red: "#F23845";
16
+ readonly gray100: "#13171A";
17
+ readonly gray90: "#242A2E";
18
+ readonly gray80: "#373D42";
19
+ readonly gray70: "#50565B";
20
+ readonly gray60: "#697077";
21
+ readonly gray50: "#868D95";
22
+ readonly gray40: "#9FA5AD";
23
+ readonly gray30: "#B9BFC7";
24
+ readonly gray20: "#D5D9E0";
25
+ readonly gray10: "#F2F4F8";
26
+ readonly success: "#34D399";
27
+ readonly white: "#FFFFFF";
28
+ };
29
+ export declare const Colors: {
30
+ readonly heading: "#F2F4F8";
31
+ readonly body: "#B9BFC7";
32
+ readonly secondary: "#868D95";
33
+ readonly muted: "#697077";
34
+ readonly disabled: "#50565B";
35
+ readonly accent: "#4083FF";
36
+ readonly accentSecondary: "#6980FF";
37
+ readonly active: "#A373FF";
38
+ readonly success: "#34D399";
39
+ readonly error: "#F23845";
40
+ readonly warning: "#F59E0B";
41
+ readonly background: "#13171A";
42
+ readonly surface: "#242A2E";
43
+ readonly border: "#373D42";
44
+ readonly primary: "#4083FF";
45
+ };
46
+ export declare const Icons: {
47
+ readonly checkmark: "✓";
48
+ readonly cross: "✗";
49
+ readonly bullet: "●";
50
+ readonly bulletOpen: "○";
51
+ readonly bulletHalf: "◐";
52
+ readonly squareFilled: "◼";
53
+ readonly squareOpen: "◻";
54
+ readonly chevronRight: "›";
55
+ readonly arrowRight: "→";
56
+ readonly triangleRight: "▶";
57
+ readonly triangleSmallRight: "▸";
58
+ readonly diamond: "◆";
59
+ readonly diamondOpen: "◇";
60
+ readonly bar: "│";
61
+ readonly dash: "─";
62
+ readonly warning: "⚠";
63
+ readonly prompt: "❯";
64
+ readonly dot: "·";
65
+ readonly ellipsis: "…";
66
+ };
67
+ export declare const SPINNER_FRAMES: readonly ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
68
+ export declare const SPINNER_INTERVAL = 200;
69
+ export declare const Layout: {
70
+ readonly minWidth: 60;
71
+ readonly maxWidth: 120;
72
+ readonly paddingX: 2;
73
+ readonly stepperHeight: 1;
74
+ readonly headerHeight: 1;
75
+ readonly hintBarHeight: 1;
76
+ readonly separatorChar: "─";
77
+ };
4
78
  export declare enum HAlign {
5
79
  Left = "flex-start",
6
80
  Center = "center",
@@ -11,21 +85,3 @@ export declare enum VAlign {
11
85
  Center = "center",
12
86
  Bottom = "flex-end"
13
87
  }
14
- export declare const Colors: {
15
- readonly primary: "#1e61f0";
16
- readonly accent: "#1e61f0";
17
- readonly success: "green";
18
- readonly error: "red";
19
- readonly muted: "#cccccc";
20
- };
21
- export declare const Icons: {
22
- readonly diamond: "◆";
23
- readonly diamondOpen: "◇";
24
- readonly check: "✔";
25
- readonly warning: "⚠";
26
- readonly squareFilled: "◼";
27
- readonly squareOpen: "◻";
28
- readonly triangleRight: "▶";
29
- readonly triangleSmallRight: "▸";
30
- readonly bullet: "•";
31
- };
@@ -1,6 +1,106 @@
1
1
  /**
2
- * Shared style constants for TUI layout primitives.
2
+ * Design tokens Amplitude brand palette + modern TUI primitives.
3
+ *
4
+ * Colors sourced from brand.amplitude.com/creative/color.
5
+ * Optimised for dark terminal backgrounds (Gray 100 base).
3
6
  */
7
+ // ── Amplitude brand palette ──────────────────────────────────────────
8
+ export const Brand = {
9
+ darkBlue: '#001A4F',
10
+ blue: '#1E61F0',
11
+ blueOnDark: '#4083FF', // primary accent on dark backgrounds
12
+ lilac: '#6980FF', // secondary accent, completed states
13
+ violet: '#A373FF', // in-progress, active highlights
14
+ pink: '#FF7D78', // decorative only
15
+ amber: '#F59E0B', // warnings — visually distinct from red
16
+ red: '#F23845', // errors only
17
+ gray100: '#13171A', // terminal background
18
+ gray90: '#242A2E', // card/surface
19
+ gray80: '#373D42', // borders, dividers
20
+ gray70: '#50565B', // disabled text
21
+ gray60: '#697077', // muted text
22
+ gray50: '#868D95', // secondary text
23
+ gray40: '#9FA5AD', // body text
24
+ gray30: '#B9BFC7', // primary text
25
+ gray20: '#D5D9E0', // emphasized text
26
+ gray10: '#F2F4F8', // headings, bright text
27
+ success: '#34D399', // emerald-400 — completion
28
+ white: '#FFFFFF',
29
+ };
30
+ // ── Semantic color aliases ───────────────────────────────────────────
31
+ export const Colors = {
32
+ // Text hierarchy (4 levels)
33
+ heading: Brand.gray10,
34
+ body: Brand.gray30,
35
+ secondary: Brand.gray50,
36
+ muted: Brand.gray60,
37
+ disabled: Brand.gray70,
38
+ // Interactive
39
+ accent: Brand.blueOnDark,
40
+ accentSecondary: Brand.lilac,
41
+ active: Brand.violet,
42
+ // Status
43
+ success: Brand.success,
44
+ error: Brand.red,
45
+ warning: Brand.amber,
46
+ // Surfaces
47
+ background: Brand.gray100,
48
+ surface: Brand.gray90,
49
+ border: Brand.gray80,
50
+ // Legacy compat — screens that import Colors.primary
51
+ primary: Brand.blueOnDark,
52
+ };
53
+ // ── Icons — modern unicode glyphs ───────────────────────────────────
54
+ export const Icons = {
55
+ // Progress states
56
+ checkmark: '✓',
57
+ cross: '✗',
58
+ bullet: '●',
59
+ bulletOpen: '○',
60
+ bulletHalf: '◐',
61
+ squareFilled: '◼',
62
+ squareOpen: '◻',
63
+ // Navigation
64
+ chevronRight: '›',
65
+ arrowRight: '→',
66
+ triangleRight: '▶',
67
+ triangleSmallRight: '▸',
68
+ // Decorative
69
+ diamond: '◆',
70
+ diamondOpen: '◇',
71
+ bar: '│',
72
+ dash: '─',
73
+ warning: '⚠',
74
+ // Indicators
75
+ prompt: '❯',
76
+ dot: '·',
77
+ ellipsis: '…',
78
+ };
79
+ // ── Braille spinner frames ──────────────────────────────────────────
80
+ export const SPINNER_FRAMES = [
81
+ '⠋',
82
+ '⠙',
83
+ '⠹',
84
+ '⠸',
85
+ '⠼',
86
+ '⠴',
87
+ '⠦',
88
+ '⠧',
89
+ '⠇',
90
+ '⠏',
91
+ ];
92
+ export const SPINNER_INTERVAL = 200;
93
+ // ── Layout constants ────────────────────────────────────────────────
94
+ export const Layout = {
95
+ minWidth: 60,
96
+ maxWidth: 120,
97
+ paddingX: 2,
98
+ stepperHeight: 1,
99
+ headerHeight: 1,
100
+ hintBarHeight: 1,
101
+ separatorChar: '─',
102
+ };
103
+ // ── Alignment ────────────────────────────────────────────────────────
4
104
  export var HAlign;
5
105
  (function (HAlign) {
6
106
  HAlign["Left"] = "flex-start";
@@ -13,21 +113,3 @@ export var VAlign;
13
113
  VAlign["Center"] = "center";
14
114
  VAlign["Bottom"] = "flex-end";
15
115
  })(VAlign || (VAlign = {}));
16
- export const Colors = {
17
- primary: '#1e61f0',
18
- accent: '#1e61f0',
19
- success: 'green',
20
- error: 'red',
21
- muted: '#cccccc',
22
- };
23
- export const Icons = {
24
- diamond: '\u25C6',
25
- diamondOpen: '\u25C7',
26
- check: '\u2714',
27
- warning: '\u26A0',
28
- squareFilled: '\u25FC',
29
- squareOpen: '\u25FB',
30
- triangleRight: '\u25B6',
31
- triangleSmallRight: '\u25B8',
32
- bullet: '\u2022',
33
- };