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>
This commit is contained in:
703
scripts/migrate_from_existing.py
Normal file
703
scripts/migrate_from_existing.py
Normal file
@@ -0,0 +1,703 @@
|
||||
#!/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())
|
||||
Reference in New Issue
Block a user