@posthog/wizard 2.6.2 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/bin.js +5 -0
  2. package/dist/bin.js.map +1 -1
  3. package/dist/src/lib/__tests__/cloudflare-detection.test.d.ts +1 -0
  4. package/dist/src/lib/__tests__/cloudflare-detection.test.js +119 -0
  5. package/dist/src/lib/__tests__/cloudflare-detection.test.js.map +1 -0
  6. package/dist/src/lib/agent-runner.js +17 -3
  7. package/dist/src/lib/agent-runner.js.map +1 -1
  8. package/dist/src/lib/cloudflare-detection.d.ts +14 -0
  9. package/dist/src/lib/cloudflare-detection.js +74 -0
  10. package/dist/src/lib/cloudflare-detection.js.map +1 -0
  11. package/dist/src/lib/constants.d.ts +4 -1
  12. package/dist/src/lib/constants.js +4 -1
  13. package/dist/src/lib/constants.js.map +1 -1
  14. package/dist/src/lib/middleware/config.js +4 -4
  15. package/dist/src/lib/middleware/config.js.map +1 -1
  16. package/dist/src/lib/version.d.ts +1 -1
  17. package/dist/src/lib/version.js +1 -1
  18. package/dist/src/lib/version.js.map +1 -1
  19. package/dist/src/lib/wizard-session.d.ts +6 -0
  20. package/dist/src/lib/wizard-session.js +4 -0
  21. package/dist/src/lib/wizard-session.js.map +1 -1
  22. package/dist/src/run.d.ts +1 -0
  23. package/dist/src/run.js +6 -0
  24. package/dist/src/run.js.map +1 -1
  25. package/dist/src/steps/add-mcp-server-to-clients/defaults.js +5 -5
  26. package/dist/src/steps/add-mcp-server-to-clients/defaults.js.map +1 -1
  27. package/dist/src/ui/tui/__tests__/store.test.js +26 -2
  28. package/dist/src/ui/tui/__tests__/store.test.js.map +1 -1
  29. package/dist/src/ui/tui/flows.d.ts +1 -0
  30. package/dist/src/ui/tui/flows.js +6 -1
  31. package/dist/src/ui/tui/flows.js.map +1 -1
  32. package/dist/src/ui/tui/screen-registry.js +2 -0
  33. package/dist/src/ui/tui/screen-registry.js.map +1 -1
  34. package/dist/src/ui/tui/screens/OutroScreen.js +2 -2
  35. package/dist/src/ui/tui/screens/OutroScreen.js.map +1 -1
  36. package/dist/src/ui/tui/screens/SkillsScreen.d.ts +14 -0
  37. package/dist/src/ui/tui/screens/SkillsScreen.js +71 -0
  38. package/dist/src/ui/tui/screens/SkillsScreen.js.map +1 -0
  39. package/dist/src/ui/tui/store.d.ts +2 -0
  40. package/dist/src/ui/tui/store.js +12 -0
  41. package/dist/src/ui/tui/store.js.map +1 -1
  42. package/dist/src/utils/__tests__/provisioning.test.d.ts +1 -0
  43. package/dist/src/utils/__tests__/provisioning.test.js +192 -0
  44. package/dist/src/utils/__tests__/provisioning.test.js.map +1 -0
  45. package/dist/src/utils/debug.d.ts +6 -0
  46. package/dist/src/utils/debug.js +16 -0
  47. package/dist/src/utils/debug.js.map +1 -1
  48. package/dist/src/utils/oauth.js +1 -1
  49. package/dist/src/utils/oauth.js.map +1 -1
  50. package/dist/src/utils/provisioning.d.ts +25 -0
  51. package/dist/src/utils/provisioning.js +191 -0
  52. package/dist/src/utils/provisioning.js.map +1 -0
  53. package/dist/src/utils/setup-utils.d.ts +4 -1
  54. package/dist/src/utils/setup-utils.js +46 -2
  55. package/dist/src/utils/setup-utils.js.map +1 -1
  56. package/dist/src/utils/types.d.ts +4 -0
  57. package/dist/src/utils/types.js.map +1 -1
  58. package/npm-shrinkwrap.json +2 -2
  59. package/package.json +8 -4
