diff --git a/plugins/claude-design/verify.sh b/plugins/claude-design/verify.sh new file mode 100755 index 0000000..8b543bc --- /dev/null +++ b/plugins/claude-design/verify.sh @@ -0,0 +1,152 @@ +#!/usr/bin/env bash +# verify.sh — Top-level roll-up for claude-design plugin verification +# +# Runs the 5 test scripts in dependency order: +# 1. tests/validate-plugin.sh (foundation plugin structure) +# 2. tests/test-skill-triggers.sh (skill description + trigger phrases) +# 3. tests/test-sc2-artifact-coverage.sh (SC2 — every preset has ≥1 file) +# 4. tests/test-sc3-citations.sh (SC3 — citation discipline) +# 5. tests/test-sc1-dogfood-log.sh (SC1 — operator dogfood log format) +# +# Flags: +# --strict pass --strict to test-sc1-dogfood-log.sh (missing block = FAIL) +# --quick skip tests/test-skill-triggers.sh (fast incremental runs) +# +# Exit codes: 0 = all sub-tests pass; non-zero = at least one sub-test failed +# +# Bash 3.2 compatible. Modelled on plugins/voyage/verify.sh helper style. + +set -u +LC_ALL=en_US.UTF-8 + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BOLD='\033[1m' +NC='\033[0m' + +PLUGIN_ROOT="$(cd "$(dirname "$0")" && pwd)" + +# Flag parsing +STRICT=false +QUICK=false +for arg in "$@"; do + case "$arg" in + --strict) STRICT=true ;; + --quick) QUICK=true ;; + -h|--help) + echo "Usage: $0 [--strict] [--quick]" + echo " --strict Pass --strict to test-sc1-dogfood-log.sh" + echo " --quick Skip tests/test-skill-triggers.sh" + exit 0 + ;; + *) + echo "Unknown flag: $arg" >&2 + echo "Usage: $0 [--strict] [--quick]" >&2 + exit 2 + ;; + esac +done + +TOTAL_PASS=0 +TOTAL_FAIL=0 +TOTAL_WARN=0 +FAILED_SCRIPTS="" + +run_script() { + local script_name="$1" + shift + local script_path="$PLUGIN_ROOT/tests/$script_name" + + if [ ! -f "$script_path" ]; then + printf "${RED}[MISSING]${NC} %s\n" "$script_name" + TOTAL_FAIL=$((TOTAL_FAIL + 1)) + FAILED_SCRIPTS="$FAILED_SCRIPTS $script_name" + return 1 + fi + + printf "${BOLD}### %s${NC}\n" "$script_name" + + local output exit_code + output="$(bash "$script_path" "$@" 2>&1)" + exit_code=$? + + printf '%s\n' "$output" + + # Parse the script's own Summary line: "Pass: N Fail: N Warn: N" + local summary + summary="$(printf '%s\n' "$output" | grep -E '^Pass: [0-9]+ Fail: [0-9]+ Warn: [0-9]+$' | tail -n 1)" + + if [ -n "$summary" ]; then + local p f w + p="$(printf '%s' "$summary" | awk '{print $2}')" + f="$(printf '%s' "$summary" | awk '{print $4}')" + w="$(printf '%s' "$summary" | awk '{print $6}')" + TOTAL_PASS=$((TOTAL_PASS + p)) + TOTAL_FAIL=$((TOTAL_FAIL + f)) + TOTAL_WARN=$((TOTAL_WARN + w)) + fi + + if [ "$exit_code" -ne 0 ]; then + FAILED_SCRIPTS="$FAILED_SCRIPTS $script_name" + fi + + printf "\n" + return "$exit_code" +} + +echo "=== claude-design verify.sh ===" +echo "Plugin root: $PLUGIN_ROOT" +echo "Strict mode: $STRICT Quick mode: $QUICK" +echo "" + +# ------------------------------------------------------- +# 1. validate-plugin.sh +# ------------------------------------------------------- +run_script "validate-plugin.sh" || true + +# ------------------------------------------------------- +# 2. test-skill-triggers.sh (skipped in --quick mode) +# ------------------------------------------------------- +if $QUICK; then + printf "${YELLOW}### test-skill-triggers.sh${NC} (skipped — --quick)\n\n" +else + run_script "test-skill-triggers.sh" || true +fi + +# ------------------------------------------------------- +# 3. test-sc2-artifact-coverage.sh +# ------------------------------------------------------- +run_script "test-sc2-artifact-coverage.sh" || true + +# ------------------------------------------------------- +# 4. test-sc3-citations.sh +# ------------------------------------------------------- +run_script "test-sc3-citations.sh" || true + +# ------------------------------------------------------- +# 5. test-sc1-dogfood-log.sh (strict if --strict) +# ------------------------------------------------------- +if $STRICT; then + run_script "test-sc1-dogfood-log.sh" --strict || true +else + run_script "test-sc1-dogfood-log.sh" || true +fi + +# ------------------------------------------------------- +# Aggregate summary +# ------------------------------------------------------- +echo "=================================================" +echo "=== claude-design verify.sh — aggregate summary" +echo "=================================================" +printf "${GREEN}Pass:${NC} %d ${RED}Fail:${NC} %d ${YELLOW}Warn:${NC} %d\n" \ + "$TOTAL_PASS" "$TOTAL_FAIL" "$TOTAL_WARN" + +if [ -n "$FAILED_SCRIPTS" ]; then + printf "${RED}Failed scripts:${NC}%s\n" "$FAILED_SCRIPTS" +fi + +if [ "$TOTAL_FAIL" -gt 0 ]; then + exit 1 +fi +exit 0