File size: 3,180 Bytes
ef6eb55 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | #!/bin/bash
# ADR CI Validation
# Validates ADRs for required fields and consistency
# Usage: ./scripts/validate-adr.sh
set -e
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
ADR_DIR="$REPO_ROOT/docs/adr"
ERRORS=0
echo "=== ADR Validation ==="
echo ""
# Check all ADRs exist
if [ ! -d "$ADR_DIR" ]; then
echo "ERROR: $ADR_DIR does not exist"
exit 1
fi
echo "[*] Validating ADRs in $ADR_DIR"
echo ""
# Validate each ADR
for adr in "$ADR_DIR"/[0-9]*.md; do
if [ ! -f "$adr" ]; then
continue
fi
FILENAME=$(basename "$adr")
ADR_ID=$(echo "$FILENAME" | sed 's/-.*//')
echo "[*] Checking $FILENAME"
# Check required fields
if ! grep -q "^# ADR-[0-9]*:" "$adr"; then
echo " β Missing ADR title (# ADR-nnnn:)"
ERRORS=$((ERRORS+1))
fi
if ! grep -q "**Status:**" "$adr"; then
echo " β Missing Status field"
ERRORS=$((ERRORS+1))
fi
if ! grep -q "**Date:**" "$adr"; then
echo " β Missing Date field"
ERRORS=$((ERRORS+1))
fi
if ! grep -q "## Context" "$adr"; then
echo " β Missing Context section"
ERRORS=$((ERRORS+1))
fi
if ! grep -q "## Decision" "$adr"; then
echo " β Missing Decision section"
ERRORS=$((ERRORS+1))
fi
if ! grep -q "## Rules" "$adr"; then
echo " β Missing Rules section"
ERRORS=$((ERRORS+1))
fi
if ! grep -q "## Consequences" "$adr"; then
echo " β Missing Consequences section"
ERRORS=$((ERRORS+1))
fi
# Check status is valid
STATUS=$(grep "**Status:**" "$adr" | sed 's/.*Status: *//' | sed 's/ .*//')
if [[ ! "$STATUS" =~ ^(Accepted|Proposed|Superseded|Rejected)$ ]]; then
echo " β Invalid Status: $STATUS (must be: Accepted, Proposed, Superseded, Rejected)"
ERRORS=$((ERRORS+1))
fi
echo " β Valid ADR"
done
echo ""
# Check for private key patterns in code
echo "[*] Scanning for private key patterns in repository..."
PRIVATE_KEY_PATTERNS=(
"-----BEGIN.*PRIVATE"
"-----END.*PRIVATE"
"private_key.*="
"secret_key.*="
"PRIVATE_KEY.*="
)
FOUND_KEYS=0
for pattern in "${PRIVATE_KEY_PATTERNS[@]}"; do
if grep -r "$pattern" "$REPO_ROOT" --include="*.py" --include="*.js" --include="*.sh" 2>/dev/null | grep -v "docs/adr" | grep -v ".gitignore" | head -1; then
FOUND_KEYS=$((FOUND_KEYS+1))
fi
done
if [ $FOUND_KEYS -gt 0 ]; then
echo " β Found private key patterns in code"
ERRORS=$((ERRORS+1))
else
echo " β No private key patterns found"
fi
# Check .gitignore
echo "[*] Checking .gitignore for private key protection..."
REQUIRED_IGNORES=(
"sovereign/.node_sk"
"*.pem"
"*.key"
)
for pattern in "${REQUIRED_IGNORES[@]}"; do
if grep -q "^$pattern$" "$REPO_ROOT/.gitignore" 2>/dev/null; then
echo " β $pattern in .gitignore"
else
echo " β $pattern not in .gitignore (may be intentional)"
fi
done
echo ""
if [ $ERRORS -eq 0 ]; then
echo "=== VALIDATION PASSED ==="
echo "All ADRs are valid and consistent"
exit 0
else
echo "=== VALIDATION FAILED ==="
echo "$ERRORS errors found"
exit 1
fi
|