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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +5 -4
  9. package/dist/src/lib/constants.js +9 -11
  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 +5 -5
  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
@@ -11,15 +11,58 @@
11
11
  * Business logic reads from the session. Never calls a prompt.
12
12
  */
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.OutroKind = exports.SlackOutcome = exports.McpOutcome = exports.ADDITIONAL_FEATURE_PROMPTS = exports.ADDITIONAL_FEATURE_LABELS = exports.AdditionalFeature = exports.DiscoveredFeature = exports.RunPhase = void 0;
14
+ exports.OutroKind = exports.SlackOutcome = exports.McpOutcome = exports.ADDITIONAL_FEATURE_PROMPTS = exports.ADDITIONAL_FEATURE_LABELS = exports.AdditionalFeature = exports.DiscoveredFeature = exports.RunPhase = exports.CredentialsSchema = exports.CliArgsSchema = void 0;
15
15
  exports.buildSession = buildSession;
16
+ const zod_1 = require("zod");
17
+ /**
18
+ * Zod schema for CLI args passed to `buildSession()`.
19
+ * Coerces `projectId` from string to positive integer.
20
+ * All boolean flags default to false; `installDir` defaults to cwd.
21
+ */
22
+ exports.CliArgsSchema = zod_1.z.object({
23
+ projectId: zod_1.z
24
+ .union([zod_1.z.string(), zod_1.z.number()])
25
+ .optional()
26
+ .transform((v) => {
27
+ if (v === undefined || v === '')
28
+ return undefined;
29
+ const n = Number(v);
30
+ return Number.isInteger(n) && n > 0 ? n : undefined;
31
+ }),
32
+ installDir: zod_1.z.string().default(process.cwd()),
33
+ debug: zod_1.z.boolean().default(false),
34
+ verbose: zod_1.z.boolean().default(false),
35
+ ci: zod_1.z.boolean().default(false),
36
+ forceInstall: zod_1.z.boolean().default(false),
37
+ signup: zod_1.z.boolean().default(false),
38
+ localMcp: zod_1.z.boolean().default(false),
39
+ menu: zod_1.z.boolean().default(false),
40
+ benchmark: zod_1.z.boolean().default(false),
41
+ apiKey: zod_1.z.string().optional(),
42
+ integration: zod_1.z.string().optional(),
43
+ });
44
+ /**
45
+ * Zod schema for validated Amplitude credentials.
46
+ * Exported for incremental adoption at credential-construction sites.
47
+ */
48
+ exports.CredentialsSchema = zod_1.z.object({
49
+ accessToken: zod_1.z.string().min(1, 'accessToken is required'),
50
+ idToken: zod_1.z.string().optional(),
51
+ projectApiKey: zod_1.z.string().min(1, 'projectApiKey is required'),
52
+ host: zod_1.z.string().url('host must be a valid URL'),
53
+ projectId: zod_1.z.number(),
54
+ });
16
55
  function parseProjectIdArg(value) {
17
56
  if (value === undefined || value === '')
18
57
  return undefined;
19
58
  const n = Number(value);
20
59
  return Number.isInteger(n) && n > 0 ? n : undefined;
21
60
  }
