custom
code
sovereign-compute
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