Skip to content

Latest commit

 

History

History
405 lines (299 loc) · 13.7 KB

File metadata and controls

405 lines (299 loc) · 13.7 KB

aimemo

Go 1.22+ License: MIT Release

English | 中文

零依赖的 AI Agent MCP 记忆服务器——持久化、可搜索、本地优先、单一二进制文件。

$ claude "继续搞支付服务"

  ╭─ memory_context ──────────────────────────────────────────────────╮
  │ [project: payment-service]                                        │
  │                                                                   │
  │ 上次会话(3 天前):                                              │
  │  • Stripe webhook 签名验证 — 已完成                               │
  │  • 幂等键重构 — 进行中                                            │
  │  • 卡点:并发退款处理器的竞态条件                                 │
  │                                                                   │
  │ 相关:Redis 连接池, pkg/payments/refund.go                        │
  ╰───────────────────────────────────────────────────────────────────╯

  接着上次的继续。退款处理器的竞态条件看起来是 in-flight map 缺少
  mutex。先看一下 pkg/payments/refund.go ...

  [... Claude 定位并修复问题 ...]

  ╭─ memory_store (journal) ──────────────────────────────────────────╮
  │ 修复退款竞态——给 inFlightRefunds 加了 sync.Mutex。               │
  │ 测试全过。下一步:用 k6 在 500 rps 下做压测。                    │
  ╰───────────────────────────────────────────────────────────────────╯

🧠 为什么选 aimemo

  • 不需要维护任何基础设施。 单个 Go 二进制文件,不依赖 Docker、Node.js 运行时、云账号或 API Key。brew install 30 秒搞定。
  • 记忆跟着项目走。 存储在项目目录下的 .aimemo/,可以提交到 git 也可以加进 .gitignore,随你决定。切分支、记忆不丢。
  • Claude 能从上次断点继续。 每次会话开始时自动调用 memory_context,Claude 能看到上次在做什么、卡在哪里、做了哪些决定。你不需要每次重新解释背景。
  • 全文搜索真的有用。 FTS5 + BM25 排序,同时考虑时效性和访问频率。相关记忆排在前面,久远的噪音自然淡化。
  • 多个 Claude 窗口同时写,不会数据损坏。 SQLite WAL 模式支持并发写入,多个会话同时操作互不干扰。
  • 你始终掌控数据。 Claude 能做的操作,你在终端里也能做。查看、编辑、撤回、导出。记忆以 Markdown 或 JSON 格式存储,永远不会被锁死在专有格式里。

⚡ 快速开始

# 1. 安装
# Linux/macOS(一行安装):
curl -sSL https://raw.githubusercontent.com/MyAgentHubs/aimemo/main/install.sh | bash

# 或者 macOS 通过 Homebrew:
brew install MyAgentHubs/tap/aimemo

# 2. 在项目根目录初始化记忆
aimemo init

# 3. 注册到 Claude Code
claude mcp add-json aimemo-memory '{"command":"aimemo","args":["serve"]}'

重启 Claude Code,下次打开会话时 Claude 会自动加载项目上下文。

OpenClaw 快速开始

如果你在使用 OpenClaw skills,请查看下面的 OpenClaw 集成章节,了解如何实现 per-skill 记忆隔离。

🔧 工作原理

aimemo serve 以 stdio MCP 服务器的形式运行,进程生命周期由 Claude Code 托管,不需要你手动保活。每次会话开始时 Claude 调用 memory_context 加载之前的上下文;工作过程中调用 memory_storememory_link 记录决策和关联关系。你随时可以在终端执行 aimemo searchaimemo listaimemo get 来查看和编辑同一份数据。所有内容存在 .aimemo/ 目录下的 SQLite 数据库里,查找方式和 Git 找 .git/ 一样——从当前目录逐级向上搜索。

🛠 MCP 工具

工具 说明 Claude 何时调用
memory_context 返回当前项目的排序后近期记忆 会话开始时自动调用
memory_store 保存一条记录(事实、决策、日志、TODO) 完成一个任务或做出决策后
memory_search 对所有记录进行 BM25 全文搜索 需要回忆某个具体内容时
memory_forget 按 ID 软删除一条记录 被告知丢弃某条信息时
memory_link 在两条记录之间建立命名关联 识别出依赖关系或关联时