@@ -1 +1 @@
1
- {"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../../../../src/ui/tui/__tests__/store.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n WizardStore,\n TaskStatus,\n Flow,\n Screen,\n Overlay,\n RunPhase,\n McpOutcome,\n} from '../store.js';\nimport { OutroKind, AdditionalFeature } from '../../../lib/wizard-session.js';\nimport { WizardReadiness } from '../../../lib/health-checks/readiness.js';\nimport { buildSession } from '../../../lib/wizard-session.js';\nimport { Integration } from '../../../lib/constants.js';\nimport { analytics } from '../../../utils/analytics.js';\n\njest.mock('../../../utils/analytics.js', () => ({\n analytics: {\n capture: jest.fn(),\n wizardCapture: jest.fn(),\n setTag: jest.fn(),\n shutdown: jest.fn().mockResolvedValue(undefined),\n },\n sessionProperties: jest.fn(() => ({})),\n}));\n\njest.mock('../../../lib/health-checks/readiness.js', () => ({\n evaluateWizardReadiness: jest.fn().mockResolvedValue({\n decision: 'yes',\n health: {},\n reasons: [],\n }),\n WizardReadiness: {\n Yes: 'yes',\n No: 'no',\n YesWithWarnings: 'yes-with-warnings',\n },\n SERVICE_LABELS: {},\n}));\n\nfunction createStore(flow?: Flow): WizardStore {\n return new WizardStore(flow);\n}\n\nconst wizardCaptureMock = analytics.wizardCapture as jest.Mock;\n\ndescribe('WizardStore', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n });\n // ── Construction ─────────────────────────────────────────────────\n\n describe('constructor', () => {\n it('initialises with default state', () => {\n const store = createStore();\n expect(store.version).toBe('');\n expect(store.statusMessages).toEqual([]);\n expect(store.tasks).toEqual([]);\n expect(store.session).toEqual(buildSession({}));\n });\n\n it('defaults to Wizard flow', () => {\n const store = createStore();\n expect(store.router.activeFlow).toBe(Flow.Wizard);\n });\n\n it('accepts a custom flow', () => {\n const store = createStore(Flow.McpAdd);\n expect(store.router.activeFlow).toBe(Flow.McpAdd);\n });\n\n it('starts with version 0', () => {\n const store = createStore();\n expect(store.getVersion()).toBe(0);\n expect(store.getSnapshot()).toBe(0);\n });\n });\n\n // ── Change notification ──────────────────────────────────────────\n\n describe('change notification', () => {\n it('emitChange increments version and notifies subscribers', () => {\n const store = createStore();\n const listener = jest.fn();\n store.subscribe(listener);\n\n store.emitChange();\n\n expect(store.getVersion()).toBe(1);\n expect(listener).toHaveBeenCalledTimes(1);\n });\n\n it('version increments on each emitChange', () => {\n const store = createStore();\n store.emitChange();\n store.emitChange();\n store.emitChange();\n expect(store.getVersion()).toBe(3);\n });\n });\n\n // ── React integration (subscribe / getSnapshot) ──────────────────\n\n describe('subscribe / getSnapshot', () => {\n it('subscribe registers a listener that fires on change', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.emitChange();\n expect(cb).toHaveBeenCalledTimes(1);\n });\n\n it('subscribe returns an unsubscribe function', () => {\n const store = createStore();\n const cb = jest.fn();\n const unsub = store.subscribe(cb);\n\n unsub();\n store.emitChange();\n expect(cb).not.toHaveBeenCalled();\n });\n\n it('getSnapshot returns the current version', () => {\n const store = createStore();\n expect(store.getSnapshot()).toBe(0);\n store.emitChange();\n expect(store.getSnapshot()).toBe(1);\n });\n\n it('is compatible with useSyncExternalStore contract', () => {\n const store = createStore();\n const cb = jest.fn();\n const unsub = store.subscribe(cb);\n\n const v1 = store.getSnapshot();\n store.completeSetup();\n const v2 = store.getSnapshot();\n\n expect(v2).toBeGreaterThan(v1);\n expect(cb).toHaveBeenCalled();\n unsub();\n });\n });\n\n // ── Session setters ──────────────────────────────────────────────\n\n describe('session setters', () => {\n it('completeSetup sets setupConfirmed and resolves setupComplete promise', async () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.completeSetup();\n\n expect(store.session.setupConfirmed).toBe(true);\n await store.setupComplete;\n expect(cb).toHaveBeenCalled();\n });\n\n it('setRunPhase updates session.runPhase', () => {\n const store = createStore();\n store.setRunPhase(RunPhase.Running);\n expect(store.session.runPhase).toBe(RunPhase.Running);\n });\n\n it('setCredentials updates session.credentials', () => {\n const store = createStore();\n const creds = {\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'https://app.posthog.com',\n projectId: 42,\n };\n store.setCredentials(creds);\n expect(store.session.credentials).toEqual(creds);\n });\n\n it('setFrameworkConfig updates integration and frameworkConfig', () => {\n const store = createStore();\n const integration = Integration.nextjs;\n const config = {\n metadata: { name: 'Next.js' },\n } as WizardStore['session']['frameworkConfig'];\n\n store.setFrameworkConfig(integration, config);\n\n expect(store.session.integration).toBe(integration);\n expect(store.session.frameworkConfig).toBe(config);\n });\n\n it('setDetectionComplete marks detection done', () => {\n const store = createStore();\n expect(store.session.detectionComplete).toBe(false);\n store.setDetectionComplete();\n expect(store.session.detectionComplete).toBe(true);\n });\n\n it('setDetectedFramework sets the label', () => {\n const store = createStore();\n store.setDetectedFramework('Django');\n expect(store.session.detectedFrameworkLabel).toBe('Django');\n });\n\n it('setLoginUrl sets and clears the login URL', () => {\n const store = createStore();\n store.setLoginUrl('https://example.com/auth');\n expect(store.session.loginUrl).toBe('https://example.com/auth');\n\n store.setLoginUrl(null);\n expect(store.session.loginUrl).toBeNull();\n });\n\n it('setReadinessResult sets readiness info', () => {\n const store = createStore();\n const result = {\n decision: WizardReadiness.No,\n health: {} as never,\n reasons: ['Anthropic: down'],\n };\n store.setReadinessResult(result);\n expect(store.session.readinessResult).toEqual(result);\n\n store.setReadinessResult(null);\n expect(store.session.readinessResult).toBeNull();\n });\n\n it('setMcpComplete marks MCP step done with outcome', () => {\n const store = createStore();\n expect(store.session.mcpComplete).toBe(false);\n store.setMcpComplete(McpOutcome.Installed, ['Cursor']);\n expect(store.session.mcpComplete).toBe(true);\n expect(store.session.mcpOutcome).toBe(McpOutcome.Installed);\n expect(store.session.mcpInstalledClients).toEqual(['Cursor']);\n });\n\n it('setOutroData sets outro information', () => {\n const store = createStore();\n const data = { kind: OutroKind.Success, message: 'Done!' };\n store.setOutroData(data);\n expect(store.session.outroData).toEqual(data);\n });\n\n it('setFrameworkContext sets key-value pairs', () => {\n const store = createStore();\n store.setFrameworkContext('packageManager', 'pnpm');\n expect(store.session.frameworkContext['packageManager']).toBe('pnpm');\n\n store.setFrameworkContext('srcDir', 'src');\n expect(store.session.frameworkContext['srcDir']).toBe('src');\n });\n\n it('every setter emits exactly one change event', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.completeSetup();\n store.setRunPhase(RunPhase.Running);\n store.setCredentials(null);\n store.setDetectionComplete();\n store.setDetectedFramework('React');\n store.setLoginUrl('url');\n store.setReadinessResult(null);\n store.setMcpComplete();\n store.setOutroData({ kind: OutroKind.Success });\n store.setFrameworkContext('k', 'v');\n store.setFrameworkConfig(null, null);\n\n expect(cb).toHaveBeenCalledTimes(11);\n });\n });\n\n // ── Setter analytics events ────────────────────────────────────\n\n describe('setter analytics events', () => {\n it('completeSetup fires setup confirmed event', () => {\n const store = createStore();\n store.completeSetup();\n expect(wizardCaptureMock).toHaveBeenCalledWith(\n 'setup confirmed',\n expect.any(Object),\n );\n });\n\n it('setCredentials fires auth complete event', () => {\n const store = createStore();\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 42,\n });\n expect(wizardCaptureMock).toHaveBeenCalledWith('auth complete', {\n project_id: 42,\n });\n });\n\n it('enableFeature fires feature enabled event', () => {\n const store = createStore();\n store.enableFeature(AdditionalFeature.LLM);\n expect(wizardCaptureMock).toHaveBeenCalledWith('feature enabled', {\n feature: AdditionalFeature.LLM,\n });\n });\n\n it('setMcpComplete fires mcp complete event', () => {\n const store = createStore();\n store.setMcpComplete(McpOutcome.Installed, ['Cursor', 'VS Code']);\n expect(wizardCaptureMock).toHaveBeenCalledWith(\n 'mcp complete',\n expect.objectContaining({\n mcp_outcome: McpOutcome.Installed,\n mcp_installed_clients: ['Cursor', 'VS Code'],\n }),\n );\n });\n });\n\n // ── Screen resolution (derived state) ────────────────────────────\n\n describe('currentScreen', () => {\n it('starts at intro for Wizard flow', () => {\n const store = createStore();\n expect(store.currentScreen).toBe(Screen.Intro);\n });\n\n it('advances to health check after setup confirmed', () => {\n const store = createStore();\n store.completeSetup();\n expect(store.currentScreen).toBe(Screen.HealthCheck);\n });\n\n it('advances to auth after health check passes', () => {\n const store = createStore();\n store.completeSetup();\n store.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n expect(store.currentScreen).toBe(Screen.Auth);\n });\n\n it('advances to run after credentials are set', () => {\n const store = createStore();\n store.completeSetup();\n store.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n expect(store.currentScreen).toBe(Screen.Run);\n });\n\n it('advances to mcp after run completes', () => {\n const store = createStore();\n store.completeSetup();\n store.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.setRunPhase(RunPhase.Completed);\n expect(store.currentScreen).toBe(Screen.Mcp);\n });\n\n it('advances to outro after mcp completes', () => {\n const store = createStore();\n store.completeSetup();\n store.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.setRunPhase(RunPhase.Completed);\n store.setMcpComplete();\n expect(store.currentScreen).toBe(Screen.Outro);\n });\n\n it('starts at McpAdd for McpAdd flow', () => {\n const store = createStore(Flow.McpAdd);\n expect(store.currentScreen).toBe(Screen.McpAdd);\n });\n\n it('starts at McpRemove for McpRemove flow', () => {\n const store = createStore(Flow.McpRemove);\n expect(store.currentScreen).toBe(Screen.McpRemove);\n });\n });\n\n // ── Overlay navigation ───────────────────────────────────────────\n\n describe('overlay navigation', () => {\n it('pushOverlay shows the overlay over the current screen', () => {\n const store = createStore();\n store.pushOverlay(Overlay.SettingsOverride);\n expect(store.currentScreen).toBe(Overlay.SettingsOverride);\n });\n\n it('popOverlay returns to the underlying screen', () => {\n const store = createStore();\n store.pushOverlay(Overlay.SettingsOverride);\n store.popOverlay();\n expect(store.currentScreen).toBe(Screen.Intro);\n });\n\n it('pushOverlay emits change and increments version', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.pushOverlay(Overlay.SettingsOverride);\n\n expect(cb).toHaveBeenCalledTimes(1);\n expect(store.getVersion()).toBe(1);\n });\n\n it('popOverlay emits change and increments version', () => {\n const store = createStore();\n store.pushOverlay(Overlay.SettingsOverride);\n\n const cb = jest.fn();\n store.subscribe(cb);\n store.popOverlay();\n\n expect(cb).toHaveBeenCalledTimes(1);\n });\n\n it('pushOverlay sets direction to push', () => {\n const store = createStore();\n store.pushOverlay(Overlay.SettingsOverride);\n expect(store.lastNavDirection).toBe('push');\n });\n\n it('popOverlay sets direction to pop', () => {\n const store = createStore();\n store.pushOverlay(Overlay.SettingsOverride);\n store.popOverlay();\n expect(store.lastNavDirection).toBe('pop');\n });\n });\n\n // ── Agent observation state ──────────────────────────────────────\n\n describe('statusMessages', () => {\n it('pushStatus appends messages', () => {\n const store = createStore();\n store.pushStatus('Installing SDK...');\n store.pushStatus('Configuring...');\n expect(store.statusMessages).toEqual([\n 'Installing SDK...',\n 'Configuring...',\n ]);\n });\n\n it('pushStatus emits change', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.pushStatus('msg');\n expect(cb).toHaveBeenCalledTimes(1);\n });\n });\n\n describe('tasks', () => {\n it('setTasks replaces the task list', () => {\n const store = createStore();\n const tasks = [\n { label: 'Install SDK', status: TaskStatus.Pending, done: false },\n { label: 'Configure', status: TaskStatus.Pending, done: false },\n ];\n store.setTasks(tasks);\n expect(store.tasks).toEqual(tasks);\n });\n\n it('updateTask marks a task as done', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Install SDK', status: TaskStatus.Pending, done: false },\n ]);\n\n store.updateTask(0, true);\n\n expect(store.tasks[0].done).toBe(true);\n expect(store.tasks[0].status).toBe(TaskStatus.Completed);\n });\n\n it('updateTask marks a task as not done', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Install SDK', status: TaskStatus.Completed, done: true },\n ]);\n\n store.updateTask(0, false);\n\n expect(store.tasks[0].done).toBe(false);\n expect(store.tasks[0].status).toBe(TaskStatus.Pending);\n });\n\n it('updateTask is a no-op for out-of-bounds index', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Install SDK', status: TaskStatus.Pending, done: false },\n ]);\n\n const cb = jest.fn();\n store.subscribe(cb);\n store.updateTask(99, true);\n\n expect(cb).not.toHaveBeenCalled();\n });\n });\n\n describe('syncTodos', () => {\n it('maps incoming todos to TaskItems', () => {\n const store = createStore();\n store.syncTodos([\n { content: 'Install SDK', status: 'pending' },\n { content: 'Configure', status: 'completed' },\n ]);\n\n expect(store.tasks).toHaveLength(2);\n expect(store.tasks[0]).toEqual({\n label: 'Install SDK',\n activeForm: undefined,\n status: TaskStatus.Pending,\n done: false,\n });\n expect(store.tasks[1]).toEqual({\n label: 'Configure',\n activeForm: undefined,\n status: TaskStatus.Completed,\n done: true,\n });\n });\n\n it('retains completed tasks not in the incoming list', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Old done task', status: TaskStatus.Completed, done: true },\n { label: 'Old pending task', status: TaskStatus.Pending, done: false },\n ]);\n\n store.syncTodos([{ content: 'New task', status: 'pending' }]);\n\n // Old done task is retained, old pending task is dropped\n expect(store.tasks).toHaveLength(2);\n expect(store.tasks[0].label).toBe('Old done task');\n expect(store.tasks[1].label).toBe('New task');\n });\n\n it('does not duplicate completed tasks that appear in both', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Shared task', status: TaskStatus.Completed, done: true },\n ]);\n\n store.syncTodos([{ content: 'Shared task', status: 'completed' }]);\n\n // Should not have duplicates — incomingLabels includes \"Shared task\",\n // so the retained filter excludes it\n expect(store.tasks).toHaveLength(1);\n expect(store.tasks[0].label).toBe('Shared task');\n });\n\n it('preserves activeForm from incoming todos', () => {\n const store = createStore();\n store.syncTodos([\n {\n content: 'Installing',\n status: 'in_progress',\n activeForm: 'Installing SDK...',\n },\n ]);\n\n expect(store.tasks[0].activeForm).toBe('Installing SDK...');\n });\n\n it('emits change', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n store.syncTodos([{ content: 'task', status: 'pending' }]);\n expect(cb).toHaveBeenCalled();\n });\n });\n\n // ── Navigation direction ─────────────────────────────────────────\n\n describe('lastNavDirection', () => {\n it('starts as null', () => {\n const store = createStore();\n expect(store.lastNavDirection).toBeNull();\n });\n\n it('is set to push on emitChange', () => {\n const store = createStore();\n store.emitChange();\n expect(store.lastNavDirection).toBe('push');\n });\n });\n\n // ── Concurrent / rapid-fire mutations ─────────────────────────────\n\n describe('concurrent mutations', () => {\n it('rapid-fire setters each increment version by 1', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.completeSetup();\n store.setRunPhase(RunPhase.Running);\n store.pushStatus('msg1');\n store.pushStatus('msg2');\n store.setDetectedFramework('React');\n\n expect(store.getVersion()).toBe(5);\n expect(cb).toHaveBeenCalledTimes(5);\n });\n\n it('subscriber sees consistent state during a setter call', () => {\n const store = createStore();\n const snapshots: { confirmed: boolean; version: number }[] = [];\n\n store.subscribe(() => {\n snapshots.push({\n confirmed: store.session.setupConfirmed,\n version: store.getSnapshot(),\n });\n });\n\n store.completeSetup();\n\n expect(snapshots).toEqual([{ confirmed: true, version: 1 }]);\n });\n\n it('multiple subscribers all see the same state', () => {\n const store = createStore();\n const results: number[] = [];\n\n store.subscribe(() => results.push(store.getSnapshot()));\n store.subscribe(() => results.push(store.getSnapshot()));\n store.subscribe(() => results.push(store.getSnapshot()));\n\n store.completeSetup();\n\n // All 3 subscribers should see version 1\n expect(results).toEqual([1, 1, 1]);\n });\n\n it('subscriber that mutates store during notification triggers additional notifications', () => {\n const store = createStore();\n const versions: number[] = [];\n\n // First subscriber triggers another mutation\n store.subscribe(() => {\n versions.push(store.getSnapshot());\n if (\n store.session.setupConfirmed &&\n store.session.runPhase === RunPhase.Idle\n ) {\n store.setRunPhase(RunPhase.Running);\n }\n });\n\n store.completeSetup();\n\n // Should see version 1 (from completeSetup) and version 2 (from setRunPhase)\n expect(versions).toEqual([1, 2]);\n expect(store.session.runPhase).toBe(RunPhase.Running);\n });\n\n it('interleaved overlay and session mutations are all visible', () => {\n const store = createStore();\n const screens: string[] = [];\n\n store.subscribe(() => {\n screens.push(store.currentScreen);\n });\n\n store.completeSetup(); // -> health-check\n store.pushOverlay(Overlay.SettingsOverride); // -> settings-override\n store.setCredentials({\n // -> settings-override (overlay still on top)\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.popOverlay(); // -> health-check (readinessResult still null)\n\n expect(screens).toEqual([\n Screen.HealthCheck,\n Overlay.SettingsOverride,\n Overlay.SettingsOverride,\n Screen.HealthCheck,\n ]);\n });\n\n it('unsubscribing mid-notification does not affect other subscribers', () => {\n const store = createStore();\n const log: string[] = [];\n\n store.subscribe(() => {\n log.push('sub1');\n });\n\n const unsub2 = store.subscribe(() => {\n log.push('sub2');\n });\n\n store.subscribe(() => {\n log.push('sub3');\n });\n\n store.emitChange();\n expect(log).toEqual(['sub1', 'sub2', 'sub3']);\n\n // Unsub the second listener\n unsub2();\n log.length = 0;\n store.emitChange();\n expect(log).toEqual(['sub1', 'sub3']);\n });\n });\n\n // ── Multiple subscribers ─────────────────────────────────────────\n\n describe('multiple subscribers', () => {\n it('supports many concurrent subscribers', () => {\n const store = createStore();\n const callbacks = Array.from({ length: 50 }, () => jest.fn());\n const unsubs = callbacks.map((cb) => store.subscribe(cb));\n\n store.emitChange();\n\n callbacks.forEach((cb) => expect(cb).toHaveBeenCalledTimes(1));\n\n // Unsubscribe all\n unsubs.forEach((unsub) => unsub());\n store.emitChange();\n\n // No more notifications\n callbacks.forEach((cb) => expect(cb).toHaveBeenCalledTimes(1));\n });\n\n it('double-unsubscribe is safe', () => {\n const store = createStore();\n const cb = jest.fn();\n const unsub = store.subscribe(cb);\n\n unsub();\n unsub(); // should not throw\n\n store.emitChange();\n expect(cb).not.toHaveBeenCalled();\n });\n });\n\n // ── Edge cases ───────────────────────────────────────────────────\n\n describe('edge cases', () => {\n it('setFrameworkContext overwrites existing keys', () => {\n const store = createStore();\n store.setFrameworkContext('key', 'value1');\n store.setFrameworkContext('key', 'value2');\n expect(store.session.frameworkContext['key']).toBe('value2');\n });\n\n it('setFrameworkConfig with null integration and config', () => {\n const store = createStore();\n store.setFrameworkConfig(null, null);\n expect(store.session.integration).toBeNull();\n expect(store.session.frameworkConfig).toBeNull();\n });\n\n it('pushStatus with empty string', () => {\n const store = createStore();\n store.pushStatus('');\n expect(store.statusMessages).toEqual(['']);\n });\n\n it('syncTodos with empty array clears non-completed tasks', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Pending', status: TaskStatus.Pending, done: false },\n { label: 'Done', status: TaskStatus.Completed, done: true },\n ]);\n\n store.syncTodos([]);\n\n // Only the completed task is retained\n expect(store.tasks).toEqual([\n { label: 'Done', status: TaskStatus.Completed, done: true },\n ]);\n });\n\n it('syncTodos with unknown status defaults to Pending', () => {\n const store = createStore();\n store.syncTodos([{ content: 'Task', status: '' }]);\n expect(store.tasks[0].status).toBe(TaskStatus.Pending);\n });\n\n it('updateTask with negative index is a no-op', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Task', status: TaskStatus.Pending, done: false },\n ]);\n const cb = jest.fn();\n store.subscribe(cb);\n store.updateTask(-1, true);\n expect(cb).not.toHaveBeenCalled();\n });\n\n it('popOverlay on empty stack does not crash', () => {\n const store = createStore();\n expect(() => store.popOverlay()).not.toThrow();\n expect(store.currentScreen).toBe(Screen.Intro);\n });\n\n it('screen advances to outro on RunPhase.Error too', () => {\n const store = createStore();\n store.completeSetup();\n store.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.setRunPhase(RunPhase.Error);\n // Run is \"complete\" (either Completed or Error), so we advance past it\n expect(store.currentScreen).toBe(Screen.Mcp);\n });\n\n it('completeSetup can only resolve the promise once', async () => {\n const store = createStore();\n store.completeSetup();\n store.completeSetup(); // second call — promise already resolved\n\n await store.setupComplete;\n expect(store.session.setupConfirmed).toBe(true);\n });\n\n it('version property (string) is independent from internal _version counter', () => {\n const store = createStore();\n store.version = '1.2.3';\n expect(store.version).toBe('1.2.3');\n expect(store.getVersion()).toBe(0);\n\n store.emitChange();\n expect(store.version).toBe('1.2.3');\n expect(store.getVersion()).toBe(1);\n });\n });\n\n // ── Full wizard flow simulation ──────────────────────────────────\n\n describe('full wizard flow', () => {\n it('walks through the entire wizard flow correctly', () => {\n const store = createStore();\n const screenHistory: string[] = [];\n store.subscribe(() => screenHistory.push(store.currentScreen));\n\n expect(store.currentScreen).toBe(Screen.Intro);\n\n // Step 1: Confirm setup\n store.completeSetup();\n expect(store.currentScreen).toBe(Screen.HealthCheck);\n\n // Step 2: Health check passes\n store.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n expect(store.currentScreen).toBe(Screen.Auth);\n\n // Step 3: Authenticate\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'https://app.posthog.com',\n projectId: 1,\n });\n expect(store.currentScreen).toBe(Screen.Run);\n\n // Step 4: Start and complete run\n store.setRunPhase(RunPhase.Running);\n expect(store.currentScreen).toBe(Screen.Run);\n\n store.setRunPhase(RunPhase.Completed);\n expect(store.currentScreen).toBe(Screen.Mcp);\n\n // Step 5: Complete MCP\n store.setMcpComplete();\n expect(store.currentScreen).toBe(Screen.Outro);\n\n // Verify version was bumped for each setter call\n expect(store.getVersion()).toBe(6);\n });\n });\n\n // ── setupComplete promise ────────────────────────────────────────\n\n describe('setupComplete', () => {\n it('resolves when completeSetup is called', async () => {\n const store = createStore();\n store.completeSetup();\n await store.setupComplete;\n expect(store.session.setupConfirmed).toBe(true);\n });\n\n it('is a promise that can be awaited before completeSetup is called', async () => {\n const store = createStore();\n\n let resolved = false;\n void store.setupComplete.then(() => {\n resolved = true;\n });\n\n // Not yet resolved\n await Promise.resolve(); // flush microtasks\n expect(resolved).toBe(false);\n\n store.completeSetup();\n await store.setupComplete;\n expect(resolved).toBe(true);\n });\n });\n});\n"]}
1
+ {"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../../../../src/ui/tui/__tests__/store.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n WizardStore,\n TaskStatus,\n Flow,\n Screen,\n Overlay,\n RunPhase,\n McpOutcome,\n} from '../store.js';\nimport { OutroKind, AdditionalFeature } from '../../../lib/wizard-session.js';\nimport { WizardReadiness } from '../../../lib/health-checks/readiness.js';\nimport { buildSession } from '../../../lib/wizard-session.js';\nimport { Integration } from '../../../lib/constants.js';\nimport { analytics } from '../../../utils/analytics.js';\n\njest.mock('../../../utils/analytics.js', () => ({\n analytics: {\n capture: jest.fn(),\n wizardCapture: jest.fn(),\n setTag: jest.fn(),\n shutdown: jest.fn().mockResolvedValue(undefined),\n },\n sessionProperties: jest.fn(() => ({})),\n}));\n\njest.mock('../../../lib/health-checks/readiness.js', () => ({\n evaluateWizardReadiness: jest.fn().mockResolvedValue({\n decision: 'yes',\n health: {},\n reasons: [],\n }),\n WizardReadiness: {\n Yes: 'yes',\n No: 'no',\n YesWithWarnings: 'yes-with-warnings',\n },\n SERVICE_LABELS: {},\n}));\n\nfunction createStore(flow?: Flow): WizardStore {\n return new WizardStore(flow);\n}\n\nconst wizardCaptureMock = analytics.wizardCapture as jest.Mock;\n\ndescribe('WizardStore', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n });\n // ── Construction ─────────────────────────────────────────────────\n\n describe('constructor', () => {\n it('initialises with default state', () => {\n const store = createStore();\n expect(store.version).toBe('');\n expect(store.statusMessages).toEqual([]);\n expect(store.tasks).toEqual([]);\n expect(store.session).toEqual(buildSession({}));\n });\n\n it('defaults to Wizard flow', () => {\n const store = createStore();\n expect(store.router.activeFlow).toBe(Flow.Wizard);\n });\n\n it('accepts a custom flow', () => {\n const store = createStore(Flow.McpAdd);\n expect(store.router.activeFlow).toBe(Flow.McpAdd);\n });\n\n it('starts with version 0', () => {\n const store = createStore();\n expect(store.getVersion()).toBe(0);\n expect(store.getSnapshot()).toBe(0);\n });\n });\n\n // ── Change notification ──────────────────────────────────────────\n\n describe('change notification', () => {\n it('emitChange increments version and notifies subscribers', () => {\n const store = createStore();\n const listener = jest.fn();\n store.subscribe(listener);\n\n store.emitChange();\n\n expect(store.getVersion()).toBe(1);\n expect(listener).toHaveBeenCalledTimes(1);\n });\n\n it('version increments on each emitChange', () => {\n const store = createStore();\n store.emitChange();\n store.emitChange();\n store.emitChange();\n expect(store.getVersion()).toBe(3);\n });\n });\n\n // ── React integration (subscribe / getSnapshot) ──────────────────\n\n describe('subscribe / getSnapshot', () => {\n it('subscribe registers a listener that fires on change', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.emitChange();\n expect(cb).toHaveBeenCalledTimes(1);\n });\n\n it('subscribe returns an unsubscribe function', () => {\n const store = createStore();\n const cb = jest.fn();\n const unsub = store.subscribe(cb);\n\n unsub();\n store.emitChange();\n expect(cb).not.toHaveBeenCalled();\n });\n\n it('getSnapshot returns the current version', () => {\n const store = createStore();\n expect(store.getSnapshot()).toBe(0);\n store.emitChange();\n expect(store.getSnapshot()).toBe(1);\n });\n\n it('is compatible with useSyncExternalStore contract', () => {\n const store = createStore();\n const cb = jest.fn();\n const unsub = store.subscribe(cb);\n\n const v1 = store.getSnapshot();\n store.completeSetup();\n const v2 = store.getSnapshot();\n\n expect(v2).toBeGreaterThan(v1);\n expect(cb).toHaveBeenCalled();\n unsub();\n });\n });\n\n // ── Session setters ──────────────────────────────────────────────\n\n describe('session setters', () => {\n it('completeSetup sets setupConfirmed and resolves setupComplete promise', async () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.completeSetup();\n\n expect(store.session.setupConfirmed).toBe(true);\n await store.setupComplete;\n expect(cb).toHaveBeenCalled();\n });\n\n it('setRunPhase updates session.runPhase', () => {\n const store = createStore();\n store.setRunPhase(RunPhase.Running);\n expect(store.session.runPhase).toBe(RunPhase.Running);\n });\n\n it('setCredentials updates session.credentials', () => {\n const store = createStore();\n const creds = {\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'https://app.posthog.com',\n projectId: 42,\n };\n store.setCredentials(creds);\n expect(store.session.credentials).toEqual(creds);\n });\n\n it('setFrameworkConfig updates integration and frameworkConfig', () => {\n const store = createStore();\n const integration = Integration.nextjs;\n const config = {\n metadata: { name: 'Next.js' },\n } as WizardStore['session']['frameworkConfig'];\n\n store.setFrameworkConfig(integration, config);\n\n expect(store.session.integration).toBe(integration);\n expect(store.session.frameworkConfig).toBe(config);\n });\n\n it('setDetectionComplete marks detection done', () => {\n const store = createStore();\n expect(store.session.detectionComplete).toBe(false);\n store.setDetectionComplete();\n expect(store.session.detectionComplete).toBe(true);\n });\n\n it('setDetectedFramework sets the label', () => {\n const store = createStore();\n store.setDetectedFramework('Django');\n expect(store.session.detectedFrameworkLabel).toBe('Django');\n });\n\n it('setLoginUrl sets and clears the login URL', () => {\n const store = createStore();\n store.setLoginUrl('https://example.com/auth');\n expect(store.session.loginUrl).toBe('https://example.com/auth');\n\n store.setLoginUrl(null);\n expect(store.session.loginUrl).toBeNull();\n });\n\n it('setReadinessResult sets readiness info', () => {\n const store = createStore();\n const result = {\n decision: WizardReadiness.No,\n health: {} as never,\n reasons: ['Anthropic: down'],\n };\n store.setReadinessResult(result);\n expect(store.session.readinessResult).toEqual(result);\n\n store.setReadinessResult(null);\n expect(store.session.readinessResult).toBeNull();\n });\n\n it('setMcpComplete marks MCP step done with outcome', () => {\n const store = createStore();\n expect(store.session.mcpComplete).toBe(false);\n store.setMcpComplete(McpOutcome.Installed, ['Cursor']);\n expect(store.session.mcpComplete).toBe(true);\n expect(store.session.mcpOutcome).toBe(McpOutcome.Installed);\n expect(store.session.mcpInstalledClients).toEqual(['Cursor']);\n });\n\n it('setOutroData sets outro information', () => {\n const store = createStore();\n const data = { kind: OutroKind.Success, message: 'Done!' };\n store.setOutroData(data);\n expect(store.session.outroData).toEqual(data);\n });\n\n it('setFrameworkContext sets key-value pairs', () => {\n const store = createStore();\n store.setFrameworkContext('packageManager', 'pnpm');\n expect(store.session.frameworkContext['packageManager']).toBe('pnpm');\n\n store.setFrameworkContext('srcDir', 'src');\n expect(store.session.frameworkContext['srcDir']).toBe('src');\n });\n\n it('every setter emits exactly one change event', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.completeSetup();\n store.setRunPhase(RunPhase.Running);\n store.setCredentials(null);\n store.setDetectionComplete();\n store.setDetectedFramework('React');\n store.setLoginUrl('url');\n store.setReadinessResult(null);\n store.setMcpComplete();\n store.setOutroDismissed();\n store.setSkillsComplete(true);\n store.setOutroData({ kind: OutroKind.Success });\n store.setFrameworkContext('k', 'v');\n store.setFrameworkConfig(null, null);\n\n expect(cb).toHaveBeenCalledTimes(13);\n });\n });\n\n // ── Setter analytics events ────────────────────────────────────\n\n describe('setter analytics events', () => {\n it('completeSetup fires setup confirmed event', () => {\n const store = createStore();\n store.completeSetup();\n expect(wizardCaptureMock).toHaveBeenCalledWith(\n 'setup confirmed',\n expect.any(Object),\n );\n });\n\n it('setCredentials fires auth complete event', () => {\n const store = createStore();\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 42,\n });\n expect(wizardCaptureMock).toHaveBeenCalledWith('auth complete', {\n project_id: 42,\n });\n });\n\n it('enableFeature fires feature enabled event', () => {\n const store = createStore();\n store.enableFeature(AdditionalFeature.LLM);\n expect(wizardCaptureMock).toHaveBeenCalledWith('feature enabled', {\n feature: AdditionalFeature.LLM,\n });\n });\n\n it('setMcpComplete fires mcp complete event', () => {\n const store = createStore();\n store.setMcpComplete(McpOutcome.Installed, ['Cursor', 'VS Code']);\n expect(wizardCaptureMock).toHaveBeenCalledWith(\n 'mcp complete',\n expect.objectContaining({\n mcp_outcome: McpOutcome.Installed,\n mcp_installed_clients: ['Cursor', 'VS Code'],\n }),\n );\n });\n });\n\n // ── Screen resolution (derived state) ────────────────────────────\n\n describe('currentScreen', () => {\n it('starts at intro for Wizard flow', () => {\n const store = createStore();\n expect(store.currentScreen).toBe(Screen.Intro);\n });\n\n it('advances to health check after setup confirmed', () => {\n const store = createStore();\n store.completeSetup();\n expect(store.currentScreen).toBe(Screen.HealthCheck);\n });\n\n it('advances to auth after health check passes', () => {\n const store = createStore();\n store.completeSetup();\n store.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n expect(store.currentScreen).toBe(Screen.Auth);\n });\n\n it('advances to run after credentials are set', () => {\n const store = createStore();\n store.completeSetup();\n store.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n expect(store.currentScreen).toBe(Screen.Run);\n });\n\n it('advances to mcp after run completes', () => {\n const store = createStore();\n store.completeSetup();\n store.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.setRunPhase(RunPhase.Completed);\n expect(store.currentScreen).toBe(Screen.Mcp);\n });\n\n it('advances to outro after mcp completes', () => {\n const store = createStore();\n store.completeSetup();\n store.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.setRunPhase(RunPhase.Completed);\n store.setMcpComplete();\n expect(store.currentScreen).toBe(Screen.Outro);\n });\n\n it('advances to skills after outro dismissed', () => {\n const store = createStore();\n store.completeSetup();\n store.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.setRunPhase(RunPhase.Completed);\n store.setMcpComplete();\n store.setOutroDismissed();\n expect(store.currentScreen).toBe(Screen.Skills);\n });\n\n it('starts at McpAdd for McpAdd flow', () => {\n const store = createStore(Flow.McpAdd);\n expect(store.currentScreen).toBe(Screen.McpAdd);\n });\n\n it('starts at McpRemove for McpRemove flow', () => {\n const store = createStore(Flow.McpRemove);\n expect(store.currentScreen).toBe(Screen.McpRemove);\n });\n });\n\n // ── Overlay navigation ───────────────────────────────────────────\n\n describe('overlay navigation', () => {\n it('pushOverlay shows the overlay over the current screen', () => {\n const store = createStore();\n store.pushOverlay(Overlay.SettingsOverride);\n expect(store.currentScreen).toBe(Overlay.SettingsOverride);\n });\n\n it('popOverlay returns to the underlying screen', () => {\n const store = createStore();\n store.pushOverlay(Overlay.SettingsOverride);\n store.popOverlay();\n expect(store.currentScreen).toBe(Screen.Intro);\n });\n\n it('pushOverlay emits change and increments version', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.pushOverlay(Overlay.SettingsOverride);\n\n expect(cb).toHaveBeenCalledTimes(1);\n expect(store.getVersion()).toBe(1);\n });\n\n it('popOverlay emits change and increments version', () => {\n const store = createStore();\n store.pushOverlay(Overlay.SettingsOverride);\n\n const cb = jest.fn();\n store.subscribe(cb);\n store.popOverlay();\n\n expect(cb).toHaveBeenCalledTimes(1);\n });\n\n it('pushOverlay sets direction to push', () => {\n const store = createStore();\n store.pushOverlay(Overlay.SettingsOverride);\n expect(store.lastNavDirection).toBe('push');\n });\n\n it('popOverlay sets direction to pop', () => {\n const store = createStore();\n store.pushOverlay(Overlay.SettingsOverride);\n store.popOverlay();\n expect(store.lastNavDirection).toBe('pop');\n });\n });\n\n // ── Agent observation state ──────────────────────────────────────\n\n describe('statusMessages', () => {\n it('pushStatus appends messages', () => {\n const store = createStore();\n store.pushStatus('Installing SDK...');\n store.pushStatus('Configuring...');\n expect(store.statusMessages).toEqual([\n 'Installing SDK...',\n 'Configuring...',\n ]);\n });\n\n it('pushStatus emits change', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.pushStatus('msg');\n expect(cb).toHaveBeenCalledTimes(1);\n });\n });\n\n describe('tasks', () => {\n it('setTasks replaces the task list', () => {\n const store = createStore();\n const tasks = [\n { label: 'Install SDK', status: TaskStatus.Pending, done: false },\n { label: 'Configure', status: TaskStatus.Pending, done: false },\n ];\n store.setTasks(tasks);\n expect(store.tasks).toEqual(tasks);\n });\n\n it('updateTask marks a task as done', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Install SDK', status: TaskStatus.Pending, done: false },\n ]);\n\n store.updateTask(0, true);\n\n expect(store.tasks[0].done).toBe(true);\n expect(store.tasks[0].status).toBe(TaskStatus.Completed);\n });\n\n it('updateTask marks a task as not done', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Install SDK', status: TaskStatus.Completed, done: true },\n ]);\n\n store.updateTask(0, false);\n\n expect(store.tasks[0].done).toBe(false);\n expect(store.tasks[0].status).toBe(TaskStatus.Pending);\n });\n\n it('updateTask is a no-op for out-of-bounds index', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Install SDK', status: TaskStatus.Pending, done: false },\n ]);\n\n const cb = jest.fn();\n store.subscribe(cb);\n store.updateTask(99, true);\n\n expect(cb).not.toHaveBeenCalled();\n });\n });\n\n describe('syncTodos', () => {\n it('maps incoming todos to TaskItems', () => {\n const store = createStore();\n store.syncTodos([\n { content: 'Install SDK', status: 'pending' },\n { content: 'Configure', status: 'completed' },\n ]);\n\n expect(store.tasks).toHaveLength(2);\n expect(store.tasks[0]).toEqual({\n label: 'Install SDK',\n activeForm: undefined,\n status: TaskStatus.Pending,\n done: false,\n });\n expect(store.tasks[1]).toEqual({\n label: 'Configure',\n activeForm: undefined,\n status: TaskStatus.Completed,\n done: true,\n });\n });\n\n it('retains completed tasks not in the incoming list', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Old done task', status: TaskStatus.Completed, done: true },\n { label: 'Old pending task', status: TaskStatus.Pending, done: false },\n ]);\n\n store.syncTodos([{ content: 'New task', status: 'pending' }]);\n\n // Old done task is retained, old pending task is dropped\n expect(store.tasks).toHaveLength(2);\n expect(store.tasks[0].label).toBe('Old done task');\n expect(store.tasks[1].label).toBe('New task');\n });\n\n it('does not duplicate completed tasks that appear in both', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Shared task', status: TaskStatus.Completed, done: true },\n ]);\n\n store.syncTodos([{ content: 'Shared task', status: 'completed' }]);\n\n // Should not have duplicates — incomingLabels includes \"Shared task\",\n // so the retained filter excludes it\n expect(store.tasks).toHaveLength(1);\n expect(store.tasks[0].label).toBe('Shared task');\n });\n\n it('preserves activeForm from incoming todos', () => {\n const store = createStore();\n store.syncTodos([\n {\n content: 'Installing',\n status: 'in_progress',\n activeForm: 'Installing SDK...',\n },\n ]);\n\n expect(store.tasks[0].activeForm).toBe('Installing SDK...');\n });\n\n it('emits change', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n store.syncTodos([{ content: 'task', status: 'pending' }]);\n expect(cb).toHaveBeenCalled();\n });\n });\n\n // ── Navigation direction ─────────────────────────────────────────\n\n describe('lastNavDirection', () => {\n it('starts as null', () => {\n const store = createStore();\n expect(store.lastNavDirection).toBeNull();\n });\n\n it('is set to push on emitChange', () => {\n const store = createStore();\n store.emitChange();\n expect(store.lastNavDirection).toBe('push');\n });\n });\n\n // ── Concurrent / rapid-fire mutations ─────────────────────────────\n\n describe('concurrent mutations', () => {\n it('rapid-fire setters each increment version by 1', () => {\n const store = createStore();\n const cb = jest.fn();\n store.subscribe(cb);\n\n store.completeSetup();\n store.setRunPhase(RunPhase.Running);\n store.pushStatus('msg1');\n store.pushStatus('msg2');\n store.setDetectedFramework('React');\n\n expect(store.getVersion()).toBe(5);\n expect(cb).toHaveBeenCalledTimes(5);\n });\n\n it('subscriber sees consistent state during a setter call', () => {\n const store = createStore();\n const snapshots: { confirmed: boolean; version: number }[] = [];\n\n store.subscribe(() => {\n snapshots.push({\n confirmed: store.session.setupConfirmed,\n version: store.getSnapshot(),\n });\n });\n\n store.completeSetup();\n\n expect(snapshots).toEqual([{ confirmed: true, version: 1 }]);\n });\n\n it('multiple subscribers all see the same state', () => {\n const store = createStore();\n const results: number[] = [];\n\n store.subscribe(() => results.push(store.getSnapshot()));\n store.subscribe(() => results.push(store.getSnapshot()));\n store.subscribe(() => results.push(store.getSnapshot()));\n\n store.completeSetup();\n\n // All 3 subscribers should see version 1\n expect(results).toEqual([1, 1, 1]);\n });\n\n it('subscriber that mutates store during notification triggers additional notifications', () => {\n const store = createStore();\n const versions: number[] = [];\n\n // First subscriber triggers another mutation\n store.subscribe(() => {\n versions.push(store.getSnapshot());\n if (\n store.session.setupConfirmed &&\n store.session.runPhase === RunPhase.Idle\n ) {\n store.setRunPhase(RunPhase.Running);\n }\n });\n\n store.completeSetup();\n\n // Should see version 1 (from completeSetup) and version 2 (from setRunPhase)\n expect(versions).toEqual([1, 2]);\n expect(store.session.runPhase).toBe(RunPhase.Running);\n });\n\n it('interleaved overlay and session mutations are all visible', () => {\n const store = createStore();\n const screens: string[] = [];\n\n store.subscribe(() => {\n screens.push(store.currentScreen);\n });\n\n store.completeSetup(); // -> health-check\n store.pushOverlay(Overlay.SettingsOverride); // -> settings-override\n store.setCredentials({\n // -> settings-override (overlay still on top)\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.popOverlay(); // -> health-check (readinessResult still null)\n\n expect(screens).toEqual([\n Screen.HealthCheck,\n Overlay.SettingsOverride,\n Overlay.SettingsOverride,\n Screen.HealthCheck,\n ]);\n });\n\n it('unsubscribing mid-notification does not affect other subscribers', () => {\n const store = createStore();\n const log: string[] = [];\n\n store.subscribe(() => {\n log.push('sub1');\n });\n\n const unsub2 = store.subscribe(() => {\n log.push('sub2');\n });\n\n store.subscribe(() => {\n log.push('sub3');\n });\n\n store.emitChange();\n expect(log).toEqual(['sub1', 'sub2', 'sub3']);\n\n // Unsub the second listener\n unsub2();\n log.length = 0;\n store.emitChange();\n expect(log).toEqual(['sub1', 'sub3']);\n });\n });\n\n // ── Multiple subscribers ─────────────────────────────────────────\n\n describe('multiple subscribers', () => {\n it('supports many concurrent subscribers', () => {\n const store = createStore();\n const callbacks = Array.from({ length: 50 }, () => jest.fn());\n const unsubs = callbacks.map((cb) => store.subscribe(cb));\n\n store.emitChange();\n\n callbacks.forEach((cb) => expect(cb).toHaveBeenCalledTimes(1));\n\n // Unsubscribe all\n unsubs.forEach((unsub) => unsub());\n store.emitChange();\n\n // No more notifications\n callbacks.forEach((cb) => expect(cb).toHaveBeenCalledTimes(1));\n });\n\n it('double-unsubscribe is safe', () => {\n const store = createStore();\n const cb = jest.fn();\n const unsub = store.subscribe(cb);\n\n unsub();\n unsub(); // should not throw\n\n store.emitChange();\n expect(cb).not.toHaveBeenCalled();\n });\n });\n\n // ── Edge cases ───────────────────────────────────────────────────\n\n describe('edge cases', () => {\n it('setFrameworkContext overwrites existing keys', () => {\n const store = createStore();\n store.setFrameworkContext('key', 'value1');\n store.setFrameworkContext('key', 'value2');\n expect(store.session.frameworkContext['key']).toBe('value2');\n });\n\n it('setFrameworkConfig with null integration and config', () => {\n const store = createStore();\n store.setFrameworkConfig(null, null);\n expect(store.session.integration).toBeNull();\n expect(store.session.frameworkConfig).toBeNull();\n });\n\n it('pushStatus with empty string', () => {\n const store = createStore();\n store.pushStatus('');\n expect(store.statusMessages).toEqual(['']);\n });\n\n it('syncTodos with empty array clears non-completed tasks', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Pending', status: TaskStatus.Pending, done: false },\n { label: 'Done', status: TaskStatus.Completed, done: true },\n ]);\n\n store.syncTodos([]);\n\n // Only the completed task is retained\n expect(store.tasks).toEqual([\n { label: 'Done', status: TaskStatus.Completed, done: true },\n ]);\n });\n\n it('syncTodos with unknown status defaults to Pending', () => {\n const store = createStore();\n store.syncTodos([{ content: 'Task', status: '' }]);\n expect(store.tasks[0].status).toBe(TaskStatus.Pending);\n });\n\n it('updateTask with negative index is a no-op', () => {\n const store = createStore();\n store.setTasks([\n { label: 'Task', status: TaskStatus.Pending, done: false },\n ]);\n const cb = jest.fn();\n store.subscribe(cb);\n store.updateTask(-1, true);\n expect(cb).not.toHaveBeenCalled();\n });\n\n it('popOverlay on empty stack does not crash', () => {\n const store = createStore();\n expect(() => store.popOverlay()).not.toThrow();\n expect(store.currentScreen).toBe(Screen.Intro);\n });\n\n it('screen advances to outro on RunPhase.Error too', () => {\n const store = createStore();\n store.completeSetup();\n store.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'h',\n projectId: 1,\n });\n store.setRunPhase(RunPhase.Error);\n // Run is \"complete\" (either Completed or Error), so we advance past it\n expect(store.currentScreen).toBe(Screen.Mcp);\n });\n\n it('completeSetup can only resolve the promise once', async () => {\n const store = createStore();\n store.completeSetup();\n store.completeSetup(); // second call — promise already resolved\n\n await store.setupComplete;\n expect(store.session.setupConfirmed).toBe(true);\n });\n\n it('version property (string) is independent from internal _version counter', () => {\n const store = createStore();\n store.version = '1.2.3';\n expect(store.version).toBe('1.2.3');\n expect(store.getVersion()).toBe(0);\n\n store.emitChange();\n expect(store.version).toBe('1.2.3');\n expect(store.getVersion()).toBe(1);\n });\n });\n\n // ── Full wizard flow simulation ──────────────────────────────────\n\n describe('full wizard flow', () => {\n it('walks through the entire wizard flow correctly', () => {\n const store = createStore();\n const screenHistory: string[] = [];\n store.subscribe(() => screenHistory.push(store.currentScreen));\n\n expect(store.currentScreen).toBe(Screen.Intro);\n\n // Step 1: Confirm setup\n store.completeSetup();\n expect(store.currentScreen).toBe(Screen.HealthCheck);\n\n // Step 2: Health check passes\n store.setReadinessResult({\n decision: WizardReadiness.Yes,\n health: {} as never,\n reasons: [],\n });\n expect(store.currentScreen).toBe(Screen.Auth);\n\n // Step 3: Authenticate\n store.setCredentials({\n accessToken: 'tok',\n projectApiKey: 'pk',\n host: 'https://app.posthog.com',\n projectId: 1,\n });\n expect(store.currentScreen).toBe(Screen.Run);\n\n // Step 4: Start and complete run\n store.setRunPhase(RunPhase.Running);\n expect(store.currentScreen).toBe(Screen.Run);\n\n store.setRunPhase(RunPhase.Completed);\n expect(store.currentScreen).toBe(Screen.Mcp);\n\n // Step 5: Complete MCP\n store.setMcpComplete();\n expect(store.currentScreen).toBe(Screen.Outro);\n\n // Step 6: Dismiss outro\n store.setOutroDismissed();\n expect(store.currentScreen).toBe(Screen.Skills);\n\n // Verify version was bumped for each setter call\n expect(store.getVersion()).toBe(7);\n });\n });\n\n // ── setupComplete promise ────────────────────────────────────────\n\n describe('setupComplete', () => {\n it('resolves when completeSetup is called', async () => {\n const store = createStore();\n store.completeSetup();\n await store.setupComplete;\n expect(store.session.setupConfirmed).toBe(true);\n });\n\n it('is a promise that can be awaited before completeSetup is called', async () => {\n const store = createStore();\n\n let resolved = false;\n void store.setupComplete.then(() => {\n resolved = true;\n });\n\n // Not yet resolved\n await Promise.resolve(); // flush microtasks\n expect(resolved).toBe(false);\n\n store.completeSetup();\n await store.setupComplete;\n expect(resolved).toBe(true);\n });\n });\n});\n"]}
@@ -17,6 +17,7 @@ export declare enum Screen {
17
17
  Auth = "auth",
18
18
  Run = "run",
19
19
  Mcp = "mcp",
20
+ Skills = "skills",
20
21
  Outro = "outro",
21
22
  McpAdd = "mcp-add",
22
23
  McpRemove = "mcp-remove"
@@ -20,6 +20,7 @@ export var Screen;
20
20
  Screen["Auth"] = "auth";
21
21
  Screen["Run"] = "run";
22
22
  Screen["Mcp"] = "mcp";
23
+ Screen["Skills"] = "skills";
23
24
  Screen["Outro"] = "outro";
24
25
  Screen["McpAdd"] = "mcp-add";
25
26
  Screen["McpRemove"] = "mcp-remove";
@@ -74,7 +75,11 @@ export const FLOWS = {
74
75
  screen: Screen.Mcp,
75
76
  isComplete: (s) => s.mcpComplete,
76
77
  },
77
- { screen: Screen.Outro },
78
+ {
79
+ screen: Screen.Outro,
80
+ isComplete: (s) => s.outroDismissed,
81
+ },
82
+ { screen: Screen.Skills },
78
83
  ],
