Skill: ccyaolei/agent-memory-system (version 1.0.1)

--- name: agent-memory-system version: 1.0.0 description: "OpenClaw Agent 长期记忆系统 - 温度模型 + 自动归档 + 知识提炼。让 AI Agent 拥有持久记忆，自动管理冷热数据，从经验中提炼可复用技能。" author: 阿福 keywords: [memory, agent, openclaw, longterm, gc, archive, skill-extraction, temperature-model] metadata: openclaw: emoji: "🧠" features: - 温度模型（热/温/冷） - 自动归档（30天冷数据） - 夜间反思（每日23:45） - 技能提炼（从教训提取） - 健康度监控 --- # Agent Memory System 🧠 **OpenClaw Agent 长期记忆系统** 让 AI Agent 拥有持久记忆，自动管理冷热数据，从经验中提炼可复用技能。 ## 核心功能 ### 1. 温度模型 | 温度 | 时间范围 | 存储位置 | 说明 | |------|----------|----------|------| | 🔥 热 | < 7 天 | memory/*.md | 活跃数据，高频访问 | | 🟡 温 | 7-30 天 | memory/*.md | 近期数据，偶尔访问 | | ❄️ 冷 | > 30 天 | memory/.archive/ | 归档数据，低频访问 | ### 2. 自动 GC（每周日 00:00） ```bash # 自动执行 ./scripts/memory-gc.sh ``` 功能： - 扫描超过 30 天的日志文件 - 移动到 `.archive/YYYY-MM/` 目录 - 生成 GC 报告 - 统计温度分布 ### 3. 夜间反思（每日 23:45） ```bash # 自动执行 ./scripts/nightly-reflection.sh ``` 功能： - 验证记忆 CRUD - 创建反思记录 - 更新健康度统计 - 检查待归档数据 ### 4. 技能提炼 ```bash # 从教训中提取技能 ./scripts/extract-skill.sh <lesson-name> [skill-name] ``` 功能： - 从 `memory/lessons/` 读取教训 - 生成 `skills/<skill-name>/` 技能包 - 自动创建 SKILL.md 模板 ## 目录结构 ``` workspace/ ├── MEMORY.md # 核心长期记忆（<5KB） └── memory/ ├── INDEX.md # 导航索引 ├── YYYY-MM-DD.md # 每日日志 ├── lessons/ # 经验教训 │ ├── README.md # 教训索引 │ └── <topic>.md # 具体教训 ├── decisions/ # 重大决策 │ ├── README.md # 决策索引 │ └── YYYY-MM-DD-*.md # 决策记录 ├── people/ # 人物档案 ├── reflections/ # 反思记录 └── .archive/ # 归档数据 └── YYYY-MM/ # 按月归档 ``` ## 快速开始 ### 1. 安装 ```bash # 方法一：从 clawhub 安装 clawhub install agent-memory-system # 方法二：手动安装 cp -r agent-memory-system ~/.openclaw/workspace/skills/ ``` ### 2. 初始化目录 ```bash mkdir -p ~/.openclaw/workspace/memory/{lessons,decisions,people,reflections,.archive} touch ~/.openclaw/workspace/memory/INDEX.md touch ~/.openclaw/workspace/MEMORY.md ``` ### 3. 配置 Cron 任务 ```bash # 编辑 crontab crontab -e # 添加以下内容 0 0 * * 0 ~/.openclaw/workspace/skills/agent-memory-system/scripts/memory-gc.sh >> ~/.openclaw/logs/memory-gc.log 2>&1 45 23 * * * ~/.openclaw/workspace/skills/agent-memory-system/scripts/nightly-reflection.sh >> ~/.openclaw/logs/nightly-reflection.log 2>&1 ``` ### 4. 验证安装 ```bash # 手动运行一次 GC ~/.openclaw/workspace/skills/agent-memory-system/scripts/memory-gc.sh # 手动运行一次反思 ~/.openclaw/workspace/skills/agent-memory-system/scripts/nightly-reflection.sh ``` ## 使用指南 ### Agent 每日工作流 1. **会话开始** - 读取 MEMORY.md 获取核心记忆 - 检查今日日志 memory/YYYY-MM-DD.md 2. **会话中** - 重要决策 → 记录到 decisions/ - 犯错/教训 → 记录到 lessons/ - 人物信息 → 记录到 people/ 3. **会话结束** - 更新每日日志 - 标记完成事项 ### 从教训提取技能 ```bash # 假设有一个教训文件: memory/lessons/deploy-without-test.md ./scripts/extract-skill.sh deploy-without-test # 会生成: skills/deploy-without-test/SKILL.md # 然后手动完善 SKILL.md 内容 ``` ### 查询归档数据 ```bash # 查看归档目录 ls -la memory/.archive/ # 搜索归档内容 grep -r "关键词" memory/.archive/ ``` ## 记忆模板 ### MEMORY.md 模板 ```markdown # MEMORY.md - 长期记忆 > 核心知识和决策的精华 ## 核心决策 | 决策 | 状态 | 优先级 | 最后更新 | |------|------|--------|----------| | ... | ... | ... | ... | ## 最佳实践 ... ## 经验教训索引 | ID | 主题 | 类别 | 状态 | |----|------|------|------| | ... | ... | ... | ... | ``` ### 每日日志模板 ```markdown # YYYY-MM-DD ## 完成 - [事项] - 状态 ## 问题 - [问题] - 解决方案 ## 明天 - [计划] ``` ### 教训模板 ```markdown --- title: "教训标题" date: YYYY-MM-DD category: lessons lesson_id: LRN-YYYYMMDD-XXX priority: 🔴/🟡/🟢 status: active --- # 教训标题 ## 背景 ... ## 问题 ... ## 原因 ... ## 解决方案 ... ## 预防 ... ``` ## 健康度指标 | 指标 | 正常范围 | 检查频率 | |------|----------|----------| | MEMORY.md 大小 | < 5KB | 每日 | | 热数据数量 | 5-10 个 | 每周 | | 教训数量 | 持续增长 | 每周 | | 归档率 | < 20%/周 | 每周 | ## 故障排除 ### 记忆丢失 1. 检查 MEMORY.md 是否存在 2. 检查 memory/ 目录权限 3. 查看 .archive/ 是否有误归档 ### GC 不执行 1. 检查 crontab 配置 2. 检查脚本执行权限 3. 查看日志文件 ### 技能提取失败 1. 确认教训文件存在 2. 检查 lessons 目录路径 3. 确认 skills 目录可写 ## 与其他系统的关系 | 系统 | 关系 | |------|------| | memory_search | 语义搜索本系统管理的文件 | | elite-longterm-memory | LanceDB 向量存储（可选增强） | | agent 每日报告 | 可读取 memory/ 数据生成报告 | ## 更新日志 ### v1.0.0 (2026-03-04) - 初始版本 - 温度模型 + 自动归档 - 夜间反思 + 技能提炼 - 健康度监控 --- *由阿福创建维护 - OpenClaw Agent 生态*

