KAOS/TASKS/review/T03.md
djuka 9d2c249ed1 T03: Runner — pokretanje Claude Code
- RunTask sa timeout-om, stdout/stderr capture, exit code
- buildPrompt generiše prompt za Claude CLI
- CommandBuilder interfejs za mock testiranje
- 7 runner testova — svi prolaze
- T04 premešten u done/

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 11:46:07 +00:00

92 lines
2.0 KiB
Markdown

# 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)*