--- name: cfn-redis-data-extraction description: Extract complete Redis coordination data from completed CFN Loop tasks and structure into comprehensive JSON analysis files version: 1.0.0 author: CFN System category: coordination tags: [cfn, redis, data-extraction, coordination, loop-analysis] # CFN Redis Data Extraction Skill ## Purpose Extracts complete Redis coordination data from completed CFN Loop tasks and structures it into comprehensive JSON files for analysis, auditing, and performance tracking. ## When to Use - **Mandatory**: Execute after each completed CFN Loop task - **Timing**: After Product Owner decision, before Redis cleanup - **Trigger**: Main Chat coordination after loop completion - **Scope**: All Redis keys for a specific task ID ## Usage ```bash # Extract data from completed CFN Loop npx claude-flow-novice skill cfn-redis-data-extraction --task-id "cfn-cli-XXXXXXX-XXXXX" # Extract with custom output directory npx claude-flow-novice skill cfn-redis-data-extraction \ --task-id "cfn-cli-XXXXXXX-XXXXX" \ --output-dir "./analysis/loop-data" # Extract multiple tasks npx claude-flow-novice skill cfn-redis-data-extraction \ --task-ids "cfn-cli-XXXXXXX-XXXXX,cfn-cli-YYYYYYY-YYYYY" # Extract with detailed performance metrics npx claude-flow-novice skill cfn-redis-data-extraction \ --task-id "cfn-cli-XXXXXXX-XXXXX" \ --include-performance=true ``` ## Implementation ```bash #!/bin/bash # CFN Redis Data Extraction Script set -euo pipefail # Default values OUTPUT_DIR="./analysis/cfn-loop-data" INCLUDE_PERFORMANCE=false TASK_IDS=() VERBOSE=false # Parse arguments while [[ $# -gt 0 ]]; do case $1 in --task-id) TASK_IDS+=("$2") shift 2 ;; --task-ids) IFS=',' read -ra TASK_IDS <<< "$2" shift 2 ;; --output-dir) OUTPUT_DIR="$2" shift 2 ;; --include-performance) INCLUDE_PERFORMANCE=true shift ;; --verbose) VERBOSE=true shift ;; -h|--help) echo "Usage: $0 --task-id [--output-dir ] [--include-performance] [--verbose]" exit 0 ;; *) echo "Unknown option: $1" exit 1 ;; esac done # Validate required arguments if [[ ${#TASK_IDS[@]} -eq 0 ]]; then echo "Error: --task-id or --task-ids is required" exit 1 fi # Create output directory mkdir -p "$OUTPUT_DIR" # Redis connection check if ! redis-cli ping > /dev/null 2>&1; then echo "Error: Redis is not accessible" exit 1 fi # Function to extract task data extract_task_data() { local task_id="$1" local output_file="$OUTPUT_DIR/cfn-loop-${task_id}-extracted.json" [[ "$VERBOSE" == true ]] && echo "Extracting data for task: $task_id" # Get all Redis keys for the task local redis_keys redis_keys=$(redis-cli keys "*${task_id}*" 2>/dev/null | sort) if [[ -z "$redis_keys" ]]; then echo "Warning: No Redis keys found for task: $task_id" return 1 fi # Initialize JSON structure local json_data json_data=$(cat << EOF { "task_id": "$task_id", "extraction_timestamp": "$(date -u +%Y-%m-%dT%H:%M:%SZ)", "extraction_version": "1.0.0", "redis_keys_analyzed": $(echo "$redis_keys" | wc -l), "agents": {}, "metadata": {}, "summary": {} } EOF ) # Process each Redis key local agent_count=0 local completion_signals=0 local total_confidence=0 local confidence_count=0 while IFS= read -r key; do [[ -z "$key" ]] && continue # Skip if not a swarm key [[ ! "$key" =~ ^swarm: ]] && continue # Extract agent information from key local agent_type="" local agent_id="" local loop_number="" local data_type="" if [[ "$key" =~ ^swarm:([^:]+):([^:]+):([^:]+)$ ]]; then agent_id="${BASH_REMATCH[2]}" data_type="${BASH_REMATCH[3]}" # Determine agent type and loop if [[ "$agent_id" =~ ^cfn-v3-coordinator ]]; then agent_type="coordinator" loop_number="coordination" elif [[ "$agent_id" =~ -validation$ ]]; then agent_type="${agent_id%-validation}" loop_number="2" elif [[ "$agent_id" =~ -1$ ]] || [[ "$agent_id" =~ -2$ ]] || [[ "$agent_id" =~ -3$ ]]; then agent_type="${agent_id%-1}" agent_type="${agent_type%-2}" agent_type="${agent_type%-3}" loop_number="3" elif [[ "$agent_id" =~ product-owner$ ]]; then agent_type="product-owner" loop_number="4" else agent_type="$agent_id" loop_number="unknown" fi # Initialize agent in JSON if not exists if [[ ! "$json_data" =~ "\"$agent_id\":" ]]; then ((agent_count++)) json_data=$(echo "$json_data" | jq ".agents += {\"$agent_id\": {\"agent_type\": \"$agent_type\", \"loop\": \"$loop_number\", \"data\": {}}}") fi # Extract data based on type case "$data_type" in "confidence") local confidence confidence=$(redis-cli get "$key" 2>/dev/null || echo "null") json_data=$(echo "$json_data" | jq ".agents[\"$agent_id\"].confidence = $confidence") total_confidence=$(echo "$total_confidence + $confidence" | bc -l 2>/dev/null || echo "$total_confidence") ((confidence_count++)) ;; "done") local completion_signal completion_signal=$(redis-cli lrange "$key" 0 -1 2>/dev/null | head -1 || echo "null") json_data=$(echo "$json_data" | jq ".agents[\"$agent_id\"].completion_signal = \"$completion_signal\"") ((completion_signals++)) ;; "messages") local messages_json="[]" local message_count message_count=$(redis-cli llen "$key" 2>/dev/null || echo "0") if [[ "$message_count" -gt 0 ]]; then messages_json=$(redis-cli lrange "$key" 0 -1 2>/dev/null | jq -R . | jq -s .) fi json_data=$(echo "$json_data" | jq ".agents[\"$agent_id\"].messages = $messages_json") ;; "result") local result result=$(redis-cli get "$key" 2>/dev/null || echo "null") json_data=$(echo "$json_data" | jq ".agents[\"$agent_id\"].result = \"$result\"") ;; esac fi done <<< "$redis_keys" # Calculate averages and summary local avg_confidence="0" if [[ "$confidence_count" -gt 0 ]]; then avg_confidence=$(echo "scale=3; $total_confidence / $confidence_count" | bc -l) fi # Extract task context if available local task_context task_context=$(redis-cli get "cfn_loop:task:$task_id:context" 2>/dev/null || echo "{}") # Update summary json_data=$(echo "$json_data" | jq " .summary += { \"total_agents\": $agent_count, \"completion_signals\": $completion_signals, \"average_confidence\": $avg_confidence, \"confidence_scores_count\": $confidence_count, \"extraction_status\": \"success\" } ") # Add task context json_data=$(echo "$json_data" | jq ".metadata.task_context = \"$task_context\"") # Add performance metrics if requested if [[ "$INCLUDE_PERFORMANCE" == true ]]; then local performance_metrics performance_metrics=$(cat << EOF { "redis_memory_usage": $(redis-cli info memory 2>/dev/null | grep "used_memory_human" | cut -d: -f2 | tr -d '\r' || echo "\"unknown\""), "redis_connected_clients": $(redis-cli info clients 2>/dev/null | grep "connected_clients" | cut -d: -f2 | tr -d '\r' || echo "0"), "extraction_duration_ms": 0 } EOF ) json_data=$(echo "$json_data" | jq ".metadata.performance = $performance_metrics") fi # Write to file echo "$json_data" | jq '.' > "$output_file" [[ "$VERBOSE" == true ]] && echo "Data extracted to: $output_file" # Generate summary report local summary_file="$OUTPUT_DIR/cfn-loop-${task_id}-summary.txt" cat > "$summary_file" << EOF CFN Loop Data Extraction Summary ================================ Task ID: $task_id Extraction Time: $(date -u +%Y-%m-%dT%H:%M:%SZ) Output File: $output_file Statistics: - Redis Keys Analyzed: $(echo "$redis_keys" | wc -l) - Total Agents: $agent_count - Completion Signals: $completion_signals - Average Confidence: $avg_confidence - Confidence Scores: $confidence_count Agent Types: $(echo "$json_data" | jq -r '.agents | to_entries[] | "- \(.key): \(.value.agent_type) (Loop \(.value.loop))"') Status: Successfully extracted EOF [[ "$VERBOSE" == true ]] && echo "Summary report generated: $summary_file" return 0 } # Main execution echo "CFN Redis Data Extraction Started" echo "=================================" echo "Output Directory: $OUTPUT_DIR" echo "Include Performance: $INCLUDE_PERFORMANCE" echo "" # Process each task for task_id in "${TASK_IDS[@]}"; do echo "Processing task: $task_id" if extract_task_data "$task_id"; then echo "✅ Successfully extracted data for: $task_id" else echo "❌ Failed to extract data for: $task_id" fi echo "" done echo "CFN Redis Data Extraction Completed" echo "===================================" echo "Output Directory: $OUTPUT_DIR" echo "Files Generated:" find "$OUTPUT_DIR" -name "cfn-loop-*.json" -o -name "cfn-loop-*.txt" | while read -r file; do echo " - $file" done exit 0 ``` ## Parameters | Parameter | Type | Required | Description | |-----------|------|----------|-------------| | `--task-id` | string | Yes | Single CFN Loop task ID to extract | | `--task-ids` | string | No | Comma-separated list of task IDs | | `--output-dir` | string | No | Output directory (default: ./analysis/cfn-loop-data) | | `--include-performance` | boolean | No | Include Redis performance metrics | | `--verbose` | boolean | No | Enable verbose output | ## Output Structure The skill generates two files per task: ### 1. Main JSON Data File `cfn-loop-{task_id}-extracted.json` ```json { "task_id": "cfn-cli-543042-13483", "extraction_timestamp": "2025-11-09T04:56:00Z", "extraction_version": "1.0.0", "redis_keys_analyzed": 44, "agents": { "cfn-v3-coordinator-1": { "agent_type": "coordinator", "loop": "coordination", "confidence": 0.85, "completion_signal": "complete", "messages": [...], "result": "..." }, "agent-id-2": { "agent_type": "frontend-developer", "loop": "3", "confidence": 0.92, "completion_signal": "complete" } }, "metadata": { "task_context": "...", "performance": { "redis_memory_usage": "2.5M", "redis_connected_clients": 12 } }, "summary": { "total_agents": 11, "completion_signals": 11, "average_confidence": 0.86, "extraction_status": "success" } } ``` ### 2. Summary Text File `cfn-loop-{task_id}-summary.txt` Human-readable summary with key statistics and agent information. ## Integration Points ### CFN Loop Completion Workflow ```bash # After Product Owner decision, before Redis cleanup ./.claude/skills/cfn-redis-data-extraction/extract.sh \ --task-id "$TASK_ID" \ --output-dir "./analysis/loops" \ --include-performance=true # Then proceed with Redis cleanup redis-cli DEL "cfn_loop:task:$TASK_ID:*" "swarm:$TASK_ID:*" ``` ### Main Chat Automation ```bash # Automatic extraction after loop completion npx claude-flow-novice skill cfn-redis-data-extraction \ --task-id "cfn-cli-XXXXXXX-XXXXX" \ --verbose ``` ## Error Handling - **Redis Unavailable**: Graceful exit with error message - **No Keys Found**: Warning message, continue processing - **Invalid JSON**: Fallback to basic text extraction - **Permission Issues**: Directory creation with appropriate permissions ## Performance Considerations - **Large Key Sets**: Processes keys in batches to avoid memory issues - **Concurrent Access**: Uses read-only Redis operations - **File Size**: JSON files are compressed and structured efficiently - **Extraction Time**: Typically <5 seconds per task ## Validation The skill includes built-in validation: - Redis connectivity check - JSON structure validation - Data completeness verification - Output file creation confirmation ## Maintenance - **Version Tracking**: Each extraction includes version metadata - **Backward Compatibility**: Supports multiple extraction formats - **Cleanup**: Old files can be archived or cleaned up automatically - **Monitoring**: Integration with system monitoring for extraction success rates ## Related Skills - `cfn-redis-coordination` - For understanding Redis coordination patterns - `cfn-loop-validation` - For validating loop execution - `cfn-agent-spawning` - For understanding agent lifecycle ## Dependencies - `redis-cli` - Redis command-line interface - `jq` - JSON processor for data manipulation - `bc` - Basic calculator for confidence averaging - Standard Unix utilities (grep, awk, sed)