- go mod init github.com/dal/kaos - Config paket sa .env učitavanjem i validacijom - Supervisor skeleton paket - Entry point (cmd/kaos-supervisor/main.go) - Makefile (build, test, vet, clean, all) - .env.example, .gitignore - 6 config testova — svi prolaze Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
9.1 KiB
KAOS v0.1 — Implementacioni taskovi
Verzija: 0.1.0 Poslednje ažuriranje: 2026-02-20
Pregled
V0.1 cilj: supervisor koji pokreće Claude Code agente, prati izvršavanje, verifikuje rezultat, piše izveštaj. Ručno pokretanje, markdown taskovi.
T01: Inicijalizacija Go projekta
Status: pending Agent: coder Model: Sonnet Zavisi od: —
Opis:
Kreirati Go projekat u code/ folderu sa osnovnom strukturom.
Fajlovi za kreiranje:
code/
├── go.mod ← module github.com/dal/kaos
├── .env.example ← KAOS_TIMEOUT=30m
├── .gitignore ← Go defaults + .env
├── Makefile ← build, test, vet, clean
├── cmd/
│ └── kaos-supervisor/
│ └── main.go ← entry point (prazan skeleton)
├── internal/
│ ├── config/
│ │ └── config.go ← čita .env, drži config struct
│ └── supervisor/
│ └── supervisor.go ← prazan skeleton
└── CLAUDE.md ← pravila kodiranja (kopija agents/coder/CLAUDE.md)
Pravila:
go mod init github.com/dal/kaos- Go 1.22+
- Makefile targeti:
build,test,vet,clean,all - Config čita iz .env: KAOS_TIMEOUT, KAOS_PROJECT_PATH
- Svaki fajl mora imati package doc komentar
Test:
go build ./...prolazigo vet ./...prolazi- Config test: učitaj .env.example, proveri da su vrednosti popunjene
Očekivani izlaz:
Projekat se kompajlira. make build kreira binary. make test prolazi.
T02: Task loader — parsiranje markdown taskova
Status: pending Agent: coder Model: Sonnet Zavisi od: T01
Opis: Supervisor mora da čita taskove iz markdown fajla (ovog fajla). Parsira sekcije, izvlači ID, status, zavisnosti.
Fajlovi za kreiranje:
code/internal/supervisor/
├── task.go ← Task struct, LoadTasks(), FindTask(), NextTask()
└── task_test.go ← testovi sa primer markdown-om
Task struct:
type Task struct {
ID string // T01, T02...
Title string // naslov
Status string // pending, running, done, failed
Agent string // coder, checker, frontend...
Model string // Haiku, Sonnet, Opus
DependsOn []string // lista task ID-eva
Description string // ceo opis
}
Funkcije:
LoadTasks(mdPath string) ([]Task, error)— parsira markdownFindTask(tasks []Task, id string) *Task— nađi po ID-uNextTask(tasks []Task) *Task— prvi pending čije su zavisnosti doneUpdateStatus(mdPath, taskID, newStatus string) error— promeni status u fajlu
Test:
- LoadTasks sa primer markdown-om → parsira tačno
- NextTask vraća pravi task po zavisnostima
- UpdateStatus menja fajl korektno
- Edge case: nema pending taskova, cirkularna zavisnost
Očekivani izlaz:
go test ./internal/supervisor/ -v — svi testovi zeleni.
T03: Runner — pokretanje Claude Code
Status: pending 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.
Fajlovi za kreiranje:
code/internal/supervisor/
├── runner.go ← RunTask(), priprema prompt, pokreće claude CLI
└── runner_test.go ← test sa mock komandom (ne pravi claude)
Funkcije:
type RunResult struct {
TaskID string
StartedAt time.Time
FinishedAt time.Time
Duration time.Duration
ExitCode int
Output string
Error string
}
func RunTask(task Task, projectPath string, timeout time.Duration) RunResult
Prompt koji šalje Claude Code-u:
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, pushuj.
Test:
- Mock: umesto
claudepokreniecho "done"— proveri da RunResult ima tačne podatke - Timeout: pokreni
sleep 999sa timeout 1s — proveri da se prekine - Output capture: proveri da stdout/stderr su uhvaćeni
Očekivani izlaz: RunTask pokrene proces, uhvati output, meri vreme, poštuje timeout.
T04: Checker — verifikacija posle agenta
Status: pending Agent: coder Model: Sonnet Zavisi od: T01
Opis: Posle svake Claude Code sesije, nezavisno pokrene build + test + vet.
Fajlovi za kreiranje:
code/internal/supervisor/
├── checker.go ← Verify(), CheckResult struct
└── checker_test.go ← test sa privremenim Go projektom
Funkcije:
type CheckResult struct {
Name string // "build", "test", "vet"
Status string // "pass", "fail"
Output string
Duration time.Duration
TestCount int // samo za test check
}
type VerifyResult struct {
Build CheckResult
Vet CheckResult
Test CheckResult
AllPassed bool
}
func Verify(projectPath string) VerifyResult
Test:
- Napravi temp Go projekat koji prolazi — Verify vraća AllPassed=true
- Napravi temp Go projekat sa syntax error — Build fail
- Napravi temp Go projekat sa failing test — Test fail
- Proveri da TestCount parsira tačno
Očekivani izlaz: Verify pokrene tri komande, parsira rezultat, vrati struct.
T05: Reporter — pisanje izveštaja
Status: pending Agent: coder Model: Sonnet Zavisi od: T03, T04
Opis: Generiše markdown izveštaj posle izvršenog taska.
Fajlovi za kreiranje:
code/internal/supervisor/
├── reporter.go ← WriteReport()
└── reporter_test.go
Funkcije:
func WriteReport(
task Task,
run RunResult,
verify VerifyResult,
reportsDir string,
) (string, error) // vraća putanju do izveštaja
Format izveštaja:
# T{XX}: Naslov
**Datum:** 2026-02-20 10:15
**Trajanje:** 8m 45s
**Status:** ✅ Završen / ❌ Neuspešan
## Verifikacija
- ✅/❌ go build (0.3s)
- ✅/❌ go vet (0.2s)
- ✅/❌ go test (12/12 testova, 2.1s)
## Agent output
(skraćen output Claude Code sesije)
## Commit
- Hash: a1b2c3d
- Branch: main
Test:
- WriteReport sa mock podacima → fajl postoji, sadržaj tačan
- Proveri format datuma, trajanja
- Proveri da folder kreira ako ne postoji
Očekivani izlaz:
TASKS/reports/T01-report.md se generiše sa tačnim sadržajem.
T06: CLI — komandni interfejs
Status: pending Agent: coder Model: Sonnet Zavisi od: T02, T03, T04, T05
Opis: Entry point — parsira komande, poziva supervisor funkcije.
Fajlovi za izmenu:
code/cmd/kaos-supervisor/main.go ← komande
Komande:
kaos-supervisor run [TASK_ID] # pokreni task (ili sledeći ako bez ID)
kaos-supervisor status # prikaži status svih taskova
kaos-supervisor next # prikaži šta je sledeće
kaos-supervisor verify # ponovo pokreni verifikaciju
kaos-supervisor history # prikaži izvršene taskove iz reports/
Pravila:
- Bez eksternih CLI biblioteka (flag package dovoljno)
- Svaka komanda ima --help
- Formatiran terminal output (emoji za status)
- Poruke na srpskom
Test:
kaos-supervisor statussa primer taskovima → ispravan outputkaos-supervisor next→ vraća pravi task- Nepoznata komanda → help poruka
Očekivani izlaz:
make build → bin/kaos-supervisor radi sve komande.
T07: Integracija — sve zajedno
Status: pending Agent: coder Model: Sonnet Zavisi od: T06
Opis: End-to-end tok: učitaj taskove → pokreni → verifikuj → izveštaj → ažuriraj status.
Fajlovi za izmenu:
code/internal/supervisor/
├── supervisor.go ← Run() koji povezuje sve korake
└── supervisor_test.go
Funkcija:
func (s *Supervisor) Run(taskID string) error {
// 1. Učitaj taskove
// 2. Nađi task (po ID-u ili NextTask)
// 3. Proveri zavisnosti
// 4. Postavi status: running
// 5. Pokreni Claude Code (RunTask)
// 6. Verifikuj (Verify)
// 7. Napiši izveštaj (WriteReport)
// 8. Postavi status: done ili failed
// 9. Prikaži rezultat
}
Test:
- End-to-end sa mock Claude Code komandom
- Task sa neispunjenom zavisnošću → greška
- Task koji je već done → skip ili greška
- Failed verifikacija → status=failed, izveštaj navede šta palo
Očekivani izlaz:
kaos-supervisor run T01 prolazi ceo tok od učitavanja do izveštaja.
Redosled izvršavanja
T01 (Go init)
│
├── T02 (Task loader)
│ │
│ └── T03 (Runner)
│ │
│ └── T05 (Reporter) ──┐
│ │
└── T04 (Checker) ─────────────┘
│
T06 (CLI)
│
T07 (Integracija)
Quality gates:
- Posle T01:
make buildimake testprolaze - Posle T04: Verify radi na test projektu
- Posle T06: Sve komande rade iz terminala
- Posle T07: End-to-end tok radi sa mock agentom