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

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 (392) hide show
  1. package/LICENSE +25 -1
  2. package/README.md +171 -74
  3. package/dist/bin.js +338 -222
  4. package/dist/src/lib/agent-interface.js +64 -9
  5. package/dist/src/lib/agent-runner.js +1 -10
  6. package/dist/src/lib/api.d.ts +22 -4
  7. package/dist/src/lib/api.js +114 -12
  8. package/dist/src/lib/commandments.js +14 -1
  9. package/dist/src/lib/constants.d.ts +6 -5
  10. package/dist/src/lib/constants.js +13 -13
  11. package/dist/src/lib/credential-resolution.d.ts +45 -0
  12. package/dist/src/lib/credential-resolution.js +311 -0
  13. package/dist/src/lib/exit-codes.d.ts +10 -0
  14. package/dist/src/lib/exit-codes.js +12 -0
  15. package/dist/src/lib/health-checks/statuspage.d.ts +1 -0
  16. package/dist/src/lib/health-checks/statuspage.js +5 -1
  17. package/dist/src/lib/mode-config.d.ts +14 -0
  18. package/dist/src/lib/mode-config.js +14 -0
  19. package/dist/src/lib/session-checkpoint.d.ts +27 -0
  20. package/dist/src/lib/session-checkpoint.js +134 -0
  21. package/dist/src/lib/wizard-session.d.ts +44 -1
  22. package/dist/src/lib/wizard-session.js +70 -14
  23. package/dist/src/lib/wizard-tools.js +19 -4
  24. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +3 -0
  25. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +6 -0
  26. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +3 -1
  27. package/dist/src/ui/agent-ui.d.ts +91 -0
  28. package/dist/src/ui/agent-ui.js +277 -0
  29. package/dist/src/ui/logging-ui.js +1 -1
  30. package/dist/src/ui/tui/App.d.ts +12 -0
  31. package/dist/src/ui/tui/App.js +29 -18
  32. package/dist/src/ui/tui/components/AmplitudeLogo.js +16 -17
  33. package/dist/src/ui/tui/components/AmplitudeTextLogo.d.ts +0 -2
  34. package/dist/src/ui/tui/components/AmplitudeTextLogo.js +53 -18
  35. package/dist/src/ui/tui/components/BrailleSpinner.d.ts +8 -0
  36. package/dist/src/ui/tui/components/BrailleSpinner.js +15 -0
  37. package/dist/src/ui/tui/components/ConsoleView.d.ts +8 -11
  38. package/dist/src/ui/tui/components/ConsoleView.js +51 -34
  39. package/dist/src/ui/tui/components/HeaderBar.d.ts +12 -0
  40. package/dist/src/ui/tui/components/HeaderBar.js +17 -0
  41. package/dist/src/ui/tui/components/JourneyStepper.d.ts +16 -0
  42. package/dist/src/ui/tui/components/JourneyStepper.js +83 -0
  43. package/dist/src/ui/tui/components/KeyHintBar.d.ts +19 -0
  44. package/dist/src/ui/tui/components/KeyHintBar.js +20 -0
  45. package/dist/src/ui/tui/console-commands.d.ts +1 -2
  46. package/dist/src/ui/tui/console-commands.js +48 -7
  47. package/dist/src/ui/tui/flows.d.ts +1 -1
  48. package/dist/src/ui/tui/flows.js +1 -1
  49. package/dist/src/ui/tui/hooks/useAsyncEffect.d.ts +15 -0
  50. package/dist/src/ui/tui/hooks/useAsyncEffect.js +35 -0
  51. package/dist/src/ui/tui/hooks/useWizardStore.d.ts +9 -0
  52. package/dist/src/ui/tui/hooks/useWizardStore.js +11 -0
  53. package/dist/src/ui/tui/ink-ui.js +1 -1
  54. package/dist/src/ui/tui/primitives/DissolveTransition.js +4 -5
  55. package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +3 -1
  56. package/dist/src/ui/tui/primitives/EventPlanViewer.js +8 -3
  57. package/dist/src/ui/tui/primitives/ProgressList.js +1 -1
  58. package/dist/src/ui/tui/primitives/SlashCommandInput.js +19 -4
  59. package/dist/src/ui/tui/primitives/SplitView.d.ts +2 -1
  60. package/dist/src/ui/tui/primitives/SplitView.js +10 -2
  61. package/dist/src/ui/tui/primitives/TabContainer.js +10 -2
  62. package/dist/src/ui/tui/primitives/index.d.ts +0 -1
  63. package/dist/src/ui/tui/primitives/index.js +0 -1
  64. package/dist/src/ui/tui/router.js +1 -1
  65. package/dist/src/ui/tui/screen-registry.d.ts +0 -7
  66. package/dist/src/ui/tui/screen-registry.js +13 -4
  67. package/dist/src/ui/tui/screens/ActivationOptionsScreen.d.ts +2 -2
  68. package/dist/src/ui/tui/screens/ActivationOptionsScreen.js +8 -8
  69. package/dist/src/ui/tui/screens/AuthScreen.js +57 -27
  70. package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +2 -12
  71. package/dist/src/ui/tui/screens/ChecklistScreen.js +22 -33
  72. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +3 -12
  73. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +109 -39
  74. package/dist/src/ui/tui/screens/DataSetupScreen.d.ts +3 -3
  75. package/dist/src/ui/tui/screens/DataSetupScreen.js +17 -10
  76. package/dist/src/ui/tui/screens/IntroScreen.d.ts +5 -3
  77. package/dist/src/ui/tui/screens/IntroScreen.js +132 -41
  78. package/dist/src/ui/tui/screens/LoginScreen.d.ts +1 -1
  79. package/dist/src/ui/tui/screens/LoginScreen.js +4 -4
  80. package/dist/src/ui/tui/screens/LogoutScreen.d.ts +4 -2
  81. package/dist/src/ui/tui/screens/LogoutScreen.js +17 -5
  82. package/dist/src/ui/tui/screens/McpScreen.d.ts +4 -4
  83. package/dist/src/ui/tui/screens/McpScreen.js +25 -17
  84. package/dist/src/ui/tui/screens/OutageScreen.d.ts +1 -1
  85. package/dist/src/ui/tui/screens/OutageScreen.js +5 -5
  86. package/dist/src/ui/tui/screens/OutroScreen.d.ts +5 -0
  87. package/dist/src/ui/tui/screens/OutroScreen.js +21 -14
  88. package/dist/src/ui/tui/screens/RegionSelectScreen.js +15 -13
  89. package/dist/src/ui/tui/screens/RunScreen.d.ts +7 -5
  90. package/dist/src/ui/tui/screens/RunScreen.js +102 -157
  91. package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +1 -1
  92. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +6 -5
  93. package/dist/src/ui/tui/screens/SetupScreen.d.ts +1 -1
  94. package/dist/src/ui/tui/screens/SetupScreen.js +7 -7
  95. package/dist/src/ui/tui/screens/SlackScreen.d.ts +2 -2
  96. package/dist/src/ui/tui/screens/SlackScreen.js +60 -35
  97. package/dist/src/ui/tui/session-constants.d.ts +41 -0
  98. package/dist/src/ui/tui/session-constants.js +38 -0
  99. package/dist/src/ui/tui/start-tui.d.ts +3 -1
  100. package/dist/src/ui/tui/start-tui.js +14 -10
  101. package/dist/src/ui/tui/store.d.ts +2 -1
  102. package/dist/src/ui/tui/store.js +33 -7
  103. package/dist/src/ui/tui/styles.d.ts +75 -19
  104. package/dist/src/ui/tui/styles.js +101 -19
  105. package/dist/src/ui/tui/utils/classify-error.d.ts +14 -0
  106. package/dist/src/ui/tui/utils/classify-error.js +90 -0
  107. package/dist/src/ui/tui/utils/diagnostics.d.ts +21 -0
  108. package/dist/src/ui/tui/utils/diagnostics.js +72 -0
  109. package/dist/src/ui/tui/utils/with-retry.d.ts +12 -0
  110. package/dist/src/ui/tui/utils/with-retry.js +32 -0
  111. package/dist/src/ui/tui/utils/with-timeout.d.ts +10 -0
  112. package/dist/src/ui/tui/utils/with-timeout.js +24 -0
  113. package/dist/src/utils/ampli-settings.d.ts +1 -1
  114. package/dist/src/utils/ampli-settings.js +15 -5
  115. package/dist/src/utils/api-key-store.js +5 -5
  116. package/dist/src/utils/atomic-write.d.ts +15 -0
  117. package/dist/src/utils/atomic-write.js +34 -0
  118. package/dist/src/utils/setup-utils.js +2 -2
  119. package/dist/src/utils/token-refresh.d.ts +22 -0
  120. package/dist/src/utils/token-refresh.js +79 -0
  121. package/dist/src/utils/wizard-abort.js +6 -1
  122. package/package.json +6 -6
  123. package/skills/instrumentation/add-analytics-instrumentation/SKILL.md +142 -0
  124. package/skills/instrumentation/diff-intake/SKILL.md +128 -0
  125. package/skills/instrumentation/discover-analytics-patterns/SKILL.md +185 -0
  126. package/skills/instrumentation/discover-event-surfaces/SKILL.md +322 -0
  127. package/skills/instrumentation/discover-event-surfaces/references/best-practices.md +563 -0
  128. package/skills/instrumentation/instrument-events/SKILL.md +169 -0
  129. package/skills/instrumentation/instrument-events/references/best-practices.md +563 -0
  130. package/skills/integration/integration-android/SKILL.md +49 -0
  131. package/skills/integration/integration-android/references/EXAMPLE.md +1977 -0
  132. package/skills/integration/integration-android/references/amplitude-quickstart.md +1845 -0
  133. package/skills/integration/integration-android/references/analytics.md +1778 -0
  134. package/skills/integration/integration-android/references/basic-integration-1.0-begin.md +43 -0
  135. package/skills/integration/integration-android/references/basic-integration-1.1-edit.md +35 -0
  136. package/skills/integration/integration-android/references/basic-integration-1.2-revise.md +23 -0
  137. package/skills/integration/integration-android/references/basic-integration-1.3-conclude.md +57 -0
  138. package/skills/integration/integration-angular/SKILL.md +49 -0
  139. package/skills/integration/integration-angular/references/EXAMPLE.md +899 -0
  140. package/skills/integration/integration-angular/references/amplitude-quickstart.md +1845 -0
  141. package/skills/integration/integration-angular/references/basic-integration-1.0-begin.md +43 -0
  142. package/skills/integration/integration-angular/references/basic-integration-1.1-edit.md +35 -0
  143. package/skills/integration/integration-angular/references/basic-integration-1.2-revise.md +23 -0
  144. package/skills/integration/integration-angular/references/basic-integration-1.3-conclude.md +57 -0
  145. package/skills/integration/integration-angular/references/browser-sdk-2.md +4680 -0
  146. package/skills/integration/integration-astro-hybrid/SKILL.md +56 -0
  147. package/skills/integration/integration-astro-hybrid/references/EXAMPLE.md +1095 -0
  148. package/skills/integration/integration-astro-hybrid/references/amplitude-quickstart.md +1845 -0
  149. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.0-begin.md +43 -0
  150. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.1-edit.md +35 -0
  151. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.2-revise.md +23 -0
  152. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.3-conclude.md +57 -0
  153. package/skills/integration/integration-astro-hybrid/references/browser-sdk-2.md +4680 -0
  154. package/skills/integration/integration-astro-ssr/SKILL.md +52 -0
  155. package/skills/integration/integration-astro-ssr/references/EXAMPLE.md +1106 -0
  156. package/skills/integration/integration-astro-ssr/references/amplitude-quickstart.md +1845 -0
  157. package/skills/integration/integration-astro-ssr/references/basic-integration-1.0-begin.md +43 -0
  158. package/skills/integration/integration-astro-ssr/references/basic-integration-1.1-edit.md +35 -0
  159. package/skills/integration/integration-astro-ssr/references/basic-integration-1.2-revise.md +23 -0
  160. package/skills/integration/integration-astro-ssr/references/basic-integration-1.3-conclude.md +57 -0
  161. package/skills/integration/integration-astro-ssr/references/browser-sdk-2.md +4680 -0
  162. package/skills/integration/integration-astro-static/SKILL.md +49 -0
  163. package/skills/integration/integration-astro-static/references/EXAMPLE.md +910 -0
  164. package/skills/integration/integration-astro-static/references/amplitude-quickstart.md +1845 -0
  165. package/skills/integration/integration-astro-static/references/basic-integration-1.0-begin.md +43 -0
  166. package/skills/integration/integration-astro-static/references/basic-integration-1.1-edit.md +35 -0
  167. package/skills/integration/integration-astro-static/references/basic-integration-1.2-revise.md +23 -0
  168. package/skills/integration/integration-astro-static/references/basic-integration-1.3-conclude.md +57 -0
  169. package/skills/integration/integration-astro-static/references/browser-sdk-2.md +4680 -0
  170. package/skills/integration/integration-astro-view-transitions/SKILL.md +51 -0
  171. package/skills/integration/integration-astro-view-transitions/references/EXAMPLE.md +979 -0
  172. package/skills/integration/integration-astro-view-transitions/references/amplitude-quickstart.md +1845 -0
  173. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.0-begin.md +43 -0
  174. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.1-edit.md +35 -0
  175. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.2-revise.md +23 -0
  176. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.3-conclude.md +57 -0
  177. package/skills/integration/integration-astro-view-transitions/references/browser-sdk-2.md +4680 -0
  178. package/skills/integration/integration-django/SKILL.md +57 -0
  179. package/skills/integration/integration-django/references/EXAMPLE.md +1005 -0
  180. package/skills/integration/integration-django/references/amplitude-quickstart.md +1845 -0
  181. package/skills/integration/integration-django/references/basic-integration-1.0-begin.md +43 -0
  182. package/skills/integration/integration-django/references/basic-integration-1.1-edit.md +35 -0
  183. package/skills/integration/integration-django/references/basic-integration-1.2-revise.md +23 -0
  184. package/skills/integration/integration-django/references/basic-integration-1.3-conclude.md +57 -0
  185. package/skills/integration/integration-django/references/python.md +1424 -0
  186. package/skills/integration/integration-expo/SKILL.md +53 -0
  187. package/skills/integration/integration-expo/references/EXAMPLE.md +1291 -0
  188. package/skills/integration/integration-expo/references/amplitude-quickstart.md +1845 -0
  189. package/skills/integration/integration-expo/references/basic-integration-1.0-begin.md +43 -0
  190. package/skills/integration/integration-expo/references/basic-integration-1.1-edit.md +35 -0
  191. package/skills/integration/integration-expo/references/basic-integration-1.2-revise.md +23 -0
  192. package/skills/integration/integration-expo/references/basic-integration-1.3-conclude.md +57 -0
  193. package/skills/integration/integration-expo/references/react-native-sdk.md +2819 -0
  194. package/skills/integration/integration-fastapi/SKILL.md +57 -0
  195. package/skills/integration/integration-fastapi/references/EXAMPLE.md +1389 -0
  196. package/skills/integration/integration-fastapi/references/amplitude-quickstart.md +1845 -0
  197. package/skills/integration/integration-fastapi/references/basic-integration-1.0-begin.md +43 -0
  198. package/skills/integration/integration-fastapi/references/basic-integration-1.1-edit.md +35 -0
  199. package/skills/integration/integration-fastapi/references/basic-integration-1.2-revise.md +23 -0
  200. package/skills/integration/integration-fastapi/references/basic-integration-1.3-conclude.md +57 -0
  201. package/skills/integration/integration-fastapi/references/python.md +1424 -0
  202. package/skills/integration/integration-flask/SKILL.md +56 -0
  203. package/skills/integration/integration-flask/references/EXAMPLE.md +1130 -0
  204. package/skills/integration/integration-flask/references/amplitude-quickstart.md +1845 -0
  205. package/skills/integration/integration-flask/references/basic-integration-1.0-begin.md +43 -0
  206. package/skills/integration/integration-flask/references/basic-integration-1.1-edit.md +35 -0
  207. package/skills/integration/integration-flask/references/basic-integration-1.2-revise.md +23 -0
  208. package/skills/integration/integration-flask/references/basic-integration-1.3-conclude.md +57 -0
  209. package/skills/integration/integration-flask/references/python.md +1424 -0
  210. package/skills/integration/integration-javascript_node/SKILL.md +54 -0
  211. package/skills/integration/integration-javascript_node/references/EXAMPLE.md +365 -0
  212. package/skills/integration/integration-javascript_node/references/amplitude-quickstart.md +1845 -0
  213. package/skills/integration/integration-javascript_node/references/analytics.md +1778 -0
  214. package/skills/integration/integration-javascript_node/references/basic-integration-1.0-begin.md +43 -0
  215. package/skills/integration/integration-javascript_node/references/basic-integration-1.1-edit.md +35 -0
  216. package/skills/integration/integration-javascript_node/references/basic-integration-1.2-revise.md +23 -0
  217. package/skills/integration/integration-javascript_node/references/basic-integration-1.3-conclude.md +57 -0
  218. package/skills/integration/integration-javascript_web/SKILL.md +58 -0
  219. package/skills/integration/integration-javascript_web/references/EXAMPLE.md +451 -0
  220. package/skills/integration/integration-javascript_web/references/amplitude-quickstart.md +1845 -0
  221. package/skills/integration/integration-javascript_web/references/basic-integration-1.0-begin.md +43 -0
  222. package/skills/integration/integration-javascript_web/references/basic-integration-1.1-edit.md +35 -0
  223. package/skills/integration/integration-javascript_web/references/basic-integration-1.2-revise.md +23 -0
  224. package/skills/integration/integration-javascript_web/references/basic-integration-1.3-conclude.md +57 -0
  225. package/skills/integration/integration-javascript_web/references/browser-sdk-2.md +4680 -0
  226. package/skills/integration/integration-laravel/SKILL.md +52 -0
  227. package/skills/integration/integration-laravel/references/EXAMPLE.md +2039 -0
  228. package/skills/integration/integration-laravel/references/amplitude-quickstart.md +1845 -0
  229. package/skills/integration/integration-laravel/references/analytics.md +1778 -0
  230. package/skills/integration/integration-laravel/references/basic-integration-1.0-begin.md +43 -0
  231. package/skills/integration/integration-laravel/references/basic-integration-1.1-edit.md +35 -0
  232. package/skills/integration/integration-laravel/references/basic-integration-1.2-revise.md +23 -0
  233. package/skills/integration/integration-laravel/references/basic-integration-1.3-conclude.md +57 -0
  234. package/skills/integration/integration-nextjs-app-router/SKILL.md +54 -0
  235. package/skills/integration/integration-nextjs-app-router/references/EXAMPLE.md +673 -0
  236. package/skills/integration/integration-nextjs-app-router/references/amplitude-quickstart.md +1845 -0
  237. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.0-begin.md +43 -0
  238. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.1-edit.md +35 -0
  239. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.2-revise.md +23 -0
  240. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.3-conclude.md +57 -0
  241. package/skills/integration/integration-nextjs-app-router/references/browser-sdk-2.md +4680 -0
  242. package/skills/integration/integration-nextjs-pages-router/SKILL.md +54 -0
  243. package/skills/integration/integration-nextjs-pages-router/references/EXAMPLE.md +735 -0
  244. package/skills/integration/integration-nextjs-pages-router/references/amplitude-quickstart.md +1845 -0
  245. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.0-begin.md +43 -0
  246. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.1-edit.md +35 -0
  247. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.2-revise.md +23 -0
  248. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.3-conclude.md +57 -0
  249. package/skills/integration/integration-nextjs-pages-router/references/browser-sdk-2.md +4680 -0
  250. package/skills/integration/integration-nuxt-3.6/SKILL.md +46 -0
  251. package/skills/integration/integration-nuxt-3.6/references/EXAMPLE.md +8422 -0
  252. package/skills/integration/integration-nuxt-3.6/references/amplitude-quickstart.md +1845 -0
  253. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.0-begin.md +43 -0
  254. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.1-edit.md +35 -0
  255. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.2-revise.md +23 -0
  256. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.3-conclude.md +57 -0
  257. package/skills/integration/integration-nuxt-3.6/references/browser-sdk-2.md +4680 -0
  258. package/skills/integration/integration-nuxt-4/SKILL.md +46 -0
  259. package/skills/integration/integration-nuxt-4/references/EXAMPLE.md +8670 -0
  260. package/skills/integration/integration-nuxt-4/references/amplitude-quickstart.md +1845 -0
  261. package/skills/integration/integration-nuxt-4/references/basic-integration-1.0-begin.md +43 -0
  262. package/skills/integration/integration-nuxt-4/references/basic-integration-1.1-edit.md +35 -0
  263. package/skills/integration/integration-nuxt-4/references/basic-integration-1.2-revise.md +23 -0
  264. package/skills/integration/integration-nuxt-4/references/basic-integration-1.3-conclude.md +57 -0
  265. package/skills/integration/integration-nuxt-4/references/browser-sdk-2.md +4680 -0
  266. package/skills/integration/integration-python/SKILL.md +53 -0
  267. package/skills/integration/integration-python/references/EXAMPLE.md +445 -0
  268. package/skills/integration/integration-python/references/amplitude-quickstart.md +1845 -0
  269. package/skills/integration/integration-python/references/basic-integration-1.0-begin.md +43 -0
  270. package/skills/integration/integration-python/references/basic-integration-1.1-edit.md +35 -0
  271. package/skills/integration/integration-python/references/basic-integration-1.2-revise.md +23 -0
  272. package/skills/integration/integration-python/references/basic-integration-1.3-conclude.md +57 -0
  273. package/skills/integration/integration-python/references/python.md +1424 -0
  274. package/skills/integration/integration-react-native/SKILL.md +49 -0
  275. package/skills/integration/integration-react-native/references/EXAMPLE.md +2253 -0
  276. package/skills/integration/integration-react-native/references/amplitude-quickstart.md +1845 -0
  277. package/skills/integration/integration-react-native/references/basic-integration-1.0-begin.md +43 -0
  278. package/skills/integration/integration-react-native/references/basic-integration-1.1-edit.md +35 -0
  279. package/skills/integration/integration-react-native/references/basic-integration-1.2-revise.md +23 -0
  280. package/skills/integration/integration-react-native/references/basic-integration-1.3-conclude.md +57 -0
  281. package/skills/integration/integration-react-native/references/react-native-sdk.md +2819 -0
  282. package/skills/integration/integration-react-react-router-6/SKILL.md +53 -0
  283. package/skills/integration/integration-react-react-router-6/references/EXAMPLE.md +570 -0
  284. package/skills/integration/integration-react-react-router-6/references/amplitude-quickstart.md +1845 -0
  285. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.0-begin.md +43 -0
  286. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.1-edit.md +35 -0
  287. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.2-revise.md +23 -0
  288. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.3-conclude.md +57 -0
  289. package/skills/integration/integration-react-react-router-6/references/browser-sdk-2.md +4680 -0
  290. package/skills/integration/integration-react-react-router-7-data/SKILL.md +53 -0
  291. package/skills/integration/integration-react-react-router-7-data/references/EXAMPLE.md +830 -0
  292. package/skills/integration/integration-react-react-router-7-data/references/amplitude-quickstart.md +1845 -0
  293. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.0-begin.md +43 -0
  294. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.1-edit.md +35 -0
  295. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.2-revise.md +23 -0
  296. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.3-conclude.md +57 -0
  297. package/skills/integration/integration-react-react-router-7-data/references/browser-sdk-2.md +4680 -0
  298. package/skills/integration/integration-react-react-router-7-declarative/SKILL.md +53 -0
  299. package/skills/integration/integration-react-react-router-7-declarative/references/EXAMPLE.md +609 -0
  300. package/skills/integration/integration-react-react-router-7-declarative/references/amplitude-quickstart.md +1845 -0
  301. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.0-begin.md +43 -0
  302. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.1-edit.md +35 -0
  303. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.2-revise.md +23 -0
  304. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.3-conclude.md +57 -0
  305. package/skills/integration/integration-react-react-router-7-declarative/references/browser-sdk-2.md +4680 -0
  306. package/skills/integration/integration-react-react-router-7-framework/SKILL.md +53 -0
  307. package/skills/integration/integration-react-react-router-7-framework/references/EXAMPLE.md +1081 -0
  308. package/skills/integration/integration-react-react-router-7-framework/references/amplitude-quickstart.md +1845 -0
  309. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.0-begin.md +43 -0
  310. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.1-edit.md +35 -0
  311. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.2-revise.md +23 -0
  312. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.3-conclude.md +57 -0
  313. package/skills/integration/integration-react-react-router-7-framework/references/browser-sdk-2.md +4680 -0
  314. package/skills/integration/integration-react-tanstack-router-code-based/SKILL.md +57 -0
  315. package/skills/integration/integration-react-tanstack-router-code-based/references/EXAMPLE.md +659 -0
  316. package/skills/integration/integration-react-tanstack-router-code-based/references/amplitude-quickstart.md +1845 -0
  317. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.0-begin.md +43 -0
  318. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.1-edit.md +35 -0
  319. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.2-revise.md +23 -0
  320. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.3-conclude.md +57 -0
  321. package/skills/integration/integration-react-tanstack-router-code-based/references/browser-sdk-2.md +4680 -0
  322. package/skills/integration/integration-react-tanstack-router-file-based/SKILL.md +57 -0
  323. package/skills/integration/integration-react-tanstack-router-file-based/references/EXAMPLE.md +777 -0
  324. package/skills/integration/integration-react-tanstack-router-file-based/references/amplitude-quickstart.md +1845 -0
  325. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.0-begin.md +43 -0
  326. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.1-edit.md +35 -0
  327. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.2-revise.md +23 -0
  328. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.3-conclude.md +57 -0
  329. package/skills/integration/integration-react-tanstack-router-file-based/references/browser-sdk-2.md +4680 -0
  330. package/skills/integration/integration-react-vite/SKILL.md +53 -0
  331. package/skills/integration/integration-react-vite/references/EXAMPLE.md +542 -0
  332. package/skills/integration/integration-react-vite/references/amplitude-quickstart.md +1845 -0
  333. package/skills/integration/integration-react-vite/references/basic-integration-1.0-begin.md +43 -0
  334. package/skills/integration/integration-react-vite/references/basic-integration-1.1-edit.md +35 -0
  335. package/skills/integration/integration-react-vite/references/basic-integration-1.2-revise.md +23 -0
  336. package/skills/integration/integration-react-vite/references/basic-integration-1.3-conclude.md +57 -0
  337. package/skills/integration/integration-react-vite/references/browser-sdk-2.md +4680 -0
  338. package/skills/integration/integration-ruby/SKILL.md +50 -0
  339. package/skills/integration/integration-ruby/references/EXAMPLE.md +420 -0
  340. package/skills/integration/integration-ruby/references/amplitude-quickstart.md +1845 -0
  341. package/skills/integration/integration-ruby/references/analytics.md +1778 -0
  342. package/skills/integration/integration-ruby/references/basic-integration-1.0-begin.md +43 -0
  343. package/skills/integration/integration-ruby/references/basic-integration-1.1-edit.md +35 -0
  344. package/skills/integration/integration-ruby/references/basic-integration-1.2-revise.md +23 -0
  345. package/skills/integration/integration-ruby/references/basic-integration-1.3-conclude.md +57 -0
  346. package/skills/integration/integration-ruby-on-rails/SKILL.md +55 -0
  347. package/skills/integration/integration-ruby-on-rails/references/EXAMPLE.md +1013 -0
  348. package/skills/integration/integration-ruby-on-rails/references/amplitude-quickstart.md +1845 -0
  349. package/skills/integration/integration-ruby-on-rails/references/analytics.md +1778 -0
  350. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.0-begin.md +43 -0
  351. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.1-edit.md +35 -0
  352. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.2-revise.md +23 -0
  353. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.3-conclude.md +57 -0
  354. package/skills/integration/integration-sveltekit/SKILL.md +47 -0
  355. package/skills/integration/integration-sveltekit/references/EXAMPLE.md +14121 -0
  356. package/skills/integration/integration-sveltekit/references/amplitude-quickstart.md +1845 -0
  357. package/skills/integration/integration-sveltekit/references/basic-integration-1.0-begin.md +43 -0
  358. package/skills/integration/integration-sveltekit/references/basic-integration-1.1-edit.md +35 -0
  359. package/skills/integration/integration-sveltekit/references/basic-integration-1.2-revise.md +23 -0
  360. package/skills/integration/integration-sveltekit/references/basic-integration-1.3-conclude.md +57 -0
  361. package/skills/integration/integration-sveltekit/references/browser-sdk-2.md +4680 -0
  362. package/skills/integration/integration-swift/SKILL.md +49 -0
  363. package/skills/integration/integration-swift/references/EXAMPLE.md +660 -0
  364. package/skills/integration/integration-swift/references/amplitude-quickstart.md +1845 -0
  365. package/skills/integration/integration-swift/references/analytics.md +1778 -0
  366. package/skills/integration/integration-swift/references/basic-integration-1.0-begin.md +43 -0
  367. package/skills/integration/integration-swift/references/basic-integration-1.1-edit.md +35 -0
  368. package/skills/integration/integration-swift/references/basic-integration-1.2-revise.md +23 -0
  369. package/skills/integration/integration-swift/references/basic-integration-1.3-conclude.md +57 -0
  370. package/skills/integration/integration-tanstack-start/SKILL.md +58 -0
  371. package/skills/integration/integration-tanstack-start/references/EXAMPLE.md +998 -0
  372. package/skills/integration/integration-tanstack-start/references/amplitude-quickstart.md +1845 -0
  373. package/skills/integration/integration-tanstack-start/references/basic-integration-1.0-begin.md +43 -0
  374. package/skills/integration/integration-tanstack-start/references/basic-integration-1.1-edit.md +35 -0
  375. package/skills/integration/integration-tanstack-start/references/basic-integration-1.2-revise.md +23 -0
  376. package/skills/integration/integration-tanstack-start/references/basic-integration-1.3-conclude.md +57 -0
  377. package/skills/integration/integration-tanstack-start/references/browser-sdk-2.md +4680 -0
  378. package/skills/integration/integration-vue-3/SKILL.md +46 -0
  379. package/skills/integration/integration-vue-3/references/EXAMPLE.md +846 -0
  380. package/skills/integration/integration-vue-3/references/amplitude-quickstart.md +1845 -0
  381. package/skills/integration/integration-vue-3/references/basic-integration-1.0-begin.md +43 -0
  382. package/skills/integration/integration-vue-3/references/basic-integration-1.1-edit.md +35 -0
  383. package/skills/integration/integration-vue-3/references/basic-integration-1.2-revise.md +23 -0
  384. package/skills/integration/integration-vue-3/references/basic-integration-1.3-conclude.md +57 -0
  385. package/skills/integration/integration-vue-3/references/browser-sdk-2.md +4680 -0
  386. package/skills/taxonomy/amplitude-quickstart-taxonomy-agent/SKILL.md +228 -0
  387. package/dist/src/ui/tui/components/TitleBar.d.ts +0 -8
  388. package/dist/src/ui/tui/components/TitleBar.js +0 -27
  389. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.d.ts +0 -7
  390. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.js +0 -101
  391. package/dist/src/utils/anthropic-status.d.ts +0 -17
  392. package/dist/src/utils/anthropic-status.js +0 -51
