Files
cd-browser/docs/architecture.md

192 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# cd-browser Architecture
Author: Saky
This document describes the architecture of the `cd-browser` terminal
navigation tool.
------------------------------------------------------------------------
# 1. Purpose
`cd-browser` provides a keyboarddriven terminal interface to explore
directories and return a selected path to the shell.
It solves a limitation of shells:
A program cannot directly change the parent shell directory.
Instead:
1. The application returns a path
2. A shell wrapper performs `cd`
------------------------------------------------------------------------
# 2. High Level Architecture
The project follows a layered architecture:
CLI Layer ↓ UI Layer ↓ Navigator Layer ↓ Filesystem Layer
History is used by the navigator.
------------------------------------------------------------------------
# 3. Modules
## filesystem.py
Responsibilities:
- inspect filesystem
- list directories
- detect children directories
Core structures:
DirectoryEntry
Functions:
list_directories() has_subdirectories()
------------------------------------------------------------------------
## history.py
Handles navigation history.
Features:
- visit(path)
- back()
- forward()
- select()
Used by navigator.
------------------------------------------------------------------------
## navigator.py
Core state machine of the application.
Tracks:
- current_path
- visible directory entries
- selected index
- expanded nodes
Handles:
- entering directories
- parent navigation
- tree expansion
- history integration
------------------------------------------------------------------------
## ui.py
Terminal interface using curses.
Responsibilities:
- render directory list
- highlight selection
- process keyboard input
Keys used:
↑ ↓ navigation → expand ← collapse ESC exit
------------------------------------------------------------------------
## cli.py
Application orchestrator.
Responsibilities:
- create navigator
- start terminal UI
- capture resulting path
------------------------------------------------------------------------
## main.py
Entrypoint.
Responsibilities:
- initialize logging
- start CLI flow
- print final path
------------------------------------------------------------------------
# 4. Shell Integration
Shell wrapper function:
cd\_() { local target target="$(cd_browser)"
if [ -n "$target" \] && \[ -d "$target" ]; then
cd "$target" fi }
This enables:
cd\_
to change the working directory.
------------------------------------------------------------------------
# 5. Terminal Handling
The application attaches its UI to:
/dev/tty
This allows the UI to function even when stdout is captured by shell
substitution.
stdout is reserved for:
final directory path
stderr is used for logging.
------------------------------------------------------------------------
# 6. Validation
Quality tools ensure correctness:
black -- formatting\
ruff -- linting\
mypy -- type checking\
pytest -- testing
Commands:
make fix make quality make ci
------------------------------------------------------------------------
# 7. Extensibility
Future improvements:
- enhanced navigation model
- fuzzy search
- bookmark directories
- persistent history
- configuration file
------------------------------------------------------------------------
# End