From b935a21b41ed69fee6ca07de99389853b234113e Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Sat, 13 Jun 2026 09:29:21 +0000 Subject: [PATCH] =?UTF-8?q?docs:=20TODOS.md=20devine=20board=20de=20progre?= =?UTF-8?q?s=20durabil=20pentru=20Itera=C8=9Bia=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Secțiunea ▶ BOARD ACTIV (S1-S4) sus, convenție [ ]→[~]→[x]→[!] citită la start de sesiune. AGENTS.md root indexează TODOS.md ca board durabil (harness task list se resetează, ăsta nu). Notat: ipoteza S1 din HANDOFF (beep nedefinit) pare greșită — beep e definit la escape-builder.html:1725. Co-Authored-By: Claude Opus 4.8 (1M context) --- AGENTS.md | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ TODOS.md | 33 +++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 AGENTS.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..af879c2 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,67 @@ +# AGENTS.md — Escape Room Builder (root) + +Generator de jocuri escape room: un singur fișier HTML, fără backend/build/dependențe. +Același set de puzzle-uri se exportă în 6 motoare de joc. Acest arbore `AGENTS.md` e +sursa de adevăr tehnică pentru agenți. + +## Protocol DOX + +- **Citire** — înainte de a edita un path, cobori din rădăcină citind fiecare `AGENTS.md` + întâlnit; dacă un părinte indexează un copil al cărui scope conține path-ul, citești copilul. +- **Editare** — `AGENTS.md`-ul cel mai apropiat = contract local; părinții = reguli globale. + Un copil NU poate slăbi o constrângere a unui părinte. +- **Update** — după orice schimbare semnificativă, actualizezi `AGENTS.md`-ul care deține zona + + indexul părintelui; ștergi textul învechit. + +## Quick Reference + +```bash +# Rulare/verificare — deschide direct în browser (merge de pe file://) sau servește local: +python3 -m http.server 8000 + +# Teste (Playwright; fără package.json commitat — vezi tests/AGENTS.md): +npx playwright test tests/smoke.mjs # suita completă: 21/21 +npx playwright test tests/smoke.mjs --grep @regresie # regresie: 13 +npx playwright test tests/smoke.mjs --grep @campanie # campanie E2E: 8 +``` + +## Durable Rules (repo-wide) + +- **Zero dependențe.** Produsul (fișierele `*.html`) e vanilla HTML/CSS/JS, merge offline de pe + `file://`. `node_modules/`, `package.json`, `playwright.config.mjs`, `scratch/`, `test-results/` + sunt **gitignored** — doar dev tooling, nu fac parte din produs. +- **Un singur fișier.** Toată aplicația trăiește în `escape-builder.html` (~1960 linii), pe secțiuni + comentate: `stare` · `editor` · `preview` · `template-urile jocului exportat`. +- **Dispatch.** `gameHTML(cfg)` rutează pe `cfg.style` către 6 motoare: + `gameClassic · gameTerminal · gameArcade · gameChat · gamePoint · gameCampaign`. Fiecare returnează + un string HTML complet, standalone. +- **Cod partajat = blast radius global.** `libJS(cfg)` (`CFG`, `norm`, `checkAnswer`, `starsFor`, + `finalWord`, `beep`, `confetti`) și `SNIP.*` (`baseCss`, modal, ecran final) sunt injectate în + TOATE motoarele. O schimbare aici → verifică fiecare stil în preview înainte de commit. +- **Backslash dublu.** Motoarele sunt template literals mari: backslash-urile din codul GENERAT se + dublează (`\\u0300`, `\\n`). Codul generat folosește `var`/`function` clasic — intenționat. +- **Sentinel `__CFG__`.** Templatele per stil emit `__CFG__` (la `cfg === '__TEMPLATE__'`) și se + injectează prin **replace-FUNCȚIE**, nu string — protejează `$`/`$&` din config (D1). +- **Demo-urile sunt generate.** `exemplu-*.html` = jocuri exportate din builder, unul per stil. + **NU le edita manual** — după modificări la motoare, regenerează prin export. `index.html` = doar + landing care leagă builder-ul + demo-urile. +- **Stare.** Obiectul `state` (titlu, poveste, culoare, `style`, `puzzles`) se persistă în + `localStorage` sub cheia `escape-builder-v1`; export/import ca JSON. Editorul scrie via `data-g` → + `onChange()` → persist + `refreshPreview()` (debounce 400ms) care setează `iframe.srcdoc`. +- **Design = `DESIGN.md`.** Sursă unică de adevăr vizual pentru campanie (tokens `:root`, intro-poster, + coridor, diplomă). Note „nu se repară" (violet default, `system-ui`, lipsa webfonturilor pe `file://`) + sunt deliberate — consultă fișierul înainte de schimbări vizuale. + +## Documente conexe (conținut, nu contracte) + +- `DESIGN.md` — contract de design campanie (vizual/interacțiune). +- `TODOS.md` — **board de progres durabil** + backlog. Secțiunea „▶ BOARD ACTIV" sus = sursa de + adevăr pentru ce e în lucru; harness task list-ul se resetează între sesiuni, ăsta nu. La + START de sesiune citește board-ul; mută `[ ]→[~]→[x]→[!]` pe măsură ce avansezi și commit. +- `HANDOFF.md` — handoff de sesiune (efemer; direcția curentă de lucru). +- `README.md` — descriere pentru utilizatorul final. + +## Child DOX Index + +- `tests/` → [tests/AGENTS.md](tests/AGENTS.md) — harness Playwright (smoke/regresie/campanie E2E). +- `scratch/` → scratch/AGENTS.md — zonă de prototipuri & QA (gitignored, efemer). diff --git a/TODOS.md b/TODOS.md index 7ef36e2..daad51b 100644 --- a/TODOS.md +++ b/TODOS.md @@ -3,6 +3,39 @@ Backlog post-PR1 și note tehnice pentru iterațiile viitoare. Referință plan complet: `~/.gstack/projects/romfast-escape-builder/ceo-plans/2026-06-12-campania-multi-stil.md` +> **Acest fișier e BOARD-UL DE PROGRES (sursa durabilă).** Task list-ul din harness se +> resetează între sesiuni → se uită. Aici nu. La fiecare sesiune: citește board-ul activ +> de mai jos ÎNTÂI, mută `[ ]→[~]→[x]` pe măsură ce avansezi, commit-uiește schimbarea. +> Convenție: `[ ]` neînceput · `[~]` în lucru · `[x]` gata+verificat · `[!]` blocat. + +--- + +## ▶ BOARD ACTIV — Iterația 2 (Adventure Mode / restyle) + +Direcția cerută de user (decizii confirmate, vezi `HANDOFF.md`). Model hibrid ca la PR1: +părțile grele se prototipează în PARALEL în `scratch/`, verificate jucabile, apoi integrator le +portează în `escape-builder.html` (un singur fișier, integrare secvențială). + +- [ ] **S1 — fix sunet campanie** *(prioritar, rapid)* + Reinvestighează ÎNTÂI: `beep` E deja definit la `escape-builder.html:1725` în orchestrator + (devine `window.beep` → `parent.beep` ar trebui să rezolve). Ipoteza veche din HANDOFF + (beep nedefinit) pare GREȘITĂ. Suspect real: AudioContext `suspended` până la gest user, + sau context creat înainte de click „Începe aventura". Confirmă cauza în browser înainte de fix. +- [ ] **S2a — prototip Bomberman complet** → `scratch/bomberman-proto.html` + Standalone jucabil: dușmani cu AI urmărire, bombe plasabile + explozii în lanț, blocuri + distructibile, pericole, vieți + game-over + respawn fără pierderea progresului puzzle, + plasare ALEATOARE cufere/uși/blocuri. Păstrează `openPuzzle` pe uși roșii + cufăr auriu = scăpare. +- [ ] **S2b — prototip hartă overworld** → `scratch/overworld-proto.html` + Personaj top-down care intră pe ușă → încarcă camera → revine pe hartă. Înlocuiește coridorul + static. Respectă contractul campaniei: iframe per cameră, `parent.nextRoom`/`roomReady`. +- [ ] **S2c — `STYLES.md`** — direcție restyle pentru cele 5 stiluri individuale. +- [!] **S3 — integrare în `escape-builder.html`** *(blocat de S2a+S2b+S2c)* + Portează prototipurile (template literals → DUBLEAZĂ backslash-urile) + regenerează demo-urile. +- [!] **S4 — extinde `tests/smoke.mjs`** *(blocat de S3)* — bomberman, hartă, audio, regresie. + +**Stare la 2026-06-13:** PR1 livrat (`a42c960`, suita 21/21). Iterația 2 = neîncepută; +`scratch/` are doar artefacte PR1, fără proto-uri noi. + --- ## Post-PR1 (după ship-ul campaniei)