path: README.md
content: # Agent Memory System 🧠

OpenClaw Agent 长期记忆系统 - 温度模型 + 自动归档 + 知识提炼

## 功能

- 🔥 **温度模型**: 热(<7天) / 温(7-30天) / 冷(>30天)
- 🗄️ **自动归档**: 每周日 00:00 执行 GC
- 💭 **夜间反思**: 每日 23:45 验证 + 统计
- 🔧 **技能提炼**: 从教训中提取可复用技能

## 安装

### 方式 1：一键安装（推荐）

```bash
# 1. 安装技能
clawhub install agent-memory-system

# 2. 运行安装脚本（自动配置）
cd ~/.openclaw/workspace/skills/agent-memory-system/scripts
./install.sh
```

安装脚本会：
- ✅ 自动创建记忆目录
- ✅ 复制模板文件
- ✅ 配置定时任务（可选）

### 方式 2：手动安装

```bash
clawhub install agent-memory-system

# 手动创建目录
mkdir -p ~/.openclaw/workspace/memory/{lessons,decisions,people,reflections,.archive}

# 手动配置 cron
crontab -e
# 添加:
# 0 0 * * 0 ~/.openclaw/workspace/skills/agent-memory-system/scripts/memory-gc.sh
# 45 23 * * * ~/.openclaw/workspace/skills/agent-memory-system/scripts/nightly-reflection.sh
```

## 文件结构

```
agent-memory-system/
├── .clawhub/origin.json    # Clawhub 元数据
├── _meta.json              # 技能元数据
├── SKILL.md                # 详细文档
├── README.md               # 本文件
├── scripts/
│   ├── memory-gc.sh        # 垃圾回收脚本
│   ├── nightly-reflection.sh  # 夜间反思脚本
│   └── extract-skill.sh    # 技能提取脚本
└── templates/
    ├── MEMORY-template.md  # MEMORY.md 模板
    ├── daily-log-template.md  # 每日日志模板
    └── lesson-template.md  # 教训模板
```

## 许可证

MIT

path: _meta.json
content: ownerId: local
slug: agent-memory-system
version: 1.0.1
publishedAt: 1772622000000

path: install.sh
content: #!/bin/bash

# agent-memory-system 安装脚本
# 用法：./install.sh [--uninstall]
#
# 功能：
#   - 检查依赖
#   - 创建目录结构
#   - 复制脚本和模板
#   - 配置 cron 任务
#   - 验证安装

set -e

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# 配置
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
WORKSPACE="${WORKSPACE:-$HOME/.openclaw/workspace}"
MEMORY_DIR="$WORKSPACE/memory"
SKILL_DIR="$WORKSPACE/skills/agent-memory-system"

log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
log_step() { echo -e "${BLUE}==>${NC} $1"; }

show_help() {
    echo "agent-memory-system 安装脚本"
    echo ""
    echo "用法："
    echo "  $0             安装技能包"
    echo "  $0 --uninstall 卸载技能包"
    echo "  $0 --help      显示帮助"
    echo ""
    echo "环境变量："
    echo "  WORKSPACE      OpenClaw 工作目录（默认：~/.openclaw/workspace）"
}

# 卸载函数
uninstall() {
    log_step "卸载 agent-memory-system..."
    
    # 移除 cron 任务
    log_info "移除 cron 任务..."
    (
        crontab -l 2>/dev/null | grep -v "agent-memory-system" || true
    ) | crontab - 2>/dev/null || log_warn "无法修改 crontab"
    
    # 询问是否删除数据
    if [ -d "$MEMORY_DIR" ]; then
        echo ""
        read -p "是否删除记忆数据目录 $MEMORY_DIR？(y/N): " confirm
        if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then
            rm -rf "$MEMORY_DIR"
            log_info "记忆数据已删除"
        else
            log_info "记忆数据已保留"
        fi
    fi
    
    log_info "卸载完成"
    exit 0
}

