From d2fea408f5e68e55d4b0f01b74698e1a0846f7a7 Mon Sep 17 00:00:00 2001 From: Reid <61492567+reidliu41@users.noreply.github.com> Date: Fri, 8 May 2026 22:01:14 +0800 Subject: [PATCH] fix(tui): add headers to task list output ## Summary - Add explicit ID, Status, Time, and Title headers to /task list output. - Align task rows without changing task storage or execution behavior. ## Verification - GitHub CI passed: lint, version drift, ubuntu/macos/windows tests, npm wrapper smoke, GitGuardian. --- crates/tui/src/tui/subagent_routing.rs | 41 ++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/crates/tui/src/tui/subagent_routing.rs b/crates/tui/src/tui/subagent_routing.rs index b2608ea8..914f76c7 100644 --- a/crates/tui/src/tui/subagent_routing.rs +++ b/crates/tui/src/tui/subagent_routing.rs @@ -204,7 +204,8 @@ pub(super) fn format_task_list(tasks: &[TaskSummary]) -> String { let mut lines = vec![ format!("Tasks ({})", tasks.len()), - "----------------------------------------".to_string(), + "ID Status Time Title".to_string(), + "------------------------------------------------------------".to_string(), ]; for task in tasks { let duration = task @@ -212,7 +213,7 @@ pub(super) fn format_task_list(tasks: &[TaskSummary]) -> String { .map(|ms| format!("{:.2}s", ms as f64 / 1000.0)) .unwrap_or_else(|| "-".to_string()); lines.push(format!( - "{} {:9} {} {}", + "{:<13} {:<9} {:>8} {}", task.id, task_status_label(task.status), duration, @@ -332,3 +333,39 @@ fn format_task_detail(task: &TaskRecord) -> String { lines.join("\n") } + +#[cfg(test)] +mod tests { + use super::*; + use crate::task_manager::{TaskStatus, TaskSummary}; + use chrono::Utc; + + fn task_summary(id: &str, status: TaskStatus, duration_ms: Option) -> TaskSummary { + TaskSummary { + id: id.to_string(), + status, + prompt_summary: "Fix task list output".to_string(), + model: "deepseek-v4-pro".to_string(), + mode: "agent".to_string(), + created_at: Utc::now(), + started_at: None, + ended_at: None, + duration_ms, + error: None, + thread_id: None, + turn_id: None, + } + } + + #[test] + fn task_list_includes_title_header_and_time_column() { + let output = format_task_list(&[ + task_summary("task_12345678", TaskStatus::Running, None), + task_summary("task_abcdef12", TaskStatus::Completed, Some(1234)), + ]); + + assert!(output.contains("ID Status Time Title")); + assert!(output.contains("task_12345678 running - Fix task list output")); + assert!(output.contains("task_abcdef12 completed 1.23s Fix task list output")); + } +}