@amplitude/wizard 1.0.0-beta.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/README.md +171 -74
  2. package/dist/bin.js +338 -222
  3. package/dist/src/lib/agent-interface.js +64 -9
  4. package/dist/src/lib/agent-runner.js +1 -10
  5. package/dist/src/lib/api.d.ts +22 -4
  6. package/dist/src/lib/api.js +114 -12
  7. package/dist/src/lib/commandments.js +14 -1
  8. package/dist/src/lib/constants.d.ts +6 -5
  9. package/dist/src/lib/constants.js +13 -13
  10. package/dist/src/lib/credential-resolution.d.ts +45 -0
  11. package/dist/src/lib/credential-resolution.js +311 -0
  12. package/dist/src/lib/exit-codes.d.ts +10 -0
  13. package/dist/src/lib/exit-codes.js +12 -0
  14. package/dist/src/lib/health-checks/statuspage.d.ts +1 -0
  15. package/dist/src/lib/health-checks/statuspage.js +5 -1
  16. package/dist/src/lib/mode-config.d.ts +14 -0
  17. package/dist/src/lib/mode-config.js +14 -0
  18. package/dist/src/lib/session-checkpoint.d.ts +27 -0
  19. package/dist/src/lib/session-checkpoint.js +134 -0
  20. package/dist/src/lib/wizard-session.d.ts +44 -1
  21. package/dist/src/lib/wizard-session.js +70 -14
  22. package/dist/src/lib/wizard-tools.js +19 -4
  23. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +3 -0
  24. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +6 -0
  25. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +3 -1
  26. package/dist/src/ui/agent-ui.d.ts +91 -0
  27. package/dist/src/ui/agent-ui.js +277 -0
  28. package/dist/src/ui/logging-ui.js +1 -1
  29. package/dist/src/ui/tui/App.d.ts +12 -0
  30. package/dist/src/ui/tui/App.js +29 -18
  31. package/dist/src/ui/tui/components/AmplitudeLogo.js +16 -17
  32. package/dist/src/ui/tui/components/AmplitudeTextLogo.d.ts +0 -2
  33. package/dist/src/ui/tui/components/AmplitudeTextLogo.js +53 -18
  34. package/dist/src/ui/tui/components/BrailleSpinner.d.ts +8 -0
  35. package/dist/src/ui/tui/components/BrailleSpinner.js +15 -0
  36. package/dist/src/ui/tui/components/ConsoleView.d.ts +8 -11
  37. package/dist/src/ui/tui/components/ConsoleView.js +51 -34
  38. package/dist/src/ui/tui/components/HeaderBar.d.ts +12 -0
  39. package/dist/src/ui/tui/components/HeaderBar.js +17 -0
  40. package/dist/src/ui/tui/components/JourneyStepper.d.ts +16 -0
  41. package/dist/src/ui/tui/components/JourneyStepper.js +83 -0
  42. package/dist/src/ui/tui/components/KeyHintBar.d.ts +19 -0
  43. package/dist/src/ui/tui/components/KeyHintBar.js +20 -0
  44. package/dist/src/ui/tui/console-commands.d.ts +1 -2
  45. package/dist/src/ui/tui/console-commands.js +48 -7
  46. package/dist/src/ui/tui/flows.d.ts +1 -1
  47. package/dist/src/ui/tui/flows.js +1 -1
  48. package/dist/src/ui/tui/hooks/useAsyncEffect.d.ts +15 -0
  49. package/dist/src/ui/tui/hooks/useAsyncEffect.js +35 -0
  50. package/dist/src/ui/tui/hooks/useWizardStore.d.ts +9 -0
  51. package/dist/src/ui/tui/hooks/useWizardStore.js +11 -0
  52. package/dist/src/ui/tui/ink-ui.js +1 -1
  53. package/dist/src/ui/tui/primitives/DissolveTransition.js +4 -5
  54. package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +3 -1
  55. package/dist/src/ui/tui/primitives/EventPlanViewer.js +8 -3
  56. package/dist/src/ui/tui/primitives/ProgressList.js +1 -1
  57. package/dist/src/ui/tui/primitives/SlashCommandInput.js +19 -4
  58. package/dist/src/ui/tui/primitives/SplitView.d.ts +2 -1
  59. package/dist/src/ui/tui/primitives/SplitView.js +10 -2
  60. package/dist/src/ui/tui/primitives/TabContainer.js +10 -2
  61. package/dist/src/ui/tui/primitives/index.d.ts +0 -1
  62. package/dist/src/ui/tui/primitives/index.js +0 -1
  63. package/dist/src/ui/tui/router.js +1 -1
  64. package/dist/src/ui/tui/screen-registry.d.ts +0 -7
  65. package/dist/src/ui/tui/screen-registry.js +13 -4
  66. package/dist/src/ui/tui/screens/ActivationOptionsScreen.d.ts +2 -2
  67. package/dist/src/ui/tui/screens/ActivationOptionsScreen.js +8 -8
  68. package/dist/src/ui/tui/screens/AuthScreen.js +57 -27
  69. package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +2 -12
  70. package/dist/src/ui/tui/screens/ChecklistScreen.js +22 -33
  71. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +3 -12
  72. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +109 -39
  73. package/dist/src/ui/tui/screens/DataSetupScreen.d.ts +3 -3
  74. package/dist/src/ui/tui/screens/DataSetupScreen.js +17 -10
  75. package/dist/src/ui/tui/screens/IntroScreen.d.ts +5 -3
  76. package/dist/src/ui/tui/screens/IntroScreen.js +132 -41
  77. package/dist/src/ui/tui/screens/LoginScreen.d.ts +1 -1
  78. package/dist/src/ui/tui/screens/LoginScreen.js +4 -4
  79. package/dist/src/ui/tui/screens/LogoutScreen.d.ts +4 -2
  80. package/dist/src/ui/tui/screens/LogoutScreen.js +17 -5
  81. package/dist/src/ui/tui/screens/McpScreen.d.ts +4 -4
  82. package/dist/src/ui/tui/screens/McpScreen.js +25 -17
  83. package/dist/src/ui/tui/screens/OutageScreen.d.ts +1 -1
  84. package/dist/src/ui/tui/screens/OutageScreen.js +5 -5
  85. package/dist/src/ui/tui/screens/OutroScreen.d.ts +5 -0
  86. package/dist/src/ui/tui/screens/OutroScreen.js +21 -14
  87. package/dist/src/ui/tui/screens/RegionSelectScreen.js +15 -13
  88. package/dist/src/ui/tui/screens/RunScreen.d.ts +7 -5
  89. package/dist/src/ui/tui/screens/RunScreen.js +102 -157
  90. package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +1 -1
  91. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +6 -5
  92. package/dist/src/ui/tui/screens/SetupScreen.d.ts +1 -1
  93. package/dist/src/ui/tui/screens/SetupScreen.js +7 -7
  94. package/dist/src/ui/tui/screens/SlackScreen.d.ts +2 -2
  95. package/dist/src/ui/tui/screens/SlackScreen.js +60 -35
  96. package/dist/src/ui/tui/session-constants.d.ts +41 -0
  97. package/dist/src/ui/tui/session-constants.js +38 -0
  98. package/dist/src/ui/tui/start-tui.d.ts +3 -1
  99. package/dist/src/ui/tui/start-tui.js +14 -10
  100. package/dist/src/ui/tui/store.d.ts +2 -1
  101. package/dist/src/ui/tui/store.js +33 -7
  102. package/dist/src/ui/tui/styles.d.ts +75 -19
  103. package/dist/src/ui/tui/styles.js +101 -19
  104. package/dist/src/ui/tui/utils/classify-error.d.ts +14 -0
  105. package/dist/src/ui/tui/utils/classify-error.js +90 -0
  106. package/dist/src/ui/tui/utils/diagnostics.d.ts +21 -0
  107. package/dist/src/ui/tui/utils/diagnostics.js +72 -0
  108. package/dist/src/ui/tui/utils/with-retry.d.ts +12 -0
  109. package/dist/src/ui/tui/utils/with-retry.js +32 -0
  110. package/dist/src/ui/tui/utils/with-timeout.d.ts +10 -0
  111. package/dist/src/ui/tui/utils/with-timeout.js +24 -0
  112. package/dist/src/utils/ampli-settings.d.ts +1 -1
  113. package/dist/src/utils/ampli-settings.js +15 -5
  114. package/dist/src/utils/api-key-store.js +5 -5
  115. package/dist/src/utils/atomic-write.d.ts +15 -0
  116. package/dist/src/utils/atomic-write.js +34 -0
  117. package/dist/src/utils/setup-utils.js +2 -2
  118. package/dist/src/utils/token-refresh.d.ts +22 -0
  119. package/dist/src/utils/token-refresh.js +79 -0
  120. package/dist/src/utils/wizard-abort.js +6 -1
  121. package/package.json +6 -6
  122. package/skills/instrumentation/add-analytics-instrumentation/SKILL.md +142 -0
  123. package/skills/instrumentation/diff-intake/SKILL.md +128 -0
  124. package/skills/instrumentation/discover-analytics-patterns/SKILL.md +185 -0
  125. package/skills/instrumentation/discover-event-surfaces/SKILL.md +322 -0
  126. package/skills/instrumentation/discover-event-surfaces/references/best-practices.md +563 -0
  127. package/skills/instrumentation/instrument-events/SKILL.md +169 -0
  128. package/skills/instrumentation/instrument-events/references/best-practices.md +563 -0
  129. package/skills/integration/integration-android/SKILL.md +49 -0
  130. package/skills/integration/integration-android/references/EXAMPLE.md +1977 -0
  131. package/skills/integration/integration-android/references/amplitude-quickstart.md +1845 -0
  132. package/skills/integration/integration-android/references/analytics.md +1778 -0
  133. package/skills/integration/integration-android/references/basic-integration-1.0-begin.md +43 -0
  134. package/skills/integration/integration-android/references/basic-integration-1.1-edit.md +35 -0
  135. package/skills/integration/integration-android/references/basic-integration-1.2-revise.md +23 -0
  136. package/skills/integration/integration-android/references/basic-integration-1.3-conclude.md +57 -0
  137. package/skills/integration/integration-angular/SKILL.md +49 -0
  138. package/skills/integration/integration-angular/references/EXAMPLE.md +899 -0
  139. package/skills/integration/integration-angular/references/amplitude-quickstart.md +1845 -0
  140. package/skills/integration/integration-angular/references/basic-integration-1.0-begin.md +43 -0
  141. package/skills/integration/integration-angular/references/basic-integration-1.1-edit.md +35 -0
  142. package/skills/integration/integration-angular/references/basic-integration-1.2-revise.md +23 -0
  143. package/skills/integration/integration-angular/references/basic-integration-1.3-conclude.md +57 -0
  144. package/skills/integration/integration-angular/references/browser-sdk-2.md +4680 -0
  145. package/skills/integration/integration-astro-hybrid/SKILL.md +56 -0
  146. package/skills/integration/integration-astro-hybrid/references/EXAMPLE.md +1095 -0
  147. package/skills/integration/integration-astro-hybrid/references/amplitude-quickstart.md +1845 -0
  148. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.0-begin.md +43 -0
  149. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.1-edit.md +35 -0
  150. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.2-revise.md +23 -0
  151. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.3-conclude.md +57 -0
  152. package/skills/integration/integration-astro-hybrid/references/browser-sdk-2.md +4680 -0
  153. package/skills/integration/integration-astro-ssr/SKILL.md +52 -0
  154. package/skills/integration/integration-astro-ssr/references/EXAMPLE.md +1106 -0
  155. package/skills/integration/integration-astro-ssr/references/amplitude-quickstart.md +1845 -0
  156. package/skills/integration/integration-astro-ssr/references/basic-integration-1.0-begin.md +43 -0
  157. package/skills/integration/integration-astro-ssr/references/basic-integration-1.1-edit.md +35 -0
  158. package/skills/integration/integration-astro-ssr/references/basic-integration-1.2-revise.md +23 -0
  159. package/skills/integration/integration-astro-ssr/references/basic-integration-1.3-conclude.md +57 -0
  160. package/skills/integration/integration-astro-ssr/references/browser-sdk-2.md +4680 -0
  161. package/skills/integration/integration-astro-static/SKILL.md +49 -0
  162. package/skills/integration/integration-astro-static/references/EXAMPLE.md +910 -0
  163. package/skills/integration/integration-astro-static/references/amplitude-quickstart.md +1845 -0
  164. package/skills/integration/integration-astro-static/references/basic-integration-1.0-begin.md +43 -0
  165. package/skills/integration/integration-astro-static/references/basic-integration-1.1-edit.md +35 -0
  166. package/skills/integration/integration-astro-static/references/basic-integration-1.2-revise.md +23 -0
  167. package/skills/integration/integration-astro-static/references/basic-integration-1.3-conclude.md +57 -0
  168. package/skills/integration/integration-astro-static/references/browser-sdk-2.md +4680 -0
  169. package/skills/integration/integration-astro-view-transitions/SKILL.md +51 -0
  170. package/skills/integration/integration-astro-view-transitions/references/EXAMPLE.md +979 -0
  171. package/skills/integration/integration-astro-view-transitions/references/amplitude-quickstart.md +1845 -0
  172. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.0-begin.md +43 -0
  173. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.1-edit.md +35 -0
  174. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.2-revise.md +23 -0
  175. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.3-conclude.md +57 -0
  176. package/skills/integration/integration-astro-view-transitions/references/browser-sdk-2.md +4680 -0
  177. package/skills/integration/integration-django/SKILL.md +57 -0
  178. package/skills/integration/integration-django/references/EXAMPLE.md +1005 -0
  179. package/skills/integration/integration-django/references/amplitude-quickstart.md +1845 -0
  180. package/skills/integration/integration-django/references/basic-integration-1.0-begin.md +43 -0
  181. package/skills/integration/integration-django/references/basic-integration-1.1-edit.md +35 -0
  182. package/skills/integration/integration-django/references/basic-integration-1.2-revise.md +23 -0
  183. package/skills/integration/integration-django/references/basic-integration-1.3-conclude.md +57 -0
  184. package/skills/integration/integration-django/references/python.md +1424 -0
  185. package/skills/integration/integration-expo/SKILL.md +53 -0
  186. package/skills/integration/integration-expo/references/EXAMPLE.md +1291 -0
  187. package/skills/integration/integration-expo/references/amplitude-quickstart.md +1845 -0
  188. package/skills/integration/integration-expo/references/basic-integration-1.0-begin.md +43 -0
  189. package/skills/integration/integration-expo/references/basic-integration-1.1-edit.md +35 -0
  190. package/skills/integration/integration-expo/references/basic-integration-1.2-revise.md +23 -0
  191. package/skills/integration/integration-expo/references/basic-integration-1.3-conclude.md +57 -0
  192. package/skills/integration/integration-expo/references/react-native-sdk.md +2819 -0
  193. package/skills/integration/integration-fastapi/SKILL.md +57 -0
  194. package/skills/integration/integration-fastapi/references/EXAMPLE.md +1389 -0
  195. package/skills/integration/integration-fastapi/references/amplitude-quickstart.md +1845 -0
  196. package/skills/integration/integration-fastapi/references/basic-integration-1.0-begin.md +43 -0
  197. package/skills/integration/integration-fastapi/references/basic-integration-1.1-edit.md +35 -0
  198. package/skills/integration/integration-fastapi/references/basic-integration-1.2-revise.md +23 -0
  199. package/skills/integration/integration-fastapi/references/basic-integration-1.3-conclude.md +57 -0
  200. package/skills/integration/integration-fastapi/references/python.md +1424 -0
  201. package/skills/integration/integration-flask/SKILL.md +56 -0
  202. package/skills/integration/integration-flask/references/EXAMPLE.md +1130 -0
  203. package/skills/integration/integration-flask/references/amplitude-quickstart.md +1845 -0
  204. package/skills/integration/integration-flask/references/basic-integration-1.0-begin.md +43 -0
  205. package/skills/integration/integration-flask/references/basic-integration-1.1-edit.md +35 -0
  206. package/skills/integration/integration-flask/references/basic-integration-1.2-revise.md +23 -0
  207. package/skills/integration/integration-flask/references/basic-integration-1.3-conclude.md +57 -0
  208. package/skills/integration/integration-flask/references/python.md +1424 -0
  209. package/skills/integration/integration-javascript_node/SKILL.md +54 -0
  210. package/skills/integration/integration-javascript_node/references/EXAMPLE.md +365 -0
  211. package/skills/integration/integration-javascript_node/references/amplitude-quickstart.md +1845 -0
  212. package/skills/integration/integration-javascript_node/references/analytics.md +1778 -0
  213. package/skills/integration/integration-javascript_node/references/basic-integration-1.0-begin.md +43 -0
  214. package/skills/integration/integration-javascript_node/references/basic-integration-1.1-edit.md +35 -0
  215. package/skills/integration/integration-javascript_node/references/basic-integration-1.2-revise.md +23 -0
  216. package/skills/integration/integration-javascript_node/references/basic-integration-1.3-conclude.md +57 -0
  217. package/skills/integration/integration-javascript_web/SKILL.md +58 -0
  218. package/skills/integration/integration-javascript_web/references/EXAMPLE.md +451 -0
  219. package/skills/integration/integration-javascript_web/references/amplitude-quickstart.md +1845 -0
  220. package/skills/integration/integration-javascript_web/references/basic-integration-1.0-begin.md +43 -0
  221. package/skills/integration/integration-javascript_web/references/basic-integration-1.1-edit.md +35 -0
  222. package/skills/integration/integration-javascript_web/references/basic-integration-1.2-revise.md +23 -0
  223. package/skills/integration/integration-javascript_web/references/basic-integration-1.3-conclude.md +57 -0
  224. package/skills/integration/integration-javascript_web/references/browser-sdk-2.md +4680 -0
  225. package/skills/integration/integration-laravel/SKILL.md +52 -0
  226. package/skills/integration/integration-laravel/references/EXAMPLE.md +2039 -0
  227. package/skills/integration/integration-laravel/references/amplitude-quickstart.md +1845 -0
  228. package/skills/integration/integration-laravel/references/analytics.md +1778 -0
  229. package/skills/integration/integration-laravel/references/basic-integration-1.0-begin.md +43 -0
  230. package/skills/integration/integration-laravel/references/basic-integration-1.1-edit.md +35 -0
  231. package/skills/integration/integration-laravel/references/basic-integration-1.2-revise.md +23 -0
  232. package/skills/integration/integration-laravel/references/basic-integration-1.3-conclude.md +57 -0
  233. package/skills/integration/integration-nextjs-app-router/SKILL.md +54 -0
  234. package/skills/integration/integration-nextjs-app-router/references/EXAMPLE.md +673 -0
  235. package/skills/integration/integration-nextjs-app-router/references/amplitude-quickstart.md +1845 -0
  236. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.0-begin.md +43 -0
  237. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.1-edit.md +35 -0
  238. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.2-revise.md +23 -0
  239. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.3-conclude.md +57 -0
  240. package/skills/integration/integration-nextjs-app-router/references/browser-sdk-2.md +4680 -0
  241. package/skills/integration/integration-nextjs-pages-router/SKILL.md +54 -0
  242. package/skills/integration/integration-nextjs-pages-router/references/EXAMPLE.md +735 -0
  243. package/skills/integration/integration-nextjs-pages-router/references/amplitude-quickstart.md +1845 -0
  244. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.0-begin.md +43 -0
  245. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.1-edit.md +35 -0
  246. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.2-revise.md +23 -0
  247. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.3-conclude.md +57 -0
  248. package/skills/integration/integration-nextjs-pages-router/references/browser-sdk-2.md +4680 -0
  249. package/skills/integration/integration-nuxt-3.6/SKILL.md +46 -0
  250. package/skills/integration/integration-nuxt-3.6/references/EXAMPLE.md +8422 -0
  251. package/skills/integration/integration-nuxt-3.6/references/amplitude-quickstart.md +1845 -0
  252. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.0-begin.md +43 -0
  253. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.1-edit.md +35 -0
  254. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.2-revise.md +23 -0
  255. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.3-conclude.md +57 -0
  256. package/skills/integration/integration-nuxt-3.6/references/browser-sdk-2.md +4680 -0
  257. package/skills/integration/integration-nuxt-4/SKILL.md +46 -0
  258. package/skills/integration/integration-nuxt-4/references/EXAMPLE.md +8670 -0
  259. package/skills/integration/integration-nuxt-4/references/amplitude-quickstart.md +1845 -0
  260. package/skills/integration/integration-nuxt-4/references/basic-integration-1.0-begin.md +43 -0
  261. package/skills/integration/integration-nuxt-4/references/basic-integration-1.1-edit.md +35 -0
  262. package/skills/integration/integration-nuxt-4/references/basic-integration-1.2-revise.md +23 -0
  263. package/skills/integration/integration-nuxt-4/references/basic-integration-1.3-conclude.md +57 -0
  264. package/skills/integration/integration-nuxt-4/references/browser-sdk-2.md +4680 -0
  265. package/skills/integration/integration-python/SKILL.md +53 -0
  266. package/skills/integration/integration-python/references/EXAMPLE.md +445 -0
  267. package/skills/integration/integration-python/references/amplitude-quickstart.md +1845 -0
  268. package/skills/integration/integration-python/references/basic-integration-1.0-begin.md +43 -0
  269. package/skills/integration/integration-python/references/basic-integration-1.1-edit.md +35 -0
  270. package/skills/integration/integration-python/references/basic-integration-1.2-revise.md +23 -0
  271. package/skills/integration/integration-python/references/basic-integration-1.3-conclude.md +57 -0
  272. package/skills/integration/integration-python/references/python.md +1424 -0
  273. package/skills/integration/integration-react-native/SKILL.md +49 -0
  274. package/skills/integration/integration-react-native/references/EXAMPLE.md +2253 -0
  275. package/skills/integration/integration-react-native/references/amplitude-quickstart.md +1845 -0
  276. package/skills/integration/integration-react-native/references/basic-integration-1.0-begin.md +43 -0
  277. package/skills/integration/integration-react-native/references/basic-integration-1.1-edit.md +35 -0
  278. package/skills/integration/integration-react-native/references/basic-integration-1.2-revise.md +23 -0
  279. package/skills/integration/integration-react-native/references/basic-integration-1.3-conclude.md +57 -0
  280. package/skills/integration/integration-react-native/references/react-native-sdk.md +2819 -0
  281. package/skills/integration/integration-react-react-router-6/SKILL.md +53 -0
  282. package/skills/integration/integration-react-react-router-6/references/EXAMPLE.md +570 -0
  283. package/skills/integration/integration-react-react-router-6/references/amplitude-quickstart.md +1845 -0
  284. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.0-begin.md +43 -0
  285. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.1-edit.md +35 -0
  286. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.2-revise.md +23 -0
  287. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.3-conclude.md +57 -0
  288. package/skills/integration/integration-react-react-router-6/references/browser-sdk-2.md +4680 -0
  289. package/skills/integration/integration-react-react-router-7-data/SKILL.md +53 -0
  290. package/skills/integration/integration-react-react-router-7-data/references/EXAMPLE.md +830 -0
  291. package/skills/integration/integration-react-react-router-7-data/references/amplitude-quickstart.md +1845 -0
  292. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.0-begin.md +43 -0
  293. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.1-edit.md +35 -0
  294. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.2-revise.md +23 -0
  295. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.3-conclude.md +57 -0
  296. package/skills/integration/integration-react-react-router-7-data/references/browser-sdk-2.md +4680 -0
  297. package/skills/integration/integration-react-react-router-7-declarative/SKILL.md +53 -0
  298. package/skills/integration/integration-react-react-router-7-declarative/references/EXAMPLE.md +609 -0
  299. package/skills/integration/integration-react-react-router-7-declarative/references/amplitude-quickstart.md +1845 -0
  300. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.0-begin.md +43 -0
  301. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.1-edit.md +35 -0
  302. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.2-revise.md +23 -0
  303. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.3-conclude.md +57 -0
  304. package/skills/integration/integration-react-react-router-7-declarative/references/browser-sdk-2.md +4680 -0
  305. package/skills/integration/integration-react-react-router-7-framework/SKILL.md +53 -0
  306. package/skills/integration/integration-react-react-router-7-framework/references/EXAMPLE.md +1081 -0
  307. package/skills/integration/integration-react-react-router-7-framework/references/amplitude-quickstart.md +1845 -0
  308. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.0-begin.md +43 -0
  309. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.1-edit.md +35 -0
  310. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.2-revise.md +23 -0
  311. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.3-conclude.md +57 -0
  312. package/skills/integration/integration-react-react-router-7-framework/references/browser-sdk-2.md +4680 -0
  313. package/skills/integration/integration-react-tanstack-router-code-based/SKILL.md +57 -0
  314. package/skills/integration/integration-react-tanstack-router-code-based/references/EXAMPLE.md +659 -0
  315. package/skills/integration/integration-react-tanstack-router-code-based/references/amplitude-quickstart.md +1845 -0
  316. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.0-begin.md +43 -0
  317. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.1-edit.md +35 -0
  318. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.2-revise.md +23 -0
  319. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.3-conclude.md +57 -0
  320. package/skills/integration/integration-react-tanstack-router-code-based/references/browser-sdk-2.md +4680 -0
  321. package/skills/integration/integration-react-tanstack-router-file-based/SKILL.md +57 -0
  322. package/skills/integration/integration-react-tanstack-router-file-based/references/EXAMPLE.md +777 -0
  323. package/skills/integration/integration-react-tanstack-router-file-based/references/amplitude-quickstart.md +1845 -0
  324. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.0-begin.md +43 -0
  325. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.1-edit.md +35 -0
  326. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.2-revise.md +23 -0
  327. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.3-conclude.md +57 -0
  328. package/skills/integration/integration-react-tanstack-router-file-based/references/browser-sdk-2.md +4680 -0
  329. package/skills/integration/integration-react-vite/SKILL.md +53 -0
  330. package/skills/integration/integration-react-vite/references/EXAMPLE.md +542 -0
  331. package/skills/integration/integration-react-vite/references/amplitude-quickstart.md +1845 -0
  332. package/skills/integration/integration-react-vite/references/basic-integration-1.0-begin.md +43 -0
  333. package/skills/integration/integration-react-vite/references/basic-integration-1.1-edit.md +35 -0
  334. package/skills/integration/integration-react-vite/references/basic-integration-1.2-revise.md +23 -0
  335. package/skills/integration/integration-react-vite/references/basic-integration-1.3-conclude.md +57 -0
  336. package/skills/integration/integration-react-vite/references/browser-sdk-2.md +4680 -0
  337. package/skills/integration/integration-ruby/SKILL.md +50 -0
  338. package/skills/integration/integration-ruby/references/EXAMPLE.md +420 -0
  339. package/skills/integration/integration-ruby/references/amplitude-quickstart.md +1845 -0
  340. package/skills/integration/integration-ruby/references/analytics.md +1778 -0
  341. package/skills/integration/integration-ruby/references/basic-integration-1.0-begin.md +43 -0
  342. package/skills/integration/integration-ruby/references/basic-integration-1.1-edit.md +35 -0
  343. package/skills/integration/integration-ruby/references/basic-integration-1.2-revise.md +23 -0
  344. package/skills/integration/integration-ruby/references/basic-integration-1.3-conclude.md +57 -0
  345. package/skills/integration/integration-ruby-on-rails/SKILL.md +55 -0
  346. package/skills/integration/integration-ruby-on-rails/references/EXAMPLE.md +1013 -0
  347. package/skills/integration/integration-ruby-on-rails/references/amplitude-quickstart.md +1845 -0
  348. package/skills/integration/integration-ruby-on-rails/references/analytics.md +1778 -0
  349. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.0-begin.md +43 -0
  350. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.1-edit.md +35 -0
  351. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.2-revise.md +23 -0
  352. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.3-conclude.md +57 -0
  353. package/skills/integration/integration-sveltekit/SKILL.md +47 -0
  354. package/skills/integration/integration-sveltekit/references/EXAMPLE.md +14121 -0
  355. package/skills/integration/integration-sveltekit/references/amplitude-quickstart.md +1845 -0
  356. package/skills/integration/integration-sveltekit/references/basic-integration-1.0-begin.md +43 -0
  357. package/skills/integration/integration-sveltekit/references/basic-integration-1.1-edit.md +35 -0
  358. package/skills/integration/integration-sveltekit/references/basic-integration-1.2-revise.md +23 -0
  359. package/skills/integration/integration-sveltekit/references/basic-integration-1.3-conclude.md +57 -0
  360. package/skills/integration/integration-sveltekit/references/browser-sdk-2.md +4680 -0
  361. package/skills/integration/integration-swift/SKILL.md +49 -0
  362. package/skills/integration/integration-swift/references/EXAMPLE.md +660 -0
  363. package/skills/integration/integration-swift/references/amplitude-quickstart.md +1845 -0
  364. package/skills/integration/integration-swift/references/analytics.md +1778 -0
  365. package/skills/integration/integration-swift/references/basic-integration-1.0-begin.md +43 -0
  366. package/skills/integration/integration-swift/references/basic-integration-1.1-edit.md +35 -0
  367. package/skills/integration/integration-swift/references/basic-integration-1.2-revise.md +23 -0
  368. package/skills/integration/integration-swift/references/basic-integration-1.3-conclude.md +57 -0
  369. package/skills/integration/integration-tanstack-start/SKILL.md +58 -0
  370. package/skills/integration/integration-tanstack-start/references/EXAMPLE.md +998 -0
  371. package/skills/integration/integration-tanstack-start/references/amplitude-quickstart.md +1845 -0
  372. package/skills/integration/integration-tanstack-start/references/basic-integration-1.0-begin.md +43 -0
  373. package/skills/integration/integration-tanstack-start/references/basic-integration-1.1-edit.md +35 -0
  374. package/skills/integration/integration-tanstack-start/references/basic-integration-1.2-revise.md +23 -0
  375. package/skills/integration/integration-tanstack-start/references/basic-integration-1.3-conclude.md +57 -0
  376. package/skills/integration/integration-tanstack-start/references/browser-sdk-2.md +4680 -0
  377. package/skills/integration/integration-vue-3/SKILL.md +46 -0
  378. package/skills/integration/integration-vue-3/references/EXAMPLE.md +846 -0
  379. package/skills/integration/integration-vue-3/references/amplitude-quickstart.md +1845 -0
  380. package/skills/integration/integration-vue-3/references/basic-integration-1.0-begin.md +43 -0
  381. package/skills/integration/integration-vue-3/references/basic-integration-1.1-edit.md +35 -0
  382. package/skills/integration/integration-vue-3/references/basic-integration-1.2-revise.md +23 -0
  383. package/skills/integration/integration-vue-3/references/basic-integration-1.3-conclude.md +57 -0
  384. package/skills/integration/integration-vue-3/references/browser-sdk-2.md +4680 -0
  385. package/skills/taxonomy/amplitude-quickstart-taxonomy-agent/SKILL.md +228 -0
  386. package/dist/src/ui/tui/components/TitleBar.d.ts +0 -8
  387. package/dist/src/ui/tui/components/TitleBar.js +0 -27
  388. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.d.ts +0 -7
  389. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.js +0 -101
  390. package/dist/src/utils/anthropic-status.d.ts +0 -17
  391. package/dist/src/utils/anthropic-status.js +0 -51
