diff options
Diffstat (limited to 'Omni/Task')
| -rw-r--r-- | Omni/Task/Core.hs | 45 |
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 <> "]" |
