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 5770efc595
commit cec148f874
2 changed files with 5 additions and 6 deletions
+4 -4
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 {
+1 -2
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
)