infinite-agents-public/infinite_variants/infinite_variant_1/validators/check_patterns.sh

205 lines
7.0 KiB
Bash
Executable File

#!/bin/bash
# Pattern Library Validation Script
# Validates pattern library JSON structure and quality
set -e # Exit on error
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Default pattern library path
PATTERN_LIB="${1:-pattern_library/patterns.json}"
echo "=================================="
echo "Pattern Library Validation Script"
echo "=================================="
echo ""
# Check if file exists
if [ ! -f "$PATTERN_LIB" ]; then
echo -e "${RED}ERROR: Pattern library not found at: $PATTERN_LIB${NC}"
exit 1
fi
echo -e "Validating: ${GREEN}$PATTERN_LIB${NC}"
echo ""
# Check if JSON is valid
echo "1. Validating JSON syntax..."
if jq empty "$PATTERN_LIB" 2>/dev/null; then
echo -e " ${GREEN}✓ Valid JSON${NC}"
else
echo -e " ${RED}✗ Invalid JSON syntax${NC}"
exit 1
fi
# Check required top-level fields
echo "2. Checking required fields..."
REQUIRED_FIELDS=("version" "last_updated" "total_iterations_analyzed" "patterns" "metadata")
for field in "${REQUIRED_FIELDS[@]}"; do
if jq -e ".$field" "$PATTERN_LIB" >/dev/null 2>&1; then
echo -e " ${GREEN}✓ Field '$field' exists${NC}"
else
echo -e " ${RED}✗ Missing required field: '$field'${NC}"
exit 1
fi
done
# Check pattern categories
echo "3. Checking pattern categories..."
CATEGORIES=("structural" "content" "innovation" "quality")
for category in "${CATEGORIES[@]}"; do
if jq -e ".patterns.$category" "$PATTERN_LIB" >/dev/null 2>&1; then
count=$(jq ".patterns.$category | length" "$PATTERN_LIB")
echo -e " ${GREEN}✓ Category '$category': $count patterns${NC}"
# Validate pattern count (should be 3-5 for 'deep' analysis)
if [ "$count" -lt 0 ] || [ "$count" -gt 5 ]; then
echo -e " ${YELLOW}⚠ Warning: Unexpected pattern count for '$category' (expected 0-5, got $count)${NC}"
fi
else
echo -e " ${RED}✗ Missing pattern category: '$category'${NC}"
exit 1
fi
done
# Check pattern object structure
echo "4. Validating pattern objects..."
PATTERN_FIELDS=("name" "description" "example_file" "key_characteristics" "success_metrics")
error_count=0
for category in "${CATEGORIES[@]}"; do
pattern_count=$(jq ".patterns.$category | length" "$PATTERN_LIB")
if [ "$pattern_count" -gt 0 ]; then
for ((i=0; i<pattern_count; i++)); do
pattern_name=$(jq -r ".patterns.$category[$i].name" "$PATTERN_LIB")
echo -e " Checking pattern: ${YELLOW}$category[$i] - $pattern_name${NC}"
for field in "${PATTERN_FIELDS[@]}"; do
if ! jq -e ".patterns.$category[$i].$field" "$PATTERN_LIB" >/dev/null 2>&1; then
echo -e " ${RED}✗ Missing field '$field' in $category[$i]${NC}"
((error_count++))
fi
done
done
fi
done
if [ $error_count -eq 0 ]; then
echo -e " ${GREEN}✓ All pattern objects valid${NC}"
else
echo -e " ${RED}✗ Found $error_count errors in pattern objects${NC}"
exit 1
fi
# Check metadata
echo "5. Checking metadata..."
METADATA_FIELDS=("extraction_date" "source_directory" "iterations_count" "patterns_extracted")
for field in "${METADATA_FIELDS[@]}"; do
if jq -e ".metadata.$field" "$PATTERN_LIB" >/dev/null 2>&1; then
value=$(jq -r ".metadata.$field" "$PATTERN_LIB")
echo -e " ${GREEN}✓ metadata.$field = $value${NC}"
else
echo -e " ${YELLOW}⚠ Optional field missing: metadata.$field${NC}"
fi
done
# Calculate total patterns
echo "6. Calculating statistics..."
total_patterns=0
for category in "${CATEGORIES[@]}"; do
count=$(jq ".patterns.$category | length" "$PATTERN_LIB")
total_patterns=$((total_patterns + count))
done
version=$(jq -r ".version" "$PATTERN_LIB")
iterations=$(jq -r ".total_iterations_analyzed" "$PATTERN_LIB")
last_updated=$(jq -r ".last_updated" "$PATTERN_LIB")
echo -e " ${GREEN}Version:${NC} $version"
echo -e " ${GREEN}Total patterns:${NC} $total_patterns"
echo -e " ${GREEN}Iterations analyzed:${NC} $iterations"
echo -e " ${GREEN}Last updated:${NC} $last_updated"
# Validate pattern count consistency
declared_count=$(jq -r ".metadata.patterns_extracted" "$PATTERN_LIB")
if [ "$declared_count" != "null" ] && [ "$total_patterns" -ne "$declared_count" ]; then
echo -e " ${YELLOW}⚠ Warning: Pattern count mismatch (counted: $total_patterns, declared: $declared_count)${NC}"
fi
# Check for duplicate pattern names
echo "7. Checking for duplicate pattern names..."
all_pattern_names=$(jq -r '[.patterns[][].name] | sort' "$PATTERN_LIB")
unique_names=$(jq -r '[.patterns[][].name] | unique | sort' "$PATTERN_LIB")
if [ "$all_pattern_names" = "$unique_names" ]; then
echo -e " ${GREEN}✓ No duplicate pattern names${NC}"
else
echo -e " ${YELLOW}⚠ Warning: Duplicate pattern names detected${NC}"
fi
# Check pattern quality
echo "8. Assessing pattern quality..."
patterns_with_snippets=0
patterns_with_metrics=0
total_patterns_checked=0
for category in "${CATEGORIES[@]}"; do
pattern_count=$(jq ".patterns.$category | length" "$PATTERN_LIB")
for ((i=0; i<pattern_count; i++)); do
((total_patterns_checked++))
# Check for code snippet
if jq -e ".patterns.$category[$i].code_snippet" "$PATTERN_LIB" >/dev/null 2>&1; then
snippet=$(jq -r ".patterns.$category[$i].code_snippet" "$PATTERN_LIB")
if [ "$snippet" != "null" ] && [ -n "$snippet" ]; then
((patterns_with_snippets++))
fi
fi
# Check for success metrics
if jq -e ".patterns.$category[$i].success_metrics" "$PATTERN_LIB" >/dev/null 2>&1; then
metrics=$(jq -r ".patterns.$category[$i].success_metrics" "$PATTERN_LIB")
if [ "$metrics" != "null" ] && [ -n "$metrics" ]; then
((patterns_with_metrics++))
fi
fi
done
done
if [ $total_patterns_checked -gt 0 ]; then
snippet_percent=$((patterns_with_snippets * 100 / total_patterns_checked))
metrics_percent=$((patterns_with_metrics * 100 / total_patterns_checked))
echo -e " ${GREEN}Patterns with code snippets:${NC} $patterns_with_snippets/$total_patterns_checked ($snippet_percent%)"
echo -e " ${GREEN}Patterns with success metrics:${NC} $patterns_with_metrics/$total_patterns_checked ($metrics_percent%)"
if [ $snippet_percent -ge 80 ] && [ $metrics_percent -ge 80 ]; then
echo -e " ${GREEN}✓ High quality pattern library${NC}"
else
echo -e " ${YELLOW}⚠ Consider adding more code snippets and success metrics${NC}"
fi
fi
# Final summary
echo ""
echo "=================================="
echo "Validation Summary"
echo "=================================="
echo -e "${GREEN}✓ Pattern library is valid${NC}"
echo ""
echo "File: $PATTERN_LIB"
echo "Version: $version"
echo "Total patterns: $total_patterns"
echo "Quality score: $snippet_percent% complete"
echo ""
echo -e "${GREEN}Pattern library ready for use in infinite-synthesis command!${NC}"
exit 0