79
84
  [Flow.McpAdd]: [
80
85
  {
@@ -1 +1 @@
1
- {"version":3,"file":"flows.js","sourceRoot":"","sources":["../../../../src/ui/tui/flows.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Flow pipelines — declarative screen sequences for each wizard flow.\n *\n * Owns the Screen and Flow enums (re-exported by router.ts) to avoid\n * circular imports between router ↔ flows.\n *\n * Each entry defines a screen, optional visibility predicate, and\n * optional completion predicate. The router walks the active flow\n * to resolve which screen to show.\n */\n\nimport { type WizardSession, RunPhase } from '../../lib/wizard-session.js';\nimport { WizardReadiness } from '../../lib/health-checks/readiness.js';\n\n// ── Screen + Flow enums ──────────────────────────────────────────────\n\n/** Screens that participate in linear flows */\nexport enum Screen {\n Intro = 'intro',\n HealthCheck = 'health-check',\n Setup = 'setup',\n Auth = 'auth',\n Run = 'run',\n Mcp = 'mcp',\n Outro = 'outro',\n McpAdd = 'mcp-add',\n McpRemove = 'mcp-remove',\n}\n\n/** Named flows the router can run */\nexport enum Flow {\n Wizard = 'wizard',\n McpAdd = 'mcp-add',\n McpRemove = 'mcp-remove',\n}\n\n// ── Flow definitions ─────────────────────────────────────────────────\n\nexport interface FlowEntry {\n /** Screen to show */\n screen: Screen;\n /** If provided, screen is skipped when this returns false. Omit = always show. */\n show?: (session: WizardSession) => boolean;\n /** If provided, screen is considered complete when this returns true. */\n isComplete?: (session: WizardSession) => boolean;\n}\n\n/**\n * Check if the SetupScreen is needed (unresolved framework questions).\n */\nfunction needsSetup(session: WizardSession): boolean {\n const config = session.frameworkConfig;\n if (!config?.metadata.setup?.questions) return false;\n\n return config.metadata.setup.questions.some(\n (q: { key: string }) => !(q.key in session.frameworkContext),\n );\n}\n\n/** All flow pipelines. Add new screens by appending entries. */\nexport const FLOWS: Record<Flow, FlowEntry[]> = {\n [Flow.Wizard]: [\n {\n screen: Screen.Intro,\n isComplete: (s) => s.setupConfirmed,\n },\n {\n screen: Screen.HealthCheck,\n isComplete: (s) => {\n if (!s.readinessResult) return false;\n if (s.readinessResult.decision === WizardReadiness.No)\n return s.outageDismissed;\n return true;\n },\n },\n {\n screen: Screen.Setup,\n show: needsSetup,\n isComplete: (s) => !needsSetup(s),\n },\n {\n screen: Screen.Auth,\n isComplete: (s) => s.credentials !== null,\n },\n {\n screen: Screen.Run,\n isComplete: (s) =>\n s.runPhase === RunPhase.Completed || s.runPhase === RunPhase.Error,\n },\n {\n screen: Screen.Mcp,\n isComplete: (s) => s.mcpComplete,\n },\n { screen: Screen.Outro },\n ],\n\n [Flow.McpAdd]: [\n {\n screen: Screen.McpAdd,\n isComplete: (s) => s.mcpComplete,\n },\n { screen: Screen.Outro },\n ],\n\n [Flow.McpRemove]: [\n {\n screen: Screen.McpRemove,\n isComplete: (s) => s.mcpComplete,\n },\n { screen: Screen.Outro },\n ],\n};\n"]}
1
+ {"version":3,"file":"flows.js","sourceRoot":"","sources":["../../../../src/ui/tui/flows.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Flow pipelines — declarative screen sequences for each wizard flow.\n *\n * Owns the Screen and Flow enums (re-exported by router.ts) to avoid\n * circular imports between router ↔ flows.\n *\n * Each entry defines a screen, optional visibility predicate, and\n * optional completion predicate. The router walks the active flow\n * to resolve which screen to show.\n */\n\nimport { type WizardSession, RunPhase } from '../../lib/wizard-session.js';\nimport { WizardReadiness } from '../../lib/health-checks/readiness.js';\n\n// ── Screen + Flow enums ──────────────────────────────────────────────\n\n/** Screens that participate in linear flows */\nexport enum Screen {\n Intro = 'intro',\n HealthCheck = 'health-check',\n Setup = 'setup',\n Auth = 'auth',\n Run = 'run',\n Mcp = 'mcp',\n Skills = 'skills',\n Outro = 'outro',\n McpAdd = 'mcp-add',\n McpRemove = 'mcp-remove',\n}\n\n/** Named flows the router can run */\nexport enum Flow {\n Wizard = 'wizard',\n McpAdd = 'mcp-add',\n McpRemove = 'mcp-remove',\n}\n\n// ── Flow definitions ─────────────────────────────────────────────────\n\nexport interface FlowEntry {\n /** Screen to show */\n screen: Screen;\n /** If provided, screen is skipped when this returns false. Omit = always show. */\n show?: (session: WizardSession) => boolean;\n /** If provided, screen is considered complete when this returns true. */\n isComplete?: (session: WizardSession) => boolean;\n}\n\n/**\n * Check if the SetupScreen is needed (unresolved framework questions).\n */\nfunction needsSetup(session: WizardSession): boolean {\n const config = session.frameworkConfig;\n if (!config?.metadata.setup?.questions) return false;\n\n return config.metadata.setup.questions.some(\n (q: { key: string }) => !(q.key in session.frameworkContext),\n );\n}\n\n/** All flow pipelines. Add new screens by appending entries. */\nexport const FLOWS: Record<Flow, FlowEntry[]> = {\n [Flow.Wizard]: [\n {\n screen: Screen.Intro,\n isComplete: (s) => s.setupConfirmed,\n },\n {\n screen: Screen.HealthCheck,\n isComplete: (s) => {\n if (!s.readinessResult) return false;\n if (s.readinessResult.decision === WizardReadiness.No)\n return s.outageDismissed;\n return true;\n },\n },\n {\n screen: Screen.Setup,\n show: needsSetup,\n isComplete: (s) => !needsSetup(s),\n },\n {\n screen: Screen.Auth,\n isComplete: (s) => s.credentials !== null,\n },\n {\n screen: Screen.Run,\n isComplete: (s) =>\n s.runPhase === RunPhase.Completed || s.runPhase === RunPhase.Error,\n },\n {\n screen: Screen.Mcp,\n isComplete: (s) => s.mcpComplete,\n },\n {\n screen: Screen.Outro,\n isComplete: (s) => s.outroDismissed,\n },\n { screen: Screen.Skills },\n ],\n\n [Flow.McpAdd]: [\n {\n screen: Screen.McpAdd,\n isComplete: (s) => s.mcpComplete,\n },\n { screen: Screen.Outro },\n ],\n\n [Flow.McpRemove]: [\n {\n screen: Screen.McpRemove,\n isComplete: (s) => s.mcpComplete,\n },\n { screen: Screen.Outro },\n ],\n};\n"]}
@@ -9,6 +9,7 @@ import { SetupScreen } from './screens/SetupScreen.js';
9
9
  import { AuthScreen } from './screens/AuthScreen.js';
10
10
  import { RunScreen } from './screens/RunScreen.js';
11
11
  import { McpScreen } from './screens/McpScreen.js';
12
+ import { SkillsScreen } from './screens/SkillsScreen.js';
12
13
  import { OutroScreen } from './screens/OutroScreen.js';
13
14
  import { AuthErrorScreen } from './screens/AuthErrorScreen.js';
14
15
  import { createMcpInstaller } from './services/mcp-installer.js';
@@ -31,6 +32,7 @@ export function createScreens(store, services) {
31
32
  [Screen.Auth]: _jsx(AuthScreen, { store: store }),
32
33
  [Screen.Run]: _jsx(RunScreen, { store: store }),
33
34
  [Screen.Mcp]: _jsx(McpScreen, { store: store, installer: services.mcpInstaller }),
35
+ [Screen.Skills]: _jsx(SkillsScreen, { store: store }),
34
36
  [Screen.Outro]: _jsx(OutroScreen, { store: store }),
35
37
  // Standalone MCP flows
36
38
  [Screen.McpAdd]: (_jsx(McpScreen, { store: store, installer: services.mcpInstaller, standalone: true })),
@@ -1 +1 @@
1
- {"version":3,"file":"screen-registry.js","sourceRoot":"","sources":["../../../../src/ui/tui/screen-registry.tsx"],"names":[],"mappings":";AAaA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAmB,MAAM,aAAa,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAOjE,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL,YAAY,EAAE,kBAAkB,EAAE;KACnC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,KAAkB,EAClB,QAAwB;IAExB,OAAO;QACL,WAAW;QACX,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,KAAC,sBAAsB,IAAC,KAAK,EAAE,KAAK,GAAI;QACpE,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,KAAC,qBAAqB,IAAC,KAAK,EAAE,KAAK,GAAI;QAClE,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,KAAC,kBAAkB,IAAC,KAAK,EAAE,KAAK,GAAI;QAC5D,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,KAAC,eAAe,KAAG;QAExC,cAAc;QACd,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAC,WAAW,IAAC,KAAK,EAAE,KAAK,GAAI;QAC7C,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,GAAI;QACzD,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAC,WAAW,IAAC,KAAK,EAAE,KAAK,GAAI;QAC7C,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI;QAC3C,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,GAAI;QACzC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,YAAY,GAAI;QAC3E,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAC,WAAW,IAAC,KAAK,EAAE,KAAK,GAAI;QAE7C,uBAAuB;QACvB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CACf,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,YAAY,EAAE,UAAU,SAAG,CACzE;QACD,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAClB,KAAC,SAAS,IACR,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,QAAQ,CAAC,YAAY,EAChC,IAAI,EAAC,QAAQ,EACb,UAAU,SACV,CACH;KACF,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Screen registry — maps screen names to React components.\n *\n * Adding a new screen:\n * 1. Create the component in screens/\n * 2. Add an entry here\n * 3. Add the screen name to the router flow (router.ts)\n *\n * App.tsx never needs to change.\n */\n\nimport type { ReactNode } from 'react';\nimport type { WizardStore } from './store.js';\nimport { Screen, Overlay, type ScreenName } from './router.js';\n\nimport { HealthCheckScreen } from './screens/health/HealthCheckScreen.js';\nimport { SettingsOverrideScreen } from './screens/SettingsOverrideScreen.js';\nimport { ManagedSettingsScreen } from './screens/ManagedSettingsScreen.js';\nimport { PortConflictScreen } from './screens/PortConflictScreen.js';\nimport { IntroScreen } from './screens/IntroScreen.js';\nimport { SetupScreen } from './screens/SetupScreen.js';\nimport { AuthScreen } from './screens/AuthScreen.js';\nimport { RunScreen } from './screens/RunScreen.js';\nimport { McpScreen } from './screens/McpScreen.js';\nimport { OutroScreen } from './screens/OutroScreen.js';\nimport { AuthErrorScreen } from './screens/AuthErrorScreen.js';\nimport { createMcpInstaller } from './services/mcp-installer.js';\nimport type { McpInstaller } from './services/mcp-installer.js';\n\nexport interface ScreenServices {\n mcpInstaller: McpInstaller;\n}\n\nexport function createServices(): ScreenServices {\n return {\n mcpInstaller: createMcpInstaller(),\n };\n}\n\nexport function createScreens(\n store: WizardStore,\n services: ScreenServices,\n): Record<ScreenName, ReactNode> {\n return {\n // Overlays\n [Overlay.SettingsOverride]: <SettingsOverrideScreen store={store} />,\n [Overlay.ManagedSettings]: <ManagedSettingsScreen store={store} />,\n [Overlay.PortConflict]: <PortConflictScreen store={store} />,\n [Overlay.AuthError]: <AuthErrorScreen />,\n\n // Wizard flow\n [Screen.Intro]: <IntroScreen store={store} />,\n [Screen.HealthCheck]: <HealthCheckScreen store={store} />,\n [Screen.Setup]: <SetupScreen store={store} />,\n [Screen.Auth]: <AuthScreen store={store} />,\n [Screen.Run]: <RunScreen store={store} />,\n [Screen.Mcp]: <McpScreen store={store} installer={services.mcpInstaller} />,\n [Screen.Outro]: <OutroScreen store={store} />,\n\n // Standalone MCP flows\n [Screen.McpAdd]: (\n <McpScreen store={store} installer={services.mcpInstaller} standalone />\n ),\n [Screen.McpRemove]: (\n <McpScreen\n store={store}\n installer={services.mcpInstaller}\n mode=\"remove\"\n standalone\n />\n ),\n };\n}\n"]}
1
+ {"version":3,"file":"screen-registry.js","sourceRoot":"","sources":["../../../../src/ui/tui/screen-registry.tsx"],"names":[],"mappings":";AAaA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAmB,MAAM,aAAa,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAOjE,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL,YAAY,EAAE,kBAAkB,EAAE;KACnC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,KAAkB,EAClB,QAAwB;IAExB,OAAO;QACL,WAAW;QACX,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,KAAC,sBAAsB,IAAC,KAAK,EAAE,KAAK,GAAI;QACpE,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,KAAC,qBAAqB,IAAC,KAAK,EAAE,KAAK,GAAI;QAClE,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,KAAC,kBAAkB,IAAC,KAAK,EAAE,KAAK,GAAI;QAC5D,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,KAAC,eAAe,KAAG;QAExC,cAAc;QACd,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAC,WAAW,IAAC,KAAK,EAAE,KAAK,GAAI;QAC7C,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,GAAI;QACzD,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAC,WAAW,IAAC,KAAK,EAAE,KAAK,GAAI;QAC7C,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI;QAC3C,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,GAAI;QACzC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,YAAY,GAAI;QAC3E,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,GAAI;QAC/C,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAC,WAAW,IAAC,KAAK,EAAE,KAAK,GAAI;QAE7C,uBAAuB;QACvB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CACf,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,YAAY,EAAE,UAAU,SAAG,CACzE;QACD,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAClB,KAAC,SAAS,IACR,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,QAAQ,CAAC,YAAY,EAChC,IAAI,EAAC,QAAQ,EACb,UAAU,SACV,CACH;KACF,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Screen registry — maps screen names to React components.\n *\n * Adding a new screen:\n * 1. Create the component in screens/\n * 2. Add an entry here\n * 3. Add the screen name to the router flow (router.ts)\n *\n * App.tsx never needs to change.\n */\n\nimport type { ReactNode } from 'react';\nimport type { WizardStore } from './store.js';\nimport { Screen, Overlay, type ScreenName } from './router.js';\n\nimport { HealthCheckScreen } from './screens/health/HealthCheckScreen.js';\nimport { SettingsOverrideScreen } from './screens/SettingsOverrideScreen.js';\nimport { ManagedSettingsScreen } from './screens/ManagedSettingsScreen.js';\nimport { PortConflictScreen } from './screens/PortConflictScreen.js';\nimport { IntroScreen } from './screens/IntroScreen.js';\nimport { SetupScreen } from './screens/SetupScreen.js';\nimport { AuthScreen } from './screens/AuthScreen.js';\nimport { RunScreen } from './screens/RunScreen.js';\nimport { McpScreen } from './screens/McpScreen.js';\nimport { SkillsScreen } from './screens/SkillsScreen.js';\nimport { OutroScreen } from './screens/OutroScreen.js';\nimport { AuthErrorScreen } from './screens/AuthErrorScreen.js';\nimport { createMcpInstaller } from './services/mcp-installer.js';\nimport type { McpInstaller } from './services/mcp-installer.js';\n\nexport interface ScreenServices {\n mcpInstaller: McpInstaller;\n}\n\nexport function createServices(): ScreenServices {\n return {\n mcpInstaller: createMcpInstaller(),\n };\n}\n\nexport function createScreens(\n store: WizardStore,\n services: ScreenServices,\n): Record<ScreenName, ReactNode> {\n return {\n // Overlays\n [Overlay.SettingsOverride]: <SettingsOverrideScreen store={store} />,\n [Overlay.ManagedSettings]: <ManagedSettingsScreen store={store} />,\n [Overlay.PortConflict]: <PortConflictScreen store={store} />,\n [Overlay.AuthError]: <AuthErrorScreen />,\n\n // Wizard flow\n [Screen.Intro]: <IntroScreen store={store} />,\n [Screen.HealthCheck]: <HealthCheckScreen store={store} />,\n [Screen.Setup]: <SetupScreen store={store} />,\n [Screen.Auth]: <AuthScreen store={store} />,\n [Screen.Run]: <RunScreen store={store} />,\n [Screen.Mcp]: <McpScreen store={store} installer={services.mcpInstaller} />,\n [Screen.Skills]: <SkillsScreen store={store} />,\n [Screen.Outro]: <OutroScreen store={store} />,\n\n // Standalone MCP flows\n [Screen.McpAdd]: (\n <McpScreen store={store} installer={services.mcpInstaller} standalone />\n ),\n [Screen.McpRemove]: (\n <McpScreen\n store={store}\n installer={services.mcpInstaller}\n mode=\"remove\"\n standalone\n />\n ),\n };\n}\n"]}
@@ -11,12 +11,12 @@ import { Colors } from '../styles.js';
11
11
  export const OutroScreen = ({ store }) => {
12
12
  useSyncExternalStore((cb) => store.subscribe(cb), () => store.getSnapshot());
13
13
  useInput(() => {
14
- process.exit(0);
14
+ store.setOutroDismissed();
15
15
  });
16
16
  const outroData = store.session.outroData;
17
17
  if (!outroData) {
18
18
  return (_jsx(Box, { flexDirection: "column", flexGrow: 1, children: _jsx(Text, { dimColor: true, children: "Finishing up..." }) }));
19
19
  }
20
- return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [outroData.kind === OutroKind.Success && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: "green", bold: true, children: ['\u2714', " Successfully installed PostHog!"] }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { children: ["Check ", _jsx(Text, { bold: true, children: "./posthog-setup-report.md" }), " for details about your integration"] }) }), outroData.changes && outroData.changes.length > 0 && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: "cyan", bold: true, children: "What the agent did:" }), outroData.changes.map((change, i) => (_jsxs(Text, { children: ['\u2022', " ", change] }, i)))] })), store.eventPlan.length > 0 && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: "cyan", bold: true, children: "Events added:" }), store.eventPlan.map((event) => (_jsxs(Text, { children: ['\u2022', " ", _jsx(Text, { bold: true, children: event.name }), _jsxs(Text, { dimColor: true, children: [" ", event.description] })] }, event.name)))] })), outroData.docsUrl && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { children: ["Learn more: ", _jsx(Text, { color: "cyan", children: outroData.docsUrl })] }) })), outroData.continueUrl && (_jsx(Box, { children: _jsxs(Text, { children: ["Continue onboarding:", ' ', _jsx(Text, { color: "cyan", children: outroData.continueUrl })] }) })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Note: This wizard uses an LLM agent to analyze and modify your project. Please review the changes made." }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: "How did this work for you? Drop us a line: wizard@posthog.com" }) })] })), outroData.kind === OutroKind.Error && (_jsx(Box, { flexDirection: "column", children: _jsxs(Text, { color: "red", bold: true, children: ['\u2718', " ", outroData.message || 'An error occurred'] }) })), outroData.kind === OutroKind.Cancel && (_jsx(Box, { flexDirection: "column", children: _jsxs(Text, { color: "yellow", children: ['\u25A0', " ", outroData.message || 'Cancelled'] }) })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.muted, children: "Press any key to exit" }) })] }));
20
+ return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [outroData.kind === OutroKind.Success && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: "green", bold: true, children: ['\u2714', " Successfully installed PostHog!"] }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { children: ["Check ", _jsx(Text, { bold: true, children: "./posthog-setup-report.md" }), " for details about your integration"] }) }), outroData.changes && outroData.changes.length > 0 && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: "cyan", bold: true, children: "What the agent did:" }), outroData.changes.map((change, i) => (_jsxs(Text, { children: ['\u2022', " ", change] }, i)))] })), store.eventPlan.length > 0 && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: "cyan", bold: true, children: "Events added:" }), store.eventPlan.map((event) => (_jsxs(Text, { children: ['\u2022', " ", _jsx(Text, { bold: true, children: event.name }), _jsxs(Text, { dimColor: true, children: [" ", event.description] })] }, event.name)))] })), outroData.docsUrl && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { children: ["Learn more: ", _jsx(Text, { color: "cyan", children: outroData.docsUrl })] }) })), outroData.continueUrl && (_jsx(Box, { children: _jsxs(Text, { children: ["Continue onboarding:", ' ', _jsx(Text, { color: "cyan", children: outroData.continueUrl })] }) })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Note: This wizard uses an LLM agent to analyze and modify your project. Please review the changes made." }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: "How did this work for you? Drop us a line: wizard@posthog.com" }) })] })), outroData.kind === OutroKind.Error && (_jsx(Box, { flexDirection: "column", children: _jsxs(Text, { color: "red", bold: true, children: ['\u2718', " ", outroData.message || 'An error occurred'] }) })), outroData.kind === OutroKind.Cancel && (_jsx(Box, { flexDirection: "column", children: _jsxs(Text, { color: "yellow", children: ['\u25A0', " ", outroData.message || 'Cancelled'] }) })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.muted, children: "Press any key to continue" }) })] }));
21
21
  };
