@amplitude/wizard 1.0.0-beta.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/README.md +171 -74
  2. package/dist/bin.js +338 -222
  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 +6 -5
  9. package/dist/src/lib/constants.js +13 -13
  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/health-checks/statuspage.d.ts +1 -0
  15. package/dist/src/lib/health-checks/statuspage.js +5 -1
  16. package/dist/src/lib/mode-config.d.ts +14 -0
  17. package/dist/src/lib/mode-config.js +14 -0
  18. package/dist/src/lib/session-checkpoint.d.ts +27 -0
  19. package/dist/src/lib/session-checkpoint.js +134 -0
  20. package/dist/src/lib/wizard-session.d.ts +44 -1
  21. package/dist/src/lib/wizard-session.js +70 -14
  22. package/dist/src/lib/wizard-tools.js +19 -4
  23. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +3 -0
  24. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +6 -0
  25. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +3 -1
  26. package/dist/src/ui/agent-ui.d.ts +91 -0
  27. package/dist/src/ui/agent-ui.js +277 -0
  28. package/dist/src/ui/logging-ui.js +1 -1
  29. package/dist/src/ui/tui/App.d.ts +12 -0
  30. package/dist/src/ui/tui/App.js +29 -18
  31. package/dist/src/ui/tui/components/AmplitudeLogo.js +16 -17
  32. package/dist/src/ui/tui/components/AmplitudeTextLogo.d.ts +0 -2
  33. package/dist/src/ui/tui/components/AmplitudeTextLogo.js +53 -18
  34. package/dist/src/ui/tui/components/BrailleSpinner.d.ts +8 -0
  35. package/dist/src/ui/tui/components/BrailleSpinner.js +15 -0
  36. package/dist/src/ui/tui/components/ConsoleView.d.ts +8 -11
  37. package/dist/src/ui/tui/components/ConsoleView.js +51 -34
  38. package/dist/src/ui/tui/components/HeaderBar.d.ts +12 -0
  39. package/dist/src/ui/tui/components/HeaderBar.js +17 -0
  40. package/dist/src/ui/tui/components/JourneyStepper.d.ts +16 -0
  41. package/dist/src/ui/tui/components/JourneyStepper.js +83 -0
  42. package/dist/src/ui/tui/components/KeyHintBar.d.ts +19 -0
  43. package/dist/src/ui/tui/components/KeyHintBar.js +20 -0
  44. package/dist/src/ui/tui/console-commands.d.ts +1 -2
  45. package/dist/src/ui/tui/console-commands.js +48 -7
  46. package/dist/src/ui/tui/flows.d.ts +1 -1
  47. package/dist/src/ui/tui/flows.js +1 -1
  48. package/dist/src/ui/tui/hooks/useAsyncEffect.d.ts +15 -0
  49. package/dist/src/ui/tui/hooks/useAsyncEffect.js +35 -0
  50. package/dist/src/ui/tui/hooks/useWizardStore.d.ts +9 -0
  51. package/dist/src/ui/tui/hooks/useWizardStore.js +11 -0
  52. package/dist/src/ui/tui/ink-ui.js +1 -1
  53. package/dist/src/ui/tui/primitives/DissolveTransition.js +4 -5
  54. package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +3 -1
  55. package/dist/src/ui/tui/primitives/EventPlanViewer.js +8 -3
  56. package/dist/src/ui/tui/primitives/ProgressList.js +1 -1
  57. package/dist/src/ui/tui/primitives/SlashCommandInput.js +19 -4
  58. package/dist/src/ui/tui/primitives/SplitView.d.ts +2 -1
  59. package/dist/src/ui/tui/primitives/SplitView.js +10 -2
  60. package/dist/src/ui/tui/primitives/TabContainer.js +10 -2
  61. package/dist/src/ui/tui/primitives/index.d.ts +0 -1
  62. package/dist/src/ui/tui/primitives/index.js +0 -1
  63. package/dist/src/ui/tui/router.js +1 -1
  64. package/dist/src/ui/tui/screen-registry.d.ts +0 -7
  65. package/dist/src/ui/tui/screen-registry.js +13 -4
  66. package/dist/src/ui/tui/screens/ActivationOptionsScreen.d.ts +2 -2
  67. package/dist/src/ui/tui/screens/ActivationOptionsScreen.js +8 -8
  68. package/dist/src/ui/tui/screens/AuthScreen.js +57 -27
  69. package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +2 -12
  70. package/dist/src/ui/tui/screens/ChecklistScreen.js +22 -33
  71. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +3 -12
  72. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +109 -39
  73. package/dist/src/ui/tui/screens/DataSetupScreen.d.ts +3 -3
  74. package/dist/src/ui/tui/screens/DataSetupScreen.js +17 -10
  75. package/dist/src/ui/tui/screens/IntroScreen.d.ts +5 -3
  76. package/dist/src/ui/tui/screens/IntroScreen.js +132 -41
  77. package/dist/src/ui/tui/screens/LoginScreen.d.ts +1 -1
  78. package/dist/src/ui/tui/screens/LoginScreen.js +4 -4
  79. package/dist/src/ui/tui/screens/LogoutScreen.d.ts +4 -2
  80. package/dist/src/ui/tui/screens/LogoutScreen.js +17 -5
  81. package/dist/src/ui/tui/screens/McpScreen.d.ts +4 -4
  82. package/dist/src/ui/tui/screens/McpScreen.js +25 -17
  83. package/dist/src/ui/tui/screens/OutageScreen.d.ts +1 -1
  84. package/dist/src/ui/tui/screens/OutageScreen.js +5 -5
  85. package/dist/src/ui/tui/screens/OutroScreen.d.ts +5 -0
  86. package/dist/src/ui/tui/screens/OutroScreen.js +21 -14
  87. package/dist/src/ui/tui/screens/RegionSelectScreen.js +15 -13
  88. package/dist/src/ui/tui/screens/RunScreen.d.ts +7 -5
  89. package/dist/src/ui/tui/screens/RunScreen.js +102 -157
  90. package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +1 -1
  91. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +6 -5
  92. package/dist/src/ui/tui/screens/SetupScreen.d.ts +1 -1
  93. package/dist/src/ui/tui/screens/SetupScreen.js +7 -7
  94. package/dist/src/ui/tui/screens/SlackScreen.d.ts +2 -2
  95. package/dist/src/ui/tui/screens/SlackScreen.js +60 -35
  96. package/dist/src/ui/tui/session-constants.d.ts +41 -0
  97. package/dist/src/ui/tui/session-constants.js +38 -0
  98. package/dist/src/ui/tui/start-tui.d.ts +3 -1
  99. package/dist/src/ui/tui/start-tui.js +14 -10
  100. package/dist/src/ui/tui/store.d.ts +2 -1
  101. package/dist/src/ui/tui/store.js +33 -7
  102. package/dist/src/ui/tui/styles.d.ts +75 -19
  103. package/dist/src/ui/tui/styles.js +101 -19
  104. package/dist/src/ui/tui/utils/classify-error.d.ts +14 -0
  105. package/dist/src/ui/tui/utils/classify-error.js +90 -0
  106. package/dist/src/ui/tui/utils/diagnostics.d.ts +21 -0
  107. package/dist/src/ui/tui/utils/diagnostics.js +72 -0
  108. package/dist/src/ui/tui/utils/with-retry.d.ts +12 -0
  109. package/dist/src/ui/tui/utils/with-retry.js +32 -0
  110. package/dist/src/ui/tui/utils/with-timeout.d.ts +10 -0
  111. package/dist/src/ui/tui/utils/with-timeout.js +24 -0
  112. package/dist/src/utils/ampli-settings.d.ts +1 -1
  113. package/dist/src/utils/ampli-settings.js +15 -5
  114. package/dist/src/utils/api-key-store.js +5 -5
  115. package/dist/src/utils/atomic-write.d.ts +15 -0
  116. package/dist/src/utils/atomic-write.js +34 -0
  117. package/dist/src/utils/setup-utils.js +2 -2
  118. package/dist/src/utils/token-refresh.d.ts +22 -0
  119. package/dist/src/utils/token-refresh.js +79 -0
  120. package/dist/src/utils/wizard-abort.js +6 -1
  121. package/package.json +6 -6
  122. package/skills/instrumentation/add-analytics-instrumentation/SKILL.md +142 -0
  123. package/skills/instrumentation/diff-intake/SKILL.md +128 -0
  124. package/skills/instrumentation/discover-analytics-patterns/SKILL.md +185 -0
  125. package/skills/instrumentation/discover-event-surfaces/SKILL.md +322 -0
  126. package/skills/instrumentation/discover-event-surfaces/references/best-practices.md +563 -0
  127. package/skills/instrumentation/instrument-events/SKILL.md +169 -0
  128. package/skills/instrumentation/instrument-events/references/best-practices.md +563 -0
  129. package/skills/integration/integration-android/SKILL.md +49 -0
  130. package/skills/integration/integration-android/references/EXAMPLE.md +1977 -0
  131. package/skills/integration/integration-android/references/amplitude-quickstart.md +1845 -0
  132. package/skills/integration/integration-android/references/analytics.md +1778 -0
  133. package/skills/integration/integration-android/references/basic-integration-1.0-begin.md +43 -0
  134. package/skills/integration/integration-android/references/basic-integration-1.1-edit.md +35 -0
  135. package/skills/integration/integration-android/references/basic-integration-1.2-revise.md +23 -0
  136. package/skills/integration/integration-android/references/basic-integration-1.3-conclude.md +57 -0
  137. package/skills/integration/integration-angular/SKILL.md +49 -0
  138. package/skills/integration/integration-angular/references/EXAMPLE.md +899 -0
  139. package/skills/integration/integration-angular/references/amplitude-quickstart.md +1845 -0
  140. package/skills/integration/integration-angular/references/basic-integration-1.0-begin.md +43 -0
  141. package/skills/integration/integration-angular/references/basic-integration-1.1-edit.md +35 -0
  142. package/skills/integration/integration-angular/references/basic-integration-1.2-revise.md +23 -0
  143. package/skills/integration/integration-angular/references/basic-integration-1.3-conclude.md +57 -0
  144. package/skills/integration/integration-angular/references/browser-sdk-2.md +4680 -0
  145. package/skills/integration/integration-astro-hybrid/SKILL.md +56 -0
  146. package/skills/integration/integration-astro-hybrid/references/EXAMPLE.md +1095 -0
  147. package/skills/integration/integration-astro-hybrid/references/amplitude-quickstart.md +1845 -0
  148. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.0-begin.md +43 -0
  149. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.1-edit.md +35 -0
  150. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.2-revise.md +23 -0
  151. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.3-conclude.md +57 -0
  152. package/skills/integration/integration-astro-hybrid/references/browser-sdk-2.md +4680 -0
  153. package/skills/integration/integration-astro-ssr/SKILL.md +52 -0
  154. package/skills/integration/integration-astro-ssr/references/EXAMPLE.md +1106 -0
  155. package/skills/integration/integration-astro-ssr/references/amplitude-quickstart.md +1845 -0
  156. package/skills/integration/integration-astro-ssr/references/basic-integration-1.0-begin.md +43 -0
  157. package/skills/integration/integration-astro-ssr/references/basic-integration-1.1-edit.md +35 -0
  158. package/skills/integration/integration-astro-ssr/references/basic-integration-1.2-revise.md +23 -0
  159. package/skills/integration/integration-astro-ssr/references/basic-integration-1.3-conclude.md +57 -0
  160. package/skills/integration/integration-astro-ssr/references/browser-sdk-2.md +4680 -0
  161. package/skills/integration/integration-astro-static/SKILL.md +49 -0
  162. package/skills/integration/integration-astro-static/references/EXAMPLE.md +910 -0
  163. package/skills/integration/integration-astro-static/references/amplitude-quickstart.md +1845 -0
  164. package/skills/integration/integration-astro-static/references/basic-integration-1.0-begin.md +43 -0
  165. package/skills/integration/integration-astro-static/references/basic-integration-1.1-edit.md +35 -0
  166. package/skills/integration/integration-astro-static/references/basic-integration-1.2-revise.md +23 -0
  167. package/skills/integration/integration-astro-static/references/basic-integration-1.3-conclude.md +57 -0
  168. package/skills/integration/integration-astro-static/references/browser-sdk-2.md +4680 -0
  169. package/skills/integration/integration-astro-view-transitions/SKILL.md +51 -0
  170. package/skills/integration/integration-astro-view-transitions/references/EXAMPLE.md +979 -0
  171. package/skills/integration/integration-astro-view-transitions/references/amplitude-quickstart.md +1845 -0
  172. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.0-begin.md +43 -0
  173. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.1-edit.md +35 -0
  174. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.2-revise.md +23 -0
  175. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.3-conclude.md +57 -0
  176. package/skills/integration/integration-astro-view-transitions/references/browser-sdk-2.md +4680 -0
  177. package/skills/integration/integration-django/SKILL.md +57 -0
  178. package/skills/integration/integration-django/references/EXAMPLE.md +1005 -0
  179. package/skills/integration/integration-django/references/amplitude-quickstart.md +1845 -0
  180. package/skills/integration/integration-django/references/basic-integration-1.0-begin.md +43 -0
  181. package/skills/integration/integration-django/references/basic-integration-1.1-edit.md +35 -0
  182. package/skills/integration/integration-django/references/basic-integration-1.2-revise.md +23 -0
  183. package/skills/integration/integration-django/references/basic-integration-1.3-conclude.md +57 -0
  184. package/skills/integration/integration-django/references/python.md +1424 -0
  185. package/skills/integration/integration-expo/SKILL.md +53 -0
  186. package/skills/integration/integration-expo/references/EXAMPLE.md +1291 -0
  187. package/skills/integration/integration-expo/references/amplitude-quickstart.md +1845 -0
  188. package/skills/integration/integration-expo/references/basic-integration-1.0-begin.md +43 -0
  189. package/skills/integration/integration-expo/references/basic-integration-1.1-edit.md +35 -0
  190. package/skills/integration/integration-expo/references/basic-integration-1.2-revise.md +23 -0
  191. package/skills/integration/integration-expo/references/basic-integration-1.3-conclude.md +57 -0
  192. package/skills/integration/integration-expo/references/react-native-sdk.md +2819 -0
  193. package/skills/integration/integration-fastapi/SKILL.md +57 -0
  194. package/skills/integration/integration-fastapi/references/EXAMPLE.md +1389 -0
  195. package/skills/integration/integration-fastapi/references/amplitude-quickstart.md +1845 -0
  196. package/skills/integration/integration-fastapi/references/basic-integration-1.0-begin.md +43 -0
  197. package/skills/integration/integration-fastapi/references/basic-integration-1.1-edit.md +35 -0
  198. package/skills/integration/integration-fastapi/references/basic-integration-1.2-revise.md +23 -0
  199. package/skills/integration/integration-fastapi/references/basic-integration-1.3-conclude.md +57 -0
  200. package/skills/integration/integration-fastapi/references/python.md +1424 -0
  201. package/skills/integration/integration-flask/SKILL.md +56 -0
  202. package/skills/integration/integration-flask/references/EXAMPLE.md +1130 -0
  203. package/skills/integration/integration-flask/references/amplitude-quickstart.md +1845 -0
  204. package/skills/integration/integration-flask/references/basic-integration-1.0-begin.md +43 -0
  205. package/skills/integration/integration-flask/references/basic-integration-1.1-edit.md +35 -0
  206. package/skills/integration/integration-flask/references/basic-integration-1.2-revise.md +23 -0
  207. package/skills/integration/integration-flask/references/basic-integration-1.3-conclude.md +57 -0
  208. package/skills/integration/integration-flask/references/python.md +1424 -0
  209. package/skills/integration/integration-javascript_node/SKILL.md +54 -0
  210. package/skills/integration/integration-javascript_node/references/EXAMPLE.md +365 -0
  211. package/skills/integration/integration-javascript_node/references/amplitude-quickstart.md +1845 -0
  212. package/skills/integration/integration-javascript_node/references/analytics.md +1778 -0
  213. package/skills/integration/integration-javascript_node/references/basic-integration-1.0-begin.md +43 -0
  214. package/skills/integration/integration-javascript_node/references/basic-integration-1.1-edit.md +35 -0
  215. package/skills/integration/integration-javascript_node/references/basic-integration-1.2-revise.md +23 -0
  216. package/skills/integration/integration-javascript_node/references/basic-integration-1.3-conclude.md +57 -0
  217. package/skills/integration/integration-javascript_web/SKILL.md +58 -0
  218. package/skills/integration/integration-javascript_web/references/EXAMPLE.md +451 -0
  219. package/skills/integration/integration-javascript_web/references/amplitude-quickstart.md +1845 -0
  220. package/skills/integration/integration-javascript_web/references/basic-integration-1.0-begin.md +43 -0
  221. package/skills/integration/integration-javascript_web/references/basic-integration-1.1-edit.md +35 -0
  222. package/skills/integration/integration-javascript_web/references/basic-integration-1.2-revise.md +23 -0
  223. package/skills/integration/integration-javascript_web/references/basic-integration-1.3-conclude.md +57 -0
  224. package/skills/integration/integration-javascript_web/references/browser-sdk-2.md +4680 -0
  225. package/skills/integration/integration-laravel/SKILL.md +52 -0
  226. package/skills/integration/integration-laravel/references/EXAMPLE.md +2039 -0
  227. package/skills/integration/integration-laravel/references/amplitude-quickstart.md +1845 -0
  228. package/skills/integration/integration-laravel/references/analytics.md +1778 -0
  229. package/skills/integration/integration-laravel/references/basic-integration-1.0-begin.md +43 -0
  230. package/skills/integration/integration-laravel/references/basic-integration-1.1-edit.md +35 -0
  231. package/skills/integration/integration-laravel/references/basic-integration-1.2-revise.md +23 -0
  232. package/skills/integration/integration-laravel/references/basic-integration-1.3-conclude.md +57 -0
  233. package/skills/integration/integration-nextjs-app-router/SKILL.md +54 -0
  234. package/skills/integration/integration-nextjs-app-router/references/EXAMPLE.md +673 -0
  235. package/skills/integration/integration-nextjs-app-router/references/amplitude-quickstart.md +1845 -0
  236. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.0-begin.md +43 -0
  237. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.1-edit.md +35 -0
  238. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.2-revise.md +23 -0
  239. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.3-conclude.md +57 -0
  240. package/skills/integration/integration-nextjs-app-router/references/browser-sdk-2.md +4680 -0
  241. package/skills/integration/integration-nextjs-pages-router/SKILL.md +54 -0
  242. package/skills/integration/integration-nextjs-pages-router/references/EXAMPLE.md +735 -0
  243. package/skills/integration/integration-nextjs-pages-router/references/amplitude-quickstart.md +1845 -0
  244. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.0-begin.md +43 -0
  245. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.1-edit.md +35 -0
  246. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.2-revise.md +23 -0
  247. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.3-conclude.md +57 -0
  248. package/skills/integration/integration-nextjs-pages-router/references/browser-sdk-2.md +4680 -0
  249. package/skills/integration/integration-nuxt-3.6/SKILL.md +46 -0
  250. package/skills/integration/integration-nuxt-3.6/references/EXAMPLE.md +8422 -0
  251. package/skills/integration/integration-nuxt-3.6/references/amplitude-quickstart.md +1845 -0
  252. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.0-begin.md +43 -0
  253. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.1-edit.md +35 -0
  254. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.2-revise.md +23 -0
  255. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.3-conclude.md +57 -0
  256. package/skills/integration/integration-nuxt-3.6/references/browser-sdk-2.md +4680 -0
  257. package/skills/integration/integration-nuxt-4/SKILL.md +46 -0
  258. package/skills/integration/integration-nuxt-4/references/EXAMPLE.md +8670 -0
  259. package/skills/integration/integration-nuxt-4/references/amplitude-quickstart.md +1845 -0
  260. package/skills/integration/integration-nuxt-4/references/basic-integration-1.0-begin.md +43 -0
  261. package/skills/integration/integration-nuxt-4/references/basic-integration-1.1-edit.md +35 -0
  262. package/skills/integration/integration-nuxt-4/references/basic-integration-1.2-revise.md +23 -0
  263. package/skills/integration/integration-nuxt-4/references/basic-integration-1.3-conclude.md +57 -0
  264. package/skills/integration/integration-nuxt-4/references/browser-sdk-2.md +4680 -0
  265. package/skills/integration/integration-python/SKILL.md +53 -0
  266. package/skills/integration/integration-python/references/EXAMPLE.md +445 -0
  267. package/skills/integration/integration-python/references/amplitude-quickstart.md +1845 -0
  268. package/skills/integration/integration-python/references/basic-integration-1.0-begin.md +43 -0
  269. package/skills/integration/integration-python/references/basic-integration-1.1-edit.md +35 -0
  270. package/skills/integration/integration-python/references/basic-integration-1.2-revise.md +23 -0
  271. package/skills/integration/integration-python/references/basic-integration-1.3-conclude.md +57 -0
  272. package/skills/integration/integration-python/references/python.md +1424 -0
  273. package/skills/integration/integration-react-native/SKILL.md +49 -0
  274. package/skills/integration/integration-react-native/references/EXAMPLE.md +2253 -0
  275. package/skills/integration/integration-react-native/references/amplitude-quickstart.md +1845 -0
  276. package/skills/integration/integration-react-native/references/basic-integration-1.0-begin.md +43 -0
  277. package/skills/integration/integration-react-native/references/basic-integration-1.1-edit.md +35 -0
  278. package/skills/integration/integration-react-native/references/basic-integration-1.2-revise.md +23 -0
  279. package/skills/integration/integration-react-native/references/basic-integration-1.3-conclude.md +57 -0
  280. package/skills/integration/integration-react-native/references/react-native-sdk.md +2819 -0
  281. package/skills/integration/integration-react-react-router-6/SKILL.md +53 -0
  282. package/skills/integration/integration-react-react-router-6/references/EXAMPLE.md +570 -0
  283. package/skills/integration/integration-react-react-router-6/references/amplitude-quickstart.md +1845 -0
  284. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.0-begin.md +43 -0
  285. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.1-edit.md +35 -0
  286. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.2-revise.md +23 -0
  287. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.3-conclude.md +57 -0
  288. package/skills/integration/integration-react-react-router-6/references/browser-sdk-2.md +4680 -0
  289. package/skills/integration/integration-react-react-router-7-data/SKILL.md +53 -0
  290. package/skills/integration/integration-react-react-router-7-data/references/EXAMPLE.md +830 -0
  291. package/skills/integration/integration-react-react-router-7-data/references/amplitude-quickstart.md +1845 -0
  292. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.0-begin.md +43 -0
  293. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.1-edit.md +35 -0
  294. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.2-revise.md +23 -0
  295. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.3-conclude.md +57 -0
  296. package/skills/integration/integration-react-react-router-7-data/references/browser-sdk-2.md +4680 -0
  297. package/skills/integration/integration-react-react-router-7-declarative/SKILL.md +53 -0
  298. package/skills/integration/integration-react-react-router-7-declarative/references/EXAMPLE.md +609 -0
  299. package/skills/integration/integration-react-react-router-7-declarative/references/amplitude-quickstart.md +1845 -0
  300. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.0-begin.md +43 -0
  301. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.1-edit.md +35 -0
  302. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.2-revise.md +23 -0
  303. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.3-conclude.md +57 -0
  304. package/skills/integration/integration-react-react-router-7-declarative/references/browser-sdk-2.md +4680 -0
  305. package/skills/integration/integration-react-react-router-7-framework/SKILL.md +53 -0
  306. package/skills/integration/integration-react-react-router-7-framework/references/EXAMPLE.md +1081 -0
  307. package/skills/integration/integration-react-react-router-7-framework/references/amplitude-quickstart.md +1845 -0
  308. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.0-begin.md +43 -0
  309. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.1-edit.md +35 -0
  310. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.2-revise.md +23 -0
  311. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.3-conclude.md +57 -0
  312. package/skills/integration/integration-react-react-router-7-framework/references/browser-sdk-2.md +4680 -0
  313. package/skills/integration/integration-react-tanstack-router-code-based/SKILL.md +57 -0
  314. package/skills/integration/integration-react-tanstack-router-code-based/references/EXAMPLE.md +659 -0
  315. package/skills/integration/integration-react-tanstack-router-code-based/references/amplitude-quickstart.md +1845 -0
  316. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.0-begin.md +43 -0
  317. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.1-edit.md +35 -0
  318. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.2-revise.md +23 -0
  319. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.3-conclude.md +57 -0
  320. package/skills/integration/integration-react-tanstack-router-code-based/references/browser-sdk-2.md +4680 -0
  321. package/skills/integration/integration-react-tanstack-router-file-based/SKILL.md +57 -0
  322. package/skills/integration/integration-react-tanstack-router-file-based/references/EXAMPLE.md +777 -0
  323. package/skills/integration/integration-react-tanstack-router-file-based/references/amplitude-quickstart.md +1845 -0
  324. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.0-begin.md +43 -0
  325. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.1-edit.md +35 -0
  326. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.2-revise.md +23 -0
  327. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.3-conclude.md +57 -0
  328. package/skills/integration/integration-react-tanstack-router-file-based/references/browser-sdk-2.md +4680 -0
  329. package/skills/integration/integration-react-vite/SKILL.md +53 -0
  330. package/skills/integration/integration-react-vite/references/EXAMPLE.md +542 -0
  331. package/skills/integration/integration-react-vite/references/amplitude-quickstart.md +1845 -0
  332. package/skills/integration/integration-react-vite/references/basic-integration-1.0-begin.md +43 -0
  333. package/skills/integration/integration-react-vite/references/basic-integration-1.1-edit.md +35 -0
  334. package/skills/integration/integration-react-vite/references/basic-integration-1.2-revise.md +23 -0
  335. package/skills/integration/integration-react-vite/references/basic-integration-1.3-conclude.md +57 -0
  336. package/skills/integration/integration-react-vite/references/browser-sdk-2.md +4680 -0
  337. package/skills/integration/integration-ruby/SKILL.md +50 -0
  338. package/skills/integration/integration-ruby/references/EXAMPLE.md +420 -0
  339. package/skills/integration/integration-ruby/references/amplitude-quickstart.md +1845 -0
  340. package/skills/integration/integration-ruby/references/analytics.md +1778 -0
  341. package/skills/integration/integration-ruby/references/basic-integration-1.0-begin.md +43 -0
  342. package/skills/integration/integration-ruby/references/basic-integration-1.1-edit.md +35 -0
  343. package/skills/integration/integration-ruby/references/basic-integration-1.2-revise.md +23 -0
  344. package/skills/integration/integration-ruby/references/basic-integration-1.3-conclude.md +57 -0
  345. package/skills/integration/integration-ruby-on-rails/SKILL.md +55 -0
  346. package/skills/integration/integration-ruby-on-rails/references/EXAMPLE.md +1013 -0
  347. package/skills/integration/integration-ruby-on-rails/references/amplitude-quickstart.md +1845 -0
  348. package/skills/integration/integration-ruby-on-rails/references/analytics.md +1778 -0
  349. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.0-begin.md +43 -0
  350. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.1-edit.md +35 -0
  351. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.2-revise.md +23 -0
  352. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.3-conclude.md +57 -0
  353. package/skills/integration/integration-sveltekit/SKILL.md +47 -0
  354. package/skills/integration/integration-sveltekit/references/EXAMPLE.md +14121 -0
  355. package/skills/integration/integration-sveltekit/references/amplitude-quickstart.md +1845 -0
  356. package/skills/integration/integration-sveltekit/references/basic-integration-1.0-begin.md +43 -0
  357. package/skills/integration/integration-sveltekit/references/basic-integration-1.1-edit.md +35 -0
  358. package/skills/integration/integration-sveltekit/references/basic-integration-1.2-revise.md +23 -0
  359. package/skills/integration/integration-sveltekit/references/basic-integration-1.3-conclude.md +57 -0
  360. package/skills/integration/integration-sveltekit/references/browser-sdk-2.md +4680 -0
  361. package/skills/integration/integration-swift/SKILL.md +49 -0
  362. package/skills/integration/integration-swift/references/EXAMPLE.md +660 -0
  363. package/skills/integration/integration-swift/references/amplitude-quickstart.md +1845 -0
  364. package/skills/integration/integration-swift/references/analytics.md +1778 -0
  365. package/skills/integration/integration-swift/references/basic-integration-1.0-begin.md +43 -0
  366. package/skills/integration/integration-swift/references/basic-integration-1.1-edit.md +35 -0
  367. package/skills/integration/integration-swift/references/basic-integration-1.2-revise.md +23 -0
  368. package/skills/integration/integration-swift/references/basic-integration-1.3-conclude.md +57 -0
  369. package/skills/integration/integration-tanstack-start/SKILL.md +58 -0
  370. package/skills/integration/integration-tanstack-start/references/EXAMPLE.md +998 -0
  371. package/skills/integration/integration-tanstack-start/references/amplitude-quickstart.md +1845 -0
  372. package/skills/integration/integration-tanstack-start/references/basic-integration-1.0-begin.md +43 -0
  373. package/skills/integration/integration-tanstack-start/references/basic-integration-1.1-edit.md +35 -0
  374. package/skills/integration/integration-tanstack-start/references/basic-integration-1.2-revise.md +23 -0
  375. package/skills/integration/integration-tanstack-start/references/basic-integration-1.3-conclude.md +57 -0
  376. package/skills/integration/integration-tanstack-start/references/browser-sdk-2.md +4680 -0
  377. package/skills/integration/integration-vue-3/SKILL.md +46 -0
  378. package/skills/integration/integration-vue-3/references/EXAMPLE.md +846 -0
  379. package/skills/integration/integration-vue-3/references/amplitude-quickstart.md +1845 -0
  380. package/skills/integration/integration-vue-3/references/basic-integration-1.0-begin.md +43 -0
  381. package/skills/integration/integration-vue-3/references/basic-integration-1.1-edit.md +35 -0
  382. package/skills/integration/integration-vue-3/references/basic-integration-1.2-revise.md +23 -0
  383. package/skills/integration/integration-vue-3/references/basic-integration-1.3-conclude.md +57 -0
  384. package/skills/integration/integration-vue-3/references/browser-sdk-2.md +4680 -0
  385. package/skills/taxonomy/amplitude-quickstart-taxonomy-agent/SKILL.md +228 -0
  386. package/dist/src/ui/tui/components/TitleBar.d.ts +0 -8
  387. package/dist/src/ui/tui/components/TitleBar.js +0 -27
  388. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.d.ts +0 -7
  389. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.js +0 -101
  390. package/dist/src/utils/anthropic-status.d.ts +0 -17
  391. 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';