# 主安装流程
main() {
    echo "========================================"
    echo "  agent-memory-system 安装脚本"
    echo "========================================"
    echo ""
    
    # 0. 参数处理
    case "${1:-}" in
        --help|-h) show_help; exit 0 ;;
        --uninstall) uninstall ;;
    esac
    
    # 1. 检查依赖
    log_step "检查依赖..."
    
    DEPS_OK=true
    
    # Bash
    if command -v bash &> /dev/null; then
        log_info "✓ bash: $(bash --version | head -1)"
    else
        log_error "✗ bash 未安装"
        DEPS_OK=false
    fi
    
    # cron
    if command -v crontab &> /dev/null; then
        log_info "✓ crontab: 可用"
    else
        log_warn "✗ crontab 未安装（cron 任务将跳过）"
    fi
    
    # find
    if command -v find &> /dev/null; then
        log_info "✓ find: 可用"
    else
        log_error "✗ find 未安装"
        DEPS_OK=false
    fi
    
    if [ "$DEPS_OK" = false ]; then
        log_error "依赖检查失败，请先安装缺失的依赖"
        exit 1
    fi
    
    # 2. 创建目录结构
    log_step "创建目录结构..."
    
    mkdir -p "$MEMORY_DIR"
    mkdir -p "$MEMORY_DIR/lessons"
    mkdir -p "$MEMORY_DIR/decisions"
    mkdir -p "$MEMORY_DIR/people"
    mkdir -p "$MEMORY_DIR/reflections"
    mkdir -p "$MEMORY_DIR/.archive"
    
    log_info "目录已创建：$MEMORY_DIR"
    
    # 3. 初始化核心文件（如果不存在）
    log_step "初始化核心文件..."
    
    # MEMORY.md
    if [ ! -f "$WORKSPACE/MEMORY.md" ]; then
        if [ -f "$SCRIPT_DIR/templates/MEMORY-template.md" ]; then
            cp "$SCRIPT_DIR/templates/MEMORY-template.md" "$WORKSPACE/MEMORY.md"
            log_info "✓ 创建 MEMORY.md"
        else
            touch "$WORKSPACE/MEMORY.md"
            log_info "✓ 创建空 MEMORY.md"
        fi
    else
        log_info "✓ MEMORY.md 已存在"
    fi
    
    # INDEX.md
    if [ ! -f "$MEMORY_DIR/INDEX.md" ]; then
        cat > "$MEMORY_DIR/INDEX.md" << 'EOF'
# 记忆系统导航

> 自动生成于 agent-memory-system 安装

---

## 📁 目录结构

- `lessons/` - 经验教训
- `decisions/` - 重大决策
- `people/` - 人物档案
- `reflections/` - 反思记录
- `.archive/` - 归档数据

---

## 📊 健康度统计

| 类型 | 数量 | 最后更新 |
|------|------|----------|
| Lessons | 0 | - |
| Decisions | 0 | - |
| People | 0 | - |
| Reflections | 0 | - |

---