@@ -0,0 +1,830 @@
1
+ # Amplitude React Router v7 - Data mode Example Project
2
+
3
+ Repository: https://github.com/amplitude/context-hub
4
+ Path: basics/react-react-router-7-data
5
+
6
+ ---
7
+
8
+ ## README.md
9
+
10
+ # Amplitude React Router 7 Data Mode example
11
+
12
+ This is a [React Router 7](https://reactrouter.com) Data Mode example demonstrating Amplitude integration with product analytics and event tracking.
13
+
14
+ ### Amplitude SDKs
15
+
16
+ The browser uses 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 `index.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 settings are in [Unified SDK configuration](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#configuration). 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](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#unified-script-cdn), not the Unified **npm** row.
17
+
18
+ For API or server-side events, use [`@amplitude/analytics-node`](https://www.npmjs.com/package/@amplitude/analytics-node).
19
+
20
+ ## Features
21
+
22
+ - **Product Analytics**: Track user events and behaviors
23
+ - **User Authentication**: Demo login system with Amplitude user identification
24
+ - **Client-side Tracking**: Examples of client-side tracking methods
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
+ # or
51
+ pnpm dev
52
+ ```
53
+
54
+ Open [http://localhost:5173](http://localhost:5173) with your browser to see the app.
55
+
56
+ ## Project Structure
57
+
58
+ ```
59
+ app/
60
+ ├── components/
61
+ │ └── Header.tsx # Navigation header with auth state
62
+ ├── contexts/
63
+ │ └── AuthContext.tsx # Authentication context with Amplitude integration
64
+ ├── routes/
65
+ │ ├── home.tsx # Home/Login page
66
+ │ ├── burrito.tsx # Demo feature page with event tracking
67
+ │ └── profile.tsx # User profile page
68
+ └── root.tsx # Root layout component
69
+ index.tsx # App entry point with Amplitude initialization
70
+ ```
71
+
72
+ ## Key Integration Points
73
+
74
+ ### Client-side initialization (index.tsx)
75
+
76
+ ```typescript
77
+ import * as amplitude from '@amplitude/unified';
78
+
79
+ void amplitude.initAll(import.meta.env.VITE_PUBLIC_AMPLITUDE_API_KEY);
80
+ ```
81
+
82
+ ### User identification (contexts/AuthContext.tsx)
83
+
84
+ ```typescript
85
+ import * as amplitude from '@amplitude/unified';
86
+ import { Identify } from '@amplitude/unified';
87
+
88
+ amplitude.setUserId(username);
89
+ const identifyObj = new Identify();
90
+ identifyObj.set('username', username);
91
+ amplitude.identify(identifyObj);
92
+ amplitude.track('User Logged In', { username });
93
+ ```
94
+
95
+ ### Event tracking (routes/burrito.tsx)
96
+
97
+ ```typescript
98
+ amplitude.track('Burrito Considered', {
99
+ total_considerations: updatedUser.burritoConsiderations,
100
+ username: user.username,
101
+ });
102
+ ```
103
+
104
+ ## Learn More
105
+
106
+ - [Amplitude Documentation](https://amplitude.com/docs)
107
+ - [React Router 7 Documentation](https://reactrouter.com/home)
108
+ - [Amplitude Browser SDK](https://amplitude.com/docs/sdks/analytics/browser/browser-sdk-2)
109
+
110
+ ---
111
+
112
+ ## .env.example
113
+
114
+ ```example
115
+ VITE_PUBLIC_AMPLITUDE_API_KEY=
116
+
117
+ ```
118
+
119
+ ---
120
+
121
+ ## .react-router/types/+future.ts
122
+
123
+ ```ts
124
+ // Generated by React Router
125
+
126
+ import "react-router";
127
+
128
+ declare module "react-router" {
129
+ interface Future {
130
+ v8_middleware: false
131
+ }
132
+ }
133
+ ```
134
+
135
+ ---
136
+
137
+ ## .react-router/types/+routes.ts
138
+
139
+ ```ts
140
+ // Generated by React Router
141
+
142
+ import "react-router"
143
+
144
+ declare module "react-router" {
145
+ interface Register {
146
+ pages: Pages
147
+ routeFiles: RouteFiles
148
+ routeModules: RouteModules
149
+ }
150
+ }
151
+
152
+ type Pages = {
153
+ "/": {
154
+ params: {};
155
+ };
156
+ };
157
+
158
+ type RouteFiles = {
159
+ "root.tsx": {
160
+ id: "root";
161
+ page: "/";
162
+ };
163
+ "routes/home.tsx": {
164
+ id: "routes/home";
165
+ page: "/";
166
+ };
167
+ };
168
+
169
+ type RouteModules = {
170
+ "root": typeof import("./app/root.tsx");
171
+ "routes/home": typeof import("./app/routes/home.tsx");
172
+ };
173
+ ```
174
+
175
+ ---
176
+
177
+ ## .react-router/types/app/+types/root.ts
178
+
179
+ ```ts
180
+ // Generated by React Router
181
+
182
+ import type { GetInfo, GetAnnotations } from "react-router/internal";
183
+
184
+ type Module = typeof import("../root.js")
185
+
186
+ type Info = GetInfo<{
187
+ file: "root.tsx",
188
+ module: Module
189
+ }>
190
+
191
+ type Matches = [{
192
+ id: "root";
193
+ module: typeof import("../root.js");
194
+ }];
195
+
196
+ type Annotations = GetAnnotations<Info & { module: Module, matches: Matches }, false>;
197
+
198
+ export namespace Route {
199
+ // links
200
+ export type LinkDescriptors = Annotations["LinkDescriptors"];
201
+ export type LinksFunction = Annotations["LinksFunction"];
202
+
203
+ // meta
204
+ export type MetaArgs = Annotations["MetaArgs"];
205
+ export type MetaDescriptors = Annotations["MetaDescriptors"];
206
+ export type MetaFunction = Annotations["MetaFunction"];
207
+
208
+ // headers
209
+ export type HeadersArgs = Annotations["HeadersArgs"];
210
+ export type HeadersFunction = Annotations["HeadersFunction"];
211
+
212
+ // middleware
213
+ export type MiddlewareFunction = Annotations["MiddlewareFunction"];
214
+
215
+ // clientMiddleware
216
+ export type ClientMiddlewareFunction = Annotations["ClientMiddlewareFunction"];
217
+
218
+ // loader
219
+ export type LoaderArgs = Annotations["LoaderArgs"];
220
+
221
+ // clientLoader
222
+ export type ClientLoaderArgs = Annotations["ClientLoaderArgs"];
223
+
224
+ // action
225
+ export type ActionArgs = Annotations["ActionArgs"];
226
+
227
+ // clientAction
228
+ export type ClientActionArgs = Annotations["ClientActionArgs"];
229
+
230
+ // HydrateFallback
231
+ export type HydrateFallbackProps = Annotations["HydrateFallbackProps"];
232
+
233
+ // Component
234
+ export type ComponentProps = Annotations["ComponentProps"];
235
+
236
+ // ErrorBoundary
237
+ export type ErrorBoundaryProps = Annotations["ErrorBoundaryProps"];
238
+ }
239
+ ```
240
+
241
+ ---
242
+
243
+ ## .react-router/types/app/routes/+types/home.ts
244
+
245
+ ```ts
246
+ // Generated by React Router
247
+
248
+ import type { GetInfo, GetAnnotations } from "react-router/internal";
249
+
250
+ type Module = typeof import("../home.js")
251
+
252
+ type Info = GetInfo<{
253
+ file: "routes/home.tsx",
254
+ module: Module
255
+ }>
256
+
257
+ type Matches = [{
258
+ id: "root";
259
+ module: typeof import("../../root.js");
260
+ }, {
261
+ id: "routes/home";
262
+ module: typeof import("../home.js");
263
+ }];
264
+
265
+ type Annotations = GetAnnotations<Info & { module: Module, matches: Matches }, false>;
266
+
267
+ export namespace Route {
268
+ // links
269
+ export type LinkDescriptors = Annotations["LinkDescriptors"];
270
+ export type LinksFunction = Annotations["LinksFunction"];
271
+
272
+ // meta
273
+ export type MetaArgs = Annotations["MetaArgs"];
274
+ export type MetaDescriptors = Annotations["MetaDescriptors"];
275
+ export type MetaFunction = Annotations["MetaFunction"];
276
+
277
+ // headers
278
+ export type HeadersArgs = Annotations["HeadersArgs"];
279
+ export type HeadersFunction = Annotations["HeadersFunction"];
280
+
281
+ // middleware
282
+ export type MiddlewareFunction = Annotations["MiddlewareFunction"];
283
+
284
+ // clientMiddleware
285
+ export type ClientMiddlewareFunction = Annotations["ClientMiddlewareFunction"];
286
+
287
+ // loader
288
+ export type LoaderArgs = Annotations["LoaderArgs"];
289
+
290
+ // clientLoader
291
+ export type ClientLoaderArgs = Annotations["ClientLoaderArgs"];
292
+
293
+ // action
294
+ export type ActionArgs = Annotations["ActionArgs"];
295
+
296
+ // clientAction
297
+ export type ClientActionArgs = Annotations["ClientActionArgs"];
298
+
299
+ // HydrateFallback
300
+ export type HydrateFallbackProps = Annotations["HydrateFallbackProps"];
301
+
302
+ // Component
303
+ export type ComponentProps = Annotations["ComponentProps"];
304
+
305
+ // ErrorBoundary
306
+ export type ErrorBoundaryProps = Annotations["ErrorBoundaryProps"];
307
+ }
308
+ ```
309
+
310
+ ---
311
+
312
+ ## app/components/Header.tsx
313
+
314
+ ```tsx
315
+ import { Link } from 'react-router';
316
+ import { useAuth } from '../contexts/AuthContext';
317
+ import * as amplitude from '@amplitude/unified';
318
+
319
+ export default function Header() {
320
+ const { user, logout } = useAuth();
321
+
322
+ const handleLogout = () => {
323
+ amplitude.track('User Logged Out');
324
+ amplitude.reset();
325
+ logout();
326
+ };
327
+
328
+ return (
329
+ <header className="header">
330
+ <div className="header-container">
331
+ <nav>
332
+ <Link to="/">Home</Link>
333
+ {user && (
334
+ <>
335
+ <Link to="/burrito">Burrito Consideration</Link>
336
+ <Link to="/profile">Profile</Link>
337
+ </>
338
+ )}
339
+ </nav>
340
+ <div className="user-section">
341
+ {user ? (
342
+ <>
343
+ <span>Welcome, {user.username}!</span>
344
+ <button onClick={handleLogout} className="btn-logout">
345
+ Logout
346
+ </button>
347
+ </>
348
+ ) : (
349
+ <span>Not logged in</span>
350
+ )}
351
+ </div>
352
+ </div>
353
+ </header>
354
+ );
355
+ }
356
+
357
+ ```
358
+
359
+ ---
360
+
361
+ ## app/contexts/AuthContext.tsx
362
+
363
+ ```tsx
364
+ import * as amplitude from '@amplitude/unified';
365
+ import { Identify } from '@amplitude/unified';
366
+ import { createContext, useContext, useState, type ReactNode } from 'react';
367
+
368
+ interface User {
369
+ username: string;
370
+ burritoConsiderations: number;
371
+ }
372
+
373
+ interface AuthContextType {
374
+ user: User | null;
375
+ login: (username: string, password: string) => Promise<boolean>;
376
+ logout: () => void;
377
+ setUser: (user: User) => void;
378
+ }
379
+
380
+ const AuthContext = createContext<AuthContextType | undefined>(undefined);
381
+
382
+ const users: Map<string, User> = new Map();
383
+
384
+ export function AuthProvider({ children }: { children: ReactNode }) {
385
+ const [user, setUser] = useState<User | null>(() => {
386
+ if (typeof window === 'undefined') return null;
387
+
388
+ const storedUsername = localStorage.getItem('currentUser');
389
+ if (storedUsername) {
390
+ const existingUser = users.get(storedUsername);
391
+ if (existingUser) {
392
+ return existingUser;
393
+ }
394
+ }
395
+ return null;
396
+ });
397
+
398
+ const login = async (username: string, password: string): Promise<boolean> => {
399
+ // Client-side only fake auth - no server calls
400
+ if (!username || !password) {
401
+ return false;
402
+ }
403
+
404
+ let localUser = users.get(username);
405
+ if (!localUser) {
406
+ localUser = {
407
+ username,
408
+ burritoConsiderations: 0
409
+ };
410
+ users.set(username, localUser);
411
+ }
412
+
413
+ setUser(localUser);
414
+ localStorage.setItem('currentUser', username);
415
+
416
+ // Identify user in Amplitude using username as user ID
417
+ amplitude.setUserId(username);
418
+ const identifyObj = new Identify();
419
+ identifyObj.set('username', username);
420
+ amplitude.identify(identifyObj);
421
+ amplitude.track('User Logged In', { username });
422
+
423
+ return true;
424
+ };
425
+
426
+ const logout = () => {
427
+ setUser(null);
428
+ localStorage.removeItem('currentUser');
429
+ };
430
+
431
+ const setUserState = (newUser: User) => {
432
+ setUser(newUser);
433
+ users.set(newUser.username, newUser);
434
+ };
435
+
436
+ return (
437
+ <AuthContext.Provider value={{ user, login, logout, setUser: setUserState }}>
438
+ {children}
439
+ </AuthContext.Provider>
440
+ );
441
+ }
442
+
443
+ export function useAuth() {
444
+ const context = useContext(AuthContext);
445
+ if (context === undefined) {
446
+ throw new Error('useAuth must be used within an AuthProvider');
447
+ }
448
+ return context;
449
+ }
450
+
451
+ ```
452
+
453
+ ---
454
+
455
+ ## app/root.tsx
456
+
457
+ ```tsx
458
+ import { Outlet, useRouteError, isRouteErrorResponse } from "react-router";
459
+ import Header from "./components/Header";
460
+ import { AuthProvider } from "./contexts/AuthContext";
461
+ import "./globals.css";
462
+
463
+ export default function Root() {
464
+ return (
465
+ <AuthProvider>
466
+ <Header />
467
+ <main>
468
+ <Outlet />
469
+ </main>
470
+ </AuthProvider>
471
+ );
472
+ }
473
+
474
+ export function RootErrorBoundary() {
475
+ const error = useRouteError();
476
+
477
+ if (isRouteErrorResponse(error)) {
478
+ return (
479
+ <>
480
+ <h1>
481
+ {error.status} {error.statusText}
482
+ </h1>
483
+ <p>{error.data}</p>
484
+ </>
485
+ );
486
+ } else if (error instanceof Error) {
487
+ return (
488
+ <div>
489
+ <h1>Error</h1>
490
+ <p>{error.message}</p>
491
+ <p>The stack trace is:</p>
492
+ <pre>{error.stack}</pre>
493
+ </div>
494
+ );
495
+ } else {
496
+ return <h1>Unknown Error</h1>;
497
+ }
498
+ }
499
+
500
+ ```
501
+
502
+ ---
503
+
504
+ ## app/routes.tsx
505
+
506
+ ```tsx
507
+ import React from "react";
508
+ import type { RouteObject } from "react-router";
509
+ import Root, { RootErrorBoundary } from "./root";
510
+ import Home from "./routes/home";
511
+ import Burrito from "./routes/burrito";
512
+ import Profile from "./routes/profile";
513
+
514
+ export const routes: RouteObject[] = [
515
+ {
516
+ path: "/",
517
+ element: <Root />,
518
+ ErrorBoundary: RootErrorBoundary,
519
+ children: [
520
+ {
521
+ index: true,
522
+ element: <Home />,
523
+ },
524
+ {
525
+ path: "burrito",
526
+ element: <Burrito />,
527
+ },
528
+ {
529
+ path: "profile",
530
+ element: <Profile />,
531
+ },
532
+ ],
533
+ },
534
+ ];
535
+
536
+
537
+ ```
538
+
539
+ ---
540
+
541
+ ## app/routes/burrito.tsx
542
+
543
+ ```tsx
544
+ import { useState, useEffect } from 'react';
545
+ import { useNavigate } from 'react-router';
546
+ import { useAuth } from '../contexts/AuthContext';
547
+ import * as amplitude from '@amplitude/unified';
548
+
549
+ export default function BurritoPage() {
550
+ const { user, setUser } = useAuth();
551
+ const navigate = useNavigate();
552
+ const [hasConsidered, setHasConsidered] = useState(false);
553
+
554
+ useEffect(() => {
555
+ if (!user) {
556
+ navigate('/');
557
+ }
558
+ }, [user, navigate]);
559
+
560
+ if (!user) {
561
+ return null;
562
+ }
563
+
564
+ const handleConsideration = () => {
565
+ // Client-side only - no server calls
566
+ const updatedUser = {
567
+ ...user,
568
+ burritoConsiderations: user.burritoConsiderations + 1
569
+ };
570
+ setUser(updatedUser);
571
+ setHasConsidered(true);
572
+ setTimeout(() => setHasConsidered(false), 2000);
573
+
574
+ // Capture burrito consideration event
575
+ amplitude.track('Burrito Considered', {
576
+ total_considerations: updatedUser.burritoConsiderations,
577
+ username: user.username,
578
+ });
579
+ };
580
+
581
+ return (
582
+ <div className="container">
583
+ <h1>Burrito consideration zone</h1>
584
+ <p>Take a moment to truly consider the potential of burritos.</p>
585
+
586
+ <div style={{ textAlign: 'center' }}>
587
+ <button
588
+ onClick={handleConsideration}
589
+ className="btn-burrito"
590
+ >
591
+ I have considered the burrito potential
592
+ </button>
593
+
594
+ {hasConsidered && (
595
+ <p className="success">
596
+ Thank you for your consideration! Count: {user.burritoConsiderations}
597
+ </p>
598
+ )}
599
+ </div>
600
+
601
+ <div className="stats">
602
+ <h3>Consideration stats</h3>
603
+ <p>Total considerations: {user.burritoConsiderations}</p>
604
+ </div>
605
+ </div>
606
+ );
607
+ }
608
+
609
+ ```
610
+
611
+ ---
612
+
613
+ ## app/routes/home.tsx
614
+
615
+ ```tsx
616
+ import { useState } from 'react';
617
+ import { useAuth } from '../contexts/AuthContext';
618
+
619
+ export default function Home() {
620
+ const { user, login } = useAuth();
621
+ const [username, setUsername] = useState('');
622
+ const [password, setPassword] = useState('');
623
+ const [error, setError] = useState('');
624
+
625
+ const handleSubmit = async (e: React.FormEvent) => {
626
+ e.preventDefault();
627
+ setError('');
628
+
629
+ const success = await login(username, password);
630
+ if (success) {
631
+ setUsername('');
632
+ setPassword('');
633
+ } else {
634
+ setError('Please provide both username and password');
635
+ }
636
+ };
637
+
638
+ if (user) {
639
+ return (
640
+ <div className="container">
641
+ <h1>Welcome back, {user.username}!</h1>
642
+ <p>You are now logged in. Feel free to explore:</p>
643
+ <ul>
644
+ <li>Consider the potential of burritos</li>
645
+ <li>View your profile and statistics</li>
646
+ </ul>
647
+ </div>
648
+ );
649
+ }
650
+
651
+ return (
652
+ <div className="container">
653
+ <h1>Welcome to Burrito Consideration App</h1>
654
+ <p>Please sign in to begin your burrito journey</p>
655
+
656
+ <form onSubmit={handleSubmit} className="form">
657
+ <div className="form-group">
658
+ <label htmlFor="username">Username:</label>
659
+ <input
660
+ type="text"
661
+ id="username"
662
+ value={username}
663
+ onChange={(e) => setUsername(e.target.value)}
664
+ placeholder="Enter any username"
665
+ />
666
+ </div>
667
+
668
+ <div className="form-group">
669
+ <label htmlFor="password">Password:</label>
670
+ <input
671
+ type="password"
672
+ id="password"
673
+ value={password}
674
+ onChange={(e) => setPassword(e.target.value)}
675
+ placeholder="Enter any password"
676
+ />
677
+ </div>
678
+
679
+ {error && <p className="error">{error}</p>}
680
+
681
+ <button type="submit" className="btn-primary">Sign In</button>
682
+ </form>
683
+
684
+ <p className="note">
685
+ Note: This is a demo app. Use any username and password to sign in.
686
+ </p>
687
+ </div>
688
+ );
689
+ }
690
+
691
+ ```
692
+
693
+ ---
694
+
695
+ ## app/routes/profile.tsx
696
+
697
+ ```tsx
698
+ import { useEffect } from 'react';
699
+ import { useNavigate } from 'react-router';
700
+ import { useAuth } from '../contexts/AuthContext';
701
+
702
+ export default function ProfilePage() {
703
+ const { user } = useAuth();
704
+ const navigate = useNavigate();
705
+
706
+ useEffect(() => {
707
+ if (!user) {
708
+ navigate('/');
709
+ }
710
+ }, [user, navigate]);
711
+
712
+ if (!user) {
713
+ return null;
714
+ }
715
+
716
+ return (
717
+ <div className="container">
718
+ <h1>User Profile</h1>
719
+
720
+ <div className="stats">
721
+ <h2>Your Information</h2>
722
+ <p><strong>Username:</strong> {user.username}</p>
723
+ <p><strong>Burrito Considerations:</strong> {user.burritoConsiderations}</p>
724
+ </div>
725
+
726
+ <div style={{ marginTop: '2rem' }}>
727
+ <h3>Your Burrito Journey</h3>
728
+ {user.burritoConsiderations === 0 ? (
729
+ <p>You haven&apos;t considered any burritos yet. Visit the Burrito Consideration page to start!</p>
730
+ ) : user.burritoConsiderations === 1 ? (
731
+ <p>You&apos;ve considered the burrito potential once. Keep going!</p>
732
+ ) : user.burritoConsiderations < 5 ? (
733
+ <p>You&apos;re getting the hang of burrito consideration!</p>
734
+ ) : user.burritoConsiderations < 10 ? (
735
+ <p>You&apos;re becoming a burrito consideration expert!</p>
736
+ ) : (
737
+ <p>You are a true burrito consideration master! 🌯</p>
738
+ )}
739
+ </div>
740
+ </div>
741
+ );
742
+ }
743
+
744
+ ```
745
+
746
+ ---
747
+
748
+ ## index.html
749
+
750
+ ```html
751
+ <!DOCTYPE html>
752
+ <html lang="en">
753
+ <head>
754
+ <meta charset="UTF-8" />
755
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
756
+ <title>React Router 7 Data Mode</title>
757
+ </head>
758
+ <body>
759
+ <div id="root"></div>
760
+ <script type="module" src="/index.tsx"></script>
761
+ </body>
762
+ </html>
763
+
764
+ ```
765
+
766
+ ---
767
+
768
+ ## index.tsx
769
+
770
+ ```tsx
771
+ import { StrictMode } from "react";
772
+ import { createRoot } from "react-dom/client";
773
+ import { createBrowserRouter, RouterProvider } from "react-router";
774
+ import Root, { RootErrorBoundary } from "./app/root";
775
+ import Home from "./app/routes/home";
776
+ import Burrito from "./app/routes/burrito";
777
+ import Profile from "./app/routes/profile";
778
+
779
+ import * as amplitude from '@amplitude/unified'
780
+
781
+ void amplitude.initAll(import.meta.env.VITE_PUBLIC_AMPLITUDE_API_KEY);
782
+
783
+ const router = createBrowserRouter([
784
+ {
785
+ path: "/",
786
+ Component: Root,
787
+ ErrorBoundary: RootErrorBoundary,
788
+ children: [
789
+ {
790
+ index: true,
791
+ Component: Home,
792
+ },
793
+ {
794
+ path: "burrito",
795
+ Component: Burrito,
796
+ },
797
+ {
798
+ path: "profile",
799
+ Component: Profile,
800
+ },
801
+ ],
802
+ },
803
+ ]);
804
+
805
+ createRoot(document.getElementById("root")!).render(
806
+ <StrictMode>
807
+ <RouterProvider router={router} />
808
+ </StrictMode>
809
+ );
810
+
811
+ ```
812
+
813
+ ---
814
+
815
+ ## vite.config.ts
816
+
817
+ ```ts
818
+ import { defineConfig } from "vite";
819
+ import react from "@vitejs/plugin-react";
820
+ import tsconfigPaths from "vite-tsconfig-paths";
821
+
822
+ export default defineConfig({
823
+ plugins: [react(), tsconfigPaths()],
824
+ });
825
+
826
+
827
+ ```
828
+
829
+ ---
830
+