Skip to content

Commit 36048e8

Browse files
committed
fix: preserve pin-only install provenance
1 parent 2645c0b commit 36048e8

2 files changed

Lines changed: 28 additions & 8 deletions

File tree

src/plugins/update.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ function createNpmInstallConfig(params: {
142142
resolvedName?: string;
143143
resolvedSpec?: string;
144144
resolvedVersion?: string;
145+
installedAt?: string;
146+
resolvedAt?: string;
145147
}) {
146148
return {
147149
plugins: {
@@ -155,6 +157,8 @@ function createNpmInstallConfig(params: {
155157
...(params.resolvedName ? { resolvedName: params.resolvedName } : {}),
156158
...(params.resolvedSpec ? { resolvedSpec: params.resolvedSpec } : {}),
157159
...(params.resolvedVersion ? { resolvedVersion: params.resolvedVersion } : {}),
160+
...(params.installedAt ? { installedAt: params.installedAt } : {}),
161+
...(params.resolvedAt ? { resolvedAt: params.resolvedAt } : {}),
158162
},
159163
},
160164
},
@@ -656,6 +660,8 @@ describe("updateNpmInstalledPlugins", () => {
656660
resolvedSpec: "@openclaw/acpx@2026.5.2",
657661
resolvedVersion: "2026.5.2",
658662
integrity: "sha512-old",
663+
installedAt: "2026-05-01T00:00:00.000Z",
664+
resolvedAt: "2026-05-01T00:00:01.000Z",
659665
}),
660666
pluginIds: ["acpx"],
661667
syncOfficialPluginInstalls: true,
@@ -664,6 +670,8 @@ describe("updateNpmInstalledPlugins", () => {
664670
expect(result.changed).toBe(true);
665671
expect(result.outcomes[0]?.status).toBe("unchanged");
666672
expect(result.config.plugins?.installs?.acpx?.spec).toBe("@openclaw/acpx@2026.5.2");
673+
expect(result.config.plugins?.installs?.acpx?.installedAt).toBe("2026-05-01T00:00:00.000Z");
674+
expect(result.config.plugins?.installs?.acpx?.resolvedAt).toBe("2026-05-01T00:00:01.000Z");
667675
expect(npmInstallCall()).toBeUndefined();
668676
});
669677

src/plugins/update.ts

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1499,14 +1499,26 @@ export async function updateNpmInstalledPlugins(params: {
14991499
pinResolvedRegistrySpec: true,
15001500
});
15011501
if (nextRecordSpec !== record.spec) {
1502-
next = recordPluginInstall(next, {
1503-
pluginId,
1504-
source: "npm",
1505-
spec: nextRecordSpec,
1506-
installPath,
1507-
version: currentVersion,
1508-
...buildNpmResolutionInstallFields(metadataResult.metadata),
1509-
});
1502+
const resolutionFields = buildNpmResolutionInstallFields(metadataResult.metadata);
1503+
next = {
1504+
...next,
1505+
plugins: {
1506+
...next.plugins,
1507+
installs: {
1508+
...next.plugins?.installs,
1509+
[pluginId]: {
1510+
...record,
1511+
spec: nextRecordSpec,
1512+
resolvedName: resolutionFields.resolvedName ?? record.resolvedName,
1513+
resolvedVersion: resolutionFields.resolvedVersion ?? record.resolvedVersion,
1514+
resolvedSpec: resolutionFields.resolvedSpec ?? record.resolvedSpec,
1515+
integrity: resolutionFields.integrity ?? record.integrity,
1516+
shasum: resolutionFields.shasum ?? record.shasum,
1517+
resolvedAt: resolutionFields.resolvedAt ?? record.resolvedAt,
1518+
},
1519+
},
1520+
},
1521+
};
15101522
changed = true;
15111523
}
15121524
}

0 commit comments

Comments
 (0)