MemPalace Codex CLI 插件实战:为 Codex 配置持久记忆、MCP 工具与自动保存钩子
本文基于 MemPalace 仓库中的 Codex CLI 插件目录 .codex-plugin/ 展开,完整覆盖插件的安装方式、五个内置 Skill 的工作机制、SessionStart / Stop / PreCompact 三类钩子的调用链路,以及 MEMPAL_DIR 环境变量的语义。读完后,你可以把 MemPalace 以插件形式接入 Codex CLI,实现“会话结束与上下文压缩前自动入馆、语义检索所有已挖掘记忆”的完整闭环。
插件总览与目录结构
MemPalace 的 Codex 插件将“项目与对话挖掘 → ChromaDB 向量存储 → 44 个 MCP 工具 → 自动保存钩子 → 引导式 Skill”打包在仓库根目录的 .codex-plugin/ 下。官方 README 的一句话定位是:
Give your AI a persistent memory — mine projects and conversations into a searchable palace backed by ChromaDB, with 44 MCP tools, auto-save hooks, and guided skills.
当前目录的完整布局如下:
.codex-plugin/
├── README.md # 插件说明文档
├── plugin.json # 插件清单(name / version / skills / mcpServers / interface)
├── hooks.json # 钩子注册表(SessionStart / Stop / PreCompact)
├── hooks/
│ └── mempal-hook.sh # 钩子入口脚本,桥接到 `mempalace hook run`
└── skills/
├── help/SKILL.md
├── init/SKILL.md
├── mine/SKILL.md
├── search/SKILL.md
└── status/SKILL.md
其中 plugin.json 是插件清单,关键事实包括:
- 插件名为
mempalace,当前版本3.8.0,许可证 MIT,关键字包含memory、rag、mcp、chromadb等; "skills": "./skills/":告诉 Codex CLI 从该目录发现 Skill;"mcpServers": "./.mcp.json":声明 MCP 服务配置入口,插件运行时由此拉起mempalace-mcp进程;interface段定义了展示名MemPalace、分类Coding、能力位Interactive / Read / Write,以及三条默认提示词(如 “Mine this project into my memory palace”),这些会出现在 Codex 的插件选择界面中。
该 manifest 的结构在测试中受到校验,参见 tests/test_codex_plugin_manifest.py,保证清单字段不漂移。
前置条件
按 README 的 Prerequisites 一节,使用前需要准备:
- Python 3.9+;
- 已安装并配置好的 Codex CLI;
- MemPalace Python 包,推荐:
uv tool install mempalace
# 或
pip install mempalace
之所以要求脚本必须在全局 PATH 上,是因为 plugin.json 与钩子脚本都以裸命令名调用 mempalace / mempalace-mcp,而不是相对 venv 路径。
安装方式一:本地安装(复制目录到目标项目)
适合把插件带入任意现有项目,共三步:
# 1. 将 .codex-plugin 目录复制(或软链)到目标项目根目录
cp -r .codex-plugin /path/to/your/project/.codex-plugin
# 2. 验证插件被 Codex 发现
codex --plugins
# 3. 初始化你的记忆宫殿(palace)
codex /init
Codex CLI 的插件发现机制是扫描项目根目录下的 .codex-plugin/,读到 plugin.json 后注册其中声明的 Skill 与钩子,因此复制即生效,无需额外的注册命令。codex --plugins 输出中应能看到 mempalace 条目,作为检测成功的依据。
安装方式二:Git 安装(从源码检出)
如果直接从 MemPalace 仓库检出使用,README 给出了一条容易踩坑的注意事项:
git clone <MemPalace 仓库地址>
cd mempalace
# 以可编辑方式安装,使 mempalace-mcp 脚本落到 PATH 上
uv tool install --editable . # 或:pip install -e .
# 在仓库内启动 Codex,.codex-plugin 位于仓库根,会被自动发现
codex /init
README 特别强调:普通的 uv sync 在这里不够用 —— 它只会把脚本装进 .venv/bin/,而 Codex 进程不会激活该 venv,于是找不到 mempalace-mcp。用 uv tool install --editable . 或 pip install -e . 安装,脚本会落到全局工具环境,与 plugin.json 的裸名调用方式保持一致。
五个内置 Skill:对 instructions 的薄封装
插件自带 5 个斜杠命令(README 中的 Available Skills 表):
| Skill | 作用 |
|---|---|
/help |
显示可用命令与使用技巧 |
/init |
初始化一个新的记忆宫殿 |
/search |
跨所有已挖掘记忆做语义检索 |
/mine |
把一个项目或会话挖掘入馆 |
/status |
显示宫殿状态、房间数量与健康度 |
深入每个 Skill 文件会发现一个统一模式:SKILL.md 只是极薄的引导层,真正的“说明书”由 CLI 现取。以 init 的 SKILL.md 为例,其 frontmatter 声明了 name: init、用途描述和 allowed-tools: Bash, Read, Write, Edit,正文只有一条指令:
mempalace instructions init
并要求 Agent “follow the returned instructions step by step”(逐步遵循返回的指令)。其余四个 Skill(help、search、mine、status)结构完全一致,分别调用 mempalace instructions help|search|mine|status。
这种设计的收益在于:Skill 指令的维护集中在 mempalace/instructions/ 目录下的一组 Markdown 中(init.md、mine.md、search.md、status.md、help.md),由 instructions_cli.py 负责渲染输出。升级 MemPalace 包即可让所有 Skill 的引导话术同步更新,而插件目录本身几乎不需要改动。同时 allowed-tools 字段做了最小授权:例如 mine 额外开放了 Glob, Grep 以便扫描文件,而 help / status 只允许 Bash, Read。
自动保存钩子:三条触发链路
钩子注册:hooks.json
.codex-plugin/hooks.json 注册了三个 Codex 生命周期事件,全部使用 matcher: "*"(无条件命中),命令形如:
"hooks": {
"SessionStart": [ { "matcher": "*", "hooks": [
{ "type": "command",
"command": "\"${CODEX_PLUGIN_ROOT}/hooks/mempal-hook.sh\" session-start" } ] } ],
"Stop": [ { "matcher": "*", "hooks": [
{ "type": "command",
"command": "\"${CODEX_PLUGIN_ROOT}/hooks/mempal-hook.sh\" stop" } ] } ],
"PreCompact": [ { "matcher": "*", "hooks": [
{ "type": "command",
"command": "\"${CODEX_PLUGIN_ROOT}/hooks/mempal-hook.sh\" precompact" } ] } ]
}
${CODEX_PLUGIN_ROOT} 是 Codex 注入的插件根目录变量,使钩子脚本不依赖插件被复制到的具体路径。
钩子脚本:桥接 Python 实现
mempal-hook.sh 全文仅 9 行,职责是把 Codex 以 stdin 传入的 JSON 事件负载转发给 Python 侧的统一入口:
#!/usr/bin/env bash
set -euo pipefail
HOOK_NAME="${1:?Usage: mempal-hook.sh <hook-name>}"
INPUT_FILE=$(mktemp) || { echo "Failed to create temp file" >&2; exit 1; }
cat > "$INPUT_FILE"
cat "$INPUT_FILE" | mempalace hook run --hook "$HOOK_NAME" --harness codex
EXIT_CODE=$?
rm -f "$INPUT_FILE" 2>/dev/null
exit $EXIT_CODE
要点:
--harness codex告诉 Python 侧当前宿主是 Codex CLI,钩子处理器会按 harness 差异解析 stdin 负载形态;- 脚本先落盘临时文件再回放,避免管道消费一次 stdin 后无法复用;
- 退出码原样透传,方便宿主检测钩子执行失败。
Python 侧的挖掘语义(源码佐证)
mempalace hook run 的实现位于 mempalace/hooks_cli.py,其中值得注意的语义有三条:
- 对话挖掘永远发生,项目挖掘是“加法”。
MEMPAL_DIR(见下节)贡献的是一个"projects"目标,从源码结构看(hooks_cli.py#L261-L269):当MEMPAL_DIR已设置且可解析时,返回项目挖掘目标列表;空列表表示“本次不跑 MEMPAL_DIR 挖掘”。也就是说,即便不设置MEMPAL_DIR,钩子仍会自动以--mode convos挖掘当前会话转录(CHANGELOG 中亦有对应记录:“Save hook auto-mines transcripts even whenMEMPAL_DIRis unset (#840)”)。 - Stop 与 PreCompact 的时序不同:stop 路径下
MEMPAL_DIR挖掘以后台任务方式发起(hooks_cli.py#L754 附近),不阻塞会话结束;而 precompact 路径改为同步执行(hooks_cli.py#L800 附近),确保压缩上下文之前项目数据已经入库。 - 行为有完整测试覆盖:tests/test_hooks_cli.py 覆盖了大量分支,包括“未设置 MEMPAL_DIR 且无转录路径时什么都不做”、“MEMPAL_DIR 支持
~前缀展开”、“设置了 MEMPAL_DIR 时恰好产生一个 projects 目标、绝不产生 convos 目标”、“precompact 走subprocess.run同步路径”等。
MEMPAL_DIR 环境变量
README 的 Hooks 一节说明:把 MEMPAL_DIR 设为某个目录,每次保存触发时都会自动对该目录执行 mempalace mine。补充仓库中钩子文档的更精确表述(hooks/README.md):
- 钩子始终自动挖掘当前会话转录(
--mode convos),MEMPAL_DIR纯粹是增量(additive),永不覆盖或替代转录挖掘; - 典型配置如
MEMPAL_DIR="$HOME/projects/my_app",保存触发时额外执行mempalace mine "$MEMPAL_DIR" --mode projects(可对照 hooks/mempal_precompact_hook.sh 中的同款逻辑); - 不需要摄入项目文件时留空即可。
验证与故障排查
- 插件未被发现:先跑
codex --plugins;确认.codex-plugin/位于 Codex 启动时的项目根目录、plugin.json存在且为合法 JSON(其字段约束由 tests/test_codex_plugin_manifest.py 固化); - 钩子报找不到命令:多为
mempalace不在 PATH 上,用which mempalace检查;若此前只执行过uv sync,请改按上文用uv tool install --editable .重装; - 想确认挖掘是否真的发生:用
/statusSkill 查看房间数量变化,或查看插件目录下 hooks 脚本的 stdout/错误输出(脚本以set -euo pipefail运行,任何一步失败都会以非零退出码暴露)。
小结
.codex-plugin/ 目录体现了 MemPalace 接入 Codex CLI 的完整形态:plugin.json 负责身份与发现、skills/ 把五个斜杠命令薄封装到 mempalace instructions <name> 的动态引导、hooks.json + mempal-hook.sh 把 SessionStart / Stop / PreCompact 三条生命周期事件桥接到 mempalace hook run --harness codex,而 MEMPAL_DIR 为“会话必挖、项目可加”的自动摄入策略提供了唯一的配置旋钮。所有关键行为均可在 tests/test_hooks_cli.py 与 tests/test_codex_plugin_manifest.py 中找到可回归的验证依据。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00