*由 agent-memory-system 自动生成*
EOF
        log_info "✓ 创建 INDEX.md"
    else
        log_info "✓ INDEX.md 已存在"
    fi
    
    # 4. 复制模板文件
    log_step "复制模板文件..."
    
    if [ -d "$SCRIPT_DIR/templates" ]; then
        for template in "$SCRIPT_DIR/templates"/*.md; do
            if [ -f "$template" ]; then
                filename=$(basename "$template")
                log_info "  - $filename"
            fi
        done
        log_info "模板文件位于：$SCRIPT_DIR/templates/"
    fi
    
    # 5. 配置 cron 任务
    log_step "配置 cron 任务..."
    
    GC_SCRIPT="$SCRIPT_DIR/scripts/memory-gc.sh"
    REFLECTION_SCRIPT="$SCRIPT_DIR/scripts/nightly-reflection.sh"
    LOG_DIR="$HOME/.openclaw/logs"
    
    mkdir -p "$LOG_DIR"
    
    # 检查 cron 任务是否已存在
    if crontab -l 2>/dev/null | grep -q "agent-memory-system"; then
        log_info "cron 任务已存在，跳过"
    else
        # 添加 cron 任务
        (
            crontab -l 2>/dev/null || true
            echo "# agent-memory-system - 每周日凌晨执行 GC"
            echo "0 0 * * 0 $GC_SCRIPT >> $LOG_DIR/memory-gc.log 2>&1"
            echo "# agent-memory-system - 每晚反思"
            echo "45 23 * * * $REFLECTION_SCRIPT >> $LOG_DIR/nightly-reflection.log 2>&1"
        ) | crontab -
        
        log_info "✓ cron 任务已配置"
    fi
    
    # 6. 验证安装
    log_step "验证安装..."
    
    CHECKS_PASSED=0
    CHECKS_TOTAL=5
    
    # 检查目录
    if [ -d "$MEMORY_DIR" ]; then
        log_info "✓ 记忆目录存在"
        ((CHECKS_PASSED++))
    fi
    
    # 检查子目录
    SUBDIRS_OK=true
    for subdir in lessons decisions people reflections .archive; do
        if [ ! -d "$MEMORY_DIR/$subdir" ]; then
            SUBDIRS_OK=false
        fi
    done
    if [ "$SUBDIRS_OK" = true ]; then
        log_info "✓ 子目录存在"
        ((CHECKS_PASSED++))
    fi
    
    # 检查 MEMORY.md
    if [ -f "$WORKSPACE/MEMORY.md" ]; then
        log_info "✓ MEMORY.md 存在"
        ((CHECKS_PASSED++))
    fi
    
    # 检查脚本
    if [ -f "$GC_SCRIPT" ] && [ -x "$GC_SCRIPT" ]; then
        log_info "✓ GC 脚本可执行"
        ((CHECKS_PASSED++))
    fi
    
    # 检查 cron
    if crontab -l 2>/dev/null | grep -q "agent-memory-system"; then
        log_info "✓ cron 任务已配置"
        ((CHECKS_PASSED++))
    fi
    
    # 7. 完成
    echo ""
    echo "========================================"
    echo "  安装完成！"
    echo "========================================"
    echo ""
    echo "验证结果：$CHECKS_PASSED/$CHECKS_TOTAL 项通过"
    echo ""
    echo "📋 快速开始："
    echo ""
    echo "  1. 编辑记忆文件："
    echo "     $WORKSPACE/MEMORY.md"
    echo ""
    echo "  2. 手动运行 GC："
    echo "     $GC_SCRIPT --dry-run"
    echo ""
    echo "  3. 手动运行反思："
    echo "     $REFLECTION_SCRIPT"
    echo ""
    echo "  4. 查看日志："
    echo "     tail -f $LOG_DIR/memory-gc.log"
    echo ""
    echo "📚 更多信息："
    echo "     cat $SCRIPT_DIR/SKILL.md"
    echo ""
}

main "$@"

path: scripts/extract-skill.sh
content: #!/bin/bash

# extract-skill.sh - 从经验教训中提取可复用技能
# 
# 用法：./extract-skill.sh <lesson-name> [skill-name]
#   lesson-name: lessons 目录中的文件名（不含.md）
#   skill-name:  可选，技能包名称（默认与 lesson 同名）
#
# 示例：
#   ./extract-skill.sh deploy-without-test
#   ./extract-skill.sh deploy-without-test safe-deploy

set -e

LESSON_NAME="$1"
SKILL_NAME="${2:-$LESSON_NAME}"
WORKSPACE="${WORKSPACE:-$HOME/.openclaw/workspace}"
LESSONS_DIR="$WORKSPACE/memory/lessons"
SKILLS_DIR="$WORKSPACE/skills"

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_section() {
    echo ""
    echo -e "${BLUE}=== $1 ===${NC}"
}

# 参数检查
if [ -z "$LESSON_NAME" ]; then
    echo "用法：$0 <lesson-name> [skill-name]"
    echo ""
    echo "参数说明："
    echo "  lesson-name: lessons 目录中的文件名（不含.md）"
    echo "  skill-name:  可选，技能包名称（默认与 lesson 同名）"
    echo ""
    echo "示例："
    echo "  $0 deploy-without-test"
    echo "  $0 deploy-without-test safe-deploy"
    echo ""
    echo "可用的 lessons："
    if [ -d "$LESSONS_DIR" ]; then
        for f in "$LESSONS_DIR"/*.md; do
            if [ -f "$f" ]; then
                name=$(basename "$f" .md)
                if [ "$name" != "README" ] && [ "$name" != "TEMPLATE" ]; then
                    echo "  - $name"
                fi
            fi
        done
    else
        echo "  (lessons 目录不存在)"
    fi
    exit 1
fi

LESSON_FILE="$LESSONS_DIR/${LESSON_NAME}.md"
SKILL_DIR="$SKILLS_DIR/$SKILL_NAME"

# 检查 lesson 文件
if [ ! -f "$LESSON_FILE" ]; then
    log_error "找不到课程文件：$LESSON_FILE"
    echo ""
    echo "可用的 lessons："
    for f in "$LESSONS_DIR"/*.md; do
        if [ -f "$f" ]; then
            name=$(basename "$f" .md)
            if [ "$name" != "README" ] && [ "$name" != "TEMPLATE" ]; then
                echo "  - $name"
            fi
        fi
    done
    exit 1
fi

log_section "从课程提取技能"
echo "  Lesson: $LESSON_NAME"
echo "  Skill:  $SKILL_NAME"

# 检查技能目录是否已存在
if [ -d "$SKILL_DIR" ]; then
    log_warn "技能目录已存在：$SKILL_DIR"
    read -p "是否覆盖？(y/N): " confirm
    if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
        log_info "已取消"
        exit 0
    fi
    rm -rf "$SKILL_DIR"
fi

# 创建技能目录结构
mkdir -p "$SKILL_DIR"
mkdir -p "$SKILL_DIR/.clawhub"
mkdir -p "$SKILL_DIR/scripts"

log_info "创建技能包结构..."

# 创建 SKILL.md
cat > "$SKILL_DIR/SKILL.md" << EOF
---
name: $SKILL_NAME
version: 1.0.0
description: "从经验教训提炼的技能 - 详见 memory/lessons/${LESSON_NAME}.md"
author: Agent
keywords: [skill, extracted, lesson]
metadata:
  openclaw:
    emoji: "🛠️"
    source:
      lesson: "memory/lessons/${LESSON_NAME}.md"
      extracted_at: "$(date -Iseconds)"
---

# $SKILL_NAME 技能

> 从经验教训中提炼的可复用能力

**来源课程**: [[${LESSON_NAME}]]  
**提炼时间**: $(date +%Y-%m-%d)

---

## 核心能力

<!-- 从课程中提炼的核心能力描述 -->

待补充...

---

## 使用方式

\`\`\`bash
# 示例用法
# TODO: 补充具体使用方式
\`\`\`

---

## 检查清单

- [ ] 核心能力已完善
- [ ] 使用示例已补充
- [ ] 脚本已测试

---

## 相关经验教训

- [[${LESSON_NAME}]] - 原始经验记录

---

*此技能由 extract-skill.sh 自动创建，请手动完善内容*
EOF

log_info "创建 SKILL.md"

# 创建 README.md
cat > "$SKILL_DIR/README.md" << EOF
# $SKILL_NAME

自动生成的技能包。

## 状态

- [ ] 核心能力待完善
- [ ] 使用示例待补充
- [ ] 测试用例待添加

## 下一步

1. 阅读源课程 \`memory/lessons/${LESSON_NAME}.md\`
2. 提炼核心能力到 SKILL.md
3. 添加使用示例和脚本
4. 测试技能是否正常工作

## 来源

- Lesson: \`memory/lessons/${LESSON_NAME}.md\`
- 提取时间: $(date '+%Y-%m-%d %H:%M:%S')
EOF

log_info "创建 README.md"

# 创建 .clawhub/origin.json
cat > "$SKILL_DIR/.clawhub/origin.json" << EOF
{
  "version": 1,
  "registry": "https://clawhub.ai",
  "slug": "$SKILL_NAME",
  "installedVersion": "1.0.0",
  "installedAt": $(date +%s)000
}
EOF

log_info "创建 .clawhub/origin.json"

# 创建 _meta.json
cat > "$SKILL_DIR/_meta.json" << EOF
{
  "ownerId": "local",
  "slug": "$SKILL_NAME",
  "version": "1.0.0",
  "publishedAt": $(date +%s)000
}
EOF

log_info "创建 _meta.json"

log_section "完成"
echo ""
log_info "✅ 技能包已创建：$SKILL_DIR"
echo ""
echo "📝 下一步："
echo "   1. 编辑 $SKILL_DIR/SKILL.md 完善核心能力"
echo "   2. 添加必要的脚本到 $SKILL_DIR/scripts/"
echo "   3. 更新源课程的 status 为 'promoted_to_skill'"
echo "   4. 在源课程中添加 Skill-Path: $SKILL_DIR"
echo ""

# 更新源课程状态
if [ -f "$LESSON_FILE" ]; then
    # 检查是否有 frontmatter
    if head -1 "$LESSON_FILE" | grep -q "^---"; then
        # 有 frontmatter，添加 status 和 skill-path
        if grep -q "^status:" "$LESSON_FILE"; then
            sed -i "s/^status:.*/status: promoted_to_skill/" "$LESSON_FILE"
        else
            sed -i "/^---$/a status: promoted_to_skill" "$LESSON_FILE"
        fi
        if ! grep -q "^skill-path:" "$LESSON_FILE"; then
            sed -i "/^status: promoted_to_skill/a skill-path: $SKILL_DIR" "$LESSON_FILE"
        fi
    fi
    log_info "已更新源课程状态"
