适用环境:macOS + bash + Python 3.11+。
目标:把当前唯一保留的链路跑通:
SessionStart注入背景,Stop归档 session 并按规则触发 reflection,reflection 写 memory /csep-reflect-*skill,csep recall从 session 库召回历史上下文。
先确认本机有 Codex CLI 和 uv:
which uv
codex --version普通用户不需要 clone 仓库。直接跑:
uvx csep setup这条命令会安装 csep CLI、注册 Codex plugin marketplace,并打开 ~/.codex/config.toml 里的 plugin hooks 开关。
也可以用 curl 包装:
curl -fsSL https://raw.githubusercontent.com/T0UGH/codex-self-evolution-plugin/main/scripts/setup.sh | bash本地开发者如果要从当前 checkout 安装,可以继续用:
scripts/install.shcsep setup 已经会启用插件。通常不需要手动初始化配置;没有配置文件时会使用默认值。
查看配置路径:
csep config path写入默认配置:
csep config init
csep config validate默认配置:
schema_version = 2
[session_reflection]
enabled = true
backend = "codex-app-server"
model = "gpt-5.3-codex-spark"
ephemeral = true
sandbox = "danger-full-access"
approval_policy = "never"
skill_prefix = "csep-reflect-"
timeout_seconds = 900
max_concurrent_jobs = 1
[session_reflection.trigger]
enabled = true
memory_stop_interval = 3
memory_context_chars = 16000
skill_tool_call_interval = 15
high_signal_immediate = true
skill_generation_mode = "one_shot_active"
active_job_stale_seconds = 1800
[session_recall]
enabled = true
stop_hook_archive = true
[log]
retention_days = 14默认的 sandbox = "danger-full-access" 和 approval_policy = "never" 是为了让后台 reflection 能无阻塞完成写入和 receipt 落盘。它的信任边界不在 child 自述,而在父进程的 receipt validation:路径、hash、job identity、memory root 和 csep-reflect-* skill namespace 都会被校验。低信任或共享环境可以调低这两个值,但后台 reflection 可能因此需要人工确认或无法完成。
csep setup 会写入或更新 ~/.codex/config.toml:
[features]
plugins = true
hooks = true
plugin_hooks = true
[plugins."codex-self-evolution@codex-self-evolution"]
enabled = true插件声明文件:
plugins/codex-self-evolution/.codex-plugin/plugin.json
plugins/codex-self-evolution/.codex-plugin/hooks.json
声明的生命周期入口:
SessionStart -> csep session-start --from-stdin
Stop -> csep session-stop --from-stdin
如果当前 Codex CLI 还不支持 plugin_hooks,插件不会生效;先升级 Codex,再重跑 uvx csep setup。
手工写一条 memory 到当前 repo bucket:
REPO=$(pwd)
BUCKET=~/.codex-self-evolution/projects/$(python3 -c "import os; print(os.getcwd().replace('/', '-'))")
mkdir -p "$BUCKET/memory/refs"
cat > "$BUCKET/memory/MEMORY.md" <<'EOF'
# Project Memory
My favorite test passphrase is XANADU_RIVER_442.
EOF新开一次 Codex 会话并提问:
codex exec --json 'What is my favorite test passphrase?' 2>/dev/null | grep -i XANADU看到 passphrase 即表示 SessionStart 已把 stable background 注入当前会话。测试后清理:
rm "$BUCKET/memory/MEMORY.md"正常跑一次 Codex:
codex exec 'Say one sentence in Chinese to test my Stop hook.'Stop hook 会快速返回;如果触发规则认为需要 reflection,会在后台创建 job。等待 15 到 30 秒后查看:
csep session-reflect --status | python3 -m json.tool
csep status | python3 -m json.tool关注:
| 字段 | 含义 |
|---|---|
session_reflection.latest.status |
最新 job 状态 |
session_reflection.global_lock |
全局 reflection 锁状态 |
session_reflection.trigger.latest_state |
当前 session 的计数器与最近决策 |
session_recall.db_exists |
session recall 数据库是否存在 |
失败时先看:
~/.codex-self-evolution/session_reflection/latest.json
~/.codex-self-evolution/session_reflection/runs/<job_id>/receipt.json
~/.codex-self-evolution/session_reflection/runs/<job_id>/validation.json
/tmp/codex-self-evolution/session-reflect-*.log
~/.codex-self-evolution/logs/plugin.log
保存一份 Stop payload 后,可以手动创建并执行 job:
csep session-reflect --hook-payload /path/to/stop-payload.json | python3 -m json.tool只查看状态:
csep session-reflect --status | python3 -m json.tool只要 validation.status 是 succeeded,说明 child thread 的写入声明和父进程边界校验都通过。
Stop hook 默认会把 transcript 归档到本机 SQLite/FTS:
~/.codex-self-evolution/session_recall/state.db
召回当前 repo 的历史片段时,把 csep recall 当作 rg over past sessions:搜短 needle,不搜长问题。
csep recall "trigger policy|review_memory|review_skills"
csep recall --recent跨 repo 检索:
csep recall "session reflection|reflection job" --global输出 JSON 便于调试:
csep recall "session reflection|reflection job" --format json | python3 -m json.tool手动归档单个 transcript:
csep session-archive --transcript-path /path/to/session.jsonl --cwd /path/to/repo --session-id <id>回填历史 Codex sessions:
csep recall bootstrap --root ~/.codex/sessions --since-days 14同步历史 Claude Code sessions:
csep recall sync-claude --root ~/.claude/projects --since-days 14先确认 Codex 支持插件 hook:
codex --help 2>&1 | grep -i plugin
codex plugin --help 2>&1 | head -20再确认本地 plugin cache 已刷新:
scripts/install.sh
csep status | python3 -m json.tool发布或排障前可以额外跑 runtime smoke。脚本使用临时 state dir,不会污染默认 recall DB:
scripts/smoke-runtime.sh这是正常状态之一。常见原因:
- 当前 session 计数器还没达到 nudge interval
- 只有归档价值,没有触发 reflection 的高信号
- 同一个父 session 已有活跃 job,递归保护生效
[session_reflection] enabled = false
查看 session_reflection.trigger.latest_state.last_decision 可以知道具体原因。
优先查看:
csep session-reflect --status | python3 -m json.tool
tail -50 ~/.codex-self-evolution/logs/plugin.log常见原因:
codex app-server proxy当前不可用- child thread 没写
receipt.json - receipt 声明的写入路径越界
- skill 前缀不是
csep-reflect-
确认归档是否打开:
csep config show | python3 -m json.tool
csep status | python3 -m json.tool如果是新安装,先跑几次真实 Codex 会话,或者手动回填:
csep recall bootstrap --root ~/.codex/sessions --limit-files 50重置当前 repo bucket:
BUCKET=~/.codex-self-evolution/projects/$(python3 -c "import os; print(os.getcwd().replace('/', '-'))")
rm -rf "$BUCKET"重置 session 级运行状态:
rm -rf ~/.codex-self-evolution/session_reflection
rm -rf ~/.codex-self-evolution/session_recall不会删除 ~/.codex-self-evolution/config.toml 和 .env.provider。