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