57 lines
2.6 KiB
JavaScript
57 lines
2.6 KiB
JavaScript
import { z } from 'zod';
|
|
import { config } from '../../config.js';
|
|
import { runCommand } from '../../lib/runCommand.js';
|
|
import { errorResult, jsonResult, toErrorMessage } from '../shared.js';
|
|
import { requirePhpBackend } from './requireLaravel.js';
|
|
/**
|
|
* Composer helpers shared by Laravel and CodeIgniter (both are Composer-based).
|
|
* Mirrors `add_dependency` but is explicitly for PHP packages.
|
|
*/
|
|
export function registerComposerTools(server) {
|
|
server.registerTool('composer_require', {
|
|
title: 'Composer Require',
|
|
description: 'Add a Composer dependency to the detected PHP backend (Laravel or CodeIgniter). Equivalent to `composer require`.',
|
|
inputSchema: {
|
|
packages: z.array(z.string().min(1)).min(1).describe('Packagist package names, e.g. ["laravel/sanctum"].'),
|
|
dev: z.boolean().optional().default(false).describe('Install into require-dev (--dev).'),
|
|
},
|
|
}, async ({ packages, dev }) => {
|
|
try {
|
|
const backend = requirePhpBackend();
|
|
const args = ['require', ...(dev ? ['--dev'] : []), ...packages, '--no-interaction'];
|
|
const result = await runCommand('composer', args, {
|
|
cwd: backend.root,
|
|
timeoutMs: config.scaffoldCommandTimeoutMs,
|
|
});
|
|
return jsonResult({ adapter: backend.label, packages, dev, ...result });
|
|
}
|
|
catch (error) {
|
|
return errorResult(toErrorMessage(error));
|
|
}
|
|
});
|
|
server.registerTool('composer_remove', {
|
|
title: 'Composer Remove',
|
|
description: 'Remove a Composer dependency from the detected PHP backend (Laravel or CodeIgniter). Requires confirm: true.',
|
|
inputSchema: {
|
|
packages: z.array(z.string().min(1)).min(1).describe('Packagist package names to remove.'),
|
|
confirm: z
|
|
.literal(true)
|
|
.describe('Must be exactly true; removing dependencies is a deliberate opt-in.'),
|
|
},
|
|
}, async ({ packages, confirm }) => {
|
|
if (!confirm)
|
|
return errorResult('confirm: true is required to run composer_remove.');
|
|
try {
|
|
const backend = requirePhpBackend();
|
|
const result = await runCommand('composer', ['remove', ...packages, '--no-interaction'], {
|
|
cwd: backend.root,
|
|
timeoutMs: config.scaffoldCommandTimeoutMs,
|
|
});
|
|
return jsonResult({ adapter: backend.label, packages, ...result });
|
|
}
|
|
catch (error) {
|
|
return errorResult(toErrorMessage(error));
|
|
}
|
|
});
|
|
}
|
|
//# sourceMappingURL=composer.js.map
|