@@ -0,0 +1,998 @@
1
+ # Amplitude TanStack Start Example Project
2
+
3
+ Repository: https://github.com/amplitude/context-hub
4
+ Path: basics/tanstack-start
5
+
6
+ ---
7
+
8
+ ## README.md
9
+
10
+ # Amplitude TanStack Start example
11
+
12
+ This is a [TanStack Start](https://tanstack.com/start) example demonstrating Amplitude integration with product analytics and event tracking.
13
+
14
+ ### Amplitude SDKs
15
+
16
+ The browser loads the [Browser Unified SDK (npm)](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#unified-sdk-npm): [`@amplitude/unified`](https://www.npmjs.com/package/@amplitude/unified) with `initAll` in `src/routes/__root.tsx`. [Initialize the Unified SDK](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#initialize-the-unified-sdk) describes `initAll` as initializing every product bundled with Unified npm. Optional sections are in [Unified SDK configuration](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#configuration) (`analytics`, `sessionReplay`, `experiment`, `engagement`). The `experiment` block is **Feature Experiment** (`@amplitude/experiment-js-client`). Amplitude’s [product support table](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#product-support-by-installation-method) lists **Web Experiment** (`@amplitude/experiment-tag`, including the visual editor) for Amplitude’s CDN Unified script, not Unified **npm**.
17
+
18
+ Server code uses [`@amplitude/analytics-node`](https://www.npmjs.com/package/@amplitude/analytics-node) in `src/utils/amplitude-server.ts`.
19
+
20
+ ## Features
21
+
22
+ - **Product analytics**: Track user events and behaviors
23
+ - **User authentication**: Demo login system with Amplitude user identification
24
+ - **Client and server tracking**: Examples of both client-side and server-side tracking
25
+
26
+ ## Getting Started
27
+
28
+ ### 1. Install Dependencies
29
+
30
+ ```bash
31
+ npm install
32
+ # or
33
+ pnpm install
34
+ ```
35
+
36
+ ### 2. Configure Environment Variables
37
+
38
+ Create a `.env` file in the root directory:
39
+
40
+ ```bash
41
+ VITE_PUBLIC_AMPLITUDE_API_KEY=your_amplitude_api_key
42
+ ```
43
+
44
+ Get your Amplitude API key from your [Amplitude project settings](https://app.amplitude.com).
45
+
46
+ ### 3. Run the Development Server
47
+
48
+ ```bash
49
+ npm run dev
50
+ ```
51
+
52
+ Open [http://localhost:3000](http://localhost:3000) with your browser to see the app.
53
+
54
+ ## Key Integration Points
55
+
56
+ ### Client-side initialization (src/routes/\_\_root.tsx)
57
+
58
+ ```typescript
59
+ import * as amplitude from '@amplitude/unified'
60
+
61
+ void amplitude.initAll(import.meta.env.VITE_PUBLIC_AMPLITUDE_API_KEY)
62
+ ```
63
+
64
+ ### User identification (src/contexts/AuthContext.tsx)
65
+
66
+ ```typescript
67
+ import * as amplitude from '@amplitude/unified'
68
+ import { Identify } from '@amplitude/unified'
69
+
70
+ amplitude.setUserId(username)
71
+ const identifyObj = new Identify()
72
+ identifyObj.set('username', username)
73
+ amplitude.identify(identifyObj)
74
+ amplitude.track('User Logged In', { username })
75
+ ```
76
+
77
+ ### Server-side tracking (src/utils/amplitude-server.ts)
78
+
79
+ ```typescript
80
+ import { NodeClient, createInstance } from '@amplitude/analytics-node'
81
+
82
+ const amplitude = getAmplitudeClient()
83
+ amplitude.track('Server Login Completed', { username, source: 'api' }, { user_id: username })
84
+ await amplitude.flush()
85
+ ```
86
+
87
+ ### Event tracking (src/routes/burrito.tsx)
88
+
89
+ ```typescript
90
+ amplitude.track('Burrito Considered', {
91
+ total_considerations: user.burritoConsiderations + 1,
92
+ username: user.username,
93
+ })
94
+ ```
95
+
96
+ ## Learn More
97
+
98
+ - [Amplitude Documentation](https://amplitude.com/docs)
99
+ - [TanStack Start Documentation](https://tanstack.com/start/latest)
100
+ - [Amplitude Browser SDK](https://amplitude.com/docs/sdks/analytics/browser/browser-sdk-2)
101
+
102
+ ---
103
+
104
+ ## .env.example
105
+
106
+ ```example
107
+ VITE_PUBLIC_AMPLITUDE_API_KEY=your_amplitude_api_key_here
108
+
109
+ ```
110
+
111
+ ---
112
+
113
+ ## .prettierignore
114
+
115
+ ```
116
+ package-lock.json
117
+ pnpm-lock.yaml
118
+ yarn.lock
119
+ ```
120
+
121
+ ---
122
+
123
+ ## prettier.config.js
124
+
125
+ ```js
126
+ // @ts-check
127
+
128
+ /** @type {import('prettier').Config} */
129
+ const config = {
130
+ semi: false,
131
+ singleQuote: true,
132
+ trailingComma: "all",
133
+ };
134
+
135
+ export default config;
136
+
137
+ ```
138
+
139
+ ---
140
+
141
+ ## public/robots.txt
142
+
143
+ ```txt
144
+ # https://www.robotstxt.org/robotstxt.html
145
+ User-agent: *
146
+ Disallow:
147
+
148
+ ```
149
+
150
+ ---
151
+
152
+ ## src/components/Header.tsx
153
+
154
+ ```tsx
155
+ import { Link } from '@tanstack/react-router'
156
+ import { useAuth } from '../contexts/AuthContext'
157
+
158
+ export default function Header() {
159
+ const { user, logout } = useAuth()
160
+
161
+ return (
162
+ <header className="header">
163
+ <div className="header-container">
164
+ <nav>
165
+ <Link to="/">Home</Link>
166
+ {user && (
167
+ <>
168
+ <Link to="/burrito">Burrito Consideration</Link>
169
+ <Link to="/profile">Profile</Link>
170
+ </>
171
+ )}
172
+ </nav>
173
+ <div className="user-section">
174
+ {user ? (
175
+ <>
176
+ <span>Welcome, {user.username}!</span>
177
+ <button onClick={logout} className="btn-logout">
178
+ Logout
179
+ </button>
180
+ </>
181
+ ) : (
182
+ <span>Not logged in</span>
183
+ )}
184
+ </div>
185
+ </div>
186
+ </header>
187
+ )
188
+ }
189
+
190
+ ```
191
+
192
+ ---
193
+
194
+ ## src/contexts/AuthContext.tsx
195
+
196
+ ```tsx
197
+ import * as amplitude from '@amplitude/unified'
198
+ import { Identify } from '@amplitude/unified'
199
+ import { createContext, useContext, useState } from 'react'
200
+ import type { ReactNode } from 'react'
201
+
202
+ interface User {
203
+ username: string
204
+ burritoConsiderations: number
205
+ }
206
+
207
+ interface AuthContextType {
208
+ user: User | null
209
+ login: (username: string, password: string) => Promise<boolean>
210
+ logout: () => void
211
+ incrementBurritoConsiderations: () => void
212
+ }
213
+
214
+ const AuthContext = createContext<AuthContextType | undefined>(undefined)
215
+
216
+ const users: Map<string, User> = new Map()
217
+
218
+ export function AuthProvider({ children }: { children: ReactNode }) {
219
+ // Use lazy initializer to read from localStorage only once on mount
220
+ const [user, setUser] = useState<User | null>(() => {
221
+ if (typeof window === 'undefined') return null
222
+
223
+ const storedUsername = localStorage.getItem('currentUser')
224
+ if (storedUsername) {
225
+ const existingUser = users.get(storedUsername)
226
+ if (existingUser) {
227
+ return existingUser
228
+ }
229
+ }
230
+ return null
231
+ })
232
+
233
+ const login = async (
234
+ username: string,
235
+ password: string,
236
+ ): Promise<boolean> => {
237
+ try {
238
+ const response = await fetch('/api/auth/login', {
239
+ method: 'POST',
240
+ headers: {
241
+ 'Content-Type': 'application/json',
242
+ },
243
+ body: JSON.stringify({ username, password }),
244
+ })
245
+
246
+ if (response.ok) {
247
+ const { user: userData } = await response.json()
248
+
249
+ // Get or create user in local map
250
+ let localUser = users.get(username)
251
+ if (!localUser) {
252
+ localUser = userData as User
253
+ users.set(username, localUser)
254
+ }
255
+
256
+ setUser(localUser)
257
+ if (typeof window !== 'undefined') {
258
+ localStorage.setItem('currentUser', username)
259
+ }
260
+
261
+ // Identify user in Amplitude using username as user ID
262
+ amplitude.setUserId(username)
263
+ const identifyObj = new Identify()
264
+ identifyObj.set('username', username)
265
+ amplitude.identify(identifyObj)
266
+
267
+ // Track login event
268
+ amplitude.track('User Logged In', { username })
269
+
270
+ return true
271
+ }
272
+ return false
273
+ } catch (error) {
274
+ console.error('Login error:', error)
275
+ return false
276
+ }
277
+ }
278
+
279
+ const logout = () => {
280
+ // Track logout event before resetting
281
+ amplitude.track('User Logged Out')
282
+ amplitude.reset()
283
+
284
+ setUser(null)
285
+ if (typeof window !== 'undefined') {
286
+ localStorage.removeItem('currentUser')
287
+ }
288
+ }
289
+
290
+ const incrementBurritoConsiderations = () => {
291
+ if (user) {
292
+ user.burritoConsiderations++
293
+ users.set(user.username, user)
294
+ setUser({ ...user })
295
+ }
296
+ }
297
+
298
+ return (
299
+ <AuthContext.Provider
300
+ value={{ user, login, logout, incrementBurritoConsiderations }}
301
+ >
302
+ {children}
303
+ </AuthContext.Provider>
304
+ )
305
+ }
306
+
307
+ export function useAuth() {
308
+ const context = useContext(AuthContext)
309
+ if (context === undefined) {
310
+ throw new Error('useAuth must be used within an AuthProvider')
311
+ }
312
+ return context
313
+ }
314
+
315
+ ```
316
+
317
+ ---
318
+
319
+ ## src/router.tsx
320
+
321
+ ```tsx
322
+ import { createRouter } from '@tanstack/react-router'
323
+
324
+ // Import the generated route tree
325
+ import { routeTree } from './routeTree.gen'
326
+
327
+ // Create a new router instance
328
+ export const getRouter = () => {
329
+ return createRouter({
330
+ routeTree,
331
+ scrollRestoration: true,
332
+ defaultPreloadStaleTime: 0,
333
+ })
334
+ }
335
+
336
+ ```
337
+
338
+ ---
339
+
340
+ ## src/routes/__root.tsx
341
+
342
+ ```tsx
343
+ import { HeadContent, Scripts, createRootRoute } from '@tanstack/react-router'
344
+ import { TanStackRouterDevtoolsPanel } from '@tanstack/react-router-devtools'
345
+ import { TanStackDevtools } from '@tanstack/react-devtools'
346
+ import * as amplitude from '@amplitude/unified'
347
+
348
+ import Header from '../components/Header'
349
+ import { AuthProvider } from '../contexts/AuthContext'
350
+
351
+ import appCss from '../styles.css?url'
352
+
353
+ if (typeof window !== 'undefined') {
354
+ void amplitude.initAll(import.meta.env.VITE_PUBLIC_AMPLITUDE_API_KEY)
355
+ }
356
+
357
+ export const Route = createRootRoute({
358
+ head: () => ({
359
+ meta: [
360
+ {
361
+ charSet: 'utf-8',
362
+ },
363
+ {
364
+ name: 'viewport',
365
+ content: 'width=device-width, initial-scale=1',
366
+ },
367
+ {
368
+ title: 'TanStack Start Starter',
369
+ },
370
+ ],
371
+ links: [
372
+ {
373
+ rel: 'stylesheet',
374
+ href: appCss,
375
+ },
376
+ ],
377
+ }),
378
+
379
+ shellComponent: RootDocument,
380
+ })
381
+
382
+ function RootDocument({ children }: { children: React.ReactNode }) {
383
+ return (
384
+ <html lang="en">
385
+ <head>
386
+ <HeadContent />
387
+ </head>
388
+ <body>
389
+ <AuthProvider>
390
+ <Header />
391
+ {children}
392
+ <TanStackDevtools
393
+ config={{
394
+ position: 'bottom-right',
395
+ }}
396
+ plugins={[
397
+ {
398
+ name: 'Tanstack Router',
399
+ render: <TanStackRouterDevtoolsPanel />,
400
+ },
401
+ ]}
402
+ />
403
+ </AuthProvider>
404
+ <Scripts />
405
+ </body>
406
+ </html>
407
+ )
408
+ }
409
+
410
+ ```
411
+
412
+ ---
413
+
414
+ ## src/routes/api/auth/login.ts
415
+
416
+ ```ts
417
+ import { createFileRoute } from '@tanstack/react-router'
418
+ import { json } from '@tanstack/react-start'
419
+ import { getAmplitudeClient } from '../../../utils/amplitude-server'
420
+
421
+ export const Route = createFileRoute('/api/auth/login')({
422
+ server: {
423
+ handlers: {
424
+ POST: async ({ request }) => {
425
+ const body = await request.json()
426
+ const { username, password } = body
427
+
428
+ // Simple validation (in production, you'd verify against a real database)
429
+ if (!username || !password) {
430
+ return json(
431
+ { error: 'Username and password required' },
432
+ { status: 400 },
433
+ )
434
+ }
435
+
436
+ // Check if this is a new user (simplified - in production use a database)
437
+ const isNewUser = !username
438
+
439
+ // Create or get user
440
+ const user = {
441
+ username,
442
+ burritoConsiderations: 0,
443
+ }
444
+
445
+ // Capture server-side login event
446
+ const amplitude = getAmplitudeClient()
447
+ amplitude.track('Server Login Completed', {
448
+ username,
449
+ isNewUser,
450
+ source: 'api',
451
+ }, { user_id: username })
452
+
453
+ await amplitude.flush()
454
+
455
+ return json({ success: true, user })
456
+ },
457
+ },
458
+ },
459
+ })
460
+
461
+ ```
462
+
463
+ ---
464
+
465
+ ## src/routes/api/burrito/consider.ts
466
+
467
+ ```ts
468
+ import { createFileRoute } from '@tanstack/react-router'
469
+ import { json } from '@tanstack/react-start'
470
+ import { getAmplitudeClient } from '../../../utils/amplitude-server'
471
+
472
+ export const Route = createFileRoute('/api/burrito/consider')({
473
+ server: {
474
+ handlers: {
475
+ POST: async ({ request }) => {
476
+ const body = await request.json()
477
+ const { username, totalConsiderations } = body
478
+
479
+ if (!username) {
480
+ return json(
481
+ { error: 'Username is required' },
482
+ { status: 400 },
483
+ )
484
+ }
485
+
486
+ const amplitude = getAmplitudeClient()
487
+ amplitude.track('Burrito Considered', {
488
+ total_considerations: totalConsiderations,
489
+ username,
490
+ source: 'api',
491
+ }, { user_id: username })
492
+
493
+ await amplitude.flush()
494
+
495
+ return json({ success: true })
496
+ },
497
+ },
498
+ },
499
+ })
500
+
501
+ ```
502
+
503
+ ---
504
+
505
+ ## src/routes/burrito.tsx
506
+
507
+ ```tsx
508
+ import { createFileRoute, useNavigate } from '@tanstack/react-router'
509
+ import { useState } from 'react'
510
+ import * as amplitude from '@amplitude/unified'
511
+ import { useAuth } from '../contexts/AuthContext'
512
+
513
+ export const Route = createFileRoute('/burrito')({
514
+ component: BurritoPage,
515
+ head: () => ({
516
+ meta: [
517
+ {
518
+ title: 'Burrito Consideration - Burrito Consideration App',
519
+ },
520
+ {
521
+ name: 'description',
522
+ content: 'Consider the potential of burritos',
523
+ },
524
+ ],
525
+ }),
526
+ })
527
+
528
+ function BurritoPage() {
529
+ const { user, incrementBurritoConsiderations } = useAuth()
530
+ const navigate = useNavigate()
531
+ const [hasConsidered, setHasConsidered] = useState(false)
532
+
533
+ // Redirect to home if not logged in
534
+ if (!user) {
535
+ navigate({ to: '/' })
536
+ return null
537
+ }
538
+
539
+ const handleClientConsideration = () => {
540
+ incrementBurritoConsiderations()
541
+ setHasConsidered(true)
542
+ setTimeout(() => setHasConsidered(false), 2000)
543
+
544
+ amplitude.track('Burrito Considered', {
545
+ total_considerations: user.burritoConsiderations + 1,
546
+ username: user.username,
547
+ })
548
+ }
549
+
550
+ const handleServerConsideration = async () => {
551
+ incrementBurritoConsiderations()
552
+ setHasConsidered(true)
553
+ setTimeout(() => setHasConsidered(false), 2000)
554
+
555
+ await fetch('/api/burrito/consider', {
556
+ method: 'POST',
557
+ headers: {
558
+ 'Content-Type': 'application/json',
559
+ },
560
+ body: JSON.stringify({
561
+ username: user.username,
562
+ totalConsiderations: user.burritoConsiderations + 1,
563
+ }),
564
+ })
565
+ }
566
+
567
+ return (
568
+ <main>
569
+ <div className="container">
570
+ <h1>Burrito consideration zone</h1>
571
+ <p>Take a moment to truly consider the potential of burritos.</p>
572
+
573
+ <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '0.125rem' }}>
574
+ <button
575
+ onClick={handleClientConsideration}
576
+ className="btn-burrito"
577
+ style={{ backgroundColor: '#e07c24', color: '#fff' }}
578
+ >
579
+ Consider burrito (client)
580
+ </button>
581
+ <button
582
+ onClick={handleServerConsideration}
583
+ className="btn-burrito"
584
+ style={{ backgroundColor: '#4a90d9', color: '#fff' }}
585
+ >
586
+ Consider burrito (server)
587
+ </button>
588
+
589
+ {hasConsidered && (
590
+ <p className="success">
591
+ Thank you for your consideration! Count:{' '}
592
+ {user.burritoConsiderations}
593
+ </p>
594
+ )}
595
+ </div>
596
+
597
+ <div className="stats">
598
+ <h3>Consideration stats</h3>
599
+ <p>Total considerations: {user.burritoConsiderations}</p>
600
+ </div>
601
+ </div>
602
+ </main>
603
+ )
604
+ }
605
+
606
+ ```
607
+
608
+ ---
609
+
610
+ ## src/routes/index.tsx
611
+
612
+ ```tsx
613
+ import { createFileRoute } from '@tanstack/react-router'
614
+ import { useState } from 'react'
615
+ import { useAuth } from '../contexts/AuthContext'
616
+
617
+ export const Route = createFileRoute('/')({
618
+ component: Home,
619
+ head: () => ({
620
+ meta: [
621
+ {
622
+ title: 'Burrito Consideration App',
623
+ },
624
+ {
625
+ name: 'description',
626
+ content: 'Consider the potential of burritos',
627
+ },
628
+ ],
629
+ }),
630
+ })
631
+
632
+ function Home() {
633
+ const { user, login } = useAuth()
634
+ const [username, setUsername] = useState('')
635
+ const [password, setPassword] = useState('')
636
+ const [error, setError] = useState('')
637
+
638
+ const handleSubmit = async (e: React.FormEvent) => {
639
+ e.preventDefault()
640
+ setError('')
641
+
642
+ try {
643
+ const success = await login(username, password)
644
+ if (success) {
645
+ setUsername('')
646
+ setPassword('')
647
+ } else {
648
+ setError('Please provide both username and password')
649
+ }
650
+ } catch (err) {
651
+ console.error('Login failed:', err)
652
+ setError('An error occurred during login')
653
+ }
654
+ }
655
+
656
+ return (
657
+ <main>
658
+ {user ? (
659
+ <div className="container">
660
+ <h1>Welcome back, {user.username}!</h1>
661
+ <p>You are now logged in. Feel free to explore:</p>
662
+ <ul>
663
+ <li>Consider the potential of burritos</li>
664
+ <li>View your profile and statistics</li>
665
+ </ul>
666
+ </div>
667
+ ) : (
668
+ <div className="container">
669
+ <h1>Welcome to Burrito Consideration App</h1>
670
+ <p>Please sign in to begin your burrito journey</p>
671
+
672
+ <form onSubmit={handleSubmit} className="form">
673
+ <div className="form-group">
674
+ <label htmlFor="username">Username:</label>
675
+ <input
676
+ type="text"
677
+ id="username"
678
+ value={username}
679
+ onChange={(e) => setUsername(e.target.value)}
680
+ placeholder="Enter any username"
681
+ />
682
+ </div>
683
+
684
+ <div className="form-group">
685
+ <label htmlFor="password">Password:</label>
686
+ <input
687
+ type="password"
688
+ id="password"
689
+ value={password}
690
+ onChange={(e) => setPassword(e.target.value)}
691
+ placeholder="Enter any password"
692
+ />
693
+ </div>
694
+
695
+ {error && <p className="error">{error}</p>}
696
+
697
+ <button type="submit" className="btn-primary">
698
+ Sign In
699
+ </button>
700
+ </form>
701
+
702
+ <p className="note">
703
+ Note: This is a demo app. Use any username and password to sign in.
704
+ </p>
705
+ </div>
706
+ )}
707
+ </main>
708
+ )
709
+ }
710
+
711
+ ```
712
+
713
+ ---
714
+
715
+ ## src/routes/profile.tsx
716
+
717
+ ```tsx
718
+ import { createFileRoute, useNavigate } from '@tanstack/react-router'
719
+ import { useAuth } from '../contexts/AuthContext'
720
+
721
+ export const Route = createFileRoute('/profile')({
722
+ component: ProfilePage,
723
+ head: () => ({
724
+ meta: [
725
+ {
726
+ title: 'Profile - Burrito Consideration App',
727
+ },
728
+ {
729
+ name: 'description',
730
+ content: 'Your burrito consideration profile',
731
+ },
732
+ ],
733
+ }),
734
+ })
735
+
736
+ function ProfilePage() {
737
+ const { user } = useAuth()
738
+ const navigate = useNavigate()
739
+
740
+ // Redirect to home if not logged in
741
+ if (!user) {
742
+ navigate({ to: '/' })
743
+ return null
744
+ }
745
+
746
+ return (
747
+ <main>
748
+ <div className="container">
749
+ <h1>User Profile</h1>
750
+
751
+ <div className="stats">
752
+ <h2>Your Information</h2>
753
+ <p>
754
+ <strong>Username:</strong> {user.username}
755
+ </p>
756
+ <p>
757
+ <strong>Burrito Considerations:</strong>{' '}
758
+ {user.burritoConsiderations}
759
+ </p>
760
+ </div>
761
+
762
+ <div style={{ marginTop: '2rem' }}>
763
+ <h3>Your Burrito Journey</h3>
764
+ {user.burritoConsiderations === 0 ? (
765
+ <p>
766
+ You haven't considered any burritos yet. Visit the Burrito
767
+ Consideration page to start!
768
+ </p>
769
+ ) : user.burritoConsiderations === 1 ? (
770
+ <p>You've considered the burrito potential once. Keep going!</p>
771
+ ) : user.burritoConsiderations < 5 ? (
772
+ <p>You're getting the hang of burrito consideration!</p>
773
+ ) : user.burritoConsiderations < 10 ? (
774
+ <p>You're becoming a burrito consideration expert!</p>
775
+ ) : (
776
+ <p>You are a true burrito consideration master!</p>
777
+ )}
778
+ </div>
779
+ </div>
780
+ </main>
781
+ )
782
+ }
783
+
784
+ ```
785
+
786
+ ---
787
+
788
+ ## src/routeTree.gen.ts
789
+
790
+ ```ts
791
+ /* eslint-disable */
792
+
793
+ // @ts-nocheck
794
+
795
+ // noinspection JSUnusedGlobalSymbols
796
+
797
+ // This file was automatically generated by TanStack Router.
798
+ // You should NOT make any changes in this file as it will be overwritten.
799
+ // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
800
+
801
+ import { Route as rootRouteImport } from './routes/__root'
802
+ import { Route as ProfileRouteImport } from './routes/profile'
803
+ import { Route as BurritoRouteImport } from './routes/burrito'
804
+ import { Route as IndexRouteImport } from './routes/index'
805
+ import { Route as ApiBurritoConsiderRouteImport } from './routes/api/burrito/consider'
806
+ import { Route as ApiAuthLoginRouteImport } from './routes/api/auth/login'
807
+
808
+ const ProfileRoute = ProfileRouteImport.update({
809
+ id: '/profile',
810
+ path: '/profile',
811
+ getParentRoute: () => rootRouteImport,
812
+ } as any)
813
+ const BurritoRoute = BurritoRouteImport.update({
814
+ id: '/burrito',
815
+ path: '/burrito',
816
+ getParentRoute: () => rootRouteImport,
817
+ } as any)
818
+ const IndexRoute = IndexRouteImport.update({
819
+ id: '/',
820
+ path: '/',
821
+ getParentRoute: () => rootRouteImport,
822
+ } as any)
823
+ const ApiBurritoConsiderRoute = ApiBurritoConsiderRouteImport.update({
824
+ id: '/api/burrito/consider',
825
+ path: '/api/burrito/consider',
826
+ getParentRoute: () => rootRouteImport,
827
+ } as any)
828
+ const ApiAuthLoginRoute = ApiAuthLoginRouteImport.update({
829
+ id: '/api/auth/login',
830
+ path: '/api/auth/login',
831
+ getParentRoute: () => rootRouteImport,
832
+ } as any)
833
+
834
+ export interface FileRoutesByFullPath {
835
+ '/': typeof IndexRoute
836
+ '/burrito': typeof BurritoRoute
837
+ '/profile': typeof ProfileRoute
838
+ '/api/auth/login': typeof ApiAuthLoginRoute
839
+ '/api/burrito/consider': typeof ApiBurritoConsiderRoute
840
+ }
841
+ export interface FileRoutesByTo {
842
+ '/': typeof IndexRoute
843
+ '/burrito': typeof BurritoRoute
844
+ '/profile': typeof ProfileRoute
845
+ '/api/auth/login': typeof ApiAuthLoginRoute
846
+ '/api/burrito/consider': typeof ApiBurritoConsiderRoute
847
+ }
848
+ export interface FileRoutesById {
849
+ __root__: typeof rootRouteImport
850
+ '/': typeof IndexRoute
851
+ '/burrito': typeof BurritoRoute
852
+ '/profile': typeof ProfileRoute
853
+ '/api/auth/login': typeof ApiAuthLoginRoute
854
+ '/api/burrito/consider': typeof ApiBurritoConsiderRoute
855
+ }
856
+ export interface FileRouteTypes {
857
+ fileRoutesByFullPath: FileRoutesByFullPath
858
+ fullPaths:
859
+ | '/'
860
+ | '/burrito'
861
+ | '/profile'
862
+ | '/api/auth/login'
863
+ | '/api/burrito/consider'
864
+ fileRoutesByTo: FileRoutesByTo
865
+ to:
866
+ | '/'
867
+ | '/burrito'
868
+ | '/profile'
869
+ | '/api/auth/login'
870
+ | '/api/burrito/consider'
871
+ id:
872
+ | '__root__'
873
+ | '/'
874
+ | '/burrito'
875
+ | '/profile'
876
+ | '/api/auth/login'
877
+ | '/api/burrito/consider'
878
+ fileRoutesById: FileRoutesById
879
+ }
880
+ export interface RootRouteChildren {
881
+ IndexRoute: typeof IndexRoute
882
+ BurritoRoute: typeof BurritoRoute
883
+ ProfileRoute: typeof ProfileRoute
884
+ ApiAuthLoginRoute: typeof ApiAuthLoginRoute
885
+ ApiBurritoConsiderRoute: typeof ApiBurritoConsiderRoute
886
+ }
887
+
888
+ declare module '@tanstack/react-router' {
889
+ interface FileRoutesByPath {
890
+ '/profile': {
891
+ id: '/profile'
892
+ path: '/profile'
893
+ fullPath: '/profile'
894
+ preLoaderRoute: typeof ProfileRouteImport
895
+ parentRoute: typeof rootRouteImport
896
+ }
897
+ '/burrito': {
898
+ id: '/burrito'
899
+ path: '/burrito'
900
+ fullPath: '/burrito'
901
+ preLoaderRoute: typeof BurritoRouteImport
902
+ parentRoute: typeof rootRouteImport
903
+ }
904
+ '/': {
905
+ id: '/'
906
+ path: '/'
907
+ fullPath: '/'
908
+ preLoaderRoute: typeof IndexRouteImport
909
+ parentRoute: typeof rootRouteImport
910
+ }
911
+ '/api/burrito/consider': {
912
+ id: '/api/burrito/consider'
913
+ path: '/api/burrito/consider'
914
+ fullPath: '/api/burrito/consider'
915
+ preLoaderRoute: typeof ApiBurritoConsiderRouteImport
916
+ parentRoute: typeof rootRouteImport
917
+ }
918
+ '/api/auth/login': {
919
+ id: '/api/auth/login'
920
+ path: '/api/auth/login'
921
+ fullPath: '/api/auth/login'
922
+ preLoaderRoute: typeof ApiAuthLoginRouteImport
923
+ parentRoute: typeof rootRouteImport
924
+ }
925
+ }
926
+ }
927
+
928
+ const rootRouteChildren: RootRouteChildren = {
929
+ IndexRoute: IndexRoute,
930
+ BurritoRoute: BurritoRoute,
931
+ ProfileRoute: ProfileRoute,
932
+ ApiAuthLoginRoute: ApiAuthLoginRoute,
933
+ ApiBurritoConsiderRoute: ApiBurritoConsiderRoute,
934
+ }
935
+ export const routeTree = rootRouteImport
936
+ ._addFileChildren(rootRouteChildren)
937
+ ._addFileTypes<FileRouteTypes>()
938
+
939
+ import type { getRouter } from './router.tsx'
940
+ import type { createStart } from '@tanstack/react-start'
941
+ declare module '@tanstack/react-start' {
942
+ interface Register {
943
+ ssr: true
944
+ router: Awaited<ReturnType<typeof getRouter>>
945
+ }
946
+ }
947
+
948
+ ```
949
+
950
+ ---
951
+
952
+ ## src/utils/amplitude-server.ts
953
+
954
+ ```ts
955
+ import { createInstance } from '@amplitude/analytics-node'
956
+
957
+ type AmplitudeNodeClient = ReturnType<typeof createInstance>
958
+
959
+ let amplitudeClient: AmplitudeNodeClient | null = null
960
+
961
+ export function getAmplitudeClient(): AmplitudeNodeClient {
962
+ if (!amplitudeClient) {
963
+ const apiKey = process.env.VITE_PUBLIC_AMPLITUDE_API_KEY || import.meta.env.VITE_PUBLIC_AMPLITUDE_API_KEY!
964
+ amplitudeClient = createInstance()
965
+ amplitudeClient.init(apiKey)
966
+ }
967
+ return amplitudeClient
968
+ }
969
+
970
+ ```
971
+
972
+ ---
973
+
974
+ ## vite.config.ts
975
+
976
+ ```ts
977
+ import { defineConfig } from 'vite'
978
+ import { tanstackStart } from '@tanstack/react-start/plugin/vite'
979
+ import viteReact from '@vitejs/plugin-react'
980
+ import viteTsConfigPaths from 'vite-tsconfig-paths'
981
+
982
+ const config = defineConfig({
983
+ plugins: [
984
+ // this is the plugin that enables path aliases
985
+ viteTsConfigPaths({
986
+ projects: ['./tsconfig.json'],
987
+ }),
988
+ tanstackStart(),
989
+ viteReact(),
990
+ ],
991
+ })
992
+
993
+ export default config
994
+
995
+ ```
996
+
997
+ ---
998
+