From 15cb154a19cabb5c3c66491a61f215ef104d5280 Mon Sep 17 00:00:00 2001
From: TevinClaw <510129976@qq.com>
Date: Sat, 14 Mar 2026 13:03:06 +0800
Subject: [PATCH] feat(早报): 增加昨日总结模块

---
 workspace/skills/memory-management/scripts/weekly_maintenance.py |  207 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 207 insertions(+), 0 deletions(-)

diff --git a/workspace/skills/memory-management/scripts/weekly_maintenance.py b/workspace/skills/memory-management/scripts/weekly_maintenance.py
new file mode 100755
index 0000000..e4cee14
--- /dev/null
+++ b/workspace/skills/memory-management/scripts/weekly_maintenance.py
@@ -0,0 +1,207 @@
+#!/usr/bin/env python3
+"""
+每周维护脚本
+周一早上9:30执行,负责:
+1. 运行memory-merger整理L2→L1
+2. 检查L0大小
+3. 生成周报
+4. 发送报告(可选)
+"""
+
+import os
+import sys
+import subprocess
+from datetime import datetime, timedelta
+from pathlib import Path
+
+
+def get_workspace_path() -> Path:
+    """获取workspace路径。"""
+    return Path.home() / ".openclaw" / "workspace"
+
+
+def run_memory_merger() -> tuple:
+    """运行memory-merger技能。"""
+    workspace = get_workspace_path()
+    merger_path = workspace / ".agents" / "skills" / "memory-merger"
+    
+    if not merger_path.exists():
+        return False, "memory-merger技能未安装"
+    
+    # 运行memory-merger
+    try:
+        result = subprocess.run(
+            ["python", str(merger_path / "scripts" / "merge.py"), "memory-management"],
+            capture_output=True,
+            text=True,
+            timeout=60
+        )
+        if result.returncode == 0:
+            return True, result.stdout
+        else:
+            return False, result.stderr
+    except Exception as e:
+        return False, str(e)
+
+
+def check_l0_size() -> dict:
+    """检查L0状态。"""
+    workspace = get_workspace_path()
+    memory_file = workspace / "MEMORY.md"
+    
+    if not memory_file.exists():
+        return {"exists": False, "size": 0, "status": "missing"}
+    
+    size = memory_file.stat().st_size
+    kb = size / 1024
+    
+    if size > 4096:
+        status = "over_limit"
+    elif size > 3500:
+        status = "warning"
+    else:
+        status = "ok"
+    
+    return {
+        "exists": True,
+        "size": size,
+        "size_kb": kb,
+        "status": status
+    }
+
+
+def count_journal_files() -> int:
+    """统计本周L2文件数量。"""
+    workspace = get_workspace_path()
+    journal_dir = workspace / "memory" / "journal"
+    
+    if not journal_dir.exists():
+        return 0
+    
+    # 获取本周日期范围
+    today = datetime.now()
+    start_of_week = today - timedelta(days=today.weekday())
+    
+    count = 0
+    for f in journal_dir.glob("*.md"):
+        try:
+            file_date = datetime.strptime(f.stem, "%Y-%m-%d")
+            if start_of_week <= file_date <= today:
+                count += 1
+        except ValueError:
+            continue
+    
+    return count
+
+
+def count_milestone_files() -> int:
+    """统计L1里程碑文件数量。"""
+    workspace = get_workspace_path()
+    milestones_dir = workspace / "memory" / "milestones"
+    
+    if not milestones_dir.exists():
+        return 0
+    
+    return len(list(milestones_dir.glob("*.md")))
+
+
+def generate_report() -> str:
+    """生成周报内容。"""
+    today_str = datetime.now().strftime("%Y-%m-%d")
+    week_start = (datetime.now() - timedelta(days=datetime.now().weekday())).strftime("%Y-%m-%d")
+    
+    report = []
+    report.append("# 📊 记忆管理周报")
+    report.append(f"**周期**: {week_start} ~ {today_str}")
+    report.append(f"**生成时间**: {datetime.now().strftime('%Y-%m-%d %H:%M')}")
+    report.append("")
+    report.append("---")
+    report.append("")
+    
+    # L0状态
+    l0_status = check_l0_size()
+    report.append("## 📋 L0层 (MEMORY.md)")
+    if l0_status["exists"]:
+        report.append(f"- **大小**: {l0_status['size_kb']:.1f}KB / 4KB")
+        if l0_status["status"] == "ok":
+            report.append("- **状态**: ✅ 正常")
+        elif l0_status["status"] == "warning":
+            report.append("- **状态**: ⚠️ 接近限制,建议归档")
+        else:
+            report.append("- **状态**: 🚨 超过红线,需要立即归档")
+    else:
+        report.append("- **状态**: ❌ 文件不存在")
+    report.append("")
+    
+    # L2统计
+    journal_count = count_journal_files()
+    report.append("## 📝 L2层 (Journal)")
+    report.append(f"- **本周新增**: {journal_count} 条记录")
+    report.append("")
+    
+    # L1统计
+    milestone_count = count_milestone_files()
+    report.append("## 🗂️ L1层 (Milestones)")
+    report.append(f"- **里程碑总数**: {milestone_count} 个主题")
+    report.append("")
+    
+    # 维护任务
+    report.append("## 🔧 本周维护任务")
+    
+    # 尝试运行memory-merger
+    success, output = run_memory_merger()
+    if success:
+        report.append("- ✅ L2→L1合并完成")
+        if output.strip():
+            report.append(f"- 📄 合并详情:\n```\n{output}\n```")
+    else:
+        report.append(f"- ❌ L2→L1合并失败: {output}")
+    
+    if l0_status["status"] in ["warning", "over_limit"]:
+        report.append("- ⚠️ L0层需要归档整理")
+    
+    report.append("")
+    report.append("---")
+    report.append("")
+    report.append("*由memory-management技能自动生成*")
+    
+    return "\n".join(report)
+
+
+def main():
+    """主函数。"""
+    import argparse
+    parser = argparse.ArgumentParser(description="三层记忆每周维护")
+    parser.add_argument("--send-report", action="store_true", help="发送报告到飞书")
+    parser.add_argument("--output", type=str, help="报告输出文件路径")
+    args = parser.parse_args()
+    
+    print("🔄 开始执行每周维护...")
+    print("=" * 50)
+    
+    # 生成报告
+    report = generate_report()
+    
+    # 输出到文件
+    if args.output:
+        with open(args.output, 'w', encoding='utf-8') as f:
+            f.write(report)
+        print(f"✅ 报告已保存到: {args.output}")
+    
+    # 打印报告
+    print("\n" + report)
+    
+    # 发送到飞书(如果需要)
+    if args.send_report:
+        print("\n📤 发送到飞书...")
+        # 这里会调用message工具,但在脚本中我们通过stdout返回
+        print(report)
+    
+    print("\n" + "=" * 50)
+    print("✅ 每周维护完成")
+    
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main())

--
Gitblit v1.9.1