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

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