@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,979 @@
1
+ # Amplitude Astro (View Transitions) Example Project
2
+
3
+ Repository: https://github.com/amplitude/context-hub
4
+ Path: basics/astro-view-transitions
5
+
6
+ ---
7
+
8
+ ## README.md
9
+
10
+ # Amplitude Astro View Transitions Example
11
+
12
+ This is an [Astro](https://astro.build/) example with [View Transitions](https://docs.astro.build/en/guides/view-transitions/) (`<ClientRouter />`), demonstrating Amplitude in the browser.
13
+
14
+ ### Amplitude SDKs
15
+
16
+ The app uses the [Browser Unified SDK (npm)](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#unified-sdk-npm): [`@amplitude/unified`](https://www.npmjs.com/package/@amplitude/unified) with `initAll` in `src/components/amplitude.astro`, including an `analytics` block. [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); `analytics` options match [Browser SDK 2](https://amplitude.com/docs/sdks/analytics/browser/browser-sdk-2#initialize-the-sdk).
17
+
18
+ Initialization runs only once so soft navigations do not call `initAll` again (Amplitude expects a single init for the app lifecycle). `analytics: { capture_pageview: 'history_change' }` keeps automatic pageviews aligned with client-side history changes.
19
+
20
+ `window.amplitude` is exposed for `is:inline` scripts ([access SDK features](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#access-sdk-features)). The `experiment` config here 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 Unified **CDN** script, not Unified **npm**.
21
+
22
+ ## Features
23
+
24
+ - **View Transitions**: Client-side navigation with `<ClientRouter />`
25
+ - **Product analytics**: Login and burrito events
26
+ - **Automatic pageviews**: `history_change` tracking during soft navigation
27
+
28
+ ## Getting started
29
+
30
+ ### 1. Install dependencies
31
+
32
+ ```bash
33
+ pnpm install
34
+ ```
35
+
36
+ ### 2. Configure environment variables
37
+
38
+ ```bash
39
+ PUBLIC_AMPLITUDE_API_KEY=your_amplitude_api_key
40
+ ```
41
+
42
+ Get your API key from [Amplitude project settings](https://app.amplitude.com).
43
+
44
+ ### 3. Run the development server
45
+
46
+ ```bash
47
+ pnpm dev
48
+ ```
49
+
50
+ Open `http://localhost:4321`.
51
+
52
+ ## Project structure
53
+
54
+ ```text
55
+ src/
56
+ components/
57
+ amplitude.astro # initAll + guard (View Transitions fire scripts again)
58
+ Header.astro # Logout; listens on astro:page-load where needed
59
+ layouts/
60
+ AmplitudeLayout.astro # <ClientRouter /> + Amplitude
61
+ lib/
62
+ auth.ts
63
+ pages/
64
+ index.astro # Login; setUserId + track('User Logged In')
65
+ burrito.astro # track('Burrito Considered', …)
66
+ profile.astro
67
+ styles/
68
+ global.css
69
+ ```
70
+
71
+ ## Key integration points
72
+
73
+ ### Amplitude initialization (`src/components/amplitude.astro`)
74
+
75
+ With View Transitions, guard `initAll` so soft navigations do not re-run initialization:
76
+
77
+ ```astro
78
+ <script>
79
+ import * as amplitude from "@amplitude/unified";
80
+
81
+ const w = window as Window & { __amplitude_initialized?: boolean };
82
+ if (!w.__amplitude_initialized) {
83
+ w.__amplitude_initialized = true;
84
+ const apiKey = import.meta.env.PUBLIC_AMPLITUDE_API_KEY;
85
+ if (apiKey) {
86
+ void amplitude.initAll(apiKey, {
87
+ analytics: {
88
+ capture_pageview: "history_change",
89
+ },
90
+ });
91
+ }
92
+ window.amplitude = amplitude;
93
+ }
94
+ </script>
95
+ ```
96
+
97
+ ### Layout (`src/layouts/AmplitudeLayout.astro`)
98
+
99
+ ```astro
100
+ <ClientRouter />
101
+ <Amplitude />
102
+ ```
103
+
104
+ ### Page scripts after view transitions
105
+
106
+ Use `astro:page-load` (and `DOMContentLoaded` for the first load) so listeners work after soft navigation (`src/pages/index.astro`).
107
+
108
+ ### User identification and events
109
+
110
+ ```javascript
111
+ window.amplitude?.setUserId(username);
112
+ window.amplitude?.track("User Logged In");
113
+ ```
114
+
115
+ Burrito page:
116
+
117
+ ```javascript
118
+ window.amplitude?.track("Burrito Considered", {
119
+ total_considerations: newCount,
120
+ username: currentUser,
121
+ });
122
+ ```
123
+
124
+ Logout (`src/components/Header.astro`):
125
+
126
+ ```javascript
127
+ window.amplitude?.track("User Logged Out");
128
+ localStorage.removeItem("currentUser");
129
+ window.amplitude?.reset();
130
+ ```
131
+
132
+ ## Scripts
133
+
134
+ ```bash
135
+ pnpm dev
136
+ pnpm build
137
+ pnpm preview
138
+ ```
139
+
140
+ ## Learn more
141
+
142
+ - [Browser Unified SDK](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk) — [npm & `initAll`](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#unified-sdk-npm), [analytics options (Browser SDK 2)](https://amplitude.com/docs/sdks/analytics/browser/browser-sdk-2#initialize-the-sdk)
143
+ - [Astro View Transitions](https://docs.astro.build/en/guides/view-transitions/)
144
+
145
+ ---
146
+
147
+ ## .astro/content-assets.mjs
148
+
149
+ ```mjs
150
+ export default new Map();
151
+ ```
152
+
153
+ ---
154
+
155
+ ## .astro/content-modules.mjs
156
+
157
+ ```mjs
158
+ export default new Map();
159
+ ```
160
+
161
+ ---
162
+
163
+ ## .astro/content.d.ts
164
+
165
+ ```ts
166
+ declare module 'astro:content' {
167
+ export interface RenderResult {
168
+ Content: import('astro/runtime/server/index.js').AstroComponentFactory;
169
+ headings: import('astro').MarkdownHeading[];
170
+ remarkPluginFrontmatter: Record<string, any>;
171
+ }
172
+ interface Render {
173
+ '.md': Promise<RenderResult>;
174
+ }
175
+
176
+ export interface RenderedContent {
177
+ html: string;
178
+ metadata?: {
179
+ imagePaths: Array<string>;
180
+ [key: string]: unknown;
181
+ };
182
+ }
183
+ }
184
+
185
+ declare module 'astro:content' {
186
+ type Flatten<T> = T extends { [K: string]: infer U } ? U : never;
187
+
188
+ export type CollectionKey = keyof AnyEntryMap;
189
+ export type CollectionEntry<C extends CollectionKey> = Flatten<AnyEntryMap[C]>;
190
+
191
+ export type ContentCollectionKey = keyof ContentEntryMap;
192
+ export type DataCollectionKey = keyof DataEntryMap;
193
+
194
+ type AllValuesOf<T> = T extends any ? T[keyof T] : never;
195
+ type ValidContentEntrySlug<C extends keyof ContentEntryMap> = AllValuesOf<
196
+ ContentEntryMap[C]
197
+ >['slug'];
198
+
199
+ export type ReferenceDataEntry<
200
+ C extends CollectionKey,
201
+ E extends keyof DataEntryMap[C] = string,
202
+ > = {
203
+ collection: C;
204
+ id: E;
205
+ };
206
+ export type ReferenceContentEntry<
207
+ C extends keyof ContentEntryMap,
208
+ E extends ValidContentEntrySlug<C> | (string & {}) = string,
209
+ > = {
210
+ collection: C;
211
+ slug: E;
212
+ };
213
+ export type ReferenceLiveEntry<C extends keyof LiveContentConfig['collections']> = {
214
+ collection: C;
215
+ id: string;
216
+ };
217
+
218
+ /** @deprecated Use `getEntry` instead. */
219
+ export function getEntryBySlug<
220
+ C extends keyof ContentEntryMap,
221
+ E extends ValidContentEntrySlug<C> | (string & {}),
222
+ >(
223
+ collection: C,
224
+ // Note that this has to accept a regular string too, for SSR
225
+ entrySlug: E,
226
+ ): E extends ValidContentEntrySlug<C>
227
+ ? Promise<CollectionEntry<C>>
228
+ : Promise<CollectionEntry<C> | undefined>;
229
+
230
+ /** @deprecated Use `getEntry` instead. */
231
+ export function getDataEntryById<C extends keyof DataEntryMap, E extends keyof DataEntryMap[C]>(
232
+ collection: C,
233
+ entryId: E,
234
+ ): Promise<CollectionEntry<C>>;
235
+
236
+ export function getCollection<C extends keyof AnyEntryMap, E extends CollectionEntry<C>>(
237
+ collection: C,
238
+ filter?: (entry: CollectionEntry<C>) => entry is E,
239
+ ): Promise<E[]>;
240
+ export function getCollection<C extends keyof AnyEntryMap>(
241
+ collection: C,
242
+ filter?: (entry: CollectionEntry<C>) => unknown,
243
+ ): Promise<CollectionEntry<C>[]>;
244
+
245
+ export function getLiveCollection<C extends keyof LiveContentConfig['collections']>(
246
+ collection: C,
247
+ filter?: LiveLoaderCollectionFilterType<C>,
248
+ ): Promise<
249
+ import('astro').LiveDataCollectionResult<LiveLoaderDataType<C>, LiveLoaderErrorType<C>>
250
+ >;
251
+
252
+ export function getEntry<
253
+ C extends keyof ContentEntryMap,
254
+ E extends ValidContentEntrySlug<C> | (string & {}),
255
+ >(
256
+ entry: ReferenceContentEntry<C, E>,
257
+ ): E extends ValidContentEntrySlug<C>
258
+ ? Promise<CollectionEntry<C>>
259
+ : Promise<CollectionEntry<C> | undefined>;
260
+ export function getEntry<
261
+ C extends keyof DataEntryMap,
262
+ E extends keyof DataEntryMap[C] | (string & {}),
263
+ >(
264
+ entry: ReferenceDataEntry<C, E>,
265
+ ): E extends keyof DataEntryMap[C]
266
+ ? Promise<DataEntryMap[C][E]>
267
+ : Promise<CollectionEntry<C> | undefined>;
268
+ export function getEntry<
269
+ C extends keyof ContentEntryMap,
270
+ E extends ValidContentEntrySlug<C> | (string & {}),
271
+ >(
272
+ collection: C,
273
+ slug: E,
274
+ ): E extends ValidContentEntrySlug<C>
275
+ ? Promise<CollectionEntry<C>>
276
+ : Promise<CollectionEntry<C> | undefined>;
277
+ export function getEntry<
278
+ C extends keyof DataEntryMap,
279
+ E extends keyof DataEntryMap[C] | (string & {}),
280
+ >(
281
+ collection: C,
282
+ id: E,
283
+ ): E extends keyof DataEntryMap[C]
284
+ ? string extends keyof DataEntryMap[C]
285
+ ? Promise<DataEntryMap[C][E]> | undefined
286
+ : Promise<DataEntryMap[C][E]>
287
+ : Promise<CollectionEntry<C> | undefined>;
288
+ export function getLiveEntry<C extends keyof LiveContentConfig['collections']>(
289
+ collection: C,
290
+ filter: string | LiveLoaderEntryFilterType<C>,
291
+ ): Promise<import('astro').LiveDataEntryResult<LiveLoaderDataType<C>, LiveLoaderErrorType<C>>>;
292
+
293
+ /** Resolve an array of entry references from the same collection */
294
+ export function getEntries<C extends keyof ContentEntryMap>(
295
+ entries: ReferenceContentEntry<C, ValidContentEntrySlug<C>>[],
296
+ ): Promise<CollectionEntry<C>[]>;
297
+ export function getEntries<C extends keyof DataEntryMap>(
298
+ entries: ReferenceDataEntry<C, keyof DataEntryMap[C]>[],
299
+ ): Promise<CollectionEntry<C>[]>;
300
+
301
+ export function render<C extends keyof AnyEntryMap>(
302
+ entry: AnyEntryMap[C][string],
303
+ ): Promise<RenderResult>;
304
+
305
+ export function reference<C extends keyof AnyEntryMap>(
306
+ collection: C,
307
+ ): import('astro/zod').ZodEffects<
308
+ import('astro/zod').ZodString,
309
+ C extends keyof ContentEntryMap
310
+ ? ReferenceContentEntry<C, ValidContentEntrySlug<C>>
311
+ : ReferenceDataEntry<C, keyof DataEntryMap[C]>
312
+ >;
313
+ // Allow generic `string` to avoid excessive type errors in the config
314
+ // if `dev` is not running to update as you edit.
315
+ // Invalid collection names will be caught at build time.
316
+ export function reference<C extends string>(
317
+ collection: C,
318
+ ): import('astro/zod').ZodEffects<import('astro/zod').ZodString, never>;
319
+
320
+ type ReturnTypeOrOriginal<T> = T extends (...args: any[]) => infer R ? R : T;
321
+ type InferEntrySchema<C extends keyof AnyEntryMap> = import('astro/zod').infer<
322
+ ReturnTypeOrOriginal<Required<ContentConfig['collections'][C]>['schema']>
323
+ >;
324
+
325
+ type ContentEntryMap = {
326
+
327
+ };
328
+
329
+ type DataEntryMap = {
330
+
331
+ };
332
+
333
+ type AnyEntryMap = ContentEntryMap & DataEntryMap;
334
+
335
+ type ExtractLoaderTypes<T> = T extends import('astro/loaders').LiveLoader<
336
+ infer TData,
337
+ infer TEntryFilter,
338
+ infer TCollectionFilter,
339
+ infer TError
340
+ >
341
+ ? { data: TData; entryFilter: TEntryFilter; collectionFilter: TCollectionFilter; error: TError }
342
+ : { data: never; entryFilter: never; collectionFilter: never; error: never };
343
+ type ExtractDataType<T> = ExtractLoaderTypes<T>['data'];
344
+ type ExtractEntryFilterType<T> = ExtractLoaderTypes<T>['entryFilter'];
345
+ type ExtractCollectionFilterType<T> = ExtractLoaderTypes<T>['collectionFilter'];
346
+ type ExtractErrorType<T> = ExtractLoaderTypes<T>['error'];
347
+
348
+ type LiveLoaderDataType<C extends keyof LiveContentConfig['collections']> =
349
+ LiveContentConfig['collections'][C]['schema'] extends undefined
350
+ ? ExtractDataType<LiveContentConfig['collections'][C]['loader']>
351
+ : import('astro/zod').infer<
352
+ Exclude<LiveContentConfig['collections'][C]['schema'], undefined>
353
+ >;
354
+ type LiveLoaderEntryFilterType<C extends keyof LiveContentConfig['collections']> =
355
+ ExtractEntryFilterType<LiveContentConfig['collections'][C]['loader']>;
356
+ type LiveLoaderCollectionFilterType<C extends keyof LiveContentConfig['collections']> =
357
+ ExtractCollectionFilterType<LiveContentConfig['collections'][C]['loader']>;
358
+ type LiveLoaderErrorType<C extends keyof LiveContentConfig['collections']> = ExtractErrorType<
359
+ LiveContentConfig['collections'][C]['loader']
360
+ >;
361
+
362
+ export type ContentConfig = typeof import("../src/content.config.mjs");
363
+ export type LiveContentConfig = never;
364
+ }
365
+
366
+ ```
367
+
368
+ ---
369
+
370
+ ## .astro/types.d.ts
371
+
372
+ ```ts
373
+ /// <reference types="astro/client" />
374
+ /// <reference path="content.d.ts" />
375
+ ```
376
+
377
+ ---
378
+
379
+ ## .env.example
380
+
381
+ ```example
382
+ PUBLIC_AMPLITUDE_API_KEY=your_amplitude_api_key_here
383
+
384
+ ```
385
+
386
+ ---
387
+
388
+ ## astro.config.mjs
389
+
390
+ ```mjs
391
+ import { defineConfig } from "astro/config";
392
+
393
+ export default defineConfig({});
394
+
395
+ ```
396
+
397
+ ---
398
+
399
+ ## src/components/amplitude.astro
400
+
401
+ ```astro
402
+ ---
403
+ // Client-side Amplitude with View Transitions: guard so ClientRouter soft nav
404
+ // does not re-run initialization. Bundled @amplitude/unified (initAll).
405
+ ---
406
+ <script>
407
+ import * as amplitude from "@amplitude/unified";
408
+
409
+ const w = window as Window & { __amplitude_initialized?: boolean };
410
+ if (!w.__amplitude_initialized) {
411
+ w.__amplitude_initialized = true;
412
+ const apiKey = import.meta.env.PUBLIC_AMPLITUDE_API_KEY;
413
+ if (apiKey) {
414
+ void amplitude.initAll(apiKey, {
415
+ analytics: {
416
+ capture_pageview: "history_change",
417
+ },
418
+ });
419
+ }
420
+ window.amplitude = amplitude;
421
+ }
422
+ </script>
423
+
424
+ ```
425
+
426
+ ---
427
+
428
+ ## src/components/Header.astro
429
+
430
+ ```astro
431
+ ---
432
+ // Header component with navigation and logout functionality
433
+ // Works with View Transitions by using data-astro-reload for logout
434
+ ---
435
+ <header class="header">
436
+ <div class="header-container">
437
+ <nav>
438
+ <a href="/">Home</a>
439
+ <a href="/burrito" class="auth-link" style="display: none;">Burrito Consideration</a>
440
+ <a href="/profile" class="auth-link" style="display: none;">Profile</a>
441
+ </nav>
442
+ <div class="user-section">
443
+ <span class="welcome-text" style="display: none;">Welcome, <span class="username"></span>!</span>
444
+ <span class="not-logged-in">Not logged in</span>
445
+ <button class="btn-logout" style="display: none;">Logout</button>
446
+ </div>
447
+ </div>
448
+ </header>
449
+
450
+ <script is:inline>
451
+ function updateHeader() {
452
+ const currentUser = localStorage.getItem('currentUser');
453
+ const authLinks = document.querySelectorAll('.auth-link');
454
+ const welcomeText = document.querySelector('.welcome-text');
455
+ const notLoggedIn = document.querySelector('.not-logged-in');
456
+ const logoutBtn = document.querySelector('.btn-logout');
457
+ const usernameSpan = document.querySelector('.username');
458
+
459
+ if (currentUser) {
460
+ authLinks.forEach(link => link.style.display = 'inline');
461
+ welcomeText.style.display = 'inline';
462
+ notLoggedIn.style.display = 'none';
463
+ logoutBtn.style.display = 'inline';
464
+ usernameSpan.textContent = currentUser;
465
+ } else {
466
+ authLinks.forEach(link => link.style.display = 'none');
467
+ welcomeText.style.display = 'none';
468
+ notLoggedIn.style.display = 'inline';
469
+ logoutBtn.style.display = 'none';
470
+ }
471
+ }
472
+
473
+ function handleLogout() {
474
+ const currentUser = localStorage.getItem('currentUser');
475
+ if (currentUser) {
476
+ window.amplitude?.track('User Logged Out');
477
+ }
478
+ localStorage.removeItem('currentUser');
479
+ localStorage.removeItem('burritoConsiderations');
480
+ // IMPORTANT: Reset Amplitude to clear the user/session identity
481
+ window.amplitude?.reset();
482
+ window.location.href = '/';
483
+ }
484
+
485
+ function setupHeader() {
486
+ updateHeader();
487
+ const logoutBtn = document.querySelector('.btn-logout');
488
+ // Remove existing listeners to prevent duplicates during view transitions
489
+ logoutBtn?.removeEventListener('click', handleLogout);
490
+ logoutBtn?.addEventListener('click', handleLogout);
491
+ }
492
+
493
+ // Run on initial page load
494
+ document.addEventListener('DOMContentLoaded', setupHeader);
495
+
496
+ // Run after view transitions complete (for soft navigation)
497
+ document.addEventListener('astro:page-load', setupHeader);
498
+
499
+ // Listen for storage changes (login/logout in other tabs)
500
+ window.addEventListener('storage', updateHeader);
501
+ </script>
502
+
503
+ <style>
504
+ .header {
505
+ background-color: #333;
506
+ color: white;
507
+ padding: 1rem;
508
+ }
509
+
510
+ .header-container {
511
+ max-width: 1200px;
512
+ margin: 0 auto;
513
+ display: flex;
514
+ justify-content: space-between;
515
+ align-items: center;
516
+ }
517
+
518
+ .header nav {
519
+ display: flex;
520
+ gap: 1rem;
521
+ }
522
+
523
+ .header a {
524
+ color: white;
525
+ text-decoration: none;
526
+ padding: 0.5rem 1rem;
527
+ border-radius: 4px;
528
+ transition: background-color 0.2s;
529
+ }
530
+
531
+ .header a:hover {
532
+ background-color: #555;
533
+ text-decoration: none;
534
+ }
535
+
536
+ .user-section {
537
+ display: flex;
538
+ align-items: center;
539
+ gap: 1rem;
540
+ }
541
+
542
+ .btn-logout {
543
+ background-color: #dc3545;
544
+ color: white;
545
+ border: none;
546
+ padding: 0.5rem 1rem;
547
+ border-radius: 4px;
548
+ cursor: pointer;
549
+ font-size: 14px;
550
+ }
551
+
552
+ .btn-logout:hover {
553
+ background-color: #c82333;
554
+ }
555
+ </style>
556
+
557
+ ```
558
+
559
+ ---
560
+
561
+ ## src/env.d.ts
562
+
563
+ ```ts
564
+ /// <reference types="astro/client" />
565
+
566
+ declare global {
567
+ interface Window {
568
+ amplitude?: typeof import("@amplitude/unified");
569
+ __amplitude_initialized?: boolean;
570
+ }
571
+ }
572
+
573
+ export {};
574
+
575
+ ```
576
+
577
+ ---
578
+
579
+ ## src/layouts/AmplitudeLayout.astro
580
+
581
+ ```astro
582
+ ---
583
+ import { ClientRouter } from 'astro:transitions';
584
+ import Amplitude from '../components/amplitude.astro';
585
+ import Header from '../components/Header.astro';
586
+ import '../styles/global.css';
587
+
588
+ interface Props {
589
+ title: string;
590
+ }
591
+
592
+ const { title } = Astro.props;
593
+ ---
594
+ <!doctype html>
595
+ <html lang="en">
596
+ <head>
597
+ <meta charset="UTF-8" />
598
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
599
+ <meta name="description" content="Astro Amplitude Integration with View Transitions" />
600
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
601
+ <title>{title}</title>
602
+ <ClientRouter />
603
+ <Amplitude />
604
+ </head>
605
+ <body>
606
+ <Header />
607
+ <main>
608
+ <slot />
609
+ </main>
610
+ </body>
611
+ </html>
612
+
613
+ ```
614
+
615
+ ---
616
+
617
+ ## src/lib/auth.ts
618
+
619
+ ```ts
620
+ // Client-side auth utilities for localStorage-based authentication
621
+
622
+ export interface User {
623
+ username: string;
624
+ burritoConsiderations: number;
625
+ }
626
+
627
+ export function getCurrentUser(): User | null {
628
+ if (typeof window === "undefined") return null;
629
+
630
+ const username = localStorage.getItem("currentUser");
631
+ if (!username) return null;
632
+
633
+ const considerations = parseInt(
634
+ localStorage.getItem("burritoConsiderations") || "0",
635
+ 10,
636
+ );
637
+
638
+ return {
639
+ username,
640
+ burritoConsiderations: considerations,
641
+ };
642
+ }
643
+
644
+ export function login(username: string, password: string): boolean {
645
+ if (!username || !password) return false;
646
+
647
+ localStorage.setItem("currentUser", username);
648
+ // Initialize burrito considerations if not set
649
+ if (!localStorage.getItem("burritoConsiderations")) {
650
+ localStorage.setItem("burritoConsiderations", "0");
651
+ }
652
+
653
+ return true;
654
+ }
655
+
656
+ export function logout(): void {
657
+ localStorage.removeItem("currentUser");
658
+ localStorage.removeItem("burritoConsiderations");
659
+ }
660
+
661
+ export function incrementBurritoConsiderations(): number {
662
+ const current = parseInt(
663
+ localStorage.getItem("burritoConsiderations") || "0",
664
+ 10,
665
+ );
666
+ const newCount = current + 1;
667
+ localStorage.setItem("burritoConsiderations", newCount.toString());
668
+ return newCount;
669
+ }
670
+
671
+ ```
672
+
673
+ ---
674
+
675
+ ## src/pages/burrito.astro
676
+
677
+ ```astro
678
+ ---
679
+ import AmplitudeLayout from '../layouts/AmplitudeLayout.astro';
680
+ ---
681
+ <AmplitudeLayout title="Burrito Consideration - Astro Amplitude with View Transitions">
682
+ <div class="container">
683
+ <h1>Burrito consideration zone</h1>
684
+ <p>Take a moment to truly consider the potential of burritos.</p>
685
+
686
+ <div style="text-align: center;">
687
+ <button id="consider-btn" class="btn-burrito">
688
+ I have considered the burrito potential
689
+ </button>
690
+
691
+ <p id="success-message" class="success" style="display: none;">
692
+ Thank you for your consideration! Count: <span id="consideration-count"></span>
693
+ </p>
694
+ </div>
695
+
696
+ <div class="stats">
697
+ <h3>Consideration stats</h3>
698
+ <p>Total considerations: <span id="total-considerations">0</span></p>
699
+ </div>
700
+ </div>
701
+ </AmplitudeLayout>
702
+
703
+ <script is:inline>
704
+ function checkAuth() {
705
+ const currentUser = localStorage.getItem('currentUser');
706
+ if (!currentUser) {
707
+ window.location.href = '/';
708
+ return false;
709
+ }
710
+ return true;
711
+ }
712
+
713
+ function updateStats() {
714
+ const count = localStorage.getItem('burritoConsiderations') || '0';
715
+ const totalElement = document.getElementById('total-considerations');
716
+ if (totalElement) {
717
+ totalElement.textContent = count;
718
+ }
719
+ }
720
+
721
+ function handleConsideration() {
722
+ const currentUser = localStorage.getItem('currentUser');
723
+ if (!currentUser) return;
724
+
725
+ // Increment the count
726
+ const currentCount = parseInt(localStorage.getItem('burritoConsiderations') || '0', 10);
727
+ const newCount = currentCount + 1;
728
+ localStorage.setItem('burritoConsiderations', newCount.toString());
729
+
730
+ // Update the UI
731
+ updateStats();
732
+
733
+ const successMessage = document.getElementById('success-message');
734
+ const considerationCount = document.getElementById('consideration-count');
735
+ if (considerationCount) {
736
+ considerationCount.textContent = newCount;
737
+ }
738
+ if (successMessage) {
739
+ successMessage.style.display = 'block';
740
+
741
+ // Hide success message after 2 seconds
742
+ setTimeout(() => {
743
+ successMessage.style.display = 'none';
744
+ }, 2000);
745
+ }
746
+
747
+ // Capture burrito consideration event in Amplitude
748
+ window.amplitude?.track('Burrito Considered', {
749
+ total_considerations: newCount,
750
+ username: currentUser
751
+ });
752
+ }
753
+
754
+ function setupBurritoPage() {
755
+ if (!checkAuth()) return;
756
+
757
+ updateStats();
758
+ const btn = document.getElementById('consider-btn');
759
+ // Remove existing listener to prevent duplicates during view transitions
760
+ btn?.removeEventListener('click', handleConsideration);
761
+ btn?.addEventListener('click', handleConsideration);
762
+ }
763
+
764
+ // Run on initial page load
765
+ document.addEventListener('DOMContentLoaded', setupBurritoPage);
766
+
767
+ // Run after view transitions complete (for soft navigation)
768
+ document.addEventListener('astro:page-load', setupBurritoPage);
769
+ </script>
770
+
771
+ ```
772
+
773
+ ---
774
+
775
+ ## src/pages/index.astro
776
+
777
+ ```astro
778
+ ---
779
+ import AmplitudeLayout from '../layouts/AmplitudeLayout.astro';
780
+ ---
781
+ <AmplitudeLayout title="Home - Astro Amplitude with View Transitions">
782
+ <div class="container">
783
+ <div id="logged-in-view" style="display: none;">
784
+ <h1>Welcome back, <span id="welcome-username"></span>!</h1>
785
+ <p>You are now logged in. Feel free to explore:</p>
786
+ <ul>
787
+ <li>Consider the potential of burritos</li>
788
+ <li>View your profile and statistics</li>
789
+ </ul>
790
+ </div>
791
+
792
+ <div id="logged-out-view">
793
+ <h1>Welcome to Burrito Consideration App</h1>
794
+ <p>Please sign in to begin your burrito journey</p>
795
+
796
+ <form id="login-form" class="form">
797
+ <div class="form-group">
798
+ <label for="username">Username:</label>
799
+ <input
800
+ type="text"
801
+ id="username"
802
+ placeholder="Enter any username"
803
+ required
804
+ />
805
+ </div>
806
+
807
+ <div class="form-group">
808
+ <label for="password">Password:</label>
809
+ <input
810
+ type="password"
811
+ id="password"
812
+ placeholder="Enter any password"
813
+ required
814
+ />
815
+ </div>
816
+
817
+ <p id="error-message" class="error" style="display: none;"></p>
818
+
819
+ <button type="submit" class="btn-primary">Sign In</button>
820
+ </form>
821
+
822
+ <p class="note">
823
+ Note: This is a demo app. Use any username and password to sign in.
824
+ </p>
825
+ </div>
826
+ </div>
827
+ </AmplitudeLayout>
828
+
829
+ <script is:inline>
830
+ function updateView() {
831
+ const currentUser = localStorage.getItem('currentUser');
832
+ const loggedInView = document.getElementById('logged-in-view');
833
+ const loggedOutView = document.getElementById('logged-out-view');
834
+ const welcomeUsername = document.getElementById('welcome-username');
835
+
836
+ if (currentUser) {
837
+ loggedInView.style.display = 'block';
838
+ loggedOutView.style.display = 'none';
839
+ welcomeUsername.textContent = currentUser;
840
+ } else {
841
+ loggedInView.style.display = 'none';
842
+ loggedOutView.style.display = 'block';
843
+ }
844
+ }
845
+
846
+ function handleLogin(event) {
847
+ event.preventDefault();
848
+
849
+ const username = document.getElementById('username').value;
850
+ const password = document.getElementById('password').value;
851
+ const errorMessage = document.getElementById('error-message');
852
+
853
+ if (!username || !password) {
854
+ errorMessage.textContent = 'Please provide both username and password';
855
+ errorMessage.style.display = 'block';
856
+ return;
857
+ }
858
+
859
+ // Client-side only fake auth - store in localStorage
860
+ localStorage.setItem('currentUser', username);
861
+ if (!localStorage.getItem('burritoConsiderations')) {
862
+ localStorage.setItem('burritoConsiderations', '0');
863
+ }
864
+
865
+ // Identify the user in Amplitude (once on login is enough)
866
+ window.amplitude?.setUserId(username);
867
+ window.amplitude?.track('User Logged In');
868
+
869
+ // Clear form
870
+ document.getElementById('username').value = '';
871
+ document.getElementById('password').value = '';
872
+ errorMessage.style.display = 'none';
873
+
874
+ // Update view
875
+ updateView();
876
+
877
+ // Trigger header update
878
+ window.dispatchEvent(new Event('storage'));
879
+ }
880
+
881
+ function setupIndexPage() {
882
+ updateView();
883
+ const form = document.getElementById('login-form');
884
+ // Remove existing listener to prevent duplicates during view transitions
885
+ form?.removeEventListener('submit', handleLogin);
886
+ form?.addEventListener('submit', handleLogin);
887
+ }
888
+
889
+ // Run on initial page load
890
+ document.addEventListener('DOMContentLoaded', setupIndexPage);
891
+
892
+ // Run after view transitions complete (for soft navigation)
893
+ document.addEventListener('astro:page-load', setupIndexPage);
894
+
895
+ // Listen for storage changes
896
+ window.addEventListener('storage', updateView);
897
+ </script>
898
+
899
+ ```
900
+
901
+ ---
902
+
903
+ ## src/pages/profile.astro
904
+
905
+ ```astro
906
+ ---
907
+ import AmplitudeLayout from '../layouts/AmplitudeLayout.astro';
908
+ ---
909
+ <AmplitudeLayout title="Profile - Astro Amplitude with View Transitions">
910
+ <div class="container">
911
+ <h1>User Profile</h1>
912
+
913
+ <div class="stats">
914
+ <h2>Your Information</h2>
915
+ <p><strong>Username:</strong> <span id="profile-username"></span></p>
916
+ <p><strong>Burrito Considerations:</strong> <span id="profile-considerations">0</span></p>
917
+ </div>
918
+
919
+ <div style="margin-top: 2rem;">
920
+ <h3>Your Burrito Journey</h3>
921
+ <p id="journey-message"></p>
922
+ </div>
923
+ </div>
924
+ </AmplitudeLayout>
925
+
926
+ <script is:inline>
927
+ function checkAuth() {
928
+ const currentUser = localStorage.getItem('currentUser');
929
+ if (!currentUser) {
930
+ window.location.href = '/';
931
+ return false;
932
+ }
933
+ return true;
934
+ }
935
+
936
+ function updateProfile() {
937
+ const username = localStorage.getItem('currentUser') || '';
938
+ const considerations = parseInt(localStorage.getItem('burritoConsiderations') || '0', 10);
939
+
940
+ const usernameEl = document.getElementById('profile-username');
941
+ const considerationsEl = document.getElementById('profile-considerations');
942
+ const journeyMessage = document.getElementById('journey-message');
943
+
944
+ if (usernameEl) usernameEl.textContent = username;
945
+ if (considerationsEl) considerationsEl.textContent = considerations.toString();
946
+
947
+ // Update journey message based on consideration count
948
+ if (journeyMessage) {
949
+ if (considerations === 0) {
950
+ journeyMessage.textContent = "You haven't considered any burritos yet. Visit the Burrito Consideration page to start!";
951
+ } else if (considerations === 1) {
952
+ journeyMessage.textContent = "You've considered the burrito potential once. Keep going!";
953
+ } else if (considerations < 5) {
954
+ journeyMessage.textContent = "You're getting the hang of burrito consideration!";
955
+ } else if (considerations < 10) {
956
+ journeyMessage.textContent = "You're becoming a burrito consideration expert!";
957
+ } else {
958
+ journeyMessage.textContent = "You are a true burrito consideration master!";
959
+ }
960
+ }
961
+ }
962
+
963
+ function setupProfilePage() {
964
+ if (!checkAuth()) return;
965
+
966
+ updateProfile();
967
+ }
968
+
969
+ // Run on initial page load
970
+ document.addEventListener('DOMContentLoaded', setupProfilePage);
971
+
972
+ // Run after view transitions complete (for soft navigation)
973
+ document.addEventListener('astro:page-load', setupProfilePage);
974
+ </script>
975
+
976
+ ```
977
+
978
+ ---
979
+