diff --git a/CLAUDE.md b/CLAUDE.md index 4207869..15de3e4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -145,25 +145,41 @@ 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) + email lui Marius cu instrucțiuni de aprobare +Marius → /a (Discord/Telegram/WhatsApp → router.py → status: approved + SAU /plan → planning agent conversational → final-plan.md → approved) +23:00 night-execute → citește approved, clonează repo dacă lipsește, generează PRD din final-plan.md, + lansează ralph.sh; actualizează approved-tasks.json (running, pid: PID) 08:30 morning-report → citește approved-tasks.json + prd.json per proiect, raportează stories done/total +Live dashboard → /echo/ralph.html (polling 5s) — cards per proiect cu status, iter, ETA, log, stop ``` +**Două căi de aprobare**: +- **Direct**: `/a ` — pentru proiecte simple unde descrierea e suficientă +- **Conversational** (W2 — `/plan ` SAU buton "Planifică" pe `/l`): Echo poartă o conversație multi-fază prin skills gstack (`/office-hours` → `/plan-ceo-review` → `/plan-eng-review` → opțional `/plan-design-review` dacă tags include "ui"), produce `~/workspace//scripts/ralph/final-plan.md` și prezintă rezumat cu butonul "✅ Dau drumul tonight". `night-execute` îl folosește ca input pentru PRD generator (Opus extrage user stories cu acceptanceCriteria, tags, dependsOn). + **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) | +| `/a ` sau `/a P1,P2` | Aprobă pentru tonight (path direct) | +| `/plan ` | Pornește planning agent conversational (multi-fază skills gstack) | +| `/cancel` | Anulează planning în curs (revert status → pending) | +| `/l` | **Discord/Telegram**: meniu interactiv (Views/InlineKeyboardMarkup) cu butoane per proiect; **WhatsApp**: text plain + redirect spre Discord/TG | | `/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. +**UX interactiv** (Discord/Telegram): +- `/l` deschide `RalphRootView` (Discord) / InlineKeyboardMarkup (Telegram) cu butoane per workspace project +- Click pe proiect → submeniu cu acțiuni: ➕ Propune feature (modal/ForceReply), 🧠 Planifică (W2), 👁 Vezi PRD, 📊 Status, ✅ Aprobă tonight, 🛑 Stop, 🔙 Înapoi +- La sfârșitul planning: butoane ✅ Dau drumul tonight / ✏️ Mai gândim / 🛑 Anulează +- State per `(adapter, channel)` în `sessions/ralph_flow.json` și `sessions/planning.json` (TTL 10min/60min) + +Pe **Discord**: slash commands native cu autocomplete dinamic: `/p ` listează workspace, `/a ` pending, `/k ` running. Modal cu `TextInput` pentru descriere. Critical pattern: `await interaction.response.defer(ephemeral=True)` în orice button callback cu I/O (Discord 3s timeout). +Pe **Telegram**: `callback_ralph` cu pattern `^ralph:` rutează acțiuni; `ForceReply` pentru input text descriere. +Pe **WhatsApp**: text-only — meniu redirect la Discord/Telegram. **Aliasuri legacy** (funcționează încă pentru backwards compat): `!propose`, `!approve`, `!status`, `!stop`. @@ -171,16 +187,25 @@ Pe **Discord** sunt slash commands native cu autocomplete dinamic: `/a ` li | 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` | +| `approved-tasks.json` | Coordonare între cron jobs + UX. Schema: `{name, description, status, planning_session_id, final_plan_path, proposed_at, approved_at, started_at, pid}` | +| `prompts/planning_agent.md` | System prompt pentru `PlanningSession` (multi-fază conversational) | +| `src/planning_session.py` | Wrapper subprocess `claude -p` cu working dir = `~/workspace//`, `--add-dir` skills gstack + project artifacts. `--max-turns=20` cu retry pe `error_max_turns` | +| `src/planning_orchestrator.py` | Coordonează fazele: fresh subprocess per skill phase; coordinează prin disk artifacts gstack convention; tag detection ui-scope | +| `sessions/planning.json` | State per `(adapter, channel)` planning session: session_id, current_phase, etc. — pentru re-resume la restart | +| `tools/ralph/ralph.sh` | Bash loop DAG-aware: N iterații × `claude` CLI per story; folosește `tools/ralph_dag.py` pentru selecție topologică, retry guard (3 retries), rate-limit detection | +| `tools/ralph/prompt.md` | Smart gates dispatcher pe `story.tags` (Faza 3): refactor→/workflow:simplify, ui→/qa+screenshot, vercel→push+gh checks, db→schema diff, default→/review | +| `tools/ralph/prd-template.json` | Template prd.json: stories cu `acceptanceCriteria[]`, `tags[]`, `dependsOn[]`, `passes`, `retries` | +| `tools/ralph_prd_generator.py` | Generează prd.json. Cu `final_plan_path` (de la PlanningOrchestrator) → Opus extrage stories cu acceptance criteria. Fără → backwards-compat description-only | +| `tools/ralph_dag.py` | Pure functions Python (testabile): `infer_tags_from_paths`, `force_include_tags`, `topological_eligible`, `mark_failed`, blocked propagation iterativă. CLI subcommands chemate din ralph.sh (`infer-tags`, `next-story`, `mark-failed`, `incr-retry`) | +| `~/workspace//scripts/ralph/final-plan.md` | Output planning agent — citit de PRD generator | +| `~/workspace//scripts/ralph/prd.json` | PRD per proiect cu schema extinsă | | `~/workspace//scripts/ralph/logs/` | Loguri ralph.sh per rulare | +| `dashboard/handlers/ralph.py` | Endpoints `/api/ralph/status`, `//log`, `//prd`, `//stop` | +| `dashboard/ralph.html` | UI live cards, polling 5s, status badges, ETA, butoane log/prd/stop | | `dashboard/.env` | `GITEA_TOKEN` pentru clone HTTPS la `gitea.romfast.ro` | -**Status flow:** `pending` → `approved` → `running` → `complete` / `failed` / `stopped` +**Status flow:** `pending` → (`planning` →) `approved` → `running` → `complete` / `failed` / `stopped` / `blocked` (DAG) +**Story status (în prd.json):** `passes:false` + `retries:N` → `passes:true` SAU `failed:rate_limited|max_retries` **Workspace proiecte** (`~/workspace/`): roa2web, gomag-vending, vending_data_intelligence_report, btgo-playwright, space-booking, romfast-website, game-library, wol, romfastsql @@ -211,9 +236,16 @@ Import-uri absolute via `sys.path.insert(0, PROJECT_ROOT)`: `from src.config imp | `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 | +| `approved-tasks.json` | Fișier coordonare Ralph — status proiecte autonome (extins cu `planning_session_id`, `final_plan_path`) | | `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) | +| `tasks/spike-planning-findings.md` | Validare empirică Spike Step 0 (subprocess `claude -p` + skills gstack + `--resume` round-trip) | +| `prompts/planning_agent.md` | System prompt pentru planning agent multi-fază (W2) | +| `src/ralph_flow.py` | State per `(adapter, chat, user)` pentru UX flow (TTL 10min) | +| `src/planning_session.py` | Wrapper Claude subprocess pentru planning agent | +| `src/planning_orchestrator.py` | Orchestrare faze gstack skills (W2) | +| `src/adapters/discord_views.py` | Discord Views/Modal pentru UX interactiv (W1) | +| `tools/ralph/ralph.sh` | Bash loop DAG-aware (W3): N iter × claude CLI per story | +| `tools/ralph_dag.py` | DAG helpers + CLI (W3) | | `tools/ralph_prd_generator.py` | Generează PRD + prd.json cu Opus | ## gstack