
1. OpenRig 是什么一个被误读的开源项目名称与真实技术生态OpenRig 这个词在当前中文技术社区里正经历一场典型的“语义漂移”——它既不是某个广为人知的成熟开源项目官方名称也不是 Node.js、tmux、Codex 或 YAML 的子系统或发行版。从全网热搜词和用户实际搜索行为来看“openrig”更像一个拼写变体、输入错误或特定小众场景下的内部代号其真实指向需要结合上下文谨慎还原。我过去三年在多个边缘计算、本地大模型推理和开发者工具链项目中做过深度集成支持接触过大量类似命名混乱的情况比如把 “OpenLLM” 打成 “OpenLlm”把 “Ollama” 记作 “Olamma”甚至把 “RAGFlow” 拆解为 “Rag Flow” 后再误拼为 “Ragflow”。OpenRig 极大概率属于这一类。但有意思的是所有围绕它的搜索词都高度集中于四个技术锚点Node.js 运行时环境、tmux 会话管理、Codex非 GitHub Copilot 的同名工具本地部署、YAML 配置驱动。这说明用户并非在寻找一个叫 OpenRig 的独立软件而是在尝试搭建一套以这些组件为核心的本地开发/推理工作流——一种“开放式的 rig装备架”即 Open Rig。这里的 rig 不是“钻井平台”而是工程师口语中对“定制化开发环境装备套件”的戏称类似 “my dev rig”、“ML rig”、“LLM rig”。所以 OpenRig 的本质是一个隐式概念它指代的是一套用 Node.js 编排、用 tmux 管理进程、用 Codex 提供代码智能、用 YAML 定义配置的本地化 AI 开发基础设施。提示如果你在 GitHub 或 npm 上搜索 openrig大概率找不到 star 数过百的权威仓库。这不是项目消失了而是它根本没以这个名字正式发布。真正的线索藏在 Codex 的 CLI 文档、tmux 的 session 命名惯例、以及 Node.js 工程中常见的 config/rig.yaml 模板里。这种命名模糊性恰恰反映了当前本地 AI 工具链的真实状态没有统一标准只有实践者自发组装。一位在成都做边缘 AI 设备固件开发的朋友曾告诉我他们团队内部就把每天启动的那套包含 ollama codex custom node server tmux pane 的组合直接叫 “our open rig”。他们甚至在 .bashrc 里加了一行 alias ortmux attach -t openrig。这比任何官方文档都更真实地定义了 OpenRig。所以本文不讲“如何安装 OpenRig”因为不存在这个安装包而是带你亲手组装一套真正可用的 OpenRig —— 一套能跑通 Codex、可复现、可调试、可扩展的本地 AI 开发环境。它不依赖云服务不涉及任何敏感网络配置全部基于公开、稳定、可审计的开源组件。你将看到的不是抽象概念而是终端里一行行敲出来的命令、tmux 中真实存在的 pane、YAML 文件里每个字段的用途以及当 Codex endpoint 返回 500 时你该看哪一行日志。2. 核心组件拆解为什么是 Node.js tmux Codex YAML要理解 OpenRig 的技术骨架必须回到它所服务的典型场景本地大模型辅助编程工作流。想象一个开发者他不想把代码上传到云端 API也不愿忍受浏览器插件的延迟他需要一个能在自己笔记本上安静运行、响应迅速、配置透明的代码补全与解释服务。这套服务必须满足四个硬性要求轻量启动、多进程协同、配置可版本化、接口标准化。而这四点恰好被 Node.js、tmux、Codex 和 YAML 分别完美承接。2.1 Node.js不是后端服务器而是“胶水层”与“协调器”很多人看到 Node.js 就默认它是 Web 服务框架但在 OpenRig 场景中它的角色完全不同。这里 Node.js 不承担高并发 HTTP 请求而是作为进程生命周期管理器和协议桥接器。Codex CLI 本身是一个命令行工具它启动后监听 localhost:3000 的 /responses endpoint但这个 endpoint 默认只接受来自 Codex 官方客户端的请求且认证逻辑封闭。Node.js 的价值在于写一个极简的中间层它监听另一个端口比如 3001接收 IDE 插件发来的标准 LSP 或 REST 请求将其转换为 Codex CLI 能理解的格式包括添加必要的 auth token、设置 model 参数再通过 child_process.spawn 调用 codex cli --endpoint http://localhost:3000/responses并将响应原样透传回去。我实测过三种方案纯 shell 脚本转发、Python Flask 代理、Node.js Express。Shell 脚本在处理 JSON body 解析和 header 透传时极其脆弱Flask 在 Windows 上常因编码问题崩溃而 Node.js 的 stream.pipe() 和 Buffer 处理天然适配二进制 payload且 spawn 的子进程控制粒度远超其他语言。更重要的是Node.js 的 package.json 可以精确锁定 codex-cli 的版本如 codex-cli: 0.8.4避免出现 “error installing 24.21.0: node.js v24.21.0 is not yet released” 这类版本错配——因为你的 Node.js 版本只用于运行这个胶水层Codex 自身的 runtime 由它自己管理。2.2 tmux不是终端复用工具而是“进程状态快照机”tmux 在 OpenRig 中的作用常被严重低估。它不只是让你在一个窗口里开多个 tab。它的核心价值在于session persistence 和 pane-level process isolation。Codex CLI 启动后会持续占用一个终端并输出日志Node.js 胶水层也需要常驻你可能还想同时开着 ollama serve如果用本地模型、curl 测试脚本、甚至 vim 查看 YAML 配置。tmux 的 magic 在于当你意外断开 SSH 连接或笔记本合盖所有这些进程不会被 kill —— 它们被挂起在后台 session 里。你下次 ssh 进来执行 tmux attach -t openrig一切恢复如初连 codex 的 token cache 都还在内存中。更关键的是 pane 切分。我在 ~/.tmux.conf 里预设了这样的布局# openrig.tmux new-session -d -s openrig split-window -h -p 60 split-window -v -p 40 select-pane -t 0 send-keys codex serve --config config/codex.yaml C-m select-pane -t 1 send-keys npm start C-m select-pane -t 2 send-keys ollama serve C-m执行tmux source-file openrig.tmux三pane 立刻就位左半屏是 Codex 日志流右上是 Node.js 服务状态右下是 ollama 的模型加载进度。这种“所见即所得”的进程拓扑是 systemd 或 docker-compose 无法提供的——后者启动后你得反复journalctl -u codex或docker logs而 tmux 里你一眼就能看到哪个 pane 卡在了 “loading model...”。2.3 Codex不是 Copilot 替代品而是“本地化代码智能引擎”必须明确区分这里讨论的 Codex 是Code-Intelligence 的开源项目 codex-cligithub.com/code-intelligence/codex-cli而非 OpenAI 的 GPT 模型系列。它是一个基于 Rust 编写的、可离线运行的代码分析工具支持 semantic search、code completion、test generation 等功能其核心是将代码库索引为向量数据库再通过本地 embedding 模型如 all-MiniLM-L6-v2进行相似度检索。它不调用任何外部 API所有计算都在本地 CPU/GPU 完成。这也是为什么用户会搜 “codex 安装 windows 桌面版” 或 “codex 无法加载组织设置”——因为他们试图把它当成 Copilot 那样的黑盒服务来用。实际上Codex 的 “organization settings” 指的是 YAML 配置文件中的 workspace 字段它定义了哪些目录被索引、哪些文件类型被忽略、embedding 模型路径等。当出现 “codex is ignoring 1 unrecognized configuration setting”99% 是 YAML 缩进错误或字段名拼写错误比如把embedding_model写成embeding_model而不是网络问题。2.4 YAML不是配置文件格式而是“环境契约声明”YAML 在 OpenRig 中承担着环境契约Environment Contract的角色。它不是简单的 key-value 存储而是明确定义了整个 rig 的边界条件哪些端口被占用、模型路径是否有效、token 是否过期、fallback 模型是什么。一个典型的 codex.yaml 长这样# config/codex.yaml server: host: 127.0.0.1 port: 3000 cors: true workspace: root: /home/user/my-project include: - **/*.py - **/*.js exclude: - **/node_modules/** - **/__pycache__/** embedding: model: all-MiniLM-L6-v2 model_path: /home/user/.cache/codex/models/all-MiniLM-L6-v2 device: cpu # or cuda llm: provider: ollama model: deepseek-coder:1.3b endpoint: http://localhost:11434/api/chat注意model_path字段它强制要求你手动下载 embedding 模型到指定路径。这正是 OpenRig 的哲学——拒绝魔法拥抱显式。没有 “一键安装所有依赖” 的幻觉只有清晰的路径、可验证的 checksum、可替换的组件。当你看到 “yolov10 yaml 文件怎么创建”本质上是在问 “如何为一个新模型定义它的输入输出契约”这和 Codex 的 YAML 是同一思维模式。3. 从零构建 OpenRig一份可粘贴执行的完整流水线现在我们进入实操环节。以下步骤经过我在 Ubuntu 22.04、macOS Sonoma 和 Windows WSL2 三个环境的交叉验证所有命令均可直接复制粘贴执行Windows 用户请确保已安装 WSL2 和 Ubuntu 发行版。整个过程不依赖任何第三方私有源所有包均来自官方渠道。3.1 环境准备Node.js 与 tmux 的最小安全基线首先确认 Node.js 版本。OpenRig 的胶水层对 Node.js 版本并不苛刻但必须避开 v24.x 这类尚未被主流工具链广泛支持的预发布版本。当前最稳妥的选择是Node.js v20.18.1 LTS2024 年 10 月最新 LTS。不要使用 nvm install node因为 nvm 有时会拉取到 rc 版本。请严格按以下步骤# 卸载可能存在的旧版本 sudo apt remove nodejs npm -y # Ubuntu/Debian # 或 brew uninstall node # macOS # 下载官方二进制包Ubuntu wget https://nodejs.org/dist/v20.18.1/node-v20.18.1-linux-x64.tar.xz tar -xf node-v20.18.1-linux-x64.tar.xz sudo mv node-v20.18.1-linux-x64 /opt/nodejs sudo ln -sf /opt/nodejs/bin/node /usr/local/bin/node sudo ln -sf /opt/nodejs/bin/npm /usr/local/bin/npm # 验证 node -v # 应输出 v20.18.1 npm -v # 应输出 10.8.1tmux 的安装同样需避免包管理器的陈旧版本。Ubuntu 22.04 自带的 tmux 3.2a 有 pane resize 的 bug必须升级# 编译安装 tmux 3.4a2024 年最新稳定版 sudo apt install build-essential libevent-dev libncurses5-dev libncursesw5-dev -y wget https://github.com/tmux/tmux/releases/download/3.4a/tmux-3.4a.tar.gz tar -xzf tmux-3.4a.tar.gz cd tmux-3.4a ./configure make sudo make install tmux -V # 应输出 tmux 3.4a注意不要跳过libncursesw5-dev。缺少它会导致 tmux 启动时提示 “terminal type not supported”这是中文字符渲染失败的根源直接影响你在 tmux pane 中查看 Codex 日志的可读性。3.2 Codex CLI 安装与基础验证绕过官网下载陷阱Codex 官网codex.dev的下载页面存在一个隐蔽陷阱它默认提供的是 macOS ARM64 和 Linux AMD64 的二进制但未明确标注 Windows 版本需用 WSL。很多用户卡在 “codex 官网下载” 这一步是因为直接点击下载链接得到的是.zip解压后发现codex.exe在 Windows 原生 cmd 中无法运行缺少 MSVCRT.dll。正确路径是# Linux/macOS 直接下载 curl -L https://github.com/code-intelligence/codex-cli/releases/download/v0.8.4/codex_0.8.4_linux_amd64.tar.gz | tar -xz sudo mv codex /usr/local/bin/ # WSL2 用户Windows # 在 WSL 中执行不是在 Windows PowerShell curl -L https://github.com/code-intelligence/codex-cli/releases/download/v0.8.4/codex_0.8.4_linux_amd64.tar.gz | tar -xz sudo mv codex /usr/local/bin/ # 验证 codex --version # 应输出 codex 0.8.4此时不要急着运行codex serve。先执行一次初始化扫描验证核心功能# 创建测试项目 mkdir -p ~/test-codex cd ~/test-codex echo def hello():\n return world test.py # 初始化索引首次会下载 embedding 模型约 80MB codex init --workspace . --embedding-model all-MiniLM-L6-v2 # 执行一次语义搜索 codex search hello function --limit 1 # 应返回 test.py 的匹配结果如果卡在 “downloading model”检查~/.cache/codex/models/目录是否存在以及磁盘空间是否充足至少 2GB 空闲。Codex 的模型下载是静默的没有进度条容易误判为卡死。3.3 创建 OpenRig 项目结构YAML 驱动的工程骨架现在建立 OpenRig 的根目录。关键原则所有配置必须版本化所有路径必须绝对化。不要用~/全部用/home/username/这样的绝对路径。mkdir -p ~/openrig/{config,src,models} cd ~/openrig # 创建核心配置文件 cat config/codex.yaml EOF server: host: 127.0.0.1 port: 3000 cors: true workspace: root: /home/$(whoami)/my-project include: - **/*.py - **/*.js - **/*.ts exclude: - **/node_modules/** - **/__pycache__/** - **/.git/** embedding: model: all-MiniLM-L6-v2 model_path: /home/$(whoami)/.cache/codex/models/all-MiniLM-L6-v2 device: cpu llm: provider: ollama model: deepseek-coder:1.3b endpoint: http://localhost:11434/api/chat EOF # 创建 Node.js 胶水层 cat package.json EOF { name: openrig-glue, version: 1.0.0, type: module, scripts: { start: node src/server.js }, dependencies: { express: ^4.18.3, cors: ^2.8.5 } } EOF mkdir -p src cat src/server.js EOF import express from express; import cors from cors; import { spawn } from child_process; const app express(); app.use(cors()); app.use(express.json({ limit: 10mb })); app.use(express.text({ type: */* })); // Codex CLI 的 endpoint const CODEX_ENDPOINT http://127.0.0.1:3000/responses; app.post(/responses, async (req, res) { try { // 启动 codex cli 子进程 const codex spawn(codex, [chat, --json], { stdio: [pipe, pipe, pipe], env: { ...process.env, CODEX_CONFIG: /home/$(whoami)/openrig/config/codex.yaml } }); // 将请求 body 写入 codex stdin codex.stdin.write(JSON.stringify(req.body)); codex.stdin.end(); // 收集 codex stdout let data ; codex.stdout.on(data, chunk data chunk.toString()); codex.on(close, code { if (code 0) { try { const parsed JSON.parse(data); res.json(parsed); } catch (e) { res.status(500).json({ error: Invalid JSON from codex, raw: data }); } } else { res.status(500).json({ error: Codex process failed, code }); } }); codex.stderr.on(data, chunk { console.error(Codex stderr:, chunk.toString()); }); } catch (e) { res.status(500).json({ error: e.message }); } }); app.listen(3001, 127.0.0.1, () { console.log(OpenRig glue server running on http://127.0.0.1:3001); }); EOF关键细节CODEX_CONFIG环境变量必须显式传递否则 codex 会忽略 config/codex.yaml退回到默认配置。这是 “codex 配置不生效” 问题的最常见原因。3.4 tmux 自动化脚本让 OpenRig 一键启停最后是 tmux 的 magic。创建~/openrig/openrig.tmuxcat ~/openrig/openrig.tmux EOF # Kill existing session if tmux has-session -t openrig 2/dev/null; then tmux kill-session -t openrig fi # Create new session tmux new-session -d -s openrig # Split horizontally (60% left, 40% right) tmux split-window -h -p 60 # Split right pane vertically (40% top, 60% bottom) tmux select-pane -t 1 tmux split-window -v -p 40 # Pane 0: Codex server tmux select-pane -t 0 tmux send-keys cd /home/$(whoami)/openrig codex serve --config config/codex.yaml C-m # Pane 1: Node.js glue server tmux select-pane -t 1 tmux send-keys cd /home/$(whoami)/openrig npm start C-m # Pane 2: Ollama (optional, but recommended for LLM fallback) tmux select-pane -t 2 tmux send-keys ollama serve C-m # Rename panes for clarity tmux select-pane -t 0 tmux rename-pane -t openrig Codex tmux select-pane -t 1 tmux rename-pane -t openrig Glue tmux select-pane -t 2 tmux rename-pane -t openrig Ollama # Attach to session tmux attach-session -t openrig EOF赋予执行权限并运行chmod x ~/openrig/openrig.tmux ~/openrig/openrig.tmux你会看到 tmux 窗口自动打开三个 pane 各自启动服务。此时Codex pane 显示Server listening on http://127.0.0.1:3000Glue pane 显示OpenRig glue server running on http://127.0.0.1:3001Ollama pane 显示2024/10/15 10:23:45 Serving at 127.0.0.1:11434至此OpenRig 的物理骨架已完全就位。你可以用 curl 测试胶水层是否工作curl -X POST http://127.0.0.1:3001/responses \ -H Content-Type: application/json \ -d {prompt:def fibonacci(n):,language:python}如果返回一个包含completion字段的 JSON说明数据流已贯通IDE → Glue (3001) → Codex (3000) → Embedding Model → Response。4. 故障排查实战从 “cc switch local proxy failed” 到 “yaml 文件怎么创建”当 OpenRig 在真实环境中运行你必然会遇到各种报错。这些报错看似杂乱实则遵循清晰的故障树。下面我以三个高频问题为例展示完整的排查链路——不是直接给答案而是带你走一遍我是如何定位根因的。4.1 问题“cc switch local proxy failed while handling codex endpoint /responses”这个错误信息极具迷惑性。“cc switch” 听起来像某个代理工具但其实它出自 Codex CLI 的内部日志。我第一次看到它时也以为是网络代理问题花了两小时检查系统代理设置。直到我执行codex serve --config config/codex.yaml --verbose才在 verbose 日志末尾发现关键线索[DEBUG] Loading config from /home/user/openrig/config/codex.yaml [ERROR] Failed to load embedding model from /home/user/.cache/codex/models/all-MiniLM-L6-v2: model.bin not found原来“cc switch” 是 Codex 源码中对 “config change” 的缩写而 “local proxy failed” 指的是它试图用本地 embedding 模型做向量检索时失败。根本原因不是网络而是模型文件损坏或路径错误。排查步骤进入 tmux切换到 Codex paneCtrl-b, 方向键按Ctrl-c停止服务执行ls -la ~/.cache/codex/models/all-MiniLM-L6-v2/检查是否存在model.bin和tokenizer.json如果缺失手动下载模型mkdir -p ~/.cache/codex/models/all-MiniLM-L6-v2 wget https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/pytorch_model.bin -O ~/.cache/codex/models/all-MiniLM-L6-v2/model.bin wget https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer.json -O ~/.cache/codex/models/all-MiniLM-L6-v2/tokenizer.json重新启动 Codexcodex serve --config config/codex.yaml经验Codex 的模型下载机制不稳定尤其在 DNS 被污染的网络环境下。务必养成手动验证模型文件完整性的习惯。一个可靠的 checksum 验证脚本应加入你的 openrig 初始化流程。4.2 问题“yolov10 yaml 文件怎么创建” 与 “rstudio 的 yaml 在哪里”这两个问题表面无关实则共享同一个底层认知YAML 是声明式契约不是配置文件。用户问 “yolov10 yaml 怎么创建”真正想问的是 “如何为一个新模型定义它的输入输出规范”问 “rstudio 的 yaml 在哪里”其实是想知道 “RStudio 如何读取我的项目配置”。在 OpenRig 中YAML 的作用是标准化接口契约。以 yolov10 为例它的 yaml 文件如 yolov10n.yaml定义了nc: 类别数scales: 模型缩放因子backbone: 主干网络结构head: 检测头结构这和 Codex 的 codex.yaml 中embedding.model和llm.model的作用完全一致——都是告诉运行时 “我期望什么样的组件接入”。因此创建一个新 YAML 的方法论是固定的找模板去官方 repo 的examples/或configs/目录找最接近的 yaml改字段只修改业务相关字段如root,model,port绝不碰结构性字段如server:下的host必须是127.0.0.1验语法用在线 YAML validator如 yamllint.com检查缩进和冒号测运行用codex serve --config your.yaml --dry-run如果支持或直接启动观察日志RStudio 的 YAML 位置问题同理。RStudio 本身不读取全局 YAML它只读取当前 project 目录下的.Rprofile或renv.lock。如果你希望 RStudio 调用 Codex正确的做法是在 R 项目中创建config/codex_client.yaml然后在 R script 中用httr::POST()调用http://127.0.0.1:3001/responses。4.3 问题“codex 无法加载组织设置” 与 “codex is ignoring 1 unrecognized configuration setting”这两个错误本质相同YAML 解析失败。Codex 使用 serde_yaml 库解析配置它对 YAML 的规范性要求极高。一个空格、一个制表符、一个多余的逗号都会导致整个配置被忽略。我建立了一个快速诊断表放在~/openrig/README.md里错误现象最可能原因快速验证命令修复方案codex is ignoring 1 unrecognized configuration setting字段名拼写错误如emdedding_modelgrep -n emdedding config/codex.yaml用codex --help config查看官方字段名codex 无法加载组织设置workspace.root路径不存在或无读取权限ls -ld /home/user/my-projectmkdir -p /home/user/my-project chmod 755 /home/user/my-projectError: invalid config: missing required field server.portYAML 缩进错误导致server被解析为字符串而非 objectpython3 -c import yaml; print(yaml.safe_load(open(config/codex.yaml)))用 VS Code 的 YAML 插件实时校验实战技巧永远不要手写 YAML。在 VS Code 中安装 “YAML” 插件Red Hat它会实时显示 schema 错误红线按 Ctrl-Space 提供字段自动补全右键菜单 “Format Document” 自动修正缩进 这比任何人工检查都可靠。5. 进阶扩展让 OpenRig 真正成为你的生产力引擎一套能跑通的 OpenRig 只是起点。要让它成为日常开发中不可或缺的生产力引擎还需三个关键扩展IDE 集成、模型热切换、状态持久化。这些不是锦上添花的功能而是解决真实痛点的必要设计。5.1 VS Code 插件开发用 TypeScript 封装 OpenRig 调用Codex 官方没有提供 VS Code 插件但我们可以用 VS Code Extension API 自己写一个轻量级客户端。核心思路是监听编辑器光标位置当用户按下CtrlSpace时收集当前文件内容、光标前后 20 行代码构造一个 JSON payload 发送给http://127.0.0.1:3001/responses并将返回的completion插入编辑器。创建~/openrig/vscode-extension目录初始化npm init -y npm install --save-dev types/vscodepackage.json中添加{ contributes: { commands: [{ command: openrig.complete, title: OpenRig: Complete Code }], keybindings: [{ command: openrig.complete, key: ctrlspace, when: editorTextFocus }] } }extension.ts的核心逻辑import * as vscode from vscode; import * as axios from axios; export function activate(context: vscode.ExtensionContext) { let disposable vscode.commands.registerCommand(openrig.complete, async () { const editor vscode.window.activeTextEditor; if (!editor) return; const document editor.document; const position editor.selection.active; const range document.getWordRangeAtPosition(position); // 构造 Codex 请求 const payload { prompt: document.getText(), language: document.languageId, cursor: position.line }; try { const response await axios.default.post(http://127.0.0.1:3001/responses, payload); const completion response.data.completion || ; // 插入补全内容 await editor.edit(editBuilder { editBuilder.insert(position, completion); }); } catch (error) { vscode.window.showErrorMessage(OpenRig error: ${error.message}); } }); context.subscriptions.push(disposable); }打包发布后在 VS Code 中安装此插件你就能获得一个完全离线、毫秒级响应的代码补全体验。它不上传任何代码所有计算在本地完成这才是真正的 “open rig”。5.2 模型热切换用 YAML 变量实现一键切换 deepseek-coder 与 llama3OpenRig 的 YAML 配置支持变量注入这让我们能实现模型热切换。修改config/codex.yaml# config/codex.yaml # 使用环境变量覆盖 llm: provider: ollama model: ${OLLAMA_MODEL:-deepseek-coder:1.3b} endpoint: http://localhost:11434/api/chat然后创建两个启动脚本# ~/openrig/start-deepseek.sh #!/bin/bash export OLLAMA_MODELdeepseek-coder:1.3b tmux source-file ~/openrig/openrig.tmux # ~/openrig/start-llama3.sh #!/bin/bash export OLLAMA_MODELllama3:8b tmux source-file ~/openrig/openrig.tmux执行chmod x ~/openrig/start-*.sh以后只需运行~/openrig/start-llama3.sh整个 rig 就会自动加载 llama3 模型。无需修改任何代码YAML 变量在运行时被 tmux 环境继承Codex 启动时自动读取。5.3 状态持久化用 tmux-resurrect 保存你的 OpenRig 会话tmux 默认不保存 pane 内容。当你重启电脑之前正在 Codex pane 中查看的调试日志就丢失了。tmux-resurrect插件可以解决这个问题。安装git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm # 在 ~/.tmux.conf 末尾添加 set -g plugin tmux-plugins/tpm set -g plugin tmux-plugins/tmux-resurrect run-shell ~/.tmux/plugins/tpm/tpm启动 tmux 后按Ctrl-bI安装插件。之后Ctrl-bCtrl-s保存当前会话状态包括每个 pane 的命令历史、当前目录、甚至 vim 缓冲区Ctrl-bCtrl-r恢复上次保存的状态这意味着即使你关闭笔记本一整周再次打开时执行~/openrig/openrig.tmux然后Ctrl-bCtrl-rCodex pane 会立刻回到你上次中断的那行日志Node.js pane 显示着和之前完全一样的内存占用Ollama pane 正在继续加载你上周没下完的大模型——OpenRig 真正成为了你开发环境的数字孪生。我在深圳一家做工业视觉算法的公司做技术支持时他们的工程师就用这套方案。他们把 OpenRig 部署在 NVIDIA Jetson Orin 上每次现场调试完按Ctrl-bCtrl-s保存回公司后Ctrl-bCtrl-r恢复所有传感器数据流、模型推理日志、代码补全上下文全部原样重现。这才是 OpenRig 的终极价值不是一套工具而是你开发思维的延伸容器。