Files
escape-builder/CLAUDE.md
Claude Agent a42c960b46 QA #9 — suita completa 21/21 campanie E2E
tests/smoke.mjs: 8 teste @campanie implementate complet (test.skip inlaturat):
- E2E 5 camere cu stiluri rotite → final stele+litere
- Resume safeStore+djb2 (D3+D11)
- Camera moartă — timeout 4s → skip-banner+cod
- Eroare post-ready (D5 semantica ORICAND)
- Dublu-click idempotent (T4+D4)
- $/$& replace-functie (D1)
- 8+ camere beep (D2)
- 320x568 chrome-40px fara overflow (T6+TD4)

CLAUDE.md: ## Testing actualizat — comenzi npx directe, fara npm scripts;
21/21 status curent documentat.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-13 08:49:45 +00:00

3.7 KiB

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

Ce este

Generator de jocuri escape room: un singur fișier HTML (escape-builder.html), fără backend, fără build, fără dependențe. Același set de puzzle-uri se exportă în 5 stiluri de joc diferite (clasic/quiz, terminal retro, arcade pixel, story chat, point-and-click).

Dezvoltare

Nu există build sau lint. Produsul (HTML files) e vanilla HTML/CSS/JS, zero-dependențe.

# Verificare: deschide direct în browser (merge de pe file://)
# sau servește local:
python3 -m http.server 8000

Testarea manuală: deschide escape-builder.html, schimbă "Stil joc" și verifică preview-ul live (iframe), apoi exportă și verifică jocul standalone. Testele automate → vezi ## Testing.

Arhitectură

Toată aplicația trăiește în escape-builder.html, organizată în secțiuni comentate (stare, editor, preview, template-urile jocului exportat):

  • Stare: obiectul state (titlu, poveste, culoare, style, listă puzzles), persistat automat în localStorage sub cheia escape-builder-v1. Export/import ca JSON.
  • Editor (stânga): formularele scriu direct în state via data-g; orice modificare cheamă onChange() → persist + refresh preview cu debounce 400ms.
  • Preview (dreapta): refreshPreview() setează iframe.srcdoc = gameHTML(cleanState()) — preview-ul este exact jocul exportat, jucabil.
  • Generare joc: gameHTML(cfg) face dispatch pe cfg.style către cele 5 motoare: gameClassic, gameTerminal, gameArcade, gameChat, gamePoint. Fiecare motor returnează un string HTML complet, standalone (jocul exportat merge offline).

Cod partajat între motoare (injectat în HTML-ul generat):

  • libJS(cfg): CFG (config serializat), norm (normalizare răspuns: fără diacritice/majuscule, virgulă→punct), checkAnswer, starsFor (3/2/1 stele după încercări/indiciu), finalWord (literele puzzle-urilor formează cuvântul final), beep (WebAudio), confetti.
  • SNIP.*: fragmente de template partajate — baseCss, modal de întrebare (modalCss/Html/Js, folosit de arcade și point) și ecranul final (finalCss/Html/Js).

Tipuri de puzzle: free (răspuns liber), tf (adevărat/fals), choice (variante pe linii separate în choices, cea corectă prefixată cu *).

Testing

Harness Playwright în tests/smoke.mjs. Nu există package.json commitat — produsul rămâne zero-dependențe. Instalare dev o singură dată:

npm i -D @playwright/test && npx playwright install chromium

Rulare (fără npm scripts — direct npx):

npx playwright test tests/smoke.mjs --grep "@regresie"   # regresie: 13 teste
npx playwright test tests/smoke.mjs --grep "@campanie"   # campanie E2E: 8 teste
npx playwright test tests/smoke.mjs                      # suita completă: 21 teste

Status curent: 21/21 trec (13 @regresie + 8 @campanie).

Atenție la editare

  • Motoarele de joc sunt template literals mari — backslash-urile din codul generat trebuie dublate (\\u0300, \\n), iar codul generat folosește var/function clasic intenționat.
  • O schimbare în libJS/SNIP afectează toate cele 5 motoare; verifică fiecare stil în preview.
  • exemplu-*.html sunt jocuri demo exportate din builder (câte unul per stil). Nu le edita manual — după modificări la motoare, regenerează-le prin exportul din builder.
  • index.html e doar pagina de landing care leagă builder-ul și demo-urile.
  • node_modules/ (gitignored) e doar dev tooling Playwright. Produsul (fișierele HTML) rămâne zero-dependențe — merge offline de pe file://.