78 lines
2.0 KiB
Python
78 lines
2.0 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Architecture Linter — Sovereignty Enforcement
|
|
Scans the codebase for banned providers, models, and API keys.
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import re
|
|
|
|
BANNED_STRINGS = [
|
|
r'anthropic',
|
|
r'claude',
|
|
r'api\.anthropic\.com',
|
|
r'ANTHROPIC_API_KEY',
|
|
r'claude-opus',
|
|
r'claude-sonnet',
|
|
r'claude-haiku'
|
|
]
|
|
|
|
EXCEPTIONS = [
|
|
'BANNED_PROVIDERS.md',
|
|
'architecture_linter.py',
|
|
'training/',
|
|
'evaluations/',
|
|
'RELEASE_',
|
|
'metrics_helpers.py'
|
|
]
|
|
|
|
def is_exception(path):
|
|
for exc in EXCEPTIONS:
|
|
if exc in path:
|
|
return True
|
|
return False
|
|
|
|
def check_file(path):
|
|
violations = []
|
|
try:
|
|
with open(path, 'r', encoding='utf-8', errors='ignore') as f:
|
|
for i, line in enumerate(f, 1):
|
|
for pattern in BANNED_STRINGS:
|
|
if re.search(pattern, line, re.IGNORECASE):
|
|
violations.append((i, line.strip(), pattern))
|
|
except Exception as e:
|
|
print(f"Error reading {path}: {e}")
|
|
return violations
|
|
|
|
def main():
|
|
print("--- Sovereignty Enforcement: Architecture Linter ---")
|
|
total_violations = 0
|
|
|
|
for root, dirs, files in os.walk('.'):
|
|
# Skip .git
|
|
if '.git' in dirs:
|
|
dirs.remove('.git')
|
|
|
|
for file in files:
|
|
path = os.path.join(root, file)
|
|
if is_exception(path):
|
|
continue
|
|
|
|
violations = check_file(path)
|
|
if violations:
|
|
print(f"\n[VIOLATION] {path}:")
|
|
for line_num, content, pattern in violations:
|
|
print(f" Line {line_num}: Found '{pattern}' -> {content}")
|
|
total_violations += 1
|
|
|
|
if total_violations > 0:
|
|
print(f"\nFAILED: Found {total_violations} sovereignty violations.")
|
|
sys.exit(1)
|
|
else:
|
|
print("\nPASSED: No banned providers detected.")
|
|
sys.exit(0)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|