From 95d6a725f598ab8bb299ff2287b8dcd756e17560 Mon Sep 17 00:00:00 2001 From: Amolith Date: Wed, 18 Mar 2026 23:03:02 -0600 Subject: [PATCH] Default list to open and in-progress tasks --- src/cli.rs | 4 ++++ src/cmd/list.rs | 4 ++++ src/cmd/mod.rs | 2 ++ tests/cli_list_show.rs | 31 +++++++++++++++++++++++++++++++ 4 files changed, 41 insertions(+) diff --git a/src/cli.rs b/src/cli.rs index 2951db2e675151ee4a3586c45b40046099242b1c..b7916dc8d840678e64f460b87d7e4d174a389c49 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -72,6 +72,10 @@ pub enum Command { /// Filter by label #[arg(short, long)] label: Option, + + /// Show all tasks including closed + #[arg(short, long)] + all: bool, }, /// Show task details diff --git a/src/cmd/list.rs b/src/cmd/list.rs index 9cb26e0bd99d4cc3560dcc6a33dd453085123df8..9a6f5723f2d88f8cf5ceefbd8c3c219d285745f9 100644 --- a/src/cmd/list.rs +++ b/src/cmd/list.rs @@ -13,6 +13,7 @@ pub fn run( priority: Option, effort: Option, label: Option<&str>, + all: bool, json: bool, ) -> Result<()> { let store = db::open(root)?; @@ -21,6 +22,9 @@ pub fn run( if let Some(s) = status { let parsed = Status::parse(s)?; tasks.retain(|t| t.status == parsed); + } else if !all { + // By default, show open and in-progress tasks but not closed. + tasks.retain(|t| t.status == Status::Open || t.status == Status::InProgress); } if let Some(p) = priority { tasks.retain(|t| t.priority == p); diff --git a/src/cmd/mod.rs b/src/cmd/mod.rs index a169f7c1463539c24f70c26eb5838afc5b3484b1..7e12927197c29cbc0c0ff4e08a8ddc76bc18534a 100644 --- a/src/cmd/mod.rs +++ b/src/cmd/mod.rs @@ -66,6 +66,7 @@ pub fn dispatch(cli: &Cli) -> Result<()> { priority, effort, label, + all, } => { let root = require_root()?; let pri = priority.as_deref().map(Priority::parse).transpose()?; @@ -76,6 +77,7 @@ pub fn dispatch(cli: &Cli) -> Result<()> { pri, eff, label.as_deref(), + *all, cli.json, ) } diff --git a/tests/cli_list_show.rs b/tests/cli_list_show.rs index ae21c324c49c99a959ada2eecc468e58aef1c434..ec7150280743fc22e64ed6408796f282eb5914e6 100644 --- a/tests/cli_list_show.rs +++ b/tests/cli_list_show.rs @@ -77,6 +77,37 @@ fn list_filter_by_status() { assert_eq!(v.as_array().unwrap().len(), 0); } +#[test] +fn list_hides_closed_by_default() { + let tmp = init_tmp(); + let id = create_task(&tmp, "Will close"); + + td(&tmp) + .args(["done", &id]) + .current_dir(&tmp) + .assert() + .success(); + + // Default list should not show the closed task. + let out = td(&tmp) + .args(["--json", "list"]) + .current_dir(&tmp) + .output() + .unwrap(); + let v: serde_json::Value = serde_json::from_slice(&out.stdout).unwrap(); + assert_eq!(v.as_array().unwrap().len(), 0); + + // --all should include it. + let out = td(&tmp) + .args(["--json", "list", "--all"]) + .current_dir(&tmp) + .output() + .unwrap(); + let v: serde_json::Value = serde_json::from_slice(&out.stdout).unwrap(); + assert_eq!(v.as_array().unwrap().len(), 1); + assert_eq!(v[0]["title"].as_str().unwrap(), "Will close"); +} + #[test] fn list_filter_by_priority() { let tmp = init_tmp();