#!/bin/bash # # run-tests.sh - Execute test workflow and capture results # # Usage: ./run-tests.sh # # This script guides you through testing each test case manually and records results. # set -euo pipefail # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' # No Color # Parse arguments SKILL_DIR="" usage() { echo "Usage: $0 " echo "" echo "Examples:" echo " $0 ~/.config/opencode/skills/my-skill" echo " $0 ./my-skill" exit 1 } # Parse command line arguments while [[ $# -gt 0 ]]; do case $1 in -h|--help) usage ;; -*) echo -e "${RED}Error: Unknown option $1${NC}" usage ;; *) if [[ -z "$SKILL_DIR" ]]; then SKILL_DIR="$1" else echo -e "${RED}Error: Multiple skill directories provided${NC}" usage fi shift ;; esac done # Validate skill directory if [[ -z "$SKILL_DIR" ]]; then echo -e "${RED}Error: Skill directory is required${NC}" usage fi # Resolve path SKILL_DIR="$(cd "$SKILL_DIR" 2>/dev/null && pwd)" || { echo -e "${RED}Error: Cannot access directory: $SKILL_DIR${NC}" exit 1 } # Get skill name from directory SKILL_NAME="$(basename "$SKILL_DIR")" # Verify evals.json exists if [[ ! -f "$SKILL_DIR/evals/evals.json" ]]; then echo -e "${RED}Error: evals/evals.json not found${NC}" echo "" echo "Create test cases first:" echo " ~/.config/opencode/skills/skill-builder/scripts/create-tests.sh $SKILL_DIR" exit 1 fi echo "========================================" echo "Running Tests for: $SKILL_NAME" echo "========================================" echo "" # Check if jq is available if ! command -v jq &> /dev/null; then echo -e "${YELLOW}⚠ jq is not installed${NC}" echo " Install jq for better JSON handling:" echo " Ubuntu/Debian: sudo apt-get install jq" echo " macOS: brew install jq" echo "" echo -e "${YELLOW}Falling back to basic parsing...${NC}" USE_JQ=false else USE_JQ=true fi # Initialize results array RESULTS=() TEST_COUNT=0 PASSED=0 FAILED=0 SKIPPED=0 # Function to extract value from JSON using basic parsing get_json_value() { local file="$1" local key="$2" local index="${3:-}" if [[ "$USE_JQ" == true ]]; then if [[ -n "$index" ]]; then jq -r ".evals[$index].$key" "$file" 2>/dev/null || echo "" else jq -r ".$key" "$file" 2>/dev/null || echo "" fi else # Basic grep-based extraction (fallback) if [[ -n "$index" ]]; then # This is a simplified fallback - won't handle nested structures well grep -A 100 '"evals":' "$file" | grep -A 20 "\"id\": $index" | grep "\"$key\":" | head -1 | sed 's/.*"'$key'": "\(.*\)".*/\1/' | sed 's/",*$//' else grep "\"$key\":" "$file" | head -1 | sed 's/.*"'$key'": "\(.*\)".*/\1/' | sed 's/",*$//' fi fi } # Count test cases if [[ "$USE_JQ" == true ]]; then TEST_COUNT=$(jq '.evals | length' "$SKILL_DIR/evals/evals.json") else TEST_COUNT=$(grep -c '"id":' "$SKILL_DIR/evals/evals.json" 2>/dev/null || echo "0") fi if [[ "$TEST_COUNT" -eq 0 ]]; then echo -e "${RED}Error: No test cases found in evals.json${NC}" exit 1 fi echo "Found $TEST_COUNT test case(s)" echo "" # Process each test case for ((i=0; i "$SKILL_DIR/evals/test-results.json" << EOF { "skill_name": "$SKILL_NAME", "run_timestamp": "$RUN_TIMESTAMP", "summary": { "total": $((${#RESULTS[@]})), "passed": $PASSED, "failed": $FAILED, "skipped": $SKIPPED }, "results": $RESULTS_JSON } EOF echo -e "${GREEN}✓ Saved results to evals/test-results.json${NC}" echo "" # Display summary echo "========================================" echo "Test Run Summary" echo "========================================" echo "" echo "Total Tests: $((${#RESULTS[@]}))" echo -e "${GREEN}Passed: $PASSED${NC}" echo -e "${RED}Failed: $FAILED${NC}" echo -e "${YELLOW}Skipped: $SKIPPED${NC}" echo "" # Next steps if [[ $FAILED -gt 0 ]]; then echo "========================================" echo -e "${YELLOW}Next Steps:${NC}" echo "========================================" echo "" echo "Some tests failed. To improve your skill:" echo "" echo "1. Review test-results.json for details" echo "2. Update SKILL.md to address issues" echo "3. Run tests again:" echo " $0 $SKILL_DIR" echo "" echo "For detailed grading:" echo " ~/.config/opencode/skills/skill-builder/scripts/grade-output.sh $SKILL_DIR" echo "" fi echo -e "${GREEN}Done!${NC}"