@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,57 @@
1
+ ---
2
+ name: integration-react-tanstack-router-code-based
3
+ description: >-
4
+ Amplitude integration for React applications using TanStack Router with
5
+ code-based routing
6
+ metadata:
7
+ author: Amplitude
8
+ version: dev
9
+ ---
10
+
11
+ # Amplitude integration for React with TanStack Router (code-based)
12
+
13
+ This skill helps you add Amplitude analytics to React with TanStack Router (code-based) applications.
14
+
15
+ ## Workflow
16
+
17
+ Follow these steps in order to complete the integration:
18
+
19
+ 1. `basic-integration-1.0-begin.md` - Amplitude Setup - Begin ← **Start here**
20
+ 2. `basic-integration-1.1-edit.md` - Amplitude Setup - Edit
21
+ 3. `basic-integration-1.2-revise.md` - Amplitude Setup - Revise
22
+ 4. `basic-integration-1.3-conclude.md` - Amplitude Setup - Conclusion
23
+
24
+ ## Reference files
25
+
26
+ - `references/EXAMPLE.md` - React with TanStack Router (code-based) example project code
27
+ - `references/browser-sdk-2.md` - Or install unified SDK to get access to all Amplitude products
28
+ - `references/amplitude-quickstart.md` - Amplitude documentation for Amplitude Quickstart
29
+ - `references/basic-integration-1.0-begin.md` - Amplitude setup - begin
30
+ - `references/basic-integration-1.1-edit.md` - Amplitude setup - edit
31
+ - `references/basic-integration-1.2-revise.md` - Amplitude setup - revise
32
+ - `references/basic-integration-1.3-conclude.md` - Amplitude setup - conclusion
33
+
34
+ The example project shows the target implementation pattern. Consult the documentation for API details.
35
+
36
+ ## Key principles
37
+
38
+ - **Environment variables**: Always use environment variables for Amplitude keys. Never hardcode them.
39
+ - **Minimal changes**: Add Amplitude code alongside existing integrations. Don't replace or restructure existing code.
40
+ - **Match the example**: Your implementation should follow the example project's patterns as closely as possible.
41
+
42
+ ## Framework guidelines
43
+
44
+ - For feature flags, use the Amplitude Experiment React SDK hooks (useVariantValue, useExperiment) — they handle loading states and async fetch automatically
45
+ - Add analytics track calls in event handlers where user actions occur, NOT in useEffect reacting to state changes
46
+ - Do NOT use useEffect for data transformation - calculate derived values during render instead
47
+ - Do NOT use useEffect to respond to user events - put that logic in the event handler itself
48
+ - Do NOT use useEffect to chain state updates - calculate all related updates together in the event handler
49
+ - Do NOT use useEffect to notify parent components - call the parent callback alongside setState in the event handler
50
+ - To reset component state when a prop changes, pass the prop as the component's key instead of using useEffect
51
+ - useEffect is ONLY for synchronizing with external systems (non-React widgets, browser APIs, network subscriptions)
52
+ - Use TanStack Router's built-in navigation events for pageview tracking instead of useEffect
53
+ - Initialize Amplitude once in the root component defined in either the file-based convention (__root.tsx) or code-based convention (wherever createRootRoute() is called) so all child routes have access to the Amplitude client
54
+
55
+ ## Identifying users
56
+
57
+ Identify users during login and signup events. Refer to the example code and documentation for the correct identify pattern for this framework. Call `amplitude.setUserId(userId)` to associate events with a known user, and use `amplitude.identify()` with an `Identify` object to set user properties. If both frontend and backend code exist, pass a consistent user/device ID via custom request headers to maintain event correlation.
@@ -0,0 +1,659 @@
1
+ # Amplitude React with TanStack Router (code-based) Example Project
2
+
3
+ Repository: https://github.com/amplitude/context-hub
4
+ Path: basics/react-tanstack-router-code-based
5
+
6
+ ---
7
+
8
+ ## README.md
9
+
10
+ # Amplitude TanStack Router Example (Code-Based Routing)
11
+
12
+ This is a React and [TanStack Router](https://tanstack.com/router) example demonstrating Amplitude integration with product analytics and event tracking. This example uses **code-based routing** where routes are defined programmatically.
13
+
14
+ ### Amplitude SDKs
15
+
16
+ The client 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` once in `main.tsx`. [Initialize the Unified SDK](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#initialize-the-unified-sdk) documents that call as initializing every product bundled with Unified npm; see [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 the [CDN unified script](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#unified-script-cdn), not Unified **npm**.
17
+
18
+ When you add a backend or API, send events with [`@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
+ ```
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 (main.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 (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
+ ### Event tracking
78
+
79
+ ```typescript
80
+ amplitude.track('Burrito Considered', {
81
+ total_considerations: user.burritoConsiderations + 1,
82
+ username: user.username,
83
+ });
84
+ ```
85
+
86
+ ## Learn More
87
+
88
+ - [Amplitude Documentation](https://amplitude.com/docs)
89
+ - [TanStack Router Documentation](https://tanstack.com/router/latest)
90
+ - [Amplitude Browser SDK](https://amplitude.com/docs/sdks/analytics/browser/browser-sdk-2)
91
+
92
+ ---
93
+
94
+ ## .env.example
95
+
96
+ ```example
97
+ VITE_PUBLIC_AMPLITUDE_API_KEY=
98
+
99
+ ```
100
+
101
+ ---
102
+
103
+ ## .prettierignore
104
+
105
+ ```
106
+ package-lock.json
107
+ pnpm-lock.yaml
108
+ yarn.lock
109
+
110
+ ```
111
+
112
+ ---
113
+
114
+ ## index.html
115
+
116
+ ```html
117
+ <!DOCTYPE html>
118
+ <html lang="en">
119
+ <head>
120
+ <meta charset="UTF-8" />
121
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
122
+ <link rel="icon" href="/favicon.ico" />
123
+ <meta name="theme-color" content="#000000" />
124
+ <meta
125
+ name="description"
126
+ content="React TanStack Router code-based routing example"
127
+ />
128
+ <link rel="apple-touch-icon" href="/logo192.png" />
129
+ <link rel="manifest" href="/manifest.json" />
130
+ <title>React TanStack Router - Code-Based</title>
131
+ </head>
132
+ <body>
133
+ <div id="app"></div>
134
+ <script type="module" src="/src/main.tsx"></script>
135
+ </body>
136
+ </html>
137
+
138
+ ```
139
+
140
+ ---
141
+
142
+ ## prettier.config.js
143
+
144
+ ```js
145
+ // @ts-check
146
+
147
+ /** @type {import('prettier').Config} */
148
+ const config = {
149
+ semi: false,
150
+ singleQuote: true,
151
+ trailingComma: "all",
152
+ };
153
+
154
+ export default config;
155
+
156
+ ```
157
+
158
+ ---
159
+
160
+ ## public/robots.txt
161
+
162
+ ```txt
163
+ # https://www.robotstxt.org/robotstxt.html
164
+ User-agent: *
165
+ Disallow:
166
+
167
+ ```
168
+
169
+ ---
170
+
171
+ ## src/contexts/AuthContext.tsx
172
+
173
+ ```tsx
174
+ import * as amplitude from '@amplitude/unified';
175
+ import { Identify } from '@amplitude/unified';
176
+ import { createContext, useContext, useState } from 'react';
177
+ import type { ReactNode } from 'react';
178
+
179
+ interface User {
180
+ username: string;
181
+ burritoConsiderations: number;
182
+ }
183
+
184
+ interface AuthContextType {
185
+ user: User | null;
186
+ login: (username: string, password: string) => Promise<boolean>;
187
+ logout: () => void;
188
+ incrementBurritoConsiderations: () => void;
189
+ }
190
+
191
+ const AuthContext = createContext<AuthContextType | undefined>(undefined);
192
+
193
+ const users: Map<string, User> = new Map();
194
+
195
+ export function AuthProvider({ children }: { children: ReactNode }) {
196
+ // Use lazy initializer to read from localStorage only once on mount
197
+ const [user, setUser] = useState<User | null>(() => {
198
+ if (typeof window === 'undefined') return null;
199
+
200
+ const storedUsername = localStorage.getItem('currentUser');
201
+ if (storedUsername) {
202
+ const existingUser = users.get(storedUsername);
203
+ if (existingUser) {
204
+ return existingUser;
205
+ }
206
+ }
207
+ return null;
208
+ });
209
+
210
+ const login = (username: string, password: string): Promise<boolean> => {
211
+ if (!username || !password) {
212
+ return Promise.resolve(false);
213
+ }
214
+
215
+ // Get or create user in local map
216
+ let localUser = users.get(username);
217
+ const isNewUser = !localUser;
218
+
219
+ if (!localUser) {
220
+ localUser = { username, burritoConsiderations: 0 };
221
+ users.set(username, localUser);
222
+ }
223
+
224
+ setUser(localUser);
225
+ localStorage.setItem('currentUser', username);
226
+
227
+ // Identify user in Amplitude using username as user ID
228
+ amplitude.setUserId(username);
229
+ const identifyObj = new Identify();
230
+ identifyObj.set('username', username);
231
+ amplitude.identify(identifyObj);
232
+
233
+ // Capture login event
234
+ amplitude.track('User Logged In', {
235
+ username,
236
+ isNewUser,
237
+ });
238
+
239
+ return Promise.resolve(true);
240
+ };
241
+
242
+ const logout = () => {
243
+ // Capture logout event before resetting
244
+ amplitude.track('User Logged Out');
245
+ amplitude.reset();
246
+
247
+ setUser(null);
248
+ localStorage.removeItem('currentUser');
249
+ };
250
+
251
+ const incrementBurritoConsiderations = () => {
252
+ if (user) {
253
+ user.burritoConsiderations++;
254
+ users.set(user.username, user);
255
+ setUser({ ...user });
256
+ }
257
+ };
258
+
259
+ return (
260
+ <AuthContext.Provider value={{ user, login, logout, incrementBurritoConsiderations }}>
261
+ {children}
262
+ </AuthContext.Provider>
263
+ );
264
+ }
265
+
266
+ export function useAuth() {
267
+ const context = useContext(AuthContext);
268
+ if (context === undefined) {
269
+ throw new Error('useAuth must be used within an AuthProvider');
270
+ }
271
+ return context;
272
+ }
273
+
274
+ ```
275
+
276
+ ---
277
+
278
+ ## src/main.tsx
279
+
280
+ ```tsx
281
+ import { StrictMode, useState } from 'react'
282
+ import ReactDOM from 'react-dom/client'
283
+ import {
284
+ Link,
285
+ Outlet,
286
+ RouterProvider,
287
+ createRootRoute,
288
+ createRoute,
289
+ createRouter,
290
+ useNavigate,
291
+ } from '@tanstack/react-router'
292
+ import { TanStackRouterDevtoolsPanel } from '@tanstack/react-router-devtools'
293
+ import { TanStackDevtools } from '@tanstack/react-devtools'
294
+ import * as amplitude from '@amplitude/unified'
295
+
296
+ import { AuthProvider, useAuth } from './contexts/AuthContext'
297
+ import './styles.css'
298
+ import reportWebVitals from './reportWebVitals'
299
+
300
+ // Initialize Amplitude
301
+ void amplitude.initAll(import.meta.env.VITE_PUBLIC_AMPLITUDE_API_KEY)
302
+
303
+ // ============================================================================
304
+ // Root Route
305
+ // ============================================================================
306
+
307
+ const rootRoute = createRootRoute({
308
+ component: RootComponent,
309
+ })
310
+
311
+ function RootComponent() {
312
+ return (
313
+ <AuthProvider>
314
+ <Header />
315
+ <main>
316
+ <Outlet />
317
+ </main>
318
+ <TanStackDevtools
319
+ config={{
320
+ position: 'bottom-right',
321
+ }}
322
+ plugins={[
323
+ {
324
+ name: 'Tanstack Router',
325
+ render: <TanStackRouterDevtoolsPanel />,
326
+ },
327
+ ]}
328
+ />
329
+ </AuthProvider>
330
+ )
331
+ }
332
+
333
+ // ============================================================================
334
+ // Header Component
335
+ // ============================================================================
336
+
337
+ function Header() {
338
+ const { user, logout } = useAuth()
339
+
340
+ return (
341
+ <header className="header">
342
+ <div className="header-container">
343
+ <nav>
344
+ <Link to="/">Home</Link>
345
+ {user && (
346
+ <>
347
+ <Link to="/burrito">Burrito Consideration</Link>
348
+ <Link to="/profile">Profile</Link>
349
+ </>
350
+ )}
351
+ </nav>
352
+ <div className="user-section">
353
+ {user ? (
354
+ <>
355
+ <span>Welcome, {user.username}!</span>
356
+ <button onClick={logout} className="btn-logout">
357
+ Logout
358
+ </button>
359
+ </>
360
+ ) : (
361
+ <span>Not logged in</span>
362
+ )}
363
+ </div>
364
+ </div>
365
+ </header>
366
+ )
367
+ }
368
+
369
+ // ============================================================================
370
+ // Index Route (Home Page)
371
+ // ============================================================================
372
+
373
+ const indexRoute = createRoute({
374
+ getParentRoute: () => rootRoute,
375
+ path: '/',
376
+ component: Home,
377
+ })
378
+
379
+ function Home() {
380
+ const { user, login } = useAuth()
381
+ const [username, setUsername] = useState('')
382
+ const [password, setPassword] = useState('')
383
+ const [error, setError] = useState('')
384
+
385
+ const handleSubmit = async (e: React.FormEvent) => {
386
+ e.preventDefault()
387
+ setError('')
388
+
389
+ try {
390
+ const success = await login(username, password)
391
+ if (success) {
392
+ setUsername('')
393
+ setPassword('')
394
+ } else {
395
+ setError('Please provide both username and password')
396
+ }
397
+ } catch (err) {
398
+ console.error('Login failed:', err)
399
+ setError('An error occurred during login')
400
+ }
401
+ }
402
+
403
+ if (user) {
404
+ return (
405
+ <div className="container">
406
+ <h1>Welcome back, {user.username}!</h1>
407
+ <p>You are now logged in. Feel free to explore:</p>
408
+ <ul>
409
+ <li>Consider the potential of burritos</li>
410
+ <li>View your profile and statistics</li>
411
+ </ul>
412
+ </div>
413
+ )
414
+ }
415
+
416
+ return (
417
+ <div className="container">
418
+ <h1>Welcome to Burrito Consideration App</h1>
419
+ <p>Please sign in to begin your burrito journey</p>
420
+
421
+ <form onSubmit={handleSubmit} className="form">
422
+ <div className="form-group">
423
+ <label htmlFor="username">Username:</label>
424
+ <input
425
+ type="text"
426
+ id="username"
427
+ value={username}
428
+ onChange={(e) => setUsername(e.target.value)}
429
+ placeholder="Enter any username"
430
+ />
431
+ </div>
432
+
433
+ <div className="form-group">
434
+ <label htmlFor="password">Password:</label>
435
+ <input
436
+ type="password"
437
+ id="password"
438
+ value={password}
439
+ onChange={(e) => setPassword(e.target.value)}
440
+ placeholder="Enter any password"
441
+ />
442
+ </div>
443
+
444
+ {error && <p className="error">{error}</p>}
445
+
446
+ <button type="submit" className="btn-primary">
447
+ Sign In
448
+ </button>
449
+ </form>
450
+
451
+ <p className="note">
452
+ Note: This is a demo app. Use any username and password to sign in.
453
+ </p>
454
+ </div>
455
+ )
456
+ }
457
+
458
+ // ============================================================================
459
+ // Burrito Route
460
+ // ============================================================================
461
+
462
+ const burritoRoute = createRoute({
463
+ getParentRoute: () => rootRoute,
464
+ path: '/burrito',
465
+ component: BurritoPage,
466
+ })
467
+
468
+ function BurritoPage() {
469
+ const { user, incrementBurritoConsiderations } = useAuth()
470
+ const navigate = useNavigate()
471
+ const [hasConsidered, setHasConsidered] = useState(false)
472
+
473
+ // Redirect to home if not logged in
474
+ if (!user) {
475
+ navigate({ to: '/' })
476
+ return null
477
+ }
478
+
479
+ const handleConsideration = () => {
480
+ incrementBurritoConsiderations()
481
+ setHasConsidered(true)
482
+ setTimeout(() => setHasConsidered(false), 2000)
483
+
484
+ // Capture burrito consideration event
485
+ amplitude.track('Burrito Considered', {
486
+ total_considerations: user.burritoConsiderations + 1,
487
+ username: user.username,
488
+ })
489
+ }
490
+
491
+ return (
492
+ <div className="container">
493
+ <h1>Burrito consideration zone</h1>
494
+ <p>Take a moment to truly consider the potential of burritos.</p>
495
+
496
+ <div style={{ textAlign: 'center' }}>
497
+ <button onClick={handleConsideration} className="btn-burrito">
498
+ I have considered the burrito potential
499
+ </button>
500
+
501
+ {hasConsidered && (
502
+ <p className="success">
503
+ Thank you for your consideration! Count: {user.burritoConsiderations}
504
+ </p>
505
+ )}
506
+ </div>
507
+
508
+ <div className="stats">
509
+ <h3>Consideration stats</h3>
510
+ <p>Total considerations: {user.burritoConsiderations}</p>
511
+ </div>
512
+ </div>
513
+ )
514
+ }
515
+
516
+ // ============================================================================
517
+ // Profile Route
518
+ // ============================================================================
519
+
520
+ const profileRoute = createRoute({
521
+ getParentRoute: () => rootRoute,
522
+ path: '/profile',
523
+ component: ProfilePage,
524
+ })
525
+
526
+ function ProfilePage() {
527
+ const { user } = useAuth()
528
+ const navigate = useNavigate()
529
+
530
+ // Redirect to home if not logged in
531
+ if (!user) {
532
+ navigate({ to: '/' })
533
+ return null
534
+ }
535
+
536
+ return (
537
+ <div className="container">
538
+ <h1>User Profile</h1>
539
+
540
+ <div className="stats">
541
+ <h2>Your Information</h2>
542
+ <p>
543
+ <strong>Username:</strong> {user.username}
544
+ </p>
545
+ <p>
546
+ <strong>Burrito Considerations:</strong> {user.burritoConsiderations}
547
+ </p>
548
+ </div>
549
+
550
+ <div style={{ marginTop: '2rem' }}>
551
+ <h3>Your Burrito Journey</h3>
552
+ {user.burritoConsiderations === 0 ? (
553
+ <p>
554
+ You haven't considered any burritos yet. Visit the Burrito
555
+ Consideration page to start!
556
+ </p>
557
+ ) : user.burritoConsiderations === 1 ? (
558
+ <p>You've considered the burrito potential once. Keep going!</p>
559
+ ) : user.burritoConsiderations < 5 ? (
560
+ <p>You're getting the hang of burrito consideration!</p>
561
+ ) : user.burritoConsiderations < 10 ? (
562
+ <p>You're becoming a burrito consideration expert!</p>
563
+ ) : (
564
+ <p>You are a true burrito consideration master!</p>
565
+ )}
566
+ </div>
567
+ </div>
568
+ )
569
+ }
570
+
571
+ // ============================================================================
572
+ // Route Tree & Router Setup
573
+ // ============================================================================
574
+
575
+ const routeTree = rootRoute.addChildren([indexRoute, burritoRoute, profileRoute])
576
+
577
+ const router = createRouter({
578
+ routeTree,
579
+ context: {},
580
+ defaultPreload: 'intent',
581
+ scrollRestoration: true,
582
+ defaultStructuralSharing: true,
583
+ defaultPreloadStaleTime: 0,
584
+ })
585
+
586
+ // Register the router instance for type safety
587
+ declare module '@tanstack/react-router' {
588
+ interface Register {
589
+ router: typeof router
590
+ }
591
+ }
592
+
593
+ // ============================================================================
594
+ // Render the App
595
+ // ============================================================================
596
+
597
+ const rootElement = document.getElementById('app')
598
+ if (rootElement && !rootElement.innerHTML) {
599
+ const root = ReactDOM.createRoot(rootElement)
600
+ root.render(
601
+ <StrictMode>
602
+ <RouterProvider router={router} />
603
+ </StrictMode>,
604
+ )
605
+ }
606
+
607
+ // If you want to start measuring performance in your app, pass a function
608
+ // to log results (for example: reportWebVitals(console.log))
609
+ // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
610
+ reportWebVitals()
611
+
612
+ ```
613
+
614
+ ---
615
+
616
+ ## src/reportWebVitals.ts
617
+
618
+ ```ts
619
+ const reportWebVitals = (onPerfEntry?: () => void) => {
620
+ if (onPerfEntry && onPerfEntry instanceof Function) {
621
+ import('web-vitals').then(({ onCLS, onINP, onFCP, onLCP, onTTFB }) => {
622
+ onCLS(onPerfEntry)
623
+ onINP(onPerfEntry)
624
+ onFCP(onPerfEntry)
625
+ onLCP(onPerfEntry)
626
+ onTTFB(onPerfEntry)
627
+ })
628
+ }
629
+ }
630
+
631
+ export default reportWebVitals
632
+
633
+ ```
634
+
635
+ ---
636
+
637
+ ## vite.config.ts
638
+
639
+ ```ts
640
+ import { URL, fileURLToPath } from 'node:url'
641
+
642
+ import tailwindcss from '@tailwindcss/vite'
643
+ import { defineConfig } from 'vite'
644
+ import viteReact from '@vitejs/plugin-react'
645
+
646
+ // https://vitejs.dev/config/
647
+ export default defineConfig({
648
+ plugins: [viteReact(), tailwindcss()],
649
+ resolve: {
650
+ alias: {
651
+ '@': fileURLToPath(new URL('./src', import.meta.url)),
652
+ },
653
+ },
654
+ })
655
+
656
+ ```
657
+
658
+ ---
659
+