






















@@ -2,6 +2,7 @@ import fs from "node:fs";
22import { afterEach, describe, expect, it } from "vitest";
33import { clearPluginDiscoveryCache } from "./discovery.js";
44import { clearPluginManifestRegistryCache } from "./manifest-registry.js";
5+import { refreshPluginRegistry } from "./plugin-registry.js";
56import { buildPluginRegistrySnapshotReport, buildPluginSnapshotReport } from "./status.js";
67import {
78createColdPluginConfig,
@@ -68,6 +69,59 @@ describe("buildPluginRegistrySnapshotReport", () => {
6869expect(isColdPluginRuntimeLoaded(fixture)).toBe(false);
6970});
707172+it("replays persisted list metadata without importing plugin runtime", async () => {
73+const fixture = createColdPluginFixture({
74+rootDir: makeTempDir(),
75+pluginId: "persisted-demo",
76+packageName: "@example/openclaw-persisted-demo",
77+packageVersion: "2.0.0",
78+manifest: {
79+id: "persisted-demo",
80+name: "Persisted Demo",
81+description: "Persisted registry metadata",
82+providers: ["persisted-provider"],
83+commandAliases: [{ name: "persisted-demo" }],
84+},
85+});
86+const workspaceDir = makeTempDir();
87+const config = createColdPluginConfig(fixture.rootDir, fixture.pluginId);
88+const env = createColdPluginHermeticEnv(workspaceDir, {
89+bundledPluginsDir: makeTempDir(),
90+disablePersistedRegistry: false,
91+});
92+93+await refreshPluginRegistry({
94+ config,
95+ workspaceDir,
96+ env,
97+reason: "manual",
98+});
99+expect(isColdPluginRuntimeLoaded(fixture)).toBe(false);
100+101+const report = buildPluginRegistrySnapshotReport({
102+ config,
103+ workspaceDir,
104+ env,
105+});
106+107+expect(report.registrySource).toBe("persisted");
108+expect(report.plugins).toEqual(
109+expect.arrayContaining([
110+expect.objectContaining({
111+id: "persisted-demo",
112+name: "Persisted Demo",
113+description: "Persisted registry metadata",
114+version: "2.0.0",
115+providerIds: ["persisted-provider"],
116+commands: ["persisted-demo"],
117+source: fs.realpathSync(fixture.runtimeSource),
118+status: "loaded",
119+}),
120+]),
121+);
122+expect(isColdPluginRuntimeLoaded(fixture)).toBe(false);
123+});
124+71125it("builds read-only plugin status snapshots without importing plugin runtime", () => {
72126const fixture = createColdPluginFixture({
73127rootDir: makeTempDir(),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。