describe("bundled plugin naming guardrails", () => {
it.each([
{
name: "keeps bundled workspace package names anchored to the plugin id",
message: `Bundled extension package names must stay anchored to the manifest id via @openclaw/<id> or an approved suffix (${ALLOWED_PACKAGE_SUFFIXES.join(", ")}). Update the plugin naming docs and this invariant before adding a new naming form.`,
collectMismatches: (records: BundledPluginRecord[]) =>
records
.filter(
({ packageName, manifestId }) =>
!resolveAllowedPackageNamesForId(manifestId).includes(packageName),
)
.map(
({ dirName, packageName, manifestId }) =>
`${dirName}: ${packageName} (id=${manifestId})`,
),
},
{
name: "keeps bundled workspace directories aligned with the plugin id unless explicitly allowlisted",
message: "Bundled extension directory names should match openclaw.plugin.json:id. If a legacy exception is unavoidable, add it to DIR_ID_EXCEPTIONS with a comment.",
collectMismatches: (records: BundledPluginRecord[]) =>
records
.filter(
({ dirName, manifestId }) => (DIR_ID_EXCEPTIONS.get(dirName) ?? dirName) !== manifestId,
)
.map(({ dirName, manifestId }) => `${dirName} -> ${manifestId}`),
},
{
name: "keeps bundled openclaw.install.npmSpec aligned with the package name",
message: "Bundled openclaw.install.npmSpec values must match the package name so install/update paths stay deterministic.",
collectMismatches: (records: BundledPluginRecord[]) =>
records
.filter(
({ installNpmSpec, packageName }) => typeof installNpmSpec === "string" && installNpmSpec !== packageName,
)
.map(
({ dirName, packageName, installNpmSpec }) =>
`${dirName}: package=${packageName}, npmSpec=${installNpmSpec}`,
),
},
{
name: "keeps bundled channel ids aligned with the canonical plugin id",
message: "Bundled openclaw.channel.id values must match openclaw.plugin.json:id for the owning plugin.",
collectMismatches: (records: BundledPluginRecord[]) =>
records
.filter(
({ channelId, manifestId }) => typeof channelId === "string" && channelId !== manifestId,
)
.map(
({ dirName, manifestId, channelId }) =>
`${dirName}: channel=${channelId}, id=${manifestId}`,
),
},
] as const)("$name", ({ message, collectMismatches }) => {
expectNoBundledPluginNamingMismatches({
message,
collectMismatches,
});
});
});
Messung V0.5 in Prozent
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.12Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-06-10)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.