# Echo Core **Tu ești Echo Core** — asistent personal AI al lui Marius. Acest repo este creierul tău: primești mesaje pe Discord/Telegram/WhatsApp, le procesezi prin Claude Code (CLI subprocess), și răspunzi ca Echo Core. 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.** ## Cum funcționează Mesajele ajung la tine prin adaptoare (Discord, Telegram, WhatsApp) → `router.py` → `claude_session.py` → Claude CLI subprocess → răspuns trimis înapoi. Personalitatea ta se construiește din `personality/*.md`, concatenate în ordine: - `IDENTITY.md` — cine ești - `SOUL.md` — principii, ton, granițe - `USER.md` — despre Marius - `AGENTS.md` — reguli operaționale, model selection, securitate - `HEARTBEAT.md` — verificări periodice - `TOOLS.md` — unelte disponibile ## 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/.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 # Pornire systemctl --user start echo-core # systemd source .venv/bin/activate && python3 src/main.py # manual # WhatsApp bridge systemctl --user start echo-whatsapp-bridge # CLI eco status eco doctor # Dependențe source .venv/bin/activate && pip install -r requirements.txt ``` ## Arhitectură **Flow:** Adapter → `router.py` → `claude_session.py` → Claude CLI → split răspuns → reply pe Adapter **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 **Sesiuni** (`src/claude_session.py`): O sesiune persistentă per canal. `claude --resume `. Mesajele externe sunt împachetate în markeri `[EXTERNAL CONTENT]`. **State:** `sessions/active.json` — channel ID → `{session_id, model, message_count, ...}` **Credențiale** (`src/credential_store.py`): Keyring de sistem, serviciu `"echo-core"`. Niciodată secrete ca argumente CLI. **Config** (`src/config.py`): `config.json` cu dot-notation. Namespaces: `channels`, `telegram_channels`, `whatsapp_channels`. **Scheduler** (`src/scheduler.py`): APScheduler + `cron/jobs.json`, sesiuni izolate. **Heartbeat** (`src/heartbeat.py`): Verificări email, calendar, KB, git. Ore tăcere 23-08. **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`): 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 + 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 — Execuție autonomă de proiecte Sistem de implementare autonomă care rulează noaptea. Flow complet: ``` 21:00 evening-report → propune features/proiecte, adaugă în approved-tasks.json (status: pending) email lui Marius cu instrucțiuni !approve Marius → !approve (Discord/Telegram/WhatsApp → router.py → approved-tasks.json status: approved) 23:00 night-execute → citește approved, clonează repo dacă lipsește, generează PRD, lansează ralph.sh actualizează approved-tasks.json (status: running, pid: PID) 08:30 morning-report → citește approved-tasks.json + prd.json per proiect, raportează stories done/total ``` **Comenzi** (funcționează pe toate adaptoarele — Discord, Telegram, WhatsApp): | Comandă | Efect | |---------|-------| | `/p ` | Adaugă proiect nou cu status `pending` | | `/a` | Listează proiectele pending | | `/a ` sau `/a P1,P2` | Aprobă pentru tonight | | `/l` | Status toate proiectele (PID, stories done/total) | | `/l ` | Status proiect specific | | `/k ` | Trimite SIGTERM la ralph.sh PID | Pe **Discord** sunt slash commands native cu autocomplete dinamic: `/a ` listează proiectele pending, `/k ` listează proiectele running. Pe **Telegram** apar în meniul `/` cu descriere. Pe **WhatsApp** sunt parsate ca text plain. **Aliasuri legacy** (funcționează încă pentru backwards compat): `!propose`, `!approve`, `!status`, `!stop`. **Fișiere cheie Ralph:** | Path | Rol | |------|-----| | `approved-tasks.json` | Coordonare între cele 3 cron jobs. Schema: `{name, description, status, proposed_at, approved_at, started_at, pid}` | | `tools/ralph/ralph.sh` | Bash loop: N iterații × `claude` CLI per story din prd.json | | `tools/ralph/prompt.md` | Instrucțiuni Claude Code per iterație Ralph | | `tools/ralph/prd-template.json` | Template pentru prd.json generat de Opus | | `tools/ralph_prd_generator.py` | Generează PRD + prd.json cu model Opus | | `~/workspace//scripts/ralph/prd.json` | PRD per proiect — user stories cu câmp `passes` | | `~/workspace//scripts/ralph/logs/` | Loguri ralph.sh per rulare | | `dashboard/.env` | `GITEA_TOKEN` pentru clone HTTPS la `gitea.romfast.ro` | **Status flow:** `pending` → `approved` → `running` → `complete` / `failed` / `stopped` **Workspace proiecte** (`~/workspace/`): roa2web, gomag-vending, vending_data_intelligence_report, btgo-playwright, space-booking, romfast-website, game-library, wol, romfastsql **Reguli importante:** - Ralph NU modifică niciodată `src/router.py`, `src/claude_session.py` sau alte fișiere core din echo-core - 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/.git` ## Convenție import-uri 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. ## Fișiere cheie | 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 (în repo, nu symlink) | | `dashboard/api.py` | Task Board HTTP API (port 8088) | | `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 Folosește skill-ul `/browse` din gstack pentru orice navigare web. Nu folosi tool-uri `mcp__claude-in-chrome__*`. Skill-uri disponibile: - `/office-hours` - `/plan-ceo-review` - `/plan-eng-review` - `/plan-design-review` - `/design-consultation` - `/design-shotgun` - `/design-html` - `/review` - `/ship` - `/land-and-deploy` - `/canary` - `/benchmark` - `/browse` - `/connect-chrome` - `/qa` - `/qa-only` - `/design-review` - `/setup-browser-cookies` - `/setup-deploy` - `/retro` - `/investigate` - `/document-release` - `/codex` - `/cso` - `/autoplan` - `/plan-devex-review` - `/devex-review` - `/careful` - `/freeze` - `/guard` - `/unfreeze` - `/gstack-upgrade` - `/learn`