fi

path: scripts/install.sh
content: #!/bin/bash

# Agent Memory System 一键安装脚本
# 用法：./install.sh

set -e

echo "🧠 Agent Memory System 安装程序"
echo "================================"
echo ""

# 1. 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SKILL_DIR="$(dirname "$SCRIPT_DIR")"

# 2. 询问用户工作区路径
DEFAULT_WORKSPACE="$HOME/.openclaw/workspace"
read -p "请输入 OpenClaw 工作区路径 (默认: $DEFAULT_WORKSPACE): " WORKSPACE
WORKSPACE="${WORKSPACE:-$DEFAULT_WORKSPACE}"

echo ""
echo "📁 工作区：$WORKSPACE"
echo ""

# 3. 创建记忆目录结构
echo "📂 创建记忆目录..."
mkdir -p "$WORKSPACE/memory/lessons"
mkdir -p "$WORKSPACE/memory/decisions"
mkdir -p "$WORKSPACE/memory/people"
mkdir -p "$WORKSPACE/memory/reflections"
mkdir -p "$WORKSPACE/memory/.archive"
echo "✅ 目录创建完成"
echo ""

# 4. 复制模板文件
echo "📋 复制模板文件..."
cp "$SKILL_DIR/templates/MEMORY-template.md" "$WORKSPACE/MEMORY.md.example"
cp "$SKILL_DIR/templates/daily-log-template.md" "$WORKSPACE/memory/daily-log-template.md"
cp "$SKILL_DIR/templates/lesson-template.md" "$WORKSPACE/memory/lessons/lesson-template.md"
echo "✅ 模板复制完成"
echo ""

# 5. 配置 crontab（可选）
echo "⏰ 配置定时任务..."
read -p "是否配置自动 GC 和反思任务？(y/n, 默认:y): " CONFIG_CRON
CONFIG_CRON="${CONFIG_CRON:-y}"

if [[ "$CONFIG_CRON" == "y" || "$CONFIG_CRON" == "Y" ]]; then
    # 检查 crontab 是否已存在相关配置
    if crontab -l 2>/dev/null | grep -q "memory-gc.sh"; then
        echo "⚠️  检测到已有 memory-gc.sh 配置，跳过"
    else
        # 添加 GC 任务（每周日 00:00）
        (crontab -l 2>/dev/null | grep -v "memory-gc.sh" || true; echo "0 0 * * 0 $SCRIPT_DIR/memory-gc.sh") | crontab -
        echo "✅ 已添加每周 GC 任务"
    fi
    
    if crontab -l 2>/dev/null | grep -q "nightly-reflection.sh"; then
        echo "⚠️  检测到已有 nightly-reflection.sh 配置，跳过"
    else
        # 添加反思任务（每天 23:45）
        (crontab -l 2>/dev/null | grep -v "nightly-reflection.sh" || true; echo "45 23 * * * $SCRIPT_DIR/nightly-reflection.sh") | crontab -
        echo "✅ 已添加每日反思任务"
    fi
else
    echo "⏭️  跳过 crontab 配置，可以手动添加"
fi
echo ""

