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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (392) hide show
  1. package/LICENSE +25 -1
  2. package/README.md +171 -74
  3. package/dist/bin.js +338 -222
  4. package/dist/src/lib/agent-interface.js +64 -9
  5. package/dist/src/lib/agent-runner.js +1 -10
  6. package/dist/src/lib/api.d.ts +22 -4
  7. package/dist/src/lib/api.js +114 -12
  8. package/dist/src/lib/commandments.js +14 -1
  9. package/dist/src/lib/constants.d.ts +6 -5
  10. package/dist/src/lib/constants.js +13 -13
  11. package/dist/src/lib/credential-resolution.d.ts +45 -0
  12. package/dist/src/lib/credential-resolution.js +311 -0
  13. package/dist/src/lib/exit-codes.d.ts +10 -0
  14. package/dist/src/lib/exit-codes.js +12 -0
  15. package/dist/src/lib/health-checks/statuspage.d.ts +1 -0
  16. package/dist/src/lib/health-checks/statuspage.js +5 -1
  17. package/dist/src/lib/mode-config.d.ts +14 -0
  18. package/dist/src/lib/mode-config.js +14 -0
  19. package/dist/src/lib/session-checkpoint.d.ts +27 -0
  20. package/dist/src/lib/session-checkpoint.js +134 -0
  21. package/dist/src/lib/wizard-session.d.ts +44 -1
  22. package/dist/src/lib/wizard-session.js +70 -14
  23. package/dist/src/lib/wizard-tools.js +19 -4
  24. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +3 -0
  25. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +6 -0
  26. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +3 -1
  27. package/dist/src/ui/agent-ui.d.ts +91 -0
  28. package/dist/src/ui/agent-ui.js +277 -0
  29. package/dist/src/ui/logging-ui.js +1 -1
  30. package/dist/src/ui/tui/App.d.ts +12 -0
  31. package/dist/src/ui/tui/App.js +29 -18
  32. package/dist/src/ui/tui/components/AmplitudeLogo.js +16 -17
  33. package/dist/src/ui/tui/components/AmplitudeTextLogo.d.ts +0 -2
  34. package/dist/src/ui/tui/components/AmplitudeTextLogo.js +53 -18
  35. package/dist/src/ui/tui/components/BrailleSpinner.d.ts +8 -0
  36. package/dist/src/ui/tui/components/BrailleSpinner.js +15 -0
  37. package/dist/src/ui/tui/components/ConsoleView.d.ts +8 -11
  38. package/dist/src/ui/tui/components/ConsoleView.js +51 -34
  39. package/dist/src/ui/tui/components/HeaderBar.d.ts +12 -0
  40. package/dist/src/ui/tui/components/HeaderBar.js +17 -0
  41. package/dist/src/ui/tui/components/JourneyStepper.d.ts +16 -0
  42. package/dist/src/ui/tui/components/JourneyStepper.js +83 -0
  43. package/dist/src/ui/tui/components/KeyHintBar.d.ts +19 -0
  44. package/dist/src/ui/tui/components/KeyHintBar.js +20 -0
  45. package/dist/src/ui/tui/console-commands.d.ts +1 -2
  46. package/dist/src/ui/tui/console-commands.js +48 -7
  47. package/dist/src/ui/tui/flows.d.ts +1 -1
  48. package/dist/src/ui/tui/flows.js +1 -1
  49. package/dist/src/ui/tui/hooks/useAsyncEffect.d.ts +15 -0
  50. package/dist/src/ui/tui/hooks/useAsyncEffect.js +35 -0
  51. package/dist/src/ui/tui/hooks/useWizardStore.d.ts +9 -0
  52. package/dist/src/ui/tui/hooks/useWizardStore.js +11 -0
  53. package/dist/src/ui/tui/ink-ui.js +1 -1
  54. package/dist/src/ui/tui/primitives/DissolveTransition.js +4 -5
  55. package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +3 -1
  56. package/dist/src/ui/tui/primitives/EventPlanViewer.js +8 -3
  57. package/dist/src/ui/tui/primitives/ProgressList.js +1 -1
  58. package/dist/src/ui/tui/primitives/SlashCommandInput.js +19 -4
  59. package/dist/src/ui/tui/primitives/SplitView.d.ts +2 -1
  60. package/dist/src/ui/tui/primitives/SplitView.js +10 -2
  61. package/dist/src/ui/tui/primitives/TabContainer.js +10 -2
  62. package/dist/src/ui/tui/primitives/index.d.ts +0 -1
  63. package/dist/src/ui/tui/primitives/index.js +0 -1
  64. package/dist/src/ui/tui/router.js +1 -1
  65. package/dist/src/ui/tui/screen-registry.d.ts +0 -7
  66. package/dist/src/ui/tui/screen-registry.js +13 -4
  67. package/dist/src/ui/tui/screens/ActivationOptionsScreen.d.ts +2 -2
  68. package/dist/src/ui/tui/screens/ActivationOptionsScreen.js +8 -8
  69. package/dist/src/ui/tui/screens/AuthScreen.js +57 -27
  70. package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +2 -12
  71. package/dist/src/ui/tui/screens/ChecklistScreen.js +22 -33
  72. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +3 -12
  73. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +109 -39
  74. package/dist/src/ui/tui/screens/DataSetupScreen.d.ts +3 -3
  75. package/dist/src/ui/tui/screens/DataSetupScreen.js +17 -10
  76. package/dist/src/ui/tui/screens/IntroScreen.d.ts +5 -3
  77. package/dist/src/ui/tui/screens/IntroScreen.js +132 -41
  78. package/dist/src/ui/tui/screens/LoginScreen.d.ts +1 -1
  79. package/dist/src/ui/tui/screens/LoginScreen.js +4 -4
  80. package/dist/src/ui/tui/screens/LogoutScreen.d.ts +4 -2
  81. package/dist/src/ui/tui/screens/LogoutScreen.js +17 -5
  82. package/dist/src/ui/tui/screens/McpScreen.d.ts +4 -4
  83. package/dist/src/ui/tui/screens/McpScreen.js +25 -17
  84. package/dist/src/ui/tui/screens/OutageScreen.d.ts +1 -1
  85. package/dist/src/ui/tui/screens/OutageScreen.js +5 -5
  86. package/dist/src/ui/tui/screens/OutroScreen.d.ts +5 -0
  87. package/dist/src/ui/tui/screens/OutroScreen.js +21 -14
  88. package/dist/src/ui/tui/screens/RegionSelectScreen.js +15 -13
  89. package/dist/src/ui/tui/screens/RunScreen.d.ts +7 -5
  90. package/dist/src/ui/tui/screens/RunScreen.js +102 -157
  91. package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +1 -1
  92. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +6 -5
  93. package/dist/src/ui/tui/screens/SetupScreen.d.ts +1 -1
  94. package/dist/src/ui/tui/screens/SetupScreen.js +7 -7
  95. package/dist/src/ui/tui/screens/SlackScreen.d.ts +2 -2
  96. package/dist/src/ui/tui/screens/SlackScreen.js +60 -35
  97. package/dist/src/ui/tui/session-constants.d.ts +41 -0
  98. package/dist/src/ui/tui/session-constants.js +38 -0
  99. package/dist/src/ui/tui/start-tui.d.ts +3 -1
  100. package/dist/src/ui/tui/start-tui.js +14 -10
  101. package/dist/src/ui/tui/store.d.ts +2 -1
  102. package/dist/src/ui/tui/store.js +33 -7
  103. package/dist/src/ui/tui/styles.d.ts +75 -19
  104. package/dist/src/ui/tui/styles.js +101 -19
  105. package/dist/src/ui/tui/utils/classify-error.d.ts +14 -0
  106. package/dist/src/ui/tui/utils/classify-error.js +90 -0
  107. package/dist/src/ui/tui/utils/diagnostics.d.ts +21 -0
  108. package/dist/src/ui/tui/utils/diagnostics.js +72 -0
  109. package/dist/src/ui/tui/utils/with-retry.d.ts +12 -0
  110. package/dist/src/ui/tui/utils/with-retry.js +32 -0
  111. package/dist/src/ui/tui/utils/with-timeout.d.ts +10 -0
  112. package/dist/src/ui/tui/utils/with-timeout.js +24 -0
  113. package/dist/src/utils/ampli-settings.d.ts +1 -1
  114. package/dist/src/utils/ampli-settings.js +15 -5
  115. package/dist/src/utils/api-key-store.js +5 -5
  116. package/dist/src/utils/atomic-write.d.ts +15 -0
  117. package/dist/src/utils/atomic-write.js +34 -0
  118. package/dist/src/utils/setup-utils.js +2 -2
  119. package/dist/src/utils/token-refresh.d.ts +22 -0
  120. package/dist/src/utils/token-refresh.js +79 -0
  121. package/dist/src/utils/wizard-abort.js +6 -1
  122. package/package.json +6 -6
  123. package/skills/instrumentation/add-analytics-instrumentation/SKILL.md +142 -0
  124. package/skills/instrumentation/diff-intake/SKILL.md +128 -0
  125. package/skills/instrumentation/discover-analytics-patterns/SKILL.md +185 -0
  126. package/skills/instrumentation/discover-event-surfaces/SKILL.md +322 -0
  127. package/skills/instrumentation/discover-event-surfaces/references/best-practices.md +563 -0
  128. package/skills/instrumentation/instrument-events/SKILL.md +169 -0
  129. package/skills/instrumentation/instrument-events/references/best-practices.md +563 -0
  130. package/skills/integration/integration-android/SKILL.md +49 -0
  131. package/skills/integration/integration-android/references/EXAMPLE.md +1977 -0
  132. package/skills/integration/integration-android/references/amplitude-quickstart.md +1845 -0
  133. package/skills/integration/integration-android/references/analytics.md +1778 -0
  134. package/skills/integration/integration-android/references/basic-integration-1.0-begin.md +43 -0
  135. package/skills/integration/integration-android/references/basic-integration-1.1-edit.md +35 -0
  136. package/skills/integration/integration-android/references/basic-integration-1.2-revise.md +23 -0
  137. package/skills/integration/integration-android/references/basic-integration-1.3-conclude.md +57 -0
  138. package/skills/integration/integration-angular/SKILL.md +49 -0
  139. package/skills/integration/integration-angular/references/EXAMPLE.md +899 -0
  140. package/skills/integration/integration-angular/references/amplitude-quickstart.md +1845 -0
  141. package/skills/integration/integration-angular/references/basic-integration-1.0-begin.md +43 -0
  142. package/skills/integration/integration-angular/references/basic-integration-1.1-edit.md +35 -0
  143. package/skills/integration/integration-angular/references/basic-integration-1.2-revise.md +23 -0
  144. package/skills/integration/integration-angular/references/basic-integration-1.3-conclude.md +57 -0
  145. package/skills/integration/integration-angular/references/browser-sdk-2.md +4680 -0
  146. package/skills/integration/integration-astro-hybrid/SKILL.md +56 -0
  147. package/skills/integration/integration-astro-hybrid/references/EXAMPLE.md +1095 -0
  148. package/skills/integration/integration-astro-hybrid/references/amplitude-quickstart.md +1845 -0
  149. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.0-begin.md +43 -0
  150. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.1-edit.md +35 -0
  151. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.2-revise.md +23 -0
  152. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.3-conclude.md +57 -0
  153. package/skills/integration/integration-astro-hybrid/references/browser-sdk-2.md +4680 -0
  154. package/skills/integration/integration-astro-ssr/SKILL.md +52 -0
  155. package/skills/integration/integration-astro-ssr/references/EXAMPLE.md +1106 -0
  156. package/skills/integration/integration-astro-ssr/references/amplitude-quickstart.md +1845 -0
  157. package/skills/integration/integration-astro-ssr/references/basic-integration-1.0-begin.md +43 -0
  158. package/skills/integration/integration-astro-ssr/references/basic-integration-1.1-edit.md +35 -0
  159. package/skills/integration/integration-astro-ssr/references/basic-integration-1.2-revise.md +23 -0
  160. package/skills/integration/integration-astro-ssr/references/basic-integration-1.3-conclude.md +57 -0
  161. package/skills/integration/integration-astro-ssr/references/browser-sdk-2.md +4680 -0
  162. package/skills/integration/integration-astro-static/SKILL.md +49 -0
  163. package/skills/integration/integration-astro-static/references/EXAMPLE.md +910 -0
  164. package/skills/integration/integration-astro-static/references/amplitude-quickstart.md +1845 -0
  165. package/skills/integration/integration-astro-static/references/basic-integration-1.0-begin.md +43 -0
  166. package/skills/integration/integration-astro-static/references/basic-integration-1.1-edit.md +35 -0
  167. package/skills/integration/integration-astro-static/references/basic-integration-1.2-revise.md +23 -0
  168. package/skills/integration/integration-astro-static/references/basic-integration-1.3-conclude.md +57 -0
  169. package/skills/integration/integration-astro-static/references/browser-sdk-2.md +4680 -0
  170. package/skills/integration/integration-astro-view-transitions/SKILL.md +51 -0
  171. package/skills/integration/integration-astro-view-transitions/references/EXAMPLE.md +979 -0
  172. package/skills/integration/integration-astro-view-transitions/references/amplitude-quickstart.md +1845 -0
  173. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.0-begin.md +43 -0
  174. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.1-edit.md +35 -0
  175. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.2-revise.md +23 -0
  176. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.3-conclude.md +57 -0
  177. package/skills/integration/integration-astro-view-transitions/references/browser-sdk-2.md +4680 -0
  178. package/skills/integration/integration-django/SKILL.md +57 -0
  179. package/skills/integration/integration-django/references/EXAMPLE.md +1005 -0
  180. package/skills/integration/integration-django/references/amplitude-quickstart.md +1845 -0
  181. package/skills/integration/integration-django/references/basic-integration-1.0-begin.md +43 -0
  182. package/skills/integration/integration-django/references/basic-integration-1.1-edit.md +35 -0
  183. package/skills/integration/integration-django/references/basic-integration-1.2-revise.md +23 -0
  184. package/skills/integration/integration-django/references/basic-integration-1.3-conclude.md +57 -0
  185. package/skills/integration/integration-django/references/python.md +1424 -0
  186. package/skills/integration/integration-expo/SKILL.md +53 -0
  187. package/skills/integration/integration-expo/references/EXAMPLE.md +1291 -0
  188. package/skills/integration/integration-expo/references/amplitude-quickstart.md +1845 -0
  189. package/skills/integration/integration-expo/references/basic-integration-1.0-begin.md +43 -0
  190. package/skills/integration/integration-expo/references/basic-integration-1.1-edit.md +35 -0
  191. package/skills/integration/integration-expo/references/basic-integration-1.2-revise.md +23 -0
  192. package/skills/integration/integration-expo/references/basic-integration-1.3-conclude.md +57 -0
  193. package/skills/integration/integration-expo/references/react-native-sdk.md +2819 -0
  194. package/skills/integration/integration-fastapi/SKILL.md +57 -0
  195. package/skills/integration/integration-fastapi/references/EXAMPLE.md +1389 -0
  196. package/skills/integration/integration-fastapi/references/amplitude-quickstart.md +1845 -0
  197. package/skills/integration/integration-fastapi/references/basic-integration-1.0-begin.md +43 -0
  198. package/skills/integration/integration-fastapi/references/basic-integration-1.1-edit.md +35 -0
  199. package/skills/integration/integration-fastapi/references/basic-integration-1.2-revise.md +23 -0
  200. package/skills/integration/integration-fastapi/references/basic-integration-1.3-conclude.md +57 -0
  201. package/skills/integration/integration-fastapi/references/python.md +1424 -0
  202. package/skills/integration/integration-flask/SKILL.md +56 -0
  203. package/skills/integration/integration-flask/references/EXAMPLE.md +1130 -0
  204. package/skills/integration/integration-flask/references/amplitude-quickstart.md +1845 -0
  205. package/skills/integration/integration-flask/references/basic-integration-1.0-begin.md +43 -0
  206. package/skills/integration/integration-flask/references/basic-integration-1.1-edit.md +35 -0
  207. package/skills/integration/integration-flask/references/basic-integration-1.2-revise.md +23 -0
  208. package/skills/integration/integration-flask/references/basic-integration-1.3-conclude.md +57 -0
  209. package/skills/integration/integration-flask/references/python.md +1424 -0
  210. package/skills/integration/integration-javascript_node/SKILL.md +54 -0
  211. package/skills/integration/integration-javascript_node/references/EXAMPLE.md +365 -0
  212. package/skills/integration/integration-javascript_node/references/amplitude-quickstart.md +1845 -0
  213. package/skills/integration/integration-javascript_node/references/analytics.md +1778 -0
  214. package/skills/integration/integration-javascript_node/references/basic-integration-1.0-begin.md +43 -0
  215. package/skills/integration/integration-javascript_node/references/basic-integration-1.1-edit.md +35 -0
  216. package/skills/integration/integration-javascript_node/references/basic-integration-1.2-revise.md +23 -0
  217. package/skills/integration/integration-javascript_node/references/basic-integration-1.3-conclude.md +57 -0
  218. package/skills/integration/integration-javascript_web/SKILL.md +58 -0
  219. package/skills/integration/integration-javascript_web/references/EXAMPLE.md +451 -0
  220. package/skills/integration/integration-javascript_web/references/amplitude-quickstart.md +1845 -0
  221. package/skills/integration/integration-javascript_web/references/basic-integration-1.0-begin.md +43 -0
  222. package/skills/integration/integration-javascript_web/references/basic-integration-1.1-edit.md +35 -0
  223. package/skills/integration/integration-javascript_web/references/basic-integration-1.2-revise.md +23 -0
  224. package/skills/integration/integration-javascript_web/references/basic-integration-1.3-conclude.md +57 -0
  225. package/skills/integration/integration-javascript_web/references/browser-sdk-2.md +4680 -0
  226. package/skills/integration/integration-laravel/SKILL.md +52 -0
  227. package/skills/integration/integration-laravel/references/EXAMPLE.md +2039 -0
  228. package/skills/integration/integration-laravel/references/amplitude-quickstart.md +1845 -0
  229. package/skills/integration/integration-laravel/references/analytics.md +1778 -0
  230. package/skills/integration/integration-laravel/references/basic-integration-1.0-begin.md +43 -0
  231. package/skills/integration/integration-laravel/references/basic-integration-1.1-edit.md +35 -0
  232. package/skills/integration/integration-laravel/references/basic-integration-1.2-revise.md +23 -0
  233. package/skills/integration/integration-laravel/references/basic-integration-1.3-conclude.md +57 -0
  234. package/skills/integration/integration-nextjs-app-router/SKILL.md +54 -0
  235. package/skills/integration/integration-nextjs-app-router/references/EXAMPLE.md +673 -0
  236. package/skills/integration/integration-nextjs-app-router/references/amplitude-quickstart.md +1845 -0
  237. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.0-begin.md +43 -0
  238. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.1-edit.md +35 -0
  239. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.2-revise.md +23 -0
  240. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.3-conclude.md +57 -0
  241. package/skills/integration/integration-nextjs-app-router/references/browser-sdk-2.md +4680 -0
  242. package/skills/integration/integration-nextjs-pages-router/SKILL.md +54 -0
  243. package/skills/integration/integration-nextjs-pages-router/references/EXAMPLE.md +735 -0
  244. package/skills/integration/integration-nextjs-pages-router/references/amplitude-quickstart.md +1845 -0
  245. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.0-begin.md +43 -0
  246. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.1-edit.md +35 -0
  247. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.2-revise.md +23 -0
  248. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.3-conclude.md +57 -0
  249. package/skills/integration/integration-nextjs-pages-router/references/browser-sdk-2.md +4680 -0
  250. package/skills/integration/integration-nuxt-3.6/SKILL.md +46 -0
  251. package/skills/integration/integration-nuxt-3.6/references/EXAMPLE.md +8422 -0
  252. package/skills/integration/integration-nuxt-3.6/references/amplitude-quickstart.md +1845 -0
  253. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.0-begin.md +43 -0
  254. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.1-edit.md +35 -0
  255. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.2-revise.md +23 -0
  256. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.3-conclude.md +57 -0
  257. package/skills/integration/integration-nuxt-3.6/references/browser-sdk-2.md +4680 -0
  258. package/skills/integration/integration-nuxt-4/SKILL.md +46 -0
  259. package/skills/integration/integration-nuxt-4/references/EXAMPLE.md +8670 -0
  260. package/skills/integration/integration-nuxt-4/references/amplitude-quickstart.md +1845 -0
  261. package/skills/integration/integration-nuxt-4/references/basic-integration-1.0-begin.md +43 -0
  262. package/skills/integration/integration-nuxt-4/references/basic-integration-1.1-edit.md +35 -0
  263. package/skills/integration/integration-nuxt-4/references/basic-integration-1.2-revise.md +23 -0
  264. package/skills/integration/integration-nuxt-4/references/basic-integration-1.3-conclude.md +57 -0
  265. package/skills/integration/integration-nuxt-4/references/browser-sdk-2.md +4680 -0
  266. package/skills/integration/integration-python/SKILL.md +53 -0
  267. package/skills/integration/integration-python/references/EXAMPLE.md +445 -0
  268. package/skills/integration/integration-python/references/amplitude-quickstart.md +1845 -0
  269. package/skills/integration/integration-python/references/basic-integration-1.0-begin.md +43 -0
  270. package/skills/integration/integration-python/references/basic-integration-1.1-edit.md +35 -0
  271. package/skills/integration/integration-python/references/basic-integration-1.2-revise.md +23 -0
  272. package/skills/integration/integration-python/references/basic-integration-1.3-conclude.md +57 -0
  273. package/skills/integration/integration-python/references/python.md +1424 -0
  274. package/skills/integration/integration-react-native/SKILL.md +49 -0
  275. package/skills/integration/integration-react-native/references/EXAMPLE.md +2253 -0
  276. package/skills/integration/integration-react-native/references/amplitude-quickstart.md +1845 -0
  277. package/skills/integration/integration-react-native/references/basic-integration-1.0-begin.md +43 -0
  278. package/skills/integration/integration-react-native/references/basic-integration-1.1-edit.md +35 -0
  279. package/skills/integration/integration-react-native/references/basic-integration-1.2-revise.md +23 -0
  280. package/skills/integration/integration-react-native/references/basic-integration-1.3-conclude.md +57 -0
  281. package/skills/integration/integration-react-native/references/react-native-sdk.md +2819 -0
  282. package/skills/integration/integration-react-react-router-6/SKILL.md +53 -0
  283. package/skills/integration/integration-react-react-router-6/references/EXAMPLE.md +570 -0
  284. package/skills/integration/integration-react-react-router-6/references/amplitude-quickstart.md +1845 -0
  285. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.0-begin.md +43 -0
  286. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.1-edit.md +35 -0
  287. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.2-revise.md +23 -0
  288. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.3-conclude.md +57 -0
  289. package/skills/integration/integration-react-react-router-6/references/browser-sdk-2.md +4680 -0
  290. package/skills/integration/integration-react-react-router-7-data/SKILL.md +53 -0
  291. package/skills/integration/integration-react-react-router-7-data/references/EXAMPLE.md +830 -0
  292. package/skills/integration/integration-react-react-router-7-data/references/amplitude-quickstart.md +1845 -0
  293. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.0-begin.md +43 -0
  294. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.1-edit.md +35 -0
  295. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.2-revise.md +23 -0
  296. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.3-conclude.md +57 -0
  297. package/skills/integration/integration-react-react-router-7-data/references/browser-sdk-2.md +4680 -0
  298. package/skills/integration/integration-react-react-router-7-declarative/SKILL.md +53 -0
  299. package/skills/integration/integration-react-react-router-7-declarative/references/EXAMPLE.md +609 -0
  300. package/skills/integration/integration-react-react-router-7-declarative/references/amplitude-quickstart.md +1845 -0
  301. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.0-begin.md +43 -0
  302. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.1-edit.md +35 -0
  303. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.2-revise.md +23 -0
  304. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.3-conclude.md +57 -0
  305. package/skills/integration/integration-react-react-router-7-declarative/references/browser-sdk-2.md +4680 -0
  306. package/skills/integration/integration-react-react-router-7-framework/SKILL.md +53 -0
  307. package/skills/integration/integration-react-react-router-7-framework/references/EXAMPLE.md +1081 -0
  308. package/skills/integration/integration-react-react-router-7-framework/references/amplitude-quickstart.md +1845 -0
  309. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.0-begin.md +43 -0
  310. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.1-edit.md +35 -0
  311. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.2-revise.md +23 -0
  312. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.3-conclude.md +57 -0
  313. package/skills/integration/integration-react-react-router-7-framework/references/browser-sdk-2.md +4680 -0
  314. package/skills/integration/integration-react-tanstack-router-code-based/SKILL.md +57 -0
  315. package/skills/integration/integration-react-tanstack-router-code-based/references/EXAMPLE.md +659 -0
  316. package/skills/integration/integration-react-tanstack-router-code-based/references/amplitude-quickstart.md +1845 -0
  317. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.0-begin.md +43 -0
  318. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.1-edit.md +35 -0
  319. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.2-revise.md +23 -0
  320. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.3-conclude.md +57 -0
  321. package/skills/integration/integration-react-tanstack-router-code-based/references/browser-sdk-2.md +4680 -0
  322. package/skills/integration/integration-react-tanstack-router-file-based/SKILL.md +57 -0
  323. package/skills/integration/integration-react-tanstack-router-file-based/references/EXAMPLE.md +777 -0
  324. package/skills/integration/integration-react-tanstack-router-file-based/references/amplitude-quickstart.md +1845 -0
  325. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.0-begin.md +43 -0
  326. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.1-edit.md +35 -0
  327. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.2-revise.md +23 -0
  328. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.3-conclude.md +57 -0
  329. package/skills/integration/integration-react-tanstack-router-file-based/references/browser-sdk-2.md +4680 -0
  330. package/skills/integration/integration-react-vite/SKILL.md +53 -0
  331. package/skills/integration/integration-react-vite/references/EXAMPLE.md +542 -0
  332. package/skills/integration/integration-react-vite/references/amplitude-quickstart.md +1845 -0
  333. package/skills/integration/integration-react-vite/references/basic-integration-1.0-begin.md +43 -0
  334. package/skills/integration/integration-react-vite/references/basic-integration-1.1-edit.md +35 -0
  335. package/skills/integration/integration-react-vite/references/basic-integration-1.2-revise.md +23 -0
  336. package/skills/integration/integration-react-vite/references/basic-integration-1.3-conclude.md +57 -0
  337. package/skills/integration/integration-react-vite/references/browser-sdk-2.md +4680 -0
  338. package/skills/integration/integration-ruby/SKILL.md +50 -0
  339. package/skills/integration/integration-ruby/references/EXAMPLE.md +420 -0
  340. package/skills/integration/integration-ruby/references/amplitude-quickstart.md +1845 -0
  341. package/skills/integration/integration-ruby/references/analytics.md +1778 -0
  342. package/skills/integration/integration-ruby/references/basic-integration-1.0-begin.md +43 -0
  343. package/skills/integration/integration-ruby/references/basic-integration-1.1-edit.md +35 -0
  344. package/skills/integration/integration-ruby/references/basic-integration-1.2-revise.md +23 -0
  345. package/skills/integration/integration-ruby/references/basic-integration-1.3-conclude.md +57 -0
  346. package/skills/integration/integration-ruby-on-rails/SKILL.md +55 -0
  347. package/skills/integration/integration-ruby-on-rails/references/EXAMPLE.md +1013 -0
  348. package/skills/integration/integration-ruby-on-rails/references/amplitude-quickstart.md +1845 -0
  349. package/skills/integration/integration-ruby-on-rails/references/analytics.md +1778 -0
  350. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.0-begin.md +43 -0
  351. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.1-edit.md +35 -0
  352. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.2-revise.md +23 -0
  353. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.3-conclude.md +57 -0
  354. package/skills/integration/integration-sveltekit/SKILL.md +47 -0
  355. package/skills/integration/integration-sveltekit/references/EXAMPLE.md +14121 -0
  356. package/skills/integration/integration-sveltekit/references/amplitude-quickstart.md +1845 -0
  357. package/skills/integration/integration-sveltekit/references/basic-integration-1.0-begin.md +43 -0
  358. package/skills/integration/integration-sveltekit/references/basic-integration-1.1-edit.md +35 -0
  359. package/skills/integration/integration-sveltekit/references/basic-integration-1.2-revise.md +23 -0
  360. package/skills/integration/integration-sveltekit/references/basic-integration-1.3-conclude.md +57 -0
  361. package/skills/integration/integration-sveltekit/references/browser-sdk-2.md +4680 -0
  362. package/skills/integration/integration-swift/SKILL.md +49 -0
  363. package/skills/integration/integration-swift/references/EXAMPLE.md +660 -0
  364. package/skills/integration/integration-swift/references/amplitude-quickstart.md +1845 -0
  365. package/skills/integration/integration-swift/references/analytics.md +1778 -0
  366. package/skills/integration/integration-swift/references/basic-integration-1.0-begin.md +43 -0
  367. package/skills/integration/integration-swift/references/basic-integration-1.1-edit.md +35 -0
  368. package/skills/integration/integration-swift/references/basic-integration-1.2-revise.md +23 -0
  369. package/skills/integration/integration-swift/references/basic-integration-1.3-conclude.md +57 -0
  370. package/skills/integration/integration-tanstack-start/SKILL.md +58 -0
  371. package/skills/integration/integration-tanstack-start/references/EXAMPLE.md +998 -0
  372. package/skills/integration/integration-tanstack-start/references/amplitude-quickstart.md +1845 -0
  373. package/skills/integration/integration-tanstack-start/references/basic-integration-1.0-begin.md +43 -0
  374. package/skills/integration/integration-tanstack-start/references/basic-integration-1.1-edit.md +35 -0
  375. package/skills/integration/integration-tanstack-start/references/basic-integration-1.2-revise.md +23 -0
  376. package/skills/integration/integration-tanstack-start/references/basic-integration-1.3-conclude.md +57 -0
  377. package/skills/integration/integration-tanstack-start/references/browser-sdk-2.md +4680 -0
  378. package/skills/integration/integration-vue-3/SKILL.md +46 -0
  379. package/skills/integration/integration-vue-3/references/EXAMPLE.md +846 -0
  380. package/skills/integration/integration-vue-3/references/amplitude-quickstart.md +1845 -0
  381. package/skills/integration/integration-vue-3/references/basic-integration-1.0-begin.md +43 -0
  382. package/skills/integration/integration-vue-3/references/basic-integration-1.1-edit.md +35 -0
  383. package/skills/integration/integration-vue-3/references/basic-integration-1.2-revise.md +23 -0
  384. package/skills/integration/integration-vue-3/references/basic-integration-1.3-conclude.md +57 -0
  385. package/skills/integration/integration-vue-3/references/browser-sdk-2.md +4680 -0
  386. package/skills/taxonomy/amplitude-quickstart-taxonomy-agent/SKILL.md +228 -0
  387. package/dist/src/ui/tui/components/TitleBar.d.ts +0 -8
  388. package/dist/src/ui/tui/components/TitleBar.js +0 -27
  389. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.d.ts +0 -7
  390. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.js +0 -101
  391. package/dist/src/utils/anthropic-status.d.ts +0 -17
  392. package/dist/src/utils/anthropic-status.js +0 -51
