feat(sim-builder): фаза 5 — каталог custom-sims в /lab (LabCustom: ленивая регистрация, секция, deep-link)

This commit is contained in:
Maxim Dolgolyov
2026-06-13 12:48:21 +03:00
parent a13c0b77fa
commit 1bee332ae1
6 changed files with 410 additions and 20 deletions
+34 -2
View File
@@ -1,6 +1,33 @@
# Feature Context: Конструктор симуляций (SimForge)
## Current State
- **Фаза 5 РЕАЛИЗОВАНА** (в рабочем дереве, не закоммичено — коммит за оркестратором). Только
**аддитивные** правки двух файлов параллельной сессии (без рефактора их кода): рабочее дерево
по ним было ЧИСТЫМ до начала. classroom.html / backend / `_sim_deps.js` НЕ тронуты.
- **`frontend/js/labs/lab-init.js`** (+7 строк): в начало `openSim(id)` добавлен хук
`if (window.LabCustom && LabCustom.resolveId) id = LabCustom.resolveId(id) || id;`
переводит deep-link/клик `custom:<dbid>` в реестровый id `customsim_<dbid>` (LabRegistry.get/has
обрезают часть после `:`, поэтому в реестре двоеточие недопустимо). Для встроенных id — no-op.
- **`frontend/js/labs/lab-glue.js`**: (а) `renderSims()` merge +`&& !m._custom` (custom не в
основной сетке) и вызов `LabCustom.renderSection(_catFilter)`; (б) init-блок (non-embed и embed)
зовёт `LabCustom.init()`, отложенное открытие `?sim=custom:*` до загрузки списка; (в) новый
IIFE **`window.LabCustom`** в конце файла.
- **Поток**: `LS.customSimsList()` (мета без spec) → `_registerLazy` кладёт в LabRegistry
манифест-заглушку `customsim_<dbid>` (`_custom:true`) с ленивым `open()`. Секция «Мои симуляции»
`#custom-sim-section` (создаётся динамически в `#lab-home`, без правок lab.html/CSS) рендерит
карточки из `_meta`. Открытие: `resolveId` → дисп. реестра → `open()` заглушки →
`ensureSpec(dbid)` (`LS.customSimGet`, кэш+дедуп) → `spec.id=regId``registerSpecSim(spec)`
(Ф0-адаптер, заменяет заглушку на месте) → `setActive(real)`+`real.open(ctx)` (монтирует SimEngine).
**spec лениво** — на старте /lab не грузится. Движок (`_sim_*`) уже eager (Ф0), ленивый файл не нужен.
- **Карточка**: preview-SVG + cat-бейдж + бейджи «Моя»(owner)/«Опубликована»(status)/«Черновик»
+ кнопки «Редактировать»→`/sim-builder?id=<dbid>` / «Удалить»→`LS.customSimDelete` (владельцу,
`owner_id===user.id`). Делегированный клик по `#custom-sim-section`. Иконки — inline SVG `.ic`.
- Верификация: `node --check` обоих изменённых файлов OK; эмодзи нет (скан кодпойнтов — только
math/box-drawing глифы ∑/═/─/→, как в существующем коде); eval/Function нет; headless-смоук
(vm + DOM/SimEngine/LS-стабы, РЕАЛЬНЫЕ `_registry.js`+`_sim_adapter.js`) 22/22: resolveId,
регистрация ленивых манифестов+флаг `_custom`, секция/карточки, бейджи, owner-only edit/del,
deep-link `data-open`, lazy spec→registerSpecSim→mount, reopen синхронно, delete, встроенные не сломаны.
git status: изменены только lab-init.js/lab-glue.js (+ плановые .md); classroom.html/backend чисты.
- **Фаза 4 РЕАЛИЗОВАНА** (в рабочем дереве, не закоммичено — коммит за оркестратором). Только
новые файлы `frontend/sim-builder.html` + `frontend/js/sim-builder.js` + аддитивная правка
`js/sidebar.js` (lab.html/lab-glue.js НЕ тронуты — зона параллельной сессии).
@@ -84,8 +111,13 @@
- Reuse > переписывание: сначала смотреть `_fx_motion`, `_graph_panel`, `graph.js`.
## RESUME STATE
- Последний коммит фичи: — (Ф0 + Ф1 + Ф2 + Ф3 + Ф4 реализованы, ещё не закоммичены — ждут оркестратора)
- Текущая фаза: Phase 4Builder UI (✅ Implemented, pending commit) → дальше Phase 5Каталог (custom-sims в /lab)
- Последний коммит фичи: — (Ф0 + Ф1 + Ф2 + Ф3 + Ф4 + Ф5 реализованы, ещё не закоммичены — ждут оркестратора)
- Текущая фаза: Phase 5Каталог (✅ Implemented, pending commit) → дальше Phase 6Раздача / шаблоны / клон / программа
- Файлы Ф5 (аддитивные правки зоны параллельной сессии — БЕЗ рефактора): `frontend/js/labs/lab-init.js`
(+7 строк: хук `LabCustom.resolveId` в `openSim`), `frontend/js/labs/lab-glue.js` (renderSims +`!m._custom`
и вызов renderSection; init зовёт `LabCustom.init()`; новый IIFE `window.LabCustom`). `_sim_deps.js`,
classroom.html, backend — НЕ тронуты. Публичное API: `window.LabCustom.{init,resolveId,renderSection,ensureSpec,del}`.
- id-неймспейс custom: deep-link/клик/`data-open` = `custom:<dbid>`; LabRegistry/host = `customsim_<dbid>`.
- Режим: Automated / Orchestrator / Incremental
- Файлы Ф4 (несведённые с параллельной сессией): `frontend/sim-builder.html` (new),
`frontend/js/sim-builder.js` (new), `js/sidebar.js` (modify, аддитивный пункт `/sim-builder`).