59 lines
1.3 KiB
Bash
Executable File
59 lines
1.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# validate-sdd.sh
|
|
# Ensures changed spec folders keep mandatory SDD artifacts.
|
|
set -euo pipefail
|
|
|
|
BASE_REF="${1:-origin/main}"
|
|
|
|
if ! git rev-parse --verify "$BASE_REF" >/dev/null 2>&1; then
|
|
BASE_REF="HEAD~1"
|
|
fi
|
|
|
|
CHANGED_SPEC_FILES=()
|
|
while IFS= read -r line; do
|
|
[[ -n "$line" ]] && CHANGED_SPEC_FILES+=("$line")
|
|
done < <(git diff --name-only "$BASE_REF"...HEAD -- 'specs/**')
|
|
|
|
if [[ ${#CHANGED_SPEC_FILES[@]} -eq 0 ]]; then
|
|
echo "[validate-sdd] No changes under specs/."
|
|
exit 0
|
|
fi
|
|
|
|
SPEC_DIRS=()
|
|
add_unique_dir() {
|
|
local candidate="$1"
|
|
local existing
|
|
for existing in "${SPEC_DIRS[@]:-}"; do
|
|
[[ "$existing" == "$candidate" ]] && return 0
|
|
done
|
|
SPEC_DIRS+=("$candidate")
|
|
}
|
|
|
|
for path in "${CHANGED_SPEC_FILES[@]}"; do
|
|
if [[ "$path" =~ ^specs/[^/]+/ ]]; then
|
|
spec_dir="$(echo "$path" | cut -d/ -f1-2)"
|
|
add_unique_dir "$spec_dir"
|
|
fi
|
|
done
|
|
|
|
if [[ ${#SPEC_DIRS[@]} -eq 0 ]]; then
|
|
echo "[validate-sdd] PASS (no feature spec directories changed)"
|
|
exit 0
|
|
fi
|
|
|
|
FAILED=0
|
|
for dir in "${SPEC_DIRS[@]}"; do
|
|
for required in spec.md plan.md tasks.md allowed-files.txt; do
|
|
if [[ ! -f "$dir/$required" ]]; then
|
|
echo "[validate-sdd] Missing required file: $dir/$required"
|
|
FAILED=1
|
|
fi
|
|
done
|
|
done
|
|
|
|
if [[ $FAILED -ne 0 ]]; then
|
|
exit 1
|
|
fi
|
|
|
|
echo "[validate-sdd] PASS ($BASE_REF...HEAD)"
|