@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,53 @@
1
+ ---
2
+ name: integration-python
3
+ description: Amplitude integration for any Python application using the Python SDK
4
+ metadata:
5
+ author: Amplitude
6
+ version: dev
7
+ ---
8
+
9
+ # Amplitude integration for Python
10
+
11
+ This skill helps you add Amplitude analytics to Python 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` - Python example project code
25
+ - `references/python.md` - Amplitude documentation for Python
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
+ - Remember that source code is available in the venv/site-packages directory
43
+ - amplitude-analytics is the Python SDK package name
44
+ - Install dependencies with `pip install amplitude-analytics` or `pip install -r requirements.txt` and do NOT use unquoted version specifiers like `>=` directly in shell commands
45
+ - Always initialize with Amplitude(api_key) and configure via Config() — do NOT use module-level config
46
+ - In CLIs and scripts: MUST call client.shutdown() before exit or all events are lost
47
+ - NEVER send PII in track() event properties — no emails, full names, phone numbers, physical addresses, IP addresses, or user-generated content
48
+ - PII belongs in identify() user properties, NOT in track() event properties. Safe event properties are metadata like message_length, form_type, boolean flags.
49
+ - Register client.shutdown with atexit.register() to ensure all events are flushed on exit
50
+
51
+ ## Identifying users
52
+
53
+ 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,445 @@
1
+ # Amplitude Python Example Project
2
+
3
+ Repository: https://github.com/amplitude/context-hub
4
+ Path: basics/python
5
+
6
+ ---
7
+
8
+ ## README.md
9
+
10
+ # Amplitude Python Example - CLI Todo App
11
+
12
+ A simple command-line todo application built with plain Python (no frameworks) demonstrating Amplitude integration for CLIs, scripts, data pipelines, and non-web Python applications.
13
+
14
+ ## Purpose
15
+
16
+ This example serves as:
17
+ - **Verification** that the context-hub wizard works for plain Python projects
18
+ - **Reference implementation** of Amplitude best practices for non-framework Python code
19
+ - **Working example** you can run and modify
20
+
21
+ ## Features Demonstrated
22
+
23
+ - **Instance-based API** - Uses `Amplitude(api_key)` class for initialization
24
+ - **Proper shutdown** - Uses `shutdown()` to flush events before exit
25
+ - **Event tracking** - Captures user actions with `BaseEvent` and `event_properties`
26
+ - **User identification** - Sets properties on users via `Identify` object
27
+
28
+ ## Quick Start
29
+
30
+ ### 1. Install Dependencies
31
+
32
+ ```bash
33
+ # Create virtual environment (recommended)
34
+ python -m venv venv
35
+ source venv/bin/activate # On Windows: venv\Scripts\activate
36
+
37
+ # Install dependencies
38
+ pip install -r requirements.txt
39
+ ```
40
+
41
+ ### 2. Configure Amplitude
42
+
43
+ ```bash
44
+ # Copy environment template
45
+ cp .env.example .env
46
+
47
+ # Edit .env and add your Amplitude API key
48
+ # AMPLITUDE_API_KEY=your_amplitude_api_key_here
49
+ ```
50
+
51
+ ### 3. Run the App
52
+
53
+ ```bash
54
+ # Add a todo
55
+ python todo.py add "Buy groceries"
56
+
57
+ # List all todos
58
+ python todo.py list
59
+
60
+ # Complete a todo
61
+ python todo.py complete 1
62
+
63
+ # Delete a todo
64
+ python todo.py delete 1
65
+
66
+ # Show statistics
67
+ python todo.py 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/python/
86
+ ├── todo.py # Main CLI application
87
+ ├── requirements.txt # Python 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
+ ```python
98
+ from amplitude import Amplitude, BaseEvent, Identify
99
+
100
+ client = Amplitude(api_key)
101
+ ```
102
+
103
+ ### 2. Event Tracking Pattern
104
+
105
+ ```python
106
+ client.track(BaseEvent(
107
+ event_type="event_name",
108
+ user_id="user_123",
109
+ event_properties={"key": "value"}
110
+ ))
111
+ ```
112
+
113
+ ### 3. Proper Shutdown
114
+
115
+ ```python
116
+ try:
117
+ # Your application code
118
+ pass
119
+ finally:
120
+ # Always call shutdown() to flush events and close connections
121
+ client.shutdown()
122
+ ```
123
+
124
+ ### 4. Identifying Users
125
+
126
+ ```python
127
+ identify_obj = Identify()
128
+ identify_obj.set("email", "user@example.com")
129
+ identify_obj.set("plan", "pro")
130
+ client.identify(identify_obj, EventOptions(user_id="user_123"))
131
+ ```
132
+
133
+ ## Running Without Amplitude
134
+
135
+ 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.
136
+
137
+ ## Next Steps
138
+
139
+ - Modify `todo.py` to experiment with Amplitude tracking
140
+ - Add new commands and track their usage
141
+ - Check your Amplitude dashboard to see tracked events
142
+
143
+ ## Learn More
144
+
145
+ - [Amplitude Python SDK Documentation](https://amplitude.com/docs/sdks/analytics/python)
146
+ - [Amplitude Quickstart](https://amplitude.com/docs/get-started/amplitude-quickstart)
147
+
148
+ ---
149
+
150
+ ## .env.example
151
+
152
+ ```example
153
+ # Amplitude Configuration
154
+ AMPLITUDE_API_KEY=your_amplitude_api_key_here
155
+
156
+ ```
157
+
158
+ ---
159
+
160
+ ## requirements.txt
161
+
162
+ ```txt
163
+ amplitude-analytics>=1.0.0
164
+ python-dotenv>=1.0.0
165
+
166
+ ```
167
+
168
+ ---
169
+
170
+ ## todo.py
171
+
172
+ ```py
173
+ #!/usr/bin/env python3
174
+ """Simple CLI Todo App with Amplitude Analytics
175
+
176
+ A minimal plain Python CLI application demonstrating Amplitude integration
177
+ for non-framework Python projects (CLIs, scripts, data pipelines, etc.).
178
+ """
179
+
180
+ import argparse
181
+ import json
182
+ import os
183
+ import sys
184
+ from datetime import datetime
185
+ from pathlib import Path
186
+ from dotenv import load_dotenv
187
+ from amplitude import Amplitude, BaseEvent, Identify
188
+
189
+ # Load environment variables
190
+ load_dotenv()
191
+
192
+ # Data file location
193
+ DATA_FILE = Path.home() / ".todo_app.json"
194
+
195
+
196
+ def initialize_amplitude():
197
+ """Initialize Amplitude with instance-based API.
198
+
199
+ Returns Amplitude instance or None if API key not configured.
200
+ """
201
+ api_key = os.getenv('AMPLITUDE_API_KEY')
202
+
203
+ if not api_key:
204
+ print("WARNING: Amplitude not configured (AMPLITUDE_API_KEY not set)")
205
+ print(" App will work but analytics won't be tracked")
206
+ return None
207
+
208
+ # Create Amplitude instance
209
+ client = Amplitude(api_key)
210
+
211
+ return client
212
+
213
+
214
+ def get_user_id():
215
+ """Get or create a user ID for this installation.
216
+
217
+ Uses a UUID stored in the data file to represent this user.
218
+ In a real app, this would be your actual user ID.
219
+ """
220
+ import uuid
221
+
222
+ if DATA_FILE.exists():
223
+ data = json.loads(DATA_FILE.read_text())
224
+ if 'user_id' in data:
225
+ return data['user_id']
226
+
227
+ # Create new user ID
228
+ return f"user_{uuid.uuid4().hex[:8]}"
229
+
230
+
231
+ def load_todos():
232
+ """Load todos from disk."""
233
+ if not DATA_FILE.exists():
234
+ return {"user_id": get_user_id(), "todos": []}
235
+
236
+ return json.loads(DATA_FILE.read_text())
237
+
238
+
239
+ def save_todos(data):
240
+ """Save todos to disk."""
241
+ DATA_FILE.write_text(json.dumps(data, indent=2))
242
+
243
+
244
+ def track_event(client, event_name, properties=None):
245
+ """Track an event with Amplitude.
246
+
247
+ Uses the Amplitude Python SDK API.
248
+ """
249
+ if not client:
250
+ return
251
+
252
+ client.track(BaseEvent(
253
+ event_type=event_name,
254
+ user_id=get_user_id(),
255
+ event_properties=properties or {}
256
+ ))
257
+
258
+
259
+ def cmd_add(args, client):
260
+ """Add a new todo item."""
261
+ data = load_todos()
262
+
263
+ todo = {
264
+ "id": len(data["todos"]) + 1,
265
+ "text": args.text,
266
+ "completed": False,
267
+ "created_at": datetime.now().isoformat()
268
+ }
269
+
270
+ data["todos"].append(todo)
271
+ save_todos(data)
272
+
273
+ print(f"Added todo #{todo['id']}: {todo['text']}")
274
+
275
+ # Track the event
276
+ track_event(client, "Todo Added", {
277
+ "todo_id": todo["id"],
278
+ "todo_length": len(todo["text"]),
279
+ "total_todos": len(data["todos"])
280
+ })
281
+
282
+
283
+ def cmd_list(args, client):
284
+ """List all todos."""
285
+ data = load_todos()
286
+
287
+ if not data["todos"]:
288
+ print("No todos yet! Add one with: todo add 'Your task'")
289
+ return
290
+
291
+ print(f"\nYour Todos ({len(data['todos'])} total):\n")
292
+
293
+ for todo in data["todos"]:
294
+ status = "X" if todo["completed"] else " "
295
+ print(f" [{status}] #{todo['id']}: {todo['text']}")
296
+
297
+ print()
298
+
299
+ # Track the event
300
+ track_event(client, "Todos Viewed", {
301
+ "total_todos": len(data["todos"]),
302
+ "completed_todos": sum(1 for t in data["todos"] if t["completed"])
303
+ })
304
+
305
+
306
+ def cmd_complete(args, client):
307
+ """Mark a todo as completed."""
308
+ data = load_todos()
309
+
310
+ todo = next((t for t in data["todos"] if t["id"] == args.id), None)
311
+
312
+ if not todo:
313
+ print(f"ERROR: Todo #{args.id} not found")
314
+ return
315
+
316
+ if todo["completed"]:
317
+ print(f"Todo #{args.id} is already completed")
318
+ return
319
+
320
+ todo["completed"] = True
321
+ todo["completed_at"] = datetime.now().isoformat()
322
+ save_todos(data)
323
+
324
+ print(f"Completed todo #{todo['id']}: {todo['text']}")
325
+
326
+ # Track the event
327
+ track_event(client, "Todo Completed", {
328
+ "todo_id": todo["id"],
329
+ "time_to_complete_hours": (
330
+ datetime.fromisoformat(todo["completed_at"]) -
331
+ datetime.fromisoformat(todo["created_at"])
332
+ ).total_seconds() / 3600
333
+ })
334
+
335
+
336
+ def cmd_delete(args, client):
337
+ """Delete a todo."""
338
+ data = load_todos()
339
+
340
+ todo = next((t for t in data["todos"] if t["id"] == args.id), None)
341
+
342
+ if not todo:
343
+ print(f"ERROR: Todo #{args.id} not found")
344
+ return
345
+
346
+ data["todos"].remove(todo)
347
+ save_todos(data)
348
+
349
+ print(f"Deleted todo #{args.id}")
350
+
351
+ # Track the event
352
+ track_event(client, "Todo Deleted", {
353
+ "todo_id": todo["id"],
354
+ "was_completed": todo["completed"]
355
+ })
356
+
357
+
358
+ def cmd_stats(args, client):
359
+ """Show usage statistics."""
360
+ data = load_todos()
361
+
362
+ total = len(data["todos"])
363
+ completed = sum(1 for t in data["todos"] if t["completed"])
364
+ pending = total - completed
365
+
366
+ print(f"\nStats:\n")
367
+ print(f" Total todos: {total}")
368
+ print(f" Completed: {completed}")
369
+ print(f" Pending: {pending}")
370
+ print(f" Completion rate: {(completed/total*100) if total > 0 else 0:.1f}%")
371
+ print()
372
+
373
+ # Track the event
374
+ track_event(client, "Stats Viewed", {
375
+ "total_todos": total,
376
+ "completed_todos": completed,
377
+ "pending_todos": pending
378
+ })
379
+
380
+
381
+ def main():
382
+ """Main CLI entry point."""
383
+ parser = argparse.ArgumentParser(
384
+ description="Simple todo app with Amplitude analytics"
385
+ )
386
+
387
+ subparsers = parser.add_subparsers(dest="command", help="Available commands")
388
+
389
+ # Add command
390
+ add_parser = subparsers.add_parser("add", help="Add a new todo")
391
+ add_parser.add_argument("text", help="Todo text")
392
+
393
+ # List command
394
+ subparsers.add_parser("list", help="List all todos")
395
+
396
+ # Complete command
397
+ complete_parser = subparsers.add_parser("complete", help="Mark todo as completed")
398
+ complete_parser.add_argument("id", type=int, help="Todo ID")
399
+
400
+ # Delete command
401
+ delete_parser = subparsers.add_parser("delete", help="Delete a todo")
402
+ delete_parser.add_argument("id", type=int, help="Todo ID")
403
+
404
+ # Stats command
405
+ subparsers.add_parser("stats", help="Show statistics")
406
+
407
+ args = parser.parse_args()
408
+
409
+ if not args.command:
410
+ parser.print_help()
411
+ return
412
+
413
+ # Initialize Amplitude
414
+ client = initialize_amplitude()
415
+
416
+ try:
417
+ # Route to appropriate command
418
+ if args.command == "add":
419
+ cmd_add(args, client)
420
+ elif args.command == "list":
421
+ cmd_list(args, client)
422
+ elif args.command == "complete":
423
+ cmd_complete(args, client)
424
+ elif args.command == "delete":
425
+ cmd_delete(args, client)
426
+ elif args.command == "stats":
427
+ cmd_stats(args, client)
428
+
429
+ except Exception as e:
430
+ print(f"ERROR: {e}")
431
+ sys.exit(1)
432
+
433
+ finally:
434
+ # IMPORTANT: Always flush Amplitude to send queued events
435
+ if client:
436
+ client.shutdown()
437
+
438
+
439
+ if __name__ == "__main__":
440
+ main()
441
+
442
+ ```
443
+
444
+ ---
445
+