Reasonix 全局状态在 ~/.reasonix/,项目状态在项目目录里,运行时再分两块。搞清楚每个目录装什么,备份脚本就是抄抄路径。最棘手的是 .env —— 它已经被 MCP 子进程环境过滤掉,但你还是想用版本管它,只是不存明文。



备份脚本
#!/usr/bin/env bash
# 备份 Reasonix 状态用于归档或迁移。
# 默认 REASONIX_HOME=~/.reasonix(Linux/macOS)。
set -euo pipefail
STAMP=$(date -u +%Y%m%dT%H%M%SZ)
BACKUP_DIR="${REASONIX_BACKUP_DIR:-$HOME/Documents/reasonix-backup-$STAMP}"
mkdir -p "$BACKUP_DIR"
# 1. 全局配置(TOML,可直接归档)
cp -a "$HOME/.reasonix/config.toml" "$BACKUP_DIR/config.toml"
# 2. 全局 .env —— 留原始;同步到 git 前做脱敏
cp -a "$HOME/.reasonix/.env" "$BACKUP_DIR/env.raw"
sed -E 's/=.*$/=<REDACTED>/' "$BACKUP_DIR/env.raw" > "$BACKUP_DIR/env.example"
# 3. skills / commands / hooks
for d in skills commands; do
[ -d "$HOME/.reasonix/$d" ] && cp -a "$HOME/.reasonix/$d" "$BACKUP_DIR/$d"
done
[ -f "$HOME/.reasonix/settings.json" ] && cp -a "$HOME/.reasonix/settings.json" "$BACKUP_DIR/settings.json"
# 4. 会话与 checkpoint(最大块,可选)
STATE_ROOT="${REASONIX_STATE_HOME:-$HOME/.reasonix}"
if [ -d "$STATE_ROOT/sessions" ]; then
tar czf "$BACKUP_DIR/sessions.tgz" -C "$STATE_ROOT" sessions
fi
# 5. memory
if [ -d "$STATE_ROOT/memory" ]; then
tar czf "$BACKUP_DIR/memory.tgz" -C "$STATE_ROOT" memory
fi
echo "wrote $BACKUP_DIR"从备份恢复
#!/usr/bin/env bash
# 用上面的备份目录恢复。
set -euo pipefail
BACKUP_DIR="${1:?usage: reasonix-restore.sh <backup-dir>}"
# 1. 全局配置
mkdir -p "$HOME/.reasonix"
cp -a "$BACKUP_DIR/config.toml" "$HOME/.reasonix/config.toml"
# 2. .env —— 缺了才覆盖,避免覆盖更新的 key
if [ ! -f "$HOME/.reasonix/.env" ]; then
cp -a "$BACKUP_DIR/env.raw" "$HOME/.reasonix/.env"
chmod 600 "$HOME/.reasonix/.env"
else
echo "warning: ~/.reasonix/.env 已存在,保持不动"
fi
# 3. skills / commands / hooks
for d in skills commands; do
[ -d "$BACKUP_DIR/$d" ] && cp -an "$BACKUP_DIR/$d" "$HOME/.reasonix/$d"
done
[ -f "$BACKUP_DIR/settings.json" ] && cp -an "$BACKUP_DIR/settings.json" "$HOME/.reasonix/settings.json"
# 4. 会话 / memory
STATE_ROOT="${REASONIX_STATE_HOME:-$HOME/.reasonix}"
[ -f "$BACKUP_DIR/sessions.tgz" ] && tar xzf "$BACKUP_DIR/sessions.tgz" -C "$STATE_ROOT"
[ -f "$BACKUP_DIR/memory.tgz" ] && tar xzf "$BACKUP_DIR/memory.tgz" -C "$STATE_ROOT"
# 5. 校验
reasonix doctor capabilities各个目录装什么
| 用途 | 路径 | 备注 |
|---|---|---|
| 全局配置 | ~/.reasonix/config.toml | TOML,脱敏后可入库。 |
| 全局 API key | ~/.reasonix/.env | key 字符串本身。绝不直接入库。把 .env 加进 ignore,留一份脱敏的 .env.example。 |
| 项目配置 | ./reasonix.toml | TOML,项目级 provider / permissions / MCP。 |
| 项目 .env | ./.env | 非 provider 的 ${VAR},给 MCP / 插件设置用。不放 Reasonix 控制变量。 |
| 会话与历史 | JSONL transcript + 每个会话一个 <id>.ckpt/ 目录存 checkpoint。 |
|
| Skills | ~/.reasonix/skills/ 与 |
你自己写的 Markdown playbook。 |
| 斜杠命令 | ~/.reasonix/commands/ 与 |
自定义命令文件。 |
| Hooks | ~/.reasonix/settings.json | hook 定义。存的是 JSON 不是 TOML。 |
| Memory | pinned facts 与项目记忆。 | |
| Cache | $XDG_CACHE_HOME/reasonix/ | 可以从配置重新生成;除非磁盘紧,否则不用备份。 |
常见问题
/rewind的快照在<state root>/sessions/<id>.ckpt/,紧贴 JSONL。备份时整目录拷,单拷 JSONL 会丢 rewind 历史。- Reasonix 把
.env强制设成chmod 600,因为 provider key 敏感。恢复时保住这个权限;别让备份流水线静悄悄改成 644。 - 完整会话 + memory 是备份里最大块。保留期不到 30 天的话,把
sessions/tarball 从日常备份里去掉 —— Reasonix 默认 30 天就会清。 REASONIX_HOME和REASONIX_STATE_HOME能把配置与会话分开。CI runner 上把REASONIX_STATE_HOME指到临时存储,REASONIX_HOME留在镜像里。- 用旧
config.toml覆盖新文件,可能丢用户后来加的 provider。覆盖前先 diff。
评论