Files
goralphy/CLAUDE.md
2026-03-04 20:54:56 +01:00

230 lines
7.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# goralphy
## Projekt
Autonomer Go Coding-Agent ähnlich wie Ralphy.
Nutzt lokale LLMs via OpenAI-kompatibler API (Docker AI, Port 12434).
Die lokalen LLMs sind klein und laufen auf einem Rechner mit 16GB RAM
daher ist die Planung und Task-Aufteilung in atomare Schritte besonders wichtig.
Das Projekt unterstützt mehrere spezialisierte Agenten die zusammenarbeiten:
- **Planner-Agent**: Zerlegt PRD.md in atomare, ausführbare Tasks
- **Code-Agent**: Führt Tasks aus, schreibt Code, dokumentiert
- **Test-Agent**: Führt Tests aus, analysiert Fehler, gibt Feedback an Code-Agent
- **Research-Agent**: Recherchiert Fragen basierend auf konfigurierbaren Quellen
(GitHub, Google, Reddit, StackOverflow)
Jeder Agent dokumentiert Erkenntnisse in `.agent-session.md` damit Fortschritte
nachvollziehbar sind und Agenten voneinander lernen können.
---
## Aktueller Implementierungsstand
### Fertig ✅
- `main.go` Flag-Parsing, Modell-Auswahl via /v1/models API
- `agent/loop.go` Worker-Loop mit Tool Calling + XML-Fallback Parser
- `agent/tools.go` ToolExecutor: write_file, read_file, list_files (rekursiv), task_complete
- `agent/logger.go` Verbose-Logging mit --verbose Flag
- `agent/session.go` Session-Persistenz in .agent-session.md
- `prd/parser.go` PRD.md Checkbox-Parser + MarkTaskComplete
### In Arbeit 🔄
- `agent/planner.go` Planner-Agent (Grundgerüst vorhanden, noch nicht in loop.go integriert)
### Geplant 📋
- `agent/code.go` Code-Agent
- `agent/test.go` Test-Agent
- `agent/research.go` Research-Agent
---
## Architektur
### Dateien
- `main.go` Einstiegspunkt, Flag-Parsing, Modell-Auswahl
- `agent/loop.go` Haupt-Loop, koordiniert alle Agenten
- `agent/tools.go` Tool-Executor (Filesystem-Operationen)
- `agent/logger.go` Strukturiertes Logging
- `agent/session.go` Session-Persistenz
- `agent/planner.go` Planner-Agent
- `agent/code.go` Code-Agent (geplant)
- `agent/test.go` Test-Agent (geplant)
- `agent/research.go` Research-Agent (geplant)
- `prd/parser.go` PRD.md Parser
---
## Agent Interface
Jeder Agent implementiert dieses Interface:
```go
type Agent interface {
Run(task Task) (Result, error)
Name() string
}
type Task struct {
ID int
Title string
Description string
OriginTask string
}
type Result struct {
Success bool
Output string
Findings string // wird in .agent-session.md dokumentiert
}
```
Jeder Agent bekommt:
- Einen `*openai.Client` für LLM-Calls
- Einen `*ToolExecutor` für Filesystem-Zugriff
- Einen `*Logger` für strukturiertes Logging
- Einen `*Session` für Persistenz
---
## Wichtige Konventionen
- **Go Modulname**: `llm-agent`
- **LLM Endpoint**: `http://127.0.0.1:12434/v1`
- **Default Modell**: `docker.io/ai/qwen3-coder:latest`
- **Arbeitsverzeichnis**: `./output` (per `--workdir` Flag)
- **PRD-Datei**: `PRD.md` (per `--prd` Flag)
- **Session-Datei**: `{workdir}/.agent-session.md`
- **Pfade**: immer relativ zum workdir, niemals absolut
- **Kontext**: frischer Kontext pro Task (kein Context-Bloat)
- **Fehlerbehandlung**: maxRetries=3 mit exponential Backoff
---
## Bekannte Probleme & Workarounds
| Problem | Workaround |
|---|---|
| Modell nutzt XML-Format statt JSON Tool Calling | XML-Fallback Parser in `loop.go` (`parseXMLToolCalls`) |
| Kleine Modelle (3B) halten sich nicht an Formate | Mindestens 7B Modell empfohlen |
| `go run` zeigt auf `/tmp` | `os.Getwd()` statt `os.Executable()` |
| LLM schreibt absoluten Pfad | `sanitizePath()` extrahiert relativen Teil |
| `TASK_COMPLETE` ohne Arbeit in Turn 0 | Guard in `runTask()` prüft ob Tool-Call stattfand |
| API Timeout bei großen Modellen | `context.WithTimeout` auf 5 Minuten |
---
## Commands
```bash
# Bauen
go build -o llm-agent .
# Starten
go run main.go --workdir output --prd PRD.md
go run main.go --workdir output --prd PRD.md --verbose
go run main.go --workdir output --prd PRD.md --verbose --model docker.io/ai/qwen3-coder:latest
# Tests
go test ./...
go test -v ./agent/...
go test -cover ./agent/...
```
---
## Vorgehensweise für Claude Code
1. Verfeinere Agent-Interface und Basis-Architektur
2. Integriere `planner.go` in `loop.go`
3. Implementiere `code.go` (Code-Agent)
4. Teste Code-Agent mit einfachen Tasks
5. Implementiere `test.go` (Test-Agent)
6. Verbinde Code-Agent und Test-Agent in Feedback-Loop
7. Implementiere `research.go` (Research-Agent)
---
## Spätere Erweiterungen
- **Vektor-Datenbank**: Speicherung von Agenten-Erkenntnissen und Code-Snippets
für Wiederverwendbarkeit und Lernen zwischen Sessions
- **Git-Integration**: Automatische Commits pro Task, Steuerung via Pull Requests,
Zusammenarbeit mehrerer Agenten auf separaten Branches
- **Discord-Integration**: Echtzeit-Monitoring und Interaktion mit Agenten
über Discord Chat
- **Streaming**: LLM-Antworten Wort für Wort ausgeben statt auf einmal warten
---
## Session-Format (.agent-session.md)
```markdown
# Agent Session
Started: 2026-03-04 20:00:00
Model: docker.io/ai/qwen3-coder:latest
PRD: output/PRD.md
## Plan
### Erstelle go.mod[1]
Origin: Projektstruktur anlegen
Description: Erstelle go.mod mit Modulname llm-agent...
## Tasks
### ✅ Erstelle go.mod
Status: complete
Started: 2026-03-04 20:00:01
Completed: 2026-03-04 20:00:45
### ❌ Erstelle main.go
Status: failed
Attempts: 3
Error: maximale Turns (10) erreicht ohne task_complete
### ⏳ Erstelle README.md
Status: pending
```
---
## Tool-Übersicht
## Tool-Übersicht
| Tool | Parameter | Beschreibung |
|---|---|---|
| `write_file` | `path`, `content` | Datei schreiben, Verzeichnisse werden automatisch erstellt |
| `read_file` | `path` | Dateiinhalt lesen |
| `list_files` | `path`, `recursive?` | Verzeichnis auflisten, optional rekursiv |
| `delete_file` | `path` | Datei löschen |
| `move_file` | `from`, `to` | Datei verschieben oder umbenennen |
| `run_command` | `command`, `args[]`, `workdir?` | Beliebigen Shell-Befehl ausführen (z.B. `go build`, `go test`) |
| `run_tests` | `path?`, `flags[]?` | `go test ./...` ausführen, gibt Ergebnis und Fehler zurück |
| `git_command` | `args[]` | Beliebigen git-Befehl ausführen (z.B. `["commit", "-m", "msg"]`) |
| `git_status` | | `git status` zeigt geänderte Dateien |
| `git_diff` | `path?` | `git diff` zeigt Änderungen |
| `git_commit` | `message`, `files[]?` | Dateien stagen und committen |
| `git_log` | `limit?` | Letzte Commits anzeigen |
| `web_search` | `query`, `sources[]?` | Websuche, optionale Quellen: `github`, `stackoverflow`, `reddit`, `google` |
| `fetch_url` | `url` | Inhalt einer URL abrufen und als Text zurückgeben |
| `task_complete` | `summary?` | Task als erledigt markieren, optionale Zusammenfassung |
| `task_failed` | `reason` | Task explizit als fehlgeschlagen markieren mit Begründung |
---
## Sicherheitsregeln
| Tool | Einschränkung |
|---|---|
| `write_file`, `delete_file`, `move_file` | Nur innerhalb `workdir` |
| `run_command` | Konfigurierbare Whitelist erlaubter Befehle |
| `git_command` | Nur im Projekt-Root, kein `git push` ohne Bestätigung |
| `web_search`, `fetch_url` | Optional deaktivierbar per Flag `--no-network` |
---
## Implementierung