Blacksite/docs/adr/0008-editor-module-boundaries.md
Rbanh f29712d158
Some checks are pending
CI / Format, lint, test, build (push) Waiting to run
Initial project import
2026-06-05 21:44:45 -04:00

42 lines
2.3 KiB
Markdown

# ADR 0008: Editor Module Boundaries and lib/bin Split
## Status
Accepted
## Context
The in-process editor grew to ~15k LOC in a flat `src/` root with manual plugin tuples in `main.rs`. Stubs, domain logic, and UI cross-cuts lived side by side, making navigation, review, and repeat render-target bugs harder to prevent (see Outstanding Issues Audit Phase A).
## Decision
1. **lib + bin split:** `crates/editor` exposes `editor` as a library (`src/lib.rs`) with a thin binary (`src/bin/main.rs`) that calls `configure_editor_app` and `register_game_editor_plugins`.
2. **Domain modules** under `src/` with flat re-exports at the crate root for stable `crate::scene_io` paths:
- `scene/` — I/O, schema plugin, viewport render-target setup
- `viewport/` — camera, selection, gizmos, render views, panel settings
- `play/` — PIE session, editor mode state, net editor profiles
- `assets/` — catalog, asset DB, prefab overrides
- `project/` — workspace, project I/O, settings UI
- `ext/` — extensibility, BRP, command queue, game panel adapters, hot reload
- `history/` — undo commands + plugin (commands in submodule)
- `ui/` — egui shell (asset browser split into submodules)
3. **`EditorPluginGroup`** in `lib.rs` is the single ordered plugin registration surface. Order is documented in `docs/editor/architecture.md`.
4. **Shared `scene` crate** owns schema stamp/migrate/validate; editor save/load and `xtask validate-levels` both use it.
5. **Dependency rules:**
- `sim`, `protocol`, `settings`, `shared`, `scene` must not depend on `editor` or `bevy_egui`.
- `editor` may depend on `game`; `game` must not depend on `editor`.
- Game-specific editor panels register via `game::editor_ext::editor_panel_setups()`; editor wraps them as `EditorPlugin` (ADR 0007).
6. **Stub policy:** unwired modules live in domain folders (`net_editor`, `prefab_overrides` v2 fields), not at an ambiguous crate root.
## Consequences
- Third-party and game panels can embed or extend the editor library without forking the binary.
- Domain moves are incremental; flat re-exports avoid wide import churn.
- New workspace crates require an ADR update when they cross the dependency rules above.
- `cargo test -p editor` becomes viable as logic tests are added to the library.