#!/usr/bin/env bash # Regression test for scripts/vale-wrap.sh: Vale's `text.frontmatter.description` # NLP scope silently stops matching when the description value is a YAML block # scalar spanning 2+ physical lines. vale-wrap.sh flattens it to one line before # handing off to the real vale binary — this asserts that actually happens. set -euo pipefail REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" SCRIPT="$REPO_ROOT/scripts/vale-wrap.sh" PASS=0 FAIL=0 pass() { echo " PASS: $1"; PASS=$((PASS + 1)); } fail() { echo " FAIL: $1"; FAIL=$((FAIL + 1)); } if ! command -v vale &>/dev/null; then echo "vale is not installed — skipping (matches skill-audit/agent-audit's own fallback behavior)" exit 0 fi make_fixture() { local dir desc_lines file dir="$(mktemp -d)" (cd "$dir" && git init -q) mkdir -p "$dir/plugins/testplugin/skills/zzzskill" desc_lines="$1" file="$dir/plugins/testplugin/skills/zzzskill/SKILL.md" { echo "---" echo "name: zzzskill" echo "description: >" for ((i = 1; i <= desc_lines; i++)); do echo " Line $i mentions helps with and utilize, plus a colon: like this." done echo "---" echo "" echo "Body." } > "$file" echo "$dir" } # --- 1. A known-bad single-line description is caught (sanity check on Vale itself) --- echo "" echo "--- catches vague wording in a single-line description ---" FIXTURE1="$(make_fixture 1)" trap 'rm -rf "$FIXTURE1"' EXIT if (cd "$FIXTURE1" && bash "$SCRIPT" --config "$REPO_ROOT/.vale.ini" \ plugins/testplugin/skills/zzzskill/SKILL.md) | grep -q "VagueWording"; then pass "flags vague wording when description is a single physical line" else fail "did not flag known-bad single-line description" fi # --- 2. The same known-bad wording across 2+ physical lines is still caught --- echo "" echo "--- catches vague wording in a multi-line folded description ---" FIXTURE2="$(make_fixture 2)" trap 'rm -rf "$FIXTURE1" "$FIXTURE2"' EXIT if (cd "$FIXTURE2" && bash "$SCRIPT" --config "$REPO_ROOT/.vale.ini" \ plugins/testplugin/skills/zzzskill/SKILL.md) | grep -q "VagueWording"; then pass "flags vague wording when description spans 2+ physical lines" else fail "silently missed known-bad wording in a multi-line description — the bug this test guards against" fi # --- 3. Line count is preserved so unrelated report line numbers don't shift --- echo "" echo "--- preserves total line count when flattening ---" FIXTURE3="$(make_fixture 3)" trap 'rm -rf "$FIXTURE1" "$FIXTURE2" "$FIXTURE3"' EXIT ORIG_LINES=$(wc -l < "$FIXTURE3/plugins/testplugin/skills/zzzskill/SKILL.md") OUT=$(cd "$FIXTURE3" && bash "$SCRIPT" --config "$REPO_ROOT/.vale.ini" \ plugins/testplugin/skills/zzzskill/SKILL.md 2>&1 || true) MAX_LINE=$(echo "$OUT" | grep -oE '^[[:space:]]*[0-9]+:[0-9]+' | tr -d '[:space:]' | cut -d: -f1 | sort -n | tail -1) if [[ -n "$MAX_LINE" ]] && (( MAX_LINE <= ORIG_LINES )); then pass "reported line numbers stay within the original file's line count" else fail "reported line number ($MAX_LINE) exceeds original file line count ($ORIG_LINES)" fi echo "" echo "Results: $PASS passed, $FAIL failed" [[ $FAIL -eq 0 ]]