| workspace/MEMORY.md | ●●●●● patch | view | raw | blame | history | |
| workspace/skills/memory-md-hot/scripts/daily_maintenance.py | ●●●●● patch | view | raw | blame | history | |
| workspace/skills/memory-md-learning/scripts/learning.py | ●●●●● patch | view | raw | blame | history |
workspace/MEMORY.md
@@ -9,10 +9,9 @@ > 记录具有全局长期性影响的重要决策和事件。 > 添加重要事件时会告知用户。 > 记录具有全局长期性影响的重要决策和事件。 > 添加重要事件时会告知用户。 > 记录具有全局长期性影响的重要决策和事件。 > 添加重要事件时会告知用户。 - 2026-03-14 --:-- | 创建AI早报定时任务(每日9点飞书发送) | 定时任务,自动化 - 2026-03-16 --:-- | 安装LanceDB-Pro向量记忆系统 | 向量数据库,RAG - 2026-03-16 --:-- | 移除三层记忆架构,采用热记忆模式 | 架构重构,记忆系统 --- @@ -25,7 +24,33 @@ - 2026-03-17 --:-- | 暂无记录 | -- ### 2026-03-16 - 2026-03-16 17:00 | 移除三层记忆架构,清理相关技能和文件 | 清理,架构 - 2026-03-16 16:00 | 创建hot-memory技能,实现热记忆模式 | 技能开发,架构 - 2026-03-16 15:00 | 安装LanceDB-Pro,配置BAAI/bge-large-zh-v1.5嵌入模型 | 配置,向量数据库 ### 2026-03-15 - 2026-03-15 14:00 | 测试qmd-wrapper.sh脚本,验证强制CPU后端 | 测试,脚本 - 2026-03-15 10:00 | 飞书渠道状态检查 | 配置检查 ### 2026-03-14 - 2026-03-14 11:00 | 安装Tavily Search技能,配置API Key | 技能安装,搜索 - 2026-03-14 10:00 | 创建AI早报定时任务,确定三分类格式 | 定时任务,自动化 --- *文件大小: ~0.6KB | 限制: 4KB* *维护脚本: `hot-memory/scripts/daily_maintenance.py`* ## 📚 学习事件 > 记录从陷阱和教训中学习的经验。 > 所有学习记录永久保留,可使用 memory-md-archive 技能归档瘦身。 - 2026-03-17 13:11 | 学习Shell特殊字符转义问题 | Shell,转义,特殊字符 --- *文件大小: ~1.5KB | 事件数: 14* *维护脚本: `memory-md-hot/scripts/daily_maintenance.py`* *归档提示: 文件较大时请使用 memory-md-archive 技能归档* workspace/skills/memory-md-hot/scripts/daily_maintenance.py
@@ -124,6 +124,7 @@ def update_memory_file(new_daily_events=None, important_event=None): """ 更新 memory.md 文件 【限制:只修改"重要事件"和"最近7天事件流水"区块,其他内容保持不变】 Args: new_daily_events: 新的每日事件列表 [(date, time, summary, keywords), ...] @@ -172,7 +173,7 @@ result['added_important'] = True result['messages'].append(f"重要事件已记录: {summary}") # 重新构建文件内容 # 重新构建文件内容 - 只修改指定区块,保留其他内容 today = datetime.now().strftime('%Y-%m-%d') # 按日期分组日常事件 @@ -185,7 +186,7 @@ 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") @@ -193,43 +194,34 @@ 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 = content 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 技能归档* """ # 替换重要事件区块(## 🔔 重要事件 和 ## 📅 事件流水 之间) 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) workspace/skills/memory-md-learning/scripts/learning.py
@@ -2,6 +2,7 @@ """ memory-md-learning 学习记录脚本 记录陷阱、教训和解决方案到长期记忆和 MEMORY.md 【限制:只修改"学习事件"区块,其他内容保持不变】 """ import os @@ -47,10 +48,10 @@ stripped = line.strip() # 检测学习事件区块 if '学习事件' in stripped and stripped.startswith('#'): if '## 📚 学习事件' in stripped: in_learning = True continue elif stripped.startswith('#') and in_learning: elif stripped.startswith('#') and in_learning and '学习事件' not in stripped: in_learning = False # 收集学习事件 @@ -119,6 +120,7 @@ def update_memory_md_learning(summary, keywords): """ 更新 MEMORY.md 的学习事件区块 【限制:只修改"学习事件"区块,其他内容保持不变】 """ content = read_memory_file() if not content: @@ -162,48 +164,58 @@ if any(new_event.strip() in existing.strip() for existing in existing_events): return {'added': False, 'message': '学习事件已存在'} # 【关键】使用正则替换只修改学习事件区块,保留其他所有内容 # 找到学习事件区块并插入新事件 lines = content.split('\n') new_lines = [] in_learning = False learning_inserted = False all_events = existing_events + [new_event] events_content = '\n'.join(all_events) for i, line in enumerate(lines): stripped = line.strip() # 替换学习事件区块内容(保留区块标题和说明) learning_pattern = r'(## 📚 学习事件\n\n> 记录从陷阱和教训中学习的经验。\n> 所有学习记录永久保留,可使用 memory-md-archive 技能归档瘦身。\n\n)(.*?)(\n---\n\n\*文件大小:)' learning_replacement = r'\1' + events_content + r'\3' new_content = re.sub(learning_pattern, learning_replacement, content, flags=re.DOTALL) # 如果正则没有匹配到(格式可能不同),使用原来的方法 if new_content == content: lines = content.split('\n') new_lines = [] in_learning = False learning_inserted = False # 检测学习事件区块开始 if '## 📚 学习事件' in stripped: in_learning = True new_lines.append(line) continue # 检测学习事件区块结束(遇到下一个标题或文件末尾信息) if in_learning and stripped.startswith('#') and '学习事件' not in stripped: if not learning_inserted: new_lines.append(new_event) learning_inserted = True in_learning = False new_lines.append(line) continue # 在学习事件区块内,跳过空行后插入新事件 if in_learning and not learning_inserted: if stripped == '' and i > 0 and '记录从陷阱' not in lines[i-1] and '所有学习记录' not in lines[i-1]: new_lines.append(new_event) new_lines.append('') learning_inserted = True for i, line in enumerate(lines): stripped = line.strip() # 检测学习事件区块开始 if '## 📚 学习事件' in stripped: in_learning = True new_lines.append(line) continue # 检测学习事件区块结束(遇到下一个标题或文件末尾信息) if in_learning and stripped.startswith('#') and '学习事件' not in stripped: if not learning_inserted: new_lines.append(new_event) learning_inserted = True in_learning = False new_lines.append(line) continue # 在学习事件区块内,跳过空行后插入新事件 if in_learning and not learning_inserted: if stripped == '' and i > 0 and '记录从陷阱' not in lines[i-1] and '所有学习记录' not in lines[i-1]: new_lines.append(new_event) new_lines.append('') learning_inserted = True continue new_lines.append(line) new_lines.append(line) # 如果在文件末尾,确保插入了事件 if in_learning and not learning_inserted: new_lines.append(new_event) # 如果在文件末尾,确保插入了事件 if in_learning and not learning_inserted: new_lines.append(new_event) new_content = '\n'.join(new_lines) # 更新文件大小信息 new_content = '\n'.join(new_lines) # 更新文件大小统计 write_memory_file(new_content) new_size = get_file_size() size_kb = round(new_size / 1024, 2) @@ -273,6 +285,13 @@ --- ## 📚 学习事件 > 记录从陷阱和教训中学习的经验。 > 所有学习记录永久保留,可使用 memory-md-archive 技能归档瘦身。 --- *文件大小: ~0.5KB | 事件数: 0* *维护脚本: `memory-md-hot/scripts/daily_maintenance.py`* *归档提示: 文件较大时请使用 memory-md-archive 技能归档*