22
22
  //# sourceMappingURL=OutroScreen.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OutroScreen.js","sourceRoot":"","sources":["../../../../../src/ui/tui/screens/OutroScreen.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAMtC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAE,KAAK,EAAoB,EAAE,EAAE;IACzD,oBAAoB,CAClB,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,EAC3B,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAC1B,CAAC;IAEF,QAAQ,CAAC,GAAG,EAAE;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;IAE1C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,YACrC,KAAC,IAAI,IAAC,QAAQ,sCAAuB,GACjC,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,aACpC,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,OAAO,IAAI,CACvC,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,mBACrB,QAAQ,wCACJ,EAEP,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,yBACG,KAAC,IAAI,IAAC,IAAI,gDAAiC,2CAE5C,GACH,EAEL,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CACpD,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,0CAEhB,EACN,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CACpC,MAAC,IAAI,eACF,QAAQ,OAAG,MAAM,KADT,CAAC,CAEL,CACR,CAAC,IACE,CACP,EAEA,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAC7B,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,oCAEhB,EACN,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC9B,MAAC,IAAI,eACF,QAAQ,OAAE,KAAC,IAAI,IAAC,IAAI,kBAAE,KAAK,CAAC,IAAI,GAAQ,EACzC,MAAC,IAAI,IAAC,QAAQ,wBAAG,KAAK,CAAC,WAAW,IAAQ,KAFjC,KAAK,CAAC,IAAI,CAGd,CACR,CAAC,IACE,CACP,EAEA,SAAS,CAAC,OAAO,IAAI,CACpB,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,+BACS,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,SAAS,CAAC,OAAO,GAAQ,IACpD,GACH,CACP,EAEA,SAAS,CAAC,WAAW,IAAI,CACxB,KAAC,GAAG,cACF,MAAC,IAAI,uCACkB,GAAG,EACxB,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,SAAS,CAAC,WAAW,GAAQ,IAC5C,GACH,CACP,EAED,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,QAAQ,8HAGP,GACH,EACN,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,QAAQ,oFAEP,GACH,IACF,CACP,EAEA,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,KAAK,IAAI,CACrC,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACzB,MAAC,IAAI,IAAC,KAAK,EAAC,KAAK,EAAC,IAAI,mBACnB,QAAQ,OAAG,SAAS,CAAC,OAAO,IAAI,mBAAmB,IAC/C,GACH,CACP,EAEA,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM,IAAI,CACtC,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACzB,MAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,aACjB,QAAQ,OAAG,SAAS,CAAC,OAAO,IAAI,WAAW,IACvC,GACH,CACP,EAED,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,sCAA8B,GACnD,IACF,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/**\n * OutroScreen — Summary after the agent run.\n * Reads store.session.outroData to render success, error, or cancel view.\n * Keeps the process alive until the user presses a key to exit.\n */\n\nimport { Box, Text, useInput } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '../store.js';\nimport { OutroKind } from '../../../lib/wizard-session.js';\nimport { Colors } from '../styles.js';\n\ninterface OutroScreenProps {\n store: WizardStore;\n}\n\nexport const OutroScreen = ({ store }: OutroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n useInput(() => {\n process.exit(0);\n });\n\n const outroData = store.session.outroData;\n\n if (!outroData) {\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text dimColor>Finishing up...</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n {outroData.kind === OutroKind.Success && (\n <Box flexDirection=\"column\">\n <Text color=\"green\" bold>\n {'\\u2714'} Successfully installed PostHog!\n </Text>\n\n <Box marginTop={1}>\n <Text>\n Check <Text bold>./posthog-setup-report.md</Text> for details\n about your integration\n </Text>\n </Box>\n\n {outroData.changes && outroData.changes.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"cyan\" bold>\n What the agent did:\n </Text>\n {outroData.changes.map((change, i) => (\n <Text key={i}>\n {'\\u2022'} {change}\n </Text>\n ))}\n </Box>\n )}\n\n {store.eventPlan.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"cyan\" bold>\n Events added:\n </Text>\n {store.eventPlan.map((event) => (\n <Text key={event.name}>\n {'\\u2022'} <Text bold>{event.name}</Text>\n <Text dimColor> {event.description}</Text>\n </Text>\n ))}\n </Box>\n )}\n\n {outroData.docsUrl && (\n <Box marginTop={1}>\n <Text>\n Learn more: <Text color=\"cyan\">{outroData.docsUrl}</Text>\n </Text>\n </Box>\n )}\n\n {outroData.continueUrl && (\n <Box>\n <Text>\n Continue onboarding:{' '}\n <Text color=\"cyan\">{outroData.continueUrl}</Text>\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text dimColor>\n Note: This wizard uses an LLM agent to analyze and modify your\n project. Please review the changes made.\n </Text>\n </Box>\n <Box>\n <Text dimColor>\n How did this work for you? Drop us a line: wizard@posthog.com\n </Text>\n </Box>\n </Box>\n )}\n\n {outroData.kind === OutroKind.Error && (\n <Box flexDirection=\"column\">\n <Text color=\"red\" bold>\n {'\\u2718'} {outroData.message || 'An error occurred'}\n </Text>\n </Box>\n )}\n\n {outroData.kind === OutroKind.Cancel && (\n <Box flexDirection=\"column\">\n <Text color=\"yellow\">\n {'\\u25A0'} {outroData.message || 'Cancelled'}\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={Colors.muted}>Press any key to exit</Text>\n </Box>\n </Box>\n );\n};\n"]}
