@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,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error classification for user-facing error messages.
|
|
3
|
+
*
|
|
4
|
+
* Transforms cryptic network errors and API failures into
|
|
5
|
+
* actionable messages with suggestions and docs links.
|
|
6
|
+
*/
|
|
7
|
+
/** Classify a caught error into a user-friendly message. */
|
|
8
|
+
export function classifyError(err) {
|
|
9
|
+
if (!(err instanceof Error)) {
|
|
10
|
+
return {
|
|
11
|
+
message: String(err),
|
|
12
|
+
suggestion: 'An unexpected error occurred.',
|
|
13
|
+
retryable: false,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const msg = err.message;
|
|
17
|
+
// Network errors
|
|
18
|
+
if ('code' in err) {
|
|
19
|
+
const code = err.code;
|
|
20
|
+
switch (code) {
|
|
21
|
+
case 'ENOTFOUND':
|
|
22
|
+
return {
|
|
23
|
+
message: 'Could not resolve hostname.',
|
|
24
|
+
suggestion: 'Check your internet connection and DNS settings.',
|
|
25
|
+
retryable: true,
|
|
26
|
+
};
|
|
27
|
+
case 'ECONNRESET':
|
|
28
|
+
return {
|
|
29
|
+
message: 'Connection was reset by the server.',
|
|
30
|
+
suggestion: 'This is usually temporary. Try again in a few seconds.',
|
|
31
|
+
retryable: true,
|
|
32
|
+
};
|
|
33
|
+
case 'ECONNREFUSED':
|
|
34
|
+
return {
|
|
35
|
+
message: 'Connection refused.',
|
|
36
|
+
suggestion: 'The service may be down. Try again later.',
|
|
37
|
+
retryable: true,
|
|
38
|
+
};
|
|
39
|
+
case 'ETIMEDOUT':
|
|
40
|
+
return {
|
|
41
|
+
message: 'Request timed out.',
|
|
42
|
+
suggestion: 'Check your network connection or try again later.',
|
|
43
|
+
retryable: true,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Timeout errors (from withTimeout utility)
|
|
48
|
+
if (err.name === 'TimeoutError') {
|
|
49
|
+
return {
|
|
50
|
+
message: msg,
|
|
51
|
+
suggestion: 'The operation took too long. Check your connection and retry.',
|
|
52
|
+
retryable: true,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// HTTP status errors — check structured status first, fall back to message
|
|
56
|
+
const errObj = err;
|
|
57
|
+
const responseObj = errObj.response;
|
|
58
|
+
const status = typeof errObj.status === 'number'
|
|
59
|
+
? errObj.status
|
|
60
|
+
: typeof responseObj?.status === 'number'
|
|
61
|
+
? responseObj.status
|
|
62
|
+
: null;
|
|
63
|
+
if (status === 401 || status === 403 || msg.includes('Unauthorized')) {
|
|
64
|
+
return {
|
|
65
|
+
message: 'Authentication failed.',
|
|
66
|
+
suggestion: 'Your session may have expired. Run /login to re-authenticate.',
|
|
67
|
+
retryable: false,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
if (status === 429 || msg.includes('Too Many Requests')) {
|
|
71
|
+
return {
|
|
72
|
+
message: 'Rate limited by the API.',
|
|
73
|
+
suggestion: 'Wait a moment and try again.',
|
|
74
|
+
retryable: true,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
if (status === 500 || status === 502 || status === 503) {
|
|
78
|
+
return {
|
|
79
|
+
message: 'Server error from Amplitude API.',
|
|
80
|
+
suggestion: 'This is temporary. Try again in a few seconds.',
|
|
81
|
+
retryable: true,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// Default
|
|
85
|
+
return {
|
|
86
|
+
message: msg,
|
|
87
|
+
suggestion: 'Run with --debug for more details, or /feedback to report this issue.',
|
|
88
|
+
retryable: false,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diagnostic snapshot for debugging flow issues.
|
|
3
|
+
*
|
|
4
|
+
* Produces a sanitized JSON object that shows exactly why the router
|
|
5
|
+
* picked the current screen — without leaking tokens or secrets.
|
|
6
|
+
*
|
|
7
|
+
* Used by the /debug slash command and crash report writer.
|
|
8
|
+
*/
|
|
9
|
+
import type { WizardSession } from '../../../lib/wizard-session.js';
|
|
10
|
+
import type { WizardStore } from '../store.js';
|
|
11
|
+
import { Flow } from '../flows.js';
|
|
12
|
+
export interface FlowStepEvaluation {
|
|
13
|
+
screen: string;
|
|
14
|
+
visible: boolean;
|
|
15
|
+
complete: boolean;
|
|
16
|
+
active: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** Walk the flow pipeline and explain each routing decision. */
|
|
19
|
+
export declare function evaluateFlow(session: WizardSession, flow?: Flow): FlowStepEvaluation[];
|
|
20
|
+
/** Create a sanitized diagnostic snapshot safe to share with support. */
|
|
21
|
+
export declare function createDiagnosticSnapshot(store: WizardStore, version: string): object;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diagnostic snapshot for debugging flow issues.
|
|
3
|
+
*
|
|
4
|
+
* Produces a sanitized JSON object that shows exactly why the router
|
|
5
|
+
* picked the current screen — without leaking tokens or secrets.
|
|
6
|
+
*
|
|
7
|
+
* Used by the /debug slash command and crash report writer.
|
|
8
|
+
*/
|
|
9
|
+
import { FLOWS, Flow } from '../flows.js';
|
|
10
|
+
/** Walk the flow pipeline and explain each routing decision. */
|
|
11
|
+
export function evaluateFlow(session, flow = Flow.Wizard) {
|
|
12
|
+
const entries = FLOWS[flow];
|
|
13
|
+
if (!entries)
|
|
14
|
+
return [];
|
|
15
|
+
let foundActive = false;
|
|
16
|
+
return entries.map((entry) => {
|
|
17
|
+
const visible = entry.show ? entry.show(session) : true;
|
|
18
|
+
const complete = visible && entry.isComplete ? entry.isComplete(session) : false;
|
|
19
|
+
const active = visible && !complete && !foundActive;
|
|
20
|
+
if (active)
|
|
21
|
+
foundActive = true;
|
|
22
|
+
return { screen: entry.screen, visible, complete, active };
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/** Create a sanitized diagnostic snapshot safe to share with support. */
|
|
26
|
+
export function createDiagnosticSnapshot(store, version) {
|
|
27
|
+
const session = store.session;
|
|
28
|
+
return {
|
|
29
|
+
wizard_version: version,
|
|
30
|
+
node_version: process.version,
|
|
31
|
+
platform: `${process.platform}/${process.arch}`,
|
|
32
|
+
timestamp: new Date().toISOString(),
|
|
33
|
+
// Flow state — the "why did I see this screen?" answer
|
|
34
|
+
current_screen: store.currentScreen,
|
|
35
|
+
active_flow: store.router.activeFlow,
|
|
36
|
+
has_overlay: store.router.hasOverlay,
|
|
37
|
+
// Flow evaluation — shows every predicate result
|
|
38
|
+
flow_evaluation: evaluateFlow(session, store.router.activeFlow),
|
|
39
|
+
// Session state (secrets redacted, only structural/categorical data)
|
|
40
|
+
session: {
|
|
41
|
+
integration: session.integration,
|
|
42
|
+
detected_framework: session.detectedFrameworkLabel,
|
|
43
|
+
detection_complete: session.detectionComplete,
|
|
44
|
+
region: session.region,
|
|
45
|
+
region_forced: session.regionForced,
|
|
46
|
+
run_phase: session.runPhase,
|
|
47
|
+
activation_level: session.activationLevel,
|
|
48
|
+
project_has_data: session.projectHasData,
|
|
49
|
+
setup_confirmed: session.setupConfirmed,
|
|
50
|
+
intro_concluded: session.introConcluded,
|
|
51
|
+
mcp_complete: session.mcpComplete,
|
|
52
|
+
slack_complete: session.slackComplete,
|
|
53
|
+
data_ingestion_confirmed: session.dataIngestionConfirmed,
|
|
54
|
+
checklist_complete: session.checklistComplete,
|
|
55
|
+
checklist_chart_complete: session.checklistChartComplete,
|
|
56
|
+
checklist_dashboard_complete: session.checklistDashboardComplete,
|
|
57
|
+
discovered_features: session.discoveredFeatures,
|
|
58
|
+
additional_feature_queue: session.additionalFeatureQueue,
|
|
59
|
+
amplitude_pre_detected: session.amplitudePreDetected,
|
|
60
|
+
outro_kind: session.outroData?.kind ?? null,
|
|
61
|
+
// Redacted credential indicators
|
|
62
|
+
has_credentials: session.credentials !== null,
|
|
63
|
+
has_pending_orgs: session.pendingOrgs !== null,
|
|
64
|
+
selected_org: session.selectedOrgName,
|
|
65
|
+
selected_project: session.selectedProjectName,
|
|
66
|
+
},
|
|
67
|
+
// Counts
|
|
68
|
+
status_messages_count: store.statusMessages.length,
|
|
69
|
+
tasks_count: store.tasks.length,
|
|
70
|
+
event_plan_count: store.eventPlan.length,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry wrapper with exponential backoff.
|
|
3
|
+
*
|
|
4
|
+
* Retries transient failures (5xx, network errors) but bails immediately
|
|
5
|
+
* on client errors (4xx except 429) since retrying won't help.
|
|
6
|
+
*/
|
|
7
|
+
export interface RetryOptions {
|
|
8
|
+
retries?: number;
|
|
9
|
+
baseDelayMs?: number;
|
|
10
|
+
label?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function withRetry<T>(fn: () => Promise<T>, opts?: RetryOptions): Promise<T>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry wrapper with exponential backoff.
|
|
3
|
+
*
|
|
4
|
+
* Retries transient failures (5xx, network errors) but bails immediately
|
|
5
|
+
* on client errors (4xx except 429) since retrying won't help.
|
|
6
|
+
*/
|
|
7
|
+
export async function withRetry(fn, opts = {}) {
|
|
8
|
+
const { retries = 2, baseDelayMs = 1000, label = 'operation' } = opts;
|
|
9
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
10
|
+
try {
|
|
11
|
+
return await fn();
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
// Don't retry client errors (except rate limiting)
|
|
15
|
+
if (isClientError(err))
|
|
16
|
+
throw err;
|
|
17
|
+
if (attempt === retries)
|
|
18
|
+
throw err;
|
|
19
|
+
const delay = baseDelayMs * Math.pow(2, attempt);
|
|
20
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
throw new Error(`${label}: unreachable`);
|
|
24
|
+
}
|
|
25
|
+
/** 4xx errors (except 429) are not retryable. */
|
|
26
|
+
function isClientError(err) {
|
|
27
|
+
if (err && typeof err === 'object' && 'status' in err) {
|
|
28
|
+
const status = err.status;
|
|
29
|
+
return status >= 400 && status < 500 && status !== 429;
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timeout wrapper for async operations.
|
|
3
|
+
*
|
|
4
|
+
* Prevents stuck states when API calls hang due to network issues.
|
|
5
|
+
* Every API call in screens should be wrapped in this.
|
|
6
|
+
*/
|
|
7
|
+
export declare class TimeoutError extends Error {
|
|
8
|
+
constructor(label: string, ms: number);
|
|
9
|
+
}
|
|
10
|
+
export declare function withTimeout<T>(promise: Promise<T>, ms: number, label: string): Promise<T>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timeout wrapper for async operations.
|
|
3
|
+
*
|
|
4
|
+
* Prevents stuck states when API calls hang due to network issues.
|
|
5
|
+
* Every API call in screens should be wrapped in this.
|
|
6
|
+
*/
|
|
7
|
+
export class TimeoutError extends Error {
|
|
8
|
+
constructor(label, ms) {
|
|
9
|
+
super(`${label} timed out after ${ms}ms`);
|
|
10
|
+
this.name = 'TimeoutError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export async function withTimeout(promise, ms, label) {
|
|
14
|
+
let timer;
|
|
15
|
+
const timeout = new Promise((_, reject) => {
|
|
16
|
+
timer = setTimeout(() => reject(new TimeoutError(label, ms)), ms);
|
|
17
|
+
});
|
|
18
|
+
try {
|
|
19
|
+
return await Promise.race([promise, timeout]);
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
clearTimeout(timer);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -22,7 +22,7 @@ export interface StoredUser {
|
|
|
22
22
|
email: string;
|
|
23
23
|
zone: AmplitudeZone;
|
|
24
24
|
}
|
|
25
|
-
/** Returns the first stored user, or undefined if none. */
|
|
25
|
+
/** Returns the first real (non-pending) stored user, or undefined if none. */
|
|
26
26
|
export declare function getStoredUser(configPath?: string): StoredUser | undefined;
|
|
27
27
|
/** Returns a valid (non-expired) stored token, or undefined. */
|
|
28
28
|
export declare function getStoredToken(userId?: string, zone?: AmplitudeZone, configPath?: string): StoredOAuthToken | undefined;
|
|
@@ -53,6 +53,7 @@ const os = __importStar(require("node:os"));
|
|
|
53
53
|
const path = __importStar(require("node:path"));
|
|
54
54
|
const zod_1 = require("zod");
|
|
55
55
|
const constants_js_1 = require("../lib/constants.js");
|
|
56
|
+
const atomic_write_js_1 = require("./atomic-write.js");
|
|
56
57
|
exports.AMPLI_CONFIG_PATH = path.join(os.homedir(), '.ampli.json');
|
|
57
58
|
const AmpliSettingsFileSchema = zod_1.z.record(zod_1.z.string(), zod_1.z.unknown());
|
|
58
59
|
function readConfig(configPath = exports.AMPLI_CONFIG_PATH) {
|
|
@@ -66,7 +67,8 @@ function readConfig(configPath = exports.AMPLI_CONFIG_PATH) {
|
|
|
66
67
|
}
|
|
67
68
|
}
|
|
68
69
|
function writeConfig(data, configPath = exports.AMPLI_CONFIG_PATH) {
|
|
69
|
-
|
|
70
|
+
// Atomic write: temp file + rename prevents corruption if process dies mid-write
|
|
71
|
+
(0, atomic_write_js_1.atomicWriteJSON)(configPath, data, 0o600);
|
|
70
72
|
}
|
|
71
73
|
function userKey(userId, zone) {
|
|
72
74
|
const safeId = userId.replace(/\./g, '-');
|
|
@@ -86,17 +88,25 @@ const UserEntrySchema = zod_1.z
|
|
|
86
88
|
User: StoredUserSchema.optional(),
|
|
87
89
|
})
|
|
88
90
|
.passthrough();
|
|
89
|
-
/** Returns the first stored user, or undefined if none. */
|
|
91
|
+
/** Returns the first real (non-pending) stored user, or undefined if none. */
|
|
90
92
|
function getStoredUser(configPath) {
|
|
91
93
|
const config = readConfig(configPath);
|
|
94
|
+
let fallback;
|
|
92
95
|
for (const [key, value] of Object.entries(config)) {
|
|
93
96
|
if (!key.startsWith('User-') && !key.startsWith('User['))
|
|
94
97
|
continue;
|
|
95
98
|
const entry = UserEntrySchema.safeParse(value);
|
|
96
|
-
if (entry.success
|
|
97
|
-
|
|
99
|
+
if (!entry.success || !entry.data.User)
|
|
100
|
+
continue;
|
|
101
|
+
const user = entry.data.User;
|
|
102
|
+
// Skip the "pending" placeholder — prefer a real user with an actual ID
|
|
103
|
+
if (user.id === 'pending') {
|
|
104
|
+
fallback = fallback ?? user;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
return user;
|
|
98
108
|
}
|
|
99
|
-
return
|
|
109
|
+
return fallback;
|
|
100
110
|
}
|
|
101
111
|
/** Returns a valid (non-expired) stored token, or undefined. */
|
|
102
112
|
function getStoredToken(userId, zone = constants_js_1.DEFAULT_AMPLITUDE_ZONE, configPath) {
|
|
@@ -164,13 +164,13 @@ function readApiKeyWithSource(installDir) {
|
|
|
164
164
|
if (key)
|
|
165
165
|
return { key, source: 'keychain' };
|
|
166
166
|
}
|
|
167
|
-
// .env.local in the project directory
|
|
167
|
+
// .env.local in the project directory (project-scoped, safe)
|
|
168
168
|
const envKey = envRead(installDir);
|
|
169
169
|
if (envKey)
|
|
170
170
|
return { key: envKey, source: 'env' };
|
|
171
|
-
//
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
171
|
+
// NOTE: We intentionally do NOT fall back to process.env.AMPLITUDE_API_KEY.
|
|
172
|
+
// A shell-level env var would leak across projects — if a user sets it in
|
|
173
|
+
// their .bashrc, every project on the machine would silently use it.
|
|
174
|
+
// Users should use .env.local (project-scoped) or --api-key (explicit).
|
|
175
175
|
return null;
|
|
176
176
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atomic JSON file writes via temp-file + rename.
|
|
3
|
+
*
|
|
4
|
+
* writeFileSync is atomic for small files on POSIX, but NOT on Windows.
|
|
5
|
+
* This utility ensures crash-safety on all platforms: if the process dies
|
|
6
|
+
* mid-write, the original file is untouched (the temp file is orphaned).
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Write a JSON object to a file atomically.
|
|
10
|
+
*
|
|
11
|
+
* 1. Writes to a temp file (same directory, PID-suffixed)
|
|
12
|
+
* 2. Renames temp → target (atomic on all OSes)
|
|
13
|
+
* 3. Cleans up temp on failure
|
|
14
|
+
*/
|
|
15
|
+
export declare function atomicWriteJSON(filePath: string, data: unknown, mode?: number): void;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Atomic JSON file writes via temp-file + rename.
|
|
4
|
+
*
|
|
5
|
+
* writeFileSync is atomic for small files on POSIX, but NOT on Windows.
|
|
6
|
+
* This utility ensures crash-safety on all platforms: if the process dies
|
|
7
|
+
* mid-write, the original file is untouched (the temp file is orphaned).
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.atomicWriteJSON = atomicWriteJSON;
|
|
11
|
+
const fs_1 = require("fs");
|
|
12
|
+
/**
|
|
13
|
+
* Write a JSON object to a file atomically.
|
|
14
|
+
*
|
|
15
|
+
* 1. Writes to a temp file (same directory, PID-suffixed)
|
|
16
|
+
* 2. Renames temp → target (atomic on all OSes)
|
|
17
|
+
* 3. Cleans up temp on failure
|
|
18
|
+
*/
|
|
19
|
+
function atomicWriteJSON(filePath, data, mode = 0o644) {
|
|
20
|
+
const tmp = `${filePath}.${process.pid}.tmp`;
|
|
21
|
+
try {
|
|
22
|
+
(0, fs_1.writeFileSync)(tmp, JSON.stringify(data, null, 2) + '\n', { mode });
|
|
23
|
+
(0, fs_1.renameSync)(tmp, filePath);
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
try {
|
|
27
|
+
(0, fs_1.unlinkSync)(tmp);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Best-effort cleanup
|
|
31
|
+
}
|
|
32
|
+
throw err;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -284,7 +284,7 @@ async function tryResolveCredentialsForCi(installDir) {
|
|
|
284
284
|
return {
|
|
285
285
|
host: getHostFromRegion(cloudRegion),
|
|
286
286
|
projectApiKey,
|
|
287
|
-
accessToken: storedToken.
|
|
287
|
+
accessToken: storedToken.accessToken,
|
|
288
288
|
cloudRegion,
|
|
289
289
|
};
|
|
290
290
|
}
|
|
@@ -482,7 +482,7 @@ async function askForWizardLogin(opts = {}) {
|
|
|
482
482
|
projectApiKey = await askForAmplitudeApiKey(opts.installDir);
|
|
483
483
|
}
|
|
484
484
|
return {
|
|
485
|
-
accessToken: auth.
|
|
485
|
+
accessToken: auth.accessToken,
|
|
486
486
|
projectApiKey,
|
|
487
487
|
host: constants_1.DEFAULT_HOST_URL,
|
|
488
488
|
distinctId: userInfo?.id ?? 'unknown',
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Silent OAuth token refresh — lightweight utility that exchanges an expired
|
|
3
|
+
* access token for a new one using a stored refresh token, without opening
|
|
4
|
+
* the browser or importing heavy dependencies.
|
|
5
|
+
*
|
|
6
|
+
* Returns null on any failure so the caller can fall back to full browser auth.
|
|
7
|
+
*/
|
|
8
|
+
import { type AmplitudeZone } from '../lib/constants.js';
|
|
9
|
+
/**
|
|
10
|
+
* Attempts a silent OAuth token refresh if the access token is expired or
|
|
11
|
+
* expiring within 5 minutes. Returns new token data on success, or null if
|
|
12
|
+
* refresh is not needed, not possible, or fails.
|
|
13
|
+
*/
|
|
14
|
+
export declare function tryRefreshToken(storedEntry: {
|
|
15
|
+
accessToken: string;
|
|
16
|
+
refreshToken?: string;
|
|
17
|
+
expiresAt: number;
|
|
18
|
+
}, zone?: AmplitudeZone): Promise<{
|
|
19
|
+
accessToken: string;
|
|
20
|
+
expiresAt: number;
|
|
21
|
+
refreshToken?: string;
|
|
22
|
+
} | null>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Silent OAuth token refresh — lightweight utility that exchanges an expired
|
|
4
|
+
* access token for a new one using a stored refresh token, without opening
|
|
5
|
+
* the browser or importing heavy dependencies.
|
|
6
|
+
*
|
|
7
|
+
* Returns null on any failure so the caller can fall back to full browser auth.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.tryRefreshToken = tryRefreshToken;
|
|
11
|
+
const constants_js_1 = require("../lib/constants.js");
|
|
12
|
+
const debug_js_1 = require("./debug.js");
|
|
13
|
+
/** Five minutes in milliseconds — refresh proactively before actual expiry. */
|
|
14
|
+
const EXPIRY_BUFFER_MS = 5 * 60 * 1000;
|
|
15
|
+
/**
|
|
16
|
+
* Attempts a silent OAuth token refresh if the access token is expired or
|
|
17
|
+
* expiring within 5 minutes. Returns new token data on success, or null if
|
|
18
|
+
* refresh is not needed, not possible, or fails.
|
|
19
|
+
*/
|
|
20
|
+
async function tryRefreshToken(storedEntry, zone = constants_js_1.DEFAULT_AMPLITUDE_ZONE) {
|
|
21
|
+
// 1. Check whether the token actually needs refreshing
|
|
22
|
+
const now = Date.now();
|
|
23
|
+
if (storedEntry.expiresAt - now > EXPIRY_BUFFER_MS) {
|
|
24
|
+
// Token is still valid — no refresh needed
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
// 2. A refresh token is required
|
|
28
|
+
if (!storedEntry.refreshToken) {
|
|
29
|
+
(0, debug_js_1.logToFile)('[token-refresh] access token expired but no refresh token stored');
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
(0, debug_js_1.logToFile)('[token-refresh] access token expired or expiring soon, attempting silent refresh', {
|
|
33
|
+
expiresAt: new Date(storedEntry.expiresAt).toISOString(),
|
|
34
|
+
zone,
|
|
35
|
+
});
|
|
36
|
+
// 3. Exchange the refresh token for a new access token
|
|
37
|
+
try {
|
|
38
|
+
const { oAuthHost, oAuthClientId } = constants_js_1.AMPLITUDE_ZONE_SETTINGS[zone];
|
|
39
|
+
const body = new URLSearchParams({
|
|
40
|
+
grant_type: 'refresh_token',
|
|
41
|
+
refresh_token: storedEntry.refreshToken,
|
|
42
|
+
client_id: oAuthClientId,
|
|
43
|
+
});
|
|
44
|
+
const response = await fetch(`${oAuthHost}/oauth2/token`, {
|
|
45
|
+
method: 'POST',
|
|
46
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
47
|
+
body: body.toString(),
|
|
48
|
+
});
|
|
49
|
+
if (!response.ok) {
|
|
50
|
+
(0, debug_js_1.logToFile)('[token-refresh] refresh request failed', {
|
|
51
|
+
status: response.status,
|
|
52
|
+
statusText: response.statusText,
|
|
53
|
+
});
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const data = (await response.json());
|
|
57
|
+
const accessToken = data.access_token;
|
|
58
|
+
const expiresIn = data.expires_in;
|
|
59
|
+
if (typeof accessToken !== 'string' || typeof expiresIn !== 'number') {
|
|
60
|
+
(0, debug_js_1.logToFile)('[token-refresh] unexpected response shape', {
|
|
61
|
+
hasAccessToken: typeof accessToken,
|
|
62
|
+
hasExpiresIn: typeof expiresIn,
|
|
63
|
+
});
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const expiresAt = now + expiresIn * 1000;
|
|
67
|
+
// Persist rotated refresh token if the server issued a new one
|
|
68
|
+
const newRefreshToken = typeof data.refresh_token === 'string' ? data.refresh_token : undefined;
|
|
69
|
+
(0, debug_js_1.logToFile)('[token-refresh] silent refresh succeeded', {
|
|
70
|
+
expiresAt: new Date(expiresAt).toISOString(),
|
|
71
|
+
rotatedRefreshToken: !!newRefreshToken,
|
|
72
|
+
});
|
|
73
|
+
return { accessToken, expiresAt, refreshToken: newRefreshToken };
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
(0, debug_js_1.logToFile)('[token-refresh] refresh failed', err instanceof Error ? err.message : 'unknown error');
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -52,5 +52,10 @@ async function wizardAbort(options) {
|
|
|
52
52
|
// 4. Display message to user
|
|
53
53
|
(0, ui_1.getUI)().cancel(message);
|
|
54
54
|
// 5. Exit (fires 'exit' event so TUI cleanup runs)
|
|
55
|
-
|
|
55
|
+
// In agent mode, always exit 0 — errors are communicated via NDJSON output,
|
|
56
|
+
// not exit codes. A non-zero exit makes callers (like Claude Code) show
|
|
57
|
+
// ugly red error banners when the error is already reported in the output.
|
|
58
|
+
const isAgentMode = process.env.AMPLITUDE_WIZARD_AGENT === '1' ||
|
|
59
|
+
process.argv.includes('--agent');
|
|
60
|
+
return process.exit(isAgentMode ? 0 : exitCode);
|
|
56
61
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amplitude/wizard",
|
|
3
|
-
"version": "1.0.0
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"homepage": "https://github.com/amplitude/wizard",
|
|
5
5
|
"repository": "https://github.com/amplitude/wizard",
|
|
6
6
|
"description": "The Amplitude wizard helps you to configure your project",
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
"dist/bin.*",
|
|
28
28
|
"dist/src",
|
|
29
29
|
"man/",
|
|
30
|
+
"skills/",
|
|
30
31
|
"package.json",
|
|
31
32
|
"README.md"
|
|
32
33
|
],
|
|
@@ -47,7 +48,6 @@
|
|
|
47
48
|
"axios": "1.13.5",
|
|
48
49
|
"chalk": "^2.4.1",
|
|
49
50
|
"client-oauth2": "^4.3.3",
|
|
50
|
-
"conf": "^15.1.0",
|
|
51
51
|
"dotenv": "^16.4.7",
|
|
52
52
|
"fast-glob": "^3.3.3",
|
|
53
53
|
"glob": "9.3.5",
|
|
@@ -66,7 +66,6 @@
|
|
|
66
66
|
"semver": "^7.5.3",
|
|
67
67
|
"uuid": "^11.1.0",
|
|
68
68
|
"xcode": "3.0.1",
|
|
69
|
-
"xml-js": "^1.6.11",
|
|
70
69
|
"yargs": "^16.2.0",
|
|
71
70
|
"zod": "^4.3.6",
|
|
72
71
|
"zod-to-json-schema": "^3.25.1"
|
|
@@ -88,6 +87,7 @@
|
|
|
88
87
|
"@vitest/coverage-v8": "^4.0.18",
|
|
89
88
|
"eslint": "^9.39.4",
|
|
90
89
|
"eslint-config-prettier": "^9.1.2",
|
|
90
|
+
"fast-check": "^4.6.0",
|
|
91
91
|
"globals": "^17.4.0",
|
|
92
92
|
"husky": "^9.1.7",
|
|
93
93
|
"lint-staged": "^15.5.1",
|
|
@@ -115,11 +115,11 @@
|
|
|
115
115
|
},
|
|
116
116
|
"scripts": {
|
|
117
117
|
"clean": "rm -rf ./dist",
|
|
118
|
-
"prebuild": "pnpm clean",
|
|
118
|
+
"prebuild": "pnpm clean && node scripts/sync-version.mjs",
|
|
119
119
|
"build:watch": "pnpm tsc -w",
|
|
120
120
|
"build": "pnpm tsc",
|
|
121
121
|
"postbuild": "chmod +x ./dist/bin.js && pnpm test:smoke",
|
|
122
|
-
"test:smoke": "node
|
|
122
|
+
"test:smoke": "node ./dist/bin.js --help 2>&1 | head -5 | grep -q 'Amplitude' || (echo 'Smoke test failed: compiled binary crashed on load' && exit 1)",
|
|
123
123
|
"lint": "pnpm lint:prettier && pnpm lint:eslint",
|
|
124
124
|
"lint:prettier": "prettier --check \"{lib,src,test}/**/*.ts\"",
|
|
125
125
|
"lint:eslint": "eslint . --cache --format stylish",
|
|
@@ -129,7 +129,7 @@
|
|
|
129
129
|
"test": "vitest run",
|
|
130
130
|
"test:e2e": "pnpm build && ./e2e-tests/run.sh",
|
|
131
131
|
"test:e2e-record": "export RECORD_FIXTURES=true && pnpm build && ./e2e-tests/run.sh",
|
|
132
|
-
"try": "
|
|
132
|
+
"try": "pnpm build && node dist/bin.js",
|
|
133
133
|
"proxy": "cd \"${JS_REPO:-../javascript}\"/server/packages/thunder && aws-sso exec --profile us-prod-dev -- pnpm debug",
|
|
134
134
|
"proxy:bypass": "cd \"${JS_REPO:-../javascript}\"/server/packages/thunder && WIZARD_PROXY_DEV_BYPASS=1 aws-sso exec --profile us-prod-dev -- pnpm debug",
|
|
135
135
|
"dev": "pnpm build && pnpm link --global && (trap 'kill 0' EXIT; pnpm proxy & pnpm build:watch)",
|