
1. 从 openrig 说起一个把 Claude Code 和 Codex 装进 tmux 的编排器第一次看到openrig这个名字我下意识把它拆成了 open rig——rig 在工程语境里就是装配、搭台子的意思比如采矿里的钻井平台、直播里的推流设备都叫 rig。放到 AI 编程工具这个场景里openrig 干的事情本质上就是把 Claude Code、Codex 这类命令行 AI 编程助手装进一个可复用、可切换、可观测的终端工作台里而它最常被提到的搭档就是 Node.js 和 tmux。如果你最近在折腾 Claude Code 或者 Codex CLI大概率踩过这些坑Node.js 版本对不上导致error installing 24.21.0: node.js v24.21.0 is not yet released or is not available在 VS Code 里配置 Claude Code 死活连不上Codex 登录之后提示your organization has disabled claude subscription access或者codex is ignoring 1 unrecognized configuration setting. check for typos or d...这种配置项拼错却找不到位置的报错。openrig 想解决的就是把这些零散的安装、配置、会话管理、多模型切换问题收敛到一套统一的终端编排流程里。这篇内容适合三类人看第一类是刚接触 Claude Code、Codex连 Node.js 是干什么的都还没搞清楚的入门玩家第二类是已经在用 CLI 编程助手但被多窗口、多会话、多模型切换搞得头大的中级用户第三类是想把 AI 编程助手接入本地模型比如通过 LM Studio或者第三方 APIDeepSeek、Qwen、GLM 等的进阶玩家。我会从整体设计思路讲到具体实操把 openrig 背后的核心逻辑、tmux 会话编排、Node.js 环境准备、Claude Code 与 Codex 的接入细节全部拆开讲尽量让你看完就能照着搭一套自己的 rig。2. openrig 的整体设计思路与核心选型逻辑2.1 为什么是 tmux而不是开一堆终端标签页很多人第一次用 Claude Code 或者 Codex CLI习惯是开一个终端窗口跑一个会话再开一个窗口跑另一个。刚开始还行等你同时要跑 Claude Code 写业务代码、Codex 做代码审查、再挂一个本地模型做实验窗口就乱成一锅粥了。更麻烦的是SSH 断线或者笔记本合盖会话直接没了之前 AI 帮你梳理的上下文全丢。tmux 在这里的价值就体现出来了。它是一个终端复用器你可以把它理解成终端里的浏览器标签页 会话持久化。一个 tmux server 下面可以挂多个 session每个 session 下面可以切多个 window每个 window 还能拆多个 pane。openrig 的思路就是把 Claude Code、Codex、日志窗口、shell 窗口分别放到不同的 pane 或者 window 里用一个统一的入口脚本一键拉起。我实测下来tmux 方案相比多开终端标签有三个实打实的好处会话持久化SSH 断了、终端关了tmux session 还在后台跑重新 attach 回去Claude Code 的对话上下文、Codex 的任务队列都还在。布局可复现把布局写进脚本每次启动都是同样的分屏结构不用手动拖来拖去。多模型并行左边 pane 跑 Claude Code 接官方模型右边 pane 跑 Codex 接 DeepSeek中间 pane 跑本地 LM Studio 模型互不干扰。提示tmux 的 session 是存在服务端内存里的机器重启就没了。如果你需要跨重启保留得配合 tmux-resurrect 这类插件或者干脆把关键上下文落到文件里。2.2 Node.js 在整条链路里到底扮演什么角色热词里高频出现 node.js是干什么的、node.js安装、node.js lts下载说明很多人对 Node.js 的定位是模糊的。简单说Claude Code 和 Codex CLI 这两个工具本身都是用 JavaScript/TypeScript 生态写的命令行程序它们依赖 Node.js 运行时才能跑起来。你可以把 Node.js 理解成让 JS 代码能在终端里跑起来的发动机没有它npm install -g装下来的 CLI 就是一堆跑不动的文本。这里有个特别容易踩的坑Node.js 版本。热词里那条error installing 24.21.0: node.js v24.21.0 is not yet released or is not available就是典型的版本问题——某个工具或者某个包管理器比如 nvm、fnm去拉一个还不存在的版本号直接报错。我的经验是不要盲目追最新版优先用 LTS长期支持版。Claude Code 和 Codex 这类工具对 Node.js 的兼容性通常是在 LTS 版本上验证得最充分的。选型上我推荐用版本管理器而不是直接装系统级 Node.js方案适用场景优点缺点nvmmacOS / Linux 多版本切换成熟稳定社区大Windows 原生支持差fnm跨平台追求速度Rust 写的启动快生态相对小nvm-windowsWindows 用户图形化安装偶发路径问题系统包管理器只用一个版本简单版本锁死难切换我自己的做法是 fnm LTS因为切换快而且能在项目目录放.node-version文件自动切版本跑 openrig 这种多工具环境特别省心。2.3 Claude Code 与 Codex 的定位差异决定了 openrig 的编排方式Claude Code 和 Codex 虽然都是命令行 AI 编程助手但用起来的手感差别不小。Claude Code 更偏向对话式结对编程你给它一个任务它会读文件、改代码、跑命令交互感强Codex CLI 更偏向任务执行器你描述清楚需求它倾向于一次性把活干完。热词里 claude code如何直接执行终端命令 和 codex使用教程 同时出现说明大家既想要 Claude Code 的交互性也想要 Codex 的执行力。openrig 的编排逻辑正是基于这个差异把交互密集的 Claude Code 放在主 pane把任务型的 Codex 放在副 pane用 tmux 的 window 做隔离。这样你在主 pane 里跟 Claude Code 讨论方案讨论完把结论丢给副 pane 的 Codex 去批量执行两边上下文互不污染。2.4 多模型接入为什么大家都在折腾 cc switch 和第三方 API热词里 使用cc switch 接入 deepseek v4, qwen, glm等模型、codex接入deepseek、claude code 调用lmstudio的本地模型 这几条反映了一个真实需求官方订阅有额度限制、有地区限制note: claude code might not be available in your country而且不同模型擅长的任务不一样。DeepSeek 在代码推理上性价比高Qwen 中文理解好GLM 在某些场景响应快本地 LM Studio 模型则胜在隐私和零成本。openrig 在这块的思路是配置与运行分离把模型接入配置API endpoint、key、模型名抽成独立的配置文件或者环境变量tmux 启动脚本只负责按配置拉起对应的 CLI。这样你换模型不用改启动逻辑改配置就行。这个设计的好处是当你遇到cc switch local proxy failed while handling codex endpoint /responses这类代理转发报错时排查范围能缩小到配置层而不是在启动脚本里大海捞针。3. 环境准备Node.js、tmux 与 CLI 工具的安装细节3.1 Node.js 安装LTS 优先版本管理器兜底先说安装。Windows 用户直接去 Node.js 官网下载 LTS 的.msi安装包一路下一步就行安装时记得勾选 Add to PATH。macOS 用户我强烈建议别用官网 pkg用 Homebrew 或者 fnm# macOS 用 Homebrew 装 fnm brew install fnm # 在 shell 配置里启用 fnmzsh 为例 echo eval $(fnm env --use-on-cd) ~/.zshrc source ~/.zshrc # 安装并切换到 LTS fnm install --lts fnm use --ltsLinuxUbuntu用户同理fnm 或者 nvm 都行。装完之后验证node -v npm -v如果node -v输出的版本号是v24.x这种非 LTS 的奇数版本建议切回 LTS。判断标准很简单偶数大版本号18、20、22通常是 LTS奇数是过渡版。热词里那个24.21.0 is not yet released的报错本质就是有人手动指定了一个不存在的版本号或者某个脚本硬编码了版本。遇到这种别去追那个版本直接fnm install --lts装当前 LTS 就好。注意如果你之前用系统包管理器装过 Node.js又装了 fnm/nvm可能会出现 PATH 冲突node -v显示的版本和你以为的不一样。用which node确认一下实际调用的是哪个必要时把系统级的卸载掉。3.2 tmux 安装与基础配置tmux 在 macOS 上brew install tmuxUbuntu 上sudo apt install tmuxWindows 用户建议在 WSL2 里用原生 Windows 的 tmux 体验一般。装完之后我建议先改一下前缀键。默认是Ctrlb和很多编辑器快捷键冲突改成Ctrla更顺手。在~/.tmux.conf里写# 改前缀键为 Ctrla set -g prefix C-a unbind C-b bind C-a send-prefix # 开启鼠标支持方便拖拽调整 pane 大小 set -g mouse on # 窗口和 pane 编号从 1 开始 set -g base-index 1 setw -g pane-base-index 1 # 更直观的分屏快捷键 bind | split-window -h bind - split-window -v改完tmux source-file ~/.tmux.conf生效。这几个配置看着简单但能省掉大量我到底按哪个键分屏的犹豫时间。3.3 Claude Code 与 Codex CLI 的安装两个工具都是 npm 全局安装为主# 安装 Claude Code npm install -g anthropic-ai/claude-code # 安装 Codex CLI npm install -g openai/codex装完之后claude --version和codex --version验证。如果提示命令找不到八成是 npm 全局 bin 目录没进 PATH。用npm config get prefix看全局目录在哪然后把它下面的binWindows 是根目录加进 PATH。VS Code 用户如果要在编辑器里用 Claude Code热词里 vscode配置claude code、claude code for vs code、vscode接入claude code 都指向同一个操作装官方扩展然后在扩展设置里填好 CLI 路径。我的经验是扩展和 CLI 版本要匹配扩展更新了但 CLI 还是老版本容易出现连接失败。定期npm update -g一下。4. openrig 核心实操用 tmux 编排多 AI 编程会话4.1 设计一个可复用的 tmux 布局脚本openrig 的核心就是一段启动脚本。我把它写成一个 shell 脚本openrig.sh逻辑是先检查有没有同名 session有就 attach没有就新建并按预设布局分屏。#!/usr/bin/env bash SESSIONopenrig # 如果 session 已存在直接 attach tmux has-session -t $SESSION 2/dev/null if [ $? -eq 0 ]; then tmux attach -t $SESSION exit 0 fi # 新建 session第一个 window 叫 claude tmux new-session -d -s $SESSION -n claude # 在 claude window 里左右分屏 tmux split-window -h -t $SESSION:claude # 左边 pane 跑 Claude Code右边 pane 跑 Codex tmux send-keys -t $SESSION:claude.0 claude C-m tmux send-keys -t $SESSION:claude.1 codex C-m # 新建第二个 window 叫 shell用来跑命令和看日志 tmux new-window -t $SESSION -n shell # 新建第三个 window 叫 local接本地模型 tmux new-window -t $SESSION -n local # 默认选中 claude window tmux select-window -t $SESSION:claude tmux attach -t $SESSION这段脚本的价值在于一键复现。你每天开工前跑一次./openrig.shClaude Code 和 Codex 就各就各位不用手动开窗口、敲命令。send-keys里的C-m相当于回车别漏了漏了命令就停在输入框里不执行。4.2 多模型切换的配置管理接第三方模型或者本地模型核心是改环境变量或者配置文件。以 Claude Code 接第三方兼容 API 为例通常是通过设置ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY这类环境变量来指向代理端点。Codex 接 DeepSeek 类似改它的配置文件里的 base URL 和模型名。我的做法是在~/.openrig/目录下放多个 env 文件# ~/.openrig/env.deepseek export ANTHROPIC_BASE_URLhttps://your-endpoint-here export ANTHROPIC_API_KEYyour-key-here export MODEL_NAMEdeepseek-chat启动脚本里根据参数 source 对应的文件source ~/.openrig/env.${1:-default}这样./openrig.sh deepseek就用 DeepSeek 配置./openrig.sh local就用本地 LM Studio 配置。关键点是把密钥和端点从脚本里剥离出来脚本可以进 gitenv 文件加进.gitignore避免密钥泄露。注意热词里cc switch local proxy failed while handling codex endpoint /responses这类报错通常是代理层在转发 Codex 的/responses端点时出了问题。排查顺序是先确认 base URL 末尾有没有多余的斜杠再确认代理是否支持/responses这个路径最后看模型名是否拼写正确。很多代理失败其实是配置里一个字符写错了。4.3 会话持久化与断线恢复tmux 最大的价值在断线恢复。假设你在服务器上跑 openrig本地 SSH 断了重新连上后tmux ls # 列出所有 session tmux attach -t openrig # 回到之前的会话Claude Code 的对话、Codex 的任务状态都还在。如果你用的是笔记本本地跑合盖休眠后 tmux 一般也能恢复但网络相关的会话比如正在调 API可能会断重连后重新发一次请求即可。我踩过的一个坑tmux 里跑 Claude Code如果 pane 太小输出会换行错乱。解决办法是把 pane 拉大或者在 tmux 配置里设置set -g default-terminal screen-256color保证颜色和宽度正常。4.4 让 Claude Code 直接执行终端命令的正确姿势热词里 claude code如何直接执行终端命令 是个高频问题。Claude Code 本身有执行 shell 命令的能力但出于安全考虑默认会询问确认。如果你想让它更自动可以在配置里调整权限模式但我的建议是不要无脑放开所有命令权限尤其是涉及rm、git push --force这类破坏性操作时。实操上我习惯在 tmux 的 shell window 里手动跑关键命令让 Claude Code 负责生成命令、解释命令我来做最后确认。这样既享受了 AI 的效率又保留了人工兜底。Codex 那边同理任务型执行虽然爽但涉及生产环境的操作一定要有 review 环节。5. 常见报错与排查技巧实录5.1 安装类报错速查报错信息可能原因解决思路node.js v24.21.0 is not yet released指定了不存在的 Node 版本改用fnm install --lts装 LTScommand not found: claudenpm 全局 bin 不在 PATH把npm config get prefix下的 bin 加进 PATHerror installing后跟一堆版本号版本管理器源问题换官方源或清缓存重装VS Code 扩展连不上 CLI扩展与 CLI 版本不匹配两边都更新到最新5.2 登录与权限类报错your organization has disabled claude subscription access for claude code这条意思是你的账号所属组织禁用了 Claude Code 的订阅访问。这种情况通常不是技术问题而是账号权限配置问题需要联系组织管理员或者换用个人账号。note: claude code might not be available in your country则是地区可用性问题属于服务提供方的限制技术上绕不过去建议关注官方支持的地区列表。Codex 的codex无法加载组织设置类似多半是账号配置或者网络请求被拦截。排查时先确认能正常访问 API 端点再看账号状态。5.3 配置类报错codex is ignoring 1 unrecognized configuration setting. check for typos or d...这条特别典型——配置文件里有个键名拼错了Codex 选择忽略它并警告。解决方法是打开 Codex 的配置文件通常在~/.codex/下逐行核对键名。我的经验是配置项拼写错误往往是因为抄了旧版本文档工具更新后配置键可能改名了以官方最新文档为准。5.4 代理与端点类报错cc switch local proxy failed while handling codex endpoint /responses这类排查步骤我总结成四步确认 base URL 格式正确末尾斜杠处理一致确认代理服务本身在运行端口没被占用确认代理支持 Codex 需要的/responses路径用curl直接打一下端点看返回什么比在 CLI 里猜快得多。curl -v https://your-endpoint-here/responses \ -H Authorization: Bearer $API_KEY \ -H Content-Type: application/json \ -d {model:your-model,input:test}curl -v能看到完整的请求和响应头很多代理失败其实是 401密钥错或者 404路径错一看便知。5.5 我踩过的三个真实坑第一个坑在 tmux 里跑 Claude Code中文输入法候选框位置错乱。这是终端和输入法的兼容问题解决办法是换一个对终端支持好的输入法或者把关键中文内容先在编辑器里写好再粘贴进去。第二个坑Codex 任务跑到一半 SSH 断了以为白跑了。其实 tmux 保住了会话attach 回去发现任务还在跑虚惊一场。这让我彻底养成了所有长任务都放 tmux 里跑的习惯。第三个坑同时开 Claude Code 和 Codex两个都在改同一个文件冲突了。后来我改成用 tmux 的 window 隔离Claude Code 负责一个模块Codex 负责另一个模块物理隔离再没冲突过。6. 把 openrig 用顺手的几个进阶思路6.1 用 window 做任务分区而不是堆 pane新手容易犯的错是把所有东西塞进一个 window 的多个 pane结果每个 pane 都很窄输出看不清。我的建议是一个 window 最多两个 pane超过就开新 window。比如 claude window 放 Claude Code 和它的日志codex window 放 Codex 和它的输出local window 放本地模型实验。用Ctrla加数字快速切 window比在窄 pane 里眯着眼看强多了。6.2 给不同项目建不同的 sessionopenrig 不一定只有一个 session。你可以按项目建 sessionopenrig-projectA、openrig-projectB。每个 session 里的 Claude Code 和 Codex 都指向对应项目的目录上下文不串。切换用tmux switch -t openrig-projectB或者干脆在脚本里加个参数。6.3 日志落盘方便回溯AI 编程助手有时候会给出很长的分析终端滚上去就找不到了。我的做法是在 tmux 里开一个专门的日志 pane用tee把关键输出同时写到文件claude 21 | tee ~/openrig-logs/claude-$(date %Y%m%d).log这样即使会话丢了日志还在回头能翻。对于 Codex 这种任务型的日志尤其重要出问题了能对着日志复盘。6.4 定期更新但别追最新Claude Code 和 Codex 更新很频繁新功能诱人但新版本也可能引入新 bug。我的策略是LTS 心态用工具——稳定版用着没问题就不急着升等社区反馈稳定了再升。升级前先记下当前版本号出问题能回滚npm install -g anthropic-ai/claude-code旧版本号Node.js 本身更是如此LTS 是底线别为了尝鲜去装非 LTS 版本热词里那个版本报错就是活生生的教训。6.5 本地模型接入的取舍接本地 LM Studio 模型的好处是隐私和零成本坏处是速度和能力通常不如云端大模型。我的用法是敏感代码、实验性代码用本地模型正式业务代码用云端模型。在 openrig 里本地模型单独放一个 window需要的时候切过去不占用主工作流的资源。本地模型的接入关键是确认 LM Studio 的本地服务端口默认 1234和 OpenAI 兼容接口路径然后在 Claude Code 或 Codex 的配置里把 base URL 指向http://localhost:1234/v1。模型名填 LM Studio 里加载的模型标识。实测下来小参数模型跑简单补全够用复杂重构还是得靠大模型。这套 openrig 的玩法核心不在于工具多花哨而在于把环境准备、会话编排、模型切换、报错排查这几件事标准化。你搭一次之后每天开工就是一条命令的事。我自己从最早的手忙脚乱开一堆终端到现在一个 tmux session 搞定所有 AI 编程助手最大的体会是工具的价值在于让你忘记工具的存在专注于真正要解决的问题。openrig 这个名字起得挺准它就是个 rig搭好了你只管在上面干活。