[Bug] Embedded `bfs`/`ugrep` not exposed in `Bash` tool (native macOS build 2.1.117+)
Bug Description
2.1.117 changelog claims that bfs and ugrep are available to the Bash tool on native-build macOS, but this transcript clearly shows that Claude cannot easily access them in its Bash tool environment on macOS zsh withoug shell aliases defined. This is a bug and defeats the purpose of the embedding.
Environment Info
- Platform: darwin
- Terminal: Apple_Terminal
- Version: 2.1.118
- Feedback ID: b325896e-8eba-404e-8668-0b74bf8b6108
Errors
[{"error":"Error: NON-FATAL: Lock acquisition failed for /Users/slz/.local/share/claude/versions/2.1.118 (expected in multi-process scenarios)\n at ai_ (/$bunfs/root/src/entrypoints/cli.js:2756:2177)\n at IK8 (/$bunfs/root/src/entrypoints/cli.js:2756:1257)\n at processTicksAndRejections (native:7:39)","timestamp":"2026-04-23T15:37:53.872Z"}]
---
Summary
The 2.1.117 changelog announced:
Native builds on macOS and Linux: theGlobandGreptools are replaced by embeddedbfsandugrepavailable through the Bash tool — faster searches without a separate tool round-trip
On my native 2.1.118 install, bfs and ugrep are not reachable from inside the Bash tool, so the replacement for Glob/Grep is effectively broken. The embedded binaries themselves exist and work — they're just not wired into the Bash tool's shell environment.
Reproduction (inside Claude Code Bash tool)
$ which bfs ugrep
bfs not found
ugrep not found
$ type bfs
bfs not found
$ type ugrep
ugrep not found
$ bfs --version
zsh: command not found: bfs
$ ugrep --version
zsh: command not found: ugrep
Not on $PATH, not a shell alias, not a shell function. Tested both inside tmux and in a fresh Apple Terminal session — identical result, so it's not a terminal-multiplexer issue.
**Confirmation that the embedded binaries do exist**
The Claude Code binary is a multi-call binary (BusyBox-style). Overriding argv[0] via exec -a dispatches to the embedded tool correctly:
$ exec -a bfs ~/.local/share/claude/versions/2.1.118 --version
bfs 4.1
Copyright © Tavian Barnes and the bfs contributors
No rights reserved (https://opensource.org/license/0BSD)
$ exec -a ugrep ~/.local/share/claude/versions/2.1.118 --version
ugrep 7.5.0 aarch64-apple-darwin23.6.0 +neon/AArch64; -P:pcre2; -z:zlib,bzip2,zstd,brotli,7z,tar/pax/cpio/zip
License: BSD-3-Clause
So bfs 4.1 and ugrep 7.5.0 are bundled inside the binary and fully functional — the harness just isn't exposing them to the shell spawned by the Bash tool.
Expected behavior
Per the changelog, bfs and ugrep should be invokable directly from the Bash tool (e.g., bfs . -name '*.ts', ugrep -r 'pattern'). This likely requires one of:
- Prepending a temp directory containing
bfs/ugrepsymlinks to the Claude binary onto$PATHwhen spawning Bash tool shells, or - Injecting shell functions/aliases into the Bash tool's shell init that
exec -ainto the Claude binary.
Impact
The old Glob and Grep tools were removed (per the changelog) on the assumption the Bash-tool path would replace them. On native macOS builds, neither path works, so there's effectively no built-in file/content search — users/assistants have to fall back to system find/grep/rg if those happen to be installed.
Workaround
Users can manually add aliases to their shell init:
alias bfs='"$SHELL" -c exec -a bfs ~/.local/bin/claude'
alias ugrep='"$SHELL" -c exec -a ugrep ~/.local/bin/claude'
Although I have not manually confirmed that this works.
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