From 6eb78e1e6970856c1e9458697da89d46fabe3113 Mon Sep 17 00:00:00 2001
From: TevinClaw <510129976@qq.com>
Date: Tue, 17 Mar 2026 15:04:02 +0800
Subject: [PATCH] [HUMAN] agent.md 细节微调

---
 workspace/skills/memory-md-hot/scripts/daily_maintenance.py |  329 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 329 insertions(+), 0 deletions(-)

diff --git a/workspace/skills/memory-md-hot/scripts/daily_maintenance.py b/workspace/skills/memory-md-hot/scripts/daily_maintenance.py
new file mode 100755
index 0000000..673258a
--- /dev/null
+++ b/workspace/skills/memory-md-hot/scripts/daily_maintenance.py
@@ -0,0 +1,329 @@
+#!/usr/bin/env python3
+"""
+memory-md-hot 每日维护脚本
+维护 memory.md 文件的事件流水和重要事件
+保留所有历史记录,需配合 memory-md-archive 技能归档
+"""
+
+import os
+import re
+import sys
+from datetime import datetime
+from pathlib import Path
+
+# 配置
+MEMORY_FILE = Path.home() / ".openclaw" / "workspace" / "MEMORY.md"
+ARCHIVE_THRESHOLD_KB = 50  # 建议归档的阈值(仅提示,不强制)
+
+
+def read_memory_file():
+    """读取 memory.md 文件内容"""
+    if not MEMORY_FILE.exists():
+        return ""
+    return MEMORY_FILE.read_text(encoding='utf-8')
+
+
+def write_memory_file(content):
+    """写入 memory.md 文件"""
+    MEMORY_FILE.parent.mkdir(parents=True, exist_ok=True)
+    MEMORY_FILE.write_text(content, encoding='utf-8')
+
+
+def get_file_size():
+    """获取文件大小(字节)"""
+    if not MEMORY_FILE.exists():
+        return 0
+    return MEMORY_FILE.stat().st_size
+
+
+def parse_date_from_line(line):
+    """从行中提取日期(YYYY-MM-DD 格式)"""
+    match = re.search(r'(\d{4}-\d{2}-\d{2})', line)
+    if match:
+        try:
+            return datetime.strptime(match.group(1), '%Y-%m-%d').date()
+        except ValueError:
+            return None
+    return None
+
+
+def extract_event_entries(content):
+    """
+    从内容中提取事件条目
+    返回: (important_events, daily_events) 元组
+    """
+    important_events = []
+    daily_events = []
+    
+    lines = content.split('\n')
+    in_important = False
+    in_daily = False
+    
+    for line in lines:
+        stripped = line.strip()
+        
+        # 检测区块
+        if '重要事件' in stripped and stripped.startswith('#'):
+            in_important = True
+            in_daily = False
+            continue
+        elif ('事件流水' in stripped) and stripped.startswith('#'):
+            in_important = False
+            in_daily = True
+            continue
+        elif stripped.startswith('#') and in_important:
+            in_important = False
+        elif stripped.startswith('#') and in_daily:
+            in_daily = False
+            
+        # 收集事件
+        if in_important and stripped.startswith('-'):
+            if len(stripped) > 10:  # 过滤空行和短行
+                important_events.append(line)
+        elif in_daily and (stripped.startswith('-') or stripped.startswith('*')):
+            daily_events.append(line)
+    
+    return important_events, daily_events
+
+
+def generate_default_content():
+    """生成默认的 memory.md 内容"""
+    today = datetime.now().strftime('%Y-%m-%d')
+    return f"""# MEMORY.md - 热记忆 / 活跃记忆
+
+> 本文件记录近期发生的重要事情,详细信息可通过记忆检索获取。
+
+---
+
+## 🔔 重要事件
+
+> 记录具有全局长期性影响的重要决策和事件。
+> 添加重要事件时会告知用户。
+
+<!-- 重要事件在此添加 -->
+
+---
+
+## 📅 事件流水
+
+> 按天分组,每天主要事情的概要。
+> 所有记录永久保留,可使用 memory-md-archive 技能归档瘦身。
+
+### {{today}}
+
+- {today} 10:00 | memory.md 初始化 | 热记忆系统
+
+---
+
+*文件大小: ~0.5KB | 事件数: 1*
+*维护脚本: `memory-md-hot/scripts/daily_maintenance.py`*
+*归档提示: 文件较大时请使用 memory-md-archive 技能归档*
+""".format(today=today)
+
+
+def update_memory_file(new_daily_events=None, important_event=None):
+    """
+    更新 memory.md 文件
+    【限制:只修改"重要事件"和"最近7天事件流水"区块,其他内容保持不变】
+    
+    Args:
+        new_daily_events: 新的每日事件列表 [(date, time, summary, keywords), ...]
+        important_event: 重要事件元组 (date, time, summary, keywords) 或 None
+    
+    Returns:
+        dict: 操作结果
+    """
+    result = {
+        'success': True,
+        'added_daily': 0,
+        'added_important': False,
+        'current_size_kb': 0,
+        'total_events': 0,
+        'archive_suggested': False,
+        'messages': []
+    }
+    
+    # 读取现有内容
+    content = read_memory_file()
+    if not content:
+        content = generate_default_content()
+    
+    # 提取现有事件
+    existing_important, existing_daily = extract_event_entries(content)
+    
+    # 保留所有现有日常事件(不再移除旧记录)
+    all_daily = list(existing_daily)
+    
+    # 添加新的日常事件
+    if new_daily_events:
+        for event in new_daily_events:
+            date, time, summary, keywords = event
+            entry = f"- {date} {time} | {summary} | {keywords}"
+            # 检查是否已存在
+            if not any(entry.strip() in existing.strip() for existing in all_daily):
+                all_daily.append(entry)
+                result['added_daily'] += 1
+    
+    # 添加重要事件
+    new_important = list(existing_important)
+    if important_event:
+        date, time, summary, keywords = important_event
+        entry = f"- {date} {time} | {summary} | {keywords}"
+        new_important.append(entry)
+        result['added_important'] = True
+        result['messages'].append(f"重要事件已记录: {summary}")
+    
+    # 重新构建文件内容 - 只修改指定区块,保留其他内容
+    today = datetime.now().strftime('%Y-%m-%d')
+    
+    # 按日期分组日常事件
+    daily_by_date = {}
+    for line in all_daily:
+        date = parse_date_from_line(line)
+        if date:
+            date_str = date.strftime('%Y-%m-%d')
+            if date_str not in daily_by_date:
+                daily_by_date[date_str] = []
+            daily_by_date[date_str].append(line)
+    
+    # 构建日常事件区块内容
+    daily_sections = []
+    for date_str in sorted(daily_by_date.keys(), reverse=True):
+        daily_sections.append(f"\n### {date_str}\n")
+        daily_sections.extend([f"{line}\n" for line in daily_by_date[date_str]])
+    
+    daily_content = ''.join(daily_sections) if daily_sections else f"\n### {today}\n\n- {today} --:-- | 暂无记录 | --\n"
+    
+    # 构建重要事件区块内容
+    important_content = '\n'.join(new_important) if new_important else "<!-- 重要事件在此添加 -->"
+    
+    # 计算统计
+    total_events = len(all_daily) + len(new_important)
+    result['total_events'] = total_events
+    
+    # 【关键】使用正则替换只修改指定区块,保留其他所有内容
+    new_content = content
+    
+    # 替换重要事件区块(## 🔔 重要事件 和 ## 📅 事件流水 之间)
+    important_pattern = r'(## 🔔 重要事件\n\n> 记录具有全局长期性影响的重要决策和事件。\n> 添加重要事件时会告知用户。\n\n)(.*?)(\n---\n\n## 📅 事件流水)'
+    important_replacement = r'\1' + important_content + r'\3'
+    new_content = re.sub(important_pattern, important_replacement, new_content, flags=re.DOTALL)
+    
+    # 替换事件流水区块(## 📅 事件流水 和下一个 ## 或文件末尾之间)
+    # 找到事件流水区块的结束位置(下一个 ## 标题或文件末尾的 ---)
+    daily_pattern = r'(## 📅 最近7天事件流水\n\n> 按天分组,每天主要事情的概要。\n> 自动维护,8天前的记录会被移除。)(.*?)(\n---\n\n## 📚 学习事件|\n---\n\n\*文件大小:)'
+    
+    # 检查是否有学习事件区块
+    if '## 📚 学习事件' in new_content:
+        daily_replacement = r'\1' + daily_content + r'\3'
+        new_content = re.sub(daily_pattern, daily_replacement, new_content, flags=re.DOTALL)
+    else:
+        # 没有学习事件区块,替换到文件末尾
+        daily_pattern_simple = r'(## 📅 最近7天事件流水\n\n> 按天分组,每天主要事情的概要。\n> 自动维护,8天前的记录会被移除。)(.*?)(\n---\n\n\*文件大小:)'
+        daily_replacement = r'\1' + daily_content + r'\3'
+        new_content = re.sub(daily_pattern_simple, daily_replacement, new_content, flags=re.DOTALL)
+    
+    # 写入文件
+    write_memory_file(new_content)
+    
+    # 检查是否需要建议归档
+    new_size = get_file_size()
+    result['current_size_kb'] = round(new_size / 1024, 2)
+    
+    if result['current_size_kb'] > ARCHIVE_THRESHOLD_KB:
+        result['archive_suggested'] = True
+        result['messages'].append(f"提示: 文件大小 ({result['current_size_kb']}KB) 超过 {ARCHIVE_THRESHOLD_KB}KB,建议使用 memory-md-archive 技能归档")
+    
+    return result
+
+
+def get_stats():
+    """获取文件统计信息"""
+    content = read_memory_file()
+    if not content:
+        return {
+            'size_bytes': 0,
+            'size_kb': 0,
+            'total_events': 0,
+            'important_events': 0,
+            'daily_events': 0,
+            'archive_suggested': False
+        }
+    
+    important, daily = extract_event_entries(content)
+    size = get_file_size()
+    size_kb = round(size / 1024, 2)
+    
+    return {
+        'size_bytes': size,
+        'size_kb': size_kb,
+        'total_events': len(important) + len(daily),
+        'important_events': len(important),
+        'daily_events': len(daily),
+        'archive_suggested': size_kb > ARCHIVE_THRESHOLD_KB
+    }
+
+
+def main():
+    """主函数 - 供命令行调用"""
+    if len(sys.argv) < 2:
+        print("用法: python daily_maintenance.py <command> [args]")
+        print("")
+        print("命令:")
+        print("  update                     - 执行每日更新")
+        print("  stats                      - 查看文件统计")
+        print("  add-daily <date> <time> <summary> <keywords>")
+        print("                             - 添加日常事件")
+        print("  add-important <date> <time> <summary> <keywords>")
+        print("                             - 添加重要事件")
+        print("")
+        print("示例:")
+        print('  python daily_maintenance.py add-daily 2026-03-16 "10:30" "测试脚本" "开发,测试"')
+        sys.exit(1)
+    
+    command = sys.argv[1]
+    
+    if command == "update":
+        result = update_memory_file()
+        print(f"更新完成:")
+        print(f"  - 添加日常事件: {result['added_daily']}")
+        print(f"  - 添加重要事件: {'是' if result['added_important'] else '否'}")
+        print(f"  - 当前大小: {result['current_size_kb']}KB")
+        print(f"  - 总事件数: {result['total_events']}")
+        for msg in result['messages']:
+            print(f"  - {msg}")
+    
+    elif command == "stats":
+        stats = get_stats()
+        print(f"文件统计:")
+        print(f"  - 文件大小: {stats['size_kb']}KB ({stats['size_bytes']} 字节)")
+        print(f"  - 总事件数: {stats['total_events']}")
+        print(f"  - 重要事件: {stats['important_events']}")
+        print(f"  - 日常事件: {stats['daily_events']}")
+        if stats['archive_suggested']:
+            print(f"  - 归档建议: 文件较大,建议使用 memory-md-archive 技能归档")
+        else:
+            print(f"  - 归档建议: 暂无需要")
+    
+    elif command == "add-daily" and len(sys.argv) >= 6:
+        event = (sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5])
+        result = update_memory_file(new_daily_events=[event])
+        print(f"已添加日常事件: {event}")
+        if result['archive_suggested']:
+            print(f"提示: 文件大小 {result['current_size_kb']}KB,建议归档")
+    
+    elif command == "add-important" and len(sys.argv) >= 6:
+        event = (sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5])
+        result = update_memory_file(important_event=event)
+        print(f"已添加重要事件: {event}")
+        print(f"ℹ️ 请知悉用户: 已记录重要事件 '{sys.argv[4]}'")
+        if result['archive_suggested']:
+            print(f"提示: 文件大小 {result['current_size_kb']}KB,建议归档")
+    
+    else:
+        print(f"未知命令或参数不足: {command}")
+        sys.exit(1)
+
+
+if __name__ == "__main__":
+    main()

--
Gitblit v1.9.1