Files
hive/scripts/migrate_from_existing.py
anthonyrawlins d7ad321176 Initial commit: Complete Hive distributed AI orchestration platform
This comprehensive implementation includes:
- FastAPI backend with MCP server integration
- React/TypeScript frontend with Vite
- PostgreSQL database with Redis caching
- Grafana/Prometheus monitoring stack
- Docker Compose orchestration
- Full MCP protocol support for Claude Code integration

Features:
- Agent discovery and management across network
- Visual workflow editor and execution engine
- Real-time task coordination and monitoring
- Multi-model support with specialized agents
- Distributed development task allocation

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-07 21:44:31 +10:00

703 lines
26 KiB
Python

#!/usr/bin/env python3
"""
Migration script to consolidate existing distributed AI projects into Hive
"""
import os
import sys
import json
import yaml
import shutil
import asyncio
import sqlite3
from pathlib import Path
from typing import Dict, List, Any, Optional
from datetime import datetime
# Add paths for importing from existing projects
sys.path.append('/home/tony/AI/projects/distributed-ai-dev')
sys.path.append('/home/tony/AI/projects/McPlan/mcplan-web/backend')
class HiveMigrator:
"""
Migrates and consolidates data from existing distributed AI projects
"""
def __init__(self):
self.hive_root = Path("/home/tony/AI/projects/hive")
self.projects = {
'distributed-ai-dev': Path("/home/tony/AI/projects/distributed-ai-dev"),
'mcplan': Path("/home/tony/AI/projects/McPlan"),
'cluster': Path("/home/tony/AI/projects/cluster"),
'n8n-integration': Path("/home/tony/AI/projects/n8n-integration")
}
# Migration results
self.migration_log = []
self.errors = []
def log(self, message: str, level: str = "INFO"):
"""Log migration step"""
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_entry = f"[{timestamp}] {level}: {message}"
print(log_entry)
self.migration_log.append(log_entry)
def error(self, message: str):
"""Log error"""
self.log(message, "ERROR")
self.errors.append(message)
async def migrate_all(self):
"""Execute complete migration process"""
self.log("🚀 Starting Hive migration from existing projects")
try:
# Phase 1: Setup and validation
await self.setup_hive_structure()
await self.validate_source_projects()
# Phase 2: Configuration migration
await self.migrate_agent_configurations()
await self.migrate_monitoring_configs()
# Phase 3: Code integration
await self.extract_core_components()
await self.migrate_database_schemas()
# Phase 4: Data migration
await self.migrate_workflows()
await self.migrate_execution_history()
# Phase 5: Documentation and cleanup
await self.generate_migration_report()
self.log("✅ Migration completed successfully!")
except Exception as e:
self.error(f"Migration failed: {str(e)}")
raise
async def setup_hive_structure(self):
"""Create Hive project directory structure"""
self.log("📁 Setting up Hive project structure")
directories = [
"backend/app/core",
"backend/app/api",
"backend/app/models",
"backend/app/services",
"backend/app/utils",
"backend/migrations",
"backend/tests",
"frontend/src/components/dashboard",
"frontend/src/components/workflows",
"frontend/src/components/agents",
"frontend/src/components/projects",
"frontend/src/stores",
"frontend/src/services",
"frontend/src/types",
"frontend/src/hooks",
"frontend/src/utils",
"config/agents",
"config/workflows",
"config/monitoring",
"scripts",
"docker",
"docs/api",
"docs/user-guide",
"docs/admin-guide",
"docs/developer-guide",
"tests/e2e",
"tests/integration",
"tests/performance"
]
for directory in directories:
(self.hive_root / directory).mkdir(parents=True, exist_ok=True)
self.log(f"Created {len(directories)} directories")
async def validate_source_projects(self):
"""Validate that source projects exist and are accessible"""
self.log("🔍 Validating source projects")
for name, path in self.projects.items():
if path.exists():
self.log(f"✅ Found {name} at {path}")
else:
self.error(f"❌ Missing {name} at {path}")
async def migrate_agent_configurations(self):
"""Migrate agent configurations from distributed-ai-dev"""
self.log("🤖 Migrating agent configurations")
source_config = self.projects['distributed-ai-dev'] / 'config' / 'agents.yaml'
if not source_config.exists():
self.log("⚠️ No agent configuration found in distributed-ai-dev")
return
# Load existing configuration
with open(source_config, 'r') as f:
agents_config = yaml.safe_load(f)
# Create enhanced Hive configuration
hive_config = {
'hive': {
'cluster': {
'name': 'Development Cluster',
'region': 'home.deepblack.cloud'
},
'agents': {},
'monitoring': {
'metrics_retention_days': 30,
'alert_thresholds': {
'cpu_usage': 85,
'memory_usage': 90,
'gpu_usage': 95,
'response_time': 60
},
'health_check_interval': 30
},
'workflows': {
'templates': {
'web_development': {
'agents': ['walnut', 'ironwood'],
'stages': ['planning', 'frontend', 'backend', 'integration', 'testing']
},
'infrastructure': {
'agents': ['acacia', 'ironwood'],
'stages': ['design', 'provisioning', 'deployment', 'monitoring']
}
}
},
'mcp_servers': {
'registry': {
'comfyui': 'ws://localhost:8188/api/mcp',
'code_review': 'http://localhost:8000/mcp'
}
},
'security': {
'require_approval': True,
'api_rate_limit': 100,
'session_timeout': 3600
}
}
}
# Migrate agent configurations with enhancements
if 'agents' in agents_config:
for agent_id, agent_config in agents_config['agents'].items():
enhanced_config = {
'name': agent_config.get('name', f'{agent_id.upper()} Agent'),
'endpoint': agent_config.get('endpoint', f'http://localhost:11434'),
'model': agent_config.get('model', 'llama2'),
'specialization': agent_config.get('specialization', 'general'),
'capabilities': agent_config.get('capabilities', []),
'hardware': agent_config.get('hardware', {}),
'performance_targets': agent_config.get('performance_targets', {
'min_tps': 10,
'max_response_time': 30
})
}
hive_config['hive']['agents'][agent_id] = enhanced_config
# Add default agents if none exist
if not hive_config['hive']['agents']:
hive_config['hive']['agents'] = {
'acacia': {
'name': 'ACACIA Infrastructure Specialist',
'endpoint': 'http://192.168.1.72:11434',
'model': 'deepseek-r1:7b',
'specialization': 'infrastructure',
'capabilities': ['devops', 'architecture', 'deployment'],
'hardware': {
'gpu_type': 'AMD Radeon RX 7900 XTX',
'vram_gb': 24,
'cpu_cores': 16
},
'performance_targets': {
'min_tps': 15,
'max_response_time': 30
}
},
'walnut': {
'name': 'WALNUT Full-Stack Developer',
'endpoint': 'http://192.168.1.27:11434',
'model': 'starcoder2:15b',
'specialization': 'full-stack',
'capabilities': ['frontend', 'backend', 'ui-design'],
'hardware': {
'gpu_type': 'NVIDIA RTX 4090',
'vram_gb': 24,
'cpu_cores': 12
},
'performance_targets': {
'min_tps': 20,
'max_response_time': 25
}
},
'ironwood': {
'name': 'IRONWOOD Backend Specialist',
'endpoint': 'http://192.168.1.113:11434',
'model': 'deepseek-coder-v2',
'specialization': 'backend',
'capabilities': ['optimization', 'databases', 'apis'],
'hardware': {
'gpu_type': 'NVIDIA RTX 4080',
'vram_gb': 16,
'cpu_cores': 8
},
'performance_targets': {
'min_tps': 18,
'max_response_time': 35
}
}
}
# Save unified configuration
config_path = self.hive_root / 'config' / 'hive.yaml'
with open(config_path, 'w') as f:
yaml.dump(hive_config, f, default_flow_style=False, sort_keys=False)
self.log(f"✅ Migrated {len(hive_config['hive']['agents'])} agent configurations")
async def migrate_monitoring_configs(self):
"""Migrate monitoring configurations from cluster project"""
self.log("📊 Migrating monitoring configurations")
# Create Prometheus configuration
prometheus_config = {
'global': {
'scrape_interval': '30s',
'evaluation_interval': '30s'
},
'rule_files': ['hive_alerts.yml'],
'scrape_configs': [
{
'job_name': 'hive-backend',
'static_configs': [{'targets': ['hive-coordinator:8000']}],
'metrics_path': '/api/metrics'
},
{
'job_name': 'hive-agents',
'static_configs': [
{'targets': ['192.168.1.72:11434']},
{'targets': ['192.168.1.27:11434']},
{'targets': ['192.168.1.113:11434']}
]
}
]
}
prometheus_path = self.hive_root / 'config' / 'monitoring' / 'prometheus.yml'
with open(prometheus_path, 'w') as f:
yaml.dump(prometheus_config, f)
# Create Grafana dashboard configurations
grafana_config = {
'dashboards': {
'hive_overview': {
'title': 'Hive Cluster Overview',
'panels': [
'Agent Status',
'Task Queue Length',
'Execution Success Rate',
'Response Times',
'Resource Utilization'
]
},
'agent_performance': {
'title': 'Agent Performance Details',
'panels': [
'Tokens per Second',
'GPU Utilization',
'Memory Usage',
'Active Tasks'
]
}
}
}
grafana_path = self.hive_root / 'config' / 'monitoring' / 'grafana.yml'
with open(grafana_path, 'w') as f:
yaml.dump(grafana_config, f)
self.log("✅ Created monitoring configurations")
async def extract_core_components(self):
"""Extract and adapt core components from existing projects"""
self.log("🔧 Extracting core components")
# Map of source files to destination files
component_mapping = {
# From distributed-ai-dev
'distributed-ai-dev/src/core/ai_dev_coordinator.py': 'backend/app/core/hive_coordinator.py',
'distributed-ai-dev/src/monitoring/performance_monitor.py': 'backend/app/core/performance_monitor.py',
'distributed-ai-dev/src/config/agent_manager.py': 'backend/app/core/agent_manager.py',
# From McPlan
'McPlan/mcplan-web/backend/app/core/mcplan_engine.py': 'backend/app/core/workflow_engine.py',
'McPlan/mcplan-web/backend/app/api/workflows.py': 'backend/app/api/workflows.py',
'McPlan/mcplan-web/backend/app/api/execution.py': 'backend/app/api/executions.py',
'McPlan/mcplan-web/backend/app/models/workflow.py': 'backend/app/models/workflow.py',
# Frontend components
'McPlan/mcplan-web/frontend/src/components/WorkflowEditor/': 'frontend/src/components/workflows/',
'McPlan/mcplan-web/frontend/src/components/ExecutionPanel/': 'frontend/src/components/executions/',
'McPlan/mcplan-web/frontend/src/stores/': 'frontend/src/stores/'
}
for source_rel, dest_rel in component_mapping.items():
source_path = None
for project_name, project_path in self.projects.items():
potential_source = project_path / source_rel.split('/', 1)[1]
if potential_source.exists():
source_path = potential_source
break
if source_path:
dest_path = self.hive_root / dest_rel
if source_path.is_file():
dest_path.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(source_path, dest_path)
self.log(f"📄 Copied {source_path.name}")
elif source_path.is_dir():
dest_path.mkdir(parents=True, exist_ok=True)
shutil.copytree(source_path, dest_path, dirs_exist_ok=True)
self.log(f"📁 Copied directory {source_path.name}")
else:
self.log(f"⚠️ Could not find source: {source_rel}")
self.log("✅ Core components extracted")
async def migrate_database_schemas(self):
"""Create unified database schema"""
self.log("🗄️ Creating unified database schema")
schema_sql = """
-- Hive Unified Database Schema
-- User Management
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email VARCHAR(255) UNIQUE NOT NULL,
hashed_password VARCHAR(255) NOT NULL,
is_active BOOLEAN DEFAULT true,
role VARCHAR(50) DEFAULT 'developer',
created_at TIMESTAMP DEFAULT NOW(),
last_login TIMESTAMP
);
-- Agent Management
CREATE TABLE agents (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(255) NOT NULL,
endpoint VARCHAR(512) NOT NULL,
model VARCHAR(255),
specialization VARCHAR(100),
capabilities JSONB,
hardware_config JSONB,
status VARCHAR(50) DEFAULT 'offline',
performance_targets JSONB,
created_at TIMESTAMP DEFAULT NOW(),
last_seen TIMESTAMP
);
-- Workflow Management
CREATE TABLE workflows (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(255) NOT NULL,
description TEXT,
n8n_data JSONB NOT NULL,
mcp_tools JSONB,
created_by UUID REFERENCES users(id),
version INTEGER DEFAULT 1,
active BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- Execution Tracking
CREATE TABLE executions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
workflow_id UUID REFERENCES workflows(id),
status VARCHAR(50) DEFAULT 'pending',
input_data JSONB,
output_data JSONB,
error_message TEXT,
progress INTEGER DEFAULT 0,
started_at TIMESTAMP,
completed_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);
-- Task Management
CREATE TABLE tasks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
title VARCHAR(255) NOT NULL,
description TEXT,
priority INTEGER DEFAULT 5,
status VARCHAR(50) DEFAULT 'pending',
assigned_agent_id UUID REFERENCES agents(id),
workflow_id UUID REFERENCES workflows(id),
execution_id UUID REFERENCES executions(id),
metadata JSONB,
created_at TIMESTAMP DEFAULT NOW(),
started_at TIMESTAMP,
completed_at TIMESTAMP
);
-- Performance Metrics (Time Series)
CREATE TABLE agent_metrics (
agent_id UUID REFERENCES agents(id),
timestamp TIMESTAMP NOT NULL,
cpu_usage FLOAT,
memory_usage FLOAT,
gpu_usage FLOAT,
tokens_per_second FLOAT,
response_time FLOAT,
active_tasks INTEGER,
status VARCHAR(50),
PRIMARY KEY (agent_id, timestamp)
);
-- System Alerts
CREATE TABLE alerts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
type VARCHAR(100) NOT NULL,
severity VARCHAR(20) NOT NULL,
message TEXT NOT NULL,
agent_id UUID REFERENCES agents(id),
resolved BOOLEAN DEFAULT false,
created_at TIMESTAMP DEFAULT NOW(),
resolved_at TIMESTAMP
);
-- API Keys
CREATE TABLE api_keys (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
name VARCHAR(255) NOT NULL,
key_hash VARCHAR(255) NOT NULL,
is_active BOOLEAN DEFAULT true,
expires_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);
-- Indexes for performance
CREATE INDEX idx_agents_status ON agents(status);
CREATE INDEX idx_workflows_active ON workflows(active, created_at);
CREATE INDEX idx_executions_status ON executions(status, created_at);
CREATE INDEX idx_tasks_status_priority ON tasks(status, priority DESC, created_at);
CREATE INDEX idx_agent_metrics_timestamp ON agent_metrics(timestamp);
CREATE INDEX idx_agent_metrics_agent_time ON agent_metrics(agent_id, timestamp);
CREATE INDEX idx_alerts_unresolved ON alerts(resolved, created_at) WHERE resolved = false;
-- Sample data
INSERT INTO users (email, hashed_password, role) VALUES
('admin@hive.local', '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/lewohT6ZErjH.2T.2', 'admin'),
('developer@hive.local', '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/lewohT6ZErjH.2T.2', 'developer');
"""
schema_path = self.hive_root / 'backend' / 'migrations' / '001_initial_schema.sql'
with open(schema_path, 'w') as f:
f.write(schema_sql)
self.log("✅ Database schema created")
async def migrate_workflows(self):
"""Migrate existing workflows from McPlan"""
self.log("🔄 Migrating workflows")
workflows_migrated = 0
# Look for workflow files in McPlan
mcplan_workflows = self.projects['mcplan'] / 'mcplan-web'
workflow_files = []
# Find JSON workflow files
for json_file in mcplan_workflows.rglob('*.json'):
if 'workflow' in json_file.name.lower() or 'n8n' in json_file.name.lower():
workflow_files.append(json_file)
# Migrate each workflow file
for workflow_file in workflow_files:
try:
with open(workflow_file, 'r') as f:
workflow_data = json.load(f)
# Create workflow migration record
migration_record = {
'source_file': str(workflow_file),
'name': workflow_data.get('name', workflow_file.stem),
'description': f'Migrated from {workflow_file.name}',
'n8n_data': workflow_data,
'migrated_at': datetime.now().isoformat()
}
# Save to Hive workflows directory
dest_file = self.hive_root / 'config' / 'workflows' / f'{workflow_file.stem}.json'
with open(dest_file, 'w') as f:
json.dump(migration_record, f, indent=2)
workflows_migrated += 1
self.log(f"📄 Migrated workflow: {workflow_file.name}")
except Exception as e:
self.error(f"Failed to migrate {workflow_file.name}: {str(e)}")
self.log(f"✅ Migrated {workflows_migrated} workflows")
async def migrate_execution_history(self):
"""Migrate execution history from McPlan database"""
self.log("📊 Migrating execution history")
# Look for McPlan database
mcplan_db = self.projects['mcplan'] / 'mcplan-web' / 'mcplan.db'
if not mcplan_db.exists():
self.log("⚠️ No McPlan database found, skipping execution history")
return
executions_migrated = 0
try:
# Connect to McPlan SQLite database
conn = sqlite3.connect(mcplan_db)
cursor = conn.cursor()
# Export execution data
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = cursor.fetchall()
migration_data = {}
for (table_name,) in tables:
cursor.execute(f"SELECT * FROM {table_name}")
rows = cursor.fetchall()
# Get column names
cursor.execute(f"PRAGMA table_info({table_name})")
columns = [row[1] for row in cursor.fetchall()]
# Convert to dictionaries
table_data = []
for row in rows:
table_data.append(dict(zip(columns, row)))
migration_data[table_name] = table_data
conn.close()
# Save migration data
migration_file = self.hive_root / 'scripts' / 'mcplan_data_export.json'
with open(migration_file, 'w') as f:
json.dump(migration_data, f, indent=2, default=str)
executions_migrated = len(migration_data.get('executions', []))
self.log(f"✅ Exported {executions_migrated} execution records")
except Exception as e:
self.error(f"Failed to migrate execution history: {str(e)}")
async def generate_migration_report(self):
"""Generate comprehensive migration report"""
self.log("📋 Generating migration report")
report = {
'migration_summary': {
'timestamp': datetime.now().isoformat(),
'source_projects': list(self.projects.keys()),
'hive_version': '1.0.0',
'migration_status': 'completed' if not self.errors else 'completed_with_errors'
},
'components_migrated': {
'agent_configurations': 'config/hive.yaml',
'monitoring_configs': 'config/monitoring/',
'database_schema': 'backend/migrations/001_initial_schema.sql',
'core_components': 'backend/app/core/',
'api_endpoints': 'backend/app/api/',
'frontend_components': 'frontend/src/components/',
'workflows': 'config/workflows/'
},
'next_steps': [
'Review and update imported configurations',
'Set up development environment with docker-compose up',
'Run database migrations',
'Test agent connectivity',
'Verify workflow execution',
'Configure monitoring and alerting',
'Update documentation'
],
'migration_log': self.migration_log,
'errors': self.errors
}
report_path = self.hive_root / 'MIGRATION_REPORT.json'
with open(report_path, 'w') as f:
json.dump(report, f, indent=2)
# Also create a markdown summary
md_report = f"""# Hive Migration Report
## Summary
- **Migration Date**: {report['migration_summary']['timestamp']}
- **Status**: {report['migration_summary']['migration_status']}
- **Source Projects**: {', '.join(report['migration_summary']['source_projects'])}
- **Errors**: {len(self.errors)}
## Components Migrated
"""
for component, location in report['components_migrated'].items():
md_report += f"- **{component.replace('_', ' ').title()}**: `{location}`\n"
md_report += f"""
## Next Steps
"""
for i, step in enumerate(report['next_steps'], 1):
md_report += f"{i}. {step}\n"
if self.errors:
md_report += f"""
## Errors Encountered
"""
for error in self.errors:
md_report += f"- {error}\n"
md_report_path = self.hive_root / 'MIGRATION_REPORT.md'
with open(md_report_path, 'w') as f:
f.write(md_report)
self.log("✅ Migration report generated")
self.log(f"📄 Report saved to: {report_path}")
self.log(f"📄 Summary saved to: {md_report_path}")
async def main():
"""Main migration function"""
migrator = HiveMigrator()
try:
await migrator.migrate_all()
print("\n" + "="*60)
print("🎉 HIVE MIGRATION COMPLETED!")
print("="*60)
print(f"✅ Migration successful with {len(migrator.errors)} errors")
print(f"📁 Hive project created at: {migrator.hive_root}")
print(f"📋 Check MIGRATION_REPORT.md for detailed results")
print("\nNext steps:")
print("1. cd /home/tony/AI/projects/hive")
print("2. Review config/hive.yaml")
print("3. docker-compose up -d")
print("4. Visit http://localhost:3000")
print("="*60)
except Exception as e:
print(f"\n❌ Migration failed: {str(e)}")
print(f"📋 Check logs for details")
sys.exit(1)
if __name__ == "__main__":
asyncio.run(main())