@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,49 @@
1
+ ---
2
+ name: integration-swift
3
+ description: Amplitude integration for Swift iOS and macOS applications
4
+ metadata:
5
+ author: Amplitude
6
+ version: dev
7
+ ---
8
+
9
+ # Amplitude integration for Swift (iOS/macOS)
10
+
11
+ This skill helps you add Amplitude analytics to Swift (iOS/macOS) 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` - Swift (iOS/macOS) 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
+ - Read configuration from environment variables via a dedicated enum with a computed property that calls ProcessInfo.processInfo.environment and fatalErrors if missing — use AMPLITUDE_API_KEY as the environment variable name
43
+ - When adding SPM dependencies to project.pbxproj, create three distinct objects with unique UUIDs — a PBXBuildFile (with productRef), an XCSwiftPackageProductDependency (with package and productName), and an XCRemoteSwiftPackageReference (with repositoryURL and requirement). The build file goes in the Frameworks phase files, the product dependency goes in the target's packageProductDependencies, and the package reference goes in the project's packageReferences.
44
+ - Check the latest release version of Amplitude-Swift at https://github.com/amplitude/Amplitude-Swift/releases before setting the minimumVersion in the SPM package reference — do not hardcode a stale version
45
+ - If the project uses App Sandbox (macOS), add ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES to the target's build settings so Amplitude can reach its servers — do NOT disable the sandbox entirely
46
+
47
+ ## Identifying users
48
+
49
+ 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,660 @@
1
+ # Amplitude Swift (iOS/macOS) Example Project
2
+
3
+ Repository: https://github.com/amplitude/context-hub
4
+ Path: basics/swift
5
+
6
+ ---
7
+
8
+ ## README.md
9
+
10
+ # Amplitude Swift (iOS/macOS) example
11
+
12
+ This is a [SwiftUI](https://developer.apple.com/xcode/swiftui/) example demonstrating Amplitude integration with product analytics and user identification. The app targets both iOS and macOS using `NavigationSplitView`.
13
+
14
+ ## Features
15
+
16
+ - **Product analytics**: Track user events and behaviors
17
+ - **User identification**: Associate events with authenticated users
18
+ - **Multi-platform**: Runs on iOS, iPadOS, macOS, and visionOS
19
+
20
+ ## Getting started
21
+
22
+ ### 1. Add the Amplitude dependency
23
+
24
+ The Xcode project already includes the Amplitude Swift SDK via Swift Package Manager. When you open the project, Xcode will resolve the package automatically.
25
+
26
+ To add it manually to a new project: File > Add Package Dependencies > enter `https://github.com/amplitude/Amplitude-Swift`.
27
+
28
+ ### 2. Configure environment variables
29
+
30
+ Set your Amplitude API key as an environment variable in the Xcode scheme:
31
+
32
+ 1. In Xcode, go to **Product > Scheme > Edit Scheme…**
33
+ 2. Select **Run** in the sidebar
34
+ 3. Go to the **Arguments** tab
35
+ 4. Under **Environment Variables**, add:
36
+
37
+ | Variable | Value |
38
+ |----------|-------|
39
+ | `AMPLITUDE_API_KEY` | Your Amplitude API key |
40
+
41
+ Get your Amplitude API key from your [Amplitude project settings](https://app.amplitude.com).
42
+
43
+ The app reads this via `ProcessInfo.processInfo.environment` and will crash with a clear message if it's missing.
44
+
45
+ ### 3. Build and run
46
+
47
+ Open `BurritoConsiderationClient.xcodeproj` in Xcode and run on an iOS Simulator or macOS.
48
+
49
+ ## Project structure
50
+
51
+ ```
52
+ BurritoConsiderationClient/
53
+ ├── BurritoConsiderationClientApp.swift # App entry point with Amplitude initialization
54
+ ├── ContentView.swift # NavigationSplitView with sidebar routing
55
+ ├── UserState.swift # @Observable user state with Amplitude identify
56
+ ├── LoginView.swift # Login form
57
+ ├── DashboardView.swift # Welcome screen with Dashboard Viewed tracking
58
+ ├── BurritoView.swift # Burrito consideration with event tracking
59
+ ├── ProfileView.swift # Profile with journey progress
60
+ └── Assets.xcassets/ # Asset catalog
61
+ ```
62
+
63
+ ## Key integration points
64
+
65
+ ### Amplitude initialization (BurritoConsiderationClientApp.swift)
66
+
67
+ ```swift
68
+ import AmplitudeSwift
69
+
70
+ let amplitude = Amplitude(configuration: Configuration(
71
+ apiKey: ProcessInfo.processInfo.environment["AMPLITUDE_API_KEY"] ?? ""
72
+ ))
73
+ ```
74
+
75
+ ### User identification (UserState.swift)
76
+
77
+ ```swift
78
+ amplitude.setUserId(userId: username)
79
+ let identifyEvent = IdentifyEvent()
80
+ identifyEvent.userProperties = ["username": username]
81
+ amplitude.identify(event: identifyEvent)
82
+ ```
83
+
84
+ ### Screen view tracking (DashboardView.swift, ProfileView.swift)
85
+
86
+ ```swift
87
+ .onAppear {
88
+ amplitude.track(eventType: "Dashboard Viewed", eventProperties: [
89
+ "username": userState.username ?? "unknown",
90
+ ])
91
+ }
92
+ ```
93
+
94
+ ### Event tracking (BurritoView.swift)
95
+
96
+ ```swift
97
+ amplitude.track(eventType: "Burrito Considered", eventProperties: [
98
+ "total_considerations": burritoConsiderations,
99
+ "username": username ?? "unknown",
100
+ ])
101
+ ```
102
+
103
+ ### User logout (UserState.swift)
104
+
105
+ ```swift
106
+ amplitude.track(eventType: "User Logged Out")
107
+ amplitude.reset()
108
+ ```
109
+
110
+ ## Learn more
111
+
112
+ - [Amplitude iOS SDK Documentation](https://amplitude.com/docs/sdks/analytics/ios)
113
+ - [Amplitude Documentation](https://amplitude.com/docs)
114
+ - [SwiftUI Documentation](https://developer.apple.com/documentation/swiftui)
115
+
116
+ ---
117
+
118
+ ## BurritoConsiderationClient.xcodeproj/project.xcworkspace/contents.xcworkspacedata
119
+
120
+ ```xcworkspacedata
121
+ <?xml version="1.0" encoding="UTF-8"?>
122
+ <Workspace
123
+ version = "1.0">
124
+ <FileRef
125
+ location = "self:">
126
+ </FileRef>
127
+ </Workspace>
128
+
129
+ ```
130
+
131
+ ---
132
+
133
+ ## BurritoConsiderationClient.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
134
+
135
+ ```resolved
136
+ {
137
+ "originHash" : "a2fc303e4b16c93c972ef2ddc4042cf91a9400e5d1639bc9740a80c0336cdd4e",
138
+ "pins" : [
139
+ {
140
+ "identity" : "amplitude-swift",
141
+ "kind" : "remoteSourceControl",
142
+ "location" : "https://github.com/amplitude/Amplitude-Swift",
143
+ "state" : {
144
+ "revision" : "db0d1b9b6a1bfad58ddbe0e2e4b549e0c0d3f28f",
145
+ "version" : "1.12.0"
146
+ }
147
+ }
148
+ ],
149
+ "version" : 3
150
+ }
151
+
152
+ ```
153
+
154
+ ---
155
+
156
+ ## BurritoConsiderationClient.xcodeproj/xcshareddata/xcschemes/BurritoConsiderationClient.xcscheme
157
+
158
+ ```xcscheme
159
+ <?xml version="1.0" encoding="UTF-8"?>
160
+ <Scheme
161
+ LastUpgradeVersion = "2630"
162
+ version = "1.7">
163
+ <BuildAction
164
+ parallelizeBuildables = "YES"
165
+ buildImplicitDependencies = "YES"
166
+ buildArchitectures = "Automatic">
167
+ <BuildActionEntries>
168
+ <BuildActionEntry
169
+ buildForTesting = "YES"
170
+ buildForRunning = "YES"
171
+ buildForProfiling = "YES"
172
+ buildForArchiving = "YES"
173
+ buildForAnalyzing = "YES">
174
+ <BuildableReference
175
+ BuildableIdentifier = "primary"
176
+ BlueprintIdentifier = "1F6BD9732F3520A100189B0B"
177
+ BuildableName = "BurritoConsiderationClient.app"
178
+ BlueprintName = "BurritoConsiderationClient"
179
+ ReferencedContainer = "container:BurritoConsiderationClient.xcodeproj">
180
+ </BuildableReference>
181
+ </BuildActionEntry>
182
+ </BuildActionEntries>
183
+ </BuildAction>
184
+ <TestAction
185
+ buildConfiguration = "Debug"
186
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
187
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
188
+ shouldUseLaunchSchemeArgsEnv = "YES"
189
+ shouldAutocreateTestPlan = "YES">
190
+ </TestAction>
191
+ <LaunchAction
192
+ buildConfiguration = "Debug"
193
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
194
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
195
+ launchStyle = "0"
196
+ useCustomWorkingDirectory = "NO"
197
+ ignoresPersistentStateOnLaunch = "NO"
198
+ debugDocumentVersioning = "YES"
199
+ debugServiceExtension = "internal"
200
+ allowLocationSimulation = "YES">
201
+ <BuildableProductRunnable
202
+ runnableDebuggingMode = "0">
203
+ <BuildableReference
204
+ BuildableIdentifier = "primary"
205
+ BlueprintIdentifier = "1F6BD9732F3520A100189B0B"
206
+ BuildableName = "BurritoConsiderationClient.app"
207
+ BlueprintName = "BurritoConsiderationClient"
208
+ ReferencedContainer = "container:BurritoConsiderationClient.xcodeproj">
209
+ </BuildableReference>
210
+ </BuildableProductRunnable>
211
+ <EnvironmentVariables>
212
+ <EnvironmentVariable
213
+ key = "AMPLITUDE_API_KEY"
214
+ value = "YOUR_AMPLITUDE_API_KEY"
215
+ isEnabled = "YES">
216
+ </EnvironmentVariable>
217
+ </EnvironmentVariables>
218
+ </LaunchAction>
219
+ <ProfileAction
220
+ buildConfiguration = "Release"
221
+ shouldUseLaunchSchemeArgsEnv = "YES"
222
+ savedToolIdentifier = ""
223
+ useCustomWorkingDirectory = "NO"
224
+ debugDocumentVersioning = "YES">
225
+ <BuildableProductRunnable
226
+ runnableDebuggingMode = "0">
227
+ <BuildableReference
228
+ BuildableIdentifier = "primary"
229
+ BlueprintIdentifier = "1F6BD9732F3520A100189B0B"
230
+ BuildableName = "BurritoConsiderationClient.app"
231
+ BlueprintName = "BurritoConsiderationClient"
232
+ ReferencedContainer = "container:BurritoConsiderationClient.xcodeproj">
233
+ </BuildableReference>
234
+ </BuildableProductRunnable>
235
+ </ProfileAction>
236
+ <AnalyzeAction
237
+ buildConfiguration = "Debug">
238
+ </AnalyzeAction>
239
+ <ArchiveAction
240
+ buildConfiguration = "Release"
241
+ revealArchiveInOrganizer = "YES">
242
+ </ArchiveAction>
243
+ </Scheme>
244
+
245
+ ```
246
+
247
+ ---
248
+
249
+ ## BurritoConsiderationClient/BurritoConsiderationClientApp.swift
250
+
251
+ ```swift
252
+ //
253
+ // BurritoConsiderationClientApp.swift
254
+ // BurritoConsiderationClient
255
+ //
256
+ // Created by Danilo Campos on 2/5/26.
257
+ //
258
+
259
+ import SwiftUI
260
+ import AmplitudeSwift
261
+
262
+ enum AmplitudeEnv: String {
263
+ case apiKey = "AMPLITUDE_API_KEY"
264
+
265
+ var value: String {
266
+ guard let value = ProcessInfo.processInfo.environment[rawValue] else {
267
+ fatalError("Set \(rawValue) in the Xcode scheme environment variables.")
268
+ }
269
+ return value
270
+ }
271
+ }
272
+
273
+ @main
274
+ struct BurritoConsiderationClientApp: App {
275
+ @State private var userState: UserState
276
+
277
+ init() {
278
+ let amplitude = Amplitude(configuration: Configuration(apiKey: ProcessInfo.processInfo.environment["AMPLITUDE_API_KEY"] ?? ""))
279
+ _userState = State(initialValue: UserState(amplitude: amplitude))
280
+ }
281
+
282
+ var body: some Scene {
283
+ WindowGroup {
284
+ ContentView()
285
+ .environment(userState)
286
+ }
287
+ }
288
+ }
289
+
290
+ ```
291
+
292
+ ---
293
+
294
+ ## BurritoConsiderationClient/BurritoView.swift
295
+
296
+ ```swift
297
+ //
298
+ // BurritoView.swift
299
+ // BurritoConsiderationClient
300
+ //
301
+
302
+ import SwiftUI
303
+
304
+ struct BurritoView: View {
305
+ @Environment(UserState.self) private var userState
306
+ @State private var showConfirmation = false
307
+
308
+ var body: some View {
309
+ VStack(spacing: 24) {
310
+ Text("Take a moment to truly consider the potential of burritos.")
311
+ .foregroundStyle(.secondary)
312
+ .multilineTextAlignment(.center)
313
+
314
+ Text("🌯")
315
+ .font(.system(size: 80))
316
+
317
+ Button("I Have Considered the Burrito Potential") {
318
+ userState.burritoConsiderations += 1
319
+
320
+ // Amplitude: Track burrito consideration event
321
+ userState.trackBurritoConsidered()
322
+
323
+ showConfirmation = true
324
+ Task {
325
+ try? await Task.sleep(for: .seconds(2))
326
+ showConfirmation = false
327
+ }
328
+ }
329
+ .buttonStyle(.borderedProminent)
330
+ .controlSize(.large)
331
+
332
+ if showConfirmation {
333
+ Text("Thank you for your consideration! Count: \(userState.burritoConsiderations)")
334
+ .foregroundStyle(.green)
335
+ .transition(.opacity)
336
+ }
337
+
338
+ Text("Total considerations: \(userState.burritoConsiderations)")
339
+ .font(.title2)
340
+ .padding(.top)
341
+ }
342
+ .padding()
343
+ .animation(.default, value: showConfirmation)
344
+ .navigationTitle("Burrito Consideration Zone")
345
+ }
346
+ }
347
+
348
+ ```
349
+
350
+ ---
351
+
352
+ ## BurritoConsiderationClient/ContentView.swift
353
+
354
+ ```swift
355
+ //
356
+ // ContentView.swift
357
+ // BurritoConsiderationClient
358
+ //
359
+ // Created by Danilo Campos on 2/5/26.
360
+ //
361
+
362
+ import SwiftUI
363
+
364
+ enum Screen: CaseIterable, Identifiable {
365
+ case dashboard, burrito, profile
366
+
367
+ var id: Self { self }
368
+
369
+ var title: String {
370
+ switch self {
371
+ case .dashboard: "Home"
372
+ case .burrito: "Burrito"
373
+ case .profile: "Profile"
374
+ }
375
+ }
376
+
377
+ var icon: String {
378
+ switch self {
379
+ case .dashboard: "house"
380
+ case .burrito: "fork.knife"
381
+ case .profile: "person.circle"
382
+ }
383
+ }
384
+ }
385
+
386
+ struct ContentView: View {
387
+ @Environment(UserState.self) private var userState
388
+ @State private var selectedScreen: Screen? = .dashboard
389
+
390
+ var body: some View {
391
+ if userState.isLoggedIn {
392
+ NavigationSplitView {
393
+ List(Screen.allCases, selection: $selectedScreen) { screen in
394
+ Label(screen.title, systemImage: screen.icon)
395
+ }
396
+ .navigationTitle("Menu")
397
+ } detail: {
398
+ if let selectedScreen {
399
+ switch selectedScreen {
400
+ case .dashboard:
401
+ DashboardView()
402
+ case .burrito:
403
+ BurritoView()
404
+ case .profile:
405
+ ProfileView()
406
+ }
407
+ } else {
408
+ Text("Select an item from the sidebar")
409
+ .foregroundStyle(.secondary)
410
+ }
411
+ }
412
+ } else {
413
+ NavigationStack {
414
+ LoginView()
415
+ }
416
+ }
417
+ }
418
+ }
419
+
420
+ ```
421
+
422
+ ---
423
+
424
+ ## BurritoConsiderationClient/DashboardView.swift
425
+
426
+ ```swift
427
+ //
428
+ // DashboardView.swift
429
+ // BurritoConsiderationClient
430
+ //
431
+
432
+ import SwiftUI
433
+
434
+ struct DashboardView: View {
435
+ @Environment(UserState.self) private var userState
436
+
437
+ var body: some View {
438
+ VStack(spacing: 20) {
439
+ Text("Welcome back, \(userState.username ?? "")!")
440
+ .font(.largeTitle)
441
+ .padding(.top, 40)
442
+
443
+ Text("You are now logged in. Feel free to explore:")
444
+ .foregroundStyle(.secondary)
445
+
446
+ VStack(alignment: .leading, spacing: 12) {
447
+ Label("Consider the potential of burritos", systemImage: "fork.knife")
448
+ Label("View your profile and statistics", systemImage: "person.circle")
449
+ }
450
+ .padding()
451
+
452
+ Spacer()
453
+ }
454
+ .padding()
455
+ .navigationTitle("Home")
456
+ .onAppear {
457
+ // Amplitude: Track dashboard view
458
+ userState.trackDashboardViewed()
459
+ }
460
+ }
461
+ }
462
+
463
+ ```
464
+
465
+ ---
466
+
467
+ ## BurritoConsiderationClient/LoginView.swift
468
+
469
+ ```swift
470
+ //
471
+ // LoginView.swift
472
+ // BurritoConsiderationClient
473
+ //
474
+
475
+ import SwiftUI
476
+
477
+ struct LoginView: View {
478
+ @Environment(UserState.self) private var userState
479
+ @State private var username = ""
480
+ @State private var password = ""
481
+ @State private var showError = false
482
+
483
+ var body: some View {
484
+ Form {
485
+ Section("Login") {
486
+ TextField("Username", text: $username)
487
+ #if os(iOS)
488
+ .textInputAutocapitalization(.never)
489
+ #endif
490
+ .autocorrectionDisabled()
491
+
492
+ SecureField("Password", text: $password)
493
+ }
494
+
495
+ Section {
496
+ Button("Log In") {
497
+ if !userState.login(username: username, password: password) {
498
+ showError = true
499
+ }
500
+ }
501
+ .disabled(username.isEmpty || password.isEmpty)
502
+ }
503
+ }
504
+ .formStyle(.grouped)
505
+ .navigationTitle("Burrito Consideration")
506
+ .alert("Login Failed", isPresented: $showError) {
507
+ Button("OK", role: .cancel) { }
508
+ } message: {
509
+ Text("Please enter a valid username and password.")
510
+ }
511
+ }
512
+ }
513
+
514
+ ```
515
+
516
+ ---
517
+
518
+ ## BurritoConsiderationClient/ProfileView.swift
519
+
520
+ ```swift
521
+ //
522
+ // ProfileView.swift
523
+ // BurritoConsiderationClient
524
+ //
525
+
526
+ import SwiftUI
527
+
528
+ struct ProfileView: View {
529
+ @Environment(UserState.self) private var userState
530
+
531
+ private var journeyMessage: String {
532
+ switch userState.burritoConsiderations {
533
+ case 0:
534
+ "You haven't considered any burritos yet. Visit the Burrito Consideration page to start!"
535
+ case 1:
536
+ "You've considered the burrito potential once. Keep going!"
537
+ case 2...4:
538
+ "You're getting the hang of burrito consideration!"
539
+ case 5...9:
540
+ "You're becoming a burrito consideration expert!"
541
+ default:
542
+ "You are a true burrito consideration master!"
543
+ }
544
+ }
545
+
546
+ var body: some View {
547
+ Form {
548
+ Section("Your Information") {
549
+ LabeledContent("Username", value: userState.username ?? "—")
550
+ LabeledContent("Burrito Considerations", value: "\(userState.burritoConsiderations)")
551
+ }
552
+
553
+ Section("Your Burrito Journey") {
554
+ Text(journeyMessage)
555
+ }
556
+
557
+ Section {
558
+ Button("Log Out", role: .destructive) {
559
+ userState.logout()
560
+ }
561
+ }
562
+ }
563
+ .formStyle(.grouped)
564
+ .navigationTitle("Profile")
565
+ .onAppear {
566
+ // Amplitude: Track profile view
567
+ userState.trackProfileViewed()
568
+ }
569
+ }
570
+ }
571
+
572
+ ```
573
+
574
+ ---
575
+
576
+ ## BurritoConsiderationClient/UserState.swift
577
+
578
+ ```swift
579
+ //
580
+ // UserState.swift
581
+ // BurritoConsiderationClient
582
+ //
583
+
584
+ import Foundation
585
+ import AmplitudeSwift
586
+
587
+ @Observable
588
+ class UserState {
589
+ var username: String?
590
+ var burritoConsiderations: Int = 0
591
+
592
+ private let amplitude: Amplitude
593
+
594
+ init(amplitude: Amplitude) {
595
+ self.amplitude = amplitude
596
+ }
597
+
598
+ var isLoggedIn: Bool {
599
+ username != nil
600
+ }
601
+
602
+ func login(username: String, password: String) -> Bool {
603
+ // In a real app, validate credentials against a backend
604
+ guard !username.isEmpty, !password.isEmpty else {
605
+ return false
606
+ }
607
+
608
+ self.username = username
609
+ self.burritoConsiderations = 0
610
+
611
+ // Amplitude: Identify user on login
612
+ amplitude.setUserId(userId: username)
613
+ let identifyEvent = IdentifyEvent()
614
+ identifyEvent.userProperties = ["username": username]
615
+ amplitude.identify(event: identifyEvent)
616
+
617
+ // Amplitude: Track login event
618
+ amplitude.track(eventType: "User Logged In", eventProperties: [
619
+ "username": username,
620
+ ])
621
+
622
+ return true
623
+ }
624
+
625
+ func logout() {
626
+ // Amplitude: Track logout event before reset
627
+ amplitude.track(eventType: "User Logged Out")
628
+ amplitude.reset()
629
+
630
+ username = nil
631
+ burritoConsiderations = 0
632
+ }
633
+
634
+ func trackBurritoConsidered() {
635
+ // Amplitude: Track burrito consideration event
636
+ amplitude.track(eventType: "Burrito Considered", eventProperties: [
637
+ "total_considerations": burritoConsiderations,
638
+ "username": username ?? "unknown",
639
+ ])
640
+ }
641
+
642
+ func trackDashboardViewed() {
643
+ // Amplitude: Track dashboard view
644
+ amplitude.track(eventType: "Dashboard Viewed", eventProperties: [
645
+ "username": username ?? "unknown",
646
+ ])
647
+ }
648
+
649
+ func trackProfileViewed() {
650
+ // Amplitude: Track profile view
651
+ amplitude.track(eventType: "Profile Viewed", eventProperties: [
652
+ "username": username ?? "unknown",
653
+ ])
654
+ }
655
+ }
656
+
657
+ ```
658
+
659
+ ---
660
+