16 KiB
Bevy Forge v2 — план live-редактора
Статус: план на согласование. Работа начинается с M0, не с «полного редактора». Репозиторий: https://git.shanaty.ru/Emil_Shanaty/Bevy_Forge
1. Цель
Сделать встроенный live-редактор сцен для Bevy 0.20: реальный ECS, реальный рендер, иерархия, reflection-инспектор, selection/transform, gizmo, сохранение сцены и BSN-экспорт.
Это не клон Unity и не полный IDE. Это сфокусированный редактор сцен/уровней, который работает внутри игры и переиспользует уже готовый core v1.
2. Жёсткие решения
- Bevy 0.20, Rust 2021.
- Никакого egui и связанных крейтов:
egui,eframe,bevy_egui,egui_dock,bevy-inspector-egui,bevy_editor_pls, BIRP,transform-gizmo. - UI — родной Bevy UI:
bevy_ui;- официальный
bevy_ui_widgets0.20 (button, checkbox, text input, list, menu, dialog, modal, popover, radio, scroll area, slider, tabs); bevy_text,bevy_input_focus.
- Иерархия, инспектор, gizmo, docking/tree (позже) — свой код.
- v1 (standalone) не ломать. Новый редактор — отдельный crate в том же workspace.
- Внешние редакторские проекты не добавлять как зависимости.
bevy_ui_widgets— официальная часть Bevy, а не сторонний редактор. - v1 пока остаётся на egui как legacy. В v2 egui не должно быть даже транзитивно.
3. Что уже есть
crates/bevy_forge_core— сцены.forge.ron, компоненты, валидация, codegen BSN/Rust, project/config/history/assets.crates/bevy_forge_editor— standalone v1 на eframe/egui.crates/bevy_forge_cli—forgeCLI, scaffold, validate/export.compat/bsn-smoke— компиляция сгенерированного BSN против реального Bevy 0.20.examples/demo-project— 2D/3D сцены и текстуры.- Тесты:
cargo test --workspace— 346 passed, 1 ignored; baseline зелёный. - Документация:
README.md,docs/architecture.md,docs/format.md,docs/bsn-export.md.
Переиспользовать: core-модель, .forge.ron, валидацию, codegen, CLI, demo, лицензии.
Не переписывать: формат сцены, сериализацию, BSN-кодогенерацию без отдельного контракта.
4. Архитектура v2
Bevy Forge v2
├── crates/bevy_forge_runtime # новый live-плагин
│ ├── src/lib.rs # EditorPlugin, EditorState
│ ├── src/plugin.rs # режимы, системы, регистрация
│ ├── src/ui/ # Bevy UI: панели, тема, виджеты
│ ├── src/hierarchy.rs # ListBox, Children/ChildOf, selection
│ ├── src/inspector.rs # reflection-инспектор, свои виджеты
│ ├── src/gizmo.rs # transform gizmo, picking
│ ├── src/screenshot.rs # deterministic screenshot mode
│ └── examples/editor_spike.rs # demo app
├── crates/bevy_forge_core # переиспользуется
├── crates/bevy_forge_editor # v1 legacy, не ломать
└── crates/bevy_forge_cli # переиспользуется
EditorPlugin
EditorState:Enabled/Disabled,Selection,Mode(Edit/Paused/Playпозже).EditorPluginдобавляется в игру; в релизе выключается feature-флагом.- UI-панели — обычные Bevy UI ноды, фиксированная раскладка:
- слева hierarchy;
- справа inspector;
- снизу/сверху toolbar и status;
- центр — viewport (игра).
- Docking не делать в M0. Позже — свои tabs/split panes.
- Инспектор читает
Reflect/TypeRegistry; компоненты безReflectпоказываются read-only/Debug. - Gizmo — свой, на Bevy Gizmos + picking; не тащить
transform-gizmo. - Screenshot — встроенный deterministic mode: размер окна, ожидание кадров, PNG, exit.
- Scene save/load — через существующий core; BSN export — существующий codegen.
- Code editor (Helix/Vim) — не в M0. Сначала внешний запуск, встроенный PTY-терминал отдельным milestone.
Контракты M0
Зафиксировать до кода:
pub struct EditorPlugin;
pub struct EditorState { /* enabled, selection, ... */ }
pub struct Selection(pub Option<Entity>);
pub trait InspectorSource {
fn reflect_component(&self, entity: Entity) -> Option<&dyn Reflect>;
}
Плагины модулей регистрируются в lib.rs заранее:
.add_plugins((HierarchyPlugin, InspectorPlugin, GizmoPlugin, ScreenshotPlugin))
T01 создаёт заглушки HierarchyPlugin/InspectorPlugin/GizmoPlugin, чтобы T02–T04
не редактировали один lib.rs.
5. Scope и non-goals
Входит в v2 core
- live иерархия и selection;
- reflection-инспектор для Transform/Name/Visibility и примитивных полей;
- translate gizmo (позже rotate/scale);
- editor camera;
- save/load сцены
.forge.ron; - BSN export;
- undo/redo;
- play/pause;
- asset browser (базовый);
- deterministic screenshots;
- документация и тесты.
Не входит
- modeling/скульптинг (это Blender);
- полноценный code IDE внутри UI;
- multi-world/полный Unity play mode;
- сетевой collaborative editing;
- поддержка всех кастомных компонентов без
Reflect; - встроенный терминальный редактор в M0–M3;
- миграция v1 на Bevy UI в этом плане (v1 остаётся legacy).
6. Milestones и бюджет
Бюджет — верхняя оценка, а не обещание. Считать по фактическим токенам и запросам.
Ориентир: прямой deepseek-flash, off-peak, без Polza.
| Milestone | Результат | Запросы | Output | Ожидаемо | Hard cap |
|---|---|---|---|---|---|
| M0 Spike | plugin + UI shell + hierarchy + inspector + один gizmo + screenshot | 200–300 | 0.3–0.5M | $1.5–2.5 | $2.5 |
| M1 Core | selection, transform, undo/redo, save/load, editor camera | 400–700 | 0.8–1.5M | $2.5–5 | $5 |
| M2 Live | play/pause, assets, real render, BSN export, file watch | 500–900 | 1.0–2.0M | $2.5–5 | $5 |
| M3 Hardening | tests, UX, sizes, docs, performance | 300–600 | 0.6–1.2M | $1–3 | $3 |
| Итого core | 1 400–2 500 | 2.7–5.2M | $7.5–14 | $15.5 |
Отдельно, только после core:
| Опция | Оценка |
|---|---|
| Внешний запуск Helix/Vim + file watch | $0.5–1 |
| Встроенный PTY-терминал (Helix/Vim) | $4–8, 600–1000 запросов |
| Neovim RPC backend | $3–6 |
Правило: milestone не начинается, пока предыдущий не принят verifier'ом и не записан фактический расход.
7. M0 — детальный план
Состав
- Lead: workspace, manifest, docs, integration, final gate.
- Implementer A: T01 runtime shell + T02 hierarchy.
- Implementer B: T03 inspector + T04 gizmo/screenshot (после T01 contract).
- Verifier V01: независимая проверка, без участия в коде.
- Максимум 2 implementer'а + 1 verifier. Не swarm.
Задачи
| ID | Задача | Write scope | Зависит |
|---|---|---|---|
| LEAD | workspace manifest, пример, docs M0, интеграция | Cargo.toml, docs/m0-spike.md, crates/bevy_forge_runtime/examples/** |
— |
| T01 | runtime crate, EditorPlugin, UI shell, тема, заглушки плагинов |
crates/bevy_forge_runtime/Cargo.toml, src/lib.rs, src/plugin.rs, src/ui/** |
— |
| T02 | hierarchy ListBox, Children/ChildOf, selection, scroll | src/hierarchy.rs |
T01 |
| T03 | reflection-инспектор: Name, Transform, Visibility, primitives | src/inspector.rs |
T01 |
| T04 | editor camera, translate gizmo, deterministic screenshot | src/gizmo.rs, src/screenshot.rs |
T01 |
| V01 | независимая проверка M0 | .swarm/reviews/** (вне продукта) |
T01–T04 |
T01 сначала коммитит каркас, контракты и заглушки плагинов; только после этого B начинает
T03/T04. Каждый implementer добавляет focused-тесты для своего модуля; LEAD запускает
общий gate. Не делить один lib.rs между T02–T04.
M0 acceptance
cargo check -p bevy_forge_runtime— без ошибок.cargo test -p bevy_forge_runtime— тесты зелёные.cargo tree -p bevy_forge_runtime -i egui— пусто/ошибка «package not found».cargo tree -p bevy_forge_runtime -i bevy_egui— пусто.cargo run -p bevy_forge_runtime --example editor_spike— открывается, editor toggle работает.- Hierarchy показывает сущности сцены; клик меняет selection.
- Inspector показывает Name/Transform/Visibility; изменение
Translation.xприменяется к ECS и видно в gizmo. - Gizmo отображается и двигает выбранную сущность (хотя бы translate).
- Screenshot mode сохраняет PNG в 1440×900 и 1000×640.
- Нет изменений в core/v1, кроме необходимых shared manifest (LEAD).
- README/
docs/m0-spike.mdописывают запуск и ограничения.
M0 verification
V01 получает diff, acceptance-команды и скриншоты. Не читает отчёт Implementer'а как истину. Проверяет:
- отсутствие egui в дереве runtime-крейта;
- реальный запуск и два скриншота;
- selection → inspector → ECS;
- gizmo;
- отсутствие out-of-scope правок;
- читаемость кода и отсутствие «заглушек вместо функционала».
M0 stop-rules
Остановиться и вернуться к плану, если:
- 70% cap израсходовано, а acceptance не собран;
- output >0.5M или запросов >300;
- средний input >80k на запрос;
- egui всё же попал в dependency tree;
- hierarchy/inspector требуют переписывать core;
- verifier нашёл критический дефект архитектуры, а не отдельный баг.
8. M1–M3 — кратко
M1 Core
- selection API и multi-select (если дёшево);
- Transform editing с undo/redo (command stack);
- save/load
.forge.ronчерез core; - editor camera: pan/zoom/orbit;
- горячие клавиши: delete, duplicate, focus, save;
- unit-тесты на selection/undo/save;
- без docking и без терминала.
M2 Live
- play/pause без потери сцены (snapshot/restore);
- asset browser: список файлов, превью, drag в сцену;
- реальный рендер сцены, не wireframe;
- BSN export из UI;
- file watcher и hot reload;
- базовая валидация сцены.
M3 Hardening
- размеры 1440×900, 1280×720, 1000×640;
- keyboard/focus/IME;
- пустые/ошибочные состояния;
- производительность hierarchy/inspector;
- README,
docs/editor.md, лицензии; - финальный независимый review.
9. Токен-бюджет и процесс
- Новый чат на каждый milestone. Не тащить историю v1.
- 2 implementer'а + 1 verifier на M0/M1; 3+1 на M2; без 30 агентов.
- Файлы до ~800 строк; если больше — split до dispatch.
- Targeted tests; полный
cargo test --workspace— только lead на финале. - Freeze перед verify; после фиксов — delta-review, не полный re-review.
- Кэш: стабильный префикс system/tools/skills; не менять без причины.
- Off-peak: после 13:00 МСК, до 04:00, выходные.
max_tokensиreasoning_effort: lowдля механических задач.- Прямой API,
deepseek-flash; не Polza. - Бюджет записывать в
state.json/budget.md: requests, input hit/miss, output, USD.
Stop-rules (общие)
- 70% cap без принятого milestone → стоп.
- output >2k/запрос или input >80k/запрос → пересобрать контекст.
- verifier rejection >30% → проблема в брифах/контрактах.
- Появился egui/сторонний редактор в runtime-крейте → стоп и убрать.
10. Открытые вопросы
bevy_ui_widgets— официальная часть Bevy 0.20, не сторонний редактор. Оставляем? Если нет — делаем кнопки/поля/списки полностью вручную; это дороже.- v1 оставляем legacy на egui или потом отдельно мигрируем/удаляем? В v2 egui не используется в любом случае.
- Linux-first? Скриншоты/запуск сначала на Linux, потом macOS/Windows.
- Ветка
v2-live-editor; main не ломаем. - Нужен ли full docking в v2.0 или фиксированные панели достаточно? По плану — фиксированные панели; docking позже.
11. Промпт для нового чата
Прочитай docs/plan-v2.md в репозитории Bevy_Forge и начни с M0 Spike.
Repo: https://git.shanaty.ru/Emil_Shanaty/Bevy_Forge
Ветка: v2-live-editor. v1 не ломать, core/codegen/CLI переиспользовать.
Сначала:
1. Prerequisite gate: rust/cargo, Bevy 0.20, display/screenshot; ничего не устанавливать
без разрешения; если чего-то нет — спросить.
2. Прочитать README, docs/architecture.md, docs/plan-v2.md, Cargo.toml.
3. Показать 5–6 задач M0 с write scope, acceptance и оценкой запросов.
4. Дождаться подтверждения, затем делать.
Ограничения:
- никакого egui/eframe/bevy_egui/egui_dock/bevy-inspector-egui/bevy_editor_pls/BIRP;
- UI только Bevy UI + официальный bevy_ui_widgets 0.20;
- hierarchy/inspector/gizmo — свой код;
- M0: plugin + UI shell + hierarchy + Name/Transform/Visibility inspector +
один translate gizmo + screenshot 1440×900 и 1000×640;
- cap $2.5, 200–300 запросов, ≤0.5M output; direct deepseek-flash, off-peak;
- 2 implementer'а + 1 verifier, без swarm;
- остановиться на 70% cap или при появлении egui в дереве.
После M0: отчёт с фактическими requests/input/output/USD, скриншотами и вердиктом
verifier'а. Не начинать M1 без принятого M0.