Skip to main content

wodilist

PyPI Version Python License: MIT

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_COLOR env var
  • Zero runtime dependencies

Non-goals

  • Recursive listing (use find or fd)
  • Interactive UI
  • Icons or emoji
  • Per-file git calls
  • Replacing find, tree, or du

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wodilist-0.1.0.tar.gz (11.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

wodilist-0.1.0-py3-none-any.whl (10.6 kB view details)

Uploaded Python 3

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

Hashes for wodilist-0.1.0.tar.gz
Algorithm Hash digest
SHA256 64a1f1437ac49bee3938f941e9cc5a6acd6c986d98301fd877e72a8f44539111
MD5 b9a88b709db59ce81b8d28bd267261fd
BLAKE2b-256 8e1ca03013e6368675a66768dd835c8464242c33b9ac782ac371e2c51dd4974e

See more details on using hashes here.

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

Hashes for wodilist-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 16f23a167ebc47b4dbca15223a5d5623c9b2d69dfb746fc314f2c7e7c748de8f
MD5 50ee11d60323944d5f7638a663aea6aa
BLAKE2b-256 05c0fb462b7d28f7ef0864ab5cdbdab366449201319702b06c59432c6c42a522

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page