From 4be3fbde50951c803746724ab59f20ff4f56c749 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Sat, 13 Jun 2026 13:55:50 +0300 Subject: [PATCH] =?UTF-8?q?feat(sim-builder):=20=D1=83=D0=BB=D1=83=D1=87?= =?UTF-8?q?=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20P1=20=E2=80=94=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=87=D0=B5=D0=B5=20=D0=BF=D0=BE=D0=BB=D0=B5:=20?= =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D1=81=D0=BC=D0=B5=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20(=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB?= =?UTF-8?q?=D1=8B=20=D0=BE=D0=B2=D0=B5=D1=80=D0=BB=D0=B5=D0=B5=D0=BC),=20?= =?UTF-8?q?=D1=81=D0=B5=D1=82=D0=BA=D0=B0/=D0=BE=D1=81=D0=B8=20=D1=81=20?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=D0=BC=D0=B8,=20zoom/?= =?UTF-8?q?pan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLAUDE.md | 13 + frontend/js/labs/_sim_engine.js | 512 +++++++++++++++++++++++------- plans/sim-builder/CONTEXT.md | 22 ++ plans/sim-builder/IMPROVEMENTS.md | 63 ++++ 4 files changed, 499 insertions(+), 111 deletions(-) create mode 100644 plans/sim-builder/IMPROVEMENTS.md diff --git a/CLAUDE.md b/CLAUDE.md index 2ed5705..0863a0b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -133,3 +133,16 @@ git push origin master - **simId с двоеточием ломал бэкенд-валидацию.** `simOpen` валидировал `^[a-z0-9_-]{1,40}$` — двоеточие в `custom:5` не проходило. Добавлена ветка `^custom:(\d+)$` + проверка доступа (own|published|admin → иначе 404/403). Доступ дублируется на `GET /custom-sims/:id` (ensureSpec в iframe) — две линии обороны, чужой draft не утечёт. - **Закрытие = `frame.src='about:blank'` сносит весь iframe-документ** (SimEngine, rAF, listeners, `_simStateRegistry`) — явный `destroy()` в классруме не нужен, чисто по построению. Смена sim — тот же сброс src + новый load. - **classroom.html (8240 строк) — искать через vex по DOM-id** (`cr-sim-picker-grid`, `cr-sim-frame`), затем точечный Read. ast-index НЕ индексирует inline-`