babylon-mcp/scripts/search-handmenu-api.ts
Michael Mainguy 5459fe9179 feat: Add TypeScript API documentation indexing and search with improved test coverage
## New Features
- Implemented TSDoc extraction using TypeDoc API
- Added API documentation indexing with LanceDB vector search
- Created search_babylon_api MCP tool for querying API docs
- Added 6 indexing and testing scripts

## API Indexing System
- TSDocExtractor: Parses TypeScript source files and extracts documentation
- ApiIndexer: Converts API docs to embeddings and stores in LanceDB
- Support for all Babylon.js packages (core, gui, materials, loaders, etc.)
- Successfully indexed 44,253 API entries from core package

## Bug Fixes
- Fixed TypeScript strict mode errors with exactOptionalPropertyTypes
- Fixed optional property handling in tsConfigPath and returns fields
- Resolved EventEmitter MaxListeners warning in test suite
- Updated all failing handler tests for real implementation

## Test Coverage Improvements
- Added 27 new tests (92 → 119 tests passing)
- Lines: 93.88% (was 82.53%, target 80%) ✓
- Functions: 100% (was 91.17%, target 80%) ✓
- Statements: 93.3% (was 81.58%, target 80%) ✓
- Branches: 69.72% (was 51.37%, target 75%)

## New Test Files
- src/search/lancedb-search.test.ts (15 tests)
- Enhanced handlers.test.ts with API search tests
- Enhanced document-parser.test.ts with edge case tests

## Scripts Added
- scripts/index-api.ts: Index all Babylon.js API documentation
- scripts/test-api-indexing.ts: Test API indexing for core package
- scripts/test-api-search.ts: Test API search functionality
- scripts/get-api-details.ts: Display detailed API documentation
- scripts/search-handmenu-api.ts: Search for HandMenu API examples

## Technical Details
- TypeDoc integration for TSDoc extraction
- Vector embeddings using Xenova/all-MiniLM-L6-v2 model
- Semantic search across 11 Babylon.js packages
- GitHub source links with line numbers in search results

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 05:58:16 -06:00

66 lines
2.0 KiB
TypeScript

import { LanceDBSearch } from '../src/search/lancedb-search.js';
async function main() {
console.log('Searching for HandMenu in API documentation...\n');
const search = new LanceDBSearch('./data/lancedb', 'babylon_docs');
await search.initialize();
try {
const results = await search.searchApi('HandMenu', { limit: 10 });
console.log(`Found ${results.length} results:\n`);
for (let i = 0; i < results.length; i++) {
const result = results[i];
console.log('='.repeat(80));
console.log(`${i + 1}. ${result.fullName} (${result.kind})`);
console.log('='.repeat(80));
if (result.summary) {
console.log(`Summary: ${result.summary}`);
}
if (result.description && result.description !== result.summary) {
console.log(`Description: ${result.description}`);
}
if (result.parameters) {
try {
const params = JSON.parse(result.parameters);
if (params.length > 0) {
console.log(`Parameters:`);
for (const param of params) {
console.log(` - ${param.name}: ${param.type}${param.description ? ' - ' + param.description : ''}`);
}
}
} catch (e) {
// Skip if parameters can't be parsed
}
}
if (result.returns) {
try {
const returns = JSON.parse(result.returns);
console.log(`Returns: ${returns.type}${returns.description ? ' - ' + returns.description : ''}`);
} catch (e) {
// Skip if returns can't be parsed
}
}
console.log(`Relevance: ${(result.score * 100).toFixed(1)}%`);
console.log(`Source: ${result.sourceFile}:${result.sourceLine}`);
console.log(`URL: ${result.url}`);
console.log();
}
} catch (error) {
console.error('Error during search:', error);
if (error instanceof Error) {
console.error('Stack:', error.stack);
}
}
await search.close();
}
main().catch(console.error);