XeFM is organized so that the file-manager application, its tests, and its documentation stay cleanly separated. The rendering/UI toolkit is not vendored in this repo — XeFM depends on the external PuiKit framework.
xefm/
├── xefm/ # The `xefm` package — everything the app ships
│ ├── app.py # The application: XeFMApp + top-level UI (runs on PuiKit)
│ ├── __main__.py # `python -m xefm` entry point
│ ├── tools/ # End-user external programs (shipped as package data)
│ └── *.py # Business logic, imported as `xefm.<module>`
├── test/ # Unit / integration tests (test_*.py), run with pytest
├── doc/ # End-user docs (*_FEATURE.md, guides)
│ └── dev/ # Developer docs (*_IMPLEMENTATION.md, *_SYSTEM.md, plans)
├── tools/ # Internal dev/build utilities (*.py, *.sh)
├── macos_app/ # macOS .app packaging (see MACOS_APP_BUILD_SYSTEM.md)
├── windows_app/ # Windows packaging (see WINDOWS_APP_BUILD_SYSTEM.md)
├── temp/ # Throwaway work-in-progress files
├── pyproject.toml # Packaging metadata (flat layout, `xefm` console script)
├── Makefile # Build automation (run, test, venv, install-puikit, macos-app, ...)
├── requirements.txt # Python dependencies
└── README.md # Project overview and user guide
PuiKit itself lives in its own repository (../puikit) and is installed
editable into .venv/ via make install-puikit (PUIKIT_DIR ?= ../puikit). It
is not part of this tree.
xefm/)The application entry point and the top-level UI (the XeFMApp shell, the
dual FilePane layout, menus, and the main loop) live in xefm/app.py.
It imports PuiKit (from puikit import ...) and its sibling modules
(from xefm.config import ...). Those siblings, grouped by concern:
xefm/config.py — configuration system and user settingsxefm/const.py — application constants and key definitionsxefm/_config.py — default user-config template (copied to ~/.xefm/config.py)xefm/colors.py — color schemes and theme colorsxefm/path.py — extended Path supporting local, S3, and SSH/SFTP pathsxefm/s3.py — AWS S3 integration with pathlib compatibilityxefm/ssh.py, xefm/ssh_connection.py, xefm/ssh_config.py, xefm/ssh_cache.py — SSH/SFTP backend and connection/config cachingxefm/archive.py — archive creation/extraction and archive virtual directoriesxefm/file_pane.py — a single file pane widget (PuiKit Widget)xefm/pane_manager.py — dual-pane management and navigationxefm/file_list_manager.py — directory listing, sorting, filteringxefm/file_operations.py — copy / move / delete / rename operationsxefm/task.py — central Task / TaskManager and worker for threaded operationsxefm/progress_manager.py — progress tracking for long operationsxefm/progress_animator.py — configurable progress animationxefm/file_monitor_manager.py, xefm/file_monitor_observer.py — watchdog-based auto-reload of directory listingsxefm/input_dialog.py — single-line input (rename / mkdir / create)xefm/text_dialog.py — scrollable text / message dialogsxefm/filter_list_dialog.py — searchable list picker (favorites / drives / programs / jump)xefm/batch_rename_dialog.py — batch rename with regexxefm/progressive_search_dialog.py — filename / content search dialogxefm/isearch_bar.py — incremental-search barxefm/compare_dialog.py, xefm/compare_selection.py — compare-and-selectxefm/dialog_geometry.py — shared dialog sizing/anchoring helpersxefm/text_viewer.py — text viewer with pygments highlighting and isearchxefm/diff_viewer.py — file diff viewerxefm/directory_diff_viewer.py — directory diff viewerxefm/text_layout.py — text measurement / wrapping / layout helpersxefm/log_manager.py — unified logger (getLogger) with in-app log panexefm/logging_handlers.py — logging handlers (in-app log pane, remote)xefm/backend_detector.py — selects the PuiKit backend (terminal vs. native)xefm/state_manager.py — application state persistence and restorationxefm/str_format.py — string / size / date formatting helpersxefm/tools/ — end-user-facing external programs (preview, diff wrappers, …)test/)Unit and integration tests, discovered by pytest as test_*.py. Run them with
src (and the repo root, for the few tests that import xefm) on the path;
PuiKit is resolved through its editable install:
python -m pytest test/ # all
python -m pytest test/test_xefm_path.py -v # one file
make test runs the suite; make test-quick runs a fast subset. Interactive
demos are not here — PuiKit ships its own demos in ../puikit/demo/, which
should not be launched non-interactively (they block).
doc/)doc/*_FEATURE.md — end-user feature docs (usage, behavior)doc/dev/*_IMPLEMENTATION.md, *_SYSTEM.md — developer docs (design, internals)python -m xefm / make run — launch the file managerxefm console script — created on pip install (see setup.py)make venv / make install-puikit — create the venv and install PuiKit editable from ../puikitmake run / make run-gui — run XeFM (terminal / native)make test / make test-quick — run testsmake macos-app / make windows-app — build platform packagesmake clean — every rebuildable artifact, by running clean-python,
clean-macos and clean-windows. It keeps .venv/ and
windows_app/.cache/, since restoring those needs the network, and names both
when it finishes — remove them with make clean-venv / make clean-windows-cache.
The gitignored config files (Makefile.local, */signing.env, */store.env)
are never cleaned by anything.../puikit)pygments (syntax highlighting), boto3 (S3), watchdog (file monitoring)pyobjc (macOS native backend), windows-curses (Windows)pytest (tests), plus optional flake8 / black~/.xefm/config.py, created from xefm/_config.pyxefm/config.py, xefm/const.py, xefm/colors.py