OwlCommanderWindows file commander

The final architecture and product contract.

OwlCommander is a full graphical file manager, not a TUI skin. The boundaries below must be recorded in docs/decisions/ before they change, and dependencies only flow downward.

Dependencies flow downward only.

The GUI may never touch std::fs or the Windows Shell directly; the engine may never reference GPUI types; COM details never escape their adapter.

gpui-shellWindow · Menu · Dock
WindowTitleBarMenuTabsSidebarDockDialogNotification
yazi-gui-uiGPUI views
FileViewportPreviewPaneOperation UISearchSettingsPluginHost
yazi-gui-applicationstate
ReducerAction dispatcherWindow sessionCommand registryDTO
yazi-gui-bridgestable boundary
Engine APIEvent streamRequest cancellationPlugin UI IRprivilege boundary
yazi-enginefrozen fork · headless core
CoreVFSFSSchedulerWatcherPluginRunnerConfigDDS
platform-windowsadapter
COM ShellIFileOperationRecycle BinD&DThumbnailsfile associationsIME
Plugins and the GUI exchange only GuiEvent, GuiCommand, GuiView (a restricted serialized UI description) and file DTOs.

Eleven crates, one clean path.

Every crate has a single responsibility; test doubles live in testkit.

app

yazi-gui-app

main, initialization, window lifecycle, dependency injection.

ui

yazi-gui-ui

GPUI Entities, views, theme and component assembly.

ui

yazi-gui-viewport

High-performance FileViewport: list, grid, rubber-band select, drag & drop.

ui

yazi-gui-preview

PreviewController and text/image/media/archive presenters.

app

yazi-gui-application

Commands, reducers, window/tab session.

bridge

yazi-gui-bridge

Engine facade, DTOs, event protocol, cancellation.

engine

yazi-gui-engine

UI-free engine extracted and wrapped from vendor/yazi.

engine

yazi-gui-plugin-host

Lua runtime, Yazi plugin adapter, GuiView IR.

data

yazi-gui-storage

SQLite: workspace, history, favorites, layout, cache index.

plat

yazi-gui-platform

Platform traits — pure interfaces plus test fakes.

plat

yazi-gui-platform-windows

Windows implementation; COM never escapes.

test

yazi-gui-testkit

Virtual filesystem, time, Shell, drag & drop and screenshot doubles.

There is exactly one write path.

Every OperationPlan is preflighted before it starts: capabilities, same-path conflicts, identical source/target, permissions, disk space and overwrites.

INTENT

With RequestId

Every request carries a RequestId, LocationRevision and CancellationToken.

PLAN

Preflight

Capabilities, conflicts, same source/target, permissions, space, overwrites; failures are rejected, never degraded to silent overwrite.

DISPATCH

Sole write authority

Chooses IFileOperation under WindowsShellLocal or the Yazi VFS executor.

EXECUTE

Cancellable

Progress lands in the task center; late results are discarded by revision.

Delete semantics: local deletes prefer the Recycle Bin; non-local providers go through the Yazi VFS executor; a non-recoverable delete is never presented as "recycling".

32 recorded boundaries and acceptances.

Before changing an architectural boundary or safety semantic, a decision must be recorded here.

No. Decision Area

The door every commit must pass.

.\scripts\bootstrap.ps1 -VerifyOnly
cargo +1.98.0 test --locked --offline
cargo +1.98.0 clippy --locked --offline -- -D warnings
git diff --check

Formatting uses cargo +1.98.0 fmt. UI work stays non-blocking; STA COM/OLE stays pinned to the documented broker thread; COM interface pointers never cross threads.

One frozen baseline.

UPSTREAM_LOCK.json, Cargo.lock and .cargo/vendor form a single non-drifting baseline. No cargo update, no floating Git dependencies, no edits to vendored upstream source — unless an explicit upgrade/patch decision says so.

vendor/yazi
frozen engine source
vendor/gpui-component
reviewed component source
vendor/zed
audit-only; the app never depends on it
rust-toolchain
1.98.0 · offline locked builds