Skill: wuxiao-code/memory-association (version 1.0.0)

--- name: memory-association description: 记忆联想系统。基于 MEMORY_INDEX.md 实现任务前的上下文联想召回，确保消耗 token 前先关联已有记忆。触发场景：(1) 启动任何新任务前 (2) 分析需求时 (3) 解决问题时 (4) 被问"之前做过什么"时 (5) Session Startup 第7步。避免重复工作，保持上下文连续性。 --- # Memory Association ## 核心原则 **先联想，再行动；先召回，再消耗 token。** 每次接到任务，立即联想：这件事之前做过吗？相关文件在哪？有什么经验教训？ ## 联想工作流 ### Step 1 — 读取索引 读取 `memory/MEMORY_INDEX.md`，按任务类型匹配联想链： ``` 任务类型 → 优先召回文件（见索引§联想链） ``` ### Step 2 — 精准召回 用 `memory_get` 拉取关键段落： ```bash # 格式 memory_get(path="memory/xxx.md", from=行号, lines=20) ``` ### Step 3 — 判断 | 判断结果 | 行动 | |---------|------| | 有相关记忆 | 引用关键段落，继续任务 | | 记忆过期/缺失 | 补充写入 `memory/YYYY-MM-DD.md` | | 发现通用教训 | 更新 `.learnings/LEARNINGS.md` | ### Step 4 — 记录 任务完成后，将关键结论写入当日 memory 文件： ```markdown --- name: "任务摘要" description: "一句话描述" type: project --- # 任务结果 [关键决策/结论/教训] ``` ## 索引结构 完整索引见 `references/MEMORY_INDEX.md`，包含： - 按项目分类（壹启健康/彩色乐园/入境医疗/科普竞赛） - 按主题分类（TikTok/医学脚本/OpenClaw配置） - 按时间分类（早期/密集期/稳定迭代/收尾） - 关键词索引（踩坑/部署/UI改版等） - 联想链（任务类型 → 优先召回文件） ## 索引更新时机 当有以下情况时，更新 MEMORY_INDEX.md： 1. 新项目启动 → 添加项目分类条目 2. 新主题出现 → 添加关键词索引 3. 重要教训 → 更新联想链 4. 重大踩坑 → 更新 `.learnings/ERRORS.md` ## 记忆分层 | 层级 | 位置 | 更新频率 | 用途 | |------|------|---------|------| | HOT | `MEMORY.md` | 按需 | 核心/长期记忆，200行硬限制 | | WARM | `memory/YYYY-MM-DD.md` | 每日 | 当日工作日志 | | COLD | `memory/projects/*.md` | 项目结束时 | 项目档案 | | ARCHIVE | `memory/.dreams/` | 梦境处理 | 历史会话冷存 | ## 联想示例 **用户**：帮我查一下腾讯云部署的情况 1. 联想链匹配 → "壹启健康开发/部署" → `yiqi-health-project.md` 2. `memory_get` 拉取腾讯云段落 3. 结论：IP 62.234.146.100，版本 4.8.5，在 `2026-04-29.md` 有详细日志 **用户**：彩色乐园音频有问题 1. 联想链匹配 → "彩色乐园迭代" → `colorful-park-project.md` 2. `memory_get` 拉取音频相关段落 3. 结论：音频处理在 `2026-04-20-bgm-cleanup-fix.md`，使用 Mac say + ffmpeg 后处理 ## 参考文件 - `references/MEMORY_INDEX.md` — 完整记忆索引 - `references/TASK_ASSOCIATION_EXAMPLES.md` — 联想示例库

path: references/MEMORY_INDEX.md
content: # Memory Index — OpenClaw 记忆索引
> 自动生成于 2026-04-30 00:39

---

## 📊 统计

- 每日日志: 43 个
- 项目档案: 14 个
- 更新于: 2026-04-30

---

## 📅 按日期索引（最近30天）

