- Split monolithic app.tsx into composable components: - TopBar: connection indicator (●/○), gateway URL, model name, conversation ID - BottomBar: cwd, git branch, token usage - MessageList: timestamped messages, tool call indicators, thinking display - InputBar: context-aware prompt with streaming/disconnect states - Extract socket logic into useSocket hook with typed events - Extract git/cwd info into useGitInfo hook - Quiet disconnect: single indicator instead of error flood - Add @mosaic/types dependency for typed Socket.IO events - Add PRD and task tracking docs Tasks: TUI-001 through TUI-007 (Wave 1)
30 lines
651 B
TypeScript
30 lines
651 B
TypeScript
import { useState, useEffect } from 'react';
|
|
import { execSync } from 'node:child_process';
|
|
|
|
export interface GitInfo {
|
|
branch: string | null;
|
|
cwd: string;
|
|
}
|
|
|
|
export function useGitInfo(): GitInfo {
|
|
const [info, setInfo] = useState<GitInfo>({
|
|
branch: null,
|
|
cwd: process.cwd(),
|
|
});
|
|
|
|
useEffect(() => {
|
|
try {
|
|
const branch = execSync('git rev-parse --abbrev-ref HEAD', {
|
|
encoding: 'utf-8',
|
|
timeout: 3000,
|
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
}).trim();
|
|
setInfo({ branch, cwd: process.cwd() });
|
|
} catch {
|
|
setInfo({ branch: null, cwd: process.cwd() });
|
|
}
|
|
}, []);
|
|
|
|
return info;
|
|
}
|