#!/usr/bin/env bash # Pre-commit hook dispatcher. Runs modular checks from tooling/. # Installed via: git config core.hooksPath .config/hooks set -euo pipefail REPO_ROOT="$(git rev-parse --show-toplevel)" ERRORS=0 run_check() { local script="$1" local label="$2" if [ -x "$REPO_ROOT/$script" ]; then if ! "$REPO_ROOT/$script"; then ERRORS=$((ERRORS + 1)) fi else echo "pre-commit: WARNING — $label skipped ($script not found or not executable)" echo " Run 'make setup' or check that $script exists and is executable." fi } # --- Checks --- run_check "tooling/check-fact-ids" "fact_id validation" # --- pql: decision integrity + durable planning changelog --- # Replaces the old SQLite decisions-sync hook. Decisions are markdown-sourced (D-8): # `decisions validate` is the decision-ID/format gate (supersedes the never-built # check-decision-ids), and `plan export --stage` flushes any ticket mutations to the # git-tracked .pql/changelog/ and stages them so planning state lands in this commit. # pql installs its own hooks into .pql/hooks, which git ignores under # core.hooksPath=.config/hooks — so the logic is folded in here by hand instead. if command -v pql >/dev/null 2>&1; then if ! pql decisions validate >/dev/null; then echo "pre-commit: pql decisions validate failed — malformed decision record(s)." ERRORS=$((ERRORS + 1)) fi pql plan export --stage >/dev/null 2>&1 || \ echo "pre-commit: WARNING — pql plan export failed; changelog not refreshed." else echo "pre-commit: WARNING — pql not on PATH; decision validate + changelog export skipped." fi # Run cargo audit only when Cargo.toml or Cargo.lock changed if git diff --cached --name-only | grep -qE '(Cargo\.toml|Cargo\.lock)$'; then echo "pre-commit: Cargo dependency change detected — running cargo audit..." if command -v cargo-audit >/dev/null 2>&1 || cargo audit --version >/dev/null 2>&1; then if ! (cd "$REPO_ROOT/server" && cargo audit); then ERRORS=$((ERRORS + 1)) fi else echo "pre-commit: WARNING — cargo-audit not installed, skipping advisory check" echo " Install with: cargo install cargo-audit" fi fi if [ "$ERRORS" -gt 0 ]; then echo "" echo "pre-commit: $ERRORS check(s) failed. Commit aborted." exit 1 fi