UNPKG

onerios-mcp-server

Version:

OneriosMCP server providing memory, backlog management, file operations, and utility functions for enhanced AI assistant capabilities

387 lines (386 loc) 16.2 kB
"use strict"; /** * MCP Tools for GitHub Wiki Generation * * Provides MCP tool handlers for automated wiki page generation from backlog data. * Integrates with GitHub API to publish documentation directly to repository wikis. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.wikiGenerationTools = void 0; exports.handleGenerateWikiPages = handleGenerateWikiPages; exports.handlePublishWikiToGitHub = handlePublishWikiToGitHub; exports.handlePreviewWikiContent = handlePreviewWikiContent; exports.handleGetWikiTemplates = handleGetWikiTemplates; const zod_1 = require("zod"); const github_wiki_generator_js_1 = require("./github-wiki-generator.js"); // Define proper schemas to match BacklogData interface const TaskSchema = zod_1.z.object({ id: zod_1.z.string(), title: zod_1.z.string(), description: zod_1.z.string().optional(), status: zod_1.z.enum(['New', 'InWork', 'Done']) }); const IssueSchema = zod_1.z.object({ id: zod_1.z.string(), name: zod_1.z.string(), description: zod_1.z.string().optional(), status: zod_1.z.enum(['New', 'InWork', 'Done']), tasks: zod_1.z.array(TaskSchema) }); const BacklogDataSchema = zod_1.z.object({ issues: zod_1.z.array(IssueSchema), statistics: zod_1.z.object({ totalIssues: zod_1.z.number(), totalTasks: zod_1.z.number(), issuesByStatus: zod_1.z.record(zod_1.z.number()), tasksByStatus: zod_1.z.record(zod_1.z.number()), activeIssue: zod_1.z.string().optional() }) }); /** * Generate wiki pages from backlog data */ async function handleGenerateWikiPages(args) { const schema = zod_1.z.object({ backlogData: BacklogDataSchema, options: github_wiki_generator_js_1.WikiGenerationOptionsSchema.optional().default({ repository: '', includeProgress: true, includeTaskBreakdown: true, includeTimeline: false, templateType: 'standard', sections: ['overview', 'progress', 'issues', 'tasks'] }) }); try { const parsed = schema.parse(args); if (!parsed.options.repository) { return { success: false, error: 'Repository is required in format owner/repo' }; } const wikiGenerator = new github_wiki_generator_js_1.GitHubWikiGenerator(); const pages = await wikiGenerator.generateWikiPages(parsed.backlogData, parsed.options); return { success: true, pagesGenerated: pages.length, pages: pages.map(page => ({ title: page.title, path: page.path, contentLength: page.content.length, lastUpdated: page.lastUpdated })), message: `Successfully generated ${pages.length} wiki pages` }; } catch (error) { return { success: false, error: error instanceof Error ? error.message : 'Unknown error occurred', details: error instanceof zod_1.z.ZodError ? error.errors : undefined }; } } /** * Publish generated wiki pages to GitHub repository */ async function handlePublishWikiToGitHub(args) { const schema = zod_1.z.object({ backlogData: BacklogDataSchema, repository: zod_1.z.string().regex(/^[^/]+\/[^/]+$/, 'Repository must be in format owner/repo'), options: github_wiki_generator_js_1.WikiGenerationOptionsSchema.optional().default({ repository: '', includeProgress: true, includeTaskBreakdown: true, includeTimeline: false, templateType: 'standard', sections: ['overview', 'progress', 'issues', 'tasks'] }), token: zod_1.z.string().optional() }); try { const parsed = schema.parse(args); // Set repository in options parsed.options.repository = parsed.repository; const wikiGenerator = new github_wiki_generator_js_1.GitHubWikiGenerator(); // Generate wiki pages const pages = await wikiGenerator.generateWikiPages(parsed.backlogData, parsed.options); // Publish to GitHub const publishResult = await wikiGenerator.publishToGitHub(pages, parsed.repository, parsed.token); return { success: publishResult.success, repository: parsed.repository, pagesGenerated: pages.length, publishedPages: publishResult.publishedPages, errors: publishResult.errors, message: publishResult.success ? `Successfully published ${publishResult.publishedPages.length} wiki pages to ${parsed.repository}` : `Published ${publishResult.publishedPages.length} pages with ${publishResult.errors.length} errors` }; } catch (error) { return { success: false, error: error instanceof Error ? error.message : 'Unknown error occurred', details: error instanceof zod_1.z.ZodError ? error.errors : undefined }; } } /** * Preview generated wiki content without publishing */ async function handlePreviewWikiContent(args) { const schema = zod_1.z.object({ backlogData: BacklogDataSchema, options: github_wiki_generator_js_1.WikiGenerationOptionsSchema.optional().default({ repository: 'preview/repository', includeProgress: true, includeTaskBreakdown: true, includeTimeline: false, templateType: 'standard', sections: ['overview', 'progress', 'issues', 'tasks'] }), pageTitle: zod_1.z.string().optional().describe('Specific page to preview, or all pages if not specified') }); try { const parsed = schema.parse(args); const wikiGenerator = new github_wiki_generator_js_1.GitHubWikiGenerator(); const pages = await wikiGenerator.generateWikiPages(parsed.backlogData, parsed.options); // Filter to specific page if requested const pagesToShow = parsed.pageTitle ? pages.filter(page => page.title === parsed.pageTitle) : pages; if (parsed.pageTitle && pagesToShow.length === 0) { return { success: false, error: `Page "${parsed.pageTitle}" not found. Available pages: ${pages.map(p => p.title).join(', ')}` }; } return { success: true, pagesGenerated: pages.length, preview: pagesToShow.map(page => ({ title: page.title, path: page.path, contentLength: page.content.length, content: page.content.substring(0, 2000) + (page.content.length > 2000 ? '\n\n... (content truncated)' : ''), lastUpdated: page.lastUpdated })), availablePages: pages.map(p => p.title), message: `Generated preview for ${pagesToShow.length} page(s)` }; } catch (error) { return { success: false, error: error instanceof Error ? error.message : 'Unknown error occurred', details: error instanceof zod_1.z.ZodError ? error.errors : undefined }; } } /** * Get wiki generation templates and options */ async function handleGetWikiTemplates(args) { const schema = zod_1.z.object({ includeExamples: zod_1.z.boolean().optional().default(false) }); try { const parsed = schema.parse(args); const templates = { standard: { name: 'Standard Template', description: 'Balanced documentation with progress tracking and issue breakdowns', sections: ['overview', 'progress', 'issues', 'tasks'], features: ['Progress bars', 'Status emojis', 'Task breakdowns', 'Navigation links'] }, detailed: { name: 'Detailed Template', description: 'Comprehensive documentation with full task descriptions and statistics', sections: ['overview', 'progress', 'issues', 'tasks', 'statistics'], features: ['Full task descriptions', 'Detailed statistics', 'Complexity analysis', 'ASCII charts'] }, compact: { name: 'Compact Template', description: 'Minimal documentation focused on current status and next actions', sections: ['overview', 'progress'], features: ['Essential metrics only', 'Quick status overview', 'Minimal formatting'] } }; const sectionOptions = { overview: 'Project status summary with key metrics and navigation', progress: 'Detailed progress tracking with visual progress bars', issues: 'Comprehensive issue breakdown grouped by status', tasks: 'Complete task listing with issue context', timeline: 'Project timeline (requires timestamp tracking)', statistics: 'Advanced analytics with ASCII charts and complexity analysis', team: 'Team productivity metrics (planned feature)' }; const examples = parsed.includeExamples ? { basicUsage: { repository: 'owner/repo-name', includeProgress: true, includeTaskBreakdown: true, templateType: 'standard', sections: ['overview', 'progress', 'issues'] }, detailedUsage: { repository: 'owner/repo-name', includeProgress: true, includeTaskBreakdown: true, includeTimeline: false, templateType: 'detailed', sections: ['overview', 'progress', 'issues', 'tasks', 'statistics'] } } : undefined; return { success: true, templates, sectionOptions, examples, message: 'Retrieved available wiki templates and configuration options' }; } catch (error) { return { success: false, error: error instanceof Error ? error.message : 'Unknown error occurred' }; } } // Export tool configurations for MCP integration exports.wikiGenerationTools = [ { name: 'github_generate_wiki_pages', description: 'Generate wiki pages from backlog data with customizable templates and sections', inputSchema: { type: 'object', properties: { backlogData: { type: 'object', description: 'Complete backlog data with issues, tasks, and statistics', properties: { issues: { type: 'array', items: { type: 'object', properties: { id: { type: 'string' }, name: { type: 'string' }, description: { type: 'string' }, status: { type: 'string', enum: ['New', 'InWork', 'Done'] }, tasks: { type: 'array', items: { type: 'object', properties: { id: { type: 'string' }, title: { type: 'string' }, description: { type: 'string' }, status: { type: 'string', enum: ['New', 'InWork', 'Done'] } }, required: ['id', 'title', 'status'] } } }, required: ['id', 'name', 'status', 'tasks'] } }, statistics: { type: 'object', properties: { totalIssues: { type: 'number' }, totalTasks: { type: 'number' }, issuesByStatus: { type: 'object' }, tasksByStatus: { type: 'object' }, activeIssue: { type: 'string' } }, required: ['totalIssues', 'totalTasks', 'issuesByStatus', 'tasksByStatus'] } }, required: ['issues', 'statistics'] }, options: { type: 'object', properties: { repository: { type: 'string', description: 'Repository in format owner/repo' }, includeProgress: { type: 'boolean', default: true }, includeTaskBreakdown: { type: 'boolean', default: true }, includeTimeline: { type: 'boolean', default: false }, templateType: { type: 'string', enum: ['standard', 'detailed', 'compact'], default: 'standard' }, sections: { type: 'array', items: { type: 'string', enum: ['overview', 'progress', 'issues', 'tasks', 'timeline', 'statistics', 'team'] }, default: ['overview', 'progress', 'issues', 'tasks'] } }, required: ['repository'] } }, required: ['backlogData'] } }, { name: 'github_publish_wiki', description: 'Generate and publish wiki pages directly to GitHub repository wiki', inputSchema: { type: 'object', properties: { backlogData: { type: 'object', description: 'Complete backlog data with issues, tasks, and statistics' }, repository: { type: 'string', description: 'GitHub repository in format owner/repo' }, options: { type: 'object', description: 'Wiki generation options and template settings' }, token: { type: 'string', description: 'GitHub token (optional - will use stored token if not provided)' } }, required: ['backlogData', 'repository'] } }, { name: 'github_preview_wiki', description: 'Preview generated wiki content without publishing to GitHub', inputSchema: { type: 'object', properties: { backlogData: { type: 'object', description: 'Complete backlog data with issues, tasks, and statistics' }, options: { type: 'object', description: 'Wiki generation options and template settings' }, pageTitle: { type: 'string', description: 'Specific page to preview (optional - previews all pages if not specified)' } }, required: ['backlogData'] } }, { name: 'github_wiki_templates', description: 'Get available wiki templates, sections, and configuration options', inputSchema: { type: 'object', properties: { includeExamples: { type: 'boolean', description: 'Include usage examples in response', default: false } } } } ];