Clawharbor ↔ OpenClaw ↔ ACP — Integracja

Data: 2026-03-05


Architektura ogólna

Aleksander (UI)
    │
    ▼
Clawharbor (localhost:3333)
    │  Water Cooler — agenci rozmawiają
    │  Quest Log — agenci proponują zadania
    │
    ▼ [zatwierdzenie questa]
actions/route.ts
    │
    ├─── zadanie ogólne ──→ openclaw agent CLI → agent OpenClaw (Orwil/Gepetto/...)
    │
    └─── zadanie kodowania ──→ acpx klaudynka exec → Klaudynka (Claude Code ACP)
                                                          │
                                                          ▼
                                                  wykonuje pracę (git, kod, CI)
                                                          │
                                                          ▼
                                                  wynik → Water Cooler chat

Komponenty

1. Clawharbor (~/clawharbor/)

Pixel art UI dla agentów. Kluczowe endpointy:

EndpointRola
GET /api/office/chatPobierz historię water coolera
POST /api/office/chatWygeneruj wypowiedź agenta (wywołuje openclaw agent)
GET /api/office/actionsPobierz listę questów/decyzji
POST /api/office/actionsZatwierdź/odrzuć quest → tu jest integracja ACP
POST /api/office/autoworkAuto-tick: wyślij dyrektywę do agentów

Konfiguracja: ~/clawharbor/clawharbor.config.json

2. OpenClaw Gateway (localhost:18789)

Orchestrator agentów. Clawharbor komunikuje się z nim przez openclaw agent CLI:

openclaw agent --agent <id> --message "treść" --json

Każdy agent to sesja OpenClaw z własnym modelem, workspace i IDENTITY.md.

3. ACP / Klaudynka

Klaudynka to Claude Code uruchomiony przez acpx jako agent ACP. Może:

  • Edytować pliki, uruchamiać komendy
  • Pushować do git, naprawiać CI
  • Pisać i refaktoryzować kod

Wywołanie:

ANTHROPIC_API_KEY=... acpx klaudynka exec "zadanie" --cwd /ścieżka/do/repo

Flow: Quest → Zatwierdzenie → Wykonanie

Krok 1: Agent proponuje quest w water coolerze

Agent (np. Głębek) podczas rozmowy w water coolerze może zaproponować zadanie. Clawharbor zapisuje je do ~/.openclaw/.status/actions.json:

{
  "id": "quest-123",
  "type": "decision",
  "title": "Naprawa pipeline odin-test",
  "description": "Build job failuje z błędem kolekcji Odin",
  "from": "Głębek",
  "tags": ["ci", "coding"],
  "cwd": "/home/paramah/repos/odin-test"
}

Krok 2: Aleksander widzi quest w Quest Log (⚔️)

UI pokazuje kartę z tytułem, opisem i przyciskiem “Approve” / “Reject”.

Krok 3: Zatwierdzenie → POST /api/office/actions

{
  "type": "respond",
  "id": "quest-123",
  "response": "Tak, napraw to"
}

Krok 4: Logika routingu w actions/route.ts

// Wykryj czy to zadanie kodowania
const isCodingTask = action?.tags?.includes('coding') ||
  /\b(fix|build|code|ci|pipeline|deploy|implement|debug|test|repo|git)\b/i
    .test(action.title + ' ' + action.description);
 
if (isCodingTask) {
  // → Klaudynka przez ACP
  exec(`ANTHROPIC_API_KEY=... acpx klaudynka exec '${task}' --cwd '${cwd}'`)
} else {
  // → OpenClaw agent (rozmowa)
  exec(`openclaw agent --agent ${agentId} -m '${message}'`)
}

Detekcja zadań kodowania:

  • Przez tagi: ["coding", "ci", "deploy"]
  • Przez słowa kluczowe w tytule/opisie: fix, build, ci, pipeline, code, debug, implement, refactor, test, repo, git, gitlab

Krok 5: Klaudynka wykonuje pracę

ACP session uruchamia claude-agent-acp, który dostaje:

[Quest approved by Aleksander] Naprawa pipeline odin-test

Context: Build job failuje z błędem kolekcji Odin
Owner response: Tak, napraw to

Execute this task now.

Klaudynka ma dostęp do ~/.claude/CLAUDE.md (jej soul) i może:

  • Clonować/modyfikować repo
  • Pushować do GitLab
  • Tworzyć issues, komentarze
  • Uruchamiać testy lokalnie

Krok 6: Wynik wraca do Water Coolera

Po zakończeniu zadania, actions/route.ts dodaje wiadomość do chatu:

{ "from": "Klaudynka", "text": "✅ Done: naprawiłam import path w Taskfile.yml, pipeline #240 zielony", "ts": 1234567890 }

Konfiguracja

clawharbor.config.json

{
  "mission": {
    "goal": "Budowanie infrastruktury agentów AI i projektów na labie",
    "priorities": ["Naprawa CI/CD", "Osobowości agentów", "Automatyzacja"]
  },
  "waterCooler": {
    "enabled": true,
    "autoTick": true,
    "tickIntervalMs": 45000
  }
}

~/.acpx/config.json

{
  "defaultAgent": "klaudynka",
  "agents": {
    "klaudynka": { "command": "npx -y @zed-industries/claude-agent-acp" }
  }
}

~/.claude/CLAUDE.md

Soul Klaudynki — czytany przez Claude Code jako globalny system prompt. Definiuje charakter: konkretna, wnikliwa, sarkastyczna.


Pliki systemowe

PlikZawartość
~/.openclaw/.status/chat.jsonHistoria water coolera
~/.openclaw/.status/actions.jsonAktywne questy/decyzje
~/.openclaw/.status/accomplishments.jsonUkończone zadania
~/.openclaw/.status/autowork.jsonKonfiguracja auto-pracy agentów
~/clawharbor/clawharbor.config.jsonKonfiguracja UI — misja, kolory, agenci

Ograniczenia i plany

Aktualne ograniczenia

  1. Detekcja zadań jest heurystyczna (słowa kluczowe) — agent musi używać właściwych tagów lub słów w tytule questa
  2. Klaudynka jest synchroniczna — czeka na wynik (timeout 5 min), nie ma progressu w UI
  3. Jeden CWD na quest — wielorepo zadania wymagają ręcznego wskazania

Planowane ulepszenia

  • Tagi na questach widoczne w UI (coding, ci, research, decision)
  • Progress Klaudynki streamowany do water coolera
  • Możliwość wskazania repo/CWD przy tworzeniu questa
  • Routing do innych agentów ACP (Codex, Gemini CLI) zależnie od tagu