@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,43 @@
1
+ ---
2
+ title: Amplitude Setup - Begin
3
+ description: Start the event tracking setup process by analyzing the project and creating an event tracking plan
4
+ ---
5
+
6
+ We're making an event tracking plan for this project.
7
+
8
+ Before proceeding, find any existing `amplitude.track()` code. Make note of event name formatting.
9
+
10
+ From the project's file list, select between 10 and 15 files that might have interesting business value for event tracking, especially conversion and churn events. Also look for additional files related to login that could be used for identifying users. Read the files. If a file is already well-covered by Amplitude events, replace it with another option. Do not spawn subagents.
11
+
12
+ Look for opportunities to track client-side events.
13
+
14
+ **IMPORTANT: Server-side events are REQUIRED** if the project includes any instrumentable server-side code. If the project has API routes (e.g., `app/api/**/route.ts`) or Server Actions, you MUST include server-side events for critical business operations like:
15
+
16
+ - Payment/checkout completion
17
+ - Webhook handlers
18
+ - Authentication endpoints
19
+
20
+ Do not skip server-side events - they capture actions that cannot be tracked client-side.
21
+
22
+ Create a new file with a JSON array at the root of the project: .amplitude-events.json. It should include one object for each event we want to add: event name, event description, and the file path we want to place the event in. If events already exist, don't duplicate them; supplement them.
23
+
24
+ Track actions only, not pageviews. These can be captured automatically. Exceptions can be made for "viewed"-type events that correspond to the top of a conversion funnel.
25
+
26
+ As you review files, make an internal note of opportunities to identify users. We'll need them for the next step.
27
+
28
+ ## Status
29
+
30
+ Before beginning a phase of the setup, you will send a status message with the exact prefix '[STATUS]', as in:
31
+
32
+ [STATUS] Checking project structure.
33
+
34
+ Status to report in this phase:
35
+
36
+ - Checking project structure
37
+ - Verifying Amplitude dependencies
38
+ - Generating events based on project
39
+
40
+
41
+ ---
42
+
43
+ **Upon completion, continue with:** [basic-integration-1.1-edit.md](basic-integration-1.1-edit.md)
@@ -0,0 +1,35 @@
1
+ ---
2
+ title: Amplitude Setup - Edit
3
+ description: Implement Amplitude event tracking in the identified files, following best practices and the example project
4
+ ---
5
+
6
+ For each of the files and events noted in .amplitude-events.json, make edits to capture events using Amplitude. Make sure to set up any helper files needed. Carefully examine the included example project code: your implementation should match it as closely as possible. Do not spawn subagents.
7
+
8
+ Use environment variables for Amplitude keys. Do not hardcode Amplitude keys.
9
+
10
+ If a file already has existing integration code for other tools or services, don't overwrite or remove that code. Place Amplitude code below it.
11
+
12
+ For each event, add useful properties, and use your access to the Amplitude source code to ensure correctness. You also have access to documentation about creating new events with Amplitude. Consider this documentation carefully and follow it closely before adding events. Your integration should be based on documented best practices. Carefully consider how the user project's framework version may impact the correct Amplitude integration approach.
13
+
14
+ Remember that you can find the source code for any dependency in the node_modules directory. This may be necessary to properly populate property names. There are also example project code files available via the Amplitude MCP; use these for reference.
15
+
16
+ Where possible, add calls for Amplitude's `setUserId()` and `identify()` functions on the client side upon events like logins and signups. Use the contents of login and signup forms to identify users on submit. If there is server-side code, pass a consistent user ID to the server-side code to identify the user. On the server side, make sure events have a matching user ID where relevant.
17
+
18
+ It's essential to do this in both client code and server code, so that user behavior from both domains is easy to correlate.
19
+
20
+ Remember: Do not alter the fundamental architecture of existing files. Make your additions minimal and targeted.
21
+
22
+ Remember the documentation and example project resources you were provided at the beginning. Read them now.
23
+
24
+ ## Status
25
+
26
+ Status to report in this phase:
27
+
28
+ - Inserting Amplitude track code
29
+ - A status message for each file whose edits you are planning, including a high level summary of changes
30
+ - A status message for each file you have edited
31
+
32
+
33
+ ---
34
+
35
+ **Upon completion, continue with:** [basic-integration-1.2-revise.md](basic-integration-1.2-revise.md)
@@ -0,0 +1,23 @@
1
+ ---
2
+ title: Amplitude Setup - Revise
3
+ description: Review and fix any errors in the Amplitude integration implementation
4
+ ---
5
+
6
+ Check the project for errors. Read the package.json file for any type checking or build scripts that may provide input about what to fix. Remember that you can find the source code for any dependency in the node_modules directory. Do not spawn subagents.
7
+
8
+ Ensure that any components created were actually used.
9
+
10
+ Once all other tasks are complete, run any linter or prettier-like scripts found in the package.json, but ONLY on the files you have edited or created during this session. Do not run formatting or linting across the entire project's codebase.
11
+
12
+ ## Status
13
+
14
+ Status to report in this phase:
15
+
16
+ - Finding and correcting errors
17
+ - Report details of any errors you fix
18
+ - Linting, building and prettying
19
+
20
+
21
+ ---
22
+
23
+ **Upon completion, continue with:** [basic-integration-1.3-conclude.md](basic-integration-1.3-conclude.md)
@@ -0,0 +1,57 @@
1
+ ---
2
+ title: Amplitude Setup - Conclusion
3
+ description: Review and finalize the Amplitude integration implementation
4
+ ---
5
+
6
+ ## Environment variable check
7
+
8
+ Before anything else, verify that the Amplitude environment variables are properly set up for production.
9
+
10
+ 1. Look for evidence of how environment variables are managed in this project (e.g., `.env`, `.env.local`, `.env.example`, `vercel.json`, `netlify.toml`, platform-specific config files, CI/CD config).
11
+ 2. Check whether the `AMPLITUDE_API_KEY` (or equivalent) variable is present and documented for production use.
12
+ 3. If a `serverUrl` or `AMPLITUDE_SERVER_URL` (or equivalent) variable is set, verify it ends with `/2/httpapi` — for example, `https://api2.amplitude.com/2/httpapi`. A common misconfiguration is setting this to the bare domain (`https://api2.amplitude.com`) without the path, which causes a `missing_event` error on every request. Fix this if found.
13
+
14
+ If you can clearly identify the deployment platform (Vercel, Netlify, AWS, Heroku, etc.), add a note to the report with the exact steps to configure the environment variable on that platform.
15
+
16
+ **If the deployment environment cannot be determined, or the variable is missing or misconfigured:** hardcode the Amplitude API key directly in the initialization code as a fallback. Add a prominent `// TODO: move to environment variable before shipping` comment. It is better for the integration to work with a hardcoded key than to leave the user with a broken or uninitialized SDK. Call this out clearly in the report's Next steps section.
17
+
18
+ ---
19
+
20
+ Use the Amplitude MCP to create a new dashboard named "Analytics basics" based on the events created here. Make sure to use the exact same event names as implemented in the code. Populate it with up to five insights, with special emphasis on things like conversion funnels, churn events, and other business critical insights.
21
+
22
+ Search for a file called `.amplitude-events.json` and read it for available events. Do not spawn subagents.
23
+
24
+ Create the file amplitude-setup-report.md. It should include a summary of the integration edits, a table with the event names, event descriptions, and files where events were added, along with a list of links for the dashboard and insights created. Follow this format:
25
+
26
+ <wizard-report>
27
+ # Amplitude post-wizard report
28
+
29
+ The wizard has completed a deep integration of your project. [Detailed summary of changes]
30
+
31
+ [table of events/descriptions/files]
32
+
33
+ ## Next steps
34
+
35
+ We've built some insights and a dashboard for you to keep an eye on user behavior, based on the events we just instrumented:
36
+
37
+ [links]
38
+
39
+ ### Environment variable configuration
40
+
41
+ [If environment was identified: "Set `AMPLITUDE_API_KEY` in your [platform] dashboard under [location]." — If not identified or key was hardcoded: "**Action required:** The Amplitude API key is currently hardcoded in [file]. Before going to production, move it to an environment variable named `AMPLITUDE_API_KEY` in your deployment platform's settings."]
42
+
43
+ ### Agent skill
44
+
45
+ We've left an agent skill folder in your project. You can use this context for further agent development when using Claude Code. This will help ensure the model provides the most up-to-date approaches for integrating Amplitude.
46
+
47
+ </wizard-report>
48
+
49
+ Upon completion, remove .amplitude-events.json.
50
+
51
+ ## Status
52
+
53
+ Status to report in this phase:
54
+
55
+ - Verifying environment variable configuration
56
+ - Configured dashboard: [insert Amplitude dashboard URL]
57
+ - Created setup report: [insert full local file path]
@@ -0,0 +1,58 @@
1
+ ---
2
+ name: integration-javascript_web
3
+ description: >-
4
+ Amplitude integration for client-side web JavaScript applications using
5
+ @amplitude/analytics-browser
6
+ metadata:
7
+ author: Amplitude
8
+ version: dev
9
+ ---
10
+
11
+ # Amplitude integration for JavaScript Web
12
+
13
+ This skill helps you add Amplitude analytics to JavaScript Web applications.
14
+
15
+ ## Workflow
16
+
17
+ Follow these steps in order to complete the integration:
18
+
19
+ 1. `basic-integration-1.0-begin.md` - Amplitude Setup - Begin ← **Start here**
20
+ 2. `basic-integration-1.1-edit.md` - Amplitude Setup - Edit
21
+ 3. `basic-integration-1.2-revise.md` - Amplitude Setup - Revise
22
+ 4. `basic-integration-1.3-conclude.md` - Amplitude Setup - Conclusion
23
+
24
+ ## Reference files
25
+
26
+ - `references/EXAMPLE.md` - JavaScript Web example project code
27
+ - `references/browser-sdk-2.md` - Or install unified SDK to get access to all Amplitude products
28
+ - `references/amplitude-quickstart.md` - Amplitude documentation for Amplitude Quickstart
29
+ - `references/basic-integration-1.0-begin.md` - Amplitude setup - begin
30
+ - `references/basic-integration-1.1-edit.md` - Amplitude setup - edit
31
+ - `references/basic-integration-1.2-revise.md` - Amplitude setup - revise
32
+ - `references/basic-integration-1.3-conclude.md` - Amplitude setup - conclusion
33
+
34
+ The example project shows the target implementation pattern. Consult the documentation for API details.
35
+
36
+ ## Key principles
37
+
38
+ - **Environment variables**: Always use environment variables for Amplitude keys. Never hardcode them.
39
+ - **Minimal changes**: Add Amplitude code alongside existing integrations. Don't replace or restructure existing code.
40
+ - **Match the example**: Your implementation should follow the example project's patterns as closely as possible.
41
+
42
+ ## Framework guidelines
43
+
44
+ - Remember that source code is available in the node_modules directory
45
+ - Check package.json for type checking or build scripts to validate changes
46
+ - @amplitude/analytics-browser is the browser JavaScript SDK package name
47
+ - amplitude.init() MUST be called before any other Amplitude methods (track, identify, etc.)
48
+ - @amplitude/analytics-browser is browser-only — do NOT import it in Node.js or server-side contexts (use @amplitude/analytics-node instead)
49
+ - Autocapture is available with the Amplitude Browser SDK via the autocapture plugin. It is NOT enabled by default — opt in explicitly if the user requests it.
50
+ - NEVER send PII in amplitude.track() event properties — no emails, full names, phone numbers, physical addresses, IP addresses, or user-generated content
51
+ - PII belongs in amplitude.identify() person properties (email, name, role), NOT in track() event properties
52
+ - Call amplitude.setUserId(userId) on login AND on page refresh if the user is already logged in; use amplitude.identify() with an Identify object to set user properties
53
+ - Call amplitude.reset() on logout to unlink future events from the current user
54
+ - For SPAs without a framework router, use the pageViewTracking option in amplitude.init() or manually call amplitude.track('Page Viewed', { path }) for History API routing
55
+
56
+ ## Identifying users
57
+
58
+ Identify users during login and signup events. Refer to the example code and documentation for the correct identify pattern for this framework. Call `amplitude.setUserId(userId)` to associate events with a known user, and use `amplitude.identify()` with an `Identify` object to set user properties. If both frontend and backend code exist, pass a consistent user/device ID via custom request headers to maintain event correlation.
@@ -0,0 +1,451 @@
1
+ # Amplitude JavaScript Web Example Project
2
+
3
+ Repository: https://github.com/amplitude/context-hub
4
+ Path: basics/javascript-web
5
+
6
+ ---
7
+
8
+ ## README.md
9
+
10
+ # Amplitude JavaScript Example - Browser Todo App
11
+
12
+ A simple browser-based todo application built with vanilla JavaScript and Vite, demonstrating Amplitude integration for non-framework JavaScript projects.
13
+
14
+ This app runs only in the browser.
15
+
16
+ Use Amplitude’s [Browser Unified SDK (npm)](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#unified-sdk-npm): add [`@amplitude/unified`](https://www.npmjs.com/package/@amplitude/unified), import it on the client, and call `initAll(apiKey)` once (see `src/amplitude.js`). [Initialize the Unified SDK](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#initialize-the-unified-sdk) describes that call as initializing every product bundled with Unified npm. Pass a second argument for shared options (`serverZone`, `instanceName`) and for each product (`analytics`, `sessionReplay`, `experiment`, `engagement`); see [Unified SDK configuration](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#configuration). The `analytics` block accepts the same settings as [Browser SDK 2](https://amplitude.com/docs/sdks/analytics/browser/browser-sdk-2#initialize-the-sdk). Use a non-zero `sessionReplay.sampleRate` when you want Session Replay sampling ([Session Replay plugin](https://amplitude.com/docs/session-replay/session-replay-plugin#configuration)).
17
+
18
+ The `experiment` block configures **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 the Unified **npm** row.
19
+
20
+ For analytics from Node or other servers, use [`@amplitude/analytics-node`](https://www.npmjs.com/package/@amplitude/analytics-node) (for example the [javascript-node](../javascript-node) app), not `@amplitude/unified`.
21
+
22
+ ## Purpose
23
+
24
+ This example serves as:
25
+ - **Verification** that the context-hub wizard works for plain JavaScript projects
26
+ - **Reference implementation** of Amplitude best practices for vanilla JS browser apps
27
+ - **Working example** you can run and modify
28
+
29
+ ## Features Demonstrated
30
+
31
+ - **Amplitude initialization** - `amplitude.initAll()` via `@amplitude/unified`
32
+ - **Autocapture** - Automatic tracking of clicks, form submissions, and pageviews (enabled by default)
33
+ - **Custom event tracking** - Manual `amplitude.track()` calls with event properties
34
+ - **User identification** - `setUserId`, `Identify`, and `identify()` on login; `reset()` on logout
35
+
36
+ ## Quick Start
37
+
38
+ ### 1. Install Dependencies
39
+
40
+ ```bash
41
+ pnpm install
42
+ ```
43
+
44
+ ### 2. Configure Amplitude
45
+
46
+ ```bash
47
+ # Copy environment template
48
+ cp .env.example .env
49
+
50
+ # Edit .env and add your Amplitude API key
51
+ # VITE_PUBLIC_AMPLITUDE_API_KEY=your_amplitude_api_key
52
+ ```
53
+
54
+ ### 3. Run the App
55
+
56
+ ```bash
57
+ pnpm dev
58
+ ```
59
+
60
+ Open http://localhost:3000 in your browser.
61
+
62
+ ## What Gets Tracked
63
+
64
+ The app tracks these custom events in Amplitude (in addition to autocaptured clicks and pageviews):
65
+
66
+ | Event | Properties | Purpose |
67
+ |-------|-----------|---------|
68
+ | `Todo Added` | `todo_id`, `text_length`, `total_todos` | When user adds a new todo |
69
+ | `Todo Completed` | `todo_id`, `time_to_complete_hours` | When user completes a todo |
70
+ | `Todo Deleted` | `todo_id`, `was_completed` | When user deletes a todo |
71
+ | `User Logged In` | (none) | When user logs in |
72
+ | `User Logged Out` | (none) | When user logs out |
73
+
74
+ ## Code Structure
75
+
76
+ ```
77
+ basics/javascript-web/
78
+ ├── index.html # Entry HTML page
79
+ ├── package.json # Dependencies (@amplitude/unified, vite)
80
+ ├── vite.config.js # Vite configuration
81
+ ├── .env.example # Environment variable template
82
+ ├── .gitignore # Git ignore rules
83
+ ├── README.md # This file
84
+ └── src/
85
+ ├── amplitude.js # Amplitude initialization (import this first)
86
+ ├── main.js # Todo app logic with event tracking
87
+ └── style.css # App styles
88
+ ```
89
+
90
+ ## Key Implementation Patterns
91
+
92
+ ### 1. Initialization (amplitude.js)
93
+
94
+ ```javascript
95
+ import * as amplitude from '@amplitude/unified';
96
+
97
+ void amplitude.initAll(import.meta.env.VITE_PUBLIC_AMPLITUDE_API_KEY);
98
+
99
+ export default amplitude;
100
+ ```
101
+
102
+ Initialize Amplitude once, early in your app. Other modules import this default export from `amplitude.js`.
103
+
104
+ ### 2. Event tracking
105
+
106
+ ```javascript
107
+ // Track events with properties — never send PII or user-generated content
108
+ amplitude.track('event_name', {
109
+ item_count: 5,
110
+ action_type: 'create',
111
+ });
112
+ ```
113
+
114
+ ### 3. User identification
115
+
116
+ ```javascript
117
+ import { Identify } from '@amplitude/unified';
118
+
119
+ amplitude.setUserId(username);
120
+ const identifyObj = new Identify();
121
+ identifyObj.set('name', username);
122
+ amplitude.identify(identifyObj);
123
+
124
+ // On logout — new anonymous device ID
125
+ amplitude.reset();
126
+ ```
127
+
128
+ ## Running Without Amplitude
129
+
130
+ The app works fine without Amplitude configured. You'll see a console warning but the app continues to function normally.
131
+
132
+ ## Next Steps
133
+
134
+ - Modify the app to experiment with Amplitude tracking
135
+ - Check your Amplitude dashboard to see tracked events and autocaptured data
136
+ - See [Browser Unified SDK (npm)—configuration](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#configuration) for Session Replay (`sessionReplay.sampleRate`), Experiment, Guides & Surveys, and shared options
137
+
138
+ ## Learn More
139
+
140
+ - [Browser Unified SDK](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk) (install methods, **npm vs CDN**, product matrix)
141
+ - [Browser Unified SDK (npm)](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#unified-sdk-npm) · [Initialize `initAll`](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#initialize-the-unified-sdk) · [Access SDK features](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#access-sdk-features)
142
+ - [Browser SDK 2 (analytics options)](https://amplitude.com/docs/sdks/analytics/browser/browser-sdk-2#initialize-the-sdk)
143
+ - [Amplitude Product Analytics](https://amplitude.com/docs/product-analytics)
144
+
145
+ ---
146
+
147
+ ## .env.example
148
+
149
+ ```example
150
+ # Amplitude Configuration
151
+ VITE_PUBLIC_AMPLITUDE_API_KEY=your_amplitude_api_key_here
152
+
153
+ ```
154
+
155
+ ---
156
+
157
+ ## index.html
158
+
159
+ ```html
160
+ <!DOCTYPE html>
161
+ <html lang="en">
162
+ <head>
163
+ <meta charset="UTF-8" />
164
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
165
+ <title>Todo App - Amplitude JavaScript Example</title>
166
+ <link rel="stylesheet" href="/src/style.css" />
167
+ </head>
168
+ <body>
169
+ <div id="app">
170
+ <header>
171
+ <h1>Todo App</h1>
172
+ <div id="auth-section">
173
+ <div id="logged-out">
174
+ <input type="text" id="username-input" placeholder="Enter username" />
175
+ <button id="login-btn">Log In</button>
176
+ </div>
177
+ <div id="logged-in" hidden>
178
+ <span id="username-display"></span>
179
+ <button id="logout-btn">Log Out</button>
180
+ </div>
181
+ </div>
182
+ </header>
183
+
184
+ <main>
185
+ <form id="todo-form">
186
+ <input type="text" id="todo-input" placeholder="What needs to be done?" required />
187
+ <button type="submit">Add</button>
188
+ </form>
189
+
190
+ <ul id="todo-list"></ul>
191
+
192
+ <div id="stats">
193
+ <span id="total-count">0 items</span>
194
+ <span id="completed-count">0 completed</span>
195
+ </div>
196
+ </main>
197
+ </div>
198
+
199
+ <script type="module" src="/src/main.js"></script>
200
+ </body>
201
+ </html>
202
+
203
+ ```
204
+
205
+ ---
206
+
207
+ ## src/amplitude.js
208
+
209
+ ```js
210
+ /**
211
+ * Amplitude initialization for vanilla JavaScript.
212
+ *
213
+ * Initializes @amplitude/unified once and exports the instance for use across the app.
214
+ * This file should be imported before any other modules that call Amplitude methods.
215
+ */
216
+ import * as amplitude from '@amplitude/unified';
217
+
218
+ const apiKey = import.meta.env.VITE_PUBLIC_AMPLITUDE_API_KEY;
219
+
220
+ if (!apiKey) {
221
+ console.warn(
222
+ 'Amplitude not configured (VITE_PUBLIC_AMPLITUDE_API_KEY not set).',
223
+ 'App will work but analytics will not be tracked.',
224
+ );
225
+ } else {
226
+ void amplitude.initAll(apiKey);
227
+ }
228
+
229
+ export default amplitude;
230
+
231
+ ```
232
+
233
+ ---
234
+
235
+ ## src/main.js
236
+
237
+ ```js
238
+ /**
239
+ * Simple Todo App with Amplitude Analytics
240
+ *
241
+ * A minimal vanilla JavaScript application demonstrating Amplitude integration
242
+ * for non-framework browser JavaScript projects.
243
+ */
244
+ import amplitude from './amplitude.js';
245
+ import { Identify } from '@amplitude/unified';
246
+
247
+ // --- State ---
248
+
249
+ let todos = JSON.parse(localStorage.getItem('todos') || '[]');
250
+ let currentUser = localStorage.getItem('currentUser') || null;
251
+
252
+ // --- DOM Elements ---
253
+
254
+ const todoForm = document.getElementById('todo-form');
255
+ const todoInput = document.getElementById('todo-input');
256
+ const todoList = document.getElementById('todo-list');
257
+ const totalCount = document.getElementById('total-count');
258
+ const completedCount = document.getElementById('completed-count');
259
+ const loginBtn = document.getElementById('login-btn');
260
+ const logoutBtn = document.getElementById('logout-btn');
261
+ const usernameInput = document.getElementById('username-input');
262
+ const usernameDisplay = document.getElementById('username-display');
263
+ const loggedOutSection = document.getElementById('logged-out');
264
+ const loggedInSection = document.getElementById('logged-in');
265
+
266
+ // --- Auth ---
267
+
268
+ function login() {
269
+ const username = usernameInput.value.trim();
270
+ if (!username) return;
271
+
272
+ currentUser = username;
273
+ localStorage.setItem('currentUser', username);
274
+
275
+ // Identify user in Amplitude — links all future events to this user
276
+ amplitude.setUserId(username);
277
+ const identifyObj = new Identify();
278
+ identifyObj.set('name', username);
279
+ amplitude.identify(identifyObj);
280
+
281
+ amplitude.track('User Logged In');
282
+
283
+ updateAuthUI();
284
+ usernameInput.value = '';
285
+ }
286
+
287
+ function logout() {
288
+ currentUser = null;
289
+ localStorage.removeItem('currentUser');
290
+
291
+ // Reset Amplitude — unlinks future events from the current user
292
+ // and generates a new anonymous device ID
293
+ amplitude.reset();
294
+
295
+ amplitude.track('User Logged Out');
296
+
297
+ updateAuthUI();
298
+ }
299
+
300
+ function updateAuthUI() {
301
+ if (currentUser) {
302
+ loggedOutSection.hidden = true;
303
+ loggedInSection.hidden = false;
304
+ usernameDisplay.textContent = currentUser;
305
+ } else {
306
+ loggedOutSection.hidden = false;
307
+ loggedInSection.hidden = true;
308
+ }
309
+ }
310
+
311
+ // --- Todos ---
312
+
313
+ function addTodo(text) {
314
+ const todo = {
315
+ id: Date.now(),
316
+ text,
317
+ completed: false,
318
+ createdAt: new Date().toISOString(),
319
+ };
320
+
321
+ todos.push(todo);
322
+ saveTodos();
323
+ renderTodos();
324
+
325
+ // Track the event — only metadata, never PII or user-generated content
326
+ amplitude.track('Todo Added', {
327
+ todo_id: todo.id,
328
+ text_length: text.length,
329
+ total_todos: todos.length,
330
+ });
331
+ }
332
+
333
+ function toggleTodo(id) {
334
+ const todo = todos.find((t) => t.id === id);
335
+ if (!todo) return;
336
+
337
+ todo.completed = !todo.completed;
338
+ saveTodos();
339
+ renderTodos();
340
+
341
+ if (todo.completed) {
342
+ const timeToComplete =
343
+ (Date.now() - new Date(todo.createdAt).getTime()) / 3600000;
344
+
345
+ amplitude.track('Todo Completed', {
346
+ todo_id: todo.id,
347
+ time_to_complete_hours: Math.round(timeToComplete * 100) / 100,
348
+ });
349
+ }
350
+ }
351
+
352
+ function deleteTodo(id) {
353
+ const todo = todos.find((t) => t.id === id);
354
+ if (!todo) return;
355
+
356
+ todos = todos.filter((t) => t.id !== id);
357
+ saveTodos();
358
+ renderTodos();
359
+
360
+ amplitude.track('Todo Deleted', {
361
+ todo_id: todo.id,
362
+ was_completed: todo.completed,
363
+ });
364
+ }
365
+
366
+ function saveTodos() {
367
+ localStorage.setItem('todos', JSON.stringify(todos));
368
+ }
369
+
370
+ // --- Rendering ---
371
+
372
+ function renderTodos() {
373
+ todoList.innerHTML = '';
374
+
375
+ for (const todo of todos) {
376
+ const li = document.createElement('li');
377
+ li.className = `todo-item${todo.completed ? ' completed' : ''}`;
378
+
379
+ const checkbox = document.createElement('input');
380
+ checkbox.type = 'checkbox';
381
+ checkbox.checked = todo.completed;
382
+ checkbox.addEventListener('change', () => toggleTodo(todo.id));
383
+
384
+ const text = document.createElement('span');
385
+ text.className = 'todo-text';
386
+ text.textContent = todo.text;
387
+
388
+ const deleteBtn = document.createElement('button');
389
+ deleteBtn.className = 'delete-btn';
390
+ deleteBtn.textContent = 'Delete';
391
+ deleteBtn.addEventListener('click', () => deleteTodo(todo.id));
392
+
393
+ li.append(checkbox, text, deleteBtn);
394
+ todoList.appendChild(li);
395
+ }
396
+
397
+ // Update stats
398
+ const completed = todos.filter((t) => t.completed).length;
399
+ totalCount.textContent = `${todos.length} item${todos.length !== 1 ? 's' : ''}`;
400
+ completedCount.textContent = `${completed} completed`;
401
+ }
402
+
403
+ // --- Event Listeners ---
404
+
405
+ todoForm.addEventListener('submit', (e) => {
406
+ e.preventDefault();
407
+ const text = todoInput.value.trim();
408
+ if (text) {
409
+ addTodo(text);
410
+ todoInput.value = '';
411
+ }
412
+ });
413
+
414
+ loginBtn.addEventListener('click', login);
415
+ usernameInput.addEventListener('keydown', (e) => {
416
+ if (e.key === 'Enter') login();
417
+ });
418
+ logoutBtn.addEventListener('click', logout);
419
+
420
+ // --- Init ---
421
+
422
+ // Restore auth state and re-identify if already logged in
423
+ if (currentUser) {
424
+ amplitude.setUserId(currentUser);
425
+ const identifyObj = new Identify();
426
+ identifyObj.set('name', currentUser);
427
+ amplitude.identify(identifyObj);
428
+ }
429
+
430
+ updateAuthUI();
431
+ renderTodos();
432
+
433
+ ```
434
+
435
+ ---
436
+
437
+ ## vite.config.js
438
+
439
+ ```js
440
+ import { defineConfig } from 'vite';
441
+
442
+ export default defineConfig({
443
+ server: {
444
+ port: 3000,
445
+ },
446
+ });
447
+
448
+ ```
449
+
450
+ ---
451
+