generate-site-data.jsā¢4.63 kB
#!/usr/bin/env node
/**
* Generate agent data for the microsite
* This script reads all agents from the agents directory and generates a JSON file
*/
const fs = require('fs-extra');
const path = require('path');
const glob = require('glob');
const AGENTS_DIR = path.join(__dirname, 'agents');
const OUTPUT_FILE = path.join(__dirname, 'site/data/agents.json');
async function generateAgentData() {
console.log('š Scanning agents directory...');
// Find all metadata.json files
const metadataFiles = glob.sync('**/metadata.json', {
cwd: AGENTS_DIR,
absolute: true,
ignore: ['**/node_modules/**', '**/dist/**']
});
console.log(`š Found ${metadataFiles.length} agent definitions`);
const agents = [];
const categories = new Set();
for (const metadataPath of metadataFiles) {
try {
const metadata = await fs.readJSON(metadataPath);
const agentDir = path.dirname(metadataPath);
const agentMdPath = path.join(agentDir, 'agent.md');
// Extract category from path
const relativePath = path.relative(AGENTS_DIR, agentDir);
const category = relativePath.split(path.sep)[0];
categories.add(category);
// Read agent prompt (optional, for display)
let prompt = '';
if (await fs.pathExists(agentMdPath)) {
prompt = await fs.readFile(agentMdPath, 'utf-8');
// Extract just first few paragraphs for preview
const lines = prompt.split('\n');
const contentStart = lines.findIndex(line => line.trim() && !line.startsWith('---'));
const previewLines = lines.slice(contentStart, contentStart + 10);
prompt = previewLines.join('\n').substring(0, 500) + '...';
}
// Normalize capabilities
let capabilities;
if (Array.isArray(metadata.capabilities)) {
capabilities = {
primary: metadata.capabilities,
secondary: []
};
} else if (metadata.capabilities && typeof metadata.capabilities === 'object') {
capabilities = {
primary: metadata.capabilities.primary || [],
secondary: metadata.capabilities.secondary || [],
frameworks: metadata.capabilities.frameworks || []
};
} else {
capabilities = {
primary: [],
secondary: []
};
}
// Create agent data object
const agent = {
name: metadata.name,
version: metadata.version || '1.0.0',
description: metadata.description || 'No description available',
category,
subcategory: metadata.subcategory,
capabilities,
tags: metadata.tags || [],
quality: metadata.quality || {},
coordination: metadata.coordination || {},
preview: prompt
};
agents.push(agent);
} catch (error) {
console.error(`ā ļø Failed to load agent from ${metadataPath}:`, error.message);
}
}
// Sort agents by name
agents.sort((a, b) => a.name.localeCompare(b.name));
// Create output data structure
const outputData = {
agents,
categories: Array.from(categories).sort(),
metadata: {
totalAgents: agents.length,
totalCategories: categories.size,
generatedAt: new Date().toISOString()
}
};
// Ensure output directory exists
await fs.ensureDir(path.dirname(OUTPUT_FILE));
// Write to file
await fs.writeJSON(OUTPUT_FILE, outputData, { spaces: 2 });
console.log(`ā
Generated agent data: ${agents.length} agents across ${categories.size} categories`);
console.log(`š Output: ${OUTPUT_FILE}`);
// Print category summary
const categoryCounts = {};
agents.forEach(agent => {
categoryCounts[agent.category] = (categoryCounts[agent.category] || 0) + 1;
});
console.log('\nš Category breakdown:');
Object.entries(categoryCounts)
.sort((a, b) => b[1] - a[1])
.forEach(([category, count]) => {
console.log(` ${category}: ${count} agents`);
});
}
// Run the generator
generateAgentData().catch(error => {
console.error('ā Failed to generate agent data:', error);
process.exit(1);
});