#!/usr/bin/env bash # test-sc2-artifact-coverage.sh — Verifies SC2 (per-preset coverage) # # Reads .coverage.md, extracts preset names from the table column 1, # for each preset runs: # grep -rli "" plugins/claude-design/ --include='*.md' \ # --exclude-dir='.claude' --exclude-dir='tests' # and asserts ≥1 file hit. # # The preset list is NOT hardcoded — auto-adapts when .coverage.md changes. # # Usage: bash tests/test-sc2-artifact-coverage.sh # Exit codes: 0 = all presets covered; 1 = at least one preset uncovered set -euo pipefail LC_ALL=en_US.UTF-8 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' PLUGIN_ROOT="$(cd "$(dirname "$0")/.." && pwd)" PASS=0 FAIL=0 WARN=0 pass() { printf "${GREEN} ✓ %s${NC}\n" "$1"; PASS=$((PASS + 1)); } fail() { printf "${RED} ✗ %s${NC}\n" "$1"; FAIL=$((FAIL + 1)); } warn() { printf "${YELLOW} ⚠ %s${NC}\n" "$1"; WARN=$((WARN + 1)); } COVERAGE_FILE="$PLUGIN_ROOT/.coverage.md" echo "=== test-sc2-artifact-coverage ===" echo "Plugin root: $PLUGIN_ROOT" echo ".coverage.md: $COVERAGE_FILE" echo "" if [ ! -f "$COVERAGE_FILE" ]; then fail ".coverage.md missing — cannot verify SC2" echo "" echo "=== Summary ===" printf "Pass: %d Fail: %d Warn: %d\n" "$PASS" "$FAIL" "$WARN" exit 1 fi # ------------------------------------------------------- # Extract preset names from .coverage.md table column 1 # ------------------------------------------------------- # Table rows look like: # | designs | skills/.../presets/designs.md | Evidence grade: ... | https://... | # Skip header (| Preset | ...) and separator (| --- | ...). PRESETS="$(awk -F'|' ' /^\| / && NR > 1 { name = $2 gsub(/^ +| +$/, "", name) if (name != "Preset" && name !~ /^-+$/ && name != "") { print name } } ' "$COVERAGE_FILE")" if [ -z "$PRESETS" ]; then fail "no preset names extracted from .coverage.md" echo "" echo "=== Summary ===" printf "Pass: %d Fail: %d Warn: %d\n" "$PASS" "$FAIL" "$WARN" exit 1 fi # ------------------------------------------------------- # For each preset, grep for at least one file hit in plugin content # ------------------------------------------------------- while IFS= read -r preset; do [ -z "$preset" ] && continue HITS="$(grep -rli "$preset" "$PLUGIN_ROOT" \ --include='*.md' \ --exclude-dir='.claude' \ --exclude-dir='tests' \ 2>/dev/null || true)" HIT_COUNT="$(printf '%s\n' "$HITS" | grep -c '.' || true)" if [ -z "$HIT_COUNT" ]; then HIT_COUNT=0; fi if [ "$HIT_COUNT" -ge 1 ]; then pass "preset '$preset' covered by $HIT_COUNT file(s)" else fail "preset '$preset' has zero file hits in plugin content" fi done < <(printf '%s\n' "$PRESETS") echo "" echo "=== Summary ===" printf "Pass: %d Fail: %d Warn: %d\n" "$PASS" "$FAIL" "$WARN" if [ "$FAIL" -gt 0 ]; then exit 1 fi exit 0