Fix path for Chrome DevTools external plugin (#1784)

* Fixing path on chrome devtools external pluginPath is to the folder in the repo where the plugin structure starts, not where the plugin.json file lives.

* Updating validation scripts and guidance to avoid this mistake again
This commit is contained in:
Aaron Powell
2026-05-21 15:51:17 +10:00
committed by GitHub
parent 8a43097de6
commit a303e17975
7 changed files with 32 additions and 28 deletions
+2 -2
View File
@@ -44,8 +44,8 @@ body:
id: plugin-path
attributes:
label: Plugin path inside the repository
description: Optional if the plugin lives at the repository root.
placeholder: .github/plugins/my-plugin
description: Optional if the plugin lives at the repository root. Otherwise, enter the folder where the plugin structure starts, not the plugin.json file.
placeholder: plugins/my-plugin
validations:
required: false
- type: input
-1
View File
@@ -126,7 +126,6 @@
"source": {
"source": "github",
"repo": "ChromeDevTools/chrome-devtools-mcp",
"path": ".github/plugin/plugin.json",
"ref": "chrome-devtools-mcp-v1.0.1"
}
},
+1 -1
View File
@@ -221,7 +221,7 @@ For entries committed to `plugins/external.json`, the current marketplace valida
- `repository` as an HTTPS GitHub URL
- `keywords` as lowercase hyphenated tags
- `source.source: "github"` plus `source.repo` in `owner/repo` format
- optional `source.path` values to stay relative to the repository root
- optional `source.path` values of `/` for repository root, or a repository-relative folder where the plugin structure starts (do not point to `plugin.json` directly)
The public-submission policy builds on those rules and also requires `license` plus an immutable `source.ref`.
+24
View File
@@ -23,6 +23,12 @@ export const EXTERNAL_PLUGIN_POLICIES = Object.freeze({
}),
});
const EXTERNAL_PLUGIN_ROOT_MANIFEST_PATHS = Object.freeze([
"plugin.json",
".github/plugin/plugin.json",
".plugin/plugin.json",
]);
function resolvePolicy(policy) {
if (!policy) {
return EXTERNAL_PLUGIN_POLICIES.marketplace;
@@ -203,12 +209,20 @@ function validateHomepage(homepage, prefix, errors) {
validateHttpsUrl(homepage, "homepage", prefix, errors);
}
function formatExpectedPluginRootMessage() {
return EXTERNAL_PLUGIN_ROOT_MANIFEST_PATHS.map((manifestPath) => `"${manifestPath}"`).join(", ");
}
function validateRelativePath(pathValue, prefix, errors) {
if (!isNonEmptyString(pathValue)) {
errors.push(`${prefix}: "source.path" must be a non-empty string when provided`);
return;
}
if (pathValue === "/") {
return;
}
const normalized = path.posix.normalize(pathValue);
const segments = pathValue.split("/");
@@ -219,6 +233,16 @@ function validateRelativePath(pathValue, prefix, errors) {
if (pathValue.includes("\\")) {
errors.push(`${prefix}: "source.path" must use forward slashes`);
}
if (normalized === ".") {
errors.push(`${prefix}: "source.path" must be "/" for the repository root or a plugin root directory relative to the repository root`);
}
if (path.posix.basename(normalized) === "plugin.json") {
errors.push(
`${prefix}: "source.path" must point to the plugin root directory, not the manifest file; relative to "source.path", expected one of ${formatExpectedPluginRootMessage()}`
);
}
}
function validateImmutableRef(ref, prefix, errors) {
+3 -22
View File
@@ -73,7 +73,6 @@
"source": {
"source": "github",
"repo": "ChromeDevTools/chrome-devtools-mcp",
"path": ".github/plugin/plugin.json",
"ref": "chrome-devtools-mcp-v1.0.1"
}
},
@@ -194,13 +193,7 @@
"url": "https://www.figma.com"
},
"homepage": "https://github.com/figma/mcp-server-guide",
"keywords": [
"figma",
"design",
"mcp",
"ui",
"code-connect"
],
"keywords": ["figma", "design", "mcp", "ui", "code-connect"],
"repository": "https://github.com/figma/mcp-server-guide",
"source": {
"source": "github",
@@ -272,14 +265,7 @@
"url": "https://www.microsoft.com"
},
"homepage": "https://github.com/microsoft/Build-CLI",
"keywords": [
"microsoft",
"build",
"ignite",
"events",
"sessions",
"learn"
],
"keywords": ["microsoft", "build", "ignite", "events", "sessions", "learn"],
"license": "Apache-2.0",
"repository": "https://github.com/microsoft/Build-CLI",
"source": {
@@ -296,12 +282,7 @@
"url": "https://www.microsoft.com"
},
"homepage": "https://github.com/dotnet/modernize-dotnet",
"keywords": [
"modernization",
"upgrade",
"migration",
"dotnet"
],
"keywords": ["modernization", "upgrade", "migration", "dotnet"],
"license": "MIT",
"repository": "https://github.com/dotnet/modernize-dotnet",
"source": {
+1 -1
View File
@@ -1055,7 +1055,7 @@ async function openPluginModal(
function getExternalPluginUrl(plugin: Plugin): string {
if (plugin.source?.source === "github" && plugin.source.repo) {
const base = `https://github.com/${plugin.source.repo}`;
return plugin.source.path
return plugin.source.path && plugin.source.path !== "/"
? `${base}/tree/main/${plugin.source.path}`
: base;
}
+1 -1
View File
@@ -49,7 +49,7 @@ export function sortPlugins<T extends RenderablePlugin>(
function getExternalPluginUrl(plugin: RenderablePlugin): string {
if (plugin.source?.source === 'github' && plugin.source.repo) {
const base = `https://github.com/${plugin.source.repo}`;
return plugin.source.path ? `${base}/tree/main/${plugin.source.path}` : base;
return plugin.source.path && plugin.source.path !== '/' ? `${base}/tree/main/${plugin.source.path}` : base;
}
return sanitizeUrl(plugin.repository || plugin.homepage);