/** * `workflow runs` — List recent workflow runs with filters. * * @example * workflow runs * workflow runs --status failed --limit 10 --json * workflow runs --all */ import type { CliOptions } from '../utils.js'; import { printTable, printJson, formatTimestamp, formatDuration } from '../utils.js'; // --------------------------------------------------------------------------- // Stub: engine integration (not implemented yet) // --------------------------------------------------------------------------- interface RunRecord { id: string; workflowName: string; status: string; startedAt: string; duration?: number; // ms, absent if still running currentNode?: string; } async function listWorkflowRuns(_filters: { status?: string; limit?: number; all?: boolean; cwd?: string; }): Promise { throw new Error('not implemented yet: listWorkflowRuns'); } // --------------------------------------------------------------------------- // Command handler // --------------------------------------------------------------------------- export async function runsCommand( args: string[], options: CliOptions, ): Promise { // Parse --status, --limit, --all from args/options. // These are already extracted by parseArgs into options. const status = typeof (options as Record).status === 'string' ? (options as Record).status as string : undefined; const limit = typeof (options as Record).limit === 'string' ? parseInt((options as Record).limit as string, 10) : 50; const all = (options as Record).all === true; const runs = await listWorkflowRuns({ status, limit, all, cwd: options.cwd, }); if (options.json) { printJson(runs); return; } if (runs.length === 0) { console.log('No workflow runs found.'); return; } console.log(`Showing ${runs.length} run(s):`); console.log(''); printTable( runs.map((r) => ({ id: r.id, workflow: r.workflowName, status: r.status, started: formatTimestamp(new Date(r.startedAt)), duration: r.duration != null ? formatDuration(r.duration) : '-', currentNode: r.currentNode ?? '-', })), [ { header: 'ID', field: 'id', minWidth: 26 }, { header: 'Workflow', field: 'workflow', minWidth: 20 }, { header: 'Status', field: 'status', minWidth: 10 }, { header: 'Started', field: 'started', minWidth: 19 }, { header: 'Duration', field: 'duration', minWidth: 10 }, { header: 'Node', field: 'currentNode', minWidth: 15 }, ], ); }