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
npx claude-flow-novice skill cfn-redis-data-extraction --task-id "cfn-cli-XXXXXXX-XXXXX"
npx claude-flow-novice skill cfn-redis-data-extraction \
--task-id "cfn-cli-XXXXXXX-XXXXX" \
--output-dir "./analysis/loop-data"
npx claude-flow-novice skill cfn-redis-data-extraction \
--task-ids "cfn-cli-XXXXXXX-XXXXX,cfn-cli-YYYYYYY-YYYYY"
npx claude-flow-novice skill cfn-redis-data-extraction \
--task-id "cfn-cli-XXXXXXX-XXXXX" \
--include-performance=true
Implementation
#!/bin/bash
set -euo pipefail
OUTPUT_DIR="./analysis/cfn-loop-data"
INCLUDE_PERFORMANCE=false
TASK_IDS=()
VERBOSE=false
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 <TASK_ID> [--output-dir <DIR>] [--include-performance] [--verbose]"
exit 0
;;
*)
echo "Unknown option: $1"
exit 1
;;
esac
done
if [[ ${#TASK_IDS[@]} -eq 0 ]]; then
echo "Error: --task-id or --task-ids is required"
exit 1
fi
mkdir -p "$OUTPUT_DIR"
if ! redis-cli ping > /dev/null 2>&1; then
echo "Error: Redis is not accessible"
exit 1
fi
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"
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
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
)
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
[[ ! "$key" =~ ^swarm: ]] && continue
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]}"
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
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
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"
local avg_confidence="0"
if [[ "$confidence_count" -gt 0 ]]; then
avg_confidence=$(echo "scale=3; $total_confidence / $confidence_count" | bc -l)
fi
local task_context
task_context=$(redis-cli get "cfn_loop:task:$task_id:context" 2>/dev/null || echo "{}")
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\"
}
")
json_data=$(echo "$json_data" | jq ".metadata.task_context = \"$task_context\"")
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
echo "$json_data" | jq '.' > "$output_file"
[[ "$VERBOSE" == true ]] && echo "Data extracted to: $output_file"
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
}
echo "CFN Redis Data Extraction Started"
echo "================================="
echo "Output Directory: $OUTPUT_DIR"
echo "Include Performance: $INCLUDE_PERFORMANCE"
echo ""
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
{
"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
./.claude/skills/cfn-redis-data-extraction/extract.sh \
--task-id "$TASK_ID" \
--output-dir "./analysis/loops" \
--include-performance=true
redis-cli DEL "cfn_loop:task:$TASK_ID:*" "swarm:$TASK_ID:*"
Main Chat Automation
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)