wodilist
A smarter replacement for ls with relevance sorting and git awareness. Answers what matters right now, not just what exists on the disk.
$ wodilist
src/ dir - 2h ago
main.py file 4.2K 47m ago
Makefile exec 1.1K 3d ago
README.md file 8.9K 3d ago
node_modules/ dir - 12d ago ← collapsed, de-emphasized
.git/ dir - 12d ago ← collapsed, de-emphasized
Inside a git repo:
$ wodilist
M auth.py file 6.1K 12m ago ← modified: floats up
? experiment/ dir - 5m ago ← untracked
main.py file 4.2K 3d ago
src/ dir - 3d ago
Install
pip install wodilist
wodilist is now on your PATH. It does not shadow Python's builtin list, that lives in the interpreter, not the shell.
Usage
wodilist [subcommand] [directory] [flags]
Default
wodilist # current directory
wodilist ~/projects # explicit directory
Groups by kind (dirs → executables → files → links), sorts each group by relevance.
Subcommands
| Command | Behavior |
|---|---|
wodilist recent |
Sort by mtime descending |
wodilist large |
Files only, sort by size descending |
wodilist dirty |
Git-modified and untracked files only |
wodilist entry |
Entry point files only (main.py, Makefile…) |
Flags
| Flag | Effect |
|---|---|
-a / --all |
Show hidden files |
--json |
JSON output (stable schema) |
--raw |
Tab-separated, no color (pipe-safe) |
--no-git |
Skip git status (faster in very large repos) |
--branch |
Show current git branch in header |
Machine output
--raw
Tab-separated. Five fields per line:
git_status name kind size_bytes mtime_unix
M auth.py file 6243 1714000123.456
- main.py file 4312 1713900000.000
git_status is - when clean or not in a git repo.
--json
{
"entries": [
{
"name": "auth.py",
"path": "/home/user/project/auth.py",
"kind": "file",
"size": 6243,
"mtime": 1714000123.456,
"ext": ".py",
"git_status": "M",
"relevance": 135.0,
"is_hidden": false,
"is_entry": false
}
],
"branch": "main"
}
Schema is stable. New fields may be added; existing fields will not be renamed or removed without a major version bump.
Failure behavior
- If git is unavailable or slow, list falls back to non-git mode automatically.
- If permissions prevent stat, entries are shown with size
-. - Errors never abort the listing unless the directory itself is unreadable.
Design
Relevance scoring
| Signal | Score delta |
|---|---|
| Git conflict | +110 |
| Git modified | +100 |
| Git added | +90 |
| Git untracked | +75 |
| Git deleted | +60 |
| Modified < 1 hour ago | +50 |
| Modified < 1 day ago | +35 |
| Modified < 1 week ago | +20 |
| Entry point file | +30 |
| Executable | +15 |
| Directory (non-noise) | +5 |
| Hidden file | −30 |
| Collapsed (noise) dir | −50 |
Git is always one call. git status --porcelain=v1 -z runs once. Status chars map to top-level directory entries automatically (files inside src/ mark src/ as modified).
Performance target: full pipeline (scan + score + format) < 50ms on a 200-file directory.
Architecture
wodilist/
├── scanner.py # filesystem scanning only
├── detect.py # TTY, CI, git-root detection
├── git.py # single-call git status
├── formatter.py # output only; no scanning
└── cli.py # argument parsing and dispatch
Rules:
- Scanner never formats
- Formatter never scans
- CLI never contains logic
- Git logic isolated to git.py
- Each module testable in isolation
Development
git clone https://github.com/calchiwo/wodilist.git
cd wodilist
pip install -e ".[dev]"
pytest
python benchmarks/bench.py
Compatibility
- Python 3.10+
- Linux, macOS, Windows
- Works in CI (non-TTY: no color, no ANSI)
- Works in pipes (
wodilist --raw | awk ...) - Respects
NO_COLORenv var - Zero runtime dependencies
Non-goals
- Recursive listing (use
findorfd) - Interactive UI
- Icons or emoji
- Per-file git calls
- Replacing
find,tree, ordu
Metadata
Release files for wodilist 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| wodilist-0.1.0.tar.gz | 11.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| wodilist-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 22.3 kB
Release files / wodilist-0.1.0.tar.gz
| Download URL | wodilist-0.1.0.tar.gz |
|---|---|
| Size | 11.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
64a1f1437ac49bee3938f941e9cc5a6acd6c986d98301fd877e72a8f44539111
|
|
BLAKE2b-256 checksum How to use checksums |
8e1ca03013e6368675a66768dd835c8464242c33b9ac782ac371e2c51dd4974e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.7
|
Release files / wodilist-0.1.0-py3-none-any.whl
| Download URL | wodilist-0.1.0-py3-none-any.whl |
|---|---|
| Size | 10.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
16f23a167ebc47b4dbca15223a5d5623c9b2d69dfb746fc314f2c7e7c748de8f
|
|
BLAKE2b-256 checksum How to use checksums |
05c0fb462b7d28f7ef0864ab5cdbdab366449201319702b06c59432c6c42a522
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.7
|