43 lines
2.4 KiB
JavaScript
43 lines
2.4 KiB
JavaScript
import { z } from 'zod';
|
|
import { config } from '../../config.js';
|
|
import { detectProject } from '../../lib/frameworks/detect.js';
|
|
import { resolveTarget } from '../../lib/frameworks/resolve.js';
|
|
import { addDependencyCommandFor, detectJsPackageManager } from '../../lib/frameworks/packageManager.js';
|
|
import { runCommand } from '../../lib/runCommand.js';
|
|
import { errorResult, jsonResult, targetSchema, toErrorMessage } from '../shared.js';
|
|
export function registerAddDependencyTool(server) {
|
|
server.registerTool('add_dependency', {
|
|
title: 'Add / Remove Dependency',
|
|
description: 'Add or remove a dependency, auto-detecting npm/pnpm/yarn/bun (package.json) vs. Composer (composer.json) from the resolved project. Pass `ecosystem` explicitly to override the auto-detection.',
|
|
inputSchema: {
|
|
packages: z.array(z.string().min(1)).min(1).describe('Package names to add/remove, e.g. ["axios"] or ["laravel/sanctum"].'),
|
|
ecosystem: z.enum(['npm', 'composer']).optional(),
|
|
dev: z.boolean().optional().default(false).describe('Install as a dev dependency (ignored for composer remove).'),
|
|
remove: z.boolean().optional().default(false),
|
|
target: targetSchema,
|
|
},
|
|
}, async ({ packages, ecosystem, dev, remove, target }) => {
|
|
try {
|
|
const detected = detectProject(config.workspaceRoot);
|
|
const { adapter, target: resolvedTarget } = resolveTarget(detected, target);
|
|
const resolvedEcosystem = ecosystem ?? (adapter.packageManager === 'composer' ? 'composer' : 'npm');
|
|
const { command, args } = resolvedEcosystem === 'composer'
|
|
? {
|
|
command: 'composer',
|
|
args: remove
|
|
? ['remove', ...packages]
|
|
: ['require', ...(dev ? ['--dev'] : []), ...packages],
|
|
}
|
|
: addDependencyCommandFor(detectJsPackageManager(adapter.root), packages, { dev, remove });
|
|
const result = await runCommand(command, args, {
|
|
cwd: adapter.root,
|
|
timeoutMs: config.scaffoldCommandTimeoutMs,
|
|
});
|
|
return jsonResult({ target: resolvedTarget, ecosystem: resolvedEcosystem, ...result });
|
|
}
|
|
catch (error) {
|
|
return errorResult(toErrorMessage(error));
|
|
}
|
|
});
|
|
}
|
|
//# sourceMappingURL=addDependency.js.map
|