- 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>
2.0 KiB
2.0 KiB
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
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) RunResultbuildPrompt(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
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
claudepokreniecho "done"— proveri RunResult polja - Timeout: pokreni
sleep 999sa 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)