45 lines
2.1 KiB
JavaScript
45 lines
2.1 KiB
JavaScript
import { z } from 'zod';
|
|
import { config } from '../../config.js';
|
|
import { detectProject } from '../../lib/frameworks/detect.js';
|
|
import { readComposerJson } from '../../lib/frameworks/composer.js';
|
|
import { errorResult, jsonResult, toErrorMessage } from '../shared.js';
|
|
function extractMajorMinor(versionConstraint) {
|
|
if (!versionConstraint)
|
|
return '11.x';
|
|
const match = versionConstraint.match(/(\d+)\.(\d+)/);
|
|
if (!match)
|
|
return '11.x';
|
|
const [, major, minor] = match;
|
|
return `${major}.${minor}`;
|
|
}
|
|
export function registerSearchLaravelDocsTool(server) {
|
|
server.registerTool('search_laravel_docs', {
|
|
title: 'Search Laravel Docs',
|
|
description: 'Return a deep link to the Laravel documentation for a topic, version-matched to the laravel/framework constraint in composer.json.',
|
|
inputSchema: {
|
|
topic: z.string().min(1).describe('Documentation topic, e.g. "eloquent" or "validation".'),
|
|
version: z.string().optional().describe('Override the version segment, e.g. "11.x". Auto-detected by default.'),
|
|
},
|
|
}, async ({ topic, version }) => {
|
|
try {
|
|
const detected = detectProject(config.workspaceRoot);
|
|
const laravelRoot = detected.backend?.kind === 'laravel' ? detected.backend.root : config.workspaceRoot;
|
|
const composerJson = readComposerJson(laravelRoot);
|
|
const constraint = composerJson?.require?.['laravel/framework'];
|
|
const docsVersion = version ?? extractMajorMinor(constraint) + '.x';
|
|
const slug = topic.toLowerCase().replace(/\s+/g, '-');
|
|
const url = `https://laravel.com/docs/${docsVersion}/${slug}`;
|
|
return jsonResult({
|
|
topic,
|
|
version: docsVersion,
|
|
composerConstraint: constraint ?? null,
|
|
url,
|
|
note: 'This is a best-effort documentation link. If the topic page does not exist, MDN/search engines may help refine the query.',
|
|
});
|
|
}
|
|
catch (error) {
|
|
return errorResult(toErrorMessage(error));
|
|
}
|
|
});
|
|
}
|
|
//# sourceMappingURL=searchLaravelDocs.js.map
|