@amplitude/wizard 1.0.0-beta.1 → 1.0.0-beta.5
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 +376 -150
- 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 +5 -4
- package/dist/src/lib/constants.js +11 -9
- 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/feature-flags.d.ts +37 -0
- package/dist/src/lib/feature-flags.js +119 -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 +54 -1
- package/dist/src/lib/wizard-session.js +71 -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 +52 -38
- 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 -4
- package/dist/src/ui/tui/console-commands.js +48 -13
- 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.d.ts +2 -1
- package/dist/src/ui/tui/screens/AuthScreen.js +144 -32
- 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 +114 -33
- 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 -15
- 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 -7
- package/dist/src/ui/tui/screens/SlackScreen.js +60 -45
- 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 +5 -1
- package/dist/src/ui/tui/store.js +45 -6
- 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/analytics.d.ts +18 -0
- package/dist/src/utils/analytics.js +35 -3
- 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 +16 -17
- 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/package.json +0 -145
- package/dist/src/ui/tui/components/TitleBar.d.ts +0 -6
- package/dist/src/ui/tui/components/TitleBar.js +0 -16
- 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
package/dist/bin.js
CHANGED
|
@@ -37,12 +37,127 @@ if (!(0, semver_1.satisfies)(process.version, NODE_VERSION_RANGE)) {
|
|
|
37
37
|
(0, logging_1.red)(`Amplitude wizard requires Node.js ${NODE_VERSION_RANGE}. You are using Node.js ${process.version}. Please upgrade your Node.js version.`);
|
|
38
38
|
process.exit(1);
|
|
39
39
|
}
|
|
40
|
-
const run_1 = require("./src/run");
|
|
41
40
|
const environment_1 = require("./src/utils/environment");
|
|
42
41
|
const ui_1 = require("./src/ui");
|
|
43
42
|
const logging_ui_1 = require("./src/ui/logging-ui");
|
|
44
43
|
const shell_completions_1 = require("./src/utils/shell-completions");
|
|
45
|
-
const
|
|
44
|
+
const exit_codes_1 = require("./src/lib/exit-codes");
|
|
45
|
+
// Dynamic import to avoid preloading wizard-session.ts as CJS, which
|
|
46
|
+
// prevents the TUI's ESM dynamic imports from resolving named exports.
|
|
47
|
+
const lazyRunWizard = async (...args) => {
|
|
48
|
+
const { runWizard } = await import('./src/run.js');
|
|
49
|
+
return runWizard(...args);
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Build a WizardSession from CLI argv, avoiding the repeated 12-field literal.
|
|
53
|
+
*/
|
|
54
|
+
const buildSessionFromOptions = async (options, overrides) => {
|
|
55
|
+
const { buildSession } = await import('./src/lib/wizard-session.js');
|
|
56
|
+
return buildSession({
|
|
57
|
+
debug: options.debug,
|
|
58
|
+
verbose: options.verbose,
|
|
59
|
+
forceInstall: options.forceInstall,
|
|
60
|
+
installDir: options.installDir,
|
|
61
|
+
ci: overrides?.ci ?? false,
|
|
62
|
+
signup: options.signup,
|
|
63
|
+
localMcp: options.localMcp,
|
|
64
|
+
apiKey: options.apiKey,
|
|
65
|
+
menu: options.menu,
|
|
66
|
+
integration: options.integration,
|
|
67
|
+
benchmark: options.benchmark,
|
|
68
|
+
projectId: options.projectId,
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Shared credential resolution for non-interactive modes (agent + CI).
|
|
73
|
+
* Handles --api-key shortcut, OAuth token refresh, and pendingOrgs.
|
|
74
|
+
*
|
|
75
|
+
* @param mode - 'agent' prompts via AgentUI, 'ci' auto-selects first env
|
|
76
|
+
*/
|
|
77
|
+
const resolveNonInteractiveCredentials = async (session, options, mode, agentUI) => {
|
|
78
|
+
// If --api-key was provided, skip OAuth entirely
|
|
79
|
+
if (session.apiKey) {
|
|
80
|
+
const { DEFAULT_HOST_URL } = await import('./src/lib/constants.js');
|
|
81
|
+
session.credentials = {
|
|
82
|
+
accessToken: session.apiKey,
|
|
83
|
+
projectApiKey: session.apiKey,
|
|
84
|
+
host: DEFAULT_HOST_URL,
|
|
85
|
+
projectId: session.projectId ?? 0,
|
|
86
|
+
};
|
|
87
|
+
session.projectHasData = false;
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// Resolve credentials from stored OAuth tokens
|
|
91
|
+
const { resolveCredentials, resolveEnvironmentSelection } = await import('./src/lib/credential-resolution.js');
|
|
92
|
+
await resolveCredentials(session, {
|
|
93
|
+
requireOrgId: false,
|
|
94
|
+
org: options.org,
|
|
95
|
+
env: options.env,
|
|
96
|
+
});
|
|
97
|
+
// Handle multiple environments
|
|
98
|
+
if (session.pendingOrgs && !session.credentials) {
|
|
99
|
+
if (mode === 'ci') {
|
|
100
|
+
// CI mode: auto-select first environment with an API key
|
|
101
|
+
for (const org of session.pendingOrgs) {
|
|
102
|
+
for (const ws of org.workspaces) {
|
|
103
|
+
const env = (ws.environments ?? [])
|
|
104
|
+
.filter((e) => e.app?.apiKey)
|
|
105
|
+
.sort((a, b) => a.rank - b.rank)[0];
|
|
106
|
+
if (env) {
|
|
107
|
+
await resolveEnvironmentSelection(session, {
|
|
108
|
+
orgId: org.id,
|
|
109
|
+
workspaceId: ws.id,
|
|
110
|
+
env: env.name,
|
|
111
|
+
});
|
|
112
|
+
(0, ui_1.getUI)().log.info(`Resolved Amplitude API key non-interactively (CI mode): ${org.name} / ${ws.name} / ${env.name}`);
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (session.credentials)
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else if (agentUI) {
|
|
121
|
+
// Agent mode: list envs and prompt via stdin
|
|
122
|
+
const envList = [];
|
|
123
|
+
for (const org of session.pendingOrgs) {
|
|
124
|
+
for (const ws of org.workspaces) {
|
|
125
|
+
for (const env of ws.environments ?? []) {
|
|
126
|
+
if (env.app?.apiKey) {
|
|
127
|
+
envList.push(` --env "${env.name}" (${org.name} / ${ws.name})`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
(0, ui_1.getUI)().log.info(`Multiple environments found. Re-run with one of:\n${envList.join('\n')}`);
|
|
133
|
+
const selection = await agentUI.promptEnvironmentSelection(session.pendingOrgs);
|
|
134
|
+
const resolved = await resolveEnvironmentSelection(session, selection);
|
|
135
|
+
if (!resolved) {
|
|
136
|
+
process.exit(exit_codes_1.ExitCode.AUTH_REQUIRED);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// If we still don't have credentials, auth is required
|
|
141
|
+
if (!session.credentials) {
|
|
142
|
+
if (mode === 'agent') {
|
|
143
|
+
(0, ui_1.getUI)().log.error('Could not resolve credentials. ' +
|
|
144
|
+
'Please log in first by running: amplitude-wizard login');
|
|
145
|
+
process.exit(exit_codes_1.ExitCode.AUTH_REQUIRED);
|
|
146
|
+
}
|
|
147
|
+
// CI mode falls through — runWizard will handle missing credentials
|
|
148
|
+
}
|
|
149
|
+
// Log what was resolved so the caller can see it
|
|
150
|
+
if (mode === 'agent' && session.credentials) {
|
|
151
|
+
const parts = [
|
|
152
|
+
session.selectedOrgName,
|
|
153
|
+
session.selectedWorkspaceName,
|
|
154
|
+
session.selectedProjectName,
|
|
155
|
+
].filter(Boolean);
|
|
156
|
+
if (parts.length > 0) {
|
|
157
|
+
(0, ui_1.getUI)().log.info(`Using: ${parts.join(' / ')}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
};
|
|
46
161
|
if (process.env.NODE_ENV === 'test') {
|
|
47
162
|
void (async () => {
|
|
48
163
|
try {
|
|
@@ -98,6 +213,14 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
98
213
|
describe: 'Amplitude project ID to use (optional; when not set, uses default from API key or OAuth)\nenv: AMPLITUDE_WIZARD_PROJECT_ID',
|
|
99
214
|
type: 'string',
|
|
100
215
|
},
|
|
216
|
+
org: {
|
|
217
|
+
describe: 'Amplitude org name to use (for multi-org accounts)\nenv: AMPLITUDE_WIZARD_ORG',
|
|
218
|
+
type: 'string',
|
|
219
|
+
},
|
|
220
|
+
env: {
|
|
221
|
+
describe: 'Environment name to use (e.g. "Production", "Development")\nenv: AMPLITUDE_WIZARD_ENV',
|
|
222
|
+
type: 'string',
|
|
223
|
+
},
|
|
101
224
|
})
|
|
102
225
|
.command(['$0'], 'Run the Amplitude setup wizard', (yargs) => {
|
|
103
226
|
return yargs.options({
|
|
@@ -135,30 +258,62 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
135
258
|
describe: 'Run in benchmark mode with per-phase token tracking\nenv: AMPLITUDE_WIZARD_BENCHMARK',
|
|
136
259
|
type: 'boolean',
|
|
137
260
|
},
|
|
261
|
+
agent: {
|
|
262
|
+
default: false,
|
|
263
|
+
describe: 'Run in agent mode with structured JSON output\nenv: AMPLITUDE_WIZARD_AGENT',
|
|
264
|
+
type: 'boolean',
|
|
265
|
+
},
|
|
266
|
+
yes: {
|
|
267
|
+
alias: 'y',
|
|
268
|
+
default: false,
|
|
269
|
+
describe: 'Skip all prompts and use defaults (same as --ci)',
|
|
270
|
+
type: 'boolean',
|
|
271
|
+
},
|
|
272
|
+
classic: {
|
|
273
|
+
default: false,
|
|
274
|
+
describe: 'Use the classic prompt-based UI instead of the rich TUI\nenv: AMPLITUDE_WIZARD_CLASSIC',
|
|
275
|
+
type: 'boolean',
|
|
276
|
+
},
|
|
138
277
|
});
|
|
139
278
|
}, (argv) => {
|
|
140
279
|
const options = { ...argv };
|
|
141
280
|
// CI mode validation and TTY check
|
|
142
|
-
if (options.
|
|
143
|
-
|
|
281
|
+
if (options.agent ||
|
|
282
|
+
process.env.AMPLITUDE_WIZARD_AGENT === '1' ||
|
|
283
|
+
(!options.ci &&
|
|
284
|
+
!options.yes &&
|
|
285
|
+
!options.classic &&
|
|
286
|
+
process.env.AMPLITUDE_WIZARD_CLASSIC !== '1' &&
|
|
287
|
+
(0, environment_1.isNonInteractiveEnvironment)())) {
|
|
288
|
+
// Agent mode (explicit --agent or auto-detected non-TTY)
|
|
289
|
+
if (!options.agent)
|
|
290
|
+
options.agent = true;
|
|
291
|
+
void (async () => {
|
|
292
|
+
const { AgentUI } = await import('./src/ui/agent-ui.js');
|
|
293
|
+
const agentUI = new AgentUI();
|
|
294
|
+
(0, ui_1.setUI)(agentUI);
|
|
295
|
+
if (!options.installDir)
|
|
296
|
+
options.installDir = process.cwd();
|
|
297
|
+
const session = await buildSessionFromOptions(options);
|
|
298
|
+
await resolveNonInteractiveCredentials(session, options, 'agent', agentUI);
|
|
299
|
+
await lazyRunWizard(options, session);
|
|
300
|
+
})();
|
|
301
|
+
}
|
|
302
|
+
else if (options.ci || options.yes) {
|
|
303
|
+
// CI mode: no prompts, auto-select first environment
|
|
144
304
|
(0, ui_1.setUI)(new logging_ui_1.LoggingUI());
|
|
145
|
-
if (!options.installDir)
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
305
|
+
if (!options.installDir)
|
|
306
|
+
options.installDir = process.cwd();
|
|
307
|
+
void (async () => {
|
|
308
|
+
const session = await buildSessionFromOptions(options, { ci: true });
|
|
309
|
+
await resolveNonInteractiveCredentials(session, options, 'ci');
|
|
310
|
+
await lazyRunWizard(options, session);
|
|
311
|
+
})();
|
|
151
312
|
}
|
|
152
|
-
else if (
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
'It appears you are running in a non-interactive environment.\n' +
|
|
157
|
-
'Please run the wizard in an interactive terminal.\n\n' +
|
|
158
|
-
'For CI/CD environments, use --ci mode:\n' +
|
|
159
|
-
' npx @amplitude/wizard --ci --install-dir . [--api-key <your-key>]\n' +
|
|
160
|
-
' (--api-key is optional when a key can be resolved from env or stored credentials.)');
|
|
161
|
-
process.exit(1);
|
|
313
|
+
else if (options.classic ||
|
|
314
|
+
process.env.AMPLITUDE_WIZARD_CLASSIC === '1') {
|
|
315
|
+
// Classic mode: interactive prompts without the rich TUI
|
|
316
|
+
void lazyRunWizard(options);
|
|
162
317
|
}
|
|
163
318
|
else {
|
|
164
319
|
// Interactive TTY: launch the Ink TUI
|
|
@@ -168,23 +323,9 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
168
323
|
installCompletions();
|
|
169
324
|
try {
|
|
170
325
|
const { startTUI } = await import('./src/ui/tui/start-tui.js');
|
|
171
|
-
const { buildSession } = await import('./src/lib/wizard-session.js');
|
|
172
326
|
const tui = startTUI(WIZARD_VERSION);
|
|
173
327
|
// Build session from CLI args and attach to store
|
|
174
|
-
const session =
|
|
175
|
-
debug: options.debug,
|
|
176
|
-
verbose: options.verbose,
|
|
177
|
-
forceInstall: options.forceInstall,
|
|
178
|
-
installDir: options.installDir,
|
|
179
|
-
ci: false,
|
|
180
|
-
signup: options.signup,
|
|
181
|
-
localMcp: options.localMcp,
|
|
182
|
-
apiKey: options.apiKey,
|
|
183
|
-
menu: options.menu,
|
|
184
|
-
integration: options.integration,
|
|
185
|
-
benchmark: options.benchmark,
|
|
186
|
-
projectId: options.projectId,
|
|
187
|
-
});
|
|
328
|
+
const session = await buildSessionFromOptions(options);
|
|
188
329
|
// If --api-key was provided, skip the OAuth/TUI auth flow entirely.
|
|
189
330
|
if (session.apiKey) {
|
|
190
331
|
const { DEFAULT_HOST_URL } = await import('./src/lib/constants.js');
|
|
@@ -197,82 +338,96 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
197
338
|
session.projectHasData = false;
|
|
198
339
|
}
|
|
199
340
|
else {
|
|
200
|
-
// Pre-populate region + credentials from
|
|
201
|
-
|
|
202
|
-
//
|
|
203
|
-
const
|
|
204
|
-
const
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
]);
|
|
211
|
-
// Zone: prefer a real (non-pending) stored user, fall back to
|
|
212
|
-
// the Zone field in the project-level ampli.json.
|
|
213
|
-
const storedUser = getStoredUser();
|
|
214
|
-
const realUser = storedUser && storedUser.id !== 'pending' ? storedUser : null;
|
|
215
|
-
const projectConfig = readAmpliConfig(installDir);
|
|
216
|
-
const projectZone = projectConfig.ok
|
|
217
|
-
? projectConfig.config.Zone
|
|
218
|
-
: undefined;
|
|
219
|
-
const zone = realUser?.zone ?? projectZone ?? null;
|
|
220
|
-
if (zone) {
|
|
221
|
-
session.region = zone;
|
|
341
|
+
// Pre-populate region + credentials from stored OAuth tokens.
|
|
342
|
+
const { logToFile } = await import('./src/utils/debug.js');
|
|
343
|
+
// Check for crash-recovery checkpoint
|
|
344
|
+
const { loadCheckpoint } = await import('./src/lib/session-checkpoint.js');
|
|
345
|
+
const checkpoint = loadCheckpoint(session.installDir);
|
|
346
|
+
if (checkpoint) {
|
|
347
|
+
Object.assign(session, checkpoint);
|
|
348
|
+
session.introConcluded = false;
|
|
349
|
+
session._restoredFromCheckpoint = true;
|
|
350
|
+
logToFile('[bin] restored session from crash-recovery checkpoint');
|
|
222
351
|
}
|
|
223
|
-
//
|
|
224
|
-
//
|
|
225
|
-
|
|
352
|
+
// Resolve credentials using shared logic (token refresh,
|
|
353
|
+
// env auto-select, pendingOrgs population)
|
|
354
|
+
const { resolveCredentials } = await import('./src/lib/credential-resolution.js');
|
|
355
|
+
await resolveCredentials(session);
|
|
356
|
+
// Resolve org/workspace display names so /whoami shows them.
|
|
357
|
+
// Fire-and-forget so it doesn't block startup.
|
|
358
|
+
if (session.region && session.selectedOrgId) {
|
|
359
|
+
const { getStoredUser, getStoredToken } = await import('./src/utils/ampli-settings.js');
|
|
360
|
+
const { fetchAmplitudeUser } = await import('./src/lib/api.js');
|
|
361
|
+
const storedUser = getStoredUser();
|
|
362
|
+
const realUser = storedUser && storedUser.id !== 'pending' ? storedUser : null;
|
|
363
|
+
const zone = session.region;
|
|
226
364
|
const storedToken = realUser
|
|
227
365
|
? getStoredToken(realUser.id, realUser.zone)
|
|
228
366
|
: getStoredToken(undefined, zone);
|
|
229
367
|
if (storedToken) {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
368
|
+
fetchAmplitudeUser(storedToken.idToken, zone)
|
|
369
|
+
.then((userInfo) => {
|
|
370
|
+
let changed = false;
|
|
371
|
+
if (userInfo.email && !session.userEmail) {
|
|
372
|
+
session.userEmail = userInfo.email;
|
|
373
|
+
changed = true;
|
|
374
|
+
}
|
|
375
|
+
if (session.selectedOrgId) {
|
|
376
|
+
const org = userInfo.orgs.find((o) => o.id === session.selectedOrgId);
|
|
377
|
+
if (org) {
|
|
378
|
+
session.selectedOrgName = org.name;
|
|
379
|
+
changed = true;
|
|
380
|
+
const ws = session.selectedWorkspaceId
|
|
381
|
+
? org.workspaces.find((w) => w.id === session.selectedWorkspaceId)
|
|
382
|
+
: undefined;
|
|
383
|
+
if (ws) {
|
|
384
|
+
session.selectedWorkspaceName = ws.name;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
if (changed && tui.store.session === session) {
|
|
389
|
+
tui.store.emitChange();
|
|
390
|
+
}
|
|
391
|
+
})
|
|
392
|
+
.catch(() => {
|
|
393
|
+
// Non-fatal — /whoami will just show (none)
|
|
236
394
|
});
|
|
237
|
-
if (projectApiKey) {
|
|
238
|
-
logToFile('[bin] getAPIKey: resolved project API key');
|
|
239
|
-
(0, api_key_store_1.persistApiKey)(projectApiKey, installDir);
|
|
240
|
-
session.credentials = {
|
|
241
|
-
accessToken: storedToken.idToken,
|
|
242
|
-
idToken: storedToken.idToken,
|
|
243
|
-
projectApiKey,
|
|
244
|
-
host: getHostFromRegion(zone),
|
|
245
|
-
projectId: 0,
|
|
246
|
-
};
|
|
247
|
-
// Pre-populate activationLevel so DataSetup is also skipped,
|
|
248
|
-
// giving a single wipe from Intro → Run/Setup.
|
|
249
|
-
// DataSetup would set 'none' anyway (projectId=0 prevents the
|
|
250
|
-
// real check), so this is equivalent — just earlier.
|
|
251
|
-
session.activationLevel = 'none';
|
|
252
|
-
session.projectHasData = false;
|
|
253
|
-
}
|
|
254
|
-
else {
|
|
255
|
-
logToFile('[bin] getAPIKey: returned null — showing apiKeyNotice');
|
|
256
|
-
// Region is already pre-populated above; prompt for the
|
|
257
|
-
// key manually with a hint about org-admin permissions.
|
|
258
|
-
session.apiKeyNotice =
|
|
259
|
-
"Your API key couldn't be fetched automatically. " +
|
|
260
|
-
'Only organization admins can access project API keys — ' +
|
|
261
|
-
'if you need one, ask an admin to share it with you.';
|
|
262
|
-
}
|
|
263
395
|
}
|
|
264
396
|
}
|
|
265
|
-
// Pre-populate org/workspace from ampli.json so activation checks
|
|
266
|
-
// (DataSetupScreen, DataIngestionCheckScreen) have the IDs they need
|
|
267
|
-
// even when the SUSI flow was skipped.
|
|
268
|
-
if (projectConfig.ok && projectConfig.config.OrgId) {
|
|
269
|
-
session.selectedOrgId = String(projectConfig.config.OrgId);
|
|
270
|
-
}
|
|
271
|
-
if (projectConfig.ok && projectConfig.config.WorkspaceId) {
|
|
272
|
-
session.selectedWorkspaceId = projectConfig.config.WorkspaceId;
|
|
273
|
-
}
|
|
274
397
|
}
|
|
275
398
|
tui.store.session = session;
|
|
399
|
+
// Load event plan from a previous run (if it exists) so the
|
|
400
|
+
// Events tab is available immediately on returning runs.
|
|
401
|
+
try {
|
|
402
|
+
const fs = await import('fs');
|
|
403
|
+
const evtPath = (0, path_1.resolve)(session.installDir, '.amplitude-events.json');
|
|
404
|
+
const evtContent = fs.readFileSync(evtPath, 'utf-8');
|
|
405
|
+
const evtSchema = zod_1.z.array(zod_1.z.object({
|
|
406
|
+
name: zod_1.z.string().optional(),
|
|
407
|
+
event: zod_1.z.string().optional(),
|
|
408
|
+
eventName: zod_1.z.string().optional(),
|
|
409
|
+
description: zod_1.z.string().optional(),
|
|
410
|
+
eventDescriptionAndReasoning: zod_1.z.string().optional(),
|
|
411
|
+
}));
|
|
412
|
+
const evtResult = evtSchema.safeParse(JSON.parse(evtContent));
|
|
413
|
+
if (evtResult.success && evtResult.data.length > 0) {
|
|
414
|
+
tui.store.setEventPlan(evtResult.data.map((e) => ({
|
|
415
|
+
name: e.name ?? e.event ?? e.eventName ?? '',
|
|
416
|
+
description: e.description ?? e.eventDescriptionAndReasoning ?? '',
|
|
417
|
+
})));
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
catch {
|
|
421
|
+
// No event plan file yet — that's fine
|
|
422
|
+
}
|
|
423
|
+
// Initialize Amplitude Experiment feature flags (non-blocking).
|
|
424
|
+
const { initFeatureFlags } = await import('./src/lib/feature-flags.js');
|
|
425
|
+
await initFeatureFlags().catch(() => {
|
|
426
|
+
// Flag init failure is non-fatal — all flags default to off
|
|
427
|
+
});
|
|
428
|
+
// Apply SDK-level opt-out based on feature flags
|
|
429
|
+
const { analytics } = await import('./src/utils/analytics.js');
|
|
430
|
+
analytics.applyOptOut();
|
|
276
431
|
const { FRAMEWORK_REGISTRY } = await import('./src/lib/registry.js');
|
|
277
432
|
const { detectIntegration } = await import('./src/run.js');
|
|
278
433
|
const installDir = session.installDir ?? process.cwd();
|
|
@@ -307,16 +462,18 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
307
462
|
const { DEFAULT_AMPLITUDE_ZONE } = await import('./src/lib/constants.js');
|
|
308
463
|
const { storeToken } = await import('./src/utils/ampli-settings.js');
|
|
309
464
|
const forceFresh = !ampliConfigExists(installDir);
|
|
310
|
-
// Wait for the user to
|
|
311
|
-
//
|
|
312
|
-
//
|
|
465
|
+
// Wait for the user to dismiss the welcome screen AND pick a
|
|
466
|
+
// region before opening the OAuth URL. This ensures the logo
|
|
467
|
+
// and intro are visible before the browser opens.
|
|
313
468
|
await new Promise((resolve) => {
|
|
314
|
-
if (tui.store.session.
|
|
469
|
+
if (tui.store.session.introConcluded &&
|
|
470
|
+
tui.store.session.region !== null) {
|
|
315
471
|
resolve();
|
|
316
472
|
return;
|
|
317
473
|
}
|
|
318
474
|
const unsub = tui.store.subscribe(() => {
|
|
319
|
-
if (tui.store.session.
|
|
475
|
+
if (tui.store.session.introConcluded &&
|
|
476
|
+
tui.store.session.region !== null) {
|
|
320
477
|
unsub();
|
|
321
478
|
resolve();
|
|
322
479
|
}
|
|
@@ -356,6 +513,8 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
356
513
|
refreshToken: auth.refreshToken,
|
|
357
514
|
expiresAt: new Date(Date.now() + 3600 * 1000).toISOString(),
|
|
358
515
|
});
|
|
516
|
+
// Populate user email for /whoami display
|
|
517
|
+
session.userEmail = userInfo.email;
|
|
359
518
|
// Signal AuthScreen — triggers org/workspace/API key pickers
|
|
360
519
|
tui.store.setOAuthComplete({
|
|
361
520
|
accessToken: auth.accessToken,
|
|
@@ -427,22 +586,27 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
427
586
|
tui.store.addDiscoveredFeature(DiscoveredFeature.Stripe);
|
|
428
587
|
}
|
|
429
588
|
// LLM SDK detection — sourced from Amplitude LLM analytics skill
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
589
|
+
// Gated by the wizard-llm-analytics feature flag.
|
|
590
|
+
const { isFlagEnabled } = await import('./src/lib/feature-flags.js');
|
|
591
|
+
const { FLAG_LLM_ANALYTICS } = await import('./src/lib/feature-flags.js');
|
|
592
|
+
if (isFlagEnabled(FLAG_LLM_ANALYTICS)) {
|
|
593
|
+
const LLM_PACKAGES = [
|
|
594
|
+
'openai',
|
|
595
|
+
'@anthropic-ai/sdk',
|
|
596
|
+
'ai',
|
|
597
|
+
'@ai-sdk/openai',
|
|
598
|
+
'langchain',
|
|
599
|
+
'@langchain/openai',
|
|
600
|
+
'@langchain/langgraph',
|
|
601
|
+
'@google/generative-ai',
|
|
602
|
+
'@google/genai',
|
|
603
|
+
'@instructor-ai/instructor',
|
|
604
|
+
'@mastra/core',
|
|
605
|
+
'portkey-ai',
|
|
606
|
+
];
|
|
607
|
+
if (depNames.some((d) => LLM_PACKAGES.includes(d))) {
|
|
608
|
+
tui.store.addDiscoveredFeature(DiscoveredFeature.LLM);
|
|
609
|
+
}
|
|
446
610
|
}
|
|
447
611
|
}
|
|
448
612
|
catch {
|
|
@@ -455,6 +619,47 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
455
619
|
// auth, data check, and any setup questions are all complete.
|
|
456
620
|
const { Screen } = await import('./src/ui/tui/router.js');
|
|
457
621
|
tui.store.onEnterScreen(Screen.Run, () => tui.store.completeSetup());
|
|
622
|
+
// Session checkpointing — save at key transitions so crash
|
|
623
|
+
// recovery can skip already-completed steps.
|
|
624
|
+
const { saveCheckpoint, clearCheckpoint } = await import('./src/lib/session-checkpoint.js');
|
|
625
|
+
// After auth completes (most expensive step to repeat)
|
|
626
|
+
tui.store.onEnterScreen(Screen.DataSetup, () => {
|
|
627
|
+
saveCheckpoint(tui.store.session);
|
|
628
|
+
});
|
|
629
|
+
// Before agent starts (captures all setup state)
|
|
630
|
+
tui.store.onEnterScreen(Screen.Run, () => {
|
|
631
|
+
saveCheckpoint(tui.store.session);
|
|
632
|
+
});
|
|
633
|
+
// Clear checkpoint only on successful completion — error/cancel
|
|
634
|
+
// should preserve the checkpoint so users can resume next run.
|
|
635
|
+
tui.store.onEnterScreen(Screen.Outro, () => {
|
|
636
|
+
if (tui.store.session.outroData?.kind === 'success') {
|
|
637
|
+
clearCheckpoint(tui.store.session.installDir);
|
|
638
|
+
}
|
|
639
|
+
});
|
|
640
|
+
// Save checkpoint on unexpected termination (Ctrl+C).
|
|
641
|
+
// First Ctrl+C saves checkpoint and exits promptly.
|
|
642
|
+
// Second Ctrl+C within the grace window force-kills immediately.
|
|
643
|
+
let sigintReceived = false;
|
|
644
|
+
process.on('SIGINT', () => {
|
|
645
|
+
if (sigintReceived) {
|
|
646
|
+
// Second Ctrl+C — force-kill without waiting
|
|
647
|
+
process.exit(130);
|
|
648
|
+
}
|
|
649
|
+
sigintReceived = true;
|
|
650
|
+
// Force-kill after 1 second if checkpoint save hangs
|
|
651
|
+
const forceTimer = setTimeout(() => process.exit(130), 1_000);
|
|
652
|
+
// Unref so it doesn't keep the event loop alive
|
|
653
|
+
if (forceTimer.unref)
|
|
654
|
+
forceTimer.unref();
|
|
655
|
+
try {
|
|
656
|
+
saveCheckpoint(tui.store.session);
|
|
657
|
+
}
|
|
658
|
+
catch {
|
|
659
|
+
// Best-effort — don't block exit
|
|
660
|
+
}
|
|
661
|
+
process.exit(130);
|
|
662
|
+
});
|
|
458
663
|
// Wait for auth and framework detection to finish concurrently.
|
|
459
664
|
await Promise.all([authTask, detectionTask]);
|
|
460
665
|
if (session.verbose || session.debug) {
|
|
@@ -480,14 +685,14 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
480
685
|
if (runWizardAnyway) {
|
|
481
686
|
log('[bin] user chose to run setup wizard despite pre-detection');
|
|
482
687
|
tui.store.resetForAgentAfterPreDetected();
|
|
483
|
-
await (
|
|
688
|
+
await lazyRunWizard(options, tui.store.session);
|
|
484
689
|
}
|
|
485
690
|
else {
|
|
486
691
|
tui.store.setOutroData({ kind: OutroKind.Success });
|
|
487
692
|
}
|
|
488
693
|
}
|
|
489
694
|
else {
|
|
490
|
-
await (
|
|
695
|
+
await lazyRunWizard(options, tui.store.session);
|
|
491
696
|
}
|
|
492
697
|
// Keep the outro screen visible — let process.exit() handle cleanup
|
|
493
698
|
}
|
|
@@ -496,7 +701,7 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
496
701
|
if (process.env.DEBUG || process.env.AMPLITUDE_WIZARD_DEBUG) {
|
|
497
702
|
console.error('TUI init failed:', err);
|
|
498
703
|
}
|
|
499
|
-
await (
|
|
704
|
+
await lazyRunWizard(options);
|
|
500
705
|
}
|
|
501
706
|
})();
|
|
502
707
|
}
|
|
@@ -560,11 +765,13 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
560
765
|
void (async () => {
|
|
561
766
|
const { getStoredUser, clearStoredCredentials } = await import('./src/utils/ampli-settings.js');
|
|
562
767
|
const { clearApiKey } = await import('./src/utils/api-key-store.js');
|
|
768
|
+
const { clearCheckpoint } = await import('./src/lib/session-checkpoint.js');
|
|
563
769
|
const installDir = argv.installDir ?? process.cwd();
|
|
564
770
|
const user = getStoredUser();
|
|
565
771
|
try {
|
|
566
772
|
clearStoredCredentials();
|
|
567
773
|
clearApiKey(installDir);
|
|
774
|
+
clearCheckpoint(installDir);
|
|
568
775
|
if (user) {
|
|
569
776
|
console.log(chalk_1.default.green(`✔ Logged out ${user.email}`));
|
|
570
777
|
}
|
|
@@ -594,7 +801,7 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
594
801
|
process.exit(0);
|
|
595
802
|
})();
|
|
596
803
|
})
|
|
597
|
-
.command('feedback', 'Send product feedback
|
|
804
|
+
.command('feedback', 'Send product feedback', (yargs) => {
|
|
598
805
|
return yargs.options({
|
|
599
806
|
message: {
|
|
600
807
|
alias: 'm',
|
|
@@ -611,6 +818,7 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
611
818
|
if (!message) {
|
|
612
819
|
(0, ui_1.getUI)().log.error('Usage: amplitude-wizard feedback <message> or feedback --message <message>');
|
|
613
820
|
process.exit(1);
|
|
821
|
+
return;
|
|
614
822
|
}
|
|
615
823
|
try {
|
|
616
824
|
const { trackWizardFeedback } = await import('./src/utils/track-wizard-feedback.js');
|
|
@@ -624,39 +832,52 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
624
832
|
}
|
|
625
833
|
})();
|
|
626
834
|
})
|
|
627
|
-
.command('slack', 'Set up Amplitude Slack integration', (y) => y, (
|
|
835
|
+
.command('slack', 'Set up Amplitude Slack integration', (y) => y, (_argv) => {
|
|
628
836
|
void (async () => {
|
|
837
|
+
// Dynamic imports may land named exports on `.default` under tsx
|
|
838
|
+
// CJS/ESM interop. This helper normalises that.
|
|
839
|
+
const cjs = (mod) => (mod.default ?? mod);
|
|
629
840
|
try {
|
|
630
|
-
const {
|
|
631
|
-
const {
|
|
632
|
-
const {
|
|
633
|
-
const {
|
|
634
|
-
const
|
|
635
|
-
const session = buildSession({
|
|
636
|
-
debug: typeof argv['debug'] === 'boolean' ? argv['debug'] : undefined,
|
|
637
|
-
});
|
|
638
|
-
// Pre-populate credentials from ~/.ampli.json so SlackScreen can
|
|
639
|
-
// resolve the org name via fetchAmplitudeUser.
|
|
841
|
+
const { getStoredUser, getStoredToken } = cjs(await import('./src/utils/ampli-settings.js'));
|
|
842
|
+
const { readAmpliConfig } = cjs(await import('./src/lib/ampli-config.js'));
|
|
843
|
+
const { fetchSlackInstallUrl, fetchSlackConnectionStatus } = cjs(await import('./src/lib/api.js'));
|
|
844
|
+
const { OUTBOUND_URLS } = cjs(await import('./src/lib/constants.js'));
|
|
845
|
+
const opn = (await import('opn')).default;
|
|
640
846
|
const storedUser = getStoredUser();
|
|
641
847
|
const zone = storedUser?.zone ?? 'us';
|
|
642
848
|
const storedToken = getStoredToken(storedUser?.id, zone);
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
849
|
+
// Thunder validates access_tokens via Hydra, not id_tokens.
|
|
850
|
+
const accessToken = storedToken?.accessToken;
|
|
851
|
+
// Read orgId from project-level ampli.json
|
|
852
|
+
const ampliConfig = readAmpliConfig(process.cwd());
|
|
853
|
+
const orgId = ampliConfig.ok ? ampliConfig.config.OrgId : undefined;
|
|
854
|
+
if (!accessToken || !orgId) {
|
|
855
|
+
(0, ui_1.setUI)(new logging_ui_1.LoggingUI());
|
|
856
|
+
(0, ui_1.getUI)().log.info('No Amplitude session found. Run `npx @amplitude/wizard` first to log in and set up your project.');
|
|
857
|
+
process.exit(1);
|
|
651
858
|
}
|
|
652
|
-
//
|
|
653
|
-
|
|
859
|
+
// Check if Slack is already connected before prompting install.
|
|
860
|
+
const isConnected = await fetchSlackConnectionStatus(accessToken, zone, orgId);
|
|
861
|
+
if (isConnected) {
|
|
862
|
+
(0, ui_1.setUI)(new logging_ui_1.LoggingUI());
|
|
863
|
+
(0, ui_1.getUI)().log.info('Slack is already connected to your Amplitude workspace.');
|
|
864
|
+
process.exit(0);
|
|
865
|
+
}
|
|
866
|
+
const settingsUrl = OUTBOUND_URLS.slackSettings(zone, orgId);
|
|
867
|
+
let url = settingsUrl;
|
|
868
|
+
// Try to get the direct Slack OAuth URL from Thunder.
|
|
869
|
+
const directUrl = await fetchSlackInstallUrl(accessToken, zone, orgId, settingsUrl);
|
|
870
|
+
if (directUrl)
|
|
871
|
+
url = directUrl;
|
|
872
|
+
(0, ui_1.setUI)(new logging_ui_1.LoggingUI());
|
|
873
|
+
(0, ui_1.getUI)().log.info(`Opening Slack integration: ${url}`);
|
|
874
|
+
await opn(url, { wait: false });
|
|
654
875
|
}
|
|
655
876
|
catch {
|
|
656
877
|
(0, ui_1.setUI)(new logging_ui_1.LoggingUI());
|
|
657
|
-
const { getCloudUrlFromRegion } = await import('./src/utils/urls.js');
|
|
878
|
+
const { getCloudUrlFromRegion } = cjs(await import('./src/utils/urls.js'));
|
|
658
879
|
const opn = (await import('opn')).default;
|
|
659
|
-
const url = `${getCloudUrlFromRegion('us')}/settings/profile`;
|
|
880
|
+
const url = `${getCloudUrlFromRegion('us')}/analytics/settings/profile`;
|
|
660
881
|
(0, ui_1.getUI)().log.info(`Opening Amplitude Settings to connect Slack: ${url}`);
|
|
661
882
|
await opn(url, { wait: false });
|
|
662
883
|
}
|
|
@@ -681,7 +902,7 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
681
902
|
const storedToken = getStoredToken(storedUser?.id, zone);
|
|
682
903
|
if (storedToken) {
|
|
683
904
|
session.credentials = {
|
|
684
|
-
accessToken: storedToken.
|
|
905
|
+
accessToken: storedToken.accessToken,
|
|
685
906
|
projectApiKey: '',
|
|
686
907
|
host: getHostFromRegion(zone),
|
|
687
908
|
projectId: 0,
|
|
@@ -790,6 +1011,11 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
790
1011
|
process.stdout.write(script + '\n');
|
|
791
1012
|
process.exit(0);
|
|
792
1013
|
})
|
|
1014
|
+
.example('$0', 'Run the interactive setup wizard')
|
|
1015
|
+
.example('$0 --ci --api-key <key> --install-dir .', 'Run in CI mode')
|
|
1016
|
+
.example('$0 --agent --install-dir .', 'Run with structured JSON output for automation')
|
|
1017
|
+
.epilogue('Docs: https://amplitude.com/docs/wizard\nFeedback: wizard@amplitude.com')
|
|
1018
|
+
.recommendCommands()
|
|
793
1019
|
.help()
|
|
794
1020
|
.alias('help', 'h')
|
|
795
1021
|
.version()
|