From cec148f8741eab836fafb1c13a88dc18e3ed1a6d Mon Sep 17 00:00:00 2001 From: ismeth Date: Sat, 28 Feb 2026 01:43:47 +0100 Subject: [PATCH] fix(glob): use cwd-relative search for ripgrep to fix directory prefix patterns Ripgrep's --glob flag silently returns zero results when the search target is an absolute path and the pattern contains directory prefixes (e.g. 'apps/backend/**/*.ts' with '/project'). This is a known ripgrep behavior where glob matching fails against paths rooted at absolute arguments. Fix by running ripgrep with cwd set to the search path and '.' as the search target, matching how the find backend already operates. Ripgrep then sees relative paths internally, so directory-prefixed globs match correctly. Output paths are resolved back to absolute via resolve(). --- src/tools/glob/cli.ts | 8 ++++---- src/tools/glob/tools.ts | 3 +-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/tools/glob/cli.ts b/src/tools/glob/cli.ts index b621383a6..996133383 100644 --- a/src/tools/glob/cli.ts +++ b/src/tools/glob/cli.ts @@ -1,3 +1,4 @@ +import { resolve } from "node:path" import { spawn } from "bun" import { resolveGrepCli, @@ -119,10 +120,9 @@ async function runRgFilesInternal( if (isRg) { const args = buildRgArgs(options) - const paths = options.paths?.length ? options.paths : ["."] - args.push(...paths) + cwd = options.paths?.[0] || "." + args.push(".") command = [cli.path, ...args] - cwd = undefined } else if (isWindows) { command = buildPowerShellCommand(options) cwd = undefined @@ -177,7 +177,7 @@ async function runRgFilesInternal( let filePath: string if (isRg) { - filePath = line + filePath = cwd ? resolve(cwd, line) : line } else if (isWindows) { filePath = line.trim() } else { diff --git a/src/tools/glob/tools.ts b/src/tools/glob/tools.ts index d808377b2..cdfa983b4 100644 --- a/src/tools/glob/tools.ts +++ b/src/tools/glob/tools.ts @@ -29,12 +29,11 @@ export function createGlobTools(ctx: PluginInput): Record const dir = typeof runtimeCtx.directory === "string" ? runtimeCtx.directory : ctx.directory const searchPath = args.path ? resolve(dir, args.path) : dir - const paths = [searchPath] const result = await runRgFiles( { pattern: args.pattern, - paths, + paths: [searchPath], }, cli )