# 6. 显示使用说明
echo "================================"
echo "🎉 安装完成！"
echo ""
echo "📖 使用说明："
echo "1. 复制 MEMORY.md.example 为 MEMORY.md（如需要）"
echo "   cp $WORKSPACE/MEMORY.md.example $WORKSPACE/MEMORY.md"
echo ""
echo "2. 查看当前记忆状态："
echo "   $SCRIPT_DIR/memory-gc.sh --dry-run"
echo ""
echo "3. 手动执行夜间反思："
echo "   $SCRIPT_DIR/nightly-reflection.sh"
echo ""
echo "4. 从教训中提取技能："
echo "   $SCRIPT_DIR/extract-skill.sh <lesson-name>"
echo ""
echo "📚 详细文档：$SKILL_DIR/SKILL.md"
echo "================================"


path: scripts/memory-gc.sh
content: #!/bin/bash

# 记忆垃圾回收脚本 - 每周日 00:00 执行
# 功能：主动遗忘 + 冷存储归档 + 温度模型
# 
# 用法：./memory-gc.sh [--dry-run]
#   --dry-run: 仅显示将要执行的操作，不实际移动文件

set -e

DRY_RUN="${1:-}"
WORKSPACE="${WORKSPACE:-$HOME/.openclaw/workspace}"
MEMORY_DIR="$WORKSPACE/memory"
ARCHIVE_DIR="$WORKSPACE/memory/.archive"
CURRENT_MONTH=$(date +%Y-%m)

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_section() {
    echo ""
    echo -e "${BLUE}=== $1 ===${NC}"
}

echo "========================================"
echo "  记忆 GC 开始 - $(date '+%Y-%m-%d %H:%M:%S')"
echo "========================================"

if [ "$DRY_RUN" = "--dry-run" ]; then
    log_warn "DRY RUN 模式 - 不会实际移动文件"
fi

# 1. 确保归档目录存在
if [ "$DRY_RUN" != "--dry-run" ]; then
    mkdir -p "$ARCHIVE_DIR/$CURRENT_MONTH"
fi

# 2. 找出超过 30 天的每日日志（冷数据）
log_section "扫描冷数据（超过 30 天的日志）"

COLD_FILES=$(find "$MEMORY_DIR" -maxdepth 1 -name "*.md" -type f -mtime +30 2>/dev/null | grep -v "INDEX.md" | grep -v "MEMORY.md" || true)

if [ -z "$COLD_FILES" ]; then
    log_info "没有需要归档的冷数据"
    ARCHIVED_COUNT=0
else
    log_info "发现冷数据："
    echo "$COLD_FILES" | while read -r file; do
        if [ -n "$file" ]; then
            filename=$(basename "$file")
            echo "  - $filename"
        fi
    done
    
    ARCHIVED_COUNT=$(echo "$COLD_FILES" | grep -c ".md" 2>/dev/null || echo "0")
    
    if [ "$DRY_RUN" != "--dry-run" ]; then
        for file in $COLD_FILES; do
            if [ -n "$file" ] && [ -f "$file" ]; then
                filename=$(basename "$file")
                log_info "归档：$filename → .archive/$CURRENT_MONTH/"
                mv "$file" "$ARCHIVE_DIR/$CURRENT_MONTH/$filename"
            fi
        done
        log_info "冷数据已归档到：$ARCHIVE_DIR/$CURRENT_MONTH/"
    else
        log_warn "DRY RUN: 将归档 $ARCHIVED_COUNT 个文件到 .archive/$CURRENT_MONTH/"
    fi
fi

# 3. 温度统计
log_section "温度统计"

# 热数据（最近 7 天）
HOT_COUNT=$(find "$MEMORY_DIR" -maxdepth 1 -name "*.md" -type f -mtime -7 2>/dev/null | grep -v "INDEX.md" | grep -v "MEMORY.md" | wc -l)
echo "🔥 热数据（<7 天）: $HOT_COUNT 个"

# 温数据（7-30 天）
WARM_COUNT=$(find "$MEMORY_DIR" -maxdepth 1 -name "*.md" -type f -mtime +7 -mtime -30 2>/dev/null | wc -l)
echo "🟡 温数据（7-30 天）: $WARM_COUNT 个"

# 冷数据（>30 天，已归档）
COLD_COUNT=$(find "$ARCHIVE_DIR" -name "*.md" -type f 2>/dev/null | wc -l)
echo "❄️ 冷数据（已归档）: $COLD_COUNT 个"

# 4. 结构化目录统计
log_section "结构化目录"

count_files() {
    local dir="$1"
    if [ -d "$dir" ]; then
        find "$dir" -name "*.md" -type f 2>/dev/null | wc -l
    else
        echo "0"
    fi
}

LESSONS_COUNT=$(count_files "$MEMORY_DIR/lessons")
DECISIONS_COUNT=$(count_files "$MEMORY_DIR/decisions")
PEOPLE_COUNT=$(count_files "$MEMORY_DIR/people")
REFLECTIONS_COUNT=$(count_files "$MEMORY_DIR/reflections")

echo "📚 Lessons: $LESSONS_COUNT 个"
echo "🎯 Decisions: $DECISIONS_COUNT 个"
echo "👤 People: $PEOPLE_COUNT 个"
echo "💭 Reflections: $REFLECTIONS_COUNT 个"

# 5. 磁盘空间统计
log_section "磁盘空间"

if [ -d "$MEMORY_DIR" ]; then
    MEMORY_SIZE=$(du -sh "$MEMORY_DIR" 2>/dev/null | cut -f1)
    echo "memory/ 目录：$MEMORY_SIZE"
