Concepts¶
Commando is built on one small idea, applied consistently. Understanding it makes every feature feel obvious.
Entries and providers¶
Everything in the fuzzy list is an entry — a searchable command with an optional set of variables to fill in. Every source of commands is a provider that emits entries in that same shape:
┌─────────────────── providers ───────────────────┐
bookmarks cheats project(make/npm/…) history
└────────────────────┬─────────────────────────────┘
▼
merge + dedup + frecency rank
▼
fuzzy TUI
▼
resolution engine ◄──► plain-file state (memory + usage)
(optional [] · multi · memory · command preview)
▼
assembled command
▼
shell prompt (review) │ --exec (run now)
Because the four sources all produce the same kind of entry, the hard part — resolving a template into a command — is written once and works for all of them. Adding a capability is a matter of a new provider or a new resolver feature, not a new special case.
The four shipped sources:
| Source | What it contributes |
|---|---|
| Cheat sheets | Hand-authored, parameterized command templates. |
| Project | Commands detected from the folder you're in (make, npm, cargo, …). |
| History | Commands read live from your shell's history file. |
| Bookmarks | Commands you explicitly saved, with tags and notes. |
Design principles¶
These are the tie-breakers behind Commando's behavior:
- One resolution engine, many sources. Cheats, project commands, history, and bookmarks are all just providers emitting the same entry shape.
- The shell owns execution. Commando assembles a command and hands it to
your shell's line editor. It does not
fork/execby default — otherwisecd, environment variables, and aliases wouldn't stick, and you couldn't edit before running. - Everything is a plain file. No database. Every piece of state is
human-readable TOML you can
cat,grep, and edit. - Zero-config is useful; config is powerful. In any folder with no setup,
Commando already surfaces your project's
make/npm/gradletargets and frequent commands. Configuration unlocks custom providers and cheat sheets.
The resolution flow¶
When you pick an entry with variables, Commando walks its template and, for each
placeholder, decides a value — from a candidate list, a default, your typed
input, or a remembered value. Optional [...] segments are dropped wholesale if
you skip their variable. The assembled command is what lands on your prompt.
The engine is deliberately UI-agnostic: the same resolution logic could drive a different front-end in the future without change.
Where things live¶
| Path | Holds |
|---|---|
~/.config/commando/config.toml |
Key binding, redaction denylist, custom providers |
~/.config/commando/cheats/*.toml |
Cheat sheets |
~/.config/commando/bookmarks.toml |
Saved commands + tags/notes |
~/.local/share/commando/memory.toml |
Remembered variable values (frecency) |
~/.local/share/commando/usage.toml |
Per-entry launch counts (ranking) |
~/.local/share/commando/data/ |
Auxiliary data files cheats can read ($COMMANDO_DATA_DIR) |
your $HISTFILE |
Shell history — read live, never copied |
See Files & storage for the full reference.