@amplitude/wizard 1.0.0-beta.2 → 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 +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 +5 -4
- package/dist/src/lib/constants.js +9 -11
- 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 +5 -5
- 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
|
@@ -13,17 +13,17 @@ const LINES = [
|
|
|
13
13
|
" `-ΦΦΦµµΦΦΦ''' ",
|
|
14
14
|
];
|
|
15
15
|
const TEXT = LINES.join('\n');
|
|
16
|
-
/** Amplitude
|
|
16
|
+
/** Amplitude brand gradient — deep purple to bright blue (from brand guide). */
|
|
17
17
|
const WAVE_COLORS = [
|
|
18
|
-
'#
|
|
19
|
-
'#
|
|
20
|
-
'#
|
|
21
|
-
'#
|
|
22
|
-
'#
|
|
23
|
-
'#
|
|
24
|
-
'#
|
|
25
|
-
'#
|
|
26
|
-
'#
|
|
18
|
+
'#311b8e', // deep purple (brand)
|
|
19
|
+
'#2a1da0', // mid purple-blue
|
|
20
|
+
'#2020b2', // transitional
|
|
21
|
+
'#1522c4', // mid blue
|
|
22
|
+
'#0c19df', // bright blue (brand)
|
|
23
|
+
'#1522c4', // mid blue
|
|
24
|
+
'#2020b2', // transitional
|
|
25
|
+
'#2a1da0', // mid purple-blue
|
|
26
|
+
'#311b8e', // deep purple
|
|
27
27
|
];
|
|
28
28
|
/**
|
|
29
29
|
* Characters substituted at each distance from the wave centre.
|
|
@@ -51,12 +51,12 @@ function applyHorizWave(line, rowWaveX) {
|
|
|
51
51
|
})
|
|
52
52
|
.join('');
|
|
53
53
|
}
|
|
54
|
-
export const AmplitudeLogo = ({ color = '
|
|
54
|
+
export const AmplitudeLogo = ({ color = '#0c19df' }) => (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: color, children: TEXT }) }));
|
|
55
55
|
/** AmplitudeLogo with a colour wave (vertical) and a horizontal dissolve wave. */
|
|
56
56
|
export const AnimatedAmplitudeLogo = () => {
|
|
57
|
-
// Vertical colour wave — advances every
|
|
57
|
+
// Vertical colour wave — advances every 110ms
|
|
58
58
|
const [colorFrame, setColorFrame] = useState(0);
|
|
59
|
-
// Horizontal dissolve wave — tick advances every
|
|
59
|
+
// Horizontal dissolve wave — tick advances every 50ms
|
|
60
60
|
const [waveTick, setWaveTick] = useState(0);
|
|
61
61
|
useEffect(() => {
|
|
62
62
|
const id = setInterval(() => setColorFrame((f) => (f + 1) % WAVE_COLORS.length), 110);
|
|
@@ -66,11 +66,10 @@ export const AnimatedAmplitudeLogo = () => {
|
|
|
66
66
|
const id = setInterval(() => setWaveTick((t) => t + 1), 50);
|
|
67
67
|
return () => clearInterval(id);
|
|
68
68
|
}, []);
|
|
69
|
-
// One dissolve
|
|
70
|
-
//
|
|
71
|
-
// 44 ticks the logo rests at full resolution.
|
|
69
|
+
// One dissolve sweep every 4s (80 ticks at 50ms). The wave travels for
|
|
70
|
+
// the first 54 ticks (~2.7s), then rests at full resolution for ~1.3s.
|
|
72
71
|
const TICKS_PER_CYCLE = 80;
|
|
73
|
-
const ACTIVE_TICKS = 54;
|
|
72
|
+
const ACTIVE_TICKS = 54;
|
|
74
73
|
const frameInCycle = waveTick % TICKS_PER_CYCLE;
|
|
75
74
|
const waveX = frameInCycle < ACTIVE_TICKS
|
|
76
75
|
? Math.round((frameInCycle / (ACTIVE_TICKS - 1)) *
|
|
@@ -8,24 +8,59 @@ const LOGO_LINES = [
|
|
|
8
8
|
'██║ ██║██║ ╚═╝ ██║██║ ███████╗██║ ██║ ╚██████╔╝██████╔╝███████╗',
|
|
9
9
|
'╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝',
|
|
10
10
|
];
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Number of color segments per line. Each segment is a single <Text> element
|
|
13
|
+
* sharing one interpolated color. 10 segments x 6 lines = 60 elements total
|
|
14
|
+
* (vs ~430 with per-character rendering).
|
|
15
|
+
*/
|
|
16
|
+
const SEGMENTS_PER_LINE = 10;
|
|
17
|
+
/**
|
|
18
|
+
* Brand gradient endpoints per row.
|
|
19
|
+
* Top rows: bright blue range. Bottom rows: deep purple to blue.
|
|
20
|
+
* Each entry is [leftColor, rightColor].
|
|
21
|
+
*/
|
|
22
|
+
const ROW_GRADIENT = [
|
|
23
|
+
['#0c19df', '#5533ff'], // row 0 — brightest
|
|
24
|
+
['#1420d4', '#4a2df5'], // row 1
|
|
25
|
+
['#1c22c8', '#3f27eb'], // row 2
|
|
26
|
+
['#2420b8', '#3421e0'], // row 3
|
|
27
|
+
['#2c1ea8', '#291bd6'], // row 4
|
|
28
|
+
['#311b8e', '#0c19df'], // row 5 — deepest
|
|
29
|
+
];
|
|
30
|
+
/** Linearly interpolate between two hex colors. t ∈ [0, 1]. */
|
|
13
31
|
function lerpColor(a, b, t) {
|
|
14
|
-
const ar = parseInt(a.slice(1, 3), 16)
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const
|
|
32
|
+
const ar = parseInt(a.slice(1, 3), 16);
|
|
33
|
+
const ag = parseInt(a.slice(3, 5), 16);
|
|
34
|
+
const ab = parseInt(a.slice(5, 7), 16);
|
|
35
|
+
const br = parseInt(b.slice(1, 3), 16);
|
|
36
|
+
const bg = parseInt(b.slice(3, 5), 16);
|
|
37
|
+
const bb = parseInt(b.slice(5, 7), 16);
|
|
38
|
+
const r = Math.round(ar + (br - ar) * t);
|
|
39
|
+
const g = Math.round(ag + (bg - ag) * t);
|
|
40
|
+
const bl = Math.round(ab + (bb - ab) * t);
|
|
41
|
+
return `#${r.toString(16).padStart(2, '0')}${g
|
|
23
42
|
.toString(16)
|
|
24
|
-
.padStart(2, '0')
|
|
25
|
-
return `#${r}${g}${bv}`;
|
|
43
|
+
.padStart(2, '0')}${bl.toString(16).padStart(2, '0')}`;
|
|
26
44
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Pre-computed gradient lines. Built once at module load so React never
|
|
47
|
+
* recalculates colors during renders.
|
|
48
|
+
*/
|
|
49
|
+
const GRADIENT_LINES = LOGO_LINES.map((line, rowIndex) => {
|
|
50
|
+
const [leftColor, rightColor] = ROW_GRADIENT[rowIndex];
|
|
51
|
+
const charsPerSegment = Math.ceil(line.length / SEGMENTS_PER_LINE);
|
|
52
|
+
const segments = [];
|
|
53
|
+
for (let s = 0; s < SEGMENTS_PER_LINE; s++) {
|
|
54
|
+
const start = s * charsPerSegment;
|
|
55
|
+
const end = Math.min(start + charsPerSegment, line.length);
|
|
56
|
+
const chars = line.slice(start, end);
|
|
57
|
+
if (!chars)
|
|
58
|
+
continue;
|
|
59
|
+
// Horizontal position for color interpolation
|
|
60
|
+
const t = line.length > 1 ? start / (line.length - 1) : 0;
|
|
61
|
+
const color = lerpColor(leftColor, rightColor, t);
|
|
62
|
+
segments.push({ chars, color });
|
|
63
|
+
}
|
|
64
|
+
return segments;
|
|
65
|
+
});
|
|
66
|
+
export const AmplitudeTextLogo = () => (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: GRADIENT_LINES.map((segments, rowIndex) => (_jsx(Box, { flexDirection: "row", children: segments.map((seg, s) => (_jsx(Text, { color: seg.color, children: seg.chars }, s))) }, rowIndex))) }));
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BrailleSpinner — compact animated spinner using braille characters.
|
|
3
|
+
*/
|
|
4
|
+
interface BrailleSpinnerProps {
|
|
5
|
+
color?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const BrailleSpinner: ({ color, }: BrailleSpinnerProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* BrailleSpinner — compact animated spinner using braille characters.
|
|
4
|
+
*/
|
|
5
|
+
import { Text } from 'ink';
|
|
6
|
+
import { useState, useEffect } from 'react';
|
|
7
|
+
import { SPINNER_FRAMES, SPINNER_INTERVAL, Colors } from '../styles.js';
|
|
8
|
+
export const BrailleSpinner = ({ color = Colors.active, }) => {
|
|
9
|
+
const [frame, setFrame] = useState(0);
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
const id = setInterval(() => setFrame((f) => (f + 1) % SPINNER_FRAMES.length), SPINNER_INTERVAL);
|
|
12
|
+
return () => clearInterval(id);
|
|
13
|
+
}, []);
|
|
14
|
+
return _jsx(Text, { color: color, children: SPINNER_FRAMES[frame] });
|
|
15
|
+
};
|
|
@@ -1,23 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ConsoleView — Full-screen
|
|
2
|
+
* ConsoleView — Full-screen wrapper without outer border.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* slash
|
|
6
|
-
*
|
|
7
|
-
* The input is dormant by default. Activation:
|
|
8
|
-
* - "/" → activate in slash-command mode
|
|
9
|
-
* - Tab → activate for free-text Claude query
|
|
10
|
-
* Deactivation: Enter (submit) or Escape. Backspacing to empty also deactivates.
|
|
11
|
-
*
|
|
12
|
-
* While active, commandMode=true on the store disables all useScreenInput handlers.
|
|
4
|
+
* Layout: content area + separator + console input with ❯ prompt.
|
|
5
|
+
* Handles slash commands, AI queries, pending prompts, and error banners.
|
|
6
|
+
* KeyHintBar integrated above the input line.
|
|
13
7
|
*/
|
|
14
8
|
import type { ReactNode } from 'react';
|
|
15
9
|
import type { WizardStore } from '../store.js';
|
|
10
|
+
import { type KeyHint } from './KeyHintBar.js';
|
|
16
11
|
interface ConsoleViewProps {
|
|
17
12
|
store: WizardStore;
|
|
18
13
|
width: number;
|
|
19
14
|
height: number;
|
|
15
|
+
/** Extra key hints from the active screen. */
|
|
16
|
+
screenHints?: KeyHint[];
|
|
20
17
|
children?: ReactNode;
|
|
21
18
|
}
|
|
22
|
-
export declare const ConsoleView: ({ store, width, height, children, }: ConsoleViewProps) => import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export declare const ConsoleView: ({ store, width, height, screenHints, children, }: ConsoleViewProps) => import("react/jsx-runtime").JSX.Element;
|
|
23
20
|
export {};
|
|
@@ -1,29 +1,25 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
|
-
* ConsoleView — Full-screen
|
|
3
|
+
* ConsoleView — Full-screen wrapper without outer border.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* slash
|
|
7
|
-
*
|
|
8
|
-
* The input is dormant by default. Activation:
|
|
9
|
-
* - "/" → activate in slash-command mode
|
|
10
|
-
* - Tab → activate for free-text Claude query
|
|
11
|
-
* Deactivation: Enter (submit) or Escape. Backspacing to empty also deactivates.
|
|
12
|
-
*
|
|
13
|
-
* While active, commandMode=true on the store disables all useScreenInput handlers.
|
|
5
|
+
* Layout: content area + separator + console input with ❯ prompt.
|
|
6
|
+
* Handles slash commands, AI queries, pending prompts, and error banners.
|
|
7
|
+
* KeyHintBar integrated above the input line.
|
|
14
8
|
*/
|
|
15
9
|
import { Box, Text, useInput } from 'ink';
|
|
16
|
-
import { useState, useEffect
|
|
10
|
+
import { useState, useEffect } from 'react';
|
|
17
11
|
import { Spinner } from '@inkjs/ui';
|
|
18
|
-
import { OutroKind } from '
|
|
19
|
-
import { SlashCommandInput } from '../primitives/
|
|
20
|
-
import { PickerMenu } from '../primitives/
|
|
21
|
-
import { Colors, Icons } from '../styles.js';
|
|
12
|
+
import { OutroKind } from '../session-constants.js';
|
|
13
|
+
import { SlashCommandInput } from '../primitives/index.js';
|
|
14
|
+
import { PickerMenu } from '../primitives/index.js';
|
|
15
|
+
import { Colors, Icons, Layout } from '../styles.js';
|
|
16
|
+
import { useWizardStore } from '../hooks/useWizardStore.js';
|
|
22
17
|
import { Overlay } from '../router.js';
|
|
23
18
|
import { queryConsole, resolveConsoleCredentials, buildSessionContext, } from '../../../lib/console-query.js';
|
|
24
|
-
import { COMMANDS, getWhoamiText, parseFeedbackSlashInput,
|
|
19
|
+
import { COMMANDS, getWhoamiText, parseFeedbackSlashInput, } from '../console-commands.js';
|
|
25
20
|
import { analytics } from '../../../utils/analytics.js';
|
|
26
21
|
import { trackWizardFeedback } from '../../../utils/track-wizard-feedback.js';
|
|
22
|
+
import { KeyHintBar } from './KeyHintBar.js';
|
|
27
23
|
function executeCommand(raw, store) {
|
|
28
24
|
const [cmd] = raw.trim().split(/\s+/);
|
|
29
25
|
switch (cmd) {
|
|
@@ -37,7 +33,27 @@ function executeCommand(raw, store) {
|
|
|
37
33
|
store.showLogoutOverlay();
|
|
38
34
|
break;
|
|
39
35
|
case '/whoami':
|
|
40
|
-
|
|
36
|
+
// Show current data immediately, then refresh from API
|
|
37
|
+
store.setCommandFeedback(getWhoamiText(store.session), 30_000);
|
|
38
|
+
if (store.session.credentials?.idToken && store.session.region) {
|
|
39
|
+
void import('../../../lib/api.js').then(({ fetchAmplitudeUser }) => {
|
|
40
|
+
fetchAmplitudeUser(store.session.credentials.idToken, store.session.region)
|
|
41
|
+
.then((userInfo) => {
|
|
42
|
+
if (userInfo.email)
|
|
43
|
+
store.session.userEmail = userInfo.email;
|
|
44
|
+
const orgId = store.session.selectedOrgId;
|
|
45
|
+
if (orgId) {
|
|
46
|
+
const org = userInfo.orgs.find((o) => o.id === orgId);
|
|
47
|
+
if (org)
|
|
48
|
+
store.session.selectedOrgName = org.name;
|
|
49
|
+
}
|
|
50
|
+
store.setCommandFeedback(getWhoamiText(store.session), 30_000);
|
|
51
|
+
})
|
|
52
|
+
.catch(() => {
|
|
53
|
+
// Non-fatal — keep showing what we have
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
41
57
|
break;
|
|
42
58
|
case '/slack':
|
|
43
59
|
store.showSlackOverlay();
|
|
@@ -55,8 +71,6 @@ function executeCommand(raw, store) {
|
|
|
55
71
|
});
|
|
56
72
|
break;
|
|
57
73
|
}
|
|
58
|
-
case '/test':
|
|
59
|
-
return TEST_PROMPT;
|
|
60
74
|
case '/mcp':
|
|
61
75
|
store.showMcpOverlay();
|
|
62
76
|
break;
|
|
@@ -71,7 +85,7 @@ function executeCommand(raw, store) {
|
|
|
71
85
|
store.setCommandFeedback(`Unknown command: ${cmd}. Type / to see available commands.`);
|
|
72
86
|
}
|
|
73
87
|
}
|
|
74
|
-
export const ConsoleView = ({ store, width, height, children, }) => {
|
|
88
|
+
export const ConsoleView = ({ store, width, height, screenHints, children, }) => {
|
|
75
89
|
const [inputActive, setInputActive] = useState(false);
|
|
76
90
|
const [initialValue, setInitialValue] = useState('');
|
|
77
91
|
const [inputKey, setInputKey] = useState(0);
|
|
@@ -82,10 +96,10 @@ export const ConsoleView = ({ store, width, height, children, }) => {
|
|
|
82
96
|
const [planInputMode, setPlanInputMode] = useState('options');
|
|
83
97
|
const [planFeedbackText, setPlanFeedbackText] = useState('');
|
|
84
98
|
const [planCursorVisible, setPlanCursorVisible] = useState(true);
|
|
85
|
-
|
|
99
|
+
useWizardStore(store);
|
|
86
100
|
const activate = (seed = '') => {
|
|
87
101
|
setInitialValue(seed);
|
|
88
|
-
setInputKey((k) => k + 1);
|
|
102
|
+
setInputKey((k) => k + 1);
|
|
89
103
|
setInputActive(true);
|
|
90
104
|
store.setCommandMode(true);
|
|
91
105
|
};
|
|
@@ -97,13 +111,12 @@ export const ConsoleView = ({ store, width, height, children, }) => {
|
|
|
97
111
|
const screenError = store.screenError;
|
|
98
112
|
const showResponse = loading || !!response;
|
|
99
113
|
const showFeedback = !showResponse && !!feedback;
|
|
100
|
-
const innerWidth = width
|
|
101
|
-
const separator =
|
|
114
|
+
const innerWidth = width;
|
|
115
|
+
const separator = Layout.separatorChar.repeat(Math.max(0, innerWidth - 2));
|
|
102
116
|
const responseIsLong = !!response && response.split('\n').length > 3;
|
|
103
117
|
const pendingPrompt = store.pendingPrompt;
|
|
104
118
|
// Watch for activation keys while the input is dormant
|
|
105
119
|
useInput((char, key) => {
|
|
106
|
-
// Escape or Q dismisses overlays: pending prompt (skip) or long response
|
|
107
120
|
if (key.escape || char === 'q' || char === 'Q') {
|
|
108
121
|
if (pendingPrompt && pendingPrompt.kind !== 'event-plan') {
|
|
109
122
|
store.resolvePrompt(pendingPrompt.kind === 'confirm' ? false : '');
|
|
@@ -121,7 +134,9 @@ export const ConsoleView = ({ store, width, height, children, }) => {
|
|
|
121
134
|
if (char === '/') {
|
|
122
135
|
activate('/');
|
|
123
136
|
}
|
|
124
|
-
else if (key.tab
|
|
137
|
+
else if (key.tab &&
|
|
138
|
+
store.session.credentials !== null &&
|
|
139
|
+
store.session.introConcluded) {
|
|
125
140
|
activate('');
|
|
126
141
|
}
|
|
127
142
|
}, { isActive: !inputActive });
|
|
@@ -147,7 +162,7 @@ export const ConsoleView = ({ store, width, height, children, }) => {
|
|
|
147
162
|
.then((text) => {
|
|
148
163
|
setResponse(text);
|
|
149
164
|
setHistory((h) => [
|
|
150
|
-
...h,
|
|
165
|
+
...h.slice(-8),
|
|
151
166
|
{ role: 'user', content: value },
|
|
152
167
|
{ role: 'assistant', content: text },
|
|
153
168
|
]);
|
|
@@ -165,7 +180,7 @@ export const ConsoleView = ({ store, width, height, children, }) => {
|
|
|
165
180
|
const id = setInterval(() => setPlanCursorVisible((v) => !v), 530);
|
|
166
181
|
return () => clearInterval(id);
|
|
167
182
|
}, [planInputMode]);
|
|
168
|
-
// Reset plan input state when the prompt clears
|
|
183
|
+
// Reset plan input state when the prompt clears
|
|
169
184
|
useEffect(() => {
|
|
170
185
|
if (!pendingPrompt) {
|
|
171
186
|
setPlanInputMode('options');
|
|
@@ -200,9 +215,10 @@ export const ConsoleView = ({ store, width, height, children, }) => {
|
|
|
200
215
|
}
|
|
201
216
|
return;
|
|
202
217
|
}
|
|
203
|
-
// options mode
|
|
218
|
+
// options mode — require explicit Y to approve (Enter alone is too easy
|
|
219
|
+
// to hit accidentally while the plan is pending in the background)
|
|
204
220
|
const lc = char.toLowerCase();
|
|
205
|
-
if (lc === 'y'
|
|
221
|
+
if (lc === 'y') {
|
|
206
222
|
store.resolveEventPlan({ decision: 'approved' });
|
|
207
223
|
}
|
|
208
224
|
else if (lc === 's') {
|
|
@@ -214,18 +230,19 @@ export const ConsoleView = ({ store, width, height, children, }) => {
|
|
|
214
230
|
}, {
|
|
215
231
|
isActive: !inputActive && !!pendingPrompt && pendingPrompt.kind === 'event-plan',
|
|
216
232
|
});
|
|
217
|
-
// Show the latest status message when an overlay is active
|
|
218
|
-
// own TabContainer handles this for the non-overlay case.
|
|
233
|
+
// Show the latest status message when an overlay is active
|
|
219
234
|
const overlayValues = Object.values(Overlay);
|
|
220
235
|
const isOverlay = overlayValues.includes(store.currentScreen);
|
|
221
236
|
const lastStatus = isOverlay && store.statusMessages.length > 0
|
|
222
237
|
? store.statusMessages[store.statusMessages.length - 1]
|
|
223
238
|
: null;
|
|
224
|
-
return (_jsxs(Box, { width: width, height: height, flexDirection: "column",
|
|
239
|
+
return (_jsxs(Box, { width: width, height: height, flexDirection: "column", children: [_jsx(Box, { flexDirection: "column", flexGrow: 1, overflow: "hidden", children: pendingPrompt ? (_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: Layout.paddingX, paddingY: 1, children: [pendingPrompt.kind === 'confirm' ? (_jsx(PickerMenu, { message: pendingPrompt.message, options: [
|
|
225
240
|
{ label: 'Yes', value: 'yes' },
|
|
226
241
|
{ label: 'No', value: 'no' },
|
|
227
242
|
], onSelect: (v) => store.resolvePrompt(v === 'yes') })) : pendingPrompt.kind === 'choice' ? (_jsx(PickerMenu, { message: pendingPrompt.message, options: pendingPrompt.options.map((o) => ({
|
|
228
243
|
label: o,
|
|
229
244
|
value: o,
|
|
230
|
-
})), onSelect: (v) => store.resolvePrompt(v) })) : (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsx(Text, { color: Colors.
|
|
245
|
+
})), onSelect: (v) => store.resolvePrompt(v) })) : (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsx(Text, { color: Colors.muted, children: "Suggested events for your app:" }), _jsx(Text, { color: Colors.heading, bold: true, children: "Instrumentation Plan" }), pendingPrompt.events.map((e, i) => (_jsxs(Text, { wrap: "wrap", children: [_jsxs(Text, { color: Colors.accent, bold: true, children: [Icons.bullet, " ", e.name] }), e.description ? (_jsxs(Text, { color: Colors.secondary, children: [" \u2014 ", e.description] })) : null] }, e.name || i))), planInputMode === 'feedback' ? (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: Colors.muted, children: "Feedback: " }), _jsxs(Text, { children: [planFeedbackText, planCursorVisible ? '▎' : ' '] }), _jsx(Text, { color: Colors.muted, children: "[Enter] send [Esc] cancel" })] })) : (_jsx(Text, { color: Colors.muted, children: "[Y] approve [S] skip [F] give feedback" }))] })), pendingPrompt.kind !== 'event-plan' && (_jsx(Text, { color: Colors.muted, children: " [Q / Esc] skip" }))] })) : responseIsLong ? (_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: Layout.paddingX, paddingY: 1, overflow: "hidden", children: [_jsx(Text, { color: Colors.accent, children: response }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.muted, children: "[Q / Esc] close" }) })] })) : (children) }), lastStatus && (_jsxs(Box, { paddingX: Layout.paddingX, overflow: "hidden", children: [_jsxs(Text, { color: Colors.muted, children: [Icons.diamondOpen, " "] }), _jsx(Text, { color: Colors.muted, wrap: "truncate-end", children: lastStatus })] })), screenError && (_jsxs(Box, { paddingX: Layout.paddingX, gap: 1, children: [_jsx(Text, { color: Colors.error, bold: true, children: Icons.cross }), _jsx(Box, { flexGrow: 1, overflow: "hidden", children: _jsx(Text, { color: Colors.error, wrap: "truncate-end", children: screenError.message }) }), _jsx(Text, { color: Colors.muted, children: "[R] retry" })] })), _jsx(Box, { paddingX: 1, children: _jsx(Text, { color: Colors.border, children: separator }) }), showFeedback && (_jsxs(Box, { paddingX: Layout.paddingX, children: [_jsxs(Text, { color: Colors.accent, children: [Icons.prompt, " "] }), _jsx(Text, { color: Colors.secondary, children: feedback })] })), showResponse && !responseIsLong && (_jsx(Box, { paddingX: Layout.paddingX, paddingY: 1, gap: 1, flexDirection: "column", children: loading ? (_jsx(Spinner, {})) : (_jsx(Text, { color: Colors.accent, children: response })) })), loading && responseIsLong && (_jsx(Box, { paddingX: Layout.paddingX, children: _jsx(Spinner, {}) })), _jsx(KeyHintBar, { hints: screenHints, width: innerWidth, showAskHint: store.session.credentials !== null && store.session.introConcluded }), _jsxs(Box, { paddingX: Layout.paddingX, children: [_jsxs(Text, { color: inputActive ? Colors.accent : Colors.muted, children: [Icons.prompt, ' '] }), inputActive ? (_jsx(SlashCommandInput, { commands: COMMANDS, isActive: inputActive, initialValue: initialValue, onSubmit: handleSubmit, onDeactivate: deactivate }, inputKey)) : (_jsx(Text, { color: Colors.disabled, children: store.session.credentials !== null && store.session.introConcluded
|
|
246
|
+
? 'Press / for commands or Tab to ask a question'
|
|
247
|
+
: 'Press / for commands' }))] })] }));
|
|
231
248
|
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HeaderBar — minimal header line.
|
|
3
|
+
*
|
|
4
|
+
* "Amplitude Wizard" left, org/project right with dot separator.
|
|
5
|
+
*/
|
|
6
|
+
interface HeaderBarProps {
|
|
7
|
+
width: number;
|
|
8
|
+
orgName?: string | null;
|
|
9
|
+
projectName?: string | null;
|
|
10
|
+
}
|
|
11
|
+
export declare const HeaderBar: ({ width, orgName, projectName }: HeaderBarProps) => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* HeaderBar — minimal header line.
|
|
4
|
+
*
|
|
5
|
+
* "Amplitude Wizard" left, org/project right with dot separator.
|
|
6
|
+
*/
|
|
7
|
+
import { Box, Text } from 'ink';
|
|
8
|
+
import { Colors, Icons } from '../styles.js';
|
|
9
|
+
export const HeaderBar = ({ width, orgName, projectName }) => {
|
|
10
|
+
const contextParts = [];
|
|
11
|
+
if (orgName)
|
|
12
|
+
contextParts.push(orgName);
|
|
13
|
+
if (projectName)
|
|
14
|
+
contextParts.push(projectName);
|
|
15
|
+
const context = contextParts.join(' / ');
|
|
16
|
+
return (_jsxs(Box, { width: width, paddingX: 1, children: [_jsx(Box, { flexShrink: 0, children: _jsx(Text, { color: Colors.heading, bold: true, children: "Amplitude Wizard" }) }), context && (_jsxs(Box, { flexGrow: 1, justifyContent: "flex-end", overflow: "hidden", children: [_jsxs(Text, { color: Colors.muted, children: [" ", Icons.dot, " "] }), _jsx(Text, { color: Colors.secondary, wrap: "truncate-end", children: context })] }))] }));
|
|
17
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JourneyStepper — persistent 1-line progress indicator.
|
|
3
|
+
*
|
|
4
|
+
* Shows where the user is in the wizard flow:
|
|
5
|
+
* ✓ Welcome ✓ Auth ● Setup ○ Verify ○ Done
|
|
6
|
+
*
|
|
7
|
+
* Adapts to terminal width: shows labels on wide terminals,
|
|
8
|
+
* dots-only on narrow ones.
|
|
9
|
+
*/
|
|
10
|
+
import type { WizardStore } from '../store.js';
|
|
11
|
+
interface JourneyStepperProps {
|
|
12
|
+
store: WizardStore;
|
|
13
|
+
width: number;
|
|
14
|
+
}
|
|
15
|
+
export declare const JourneyStepper: ({ store, width }: JourneyStepperProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* JourneyStepper — persistent 1-line progress indicator.
|
|
4
|
+
*
|
|
5
|
+
* Shows where the user is in the wizard flow:
|
|
6
|
+
* ✓ Welcome ✓ Auth ● Setup ○ Verify ○ Done
|
|
7
|
+
*
|
|
8
|
+
* Adapts to terminal width: shows labels on wide terminals,
|
|
9
|
+
* dots-only on narrow ones.
|
|
10
|
+
*/
|
|
11
|
+
import { Box, Text } from 'ink';
|
|
12
|
+
import { useWizardStore } from '../hooks/useWizardStore.js';
|
|
13
|
+
import { Screen, Flow } from '../router.js';
|
|
14
|
+
import { Colors, Icons, Brand } from '../styles.js';
|
|
15
|
+
/** Human-readable labels for wizard flow steps. */
|
|
16
|
+
const WIZARD_STEPS = [
|
|
17
|
+
{ screen: Screen.Intro, label: 'Welcome' },
|
|
18
|
+
{ screen: Screen.Auth, label: 'Auth' },
|
|
19
|
+
{ screen: Screen.Run, label: 'Setup' },
|
|
20
|
+
{ screen: Screen.DataIngestionCheck, label: 'Verify' },
|
|
21
|
+
{ screen: Screen.Checklist, label: 'Explore' },
|
|
22
|
+
{ screen: Screen.Outro, label: 'Done' },
|
|
23
|
+
];
|
|
24
|
+
/** Screens that belong to each step (for grouping substeps). */
|
|
25
|
+
const STEP_SCREENS = {
|
|
26
|
+
Welcome: [Screen.Intro],
|
|
27
|
+
Auth: [Screen.RegionSelect, Screen.Auth, Screen.DataSetup],
|
|
28
|
+
Setup: [Screen.ActivationOptions, Screen.Setup, Screen.Run, Screen.Mcp],
|
|
29
|
+
Verify: [Screen.DataIngestionCheck],
|
|
30
|
+
Explore: [Screen.Checklist, Screen.Slack],
|
|
31
|
+
Done: [Screen.Outro],
|
|
32
|
+
};
|
|
33
|
+
function getStepState(stepLabel, currentScreen, completedScreens) {
|
|
34
|
+
const screens = STEP_SCREENS[stepLabel] ?? [];
|
|
35
|
+
const isCurrent = screens.some((s) => s === currentScreen);
|
|
36
|
+
if (isCurrent)
|
|
37
|
+
return 'active';
|
|
38
|
+
// A step is completed if all its screens are completed
|
|
39
|
+
const allDone = screens.every((s) => completedScreens.has(s));
|
|
40
|
+
if (allDone)
|
|
41
|
+
return 'completed';
|
|
42
|
+
return 'future';
|
|
43
|
+
}
|
|
44
|
+
/** Build set of screens the flow has already passed. */
|
|
45
|
+
function getCompletedScreens(currentScreen) {
|
|
46
|
+
const completed = new Set();
|
|
47
|
+
const allScreensInOrder = WIZARD_STEPS.flatMap((step) => STEP_SCREENS[step.label] ?? []);
|
|
48
|
+
for (const screen of allScreensInOrder) {
|
|
49
|
+
if (screen === currentScreen)
|
|
50
|
+
break;
|
|
51
|
+
completed.add(screen);
|
|
52
|
+
}
|
|
53
|
+
return completed;
|
|
54
|
+
}
|
|
55
|
+
export const JourneyStepper = ({ store, width }) => {
|
|
56
|
+
useWizardStore(store);
|
|
57
|
+
// Only show stepper for the main wizard flow
|
|
58
|
+
if (store.router.activeFlow !== Flow.Wizard)
|
|
59
|
+
return null;
|
|
60
|
+
const currentScreen = store.currentScreen;
|
|
61
|
+
const completedScreens = getCompletedScreens(currentScreen);
|
|
62
|
+
// Determine if we have room for labels (need ~50 chars for all labels)
|
|
63
|
+
const showLabels = width >= 60;
|
|
64
|
+
const steps = WIZARD_STEPS.map((step) => {
|
|
65
|
+
const state = getStepState(step.label, currentScreen, completedScreens);
|
|
66
|
+
return { ...step, state };
|
|
67
|
+
});
|
|
68
|
+
return (_jsx(Box, { paddingX: 1, children: steps.map((step, i) => {
|
|
69
|
+
const icon = step.state === 'completed'
|
|
70
|
+
? Icons.checkmark
|
|
71
|
+
: step.state === 'active'
|
|
72
|
+
? Icons.bullet
|
|
73
|
+
: Icons.bulletOpen;
|
|
74
|
+
const color = step.state === 'completed'
|
|
75
|
+
? Brand.lilac
|
|
76
|
+
: step.state === 'active'
|
|
77
|
+
? Colors.accent
|
|
78
|
+
: Colors.muted;
|
|
79
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: color, bold: step.state === 'active', children: icon }), showLabels && (_jsx(Text, { color: color, bold: step.state === 'active', children: step.state === 'active'
|
|
80
|
+
? ` ${step.label} ←`
|
|
81
|
+
: ` ${step.label}` })), i < steps.length - 1 && (_jsx(Text, { color: Colors.border, children: showLabels ? ` ${Icons.dash} ` : ` ${Icons.dot} ` }))] }, step.label));
|
|
82
|
+
}) }));
|
|
83
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KeyHintBar — context-sensitive keyboard shortcut display.
|
|
3
|
+
*
|
|
4
|
+
* Each screen declares its available keys; the bar renders them.
|
|
5
|
+
* Always shows / and Tab hints so users discover commands and questions.
|
|
6
|
+
*/
|
|
7
|
+
export interface KeyHint {
|
|
8
|
+
key: string;
|
|
9
|
+
label: string;
|
|
10
|
+
}
|
|
11
|
+
interface KeyHintBarProps {
|
|
12
|
+
hints?: KeyHint[];
|
|
13
|
+
width: number;
|
|
14
|
+
showDefaults?: boolean;
|
|
15
|
+
/** When false, hides the "Tab → Ask a question" hint (e.g. before auth). */
|
|
16
|
+
showAskHint?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare const KeyHintBar: ({ hints, width, showDefaults, showAskHint, }: KeyHintBarProps) => import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* KeyHintBar — context-sensitive keyboard shortcut display.
|
|
4
|
+
*
|
|
5
|
+
* Each screen declares its available keys; the bar renders them.
|
|
6
|
+
* Always shows / and Tab hints so users discover commands and questions.
|
|
7
|
+
*/
|
|
8
|
+
import { Box, Text } from 'ink';
|
|
9
|
+
import { Colors } from '../styles.js';
|
|
10
|
+
const COMMANDS_HINT = { key: '/', label: 'Commands' };
|
|
11
|
+
const ASK_HINT = { key: 'Tab', label: 'Ask a question' };
|
|
12
|
+
export const KeyHintBar = ({ hints = [], width, showDefaults = true, showAskHint = true, }) => {
|
|
13
|
+
const defaults = showDefaults
|
|
14
|
+
? showAskHint
|
|
15
|
+
? [COMMANDS_HINT, ASK_HINT]
|
|
16
|
+
: [COMMANDS_HINT]
|
|
17
|
+
: [];
|
|
18
|
+
const allHints = [...hints, ...defaults];
|
|
19
|
+
return (_jsx(Box, { width: width, paddingX: 1, gap: 2, children: allHints.map((hint) => (_jsxs(Box, { children: [_jsx(Text, { color: Colors.muted, children: "[" }), _jsx(Text, { color: Colors.body, bold: true, children: hint.key }), _jsxs(Text, { color: Colors.muted, children: ["] ", hint.label] })] }, hint.key + hint.label))) }));
|
|
20
|
+
};
|
|
@@ -9,9 +9,8 @@ export declare const COMMANDS: {
|
|
|
9
9
|
cmd: string;
|
|
10
10
|
desc: string;
|
|
11
11
|
}[];
|
|
12
|
-
export declare const TEST_PROMPT: string;
|
|
13
12
|
/** Returns the feedback text for the /whoami command. */
|
|
14
|
-
export declare function getWhoamiText(session: Pick<WizardSession, 'selectedOrgName' | 'selectedWorkspaceName' | 'region'>): string;
|
|
13
|
+
export declare function getWhoamiText(session: Pick<WizardSession, 'selectedOrgId' | 'selectedOrgName' | 'selectedWorkspaceName' | 'selectedProjectName' | 'region' | 'credentials' | 'userEmail'>): string;
|
|
15
14
|
/**
|
|
16
15
|
* Parses `/feedback <message>` from a slash command line.
|
|
17
16
|
* Returns `undefined` if the line is not a feedback command or the message is empty.
|