@amplitude/wizard 1.1.0 → 1.2.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/dist/bin.js +47 -11
- package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.js +11 -1
- package/dist/src/frameworks/react-router/react-router-wizard-agent.js +65 -8
- package/dist/src/frameworks/vue/vue-wizard-agent.js +6 -1
- package/dist/src/lib/agent-interface.js +46 -0
- package/dist/src/lib/agent-runner.js +112 -51
- package/dist/src/lib/api.d.ts +35 -0
- package/dist/src/lib/api.js +118 -0
- package/dist/src/lib/commandments.js +1 -0
- package/dist/src/lib/constants.d.ts +1 -1
- package/dist/src/lib/constants.js +1 -1
- package/dist/src/lib/credential-resolution.js +7 -0
- package/dist/src/lib/framework-config.d.ts +9 -0
- package/dist/src/lib/mcp-with-fallback.d.ts +43 -0
- package/dist/src/lib/mcp-with-fallback.js +220 -0
- package/dist/src/lib/version-check.d.ts +17 -0
- package/dist/src/lib/version-check.js +72 -0
- package/dist/src/lib/wizard-session.d.ts +22 -7
- package/dist/src/lib/wizard-session.js +5 -3
- package/dist/src/run.d.ts +18 -1
- package/dist/src/run.js +104 -15
- package/dist/src/ui/agent-ui.d.ts +2 -0
- package/dist/src/ui/agent-ui.js +10 -0
- package/dist/src/ui/logging-ui.d.ts +2 -0
- package/dist/src/ui/logging-ui.js +6 -0
- package/dist/src/ui/tui/components/ConsoleView.js +14 -1
- package/dist/src/ui/tui/components/JourneyStepper.js +1 -3
- package/dist/src/ui/tui/flows.d.ts +0 -1
- package/dist/src/ui/tui/flows.js +1 -9
- package/dist/src/ui/tui/ink-ui.d.ts +2 -0
- package/dist/src/ui/tui/ink-ui.js +6 -0
- package/dist/src/ui/tui/screen-registry.js +0 -2
- package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +5 -3
- package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +124 -4
- package/dist/src/ui/tui/screens/OutroScreen.js +12 -3
- package/dist/src/ui/tui/store.d.ts +22 -3
- package/dist/src/ui/tui/store.js +52 -18
- package/dist/src/ui/tui/utils/diagnostics.js +1 -3
- package/dist/src/ui/wizard-ui.d.ts +8 -0
- package/dist/src/utils/analytics.d.ts +15 -0
- package/dist/src/utils/analytics.js +37 -0
- package/dist/src/utils/setup-utils.js +6 -1
- package/package.json +2 -2
- package/skills/integration/integration-android/SKILL.md +7 -10
- package/skills/integration/integration-android/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-android/references/android.md +1468 -0
- package/skills/integration/integration-android/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-android/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-android/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-angular/SKILL.md +6 -8
- package/skills/integration/integration-angular/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-angular/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-angular/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-angular/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-angular/references/browser-sdk-2.md +67 -20
- package/skills/integration/{integration-swift/references/analytics.md → integration-angular/references/browser-unified-sdk.md} +591 -157
- package/skills/integration/integration-astro-hybrid/SKILL.md +6 -13
- package/skills/integration/integration-astro-hybrid/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-astro-hybrid/references/browser-sdk-2.md +67 -20
- package/skills/integration/{integration-android/references/analytics.md → integration-astro-hybrid/references/browser-unified-sdk.md} +591 -157
- package/skills/integration/integration-astro-ssr/SKILL.md +6 -11
- package/skills/integration/integration-astro-ssr/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-astro-ssr/references/browser-sdk-2.md +67 -20
- package/skills/integration/{integration-javascript_node/references/analytics.md → integration-astro-ssr/references/browser-unified-sdk.md} +591 -157
- package/skills/integration/integration-astro-static/SKILL.md +6 -8
- package/skills/integration/integration-astro-static/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-astro-static/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-astro-static/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-astro-static/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-astro-static/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-astro-static/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-astro-view-transitions/SKILL.md +6 -10
- package/skills/integration/integration-astro-view-transitions/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-astro-view-transitions/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-astro-view-transitions/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-django/SKILL.md +5 -16
- package/skills/integration/integration-django/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-django/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-django/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-django/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-django/references/python.md +1 -1
- package/skills/integration/integration-expo/SKILL.md +8 -13
- package/skills/integration/integration-expo/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-expo/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-expo/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-expo/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-expo/references/react-native-sdk.md +11 -10
- package/skills/integration/integration-fastapi/SKILL.md +5 -16
- package/skills/integration/integration-fastapi/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-fastapi/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-fastapi/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-fastapi/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-fastapi/references/python.md +1 -1
- package/skills/integration/integration-flask/SKILL.md +5 -15
- package/skills/integration/integration-flask/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-flask/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-flask/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-flask/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-flask/references/python.md +1 -1
- package/skills/integration/integration-javascript_node/SKILL.md +6 -12
- package/skills/integration/integration-javascript_node/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-javascript_node/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-javascript_node/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-javascript_node/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-javascript_node/references/node.md +1457 -0
- package/skills/integration/integration-javascript_web/SKILL.md +7 -16
- package/skills/integration/integration-javascript_web/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-javascript_web/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-javascript_web/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-javascript_web/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-javascript_web/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-javascript_web/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-laravel/SKILL.md +5 -11
- package/skills/integration/integration-laravel/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-laravel/references/analytics.md +1 -1
- package/skills/integration/integration-laravel/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-laravel/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-laravel/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-nextjs-app-router/SKILL.md +6 -13
- package/skills/integration/integration-nextjs-app-router/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-nextjs-app-router/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-nextjs-app-router/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-nextjs-pages-router/SKILL.md +6 -13
- package/skills/integration/integration-nextjs-pages-router/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-nextjs-pages-router/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-nextjs-pages-router/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-nuxt-3.6/SKILL.md +6 -5
- package/skills/integration/integration-nuxt-3.6/references/EXAMPLE.md +1 -1
- package/skills/integration/integration-nuxt-3.6/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-nuxt-3.6/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-nuxt-3.6/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-nuxt-4/SKILL.md +6 -5
- package/skills/integration/integration-nuxt-4/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-nuxt-4/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-nuxt-4/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-python/SKILL.md +8 -13
- package/skills/integration/integration-python/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-python/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-python/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-python/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-python/references/python.md +1 -1
- package/skills/integration/integration-react-native/SKILL.md +8 -9
- package/skills/integration/integration-react-native/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-react-native/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-react-native/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-react-native/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-react-native/references/react-native-sdk.md +11 -10
- package/skills/integration/integration-react-react-router-6/SKILL.md +6 -12
- package/skills/integration/integration-react-react-router-6/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-react-react-router-6/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-react-react-router-6/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-react-react-router-7-data/SKILL.md +6 -12
- package/skills/integration/integration-react-react-router-7-data/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-react-react-router-7-data/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-react-react-router-7-data/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-react-react-router-7-declarative/SKILL.md +6 -12
- package/skills/integration/integration-react-react-router-7-declarative/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-react-react-router-7-declarative/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-react-react-router-7-declarative/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-react-react-router-7-framework/SKILL.md +6 -12
- package/skills/integration/integration-react-react-router-7-framework/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-react-react-router-7-framework/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-react-react-router-7-framework/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-react-tanstack-router-code-based/SKILL.md +6 -14
- package/skills/integration/integration-react-tanstack-router-code-based/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-react-tanstack-router-code-based/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-react-tanstack-router-code-based/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-react-tanstack-router-file-based/SKILL.md +6 -14
- package/skills/integration/integration-react-tanstack-router-file-based/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-react-tanstack-router-file-based/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-react-tanstack-router-file-based/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-react-vite/SKILL.md +6 -12
- package/skills/integration/integration-react-vite/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-react-vite/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-react-vite/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-react-vite/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-react-vite/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-react-vite/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-ruby/SKILL.md +6 -10
- package/skills/integration/integration-ruby/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-ruby/references/analytics.md +1 -1
- package/skills/integration/integration-ruby/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-ruby/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-ruby/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-ruby-on-rails/SKILL.md +5 -14
- package/skills/integration/integration-ruby-on-rails/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-ruby-on-rails/references/analytics.md +1 -1
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-sveltekit/SKILL.md +6 -6
- package/skills/integration/integration-sveltekit/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-sveltekit/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-sveltekit/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-sveltekit/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-sveltekit/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-sveltekit/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-swift/SKILL.md +9 -10
- package/skills/integration/integration-swift/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-swift/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-swift/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-swift/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-swift/references/ios.md +1480 -0
- package/skills/integration/integration-tanstack-start/SKILL.md +6 -17
- package/skills/integration/integration-tanstack-start/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-tanstack-start/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-tanstack-start/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-vue-3/SKILL.md +6 -5
- package/skills/integration/integration-vue-3/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-vue-3/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-vue-3/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-vue-3/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-vue-3/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-vue-3/references/browser-unified-sdk.md +2212 -0
- package/skills/taxonomy/amplitude-chart-dashboard-plan/SKILL.md +183 -0
- package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +0 -12
- package/dist/src/ui/tui/screens/ChecklistScreen.js +0 -111
package/dist/bin.js
CHANGED
|
@@ -295,6 +295,7 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
295
295
|
if (!options.installDir)
|
|
296
296
|
options.installDir = process.cwd();
|
|
297
297
|
const session = await buildSessionFromOptions(options);
|
|
298
|
+
session.agent = true;
|
|
298
299
|
await resolveNonInteractiveCredentials(session, options, 'agent', agentUI);
|
|
299
300
|
await lazyRunWizard(options, session);
|
|
300
301
|
})();
|
|
@@ -354,16 +355,18 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
354
355
|
const { resolveCredentials } = await import('./src/lib/credential-resolution.js');
|
|
355
356
|
await resolveCredentials(session);
|
|
356
357
|
// Resolve org/workspace display names so /whoami shows them.
|
|
358
|
+
// Also extracts the numeric analytics project ID for MCP event detection.
|
|
357
359
|
// Fire-and-forget so it doesn't block startup.
|
|
358
360
|
if (session.region && session.selectedOrgId) {
|
|
359
361
|
const { getStoredUser, getStoredToken } = await import('./src/utils/ampli-settings.js');
|
|
360
|
-
const { fetchAmplitudeUser } = await import('./src/lib/api.js');
|
|
362
|
+
const { fetchAmplitudeUser, extractProjectId } = await import('./src/lib/api.js');
|
|
361
363
|
const storedUser = getStoredUser();
|
|
362
364
|
const realUser = storedUser && storedUser.id !== 'pending' ? storedUser : null;
|
|
363
365
|
const zone = session.region;
|
|
364
366
|
const storedToken = realUser
|
|
365
367
|
? getStoredToken(realUser.id, realUser.zone)
|
|
366
368
|
: getStoredToken(undefined, zone);
|
|
369
|
+
logToFile(`[bin] fire-and-forget: storedToken=${storedToken ? 'found' : 'null'}`);
|
|
367
370
|
if (storedToken) {
|
|
368
371
|
fetchAmplitudeUser(storedToken.idToken, zone)
|
|
369
372
|
.then((userInfo) => {
|
|
@@ -372,16 +375,44 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
372
375
|
session.userEmail = userInfo.email;
|
|
373
376
|
changed = true;
|
|
374
377
|
}
|
|
378
|
+
if (userInfo.email) {
|
|
379
|
+
analytics.setDistinctId(userInfo.email);
|
|
380
|
+
analytics.identifyUser({
|
|
381
|
+
email: userInfo.email,
|
|
382
|
+
org_id: session.selectedOrgId ?? undefined,
|
|
383
|
+
org_name: session.selectedOrgName ?? undefined,
|
|
384
|
+
workspace_id: session.selectedWorkspaceId ?? undefined,
|
|
385
|
+
workspace_name: session.selectedWorkspaceName ?? undefined,
|
|
386
|
+
project_id: session.selectedProjectId,
|
|
387
|
+
project_name: session.selectedProjectName,
|
|
388
|
+
region: session.region,
|
|
389
|
+
integration: session.integration,
|
|
390
|
+
});
|
|
391
|
+
}
|
|
375
392
|
if (session.selectedOrgId) {
|
|
376
|
-
|
|
393
|
+
// Fall back to the first org if the stored ID is stale
|
|
394
|
+
// (e.g. session checkpoint from a different account).
|
|
395
|
+
const org = userInfo.orgs.find((o) => o.id === session.selectedOrgId) ?? userInfo.orgs[0];
|
|
396
|
+
logToFile(`[bin] fire-and-forget: orgs=${userInfo.orgs
|
|
397
|
+
.map((o) => o.id)
|
|
398
|
+
.join(',')}, looking for ${session.selectedOrgId}, using=${org?.id ?? 'none'}`);
|
|
377
399
|
if (org) {
|
|
378
400
|
session.selectedOrgName = org.name;
|
|
379
401
|
changed = true;
|
|
402
|
+
// Fall back to the first workspace if the stored ID is stale.
|
|
380
403
|
const ws = session.selectedWorkspaceId
|
|
381
|
-
? org.workspaces.find((w) => w.id === session.selectedWorkspaceId)
|
|
382
|
-
:
|
|
404
|
+
? org.workspaces.find((w) => w.id === session.selectedWorkspaceId) ?? org.workspaces[0]
|
|
405
|
+
: org.workspaces[0];
|
|
383
406
|
if (ws) {
|
|
384
407
|
session.selectedWorkspaceName = ws.name;
|
|
408
|
+
// Extract the analytics project ID from the lowest-rank environment.
|
|
409
|
+
const projectId = extractProjectId(ws);
|
|
410
|
+
logToFile(`[bin] project ID resolution: environments=${ws.environments?.length ?? 'null'}, projectId=${projectId}`);
|
|
411
|
+
if (projectId)
|
|
412
|
+
session.selectedProjectId = projectId;
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
logToFile(`[bin] project ID resolution: no workspaces in org ${org.id}`);
|
|
385
416
|
}
|
|
386
417
|
}
|
|
387
418
|
}
|
|
@@ -389,8 +420,8 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
389
420
|
tui.store.emitChange();
|
|
390
421
|
}
|
|
391
422
|
})
|
|
392
|
-
.catch(() => {
|
|
393
|
-
|
|
423
|
+
.catch((err) => {
|
|
424
|
+
logToFile(`[bin] fire-and-forget fetchAmplitudeUser failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
394
425
|
});
|
|
395
426
|
}
|
|
396
427
|
}
|
|
@@ -429,7 +460,7 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
429
460
|
const { analytics } = await import('./src/utils/analytics.js');
|
|
430
461
|
analytics.applyOptOut();
|
|
431
462
|
const { FRAMEWORK_REGISTRY } = await import('./src/lib/registry.js');
|
|
432
|
-
const {
|
|
463
|
+
const { detectAllFrameworks } = await import('./src/run.js');
|
|
433
464
|
const installDir = session.installDir ?? process.cwd();
|
|
434
465
|
// Verbose startup diagnostics — always written to the log file;
|
|
435
466
|
// visible in the RunScreen "Logs" tab.
|
|
@@ -515,6 +546,8 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
515
546
|
});
|
|
516
547
|
// Populate user email for /whoami display
|
|
517
548
|
session.userEmail = userInfo.email;
|
|
549
|
+
analytics.setDistinctId(userInfo.email);
|
|
550
|
+
analytics.identifyUser({ email: userInfo.email });
|
|
518
551
|
// Signal AuthScreen — triggers org/workspace/API key pickers
|
|
519
552
|
tui.store.setOAuthComplete({
|
|
520
553
|
accessToken: auth.accessToken,
|
|
@@ -532,11 +565,13 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
532
565
|
})();
|
|
533
566
|
// ── Framework detection ────────────────────────────────
|
|
534
567
|
// Runs concurrently with auth while AuthScreen shows.
|
|
568
|
+
// Each detector has its own per-framework timeout internally,
|
|
569
|
+
// so no outer timeout is needed.
|
|
535
570
|
const detectionTask = (async () => {
|
|
536
|
-
const
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
571
|
+
const results = await detectAllFrameworks(installDir);
|
|
572
|
+
// Store full results on session for diagnostics
|
|
573
|
+
session.detectionResults = results;
|
|
574
|
+
const detectedIntegration = results.find((r) => r.detected)?.integration;
|
|
540
575
|
if (detectedIntegration) {
|
|
541
576
|
const config = FRAMEWORK_REGISTRY[detectedIntegration];
|
|
542
577
|
// Run gatherContext for the friendly variant label
|
|
@@ -903,6 +938,7 @@ void (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
|
903
938
|
if (storedToken) {
|
|
904
939
|
session.credentials = {
|
|
905
940
|
accessToken: storedToken.accessToken,
|
|
941
|
+
idToken: storedToken.idToken,
|
|
906
942
|
projectApiKey: '',
|
|
907
943
|
host: getHostFromRegion(zone),
|
|
908
944
|
projectId: 0,
|
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.JAVASCRIPT_NODE_AGENT_CONFIG = void 0;
|
|
4
4
|
const constants_1 = require("../../lib/constants");
|
|
5
|
+
const package_json_1 = require("../../utils/package-json");
|
|
5
6
|
const setup_utils_1 = require("../../utils/setup-utils");
|
|
6
7
|
const package_manager_detection_1 = require("../../lib/package-manager-detection");
|
|
8
|
+
const utils_1 = require("../javascript-web/utils");
|
|
7
9
|
exports.JAVASCRIPT_NODE_AGENT_CONFIG = {
|
|
8
10
|
metadata: {
|
|
9
11
|
name: 'Node.js',
|
|
@@ -19,7 +21,15 @@ exports.JAVASCRIPT_NODE_AGENT_CONFIG = {
|
|
|
19
21
|
detectPackageManager: package_manager_detection_1.detectNodePackageManagers,
|
|
20
22
|
detect: async (options) => {
|
|
21
23
|
const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
|
|
22
|
-
|
|
24
|
+
if (!packageJson)
|
|
25
|
+
return false;
|
|
26
|
+
// Don't claim projects that belong to a specific framework
|
|
27
|
+
for (const frameworkPkg of utils_1.FRAMEWORK_PACKAGES) {
|
|
28
|
+
if ((0, package_json_1.hasPackageInstalled)(frameworkPkg, packageJson)) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
23
33
|
},
|
|
24
34
|
},
|
|
25
35
|
environment: {
|
|
@@ -7,6 +7,36 @@ const package_json_1 = require("../../utils/package-json");
|
|
|
7
7
|
const setup_utils_1 = require("../../utils/setup-utils");
|
|
8
8
|
const ui_1 = require("../../ui");
|
|
9
9
|
const utils_1 = require("./utils");
|
|
10
|
+
const REACT_ROUTER_MINIMUM_VERSION = '6.0.0';
|
|
11
|
+
const TANSTACK_MINIMUM_VERSION = '1.0.0';
|
|
12
|
+
// Priority matches gatherContext: TanStack Start > TanStack Router > react-router
|
|
13
|
+
function getReactRouterVersionCheckInfo(packageJson) {
|
|
14
|
+
const tanstackStartVersion = (0, package_json_1.getPackageVersion)('@tanstack/react-start', packageJson);
|
|
15
|
+
if (tanstackStartVersion) {
|
|
16
|
+
return {
|
|
17
|
+
version: tanstackStartVersion,
|
|
18
|
+
minimumVersion: TANSTACK_MINIMUM_VERSION,
|
|
19
|
+
packageDisplayName: 'TanStack Start',
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
const tanstackRouterVersion = (0, package_json_1.getPackageVersion)('@tanstack/react-router', packageJson);
|
|
23
|
+
if (tanstackRouterVersion) {
|
|
24
|
+
return {
|
|
25
|
+
version: tanstackRouterVersion,
|
|
26
|
+
minimumVersion: TANSTACK_MINIMUM_VERSION,
|
|
27
|
+
packageDisplayName: 'TanStack Router',
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const reactRouterVersion = (0, package_json_1.getPackageVersion)('react-router', packageJson);
|
|
31
|
+
if (reactRouterVersion) {
|
|
32
|
+
return {
|
|
33
|
+
version: reactRouterVersion,
|
|
34
|
+
minimumVersion: REACT_ROUTER_MINIMUM_VERSION,
|
|
35
|
+
packageDisplayName: 'React Router',
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return {};
|
|
39
|
+
}
|
|
10
40
|
exports.REACT_ROUTER_AGENT_CONFIG = {
|
|
11
41
|
metadata: {
|
|
12
42
|
name: 'React Router',
|
|
@@ -14,6 +44,19 @@ exports.REACT_ROUTER_AGENT_CONFIG = {
|
|
|
14
44
|
docsUrl: 'https://amplitude.com/docs/sdks/analytics/browser/browser-sdk-2',
|
|
15
45
|
unsupportedVersionDocsUrl: 'https://amplitude.com/docs/sdks/analytics/browser/browser-sdk-2',
|
|
16
46
|
gatherContext: async (options) => {
|
|
47
|
+
const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
|
|
48
|
+
// TanStack Start / TanStack Router share the same browser SDK setup
|
|
49
|
+
if (packageJson &&
|
|
50
|
+
(0, package_json_1.hasPackageInstalled)('@tanstack/react-start', packageJson)) {
|
|
51
|
+
(0, ui_1.getUI)().setDetectedFramework('TanStack Start');
|
|
52
|
+
return { routerMode: utils_1.ReactRouterMode.V7_FRAMEWORK };
|
|
53
|
+
}
|
|
54
|
+
if (packageJson &&
|
|
55
|
+
(0, package_json_1.hasPackageInstalled)('@tanstack/react-router', packageJson)) {
|
|
56
|
+
(0, ui_1.getUI)().setDetectedFramework('TanStack Router');
|
|
57
|
+
return {};
|
|
58
|
+
}
|
|
59
|
+
// Standard React Router detection
|
|
17
60
|
const routerMode = await (0, utils_1.getReactRouterMode)(options);
|
|
18
61
|
if (routerMode) {
|
|
19
62
|
(0, ui_1.getUI)().setDetectedFramework(`React Router ${(0, utils_1.getReactRouterModeName)(routerMode)}`);
|
|
@@ -25,20 +68,34 @@ exports.REACT_ROUTER_AGENT_CONFIG = {
|
|
|
25
68
|
detection: {
|
|
26
69
|
packageName: 'react-router',
|
|
27
70
|
packageDisplayName: 'React Router',
|
|
28
|
-
getVersion: (packageJson) =>
|
|
71
|
+
getVersion: (packageJson) => {
|
|
72
|
+
const pkg = packageJson;
|
|
73
|
+
// Priority matches gatherContext: TanStack Start > TanStack Router > react-router
|
|
74
|
+
return ((0, package_json_1.getPackageVersion)('@tanstack/react-start', pkg) ??
|
|
75
|
+
(0, package_json_1.getPackageVersion)('@tanstack/react-router', pkg) ??
|
|
76
|
+
(0, package_json_1.getPackageVersion)('react-router', pkg));
|
|
77
|
+
},
|
|
29
78
|
getVersionBucket: utils_1.getReactRouterVersionBucket,
|
|
30
|
-
minimumVersion:
|
|
79
|
+
minimumVersion: REACT_ROUTER_MINIMUM_VERSION,
|
|
31
80
|
getInstalledVersion: async (options) => {
|
|
32
81
|
const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
82
|
+
if (!packageJson)
|
|
83
|
+
return undefined;
|
|
84
|
+
return getReactRouterVersionCheckInfo(packageJson).version;
|
|
85
|
+
},
|
|
86
|
+
getVersionCheckInfo: async (options) => {
|
|
87
|
+
const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
|
|
88
|
+
if (!packageJson)
|
|
89
|
+
return {};
|
|
90
|
+
return getReactRouterVersionCheckInfo(packageJson);
|
|
36
91
|
},
|
|
37
92
|
detect: async (options) => {
|
|
38
93
|
const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
94
|
+
if (!packageJson)
|
|
95
|
+
return false;
|
|
96
|
+
return ((0, package_json_1.hasPackageInstalled)('react-router', packageJson) ||
|
|
97
|
+
(0, package_json_1.hasPackageInstalled)('@tanstack/react-router', packageJson) ||
|
|
98
|
+
(0, package_json_1.hasPackageInstalled)('@tanstack/react-start', packageJson));
|
|
42
99
|
},
|
|
43
100
|
detectPackageManager: package_manager_detection_1.detectNodePackageManagers,
|
|
44
101
|
},
|
|
@@ -25,7 +25,12 @@ exports.VUE_AGENT_CONFIG = {
|
|
|
25
25
|
},
|
|
26
26
|
detect: async (options) => {
|
|
27
27
|
const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
|
|
28
|
-
|
|
28
|
+
if (!packageJson)
|
|
29
|
+
return false;
|
|
30
|
+
// Nuxt projects have both 'vue' and 'nuxt' — don't claim them
|
|
31
|
+
if ((0, package_json_1.hasPackageInstalled)('nuxt', packageJson))
|
|
32
|
+
return false;
|
|
33
|
+
return (0, package_json_1.hasPackageInstalled)('vue', packageJson);
|
|
29
34
|
},
|
|
30
35
|
detectPackageManager: package_manager_detection_1.detectNodePackageManagers,
|
|
31
36
|
},
|
|
@@ -799,6 +799,9 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
|
|
|
799
799
|
// Event plan file watcher — cleaned up in finally block
|
|
800
800
|
let eventPlanWatcher;
|
|
801
801
|
let eventPlanInterval;
|
|
802
|
+
// Dashboard file watcher — cleaned up in finally block
|
|
803
|
+
let dashboardWatcher;
|
|
804
|
+
let dashboardInterval;
|
|
802
805
|
try {
|
|
803
806
|
// Tools needed for the wizard:
|
|
804
807
|
// - File operations: Read, Write, Edit
|
|
@@ -861,6 +864,46 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
|
|
|
861
864
|
}
|
|
862
865
|
}, 1000);
|
|
863
866
|
}
|
|
867
|
+
// Watch for .amplitude-dashboard.json written by the agent after dashboard creation.
|
|
868
|
+
// Parses the dashboard URL and forwards it to the UI so ChecklistScreen can
|
|
869
|
+
// surface a direct link without requiring any further user action.
|
|
870
|
+
// workingDirectory is the CLI install dir (process.cwd() or --install-dir),
|
|
871
|
+
// not untrusted network input. The filename is a hardcoded constant.
|
|
872
|
+
const dashboardFilePath = path_1.default.join(agentConfig.workingDirectory, '.amplitude-dashboard.json'); // nosemgrep
|
|
873
|
+
const dashboardFileSchema = zod_1.z.object({
|
|
874
|
+
dashboardUrl: zod_1.z.string().url(),
|
|
875
|
+
});
|
|
876
|
+
const readDashboardFile = () => {
|
|
877
|
+
try {
|
|
878
|
+
const content = fs.readFileSync(dashboardFilePath, 'utf-8');
|
|
879
|
+
const result = dashboardFileSchema.safeParse(JSON.parse(content));
|
|
880
|
+
if (result.success) {
|
|
881
|
+
(0, ui_1.getUI)().setDashboardUrl(result.data.dashboardUrl);
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
catch {
|
|
885
|
+
// File doesn't exist or isn't valid JSON yet
|
|
886
|
+
}
|
|
887
|
+
};
|
|
888
|
+
try {
|
|
889
|
+
dashboardWatcher = fs.watch(dashboardFilePath, () => readDashboardFile());
|
|
890
|
+
readDashboardFile();
|
|
891
|
+
}
|
|
892
|
+
catch {
|
|
893
|
+
// File doesn't exist yet — poll until it appears
|
|
894
|
+
dashboardInterval = setInterval(() => {
|
|
895
|
+
try {
|
|
896
|
+
fs.accessSync(dashboardFilePath);
|
|
897
|
+
readDashboardFile();
|
|
898
|
+
clearInterval(dashboardInterval);
|
|
899
|
+
dashboardInterval = undefined;
|
|
900
|
+
dashboardWatcher = fs.watch(dashboardFilePath, () => readDashboardFile());
|
|
901
|
+
}
|
|
902
|
+
catch {
|
|
903
|
+
// Still waiting
|
|
904
|
+
}
|
|
905
|
+
}, 1000);
|
|
906
|
+
}
|
|
864
907
|
// Retry loop: if the agent stalls (no message for the configured timeout), abort
|
|
865
908
|
// and re-run with a fresh AbortController and prompt stream. Up to MAX_RETRIES.
|
|
866
909
|
const MAX_RETRIES = 3;
|
|
@@ -1151,6 +1194,9 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
|
|
|
1151
1194
|
eventPlanWatcher?.close();
|
|
1152
1195
|
if (eventPlanInterval)
|
|
1153
1196
|
clearInterval(eventPlanInterval);
|
|
1197
|
+
dashboardWatcher?.close();
|
|
1198
|
+
if (dashboardInterval)
|
|
1199
|
+
clearInterval(dashboardInterval);
|
|
1154
1200
|
}
|
|
1155
1201
|
}
|
|
1156
1202
|
/**
|
|
@@ -1,37 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
3
|
exports.runAgentWizard = runAgentWizard;
|
|
37
4
|
const framework_config_1 = require("./framework-config");
|
|
@@ -42,7 +9,7 @@ const ui_1 = require("../ui");
|
|
|
42
9
|
const agent_interface_1 = require("./agent-interface");
|
|
43
10
|
const urls_1 = require("../utils/urls");
|
|
44
11
|
const constants_js_1 = require("./constants.js");
|
|
45
|
-
const
|
|
12
|
+
const version_check_1 = require("./version-check");
|
|
46
13
|
const debug_1 = require("../utils/debug");
|
|
47
14
|
const benchmark_1 = require("./middleware/benchmark");
|
|
48
15
|
const wizard_abort_1 = require("../utils/wizard-abort");
|
|
@@ -76,19 +43,23 @@ async function runAgentWizard(config, session) {
|
|
|
76
43
|
(0, debug_1.enableDebugLogs)();
|
|
77
44
|
}
|
|
78
45
|
// Version check
|
|
79
|
-
if (config.detection.
|
|
80
|
-
|
|
81
|
-
(0,
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
46
|
+
if (config.detection.getInstalledVersion ||
|
|
47
|
+
config.detection.getVersionCheckInfo) {
|
|
48
|
+
const versionCheckInfo = await (0, version_check_1.getVersionCheckInfo)(config.detection, sessionToOptions(session));
|
|
49
|
+
(0, debug_1.logToFile)(`[runAgentWizard] detected version: ${versionCheckInfo.version}`);
|
|
50
|
+
const versionWarning = (0, version_check_1.getVersionWarning)(versionCheckInfo, {
|
|
51
|
+
coerceVersion: true,
|
|
52
|
+
});
|
|
53
|
+
if (versionWarning) {
|
|
54
|
+
(0, debug_1.logToFile)(`[runAgentWizard] ${versionWarning}`);
|
|
55
|
+
const docsUrl = config.metadata.unsupportedVersionDocsUrl ?? config.metadata.docsUrl;
|
|
56
|
+
(0, debug_1.logToFile)(`[runAgentWizard] directing user to manual setup guide: ${docsUrl}`);
|
|
57
|
+
const minimumVersion = versionCheckInfo.minimumVersion ?? config.detection.minimumVersion;
|
|
58
|
+
const packageDisplayName = versionCheckInfo.packageDisplayName ?? config.metadata.name;
|
|
59
|
+
const version = versionCheckInfo.version ?? 'unknown';
|
|
60
|
+
(0, ui_1.getUI)().cancel(`The wizard requires ${packageDisplayName} ${minimumVersion} or later, but found version ${version}. Upgrade your ${packageDisplayName} version to use the wizard, or follow the manual setup guide.`, { docsUrl });
|
|
61
|
+
(0, debug_1.logToFile)('[runAgentWizard] cancel displayed to user');
|
|
62
|
+
return;
|
|
92
63
|
}
|
|
93
64
|
}
|
|
94
65
|
// Setup phase — informational only, no prompts
|
|
@@ -112,12 +83,14 @@ async function runAgentWizard(config, session) {
|
|
|
112
83
|
if (usesPackageJson) {
|
|
113
84
|
packageJson = await (0, setup_utils_1.tryGetPackageJson)({ installDir: session.installDir });
|
|
114
85
|
if (packageJson) {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
86
|
+
frameworkVersion = config.detection.getVersion(packageJson);
|
|
87
|
+
// Log warning if package not found, but continue (agent handles it).
|
|
88
|
+
// Uses getVersion() rather than checking packageName directly so
|
|
89
|
+
// frameworks that match multiple packages (e.g. React Router +
|
|
90
|
+
// TanStack) don't trigger false "not installed" warnings.
|
|
91
|
+
if (!frameworkVersion) {
|
|
118
92
|
(0, ui_1.getUI)().log.warn(`${config.detection.packageDisplayName} does not seem to be installed. Continuing anyway — the agent will handle it.`);
|
|
119
93
|
}
|
|
120
|
-
frameworkVersion = config.detection.getVersion(packageJson);
|
|
121
94
|
}
|
|
122
95
|
else {
|
|
123
96
|
(0, ui_1.getUI)().log.warn('Could not find package.json. Continuing anyway — the agent will handle it.');
|
|
@@ -310,6 +283,11 @@ async function runAgentWizard(config, session) {
|
|
|
310
283
|
});
|
|
311
284
|
}
|
|
312
285
|
// MCP installation is handled by McpScreen — no prompt here
|
|
286
|
+
// Data ingestion check — agent mode only (not CI).
|
|
287
|
+
// Poll via MCP until events arrive, then emit a structured result event.
|
|
288
|
+
if (session.agent) {
|
|
289
|
+
await pollForDataIngestion(session, accessToken, cloudRegion);
|
|
290
|
+
}
|
|
313
291
|
// Build outro data and store it for OutroScreen
|
|
314
292
|
const continueUrl = session.signup
|
|
315
293
|
? constants_js_1.OUTBOUND_URLS.products(cloudRegion)
|
|
@@ -332,6 +310,89 @@ async function runAgentWizard(config, session) {
|
|
|
332
310
|
(0, ui_1.getUI)().outro(`Successfully installed Amplitude!`);
|
|
333
311
|
await analytics_1.analytics.shutdown('success');
|
|
334
312
|
}
|
|
313
|
+
/**
|
|
314
|
+
* Poll the Amplitude MCP server for event ingestion in agent mode.
|
|
315
|
+
*
|
|
316
|
+
* Emits structured NDJSON events via the AgentUI:
|
|
317
|
+
* - `status` events every poll cycle while waiting
|
|
318
|
+
* - `result` event when events are detected (includes event names)
|
|
319
|
+
* - `log` warning if the timeout is reached without detecting events
|
|
320
|
+
*
|
|
321
|
+
* Skipped silently if no project ID can be resolved (e.g. --api-key flow).
|
|
322
|
+
*
|
|
323
|
+
* @param session - wizard session (must have session.agent === true)
|
|
324
|
+
* @param accessToken - OAuth access token for MCP Bearer auth
|
|
325
|
+
* @param cloudRegion - us | eu, used to resolve project ID lazily if needed
|
|
326
|
+
*/
|
|
327
|
+
async function pollForDataIngestion(session, accessToken, cloudRegion) {
|
|
328
|
+
const { fetchHasAnyEventsMcp, fetchAmplitudeUser } = await import('../lib/api.js');
|
|
329
|
+
const { logToFile } = await import('../utils/debug.js');
|
|
330
|
+
const POLL_INTERVAL_MS = 30_000;
|
|
331
|
+
// Allow override for testing; default 30 minutes.
|
|
332
|
+
const MAX_WAIT_MS = Number(process.env.DATA_INGESTION_TIMEOUT_MS) || 30 * 60 * 1000;
|
|
333
|
+
// Resolve the numeric analytics project ID.
|
|
334
|
+
// It is set by resolveEnvironmentSelection for the environment-picker path,
|
|
335
|
+
// and by the fire-and-forget in bin.ts for the TUI path.
|
|
336
|
+
// If still missing, try a single fetchAmplitudeUser call.
|
|
337
|
+
let projectId = session.selectedProjectId ?? null;
|
|
338
|
+
if (!projectId) {
|
|
339
|
+
try {
|
|
340
|
+
const userInfo = await fetchAmplitudeUser(accessToken, cloudRegion);
|
|
341
|
+
const org = session.selectedOrgId
|
|
342
|
+
? userInfo.orgs.find((o) => o.id === session.selectedOrgId)
|
|
343
|
+
: userInfo.orgs[0];
|
|
344
|
+
const ws = org && session.selectedWorkspaceId
|
|
345
|
+
? org.workspaces.find((w) => w.id === session.selectedWorkspaceId)
|
|
346
|
+
: org?.workspaces[0];
|
|
347
|
+
projectId =
|
|
348
|
+
ws?.environments
|
|
349
|
+
?.slice()
|
|
350
|
+
.sort((a, b) => a.rank - b.rank)
|
|
351
|
+
.find((e) => e.app?.id)?.app?.id ?? null;
|
|
352
|
+
if (projectId)
|
|
353
|
+
session.selectedProjectId = projectId;
|
|
354
|
+
}
|
|
355
|
+
catch (err) {
|
|
356
|
+
logToFile(`[pollForDataIngestion] could not resolve projectId: ${err instanceof Error ? err.message : String(err)}`);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
if (!projectId) {
|
|
360
|
+
logToFile('[pollForDataIngestion] no projectId — skipping ingestion check');
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
const ui = (0, ui_1.getUI)();
|
|
364
|
+
ui.pushStatus('Waiting for events — run your app and trigger some actions');
|
|
365
|
+
const deadline = Date.now() + MAX_WAIT_MS;
|
|
366
|
+
let pollCount = 0;
|
|
367
|
+
while (Date.now() < deadline) {
|
|
368
|
+
pollCount++;
|
|
369
|
+
logToFile(`[pollForDataIngestion] poll #${pollCount} projectId=${projectId}`);
|
|
370
|
+
try {
|
|
371
|
+
const result = await fetchHasAnyEventsMcp(accessToken, projectId);
|
|
372
|
+
if (result.hasEvents) {
|
|
373
|
+
logToFile(`[pollForDataIngestion] events detected: ${result.activeEventNames.join(', ')}`);
|
|
374
|
+
// Emit a structured result event so callers can act on it.
|
|
375
|
+
ui.setEventIngestionDetected(result.activeEventNames);
|
|
376
|
+
ui.log.success(`Events detected: ${result.activeEventNames.length > 0
|
|
377
|
+
? result.activeEventNames.join(', ')
|
|
378
|
+
: '(events flowing)'}`);
|
|
379
|
+
session.dataIngestionConfirmed = true;
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
catch (err) {
|
|
384
|
+
logToFile(`[pollForDataIngestion] poll error: ${err instanceof Error ? err.message : String(err)}`);
|
|
385
|
+
}
|
|
386
|
+
// Wait before the next poll, but bail early if deadline passed.
|
|
387
|
+
const remaining = deadline - Date.now();
|
|
388
|
+
if (remaining <= 0)
|
|
389
|
+
break;
|
|
390
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(POLL_INTERVAL_MS, remaining)));
|
|
391
|
+
}
|
|
392
|
+
logToFile('[pollForDataIngestion] timeout reached without detecting events');
|
|
393
|
+
ui.log.warn('No events detected within the timeout window. ' +
|
|
394
|
+
'Run your app to send events, then check your Amplitude dashboard.');
|
|
395
|
+
}
|
|
335
396
|
/**
|
|
336
397
|
* Build the integration prompt for the agent.
|
|
337
398
|
*/
|
package/dist/src/lib/api.d.ts
CHANGED
|
@@ -16,6 +16,14 @@ export type AmplitudeOrg = {
|
|
|
16
16
|
}> | null;
|
|
17
17
|
}>;
|
|
18
18
|
};
|
|
19
|
+
/** Shared workspace type for environment helpers. */
|
|
20
|
+
export type AmplitudeWorkspace = AmplitudeOrg['workspaces'][number];
|
|
21
|
+
/**
|
|
22
|
+
* Extract the primary analytics project ID from a workspace.
|
|
23
|
+
* Picks the lowest-rank environment that has an app ID.
|
|
24
|
+
* Returns null if no such environment exists.
|
|
25
|
+
*/
|
|
26
|
+
export declare function extractProjectId(ws: AmplitudeWorkspace): string | null;
|
|
19
27
|
export type AmplitudeUserInfo = {
|
|
20
28
|
id: string;
|
|
21
29
|
firstName: string;
|
|
@@ -72,6 +80,33 @@ export type AmplitudeSource = {
|
|
|
72
80
|
};
|
|
73
81
|
/** Fetches sources for a specific branch version. */
|
|
74
82
|
export declare function fetchSources(idToken: string, zone: AmplitudeZone, orgId: string, workspaceId: string, branchId: string, versionId: string): Promise<AmplitudeSource[]>;
|
|
83
|
+
export interface McpUser {
|
|
84
|
+
/** Amplitude's internal ID (always present) */
|
|
85
|
+
amplitudeId: string;
|
|
86
|
+
/** App-assigned user ID if setUserId() was called, otherwise null */
|
|
87
|
+
userId: string | null;
|
|
88
|
+
}
|
|
89
|
+
export interface McpEventsResult {
|
|
90
|
+
hasEvents: boolean;
|
|
91
|
+
/** Kept for API compatibility — always empty (query_dataset was removed from MCP server) */
|
|
92
|
+
csvRows: unknown[][];
|
|
93
|
+
/** Active event names from get_events (isActive=true), up to 10 */
|
|
94
|
+
activeEventNames: string[];
|
|
95
|
+
/** Recent users who fired events, up to 5 */
|
|
96
|
+
activeUsers: McpUser[];
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Checks whether the project has received any events via the Amplitude MCP server.
|
|
100
|
+
* Uses get_users with `_all` as the primary signal (userCount > 0 → events exist),
|
|
101
|
+
* then fetches get_events for display names.
|
|
102
|
+
*
|
|
103
|
+
* Falls back to a Claude agent with the Amplitude MCP configured if the direct
|
|
104
|
+
* HTTP call fails, so the check survives MCP API drift.
|
|
105
|
+
*
|
|
106
|
+
* Requires the numeric analytics project ID (from workspace.environments[].app.id),
|
|
107
|
+
* not the workspace UUID. Returns false on any error so callers can fall through.
|
|
108
|
+
*/
|
|
109
|
+
export declare function fetchHasAnyEventsMcp(accessToken: string, projectId: string): Promise<McpEventsResult>;
|
|
75
110
|
export type ProjectActivationStatus = {
|
|
76
111
|
/** SDK/snippet has been installed (default event tracking source detected) */
|
|
77
112
|
hasDetSource: boolean;
|