# T03: Runner — pokretanje Claude Code **Kreirao:** planer **Datum:** 2026-02-20 **Agent:** coder **Model:** Sonnet **Zavisi od:** T02 ✅ --- ## Opis Pokreće Claude Code sa task promptom, prati stdout/stderr u realnom vremenu, meri vreme, čuva exit code. Koristi task loader iz T02 za čitanje taskova. ## Fajlovi za kreiranje ``` code/internal/supervisor/ ├── runner.go ← RunTask(), priprema prompt, pokreće claude CLI └── runner_test.go ← testovi sa mock komandom ``` ## Strukture ```go type RunResult struct { TaskID string StartedAt time.Time FinishedAt time.Time Duration time.Duration ExitCode int Output string // stdout Error string // stderr } ``` ## Funkcije - `RunTask(task Task, projectPath string, timeout time.Duration) RunResult` - `buildPrompt(task Task) string` — pripremi prompt za Claude Code ## Prompt format ``` Radi na KAOS projektu. Tvoj task: {ID} — {Title} Pročitaj CLAUDE.md u root-u projekta za pravila rada. {Description} Kad završiš: go build, go test, commituj sa "T{XX}: opis". ``` ## Pokretanje ```go cmd := exec.CommandContext(ctx, "claude", "--print", "--model", task.Model, "--message", prompt, ) cmd.Dir = projectPath ``` Timeout se čita iz config-a (KAOS_TIMEOUT). Context sa cancel za timeout. ## Testovi - Mock: umesto `claude` pokreni `echo "done"` — proveri RunResult polja - Timeout: pokreni `sleep 999` sa timeout 1s — proveri da se prekine, ExitCode != 0 - Output capture: pokreni komandu koja piše na stdout i stderr — proveri da su uhvaćeni - buildPrompt: proveri da sadrži task ID, title, description - Prazan task → graceful error **Napomena:** Testovi koriste mock komande (echo, sleep), ne pravi Claude CLI. ## Očekivani izlaz RunTask pokrene proces, uhvati output, meri vreme, poštuje timeout. `go test ./internal/supervisor/ -v` — svi testovi zeleni. --- ## Pitanja *(agent piše pitanja ovde, planer odgovara)* --- ## Odgovori *(planer piše odgovore ovde)*