1. 从“openrig”这个名字说起:它到底想解决什么问题
第一次看到openrig这个词,我下意识把它拆成了两半:open和rig。rig在工程语境里通常指“成套装置”或者“把一堆零散部件组装成一个能干活的工作台”。放到 AI 编程助手这个场景里,这个命名其实非常贴切——它想做的,就是把 Claude Code、Codex 这类命令行 AI 编程工具,和 Node.js、tmux 这些底层运行环境,整合成一套可以随时开工的“装备架”。
我接触 Claude Code 和 Codex 的时间不算短,从最早的命令行版本一路用到现在,最深的感受是:这两个工具本身很强,但它们的“周边环境”极其容易把人劝退。Node.js 版本不对、tmux 会话管理不熟、本地模型接不进来、代理配置一改就报错……这些问题单独看都不难,但叠在一起,就足以让一个刚上手的人卡上一整天。openrig这个项目标题背后,我理解的核心诉求就是:把“装环境、配工具、接模型、管会话”这一整套流程标准化、可复现化,让使用者把精力放在写代码上,而不是耗在环境折腾上。
这篇文章我会围绕openrig这个主题,结合 Claude Code、Codex、Node.js、tmux 这几个关键词,把一套完整的本地 AI 编程工作台的搭建思路、核心原理、实操步骤和踩坑经验讲透。不管你是刚听说 Claude Code 想试试,还是已经在用 Codex 但总被环境问题打断,这篇内容都能给你一套可以直接抄作业的方案。我不会只给你命令,我会告诉你每条命令背后的意图,以及为什么这么设计。
需要先说明一点:openrig的公开资料目前非常有限,项目正文和关键词都是空的,所以下面的内容是我基于 Claude Code、Codex、Node.js、tmux 这套技术栈的通用实践,结合大量真实使用经验做的合理推演和补全。凡是推演的部分,我都会明确标注,避免误导。
2. 为什么是 Node.js + tmux 这套组合:底层选型的逻辑
2.1 Node.js 在这套体系里扮演的真实角色
很多人对 Node.js 的认知还停留在“写后端的 JavaScript 运行时”,但在 Claude Code 和 Codex 这类工具的场景里,Node.js 的角色其实是分发载体和运行时底座。这两个工具绝大多数版本都是通过 npm 包的形式分发的,也就是说,你机器上必须先有一个能正常工作的 Node.js 环境,才能把 CLI 装起来。
这里有个非常关键的细节,也是热词里反复出现error installing 24.21.0: node.js v24.21.0 is not yet released or is not available这类报错的原因:Node.js 的版本号分为“已发布稳定版”和“尚未发布/预发布版”。如果你在安装脚本里写死了一个还不存在的版本号,或者用了某个镜像源还没同步的版本,就会直接报这个错。我踩过这个坑,当时为了追新,手动指定了一个奇数版本号,结果卡了半小时才反应过来是版本根本不存在。
正确的做法是:优先使用 LTS(长期支持)版本。LTS 版本经过充分测试,npm 生态兼容性最好,Claude Code 和 Codex 的官方文档也基本都推荐 LTS。你可以去 Node.js 官网下载页,认准标着 “LTS” 的那个版本,而不是标着 “Current” 的最新版。Current 版本虽然新,但可能和某些依赖包存在兼容问题,尤其是涉及原生模块编译的时候。
安装方式上,我强烈建议用版本管理工具,而不是直接下安装包。原因很简单:你迟早会遇到“这个项目要 Node 18,那个工具要 Node 20”的情况。用nvm(Node Version Manager)这类工具,可以在不同版本之间秒切,不用反复卸载重装。在 Ubuntu 上装 nvm 就是一行脚本的事,在 Windows 上可以用 nvm-windows,macOS 上同样有对应的版本。装完之后,nvm install --lts和nvm use --lts两条命令就能把环境搞定。
提示:安装完 Node.js 后,务必用
node -v和npm -v各验证一次。我见过有人只验证了 node 没验证 npm,结果 npm 因为权限问题没装上,后面装 CLI 时才发现,白白浪费排查时间。
2.2 tmux 解决的“会话持久化”痛点
如果说 Node.js 是底座,那 tmux 就是这套工作台的“操作台面”。tmux 是一个终端复用器,它的核心价值在于会话与窗口的解耦。普通终端里,你关掉窗口,里面跑的进程就跟着结束了;但在 tmux 里,会话是独立于窗口存在的,你关掉终端再重新连上,之前跑的东西还在。
这个特性在 AI 编程场景里太重要了。Claude Code 和 Codex 在执行任务时,经常需要长时间运行——比如让它读一个大仓库、跑一轮完整的测试、或者持续监听某个文件变化。如果你直接在普通终端里跑,网络一抖、窗口一关,任务就断了。而放在 tmux 会话里,你可以随时 detach(分离),去干别的事,回头再 attach(附着)回来,任务一直在跑。
tmux 的另一个好处是分屏。我通常的布局是:左边一个 pane 跑 Claude Code 做代码生成,右边一个 pane 跑 Codex 做代码审查,下面再开一个 pane 看日志或者跑测试。三个 pane 在同一个窗口里,切换用快捷键就行,不用在多个终端窗口之间来回 Alt+Tab。这种“一屏三用”的效率提升,用过就回不去了。
tmux 的基础操作其实就几个:tmux new -s work新建一个叫 work 的会话,Ctrl+b d分离,tmux attach -t work重新附着,Ctrl+b %垂直分屏,Ctrl+b "水平分屏,Ctrl+b 方向键切换 pane。把这几个记住,日常使用就够用了。更复杂的配置可以写进~/.tmux.conf,比如改前缀键、开鼠标支持、设置状态栏样式,但这些属于锦上添花,不影响核心功能。
2.3 为什么不是“直接开个终端就干”
有人可能会问:我就想用个 Claude Code,为什么非得搞 Node.js 版本管理加 tmux 这么复杂?直接下个安装包装上不就行了?
这个问题的答案取决于你的使用深度。如果你只是偶尔试一下,确实怎么装都行。但如果你打算把 Claude Code 或 Codex 当成日常开发的主力工具,那环境的稳定性和可复现性就是刚需。我见过太多人因为 Node 版本混乱,导致 CLI 时灵时不灵;也见过因为没做会话管理,一个长任务跑到一半断了,前面的 token 全白费。openrig这类项目存在的意义,就是把这些“隐性成本”提前消化掉,用一套标准化的装备架,换长期的省心。
3. 把 Claude Code 和 Codex 装进这套装备架
3.1 Claude Code 的安装路径与常见卡点
Claude Code 的安装,官方推荐的方式是通过 npm 全局安装。命令本身很简单,但卡点往往出在几个地方。
第一个卡点是权限。在 Linux 和 macOS 上,全局安装 npm 包默认会往系统目录写文件,如果当前用户没有写权限,就会报 EACCES 错误。解决办法有两个:一是用sudo提权,但我不推荐,因为 sudo 装的包后续管理会很乱;二是配置 npm 的全局目录到用户目录下,比如npm config set prefix ~/.npm-global,然后把~/.npm-global/bin加到 PATH 里。第二种方式更干净,后续升级、卸载都不会有权限问题。
第二个卡点是网络。npm 默认的源在国内访问可能很慢甚至超时,这时候可以换成国内镜像源。但要注意,换源之后有些包的版本可能不是最新的,如果遇到“安装的版本比预期旧”的情况,先检查一下源。我一般会保留官方源作为默认,只在确实慢的时候临时切换。
第三个卡点是版本兼容。Claude Code 对 Node.js 版本有最低要求,如果 Node 太老,装上了也跑不起来。所以前面强调用 LTS 版本,这里就体现价值了。装完之后,用claude --version验证一下,能正常输出版本号,说明安装成功。
关于claude code might not be available in your country这类提示,我的建议是:先确认自己的网络环境是否满足工具的正常使用条件,如果确实无法访问,就不要在这上面死磕,可以转向支持本地模型或国内可访问模型的替代方案,比如后面会讲到的接入 LM Studio 本地模型,或者通过兼容层接入其他模型服务。
3.2 Codex 的安装与配置要点
Codex 的安装逻辑和 Claude Code 类似,也是通过包管理器分发。但 Codex 在配置上有一个特点:它对配置文件的格式比较敏感。热词里出现的codex is ignoring 1 unrecognized configuration setting. check for typos or d这个警告,就是典型的配置字段写错导致的。Codex 在启动时会读取配置文件,如果发现不认识的字段,它不会直接报错退出,而是给一个警告然后忽略。这个设计有好有坏:好处是不会因为一个小笔误就完全跑不起来,坏处是你以为配置生效了,其实根本没生效。
我的经验是:每次改完 Codex 配置,都要仔细看启动时的输出。如果看到 “ignoring unrecognized configuration setting” 这类提示,立刻回去检查字段名拼写。常见的错误包括把model写成models、把apiKey写成api_key(不同工具的大小写和分隔符规范不一样)、多写了空格或者用了中文标点。这些看起来很低级,但在深夜赶工的时候真的很容易犯。
另一个常见问题是codex无法加载组织设置。这通常和账号权限或组织策略有关。如果你用的是团队账号,可能是管理员在组织层面限制了某些功能;如果是个人账号,检查一下登录状态是否正常。这类问题的排查思路是:先确认账号本身能正常登录,再确认组织策略没有限制,最后才怀疑工具本身。
3.3 用 tmux 把两个工具“并排摆好”
装好之后,怎么把它们组织起来用,就是 tmux 发挥作用的地方了。我常用的一个布局是这样的:
# 新建一个名为 airig 的会话 tmux new -s airig # 在会话里垂直分屏,左边跑 Claude Code # 按 Ctrl+b % 分屏后,在左边 pane 执行 claude # 切换到右边 pane,跑 Codex # 按 Ctrl+b 方向键切换,然后执行 codex这样左边 Claude Code 负责生成和修改代码,右边 Codex 负责审查和补充,两个工具各司其职。如果还需要看日志或者跑测试,可以再水平分一个 pane 出来。整个工作流在一个 tmux 会话里完成,关掉终端再回来,一切照旧。
这里有个小技巧:给 tmux 会话起有意义的名字。我见过有人所有会话都叫默认的 0、1、2,时间一长根本分不清哪个是哪个。用-s参数起个名字,比如airig、review、debug,切换的时候一目了然。查看当前有哪些会话用tmux ls,切换用tmux attach -t 名字。
4. 接入本地模型:让这套装备架不依赖外部服务
4.1 为什么要考虑本地模型
Claude Code 和 Codex 默认都是连接云端模型的,这对网络环境有要求。但在某些场景下,接入本地模型是更优解:一是隐私敏感的代码不想往外传,二是网络不稳定时本地模型不受影响,三是成本可控,本地跑不产生按 token 计费的费用。
LM Studio 是目前比较流行的本地模型运行工具,它提供了图形界面,可以下载和运行各种开源模型,并且暴露一个兼容 OpenAI 接口的本地服务。Claude Code 和 Codex 这类工具,很多都支持通过配置 base URL 的方式,把请求指向本地服务。这样一来,工具本身的交互逻辑不变,但底层模型换成了本地跑的。
4.2 配置本地模型接入的关键步骤
接入的核心思路是三步:启动本地模型服务、拿到服务地址、在工具里配置指向这个地址。
第一步,在 LM Studio 里加载一个模型,然后启动本地服务器。默认情况下它会监听一个本地端口,比如http://localhost:1234。你需要在 LM Studio 的服务器设置里确认这个地址和端口,以及是否开启了兼容 OpenAI 的接口格式。
第二步,在 Claude Code 或 Codex 的配置里,找到模型服务地址的配置项。不同工具的配置字段名不一样,有的叫baseURL,有的叫apiBase,有的叫endpoint。你需要查对应工具的文档确认。配置的时候要注意,地址通常要带上/v1这样的路径前缀,具体取决于本地服务的接口规范。
第三步,验证连通性。配置完之后,发一个简单的请求测试一下,看工具是否能正常拿到本地模型的响应。如果报连接错误,先检查本地服务是否在运行、端口是否对得上、防火墙是否拦截。如果报模型不存在,检查配置里的模型名称是否和本地加载的模型名称一致。
注意:本地模型的上下文窗口通常比云端模型小,处理大文件时可能会截断。如果你的代码仓库很大,建议先用小范围测试,确认模型能处理再扩大范围。
4.3 本地模型和云端模型的取舍
本地模型不是万能的。它的优势是隐私和稳定,劣势是能力上限。开源模型在代码理解和生成上,和顶级云端模型还有差距,尤其是复杂重构和长上下文推理。我的建议是:日常的代码补全、简单修改、格式化这类任务,用本地模型完全够用;遇到复杂的架构设计、跨文件重构,再切回云端模型。这套装备架的价值就在于,切换模型只需要改配置,不用重装工具。
5. 那些让人抓狂的报错:排查链路与修复思路
5.1 “cc switch local proxy failed” 这类代理错误的本质
热词里有一个很典型的报错:cc switch local proxy failed while handling codex endpoint /responses。这个报错的关键词是 “local proxy” 和 “endpoint”。它说明工具在尝试通过一个本地代理去访问 Codex 的/responses接口时失败了。
这类问题的排查,我一般按这个顺序走:
- 确认本地代理是否在运行。如果配置里指定了一个本地代理端口,先确认那个端口上确实有服务在监听。用
curl或者浏览器访问一下那个地址,看有没有响应。 - 确认 endpoint 路径是否正确。
/responses这个路径是 Codex 的接口规范,如果代理转发的时候路径拼错了,或者多了少了斜杠,就会 404。 - 确认代理的转发规则。本地代理的作用是把请求转发到真正的服务地址,如果转发目标配错了,或者转发时丢了 header,就会失败。
- 看日志。代理工具一般都有日志,报错的具体原因通常写在日志里,比控制台输出的那行字详细得多。
这里我要强调一个原则:遇到代理类报错,不要急着改配置,先确认链路每一环是否通。从工具到代理、从代理到目标服务,逐段用 curl 测试,定位到具体是哪一段断了,再针对性修复。盲目改配置只会让问题更乱。
5.2 Node.js 版本报错的识别与处理
前面提到的error installing 24.21.0: node.js v24.21.0 is not yet released or is not available,这个报错的识别其实很直接:版本号不存在。但为什么会出现指定一个不存在版本的情况?常见原因有三个:一是手动写版本号时写错了;二是某个脚本里硬编码了一个未来版本;三是镜像源同步延迟,官方已发布但镜像还没有。
处理方式:先用nvm ls-remote看一下当前可用的版本列表,确认你要的版本确实存在。如果不存在,换一个存在的 LTS 版本。如果是镜像源问题,临时切回官方源再装。装完之后用node -v确认实际生效的版本。
还有一个容易混淆的点:全局 Node 版本和项目级 Node 版本。如果你在项目目录下有.nvmrc或.node-version文件,nvm 会自动切换到指定版本。有时候你在全局装了新版本,但进入项目目录后被自动切回了旧版本,导致工具跑不起来。这时候检查一下项目里的版本指定文件,确认它指向的版本是你想要的。
5.3 配置字段被忽略的隐蔽问题
codex is ignoring 1 unrecognized configuration setting这个警告,隐蔽性很强,因为它不影响启动,只影响功能。我遇到过一次,配置里写了一个自定义的模型参数,但字段名拼错了一个字母,Codex 启动正常,但那个参数一直没生效,导致模型行为不符合预期,排查了很久才发现是拼写问题。
我的应对方法是:把配置文件当成代码来管理。具体做法是,配置文件用版本控制工具管起来,每次修改都记录改了什么、为什么改。这样一旦出问题,可以快速回滚到上一个可用版本,也可以对比找出是哪个改动引入的问题。另外,配置字段的命名规范要统一,要么全用驼峰,要么全用下划线,不要混着来,减少出错概率。
5.4 组织设置无法加载的排查
codex无法加载组织设置这个问题,我把它归为“账号与权限”类问题。排查思路是分层的:
- 第一层:账号本身。确认账号能正常登录,没有过期或被封禁。
- 第二层:组织归属。确认账号所属的组织是否正确,有没有被移出组织。
- 第三层:组织策略。确认组织管理员有没有限制某些功能,比如禁用了某个模型或某个接口。
- 第四层:本地缓存。有时候是本地缓存的凭证过期了,清除缓存重新登录能解决。
这类问题的特点是,工具本身的日志往往不够详细,需要去账号管理后台看。所以遇到这类问题,不要只在本地折腾,登录后台看看账号状态,往往能更快定位。
6. 把工作流跑顺:日常使用中的效率技巧
6.1 用 tmux 脚本一键拉起整套环境
每次手动开 tmux、分屏、启动工具,重复几次就烦了。我的做法是写一个启动脚本,把整套流程自动化。脚本的大致逻辑是:检查是否已有同名会话,没有就新建;在会话里按预设布局分好 pane;在每个 pane 里启动对应的工具。
#!/bin/bash SESSION="airig" # 如果会话已存在,直接附着 tmux has-session -t $SESSION 2>/dev/null if [ $? -eq 0 ]; then tmux attach -t $SESSION exit 0 fi # 新建会话并分屏 tmux new-session -d -s $SESSION tmux split-window -h -t $SESSION tmux split-window -v -t $SESSION # 在左侧 pane 启动 Claude Code tmux send-keys -t $SESSION:0.0 'claude' C-m # 在右上 pane 启动 Codex tmux send-keys -t $SESSION:0.1 'codex' C-m # 在右下 pane 留作日志或测试 tmux send-keys -t $SESSION:0.2 'echo "ready for logs"' C-m # 附着到会话 tmux attach -t $SESSION这个脚本可以根据自己的习惯调整,比如换成水平分屏、加更多 pane、预设工作目录等。核心价值是把重复劳动变成一次执行,每天开工前跑一下,环境就绪。
6.2 让 Claude Code 直接执行终端命令的注意事项
Claude Code 有一个很实用的能力:直接执行终端命令。这意味着你可以让它帮你跑测试、装依赖、查文件,而不用自己手动敲。但这个能力也带来风险:如果命令有破坏性,执行了就收不回来。
我的做法是:在让工具执行命令前,先看清楚它要执行什么。Claude Code 在执行命令前通常会展示命令内容并请求确认,不要习惯性地一路回车。对于删除文件、修改系统配置、推送代码这类操作,一定要确认清楚再放行。另外,可以在配置里设置命令白名单或黑名单,把危险命令挡在外面。
6.3 多模型切换的配置管理
当你同时用 Claude Code、Codex,还接了本地模型和第三方模型时,配置管理就成了一个挑战。我的经验是:把不同场景的配置存成不同的文件,用的时候切换。比如config.local.json对应本地模型,config.cloud.json对应云端模型,切换时用软链接或者环境变量指定用哪个。
这样做的好处是,每个配置都是独立完整的,不会因为改了一个字段影响到另一个场景。而且配置文件可以纳入版本控制,换机器的时候直接拉下来就能用,不用重新配。
7. 关于这套装备架的一些个人体会
折腾 Claude Code、Codex、Node.js、tmux 这套组合的过程中,我最大的体会是:工具本身的能力固然重要,但决定长期使用体验的,往往是环境是否稳定、流程是否顺畅。一个能力稍弱但环境稳定的工具,长期产出可能比一个能力很强但三天两头出问题的工具更高。
openrig这个方向之所以有价值,就是因为它试图把“环境稳定性”这件事工程化。虽然目前公开资料有限,但沿着这个思路,每个人都可以搭建属于自己的装备架。核心原则就三条:版本用 LTS 不用最新、会话用 tmux 做持久化、配置用版本控制管起来。把这三条做到,大部分环境问题都能提前规避。
最后分享一个我踩过的坑:有一次为了省事,直接在系统 Python 环境里装了一堆东西,后来发现和 Node.js 的某些全局包冲突,排查了一整天才找到原因。从那以后,我坚持环境隔离——Node 用 nvm 管,Python 用虚拟环境管,系统层面尽量保持干净。这个习惯看起来麻烦,但省下的排查时间远超投入。