comma-command
Run any command you have installed from any shell, as if it were a shell builtin:
$ gus, hello world
# → too talk gus -- hello world
Register an entry once. From then on, NAME, any words is the whole interface — no
aliases to source, no shell hook, no TUI.
Install
$ uv tool install comma-command # or: pipx install comma-command
$ comma init --write # puts the shim directory on PATH
$ exec $SHELL # or open a new terminal
Quickstart
$ comma add gus -- too talk gus --
added gus, → too talk gus --
$ comma add pyi -- uv run ipython --
added pyi, → uv run ipython --
$ gus, hello world # runs: too talk gus -- hello world
$ pyi, --pdb script.py # runs: uv run ipython -- --pdb script.py
$ comma ls
gus, too talk gus --
pyi, uv run ipython --
comma add does two things: writes the entry to ~/.config/comma/config.toml and
creates an executable named exactly gus, in ~/.local/share/comma/bin.
How it works
The shim is a multicall dispatcher — the same trick busybox and git use for
subcommands, applied to names:
gus,is a symlink to thecommaexecutable.commalooks atargv[0], sees a trailing comma, strips it, and findsgusin the config.- It calls
os.execvpe("too", ["too", "talk", "gus", "--", "hello", "world"]).
Because the final step replaces the process instead of spawning a child, the
target command inherits the terminal, stdin, signals and job control directly, and
its exit status reaches your shell unchanged. comma, adds no wrapping layer.
Why not the alternatives:
- Shell aliases/functions.
gus,is not a portable function name in bash or fish, and functions only exist in interactive shells you have sourced. command_not_found_handlehooks. Bash-only, collides with distro handlers (Nix, Debian's package suggestion hook), and silently does nothing in non-interactive shells,sh -c, cron, or most editors' task runners.- Shims on
PATH. Work everywhere a real executable works, includingxargs,find -exec, CI scripts, Makefiles and shell completion.
Configuration
~/.config/comma/config.toml — managed by comma, but hand-editable:
[commands.gus]
cmd = ["too", "talk", "gus", "--"]
# shorthand is fine too
[commands.pyi]
cmd = "uv run ipython --"
Arguments are appended verbatim, so -- at the end of cmd is the usual way to
keep flags from being swallowed by the target's own option parser.
Commands
| Command | What it does |
|---|---|
comma add NAME -- CMD... |
register a name and create its NAME, shim |
comma rm NAME |
unregister a name and remove its shim |
comma ls [--json] |
list registered names |
comma run NAME [--] [ARG...] |
run a name without going through the shim |
comma which NAME |
show the shim path and the command it runs |
comma init [--write] [--shell S] |
print or install PATH + completion setup |
comma doctor |
check config, PATH, shims and targets |
comma completion bash|zsh|fish |
print a completion script |
Names must be shell-safe words: letters, digits, ., _, +, -. The comma is
added for you, so comma add gus, -- ... is rejected rather than silently creating
gus,,.
Limits
- POSIX first. Windows needs a
.cmdshim layer, which is not in 0.1. - No per-command
env/cwdyet; usecmd = ["sh", "-c", "..."]as an escape hatch. - The
comma-commandcrate on crates.io is a name reservation for a future native binary; the Python implementation is the one to install today.
Development
$ uv venv && uv pip install -e '.[dev]'
$ uv run pytest
$ uv run ruff check .
MIT licensed.
Metadata
Release files for comma-command 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 | Provenance | |
|---|---|---|---|---|
| comma_command-0.1.0.tar.gz | 13.0 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| comma_command-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 25.2 kB
Release files / comma_command-0.1.0.tar.gz
| Download URL | comma_command-0.1.0.tar.gz |
|---|---|
| Size | 13.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3fc4e3371b799268fdb669760d7b592f115595360f618a82bc1e6aafa87d8293
|
|
BLAKE2b-256 checksum How to use checksums |
9520bc6790fbab1c5042ad02aef09b3a2043bf12b0c8454c061708dadd97ff4d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / comma_command-0.1.0-py3-none-any.whl
| Download URL | comma_command-0.1.0-py3-none-any.whl |
|---|---|
| Size | 12.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ea7eec925eac6c3d31c41516205260d301b2aa3b5bac215d2ab2c9feb14e07b3
|
|
BLAKE2b-256 checksum How to use checksums |
604ac8317712806b62e319279a3c8915dc5cd5f5757c17b3650124b314afea4b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for comma-command 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.