#!/usr/bin/env bash # Prüft alle Skills (oder nur den angegebenen) auf die Regeln aus CONTRIBUTING.md. # Aufruf: scripts/validate.sh [] set -euo pipefail source "$(dirname "$0")/lib.sh" validate_skill() { local name="$1" dir="$SKILLS_DIR/$1" fm fm_name desc raw heading local -a errs=() if [[ ! -d "$dir" ]]; then echo " - Ordner skills/$name existiert nicht" return fi mapfile -t errs < <(name_errors "$name") if [[ ! -f "$dir/SKILL.md" ]]; then errs+=("SKILL.md fehlt") else if [[ "$(head -c3 "$dir/SKILL.md" | od -An -tx1 | tr -d ' \n')" == "efbbbf" ]]; then errs+=("SKILL.md beginnt mit einem BOM – als UTF-8 ohne BOM speichern") elif ! fm="$(frontmatter "$dir/SKILL.md")"; then errs+=("SKILL.md hat kein Frontmatter (erste Zeile '---', danach schließendes '---')") else if ! fm_name="$(fm_value "$fm" name)" || [[ -z "$fm_name" ]]; then errs+=("Frontmatter: 'name' fehlt") elif [[ "$fm_name" != "$name" ]]; then errs+=("Frontmatter: name '$fm_name' passt nicht zum Ordnernamen '$name'") fi if ! desc="$(fm_value "$fm" description)" || [[ -z "$desc" ]]; then errs+=("Frontmatter: 'description' fehlt oder ist leer") else (( ${#desc} <= 1024 )) || errs+=("Frontmatter: description ist länger als 1024 Zeichen (${#desc})") [[ "$desc" == *"<"* || "$desc" == *">"* ]] && errs+=("Frontmatter: description darf keine spitzen Klammern < > enthalten") raw="$(fm_raw "$fm" description)" if [[ "$raw" != \"* && "$raw" != \'* && "$raw" == *": "* ]]; then errs+=("Frontmatter: description enthält ': ' – in Anführungszeichen setzen, sonst ist das YAML ungültig") fi fi fi fi if [[ ! -f "$dir/CHANGELOG.md" ]]; then errs+=("CHANGELOG.md fehlt") else heading="$(changelog_heading "$dir")" if [[ -z "$heading" ]]; then errs+=("CHANGELOG.md hat keinen Eintrag '## x.y.z (YYYY-MM-DD)'") elif [[ -z "$(skill_version "$dir")" ]]; then errs+=("CHANGELOG.md: oberster Eintrag '$heading' hat nicht das Format '## x.y.z (YYYY-MM-DD)'") fi fi local e for e in "${errs[@]+"${errs[@]}"}"; do echo " - $e"; done } if [[ $# -gt 0 && -n "$1" ]]; then names=("$1") else mapfile -t names < <(skill_names) fi if [[ ${#names[@]} -eq 0 ]]; then echo "Keine Skills unter skills/ gefunden." exit 0 fi failed=0 for name in "${names[@]}"; do out="$(validate_skill "$name")" if [[ -z "$out" ]]; then echo "OK $name ($(skill_version "$SKILLS_DIR/$name"))" else echo "FEHLER $name" echo "$out" failed=1 fi done exit "$failed"