#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$ROOT_DIR" log() { printf '[check-feature-spec] %s\n' "$1" } BASE_SHA="${BASE_SHA:-}" if [[ -z "$BASE_SHA" ]]; then if git rev-parse --verify origin/main >/dev/null 2>&1; then BASE_SHA="$(git merge-base origin/main HEAD)" else log "No BASE_SHA and origin/main unavailable; skipping check." exit 0 fi fi if ! git rev-parse --verify "$BASE_SHA" >/dev/null 2>&1; then log "BASE_SHA '$BASE_SHA' not found; skipping check." exit 0 fi changed_files="$(git diff --name-only "$BASE_SHA"...HEAD)" if [[ -z "$changed_files" ]]; then log "No changed files; nothing to enforce." exit 0 fi code_changed=0 spec_changed=0 while IFS= read -r path; do [[ -z "$path" ]] && continue case "$path" in frontend/src/*|backend/*|src-tauri/src/*|shared/project-schema.json) code_changed=1 ;; esac case "$path" in docs/specs/*.md) spec_changed=1 ;; esac done <<< "$changed_files" if [[ "$code_changed" -eq 0 ]]; then log "No app code changes detected; spec file not required." exit 0 fi if [[ "$spec_changed" -eq 1 ]]; then log "Spec requirement satisfied." exit 0 fi log "Code changes detected without spec update in docs/specs/." log "Add or update at least one spec file using docs/spec-template.md." exit 1