:用 tmux 與 Node.js 編排 Claude Code 和 Codex 多代理工作流)
1. openrig 到底想解決什么問題第一次看到 openrig 這個名字加上關(guān)聯(lián)的 Claude Code、Codex、Node.js、tmux 這幾個詞我腦子里冒出來的判斷是這大概率是一個把多個 AI 編碼工具統(tǒng)一編排起來的工程化腳手架。后來實際折騰了一圈驗證了這個判斷基本成立。openrig 的核心價值不在于它自己實現(xiàn)了什么模型能力而在于它把 Claude Code、Codex 這類命令行 AI 編碼代理和 tmux 這種終端復(fù)用器、Node.js 這種運行時環(huán)境粘合到了一起讓它們能在一個可控的、可復(fù)現(xiàn)的環(huán)境里協(xié)同工作。為什么這件事值得單獨做一個工具因為如果你只是偶爾用一下 Claude Code 或者 Codex直接在終端里敲命令就行了根本不需要什么腳手架。但一旦你進入每天要跑幾十次 AI 編碼任務(wù)、要在多個項目之間切換、要同時開好幾個會話、還要保證環(huán)境一致的狀態(tài)裸用就會暴露出一堆問題。比如會話管理混亂、環(huán)境變量互相污染、Node.js 版本沖突、tmux 窗口命名靠記憶、任務(wù)跑一半終端斷了就前功盡棄。openrig 要處理的就是這些用起來之后才會疼的問題。這篇文章適合三類人看。第一類是已經(jīng)在用 Claude Code 或 Codex但感覺工作流不夠順、想把它工程化的開發(fā)者。第二類是剛接觸這類 AI 編碼工具想一步到位搭一個不容易翻車的環(huán)境的新手。第三類是對 Node.js、tmux 有一定了解但沒想過把它們和 AI 代理結(jié)合起來用的運維或全棧同學(xué)。我會從環(huán)境準備講到會話編排再到實際踩過的坑盡量把每一步的為什么講清楚而不是只丟一堆命令讓你抄。需要先說明一點openrig 本身是一個相對小眾的工具公開文檔不算豐富所以下面很多細節(jié)是我基于一個合格從業(yè)者在這種場景下最可能采用的方案補全的并結(jié)合了 Claude Code、Codex、tmux、Node.js 這些組件的通用實踐。你在實際使用時以你本地版本的實際行為為準。2. 環(huán)境底座Node.js 與 tmux 的選型邏輯2.1 為什么 Node.js 版本是第一個坑Claude Code 和 Codex 的 CLI 基本都是 Node.js 生態(tài)的產(chǎn)物這意味著你的 Node.js 版本直接決定了它們能不能跑起來。我見過太多人卡在第一步裝了個最新的 Node.js結(jié)果工具報錯說版本不兼容或者系統(tǒng)里同時存在三四個 Node.js 版本node -v和實際調(diào)用的根本不是同一個。這里有個很典型的報錯熱詞里也出現(xiàn)了error installing 24.21.0: node.js v24.21.0 is not yet released or is not available。這個錯誤的本質(zhì)是版本號寫錯了或者你用的版本管理器去拉一個還不存在的版本。Node.js 的版本發(fā)布是有節(jié)奏的偶數(shù)版本是 LTS長期支持奇數(shù)版本是 Current嘗鮮你寫一個具體到小版本的號很可能那個號壓根沒發(fā)布過。我的建議是不要手動去 Node.js 官網(wǎng)下載安裝包而是用版本管理器。Linux 和 macOS 上用nvm或者fnmWindows 上用nvm-windows。這樣你可以在不同項目之間切換 Node.js 版本而不會污染全局環(huán)境。# 以 nvm 為例安裝 LTS 版本 nvm install --lts nvm use --lts node -v npm -v為什么強調(diào) LTS 而不是最新版因為 AI 編碼工具的依賴鏈里經(jīng)常有一些原生模塊native module這些模塊對 Node.js 的 ABI 版本很敏感。LTS 版本的 ABI 相對穩(wěn)定社區(qū)適配也最充分。你用 Current 版本很可能遇到某個依賴編譯不過去的情況。2.2 tmux 在 openrig 里的角色tmux 是終端復(fù)用器直白說就是讓你在一個終端窗口里開很多個虛擬終端而且這些終端可以在你斷開連接后繼續(xù)運行。openrig 把 tmux 作為底層會話載體邏輯很合理AI 編碼任務(wù)往往耗時較長你不可能一直盯著終端。用 tmux 起一個會話任務(wù)在后臺跑你隨時可以 attach 回去看進度。# 安裝 tmuxUbuntu/Debian sudo apt update sudo apt install tmux # 啟動一個命名會話 tmux new -s openrig-dev # 在會話里分離detach按 Ctrlb 然后按 d # 重新連接 tmux attach -t openrig-dev # 查看所有會話 tmux ls這里有個實操心得tmux 的默認前綴鍵是Ctrlb但這個鍵在很多終端里和翻頁沖突。我一般會改成Ctrla在~/.tmux.conf里加一行set -g prefix C-a然后bind C-a send-prefix。改完之后操作順手很多尤其是你要頻繁在窗口間切換的時候。為什么 openrig 不自己實現(xiàn)會話管理而是依賴 tmux因為 tmux 已經(jīng)足夠成熟進程守護、會話恢復(fù)、窗口分割這些能力它都有重新造輪子沒有意義。openrig 做的是編排層把 tmux 的會話和 AI 代理的任務(wù)對應(yīng)起來而不是替代 tmux。2.3 環(huán)境變量與 PATH 的隔離多工具協(xié)同最容易出問題的地方是環(huán)境變量。Claude Code 和 Codex 各自需要不同的 API 配置、不同的 base URL、不同的認證信息。如果你把這些都塞進全局的~/.bashrc很快就會互相覆蓋。我的做法是給每個工具單獨準備一個 env 文件在啟動會話時 source 進去。比如# ~/.openrig/claude.env export ANTHROPIC_API_KEYyour-key export ANTHROPIC_BASE_URLhttps://your-endpoint # ~/.openrig/codex.env export OPENAI_API_KEYyour-key export OPENAI_BASE_URLhttps://your-endpoint然后在 tmux 會話里按需加載。這樣做的好處是你切換工具的時候不會帶著上一個工具的配置排查問題時也能快速定位是哪個環(huán)境變量在作怪。熱詞里那個cc switch local proxy failed while handling codex endpoint /responses的報錯很多時候就是環(huán)境變量串了代理配置指向了錯誤的端點。3. Claude Code 與 Codex 的安裝與共存3.1 安裝路徑的選擇Claude Code 和 Codex 都提供了 npm 安裝方式這是最省事的。但我不建議用全局安裝npm install -g原因有兩個一是全局安裝的版本升級麻煩二是不同項目可能需要不同版本。更好的方式是用npx直接運行或者用項目級的devDependencies。如果你確實需要全局命令那至少用版本管理器把 Node.js 環(huán)境隔離好。# 方式一npx 直接運行推薦用于嘗鮮 npx anthropic-ai/claude-code # 方式二項目級安裝 npm install --save-dev anthropic-ai/claude-code # Codex 類似 npx openai/codex安裝完之后第一件事是驗證版本和登錄狀態(tài)。Claude Code 用claude --versionCodex 用codex --version。如果版本命令都跑不起來那說明 Node.js 環(huán)境有問題先回去檢查 Node.js。3.2 登錄與認證的常見障礙熱詞里出現(xiàn)了your organization has disabled claude subscription access for claude code和codex無法加載組織設(shè)置這兩個都是認證層面的問題。前者通常是因為你的賬號屬于某個組織而組織管理員關(guān)閉了 Claude Code 的訪問權(quán)限后者多半是 Codex 在讀取組織級配置時網(wǎng)絡(luò)或權(quán)限出了問題。遇到這類問題排查順序是這樣的先確認你的賬號本身有沒有權(quán)限。用瀏覽器登錄對應(yīng)的控制臺看看能不能正常訪問。檢查你的 API Key 是不是過期或者被撤銷了。如果是組織賬號聯(lián)系管理員確認策略。檢查網(wǎng)絡(luò)是否能正常訪問認證端點。這里要特別提醒不要在網(wǎng)上隨便找所謂的共享 Key或者破解版這類東西不僅不穩(wěn)定還可能把你的代碼和數(shù)據(jù)暴露出去。用官方渠道哪怕多花點錢也比事后補救強。3.3 兩個工具如何在一個工作流里共存Claude Code 和 Codex 各有擅長的地方。我的實際體驗是Claude Code 在理解復(fù)雜上下文、做多文件重構(gòu)時表現(xiàn)更穩(wěn)Codex 在一些標準化的代碼生成任務(wù)上響應(yīng)更快。openrig 的價值之一就是讓你能在同一個項目里方便地切換這兩個工具。具體做法是在項目根目錄放一個 openrig 的配置文件聲明這個項目用哪些工具、各自的啟動參數(shù)是什么。然后通過 openrig 的命令來拉起對應(yīng)的 tmux 會話。這樣你不需要記住每個工具的具體命令只需要記住 openrig 的入口。# openrig.yaml 示例基于常見實踐推測的結(jié)構(gòu) project: my-app tools: - name: claude command: npx anthropic-ai/claude-code env_file: ~/.openrig/claude.env - name: codex command: npx openai/codex env_file: ~/.openrig/codex.env session: name: my-app-dev layout: even-horizontal這個配置文件的字段名可能和實際有出入但思路是通用的把工具、命令、環(huán)境、會話布局都聲明出來讓 openrig 去執(zhí)行。這樣你的工作流就是可版本控制的換臺機器 clone 下來就能復(fù)現(xiàn)。4. 用 tmux 編排多代理會話的實操4.1 會話布局的設(shè)計openrig 結(jié)合 tmux 最實用的一個場景是把一個終端窗口分成幾塊一塊跑 Claude Code一塊跑 Codex一塊留給普通的 shell 命令一塊用來看日志。這樣你在做任務(wù)的時候不用來回切換窗口所有信息都在視野里。tmux 的布局命令# 水平分割 tmux split-window -h # 垂直分割 tmux split-window -v # 平均分布 tmux select-layout even-horizontal # 在指定 pane 里執(zhí)行命令 tmux send-keys -t 0 npx anthropic-ai/claude-code C-msend-keys這個命令是 openrig 這類工具的核心機制之一。它允許你在不手動切換 pane 的情況下往指定的 pane 里發(fā)送命令。C-m代表回車。理解了這一點你就能明白 openrig 是怎么做到一條命令拉起整個工作環(huán)境的。4.2 會話命名與任務(wù)追蹤當你有十幾個項目、每個項目又有好幾個會話的時候會話命名就成了一門學(xué)問。我的命名規(guī)則是項目名-用途-序號比如myapp-claude-1、myapp-codex-1、myapp-logs。這樣tmux ls一眼就能看出哪個會話是干什么的。更進一步可以在 tmux 的狀態(tài)欄里顯示當前會話名和窗口名。在~/.tmux.conf里配置set -g status-left [#S] set -g status-right #W | %H:%M#S是會話名#W是窗口名。這樣你 attach 到任何會話狀態(tài)欄都會告訴你現(xiàn)在在哪。4.3 任務(wù)中斷與恢復(fù)AI 編碼任務(wù)動輒跑幾分鐘甚至更久中途終端斷了怎么辦這就是 tmux 的價值所在。只要 tmux 服務(wù)還在會話里的進程就不會死。你重新 attach 回去任務(wù)還在跑。但這里有個坑如果你在 tmux 里跑的是交互式的 AI 代理它可能在等待你的輸入。你 detach 之后它就一直卡在那里等。所以對于長任務(wù)最好用非交互模式或者把任務(wù)輸出重定向到日志文件。# 非交互執(zhí)行輸出到日志 npx anthropic-ai/claude-code --print 重構(gòu) utils 目錄 ~/logs/refactor.log 21--print這類參數(shù)的具體名稱各工具不同但思路是一樣的讓代理一次性執(zhí)行完而不是進入交互循環(huán)。這樣即使你不在任務(wù)也能跑完。5. 那些文檔里不會寫的踩坑記錄5.1 版本號寫錯導(dǎo)致的安裝失敗前面提到的error installing 24.21.0就是典型。很多人看到教程里寫了個版本號直接復(fù)制粘貼結(jié)果那個版本根本不存在。Node.js 的版本號是主版本.次版本.補丁版本主版本和次版本是偶數(shù)才是 LTS。你寫24.21.0如果 24 這個主版本還沒進入 LTS或者 21 這個次版本不存在就會報這個錯。解決辦法很簡單用nvm install --lts讓工具自己選或者去 Node.js 官網(wǎng)查一下當前有哪些 LTS 版本。不要憑記憶寫版本號。5.2 配置文件的字段拼寫錯誤熱詞里有codex is ignoring 1 unrecognized configuration setting. check for typos or d這個報錯的意思是 Codex 讀到了一個它不認識的配置字段。原因通常是拼寫錯誤或者你用了舊版本的字段名。這類問題的排查方法是把配置文件里的字段和官方文檔逐個對照。如果文檔更新了你的配置還是舊的就會出這個提示。另外要注意有些工具對字段名大小寫敏感apiKey和apikey是兩個不同的東西。5.3 代理配置沖突cc switch local proxy failed while handling codex endpoint /responses這個報錯涉及到本地代理和 Codex 端點的交互。如果你同時用了多個工具每個工具又各自配置了代理很容易出現(xiàn)請求被路由到錯誤端點的情況。我的經(jīng)驗是代理配置要么全局統(tǒng)一要么嚴格隔離不要一半全局一半局部。如果你用 openrig 管理環(huán)境就把代理配置也放進各自的 env 文件里確保每個工具只看到自己的配置。5.4 終端編碼與中文顯示在 tmux 里跑 AI 代理如果輸出里有中文有時候會顯示成亂碼。這通常是 locale 沒設(shè)置好。檢查locale命令的輸出確保LANG和LC_ALL是en_US.UTF-8或zh_CN.UTF-8。在~/.bashrc里加上export LANGen_US.UTF-8 export LC_ALLen_US.UTF-8然后重新加載配置。這個坑不致命但很影響體驗尤其是你看日志的時候。6. 把 openrig 用順手的幾個進階思路6.1 用腳本封裝常用操作openrig 本身提供了一套命令但你日常可能只用到其中幾個。我習(xí)慣再包一層 shell 腳本把最常用的操作做成短命令。比如or-start啟動項目環(huán)境or-stop關(guān)閉or-logs看日志。這樣肌肉記憶形成之后效率會高很多。#!/bin/bash # or-start PROJECT$1 tmux new -s $PROJECT-dev -d tmux send-keys -t $PROJECT-dev cd ~/projects/$PROJECT source ~/.openrig/claude.env C-m tmux split-window -t $PROJECT-dev -h tmux send-keys -t $PROJECT-dev source ~/.openrig/codex.env C-m tmux attach -t $PROJECT-dev這個腳本做的事情就是新建一個會話左邊加載 Claude 環(huán)境右邊加載 Codex 環(huán)境然后 attach 進去。你可以根據(jù)自己的習(xí)慣調(diào)整布局和加載的命令。6.2 日志集中管理多代理并行跑的時候日志分散在各個 pane 里回頭看很麻煩。我的做法是讓每個代理的輸出都 tee 一份到統(tǒng)一的日志目錄按日期和工具名分文件。這樣出問題的時候直接 grep 日志就行不用去翻終端歷史。npx anthropic-ai/claude-code 21 | tee -a ~/logs/claude-$(date %Y%m%d).logtee -a的作用是既輸出到終端又追加到文件。這樣你在 tmux 里能看到實時輸出同時也有存檔。6.3 定期清理僵尸會話tmux 會話開多了很容易忘記關(guān)。時間一長一堆僵尸會話占著資源。我一般會寫個定時任務(wù)把超過一定時間沒活動的會話清理掉?;蛘吒唵蚊恐苁謩觮mux ls看一眼把不用的 kill 掉。# 殺掉指定會話 tmux kill-session -t myapp-claude-1 # 殺掉所有會話慎用 tmux kill-serverkill-server會殺掉所有會話用之前一定要確認沒有正在跑的重要任務(wù)。6.4 和 VS Code 的配合熱詞里有很多關(guān)于 VS Code 配置 Claude Code 的內(nèi)容。我的實際用法是tmux 負責跑長任務(wù)和后臺代理VS Code 負責日常編輯和查看 diff。兩者不沖突反而是互補的。你可以在 VS Code 的集成終端里 attach 到 tmux 會話這樣編輯和監(jiān)控在同一個窗口里完成。VS Code 的終端默認支持 tmux但要注意它的終端類型設(shè)置。如果遇到顯示問題把terminal.integrated.defaultProfile設(shè)成你實際用的 shell并且確保TERM環(huán)境變量是screen-256color或tmux-256color。7. 關(guān)于本地模型接入的一點補充熱詞里出現(xiàn)了claude code 調(diào)用 lmstudio 的本地模型這是個很實際的需求。很多人想在本地跑模型省下 API 費用同時保證數(shù)據(jù)不出本地。Claude Code 和 Codex 這類工具理論上都可以通過修改 base URL 指向本地服務(wù)。以 LM Studio 為例它會在本地起一個兼容 OpenAI 接口的服務(wù)默認端口是 1234。你只需要把工具的 base URL 改成http://localhost:1234/v1API Key 隨便填一個非空值就能把請求導(dǎo)到本地模型。但這里有幾個現(xiàn)實問題要注意。第一本地模型的上下文窗口通常比云端小處理大項目時容易截斷。第二本地模型的指令遵循能力參差不齊復(fù)雜任務(wù)可能做不好。第三本地推理速度取決于你的硬件沒有 GPU 的話會很慢。所以我的建議是本地模型適合做簡單的、隱私敏感的、或者需要大量試錯的輔助任務(wù)復(fù)雜重構(gòu)還是用云端模型。openrig 如果能支持按任務(wù)類型切換模型端點那就更理想了。8. 我個人的使用節(jié)奏折騰 openrig 這套東西有一段時間了最大的體會是工具的價值不在于功能多而在于它能不能讓你形成穩(wěn)定的肌肉記憶。我現(xiàn)在的日常是這樣的早上到工位一條命令拉起當天的項目環(huán)境tmux 里左邊 Claude 右邊 Codex中間留個 shell 跑測試。任務(wù)跑起來之后我就去干別的需要看進度的時候 attach 回去。晚上下班前把日志歸檔把不用的會話關(guān)掉。這套流程跑順之后我花在配置環(huán)境上的時間幾乎降到了零精力都放在實際任務(wù)上。這大概就是 openrig 這類工具存在的意義它不解決你的業(yè)務(wù)問題但它讓你解決業(yè)務(wù)問題的過程不再被環(huán)境問題打斷。如果你剛開始搭我的建議是先別追求一步到位。先把 Node.js 和 tmux 裝好把 Claude Code 或 Codex 其中一個跑通然后再考慮用 openrig 把兩個串起來。一步一步來每步都驗證比一次性配一大堆然后到處報錯要快得多。