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().
This commit is contained in:
ismeth 2026-02-28 01:43:47 +01:00 committed by YeonGyu-Kim
parent 29d606241b
commit 418cf8529f
2 changed files with 5 additions and 6 deletions

View File

@ -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 {

View File

@ -29,12 +29,11 @@ export function createGlobTools(ctx: PluginInput): Record<string, ToolDefinition
const runtimeCtx = context as Record<string, unknown>
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
)