1
+ {"version":3,"file":"OutroScreen.js","sourceRoot":"","sources":["../../../../../src/ui/tui/screens/OutroScreen.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * OutroScreen — Summary after the agent run.\n * Reads store.session.outroData to render success, error, or cancel view.\n * Keeps the process alive until the user presses a key to exit.\n */\n\nimport { Box, Text, useInput } from 'ink';\nimport { useSyncExternalStore } from 'react';\nimport type { WizardStore } from '../store.js';\nimport { OutroKind } from '../../../lib/wizard-session.js';\nimport { Colors } from '../styles.js';\n\ninterface OutroScreenProps {\n store: WizardStore;\n}\n\nexport const OutroScreen = ({ store }: OutroScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n useInput(() => {\n store.setOutroDismissed();\n });\n\n const outroData = store.session.outroData;\n\n if (!outroData) {\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text dimColor>Finishing up...</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n {outroData.kind === OutroKind.Success && (\n <Box flexDirection=\"column\">\n <Text color=\"green\" bold>\n {'\\u2714'} Successfully installed PostHog!\n </Text>\n\n <Box marginTop={1}>\n <Text>\n Check <Text bold>./posthog-setup-report.md</Text> for details\n about your integration\n </Text>\n </Box>\n\n {outroData.changes && outroData.changes.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"cyan\" bold>\n What the agent did:\n </Text>\n {outroData.changes.map((change, i) => (\n <Text key={i}>\n {'\\u2022'} {change}\n </Text>\n ))}\n </Box>\n )}\n\n {store.eventPlan.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"cyan\" bold>\n Events added:\n </Text>\n {store.eventPlan.map((event) => (\n <Text key={event.name}>\n {'\\u2022'} <Text bold>{event.name}</Text>\n <Text dimColor> {event.description}</Text>\n </Text>\n ))}\n </Box>\n )}\n\n {outroData.docsUrl && (\n <Box marginTop={1}>\n <Text>\n Learn more: <Text color=\"cyan\">{outroData.docsUrl}</Text>\n </Text>\n </Box>\n )}\n\n {outroData.continueUrl && (\n <Box>\n <Text>\n Continue onboarding:{' '}\n <Text color=\"cyan\">{outroData.continueUrl}</Text>\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text dimColor>\n Note: This wizard uses an LLM agent to analyze and modify your\n project. Please review the changes made.\n </Text>\n </Box>\n <Box>\n <Text dimColor>\n How did this work for you? Drop us a line: wizard@posthog.com\n </Text>\n </Box>\n </Box>\n )}\n\n {outroData.kind === OutroKind.Error && (\n <Box flexDirection=\"column\">\n <Text color=\"red\" bold>\n {'\\u2718'} {outroData.message || 'An error occurred'}\n </Text>\n </Box>\n )}\n\n {outroData.kind === OutroKind.Cancel && (\n <Box flexDirection=\"column\">\n <Text color=\"yellow\">\n {'\\u25A0'} {outroData.message || 'Cancelled'}\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={Colors.muted}>Press any key to continue</Text>\n </Box>\n </Box>\n );\n};\n"]}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * SkillsScreen — Ask whether to keep installed skills in .claude/skills/.
3
+ *
4
+ * Shown after the outro summary so users see the agent's output first,
5
+ * then decide whether to keep the skills that powered it.
6
+ *
7
+ * When done, calls store.setSkillsComplete() and exits the process.
8
+ */
9
+ import type { WizardStore } from '../store.js';
10
+ interface SkillsScreenProps {
11
+ store: WizardStore;
12
+ }
13
+ export declare const SkillsScreen: ({ store }: SkillsScreenProps) => import("react/jsx-runtime").JSX.Element;
14
+ export {};
@@ -0,0 +1,71 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * SkillsScreen — Ask whether to keep installed skills in .claude/skills/.
4
+ *
5
+ * Shown after the outro summary so users see the agent's output first,
6
+ * then decide whether to keep the skills that powered it.
7
+ *
8
+ * When done, calls store.setSkillsComplete() and exits the process.
9
+ */
10
+ import { Box, Text } from 'ink';
11
+ import { useState, useEffect } from 'react';
12
+ import { useSyncExternalStore } from 'react';
13
+ import { readdir, rm } from 'node:fs/promises';
14
+ import { join } from 'node:path';
15
+ import { ConfirmationInput } from '../primitives/index.js';
16
+ import { Colors } from '../styles.js';
17
+ import { CONTEXT_MILL_URL } from '../../../lib/constants.js';
18
+ var Phase;
19
+ (function (Phase) {
20
+ Phase["Loading"] = "loading";
21
+ Phase["Ask"] = "ask";
22
+ Phase["Removing"] = "removing";
23
+ Phase["Done"] = "done";
24
+ })(Phase || (Phase = {}));
25
+ export const SkillsScreen = ({ store }) => {
26
+ useSyncExternalStore((cb) => store.subscribe(cb), () => store.getSnapshot());
27
+ const [phase, setPhase] = useState(Phase.Loading);
28
+ const [skills, setSkills] = useState([]);
29
+ const skillsDir = join(store.session.installDir, '.claude', 'skills');
30
+ useEffect(() => {
31
+ void (async () => {
32
+ try {
33
+ const entries = await readdir(skillsDir, { withFileTypes: true });
34
+ const dirs = entries.filter((e) => e.isDirectory());
35
+ const result = [];
36
+ for (const dir of dirs) {
37
+ const children = await readdir(join(skillsDir, dir.name));
38
+ result.push({ name: dir.name, children });
39
+ }
40
+ if (result.length === 0) {
41
+ store.setSkillsComplete(true);
42
+ process.exit(0);
43
+ }
44
+ setSkills(result);
45
+ setPhase(Phase.Ask);
46
+ }
47
+ catch {
48
+ store.setSkillsComplete(true);
49
+ process.exit(0);
50
+ }
51
+ })();
52
+ }, []); // eslint-disable-line
53
+ const handleKeep = () => {
54
+ store.setSkillsComplete(true);
55
+ process.exit(0);
56
+ };
57
+ const handleRemove = async () => {
58
+ setPhase(Phase.Removing);
59
+ try {
60
+ await rm(skillsDir, { recursive: true, force: true });
61
+ }
62
+ catch {
63
+ // Best-effort removal
64
+ }
65
+ setPhase(Phase.Done);
66
+ store.setSkillsComplete(false);
67
+ process.exit(0);
68
+ };
69
+ return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsx(Text, { bold: true, color: Colors.accent, children: "Keep the skills?" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [phase === Phase.Loading && (_jsx(Text, { dimColor: true, children: "Checking installed skills..." })), phase === Phase.Ask && (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: "The wizard installed open-source skills that help AI coding agents integrate PostHog into your project:" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", marginLeft: 2, children: [_jsx(Text, { dimColor: true, children: ".claude/" }), _jsx(Text, { dimColor: true, children: " skills/" }), skills.map((skill) => (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { dimColor: true, children: [" ", skill.name, "/"] }), skill.children.map((child) => (_jsxs(Text, { dimColor: true, children: [' ', child] }, child)))] }, skill.name)))] }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["Source: ", _jsx(Text, { color: "cyan", children: CONTEXT_MILL_URL })] }) }), _jsx(Box, { marginTop: 1, children: _jsx(ConfirmationInput, { message: "Keep the installed skills?", confirmLabel: "Keep [Enter]", cancelLabel: "Remove [Esc]", onConfirm: handleKeep, onCancel: () => void handleRemove() }) })] })), phase === Phase.Removing && _jsx(Text, { dimColor: true, children: "Removing skills..." }), phase === Phase.Done && _jsx(Text, { dimColor: true, children: "Skills removed." })] })] }));
70
+ };
71
+ //# sourceMappingURL=SkillsScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillsScreen.js","sourceRoot":"","sources":["../../../../../src/ui/tui/screens/SkillsScreen.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * SkillsScreen — Ask whether to keep installed skills in .claude/skills/.\n *\n * Shown after the outro summary so users see the agent's output first,\n * then decide whether to keep the skills that powered it.\n *\n * When done, calls store.setSkillsComplete() and exits the process.\n */\n\nimport { Box, Text } from 'ink';\nimport { useState, useEffect } from 'react';\nimport { useSyncExternalStore } from 'react';\nimport { readdir, rm } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { WizardStore } from '../store.js';\nimport { ConfirmationInput } from '../primitives/index.js';\nimport { Colors } from '../styles.js';\nimport { CONTEXT_MILL_URL } from '../../../lib/constants.js';\n\ninterface SkillsScreenProps {\n store: WizardStore;\n}\n\ninterface SkillEntry {\n name: string;\n children: string[];\n}\n\nenum Phase {\n Loading = 'loading',\n Ask = 'ask',\n Removing = 'removing',\n Done = 'done',\n}\n\nexport const SkillsScreen = ({ store }: SkillsScreenProps) => {\n useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getSnapshot(),\n );\n\n const [phase, setPhase] = useState<Phase>(Phase.Loading);\n const [skills, setSkills] = useState<SkillEntry[]>([]);\n\n const skillsDir = join(store.session.installDir, '.claude', 'skills');\n\n useEffect(() => {\n void (async () => {\n try {\n const entries = await readdir(skillsDir, { withFileTypes: true });\n const dirs = entries.filter((e) => e.isDirectory());\n const result: SkillEntry[] = [];\n for (const dir of dirs) {\n const children = await readdir(join(skillsDir, dir.name));\n result.push({ name: dir.name, children });\n }\n if (result.length === 0) {\n store.setSkillsComplete(true);\n process.exit(0);\n }\n setSkills(result);\n setPhase(Phase.Ask);\n } catch {\n store.setSkillsComplete(true);\n process.exit(0);\n }\n })();\n }, []); // eslint-disable-line\n\n const handleKeep = () => {\n store.setSkillsComplete(true);\n process.exit(0);\n };\n\n const handleRemove = async () => {\n setPhase(Phase.Removing);\n try {\n await rm(skillsDir, { recursive: true, force: true });\n } catch {\n // Best-effort removal\n }\n setPhase(Phase.Done);\n store.setSkillsComplete(false);\n process.exit(0);\n };\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text bold color={Colors.accent}>\n Keep the skills?\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n {phase === Phase.Loading && (\n <Text dimColor>Checking installed skills...</Text>\n )}\n\n {phase === Phase.Ask && (\n <>\n <Text dimColor>\n The wizard installed open-source skills that help AI coding agents\n integrate PostHog into your project:\n </Text>\n <Box marginTop={1} flexDirection=\"column\" marginLeft={2}>\n <Text dimColor>.claude/</Text>\n <Text dimColor> skills/</Text>\n {skills.map((skill) => (\n <Box key={skill.name} flexDirection=\"column\">\n <Text dimColor> {skill.name}/</Text>\n {skill.children.map((child) => (\n <Text key={child} dimColor>\n {' '}\n {child}\n </Text>\n ))}\n </Box>\n ))}\n </Box>\n <Box marginTop={1}>\n <Text dimColor>\n Source: <Text color=\"cyan\">{CONTEXT_MILL_URL}</Text>\n </Text>\n </Box>\n <Box marginTop={1}>\n <ConfirmationInput\n message=\"Keep the installed skills?\"\n confirmLabel=\"Keep [Enter]\"\n cancelLabel=\"Remove [Esc]\"\n onConfirm={handleKeep}\n onCancel={() => void handleRemove()}\n />\n </Box>\n </>\n )}\n\n {phase === Phase.Removing && <Text dimColor>Removing skills...</Text>}\n\n {phase === Phase.Done && <Text dimColor>Skills removed.</Text>}\n </Box>\n </Box>\n );\n};\n"]}
@@ -118,6 +118,8 @@ export declare class WizardStore {
118
118
  */
119
119
  enableFeature(feature: AdditionalFeature): void;
120
120
  setMcpComplete(outcome?: McpOutcome, installedClients?: string[]): void;
121
+ setSkillsComplete(kept: boolean): void;
122
+ setOutroDismissed(): void;
121
123
  setOutroData(data: OutroData): void;
122
124
  setFrameworkContext(key: string, value: unknown): void;
123
125
  /**