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