summaryrefslogtreecommitdiff
path: root/packages/cli/src
diff options
context:
space:
mode:
authorBilly Biggs <[email protected]>2025-06-23 23:48:26 -0700
committerGitHub <[email protected]>2025-06-24 06:48:26 +0000
commitb47a4240ff02484ec9c80e99f4a87c3c57b87f31 (patch)
tree6eade11012c06f5fe9b83390e51217f2c2a62584 /packages/cli/src
parenta2ed4266aaee69932a8254ccf611c95ad584a71a (diff)
Bug/1369 at command recursive search (#1370)
Diffstat (limited to 'packages/cli/src')
-rw-r--r--packages/cli/src/ui/hooks/atCommandProcessor.test.ts32
-rw-r--r--packages/cli/src/ui/hooks/atCommandProcessor.ts8
2 files changed, 36 insertions, 4 deletions
diff --git a/packages/cli/src/ui/hooks/atCommandProcessor.test.ts b/packages/cli/src/ui/hooks/atCommandProcessor.test.ts
index 6380a187..572131af 100644
--- a/packages/cli/src/ui/hooks/atCommandProcessor.test.ts
+++ b/packages/cli/src/ui/hooks/atCommandProcessor.test.ts
@@ -21,6 +21,7 @@ const mockConfig = {
isSandboxed: vi.fn(() => false),
getFileService: vi.fn(),
getFileFilteringRespectGitIgnore: vi.fn(() => true),
+ getEnableRecursiveFileSearch: vi.fn(() => true),
} as unknown as Config;
const mockReadManyFilesExecute = vi.fn();
@@ -720,4 +721,35 @@ describe('handleAtCommand', () => {
expect(result.shouldProceed).toBe(true);
});
});
+
+ describe('when recursive file search is disabled', () => {
+ beforeEach(() => {
+ vi.mocked(mockConfig.getEnableRecursiveFileSearch).mockReturnValue(false);
+ });
+
+ it('should not use glob search for a nonexistent file', async () => {
+ const invalidFile = 'nonexistent.txt';
+ const query = `@${invalidFile}`;
+
+ vi.mocked(fsPromises.stat).mockRejectedValue(
+ Object.assign(new Error('ENOENT'), { code: 'ENOENT' }),
+ );
+
+ const result = await handleAtCommand({
+ query,
+ config: mockConfig,
+ addItem: mockAddItem,
+ onDebugMessage: mockOnDebugMessage,
+ messageId: 300,
+ signal: abortController.signal,
+ });
+
+ expect(mockGlobExecute).not.toHaveBeenCalled();
+ expect(mockOnDebugMessage).toHaveBeenCalledWith(
+ `Glob tool not found. Path ${invalidFile} will be skipped.`,
+ );
+ expect(result.processedQuery).toEqual([{ text: query }]);
+ expect(result.shouldProceed).toBe(true);
+ });
+ });
});
diff --git a/packages/cli/src/ui/hooks/atCommandProcessor.ts b/packages/cli/src/ui/hooks/atCommandProcessor.ts
index d6c5eded..3bbdce0d 100644
--- a/packages/cli/src/ui/hooks/atCommandProcessor.ts
+++ b/packages/cli/src/ui/hooks/atCommandProcessor.ts
@@ -210,10 +210,10 @@ export async function handleAtCommand({
resolvedSuccessfully = true;
} catch (error) {
if (isNodeError(error) && error.code === 'ENOENT') {
- onDebugMessage(
- `Path ${pathName} not found directly, attempting glob search.`,
- );
- if (globTool) {
+ if (config.getEnableRecursiveFileSearch() && globTool) {
+ onDebugMessage(
+ `Path ${pathName} not found directly, attempting glob search.`,
+ );
try {
const globResult = await globTool.execute(
{ pattern: `**/*${pathName}*`, path: config.getTargetDir() },