69 lines
5.0 KiB
Markdown
69 lines
5.0 KiB
Markdown
# Feature: Конструктор симуляций (SimForge)
|
|
|
|
**Branch:** `feature/sim-builder`
|
|
**Base branch:** `master`
|
|
**Created:** 2026-06-13
|
|
**Status:** 🟡 In Progress
|
|
**Strategy:** Incremental
|
|
**Mode:** Automated
|
|
**Execution:** Orchestrator
|
|
|
|
## Summary
|
|
Полноценный движок авторинга интерактивных 2D-симуляций для учителя-непрограммиста.
|
|
Учитель собирает симуляцию из **данных** (JSON-спека): параметры-слайдеры, объекты
|
|
(фигуры/векторы/точки/подписи с LaTeX), привязанные **формулами** к параметрам и времени
|
|
`t`; настоящая физика (гравитация/пружины/столкновения/трение); графики; перетаскивание.
|
|
Сохраняет в БД, публикует в каталог лаборатории, раздаёт классу, открывает на доске
|
|
онлайн-урока, клонирует чужие и стартует из шаблонов.
|
|
|
|
Спека — это **данные, не код**. Движок выражений — безопасный (whitelisted-математика),
|
|
⛔ без `eval`/`Function`/доступа к DOM/глобалам: спека шарится между людьми.
|
|
|
|
## Build & Test Commands
|
|
- **Build:** нет (vanilla JS, без бандлера)
|
|
- **Test:** `npm test` (в `backend/`, `node --test tests/*.test.js`)
|
|
- **Lint:** `npm run lint:routes` (в `backend/`)
|
|
- ⚠️ После роутов/миграций: `npm run migrate` (живая БД) + рестарт сервера (авто-перезагрузки нет).
|
|
- ⚠️ `npm test` имеет baseline 3 pre-existing fail (auth.test.js) — хук толерантен (BASELINE_FAILS=3).
|
|
|
|
## Project Constraints (соблюдают ВСЕ агенты)
|
|
- ⛔ Никаких эмодзи в коде — только inline SVG `.ic`.
|
|
- Поиск по коду: `ast-index` (символы/usages/callers) + `vex` (semantic). НЕ Grep tool.
|
|
- БД — встроенный `node:sqlite` (`DatabaseSync`), НЕ better-sqlite3. Живая БД `backend/data/learnspace.db`.
|
|
- Frontend — vanilla JS, `window.LS.*` (js/api.js), без бандлера. Статика через Express.
|
|
- Стейджить файлы поимённо (НЕ `git add -A` — в репо много мусорных untracked).
|
|
- Движок выражений — безопасный парсер, не `eval`/`new Function`.
|
|
- Переиспользовать: LabRegistry, `_fx_motion`, `_graph_panel`, `_phys_visuals`, `_util`,
|
|
парсер `y=f(x)` из graph.js; паттерн раздачи из «Мои материалы»; `lab_sim_links`;
|
|
конвейер встраивания sim на доску (`simOpen/simState/simMode/simAnnotate`).
|
|
|
|
## Phases
|
|
|
|
- [x] Phase 0: Спека v1 + рантайм (формульные сцены) [domain: frontend] → [subplan](./phase-0-runtime-core.md)
|
|
- [x] Phase 1: Графики + интеракции [domain: frontend] → [subplan](./phase-1-plots-interactions.md)
|
|
- [x] Phase 2: Физический интегратор [domain: frontend] → [subplan](./phase-2-physics.md)
|
|
- [x] Phase 3: БД + API (custom_sims) [domain: backend] → [subplan](./phase-3-persistence-api.md)
|
|
- [x] Phase 4: Билдер (редактор) [domain: frontend] → [subplan](./phase-4-builder-ui.md)
|
|
- [x] Phase 5: Каталог (custom-sims в /lab) [domain: fullstack] → [subplan](./phase-5-catalog.md)
|
|
- [x] Phase 6: Раздача / шаблоны / клон / программа [domain: fullstack] → [subplan](./phase-6-sharing.md)
|
|
- [x] Phase 7: Доска онлайн-урока [domain: fullstack] → [subplan](./phase-7-classroom.md)
|
|
|
|
## Phase Progress Log
|
|
|
|
| Phase | Domain | Status | Review | Build | Committed |
|
|
|-------|--------|--------|--------|-------|-----------|
|
|
| Phase 0: Runtime core | frontend | ✅ Done | ✅ | ✅ | ✅ |
|
|
| Phase 1: Plots & interactions | frontend | ✅ Done | ✅ | ✅ | ✅ |
|
|
| Phase 2: Physics | frontend | ✅ Done | ✅ | ✅ | ✅ |
|
|
| Phase 3: Persistence + API | backend | ✅ Done | ✅ | ✅ | ✅ |
|
|
| Phase 4: Builder UI | frontend | ✅ Done | ✅ | ✅ | ✅ |
|
|
| Phase 5: Catalog | fullstack | ✅ Done | ✅ | ✅ | ✅ |
|
|
| Phase 6: Sharing | fullstack | ✅ Done | ✅ | ✅ | ✅ |
|
|
| Phase 7: Classroom | fullstack | ✅ Done | ✅ | ✅ | ✅ |
|
|
|
|
## Final Review
|
|
- [x] Comprehensive code review (final-reviewer) — READY TO MERGE, 0 critical
|
|
- [x] Security review — движок выражений безопасен (нет eval/доступа к globals), ownership/IDOR ок, SQL параметризован; ФИКС: вайтлист цветов в validateSpec (CSS-инъекция `color/bg` через style.cssText закрыта)
|
|
- [x] Full test suite passes (within baseline) — custom-sims 39/39; общий 241/249 (8 = baseline: 3 auth + 5 jsdom page)
|
|
- [ ] Merged to `master` — ОЖИДАЕТ одобрения пользователя
|