Skip to content

The Bleep 4.0.5

Latest

Choose a tag to compare

@stamparm stamparm released this 13 Oct 10:41
· 2 commits to master since this release

This release went looking for where The Bleep is wrong rather than where it
could do more. Seven separate reviews -- the engine, security, real shells,
the rules against today's tools, the release machinery, latency and the
product -- each had to show a reproduction for every finding, and every one
of those findings is fixed here. Upgrading is recommended for anyone using
auto_run_confidence, fish, xonsh or PowerShell.

uv tool install --upgrade thebleep   # or: pipx upgrade thebleep

Security

A repository you clone could, before this release, make a typo run its own
code. A bin/gti in the clone turned gti status into ./bin/gti status at
90%, which auto_run_confidence = 0.9 ran without asking, and the agent hooks
passed it to the agent. Anything the working directory supplies -- its own
programs, its shipped corrections -- is now marked as such: shown, never run
unasked, never handed to an agent or the MCP server.

Quoting was POSIX quoting everywhere, which fish and xonsh read differently: a
backslash inside single quotes is an escape there, and a script name out of a
package.json ran touch through npm run in fish. PowerShell ends a string
at a curly quote too. Each shell now quotes the way it reads, and a test hands
every shell's quoting back to that shell. Replaying a command to read its
output no longer sources config.fish, ~/.zshenv or ~/.tcshrc, and a fish
function of your own is asked about before it runs again.

Answers that were confidently wrong

git push origin mastr in a repository with commits became git commit -m "Initial commit" && git push origin mastr at 95% -- now it is git push origin master. An existing branch was offered for deletion first, -d
quietly became -D, and the history rule offered git push --force for a
mistyped branch. Rules that guess from a whole list (every docker command,
every script in package.json) have to be near what you typed, so docker shell is no longer docker save.

Rules for the tools as they are today

Re-captured against current releases: systemd's did you mean, pnpm 9, 10 and
12, git 2.53's bisect and remote, cargo 1.85, Fedora's yum as dnf5,
python -m pip, and the apt install line command-not-found prints, which a
pipx or uv install could not read at all. New: divergent git pull, git push orign and git pull origin mian, misspelt package names for apt, dnf and
pacman, and cobra's unknown flags in kubectl and docker.

A number nobody tuned

The README's hit rate was 100% on the corpus the rules were written against,
which says only that they do what they were written to do. Beside it now:
121 typos captured afterwards from real tools, expectations written first and
never edited to agree, answered offline -- 89/121, against The Fuck's 56/121.
The misses are listed by bench/hit_rate.py; they are the work still to do.

Shells

ksh, xonsh and Elvish are supported, and the compatibility table now has a
Git Bash row, recorded on a Windows runner -- which found Git Bash being
handed C:\Users\... paths it cannot use, and --version there reporting
WSL's stub instead of bash. After bleep the shell's status is what the
correction exited with, not always 0. The first bleep in a ksh
session no longer hangs. History is written the way zsh and fish read it, a
command typed after a space under ignorespace is no longer confused with the
one before, and pip freez is corrected without the question about running it
again.

Faster on big machines, and a safer release

A million-line history cost up to two seconds a correction; it is read to
10000 lines. Large output is kept as its first and last parts, not 8 MB. The
warm server answers bash and fish through socat or nc -U, in about 8 ms.
And the release itself now waits for the full test matrix on every platform
before anything reaches PyPI.

The full list is in the changelog.