fix: enforce plugin config schemas (#1272) (thanks @thewilloftheshadow)

Co-authored-by: thewilloftheshadow <thewilloftheshadow@users.noreply.github.com>
This commit is contained in:
Shadow
2026-01-19 21:13:51 -06:00
committed by Peter Steinberger
parent 48f733e4b3
commit 2f6d5805de
49 changed files with 1817 additions and 377 deletions

View File

@@ -1,7 +1,7 @@
import fs from "node:fs";
import path from "node:path";
import { CONFIG_DIR, resolveUserPath } from "../utils.js";
import { resolveConfigDir, resolveUserPath } from "../utils.js";
import { resolveBundledPluginsDir } from "./bundled-dir.js";
import type { PluginDiagnostic, PluginOrigin } from "./types.js";
@@ -10,6 +10,7 @@ const EXTENSION_EXTS = new Set([".ts", ".js", ".mts", ".cts", ".mjs", ".cjs"]);
export type PluginCandidate = {
idHint: string;
source: string;
rootDir: string;
origin: PluginOrigin;
workspaceDir?: string;
packageName?: string;
@@ -78,6 +79,7 @@ function addCandidate(params: {
seen: Set<string>;
idHint: string;
source: string;
rootDir: string;
origin: PluginOrigin;
workspaceDir?: string;
manifest?: PackageManifest | null;
@@ -89,6 +91,7 @@ function addCandidate(params: {
params.candidates.push({
idHint: params.idHint,
source: resolved,
rootDir: path.resolve(params.rootDir),
origin: params.origin,
workspaceDir: params.workspaceDir,
packageName: manifest?.name?.trim() || undefined,
@@ -127,6 +130,7 @@ function discoverInDirectory(params: {
seen: params.seen,
idHint: path.basename(entry.name, path.extname(entry.name)),
source: fullPath,
rootDir: path.dirname(fullPath),
origin: params.origin,
workspaceDir: params.workspaceDir,
});
@@ -148,6 +152,7 @@ function discoverInDirectory(params: {
hasMultipleExtensions: extensions.length > 1,
}),
source: resolved,
rootDir: fullPath,
origin: params.origin,
workspaceDir: params.workspaceDir,
manifest,
@@ -166,6 +171,7 @@ function discoverInDirectory(params: {
seen: params.seen,
idHint: entry.name,
source: indexFile,
rootDir: fullPath,
origin: params.origin,
workspaceDir: params.workspaceDir,
});
@@ -184,7 +190,7 @@ function discoverFromPath(params: {
const resolved = resolveUserPath(params.rawPath);
if (!fs.existsSync(resolved)) {
params.diagnostics.push({
level: "warn",
level: "error",
message: `plugin path not found: ${resolved}`,
source: resolved,
});
@@ -195,7 +201,7 @@ function discoverFromPath(params: {
if (stat.isFile()) {
if (!isExtensionFile(resolved)) {
params.diagnostics.push({
level: "warn",
level: "error",
message: `plugin path is not a supported file: ${resolved}`,
source: resolved,
});
@@ -206,6 +212,7 @@ function discoverFromPath(params: {
seen: params.seen,
idHint: path.basename(resolved, path.extname(resolved)),
source: resolved,
rootDir: path.dirname(resolved),
origin: params.origin,
workspaceDir: params.workspaceDir,
});
@@ -228,6 +235,7 @@ function discoverFromPath(params: {
hasMultipleExtensions: extensions.length > 1,
}),
source,
rootDir: resolved,
origin: params.origin,
workspaceDir: params.workspaceDir,
manifest,
@@ -247,6 +255,7 @@ function discoverFromPath(params: {
seen: params.seen,
idHint: path.basename(resolved),
source: indexFile,
rootDir: resolved,
origin: params.origin,
workspaceDir: params.workspaceDir,
});
@@ -301,7 +310,7 @@ export function discoverClawdbotPlugins(params: {
});
}
const globalDir = path.join(CONFIG_DIR, "extensions");
const globalDir = path.join(resolveConfigDir(), "extensions");
discoverInDirectory({
dir: globalDir,
origin: "global",