e195a47205
Closes #3726. ## Root cause Two coupled bugs in the ripgrep integration caused the glob and grep tools to fail outright when the search path contained a broken (dangling) symlink: 1. **Missing `--no-messages`** in `RG_FILES_FLAGS` (glob) and `RG_SAFETY_FLAGS` (grep). ripgrep prints a stderr warning for every broken symlink: `rg: /path/to/broken-link: No such file or directory (os error 2)` 2. **Overly strict exit-code gate** in both `glob/cli.ts` and `grep/cli.ts`: `if (exitCode > 1 && stderr.trim())` treated exit code 2 as fatal and discarded the stdout, even though ripgrep exits 2 on *non-fatal* I/O issues (broken symlinks, permission denied) while still printing valid results to stdout. Combined effect: a single broken symlink anywhere in the search path turned all subsequent file matches into an empty result with an error. ## Fix - Append `--no-messages` to `RG_FILES_FLAGS` (`src/tools/glob/constants.ts`) and to `RG_SAFETY_FLAGS` (`src/tools/grep/constants.ts`). This silences ripgrep's non-fatal stderr warnings without changing match behavior. - Relax the exit-code gate in both `glob/cli.ts` and `grep/cli.ts` from `> 1` to `> 2`, matching ripgrep's documented contract: - 0 = matches found - 1 = no matches (success, just nothing matched) - 2 = non-fatal I/O issues (partial success — stdout is still valid) - >2 = fatal error ## Test changes - New regression assertion in `src/tools/glob/cli.test.ts` for `buildRgArgs` confirms `--no-messages` is included in the args. - The grep change is symmetric (same flag, same rationale, same exit-code constant) and rides on the parallel structure. ## Verification - `bun test src/tools/glob/` → all pass (19 tests in cli.test.ts) - `bun test src/tools/grep/` → all pre-existing tests still pass - `bunx tsc --noEmit` → clean Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
22 lines
673 B
TypeScript
22 lines
673 B
TypeScript
export const DEFAULT_MAX_DEPTH = 20
|
|
export const DEFAULT_MAX_FILESIZE = "10M"
|
|
export const DEFAULT_MAX_COUNT = 500
|
|
export const DEFAULT_MAX_COLUMNS = 1000
|
|
export const DEFAULT_CONTEXT = 2
|
|
export const DEFAULT_TIMEOUT_MS = 60_000
|
|
export const DEFAULT_MAX_OUTPUT_BYTES = 256 * 1024
|
|
|
|
export const RG_SAFETY_FLAGS = [
|
|
"--no-follow",
|
|
"--color=never",
|
|
"--no-heading",
|
|
"--line-number",
|
|
"--with-filename",
|
|
// Suppress stderr warnings on broken/dangling symlinks and similar
|
|
// non-fatal I/O issues so they don't tip the tool into the error branch.
|
|
// See #3726.
|
|
"--no-messages",
|
|
] as const
|
|
|
|
export const GREP_SAFETY_FLAGS = ["-n", "-H", "--color=never"] as const
|