Files
2026-07-31 13:12:54 -04:00

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