diff options
Diffstat (limited to 'Omni')
| -rw-r--r-- | Omni/Agent.hs | 128 | ||||
| -rw-r--r-- | Omni/Jr.hs | 37 |
2 files changed, 35 insertions, 130 deletions
diff --git a/Omni/Agent.hs b/Omni/Agent.hs deleted file mode 100644 index 280d034..0000000 --- a/Omni/Agent.hs +++ /dev/null @@ -1,128 +0,0 @@ -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE QuasiQuotes #-} -{-# LANGUAGE NoImplicitPrelude #-} - --- : out agent --- : dep sqlite-simple --- : dep temporary -module Omni.Agent where - -import Alpha -import qualified Data.Text as Text -import qualified Omni.Agent.Core as Core -import qualified Omni.Agent.Log as Log -import qualified Omni.Agent.Worker as Worker -import qualified Omni.Cli as Cli -import qualified Omni.Task.Core as TaskCore -import qualified Omni.Test as Test -import qualified System.Console.Docopt as Docopt -import qualified System.Directory as Directory -import qualified System.Environment as Env -import qualified System.Exit as Exit -import System.FilePath (takeFileName) - -main :: IO () -main = Cli.main plan - -plan :: Cli.Plan () -plan = - Cli.Plan - { Cli.help = help, - Cli.move = move, - Cli.test = test, - Cli.tidy = \_ -> pure () - } - -help :: Cli.Docopt -help = - [Cli.docopt| -agent - -Usage: - agent start [<task-id>] - agent merge-driver <ours> <theirs> - agent test - agent --help - -Options: - --path=<path> Path to the worker directory [default: .] - --help Show this help -|] - -move :: Cli.Arguments -> IO () -move args - | args `Cli.has` Cli.command "start" = do - -- Always run in current directory - let path = "." - - -- Infer name from current directory - absPath <- Directory.getCurrentDirectory - let name = Text.pack (takeFileName absPath) - - let worker = - Core.Worker - { Core.workerName = name, - Core.workerPid = Nothing, - Core.workerStatus = Core.Idle, - Core.workerPath = path - } - - let taskId = fmap Text.pack (Cli.getArg args (Cli.argument "task-id")) - - Worker.start worker taskId - | args `Cli.has` Cli.command "merge-driver" = mergeDriver args - | otherwise = putStrLn (Cli.usage help) - -getArgOrExit :: Cli.Arguments -> Docopt.Option -> IO String -getArgOrExit args opt = - case Cli.getArg args opt of - Just val -> pure val - Nothing -> do - putText <| "Error: Missing required argument " <> Text.pack (show opt) - Exit.exitFailure - -mergeDriver :: Cli.Arguments -> IO () -mergeDriver args = do - ours <- getArgOrExit args (Cli.argument "ours") - theirs <- getArgOrExit args (Cli.argument "theirs") - - -- Set TASK_DB_PATH to ours (the file git provided as the current version) - -- Since we are no longer using git-tracked tasks.jsonl, this merge driver logic needs rethinking. - -- If the merge driver is called, it means git found a conflict in .tasks/tasks.jsonl, but we deleted it. - -- So this code might be dead, or we might be dealing with legacy files during a rebase. - -- For now, we'll keep the logic but be aware it's likely unused. - Env.setEnv "TASK_DB_PATH" ours - TaskCore.importTasks theirs - Exit.exitSuccess - -test :: Test.Tree -test = Test.group "Omni.Agent" [unitTests, logTests] - -logTests :: Test.Tree -logTests = - Test.group - "Log tests" - [ Test.unit "Log.emptyStatus" <| do - let s = Log.emptyStatus "worker-1" - Log.statusWorker s Test.@?= "worker-1" - Log.statusFiles s Test.@?= 0 - ] - -unitTests :: Test.Tree -unitTests = - Test.group - "Unit tests" - [ Test.unit "can parse start command" <| do - let result = Docopt.parseArgs help ["start"] - case result of - Left err -> Test.assertFailure <| "Failed to parse 'start': " <> show err - Right args -> args `Cli.has` Cli.command "start" Test.@?= True, - Test.unit "can parse start command with task id" <| do - let result = Docopt.parseArgs help ["start", "t-123"] - case result of - Left err -> Test.assertFailure <| "Failed to parse 'start t-123': " <> show err - Right args -> do - args `Cli.has` Cli.command "start" Test.@?= True - Cli.getArg args (Cli.argument "task-id") Test.@?= Just "t-123" - ] @@ -16,6 +16,8 @@ import qualified Omni.Test as Test import qualified System.Console.Docopt as Docopt import qualified System.Directory as Directory import System.Environment (withArgs) +import qualified System.Environment as Env +import qualified System.Exit as Exit import System.FilePath (takeFileName) main :: IO () @@ -38,12 +40,14 @@ jr Usage: jr task [<args>...] jr work [<task-id>] + jr merge-driver <ours> <theirs> jr test jr (-h | --help) Commands: - task Manage tasks - work Track work + task Manage tasks + work Start a worker agent on a task + merge-driver Internal git merge driver Options: -h --help Show this help @@ -73,8 +77,37 @@ move args let taskId = fmap Text.pack (Cli.getArg args (Cli.argument "task-id")) AgentWorker.start worker taskId + | args `Cli.has` Cli.command "merge-driver" = mergeDriver args | otherwise = putText (str <| Docopt.usage help) +mergeDriver :: Cli.Arguments -> IO () +mergeDriver args = do + ours <- getArgOrExit args (Cli.argument "ours") + theirs <- getArgOrExit args (Cli.argument "theirs") + + -- Set TASK_DB_PATH to ours (the file git provided as the current version) + -- Since we are no longer using git-tracked tasks.jsonl, this merge driver logic needs rethinking. + -- If the merge driver is called, it means git found a conflict in .tasks/tasks.jsonl, but we deleted it. + -- So this code might be dead, or we might be dealing with legacy files during a rebase. + -- For now, we'll keep the logic but be aware it's likely unused. + Env.setEnv "TASK_DB_PATH" ours + -- TaskCore.importTasks theirs + -- Task.importTasks theirs + + -- We need to call task import via CLI or library. + -- Omni.Task.importTasks IS NOT EXPOSED. + -- But we can call Task.main + withArgs ["import", "-i", theirs] Task.main + Exit.exitSuccess + +getArgOrExit :: Cli.Arguments -> Docopt.Option -> IO String +getArgOrExit args opt = + case Cli.getArg args opt of + Just val -> pure val + Nothing -> do + putText <| "Error: Missing required argument " <> Text.pack (show opt) + Exit.exitFailure + test :: Test.Tree test = Test.group |
