From 1be67406e28bf4e2745e41c1a8ac0e0e28f7f910 Mon Sep 17 00:00:00 2001 From: Molly Wires Date: Wed, 28 Jan 2026 11:58:40 -0800 Subject: [PATCH] fix(plugins): discover symlinked extension and hook directories readdir entries report isDirectory()=false for symlinks, causing plugin discovery, hook discovery, and security audits to skip symlinked directories. Adding isSymbolicLink() checks lets symlinked packages be found correctly. Affected files: - src/plugins/discovery.ts (plugin/extension discovery) - src/hooks/workspace.ts (hook discovery) - src/security/audit-extra.ts (extension security audit) Useful when extensions or hooks are managed outside the workspace and symlinked in (e.g. from a shared development directory). --- src/hooks/workspace.ts | 2 +- src/plugins/discovery.ts | 2 +- src/security/audit-extra.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hooks/workspace.ts b/src/hooks/workspace.ts index 7f371ac10..9f14624c9 100644 --- a/src/hooks/workspace.ts +++ b/src/hooks/workspace.ts @@ -112,7 +112,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 a03e4f38b..1690c84e6 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 3a92a30a8..09628fd25 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;