@@ -38,50 +38,75 @@ const markDone = (store, outcome, standalone, onComplete) => {
38
38
  }
39
39
  };
40
40
  export const SlackScreen = ({ store, standalone = false, onComplete, }) => {
41
- useSyncExternalStore((cb) => store.subscribe(cb), () => store.getSnapshot());
41
+ useWizardStore(store);
42
42
  const [phase, setPhase] = useState(Phase.Prompt);
43
- 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
+ }, []);
44
51
  const region = store.session.region ?? 'us';
45
52
  const isEu = region === 'eu';
46
53
  const appName = isEu ? 'Amplitude - EU' : 'Amplitude';
47
- // Fetch org name from the API if it wasn't populated during the SUSI flow
48
- // (e.g. returning users, or the standalone `slack` command).
54
+ // Check if Slack is already connected on mount auto-complete if so.
49
55
  useEffect(() => {
50
- logToFile(`[SlackScreen] selectedOrgName=${store.session.selectedOrgName ?? ''} credentials=${store.session.credentials ? 'present' : 'null'} region=${region}`);
51
- if (resolvedOrgName) {
52
- logToFile(`[SlackScreen] using existing orgName=${resolvedOrgName}`);
53
- return;
54
- }
56
+ let cancelled = false;
55
57
  const credentials = store.session.credentials;
56
- if (!credentials) {
57
- logToFile(`[SlackScreen] no credentials falling back to base URL`);
58
- 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
+ });
59
76
  }
