From 617c45fb8649195dca2d4639269a6db5fa227c89 Mon Sep 17 00:00:00 2001 From: WJH <3506456886@qq.com> Date: Wed, 1 Jul 2026 18:42:57 +0800 Subject: [PATCH] fix(agent): use project package manager for dependency recovery --- .../core/src/agent/step-callbacks.test.ts | 23 +++++++++++++++++++ packages/core/src/agent/step-callbacks.ts | 22 +++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/packages/core/src/agent/step-callbacks.test.ts b/packages/core/src/agent/step-callbacks.test.ts index 35591d94..99f3dc03 100644 --- a/packages/core/src/agent/step-callbacks.test.ts +++ b/packages/core/src/agent/step-callbacks.test.ts @@ -586,6 +586,29 @@ describe('createOnPhaseComplete', () => { expect(errors[0].error).toBe('Missing npm dependencies: lodash'); }); + it('uses pnpm add for missing dependencies when filesense detects pnpm', async () => { + const files = new Map([['src/app.ts', "import _ from 'lodash';\n"]]); + const { deps, onPhaseComplete } = setupPhaseComplete({ files }); + deps.contextManager.getContext.mockReturnValue({ + collectedContext: { + filesenseNavigation: { + summary: { + packageManager: 'pnpm', + }, + }, + }, + }); + deps.executor.callTool.mockResolvedValue({ + success: true, + content: '{"dependencies":{"react":"^18.0.0"}}', + }); + + const errors = await onPhaseComplete('实现', []); + + expect(errors).toHaveLength(1); + expect(errors[0].step.params).toEqual({ command: 'pnpm add lodash' }); + }); + it('runs the TypeScript check only when tsconfig.json was collected and reports parsed errors', async () => { const files = new Map([['tsconfig.json', '{}']]); const { deps, task, onPhaseComplete } = setupPhaseComplete({ files }); diff --git a/packages/core/src/agent/step-callbacks.ts b/packages/core/src/agent/step-callbacks.ts index 609a7c08..4eae5ae8 100644 --- a/packages/core/src/agent/step-callbacks.ts +++ b/packages/core/src/agent/step-callbacks.ts @@ -202,6 +202,24 @@ export function createOnPhaseError( // PLACEHOLDER_PHASE_COMPLETE +function createMissingDependencyInstallCommand( + packageManager: string | undefined, + packages: string[], +): string { + const packageList = packages.join(' '); + + switch (packageManager) { + case 'pnpm': + return `pnpm add ${packageList}`; + case 'yarn': + return `yarn add ${packageList}`; + case 'bun': + return `bun add ${packageList}`; + default: + return `npm install ${packageList}`; + } +} + export function createOnPhaseComplete( deps: StepCallbackDeps, task: AgentTask, @@ -267,13 +285,15 @@ export function createOnPhaseComplete( deps.debugLog( `[Agent] Found ${missingDeps.length} missing npm dependencies: ${missingDeps.join(', ')}`, ); + const packageManager = deps.contextManager.getContext(task.id)?.collectedContext + .filesenseNavigation?.summary?.packageManager; errors.push({ step: { stepId: 'install-missing-deps', description: `安装缺失的依赖: ${missingDeps.join(', ')}`, action: 'run_command' as const, tool: 'run_command', - params: { command: `npm install ${missingDeps.join(' ')}` }, + params: { command: createMissingDependencyInstallCommand(packageManager, missingDeps) }, dependencies: [], validation: [], status: 'failed' as const,