| """Rivet Context Loader — loads architecture + audit into every session. |
| |
| The key innovation: Rivet starts every conversation KNOWING the system. |
| Not learning it from the user. Not guessing from file names. KNOWING. |
| """ |
|
|
| import json |
| from pathlib import Path |
| from dataclasses import dataclass |
|
|
|
|
| CONTEXT_DIR = Path("/Users/margaret/project-rivet/context") |
|
|
|
|
| @dataclass |
| class RivetContext: |
| architecture: str |
| audit_findings: str |
| schema_snapshot: str = "" |
| recent_git: str = "" |
|
|
| def to_system_context(self) -> str: |
| """Format as a system context block for the model.""" |
| parts = [ |
| "# SYSTEM CONTEXT — Multiverse Campus Architecture\n", |
| "You have the following information loaded. Reference it when answering.\n", |
| "## Architecture Map\n", |
| self.architecture, |
| "\n## Known Issues (Nexus Security Audit, 2026-07-10)\n", |
| self.audit_findings, |
| ] |
| if self.schema_snapshot: |
| parts.extend(["\n## Database Schema (key tables)\n", self.schema_snapshot]) |
| if self.recent_git: |
| parts.extend(["\n## Recent Changes (last 7 days)\n", self.recent_git]) |
| return "\n".join(parts) |
|
|
| @property |
| def token_estimate(self) -> int: |
| """Rough token estimate (4 chars per token).""" |
| total = len(self.architecture) + len(self.audit_findings) |
| total += len(self.schema_snapshot) + len(self.recent_git) |
| return total // 4 |
|
|
|
|
| def load_context(context_dir: Path = CONTEXT_DIR) -> RivetContext: |
| """Load all context files from the Rivet context directory.""" |
| arch_path = context_dir / "architecture_map.md" |
| audit_path = context_dir / "audit_findings.md" |
| schema_path = context_dir / "schema_snapshot.sql" |
| git_path = context_dir / "recent_git.txt" |
|
|
| architecture = arch_path.read_text() if arch_path.exists() else "Architecture map not loaded." |
| audit = audit_path.read_text() if audit_path.exists() else "Audit findings not loaded." |
| schema = schema_path.read_text() if schema_path.exists() else "" |
| git_log = git_path.read_text() if git_path.exists() else "" |
|
|
| return RivetContext( |
| architecture=architecture, |
| audit_findings=audit, |
| schema_snapshot=schema, |
| recent_git=git_log, |
| ) |
|
|
|
|
| def refresh_git_log(repo_path: str, context_dir: Path = CONTEXT_DIR): |
| """Refresh the recent git log from the campus repo.""" |
| import subprocess |
| try: |
| result = subprocess.run( |
| ["git", "log", "--oneline", "--since=7 days ago", "-20"], |
| cwd=repo_path, capture_output=True, text=True, timeout=10 |
| ) |
| if result.returncode == 0: |
| (context_dir / "recent_git.txt").write_text(result.stdout) |
| except (subprocess.TimeoutExpired, FileNotFoundError): |
| pass |
|
|
|
|
| if __name__ == "__main__": |
| ctx = load_context() |
| print(f"Context loaded:") |
| print(f" Architecture: {len(ctx.architecture)} chars") |
| print(f" Audit: {len(ctx.audit_findings)} chars") |
| print(f" Schema: {len(ctx.schema_snapshot)} chars") |
| print(f" Git: {len(ctx.recent_git)} chars") |
| print(f" Estimated tokens: ~{ctx.token_estimate}") |
| print(f"\nFirst 200 chars of system context:") |
| print(ctx.to_system_context()[:200]) |
|
|