auth-yes/.forum/hooks/pre-commit

87 lines
3.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# Agent Forum v4 - Pre-Commit Hook
#
# This hook executes Git-Native Agent Collaboration Ecosystem tasks before every commit:
# 1. Generates Semantic Code Intelligence Protocol (SCIP) & AST graphs.
# 2. Runs fast Static Analysis (Semgrep) if available.
# 3. Validates Bounded Model Checking rules via transitions.json.
# 4. Writes telemetry/reasoning payloads to Git Notes.
export FORUM_DEFER_NOTES=1
# Clear any stale pending notes from aborted commits
PENDING_FILE=$(git rev-parse --git-path forum_pending_notes.jsonl 2>/dev/null || echo ".git/forum_pending_notes.jsonl")
rm -f "$PENDING_FILE"
echo "=================================================="
echo " Agent Forum v4 - Pre-Commit Validation "
echo "=================================================="
# Exit on any failure
set -e
REPO_ROOT=$(git rev-parse --show-toplevel)
CLI="$REPO_ROOT/.forum/src/cli.ts"
if [ -f "$CLI" ] && command -v deno &> /dev/null; then
echo "Running Agent Forum meta-state checks..."
# Run the meta-state manager to extract structural diffs and enforce rules.
# Note: Using run -A for Deno as it requires fs and run permissions to inspect git
if ! deno run -A "$CLI" sync --pre-commit; then
echo "❌ Agent Forum Bounded Model Checking failed. Commit aborted."
exit 1
fi
# Optional: AST Extraction using tree-sitter
if command -v tree-sitter &> /dev/null; then
echo "-> Generating local AST structures..."
START_TS=$(deno eval 'console.log(Date.now())' 2>/dev/null || date +%s%3N)
find "$REPO_ROOT/src" \( -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.jsx" \) 2>/dev/null | while read -r file; do
rel_path="${file#"$REPO_ROOT/"}"
mkdir -p "$REPO_ROOT/.forum/ast/$(dirname "$rel_path")"
tree-sitter parse "$file" > "$REPO_ROOT/.forum/ast/$rel_path.ast" 2>/dev/null || true
done
END_TS=$(deno eval 'console.log(Date.now())' 2>/dev/null || date +%s%3N)
DURATION=$((END_TS - START_TS))
TRACE_FILE=$(git rev-parse --git-path forum_trace.jsonl)
echo "{\"cmd\":\"tree-sitter (batch ast extraction)\",\"duration_ms\":$DURATION,\"timestamp\":$START_TS,\"exit_code\":0}" >> "$TRACE_FILE"
echo " AST structures saved to .forum/ast/"
fi
if command -v deno &> /dev/null; then
echo "-> Generating Deno dependency graph..."
START_TS=$(deno eval 'console.log(Date.now())' 2>/dev/null || date +%s%3N)
mkdir -p "$REPO_ROOT/.forum/ast"
deno info --json src/run.ts > "$REPO_ROOT/.forum/ast/deno_graph.json" 2>/dev/null || true
END_TS=$(deno eval 'console.log(Date.now())' 2>/dev/null || date +%s%3N)
DURATION=$((END_TS - START_TS))
TRACE_FILE=$(git rev-parse --git-path forum_trace.jsonl)
echo "{\"cmd\":\"deno info --json src/run.ts\",\"duration_ms\":$DURATION,\"timestamp\":$START_TS,\"exit_code\":0}" >> "$TRACE_FILE"
echo " Deno dependency graph saved to .forum/ast/deno_graph.json"
fi
# Optional: Fast Security Scan
if command -v semgrep &> /dev/null; then
echo "-> Running Semgrep baseline scan..."
START_TS=$(deno eval 'console.log(Date.now())' 2>/dev/null || date +%s%3N)
mkdir -p "$REPO_ROOT/.forum/security"
semgrep scan --config=auto --json -o "$REPO_ROOT/.forum/security/semgrep_baseline.json" || true
END_TS=$(deno eval 'console.log(Date.now())' 2>/dev/null || date +%s%3N)
DURATION=$((END_TS - START_TS))
TRACE_FILE=$(git rev-parse --git-path forum_trace.jsonl)
echo "{\"cmd\":\"semgrep\",\"duration_ms\":$DURATION,\"timestamp\":$START_TS,\"exit_code\":0}" >> "$TRACE_FILE"
echo " Semgrep scan results saved to .forum/security/semgrep_baseline.json"
fi
echo "-> Agent Forum: Evaluating BMC rules & certifying commit..."
deno run -A "$CLI" run || { echo "❌ Agent Forum BMC pipeline rejected the commit."; exit 1; }
else
echo "⚠️ Agent Forum meta-state manager (Deno script) not found or Deno not installed. Skipping."
fi
echo "✅ Pre-commit validation passed."
exit 0