22
- /** Lifecycle phase of the main work (agent run, MCP install, etc.) */
61
+ /**
62
+ * Lifecycle phase of the main work (agent run, MCP install, etc.)
63
+ * NOTE: Duplicated in src/ui/tui/session-constants.ts (ESM/CJS workaround).
64
+ * If you change these values, update that file too — a test enforces sync.
65
+ */
23
66
  exports.RunPhase = {
24
67
  /** Still gathering input (intro, setup screens) */
25
68
  Idle: 'idle',
@@ -69,20 +112,31 @@ exports.OutroKind = {
69
112
  * Build a WizardSession from CLI args, pre-populating whatever is known.
70
113
  */
71
114
  function buildSession(args) {
115
+ // Validate CLI args via Zod — warn on bad input but fall back to defaults
116
+ const parsed = exports.CliArgsSchema.safeParse(args);
117
+ if (!parsed.success) {
118
+ console.warn(`[wizard] Invalid CLI args (falling back to defaults): ${parsed.error.issues
119
+ .map((i) => `${i.path.join('.')}: ${i.message}`)
120
+ .join(', ')}`);
121
+ }
122
+ // Use Zod-validated data (with coerced projectId and defaults) when available
123
+ const validated = parsed.success ? parsed.data : args;
72
124
  return {
73
- debug: args.debug ?? false,
74
- verbose: args.verbose ?? false,
75
- forceInstall: args.forceInstall ?? false,
76
- installDir: args.installDir ?? process.cwd(),
77
- ci: args.ci ?? false,
78
- signup: args.signup ?? false,
79
- localMcp: args.localMcp ?? false,
80
- apiKey: args.apiKey,
81
- menu: args.menu ?? false,
82
- benchmark: args.benchmark ?? false,
83
- projectId: parseProjectIdArg(args.projectId),
125
+ debug: validated.debug ?? false,
126
+ verbose: validated.verbose ?? false,
127
+ forceInstall: validated.forceInstall ?? false,
128
+ installDir: validated.installDir ?? process.cwd(),
129
+ ci: validated.ci ?? false,
130
+ signup: validated.signup ?? false,
131
+ localMcp: validated.localMcp ?? false,
132
+ apiKey: validated.apiKey,
133
+ menu: validated.menu ?? false,
134
+ benchmark: validated.benchmark ?? false,
135
+ projectId: parsed.success
136
+ ? parsed.data.projectId
137
+ : parseProjectIdArg(args.projectId),
84
138
  setupConfirmed: false,
85
- integration: args.integration ?? null,
139
+ integration: validated.integration ?? null,
86
140
  frameworkContext: {},
87
141
  typescript: false,
88
142
  detectedFrameworkLabel: null,
@@ -125,5 +179,7 @@ function buildSession(args) {
125
179
  checklistChartComplete: false,
126
180
  checklistDashboardComplete: false,
127
181
  checklistComplete: false,
182
+ userEmail: null,
183
+ _restoredFromCheckpoint: false,
128
184
  };
129
185
  }
@@ -450,16 +450,31 @@ If the user gives feedback, revise your plan and call this tool again — loop u
450
450
  Returns: "approved", "skipped", or "feedback: <user message>"`, {
451
451
  events: zod_1.z
452
452
  .array(zod_1.z.object({
453
- name: zod_1.z.string().describe('Event name, e.g. "Button Clicked"'),
453
+ name: zod_1.z
454
+ .string()
455
+ .describe('Short lowercase event name using spaces for separators, e.g. "user signed up", "product added to cart", "search performed". This is displayed as a bold label — keep it concise (2-5 words). Do NOT put descriptions or file paths here.'),
454
456
  description: zod_1.z
455
457
  .string()
456
- .describe('When this event fires and what it tracks'),
458
+ .describe('When this event fires, what properties it includes, and where it will be placed (file path + function/component).'),
457
459
  }))
458
460
  .min(1)
459
461
  .describe('The list of events you plan to instrument'),
460
462
  }, async (args) => {
461
- (0, debug_1.logToFile)(`confirm_event_plan: ${args.events.length} events`);
462
- const decision = await (0, ui_1.getUI)().promptEventPlan(args.events);
463
+ const { DEMO_MODE } = await import('./constants.js');
464
+ // Light normalization truncate overly long names but don't try to
465
+ // extract names from descriptions. The UI reads proper event names
466
+ // from store.eventPlan (populated from the JSON file the agent writes).
467
+ const normalizedEvents = args.events.map((e) => ({
468
+ name: e.name.trim().length > 50
469
+ ? e.name.trim().slice(0, 45) + '…'
470
+ : e.name.trim(),
471
+ description: e.description?.trim() || '',
472
+ }));
473
+ const events = DEMO_MODE && normalizedEvents.length > 5
474
+ ? normalizedEvents.slice(0, 5)
475
+ : normalizedEvents;
476
+ (0, debug_1.logToFile)(`confirm_event_plan: ${events.length} events${DEMO_MODE ? ' (demo mode)' : ''}`);
477
+ const decision = await (0, ui_1.getUI)().promptEventPlan(events);
463
478
  let text;
464
479
  if (decision.decision === 'revised') {
465
480
  text = `feedback: ${decision.feedback}`;
@@ -17,4 +17,7 @@ export declare class ClaudeMCPClient extends DefaultMCPClient {
17
17
  constructor();
18
18
  isClientSupported(): Promise<boolean>;
19
19
  getConfigPath(): Promise<string>;
20
+ addServer(apiKey?: string, selectedFeatures?: string[], local?: boolean): Promise<{
21
+ success: boolean;
22
+ }>;
20
23
  }
@@ -59,5 +59,11 @@ class ClaudeMCPClient extends MCPClient_1.DefaultMCPClient {
59
59
  }
60
60
  throw new Error(`Unsupported platform: ${process.platform}`);
61
61
  }
62
+ async addServer(apiKey, selectedFeatures, local) {
63
+ // Claude Desktop config uses stdio transport, so we need mcp-remote
64
+ // to bridge to the remote streamable-http server. Use 'streamable-http'
65
+ // type so the URL points to /mcp (the documented endpoint), not /sse.
66
+ return this._addServerType(apiKey, 'streamable-http', selectedFeatures, local);
67
+ }
62
68
  }
63
69
  exports.ClaudeMCPClient = ClaudeMCPClient;
@@ -51,7 +51,9 @@ class CursorMCPClient extends MCPClient_1.DefaultMCPClient {
51
51
  return Promise.resolve(path.join(os.homedir(), '.cursor', 'mcp.json'));
52
52
  }
53
53
  getServerConfig(apiKey, type, selectedFeatures, local) {
54
- return (0, defaults_1.getNativeHTTPServerConfig)(apiKey, type, selectedFeatures, local);
54
+ const config = (0, defaults_1.getNativeHTTPServerConfig)(apiKey, type, selectedFeatures, local);
55
+ // Cursor requires an explicit transport field to use streamable-http
56
+ return { ...config, transport: 'streamable-http' };
55
57
  }
56
58
  async addServer(apiKey, selectedFeatures, local) {
57
59
  return this._addServerType(apiKey, 'streamable-http', selectedFeatures, local);
@@ -0,0 +1,91 @@
1
+ /**
2
+ * AgentUI — NDJSON implementation of WizardUI for --agent mode.
3
+ * Every method emits one JSON line to stdout for machine consumption.
4
+ * Prompts auto-approve; no interactivity.
5
+ */
6
+ import type { WizardUI, SpinnerHandle, EventPlanDecision } from './wizard-ui';
7
+ export declare class AgentUI implements WizardUI {
8
+ intro(message: string): void;
9
+ outro(message: string): void;
10
+ cancel(message: string, options?: {
11
+ docsUrl?: string;
12
+ }): void;
13
+ log: {
14
+ info(message: string): void;
15
+ warn(message: string): void;
16
+ error(message: string): void;
17
+ success(message: string): void;
18
+ step(message: string): void;
19
+ };
20
+ note(message: string): void;
21
+ pushStatus(message: string): void;
22
+ heartbeat(statuses: string[]): void;
23
+ spinner(): SpinnerHandle;
24
+ startRun(): void;
25
+ setRunError(error: Error): Promise<boolean>;
26
+ setCredentials(credentials: {
27
+ accessToken: string;
28
+ projectApiKey: string;
29
+ host: string;
30
+ projectId: number;
31
+ }): void;
32
+ setRegion(region: string): void;
33
+ setProjectHasData(value: boolean): void;
34
+ setDetectedFramework(label: string): void;
35
+ setLoginUrl(url: string | null): void;
36
+ onEnterScreen(_screen: string, _fn: () => void): void;
37
+ showServiceStatus(data: {
38
+ description: string;
39
+ statusPageUrl: string;
40
+ }): void;
41
+ showSettingsOverride(keys: string[], backupAndFix: () => boolean): Promise<void>;
42
+ promptConfirm(message: string): Promise<boolean>;
43
+ promptChoice(message: string, options: string[]): Promise<string>;
44
+ promptEventPlan(events: Array<{
45
+ name: string;
46
+ description: string;
47
+ }>): Promise<EventPlanDecision>;
48
+ syncTodos(todos: Array<{
49
+ content: string;
50
+ status: string;
51
+ activeForm?: string;
52
+ }>): void;
53
+ setEventPlan(events: Array<{
54
+ name: string;
55
+ description: string;
56
+ }>): void;
57
+ /**
58
+ * Prompt the agent caller to select an environment from pendingOrgs.
59
+ *
60
+ * Emits an NDJSON `prompt` event with all available orgs/workspaces/environments,
61
+ * then reads one JSON line from stdin with the selection.
62
+ *
63
+ * Expected stdin response:
64
+ * ```json
65
+ * { "orgId": "...", "workspaceId": "...", "env": "Production" }
66
+ * ```
67
+ *
68
+ * Falls back to auto-selecting the first environment if stdin is closed
69
+ * or no response is received within 60 seconds.
70
+ */
71
+ promptEnvironmentSelection(orgs: Array<{
72
+ id: string;
73
+ name: string;
74
+ workspaces: Array<{
75
+ id: string;
76
+ name: string;
77
+ environments?: Array<{
78
+ name: string;
79
+ rank: number;
80
+ app: {
81
+ id: string;
82
+ apiKey?: string | null;
83
+ } | null;
84
+ }> | null;
85
+ }>;
86
+ }>): Promise<{
87
+ orgId: string;
88
+ workspaceId: string;
89
+ env: string;
90
+ }>;
91
+ }
@@ -0,0 +1,277 @@
1
+ "use strict";
2
+ /**
3
+ * AgentUI — NDJSON implementation of WizardUI for --agent mode.
4
+ * Every method emits one JSON line to stdout for machine consumption.
5
+ * Prompts auto-approve; no interactivity.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.AgentUI = void 0;
9
+ const readline_1 = require("readline");
10
+ // ── Helpers ─────────────────────────────────────────────────────────
11
+ function emit(type, message, extra) {
12
+ const event = {
13
+ v: 1,
14
+ '@timestamp': new Date().toISOString(),
15
+ type,
16
+ message,
17
+ ...extra,
18
+ };
19
+ process.stdout.write(JSON.stringify(event) + '\n');
20
+ }
21
+ // ── Implementation ──────────────────────────────────────────────────
22
+ class AgentUI {
23
+ // ── Lifecycle ───────────────────────────────────────────────────────
24
+ intro(message) {
25
+ emit('lifecycle', message, { data: { event: 'intro' } });
26
+ }
27
+ outro(message) {
28
+ emit('lifecycle', message, { data: { event: 'outro' } });
29
+ }
30
+ cancel(message, options) {
31
+ emit('lifecycle', message, {
32
+ data: { event: 'cancel', docsUrl: options?.docsUrl },
33
+ });
34
+ }
35
+ // ── Logging ─────────────────────────────────────────────────────────
36
+ log = {
37
+ info(message) {
38
+ emit('log', message, { level: 'info' });
39
+ },
40
+ warn(message) {
41
+ emit('log', message, { level: 'warn' });
42
+ },
43
+ error(message) {
44
+ emit('log', message, { level: 'error' });
45
+ },
46
+ success(message) {
47
+ emit('log', message, { level: 'success' });
48
+ },
49
+ step(message) {
50
+ emit('log', message, { level: 'step' });
51
+ },
52
+ };
53
+ note(message) {
54
+ emit('status', message, { data: { kind: 'note' } });
55
+ }
56
+ pushStatus(message) {
57
+ emit('status', message, { data: { kind: 'push' } });
58
+ }
59
+ heartbeat(statuses) {
60
+ if (statuses.length === 0)
61
+ return;
62
+ emit('status', `heartbeat: ${statuses.length} active`, {
63
+ data: { kind: 'heartbeat', statuses },
64
+ });
65
+ }
66
+ // ── Spinner ─────────────────────────────────────────────────────────
67
+ spinner() {
68
+ return {
69
+ start(message) {
70
+ if (message) {
71
+ emit('status', message, {
72
+ data: { kind: 'spinner', state: 'start' },
73
+ });
74
+ }
75
+ },
76
+ stop(message) {
77
+ if (message) {
78
+ emit('status', message, { data: { kind: 'spinner', state: 'stop' } });
79
+ }
80
+ },
81
+ message(msg) {
82
+ if (msg) {
83
+ emit('status', msg, { data: { kind: 'spinner', state: 'update' } });
84
+ }
85
+ },
86
+ };
87
+ }
88
+ // ── Session state ───────────────────────────────────────────────────
89
+ startRun() {
90
+ emit('lifecycle', 'run_started', { data: { event: 'start_run' } });
91
+ }
92
+ // Security: stack traces redacted from NDJSON output to prevent path/secret leakage
93
+ setRunError(error) {
94
+ // Sanitize: strip URLs that may contain auth tokens in query params,
95
+ // and redact file paths that leak internal directory structure.
96
+ const sanitized = error.message
97
+ .replace(/https?:\/\/[^\s]+/g, '[URL redacted]')
98
+ .replace(/\/(?:Users|home|var|tmp)\/[^\s:]+/g, '[path redacted]');
99
+ emit('error', sanitized, {
100
+ data: { name: error.name },
101
+ });
102
+ return Promise.resolve(false);
103
+ }
104
+ // Security: accessToken and projectApiKey intentionally redacted from NDJSON output
105
+ setCredentials(credentials) {
106
+ emit('session_state', 'credentials_set', {
107
+ data: {
108
+ field: 'credentials',
109
+ host: credentials.host,
110
+ projectId: credentials.projectId,
111
+ },
112
+ });
113
+ }
114
+ setRegion(region) {
115
+ emit('session_state', `region: ${region}`, {
116
+ data: { field: 'region', value: region },
117
+ });
118
+ }
119
+ setProjectHasData(value) {
120
+ emit('session_state', `project_has_data: ${value}`, {
121
+ data: { field: 'projectHasData', value },
122
+ });
123
+ }
124
+ setDetectedFramework(label) {
125
+ emit('session_state', `framework: ${label}`, {
126
+ data: { field: 'detectedFramework', value: label },
127
+ });
128
+ }
129
+ setLoginUrl(url) {
130
+ emit('session_state', url ? `login_url: ${url}` : 'login_url_cleared', {
131
+ data: { field: 'loginUrl', value: url },
132
+ });
133
+ }
134
+ // ── Display state ───────────────────────────────────────────────────
135
+ onEnterScreen(_screen, _fn) {
136
+ // No screens in agent mode
137
+ }
138
+ // ── Service status ──────────────────────────────────────────────────
139
+ showServiceStatus(data) {
140
+ emit('diagnostic', data.description, {
141
+ data: { statusPageUrl: data.statusPageUrl },
142
+ });
143
+ }
144
+ showSettingsOverride(keys, backupAndFix) {
145
+ backupAndFix();
146
+ emit('status', 'settings_override auto-fixed', {
147
+ data: { kind: 'settings_override', keys },
148
+ });
149
+ return Promise.resolve();
150
+ }
151
+ // ── Prompts (auto-approve) ──────────────────────────────────────────
152
+ promptConfirm(message) {
153
+ emit('prompt', message, {
154
+ data: { promptType: 'confirm', autoResult: true },
155
+ });
156
+ return Promise.resolve(true);
157
+ }
158
+ promptChoice(message, options) {
159
+ const selected = options[0] ?? '';
160
+ emit('prompt', message, {
161
+ data: { promptType: 'choice', options, autoResult: selected },
162
+ });
163
+ return Promise.resolve(selected);
164
+ }
165
+ promptEventPlan(events) {
166
+ emit('result', 'event_plan auto-approved', {
167
+ data: { event: 'event_plan', events },
168
+ });
169
+ return Promise.resolve({ decision: 'approved' });
170
+ }
171
+ // ── Todos ───────────────────────────────────────────────────────────
172
+ syncTodos(todos) {
173
+ emit('progress', `todos: ${todos.length} total`, {
174
+ data: { todos },
175
+ });
176
+ }
177
+ // ── Event plan ──────────────────────────────────────────────────────
178
+ setEventPlan(events) {
179
+ emit('result', `event_plan: ${events.length} events`, {
180
+ data: { event: 'event_plan_set', events },
181
+ });
182
+ }
183
+ /**
184
+ * Prompt the agent caller to select an environment from pendingOrgs.
185
+ *
186
+ * Emits an NDJSON `prompt` event with all available orgs/workspaces/environments,
187
+ * then reads one JSON line from stdin with the selection.
188
+ *
189
+ * Expected stdin response:
190
+ * ```json
191
+ * { "orgId": "...", "workspaceId": "...", "env": "Production" }
192
+ * ```
193
+ *
194
+ * Falls back to auto-selecting the first environment if stdin is closed
195
+ * or no response is received within 60 seconds.
196
+ */
197
+ async promptEnvironmentSelection(orgs) {
198
+ // Build a sanitized view (no API keys exposed)
199
+ const sanitizedOrgs = orgs.map((org) => ({
200
+ id: org.id,
201
+ name: org.name,
202
+ workspaces: org.workspaces.map((ws) => ({
203
+ id: ws.id,
204
+ name: ws.name,
205
+ environments: (ws.environments ?? [])
206
+ .filter((e) => e.app?.apiKey)
207
+ .sort((a, b) => a.rank - b.rank)
208
+ .map((e) => ({ name: e.name, rank: e.rank })),
209
+ })),
210
+ }));
211
+ emit('prompt', 'Select an environment', {
212
+ data: {
213
+ promptType: 'environment_selection',
214
+ orgs: sanitizedOrgs,
215
+ },
216
+ });
217
+ // Read one line from stdin
218
+ try {
219
+ const line = await readStdinLine(60_000);
220
+ if (line) {
221
+ const parsed = JSON.parse(line);
222
+ if (parsed.orgId && parsed.workspaceId && parsed.env) {
223
+ return {
224
+ orgId: parsed.orgId,
225
+ workspaceId: parsed.workspaceId,
226
+ env: parsed.env,
227
+ };
228
+ }
229
+ }
230
+ }
231
+ catch {
232
+ // Stdin closed, timeout, or invalid JSON — fall through to auto-select
233
+ }
234
+ // Fallback: auto-select the first environment
235
+ for (const org of orgs) {
236
+ for (const ws of org.workspaces) {
237
+ const env = (ws.environments ?? [])
238
+ .filter((e) => e.app?.apiKey)
239
+ .sort((a, b) => a.rank - b.rank)[0];
240
+ if (env) {
241
+ emit('log', `Auto-selected environment: ${org.name} / ${ws.name} / ${env.name}`, {
242
+ level: 'warn',
243
+ });
244
+ return { orgId: org.id, workspaceId: ws.id, env: env.name };
245
+ }
246
+ }
247
+ }
248
+ throw new Error('No environments with API keys found');
249
+ }
250
+ }
251
+ exports.AgentUI = AgentUI;
252
+ /**
253
+ * Read a single line from stdin with a timeout.
254
+ * Returns null if stdin is not readable or times out.
255
+ */
256
+ function readStdinLine(timeoutMs) {
257
+ return new Promise((resolve) => {
258
+ if (!process.stdin.readable) {
259
+ resolve(null);
260
+ return;
261
+ }
262
+ const rl = (0, readline_1.createInterface)({ input: process.stdin });
263
+ const timer = setTimeout(() => {
264
+ rl.close();
265
+ resolve(null);
266
+ }, timeoutMs);
267
+ rl.once('line', (line) => {
268
+ clearTimeout(timer);
269
+ rl.close();
270
+ resolve(line.trim());
271
+ });
272
+ rl.once('close', () => {
273
+ clearTimeout(timer);
274
+ resolve(null);
275
+ });
276
+ });
277
+ }
@@ -98,7 +98,7 @@ class LoggingUI {
98
98
  }
99
99
  }
100
100
  showServiceStatus(data) {
101
- console.log(`▲ Claude/Anthropic services are experiencing issues.`);
101
+ console.log(`▲ The setup agent is temporarily unavailable.`);
102
102
  console.log(`│ Status: ${data.description}`);
103
103
  console.log(`│ Status page: ${data.statusPageUrl}`);
104
104
  console.log(`│ The wizard may not work reliably while services are affected.`);
@@ -1,3 +1,15 @@
1
+ /**
2
+ * App — Root component.
3
+ *
4
+ * Layout (top to bottom):
5
+ * 1. JourneyStepper (1 line) — progress through the flow
6
+ * 2. HeaderBar (1 line) — title + org/project context
7
+ * 3. Separator
8
+ * 4. Content area (flex grow) — active screen
9
+ * 5. ConsoleView bottom area — separator + hints + input
10
+ *
11
+ * No outer border. Full terminal width (capped at 120).
12
+ */
1
13
  import type { WizardStore } from './store.js';
2
14
  interface AppProps {
3
15
  store: WizardStore;
@@ -1,34 +1,45 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useMemo, useSyncExternalStore } from 'react';
3
- import { Box } from 'ink';
2
+ /**
3
+ * App Root component.
4
+ *
5
+ * Layout (top to bottom):
6
+ * 1. JourneyStepper (1 line) — progress through the flow
7
+ * 2. HeaderBar (1 line) — title + org/project context
8
+ * 3. Separator
9
+ * 4. Content area (flex grow) — active screen
10
+ * 5. ConsoleView bottom area — separator + hints + input
11
+ *
12
+ * No outer border. Full terminal width (capped at 120).
13
+ */
14
+ import { useMemo } from 'react';
15
+ import { Box, Text } from 'ink';
4
16
  import { createScreens, createServices } from './screen-registry.js';
5
17
  import { CommandModeContext } from './context/CommandModeContext.js';
6
18
  import { ConsoleView } from './components/ConsoleView.js';
7
- import { TitleBar } from './components/TitleBar.js';
19
+ import { HeaderBar } from './components/HeaderBar.js';
20
+ import { JourneyStepper } from './components/JourneyStepper.js';
8
21
  import { useStdoutDimensions } from './hooks/useStdoutDimensions.js';
9
- import { DissolveTransition } from './primitives/DissolveTransition.js';
10
- import { ScreenErrorBoundary } from './primitives/ScreenErrorBoundary.js';
11
- const MIN_WIDTH = 80;
12
- const MAX_WIDTH = 120;
13
- /** Height reserved for separator + response line + input + up to 5 picker items. */
14
- const CONSOLE_INPUT_HEIGHT = 8;
22
+ import { useWizardStore } from './hooks/useWizardStore.js';
23
+ import { DissolveTransition } from './primitives/index.js';
24
+ import { ScreenErrorBoundary } from './primitives/index.js';
25
+ import { Colors, Layout } from './styles.js';
26
+ /** Height reserved for stepper + header + separators + hint bar + input. */
27
+ const CHROME_HEIGHT = 8;
15
28
  function getContentWidth(terminalColumns) {
16
- if (terminalColumns < MIN_WIDTH)
29
+ if (terminalColumns < Layout.minWidth)
17
30
  return terminalColumns;
18
- return Math.min(MAX_WIDTH, terminalColumns);
31
+ return Math.min(Layout.maxWidth, terminalColumns);
19
32
  }
20
33
  export const App = ({ store }) => {
21
34
  const [columns, rows] = useStdoutDimensions();
22
35
  const services = useMemo(() => createServices(store.session.localMcp), []);
23
36
  const screens = useMemo(() => createScreens(store, services), [store, services]);
24
- useSyncExternalStore((cb) => store.subscribe(cb), () => store.getSnapshot());
37
+ useWizardStore(store);
25
38
  const width = getContentWidth(columns);
26
- const innerWidth = width - 2;
27
- // border(2) + titlebar(1) + gap(1) + console input area
28
- const contentHeight = Math.max(5, rows - 4 - CONSOLE_INPUT_HEIGHT);
29
- // innerWidth minus paddingX(1) on each side
30
- const contentAreaWidth = Math.max(10, innerWidth - 2);
39
+ const contentHeight = Math.max(5, rows - CHROME_HEIGHT);
40
+ const contentAreaWidth = Math.max(10, width - Layout.paddingX * 2);
31
41
  const direction = store.lastNavDirection === 'pop' ? 'right' : 'left';
32
42
  const activeScreen = screens[store.currentScreen] ?? null;
33
- return (_jsx(CommandModeContext.Provider, { value: store.commandMode, children: _jsx(Box, { flexDirection: "column", height: rows, width: columns, alignItems: "center", justifyContent: "flex-start", children: _jsxs(ConsoleView, { store: store, width: width, height: rows, children: [_jsx(TitleBar, { version: store.version, width: innerWidth, orgName: store.session.selectedOrgName, projectName: store.session.selectedProjectName }), _jsx(Box, { height: 1 }), _jsx(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1, overflow: "hidden", children: _jsx(DissolveTransition, { transitionKey: store.currentScreen, width: contentAreaWidth, height: contentHeight, direction: direction, children: _jsx(ScreenErrorBoundary, { store: store, retryToken: store.screenErrorRetry, children: activeScreen }) }) })] }) }) }));
43
+ const separator = Layout.separatorChar.repeat(Math.max(0, width - 2));
44
+ return (_jsx(CommandModeContext.Provider, { value: store.commandMode, children: _jsxs(Box, { flexDirection: "column", height: rows, width: columns, alignItems: "center", justifyContent: "flex-start", children: [_jsxs(Box, { flexDirection: "column", width: width, children: [_jsx(JourneyStepper, { store: store, width: width }), _jsx(HeaderBar, { width: width, orgName: store.session.selectedOrgName, projectName: store.session.selectedProjectName }), _jsx(Box, { paddingX: 1, children: _jsx(Text, { color: Colors.border, children: separator }) })] }), _jsx(ConsoleView, { store: store, width: width, height: rows - 3, children: _jsx(Box, { flexDirection: "column", flexGrow: 1, paddingX: Layout.paddingX, overflow: "hidden", children: _jsx(DissolveTransition, { transitionKey: store.currentScreen, width: contentAreaWidth, height: contentHeight, direction: direction, children: _jsx(ScreenErrorBoundary, { store: store, retryToken: store.screenErrorRetry, children: activeScreen }) }) }) })] }) }));
34
45
  };