@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
@@ -13,17 +13,17 @@ const LINES = [
13
13
  " `-ΦΦΦµµΦΦΦ''' ",
14
14
  ];
15
15
  const TEXT = LINES.join('\n');
16
- /** Amplitude blue gradient — bright core fading to dim. */
16
+ /** Amplitude brand gradient — deep purple to bright blue (from brand guide). */
17
17
  const WAVE_COLORS = [
18
- '#6b9af7', // light blue
19
- '#4478f2', // mid blue
20
- '#1e61f0', // Amplitude blue (brand)
21
- '#1a55d4', // deeper blue
22
- '#1549b8', // deep blue
23
- '#1a55d4', // deeper blue
24
- '#1e61f0', // Amplitude blue
25
- '#4478f2', // mid blue
26
- '#6b9af7', // light blue
18
+ '#311b8e', // deep purple (brand)
19
+ '#2a1da0', // mid purple-blue
20
+ '#2020b2', // transitional
21
+ '#1522c4', // mid blue
22
+ '#0c19df', // bright blue (brand)
23
+ '#1522c4', // mid blue
24
+ '#2020b2', // transitional
25
+ '#2a1da0', // mid purple-blue
26
+ '#311b8e', // deep purple
27
27
  ];
28
28
  /**
29
29
  * Characters substituted at each distance from the wave centre.
@@ -51,12 +51,12 @@ function applyHorizWave(line, rowWaveX) {
51
51
  })
52
52
  .join('');
53
53
  }
54
- export const AmplitudeLogo = ({ color = 'white' }) => (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: color, children: TEXT }) }));
54
+ export const AmplitudeLogo = ({ color = '#0c19df' }) => (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: color, children: TEXT }) }));
55
55
  /** AmplitudeLogo with a colour wave (vertical) and a horizontal dissolve wave. */
