Skip to content

ADR 005 — Python + Click for the CLI extensions

Status

Accepted

Context

A handful of daily chores — pruning branches, rebasing onto the default branch, redeploying hooks, freeing ports — deserve first-class commands with proper argument parsing, defaults, help text and consistent output. Writing these as raw shell functions makes option handling and error reporting tedious and inconsistent.

Decision

Implement the helpers as Python 3 scripts using Click, grouped into two command groups — git_ext (bclean, rfrom, rhooks) and sys_ext (uport, kport) — and surface them as .zshrc aliases. Commands read defaults from environment variables (GIT_DEFAULT_BRANCH, GIT_PATH_CONFIG, GIT_PATH), shell out to git/lsof/kill via subprocess, log through a shared colorlog logger, and expose a --debug flag that re-raises the underlying error.

Consequences

  • Pros: Free --help, argument validation, defaults and subcommands from Click. Output colour matches the bash orchestrator's palette, so the whole toolkit feels uniform. Environment-driven defaults make the commands behave like native Git subcommands.
  • Cons / trade-offs: Adds a Python + click + colorlog runtime dependency to what is otherwise a shell tool (installed by the pyenv step, creating a soft ordering dependency). Shelling out to git/lsof parses text output, which is brittle across versions. Some validation is imperfect (e.g. the check_port bounds check) and there is no test coverage.
  • Alternatives rejected: Pure shell functions/aliases (poor option parsing and error handling) and Git's own alias mechanism (fine for one-liners like st/tree, but not for multi-step logic with prompts and branch inspection).