Spaces:
Paused
Paused
| #!/usr/bin/env python3 | |
| """Repository-wide naming audit (ADR-0001). | |
| Fails if forbidden/legacy product names appear, or if the canonical strings are | |
| missing from key files. PathRAG is allowed (algorithm name). | |
| """ | |
| from __future__ import annotations | |
| import re | |
| import sys | |
| from pathlib import Path | |
| ROOT = Path(__file__).resolve().parent.parent | |
| # Legacy / off-brand product names that must never appear. | |
| FORBIDDEN = [ | |
| r"\bVoiceRAG\b", | |
| r"\bAuralynx\b", | |
| r"\bAuraLynq\b", # wrong casing | |
| r"\bAurLynq\b", | |
| r"\bTalkRAG\b", | |
| ] | |
| # Directories/files to skip. | |
| SKIP_DIRS = { | |
| ".git", | |
| ".venv", | |
| "venv", | |
| "node_modules", | |
| ".next", | |
| "__pycache__", | |
| ".mypy_cache", | |
| ".ruff_cache", | |
| ".pytest_cache", | |
| "data", | |
| "models", | |
| "reports", | |
| } | |
| TEXT_EXT = { | |
| ".py", | |
| ".md", | |
| ".toml", | |
| ".yml", | |
| ".yaml", | |
| ".sh", | |
| ".ts", | |
| ".tsx", | |
| ".js", | |
| ".json", | |
| ".txt", | |
| ".cfg", | |
| ".ini", | |
| ".env", | |
| ".example", | |
| ".Dockerfile", | |
| } | |
| def iter_files(): | |
| for p in ROOT.rglob("*"): | |
| if any(part in SKIP_DIRS for part in p.parts): | |
| continue | |
| if p.is_file() and (p.suffix in TEXT_EXT or p.name.endswith("Dockerfile")): | |
| yield p | |
| def main() -> int: | |
| violations: list[str] = [] | |
| patterns = [re.compile(p) for p in FORBIDDEN] | |
| for path in iter_files(): | |
| if path.name == "name_audit.py": | |
| continue | |
| try: | |
| text = path.read_text(encoding="utf-8") | |
| except (UnicodeDecodeError, OSError): | |
| continue | |
| for pat in patterns: | |
| for m in pat.finditer(text): | |
| line = text[: m.start()].count("\n") + 1 | |
| violations.append(f"{path.relative_to(ROOT)}:{line}: forbidden name '{m.group()}'") | |
| # Canonical presence checks. | |
| required = { | |
| "pyproject.toml": ['name = "auralynq"'], | |
| "README.md": ["Auralynq", "Talk to Your Data"], | |
| } | |
| for rel, needles in required.items(): | |
| fp = ROOT / rel | |
| if not fp.exists(): | |
| violations.append(f"{rel}: missing (expected canonical naming)") | |
| continue | |
| content = fp.read_text(encoding="utf-8") | |
| for n in needles: | |
| if n not in content: | |
| violations.append(f"{rel}: missing required string {n!r}") | |
| if violations: | |
| print("✗ Name audit FAILED:") | |
| for v in violations: | |
| print(f" - {v}") | |
| return 1 | |
| print("✓ Name audit passed: Auralynq naming is consistent.") | |
| return 0 | |
| if __name__ == "__main__": | |
| sys.exit(main()) | |