beadboard/.agents/skills/rlm-mem/bootstrap.py

170 lines
5.4 KiB
Python

#!/usr/bin/env python3
"""
RLM-MEM Bootstrap Script
Automates skill-local setup and verification of the memory system for a fresh agent.
Usage:
python bootstrap.py
What this does:
1. Validates Python/runtime prerequisites
2. Runs verification against the vendored skill runtime
3. Prints skill-local usage instructions
"""
import argparse
import os
import subprocess
import sys
from pathlib import Path
def run_command(cmd, cwd=None):
"""Run a shell command and print output."""
print(f"Running: {cmd}")
result = subprocess.run(
cmd, shell=True, check=False, cwd=cwd,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True
)
if result.returncode != 0:
print(f"Error running command: {result.stdout}")
return False
return True
def check_python_version():
"""Ensure Python 3.11+."""
if sys.version_info < (3, 11):
print("Error: Python 3.11+ required.")
return False
return True
def validate_skill_runtime(skill_dir: Path):
"""Validate required vendored runtime exists in the skill folder."""
required = [
skill_dir / "brain" / "scripts" / "__init__.py",
skill_dir / "brain" / "scripts" / "layered_memory_store.py",
skill_dir / "souls" / "linus_soul.md",
skill_dir / "ACTIVE_SOUL.md",
skill_dir / "scripts" / "manage_soul.py",
skill_dir / "scripts" / "manage_user.py",
]
missing = [p for p in required if not p.exists()]
if missing:
print("Error: Missing required skill runtime files:")
for path in missing:
print(f" - {path}")
return False
return True
def verify_installation(skill_dir: Path):
"""Run verification against skill-local runtime without repo-level install."""
print("Verifying skill-local runtime...")
# Create a temporary verification script
verify_script = """
import sys
from pathlib import Path
try:
from brain.scripts import LayeredMemoryStore, LayeredChunkStoreAdapter, MemoryPolicy, RememberOperation
print("Imports successful.")
policy = MemoryPolicy(project_root=Path.cwd())
store = LayeredMemoryStore(policy=policy, agent_id="bootstrap-verify")
adapter = LayeredChunkStoreAdapter(store)
remember = RememberOperation(adapter)
res = remember.remember("Bootstrap verification", "bootstrap", tags=["setup"])
if res['success']:
print("Memory write successful.")
else:
sys.exit(1)
except Exception as e:
print(f"Verification failed: {e}")
sys.exit(1)
"""
verify_path = skill_dir / "verify_bootstrap.py"
verify_path.write_text(verify_script, encoding="utf-8")
env = os.environ.copy()
env["PYTHONPATH"] = str(skill_dir)
cmd = [sys.executable, "verify_bootstrap.py"]
result = subprocess.run(
cmd,
cwd=skill_dir,
env=env,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True,
)
if result.returncode != 0:
print(f"Error running verification: {result.stdout}")
verify_path.unlink(missing_ok=True)
return False
success = True
if success:
print("Verification passed (skill-local runtime).")
verify_path.unlink(missing_ok=True)
return success
def update_agents_md(target_dir: Path):
"""Add blurb to AGENTS.md."""
agents_md = target_dir / "AGENTS.md"
blurb = """
## 🧠 RLM-MEM Brain Protocol
This project uses the RLM-MEM RLM Memory System (layered `.agents/memory/`).
- **Usage:** Access memory via `brain.scripts` python modules.
- **CLI:** Manage memory with `python -m brain.scripts.memory_cli`.
- **Guide:** See `RLM-MEM/SKILL.md`.
- **Identity:** Controlled by `RLM-MEM/ACTIVE_SOUL.md`.
"""
if agents_md.exists():
content = agents_md.read_text(encoding="utf-8")
if "RLM-MEM Brain Protocol" not in content:
print("Updating AGENTS.md...")
with agents_md.open("a", encoding="utf-8") as f:
f.write(f"\n{blurb}\n")
else:
print("AGENTS.md already contains memory protocol.")
else:
print("Creating AGENTS.md...")
agents_md.write_text(f"# Project Agents\n{blurb}", encoding="utf-8")
return True
def main():
parser = argparse.ArgumentParser(description="Bootstrap RLM-MEM skill-local runtime")
parser.add_argument(
"--integrate-root",
action="store_true",
help="Optionally update root AGENTS.md with RLM-MEM protocol blurb.",
)
args = parser.parse_args()
print("=== RLM-MEM Bootstrap ===")
skill_dir = Path(__file__).parent.resolve()
# RLM-MEM is expected at repo root.
project_root = skill_dir.parent
if not check_python_version():
sys.exit(1)
if not validate_skill_runtime(skill_dir):
print("Failed runtime validation.")
sys.exit(1)
if not verify_installation(skill_dir):
print("Verification failed.")
sys.exit(1)
if args.integrate_root:
update_agents_md(project_root)
else:
print("Skipping AGENTS.md integration (use --integrate-root to enable).")
print("\n=== Bootstrap Complete ===")
print("The skill-local memory system is ready.")
print("Use this from the skill directory:")
print(" python -m brain.scripts.memory_cli")
if __name__ == "__main__":
main()