/ .githooks / pre-commit
pre-commit
 1  #!/bin/bash
 2  # SPDX-License-Identifier: AGPL-3.0-or-later
 3  # SPDX-FileCopyrightText: 2025 hyperpolymath
 4  #
 5  # Pre-commit hook to enforce Hyperpolymath Language Policy
 6  # Blocks: TypeScript, Python, Go, npm/package.json
 7  
 8  set -e
 9  
10  RED='\033[0;31m'
11  GREEN='\033[0;32m'
12  YELLOW='\033[1;33m'
13  NC='\033[0m'
14  
15  echo -e "${YELLOW}Checking Hyperpolymath Language Policy...${NC}"
16  
17  STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM)
18  VIOLATIONS=0
19  
20  for file in $STAGED_FILES; do
21      if [[ "$file" =~ \.tsx?$ ]] && [[ ! "$file" =~ \.d\.ts$ ]]; then
22          echo -e "${RED}BLOCKED: TypeScript file: $file${NC}"
23          echo "  -> Use ReScript (.res) instead"
24          VIOLATIONS=$((VIOLATIONS + 1))
25      fi
26      if [[ "$file" =~ \.py$ ]] && [[ ! "$file" =~ (salt|pillar|grain|state|sls) ]]; then
27          echo -e "${RED}BLOCKED: Python file: $file${NC}"
28          echo "  -> Python only allowed for SaltStack"
29          VIOLATIONS=$((VIOLATIONS + 1))
30      fi
31      if [[ "$file" =~ \.go$ ]]; then
32          echo -e "${RED}BLOCKED: Go file: $file${NC}"
33          echo "  -> Use Rust instead"
34          VIOLATIONS=$((VIOLATIONS + 1))
35      fi
36      if [[ "$file" == "package.json" ]] || [[ "$file" =~ /package\.json$ ]]; then
37          echo -e "${RED}BLOCKED: package.json: $file${NC}"
38          echo "  -> Use deno.json instead"
39          VIOLATIONS=$((VIOLATIONS + 1))
40      fi
41  done
42  
43  if [ $VIOLATIONS -gt 0 ]; then
44      echo -e "${RED}COMMIT BLOCKED: $VIOLATIONS violation(s)${NC}"
45      exit 1
46  fi
47  echo -e "${GREEN}Language policy check passed${NC}"