




















@@ -71,8 +71,10 @@ function createNpmInstallConfig(params: {
7171spec: string;
7272installPath: string;
7373integrity?: string;
74+shasum?: string;
7475resolvedName?: string;
7576resolvedSpec?: string;
77+resolvedVersion?: string;
7678}) {
7779return {
7880plugins: {
@@ -82,8 +84,10 @@ function createNpmInstallConfig(params: {
8284spec: params.spec,
8385installPath: params.installPath,
8486 ...(params.integrity ? { integrity: params.integrity } : {}),
87+ ...(params.shasum ? { shasum: params.shasum } : {}),
8588 ...(params.resolvedName ? { resolvedName: params.resolvedName } : {}),
8689 ...(params.resolvedSpec ? { resolvedSpec: params.resolvedSpec } : {}),
90+ ...(params.resolvedVersion ? { resolvedVersion: params.resolvedVersion } : {}),
8791},
8892},
8993},
@@ -412,6 +416,55 @@ describe("updateNpmInstalledPlugins", () => {
412416]);
413417});
414418419+it("refreshes legacy npm install records before skipping unchanged artifacts", async () => {
420+const installPath = createInstalledPackageDir({
421+name: "@martian-engineering/lossless-claw",
422+version: "0.9.0",
423+});
424+mockNpmViewMetadata({
425+name: "@martian-engineering/lossless-claw",
426+version: "0.9.0",
427+integrity: "sha512-same",
428+shasum: "same",
429+});
430+installPluginFromNpmSpecMock.mockResolvedValue(
431+createSuccessfulNpmUpdateResult({
432+pluginId: "lossless-claw",
433+targetDir: installPath,
434+version: "0.9.0",
435+npmResolution: {
436+name: "@martian-engineering/lossless-claw",
437+version: "0.9.0",
438+resolvedSpec: "@martian-engineering/lossless-claw@0.9.0",
439+},
440+}),
441+);
442+443+const result = await updateNpmInstalledPlugins({
444+config: createNpmInstallConfig({
445+pluginId: "lossless-claw",
446+spec: "@martian-engineering/lossless-claw",
447+ installPath,
448+}),
449+pluginIds: ["lossless-claw"],
450+});
451+452+expect(installPluginFromNpmSpecMock).toHaveBeenCalledTimes(1);
453+expect(result.changed).toBe(true);
454+expect(result.outcomes[0]).toMatchObject({
455+pluginId: "lossless-claw",
456+status: "unchanged",
457+currentVersion: "0.9.0",
458+nextVersion: "0.9.0",
459+});
460+expect(result.config.plugins?.installs?.["lossless-claw"]).toMatchObject({
461+source: "npm",
462+resolvedName: "@martian-engineering/lossless-claw",
463+resolvedVersion: "0.9.0",
464+resolvedSpec: "@martian-engineering/lossless-claw@0.9.0",
465+});
466+});
467+415468it("expands home-relative install paths before checking installed npm versions", async () => {
416469const home = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-plugin-update-home-"));
417470tempDirs.push(home);
@@ -436,8 +489,10 @@ describe("updateNpmInstalledPlugins", () => {
436489spec: "@martian-engineering/lossless-claw",
437490installPath: "~/.openclaw/extensions/lossless-claw",
438491resolvedName: "@martian-engineering/lossless-claw",
492+resolvedVersion: "0.9.0",
439493resolvedSpec: "@martian-engineering/lossless-claw@0.9.0",
440494integrity: "sha512-same",
495+shasum: "same",
441496}),
442497pluginIds: ["lossless-claw"],
443498});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。