boris claude
This commit is contained in:
155
CLAUDE.md
155
CLAUDE.md
@@ -4,7 +4,7 @@
|
||||
|
||||
Nu ești un tool de cod. Ești asistent — ajuți cu tot: tehnic, organizare, coaching, sănătate, proiecte personale, dezvoltare. Cine ești și cum te comporți e definit în `personality/*.md`. **Respectă aceste fișiere întotdeauna.**
|
||||
|
||||
## How It Works
|
||||
## Cum funcționează
|
||||
|
||||
Mesajele ajung la tine prin adaptoare (Discord, Telegram, WhatsApp) → `router.py` → `claude_session.py` → Claude CLI subprocess → răspuns trimis înapoi.
|
||||
|
||||
@@ -16,14 +16,88 @@ Personalitatea ta se construiește din `personality/*.md`, concatenate în ordin
|
||||
- `HEARTBEAT.md` — verificări periodice
|
||||
- `TOOLS.md` — unelte disponibile
|
||||
|
||||
## Commands
|
||||
## Principii de Workflow
|
||||
|
||||
> **Aplicabilitate:** aceste principii se aplică pentru **modificări de cod** în acest repo sau în proiectele Ralph. Pentru conversații normale (răspunsuri la mesaje, căutări KB, sfaturi, coaching), nu se aplică — răspunde direct, natural.
|
||||
|
||||
### 1. Plan Mode pentru task-uri non-triviale
|
||||
|
||||
Pentru orice task de cod cu **3+ pași sau decizii arhitecturale**, intră în plan mode înainte să atingi cod. Dacă lucrurile o iau razna mid-task (5+ erori în lanț, scope creep, premise false), **STOP** și re-planifică imediat.
|
||||
|
||||
Folosește skill-urile gstack pentru review:
|
||||
- `/plan-eng-review` — arhitectură, edge cases, performance
|
||||
- `/plan-ceo-review` — scope, ambiție, 10-star product
|
||||
- `/plan-design-review` — UI/UX înainte de implementare
|
||||
- `/autoplan` — toate trei automat, cu approval gate la final
|
||||
|
||||
### 2. Strategie de subagenți
|
||||
|
||||
Folosește subagenți (`Agent` tool) liber pentru a păstra context window-ul curat. Offload research, exploration, parallel analysis. **Un singur task per subagent** — nu suprasolicita.
|
||||
|
||||
- `Explore` — căutări codebase
|
||||
- `general-purpose` — research multi-step
|
||||
- `Plan` — design de implementare
|
||||
|
||||
### 3. Self-Improvement Loop
|
||||
|
||||
După **ORICE** corectare de la Marius, actualizează `tasks/lessons.md` cu pattern-ul învățat. Scrie pentru tine viitor — ce a prevenit corectarea, regula, când se aplică.
|
||||
|
||||
La începutul oricărei sesiuni de cod (înainte de plan mode), **citește `tasks/lessons.md`** și aplică lecțiile relevante. Iterează pe ele neobosit pentru a evita rate drop-uri pe greșeli repetate.
|
||||
|
||||
Ralph va citi și el acest fișier între iterații (extensie viitoare — vezi `tools/ralph/prompt.md`).
|
||||
|
||||
### 4. Verificare înainte de „done"
|
||||
|
||||
Nu marca un task complet fără să verifici că funcționează. Comportamentul diferit între `main` și branch-ul tău contează doar dacă e relevant pentru task. Întreabă-te mereu: **„Ar aproba un staff engineer asta?"**
|
||||
|
||||
Folosește din gstack:
|
||||
- `/qa` — test + fix loop iterativ
|
||||
- `/qa-only` — doar raport de bug-uri
|
||||
- `/review` — pre-merge diff review
|
||||
- `/devex-review` — DX live audit
|
||||
- `/ship` — full pipeline (tests + CHANGELOG + PR)
|
||||
|
||||
### 5. Cere eleganță (echilibrat)
|
||||
|
||||
Pentru schimbări non-triviale: pauză și întreabă **„e o cale mai elegantă?"** Dacă fix-ul se simte hacky, *„knowing everything I know now, implement the elegant solution"* — implementează soluția elegantă din capul locului.
|
||||
|
||||
**Skip pentru fixes simple, schimbări obvii** — nu over-engineer. Provoacă-ți munca înainte să o prezinți.
|
||||
|
||||
Folosește `/codex challenge` (mod adversarial care încearcă să spargă codul) sau `/codex review` pentru second opinion.
|
||||
|
||||
### 6. Bug fixing autonom
|
||||
|
||||
Când Marius dă un bug report: **just fix it**. Fără hand-holding. Indică logs, errors, failing tests — apoi rezolvă-le. Zero context switching cerut de la user.
|
||||
|
||||
Folosește `/investigate` pentru debugging sistematic (4 faze: investigate → analyze → hypothesize → implement). **Iron Law: fără fix fără root cause.**
|
||||
|
||||
Ralph face exact asta noaptea, autonom, pe proiectele aprobate.
|
||||
|
||||
## Task Management
|
||||
|
||||
Pentru work tracking folosește **Echo Task Board** (`dashboard/`), nu fișiere markdown. Endpoints în `dashboard/handlers/`.
|
||||
|
||||
1. **Plan First** — task-uri cu checkboxes în plan mode
|
||||
2. **Verify Plan** — check-in cu Marius înainte de implementare la schimbări mari
|
||||
3. **Track Progress** — marchează task-urile complete pe măsură ce le faci
|
||||
4. **Explain Changes** — high-level summary la fiecare pas
|
||||
5. **Document Results** — la final, secțiune review în PR sau în `tasks/<task>.md`
|
||||
6. **Capture Lessons** — la corectări, update `tasks/lessons.md` (vezi principiul 3)
|
||||
|
||||
## Core Principles
|
||||
|
||||
- **Simplicitate înainte de toate** — fă cele mai simple schimbări posibile. Impact minim, cod minimal.
|
||||
- **Zero lene** — root causes, nu temporary fixes. Standard de senior developer.
|
||||
- **Impact minim** — atinge doar ce e necesar. Fără side effects la features noi.
|
||||
|
||||
## Comenzi
|
||||
|
||||
```bash
|
||||
# Tests
|
||||
source .venv/bin/activate && pytest tests/
|
||||
pytest tests/test_router.py::test_clear_command -v
|
||||
|
||||
# Start
|
||||
# Pornire
|
||||
systemctl --user start echo-core # systemd
|
||||
source .venv/bin/activate && python3 src/main.py # manual
|
||||
|
||||
@@ -34,38 +108,38 @@ systemctl --user start echo-whatsapp-bridge
|
||||
eco status
|
||||
eco doctor
|
||||
|
||||
# Dependencies
|
||||
# Dependențe
|
||||
source .venv/bin/activate && pip install -r requirements.txt
|
||||
```
|
||||
|
||||
## Architecture
|
||||
## Arhitectură
|
||||
|
||||
**Flow:** Adapter → `router.py` → `claude_session.py` → Claude CLI → response split → Adapter reply
|
||||
**Flow:** Adapter → `router.py` → `claude_session.py` → Claude CLI → split răspuns → reply pe Adapter
|
||||
|
||||
**Adapters** (concurrent, `asyncio.gather()` in `src/main.py`):
|
||||
- **Discord** (`src/adapters/discord_bot.py`) — slash commands, 2000 char split
|
||||
- **Telegram** (`src/adapters/telegram_bot.py`) — commands + inline keyboards, 4096 char split
|
||||
- **WhatsApp** (`src/adapters/whatsapp.py`) — polls Baileys bridge at `http://127.0.0.1:8098`, 4096 char split
|
||||
**Adaptoare** (concurente, `asyncio.gather()` în `src/main.py`):
|
||||
- **Discord** (`src/adapters/discord_bot.py`) — slash commands, split la 2000 caractere
|
||||
- **Telegram** (`src/adapters/telegram_bot.py`) — comenzi + inline keyboards, split la 4096 caractere
|
||||
- **WhatsApp** (`src/adapters/whatsapp.py`) — polling Baileys bridge la `http://127.0.0.1:8098`, split la 4096 caractere
|
||||
|
||||
**Sessions** (`src/claude_session.py`): One persistent session per channel. `claude --resume <session_id>`. External messages wrapped in `[EXTERNAL CONTENT]` injection markers.
|
||||
**Sesiuni** (`src/claude_session.py`): O sesiune persistentă per canal. `claude --resume <session_id>`. Mesajele externe sunt împachetate în markeri `[EXTERNAL CONTENT]`.
|
||||
|
||||
**State:** `sessions/active.json` — channel ID → `{session_id, model, message_count, ...}`
|
||||
|
||||
**Credentials** (`src/credential_store.py`): System keyring, service `"echo-core"`. Never secrets as CLI args.
|
||||
**Credențiale** (`src/credential_store.py`): Keyring de sistem, serviciu `"echo-core"`. Niciodată secrete ca argumente CLI.
|
||||
|
||||
**Config** (`src/config.py`): `config.json` with dot-notation. Namespaces: `channels`, `telegram_channels`, `whatsapp_channels`.
|
||||
**Config** (`src/config.py`): `config.json` cu dot-notation. Namespaces: `channels`, `telegram_channels`, `whatsapp_channels`.
|
||||
|
||||
**Scheduler** (`src/scheduler.py`): APScheduler + `cron/jobs.json`, isolated sessions.
|
||||
**Scheduler** (`src/scheduler.py`): APScheduler + `cron/jobs.json`, sesiuni izolate.
|
||||
|
||||
**Heartbeat** (`src/heartbeat.py`): Email, calendar, KB, git checks. Quiet hours 23-08.
|
||||
**Heartbeat** (`src/heartbeat.py`): Verificări email, calendar, KB, git. Ore tăcere 23-08.
|
||||
|
||||
**Ralph** (`tools/ralph/`): Autonomous project execution system. `ralph.sh` este un bash loop care cheamă `claude` CLI (subscription, nu API) per user story din `prd.json`. Generarea PRD se face cu `tools/ralph_prd_generator.py` (model Opus). Workspace-ul proiectelor e la `~/workspace/`.
|
||||
**Ralph** (`tools/ralph/`): Sistem autonom de execuție. `ralph.sh` este un bash loop care cheamă `claude` CLI (subscription, nu API) per user story din `prd.json`. Generarea PRD se face cu `tools/ralph_prd_generator.py` (model Opus). Workspace-ul proiectelor e la `~/workspace/`.
|
||||
|
||||
**Memory** (`src/memory_search.py`): Ollama all-minilm embeddings (384 dim) + SQLite cosine similarity. Lives at `memory/` inside this repo — single source of truth. Historical note: used to be a symlink to the legacy Clawdbot repo; consolidated into echo-core during the OpenClaw migration (2026-04).
|
||||
**Memory** (`src/memory_search.py`): Embeddings Ollama all-minilm (384 dim) + cosine similarity SQLite. Trăiește la `memory/` în acest repo — single source of truth. *Notă istorică:* era symlink la repo-ul legacy Clawdbot; consolidat în echo-core în migrația OpenClaw (2026-04).
|
||||
|
||||
**Dashboard** (`dashboard/`): Echo Task Board — HTTP API + static UI served by `dashboard/api.py` on port 8088, typically behind a reverse proxy at `/echo/`. Endpoint logic split across `dashboard/handlers/*.py` mixins; paths centralised in `dashboard/constants.py`. Systemd user unit template at `dashboard/echo-taskboard.service`.
|
||||
**Dashboard** (`dashboard/`): Echo Task Board — HTTP API + UI static servit de `dashboard/api.py` pe portul 8088, de obicei în spatele unui reverse proxy la `/echo/`. Logica endpoint-urilor împărțită în mixin-uri `dashboard/handlers/*.py`; path-urile centralizate în `dashboard/constants.py`. Template systemd user unit la `dashboard/echo-taskboard.service`.
|
||||
|
||||
## Ralph — Autonomous Project Execution
|
||||
## Ralph — Execuție autonomă de proiecte
|
||||
|
||||
Sistem de implementare autonomă care rulează noaptea. Flow complet:
|
||||
|
||||
@@ -111,37 +185,38 @@ Marius → !approve <slug> (Discord/Telegram/WhatsApp → router.py → appro
|
||||
- Self-improvement echo-core NUMAI pe branch `ralph/echo-improve`, niciodată pe master
|
||||
- Clone-urile folosesc `GITEA_TOKEN` din `dashboard/.env`: `https://moltbot:${TOKEN}@gitea.romfast.ro/romfast/<name>.git`
|
||||
|
||||
## Import Convention
|
||||
## Convenție import-uri
|
||||
|
||||
Absolute imports via `sys.path.insert(0, PROJECT_ROOT)`: `from src.config import ...`, `from src.adapters.discord_bot import ...`. No circular imports.
|
||||
Import-uri absolute via `sys.path.insert(0, PROJECT_ROOT)`: `from src.config import ...`, `from src.adapters.discord_bot import ...`. Fără import-uri circulare.
|
||||
|
||||
## Key Files
|
||||
## Fișiere cheie
|
||||
|
||||
| Path | Role |
|
||||
|------|------|
|
||||
| `src/main.py` | Entry point — adapters + scheduler + heartbeat |
|
||||
| `src/router.py` | Commands vs Claude messages |
|
||||
| `src/claude_session.py` | Claude CLI wrapper with `--resume` |
|
||||
| `src/credential_store.py` | Keyring secrets |
|
||||
| `cli.py` | CLI diagnostics (eco) |
|
||||
| `config.json` | Runtime config |
|
||||
| `bridge/whatsapp/index.js` | Baileys + Express bridge, port 8098 |
|
||||
| Path | Rol |
|
||||
|------|-----|
|
||||
| `src/main.py` | Entry point — adaptoare + scheduler + heartbeat |
|
||||
| `src/router.py` | Comenzi vs mesaje Claude |
|
||||
| `src/claude_session.py` | Wrapper Claude CLI cu `--resume` |
|
||||
| `src/credential_store.py` | Secrete keyring |
|
||||
| `cli.py` | Diagnostice CLI (eco) |
|
||||
| `config.json` | Config runtime |
|
||||
| `bridge/whatsapp/index.js` | Bridge Baileys + Express, port 8098 |
|
||||
| `personality/*.md` | System prompt — cine ești |
|
||||
| `memory/` | Knowledge base — embeddings + SQLite (lives in-repo, not a symlink) |
|
||||
| `memory/` | Knowledge base — embeddings + SQLite (în repo, nu symlink) |
|
||||
| `dashboard/api.py` | Task Board HTTP API (port 8088) |
|
||||
| `dashboard/handlers/` | Endpoint mixins (git, cron, habits, eco, files, pdf, workspace, youtube) |
|
||||
| `dashboard/constants.py` | Centralised paths + Gitea config for the dashboard |
|
||||
| `dashboard/echo-taskboard.service` | Systemd user unit template |
|
||||
| `cron/jobs.json` | APScheduler jobs (flat schema, Europe/Bucharest) |
|
||||
| `approved-tasks.json` | Ralph coordination file — status proiecte autonome |
|
||||
| `tools/ralph/ralph.sh` | Ralph bash loop (N iter × claude CLI per story) |
|
||||
| `dashboard/handlers/` | Mixin-uri endpoints (git, cron, habits, eco, files, pdf, workspace, youtube) |
|
||||
| `dashboard/constants.py` | Path-uri centralizate + config Gitea pentru dashboard |
|
||||
| `dashboard/echo-taskboard.service` | Template systemd user unit |
|
||||
| `cron/jobs.json` | Job-uri APScheduler (schemă plată, Europe/Bucharest) |
|
||||
| `approved-tasks.json` | Fișier coordonare Ralph — status proiecte autonome |
|
||||
| `tasks/lessons.md` | Lecții capturate din corectările lui Marius (citit la session start) |
|
||||
| `tools/ralph/ralph.sh` | Bash loop Ralph (N iter × claude CLI per story) |
|
||||
| `tools/ralph_prd_generator.py` | Generează PRD + prd.json cu Opus |
|
||||
|
||||
## gstack
|
||||
|
||||
Use the `/browse` skill from gstack for all web browsing. Never use `mcp__claude-in-chrome__*` tools.
|
||||
Folosește skill-ul `/browse` din gstack pentru orice navigare web. Nu folosi tool-uri `mcp__claude-in-chrome__*`.
|
||||
|
||||
Available skills:
|
||||
Skill-uri disponibile:
|
||||
- `/office-hours`
|
||||
- `/plan-ceo-review`
|
||||
- `/plan-eng-review`
|
||||
|
||||
Reference in New Issue
Block a user