diff --git a/cmd/supervisor/main.go b/cmd/supervisor/main.go index 1b7f875..d3d61c7 100644 --- a/cmd/supervisor/main.go +++ b/cmd/supervisor/main.go @@ -1,11 +1,66 @@ package main import ( - "fmt" + "log/slog" + "net/http" "os" + + "github.com/mathiasbq/supervisor/internal/config" + iexec "github.com/mathiasbq/supervisor/internal/exec" + "github.com/mathiasbq/supervisor/internal/mcp" + "github.com/mathiasbq/supervisor/internal/registry" + "github.com/mathiasbq/supervisor/internal/skills/tdd" ) func main() { - fmt.Fprintln(os.Stderr, "supervisor: not yet implemented") - os.Exit(1) + logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) + + cfg, err := config.Load() + if err != nil { + logger.Error("load config", "err", err) + os.Exit(1) + } + + models, err := config.LoadModels(cfg.ModelsFile) + if err != nil { + logger.Error("load models", "err", err) + os.Exit(1) + } + + systemPrompt, err := os.ReadFile(cfg.ConfigDir + "/CLAUDE.md") + if err != nil { + logger.Error("read supervisor CLAUDE.md", "path", cfg.ConfigDir+"/CLAUDE.md", "err", err) + os.Exit(1) + } + + tddPrompt, err := os.ReadFile(cfg.ConfigDir + "/tdd.md") + if err != nil { + logger.Error("read tdd.md", "path", cfg.ConfigDir+"/tdd.md", "err", err) + os.Exit(1) + } + + executor := iexec.New(iexec.Config{ + SystemPrompt: string(systemPrompt), + LiteLLMBaseURL: cfg.LiteLLMBaseURL, + LiteLLMAPIKey: cfg.LiteLLMAPIKey, + }) + + reg := registry.New() + reg.Register(tdd.New(tdd.Config{ + SystemPrompt: string(systemPrompt), + SkillPrompt: string(tddPrompt), + DefaultModel: models.Resolve("tdd", ""), + ExecutorFn: executor.Run, + })) + + srv := mcp.NewServer(reg) + mux := http.NewServeMux() + mux.Handle("/mcp", srv) + + addr := ":" + cfg.Port + logger.Info("supervisor starting", "addr", addr) + if err := http.ListenAndServe(addr, mux); err != nil { + logger.Error("server stopped", "err", err) + os.Exit(1) + } }