init project
This commit is contained in:
Vendored
+75
@@ -0,0 +1,75 @@
|
||||
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
|
||||
Reference in New Issue
Block a user