@simonecoelhosfo/optimizely-mcp-server
Version:
Optimizely MCP Server for AI assistants with integrated CLI tools
181 lines (152 loc) • 5.98 kB
JavaScript
/**
* Documentation Registry Viewer
*
* USAGE:
* node scripts/view-registry.js # Show last 10 entries
* node scripts/view-registry.js --limit 20 # Show last 20 entries
* node scripts/view-registry.js --category fixes # Show only fixes
* node scripts/view-registry.js --search "cache" # Search entries
* node scripts/view-registry.js --stats # Show statistics only
*/
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const REGISTRY_FILE = path.join(__dirname, '..', 'DOCUMENTATION-REGISTRY.json');
// Parse command line arguments
function parseArgs() {
const args = process.argv.slice(2);
const parsed = {
limit: 10,
category: null,
search: null,
stats: false
};
for (let i = 0; i < args.length; i++) {
const arg = args[i];
if (arg === '--stats') {
parsed.stats = true;
} else if (arg.startsWith('--')) {
const key = arg.replace('--', '');
const value = args[i + 1];
if (key === 'limit') parsed.limit = parseInt(value);
else parsed[key] = value;
i++; // Skip next argument as it's the value
}
}
return parsed;
}
// Load registry
function loadRegistry() {
if (!fs.existsSync(REGISTRY_FILE)) {
console.error('❌ Registry file not found. Run update-documentation-registry.js first.');
process.exit(1);
}
try {
return JSON.parse(fs.readFileSync(REGISTRY_FILE, 'utf8'));
} catch (error) {
console.error('❌ Error reading registry file:', error.message);
process.exit(1);
}
}
// Filter entries based on criteria
function filterEntries(entries, args) {
let filtered = entries;
if (args.category) {
filtered = filtered.filter(e => e.category === args.category);
}
if (args.search) {
const searchTerm = args.search.toLowerCase();
filtered = filtered.filter(e =>
e.task.toLowerCase().includes(searchTerm) ||
e.files.some(f => f.toLowerCase().includes(searchTerm)) ||
e.impact.toLowerCase().includes(searchTerm)
);
}
return filtered.slice(0, args.limit);
}
// Display statistics
function displayStats(registry) {
console.log('📊 DOCUMENTATION REGISTRY STATISTICS');
console.log('═══════════════════════════════════════');
console.log(`📋 Total Entries: ${registry.totalEntries}`);
console.log(`📅 Created: ${new Date(registry.created).toLocaleDateString()}`);
console.log(`🔄 Last Updated: ${new Date(registry.lastUpdated).toLocaleDateString()}`);
console.log('');
console.log('📈 BREAKDOWN BY CATEGORY:');
Object.entries(registry.categories).forEach(([category, count]) => {
const percentage = ((count / registry.totalEntries) * 100).toFixed(1);
console.log(` ${category.padEnd(15)} ${count.toString().padStart(3)} (${percentage}%)`);
});
console.log('');
// Recent activity
const recent = registry.entries.slice(0, 3);
console.log('🕒 RECENT ACTIVITY:');
recent.forEach(entry => {
const date = new Date(entry.timestamp).toLocaleDateString();
console.log(` ${date} - ${entry.action.toUpperCase()}: ${entry.task.substring(0, 60)}...`);
});
}
// Display entries
function displayEntries(entries, args) {
if (entries.length === 0) {
console.log('📭 No entries found matching your criteria.');
return;
}
console.log(`📋 SHOWING ${entries.length} ENTRIES`);
console.log('═'.repeat(80));
entries.forEach((entry, index) => {
const date = new Date(entry.timestamp).toLocaleDateString();
const time = new Date(entry.timestamp).toLocaleTimeString();
console.log(`${(index + 1).toString().padStart(2)}. ${entry.action.toUpperCase()} - ${date} ${time}`);
console.log(` 📝 ${entry.task}`);
console.log(` 📁 Files: ${entry.files.join(', ')}`);
console.log(` 🎯 Impact: ${entry.impact}`);
console.log(` 🏷️ Category: ${entry.category}`);
console.log(` 🆔 ID: ${entry.id}`);
console.log('');
});
}
// Display help
function displayHelp() {
console.log('📚 DOCUMENTATION REGISTRY VIEWER');
console.log('═══════════════════════════════════');
console.log('');
console.log('USAGE:');
console.log(' node scripts/view-registry.js # Show last 10 entries');
console.log(' node scripts/view-registry.js --limit 20 # Show last 20 entries');
console.log(' node scripts/view-registry.js --category fixes # Show only fixes');
console.log(' node scripts/view-registry.js --search "cache" # Search entries');
console.log(' node scripts/view-registry.js --stats # Show statistics only');
console.log('');
console.log('CATEGORIES:');
console.log(' documentation, implementation, testing, fixes, architecture');
console.log('');
console.log('EXAMPLES:');
console.log(' node scripts/view-registry.js --category documentation --limit 5');
console.log(' node scripts/view-registry.js --search "phase 4" --limit 15');
}
// Main execution
function main() {
const args = parseArgs();
if (args.help) {
displayHelp();
return;
}
const registry = loadRegistry();
if (args.stats) {
displayStats(registry);
return;
}
displayStats(registry);
console.log('');
const filteredEntries = filterEntries(registry.entries, args);
displayEntries(filteredEntries, args);
console.log('💡 TIP: Use --help for more options');
}
// Run if called directly
if (import.meta.url === `file://${process.argv[1]}`) {
main();
}
export { loadRegistry, filterEntries };