mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-03-07 16:41:06 +08:00
- Added `__init__.py` in `codexlens/tools` for documentation generation. - Created `deepwiki_generator.py` to handle symbol extraction and markdown generation. - Introduced `MockMarkdownGenerator` for testing purposes. - Implemented `DeepWikiGenerator` class for managing documentation generation and file processing. - Added unit tests for `DeepWikiStore` to ensure proper functionality and error handling. - Created tests for DeepWiki TypeScript types matching.
144 lines
4.9 KiB
TypeScript
144 lines
4.9 KiB
TypeScript
/**
|
|
* DeepWiki Routes Module
|
|
* Handles all DeepWiki documentation API endpoints.
|
|
*
|
|
* Endpoints:
|
|
* - GET /api/deepwiki/files - List all documented files
|
|
* - GET /api/deepwiki/doc?path=<filePath> - Get document with symbols
|
|
* - GET /api/deepwiki/stats - Get storage statistics
|
|
* - GET /api/deepwiki/search?q=<query> - Search symbols
|
|
*/
|
|
|
|
import type { RouteContext } from './types.js';
|
|
import { getDeepWikiService } from '../../services/deepwiki-service.js';
|
|
|
|
/**
|
|
* Handle DeepWiki routes
|
|
* @returns true if route was handled, false otherwise
|
|
*/
|
|
export async function handleDeepWikiRoutes(ctx: RouteContext): Promise<boolean> {
|
|
const { pathname, url, res } = ctx;
|
|
|
|
// GET /api/deepwiki/files - List all documented files
|
|
if (pathname === '/api/deepwiki/files') {
|
|
try {
|
|
const service = getDeepWikiService();
|
|
|
|
// Return empty array if database not available (not an error)
|
|
if (!service.isAvailable()) {
|
|
console.log('[DeepWiki] Database not available, returning empty files list');
|
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
res.end(JSON.stringify([]));
|
|
return true;
|
|
}
|
|
|
|
const files = service.listDocumentedFiles();
|
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
res.end(JSON.stringify(files));
|
|
} catch (error) {
|
|
const message = error instanceof Error ? error.message : String(error);
|
|
console.error('[DeepWiki] Error listing files:', message);
|
|
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
res.end(JSON.stringify({ error: message }));
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// GET /api/deepwiki/doc?path=<filePath> - Get document with symbols
|
|
if (pathname === '/api/deepwiki/doc') {
|
|
const filePath = url.searchParams.get('path');
|
|
|
|
if (!filePath) {
|
|
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
res.end(JSON.stringify({ error: 'path parameter is required' }));
|
|
return true;
|
|
}
|
|
|
|
try {
|
|
const service = getDeepWikiService();
|
|
|
|
// Return 404 if database not available
|
|
if (!service.isAvailable()) {
|
|
console.log('[DeepWiki] Database not available');
|
|
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
res.end(JSON.stringify({ error: 'DeepWiki database not available' }));
|
|
return true;
|
|
}
|
|
|
|
const doc = service.getDocumentByPath(filePath);
|
|
|
|
if (!doc) {
|
|
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
res.end(JSON.stringify({ error: 'Document not found', path: filePath }));
|
|
return true;
|
|
}
|
|
|
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
res.end(JSON.stringify(doc));
|
|
} catch (error) {
|
|
const message = error instanceof Error ? error.message : String(error);
|
|
console.error('[DeepWiki] Error getting document:', message);
|
|
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
res.end(JSON.stringify({ error: message }));
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// GET /api/deepwiki/stats - Get storage statistics
|
|
if (pathname === '/api/deepwiki/stats') {
|
|
try {
|
|
const service = getDeepWikiService();
|
|
|
|
if (!service.isAvailable()) {
|
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
res.end(JSON.stringify({ available: false, files: 0, symbols: 0, docs: 0 }));
|
|
return true;
|
|
}
|
|
|
|
const stats = service.getStats();
|
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
res.end(JSON.stringify({ available: true, ...stats }));
|
|
} catch (error) {
|
|
const message = error instanceof Error ? error.message : String(error);
|
|
console.error('[DeepWiki] Error getting stats:', message);
|
|
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
res.end(JSON.stringify({ error: message }));
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// GET /api/deepwiki/search?q=<query> - Search symbols
|
|
if (pathname === '/api/deepwiki/search') {
|
|
const query = url.searchParams.get('q');
|
|
const limit = parseInt(url.searchParams.get('limit') || '50', 10);
|
|
|
|
if (!query) {
|
|
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
res.end(JSON.stringify({ error: 'q parameter is required' }));
|
|
return true;
|
|
}
|
|
|
|
try {
|
|
const service = getDeepWikiService();
|
|
|
|
if (!service.isAvailable()) {
|
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
res.end(JSON.stringify([]));
|
|
return true;
|
|
}
|
|
|
|
const symbols = service.searchSymbols(query, limit);
|
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
res.end(JSON.stringify(symbols));
|
|
} catch (error) {
|
|
const message = error instanceof Error ? error.message : String(error);
|
|
console.error('[DeepWiki] Error searching symbols:', message);
|
|
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
res.end(JSON.stringify({ error: message }));
|
|
}
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|