fix: restore Grep and Glob reliability on OpenAI paths (#461)
* fix: restore Grep and Glob reliability on OpenAI paths Preserve Grep and Glob pattern fields during OpenAI/Codex schema sanitization, and fall back to system ripgrep when the packaged binary is missing. This keeps search tool schemas intact and improves Linux usability for npm/source installs. Co-Authored-By: Claude Opus 4.6 <noreply@openclaude.dev> * test: clean up ripgrep fallback test helpers Remove the unused ripgrepCommand import and normalize mocked builtin ripgrep paths so the test behaves consistently across platforms. Co-Authored-By: Claude Opus 4.6 <noreply@openclaude.dev> * test: remove duplicate Codex URI schema case Drop the duplicated WebFetch URI-format test in codexShim.test.ts so test names stay unique and failures remain easier to read. Co-Authored-By: Claude Opus 4.6 <noreply@openclaude.dev> * test: stabilize ripgrep fallback coverage Avoid fs/module mocking in ripgrep fallback tests by extracting the config selection logic into a pure helper. This preserves the fallback coverage while removing the test interaction that caused the narrowed Bun hang repro. Co-Authored-By: Claude Opus 4.6 <noreply@openclaude.dev> * test: tighten ripgrep and schema coverage Align the ripgrep fallback test with the actual auto-fallback branch, clean up strict typing in schema sanitizer tests, and tighten ripgrep error narrowing for type safety. Co-Authored-By: Claude Opus 4.6 <noreply@openclaude.dev> --------- Co-authored-by: Claude Opus 4.6 <noreply@openclaude.dev>
This commit is contained in:
@@ -1,11 +1,52 @@
|
||||
import { expect, test } from 'bun:test'
|
||||
import path from 'path'
|
||||
|
||||
import { wrapRipgrepUnavailableError } from './ripgrep.ts'
|
||||
import { resolveRipgrepConfig, wrapRipgrepUnavailableError } from './ripgrep.js'
|
||||
|
||||
const MOCK_BUILTIN_PATH = path.normalize(
|
||||
process.platform === 'win32'
|
||||
? `vendor/ripgrep/${process.arch}-win32/rg.exe`
|
||||
: `vendor/ripgrep/${process.arch}-${process.platform}/rg`,
|
||||
)
|
||||
|
||||
test('ripgrepCommand falls back to system rg when builtin binary is missing', () => {
|
||||
const config = resolveRipgrepConfig({
|
||||
userWantsSystemRipgrep: false,
|
||||
bundledMode: false,
|
||||
builtinCommand: MOCK_BUILTIN_PATH,
|
||||
builtinExists: false,
|
||||
systemExecutablePath: '/usr/bin/rg',
|
||||
processExecPath: '/fake/bun',
|
||||
})
|
||||
|
||||
expect(config).toMatchObject({
|
||||
mode: 'system',
|
||||
command: 'rg',
|
||||
args: [],
|
||||
})
|
||||
})
|
||||
|
||||
test('ripgrepCommand keeps builtin mode when bundled binary exists', () => {
|
||||
const config = resolveRipgrepConfig({
|
||||
userWantsSystemRipgrep: false,
|
||||
bundledMode: false,
|
||||
builtinCommand: MOCK_BUILTIN_PATH,
|
||||
builtinExists: true,
|
||||
systemExecutablePath: '/usr/bin/rg',
|
||||
processExecPath: '/fake/bun',
|
||||
})
|
||||
|
||||
expect(config).toMatchObject({
|
||||
mode: 'builtin',
|
||||
command: MOCK_BUILTIN_PATH,
|
||||
args: [],
|
||||
})
|
||||
})
|
||||
|
||||
test('wrapRipgrepUnavailableError explains missing packaged fallback', () => {
|
||||
const error = wrapRipgrepUnavailableError(
|
||||
{ code: 'ENOENT', message: 'spawn rg ENOENT' },
|
||||
{ mode: 'builtin', command: 'C:\\fake\\vendor\\ripgrep\\rg.exe' },
|
||||
{ mode: 'builtin', command: 'C:\\fake\\vendor\\ripgrep\\rg.exe', args: [] },
|
||||
'win32',
|
||||
)
|
||||
|
||||
@@ -18,7 +59,7 @@ test('wrapRipgrepUnavailableError explains missing packaged fallback', () => {
|
||||
test('wrapRipgrepUnavailableError explains missing system ripgrep', () => {
|
||||
const error = wrapRipgrepUnavailableError(
|
||||
{ code: 'ENOENT', message: 'spawn rg ENOENT' },
|
||||
{ mode: 'system', command: 'rg' },
|
||||
{ mode: 'system', command: 'rg', args: [] },
|
||||
'linux',
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user