else
    echo "memory/ 目录：不存在"
fi

if [ -d "$ARCHIVE_DIR" ]; then
    ARCHIVE_SIZE=$(du -sh "$ARCHIVE_DIR" 2>/dev/null | cut -f1)
    echo ".archive/ 目录：$ARCHIVE_SIZE"
else
    echo ".archive/ 目录：不存在"
fi

# 6. 生成 GC 报告
if [ "$DRY_RUN" != "--dry-run" ]; then
    GC_REPORT="$ARCHIVE_DIR/gc-report-$CURRENT_MONTH.md"
    
    # 追加模式，同月多次运行会更新
    cat > "$GC_REPORT" << EOF
# GC 报告 - $CURRENT_MONTH

**执行时间**: $(date '+%Y-%m-%d %H:%M:%S')

## 归档统计
- 本次归档文件数：$ARCHIVED_COUNT
- 累计归档文件数：$COLD_COUNT

## 温度分布
| 温度 | 数量 | 说明 |
|------|------|------|
| 🔥 热 | $HOT_COUNT | 最近 7 天 |
| 🟡 温 | $WARM_COUNT | 7-30 天 |
| ❄️ 冷 | $COLD_COUNT | 已归档 |

## 结构化知识
- Lessons: $LESSONS_COUNT
- Decisions: $DECISIONS_COUNT
- People: $PEOPLE_COUNT
- Reflections: $REFLECTIONS_COUNT

## 磁盘使用
- memory/: $MEMORY_SIZE
- .archive/: $ARCHIVE_SIZE

---
*自动生成 by agent-memory-skill*
EOF

    log_info "GC 报告已生成：$GC_REPORT"
fi

echo ""
echo "========================================"
echo "  记忆 GC 完成"
echo "========================================"

path: scripts/nightly-reflection.sh
content: #!/bin/bash

# 夜间反思脚本 - 每天 23:45 执行
# 功能：CRUD 验证 + 知识提炼 + 更新 INDEX.md 健康度
#
# 用法：./nightly-reflection.sh [--skip-reflection]

set -e

SKIP_REFLECTION="${1:-}"
WORKSPACE="${WORKSPACE:-$HOME/.openclaw/workspace}"
MEMORY_DIR="$WORKSPACE/memory"
TODAY=$(date +%Y-%m-%d)

# 颜色输出
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_section() {
    echo ""
    echo -e "${BLUE}=== $1 ===${NC}"
}

echo "========================================"
echo "  夜间反思开始 - $(date '+%Y-%m-%d %H:%M:%S')"
echo "========================================"

# 1. 确保 reflections 目录存在
mkdir -p "$MEMORY_DIR/reflections"
mkdir -p "$MEMORY_DIR/lessons"
mkdir -p "$MEMORY_DIR/decisions"
mkdir -p "$MEMORY_DIR/people"

# 2. 读取今日日志，分析内容
TODAY_LOG="$MEMORY_DIR/$TODAY.md"
log_section "检查今日日志"

if [ -f "$TODAY_LOG" ]; then
    log_info "找到今日日志：$TODAY_LOG"
    
    # 统计今日完成事项
    COMPLETED_COUNT=$(grep -c "✅\|完成\|done" "$TODAY_LOG" 2>/dev/null || echo "0")
    TODO_COUNT=$(grep -c "\- \[ \]" "$TODAY_LOG" 2>/dev/null || echo "0")
    
    echo "  - 完成事项：$COMPLETED_COUNT 个"
    echo "  - 待办事项：$TODO_COUNT 个"
    
    # 检查日志大小
    LOG_SIZE=$(wc -c < "$TODAY_LOG")
    echo "  - 日志大小：$LOG_SIZE bytes"
else
    log_warn "今日日志不存在：$TODAY_LOG"
    log_info "建议创建今日日志文件"
fi

# 3. 验证核心文件
log_section "验证核心文件"

# MEMORY.md
if [ -f "$WORKSPACE/MEMORY.md" ]; then
    MEMORY_SIZE=$(wc -c < "$WORKSPACE/MEMORY.md")
    MEMORY_LINES=$(wc -l < "$WORKSPACE/MEMORY.md")
    log_info "MEMORY.md: $MEMORY_LINES 行, $MEMORY_SIZE bytes"
else
    log_warn "MEMORY.md 不存在，建议创建"
fi

# INDEX.md
if [ -f "$MEMORY_DIR/INDEX.md" ]; then
    log_info "INDEX.md 存在"
else
    log_warn "INDEX.md 不存在，建议创建"
fi

# 4. 统计各目录
log_section "目录统计"

count_files() {
    local dir="$1"
    local name="$2"
    if [ -d "$dir" ]; then
        count=$(find "$dir" -name "*.md" -type f 2>/dev/null | wc -l)
        echo "  - $name: $count 个文件"
    else
        echo "  - $name: 目录不存在"
    fi
}

count_files "$MEMORY_DIR/lessons" "Lessons"
count_files "$MEMORY_DIR/decisions" "Decisions"
count_files "$MEMORY_DIR/people" "People"
count_files "$MEMORY_DIR/reflections" "Reflections"

# 5. 创建反思记录
if [ "$SKIP_REFLECTION" != "--skip-reflection" ]; then
    log_section "创建反思记录"
    
    REFLECTION_FILE="$MEMORY_DIR/reflections/$TODAY.md"
    
    # 检查是否已存在
    if [ -f "$REFLECTION_FILE" ]; then
        log_info "反思记录已存在：$REFLECTION_FILE"
    else
        cat > "$REFLECTION_FILE" << EOF
