UNPKG

devflow-ai

Version:

Enterprise-grade AI agent orchestration with swarm management UI dashboard

356 lines (303 loc) 9.67 kB
/** * ruv-swarm integration helper for Claude Code configuration * * This module bridges the main claude-flow configuration with * ruv-swarm specific settings and provides utility functions * for seamless integration. */ import { configManager, ConfigManager } from './config-manager.js'; import { getRuvSwarmConfigManager, RuvSwarmConfigManager } from './ruv-swarm-config.js'; // import { createLogger } from '../core/logger.js'; // Create logger for integration // const logger = createLogger('ruv-swarm-integration'); /** * Integration manager that synchronizes configurations */ export class RuvSwarmIntegration { private configManager: ConfigManager; private ruvSwarmManager: RuvSwarmConfigManager; constructor(configManager: ConfigManager, ruvSwarmManager: RuvSwarmConfigManager) { this.configManager = configManager; this.ruvSwarmManager = ruvSwarmManager; } /** * Synchronize main config with ruv-swarm config */ syncConfiguration(): void { const mainConfig = this.configManager.getRuvSwarmConfig(); const ruvSwarmConfig = this.ruvSwarmManager.getConfig(); // Update ruv-swarm config from main config if (mainConfig.enabled) { this.ruvSwarmManager.updateSwarmConfig({ defaultTopology: mainConfig.defaultTopology, maxAgents: mainConfig.maxAgents, defaultStrategy: mainConfig.defaultStrategy, enableHooks: mainConfig.enableHooks, }); this.ruvSwarmManager.updateIntegrationConfig({ enableMCPTools: true, enableCLICommands: true, enableHooks: mainConfig.enableHooks, }); this.ruvSwarmManager.updateMemoryConfig({ enablePersistence: mainConfig.enablePersistence, }); this.ruvSwarmManager.updateNeuralConfig({ enableTraining: mainConfig.enableNeuralTraining, }); } // logger.debug('Configuration synchronized between main and ruv-swarm configs'); } /** * Get unified command arguments for ruv-swarm CLI */ getUnifiedCommandArgs(): string[] { const mainArgs = this.configManager.getRuvSwarmArgs(); const ruvSwarmArgs = this.ruvSwarmManager.getCommandArgs(); // Main config takes precedence, then ruv-swarm specific const unified = [...mainArgs]; // Add ruv-swarm specific args that aren't in main config for (let i = 0; i < ruvSwarmArgs.length; i += 2) { const flag = ruvSwarmArgs[i]; const value = ruvSwarmArgs[i + 1]; // Skip if already set by main config if (!unified.includes(flag)) { unified.push(flag, value); } } return unified; } /** * Initialize ruv-swarm integration */ async initialize(): Promise<{ success: boolean; message: string }> { try { // Check if ruv-swarm is enabled in main config if (!this.configManager.isRuvSwarmEnabled()) { return { success: false, message: 'ruv-swarm is disabled in main configuration', }; } // Sync configurations this.syncConfiguration(); // Validate configurations const mainValidation = this.validateMainConfig(); if (!mainValidation.valid) { return { success: false, message: `Main config validation failed: ${mainValidation.errors.join(', ')}`, }; } const ruvSwarmValidation = this.ruvSwarmManager.validateConfig(); if (!ruvSwarmValidation.valid) { return { success: false, message: `ruv-swarm config validation failed: ${ruvSwarmValidation.errors.join(', ')}`, }; } // logger.info('ruv-swarm integration initialized successfully'); return { success: true, message: 'ruv-swarm integration initialized and configured', }; } catch (error) { const message = `Failed to initialize ruv-swarm integration: ${(error as Error).message}`; // logger.error(message, { error }); return { success: false, message, }; } } /** * Validate main configuration for ruv-swarm compatibility */ private validateMainConfig(): { valid: boolean; errors: string[] } { const errors: string[] = []; const ruvSwarmConfig = this.configManager.getRuvSwarmConfig(); // Check required fields if (!ruvSwarmConfig.defaultTopology) { errors.push('ruvSwarm.defaultTopology is required'); } if (ruvSwarmConfig.maxAgents <= 0) { errors.push('ruvSwarm.maxAgents must be greater than 0'); } if (!ruvSwarmConfig.defaultStrategy) { errors.push('ruvSwarm.defaultStrategy is required'); } return { valid: errors.length === 0, errors, }; } /** * Get current integration status */ getStatus(): { enabled: boolean; mainConfig: any; ruvSwarmConfig: any; synchronized: boolean; } { const mainConfig = this.configManager.getRuvSwarmConfig(); const ruvSwarmConfig = this.ruvSwarmManager.getConfig(); return { enabled: mainConfig.enabled, mainConfig, ruvSwarmConfig, synchronized: this.isConfigurationSynchronized(), }; } /** * Check if configurations are synchronized */ private isConfigurationSynchronized(): boolean { const mainConfig = this.configManager.getRuvSwarmConfig(); const ruvSwarmConfig = this.ruvSwarmManager.getConfig(); return ( ruvSwarmConfig.swarm.defaultTopology === mainConfig.defaultTopology && ruvSwarmConfig.swarm.maxAgents === mainConfig.maxAgents && ruvSwarmConfig.swarm.defaultStrategy === mainConfig.defaultStrategy && ruvSwarmConfig.swarm.enableHooks === mainConfig.enableHooks && ruvSwarmConfig.memory.enablePersistence === mainConfig.enablePersistence && ruvSwarmConfig.neural.enableTraining === mainConfig.enableNeuralTraining ); } /** * Update configuration and sync */ updateConfiguration(updates: { main?: Partial<Parameters<ConfigManager['setRuvSwarmConfig']>[0]>; ruvSwarm?: Partial<Parameters<RuvSwarmConfigManager['updateConfig']>[0]>; }): void { if (updates.main) { this.configManager.setRuvSwarmConfig(updates.main); } if (updates.ruvSwarm) { this.ruvSwarmManager.updateConfig(updates.ruvSwarm); } // Re-sync after updates this.syncConfiguration(); } } /** * Create singleton integration instance */ let integrationInstance: RuvSwarmIntegration | null = null; export function getRuvSwarmIntegration(): RuvSwarmIntegration { if (!integrationInstance) { const ruvSwarmManager = getRuvSwarmConfigManager(logger); integrationInstance = new RuvSwarmIntegration(configManager, ruvSwarmManager); } return integrationInstance; } /** * Initialize ruv-swarm integration with claude-flow */ export async function initializeRuvSwarmIntegration(): Promise<{ success: boolean; message: string; }> { const integration = getRuvSwarmIntegration(); return integration.initialize(); } /** * Helper functions for CLI commands */ export class RuvSwarmConfigHelpers { /** * Quick setup for development environment */ static setupDevelopmentConfig(): void { const integration = getRuvSwarmIntegration(); integration.updateConfiguration({ main: { enabled: true, defaultTopology: 'hierarchical', maxAgents: 8, defaultStrategy: 'specialized', autoInit: true, enableHooks: true, enablePersistence: true, enableNeuralTraining: true, }, }); // logger.info('Development configuration applied'); } /** * Quick setup for research environment */ static setupResearchConfig(): void { const integration = getRuvSwarmIntegration(); integration.updateConfiguration({ main: { enabled: true, defaultTopology: 'mesh', maxAgents: 12, defaultStrategy: 'adaptive', autoInit: true, enableHooks: true, enablePersistence: true, enableNeuralTraining: true, }, }); // logger.info('Research configuration applied'); } /** * Quick setup for production environment */ static setupProductionConfig(): void { const integration = getRuvSwarmIntegration(); integration.updateConfiguration({ main: { enabled: true, defaultTopology: 'star', maxAgents: 6, defaultStrategy: 'balanced', autoInit: false, enableHooks: true, enablePersistence: true, enableNeuralTraining: false, }, }); // logger.info('Production configuration applied'); } /** * Get configuration for specific use case */ static getConfigForUseCase(useCase: 'development' | 'research' | 'production'): any { const integration = getRuvSwarmIntegration(); switch (useCase) { case 'development': return { topology: 'hierarchical', maxAgents: 8, strategy: 'specialized', features: ['hooks', 'persistence', 'neural-training'], }; case 'research': return { topology: 'mesh', maxAgents: 12, strategy: 'adaptive', features: ['hooks', 'persistence', 'neural-training', 'advanced-metrics'], }; case 'production': return { topology: 'star', maxAgents: 6, strategy: 'balanced', features: ['hooks', 'persistence'], }; default: return integration.getStatus().mainConfig; } } } export default { RuvSwarmIntegration, getRuvSwarmIntegration, initializeRuvSwarmIntegration, RuvSwarmConfigHelpers, };