UNPKG

claude-flow-novice

Version:

Claude Flow Novice - Advanced orchestration platform for multi-agent AI workflows with CFN Loop architecture Includes Local RuVector Accelerator and all CFN skills for complete functionality.

776 lines (624 loc) 17.1 kB
# System Integration - Architecture Reference Integration patterns, interfaces, and connectivity for CFN agent systems. ## Table of Contents 1. [MCP Integration](#mcp-integration) 2. [Docker Architecture](#docker-architecture) 3. [Redis Infrastructure](#redis-infrastructure) 4. [Database Integration](#database-integration) 5. [CLI Coordination](#cli-coordination) 6. [Provider Routing](#provider-routing) 7. [Multi-Worktree Support](#multi-worktree-support) 8. [Web Portal Integration](#web-portal-integration) --- ## MCP Integration ### Architecture Overview ``` CFN Network (172.30.0.0/16) MCP Network (172.31.0.0/16) ┌─────────────────────────┐ ┌─────────────────────────┐ │ CFN Orchestrator │ │ MCP Playwright (8081) │ │ (Port 3000) │◄──────────────────►│ MCP Redis Tools (8082) │ ├─────────────────────────┤ │ MCP N8N (8083) │ │ Redis Coordinator │ │ MCP Security (8084) │ │ (Port 6379) │ └─────────────────────────┘ └─────────────────────────┘ ``` ### MCP Server Specifications | Server | Port | Memory Limit | CPU Limit | Purpose | |--------|------|--------------|-----------|---------| | Playwright | 8081 | 512MB / 256MB | 0.5 / 0.25 | Browser automation | | Redis Tools | 8082 | 256MB / 128MB | 0.25 / 0.1 | Redis management | | N8N | 8083 | 1GB / 512MB | 1.0 / 0.5 | Workflow automation | | Security Scanner | 8084 | 512MB / 256MB | 0.5 / 0.25 | Security analysis | ### Authentication Flow ```bash # Generate agent-specific token MCP_TOKEN="agent-${AGENT_ID}-${TASK_ID}-${TIMESTAMP}" # Access MCP server curl -H "Authorization: Bearer $MCP_TOKEN" \ -H "Content-Type: application/json" \ -d '{"tool":"browser","action":"navigate","url":"https://example.com"}' \ http://mcp-playwright:8081/execute ``` ### Skill-Based Routing ```json { "skill_to_mcp_mapping": { "browser-automation": ["playwright"], "redis-management": ["redis-tools"], "workflow-automation": ["n8n"], "security-scanning": ["security-scanner"] } } ``` ### Docker Compose Integration ```yaml services: mcp-playwright: build: ./mcp/playwright networks: - mcp-network environment: - MCP_SERVER_ID=playwright - AUTH_TOKEN=${MCP_AUTH_TOKEN} deploy: resources: limits: memory: 512M cpus: '0.5' reservations: memory: 256M cpus: '0.25' healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8081/health"] interval: 30s timeout: 10s retries: 3 networks: mcp-network: driver: bridge internal: true ipam: config: - subnet: 172.31.0.0/16 ``` --- ## Docker Architecture ### Multi-Worktree Isolation **Port Allocation Formula:** ```bash REDIS_BASE=6379 POSTGRES_BASE=5432 ORCHESTRATOR_BASE=3001 # Calculate ports based on branch hash BRANCH_HASH=$(echo "$BRANCH" | sha256sum | cut -c1-4) REDIS_PORT=$((REDIS_BASE + BRANCH_HASH)) POSTGRES_PORT=$((POSTGRES_BASE + BRANCH_HASH)) ORCHESTRATOR_PORT=$((ORCHESTRATOR_BASE + BRANCH_HASH)) ``` **Service Names (Internal):** - Redis: `redis` (not container name) - Postgres: `postgres` - Orchestrator: `orchestrator` - MCP servers: `mcp-playwright`, `mcp-redis-tools`, etc. **Project Naming:** ```bash COMPOSE_PROJECT_NAME="cfn-${BRANCH//[^a-zA-Z0-9]/-}" ``` ### Build Requirements **Linux Native Build:** ```bash # REQUIRED: Build from Linux filesystem DOCKERFILE="docker/Dockerfile.agent" IMAGE_NAME="cfn-agent" ./scripts/docker/build-from-linux.sh # Build times: # Windows mount: ~755s # Linux native: <20s ``` ### Container Specifications **Agent Container:** ```dockerfile FROM node:18-alpine WORKDIR /workspace RUN apk add --no-cache bash curl jq sqlite3 COPY ./.claude /root/.claude CMD ["/root/.claude/agents/entrypoint.sh"] ``` **Resource Limits:** ```yaml deploy: resources: limits: memory: 1G cpus: '1.0' reservations: memory: 512M cpus: '0.5' ``` --- ## Redis Infrastructure ### Configuration ```javascript // config/redis.config.js module.exports = { primary: { url: process.env.REDIS_URL || 'redis://localhost:6379', username: process.env.REDIS_USERNAME || '', password: process.env.REDIS_PASSWORD || '', connectTimeout: 10000, lazyConnect: true, maxRetriesPerRequest: 3, retryDelayOnFailover: 100 }, fallback: process.env.REDIS_FALLBACK_1 ? { url: process.env.REDIS_FALLBACK_1, // ... same options } : null }; ``` ### Connection Management ```javascript const Redis = require('ioredis'); class RedisManager { constructor() { this.client = new Redis(config.primary); if (config.fallback) { this.fallback = new Redis(config.fallback); } } async withFallback(operation) { try { return await operation(this.client); } catch (error) { if (this.fallback) { console.warn('Primary Redis failed, using fallback'); return await operation(this.fallback); } throw error; } } } ``` ### Key Naming Conventions ```bash # Coordination keys coord:${TASK_ID}:loop3:complete coord:${TASK_ID}:loop2:start coord:${TASK_ID}:decision # Agent communication swarm:${TASK_ID}:signal:${AGENT_ID} swarm:${TASK_ID}:result:${AGENT_ID} # Context storage context:${TASK_ID}:deliverables context:${TASK_ID}:metadata # Locks lock:${RESOURCE_NAME}:${EXPIRY} ``` ### Coordination Primitives (v3.0.0) **Store Context:** ```bash ./.claude/skills/redis-coordination/store-context.sh \ --task-id "$TASK_ID" \ --key "deliverables" \ --value "$DELIVERABLES_JSON" \ --ttl 3600 ``` **Signal:** ```bash ./.claude/skills/redis-coordination/signal.sh send \ --task-id "$TASK_ID" \ --channel "agent-complete" \ --payload "$PAYLOAD" ``` **Wait for Signal:** ```bash ./.claude/skills/redis-coordination/signal.sh wait \ --task-id "$TASK_ID" \ --channel "start-loop2" \ --timeout 300 ``` **Collect Results:** ```bash ./.claude/skills/redis-coordination/collect-results.sh \ --task-id "$TASK_ID" \ --expected 5 \ --threshold 0.9 ``` --- ## Database Integration ### Dual-Layer Architecture **Layer 1: Redis (Transient)** - Query cache: `cache:query:${hash}` - Session data: `session:${task_id}` - Coordination signals: `coord:${task_id}:*` - Locks: `lock:${resource}:${expiry}` **Layer 2: SQLite/PostgreSQL (Persistent)** ```sql -- Skills Database CREATE TABLE skills ( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(255) UNIQUE NOT NULL, content_hash VARCHAR(64), content_path VARCHAR(512), created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE approval_history ( id INTEGER PRIMARY KEY AUTOINCREMENT, skill_id INTEGER REFERENCES skills(id), agent_id VARCHAR(255), decision VARCHAR(20), confidence REAL, metadata TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); ``` ### Connection Management ```bash # SQLite operations with error handling execute_sql() { local query="$1" local db_path="${2:-$DB_PATH}" if ! sqlite3 "$db_path" "$query" 2>/dev/null; then echo "[ERROR] SQLite query failed: $query" >&2 return 1 fi } # Transaction wrapper transaction() { local db="$1" { echo "BEGIN TRANSACTION;" cat echo "COMMIT;" } | sqlite3 "$db" } ``` ### Migration Pattern ```bash # Migration with rollback migrate() { local version="$1" local migration_file="migrations/${version}.sql" local rollback_file="migrations/rollback/${version}.sql" # Execute migration sqlite3 "$DB" < "$migration_file" # Store rollback SQL sqlite3 "$DB" "INSERT INTO migrations VALUES ('$version', '$(cat "$rollback_file")')" } ``` --- ## CLI Coordination ### Spawn-Agent Script ```bash #!/bin/bash # .claude/skills/cfn-agent-spawning/spawn-agent.sh set -euo pipefail AGENT_ID="${1:?Agent ID required}" TASK_ID="${2:?Task ID required}" MODE="${3:-cli}" PROVIDER="${4:-zai}" # Required environment variables export AGENT_ID export TASK_ID export MODE export PROVIDER export COMPOSE_PROJECT_NAME="${COMPOSE_PROJECT_NAME:-cfn-main}" # Agent container configuration CONTAINER_NAME="cfn-agent-${AGENT_ID}-${TASK_ID}" MEMORY_LIMIT="${AGENT_MEMORY_LIMIT:-1g}" CPU_LIMIT="${AGENT_CPU_LIMIT:-1.0}" # Spawn command docker run -d \ --name "$CONTAINER_NAME" \ --network "${COMPOSE_PROJECT_NAME}_cfn-network" \ --memory "$MEMORY_LIMIT" \ --cpus "$CPU_LIMIT" \ -e AGENT_ID \ -e TASK_ID \ -e MODE \ -e PROVIDER \ -v "${PWD}:/workspace" \ cfn-agent:latest echo "$CONTAINER_NAME" ``` ### Context Passing ```bash # CLI Agent Context Format generate_cli_context() { local task_id="$1" local agent_id="$2" cat <<EOF { "task_id": "$task_id", "agent_id": "$agent_id", "mode": "cli", "workspace": "/workspace", "coordination": { "redis": { "host": "redis", "port": 6379 }, "channels": { "complete": "coord:${task_id}:complete", "error": "coord:${task_id}:error", "signal": "coord:${task_id}:signal:${agent_id}" } }, "resources": { "memory_limit": "${AGENT_MEMORY_LIMIT:-1g}", "timeout": "${AGENT_TIMEOUT:-300}" } } EOF } ``` ### Signal Pattern Implementation ```bash # Agent completion signal signal_completion() { local task_id="$1" local agent_id="$2" local result="${3:-success}" local payload="$4" redis-cli LPUSH "coord:${task_id}:complete" "$agent_id:$result" >/dev/null if [ -n "$payload" ]; then redis-cli LPUSH "coord:${task_id}:payload:${agent_id}" "$payload" >/dev/null fi } # Wait for all agents in loop wait_for_loop_completion() { local task_id="$1" local expected_agents="$2" local timeout="${3:-600}" local completed=0 local start_time=$(date +%s) while [ $completed -lt $expected_agents ]; do local elapsed=$(($(date +%s) - start_time)) if [ $elapsed -gt $timeout ]; then echo "[ERROR] Timeout waiting for agent completion" >&2 return 1 fi completed=$(redis-cli LLEN "coord:${task_id}:complete" || echo "0") sleep 2 done } ``` --- ## Provider Routing ### Configuration ```bash # Enable custom routing export CFN_CUSTOM_ROUTING=true # Provider mapping PROVIDER_ROUTES=( "zai:glm-4.6" "kimi:kimi-latest" "openrouter:anthropic/claude-3-5-sonnet" "max:anthropic/claude-3-opus-20240229" "anthropic:claude-3-5-sonnet-20241022" "gemini:gemini-2.0-flash-exp" "xai:grok-beta" ) ``` ### Agent-Specific Providers ```bash # Agent profiles with provider hints cat > .claude/agents/cfn-dev-team/system-architect.json <<EOF { "id": "system-architect", "name": "System Architect", "provider": "anthropic", "model": "claude-3-5-sonnet-20241022", "temperature": 0.3, "max_tokens": 8192 } EOF ``` ### Dynamic Provider Selection ```javascript // lib/provider-router.js class ProviderRouter { static selectProvider(agentId, task) { const agent = AgentProfile.get(agentId); // Agent-specific provider if (agent.provider) { return agent.provider; } // Task-based routing if (task.complexity === 'high') { return process.env.HIGH_COMPLEXITY_PROVIDER || 'anthropic'; } if (task.cost_sensitive) { return process.env.COST_PROVIDER || 'zai'; } // Default provider return process.env.DEFAULT_PROVIDER || 'kimi'; } } ``` --- ## Multi-Worktree Support ### Worktree Creation ```bash # Create isolated worktree git worktree add ../cfn-feature-auth feature-auth cd ../cfn-feature-auth # Export worktree environment export WORKTREE_BRANCH="feature-auth" export COMPOSE_PROJECT_NAME="cfn-feature-auth" export CFN_REDIS_PORT="6421" export CFN_POSTGRES_PORT="5474" export CFN_ORCHESTRATOR_PORT="3043" ``` ### Port Offset Calculation ```bash calculate_ports() { local branch="$1" local hash=$(echo "$branch" | sha256sum | cut -c1-2) local offset=$((0x$hash % 1000)) echo $((6379 + offset)) # Redis echo $((5432 + offset)) # Postgres echo $((3001 + offset)) # Orchestrator } ``` ### Docker Compose Override ```yaml # docker-compose.worktree.yml version: '3.8' services: redis: ports: - "${CFN_REDIS_PORT:-6379}:6379" postgres: ports: - "${CFN_POSTGRES_PORT:-5432}:5432" orchestrator: ports: - "${CFN_ORCHESTRATOR_PORT:-3001}:3000" ``` ### Volume Isolation ```bash # Isolate volumes by branch docker run -d \ -v "${COMPOSE_PROJECT_NAME}_redis-data:/data" \ -v "${COMPOSE_PROJECT_NAME}_postgres-data:/var/lib/postgresql/data" \ cfn-redis:latest ``` --- ## Web Portal Integration ### WebSocket Connection ```javascript // Real-time updates const socket = io('/cfn-loop', { auth: { taskId: currentTaskId, token: authToken } }); socket.on('agent:update', (data) => { updateAgentStatus(data.agentId, data.status); }); socket.on('loop:progress', (data) => { updateProgressBar(data.loop, data.progress); }); ``` ### REST API Endpoints ```javascript // Agent management POST /api/agents/spawn GET /api/agents/:taskId DELETE /api/agents/:agentId // Task coordination POST /api/tasks/create GET /api/tasks/:taskId/status POST /api/tasks/:taskId/decision # Monitoring GET /api/metrics/agents GET /api/metrics/tasks GET /api/health/system ``` ### Authentication Integration ```bash # JWT token generation generate_agent_token() { local agent_id="$1" local task_id="$2" local expires_at=$(($(date +%s) + 3600)) jwt_encode \ --sub "$agent_id" \ --aud "cfn-agents" \ --exp "$expires_at" \ --claims "task_id:$task_id,role:agent" } ``` --- ## Integration Testing ### End-to-End Test Pattern ```bash #!/bin/bash # tests/integration/cfn-loop-e2e.sh set -euo pipefail # Setup isolated environment export COMPOSE_PROJECT_NAME="test-$(date +%s)" export REDIS_URL="redis://redis:6379" export DB_PATH="/tmp/test-$(date +%s).db" # Start services docker-compose -f docker-compose.test.yml up -d # Run test scenario ./.claude/skills/cfn-loop-orchestration/orchestrate.sh \ --task-id "test-$(date +%s)" \ --mode standard \ --epic "Test the entire CFN Loop" # Verify results check_test_results "$COMPOSE_PROJECT_NAME" # Cleanup docker-compose -f docker-compose.test.yml down -v ``` ### Health Check Implementation ```bash # Comprehensive health check check_system_health() { local errors=0 # Check Redis if ! redis-cli ping >/dev/null 2>&1; then echo "[ERROR] Redis not responding" >&2 ((errors++)) fi # Check database if ! sqlite3 "$DB_PATH" "SELECT 1" >/dev/null 2>&1; then echo "[ERROR] Database not accessible" >&2 ((errors++)) fi # Check required services for service in orchestrator redis postgres; do if ! docker ps | grep -q "$service"; then echo "[ERROR] Service $service not running" >&2 ((errors++)) fi done return $errors } ``` --- ## Troubleshooting Guide ### Common Issues **Redis Connection Refused:** ```bash # Check Redis is running docker ps | grep redis # Check network connectivity docker network ls | grep cfn docker network inspect cfn_cfn-network # Test from agent container docker exec -it $AGENT_CONTAINER redis-cli -h redis ping ``` **Agent Spawn Fails:** ```bash # Check agent image exists docker images | grep cfn-agent # Check volume mounts docker inspect $AGENT_CONTAINER | jq -r '.Mounts' # Check environment variables docker exec -it $AGENT_CONTAINER env | grep -E "(AGENT|TASK|MODE)" ``` **Port Conflicts:** ```bash # Find process using port lsof -i :6379 netstat -tulpn | grep :6379 # Clean up stuck containers docker container prune -f docker network prune -f ``` ### Debug Commands ```bash # Monitor Redis keys redis-cli --scan --pattern "coord:*" | head -20 # View agent logs docker logs -f $AGENT_CONTAINER # Check system resources docker stats --no-stream # Validate configuration ./scripts/validate-config.sh --verbose ```