summaryrefslogtreecommitdiff
path: root/packages/cli/src/ui/hooks
diff options
context:
space:
mode:
authorDeWitt Clinton <[email protected]>2025-06-12 10:04:15 -0700
committerGitHub <[email protected]>2025-06-12 17:04:15 +0000
commita9e56ee4606e2e6cb2ededd8834c10bcf25357b6 (patch)
tree3f4f9a74afd0fdb4d1cd269e30cc63a61733743d /packages/cli/src/ui/hooks
parentaf247a6cbd66ca1d6d5a75e496fdee6e4f4dd1fa (diff)
Ignore dot files on @-completion. (#978)
Diffstat (limited to 'packages/cli/src/ui/hooks')
-rw-r--r--packages/cli/src/ui/hooks/useCompletion.integration.test.ts30
-rw-r--r--packages/cli/src/ui/hooks/useCompletion.ts11
2 files changed, 39 insertions, 2 deletions
diff --git a/packages/cli/src/ui/hooks/useCompletion.integration.test.ts b/packages/cli/src/ui/hooks/useCompletion.integration.test.ts
index c38006c3..020e0ea9 100644
--- a/packages/cli/src/ui/hooks/useCompletion.integration.test.ts
+++ b/packages/cli/src/ui/hooks/useCompletion.integration.test.ts
@@ -241,7 +241,7 @@ describe('useCompletion git-aware filtering integration', () => {
expect(mockFileDiscoveryService.glob).toHaveBeenCalledWith('**/s*', {
cwd: testCwd,
- dot: true,
+ dot: false,
});
expect(fs.readdir).not.toHaveBeenCalled(); // Ensure glob is used instead of readdir
expect(result.current.suggestions).toEqual([
@@ -249,4 +249,32 @@ describe('useCompletion git-aware filtering integration', () => {
{ label: 'src/index.ts', value: 'src/index.ts' },
]);
});
+
+ it('should include dotfiles in glob search when input starts with a dot', async () => {
+ const globResults = [
+ `${testCwd}/.env`,
+ `${testCwd}/.gitignore`,
+ `${testCwd}/src/index.ts`,
+ ];
+ mockFileDiscoveryService.glob.mockResolvedValue(globResults);
+
+ const { result } = renderHook(() =>
+ useCompletion('@.', testCwd, true, slashCommands, mockConfig),
+ );
+
+ await act(async () => {
+ await new Promise((resolve) => setTimeout(resolve, 150));
+ });
+
+ expect(mockFileDiscoveryService.glob).toHaveBeenCalledWith('**/.*', {
+ cwd: testCwd,
+ dot: true,
+ });
+ expect(fs.readdir).not.toHaveBeenCalled();
+ expect(result.current.suggestions).toEqual([
+ { label: '.env', value: '.env' },
+ { label: '.gitignore', value: '.gitignore' },
+ { label: 'src/index.ts', value: 'src/index.ts' },
+ ]);
+ });
});
diff --git a/packages/cli/src/ui/hooks/useCompletion.ts b/packages/cli/src/ui/hooks/useCompletion.ts
index 810c6de0..0aa04263 100644
--- a/packages/cli/src/ui/hooks/useCompletion.ts
+++ b/packages/cli/src/ui/hooks/useCompletion.ts
@@ -210,6 +210,11 @@ export function useCompletion(
path.join(startDir, entry.name),
);
+ // Conditionally ignore dotfiles
+ if (!searchPrefix.startsWith('.') && entry.name.startsWith('.')) {
+ continue;
+ }
+
// Check if this entry should be ignored by git-aware filtering
if (
fileDiscovery &&
@@ -260,7 +265,7 @@ export function useCompletion(
const globPattern = `**/${searchPrefix}*`;
const files = await fileDiscoveryService.glob(globPattern, {
cwd,
- dot: true,
+ dot: searchPrefix.startsWith('.'),
});
const suggestions: Suggestion[] = files
@@ -309,6 +314,10 @@ export function useCompletion(
// Filter entries using git-aware filtering
const filteredEntries = [];
for (const entry of entries) {
+ // Conditionally ignore dotfiles
+ if (!prefix.startsWith('.') && entry.name.startsWith('.')) {
+ continue;
+ }
if (!entry.name.toLowerCase().startsWith(lowerPrefix)) continue;
const relativePath = path.relative(