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

2.3 KiB

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.