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