关于 compound-memory
compound-memory 是面向多 AI Agent 的本地共享记忆系统,将记忆保存为带元数据的 Markdown 文件,并通过使用反馈调整可信度、归档闲置内容及记录本地 git 历史。它提供 MCP 工具和 CLI,并支持可选语义检索。
主要功能
- 01以 Markdown 文件本地保存记忆
- 02共享与 Agent 私有命名空间
- 03根据使用反馈更新可信度
- 04闲置记忆归档并可恢复
- 05每次写入自动提交本地 git
- 06可选向量检索并回退到词法检索
适用场景
- 01让多个 Agent 共用项目约定和偏好
- 02跨会话检索已确认的事实与经验
- 03反馈记忆使用结果以调整可信度
- 04通过 CLI 检查记忆库状态
MCP 相关
该项目提供 MCP 服务,包含 memory_write、memory_search、memory_get、memory_link 和 memory_feedback 五种工具;也提供用于运维的 CLI。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
uvx compound-memoryCOMPOUND_MEMORY_ROOTStore root directory. A leading ~ or $HOME/${HOME} is expanded; unset or blank falls back to $HOME/.agents/memoryCOMPOUND_MEMORY_AGENT_IDStable host agent id (e.g. agent-claude). Required for a multi-agent store: process identity wins over a self-reported source. Unset is only for a single trusted caller; stats.attestation.warning and the server log say so本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
compound-memory
English | 简体中文
以本地优先的方式为多个 AI Agent 共享记忆——使用纯 Markdown 文件,随着使用不断积累价值。记忆以带有 frontmatter 注释的 Markdown 文件形式存储在你的磁盘上,每次确认使用都会增强记忆;被忽略的记忆会衰减并进入可恢复的归档,每次写入时都会自动提交到本地 git 历史记录。
为什么
每次 Agent 会话都从零开始:偏好需要重新询问,项目约定需要重新发现,同一个陷阱会再次踩中。compound-memory 为你的所有 Agent 提供一个共享存储:
- 本地优先——数据不会离开你的机器;记忆是人类可读的 Markdown 文件,而不是不透明数据库中的行。
- MCP 原生——仅提供 5 个工具(
memory_write/memory_search/memory_get/memory_link/memory_feedback)作为唯一的读写边界;适用于任何 MCP 宿主(Claude Code、ZCode、WorkBuddy、……),并提供完整的命令行用于运维。 - 持续积累——确认使用会提升置信度,相关记忆会作为邻近内容被召回,来自不同宿主的验证会计为独立证据,而蒸馏会将许多原始记忆合并为更少、更精炼的记忆。
- 专为多 Agent 设计——提供所有人都能读取的
_shared命名空间,以及由各宿主持有的agent-*私有命名空间;跨宿主验证按宿主跟踪。 - 可选语义召回——通过 sqlite-vec + BGE 嵌入进行向量搜索;不可用时会自动平滑回退到纯词法搜索。使用
COMPOUND_MEMORY_EMBEDDING_MODEL(默认为Xenova/bge-small-zh-v1.5)和COMPOUND_MEMORY_EMBEDDING_DIM(默认为 512)覆盖模型;修改任一项都属于运维操作,需要显式执行rebuild-index。
快速开始
面向 AI Agent
将这一行命令粘贴到你的编码 Agent(Claude Code、Cursor、ZCode、……)中,其余工作交给它完成:
Set up compound-memory (https://github.com/chinwe/compound-memory) — a local-first multi-agent shared memory (MCP server + CLI) — on this machine. Do not clone the repo for a normal install. Initialize the store with `uvx --from compound-memory compound-memory init` (defaults to ~/.agents/memory). Register its stdio MCP server in this host's MCP config: command `uvx`, args `--from compound-memory compound-memory-server`, env `COMPOUND_MEMORY_ROOT=$HOME/.agents/memory` and `COMPOUND_MEMORY_AGENT_ID=agent-<your-host-id>`. Verify by calling `memory_search` and expecting a `{"hits": [...]}` response; if the host needs a restart to load MCP servers, tell me. Use `uv run --directory <repo>` only when developing against a local checkout. Short English setup and the search → feedback → write loop: docs/agent-integration.en.md. Full per-host configs: docs/agent-integration.md.
面向人类
1. 安装
Python ≥ 3.11。默认情况下不会克隆仓库:
# Default: PyPI. Hosts launch the MCP server with
# uvx --from compound-memory compound-memory-server
# Optional CLI on PATH:
uv tool install compound-memory # or: pip install compound-memory
# Developer / local checkout only — not the default host launch
git clone https://github.com/chinwe/compound-memory.git
cd compound-memory && uv sync --extra dev
2. 初始化存储
默认路径为 ~/.agents/memory;可通过 COMPOUND_MEMORY_ROOT 环境变量覆盖。开头的 ~ 或 $HOME 会展开;空白覆盖值会回退到默认值。
uvx --from compound-memory compound-memory init
# after `uv tool install`: compound-memory init
3. 将其接入 MCP 宿主(推荐)
这样日常使用的 Agent 就能自动读写共享存储。无需仓库路径:
{
"mcpServers": {
"compound-memory": {
"type": "stdio",
"command": "uvx",
"args": ["--from", "compound-memory", "compound-memory-server"],
"env": {
"COMPOUND_MEMORY_ROOT": "$HOME/.agents/memory",
"COMPOUND_MEMORY_AGENT_ID": "agent-<your-host-id>"
}
}
}
}
uvx 接受包名;服务控制台脚本为 compound-memory-server,因此必须使用 --from。如果 uvx 不在 PATH 中,请将 command 设为绝对路径 ~/.local/bin/uvx。对于任何多 Agent 存储,COMPOUND_MEMORY_AGENT_ID 都是必需的:进程身份优先于模型声称的身份,因此伪造的 source 无法写入其他宿主的命名空间,也无法虚增跨宿主验证数据。对于共享 _shared 的使用,如果该变量未设置或为空,将直接失败:stats 和 doctor 会以状态码 1 退出(但仍会打印诊断信息)。MCP 工具会继续运行,且服务会在启动时记录同样的警告。没有该 ID 时,身份由使用者自报,可能被伪造。
本地检出是开发者使用方式,不是第二种默认方式:执行 uv sync --extra dev 后,command 为 uv,args 为 ["run", "--directory", "<absolute-repo-path>", "compound-memory-server"]。
验证:让你的 Agent 调用 memory_search(使用任意关键词)——如果返回 {"hits": [...]},说明连接成功。或者运行 uvx --from compound-memory compound-memory doctor(设置了 COMPOUND_MEMORY_AGENT_ID 且存储可写时退出状态码为 0;未设置或为空时退出状态码为 1)。
Claude Code 插件
需要 Claude Code 和 uv(uvx 必须位于 PATH 中)。本仓库托管一个可自托管的市场。向 Anthropic 官方目录提交插件不在本项目范围内。
claude plugin marketplace add chinwe/compound-memory
claude plugin install compound-memory@compound-memory
这会安装 integrations/claude,并通过 COMPOUND_MEMORY_AGENT_ID=agent-claude 启动 uvx --from compound-memory compound-memory-server(如果需要使用其他 ID,可在宿主中覆盖该环境变量)。SessionStart 钩子会在新会话中添加一条简短提醒;验证和禁用步骤见插件 README。这些市场和插件文件不包含在 PyPI sdist 或 wheel 中:MANIFEST.in 会将其排除,且 scripts/wheel_smoke.sh 会检查构建产物。
WorkBuddy / CodeBuddy 插件
需要 WorkBuddy 或 CodeBuddy,以及 uv(uvx 必须位于 PATH 中)。本仓库在 .codebuddy-plugin/marketplace.json 中托管一个可自托管的市场。
/plugin marketplace add chinwe/compound-memory
/plugin install compound-memory@compound-memory
这会安装 integrations/workbuddy,并通过 COMPOUND_MEMORY_AGENT_ID=agent-workbuddy 启动同一个 PyPI 服务。SessionStart 钩子会在新会话中显示一条简短的硬性规则提醒,且不会读取存储库。Claude 市场文件保持不变。
ZCode 插件
需要 ZCode 桌面应用和 uv(uvx 必须位于 PATH 中)。ZCode 将本仓库的 .claude-plugin/marketplace.json 作为其市场目录,因此无需单独的市场文件。
克隆仓库,然后在 ZCode 中依次选择:插件市场 → 添加 → 添加插件市场,粘贴克隆路径(即包含 .claude-plugin/ 的目录),并在 个人 → compound-memory 下安装 Compound Memory (ZCode)。这会安装 integrations/zcode,并通过 COMPOUND_MEMORY_AGENT_ID=agent-zcode 启动同一个 PyPI 服务,同时提供 SessionStart 硬性规则提醒和简短技能。该插件的 MCP 服务名为 compound-memory;如果 ~/.zcode/cli/config.json 已注册同名服务(手动配置方式,见 docs/agent-integration.md 的 §3),请只保留其中一种配置。
4. 下一步
将 skills/compound-memory/SKILL.md 中的使用协议(搜索 → 反馈 → 写入循环)注入宿主。简短英文版见 docs/agent-integration.en.md;完整协议见 docs/agent-integration.md §6。
演示

一个完整循环:write → search → feedback(含跨主机首次验证奖励)→ 存储健康状况。以下是 v0.4.0 的实际输出,长负载已截短:
uv run compound-memory init
{ "ok": true, "root": "~/.agents/memory" }
两台不同的主机各写入一条稳定事实(新记忆的 confidence 从 0.5 开始,uses 为 0):
uv run compound-memory write \
"Deploy serverless functions on this platform times out at 10s — keep handlers under that budget" \
fact agent-claude --key vercel-timeout
{
"id": "20261007_86adf1",
"ns": "_shared",
"type": "fact",
"source": "agent-claude",
"content": "Deploy serverless functions on this platform times out at 10s — keep handlers under that budget",
"confidence": 0.5,
"uses": 0,
"key": "vercel-timeout",
"validated_by": []
...
}
uv run compound-memory write \
"User prefers concise replies with tables and code examples" \
fact agent-zcode --key user-style
搜索按得分排序(--explain 会附加每条命中的排序组成部分,供调试使用):
uv run compound-memory search "serverless timeout"
[
{
"id": "20261007_86adf1", "score": 1.0292, "similarity": 1.0,
"type": "fact", "source": "agent-claude",
"content": "Deploy serverless functions on this platform times out at 10s — keep handlers under that budget",
"neighbors": []
},
{
"id": "20261007_6a0c0c", "score": 0.5211, "similarity": 0.4919,
"type": "fact", "source": "agent-zcode",
"content": "User prefers concise replies with tables and code examples",
"neighbors": []
}
]
另一台主机使用了这条记忆,并按默认的 success 结果反馈回来——uses +1,conf +0.1;由于报告者 agent-workbuddy ≠ 来源 agent-claude,首次跨主机验证还会额外增加 +0.15:
uv run compound-memory feedback 20261007_86adf1 agent-workbuddy
{
"id": "20261007_86adf1",
"confidence": 0.75,
"uses": 1,
"last_used": "2026-10-07",
"validated_by": ["agent-workbuddy"],
"evidence": {
"success_count": 1, "failure_count": 0, "contradiction_count": 0,
"last_verified": "2026-10-07",
"recent": [{ "date": "2026-10-07", "agent": "agent-workbuddy", "outcome": "success" }]
}
...
}
一目了然地查看存储健康状况(固定分桶直方图、活跃度、提炼产出):
uv run compound-memory stats
{
"total": 2, "archived": 0, "active": 2,
"avg_confidence": 0.625,
"by_type": { "fact": 2 },
"by_ns": { "_shared": 2 },
"review_queue_entries": 0,
"uses_histogram": { "0": 1, "1-2": 1, "3-5": 0, "6-9": 0, "10+": 0 },
"confidence_histogram": { "<0.3": 0, "0.3-0.6": 1, "0.6-0.8": 1, "0.8-1.0": 0 },
"recent_feedback_7d": 1, "cross_validated": 0,
"distilled_total": 0, "distilled_recent_7d": 0
}
当前的 stats 还包含 retrieval(mode:vector 或 lexical,以及向量通道关闭时的 reason)、attestation(attested,以及未设置 COMPOUND_MEMORY_AGENT_ID 时的 warning),和 expired_active(有效期 valid_until 已过的活跃区记忆;此快照中为 0)。cross_validated 统计 validated_by 中列有至少两个不同 Agent 的记忆——上面的单次跨主机验证正确地使其保持为 0。memory_search 携带相同的 retrieval 对象。CLI search 始终返回纯数组。未设置或留空 COMPOUND_MEMORY_AGENT_ID 时,CLI stats 以状态码 1 退出;doctor 是单页检查(认证、检索、写入锁、git),使用相同规则,并额外检查根目录、锁和 git 错误。MCP 工具不会因缺少 Agent ID 而停止。
请注意以下三点:
- 新记忆的
confidence从 0.5 开始,并根据证据变化——反馈会携带结果:success会提高置信度,failure会降低置信度(下限为 0.05),contradiction会将其冻结并放入审核队列,obsolete会立即归档。同一主机的success基础增量会记录在evidence.host_bumps中,每台主机最多增加 0.3(单台主机最多可使置信度达到 0.8;ADR-0012)。 - 来自不同主机的首次验证会获得独立奖励(每台主机、每条记忆仅一次),并留下
validated_by/evidence记录——置信度代表正确性的证据,而非受欢迎程度。 - 命中项会自动嵌入一跳邻居(此处为空——尚无链接;
memory_link会创建双向链接,后续检索时可免费一并召回)。
复利如何产生
| 复利来源 | 机制 |
|---|---|
| ① 使用强化 | 每次 memory_feedback 都会推进 uses 和 last_used。置信度随结果变化。默认的 success:+0.1,该主机的基础增量存储在 evidence.host_bumps 中,上限为 0.3(单台主机最多可使置信度达到 0.8;ADR-0012)。failure:−0.2(下限为 0.05,重复失败会累积)。contradiction:冻结置信度,并添加一条审核队列记录。obsolete:立即归档。unknown:记录事件,置信度不变 |
| ② 链接价值 | memory_link 会创建双向链接;memory_get 会提取一跳邻居;search 命中项会嵌入最多 3 个精简邻居(仅活跃记忆;使用 --no-neighbors 可禁用) |
| ③ 提炼 | distill-plan(CLI,确定性候选项 + suggested_action:merge / promote / review)→ Agent 编写成品 → distill-apply 原子提交(成品链接回来源;来源会归档,但可恢复) |
| ④ 跨 Agent 验证 | 仅对 success,来自非 source 主机的首次反馈会增加 +0.15(每台主机、每条记忆仅一次;记录在 validated_by 中;不占用同一主机的 host_bumps 上限) |
评分(权重是 src/compound_memory/scoring.py 中的 W_* 常量):0.70·similarity + 0.15·confidence + 0.10·recency(0.5+0.5·e^(−Δt/τ)) + 0.05·type weight。启用向量通道后,排序会切换为 RRF 融合,并使用 ε=0.04 的先验值打破平局(参见规范中的“index as cache”)。
5 个 MCP 工具
| 工具 | 用途 | 要点 |
|---|---|---|
memory_write | 写入记忆 | type:episode/fact/insight/skill/decision;source:你的 Agent ID;为 fact/insight/decision 提供稳定的 key;可选的 valid_from/valid_until(ISO 日期)、project 范围和 lesson_role(lesson 或 avoid;普通记忆可省略)。超过 262144 个字符的 content 会被拒绝,且不会写入任何内容 |
memory_search | 检索 | 返回按分数排序的 {"hits": [...], "count", "retrieval"}(默认 top_k=5);最多嵌入 3 个经过截断的单跳邻居;默认使用双通道(_shared + 调用者自己的私有 ns);可选的 project(失败即关闭)和 explain。CLI search 仍返回裸数组 |
memory_get | 按 ID 获取 | 始终包含 found 键;提取单跳邻居,不设数量上限,并保留已归档的邻居(search 最多返回 3 个,将内容截断至 80 个字符,并丢弃已归档的邻居)。两种路径都会省略已过期的邻居。访问私有 ns 目标需要 reader |
memory_link | 链接两条记忆 | 双向链接;两侧必须位于同一 ns;私有 ns 链接需要所有者身份 |
memory_feedback | 报告记忆的实际表现 | 每种结果都会递增 uses 并更新 last_used。默认 outcome=success:conf+0.1,同一主机的基础增量通过 host_bumps 封顶为 0.3(单个主机最高为 0.8;ADR-0012);首次跨主机验证 +0.15(不受封顶限制)。failure −0.2(下限 0.05);contradiction 会冻结置信度并加入审核队列;obsolete 会立即归档;unknown 会记录事件,但置信度不变。采用命中结果后必须调用——这是让存储不断累积价值的闭环 |
工具描述中嵌入了协议规则本身,因此即使没有注入宿主侧规则,Agent 也能保持闭环。简短的英文闭环说明:docs/agent-integration.en.md。完整参数参考:docs/agent-integration.md。
CLI
以下是检出仓库后的命令(在克隆目录中运行 uv run)。未克隆仓库的宿主可改用 uvx --from compound-memory compound-memory …。
uv sync --extra dev # first clone: build .venv (later `uv run` reuses it)
uv run compound-memory init # initialize an empty store
uv run compound-memory write "Vercel Serverless has a 10s timeout" episode agent-workbuddy
uv run compound-memory search "Vercel timeout" # default top_k=5; hits embed one-hop neighbors (limit 3, --no-neighbors to disable)
uv run compound-memory feedback <id> agent-claude
uv run compound-memory decay # run from cron
uv run compound-memory revive <id> # revive an archived memory
uv run compound-memory distill-plan # distillation candidates: suggested_action is merge / promote / review; also report-only negative_salience and contradiction_pairs
uv run compound-memory dream --ns _shared # read-only report: distill-plan section (including the negative sections) + decay_signals + equal stats snapshots (no writes, no LLM)
uv run compound-memory maintain # one ops pass: read-only dream → optional decay → health-snapshot. Decay is off unless --with-decay or RUN_DECAY=1 (DECAY=1). No --propose, no dream-apply
uv run compound-memory dream --ns _shared --propose # system proposes: qualifying clusters go to <root>/distill/dream-proposals.json; a human runs dream-apply. Default off; empty pack is []
uv run compound-memory dream-apply --proposals apply.json --source agent-workbuddy --dry-run # gated apply preview; drop --dry-run to run distill-apply on admitted rows
uv run compound-memory distill-apply "the merged insight" insight agent-workbuddy --sources <id1>,<id2> # atomic: product (links, origin=distillation) + source archival, one commit
uv run compound-memory doctor # one-page health check; exit 1 if AGENT_ID is unset, root is missing, the lock is broken, or git is unusable
uv run compound-memory stats # health: uses/confidence buckets + liveness + distillation yield; exit 1 if AGENT_ID is unset
uv run compound-memory rebuild-index # rebuild the search cache anytime
uv run compound-memory review-queue # conflict queue (CLI-only entry)
uv run compound-memory git-log # audit trail
更多操作:explain <id>(查看单条记忆的置信度构成和证据详情)、forget <id> --agent <id>(永久移除,ADR-0009)、review-resolve(裁定冲突)、extract <transcript|dir>(确定性地挖掘会话转录)。
架构
Agent (MCP client / CLI)
└─ memory_write | memory_search | memory_get | memory_link | memory_feedback
└─ MemoryStore (~/.agents/memory)
├─ namespaces/_shared/{episode,fact,insight,skill,decision}/*.md shared area
├─ namespaces/agent-*/... private areas
├─ archive/... decayed archive (revivable)
├─ index/tokens.json rebuildable lexical cache
├─ index/vectors.db rebuildable vector cache (optional)
├─ review-queue.md fact/insight/decision conflict queue
└─ .git/ auto-commit on every write
定时蒸馏准备(launchd / cron / systemd)
根据 ADR 0001,确定性准备任务按计划运行,而判断工作(总结 / 合并)仍由调用方 Agent 负责。每天 09:00,dream 会将只读报告写入 <root>/distill/last-plan.json(distill 对象是候选列表;不会归档或遗忘任何内容)。调度器持续调用 dream;dream-apply 是由调用方明确提供的应用操作,不属于定时器的一部分。选择一种调度器——launchd(macOS 标准工具,可在睡眠后补执行)、systemd user timer(Persistent=true,同样可补执行)或 cron(可移植性最高,但不会补执行)——三者都会运行同一个平台无关的 scripts/distill-prepare.sh。现成模板:scripts/com.compound-memory.distill-prepare.plist.tmpl(launchd)、scripts/compound-memory-distill-prepare.{service,timer}.example(systemd)和 scripts/compound-memory-distill-prepare.cron.example(cron)。填好的 launchd / systemd / cron 命令见中文版 README。脚本会运行 set -eu:任何失败都会以非零状态退出(可通过 launchctl list / systemctl --user list-timers / cron 邮件查看,日志位于 distill/prepare.log)。distill/ 是运行时产物目录(会自动加入 git 忽略列表)——不会产生提交噪声;只有在 Agent 完成判断后,distill-apply 才会提交一个原子提交。
每日维护(一个定时任务)
compound-memory maintain 是唯一的每日任务:只读执行 dream(写入 <root>/distill/last-plan.json,生成与 dream 相同的报告,绝不使用 --propose)→ 可选的 decay → health-snapshot。快照会在衰减后运行,因此如果运行了衰减,记录的就是衰减后的存储状态。默认执行 dream + health-snapshot。衰减默认关闭,除非传入 --with-decay 或设置 RUN_DECAY=1(DECAY=1 是别名)。任何步骤失败都会以非零状态退出,并在 stderr 中指出失败步骤;后续步骤不会运行。
scripts/distill-prepare.sh 仍是仅执行 dream 的准备路径。不要将定时任务指向 dream --propose、dream-apply 或 distill-apply(ADR-0001 / #72 / #97):提案和合并仍是需要人工/Agent 明确执行的步骤。scripts/daily-maintain.sh 是轻量的 launchd/cron 包装脚本(在 PATH 中解析 uv,然后执行 compound-memory maintain)。它不会编排这些步骤。
在检出目录中,只需一行 cron 配置(关闭衰减):
0 9 * * * COMPOUND_MEMORY_ROOT=$HOME/.agents/memory $HOME/.local/bin/uv run --project <repo> compound-memory maintain >> $HOME/.agents/memory/distill/daily-maintain.log 2>&1
启用衰减的同一任务:在前面加上 RUN_DECAY=1。launchd 的 ProgramArguments 数组可以使用相同的 uv、run、--project、<repo>、compound-memory、maintain(在 EnvironmentVariables 中设置 COMPOUND_MEMORY_ROOT,并且仅在需要衰减时设置 RUN_DECAY)。轻量包装脚本是确保不依赖 PATH 的替代方案:使用设置了 UV_BIN 的 /bin/sh <repo>/scripts/daily-maintain.sh。如果定时任务只需刷新 dream 报告,请继续使用 distill-prepare.sh。
文档
CHANGELOG.md— 发行说明(0.5.x 及后续版本的 Windows 支持)docs/specs/0001-compound-memory-spec.md— 设计规范docs/agent-integration.en.md— 简明英文设置指南(uvx、必需的 Agent ID、5 个工具、搜索 → 反馈 → 写入)docs/agent-integration.md— 各主机的 MCP 配置 + 统一使用协议(中文;完整指南)docs/eval/README.md— 如何记录“可以运行”与“相同任务是否因记忆而改变”。这是一个检查清单和一组小型固定提示词,不是经测量得出的效果声明docs/adr/— 架构决策记录CONTEXT.md— 术语表(中文)skills/compound-memory/SKILL.md— 主机使用规则(中文)
开发
uv run pytest tests/ -q # full suite (MCP tool boundary + distillation + lifecycle/index/CLI + input defense)
uv run mypy src/compound_memory/ # whole package, non-strict except the modules below
storage.validation、storage.paths 和 server 使用 pyproject.toml 中按模块设置的严格标志进行检查(与 CI 在 Ubuntu / Python 3.13 上运行的 mypy 调用相同)。其他模块仍使用较宽松的全局配置。不要在 [[tool.mypy.overrides]] 块中设置 strict = true:mypy 会将该配置应用于全局选项,从而对整个包进行严格检查。
测试切入点:通过进程内的 mcp.Client(server) 测试 MCP 工具边界(无需子进程),并为核心模块(评分 / 索引 / 存储操作)编写单元测试。CI 会在 Linux 和 Windows 上,针对 Python 3.11/3.12/3.13 运行测试、类型检查,以及纯 wheel 安装冒烟测试。
平台支持
macOS、Linux 和 Windows 上的 Python ≥ 3.11。
| macOS / Linux | Windows | |
|---|---|---|
| 安装 | pip / uv wheel 或克隆 | 相同。CI 安装纯 wheel,并运行 init / write / search / 服务入口点 |
| 写入锁 | flock,等待锁释放 | msvcrt 字节范围锁,轮询最长 30s。等待超时则写入失败(WriteLockError);不会在未加锁的情况下继续 |
| 无法创建锁文件 | 发出警告,继续写入,不加锁 | 相同。这是文件系统故障,而非锁竞争 |
| 文件权限 | 原子替换时保留 POSIX 模式位 | 不支持 POSIX 权限;跳过权限对齐步骤 |
| 向量召回 | 可选的 vec extra + 本地 BGE 模型 | 使用相同的代码路径。Windows CI 不安装 vec extra;缺少该项时会执行词法搜索,并通过 stats.retrieval 报告 |
| 定时蒸馏准备 | launchd、systemd 用户定时器或 cron(仅 dream 使用 distill-prepare.sh) | 不提供官方 Task Scheduler 模板;需自行将 cron 或 Task Scheduler 指向 scripts/distill-prepare.sh |
| 每日维护 | 一个 cron/launchd 任务:compound-memory maintain(或 scripts/daily-maintain.sh) | 相同命令。仅在使用 --with-decay 或 RUN_DECAY=1 时执行衰减 |
| Git 历史 | PATH 中的 git | 相同 |
发布
PyPI 版本不可变,且标签必须与 pyproject.toml 中的 version 匹配(发布工作流会验证这一点,若不匹配则明确报错)。发布通过 GitHub Actions + PyPI Trusted Publisher(OIDC,无需令牌)进行:推送类似 v0.1.0 的标签,release.yml 会自动构建并发布。
MCP Registry 名称:mcp-name: io.github.chinwe/compound-memory
server.json 记录 PyPI 软件包 compound-memory(stdio)。其中不包含仓库路径。主机配置仍使用 uvx --from compound-memory compound-memory-server,因为软件包名称与服务控制台脚本不同。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。