





















@@ -748,7 +748,7 @@ describe("discoverOpenClawPlugins", () => {
748748expectCandidateIds(candidates, { includes: ["pack/one", "pack/two"] });
749749});
750750751-it("warns but still loads source-only TypeScript entries for installed package plugins", async () => {
751+it("skips source-only TypeScript entries for installed package plugins", async () => {
752752const stateDir = makeTempDir();
753753const pluginDir = path.join(stateDir, "extensions", "source-only-pack");
754754mkdirSafe(path.join(pluginDir, "src"));
@@ -762,17 +762,66 @@ describe("discoverOpenClawPlugins", () => {
762762763763const result = await discoverWithStateDir(stateDir, {});
764764765-expectCandidateIds(result.candidates, { includes: ["source-only-pack"] });
765+expectCandidateIds(result.candidates, { excludes: ["source-only-pack"] });
766766expect(
767767result.diagnostics.some(
768768(entry) =>
769769entry.level === "warn" &&
770+entry.pluginId === "source-only-pack" &&
770771entry.message.includes("requires compiled runtime output") &&
771772entry.message.includes("./dist/index.js"),
772773),
773774).toBe(true);
774775});
775776777+it("lets a valid bundled plugin win when a managed package is source-only TypeScript", async () => {
778+const stateDir = makeTempDir();
779+const bundledDir = path.join(stateDir, "bundled");
780+const bundledPluginDir = path.join(bundledDir, "discord");
781+const installedPluginDir = path.join(stateDir, "extensions", "discord");
782+mkdirSafe(bundledPluginDir);
783+mkdirSafe(path.join(installedPluginDir, "src"));
784+785+writePluginPackageManifest({
786+packageDir: bundledPluginDir,
787+packageName: "@openclaw/discord",
788+extensions: ["./index.js"],
789+});
790+writePluginManifest({ pluginDir: bundledPluginDir, id: "discord" });
791+writePluginEntry(path.join(bundledPluginDir, "index.js"));
792+793+writePluginPackageManifest({
794+packageDir: installedPluginDir,
795+packageName: "@openclaw/discord",
796+extensions: ["./src/index.ts"],
797+});
798+writePluginManifest({ pluginDir: installedPluginDir, id: "discord" });
799+writePluginEntry(path.join(installedPluginDir, "src", "index.ts"));
800+801+const result = discoverOpenClawPlugins({
802+env: buildDiscoveryEnvWithOverrides(stateDir, {
803+OPENCLAW_BUNDLED_PLUGINS_DIR: bundledDir,
804+}),
805+});
806+807+const discordCandidates = result.candidates.filter(
808+(candidate) => candidate.idHint === "discord",
809+);
810+expect(discordCandidates).toEqual([
811+expect.objectContaining({
812+origin: "bundled",
813+source: fs.realpathSync(path.join(bundledPluginDir, "index.js")),
814+}),
815+]);
816+expect(
817+result.diagnostics.some(
818+(entry) =>
819+entry.pluginId === "discord" &&
820+entry.message.includes("requires compiled runtime output"),
821+),
822+).toBe(true);
823+});
824+776825it("reuses one filesystem realpath lookup per package root within a discovery run", () => {
777826const stateDir = makeTempDir();
778827const packageDir = path.join(stateDir, "extensions", "pack");
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。