ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

openrig实战:用tmux整合Claude Code与Codex的AI编码工作流

openrig实战:用tmux整合Claude Code与Codex的AI编码工作流 1. 从“openrig”说起一个被低估的终端工作流编排思路第一次看到“openrig”这个词我下意识把它拆成了“open”和“rig”两部分。rig在工程语境里从来不是“装备”那么简单它更多指的是一整套搭起来就能干活的工作台——就像电工的腰带上挂满钳子、电笔、绝缘胶带随手就能抽出一件趁手的工具。openrig要解决的恰恰是当下很多人在终端里同时折腾Claude Code、Codex、Node.js、tmux这一堆东西时那种“工具散落一地、切来切去、状态全丢”的混乱感。如果你最近在搜索框里敲过“claude code安装”“codex安装教程”“node.js是干什么的”“tmux怎么用”那你大概率已经踩进了这个坑想用AI辅助写代码结果光是让Claude Code和Codex在同一个终端会话里和平共处就耗掉了一个下午。openrig这个标题背后其实藏着一个非常具体的需求——把多个AI编码代理、运行时环境和终端复用器整合成一套可复用、可切换、可观测的工作台。这篇文章适合三类人看。第一类是刚接触Claude Code或Codex连Node.js版本都还没搞明白的新手第二类是已经在用tmux但每次开新窗口都要手动重配环境变量的中级用户第三类是想把本地模型、第三方API和官方CLI串起来做一套自己专属编码流水线的折腾型玩家。我会从整体设计思路讲到具体操作把“为什么这么搭”和“怎么搭才不翻车”都说明白。2. 整体设计与思路拆解为什么是这套组合2.1 核心需求让AI编码代理“住”在同一个终端里很多人第一次装Claude Code或Codex都是单独开一个终端窗口跑完一个任务再关掉。但实际写代码时你往往需要同时做几件事让Claude Code帮你重构一个函数让Codex帮你补测试用例同时还要盯着Node.js服务的日志输出。如果每个代理都占一个独立窗口切换成本高得离谱而且一旦窗口关闭上下文就断了。openrig的思路不是再造一个全新的工具而是用tmux作为“容器”把Claude Code、Codex、Node.js进程全部装进同一个会话的不同窗格或窗口里。tmux负责持久化Node.js负责运行时Claude Code和Codex负责具体的编码任务。这样你关掉终端再连回来所有会话状态都还在代理的上下文也没丢。提示不要把openrig理解成某个具体的软件包它更像是一种“编排模式”。你可以用shell脚本、Makefile或者justfile来实现核心是tmux的会话管理能力。2.2 为什么选tmux而不是其他终端复用器市面上终端复用器不少screen太老zellij界面花哨但生态还在追赶tmux是唯一一个在服务器、macOS、WSL、甚至某些嵌入式环境里都能稳定跑的选择。更重要的是tmux的send-keys和capture-pane命令让你可以用脚本向指定窗格发送命令并抓取输出。这意味着你可以写一个脚本自动把“帮我重构这个文件”发给Claude Code窗格等它跑完再把结果抓回来。另一个关键点是tmux的会话分离特性。你可以在本地开一个tmux会话跑着Claude Code和Codex然后断开SSH去吃饭。回来重新attach所有进程还在跑代理的对话历史也还在。这种“断线不丢状态”的能力对于需要长时间运行的编码任务来说几乎是刚需。2.3 Node.js版本选择别追最新追LTS热词里有一条“error installing 24.21.0: node.js v24.21.0 is not yet released or is not available”这明显是版本号写错了或者源里还没有。Claude Code和Codex的CLI工具对Node.js版本有硬性要求但并不是越新越好。我实测下来Node.js 20 LTS和22 LTS是最稳的。24.x虽然有些新特性但部分npm包还没跟上容易出现原生模块编译失败。如果你用nvm管理Node.js版本建议在openrig的启动脚本里显式指定版本比如nvm use 22。这样无论系统默认版本怎么变你的AI编码工作台始终跑在验证过的运行时上。Windows用户如果不用WSL直接跑Node.js原生版本可能会遇到路径分隔符和权限问题后面我会专门讲。2.4 Claude Code与Codex的分工逻辑Claude Code和Codex虽然都是AI编码代理但它们的强项不一样。Claude Code在理解大型代码库、做跨文件重构、解释复杂逻辑方面更顺手Codex在生成独立函数、补全测试、快速原型方面响应更快。openrig的设计思路不是二选一而是让它们各占一个tmux窗格你根据任务类型切换。比如你要重构一个模块先把相关文件路径发给Claude Code让它分析依赖关系等它给出方案后再切到Codex窗格让它根据方案生成具体的代码变更。两个代理的上下文互不干扰但你可以手动把Claude Code的输出复制给Codex作为输入。这种“人肉编排”听起来原始但实际用起来比让一个代理干所有事要可靠得多。3. 核心细节解析与实操要点3.1 环境准备Node.js、npm与CLI工具的安装顺序安装顺序很重要。先装Node.js再装npm全局包最后装Claude Code和Codex的CLI。如果你先装了CLI再换Node.js版本全局包会丢失得重装。在Ubuntu上我习惯用nvm而不是apt的Node.js因为apt的版本更新滞后而且权限管理麻烦。# 安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # 重新加载shell配置 source ~/.bashrc # 安装Node.js 22 LTS nvm install 22 nvm use 22 nvm alias default 22 # 验证 node -v npm -vWindows用户如果不用WSL直接去Node.js官网下载LTS版本的msi安装包。安装时勾选“Automatically install the necessary tools”这样npm install时不会因为缺少构建工具而报错。但要注意Windows原生环境下Claude Code的某些终端交互功能可能不如WSL里流畅尤其是涉及tmux的时候。3.2 tmux配置让窗格布局可复现openrig的核心是tmux会话所以tmux配置不能太随意。我建议在~/.tmux.conf里加几行让窗格编号从1开始并且固定窗格大小避免每次attach后布局乱掉。# ~/.tmux.conf set -g base-index 1 setw -g pane-base-index 1 set -g mouse on set -g history-limit 50000 # 固定窗格大小避免自动调整 setw -g aggressive-resize off然后写一个启动脚本比如openrig.sh用tmux new-session -d创建后台会话再用split-window切出三个窗格一个跑Claude Code一个跑Codex一个跑Node.js服务或shell。#!/bin/bash SESSIONopenrig tmux new-session -d -s $SESSION -n main # 窗格0Claude Code tmux send-keys -t $SESSION:main.0 claude C-m # 窗格1Codex tmux split-window -h -t $SESSION:main tmux send-keys -t $SESSION:main.1 codex C-m # 窗格2Node.js shell tmux split-window -v -t $SESSION:main.0 tmux send-keys -t $SESSION:main.2 nvm use 22 C-m # 选中第一个窗格 tmux select-pane -t $SESSION:main.0 tmux attach -t $SESSION这个脚本跑起来后你会看到一个三窗格布局左边上下两个右边一个。Claude Code在左上Node.js shell在左下Codex在右边。你可以用Ctrlb加方向键切换窗格。3.3 Claude Code的安装与首次配置Claude Code的安装方式取决于你用的平台。官方推荐用npm全局安装但国内网络环境下npm源可能需要换成镜像。不过这里要注意换源只影响下载速度不影响功能。npm install -g anthropic-ai/claude-code # 验证 claude --version首次运行claude时它会引导你登录。如果你在VS Code里用Claude Code插件配置方式略有不同。VS Code的Claude Code插件需要你在设置里填入API密钥或者走OAuth登录。我实测下来CLI版本的响应速度比插件版快因为插件版多了一层IDE的通信开销。注意如果你看到“your organization has disabled claude subscription access for claude code”这类提示说明你的账号类型不支持CLI访问需要换个人账号或者联系管理员开通。3.4 Codex的安装与常见报错处理Codex的安装包在官网可以下载Windows桌面版和CLI版是分开的。CLI版通常通过npm安装但有些版本会要求你手动下载二进制文件。热词里“codex安装 csdn”和“codex官网下载”同时出现说明很多人在这两步之间卡住了。npm install -g openai/codex # 如果报错“codex is ignoring 1 unrecognized configuration setting”检查~/.codex/config.jsonCodex的配置文件里常见的坑是model字段写错或者apiKey没填。如果你用第三方API接入DeepSeek或Qwen需要在配置里改baseURL。但要注意不是所有第三方API都兼容Codex的请求格式有些会返回“cc switch local proxy failed while handling codex endpoint /responses”这类错误。遇到这种情况先确认API端点是否支持/responses路径如果不支持就得用兼容层转换。3.5 第三方API接入的注意事项热词里“使用cc switch 接入 deepseek v4, qwen, glm等模型”和“第三方api使用技巧”出现频率很高。cc switch是一个本地代理工具用来把Claude Code或Codex的请求转发到第三方API。它的工作原理是启动一个本地HTTP服务然后修改CLI工具的baseURL指向这个本地服务。配置cc switch时最容易出错的是端口冲突和路径重写。比如Codex默认请求/responses但某些第三方API只提供/v1/chat/completions。cc switch需要做路径映射把/responses转成/v1/chat/completions同时把请求体格式从Codex的格式转成OpenAI兼容格式。如果映射规则写错就会报“local proxy failed”错误。提示cc switch的配置文件里targetBaseURL要填第三方API的完整地址包括/v1后缀。listenPort选一个不常用的端口比如3456避免和Node.js服务冲突。4. 实操过程与核心环节实现4.1 从零搭建openrig工作台的完整步骤假设你在一台干净的Ubuntu 22.04机器上从零开始搭建。第一步更新系统包并安装基础工具。sudo apt update sudo apt install -y curl git tmux build-essential第二步安装nvm和Node.js 22 LTS。按照3.1节的命令执行。安装完成后确认node -v输出v22.x.x。第三步安装Claude Code和Codex的CLI。npm install -g anthropic-ai/claude-code openai/codex第四步创建openrig启动脚本。把3.2节的脚本保存为~/openrig.sh然后chmod x ~/openrig.sh。第五步配置cc switch如果需要接入第三方API。下载cc switch的二进制文件创建配置文件~/.cc-switch/config.json。{ listenPort: 3456, targetBaseURL: https://api.deepseek.com/v1, apiKey: 你的API密钥, pathMapping: { /responses: /chat/completions } }第六步修改Codex配置把baseURL指向cc switch的本地地址。{ baseURL: http://127.0.0.1:3456, apiKey: dummy-key, model: deepseek-chat }第七步运行~/openrig.sh检查三个窗格是否正常启动。Claude Code窗格应该显示登录提示或对话界面Codex窗格应该显示就绪状态Node.js窗格应该能执行node -v。4.2 参数计算tmux窗格大小与终端分辨率tmux窗格大小不是随便切的。如果你的终端分辨率是1920x1080tmux默认会把窗格均分。但Claude Code的对话界面需要至少80列宽才能正常显示Codex的代码输出需要至少100列宽。所以三窗格布局下建议把终端窗口拉大到至少160列宽。你可以用tmux display -p #{window_width}x#{window_height}查看当前tmux窗口的字符尺寸。如果宽度小于160Claude Code的某些表格会换行错乱。这时候要么调整终端字体大小要么改成两窗格布局把Node.js shell放到另一个tmux窗口里。4.3 实操现场记录一次跨代理重构任务我拿一个真实的Node.js项目做测试。项目里有一个utils.js文件里面有个函数parseConfig写得又长又乱。我的目标是让Claude Code分析这个函数的依赖然后让Codex根据分析结果重写。第一步在Claude Code窗格输入请分析 /home/user/project/utils.js 中的 parseConfig 函数列出它依赖的所有外部模块和全局变量并指出潜在的边界条件问题。Claude Code花了大约15秒返回了一份分析报告指出parseConfig依赖了fs、path和lodash并且没有处理config.json不存在的情况。第二步我把Claude Code的输出复制下来切到Codex窗格输入根据以下分析重写 parseConfig 函数要求1. 处理文件不存在的情况2. 用原生fs替代lodash3. 保持函数签名不变。分析内容...Codex在8秒内生成了新代码。我把它粘贴回utils.js然后在Node.js窗格里跑node -e require(./utils).parseConfig()验证。第一次跑报错因为Codex生成的代码里用了fs.promises但原函数是同步的。我回到Codex窗格补充说明“保持同步API”Codex重新生成了正确版本。这次实操让我意识到跨代理协作的关键是“把上下文显式传递”。Claude Code的分析结果不能自动流到Codex必须手动复制。但好处是你可以审查每一步的输出避免代理之间互相“幻觉”传染。4.4 自动化脚本用tmux send-keys串联代理手动复制粘贴毕竟麻烦。我写了一个简单的shell函数把Claude Code的输出抓出来自动发给Codex。#!/bin/bash # 抓取Claude Code窗格的最后20行 CLAUDE_OUTPUT$(tmux capture-pane -t openrig:main.0 -p -S -20) # 发送给Codex窗格 tmux send-keys -t openrig:main.1 根据以下分析重写代码$CLAUDE_OUTPUT C-m这个脚本很粗糙因为capture-pane抓的是屏幕上的文本可能包含提示符和边框字符。更可靠的做法是让Claude Code把输出写到文件然后Codex从文件读取。但无论如何这个思路证明了tmux的脚本化能力可以让openrig从“手动工作台”进化成“半自动流水线”。5. 常见问题与排查技巧实录5.1 Claude Code安装后命令找不到这是最常见的问题尤其是用nvm安装Node.js后全局包的路径没有加入PATH。npm install -g会把包装到~/.nvm/versions/node/v22.x.x/bin/下但这个目录可能不在你的PATH里。解决方法是在~/.bashrc或~/.zshrc里加一行export PATH$HOME/.nvm/versions/node/v22.0.0/bin:$PATH然后source ~/.bashrc。如果你不确定Node.js的安装路径用nvm which 22查看。5.2 Codex报“unrecognized configuration setting”这个错误通常是因为配置文件里有多余的字段或者字段名拼写错误。Codex的配置解析很严格不认识的字段会直接警告。打开~/.codex/config.json对照官方文档检查每个字段。常见的错误包括把apiKey写成api_key或者把baseURL写成baseUrl。JSON格式本身也要检查尾逗号会导致解析失败。5.3 cc switch代理启动后请求超时cc switch启动后如果Codex请求超时先检查listenPort是否被占用。用lsof -i :3456查看。如果端口被占换一个端口。然后检查targetBaseURL是否可达用curl直接请求第三方API的端点确认网络连通性。如果第三方API需要特定的请求头比如Authorization: Bearercc switch的配置里要加上headers字段。5.4 tmux会话中Claude Code界面错乱这通常是终端类型或TERM环境变量的问题。在tmux里TERM默认是screen或tmux-256color。Claude Code的TUI界面依赖TERM来渲染颜色和光标。如果界面错乱在~/.tmux.conf里加set -g default-terminal tmux-256color set -ga terminal-overrides ,*256col*:Tc然后重启tmux会话。如果还是不行检查终端模拟器本身的设置确保它支持256色。5.5 Node.js版本切换后全局包丢失用nvm切换Node.js版本后之前版本安装的全局包不会自动迁移。你需要在新版本下重新npm install -g。为了避免重复安装可以在~/.nvm/default-packages文件里列出常用的全局包nvm在安装新版本时会自动安装这些包。# ~/.nvm/default-packages anthropic-ai/claude-code openai/codex typescript ts-node5.6 常见问题速查表问题现象可能原因排查步骤解决方法claude: command not foundPATH未包含npm全局目录npm bin -g查看路径将路径加入PATHCodex报配置字段错误字段名拼写错误或多余字段检查~/.codex/config.json对照官方文档修正cc switch请求超时端口占用或目标API不可达lsof -i :端口curl测试API换端口检查API密钥和请求头tmux界面错乱TERM变量不兼容echo $TERM设置tmux-256colorNode.js切换后包丢失nvm不迁移全局包npm list -g重新安装或配置default-packagesClaude Code登录失败账号类型不支持或网络问题检查账号权限换账号或联系管理员6. 进阶玩法把本地模型接进openrig6.1 LM Studio与Claude Code的对接思路热词里“claude code 调用lmstudio的本地模型”是一个很实际的需求。LM Studio可以在本地跑开源模型并提供OpenAI兼容的API。Claude Code默认请求Anthropic的API但你可以通过设置环境变量ANTHROPIC_BASE_URL把请求重定向到LM Studio的本地端点。export ANTHROPIC_BASE_URLhttp://127.0.0.1:1234/v1 export ANTHROPIC_API_KEYlm-studio claude但要注意Claude Code的请求格式和OpenAI格式不完全一样。LM Studio的OpenAI兼容层可能无法处理Claude Code的某些字段比如system提示的嵌套结构。实测下来简单的对话可以跑通但复杂的工具调用会失败。如果你主要用Claude Code做代码解释和简单重构本地模型够用如果要跑完整的代理任务还是得用官方API。6.2 用tmux窗格监控本地模型资源占用本地模型跑起来后GPU和内存占用会飙升。你可以在openrig里加一个窗格专门跑nvidia-smi -l 2或htop实时监控资源。这样当Claude Code响应变慢时你能立刻判断是模型推理慢还是网络问题。tmux split-window -v -t openrig:main.1 tmux send-keys -t openrig:main.3 nvidia-smi -l 2 C-m这个监控窗格不参与编码任务但能帮你快速定位性能瓶颈。如果GPU利用率一直100%说明模型在满负荷跑这时候再发新请求只会排队。你可以等当前任务完成或者换一个更小的模型。6.3 多模型切换的配置管理如果你同时用DeepSeek、Qwen和GLM每个模型的API端点和密钥都不一样。手动改配置文件太麻烦。我建议用direnv或者简单的shell函数根据当前项目切换环境变量。# ~/.bashrc use_deepseek() { export OPENAI_BASE_URLhttps://api.deepseek.com/v1 export OPENAI_API_KEYsk-deepseek-xxx } use_qwen() { export OPENAI_BASE_URLhttps://dashscope.aliyuncs.com/compatible-mode/v1 export OPENAI_API_KEYsk-qwen-xxx }然后在tmux窗格里先执行use_deepseek再启动Codex。这样Codex就会用DeepSeek的端点。切换模型时只需要重新执行对应的函数然后重启Codex进程。7. 我踩过的坑与最后分享的几个技巧第一个坑是tmux的send-keys在发送多行文本时会提前执行。比如你想把一段包含换行的代码发给Codexsend-keys会把每个换行当成回车导致代码被拆成多条命令执行。解决方法是先把文本写到临时文件然后用tmux send-keys -t pane cat /tmp/code.txt | codex C-m或者用load-buffer和paste-buffer。第二个坑是Claude Code和Codex同时运行时CPU占用会叠加。如果你的机器只有4核两个代理同时跑复杂任务响应会明显变慢。我的做法是给tmux窗格设置不同的优先级用nice命令降低非活跃窗格的进程优先级。比如Codex在后台跑时用nice -n 10 codex启动。第三个技巧是关于会话持久化。tmux会话虽然能持久化但如果机器重启会话就没了。我写了一个systemd服务开机自动创建openrig会话并恢复上次的窗格布局。这样即使远程机器重启我连上去就能继续干活。# ~/.config/systemd/user/openrig.service [Unit] DescriptionOpenRig tmux session Afternetwork.target [Service] Typeforking ExecStart/home/user/openrig.sh ExecStop/usr/bin/tmux kill-session -t openrig [Install] WantedBydefault.target启用服务systemctl --user enable openrig.service。这样每次登录openrig会话自动就绪。最后再分享一个小技巧在tmux里用Ctrlb z可以把当前窗格全屏再按一次恢复。当你需要专注看Claude Code的长输出时这个快捷键比调整窗格大小快得多。我通常把Claude Code窗格全屏看分析结果然后恢复布局切到Codex窗格写代码。这套流程跑顺了之后终端里的AI编码体验会流畅很多。
返回列表