/** * project-scanner.ts — Descubrimiento de proyectos desde ~/.claude/projects/ * * Escanea los directorios de Claude Code, decodifica sus paths reales, * lee los HANDOFF.md y extrae métricas de progreso. */ export interface HandoffProgress { done: number; total: number; pct: number; nextTask: string | null; } export interface ProjectScanResult { path: string; name: string; encodedDir: string; hasHandoff: boolean; autoHandoff: boolean; progress: HandoffProgress; jsonlStats: JSONLStats; } export interface ModelUsage { opusTokens: number; sonnetTokens: number; haikuTokens: number; } export interface JSONLStats { session_count: number; total_cost_usd: number; total_tokens: number; last_active: number | null; modelUsage: ModelUsage; } /** * Decodifica el nombre de directorio de Claude Code al path real. * "-Users-db-Documents-GitHub-claudestat" → "/Users/db/Documents/GitHub/claudestat" * * Problema: directorios con '-' en el nombre (ej: "gmail-ai-agent") se confunden * con separadores de path. Solución: búsqueda greedy recursiva por el filesystem. */ export declare function decodeProjectDir(encodedName: string): string | null; /** * Dado un directorio base y un string con segmentos separados por '-', * encuentra el path real en disco probando cada combinación posible. * Ejemplo: base="/Users/db/Documents/GitHub", remaining="gmail-ai-agent" * → prueba "gmail" (no existe), "gmail-ai" (no existe), "gmail-ai-agent" (✓) */ export declare function findRealPath(base: string, remaining: string, depth?: number): string | null; export declare function parseHandoffProgress(content: string): HandoffProgress; /** * Lee todos los JSONL del directorio codificado de un proyecto y acumula * tokens y coste. No requiere que el daemon haya estado corriendo. */ export declare function getJSONLStats(encodedDir: string): JSONLStats; /** * Genera y escribe un HANDOFF.md mínimo para proyectos que no tienen uno. * El archivo se marca como auto-generado para que el usuario lo complete. * No sobreescribe si ya existe. */ export declare function autoCreateHandoff(projectPath: string, stats: JSONLStats): void; /** * Descubre todos los proyectos en los que se ha trabajado con Claude Code. * * Estrategia (Opción A): * 1. Para cada directorio en ~/.claude/projects/: * a. Intenta decodificar el nombre (rápido) → busca mejor raíz subiendo árbol * b. Si falla → infiere desde file paths del JSONL * 2. Agrupa por raíz de proyecto (varios dirs Claude Code → mismo repo) * 3. Para cada raíz única: lee HANDOFF, calcula progreso, suma stats JSONL */ export declare function discoverProjects(): ProjectScanResult[];