From 0e98f084b32f3b29476338acc2e3c9925e6bca69 Mon Sep 17 00:00:00 2001 From: Dean Rie Date: Fri, 16 Oct 2026 12:33:05 +0300 Subject: [PATCH 1/2] validate: do not treat a remote-URL source as a missing local directory marketplace.schema.json documents `source` as a path or a remote URL, but the validator resolved every source as a path, so a schema-valid entry with an https source failed with "source directory ... does not exist". Skip remote sources with an explicit note; nothing here fetches them. Fixes #640. --- scripts/validate-plugins.mjs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/scripts/validate-plugins.mjs b/scripts/validate-plugins.mjs index 6a7870854..3af0474a4 100644 --- a/scripts/validate-plugins.mjs +++ b/scripts/validate-plugins.mjs @@ -50,6 +50,15 @@ if (!validateMarketplace(marketplace)) { // 2. Validate each plugin for (const entry of marketplace.plugins ?? []) { + // The schema allows `source` to be a remote URL. Nothing here fetches it, so + // say so instead of resolving it as a path (which turns "https://x" into + // "/https:/x" and reports a missing directory). + if (/^https?:\/\//.test(entry.source)) { + console.log( + `INFO: Plugin "${entry.name}": remote source "${entry.source}" is not validated locally` + ); + continue; + } const pluginDir = resolve(root, entry.source); const pluginJsonPath = resolve(pluginDir, ".cursor-plugin/plugin.json"); From 86806163d770d813ff91f0729460c12ecfe36d67 Mon Sep 17 00:00:00 2001 From: Dean Rie Date: Fri, 16 Oct 2026 17:02:35 +0300 Subject: [PATCH 2/2] validate: match the remote-source scheme case-insensitively URL schemes are case-insensitive (RFC 3986), so HTTPS://... should be treated like https://... rather than falling through to resolve(). --- scripts/validate-plugins.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/validate-plugins.mjs b/scripts/validate-plugins.mjs index 3af0474a4..23226d428 100644 --- a/scripts/validate-plugins.mjs +++ b/scripts/validate-plugins.mjs @@ -53,7 +53,7 @@ for (const entry of marketplace.plugins ?? []) { // The schema allows `source` to be a remote URL. Nothing here fetches it, so // say so instead of resolving it as a path (which turns "https://x" into // "/https:/x" and reports a missing directory). - if (/^https?:\/\//.test(entry.source)) { + if (/^https?:\/\//i.test(entry.source)) { console.log( `INFO: Plugin "${entry.name}": remote source "${entry.source}" is not validated locally` );