diff --git a/packages/coding-agent/src/core/package-manager.ts b/packages/coding-agent/src/core/package-manager.ts index 2535b1f93..9b7a734d4 100644 --- a/packages/coding-agent/src/core/package-manager.ts +++ b/packages/coding-agent/src/core/package-manager.ts @@ -1858,7 +1858,7 @@ export class DefaultPackageManager implements PackageManager { "--config.strict-dep-builds=false", ]; case "npm": - return ["install", "--omit=dev", "--legacy-peer-deps"]; + return ["install", "--omit=dev", "--legacy-peer-deps", "--no-audit", "--no-fund"]; default: return ["install"]; } @@ -1891,7 +1891,8 @@ export class DefaultPackageManager implements PackageManager { "--config.strict-dep-builds=false", ]; } - return ["install", ...specs, "--prefix", installRoot, "--legacy-peer-deps"]; + // npm audit fix would run without --legacy-peer-deps and install pi peers, so skip audit advice. + return ["install", ...specs, "--prefix", installRoot, "--legacy-peer-deps", "--no-audit", "--no-fund"]; } private async installNpm(source: NpmSource, scope: SourceScope, temporary: boolean): Promise { @@ -1914,7 +1915,7 @@ export class DefaultPackageManager implements PackageManager { } const args = ["uninstall", source.name, "--prefix", installRoot]; if (packageManagerName !== "pnpm") { - args.push("--legacy-peer-deps"); + args.push("--legacy-peer-deps", "--no-audit", "--no-fund"); } await this.runNpmCommand(args); } diff --git a/packages/coding-agent/test/package-manager.test.ts b/packages/coding-agent/test/package-manager.test.ts index f8446b657..38d93b232 100644 --- a/packages/coding-agent/test/package-manager.test.ts +++ b/packages/coding-agent/test/package-manager.test.ts @@ -756,6 +756,8 @@ Content`, "--prefix", realpathSync(join(agentDir, "npm")), "--legacy-peer-deps", + "--no-audit", + "--no-fund", ], undefined, ); @@ -769,7 +771,15 @@ Content`, expect(runCommandSpy).toHaveBeenCalledWith( "npm", - ["uninstall", "@scope/pkg", "--prefix", realpathSync(join(agentDir, "npm")), "--legacy-peer-deps"], + [ + "uninstall", + "@scope/pkg", + "--prefix", + realpathSync(join(agentDir, "npm")), + "--legacy-peer-deps", + "--no-audit", + "--no-fund", + ], undefined, ); }); @@ -793,12 +803,12 @@ Content`, expect(runCommandSpy).toHaveBeenCalledWith( "npm", - ["install", "@scope/pkg", "--prefix", realNpmRoot, "--legacy-peer-deps"], + ["install", "@scope/pkg", "--prefix", realNpmRoot, "--legacy-peer-deps", "--no-audit", "--no-fund"], undefined, ); expect(runCommandSpy).toHaveBeenCalledWith( "npm", - ["uninstall", "@scope/pkg", "--prefix", realNpmRoot, "--legacy-peer-deps"], + ["uninstall", "@scope/pkg", "--prefix", realNpmRoot, "--legacy-peer-deps", "--no-audit", "--no-fund"], undefined, ); }); @@ -849,9 +859,13 @@ Content`, await packageManager.install(source); - expect(runCommandSpy).toHaveBeenCalledWith("npm", ["install", "--omit=dev", "--legacy-peer-deps"], { - cwd: targetDir, - }); + expect(runCommandSpy).toHaveBeenCalledWith( + "npm", + ["install", "--omit=dev", "--legacy-peer-deps", "--no-audit", "--no-fund"], + { + cwd: targetDir, + }, + ); }); it("should remove a newly created checkout when git clone fails", async () => { @@ -915,9 +929,13 @@ Content`, cwd: targetDir, }); expect(runCommandSpy).toHaveBeenCalledWith("git", ["clean", "-fdx"], { cwd: targetDir }); - expect(runCommandSpy).toHaveBeenCalledWith("npm", ["install", "--omit=dev", "--legacy-peer-deps"], { - cwd: targetDir, - }); + expect(runCommandSpy).toHaveBeenCalledWith( + "npm", + ["install", "--omit=dev", "--legacy-peer-deps", "--no-audit", "--no-fund"], + { + cwd: targetDir, + }, + ); }); it("should reconcile an existing git checkout to its update target when installing without a ref", async () => { @@ -1066,9 +1084,13 @@ Content`, await packageManager.update(source); - expect(runCommandSpy).toHaveBeenCalledWith("npm", ["install", "--omit=dev", "--legacy-peer-deps"], { - cwd: targetDir, - }); + expect(runCommandSpy).toHaveBeenCalledWith( + "npm", + ["install", "--omit=dev", "--legacy-peer-deps", "--no-audit", "--no-fund"], + { + cwd: targetDir, + }, + ); }); it("should repair missing git package dependencies when the checkout is already current", async () => { @@ -1093,9 +1115,13 @@ Content`, await packageManager.update(source); - expect(runCommandSpy).toHaveBeenCalledWith("npm", ["install", "--omit=dev", "--legacy-peer-deps"], { - cwd: targetDir, - }); + expect(runCommandSpy).toHaveBeenCalledWith( + "npm", + ["install", "--omit=dev", "--legacy-peer-deps", "--no-audit", "--no-fund"], + { + cwd: targetDir, + }, + ); expect(runCommandSpy).not.toHaveBeenCalledWith("git", ["clean", "-fdx"], { cwd: targetDir }); }); @@ -1127,9 +1153,13 @@ Content`, await expect(packageManager.update(source)).rejects.toThrow("simulated clean failure"); - expect(runCommandSpy).toHaveBeenCalledWith("npm", ["install", "--omit=dev", "--legacy-peer-deps"], { - cwd: targetDir, - }); + expect(runCommandSpy).toHaveBeenCalledWith( + "npm", + ["install", "--omit=dev", "--legacy-peer-deps", "--no-audit", "--no-fund"], + { + cwd: targetDir, + }, + ); }); it("should disable peer installation through wrapped pnpm when updating git dependencies", async () => { @@ -2506,7 +2536,15 @@ export default function(api) { api.registerTool({ name: "test", description: "te ); expect(runCommandSpy).toHaveBeenCalledWith( "npm", - ["install", "example@^1.0.0", "--prefix", realpathSync(join(tempDir, ".pi", "npm")), "--legacy-peer-deps"], + [ + "install", + "example@^1.0.0", + "--prefix", + realpathSync(join(tempDir, ".pi", "npm")), + "--legacy-peer-deps", + "--no-audit", + "--no-fund", + ], undefined, ); }); @@ -2572,6 +2610,8 @@ export default function(api) { api.registerTool({ name: "test", description: "te "--prefix", realpathSync(join(agentDir, "npm")), "--legacy-peer-deps", + "--no-audit", + "--no-fund", ]); mkdirSync(managedPath, { recursive: true }); writeFileSync( @@ -2689,6 +2729,8 @@ export default function(api) { api.registerTool({ name: "test", description: "te "--prefix", realpathSync(join(agentDir, "npm")), "--legacy-peer-deps", + "--no-audit", + "--no-fund", ], undefined, ); @@ -2702,6 +2744,8 @@ export default function(api) { api.registerTool({ name: "test", description: "te "--prefix", realpathSync(join(tempDir, ".pi", "npm")), "--legacy-peer-deps", + "--no-audit", + "--no-fund", ], undefined, );