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

Reasonix 各目录文件一览

Reasonix 一轮交互的流程:输入 → 上下文 → 模型 → 工具

Reasonix 版本时间线:0.x TS 老分支、1.0 Go 重写、当前 1.17.x

备份脚本

Bash
#!/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"

从备份恢复

Bash
#!/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 控制变量。
会话与历史 /sessions/ JSONL transcript + 每个会话一个 <id>.ckpt/ 目录存 checkpoint。
Skills ~/.reasonix/skills/ 与 /.reasonix/skills/ 你自己写的 Markdown playbook。
斜杠命令 ~/.reasonix/commands/ 与 /.reasonix/commands/ 自定义命令文件。
Hooks ~/.reasonix/settings.json hook 定义。存的是 JSON 不是 TOML。
Memory /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_HOMEREASONIX_STATE_HOME 能把配置与会话分开。CI runner 上把 REASONIX_STATE_HOME 指到临时存储,REASONIX_HOME 留在镜像里。
  • 用旧 config.toml 覆盖新文件,可能丢用户后来加的 provider。覆盖前先 diff。

资料来源

最后修改: 2026年7月23日

作者

评论

发表评论

您的邮箱地址不会被公开。