56
56
  export const AnimatedAmplitudeLogo = () => {
57
- // Vertical colour wave — advances every 110 ms
57
+ // Vertical colour wave — advances every 110ms
58
58
  const [colorFrame, setColorFrame] = useState(0);
59
- // Horizontal dissolve wave — tick advances every 50 ms
59
+ // Horizontal dissolve wave — tick advances every 50ms
60
60
  const [waveTick, setWaveTick] = useState(0);
61
61
  useEffect(() => {
62
62
  const id = setInterval(() => setColorFrame((f) => (f + 1) % WAVE_COLORS.length), 110);
@@ -66,11 +66,10 @@ export const AnimatedAmplitudeLogo = () => {
66
66
  const id = setInterval(() => setWaveTick((t) => t + 1), 50);
67
67
  return () => clearInterval(id);
68
68
  }, []);
69
- // One dissolve wave every 4 s (80 ticks). The wave travels for the first
70
- // 36 ticks (~1.8 s), sweeping from left edge to right edge; the remaining
71
- // 44 ticks the logo rests at full resolution.
69
+ // One dissolve sweep every 4s (80 ticks at 50ms). The wave travels for
70
+ // the first 54 ticks (~2.7s), then rests at full resolution for ~1.3s.
72
71
  const TICKS_PER_CYCLE = 80;
73
- const ACTIVE_TICKS = 54; // extra ticks to cover diagonal travel + right overshoot
72
+ const ACTIVE_TICKS = 54;
74
73
  const frameInCycle = waveTick % TICKS_PER_CYCLE;
75
74
  const waveX = frameInCycle < ACTIVE_TICKS
76
75
  ? Math.round((frameInCycle / (ACTIVE_TICKS - 1)) *
@@ -1,3 +1 @@
1
- export declare const AMP_BLUE = "#1E61F0";
2
- export declare const AMP_CYAN = "#00D4AA";
3
1
  export declare const AmplitudeTextLogo: () => import("react/jsx-runtime").JSX.Element;
@@ -8,24 +8,59 @@ const LOGO_LINES = [
8
8
  '██║ ██║██║ ╚═╝ ██║██║ ███████╗██║ ██║ ╚██████╔╝██████╔╝███████╗',
9
9
  '╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝',
10
10
  ];
11
- export const AMP_BLUE = '#1E61F0';
12
- export const AMP_CYAN = '#00D4AA';
11
+ /**
12
+ * Number of color segments per line. Each segment is a single <Text> element
13
+ * sharing one interpolated color. 10 segments x 6 lines = 60 elements total
14
+ * (vs ~430 with per-character rendering).
15
+ */
16
+ const SEGMENTS_PER_LINE = 10;
17
+ /**
18
+ * Brand gradient endpoints per row.
19
+ * Top rows: bright blue range. Bottom rows: deep purple to blue.
20
+ * Each entry is [leftColor, rightColor].
21
+ */
22
+ const ROW_GRADIENT = [
23
+ ['#0c19df', '#5533ff'], // row 0 — brightest
24
+ ['#1420d4', '#4a2df5'], // row 1
25
+ ['#1c22c8', '#3f27eb'], // row 2
26
+ ['#2420b8', '#3421e0'], // row 3
27
+ ['#2c1ea8', '#291bd6'], // row 4
28
+ ['#311b8e', '#0c19df'], // row 5 — deepest
29
+ ];
30
+ /** Linearly interpolate between two hex colors. t ∈ [0, 1]. */
13
31
  function lerpColor(a, b, t) {
14
- const ar = parseInt(a.slice(1, 3), 16), ag = parseInt(a.slice(3, 5), 16), ab = parseInt(a.slice(5, 7), 16);
15
- const br = parseInt(b.slice(1, 3), 16), bg = parseInt(b.slice(3, 5), 16), bb = parseInt(b.slice(5, 7), 16);
16
- const r = Math.round(ar + (br - ar) * t)
17
- .toString(16)
18
- .padStart(2, '0');
19
- const g = Math.round(ag + (bg - ag) * t)
20
- .toString(16)
21
- .padStart(2, '0');
22
- const bv = Math.round(ab + (bb - ab) * t)
32
+ const ar = parseInt(a.slice(1, 3), 16);
33
+ const ag = parseInt(a.slice(3, 5), 16);
34
+ const ab = parseInt(a.slice(5, 7), 16);
35
+ const br = parseInt(b.slice(1, 3), 16);
36
+ const bg = parseInt(b.slice(3, 5), 16);
37
+ const bb = parseInt(b.slice(5, 7), 16);
38
+ const r = Math.round(ar + (br - ar) * t);
39
+ const g = Math.round(ag + (bg - ag) * t);
40
+ const bl = Math.round(ab + (bb - ab) * t);
41
+ return `#${r.toString(16).padStart(2, '0')}${g
23
42
  .toString(16)
24
- .padStart(2, '0');
25
- return `#${r}${g}${bv}`;
43
+ .padStart(2, '0')}${bl.toString(16).padStart(2, '0')}`;
26
44
  }
27
- export const AmplitudeTextLogo = () => (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: LOGO_LINES.map((line, i) => {
28
- const chars = line.split('');
29
- const last = chars.length - 1;
30
- return (_jsx(Box, { flexDirection: "row", alignItems: "flex-start", children: chars.map((char, j) => (_jsx(Text, { color: lerpColor(AMP_BLUE, AMP_CYAN, last > 0 ? j / last : 0), children: char }, j))) }, i));
31
- }) }));
45
+ /**
46
+ * Pre-computed gradient lines. Built once at module load so React never
47
+ * recalculates colors during renders.
48
+ */
49
+ const GRADIENT_LINES = LOGO_LINES.map((line, rowIndex) => {
50
+ const [leftColor, rightColor] = ROW_GRADIENT[rowIndex];
51
+ const charsPerSegment = Math.ceil(line.length / SEGMENTS_PER_LINE);
52
+ const segments = [];
53
+ for (let s = 0; s < SEGMENTS_PER_LINE; s++) {
54
+ const start = s * charsPerSegment;
55
+ const end = Math.min(start + charsPerSegment, line.length);
56
+ const chars = line.slice(start, end);
57
+ if (!chars)
58
+ continue;
59
+ // Horizontal position for color interpolation
60
+ const t = line.length > 1 ? start / (line.length - 1) : 0;
61
+ const color = lerpColor(leftColor, rightColor, t);
62
+ segments.push({ chars, color });
63
+ }
64
+ return segments;
65
+ });
66
+ export const AmplitudeTextLogo = () => (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: GRADIENT_LINES.map((segments, rowIndex) => (_jsx(Box, { flexDirection: "row", children: segments.map((seg, s) => (_jsx(Text, { color: seg.color, children: seg.chars }, s))) }, rowIndex))) }));
@@ -0,0 +1,8 @@
1
+ /**
2
+ * BrailleSpinner — compact animated spinner using braille characters.
3
+ */
4
+ interface BrailleSpinnerProps {
5
+ color?: string;
6
+ }
7
+ export declare const BrailleSpinner: ({ color, }: BrailleSpinnerProps) => import("react/jsx-runtime").JSX.Element;
8
+ export {};
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * BrailleSpinner — compact animated spinner using braille characters.
4
+ */
5
+ import { Text } from 'ink';
6
+ import { useState, useEffect } from 'react';
7
+ import { SPINNER_FRAMES, SPINNER_INTERVAL, Colors } from '../styles.js';
8
+ export const BrailleSpinner = ({ color = Colors.active, }) => {
9
+ const [frame, setFrame] = useState(0);
10
+ useEffect(() => {
11
+ const id = setInterval(() => setFrame((f) => (f + 1) % SPINNER_FRAMES.length), SPINNER_INTERVAL);
12
+ return () => clearInterval(id);
13
+ }, []);
14
+ return _jsx(Text, { color: color, children: SPINNER_FRAMES[frame] });
15
+ };
@@ -1,23 +1,20 @@
1
1
  /**
2
- * ConsoleView — Full-screen bordered box.
2
+ * ConsoleView — Full-screen wrapper without outer border.
3
3
  *
4
- * Renders arbitrary children in the content area, with a persistent
5
- * slash-command / Claude-query input at the bottom.
6
- *
7
- * The input is dormant by default. Activation:
8
- * - "/" → activate in slash-command mode
9
- * - Tab → activate for free-text Claude query
10
- * Deactivation: Enter (submit) or Escape. Backspacing to empty also deactivates.
11
- *
12
- * While active, commandMode=true on the store disables all useScreenInput handlers.
4
+ * Layout: content area + separator + console input with prompt.
5
+ * Handles slash commands, AI queries, pending prompts, and error banners.
6
+ * KeyHintBar integrated above the input line.
13
7
  */
14
8
  import type { ReactNode } from 'react';
15
9
  import type { WizardStore } from '../store.js';
10
+ import { type KeyHint } from './KeyHintBar.js';
16
11
  interface ConsoleViewProps {
17
12
  store: WizardStore;
18
13
  width: number;
19
14
  height: number;
15
+ /** Extra key hints from the active screen. */
16
+ screenHints?: KeyHint[];
20
17
  children?: ReactNode;
21
18
  }
22
- export declare const ConsoleView: ({ store, width, height, children, }: ConsoleViewProps) => import("react/jsx-runtime").JSX.Element;
19
+ export declare const ConsoleView: ({ store, width, height, screenHints, children, }: ConsoleViewProps) => import("react/jsx-runtime").JSX.Element;
23
20
  export {};
@@ -1,29 +1,25 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /**
3
- * ConsoleView — Full-screen bordered box.
3
+ * ConsoleView — Full-screen wrapper without outer border.
4
4
  *
5
- * Renders arbitrary children in the content area, with a persistent
6
- * slash-command / Claude-query input at the bottom.
7
- *
8
- * The input is dormant by default. Activation:
9
- * - "/" → activate in slash-command mode
10
- * - Tab → activate for free-text Claude query
11
- * Deactivation: Enter (submit) or Escape. Backspacing to empty also deactivates.
12
- *
13
- * While active, commandMode=true on the store disables all useScreenInput handlers.
5
+ * Layout: content area + separator + console input with prompt.
6
+ * Handles slash commands, AI queries, pending prompts, and error banners.
7
+ * KeyHintBar integrated above the input line.
14
8
  */
15
9
  import { Box, Text, useInput } from 'ink';
16
- import { useState, useEffect, useSyncExternalStore } from 'react';
10
+ import { useState, useEffect } from 'react';
17
11
  import { Spinner } from '@inkjs/ui';
18
- import { OutroKind } from '../../../lib/wizard-session.js';
19
- import { SlashCommandInput } from '../primitives/SlashCommandInput.js';
20
- import { PickerMenu } from '../primitives/PickerMenu.js';
21
- import { Colors, Icons } from '../styles.js';
12
+ import { OutroKind } from '../session-constants.js';
13
+ import { SlashCommandInput } from '../primitives/index.js';
14
+ import { PickerMenu } from '../primitives/index.js';
15
+ import { Colors, Icons, Layout } from '../styles.js';
16
+ import { useWizardStore } from '../hooks/useWizardStore.js';
22
17
  import { Overlay } from '../router.js';
23
18
  import { queryConsole, resolveConsoleCredentials, buildSessionContext, } from '../../../lib/console-query.js';
24
- import { COMMANDS, getWhoamiText, parseFeedbackSlashInput, TEST_PROMPT, } from '../console-commands.js';
19
+ import { COMMANDS, getWhoamiText, parseFeedbackSlashInput, } from '../console-commands.js';
25
20
  import { analytics } from '../../../utils/analytics.js';
26
21
  import { trackWizardFeedback } from '../../../utils/track-wizard-feedback.js';
22
+ import { KeyHintBar } from './KeyHintBar.js';
27
23
  function executeCommand(raw, store) {
28
24
  const [cmd] = raw.trim().split(/\s+/);
29
25
  switch (cmd) {
@@ -37,7 +33,27 @@ function executeCommand(raw, store) {
37
33
  store.showLogoutOverlay();
38
34
  break;
39
35
  case '/whoami':
40
- store.setCommandFeedback(getWhoamiText(store.session));
36
+ // Show current data immediately, then refresh from API
37
+ store.setCommandFeedback(getWhoamiText(store.session), 30_000);
38
+ if (store.session.credentials?.idToken && store.session.region) {
39
+ void import('../../../lib/api.js').then(({ fetchAmplitudeUser }) => {
40
+ fetchAmplitudeUser(store.session.credentials.idToken, store.session.region)
41
+ .then((userInfo) => {
42
+ if (userInfo.email)
43
+ store.session.userEmail = userInfo.email;
44
+ const orgId = store.session.selectedOrgId;
45
+ if (orgId) {
46
+ const org = userInfo.orgs.find((o) => o.id === orgId);
47
+ if (org)
48
+ store.session.selectedOrgName = org.name;
49
+ }
50
+ store.setCommandFeedback(getWhoamiText(store.session), 30_000);
51
+ })
52
+ .catch(() => {
53
+ // Non-fatal — keep showing what we have
54
+ });
55
+ });
56
+ }
41
57
  break;
42
58
  case '/slack':
43
59
  store.showSlackOverlay();
@@ -55,8 +71,6 @@ function executeCommand(raw, store) {
55
71
  });
56
72
  break;
57
73
  }
58
- case '/test':
59
- return TEST_PROMPT;
60
74
  case '/mcp':
61
75
  store.showMcpOverlay();
62
76
  break;
@@ -71,7 +85,7 @@ function executeCommand(raw, store) {
71
85
  store.setCommandFeedback(`Unknown command: ${cmd}. Type / to see available commands.`);
72
86
  }
73
87
  }
74
- export const ConsoleView = ({ store, width, height, children, }) => {
88
+ export const ConsoleView = ({ store, width, height, screenHints, children, }) => {
75
89
  const [inputActive, setInputActive] = useState(false);
76
90
  const [initialValue, setInitialValue] = useState('');
77
91
  const [inputKey, setInputKey] = useState(0);
@@ -82,10 +96,10 @@ export const ConsoleView = ({ store, width, height, children, }) => {
82
96
  const [planInputMode, setPlanInputMode] = useState('options');
83
97
  const [planFeedbackText, setPlanFeedbackText] = useState('');
84
98
  const [planCursorVisible, setPlanCursorVisible] = useState(true);
85
- useSyncExternalStore((cb) => store.subscribe(cb), () => store.getSnapshot());
99
+ useWizardStore(store);
86
100
  const activate = (seed = '') => {
87
101
  setInitialValue(seed);
88
- setInputKey((k) => k + 1); // remount so initialValue takes effect
102
+ setInputKey((k) => k + 1);
89
103
  setInputActive(true);
90
104
  store.setCommandMode(true);
91
105
  };
@@ -97,13 +111,12 @@ export const ConsoleView = ({ store, width, height, children, }) => {
97
111
  const screenError = store.screenError;
98
112
  const showResponse = loading || !!response;
99
113
  const showFeedback = !showResponse && !!feedback;
100
- const innerWidth = width - 2;
101
- const separator = '─'.repeat(Math.max(0, innerWidth));
114
+ const innerWidth = width;
115
+ const separator = Layout.separatorChar.repeat(Math.max(0, innerWidth - 2));
102
116
  const responseIsLong = !!response && response.split('\n').length > 3;
103
117
  const pendingPrompt = store.pendingPrompt;
104
118
  // Watch for activation keys while the input is dormant
105
119
  useInput((char, key) => {
106
- // Escape or Q dismisses overlays: pending prompt (skip) or long response
107
120
  if (key.escape || char === 'q' || char === 'Q') {
108
121
  if (pendingPrompt && pendingPrompt.kind !== 'event-plan') {
109
122
  store.resolvePrompt(pendingPrompt.kind === 'confirm' ? false : '');
@@ -121,7 +134,9 @@ export const ConsoleView = ({ store, width, height, children, }) => {
121
134
  if (char === '/') {
122
135
  activate('/');
123
136
  }
124
- else if (key.tab) {
137
+ else if (key.tab &&
138
+ store.session.credentials !== null &&
139
+ store.session.introConcluded) {
125
140
  activate('');
126
141
  }
127
142
  }, { isActive: !inputActive });
@@ -147,7 +162,7 @@ export const ConsoleView = ({ store, width, height, children, }) => {
147
162
  .then((text) => {
148
163
  setResponse(text);
149
164
  setHistory((h) => [
150
- ...h,
165
+ ...h.slice(-8),
151
166
  { role: 'user', content: value },
152
167
  { role: 'assistant', content: text },
153
168
  ]);
@@ -165,7 +180,7 @@ export const ConsoleView = ({ store, width, height, children, }) => {
165
180
  const id = setInterval(() => setPlanCursorVisible((v) => !v), 530);
166
181
  return () => clearInterval(id);
167
182
  }, [planInputMode]);
168
- // Reset plan input state when the prompt clears (agent got the answer)
183
+ // Reset plan input state when the prompt clears
169
184
  useEffect(() => {
170
185
  if (!pendingPrompt) {
171
186
  setPlanInputMode('options');
@@ -200,9 +215,10 @@ export const ConsoleView = ({ store, width, height, children, }) => {
200
215
  }
201
216
  return;
202
217
  }
203
- // options mode
218
+ // options mode — require explicit Y to approve (Enter alone is too easy
219
+ // to hit accidentally while the plan is pending in the background)
204
220
  const lc = char.toLowerCase();
205
- if (lc === 'y' || key.return) {
221
+ if (lc === 'y') {
206
222
  store.resolveEventPlan({ decision: 'approved' });
207
223
  }
208
224
  else if (lc === 's') {
@@ -214,18 +230,19 @@ export const ConsoleView = ({ store, width, height, children, }) => {
214
230
  }, {
215
231
  isActive: !inputActive && !!pendingPrompt && pendingPrompt.kind === 'event-plan',
216
232
  });
217
- // Show the latest status message when an overlay is active — RunScreen's
218
- // own TabContainer handles this for the non-overlay case.
233
+ // Show the latest status message when an overlay is active
219
234
  const overlayValues = Object.values(Overlay);
220
235
  const isOverlay = overlayValues.includes(store.currentScreen);
221
236
  const lastStatus = isOverlay && store.statusMessages.length > 0
222
237
  ? store.statusMessages[store.statusMessages.length - 1]
223
238
  : null;
224
- return (_jsxs(Box, { width: width, height: height, flexDirection: "column", borderStyle: "round", borderColor: Colors.muted, children: [_jsx(Box, { flexDirection: "column", flexGrow: 1, overflow: "hidden", children: pendingPrompt ? (_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1, paddingY: 1, children: [pendingPrompt.kind === 'confirm' ? (_jsx(PickerMenu, { message: pendingPrompt.message, options: [
239
+ return (_jsxs(Box, { width: width, height: height, flexDirection: "column", children: [_jsx(Box, { flexDirection: "column", flexGrow: 1, overflow: "hidden", children: pendingPrompt ? (_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: Layout.paddingX, paddingY: 1, children: [pendingPrompt.kind === 'confirm' ? (_jsx(PickerMenu, { message: pendingPrompt.message, options: [
225
240
  { label: 'Yes', value: 'yes' },
226
241
  { label: 'No', value: 'no' },
227
242
  ], onSelect: (v) => store.resolvePrompt(v === 'yes') })) : pendingPrompt.kind === 'choice' ? (_jsx(PickerMenu, { message: pendingPrompt.message, options: pendingPrompt.options.map((o) => ({
228
243
  label: o,
229
244
  value: o,
230
- })), onSelect: (v) => store.resolvePrompt(v) })) : (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsx(Text, { color: Colors.primary, bold: true, children: "Instrumentation Plan" }), pendingPrompt.events.map((e) => (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: Colors.accent, bold: true, children: e.name }), _jsx(Text, { color: Colors.muted, children: e.description })] }, e.name))), planInputMode === 'feedback' ? (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: Colors.muted, children: "Feedback: " }), _jsxs(Text, { children: [planFeedbackText, planCursorVisible ? '▎' : ' '] }), _jsx(Text, { color: Colors.muted, children: "[Enter] send [Esc] cancel" })] })) : (_jsx(Text, { color: Colors.muted, children: "[Y] approve [S] skip [F] give feedback" }))] })), pendingPrompt.kind !== 'event-plan' && (_jsx(Text, { color: Colors.muted, children: " [Q / Esc] skip" }))] })) : responseIsLong ? (_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1, paddingY: 1, children: [_jsx(Box, { justifyContent: "flex-end", children: _jsx(Text, { color: Colors.muted, children: "[Q / Esc] close" }) }), _jsx(Text, { color: Colors.primary, children: response })] })) : (children) }), lastStatus && (_jsxs(Box, { paddingX: 1, overflow: "hidden", children: [_jsxs(Text, { color: Colors.muted, children: [Icons.diamondOpen, " "] }), _jsx(Text, { color: Colors.muted, wrap: "truncate-end", children: lastStatus })] })), screenError && (_jsxs(Box, { paddingX: 1, gap: 1, children: [_jsx(Text, { color: Colors.error, bold: true, children: "\u26A0" }), _jsx(Box, { flexGrow: 1, overflow: "hidden", children: _jsx(Text, { color: Colors.error, wrap: "truncate-end", children: screenError.message }) }), _jsx(Text, { color: Colors.muted, children: "[R] retry" })] })), _jsx(Text, { color: Colors.muted, children: separator }), showFeedback && (_jsxs(Box, { paddingX: 1, children: [_jsx(Text, { color: Colors.accent, bold: true, children: ' ' }), _jsx(Text, { color: Colors.muted, children: feedback })] })), showResponse && !responseIsLong && (_jsx(Box, { paddingX: 1, paddingY: 1, gap: 1, flexDirection: "column", children: loading ? (_jsx(Spinner, {})) : (_jsx(Text, { color: Colors.primary, children: response })) })), loading && responseIsLong && (_jsx(Box, { paddingX: 1, children: _jsx(Spinner, {}) })), _jsx(Box, { paddingX: 1, children: _jsx(SlashCommandInput, { commands: COMMANDS, isActive: inputActive, initialValue: initialValue, onSubmit: handleSubmit, onDeactivate: deactivate }, inputKey) })] }));
245
+ })), onSelect: (v) => store.resolvePrompt(v) })) : (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsx(Text, { color: Colors.muted, children: "Suggested events for your app:" }), _jsx(Text, { color: Colors.heading, bold: true, children: "Instrumentation Plan" }), pendingPrompt.events.map((e, i) => (_jsxs(Text, { wrap: "wrap", children: [_jsxs(Text, { color: Colors.accent, bold: true, children: [Icons.bullet, " ", e.name] }), e.description ? (_jsxs(Text, { color: Colors.secondary, children: [" \u2014 ", e.description] })) : null] }, e.name || i))), planInputMode === 'feedback' ? (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: Colors.muted, children: "Feedback: " }), _jsxs(Text, { children: [planFeedbackText, planCursorVisible ? '▎' : ' '] }), _jsx(Text, { color: Colors.muted, children: "[Enter] send [Esc] cancel" })] })) : (_jsx(Text, { color: Colors.muted, children: "[Y] approve [S] skip [F] give feedback" }))] })), pendingPrompt.kind !== 'event-plan' && (_jsx(Text, { color: Colors.muted, children: " [Q / Esc] skip" }))] })) : responseIsLong ? (_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: Layout.paddingX, paddingY: 1, overflow: "hidden", children: [_jsx(Text, { color: Colors.accent, children: response }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.muted, children: "[Q / Esc] close" }) })] })) : (children) }), lastStatus && (_jsxs(Box, { paddingX: Layout.paddingX, overflow: "hidden", children: [_jsxs(Text, { color: Colors.muted, children: [Icons.diamondOpen, " "] }), _jsx(Text, { color: Colors.muted, wrap: "truncate-end", children: lastStatus })] })), screenError && (_jsxs(Box, { paddingX: Layout.paddingX, gap: 1, children: [_jsx(Text, { color: Colors.error, bold: true, children: Icons.cross }), _jsx(Box, { flexGrow: 1, overflow: "hidden", children: _jsx(Text, { color: Colors.error, wrap: "truncate-end", children: screenError.message }) }), _jsx(Text, { color: Colors.muted, children: "[R] retry" })] })), _jsx(Box, { paddingX: 1, children: _jsx(Text, { color: Colors.border, children: separator }) }), showFeedback && (_jsxs(Box, { paddingX: Layout.paddingX, children: [_jsxs(Text, { color: Colors.accent, children: [Icons.prompt, " "] }), _jsx(Text, { color: Colors.secondary, children: feedback })] })), showResponse && !responseIsLong && (_jsx(Box, { paddingX: Layout.paddingX, paddingY: 1, gap: 1, flexDirection: "column", children: loading ? (_jsx(Spinner, {})) : (_jsx(Text, { color: Colors.accent, children: response })) })), loading && responseIsLong && (_jsx(Box, { paddingX: Layout.paddingX, children: _jsx(Spinner, {}) })), _jsx(KeyHintBar, { hints: screenHints, width: innerWidth, showAskHint: store.session.credentials !== null && store.session.introConcluded }), _jsxs(Box, { paddingX: Layout.paddingX, children: [_jsxs(Text, { color: inputActive ? Colors.accent : Colors.muted, children: [Icons.prompt, ' '] }), inputActive ? (_jsx(SlashCommandInput, { commands: COMMANDS, isActive: inputActive, initialValue: initialValue, onSubmit: handleSubmit, onDeactivate: deactivate }, inputKey)) : (_jsx(Text, { color: Colors.disabled, children: store.session.credentials !== null && store.session.introConcluded
246
+ ? 'Press / for commands or Tab to ask a question'
247
+ : 'Press / for commands' }))] })] }));
231
248
  };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * HeaderBar — minimal header line.
3
+ *
4
+ * "Amplitude Wizard" left, org/project right with dot separator.
5
+ */
6
+ interface HeaderBarProps {
7
+ width: number;
8
+ orgName?: string | null;
9
+ projectName?: string | null;
10
+ }
11
+ export declare const HeaderBar: ({ width, orgName, projectName }: HeaderBarProps) => import("react/jsx-runtime").JSX.Element;
12
+ export {};
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * HeaderBar — minimal header line.
4
+ *
5
+ * "Amplitude Wizard" left, org/project right with dot separator.
6
+ */
7
+ import { Box, Text } from 'ink';
8
+ import { Colors, Icons } from '../styles.js';
9
+ export const HeaderBar = ({ width, orgName, projectName }) => {
10
+ const contextParts = [];
11
+ if (orgName)
12
+ contextParts.push(orgName);
13
+ if (projectName)
14
+ contextParts.push(projectName);
15
+ const context = contextParts.join(' / ');
16
+ return (_jsxs(Box, { width: width, paddingX: 1, children: [_jsx(Box, { flexShrink: 0, children: _jsx(Text, { color: Colors.heading, bold: true, children: "Amplitude Wizard" }) }), context && (_jsxs(Box, { flexGrow: 1, justifyContent: "flex-end", overflow: "hidden", children: [_jsxs(Text, { color: Colors.muted, children: [" ", Icons.dot, " "] }), _jsx(Text, { color: Colors.secondary, wrap: "truncate-end", children: context })] }))] }));
17
+ };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * JourneyStepper — persistent 1-line progress indicator.
3
+ *
4
+ * Shows where the user is in the wizard flow:
5
+ * ✓ Welcome ✓ Auth ● Setup ○ Verify ○ Done
6
+ *
7
+ * Adapts to terminal width: shows labels on wide terminals,
8
+ * dots-only on narrow ones.
9
+ */
10
+ import type { WizardStore } from '../store.js';
11
+ interface JourneyStepperProps {
12
+ store: WizardStore;
13
+ width: number;
14
+ }
15
+ export declare const JourneyStepper: ({ store, width }: JourneyStepperProps) => import("react/jsx-runtime").JSX.Element | null;
16
+ export {};
@@ -0,0 +1,83 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * JourneyStepper — persistent 1-line progress indicator.
4
+ *
5
+ * Shows where the user is in the wizard flow:
6
+ * ✓ Welcome ✓ Auth ● Setup ○ Verify ○ Done
7
+ *
8
+ * Adapts to terminal width: shows labels on wide terminals,
9
+ * dots-only on narrow ones.
10
+ */
11
+ import { Box, Text } from 'ink';
12
+ import { useWizardStore } from '../hooks/useWizardStore.js';
13
+ import { Screen, Flow } from '../router.js';
14
+ import { Colors, Icons, Brand } from '../styles.js';
15
+ /** Human-readable labels for wizard flow steps. */
16
+ const WIZARD_STEPS = [
17
+ { screen: Screen.Intro, label: 'Welcome' },
18
+ { screen: Screen.Auth, label: 'Auth' },
19
+ { screen: Screen.Run, label: 'Setup' },
20
+ { screen: Screen.DataIngestionCheck, label: 'Verify' },
21
+ { screen: Screen.Checklist, label: 'Explore' },
22
+ { screen: Screen.Outro, label: 'Done' },
23
+ ];
24
+ /** Screens that belong to each step (for grouping substeps). */
25
+ const STEP_SCREENS = {
26
+ Welcome: [Screen.Intro],
27
+ Auth: [Screen.RegionSelect, Screen.Auth, Screen.DataSetup],
28
+ Setup: [Screen.ActivationOptions, Screen.Setup, Screen.Run, Screen.Mcp],
29
+ Verify: [Screen.DataIngestionCheck],
30
+ Explore: [Screen.Checklist, Screen.Slack],
31
+ Done: [Screen.Outro],
32
+ };
33
+ function getStepState(stepLabel, currentScreen, completedScreens) {
34
+ const screens = STEP_SCREENS[stepLabel] ?? [];
35
+ const isCurrent = screens.some((s) => s === currentScreen);
36
+ if (isCurrent)
37
+ return 'active';
38
+ // A step is completed if all its screens are completed
39
+ const allDone = screens.every((s) => completedScreens.has(s));
40
+ if (allDone)
41
+ return 'completed';
42
+ return 'future';
43
+ }
44
+ /** Build set of screens the flow has already passed. */
45
+ function getCompletedScreens(currentScreen) {
46
+ const completed = new Set();
47
+ const allScreensInOrder = WIZARD_STEPS.flatMap((step) => STEP_SCREENS[step.label] ?? []);
48
+ for (const screen of allScreensInOrder) {
49
+ if (screen === currentScreen)
50
+ break;
51
+ completed.add(screen);
52
+ }
53
+ return completed;
54
+ }
55
+ export const JourneyStepper = ({ store, width }) => {
56
+ useWizardStore(store);
57
+ // Only show stepper for the main wizard flow
58
+ if (store.router.activeFlow !== Flow.Wizard)
59
+ return null;
60
+ const currentScreen = store.currentScreen;
61
+ const completedScreens = getCompletedScreens(currentScreen);
62
+ // Determine if we have room for labels (need ~50 chars for all labels)
63
+ const showLabels = width >= 60;
64
+ const steps = WIZARD_STEPS.map((step) => {
65
+ const state = getStepState(step.label, currentScreen, completedScreens);
66
+ return { ...step, state };
67
+ });
68
+ return (_jsx(Box, { paddingX: 1, children: steps.map((step, i) => {
69
+ const icon = step.state === 'completed'
70
+ ? Icons.checkmark
71
+ : step.state === 'active'
72
+ ? Icons.bullet
73
+ : Icons.bulletOpen;
74
+ const color = step.state === 'completed'
75
+ ? Brand.lilac
76
+ : step.state === 'active'
77
+ ? Colors.accent
78
+ : Colors.muted;
79
+ return (_jsxs(Box, { children: [_jsx(Text, { color: color, bold: step.state === 'active', children: icon }), showLabels && (_jsx(Text, { color: color, bold: step.state === 'active', children: step.state === 'active'
80
+ ? ` ${step.label} ←`
81
+ : ` ${step.label}` })), i < steps.length - 1 && (_jsx(Text, { color: Colors.border, children: showLabels ? ` ${Icons.dash} ` : ` ${Icons.dot} ` }))] }, step.label));
82
+ }) }));
83
+ };
@@ -0,0 +1,19 @@
1
+ /**
2
+ * KeyHintBar — context-sensitive keyboard shortcut display.
3
+ *
4
+ * Each screen declares its available keys; the bar renders them.
5
+ * Always shows / and Tab hints so users discover commands and questions.
6
+ */
7
+ export interface KeyHint {
8
+ key: string;
9
+ label: string;
10
+ }
11
+ interface KeyHintBarProps {
12
+ hints?: KeyHint[];
13
+ width: number;
14
+ showDefaults?: boolean;
15
+ /** When false, hides the "Tab → Ask a question" hint (e.g. before auth). */
16
+ showAskHint?: boolean;
17
+ }
18
+ export declare const KeyHintBar: ({ hints, width, showDefaults, showAskHint, }: KeyHintBarProps) => import("react/jsx-runtime").JSX.Element;
19
+ export {};
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * KeyHintBar — context-sensitive keyboard shortcut display.
4
+ *
5
+ * Each screen declares its available keys; the bar renders them.
6
+ * Always shows / and Tab hints so users discover commands and questions.
7
+ */
8
+ import { Box, Text } from 'ink';
9
+ import { Colors } from '../styles.js';
10
+ const COMMANDS_HINT = { key: '/', label: 'Commands' };
11
+ const ASK_HINT = { key: 'Tab', label: 'Ask a question' };
12
+ export const KeyHintBar = ({ hints = [], width, showDefaults = true, showAskHint = true, }) => {
13
+ const defaults = showDefaults
14
+ ? showAskHint
15
+ ? [COMMANDS_HINT, ASK_HINT]
16
+ : [COMMANDS_HINT]
17
+ : [];
18
+ const allHints = [...hints, ...defaults];
19
+ return (_jsx(Box, { width: width, paddingX: 1, gap: 2, children: allHints.map((hint) => (_jsxs(Box, { children: [_jsx(Text, { color: Colors.muted, children: "[" }), _jsx(Text, { color: Colors.body, bold: true, children: hint.key }), _jsxs(Text, { color: Colors.muted, children: ["] ", hint.label] })] }, hint.key + hint.label))) }));
20
+ };
@@ -9,9 +9,8 @@ export declare const COMMANDS: {
9
9
  cmd: string;
10
10
  desc: string;
11
11
  }[];
12
- export declare const TEST_PROMPT: string;
13
12
  /** Returns the feedback text for the /whoami command. */
14
- export declare function getWhoamiText(session: Pick<WizardSession, 'selectedOrgName' | 'selectedWorkspaceName' | 'region'>): string;
13
+ export declare function getWhoamiText(session: Pick<WizardSession, 'selectedOrgId' | 'selectedOrgName' | 'selectedWorkspaceName' | 'selectedProjectName' | 'region' | 'credentials' | 'userEmail'>): string;
15
14
  /**
16
15
  * Parses `/feedback <message>` from a slash command line.
17
16
  * Returns `undefined` if the line is not a feedback command or the message is empty.