60
- logToFile(`[SlackScreen] fetching org name via API`);
61
- void fetchAmplitudeUser(credentials.idToken ?? credentials.accessToken, region)
62
- .then((info) => {
63
- const name = info.orgs[0]?.name ?? null;
64
- logToFile(`[SlackScreen] API returned orgs=${JSON.stringify(info.orgs.map((o) => o.name))} using=${name}`);
65
- setResolvedOrgName(name);
66
- })
67
- .catch((err) => {
68
- logToFile(`[SlackScreen] API fetch failed: ${err instanceof Error ? err.message : String(err)}`);
69
- });
77
+ return () => {
78
+ cancelled = true;
79
+ };
70
80
  }, []);
71
- const settingsUrl = OUTBOUND_URLS.slackSettings((region ?? 'us'), store.session.selectedOrgId, resolvedOrgName);
81
+ const zone = (region ?? 'us');
82
+ const settingsUrl = OUTBOUND_URLS.slackSettings(zone, store.session.selectedOrgId);
83
+ const [openedUrl, setOpenedUrl] = useState(settingsUrl);
72
84
  const handleConnect = () => {
73
85
  setPhase(Phase.Opening);
74
- opn(settingsUrl, { wait: false }).catch(() => {
75
- /* fire-and-forget */
76
- });
77
- 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
+ }
78
103
  };
