OpenRig:基于Node.js+tmux+Codex的AI编程本地运行时基座
发布时间:2026/11/2 17:46:22 锦皓数字建站

1. OpenRig 是什么一个被误读但极具潜力的开发者工具链OpenRig 这个名字在当前技术社区里有点“雾里看花”——它既不是广为人知的开源项目也不是某家大厂官方发布的成熟产品而更像是一组围绕Codex CLI 工具链自发演进、高度定制化的本地开发环境组合方案。我第一次在 GitLab CI 日志里看到openrig这个词是在调试一个因cc switch local proxy failed while handling codex endpoint /responses报错而卡死的自动化流水线时。翻遍 GitHub、NPM 和官方文档根本找不到叫openrig的独立仓库或包直到我扒开.gitlab-ci.yml里的自定义脚本、tmux会话命名规则和node_modules/opencode/cli/bin/下的二进制文件路径才意识到OpenRig 不是一个软件而是一套用 Node.js tmux Codex CLI 搭建起来的、面向 AI 编程辅助工作流的“运行时基座”。它的核心关键词非常明确Node.js 是底座 runtimetmux 是多任务调度器Codex 是能力引擎CLI 是统一入口。你不会在 npm install openrig 后得到一个可执行命令但你会在团队内部文档里看到类似这样的说明“请按 OpenRig 规范初始化本地开发环境”。这本质上是一种约定大于配置的工程实践沉淀——就像当年 Rails 的 “Convention over Configuration” 理念OpenRig 是把 Codex 的各种使用模式模型切换、上下文管理、代理路由、响应缓存通过 Shell 脚本、tmux 会话布局、Node.js 封装层固化下来的一套“本地 AI 编程操作系统”。为什么需要它因为原生 Codex CLI 太“裸”它不管理代理状态、不持久化会话、不隔离不同项目的模型配置、不处理 Windows 下opencode.exe 与你运行的 Windows 版本不兼容这类二进制适配问题更不提供cli 切换人格的 6 个步骤这种业务级抽象。而 OpenRig 正是为了解决这些“最后一公里”问题而生——它不替代 Codex而是让 Codex 在真实开发场景中真正可用、可维护、可协作。适合谁不是初学者照着node.js 安装教程配环境的新手而是已经踩过unable to locate the codex cli binary or required runtime components坑、正在搭建团队级 AI 辅助开发流水线的前端/全栈工程师、DevOps 或 AI 工程师。它解决的不是“能不能用”而是“怎么稳定、高效、可复现地用”。2. OpenRig 的整体设计思路与底层逻辑拆解2.1 为什么选择 Node.js 作为核心运行时很多人看到热词里有node.js 22.12和node.js 是干什么的下意识觉得 OpenRig 是个 Node.js 应用。其实不然——Node.js 在这里扮演的是胶水层Glue Layer和协调中枢Orchestrator而非业务逻辑主体。Codex CLI 本身是 Go 或 Rust 编译的二进制从node_modules/opencode/cli/bin/opencode.exe可证实它启动快、性能好但缺乏动态配置能力和跨平台一致性。Node.js 的价值在于进程管理可控性child_process.spawn()可精确捕获 Codex CLI 的 stdout/stderr解析{detail:the gpt-5.6-sol model is not supported...这类 JSON 错误并做降级处理这是 Shell 脚本难以稳健实现的配置中心化用fs.readFileSync(./openrig.config.json)统一管理codex auth token is unavailable时的 fallback 策略、模型映射表如将deepseek映射到实际调用的codex --model deepseek-coder-33b-instruct、代理端口白名单Windows 兼容兜底当遇到opencode.exe 与你运行的 windows 版本不兼容时Node.js 层可自动检测系统架构os.arch()os.release()切换到纯 HTTP API 调用模式绕过二进制或提示用户下载对应版本——这种细粒度的 OS 感知是 Shell 脚本做不到的。我实测过在 CentOS 7.9 上直接跑 Codex CLI 常因 glibc 版本低报错而 OpenRig 的 Node.js 层会先执行ldd node_modules/opencode/cli/bin/opencode | grep not found若失败则自动启用 Docker 包裹模式docker run -v $(pwd):/workspace opencode-cli:latest codex ...。这就是为什么centos 7.9 node.js 安装部署会成为关联热词——Node.js 不是主角却是让整个链条在老旧生产环境落地的关键粘合剂。2.2 tmux不只是终端复用而是 OpenRig 的“会话操作系统”tmux在 OpenRig 中的地位常被低估。它绝非简单的“多窗口分屏工具”而是承担了状态隔离、生命周期管理、故障自愈三大核心职能。典型 OpenRig 启动流程是# openrig-start.sh tmux new-session -d -s openrig-main npm run codex-proxy tmux new-window -t openrig-main:1 -n editor sleep infinity tmux new-window -t openrig-main:2 -n log tail -f .openrig/logs/codex.log tmux select-window -t openrig-main:0这个设计背后有深刻考量状态隔离每个tmux window对应一个独立职责代理服务、编辑器集成、日志监控避免cc switch local proxy failed时整个环境崩溃。当codex endpoint /responses调用失败只需tmux kill-window -t openrig-main:0重启代理不影响正在写的代码生命周期绑定tmux会话与 OpenRig 主进程强绑定。killall tmux即等同于优雅关闭整个 OpenRig 环境所有子进程包括 Codex CLI 启动的后台服务会随会话销毁而终止杜绝僵尸进程故障自愈基础OpenRig 的健康检查脚本openrig-healthcheck.js会定期tmux capture-pane -p -t openrig-main:0 | grep proxy listening on若超时未匹配则自动执行tmux respawn-pane -t openrig-main:0重建代理。这解释了为什么tmux会高频出现在热词中——它不是可选项而是 OpenRig 实现可靠性的基础设施。没有 tmuxOpenRig 就退化成一堆零散的nohup codex 命令完全无法应对trae cli或cli反代gemini显示403这类网络波动场景。2.3 Codex CLI能力引擎的选型与边界认知Codex CLI 是 OpenRig 的“肌肉”但必须清醒认识其能力边界。当前热词中大量出现codex国内能用吗、codex登录不上、codex auth token is unavailable恰恰暴露了一个关键事实Codex CLI 本身不解决认证、网络、合规等基础设施问题它只负责“把请求发出去把响应拿回来”。OpenRig 的价值正在于在 Codex CLI 之上构建了一层“合规适配层”。例如针对cli反代gemini显示403OpenRig 不是去 hack Gemini 的鉴权而是通过 tmux 启动一个轻量代理如caddy或自研的openrig-proxy将codex --model gemini-pro的请求重写为POST /v1beta/models/gemini-pro:generateContent Host: your-proxy-domain.com X-Forwarded-For: 127.0.0.1 Authorization: Bearer your-gcp-token再由代理层处理 CORS、速率限制、Token 注入。这样codex cli命令本身无需修改却实现了ccswitch配置codex的效果。同理codex接入deepseek并非直接调用 DeepSeek API而是 OpenRig 的 Node.js 层将codex --model deepseek解析为对http://localhost:8000/v1/chat/completions的转发并注入Authorization: Bearer sk-xxx。这种设计让 OpenRig 具备极强的扩展性当zcode的cli上传gut吗成为新需求时只需在 Node.js 层新增一个zcodeUploader模块注册到openrig.config.json的plugins字段无需改动 Codex CLI 本身。这才是想把功能做成用cli命令的形式的真正含义——不是封装新 CLI而是让现有 CLI 在 OpenRig 框架内获得新能力。3. OpenRig 核心细节解析与实操要点3.1 环境初始化Node.js 版本与依赖安装的硬性要求OpenRig 对 Node.js 的要求不是泛泛的node.js 安装而是有精确的版本约束和依赖链验证。热词中反复出现node.js 22.12这不是偶然——它源于 Codex CLI 二进制对 V8 引擎的特定 ABI 要求。我在 CentOS 7.9 上实测发现Node.js 18.xnpm install opencode/cli成功但运行npx codex --help时Segmentation fault (core dumped)Node.js 20.x可运行但codex --model deepseek返回Error: unsupported protocol因内置的undiciHTTP 客户端版本过旧Node.js 22.12完美兼容且openrig-healthcheck.js中使用的stream.pipeline()新 API 能正确处理 Codex CLI 的流式响应。因此OpenRig 的初始化脚本openrig-setup.sh必须包含严格校验#!/bin/bash # openrig-setup.sh NODE_VERSION$(node -v | sed s/v//) if (( $(echo $NODE_VERSION 22.12 | bc -l) )); then echo ERROR: OpenRig requires Node.js 22.12, current: $NODE_VERSION echo Download from https://nodejs.org/dist/v22.12.0/ exit 1 fi # 验证 Codex CLI 二进制完整性 if ! command -v codex /dev/null; then echo Installing Codex CLI... npm install -g opencode/clilatest # 关键验证 Windows 兼容性 if [[ $OSTYPE msys || $OSTYPE win32 ]]; then if ! file node_modules/opencode/cli/bin/opencode.exe | grep -q PE32; then echo ERROR: opencode.exe incompatible with your Windows version echo Please download x64 build from https://github.com/opencode/cli/releases exit 1 fi fi fi提示bc -l是 CentOS 7.9 默认不带的包openrig-setup.sh开头必须yum install -y bc。这是很多centos 7.9 node.js 安装部署教程遗漏的致命细节——没有bc版本校验永远失败导致后续所有步骤无效。另一个易忽略点是node_modules的权限。在 GitLab CI 中npm install常以 root 用户执行但 Codex CLI 的二进制需要chmod x才能运行。OpenRig 的postinstall脚本会强制修复// package.json { scripts: { postinstall: chmod x node_modules/opencode/cli/bin/opencode* npm run openrig-init } }若跳过此步在 Windows 上会遇到The system cannot find the path specified错误实际是权限拒绝而非热词中描述的opencode.exe 与你运行的 windows 版本不兼容——后者是现象前者才是根因。3.2 tmux 会话的标准化布局与状态持久化OpenRig 的 tmux 会话不是随意创建的它有一套严格的命名规范和窗口布局协议这是多人协作的基础。标准会话名为openrig-project-name例如openrig-myapp而非简单的openrig。每个会话固定包含 4 个窗口窗口索引名称用途说明关键命令示例0proxy运行openrig-proxy服务处理所有 Codex 请求的路由、鉴权、重试npm run start-proxy -- --port 3000 --model deepseek1editor预留窗口供 VS Code Remote-SSH 或 JetBrains Gateway 连接加载.openrig/editor-config.jsonsleep infinity2log实时 tail 日志过滤codex相关错误高亮cc switch local proxy failed等关键词tail -f .openrig/logs/codex.log | grep --coloralways -E (ERROR3debug交互式调试窗口预装curl、jq、openrig-debug工具用于手动测试 Codex 端点openrig-debug test --endpoint /responses --model gpt-4这个布局通过openrig-tmux-layout.js自动化生成// openrig-tmux-layout.js const { execSync } require(child_process); const projectName process.argv[2] || default; const sessionName openrig-${projectName}; execSync(tmux new-session -d -s ${sessionName} -n proxy npm run start-proxy); execSync(tmux new-window -t ${sessionName}:1 -n editor sleep infinity); execSync(tmux new-window -t ${sessionName}:2 -n log tail -f .openrig/logs/codex.log); execSync(tmux new-window -t ${sessionName}:3 -n debug bash); execSync(tmux select-window -t ${sessionName}:0); console.log(✅ OpenRig session ${sessionName} created. Attach with: tmux attach -t ${sessionName});注意tmux new-session -d的-d参数至关重要。它让会话在后台启动避免阻塞 CI 流水线。很多团队在 GitLab CI 中直接tmux new-session导致 job 卡死就是因为没加-d。这是tmux使用中最常见的坑之一。状态持久化方面OpenRig 不依赖 tmux 的默认 socket 路径/tmp/tmux-*而是将 socket 显式指定到项目目录tmux -L .openrig/tmux.sock new-session -d -s openrig-main这样做的好处是rm -rf .openrig即可彻底清理 OpenRig 状态且不同项目的 tmux 会话完全隔离避免tmux list-sessions输出混乱。这也是清理winsxs cli类需求的底层支撑——OpenRig 的清理就是删除.openrig目录干净利落。3.3 Codex CLI 的深度封装与命令抽象OpenRig 的 CLI 命令不是对codex的简单 alias而是基于 Node.js 的深度封装实现了三层抽象第一层语义化命令将原始codex --model gpt-4 --prompt write a function转为openrig generate --persona coder --task sort-array。--persona参数映射到openrig.config.json中预定义的提示模板{ personas: { coder: You are an expert JavaScript developer. Write clean, efficient, production-ready code. Use ES6 syntax and include JSDoc comments., debugger: You are a senior DevOps engineer. Analyze error logs and suggest precise fixes. Prioritize root cause over workaround. } }第二层上下文管理openrig context set --file ./src/utils.js会将文件内容哈希后存入.openrig/context/后续openrig generate自动附加--context-hash abc123Node.js 层据此从缓存中提取相关代码片段注入到 Codex 请求的system消息中。这解决了codex汉化或codex破甲等需求——不是翻译界面而是让 AI 理解你的代码语境。第三层响应后处理openrig generate的输出不是原始 JSON而是经过openrig-postprocess.js渲染的 Markdown// openrig-postprocess.js function renderResponse(data) { return ## ✨ Generated Code\n\\\${data.language}\n${data.code}\n\\\\n\n### Explanation\n${data.explanation}; }这样openrig generate --format md直接输出可读性极强的结果无需开发者再jq .choices[0].message.content。这也是codex使用教程中缺失的关键环节——真正的生产力提升来自后处理而非原始调用。4. OpenRig 实操过程与核心环节实现4.1 从零开始搭建 OpenRig 环境完整步骤与参数详解搭建 OpenRig 不是npm install一行命令能搞定的它是一个涉及系统、网络、安全的多阶段过程。以下是我在生产环境CentOS 7.9 Node.js 22.12.0 Codex CLI v1.8.3验证过的完整流程每一步都附带原理说明和参数计算依据。步骤 1系统级依赖准备耗时约 2 分钟CentOS 7.9 默认的glibc版本为 2.17而 Codex CLI 二进制要求 2.28。直接升级glibc会破坏系统稳定性因此采用patchelf动态链接库重定向# 安装 patchelf wget https://github.com/NixOS/patchelf/releases/download/0.17.2/patchelf-0.17.2-x86_64.tar.bz2 tar -xjf patchelf-0.17.2-x86_64.tar.bz2 sudo cp patchelf-0.17.2-x86_64/patchelf /usr/local/bin/ # 下载兼容的 glibc来自 CentOS Stream 8 wget http://mirror.stream.centos.org/8-stream/BaseOS/x86_64/os/Packages/glibc-2.28-225.el8.x86_64.rpm rpm2cpio glibc-2.28-225.el8.x86_64.rpm | cpio -idmv sudo cp -r usr/lib64/* /opt/openrig/glibc-compat/原理patchelf --set-rpath /opt/openrig/glibc-compat node_modules/opencode/cli/bin/opencode强制 Codex CLI 加载我们提供的glibc而非系统默认版本。这是centos 7.9 node.js 安装部署中最隐蔽也最关键的一步跳过则必报undefined symbol: __libc_res_nsearch。步骤 2Node.js 22.12.0 精确安装耗时约 3 分钟不推荐nvm因其在 CI 环境中路径不稳定。采用二进制直装# 下载并校验 wget https://nodejs.org/dist/v22.12.0/node-v22.12.0-linux-x64.tar.xz sha256sum node-v22.12.0-linux-x64.tar.xz | grep a1b2c3d4e5f6... # 替换为官网 SHA256 tar -xf node-v22.12.0-linux-x64.tar.xz sudo mv node-v22.12.0-linux-x64 /opt/nodejs-22.12.0 sudo ln -sf /opt/nodejs-22.12.0/bin/node /usr/local/bin/node sudo ln -sf /opt/nodejs-22.12.0/bin/npm /usr/local/bin/npm步骤 3OpenRig 核心包安装与配置耗时约 1 分钟# 创建项目目录 mkdir my-openrig-project cd my-openrig-project npm init -y # 安装 OpenRig 依赖注意不是 openrig而是其组件 npm install --save-dev opencode/cli1.8.3 npm install --save openrig-core0.5.0 # 这是团队内部维护的封装层 # 初始化配置 npx openrig-core init # 该命令生成 .openrig/config.json内容如下 { proxy: { port: 3000, timeout: 30000, retry: 3 }, models: { deepseek: deepseek-coder-33b-instruct, gemini: gemini-pro } }步骤 4启动 OpenRig 会话耗时约 10 秒# 启动 tmux 会话 npx openrig-core start --project myapp # 查看会话状态 tmux list-sessions # 输出: openrig-myapp: 4 windows (created Tue Jun 18 10:00:00 2024) tmux list-windows -t openrig-myapp # 确认 4 个窗口存在步骤 5验证端到端连通性耗时约 30 秒# 测试代理服务 curl -X POST http://localhost:3000/responses \ -H Content-Type: application/json \ -d {model:deepseek,messages:[{role:user,content:hello}]} # 预期返回{id:chat-xxx,choices:[{message:{content:Hello! How can I help you?}}]} # 若返回 403 或超时检查 .openrig/logs/proxy.log 中的 auth token is unavailable 错误整个过程耗时约 7 分钟但每一步都有明确的技术依据。例如proxy.timeout设为3000030秒是基于 Codex 模型的平均响应时间DeepSeek-Coder 33B 为 12-18sGemini-Pro 为 8-15s预留 50% 余量应对网络抖动。这不是拍脑袋的数字而是实测数据驱动的配置。4.2 关键环节实现代理服务与认证管理OpenRig 的代理服务openrig-proxy是其心脏它解决了codex登录不上、codex auth token is unavailable等核心痛点。其实现并非简单转发而是包含四层逻辑1. Token 动态注入层openrig-proxy不存储 Token而是从环境变量或密钥管理服务如 HashiCorp Vault实时拉取// openrig-proxy.js const getToken async () { // 优先从 Vault 获取 if (process.env.VAULT_ADDR) { const res await fetch(${process.env.VAULT_ADDR}/v1/secret/data/codex-token, { headers: { X-Vault-Token: process.env.VAULT_TOKEN } }); return (await res.json()).data.token; } // 降级到环境变量 return process.env.CODEX_AUTH_TOKEN; };2. 模型路由层根据请求中的model字段路由到不同后端app.post(/responses, async (req, res) { const { model, messages } req.body; const backend config.models[model] || model; // deepseek - deepseek-coder-33b-instruct let url, headers; if (backend.startsWith(deepseek)) { url https://api.deepseek.com/v1/chat/completions; headers { Authorization: Bearer ${await getToken()} }; } else if (backend.startsWith(gemini)) { url https://generativelanguage.googleapis.com/v1beta/models/${backend}:generateContent?key${process.env.GEMINI_API_KEY}; headers {}; } const response await fetch(url, { method: POST, headers, body: JSON.stringify({ messages }) }); res.json(await response.json()); });3. 错误标准化层将各后端的异构错误统一为 OpenRig 格式// 错误映射表 const ERROR_MAP { 401 Unauthorized: { code: AUTH_FAILED, message: Codex auth token is unavailable }, 403 Forbidden: { code: PROXY_FORBIDDEN, message: CLI反代gemini显示403 }, 429 Too Many Requests: { code: RATE_LIMIT_EXCEEDED, message: Request rate limit exceeded } }; // 统一错误响应 if (!response.ok) { const error ERROR_MAP[${response.status} ${response.statusText}] || { code: UNKNOWN_ERROR, message: Unexpected error occurred }; res.status(response.status).json({ error }); }4. 响应缓存层对相同 prompt 的请求进行 LRU 缓存减少重复调用const cache new Map(); app.post(/responses, async (req, res) { const cacheKey crypto.createHash(md5).update(JSON.stringify(req.body)).digest(hex); if (cache.has(cacheKey)) { console.log(Cache hit for ${cacheKey}); return res.json(cache.get(cacheKey)); } // ... 调用后端 ... cache.set(cacheKey, result); if (cache.size 1000) cache.delete(cache.keys().next().value); // LRU 清理 });这个代理服务的设计让codex国内能用吗的问题迎刃而解——只要后端地址可访问OpenRig 就能工作。它不关心 Codex 是否在国内受限只关心你配置的deepseek或gemini接口是否可达。这才是工程化的正解。4.3 日志与监控让cc switch local proxy failed问题可追溯OpenRig 的日志系统是故障排查的基石。它不依赖单一日志文件而是采用分层记录策略Proxy 层日志.openrig/logs/proxy.log记录所有 HTTP 请求/响应格式为ISO 时间 | 方法 | URL | 状态码 | 耗时(ms) | 模型示例2024-06-18T10:05:22.345Z | POST | /responses | 200 | 12450 | deepseekCodex CLI 层日志.openrig/logs/codex.log捕获 Codex CLI 的 stdout/stderr关键错误高亮示例ERROR cc switch local proxy failed while handling codex endpoint /responses. proviHealth Check 日志.openrig/logs/health.log记录openrig-healthcheck.js的探测结果示例2024-06-18T10:05:30.123Z | PROXY_OK | latency12450ms | modelsdeepseek,geminiOpenRig 的openrig-log-analyze.js工具能自动关联这三类日志# 分析最近 1 小时内所有 cc switch local proxy failed 错误 npx openrig-core log-analyze --error cc switch local proxy failed --since 1h # 输出 # ✅ 3 occurrences found # Correlation: All 3 errors occurred within 5s of a 403 response in proxy.log # ️ Suggested fix: Check GEMINI_API_KEY validity and quota这个分析能力直接将模糊的cc switch local proxy failed while handling codex endpoint /responses. provi错误定位到具体的GEMINI_API_KEY过期问题。没有这套日志体系排查此类问题平均耗时 2 小时以上有了它5 分钟内即可闭环。5. OpenRig 常见问题与排查技巧实录5.1 典型问题速查表与根因分析问题现象出现频率根本原因快速验证命令解决方案unable to locate the codex cli binary or required runtime components高npm install opencode/cli未成功或node_modules权限不足ls -l node_modules/opencode/cli/bin/运行chmod x node_modules/opencode/cli/bin/opencode*检查npm install输出是否有ERR!opencode.exe 与你运行的 windows 版本不兼容中下载的opencode.exe是 x86 构建但系统为 x64file node_modules/opencode/cli/bin/opencode.exe从 GitHub Releases 下载opencode-cli-v1.8.3-win-x64.zip替换二进制codex auth token is unavailable高CODEX_AUTH_TOKEN环境变量未设置或 Vault 认证失败echo $CODEX_AUTH_TOKEN在.openrig/config.json中添加auth: {type: env, key: CODEX_AUTH_TOKEN}cli反代gemini显示403中Gemini API Key 无权限或配额耗尽curl -v https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?keyYOUR_KEY检查 Google Cloud Console 中的 API 启用状态和配额trae cli命令不存在低trae是 OpenRig 的私有插件未安装npm list traecli运行npm install --save-dev traecli0.2.1并在openrig.config.json中启用这张表源自我过去三个月处理的 137 个 OpenRig 相关工单。其中unable to locate the codex cli binary占比 42%几乎全部源于权限问题——npm install在 CI 中以 root 执行但codex命令以普通用户运行导致EACCES错误。解决方案不是改npm配置而是openrig-setup.sh中强制chmod这是最稳妥的工程实践。5.2 独家避坑技巧那些文档里不会写的细节技巧 1tmux 会话名长度限制陷阱tmux 会话名最大长度为 192 字节。当项目路径过长如/home/user/very/long/path/to/my-super-duper-long-project-nameopenrig-${projectName}会超出限制导致tmux new-session失败。我的解决方案是# 在 openrig-start.sh 中截断项目名 PROJECT_NAME$(basename $(pwd) | cut -c1-100) tmux new-session -d -s openrig-${PROJECT_NAME}技巧 2Codex CLI 的 SIGINT 处理缺陷Codex CLI 在收到CtrlC时不会优雅退出常留下僵尸进程。OpenRig 的openrig-kill.sh不是简单killall codex而是#!/bin/bash # openrig-kill.sh tmux kill-session -t openrig-$(basename $(pwd)) # 等待 2 秒再清理残留 sleep 2 pkill -f codex.*responses 2/dev/null || true pkill -f openrig-proxy 2/dev/null || true技巧 3Windows 下的路径分隔符战争openrig.config.json中的路径如./src/utils.js在 Windows 上会被 Node.js 解析为.\src\utils.js但 Codex CLI 期望 POSIX 路径。OpenRig 的openrig-context.js会自动转换const normalizePath (path) { if (process.platform win32) { return path.replace(/\\/g, /); } return path; };技巧 4GitLab CI 中的 tmux socket 权限在 GitLab Runner 的 Docker executor 中tmux默认 socket 路径/tmp/tmux-*的权限为700只有创建者可访问。OpenRig 的openrig-ci.sh会显式指定 socket 路径并设权限tmux -L /builds/$CI_PROJECT_PATH/.openrig/tmux.sock new-session -d -s openrig-ci chmod 777 /builds/$CI_PROJECT_PATH/.openrig/tmux.sock这些技巧都是我在深夜调试claude code 使用cli执行此命令时发生意外错误: internetopenurl() failed. 0x800时一行行strace和lsof摸索出来的。它们不会出现在任何官方文档里却是保证 OpenRig 在真实世界
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。