package tdd import ( "context" "encoding/json" "github.com/mathiasbq/supervisor/internal/registry" ) // CompleteFunc is the function used to call a local model. type CompleteFunc func(ctx context.Context, model, system, user string) (string, int64, error) type Config struct { SkillPrompt string CompleteFunc CompleteFunc // nil = no executor (tests that don't reach execute()) DefaultModel string SessionsDir string // optional: path to brain/sessions/ for history injection IngestBaseURL string // optional: base URL of ingestion server for brain context } type Skill struct { cfg Config } func New(cfg Config) *Skill { return &Skill{cfg: cfg} } func (s *Skill) Name() string { return "tdd" } func (s *Skill) Tools() []registry.ToolDef { schema := func(required []string, props map[string]any) json.RawMessage { b, _ := json.Marshal(map[string]any{ "type": "object", "required": required, "properties": props, }) return b } strProp := map[string]any{"type": "string"} return []registry.ToolDef{ { Name: "tdd_red", Description: "Consult a local model for help writing a failing test for the described behavior.", InputSchema: schema( []string{"project_root", "spec"}, map[string]any{ "project_root": strProp, "spec": strProp, "model": strProp, "test_cmd": strProp, }, ), }, { Name: "tdd_green", Description: "Consult a local model for implementation ideas to make the test at test_path pass.", InputSchema: schema( []string{"project_root", "test_path"}, map[string]any{ "project_root": strProp, "test_path": strProp, "model": strProp, "test_cmd": strProp, "session_id": strProp, }, ), }, { Name: "tdd_refactor", Description: "Consult a local model for refactoring suggestions for impl_path while keeping tests green.", InputSchema: schema( []string{"project_root", "test_path", "impl_path"}, map[string]any{ "project_root": strProp, "test_path": strProp, "impl_path": strProp, "model": strProp, "test_cmd": strProp, "session_id": strProp, }, ), }, } }