A smarter replacement for ls with relevance sorting and git awareness.
Project description
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file wodilist-0.1.0.tar.gz.
File metadata
- Download URL: wodilist-0.1.0.tar.gz
- Upload date:
- Size: 11.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
64a1f1437ac49bee3938f941e9cc5a6acd6c986d98301fd877e72a8f44539111
|
|
| MD5 |
b9a88b709db59ce81b8d28bd267261fd
|
|
| BLAKE2b-256 |
8e1ca03013e6368675a66768dd835c8464242c33b9ac782ac371e2c51dd4974e
|
File details
Details for the file wodilist-0.1.0-py3-none-any.whl.
File metadata
- Download URL: wodilist-0.1.0-py3-none-any.whl
- Upload date:
- Size: 10.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
16f23a167ebc47b4dbca15223a5d5623c9b2d69dfb746fc314f2c7e7c748de8f
|
|
| MD5 |
50ee11d60323944d5f7638a663aea6aa
|
|
| BLAKE2b-256 |
05c0fb462b7d28f7ef0864ab5cdbdab366449201319702b06c59432c6c42a522
|