





















@@ -31,6 +31,7 @@ const DIR_ID_EXCEPTIONS = new Map<string, string>([
3131// Historical directory name kept until a wider repo cleanup is worth the churn.
3232["kimi-coding", "kimi"],
3333]);
34+const NON_PACKAGED_BUNDLED_PLUGIN_DIRS = new Set(["qa-channel", "qa-lab", "qa-matrix"]);
3435const ALLOWED_PACKAGE_SUFFIXES = [
3536"",
3637"-provider",
@@ -145,6 +146,18 @@ describe("bundled plugin naming guardrails", () => {
145146`${dirName}: package=${packageName}, npmSpec=${installNpmSpec}`,
146147),
147148},
149+{
150+name: "keeps non-packaged bundled plugins from advertising npm installs",
151+message:
152+"Non-packaged bundled plugins are source-only/private and must not advertise openclaw.install.npmSpec.",
153+collectMismatches: (records: BundledPluginRecord[]) =>
154+records
155+.filter(
156+({ dirName, installNpmSpec }) =>
157+NON_PACKAGED_BUNDLED_PLUGIN_DIRS.has(dirName) && typeof installNpmSpec === "string",
158+)
159+.map(({ dirName, installNpmSpec }) => `${dirName}: npmSpec=${installNpmSpec}`),
160+},
148161{
149162name: "keeps bundled channel ids aligned with the canonical plugin id",
150163message:
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。