diff --git a/src/integrations/claude/onboarding.ts b/src/integrations/claude/onboarding.ts index 39b8951..5466bf7 100644 --- a/src/integrations/claude/onboarding.ts +++ b/src/integrations/claude/onboarding.ts @@ -1,9 +1,9 @@ import { type ChildProcess, spawn } from 'node:child_process'; import { createInterface } from 'node:readline'; import type { OnboardingOpts, OnboardingCallbacks } from '../types.js'; -import { ONBOARDING_TIMEOUT_MS, STATUS_PREFIX } from '../constants.js'; +import { ONBOARDING_TIMEOUT_MS } from '../constants.js'; import { type StreamEvent, extractTextLines } from '../stream-json.js'; -import { spawnErrorMessage } from '../utils.js'; +import { isStatusLine, normalizeStatusLine, spawnErrorMessage } from '../utils.js'; export function runOnboarding( opts: OnboardingOpts, @@ -48,12 +48,14 @@ export function runOnboarding( } for (const textLine of extractTextLines(event)) { - const stripped = textLine.trim(); - if (!stripped) continue; - allLines.push(stripped); - callbacks.onStdout(stripped); - if (stripped.startsWith(STATUS_PREFIX)) { - callbacks.onStatus(stripped.slice(STATUS_PREFIX.length)); + const line = textLine.trim(); + if (!line) continue; + + allLines.push(line); + callbacks.onStdout(line); + + if (isStatusLine(line)) { + callbacks.onStatus(normalizeStatusLine(line)); } } }); diff --git a/src/integrations/codex/onboarding.ts b/src/integrations/codex/onboarding.ts index 75aa294..fc42b33 100644 --- a/src/integrations/codex/onboarding.ts +++ b/src/integrations/codex/onboarding.ts @@ -1,8 +1,8 @@ import { type ChildProcess, spawn } from 'node:child_process'; import { createInterface } from 'node:readline'; import type { OnboardingOpts, OnboardingCallbacks } from '../types.js'; -import { ONBOARDING_TIMEOUT_MS, STATUS_PREFIX } from '../constants.js'; -import { spawnErrorMessage } from '../utils.js'; +import { ONBOARDING_TIMEOUT_MS } from '../constants.js'; +import { isStatusLine, normalizeStatusLine, spawnErrorMessage } from '../utils.js'; type CodexEvent = { type: string; @@ -56,12 +56,14 @@ export function runOnboarding( const text = event.item.text ?? ''; for (const msgLine of text.split('\n')) { - const stripped = msgLine.trim(); - if (!stripped) continue; - allLines.push(stripped); - callbacks.onStdout(stripped); - if (stripped.startsWith(STATUS_PREFIX)) { - callbacks.onStatus(stripped.slice(STATUS_PREFIX.length)); + const line = msgLine.trim(); + if (!line) continue; + + allLines.push(line); + callbacks.onStdout(line); + + if (isStatusLine(line)) { + callbacks.onStatus(normalizeStatusLine(line)); } } }); diff --git a/src/integrations/cursor/onboarding.ts b/src/integrations/cursor/onboarding.ts index 808b052..a0aa20e 100644 --- a/src/integrations/cursor/onboarding.ts +++ b/src/integrations/cursor/onboarding.ts @@ -3,7 +3,7 @@ import { createInterface } from 'node:readline'; import type { OnboardingOpts, OnboardingCallbacks } from '../types.js'; import { ONBOARDING_TIMEOUT_MS } from '../constants.js'; import { type StreamEvent, extractTextLines } from '../stream-json.js'; -import { normalizeStatusLine, spawnErrorMessage } from '../utils.js'; +import { isStatusLine, normalizeStatusLine, spawnErrorMessage } from '../utils.js'; export function runOnboarding( opts: OnboardingOpts, @@ -54,11 +54,15 @@ export function runOnboarding( } for (const textLine of extractTextLines(event)) { - const stripped = textLine.trim(); - if (!stripped) continue; - allLines.push(stripped); - callbacks.onStdout(stripped); - callbacks.onStatus(normalizeStatusLine(stripped)); + const line = textLine.trim(); + if (!line) continue; + + allLines.push(line); + callbacks.onStdout(line); + + if (isStatusLine(line)) { + callbacks.onStatus(normalizeStatusLine(line)); + } } }); diff --git a/src/integrations/index.ts b/src/integrations/index.ts index 425bea4..7f44e57 100644 --- a/src/integrations/index.ts +++ b/src/integrations/index.ts @@ -7,7 +7,7 @@ export type { } from './types.js'; export { getIntegrations, getIntegration } from './registry.js'; -export { normalizeStatusLine } from './utils.js'; +export { normalizeStatusLine, normalizeReportLine } from './utils.js'; export { launchChatSession } from './chat.js'; export { diff --git a/src/integrations/utils.ts b/src/integrations/utils.ts index 979030a..11003a3 100644 --- a/src/integrations/utils.ts +++ b/src/integrations/utils.ts @@ -1,7 +1,17 @@ import { STATUS_PREFIX } from './constants.js'; -export function normalizeStatusLine(line: string) { - return line.startsWith(STATUS_PREFIX) ? line.slice(STATUS_PREFIX.length) : line; +type StatusLine = `STATUS: ${string}`; + +export function isStatusLine(line: string): line is StatusLine { + return line.startsWith(STATUS_PREFIX); +} + +export function normalizeStatusLine(line: StatusLine) { + return line.slice(STATUS_PREFIX.length); +} + +export function normalizeReportLine(line: string) { + return isStatusLine(line) ? normalizeStatusLine(line) : line; } export function spawnErrorMessage(bin: string, err: NodeJS.ErrnoException): string { diff --git a/src/ui/tui/screens/onboard-project/useOnboardingProcess.ts b/src/ui/tui/screens/onboard-project/useOnboardingProcess.ts index 569fa12..734f74a 100644 --- a/src/ui/tui/screens/onboard-project/useOnboardingProcess.ts +++ b/src/ui/tui/screens/onboard-project/useOnboardingProcess.ts @@ -4,7 +4,7 @@ import { buildOnboardingPrompt } from '@features/onboarding/index.js'; import { detectFramework } from '@frameworks/index.js'; import type { IdeId, OnboardingGoal } from '@shared-kernel/types.js'; import { ScreenId } from '@lib/session.js'; -import { getIntegration, normalizeStatusLine } from '@integrations/index.js'; +import { getIntegration, normalizeReportLine } from '@integrations/index.js'; import { useLogger } from '../../hooks/useLog.js'; import { $session, store, isStaleSession } from '../../store.js'; import { useInitialOnboarding } from './useInitialOnboarding.js'; @@ -65,7 +65,7 @@ export function useOnboardingProcess(): OnboardingProcess { (line) => line.includes('Created') || line.includes('Modified') || line.includes('Added'), ) - .map(normalizeStatusLine) + .map(normalizeReportLine) : dryRunCodeChanges(goals), ); setPhase('done'); @@ -105,11 +105,7 @@ export function useOnboardingProcess(): OnboardingProcess { function startReal() { if (!isEmpty) addStatus(`Framework: ${fw}`); - addStatus( - isEmpty - ? 'Scaffolding sample app and integrating Confidence SDK...' - : 'Analyzing project...', - ); + addStatus(isEmpty ? 'Integrating Confidence SDK...' : 'Analyzing project...'); const ide = (s.ide ?? 'claude') as IdeId; const prompt = buildOnboardingPrompt({