--- 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] Extracts complete Redis coordination data from completed CFN Loop tasks and structures it into comprehensive JSON files for analysis, auditing, and performance tracking. - **Mandato
Scanned 6/3/2026
Install via CLI
openskills install majiayu000/claude-skill-registry---
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 <TASK_ID> [--output-dir <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)No comments yet. Be the first to comment!