75 lines
3.4 KiB
JavaScript
75 lines
3.4 KiB
JavaScript
import fs from 'node:fs';
|
|
import path from 'node:path';
|
|
import { z } from 'zod';
|
|
import { config } from '../../config.js';
|
|
import { detectProject } from '../../lib/frameworks/detect.js';
|
|
import { readPackageJson } from '../../lib/frameworks/packageManager.js';
|
|
import { readComposerJson } from '../../lib/frameworks/composer.js';
|
|
import { errorResult, jsonResult, targetSchema, toErrorMessage } from '../shared.js';
|
|
export function registerGetPackageInfoTool(server) {
|
|
server.registerTool('get_package_info', {
|
|
title: 'Get Package Info',
|
|
description: 'Return installed package metadata from package.json (React/Node projects) or composer.json (PHP projects): version, scripts, and key dependencies.',
|
|
inputSchema: {
|
|
target: targetSchema,
|
|
ecosystem: z
|
|
.enum(['npm', 'composer', 'auto'])
|
|
.optional()
|
|
.default('auto')
|
|
.describe('Which manifest to read. Auto detects from the resolved project.'),
|
|
},
|
|
}, async ({ target, ecosystem }) => {
|
|
try {
|
|
const detected = detectProject(config.workspaceRoot);
|
|
const adapter = target === 'frontend'
|
|
? detected.frontend
|
|
: target === 'backend'
|
|
? detected.backend
|
|
: (detected.frontend ?? detected.backend ?? detected.primary);
|
|
if (!adapter)
|
|
return errorResult('No project detected in WORKSPACE_ROOT.');
|
|
const resolvedEcosystem = ecosystem === 'auto' ? (adapter.packageManager === 'composer' ? 'composer' : 'npm') : ecosystem;
|
|
const root = adapter.root;
|
|
if (resolvedEcosystem === 'composer') {
|
|
const composerJson = readComposerJson(root);
|
|
if (!composerJson)
|
|
return errorResult(`No composer.json found at ${root}`);
|
|
const lockPath = path.join(root, 'composer.lock');
|
|
let installed = {};
|
|
if (fs.existsSync(lockPath)) {
|
|
try {
|
|
const lock = JSON.parse(fs.readFileSync(lockPath, 'utf8'));
|
|
installed = Object.fromEntries((lock.packages ?? []).slice(0, 50).map((p) => [p.name, p.version]));
|
|
}
|
|
catch {
|
|
// ignore lock parse errors
|
|
}
|
|
}
|
|
return jsonResult({
|
|
ecosystem: 'composer',
|
|
root,
|
|
name: composerJson.name ?? null,
|
|
require: composerJson.require ?? {},
|
|
requireDev: composerJson['require-dev'] ?? {},
|
|
scripts: composerJson.scripts ?? {},
|
|
installedSample: installed,
|
|
});
|
|
}
|
|
const packageJson = readPackageJson(root);
|
|
if (!packageJson)
|
|
return errorResult(`No package.json found at ${root}`);
|
|
return jsonResult({
|
|
ecosystem: 'npm',
|
|
root,
|
|
name: packageJson.name ?? null,
|
|
scripts: packageJson.scripts ?? {},
|
|
dependencies: packageJson.dependencies ?? {},
|
|
devDependencies: packageJson.devDependencies ?? {},
|
|
});
|
|
}
|
|
catch (error) {
|
|
return errorResult(toErrorMessage(error));
|
|
}
|
|
});
|
|
}
|
|
//# sourceMappingURL=getPackageInfo.js.map
|