
























@@ -104,6 +104,7 @@ function createManagedNpmPlugin(params: {
104104id: string;
105105packageName: string;
106106version: string;
107+packageLock?: boolean;
107108}) {
108109const npmRoot = path.join(params.stateDir, "npm");
109110const packageDir = path.join(npmRoot, "node_modules", params.packageName);
@@ -117,6 +118,37 @@ function createManagedNpmPlugin(params: {
117118}),
118119"utf8",
119120);
121+if (params.packageLock) {
122+fs.writeFileSync(
123+path.join(npmRoot, "package-lock.json"),
124+JSON.stringify({
125+lockfileVersion: 3,
126+packages: {
127+"": {
128+dependencies: {
129+[params.packageName]: params.version,
130+"other-plugin": "1.0.0",
131+},
132+},
133+[`node_modules/${params.packageName}`]: {
134+version: params.version,
135+},
136+"node_modules/other-plugin": {
137+version: "1.0.0",
138+},
139+},
140+dependencies: {
141+[params.packageName]: {
142+version: params.version,
143+},
144+"other-plugin": {
145+version: "1.0.0",
146+},
147+},
148+}),
149+"utf8",
150+);
151+}
120152fs.writeFileSync(
121153path.join(packageDir, "package.json"),
122154JSON.stringify({
@@ -301,4 +333,51 @@ describe("maybeRepairPluginRegistryState", () => {
301333"Removed stale managed npm plugin package",
302334);
303335});
336+337+it("removes stale managed npm packages from the package lock during repair", async () => {
338+const stateDir = makeTempDir();
339+const bundledDir = path.join(stateDir, "bundled", "google-meet");
340+fs.mkdirSync(bundledDir, { recursive: true });
341+createManagedNpmPlugin({
342+ stateDir,
343+id: "google-meet",
344+packageName: "@openclaw/google-meet",
345+version: "2026.5.2",
346+packageLock: true,
347+});
348+await writePersistedInstalledPluginIndex(createCurrentIndex(), { stateDir });
349+350+await maybeRepairPluginRegistryState({
351+ stateDir,
352+candidates: [
353+createBundledCandidate({
354+rootDir: bundledDir,
355+id: "google-meet",
356+packageName: "@openclaw/google-meet",
357+version: "2026.5.3",
358+}),
359+],
360+env: hermeticEnv(),
361+config: {
362+plugins: {
363+allow: ["google-meet"],
364+entries: {
365+"google-meet": {
366+enabled: true,
367+config: {},
368+},
369+},
370+},
371+},
372+prompter: { shouldRepair: true },
373+});
374+375+const packageLock = JSON.parse(
376+fs.readFileSync(path.join(stateDir, "npm", "package-lock.json"), "utf8"),
377+);
378+expect(packageLock.packages[""].dependencies).toEqual({ "other-plugin": "1.0.0" });
379+expect(packageLock.packages).not.toHaveProperty("node_modules/@openclaw/google-meet");
380+expect(packageLock.dependencies).not.toHaveProperty("@openclaw/google-meet");
381+expect(packageLock.dependencies).toHaveProperty("other-plugin");
382+});
304383});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。