import type { GitforestConfig } from "../../types/index.ts"; import { scanAllDirectories, sortProjects, filterProjects } from "../../scanner/index.ts"; import { formatProjectList, formatStatusSummary, formatStatusSummaryJson, formatDirtyRepos, formatScanning, calculateStatusSummary, } from "../formatters.ts"; /** * CLI command handlers for non-TUI usage */ export interface CLIOptions { config: GitforestConfig; filter?: string; json?: boolean; verbose?: boolean; maxDepth?: number; } /** * List all projects */ export async function listProjects(options: CLIOptions): Promise { const { config, filter, json, verbose } = options; console.log(formatScanning()); const projects = await scanAllDirectories(config); let result = sortProjects(projects, config.display.sortBy, config.display.sortDirection); if (filter) { result = filterProjects(result, filter); } console.log(formatProjectList(result, { json, verbose })); } /** * Show status summary */ export async function showStatus(options: CLIOptions): Promise { const { config, filter, json } = options; console.log(formatScanning()); const projects = await scanAllDirectories(config); let result = sortProjects(projects, "status", "desc"); if (filter) { result = filterProjects(result, filter); } const summary = calculateStatusSummary(result); if (json) { console.log(formatStatusSummaryJson(summary)); return; } console.log(formatStatusSummary(summary)); } /** * Show dirty repositories */ export async function showDirty(options: CLIOptions): Promise { const { config, json } = options; console.log(formatScanning()); const projects = await scanAllDirectories(config); const dirty = projects.filter((p) => p.status?.isDirty); console.log(formatDirtyRepos(dirty, json)); }