diff --git a/src/hooks/workspace.ts b/src/hooks/workspace.ts index 23caf53b3..e0793d90f 100644 --- a/src/hooks/workspace.ts +++ b/src/hooks/workspace.ts @@ -110,7 +110,7 @@ function loadHooksFromDir(params: { dir: string; source: HookSource; pluginId?: const entries = fs.readdirSync(dir, { withFileTypes: true }); for (const entry of entries) { - if (!entry.isDirectory()) continue; + if (!entry.isDirectory() && !entry.isSymbolicLink()) continue; const hookDir = path.join(dir, entry.name); const manifest = readHookPackageManifest(hookDir); diff --git a/src/plugins/discovery.ts b/src/plugins/discovery.ts index d44c478a7..7aab20185 100644 --- a/src/plugins/discovery.ts +++ b/src/plugins/discovery.ts @@ -136,7 +136,7 @@ function discoverInDirectory(params: { workspaceDir: params.workspaceDir, }); } - if (!entry.isDirectory()) continue; + if (!entry.isDirectory() && !entry.isSymbolicLink()) continue; const manifest = readPackageManifest(fullPath); const extensions = manifest ? resolvePackageExtensions(manifest) : []; diff --git a/src/security/audit-extra.ts b/src/security/audit-extra.ts index 05c4ad872..3d962f210 100644 --- a/src/security/audit-extra.ts +++ b/src/security/audit-extra.ts @@ -527,7 +527,7 @@ export async function collectPluginsTrustFindings(params: { const entries = await fs.readdir(extensionsDir, { withFileTypes: true }).catch(() => []); const pluginDirs = entries - .filter((e) => e.isDirectory()) + .filter((e) => e.isDirectory() || e.isSymbolicLink()) .map((e) => e.name) .filter(Boolean); if (pluginDirs.length === 0) return findings;