@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.
- package/README.md +171 -74
- package/dist/bin.js +338 -222
- package/dist/src/lib/agent-interface.js +64 -9
- package/dist/src/lib/agent-runner.js +1 -10
- package/dist/src/lib/api.d.ts +22 -4
- package/dist/src/lib/api.js +114 -12
- package/dist/src/lib/commandments.js +14 -1
- package/dist/src/lib/constants.d.ts +6 -5
- package/dist/src/lib/constants.js +13 -13
- package/dist/src/lib/credential-resolution.d.ts +45 -0
- package/dist/src/lib/credential-resolution.js +311 -0
- package/dist/src/lib/exit-codes.d.ts +10 -0
- package/dist/src/lib/exit-codes.js +12 -0
- package/dist/src/lib/health-checks/statuspage.d.ts +1 -0
- package/dist/src/lib/health-checks/statuspage.js +5 -1
- package/dist/src/lib/mode-config.d.ts +14 -0
- package/dist/src/lib/mode-config.js +14 -0
- package/dist/src/lib/session-checkpoint.d.ts +27 -0
- package/dist/src/lib/session-checkpoint.js +134 -0
- package/dist/src/lib/wizard-session.d.ts +44 -1
- package/dist/src/lib/wizard-session.js +70 -14
- package/dist/src/lib/wizard-tools.js +19 -4
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +3 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +6 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +3 -1
- package/dist/src/ui/agent-ui.d.ts +91 -0
- package/dist/src/ui/agent-ui.js +277 -0
- package/dist/src/ui/logging-ui.js +1 -1
- package/dist/src/ui/tui/App.d.ts +12 -0
- package/dist/src/ui/tui/App.js +29 -18
- package/dist/src/ui/tui/components/AmplitudeLogo.js +16 -17
- package/dist/src/ui/tui/components/AmplitudeTextLogo.d.ts +0 -2
- package/dist/src/ui/tui/components/AmplitudeTextLogo.js +53 -18
- package/dist/src/ui/tui/components/BrailleSpinner.d.ts +8 -0
- package/dist/src/ui/tui/components/BrailleSpinner.js +15 -0
- package/dist/src/ui/tui/components/ConsoleView.d.ts +8 -11
- package/dist/src/ui/tui/components/ConsoleView.js +51 -34
- package/dist/src/ui/tui/components/HeaderBar.d.ts +12 -0
- package/dist/src/ui/tui/components/HeaderBar.js +17 -0
- package/dist/src/ui/tui/components/JourneyStepper.d.ts +16 -0
- package/dist/src/ui/tui/components/JourneyStepper.js +83 -0
- package/dist/src/ui/tui/components/KeyHintBar.d.ts +19 -0
- package/dist/src/ui/tui/components/KeyHintBar.js +20 -0
- package/dist/src/ui/tui/console-commands.d.ts +1 -2
- package/dist/src/ui/tui/console-commands.js +48 -7
- package/dist/src/ui/tui/flows.d.ts +1 -1
- package/dist/src/ui/tui/flows.js +1 -1
- package/dist/src/ui/tui/hooks/useAsyncEffect.d.ts +15 -0
- package/dist/src/ui/tui/hooks/useAsyncEffect.js +35 -0
- package/dist/src/ui/tui/hooks/useWizardStore.d.ts +9 -0
- package/dist/src/ui/tui/hooks/useWizardStore.js +11 -0
- package/dist/src/ui/tui/ink-ui.js +1 -1
- package/dist/src/ui/tui/primitives/DissolveTransition.js +4 -5
- package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +3 -1
- package/dist/src/ui/tui/primitives/EventPlanViewer.js +8 -3
- package/dist/src/ui/tui/primitives/ProgressList.js +1 -1
- package/dist/src/ui/tui/primitives/SlashCommandInput.js +19 -4
- package/dist/src/ui/tui/primitives/SplitView.d.ts +2 -1
- package/dist/src/ui/tui/primitives/SplitView.js +10 -2
- package/dist/src/ui/tui/primitives/TabContainer.js +10 -2
- package/dist/src/ui/tui/primitives/index.d.ts +0 -1
- package/dist/src/ui/tui/primitives/index.js +0 -1
- package/dist/src/ui/tui/router.js +1 -1
- package/dist/src/ui/tui/screen-registry.d.ts +0 -7
- package/dist/src/ui/tui/screen-registry.js +13 -4
- package/dist/src/ui/tui/screens/ActivationOptionsScreen.d.ts +2 -2
- package/dist/src/ui/tui/screens/ActivationOptionsScreen.js +8 -8
- package/dist/src/ui/tui/screens/AuthScreen.js +57 -27
- package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +2 -12
- package/dist/src/ui/tui/screens/ChecklistScreen.js +22 -33
- package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +3 -12
- package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +109 -39
- package/dist/src/ui/tui/screens/DataSetupScreen.d.ts +3 -3
- package/dist/src/ui/tui/screens/DataSetupScreen.js +17 -10
- package/dist/src/ui/tui/screens/IntroScreen.d.ts +5 -3
- package/dist/src/ui/tui/screens/IntroScreen.js +132 -41
- package/dist/src/ui/tui/screens/LoginScreen.d.ts +1 -1
- package/dist/src/ui/tui/screens/LoginScreen.js +4 -4
- package/dist/src/ui/tui/screens/LogoutScreen.d.ts +4 -2
- package/dist/src/ui/tui/screens/LogoutScreen.js +17 -5
- package/dist/src/ui/tui/screens/McpScreen.d.ts +4 -4
- package/dist/src/ui/tui/screens/McpScreen.js +25 -17
- package/dist/src/ui/tui/screens/OutageScreen.d.ts +1 -1
- package/dist/src/ui/tui/screens/OutageScreen.js +5 -5
- package/dist/src/ui/tui/screens/OutroScreen.d.ts +5 -0
- package/dist/src/ui/tui/screens/OutroScreen.js +21 -14
- package/dist/src/ui/tui/screens/RegionSelectScreen.js +15 -13
- package/dist/src/ui/tui/screens/RunScreen.d.ts +7 -5
- package/dist/src/ui/tui/screens/RunScreen.js +102 -157
- package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +1 -1
- package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +6 -5
- package/dist/src/ui/tui/screens/SetupScreen.d.ts +1 -1
- package/dist/src/ui/tui/screens/SetupScreen.js +7 -7
- package/dist/src/ui/tui/screens/SlackScreen.d.ts +2 -2
- package/dist/src/ui/tui/screens/SlackScreen.js +60 -35
- package/dist/src/ui/tui/session-constants.d.ts +41 -0
- package/dist/src/ui/tui/session-constants.js +38 -0
- package/dist/src/ui/tui/start-tui.d.ts +3 -1
- package/dist/src/ui/tui/start-tui.js +14 -10
- package/dist/src/ui/tui/store.d.ts +2 -1
- package/dist/src/ui/tui/store.js +33 -7
- package/dist/src/ui/tui/styles.d.ts +75 -19
- package/dist/src/ui/tui/styles.js +101 -19
- package/dist/src/ui/tui/utils/classify-error.d.ts +14 -0
- package/dist/src/ui/tui/utils/classify-error.js +90 -0
- package/dist/src/ui/tui/utils/diagnostics.d.ts +21 -0
- package/dist/src/ui/tui/utils/diagnostics.js +72 -0
- package/dist/src/ui/tui/utils/with-retry.d.ts +12 -0
- package/dist/src/ui/tui/utils/with-retry.js +32 -0
- package/dist/src/ui/tui/utils/with-timeout.d.ts +10 -0
- package/dist/src/ui/tui/utils/with-timeout.js +24 -0
- package/dist/src/utils/ampli-settings.d.ts +1 -1
- package/dist/src/utils/ampli-settings.js +15 -5
- package/dist/src/utils/api-key-store.js +5 -5
- package/dist/src/utils/atomic-write.d.ts +15 -0
- package/dist/src/utils/atomic-write.js +34 -0
- package/dist/src/utils/setup-utils.js +2 -2
- package/dist/src/utils/token-refresh.d.ts +22 -0
- package/dist/src/utils/token-refresh.js +79 -0
- package/dist/src/utils/wizard-abort.js +6 -1
- package/package.json +6 -6
- package/skills/instrumentation/add-analytics-instrumentation/SKILL.md +142 -0
- package/skills/instrumentation/diff-intake/SKILL.md +128 -0
- package/skills/instrumentation/discover-analytics-patterns/SKILL.md +185 -0
- package/skills/instrumentation/discover-event-surfaces/SKILL.md +322 -0
- package/skills/instrumentation/discover-event-surfaces/references/best-practices.md +563 -0
- package/skills/instrumentation/instrument-events/SKILL.md +169 -0
- package/skills/instrumentation/instrument-events/references/best-practices.md +563 -0
- package/skills/integration/integration-android/SKILL.md +49 -0
- package/skills/integration/integration-android/references/EXAMPLE.md +1977 -0
- package/skills/integration/integration-android/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-android/references/analytics.md +1778 -0
- package/skills/integration/integration-android/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-android/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-android/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-android/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-angular/SKILL.md +49 -0
- package/skills/integration/integration-angular/references/EXAMPLE.md +899 -0
- package/skills/integration/integration-angular/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-angular/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-angular/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-angular/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-angular/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-angular/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-astro-hybrid/SKILL.md +56 -0
- package/skills/integration/integration-astro-hybrid/references/EXAMPLE.md +1095 -0
- package/skills/integration/integration-astro-hybrid/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-astro-hybrid/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-astro-ssr/SKILL.md +52 -0
- package/skills/integration/integration-astro-ssr/references/EXAMPLE.md +1106 -0
- package/skills/integration/integration-astro-ssr/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-astro-ssr/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-astro-static/SKILL.md +49 -0
- package/skills/integration/integration-astro-static/references/EXAMPLE.md +910 -0
- package/skills/integration/integration-astro-static/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-astro-static/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-astro-static/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-astro-static/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-astro-static/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-astro-static/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-astro-view-transitions/SKILL.md +51 -0
- package/skills/integration/integration-astro-view-transitions/references/EXAMPLE.md +979 -0
- package/skills/integration/integration-astro-view-transitions/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-astro-view-transitions/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-django/SKILL.md +57 -0
- package/skills/integration/integration-django/references/EXAMPLE.md +1005 -0
- package/skills/integration/integration-django/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-django/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-django/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-django/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-django/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-django/references/python.md +1424 -0
- package/skills/integration/integration-expo/SKILL.md +53 -0
- package/skills/integration/integration-expo/references/EXAMPLE.md +1291 -0
- package/skills/integration/integration-expo/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-expo/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-expo/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-expo/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-expo/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-expo/references/react-native-sdk.md +2819 -0
- package/skills/integration/integration-fastapi/SKILL.md +57 -0
- package/skills/integration/integration-fastapi/references/EXAMPLE.md +1389 -0
- package/skills/integration/integration-fastapi/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-fastapi/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-fastapi/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-fastapi/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-fastapi/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-fastapi/references/python.md +1424 -0
- package/skills/integration/integration-flask/SKILL.md +56 -0
- package/skills/integration/integration-flask/references/EXAMPLE.md +1130 -0
- package/skills/integration/integration-flask/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-flask/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-flask/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-flask/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-flask/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-flask/references/python.md +1424 -0
- package/skills/integration/integration-javascript_node/SKILL.md +54 -0
- package/skills/integration/integration-javascript_node/references/EXAMPLE.md +365 -0
- package/skills/integration/integration-javascript_node/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-javascript_node/references/analytics.md +1778 -0
- package/skills/integration/integration-javascript_node/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-javascript_node/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-javascript_node/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-javascript_node/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-javascript_web/SKILL.md +58 -0
- package/skills/integration/integration-javascript_web/references/EXAMPLE.md +451 -0
- package/skills/integration/integration-javascript_web/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-javascript_web/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-javascript_web/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-javascript_web/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-javascript_web/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-javascript_web/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-laravel/SKILL.md +52 -0
- package/skills/integration/integration-laravel/references/EXAMPLE.md +2039 -0
- package/skills/integration/integration-laravel/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-laravel/references/analytics.md +1778 -0
- package/skills/integration/integration-laravel/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-laravel/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-laravel/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-laravel/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nextjs-app-router/SKILL.md +54 -0
- package/skills/integration/integration-nextjs-app-router/references/EXAMPLE.md +673 -0
- package/skills/integration/integration-nextjs-app-router/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nextjs-app-router/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-nextjs-pages-router/SKILL.md +54 -0
- package/skills/integration/integration-nextjs-pages-router/references/EXAMPLE.md +735 -0
- package/skills/integration/integration-nextjs-pages-router/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nextjs-pages-router/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-nuxt-3.6/SKILL.md +46 -0
- package/skills/integration/integration-nuxt-3.6/references/EXAMPLE.md +8422 -0
- package/skills/integration/integration-nuxt-3.6/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nuxt-3.6/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-nuxt-4/SKILL.md +46 -0
- package/skills/integration/integration-nuxt-4/references/EXAMPLE.md +8670 -0
- package/skills/integration/integration-nuxt-4/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nuxt-4/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-python/SKILL.md +53 -0
- package/skills/integration/integration-python/references/EXAMPLE.md +445 -0
- package/skills/integration/integration-python/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-python/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-python/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-python/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-python/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-python/references/python.md +1424 -0
- package/skills/integration/integration-react-native/SKILL.md +49 -0
- package/skills/integration/integration-react-native/references/EXAMPLE.md +2253 -0
- package/skills/integration/integration-react-native/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-native/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-native/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-native/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-native/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-native/references/react-native-sdk.md +2819 -0
- package/skills/integration/integration-react-react-router-6/SKILL.md +53 -0
- package/skills/integration/integration-react-react-router-6/references/EXAMPLE.md +570 -0
- package/skills/integration/integration-react-react-router-6/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-react-router-6/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-react-router-7-data/SKILL.md +53 -0
- package/skills/integration/integration-react-react-router-7-data/references/EXAMPLE.md +830 -0
- package/skills/integration/integration-react-react-router-7-data/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-react-router-7-data/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-react-router-7-declarative/SKILL.md +53 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/EXAMPLE.md +609 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-react-router-7-framework/SKILL.md +53 -0
- package/skills/integration/integration-react-react-router-7-framework/references/EXAMPLE.md +1081 -0
- package/skills/integration/integration-react-react-router-7-framework/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-react-router-7-framework/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-tanstack-router-code-based/SKILL.md +57 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/EXAMPLE.md +659 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-tanstack-router-file-based/SKILL.md +57 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/EXAMPLE.md +777 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-vite/SKILL.md +53 -0
- package/skills/integration/integration-react-vite/references/EXAMPLE.md +542 -0
- package/skills/integration/integration-react-vite/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-vite/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-vite/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-vite/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-vite/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-vite/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-ruby/SKILL.md +50 -0
- package/skills/integration/integration-ruby/references/EXAMPLE.md +420 -0
- package/skills/integration/integration-ruby/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-ruby/references/analytics.md +1778 -0
- package/skills/integration/integration-ruby/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-ruby/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-ruby/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-ruby/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-ruby-on-rails/SKILL.md +55 -0
- package/skills/integration/integration-ruby-on-rails/references/EXAMPLE.md +1013 -0
- package/skills/integration/integration-ruby-on-rails/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-ruby-on-rails/references/analytics.md +1778 -0
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-sveltekit/SKILL.md +47 -0
- package/skills/integration/integration-sveltekit/references/EXAMPLE.md +14121 -0
- package/skills/integration/integration-sveltekit/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-sveltekit/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-sveltekit/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-sveltekit/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-sveltekit/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-sveltekit/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-swift/SKILL.md +49 -0
- package/skills/integration/integration-swift/references/EXAMPLE.md +660 -0
- package/skills/integration/integration-swift/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-swift/references/analytics.md +1778 -0
- package/skills/integration/integration-swift/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-swift/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-swift/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-swift/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-tanstack-start/SKILL.md +58 -0
- package/skills/integration/integration-tanstack-start/references/EXAMPLE.md +998 -0
- package/skills/integration/integration-tanstack-start/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-tanstack-start/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-vue-3/SKILL.md +46 -0
- package/skills/integration/integration-vue-3/references/EXAMPLE.md +846 -0
- package/skills/integration/integration-vue-3/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-vue-3/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-vue-3/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-vue-3/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-vue-3/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-vue-3/references/browser-sdk-2.md +4680 -0
- package/skills/taxonomy/amplitude-quickstart-taxonomy-agent/SKILL.md +228 -0
- package/dist/src/ui/tui/components/TitleBar.d.ts +0 -8
- package/dist/src/ui/tui/components/TitleBar.js +0 -27
- package/dist/src/ui/tui/primitives/KagiSmallWebViewer.d.ts +0 -7
- package/dist/src/ui/tui/primitives/KagiSmallWebViewer.js +0 -101
- package/dist/src/utils/anthropic-status.d.ts +0 -17
- 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
|
+
|