From c3f48a938af0b9a2f692fab2168cc549d629511c Mon Sep 17 00:00:00 2001 From: Ben Sima Date: Thu, 27 Nov 2025 22:42:20 -0500 Subject: Add Draft status for tasks not ready for jr to pickup All changes are in place. The build and tests pass. The implementation i 1. **Added `Draft` to Status enum** - First in sequence: `Draft | Open | 2. **Excluded Draft from getReadyTasks** - Uses `taskStatus t `elem` [Op 3. **CLI support** - `task update draft` works, `task list --status 4. **Display coloring** - Draft shows in gray with `[.]` indicator in tr 5. **TaskStats** - Added `draftTasks` field and display in stats output 6. **Tests** - Added unit test for draft exclusion from ready tasks and Task-Id: t-166 --- Omni/Task/Core.hs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'Omni/Task') diff --git a/Omni/Task/Core.hs b/Omni/Task/Core.hs index d15ed8e..61a2e83 100644 --- a/Omni/Task/Core.hs +++ b/Omni/Task/Core.hs @@ -44,7 +44,7 @@ data Task = Task data TaskType = Epic | WorkTask | HumanTask deriving (Show, Eq, Read, Generic) -data Status = Open | InProgress | Review | Approved | Done +data Status = Draft | Open | InProgress | Review | Approved | Done deriving (Show, Eq, Read, Generic) -- Priority levels (matching beads convention) @@ -692,7 +692,7 @@ getReadyTasks :: IO [Task] getReadyTasks = do allTasks <- loadTasks retryContexts <- getAllRetryContexts - let openTasks = filter (\t -> taskStatus t == Open || taskStatus t == InProgress) allTasks + let openTasks = filter (\t -> taskStatus t `elem` [Open, InProgress]) allTasks doneIds = map taskId <| filter (\t -> taskStatus t == Done) allTasks parentIds = mapMaybe taskParent allTasks @@ -815,6 +815,7 @@ showTaskTree maybeId = do completed = length <| filter (\t -> taskStatus t == Done) children in "[" <> T.pack (show completed) <> "/" <> T.pack (show total) <> "]" _ -> case taskStatus task of + Draft -> "[.]" Open -> "[ ]" InProgress -> "[~]" Review -> "[?]" @@ -824,6 +825,7 @@ showTaskTree maybeId = do coloredStatusStr = case taskType task of Epic -> magenta statusStr _ -> case taskStatus task of + Draft -> gray statusStr Open -> bold statusStr InProgress -> yellow statusStr Review -> magenta statusStr @@ -881,6 +883,7 @@ printTask t = do coloredStatus = let s = "[" <> T.pack (show (taskStatus t)) <> "]" in case taskStatus t of + Draft -> gray s Open -> bold s InProgress -> yellow s Review -> magenta s @@ -987,6 +990,7 @@ saveTaskToJsonl path task = do data TaskStats = TaskStats { totalTasks :: Int, + draftTasks :: Int, openTasks :: Int, inProgressTasks :: Int, reviewTasks :: Int, @@ -1021,6 +1025,7 @@ getTaskStats maybeEpicId = do tasks = targetTasks total = length tasks + draft = length <| filter (\t -> taskStatus t == Draft) tasks open = length <| filter (\t -> taskStatus t == Open) tasks inProg = length <| filter (\t -> taskStatus t == InProgress) tasks review = length <| filter (\t -> taskStatus t == Review) tasks @@ -1028,7 +1033,7 @@ getTaskStats maybeEpicId = do done = length <| filter (\t -> taskStatus t == Done) tasks epics = length <| filter (\t -> taskType t == Epic) tasks readyCount' = readyCount - blockedCount = total - readyCount' - done + blockedCount = total - readyCount' - done - draft byPriority = [ (P0, length <| filter (\t -> taskPriority t == P0) tasks), (P1, length <| filter (\t -> taskPriority t == P1) tasks), @@ -1042,6 +1047,7 @@ getTaskStats maybeEpicId = do pure TaskStats { totalTasks = total, + draftTasks = draft, openTasks = open, inProgressTasks = inProg, reviewTasks = review, @@ -1068,6 +1074,7 @@ showTaskStats maybeEpicId = do Just epicId -> putText <| "Task Statistics for Epic " <> epicId putText "" putText <| "Total tasks: " <> T.pack (show (totalTasks stats)) + putText <| " Draft: " <> T.pack (show (draftTasks stats)) putText <| " Open: " <> T.pack (show (openTasks stats)) putText <| " In Progress: " <> T.pack (show (inProgressTasks stats)) putText <| " Review: " <> T.pack (show (reviewTasks stats)) -- cgit v1.2.3