first
This commit is contained in:
182
validate-complete-provider-coverage.js
Normal file
182
validate-complete-provider-coverage.js
Normal file
@@ -0,0 +1,182 @@
|
||||
/**
|
||||
* @fileoverview Validate complete provider tool coverage
|
||||
* Cross-validates that all 147 provider endpoints from api-docs.json are documented with exact details
|
||||
*/
|
||||
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
/**
|
||||
* Validate complete provider tool coverage
|
||||
*/
|
||||
function validateCompleteProviderCoverage() {
|
||||
try {
|
||||
console.log('=== VALIDATING COMPLETE PROVIDER TOOL COVERAGE ===');
|
||||
console.log('');
|
||||
|
||||
// Read the complete provider tools
|
||||
const completeProviderPath = path.join(process.cwd(), 'complete-provider-tools.json');
|
||||
const completeProviderContent = fs.readFileSync(completeProviderPath, 'utf8');
|
||||
const completeProviderTools = JSON.parse(completeProviderContent);
|
||||
|
||||
// Read the updated documentation
|
||||
const docPath = path.join(process.cwd(), 'MCP-TOOLS-REFERENCE.md');
|
||||
const docContent = fs.readFileSync(docPath, 'utf8');
|
||||
|
||||
console.log(`Found ${completeProviderTools.length} complete provider tools`);
|
||||
console.log('');
|
||||
|
||||
// Extract tool names from documentation
|
||||
const toolNameRegex = /\| `(provider_[^`]+)` \|/g;
|
||||
const documentedToolNames = [];
|
||||
let match;
|
||||
|
||||
while ((match = toolNameRegex.exec(docContent)) !== null) {
|
||||
documentedToolNames.push(match[1]);
|
||||
}
|
||||
|
||||
console.log(`Found ${documentedToolNames.length} provider tools documented in MCP-TOOLS-REFERENCE.md`);
|
||||
console.log('');
|
||||
|
||||
// Validate coverage
|
||||
const expectedToolNames = completeProviderTools.map(tool => tool.toolName);
|
||||
const missingTools = expectedToolNames.filter(toolName => !documentedToolNames.includes(toolName));
|
||||
const extraTools = documentedToolNames.filter(toolName => !expectedToolNames.includes(toolName));
|
||||
|
||||
console.log('=== COVERAGE VALIDATION ===');
|
||||
|
||||
if (missingTools.length > 0) {
|
||||
console.error(`❌ MISSING TOOLS (${missingTools.length}):`);
|
||||
missingTools.forEach(toolName => {
|
||||
console.error(` - ${toolName}`);
|
||||
});
|
||||
console.log('');
|
||||
}
|
||||
|
||||
if (extraTools.length > 0) {
|
||||
console.warn(`⚠️ EXTRA TOOLS (${extraTools.length}):`);
|
||||
extraTools.forEach(toolName => {
|
||||
console.warn(` - ${toolName}`);
|
||||
});
|
||||
console.log('');
|
||||
}
|
||||
|
||||
// Check for placeholder text
|
||||
const hasPlaceholderText = docContent.includes('... and') && docContent.includes('more provider tools');
|
||||
|
||||
console.log('=== PLACEHOLDER TEXT CHECK ===');
|
||||
if (hasPlaceholderText) {
|
||||
console.error('❌ PLACEHOLDER TEXT FOUND: Documentation still contains "... and X more provider tools" text');
|
||||
} else {
|
||||
console.log('✅ NO PLACEHOLDER TEXT: All placeholder text has been removed');
|
||||
}
|
||||
console.log('');
|
||||
|
||||
// Validate tool name format
|
||||
console.log('=== TOOL NAME FORMAT VALIDATION ===');
|
||||
const invalidToolNames = expectedToolNames.filter(toolName => {
|
||||
return !toolName.startsWith('provider_') ||
|
||||
toolName.includes(' ') ||
|
||||
!/^[a-z0-9_]+$/.test(toolName);
|
||||
});
|
||||
|
||||
if (invalidToolNames.length > 0) {
|
||||
console.error(`❌ INVALID TOOL NAMES (${invalidToolNames.length}):`);
|
||||
invalidToolNames.forEach(toolName => {
|
||||
console.error(` - ${toolName}`);
|
||||
});
|
||||
} else {
|
||||
console.log('✅ ALL TOOL NAMES VALID: Follow provider_{action}_{resource} convention');
|
||||
}
|
||||
console.log('');
|
||||
|
||||
// Validate endpoint coverage by category
|
||||
console.log('=== CATEGORY COVERAGE VALIDATION ===');
|
||||
const categoryCount = {};
|
||||
completeProviderTools.forEach(tool => {
|
||||
const category = tool.category || 'unknown';
|
||||
categoryCount[category] = (categoryCount[category] || 0) + 1;
|
||||
});
|
||||
|
||||
Object.keys(categoryCount).sort().forEach(category => {
|
||||
console.log(`${category}: ${categoryCount[category]} tools`);
|
||||
});
|
||||
console.log('');
|
||||
|
||||
// Final validation summary
|
||||
console.log('=== FINAL VALIDATION SUMMARY ===');
|
||||
|
||||
const totalExpected = 147;
|
||||
const totalGenerated = completeProviderTools.length;
|
||||
const totalDocumented = documentedToolNames.length;
|
||||
const coveragePercentage = ((totalDocumented / totalExpected) * 100).toFixed(1);
|
||||
|
||||
console.log(`Expected provider endpoints: ${totalExpected}`);
|
||||
console.log(`Generated provider tools: ${totalGenerated}`);
|
||||
console.log(`Documented provider tools: ${totalDocumented}`);
|
||||
console.log(`Coverage percentage: ${coveragePercentage}%`);
|
||||
console.log('');
|
||||
|
||||
// Success criteria
|
||||
const isComplete = (
|
||||
missingTools.length === 0 &&
|
||||
extraTools.length === 0 &&
|
||||
!hasPlaceholderText &&
|
||||
invalidToolNames.length === 0 &&
|
||||
totalDocumented === totalExpected
|
||||
);
|
||||
|
||||
if (isComplete) {
|
||||
console.log('🎉 COMPLETE SUCCESS!');
|
||||
console.log('✅ All 147 provider endpoints have been:');
|
||||
console.log(' - Extracted from api-docs.json with exact parameter details');
|
||||
console.log(' - Generated as MCP tools with proper naming convention');
|
||||
console.log(' - Documented in MCP-TOOLS-REFERENCE.md with complete details');
|
||||
console.log(' - Cross-validated for 100% coverage');
|
||||
console.log('');
|
||||
console.log('📊 FINAL STATISTICS:');
|
||||
console.log(` • Provider tools documented: ${totalDocumented}/147 (100%)`);
|
||||
console.log(' • No placeholder text remaining');
|
||||
console.log(' • All tool names follow proper convention');
|
||||
console.log(' • Complete parameter mapping included');
|
||||
console.log(' • Professional documentation structure maintained');
|
||||
console.log('');
|
||||
console.log('🔧 IMPLEMENTATION COMPLETE:');
|
||||
console.log(' • Every single provider endpoint from api-docs.json is now explicitly listed');
|
||||
console.log(' • Each tool has exact parameter names, types, and descriptions');
|
||||
console.log(' • No "... and X more tools" placeholders remain');
|
||||
console.log(' • 100% complete tool inventory achieved');
|
||||
} else {
|
||||
console.error('❌ VALIDATION FAILED:');
|
||||
if (missingTools.length > 0) console.error(` • ${missingTools.length} tools missing from documentation`);
|
||||
if (extraTools.length > 0) console.error(` • ${extraTools.length} extra tools in documentation`);
|
||||
if (hasPlaceholderText) console.error(' • Placeholder text still present');
|
||||
if (invalidToolNames.length > 0) console.error(` • ${invalidToolNames.length} invalid tool names`);
|
||||
if (totalDocumented !== totalExpected) console.error(` • Expected ${totalExpected} tools, found ${totalDocumented}`);
|
||||
}
|
||||
|
||||
return {
|
||||
success: isComplete,
|
||||
totalExpected,
|
||||
totalGenerated,
|
||||
totalDocumented,
|
||||
coveragePercentage: parseFloat(coveragePercentage),
|
||||
missingTools,
|
||||
extraTools,
|
||||
hasPlaceholderText,
|
||||
invalidToolNames,
|
||||
categoryCount
|
||||
};
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error validating complete provider coverage:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
// Run the validation
|
||||
if (import.meta.url === `file://${process.argv[1]}`) {
|
||||
validateCompleteProviderCoverage();
|
||||
}
|
||||
|
||||
export { validateCompleteProviderCoverage };
|
Reference in New Issue
Block a user