""" Site Evolution Log — tracks all improvements made by evolution agents. Appended to by sub-agents, displayed on NOC dashboard. """ import json, os from datetime import datetime from pathlib import Path LOG_PATH = Path(os.path.expanduser("~/auto-publisher/core/evolution_log.json")) def log_evolution(vertical: str, agent: str, feature: str, details: str, status: str = "completed"): """Record an evolution event.""" log = [] if LOG_PATH.exists(): log = json.loads(LOG_PATH.read_text()) log.append({ "vertical": vertical, "agent": agent, "feature": feature, "details": details[:500], "status": status, "timestamp": datetime.now().isoformat(), }) # Keep last 200 entries log = log[-200:] LOG_PATH.write_text(json.dumps(log, indent=2)) def get_recent_evolutions(limit: int = 20) -> list[dict]: """Get recent evolution events.""" if not LOG_PATH.exists(): return [] log = json.loads(LOG_PATH.read_text()) return sorted(log, key=lambda x: x["timestamp"], reverse=True)[:limit] def get_evolution_stats() -> dict: """Aggregate evolution statistics.""" if not LOG_PATH.exists(): return {"total": 0, "by_vertical": {}, "recent": []} log = json.loads(LOG_PATH.read_text()) by_v = {} for entry in log: v = entry["vertical"] by_v[v] = by_v.get(v, 0) + 1 return { "total": len(log), "by_vertical": by_v, "latest": log[-1]["timestamp"][:19] if log else None, "recent": [e["feature"] for e in log[-5:]], } if __name__ == "__main__": import argparse ap = argparse.ArgumentParser() ap.add_argument("--log", action="store_true") ap.add_argument("--vertical", type=str, default="all") ap.add_argument("--feature", type=str, default="test") ap.add_argument("--details", type=str, default="") ap.add_argument("--agent", type=str, default="manual") ap.add_argument("--status", type=str, default="completed") args = ap.parse_args() if args.log: log_evolution(args.vertical, args.agent, args.feature, args.details, args.status) print(f"Logged: {args.vertical} — {args.feature}") else: stats = get_evolution_stats() print(json.dumps(stats, indent=2))