diff --git a/bin.ts b/bin.ts index 3b61c3c9f..c061cde00 100644 --- a/bin.ts +++ b/bin.ts @@ -65,24 +65,24 @@ if (process.env.NODE_ENV === 'test') { })(); } -import { Wizard } from './src/wizard'; -import { basicIntegrationCommand } from './src/commands/basic-integration'; -import { mcpCommand } from './src/commands/mcp'; +import { Wizard } from './src/cli/wizard'; +import { basicIntegrationCommand } from './src/cli/commands/basic-integration'; +import { mcpCommand } from './src/cli/commands/mcp'; import { mcpAnalyticsCommand } from './src/commands/mcp-analytics'; import { replayVisionCommand } from './src/commands/replay-vision'; import { aiObservabilityCommand } from './src/commands/ai-observability'; import { metricsCommand } from './src/commands/metrics'; -import { auditCommand } from './src/commands/audit'; +import { auditCommand } from './src/cli/commands/audit'; import { doctorCommand } from './src/commands/doctor'; import { migrateCommand } from './src/commands/migrate'; import { revenueCommand } from './src/commands/revenue'; import { warehouseCommand } from './src/commands/warehouse'; -import { selfDrivingCommand } from './src/commands/self-driving'; -import { slackCommand } from './src/commands/slack'; +import { selfDrivingCommand } from './src/cli/commands/self-driving'; +import { slackCommand } from './src/cli/commands/slack'; import { uploadSourcemapsCommand } from './src/commands/upload-sourcemaps'; import { errorTrackingCommand } from './src/commands/error-tracking'; -import { skillCommand } from './src/commands/skill'; -import { cliCommand } from './src/commands/cli'; +import { skillCommand } from './src/cli/commands/skill'; +import { cliCommand } from './src/cli/commands/cli'; import { recoverOrphanedSettingsBackups } from '@shared/claude-settings'; // Heal any .claude/settings backup a previous interrupted run left orphaned, diff --git a/e2e-harness/__tests__/e2e-flow-snapshot.test.ts b/e2e-harness/__tests__/e2e-flow-snapshot.test.ts index 2303141c1..8b8a0b209 100644 --- a/e2e-harness/__tests__/e2e-flow-snapshot.test.ts +++ b/e2e-harness/__tests__/e2e-flow-snapshot.test.ts @@ -22,7 +22,7 @@ import { HostResolution } from '@shared/host-resolution'; import { FRAMEWORK_REGISTRY } from '@programs/frameworks/registry'; import { WizardReadiness } from '@shared/health-checks/readiness'; import { Program, getProgramConfig, type ProgramId } from '@programs'; -import { ScreenId } from '@ui/tui/router'; +import { ScreenId } from '@tui/router'; import { SELF_DRIVING_INTEGRATE_PATH_KEY } from '@programs/self-driving/detect'; import { WizardCiDriver } from '../wizard-ci-driver'; import { decideE2eAction, type WizardE2eProfile } from '../e2e-profile'; diff --git a/e2e-harness/__tests__/e2e-profile-ask.test.ts b/e2e-harness/__tests__/e2e-profile-ask.test.ts index 447d21e0b..134f6145a 100644 --- a/e2e-harness/__tests__/e2e-profile-ask.test.ts +++ b/e2e-harness/__tests__/e2e-profile-ask.test.ts @@ -7,7 +7,7 @@ * froze, so a workbench run can rely on it. */ -import { Overlay, ScreenId } from '@ui/tui/router'; +import { Overlay, ScreenId } from '@tui/router'; import type { AskQuestion } from '@lib/wizard-session'; import { DEFAULT_E2E_PROFILE, diff --git a/e2e-harness/__tests__/e2e-result.test.ts b/e2e-harness/__tests__/e2e-result.test.ts index a1bc777d8..8453def4e 100644 --- a/e2e-harness/__tests__/e2e-result.test.ts +++ b/e2e-harness/__tests__/e2e-result.test.ts @@ -14,7 +14,7 @@ import path from 'path'; import { OutroKind, RunPhase } from '@lib/wizard-session'; import type { AskQuestion, WizardSession } from '@lib/wizard-session'; import { DETECTED_WAREHOUSE_SOURCES_KEY } from '@programs/warehouse-source/detect'; -import { Overlay } from '@ui/tui/router'; +import { Overlay } from '@tui/router'; import { TASK_OUTCOMES_KEY } from '@agent'; import { E2eRunRecorder, diff --git a/e2e-harness/__tests__/wizard-ci-driver.test.ts b/e2e-harness/__tests__/wizard-ci-driver.test.ts index 474cacbb6..8c85c6673 100644 --- a/e2e-harness/__tests__/wizard-ci-driver.test.ts +++ b/e2e-harness/__tests__/wizard-ci-driver.test.ts @@ -17,7 +17,7 @@ import { HostResolution } from '@shared/host-resolution'; import { Integration } from '@shared/constants'; import { FRAMEWORK_REGISTRY } from '@programs/frameworks/registry'; import { WizardReadiness } from '@shared/health-checks/readiness'; -import { ScreenId, Overlay } from '@ui/tui/router'; +import { ScreenId, Overlay } from '@tui/router'; import { Program } from '@programs'; import { WizardCiDriver, UnknownActionError } from '../wizard-ci-driver'; import { ACTION_REGISTRY, NO_ACTION_SCREENS } from '../action-registry'; diff --git a/e2e-harness/action-registry.ts b/e2e-harness/action-registry.ts index 2449deee4..840d06ed4 100644 --- a/e2e-harness/action-registry.ts +++ b/e2e-harness/action-registry.ts @@ -13,7 +13,7 @@ */ import type { WizardStore } from '@ui/tui/store'; -import { ScreenId, Overlay, type ScreenName } from '@ui/tui/router'; +import { ScreenId, Overlay, type ScreenName } from '@tui/router'; import { McpOutcome, OutroKind } from '@lib/wizard-session'; import type { AskAnswers } from '@lib/wizard-session'; import { diff --git a/e2e-harness/e2e-profile.ts b/e2e-harness/e2e-profile.ts index 051fab496..edc760a4b 100644 --- a/e2e-harness/e2e-profile.ts +++ b/e2e-harness/e2e-profile.ts @@ -7,7 +7,7 @@ * make. Add a program's profile to {@link ./profiles} to make it e2e-drivable. */ -import { ScreenId, Overlay, type ScreenName } from '@ui/tui/router'; +import { ScreenId, Overlay, type ScreenName } from '@tui/router'; import type { AskAnswers, AskQuestion } from '@lib/wizard-session'; import type { CiState } from './wizard-ci-driver.js'; diff --git a/e2e-harness/wizard-ci-driver.ts b/e2e-harness/wizard-ci-driver.ts index e61bc5139..b1e1bfa7d 100644 --- a/e2e-harness/wizard-ci-driver.ts +++ b/e2e-harness/wizard-ci-driver.ts @@ -19,7 +19,7 @@ */ import type { WizardStore } from '@ui/tui/store'; -import type { ScreenName } from '@ui/tui/router'; +import type { ScreenName } from '@tui/router'; import type { PendingQuestion, RunPhase } from '@lib/wizard-session'; import { actionsForScreen, MissingParamError } from './action-registry.js'; diff --git a/scripts/check-screens.tsx b/scripts/check-screens.tsx index 034106c70..3949b8ffa 100644 --- a/scripts/check-screens.tsx +++ b/scripts/check-screens.tsx @@ -10,11 +10,11 @@ import React from 'react'; import { render } from 'ink-testing-library'; import { Box } from 'ink'; -import { AuthErrorScreen } from '@ui/tui/screens/AuthErrorScreen'; -import { ProgressList } from '@ui/tui/primitives/ProgressList'; -import { ManagedSettingsScreen } from '@ui/tui/screens/ManagedSettingsScreen'; -import { SettingsOverrideScreen } from '@ui/tui/screens/SettingsOverrideScreen'; -import { WizardAskScreen } from '@ui/tui/screens/WizardAskScreen'; +import { AuthErrorScreen } from '@tui/screens/AuthErrorScreen'; +import { ProgressList } from '@tui/primitives/ProgressList'; +import { ManagedSettingsScreen } from '@tui/screens/ManagedSettingsScreen'; +import { SettingsOverrideScreen } from '@tui/screens/SettingsOverrideScreen'; +import { WizardAskScreen } from '@tui/screens/WizardAskScreen'; import type { SettingsConflict } from '@agent/agent-interface'; function fakeStore(session: Record): any { diff --git a/scripts/mcp-install-smoke-test.ts b/scripts/mcp-install-smoke-test.ts index 13140d317..228688d93 100644 --- a/scripts/mcp-install-smoke-test.ts +++ b/scripts/mcp-install-smoke-test.ts @@ -15,7 +15,7 @@ import * as os from 'node:os'; import * as path from 'node:path'; import { fileURLToPath } from 'node:url'; -import { HEADLESS_FLAG } from '../src/lib/headless-mode'; +import { HEADLESS_FLAG } from '../src/shared/headless-mode'; const PROVIDERS = ['claude-code', 'codex'] as const; type Provider = (typeof PROVIDERS)[number]; diff --git a/scripts/tui-host.no-jest.ts b/scripts/tui-host.no-jest.ts index 17d864c27..81cdaf93e 100644 --- a/scripts/tui-host.no-jest.ts +++ b/scripts/tui-host.no-jest.ts @@ -16,7 +16,7 @@ import fs from 'fs'; import net from 'net'; import { spawnSync } from 'child_process'; -import { startTUI } from '@ui/tui/start-tui'; +import { startTUI } from '@tui/start-tui'; import { VERSION } from '@shared/version'; import { Program, getProgramConfig, type ProgramId } from '@programs'; import type { Harness, Sequence } from '@shared/constants'; @@ -42,7 +42,7 @@ import { detectSourceMapsPrerequisites, SOURCE_MAPS_CONTEXT_KEYS, } from '@programs/error-tracking-upload-source-maps/index'; -import { ScreenId, Overlay } from '@ui/tui/router'; +import { ScreenId, Overlay } from '@tui/router'; import { WizardCiDriver } from '@e2e-harness/wizard-ci-driver'; import { decideE2eAction, diff --git a/src/__tests__/architecture/known-violations.json b/src/__tests__/architecture/known-violations.json index 13cfc727c..61251ee16 100644 --- a/src/__tests__/architecture/known-violations.json +++ b/src/__tests__/architecture/known-violations.json @@ -3,48 +3,60 @@ "src/agent/runner/switchboard/flags/index.ts -> src/programs/types.ts", "src/agent/runner/switchboard/flags/schemes.ts -> src/programs/types.ts", "src/agent/runner/switchboard/index.ts -> src/programs/types.ts", + "src/cli/commands/audit.ts -> src/programs/audit/index.ts", + "src/cli/commands/basic-integration/ci-install.ts -> src/programs/posthog-integration/index.ts", + "src/cli/commands/basic-integration/index.ts -> src/commands/basic-integration/playground.ts", + "src/cli/commands/basic-integration/index.ts -> src/commands/provision.ts", + "src/cli/commands/basic-integration/interactive.ts -> src/programs/posthog-integration/index.ts", + "src/cli/commands/basic-integration/skill.ts -> src/programs/agent-skill/index.ts", + "src/cli/commands/dispatch-family.ts -> src/programs/audit/index.ts", + "src/cli/commands/dispatch-family.ts -> src/programs/audit/types.ts", + "src/cli/commands/dispatch-family.ts -> src/programs/program-registry.ts", + "src/cli/commands/dispatch-family.ts -> src/programs/program-step.ts", + "src/cli/commands/dispatch-family.ts -> src/programs/web-analytics-doctor/index.ts", + "src/cli/commands/factories/family-picker.ts -> pkg:ink", + "src/cli/commands/factories/family-picker.ts -> pkg:react", + "src/cli/commands/mcp/index.ts -> src/commands/mcp/add.ts", + "src/cli/commands/mcp/index.ts -> src/commands/mcp/remove.ts", + "src/cli/commands/self-driving.ts -> src/programs/self-driving/index.ts", + "src/cli/runners/index.ts -> src/lib/runners/run-non-interactive.ts", + "src/cli/runners/index.ts -> src/lib/runners/run-wizard.ts", + "src/cli/runners/run-wizard-ci.ts -> src/lib/runners/run-non-interactive.ts", + "src/cli/runners/run-wizard-headless.ts -> src/lib/runners/run-non-interactive.ts", "src/commands/ai-observability.ts -> src/programs/ai-observability/index.ts", - "src/commands/audit.ts -> src/programs/audit/index.ts", - "src/commands/basic-integration/ci-install.ts -> src/programs/posthog-integration/index.ts", - "src/commands/basic-integration/interactive.ts -> src/programs/posthog-integration/index.ts", - "src/commands/basic-integration/skill.ts -> src/programs/agent-skill/index.ts", "src/commands/doctor.ts -> src/programs/posthog-doctor/index.ts", "src/commands/error-tracking.ts -> src/programs/error-tracking/index.ts", - "src/commands/factories/family-command-factory.ts -> src/programs/dispatch-family.ts", - "src/commands/factories/family-picker.tsx -> src/commands/command.ts", "src/commands/mcp-analytics.ts -> src/programs/mcp-analytics/index.ts", "src/commands/metrics.ts -> src/programs/metrics/index.ts", "src/commands/migrate.ts -> src/programs/migration/index.ts", "src/commands/replay-vision.ts -> src/programs/replay-vision/index.ts", "src/commands/revenue.ts -> src/programs/revenue-analytics/index.ts", - "src/commands/self-driving.ts -> src/programs/self-driving/index.ts", "src/commands/upload-sourcemaps.ts -> src/programs/error-tracking-upload-source-maps/index.ts", "src/commands/warehouse.ts -> src/programs/warehouse-source/index.ts", - "src/env.ts -> src/lib/headless-mode.ts", + "src/env.ts -> src/shared/headless-mode.ts", "src/lib/runners/run-non-interactive.ts -> src/programs/audit/types.ts", "src/lib/runners/run-non-interactive.ts -> src/programs/detect-map.ts", "src/lib/runners/run-non-interactive.ts -> src/programs/run-agent-legacy.ts", + "src/lib/runners/run-non-interactive.ts -> src/programs/session/task-stream/task-stream-push.ts", + "src/lib/runners/run-non-interactive.ts -> src/programs/session/task-stream/wizard-run-sync.ts", "src/lib/runners/run-non-interactive.ts -> src/programs/task-stream/index.ts", - "src/lib/runners/run-non-interactive.ts -> src/programs/task-stream/task-stream-push.ts", - "src/lib/runners/run-non-interactive.ts -> src/programs/task-stream/wizard-run-sync.ts", "src/lib/runners/run-wizard.ts -> src/programs/audit/types.ts", "src/lib/runners/run-wizard.ts -> src/programs/authenticate.ts", - "src/lib/runners/run-wizard.ts -> src/programs/posthog-integration/detect.ts", + "src/lib/runners/run-wizard.ts -> src/programs/detection/integration.ts", "src/lib/runners/run-wizard.ts -> src/programs/run-agent-legacy.ts", - "src/lib/runners/run-wizard.ts -> src/programs/task-stream/destinations/file.ts", - "src/lib/runners/run-wizard.ts -> src/programs/task-stream/destinations/posthog.ts", + "src/lib/runners/run-wizard.ts -> src/programs/session/task-stream/destinations/file.ts", + "src/lib/runners/run-wizard.ts -> src/programs/session/task-stream/destinations/posthog.ts", + "src/lib/runners/run-wizard.ts -> src/programs/session/task-stream/task-stream-push.ts", + "src/lib/runners/run-wizard.ts -> src/programs/session/task-stream/wizard-run-sync.ts", "src/lib/runners/run-wizard.ts -> src/programs/task-stream/index.ts", - "src/lib/runners/run-wizard.ts -> src/programs/task-stream/task-stream-push.ts", - "src/lib/runners/run-wizard.ts -> src/programs/task-stream/wizard-run-sync.ts", "src/lib/wizard-session.ts -> src/agent/progress.ts", - "src/programs/agent-skill/index.ts -> src/ui/tui/decks/agent-skill/index.tsx", + "src/programs/agent-skill/index.ts -> src/tui/programs/shared/skill-deck.tsx", "src/programs/agent-skill/steps.ts -> src/lib/wizard-session.ts", - "src/programs/ai-observability/index.ts -> src/lib/headless-mode.ts", - "src/programs/ai-observability/index.ts -> src/ui/tui/decks/agent-skill/index.tsx", - "src/programs/ai-opt-in-gate.ts -> src/lib/wizard-session.ts", - "src/programs/audit/index.ts -> src/lib/headless-mode.ts", + "src/programs/agent-skill/steps.ts -> src/tui/programs/shared/health-check-step.ts", + "src/programs/ai-observability/index.ts -> src/tui/programs/shared/skill-deck.tsx", + "src/programs/audit/events/config.ts -> src/lib/wizard-session.ts", + "src/programs/audit/events/config.ts -> src/tui/programs/audit/events-flow.ts", "src/programs/audit/index.ts -> src/lib/wizard-session.ts", - "src/programs/audit/ledger-watcher.ts -> src/lib/file-watcher.ts", "src/programs/audit/ledger-watcher.ts -> src/ui/index.ts", "src/programs/audit/types.ts -> src/lib/wizard-session.ts", "src/programs/authenticate.ts -> src/lib/wizard-session.ts", @@ -53,20 +65,17 @@ "src/programs/detection/agentic.ts -> src/ui/agent-progress.ts", "src/programs/detection/agentic.ts -> src/ui/index.ts", "src/programs/detection/features.ts -> src/lib/wizard-session.ts", + "src/programs/detection/integration.ts -> src/lib/wizard-session.ts", "src/programs/detection/project-scope.ts -> src/lib/wizard-session.ts", - "src/programs/dispatch-family.ts -> src/commands/command.ts", - "src/programs/dispatch-family.ts -> src/commands/factories/shared.ts", "src/programs/error-tracking-upload-source-maps/detect-agentic.ts -> src/lib/wizard-session.ts", "src/programs/error-tracking-upload-source-maps/detect.ts -> src/lib/wizard-session.ts", "src/programs/error-tracking-upload-source-maps/index.ts -> src/lib/wizard-session.ts", - "src/programs/error-tracking-upload-source-maps/index.ts -> src/ui/tui/decks/error-tracking-upload-source-maps/index.tsx", - "src/programs/error-tracking-upload-source-maps/steps.ts -> src/lib/wizard-session.ts", + "src/programs/error-tracking-upload-source-maps/index.ts -> src/tui/programs/error-tracking-upload-source-maps/flow.ts", + "src/programs/error-tracking-upload-source-maps/index.ts -> src/tui/programs/shared/deck/source-maps.tsx", "src/programs/error-tracking/detect-agentic.ts -> src/lib/wizard-session.ts", "src/programs/error-tracking/index.ts -> src/lib/wizard-session.ts", - "src/programs/error-tracking/index.ts -> src/ui/tui/decks/error-tracking/index.tsx", - "src/programs/error-tracking/index.ts -> src/ui/tui/decks/error-tracking/tips.ts", - "src/programs/events-audit/index.ts -> src/lib/wizard-session.ts", - "src/programs/events-audit/steps.ts -> src/lib/wizard-session.ts", + "src/programs/error-tracking/index.ts -> src/tui/programs/error-tracking/deck/index.tsx", + "src/programs/error-tracking/index.ts -> src/tui/programs/error-tracking/deck/tips.ts", "src/programs/frameworks/astro/astro-wizard-agent.ts -> src/ui/index.ts", "src/programs/frameworks/django/utils.ts -> src/ui/index.ts", "src/programs/frameworks/fastapi/utils.ts -> src/ui/index.ts", @@ -78,49 +87,56 @@ "src/programs/frameworks/react-router/react-router-wizard-agent.ts -> src/ui/index.ts", "src/programs/frameworks/tanstack-router/tanstack-router-wizard-agent.ts -> src/ui/index.ts", "src/programs/mcp/index.ts -> src/lib/wizard-session.ts", - "src/programs/metrics/index.ts -> src/ui/tui/decks/agent-skill/index.tsx", - "src/programs/migration/index.ts -> src/ui/tui/decks/migration/index.tsx", - "src/programs/migration/steps.ts -> src/lib/wizard-session.ts", - "src/programs/posthog-integration/detect.ts -> src/lib/wizard-session.ts", + "src/programs/metrics/index.ts -> src/tui/programs/shared/skill-deck.tsx", + "src/programs/migration/index.ts -> src/tui/programs/migration/deck/index.tsx", + "src/programs/migration/index.ts -> src/tui/programs/migration/flow.ts", + "src/programs/posthog-doctor/index.ts -> src/tools/doctor/fetch.ts", + "src/programs/posthog-doctor/index.ts -> src/tools/doctor/kind-metadata.ts", + "src/programs/posthog-doctor/index.ts -> src/tools/doctor/types.ts", + "src/programs/posthog-doctor/steps.ts -> src/tui/programs/shared/health-check-step.ts", "src/programs/posthog-integration/index.ts -> src/lib/wizard-session.ts", "src/programs/posthog-integration/index.ts -> src/steps/index.ts", - "src/programs/posthog-integration/index.ts -> src/ui/tui/decks/posthog-integration/index.tsx", + "src/programs/posthog-integration/index.ts -> src/tui/programs/posthog-integration/deck/index.tsx", "src/programs/posthog-integration/steps.ts -> src/lib/wizard-session.ts", - "src/programs/program-registry.ts -> src/ui/tui/decks/agent-skill/index.tsx", + "src/programs/posthog-integration/steps.ts -> src/tui/programs/shared/health-check-step.ts", + "src/programs/posthog-integration/upload-environment-variables/providers/vercel.ts -> src/steps/upload-environment-variables/EnvironmentProvider.ts", + "src/programs/posthog-integration/upload-environment-variables/providers/vercel.ts -> src/ui/index.ts", + "src/programs/posthog-integration/upload-environment-variables/upload-step.ts -> src/lib/wizard-session.ts", + "src/programs/posthog-integration/upload-environment-variables/upload-step.ts -> src/steps/upload-environment-variables/EnvironmentProvider.ts", + "src/programs/posthog-integration/upload-environment-variables/upload-step.ts -> src/ui/index.ts", + "src/programs/program-registry.ts -> src/tui/programs/shared/skill-deck.tsx", "src/programs/program-run.ts -> src/lib/wizard-session.ts", "src/programs/program-step.ts -> src/lib/wizard-session.ts", - "src/programs/program-step.ts -> src/ui/tui/components/TipsCard.tsx", - "src/programs/program-step.ts -> src/ui/tui/primitives/index.ts", + "src/programs/program-step.ts -> src/tui/components/TipsCard.tsx", + "src/programs/program-step.ts -> src/tui/primitives/index.ts", "src/programs/program-step.ts -> src/ui/tui/store.ts", "src/programs/replay-vision/index.ts -> src/lib/wizard-session.ts", "src/programs/revenue-analytics/detect.ts -> src/lib/wizard-session.ts", - "src/programs/revenue-analytics/index.ts -> src/ui/tui/decks/revenue-analytics/index.tsx", + "src/programs/revenue-analytics/index.ts -> src/tui/programs/revenue-analytics/deck/index.tsx", "src/programs/revenue-analytics/steps.ts -> src/lib/wizard-session.ts", + "src/programs/revenue-analytics/steps.ts -> src/tui/programs/shared/health-check-step.ts", "src/programs/run-agent-legacy.ts -> src/lib/wizard-session.ts", "src/programs/run-agent-legacy.ts -> src/ui/agent-progress.ts", "src/programs/run-agent-legacy.ts -> src/ui/index.ts", "src/programs/self-driving/detect-agentic.ts -> src/lib/wizard-session.ts", "src/programs/self-driving/detect.ts -> src/lib/wizard-session.ts", "src/programs/self-driving/index.ts -> src/lib/wizard-session.ts", - "src/programs/self-driving/index.ts -> src/ui/tui/decks/self-driving/index.tsx", - "src/programs/self-driving/index.ts -> src/ui/tui/decks/self-driving/pricing.ts", - "src/programs/self-driving/index.ts -> src/ui/tui/decks/self-driving/tips.ts", - "src/programs/self-driving/steps.ts -> src/lib/wizard-session.ts", - "src/programs/shared/health-check-step.ts -> src/lib/wizard-session.ts", - "src/programs/shared/posthog-cli-preinstall.ts -> src/steps/install-cli-steering/index.ts", - "src/programs/task-stream/destinations/posthog.ts -> src/lib/wizard-session.ts", - "src/programs/task-stream/event-plan-watcher.ts -> src/lib/file-watcher.ts", - "src/programs/task-stream/event-plan-watcher.ts -> src/ui/tui/store.ts", - "src/programs/task-stream/task-stream-push.ts -> src/lib/wizard-session.ts", - "src/programs/task-stream/task-stream-push.ts -> src/ui/tui/store.ts", - "src/programs/task-stream/task-stream-push.ts -> src/ui/wizard-ui.ts", - "src/programs/task-stream/types.ts -> src/lib/wizard-session.ts", - "src/programs/task-stream/wizard-run-sync.ts -> src/lib/wizard-session.ts", + "src/programs/self-driving/index.ts -> src/tui/programs/self-driving/deck/index.tsx", + "src/programs/self-driving/index.ts -> src/tui/programs/self-driving/deck/tips.ts", + "src/programs/self-driving/index.ts -> src/tui/programs/self-driving/flow.ts", + "src/programs/session/task-stream/destinations/posthog.ts -> src/lib/wizard-session.ts", + "src/programs/session/task-stream/event-plan-watcher.ts -> src/ui/tui/store.ts", + "src/programs/session/task-stream/task-stream-push.ts -> src/lib/wizard-session.ts", + "src/programs/session/task-stream/task-stream-push.ts -> src/ui/tui/store.ts", + "src/programs/session/task-stream/task-stream-push.ts -> src/ui/wizard-ui.ts", + "src/programs/session/task-stream/types.ts -> src/lib/wizard-session.ts", + "src/programs/session/task-stream/wizard-run-sync.ts -> src/lib/wizard-session.ts", "src/programs/warehouse-source/detect.ts -> src/lib/wizard-session.ts", "src/programs/warehouse-source/index.ts -> src/lib/wizard-session.ts", - "src/programs/warehouse-source/index.ts -> src/ui/tui/decks/warehouse-source/index.tsx", + "src/programs/warehouse-source/index.ts -> src/tui/programs/warehouse-source/deck/index.tsx", "src/programs/warehouse-source/steps.ts -> src/lib/wizard-session.ts", "src/programs/web-analytics-doctor/detect.ts -> src/lib/wizard-session.ts", + "src/shared/errors/index.ts -> src/agent/runner/shared/skill-error-code.ts", "src/shared/utils/analytics.ts -> src/lib/wizard-session.ts", "src/shared/utils/oauth.ts -> src/ui/index.ts", "src/shared/utils/setup-utils.ts -> src/lib/wizard-session.ts", @@ -130,42 +146,371 @@ "src/shared/utils/wizard-abort.ts -> src/lib/wizard-session.ts", "src/shared/utils/wizard-abort.ts -> src/ui/index.ts", "src/shared/utils/wizard-abort.ts -> src/ui/logging-ui.ts", + "src/steps/index.ts -> src/programs/posthog-integration/upload-environment-variables/upload-step.ts", + "src/tui/App.tsx -> pkg:react", + "src/tui/App.tsx -> src/ui/tui/screen-registry.tsx", + "src/tui/App.tsx -> src/ui/tui/store.ts", + "src/tui/ai-opt-in-gate.ts -> src/programs/program-step.ts", + "src/tui/components/LearnCard.tsx -> pkg:ink", + "src/tui/components/LearnCard.tsx -> src/ui/tui/store.ts", + "src/tui/components/PhaseVisuals.tsx -> pkg:ink", + "src/tui/components/PhaseVisuals.tsx -> pkg:react", + "src/tui/components/PhaseVisuals.tsx -> src/ui/tui/store.ts", + "src/tui/components/PrivacyPanel.tsx -> pkg:ink", + "src/tui/components/PrivacyPanel.tsx -> pkg:react", + "src/tui/components/ServiceHealthList.tsx -> pkg:ink", + "src/tui/components/StatusPeekTrigger.tsx -> pkg:ink", + "src/tui/components/StatusPeekTrigger.tsx -> pkg:react", + "src/tui/components/StatusPeekTrigger.tsx -> src/ui/tui/store.ts", + "src/tui/components/TipsCard.tsx -> pkg:ink", + "src/tui/components/TipsCard.tsx -> src/ui/tui/store.ts", + "src/tui/components/TitleBar.tsx -> pkg:ink", + "src/tui/components/TokenCostHud.tsx -> pkg:ink", + "src/tui/components/TokenCostHud.tsx -> src/ui/tui/store.ts", + "src/tui/components/visualizer/CrateStack.tsx -> pkg:ink", + "src/tui/components/visualizer/CrateStack.tsx -> pkg:react", + "src/tui/components/visualizer/DashboardGrid.tsx -> pkg:ink", + "src/tui/components/visualizer/DiffCascade.tsx -> pkg:ink", + "src/tui/components/visualizer/DiffCascade.tsx -> pkg:react", + "src/tui/components/visualizer/LibraryShelf.tsx -> pkg:ink", + "src/tui/components/visualizer/MatrixRain.tsx -> pkg:ink", + "src/tui/components/visualizer/MatrixRain.tsx -> pkg:react", + "src/tui/components/visualizer/Tumblers.tsx -> pkg:ink", + "src/tui/components/visualizer/Tumblers.tsx -> pkg:react", + "src/tui/components/visualizer/panel.tsx -> pkg:ink", + "src/tui/components/visualizer/panel.tsx -> pkg:react", + "src/tui/exit-line.ts -> src/ui/tui/store.ts", + "src/tui/hooks/file-watcher.ts -> pkg:react", + "src/tui/hooks/useDismissOnAnyKey.ts -> pkg:ink", + "src/tui/hooks/useKeyBindings.ts -> pkg:ink", + "src/tui/hooks/useKeyBindings.ts -> pkg:react", + "src/tui/hooks/useKeyboardHints.tsx -> pkg:react", + "src/tui/hooks/useStdoutDimensions.ts -> pkg:ink", + "src/tui/hooks/useStdoutDimensions.ts -> pkg:react", + "src/tui/hooks/useTick.ts -> pkg:react", + "src/tui/playground/PlaygroundApp.tsx -> src/ui/tui/store.ts", + "src/tui/playground/demos/AiOptInDemo.tsx -> pkg:ink", + "src/tui/playground/demos/AiOptInDemo.tsx -> pkg:react", + "src/tui/playground/demos/AiOptInDemo.tsx -> src/ui/tui/store.ts", + "src/tui/playground/demos/AskModalDemo.tsx -> pkg:ink", + "src/tui/playground/demos/AskModalDemo.tsx -> pkg:react", + "src/tui/playground/demos/AuditChecksDemo.tsx -> pkg:ink", + "src/tui/playground/demos/AuditChecksDemo.tsx -> src/programs/audit/types.ts", + "src/tui/playground/demos/DoctorReportDemo.tsx -> pkg:ink", + "src/tui/playground/demos/DoctorReportDemo.tsx -> src/programs/posthog-doctor/index.ts", + "src/tui/playground/demos/EndScreensDemo.tsx -> pkg:ink", + "src/tui/playground/demos/EndScreensDemo.tsx -> pkg:react", + "src/tui/playground/demos/EndScreensDemo.tsx -> src/ui/tui/store.ts", + "src/tui/playground/demos/HealthCheckDemo.tsx -> pkg:ink", + "src/tui/playground/demos/HealthCheckDemo.tsx -> pkg:react", + "src/tui/playground/demos/InputDemo.tsx -> pkg:ink", + "src/tui/playground/demos/InputDemo.tsx -> pkg:react", + "src/tui/playground/demos/KeyboardHintsDemo.tsx -> pkg:ink", + "src/tui/playground/demos/KeyboardHintsDemo.tsx -> pkg:react", + "src/tui/playground/demos/LayoutDemo.tsx -> pkg:ink", + "src/tui/playground/demos/LayoutDemo.tsx -> pkg:react", + "src/tui/playground/demos/LearnDeckDemo.tsx -> pkg:ink", + "src/tui/playground/demos/LearnDeckDemo.tsx -> pkg:react", + "src/tui/playground/demos/LearnDeckDemo.tsx -> src/ui/tui/store.ts", + "src/tui/playground/demos/LogDemo.tsx -> pkg:ink", + "src/tui/playground/demos/LogDemo.tsx -> pkg:react", + "src/tui/playground/demos/McpDemo.tsx -> src/ui/tui/store.ts", + "src/tui/playground/demos/McpSuggestedPromptsDemo.tsx -> pkg:ink", + "src/tui/playground/demos/McpSuggestedPromptsDemo.tsx -> pkg:react", + "src/tui/playground/demos/McpSuggestedPromptsDemo.tsx -> src/ui/tui/store.ts", + "src/tui/playground/demos/ModalDemo.tsx -> pkg:ink", + "src/tui/playground/demos/ProgressDemo.tsx -> pkg:ink", + "src/tui/playground/demos/ProgressDemo.tsx -> pkg:react", + "src/tui/playground/demos/RunScreenDemo.tsx -> pkg:ink", + "src/tui/playground/demos/RunScreenDemo.tsx -> pkg:react", + "src/tui/playground/demos/RunScreenDemo.tsx -> src/ui/tui/store.ts", + "src/tui/playground/demos/ViewportGuardDemo.tsx -> pkg:ink", + "src/tui/playground/demos/WelcomeDemo.tsx -> pkg:ink", + "src/tui/playground/demos/WelcomeDemo.tsx -> src/ui/tui/store.ts", + "src/tui/playground/start-playground.ts -> pkg:ink", + "src/tui/playground/start-playground.ts -> pkg:react", + "src/tui/playground/start-playground.ts -> src/ui/tui/store.ts", + "src/tui/primitives/CardLayout.tsx -> pkg:ink", + "src/tui/primitives/CardLayout.tsx -> pkg:react", + "src/tui/primitives/ConfirmButton.tsx -> pkg:ink", + "src/tui/primitives/ConfirmationInput.tsx -> pkg:ink", + "src/tui/primitives/ConfirmationInput.tsx -> pkg:react", + "src/tui/primitives/ContentSequencer.tsx -> pkg:ink", + "src/tui/primitives/ContentSequencer.tsx -> pkg:react", + "src/tui/primitives/DissolveTransition.tsx -> pkg:ink", + "src/tui/primitives/DissolveTransition.tsx -> pkg:react", + "src/tui/primitives/Divider.tsx -> pkg:ink", + "src/tui/primitives/Divider.tsx -> pkg:react", + "src/tui/primitives/EventPlanViewer.tsx -> pkg:ink", + "src/tui/primitives/EventPlanViewer.tsx -> src/ui/tui/store.ts", + "src/tui/primitives/GroupedPickerMenu.tsx -> pkg:ink", + "src/tui/primitives/GroupedPickerMenu.tsx -> pkg:react", + "src/tui/primitives/HNViewer.tsx -> pkg:ink", + "src/tui/primitives/HNViewer.tsx -> pkg:react", + "src/tui/primitives/KeyboardHintsBar.tsx -> pkg:ink", + "src/tui/primitives/LinesBlock.tsx -> pkg:ink", + "src/tui/primitives/LinesBlock.tsx -> pkg:react", + "src/tui/primitives/LinkText.tsx -> pkg:ink", + "src/tui/primitives/LoadingBox.tsx -> pkg:@inkjs/ui", + "src/tui/primitives/LoadingBox.tsx -> pkg:ink", + "src/tui/primitives/LogViewer.tsx -> pkg:ink", + "src/tui/primitives/LogViewer.tsx -> pkg:react", + "src/tui/primitives/ModalOverlay.tsx -> pkg:ink", + "src/tui/primitives/ModalOverlay.tsx -> pkg:react", + "src/tui/primitives/NodeBlock.tsx -> pkg:ink", + "src/tui/primitives/NodeBlock.tsx -> pkg:react", + "src/tui/primitives/PickerMenu.tsx -> pkg:ink", + "src/tui/primitives/PickerMenu.tsx -> pkg:react", + "src/tui/primitives/ProgressList.tsx -> pkg:@inkjs/ui", + "src/tui/primitives/ProgressList.tsx -> pkg:ink", + "src/tui/primitives/PromptLabel.tsx -> pkg:ink", + "src/tui/primitives/ScreenContainer.tsx -> pkg:ink", + "src/tui/primitives/ScreenContainer.tsx -> pkg:react", + "src/tui/primitives/ScreenContainer.tsx -> src/ui/tui/store.ts", + "src/tui/primitives/ScreenErrorBoundary.tsx -> pkg:ink", + "src/tui/primitives/ScreenErrorBoundary.tsx -> pkg:react", + "src/tui/primitives/ScreenErrorBoundary.tsx -> src/ui/tui/store.ts", + "src/tui/primitives/SplitView.tsx -> pkg:ink", + "src/tui/primitives/SplitView.tsx -> pkg:react", + "src/tui/primitives/TabContainer.tsx -> pkg:ink", + "src/tui/primitives/TabContainer.tsx -> pkg:react", + "src/tui/primitives/TabContainer.tsx -> src/ui/tui/store.ts", + "src/tui/primitives/TextBlock.tsx -> pkg:ink", + "src/tui/primitives/TextBlock.tsx -> pkg:react", + "src/tui/primitives/ViewportTooSmall.tsx -> pkg:ink", + "src/tui/primitives/content-types.ts -> pkg:react", + "src/tui/programs/ai-observability/screens/AiObservabilityIntroScreen.tsx -> pkg:ink", + "src/tui/programs/ai-observability/screens/AiObservabilityIntroScreen.tsx -> pkg:react", + "src/tui/programs/ai-observability/screens/AiObservabilityIntroScreen.tsx -> src/ui/tui/store.ts", + "src/tui/programs/audit/events-flow.ts -> src/programs/program-step.ts", + "src/tui/programs/audit/screens/AuditAreaPane.tsx -> pkg:ink", + "src/tui/programs/audit/screens/AuditAreaPane.tsx -> pkg:react", + "src/tui/programs/audit/screens/AuditAreaPane.tsx -> src/programs/audit/types.ts", + "src/tui/programs/audit/screens/AuditChecksOutroSection.tsx -> pkg:ink", + "src/tui/programs/audit/screens/AuditChecksOutroSection.tsx -> src/programs/audit/types.ts", + "src/tui/programs/audit/screens/AuditChecksViewer/AreaHeaderRow.tsx -> pkg:ink", + "src/tui/programs/audit/screens/AuditChecksViewer/AuditChecksViewer.tsx -> pkg:ink", + "src/tui/programs/audit/screens/AuditChecksViewer/AuditChecksViewer.tsx -> pkg:react", + "src/tui/programs/audit/screens/AuditChecksViewer/AuditChecksViewer.tsx -> src/programs/audit/types.ts", + "src/tui/programs/audit/screens/AuditChecksViewer/CheckRow.tsx -> pkg:ink", + "src/tui/programs/audit/screens/AuditChecksViewer/CheckRow.tsx -> src/programs/audit/types.ts", + "src/tui/programs/audit/screens/AuditChecksViewer/DetailRow.tsx -> pkg:ink", + "src/tui/programs/audit/screens/AuditChecksViewer/DetailRow.tsx -> src/programs/audit/types.ts", + "src/tui/programs/audit/screens/AuditChecksViewer/Footer.tsx -> src/programs/audit/types.ts", + "src/tui/programs/audit/screens/AuditChecksViewer/Header.tsx -> pkg:ink", + "src/tui/programs/audit/screens/AuditChecksViewer/Header.tsx -> src/programs/audit/types.ts", + "src/tui/programs/audit/screens/AuditChecksViewer/Legend.tsx -> pkg:ink", + "src/tui/programs/audit/screens/AuditChecksViewer/sort.ts -> src/programs/audit/types.ts", + "src/tui/programs/audit/screens/AuditIntroScreen.tsx -> pkg:ink", + "src/tui/programs/audit/screens/AuditIntroScreen.tsx -> pkg:react", + "src/tui/programs/audit/screens/AuditIntroScreen.tsx -> src/ui/tui/store.ts", + "src/tui/programs/audit/screens/AuditOutroScreen.tsx -> pkg:ink", + "src/tui/programs/audit/screens/AuditOutroScreen.tsx -> pkg:react", + "src/tui/programs/audit/screens/AuditOutroScreen.tsx -> src/programs/audit/types.ts", + "src/tui/programs/audit/screens/AuditOutroScreen.tsx -> src/ui/tui/store.ts", + "src/tui/programs/audit/screens/AuditRunScreen.tsx -> pkg:ink", + "src/tui/programs/audit/screens/AuditRunScreen.tsx -> pkg:react", + "src/tui/programs/audit/screens/AuditRunScreen.tsx -> src/programs/audit/types.ts", + "src/tui/programs/audit/screens/AuditRunScreen.tsx -> src/ui/tui/store.ts", + "src/tui/programs/audit/screens/PendingChecksList.tsx -> pkg:@inkjs/ui", + "src/tui/programs/audit/screens/PendingChecksList.tsx -> pkg:ink", + "src/tui/programs/audit/screens/PendingChecksList.tsx -> src/programs/audit/types.ts", + "src/tui/programs/audit/screens/slides/eventCapture.tsx -> pkg:ink", + "src/tui/programs/audit/screens/slides/events-audit/createDashboard.tsx -> pkg:ink", + "src/tui/programs/audit/screens/slides/events-audit/detectSdk.tsx -> pkg:ink", + "src/tui/programs/audit/screens/slides/events-audit/enrichSites.tsx -> pkg:ink", + "src/tui/programs/audit/screens/slides/events-audit/queryVolume.tsx -> pkg:ink", + "src/tui/programs/audit/screens/slides/events-audit/scanSites.tsx -> pkg:ink", + "src/tui/programs/audit/screens/slides/events-audit/uploadNotebook.tsx -> pkg:ink", + "src/tui/programs/audit/screens/slides/events-audit/writeReport.tsx -> pkg:ink", + "src/tui/programs/audit/screens/slides/identification.tsx -> pkg:ink", + "src/tui/programs/audit/screens/slides/installation.tsx -> pkg:ink", + "src/tui/programs/audit/screens/slides/liveData.tsx -> pkg:ink", + "src/tui/programs/audit/screens/slides/shared.tsx -> pkg:ink", + "src/tui/programs/audit/screens/slides/shared.tsx -> pkg:react", + "src/tui/programs/audit/screens/slides/uploadNotebook.tsx -> pkg:ink", + "src/tui/programs/audit/screens/slides/writeReport.tsx -> pkg:ink", + "src/tui/programs/error-tracking-upload-source-maps/flow.ts -> src/programs/error-tracking-upload-source-maps/detect.ts", + "src/tui/programs/error-tracking-upload-source-maps/flow.ts -> src/programs/program-step.ts", + "src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsDetectScreen.tsx -> pkg:ink", + "src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsDetectScreen.tsx -> pkg:react", + "src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsDetectScreen.tsx -> src/programs/error-tracking-upload-source-maps/detect-agentic.ts", + "src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsDetectScreen.tsx -> src/programs/error-tracking-upload-source-maps/index.ts", + "src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsDetectScreen.tsx -> src/ui/tui/store.ts", + "src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsIntroScreen.tsx -> pkg:ink", + "src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsIntroScreen.tsx -> pkg:react", + "src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsIntroScreen.tsx -> src/ui/tui/store.ts", + "src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsOutroScreen.tsx -> pkg:ink", + "src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsOutroScreen.tsx -> pkg:react", + "src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsOutroScreen.tsx -> src/ui/tui/store.ts", + "src/tui/programs/error-tracking/deck/index.tsx -> src/ui/tui/store.ts", + "src/tui/programs/error-tracking/deck/tips.ts -> src/programs/replay-vision/index.ts", + "src/tui/programs/error-tracking/screens/ErrorTrackingDetectScreen.tsx -> pkg:ink", + "src/tui/programs/error-tracking/screens/ErrorTrackingDetectScreen.tsx -> pkg:react", + "src/tui/programs/error-tracking/screens/ErrorTrackingDetectScreen.tsx -> src/programs/error-tracking/detect-agentic.ts", + "src/tui/programs/error-tracking/screens/ErrorTrackingDetectScreen.tsx -> src/programs/frameworks/registry.ts", + "src/tui/programs/error-tracking/screens/ErrorTrackingDetectScreen.tsx -> src/ui/tui/store.ts", + "src/tui/programs/error-tracking/screens/ErrorTrackingIntroScreen.tsx -> pkg:ink", + "src/tui/programs/error-tracking/screens/ErrorTrackingIntroScreen.tsx -> pkg:react", + "src/tui/programs/error-tracking/screens/ErrorTrackingIntroScreen.tsx -> src/ui/tui/store.ts", + "src/tui/programs/metrics/screens/MetricsIntroScreen.tsx -> pkg:ink", + "src/tui/programs/metrics/screens/MetricsIntroScreen.tsx -> pkg:react", + "src/tui/programs/metrics/screens/MetricsIntroScreen.tsx -> src/ui/tui/store.ts", + "src/tui/programs/migration/deck/free-tier.tsx -> pkg:ink", + "src/tui/programs/migration/deck/index.tsx -> pkg:ink", + "src/tui/programs/migration/deck/index.tsx -> src/ui/tui/store.ts", + "src/tui/programs/migration/deck/pricing-structure.tsx -> pkg:ink", + "src/tui/programs/migration/deck/vendor-stack.tsx -> pkg:ink", + "src/tui/programs/migration/flow.ts -> src/programs/program-step.ts", + "src/tui/programs/migration/screens/MigrationIntroScreen.tsx -> pkg:ink", + "src/tui/programs/migration/screens/MigrationIntroScreen.tsx -> pkg:react", + "src/tui/programs/migration/screens/MigrationIntroScreen.tsx -> src/ui/tui/store.ts", + "src/tui/programs/posthog-integration/deck/data-flow.tsx -> pkg:ink", + "src/tui/programs/posthog-integration/deck/index.tsx -> pkg:ink", + "src/tui/programs/posthog-integration/deck/index.tsx -> src/ui/tui/store.ts", + "src/tui/programs/posthog-integration/screens/PostHogIntegrationIntroScreen.tsx -> pkg:ink", + "src/tui/programs/posthog-integration/screens/PostHogIntegrationIntroScreen.tsx -> pkg:react", + "src/tui/programs/posthog-integration/screens/PostHogIntegrationIntroScreen.tsx -> src/programs/frameworks/registry.ts", + "src/tui/programs/posthog-integration/screens/PostHogIntegrationIntroScreen.tsx -> src/ui/tui/store.ts", + "src/tui/programs/revenue-analytics/screens/RevenueIntroScreen.tsx -> pkg:ink", + "src/tui/programs/revenue-analytics/screens/RevenueIntroScreen.tsx -> pkg:react", + "src/tui/programs/revenue-analytics/screens/RevenueIntroScreen.tsx -> src/programs/revenue-analytics/index.ts", + "src/tui/programs/revenue-analytics/screens/RevenueIntroScreen.tsx -> src/ui/tui/store.ts", + "src/tui/programs/self-driving/deck/index.tsx -> pkg:ink", + "src/tui/programs/self-driving/deck/index.tsx -> src/programs/self-driving/pricing.ts", + "src/tui/programs/self-driving/deck/index.tsx -> src/ui/tui/store.ts", + "src/tui/programs/self-driving/deck/pipeline-diagram.tsx -> pkg:ink", + "src/tui/programs/self-driving/deck/tips.ts -> src/programs/self-driving/pricing.ts", + "src/tui/programs/self-driving/flow.ts -> src/programs/detection/agentic.ts", + "src/tui/programs/self-driving/flow.ts -> src/programs/posthog-integration/index.ts", + "src/tui/programs/self-driving/flow.ts -> src/programs/program-step.ts", + "src/tui/programs/self-driving/flow.ts -> src/programs/self-driving/detect-agentic.ts", + "src/tui/programs/self-driving/flow.ts -> src/programs/self-driving/detect.ts", + "src/tui/programs/self-driving/hooks/useGithubConnection.ts -> pkg:react", + "src/tui/programs/self-driving/hooks/useGithubConnection.ts -> src/ui/tui/store.ts", + "src/tui/programs/self-driving/screens/SelfDrivingGitHubScreen.tsx -> pkg:ink", + "src/tui/programs/self-driving/screens/SelfDrivingGitHubScreen.tsx -> pkg:react", + "src/tui/programs/self-driving/screens/SelfDrivingGitHubScreen.tsx -> src/programs/self-driving/detect.ts", + "src/tui/programs/self-driving/screens/SelfDrivingGitHubScreen.tsx -> src/ui/tui/store.ts", + "src/tui/programs/self-driving/screens/SelfDrivingHandoffScreen.tsx -> pkg:ink", + "src/tui/programs/self-driving/screens/SelfDrivingHandoffScreen.tsx -> pkg:react", + "src/tui/programs/self-driving/screens/SelfDrivingHandoffScreen.tsx -> src/programs/posthog-integration/index.ts", + "src/tui/programs/self-driving/screens/SelfDrivingHandoffScreen.tsx -> src/programs/self-driving/detect.ts", + "src/tui/programs/self-driving/screens/SelfDrivingHandoffScreen.tsx -> src/ui/tui/store.ts", + "src/tui/programs/self-driving/screens/SelfDrivingIntegrationCheckScreen.tsx -> pkg:@inkjs/ui", + "src/tui/programs/self-driving/screens/SelfDrivingIntegrationCheckScreen.tsx -> pkg:ink", + "src/tui/programs/self-driving/screens/SelfDrivingIntegrationCheckScreen.tsx -> pkg:react", + "src/tui/programs/self-driving/screens/SelfDrivingIntegrationCheckScreen.tsx -> src/ui/tui/store.ts", + "src/tui/programs/self-driving/screens/SelfDrivingIntegrationDetectScreen.tsx -> pkg:ink", + "src/tui/programs/self-driving/screens/SelfDrivingIntegrationDetectScreen.tsx -> pkg:react", + "src/tui/programs/self-driving/screens/SelfDrivingIntegrationDetectScreen.tsx -> src/programs/frameworks/registry.ts", + "src/tui/programs/self-driving/screens/SelfDrivingIntegrationDetectScreen.tsx -> src/programs/self-driving/detect-agentic.ts", + "src/tui/programs/self-driving/screens/SelfDrivingIntegrationDetectScreen.tsx -> src/programs/self-driving/detect.ts", + "src/tui/programs/self-driving/screens/SelfDrivingIntegrationDetectScreen.tsx -> src/ui/tui/store.ts", + "src/tui/programs/self-driving/screens/SelfDrivingIntroScreen.tsx -> pkg:ink", + "src/tui/programs/self-driving/screens/SelfDrivingIntroScreen.tsx -> pkg:react", + "src/tui/programs/self-driving/screens/SelfDrivingIntroScreen.tsx -> src/programs/self-driving/index.ts", + "src/tui/programs/self-driving/screens/SelfDrivingIntroScreen.tsx -> src/programs/self-driving/pricing.ts", + "src/tui/programs/self-driving/screens/SelfDrivingIntroScreen.tsx -> src/ui/tui/store.ts", + "src/tui/programs/shared/deck/funnel.tsx -> pkg:ink", + "src/tui/programs/shared/deck/line-chart.tsx -> pkg:ink", + "src/tui/programs/shared/deck/product-suite.tsx -> pkg:ink", + "src/tui/programs/shared/deck/source-maps.tsx -> pkg:ink", + "src/tui/programs/shared/deck/source-maps.tsx -> src/ui/tui/store.ts", + "src/tui/programs/shared/health-check-step.ts -> src/programs/program-step.ts", + "src/tui/programs/shared/screens/AgentSkillIntroScreen.tsx -> pkg:ink", + "src/tui/programs/shared/screens/AgentSkillIntroScreen.tsx -> pkg:react", + "src/tui/programs/shared/screens/AgentSkillIntroScreen.tsx -> src/ui/tui/store.ts", + "src/tui/programs/shared/skill-deck.tsx -> pkg:ink", + "src/tui/programs/shared/skill-deck.tsx -> src/ui/tui/store.ts", + "src/tui/programs/warehouse-source/screens/WarehouseIntroScreen.tsx -> pkg:ink", + "src/tui/programs/warehouse-source/screens/WarehouseIntroScreen.tsx -> pkg:react", + "src/tui/programs/warehouse-source/screens/WarehouseIntroScreen.tsx -> src/programs/warehouse-source/index.ts", + "src/tui/programs/warehouse-source/screens/WarehouseIntroScreen.tsx -> src/ui/tui/store.ts", + "src/tui/router.ts -> src/ui/tui/screen-sequences.ts", + "src/tui/screens/AiOptInRequiredScreen.tsx -> pkg:ink", + "src/tui/screens/AiOptInRequiredScreen.tsx -> pkg:react", + "src/tui/screens/AiOptInRequiredScreen.tsx -> src/ui/tui/store.ts", + "src/tui/screens/AuthErrorScreen.tsx -> pkg:ink", + "src/tui/screens/AuthErrorScreen.tsx -> pkg:react", + "src/tui/screens/AuthErrorScreen.tsx -> src/ui/tui/store.ts", + "src/tui/screens/AuthScreen.tsx -> pkg:ink", + "src/tui/screens/AuthScreen.tsx -> pkg:react", + "src/tui/screens/AuthScreen.tsx -> src/ui/tui/store.ts", + "src/tui/screens/ExitScreen.tsx -> pkg:react", + "src/tui/screens/ExitScreen.tsx -> src/ui/tui/store.ts", + "src/tui/screens/IntroScreenLayout.tsx -> pkg:ink", + "src/tui/screens/IntroScreenLayout.tsx -> pkg:react", + "src/tui/screens/KeepSkillsScreen.tsx -> pkg:ink", + "src/tui/screens/KeepSkillsScreen.tsx -> pkg:react", + "src/tui/screens/KeepSkillsScreen.tsx -> src/ui/tui/store.ts", + "src/tui/screens/ManagedSettingsScreen.tsx -> pkg:ink", + "src/tui/screens/ManagedSettingsScreen.tsx -> pkg:react", + "src/tui/screens/ManagedSettingsScreen.tsx -> src/ui/tui/store.ts", + "src/tui/screens/ManualAuthCodeScreen.tsx -> pkg:@inkjs/ui", + "src/tui/screens/ManualAuthCodeScreen.tsx -> pkg:ink", + "src/tui/screens/ManualAuthCodeScreen.tsx -> pkg:react", + "src/tui/screens/ManualAuthCodeScreen.tsx -> src/ui/tui/store.ts", + "src/tui/screens/McpScreen.tsx -> pkg:@inkjs/ui", + "src/tui/screens/McpScreen.tsx -> pkg:ink", + "src/tui/screens/McpScreen.tsx -> pkg:react", + "src/tui/screens/McpScreen.tsx -> src/ui/tui/store.ts", + "src/tui/screens/MintFailureScreen.tsx -> pkg:ink", + "src/tui/screens/MintFailureScreen.tsx -> pkg:react", + "src/tui/screens/MintFailureScreen.tsx -> src/ui/tui/store.ts", + "src/tui/screens/OutroScreen.tsx -> pkg:ink", + "src/tui/screens/OutroScreen.tsx -> pkg:react", + "src/tui/screens/OutroScreen.tsx -> src/ui/tui/store.ts", + "src/tui/screens/PortConflictScreen.tsx -> pkg:ink", + "src/tui/screens/PortConflictScreen.tsx -> pkg:react", + "src/tui/screens/PortConflictScreen.tsx -> src/ui/tui/store.ts", + "src/tui/screens/RunScreen.tsx -> pkg:ink", + "src/tui/screens/RunScreen.tsx -> pkg:react", + "src/tui/screens/RunScreen.tsx -> src/ui/tui/store.ts", + "src/tui/screens/SessionTimeoutScreen.tsx -> pkg:ink", + "src/tui/screens/SessionTimeoutScreen.tsx -> pkg:react", + "src/tui/screens/SessionTimeoutScreen.tsx -> src/ui/tui/store.ts", + "src/tui/screens/SettingsOverrideScreen.tsx -> pkg:ink", + "src/tui/screens/SettingsOverrideScreen.tsx -> pkg:react", + "src/tui/screens/SettingsOverrideScreen.tsx -> src/ui/tui/store.ts", + "src/tui/screens/SetupScreen.tsx -> pkg:ink", + "src/tui/screens/SetupScreen.tsx -> pkg:react", + "src/tui/screens/SetupScreen.tsx -> src/ui/tui/store.ts", + "src/tui/screens/SkillSourceInfo.tsx -> pkg:ink", + "src/tui/screens/SkillSourceInfo.tsx -> pkg:react", + "src/tui/screens/SlackConnectScreen.tsx -> pkg:ink", + "src/tui/screens/SlackConnectScreen.tsx -> pkg:react", + "src/tui/screens/SlackConnectScreen.tsx -> src/ui/tui/store.ts", + "src/tui/screens/TaskNoticeScreen.tsx -> pkg:ink", + "src/tui/screens/TaskNoticeScreen.tsx -> pkg:react", + "src/tui/screens/TaskNoticeScreen.tsx -> src/ui/tui/store.ts", + "src/tui/screens/WizardAskScreen.tsx -> pkg:@inkjs/ui", + "src/tui/screens/WizardAskScreen.tsx -> pkg:ink", + "src/tui/screens/WizardAskScreen.tsx -> pkg:react", + "src/tui/screens/WizardAskScreen.tsx -> src/ui/tui/store.ts", + "src/tui/screens/health/HealthCheckScreen.tsx -> pkg:ink", + "src/tui/screens/health/HealthCheckScreen.tsx -> pkg:react", + "src/tui/screens/health/HealthCheckScreen.tsx -> src/ui/tui/store.ts", + "src/tui/start-tui.ts -> pkg:ink", + "src/tui/start-tui.ts -> pkg:react", + "src/tui/start-tui.ts -> src/ui/tui/ink-ui.ts", + "src/tui/start-tui.ts -> src/ui/tui/store.ts", + "src/tui/tools/doctor/screens/DoctorIntroScreen.tsx -> pkg:ink", + "src/tui/tools/doctor/screens/DoctorIntroScreen.tsx -> pkg:react", + "src/tui/tools/doctor/screens/DoctorIntroScreen.tsx -> src/ui/tui/store.ts", + "src/tui/tools/doctor/screens/DoctorReportScreen.tsx -> pkg:ink", + "src/tui/tools/doctor/screens/DoctorReportScreen.tsx -> pkg:react", + "src/tui/tools/doctor/screens/DoctorReportScreen.tsx -> src/programs/posthog-doctor/index.ts", + "src/tui/tools/doctor/screens/DoctorReportScreen.tsx -> src/ui/tui/store.ts", + "src/tui/tools/doctor/screens/IssueTable.tsx -> pkg:ink", + "src/tui/tools/doctor/screens/IssueTable.tsx -> src/programs/posthog-doctor/index.ts", + "src/tui/tools/mcp/screens/McpSuggestedPromptsScreen.tsx -> pkg:@inkjs/ui", + "src/tui/tools/mcp/screens/McpSuggestedPromptsScreen.tsx -> pkg:ink", + "src/tui/tools/mcp/screens/McpSuggestedPromptsScreen.tsx -> pkg:react", + "src/tui/tools/mcp/screens/McpSuggestedPromptsScreen.tsx -> src/ui/tui/store.ts", + "src/tui/tools/mcp/services/suggested-prompts.ts -> src/ui/tui/store.ts", "src/ui/headless-ui.ts -> src/ui/tui/store.ts", - "src/ui/tui/decks/error-tracking/tips.ts -> src/programs/replay-vision/index.ts", - "src/ui/tui/playground/demos/AuditChecksDemo.tsx -> src/programs/audit/types.ts", - "src/ui/tui/playground/demos/DoctorReportDemo.tsx -> src/programs/posthog-doctor/index.ts", - "src/ui/tui/screen-sequences.ts -> src/programs/ai-opt-in-gate.ts", "src/ui/tui/screen-sequences.ts -> src/programs/program-step.ts", - "src/ui/tui/screens/ErrorTrackingDetectScreen.tsx -> src/programs/error-tracking/detect-agentic.ts", - "src/ui/tui/screens/ErrorTrackingDetectScreen.tsx -> src/programs/frameworks/registry.ts", - "src/ui/tui/screens/PostHogIntegrationIntroScreen.tsx -> src/programs/frameworks/registry.ts", - "src/ui/tui/screens/RevenueIntroScreen.tsx -> src/programs/revenue-analytics/index.ts", - "src/ui/tui/screens/SelfDrivingGitHubScreen.tsx -> src/programs/self-driving/detect.ts", - "src/ui/tui/screens/SelfDrivingHandoffScreen.tsx -> src/programs/posthog-integration/index.ts", - "src/ui/tui/screens/SelfDrivingHandoffScreen.tsx -> src/programs/self-driving/detect.ts", - "src/ui/tui/screens/SelfDrivingIntegrationDetectScreen.tsx -> src/programs/frameworks/registry.ts", - "src/ui/tui/screens/SelfDrivingIntegrationDetectScreen.tsx -> src/programs/self-driving/detect-agentic.ts", - "src/ui/tui/screens/SelfDrivingIntegrationDetectScreen.tsx -> src/programs/self-driving/detect.ts", - "src/ui/tui/screens/SelfDrivingIntroScreen.tsx -> src/programs/self-driving/index.ts", - "src/ui/tui/screens/SourceMapsDetectScreen.tsx -> src/programs/error-tracking-upload-source-maps/detect-agentic.ts", - "src/ui/tui/screens/SourceMapsDetectScreen.tsx -> src/programs/error-tracking-upload-source-maps/index.ts", - "src/ui/tui/screens/WarehouseIntroScreen.tsx -> src/programs/warehouse-source/index.ts", - "src/ui/tui/screens/audit/AuditAreaPane.tsx -> src/programs/audit/types.ts", - "src/ui/tui/screens/audit/AuditChecksOutroSection.tsx -> src/programs/audit/types.ts", - "src/ui/tui/screens/audit/AuditChecksViewer/AuditChecksViewer.tsx -> src/programs/audit/types.ts", - "src/ui/tui/screens/audit/AuditChecksViewer/CheckRow.tsx -> src/programs/audit/types.ts", - "src/ui/tui/screens/audit/AuditChecksViewer/DetailRow.tsx -> src/programs/audit/types.ts", - "src/ui/tui/screens/audit/AuditChecksViewer/Footer.tsx -> src/programs/audit/types.ts", - "src/ui/tui/screens/audit/AuditChecksViewer/Header.tsx -> src/programs/audit/types.ts", - "src/ui/tui/screens/audit/AuditChecksViewer/sort.ts -> src/programs/audit/types.ts", - "src/ui/tui/screens/audit/AuditOutroScreen.tsx -> src/programs/audit/types.ts", - "src/ui/tui/screens/audit/AuditRunScreen.tsx -> src/programs/audit/types.ts", - "src/ui/tui/screens/audit/PendingChecksList.tsx -> src/programs/audit/types.ts", - "src/ui/tui/screens/doctor/DoctorReportScreen.tsx -> src/programs/posthog-doctor/index.ts", - "src/ui/tui/screens/doctor/IssueTable.tsx -> src/programs/posthog-doctor/index.ts", - "src/ui/tui/screens/health/HealthCheckScreen.tsx -> src/agent/index.ts", - "src/ui/tui/services/mcp-suggested-prompts-services.ts -> src/agent/index.ts", - "src/ui/tui/store.ts -> src/programs/ai-opt-in-gate.ts", - "src/ui/tui/store.ts -> src/programs/posthog-integration/detect.ts" + "src/ui/tui/store.ts -> src/programs/detection/integration.ts" ] } diff --git a/src/__tests__/mcp-cli.test.ts b/src/__tests__/mcp-cli.test.ts index 98b7afa8a..fee8e9ce7 100644 --- a/src/__tests__/mcp-cli.test.ts +++ b/src/__tests__/mcp-cli.test.ts @@ -19,7 +19,7 @@ vi.mock('@lib/wizard-session', () => ({ reportableDiscoveredFeatures: () => undefined, reportablePosthogSdkDetected: () => undefined, })); -vi.mock('@ui/tui/start-tui', () => ({ +vi.mock('@tui/start-tui', () => ({ startTUI: mockStartTUIMcp, })); vi.mock('@utils/env-api-key', () => ({ @@ -39,9 +39,9 @@ vi.mock('@programs', () => ({ import type { Arguments } from 'yargs'; import { mcpAddCommand } from '../commands/mcp/add'; import { mcpRemoveCommand } from '../commands/mcp/remove'; -import { mcpTutorialCommand } from '../commands/mcp/tutorial'; -import { mcpCommand } from '../commands/mcp'; -import { parseCommand } from './helpers/parse-command.no-jest'; +import { mcpTutorialCommand } from '../cli/commands/mcp/tutorial'; +import { mcpCommand } from '../cli/commands/mcp'; +import { parseCommand } from '../cli/__tests__/helpers/parse-command.no-jest'; function makeArgv(extra: Record = {}): Arguments { return { _: [], $0: 'wizard', ...extra } as Arguments; diff --git a/src/shared/errors/skill-map.ts b/src/agent/runner/shared/skill-error-code.ts similarity index 86% rename from src/shared/errors/skill-map.ts rename to src/agent/runner/shared/skill-error-code.ts index 97d1a1419..ceeb85aaa 100644 --- a/src/shared/errors/skill-map.ts +++ b/src/agent/runner/shared/skill-error-code.ts @@ -1,4 +1,4 @@ -import { ErrorCodes, type ErrorCode } from './codes'; +import { ErrorCodes, type ErrorCode } from '../../../shared/errors/codes'; import type { InstallSkillResult } from '@agent/types'; const SKILL_CODES: Record< diff --git a/src/__tests__/basic-integration-cli.test.ts b/src/cli/__tests__/basic-integration-cli.test.ts similarity index 96% rename from src/__tests__/basic-integration-cli.test.ts rename to src/cli/__tests__/basic-integration-cli.test.ts index 470122d69..76f538298 100644 --- a/src/__tests__/basic-integration-cli.test.ts +++ b/src/cli/__tests__/basic-integration-cli.test.ts @@ -1,5 +1,5 @@ import { basicIntegrationCommand } from '../commands/basic-integration'; -import { HEADLESS_FLAG } from '../lib/headless-mode'; +import { HEADLESS_FLAG } from '../../shared/headless-mode'; import { parseCommand } from './helpers/parse-command.no-jest'; describe('basic-integration parsing (end-to-end yargs)', () => { diff --git a/src/__tests__/cli.test.ts b/src/cli/__tests__/cli.test.ts similarity index 97% rename from src/__tests__/cli.test.ts rename to src/cli/__tests__/cli.test.ts index 6275e16d4..11d8c1381 100644 --- a/src/__tests__/cli.test.ts +++ b/src/cli/__tests__/cli.test.ts @@ -18,7 +18,7 @@ const { mockStreamAttach, mockStreamShutdown, mockStreamDestinations } = // destinations, not about whether a stream exists. mockStreamDestinations: vi.fn(), })); -vi.mock('../programs/task-stream', () => ({ +vi.mock('../../programs/task-stream', () => ({ // shutdown() hardcodes a resolved Promise (not a bare vi.fn) so the // interactive runWizard's dangling SIGTERM handler — which calls // shutdown().catch() and outlives these tests — never hits undefined.catch. @@ -43,8 +43,8 @@ vi.mock('../programs/task-stream', () => ({ ? null : { name: 'file', path: '/tmp/task-stream.jsonl' }, })); -vi.mock('../ui/tui/store', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('../../ui/tui/store', async (importOriginal) => ({ + ...(await importOriginal()), WizardStore: class { session: unknown; setRunPhase = vi.fn(); @@ -56,14 +56,14 @@ vi.mock('../ui/tui/store', async (importOriginal) => ({ vi.mock('semver', () => ({ satisfies: () => true })); // importOriginal keeps real exports (e.g. RunPhase) while overriding // buildSession — vitest throws on access to exports a partial mock omits. -vi.mock('../lib/wizard-session', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('../../lib/wizard-session', async (importOriginal) => ({ + ...(await importOriginal()), buildSession: mockBuildSessionCli, })); vi.mock('@utils/provisioning', () => ({ provisionNewAccount: mockProvisionNewAccountCli, })); -vi.mock('../ui/tui/start-tui', () => ({ +vi.mock('../../tui/start-tui', () => ({ startTUI: () => ({ unmount: vi.fn(), store: { @@ -76,7 +76,7 @@ vi.mock('../ui/tui/start-tui', () => ({ }, }), })); -vi.mock('../programs/posthog-integration', () => ({ +vi.mock('../../programs/posthog-integration', () => ({ posthogIntegrationConfig: { id: 'posthog-integration', steps: [], @@ -102,8 +102,10 @@ vi.mock('@utils/debug', () => ({ logToFile: vi.fn(), setDebugSink: vi.fn(), })); -vi.mock('../programs/frameworks/registry', () => ({ FRAMEWORK_REGISTRY: {} })); -vi.mock('../programs/detection', () => ({ +vi.mock('../../programs/frameworks/registry', () => ({ + FRAMEWORK_REGISTRY: {}, +})); +vi.mock('../../programs/detection', () => ({ detectFramework: vi.fn().mockResolvedValue(null), gatherFrameworkContext: vi.fn().mockResolvedValue({}), })); @@ -117,7 +119,7 @@ vi.mock('@utils/wizard-abort', async (importOriginal) => ({ ...(await importOriginal()), wizardAbort: vi.fn(), })); -vi.mock('../programs/run-agent-legacy', () => ({ +vi.mock('../../programs/run-agent-legacy', () => ({ runProgramAgent: vi.fn().mockResolvedValue(undefined), })); @@ -189,7 +191,7 @@ describe('CLI argument parsing', () => { try { // vi.resetModules() (afterEach) clears the registry, so this re-evaluates // bin.ts fresh on every call — the vitest equivalent of isolateModules. - await import('../../bin'); + await import('../../../bin'); } catch { // process.exit mock throws to halt handler execution } diff --git a/src/__tests__/headless-scope.test.ts b/src/cli/__tests__/headless-scope.test.ts similarity index 90% rename from src/__tests__/headless-scope.test.ts rename to src/cli/__tests__/headless-scope.test.ts index 5f69ebb2e..6d0187d39 100644 --- a/src/__tests__/headless-scope.test.ts +++ b/src/cli/__tests__/headless-scope.test.ts @@ -1,8 +1,8 @@ import { auditCommand } from '../commands/audit'; -import { aiObservabilityCommand } from '../commands/ai-observability'; +import { aiObservabilityCommand } from '../../commands/ai-observability'; import { basicIntegrationCommand } from '../commands/basic-integration'; -import { revenueCommand } from '../commands/revenue'; -import { HEADLESS_FLAG } from '../lib/headless-mode'; +import { revenueCommand } from '../../commands/revenue'; +import { HEADLESS_FLAG } from '../../shared/headless-mode'; import { GLOBAL_OPTIONS } from '../wizard'; import { parseCommand } from './helpers/parse-command.no-jest'; diff --git a/src/__tests__/helpers/parse-command.no-jest.ts b/src/cli/__tests__/helpers/parse-command.no-jest.ts similarity index 100% rename from src/__tests__/helpers/parse-command.no-jest.ts rename to src/cli/__tests__/helpers/parse-command.no-jest.ts diff --git a/src/__tests__/programs-cli.test.ts b/src/cli/__tests__/programs-cli.test.ts similarity index 95% rename from src/__tests__/programs-cli.test.ts rename to src/cli/__tests__/programs-cli.test.ts index 998808992..2f247e492 100644 --- a/src/__tests__/programs-cli.test.ts +++ b/src/cli/__tests__/programs-cli.test.ts @@ -3,7 +3,7 @@ const { mockRunWizard, mockRunWizardCI } = vi.hoisted(() => ({ mockRunWizardCI: vi.fn(), })); -vi.mock('@lib/runners', () => ({ +vi.mock('@cli/runners', () => ({ runWizard: mockRunWizard, runWizardCI: mockRunWizardCI, })); @@ -19,17 +19,17 @@ vi.mock('@shared/skill-menu', async (importOriginal) => { import type { Arguments } from 'yargs'; import type { MockedFunction } from 'vitest'; import { auditCommand } from '../commands/audit'; -import { migrateCommand } from '../commands/migrate'; -import { mcpAnalyticsCommand } from '../commands/mcp-analytics'; -import { replayVisionCommand } from '../commands/replay-vision'; -import { revenueCommand } from '../commands/revenue'; -import { warehouseCommand } from '../commands/warehouse'; -import { uploadSourcemapsCommand } from '../commands/upload-sourcemaps'; +import { migrateCommand } from '../../commands/migrate'; +import { mcpAnalyticsCommand } from '../../commands/mcp-analytics'; +import { replayVisionCommand } from '../../commands/replay-vision'; +import { revenueCommand } from '../../commands/revenue'; +import { warehouseCommand } from '../../commands/warehouse'; +import { uploadSourcemapsCommand } from '../../commands/upload-sourcemaps'; import { selfDrivingCommand } from '../commands/self-driving'; import { dispatchFamily, pickerChildrenToShow, -} from '@programs/dispatch-family'; +} from '@cli/commands/dispatch-family'; import type { Command } from '../commands/command'; import { fetchSkillMenu, type CliEntry } from '@shared/skill-menu'; import { auditConfig } from '@programs/audit/index'; diff --git a/src/__tests__/provision-cli.test.ts b/src/cli/__tests__/provision-cli.test.ts similarity index 95% rename from src/__tests__/provision-cli.test.ts rename to src/cli/__tests__/provision-cli.test.ts index 1f3429d5e..066c7158c 100644 --- a/src/__tests__/provision-cli.test.ts +++ b/src/cli/__tests__/provision-cli.test.ts @@ -10,11 +10,11 @@ vi.mock('@utils/provisioning', () => ({ })); // Same supporting mocks as src/__tests__/cli.test.ts — bin.ts imports these // at module load regardless of which subcommand yargs dispatches. -vi.mock('../lib/wizard-session', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('../../lib/wizard-session', async (importOriginal) => ({ + ...(await importOriginal()), buildSession: vi.fn((args: Record) => args), })); -vi.mock('../ui/tui/start-tui', () => ({ +vi.mock('../../tui/start-tui', () => ({ startTUI: () => ({ unmount: vi.fn(), store: { @@ -27,7 +27,7 @@ vi.mock('../ui/tui/start-tui', () => ({ }, }), })); -vi.mock('../programs/posthog-integration', () => ({ +vi.mock('../../programs/posthog-integration', () => ({ posthogIntegrationConfig: { id: 'posthog-integration', steps: [], @@ -52,8 +52,10 @@ vi.mock('@utils/debug', () => ({ logToFile: vi.fn(), setDebugSink: vi.fn(), })); -vi.mock('../programs/frameworks/registry', () => ({ FRAMEWORK_REGISTRY: {} })); -vi.mock('../programs/detection', () => ({ +vi.mock('../../programs/frameworks/registry', () => ({ + FRAMEWORK_REGISTRY: {}, +})); +vi.mock('../../programs/detection', () => ({ detectFramework: vi.fn().mockResolvedValue(null), gatherFrameworkContext: vi.fn().mockResolvedValue({}), })); @@ -64,11 +66,11 @@ vi.mock('@utils/wizard-abort', async (importOriginal) => ({ ...(await importOriginal()), wizardAbort: vi.fn(), })); -vi.mock('../programs/run-agent-legacy', () => ({ +vi.mock('../../programs/run-agent-legacy', () => ({ runProgramAgent: vi.fn().mockResolvedValue(undefined), })); -import { provisionCommand } from '../commands/provision'; +import { provisionCommand } from '../../commands/provision'; import { parseCommand } from './helpers/parse-command.no-jest'; describe('provision parsing (end-to-end yargs)', () => { @@ -185,7 +187,7 @@ describe('wizard provision subcommand', () => { // vi.resetModules() re-evaluates bin.ts fresh on each call — the vitest // equivalent of jest.isolateModules. vi.resetModules(); - await import('../../bin'); + await import('../../../bin'); } catch { // bin.ts dispatch can reject on some parse paths; the run's effect is // asserted via the mocks after settle(). diff --git a/src/__tests__/skill-cli.test.ts b/src/cli/__tests__/skill-cli.test.ts similarity index 100% rename from src/__tests__/skill-cli.test.ts rename to src/cli/__tests__/skill-cli.test.ts diff --git a/src/__tests__/wizard.test.ts b/src/cli/__tests__/wizard.test.ts similarity index 90% rename from src/__tests__/wizard.test.ts rename to src/cli/__tests__/wizard.test.ts index 0b76ff294..c8f131223 100644 --- a/src/__tests__/wizard.test.ts +++ b/src/cli/__tests__/wizard.test.ts @@ -2,11 +2,11 @@ import { commandKeys, type Command } from '../commands/command'; import { basicIntegrationCommand } from '../commands/basic-integration'; import { mcpCommand } from '../commands/mcp'; import { auditCommand } from '../commands/audit'; -import { doctorCommand } from '../commands/doctor'; -import { migrateCommand } from '../commands/migrate'; -import { replayVisionCommand } from '../commands/replay-vision'; -import { revenueCommand } from '../commands/revenue'; -import { uploadSourcemapsCommand } from '../commands/upload-sourcemaps'; +import { doctorCommand } from '../../commands/doctor'; +import { migrateCommand } from '../../commands/migrate'; +import { replayVisionCommand } from '../../commands/replay-vision'; +import { revenueCommand } from '../../commands/revenue'; +import { uploadSourcemapsCommand } from '../../commands/upload-sourcemaps'; import { skillCommand } from '../commands/skill'; const cmd = (name: string | readonly string[]): Command => ({ diff --git a/src/commands/audit.ts b/src/cli/commands/audit.ts similarity index 100% rename from src/commands/audit.ts rename to src/cli/commands/audit.ts diff --git a/src/commands/basic-integration/__tests__/ci-install.test.ts b/src/cli/commands/basic-integration/__tests__/ci-install.test.ts similarity index 100% rename from src/commands/basic-integration/__tests__/ci-install.test.ts rename to src/cli/commands/basic-integration/__tests__/ci-install.test.ts diff --git a/src/commands/basic-integration/ci-install.ts b/src/cli/commands/basic-integration/ci-install.ts similarity index 97% rename from src/commands/basic-integration/ci-install.ts rename to src/cli/commands/basic-integration/ci-install.ts index a1974e7a0..329fa5850 100644 --- a/src/commands/basic-integration/ci-install.ts +++ b/src/cli/commands/basic-integration/ci-install.ts @@ -1,8 +1,8 @@ import type { Arguments } from 'yargs'; import { getUI, setUI } from '@ui'; import { LoggingUI } from '@ui/logging-ui'; -import { API_KEY_HINT, runWizardCI, runWizardHeadless } from '@lib/runners'; -import type { NonInteractiveMode } from '@lib/runners'; +import { API_KEY_HINT, runWizardCI, runWizardHeadless } from '@cli/runners'; +import type { NonInteractiveMode } from '@cli/runners'; import { provisionNewAccount } from '@utils/provisioning'; import { posthogIntegrationConfig } from '@programs/posthog-integration/index'; import { ErrorCodes, type ErrorCode } from '@shared/errors'; diff --git a/src/commands/basic-integration/index.ts b/src/cli/commands/basic-integration/index.ts similarity index 92% rename from src/commands/basic-integration/index.ts rename to src/cli/commands/basic-integration/index.ts index 0d1aa8739..5a95459c1 100644 --- a/src/commands/basic-integration/index.ts +++ b/src/cli/commands/basic-integration/index.ts @@ -1,7 +1,11 @@ import { isNonInteractiveEnvironment } from '@utils/environment'; import { setEntryCommand } from '@utils/links'; -import { headlessOption, isHeadless, regionOption } from '@lib/headless-mode'; -import { provisionCommand } from '../provision'; +import { + headlessOption, + isHeadless, + regionOption, +} from '@shared/headless-mode'; +import { provisionCommand } from '../../../commands/provision'; import type { Command } from '../command'; export const basicIntegrationCommand: Command = { @@ -69,7 +73,9 @@ export const basicIntegrationCommand: Command = { return failNonInteractive(); } if (argv.playground) { - const { runPlayground } = await import('./playground'); + const { runPlayground } = await import( + '../../../commands/basic-integration/playground' + ); return runPlayground(); } const { runInteractive } = await import('./interactive'); diff --git a/src/commands/basic-integration/interactive.ts b/src/cli/commands/basic-integration/interactive.ts similarity index 87% rename from src/commands/basic-integration/interactive.ts rename to src/cli/commands/basic-integration/interactive.ts index 6191cf745..2db092bd6 100644 --- a/src/commands/basic-integration/interactive.ts +++ b/src/cli/commands/basic-integration/interactive.ts @@ -1,5 +1,5 @@ import type { Arguments } from 'yargs'; -import { runWizard } from '@lib/runners'; +import { runWizard } from '@cli/runners'; import { posthogIntegrationConfig } from '@programs/posthog-integration/index'; /** Default flow: run the posthog-integration program through the TUI. */ diff --git a/src/commands/basic-integration/non-interactive.ts b/src/cli/commands/basic-integration/non-interactive.ts similarity index 100% rename from src/commands/basic-integration/non-interactive.ts rename to src/cli/commands/basic-integration/non-interactive.ts diff --git a/src/commands/basic-integration/skill.ts b/src/cli/commands/basic-integration/skill.ts similarity index 94% rename from src/commands/basic-integration/skill.ts rename to src/cli/commands/basic-integration/skill.ts index 083f2dba2..0a6bab815 100644 --- a/src/commands/basic-integration/skill.ts +++ b/src/cli/commands/basic-integration/skill.ts @@ -1,6 +1,6 @@ import type { Arguments } from 'yargs'; import { POSTHOG_DOCS_URL } from '@shared/constants'; -import { runWizard, runWizardCI } from '@lib/runners'; +import { runWizard, runWizardCI } from '@cli/runners'; import { createSkillProgram } from '@programs/agent-skill/index'; /** Run an arbitrary context-mill skill by id (`wizard skill `, headless with `--ci`). */ diff --git a/src/commands/cli/index.ts b/src/cli/commands/cli/index.ts similarity index 73% rename from src/commands/cli/index.ts rename to src/cli/commands/cli/index.ts index 8e06b39ce..8dbd70d00 100644 --- a/src/commands/cli/index.ts +++ b/src/cli/commands/cli/index.ts @@ -1,4 +1,4 @@ -import { cliAddCommand } from './add'; +import { cliAddCommand } from '../../../tools/cli-steering/index'; import type { Command } from '../command'; export const cliCommand: Command = { diff --git a/src/commands/command.ts b/src/cli/commands/command.ts similarity index 100% rename from src/commands/command.ts rename to src/cli/commands/command.ts diff --git a/src/programs/dispatch-family.ts b/src/cli/commands/dispatch-family.ts similarity index 98% rename from src/programs/dispatch-family.ts rename to src/cli/commands/dispatch-family.ts index b92a25b6a..6049bd098 100644 --- a/src/programs/dispatch-family.ts +++ b/src/cli/commands/dispatch-family.ts @@ -10,8 +10,8 @@ import { getSkillsBaseUrl } from '@shared/constants'; import { fetchSkillMenu, type CliEntry } from '@shared/skill-menu'; import { analytics } from '@utils/analytics'; -import { dispatchProgram } from '../commands/factories/shared'; -import type { Command } from '../commands/command'; +import { dispatchProgram } from './factories/shared'; +import type { Command } from './command'; import { ErrorCodes } from '@shared/errors'; import { emitWizardError } from '@shared/errors'; diff --git a/src/commands/factories/__tests__/family-picker.test.ts b/src/cli/commands/factories/__tests__/family-picker.test.ts similarity index 100% rename from src/commands/factories/__tests__/family-picker.test.ts rename to src/cli/commands/factories/__tests__/family-picker.test.ts diff --git a/src/commands/factories/__tests__/native-command-factory.test.ts b/src/cli/commands/factories/__tests__/native-command-factory.test.ts similarity index 98% rename from src/commands/factories/__tests__/native-command-factory.test.ts rename to src/cli/commands/factories/__tests__/native-command-factory.test.ts index 0cdc69e63..120851df8 100644 --- a/src/commands/factories/__tests__/native-command-factory.test.ts +++ b/src/cli/commands/factories/__tests__/native-command-factory.test.ts @@ -3,7 +3,7 @@ const { mockRunWizard, mockRunWizardCI } = vi.hoisted(() => ({ mockRunWizardCI: vi.fn(), })); -vi.mock('@lib/runners', () => ({ +vi.mock('@cli/runners', () => ({ runWizard: mockRunWizard, runWizardCI: mockRunWizardCI, })); diff --git a/src/commands/factories/family-command-factory.ts b/src/cli/commands/factories/family-command-factory.ts similarity index 98% rename from src/commands/factories/family-command-factory.ts rename to src/cli/commands/factories/family-command-factory.ts index e26a38f55..6b564cc84 100644 --- a/src/commands/factories/family-command-factory.ts +++ b/src/cli/commands/factories/family-command-factory.ts @@ -5,7 +5,7 @@ import { buildFamilyPickerChildren, dispatchFamily, pickerChildrenToShow, -} from '@programs/dispatch-family'; +} from '@cli/commands/dispatch-family'; import { getSkillsBaseUrl } from '@shared/constants'; import { fetchSkillMenu } from '@shared/skill-menu'; diff --git a/src/commands/factories/family-picker.tsx b/src/cli/commands/factories/family-picker.ts similarity index 98% rename from src/commands/factories/family-picker.tsx rename to src/cli/commands/factories/family-picker.ts index 856e56154..7fabbc7fe 100644 --- a/src/commands/factories/family-picker.tsx +++ b/src/cli/commands/factories/family-picker.ts @@ -20,8 +20,8 @@ import type { Arguments } from 'yargs'; import { Box, Text, render } from 'ink'; import { createElement } from 'react'; -import { Colors } from '@ui/tui/styles'; -import { PickerMenu } from '@ui/tui/primitives/PickerMenu'; +import { Colors } from '@tui/styles'; +import { PickerMenu } from '@tui/primitives/PickerMenu'; import { commandKeys, type Command } from '../command'; diff --git a/src/commands/factories/native-command-factory.ts b/src/cli/commands/factories/native-command-factory.ts similarity index 100% rename from src/commands/factories/native-command-factory.ts rename to src/cli/commands/factories/native-command-factory.ts diff --git a/src/commands/factories/shared.ts b/src/cli/commands/factories/shared.ts similarity index 95% rename from src/commands/factories/shared.ts rename to src/cli/commands/factories/shared.ts index e38e96717..7969a085d 100644 --- a/src/commands/factories/shared.ts +++ b/src/cli/commands/factories/shared.ts @@ -1,7 +1,7 @@ import type { Arguments, Options } from 'yargs'; -import { runWizard, runWizardCI, runWizardHeadless } from '@lib/runners'; -import { isHeadless } from '@lib/headless-mode'; +import { runWizard, runWizardCI, runWizardHeadless } from '@cli/runners'; +import { isHeadless } from '@shared/headless-mode'; import type { ProgramConfig } from '@programs/types'; import { skillProgramOptions } from '../skill-program-options'; diff --git a/src/commands/mcp/index.ts b/src/cli/commands/mcp/index.ts similarity index 68% rename from src/commands/mcp/index.ts rename to src/cli/commands/mcp/index.ts index 24f57079f..61e246fbd 100644 --- a/src/commands/mcp/index.ts +++ b/src/cli/commands/mcp/index.ts @@ -1,5 +1,5 @@ -import { mcpAddCommand } from './add'; -import { mcpRemoveCommand } from './remove'; +import { mcpAddCommand } from '../../../commands/mcp/add'; +import { mcpRemoveCommand } from '../../../commands/mcp/remove'; import { mcpTutorialCommand } from './tutorial'; import type { Command } from '../command'; diff --git a/src/commands/mcp/tui-availability.ts b/src/cli/commands/mcp/tui-availability.ts similarity index 100% rename from src/commands/mcp/tui-availability.ts rename to src/cli/commands/mcp/tui-availability.ts diff --git a/src/commands/mcp/tutorial.ts b/src/cli/commands/mcp/tutorial.ts similarity index 96% rename from src/commands/mcp/tutorial.ts rename to src/cli/commands/mcp/tutorial.ts index 6d2919142..ea4f718b2 100644 --- a/src/commands/mcp/tutorial.ts +++ b/src/cli/commands/mcp/tutorial.ts @@ -27,7 +27,7 @@ function runMcpTutorial(argv: Arguments): void { const localMcp = argv.local as boolean | undefined; try { - const { startTUI } = await import('@ui/tui/start-tui'); + const { startTUI } = await import('@tui/start-tui'); const { buildSession } = await import('@lib/wizard-session'); const tui = startTUI(VERSION, Program.McpTutorial); tui.store.session = buildSession({ diff --git a/src/commands/self-driving.ts b/src/cli/commands/self-driving.ts similarity index 97% rename from src/commands/self-driving.ts rename to src/cli/commands/self-driving.ts index 5a585e9b0..64b7a25bb 100644 --- a/src/commands/self-driving.ts +++ b/src/cli/commands/self-driving.ts @@ -1,4 +1,4 @@ -import { runWizard, runWizardCI } from '@lib/runners'; +import { runWizard, runWizardCI } from '@cli/runners'; import { selfDrivingConfig } from '@programs/self-driving/index'; import { skillProgramOptions } from './skill-program-options'; import type { Command } from './command'; diff --git a/src/commands/skill-program-options.ts b/src/cli/commands/skill-program-options.ts similarity index 100% rename from src/commands/skill-program-options.ts rename to src/cli/commands/skill-program-options.ts diff --git a/src/commands/skill.ts b/src/cli/commands/skill.ts similarity index 100% rename from src/commands/skill.ts rename to src/cli/commands/skill.ts diff --git a/src/commands/slack.ts b/src/cli/commands/slack.ts similarity index 96% rename from src/commands/slack.ts rename to src/cli/commands/slack.ts index c65060356..63c888ea3 100644 --- a/src/commands/slack.ts +++ b/src/cli/commands/slack.ts @@ -27,7 +27,7 @@ function runSlackConnect(argv: Arguments): void { const debug = argv.debug as boolean | undefined; try { - const { startTUI } = await import('@ui/tui/start-tui'); + const { startTUI } = await import('@tui/start-tui'); const { buildSession } = await import('@lib/wizard-session'); const tui = startTUI(VERSION, Program.SlackConnect); tui.store.session = buildSession({ diff --git a/src/cli/runners/index.ts b/src/cli/runners/index.ts new file mode 100644 index 000000000..4314c489e --- /dev/null +++ b/src/cli/runners/index.ts @@ -0,0 +1,5 @@ +export { runWizard } from '../../lib/runners/run-wizard'; +export { runWizardCI } from './run-wizard-ci'; +export { runWizardHeadless } from './run-wizard-headless'; +export { API_KEY_HINT } from '../../lib/runners/run-non-interactive'; +export type { NonInteractiveMode } from '../../lib/runners/run-non-interactive'; diff --git a/src/lib/runners/resolve-no-telemetry.ts b/src/cli/runners/resolve-no-telemetry.ts similarity index 100% rename from src/lib/runners/resolve-no-telemetry.ts rename to src/cli/runners/resolve-no-telemetry.ts diff --git a/src/lib/runners/run-wizard-ci.ts b/src/cli/runners/run-wizard-ci.ts similarity index 86% rename from src/lib/runners/run-wizard-ci.ts rename to src/cli/runners/run-wizard-ci.ts index 247f558f9..f735eaeca 100644 --- a/src/lib/runners/run-wizard-ci.ts +++ b/src/cli/runners/run-wizard-ci.ts @@ -1,5 +1,5 @@ import type { ProgramConfig } from '@programs/types'; -import { runNonInteractive } from './run-non-interactive'; +import { runNonInteractive } from '../../lib/runners/run-non-interactive'; /** * CI-mode entry point (`--ci`, dev/test builds). A thin shell over the shared diff --git a/src/lib/runners/run-wizard-headless.ts b/src/cli/runners/run-wizard-headless.ts similarity index 90% rename from src/lib/runners/run-wizard-headless.ts rename to src/cli/runners/run-wizard-headless.ts index c88744019..2b2f46a8e 100644 --- a/src/lib/runners/run-wizard-headless.ts +++ b/src/cli/runners/run-wizard-headless.ts @@ -1,5 +1,5 @@ import type { ProgramConfig } from '@programs/types'; -import { runNonInteractive } from './run-non-interactive'; +import { runNonInteractive } from '../../lib/runners/run-non-interactive'; /** * Headless entry point (the experimental published-build, non-interactive run diff --git a/src/wizard.ts b/src/cli/wizard.ts similarity index 99% rename from src/wizard.ts rename to src/cli/wizard.ts index c453d416c..7e2ee083d 100644 --- a/src/wizard.ts +++ b/src/cli/wizard.ts @@ -3,7 +3,7 @@ import { hideBin } from 'yargs/helpers'; import type { Argv } from 'yargs'; import { IS_PRODUCTION_BUILD } from '@env'; import { Harness, Sequence } from '@shared/constants'; -import { regionOption } from '@lib/headless-mode'; +import { regionOption } from '@shared/headless-mode'; import { initLocalDev, localMcpSkillsNotice } from '@shared/local-dev'; import { toCommandModule, type Command } from './commands/command'; import { ErrorCodes } from '@shared/errors'; diff --git a/src/commands/ai-observability.ts b/src/commands/ai-observability.ts index c51fe2b0a..2ce337e67 100644 --- a/src/commands/ai-observability.ts +++ b/src/commands/ai-observability.ts @@ -1,7 +1,7 @@ import { aiObservabilityConfig } from '@programs/ai-observability/index'; -import type { Command } from './command'; -import { nativeCommandFactory } from './factories/native-command-factory'; +import type { Command } from '../cli/commands/command'; +import { nativeCommandFactory } from '../cli/commands/factories/native-command-factory'; /** * `wizard ai-observability` — flat skill command, wire AI Observability into a diff --git a/src/commands/basic-integration/playground.ts b/src/commands/basic-integration/playground.ts index 92c5eab2a..ae356e4ec 100644 --- a/src/commands/basic-integration/playground.ts +++ b/src/commands/basic-integration/playground.ts @@ -1,5 +1,5 @@ import { VERSION } from '@shared/version'; -import { startPlayground } from '@ui/tui/playground/start-playground'; +import { startPlayground } from '@tui/playground/start-playground'; /** Launch the TUI primitives playground. */ export function runPlayground(): void { diff --git a/src/commands/doctor.ts b/src/commands/doctor.ts index 979c29116..4310807fc 100644 --- a/src/commands/doctor.ts +++ b/src/commands/doctor.ts @@ -3,14 +3,14 @@ import { LoggingUI } from '@ui/logging-ui'; import { readApiKeyFromEnv } from '@utils/env-api-key'; import { ErrorCodes } from '@shared/errors'; import { emitWizardError } from '@shared/errors'; -import { runWizard } from '@lib/runners'; +import { runWizard } from '@cli/runners'; import { posthogDoctorConfig, fetchHealthIssues, getKindMeta, } from '@programs/posthog-doctor/index'; -import { skillProgramOptions } from './skill-program-options'; -import type { Command } from './command'; +import { skillProgramOptions } from '../cli/commands/skill-program-options'; +import type { Command } from '../cli/commands/command'; export const doctorCommand: Command = { name: 'doctor', diff --git a/src/commands/error-tracking.ts b/src/commands/error-tracking.ts index 962b1d612..a15b77c8c 100644 --- a/src/commands/error-tracking.ts +++ b/src/commands/error-tracking.ts @@ -1,7 +1,7 @@ import { errorTrackingConfig } from '@programs/error-tracking/index'; -import type { Command } from './command'; -import { nativeCommandFactory } from './factories/native-command-factory'; +import type { Command } from '../cli/commands/command'; +import { nativeCommandFactory } from '../cli/commands/factories/native-command-factory'; /** * `wizard error-tracking` — flat skill command, set up error tracking today. diff --git a/src/commands/mcp-analytics.ts b/src/commands/mcp-analytics.ts index 4b36a2f95..8f793ce0f 100644 --- a/src/commands/mcp-analytics.ts +++ b/src/commands/mcp-analytics.ts @@ -1,7 +1,7 @@ import { mcpAnalyticsConfig } from '@programs/mcp-analytics/index'; -import type { Command } from './command'; -import { nativeCommandFactory } from './factories/native-command-factory'; +import type { Command } from '../cli/commands/command'; +import { nativeCommandFactory } from '../cli/commands/factories/native-command-factory'; /** * `wizard mcp-analytics` — flat skill command, instrument-an-MCP-server today. diff --git a/src/commands/mcp/add.ts b/src/commands/mcp/add.ts index 887bc0bc1..593a088c9 100644 --- a/src/commands/mcp/add.ts +++ b/src/commands/mcp/add.ts @@ -1,11 +1,11 @@ import type { Arguments } from 'yargs'; import { setUI } from '@ui'; import { LoggingUI } from '@ui/logging-ui'; -import { headlessOption, isHeadless } from '@lib/headless-mode'; +import { headlessOption, isHeadless } from '@shared/headless-mode'; import { Program } from '@programs'; import { VERSION } from '@shared/version'; -import type { Command } from '../command'; -import { isTUIUnavailable } from './tui-availability'; +import type { Command } from '../../cli/commands/command'; +import { isTUIUnavailable } from '../../cli/commands/mcp/tui-availability'; export const mcpAddCommand: Command = { name: 'add', @@ -50,7 +50,7 @@ function runMcpAdd(argv: Arguments): void { } try { - const { startTUI } = await import('@ui/tui/start-tui'); + const { startTUI } = await import('@tui/start-tui'); const { buildSession } = await import('@lib/wizard-session'); const tui = startTUI(VERSION, Program.McpAdd); tui.store.session = buildSession({ diff --git a/src/commands/mcp/remove.ts b/src/commands/mcp/remove.ts index 9b82c728f..ba25c2638 100644 --- a/src/commands/mcp/remove.ts +++ b/src/commands/mcp/remove.ts @@ -1,11 +1,11 @@ import type { Arguments } from 'yargs'; import { setUI } from '@ui'; import { LoggingUI } from '@ui/logging-ui'; -import { headlessOption, isHeadless } from '@lib/headless-mode'; +import { headlessOption, isHeadless } from '@shared/headless-mode'; import { Program } from '@programs'; import { VERSION } from '@shared/version'; -import type { Command } from '../command'; -import { isTUIUnavailable } from './tui-availability'; +import type { Command } from '../../cli/commands/command'; +import { isTUIUnavailable } from '../../cli/commands/mcp/tui-availability'; export const mcpRemoveCommand: Command = { name: 'remove', @@ -35,7 +35,7 @@ function runMcpRemove(argv: Arguments): void { } try { - const { startTUI } = await import('@ui/tui/start-tui'); + const { startTUI } = await import('@tui/start-tui'); const { buildSession } = await import('@lib/wizard-session'); const tui = startTUI(VERSION, Program.McpRemove); tui.store.session = buildSession({ diff --git a/src/commands/metrics.ts b/src/commands/metrics.ts index 0f0978b1a..45df2817e 100644 --- a/src/commands/metrics.ts +++ b/src/commands/metrics.ts @@ -1,7 +1,7 @@ import { metricsConfig } from '@programs/metrics/index'; -import type { Command } from './command'; -import { nativeCommandFactory } from './factories/native-command-factory'; +import type { Command } from '../cli/commands/command'; +import { nativeCommandFactory } from '../cli/commands/factories/native-command-factory'; /** * `wizard metrics` — flat skill command, wire PostHog application metrics diff --git a/src/commands/migrate.ts b/src/commands/migrate.ts index ec937197d..459389d4d 100644 --- a/src/commands/migrate.ts +++ b/src/commands/migrate.ts @@ -1,7 +1,7 @@ import { migrationConfig } from '@programs/migration/index'; -import type { Command } from './command'; -import { nativeCommandFactory } from './factories/native-command-factory'; +import type { Command } from '../cli/commands/command'; +import { nativeCommandFactory } from '../cli/commands/factories/native-command-factory'; /** * `wizard migrate` — flat skill command, Statsig today. diff --git a/src/commands/provision.ts b/src/commands/provision.ts index aa60fd1f4..93f2f92cd 100644 --- a/src/commands/provision.ts +++ b/src/commands/provision.ts @@ -2,7 +2,7 @@ import type { Arguments } from 'yargs'; import { getUI, setUI } from '@ui'; import { LoggingUI } from '@ui/logging-ui'; import type { ProvisioningResult } from '@utils/provisioning'; -import type { Command } from './command'; +import type { Command } from '../cli/commands/command'; export const provisionCommand: Command = { name: 'provision', diff --git a/src/commands/replay-vision.ts b/src/commands/replay-vision.ts index 8b13e19c2..53c7bcd56 100644 --- a/src/commands/replay-vision.ts +++ b/src/commands/replay-vision.ts @@ -1,7 +1,7 @@ import { replayVisionConfig } from '@programs/replay-vision/index'; -import type { Command } from './command'; -import { nativeCommandFactory } from './factories/native-command-factory'; +import type { Command } from '../cli/commands/command'; +import { nativeCommandFactory } from '../cli/commands/factories/native-command-factory'; /** * `wizard replay-vision` — flat skill command, set up Replay vision today. diff --git a/src/commands/revenue.ts b/src/commands/revenue.ts index 76f50c629..531818993 100644 --- a/src/commands/revenue.ts +++ b/src/commands/revenue.ts @@ -1,7 +1,7 @@ import { revenueAnalyticsConfig } from '@programs/revenue-analytics/index'; -import type { Command } from './command'; -import { nativeCommandFactory } from './factories/native-command-factory'; +import type { Command } from '../cli/commands/command'; +import { nativeCommandFactory } from '../cli/commands/factories/native-command-factory'; /** * `wizard revenue-analytics` — flat skill command, Stripe today. diff --git a/src/commands/upload-sourcemaps.ts b/src/commands/upload-sourcemaps.ts index 1ffc65079..432668c99 100644 --- a/src/commands/upload-sourcemaps.ts +++ b/src/commands/upload-sourcemaps.ts @@ -1,7 +1,7 @@ -import { runWizard, runWizardCI } from '@lib/runners'; +import { runWizard, runWizardCI } from '@cli/runners'; import { errorTrackingUploadSourceMapsConfig } from '@programs/error-tracking-upload-source-maps/index'; -import { skillProgramOptions } from './skill-program-options'; -import type { Command } from './command'; +import { skillProgramOptions } from '../cli/commands/skill-program-options'; +import type { Command } from '../cli/commands/command'; export const uploadSourcemapsCommand: Command = { // Must match ProgramConfig.command; legacy alias kept for #489 regression. diff --git a/src/commands/warehouse.ts b/src/commands/warehouse.ts index 1b9c52637..8b2257827 100644 --- a/src/commands/warehouse.ts +++ b/src/commands/warehouse.ts @@ -1,7 +1,7 @@ import { warehouseSourceConfig } from '@programs/warehouse-source/index'; -import type { Command } from './command'; -import { nativeCommandFactory } from './factories/native-command-factory'; +import type { Command } from '../cli/commands/command'; +import { nativeCommandFactory } from '../cli/commands/factories/native-command-factory'; /** * `wizard warehouse` — detect and connect a data warehouse source. diff --git a/src/env.ts b/src/env.ts index acd986513..c5973f4e8 100644 --- a/src/env.ts +++ b/src/env.ts @@ -15,7 +15,7 @@ * this module instead. */ -import { HEADLESS_FLAG } from '@lib/headless-mode'; +import { HEADLESS_FLAG } from '@shared/headless-mode'; // ── Build-time constants ───────────────────────────────────────────── // tsdown replaces `process.env.NODE_ENV` with a string literal. diff --git a/src/__tests__/wizard-abort.test.ts b/src/host/__tests__/wizard-abort.test.ts similarity index 99% rename from src/__tests__/wizard-abort.test.ts rename to src/host/__tests__/wizard-abort.test.ts index d0bab1f0f..c8ef2a61c 100644 --- a/src/__tests__/wizard-abort.test.ts +++ b/src/host/__tests__/wizard-abort.test.ts @@ -9,10 +9,10 @@ import { } from '@utils/wizard-abort'; import { analytics } from '@utils/analytics'; import { ErrorCodes } from '@shared/errors'; -import { getUI } from '../ui'; +import { getUI } from '../../ui'; vi.mock('@utils/analytics'); -vi.mock('../ui', () => ({ +vi.mock('../../ui', () => ({ getUI: vi.fn().mockReturnValue({ outroError: vi.fn(), waitForOutroDismissed: vi.fn().mockResolvedValue(undefined), diff --git a/src/lib/runners/__tests__/mint-recovery.test.ts b/src/lib/runners/__tests__/mint-recovery.test.ts index 423eb9d4b..94f81d4db 100644 --- a/src/lib/runners/__tests__/mint-recovery.test.ts +++ b/src/lib/runners/__tests__/mint-recovery.test.ts @@ -1,12 +1,12 @@ import { vi, it, expect, afterEach } from 'vitest'; import { runWizard } from '../run-wizard'; import { runProgramAgent } from '@programs/run-agent-legacy'; -import { startTUI } from '@ui/tui/start-tui'; +import { startTUI } from '@tui/start-tui'; import { WizardStore } from '@ui/tui/store'; import { InkUI } from '@ui/tui/ink-ui'; import { setUI } from '@ui'; import { posthogIntegrationConfig } from '@programs/posthog-integration'; -import { ScreenId } from '@ui/tui/router'; +import { ScreenId } from '@tui/router'; import { HostResolution } from '@shared/host-resolution'; import { analytics } from '@utils/analytics'; import { RunPhase } from '@lib/wizard-session'; @@ -14,7 +14,7 @@ import { RunPhase } from '@lib/wizard-session'; const streamShutdown = vi.hoisted(() => vi.fn().mockResolvedValue(undefined)); vi.mock('@programs/run-agent-legacy', () => ({ runProgramAgent: vi.fn() })); -vi.mock('@ui/tui/start-tui', () => ({ startTUI: vi.fn() })); +vi.mock('@tui/start-tui', () => ({ startTUI: vi.fn() })); vi.mock('@shared/local-dev', async (original) => ({ ...(await original()), getLocalDev: () => ({}), @@ -37,7 +37,7 @@ vi.mock('@programs/task-stream/index', () => ({ shutdown = streamShutdown; }, })); -vi.mock('@programs/task-stream/destinations/posthog', () => ({ +vi.mock('@programs/session/task-stream/destinations/posthog', () => ({ PostHogDestination: class {}, })); diff --git a/src/lib/runners/index.ts b/src/lib/runners/index.ts deleted file mode 100644 index e42598b8e..000000000 --- a/src/lib/runners/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { runWizard } from './run-wizard'; -export { runWizardCI } from './run-wizard-ci'; -export { runWizardHeadless } from './run-wizard-headless'; -export { API_KEY_HINT } from './run-non-interactive'; -export type { NonInteractiveMode } from './run-non-interactive'; diff --git a/src/lib/runners/run-non-interactive.ts b/src/lib/runners/run-non-interactive.ts index d977733f4..917a9faa4 100644 --- a/src/lib/runners/run-non-interactive.ts +++ b/src/lib/runners/run-non-interactive.ts @@ -6,7 +6,7 @@ import { import { createWizardRunSync, type RunOutcome, -} from '@programs/task-stream/wizard-run-sync'; +} from '@programs/session/task-stream/wizard-run-sync'; import { runtimeEnv } from '@env'; import { registerShutdown, runCleanups } from '@utils/wizard-abort'; import { @@ -20,9 +20,9 @@ import { LoggingUI } from '@ui/logging-ui'; import type { ProgramConfig } from '@programs/types'; import { getAuditChecks } from '@programs/audit/types'; import { analytics } from '@utils/analytics'; -import { resolveNoTelemetry } from './resolve-no-telemetry'; +import { resolveNoTelemetry } from '../../cli/runners/resolve-no-telemetry'; import type { WizardStore } from '@ui/tui/store'; -import type { TaskStreamPush } from '@programs/task-stream/task-stream-push'; +import type { TaskStreamPush } from '@programs/session/task-stream/task-stream-push'; import { join } from 'node:path'; import { ErrorCodes, diff --git a/src/lib/runners/run-wizard.ts b/src/lib/runners/run-wizard.ts index 16272caf5..4b57f6e8a 100644 --- a/src/lib/runners/run-wizard.ts +++ b/src/lib/runners/run-wizard.ts @@ -4,20 +4,20 @@ import { runProgramAgent } from '@programs/run-agent-legacy'; import { authenticate } from '@programs/authenticate'; import { getProgramConfig } from '@programs'; import { getAuditChecks } from '@programs/audit/types'; -import { maybeStampAiSdkDetected } from '@programs/posthog-integration/detect'; +import { maybeStampAiSdkDetected } from '@programs/detection/integration'; import type { ProgramConfig } from '@programs/types'; import type { Harness, Sequence } from '@shared/constants'; -import type { startTUI as StartTUIFn } from '@ui/tui/start-tui'; +import type { startTUI as StartTUIFn } from '@tui/start-tui'; import type { WizardStore } from '@ui/tui/store'; import { OutroKind, type WizardSession } from '@lib/wizard-session'; -import type { TaskStreamPush as TaskStreamPushClass } from '@programs/task-stream/task-stream-push'; -import { resolveNoTelemetry } from './resolve-no-telemetry'; +import type { TaskStreamPush as TaskStreamPushClass } from '@programs/session/task-stream/task-stream-push'; +import { resolveNoTelemetry } from '../../cli/runners/resolve-no-telemetry'; import { checkLocalServices, getLocalDev } from '@shared/local-dev'; -import { createWizardRunSync } from '@programs/task-stream/wizard-run-sync'; +import { createWizardRunSync } from '@programs/session/task-stream/wizard-run-sync'; import { runtimeEnv } from '@env'; import { runCleanups, registerShutdown } from '@utils/wizard-abort'; import { classifyRunFailure, emitWizardError } from '@shared/errors'; -import { isRunFailure } from '@ui/mint-failure'; +import { isRunFailure } from '@tui/mint-failure'; import { getUI } from '@ui'; import { analytics } from '@utils/analytics'; import { join } from 'node:path'; @@ -88,14 +88,14 @@ export function runWizard( try { const installDir = (options.installDir as string) || process.cwd(); - const { startTUI } = await import('@ui/tui/start-tui'); + const { startTUI } = await import('@tui/start-tui'); const { buildSession, RunPhase } = await import('@lib/wizard-session'); const { TaskStreamPush } = await import('@programs/task-stream/index'); const { PostHogDestination } = await import( - '@programs/task-stream/destinations/posthog' + '@programs/session/task-stream/destinations/posthog' ); const { createFileDestination } = await import( - '@programs/task-stream/destinations/file' + '@programs/session/task-stream/destinations/file' ); // Before the TUI mounts: once Ink owns the alt screen, anything written diff --git a/src/programs/__tests__/posthog-cli-preinstall.test.ts b/src/programs/__tests__/posthog-cli-preinstall.test.ts index 3ce343bc6..d91421bc4 100644 --- a/src/programs/__tests__/posthog-cli-preinstall.test.ts +++ b/src/programs/__tests__/posthog-cli-preinstall.test.ts @@ -4,10 +4,10 @@ import { preinstallPostHogCliOnce, resetPostHogCliPreinstallForTests, } from '@programs/shared/posthog-cli-preinstall'; -import { installOrUpdatePostHogCli } from '@steps/install-cli-steering'; +import { installOrUpdatePostHogCli } from '@shared/install-cli-steering'; import { analytics } from '@utils/analytics'; -vi.mock('@steps/install-cli-steering', () => ({ +vi.mock('@shared/install-cli-steering', () => ({ installOrUpdatePostHogCli: vi.fn(), })); vi.mock('@utils/analytics', () => ({ diff --git a/src/programs/oauth/__tests__/program-scopes.test.ts b/src/programs/__tests__/program-scopes.test.ts similarity index 100% rename from src/programs/oauth/__tests__/program-scopes.test.ts rename to src/programs/__tests__/program-scopes.test.ts diff --git a/src/programs/__tests__/run-agent-legacy.test.ts b/src/programs/__tests__/run-agent-legacy.test.ts index d47545e20..c6e8962f4 100644 --- a/src/programs/__tests__/run-agent-legacy.test.ts +++ b/src/programs/__tests__/run-agent-legacy.test.ts @@ -13,7 +13,7 @@ import { buildSession, OutroKind } from '@lib/wizard-session'; import { HostResolution } from '@shared/host-resolution'; import { LoggingUI } from '@ui/logging-ui'; import { InkUI } from '@ui/tui/ink-ui'; -import { startTUI } from '@ui/tui/start-tui'; +import { startTUI } from '@tui/start-tui'; import { WizardStore } from '@ui/tui/store'; import { getUI, setUI } from '@ui'; import { analytics } from '@utils/analytics'; @@ -50,7 +50,7 @@ vi.mock('@programs/task-stream/index', () => ({ PostHogDestination: class {}, createFileDestination: () => null, })); -vi.mock('@ui/tui/start-tui', () => ({ startTUI: vi.fn() })); +vi.mock('@tui/start-tui', () => ({ startTUI: vi.fn() })); vi.mock('@utils/debug'); vi.mock('@utils/analytics', () => ({ analytics: { @@ -90,10 +90,10 @@ vi.mock('@utils/wizard-abort', async (original) => ({ registerCleanup: vi.fn(), wizardAbort: vi.fn().mockResolvedValue(undefined), })); -vi.mock('../posthog-integration/detect', () => ({ +vi.mock('../detection/integration', () => ({ maybeStampAiSdkDetected: vi.fn(), })); -vi.mock('../posthog-integration/ai-sdk-stamp', () => ({ +vi.mock('../detection/ai-sdk-stamp', () => ({ stampAiSdkDetected: vi.fn(), })); diff --git a/src/programs/__tests__/agent-skill.test.ts b/src/programs/agent-skill/__tests__/agent-skill.test.ts similarity index 100% rename from src/programs/__tests__/agent-skill.test.ts rename to src/programs/agent-skill/__tests__/agent-skill.test.ts diff --git a/src/programs/agent-skill/index.ts b/src/programs/agent-skill/index.ts index 75752731e..bfd6d5141 100644 --- a/src/programs/agent-skill/index.ts +++ b/src/programs/agent-skill/index.ts @@ -23,7 +23,7 @@ import type { ProgramConfig } from '@programs/program-step'; import type { AbortCase } from '@agent/types'; import type { ProgramRun } from '@programs/program-run'; import { AGENT_SKILL_STEPS } from './steps.js'; -import { getContentBlocks } from '../../ui/tui/decks/agent-skill/index.js'; +import { getContentBlocks } from '../../tui/programs/shared/skill-deck.js'; export interface SkillProgramOptions { /** Context-mill skill ID to install */ diff --git a/src/programs/agent-skill/steps.ts b/src/programs/agent-skill/steps.ts index faafee60b..83a57b738 100644 --- a/src/programs/agent-skill/steps.ts +++ b/src/programs/agent-skill/steps.ts @@ -7,7 +7,7 @@ import type { ProgramStep } from '@programs/program-step'; import { RunPhase } from '@lib/wizard-session'; -import { HEALTH_CHECK_STEP } from '@programs/shared/health-check-step'; +import { HEALTH_CHECK_STEP } from '@tui/programs/shared/health-check-step'; export const AGENT_SKILL_STEPS: ProgramStep[] = [ { diff --git a/src/programs/ai-observability/index.ts b/src/programs/ai-observability/index.ts index b71697d30..cbbf99265 100644 --- a/src/programs/ai-observability/index.ts +++ b/src/programs/ai-observability/index.ts @@ -1,7 +1,7 @@ import type { ProgramConfig, ProgramStep } from '@programs/program-step'; import { AGENT_SKILL_STEPS } from '@programs/agent-skill/index'; -import { getContentBlocks } from '@ui/tui/decks/agent-skill/index'; -import { headlessOption, regionOption } from '@lib/headless-mode'; +import { getContentBlocks } from '@tui/programs/shared/skill-deck'; +import { headlessOption, regionOption } from '@shared/headless-mode'; const AI_OBSERVABILITY_STEPS: ProgramStep[] = AGENT_SKILL_STEPS.map((step) => step.id === 'intro' ? { ...step, screenId: 'ai-observability-intro' } : step, diff --git a/src/programs/__tests__/audit-seed.test.ts b/src/programs/audit/__tests__/seed.test.ts similarity index 96% rename from src/programs/__tests__/audit-seed.test.ts rename to src/programs/audit/__tests__/seed.test.ts index d8a92aa06..ee2a303cb 100644 --- a/src/programs/__tests__/audit-seed.test.ts +++ b/src/programs/audit/__tests__/seed.test.ts @@ -4,7 +4,7 @@ import * as path from 'path'; import { AUDIT_SEED_CHECKS, seedAuditLedger } from '@programs/audit/seed'; import { AUDIT_CHECKS_FILE, type AuditCheck } from '@programs/audit/types'; -import { COL_AREA_WIDTH } from '@ui/tui/screens/audit/AuditChecksViewer/layout'; +import { COL_AREA_WIDTH } from '@tui/programs/audit/screens/AuditChecksViewer/layout'; const ids = (checks: AuditCheck[]) => checks.map((c) => c.id); diff --git a/src/programs/events-audit/index.ts b/src/programs/audit/events/config.ts similarity index 96% rename from src/programs/events-audit/index.ts rename to src/programs/audit/events/config.ts index 29e945944..5b3abb52b 100644 --- a/src/programs/events-audit/index.ts +++ b/src/programs/audit/events/config.ts @@ -5,7 +5,7 @@ import { OutroKind } from '@lib/wizard-session'; import { SPINNER_MESSAGE } from '@programs/framework-config'; import { isUsingTypeScript } from '@utils/setup-utils'; import { WIZARD_TOOL_NAMES } from '@agent'; -import { EVENTS_AUDIT_PROGRAM } from './steps.js'; +import { EVENTS_AUDIT_PROGRAM } from '../../../tui/programs/audit/events-flow.js'; import { AUDIT_CHECKS_FILE, AUDIT_CHECKS_KEY } from '@programs/audit/types'; import { seedAuditLedger } from '@programs/audit/seed'; import { EVENTS_AUDIT_SEED_CHECKS } from './seed.js'; @@ -106,4 +106,4 @@ Project context: }, }; -export { EVENTS_AUDIT_PROGRAM } from './steps.js'; +export { EVENTS_AUDIT_PROGRAM } from '../../../tui/programs/audit/events-flow.js'; diff --git a/src/programs/events-audit/constants.ts b/src/programs/audit/events/constants.ts similarity index 100% rename from src/programs/events-audit/constants.ts rename to src/programs/audit/events/constants.ts diff --git a/src/programs/events-audit/seed.ts b/src/programs/audit/events/seed.ts similarity index 100% rename from src/programs/events-audit/seed.ts rename to src/programs/audit/events/seed.ts diff --git a/src/programs/audit/index.ts b/src/programs/audit/index.ts index 403eb1bdf..1b08b9011 100644 --- a/src/programs/audit/index.ts +++ b/src/programs/audit/index.ts @@ -8,7 +8,7 @@ import type { RunnerContext } from '@programs/runner-context'; import type { WizardSession } from '@lib/wizard-session'; import { OutroKind } from '@lib/wizard-session'; import { WIZARD_TOOL_NAMES } from '@agent'; -import { headlessOption, regionOption } from '@lib/headless-mode'; +import { headlessOption, regionOption } from '@shared/headless-mode'; import { AUDIT_ABORT_CASES } from './detect.js'; import { AUDIT_CHECKS_FILE, diff --git a/src/programs/audit/ledger-watcher.ts b/src/programs/audit/ledger-watcher.ts index 900249d27..56f314aa8 100644 --- a/src/programs/audit/ledger-watcher.ts +++ b/src/programs/audit/ledger-watcher.ts @@ -12,7 +12,7 @@ import { startFileWatcher, type FileWatcherHandle, type FileWatcherOptions, -} from '@lib/file-watcher'; +} from '@shared/utils/file-watcher'; import { logToFile } from '@utils/debug'; import { AUDIT_CHECKS_KEY, coerceAuditChecks } from './types.js'; diff --git a/src/programs/posthog-integration/__tests__/detect.test.ts b/src/programs/detection/__tests__/integration.test.ts similarity index 99% rename from src/programs/posthog-integration/__tests__/detect.test.ts rename to src/programs/detection/__tests__/integration.test.ts index 7a949336f..57410678f 100644 --- a/src/programs/posthog-integration/__tests__/detect.test.ts +++ b/src/programs/detection/__tests__/integration.test.ts @@ -33,7 +33,7 @@ import { detectPostHogIntegration, maybeStampAiSdkDetected, reportWarehouseSourcesDetected, -} from '@programs/posthog-integration/detect'; +} from '@programs/detection/integration'; import { posthogIntegrationConfig } from '@programs/posthog-integration/index'; import { DETECTED_WAREHOUSE_SOURCES_KEY } from '@programs/warehouse-source/detect'; import type { ProgramReadyContext } from '@programs/types'; diff --git a/src/programs/__tests__/posthog-integration-detect.test.ts b/src/programs/detection/__tests__/posthog-integration-detect.test.ts similarity index 96% rename from src/programs/__tests__/posthog-integration-detect.test.ts rename to src/programs/detection/__tests__/posthog-integration-detect.test.ts index cb1e63416..ce2a6fde1 100644 --- a/src/programs/__tests__/posthog-integration-detect.test.ts +++ b/src/programs/detection/__tests__/posthog-integration-detect.test.ts @@ -1,7 +1,7 @@ import * as fs from 'fs'; import * as path from 'path'; import * as os from 'os'; -import { detectExistingPostHog } from '@programs/posthog-integration/detect'; +import { detectExistingPostHog } from '@programs/detection/integration'; function makeTmpDir(): string { return fs.mkdtempSync(path.join(os.tmpdir(), 'ph-detect-')); diff --git a/src/programs/posthog-integration/ai-sdk-stamp.ts b/src/programs/detection/ai-sdk-stamp.ts similarity index 100% rename from src/programs/posthog-integration/ai-sdk-stamp.ts rename to src/programs/detection/ai-sdk-stamp.ts diff --git a/src/programs/posthog-integration/detect.ts b/src/programs/detection/integration.ts similarity index 98% rename from src/programs/posthog-integration/detect.ts rename to src/programs/detection/integration.ts index bcfa60dc1..af201dc09 100644 --- a/src/programs/posthog-integration/detect.ts +++ b/src/programs/detection/integration.ts @@ -29,13 +29,13 @@ import { getDetectedWarehouseSources, } from '@programs/warehouse-source/detect'; import { findPackageJsons } from '@programs/shared/package-scanning'; -import { stampAiSdkDetected } from '@programs/posthog-integration/ai-sdk-stamp'; +import { stampAiSdkDetected } from '@programs/detection/ai-sdk-stamp'; // Session-free, so runProgram can stamp without loading the session. export { stampAiSdkDetected, type AiSdkStampEvidence, -} from '@programs/posthog-integration/ai-sdk-stamp'; +} from '@programs/detection/ai-sdk-stamp'; export async function detectPostHogIntegration( ctx: ProgramReadyContext, diff --git a/src/programs/__tests__/source-maps-detect-agentic.test.ts b/src/programs/error-tracking-upload-source-maps/__tests__/detect-agentic.test.ts similarity index 100% rename from src/programs/__tests__/source-maps-detect-agentic.test.ts rename to src/programs/error-tracking-upload-source-maps/__tests__/detect-agentic.test.ts diff --git a/src/programs/__tests__/source-maps-detect.test.ts b/src/programs/error-tracking-upload-source-maps/__tests__/detect.test.ts similarity index 100% rename from src/programs/__tests__/source-maps-detect.test.ts rename to src/programs/error-tracking-upload-source-maps/__tests__/detect.test.ts diff --git a/src/programs/__tests__/source-maps-prompt.test.ts b/src/programs/error-tracking-upload-source-maps/__tests__/prompt.test.ts similarity index 100% rename from src/programs/__tests__/source-maps-prompt.test.ts rename to src/programs/error-tracking-upload-source-maps/__tests__/prompt.test.ts diff --git a/src/programs/error-tracking-upload-source-maps/index.ts b/src/programs/error-tracking-upload-source-maps/index.ts index e1a7c5f44..c53486eb1 100644 --- a/src/programs/error-tracking-upload-source-maps/index.ts +++ b/src/programs/error-tracking-upload-source-maps/index.ts @@ -3,7 +3,7 @@ import type { ProgramRun } from '@programs/program-run'; import type { WizardSession } from '@lib/wizard-session'; import { OutroKind } from '@lib/wizard-session'; import type { RunnerContext } from '@programs/runner-context'; -import { ERROR_TRACKING_UPLOAD_SOURCE_MAPS_PROGRAM } from './steps.js'; +import { ERROR_TRACKING_UPLOAD_SOURCE_MAPS_PROGRAM } from '../../tui/programs/error-tracking-upload-source-maps/flow.js'; import { buildSourceMapsUploadPrompt, SOURCE_MAPS_DETECTION_FAILED_PROMPT, @@ -14,7 +14,7 @@ import { VARIANTS_REQUIRING_POSTHOG_CLI, type SkillVariant, } from './detect.js'; -import { getContentBlocks } from '../../ui/tui/decks/error-tracking-upload-source-maps/index.js'; +import { getContentBlocks } from '../../tui/programs/shared/deck/source-maps.js'; import { preinstallPostHogCliOnce } from '@programs/shared/posthog-cli-preinstall'; const REPORT_FILE = 'posthog-source-maps-report.md'; @@ -136,7 +136,7 @@ export const errorTrackingUploadSourceMapsConfig: ProgramConfig = { }, }; -export { ERROR_TRACKING_UPLOAD_SOURCE_MAPS_PROGRAM } from './steps.js'; +export { ERROR_TRACKING_UPLOAD_SOURCE_MAPS_PROGRAM } from '../../tui/programs/error-tracking-upload-source-maps/flow.js'; export { detectSourceMapsPrerequisites, SOURCE_MAPS_ABORT_CASES, diff --git a/src/programs/__tests__/error-tracking.test.ts b/src/programs/error-tracking/__tests__/error-tracking.test.ts similarity index 98% rename from src/programs/__tests__/error-tracking.test.ts rename to src/programs/error-tracking/__tests__/error-tracking.test.ts index 339ddb4ae..a81e8262c 100644 --- a/src/programs/__tests__/error-tracking.test.ts +++ b/src/programs/error-tracking/__tests__/error-tracking.test.ts @@ -5,7 +5,7 @@ import { Integration } from '@shared/constants'; import type { AgenticDetectionReport } from '@programs/detection/agentic'; import { detectFramework } from '@programs/detection/index'; import { ErrorCodes } from '@shared/errors'; -import { ERROR_TRACKING_TIPS } from '@ui/tui/decks/error-tracking/tips'; +import { ERROR_TRACKING_TIPS } from '@tui/programs/error-tracking/deck/tips'; import { ERROR_TRACKING_PROJECT_PATH_KEY, toErrorTrackingReport, @@ -22,7 +22,7 @@ import { scopeInstallDirToProject } from '@programs/detection/project-scope'; import { testCiRunnerContext, testRunnerContext, -} from '../../../test/runner-context'; +} from '../../../../test/runner-context'; import { analytics } from '@utils/analytics'; import { wizardAbort } from '@utils/wizard-abort'; diff --git a/src/programs/error-tracking/index.ts b/src/programs/error-tracking/index.ts index 48b145ebe..40ac00bf8 100644 --- a/src/programs/error-tracking/index.ts +++ b/src/programs/error-tracking/index.ts @@ -4,8 +4,8 @@ import { scopeInstallDirToProject } from '@programs/detection/project-scope'; import { FRAMEWORK_REGISTRY } from '@programs/frameworks/registry'; import type { ProgramRun } from '@programs/program-run'; import { AGENT_SKILL_STEPS } from '@programs/agent-skill/steps'; -import { getContentBlocks } from '@ui/tui/decks/error-tracking/index'; -import { getTips } from '@ui/tui/decks/error-tracking/tips'; +import { getContentBlocks } from '@tui/programs/error-tracking/deck/index'; +import { getTips } from '@tui/programs/error-tracking/deck/tips'; import { ERROR_TRACKING_UNSUPPORTED, errorTrackingProjectDir, diff --git a/src/programs/__tests__/mcp-analytics.test.ts b/src/programs/mcp-analytics/__tests__/mcp-analytics.test.ts similarity index 100% rename from src/programs/__tests__/mcp-analytics.test.ts rename to src/programs/mcp-analytics/__tests__/mcp-analytics.test.ts diff --git a/src/programs/metrics/index.ts b/src/programs/metrics/index.ts index c96612ae3..78d9d3ce0 100644 --- a/src/programs/metrics/index.ts +++ b/src/programs/metrics/index.ts @@ -1,6 +1,6 @@ import type { ProgramConfig, ProgramStep } from '@programs/program-step'; import { AGENT_SKILL_STEPS } from '@programs/agent-skill/index'; -import { getContentBlocks } from '@ui/tui/decks/agent-skill/index'; +import { getContentBlocks } from '@tui/programs/shared/skill-deck'; const METRICS_STEPS: ProgramStep[] = AGENT_SKILL_STEPS.map((step) => step.id === 'intro' ? { ...step, screenId: 'metrics-intro' } : step, diff --git a/src/programs/migration/index.ts b/src/programs/migration/index.ts index 907160f6d..5f893f5c3 100644 --- a/src/programs/migration/index.ts +++ b/src/programs/migration/index.ts @@ -1,8 +1,8 @@ import type { ProgramConfig } from '@programs/program-step'; import type { AbortCase } from '@agent/types'; import { WIZARD_TOOL_NAMES } from '@agent'; -import { MIGRATION_PROGRAM } from './steps.js'; -import { getContentBlocks } from '../../ui/tui/decks/migration/index.js'; +import { MIGRATION_PROGRAM } from '../../tui/programs/migration/flow.js'; +import { getContentBlocks } from '../../tui/programs/migration/deck/index.js'; const MIGRATION_REPORT_FILE = 'migration-report.md'; @@ -54,4 +54,4 @@ export const migrationConfig: ProgramConfig = { requires: ['posthog-integration'], }; -export { MIGRATION_PROGRAM } from './steps.js'; +export { MIGRATION_PROGRAM } from '../../tui/programs/migration/flow.js'; diff --git a/src/shared/utils/__tests__/oauth-refresh.test.ts b/src/programs/oauth/__tests__/refresh.test.ts similarity index 86% rename from src/shared/utils/__tests__/oauth-refresh.test.ts rename to src/programs/oauth/__tests__/refresh.test.ts index 525ea9400..89528cd77 100644 --- a/src/shared/utils/__tests__/oauth-refresh.test.ts +++ b/src/programs/oauth/__tests__/refresh.test.ts @@ -4,11 +4,14 @@ import { POSTHOG_PROXY_CLIENT_ID } from '@shared/constants'; vi.mock('axios'); // No base-URL override resolves to prod routing (kills IS_DEV's implicit localhost). -vi.mock('../urls', async (importOriginal) => ({ - ...(await importOriginal()), +vi.mock('../../../shared/utils/urls', async (importOriginal) => ({ + ...(await importOriginal()), resolveBaseUrl: (baseUrl?: string) => baseUrl, })); -vi.mock('../debug', () => ({ logToFile: vi.fn(), setDebugSink: vi.fn() })); +vi.mock('../../../shared/utils/debug', () => ({ + logToFile: vi.fn(), + setDebugSink: vi.fn(), +})); const mockedAxios = axios as Mocked; diff --git a/src/programs/posthog-doctor/index.ts b/src/programs/posthog-doctor/index.ts index f5a7c5f96..13d8f749c 100644 --- a/src/programs/posthog-doctor/index.ts +++ b/src/programs/posthog-doctor/index.ts @@ -13,11 +13,14 @@ export const posthogDoctorConfig: ProgramConfig = { }; export { POSTHOG_DOCTOR_PROGRAM } from './steps.js'; -export { fetchHealthIssues } from './fetch.js'; -export { getKindMeta, KIND_METADATA } from './kind-metadata.js'; -export type { KindMeta } from './kind-metadata.js'; +export { fetchHealthIssues } from '../../tools/doctor/fetch.js'; +export { + getKindMeta, + KIND_METADATA, +} from '../../tools/doctor/kind-metadata.js'; +export type { KindMeta } from '../../tools/doctor/kind-metadata.js'; export type { HealthIssue, HealthIssueSeverity, HealthIssueSummary, -} from './types.js'; +} from '../../tools/doctor/types.js'; diff --git a/src/programs/posthog-doctor/steps.ts b/src/programs/posthog-doctor/steps.ts index 3a97bc42a..2e4700d8f 100644 --- a/src/programs/posthog-doctor/steps.ts +++ b/src/programs/posthog-doctor/steps.ts @@ -1,5 +1,5 @@ import type { ProgramStep } from '@programs/program-step'; -import { HEALTH_CHECK_STEP } from '@programs/shared/health-check-step'; +import { HEALTH_CHECK_STEP } from '@tui/programs/shared/health-check-step'; export const POSTHOG_DOCTOR_PROGRAM: ProgramStep[] = [ { diff --git a/src/programs/__tests__/helpers/integration-prompt.no-jest.ts b/src/programs/posthog-integration/__tests__/helpers/integration-prompt.no-jest.ts similarity index 96% rename from src/programs/__tests__/helpers/integration-prompt.no-jest.ts rename to src/programs/posthog-integration/__tests__/helpers/integration-prompt.no-jest.ts index 4958f65f2..4caac5505 100644 --- a/src/programs/__tests__/helpers/integration-prompt.no-jest.ts +++ b/src/programs/posthog-integration/__tests__/helpers/integration-prompt.no-jest.ts @@ -8,7 +8,7 @@ import { posthogIntegrationConfig } from '@programs/posthog-integration/index'; import { DETECTED_WAREHOUSE_SOURCES_KEY } from '@programs/warehouse-source/detect'; import { buildSession, type WizardSession } from '@lib/wizard-session'; import type { DetectedSource } from '@programs/warehouse-sources/types'; -import { testRunnerContext } from '../../../../test/runner-context'; +import { testRunnerContext } from '../../../../../test/runner-context'; export const CREDENTIALS = { accessToken: 'tok', diff --git a/src/programs/__tests__/posthog-integration-prompt.test.ts b/src/programs/posthog-integration/__tests__/prompt.test.ts similarity index 100% rename from src/programs/__tests__/posthog-integration-prompt.test.ts rename to src/programs/posthog-integration/__tests__/prompt.test.ts diff --git a/src/programs/__tests__/warehouse-seed-task.test.ts b/src/programs/posthog-integration/__tests__/warehouse-seed-task.test.ts similarity index 100% rename from src/programs/__tests__/warehouse-seed-task.test.ts rename to src/programs/posthog-integration/__tests__/warehouse-seed-task.test.ts diff --git a/src/programs/__tests__/warehouse-suggestion.test.ts b/src/programs/posthog-integration/__tests__/warehouse-suggestion.test.ts similarity index 100% rename from src/programs/__tests__/warehouse-suggestion.test.ts rename to src/programs/posthog-integration/__tests__/warehouse-suggestion.test.ts diff --git a/src/programs/posthog-integration/index.ts b/src/programs/posthog-integration/index.ts index 593f5954a..4b30e1246 100644 --- a/src/programs/posthog-integration/index.ts +++ b/src/programs/posthog-integration/index.ts @@ -28,7 +28,7 @@ import { openTrackedLink, withUtm } from '@utils/links'; import type { HostResolution } from '@shared/host-resolution'; import { getDetectedWarehouseSources } from '@programs/warehouse-source/detect'; import { POSTHOG_INTEGRATION_PROGRAM } from './steps.js'; -import { getContentBlocks } from '../../ui/tui/decks/posthog-integration/index.js'; +import { getContentBlocks } from '../../tui/programs/posthog-integration/deck/index.js'; import { buildCodingAgentPrompt } from './handoff.js'; import { EVENT_PLAN_FILE } from './constants.js'; diff --git a/src/programs/posthog-integration/steps.ts b/src/programs/posthog-integration/steps.ts index 3c4e9dc5b..c59755dda 100644 --- a/src/programs/posthog-integration/steps.ts +++ b/src/programs/posthog-integration/steps.ts @@ -9,8 +9,8 @@ import type { ProgramStep } from '@programs/program-step'; import type { WizardSession } from '@lib/wizard-session'; import { RunPhase } from '@lib/wizard-session'; -import { HEALTH_CHECK_STEP } from '@programs/shared/health-check-step'; -import { detectPostHogIntegration } from './detect.js'; +import { HEALTH_CHECK_STEP } from '@tui/programs/shared/health-check-step'; +import { detectPostHogIntegration } from '../detection/integration.js'; function needsSetup(session: WizardSession): boolean { const config = session.frameworkConfig; diff --git a/src/steps/upload-environment-variables/providers/__tests__/vercel.test.ts b/src/programs/posthog-integration/upload-environment-variables/providers/__tests__/vercel.test.ts similarity index 96% rename from src/steps/upload-environment-variables/providers/__tests__/vercel.test.ts rename to src/programs/posthog-integration/upload-environment-variables/providers/__tests__/vercel.test.ts index 97c8f73b1..49e989634 100644 --- a/src/steps/upload-environment-variables/providers/__tests__/vercel.test.ts +++ b/src/programs/posthog-integration/upload-environment-variables/providers/__tests__/vercel.test.ts @@ -1,4 +1,4 @@ -import { VercelEnvironmentProvider } from '@steps/upload-environment-variables/providers/vercel'; +import { VercelEnvironmentProvider } from '@programs/posthog-integration/upload-environment-variables/providers/vercel'; import * as fs from 'fs'; import * as child_process from 'child_process'; diff --git a/src/steps/upload-environment-variables/providers/vercel.ts b/src/programs/posthog-integration/upload-environment-variables/providers/vercel.ts similarity index 100% rename from src/steps/upload-environment-variables/providers/vercel.ts rename to src/programs/posthog-integration/upload-environment-variables/providers/vercel.ts diff --git a/src/steps/upload-environment-variables/index.ts b/src/programs/posthog-integration/upload-environment-variables/upload-step.ts similarity index 93% rename from src/steps/upload-environment-variables/index.ts rename to src/programs/posthog-integration/upload-environment-variables/upload-step.ts index 51b61bc22..07fd762b0 100644 --- a/src/steps/upload-environment-variables/index.ts +++ b/src/programs/posthog-integration/upload-environment-variables/upload-step.ts @@ -3,7 +3,7 @@ import { withProgress } from '@utils/telemetry'; import { analytics } from '@utils/analytics'; import { getUI } from '@ui'; import type { WizardSession } from '@lib/wizard-session'; -import { EnvironmentProvider } from './EnvironmentProvider'; +import { EnvironmentProvider } from '../../../steps/upload-environment-variables/EnvironmentProvider'; import { VercelEnvironmentProvider } from './providers/vercel'; export const uploadEnvironmentVariablesStep = async ( diff --git a/src/programs/program-registry.ts b/src/programs/program-registry.ts index be63b4b8a..a3baa1bf7 100644 --- a/src/programs/program-registry.ts +++ b/src/programs/program-registry.ts @@ -16,7 +16,7 @@ import { posthogIntegrationConfig } from './posthog-integration/index.js'; import { revenueAnalyticsConfig } from './revenue-analytics/index.js'; import { warehouseSourceConfig } from './warehouse-source/index.js'; import { auditConfig } from './audit/index.js'; -import { eventsAuditConfig } from './events-audit/index.js'; +import { eventsAuditConfig } from './audit/events/config.js'; import { posthogDoctorConfig } from './posthog-doctor/index.js'; import { webAnalyticsDoctorConfig } from './web-analytics-doctor/index.js'; import { migrationConfig } from './migration/index.js'; @@ -24,7 +24,7 @@ import { errorTrackingUploadSourceMapsConfig } from './error-tracking-upload-sou import { errorTrackingConfig } from './error-tracking/index.js'; import { selfDrivingConfig } from './self-driving/index.js'; import { AGENT_SKILL_STEPS } from './agent-skill/index.js'; -import { getContentBlocks as agentSkillContentBlocks } from '../ui/tui/decks/agent-skill/index.js'; +import { getContentBlocks as agentSkillContentBlocks } from '../tui/programs/shared/skill-deck.js'; import { mcpAddConfig, mcpRemoveConfig, diff --git a/src/programs/program-step.ts b/src/programs/program-step.ts index c1274f3b9..f117556f6 100644 --- a/src/programs/program-step.ts +++ b/src/programs/program-step.ts @@ -7,9 +7,9 @@ import type { WizardReadinessResult } from '@shared/health-checks/readiness'; import type { ProgramRun } from '@programs/program-run'; import type { Integration } from '@shared/constants'; import type { FrameworkConfig } from '@programs/framework-config'; -import type { ContentBlock } from '@ui/tui/primitives/index'; +import type { ContentBlock } from '@tui/primitives/index'; import type { WizardStore } from '@ui/tui/store'; -import type { Tip } from '@ui/tui/components/TipsCard'; +import type { Tip } from '@tui/components/TipsCard'; // Type-only — erased at compile time, so no runtime cycle with the // registry that imports `ProgramConfig` back from this module. import type { ProgramId } from './program-registry.js'; diff --git a/src/programs/__tests__/replay-vision.test.ts b/src/programs/replay-vision/__tests__/replay-vision.test.ts similarity index 100% rename from src/programs/__tests__/replay-vision.test.ts rename to src/programs/replay-vision/__tests__/replay-vision.test.ts diff --git a/src/programs/replay-vision/index.ts b/src/programs/replay-vision/index.ts index 3f76c9899..7dab32288 100644 --- a/src/programs/replay-vision/index.ts +++ b/src/programs/replay-vision/index.ts @@ -9,7 +9,7 @@ import type { CiRunnerContext } from '@programs/runner-context'; import { FRAMEWORK_REGISTRY } from '@programs/frameworks/registry'; import { createSkillProgram } from '@programs/agent-skill/index'; import { AGENT_SKILL_STEPS } from '@programs/agent-skill/steps'; -import { detectPostHogIntegration } from '@programs/posthog-integration/detect'; +import { detectPostHogIntegration } from '@programs/detection/integration'; import type { ProgramConfig, ProgramReadyContext, diff --git a/src/programs/__tests__/revenue-analytics-detect.test.ts b/src/programs/revenue-analytics/__tests__/detect.test.ts similarity index 100% rename from src/programs/__tests__/revenue-analytics-detect.test.ts rename to src/programs/revenue-analytics/__tests__/detect.test.ts diff --git a/src/programs/revenue-analytics/index.ts b/src/programs/revenue-analytics/index.ts index 4fae357ac..448acf7fe 100644 --- a/src/programs/revenue-analytics/index.ts +++ b/src/programs/revenue-analytics/index.ts @@ -2,7 +2,7 @@ import type { ProgramConfig } from '@programs/program-step'; import { WIZARD_TOOL_NAMES } from '@agent'; import { REVENUE_ANALYTICS_PROGRAM } from './steps.js'; import { REVENUE_ABORT_CASES } from './detect.js'; -import { getContentBlocks } from '../../ui/tui/decks/revenue-analytics/index.js'; +import { getContentBlocks } from '../../tui/programs/revenue-analytics/deck/index.js'; export const revenueAnalyticsConfig: ProgramConfig = { command: 'revenue-analytics', diff --git a/src/programs/revenue-analytics/steps.ts b/src/programs/revenue-analytics/steps.ts index b53926536..770aaeaf7 100644 --- a/src/programs/revenue-analytics/steps.ts +++ b/src/programs/revenue-analytics/steps.ts @@ -7,7 +7,7 @@ import type { ProgramStep } from '@programs/program-step'; import { RunPhase } from '@lib/wizard-session'; -import { HEALTH_CHECK_STEP } from '@programs/shared/health-check-step'; +import { HEALTH_CHECK_STEP } from '@tui/programs/shared/health-check-step'; import { detectRevenuePrerequisites } from './detect.js'; export const REVENUE_ANALYTICS_PROGRAM: ProgramStep[] = [ diff --git a/src/programs/run-program.ts b/src/programs/run-program.ts index 6c36aa9cd..a4b1a7796 100644 --- a/src/programs/run-program.ts +++ b/src/programs/run-program.ts @@ -31,7 +31,7 @@ import { type CredentialsProvider, type ResolvedProgramCredentials, } from './credentials'; -import { stampAiSdkDetected } from './posthog-integration/ai-sdk-stamp'; +import { stampAiSdkDetected } from './detection/ai-sdk-stamp'; import { ProgramStore, type ProgramDiagnostic, diff --git a/src/programs/__tests__/self-driving-detect.test.ts b/src/programs/self-driving/__tests__/detect.test.ts similarity index 99% rename from src/programs/__tests__/self-driving-detect.test.ts rename to src/programs/self-driving/__tests__/detect.test.ts index 587354918..6a384f75a 100644 --- a/src/programs/__tests__/self-driving-detect.test.ts +++ b/src/programs/self-driving/__tests__/detect.test.ts @@ -25,7 +25,7 @@ import { import { Integration } from '@shared/constants'; import { WIZARD_TOOL_NAMES } from '@agent/tools'; import { buildSession } from '@lib/wizard-session'; -import { testRunnerContext } from '../../../test/runner-context'; +import { testRunnerContext } from '../../../../test/runner-context'; import type { Mock } from 'vitest'; function makeTmpDir(): string { diff --git a/src/programs/__tests__/self-driving-prompt.test.ts b/src/programs/self-driving/__tests__/prompt.test.ts similarity index 100% rename from src/programs/__tests__/self-driving-prompt.test.ts rename to src/programs/self-driving/__tests__/prompt.test.ts diff --git a/src/programs/self-driving/index.ts b/src/programs/self-driving/index.ts index b43e00fce..06a7e3a0e 100644 --- a/src/programs/self-driving/index.ts +++ b/src/programs/self-driving/index.ts @@ -4,20 +4,16 @@ import type { ProgramConfig } from '@programs/program-step'; import type { ProgramRun } from '@programs/program-run'; import { OutroKind, type WizardSession } from '@lib/wizard-session'; import { createSkillProgram } from '../agent-skill/index.js'; -import { SELF_DRIVING_PROGRAM } from './steps.js'; +import { SELF_DRIVING_PROGRAM } from '../../tui/programs/self-driving/flow.js'; import { SELF_DRIVING_ABORT_CASES, getSelfDrivingDetectedTools, } from './detect.js'; import { buildSelfDrivingPrompt } from './prompt.js'; import { resolveSelfDrivingStepKey } from './step-keys.js'; -import { - NO_DEFAULT_LIMIT, - PRICE_PER_PR_USD, - PRICING_LONG, -} from '../../ui/tui/decks/self-driving/pricing.js'; -import { getTips } from '../../ui/tui/decks/self-driving/tips.js'; -import { getContentBlocks } from '../../ui/tui/decks/self-driving/index.js'; +import { NO_DEFAULT_LIMIT, PRICE_PER_PR_USD, PRICING_LONG } from './pricing.js'; +import { getTips } from '../../tui/programs/self-driving/deck/tips.js'; +import { getContentBlocks } from '../../tui/programs/self-driving/deck/index.js'; export const SELF_DRIVING_SKILL_ID = 'self-driving-setup'; const REPORT_FILE = 'posthog-self-driving-report.md'; @@ -132,7 +128,7 @@ export const selfDrivingConfig: ProgramConfig = { getContentBlocks, }; -export { SELF_DRIVING_PROGRAM } from './steps.js'; +export { SELF_DRIVING_PROGRAM } from '../../tui/programs/self-driving/flow.js'; export { detectSelfDrivingPrerequisites, SELF_DRIVING_ABORT_CASES, diff --git a/src/ui/tui/decks/self-driving/pricing.ts b/src/programs/self-driving/pricing.ts similarity index 100% rename from src/ui/tui/decks/self-driving/pricing.ts rename to src/programs/self-driving/pricing.ts diff --git a/src/programs/task-stream/__tests__/audit-areas.test.ts b/src/programs/session/task-stream/__tests__/audit-areas.test.ts similarity index 94% rename from src/programs/task-stream/__tests__/audit-areas.test.ts rename to src/programs/session/task-stream/__tests__/audit-areas.test.ts index 02c989f9c..a6da0e9e0 100644 --- a/src/programs/task-stream/__tests__/audit-areas.test.ts +++ b/src/programs/session/task-stream/__tests__/audit-areas.test.ts @@ -1,8 +1,8 @@ import { rollUpAuditAreas, MAX_AUDIT_AREAS, -} from '@programs/task-stream/audit-areas'; -import { StreamTaskStatus } from '@programs/task-stream/types'; +} from '@programs/session/task-stream/audit-areas'; +import { StreamTaskStatus } from '@programs/session/task-stream/types'; import type { AuditCheck } from '@programs/audit/types'; const check = (over: Partial): AuditCheck => ({ diff --git a/src/programs/task-stream/__tests__/event-plan-watcher.test.ts b/src/programs/session/task-stream/__tests__/event-plan-watcher.test.ts similarity index 98% rename from src/programs/task-stream/__tests__/event-plan-watcher.test.ts rename to src/programs/session/task-stream/__tests__/event-plan-watcher.test.ts index af68b9838..961d73cb5 100644 --- a/src/programs/task-stream/__tests__/event-plan-watcher.test.ts +++ b/src/programs/session/task-stream/__tests__/event-plan-watcher.test.ts @@ -10,7 +10,7 @@ import { join } from 'node:path'; import { EventPlanWatcher, normalizeEventPlan, -} from '@programs/task-stream/event-plan-watcher'; +} from '@programs/session/task-stream/event-plan-watcher'; import { EVENT_PLAN_FILE } from '@programs/posthog-integration/constants'; import type { PlannedEvent, WizardStore } from '@ui/tui/store'; diff --git a/src/programs/task-stream/__tests__/file-destination.test.ts b/src/programs/session/task-stream/__tests__/file-destination.test.ts similarity index 96% rename from src/programs/task-stream/__tests__/file-destination.test.ts rename to src/programs/session/task-stream/__tests__/file-destination.test.ts index f86700e8d..1ba4caff1 100644 --- a/src/programs/task-stream/__tests__/file-destination.test.ts +++ b/src/programs/session/task-stream/__tests__/file-destination.test.ts @@ -4,11 +4,11 @@ import { join } from 'node:path'; import { FileDestination, createFileDestination, -} from '@programs/task-stream/destinations/file'; +} from '@programs/session/task-stream/destinations/file'; import { StreamEvent, type TaskStreamUpdate, -} from '@programs/task-stream/types'; +} from '@programs/session/task-stream/types'; import { WIZARD_TASK_STREAM_FILE } from '@utils/paths'; import { RunPhase } from '@lib/wizard-session'; diff --git a/src/programs/task-stream/__tests__/posthog-destination.test.ts b/src/programs/session/task-stream/__tests__/posthog-destination.test.ts similarity index 99% rename from src/programs/task-stream/__tests__/posthog-destination.test.ts rename to src/programs/session/task-stream/__tests__/posthog-destination.test.ts index d7325ab50..46923c600 100644 --- a/src/programs/task-stream/__tests__/posthog-destination.test.ts +++ b/src/programs/session/task-stream/__tests__/posthog-destination.test.ts @@ -1,6 +1,6 @@ import { PostHogDestination } from '../destinations/posthog'; import { StreamEvent, type TaskStreamUpdate } from '../types'; -import { RunPhase, type Credentials } from '../../../lib/wizard-session'; +import { RunPhase, type Credentials } from '../../../../lib/wizard-session'; import { HostResolution } from '@shared/host-resolution'; const SAMPLE_CREDS: Credentials = { diff --git a/src/programs/task-stream/__tests__/task-stream-push.test.ts b/src/programs/session/task-stream/__tests__/task-stream-push.test.ts similarity index 99% rename from src/programs/task-stream/__tests__/task-stream-push.test.ts rename to src/programs/session/task-stream/__tests__/task-stream-push.test.ts index cfae3e18b..6340b8770 100644 --- a/src/programs/task-stream/__tests__/task-stream-push.test.ts +++ b/src/programs/session/task-stream/__tests__/task-stream-push.test.ts @@ -1,9 +1,12 @@ -import { TaskStreamPush } from '@programs/task-stream/task-stream-push'; -import { StreamEvent, StreamTaskStatus } from '@programs/task-stream/types'; +import { TaskStreamPush } from '@programs/session/task-stream/task-stream-push'; +import { + StreamEvent, + StreamTaskStatus, +} from '@programs/session/task-stream/types'; import type { TaskStreamDestination, TaskStreamUpdate, -} from '@programs/task-stream/types'; +} from '@programs/session/task-stream/types'; import type { WizardStore, TaskItem } from '@ui/tui/store'; import { TaskStatus } from '@ui/wizard-ui'; import { RunPhase, type PendingQuestion } from '@lib/wizard-session'; diff --git a/src/programs/task-stream/__tests__/wizard-run-sync.test.ts b/src/programs/session/task-stream/__tests__/wizard-run-sync.test.ts similarity index 100% rename from src/programs/task-stream/__tests__/wizard-run-sync.test.ts rename to src/programs/session/task-stream/__tests__/wizard-run-sync.test.ts diff --git a/src/programs/task-stream/audit-areas.ts b/src/programs/session/task-stream/audit-areas.ts similarity index 100% rename from src/programs/task-stream/audit-areas.ts rename to src/programs/session/task-stream/audit-areas.ts diff --git a/src/programs/task-stream/destinations/file.ts b/src/programs/session/task-stream/destinations/file.ts similarity index 98% rename from src/programs/task-stream/destinations/file.ts rename to src/programs/session/task-stream/destinations/file.ts index c082c6d36..3c3a32938 100644 --- a/src/programs/task-stream/destinations/file.ts +++ b/src/programs/session/task-stream/destinations/file.ts @@ -16,7 +16,7 @@ import type { StreamEvent, TaskStreamDestination, TaskStreamUpdate, -} from '@programs/task-stream/types'; +} from '@programs/session/task-stream/types'; export interface FileDestinationOptions { path: string; diff --git a/src/programs/task-stream/destinations/posthog.ts b/src/programs/session/task-stream/destinations/posthog.ts similarity index 99% rename from src/programs/task-stream/destinations/posthog.ts rename to src/programs/session/task-stream/destinations/posthog.ts index 42238a138..7cfdd9b14 100644 --- a/src/programs/task-stream/destinations/posthog.ts +++ b/src/programs/session/task-stream/destinations/posthog.ts @@ -21,7 +21,7 @@ import type { TaskStreamDestination, TaskStreamUpdate, StreamEvent, -} from '@programs/task-stream/types'; +} from '@programs/session/task-stream/types'; import type { Credentials } from '@lib/wizard-session'; import { logToFile } from '@utils/debug'; diff --git a/src/programs/task-stream/event-plan-watcher.ts b/src/programs/session/task-stream/event-plan-watcher.ts similarity index 98% rename from src/programs/task-stream/event-plan-watcher.ts rename to src/programs/session/task-stream/event-plan-watcher.ts index d04cee77c..3abac9c14 100644 --- a/src/programs/task-stream/event-plan-watcher.ts +++ b/src/programs/session/task-stream/event-plan-watcher.ts @@ -3,7 +3,7 @@ import { startFileWatcher, type FileWatcherHandle, type FileWatcherOptions, -} from '@lib/file-watcher'; +} from '@shared/utils/file-watcher'; const MAX_EVENT_PLAN_FILE_BYTES = 256 * 1024; const MAX_EVENT_COUNT = 50; diff --git a/src/programs/task-stream/task-stream-push.ts b/src/programs/session/task-stream/task-stream-push.ts similarity index 100% rename from src/programs/task-stream/task-stream-push.ts rename to src/programs/session/task-stream/task-stream-push.ts diff --git a/src/programs/task-stream/types.ts b/src/programs/session/task-stream/types.ts similarity index 100% rename from src/programs/task-stream/types.ts rename to src/programs/session/task-stream/types.ts diff --git a/src/programs/task-stream/wizard-run-sync.ts b/src/programs/session/task-stream/wizard-run-sync.ts similarity index 100% rename from src/programs/task-stream/wizard-run-sync.ts rename to src/programs/session/task-stream/wizard-run-sync.ts diff --git a/src/programs/shared/posthog-cli-preinstall.ts b/src/programs/shared/posthog-cli-preinstall.ts index 9c48965dc..3557fa2f6 100644 --- a/src/programs/shared/posthog-cli-preinstall.ts +++ b/src/programs/shared/posthog-cli-preinstall.ts @@ -9,7 +9,7 @@ */ import type { RunnerContext } from '@programs/runner-context'; -import { installOrUpdatePostHogCli } from '@steps/install-cli-steering'; +import { installOrUpdatePostHogCli } from '@shared/install-cli-steering'; import { analytics } from '@utils/analytics'; let attempted = false; diff --git a/src/programs/task-stream/index.ts b/src/programs/task-stream/index.ts index a8dc7625e..c0e8aa948 100644 --- a/src/programs/task-stream/index.ts +++ b/src/programs/task-stream/index.ts @@ -2,18 +2,24 @@ * Task-stream — push wizard run state to external consumers. */ -export { TaskStreamPush } from './task-stream-push'; -export type { TaskStreamPushOptions } from './task-stream-push'; +export { TaskStreamPush } from '../session/task-stream/task-stream-push'; +export type { TaskStreamPushOptions } from '../session/task-stream/task-stream-push'; -export { PostHogDestination } from './destinations/posthog'; -export { FileDestination, createFileDestination } from './destinations/file'; +export { PostHogDestination } from '../session/task-stream/destinations/posthog'; +export { + FileDestination, + createFileDestination, +} from '../session/task-stream/destinations/file'; -export { rollUpAuditAreas, MAX_AUDIT_AREAS } from './audit-areas'; +export { + rollUpAuditAreas, + MAX_AUDIT_AREAS, +} from '../session/task-stream/audit-areas'; -export { StreamTaskStatus, StreamEvent } from './types'; +export { StreamTaskStatus, StreamEvent } from '../session/task-stream/types'; export type { TaskStreamUpdate, TaskStreamDestination, StreamTask, TaskStreamError, -} from './types'; +} from '../session/task-stream/types'; diff --git a/src/programs/__tests__/warehouse-ask-timeout.test.ts b/src/programs/warehouse-source/__tests__/ask-timeout.test.ts similarity index 95% rename from src/programs/__tests__/warehouse-ask-timeout.test.ts rename to src/programs/warehouse-source/__tests__/ask-timeout.test.ts index a1c1414f5..eb16ab766 100644 --- a/src/programs/__tests__/warehouse-ask-timeout.test.ts +++ b/src/programs/warehouse-source/__tests__/ask-timeout.test.ts @@ -8,7 +8,7 @@ * user a quarter of the time the in-run prompt does for identical questions. */ import type { WizardSession } from '@lib/wizard-session'; -import { testRunnerContext } from '../../../test/runner-context'; +import { testRunnerContext } from '../../../../test/runner-context'; vi.mock('@utils/analytics', () => ({ analytics: { diff --git a/src/programs/warehouse-source/index.ts b/src/programs/warehouse-source/index.ts index fb23dd28c..136624a1f 100644 --- a/src/programs/warehouse-source/index.ts +++ b/src/programs/warehouse-source/index.ts @@ -7,7 +7,7 @@ import { WAREHOUSE_ABORT_CASES, getDetectedWarehouseSources, } from './detect.js'; -import { getContentBlocks } from '../../ui/tui/decks/warehouse-source/index.js'; +import { getContentBlocks } from '../../tui/programs/warehouse-source/deck/index.js'; /** * Inject the detected sources (and their creation mode) into the prompt so the diff --git a/src/programs/__tests__/web-analytics-doctor-detect.test.ts b/src/programs/web-analytics-doctor/__tests__/detect.test.ts similarity index 100% rename from src/programs/__tests__/web-analytics-doctor-detect.test.ts rename to src/programs/web-analytics-doctor/__tests__/detect.test.ts diff --git a/src/agent/__tests__/agent-runner-ask.test.ts b/src/shared/__tests__/ask-policy.test.ts similarity index 100% rename from src/agent/__tests__/agent-runner-ask.test.ts rename to src/shared/__tests__/ask-policy.test.ts diff --git a/src/shared/errors/index.ts b/src/shared/errors/index.ts index c617753c7..3f820a239 100644 --- a/src/shared/errors/index.ts +++ b/src/shared/errors/index.ts @@ -8,7 +8,7 @@ export { ERROR_CATALOG } from './catalog'; export { WizardError } from './wizard-error'; export type { ErrorCatalogEntry, ErrorGroup, RetryAdvice } from './types'; export { classifyAuthFailure, type AuthFailureInput } from './auth'; -export { skillErrorCode } from './skill-map'; +export { skillErrorCode } from '../../agent/runner/shared/skill-error-code'; export { PHW_ERROR_PREFIX, emitWizardError, diff --git a/src/lib/headless-mode.ts b/src/shared/headless-mode.ts similarity index 100% rename from src/lib/headless-mode.ts rename to src/shared/headless-mode.ts diff --git a/src/steps/install-cli-steering/__tests__/install-cli-steering.test.ts b/src/shared/install-cli-steering/__tests__/install-cli-steering.test.ts similarity index 99% rename from src/steps/install-cli-steering/__tests__/install-cli-steering.test.ts rename to src/shared/install-cli-steering/__tests__/install-cli-steering.test.ts index b87d0cbc9..6658f31f0 100644 --- a/src/steps/install-cli-steering/__tests__/install-cli-steering.test.ts +++ b/src/shared/install-cli-steering/__tests__/install-cli-steering.test.ts @@ -10,7 +10,7 @@ import { findTarget, installOrUpdatePostHogCli, installSteeringSnippet, -} from '@steps/install-cli-steering'; +} from '@shared/install-cli-steering'; vi.mock('@utils/debug'); vi.mock('node:child_process', () => ({ diff --git a/src/steps/install-cli-steering/index.ts b/src/shared/install-cli-steering/index.ts similarity index 100% rename from src/steps/install-cli-steering/index.ts rename to src/shared/install-cli-steering/index.ts diff --git a/src/steps/add-mcp-server-to-clients/MCPClient.ts b/src/shared/mcp-clients/MCPClient.ts similarity index 100% rename from src/steps/add-mcp-server-to-clients/MCPClient.ts rename to src/shared/mcp-clients/MCPClient.ts diff --git a/src/steps/add-mcp-server-to-clients/__tests__/defaults.test.ts b/src/shared/mcp-clients/__tests__/defaults.test.ts similarity index 97% rename from src/steps/add-mcp-server-to-clients/__tests__/defaults.test.ts rename to src/shared/mcp-clients/__tests__/defaults.test.ts index c20b8f53b..a56ad91b3 100644 --- a/src/steps/add-mcp-server-to-clients/__tests__/defaults.test.ts +++ b/src/shared/mcp-clients/__tests__/defaults.test.ts @@ -2,7 +2,7 @@ import { buildMCPUrl, getDefaultServerConfig, getNativeHTTPServerConfig, -} from '@steps/add-mcp-server-to-clients/defaults'; +} from '@shared/mcp-clients/defaults'; describe('defaults', () => { describe('buildMCPUrl', () => { diff --git a/src/steps/add-mcp-server-to-clients/__tests__/mcp-client.test.ts b/src/shared/mcp-clients/__tests__/mcp-client.test.ts similarity index 96% rename from src/steps/add-mcp-server-to-clients/__tests__/mcp-client.test.ts rename to src/shared/mcp-clients/__tests__/mcp-client.test.ts index 82b6aaea4..82dca59df 100644 --- a/src/steps/add-mcp-server-to-clients/__tests__/mcp-client.test.ts +++ b/src/shared/mcp-clients/__tests__/mcp-client.test.ts @@ -1,4 +1,4 @@ -import { DefaultMCPClient } from '@steps/add-mcp-server-to-clients/MCPClient'; +import { DefaultMCPClient } from '@shared/mcp-clients/MCPClient'; import * as fs from 'fs'; vi.mock('fs', () => ({ diff --git a/src/steps/add-mcp-server-to-clients/__tests__/results.test.ts b/src/shared/mcp-clients/__tests__/results.test.ts similarity index 99% rename from src/steps/add-mcp-server-to-clients/__tests__/results.test.ts rename to src/shared/mcp-clients/__tests__/results.test.ts index 37b710938..7df81887a 100644 --- a/src/steps/add-mcp-server-to-clients/__tests__/results.test.ts +++ b/src/shared/mcp-clients/__tests__/results.test.ts @@ -7,7 +7,7 @@ import { expectedFailureHint, summarizeFailure, toClientResult, -} from '@steps/add-mcp-server-to-clients/results'; +} from '@shared/mcp-clients/results'; describe('toClientResult', () => { it('maps a plain success to installed', () => { diff --git a/src/steps/add-mcp-server-to-clients/browser-client.ts b/src/shared/mcp-clients/browser-client.ts similarity index 100% rename from src/steps/add-mcp-server-to-clients/browser-client.ts rename to src/shared/mcp-clients/browser-client.ts diff --git a/src/steps/add-mcp-server-to-clients/clients/__tests__/claude-code.test.ts b/src/shared/mcp-clients/clients/__tests__/claude-code.test.ts similarity index 99% rename from src/steps/add-mcp-server-to-clients/clients/__tests__/claude-code.test.ts rename to src/shared/mcp-clients/clients/__tests__/claude-code.test.ts index e6c886a2a..f4c3f6e57 100644 --- a/src/steps/add-mcp-server-to-clients/clients/__tests__/claude-code.test.ts +++ b/src/shared/mcp-clients/clients/__tests__/claude-code.test.ts @@ -1,4 +1,4 @@ -import { ClaudeCodeMCPClient } from '@steps/add-mcp-server-to-clients/clients/claude-code'; +import { ClaudeCodeMCPClient } from '@shared/mcp-clients/clients/claude-code'; import { execSync, execFile } from 'child_process'; import { analytics } from '@utils/analytics'; diff --git a/src/steps/add-mcp-server-to-clients/clients/__tests__/claude-web.test.ts b/src/shared/mcp-clients/clients/__tests__/claude-web.test.ts similarity index 90% rename from src/steps/add-mcp-server-to-clients/clients/__tests__/claude-web.test.ts rename to src/shared/mcp-clients/clients/__tests__/claude-web.test.ts index 3455279cc..130d9f417 100644 --- a/src/steps/add-mcp-server-to-clients/clients/__tests__/claude-web.test.ts +++ b/src/shared/mcp-clients/clients/__tests__/claude-web.test.ts @@ -1,5 +1,5 @@ -import { ClaudeWebMCPClient } from '@steps/add-mcp-server-to-clients/clients/claude-web'; -import { isBrowserFinishable } from '@steps/add-mcp-server-to-clients/browser-client'; +import { ClaudeWebMCPClient } from '@shared/mcp-clients/clients/claude-web'; +import { isBrowserFinishable } from '@shared/mcp-clients/browser-client'; import { openTrackedLink } from '@utils/links'; vi.mock('@utils/links', () => ({ diff --git a/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.ts b/src/shared/mcp-clients/clients/__tests__/claude.test.ts similarity index 98% rename from src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.ts rename to src/shared/mcp-clients/clients/__tests__/claude.test.ts index 6e2cca39c..69e2bc298 100644 --- a/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.ts +++ b/src/shared/mcp-clients/clients/__tests__/claude.test.ts @@ -2,11 +2,11 @@ import * as fs from 'fs'; import * as path from 'path'; import * as os from 'os'; -import { ClaudeMCPClient } from '@steps/add-mcp-server-to-clients/clients/claude'; +import { ClaudeMCPClient } from '@shared/mcp-clients/clients/claude'; import { getDefaultServerConfig, DefaultMCPClientConfig, -} from '@steps/add-mcp-server-to-clients/defaults'; +} from '@shared/mcp-clients/defaults'; vi.mock('fs', () => ({ promises: { diff --git a/src/steps/add-mcp-server-to-clients/clients/__tests__/codex.test.ts b/src/shared/mcp-clients/clients/__tests__/codex.test.ts similarity index 99% rename from src/steps/add-mcp-server-to-clients/clients/__tests__/codex.test.ts rename to src/shared/mcp-clients/clients/__tests__/codex.test.ts index 52b8992b5..32d06a028 100644 --- a/src/steps/add-mcp-server-to-clients/clients/__tests__/codex.test.ts +++ b/src/shared/mcp-clients/clients/__tests__/codex.test.ts @@ -1,4 +1,4 @@ -import { CodexMCPClient } from '@steps/add-mcp-server-to-clients/clients/codex'; +import { CodexMCPClient } from '@shared/mcp-clients/clients/codex'; import { execSync, execFile } from 'node:child_process'; import * as fs from 'node:fs'; import { analytics } from '@utils/analytics'; diff --git a/src/steps/add-mcp-server-to-clients/clients/__tests__/opencode.test.ts b/src/shared/mcp-clients/clients/__tests__/opencode.test.ts similarity index 98% rename from src/steps/add-mcp-server-to-clients/clients/__tests__/opencode.test.ts rename to src/shared/mcp-clients/clients/__tests__/opencode.test.ts index 3b20c6b22..addfe8bdd 100644 --- a/src/steps/add-mcp-server-to-clients/clients/__tests__/opencode.test.ts +++ b/src/shared/mcp-clients/clients/__tests__/opencode.test.ts @@ -1,4 +1,4 @@ -import { OpenCodeMCPClient } from '@steps/add-mcp-server-to-clients/clients/opencode'; +import { OpenCodeMCPClient } from '@shared/mcp-clients/clients/opencode'; import { execSync } from 'node:child_process'; import * as fs from 'node:fs'; import * as os from 'node:os'; diff --git a/src/steps/add-mcp-server-to-clients/clients/claude-code.ts b/src/shared/mcp-clients/clients/claude-code.ts similarity index 98% rename from src/steps/add-mcp-server-to-clients/clients/claude-code.ts rename to src/shared/mcp-clients/clients/claude-code.ts index 13b2330f0..c86728ff0 100644 --- a/src/steps/add-mcp-server-to-clients/clients/claude-code.ts +++ b/src/shared/mcp-clients/clients/claude-code.ts @@ -1,18 +1,18 @@ -import { DefaultMCPClient } from '@steps/add-mcp-server-to-clients/MCPClient'; +import { DefaultMCPClient } from '@shared/mcp-clients/MCPClient'; import { DefaultMCPClientConfig, buildMCPUrl, -} from '@steps/add-mcp-server-to-clients/defaults'; +} from '@shared/mcp-clients/defaults'; import { PluginCapable, PluginInstallResult, -} from '@steps/add-mcp-server-to-clients/plugin-client'; +} from '@shared/mcp-clients/plugin-client'; import { redactSecrets, scrubHomePaths, type InstallResult, -} from '@steps/add-mcp-server-to-clients/results'; -import { LoginCapable } from '@steps/add-mcp-server-to-clients/login-client'; +} from '@shared/mcp-clients/results'; +import { LoginCapable } from '@shared/mcp-clients/login-client'; import { z } from 'zod'; import { execSync, execFile } from 'child_process'; import { analytics } from '@utils/analytics'; diff --git a/src/steps/add-mcp-server-to-clients/clients/claude-web.ts b/src/shared/mcp-clients/clients/claude-web.ts similarity index 88% rename from src/steps/add-mcp-server-to-clients/clients/claude-web.ts rename to src/shared/mcp-clients/clients/claude-web.ts index 2e34d779e..4f5c82a06 100644 --- a/src/steps/add-mcp-server-to-clients/clients/claude-web.ts +++ b/src/shared/mcp-clients/clients/claude-web.ts @@ -1,6 +1,6 @@ -import { MCPClient } from '@steps/add-mcp-server-to-clients/MCPClient'; -import type { InstallResult } from '@steps/add-mcp-server-to-clients/results'; -import { BrowserFinishable } from '@steps/add-mcp-server-to-clients/browser-client'; +import { MCPClient } from '@shared/mcp-clients/MCPClient'; +import type { InstallResult } from '@shared/mcp-clients/results'; +import { BrowserFinishable } from '@shared/mcp-clients/browser-client'; import { openTrackedLink } from '@utils/links'; /** diff --git a/src/steps/add-mcp-server-to-clients/clients/claude.ts b/src/shared/mcp-clients/clients/claude.ts similarity index 87% rename from src/steps/add-mcp-server-to-clients/clients/claude.ts rename to src/shared/mcp-clients/clients/claude.ts index f7db763f5..c3bee0ce5 100644 --- a/src/steps/add-mcp-server-to-clients/clients/claude.ts +++ b/src/shared/mcp-clients/clients/claude.ts @@ -1,7 +1,7 @@ -import { DefaultMCPClient } from '@steps/add-mcp-server-to-clients/MCPClient'; +import { DefaultMCPClient } from '@shared/mcp-clients/MCPClient'; import * as path from 'path'; import * as os from 'os'; -import { DefaultMCPClientConfig } from '@steps/add-mcp-server-to-clients/defaults'; +import { DefaultMCPClientConfig } from '@shared/mcp-clients/defaults'; import { runtimeEnv } from '@env'; import { z } from 'zod'; diff --git a/src/steps/add-mcp-server-to-clients/clients/codex.ts b/src/shared/mcp-clients/clients/codex.ts similarity index 98% rename from src/steps/add-mcp-server-to-clients/clients/codex.ts rename to src/shared/mcp-clients/clients/codex.ts index 0736d9940..6f73b4d96 100644 --- a/src/steps/add-mcp-server-to-clients/clients/codex.ts +++ b/src/shared/mcp-clients/clients/codex.ts @@ -4,23 +4,23 @@ import * as fs from 'node:fs'; import * as os from 'node:os'; import * as path from 'node:path'; -import { LoginCapable } from '@steps/add-mcp-server-to-clients/login-client'; -import { DefaultMCPClient } from '@steps/add-mcp-server-to-clients/MCPClient'; +import { LoginCapable } from '@shared/mcp-clients/login-client'; +import { DefaultMCPClient } from '@shared/mcp-clients/MCPClient'; import { DefaultMCPClientConfig, buildMCPUrl, -} from '@steps/add-mcp-server-to-clients/defaults'; +} from '@shared/mcp-clients/defaults'; import { PluginCapable, PluginInstallResult, -} from '@steps/add-mcp-server-to-clients/plugin-client'; +} from '@shared/mcp-clients/plugin-client'; import { redactSecrets, scrubHomePaths, expectedFailureHint, type ExpectedFailure, type InstallResult, -} from '@steps/add-mcp-server-to-clients/results'; +} from '@shared/mcp-clients/results'; import { analytics } from '@utils/analytics'; diff --git a/src/steps/add-mcp-server-to-clients/clients/cursor.ts b/src/shared/mcp-clients/clients/cursor.ts similarity index 89% rename from src/steps/add-mcp-server-to-clients/clients/cursor.ts rename to src/shared/mcp-clients/clients/cursor.ts index c13d18c12..4d7389ed6 100644 --- a/src/steps/add-mcp-server-to-clients/clients/cursor.ts +++ b/src/shared/mcp-clients/clients/cursor.ts @@ -1,13 +1,13 @@ import { DefaultMCPClient, MCPServerConfig, -} from '@steps/add-mcp-server-to-clients/MCPClient'; +} from '@shared/mcp-clients/MCPClient'; import * as path from 'path'; import * as os from 'os'; import { DefaultMCPClientConfig, getNativeHTTPServerConfig, -} from '@steps/add-mcp-server-to-clients/defaults'; +} from '@shared/mcp-clients/defaults'; import { z } from 'zod'; export const CursorMCPConfig = DefaultMCPClientConfig; diff --git a/src/steps/add-mcp-server-to-clients/clients/opencode.ts b/src/shared/mcp-clients/clients/opencode.ts similarity index 93% rename from src/steps/add-mcp-server-to-clients/clients/opencode.ts rename to src/shared/mcp-clients/clients/opencode.ts index a6485dbe3..7c2f29ce6 100644 --- a/src/steps/add-mcp-server-to-clients/clients/opencode.ts +++ b/src/shared/mcp-clients/clients/opencode.ts @@ -6,8 +6,8 @@ import { execSync } from 'node:child_process'; import { DefaultMCPClient, MCPServerConfig, -} from '@steps/add-mcp-server-to-clients/MCPClient'; -import { getNativeHTTPServerConfig } from '@steps/add-mcp-server-to-clients/defaults'; +} from '@shared/mcp-clients/MCPClient'; +import { getNativeHTTPServerConfig } from '@shared/mcp-clients/defaults'; import { runtimeEnv } from '@env'; export const OpenCodeMCPConfig = z diff --git a/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.ts b/src/shared/mcp-clients/clients/visual-studio-code.ts similarity index 93% rename from src/steps/add-mcp-server-to-clients/clients/visual-studio-code.ts rename to src/shared/mcp-clients/clients/visual-studio-code.ts index 4c82ded04..c26153899 100644 --- a/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.ts +++ b/src/shared/mcp-clients/clients/visual-studio-code.ts @@ -4,8 +4,8 @@ import * as os from 'os'; import { DefaultMCPClient, MCPServerConfig, -} from '@steps/add-mcp-server-to-clients/MCPClient'; -import { getNativeHTTPServerConfig } from '@steps/add-mcp-server-to-clients/defaults'; +} from '@shared/mcp-clients/MCPClient'; +import { getNativeHTTPServerConfig } from '@shared/mcp-clients/defaults'; import { runtimeEnv } from '@env'; export const VisualStudioCodeMCPConfig = z diff --git a/src/steps/add-mcp-server-to-clients/clients/zed.ts b/src/shared/mcp-clients/clients/zed.ts similarity index 93% rename from src/steps/add-mcp-server-to-clients/clients/zed.ts rename to src/shared/mcp-clients/clients/zed.ts index cfd0a7667..72ba51868 100644 --- a/src/steps/add-mcp-server-to-clients/clients/zed.ts +++ b/src/shared/mcp-clients/clients/zed.ts @@ -4,8 +4,8 @@ import * as os from 'os'; import { DefaultMCPClient, MCPServerConfig, -} from '@steps/add-mcp-server-to-clients/MCPClient'; -import { getNativeHTTPServerConfig } from '@steps/add-mcp-server-to-clients/defaults'; +} from '@shared/mcp-clients/MCPClient'; +import { getNativeHTTPServerConfig } from '@shared/mcp-clients/defaults'; import { runtimeEnv } from '@env'; export const ZedMCPConfig = z diff --git a/src/steps/add-mcp-server-to-clients/defaults.ts b/src/shared/mcp-clients/defaults.ts similarity index 100% rename from src/steps/add-mcp-server-to-clients/defaults.ts rename to src/shared/mcp-clients/defaults.ts diff --git a/src/steps/add-mcp-server-to-clients/login-client.ts b/src/shared/mcp-clients/login-client.ts similarity index 100% rename from src/steps/add-mcp-server-to-clients/login-client.ts rename to src/shared/mcp-clients/login-client.ts diff --git a/src/steps/add-mcp-server-to-clients/plugin-client.ts b/src/shared/mcp-clients/plugin-client.ts similarity index 100% rename from src/steps/add-mcp-server-to-clients/plugin-client.ts rename to src/shared/mcp-clients/plugin-client.ts diff --git a/src/steps/add-mcp-server-to-clients/results.ts b/src/shared/mcp-clients/results.ts similarity index 100% rename from src/steps/add-mcp-server-to-clients/results.ts rename to src/shared/mcp-clients/results.ts diff --git a/src/__tests__/clipboard.test.ts b/src/shared/utils/__tests__/clipboard.test.ts similarity index 100% rename from src/__tests__/clipboard.test.ts rename to src/shared/utils/__tests__/clipboard.test.ts diff --git a/src/__tests__/package-json.test.ts b/src/shared/utils/__tests__/package-json.test.ts similarity index 100% rename from src/__tests__/package-json.test.ts rename to src/shared/utils/__tests__/package-json.test.ts diff --git a/src/lib/file-watcher.ts b/src/shared/utils/file-watcher.ts similarity index 100% rename from src/lib/file-watcher.ts rename to src/shared/utils/file-watcher.ts diff --git a/src/steps/add-mcp-server-to-clients/index.ts b/src/steps/add-mcp-server-to-clients/index.ts index ec014851f..5a53dc7db 100644 --- a/src/steps/add-mcp-server-to-clients/index.ts +++ b/src/steps/add-mcp-server-to-clients/index.ts @@ -3,23 +3,26 @@ import type { CloudRegion } from '@utils/types'; import { withProgress } from '@utils/telemetry'; import { analytics } from '@utils/analytics'; import { getUI } from '@ui'; -import { MCPClient } from './MCPClient'; -import { CursorMCPClient } from './clients/cursor'; -import { ClaudeCodeMCPClient } from './clients/claude-code'; -import { ClaudeWebMCPClient } from './clients/claude-web'; -import { VisualStudioCodeClient } from './clients/visual-studio-code'; -import { ZedClient } from './clients/zed'; -import { CodexMCPClient } from './clients/codex'; -import { OpenCodeMCPClient } from './clients/opencode'; -import { ALL_FEATURE_VALUES } from './defaults'; +import { MCPClient } from '../../shared/mcp-clients/MCPClient'; +import { CursorMCPClient } from '../../shared/mcp-clients/clients/cursor'; +import { ClaudeCodeMCPClient } from '../../shared/mcp-clients/clients/claude-code'; +import { ClaudeWebMCPClient } from '../../shared/mcp-clients/clients/claude-web'; +import { VisualStudioCodeClient } from '../../shared/mcp-clients/clients/visual-studio-code'; +import { ZedClient } from '../../shared/mcp-clients/clients/zed'; +import { CodexMCPClient } from '../../shared/mcp-clients/clients/codex'; +import { OpenCodeMCPClient } from '../../shared/mcp-clients/clients/opencode'; +import { ALL_FEATURE_VALUES } from '../../shared/mcp-clients/defaults'; import { debug } from '@utils/debug'; -import { isPluginCapable, PluginCapable } from './plugin-client'; +import { + isPluginCapable, + PluginCapable, +} from '../../shared/mcp-clients/plugin-client'; import { McpClientStatus, namesWithStatus, toClientResult, type McpClientResult, -} from './results'; +} from '../../shared/mcp-clients/results'; export const getSupportedClients = async (): Promise => { const allClients = [ diff --git a/src/steps/index.ts b/src/steps/index.ts index fd6758c45..3d5e4d189 100644 --- a/src/steps/index.ts +++ b/src/steps/index.ts @@ -1,4 +1,4 @@ export * from './run-prettier'; export * from './add-or-update-environment-variables'; export * from './add-mcp-server-to-clients'; -export * from './upload-environment-variables'; +export * from '../programs/posthog-integration/upload-environment-variables/upload-step'; diff --git a/src/commands/cli/__tests__/add.test.ts b/src/tools/cli-steering/__tests__/cli-add.test.ts similarity index 96% rename from src/commands/cli/__tests__/add.test.ts rename to src/tools/cli-steering/__tests__/cli-add.test.ts index 7700a3751..b464152c7 100644 --- a/src/commands/cli/__tests__/add.test.ts +++ b/src/tools/cli-steering/__tests__/cli-add.test.ts @@ -21,7 +21,7 @@ const { }, })); -vi.mock('@steps/install-cli-steering', () => ({ +vi.mock('@shared/install-cli-steering', () => ({ CLI_STEERING_TARGETS: [ { id: 'codex', @@ -51,7 +51,7 @@ vi.mock('@utils/analytics', () => ({ analytics: { wizardCapture: mockCliAddWizardCapture }, })); -import { cliAddCommand } from '../add'; +import { cliAddCommand } from '../index'; describe('cli add command', () => { const originalExit = process.exit; diff --git a/src/commands/cli/add.ts b/src/tools/cli-steering/index.ts similarity index 98% rename from src/commands/cli/add.ts rename to src/tools/cli-steering/index.ts index f6ea13153..27d30d54b 100644 --- a/src/commands/cli/add.ts +++ b/src/tools/cli-steering/index.ts @@ -11,8 +11,8 @@ import { findTarget, installOrUpdatePostHogCli, installSteeringSnippet, -} from '@steps/install-cli-steering'; -import type { Command } from '../command'; +} from '@shared/install-cli-steering'; +import type { Command } from '../../cli/commands/command'; export const cliAddCommand: Command = { name: 'add', diff --git a/src/programs/posthog-doctor/__tests__/doctor-schema.test.ts b/src/tools/doctor/__tests__/doctor-schema.test.ts similarity index 95% rename from src/programs/posthog-doctor/__tests__/doctor-schema.test.ts rename to src/tools/doctor/__tests__/doctor-schema.test.ts index 9fb87640c..f05bc9054 100644 --- a/src/programs/posthog-doctor/__tests__/doctor-schema.test.ts +++ b/src/tools/doctor/__tests__/doctor-schema.test.ts @@ -1,12 +1,12 @@ import { HealthIssueListResponseSchema, HealthIssueSchema, -} from '@programs/posthog-doctor/types'; +} from '@tools/doctor/types'; import { getKindMeta, KIND_METADATA, UNKNOWN_KIND_META, -} from '@programs/posthog-doctor/kind-metadata'; +} from '@tools/doctor/kind-metadata'; describe('posthog-doctor schema', () => { const canned = { diff --git a/src/programs/posthog-doctor/fetch.ts b/src/tools/doctor/fetch.ts similarity index 100% rename from src/programs/posthog-doctor/fetch.ts rename to src/tools/doctor/fetch.ts diff --git a/src/programs/posthog-doctor/kind-metadata.ts b/src/tools/doctor/kind-metadata.ts similarity index 100% rename from src/programs/posthog-doctor/kind-metadata.ts rename to src/tools/doctor/kind-metadata.ts diff --git a/src/programs/posthog-doctor/types.ts b/src/tools/doctor/types.ts similarity index 100% rename from src/programs/posthog-doctor/types.ts rename to src/tools/doctor/types.ts diff --git a/src/ui/tui/App.tsx b/src/tui/App.tsx similarity index 75% rename from src/ui/tui/App.tsx rename to src/tui/App.tsx index e6e7915a1..2fb2920af 100644 --- a/src/ui/tui/App.tsx +++ b/src/tui/App.tsx @@ -1,7 +1,7 @@ import { useMemo } from 'react'; import { ScreenContainer } from './primitives/index.js'; -import type { WizardStore } from './store.js'; -import { createScreens, createServices } from './screen-registry.js'; +import type { WizardStore } from '../ui/tui/store.js'; +import { createScreens, createServices } from '../ui/tui/screen-registry.js'; interface AppProps { store: WizardStore; diff --git a/src/ui/tui/__tests__/MintFailureScreen.test.tsx b/src/tui/__tests__/MintFailureScreen.test.tsx similarity index 96% rename from src/ui/tui/__tests__/MintFailureScreen.test.tsx rename to src/tui/__tests__/MintFailureScreen.test.tsx index eff31eb58..d57143ca0 100644 --- a/src/ui/tui/__tests__/MintFailureScreen.test.tsx +++ b/src/tui/__tests__/MintFailureScreen.test.tsx @@ -1,6 +1,6 @@ import { vi, it, expect, afterEach } from 'vitest'; import { render, cleanup } from 'ink-testing-library'; -import { WizardStore } from '../store'; +import { WizardStore } from '../../ui/tui/store'; import { MintFailureScreen, type MintFailureServices, @@ -11,7 +11,7 @@ import { HostResolution } from '@shared/host-resolution'; import { ScreenId } from '../router'; vi.mock('ink', () => - vi.importActual('../../../../node_modules/ink/build/index.js'), + vi.importActual('../../../node_modules/ink/build/index.d.js'), ); vi.mock('@utils/analytics', () => ({ analytics: { wizardCapture: vi.fn(), capture: vi.fn(), setTag: vi.fn() }, diff --git a/src/ui/tui/__tests__/WizardAskScreen.test.ts b/src/tui/__tests__/WizardAskScreen.test.ts similarity index 98% rename from src/ui/tui/__tests__/WizardAskScreen.test.ts rename to src/tui/__tests__/WizardAskScreen.test.ts index e7ba1578e..cecdc550b 100644 --- a/src/ui/tui/__tests__/WizardAskScreen.test.ts +++ b/src/tui/__tests__/WizardAskScreen.test.ts @@ -25,7 +25,7 @@ import { handleAskKey, isRequiredButEmpty, shouldMaskAnswer, -} from '@ui/tui/screens/WizardAskScreen'; +} from '@tui/screens/WizardAskScreen'; const pending = { id: 'req-1', diff --git a/src/programs/__tests__/__snapshots__/flow-traces.test.ts.snap b/src/tui/__tests__/__snapshots__/flow-traces.test.ts.snap similarity index 100% rename from src/programs/__tests__/__snapshots__/flow-traces.test.ts.snap rename to src/tui/__tests__/__snapshots__/flow-traces.test.ts.snap diff --git a/src/ui/tui/__tests__/__snapshots__/frames/agent-skill-intro-120x40.txt b/src/tui/__tests__/__snapshots__/frames/agent-skill-intro-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/agent-skill-intro-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/agent-skill-intro-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/agent-skill-intro-80x28.txt b/src/tui/__tests__/__snapshots__/frames/agent-skill-intro-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/agent-skill-intro-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/agent-skill-intro-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/ai-observability-intro-120x40.txt b/src/tui/__tests__/__snapshots__/frames/ai-observability-intro-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/ai-observability-intro-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/ai-observability-intro-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/ai-observability-intro-80x28.txt b/src/tui/__tests__/__snapshots__/frames/ai-observability-intro-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/ai-observability-intro-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/ai-observability-intro-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/ai-opt-in-120x40.txt b/src/tui/__tests__/__snapshots__/frames/ai-opt-in-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/ai-opt-in-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/ai-opt-in-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/ai-opt-in-80x28.txt b/src/tui/__tests__/__snapshots__/frames/ai-opt-in-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/ai-opt-in-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/ai-opt-in-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/audit-intro-120x40.txt b/src/tui/__tests__/__snapshots__/frames/audit-intro-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/audit-intro-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/audit-intro-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/audit-intro-80x28.txt b/src/tui/__tests__/__snapshots__/frames/audit-intro-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/audit-intro-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/audit-intro-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/audit-outro-120x40.txt b/src/tui/__tests__/__snapshots__/frames/audit-outro-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/audit-outro-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/audit-outro-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/audit-outro-80x28.txt b/src/tui/__tests__/__snapshots__/frames/audit-outro-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/audit-outro-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/audit-outro-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/audit-run-120x40.txt b/src/tui/__tests__/__snapshots__/frames/audit-run-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/audit-run-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/audit-run-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/audit-run-80x28.txt b/src/tui/__tests__/__snapshots__/frames/audit-run-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/audit-run-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/audit-run-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/auth-120x40.txt b/src/tui/__tests__/__snapshots__/frames/auth-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/auth-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/auth-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/auth-80x28.txt b/src/tui/__tests__/__snapshots__/frames/auth-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/auth-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/auth-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/auth-error-120x40.txt b/src/tui/__tests__/__snapshots__/frames/auth-error-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/auth-error-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/auth-error-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/auth-error-80x28.txt b/src/tui/__tests__/__snapshots__/frames/auth-error-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/auth-error-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/auth-error-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/doctor-intro-120x40.txt b/src/tui/__tests__/__snapshots__/frames/doctor-intro-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/doctor-intro-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/doctor-intro-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/doctor-intro-80x28.txt b/src/tui/__tests__/__snapshots__/frames/doctor-intro-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/doctor-intro-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/doctor-intro-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/doctor-report-120x40.txt b/src/tui/__tests__/__snapshots__/frames/doctor-report-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/doctor-report-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/doctor-report-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/doctor-report-80x28.txt b/src/tui/__tests__/__snapshots__/frames/doctor-report-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/doctor-report-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/doctor-report-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/error-tracking-detect-120x40.txt b/src/tui/__tests__/__snapshots__/frames/error-tracking-detect-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/error-tracking-detect-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/error-tracking-detect-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/error-tracking-detect-80x28.txt b/src/tui/__tests__/__snapshots__/frames/error-tracking-detect-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/error-tracking-detect-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/error-tracking-detect-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/error-tracking-intro-120x40.txt b/src/tui/__tests__/__snapshots__/frames/error-tracking-intro-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/error-tracking-intro-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/error-tracking-intro-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/error-tracking-intro-80x28.txt b/src/tui/__tests__/__snapshots__/frames/error-tracking-intro-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/error-tracking-intro-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/error-tracking-intro-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/exit-120x40.txt b/src/tui/__tests__/__snapshots__/frames/exit-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/exit-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/exit-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/exit-80x28.txt b/src/tui/__tests__/__snapshots__/frames/exit-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/exit-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/exit-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/health-check-120x40.txt b/src/tui/__tests__/__snapshots__/frames/health-check-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/health-check-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/health-check-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/health-check-80x28.txt b/src/tui/__tests__/__snapshots__/frames/health-check-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/health-check-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/health-check-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/intro-120x40.txt b/src/tui/__tests__/__snapshots__/frames/intro-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/intro-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/intro-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/intro-60x15.txt b/src/tui/__tests__/__snapshots__/frames/intro-60x15.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/intro-60x15.txt rename to src/tui/__tests__/__snapshots__/frames/intro-60x15.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/intro-80x28.txt b/src/tui/__tests__/__snapshots__/frames/intro-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/intro-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/intro-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/keep-skills-120x40.txt b/src/tui/__tests__/__snapshots__/frames/keep-skills-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/keep-skills-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/keep-skills-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/keep-skills-80x28.txt b/src/tui/__tests__/__snapshots__/frames/keep-skills-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/keep-skills-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/keep-skills-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/managed-settings-120x40.txt b/src/tui/__tests__/__snapshots__/frames/managed-settings-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/managed-settings-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/managed-settings-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/managed-settings-80x28.txt b/src/tui/__tests__/__snapshots__/frames/managed-settings-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/managed-settings-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/managed-settings-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/manual-auth-code-120x40.txt b/src/tui/__tests__/__snapshots__/frames/manual-auth-code-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/manual-auth-code-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/manual-auth-code-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/manual-auth-code-80x28.txt b/src/tui/__tests__/__snapshots__/frames/manual-auth-code-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/manual-auth-code-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/manual-auth-code-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/mcp-120x40.txt b/src/tui/__tests__/__snapshots__/frames/mcp-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/mcp-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/mcp-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/mcp-80x28.txt b/src/tui/__tests__/__snapshots__/frames/mcp-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/mcp-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/mcp-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/mcp-add-120x40.txt b/src/tui/__tests__/__snapshots__/frames/mcp-add-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/mcp-add-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/mcp-add-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/mcp-add-80x28.txt b/src/tui/__tests__/__snapshots__/frames/mcp-add-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/mcp-add-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/mcp-add-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/mcp-remove-120x40.txt b/src/tui/__tests__/__snapshots__/frames/mcp-remove-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/mcp-remove-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/mcp-remove-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/mcp-remove-80x28.txt b/src/tui/__tests__/__snapshots__/frames/mcp-remove-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/mcp-remove-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/mcp-remove-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/mcp-suggested-prompts-120x40.txt b/src/tui/__tests__/__snapshots__/frames/mcp-suggested-prompts-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/mcp-suggested-prompts-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/mcp-suggested-prompts-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/mcp-suggested-prompts-80x28.txt b/src/tui/__tests__/__snapshots__/frames/mcp-suggested-prompts-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/mcp-suggested-prompts-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/mcp-suggested-prompts-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/metrics-intro-120x40.txt b/src/tui/__tests__/__snapshots__/frames/metrics-intro-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/metrics-intro-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/metrics-intro-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/metrics-intro-80x28.txt b/src/tui/__tests__/__snapshots__/frames/metrics-intro-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/metrics-intro-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/metrics-intro-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/migration-intro-120x40.txt b/src/tui/__tests__/__snapshots__/frames/migration-intro-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/migration-intro-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/migration-intro-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/migration-intro-80x28.txt b/src/tui/__tests__/__snapshots__/frames/migration-intro-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/migration-intro-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/migration-intro-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/mint-failure-120x40.txt b/src/tui/__tests__/__snapshots__/frames/mint-failure-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/mint-failure-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/mint-failure-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/mint-failure-80x28.txt b/src/tui/__tests__/__snapshots__/frames/mint-failure-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/mint-failure-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/mint-failure-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/outro-120x40.txt b/src/tui/__tests__/__snapshots__/frames/outro-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/outro-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/outro-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/outro-80x28.txt b/src/tui/__tests__/__snapshots__/frames/outro-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/outro-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/outro-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/port-conflict-120x40.txt b/src/tui/__tests__/__snapshots__/frames/port-conflict-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/port-conflict-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/port-conflict-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/port-conflict-80x28.txt b/src/tui/__tests__/__snapshots__/frames/port-conflict-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/port-conflict-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/port-conflict-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/revenue-intro-120x40.txt b/src/tui/__tests__/__snapshots__/frames/revenue-intro-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/revenue-intro-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/revenue-intro-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/revenue-intro-80x28.txt b/src/tui/__tests__/__snapshots__/frames/revenue-intro-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/revenue-intro-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/revenue-intro-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/revenue-intro-detect-error-120x40.txt b/src/tui/__tests__/__snapshots__/frames/revenue-intro-detect-error-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/revenue-intro-detect-error-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/revenue-intro-detect-error-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/revenue-intro-detect-error-80x28.txt b/src/tui/__tests__/__snapshots__/frames/revenue-intro-detect-error-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/revenue-intro-detect-error-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/revenue-intro-detect-error-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/run-120x40.txt b/src/tui/__tests__/__snapshots__/frames/run-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/run-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/run-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/run-80x28.txt b/src/tui/__tests__/__snapshots__/frames/run-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/run-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/run-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/self-driving-github-120x40.txt b/src/tui/__tests__/__snapshots__/frames/self-driving-github-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/self-driving-github-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/self-driving-github-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/self-driving-github-80x28.txt b/src/tui/__tests__/__snapshots__/frames/self-driving-github-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/self-driving-github-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/self-driving-github-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/self-driving-handoff-120x40.txt b/src/tui/__tests__/__snapshots__/frames/self-driving-handoff-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/self-driving-handoff-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/self-driving-handoff-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/self-driving-handoff-80x28.txt b/src/tui/__tests__/__snapshots__/frames/self-driving-handoff-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/self-driving-handoff-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/self-driving-handoff-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/self-driving-integration-check-120x40.txt b/src/tui/__tests__/__snapshots__/frames/self-driving-integration-check-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/self-driving-integration-check-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/self-driving-integration-check-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/self-driving-integration-check-80x28.txt b/src/tui/__tests__/__snapshots__/frames/self-driving-integration-check-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/self-driving-integration-check-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/self-driving-integration-check-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/self-driving-integration-detect-120x40.txt b/src/tui/__tests__/__snapshots__/frames/self-driving-integration-detect-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/self-driving-integration-detect-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/self-driving-integration-detect-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/self-driving-integration-detect-80x28.txt b/src/tui/__tests__/__snapshots__/frames/self-driving-integration-detect-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/self-driving-integration-detect-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/self-driving-integration-detect-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/self-driving-intro-120x40.txt b/src/tui/__tests__/__snapshots__/frames/self-driving-intro-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/self-driving-intro-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/self-driving-intro-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/self-driving-intro-80x28.txt b/src/tui/__tests__/__snapshots__/frames/self-driving-intro-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/self-driving-intro-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/self-driving-intro-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/session-timeout-120x40.txt b/src/tui/__tests__/__snapshots__/frames/session-timeout-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/session-timeout-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/session-timeout-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/session-timeout-80x28.txt b/src/tui/__tests__/__snapshots__/frames/session-timeout-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/session-timeout-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/session-timeout-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/settings-override-120x40.txt b/src/tui/__tests__/__snapshots__/frames/settings-override-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/settings-override-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/settings-override-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/settings-override-80x28.txt b/src/tui/__tests__/__snapshots__/frames/settings-override-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/settings-override-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/settings-override-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/setup-120x40.txt b/src/tui/__tests__/__snapshots__/frames/setup-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/setup-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/setup-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/setup-80x28.txt b/src/tui/__tests__/__snapshots__/frames/setup-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/setup-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/setup-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/slack-connect-120x40.txt b/src/tui/__tests__/__snapshots__/frames/slack-connect-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/slack-connect-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/slack-connect-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/slack-connect-80x28.txt b/src/tui/__tests__/__snapshots__/frames/slack-connect-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/slack-connect-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/slack-connect-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/source-maps-detect-120x40.txt b/src/tui/__tests__/__snapshots__/frames/source-maps-detect-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/source-maps-detect-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/source-maps-detect-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/source-maps-detect-80x28.txt b/src/tui/__tests__/__snapshots__/frames/source-maps-detect-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/source-maps-detect-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/source-maps-detect-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/source-maps-intro-120x40.txt b/src/tui/__tests__/__snapshots__/frames/source-maps-intro-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/source-maps-intro-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/source-maps-intro-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/source-maps-intro-80x28.txt b/src/tui/__tests__/__snapshots__/frames/source-maps-intro-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/source-maps-intro-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/source-maps-intro-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/source-maps-outro-120x40.txt b/src/tui/__tests__/__snapshots__/frames/source-maps-outro-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/source-maps-outro-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/source-maps-outro-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/source-maps-outro-80x28.txt b/src/tui/__tests__/__snapshots__/frames/source-maps-outro-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/source-maps-outro-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/source-maps-outro-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/task-notice-120x40.txt b/src/tui/__tests__/__snapshots__/frames/task-notice-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/task-notice-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/task-notice-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/task-notice-80x28.txt b/src/tui/__tests__/__snapshots__/frames/task-notice-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/task-notice-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/task-notice-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/warehouse-intro-120x40.txt b/src/tui/__tests__/__snapshots__/frames/warehouse-intro-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/warehouse-intro-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/warehouse-intro-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/warehouse-intro-80x28.txt b/src/tui/__tests__/__snapshots__/frames/warehouse-intro-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/warehouse-intro-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/warehouse-intro-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/wizard-ask-120x40.txt b/src/tui/__tests__/__snapshots__/frames/wizard-ask-120x40.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/wizard-ask-120x40.txt rename to src/tui/__tests__/__snapshots__/frames/wizard-ask-120x40.txt diff --git a/src/ui/tui/__tests__/__snapshots__/frames/wizard-ask-80x28.txt b/src/tui/__tests__/__snapshots__/frames/wizard-ask-80x28.txt similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/frames/wizard-ask-80x28.txt rename to src/tui/__tests__/__snapshots__/frames/wizard-ask-80x28.txt diff --git a/src/ui/tui/__tests__/__snapshots__/keyboard-equivalence.test.tsx.snap b/src/tui/__tests__/__snapshots__/keyboard-equivalence.test.tsx.snap similarity index 100% rename from src/ui/tui/__tests__/__snapshots__/keyboard-equivalence.test.tsx.snap rename to src/tui/__tests__/__snapshots__/keyboard-equivalence.test.tsx.snap diff --git a/src/ui/tui/__tests__/coding-agent-launcher.test.ts b/src/tui/__tests__/coding-agent-launcher.test.ts similarity index 100% rename from src/ui/tui/__tests__/coding-agent-launcher.test.ts rename to src/tui/__tests__/coding-agent-launcher.test.ts diff --git a/src/ui/tui/__tests__/exit-line.test.ts b/src/tui/__tests__/exit-line.test.ts similarity index 99% rename from src/ui/tui/__tests__/exit-line.test.ts rename to src/tui/__tests__/exit-line.test.ts index 9aee587a9..25159d386 100644 --- a/src/ui/tui/__tests__/exit-line.test.ts +++ b/src/tui/__tests__/exit-line.test.ts @@ -1,4 +1,4 @@ -import { getExitLine } from '@ui/tui/exit-line'; +import { getExitLine } from '@tui/exit-line'; import { WizardStore, Program } from '@ui/tui/store'; import { OutroKind } from '@lib/wizard-session'; import { HostResolution } from '@shared/host-resolution'; diff --git a/src/programs/__tests__/flow-traces.test.ts b/src/tui/__tests__/flow-traces.test.ts similarity index 95% rename from src/programs/__tests__/flow-traces.test.ts rename to src/tui/__tests__/flow-traces.test.ts index f48428f3c..c773fa8f1 100644 --- a/src/programs/__tests__/flow-traces.test.ts +++ b/src/tui/__tests__/flow-traces.test.ts @@ -27,10 +27,10 @@ import { PROGRAM_REGISTRY, getProgramConfig, type ProgramId, -} from '../program-registry'; -import { SELF_DRIVING_INTEGRATE_PATH_KEY } from '../self-driving/detect'; -import { ERROR_TRACKING_PROJECT_PATH_KEY } from '../error-tracking/detect-agentic'; -import { SOURCE_MAPS_CONTEXT_KEYS } from '../error-tracking-upload-source-maps/detect'; +} from '../../programs/program-registry'; +import { SELF_DRIVING_INTEGRATE_PATH_KEY } from '../../programs/self-driving/detect'; +import { ERROR_TRACKING_PROJECT_PATH_KEY } from '../../programs/error-tracking/detect-agentic'; +import { SOURCE_MAPS_CONTEXT_KEYS } from '../../programs/error-tracking-upload-source-maps/detect'; vi.mock('@utils/analytics', () => ({ analytics: { diff --git a/src/programs/__tests__/program-step.test.ts b/src/tui/__tests__/flow.test.ts similarity index 100% rename from src/programs/__tests__/program-step.test.ts rename to src/tui/__tests__/flow.test.ts diff --git a/src/ui/tui/__tests__/frames.test.tsx b/src/tui/__tests__/frames.test.tsx similarity index 97% rename from src/ui/tui/__tests__/frames.test.tsx rename to src/tui/__tests__/frames.test.tsx index f8700cf03..2c62debea 100644 --- a/src/ui/tui/__tests__/frames.test.tsx +++ b/src/tui/__tests__/frames.test.tsx @@ -7,7 +7,7 @@ import { vi, it, expect, describe, beforeAll, afterEach } from 'vitest'; import { cleanup } from 'ink-testing-library'; vi.mock('ink', () => - vi.importActual('../../../../node_modules/ink/build/index.js'), + vi.importActual('../../../node_modules/ink/build/index.d.js'), ); const { pending } = vi.hoisted(() => ({ @@ -58,7 +58,7 @@ vi.mock('@shared/skill-menu', async (actual) => ({ ...(await actual>()), fetchSkillMenu: vi.fn(pending), })); -vi.mock('@ui/tui/hooks/useGithubConnection', () => ({ +vi.mock('@tui/programs/self-driving/hooks/useGithubConnection', () => ({ useGithubConnection: () => undefined, fetchLoginUrl: vi.fn().mockResolvedValue(null), })); @@ -77,7 +77,7 @@ vi.mock( detectSourceMapsProjects: vi.fn(pending), }), ); -vi.mock('@programs/posthog-doctor/fetch', () => ({ +vi.mock('@tools/doctor/fetch', () => ({ fetchHealthIssues: vi.fn().mockResolvedValue([ { id: 'issue-1', @@ -103,7 +103,7 @@ vi.mock('@programs/posthog-doctor/fetch', () => ({ import { WizardStore, TaskStatus, type ScreenName } from '@ui/tui/store'; import { InkUI } from '@ui/tui/ink-ui'; import { setUI } from '@ui/index'; -import { ScreenId, Overlay } from '@ui/tui/router'; +import { ScreenId, Overlay } from '@tui/router'; import { createServices, type ScreenServices } from '@ui/tui/screen-registry'; import { buildSession, @@ -124,8 +124,8 @@ import { ServiceHealthStatus } from '@shared/health-checks/types'; import { SOURCE_MAPS_CONTEXT_KEYS } from '@programs/error-tracking-upload-source-maps/detect'; import { AUDIT_CHECKS_KEY } from '@programs/audit/types'; import { AUDIT_SEED_CHECKS } from '@programs/audit/seed'; -import type { McpInstaller } from '@ui/tui/services/mcp-installer'; -import type { McpSuggestedPromptsServices } from '@ui/tui/services/mcp-suggested-prompts-services'; +import type { McpInstaller } from '@tui/services/mcp-installer'; +import type { McpSuggestedPromptsServices } from '@tui/tools/mcp/services/suggested-prompts'; import { renderScreen, screenShell, diff --git a/src/ui/tui/__tests__/helpers/render-screen.no-jest.tsx b/src/tui/__tests__/helpers/render-screen.no-jest.tsx similarity index 96% rename from src/ui/tui/__tests__/helpers/render-screen.no-jest.tsx rename to src/tui/__tests__/helpers/render-screen.no-jest.tsx index 60e16196b..a4a956bdd 100644 --- a/src/ui/tui/__tests__/helpers/render-screen.no-jest.tsx +++ b/src/tui/__tests__/helpers/render-screen.no-jest.tsx @@ -1,7 +1,7 @@ import { render } from 'ink-testing-library'; import type { ReactNode } from 'react'; import { vi } from 'vitest'; -import { ScreenContainer } from '@ui/tui/primitives/ScreenContainer'; +import { ScreenContainer } from '@tui/primitives/ScreenContainer'; import { createScreens, type ScreenServices } from '@ui/tui/screen-registry'; import type { WizardStore } from '@ui/tui/store'; diff --git a/src/ui/tui/__tests__/keyboard-equivalence.test.tsx b/src/tui/__tests__/keyboard-equivalence.test.tsx similarity index 98% rename from src/ui/tui/__tests__/keyboard-equivalence.test.tsx rename to src/tui/__tests__/keyboard-equivalence.test.tsx index 413cbca7a..e9632f79d 100644 --- a/src/ui/tui/__tests__/keyboard-equivalence.test.tsx +++ b/src/tui/__tests__/keyboard-equivalence.test.tsx @@ -16,8 +16,8 @@ import { RunPhase, McpOutcome, type ProgramId, -} from '../store'; -import { InkUI } from '../ink-ui'; +} from '../../ui/tui/store'; +import { InkUI } from '../../ui/tui/ink-ui'; import { setUI } from '@ui/index'; import { buildSession, @@ -35,11 +35,11 @@ import { createScreens, createServices, type ScreenServices, -} from '../screen-registry'; +} from '../../ui/tui/screen-registry'; import { ACTION_REGISTRY } from '@e2e-harness/action-registry'; vi.mock('ink', () => - vi.importActual('../../../../node_modules/ink/build/index.js'), + vi.importActual('../../../node_modules/ink/build/index.d.js'), ); vi.mock('@utils/analytics', () => ({ analytics: { diff --git a/src/ui/tui/__tests__/keyboard-hints.test.ts b/src/tui/__tests__/keyboard-hints.test.ts similarity index 99% rename from src/ui/tui/__tests__/keyboard-hints.test.ts rename to src/tui/__tests__/keyboard-hints.test.ts index 838ab67da..b55379633 100644 --- a/src/ui/tui/__tests__/keyboard-hints.test.ts +++ b/src/tui/__tests__/keyboard-hints.test.ts @@ -5,7 +5,7 @@ import { deduplicateAndSort, KeyMatch, type KeyboardHint, -} from '@ui/tui/hooks/keyboard-hints-utils'; +} from '@tui/hooks/keyboard-hints-utils'; /** Helper to create a key flags object with all booleans false by default. */ function makeKey( diff --git a/src/ui/tui/__tests__/layout-helpers.test.ts b/src/tui/__tests__/layout-helpers.test.ts similarity index 95% rename from src/ui/tui/__tests__/layout-helpers.test.ts rename to src/tui/__tests__/layout-helpers.test.ts index 78e9956b0..85c9d5432 100644 --- a/src/ui/tui/__tests__/layout-helpers.test.ts +++ b/src/tui/__tests__/layout-helpers.test.ts @@ -1,8 +1,8 @@ import { estimateBlockHeight, computeVisibleRange, -} from '@ui/tui/primitives/layout-helpers'; -import type { ContentBlock } from '@ui/tui/primitives/content-types'; +} from '@tui/primitives/layout-helpers'; +import type { ContentBlock } from '@tui/primitives/content-types'; describe('estimateBlockHeight', () => { it('counts wrapped lines for a short string that fits in one line', () => { diff --git a/src/__tests__/link-helpers.test.ts b/src/tui/__tests__/link-helpers.test.ts similarity index 99% rename from src/__tests__/link-helpers.test.ts rename to src/tui/__tests__/link-helpers.test.ts index 62bc093f7..7440dea74 100644 --- a/src/__tests__/link-helpers.test.ts +++ b/src/tui/__tests__/link-helpers.test.ts @@ -3,7 +3,7 @@ import { truncateUrlLabel, extractUrls, splitPromptIntoSegments, -} from '@ui/tui/primitives/link-helpers'; +} from '@tui/primitives/link-helpers'; const ESC = String.fromCharCode(0x1b); const BEL = String.fromCharCode(0x07); diff --git a/src/ui/tui/__tests__/mcp-installer.test.ts b/src/tui/__tests__/mcp-installer.test.ts similarity index 97% rename from src/ui/tui/__tests__/mcp-installer.test.ts rename to src/tui/__tests__/mcp-installer.test.ts index 1cb41f008..f43bb6b4c 100644 --- a/src/ui/tui/__tests__/mcp-installer.test.ts +++ b/src/tui/__tests__/mcp-installer.test.ts @@ -1,5 +1,5 @@ -import { createMcpInstaller } from '@ui/tui/services/mcp-installer'; -import { McpClientStatus } from '@steps/add-mcp-server-to-clients/results'; +import { createMcpInstaller } from '@tui/services/mcp-installer'; +import { McpClientStatus } from '@shared/mcp-clients/results'; import * as mcpModuleReal from '@steps/add-mcp-server-to-clients/index'; import { analytics } from '@utils/analytics'; @@ -8,7 +8,7 @@ import { analytics } from '@utils/analytics'; // previous `require()` form gave) while still typing the .mock* helpers. const mcpModule = mcpModuleReal as unknown as Record; -vi.mock('../../../steps/add-mcp-server-to-clients/index.js', () => ({ +vi.mock('../../steps/add-mcp-server-to-clients/index.js', () => ({ getSupportedClients: vi.fn(), getInstalledClients: vi.fn(), removeMCPServer: vi.fn(), @@ -16,7 +16,7 @@ vi.mock('../../../steps/add-mcp-server-to-clients/index.js', () => ({ installPlugins: vi.fn(), })); -vi.mock('../../../steps/add-mcp-server-to-clients/defaults.js', () => ({ +vi.mock('../../shared/mcp-clients/defaults.js', () => ({ ALL_FEATURE_VALUES: ['feature-a'], })); diff --git a/src/ui/tui/__tests__/picker-filter.test.ts b/src/tui/__tests__/picker-filter.test.ts similarity index 98% rename from src/ui/tui/__tests__/picker-filter.test.ts rename to src/tui/__tests__/picker-filter.test.ts index d6a1860cd..aff86de31 100644 --- a/src/ui/tui/__tests__/picker-filter.test.ts +++ b/src/tui/__tests__/picker-filter.test.ts @@ -2,7 +2,7 @@ import { buildPickerIndex, rankOptions, type Searchable, -} from '@ui/tui/primitives/picker-filter'; +} from '@tui/primitives/picker-filter'; const OPTIONS: Searchable[] = [ { label: 'GitHub issues', hint: 'Issues opened on your repos' }, diff --git a/src/ui/tui/__tests__/programs.test.ts b/src/tui/__tests__/programs.test.ts similarity index 100% rename from src/ui/tui/__tests__/programs.test.ts rename to src/tui/__tests__/programs.test.ts diff --git a/src/ui/tui/__tests__/router.test.ts b/src/tui/__tests__/router.test.ts similarity index 99% rename from src/ui/tui/__tests__/router.test.ts rename to src/tui/__tests__/router.test.ts index 62762bab8..85f206f86 100644 --- a/src/ui/tui/__tests__/router.test.ts +++ b/src/tui/__tests__/router.test.ts @@ -6,7 +6,7 @@ import { } from '@lib/wizard-session'; import { HostResolution } from '@shared/host-resolution'; import { WizardReadiness } from '@shared/health-checks/readiness'; -import { WizardRouter, ScreenId, Overlay, Program } from '@ui/tui/router'; +import { WizardRouter, ScreenId, Overlay, Program } from '@tui/router'; import { Integration } from '@shared/constants'; import { FRAMEWORK_REGISTRY } from '@programs/frameworks/registry'; import { PROGRAM_REGISTRY } from '@programs'; diff --git a/src/ui/tui/__tests__/skill-entry.test.ts b/src/tui/__tests__/skill-entry.test.ts similarity index 96% rename from src/ui/tui/__tests__/skill-entry.test.ts rename to src/tui/__tests__/skill-entry.test.ts index c12071aeb..61ab6c0fd 100644 --- a/src/ui/tui/__tests__/skill-entry.test.ts +++ b/src/tui/__tests__/skill-entry.test.ts @@ -1,4 +1,4 @@ -import { resolveSkillEntry } from '@ui/tui/screens/SkillSourceInfo'; +import { resolveSkillEntry } from '@tui/screens/SkillSourceInfo'; import type { SkillEntry } from '@shared/skill-menu'; const entry = (id: string): SkillEntry => diff --git a/src/ui/tui/__tests__/store-invariants.test.ts b/src/tui/__tests__/store-invariants.test.ts similarity index 99% rename from src/ui/tui/__tests__/store-invariants.test.ts rename to src/tui/__tests__/store-invariants.test.ts index c002c46e6..40ca070f6 100644 --- a/src/ui/tui/__tests__/store-invariants.test.ts +++ b/src/tui/__tests__/store-invariants.test.ts @@ -23,7 +23,7 @@ import { type TaskNotice, type WizardSession, } from '@lib/wizard-session'; -import { EXPANDED_COUNT } from '@ui/tui/constants'; +import { EXPANDED_COUNT } from '@tui/constants'; import { PROGRAM_SEQUENCES } from '@ui/tui/screen-sequences'; import { WizardReadiness } from '@shared/health-checks/readiness'; import { HostResolution } from '@shared/host-resolution'; diff --git a/src/ui/tui/__tests__/store.test.ts b/src/tui/__tests__/store.test.ts similarity index 99% rename from src/ui/tui/__tests__/store.test.ts rename to src/tui/__tests__/store.test.ts index eca82cdb5..1566ccefb 100644 --- a/src/ui/tui/__tests__/store.test.ts +++ b/src/tui/__tests__/store.test.ts @@ -9,7 +9,7 @@ import { McpOutcome, } from '@ui/tui/store'; import { OutroKind, ScanConsent } from '@lib/wizard-session'; -import { EXPANDED_COUNT } from '@ui/tui/constants'; +import { EXPANDED_COUNT } from '@tui/constants'; import { WizardReadiness, evaluateWizardReadiness, diff --git a/src/ui/tui/__tests__/task-notice.test.ts b/src/tui/__tests__/task-notice.test.ts similarity index 100% rename from src/ui/tui/__tests__/task-notice.test.ts rename to src/tui/__tests__/task-notice.test.ts diff --git a/src/ui/tui/__tests__/viewport-too-small.test.ts b/src/tui/__tests__/viewport-too-small.test.ts similarity index 98% rename from src/ui/tui/__tests__/viewport-too-small.test.ts rename to src/tui/__tests__/viewport-too-small.test.ts index 5ee2fa9f3..6a74d91a9 100644 --- a/src/ui/tui/__tests__/viewport-too-small.test.ts +++ b/src/tui/__tests__/viewport-too-small.test.ts @@ -11,7 +11,7 @@ import { MIN_VIEWPORT_COLUMNS, MIN_VIEWPORT_ROWS, VIEWPORT_TOO_SMALL_MESSAGE, -} from '@ui/tui/primitives/ViewportTooSmall'; +} from '@tui/primitives/ViewportTooSmall'; describe('isViewportTooSmall', () => { it('passes a terminal at exactly the minimum', () => { diff --git a/src/programs/ai-opt-in-gate.ts b/src/tui/ai-opt-in-gate.ts similarity index 97% rename from src/programs/ai-opt-in-gate.ts rename to src/tui/ai-opt-in-gate.ts index d101a02a3..55f077aea 100644 --- a/src/programs/ai-opt-in-gate.ts +++ b/src/tui/ai-opt-in-gate.ts @@ -32,7 +32,7 @@ */ import type { WizardSession } from '@lib/wizard-session'; -import type { ProgramConfig, ProgramStep } from './program-step.js'; +import type { ProgramConfig, ProgramStep } from '../programs/program-step.js'; /** Step id — also the ScreenId.AiOptIn enum value in screen-sequences. */ export const AI_OPT_IN_STEP_ID = 'ai-opt-in'; diff --git a/src/shared/utils/__tests__/ci-region.test.ts b/src/tui/auth/__tests__/ci-region.test.ts similarity index 100% rename from src/shared/utils/__tests__/ci-region.test.ts rename to src/tui/auth/__tests__/ci-region.test.ts diff --git a/src/shared/utils/__tests__/oauth-server.test.ts b/src/tui/auth/__tests__/oauth-server.test.ts similarity index 96% rename from src/shared/utils/__tests__/oauth-server.test.ts rename to src/tui/auth/__tests__/oauth-server.test.ts index 87c0dc8df..6e757cbfc 100644 --- a/src/shared/utils/__tests__/oauth-server.test.ts +++ b/src/tui/auth/__tests__/oauth-server.test.ts @@ -1,9 +1,12 @@ import * as http from 'node:http'; import * as net from 'node:net'; import { startCallbackServer } from '@utils/oauth'; -import { logToFile } from '../debug'; +import { logToFile } from '../../../shared/utils/debug'; -vi.mock('../debug', () => ({ logToFile: vi.fn(), setDebugSink: vi.fn() })); +vi.mock('../../../shared/utils/debug', () => ({ + logToFile: vi.fn(), + setDebugSink: vi.fn(), +})); const authUrl = 'https://oauth.example.test/authorize'; const signupUrl = 'https://oauth.example.test/signup'; diff --git a/src/shared/utils/__tests__/oauth.test.ts b/src/tui/auth/__tests__/oauth.test.ts similarity index 100% rename from src/shared/utils/__tests__/oauth.test.ts rename to src/tui/auth/__tests__/oauth.test.ts diff --git a/src/ui/tui/components/LearnCard.tsx b/src/tui/components/LearnCard.tsx similarity index 88% rename from src/ui/tui/components/LearnCard.tsx rename to src/tui/components/LearnCard.tsx index 8a5b2f265..c49d70769 100644 --- a/src/ui/tui/components/LearnCard.tsx +++ b/src/tui/components/LearnCard.tsx @@ -8,15 +8,15 @@ */ import { Box, Text } from 'ink'; -import { Colors } from '@ui/tui/styles'; +import { Colors } from '@tui/styles'; import type { WizardStore } from '@ui/tui/store'; -import { ContentSequencer, TextRevealMode } from '@ui/tui/primitives/index'; -import type { ContentBlock } from '@ui/tui/primitives/index'; -import { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions'; +import { ContentSequencer, TextRevealMode } from '@tui/primitives/index'; +import type { ContentBlock } from '@tui/primitives/index'; +import { useStdoutDimensions } from '@tui/hooks/useStdoutDimensions'; import { COLLAPSED_COUNT, EXPANDED_COUNT, -} from '@ui/tui/primitives/TabContainer'; +} from '@tui/primitives/TabContainer'; /** Fixed chrome: ScreenContainer (3) + TabContainer tab bar (2) */ const FIXED_CHROME = 5; diff --git a/src/ui/tui/components/PhaseVisuals.tsx b/src/tui/components/PhaseVisuals.tsx similarity index 99% rename from src/ui/tui/components/PhaseVisuals.tsx rename to src/tui/components/PhaseVisuals.tsx index 1dea3644b..092b48374 100644 --- a/src/ui/tui/components/PhaseVisuals.tsx +++ b/src/tui/components/PhaseVisuals.tsx @@ -11,7 +11,7 @@ import { Box, Text, measureElement, type DOMElement } from 'ink'; import { useEffect, useRef, useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { useTick } from '@ui/tui/hooks/useTick'; +import { useTick } from '@tui/hooks/useTick'; import { AgentPhase } from '@shared/agent-phase'; import { MATRIX_FADE } from './visualizer/panel'; import { VISUALIZER_PALETTE } from './visualizer/palette'; diff --git a/src/ui/tui/components/PrivacyPanel.tsx b/src/tui/components/PrivacyPanel.tsx similarity index 100% rename from src/ui/tui/components/PrivacyPanel.tsx rename to src/tui/components/PrivacyPanel.tsx diff --git a/src/ui/tui/components/ServiceHealthList.tsx b/src/tui/components/ServiceHealthList.tsx similarity index 98% rename from src/ui/tui/components/ServiceHealthList.tsx rename to src/tui/components/ServiceHealthList.tsx index a630571d6..a25595fb4 100644 --- a/src/ui/tui/components/ServiceHealthList.tsx +++ b/src/tui/components/ServiceHealthList.tsx @@ -7,7 +7,7 @@ import { type HealthCheckKey, } from '@shared/health-checks/types'; import { SERVICE_LABELS } from '@shared/health-checks/readiness'; -import { Icons } from '@ui/tui/styles'; +import { Icons } from '@tui/styles'; function statusIcon(status: ServiceHealthStatus): { icon: string; diff --git a/src/ui/tui/components/StatusPeekTrigger.tsx b/src/tui/components/StatusPeekTrigger.tsx similarity index 100% rename from src/ui/tui/components/StatusPeekTrigger.tsx rename to src/tui/components/StatusPeekTrigger.tsx diff --git a/src/ui/tui/components/TipsCard.tsx b/src/tui/components/TipsCard.tsx similarity index 98% rename from src/ui/tui/components/TipsCard.tsx rename to src/tui/components/TipsCard.tsx index a031c78fe..ff23e0895 100644 --- a/src/ui/tui/components/TipsCard.tsx +++ b/src/tui/components/TipsCard.tsx @@ -5,7 +5,7 @@ import { Box, Text } from 'ink'; import type { WizardStore } from '@ui/tui/store'; -import { Colors, Icons } from '@ui/tui/styles'; +import { Colors, Icons } from '@tui/styles'; import { DiscoveredFeature } from '@lib/wizard-session'; /** A discrete tip shown in the TipsCard during the agent run. */ diff --git a/src/ui/tui/components/TitleBar.tsx b/src/tui/components/TitleBar.tsx similarity index 95% rename from src/ui/tui/components/TitleBar.tsx rename to src/tui/components/TitleBar.tsx index 493b7fea9..03a7799ce 100644 --- a/src/ui/tui/components/TitleBar.tsx +++ b/src/tui/components/TitleBar.tsx @@ -1,5 +1,5 @@ import { Box, Text } from 'ink'; -import { Colors } from '@ui/tui/styles'; +import { Colors } from '@tui/styles'; const FEEDBACK = 'Feedback: wizard@posthog.com '; const FEEDBACK_SHORT = ' wizard@posthog.com '; diff --git a/src/ui/tui/components/TokenCostHud.tsx b/src/tui/components/TokenCostHud.tsx similarity index 99% rename from src/ui/tui/components/TokenCostHud.tsx rename to src/tui/components/TokenCostHud.tsx index 14632b756..a34d78491 100644 --- a/src/ui/tui/components/TokenCostHud.tsx +++ b/src/tui/components/TokenCostHud.tsx @@ -15,7 +15,7 @@ * (plus the blank spacer `ScreenContainer` renders below either way). */ import { Box, Text } from 'ink'; -import { Colors } from '@ui/tui/styles'; +import { Colors } from '@tui/styles'; import { totalTokenCount, type TokenUsageSnapshot } from '@ui/tui/store'; import { formatTokenCount, formatCostUsd } from '@shared/token-pricing'; diff --git a/src/ui/tui/components/__tests__/TokenCostHud.test.ts b/src/tui/components/__tests__/TokenCostHud.test.ts similarity index 93% rename from src/ui/tui/components/__tests__/TokenCostHud.test.ts rename to src/tui/components/__tests__/TokenCostHud.test.ts index ea806ffc3..8f26fc91b 100644 --- a/src/ui/tui/components/__tests__/TokenCostHud.test.ts +++ b/src/tui/components/__tests__/TokenCostHud.test.ts @@ -1,4 +1,4 @@ -import { tokenCostHudRowCount } from '@ui/tui/components/TokenCostHud'; +import { tokenCostHudRowCount } from '@tui/components/TokenCostHud'; import type { TokenUsageSnapshot } from '@ui/tui/store'; const ZERO_USAGE: TokenUsageSnapshot = { diff --git a/src/ui/tui/components/__tests__/visualizer-grid.test.ts b/src/tui/components/__tests__/visualizer-grid.test.ts similarity index 97% rename from src/ui/tui/components/__tests__/visualizer-grid.test.ts rename to src/tui/components/__tests__/visualizer-grid.test.ts index 3072308f2..00c0ce1ab 100644 --- a/src/ui/tui/components/__tests__/visualizer-grid.test.ts +++ b/src/tui/components/__tests__/visualizer-grid.test.ts @@ -1,8 +1,4 @@ -import { - createGrid, - plot, - writeText, -} from '@ui/tui/components/visualizer/grid'; +import { createGrid, plot, writeText } from '@tui/components/visualizer/grid'; /** * These tests pin the root-cause guarantee behind the Visualizer tab crash: diff --git a/src/ui/tui/components/visualizer/CrateStack.tsx b/src/tui/components/visualizer/CrateStack.tsx similarity index 98% rename from src/ui/tui/components/visualizer/CrateStack.tsx rename to src/tui/components/visualizer/CrateStack.tsx index 781502a4c..d423fd3f0 100644 --- a/src/ui/tui/components/visualizer/CrateStack.tsx +++ b/src/tui/components/visualizer/CrateStack.tsx @@ -7,7 +7,7 @@ import { Box, Text } from 'ink'; import { useRef } from 'react'; -import { useTick } from '@ui/tui/hooks/useTick'; +import { useTick } from '@tui/hooks/useTick'; import { Panel, type VisualProps } from './panel'; import { createGrid, plot } from './grid'; import { VISUALIZER_PALETTE } from './palette'; diff --git a/src/ui/tui/components/visualizer/DashboardGrid.tsx b/src/tui/components/visualizer/DashboardGrid.tsx similarity index 99% rename from src/ui/tui/components/visualizer/DashboardGrid.tsx rename to src/tui/components/visualizer/DashboardGrid.tsx index c45fb3745..ebab5b9f9 100644 --- a/src/ui/tui/components/visualizer/DashboardGrid.tsx +++ b/src/tui/components/visualizer/DashboardGrid.tsx @@ -7,7 +7,7 @@ */ import { Box, Text } from 'ink'; -import { useTick } from '@ui/tui/hooks/useTick'; +import { useTick } from '@tui/hooks/useTick'; import { MATRIX_FADE, Panel, type VisualProps } from './panel'; import { createGrid, plot, writeText, type Grid } from './grid'; import { VISUALIZER_PALETTE } from './palette'; diff --git a/src/ui/tui/components/visualizer/DiffCascade.tsx b/src/tui/components/visualizer/DiffCascade.tsx similarity index 98% rename from src/ui/tui/components/visualizer/DiffCascade.tsx rename to src/tui/components/visualizer/DiffCascade.tsx index 16711dc92..94f27bf17 100644 --- a/src/ui/tui/components/visualizer/DiffCascade.tsx +++ b/src/tui/components/visualizer/DiffCascade.tsx @@ -7,7 +7,7 @@ import { Box, Text } from 'ink'; import { useRef } from 'react'; -import { useTick } from '@ui/tui/hooks/useTick'; +import { useTick } from '@tui/hooks/useTick'; import { MATRIX_FADE, Panel, type VisualProps } from './panel'; import { VISUALIZER_PALETTE } from './palette'; diff --git a/src/ui/tui/components/visualizer/LibraryShelf.tsx b/src/tui/components/visualizer/LibraryShelf.tsx similarity index 98% rename from src/ui/tui/components/visualizer/LibraryShelf.tsx rename to src/tui/components/visualizer/LibraryShelf.tsx index 6b0af9f55..b8698306b 100644 --- a/src/ui/tui/components/visualizer/LibraryShelf.tsx +++ b/src/tui/components/visualizer/LibraryShelf.tsx @@ -6,7 +6,7 @@ */ import { Box, Text } from 'ink'; -import { useTick } from '@ui/tui/hooks/useTick'; +import { useTick } from '@tui/hooks/useTick'; import { MATRIX_FADE, Panel, type VisualProps } from './panel'; import { createGrid, plot, writeText } from './grid'; import { VISUALIZER_PALETTE } from './palette'; diff --git a/src/ui/tui/components/visualizer/MatrixRain.tsx b/src/tui/components/visualizer/MatrixRain.tsx similarity index 100% rename from src/ui/tui/components/visualizer/MatrixRain.tsx rename to src/tui/components/visualizer/MatrixRain.tsx diff --git a/src/ui/tui/components/visualizer/Tumblers.tsx b/src/tui/components/visualizer/Tumblers.tsx similarity index 98% rename from src/ui/tui/components/visualizer/Tumblers.tsx rename to src/tui/components/visualizer/Tumblers.tsx index c5f8b5897..087e9e3a1 100644 --- a/src/ui/tui/components/visualizer/Tumblers.tsx +++ b/src/tui/components/visualizer/Tumblers.tsx @@ -7,7 +7,7 @@ import { Box, Text } from 'ink'; import { useRef } from 'react'; -import { useTick } from '@ui/tui/hooks/useTick'; +import { useTick } from '@tui/hooks/useTick'; import { MATRIX_FADE, Panel, type VisualProps } from './panel'; import { createGrid, plot } from './grid'; import { VISUALIZER_PALETTE } from './palette'; diff --git a/src/ui/tui/components/visualizer/grid.ts b/src/tui/components/visualizer/grid.ts similarity index 100% rename from src/ui/tui/components/visualizer/grid.ts rename to src/tui/components/visualizer/grid.ts diff --git a/src/ui/tui/components/visualizer/palette.ts b/src/tui/components/visualizer/palette.ts similarity index 100% rename from src/ui/tui/components/visualizer/palette.ts rename to src/tui/components/visualizer/palette.ts diff --git a/src/ui/tui/components/visualizer/panel.tsx b/src/tui/components/visualizer/panel.tsx similarity index 100% rename from src/ui/tui/components/visualizer/panel.tsx rename to src/tui/components/visualizer/panel.tsx diff --git a/src/ui/tui/constants.ts b/src/tui/constants.ts similarity index 100% rename from src/ui/tui/constants.ts rename to src/tui/constants.ts diff --git a/src/ui/tui/exit-line.ts b/src/tui/exit-line.ts similarity index 97% rename from src/ui/tui/exit-line.ts rename to src/tui/exit-line.ts index 5d2ad68d6..b273237bc 100644 --- a/src/ui/tui/exit-line.ts +++ b/src/tui/exit-line.ts @@ -13,9 +13,9 @@ * function (start-tui.ts itself pulls in the whole render tree). */ -import { totalTokenCount, type WizardStore } from './store.js'; +import { totalTokenCount, type WizardStore } from '../ui/tui/store.js'; import { OutroKind } from '@lib/wizard-session'; -import { isRunFailure, MINT_FAILURE_CONTACT } from '@ui/mint-failure'; +import { isRunFailure, MINT_FAILURE_CONTACT } from '@tui/mint-failure'; import { formatTokenCount, formatCostUsd } from '@shared/token-pricing'; import { getLogFilePath } from '@utils/debug'; diff --git a/src/ui/tui/hooks/__tests__/file-watcher.test.ts b/src/tui/hooks/__tests__/file-watcher.test.ts similarity index 99% rename from src/ui/tui/hooks/__tests__/file-watcher.test.ts rename to src/tui/hooks/__tests__/file-watcher.test.ts index 4d764222b..b9e13b970 100644 --- a/src/ui/tui/hooks/__tests__/file-watcher.test.ts +++ b/src/tui/hooks/__tests__/file-watcher.test.ts @@ -4,7 +4,7 @@ import path from 'path'; import { startFileWatcher, type FileWatcherHandle, -} from '@ui/tui/hooks/file-watcher'; +} from '@tui/hooks/file-watcher'; import { logToFile } from '@utils/debug'; vi.mock('@utils/debug', () => ({ diff --git a/src/ui/tui/hooks/__tests__/useDismissOnAnyKey.test.ts b/src/tui/hooks/__tests__/useDismissOnAnyKey.test.ts similarity index 85% rename from src/ui/tui/hooks/__tests__/useDismissOnAnyKey.test.ts rename to src/tui/hooks/__tests__/useDismissOnAnyKey.test.ts index ac04bab2f..bf54a132a 100644 --- a/src/ui/tui/hooks/__tests__/useDismissOnAnyKey.test.ts +++ b/src/tui/hooks/__tests__/useDismissOnAnyKey.test.ts @@ -1,4 +1,4 @@ -import { isIgnoredForDismiss } from '@ui/tui/hooks/useDismissOnAnyKey'; +import { isIgnoredForDismiss } from '@tui/hooks/useDismissOnAnyKey'; describe('isIgnoredForDismiss', () => { it('ignores a ctrl-combo keypress', () => { diff --git a/src/ui/tui/hooks/file-watcher.ts b/src/tui/hooks/file-watcher.ts similarity index 72% rename from src/ui/tui/hooks/file-watcher.ts rename to src/tui/hooks/file-watcher.ts index 5dd272aa0..f4d62abaa 100644 --- a/src/ui/tui/hooks/file-watcher.ts +++ b/src/tui/hooks/file-watcher.ts @@ -1,8 +1,14 @@ import { useEffect } from 'react'; -import { startFileWatcher, type FileWatcherOptions } from '@lib/file-watcher'; +import { + startFileWatcher, + type FileWatcherOptions, +} from '@shared/utils/file-watcher'; -export { startFileWatcher } from '@lib/file-watcher'; -export type { FileWatcherHandle, FileWatcherOptions } from '@lib/file-watcher'; +export { startFileWatcher } from '@shared/utils/file-watcher'; +export type { + FileWatcherHandle, + FileWatcherOptions, +} from '@shared/utils/file-watcher'; /** React hook wrapping `startFileWatcher`. Starts on mount, stops on unmount * or when `path` changes. `onUpdate` and `options` are captured at mount diff --git a/src/ui/tui/hooks/keyboard-hints-utils.ts b/src/tui/hooks/keyboard-hints-utils.ts similarity index 100% rename from src/ui/tui/hooks/keyboard-hints-utils.ts rename to src/tui/hooks/keyboard-hints-utils.ts diff --git a/src/ui/tui/hooks/useDismissOnAnyKey.ts b/src/tui/hooks/useDismissOnAnyKey.ts similarity index 100% rename from src/ui/tui/hooks/useDismissOnAnyKey.ts rename to src/tui/hooks/useDismissOnAnyKey.ts diff --git a/src/ui/tui/hooks/useKeyBindings.ts b/src/tui/hooks/useKeyBindings.ts similarity index 100% rename from src/ui/tui/hooks/useKeyBindings.ts rename to src/tui/hooks/useKeyBindings.ts diff --git a/src/ui/tui/hooks/useKeyboardHints.tsx b/src/tui/hooks/useKeyboardHints.tsx similarity index 100% rename from src/ui/tui/hooks/useKeyboardHints.tsx rename to src/tui/hooks/useKeyboardHints.tsx diff --git a/src/ui/tui/hooks/useStdoutDimensions.ts b/src/tui/hooks/useStdoutDimensions.ts similarity index 100% rename from src/ui/tui/hooks/useStdoutDimensions.ts rename to src/tui/hooks/useStdoutDimensions.ts diff --git a/src/ui/tui/hooks/useTick.ts b/src/tui/hooks/useTick.ts similarity index 100% rename from src/ui/tui/hooks/useTick.ts rename to src/tui/hooks/useTick.ts diff --git a/src/ui/mint-failure.ts b/src/tui/mint-failure.ts similarity index 100% rename from src/ui/mint-failure.ts rename to src/tui/mint-failure.ts diff --git a/src/ui/tui/playground/PlaygroundApp.tsx b/src/tui/playground/PlaygroundApp.tsx similarity index 97% rename from src/ui/tui/playground/PlaygroundApp.tsx rename to src/tui/playground/PlaygroundApp.tsx index 3c06e130e..d343bbe20 100644 --- a/src/ui/tui/playground/PlaygroundApp.tsx +++ b/src/tui/playground/PlaygroundApp.tsx @@ -5,7 +5,7 @@ * intro → (press enter) → run (tabbed demo view) */ -import { ScreenContainer, TabContainer } from '@ui/tui/primitives/index'; +import { ScreenContainer, TabContainer } from '@tui/primitives/index'; import type { WizardStore } from '@ui/tui/store'; import { WelcomeDemo } from './demos/WelcomeDemo.js'; import { LayoutDemo } from './demos/LayoutDemo.js'; diff --git a/src/ui/tui/playground/demos/AiOptInDemo.tsx b/src/tui/playground/demos/AiOptInDemo.tsx similarity index 96% rename from src/ui/tui/playground/demos/AiOptInDemo.tsx rename to src/tui/playground/demos/AiOptInDemo.tsx index 4fb99d37a..33633c41b 100644 --- a/src/ui/tui/playground/demos/AiOptInDemo.tsx +++ b/src/tui/playground/demos/AiOptInDemo.tsx @@ -15,7 +15,7 @@ import { useEffect, useState } from 'react'; import { Box, Text } from 'ink'; import { WizardStore } from '@ui/tui/store'; -import { AiOptInRequiredScreen } from '@ui/tui/screens/AiOptInRequiredScreen'; +import { AiOptInRequiredScreen } from '@tui/screens/AiOptInRequiredScreen'; import { HostResolution } from '@shared/host-resolution'; type Variant = 'admin' | 'non-admin'; diff --git a/src/ui/tui/playground/demos/AskModalDemo.tsx b/src/tui/playground/demos/AskModalDemo.tsx similarity index 99% rename from src/ui/tui/playground/demos/AskModalDemo.tsx rename to src/tui/playground/demos/AskModalDemo.tsx index a381e4883..e8bd503ce 100644 --- a/src/ui/tui/playground/demos/AskModalDemo.tsx +++ b/src/tui/playground/demos/AskModalDemo.tsx @@ -11,8 +11,8 @@ import { ModalOverlay, PickerMenu, GroupedPickerMenu, -} from '@ui/tui/primitives/index'; -import { Colors, Icons } from '@ui/tui/styles'; +} from '@tui/primitives/index'; +import { Colors, Icons } from '@tui/styles'; import { LONG_OPTIONS } from './InputDemo.js'; enum DemoStep { diff --git a/src/ui/tui/playground/demos/AuditChecksDemo.tsx b/src/tui/playground/demos/AuditChecksDemo.tsx similarity index 96% rename from src/ui/tui/playground/demos/AuditChecksDemo.tsx rename to src/tui/playground/demos/AuditChecksDemo.tsx index fab8e01fb..580d2624c 100644 --- a/src/ui/tui/playground/demos/AuditChecksDemo.tsx +++ b/src/tui/playground/demos/AuditChecksDemo.tsx @@ -6,7 +6,7 @@ import { Box } from 'ink'; import type { AuditCheck } from '@programs/audit/types'; -import { AuditChecksViewer } from '@ui/tui/screens/audit/AuditChecksViewer/AuditChecksViewer'; +import { AuditChecksViewer } from '@tui/programs/audit/screens/AuditChecksViewer/AuditChecksViewer'; const MOCK_CHECKS: AuditCheck[] = [ { diff --git a/src/ui/tui/playground/demos/DoctorReportDemo.tsx b/src/tui/playground/demos/DoctorReportDemo.tsx similarity index 92% rename from src/ui/tui/playground/demos/DoctorReportDemo.tsx rename to src/tui/playground/demos/DoctorReportDemo.tsx index 9a7adc6a0..b6af0f947 100644 --- a/src/ui/tui/playground/demos/DoctorReportDemo.tsx +++ b/src/tui/playground/demos/DoctorReportDemo.tsx @@ -1,6 +1,6 @@ import { Box, Text } from 'ink'; -import { Colors, Icons } from '@ui/tui/styles'; -import { IssueTable } from '@ui/tui/screens/doctor/IssueTable'; +import { Colors, Icons } from '@tui/styles'; +import { IssueTable } from '@tui/tools/doctor/screens/IssueTable'; import type { HealthIssue } from '@programs/posthog-doctor/index'; const NOW = '2026-04-27T15:00:00Z'; diff --git a/src/ui/tui/playground/demos/EndScreensDemo.tsx b/src/tui/playground/demos/EndScreensDemo.tsx similarity index 96% rename from src/ui/tui/playground/demos/EndScreensDemo.tsx rename to src/tui/playground/demos/EndScreensDemo.tsx index 4038c689e..7ee8753f7 100644 --- a/src/ui/tui/playground/demos/EndScreensDemo.tsx +++ b/src/tui/playground/demos/EndScreensDemo.tsx @@ -23,9 +23,9 @@ import { Box, Text, useInput } from 'ink'; import { useEffect, useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { SlackConnectScreen } from '@ui/tui/screens/SlackConnectScreen'; -import { OutroScreen } from '@ui/tui/screens/OutroScreen'; -import { Colors } from '@ui/tui/styles'; +import { SlackConnectScreen } from '@tui/screens/SlackConnectScreen'; +import { OutroScreen } from '@tui/screens/OutroScreen'; +import { Colors } from '@tui/styles'; import { OutroKind, type OutroData } from '@lib/wizard-session'; import { HostResolution } from '@shared/host-resolution'; diff --git a/src/ui/tui/playground/demos/HealthCheckDemo.tsx b/src/tui/playground/demos/HealthCheckDemo.tsx similarity index 93% rename from src/ui/tui/playground/demos/HealthCheckDemo.tsx rename to src/tui/playground/demos/HealthCheckDemo.tsx index eb407a1a4..610907aaa 100644 --- a/src/ui/tui/playground/demos/HealthCheckDemo.tsx +++ b/src/tui/playground/demos/HealthCheckDemo.tsx @@ -2,9 +2,9 @@ import { useEffect, useState } from 'react'; import { Box, Text } from 'ink'; -import { LoadingBox, ModalOverlay } from '@ui/tui/primitives/index'; -import { Icons } from '@ui/tui/styles'; -import { ServiceHealthList } from '@ui/tui/components/ServiceHealthList'; +import { LoadingBox, ModalOverlay } from '@tui/primitives/index'; +import { Icons } from '@tui/styles'; +import { ServiceHealthList } from '@tui/components/ServiceHealthList'; import { getBlockingServiceKeys } from '@shared/health-checks/readiness'; import { ServiceHealthStatus } from '@shared/health-checks/types'; import type { AllServicesHealth } from '@shared/health-checks/types'; diff --git a/src/ui/tui/playground/demos/InputDemo.tsx b/src/tui/playground/demos/InputDemo.tsx similarity index 97% rename from src/ui/tui/playground/demos/InputDemo.tsx rename to src/tui/playground/demos/InputDemo.tsx index 3e941aea2..7af72db4e 100644 --- a/src/ui/tui/playground/demos/InputDemo.tsx +++ b/src/tui/playground/demos/InputDemo.tsx @@ -4,8 +4,8 @@ import { Box, Text } from 'ink'; import { useState } from 'react'; -import { PickerMenu, ConfirmationInput } from '@ui/tui/primitives/index'; -import { Colors } from '@ui/tui/styles'; +import { PickerMenu, ConfirmationInput } from '@tui/primitives/index'; +import { Colors } from '@tui/styles'; enum DemoStep { Single = 'single', diff --git a/src/ui/tui/playground/demos/KeyboardHintsDemo.tsx b/src/tui/playground/demos/KeyboardHintsDemo.tsx similarity index 98% rename from src/ui/tui/playground/demos/KeyboardHintsDemo.tsx rename to src/tui/playground/demos/KeyboardHintsDemo.tsx index dbb7add05..730e829f2 100644 --- a/src/ui/tui/playground/demos/KeyboardHintsDemo.tsx +++ b/src/tui/playground/demos/KeyboardHintsDemo.tsx @@ -13,8 +13,8 @@ import { PickerMenu, GroupedPickerMenu, ConfirmationInput, -} from '@ui/tui/primitives/index'; -import { Colors } from '@ui/tui/styles'; +} from '@tui/primitives/index'; +import { Colors } from '@tui/styles'; enum DemoStep { SingleSelect = 'single', diff --git a/src/ui/tui/playground/demos/LayoutDemo.tsx b/src/tui/playground/demos/LayoutDemo.tsx similarity index 93% rename from src/ui/tui/playground/demos/LayoutDemo.tsx rename to src/tui/playground/demos/LayoutDemo.tsx index c5c2951e0..23237a5af 100644 --- a/src/ui/tui/playground/demos/LayoutDemo.tsx +++ b/src/tui/playground/demos/LayoutDemo.tsx @@ -5,8 +5,8 @@ import { Box, Text, useInput } from 'ink'; import { useState } from 'react'; -import { CardLayout, SplitView, ConfirmButton } from '@ui/tui/primitives/index'; -import { HAlign, VAlign, Colors } from '@ui/tui/styles'; +import { CardLayout, SplitView, ConfirmButton } from '@tui/primitives/index'; +import { HAlign, VAlign, Colors } from '@tui/styles'; const hAligns = [HAlign.Left, HAlign.Center, HAlign.Right]; const vAligns = [VAlign.Top, VAlign.Center, VAlign.Bottom]; diff --git a/src/ui/tui/playground/demos/LearnDeckDemo.tsx b/src/tui/playground/demos/LearnDeckDemo.tsx similarity index 96% rename from src/ui/tui/playground/demos/LearnDeckDemo.tsx rename to src/tui/playground/demos/LearnDeckDemo.tsx index b94b38796..c7354e9ad 100644 --- a/src/ui/tui/playground/demos/LearnDeckDemo.tsx +++ b/src/tui/playground/demos/LearnDeckDemo.tsx @@ -24,13 +24,13 @@ import { ProgressList, SplitView, TextRevealMode, -} from '@ui/tui/primitives/index'; -import type { ContentBlock, ProgressItem } from '@ui/tui/primitives/index'; -import { Colors } from '@ui/tui/styles'; +} from '@tui/primitives/index'; +import type { ContentBlock, ProgressItem } from '@tui/primitives/index'; +import { Colors } from '@tui/styles'; import type { WizardStore } from '@ui/tui/store'; import { PROGRAM_REGISTRY } from '@programs'; -import { AUDIT_AREA_SLIDES } from '@ui/tui/screens/audit/slides/index'; -import type { AreaSlide } from '@ui/tui/screens/audit/slides/shared'; +import { AUDIT_AREA_SLIDES } from '@tui/programs/audit/screens/slides/index'; +import type { AreaSlide } from '@tui/programs/audit/screens/slides/shared'; interface Deck { id: string; diff --git a/src/ui/tui/playground/demos/LogDemo.tsx b/src/tui/playground/demos/LogDemo.tsx similarity index 95% rename from src/ui/tui/playground/demos/LogDemo.tsx rename to src/tui/playground/demos/LogDemo.tsx index b277aa8fa..f8828d05e 100644 --- a/src/ui/tui/playground/demos/LogDemo.tsx +++ b/src/tui/playground/demos/LogDemo.tsx @@ -8,8 +8,8 @@ import { useEffect, useState } from 'react'; import * as fs from 'fs'; import * as path from 'path'; import * as os from 'os'; -import { LogViewer } from '@ui/tui/primitives/index'; -import { Colors } from '@ui/tui/styles'; +import { LogViewer } from '@tui/primitives/index'; +import { Colors } from '@tui/styles'; const DEMO_LOG_PATH = path.join(os.tmpdir(), 'posthog-playground.log'); diff --git a/src/ui/tui/playground/demos/McpDemo.tsx b/src/tui/playground/demos/McpDemo.tsx similarity index 92% rename from src/ui/tui/playground/demos/McpDemo.tsx rename to src/tui/playground/demos/McpDemo.tsx index c24ffa20d..a6a070f77 100644 --- a/src/ui/tui/playground/demos/McpDemo.tsx +++ b/src/tui/playground/demos/McpDemo.tsx @@ -6,12 +6,12 @@ */ import { WizardStore } from '@ui/tui/store'; -import { McpScreen } from '@ui/tui/screens/McpScreen'; +import { McpScreen } from '@tui/screens/McpScreen'; import type { McpInstaller, McpClientInfo, -} from '@ui/tui/services/mcp-installer'; -import { McpClientStatus } from '@steps/add-mcp-server-to-clients/results'; +} from '@tui/services/mcp-installer'; +import { McpClientStatus } from '@shared/mcp-clients/results'; const MOCK_CLIENTS: McpClientInfo[] = [ { name: 'Claude Code', supportsPlugin: true, pluginBundlesMcp: false }, diff --git a/src/ui/tui/playground/demos/McpSuggestedPromptsDemo.tsx b/src/tui/playground/demos/McpSuggestedPromptsDemo.tsx similarity index 97% rename from src/ui/tui/playground/demos/McpSuggestedPromptsDemo.tsx rename to src/tui/playground/demos/McpSuggestedPromptsDemo.tsx index a7e4d5b00..9d030afa1 100644 --- a/src/ui/tui/playground/demos/McpSuggestedPromptsDemo.tsx +++ b/src/tui/playground/demos/McpSuggestedPromptsDemo.tsx @@ -34,21 +34,21 @@ import { Box, Text, useInput } from 'ink'; import { useEffect, useMemo, useRef, useState } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { McpSuggestedPromptsScreen } from '@ui/tui/screens/McpSuggestedPromptsScreen'; -import { Colors } from '@ui/tui/styles'; +import { McpSuggestedPromptsScreen } from '@tui/tools/mcp/screens/McpSuggestedPromptsScreen'; +import { Colors } from '@tui/styles'; import { Integration } from '@shared/constants'; import { McpOutcome } from '@lib/wizard-session'; import { HostResolution } from '@shared/host-resolution'; -import { TAILORED_ROLES } from '@lib/mcp-role-prompts'; +import { TAILORED_ROLES } from '@tui/tools/mcp/services/mcp-role-prompts'; import { assembleProfile, type ProjectDataProfile, -} from '@lib/mcp-project-profile'; -import { seededProfile } from '@lib/mcp-seed-events'; +} from '@tui/tools/mcp/services/mcp-project-profile'; +import { seededProfile } from '@tui/tools/mcp/services/seed-events'; import type { AgentChunk, McpSuggestedPromptsServices, -} from '@ui/tui/services/mcp-suggested-prompts-services'; +} from '@tui/tools/mcp/services/suggested-prompts'; // One Integration per framework family so cycling exercises every // override bucket in mcp-role-prompts.ts. diff --git a/src/ui/tui/playground/demos/ModalDemo.tsx b/src/tui/playground/demos/ModalDemo.tsx similarity index 92% rename from src/ui/tui/playground/demos/ModalDemo.tsx rename to src/tui/playground/demos/ModalDemo.tsx index 4c27e02a9..fc829a4d9 100644 --- a/src/ui/tui/playground/demos/ModalDemo.tsx +++ b/src/tui/playground/demos/ModalDemo.tsx @@ -5,8 +5,8 @@ */ import { Box, Text } from 'ink'; -import { ModalOverlay } from '@ui/tui/primitives/index'; -import { Icons } from '@ui/tui/styles'; +import { ModalOverlay } from '@tui/primitives/index'; +import { Icons } from '@tui/styles'; export const ModalDemo = () => { return ( diff --git a/src/ui/tui/playground/demos/ProgressDemo.tsx b/src/tui/playground/demos/ProgressDemo.tsx similarity index 92% rename from src/ui/tui/playground/demos/ProgressDemo.tsx rename to src/tui/playground/demos/ProgressDemo.tsx index 10246af9c..c3f1da80f 100644 --- a/src/ui/tui/playground/demos/ProgressDemo.tsx +++ b/src/tui/playground/demos/ProgressDemo.tsx @@ -5,9 +5,9 @@ import { Box, Text } from 'ink'; import { useState, useEffect } from 'react'; -import { ProgressList, LoadingBox } from '@ui/tui/primitives/index'; -import type { ProgressItem } from '@ui/tui/primitives/index'; -import { Colors } from '@ui/tui/styles'; +import { ProgressList, LoadingBox } from '@tui/primitives/index'; +import type { ProgressItem } from '@tui/primitives/index'; +import { Colors } from '@tui/styles'; const INITIAL_ITEMS: ProgressItem[] = [ { diff --git a/src/ui/tui/playground/demos/RunScreenDemo.tsx b/src/tui/playground/demos/RunScreenDemo.tsx similarity index 95% rename from src/ui/tui/playground/demos/RunScreenDemo.tsx rename to src/tui/playground/demos/RunScreenDemo.tsx index 60a92516f..d90fef64a 100644 --- a/src/ui/tui/playground/demos/RunScreenDemo.tsx +++ b/src/tui/playground/demos/RunScreenDemo.tsx @@ -30,14 +30,14 @@ import { LogViewer, EventPlanViewer, HNViewer, -} from '@ui/tui/primitives/index'; -import type { ProgressItem, TabDefinition } from '@ui/tui/primitives/index'; -import { LearnCard } from '@ui/tui/components/LearnCard'; -import { TipsCard } from '@ui/tui/components/TipsCard'; -import { VisualizerTab } from '@ui/tui/components/PhaseVisuals'; +} from '@tui/primitives/index'; +import type { ProgressItem, TabDefinition } from '@tui/primitives/index'; +import { LearnCard } from '@tui/components/LearnCard'; +import { TipsCard } from '@tui/components/TipsCard'; +import { VisualizerTab } from '@tui/components/PhaseVisuals'; import { getProgramConfig } from '@programs'; -import { getContentBlocks as getSkillContentBlocks } from '@ui/tui/decks/agent-skill/index'; -import { Colors } from '@ui/tui/styles'; +import { getContentBlocks as getSkillContentBlocks } from '@tui/programs/shared/skill-deck'; +import { Colors } from '@tui/styles'; import { WIZARD_LOG_FILE } from '@utils/paths'; const STAGE_CYCLE: AgentPhase[] = [ diff --git a/src/ui/tui/playground/demos/ViewportGuardDemo.tsx b/src/tui/playground/demos/ViewportGuardDemo.tsx similarity index 96% rename from src/ui/tui/playground/demos/ViewportGuardDemo.tsx rename to src/tui/playground/demos/ViewportGuardDemo.tsx index cd1ff6494..18ea36b15 100644 --- a/src/ui/tui/playground/demos/ViewportGuardDemo.tsx +++ b/src/tui/playground/demos/ViewportGuardDemo.tsx @@ -11,7 +11,7 @@ import { ViewportTooSmall, MIN_VIEWPORT_COLUMNS, MIN_VIEWPORT_ROWS, -} from '@ui/tui/primitives/index'; +} from '@tui/primitives/index'; const SAMPLES: Array<[number, number]> = [ [70, 8], diff --git a/src/ui/tui/playground/demos/WelcomeDemo.tsx b/src/tui/playground/demos/WelcomeDemo.tsx similarity index 95% rename from src/ui/tui/playground/demos/WelcomeDemo.tsx rename to src/tui/playground/demos/WelcomeDemo.tsx index 2020c4e06..48c57477a 100644 --- a/src/ui/tui/playground/demos/WelcomeDemo.tsx +++ b/src/tui/playground/demos/WelcomeDemo.tsx @@ -4,7 +4,7 @@ import { Box, Text, useInput } from 'ink'; import type { WizardStore } from '@ui/tui/store'; -import { Colors, Icons } from '@ui/tui/styles'; +import { Colors, Icons } from '@tui/styles'; interface WelcomeDemoProps { store: WizardStore; diff --git a/src/ui/tui/playground/start-playground.ts b/src/tui/playground/start-playground.ts similarity index 100% rename from src/ui/tui/playground/start-playground.ts rename to src/tui/playground/start-playground.ts diff --git a/src/ui/tui/primitives/CardLayout.tsx b/src/tui/primitives/CardLayout.tsx similarity index 91% rename from src/ui/tui/primitives/CardLayout.tsx rename to src/tui/primitives/CardLayout.tsx index 1d0b001ad..ed6d28239 100644 --- a/src/ui/tui/primitives/CardLayout.tsx +++ b/src/tui/primitives/CardLayout.tsx @@ -4,7 +4,7 @@ import { Box } from 'ink'; import type { ReactNode } from 'react'; -import { HAlign, VAlign } from '@ui/tui/styles'; +import { HAlign, VAlign } from '@tui/styles'; interface CardLayoutProps { hAlign?: HAlign; diff --git a/src/ui/tui/primitives/ConfirmButton.tsx b/src/tui/primitives/ConfirmButton.tsx similarity index 96% rename from src/ui/tui/primitives/ConfirmButton.tsx rename to src/tui/primitives/ConfirmButton.tsx index 9011c227f..739237340 100644 --- a/src/ui/tui/primitives/ConfirmButton.tsx +++ b/src/tui/primitives/ConfirmButton.tsx @@ -13,7 +13,7 @@ */ import { Text } from 'ink'; -import { Icons, Colors } from '@ui/tui/styles'; +import { Icons, Colors } from '@tui/styles'; interface ConfirmButtonProps { /** Button text. Defaults to "Confirm". */ diff --git a/src/ui/tui/primitives/ConfirmationInput.tsx b/src/tui/primitives/ConfirmationInput.tsx similarity index 94% rename from src/ui/tui/primitives/ConfirmationInput.tsx rename to src/tui/primitives/ConfirmationInput.tsx index 8d60b54d4..46715d558 100644 --- a/src/ui/tui/primitives/ConfirmationInput.tsx +++ b/src/tui/primitives/ConfirmationInput.tsx @@ -8,9 +8,9 @@ import { Box, Text } from 'ink'; import { useState } from 'react'; -import { Icons, Colors } from '@ui/tui/styles'; +import { Icons, Colors } from '@tui/styles'; import { PromptLabel } from './PromptLabel.js'; -import { useKeyBindings, KeyMatch } from '@ui/tui/hooks/useKeyBindings'; +import { useKeyBindings, KeyMatch } from '@tui/hooks/useKeyBindings'; interface ConfirmationInputProps { message: string; diff --git a/src/ui/tui/primitives/ContentSequencer.tsx b/src/tui/primitives/ContentSequencer.tsx similarity index 100% rename from src/ui/tui/primitives/ContentSequencer.tsx rename to src/tui/primitives/ContentSequencer.tsx diff --git a/src/ui/tui/primitives/DissolveTransition.tsx b/src/tui/primitives/DissolveTransition.tsx similarity index 100% rename from src/ui/tui/primitives/DissolveTransition.tsx rename to src/tui/primitives/DissolveTransition.tsx diff --git a/src/ui/tui/primitives/Divider.tsx b/src/tui/primitives/Divider.tsx similarity index 100% rename from src/ui/tui/primitives/Divider.tsx rename to src/tui/primitives/Divider.tsx diff --git a/src/ui/tui/primitives/EventPlanViewer.tsx b/src/tui/primitives/EventPlanViewer.tsx similarity index 100% rename from src/ui/tui/primitives/EventPlanViewer.tsx rename to src/tui/primitives/EventPlanViewer.tsx diff --git a/src/ui/tui/primitives/GroupedPickerMenu.tsx b/src/tui/primitives/GroupedPickerMenu.tsx similarity index 98% rename from src/ui/tui/primitives/GroupedPickerMenu.tsx rename to src/tui/primitives/GroupedPickerMenu.tsx index 533e10f8e..a819f237e 100644 --- a/src/ui/tui/primitives/GroupedPickerMenu.tsx +++ b/src/tui/primitives/GroupedPickerMenu.tsx @@ -17,11 +17,11 @@ import { Box, Text } from 'ink'; import { useState, useMemo } from 'react'; -import { Icons, Colors } from '@ui/tui/styles'; +import { Icons, Colors } from '@tui/styles'; import { PromptLabel } from './PromptLabel.js'; import { ConfirmButton } from './ConfirmButton.js'; -import { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions'; -import { useKeyBindings, KeyMatch } from '@ui/tui/hooks/useKeyBindings'; +import { useStdoutDimensions } from '@tui/hooks/useStdoutDimensions'; +import { useKeyBindings, KeyMatch } from '@tui/hooks/useKeyBindings'; interface GroupOption { value: string; diff --git a/src/ui/tui/primitives/HNViewer.tsx b/src/tui/primitives/HNViewer.tsx similarity index 96% rename from src/ui/tui/primitives/HNViewer.tsx rename to src/tui/primitives/HNViewer.tsx index f47887f2a..9c60c2da4 100644 --- a/src/ui/tui/primitives/HNViewer.tsx +++ b/src/tui/primitives/HNViewer.tsx @@ -7,8 +7,8 @@ import { Box, Text } from 'ink'; import { useState, useEffect } from 'react'; -import { Colors } from '@ui/tui/styles'; -import { useKeyBindings } from '@ui/tui/hooks/useKeyBindings'; +import { Colors } from '@tui/styles'; +import { useKeyBindings } from '@tui/hooks/useKeyBindings'; const HN_API = 'https://hacker-news.firebaseio.com/v0'; diff --git a/src/ui/tui/primitives/KeyboardHintsBar.tsx b/src/tui/primitives/KeyboardHintsBar.tsx similarity index 86% rename from src/ui/tui/primitives/KeyboardHintsBar.tsx rename to src/tui/primitives/KeyboardHintsBar.tsx index f64a467d1..dd298d18b 100644 --- a/src/ui/tui/primitives/KeyboardHintsBar.tsx +++ b/src/tui/primitives/KeyboardHintsBar.tsx @@ -6,8 +6,8 @@ */ import { Box, Text } from 'ink'; -import { useKeyboardHintsContext } from '@ui/tui/hooks/useKeyboardHints'; -import { Colors } from '@ui/tui/styles'; +import { useKeyboardHintsContext } from '@tui/hooks/useKeyboardHints'; +import { Colors } from '@tui/styles'; export const KeyboardHintsBar = () => { const { hints } = useKeyboardHintsContext(); diff --git a/src/ui/tui/primitives/LinesBlock.tsx b/src/tui/primitives/LinesBlock.tsx similarity index 100% rename from src/ui/tui/primitives/LinesBlock.tsx rename to src/tui/primitives/LinesBlock.tsx diff --git a/src/ui/tui/primitives/LinkText.tsx b/src/tui/primitives/LinkText.tsx similarity index 97% rename from src/ui/tui/primitives/LinkText.tsx rename to src/tui/primitives/LinkText.tsx index 296d6c382..e9e2bc6cc 100644 --- a/src/ui/tui/primitives/LinkText.tsx +++ b/src/tui/primitives/LinkText.tsx @@ -13,7 +13,7 @@ * rendering (see `PendingQuestion.richLinks`). Other flows are untouched. */ import { Box, Text } from 'ink'; -import { Colors } from '@ui/tui/styles'; +import { Colors } from '@tui/styles'; import { osc8Hyperlink, truncateUrlLabel, diff --git a/src/ui/tui/primitives/LoadingBox.tsx b/src/tui/primitives/LoadingBox.tsx similarity index 100% rename from src/ui/tui/primitives/LoadingBox.tsx rename to src/tui/primitives/LoadingBox.tsx diff --git a/src/ui/tui/primitives/LogViewer.tsx b/src/tui/primitives/LogViewer.tsx similarity index 98% rename from src/ui/tui/primitives/LogViewer.tsx rename to src/tui/primitives/LogViewer.tsx index 8277802c3..e4ddff1fc 100644 --- a/src/ui/tui/primitives/LogViewer.tsx +++ b/src/tui/primitives/LogViewer.tsx @@ -13,7 +13,7 @@ import { Box, Text } from 'ink'; import { useState, useEffect } from 'react'; import * as fs from 'fs'; -import { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions'; +import { useStdoutDimensions } from '@tui/hooks/useStdoutDimensions'; /** Rows consumed by TitleBar + spacer + ScreenContainer padding + status bar + * tab bar, with a couple rows of headroom so the tail never crowds the status diff --git a/src/ui/tui/primitives/ModalOverlay.tsx b/src/tui/primitives/ModalOverlay.tsx similarity index 100% rename from src/ui/tui/primitives/ModalOverlay.tsx rename to src/tui/primitives/ModalOverlay.tsx diff --git a/src/ui/tui/primitives/NodeBlock.tsx b/src/tui/primitives/NodeBlock.tsx similarity index 100% rename from src/ui/tui/primitives/NodeBlock.tsx rename to src/tui/primitives/NodeBlock.tsx diff --git a/src/ui/tui/primitives/PickerMenu.tsx b/src/tui/primitives/PickerMenu.tsx similarity index 99% rename from src/ui/tui/primitives/PickerMenu.tsx rename to src/tui/primitives/PickerMenu.tsx index 33436be9f..205bc1417 100644 --- a/src/ui/tui/primitives/PickerMenu.tsx +++ b/src/tui/primitives/PickerMenu.tsx @@ -12,17 +12,17 @@ import { Box, Text } from 'ink'; import { useEffect, useMemo, useState } from 'react'; import { buildPickerIndex, rankOptions } from './picker-filter.js'; -import { Icons, Colors } from '@ui/tui/styles'; +import { Icons, Colors } from '@tui/styles'; import { PromptLabel } from './PromptLabel.js'; import { ConfirmButton } from './ConfirmButton.js'; import { wordWrap } from './layout-helpers.js'; -import { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions'; +import { useStdoutDimensions } from '@tui/hooks/useStdoutDimensions'; import { useKeyBindings, KeyMatch, type KeyBinding, type KeyMatchOrChar, -} from '@ui/tui/hooks/useKeyBindings'; +} from '@tui/hooks/useKeyBindings'; export interface PickerOption { label: string; diff --git a/src/ui/tui/primitives/ProgressList.tsx b/src/tui/primitives/ProgressList.tsx similarity index 98% rename from src/ui/tui/primitives/ProgressList.tsx rename to src/tui/primitives/ProgressList.tsx index a5930721c..d124dcf7c 100644 --- a/src/ui/tui/primitives/ProgressList.tsx +++ b/src/tui/primitives/ProgressList.tsx @@ -5,7 +5,7 @@ import { Box, Text } from 'ink'; import { Spinner } from '@inkjs/ui'; -import { Colors, Icons } from '@ui/tui/styles'; +import { Colors, Icons } from '@tui/styles'; import { LoadingBox } from './LoadingBox.js'; export interface ProgressItem { diff --git a/src/ui/tui/primitives/PromptLabel.tsx b/src/tui/primitives/PromptLabel.tsx similarity index 92% rename from src/ui/tui/primitives/PromptLabel.tsx rename to src/tui/primitives/PromptLabel.tsx index 84603c893..dc3965223 100644 --- a/src/ui/tui/primitives/PromptLabel.tsx +++ b/src/tui/primitives/PromptLabel.tsx @@ -6,7 +6,7 @@ */ import { Box, Text } from 'ink'; -import { Colors } from '@ui/tui/styles'; +import { Colors } from '@tui/styles'; interface PromptLabelProps { message?: string; diff --git a/src/ui/tui/primitives/ScreenContainer.tsx b/src/tui/primitives/ScreenContainer.tsx similarity index 95% rename from src/ui/tui/primitives/ScreenContainer.tsx rename to src/tui/primitives/ScreenContainer.tsx index afc385c9b..653913a30 100644 --- a/src/ui/tui/primitives/ScreenContainer.tsx +++ b/src/tui/primitives/ScreenContainer.tsx @@ -12,13 +12,13 @@ import { Box, useInput, useStdout } from 'ink'; import { useSyncExternalStore, type ReactNode } from 'react'; -import { TitleBar } from '@ui/tui/components/TitleBar'; +import { TitleBar } from '@tui/components/TitleBar'; import { TokenCostHud, tokenCostHudRowCount, -} from '@ui/tui/components/TokenCostHud'; -import { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions'; -import { KeyboardHintsProvider } from '@ui/tui/hooks/useKeyboardHints'; +} from '@tui/components/TokenCostHud'; +import { useStdoutDimensions } from '@tui/hooks/useStdoutDimensions'; +import { KeyboardHintsProvider } from '@tui/hooks/useKeyboardHints'; import { DissolveTransition } from './DissolveTransition.js'; import { KeyboardHintsBar } from './KeyboardHintsBar.js'; import { ScreenErrorBoundary } from './ScreenErrorBoundary.js'; diff --git a/src/ui/tui/primitives/ScreenErrorBoundary.tsx b/src/tui/primitives/ScreenErrorBoundary.tsx similarity index 100% rename from src/ui/tui/primitives/ScreenErrorBoundary.tsx rename to src/tui/primitives/ScreenErrorBoundary.tsx diff --git a/src/ui/tui/primitives/SplitView.tsx b/src/tui/primitives/SplitView.tsx similarity index 100% rename from src/ui/tui/primitives/SplitView.tsx rename to src/tui/primitives/SplitView.tsx diff --git a/src/ui/tui/primitives/TabContainer.tsx b/src/tui/primitives/TabContainer.tsx similarity index 96% rename from src/ui/tui/primitives/TabContainer.tsx rename to src/tui/primitives/TabContainer.tsx index 1b5a0ed69..ee4ef3f37 100644 --- a/src/ui/tui/primitives/TabContainer.tsx +++ b/src/tui/primitives/TabContainer.tsx @@ -8,14 +8,14 @@ import { Box, Text } from 'ink'; import { useState, useMemo, type ReactNode } from 'react'; -import { Colors, Icons } from '@ui/tui/styles'; +import { Colors, Icons } from '@tui/styles'; import { useKeyBindings, KeyMatch, type KeyBinding, -} from '@ui/tui/hooks/useKeyBindings'; +} from '@tui/hooks/useKeyBindings'; import type { WizardStore } from '@ui/tui/store'; -import { COLLAPSED_COUNT, EXPANDED_COUNT } from '@ui/tui/constants'; +import { COLLAPSED_COUNT, EXPANDED_COUNT } from '@tui/constants'; // Re-exported so existing importers (e.g. LearnCard) keep their path. export { COLLAPSED_COUNT, EXPANDED_COUNT }; diff --git a/src/ui/tui/primitives/TextBlock.tsx b/src/tui/primitives/TextBlock.tsx similarity index 99% rename from src/ui/tui/primitives/TextBlock.tsx rename to src/tui/primitives/TextBlock.tsx index db5737d4d..342d211eb 100644 --- a/src/ui/tui/primitives/TextBlock.tsx +++ b/src/tui/primitives/TextBlock.tsx @@ -14,7 +14,7 @@ import { Text } from 'ink'; import { useState, useEffect, useRef, useMemo, type ReactNode } from 'react'; -import { Colors } from '@ui/tui/styles'; +import { Colors } from '@tui/styles'; import { splitSentences, sentenceEndChars, diff --git a/src/ui/tui/primitives/ViewportTooSmall.tsx b/src/tui/primitives/ViewportTooSmall.tsx similarity index 98% rename from src/ui/tui/primitives/ViewportTooSmall.tsx rename to src/tui/primitives/ViewportTooSmall.tsx index d5aec7e92..a0b7b4c06 100644 --- a/src/ui/tui/primitives/ViewportTooSmall.tsx +++ b/src/tui/primitives/ViewportTooSmall.tsx @@ -11,7 +11,7 @@ import { Box, Text } from 'ink'; import { wordWrap } from './layout-helpers.js'; -import { Colors } from '@ui/tui/styles'; +import { Colors } from '@tui/styles'; /** Smallest terminal the wizard will render its screens into. */ export const MIN_VIEWPORT_COLUMNS = 80; diff --git a/src/ui/tui/primitives/content-types.ts b/src/tui/primitives/content-types.ts similarity index 100% rename from src/ui/tui/primitives/content-types.ts rename to src/tui/primitives/content-types.ts diff --git a/src/ui/tui/primitives/index.ts b/src/tui/primitives/index.ts similarity index 100% rename from src/ui/tui/primitives/index.ts rename to src/tui/primitives/index.ts diff --git a/src/ui/tui/primitives/layout-helpers.ts b/src/tui/primitives/layout-helpers.ts similarity index 100% rename from src/ui/tui/primitives/layout-helpers.ts rename to src/tui/primitives/layout-helpers.ts diff --git a/src/ui/tui/primitives/link-helpers.ts b/src/tui/primitives/link-helpers.ts similarity index 100% rename from src/ui/tui/primitives/link-helpers.ts rename to src/tui/primitives/link-helpers.ts diff --git a/src/ui/tui/primitives/picker-filter.ts b/src/tui/primitives/picker-filter.ts similarity index 100% rename from src/ui/tui/primitives/picker-filter.ts rename to src/tui/primitives/picker-filter.ts diff --git a/src/ui/tui/primitives/text-helpers.ts b/src/tui/primitives/text-helpers.ts similarity index 100% rename from src/ui/tui/primitives/text-helpers.ts rename to src/tui/primitives/text-helpers.ts diff --git a/src/ui/tui/screens/AiObservabilityIntroScreen.tsx b/src/tui/programs/ai-observability/screens/AiObservabilityIntroScreen.tsx similarity index 96% rename from src/ui/tui/screens/AiObservabilityIntroScreen.tsx rename to src/tui/programs/ai-observability/screens/AiObservabilityIntroScreen.tsx index ce40ea456..11b97b70f 100644 --- a/src/ui/tui/screens/AiObservabilityIntroScreen.tsx +++ b/src/tui/programs/ai-observability/screens/AiObservabilityIntroScreen.tsx @@ -1,11 +1,11 @@ import { Box, Text } from 'ink'; import { useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { IntroScreenLayout } from '@ui/tui/screens/IntroScreenLayout'; +import { IntroScreenLayout } from '@tui/screens/IntroScreenLayout'; import { SkillSourceInfo, useSkillEntry, -} from '@ui/tui/screens/SkillSourceInfo'; +} from '@tui/screens/SkillSourceInfo'; interface AiObservabilityIntroScreenProps { store: WizardStore; diff --git a/src/ui/tui/__tests__/audit-counts.test.tsx b/src/tui/programs/audit/__tests__/audit-counts.test.tsx similarity index 85% rename from src/ui/tui/__tests__/audit-counts.test.tsx rename to src/tui/programs/audit/__tests__/audit-counts.test.tsx index a30042c6e..d5a30b273 100644 --- a/src/ui/tui/__tests__/audit-counts.test.tsx +++ b/src/tui/programs/audit/__tests__/audit-counts.test.tsx @@ -1,12 +1,12 @@ import { it, expect, vi, afterEach } from 'vitest'; import { render, cleanup } from 'ink-testing-library'; import type { AuditCheck, AuditStatus } from '@programs/audit/types'; -import { AuditChecksOutroSection } from '../screens/audit/AuditChecksOutroSection'; -import { Summary } from '../screens/audit/AuditChecksViewer/Header'; -import { WriteReportSlide } from '../screens/audit/slides/writeReport'; +import { AuditChecksOutroSection } from '../screens/AuditChecksOutroSection'; +import { Summary } from '../screens/AuditChecksViewer/Header'; +import { WriteReportSlide } from '../screens/slides/writeReport'; vi.mock('ink', () => - vi.importActual('../../../../node_modules/ink/build/index.js'), + vi.importActual('../../../../../node_modules/ink/build/index.d.js'), ); afterEach(cleanup); diff --git a/src/programs/events-audit/steps.ts b/src/tui/programs/audit/events-flow.ts similarity index 95% rename from src/programs/events-audit/steps.ts rename to src/tui/programs/audit/events-flow.ts index 53b2f59a2..d8bde2e24 100644 --- a/src/programs/events-audit/steps.ts +++ b/src/tui/programs/audit/events-flow.ts @@ -11,7 +11,7 @@ import type { ProgramStep } from '@programs/program-step'; import type { WizardSession } from '@lib/wizard-session'; import { RunPhase } from '@lib/wizard-session'; -import { HEALTH_CHECK_STEP } from '@programs/shared/health-check-step'; +import { HEALTH_CHECK_STEP } from '@tui/programs/shared/health-check-step'; function needsSetup(session: WizardSession): boolean { const config = session.frameworkConfig; diff --git a/src/ui/tui/screens/audit/AuditAreaPane.tsx b/src/tui/programs/audit/screens/AuditAreaPane.tsx similarity index 99% rename from src/ui/tui/screens/audit/AuditAreaPane.tsx rename to src/tui/programs/audit/screens/AuditAreaPane.tsx index 443d95c1e..187c102f9 100644 --- a/src/ui/tui/screens/audit/AuditAreaPane.tsx +++ b/src/tui/programs/audit/screens/AuditAreaPane.tsx @@ -16,7 +16,7 @@ import { Fragment } from 'react'; import { Box, Text, useInput } from 'ink'; import { spawn } from 'node:child_process'; -import { Colors } from '@ui/tui/styles'; +import { Colors } from '@tui/styles'; import { type AuditCheck } from '@programs/audit/types'; import { AUDIT_AREA_SLIDES, type AreaSlide } from './slides/index.js'; diff --git a/src/ui/tui/screens/audit/AuditChecksOutroSection.tsx b/src/tui/programs/audit/screens/AuditChecksOutroSection.tsx similarity index 100% rename from src/ui/tui/screens/audit/AuditChecksOutroSection.tsx rename to src/tui/programs/audit/screens/AuditChecksOutroSection.tsx diff --git a/src/ui/tui/screens/audit/AuditChecksViewer/AreaHeaderRow.tsx b/src/tui/programs/audit/screens/AuditChecksViewer/AreaHeaderRow.tsx similarity index 100% rename from src/ui/tui/screens/audit/AuditChecksViewer/AreaHeaderRow.tsx rename to src/tui/programs/audit/screens/AuditChecksViewer/AreaHeaderRow.tsx diff --git a/src/ui/tui/screens/audit/AuditChecksViewer/AuditChecksViewer.tsx b/src/tui/programs/audit/screens/AuditChecksViewer/AuditChecksViewer.tsx similarity index 98% rename from src/ui/tui/screens/audit/AuditChecksViewer/AuditChecksViewer.tsx rename to src/tui/programs/audit/screens/AuditChecksViewer/AuditChecksViewer.tsx index 8c104eb83..2fcd47ec1 100644 --- a/src/ui/tui/screens/audit/AuditChecksViewer/AuditChecksViewer.tsx +++ b/src/tui/programs/audit/screens/AuditChecksViewer/AuditChecksViewer.tsx @@ -17,12 +17,12 @@ import { Box, Text } from 'ink'; import { Fragment, useMemo, useState, type ReactNode } from 'react'; -import { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions'; +import { useStdoutDimensions } from '@tui/hooks/useStdoutDimensions'; import { KeyMatch, useKeyBindings, type KeyBinding, -} from '@ui/tui/hooks/useKeyBindings'; +} from '@tui/hooks/useKeyBindings'; import type { AuditCheck } from '@programs/audit/types'; import { AreaHeaderRow } from './AreaHeaderRow.js'; import { CheckRow } from './CheckRow.js'; diff --git a/src/ui/tui/screens/audit/AuditChecksViewer/CheckRow.tsx b/src/tui/programs/audit/screens/AuditChecksViewer/CheckRow.tsx similarity index 100% rename from src/ui/tui/screens/audit/AuditChecksViewer/CheckRow.tsx rename to src/tui/programs/audit/screens/AuditChecksViewer/CheckRow.tsx diff --git a/src/ui/tui/screens/audit/AuditChecksViewer/DetailRow.tsx b/src/tui/programs/audit/screens/AuditChecksViewer/DetailRow.tsx similarity index 100% rename from src/ui/tui/screens/audit/AuditChecksViewer/DetailRow.tsx rename to src/tui/programs/audit/screens/AuditChecksViewer/DetailRow.tsx diff --git a/src/ui/tui/screens/audit/AuditChecksViewer/Footer.tsx b/src/tui/programs/audit/screens/AuditChecksViewer/Footer.tsx similarity index 100% rename from src/ui/tui/screens/audit/AuditChecksViewer/Footer.tsx rename to src/tui/programs/audit/screens/AuditChecksViewer/Footer.tsx diff --git a/src/ui/tui/screens/audit/AuditChecksViewer/Header.tsx b/src/tui/programs/audit/screens/AuditChecksViewer/Header.tsx similarity index 100% rename from src/ui/tui/screens/audit/AuditChecksViewer/Header.tsx rename to src/tui/programs/audit/screens/AuditChecksViewer/Header.tsx diff --git a/src/ui/tui/screens/audit/AuditChecksViewer/Legend.tsx b/src/tui/programs/audit/screens/AuditChecksViewer/Legend.tsx similarity index 100% rename from src/ui/tui/screens/audit/AuditChecksViewer/Legend.tsx rename to src/tui/programs/audit/screens/AuditChecksViewer/Legend.tsx diff --git a/src/ui/tui/screens/audit/AuditChecksViewer/layout.ts b/src/tui/programs/audit/screens/AuditChecksViewer/layout.ts similarity index 97% rename from src/ui/tui/screens/audit/AuditChecksViewer/layout.ts rename to src/tui/programs/audit/screens/AuditChecksViewer/layout.ts index c4af5ef64..5c6ab7ef2 100644 --- a/src/ui/tui/screens/audit/AuditChecksViewer/layout.ts +++ b/src/tui/programs/audit/screens/AuditChecksViewer/layout.ts @@ -1,4 +1,4 @@ -import { MAX_WIDTH } from '@ui/tui/primitives/ScreenContainer'; +import { MAX_WIDTH } from '@tui/primitives/ScreenContainer'; /** Terminal rows used by chrome outside the viewer * (TitleBar, spacer, screen padding, status bar, tab bar). */ diff --git a/src/ui/tui/screens/audit/AuditChecksViewer/sort.ts b/src/tui/programs/audit/screens/AuditChecksViewer/sort.ts similarity index 100% rename from src/ui/tui/screens/audit/AuditChecksViewer/sort.ts rename to src/tui/programs/audit/screens/AuditChecksViewer/sort.ts diff --git a/src/ui/tui/screens/audit/AuditIntroScreen.tsx b/src/tui/programs/audit/screens/AuditIntroScreen.tsx similarity index 95% rename from src/ui/tui/screens/audit/AuditIntroScreen.tsx rename to src/tui/programs/audit/screens/AuditIntroScreen.tsx index f7647dbf0..9b6cc9c44 100644 --- a/src/ui/tui/screens/audit/AuditIntroScreen.tsx +++ b/src/tui/programs/audit/screens/AuditIntroScreen.tsx @@ -1,11 +1,11 @@ import { Box, Text } from 'ink'; import { useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { IntroScreenLayout } from '@ui/tui/screens/IntroScreenLayout'; +import { IntroScreenLayout } from '@tui/screens/IntroScreenLayout'; import { SkillSourceInfo, useSkillEntry, -} from '@ui/tui/screens/SkillSourceInfo'; +} from '@tui/screens/SkillSourceInfo'; interface AuditIntroScreenProps { store: WizardStore; diff --git a/src/ui/tui/screens/audit/AuditOutroScreen.tsx b/src/tui/programs/audit/screens/AuditOutroScreen.tsx similarity index 96% rename from src/ui/tui/screens/audit/AuditOutroScreen.tsx rename to src/tui/programs/audit/screens/AuditOutroScreen.tsx index 227af7968..41e941e50 100644 --- a/src/ui/tui/screens/audit/AuditOutroScreen.tsx +++ b/src/tui/programs/audit/screens/AuditOutroScreen.tsx @@ -10,10 +10,10 @@ import { Box, Text } from 'ink'; import { useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; import { OutroKind } from '@lib/wizard-session'; -import { Colors } from '@ui/tui/styles'; +import { Colors } from '@tui/styles'; import { getAuditChecks } from '@programs/audit/types'; import { AuditChecksOutroSection } from './AuditChecksOutroSection.js'; -import { useDismissOnAnyKey } from '@ui/tui/hooks/useDismissOnAnyKey'; +import { useDismissOnAnyKey } from '@tui/hooks/useDismissOnAnyKey'; interface AuditOutroScreenProps { store: WizardStore; diff --git a/src/ui/tui/screens/audit/AuditRunScreen.tsx b/src/tui/programs/audit/screens/AuditRunScreen.tsx similarity index 95% rename from src/ui/tui/screens/audit/AuditRunScreen.tsx rename to src/tui/programs/audit/screens/AuditRunScreen.tsx index 1ef1c0a46..28f259196 100644 --- a/src/ui/tui/screens/audit/AuditRunScreen.tsx +++ b/src/tui/programs/audit/screens/AuditRunScreen.tsx @@ -6,8 +6,8 @@ import { SplitView, LogViewer, HNViewer, -} from '@ui/tui/primitives/index'; -import { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions'; +} from '@tui/primitives/index'; +import { useStdoutDimensions } from '@tui/hooks/useStdoutDimensions'; import { AuditChecksViewer } from './AuditChecksViewer/AuditChecksViewer.js'; import { AuditAreaPane } from './AuditAreaPane.js'; import { AUDIT_AREA_SLIDES } from './slides/index.js'; diff --git a/src/ui/tui/screens/audit/PendingChecksList.tsx b/src/tui/programs/audit/screens/PendingChecksList.tsx similarity index 95% rename from src/ui/tui/screens/audit/PendingChecksList.tsx rename to src/tui/programs/audit/screens/PendingChecksList.tsx index c6eb4f6f7..48f1853b0 100644 --- a/src/ui/tui/screens/audit/PendingChecksList.tsx +++ b/src/tui/programs/audit/screens/PendingChecksList.tsx @@ -4,9 +4,9 @@ import { AUDIT_SEVERITY_STYLE, type AuditCheck, } from '@programs/audit/types'; -import { Colors, Icons } from '@ui/tui/styles'; -import { LoadingBox } from '@ui/tui/primitives/index'; -import { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions'; +import { Colors, Icons } from '@tui/styles'; +import { LoadingBox } from '@tui/primitives/index'; +import { useStdoutDimensions } from '@tui/hooks/useStdoutDimensions'; interface PendingChecksListProps { checks: AuditCheck[]; diff --git a/src/ui/tui/screens/audit/slides/eventCapture.tsx b/src/tui/programs/audit/screens/slides/eventCapture.tsx similarity index 100% rename from src/ui/tui/screens/audit/slides/eventCapture.tsx rename to src/tui/programs/audit/screens/slides/eventCapture.tsx diff --git a/src/ui/tui/screens/audit/slides/events-audit/createDashboard.tsx b/src/tui/programs/audit/screens/slides/events-audit/createDashboard.tsx similarity index 100% rename from src/ui/tui/screens/audit/slides/events-audit/createDashboard.tsx rename to src/tui/programs/audit/screens/slides/events-audit/createDashboard.tsx diff --git a/src/ui/tui/screens/audit/slides/events-audit/detectSdk.tsx b/src/tui/programs/audit/screens/slides/events-audit/detectSdk.tsx similarity index 100% rename from src/ui/tui/screens/audit/slides/events-audit/detectSdk.tsx rename to src/tui/programs/audit/screens/slides/events-audit/detectSdk.tsx diff --git a/src/ui/tui/screens/audit/slides/events-audit/enrichSites.tsx b/src/tui/programs/audit/screens/slides/events-audit/enrichSites.tsx similarity index 100% rename from src/ui/tui/screens/audit/slides/events-audit/enrichSites.tsx rename to src/tui/programs/audit/screens/slides/events-audit/enrichSites.tsx diff --git a/src/ui/tui/screens/audit/slides/events-audit/index.ts b/src/tui/programs/audit/screens/slides/events-audit/index.ts similarity index 100% rename from src/ui/tui/screens/audit/slides/events-audit/index.ts rename to src/tui/programs/audit/screens/slides/events-audit/index.ts diff --git a/src/ui/tui/screens/audit/slides/events-audit/queryVolume.tsx b/src/tui/programs/audit/screens/slides/events-audit/queryVolume.tsx similarity index 100% rename from src/ui/tui/screens/audit/slides/events-audit/queryVolume.tsx rename to src/tui/programs/audit/screens/slides/events-audit/queryVolume.tsx diff --git a/src/ui/tui/screens/audit/slides/events-audit/scanSites.tsx b/src/tui/programs/audit/screens/slides/events-audit/scanSites.tsx similarity index 100% rename from src/ui/tui/screens/audit/slides/events-audit/scanSites.tsx rename to src/tui/programs/audit/screens/slides/events-audit/scanSites.tsx diff --git a/src/ui/tui/screens/audit/slides/events-audit/uploadNotebook.tsx b/src/tui/programs/audit/screens/slides/events-audit/uploadNotebook.tsx similarity index 100% rename from src/ui/tui/screens/audit/slides/events-audit/uploadNotebook.tsx rename to src/tui/programs/audit/screens/slides/events-audit/uploadNotebook.tsx diff --git a/src/ui/tui/screens/audit/slides/events-audit/writeReport.tsx b/src/tui/programs/audit/screens/slides/events-audit/writeReport.tsx similarity index 100% rename from src/ui/tui/screens/audit/slides/events-audit/writeReport.tsx rename to src/tui/programs/audit/screens/slides/events-audit/writeReport.tsx diff --git a/src/ui/tui/screens/audit/slides/identification.tsx b/src/tui/programs/audit/screens/slides/identification.tsx similarity index 100% rename from src/ui/tui/screens/audit/slides/identification.tsx rename to src/tui/programs/audit/screens/slides/identification.tsx diff --git a/src/ui/tui/screens/audit/slides/index.ts b/src/tui/programs/audit/screens/slides/index.ts similarity index 100% rename from src/ui/tui/screens/audit/slides/index.ts rename to src/tui/programs/audit/screens/slides/index.ts diff --git a/src/ui/tui/screens/audit/slides/installation.tsx b/src/tui/programs/audit/screens/slides/installation.tsx similarity index 100% rename from src/ui/tui/screens/audit/slides/installation.tsx rename to src/tui/programs/audit/screens/slides/installation.tsx diff --git a/src/ui/tui/screens/audit/slides/liveData.tsx b/src/tui/programs/audit/screens/slides/liveData.tsx similarity index 100% rename from src/ui/tui/screens/audit/slides/liveData.tsx rename to src/tui/programs/audit/screens/slides/liveData.tsx diff --git a/src/ui/tui/screens/audit/slides/shared.tsx b/src/tui/programs/audit/screens/slides/shared.tsx similarity index 94% rename from src/ui/tui/screens/audit/slides/shared.tsx rename to src/tui/programs/audit/screens/slides/shared.tsx index 820d6486a..061cfd7ba 100644 --- a/src/ui/tui/screens/audit/slides/shared.tsx +++ b/src/tui/programs/audit/screens/slides/shared.tsx @@ -1,6 +1,6 @@ import { Box } from 'ink'; import type { ReactNode } from 'react'; -import { Colors } from '@ui/tui/styles'; +import { Colors } from '@tui/styles'; /** Slide shape consumed by `AuditAreaPane`. One per `AuditCheck.area` value. */ export interface AreaSlide { diff --git a/src/ui/tui/screens/audit/slides/uploadNotebook.tsx b/src/tui/programs/audit/screens/slides/uploadNotebook.tsx similarity index 100% rename from src/ui/tui/screens/audit/slides/uploadNotebook.tsx rename to src/tui/programs/audit/screens/slides/uploadNotebook.tsx diff --git a/src/ui/tui/screens/audit/slides/writeReport.tsx b/src/tui/programs/audit/screens/slides/writeReport.tsx similarity index 100% rename from src/ui/tui/screens/audit/slides/writeReport.tsx rename to src/tui/programs/audit/screens/slides/writeReport.tsx diff --git a/src/programs/error-tracking-upload-source-maps/steps.ts b/src/tui/programs/error-tracking-upload-source-maps/flow.ts similarity index 94% rename from src/programs/error-tracking-upload-source-maps/steps.ts rename to src/tui/programs/error-tracking-upload-source-maps/flow.ts index 466ae9074..df2db1438 100644 --- a/src/programs/error-tracking-upload-source-maps/steps.ts +++ b/src/tui/programs/error-tracking-upload-source-maps/flow.ts @@ -10,7 +10,7 @@ import type { ProgramStep } from '@programs/program-step'; import type { WizardSession } from '@lib/wizard-session'; import { RunPhase } from '@lib/wizard-session'; -import { SOURCE_MAPS_CONTEXT_KEYS } from './detect.js'; +import { SOURCE_MAPS_CONTEXT_KEYS } from '../../../programs/error-tracking-upload-source-maps/detect.js'; function projectSelected(session: WizardSession): boolean { return ( diff --git a/src/ui/tui/screens/SourceMapsDetectScreen.tsx b/src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsDetectScreen.tsx similarity index 98% rename from src/ui/tui/screens/SourceMapsDetectScreen.tsx rename to src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsDetectScreen.tsx index 645cd61cd..9c7718de9 100644 --- a/src/ui/tui/screens/SourceMapsDetectScreen.tsx +++ b/src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsDetectScreen.tsx @@ -10,8 +10,8 @@ import { Box, Text } from 'ink'; import { useEffect, useRef, useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { LoadingBox, PickerMenu } from '@ui/tui/primitives/index'; -import { Colors, Icons } from '@ui/tui/styles'; +import { LoadingBox, PickerMenu } from '@tui/primitives/index'; +import { Colors, Icons } from '@tui/styles'; import { SOURCE_MAPS_CONTEXT_KEYS, VARIANT_DISPLAY_NAME, diff --git a/src/ui/tui/screens/SourceMapsIntroScreen.tsx b/src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsIntroScreen.tsx similarity index 97% rename from src/ui/tui/screens/SourceMapsIntroScreen.tsx rename to src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsIntroScreen.tsx index 81bdc0b07..1e91bae1b 100644 --- a/src/ui/tui/screens/SourceMapsIntroScreen.tsx +++ b/src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsIntroScreen.tsx @@ -9,7 +9,7 @@ import { Box, Text } from 'ink'; import { useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { IntroScreenLayout } from './IntroScreenLayout.js'; +import { IntroScreenLayout } from '../../../screens/IntroScreenLayout.js'; type View = 'default' | 'more-info'; diff --git a/src/ui/tui/screens/SourceMapsOutroScreen.tsx b/src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsOutroScreen.tsx similarity index 97% rename from src/ui/tui/screens/SourceMapsOutroScreen.tsx rename to src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsOutroScreen.tsx index a67fdb782..4efa172ae 100644 --- a/src/ui/tui/screens/SourceMapsOutroScreen.tsx +++ b/src/tui/programs/error-tracking-upload-source-maps/screens/SourceMapsOutroScreen.tsx @@ -15,8 +15,8 @@ import { Box, Text } from 'ink'; import { useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; import { OutroKind } from '@lib/wizard-session'; -import { Colors } from '@ui/tui/styles'; -import { useDismissOnAnyKey } from '@ui/tui/hooks/useDismissOnAnyKey'; +import { Colors } from '@tui/styles'; +import { useDismissOnAnyKey } from '@tui/hooks/useDismissOnAnyKey'; interface SourceMapsOutroScreenProps { store: WizardStore; diff --git a/src/ui/tui/decks/error-tracking/index.tsx b/src/tui/programs/error-tracking/deck/index.tsx similarity index 75% rename from src/ui/tui/decks/error-tracking/index.tsx rename to src/tui/programs/error-tracking/deck/index.tsx index 39ebbd83d..a3ac6a322 100644 --- a/src/ui/tui/decks/error-tracking/index.tsx +++ b/src/tui/programs/error-tracking/deck/index.tsx @@ -1,8 +1,8 @@ /** Error-tracking learn-deck: the source-maps narrative, worded to also fit platforms that upload nothing. */ import type { WizardStore } from '@ui/tui/store'; -import type { ContentBlock } from '@ui/tui/primitives/content-types'; -import { buildSourceMapsDeck } from '@ui/tui/decks/error-tracking-upload-source-maps/index'; +import type { ContentBlock } from '@tui/primitives/content-types'; +import { buildSourceMapsDeck } from '@tui/programs/shared/deck/source-maps'; export const getContentBlocks = (store?: WizardStore): ContentBlock[] => buildSourceMapsDeck(store, { diff --git a/src/ui/tui/decks/error-tracking/tips.ts b/src/tui/programs/error-tracking/deck/tips.ts similarity index 95% rename from src/ui/tui/decks/error-tracking/tips.ts rename to src/tui/programs/error-tracking/deck/tips.ts index dba3d8e68..294916013 100644 --- a/src/ui/tui/decks/error-tracking/tips.ts +++ b/src/tui/programs/error-tracking/deck/tips.ts @@ -1,6 +1,6 @@ /** Sidebar tips for the error-tracking run: product features the learn deck does not cover. */ -import type { Tip } from '@ui/tui/components/TipsCard'; +import type { Tip } from '@tui/components/TipsCard'; import { REPLAY_VISION_SUPPORTED } from '@programs/replay-vision/index'; export const ERROR_TRACKING_TIPS: Tip[] = [ diff --git a/src/ui/tui/screens/ErrorTrackingDetectScreen.tsx b/src/tui/programs/error-tracking/screens/ErrorTrackingDetectScreen.tsx similarity index 98% rename from src/ui/tui/screens/ErrorTrackingDetectScreen.tsx rename to src/tui/programs/error-tracking/screens/ErrorTrackingDetectScreen.tsx index 4d2c3eaa9..ac3843852 100644 --- a/src/ui/tui/screens/ErrorTrackingDetectScreen.tsx +++ b/src/tui/programs/error-tracking/screens/ErrorTrackingDetectScreen.tsx @@ -7,8 +7,8 @@ import { Box, Text } from 'ink'; import { useEffect, useRef, useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { LoadingBox, PickerMenu } from '@ui/tui/primitives/index'; -import { Colors, Icons } from '@ui/tui/styles'; +import { LoadingBox, PickerMenu } from '@tui/primitives/index'; +import { Colors, Icons } from '@tui/styles'; import { FRAMEWORK_REGISTRY } from '@programs/frameworks/registry'; import { detectErrorTrackingProjects, diff --git a/src/ui/tui/screens/ErrorTrackingIntroScreen.tsx b/src/tui/programs/error-tracking/screens/ErrorTrackingIntroScreen.tsx similarity index 96% rename from src/ui/tui/screens/ErrorTrackingIntroScreen.tsx rename to src/tui/programs/error-tracking/screens/ErrorTrackingIntroScreen.tsx index c3b386192..65d2158d5 100644 --- a/src/ui/tui/screens/ErrorTrackingIntroScreen.tsx +++ b/src/tui/programs/error-tracking/screens/ErrorTrackingIntroScreen.tsx @@ -1,11 +1,11 @@ import { Box, Text } from 'ink'; import { useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { IntroScreenLayout } from '@ui/tui/screens/IntroScreenLayout'; +import { IntroScreenLayout } from '@tui/screens/IntroScreenLayout'; import { SkillSourceInfo, useSkillEntry, -} from '@ui/tui/screens/SkillSourceInfo'; +} from '@tui/screens/SkillSourceInfo'; interface ErrorTrackingIntroScreenProps { store: WizardStore; diff --git a/src/ui/tui/screens/MetricsIntroScreen.tsx b/src/tui/programs/metrics/screens/MetricsIntroScreen.tsx similarity index 96% rename from src/ui/tui/screens/MetricsIntroScreen.tsx rename to src/tui/programs/metrics/screens/MetricsIntroScreen.tsx index cdda2be1e..d40889930 100644 --- a/src/ui/tui/screens/MetricsIntroScreen.tsx +++ b/src/tui/programs/metrics/screens/MetricsIntroScreen.tsx @@ -1,11 +1,11 @@ import { Box, Text } from 'ink'; import { useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { IntroScreenLayout } from '@ui/tui/screens/IntroScreenLayout'; +import { IntroScreenLayout } from '@tui/screens/IntroScreenLayout'; import { SkillSourceInfo, useSkillEntry, -} from '@ui/tui/screens/SkillSourceInfo'; +} from '@tui/screens/SkillSourceInfo'; interface MetricsIntroScreenProps { store: WizardStore; diff --git a/src/ui/tui/decks/migration/free-tier.tsx b/src/tui/programs/migration/deck/free-tier.tsx similarity index 93% rename from src/ui/tui/decks/migration/free-tier.tsx rename to src/tui/programs/migration/deck/free-tier.tsx index 615ddd9b1..4c3116ae5 100644 --- a/src/ui/tui/decks/migration/free-tier.tsx +++ b/src/tui/programs/migration/deck/free-tier.tsx @@ -4,8 +4,8 @@ */ import { Text } from 'ink'; -import { Colors } from '@ui/tui/styles'; -import type { ContentBlock } from '@ui/tui/primitives/content-types'; +import { Colors } from '@tui/styles'; +import type { ContentBlock } from '@tui/primitives/content-types'; export const FREE_TIER_BLOCK: ContentBlock = { type: 'lines', diff --git a/src/ui/tui/decks/migration/index.tsx b/src/tui/programs/migration/deck/index.tsx similarity index 92% rename from src/ui/tui/decks/migration/index.tsx rename to src/tui/programs/migration/deck/index.tsx index 3eaff5927..1bf790f01 100644 --- a/src/ui/tui/decks/migration/index.tsx +++ b/src/tui/programs/migration/deck/index.tsx @@ -17,13 +17,13 @@ import { Text } from 'ink'; import type { WizardStore } from '@ui/tui/store'; -import { Colors } from '@ui/tui/styles'; -import { TextRevealMode } from '@ui/tui/primitives/TextBlock'; -import type { ContentBlock } from '@ui/tui/primitives/content-types'; -import { StatusPeekTrigger } from '@ui/tui/components/StatusPeekTrigger'; -import { PRODUCT_SUITE_BLOCK } from '@ui/tui/decks/posthog-integration/product-suite'; -import { LINE_CHART_BLOCK } from '@ui/tui/decks/posthog-integration/line-chart'; -import { FUNNEL_BLOCK } from '@ui/tui/decks/posthog-integration/funnel'; +import { Colors } from '@tui/styles'; +import { TextRevealMode } from '@tui/primitives/TextBlock'; +import type { ContentBlock } from '@tui/primitives/content-types'; +import { StatusPeekTrigger } from '@tui/components/StatusPeekTrigger'; +import { PRODUCT_SUITE_BLOCK } from '@tui/programs/shared/deck/product-suite'; +import { LINE_CHART_BLOCK } from '@tui/programs/shared/deck/line-chart'; +import { FUNNEL_BLOCK } from '@tui/programs/shared/deck/funnel'; import { VENDOR_STACK_BLOCK } from './vendor-stack.js'; import { FREE_TIER_BLOCK } from './free-tier.js'; import { PRICING_STRUCTURE_BLOCK } from './pricing-structure.js'; diff --git a/src/ui/tui/decks/migration/pricing-structure.tsx b/src/tui/programs/migration/deck/pricing-structure.tsx similarity index 91% rename from src/ui/tui/decks/migration/pricing-structure.tsx rename to src/tui/programs/migration/deck/pricing-structure.tsx index f87b564d6..ca3bdcc9e 100644 --- a/src/ui/tui/decks/migration/pricing-structure.tsx +++ b/src/tui/programs/migration/deck/pricing-structure.tsx @@ -3,8 +3,8 @@ */ import { Text } from 'ink'; -import { Colors } from '@ui/tui/styles'; -import type { ContentBlock } from '@ui/tui/primitives/content-types'; +import { Colors } from '@tui/styles'; +import type { ContentBlock } from '@tui/primitives/content-types'; export const PRICING_STRUCTURE_BLOCK: ContentBlock = { type: 'lines', diff --git a/src/ui/tui/decks/migration/vendor-stack.tsx b/src/tui/programs/migration/deck/vendor-stack.tsx similarity index 95% rename from src/ui/tui/decks/migration/vendor-stack.tsx rename to src/tui/programs/migration/deck/vendor-stack.tsx index b64d08bc9..f813a226a 100644 --- a/src/ui/tui/decks/migration/vendor-stack.tsx +++ b/src/tui/programs/migration/deck/vendor-stack.tsx @@ -5,7 +5,7 @@ */ import { Text } from 'ink'; -import type { ContentBlock } from '@ui/tui/primitives/content-types'; +import type { ContentBlock } from '@tui/primitives/content-types'; export const VENDOR_STACK_BLOCK: ContentBlock = { type: 'lines', diff --git a/src/programs/migration/steps.ts b/src/tui/programs/migration/flow.ts similarity index 91% rename from src/programs/migration/steps.ts rename to src/tui/programs/migration/flow.ts index cb41d5bc0..fbfec991d 100644 --- a/src/programs/migration/steps.ts +++ b/src/tui/programs/migration/flow.ts @@ -1,6 +1,6 @@ import type { ProgramStep } from '@programs/program-step'; import { RunPhase } from '@lib/wizard-session'; -import { HEALTH_CHECK_STEP } from '@programs/shared/health-check-step'; +import { HEALTH_CHECK_STEP } from '@tui/programs/shared/health-check-step'; export const MIGRATION_PROGRAM: ProgramStep[] = [ { diff --git a/src/ui/tui/screens/MigrationIntroScreen.tsx b/src/tui/programs/migration/screens/MigrationIntroScreen.tsx similarity index 93% rename from src/ui/tui/screens/MigrationIntroScreen.tsx rename to src/tui/programs/migration/screens/MigrationIntroScreen.tsx index f4b0f4a17..dcb266cd5 100644 --- a/src/ui/tui/screens/MigrationIntroScreen.tsx +++ b/src/tui/programs/migration/screens/MigrationIntroScreen.tsx @@ -1,7 +1,7 @@ import { Box, Text } from 'ink'; import { useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { IntroScreenLayout } from './IntroScreenLayout.js'; +import { IntroScreenLayout } from '../../../screens/IntroScreenLayout.js'; interface MigrationIntroScreenProps { store: WizardStore; diff --git a/src/ui/tui/__tests__/posthog-integration-intro.test.ts b/src/tui/programs/posthog-integration/__tests__/intro-menu.test.ts similarity index 98% rename from src/ui/tui/__tests__/posthog-integration-intro.test.ts rename to src/tui/programs/posthog-integration/__tests__/intro-menu.test.ts index c098d5ab2..de8709da9 100644 --- a/src/ui/tui/__tests__/posthog-integration-intro.test.ts +++ b/src/tui/programs/posthog-integration/__tests__/intro-menu.test.ts @@ -5,7 +5,7 @@ import { DETECTED_HEADLINE, introHeadline, introMenuOptions, -} from '@ui/tui/posthog-integration-intro'; +} from '@tui/programs/posthog-integration/intro-menu'; const valuesFor = (args: { view?: 'default' | 'more-info' | 'commands'; diff --git a/src/ui/tui/decks/posthog-integration/data-flow.tsx b/src/tui/programs/posthog-integration/deck/data-flow.tsx similarity index 95% rename from src/ui/tui/decks/posthog-integration/data-flow.tsx rename to src/tui/programs/posthog-integration/deck/data-flow.tsx index 2e35e029d..d1ce8aada 100644 --- a/src/ui/tui/decks/posthog-integration/data-flow.tsx +++ b/src/tui/programs/posthog-integration/deck/data-flow.tsx @@ -3,8 +3,8 @@ */ import { Text } from 'ink'; -import { Colors } from '@ui/tui/styles'; -import type { ContentBlock } from '@ui/tui/primitives/content-types'; +import { Colors } from '@tui/styles'; +import type { ContentBlock } from '@tui/primitives/content-types'; export const POSTHOG_DATA_FLOW: ContentBlock = { type: 'lines', diff --git a/src/ui/tui/decks/posthog-integration/index.tsx b/src/tui/programs/posthog-integration/deck/index.tsx similarity index 89% rename from src/ui/tui/decks/posthog-integration/index.tsx rename to src/tui/programs/posthog-integration/deck/index.tsx index 692c61ef4..7b1ee167a 100644 --- a/src/ui/tui/decks/posthog-integration/index.tsx +++ b/src/tui/programs/posthog-integration/deck/index.tsx @@ -5,15 +5,15 @@ */ import { Text } from 'ink'; -import { Colors } from '@ui/tui/styles'; +import { Colors } from '@tui/styles'; import type { WizardStore } from '@ui/tui/store'; -import { TextRevealMode } from '@ui/tui/primitives/TextBlock'; -import type { ContentBlock } from '@ui/tui/primitives/content-types'; -import { StatusPeekTrigger } from '@ui/tui/components/StatusPeekTrigger'; +import { TextRevealMode } from '@tui/primitives/TextBlock'; +import type { ContentBlock } from '@tui/primitives/content-types'; +import { StatusPeekTrigger } from '@tui/components/StatusPeekTrigger'; import { POSTHOG_DATA_FLOW } from './data-flow.js'; -import { PRODUCT_SUITE_BLOCK } from './product-suite.js'; -import { LINE_CHART_BLOCK } from './line-chart.js'; -import { FUNNEL_BLOCK } from './funnel.js'; +import { PRODUCT_SUITE_BLOCK } from '../../shared/deck/product-suite.js'; +import { LINE_CHART_BLOCK } from '../../shared/deck/line-chart.js'; +import { FUNNEL_BLOCK } from '../../shared/deck/funnel.js'; export const getContentBlocks = (store?: WizardStore): ContentBlock[] => [ { diff --git a/src/ui/tui/posthog-integration-intro.ts b/src/tui/programs/posthog-integration/intro-menu.ts similarity index 96% rename from src/ui/tui/posthog-integration-intro.ts rename to src/tui/programs/posthog-integration/intro-menu.ts index 15bc8b75a..dd56a6c9c 100644 --- a/src/ui/tui/posthog-integration-intro.ts +++ b/src/tui/programs/posthog-integration/intro-menu.ts @@ -1,4 +1,4 @@ -import type { PickerOption } from '@ui/tui/primitives/index'; +import type { PickerOption } from '@tui/primitives/index'; export type IntroMenuView = 'default' | 'more-info' | 'commands'; diff --git a/src/ui/tui/screens/PostHogIntegrationIntroScreen.tsx b/src/tui/programs/posthog-integration/screens/PostHogIntegrationIntroScreen.tsx similarity index 95% rename from src/ui/tui/screens/PostHogIntegrationIntroScreen.tsx rename to src/tui/programs/posthog-integration/screens/PostHogIntegrationIntroScreen.tsx index 86235c487..aaf28ff66 100644 --- a/src/ui/tui/screens/PostHogIntegrationIntroScreen.tsx +++ b/src/tui/programs/posthog-integration/screens/PostHogIntegrationIntroScreen.tsx @@ -18,19 +18,19 @@ import { PickerMenu, LoadingBox, type PickerOption, -} from '@ui/tui/primitives/index'; -import { IntroScreenLayout, type DetectionRow } from './IntroScreenLayout.js'; -import { SkillSourceInfo, useSkillEntry } from './SkillSourceInfo.js'; +} from '@tui/primitives/index'; +import { IntroScreenLayout, type DetectionRow } from '../../../screens/IntroScreenLayout.js'; +import { SkillSourceInfo, useSkillEntry } from '../../../screens/SkillSourceInfo.js'; import { ScanConsent } from '@lib/wizard-session'; -import { KeyMatch, useKeyBindings } from '@ui/tui/hooks/useKeyBindings'; -import { Icons } from '@ui/tui/styles'; +import { KeyMatch, useKeyBindings } from '@tui/hooks/useKeyBindings'; +import { Icons } from '@tui/styles'; import { analytics } from '@utils/analytics'; -import { PRIVACY_PANEL_LABEL } from '@ui/tui/components/PrivacyPanel'; -import type { IntroMenuView } from '@ui/tui/posthog-integration-intro'; +import { PRIVACY_PANEL_LABEL } from '@tui/components/PrivacyPanel'; +import type { IntroMenuView } from '@tui/programs/posthog-integration/intro-menu'; import { introHeadline, introMenuOptions, -} from '@ui/tui/posthog-integration-intro'; +} from '@tui/programs/posthog-integration/intro-menu'; /** * Replaces IntroScreenLayout's DEFAULT_SUBTITLE for this screen only. The diff --git a/src/ui/tui/screens/__tests__/PostHogIntegrationIntroScreen.test.ts b/src/tui/programs/posthog-integration/screens/__tests__/PostHogIntegrationIntroScreen.test.ts similarity index 94% rename from src/ui/tui/screens/__tests__/PostHogIntegrationIntroScreen.test.ts rename to src/tui/programs/posthog-integration/screens/__tests__/PostHogIntegrationIntroScreen.test.ts index a2def44d8..b47d1f77e 100644 --- a/src/ui/tui/screens/__tests__/PostHogIntegrationIntroScreen.test.ts +++ b/src/tui/programs/posthog-integration/screens/__tests__/PostHogIntegrationIntroScreen.test.ts @@ -6,8 +6,8 @@ * one character too long. */ -import { sharingOptions } from '@ui/tui/screens/PostHogIntegrationIntroScreen'; -import { introMenuOptions } from '@ui/tui/posthog-integration-intro'; +import { sharingOptions } from '@tui/programs/posthog-integration/screens/PostHogIntegrationIntroScreen'; +import { introMenuOptions } from '@tui/programs/posthog-integration/intro-menu'; // IntroScreenLayout renders a centered menu in a 24-column box. A row with an // icon spends four columns before the label: focus marker, gap, glyph, gap. diff --git a/src/ui/tui/decks/revenue-analytics/index.tsx b/src/tui/programs/revenue-analytics/deck/index.tsx similarity index 76% rename from src/ui/tui/decks/revenue-analytics/index.tsx rename to src/tui/programs/revenue-analytics/deck/index.tsx index 974ebc431..5284bd17c 100644 --- a/src/ui/tui/decks/revenue-analytics/index.tsx +++ b/src/tui/programs/revenue-analytics/deck/index.tsx @@ -4,4 +4,4 @@ * revenue narrative grows its own diagrams or talking points. */ -export { getContentBlocks } from '@ui/tui/decks/agent-skill/index'; +export { getContentBlocks } from '@tui/programs/shared/skill-deck'; diff --git a/src/ui/tui/screens/RevenueIntroScreen.tsx b/src/tui/programs/revenue-analytics/screens/RevenueIntroScreen.tsx similarity index 98% rename from src/ui/tui/screens/RevenueIntroScreen.tsx rename to src/tui/programs/revenue-analytics/screens/RevenueIntroScreen.tsx index 73e4f7ff0..d820e90cb 100644 --- a/src/ui/tui/screens/RevenueIntroScreen.tsx +++ b/src/tui/programs/revenue-analytics/screens/RevenueIntroScreen.tsx @@ -12,8 +12,8 @@ import { Box, Text } from 'ink'; import { useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { PickerMenu } from '@ui/tui/primitives/index'; -import { IntroScreenLayout, type DetectionRow } from './IntroScreenLayout.js'; +import { PickerMenu } from '@tui/primitives/index'; +import { IntroScreenLayout, type DetectionRow } from '../../../screens/IntroScreenLayout.js'; import { POSTHOG_SDKS, STRIPE_SDKS, diff --git a/src/programs/__tests__/self-driving-deck.test.ts b/src/tui/programs/self-driving/__tests__/deck.test.ts similarity index 96% rename from src/programs/__tests__/self-driving-deck.test.ts rename to src/tui/programs/self-driving/__tests__/deck.test.ts index 94a39e55c..a8b041b5f 100644 --- a/src/programs/__tests__/self-driving-deck.test.ts +++ b/src/tui/programs/self-driving/__tests__/deck.test.ts @@ -7,7 +7,7 @@ */ import type { ReactNode, ReactElement } from 'react'; -import { getContentBlocks } from '@ui/tui/decks/self-driving/index'; +import { getContentBlocks } from '@tui/programs/self-driving/deck/index'; /** paneWidth in LearnCard at 80 cols: (min(120, 80) - 2) / 2 - 2 */ const PANE_WIDTH_80COL = 37; diff --git a/src/ui/tui/decks/self-driving/index.tsx b/src/tui/programs/self-driving/deck/index.tsx similarity index 94% rename from src/ui/tui/decks/self-driving/index.tsx rename to src/tui/programs/self-driving/deck/index.tsx index 53d7c7a01..8b6397ffb 100644 --- a/src/ui/tui/decks/self-driving/index.tsx +++ b/src/tui/programs/self-driving/deck/index.tsx @@ -1,4 +1,4 @@ -import { NO_DEFAULT_LIMIT, PRICING_LONG } from './pricing.js'; +import { NO_DEFAULT_LIMIT, PRICING_LONG } from '../../../../programs/self-driving/pricing.js'; /** * Self-driving learn-deck — the narrative script played while the agent * sets up Self-driving. Teaches the vocabulary ladder (signal source → @@ -12,11 +12,11 @@ import { NO_DEFAULT_LIMIT, PRICING_LONG } from './pricing.js'; */ import { Text } from 'ink'; -import { Colors } from '@ui/tui/styles'; +import { Colors } from '@tui/styles'; import type { WizardStore } from '@ui/tui/store'; -import { TextRevealMode } from '@ui/tui/primitives/TextBlock'; -import type { ContentBlock } from '@ui/tui/primitives/content-types'; -import { StatusPeekTrigger } from '@ui/tui/components/StatusPeekTrigger'; +import { TextRevealMode } from '@tui/primitives/TextBlock'; +import type { ContentBlock } from '@tui/primitives/content-types'; +import { StatusPeekTrigger } from '@tui/components/StatusPeekTrigger'; import { PIPELINE_BLOCK } from './pipeline-diagram.js'; const CLEAR: ContentBlock = { type: 'clear', pause: 2000 }; diff --git a/src/ui/tui/decks/self-driving/pipeline-diagram.tsx b/src/tui/programs/self-driving/deck/pipeline-diagram.tsx similarity index 93% rename from src/ui/tui/decks/self-driving/pipeline-diagram.tsx rename to src/tui/programs/self-driving/deck/pipeline-diagram.tsx index 7971b9e33..fd5106fd8 100644 --- a/src/ui/tui/decks/self-driving/pipeline-diagram.tsx +++ b/src/tui/programs/self-driving/deck/pipeline-diagram.tsx @@ -7,8 +7,8 @@ */ import { Text } from 'ink'; -import { Colors } from '@ui/tui/styles'; -import type { ContentBlock } from '@ui/tui/primitives/content-types'; +import { Colors } from '@tui/styles'; +import type { ContentBlock } from '@tui/primitives/content-types'; export const PIPELINE_BLOCK: ContentBlock = { type: 'lines', diff --git a/src/ui/tui/decks/self-driving/tips.ts b/src/tui/programs/self-driving/deck/tips.ts similarity index 92% rename from src/ui/tui/decks/self-driving/tips.ts rename to src/tui/programs/self-driving/deck/tips.ts index cdb303025..a93b83252 100644 --- a/src/ui/tui/decks/self-driving/tips.ts +++ b/src/tui/programs/self-driving/deck/tips.ts @@ -1,4 +1,7 @@ -import { NO_DEFAULT_LIMIT, PRICING_LONG } from './pricing.js'; +import { + NO_DEFAULT_LIMIT, + PRICING_LONG, +} from '../../../../programs/self-driving/pricing.js'; /** * Sidebar tips for the self-driving run — short footnotes on the @@ -10,7 +13,7 @@ import { NO_DEFAULT_LIMIT, PRICING_LONG } from './pricing.js'; * `TipsCard`. Wired onto the program's `getTips`. */ -import type { Tip } from '@ui/tui/components/TipsCard'; +import type { Tip } from '@tui/components/TipsCard'; export const SELF_DRIVING_TIPS: Tip[] = [ { diff --git a/src/programs/self-driving/steps.ts b/src/tui/programs/self-driving/flow.ts similarity index 96% rename from src/programs/self-driving/steps.ts rename to src/tui/programs/self-driving/flow.ts index 2bad6952c..bcbbd025f 100644 --- a/src/programs/self-driving/steps.ts +++ b/src/tui/programs/self-driving/flow.ts @@ -17,14 +17,14 @@ import type { ProgramStep } from '@programs/program-step'; import { resolveProjectDir } from '@programs/detection/agentic'; import { RunPhase, type WizardSession } from '@lib/wizard-session'; -import { HEALTH_CHECK_STEP } from '@programs/shared/health-check-step'; +import { HEALTH_CHECK_STEP } from '@tui/programs/shared/health-check-step'; import { integrationRunStep } from '@programs/posthog-integration/index'; import { detectSelfDrivingPrerequisites, POSTHOG_PRESENT_KEY, SELF_DRIVING_INTEGRATE_PATH_KEY, -} from './detect.js'; -import { prepSelfDrivingIntegration } from './detect-agentic.js'; +} from '../../../programs/self-driving/detect.js'; +import { prepSelfDrivingIntegration } from '../../../programs/self-driving/detect-agentic.js'; /** True once detection found PostHog already present in the project. */ const postHogPresent = (session: WizardSession): boolean => diff --git a/src/ui/tui/hooks/__tests__/useGithubConnection.test.ts b/src/tui/programs/self-driving/hooks/__tests__/useGithubConnection.test.ts similarity index 96% rename from src/ui/tui/hooks/__tests__/useGithubConnection.test.ts rename to src/tui/programs/self-driving/hooks/__tests__/useGithubConnection.test.ts index c03de350b..80c5958c7 100644 --- a/src/ui/tui/hooks/__tests__/useGithubConnection.test.ts +++ b/src/tui/programs/self-driving/hooks/__tests__/useGithubConnection.test.ts @@ -1,4 +1,4 @@ -import { fetchLoginUrl } from '@ui/tui/hooks/useGithubConnection'; +import { fetchLoginUrl } from '@tui/programs/self-driving/hooks/useGithubConnection'; import { requestDeepLink } from '@utils/provisioning'; import type { WizardSession, Credentials } from '@lib/wizard-session'; import type { HostResolution } from '@shared/host-resolution'; diff --git a/src/ui/tui/hooks/useGithubConnection.ts b/src/tui/programs/self-driving/hooks/useGithubConnection.ts similarity index 100% rename from src/ui/tui/hooks/useGithubConnection.ts rename to src/tui/programs/self-driving/hooks/useGithubConnection.ts diff --git a/src/ui/tui/screens/SelfDrivingGitHubScreen.tsx b/src/tui/programs/self-driving/screens/SelfDrivingGitHubScreen.tsx similarity index 96% rename from src/ui/tui/screens/SelfDrivingGitHubScreen.tsx rename to src/tui/programs/self-driving/screens/SelfDrivingGitHubScreen.tsx index 7bcc46e6c..72ffe4acf 100644 --- a/src/ui/tui/screens/SelfDrivingGitHubScreen.tsx +++ b/src/tui/programs/self-driving/screens/SelfDrivingGitHubScreen.tsx @@ -20,13 +20,13 @@ import { Box, Text } from 'ink'; import { useEffect, useRef, useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { Colors, Icons } from '@ui/tui/styles'; -import { PickerMenu, LoadingBox } from '@ui/tui/primitives/index'; -import { useKeyBindings, KeyMatch } from '@ui/tui/hooks/useKeyBindings'; +import { Colors, Icons } from '@tui/styles'; +import { PickerMenu, LoadingBox } from '@tui/primitives/index'; +import { useKeyBindings, KeyMatch } from '@tui/hooks/useKeyBindings'; import { useGithubConnection, fetchLoginUrl, -} from '@ui/tui/hooks/useGithubConnection'; +} from '@tui/programs/self-driving/hooks/useGithubConnection'; import { OutroKind } from '@lib/wizard-session'; import { GITHUB_REQUIRED_BODY, diff --git a/src/ui/tui/screens/SelfDrivingHandoffScreen.tsx b/src/tui/programs/self-driving/screens/SelfDrivingHandoffScreen.tsx similarity index 96% rename from src/ui/tui/screens/SelfDrivingHandoffScreen.tsx rename to src/tui/programs/self-driving/screens/SelfDrivingHandoffScreen.tsx index 06ba2c954..239a4d2a6 100644 --- a/src/ui/tui/screens/SelfDrivingHandoffScreen.tsx +++ b/src/tui/programs/self-driving/screens/SelfDrivingHandoffScreen.tsx @@ -10,8 +10,8 @@ import { Box, Text } from 'ink'; import { useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { PickerMenu } from '@ui/tui/primitives/index'; -import { Colors } from '@ui/tui/styles'; +import { PickerMenu } from '@tui/primitives/index'; +import { Colors } from '@tui/styles'; import { SETUP_REPORT_FILE } from '@programs/posthog-integration/index'; import { SELF_DRIVING_INTEGRATE_PATH_KEY } from '@programs/self-driving/detect'; diff --git a/src/ui/tui/screens/SelfDrivingIntegrationCheckScreen.tsx b/src/tui/programs/self-driving/screens/SelfDrivingIntegrationCheckScreen.tsx similarity index 97% rename from src/ui/tui/screens/SelfDrivingIntegrationCheckScreen.tsx rename to src/tui/programs/self-driving/screens/SelfDrivingIntegrationCheckScreen.tsx index 46d8423b1..a76159242 100644 --- a/src/ui/tui/screens/SelfDrivingIntegrationCheckScreen.tsx +++ b/src/tui/programs/self-driving/screens/SelfDrivingIntegrationCheckScreen.tsx @@ -20,14 +20,14 @@ import { useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; import type { CloudRegion } from '@lib/wizard-session'; -import { PickerMenu } from '@ui/tui/primitives/index'; +import { PickerMenu } from '@tui/primitives/index'; import { PrivacyPanel, PRIVACY_PANEL_LABEL, -} from '@ui/tui/components/PrivacyPanel'; -import { IntroScreenLayout } from '@ui/tui/screens/IntroScreenLayout'; +} from '@tui/components/PrivacyPanel'; +import { IntroScreenLayout } from '@tui/screens/IntroScreenLayout'; import { POSTHOG_PRIVACY_URL, POSTHOG_TERMS_URL } from '@shared/constants'; -import { Colors } from '@ui/tui/styles'; +import { Colors } from '@tui/styles'; interface SelfDrivingIntegrationCheckScreenProps { store: WizardStore; diff --git a/src/ui/tui/screens/SelfDrivingIntegrationDetectScreen.tsx b/src/tui/programs/self-driving/screens/SelfDrivingIntegrationDetectScreen.tsx similarity index 98% rename from src/ui/tui/screens/SelfDrivingIntegrationDetectScreen.tsx rename to src/tui/programs/self-driving/screens/SelfDrivingIntegrationDetectScreen.tsx index 7c42ccd5f..8a78c8105 100644 --- a/src/ui/tui/screens/SelfDrivingIntegrationDetectScreen.tsx +++ b/src/tui/programs/self-driving/screens/SelfDrivingIntegrationDetectScreen.tsx @@ -12,8 +12,8 @@ import { Box, Text } from 'ink'; import { useEffect, useRef, useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { LoadingBox, PickerMenu } from '@ui/tui/primitives/index'; -import { Colors, Icons } from '@ui/tui/styles'; +import { LoadingBox, PickerMenu } from '@tui/primitives/index'; +import { Colors, Icons } from '@tui/styles'; import { Integration } from '@shared/constants'; import { FRAMEWORK_REGISTRY } from '@programs/frameworks/registry'; import { SELF_DRIVING_INTEGRATE_PATH_KEY } from '@programs/self-driving/detect'; diff --git a/src/ui/tui/screens/SelfDrivingIntroScreen.tsx b/src/tui/programs/self-driving/screens/SelfDrivingIntroScreen.tsx similarity index 96% rename from src/ui/tui/screens/SelfDrivingIntroScreen.tsx rename to src/tui/programs/self-driving/screens/SelfDrivingIntroScreen.tsx index 99ed43f9d..1f00bc7d5 100644 --- a/src/ui/tui/screens/SelfDrivingIntroScreen.tsx +++ b/src/tui/programs/self-driving/screens/SelfDrivingIntroScreen.tsx @@ -12,13 +12,13 @@ import { Box, Text } from 'ink'; import { useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { PickerMenu } from '@ui/tui/primitives/index'; -import { IntroScreenLayout } from './IntroScreenLayout.js'; +import { PickerMenu } from '@tui/primitives/index'; +import { IntroScreenLayout } from '../../../screens/IntroScreenLayout.js'; import { NO_DEFAULT_LIMIT, PRICING_LONG, PRICING_SHORT, -} from '@ui/tui/decks/self-driving/pricing.js'; +} from '@programs/self-driving/pricing.js'; import type { SelfDrivingDetectError } from '@programs/self-driving/index'; interface SelfDrivingIntroScreenProps { diff --git a/src/ui/tui/decks/posthog-integration/funnel.tsx b/src/tui/programs/shared/deck/funnel.tsx similarity index 97% rename from src/ui/tui/decks/posthog-integration/funnel.tsx rename to src/tui/programs/shared/deck/funnel.tsx index 8d0aa3ce1..c7c7ba41c 100644 --- a/src/ui/tui/decks/posthog-integration/funnel.tsx +++ b/src/tui/programs/shared/deck/funnel.tsx @@ -3,7 +3,7 @@ */ import { Text } from 'ink'; -import type { ContentBlock } from '@ui/tui/primitives/content-types'; +import type { ContentBlock } from '@tui/primitives/content-types'; export const FUNNEL_BLOCK: ContentBlock = { type: 'lines', diff --git a/src/ui/tui/decks/posthog-integration/line-chart.tsx b/src/tui/programs/shared/deck/line-chart.tsx similarity index 96% rename from src/ui/tui/decks/posthog-integration/line-chart.tsx rename to src/tui/programs/shared/deck/line-chart.tsx index 32911a2e7..352983911 100644 --- a/src/ui/tui/decks/posthog-integration/line-chart.tsx +++ b/src/tui/programs/shared/deck/line-chart.tsx @@ -3,7 +3,7 @@ */ import { Text } from 'ink'; -import type { ContentBlock } from '@ui/tui/primitives/content-types'; +import type { ContentBlock } from '@tui/primitives/content-types'; export const LINE_CHART_BLOCK: ContentBlock = { type: 'lines', diff --git a/src/ui/tui/decks/posthog-integration/product-suite.tsx b/src/tui/programs/shared/deck/product-suite.tsx similarity index 96% rename from src/ui/tui/decks/posthog-integration/product-suite.tsx rename to src/tui/programs/shared/deck/product-suite.tsx index b640a14f8..eea55f1e6 100644 --- a/src/ui/tui/decks/posthog-integration/product-suite.tsx +++ b/src/tui/programs/shared/deck/product-suite.tsx @@ -3,7 +3,7 @@ */ import { Text } from 'ink'; -import type { ContentBlock } from '@ui/tui/primitives/content-types'; +import type { ContentBlock } from '@tui/primitives/content-types'; export const PRODUCT_SUITE_BLOCK: ContentBlock = { type: 'lines', diff --git a/src/ui/tui/decks/error-tracking-upload-source-maps/index.tsx b/src/tui/programs/shared/deck/source-maps.tsx similarity index 97% rename from src/ui/tui/decks/error-tracking-upload-source-maps/index.tsx rename to src/tui/programs/shared/deck/source-maps.tsx index bb7d1216a..03001028a 100644 --- a/src/ui/tui/decks/error-tracking-upload-source-maps/index.tsx +++ b/src/tui/programs/shared/deck/source-maps.tsx @@ -12,14 +12,14 @@ */ import { Text } from 'ink'; -import { Colors } from '@ui/tui/styles'; +import { Colors } from '@tui/styles'; import type { WizardStore } from '@ui/tui/store'; -import { TextRevealMode } from '@ui/tui/primitives/TextBlock'; +import { TextRevealMode } from '@tui/primitives/TextBlock'; import { isClearBlock, type ContentBlock, -} from '@ui/tui/primitives/content-types'; -import { StatusPeekTrigger } from '@ui/tui/components/StatusPeekTrigger'; +} from '@tui/primitives/content-types'; +import { StatusPeekTrigger } from '@tui/components/StatusPeekTrigger'; /** * Per-slide dwell multiplier. Each block stays on screen for `pause * SLIDE_PACE` diff --git a/src/programs/shared/health-check-step.ts b/src/tui/programs/shared/health-check-step.ts similarity index 100% rename from src/programs/shared/health-check-step.ts rename to src/tui/programs/shared/health-check-step.ts diff --git a/src/ui/tui/screens/AgentSkillIntroScreen.tsx b/src/tui/programs/shared/screens/AgentSkillIntroScreen.tsx similarity index 93% rename from src/ui/tui/screens/AgentSkillIntroScreen.tsx rename to src/tui/programs/shared/screens/AgentSkillIntroScreen.tsx index d9b07acc0..472421eb7 100644 --- a/src/ui/tui/screens/AgentSkillIntroScreen.tsx +++ b/src/tui/programs/shared/screens/AgentSkillIntroScreen.tsx @@ -9,8 +9,8 @@ import { Box, Text } from 'ink'; import type { ReactNode } from 'react'; import { useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { IntroScreenLayout } from './IntroScreenLayout.js'; -import { SkillSourceInfo, useSkillEntry } from './SkillSourceInfo.js'; +import { IntroScreenLayout } from '../../../screens/IntroScreenLayout.js'; +import { SkillSourceInfo, useSkillEntry } from '../../../screens/SkillSourceInfo.js'; interface AgentSkillIntroScreenProps { store: WizardStore; diff --git a/src/ui/tui/decks/agent-skill/index.tsx b/src/tui/programs/shared/skill-deck.tsx similarity index 85% rename from src/ui/tui/decks/agent-skill/index.tsx rename to src/tui/programs/shared/skill-deck.tsx index d269a80b0..bee96498e 100644 --- a/src/ui/tui/decks/agent-skill/index.tsx +++ b/src/tui/programs/shared/skill-deck.tsx @@ -6,8 +6,8 @@ import { Text } from 'ink'; import type { WizardStore } from '@ui/tui/store'; -import { TextRevealMode } from '@ui/tui/primitives/TextBlock'; -import type { ContentBlock } from '@ui/tui/primitives/content-types'; +import { TextRevealMode } from '@tui/primitives/TextBlock'; +import type { ContentBlock } from '@tui/primitives/content-types'; export const getContentBlocks = (store?: WizardStore): ContentBlock[] => { const skillId = store?.session.skillId ?? 'unknown'; diff --git a/src/ui/tui/decks/warehouse-source/index.tsx b/src/tui/programs/warehouse-source/deck/index.tsx similarity index 75% rename from src/ui/tui/decks/warehouse-source/index.tsx rename to src/tui/programs/warehouse-source/deck/index.tsx index 0f364bf00..f41b3405f 100644 --- a/src/ui/tui/decks/warehouse-source/index.tsx +++ b/src/tui/programs/warehouse-source/deck/index.tsx @@ -4,4 +4,4 @@ * narrative grows its own diagrams or talking points. */ -export { getContentBlocks } from '@ui/tui/decks/agent-skill/index'; +export { getContentBlocks } from '@tui/programs/shared/skill-deck'; diff --git a/src/ui/tui/screens/WarehouseIntroScreen.tsx b/src/tui/programs/warehouse-source/screens/WarehouseIntroScreen.tsx similarity index 97% rename from src/ui/tui/screens/WarehouseIntroScreen.tsx rename to src/tui/programs/warehouse-source/screens/WarehouseIntroScreen.tsx index 94205ef98..b32a8cecf 100644 --- a/src/ui/tui/screens/WarehouseIntroScreen.tsx +++ b/src/tui/programs/warehouse-source/screens/WarehouseIntroScreen.tsx @@ -13,8 +13,8 @@ import { Box, Text } from 'ink'; import { useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { PickerMenu } from '@ui/tui/primitives/index'; -import { IntroScreenLayout } from './IntroScreenLayout.js'; +import { PickerMenu } from '@tui/primitives/index'; +import { IntroScreenLayout } from '../../../screens/IntroScreenLayout.js'; import { getDetectedWarehouseSources, type WarehouseDetectError, diff --git a/src/ui/tui/router.ts b/src/tui/router.ts similarity index 98% rename from src/ui/tui/router.ts rename to src/tui/router.ts index 7bea7c35c..175e5323f 100644 --- a/src/ui/tui/router.ts +++ b/src/tui/router.ts @@ -13,7 +13,7 @@ */ import { RunPhase, type WizardSession } from '@lib/wizard-session'; -import { isRunFailure } from '@ui/mint-failure'; +import { isRunFailure } from '@tui/mint-failure'; import { Program, type ProgramId } from '@programs'; import { PROGRAM_SEQUENCES, @@ -21,7 +21,7 @@ import { ScreenId, type Screen, type Sequence, -} from './screen-sequences.js'; +} from '../ui/tui/screen-sequences.js'; // Re-export so existing imports from './router.js' keep working export { ScreenId, Program }; diff --git a/src/ui/tui/screens/AiOptInRequiredScreen.tsx b/src/tui/screens/AiOptInRequiredScreen.tsx similarity index 97% rename from src/ui/tui/screens/AiOptInRequiredScreen.tsx rename to src/tui/screens/AiOptInRequiredScreen.tsx index 2018af56f..b3e5cf72f 100644 --- a/src/ui/tui/screens/AiOptInRequiredScreen.tsx +++ b/src/tui/screens/AiOptInRequiredScreen.tsx @@ -17,13 +17,13 @@ import opn from 'opn'; import { Box, Text } from 'ink'; import { useEffect, useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { useKeyBindings } from '@ui/tui/hooks/useKeyBindings'; -import { Colors } from '@ui/tui/styles'; -import { useSkillEntry } from '@ui/tui/screens/SkillSourceInfo'; +import { useKeyBindings } from '@tui/hooks/useKeyBindings'; +import { Colors } from '@tui/styles'; +import { useSkillEntry } from '@tui/screens/SkillSourceInfo'; import { fetchUserData } from '@shared/api'; import { CONTEXT_MILL_RELEASES_URL, POSTHOG_APP_URL } from '@shared/constants'; import { analytics } from '@utils/analytics'; -import { LoadingBox } from '@ui/tui/primitives/index'; +import { LoadingBox } from '@tui/primitives/index'; const ORG_ADMIN_LEVEL = 8; const SETTINGS_PATH = 'settings/organization-details'; diff --git a/src/ui/tui/screens/AuthErrorScreen.tsx b/src/tui/screens/AuthErrorScreen.tsx similarity index 98% rename from src/ui/tui/screens/AuthErrorScreen.tsx rename to src/tui/screens/AuthErrorScreen.tsx index f07382d8a..eed43780a 100644 --- a/src/ui/tui/screens/AuthErrorScreen.tsx +++ b/src/tui/screens/AuthErrorScreen.tsx @@ -14,8 +14,8 @@ import { Box, Text } from 'ink'; import { useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { Colors } from '@ui/tui/styles'; -import { useDismissOnAnyKey } from '@ui/tui/hooks/useDismissOnAnyKey'; +import { Colors } from '@tui/styles'; +import { useDismissOnAnyKey } from '@tui/hooks/useDismissOnAnyKey'; interface AuthErrorScreenProps { store: WizardStore; diff --git a/src/ui/tui/screens/AuthScreen.tsx b/src/tui/screens/AuthScreen.tsx similarity index 94% rename from src/ui/tui/screens/AuthScreen.tsx rename to src/tui/screens/AuthScreen.tsx index a0639fda1..975c54f96 100644 --- a/src/ui/tui/screens/AuthScreen.tsx +++ b/src/tui/screens/AuthScreen.tsx @@ -13,16 +13,16 @@ import { Box, Text } from 'ink'; import { useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { LoadingBox } from '@ui/tui/primitives/index'; -import { MAX_WIDTH } from '@ui/tui/primitives/ScreenContainer'; +import { LoadingBox } from '@tui/primitives/index'; +import { MAX_WIDTH } from '@tui/primitives/ScreenContainer'; import { PrivacyPanel, PRIVACY_PANEL_LABEL, -} from '@ui/tui/components/PrivacyPanel'; -import { IntroScreenLayout } from '@ui/tui/screens/IntroScreenLayout'; -import { useKeyBindings, type KeyBinding } from '@ui/tui/hooks/useKeyBindings'; -import { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions'; -import { Colors, Icons } from '@ui/tui/styles'; +} from '@tui/components/PrivacyPanel'; +import { IntroScreenLayout } from '@tui/screens/IntroScreenLayout'; +import { useKeyBindings, type KeyBinding } from '@tui/hooks/useKeyBindings'; +import { useStdoutDimensions } from '@tui/hooks/useStdoutDimensions'; +import { Colors, Icons } from '@tui/styles'; import { copyToClipboard } from '@utils/clipboard'; interface AuthScreenProps { diff --git a/src/ui/tui/screens/ExitScreen.tsx b/src/tui/screens/ExitScreen.tsx similarity index 89% rename from src/ui/tui/screens/ExitScreen.tsx rename to src/tui/screens/ExitScreen.tsx index 65c5a31fb..dffde5eaf 100644 --- a/src/ui/tui/screens/ExitScreen.tsx +++ b/src/tui/screens/ExitScreen.tsx @@ -6,7 +6,7 @@ */ import { useEffect } from 'react'; -import type { WizardStore } from '../store'; +import type { WizardStore } from '../../ui/tui/store'; export const ExitScreen = ({ store }: { store?: WizardStore }) => { useEffect(() => { diff --git a/src/ui/tui/screens/IntroScreenLayout.tsx b/src/tui/screens/IntroScreenLayout.tsx similarity index 98% rename from src/ui/tui/screens/IntroScreenLayout.tsx rename to src/tui/screens/IntroScreenLayout.tsx index 7e66cb37c..08f00f939 100644 --- a/src/ui/tui/screens/IntroScreenLayout.tsx +++ b/src/tui/screens/IntroScreenLayout.tsx @@ -13,11 +13,11 @@ import path from 'path'; import { Box, Text } from 'ink'; import { useState, type ReactNode } from 'react'; -import { PickerMenu, type PickerOption } from '@ui/tui/primitives/index'; +import { PickerMenu, type PickerOption } from '@tui/primitives/index'; import { PrivacyPanel, PRIVACY_PANEL_LABEL, -} from '@ui/tui/components/PrivacyPanel'; +} from '@tui/components/PrivacyPanel'; export interface DetectionRow { label: string; diff --git a/src/ui/tui/screens/KeepSkillsScreen.tsx b/src/tui/screens/KeepSkillsScreen.tsx similarity index 97% rename from src/ui/tui/screens/KeepSkillsScreen.tsx rename to src/tui/screens/KeepSkillsScreen.tsx index 5fcd45610..84399a7ad 100644 --- a/src/ui/tui/screens/KeepSkillsScreen.tsx +++ b/src/tui/screens/KeepSkillsScreen.tsx @@ -15,8 +15,8 @@ import { join } from 'node:path'; const WIZARD_MARKER = '.posthog-wizard'; import type { WizardStore } from '@ui/tui/store'; -import { ConfirmationInput } from '@ui/tui/primitives/index'; -import { Colors } from '@ui/tui/styles'; +import { ConfirmationInput } from '@tui/primitives/index'; +import { Colors } from '@tui/styles'; import { CONTEXT_MILL_URL } from '@shared/constants'; interface KeepSkillsScreenProps { diff --git a/src/ui/tui/screens/ManagedSettingsScreen.tsx b/src/tui/screens/ManagedSettingsScreen.tsx similarity index 96% rename from src/ui/tui/screens/ManagedSettingsScreen.tsx rename to src/tui/screens/ManagedSettingsScreen.tsx index 9708a2951..866034b7d 100644 --- a/src/ui/tui/screens/ManagedSettingsScreen.tsx +++ b/src/tui/screens/ManagedSettingsScreen.tsx @@ -12,8 +12,8 @@ import { Box, Text } from 'ink'; import { useEffect, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { ConfirmationInput, ModalOverlay } from '@ui/tui/primitives/index'; -import { Icons } from '@ui/tui/styles'; +import { ConfirmationInput, ModalOverlay } from '@tui/primitives/index'; +import { Icons } from '@tui/styles'; import type { SettingsConflict } from '@shared/claude-settings'; import { analytics } from '@utils/analytics'; diff --git a/src/ui/tui/screens/ManualAuthCodeScreen.tsx b/src/tui/screens/ManualAuthCodeScreen.tsx similarity index 98% rename from src/ui/tui/screens/ManualAuthCodeScreen.tsx rename to src/tui/screens/ManualAuthCodeScreen.tsx index 8c463bbc2..288eb54c7 100644 --- a/src/ui/tui/screens/ManualAuthCodeScreen.tsx +++ b/src/tui/screens/ManualAuthCodeScreen.tsx @@ -16,7 +16,7 @@ import { Box, Text, useInput } from 'ink'; import { TextInput } from '@inkjs/ui'; import { useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { Colors, Icons } from '@ui/tui/styles'; +import { Colors, Icons } from '@tui/styles'; import { extractOAuthCode } from '@utils/oauth'; interface ManualAuthCodeScreenProps { diff --git a/src/ui/tui/screens/McpScreen.tsx b/src/tui/screens/McpScreen.tsx similarity index 98% rename from src/ui/tui/screens/McpScreen.tsx rename to src/tui/screens/McpScreen.tsx index c8632a8f0..d11d1d33b 100644 --- a/src/ui/tui/screens/McpScreen.tsx +++ b/src/tui/screens/McpScreen.tsx @@ -20,24 +20,24 @@ import { ConfirmationInput, GroupedPickerMenu, PickerMenu, -} from '@ui/tui/primitives/index'; -import { Colors, Icons } from '@ui/tui/styles'; +} from '@tui/primitives/index'; +import { Colors, Icons } from '@tui/styles'; import type { McpInstaller, McpClientInfo, McpClientResult, -} from '@ui/tui/services/mcp-installer'; +} from '@tui/services/mcp-installer'; import { McpClientStatus, namesWithStatus, isOk, summarizeFailure, -} from '@steps/add-mcp-server-to-clients/results'; +} from '@shared/mcp-clients/results'; import { AVAILABLE_FEATURES, ALL_FEATURE_VALUES, isAllFeaturesSelected, -} from '@steps/add-mcp-server-to-clients/defaults'; +} from '@shared/mcp-clients/defaults'; export type McpMode = 'install' | 'remove'; diff --git a/src/ui/tui/screens/MintFailureScreen.tsx b/src/tui/screens/MintFailureScreen.tsx similarity index 94% rename from src/ui/tui/screens/MintFailureScreen.tsx rename to src/tui/screens/MintFailureScreen.tsx index 78c4a857f..86f48794b 100644 --- a/src/ui/tui/screens/MintFailureScreen.tsx +++ b/src/tui/screens/MintFailureScreen.tsx @@ -1,15 +1,15 @@ import { Box, Text } from 'ink'; import { useRef, useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { PickerMenu } from '@ui/tui/primitives/index'; -import { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions'; -import { Colors } from '@ui/tui/styles'; +import { PickerMenu } from '@tui/primitives/index'; +import { useStdoutDimensions } from '@tui/hooks/useStdoutDimensions'; +import { Colors } from '@tui/styles'; import { MINT_FAILURE_MESSAGE, MINT_FAILURE_BODY, MINT_FAILURE_CONTACT, -} from '@ui/mint-failure'; -import type { WizardSpellbook } from '@lib/wizard-spellbook'; +} from '@tui/mint-failure'; +import type { WizardSpellbook } from '@tui/services/wizard-spellbook'; import type { CodingAgent } from '../services/coding-agent-launcher'; export type MintFailureServices = { diff --git a/src/ui/tui/screens/OutroScreen.tsx b/src/tui/screens/OutroScreen.tsx similarity index 97% rename from src/ui/tui/screens/OutroScreen.tsx rename to src/tui/screens/OutroScreen.tsx index 611e801d1..b82ce772c 100644 --- a/src/ui/tui/screens/OutroScreen.tsx +++ b/src/tui/screens/OutroScreen.tsx @@ -10,10 +10,10 @@ import { Box, Text } from 'ink'; import { useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; import { OutroKind } from '@lib/wizard-session'; -import { Colors } from '@ui/tui/styles'; +import { Colors } from '@tui/styles'; import { withUtm } from '@utils/links'; -import { LinkText } from '@ui/tui/primitives/LinkText'; -import { useDismissOnAnyKey } from '@ui/tui/hooks/useDismissOnAnyKey'; +import { LinkText } from '@tui/primitives/LinkText'; +import { useDismissOnAnyKey } from '@tui/hooks/useDismissOnAnyKey'; interface OutroScreenProps { store: WizardStore; diff --git a/src/ui/tui/screens/PortConflictScreen.tsx b/src/tui/screens/PortConflictScreen.tsx similarity index 95% rename from src/ui/tui/screens/PortConflictScreen.tsx rename to src/tui/screens/PortConflictScreen.tsx index abb30178c..e92faac2c 100644 --- a/src/ui/tui/screens/PortConflictScreen.tsx +++ b/src/tui/screens/PortConflictScreen.tsx @@ -8,7 +8,7 @@ import { Box, Text } from 'ink'; import { useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; import { OAUTH_PORTS } from '@shared/constants'; -import { ConfirmationInput, ModalOverlay } from '@ui/tui/primitives/index'; +import { ConfirmationInput, ModalOverlay } from '@tui/primitives/index'; interface PortConflictScreenProps { store: WizardStore; diff --git a/src/ui/tui/screens/RunScreen.tsx b/src/tui/screens/RunScreen.tsx similarity index 87% rename from src/ui/tui/screens/RunScreen.tsx rename to src/tui/screens/RunScreen.tsx index d7bcf02bf..e5cc82944 100644 --- a/src/ui/tui/screens/RunScreen.tsx +++ b/src/tui/screens/RunScreen.tsx @@ -16,15 +16,15 @@ import { LogViewer, EventPlanViewer, HNViewer, -} from '@ui/tui/primitives/index'; -import type { ProgressItem } from '@ui/tui/primitives/index'; -import { LearnCard } from '@ui/tui/components/LearnCard'; -import { VisualizerTab } from '@ui/tui/components/PhaseVisuals'; -import { TipsCard } from '@ui/tui/components/TipsCard'; -import { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions'; +} from '@tui/primitives/index'; +import type { ProgressItem } from '@tui/primitives/index'; +import { LearnCard } from '@tui/components/LearnCard'; +import { VisualizerTab } from '@tui/components/PhaseVisuals'; +import { TipsCard } from '@tui/components/TipsCard'; +import { useStdoutDimensions } from '@tui/hooks/useStdoutDimensions'; import { getProgramConfig } from '@programs'; -import { getContentBlocks as getSkillContentBlocks } from '@ui/tui/decks/agent-skill/index'; +import { getContentBlocks as getSkillContentBlocks } from '@tui/programs/shared/skill-deck'; import { WIZARD_LOG_FILE } from '@utils/paths'; diff --git a/src/ui/tui/screens/SessionTimeoutScreen.tsx b/src/tui/screens/SessionTimeoutScreen.tsx similarity index 92% rename from src/ui/tui/screens/SessionTimeoutScreen.tsx rename to src/tui/screens/SessionTimeoutScreen.tsx index 944b80b3d..926e40efd 100644 --- a/src/ui/tui/screens/SessionTimeoutScreen.tsx +++ b/src/tui/screens/SessionTimeoutScreen.tsx @@ -10,9 +10,9 @@ import { Box, Text } from 'ink'; import { useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { Colors } from '@ui/tui/styles'; +import { Colors } from '@tui/styles'; import { OAUTH_TIMEOUT_MS } from '@shared/constants'; -import { useDismissOnAnyKey } from '@ui/tui/hooks/useDismissOnAnyKey'; +import { useDismissOnAnyKey } from '@tui/hooks/useDismissOnAnyKey'; interface SessionTimeoutScreenProps { store: WizardStore; diff --git a/src/ui/tui/screens/SettingsOverrideScreen.tsx b/src/tui/screens/SettingsOverrideScreen.tsx similarity index 95% rename from src/ui/tui/screens/SettingsOverrideScreen.tsx rename to src/tui/screens/SettingsOverrideScreen.tsx index 8cafbc311..cf2e40f6e 100644 --- a/src/ui/tui/screens/SettingsOverrideScreen.tsx +++ b/src/tui/screens/SettingsOverrideScreen.tsx @@ -1,8 +1,8 @@ import { Box, Text } from 'ink'; import { useEffect, useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { ConfirmationInput, ModalOverlay } from '@ui/tui/primitives/index'; -import { Icons } from '@ui/tui/styles'; +import { ConfirmationInput, ModalOverlay } from '@tui/primitives/index'; +import { Icons } from '@tui/styles'; import { analytics } from '@utils/analytics'; interface SettingsOverrideScreenProps { diff --git a/src/ui/tui/screens/SetupScreen.tsx b/src/tui/screens/SetupScreen.tsx similarity index 97% rename from src/ui/tui/screens/SetupScreen.tsx rename to src/tui/screens/SetupScreen.tsx index 959f82f91..7ced6092f 100644 --- a/src/ui/tui/screens/SetupScreen.tsx +++ b/src/tui/screens/SetupScreen.tsx @@ -10,8 +10,8 @@ import { Box, Text } from 'ink'; import { useState, useEffect } from 'react'; import { useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { PickerMenu } from '@ui/tui/primitives/index'; -import { Colors } from '@ui/tui/styles'; +import { PickerMenu } from '@tui/primitives/index'; +import { Colors } from '@tui/styles'; import type { SetupQuestion } from '@programs/types'; interface SetupScreenProps { diff --git a/src/ui/tui/screens/SkillSourceInfo.tsx b/src/tui/screens/SkillSourceInfo.tsx similarity index 100% rename from src/ui/tui/screens/SkillSourceInfo.tsx rename to src/tui/screens/SkillSourceInfo.tsx diff --git a/src/ui/tui/screens/SlackConnectScreen.tsx b/src/tui/screens/SlackConnectScreen.tsx similarity index 98% rename from src/ui/tui/screens/SlackConnectScreen.tsx rename to src/tui/screens/SlackConnectScreen.tsx index 423e551db..782efa538 100644 --- a/src/ui/tui/screens/SlackConnectScreen.tsx +++ b/src/tui/screens/SlackConnectScreen.tsx @@ -27,10 +27,10 @@ import { Box, Text } from 'ink'; import { useEffect, useRef, useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { Colors, Icons } from '@ui/tui/styles'; -import { PickerMenu, LoadingBox } from '@ui/tui/primitives/index'; -import { useKeyBindings, KeyMatch } from '@ui/tui/hooks/useKeyBindings'; -import { getSlackAppCard } from '@lib/mcp-role-prompts'; +import { Colors, Icons } from '@tui/styles'; +import { PickerMenu, LoadingBox } from '@tui/primitives/index'; +import { useKeyBindings, KeyMatch } from '@tui/hooks/useKeyBindings'; +import { getSlackAppCard } from '@tui/tools/mcp/services/mcp-role-prompts'; import { fetchSlackConnected } from '@shared/api'; import { Program } from '@programs'; import { getOrAskForProjectData } from '@utils/setup-utils'; diff --git a/src/ui/tui/screens/TaskNoticeScreen.tsx b/src/tui/screens/TaskNoticeScreen.tsx similarity index 93% rename from src/ui/tui/screens/TaskNoticeScreen.tsx rename to src/tui/screens/TaskNoticeScreen.tsx index d3e751240..06cf0eab5 100644 --- a/src/ui/tui/screens/TaskNoticeScreen.tsx +++ b/src/tui/screens/TaskNoticeScreen.tsx @@ -9,8 +9,8 @@ import { Box, Text } from 'ink'; import { useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { Colors } from '@ui/tui/styles'; -import { ConfirmationInput, ModalOverlay } from '@ui/tui/primitives/index'; +import { Colors } from '@tui/styles'; +import { ConfirmationInput, ModalOverlay } from '@tui/primitives/index'; interface TaskNoticeScreenProps { store: WizardStore; diff --git a/src/ui/tui/screens/WizardAskScreen.tsx b/src/tui/screens/WizardAskScreen.tsx similarity index 98% rename from src/ui/tui/screens/WizardAskScreen.tsx rename to src/tui/screens/WizardAskScreen.tsx index ec477c4aa..5b1ecf3c1 100644 --- a/src/ui/tui/screens/WizardAskScreen.tsx +++ b/src/tui/screens/WizardAskScreen.tsx @@ -15,10 +15,10 @@ import { ModalOverlay, PickerMenu, extractUrls, -} from '@ui/tui/primitives/index'; -import { Colors, Icons } from '@ui/tui/styles'; +} from '@tui/primitives/index'; +import { Colors, Icons } from '@tui/styles'; import { copyToClipboard, openInBrowser } from '@utils/clipboard'; -import { useKeyBindings } from '@ui/tui/hooks/useKeyBindings'; +import { useKeyBindings } from '@tui/hooks/useKeyBindings'; import type { AskAnswers, AskQuestion } from '@lib/wizard-session'; interface WizardAskScreenProps { diff --git a/src/ui/tui/screens/__tests__/IntroScreenLayout.test.ts b/src/tui/screens/__tests__/IntroScreenLayout.test.ts similarity index 96% rename from src/ui/tui/screens/__tests__/IntroScreenLayout.test.ts rename to src/tui/screens/__tests__/IntroScreenLayout.test.ts index 01507c4cc..feb3d4b17 100644 --- a/src/ui/tui/screens/__tests__/IntroScreenLayout.test.ts +++ b/src/tui/screens/__tests__/IntroScreenLayout.test.ts @@ -8,8 +8,8 @@ import { buildIntroMenu, detectionLabelWidth, -} from '@ui/tui/screens/IntroScreenLayout'; -import { PRIVACY_PANEL_LABEL } from '@ui/tui/components/PrivacyPanel'; +} from '@tui/screens/IntroScreenLayout'; +import { PRIVACY_PANEL_LABEL } from '@tui/components/PrivacyPanel'; const values = (options: ReturnType) => options?.map((o) => o.value); diff --git a/src/ui/tui/screens/health/HealthCheckScreen.tsx b/src/tui/screens/health/HealthCheckScreen.tsx similarity index 97% rename from src/ui/tui/screens/health/HealthCheckScreen.tsx rename to src/tui/screens/health/HealthCheckScreen.tsx index 676276935..ccad3743e 100644 --- a/src/ui/tui/screens/health/HealthCheckScreen.tsx +++ b/src/tui/screens/health/HealthCheckScreen.tsx @@ -14,9 +14,9 @@ import { ConfirmationInput, LoadingBox, ModalOverlay, -} from '@ui/tui/primitives/index'; -import { Colors, Icons } from '@ui/tui/styles'; -import { ServiceHealthList } from '@ui/tui/components/ServiceHealthList'; +} from '@tui/primitives/index'; +import { Colors, Icons } from '@tui/styles'; +import { ServiceHealthList } from '@tui/components/ServiceHealthList'; import { getBlockingServiceKeys, SIGNUP_WIZARD_READINESS_CONFIG, @@ -27,7 +27,7 @@ import { ErrorCodes } from '@shared/errors'; import { downloadSkill } from '@agent'; import { fetchSkillMenu } from '@shared/skill-menu'; import { GITHUB_SKILLS_BASE_URL } from '@shared/constants'; -import { useDismissOnAnyKey } from '@ui/tui/hooks/useDismissOnAnyKey'; +import { useDismissOnAnyKey } from '@tui/hooks/useDismissOnAnyKey'; interface HealthCheckScreenProps { store: WizardStore; diff --git a/src/lib/__tests__/wizard-spellbook.test.ts b/src/tui/services/__tests__/wizard-spellbook.test.ts similarity index 96% rename from src/lib/__tests__/wizard-spellbook.test.ts rename to src/tui/services/__tests__/wizard-spellbook.test.ts index 0d0889c6f..882c7c27d 100644 --- a/src/lib/__tests__/wizard-spellbook.test.ts +++ b/src/tui/services/__tests__/wizard-spellbook.test.ts @@ -2,8 +2,8 @@ import fs from 'fs/promises'; import os from 'os'; import path from 'path'; import { Integration } from '@shared/constants'; -import type { ProgramConfig } from '../../programs/program-step'; -import { buildSession } from '../wizard-session'; +import type { ProgramConfig } from '../../../programs/program-step'; +import { buildSession } from '../../../lib/wizard-session'; import { writeWizardSpellbook } from '../wizard-spellbook'; import { downloadSkill } from '@agent/tools/tools'; import { fetchSkillMenu } from '@shared/skill-menu'; diff --git a/src/ui/tui/services/coding-agent-launcher.ts b/src/tui/services/coding-agent-launcher.ts similarity index 100% rename from src/ui/tui/services/coding-agent-launcher.ts rename to src/tui/services/coding-agent-launcher.ts diff --git a/src/ui/tui/services/mcp-installer.ts b/src/tui/services/mcp-installer.ts similarity index 94% rename from src/ui/tui/services/mcp-installer.ts rename to src/tui/services/mcp-installer.ts index 848ad0349..51da50b14 100644 --- a/src/ui/tui/services/mcp-installer.ts +++ b/src/tui/services/mcp-installer.ts @@ -12,17 +12,17 @@ import { getSupportedPluginClients, installPlugins as runPluginInstall, } from '@steps/add-mcp-server-to-clients/index'; -import { ALL_FEATURE_VALUES } from '@steps/add-mcp-server-to-clients/defaults'; +import { ALL_FEATURE_VALUES } from '@shared/mcp-clients/defaults'; import { McpClientStatus, namesWithStatus, redactSecrets, toClientResult, type McpClientResult, -} from '@steps/add-mcp-server-to-clients/results'; -import { isPluginCapable } from '@steps/add-mcp-server-to-clients/plugin-client'; -import { isLoginCapable } from '@steps/add-mcp-server-to-clients/login-client'; -import { isBrowserFinishable } from '@steps/add-mcp-server-to-clients/browser-client'; +} from '@shared/mcp-clients/results'; +import { isPluginCapable } from '@shared/mcp-clients/plugin-client'; +import { isLoginCapable } from '@shared/mcp-clients/login-client'; +import { isBrowserFinishable } from '@shared/mcp-clients/browser-client'; import { logToFile } from '@utils/debug'; import { analytics } from '@utils/analytics'; diff --git a/src/lib/wizard-spellbook.ts b/src/tui/services/wizard-spellbook.ts similarity index 98% rename from src/lib/wizard-spellbook.ts rename to src/tui/services/wizard-spellbook.ts index 36af8c739..46d5edb8e 100644 --- a/src/lib/wizard-spellbook.ts +++ b/src/tui/services/wizard-spellbook.ts @@ -2,7 +2,7 @@ import fs from 'fs/promises'; import path from 'path'; import { getSkillsBaseUrl, POSTHOG_DOCS_URL } from '@shared/constants'; import type { ProgramConfig } from '@programs/types'; -import type { WizardSession } from './wizard-session'; +import type { WizardSession } from '../../lib/wizard-session'; import { downloadSkill } from '@agent'; import { fetchSkillMenu, diff --git a/src/ui/tui/start-tui.ts b/src/tui/start-tui.ts similarity index 96% rename from src/ui/tui/start-tui.ts rename to src/tui/start-tui.ts index 66fe7ea37..3981b694a 100644 --- a/src/ui/tui/start-tui.ts +++ b/src/tui/start-tui.ts @@ -8,8 +8,8 @@ import { render } from 'ink'; import { createElement } from 'react'; -import { WizardStore, Program, type ProgramId } from './store.js'; -import { InkUI } from './ink-ui.js'; +import { WizardStore, Program, type ProgramId } from '../ui/tui/store.js'; +import { InkUI } from '../ui/tui/ink-ui.js'; import { setUI } from '@ui/index'; import { App } from './App.js'; import { enterDarkTerminal, releaseTerminal } from './terminal.js'; diff --git a/src/ui/tui/styles.ts b/src/tui/styles.ts similarity index 100% rename from src/ui/tui/styles.ts rename to src/tui/styles.ts diff --git a/src/ui/tui/terminal.ts b/src/tui/terminal.ts similarity index 100% rename from src/ui/tui/terminal.ts rename to src/tui/terminal.ts diff --git a/src/ui/tui/screens/doctor/DoctorIntroScreen.tsx b/src/tui/tools/doctor/screens/DoctorIntroScreen.tsx similarity index 93% rename from src/ui/tui/screens/doctor/DoctorIntroScreen.tsx rename to src/tui/tools/doctor/screens/DoctorIntroScreen.tsx index 898be3020..208df8b7e 100644 --- a/src/ui/tui/screens/doctor/DoctorIntroScreen.tsx +++ b/src/tui/tools/doctor/screens/DoctorIntroScreen.tsx @@ -1,8 +1,8 @@ import { Box, Text } from 'ink'; import { useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { PickerMenu } from '@ui/tui/primitives/index'; -import { Colors, Icons } from '@ui/tui/styles'; +import { PickerMenu } from '@tui/primitives/index'; +import { Colors, Icons } from '@tui/styles'; interface DoctorIntroScreenProps { store: WizardStore; diff --git a/src/ui/tui/screens/doctor/DoctorReportScreen.tsx b/src/tui/tools/doctor/screens/DoctorReportScreen.tsx similarity index 97% rename from src/ui/tui/screens/doctor/DoctorReportScreen.tsx rename to src/tui/tools/doctor/screens/DoctorReportScreen.tsx index e090bd378..05a27c3ca 100644 --- a/src/ui/tui/screens/doctor/DoctorReportScreen.tsx +++ b/src/tui/tools/doctor/screens/DoctorReportScreen.tsx @@ -1,8 +1,8 @@ import { Box, Text } from 'ink'; import { useEffect, useState, useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; -import { LoadingBox, PickerMenu } from '@ui/tui/primitives/index'; -import { Colors, Icons } from '@ui/tui/styles'; +import { LoadingBox, PickerMenu } from '@tui/primitives/index'; +import { Colors, Icons } from '@tui/styles'; import { fetchHealthIssues, type HealthIssue, diff --git a/src/ui/tui/screens/doctor/IssueTable.tsx b/src/tui/tools/doctor/screens/IssueTable.tsx similarity index 96% rename from src/ui/tui/screens/doctor/IssueTable.tsx rename to src/tui/tools/doctor/screens/IssueTable.tsx index f487a2ef6..5f296f9fa 100644 --- a/src/ui/tui/screens/doctor/IssueTable.tsx +++ b/src/tui/tools/doctor/screens/IssueTable.tsx @@ -1,6 +1,6 @@ import { Box, Text } from 'ink'; -import { useStdoutDimensions } from '@ui/tui/hooks/useStdoutDimensions'; -import { Colors, Icons } from '@ui/tui/styles'; +import { useStdoutDimensions } from '@tui/hooks/useStdoutDimensions'; +import { Colors, Icons } from '@tui/styles'; import { getKindMeta, type HealthIssue, diff --git a/src/ui/tui/screens/McpSuggestedPromptsScreen.tsx b/src/tui/tools/mcp/screens/McpSuggestedPromptsScreen.tsx similarity index 99% rename from src/ui/tui/screens/McpSuggestedPromptsScreen.tsx rename to src/tui/tools/mcp/screens/McpSuggestedPromptsScreen.tsx index 1ebdddb0f..5e86fe1fe 100644 --- a/src/ui/tui/screens/McpSuggestedPromptsScreen.tsx +++ b/src/tui/tools/mcp/screens/McpSuggestedPromptsScreen.tsx @@ -44,15 +44,15 @@ import { useSyncExternalStore } from 'react'; import type { WizardStore } from '@ui/tui/store'; import { Program } from '@programs'; -import { Colors, Icons } from '@ui/tui/styles'; -import { useKeyBindings, KeyMatch } from '@ui/tui/hooks/useKeyBindings'; +import { Colors, Icons } from '@tui/styles'; +import { useKeyBindings, KeyMatch } from '@tui/hooks/useKeyBindings'; import { ContentSequencer, LoadingBox, PickerMenu, TextRevealMode, type ContentBlock, -} from '@ui/tui/primitives/index'; +} from '@tui/primitives/index'; import { getRolePrompts, getRoleGreeting, @@ -63,19 +63,19 @@ import { FOLLOW_UP_EXIT_SENTINEL, type PromptOption, type RoleGreeting, -} from '@lib/mcp-role-prompts'; +} from '@tui/tools/mcp/services/mcp-role-prompts'; import { degradedProfile, isKnownCloudHost, type ProjectDataProfile, -} from '@lib/mcp-project-profile'; +} from '@tui/tools/mcp/services/mcp-project-profile'; import type { Integration } from '@shared/constants'; import { analytics } from '@utils/analytics'; import { logToFile } from '@utils/debug'; import type { AgentChunk, McpSuggestedPromptsServices, -} from '@ui/tui/services/mcp-suggested-prompts-services'; +} from '@tui/tools/mcp/services/suggested-prompts'; interface McpSuggestedPromptsScreenProps { store: WizardStore; diff --git a/src/lib/__tests__/mcp-project-profile.test.ts b/src/tui/tools/mcp/services/__tests__/mcp-project-profile.test.ts similarity index 99% rename from src/lib/__tests__/mcp-project-profile.test.ts rename to src/tui/tools/mcp/services/__tests__/mcp-project-profile.test.ts index 14f793ee5..7ab028237 100644 --- a/src/lib/__tests__/mcp-project-profile.test.ts +++ b/src/tui/tools/mcp/services/__tests__/mcp-project-profile.test.ts @@ -3,7 +3,7 @@ import { degradedProfile, isKnownCloudHost, type EventVolume, -} from '@lib/mcp-project-profile'; +} from '@tui/tools/mcp/services/mcp-project-profile'; // Inconclusive REST result for every product — the "we couldn't tell" // default used by most tier/event tests so they isolate the events probe. diff --git a/src/lib/__tests__/mcp-role-prompts.test.ts b/src/tui/tools/mcp/services/__tests__/mcp-role-prompts.test.ts similarity index 99% rename from src/lib/__tests__/mcp-role-prompts.test.ts rename to src/tui/tools/mcp/services/__tests__/mcp-role-prompts.test.ts index be84e1c69..adf322964 100644 --- a/src/lib/__tests__/mcp-role-prompts.test.ts +++ b/src/tui/tools/mcp/services/__tests__/mcp-role-prompts.test.ts @@ -10,14 +10,14 @@ import { getSlackAppCard, FOLLOW_UP_EXIT_SENTINEL, TAILORED_ROLES, -} from '@lib/mcp-role-prompts'; +} from '@tui/tools/mcp/services/mcp-role-prompts'; import { Integration } from '@shared/constants'; import { degradedProfile, type EventVolume, type ProductPresence, type ProjectDataProfile, -} from '@lib/mcp-project-profile'; +} from '@tui/tools/mcp/services/mcp-project-profile'; // Build a profile fixture without the network. Defaults to a rich profile // with a clean SaaS funnel and every product absent (so activation diff --git a/src/lib/__tests__/mcp-seed-events.test.ts b/src/tui/tools/mcp/services/__tests__/seed-events.test.ts similarity index 97% rename from src/lib/__tests__/mcp-seed-events.test.ts rename to src/tui/tools/mcp/services/__tests__/seed-events.test.ts index c10031f78..fda851d6e 100644 --- a/src/lib/__tests__/mcp-seed-events.test.ts +++ b/src/tui/tools/mcp/services/__tests__/seed-events.test.ts @@ -2,11 +2,11 @@ import { buildSeedEvents, tallySeedEvents, seededProfile, -} from '@lib/mcp-seed-events'; +} from '@tui/tools/mcp/services/seed-events'; import { degradedProfile, type ProjectDataProfile, -} from '@lib/mcp-project-profile'; +} from '@tui/tools/mcp/services/mcp-project-profile'; const NOW = new Date('2026-06-08T12:00:00.000Z'); const SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000; diff --git a/src/lib/mcp-project-profile.ts b/src/tui/tools/mcp/services/mcp-project-profile.ts similarity index 100% rename from src/lib/mcp-project-profile.ts rename to src/tui/tools/mcp/services/mcp-project-profile.ts diff --git a/src/lib/mcp-role-prompts.ts b/src/tui/tools/mcp/services/mcp-role-prompts.ts similarity index 99% rename from src/lib/mcp-role-prompts.ts rename to src/tui/tools/mcp/services/mcp-role-prompts.ts index 0fbf980dd..dd68ed28f 100644 --- a/src/lib/mcp-role-prompts.ts +++ b/src/tui/tools/mcp/services/mcp-role-prompts.ts @@ -24,7 +24,7 @@ import type { ProductPresence, ProjectDataProfile, } from './mcp-project-profile'; -import copyData from './mcp-role-prompts.copy.json'; +import copyData from '../../../../lib/mcp-role-prompts.copy.json'; /** Keys of `ProductPresence` — the products an activation cross-sell can target. */ export type ProductKey = keyof ProductPresence; diff --git a/src/lib/mcp-seed-events.ts b/src/tui/tools/mcp/services/seed-events.ts similarity index 100% rename from src/lib/mcp-seed-events.ts rename to src/tui/tools/mcp/services/seed-events.ts diff --git a/src/ui/tui/services/mcp-suggested-prompts-services.ts b/src/tui/tools/mcp/services/suggested-prompts.ts similarity index 97% rename from src/ui/tui/services/mcp-suggested-prompts-services.ts rename to src/tui/tools/mcp/services/suggested-prompts.ts index 813596516..296134a22 100644 --- a/src/ui/tui/services/mcp-suggested-prompts-services.ts +++ b/src/tui/tools/mcp/services/suggested-prompts.ts @@ -18,8 +18,8 @@ import type { ApiUser } from '@shared/api'; import { probeProjectData as runProbe, type ProjectDataProfile, -} from '@lib/mcp-project-profile'; -import { seedDemoEvents as runSeed } from '@lib/mcp-seed-events'; +} from '@tui/tools/mcp/services/mcp-project-profile'; +import { seedDemoEvents as runSeed } from '@tui/tools/mcp/services/seed-events'; // The streamed event shape is the agent's; re-exported so the screen and the // playground keep their import path. diff --git a/src/ui/__tests__/headless-ui.test.ts b/src/ui/__tests__/headless-ui.test.ts index b28417fd3..75b9cee42 100644 --- a/src/ui/__tests__/headless-ui.test.ts +++ b/src/ui/__tests__/headless-ui.test.ts @@ -61,10 +61,10 @@ it.each([ const { WizardStore } = await import('../tui/store'); const { InkUI } = await import('../tui/ink-ui'); const { TaskStreamPush } = await import( - '@programs/task-stream/task-stream-push' + '@programs/session/task-stream/task-stream-push' ); const { WizardRunSync } = await import( - '@programs/task-stream/wizard-run-sync' + '@programs/session/task-stream/wizard-run-sync' ); const { HostResolution } = await import('@shared/host-resolution'); const { RunPhase } = await import('@lib/wizard-session'); diff --git a/src/ui/tui/screen-registry.tsx b/src/ui/tui/screen-registry.tsx index c3b7d9e37..7f291f09c 100644 --- a/src/ui/tui/screen-registry.tsx +++ b/src/ui/tui/screen-registry.tsx @@ -12,58 +12,58 @@ import type { ReactNode } from 'react'; import path from 'node:path'; import { getLogFilePath } from '@utils/debug'; import type { WizardStore } from './store.js'; -import { ScreenId, Overlay, type ScreenName } from './router.js'; +import { ScreenId, Overlay, type ScreenName } from '../../tui/router.js'; -import { HealthCheckScreen } from './screens/health/HealthCheckScreen.js'; -import { DoctorIntroScreen } from './screens/doctor/DoctorIntroScreen.js'; -import { DoctorReportScreen } from './screens/doctor/DoctorReportScreen.js'; -import { SettingsOverrideScreen } from './screens/SettingsOverrideScreen.js'; -import { ManagedSettingsScreen } from './screens/ManagedSettingsScreen.js'; -import { PortConflictScreen } from './screens/PortConflictScreen.js'; -import { TaskNoticeScreen } from './screens/TaskNoticeScreen.js'; -import { ManualAuthCodeScreen } from './screens/ManualAuthCodeScreen.js'; -import { PostHogIntegrationIntroScreen } from './screens/PostHogIntegrationIntroScreen.js'; -import { RevenueIntroScreen } from './screens/RevenueIntroScreen.js'; -import { WarehouseIntroScreen } from './screens/WarehouseIntroScreen.js'; -import { MigrationIntroScreen } from './screens/MigrationIntroScreen.js'; -import { SourceMapsIntroScreen } from './screens/SourceMapsIntroScreen.js'; -import { SourceMapsDetectScreen } from './screens/SourceMapsDetectScreen.js'; -import { SourceMapsOutroScreen } from './screens/SourceMapsOutroScreen.js'; -import { AgentSkillIntroScreen } from './screens/AgentSkillIntroScreen.js'; -import { AiObservabilityIntroScreen } from './screens/AiObservabilityIntroScreen.js'; -import { MetricsIntroScreen } from './screens/MetricsIntroScreen.js'; -import { ErrorTrackingIntroScreen } from './screens/ErrorTrackingIntroScreen.js'; -import { ErrorTrackingDetectScreen } from './screens/ErrorTrackingDetectScreen.js'; -import { SelfDrivingIntroScreen } from './screens/SelfDrivingIntroScreen.js'; -import { SelfDrivingIntegrationCheckScreen } from './screens/SelfDrivingIntegrationCheckScreen.js'; -import { SelfDrivingIntegrationDetectScreen } from './screens/SelfDrivingIntegrationDetectScreen.js'; -import { SelfDrivingHandoffScreen } from './screens/SelfDrivingHandoffScreen.js'; -import { SelfDrivingGitHubScreen } from '@ui/tui/screens/SelfDrivingGitHubScreen'; -import { AuditIntroScreen } from './screens/audit/AuditIntroScreen.js'; -import { AuditRunScreen } from './screens/audit/AuditRunScreen.js'; -import { AuditOutroScreen } from './screens/audit/AuditOutroScreen.js'; -import { SetupScreen } from './screens/SetupScreen.js'; -import { AuthScreen } from './screens/AuthScreen.js'; -import { AiOptInRequiredScreen } from './screens/AiOptInRequiredScreen.js'; -import { RunScreen } from './screens/RunScreen.js'; -import { McpScreen } from './screens/McpScreen.js'; -import { McpSuggestedPromptsScreen } from './screens/McpSuggestedPromptsScreen.js'; -import { SlackConnectScreen } from './screens/SlackConnectScreen.js'; -import { KeepSkillsScreen } from './screens/KeepSkillsScreen.js'; -import { OutroScreen } from './screens/OutroScreen.js'; -import { MintFailureScreen } from './screens/MintFailureScreen.js'; -import type { MintFailureServices } from './screens/MintFailureScreen.js'; -import { openCodingAgent } from './services/coding-agent-launcher.js'; -import { writeWizardSpellbook } from '@lib/wizard-spellbook'; +import { HealthCheckScreen } from '../../tui/screens/health/HealthCheckScreen.js'; +import { DoctorIntroScreen } from '../../tui/tools/doctor/screens/DoctorIntroScreen.js'; +import { DoctorReportScreen } from '../../tui/tools/doctor/screens/DoctorReportScreen.js'; +import { SettingsOverrideScreen } from '../../tui/screens/SettingsOverrideScreen.js'; +import { ManagedSettingsScreen } from '../../tui/screens/ManagedSettingsScreen.js'; +import { PortConflictScreen } from '../../tui/screens/PortConflictScreen.js'; +import { TaskNoticeScreen } from '../../tui/screens/TaskNoticeScreen.js'; +import { ManualAuthCodeScreen } from '../../tui/screens/ManualAuthCodeScreen.js'; +import { PostHogIntegrationIntroScreen } from '../../tui/programs/posthog-integration/screens/PostHogIntegrationIntroScreen.js'; +import { RevenueIntroScreen } from '../../tui/programs/revenue-analytics/screens/RevenueIntroScreen.js'; +import { WarehouseIntroScreen } from '../../tui/programs/warehouse-source/screens/WarehouseIntroScreen.js'; +import { MigrationIntroScreen } from '../../tui/programs/migration/screens/MigrationIntroScreen.js'; +import { SourceMapsIntroScreen } from '../../tui/programs/error-tracking-upload-source-maps/screens/SourceMapsIntroScreen.js'; +import { SourceMapsDetectScreen } from '../../tui/programs/error-tracking-upload-source-maps/screens/SourceMapsDetectScreen.js'; +import { SourceMapsOutroScreen } from '../../tui/programs/error-tracking-upload-source-maps/screens/SourceMapsOutroScreen.js'; +import { AgentSkillIntroScreen } from '../../tui/programs/shared/screens/AgentSkillIntroScreen.js'; +import { AiObservabilityIntroScreen } from '../../tui/programs/ai-observability/screens/AiObservabilityIntroScreen.js'; +import { MetricsIntroScreen } from '../../tui/programs/metrics/screens/MetricsIntroScreen.js'; +import { ErrorTrackingIntroScreen } from '../../tui/programs/error-tracking/screens/ErrorTrackingIntroScreen.js'; +import { ErrorTrackingDetectScreen } from '../../tui/programs/error-tracking/screens/ErrorTrackingDetectScreen.js'; +import { SelfDrivingIntroScreen } from '../../tui/programs/self-driving/screens/SelfDrivingIntroScreen.js'; +import { SelfDrivingIntegrationCheckScreen } from '../../tui/programs/self-driving/screens/SelfDrivingIntegrationCheckScreen.js'; +import { SelfDrivingIntegrationDetectScreen } from '../../tui/programs/self-driving/screens/SelfDrivingIntegrationDetectScreen.js'; +import { SelfDrivingHandoffScreen } from '../../tui/programs/self-driving/screens/SelfDrivingHandoffScreen.js'; +import { SelfDrivingGitHubScreen } from '@tui/programs/self-driving/screens/SelfDrivingGitHubScreen'; +import { AuditIntroScreen } from '../../tui/programs/audit/screens/AuditIntroScreen.js'; +import { AuditRunScreen } from '../../tui/programs/audit/screens/AuditRunScreen.js'; +import { AuditOutroScreen } from '../../tui/programs/audit/screens/AuditOutroScreen.js'; +import { SetupScreen } from '../../tui/screens/SetupScreen.js'; +import { AuthScreen } from '../../tui/screens/AuthScreen.js'; +import { AiOptInRequiredScreen } from '../../tui/screens/AiOptInRequiredScreen.js'; +import { RunScreen } from '../../tui/screens/RunScreen.js'; +import { McpScreen } from '../../tui/screens/McpScreen.js'; +import { McpSuggestedPromptsScreen } from '../../tui/tools/mcp/screens/McpSuggestedPromptsScreen.js'; +import { SlackConnectScreen } from '../../tui/screens/SlackConnectScreen.js'; +import { KeepSkillsScreen } from '../../tui/screens/KeepSkillsScreen.js'; +import { OutroScreen } from '../../tui/screens/OutroScreen.js'; +import { MintFailureScreen } from '../../tui/screens/MintFailureScreen.js'; +import type { MintFailureServices } from '../../tui/screens/MintFailureScreen.js'; +import { openCodingAgent } from '../../tui/services/coding-agent-launcher.js'; +import { writeWizardSpellbook } from '@tui/services/wizard-spellbook'; import { getProgramConfig } from '@programs'; -import { ExitScreen } from './screens/ExitScreen.js'; -import { AuthErrorScreen } from './screens/AuthErrorScreen.js'; -import { SessionTimeoutScreen } from './screens/SessionTimeoutScreen.js'; -import { WizardAskScreen } from './screens/WizardAskScreen.js'; -import { createMcpInstaller } from './services/mcp-installer.js'; -import type { McpInstaller } from './services/mcp-installer.js'; -import { createMcpSuggestedPromptsServices } from './services/mcp-suggested-prompts-services.js'; -import type { McpSuggestedPromptsServices } from './services/mcp-suggested-prompts-services.js'; +import { ExitScreen } from '../../tui/screens/ExitScreen.js'; +import { AuthErrorScreen } from '../../tui/screens/AuthErrorScreen.js'; +import { SessionTimeoutScreen } from '../../tui/screens/SessionTimeoutScreen.js'; +import { WizardAskScreen } from '../../tui/screens/WizardAskScreen.js'; +import { createMcpInstaller } from '../../tui/services/mcp-installer.js'; +import type { McpInstaller } from '../../tui/services/mcp-installer.js'; +import { createMcpSuggestedPromptsServices } from '../../tui/tools/mcp/services/suggested-prompts.js'; +import type { McpSuggestedPromptsServices } from '../../tui/tools/mcp/services/suggested-prompts.js'; export interface ScreenServices extends MintFailureServices { mcpInstaller: McpInstaller; diff --git a/src/ui/tui/screen-sequences.ts b/src/ui/tui/screen-sequences.ts index 1ee869245..ff2d2e505 100644 --- a/src/ui/tui/screen-sequences.ts +++ b/src/ui/tui/screen-sequences.ts @@ -9,7 +9,7 @@ import type { WizardSession } from '@lib/wizard-session'; import { PROGRAM_REGISTRY, type ProgramId } from '@programs'; import { createProgramSequence } from '@programs/program-step'; -import { withAiOptInGate } from '@programs/ai-opt-in-gate'; +import { withAiOptInGate } from '@tui/ai-opt-in-gate'; /** Screens that participate in linear programs. */ export enum ScreenId { diff --git a/src/ui/tui/store.ts b/src/ui/tui/store.ts index 97573dead..9f7e5b7f6 100644 --- a/src/ui/tui/store.ts +++ b/src/ui/tui/store.ts @@ -47,12 +47,12 @@ import { Overlay, Program, type ProgramId, -} from './router.js'; +} from '../../tui/router.js'; import { analytics, sessionProperties } from '@utils/analytics'; import type { StoreInitContext, ProgramReadyContext } from '@programs/types'; import { getProgramConfig } from '@programs'; -import { withAiOptInGate } from '@programs/ai-opt-in-gate'; -import { reportWarehouseSourcesDetected } from '@programs/posthog-integration/detect'; +import { withAiOptInGate } from '@tui/ai-opt-in-gate'; +import { reportWarehouseSourcesDetected } from '@programs/detection/integration'; import { appendStatus } from '@shared/status-history'; import { IS_DEV } from '@shared/constants'; import { computeTokenCostUsd } from '@shared/token-pricing'; diff --git a/tsconfig.build.json b/tsconfig.build.json index e66f19f33..f292154e4 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -26,6 +26,11 @@ "@programs": ["./src/programs/index.ts"], "@programs/types": ["./src/programs/types.ts"], "@programs/*": ["./src/programs/*"], + "@host/*": ["./src/host/*"], + "@tools/*": ["./src/tools/*"], + "@tui/*": ["./src/tui/*"], + "@headless/*": ["./src/headless/*"], + "@cli/*": ["./src/cli/*"], "@lib/*": ["./src/lib/*"], "@e2e-harness/*": ["./e2e-harness/*"], "@utils/*": ["./src/shared/utils/*"], diff --git a/vitest.config.ts b/vitest.config.ts index 16492b363..ad22f4445 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -87,6 +87,11 @@ export default defineConfig({ { find: /^@programs\/types$/, replacement: r('src/programs/types.ts') }, { find: /^@programs\/(.*)$/, replacement: `${r('src/programs')}/$1` }, // Path aliases — mirror tsconfig `paths`. + { find: /^@host\/(.*)$/, replacement: `${r('src/host')}/$1` }, + { find: /^@tools\/(.*)$/, replacement: `${r('src/tools')}/$1` }, + { find: /^@tui\/(.*)$/, replacement: `${r('src/tui')}/$1` }, + { find: /^@headless\/(.*)$/, replacement: `${r('src/headless')}/$1` }, + { find: /^@cli\/(.*)$/, replacement: `${r('src/cli')}/$1` }, { find: /^@env$/, replacement: r('src/env.ts') }, { find: /^@lib\/(.*)$/, replacement: `${r('src/lib')}/$1` }, { find: /^@e2e-harness\/(.*)$/, replacement: `${r('e2e-harness')}/$1` },