@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,320 @@
|
|
|
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 { atom, map } from 'nanostores';
|
|
13
|
+
import { TaskStatus } from '../wizard-ui.js';
|
|
14
|
+
import { AdditionalFeature, McpOutcome, RunPhase, buildSession, } from '../../lib/wizard-session.js';
|
|
15
|
+
import { WizardRouter, Screen, Overlay, Flow, } from './router.js';
|
|
16
|
+
import { analytics, sessionProperties } from '../../utils/analytics.js';
|
|
17
|
+
export { TaskStatus, Screen, Overlay, Flow, RunPhase, McpOutcome };
|
|
18
|
+
export class WizardStore {
|
|
19
|
+
// ── Internal nanostore atoms ─────────────────────────────────────
|
|
20
|
+
$session = map(buildSession({}));
|
|
21
|
+
$statusMessages = atom([]);
|
|
22
|
+
$statusExpanded = atom(false);
|
|
23
|
+
$tasks = atom([]);
|
|
24
|
+
$eventPlan = atom([]);
|
|
25
|
+
$learnCardBlockIdx = atom(0);
|
|
26
|
+
$learnCardComplete = atom(false);
|
|
27
|
+
$version = atom(0);
|
|
28
|
+
/** Last screen seen — used to detect screen transitions for analytics. */
|
|
29
|
+
_lastScreen = null;
|
|
30
|
+
/** Hooks run when transitioning onto a screen. */
|
|
31
|
+
_enterScreenHooks = new Map();
|
|
32
|
+
version = '';
|
|
33
|
+
/** Navigation router — resolves active screen from session state. */
|
|
34
|
+
router;
|
|
35
|
+
/**
|
|
36
|
+
* Setup promise — IntroScreen resolves this when the user confirms.
|
|
37
|
+
* bin.ts awaits it before calling runWizard.
|
|
38
|
+
*/
|
|
39
|
+
_resolveSetup;
|
|
40
|
+
setupComplete = new Promise((resolve) => {
|
|
41
|
+
this._resolveSetup = resolve;
|
|
42
|
+
});
|
|
43
|
+
/** Blocks agent execution until the settings-override overlay is dismissed. */
|
|
44
|
+
_resolveSettingsOverride = null;
|
|
45
|
+
_backupAndFixSettings = null;
|
|
46
|
+
constructor(flow = Flow.Wizard) {
|
|
47
|
+
this.router = new WizardRouter(flow);
|
|
48
|
+
}
|
|
49
|
+
// ── State accessors (read from atoms) ────────────────────────────
|
|
50
|
+
get session() {
|
|
51
|
+
return this.$session.get();
|
|
52
|
+
}
|
|
53
|
+
set session(value) {
|
|
54
|
+
this.$session.set(value);
|
|
55
|
+
}
|
|
56
|
+
get statusMessages() {
|
|
57
|
+
return this.$statusMessages.get();
|
|
58
|
+
}
|
|
59
|
+
get tasks() {
|
|
60
|
+
return this.$tasks.get();
|
|
61
|
+
}
|
|
62
|
+
get eventPlan() {
|
|
63
|
+
return this.$eventPlan.get();
|
|
64
|
+
}
|
|
65
|
+
get statusExpanded() {
|
|
66
|
+
return this.$statusExpanded.get();
|
|
67
|
+
}
|
|
68
|
+
toggleStatusExpanded() {
|
|
69
|
+
this.$statusExpanded.set(!this.$statusExpanded.get());
|
|
70
|
+
this.emitChange();
|
|
71
|
+
}
|
|
72
|
+
setStatusExpanded(expanded) {
|
|
73
|
+
if (this.$statusExpanded.get() !== expanded) {
|
|
74
|
+
this.$statusExpanded.set(expanded);
|
|
75
|
+
this.emitChange();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// ── Session setters ─────────────────────────────────────────────
|
|
79
|
+
// Every setter that affects screen resolution calls emitChange().
|
|
80
|
+
// Business logic calls these instead of mutating session directly.
|
|
81
|
+
/** Unblocks bin.ts via the setupComplete promise. */
|
|
82
|
+
completeSetup() {
|
|
83
|
+
this.$session.setKey('setupConfirmed', true);
|
|
84
|
+
analytics.wizardCapture('setup confirmed', sessionProperties(this.session));
|
|
85
|
+
this._resolveSetup();
|
|
86
|
+
this.emitChange();
|
|
87
|
+
}
|
|
88
|
+
setRunPhase(phase) {
|
|
89
|
+
this.$session.setKey('runPhase', phase);
|
|
90
|
+
this.emitChange();
|
|
91
|
+
}
|
|
92
|
+
setCredentials(credentials) {
|
|
93
|
+
this.$session.setKey('credentials', credentials);
|
|
94
|
+
analytics.wizardCapture('auth complete', {
|
|
95
|
+
project_id: credentials?.projectId,
|
|
96
|
+
});
|
|
97
|
+
this.emitChange();
|
|
98
|
+
}
|
|
99
|
+
setFrameworkConfig(integration, config) {
|
|
100
|
+
this.$session.setKey('integration', integration);
|
|
101
|
+
this.$session.setKey('frameworkConfig', config);
|
|
102
|
+
this.emitChange();
|
|
103
|
+
}
|
|
104
|
+
setDetectionComplete() {
|
|
105
|
+
this.$session.setKey('detectionComplete', true);
|
|
106
|
+
this.emitChange();
|
|
107
|
+
}
|
|
108
|
+
setDetectedFramework(label) {
|
|
109
|
+
this.$session.setKey('detectedFrameworkLabel', label);
|
|
110
|
+
this.emitChange();
|
|
111
|
+
}
|
|
112
|
+
setLoginUrl(url) {
|
|
113
|
+
this.$session.setKey('loginUrl', url);
|
|
114
|
+
this.emitChange();
|
|
115
|
+
}
|
|
116
|
+
setServiceStatus(status) {
|
|
117
|
+
this.$session.setKey('serviceStatus', status);
|
|
118
|
+
this.emitChange();
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Push the settings-override overlay and return a promise that blocks
|
|
122
|
+
* until the user dismisses it via backupAndFixSettingsOverride().
|
|
123
|
+
*/
|
|
124
|
+
showSettingsOverride(keys, backupAndFix) {
|
|
125
|
+
this.$session.setKey('settingsOverrideKeys', keys);
|
|
126
|
+
this._backupAndFixSettings = backupAndFix;
|
|
127
|
+
this.pushOverlay(Overlay.SettingsOverride);
|
|
128
|
+
return new Promise((resolve) => {
|
|
129
|
+
this._resolveSettingsOverride = resolve;
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Back up .claude/settings.json. Dismisses the overlay on success.
|
|
134
|
+
*/
|
|
135
|
+
backupAndFixSettingsOverride() {
|
|
136
|
+
const ok = this._backupAndFixSettings?.() ?? false;
|
|
137
|
+
if (ok) {
|
|
138
|
+
this.$session.setKey('settingsOverrideKeys', null);
|
|
139
|
+
this.popOverlay();
|
|
140
|
+
this._resolveSettingsOverride?.();
|
|
141
|
+
this._resolveSettingsOverride = null;
|
|
142
|
+
this._backupAndFixSettings = null;
|
|
143
|
+
}
|
|
144
|
+
return ok;
|
|
145
|
+
}
|
|
146
|
+
addDiscoveredFeature(feature) {
|
|
147
|
+
if (!this.session.discoveredFeatures.includes(feature)) {
|
|
148
|
+
this.session.discoveredFeatures.push(feature);
|
|
149
|
+
this.emitChange();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Enable an additional feature: enqueue it for the stop hook
|
|
154
|
+
* and set any feature-specific session flags.
|
|
155
|
+
*/
|
|
156
|
+
enableFeature(feature) {
|
|
157
|
+
if (!this.session.additionalFeatureQueue.includes(feature)) {
|
|
158
|
+
this.session.additionalFeatureQueue.push(feature);
|
|
159
|
+
}
|
|
160
|
+
// Feature-specific flags
|
|
161
|
+
if (feature === AdditionalFeature.LLM) {
|
|
162
|
+
this.session.llmOptIn = true;
|
|
163
|
+
}
|
|
164
|
+
analytics.wizardCapture('feature enabled', { feature });
|
|
165
|
+
this.emitChange();
|
|
166
|
+
}
|
|
167
|
+
setMcpComplete(outcome = McpOutcome.Skipped, installedClients = []) {
|
|
168
|
+
this.$session.setKey('mcpComplete', true);
|
|
169
|
+
this.$session.setKey('mcpOutcome', outcome);
|
|
170
|
+
this.$session.setKey('mcpInstalledClients', installedClients);
|
|
171
|
+
analytics.wizardCapture('mcp complete', {
|
|
172
|
+
mcp_outcome: outcome,
|
|
173
|
+
mcp_installed_clients: installedClients,
|
|
174
|
+
...sessionProperties(this.session),
|
|
175
|
+
});
|
|
176
|
+
this.emitChange();
|
|
177
|
+
}
|
|
178
|
+
setOutroData(data) {
|
|
179
|
+
this.$session.setKey('outroData', data);
|
|
180
|
+
this.emitChange();
|
|
181
|
+
}
|
|
182
|
+
setFrameworkContext(key, value) {
|
|
183
|
+
const ctx = { ...this.$session.get().frameworkContext, [key]: value };
|
|
184
|
+
this.$session.setKey('frameworkContext', ctx);
|
|
185
|
+
this.emitChange();
|
|
186
|
+
}
|
|
187
|
+
// ── Derived state ───────────────────────────────────────────────
|
|
188
|
+
/**
|
|
189
|
+
* The screen that should be rendered right now.
|
|
190
|
+
* Derived from session state via the router.
|
|
191
|
+
*/
|
|
192
|
+
get currentScreen() {
|
|
193
|
+
return this.router.resolve(this.session);
|
|
194
|
+
}
|
|
195
|
+
/** Direction hint for screen transitions. */
|
|
196
|
+
get lastNavDirection() {
|
|
197
|
+
return this.router.lastNavDirection;
|
|
198
|
+
}
|
|
199
|
+
// ── Change notification ─────────────────────────────────────────
|
|
200
|
+
getVersion() {
|
|
201
|
+
return this.$version.get();
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Notify React that state has changed.
|
|
205
|
+
* The router re-resolves the active screen on next render.
|
|
206
|
+
*/
|
|
207
|
+
emitChange() {
|
|
208
|
+
this.router._setDirection('push');
|
|
209
|
+
this.$version.set(this.$version.get() + 1);
|
|
210
|
+
this._detectTransition();
|
|
211
|
+
}
|
|
212
|
+
// ── Overlay navigation ──────────────────────────────────────────
|
|
213
|
+
pushOverlay(overlay) {
|
|
214
|
+
this.router._setDirection('push');
|
|
215
|
+
this.router.pushOverlay(overlay);
|
|
216
|
+
this.$version.set(this.$version.get() + 1);
|
|
217
|
+
this._detectTransition();
|
|
218
|
+
}
|
|
219
|
+
popOverlay() {
|
|
220
|
+
this.router._setDirection('pop');
|
|
221
|
+
this.router.popOverlay();
|
|
222
|
+
this.$version.set(this.$version.get() + 1);
|
|
223
|
+
this._detectTransition();
|
|
224
|
+
}
|
|
225
|
+
// ── Screen transition analytics ─────────────────────────────────
|
|
226
|
+
/**
|
|
227
|
+
* Register a callback to run when transitioning onto the given screen.
|
|
228
|
+
* Fires after every transition that lands on this screen.
|
|
229
|
+
*/
|
|
230
|
+
onEnterScreen(screen, fn) {
|
|
231
|
+
const list = this._enterScreenHooks.get(screen) ?? [];
|
|
232
|
+
list.push(fn);
|
|
233
|
+
this._enterScreenHooks.set(screen, list);
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Detect screen transitions, run enter-screen hooks, and fire analytics.
|
|
237
|
+
* Called at the end of emitChange/pushOverlay/popOverlay.
|
|
238
|
+
*/
|
|
239
|
+
_detectTransition() {
|
|
240
|
+
const next = this.router.resolve(this.session);
|
|
241
|
+
const prev = this._lastScreen;
|
|
242
|
+
if (prev !== null && next !== prev) {
|
|
243
|
+
const hooks = this._enterScreenHooks.get(next);
|
|
244
|
+
if (hooks) {
|
|
245
|
+
for (const fn of hooks)
|
|
246
|
+
fn();
|
|
247
|
+
}
|
|
248
|
+
analytics.wizardCapture(`screen ${next}`, {
|
|
249
|
+
from_screen: prev,
|
|
250
|
+
...sessionProperties(this.session),
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
this._lastScreen = next;
|
|
254
|
+
}
|
|
255
|
+
// ── Agent observation state ─────────────────────────────────────
|
|
256
|
+
pushStatus(message) {
|
|
257
|
+
const msgs = this.$statusMessages.get();
|
|
258
|
+
// Skip consecutive duplicate messages
|
|
259
|
+
if (msgs.length > 0 && msgs[msgs.length - 1] === message)
|
|
260
|
+
return;
|
|
261
|
+
this.$statusMessages.set([...msgs, message]);
|
|
262
|
+
this.emitChange();
|
|
263
|
+
}
|
|
264
|
+
setTasks(tasks) {
|
|
265
|
+
this.$tasks.set(tasks);
|
|
266
|
+
this.emitChange();
|
|
267
|
+
}
|
|
268
|
+
updateTask(index, done) {
|
|
269
|
+
const tasks = this.$tasks.get();
|
|
270
|
+
if (tasks[index]) {
|
|
271
|
+
const updated = [...tasks];
|
|
272
|
+
updated[index] = {
|
|
273
|
+
...updated[index],
|
|
274
|
+
done,
|
|
275
|
+
status: done ? TaskStatus.Completed : TaskStatus.Pending,
|
|
276
|
+
};
|
|
277
|
+
this.$tasks.set(updated);
|
|
278
|
+
this.emitChange();
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
setEventPlan(events) {
|
|
282
|
+
this.$eventPlan.set(events);
|
|
283
|
+
this.emitChange();
|
|
284
|
+
}
|
|
285
|
+
get learnCardBlockIdx() {
|
|
286
|
+
return this.$learnCardBlockIdx.get();
|
|
287
|
+
}
|
|
288
|
+
setLearnCardBlockIdx(idx) {
|
|
289
|
+
this.$learnCardBlockIdx.set(idx);
|
|
290
|
+
}
|
|
291
|
+
get learnCardComplete() {
|
|
292
|
+
return this.$learnCardComplete.get();
|
|
293
|
+
}
|
|
294
|
+
setLearnCardComplete() {
|
|
295
|
+
this.$learnCardComplete.set(true);
|
|
296
|
+
this.emitChange();
|
|
297
|
+
}
|
|
298
|
+
syncTodos(todos) {
|
|
299
|
+
const incoming = todos.map((t) => ({
|
|
300
|
+
label: t.content,
|
|
301
|
+
activeForm: t.activeForm,
|
|
302
|
+
status: t.status || TaskStatus.Pending,
|
|
303
|
+
done: t.status === TaskStatus.Completed,
|
|
304
|
+
}));
|
|
305
|
+
const incomingLabels = new Set(incoming.map((t) => t.label));
|
|
306
|
+
const retained = this.$tasks
|
|
307
|
+
.get()
|
|
308
|
+
.filter((t) => t.done && !incomingLabels.has(t.label));
|
|
309
|
+
this.$tasks.set([...retained, ...incoming]);
|
|
310
|
+
this.emitChange();
|
|
311
|
+
}
|
|
312
|
+
// ── React integration ───────────────────────────────────────────
|
|
313
|
+
subscribe(callback) {
|
|
314
|
+
return this.$version.listen(() => callback());
|
|
315
|
+
}
|
|
316
|
+
getSnapshot() {
|
|
317
|
+
return this.$version.get();
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../src/ui/tui/store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * WizardStore — Nanostore-backed reactive store for the TUI.\n * React components subscribe via useSyncExternalStore.\n *\n * Navigation is delegated to WizardRouter.\n * The active screen is derived from session state — not imperatively set.\n * Overlays (outage, etc.) are the only imperative navigation.\n *\n * All session mutations that affect screen resolution go through\n * explicit setters so emitChange() is always called.\n */\n\nimport { atom, map } from 'nanostores';\nimport { TaskStatus } from '../wizard-ui.js';\nimport {\n type WizardSession,\n type OutroData,\n type DiscoveredFeature,\n AdditionalFeature,\n McpOutcome,\n RunPhase,\n buildSession,\n} from '../../lib/wizard-session.js';\nimport {\n WizardRouter,\n type ScreenName,\n Screen,\n Overlay,\n Flow,\n} from './router.js';\nimport { analytics, sessionProperties } from '../../utils/analytics.js';\n\nexport { TaskStatus, Screen, Overlay, Flow, RunPhase, McpOutcome };\nexport type { ScreenName, OutroData, WizardSession };\n\nexport interface TaskItem {\n label: string;\n activeForm?: string;\n status: TaskStatus;\n /** Legacy compat */\n done: boolean;\n}\n\nexport interface PlannedEvent {\n name: string;\n description: string;\n}\n\nexport class WizardStore {\n // ── Internal nanostore atoms ─────────────────────────────────────\n private $session = map<WizardSession>(buildSession({}));\n private $statusMessages = atom<string[]>([]);\n private $statusExpanded = atom(false);\n private $tasks = atom<TaskItem[]>([]);\n private $eventPlan = atom<PlannedEvent[]>([]);\n private $learnCardBlockIdx = atom(0);\n private $learnCardComplete = atom(false);\n private $version = atom(0);\n\n /** Last screen seen — used to detect screen transitions for analytics. */\n private _lastScreen: ScreenName | null = null;\n\n /** Hooks run when transitioning onto a screen. */\n private _enterScreenHooks = new Map<ScreenName, (() => void)[]>();\n\n version = '';\n\n /** Navigation router — resolves active screen from session state. */\n readonly router: WizardRouter;\n\n /**\n * Setup promise — IntroScreen resolves this when the user confirms.\n * bin.ts awaits it before calling runWizard.\n */\n private _resolveSetup!: () => void;\n readonly setupComplete: Promise<void> = new Promise((resolve) => {\n this._resolveSetup = resolve;\n });\n\n /** Blocks agent execution until the settings-override overlay is dismissed. */\n private _resolveSettingsOverride: (() => void) | null = null;\n private _backupAndFixSettings: (() => boolean) | null = null;\n\n constructor(flow: Flow = Flow.Wizard) {\n this.router = new WizardRouter(flow);\n }\n\n // ── State accessors (read from atoms) ────────────────────────────\n\n get session(): WizardSession {\n return this.$session.get();\n }\n\n set session(value: WizardSession) {\n this.$session.set(value);\n }\n\n get statusMessages(): string[] {\n return this.$statusMessages.get();\n }\n\n get tasks(): TaskItem[] {\n return this.$tasks.get();\n }\n\n get eventPlan(): PlannedEvent[] {\n return this.$eventPlan.get();\n }\n\n get statusExpanded(): boolean {\n return this.$statusExpanded.get();\n }\n\n toggleStatusExpanded(): void {\n this.$statusExpanded.set(!this.$statusExpanded.get());\n this.emitChange();\n }\n\n setStatusExpanded(expanded: boolean): void {\n if (this.$statusExpanded.get() !== expanded) {\n this.$statusExpanded.set(expanded);\n this.emitChange();\n }\n }\n\n // ── Session setters ─────────────────────────────────────────────\n // Every setter that affects screen resolution calls emitChange().\n // Business logic calls these instead of mutating session directly.\n\n /** Unblocks bin.ts via the setupComplete promise. */\n completeSetup(): void {\n this.$session.setKey('setupConfirmed', true);\n analytics.wizardCapture('setup confirmed', sessionProperties(this.session));\n this._resolveSetup();\n this.emitChange();\n }\n\n setRunPhase(phase: RunPhase): void {\n this.$session.setKey('runPhase', phase);\n this.emitChange();\n }\n\n setCredentials(credentials: WizardSession['credentials']): void {\n this.$session.setKey('credentials', credentials);\n analytics.wizardCapture('auth complete', {\n project_id: credentials?.projectId,\n });\n this.emitChange();\n }\n\n setFrameworkConfig(\n integration: WizardSession['integration'],\n config: WizardSession['frameworkConfig'],\n ): void {\n this.$session.setKey('integration', integration);\n this.$session.setKey('frameworkConfig', config);\n this.emitChange();\n }\n\n setDetectionComplete(): void {\n this.$session.setKey('detectionComplete', true);\n this.emitChange();\n }\n\n setDetectedFramework(label: string): void {\n this.$session.setKey('detectedFrameworkLabel', label);\n this.emitChange();\n }\n\n setLoginUrl(url: string | null): void {\n this.$session.setKey('loginUrl', url);\n this.emitChange();\n }\n\n setServiceStatus(\n status: { description: string; statusPageUrl: string } | null,\n ): void {\n this.$session.setKey('serviceStatus', status);\n this.emitChange();\n }\n\n /**\n * Push the settings-override overlay and return a promise that blocks\n * until the user dismisses it via backupAndFixSettingsOverride().\n */\n showSettingsOverride(\n keys: string[],\n backupAndFix: () => boolean,\n ): Promise<void> {\n this.$session.setKey('settingsOverrideKeys', keys);\n this._backupAndFixSettings = backupAndFix;\n this.pushOverlay(Overlay.SettingsOverride);\n return new Promise((resolve) => {\n this._resolveSettingsOverride = resolve;\n });\n }\n\n /**\n * Back up .claude/settings.json. Dismisses the overlay on success.\n */\n backupAndFixSettingsOverride(): boolean {\n const ok = this._backupAndFixSettings?.() ?? false;\n if (ok) {\n this.$session.setKey('settingsOverrideKeys', null);\n this.popOverlay();\n this._resolveSettingsOverride?.();\n this._resolveSettingsOverride = null;\n this._backupAndFixSettings = null;\n }\n return ok;\n }\n\n addDiscoveredFeature(feature: DiscoveredFeature): void {\n if (!this.session.discoveredFeatures.includes(feature)) {\n this.session.discoveredFeatures.push(feature);\n this.emitChange();\n }\n }\n\n /**\n * Enable an additional feature: enqueue it for the stop hook\n * and set any feature-specific session flags.\n */\n enableFeature(feature: AdditionalFeature): void {\n if (!this.session.additionalFeatureQueue.includes(feature)) {\n this.session.additionalFeatureQueue.push(feature);\n }\n // Feature-specific flags\n if (feature === AdditionalFeature.LLM) {\n this.session.llmOptIn = true;\n }\n analytics.wizardCapture('feature enabled', { feature });\n this.emitChange();\n }\n\n setMcpComplete(\n outcome: McpOutcome = McpOutcome.Skipped,\n installedClients: string[] = [],\n ): void {\n this.$session.setKey('mcpComplete', true);\n this.$session.setKey('mcpOutcome', outcome);\n this.$session.setKey('mcpInstalledClients', installedClients);\n analytics.wizardCapture('mcp complete', {\n mcp_outcome: outcome,\n mcp_installed_clients: installedClients,\n ...sessionProperties(this.session),\n });\n this.emitChange();\n }\n\n setOutroData(data: OutroData): void {\n this.$session.setKey('outroData', data);\n this.emitChange();\n }\n\n setFrameworkContext(key: string, value: unknown): void {\n const ctx = { ...this.$session.get().frameworkContext, [key]: value };\n this.$session.setKey('frameworkContext', ctx);\n this.emitChange();\n }\n\n // ── Derived state ───────────────────────────────────────────────\n\n /**\n * The screen that should be rendered right now.\n * Derived from session state via the router.\n */\n get currentScreen(): ScreenName {\n return this.router.resolve(this.session);\n }\n\n /** Direction hint for screen transitions. */\n get lastNavDirection(): 'push' | 'pop' | null {\n return this.router.lastNavDirection;\n }\n\n // ── Change notification ─────────────────────────────────────────\n\n getVersion(): number {\n return this.$version.get();\n }\n\n /**\n * Notify React that state has changed.\n * The router re-resolves the active screen on next render.\n */\n emitChange(): void {\n this.router._setDirection('push');\n this.$version.set(this.$version.get() + 1);\n this._detectTransition();\n }\n\n // ── Overlay navigation ──────────────────────────────────────────\n\n pushOverlay(overlay: Overlay): void {\n this.router._setDirection('push');\n this.router.pushOverlay(overlay);\n this.$version.set(this.$version.get() + 1);\n this._detectTransition();\n }\n\n popOverlay(): void {\n this.router._setDirection('pop');\n this.router.popOverlay();\n this.$version.set(this.$version.get() + 1);\n this._detectTransition();\n }\n\n // ── Screen transition analytics ─────────────────────────────────\n\n /**\n * Register a callback to run when transitioning onto the given screen.\n * Fires after every transition that lands on this screen.\n */\n onEnterScreen(screen: ScreenName, fn: () => void): void {\n const list = this._enterScreenHooks.get(screen) ?? [];\n list.push(fn);\n this._enterScreenHooks.set(screen, list);\n }\n\n /**\n * Detect screen transitions, run enter-screen hooks, and fire analytics.\n * Called at the end of emitChange/pushOverlay/popOverlay.\n */\n private _detectTransition(): void {\n const next = this.router.resolve(this.session);\n const prev = this._lastScreen;\n if (prev !== null && next !== prev) {\n const hooks = this._enterScreenHooks.get(next);\n if (hooks) {\n for (const fn of hooks) fn();\n }\n analytics.wizardCapture(`screen ${next}`, {\n from_screen: prev,\n ...sessionProperties(this.session),\n });\n }\n this._lastScreen = next;\n }\n\n // ── Agent observation state ─────────────────────────────────────\n\n pushStatus(message: string): void {\n const msgs = this.$statusMessages.get();\n // Skip consecutive duplicate messages\n if (msgs.length > 0 && msgs[msgs.length - 1] === message) return;\n this.$statusMessages.set([...msgs, message]);\n this.emitChange();\n }\n\n setTasks(tasks: TaskItem[]): void {\n this.$tasks.set(tasks);\n this.emitChange();\n }\n\n updateTask(index: number, done: boolean): void {\n const tasks = this.$tasks.get();\n if (tasks[index]) {\n const updated = [...tasks];\n updated[index] = {\n ...updated[index],\n done,\n status: done ? TaskStatus.Completed : TaskStatus.Pending,\n };\n this.$tasks.set(updated);\n this.emitChange();\n }\n }\n\n setEventPlan(events: PlannedEvent[]): void {\n this.$eventPlan.set(events);\n this.emitChange();\n }\n\n get learnCardBlockIdx(): number {\n return this.$learnCardBlockIdx.get();\n }\n\n setLearnCardBlockIdx(idx: number): void {\n this.$learnCardBlockIdx.set(idx);\n }\n\n get learnCardComplete(): boolean {\n return this.$learnCardComplete.get();\n }\n\n setLearnCardComplete(): void {\n this.$learnCardComplete.set(true);\n this.emitChange();\n }\n\n syncTodos(\n todos: Array<{ content: string; status: string; activeForm?: string }>,\n ): void {\n const incoming = todos.map((t) => ({\n label: t.content,\n activeForm: t.activeForm,\n status: (t.status as TaskStatus) || TaskStatus.Pending,\n done: t.status === TaskStatus.Completed,\n }));\n\n const incomingLabels = new Set(incoming.map((t) => t.label));\n\n const retained = this.$tasks\n .get()\n .filter((t) => t.done && !incomingLabels.has(t.label));\n\n this.$tasks.set([...retained, ...incoming]);\n this.emitChange();\n }\n\n // ── React integration ───────────────────────────────────────────\n\n subscribe(callback: () => void): () => void {\n return this.$version.listen(() => callback());\n }\n\n getSnapshot(): number {\n return this.$version.get();\n }\n}\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared style constants for TUI layout primitives.
|
|
3
|
+
*/
|
|
4
|
+
export declare enum HAlign {
|
|
5
|
+
Left = "flex-start",
|
|
6
|
+
Center = "center",
|
|
7
|
+
Right = "flex-end"
|
|
8
|
+
}
|
|
9
|
+
export declare enum VAlign {
|
|
10
|
+
Top = "flex-start",
|
|
11
|
+
Center = "center",
|
|
12
|
+
Bottom = "flex-end"
|
|
13
|
+
}
|
|
14
|
+
export declare const Colors: {
|
|
15
|
+
readonly primary: "cyan";
|
|
16
|
+
readonly accent: "#F54E00";
|
|
17
|
+
readonly success: "green";
|
|
18
|
+
readonly error: "red";
|
|
19
|
+
readonly muted: "gray";
|
|
20
|
+
};
|
|
21
|
+
export declare const Icons: {
|
|
22
|
+
readonly diamond: "◆";
|
|
23
|
+
readonly diamondOpen: "◇";
|
|
24
|
+
readonly check: "✔";
|
|
25
|
+
readonly warning: "⚠";
|
|
26
|
+
readonly squareFilled: "◼";
|
|
27
|
+
readonly squareOpen: "◻";
|
|
28
|
+
readonly triangleRight: "▶";
|
|
29
|
+
readonly triangleSmallRight: "▸";
|
|
30
|
+
readonly bullet: "•";
|
|
31
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared style constants for TUI layout primitives.
|
|
3
|
+
*/
|
|
4
|
+
export var HAlign;
|
|
5
|
+
(function (HAlign) {
|
|
6
|
+
HAlign["Left"] = "flex-start";
|
|
7
|
+
HAlign["Center"] = "center";
|
|
8
|
+
HAlign["Right"] = "flex-end";
|
|
9
|
+
})(HAlign || (HAlign = {}));
|
|
10
|
+
export var VAlign;
|
|
11
|
+
(function (VAlign) {
|
|
12
|
+
VAlign["Top"] = "flex-start";
|
|
13
|
+
VAlign["Center"] = "center";
|
|
14
|
+
VAlign["Bottom"] = "flex-end";
|
|
15
|
+
})(VAlign || (VAlign = {}));
|
|
16
|
+
export const Colors = {
|
|
17
|
+
primary: 'cyan',
|
|
18
|
+
accent: '#F54E00',
|
|
19
|
+
success: 'green',
|
|
20
|
+
error: 'red',
|
|
21
|
+
muted: 'gray',
|
|
22
|
+
};
|
|
23
|
+
export const Icons = {
|
|
24
|
+
diamond: '\u25C6',
|
|
25
|
+
diamondOpen: '\u25C7',
|
|
26
|
+
check: '\u2714',
|
|
27
|
+
warning: '\u26A0',
|
|
28
|
+
squareFilled: '\u25FC',
|
|
29
|
+
squareOpen: '\u25FB',
|
|
30
|
+
triangleRight: '\u25B6',
|
|
31
|
+
triangleSmallRight: '\u25B8',
|
|
32
|
+
bullet: '\u2022',
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../src/ui/tui/styles.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAN,IAAY,MAIX;AAJD,WAAY,MAAM;IAChB,6BAAmB,CAAA;IACnB,2BAAiB,CAAA;IACjB,4BAAkB,CAAA;AACpB,CAAC,EAJW,MAAM,KAAN,MAAM,QAIjB;AAED,MAAM,CAAN,IAAY,MAIX;AAJD,WAAY,MAAM;IAChB,4BAAkB,CAAA;IAClB,2BAAiB,CAAA;IACjB,6BAAmB,CAAA;AACrB,CAAC,EAJW,MAAM,KAAN,MAAM,QAIjB;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,MAAM;CACL,CAAC;AAEX,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,OAAO,EAAE,QAAQ;IACjB,WAAW,EAAE,QAAQ;IACrB,KAAK,EAAE,QAAQ;IACf,OAAO,EAAE,QAAQ;IACjB,YAAY,EAAE,QAAQ;IACtB,UAAU,EAAE,QAAQ;IACpB,aAAa,EAAE,QAAQ;IACvB,kBAAkB,EAAE,QAAQ;IAC5B,MAAM,EAAE,QAAQ;CACR,CAAC","sourcesContent":["/**\n * Shared style constants for TUI layout primitives.\n */\n\nexport enum HAlign {\n Left = 'flex-start',\n Center = 'center',\n Right = 'flex-end',\n}\n\nexport enum VAlign {\n Top = 'flex-start',\n Center = 'center',\n Bottom = 'flex-end',\n}\n\nexport const Colors = {\n primary: 'cyan',\n accent: '#F54E00',\n success: 'green',\n error: 'red',\n muted: 'gray',\n} as const;\n\nexport const Icons = {\n diamond: '\\u25C6',\n diamondOpen: '\\u25C7',\n check: '\\u2714',\n warning: '\\u26A0',\n squareFilled: '\\u25FC',\n squareOpen: '\\u25FB',\n triangleRight: '\\u25B6',\n triangleSmallRight: '\\u25B8',\n bullet: '\\u2022',\n} as const;\n"]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WizardUI — abstraction layer for all user-facing operations.
|
|
3
|
+
*
|
|
4
|
+
* Business logic calls `getUI()` instead of importing the store directly.
|
|
5
|
+
* Implementations: InkUI (TUI), LoggingUI (CI).
|
|
6
|
+
*
|
|
7
|
+
* No prompt methods — the TUI screens own all user input.
|
|
8
|
+
* Session-mutating methods trigger reactive screen resolution in the TUI.
|
|
9
|
+
*/
|
|
10
|
+
export declare enum TaskStatus {
|
|
11
|
+
Pending = "pending",
|
|
12
|
+
InProgress = "in_progress",
|
|
13
|
+
Completed = "completed"
|
|
14
|
+
}
|
|
15
|
+
export interface SpinnerHandle {
|
|
16
|
+
start(message?: string): void;
|
|
17
|
+
stop(message?: string): void;
|
|
18
|
+
message(msg?: string): void;
|
|
19
|
+
}
|
|
20
|
+
export interface WizardUI {
|
|
21
|
+
intro(message: string): void;
|
|
22
|
+
outro(message: string): void;
|
|
23
|
+
cancel(message: string): void;
|
|
24
|
+
log: {
|
|
25
|
+
info(message: string): void;
|
|
26
|
+
warn(message: string): void;
|
|
27
|
+
error(message: string): void;
|
|
28
|
+
success(message: string): void;
|
|
29
|
+
step(message: string): void;
|
|
30
|
+
};
|
|
31
|
+
note(message: string): void;
|
|
32
|
+
pushStatus(message: string): void;
|
|
33
|
+
spinner(): SpinnerHandle;
|
|
34
|
+
/** Signal that the main work (agent run) has started. */
|
|
35
|
+
startRun(): void;
|
|
36
|
+
/** Store OAuth/API credentials. Resolves past AuthScreen in TUI. */
|
|
37
|
+
setCredentials(credentials: {
|
|
38
|
+
accessToken: string;
|
|
39
|
+
projectApiKey: string;
|
|
40
|
+
host: string;
|
|
41
|
+
projectId: number;
|
|
42
|
+
}): void;
|
|
43
|
+
/** Show service degradation (pushes outage overlay in TUI). */
|
|
44
|
+
showServiceStatus(data: {
|
|
45
|
+
description: string;
|
|
46
|
+
statusPageUrl: string;
|
|
47
|
+
}): void;
|
|
48
|
+
/** Warn that .claude/settings.json overrides blocking env vars (pushes blocking overlay in TUI). */
|
|
49
|
+
showSettingsOverride(keys: string[], backupAndFix: () => boolean): Promise<void>;
|
|
50
|
+
/** Set the detected framework label (e.g., "Django with Wagtail CMS") */
|
|
51
|
+
setDetectedFramework(label: string): void;
|
|
52
|
+
/** Register a callback to run when the TUI transitions onto the given screen. */
|
|
53
|
+
onEnterScreen(screen: string, fn: () => void): void;
|
|
54
|
+
setLoginUrl(url: string | null): void;
|
|
55
|
+
syncTodos(todos: Array<{
|
|
56
|
+
content: string;
|
|
57
|
+
status: string;
|
|
58
|
+
activeForm?: string;
|
|
59
|
+
}>): void;
|
|
60
|
+
setEventPlan(events: Array<{
|
|
61
|
+
name: string;
|
|
62
|
+
description: string;
|
|
63
|
+
}>): void;
|
|
64
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* WizardUI — abstraction layer for all user-facing operations.
|
|
4
|
+
*
|
|
5
|
+
* Business logic calls `getUI()` instead of importing the store directly.
|
|
6
|
+
* Implementations: InkUI (TUI), LoggingUI (CI).
|
|
7
|
+
*
|
|
8
|
+
* No prompt methods — the TUI screens own all user input.
|
|
9
|
+
* Session-mutating methods trigger reactive screen resolution in the TUI.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.TaskStatus = void 0;
|
|
13
|
+
var TaskStatus;
|
|
14
|
+
(function (TaskStatus) {
|
|
15
|
+
TaskStatus["Pending"] = "pending";
|
|
16
|
+
TaskStatus["InProgress"] = "in_progress";
|
|
17
|
+
TaskStatus["Completed"] = "completed";
|
|
18
|
+
})(TaskStatus || (exports.TaskStatus = TaskStatus = {}));
|
|
19
|
+
//# sourceMappingURL=wizard-ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard-ui.js","sourceRoot":"","sources":["../../../src/ui/wizard-ui.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,iCAAmB,CAAA;IACnB,wCAA0B,CAAA;IAC1B,qCAAuB,CAAA;AACzB,CAAC,EAJW,UAAU,0BAAV,UAAU,QAIrB","sourcesContent":["/**\n * WizardUI — abstraction layer for all user-facing operations.\n *\n * Business logic calls `getUI()` instead of importing the store directly.\n * Implementations: InkUI (TUI), LoggingUI (CI).\n *\n * No prompt methods — the TUI screens own all user input.\n * Session-mutating methods trigger reactive screen resolution in the TUI.\n */\n\nexport enum TaskStatus {\n Pending = 'pending',\n InProgress = 'in_progress',\n Completed = 'completed',\n}\n\nexport interface SpinnerHandle {\n start(message?: string): void;\n stop(message?: string): void;\n message(msg?: string): void;\n}\n\nexport interface WizardUI {\n // ── Lifecycle messages ────────────────────────────────────────────\n intro(message: string): void;\n outro(message: string): void;\n cancel(message: string): void;\n\n // ── Logging ───────────────────────────────────────────────────────\n log: {\n info(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n success(message: string): void;\n step(message: string): void;\n };\n\n note(message: string): void;\n pushStatus(message: string): void;\n\n // ── Spinner ───────────────────────────────────────────────────────\n spinner(): SpinnerHandle;\n\n // ── Session state (triggers reactive screen resolution in TUI) ────\n /** Signal that the main work (agent run) has started. */\n startRun(): void;\n\n /** Store OAuth/API credentials. Resolves past AuthScreen in TUI. */\n setCredentials(credentials: {\n accessToken: string;\n projectApiKey: string;\n host: string;\n projectId: number;\n }): void;\n\n /** Show service degradation (pushes outage overlay in TUI). */\n showServiceStatus(data: { description: string; statusPageUrl: string }): void;\n\n /** Warn that .claude/settings.json overrides blocking env vars (pushes blocking overlay in TUI). */\n showSettingsOverride(\n keys: string[],\n backupAndFix: () => boolean,\n ): Promise<void>;\n\n // ── Display state ──────────────────────────────────────────────────\n /** Set the detected framework label (e.g., \"Django with Wagtail CMS\") */\n setDetectedFramework(label: string): void;\n\n /** Register a callback to run when the TUI transitions onto the given screen. */\n onEnterScreen(screen: string, fn: () => void): void;\n\n setLoginUrl(url: string | null): void;\n\n // ── Todo tracking from SDK TodoWrite events ───────────────────────\n syncTodos(\n todos: Array<{ content: string; status: string; activeForm?: string }>,\n ): void;\n\n // ── Event plan from .posthog-events.json ────────────────────\n setEventPlan(events: Array<{ name: string; description: string }>): void;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -33,28 +33,39 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
const
|
|
36
|
+
const setup_utils_1 = require("../setup-utils");
|
|
37
37
|
const ChildProcess = __importStar(require("node:child_process"));
|
|
38
38
|
jest.mock('node:child_process', () => ({
|
|
39
39
|
__esModule: true,
|
|
40
40
|
...jest.requireActual('node:child_process'),
|
|
41
41
|
}));
|
|
42
|
-
jest.mock('
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
42
|
+
jest.mock('../../ui', () => ({
|
|
43
|
+
getUI: jest.fn().mockReturnValue({
|
|
44
|
+
log: {
|
|
45
|
+
info: jest.fn(),
|
|
46
|
+
success: jest.fn(),
|
|
47
|
+
warn: jest.fn(),
|
|
48
|
+
error: jest.fn(),
|
|
49
|
+
step: jest.fn(),
|
|
50
|
+
},
|
|
51
|
+
cancel: jest.fn(),
|
|
52
|
+
outro: jest.fn(),
|
|
53
|
+
intro: jest.fn(),
|
|
54
|
+
spinner: jest.fn().mockImplementation(() => ({
|
|
55
|
+
start: jest.fn(),
|
|
56
|
+
stop: jest.fn(),
|
|
57
|
+
message: jest.fn(),
|
|
58
|
+
})),
|
|
59
|
+
setDetectedFramework: jest.fn(),
|
|
60
|
+
setCredentials: jest.fn(),
|
|
61
|
+
pushStatus: jest.fn(),
|
|
62
|
+
syncTodos: jest.fn(),
|
|
63
|
+
setLoginUrl: jest.fn(),
|
|
64
|
+
showServiceStatus: jest.fn(),
|
|
65
|
+
showSettingsOverride: jest.fn(),
|
|
66
|
+
startRun: jest.fn(),
|
|
67
|
+
note: jest.fn(),
|
|
68
|
+
}),
|
|
58
69
|
}));
|
|
59
70
|
describe.skip('installPackage', () => {
|
|
60
71
|
afterEach(() => {
|
|
@@ -81,12 +92,11 @@ describe.skip('installPackage', () => {
|
|
|
81
92
|
cb(null, '', '');
|
|
82
93
|
}
|
|
83
94
|
});
|
|
84
|
-
await (0,
|
|
95
|
+
await (0, setup_utils_1.installPackage)({
|
|
85
96
|
alreadyInstalled: false,
|
|
86
97
|
packageName: 'posthog-js',
|
|
87
98
|
packageNameDisplayLabel: 'posthog-js',
|
|
88
99
|
forceInstall: true,
|
|
89
|
-
askBeforeUpdating: false,
|
|
90
100
|
packageManager: packageManagerMock,
|
|
91
101
|
installDir: process.cwd(),
|
|
92
102
|
});
|
|
@@ -113,16 +123,15 @@ describe.skip('installPackage', () => {
|
|
|
113
123
|
cb(null, '', '');
|
|
114
124
|
}
|
|
115
125
|
});
|
|
116
|
-
await (0,
|
|
126
|
+
await (0, setup_utils_1.installPackage)({
|
|
117
127
|
alreadyInstalled: false,
|
|
118
128
|
packageName: 'posthog-js',
|
|
119
129
|
packageNameDisplayLabel: 'posthog-js',
|
|
120
130
|
forceInstall: flag,
|
|
121
|
-
askBeforeUpdating: false,
|
|
122
131
|
packageManager: packageManagerMock,
|
|
123
132
|
installDir: process.cwd(),
|
|
124
133
|
});
|
|
125
134
|
expect(execSpy).toHaveBeenCalledWith('npm install posthog-js ', expect.any(Function));
|
|
126
135
|
});
|
|
127
136
|
});
|
|
128
|
-
//# sourceMappingURL=
|
|
137
|
+
//# sourceMappingURL=setup-utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-utils.test.js","sourceRoot":"","sources":["../../../../src/utils/__tests__/setup-utils.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { installPackage } from '../setup-utils';\n\nimport * as ChildProcess from 'node:child_process';\nimport type { PackageManager } from '../package-manager';\n\njest.mock('node:child_process', () => ({\n __esModule: true,\n ...jest.requireActual('node:child_process'),\n}));\n\njest.mock('../../ui', () => ({\n getUI: jest.fn().mockReturnValue({\n log: {\n info: jest.fn(),\n success: jest.fn(),\n warn: jest.fn(),\n error: jest.fn(),\n step: jest.fn(),\n },\n cancel: jest.fn(),\n outro: jest.fn(),\n intro: jest.fn(),\n spinner: jest.fn().mockImplementation(() => ({\n start: jest.fn(),\n stop: jest.fn(),\n message: jest.fn(),\n })),\n setDetectedFramework: jest.fn(),\n setCredentials: jest.fn(),\n pushStatus: jest.fn(),\n syncTodos: jest.fn(),\n setLoginUrl: jest.fn(),\n showServiceStatus: jest.fn(),\n showSettingsOverride: jest.fn(),\n startRun: jest.fn(),\n note: jest.fn(),\n }),\n}));\n\ndescribe.skip('installPackage', () => {\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n it('force-installs a package if the forceInstall flag is set', async () => {\n const packageManagerMock: PackageManager = {\n name: 'npm',\n label: 'NPM',\n installCommand: 'npm install',\n buildCommand: 'npm run build',\n runScriptCommand: 'npm run',\n flags: '',\n forceInstallFlag: '--force',\n detect: jest.fn(),\n addOverride: jest.fn(),\n };\n\n const execSpy = jest\n .spyOn(ChildProcess, 'exec')\n // @ts-expect-error - don't care about the return value\n .mockImplementationOnce((cmd, cb) => {\n if (cb) {\n // @ts-expect-error - don't care about the options value\n cb(null, '', '');\n }\n });\n\n await installPackage({\n alreadyInstalled: false,\n packageName: 'posthog-js',\n packageNameDisplayLabel: 'posthog-js',\n forceInstall: true,\n packageManager: packageManagerMock,\n installDir: process.cwd(),\n });\n\n expect(execSpy).toHaveBeenCalledWith(\n 'npm install posthog-js --force',\n expect.any(Function),\n );\n });\n\n it.each([false, undefined])(\n \"doesn't force-install a package if the forceInstall flag is %s\",\n async (flag) => {\n const packageManagerMock: PackageManager = {\n name: 'npm',\n label: 'NPM',\n installCommand: 'npm install',\n buildCommand: 'npm run build',\n runScriptCommand: 'npm run',\n flags: '',\n forceInstallFlag: '--force',\n detect: jest.fn(),\n addOverride: jest.fn(),\n };\n\n const execSpy = jest\n .spyOn(ChildProcess, 'exec')\n // @ts-expect-error - don't care about the return value\n .mockImplementationOnce((cmd, cb) => {\n if (cb) {\n // @ts-expect-error - don't care about the options value\n cb(null, '', '');\n }\n });\n\n await installPackage({\n alreadyInstalled: false,\n packageName: 'posthog-js',\n packageNameDisplayLabel: 'posthog-js',\n forceInstall: flag,\n packageManager: packageManagerMock,\n installDir: process.cwd(),\n });\n\n expect(execSpy).toHaveBeenCalledWith(\n 'npm install posthog-js ',\n expect.any(Function),\n );\n },\n );\n});\n"]}
|