所有工具 schema 总计不超过 2,000 个 token。每次调用有 5 秒硬超时——服务器不会卡住你的会话。空数据库下查询耗时不超过 5 ms。

📋 CLI 参考

初始化与诊断

命令 说明
aimemo init 在当前目录创建 .aimemo/
aimemo serve 启动 MCP stdio 服务器(由 Claude Code 自动调用)
aimemo doctor 检查 DB 健康状态、FTS5 支持、WAL 模式和 MCP 注册情况

记忆管理

命令 说明
aimemo add <name> <type> [observations...] [--tag] 添加实体及其记录
aimemo observe <entity-name> <observation> 向已有实体追加一条记录
aimemo retract <entity-name> <observation> 从实体中删除指定记录
aimemo forget <entity-name> [--permanent] 软删除实体(可恢复);--permanent 为硬删除
aimemo search <query> 全文搜索,按相关度排序
aimemo get <entity-name> 查看实体及其全部记录和关联
aimemo link <from> <relation> <to> 在两个实体间建立有类型的关联
aimemo append <entity-name> <observation> 向实体追加一条记录(observe 的别名)

日志

命令 说明
aimemo journal 打开交互式日志编辑器(使用 $EDITOR
aimemo journal <text> 快速写入一条内联日志

查看与导出

命令 说明
aimemo list 列出近期记录
aimemo tags 列出所有使用中的标签
aimemo stats 显示 DB 大小、记录数、最后写入时间
aimemo export --format md 导出全部记忆为 Markdown
aimemo export --format json 导出全部记忆为 JSON
aimemo import <file> 从 JSONL 或 JSON 导出文件导入

所有命令都支持 --context <name>,用来切换命名上下文(.aimemo/ 内独立的 .db 文件)。

⚙️ 配置

~/.aimemo/config.toml — 全局默认值,所有字段均可选:

[defaults]
context = "main"          # 默认上下文名称
max_results = 20          # memory_context 返回的记录数量

[scoring]
recency_weight = 0.7      # 0–1,时效性相对于访问频率的权重

[server]
timeout_ms = 5000         # MCP 调用的硬超时(毫秒)
log_level = "warn"        # "debug" | "info" | "warn" | "error"

项目级覆盖放在项目根目录的 .aimemo/config.toml 中,字段相同,项目值优先于全局值。

🤖 Claude Code 集成

在本机注册一次服务器:

claude mcp add-json aimemo-memory '{"command":"aimemo","args":["serve"]}'

在项目的 CLAUDE.md 中加入以下内容,让 Claude 知道记忆功能可用以及如何使用:

## Memory

本项目使用 aimemo 在会话间保持持久记忆。

- 每次会话开始时调用 `memory_context` 加载之前的上下文。
- 会话结束前调用 `memory_store`(type: journal)记录本次完成了什么、
  还有什么在进行中、有哪些卡点。
-`memory_link` 关联相关记录(例如 bug 和修复,决策和理由)。
- 不要存储密钥、凭证或个人信息。

🦞 OpenClaw 集成

aimemo 用零基础设施per-skill 记忆隔离解决了 OpenClaw "记住所有但理解无"的问题。

为什么在 OpenClaw 中使用 aimemo?

问题:

  • OpenClaw 原生的 Markdown 记忆系统越用越差
  • Skills 共享记忆,导致交叉污染
  • 上下文压缩会丢失重要信息

解决方案:

  • 零依赖 — 单个 Go 二进制文件,无需 Docker/Node.js/数据库
  • Per-skill 隔离 — 每个 skill 有独立的记忆数据库
  • 真正有效 — BM25 搜索 + 重要性评分找到关键信息
  • 本地优先 — 所有数据留在你的机器上

vs 其他方案:

aimemo Cognee memsearch Supermemory
依赖 Neo4j/Kuzu Milvus 云服务
安装 30秒 复杂 复杂 需注册
Skill 隔离 内置 手动 手动 N/A
Linux 支持 ✅ 原生 N/A

5分钟设置

# 1. 安装(Linux amd64/arm64)
curl -sSL https://raw.githubusercontent.com/MyAgentHubs/aimemo/main/install.sh | bash

# 2. 在 OpenClaw 注册 MCP 服务器
claude mcp add-json aimemo-memory '{"command":"aimemo","args":["serve"]}'

# 或添加到 ~/.openclaw/openclaw.json:
# {
#   "mcpServers": {
#     "aimemo-memory": {
#       "command": "/usr/local/bin/aimemo",
#       "args": ["serve"]
#     }
#   }
# }

# 3. 初始化 workspace 记忆
cd ~/.openclaw/workspace
aimemo init

# 4. 重启 OpenClaw Gateway
# Linux: systemctl --user restart openclaw-gateway
# macOS: launchctl stop com.openclaw.gateway && launchctl start com.openclaw.gateway

Per-Skill 记忆隔离

每个 skill 通过使用 context 参数获得独立的记忆:

在你的 SKILL.md 中:

---
name: my-skill
description: 一个有持久记忆的 skill
---

# My Skill

## 指令

执行工作时:

1. **首先加载记忆**

memory_context({context: "my-skill"})


2. 使用加载的上下文执行任务

3. **存储学到的东西**:

memory_store({ context: "my-skill", entities: [{ name: "preferences", entityType: "config", observations: ["用户偏好 snake_case"] }] })


**关键**:始终传递 `context: "my-skill"` 以防止记忆污染。

结果:

~/.openclaw/workspace/.aimemo/
├── memory.db                    # 共享/默认(无 context)
├── memory-skill-a.db            # Skill A 的隔离记忆
├── memory-skill-b.db            # Skill B 的隔离记忆
└── memory-skill-c.db            # Skill C 的隔离记忆

完整示例

查看 examples/openclaw-github-pr-reviewer/ 获取一个完整的工作 skill:

  • 审查 GitHub PR
  • 学习代码风格偏好
  • 跨会话记住模式
  • 存储反馈以改进

文档

调试

# 列出 skill 的记忆
aimemo list --context my-skill

# 在 skill 内搜索
aimemo search "关键词" --context my-skill

# 导出检查
aimemo export --context my-skill --format json > memory.json

# 获取数据库统计
aimemo stats --context my-skill

🖥 客户端支持

aimemo 兼容所有支持 MCP 协议的 AI 编程客户端,服务器命令统一为 aimemo serve

PATH 注意(macOS/Homebrew): GUI 应用可能不继承 Shell 的 PATH。如果客户端找不到 aimemo,请改用绝对路径 /opt/homebrew/bin/aimemo

Claude Code

claude mcp add-json aimemo-memory '{"command":"aimemo","args":["serve"]}'

或在项目根目录提交 .mcp.json(参考本仓库的示例文件)。

Cursor

项目级(.cursor/mcp.json)或全局(~/.cursor/mcp.json):

{
  "mcpServers": {
    "aimemo-memory": {
      "command": "aimemo",
      "args": ["serve"]
    }
  }
}

Windsurf

编辑 ~/.codeium/windsurf/mcp_config.json(仅全局):

{
  "mcpServers": {
    "aimemo-memory": {
      "command": "aimemo",
      "args": ["serve"]
    }
  }
}

OpenAI Codex CLI

项目级(.codex/config.toml)或全局(~/.codex/config.toml):

[mcp_servers.aimemo-memory]
command = "aimemo"
args    = ["serve"]

Cline(VS Code)

编辑 ~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json

{
  "mcpServers": {
    "aimemo-memory": {
      "command": "aimemo",
      "args": ["serve"],
      "disabled": false,
      "alwaysAllow": []
    }
  }
}

Continue(VS Code / JetBrains)

项目级(.continue/mcpServers/aimemo-memory.yaml):

name: aimemo-memory
version: 0.0.1
schema: v1
mcpServers:
  - name: aimemo-memory
    command: aimemo
    args:
      - serve

或在全局 ~/.continue/config.yamlmcpServers: 下添加同样内容。

Zed

~/.zed/settings.json(全局)或 .zed/settings.json(项目级)中:

{
  "context_servers": {
    "aimemo-memory": {
      "source": "custom",
      "command": "aimemo",
      "args": ["serve"],
      "env": {}
    }
  }
}

🤝 参与贡献

Bug 反馈和功能建议请提 GitHub Issue。欢迎 PR——如果改动较大,建议先开 Issue 讨论方向,避免白费力气。