Fix exact workspace file suggestions

Resolve exact suffix path queries before falling back to broad search, and keep broad hidden-directory traversal limited to known workspace config dirs.
This commit is contained in:
Mohamed Boudra
2026-06-20 19:13:25 +07:00
parent 6a3856b639
commit 2c4e443ad7
2 changed files with 176 additions and 6 deletions
@@ -332,11 +332,63 @@ describe("searchWorkspaceEntries", () => {
]);
});
it("suffix mode finds files under hidden workspace directories", async () => {
mkdirSync(path.join(workspaceDir, ".claude"), { recursive: true });
writeFileSync(path.join(workspaceDir, ".claude", "settings.local.json"), "{}");
it("suffix mode resolves exact workspace file paths before broad traversal", async () => {
const targetPath = path.join(
workspaceDir,
"packages",
"server",
"src",
"services",
"quota-fetcher",
"providers",
"local.ts",
);
mkdirSync(path.dirname(targetPath), { recursive: true });
writeFileSync(targetPath, "");
const results = await searchWorkspaceEntries({
cwd: workspaceDir,
query: "packages/server/src/services/quota-fetcher/providers/local.ts",
limit: 20,
includeFiles: true,
includeDirectories: false,
matchMode: "suffix",
maxEntriesScanned: 1,
});
expect(results).toEqual([
{
path: "packages/server/src/services/quota-fetcher/providers/local.ts",
kind: "file",
},
]);
});
it("suffix mode resolves explicit hidden file paths without broad hidden traversal", async () => {
const targetPath = path.join(workspaceDir, ".dev", "paseo-home", "daemon.log");
mkdirSync(path.dirname(targetPath), { recursive: true });
writeFileSync(targetPath, "daemon log\n");
const results = await searchWorkspaceEntries({
cwd: workspaceDir,
query: ".dev/paseo-home/daemon.log",
limit: 20,
includeFiles: true,
includeDirectories: false,
matchMode: "suffix",
maxEntriesScanned: 1,
});
expect(results).toEqual([{ path: ".dev/paseo-home/daemon.log", kind: "file" }]);
});
it("suffix mode finds files under allowlisted hidden workspace directories", async () => {
mkdirSync(path.join(workspaceDir, ".claude"), { recursive: true });
mkdirSync(path.join(workspaceDir, ".github", "workflows"), { recursive: true });
writeFileSync(path.join(workspaceDir, ".claude", "settings.local.json"), "{}");
writeFileSync(path.join(workspaceDir, ".github", "workflows", "ci.yml"), "");
const claudeResults = await searchWorkspaceEntries({
cwd: workspaceDir,
query: "settings.local.json",
limit: 20,
@@ -344,8 +396,34 @@ describe("searchWorkspaceEntries", () => {
includeDirectories: false,
matchMode: "suffix",
});
const githubResults = await searchWorkspaceEntries({
cwd: workspaceDir,
query: "ci.yml",
limit: 20,
includeFiles: true,
includeDirectories: false,
matchMode: "suffix",
});
expect(results).toEqual([{ path: ".claude/settings.local.json", kind: "file" }]);
expect(claudeResults).toEqual([{ path: ".claude/settings.local.json", kind: "file" }]);
expect(githubResults).toEqual([{ path: ".github/workflows/ci.yml", kind: "file" }]);
});
it("does not broadly traverse unlisted hidden workspace directories", async () => {
mkdirSync(path.join(workspaceDir, ".dev", "cache"), { recursive: true });
writeFileSync(path.join(workspaceDir, ".dev", "cache", "needle.ts"), "");
writeFileSync(path.join(workspaceDir, "src", "needle.ts"), "");
const results = await searchWorkspaceEntries({
cwd: workspaceDir,
query: "needle.ts",
limit: 20,
includeFiles: true,
includeDirectories: false,
matchMode: "suffix",
});
expect(results).toEqual([{ path: "src/needle.ts", kind: "file" }]);
});
it("does not suggest hidden directories even when includeDirectories is true", async () => {