From 0f9deaa16bfd125a55283b2750d1586606a01532 Mon Sep 17 00:00:00 2001
From: TevinClaw <510129976@qq.com>
Date: Tue, 17 Mar 2026 12:10:37 +0800
Subject: [PATCH] 新增:memory-md-hot 热记忆管理技能

---
 workspace/skills/memory-md-hot/SKILL.md                     |  191 +++++++++++++++++++++
 workspace/skills/memory-md-hot/scripts/daily_maintenance.py |  337 +++++++++++++++++++++++++++++++++++++
 2 files changed, 528 insertions(+), 0 deletions(-)

diff --git a/workspace/skills/memory-md-hot/SKILL.md b/workspace/skills/memory-md-hot/SKILL.md
new file mode 100644
index 0000000..662984f
--- /dev/null
+++ b/workspace/skills/memory-md-hot/SKILL.md
@@ -0,0 +1,191 @@
+---
+name: memory-md-hot
+description: 管理 MEMORY.md 热记忆文件,维护事件流水和重要事件记录。当需要更新 memory.md、添加日常事件或重要事件时使用。支持每日自动更新,保留所有历史记录,推荐配合 memory-md-archive 技能进行归档瘦身。
+---
+
+# memory-md-hot 技能
+
+管理 `MEMORY.md` 热记忆文件,让 agent 每次启动时被动了解最近发生的事情。
+
+## 文件定位
+
+- **目标文件**: `~/.openclaw/workspace/MEMORY.md`
+- **维护脚本**: `scripts/daily_maintenance.py`
+
+## 文件结构
+
+`MEMORY.md` 包含三个部分:
+
+1. **文件说明** - 说明本文件记录已发生的事情,详细信息可通过记忆检索获取
+2. **🔔 重要事件** - 全局长期性影响的重要决策和事件(默认空,记录时需告知用户)
+3. **📅 事件流水** - 按天分组的每日主要事情概要
+
+## 事件格式
+
+所有事件遵循统一格式:
+
+```
+- YYYY-MM-DD HH:MM | 一句话概要 | 关键词1,关键词2
+```
+
+示例:
+```
+- 2026-03-16 10:30 | 创建memory-md-hot技能 | 技能,记忆系统
+- 2026-03-16 14:00 | 配置LanceDB嵌入模型 | 配置,向量数据库
+```
+
+## 使用场景
+
+### 场景1: 每日维护(自动)
+
+每天执行一次,从记忆检索中获取当日事件,更新流水:
+
+```bash
+python3 ~/.openclaw/workspace/skills/memory-md-hot/scripts/daily_maintenance.py update
+```
+
+**功能**:
+- 扫描当日记忆,提取重要事件
+- 添加新的日常事件到对应日期分组
+- 保留所有历史记录(不再自动移除旧记录)
+- 更新文件统计信息
+
+### 场景2: 添加日常事件
+
+记录一般的日常活动:
+
+```bash
+python3 scripts/daily_maintenance.py add-daily 2026-03-16 "10:30" "测试脚本" "开发,测试"
+```
+
+或在 agent 会话中:
+
+```python
+from skills.memory_md_hot.scripts.daily_maintenance import update_memory_file
+
+# 添加单个日常事件
+event = ("2026-03-16", "10:30", "测试脚本", "开发,测试")
+result = update_memory_file(new_daily_events=[event])
+```
+
+### 场景3: 添加重要事件
+
+记录具有全局长期性影响的事件(**必须告知用户**):
+
+```bash
+python3 scripts/daily_maintenance.py add-important 2026-03-16 "14:00" "重构记忆系统" "架构,重要"
+```
+
+或在 agent 会话中:
+
+```python
+event = ("2026-03-16", "14:00", "重构记忆系统", "架构,重要")
+result = update_memory_file(important_event=event)
+
+if result['added_important']:
+    print("已记录重要事件,请告知用户")
+```
+
+### 场景4: 检查文件统计
+
+```bash
+python3 scripts/daily_maintenance.py stats
+```
+
+或在 agent 会话中:
+
+```python
+from skills.memory_md_hot.scripts.daily_maintenance import get_stats
+
+stats = get_stats()
+print(f"当前文件: {stats['size_kb']}KB, {stats['total_events']} 条事件")
+if stats['size_kb'] > 50:
+    print("建议:文件较大,可考虑使用 memory-md-archive 技能归档")
+```
+
+## 重要事件判断标准
+
+什么应该记录为重要事件:
+
+| 类型 | 示例 |
+|------|------|
+| 架构变更 | 记忆系统重构、技能体系升级 |
+| 配置变更 | API Key 更换、模型切换 |
+| 重要决策 | 采用新工作流、确立规范 |
+| 关键里程碑 | 项目完成、重要功能上线 |
+
+什么只记录为日常事件:
+
+| 类型 | 示例 |
+|------|------|
+| 常规查询 | 天气查询、网页搜索 |
+| 临时任务 | 单次文件处理、数据分析 |
+| 日常对话 | 问答、简单讨论 |
+
+## 文件归档管理
+
+本技能**保留所有历史记录**,不再自动移除旧事件。
+
+当文件增长到一定大小时,建议配合 `memory-md-archive` 技能进行归档:
+
+```bash
+# 查看文件统计
+python3 scripts/daily_maintenance.py stats
+
+# 当文件较大时,使用归档技能
+# (需先安装 memory-md-archive 技能)
+python3 ~/.openclaw/workspace/skills/memory-md-archive/scripts/archive.py
+```
+
+**归档建议**:
+- 文件超过 50KB 时建议归档
+- 可将较早的重要事件移动到归档文件
+- 日常事件可选择性归档或保留
+
+## 与其他组件的关系
+
+```
+┌─────────────────────────────────────────────────────────┐
+│  LanceDB-Pro 向量记忆                                     │
+│  - 存储所有详细记忆                                        │
+│  - 支持语义检索                                           │
+└────────────────────┬────────────────────────────────────┘
+                     │ 检索
+                     ▼
+┌─────────────────────────────────────────────────────────┐
+│  MEMORY.md 热记忆 (本技能管理)                            │
+│  - 事件流水(摘要)                                       │
+│  - 重要事件(全局影响)                                    │
+│  - 所有历史记录(需配合 archive 技能归档)                  │
+└────────────────────┬────────────────────────────────────┘
+                     │ 启动注入
+                     ▼
+┌─────────────────────────────────────────────────────────┐
+│  Agent 启动上下文                                         │
+│  - 快速了解最近发生了什么                                  │
+│  - 无需查询即可感知活跃记忆                                │
+└─────────────────────────────────────────────────────────┘
+```
+
+## 最佳实践
+
+1. **每日更新**: 建议设置定时任务每天执行 `update` 命令
+2. **即时记录**: 重要事件发生后立即记录,不要累积
+3. **简洁描述**: 一句话概要,关键词用逗号分隔
+4. **主动告知**: 添加重要事件时必须告知用户
+5. **定期归档**: 文件较大时使用 memory-md-archive 技能归档
+
+## 故障排查
+
+### 文件未更新
+- 检查脚本路径是否正确
+- 确认 `MEMORY.md` 存在且可写
+
+### 文件过大
+- 执行 `stats` 查看当前大小和事件数量
+- 安装并使用 `memory-md-archive` 技能进行归档
+- 考虑清理不再重要的日常事件
+
+### 日期解析错误
+- 确保日期格式为 `YYYY-MM-DD`
+- 时间格式建议为 `HH:MM` 或 `--:--`
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..310d2ef
--- /dev/null
+++ b/workspace/skills/memory-md-hot/scripts/daily_maintenance.py
@@ -0,0 +1,337 @@
+#!/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 文件
+    
+    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
+    
+    # 组装最终内容
+    current_size = get_file_size()
+    result['current_size_kb'] = round(current_size / 1024, 2)
+    
+    new_content = f"""# MEMORY.md - 热记忆 / 活跃记忆
+
+> 本文件记录近期发生的重要事情,详细信息可通过记忆检索获取。
+
+---
+
+## 🔔 重要事件
+
+> 记录具有全局长期性影响的重要决策和事件。
+> 添加重要事件时会告知用户。
+
+{important_content}
+
+---
+
+## 📅 事件流水
+
+> 按天分组,每天主要事情的概要。
+> 所有记录永久保留,可使用 memory-md-archive 技能归档瘦身。
+{daily_content}
+---
+
+*文件大小: ~{result['current_size_kb']:.1f}KB | 事件数: {total_events}*
+*维护脚本: `memory-md-hot/scripts/daily_maintenance.py`*
+*归档提示: 文件较大时请使用 memory-md-archive 技能归档*
+"""
+    
+    # 写入文件
+    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