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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/README.md +171 -74
  2. package/dist/bin.js +338 -222
  3. package/dist/src/lib/agent-interface.js +64 -9
  4. package/dist/src/lib/agent-runner.js +1 -10
  5. package/dist/src/lib/api.d.ts +22 -4
  6. package/dist/src/lib/api.js +114 -12
  7. package/dist/src/lib/commandments.js +14 -1
  8. package/dist/src/lib/constants.d.ts +5 -4
  9. package/dist/src/lib/constants.js +9 -11
  10. package/dist/src/lib/credential-resolution.d.ts +45 -0
  11. package/dist/src/lib/credential-resolution.js +311 -0
  12. package/dist/src/lib/exit-codes.d.ts +10 -0
  13. package/dist/src/lib/exit-codes.js +12 -0
  14. package/dist/src/lib/health-checks/statuspage.d.ts +1 -0
  15. package/dist/src/lib/health-checks/statuspage.js +5 -1
  16. package/dist/src/lib/mode-config.d.ts +14 -0
  17. package/dist/src/lib/mode-config.js +14 -0
  18. package/dist/src/lib/session-checkpoint.d.ts +27 -0
  19. package/dist/src/lib/session-checkpoint.js +134 -0
  20. package/dist/src/lib/wizard-session.d.ts +44 -1
  21. package/dist/src/lib/wizard-session.js +70 -14
  22. package/dist/src/lib/wizard-tools.js +19 -4
  23. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +3 -0
  24. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +6 -0
  25. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +3 -1
  26. package/dist/src/ui/agent-ui.d.ts +91 -0
  27. package/dist/src/ui/agent-ui.js +277 -0
  28. package/dist/src/ui/logging-ui.js +1 -1
  29. package/dist/src/ui/tui/App.d.ts +12 -0
  30. package/dist/src/ui/tui/App.js +29 -18
  31. package/dist/src/ui/tui/components/AmplitudeLogo.js +16 -17
  32. package/dist/src/ui/tui/components/AmplitudeTextLogo.d.ts +0 -2
  33. package/dist/src/ui/tui/components/AmplitudeTextLogo.js +53 -18
  34. package/dist/src/ui/tui/components/BrailleSpinner.d.ts +8 -0
  35. package/dist/src/ui/tui/components/BrailleSpinner.js +15 -0
  36. package/dist/src/ui/tui/components/ConsoleView.d.ts +8 -11
  37. package/dist/src/ui/tui/components/ConsoleView.js +51 -34
  38. package/dist/src/ui/tui/components/HeaderBar.d.ts +12 -0
  39. package/dist/src/ui/tui/components/HeaderBar.js +17 -0
  40. package/dist/src/ui/tui/components/JourneyStepper.d.ts +16 -0
  41. package/dist/src/ui/tui/components/JourneyStepper.js +83 -0
  42. package/dist/src/ui/tui/components/KeyHintBar.d.ts +19 -0
  43. package/dist/src/ui/tui/components/KeyHintBar.js +20 -0
  44. package/dist/src/ui/tui/console-commands.d.ts +1 -2
  45. package/dist/src/ui/tui/console-commands.js +48 -7
  46. package/dist/src/ui/tui/flows.d.ts +1 -1
  47. package/dist/src/ui/tui/flows.js +1 -1
  48. package/dist/src/ui/tui/hooks/useAsyncEffect.d.ts +15 -0
  49. package/dist/src/ui/tui/hooks/useAsyncEffect.js +35 -0
  50. package/dist/src/ui/tui/hooks/useWizardStore.d.ts +9 -0
  51. package/dist/src/ui/tui/hooks/useWizardStore.js +11 -0
  52. package/dist/src/ui/tui/ink-ui.js +1 -1
  53. package/dist/src/ui/tui/primitives/DissolveTransition.js +4 -5
  54. package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +3 -1
  55. package/dist/src/ui/tui/primitives/EventPlanViewer.js +8 -3
  56. package/dist/src/ui/tui/primitives/ProgressList.js +1 -1
  57. package/dist/src/ui/tui/primitives/SlashCommandInput.js +19 -4
  58. package/dist/src/ui/tui/primitives/SplitView.d.ts +2 -1
  59. package/dist/src/ui/tui/primitives/SplitView.js +10 -2
  60. package/dist/src/ui/tui/primitives/TabContainer.js +10 -2
  61. package/dist/src/ui/tui/primitives/index.d.ts +0 -1
  62. package/dist/src/ui/tui/primitives/index.js +0 -1
  63. package/dist/src/ui/tui/router.js +1 -1
  64. package/dist/src/ui/tui/screen-registry.d.ts +0 -7
  65. package/dist/src/ui/tui/screen-registry.js +13 -4
  66. package/dist/src/ui/tui/screens/ActivationOptionsScreen.d.ts +2 -2
  67. package/dist/src/ui/tui/screens/ActivationOptionsScreen.js +8 -8
  68. package/dist/src/ui/tui/screens/AuthScreen.js +57 -27
  69. package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +2 -12
  70. package/dist/src/ui/tui/screens/ChecklistScreen.js +22 -33
  71. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +3 -12
  72. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +109 -39
  73. package/dist/src/ui/tui/screens/DataSetupScreen.d.ts +3 -3
  74. package/dist/src/ui/tui/screens/DataSetupScreen.js +17 -10
  75. package/dist/src/ui/tui/screens/IntroScreen.d.ts +5 -3
  76. package/dist/src/ui/tui/screens/IntroScreen.js +132 -41
  77. package/dist/src/ui/tui/screens/LoginScreen.d.ts +1 -1
  78. package/dist/src/ui/tui/screens/LoginScreen.js +4 -4
  79. package/dist/src/ui/tui/screens/LogoutScreen.d.ts +4 -2
  80. package/dist/src/ui/tui/screens/LogoutScreen.js +17 -5
  81. package/dist/src/ui/tui/screens/McpScreen.d.ts +4 -4
  82. package/dist/src/ui/tui/screens/McpScreen.js +25 -17
  83. package/dist/src/ui/tui/screens/OutageScreen.d.ts +1 -1
  84. package/dist/src/ui/tui/screens/OutageScreen.js +5 -5
  85. package/dist/src/ui/tui/screens/OutroScreen.d.ts +5 -0
  86. package/dist/src/ui/tui/screens/OutroScreen.js +21 -14
  87. package/dist/src/ui/tui/screens/RegionSelectScreen.js +15 -13
  88. package/dist/src/ui/tui/screens/RunScreen.d.ts +7 -5
  89. package/dist/src/ui/tui/screens/RunScreen.js +102 -157
  90. package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +1 -1
  91. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +6 -5
  92. package/dist/src/ui/tui/screens/SetupScreen.d.ts +1 -1
  93. package/dist/src/ui/tui/screens/SetupScreen.js +7 -7
  94. package/dist/src/ui/tui/screens/SlackScreen.d.ts +2 -2
  95. package/dist/src/ui/tui/screens/SlackScreen.js +60 -35
  96. package/dist/src/ui/tui/session-constants.d.ts +41 -0
  97. package/dist/src/ui/tui/session-constants.js +38 -0
  98. package/dist/src/ui/tui/start-tui.d.ts +3 -1
  99. package/dist/src/ui/tui/start-tui.js +14 -10
  100. package/dist/src/ui/tui/store.d.ts +2 -1
  101. package/dist/src/ui/tui/store.js +33 -7
  102. package/dist/src/ui/tui/styles.d.ts +75 -19
  103. package/dist/src/ui/tui/styles.js +101 -19
  104. package/dist/src/ui/tui/utils/classify-error.d.ts +14 -0
  105. package/dist/src/ui/tui/utils/classify-error.js +90 -0
  106. package/dist/src/ui/tui/utils/diagnostics.d.ts +21 -0
  107. package/dist/src/ui/tui/utils/diagnostics.js +72 -0
  108. package/dist/src/ui/tui/utils/with-retry.d.ts +12 -0
  109. package/dist/src/ui/tui/utils/with-retry.js +32 -0
  110. package/dist/src/ui/tui/utils/with-timeout.d.ts +10 -0
  111. package/dist/src/ui/tui/utils/with-timeout.js +24 -0
  112. package/dist/src/utils/ampli-settings.d.ts +1 -1
  113. package/dist/src/utils/ampli-settings.js +15 -5
  114. package/dist/src/utils/api-key-store.js +5 -5
  115. package/dist/src/utils/atomic-write.d.ts +15 -0
  116. package/dist/src/utils/atomic-write.js +34 -0
  117. package/dist/src/utils/setup-utils.js +2 -2
  118. package/dist/src/utils/token-refresh.d.ts +22 -0
  119. package/dist/src/utils/token-refresh.js +79 -0
  120. package/dist/src/utils/wizard-abort.js +6 -1
  121. package/package.json +5 -5
  122. package/skills/instrumentation/add-analytics-instrumentation/SKILL.md +142 -0
  123. package/skills/instrumentation/diff-intake/SKILL.md +128 -0
  124. package/skills/instrumentation/discover-analytics-patterns/SKILL.md +185 -0
  125. package/skills/instrumentation/discover-event-surfaces/SKILL.md +322 -0
  126. package/skills/instrumentation/discover-event-surfaces/references/best-practices.md +563 -0
  127. package/skills/instrumentation/instrument-events/SKILL.md +169 -0
  128. package/skills/instrumentation/instrument-events/references/best-practices.md +563 -0
  129. package/skills/integration/integration-android/SKILL.md +49 -0
  130. package/skills/integration/integration-android/references/EXAMPLE.md +1977 -0
  131. package/skills/integration/integration-android/references/amplitude-quickstart.md +1845 -0
  132. package/skills/integration/integration-android/references/analytics.md +1778 -0
  133. package/skills/integration/integration-android/references/basic-integration-1.0-begin.md +43 -0
  134. package/skills/integration/integration-android/references/basic-integration-1.1-edit.md +35 -0
  135. package/skills/integration/integration-android/references/basic-integration-1.2-revise.md +23 -0
  136. package/skills/integration/integration-android/references/basic-integration-1.3-conclude.md +57 -0
  137. package/skills/integration/integration-angular/SKILL.md +49 -0
  138. package/skills/integration/integration-angular/references/EXAMPLE.md +899 -0
  139. package/skills/integration/integration-angular/references/amplitude-quickstart.md +1845 -0
  140. package/skills/integration/integration-angular/references/basic-integration-1.0-begin.md +43 -0
  141. package/skills/integration/integration-angular/references/basic-integration-1.1-edit.md +35 -0
  142. package/skills/integration/integration-angular/references/basic-integration-1.2-revise.md +23 -0
  143. package/skills/integration/integration-angular/references/basic-integration-1.3-conclude.md +57 -0
  144. package/skills/integration/integration-angular/references/browser-sdk-2.md +4680 -0
  145. package/skills/integration/integration-astro-hybrid/SKILL.md +56 -0
  146. package/skills/integration/integration-astro-hybrid/references/EXAMPLE.md +1095 -0
  147. package/skills/integration/integration-astro-hybrid/references/amplitude-quickstart.md +1845 -0
  148. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.0-begin.md +43 -0
  149. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.1-edit.md +35 -0
  150. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.2-revise.md +23 -0
  151. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.3-conclude.md +57 -0
  152. package/skills/integration/integration-astro-hybrid/references/browser-sdk-2.md +4680 -0
  153. package/skills/integration/integration-astro-ssr/SKILL.md +52 -0
  154. package/skills/integration/integration-astro-ssr/references/EXAMPLE.md +1106 -0
  155. package/skills/integration/integration-astro-ssr/references/amplitude-quickstart.md +1845 -0
  156. package/skills/integration/integration-astro-ssr/references/basic-integration-1.0-begin.md +43 -0
  157. package/skills/integration/integration-astro-ssr/references/basic-integration-1.1-edit.md +35 -0
  158. package/skills/integration/integration-astro-ssr/references/basic-integration-1.2-revise.md +23 -0
  159. package/skills/integration/integration-astro-ssr/references/basic-integration-1.3-conclude.md +57 -0
  160. package/skills/integration/integration-astro-ssr/references/browser-sdk-2.md +4680 -0
  161. package/skills/integration/integration-astro-static/SKILL.md +49 -0
  162. package/skills/integration/integration-astro-static/references/EXAMPLE.md +910 -0
  163. package/skills/integration/integration-astro-static/references/amplitude-quickstart.md +1845 -0
  164. package/skills/integration/integration-astro-static/references/basic-integration-1.0-begin.md +43 -0
  165. package/skills/integration/integration-astro-static/references/basic-integration-1.1-edit.md +35 -0
  166. package/skills/integration/integration-astro-static/references/basic-integration-1.2-revise.md +23 -0
  167. package/skills/integration/integration-astro-static/references/basic-integration-1.3-conclude.md +57 -0
  168. package/skills/integration/integration-astro-static/references/browser-sdk-2.md +4680 -0
  169. package/skills/integration/integration-astro-view-transitions/SKILL.md +51 -0
  170. package/skills/integration/integration-astro-view-transitions/references/EXAMPLE.md +979 -0
  171. package/skills/integration/integration-astro-view-transitions/references/amplitude-quickstart.md +1845 -0
  172. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.0-begin.md +43 -0
  173. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.1-edit.md +35 -0
  174. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.2-revise.md +23 -0
  175. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.3-conclude.md +57 -0
  176. package/skills/integration/integration-astro-view-transitions/references/browser-sdk-2.md +4680 -0
  177. package/skills/integration/integration-django/SKILL.md +57 -0
  178. package/skills/integration/integration-django/references/EXAMPLE.md +1005 -0
  179. package/skills/integration/integration-django/references/amplitude-quickstart.md +1845 -0
  180. package/skills/integration/integration-django/references/basic-integration-1.0-begin.md +43 -0
  181. package/skills/integration/integration-django/references/basic-integration-1.1-edit.md +35 -0
  182. package/skills/integration/integration-django/references/basic-integration-1.2-revise.md +23 -0
  183. package/skills/integration/integration-django/references/basic-integration-1.3-conclude.md +57 -0
  184. package/skills/integration/integration-django/references/python.md +1424 -0
  185. package/skills/integration/integration-expo/SKILL.md +53 -0
  186. package/skills/integration/integration-expo/references/EXAMPLE.md +1291 -0
  187. package/skills/integration/integration-expo/references/amplitude-quickstart.md +1845 -0
  188. package/skills/integration/integration-expo/references/basic-integration-1.0-begin.md +43 -0
  189. package/skills/integration/integration-expo/references/basic-integration-1.1-edit.md +35 -0
  190. package/skills/integration/integration-expo/references/basic-integration-1.2-revise.md +23 -0
  191. package/skills/integration/integration-expo/references/basic-integration-1.3-conclude.md +57 -0
  192. package/skills/integration/integration-expo/references/react-native-sdk.md +2819 -0
  193. package/skills/integration/integration-fastapi/SKILL.md +57 -0
  194. package/skills/integration/integration-fastapi/references/EXAMPLE.md +1389 -0
  195. package/skills/integration/integration-fastapi/references/amplitude-quickstart.md +1845 -0
  196. package/skills/integration/integration-fastapi/references/basic-integration-1.0-begin.md +43 -0
  197. package/skills/integration/integration-fastapi/references/basic-integration-1.1-edit.md +35 -0
  198. package/skills/integration/integration-fastapi/references/basic-integration-1.2-revise.md +23 -0
  199. package/skills/integration/integration-fastapi/references/basic-integration-1.3-conclude.md +57 -0
  200. package/skills/integration/integration-fastapi/references/python.md +1424 -0
  201. package/skills/integration/integration-flask/SKILL.md +56 -0
  202. package/skills/integration/integration-flask/references/EXAMPLE.md +1130 -0
  203. package/skills/integration/integration-flask/references/amplitude-quickstart.md +1845 -0
  204. package/skills/integration/integration-flask/references/basic-integration-1.0-begin.md +43 -0
  205. package/skills/integration/integration-flask/references/basic-integration-1.1-edit.md +35 -0
  206. package/skills/integration/integration-flask/references/basic-integration-1.2-revise.md +23 -0
  207. package/skills/integration/integration-flask/references/basic-integration-1.3-conclude.md +57 -0
  208. package/skills/integration/integration-flask/references/python.md +1424 -0
  209. package/skills/integration/integration-javascript_node/SKILL.md +54 -0
  210. package/skills/integration/integration-javascript_node/references/EXAMPLE.md +365 -0
  211. package/skills/integration/integration-javascript_node/references/amplitude-quickstart.md +1845 -0
  212. package/skills/integration/integration-javascript_node/references/analytics.md +1778 -0
  213. package/skills/integration/integration-javascript_node/references/basic-integration-1.0-begin.md +43 -0
  214. package/skills/integration/integration-javascript_node/references/basic-integration-1.1-edit.md +35 -0
  215. package/skills/integration/integration-javascript_node/references/basic-integration-1.2-revise.md +23 -0
  216. package/skills/integration/integration-javascript_node/references/basic-integration-1.3-conclude.md +57 -0
  217. package/skills/integration/integration-javascript_web/SKILL.md +58 -0
  218. package/skills/integration/integration-javascript_web/references/EXAMPLE.md +451 -0
  219. package/skills/integration/integration-javascript_web/references/amplitude-quickstart.md +1845 -0
  220. package/skills/integration/integration-javascript_web/references/basic-integration-1.0-begin.md +43 -0
  221. package/skills/integration/integration-javascript_web/references/basic-integration-1.1-edit.md +35 -0
  222. package/skills/integration/integration-javascript_web/references/basic-integration-1.2-revise.md +23 -0
  223. package/skills/integration/integration-javascript_web/references/basic-integration-1.3-conclude.md +57 -0
  224. package/skills/integration/integration-javascript_web/references/browser-sdk-2.md +4680 -0
  225. package/skills/integration/integration-laravel/SKILL.md +52 -0
  226. package/skills/integration/integration-laravel/references/EXAMPLE.md +2039 -0
  227. package/skills/integration/integration-laravel/references/amplitude-quickstart.md +1845 -0
  228. package/skills/integration/integration-laravel/references/analytics.md +1778 -0
  229. package/skills/integration/integration-laravel/references/basic-integration-1.0-begin.md +43 -0
  230. package/skills/integration/integration-laravel/references/basic-integration-1.1-edit.md +35 -0
  231. package/skills/integration/integration-laravel/references/basic-integration-1.2-revise.md +23 -0
  232. package/skills/integration/integration-laravel/references/basic-integration-1.3-conclude.md +57 -0
  233. package/skills/integration/integration-nextjs-app-router/SKILL.md +54 -0
  234. package/skills/integration/integration-nextjs-app-router/references/EXAMPLE.md +673 -0
  235. package/skills/integration/integration-nextjs-app-router/references/amplitude-quickstart.md +1845 -0
  236. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.0-begin.md +43 -0
  237. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.1-edit.md +35 -0
  238. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.2-revise.md +23 -0
  239. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.3-conclude.md +57 -0
  240. package/skills/integration/integration-nextjs-app-router/references/browser-sdk-2.md +4680 -0
  241. package/skills/integration/integration-nextjs-pages-router/SKILL.md +54 -0
  242. package/skills/integration/integration-nextjs-pages-router/references/EXAMPLE.md +735 -0
  243. package/skills/integration/integration-nextjs-pages-router/references/amplitude-quickstart.md +1845 -0
  244. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.0-begin.md +43 -0
  245. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.1-edit.md +35 -0
  246. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.2-revise.md +23 -0
  247. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.3-conclude.md +57 -0
  248. package/skills/integration/integration-nextjs-pages-router/references/browser-sdk-2.md +4680 -0
  249. package/skills/integration/integration-nuxt-3.6/SKILL.md +46 -0
  250. package/skills/integration/integration-nuxt-3.6/references/EXAMPLE.md +8422 -0
  251. package/skills/integration/integration-nuxt-3.6/references/amplitude-quickstart.md +1845 -0
  252. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.0-begin.md +43 -0
  253. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.1-edit.md +35 -0
  254. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.2-revise.md +23 -0
  255. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.3-conclude.md +57 -0
  256. package/skills/integration/integration-nuxt-3.6/references/browser-sdk-2.md +4680 -0
  257. package/skills/integration/integration-nuxt-4/SKILL.md +46 -0
  258. package/skills/integration/integration-nuxt-4/references/EXAMPLE.md +8670 -0
  259. package/skills/integration/integration-nuxt-4/references/amplitude-quickstart.md +1845 -0
  260. package/skills/integration/integration-nuxt-4/references/basic-integration-1.0-begin.md +43 -0
  261. package/skills/integration/integration-nuxt-4/references/basic-integration-1.1-edit.md +35 -0
  262. package/skills/integration/integration-nuxt-4/references/basic-integration-1.2-revise.md +23 -0
  263. package/skills/integration/integration-nuxt-4/references/basic-integration-1.3-conclude.md +57 -0
  264. package/skills/integration/integration-nuxt-4/references/browser-sdk-2.md +4680 -0
  265. package/skills/integration/integration-python/SKILL.md +53 -0
  266. package/skills/integration/integration-python/references/EXAMPLE.md +445 -0
  267. package/skills/integration/integration-python/references/amplitude-quickstart.md +1845 -0
  268. package/skills/integration/integration-python/references/basic-integration-1.0-begin.md +43 -0
  269. package/skills/integration/integration-python/references/basic-integration-1.1-edit.md +35 -0
  270. package/skills/integration/integration-python/references/basic-integration-1.2-revise.md +23 -0
  271. package/skills/integration/integration-python/references/basic-integration-1.3-conclude.md +57 -0
  272. package/skills/integration/integration-python/references/python.md +1424 -0
  273. package/skills/integration/integration-react-native/SKILL.md +49 -0
  274. package/skills/integration/integration-react-native/references/EXAMPLE.md +2253 -0
  275. package/skills/integration/integration-react-native/references/amplitude-quickstart.md +1845 -0
  276. package/skills/integration/integration-react-native/references/basic-integration-1.0-begin.md +43 -0
  277. package/skills/integration/integration-react-native/references/basic-integration-1.1-edit.md +35 -0
  278. package/skills/integration/integration-react-native/references/basic-integration-1.2-revise.md +23 -0
  279. package/skills/integration/integration-react-native/references/basic-integration-1.3-conclude.md +57 -0
  280. package/skills/integration/integration-react-native/references/react-native-sdk.md +2819 -0
  281. package/skills/integration/integration-react-react-router-6/SKILL.md +53 -0
  282. package/skills/integration/integration-react-react-router-6/references/EXAMPLE.md +570 -0
  283. package/skills/integration/integration-react-react-router-6/references/amplitude-quickstart.md +1845 -0
  284. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.0-begin.md +43 -0
  285. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.1-edit.md +35 -0
  286. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.2-revise.md +23 -0
  287. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.3-conclude.md +57 -0
  288. package/skills/integration/integration-react-react-router-6/references/browser-sdk-2.md +4680 -0
  289. package/skills/integration/integration-react-react-router-7-data/SKILL.md +53 -0
  290. package/skills/integration/integration-react-react-router-7-data/references/EXAMPLE.md +830 -0
  291. package/skills/integration/integration-react-react-router-7-data/references/amplitude-quickstart.md +1845 -0
  292. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.0-begin.md +43 -0
  293. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.1-edit.md +35 -0
  294. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.2-revise.md +23 -0
  295. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.3-conclude.md +57 -0
  296. package/skills/integration/integration-react-react-router-7-data/references/browser-sdk-2.md +4680 -0
  297. package/skills/integration/integration-react-react-router-7-declarative/SKILL.md +53 -0
  298. package/skills/integration/integration-react-react-router-7-declarative/references/EXAMPLE.md +609 -0
  299. package/skills/integration/integration-react-react-router-7-declarative/references/amplitude-quickstart.md +1845 -0
  300. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.0-begin.md +43 -0
  301. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.1-edit.md +35 -0
  302. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.2-revise.md +23 -0
  303. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.3-conclude.md +57 -0
  304. package/skills/integration/integration-react-react-router-7-declarative/references/browser-sdk-2.md +4680 -0
  305. package/skills/integration/integration-react-react-router-7-framework/SKILL.md +53 -0
  306. package/skills/integration/integration-react-react-router-7-framework/references/EXAMPLE.md +1081 -0
  307. package/skills/integration/integration-react-react-router-7-framework/references/amplitude-quickstart.md +1845 -0
  308. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.0-begin.md +43 -0
  309. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.1-edit.md +35 -0
  310. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.2-revise.md +23 -0
  311. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.3-conclude.md +57 -0
  312. package/skills/integration/integration-react-react-router-7-framework/references/browser-sdk-2.md +4680 -0
  313. package/skills/integration/integration-react-tanstack-router-code-based/SKILL.md +57 -0
  314. package/skills/integration/integration-react-tanstack-router-code-based/references/EXAMPLE.md +659 -0
  315. package/skills/integration/integration-react-tanstack-router-code-based/references/amplitude-quickstart.md +1845 -0
  316. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.0-begin.md +43 -0
  317. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.1-edit.md +35 -0
  318. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.2-revise.md +23 -0
  319. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.3-conclude.md +57 -0
  320. package/skills/integration/integration-react-tanstack-router-code-based/references/browser-sdk-2.md +4680 -0
  321. package/skills/integration/integration-react-tanstack-router-file-based/SKILL.md +57 -0
  322. package/skills/integration/integration-react-tanstack-router-file-based/references/EXAMPLE.md +777 -0
  323. package/skills/integration/integration-react-tanstack-router-file-based/references/amplitude-quickstart.md +1845 -0
  324. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.0-begin.md +43 -0
  325. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.1-edit.md +35 -0
  326. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.2-revise.md +23 -0
  327. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.3-conclude.md +57 -0
  328. package/skills/integration/integration-react-tanstack-router-file-based/references/browser-sdk-2.md +4680 -0
  329. package/skills/integration/integration-react-vite/SKILL.md +53 -0
  330. package/skills/integration/integration-react-vite/references/EXAMPLE.md +542 -0
  331. package/skills/integration/integration-react-vite/references/amplitude-quickstart.md +1845 -0
  332. package/skills/integration/integration-react-vite/references/basic-integration-1.0-begin.md +43 -0
  333. package/skills/integration/integration-react-vite/references/basic-integration-1.1-edit.md +35 -0
  334. package/skills/integration/integration-react-vite/references/basic-integration-1.2-revise.md +23 -0
  335. package/skills/integration/integration-react-vite/references/basic-integration-1.3-conclude.md +57 -0
  336. package/skills/integration/integration-react-vite/references/browser-sdk-2.md +4680 -0
  337. package/skills/integration/integration-ruby/SKILL.md +50 -0
  338. package/skills/integration/integration-ruby/references/EXAMPLE.md +420 -0
  339. package/skills/integration/integration-ruby/references/amplitude-quickstart.md +1845 -0
  340. package/skills/integration/integration-ruby/references/analytics.md +1778 -0
  341. package/skills/integration/integration-ruby/references/basic-integration-1.0-begin.md +43 -0
  342. package/skills/integration/integration-ruby/references/basic-integration-1.1-edit.md +35 -0
  343. package/skills/integration/integration-ruby/references/basic-integration-1.2-revise.md +23 -0
  344. package/skills/integration/integration-ruby/references/basic-integration-1.3-conclude.md +57 -0
  345. package/skills/integration/integration-ruby-on-rails/SKILL.md +55 -0
  346. package/skills/integration/integration-ruby-on-rails/references/EXAMPLE.md +1013 -0
  347. package/skills/integration/integration-ruby-on-rails/references/amplitude-quickstart.md +1845 -0
  348. package/skills/integration/integration-ruby-on-rails/references/analytics.md +1778 -0
  349. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.0-begin.md +43 -0
  350. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.1-edit.md +35 -0
  351. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.2-revise.md +23 -0
  352. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.3-conclude.md +57 -0
  353. package/skills/integration/integration-sveltekit/SKILL.md +47 -0
  354. package/skills/integration/integration-sveltekit/references/EXAMPLE.md +14121 -0
  355. package/skills/integration/integration-sveltekit/references/amplitude-quickstart.md +1845 -0
  356. package/skills/integration/integration-sveltekit/references/basic-integration-1.0-begin.md +43 -0
  357. package/skills/integration/integration-sveltekit/references/basic-integration-1.1-edit.md +35 -0
  358. package/skills/integration/integration-sveltekit/references/basic-integration-1.2-revise.md +23 -0
  359. package/skills/integration/integration-sveltekit/references/basic-integration-1.3-conclude.md +57 -0
  360. package/skills/integration/integration-sveltekit/references/browser-sdk-2.md +4680 -0
  361. package/skills/integration/integration-swift/SKILL.md +49 -0
  362. package/skills/integration/integration-swift/references/EXAMPLE.md +660 -0
  363. package/skills/integration/integration-swift/references/amplitude-quickstart.md +1845 -0
  364. package/skills/integration/integration-swift/references/analytics.md +1778 -0
  365. package/skills/integration/integration-swift/references/basic-integration-1.0-begin.md +43 -0
  366. package/skills/integration/integration-swift/references/basic-integration-1.1-edit.md +35 -0
  367. package/skills/integration/integration-swift/references/basic-integration-1.2-revise.md +23 -0
  368. package/skills/integration/integration-swift/references/basic-integration-1.3-conclude.md +57 -0
  369. package/skills/integration/integration-tanstack-start/SKILL.md +58 -0
  370. package/skills/integration/integration-tanstack-start/references/EXAMPLE.md +998 -0
  371. package/skills/integration/integration-tanstack-start/references/amplitude-quickstart.md +1845 -0
  372. package/skills/integration/integration-tanstack-start/references/basic-integration-1.0-begin.md +43 -0
  373. package/skills/integration/integration-tanstack-start/references/basic-integration-1.1-edit.md +35 -0
  374. package/skills/integration/integration-tanstack-start/references/basic-integration-1.2-revise.md +23 -0
  375. package/skills/integration/integration-tanstack-start/references/basic-integration-1.3-conclude.md +57 -0
  376. package/skills/integration/integration-tanstack-start/references/browser-sdk-2.md +4680 -0
  377. package/skills/integration/integration-vue-3/SKILL.md +46 -0
  378. package/skills/integration/integration-vue-3/references/EXAMPLE.md +846 -0
  379. package/skills/integration/integration-vue-3/references/amplitude-quickstart.md +1845 -0
  380. package/skills/integration/integration-vue-3/references/basic-integration-1.0-begin.md +43 -0
  381. package/skills/integration/integration-vue-3/references/basic-integration-1.1-edit.md +35 -0
  382. package/skills/integration/integration-vue-3/references/basic-integration-1.2-revise.md +23 -0
  383. package/skills/integration/integration-vue-3/references/basic-integration-1.3-conclude.md +57 -0
  384. package/skills/integration/integration-vue-3/references/browser-sdk-2.md +4680 -0
  385. package/skills/taxonomy/amplitude-quickstart-taxonomy-agent/SKILL.md +228 -0
  386. package/dist/src/ui/tui/components/TitleBar.d.ts +0 -8
  387. package/dist/src/ui/tui/components/TitleBar.js +0 -27
  388. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.d.ts +0 -7
  389. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.js +0 -101
  390. package/dist/src/utils/anthropic-status.d.ts +0 -17
  391. package/dist/src/utils/anthropic-status.js +0 -51
