@posthog/wizard 1.36.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +79 -0
- package/dist/bin.js +199 -12
- package/dist/bin.js.map +1 -1
- package/dist/src/__tests__/cli.test.js +7 -18
- package/dist/src/__tests__/cli.test.js.map +1 -1
- package/dist/src/__tests__/run.test.js +50 -5
- package/dist/src/__tests__/run.test.js.map +1 -1
- package/dist/src/__tests__/wizard-abort.test.js +127 -0
- package/dist/src/__tests__/wizard-abort.test.js.map +1 -0
- package/dist/src/{android → frameworks/android}/android-wizard-agent.d.ts +1 -1
- package/dist/src/{android → frameworks/android}/android-wizard-agent.js +2 -2
- package/dist/src/frameworks/android/android-wizard-agent.js.map +1 -0
- package/dist/src/{android → frameworks/android}/utils.d.ts +1 -1
- package/dist/src/{android → frameworks/android}/utils.js +1 -1
- package/dist/src/frameworks/android/utils.js.map +1 -0
- package/dist/src/{angular → frameworks/angular}/angular-wizard-agent.d.ts +1 -1
- package/dist/src/{angular → frameworks/angular}/angular-wizard-agent.js +9 -7
- package/dist/src/frameworks/angular/angular-wizard-agent.js.map +1 -0
- package/dist/src/{angular → frameworks/angular}/utils.js +1 -1
- package/dist/src/frameworks/angular/utils.js.map +1 -0
- package/dist/src/{astro → frameworks/astro}/astro-wizard-agent.d.ts +1 -1
- package/dist/src/{astro → frameworks/astro}/astro-wizard-agent.js +9 -7
- package/dist/src/frameworks/astro/astro-wizard-agent.js.map +1 -0
- package/dist/src/{astro → frameworks/astro}/utils.d.ts +2 -5
- package/dist/src/{astro → frameworks/astro}/utils.js +3 -52
- package/dist/src/frameworks/astro/utils.js.map +1 -0
- package/dist/src/{django → frameworks/django}/django-wizard-agent.d.ts +1 -1
- package/dist/src/{django → frameworks/django}/django-wizard-agent.js +3 -3
- package/dist/src/frameworks/django/django-wizard-agent.js.map +1 -0
- package/dist/src/{django → frameworks/django}/utils.d.ts +1 -1
- package/dist/src/{django → frameworks/django}/utils.js +6 -6
- package/dist/src/frameworks/django/utils.js.map +1 -0
- package/dist/src/frameworks/fastapi/fastapi-wizard-agent.d.ts +5 -0
- package/dist/src/{fastapi → frameworks/fastapi}/fastapi-wizard-agent.js +3 -32
- package/dist/src/frameworks/fastapi/fastapi-wizard-agent.js.map +1 -0
- package/dist/src/{fastapi → frameworks/fastapi}/utils.d.ts +1 -1
- package/dist/src/{fastapi → frameworks/fastapi}/utils.js +4 -4
- package/dist/src/frameworks/fastapi/utils.js.map +1 -0
- package/dist/src/{flask → frameworks/flask}/flask-wizard-agent.d.ts +1 -1
- package/dist/src/{flask → frameworks/flask}/flask-wizard-agent.js +3 -3
- package/dist/src/frameworks/flask/flask-wizard-agent.js.map +1 -0
- package/dist/src/{flask → frameworks/flask}/utils.d.ts +1 -1
- package/dist/src/{flask → frameworks/flask}/utils.js +7 -7
- package/dist/src/frameworks/flask/utils.js.map +1 -0
- package/dist/src/{javascript-node → frameworks/javascript-node}/javascript-node-wizard-agent.d.ts +1 -1
- package/dist/src/{javascript-node → frameworks/javascript-node}/javascript-node-wizard-agent.js +4 -4
- package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.js.map +1 -0
- package/dist/src/{javascript-web → frameworks/javascript-web}/javascript-web-wizard-agent.d.ts +1 -1
- package/dist/src/{javascript-web → frameworks/javascript-web}/javascript-web-wizard-agent.js +16 -14
- package/dist/src/frameworks/javascript-web/javascript-web-wizard-agent.js.map +1 -0
- package/dist/src/{javascript-web → frameworks/javascript-web}/utils.d.ts +6 -1
- package/dist/src/{javascript-web → frameworks/javascript-web}/utils.js +49 -1
- package/dist/src/frameworks/javascript-web/utils.js.map +1 -0
- package/dist/src/{laravel → frameworks/laravel}/laravel-wizard-agent.d.ts +1 -1
- package/dist/src/{laravel → frameworks/laravel}/laravel-wizard-agent.js +2 -2
- package/dist/src/frameworks/laravel/laravel-wizard-agent.js.map +1 -0
- package/dist/src/{laravel → frameworks/laravel}/utils.d.ts +1 -1
- package/dist/src/{laravel → frameworks/laravel}/utils.js +5 -5
- package/dist/src/frameworks/laravel/utils.js.map +1 -0
- package/dist/src/{nextjs → frameworks/nextjs}/nextjs-wizard-agent.d.ts +1 -1
- package/dist/src/{nextjs → frameworks/nextjs}/nextjs-wizard-agent.js +30 -8
- package/dist/src/frameworks/nextjs/nextjs-wizard-agent.js.map +1 -0
- package/dist/src/{nextjs → frameworks/nextjs}/utils.d.ts +5 -2
- package/dist/src/{nextjs → frameworks/nextjs}/utils.js +6 -20
- package/dist/src/frameworks/nextjs/utils.js.map +1 -0
- package/dist/src/{nuxt → frameworks/nuxt}/nuxt-wizard-agent.d.ts +1 -1
- package/dist/src/{nuxt → frameworks/nuxt}/nuxt-wizard-agent.js +11 -9
- package/dist/src/frameworks/nuxt/nuxt-wizard-agent.js.map +1 -0
- package/dist/src/{python → frameworks/python}/python-wizard-agent.d.ts +1 -1
- package/dist/src/{python → frameworks/python}/python-wizard-agent.js +3 -3
- package/dist/src/frameworks/python/python-wizard-agent.js.map +1 -0
- package/dist/src/{python → frameworks/python}/utils.d.ts +1 -1
- package/dist/src/frameworks/python/utils.js.map +1 -0
- package/dist/src/{rails → frameworks/rails}/rails-wizard-agent.d.ts +1 -1
- package/dist/src/{rails → frameworks/rails}/rails-wizard-agent.js +2 -2
- package/dist/src/frameworks/rails/rails-wizard-agent.js.map +1 -0
- package/dist/src/{rails → frameworks/rails}/utils.d.ts +1 -1
- package/dist/src/{rails → frameworks/rails}/utils.js +4 -4
- package/dist/src/frameworks/rails/utils.js.map +1 -0
- package/dist/src/{react-native → frameworks/react-native}/react-native-wizard-agent.d.ts +1 -1
- package/dist/src/{react-native → frameworks/react-native}/react-native-wizard-agent.js +9 -7
- package/dist/src/frameworks/react-native/react-native-wizard-agent.js.map +1 -0
- package/dist/src/{react-native → frameworks/react-native}/utils.d.ts +1 -1
- package/dist/src/{react-native → frameworks/react-native}/utils.js +7 -10
- package/dist/src/frameworks/react-native/utils.js.map +1 -0
- package/dist/src/{react-router → frameworks/react-router}/react-router-wizard-agent.d.ts +1 -1
- package/dist/src/{react-router → frameworks/react-router}/react-router-wizard-agent.js +15 -8
- package/dist/src/frameworks/react-router/react-router-wizard-agent.js.map +1 -0
- package/dist/src/frameworks/react-router/utils.d.ts +13 -0
- package/dist/src/{react-router → frameworks/react-router}/utils.js +14 -111
- package/dist/src/frameworks/react-router/utils.js.map +1 -0
- package/dist/src/{ruby → frameworks/ruby}/ruby-wizard-agent.d.ts +1 -1
- package/dist/src/{ruby → frameworks/ruby}/ruby-wizard-agent.js +2 -2
- package/dist/src/frameworks/ruby/ruby-wizard-agent.js.map +1 -0
- package/dist/src/{ruby → frameworks/ruby}/utils.d.ts +1 -1
- package/dist/src/{ruby → frameworks/ruby}/utils.js +1 -1
- package/dist/src/frameworks/ruby/utils.js.map +1 -0
- package/dist/src/{svelte → frameworks/svelte}/svelte-wizard-agent.d.ts +1 -1
- package/dist/src/{svelte → frameworks/svelte}/svelte-wizard-agent.js +5 -5
- package/dist/src/frameworks/svelte/svelte-wizard-agent.js.map +1 -0
- package/dist/src/{swift → frameworks/swift}/swift-wizard-agent.d.ts +1 -1
- package/dist/src/{swift → frameworks/swift}/swift-wizard-agent.js +2 -2
- package/dist/src/frameworks/swift/swift-wizard-agent.js.map +1 -0
- package/dist/src/{swift → frameworks/swift}/utils.d.ts +1 -1
- package/dist/src/frameworks/swift/utils.js.map +1 -0
- package/dist/src/{tanstack-router → frameworks/tanstack-router}/tanstack-router-wizard-agent.d.ts +1 -1
- package/dist/src/{tanstack-router → frameworks/tanstack-router}/tanstack-router-wizard-agent.js +15 -8
- package/dist/src/frameworks/tanstack-router/tanstack-router-wizard-agent.js.map +1 -0
- package/dist/src/frameworks/tanstack-router/utils.d.ts +11 -0
- package/dist/src/{tanstack-router → frameworks/tanstack-router}/utils.js +4 -47
- package/dist/src/frameworks/tanstack-router/utils.js.map +1 -0
- package/dist/src/{tanstack-start → frameworks/tanstack-start}/tanstack-start-wizard-agent.d.ts +1 -1
- package/dist/src/{tanstack-start → frameworks/tanstack-start}/tanstack-start-wizard-agent.js +9 -7
- package/dist/src/frameworks/tanstack-start/tanstack-start-wizard-agent.js.map +1 -0
- package/dist/src/{tanstack-start → frameworks/tanstack-start}/utils.js +1 -1
- package/dist/src/frameworks/tanstack-start/utils.js.map +1 -0
- package/dist/src/{vue → frameworks/vue}/vue-wizard-agent.d.ts +1 -1
- package/dist/src/{vue → frameworks/vue}/vue-wizard-agent.js +8 -8
- package/dist/src/frameworks/vue/vue-wizard-agent.js.map +1 -0
- package/dist/src/lib/__tests__/agent-interface.test.js +91 -19
- package/dist/src/lib/__tests__/agent-interface.test.js.map +1 -1
- package/dist/src/lib/agent-interface.d.ts +49 -2
- package/dist/src/lib/agent-interface.js +254 -40
- package/dist/src/lib/agent-interface.js.map +1 -1
- package/dist/src/lib/agent-runner.d.ts +4 -2
- package/dist/src/lib/agent-runner.js +132 -126
- package/dist/src/lib/agent-runner.js.map +1 -1
- package/dist/src/lib/api.d.ts +4 -4
- package/dist/src/lib/commandments.js +1 -0
- package/dist/src/lib/commandments.js.map +1 -1
- package/dist/src/lib/constants.d.ts +22 -9
- package/dist/src/lib/constants.js +35 -11
- package/dist/src/lib/constants.js.map +1 -1
- package/dist/src/lib/framework-config.d.ts +26 -0
- package/dist/src/lib/framework-config.js.map +1 -1
- package/dist/src/lib/health-checks/__tests__/health-checks.test.d.ts +18 -0
- package/dist/src/lib/health-checks/__tests__/health-checks.test.js +752 -0
- package/dist/src/lib/health-checks/__tests__/health-checks.test.js.map +1 -0
- package/dist/src/lib/health-checks/endpoints.d.ts +3 -0
- package/dist/src/lib/health-checks/endpoints.js +46 -0
- package/dist/src/lib/health-checks/endpoints.js.map +1 -0
- package/dist/src/lib/health-checks/index.d.ts +4 -0
- package/dist/src/lib/health-checks/index.js +23 -0
- package/dist/src/lib/health-checks/index.js.map +1 -0
- package/dist/src/lib/health-checks/readiness.d.ts +24 -0
- package/dist/src/lib/health-checks/readiness.js +119 -0
- package/dist/src/lib/health-checks/readiness.js.map +1 -0
- package/dist/src/lib/health-checks/statuspage.d.ts +9 -0
- package/dist/src/lib/health-checks/statuspage.js +105 -0
- package/dist/src/lib/health-checks/statuspage.js.map +1 -0
- package/dist/src/lib/health-checks/types.d.ts +31 -0
- package/dist/src/lib/health-checks/types.js +10 -0
- package/dist/src/lib/health-checks/types.js.map +1 -0
- package/dist/src/lib/middleware/benchmark.d.ts +2 -2
- package/dist/src/lib/middleware/benchmark.js +3 -3
- package/dist/src/lib/middleware/benchmark.js.map +1 -1
- package/dist/src/lib/middleware/benchmarks/json-writer.js +2 -2
- package/dist/src/lib/middleware/benchmarks/json-writer.js.map +1 -1
- package/dist/src/lib/middleware/benchmarks/summary.d.ts +2 -2
- package/dist/src/lib/middleware/benchmarks/summary.js +9 -9
- package/dist/src/lib/middleware/benchmarks/summary.js.map +1 -1
- package/dist/src/lib/middleware/types.d.ts +2 -2
- package/dist/src/lib/middleware/types.js.map +1 -1
- package/dist/src/lib/package-manager-detection.js +1 -1
- package/dist/src/lib/package-manager-detection.js.map +1 -1
- package/dist/src/lib/registry.js +21 -21
- package/dist/src/lib/registry.js.map +1 -1
- package/dist/src/lib/version.d.ts +1 -1
- package/dist/src/lib/version.js +1 -1
- package/dist/src/lib/version.js.map +1 -1
- package/dist/src/lib/wizard-session.d.ts +115 -0
- package/dist/src/lib/wizard-session.js +104 -0
- package/dist/src/lib/wizard-session.js.map +1 -0
- package/dist/src/lib/wizard-tools.js +13 -0
- package/dist/src/lib/wizard-tools.js.map +1 -1
- package/dist/src/run.d.ts +3 -1
- package/dist/src/run.js +73 -55
- package/dist/src/run.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/codex.test.js +18 -22
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/codex.test.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.d.ts +6 -6
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +6 -6
- package/dist/src/steps/add-mcp-server-to-clients/clients/codex.d.ts +7 -7
- package/dist/src/steps/add-mcp-server-to-clients/clients/codex.js +8 -9
- package/dist/src/steps/add-mcp-server-to-clients/clients/codex.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.d.ts +6 -6
- package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.d.ts +6 -6
- package/dist/src/steps/add-mcp-server-to-clients/clients/zed.d.ts +6 -6
- package/dist/src/steps/add-mcp-server-to-clients/defaults.d.ts +6 -6
- package/dist/src/steps/add-mcp-server-to-clients/index.d.ts +5 -2
- package/dist/src/steps/add-mcp-server-to-clients/index.js +24 -107
- package/dist/src/steps/add-mcp-server-to-clients/index.js.map +1 -1
- package/dist/src/steps/add-or-update-environment-variables.js +15 -20
- package/dist/src/steps/add-or-update-environment-variables.js.map +1 -1
- package/dist/src/steps/index.d.ts +0 -1
- package/dist/src/steps/index.js +0 -1
- package/dist/src/steps/index.js.map +1 -1
- package/dist/src/steps/run-prettier.js +9 -11
- package/dist/src/steps/run-prettier.js.map +1 -1
- package/dist/src/steps/upload-environment-variables/EnvironmentProvider.d.ts +6 -3
- package/dist/src/steps/upload-environment-variables/EnvironmentProvider.js.map +1 -1
- package/dist/src/steps/upload-environment-variables/index.d.ts +3 -3
- package/dist/src/steps/upload-environment-variables/index.js +7 -35
- package/dist/src/steps/upload-environment-variables/index.js.map +1 -1
- package/dist/src/steps/upload-environment-variables/providers/vercel.d.ts +3 -2
- package/dist/src/steps/upload-environment-variables/providers/vercel.js +2 -2
- package/dist/src/steps/upload-environment-variables/providers/vercel.js.map +1 -1
- package/dist/src/ui/index.d.ts +8 -0
- package/dist/src/ui/index.js +17 -0
- package/dist/src/ui/index.js.map +1 -0
- package/dist/src/ui/logging-ui.d.ts +44 -0
- package/dist/src/ui/logging-ui.js +103 -0
- package/dist/src/ui/logging-ui.js.map +1 -0
- package/dist/src/ui/tui/App.d.ts +6 -0
- package/dist/src/ui/tui/App.js +10 -0
- package/dist/src/ui/tui/App.js.map +1 -0
- package/dist/src/ui/tui/__tests__/layout-helpers.test.js +68 -0
- package/dist/src/ui/tui/__tests__/layout-helpers.test.js.map +1 -0
- package/dist/src/ui/tui/__tests__/store.test.d.ts +1 -0
- package/dist/src/ui/tui/__tests__/store.test.js +723 -0
- package/dist/src/ui/tui/__tests__/store.test.js.map +1 -0
- package/dist/src/ui/tui/components/LearnCard.d.ts +10 -0
- package/dist/src/ui/tui/components/LearnCard.js +217 -0
- package/dist/src/ui/tui/components/LearnCard.js.map +1 -0
- package/dist/src/ui/tui/components/TipsCard.d.ts +9 -0
- package/dist/src/ui/tui/components/TipsCard.js +55 -0
- package/dist/src/ui/tui/components/TipsCard.js.map +1 -0
- package/dist/src/ui/tui/components/TitleBar.d.ts +6 -0
- package/dist/src/ui/tui/components/TitleBar.js +17 -0
- package/dist/src/ui/tui/components/TitleBar.js.map +1 -0
- package/dist/src/ui/tui/flows.d.ts +38 -0
- package/dist/src/ui/tui/flows.js +82 -0
- package/dist/src/ui/tui/flows.js.map +1 -0
- package/dist/src/ui/tui/hooks/useStdoutDimensions.d.ts +9 -0
- package/dist/src/ui/tui/hooks/useStdoutDimensions.js +37 -0
- package/dist/src/ui/tui/hooks/useStdoutDimensions.js.map +1 -0
- package/dist/src/ui/tui/ink-ui.d.ts +50 -0
- package/dist/src/ui/tui/ink-ui.js +108 -0
- package/dist/src/ui/tui/ink-ui.js.map +1 -0
- package/dist/src/ui/tui/package.json +1 -0
- package/dist/src/ui/tui/playground/PlaygroundApp.d.ts +12 -0
- package/dist/src/ui/tui/playground/PlaygroundApp.js +32 -0
- package/dist/src/ui/tui/playground/PlaygroundApp.js.map +1 -0
- package/dist/src/ui/tui/playground/demos/InputDemo.d.ts +4 -0
- package/dist/src/ui/tui/playground/demos/InputDemo.js +53 -0
- package/dist/src/ui/tui/playground/demos/InputDemo.js.map +1 -0
- package/dist/src/ui/tui/playground/demos/LayoutDemo.d.ts +5 -0
- package/dist/src/ui/tui/playground/demos/LayoutDemo.js +25 -0
- package/dist/src/ui/tui/playground/demos/LayoutDemo.js.map +1 -0
- package/dist/src/ui/tui/playground/demos/LogDemo.d.ts +5 -0
- package/dist/src/ui/tui/playground/demos/LogDemo.js +53 -0
- package/dist/src/ui/tui/playground/demos/LogDemo.js.map +1 -0
- package/dist/src/ui/tui/playground/demos/ProgressDemo.d.ts +5 -0
- package/dist/src/ui/tui/playground/demos/ProgressDemo.js +58 -0
- package/dist/src/ui/tui/playground/demos/ProgressDemo.js.map +1 -0
- package/dist/src/ui/tui/playground/demos/RunScreenDemo.d.ts +11 -0
- package/dist/src/ui/tui/playground/demos/RunScreenDemo.js +159 -0
- package/dist/src/ui/tui/playground/demos/RunScreenDemo.js.map +1 -0
- package/dist/src/ui/tui/playground/demos/WelcomeDemo.d.ts +9 -0
- package/dist/src/ui/tui/playground/demos/WelcomeDemo.js +15 -0
- package/dist/src/ui/tui/playground/demos/WelcomeDemo.js.map +1 -0
- package/dist/src/ui/tui/playground/start-playground.d.ts +4 -0
- package/dist/src/ui/tui/playground/start-playground.js +24 -0
- package/dist/src/ui/tui/playground/start-playground.js.map +1 -0
- package/dist/src/ui/tui/primitives/CardLayout.d.ts +12 -0
- package/dist/src/ui/tui/primitives/CardLayout.js +10 -0
- package/dist/src/ui/tui/primitives/CardLayout.js.map +1 -0
- package/dist/src/ui/tui/primitives/ConfirmationInput.d.ts +13 -0
- package/dist/src/ui/tui/primitives/ConfirmationInput.js +35 -0
- package/dist/src/ui/tui/primitives/ConfirmationInput.js.map +1 -0
- package/dist/src/ui/tui/primitives/ContentSequencer.d.ts +42 -0
- package/dist/src/ui/tui/primitives/ContentSequencer.js +137 -0
- package/dist/src/ui/tui/primitives/ContentSequencer.js.map +1 -0
- package/dist/src/ui/tui/primitives/DissolveTransition.d.ts +21 -0
- package/dist/src/ui/tui/primitives/DissolveTransition.js +149 -0
- package/dist/src/ui/tui/primitives/DissolveTransition.js.map +1 -0
- package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +9 -0
- package/dist/src/ui/tui/primitives/EventPlanViewer.js +9 -0
- package/dist/src/ui/tui/primitives/EventPlanViewer.js.map +1 -0
- package/dist/src/ui/tui/primitives/HNViewer.d.ts +7 -0
- package/dist/src/ui/tui/primitives/HNViewer.js +63 -0
- package/dist/src/ui/tui/primitives/HNViewer.js.map +1 -0
- package/dist/src/ui/tui/primitives/LinesBlock.d.ts +16 -0
- package/dist/src/ui/tui/primitives/LinesBlock.js +37 -0
- package/dist/src/ui/tui/primitives/LinesBlock.js.map +1 -0
- package/dist/src/ui/tui/primitives/LoadingBox.d.ts +8 -0
- package/dist/src/ui/tui/primitives/LoadingBox.js +10 -0
- package/dist/src/ui/tui/primitives/LoadingBox.js.map +1 -0
- package/dist/src/ui/tui/primitives/LogViewer.d.ts +11 -0
- package/dist/src/ui/tui/primitives/LogViewer.js +55 -0
- package/dist/src/ui/tui/primitives/LogViewer.js.map +1 -0
- package/dist/src/ui/tui/primitives/NodeBlock.d.ts +13 -0
- package/dist/src/ui/tui/primitives/NodeBlock.js +17 -0
- package/dist/src/ui/tui/primitives/NodeBlock.js.map +1 -0
- package/dist/src/ui/tui/primitives/PickerMenu.d.ts +20 -0
- package/dist/src/ui/tui/primitives/PickerMenu.js +134 -0
- package/dist/src/ui/tui/primitives/PickerMenu.js.map +1 -0
- package/dist/src/ui/tui/primitives/ProgressList.d.ts +15 -0
- package/dist/src/ui/tui/primitives/ProgressList.js +30 -0
- package/dist/src/ui/tui/primitives/ProgressList.js.map +1 -0
- package/dist/src/ui/tui/primitives/PromptLabel.d.ts +11 -0
- package/dist/src/ui/tui/primitives/PromptLabel.js +13 -0
- package/dist/src/ui/tui/primitives/PromptLabel.js.map +1 -0
- package/dist/src/ui/tui/primitives/ScreenContainer.d.ts +16 -0
- package/dist/src/ui/tui/primitives/ScreenContainer.js +36 -0
- package/dist/src/ui/tui/primitives/ScreenContainer.js.map +1 -0
- package/dist/src/ui/tui/primitives/ScreenErrorBoundary.d.ts +22 -0
- package/dist/src/ui/tui/primitives/ScreenErrorBoundary.js +35 -0
- package/dist/src/ui/tui/primitives/ScreenErrorBoundary.js.map +1 -0
- package/dist/src/ui/tui/primitives/SplitView.d.ts +11 -0
- package/dist/src/ui/tui/primitives/SplitView.js +9 -0
- package/dist/src/ui/tui/primitives/SplitView.js.map +1 -0
- package/dist/src/ui/tui/primitives/TabContainer.d.ts +23 -0
- package/dist/src/ui/tui/primitives/TabContainer.js +45 -0
- package/dist/src/ui/tui/primitives/TabContainer.js.map +1 -0
- package/dist/src/ui/tui/primitives/TextBlock.d.ts +41 -0
- package/dist/src/ui/tui/primitives/TextBlock.js +144 -0
- package/dist/src/ui/tui/primitives/TextBlock.js.map +1 -0
- package/dist/src/ui/tui/primitives/content-types.d.ts +37 -0
- package/dist/src/ui/tui/primitives/content-types.js +19 -0
- package/dist/src/ui/tui/primitives/content-types.js.map +1 -0
- package/dist/src/ui/tui/primitives/index.d.ts +24 -0
- package/dist/src/ui/tui/primitives/index.js +21 -0
- package/dist/src/ui/tui/primitives/index.js.map +1 -0
- package/dist/src/ui/tui/primitives/layout-helpers.d.ts +36 -0
- package/dist/src/ui/tui/primitives/layout-helpers.js +95 -0
- package/dist/src/ui/tui/primitives/layout-helpers.js.map +1 -0
- package/dist/src/ui/tui/primitives/text-helpers.d.ts +10 -0
- package/dist/src/ui/tui/primitives/text-helpers.js +43 -0
- package/dist/src/ui/tui/primitives/text-helpers.js.map +1 -0
- package/dist/src/ui/tui/router.d.ts +56 -0
- package/dist/src/ui/tui/router.js +94 -0
- package/dist/src/ui/tui/router.js.map +1 -0
- package/dist/src/ui/tui/screen-registry.d.ts +19 -0
- package/dist/src/ui/tui/screen-registry.js +34 -0
- package/dist/src/ui/tui/screen-registry.js.map +1 -0
- package/dist/src/ui/tui/screens/AuthScreen.d.ts +13 -0
- package/dist/src/ui/tui/screens/AuthScreen.js +20 -0
- package/dist/src/ui/tui/screens/AuthScreen.js.map +1 -0
- package/dist/src/ui/tui/screens/IntroScreen.d.ts +16 -0
- package/dist/src/ui/tui/screens/IntroScreen.js +63 -0
- package/dist/src/ui/tui/screens/IntroScreen.js.map +1 -0
- package/dist/src/ui/tui/screens/McpScreen.d.ts +24 -0
- package/dist/src/ui/tui/screens/McpScreen.js +112 -0
- package/dist/src/ui/tui/screens/McpScreen.js.map +1 -0
- package/dist/src/ui/tui/screens/OutageScreen.d.ts +10 -0
- package/dist/src/ui/tui/screens/OutageScreen.js +17 -0
- package/dist/src/ui/tui/screens/OutageScreen.js.map +1 -0
- package/dist/src/ui/tui/screens/OutroScreen.d.ts +11 -0
- package/dist/src/ui/tui/screens/OutroScreen.js +22 -0
- package/dist/src/ui/tui/screens/OutroScreen.js.map +1 -0
- package/dist/src/ui/tui/screens/RunScreen.d.ts +16 -0
- package/dist/src/ui/tui/screens/RunScreen.js +73 -0
- package/dist/src/ui/tui/screens/RunScreen.js.map +1 -0
- package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +10 -0
- package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +24 -0
- package/dist/src/ui/tui/screens/SettingsOverrideScreen.js.map +1 -0
- package/dist/src/ui/tui/screens/SetupScreen.d.ts +13 -0
- package/dist/src/ui/tui/screens/SetupScreen.js +74 -0
- package/dist/src/ui/tui/screens/SetupScreen.js.map +1 -0
- package/dist/src/ui/tui/services/mcp-installer.d.ts +21 -0
- package/dist/src/ui/tui/services/mcp-installer.js +58 -0
- package/dist/src/ui/tui/services/mcp-installer.js.map +1 -0
- package/dist/src/ui/tui/start-tui.d.ts +9 -0
- package/dist/src/ui/tui/start-tui.js +41 -0
- package/dist/src/ui/tui/start-tui.js.map +1 -0
- package/dist/src/ui/tui/store.d.ts +132 -0
- package/dist/src/ui/tui/store.js +320 -0
- package/dist/src/ui/tui/store.js.map +1 -0
- package/dist/src/ui/tui/styles.d.ts +31 -0
- package/dist/src/ui/tui/styles.js +34 -0
- package/dist/src/ui/tui/styles.js.map +1 -0
- package/dist/src/ui/wizard-ui.d.ts +64 -0
- package/dist/src/ui/wizard-ui.js +19 -0
- package/dist/src/ui/wizard-ui.js.map +1 -0
- package/dist/src/utils/__tests__/setup-utils.test.d.ts +1 -0
- package/dist/src/utils/__tests__/{clack-utils.test.js → setup-utils.test.js} +31 -22
- package/dist/src/utils/__tests__/setup-utils.test.js.map +1 -0
- package/dist/src/utils/analytics.d.ts +18 -0
- package/dist/src/utils/analytics.js +53 -0
- package/dist/src/utils/analytics.js.map +1 -1
- package/dist/src/utils/anthropic-status.d.ts +1 -12
- package/dist/src/utils/anthropic-status.js +4 -56
- package/dist/src/utils/anthropic-status.js.map +1 -1
- package/dist/src/utils/custom-headers.d.ts +9 -0
- package/dist/src/utils/custom-headers.js +24 -0
- package/dist/src/utils/custom-headers.js.map +1 -0
- package/dist/src/utils/debug.js +2 -2
- package/dist/src/utils/debug.js.map +1 -1
- package/dist/src/utils/environment.js +4 -2
- package/dist/src/utils/environment.js.map +1 -1
- package/dist/src/utils/oauth.js +9 -10
- package/dist/src/utils/oauth.js.map +1 -1
- package/dist/src/utils/package-manager.js +13 -13
- package/dist/src/utils/package-manager.js.map +1 -1
- package/dist/src/utils/setup-utils.d.ts +76 -0
- package/dist/src/utils/setup-utils.js +364 -0
- package/dist/src/utils/setup-utils.js.map +1 -0
- package/dist/src/utils/wizard-abort.d.ts +13 -0
- package/dist/src/utils/wizard-abort.js +57 -0
- package/dist/src/utils/wizard-abort.js.map +1 -0
- package/package.json +19 -7
- package/dist/src/android/android-wizard-agent.js.map +0 -1
- package/dist/src/android/utils.js.map +0 -1
- package/dist/src/angular/angular-wizard-agent.js.map +0 -1
- package/dist/src/angular/utils.js.map +0 -1
- package/dist/src/astro/astro-wizard-agent.js.map +0 -1
- package/dist/src/astro/utils.js.map +0 -1
- package/dist/src/django/django-wizard-agent.js.map +0 -1
- package/dist/src/django/utils.js.map +0 -1
- package/dist/src/fastapi/fastapi-wizard-agent.d.ts +0 -7
- package/dist/src/fastapi/fastapi-wizard-agent.js.map +0 -1
- package/dist/src/fastapi/utils.js.map +0 -1
- package/dist/src/flask/flask-wizard-agent.js.map +0 -1
- package/dist/src/flask/utils.js.map +0 -1
- package/dist/src/javascript-node/javascript-node-wizard-agent.js.map +0 -1
- package/dist/src/javascript-web/javascript-web-wizard-agent.js.map +0 -1
- package/dist/src/javascript-web/utils.js.map +0 -1
- package/dist/src/laravel/laravel-wizard-agent.js.map +0 -1
- package/dist/src/laravel/utils.js.map +0 -1
- package/dist/src/mcp.d.ts +0 -8
- package/dist/src/mcp.js +0 -44
- package/dist/src/mcp.js.map +0 -1
- package/dist/src/nextjs/nextjs-wizard-agent.js.map +0 -1
- package/dist/src/nextjs/utils.js.map +0 -1
- package/dist/src/nuxt/nuxt-wizard-agent.js.map +0 -1
- package/dist/src/python/python-wizard-agent.js.map +0 -1
- package/dist/src/python/utils.js.map +0 -1
- package/dist/src/rails/rails-wizard-agent.js.map +0 -1
- package/dist/src/rails/utils.js.map +0 -1
- package/dist/src/react-native/react-native-wizard-agent.js.map +0 -1
- package/dist/src/react-native/utils.js.map +0 -1
- package/dist/src/react-router/react-router-wizard-agent.js.map +0 -1
- package/dist/src/react-router/utils.d.ts +0 -19
- package/dist/src/react-router/utils.js.map +0 -1
- package/dist/src/ruby/ruby-wizard-agent.js.map +0 -1
- package/dist/src/ruby/utils.js.map +0 -1
- package/dist/src/steps/__tests__/add-editor-rules.test.js +0 -208
- package/dist/src/steps/__tests__/add-editor-rules.test.js.map +0 -1
- package/dist/src/steps/add-editor-rules.d.ts +0 -8
- package/dist/src/steps/add-editor-rules.js +0 -71
- package/dist/src/steps/add-editor-rules.js.map +0 -1
- package/dist/src/svelte/svelte-wizard-agent.js.map +0 -1
- package/dist/src/swift/swift-wizard-agent.js.map +0 -1
- package/dist/src/swift/utils.js.map +0 -1
- package/dist/src/tanstack-router/tanstack-router-wizard-agent.js.map +0 -1
- package/dist/src/tanstack-router/utils.d.ts +0 -17
- package/dist/src/tanstack-router/utils.js.map +0 -1
- package/dist/src/tanstack-start/tanstack-start-wizard-agent.js.map +0 -1
- package/dist/src/tanstack-start/utils.js.map +0 -1
- package/dist/src/utils/__tests__/clack-utils.test.js.map +0 -1
- package/dist/src/utils/clack-utils.d.ts +0 -188
- package/dist/src/utils/clack-utils.js +0 -705
- package/dist/src/utils/clack-utils.js.map +0 -1
- package/dist/src/utils/clack.d.ts +0 -2
- package/dist/src/utils/clack.js +0 -9
- package/dist/src/utils/clack.js.map +0 -1
- package/dist/src/vue/vue-wizard-agent.js.map +0 -1
- /package/dist/src/{steps/__tests__/add-editor-rules.test.d.ts → __tests__/wizard-abort.test.d.ts} +0 -0
- /package/dist/src/{angular → frameworks/angular}/utils.d.ts +0 -0
- /package/dist/src/{python → frameworks/python}/utils.js +0 -0
- /package/dist/src/{swift → frameworks/swift}/utils.js +0 -0
- /package/dist/src/{tanstack-start → frameworks/tanstack-start}/utils.d.ts +0 -0
- /package/dist/src/{utils/__tests__/clack-utils.test.d.ts → ui/tui/__tests__/layout-helpers.test.d.ts} +0 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SettingsOverrideScreen — Modal when .claude/settings.json contains env overrides
|
|
3
|
+
* that block the Wizard from reaching the PostHog LLM Gateway.
|
|
4
|
+
*/
|
|
5
|
+
import type { WizardStore } from '../store.js';
|
|
6
|
+
interface SettingsOverrideScreenProps {
|
|
7
|
+
store: WizardStore;
|
|
8
|
+
}
|
|
9
|
+
export declare const SettingsOverrideScreen: ({ store, }: SettingsOverrideScreenProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* SettingsOverrideScreen — Modal when .claude/settings.json contains env overrides
|
|
4
|
+
* that block the Wizard from reaching the PostHog LLM Gateway.
|
|
5
|
+
*/
|
|
6
|
+
import { Box, Text } from 'ink';
|
|
7
|
+
import { useState, useSyncExternalStore } from 'react';
|
|
8
|
+
import { ConfirmationInput } from '../primitives/index.js';
|
|
9
|
+
import { Icons } from '../styles.js';
|
|
10
|
+
export const SettingsOverrideScreen = ({ store, }) => {
|
|
11
|
+
useSyncExternalStore((cb) => store.subscribe(cb), () => store.getSnapshot());
|
|
12
|
+
const [feedback, setFeedback] = useState(null);
|
|
13
|
+
const keys = store.session.settingsOverrideKeys;
|
|
14
|
+
if (!keys || keys.length === 0) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
return (_jsx(Box, { flexDirection: "column", flexGrow: 1, alignItems: "center", justifyContent: "center", children: _jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "red", paddingX: 3, paddingY: 1, width: 64, children: [_jsx(Box, { justifyContent: "center", marginBottom: 1, children: _jsxs(Text, { color: "red", bold: true, children: [Icons.warning, " Settings Conflict"] }) }), _jsxs(Text, { children: ["Your project's ", _jsx(Text, { bold: true, children: ".claude/settings.json" }), " sets:"] }), _jsx(Box, { flexDirection: "column", marginY: 1, paddingLeft: 2, children: keys.map((key) => (_jsxs(Text, { children: [Icons.bullet, ' ', _jsx(Text, { color: "yellow", bold: true, children: key })] }, key))) }), _jsx(Text, { dimColor: true, children: "These overrides prevent the Wizard from reaching the PostHog LLM Gateway. We can back up the file and continue." }), feedback && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: "yellow", children: [Icons.warning, " ", feedback] }) })), _jsx(Box, { marginY: 1, children: _jsx(Text, { dimColor: true, children: '─'.repeat(56) }) }), _jsx(ConfirmationInput, { message: "Back up to .wizard-backup and continue?", confirmLabel: "Backup & continue [Enter]", cancelLabel: "Exit [Esc]", onConfirm: () => {
|
|
18
|
+
const ok = store.backupAndFixSettingsOverride();
|
|
19
|
+
if (!ok) {
|
|
20
|
+
setFeedback('Could not back up the settings file.');
|
|
21
|
+
}
|
|
22
|
+
}, onCancel: () => process.exit(1) })] }) }));
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=SettingsOverrideScreen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettingsOverrideScreen.js","sourceRoot":"","sources":["../../../../../src/ui/tui/screens/SettingsOverrideScreen.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAMrC,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,EACrC,KAAK,GACuB,EAAE,EAAE;IAChC,oBAAoB,CAClB,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,EAC3B,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAC1B,CAAC;IAEF,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC;IAEhD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,KAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,QAAQ,EAAE,CAAC,EACX,UAAU,EAAC,QAAQ,EACnB,cAAc,EAAC,QAAQ,YAEvB,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAC,KAAK,EACjB,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,EAAE,aAET,KAAC,GAAG,IAAC,cAAc,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,YAC1C,MAAC,IAAI,IAAC,KAAK,EAAC,KAAK,EAAC,IAAI,mBACnB,KAAK,CAAC,OAAO,0BACT,GACH,EAEN,MAAC,IAAI,kCACiB,KAAC,IAAI,IAAC,IAAI,4CAA6B,cACtD,EACP,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,YACnD,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACjB,MAAC,IAAI,eACF,KAAK,CAAC,MAAM,EAAE,GAAG,EAClB,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,kBACtB,GAAG,GACC,KAJE,GAAG,CAKP,CACR,CAAC,GACE,EACN,KAAC,IAAI,IAAC,QAAQ,sIAGP,EAEN,QAAQ,IAAI,CACX,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,aACjB,KAAK,CAAC,OAAO,OAAG,QAAQ,IACpB,GACH,CACP,EAED,KAAC,GAAG,IAAC,OAAO,EAAE,CAAC,YACb,KAAC,IAAI,IAAC,QAAQ,kBAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,GAClC,EAEN,KAAC,iBAAiB,IAChB,OAAO,EAAC,yCAAyC,EACjD,YAAY,EAAC,2BAA2B,EACxC,WAAW,EAAC,YAAY,EACxB,SAAS,EAAE,GAAG,EAAE;wBACd,MAAM,EAAE,GAAG,KAAK,CAAC,4BAA4B,EAAE,CAAC;wBAChD,IAAI,CAAC,EAAE,EAAE,CAAC;4BACR,WAAW,CAAC,sCAAsC,CAAC,CAAC;wBACtD,CAAC;oBACH,CAAC,EACD,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAC/B,IACE,GACF,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/**\n * SettingsOverrideScreen — Modal when .claude/settings.json contains env overrides\n * that block the Wizard from reaching the PostHog LLM Gateway.\n */\n\nimport { Box, Text } from 'ink';\nimport { useState, useSyncExternalStore } from 'react';\nimport type { WizardStore } from '../store.js';\nimport { ConfirmationInput } from '../primitives/index.js';\nimport { Icons } from '../styles.js';\n\ninterface SettingsOverrideScreenProps {\n store: WizardStore;\n}\n\nexport const SettingsOverrideScreen = ({\n store,\n}: SettingsOverrideScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const [feedback, setFeedback] = useState<string | null>(null);\n const keys = store.session.settingsOverrideKeys;\n\n if (!keys || keys.length === 0) {\n return null;\n }\n\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"red\"\n paddingX={3}\n paddingY={1}\n width={64}\n >\n <Box justifyContent=\"center\" marginBottom={1}>\n <Text color=\"red\" bold>\n {Icons.warning} Settings Conflict\n </Text>\n </Box>\n\n <Text>\n Your project's <Text bold>.claude/settings.json</Text> sets:\n </Text>\n <Box flexDirection=\"column\" marginY={1} paddingLeft={2}>\n {keys.map((key) => (\n <Text key={key}>\n {Icons.bullet}{' '}\n <Text color=\"yellow\" bold>\n {key}\n </Text>\n </Text>\n ))}\n </Box>\n <Text dimColor>\n These overrides prevent the Wizard from reaching the PostHog LLM\n Gateway. We can back up the file and continue.\n </Text>\n\n {feedback && (\n <Box marginTop={1}>\n <Text color=\"yellow\">\n {Icons.warning} {feedback}\n </Text>\n </Box>\n )}\n\n <Box marginY={1}>\n <Text dimColor>{'─'.repeat(56)}</Text>\n </Box>\n\n <ConfirmationInput\n message=\"Back up to .wizard-backup and continue?\"\n confirmLabel=\"Backup & continue [Enter]\"\n cancelLabel=\"Exit [Esc]\"\n onConfirm={() => {\n const ok = store.backupAndFixSettingsOverride();\n if (!ok) {\n setFeedback('Could not back up the settings file.');\n }\n }}\n onCancel={() => process.exit(1)}\n />\n </Box>\n </Box>\n );\n};\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SetupScreen — Generic framework disambiguation.
|
|
3
|
+
*
|
|
4
|
+
* Iterates unresolved setup questions from the FrameworkConfig
|
|
5
|
+
* and renders a PickerMenu for each. If all questions are auto-resolved,
|
|
6
|
+
* this screen is skipped entirely (the router skips it via its show() predicate).
|
|
7
|
+
*/
|
|
8
|
+
import type { WizardStore } from '../store.js';
|
|
9
|
+
interface SetupScreenProps {
|
|
10
|
+
store: WizardStore;
|
|
11
|
+
}
|
|
12
|
+
export declare const SetupScreen: ({ store }: SetupScreenProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* SetupScreen — Generic framework disambiguation.
|
|
4
|
+
*
|
|
5
|
+
* Iterates unresolved setup questions from the FrameworkConfig
|
|
6
|
+
* and renders a PickerMenu for each. If all questions are auto-resolved,
|
|
7
|
+
* this screen is skipped entirely (the router skips it via its show() predicate).
|
|
8
|
+
*/
|
|
9
|
+
import { Box, Text } from 'ink';
|
|
10
|
+
import { useState, useEffect } from 'react';
|
|
11
|
+
import { useSyncExternalStore } from 'react';
|
|
12
|
+
import { PickerMenu } from '../primitives/index.js';
|
|
13
|
+
import { Colors } from '../styles.js';
|
|
14
|
+
export const SetupScreen = ({ store }) => {
|
|
15
|
+
useSyncExternalStore((cb) => store.subscribe(cb), () => store.getSnapshot());
|
|
16
|
+
const config = store.session.frameworkConfig;
|
|
17
|
+
const questions = config?.metadata.setup?.questions ?? [];
|
|
18
|
+
// Track which question index we're currently showing
|
|
19
|
+
const [currentIndex, setCurrentIndex] = useState(0);
|
|
20
|
+
const [resolving, setResolving] = useState(true);
|
|
21
|
+
// On mount, run auto-detection for all questions
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
void (async () => {
|
|
24
|
+
for (const q of questions) {
|
|
25
|
+
// Skip if already resolved (e.g. by CLI arg)
|
|
26
|
+
if (q.key in store.session.frameworkContext)
|
|
27
|
+
continue;
|
|
28
|
+
try {
|
|
29
|
+
const detected = await q.detect({
|
|
30
|
+
installDir: store.session.installDir,
|
|
31
|
+
});
|
|
32
|
+
if (detected !== null) {
|
|
33
|
+
store.setFrameworkContext(q.key, detected);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Detection failed — will ask the user
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
setResolving(false);
|
|
41
|
+
// If all resolved, the router's isComplete predicate will
|
|
42
|
+
// resolve past this screen on the next render cycle.
|
|
43
|
+
})();
|
|
44
|
+
}, []);
|
|
45
|
+
if (resolving) {
|
|
46
|
+
return (_jsx(Box, { flexDirection: "column", flexGrow: 1, children: _jsx(Text, { dimColor: true, children: "Detecting project configuration..." }) }));
|
|
47
|
+
}
|
|
48
|
+
// Get unresolved questions
|
|
49
|
+
const unresolved = questions.filter((q) => !(q.key in store.session.frameworkContext));
|
|
50
|
+
if (unresolved.length === 0) {
|
|
51
|
+
// All resolved — should have already advanced
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const question = unresolved[currentIndex] ?? unresolved[0];
|
|
55
|
+
if (!question)
|
|
56
|
+
return null;
|
|
57
|
+
return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, color: Colors.accent, children: "Project Setup" }), config && (_jsxs(Text, { dimColor: true, children: ["Configuring ", config.metadata.name, " integration"] }))] }), _jsx(PickerMenu, { message: question.message, options: question.options.map((o) => ({
|
|
58
|
+
label: o.label,
|
|
59
|
+
value: o.value,
|
|
60
|
+
hint: o.hint,
|
|
61
|
+
})), onSelect: (value) => {
|
|
62
|
+
const selected = Array.isArray(value) ? value[0] : value;
|
|
63
|
+
store.setFrameworkContext(question.key, selected);
|
|
64
|
+
// Check if more unresolved questions remain
|
|
65
|
+
const remaining = unresolved.filter((q) => q.key !== question.key &&
|
|
66
|
+
!(q.key in store.session.frameworkContext));
|
|
67
|
+
if (remaining.length > 0) {
|
|
68
|
+
setCurrentIndex((i) => i + 1);
|
|
69
|
+
}
|
|
70
|
+
// When no remaining questions, setFrameworkContext already
|
|
71
|
+
// triggered emitChange — router resolves past this screen.
|
|
72
|
+
} })] }));
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=SetupScreen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SetupScreen.js","sourceRoot":"","sources":["../../../../../src/ui/tui/screens/SetupScreen.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * SetupScreen — Generic framework disambiguation.\n *\n * Iterates unresolved setup questions from the FrameworkConfig\n * and renders a PickerMenu for each. If all questions are auto-resolved,\n * this screen is skipped entirely (the router skips it via its show() predicate).\n */\n\nimport { Box, Text } from 'ink';\nimport { useState, useEffect } from 'react';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '../store.js';\nimport { PickerMenu } from '../primitives/index.js';\nimport { Colors } from '../styles.js';\nimport type { SetupQuestion } from '../../../lib/framework-config.js';\n\ninterface SetupScreenProps {\n store: WizardStore;\n}\n\nexport const SetupScreen = ({ store }: SetupScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const config = store.session.frameworkConfig;\n const questions = config?.metadata.setup?.questions ?? [];\n\n // Track which question index we're currently showing\n const [currentIndex, setCurrentIndex] = useState(0);\n const [resolving, setResolving] = useState(true);\n\n // On mount, run auto-detection for all questions\n useEffect(() => {\n void (async () => {\n for (const q of questions) {\n // Skip if already resolved (e.g. by CLI arg)\n if (q.key in store.session.frameworkContext) continue;\n\n try {\n const detected = await q.detect({\n installDir: store.session.installDir,\n });\n if (detected !== null) {\n store.setFrameworkContext(q.key, detected);\n }\n } catch {\n // Detection failed — will ask the user\n }\n }\n setResolving(false);\n\n // If all resolved, the router's isComplete predicate will\n // resolve past this screen on the next render cycle.\n })();\n }, []);\n\n if (resolving) {\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text dimColor>Detecting project configuration...</Text>\n </Box>\n );\n }\n\n // Get unresolved questions\n const unresolved = questions.filter(\n (q: SetupQuestion) => !(q.key in store.session.frameworkContext),\n );\n\n if (unresolved.length === 0) {\n // All resolved — should have already advanced\n return null;\n }\n\n const question = unresolved[currentIndex] ?? unresolved[0];\n if (!question) return null;\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color={Colors.accent}>\n Project Setup\n </Text>\n {config && (\n <Text dimColor>Configuring {config.metadata.name} integration</Text>\n )}\n </Box>\n\n <PickerMenu<string>\n message={question.message}\n options={question.options.map((o) => ({\n label: o.label,\n value: o.value,\n hint: o.hint,\n }))}\n onSelect={(value) => {\n const selected = Array.isArray(value) ? value[0] : value;\n store.setFrameworkContext(question.key, selected);\n\n // Check if more unresolved questions remain\n const remaining = unresolved.filter(\n (q: SetupQuestion) =>\n q.key !== question.key &&\n !(q.key in store.session.frameworkContext),\n );\n\n if (remaining.length > 0) {\n setCurrentIndex((i) => i + 1);\n }\n // When no remaining questions, setFrameworkContext already\n // triggered emitChange — router resolves past this screen.\n }}\n />\n </Box>\n );\n};\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* McpInstaller — service layer between McpScreen and MCP business logic.
|
|
3
|
+
*
|
|
4
|
+
* Decouples the screen from step internals. Testable, swappable,
|
|
5
|
+
* no dynamic imports in React components.
|
|
6
|
+
*/
|
|
7
|
+
export interface McpClientInfo {
|
|
8
|
+
name: string;
|
|
9
|
+
}
|
|
10
|
+
export interface McpInstaller {
|
|
11
|
+
/** Detect which MCP-capable editors are available on this machine. */
|
|
12
|
+
detectClients(): Promise<McpClientInfo[]>;
|
|
13
|
+
/** Install the PostHog MCP server to the given clients. Returns names of successfully installed clients. */
|
|
14
|
+
install(clientNames: string[]): Promise<string[]>;
|
|
15
|
+
/** Remove the PostHog MCP server from all installed clients. Returns names of removed clients. */
|
|
16
|
+
remove(): Promise<string[]>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Production McpInstaller backed by real MCP client detection and installation.
|
|
20
|
+
*/
|
|
21
|
+
export declare function createMcpInstaller(): McpInstaller;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* McpInstaller — service layer between McpScreen and MCP business logic.
|
|
3
|
+
*
|
|
4
|
+
* Decouples the screen from step internals. Testable, swappable,
|
|
5
|
+
* no dynamic imports in React components.
|
|
6
|
+
*/
|
|
7
|
+
import { getSupportedClients, removeMCPServer, getInstalledClients, } from '../../../steps/add-mcp-server-to-clients/index.js';
|
|
8
|
+
import { ALL_FEATURE_VALUES } from '../../../steps/add-mcp-server-to-clients/defaults.js';
|
|
9
|
+
import { logToFile } from '../../../utils/debug.js';
|
|
10
|
+
/**
|
|
11
|
+
* Production McpInstaller backed by real MCP client detection and installation.
|
|
12
|
+
*/
|
|
13
|
+
export function createMcpInstaller() {
|
|
14
|
+
// Cache the raw MCPClient objects so install() can reference them by name
|
|
15
|
+
let cachedClients = [];
|
|
16
|
+
return {
|
|
17
|
+
async detectClients() {
|
|
18
|
+
const supported = await getSupportedClients();
|
|
19
|
+
cachedClients = supported.map((c) => ({ name: c.name, raw: c }));
|
|
20
|
+
return supported.map((c) => ({ name: c.name }));
|
|
21
|
+
},
|
|
22
|
+
async install(clientNames) {
|
|
23
|
+
const features = [...ALL_FEATURE_VALUES];
|
|
24
|
+
const toInstall = cachedClients
|
|
25
|
+
.filter((c) => clientNames.includes(c.name))
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
27
|
+
.map((c) => c.raw);
|
|
28
|
+
if (toInstall.length === 0) {
|
|
29
|
+
logToFile(`[McpInstaller] No clients matched. clientNames=${JSON.stringify(clientNames)}, cached=${JSON.stringify(cachedClients.map((c) => c.name))}`);
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
const installed = [];
|
|
33
|
+
for (const client of toInstall) {
|
|
34
|
+
try {
|
|
35
|
+
const result = await client.addServer(undefined, features, false);
|
|
36
|
+
if (result?.success) {
|
|
37
|
+
installed.push(client.name);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
logToFile(`[McpInstaller] addServer returned success=false for ${client.name}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
logToFile(`[McpInstaller] addServer threw for ${client.name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return installed;
|
|
48
|
+
},
|
|
49
|
+
async remove() {
|
|
50
|
+
const installed = await getInstalledClients();
|
|
51
|
+
if (installed.length === 0)
|
|
52
|
+
return [];
|
|
53
|
+
await removeMCPServer(installed);
|
|
54
|
+
return installed.map((c) => c.name);
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=mcp-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-installer.js","sourceRoot":"","sources":["../../../../../src/ui/tui/services/mcp-installer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,mBAAmB,GACpB,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sDAAsD,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAiBpD;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,0EAA0E;IAC1E,IAAI,aAAa,GAA0C,EAAE,CAAC;IAE9D,OAAO;QACL,KAAK,CAAC,aAAa;YACjB,MAAM,SAAS,GAAG,MAAM,mBAAmB,EAAE,CAAC;YAC9C,aAAa,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACjE,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,WAAqB;YACjC,MAAM,QAAQ,GAAG,CAAC,GAAG,kBAAkB,CAAC,CAAC;YACzC,MAAM,SAAS,GAAG,aAAa;iBAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC5C,8DAA8D;iBAC7D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAU,CAAC,CAAC;YAE5B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,SAAS,CACP,kDAAkD,IAAI,CAAC,SAAS,CAC9D,WAAW,CACZ,YAAY,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAChE,CAAC;gBACF,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,KAAK,MAAM,MAAM,IAAI,SAAS,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;oBAClE,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;wBACpB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAc,CAAC,CAAC;oBACxC,CAAC;yBAAM,CAAC;wBACN,SAAS,CACP,uDAAuD,MAAM,CAAC,IAAI,EAAE,CACrE,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,SAAS,CACP,sCAAsC,MAAM,CAAC,IAAI,KAC/C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,EAAE,CACH,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,KAAK,CAAC,MAAM;YACV,MAAM,SAAS,GAAG,MAAM,mBAAmB,EAAE,CAAC;YAC9C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YACtC,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;YACjC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/**\n * McpInstaller — service layer between McpScreen and MCP business logic.\n *\n * Decouples the screen from step internals. Testable, swappable,\n * no dynamic imports in React components.\n */\n\nimport {\n getSupportedClients,\n removeMCPServer,\n getInstalledClients,\n} from '../../../steps/add-mcp-server-to-clients/index.js';\nimport { ALL_FEATURE_VALUES } from '../../../steps/add-mcp-server-to-clients/defaults.js';\nimport { logToFile } from '../../../utils/debug.js';\n\nexport interface McpClientInfo {\n name: string;\n}\n\nexport interface McpInstaller {\n /** Detect which MCP-capable editors are available on this machine. */\n detectClients(): Promise<McpClientInfo[]>;\n\n /** Install the PostHog MCP server to the given clients. Returns names of successfully installed clients. */\n install(clientNames: string[]): Promise<string[]>;\n\n /** Remove the PostHog MCP server from all installed clients. Returns names of removed clients. */\n remove(): Promise<string[]>;\n}\n\n/**\n * Production McpInstaller backed by real MCP client detection and installation.\n */\nexport function createMcpInstaller(): McpInstaller {\n // Cache the raw MCPClient objects so install() can reference them by name\n let cachedClients: Array<{ name: string; raw: unknown }> = [];\n\n return {\n async detectClients(): Promise<McpClientInfo[]> {\n const supported = await getSupportedClients();\n cachedClients = supported.map((c) => ({ name: c.name, raw: c }));\n return supported.map((c) => ({ name: c.name }));\n },\n\n async install(clientNames: string[]): Promise<string[]> {\n const features = [...ALL_FEATURE_VALUES];\n const toInstall = cachedClients\n .filter((c) => clientNames.includes(c.name))\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map((c) => c.raw as any);\n\n if (toInstall.length === 0) {\n logToFile(\n `[McpInstaller] No clients matched. clientNames=${JSON.stringify(\n clientNames,\n )}, cached=${JSON.stringify(cachedClients.map((c) => c.name))}`,\n );\n return [];\n }\n\n const installed: string[] = [];\n for (const client of toInstall) {\n try {\n const result = await client.addServer(undefined, features, false);\n if (result?.success) {\n installed.push(client.name as string);\n } else {\n logToFile(\n `[McpInstaller] addServer returned success=false for ${client.name}`,\n );\n }\n } catch (err) {\n logToFile(\n `[McpInstaller] addServer threw for ${client.name}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n }\n return installed;\n },\n\n async remove(): Promise<string[]> {\n const installed = await getInstalledClients();\n if (installed.length === 0) return [];\n await removeMCPServer(installed);\n return installed.map((c) => c.name);\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* start-tui.ts — Sets up the Ink TUI renderer and InkUI.
|
|
3
|
+
*/
|
|
4
|
+
import { WizardStore, Flow } from './store.js';
|
|
5
|
+
export declare function startTUI(version: string, flow?: Flow): {
|
|
6
|
+
unmount: () => void;
|
|
7
|
+
store: WizardStore;
|
|
8
|
+
waitForSetup: () => Promise<void>;
|
|
9
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* start-tui.ts — Sets up the Ink TUI renderer and InkUI.
|
|
3
|
+
*/
|
|
4
|
+
import { render } from 'ink';
|
|
5
|
+
import { createElement } from 'react';
|
|
6
|
+
import { WizardStore, Flow } from './store.js';
|
|
7
|
+
import { InkUI } from './ink-ui.js';
|
|
8
|
+
import { setUI } from '../index.js';
|
|
9
|
+
import { App } from './App.js';
|
|
10
|
+
// ANSI escape sequences
|
|
11
|
+
const RESET_ATTRS = '\x1b[0m';
|
|
12
|
+
const CLEAR_SCREEN = '\x1b[2J';
|
|
13
|
+
const CURSOR_HOME = '\x1b[H';
|
|
14
|
+
const BG_BLACK = '\x1b[48;2;0;0;0m';
|
|
15
|
+
/** Set background to true black, clear screen, cursor to top-left. */
|
|
16
|
+
const FORCE_DARK = BG_BLACK + CLEAR_SCREEN + CURSOR_HOME;
|
|
17
|
+
export function startTUI(version, flow = Flow.Wizard) {
|
|
18
|
+
// Force dark background regardless of terminal theme
|
|
19
|
+
process.stdout.write(FORCE_DARK);
|
|
20
|
+
const store = new WizardStore(flow);
|
|
21
|
+
store.version = version;
|
|
22
|
+
// Swap in the InkUI
|
|
23
|
+
const inkUI = new InkUI(store);
|
|
24
|
+
setUI(inkUI);
|
|
25
|
+
// Render the Ink app
|
|
26
|
+
const { unmount: inkUnmount } = render(createElement(App, { store }));
|
|
27
|
+
// Reset terminal on exit
|
|
28
|
+
const cleanup = () => {
|
|
29
|
+
process.stdout.write(RESET_ATTRS + CLEAR_SCREEN + CURSOR_HOME);
|
|
30
|
+
};
|
|
31
|
+
process.on('exit', cleanup);
|
|
32
|
+
return {
|
|
33
|
+
unmount: () => {
|
|
34
|
+
inkUnmount();
|
|
35
|
+
cleanup();
|
|
36
|
+
},
|
|
37
|
+
store,
|
|
38
|
+
waitForSetup: () => store.setupComplete,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=start-tui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-tui.js","sourceRoot":"","sources":["../../../../src/ui/tui/start-tui.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,wBAAwB;AACxB,MAAM,WAAW,GAAG,SAAS,CAAC;AAC9B,MAAM,YAAY,GAAG,SAAS,CAAC;AAC/B,MAAM,WAAW,GAAG,QAAQ,CAAC;AAC7B,MAAM,QAAQ,GAAG,kBAAkB,CAAC;AAEpC,sEAAsE;AACtE,MAAM,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,CAAC;AAEzD,MAAM,UAAU,QAAQ,CACtB,OAAe,EACf,OAAa,IAAI,CAAC,MAAM;IAMxB,qDAAqD;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAEjC,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;IACpC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;IAExB,oBAAoB;IACpB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/B,KAAK,CAAC,KAAK,CAAC,CAAC;IAEb,qBAAqB;IACrB,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAEtE,yBAAyB;IACzB,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,YAAY,GAAG,WAAW,CAAC,CAAC;IACjE,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE5B,OAAO;QACL,OAAO,EAAE,GAAG,EAAE;YACZ,UAAU,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK;QACL,YAAY,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,aAAa;KACxC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * start-tui.ts — Sets up the Ink TUI renderer and InkUI.\n */\n\nimport { render } from 'ink';\nimport { createElement } from 'react';\nimport { WizardStore, Flow } from './store.js';\nimport { InkUI } from './ink-ui.js';\nimport { setUI } from '../index.js';\nimport { App } from './App.js';\n\n// ANSI escape sequences\nconst RESET_ATTRS = '\\x1b[0m';\nconst CLEAR_SCREEN = '\\x1b[2J';\nconst CURSOR_HOME = '\\x1b[H';\nconst BG_BLACK = '\\x1b[48;2;0;0;0m';\n\n/** Set background to true black, clear screen, cursor to top-left. */\nconst FORCE_DARK = BG_BLACK + CLEAR_SCREEN + CURSOR_HOME;\n\nexport function startTUI(\n version: string,\n flow: Flow = Flow.Wizard,\n): {\n unmount: () => void;\n store: WizardStore;\n waitForSetup: () => Promise<void>;\n} {\n // Force dark background regardless of terminal theme\n process.stdout.write(FORCE_DARK);\n\n const store = new WizardStore(flow);\n store.version = version;\n\n // Swap in the InkUI\n const inkUI = new InkUI(store);\n setUI(inkUI);\n\n // Render the Ink app\n const { unmount: inkUnmount } = render(createElement(App, { store }));\n\n // Reset terminal on exit\n const cleanup = () => {\n process.stdout.write(RESET_ATTRS + CLEAR_SCREEN + CURSOR_HOME);\n };\n process.on('exit', cleanup);\n\n return {\n unmount: () => {\n inkUnmount();\n cleanup();\n },\n store,\n waitForSetup: () => store.setupComplete,\n };\n}\n"]}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WizardStore — Nanostore-backed reactive store for the TUI.
|
|
3
|
+
* React components subscribe via useSyncExternalStore.
|
|
4
|
+
*
|
|
5
|
+
* Navigation is delegated to WizardRouter.
|
|
6
|
+
* The active screen is derived from session state — not imperatively set.
|
|
7
|
+
* Overlays (outage, etc.) are the only imperative navigation.
|
|
8
|
+
*
|
|
9
|
+
* All session mutations that affect screen resolution go through
|
|
10
|
+
* explicit setters so emitChange() is always called.
|
|
11
|
+
*/
|
|
12
|
+
import { TaskStatus } from '../wizard-ui.js';
|
|
13
|
+
import { type WizardSession, type OutroData, type DiscoveredFeature, AdditionalFeature, McpOutcome, RunPhase } from '../../lib/wizard-session.js';
|
|
14
|
+
import { WizardRouter, type ScreenName, Screen, Overlay, Flow } from './router.js';
|
|
15
|
+
export { TaskStatus, Screen, Overlay, Flow, RunPhase, McpOutcome };
|
|
16
|
+
export type { ScreenName, OutroData, WizardSession };
|
|
17
|
+
export interface TaskItem {
|
|
18
|
+
label: string;
|
|
19
|
+
activeForm?: string;
|
|
20
|
+
status: TaskStatus;
|
|
21
|
+
/** Legacy compat */
|
|
22
|
+
done: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface PlannedEvent {
|
|
25
|
+
name: string;
|
|
26
|
+
description: string;
|
|
27
|
+
}
|
|
28
|
+
export declare class WizardStore {
|
|
29
|
+
private $session;
|
|
30
|
+
private $statusMessages;
|
|
31
|
+
private $statusExpanded;
|
|
32
|
+
private $tasks;
|
|
33
|
+
private $eventPlan;
|
|
34
|
+
private $learnCardBlockIdx;
|
|
35
|
+
private $learnCardComplete;
|
|
36
|
+
private $version;
|
|
37
|
+
/** Last screen seen — used to detect screen transitions for analytics. */
|
|
38
|
+
private _lastScreen;
|
|
39
|
+
/** Hooks run when transitioning onto a screen. */
|
|
40
|
+
private _enterScreenHooks;
|
|
41
|
+
version: string;
|
|
42
|
+
/** Navigation router — resolves active screen from session state. */
|
|
43
|
+
readonly router: WizardRouter;
|
|
44
|
+
/**
|
|
45
|
+
* Setup promise — IntroScreen resolves this when the user confirms.
|
|
46
|
+
* bin.ts awaits it before calling runWizard.
|
|
47
|
+
*/
|
|
48
|
+
private _resolveSetup;
|
|
49
|
+
readonly setupComplete: Promise<void>;
|
|
50
|
+
/** Blocks agent execution until the settings-override overlay is dismissed. */
|
|
51
|
+
private _resolveSettingsOverride;
|
|
52
|
+
private _backupAndFixSettings;
|
|
53
|
+
constructor(flow?: Flow);
|
|
54
|
+
get session(): WizardSession;
|
|
55
|
+
set session(value: WizardSession);
|
|
56
|
+
get statusMessages(): string[];
|
|
57
|
+
get tasks(): TaskItem[];
|
|
58
|
+
get eventPlan(): PlannedEvent[];
|
|
59
|
+
get statusExpanded(): boolean;
|
|
60
|
+
toggleStatusExpanded(): void;
|
|
61
|
+
setStatusExpanded(expanded: boolean): void;
|
|
62
|
+
/** Unblocks bin.ts via the setupComplete promise. */
|
|
63
|
+
completeSetup(): void;
|
|
64
|
+
setRunPhase(phase: RunPhase): void;
|
|
65
|
+
setCredentials(credentials: WizardSession['credentials']): void;
|
|
66
|
+
setFrameworkConfig(integration: WizardSession['integration'], config: WizardSession['frameworkConfig']): void;
|
|
67
|
+
setDetectionComplete(): void;
|
|
68
|
+
setDetectedFramework(label: string): void;
|
|
69
|
+
setLoginUrl(url: string | null): void;
|
|
70
|
+
setServiceStatus(status: {
|
|
71
|
+
description: string;
|
|
72
|
+
statusPageUrl: string;
|
|
73
|
+
} | null): void;
|
|
74
|
+
/**
|
|
75
|
+
* Push the settings-override overlay and return a promise that blocks
|
|
76
|
+
* until the user dismisses it via backupAndFixSettingsOverride().
|
|
77
|
+
*/
|
|
78
|
+
showSettingsOverride(keys: string[], backupAndFix: () => boolean): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Back up .claude/settings.json. Dismisses the overlay on success.
|
|
81
|
+
*/
|
|
82
|
+
backupAndFixSettingsOverride(): boolean;
|
|
83
|
+
addDiscoveredFeature(feature: DiscoveredFeature): void;
|
|
84
|
+
/**
|
|
85
|
+
* Enable an additional feature: enqueue it for the stop hook
|
|
86
|
+
* and set any feature-specific session flags.
|
|
87
|
+
*/
|
|
88
|
+
enableFeature(feature: AdditionalFeature): void;
|
|
89
|
+
setMcpComplete(outcome?: McpOutcome, installedClients?: string[]): void;
|
|
90
|
+
setOutroData(data: OutroData): void;
|
|
91
|
+
setFrameworkContext(key: string, value: unknown): void;
|
|
92
|
+
/**
|
|
93
|
+
* The screen that should be rendered right now.
|
|
94
|
+
* Derived from session state via the router.
|
|
95
|
+
*/
|
|
96
|
+
get currentScreen(): ScreenName;
|
|
97
|
+
/** Direction hint for screen transitions. */
|
|
98
|
+
get lastNavDirection(): 'push' | 'pop' | null;
|
|
99
|
+
getVersion(): number;
|
|
100
|
+
/**
|
|
101
|
+
* Notify React that state has changed.
|
|
102
|
+
* The router re-resolves the active screen on next render.
|
|
103
|
+
*/
|
|
104
|
+
emitChange(): void;
|
|
105
|
+
pushOverlay(overlay: Overlay): void;
|
|
106
|
+
popOverlay(): void;
|
|
107
|
+
/**
|
|
108
|
+
* Register a callback to run when transitioning onto the given screen.
|
|
109
|
+
* Fires after every transition that lands on this screen.
|
|
110
|
+
*/
|
|
111
|
+
onEnterScreen(screen: ScreenName, fn: () => void): void;
|
|
112
|
+
/**
|
|
113
|
+
* Detect screen transitions, run enter-screen hooks, and fire analytics.
|
|
114
|
+
* Called at the end of emitChange/pushOverlay/popOverlay.
|
|
115
|
+
*/
|
|
116
|
+
private _detectTransition;
|
|
117
|
+
pushStatus(message: string): void;
|
|
118
|
+
setTasks(tasks: TaskItem[]): void;
|
|
119
|
+
updateTask(index: number, done: boolean): void;
|
|
120
|
+
setEventPlan(events: PlannedEvent[]): void;
|
|
121
|
+
get learnCardBlockIdx(): number;
|
|
122
|
+
setLearnCardBlockIdx(idx: number): void;
|
|
123
|
+
get learnCardComplete(): boolean;
|
|
124
|
+
setLearnCardComplete(): void;
|
|
125
|
+
syncTodos(todos: Array<{
|
|
126
|
+
content: string;
|
|
127
|
+
status: string;
|
|
128
|
+
activeForm?: string;
|
|
129
|
+
}>): void;
|
|
130
|
+
subscribe(callback: () => void): () => void;
|
|
131
|
+
getSnapshot(): number;
|
|
132
|
+
}
|