summaryrefslogtreecommitdiff
path: root/Omni/Task
diff options
context:
space:
mode:
Diffstat (limited to 'Omni/Task')
-rw-r--r--Omni/Task/Core.hs45
1 files changed, 32 insertions, 13 deletions
diff --git a/Omni/Task/Core.hs b/Omni/Task/Core.hs
index f67c076..6d9856f 100644
--- a/Omni/Task/Core.hs
+++ b/Omni/Task/Core.hs
@@ -17,7 +17,8 @@ import System.Directory (createDirectoryIfMissing, doesFileExist)
data Task = Task
{ taskId :: Text,
taskTitle :: Text,
- taskProject :: Text,
+ taskType :: TaskType,
+ taskParent :: Maybe Text, -- Parent epic ID
taskNamespace :: Maybe Text, -- Optional namespace (e.g., "Omni/Task", "Biz/Cloud")
taskStatus :: Status,
taskDependencies :: [Text], -- List of task IDs this depends on
@@ -26,9 +27,16 @@ data Task = Task
}
deriving (Show, Eq, Generic)
+data TaskType = Epic | WorkTask
+ deriving (Show, Eq, Generic)
+
data Status = Open | InProgress | Done
deriving (Show, Eq, Generic)
+instance ToJSON TaskType
+
+instance FromJSON TaskType
+
instance ToJSON Status
instance FromJSON Status
@@ -96,15 +104,16 @@ saveTask task = do
BLC.appendFile ".tasks/tasks.jsonl" (json <> "\n")
-- Create a new task
-createTask :: Text -> Text -> Maybe Text -> [Text] -> IO Task
-createTask title project namespace deps = do
+createTask :: Text -> TaskType -> Maybe Text -> Maybe Text -> [Text] -> IO Task
+createTask title taskType parent namespace deps = do
tid <- generateId
now <- getCurrentTime
let task =
Task
{ taskId = tid,
taskTitle = title,
- taskProject = project,
+ taskType = taskType,
+ taskParent = parent,
taskNamespace = namespace,
taskStatus = Open,
taskDependencies = deps,
@@ -128,13 +137,20 @@ updateTaskStatus tid newStatus = do
TIO.writeFile ".tasks/tasks.jsonl" ""
traverse_ saveTask updatedTasks
--- List tasks, optionally filtered by project
-listTasks :: Maybe Text -> IO [Task]
-listTasks maybeProject = do
+-- List tasks, optionally filtered by type or parent
+listTasks :: Maybe TaskType -> Maybe Text -> IO [Task]
+listTasks maybeType maybeParent = do
tasks <- loadTasks
- pure <| case maybeProject of
- Nothing -> tasks
- Just proj -> filter (\t -> taskProject t == proj) tasks
+ let filtered =
+ tasks
+ |> filterByType maybeType
+ |> filterByParent maybeParent
+ pure filtered
+ where
+ filterByType Nothing ts = ts
+ filterByType (Just typ) ts = filter (\t -> taskType t == typ) ts
+ filterByParent Nothing ts = ts
+ filterByParent (Just pid) ts = filter (\t -> taskParent t == Just pid) ts
-- Get ready tasks (not blocked by dependencies)
getReadyTasks :: IO [Task]
@@ -165,14 +181,17 @@ printTask t =
putText
<| taskId t
<> " ["
+ <> T.pack (show (taskType t))
+ <> "] ["
<> T.pack (show (taskStatus t))
<> "] "
<> taskTitle t
- <> " ("
- <> taskProject t
- <> ")"
+ <> parentInfo
<> namespaceInfo
where
+ parentInfo = case taskParent t of
+ Nothing -> ""
+ Just p -> " (parent: " <> p <> ")"
namespaceInfo = case taskNamespace t of
Nothing -> ""
Just ns -> " [" <> ns <> "]"