@amplitude/wizard 1.0.0-beta.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/README.md +171 -74
  2. package/dist/bin.js +338 -222
  3. package/dist/src/lib/agent-interface.js +64 -9
  4. package/dist/src/lib/agent-runner.js +1 -10
  5. package/dist/src/lib/api.d.ts +22 -4
  6. package/dist/src/lib/api.js +114 -12
  7. package/dist/src/lib/commandments.js +14 -1
  8. package/dist/src/lib/constants.d.ts +6 -5
  9. package/dist/src/lib/constants.js +13 -13
  10. package/dist/src/lib/credential-resolution.d.ts +45 -0
  11. package/dist/src/lib/credential-resolution.js +311 -0
  12. package/dist/src/lib/exit-codes.d.ts +10 -0
  13. package/dist/src/lib/exit-codes.js +12 -0
  14. package/dist/src/lib/health-checks/statuspage.d.ts +1 -0
  15. package/dist/src/lib/health-checks/statuspage.js +5 -1
  16. package/dist/src/lib/mode-config.d.ts +14 -0
  17. package/dist/src/lib/mode-config.js +14 -0
  18. package/dist/src/lib/session-checkpoint.d.ts +27 -0
  19. package/dist/src/lib/session-checkpoint.js +134 -0
  20. package/dist/src/lib/wizard-session.d.ts +44 -1
  21. package/dist/src/lib/wizard-session.js +70 -14
  22. package/dist/src/lib/wizard-tools.js +19 -4
  23. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +3 -0
  24. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +6 -0
  25. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +3 -1
  26. package/dist/src/ui/agent-ui.d.ts +91 -0
  27. package/dist/src/ui/agent-ui.js +277 -0
  28. package/dist/src/ui/logging-ui.js +1 -1
  29. package/dist/src/ui/tui/App.d.ts +12 -0
  30. package/dist/src/ui/tui/App.js +29 -18
  31. package/dist/src/ui/tui/components/AmplitudeLogo.js +16 -17
  32. package/dist/src/ui/tui/components/AmplitudeTextLogo.d.ts +0 -2
  33. package/dist/src/ui/tui/components/AmplitudeTextLogo.js +53 -18
  34. package/dist/src/ui/tui/components/BrailleSpinner.d.ts +8 -0
  35. package/dist/src/ui/tui/components/BrailleSpinner.js +15 -0
  36. package/dist/src/ui/tui/components/ConsoleView.d.ts +8 -11
  37. package/dist/src/ui/tui/components/ConsoleView.js +51 -34
  38. package/dist/src/ui/tui/components/HeaderBar.d.ts +12 -0
  39. package/dist/src/ui/tui/components/HeaderBar.js +17 -0
  40. package/dist/src/ui/tui/components/JourneyStepper.d.ts +16 -0
  41. package/dist/src/ui/tui/components/JourneyStepper.js +83 -0
  42. package/dist/src/ui/tui/components/KeyHintBar.d.ts +19 -0
  43. package/dist/src/ui/tui/components/KeyHintBar.js +20 -0
  44. package/dist/src/ui/tui/console-commands.d.ts +1 -2
  45. package/dist/src/ui/tui/console-commands.js +48 -7
  46. package/dist/src/ui/tui/flows.d.ts +1 -1
  47. package/dist/src/ui/tui/flows.js +1 -1
  48. package/dist/src/ui/tui/hooks/useAsyncEffect.d.ts +15 -0
  49. package/dist/src/ui/tui/hooks/useAsyncEffect.js +35 -0
  50. package/dist/src/ui/tui/hooks/useWizardStore.d.ts +9 -0
  51. package/dist/src/ui/tui/hooks/useWizardStore.js +11 -0
  52. package/dist/src/ui/tui/ink-ui.js +1 -1
  53. package/dist/src/ui/tui/primitives/DissolveTransition.js +4 -5
  54. package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +3 -1
  55. package/dist/src/ui/tui/primitives/EventPlanViewer.js +8 -3
  56. package/dist/src/ui/tui/primitives/ProgressList.js +1 -1
  57. package/dist/src/ui/tui/primitives/SlashCommandInput.js +19 -4
  58. package/dist/src/ui/tui/primitives/SplitView.d.ts +2 -1
  59. package/dist/src/ui/tui/primitives/SplitView.js +10 -2
  60. package/dist/src/ui/tui/primitives/TabContainer.js +10 -2
  61. package/dist/src/ui/tui/primitives/index.d.ts +0 -1
  62. package/dist/src/ui/tui/primitives/index.js +0 -1
  63. package/dist/src/ui/tui/router.js +1 -1
  64. package/dist/src/ui/tui/screen-registry.d.ts +0 -7
  65. package/dist/src/ui/tui/screen-registry.js +13 -4
  66. package/dist/src/ui/tui/screens/ActivationOptionsScreen.d.ts +2 -2
  67. package/dist/src/ui/tui/screens/ActivationOptionsScreen.js +8 -8
  68. package/dist/src/ui/tui/screens/AuthScreen.js +57 -27
  69. package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +2 -12
  70. package/dist/src/ui/tui/screens/ChecklistScreen.js +22 -33
  71. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +3 -12
  72. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +109 -39
  73. package/dist/src/ui/tui/screens/DataSetupScreen.d.ts +3 -3
  74. package/dist/src/ui/tui/screens/DataSetupScreen.js +17 -10
  75. package/dist/src/ui/tui/screens/IntroScreen.d.ts +5 -3
  76. package/dist/src/ui/tui/screens/IntroScreen.js +132 -41
  77. package/dist/src/ui/tui/screens/LoginScreen.d.ts +1 -1
  78. package/dist/src/ui/tui/screens/LoginScreen.js +4 -4
  79. package/dist/src/ui/tui/screens/LogoutScreen.d.ts +4 -2
  80. package/dist/src/ui/tui/screens/LogoutScreen.js +17 -5
  81. package/dist/src/ui/tui/screens/McpScreen.d.ts +4 -4
  82. package/dist/src/ui/tui/screens/McpScreen.js +25 -17
  83. package/dist/src/ui/tui/screens/OutageScreen.d.ts +1 -1
  84. package/dist/src/ui/tui/screens/OutageScreen.js +5 -5
  85. package/dist/src/ui/tui/screens/OutroScreen.d.ts +5 -0
  86. package/dist/src/ui/tui/screens/OutroScreen.js +21 -14
  87. package/dist/src/ui/tui/screens/RegionSelectScreen.js +15 -13
  88. package/dist/src/ui/tui/screens/RunScreen.d.ts +7 -5
  89. package/dist/src/ui/tui/screens/RunScreen.js +102 -157
  90. package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +1 -1
  91. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +6 -5
  92. package/dist/src/ui/tui/screens/SetupScreen.d.ts +1 -1
  93. package/dist/src/ui/tui/screens/SetupScreen.js +7 -7
  94. package/dist/src/ui/tui/screens/SlackScreen.d.ts +2 -2
  95. package/dist/src/ui/tui/screens/SlackScreen.js +60 -35
  96. package/dist/src/ui/tui/session-constants.d.ts +41 -0
  97. package/dist/src/ui/tui/session-constants.js +38 -0
  98. package/dist/src/ui/tui/start-tui.d.ts +3 -1
  99. package/dist/src/ui/tui/start-tui.js +14 -10
  100. package/dist/src/ui/tui/store.d.ts +2 -1
  101. package/dist/src/ui/tui/store.js +33 -7
  102. package/dist/src/ui/tui/styles.d.ts +75 -19
  103. package/dist/src/ui/tui/styles.js +101 -19
  104. package/dist/src/ui/tui/utils/classify-error.d.ts +14 -0
  105. package/dist/src/ui/tui/utils/classify-error.js +90 -0
  106. package/dist/src/ui/tui/utils/diagnostics.d.ts +21 -0
  107. package/dist/src/ui/tui/utils/diagnostics.js +72 -0
  108. package/dist/src/ui/tui/utils/with-retry.d.ts +12 -0
  109. package/dist/src/ui/tui/utils/with-retry.js +32 -0
  110. package/dist/src/ui/tui/utils/with-timeout.d.ts +10 -0
  111. package/dist/src/ui/tui/utils/with-timeout.js +24 -0
  112. package/dist/src/utils/ampli-settings.d.ts +1 -1
  113. package/dist/src/utils/ampli-settings.js +15 -5
  114. package/dist/src/utils/api-key-store.js +5 -5
  115. package/dist/src/utils/atomic-write.d.ts +15 -0
  116. package/dist/src/utils/atomic-write.js +34 -0
  117. package/dist/src/utils/setup-utils.js +2 -2
  118. package/dist/src/utils/token-refresh.d.ts +22 -0
  119. package/dist/src/utils/token-refresh.js +79 -0
  120. package/dist/src/utils/wizard-abort.js +6 -1
  121. package/package.json +6 -6
  122. package/skills/instrumentation/add-analytics-instrumentation/SKILL.md +142 -0
  123. package/skills/instrumentation/diff-intake/SKILL.md +128 -0
  124. package/skills/instrumentation/discover-analytics-patterns/SKILL.md +185 -0
  125. package/skills/instrumentation/discover-event-surfaces/SKILL.md +322 -0
  126. package/skills/instrumentation/discover-event-surfaces/references/best-practices.md +563 -0
  127. package/skills/instrumentation/instrument-events/SKILL.md +169 -0
  128. package/skills/instrumentation/instrument-events/references/best-practices.md +563 -0
  129. package/skills/integration/integration-android/SKILL.md +49 -0
  130. package/skills/integration/integration-android/references/EXAMPLE.md +1977 -0
  131. package/skills/integration/integration-android/references/amplitude-quickstart.md +1845 -0
  132. package/skills/integration/integration-android/references/analytics.md +1778 -0
  133. package/skills/integration/integration-android/references/basic-integration-1.0-begin.md +43 -0
  134. package/skills/integration/integration-android/references/basic-integration-1.1-edit.md +35 -0
  135. package/skills/integration/integration-android/references/basic-integration-1.2-revise.md +23 -0
  136. package/skills/integration/integration-android/references/basic-integration-1.3-conclude.md +57 -0
  137. package/skills/integration/integration-angular/SKILL.md +49 -0
  138. package/skills/integration/integration-angular/references/EXAMPLE.md +899 -0
  139. package/skills/integration/integration-angular/references/amplitude-quickstart.md +1845 -0
  140. package/skills/integration/integration-angular/references/basic-integration-1.0-begin.md +43 -0
  141. package/skills/integration/integration-angular/references/basic-integration-1.1-edit.md +35 -0
  142. package/skills/integration/integration-angular/references/basic-integration-1.2-revise.md +23 -0
  143. package/skills/integration/integration-angular/references/basic-integration-1.3-conclude.md +57 -0
  144. package/skills/integration/integration-angular/references/browser-sdk-2.md +4680 -0
  145. package/skills/integration/integration-astro-hybrid/SKILL.md +56 -0
  146. package/skills/integration/integration-astro-hybrid/references/EXAMPLE.md +1095 -0
  147. package/skills/integration/integration-astro-hybrid/references/amplitude-quickstart.md +1845 -0
  148. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.0-begin.md +43 -0
  149. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.1-edit.md +35 -0
  150. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.2-revise.md +23 -0
  151. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.3-conclude.md +57 -0
  152. package/skills/integration/integration-astro-hybrid/references/browser-sdk-2.md +4680 -0
  153. package/skills/integration/integration-astro-ssr/SKILL.md +52 -0
  154. package/skills/integration/integration-astro-ssr/references/EXAMPLE.md +1106 -0
  155. package/skills/integration/integration-astro-ssr/references/amplitude-quickstart.md +1845 -0
  156. package/skills/integration/integration-astro-ssr/references/basic-integration-1.0-begin.md +43 -0
  157. package/skills/integration/integration-astro-ssr/references/basic-integration-1.1-edit.md +35 -0
  158. package/skills/integration/integration-astro-ssr/references/basic-integration-1.2-revise.md +23 -0
  159. package/skills/integration/integration-astro-ssr/references/basic-integration-1.3-conclude.md +57 -0
  160. package/skills/integration/integration-astro-ssr/references/browser-sdk-2.md +4680 -0
  161. package/skills/integration/integration-astro-static/SKILL.md +49 -0
  162. package/skills/integration/integration-astro-static/references/EXAMPLE.md +910 -0
  163. package/skills/integration/integration-astro-static/references/amplitude-quickstart.md +1845 -0
  164. package/skills/integration/integration-astro-static/references/basic-integration-1.0-begin.md +43 -0
  165. package/skills/integration/integration-astro-static/references/basic-integration-1.1-edit.md +35 -0
  166. package/skills/integration/integration-astro-static/references/basic-integration-1.2-revise.md +23 -0
  167. package/skills/integration/integration-astro-static/references/basic-integration-1.3-conclude.md +57 -0
  168. package/skills/integration/integration-astro-static/references/browser-sdk-2.md +4680 -0
  169. package/skills/integration/integration-astro-view-transitions/SKILL.md +51 -0
  170. package/skills/integration/integration-astro-view-transitions/references/EXAMPLE.md +979 -0
  171. package/skills/integration/integration-astro-view-transitions/references/amplitude-quickstart.md +1845 -0
  172. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.0-begin.md +43 -0
  173. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.1-edit.md +35 -0
  174. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.2-revise.md +23 -0
  175. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.3-conclude.md +57 -0
  176. package/skills/integration/integration-astro-view-transitions/references/browser-sdk-2.md +4680 -0
  177. package/skills/integration/integration-django/SKILL.md +57 -0
  178. package/skills/integration/integration-django/references/EXAMPLE.md +1005 -0
  179. package/skills/integration/integration-django/references/amplitude-quickstart.md +1845 -0
  180. package/skills/integration/integration-django/references/basic-integration-1.0-begin.md +43 -0
  181. package/skills/integration/integration-django/references/basic-integration-1.1-edit.md +35 -0
  182. package/skills/integration/integration-django/references/basic-integration-1.2-revise.md +23 -0
  183. package/skills/integration/integration-django/references/basic-integration-1.3-conclude.md +57 -0
  184. package/skills/integration/integration-django/references/python.md +1424 -0
  185. package/skills/integration/integration-expo/SKILL.md +53 -0
  186. package/skills/integration/integration-expo/references/EXAMPLE.md +1291 -0
  187. package/skills/integration/integration-expo/references/amplitude-quickstart.md +1845 -0
  188. package/skills/integration/integration-expo/references/basic-integration-1.0-begin.md +43 -0
  189. package/skills/integration/integration-expo/references/basic-integration-1.1-edit.md +35 -0
  190. package/skills/integration/integration-expo/references/basic-integration-1.2-revise.md +23 -0
  191. package/skills/integration/integration-expo/references/basic-integration-1.3-conclude.md +57 -0
  192. package/skills/integration/integration-expo/references/react-native-sdk.md +2819 -0
  193. package/skills/integration/integration-fastapi/SKILL.md +57 -0
  194. package/skills/integration/integration-fastapi/references/EXAMPLE.md +1389 -0
  195. package/skills/integration/integration-fastapi/references/amplitude-quickstart.md +1845 -0
  196. package/skills/integration/integration-fastapi/references/basic-integration-1.0-begin.md +43 -0
  197. package/skills/integration/integration-fastapi/references/basic-integration-1.1-edit.md +35 -0
  198. package/skills/integration/integration-fastapi/references/basic-integration-1.2-revise.md +23 -0
  199. package/skills/integration/integration-fastapi/references/basic-integration-1.3-conclude.md +57 -0
  200. package/skills/integration/integration-fastapi/references/python.md +1424 -0
  201. package/skills/integration/integration-flask/SKILL.md +56 -0
  202. package/skills/integration/integration-flask/references/EXAMPLE.md +1130 -0
  203. package/skills/integration/integration-flask/references/amplitude-quickstart.md +1845 -0
  204. package/skills/integration/integration-flask/references/basic-integration-1.0-begin.md +43 -0
  205. package/skills/integration/integration-flask/references/basic-integration-1.1-edit.md +35 -0
  206. package/skills/integration/integration-flask/references/basic-integration-1.2-revise.md +23 -0
  207. package/skills/integration/integration-flask/references/basic-integration-1.3-conclude.md +57 -0
  208. package/skills/integration/integration-flask/references/python.md +1424 -0
  209. package/skills/integration/integration-javascript_node/SKILL.md +54 -0
  210. package/skills/integration/integration-javascript_node/references/EXAMPLE.md +365 -0
  211. package/skills/integration/integration-javascript_node/references/amplitude-quickstart.md +1845 -0
  212. package/skills/integration/integration-javascript_node/references/analytics.md +1778 -0
  213. package/skills/integration/integration-javascript_node/references/basic-integration-1.0-begin.md +43 -0
  214. package/skills/integration/integration-javascript_node/references/basic-integration-1.1-edit.md +35 -0
  215. package/skills/integration/integration-javascript_node/references/basic-integration-1.2-revise.md +23 -0
  216. package/skills/integration/integration-javascript_node/references/basic-integration-1.3-conclude.md +57 -0
  217. package/skills/integration/integration-javascript_web/SKILL.md +58 -0
  218. package/skills/integration/integration-javascript_web/references/EXAMPLE.md +451 -0
  219. package/skills/integration/integration-javascript_web/references/amplitude-quickstart.md +1845 -0
  220. package/skills/integration/integration-javascript_web/references/basic-integration-1.0-begin.md +43 -0
  221. package/skills/integration/integration-javascript_web/references/basic-integration-1.1-edit.md +35 -0
  222. package/skills/integration/integration-javascript_web/references/basic-integration-1.2-revise.md +23 -0
  223. package/skills/integration/integration-javascript_web/references/basic-integration-1.3-conclude.md +57 -0
  224. package/skills/integration/integration-javascript_web/references/browser-sdk-2.md +4680 -0
  225. package/skills/integration/integration-laravel/SKILL.md +52 -0
  226. package/skills/integration/integration-laravel/references/EXAMPLE.md +2039 -0
  227. package/skills/integration/integration-laravel/references/amplitude-quickstart.md +1845 -0
  228. package/skills/integration/integration-laravel/references/analytics.md +1778 -0
  229. package/skills/integration/integration-laravel/references/basic-integration-1.0-begin.md +43 -0
  230. package/skills/integration/integration-laravel/references/basic-integration-1.1-edit.md +35 -0
  231. package/skills/integration/integration-laravel/references/basic-integration-1.2-revise.md +23 -0
  232. package/skills/integration/integration-laravel/references/basic-integration-1.3-conclude.md +57 -0
  233. package/skills/integration/integration-nextjs-app-router/SKILL.md +54 -0
  234. package/skills/integration/integration-nextjs-app-router/references/EXAMPLE.md +673 -0
  235. package/skills/integration/integration-nextjs-app-router/references/amplitude-quickstart.md +1845 -0
  236. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.0-begin.md +43 -0
  237. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.1-edit.md +35 -0
  238. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.2-revise.md +23 -0
  239. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.3-conclude.md +57 -0
  240. package/skills/integration/integration-nextjs-app-router/references/browser-sdk-2.md +4680 -0
  241. package/skills/integration/integration-nextjs-pages-router/SKILL.md +54 -0
  242. package/skills/integration/integration-nextjs-pages-router/references/EXAMPLE.md +735 -0
  243. package/skills/integration/integration-nextjs-pages-router/references/amplitude-quickstart.md +1845 -0
  244. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.0-begin.md +43 -0
  245. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.1-edit.md +35 -0
  246. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.2-revise.md +23 -0
  247. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.3-conclude.md +57 -0
  248. package/skills/integration/integration-nextjs-pages-router/references/browser-sdk-2.md +4680 -0
  249. package/skills/integration/integration-nuxt-3.6/SKILL.md +46 -0
  250. package/skills/integration/integration-nuxt-3.6/references/EXAMPLE.md +8422 -0
  251. package/skills/integration/integration-nuxt-3.6/references/amplitude-quickstart.md +1845 -0
  252. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.0-begin.md +43 -0
  253. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.1-edit.md +35 -0
  254. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.2-revise.md +23 -0
  255. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.3-conclude.md +57 -0
  256. package/skills/integration/integration-nuxt-3.6/references/browser-sdk-2.md +4680 -0
  257. package/skills/integration/integration-nuxt-4/SKILL.md +46 -0
  258. package/skills/integration/integration-nuxt-4/references/EXAMPLE.md +8670 -0
  259. package/skills/integration/integration-nuxt-4/references/amplitude-quickstart.md +1845 -0
  260. package/skills/integration/integration-nuxt-4/references/basic-integration-1.0-begin.md +43 -0
  261. package/skills/integration/integration-nuxt-4/references/basic-integration-1.1-edit.md +35 -0
  262. package/skills/integration/integration-nuxt-4/references/basic-integration-1.2-revise.md +23 -0
  263. package/skills/integration/integration-nuxt-4/references/basic-integration-1.3-conclude.md +57 -0
  264. package/skills/integration/integration-nuxt-4/references/browser-sdk-2.md +4680 -0
  265. package/skills/integration/integration-python/SKILL.md +53 -0
  266. package/skills/integration/integration-python/references/EXAMPLE.md +445 -0
  267. package/skills/integration/integration-python/references/amplitude-quickstart.md +1845 -0
  268. package/skills/integration/integration-python/references/basic-integration-1.0-begin.md +43 -0
  269. package/skills/integration/integration-python/references/basic-integration-1.1-edit.md +35 -0
  270. package/skills/integration/integration-python/references/basic-integration-1.2-revise.md +23 -0
  271. package/skills/integration/integration-python/references/basic-integration-1.3-conclude.md +57 -0
  272. package/skills/integration/integration-python/references/python.md +1424 -0
  273. package/skills/integration/integration-react-native/SKILL.md +49 -0
  274. package/skills/integration/integration-react-native/references/EXAMPLE.md +2253 -0
  275. package/skills/integration/integration-react-native/references/amplitude-quickstart.md +1845 -0
  276. package/skills/integration/integration-react-native/references/basic-integration-1.0-begin.md +43 -0
  277. package/skills/integration/integration-react-native/references/basic-integration-1.1-edit.md +35 -0
  278. package/skills/integration/integration-react-native/references/basic-integration-1.2-revise.md +23 -0
  279. package/skills/integration/integration-react-native/references/basic-integration-1.3-conclude.md +57 -0
  280. package/skills/integration/integration-react-native/references/react-native-sdk.md +2819 -0
  281. package/skills/integration/integration-react-react-router-6/SKILL.md +53 -0
  282. package/skills/integration/integration-react-react-router-6/references/EXAMPLE.md +570 -0
  283. package/skills/integration/integration-react-react-router-6/references/amplitude-quickstart.md +1845 -0
  284. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.0-begin.md +43 -0
  285. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.1-edit.md +35 -0
  286. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.2-revise.md +23 -0
  287. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.3-conclude.md +57 -0
  288. package/skills/integration/integration-react-react-router-6/references/browser-sdk-2.md +4680 -0
  289. package/skills/integration/integration-react-react-router-7-data/SKILL.md +53 -0
  290. package/skills/integration/integration-react-react-router-7-data/references/EXAMPLE.md +830 -0
  291. package/skills/integration/integration-react-react-router-7-data/references/amplitude-quickstart.md +1845 -0
  292. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.0-begin.md +43 -0
  293. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.1-edit.md +35 -0
  294. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.2-revise.md +23 -0
  295. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.3-conclude.md +57 -0
  296. package/skills/integration/integration-react-react-router-7-data/references/browser-sdk-2.md +4680 -0
  297. package/skills/integration/integration-react-react-router-7-declarative/SKILL.md +53 -0
  298. package/skills/integration/integration-react-react-router-7-declarative/references/EXAMPLE.md +609 -0
  299. package/skills/integration/integration-react-react-router-7-declarative/references/amplitude-quickstart.md +1845 -0
  300. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.0-begin.md +43 -0
  301. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.1-edit.md +35 -0
  302. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.2-revise.md +23 -0
  303. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.3-conclude.md +57 -0
  304. package/skills/integration/integration-react-react-router-7-declarative/references/browser-sdk-2.md +4680 -0
  305. package/skills/integration/integration-react-react-router-7-framework/SKILL.md +53 -0
  306. package/skills/integration/integration-react-react-router-7-framework/references/EXAMPLE.md +1081 -0
  307. package/skills/integration/integration-react-react-router-7-framework/references/amplitude-quickstart.md +1845 -0
  308. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.0-begin.md +43 -0
  309. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.1-edit.md +35 -0
  310. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.2-revise.md +23 -0
  311. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.3-conclude.md +57 -0
  312. package/skills/integration/integration-react-react-router-7-framework/references/browser-sdk-2.md +4680 -0
  313. package/skills/integration/integration-react-tanstack-router-code-based/SKILL.md +57 -0
  314. package/skills/integration/integration-react-tanstack-router-code-based/references/EXAMPLE.md +659 -0
  315. package/skills/integration/integration-react-tanstack-router-code-based/references/amplitude-quickstart.md +1845 -0
  316. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.0-begin.md +43 -0
  317. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.1-edit.md +35 -0
  318. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.2-revise.md +23 -0
  319. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.3-conclude.md +57 -0
  320. package/skills/integration/integration-react-tanstack-router-code-based/references/browser-sdk-2.md +4680 -0
  321. package/skills/integration/integration-react-tanstack-router-file-based/SKILL.md +57 -0
  322. package/skills/integration/integration-react-tanstack-router-file-based/references/EXAMPLE.md +777 -0
  323. package/skills/integration/integration-react-tanstack-router-file-based/references/amplitude-quickstart.md +1845 -0
  324. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.0-begin.md +43 -0
  325. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.1-edit.md +35 -0
  326. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.2-revise.md +23 -0
  327. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.3-conclude.md +57 -0
  328. package/skills/integration/integration-react-tanstack-router-file-based/references/browser-sdk-2.md +4680 -0
  329. package/skills/integration/integration-react-vite/SKILL.md +53 -0
  330. package/skills/integration/integration-react-vite/references/EXAMPLE.md +542 -0
  331. package/skills/integration/integration-react-vite/references/amplitude-quickstart.md +1845 -0
  332. package/skills/integration/integration-react-vite/references/basic-integration-1.0-begin.md +43 -0
  333. package/skills/integration/integration-react-vite/references/basic-integration-1.1-edit.md +35 -0
  334. package/skills/integration/integration-react-vite/references/basic-integration-1.2-revise.md +23 -0
  335. package/skills/integration/integration-react-vite/references/basic-integration-1.3-conclude.md +57 -0
  336. package/skills/integration/integration-react-vite/references/browser-sdk-2.md +4680 -0
  337. package/skills/integration/integration-ruby/SKILL.md +50 -0
  338. package/skills/integration/integration-ruby/references/EXAMPLE.md +420 -0
  339. package/skills/integration/integration-ruby/references/amplitude-quickstart.md +1845 -0
  340. package/skills/integration/integration-ruby/references/analytics.md +1778 -0
  341. package/skills/integration/integration-ruby/references/basic-integration-1.0-begin.md +43 -0
  342. package/skills/integration/integration-ruby/references/basic-integration-1.1-edit.md +35 -0
  343. package/skills/integration/integration-ruby/references/basic-integration-1.2-revise.md +23 -0
  344. package/skills/integration/integration-ruby/references/basic-integration-1.3-conclude.md +57 -0
  345. package/skills/integration/integration-ruby-on-rails/SKILL.md +55 -0
  346. package/skills/integration/integration-ruby-on-rails/references/EXAMPLE.md +1013 -0
  347. package/skills/integration/integration-ruby-on-rails/references/amplitude-quickstart.md +1845 -0
  348. package/skills/integration/integration-ruby-on-rails/references/analytics.md +1778 -0
  349. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.0-begin.md +43 -0
  350. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.1-edit.md +35 -0
  351. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.2-revise.md +23 -0
  352. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.3-conclude.md +57 -0
  353. package/skills/integration/integration-sveltekit/SKILL.md +47 -0
  354. package/skills/integration/integration-sveltekit/references/EXAMPLE.md +14121 -0
  355. package/skills/integration/integration-sveltekit/references/amplitude-quickstart.md +1845 -0
  356. package/skills/integration/integration-sveltekit/references/basic-integration-1.0-begin.md +43 -0
  357. package/skills/integration/integration-sveltekit/references/basic-integration-1.1-edit.md +35 -0
  358. package/skills/integration/integration-sveltekit/references/basic-integration-1.2-revise.md +23 -0
  359. package/skills/integration/integration-sveltekit/references/basic-integration-1.3-conclude.md +57 -0
  360. package/skills/integration/integration-sveltekit/references/browser-sdk-2.md +4680 -0
  361. package/skills/integration/integration-swift/SKILL.md +49 -0
  362. package/skills/integration/integration-swift/references/EXAMPLE.md +660 -0
  363. package/skills/integration/integration-swift/references/amplitude-quickstart.md +1845 -0
  364. package/skills/integration/integration-swift/references/analytics.md +1778 -0
  365. package/skills/integration/integration-swift/references/basic-integration-1.0-begin.md +43 -0
  366. package/skills/integration/integration-swift/references/basic-integration-1.1-edit.md +35 -0
  367. package/skills/integration/integration-swift/references/basic-integration-1.2-revise.md +23 -0
  368. package/skills/integration/integration-swift/references/basic-integration-1.3-conclude.md +57 -0
  369. package/skills/integration/integration-tanstack-start/SKILL.md +58 -0
  370. package/skills/integration/integration-tanstack-start/references/EXAMPLE.md +998 -0
  371. package/skills/integration/integration-tanstack-start/references/amplitude-quickstart.md +1845 -0
  372. package/skills/integration/integration-tanstack-start/references/basic-integration-1.0-begin.md +43 -0
  373. package/skills/integration/integration-tanstack-start/references/basic-integration-1.1-edit.md +35 -0
  374. package/skills/integration/integration-tanstack-start/references/basic-integration-1.2-revise.md +23 -0
  375. package/skills/integration/integration-tanstack-start/references/basic-integration-1.3-conclude.md +57 -0
  376. package/skills/integration/integration-tanstack-start/references/browser-sdk-2.md +4680 -0
  377. package/skills/integration/integration-vue-3/SKILL.md +46 -0
  378. package/skills/integration/integration-vue-3/references/EXAMPLE.md +846 -0
  379. package/skills/integration/integration-vue-3/references/amplitude-quickstart.md +1845 -0
  380. package/skills/integration/integration-vue-3/references/basic-integration-1.0-begin.md +43 -0
  381. package/skills/integration/integration-vue-3/references/basic-integration-1.1-edit.md +35 -0
  382. package/skills/integration/integration-vue-3/references/basic-integration-1.2-revise.md +23 -0
  383. package/skills/integration/integration-vue-3/references/basic-integration-1.3-conclude.md +57 -0
  384. package/skills/integration/integration-vue-3/references/browser-sdk-2.md +4680 -0
  385. package/skills/taxonomy/amplitude-quickstart-taxonomy-agent/SKILL.md +228 -0
  386. package/dist/src/ui/tui/components/TitleBar.d.ts +0 -8
  387. package/dist/src/ui/tui/components/TitleBar.js +0 -27
  388. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.d.ts +0 -7
  389. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.js +0 -101
  390. package/dist/src/utils/anthropic-status.d.ts +0 -17
  391. package/dist/src/utils/anthropic-status.js +0 -51
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: integration-ruby
3
+ description: Amplitude integration for any Ruby application using the Ruby SDK
4
+ metadata:
5
+ author: Amplitude
6
+ version: dev
7
+ ---
8
+
9
+ # Amplitude integration for Ruby
10
+
11
+ This skill helps you add Amplitude analytics to Ruby applications.
12
+
13
+ ## Workflow
14
+
15
+ Follow these steps in order to complete the integration:
16
+
17
+ 1. `basic-integration-1.0-begin.md` - Amplitude Setup - Begin ← **Start here**
18
+ 2. `basic-integration-1.1-edit.md` - Amplitude Setup - Edit
19
+ 3. `basic-integration-1.2-revise.md` - Amplitude Setup - Revise
20
+ 4. `basic-integration-1.3-conclude.md` - Amplitude Setup - Conclusion
21
+
22
+ ## Reference files
23
+
24
+ - `references/EXAMPLE.md` - Ruby example project code
25
+ - `references/analytics.md` - Amplitude documentation for Analytics
26
+ - `references/amplitude-quickstart.md` - Amplitude documentation for Amplitude Quickstart
27
+ - `references/basic-integration-1.0-begin.md` - Amplitude setup - begin
28
+ - `references/basic-integration-1.1-edit.md` - Amplitude setup - edit
29
+ - `references/basic-integration-1.2-revise.md` - Amplitude setup - revise
30
+ - `references/basic-integration-1.3-conclude.md` - Amplitude setup - conclusion
31
+
32
+ The example project shows the target implementation pattern. Consult the documentation for API details.
33
+
34
+ ## Key principles
35
+
36
+ - **Environment variables**: Always use environment variables for Amplitude keys. Never hardcode them.
37
+ - **Minimal changes**: Add Amplitude code alongside existing integrations. Don't replace or restructure existing code.
38
+ - **Match the example**: Your implementation should follow the example project's patterns as closely as possible.
39
+
40
+ ## Framework guidelines
41
+
42
+ - amplitude-api is a commonly used Ruby SDK gem (add `gem 'amplitude-api'` to Gemfile)
43
+ - Use AmplitudeAPI::Event and AmplitudeAPI.send_event for tracking; initialize with AmplitudeAPI.config.api_key
44
+ - In CLIs and scripts, ensure events are flushed before exit
45
+ - Use begin/rescue/ensure for proper cleanup patterns
46
+ - Events take a user_id and event_type plus event_properties hash
47
+
48
+ ## Identifying users
49
+
50
+ 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,420 @@
1
+ # Amplitude Ruby Example Project
2
+
3
+ Repository: https://github.com/amplitude/context-hub
4
+ Path: basics/ruby
5
+
6
+ ---
7
+
8
+ ## README.md
9
+
10
+ # Amplitude Ruby Example - CLI Todo App
11
+
12
+ A simple command-line todo application built with plain Ruby (no frameworks) demonstrating Amplitude integration for CLIs, scripts, data pipelines, and non-web Ruby applications.
13
+
14
+ ## Purpose
15
+
16
+ This example serves as:
17
+ - **Verification** that the context-hub wizard works for plain Ruby projects
18
+ - **Reference implementation** of Amplitude best practices for non-framework Ruby code
19
+ - **Working example** you can run and modify
20
+
21
+ ## Features Demonstrated
22
+
23
+ - **Instance-based API** - Uses `Amplitude::Client.instance` for explicit client management
24
+ - **Proper shutdown** - Uses `flush` in `ensure` block to send events before exit
25
+ - **Event tracking** - Captures user actions with `user_id` and event properties
26
+
27
+ ## Quick Start
28
+
29
+ ### 1. Install Dependencies
30
+
31
+ ```bash
32
+ # Install bundler if needed
33
+ gem install bundler
34
+
35
+ # Install dependencies
36
+ bundle install
37
+ ```
38
+
39
+ ### 2. Configure Amplitude
40
+
41
+ ```bash
42
+ # Copy environment template
43
+ cp .env.example .env
44
+
45
+ # Edit .env and add your Amplitude API key
46
+ # AMPLITUDE_API_KEY=your_amplitude_api_key_here
47
+ ```
48
+
49
+ Get your Amplitude API key from your [Amplitude project settings](https://app.amplitude.com).
50
+
51
+ ### 3. Run the App
52
+
53
+ ```bash
54
+ # Add a todo
55
+ ruby todo.rb add "Buy groceries"
56
+
57
+ # List all todos
58
+ ruby todo.rb list
59
+
60
+ # Complete a todo
61
+ ruby todo.rb complete 1
62
+
63
+ # Delete a todo
64
+ ruby todo.rb delete 1
65
+
66
+ # Show statistics
67
+ ruby todo.rb stats
68
+ ```
69
+
70
+ ## What Gets Tracked
71
+
72
+ The app tracks these events in Amplitude:
73
+
74
+ | Event | Properties | Purpose |
75
+ |-------|-----------|---------|
76
+ | `Todo Added` | `todo_id`, `todo_length`, `total_todos` | When user adds a new todo |
77
+ | `Todos Viewed` | `total_todos`, `completed_todos` | When user lists todos |
78
+ | `Todo Completed` | `todo_id`, `time_to_complete_hours` | When user completes a todo |
79
+ | `Todo Deleted` | `todo_id`, `was_completed` | When user deletes a todo |
80
+ | `Stats Viewed` | `total_todos`, `completed_todos`, `pending_todos` | When user views stats |
81
+
82
+ ## Code Structure
83
+
84
+ ```
85
+ basics/ruby/
86
+ ├── todo.rb # Main CLI application
87
+ ├── Gemfile # Ruby dependencies
88
+ ├── .env.example # Environment variable template
89
+ ├── .gitignore # Git ignore rules
90
+ └── README.md # This file
91
+ ```
92
+
93
+ ## Key Implementation Patterns
94
+
95
+ ### 1. Instance-Based Initialization
96
+
97
+ ```ruby
98
+ require 'amplitude-analytics'
99
+
100
+ client = Amplitude::Client.instance
101
+ client.api_key = ENV['AMPLITUDE_API_KEY']
102
+ ```
103
+
104
+ ### 2. Event Tracking Pattern
105
+
106
+ ```ruby
107
+ event = Amplitude::BaseEvent.new(
108
+ event_type: 'event_name',
109
+ user_id: 'user_123',
110
+ event_properties: { key: 'value' }
111
+ )
112
+ client.track(event)
113
+ ```
114
+
115
+ ### 3. Proper Shutdown
116
+
117
+ ```ruby
118
+ begin
119
+ # Your application code
120
+ ensure
121
+ # Always call flush to send events before exit
122
+ amplitude&.flush
123
+ end
124
+ ```
125
+
126
+ ## Running Without Amplitude
127
+
128
+ The app works fine without Amplitude configured - it simply won't track analytics. You'll see a warning message but the app continues to function normally.
129
+
130
+ ## Learn More
131
+
132
+ - [Amplitude Documentation](https://amplitude.com/docs)
133
+ - [Amplitude Ruby SDK](https://amplitude.com/docs/sdks/analytics/ruby)
134
+
135
+ ---
136
+
137
+ ## .env.example
138
+
139
+ ```example
140
+ # Amplitude Configuration
141
+ AMPLITUDE_API_KEY=your_amplitude_api_key_here
142
+
143
+ ```
144
+
145
+ ---
146
+
147
+ ## Gemfile
148
+
149
+ ```
150
+ source 'https://rubygems.org'
151
+
152
+ gem 'amplitude-analytics', '~> 1.0'
153
+ gem 'dotenv', '~> 3.0'
154
+
155
+ ```
156
+
157
+ ---
158
+
159
+ ## todo.rb
160
+
161
+ ```rb
162
+ #!/usr/bin/env ruby
163
+ # frozen_string_literal: true
164
+
165
+ # Simple CLI Todo App with Amplitude Analytics
166
+ #
167
+ # A minimal plain Ruby CLI application demonstrating Amplitude integration
168
+ # for non-framework Ruby projects (CLIs, scripts, data pipelines, etc.).
169
+
170
+ require 'json'
171
+ require 'securerandom'
172
+ require 'time'
173
+ require 'dotenv/load'
174
+ require 'amplitude-analytics'
175
+
176
+ # Data file location
177
+ DATA_FILE = File.join(Dir.home, '.todo_app.json')
178
+
179
+ def initialize_amplitude
180
+ # Initialize Amplitude with constructor-based API.
181
+ # Returns Amplitude client or nil if API key not configured.
182
+ api_key = ENV['AMPLITUDE_API_KEY']
183
+
184
+ unless api_key
185
+ puts 'WARNING: Amplitude not configured (AMPLITUDE_API_KEY not set)'
186
+ puts ' App will work but analytics won\'t be tracked'
187
+ return nil
188
+ end
189
+
190
+ Amplitude::Client.new(api_key)
191
+ end
192
+
193
+ def get_user_id
194
+ # Get or create a user ID for this installation.
195
+ # Uses a UUID stored in the data file to represent this user.
196
+ if File.exist?(DATA_FILE)
197
+ data = JSON.parse(File.read(DATA_FILE))
198
+ return data['user_id'] if data['user_id']
199
+ end
200
+
201
+ "user_#{SecureRandom.hex(4)}"
202
+ end
203
+
204
+ def load_todos
205
+ # Load todos from disk.
206
+ return { 'user_id' => get_user_id, 'todos' => [] } unless File.exist?(DATA_FILE)
207
+
208
+ JSON.parse(File.read(DATA_FILE))
209
+ end
210
+
211
+ def save_todos(data)
212
+ # Save todos to disk.
213
+ File.write(DATA_FILE, JSON.pretty_generate(data))
214
+ end
215
+
216
+ def track_event(amplitude, event_name, properties = {})
217
+ # Track an event with Amplitude.
218
+ return unless amplitude
219
+
220
+ event = Amplitude::BaseEvent.new(
221
+ event_type: event_name,
222
+ user_id: get_user_id,
223
+ event_properties: properties
224
+ )
225
+ amplitude.track(event)
226
+ end
227
+
228
+ def cmd_add(text, amplitude)
229
+ # Add a new todo item.
230
+ data = load_todos
231
+
232
+ todo = {
233
+ 'id' => data['todos'].length + 1,
234
+ 'text' => text,
235
+ 'completed' => false,
236
+ 'created_at' => Time.now.iso8601
237
+ }
238
+
239
+ data['todos'] << todo
240
+ save_todos(data)
241
+
242
+ puts "Added todo ##{todo['id']}: #{todo['text']}"
243
+
244
+ track_event(amplitude, 'Todo Added', {
245
+ 'todo_id' => todo['id'],
246
+ 'todo_length' => todo['text'].length,
247
+ 'total_todos' => data['todos'].length
248
+ })
249
+ end
250
+
251
+ def cmd_list(amplitude)
252
+ # List all todos.
253
+ data = load_todos
254
+
255
+ if data['todos'].empty?
256
+ puts "No todos yet! Add one with: ruby todo.rb add 'Your task'"
257
+ return
258
+ end
259
+
260
+ puts "\nYour Todos (#{data['todos'].length} total):\n\n"
261
+
262
+ data['todos'].each do |todo|
263
+ status = todo['completed'] ? 'X' : ' '
264
+ puts " [#{status}] ##{todo['id']}: #{todo['text']}"
265
+ end
266
+
267
+ puts
268
+
269
+ track_event(amplitude, 'Todos Viewed', {
270
+ 'total_todos' => data['todos'].length,
271
+ 'completed_todos' => data['todos'].count { |t| t['completed'] }
272
+ })
273
+ end
274
+
275
+ def cmd_complete(id, amplitude)
276
+ # Mark a todo as completed.
277
+ data = load_todos
278
+
279
+ todo = data['todos'].find { |t| t['id'] == id }
280
+
281
+ unless todo
282
+ puts "ERROR: Todo ##{id} not found"
283
+ return
284
+ end
285
+
286
+ if todo['completed']
287
+ puts "Todo ##{id} is already completed"
288
+ return
289
+ end
290
+
291
+ todo['completed'] = true
292
+ todo['completed_at'] = Time.now.iso8601
293
+ save_todos(data)
294
+
295
+ puts "Completed todo ##{todo['id']}: #{todo['text']}"
296
+
297
+ time_to_complete = (Time.parse(todo['completed_at']) - Time.parse(todo['created_at'])) / 3600.0
298
+
299
+ track_event(amplitude, 'Todo Completed', {
300
+ 'todo_id' => todo['id'],
301
+ 'time_to_complete_hours' => time_to_complete
302
+ })
303
+ end
304
+
305
+ def cmd_delete(id, amplitude)
306
+ # Delete a todo.
307
+ data = load_todos
308
+
309
+ todo = data['todos'].find { |t| t['id'] == id }
310
+
311
+ unless todo
312
+ puts "ERROR: Todo ##{id} not found"
313
+ return
314
+ end
315
+
316
+ data['todos'].delete(todo)
317
+ save_todos(data)
318
+
319
+ puts "Deleted todo ##{id}"
320
+
321
+ track_event(amplitude, 'Todo Deleted', {
322
+ 'todo_id' => todo['id'],
323
+ 'was_completed' => todo['completed']
324
+ })
325
+ end
326
+
327
+ def cmd_stats(amplitude)
328
+ # Show usage statistics.
329
+ data = load_todos
330
+
331
+ total = data['todos'].length
332
+ completed = data['todos'].count { |t| t['completed'] }
333
+ pending = total - completed
334
+
335
+ puts "\nStats:\n\n"
336
+ puts " Total todos: #{total}"
337
+ puts " Completed: #{completed}"
338
+ puts " Pending: #{pending}"
339
+ puts " Completion rate: #{total > 0 ? format('%.1f', completed.to_f / total * 100) : '0.0'}%"
340
+ puts
341
+
342
+ track_event(amplitude, 'Stats Viewed', {
343
+ 'total_todos' => total,
344
+ 'completed_todos' => completed,
345
+ 'pending_todos' => pending
346
+ })
347
+ end
348
+
349
+ def print_usage
350
+ puts <<~USAGE
351
+ Simple todo app with Amplitude analytics
352
+
353
+ Usage:
354
+ ruby todo.rb add "Todo text" Add a new todo
355
+ ruby todo.rb list List all todos
356
+ ruby todo.rb complete <id> Mark todo as completed
357
+ ruby todo.rb delete <id> Delete a todo
358
+ ruby todo.rb stats Show statistics
359
+ USAGE
360
+ end
361
+
362
+ # Main entry point
363
+ amplitude = nil
364
+
365
+ begin
366
+ amplitude = initialize_amplitude
367
+
368
+ command = ARGV[0]
369
+
370
+ unless command
371
+ print_usage
372
+ exit 0
373
+ end
374
+
375
+ case command
376
+ when 'add'
377
+ text = ARGV[1]
378
+ unless text
379
+ puts 'ERROR: Please provide todo text'
380
+ puts 'Usage: ruby todo.rb add "Your task"'
381
+ exit 1
382
+ end
383
+ cmd_add(text, amplitude)
384
+ when 'list'
385
+ cmd_list(amplitude)
386
+ when 'complete'
387
+ id = ARGV[1]&.to_i
388
+ unless id && id > 0
389
+ puts 'ERROR: Please provide a valid todo ID'
390
+ puts 'Usage: ruby todo.rb complete <id>'
391
+ exit 1
392
+ end
393
+ cmd_complete(id, amplitude)
394
+ when 'delete'
395
+ id = ARGV[1]&.to_i
396
+ unless id && id > 0
397
+ puts 'ERROR: Please provide a valid todo ID'
398
+ puts 'Usage: ruby todo.rb delete <id>'
399
+ exit 1
400
+ end
401
+ cmd_delete(id, amplitude)
402
+ when 'stats'
403
+ cmd_stats(amplitude)
404
+ else
405
+ puts "ERROR: Unknown command '#{command}'"
406
+ print_usage
407
+ exit 1
408
+ end
409
+ rescue StandardError => e
410
+ puts "ERROR: #{e.message}"
411
+ exit 1
412
+ ensure
413
+ # IMPORTANT: Always flush Amplitude to send events before exit
414
+ amplitude&.flush
415
+ end
416
+
417
+ ```
418
+
419
+ ---
420
+