@@ -0,0 +1,1013 @@
1
+ # Amplitude Ruby on Rails Example Project
2
+
3
+ Repository: https://github.com/amplitude/context-hub
4
+ Path: basics/ruby-on-rails
5
+
6
+ ---
7
+
8
+ ## README.md
9
+
10
+ # Amplitude Ruby on Rails example
11
+
12
+ This is a [Ruby on Rails](https://rubyonrails.org) example demonstrating Amplitude integration with product analytics, user identification, and event tracking via the `amplitude-analytics` gem.
13
+
14
+ ## Features
15
+
16
+ - **Product analytics**: Track user events and behaviors with `amplitude_track`
17
+ - **User identification**: Associate events with authenticated users via `amplitude.identify`
18
+ - **Frontend tracking**: Amplitude Browser SDK captures pageviews alongside backend events
19
+
20
+ ## Getting started
21
+
22
+ ### 1. Install dependencies
23
+
24
+ ```bash
25
+ bundle install
26
+ ```
27
+
28
+ ### 2. Configure environment variables
29
+
30
+ ```bash
31
+ cp .env.example .env
32
+ # Edit .env and add your Amplitude API key
33
+ ```
34
+
35
+ Get your Amplitude API key from your [Amplitude project settings](https://app.amplitude.com).
36
+
37
+ ### 3. Setup database
38
+
39
+ ```bash
40
+ bin/rails db:create db:migrate db:seed
41
+ ```
42
+
43
+ ### 4. Run the development server
44
+
45
+ ```bash
46
+ bin/rails server
47
+ ```
48
+
49
+ Open [http://localhost:3000](http://localhost:3000) with your browser. Login with `admin@example.com` / `admin`.
50
+
51
+ ## Project structure
52
+
53
+ ```
54
+ ruby-on-rails/
55
+ ├── config/
56
+ │ ├── routes.rb # URL routing
57
+ │ └── initializers/
58
+ │ └── amplitude.rb # Amplitude configuration
59
+ ├── app/
60
+ │ ├── controllers/
61
+ │ │ ├── application_controller.rb # Base controller with amplitude helpers
62
+ │ │ ├── sessions_controller.rb # Login/logout with Amplitude identify
63
+ │ │ ├── registrations_controller.rb # Signup with Amplitude identify
64
+ │ │ ├── dashboard_controller.rb # Dashboard with event tracking
65
+ │ │ ├── burritos_controller.rb # Custom event tracking
66
+ │ │ └── profiles_controller.rb # Page view tracking
67
+ │ ├── models/
68
+ │ │ └── user.rb # amplitude_user_id + amplitude_user_properties
69
+ │ └── views/
70
+ │ ├── layouts/application.html.erb # Base layout with Amplitude Browser SDK
71
+ │ ├── sessions/new.html.erb # Login page
72
+ │ ├── registrations/new.html.erb # Signup page
73
+ │ ├── dashboard/show.html.erb # Dashboard
74
+ │ ├── burritos/show.html.erb # Event tracking demo
75
+ │ └── profiles/show.html.erb # User profile page
76
+ ├── db/
77
+ │ ├── migrate/ # Database migrations
78
+ │ └── seeds.rb # Default admin user
79
+ ├── .env.example # Environment variable template
80
+ ├── Gemfile # Ruby dependencies
81
+ └── README.md # This file
82
+ ```
83
+
84
+ ## Key integration points
85
+
86
+ ### Amplitude initialization (config/initializers/amplitude.rb)
87
+
88
+ ```ruby
89
+ require 'amplitude-analytics'
90
+
91
+ amplitude = Amplitude::Client.instance
92
+ amplitude.api_key = ENV.fetch('AMPLITUDE_API_KEY', nil)
93
+ ```
94
+
95
+ ### User model (app/models/user.rb)
96
+
97
+ ```ruby
98
+ class User < ApplicationRecord
99
+ has_secure_password
100
+
101
+ def amplitude_user_id
102
+ email
103
+ end
104
+
105
+ def amplitude_user_properties
106
+ { email: email, is_staff: is_staff, date_joined: created_at&.iso8601 }
107
+ end
108
+ end
109
+ ```
110
+
111
+ ### Base controller helpers (app/controllers/application_controller.rb)
112
+
113
+ ```ruby
114
+ def amplitude_track(event_name, user_id:, properties: {})
115
+ event = Amplitude::BaseEvent.new(
116
+ event_type: event_name,
117
+ user_id: user_id,
118
+ event_properties: properties
119
+ )
120
+ amplitude.track(event)
121
+ end
122
+ ```
123
+
124
+ ### User identification (app/controllers/sessions_controller.rb)
125
+
126
+ ```ruby
127
+ identify_event = Amplitude::IdentifyEvent.new(
128
+ user_id: user.amplitude_user_id,
129
+ user_properties: user.amplitude_user_properties
130
+ )
131
+ amplitude.identify(identify_event)
132
+
133
+ amplitude_track('User Logged In',
134
+ user_id: user.amplitude_user_id,
135
+ properties: { login_method: 'email' }
136
+ )
137
+ ```
138
+
139
+ ### Event tracking (app/controllers/burritos_controller.rb)
140
+
141
+ ```ruby
142
+ amplitude_track('Burrito Considered',
143
+ user_id: user.amplitude_user_id,
144
+ properties: { total_considerations: count }
145
+ )
146
+ ```
147
+
148
+ ## Learn more
149
+
150
+ - [Amplitude Documentation](https://amplitude.com/docs)
151
+ - [Amplitude Ruby SDK](https://amplitude.com/docs/sdks/analytics/ruby)
152
+ - [Ruby on Rails documentation](https://guides.rubyonrails.org/)
153
+
154
+ ---
155
+
156
+ ## .env.example
157
+
158
+ ```example
159
+ # Amplitude Configuration
160
+ AMPLITUDE_API_KEY=your_amplitude_api_key_here
161
+
162
+ ```
163
+
164
+ ---
165
+
166
+ ## app/controllers/application_controller.rb
167
+
168
+ ```rb
169
+ class ApplicationController < ActionController::Base
170
+ protect_from_forgery with: :exception
171
+
172
+ private
173
+
174
+ def current_user
175
+ @current_user ||= User.find_by(id: session[:user_id]) if session[:user_id]
176
+ end
177
+ helper_method :current_user
178
+
179
+ def require_login
180
+ unless current_user
181
+ redirect_to login_path
182
+ end
183
+ end
184
+
185
+ def amplitude
186
+ @amplitude ||= Rails.application.config.amplitude
187
+ end
188
+
189
+ def amplitude_track(event_name, user_id:, properties: {})
190
+ event = Amplitude::BaseEvent.new(
191
+ event_type: event_name,
192
+ user_id: user_id,
193
+ event_properties: properties
194
+ )
195
+ amplitude.track(event)
196
+ end
197
+ end
198
+
199
+ ```
200
+
201
+ ---
202
+
203
+ ## app/controllers/burritos_controller.rb
204
+
205
+ ```rb
206
+ class BurritosController < ApplicationController
207
+ before_action :require_login
208
+
209
+ def show
210
+ @burrito_count = session[:burrito_count] || 0
211
+ end
212
+
213
+ def consider
214
+ count = (session[:burrito_count] || 0) + 1
215
+ session[:burrito_count] = count
216
+
217
+ user = current_user
218
+
219
+ # Amplitude: Track custom event
220
+ amplitude_track('Burrito Considered',
221
+ user_id: user.amplitude_user_id,
222
+ properties: { total_considerations: count }
223
+ )
224
+
225
+ render json: { success: true, count: count }
226
+ end
227
+ end
228
+
229
+ ```
230
+
231
+ ---
232
+
233
+ ## app/controllers/dashboard_controller.rb
234
+
235
+ ```rb
236
+ class DashboardController < ApplicationController
237
+ before_action :require_login
238
+
239
+ def show
240
+ user = current_user
241
+
242
+ # Amplitude: Track dashboard view
243
+ amplitude_track('Dashboard Viewed',
244
+ user_id: user.amplitude_user_id,
245
+ properties: { is_staff: user.is_staff }
246
+ )
247
+
248
+ # TODO: Use Amplitude Experiment for feature flags
249
+ @show_new_feature = false
250
+ end
251
+ end
252
+
253
+ ```
254
+
255
+ ---
256
+
257
+ ## app/controllers/errors_controller.rb
258
+
259
+ ```rb
260
+ class ErrorsController < ApplicationController
261
+ before_action :require_login
262
+
263
+ def test
264
+ render json: { success: true, message: 'Error tracking not available with Amplitude' }
265
+ end
266
+ end
267
+
268
+ ```
269
+
270
+ ---
271
+
272
+ ## app/controllers/profiles_controller.rb
273
+
274
+ ```rb
275
+ class ProfilesController < ApplicationController
276
+ before_action :require_login
277
+
278
+ def show
279
+ # Amplitude: Track profile view
280
+ amplitude_track('Profile Viewed', user_id: current_user.amplitude_user_id)
281
+ end
282
+ end
283
+
284
+ ```
285
+
286
+ ---
287
+
288
+ ## app/controllers/registrations_controller.rb
289
+
290
+ ```rb
291
+ class RegistrationsController < ApplicationController
292
+ def new
293
+ redirect_to dashboard_path if current_user
294
+ end
295
+
296
+ def create
297
+ user = User.new(
298
+ email: params[:email],
299
+ password: params[:password],
300
+ password_confirmation: params[:password_confirmation]
301
+ )
302
+
303
+ if user.save
304
+ session[:user_id] = user.id
305
+
306
+ # Amplitude: Identify the new user and capture signup event
307
+ identify_event = Amplitude::IdentifyEvent.new(
308
+ user_id: user.amplitude_user_id,
309
+ user_properties: user.amplitude_user_properties
310
+ )
311
+ amplitude.identify(identify_event)
312
+
313
+ amplitude_track('User Signed Up',
314
+ user_id: user.amplitude_user_id,
315
+ properties: { signup_method: 'form' }
316
+ )
317
+
318
+ redirect_to dashboard_path
319
+ else
320
+ flash[:error] = user.errors.full_messages.join(', ')
321
+ render :new, status: :unprocessable_entity
322
+ end
323
+ end
324
+ end
325
+
326
+ ```
327
+
328
+ ---
329
+
330
+ ## app/controllers/sessions_controller.rb
331
+
332
+ ```rb
333
+ class SessionsController < ApplicationController
334
+ def new
335
+ redirect_to dashboard_path if current_user
336
+ end
337
+
338
+ def create
339
+ user = User.find_by(email: params[:email])
340
+
341
+ if user&.authenticate(params[:password])
342
+ session[:user_id] = user.id
343
+
344
+ # Amplitude: Identify the user and capture login event
345
+ identify_event = Amplitude::IdentifyEvent.new(
346
+ user_id: user.amplitude_user_id,
347
+ user_properties: user.amplitude_user_properties
348
+ )
349
+ amplitude.identify(identify_event)
350
+
351
+ amplitude_track('User Logged In',
352
+ user_id: user.amplitude_user_id,
353
+ properties: { login_method: 'email' }
354
+ )
355
+
356
+ redirect_to dashboard_path
357
+ else
358
+ flash[:error] = 'Invalid email or password'
359
+ render :new, status: :unprocessable_entity
360
+ end
361
+ end
362
+
363
+ def destroy
364
+ if current_user
365
+ # Amplitude: Track logout before session ends
366
+ amplitude_track('User Logged Out', user_id: current_user.amplitude_user_id)
367
+ end
368
+
369
+ session.delete(:user_id)
370
+ redirect_to login_path
371
+ end
372
+ end
373
+
374
+ ```
375
+
376
+ ---
377
+
378
+ ## app/jobs/application_job.rb
379
+
380
+ ```rb
381
+ class ApplicationJob < ActiveJob::Base
382
+ end
383
+
384
+ ```
385
+
386
+ ---
387
+
388
+ ## app/jobs/example_job.rb
389
+
390
+ ```rb
391
+ class ExampleJob < ApplicationJob
392
+ queue_as :default
393
+
394
+ def perform(user_id, should_fail: false)
395
+ if should_fail
396
+ raise StandardError, 'Example job failure'
397
+ end
398
+
399
+ Rails.logger.info "ExampleJob completed successfully for #{user_id}"
400
+ end
401
+ end
402
+
403
+ ```
404
+
405
+ ---
406
+
407
+ ## app/models/application_record.rb
408
+
409
+ ```rb
410
+ class ApplicationRecord < ActiveRecord::Base
411
+ primary_abstract_class
412
+ end
413
+
414
+ ```
415
+
416
+ ---
417
+
418
+ ## app/models/user.rb
419
+
420
+ ```rb
421
+ class User < ApplicationRecord
422
+ has_secure_password
423
+
424
+ validates :email, presence: true, uniqueness: true
425
+
426
+ # Helper used by controllers when calling Amplitude to set the user ID.
427
+ def amplitude_user_id
428
+ email
429
+ end
430
+
431
+ # Helper used by controllers when calling Amplitude.identify to set user properties.
432
+ def amplitude_user_properties
433
+ {
434
+ email: email,
435
+ is_staff: is_staff,
436
+ date_joined: created_at&.iso8601
437
+ }
438
+ end
439
+ end
440
+
441
+ ```
442
+
443
+ ---
444
+
445
+ ## app/views/burritos/show.html.erb
446
+
447
+ ```erb
448
+ <% content_for(:title) { 'Burrito - Amplitude Rails example' } %>
449
+
450
+ <div class="card">
451
+ <h1>Burrito consideration tracker</h1>
452
+ <p>This page demonstrates custom event tracking with Amplitude.</p>
453
+ </div>
454
+
455
+ <div class="card" style="text-align: center;">
456
+ <h2>Times considered</h2>
457
+ <div class="count" id="burrito-count"><%= @burrito_count %></div>
458
+ <button onclick="considerBurrito()" style="font-size: 18px; padding: 15px 30px;">
459
+ Consider a burrito
460
+ </button>
461
+ </div>
462
+
463
+ <div class="card">
464
+ <h3>How event tracking works</h3>
465
+ <p>Each time you click the button, a <code>Burrito Considered</code> event is sent to Amplitude:</p>
466
+ <pre style="background: #f3f4f6; padding: 15px; border-radius: 5px; overflow-x: auto; margin-top: 15px;"><code>amplitude.track(Amplitude::BaseEvent.new(
467
+ event_type: 'Burrito Considered',
468
+ user_id: user.amplitude_user_id,
469
+ event_properties: { total_considerations: count }
470
+ ))</code></pre>
471
+ </div>
472
+
473
+ <% content_for :scripts do %>
474
+ <script>
475
+ async function considerBurrito() {
476
+ try {
477
+ const response = await fetch('/api/burrito/consider', {
478
+ method: 'POST',
479
+ headers: {
480
+ 'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').content,
481
+ 'Content-Type': 'application/json',
482
+ },
483
+ });
484
+
485
+ const data = await response.json();
486
+
487
+ if (data.success) {
488
+ document.getElementById('burrito-count').textContent = data.count;
489
+ }
490
+ } catch (error) {
491
+ console.error('Error:', error);
492
+ }
493
+ }
494
+ </script>
495
+ <% end %>
496
+
497
+ ```
498
+
499
+ ---
500
+
501
+ ## app/views/dashboard/show.html.erb
502
+
503
+ ```erb
504
+ <% content_for(:title) { 'Dashboard - Amplitude Rails example' } %>
505
+
506
+ <div class="card">
507
+ <h1>Dashboard</h1>
508
+ <p>Welcome back, <strong><%= current_user.email %></strong>!</p>
509
+ </div>
510
+
511
+ <div class="card">
512
+ <h2>Feature flags</h2>
513
+ <p>Feature flags allow you to control feature rollouts and run A/B tests.</p>
514
+
515
+ <div style="background: #f3f4f6; padding: 15px; border-radius: 8px; margin-top: 15px;">
516
+ <p>
517
+ <!-- TODO: Use Amplitude Experiment for feature flags -->
518
+ Feature flags are available via <a href="https://www.docs.developers.amplitude.com/experiment/" target="_blank">Amplitude Experiment</a>.
519
+ </p>
520
+ </div>
521
+ </div>
522
+
523
+ ```
524
+
525
+ ---
526
+
527
+ ## app/views/layouts/application.html.erb
528
+
529
+ ```erb
530
+ <!DOCTYPE html>
531
+ <html lang="en">
532
+ <head>
533
+ <meta charset="UTF-8">
534
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
535
+ <title><%= content_for?(:title) ? yield(:title) : 'Amplitude Rails example' %></title>
536
+ <%= csrf_meta_tags %>
537
+ <style>
538
+ * {
539
+ box-sizing: border-box;
540
+ margin: 0;
541
+ padding: 0;
542
+ }
543
+ body {
544
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
545
+ line-height: 1.6;
546
+ background-color: #f5f5f5;
547
+ color: #333;
548
+ }
549
+ .container {
550
+ max-width: 800px;
551
+ margin: 0 auto;
552
+ padding: 20px;
553
+ }
554
+ nav {
555
+ background: #1d4ed8;
556
+ padding: 15px 20px;
557
+ margin-bottom: 30px;
558
+ }
559
+ nav a {
560
+ color: white;
561
+ text-decoration: none;
562
+ margin-right: 20px;
563
+ }
564
+ nav a:hover {
565
+ text-decoration: underline;
566
+ }
567
+ .card {
568
+ background: white;
569
+ border-radius: 8px;
570
+ padding: 20px;
571
+ margin-bottom: 20px;
572
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
573
+ }
574
+ h1, h2, h3 {
575
+ margin-bottom: 15px;
576
+ color: #1d4ed8;
577
+ }
578
+ button, .btn {
579
+ background: #1d4ed8;
580
+ color: white;
581
+ border: none;
582
+ padding: 10px 20px;
583
+ border-radius: 5px;
584
+ cursor: pointer;
585
+ font-size: 14px;
586
+ display: inline-block;
587
+ text-decoration: none;
588
+ }
589
+ button:hover, .btn:hover {
590
+ background: #1e40af;
591
+ }
592
+ button.danger {
593
+ background: #dc2626;
594
+ }
595
+ button.danger:hover {
596
+ background: #b91c1c;
597
+ }
598
+ input {
599
+ width: 100%;
600
+ padding: 10px;
601
+ margin-bottom: 15px;
602
+ border: 1px solid #ddd;
603
+ border-radius: 5px;
604
+ font-size: 14px;
605
+ }
606
+ .flash {
607
+ padding: 10px 15px;
608
+ border-radius: 5px;
609
+ margin-bottom: 20px;
610
+ }
611
+ .flash.error {
612
+ background: #fee2e2;
613
+ color: #dc2626;
614
+ }
615
+ .flash.success {
616
+ background: #d1fae5;
617
+ color: #059669;
618
+ }
619
+ .feature-flag {
620
+ background: #fef3c7;
621
+ border: 2px dashed #f59e0b;
622
+ padding: 15px;
623
+ border-radius: 8px;
624
+ margin: 20px 0;
625
+ }
626
+ code {
627
+ background: #f3f4f6;
628
+ padding: 2px 6px;
629
+ border-radius: 3px;
630
+ font-family: monospace;
631
+ }
632
+ .count {
633
+ font-size: 48px;
634
+ font-weight: bold;
635
+ color: #1d4ed8;
636
+ text-align: center;
637
+ padding: 20px;
638
+ }
639
+ </style>
640
+
641
+ <!-- Amplitude frontend tracking -->
642
+ <script type="text/javascript">
643
+ !function(){"use strict";!function(e,t){var r=e.amplitude||{_q:[],_iq:{}};if(r.invoked)e.console&&console.error&&console.error("Amplitude snippet has been loaded.");else{r.invoked=!0;var n=t.createElement("script");n.type="text/javascript";n.integrity="sha384-x0ik2D45ZDEEEpYpEuDpmj05fY91P7hkm2LP+uH0/kA8R0mds/cYnMkEZquh9Kd";n.crossOrigin="anonymous";n.async=!0;n.src="https://cdn.amplitude.com/libs/analytics-browser-2.11.1-min.js.gz";n.onload=function(){e.amplitude.runQueuedFunctions||console.log("[Amplitude] Error: could not load SDK")};var s=t.getElementsByTagName("script")[0];function v(e,t){e.prototype[t]=function(){return this._q.push({name:t,args:Array.prototype.slice.call(arguments,0)}),this}}s.parentNode.insertBefore(n,s);for(var o=function(){return this._q=[],this},i=["add","append","clearAll","prepend","set","setOnce","unset","preInsert","postInsert","remove","getUserProperties"],a=0;a<i.length;a++)v(o,i[a]);r.Identify=o;for(var c=function(){return this._q=[],this},l=["getEventProperties","setProductId","setQuantity","setPrice","setRevenue","setRevenueType","setEventProperties"],u=0;u<l.length;u++)v(c,l[u]);r.Revenue=c;var p=["getDeviceId","setDeviceId","getSessionId","setSessionId","getUserId","setUserId","setOptOut","setTransport","reset","extendSession"],d=["init","add","remove","track","logEvent","identify","groupIdentify","setGroup","revenue","flush"];function f(e){function t(t,r){e[t]=function(){var n={promise:new Promise((r=>{e._q.push({name:t,args:Array.prototype.slice.call(arguments,0),resolve:r})}))};if(r)for(var s=0;s<r.length;s++)n[r[s]]=n.promise[r[s]].bind(n.promise);return n}}for(var r=0;r<p.length;r++)e[p[r]]=function(){return{promise:new Promise((t=>{e._q.push({name:p[r],args:Array.prototype.slice.call(arguments,0),resolve:t})}))};};for(var n=0;n<d.length;n++)t(d[n],["then","catch","finally"])}f(r),f(r.Identify.prototype),f(r.Revenue.prototype),e.amplitude=r}}(window,document)}();
644
+ amplitude.init('<%= ENV["AMPLITUDE_API_KEY"] %>');
645
+ </script>
646
+ </head>
647
+ <body>
648
+ <% if current_user %>
649
+ <nav style="display: flex; align-items: center;">
650
+ <a href="<%= dashboard_path %>">Dashboard</a>
651
+ <a href="<%= burrito_path %>">Burrito</a>
652
+ <a href="<%= profile_path %>">Profile</a>
653
+ <%= button_to 'Logout (' + current_user.email + ')', logout_path, method: :delete, form: { style: 'margin-left: auto;' }, style: 'background: transparent; border: none; color: white; cursor: pointer; font-size: inherit; padding: 0;' %>
654
+ </nav>
655
+ <% end %>
656
+
657
+ <div class="container">
658
+ <% if flash[:error] %>
659
+ <div class="flash error"><%= flash[:error] %></div>
660
+ <% end %>
661
+ <% if flash[:notice] %>
662
+ <div class="flash success"><%= flash[:notice] %></div>
663
+ <% end %>
664
+
665
+ <%= yield %>
666
+ </div>
667
+
668
+ <%= yield :scripts %>
669
+ </body>
670
+ </html>
671
+
672
+ ```
673
+
674
+ ---
675
+
676
+ ## app/views/profiles/show.html.erb
677
+
678
+ ```erb
679
+ <% content_for(:title) { 'Profile - Amplitude Rails example' } %>
680
+
681
+ <div class="card">
682
+ <h1>Profile</h1>
683
+ <p>Your account information.</p>
684
+ </div>
685
+
686
+ <div class="card">
687
+ <h2>User information</h2>
688
+ <table style="width: 100%; border-collapse: collapse;">
689
+ <tr>
690
+ <td style="padding: 10px; border-bottom: 1px solid #eee;"><strong>Email:</strong></td>
691
+ <td style="padding: 10px; border-bottom: 1px solid #eee;"><%= current_user.email %></td>
692
+ </tr>
693
+ <tr>
694
+ <td style="padding: 10px; border-bottom: 1px solid #eee;"><strong>Date Joined:</strong></td>
695
+ <td style="padding: 10px; border-bottom: 1px solid #eee;"><%= current_user.created_at %></td>
696
+ </tr>
697
+ <tr>
698
+ <td style="padding: 10px;"><strong>Staff Status:</strong></td>
699
+ <td style="padding: 10px;"><%= current_user.is_staff ? 'Yes' : 'No' %></td>
700
+ </tr>
701
+ </table>
702
+ </div>
703
+
704
+ ```
705
+
706
+ ---
707
+
708
+ ## app/views/registrations/new.html.erb
709
+
710
+ ```erb
711
+ <% content_for(:title) { 'Sign Up - Amplitude Rails example' } %>
712
+
713
+ <div class="card">
714
+ <h1>Sign Up</h1>
715
+ <p>Create an account to see Amplitude analytics in action.</p>
716
+
717
+ <form action="<%= signup_path %>" method="post" style="margin-top: 20px;">
718
+ <%= hidden_field_tag :authenticity_token, form_authenticity_token %>
719
+ <input type="email" name="email" placeholder="Email" required>
720
+ <input type="password" name="password" placeholder="Password" required>
721
+ <input type="password" name="password_confirmation" placeholder="Confirm Password" required>
722
+ <button type="submit">Sign Up</button>
723
+ </form>
724
+
725
+ <p style="margin-top: 15px; color: #666; font-size: 14px;">
726
+ Already have an account? <a href="<%= login_path %>">Login</a>
727
+ </p>
728
+ </div>
729
+
730
+ ```
731
+
732
+ ---
733
+
734
+ ## app/views/sessions/new.html.erb
735
+
736
+ ```erb
737
+ <% content_for(:title) { 'Login - Amplitude Rails example' } %>
738
+
739
+ <div class="card">
740
+ <h1>Amplitude Rails example</h1>
741
+ <p>Welcome! This example demonstrates Amplitude integration with Ruby on Rails for product analytics and user identification.</p>
742
+ </div>
743
+
744
+ <div class="card">
745
+ <h2>Login</h2>
746
+ <p>Login to see Amplitude analytics in action.</p>
747
+
748
+ <form action="<%= login_path %>" method="post" style="margin-top: 20px;">
749
+ <%= hidden_field_tag :authenticity_token, form_authenticity_token %>
750
+ <input type="email" name="email" placeholder="Email" required>
751
+ <input type="password" name="password" placeholder="Password" required>
752
+ <button type="submit">Login</button>
753
+ </form>
754
+
755
+ <p style="margin-top: 15px; color: #666; font-size: 14px;">
756
+ Don't have an account? <a href="<%= signup_path %>">Sign up</a><br>
757
+ Tip: Run <code>bin/rails db:seed</code> to create admin@example.com / admin
758
+ </p>
759
+ </div>
760
+
761
+ <div class="card">
762
+ <h3>What this example demonstrates</h3>
763
+ <ul style="padding-left: 20px;">
764
+ <li><strong>User identification</strong> — Users are identified with <code>Amplitude::IdentifyEvent</code> on login</li>
765
+ <li><strong>Event tracking</strong> — Custom events captured with <code>amplitude.track</code></li>
766
+ <li><strong>Frontend tracking</strong> — Amplitude Browser SDK captures pageviews alongside backend events</li>
767
+ </ul>
768
+ </div>
769
+
770
+ ```
771
+
772
+ ---
773
+
774
+ ## bin/rails
775
+
776
+ ```
777
+ #!/usr/bin/env ruby
778
+ APP_PATH = File.expand_path('../config/application', __dir__)
779
+ require_relative '../config/boot'
780
+ require 'rails/commands'
781
+
782
+ ```
783
+
784
+ ---
785
+
786
+ ## config.ru
787
+
788
+ ```ru
789
+ require_relative 'config/environment'
790
+ run Rails.application
791
+
792
+ ```
793
+
794
+ ---
795
+
796
+ ## config/application.rb
797
+
798
+ ```rb
799
+ require_relative 'boot'
800
+ require 'rails/all'
801
+
802
+ Bundler.require(*Rails.groups)
803
+
804
+ module AmplitudeExample
805
+ class Application < Rails::Application
806
+ config.load_defaults 7.1
807
+
808
+ # Use SQLite for all stores
809
+ config.active_job.queue_adapter = :async
810
+ end
811
+ end
812
+
813
+ ```
814
+
815
+ ---
816
+
817
+ ## config/boot.rb
818
+
819
+ ```rb
820
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
821
+
822
+ require 'bundler/setup'
823
+
824
+ ```
825
+
826
+ ---
827
+
828
+ ## config/environment.rb
829
+
830
+ ```rb
831
+ require_relative 'application'
832
+ Rails.application.initialize!
833
+
834
+ ```
835
+
836
+ ---
837
+
838
+ ## config/environments/development.rb
839
+
840
+ ```rb
841
+ require 'active_support/core_ext/integer/time'
842
+
843
+ Rails.application.configure do
844
+ config.enable_reloading = true
845
+ config.eager_load = false
846
+ config.consider_all_requests_local = true
847
+ config.server_timing = true
848
+
849
+ # Secret key for development (not used in production)
850
+ config.secret_key_base = 'dev-secret-key-for-amplitude-example-only'
851
+
852
+ config.action_controller.perform_caching = false
853
+ config.cache_store = :memory_store
854
+
855
+ config.active_support.deprecation = :log
856
+ config.active_support.disallowed_deprecation = :raise
857
+ config.active_support.disallowed_deprecation_warnings = []
858
+
859
+ config.active_record.migration_error = :page_load
860
+ config.active_record.verbose_query_logs = true
861
+ end
862
+
863
+ ```
864
+
865
+ ---
866
+
867
+ ## config/initializers/amplitude.rb
868
+
869
+ ```rb
870
+ # Amplitude configuration
871
+ #
872
+ # Initializes the Amplitude client with the API key from environment variables.
873
+ # The client is stored in Rails.application.config.amplitude for use throughout the app.
874
+ require 'amplitude-analytics'
875
+
876
+ api_key = ENV.fetch('AMPLITUDE_API_KEY', nil)
877
+
878
+ if api_key
879
+ Rails.application.config.amplitude = Amplitude::Client.new(api_key)
880
+ end
881
+
882
+
883
+ ```
884
+
885
+ ---
886
+
887
+ ## config/routes.rb
888
+
889
+ ```rb
890
+ Rails.application.routes.draw do
891
+ # Auth
892
+ get 'login', to: 'sessions#new'
893
+ post 'login', to: 'sessions#create'
894
+ delete 'logout', to: 'sessions#destroy'
895
+
896
+ get 'signup', to: 'registrations#new'
897
+ post 'signup', to: 'registrations#create'
898
+
899
+ # App
900
+ get 'dashboard', to: 'dashboard#show'
901
+ get 'burrito', to: 'burritos#show'
902
+ post 'api/burrito/consider', to: 'burritos#consider'
903
+ get 'profile', to: 'profiles#show'
904
+
905
+ # Error tracking demos
906
+ post 'api/test-error', to: 'errors#test'
907
+ post 'api/test-rails-error', to: 'errors#test_rails_error'
908
+
909
+ # Background job demo
910
+ post 'api/test-job', to: 'dashboard#enqueue_test_job'
911
+
912
+ root 'sessions#new'
913
+ end
914
+
915
+ ```
916
+
917
+ ---
918
+
919
+ ## db/migrate/20240101000000_create_users.rb
920
+
921
+ ```rb
922
+ class CreateUsers < ActiveRecord::Migration[7.1]
923
+ def change
924
+ create_table :users do |t|
925
+ t.string :email, null: false
926
+ t.string :password_digest, null: false
927
+ t.boolean :is_staff, default: false
928
+
929
+ t.timestamps
930
+ end
931
+
932
+ add_index :users, :email, unique: true
933
+ end
934
+ end
935
+
936
+ ```
937
+
938
+ ---
939
+
940
+ ## db/schema.rb
941
+
942
+ ```rb
943
+ # This file is auto-generated from the current state of the database. Instead
944
+ # of editing this file, please use the migrations feature of Active Record to
945
+ # incrementally modify your database, and then regenerate this schema definition.
946
+ #
947
+ # This file is the source Rails uses to define your schema when running `bin/rails
948
+ # db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
949
+ # be faster and is potentially less error prone than running all of your
950
+ # migrations from scratch. Old migrations may fail to apply correctly if those
951
+ # migrations use external dependencies or application code.
952
+ #
953
+ # It's strongly recommended that you check this file into your version control system.
954
+
955
+ ActiveRecord::Schema[7.2].define(version: 2024_01_01_000000) do
956
+ create_table "users", force: :cascade do |t|
957
+ t.string "email", null: false
958
+ t.string "password_digest", null: false
959
+ t.boolean "is_staff", default: false
960
+ t.datetime "created_at", null: false
961
+ t.datetime "updated_at", null: false
962
+ t.index ["email"], name: "index_users_on_email", unique: true
963
+ end
964
+ end
965
+
966
+ ```
967
+
968
+ ---
969
+
970
+ ## db/seeds.rb
971
+
972
+ ```rb
973
+ # Create a default admin user for testing
974
+ User.find_or_create_by!(email: 'admin@example.com') do |user|
975
+ user.password = 'admin'
976
+ user.password_confirmation = 'admin'
977
+ user.is_staff = true
978
+ end
979
+
980
+ puts 'Seed data created: admin@example.com / admin'
981
+
982
+ ```
983
+
984
+ ---
985
+
986
+ ## Gemfile
987
+
988
+ ```
989
+ source 'https://rubygems.org'
990
+
991
+ gem 'rails', '~> 7.1'
992
+ gem 'sqlite3', '~> 1.7'
993
+ gem 'puma', '~> 6.0'
994
+ gem 'bcrypt', '~> 3.1'
995
+ gem 'dotenv-rails', '~> 3.0'
996
+
997
+ # Amplitude
998
+ gem 'amplitude-analytics', '~> 1.0'
999
+
1000
+ ```
1001
+
1002
+ ---
1003
+
1004
+ ## Rakefile
1005
+
1006
+ ```
1007
+ require_relative 'config/application'
1008
+ Rails.application.load_tasks
1009
+
1010
+ ```
1011
+
1012
+ ---
1013
+