79
104
  const handleSkip = () => {
80
105
  markDone(store, SlackOutcome.Skipped, standalone, onComplete);
81
106
  };
82
107
  const handleDone = () => {
83
108
  setPhase(Phase.Done);
84
- setTimeout(() => markDone(store, SlackOutcome.Configured, standalone, onComplete), 1500);
109
+ timerRef.current = setTimeout(() => markDone(store, SlackOutcome.Configured, standalone, onComplete), 1500);
85
110
  };
86
- 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."] }) }))] })] }));
87
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 };
@@ -11,10 +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';
17
- import { FLAG_LLM_ANALYTICS } from '../../lib/feature-flags.js';
18
+ // Inlined to avoid tsx ESM resolution bug with dynamic import().
19
+ const FLAG_LLM_ANALYTICS = 'wizard-llm-analytics';
18
20
  export { TaskStatus, Screen, Overlay, Flow, RunPhase, McpOutcome, SlackOutcome, };
19
21
  export class WizardStore {
20
22
  // ── Internal nanostore atoms ─────────────────────────────────────
@@ -63,6 +65,7 @@ export class WizardStore {
63
65
  }
64
66
  set session(value) {
65
67
  this.$session.set(value);
68
+ this.emitChange();
66
69
  }
67
70
  get commandMode() {
68
71
  return this.$commandMode.get();
@@ -153,6 +156,19 @@ export class WizardStore {
153
156
  setRegion(region) {
154
157
  this.$session.setKey('region', region);
155
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
+ }
156
172
  this.emitChange();
157
173
  }
158
174
  /** Force the RegionSelect screen to re-appear (/region command). */
@@ -360,9 +376,13 @@ export class WizardStore {
360
376
  this.$session.setKey('selectedOrgName', org.name);
361
377
  this.$session.setKey('selectedWorkspaceId', workspace.id);
362
378
  this.$session.setKey('selectedWorkspaceName', workspace.name);
363
- // 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.
364
382
  void import('../../lib/ampli-config.js').then(({ writeAmpliConfig }) => {
365
- const zone = this.$session.get().pendingAuthCloudRegion ?? 'us';
383
+ const zone = this.$session.get().region ??
384
+ this.$session.get().pendingAuthCloudRegion ??
385
+ 'us';
366
386
  writeAmpliConfig(installDir, {
367
387
  OrgId: org.id,
368
388
  WorkspaceId: workspace.id,
@@ -403,7 +423,10 @@ export class WizardStore {
403
423
  }
404
424
  addDiscoveredFeature(feature) {
405
425
  if (!this.session.discoveredFeatures.includes(feature)) {
406
- this.session.discoveredFeatures.push(feature);
426
+ this.$session.setKey('discoveredFeatures', [
427
+ ...this.session.discoveredFeatures,
428
+ feature,
429
+ ]);
407
430
  this.emitChange();
408
431
  }
409
432
  }
@@ -421,11 +444,14 @@ export class WizardStore {
421
444
  }
422
445
  }
423
446
  if (!this.session.additionalFeatureQueue.includes(feature)) {
424
- this.session.additionalFeatureQueue.push(feature);
447
+ this.$session.setKey('additionalFeatureQueue', [
448
+ ...this.session.additionalFeatureQueue,
449
+ feature,
450
+ ]);
425
451
  }
426
452
  // Feature-specific flags
427
453
  if (feature === AdditionalFeature.LLM) {
428
- this.session.llmOptIn = true;
454
+ this.$session.setKey('llmOptIn', true);
429
455
  }
430
456
  analytics.wizardCapture('Feature Enabled', { feature });
431
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
- };
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Error classification for user-facing error messages.
3
+ *
4
+ * Transforms cryptic network errors and API failures into
5
+ * actionable messages with suggestions and docs links.
6
+ */
7
+ export interface ClassifiedError {
8
+ message: string;
9
+ suggestion: string;
10
+ docsUrl?: string;
11
+ retryable: boolean;
12
+ }
13
+ /** Classify a caught error into a user-friendly message. */
14
+ export declare function classifyError(err: unknown): ClassifiedError;