summaryrefslogtreecommitdiff
path: root/Omni
diff options
context:
space:
mode:
Diffstat (limited to 'Omni')
-rw-r--r--Omni/Task.hs28
-rw-r--r--Omni/Task/Core.hs9
2 files changed, 31 insertions, 6 deletions
diff --git a/Omni/Task.hs b/Omni/Task.hs
index 12842db..8abf551 100644
--- a/Omni/Task.hs
+++ b/Omni/Task.hs
@@ -4,6 +4,7 @@
{-# LANGUAGE NoImplicitPrelude #-}
-- : out task
+-- : modified by benign worker
module Omni.Task where
import Alpha
@@ -79,8 +80,8 @@ Options:
--title=<title> Task title
--type=<type> Task type: epic or task
--parent=<id> Parent epic ID
- --priority=<p> Priority: 0-4 (0=critical, 4=backlog)
- --status=<status> Task status (open, in-progress, review, done)
+ --priority=<p> Priority: 0-4 (0=critical, 4=backlog, default: 2)
+ --status=<status> Filter by status: open, in-progress, review, approved, done
--epic=<id> Filter stats by epic (recursive)
--deps=<ids> Comma-separated list of dependency IDs
--dep-type=<type> Dependency type: blocks, discovered-from, parent-child, related
@@ -95,7 +96,7 @@ Options:
Arguments:
<title> Task title
<id> Task ID
- <status> Task status (open, in-progress, review, done)
+ <status> Task status (open, in-progress, review, approved, done)
<file> JSONL file to import
|]
@@ -255,8 +256,9 @@ move args
Just "open" -> pure <| Just Open
Just "in-progress" -> pure <| Just InProgress
Just "review" -> pure <| Just Review
+ Just "approved" -> pure <| Just Approved
Just "done" -> pure <| Just Done
- Just other -> panic <| "Invalid status: " <> T.pack other <> ". Use: open, in-progress, review, or done"
+ Just other -> panic <| "Invalid status: " <> T.pack other <> ". Use: open, in-progress, review, approved, or done"
maybeNamespace <- case Cli.getArg args (Cli.longOption "namespace") of
Nothing -> pure Nothing
Just ns -> do
@@ -306,8 +308,9 @@ move args
"open" -> Open
"in-progress" -> InProgress
"review" -> Review
+ "approved" -> Approved
"done" -> Done
- _ -> panic "Invalid status. Use: open, in-progress, review, or done"
+ _ -> panic "Invalid status. Use: open, in-progress, review, approved, or done"
updateTaskStatus tid newStatus deps
if isJsonMode args
@@ -665,6 +668,13 @@ cliTests =
Right args -> do
args `Cli.has` Cli.command "list" Test.@?= True
Cli.getArg args (Cli.longOption "status") Test.@?= Just "open",
+ Test.unit "list with --status=approved filter" <| do
+ let result = Docopt.parseArgs help ["list", "--status=approved"]
+ case result of
+ Left err -> Test.assertFailure <| "Failed to parse 'list --status=approved': " <> show err
+ Right args -> do
+ args `Cli.has` Cli.command "list" Test.@?= True
+ Cli.getArg args (Cli.longOption "status") Test.@?= Just "approved",
Test.unit "ready command" <| do
let result = Docopt.parseArgs help ["ready"]
case result of
@@ -685,6 +695,14 @@ cliTests =
args `Cli.has` Cli.command "update" Test.@?= True
Cli.getArg args (Cli.argument "id") Test.@?= Just "t-abc123"
Cli.getArg args (Cli.argument "status") Test.@?= Just "done",
+ Test.unit "update command with approved" <| do
+ let result = Docopt.parseArgs help ["update", "t-abc123", "approved"]
+ case result of
+ Left err -> Test.assertFailure <| "Failed to parse 'update ... approved': " <> show err
+ Right args -> do
+ args `Cli.has` Cli.command "update" Test.@?= True
+ Cli.getArg args (Cli.argument "id") Test.@?= Just "t-abc123"
+ Cli.getArg args (Cli.argument "status") Test.@?= Just "approved",
Test.unit "update with --json flag" <| do
let result = Docopt.parseArgs help ["update", "t-abc123", "done", "--json"]
case result of
diff --git a/Omni/Task/Core.hs b/Omni/Task/Core.hs
index 3de42b2..ebf5390 100644
--- a/Omni/Task/Core.hs
+++ b/Omni/Task/Core.hs
@@ -42,7 +42,7 @@ data Task = Task
data TaskType = Epic | WorkTask
deriving (Show, Eq, Generic)
-data Status = Open | InProgress | Review | Done
+data Status = Open | InProgress | Review | Approved | Done
deriving (Show, Eq, Generic)
-- Priority levels (matching beads convention)
@@ -578,6 +578,7 @@ showTaskTree maybeId = do
Open -> "[ ]"
InProgress -> "[~]"
Review -> "[?]"
+ Approved -> "[+]"
Done -> "[✓]"
coloredStatusStr = case taskType task of
@@ -586,6 +587,7 @@ showTaskTree maybeId = do
Open -> bold statusStr
InProgress -> yellow statusStr
Review -> magenta statusStr
+ Approved -> green statusStr
Done -> green statusStr
nsStr = case taskNamespace task of
@@ -645,6 +647,7 @@ printTask t = do
Open -> bold s
InProgress -> yellow s
Review -> magenta s
+ Approved -> green s
Done -> green s
coloredTitle = if taskType t == Epic then bold (taskTitle t) else taskTitle t
@@ -755,6 +758,7 @@ data TaskStats = TaskStats
openTasks :: Int,
inProgressTasks :: Int,
reviewTasks :: Int,
+ approvedTasks :: Int,
doneTasks :: Int,
totalEpics :: Int,
readyTasks :: Int,
@@ -790,6 +794,7 @@ getTaskStats maybeEpicId = do
open = length <| filter (\t -> taskStatus t == Open) tasks
inProg = length <| filter (\t -> taskStatus t == InProgress) tasks
review = length <| filter (\t -> taskStatus t == Review) tasks
+ approved = length <| filter (\t -> taskStatus t == Approved) tasks
done = length <| filter (\t -> taskStatus t == Done) tasks
epics = length <| filter (\t -> taskType t == Epic) tasks
readyCount' = readyCount
@@ -812,6 +817,7 @@ getTaskStats maybeEpicId = do
openTasks = open,
inProgressTasks = inProg,
reviewTasks = review,
+ approvedTasks = approved,
doneTasks = done,
totalEpics = epics,
readyTasks = readyCount',
@@ -839,6 +845,7 @@ showTaskStats maybeEpicId = do
putText <| " Open: " <> T.pack (show (openTasks stats))
putText <| " In Progress: " <> T.pack (show (inProgressTasks stats))
putText <| " Review: " <> T.pack (show (reviewTasks stats))
+ putText <| " Approved: " <> T.pack (show (approvedTasks stats))
putText <| " Done: " <> T.pack (show (doneTasks stats))
putText ""
putText <| "Epics: " <> T.pack (show (totalEpics stats))