- 🟢 `2026-04-29.md` — 壹启健康腾讯云部署 + H5前端更新
- 🟡 `2026-04-28.md` — 腾讯云部署 v4.7.0 + admin UI优化 + HTTPS配置
- 🟡 `2026-04-27.md` — 壹启健康本地部署 + 管理后台需求整理
- 🟡 `2026-04-25.md` — 壹启健康本地后端重建 + 部署规范
- 🟡 `2026-04-23.md` — 壹启健康 H5 修复迭代
- 🟠 `2026-04-22-blueberry-fix.md`
- 🟠 `2026-04-22.md` — 彩色乐园儿童游戏应用 Bug 修复 + 行为数据采集架构升级
- 🟠 `2026-04-21-logo-upload.md`
- 🟠 `2026-04-21.md` — 早安简报迭代 + cron微信投递调试
- 🟠 `2026-04-21-med-competitions-deep.md` — 深度爬取2026年医学科普竞赛信息，补充完整起止日期
- 🟠 `2026-04-21-med-competitions-full.md` — 深度爬取2026年医学/健康科普竞赛完整信息（含报名起止日期）
- 🟠 `2026-04-21-med-competitions.md` — 整理2026年医学科普相关竞赛活动信息
- 🟠 `2026-04-20-phase-rollout.md`
- 🟠 `2026-04-20-news-split.md`
- 🟠 `2026-04-20-tiktok-script.md`
- 🟠 `2026-04-20-colorful-paradise-v112.md`
- 🟠 `2026-04-20-bgm-cleanup-fix.md`
- 🟠 `2026-04-20.md` — 彩色乐园迭代更新
- 🟠 `2026-04-19-tts-audio-fix.md`
- 🟠 `2026-04-19-wechat-channel-switch.md`
- 🟠 `2026-04-19.md`
- 🟠 `2026-04-18.md`
- 🟠 `2026-04-17-server-ffmpeg-compress.md`
- 🟠 `2026-04-17.md`
- 🟠 `2026-04-17-car-insurance-quote-comparison.md`
- 🟠 `2026-04-17-ppt-beautify.md`
- 🟠 `2026-04-17-avatar-svg-upload.md`
- 🟠 `2026-04-16-script-based-video-editing.md`
- 🟠 `2026-04-16.md` — 全网调研TikTok/YouTube Shorts/Instagram Reels上入境医疗旅游短视频数据，输出结构化报告供PPT制作
- 🟠 `2026-04-16-0913.md`

---

## 🏷️ 关键词快速定位

- **腾讯云部署**: `2026-04-09-lan-deployment.md`, `2026-04-12-yiqi-health-deploy.md`, `2026-04-15-yiqi-deployment-package-split.md`, `2026-04-28.md`, `2026-04-29.md`
- **彩色乐园**: `2026-04-20-colorful-paradise-v112.md`
- **医学科普**: `2026-04-15-inbound-medical-video.md`, `2026-04-16-inbound-medical-research.md`, `2026-04-21-med-competitions-deep.md`, `2026-04-21-med-competitions-full.md`, `2026-04-21-med-competitions.md`
- **TikTok**: `2026-04-15-tiktok-analysis.md`, `2026-04-20-tiktok-script.md`
- **壹启健康**: `2026-04-11.md`, `2026-04-12-yiqi-health-deploy.md`, `2026-04-12-yiqi-health-hero-update-2-8-2.md`, `2026-04-12-yiqi-intro.md`, `2026-04-12-yiqi-password.md`

---


path: references/TASK_ASSOCIATION_EXAMPLES.md
content: # 联想示例库

> 记录典型任务的联想路径，供快速参照

---

## 壹启健康相关

### 新任务：H5页面改版
```
联想链: 壹启健康 → MEMORY_INDEX §项目 → yiqi-health-project.md
召回: 技术栈 / 部署路径 / 腾讯云配置
教训: UI改版必须先出设计稿 → 用户确认 → 再开发（见MEMORY.md 铁律）
```

### 新任务：腾讯云部署
```
联想链: 壹启健康 → 2026-04-29.md → 腾讯云部署流程
召回: 权限修复命令 / nginx配置 / systemd服务
教训: JAR chmod 644 + h5/admin chmod 755 + chown www-data
```

### 新任务：数据库问题
```
联想链: yiqi-health-project.md → 数据库设计文档
召回: SQLite路径 / JAR必须在项目根目录启动
```

### 新任务：管理后台开发
```
联想链: 2026-04-27.md → 管理后台需求整理
召回: Vue3 + Vite base /admin/ / 静态资源路径
```

---

## 彩色乐园相关

### 新任务：游戏逻辑修改
```
联想链: 彩色乐园 → colorful-park-project.md
召回: Vue 3 + Vite / Docker Compose / 前端构建命令
```

### 新任务：音频处理
```
联想链: 2026-04-20-bgm-cleanup-fix.md
召回: Mac say + ffmpeg后处理 / 67个.m4a文件 / 年轻妈妈音色
```

---

## TikTok / 短视频相关

### 新任务：短视频数据分析
```
联想链: TikTok → tiktok_report.py / tiktok_medical_tourism.py
召回: 工具路径 / 报告模板
```

### 新任务：入境医疗内容
```
联想链: 入境医疗 → inbound-medical-tourism-research.md
召回: 调研报告内容 / TikTok数据
```

---

## OpenClaw 系统相关

### 新任务：Skill安装/配置
```
联想链: clawhub / skills list → skill-creator
召回: 安装命令 / 验证流程
```

### 新任务：子Agent问题排查
```
联想链: SOUL.md → 多Agent架构
召回: Agent团队 / 故障接替规则
```

### 新任务：记忆系统异常
```
联想链: MEMORY_INDEX §OpenClaw配置 → DOCTRINE_SYSTEM.md
召回: 决策原则 / 记忆召回规范
```

---

## 踩坑相关

### 排查：文件权限问题
```
召回: .learnings/ERRORS.md
关键教训: chmod 644 / chmod 755 / chown www-data 三步缺一不可
```