---
title: "$TODAY 反思"
date: $TODAY
category: reflections
type: daily-reflection
tags: [reflection, daily]
---

# $TODAY 反思

## ✅ 今日完成
- 自动生成的反思记录
- 详细内容由 Agent 补充

## 🤔 遇到的问题
- 

## 💡 学到的东西
- 

## 📝 需要跟进
- 

## 🎯 明天重点
- 

---
*自动生成时间：$(date '+%Y-%m-%d %H:%M:%S')*
EOF
        log_info "反思记录已创建：$REFLECTION_FILE"
    fi
fi

# 6. 更新 INDEX.md（如果存在）
log_section "更新 INDEX.md"

INDEX_FILE="$MEMORY_DIR/INDEX.md"
if [ -f "$INDEX_FILE" ]; then
    # 获取统计数据
    LESSONS_COUNT=$(find "$MEMORY_DIR/lessons" -name "*.md" -type f 2>/dev/null | wc -l)
    DECISIONS_COUNT=$(find "$MEMORY_DIR/decisions" -name "*.md" -type f 2>/dev/null | wc -l)
    PEOPLE_COUNT=$(find "$MEMORY_DIR/people" -name "*.md" -type f 2>/dev/null | wc -l)
    REFLECTIONS_COUNT=$(find "$MEMORY_DIR/reflections" -name "*.md" -type f 2>/dev/null | wc -l)
    
    # 检查是否需要更新
    if grep -q "健康度" "$INDEX_FILE" 2>/dev/null; then
        log_info "INDEX.md 已包含健康度统计"
    else
        log_info "添加健康度统计到 INDEX.md"
        echo "" >> "$INDEX_FILE"
        echo "## 📊 健康度统计" >> "$INDEX_FILE"
        echo "" >> "$INDEX_FILE"
        echo "| 类型 | 数量 | 最后更新 |" >> "$INDEX_FILE"
        echo "|------|------|----------|" >> "$INDEX_FILE"
        echo "| Lessons | $LESSONS_COUNT | $TODAY |" >> "$INDEX_FILE"
        echo "| Decisions | $DECISIONS_COUNT | $TODAY |" >> "$INDEX_FILE"
        echo "| People | $PEOPLE_COUNT | $TODAY |" >> "$INDEX_FILE"
        echo "| Reflections | $REFLECTIONS_COUNT | $TODAY |" >> "$INDEX_FILE"
    fi
fi

# 7. 检查冷数据
log_section "检查冷数据"

OLD_LOGS=$(find "$MEMORY_DIR" -maxdepth 1 -name "*.md" -mtime +30 2>/dev/null | wc -l)
if [ "$OLD_LOGS" -gt 0 ]; then
    log_warn "发现 $OLD_LOGS 个超过 30 天的日志文件（待归档）"
    log_info "建议运行 memory-gc.sh 进行归档"
else
    log_info "没有需要归档的冷数据"
fi

echo ""
echo "========================================"
echo "  夜间反思完成"
echo "========================================"

path: templates/MEMORY-template.md
content: # MEMORY.md - 长期记忆

> 核心知识和决策的精华（保持 < 5KB）

---

## 核心决策

| 决策 | 状态 | 优先级 | 最后更新 |
|------|------|--------|----------|
| [决策内容] | 评估中/已采纳/实施中/已完成 | 🔴/🟡/🟢 | YYYY-MM-DD |

---

## 最佳实践

### [实践名称]

**场景**：

**做法**：

**注意事项**：

---

## 经验教训索引

| ID | 主题 | 类别 | 优先级 | 状态 |
|----|------|------|--------|------|
| LRN-YYYYMMDD-001 | [主题] | bug/code/review | 🔴/🟡/🟢 | active/resolved |

---

## 人物档案

| 姓名 | 关系 | 关键信息 |
|------|------|----------|
| [姓名] | [关系] | [关键信息] |

---

## 项目索引

| 项目 | 状态 | 负责人 | 最后更新 |
|------|------|--------|----------|
| [项目名] | 进行中/暂停/完成 | [负责人] | YYYY-MM-DD |

---

*最后更新：YYYY-MM-DD*

path: templates/daily-log-template.md
content: # YYYY-MM-DD 开发记录

---

## ✅ 完成

- [功能/模块] - 简述

---

## 🔄 进行中

- [功能/模块] - 进度 XX% - 预计完成时间

---

## ⚠️ 阻塞

- [问题] - 原因 - 需要 [资源/决策]

---

## 📈 质量指标

| 指标 | 目标 | 当前 | 趋势 |
|------|------|------|------|
| 测试覆盖率 | ≥80% | XX% | ↑/↓/→ |
| CI 通过率 | 100% | XX% | ↑/↓/→ |

---

## 🎯 明日计划

- [ ] [任务 1] - 优先级 🔴/🟡/🟢
- [ ] [任务 2] - 优先级

---

## 💡 备注

-

---

*创建时间：YYYY-MM-DD*

path: templates/lesson-template.md
content: ---
title: "教训标题"
date: YYYY-MM-DD
category: lessons
lesson_id: LRN-YYYYMMDD-XXX
priority: 🔴/🟡/🟢
status: active
tags: [标签1, 标签2]
---

# 教训标题

---

## 背景

描述当时的情况和环境。

---

## 问题

描述遇到的具体问题。

---

## 原因

分析问题的根本原因。

---

## 解决方案

描述如何解决的问题。

---

## 预防

列出预防类似问题的措施。

---

## 相关链接

- [[相关决策]]
- [[相关项目]]

---

*记录时间：YYYY-MM-DD*

Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (HIGH)