@@ -0,0 +1,1095 @@
1
+ # Amplitude Astro (Hybrid) Example Project
2
+
3
+ Repository: https://github.com/amplitude/context-hub
4
+ Path: basics/astro-hybrid
5
+
6
+ ---
7
+
8
+ ## README.md
9
+
10
+ # Amplitude Astro Hybrid Example
11
+
12
+ This is an [Astro](https://astro.build/) hybrid rendering example: mostly static pages with SSR or API routes where needed.
13
+
14
+ ### Amplitude SDKs
15
+
16
+ The client follows the [Browser Unified SDK (npm)](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#unified-sdk-npm): [`@amplitude/unified`](https://www.npmjs.com/package/@amplitude/unified) with `initAll` in `src/components/amplitude.astro`, plus `window.amplitude` for inline scripts. [Initialize the Unified SDK](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#initialize-the-unified-sdk) documents `initAll` as initializing every product bundled with Unified npm. See [configuration](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#configuration) for `analytics`, `sessionReplay`, `experiment`, and `engagement`. The `experiment` block is **Feature Experiment** (`@amplitude/experiment-js-client`). Amplitude’s [product support table](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#product-support-by-installation-method) lists **Web Experiment** (`@amplitude/experiment-tag`, including the visual editor) for Amplitude’s [CDN install](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#unified-script-cdn), not Unified **npm**.
17
+
18
+ API and server code use [`@amplitude/analytics-node`](https://www.npmjs.com/package/@amplitude/analytics-node) in `src/lib/amplitude-server.ts` (for example `AMPLITUDE_API_KEY`, server-only).
19
+
20
+ ## Features
21
+
22
+ - **Hybrid rendering**: Static by default; opt-in SSR (`export const prerender = false`) where needed
23
+ - **API routes** with Node SDK tracking
24
+ - **Client** unified SDK
25
+
26
+ ## Getting started
27
+
28
+ ### 1. Install dependencies
29
+
30
+ ```bash
31
+ pnpm install
32
+ ```
33
+
34
+ ### 2. Configure environment variables
35
+
36
+ ```bash
37
+ PUBLIC_AMPLITUDE_API_KEY=your_amplitude_api_key
38
+ AMPLITUDE_API_KEY=your_amplitude_api_key
39
+ ```
40
+
41
+ `PUBLIC_` is for browser `initAll`. `AMPLITUDE_API_KEY` is read in `src/lib/amplitude-server.ts` for API routes (not prefixed with `PUBLIC_`).
42
+
43
+ ### 3. Run the development server
44
+
45
+ ```bash
46
+ pnpm dev
47
+ ```
48
+
49
+ Open `http://localhost:4321`.
50
+
51
+ ## Key integration points
52
+
53
+ ### Client (`src/components/amplitude.astro`)
54
+
55
+ Same pattern as the static example: `import * as amplitude from "@amplitude/unified"`, `void amplitude.initAll(apiKey)`, then `window.amplitude = amplitude`.
56
+
57
+ ### Server (`src/lib/amplitude-server.ts`)
58
+
59
+ ```typescript
60
+ import { init, flush } from "@amplitude/analytics-node";
61
+ import type { NodeClient } from "@amplitude/analytics-node";
62
+
63
+ let amplitudeClient: NodeClient | null = null;
64
+
65
+ export function getAmplitudeServer(): NodeClient {
66
+ if (!amplitudeClient) {
67
+ amplitudeClient = init(import.meta.env.AMPLITUDE_API_KEY || "");
68
+ }
69
+ return amplitudeClient;
70
+ }
71
+ ```
72
+
73
+ ### Hybrid config
74
+
75
+ See `astro.config.mjs` for `output`, adapter, and prerender behavior.
76
+
77
+ ## When to use Hybrid mode
78
+
79
+ Use hybrid mode when you want:
80
+
81
+ - **Performance**: Most pages prerendered as static HTML
82
+ - **Flexibility**: Some pages need server-side logic (auth, personalization)
83
+ - **API routes**: Server-side endpoints for data processing
84
+
85
+ ## Scripts
86
+
87
+ ```bash
88
+ pnpm dev
89
+ pnpm build
90
+ pnpm preview
91
+ ```
92
+
93
+ ## Learn more
94
+
95
+ - [Browser Unified SDK](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk) — [npm](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#unified-sdk-npm), [configuration](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#configuration), [CDN vs npm products](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#product-support-by-installation-method)
96
+ - [Node.js SDK](https://amplitude.com/docs/sdks/analytics/node/node-js-sdk)
97
+ - [Astro hybrid / on-demand rendering](https://docs.astro.build/en/guides/on-demand-rendering/)
98
+
99
+ ---
100
+
101
+ ## .astro/content-assets.mjs
102
+
103
+ ```mjs
104
+ export default new Map();
105
+ ```
106
+
107
+ ---
108
+
109
+ ## .astro/content-modules.mjs
110
+
111
+ ```mjs
112
+ export default new Map();
113
+ ```
114
+
115
+ ---
116
+
117
+ ## .astro/content.d.ts
118
+
119
+ ```ts
120
+ declare module 'astro:content' {
121
+ export interface RenderResult {
122
+ Content: import('astro/runtime/server/index.js').AstroComponentFactory;
123
+ headings: import('astro').MarkdownHeading[];
124
+ remarkPluginFrontmatter: Record<string, any>;
125
+ }
126
+ interface Render {
127
+ '.md': Promise<RenderResult>;
128
+ }
129
+
130
+ export interface RenderedContent {
131
+ html: string;
132
+ metadata?: {
133
+ imagePaths: Array<string>;
134
+ [key: string]: unknown;
135
+ };
136
+ }
137
+ }
138
+
139
+ declare module 'astro:content' {
140
+ type Flatten<T> = T extends { [K: string]: infer U } ? U : never;
141
+
142
+ export type CollectionKey = keyof AnyEntryMap;
143
+ export type CollectionEntry<C extends CollectionKey> = Flatten<AnyEntryMap[C]>;
144
+
145
+ export type ContentCollectionKey = keyof ContentEntryMap;
146
+ export type DataCollectionKey = keyof DataEntryMap;
147
+
148
+ type AllValuesOf<T> = T extends any ? T[keyof T] : never;
149
+ type ValidContentEntrySlug<C extends keyof ContentEntryMap> = AllValuesOf<
150
+ ContentEntryMap[C]
151
+ >['slug'];
152
+
153
+ export type ReferenceDataEntry<
154
+ C extends CollectionKey,
155
+ E extends keyof DataEntryMap[C] = string,
156
+ > = {
157
+ collection: C;
158
+ id: E;
159
+ };
160
+ export type ReferenceContentEntry<
161
+ C extends keyof ContentEntryMap,
162
+ E extends ValidContentEntrySlug<C> | (string & {}) = string,
163
+ > = {
164
+ collection: C;
165
+ slug: E;
166
+ };
167
+ export type ReferenceLiveEntry<C extends keyof LiveContentConfig['collections']> = {
168
+ collection: C;
169
+ id: string;
170
+ };
171
+
172
+ /** @deprecated Use `getEntry` instead. */
173
+ export function getEntryBySlug<
174
+ C extends keyof ContentEntryMap,
175
+ E extends ValidContentEntrySlug<C> | (string & {}),
176
+ >(
177
+ collection: C,
178
+ // Note that this has to accept a regular string too, for SSR
179
+ entrySlug: E,
180
+ ): E extends ValidContentEntrySlug<C>
181
+ ? Promise<CollectionEntry<C>>
182
+ : Promise<CollectionEntry<C> | undefined>;
183
+
184
+ /** @deprecated Use `getEntry` instead. */
185
+ export function getDataEntryById<C extends keyof DataEntryMap, E extends keyof DataEntryMap[C]>(
186
+ collection: C,
187
+ entryId: E,
188
+ ): Promise<CollectionEntry<C>>;
189
+
190
+ export function getCollection<C extends keyof AnyEntryMap, E extends CollectionEntry<C>>(
191
+ collection: C,
192
+ filter?: (entry: CollectionEntry<C>) => entry is E,
193
+ ): Promise<E[]>;
194
+ export function getCollection<C extends keyof AnyEntryMap>(
195
+ collection: C,
196
+ filter?: (entry: CollectionEntry<C>) => unknown,
197
+ ): Promise<CollectionEntry<C>[]>;
198
+
199
+ export function getLiveCollection<C extends keyof LiveContentConfig['collections']>(
200
+ collection: C,
201
+ filter?: LiveLoaderCollectionFilterType<C>,
202
+ ): Promise<
203
+ import('astro').LiveDataCollectionResult<LiveLoaderDataType<C>, LiveLoaderErrorType<C>>
204
+ >;
205
+
206
+ export function getEntry<
207
+ C extends keyof ContentEntryMap,
208
+ E extends ValidContentEntrySlug<C> | (string & {}),
209
+ >(
210
+ entry: ReferenceContentEntry<C, E>,
211
+ ): E extends ValidContentEntrySlug<C>
212
+ ? Promise<CollectionEntry<C>>
213
+ : Promise<CollectionEntry<C> | undefined>;
214
+ export function getEntry<
215
+ C extends keyof DataEntryMap,
216
+ E extends keyof DataEntryMap[C] | (string & {}),
217
+ >(
218
+ entry: ReferenceDataEntry<C, E>,
219
+ ): E extends keyof DataEntryMap[C]
220
+ ? Promise<DataEntryMap[C][E]>
221
+ : Promise<CollectionEntry<C> | undefined>;
222
+ export function getEntry<
223
+ C extends keyof ContentEntryMap,
224
+ E extends ValidContentEntrySlug<C> | (string & {}),
225
+ >(
226
+ collection: C,
227
+ slug: E,
228
+ ): E extends ValidContentEntrySlug<C>
229
+ ? Promise<CollectionEntry<C>>
230
+ : Promise<CollectionEntry<C> | undefined>;
231
+ export function getEntry<
232
+ C extends keyof DataEntryMap,
233
+ E extends keyof DataEntryMap[C] | (string & {}),
234
+ >(
235
+ collection: C,
236
+ id: E,
237
+ ): E extends keyof DataEntryMap[C]
238
+ ? string extends keyof DataEntryMap[C]
239
+ ? Promise<DataEntryMap[C][E]> | undefined
240
+ : Promise<DataEntryMap[C][E]>
241
+ : Promise<CollectionEntry<C> | undefined>;
242
+ export function getLiveEntry<C extends keyof LiveContentConfig['collections']>(
243
+ collection: C,
244
+ filter: string | LiveLoaderEntryFilterType<C>,
245
+ ): Promise<import('astro').LiveDataEntryResult<LiveLoaderDataType<C>, LiveLoaderErrorType<C>>>;
246
+
247
+ /** Resolve an array of entry references from the same collection */
248
+ export function getEntries<C extends keyof ContentEntryMap>(
249
+ entries: ReferenceContentEntry<C, ValidContentEntrySlug<C>>[],
250
+ ): Promise<CollectionEntry<C>[]>;
251
+ export function getEntries<C extends keyof DataEntryMap>(
252
+ entries: ReferenceDataEntry<C, keyof DataEntryMap[C]>[],
253
+ ): Promise<CollectionEntry<C>[]>;
254
+
255
+ export function render<C extends keyof AnyEntryMap>(
256
+ entry: AnyEntryMap[C][string],
257
+ ): Promise<RenderResult>;
258
+
259
+ export function reference<C extends keyof AnyEntryMap>(
260
+ collection: C,
261
+ ): import('astro/zod').ZodEffects<
262
+ import('astro/zod').ZodString,
263
+ C extends keyof ContentEntryMap
264
+ ? ReferenceContentEntry<C, ValidContentEntrySlug<C>>
265
+ : ReferenceDataEntry<C, keyof DataEntryMap[C]>
266
+ >;
267
+ // Allow generic `string` to avoid excessive type errors in the config
268
+ // if `dev` is not running to update as you edit.
269
+ // Invalid collection names will be caught at build time.
270
+ export function reference<C extends string>(
271
+ collection: C,
272
+ ): import('astro/zod').ZodEffects<import('astro/zod').ZodString, never>;
273
+
274
+ type ReturnTypeOrOriginal<T> = T extends (...args: any[]) => infer R ? R : T;
275
+ type InferEntrySchema<C extends keyof AnyEntryMap> = import('astro/zod').infer<
276
+ ReturnTypeOrOriginal<Required<ContentConfig['collections'][C]>['schema']>
277
+ >;
278
+
279
+ type ContentEntryMap = {
280
+
281
+ };
282
+
283
+ type DataEntryMap = {
284
+
285
+ };
286
+
287
+ type AnyEntryMap = ContentEntryMap & DataEntryMap;
288
+
289
+ type ExtractLoaderTypes<T> = T extends import('astro/loaders').LiveLoader<
290
+ infer TData,
291
+ infer TEntryFilter,
292
+ infer TCollectionFilter,
293
+ infer TError
294
+ >
295
+ ? { data: TData; entryFilter: TEntryFilter; collectionFilter: TCollectionFilter; error: TError }
296
+ : { data: never; entryFilter: never; collectionFilter: never; error: never };
297
+ type ExtractDataType<T> = ExtractLoaderTypes<T>['data'];
298
+ type ExtractEntryFilterType<T> = ExtractLoaderTypes<T>['entryFilter'];
299
+ type ExtractCollectionFilterType<T> = ExtractLoaderTypes<T>['collectionFilter'];
300
+ type ExtractErrorType<T> = ExtractLoaderTypes<T>['error'];
301
+
302
+ type LiveLoaderDataType<C extends keyof LiveContentConfig['collections']> =
303
+ LiveContentConfig['collections'][C]['schema'] extends undefined
304
+ ? ExtractDataType<LiveContentConfig['collections'][C]['loader']>
305
+ : import('astro/zod').infer<
306
+ Exclude<LiveContentConfig['collections'][C]['schema'], undefined>
307
+ >;
308
+ type LiveLoaderEntryFilterType<C extends keyof LiveContentConfig['collections']> =
309
+ ExtractEntryFilterType<LiveContentConfig['collections'][C]['loader']>;
310
+ type LiveLoaderCollectionFilterType<C extends keyof LiveContentConfig['collections']> =
311
+ ExtractCollectionFilterType<LiveContentConfig['collections'][C]['loader']>;
312
+ type LiveLoaderErrorType<C extends keyof LiveContentConfig['collections']> = ExtractErrorType<
313
+ LiveContentConfig['collections'][C]['loader']
314
+ >;
315
+
316
+ export type ContentConfig = typeof import("../src/content.config.mjs");
317
+ export type LiveContentConfig = never;
318
+ }
319
+
320
+ ```
321
+
322
+ ---
323
+
324
+ ## .astro/types.d.ts
325
+
326
+ ```ts
327
+ /// <reference types="astro/client" />
328
+ /// <reference path="content.d.ts" />
329
+ ```
330
+
331
+ ---
332
+
333
+ ## .env.example
334
+
335
+ ```example
336
+ PUBLIC_AMPLITUDE_API_KEY=your_amplitude_api_key_here
337
+
338
+ ```
339
+
340
+ ---
341
+
342
+ ## astro.config.mjs
343
+
344
+ ```mjs
345
+ import { defineConfig } from "astro/config";
346
+ import node from "@astrojs/node";
347
+
348
+ export default defineConfig({
349
+ // In Astro 5, 'static' is the default and supports per-page SSR opt-in
350
+ // Use `export const prerender = false` in pages that need server rendering
351
+ output: "static",
352
+ adapter: node({
353
+ mode: "standalone",
354
+ }),
355
+ image: {
356
+ service: { entrypoint: "astro/assets/services/noop" },
357
+ },
358
+ });
359
+
360
+ ```
361
+
362
+ ---
363
+
364
+ ## src/components/amplitude.astro
365
+
366
+ ```astro
367
+ ---
368
+ // Client-side Amplitude: bundled @amplitude/unified (initAll).
369
+ // Exposes the same namespace on window.amplitude for is:inline page scripts.
370
+ ---
371
+ <script>
372
+ import * as amplitude from "@amplitude/unified";
373
+
374
+ const apiKey = import.meta.env.PUBLIC_AMPLITUDE_API_KEY;
375
+ if (apiKey) {
376
+ void amplitude.initAll(apiKey);
377
+ }
378
+ window.amplitude = amplitude;
379
+ </script>
380
+
381
+ ```
382
+
383
+ ---
384
+
385
+ ## src/components/Header.astro
386
+
387
+ ```astro
388
+ ---
389
+ // Header component with navigation and logout functionality
390
+ ---
391
+ <header class="header">
392
+ <div class="header-container">
393
+ <nav>
394
+ <a href="/">Home</a>
395
+ <a href="/burrito" class="auth-link" style="display: none;">Burrito Consideration</a>
396
+ <a href="/profile" class="auth-link" style="display: none;">Profile</a>
397
+ </nav>
398
+ <div class="user-section">
399
+ <span class="welcome-text" style="display: none;">Welcome, <span class="username"></span>!</span>
400
+ <span class="not-logged-in">Not logged in</span>
401
+ <button class="btn-logout" style="display: none;">Logout</button>
402
+ </div>
403
+ </div>
404
+ </header>
405
+
406
+ <script is:inline>
407
+ function updateHeader() {
408
+ const currentUser = localStorage.getItem('currentUser');
409
+ const authLinks = document.querySelectorAll('.auth-link');
410
+ const welcomeText = document.querySelector('.welcome-text');
411
+ const notLoggedIn = document.querySelector('.not-logged-in');
412
+ const logoutBtn = document.querySelector('.btn-logout');
413
+ const usernameSpan = document.querySelector('.username');
414
+
415
+ if (currentUser) {
416
+ authLinks.forEach(link => link.style.display = 'inline');
417
+ welcomeText.style.display = 'inline';
418
+ notLoggedIn.style.display = 'none';
419
+ logoutBtn.style.display = 'inline';
420
+ usernameSpan.textContent = currentUser;
421
+ } else {
422
+ authLinks.forEach(link => link.style.display = 'none');
423
+ welcomeText.style.display = 'none';
424
+ notLoggedIn.style.display = 'inline';
425
+ logoutBtn.style.display = 'none';
426
+ }
427
+ }
428
+
429
+ function handleLogout() {
430
+ const currentUser = localStorage.getItem('currentUser');
431
+ if (currentUser) {
432
+ window.amplitude?.track('User Logged Out');
433
+ }
434
+ localStorage.removeItem('currentUser');
435
+ localStorage.removeItem('burritoConsiderations');
436
+ // IMPORTANT: Reset Amplitude to clear the user/session identity
437
+ window.amplitude?.reset();
438
+ window.location.href = '/';
439
+ }
440
+
441
+ document.addEventListener('DOMContentLoaded', () => {
442
+ updateHeader();
443
+ document.querySelector('.btn-logout')?.addEventListener('click', handleLogout);
444
+ });
445
+
446
+ // Listen for storage changes (login/logout in other tabs)
447
+ window.addEventListener('storage', updateHeader);
448
+ </script>
449
+
450
+ <style>
451
+ .header {
452
+ background-color: #333;
453
+ color: white;
454
+ padding: 1rem;
455
+ }
456
+
457
+ .header-container {
458
+ max-width: 1200px;
459
+ margin: 0 auto;
460
+ display: flex;
461
+ justify-content: space-between;
462
+ align-items: center;
463
+ }
464
+
465
+ .header nav {
466
+ display: flex;
467
+ gap: 1rem;
468
+ }
469
+
470
+ .header a {
471
+ color: white;
472
+ text-decoration: none;
473
+ padding: 0.5rem 1rem;
474
+ border-radius: 4px;
475
+ transition: background-color 0.2s;
476
+ }
477
+
478
+ .header a:hover {
479
+ background-color: #555;
480
+ text-decoration: none;
481
+ }
482
+
483
+ .user-section {
484
+ display: flex;
485
+ align-items: center;
486
+ gap: 1rem;
487
+ }
488
+
489
+ .btn-logout {
490
+ background-color: #dc3545;
491
+ color: white;
492
+ border: none;
493
+ padding: 0.5rem 1rem;
494
+ border-radius: 4px;
495
+ cursor: pointer;
496
+ font-size: 14px;
497
+ }
498
+
499
+ .btn-logout:hover {
500
+ background-color: #c82333;
501
+ }
502
+ </style>
503
+
504
+ ```
505
+
506
+ ---
507
+
508
+ ## src/env.d.ts
509
+
510
+ ```ts
511
+ /// <reference types="astro/client" />
512
+
513
+ declare global {
514
+ interface Window {
515
+ amplitude?: typeof import("@amplitude/unified");
516
+ __amplitude_initialized?: boolean;
517
+ }
518
+ }
519
+
520
+ export {};
521
+
522
+ ```
523
+
524
+ ---
525
+
526
+ ## src/layouts/AmplitudeLayout.astro
527
+
528
+ ```astro
529
+ ---
530
+ import Amplitude from '../components/amplitude.astro';
531
+ import Header from '../components/Header.astro';
532
+ import '../styles/global.css';
533
+
534
+ interface Props {
535
+ title: string;
536
+ }
537
+
538
+ const { title } = Astro.props;
539
+ ---
540
+ <!doctype html>
541
+ <html lang="en">
542
+ <head>
543
+ <meta charset="UTF-8" />
544
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
545
+ <meta name="description" content="Astro Amplitude Hybrid Integration Example" />
546
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
547
+ <title>{title}</title>
548
+ <Amplitude />
549
+ </head>
550
+ <body>
551
+ <Header />
552
+ <main>
553
+ <slot />
554
+ </main>
555
+ </body>
556
+ </html>
557
+
558
+ ```
559
+
560
+ ---
561
+
562
+ ## src/lib/amplitude-server.ts
563
+
564
+ ```ts
565
+ import { init, flush } from "@amplitude/analytics-node";
566
+ import type { NodeClient } from "@amplitude/analytics-core";
567
+
568
+ let amplitudeClient: NodeClient | null = null;
569
+
570
+ /**
571
+ * Get the Amplitude server-side client.
572
+ * Uses a singleton pattern to avoid creating multiple clients.
573
+ */
574
+ export function getAmplitudeServer(): NodeClient {
575
+ if (!amplitudeClient) {
576
+ amplitudeClient = init(import.meta.env.AMPLITUDE_API_KEY || "");
577
+ }
578
+ return amplitudeClient;
579
+ }
580
+
581
+ /**
582
+ * Flush the Amplitude client gracefully.
583
+ * Call this when your server is shutting down.
584
+ */
585
+ export async function flushAmplitude(): Promise<void> {
586
+ if (amplitudeClient) {
587
+ await flush();
588
+ }
589
+ }
590
+
591
+ ```
592
+
593
+ ---
594
+
595
+ ## src/lib/auth.ts
596
+
597
+ ```ts
598
+ // Client-side auth utilities for localStorage-based authentication
599
+
600
+ export interface User {
601
+ username: string;
602
+ burritoConsiderations: number;
603
+ }
604
+
605
+ export function getCurrentUser(): User | null {
606
+ if (typeof window === "undefined") return null;
607
+
608
+ const username = localStorage.getItem("currentUser");
609
+ if (!username) return null;
610
+
611
+ const considerations = parseInt(
612
+ localStorage.getItem("burritoConsiderations") || "0",
613
+ 10,
614
+ );
615
+
616
+ return {
617
+ username,
618
+ burritoConsiderations: considerations,
619
+ };
620
+ }
621
+
622
+ export function login(username: string, password: string): boolean {
623
+ if (!username || !password) return false;
624
+
625
+ localStorage.setItem("currentUser", username);
626
+ // Initialize burrito considerations if not set
627
+ if (!localStorage.getItem("burritoConsiderations")) {
628
+ localStorage.setItem("burritoConsiderations", "0");
629
+ }
630
+
631
+ return true;
632
+ }
633
+
634
+ export function logout(): void {
635
+ localStorage.removeItem("currentUser");
636
+ localStorage.removeItem("burritoConsiderations");
637
+ }
638
+
639
+ export function incrementBurritoConsiderations(): number {
640
+ const current = parseInt(
641
+ localStorage.getItem("burritoConsiderations") || "0",
642
+ 10,
643
+ );
644
+ const newCount = current + 1;
645
+ localStorage.setItem("burritoConsiderations", newCount.toString());
646
+ return newCount;
647
+ }
648
+
649
+ ```
650
+
651
+ ---
652
+
653
+ ## src/pages/api/auth/login.ts
654
+
655
+ ```ts
656
+ import type { APIRoute } from "astro";
657
+ import { getAmplitudeServer } from "../../../lib/amplitude-server";
658
+ import { track, identify, Identify } from "@amplitude/analytics-node";
659
+
660
+ export const prerender = false;
661
+
662
+ // In-memory user store for demo purposes
663
+ const users = new Map<string, { username: string; createdAt: string }>();
664
+
665
+ export const POST: APIRoute = async ({ request }) => {
666
+ try {
667
+ const body = await request.json();
668
+ const { username, password } = body;
669
+
670
+ if (!username || !password) {
671
+ return new Response(
672
+ JSON.stringify({ error: "Username and password are required" }),
673
+ { status: 400, headers: { "Content-Type": "application/json" } },
674
+ );
675
+ }
676
+
677
+ // Check if this is a new user
678
+ const isNewUser = !users.has(username);
679
+
680
+ if (isNewUser) {
681
+ users.set(username, {
682
+ username,
683
+ createdAt: new Date().toISOString(),
684
+ });
685
+ }
686
+
687
+ // Get the Amplitude server client
688
+ getAmplitudeServer();
689
+
690
+ // Capture server-side login event
691
+ track("Server Login Completed", {
692
+ isNewUser,
693
+ source: "api",
694
+ timestamp: new Date().toISOString(),
695
+ }, { user_id: username });
696
+
697
+ // Identify the user server-side
698
+ const identifyEvent = new Identify();
699
+ identifyEvent.set("username", username);
700
+ if (isNewUser) {
701
+ identifyEvent.set("createdAt", new Date().toISOString());
702
+ }
703
+ identify(identifyEvent, { user_id: username });
704
+
705
+ return new Response(
706
+ JSON.stringify({
707
+ success: true,
708
+ username,
709
+ isNewUser,
710
+ }),
711
+ { status: 200, headers: { "Content-Type": "application/json" } },
712
+ );
713
+ } catch (error) {
714
+ console.error("Login error:", error);
715
+ return new Response(JSON.stringify({ error: "Internal server error" }), {
716
+ status: 500,
717
+ headers: { "Content-Type": "application/json" },
718
+ });
719
+ }
720
+ };
721
+
722
+ ```
723
+
724
+ ---
725
+
726
+ ## src/pages/api/events/burrito.ts
727
+
728
+ ```ts
729
+ import type { APIRoute } from "astro";
730
+ import { getAmplitudeServer } from "../../../lib/amplitude-server";
731
+ import { track } from "@amplitude/analytics-node";
732
+
733
+ export const prerender = false;
734
+
735
+ export const POST: APIRoute = async ({ request }) => {
736
+ try {
737
+ const body = await request.json();
738
+ const { username, totalConsiderations } = body;
739
+
740
+ if (!username) {
741
+ return new Response(JSON.stringify({ error: "Username is required" }), {
742
+ status: 400,
743
+ headers: { "Content-Type": "application/json" },
744
+ });
745
+ }
746
+
747
+ // Get the Amplitude server client
748
+ getAmplitudeServer();
749
+
750
+ // Capture server-side burrito consideration event
751
+ track("Burrito Considered", {
752
+ total_considerations: totalConsiderations,
753
+ source: "api",
754
+ timestamp: new Date().toISOString(),
755
+ }, { user_id: username });
756
+
757
+ return new Response(
758
+ JSON.stringify({
759
+ success: true,
760
+ totalConsiderations,
761
+ }),
762
+ { status: 200, headers: { "Content-Type": "application/json" } },
763
+ );
764
+ } catch (error) {
765
+ console.error("Burrito event error:", error);
766
+ return new Response(JSON.stringify({ error: "Internal server error" }), {
767
+ status: 500,
768
+ headers: { "Content-Type": "application/json" },
769
+ });
770
+ }
771
+ };
772
+
773
+ ```
774
+
775
+ ---
776
+
777
+ ## src/pages/burrito.astro
778
+
779
+ ```astro
780
+ ---
781
+ import AmplitudeLayout from '../layouts/AmplitudeLayout.astro';
782
+
783
+ // Opt this page into on-demand rendering (SSR)
784
+ // In hybrid mode, pages are static by default
785
+ export const prerender = false;
786
+ ---
787
+ <AmplitudeLayout title="Burrito Consideration - Astro Amplitude Hybrid Example">
788
+ <div class="container">
789
+ <h1>Burrito consideration zone</h1>
790
+ <p>Take a moment to truly consider the potential of burritos.</p>
791
+
792
+ <div style="text-align: center;">
793
+ <button id="consider-btn" class="btn-burrito">
794
+ I have considered the burrito potential
795
+ </button>
796
+
797
+ <p id="success-message" class="success" style="display: none;">
798
+ Thank you for your consideration! Count: <span id="consideration-count"></span>
799
+ </p>
800
+ </div>
801
+
802
+ <div class="stats">
803
+ <h3>Consideration stats</h3>
804
+ <p>Total considerations: <span id="total-considerations">0</span></p>
805
+ </div>
806
+
807
+ <p class="note" style="margin-top: 1rem;">
808
+ Events are tracked both client-side and server-side for demonstration.
809
+ </p>
810
+ </div>
811
+ </AmplitudeLayout>
812
+
813
+ <script is:inline>
814
+ function checkAuth() {
815
+ const currentUser = localStorage.getItem('currentUser');
816
+ if (!currentUser) {
817
+ window.location.href = '/';
818
+ return false;
819
+ }
820
+ return true;
821
+ }
822
+
823
+ function updateStats() {
824
+ const count = localStorage.getItem('burritoConsiderations') || '0';
825
+ document.getElementById('total-considerations').textContent = count;
826
+ }
827
+
828
+ async function handleConsideration() {
829
+ const currentUser = localStorage.getItem('currentUser');
830
+ if (!currentUser) return;
831
+
832
+ // Increment the count
833
+ const currentCount = parseInt(localStorage.getItem('burritoConsiderations') || '0', 10);
834
+ const newCount = currentCount + 1;
835
+ localStorage.setItem('burritoConsiderations', newCount.toString());
836
+
837
+ // Update the UI
838
+ updateStats();
839
+
840
+ const successMessage = document.getElementById('success-message');
841
+ const considerationCount = document.getElementById('consideration-count');
842
+ considerationCount.textContent = newCount;
843
+ successMessage.style.display = 'block';
844
+
845
+ // Hide success message after 2 seconds
846
+ setTimeout(() => {
847
+ successMessage.style.display = 'none';
848
+ }, 2000);
849
+
850
+ // Client-side event tracking
851
+ window.amplitude?.track('Burrito Considered', {
852
+ total_considerations: newCount,
853
+ username: currentUser,
854
+ source: 'client'
855
+ });
856
+
857
+ // Also send to server-side API for server tracking
858
+ try {
859
+ await fetch('/api/events/burrito', {
860
+ method: 'POST',
861
+ headers: {
862
+ 'Content-Type': 'application/json',
863
+ },
864
+ body: JSON.stringify({
865
+ username: currentUser,
866
+ totalConsiderations: newCount
867
+ })
868
+ });
869
+ } catch (error) {
870
+ console.error('Failed to send server-side event:', error);
871
+ }
872
+ }
873
+
874
+ document.addEventListener('DOMContentLoaded', () => {
875
+ if (!checkAuth()) return;
876
+
877
+ updateStats();
878
+ document.getElementById('consider-btn')?.addEventListener('click', handleConsideration);
879
+ });
880
+ </script>
881
+
882
+ ```
883
+
884
+ ---
885
+
886
+ ## src/pages/index.astro
887
+
888
+ ```astro
889
+ ---
890
+ import AmplitudeLayout from '../layouts/AmplitudeLayout.astro';
891
+
892
+ // This page is prerendered (static) by default in hybrid mode
893
+ // No need to set prerender = true explicitly
894
+ ---
895
+ <AmplitudeLayout title="Home - Astro Amplitude Hybrid Example">
896
+ <div class="container">
897
+ <div id="logged-in-view" style="display: none;">
898
+ <h1>Welcome back, <span id="welcome-username"></span>!</h1>
899
+ <p>You are now logged in. Feel free to explore:</p>
900
+ <ul>
901
+ <li>Consider the potential of burritos</li>
902
+ <li>View your profile and statistics</li>
903
+ </ul>
904
+ </div>
905
+
906
+ <div id="logged-out-view">
907
+ <h1>Welcome to Burrito Consideration App</h1>
908
+ <p>Please sign in to begin your burrito journey</p>
909
+
910
+ <form id="login-form" class="form">
911
+ <div class="form-group">
912
+ <label for="username">Username:</label>
913
+ <input
914
+ type="text"
915
+ id="username"
916
+ placeholder="Enter any username"
917
+ required
918
+ />
919
+ </div>
920
+
921
+ <div class="form-group">
922
+ <label for="password">Password:</label>
923
+ <input
924
+ type="password"
925
+ id="password"
926
+ placeholder="Enter any password"
927
+ required
928
+ />
929
+ </div>
930
+
931
+ <p id="error-message" class="error" style="display: none;"></p>
932
+
933
+ <button type="submit" class="btn-primary">Sign In</button>
934
+ </form>
935
+
936
+ <p class="note">
937
+ Note: This is a demo app with server-side tracking. Use any username and password to sign in.
938
+ </p>
939
+ </div>
940
+ </div>
941
+ </AmplitudeLayout>
942
+
943
+ <script is:inline>
944
+ function updateView() {
945
+ const currentUser = localStorage.getItem('currentUser');
946
+ const loggedInView = document.getElementById('logged-in-view');
947
+ const loggedOutView = document.getElementById('logged-out-view');
948
+ const welcomeUsername = document.getElementById('welcome-username');
949
+
950
+ if (currentUser) {
951
+ loggedInView.style.display = 'block';
952
+ loggedOutView.style.display = 'none';
953
+ welcomeUsername.textContent = currentUser;
954
+ } else {
955
+ loggedInView.style.display = 'none';
956
+ loggedOutView.style.display = 'block';
957
+ }
958
+ }
959
+
960
+ async function handleLogin(event) {
961
+ event.preventDefault();
962
+
963
+ const username = document.getElementById('username').value;
964
+ const password = document.getElementById('password').value;
965
+ const errorMessage = document.getElementById('error-message');
966
+
967
+ if (!username || !password) {
968
+ errorMessage.textContent = 'Please provide both username and password';
969
+ errorMessage.style.display = 'block';
970
+ return;
971
+ }
972
+
973
+ try {
974
+ // Call the server-side login API
975
+ const response = await fetch('/api/auth/login', {
976
+ method: 'POST',
977
+ headers: {
978
+ 'Content-Type': 'application/json',
979
+ },
980
+ body: JSON.stringify({ username, password })
981
+ });
982
+
983
+ const data = await response.json();
984
+
985
+ if (!response.ok) {
986
+ throw new Error(data.error || 'Login failed');
987
+ }
988
+
989
+ // Store in localStorage for client-side state
990
+ localStorage.setItem('currentUser', username);
991
+ if (!localStorage.getItem('burritoConsiderations')) {
992
+ localStorage.setItem('burritoConsiderations', '0');
993
+ }
994
+
995
+ // Also identify on the client side (for session continuity)
996
+ window.amplitude?.setUserId(username);
997
+ window.amplitude?.track('User Logged In');
998
+
999
+ // Clear form
1000
+ document.getElementById('username').value = '';
1001
+ document.getElementById('password').value = '';
1002
+ errorMessage.style.display = 'none';
1003
+
1004
+ // Update view
1005
+ updateView();
1006
+
1007
+ // Trigger header update
1008
+ window.dispatchEvent(new Event('storage'));
1009
+ } catch (error) {
1010
+ errorMessage.textContent = error.message || 'Login failed';
1011
+ errorMessage.style.display = 'block';
1012
+ }
1013
+ }
1014
+
1015
+ document.addEventListener('DOMContentLoaded', () => {
1016
+ updateView();
1017
+ document.getElementById('login-form')?.addEventListener('submit', handleLogin);
1018
+ });
1019
+
1020
+ // Listen for storage changes
1021
+ window.addEventListener('storage', updateView);
1022
+ </script>
1023
+
1024
+ ```
1025
+
1026
+ ---
1027
+
1028
+ ## src/pages/profile.astro
1029
+
1030
+ ```astro
1031
+ ---
1032
+ import AmplitudeLayout from '../layouts/AmplitudeLayout.astro';
1033
+
1034
+ // This page is prerendered (static) by default in hybrid mode
1035
+ ---
1036
+ <AmplitudeLayout title="Profile - Astro Amplitude Hybrid Example">
1037
+ <div class="container">
1038
+ <h1>User Profile</h1>
1039
+
1040
+ <div class="stats">
1041
+ <h2>Your Information</h2>
1042
+ <p><strong>Username:</strong> <span id="profile-username"></span></p>
1043
+ <p><strong>Burrito Considerations:</strong> <span id="profile-considerations">0</span></p>
1044
+ </div>
1045
+
1046
+ <div style="margin-top: 2rem;">
1047
+ <h3>Your Burrito Journey</h3>
1048
+ <p id="journey-message"></p>
1049
+ </div>
1050
+ </div>
1051
+ </AmplitudeLayout>
1052
+
1053
+ <script is:inline>
1054
+ function checkAuth() {
1055
+ const currentUser = localStorage.getItem('currentUser');
1056
+ if (!currentUser) {
1057
+ window.location.href = '/';
1058
+ return false;
1059
+ }
1060
+ return true;
1061
+ }
1062
+
1063
+ function updateProfile() {
1064
+ const username = localStorage.getItem('currentUser') || '';
1065
+ const considerations = parseInt(localStorage.getItem('burritoConsiderations') || '0', 10);
1066
+
1067
+ document.getElementById('profile-username').textContent = username;
1068
+ document.getElementById('profile-considerations').textContent = considerations;
1069
+
1070
+ // Update journey message based on consideration count
1071
+ const journeyMessage = document.getElementById('journey-message');
1072
+ if (considerations === 0) {
1073
+ journeyMessage.textContent = "You haven't considered any burritos yet. Visit the Burrito Consideration page to start!";
1074
+ } else if (considerations === 1) {
1075
+ journeyMessage.textContent = "You've considered the burrito potential once. Keep going!";
1076
+ } else if (considerations < 5) {
1077
+ journeyMessage.textContent = "You're getting the hang of burrito consideration!";
1078
+ } else if (considerations < 10) {
1079
+ journeyMessage.textContent = "You're becoming a burrito consideration expert!";
1080
+ } else {
1081
+ journeyMessage.textContent = "You are a true burrito consideration master!";
1082
+ }
1083
+ }
1084
+
1085
+ document.addEventListener('DOMContentLoaded', () => {
1086
+ if (!checkAuth()) return;
1087
+
1088
+ updateProfile();
1089
+ });
1090
+ </script>
1091
+
1092
+ ```
1093
+
1094
+ ---
1095
+