100 lines
2.8 KiB
Bash
Executable file
100 lines
2.8 KiB
Bash
Executable file
#!/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 "<preset>" 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
|