From 270276969e15aba462183bc3fb27c038a42ca1ad Mon Sep 17 00:00:00 2001 From: luo2430 Date: Fri, 14 Aug 2026 19:14:37 +0800 Subject: [PATCH 1/2] fix(language-server): convert URI path to filesystem path for package manager detection `detectPackageManagerFromProject` receives a POSIX-style URI path from `WorkspaceContext`, but `package-manager-detector`'s `detect()` reads the actual filesystem and requires a platform-native path. Use `vscode-uri` to convert the path before passing it to `detect()`. Fixes path handling on Windows where URI paths and filesystem paths differ. --- packages/language-server/src/workspace.test.ts | 5 +++-- packages/language-server/src/workspace.ts | 7 +++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/language-server/src/workspace.test.ts b/packages/language-server/src/workspace.test.ts index d3bf3d00..cbffd971 100644 --- a/packages/language-server/src/workspace.test.ts +++ b/packages/language-server/src/workspace.test.ts @@ -1,4 +1,5 @@ import { afterEach, describe, expect, it, vi } from 'vitest' +import { URI } from 'vscode-uri' import { detectPackageManagerFromProject } from './workspace' vi.mock('package-manager-detector/detect', () => ({ @@ -17,8 +18,8 @@ describe('detectPackageManagerFromProject', () => { await expect(detectPackageManagerFromProject('/repo')).resolves.toBe('pnpm') expect(detect).toHaveBeenCalledWith({ - cwd: '/repo', - stopDir: '/repo', + cwd: URI.file('/repo').fsPath, + stopDir: URI.file('/repo').fsPath, }) }) diff --git a/packages/language-server/src/workspace.ts b/packages/language-server/src/workspace.ts index 204209bb..9ab4ae09 100644 --- a/packages/language-server/src/workspace.ts +++ b/packages/language-server/src/workspace.ts @@ -15,9 +15,12 @@ import { URI } from 'vscode-uri' * @internal */ export async function detectPackageManagerFromProject(rootPath: string): Promise { + // `rootPath` is a URI path (posix-style) coming from `WorkspaceContext`, + // but `detect()` reads the filesystem and requires a platform-native path. + const fsPath = URI.file(rootPath).fsPath const result = await detect({ - cwd: rootPath, - stopDir: rootPath, + cwd: fsPath, + stopDir: fsPath, }) switch (result?.name) { From 66fb388daf32c339ef3f6336e43b17772fb34112 Mon Sep 17 00:00:00 2001 From: xiebh <49634549@qq.com> Date: Sat, 22 Aug 2026 20:00:34 +0800 Subject: [PATCH 2/2] test: add real-fs package manager detection test --- .../src/workspace.integration.test.ts | 10 ++++++++++ packages/language-server/src/workspace.test.ts | 14 +------------- 2 files changed, 11 insertions(+), 13 deletions(-) create mode 100644 packages/language-server/src/workspace.integration.test.ts diff --git a/packages/language-server/src/workspace.integration.test.ts b/packages/language-server/src/workspace.integration.test.ts new file mode 100644 index 00000000..10b0d071 --- /dev/null +++ b/packages/language-server/src/workspace.integration.test.ts @@ -0,0 +1,10 @@ +import { cwd } from 'node:process' +import { describe, expect, it } from 'vitest' +import { URI } from 'vscode-uri' +import { detectPackageManagerFromProject } from './workspace' + +describe('detectPackageManagerFromProject', () => { + it('detects the real repository as pnpm', async () => { + await expect(detectPackageManagerFromProject(URI.file(cwd()).path)).resolves.toBe('pnpm') + }) +}) diff --git a/packages/language-server/src/workspace.test.ts b/packages/language-server/src/workspace.test.ts index cbffd971..423b9c72 100644 --- a/packages/language-server/src/workspace.test.ts +++ b/packages/language-server/src/workspace.test.ts @@ -1,28 +1,16 @@ +import { detect } from 'package-manager-detector/detect' import { afterEach, describe, expect, it, vi } from 'vitest' -import { URI } from 'vscode-uri' import { detectPackageManagerFromProject } from './workspace' vi.mock('package-manager-detector/detect', () => ({ detect: vi.fn(), })) -const { detect } = await import('package-manager-detector/detect') - describe('detectPackageManagerFromProject', () => { afterEach(() => { vi.mocked(detect).mockReset() }) - it('returns supported package managers directly', async () => { - vi.mocked(detect).mockResolvedValue({ name: 'pnpm', agent: 'pnpm' }) - - await expect(detectPackageManagerFromProject('/repo')).resolves.toBe('pnpm') - expect(detect).toHaveBeenCalledWith({ - cwd: URI.file('/repo').fsPath, - stopDir: URI.file('/repo').fsPath, - }) - }) - it('falls back to npm for unsupported detectors', async () => { vi.mocked(detect).mockResolvedValue({ name: 'deno', agent: 'deno' })