### 排查：npm / brew 安装失败
```
召回: 2026-04-30 操作记录
教训: 国内网络直连npm不稳定，需代理
```

### 排查：Git仓库臃肿
```
召回: 2026-04-30 Git清理记录
命令: git gc --prune=now --aggressive
释放: 4.2GB → 342MB
```

---

## 通用模板

### 每次新任务的联想检查清单

- [ ] 查 MEMORY_INDEX.md 联想链
- [ ] memory_get 相关文件关键段落
- [ ] 检查 .learnings/ERRORS.md 是否有相关踩坑
- [ ] 检查 .learnings/LEARNINGS.md 是否有相关教训
- [ ] 判断：直接继续 / 补充记忆 / 更新索引


path: scripts/build_index.py
content: #!/usr/bin/env python3
"""
memory-association/scripts/build_index.py
扫描 memory/ 目录，自动生成/更新 MEMORY_INDEX.md

用法: python3 build_index.py [--dry-run]
"""
import os
import re
import argparse
from pathlib import Path
from datetime import datetime

MEMORY_DIR = Path.home() / ".openclaw/workspace/memory"
INDEX_PATH = MEMORY_DIR / "MEMORY_INDEX.md"
SKILL_INDEX = Path(__file__).parent.parent / "references" / "MEMORY_INDEX.md"


def extract_frontmatter(content: str) -> dict:
    """从文件头部提取 name/description/type"""
    fm = {}
    if content.startswith("---"):
        end = content.find("---", 3)
        if end > 0:
            block = content[3:end]
            for line in block.splitlines():
                if ":" in line:
                    key, _, val = line.partition(":")
                    fm[key.strip()] = val.strip().strip('"')
    return fm


def scan_memory_files() -> list[dict]:
    """扫描所有 memory/ 下的 .md 文件"""
    files = []
    for p in sorted(MEMORY_DIR.glob("2026-04-*.md")):
        content = p.read_text()
        fm = extract_frontmatter(content)
        # 取第一行标题
        first_line = content.split("\n")[0].lstrip("# ").strip()
        files.append({
            "name": p.name,
            "path": p,
            "date": p.stat().st_mtime,
            "title": fm.get("name", first_line),
            "description": fm.get("description", ""),
            "type": fm.get("type", "daily"),
        })
    return files


def build_index(files: list[dict]) -> str:
    """生成 MEMORY_INDEX.md 内容"""
    lines = [
        "# Memory Index — OpenClaw 记忆索引",
        f"> 自动生成于 {datetime.now().strftime('%Y-%m-%d %H:%M')}",
        "",
        "---",
        "",
        "## 📊 统计",
        "",
        f"- 每日日志: {sum(1 for f in files if f['type'] == 'daily')} 个",
        f"- 项目档案: {sum(1 for f in files if f['type'] == 'project')} 个",
        f"- 更新于: {datetime.now().strftime('%Y-%m-%d')}",
        "",
        "---",
        "",
        "## 📅 按日期索引（最近30天）",
        "",
    ]

    # 最近30天的文件
    recent = sorted(files, key=lambda x: x["date"], reverse=True)[:30]
    for f in recent:
        age = (datetime.now().timestamp() - f["date"]) / 86400
        age_tag = "🟢" if age < 1 else "🟡" if age < 7 else "🟠" if age < 30 else "🔴"
        desc = f" — {f['description']}" if f["description"] else ""
        lines.append(f"- {age_tag} `{f['name']}`{desc}")

    lines.extend(["", "---", "", "## 🏷️ 关键词快速定位", ""])

    # 按关键词聚合
    keywords = {
        "腾讯云部署": [f for f in files if "deploy" in f["name"].lower() or "腾讯" in f.get("description", "")],
        "Git清理": [f for f in files if "git" in f["name"].lower()],
        "彩色乐园": [f for f in files if "colorful" in f["name"].lower() or "park" in f["name"].lower()],
        "医学科普": [f for f in files if "med" in f["name"].lower() or "科普" in f.get("description", "")],
        "TikTok": [f for f in files if "tiktok" in f["name"].lower()],
        "壹启健康": [f for f in files if "yiqi" in f["name"].lower() or "壹启" in f.get("description", "")],
    }

    for kw, hits in keywords.items():
        if hits:
            names = ", ".join(f"`{f['name']}`" for f in hits[:5])
            lines.append(f"- **{kw}**: {names}")

    lines.extend(["", "---", ""])

    return "\n".join(lines)


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--dry-run", action="store_true")
    args = parser.parse_args()

    print("🔍 扫描 memory/ 文件...")
    files = scan_memory_files()
    print(f"   找到 {len(files)} 个文件")

    print("📝 生成索引...")
    content = build_index(files)

    if args.dry_run:
        print(content)
    else:
        INDEX_PATH.write_text(content)
        SKILL_INDEX.write_text(content)
        print(f"   ✅ 已写入 {INDEX_PATH}")
        print(f"   ✅ 已同步 {SKILL_INDEX}")


if __name__ == "__main__":
    main()


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