Feishu Codex Console
English · 安装 · 配置 · 兼容与升级 · Roadmap
把本地 Codex thread 映射成一个可持续交流、可以协作和接管的飞书工作会话。人在外面时,可以在飞书里继续提问、分析、写文件、修改代码、回答 Codex 追问并处理权限确认;本机不需要开放公网端口。
V5 直接连接 Codex app-server,不再把每条飞书消息当成一次孤立的 CLI 调用。私聊可以持续使用一个上下文;群聊顶层 prompt 会进入独立回复串,同一回复串持续绑定同一个项目和 Codex thread,因此多项目、多会话和团队接力不会混在一起。
V5 有什么
- 一张自适应欢迎卡:成员第一次发消息时自动出现;离线时只给连接入口,未选项目时只让用户选项目,准备完成后直接给示例和“开始使用”,不再要求逐步点完向导。
- 本地设备控制台:一张 Card 2.0 展示飞书连接、Codex 引擎、账户额度摘要、当前项目、队列、电源和远程就绪状态;完整额度独立展开。
- 多项目工作台:同步 Codex 桌面端保存的项目,也可扫描额外 Git 根目录;显示路径、分支和未提交状态,并按成员保存收藏与最近使用。
- 模型控制中心:从 Codex 原生模型目录切换模型、推理强度和任务权限上限,下一轮真实生效;模型能力变化时安全回退。
- 会话与任务中心:浏览和恢复本人在当前项目的历史 thread、压缩上下文、查看本人任务并远程停止;管理员可查看全项目会话。
- 团队权限:管理员、操作者、只读成员、任务归属、卡片操作归属、项目 ACL 和 SQLite 审计日志。
- 丝滑追问:任务运行时直接发送普通消息会自动加入当前 turn;使用“排队”可明确创建独立任务。
- 工作区会话:群顶层 prompt 自动创建独立话题会话,后续回复通过
root_id恢复同一个 Codex thread;项目和设置只在创建时复制,旧 thread 不会串入新话题。 - 自然意图分流:普通消息会自动区分问答、分析、内容写作和代码任务;问答/分析强制只读,只有代码任务默认要求测试证据。
- 自然回答:问答和只读分析使用一条可更新的 Markdown 消息,从处理态原地变成最终回答,不再出现绿色任务完成大卡片。
- 执行结果闭环:写文件和代码任务保留可控的运行卡、结果摘要与验证入口,默认不追加重复完成消息。
- 持久 Codex 会话:通过
codex app-server执行、恢复、追加要求和中断 turn。 - 原生实时交互:Codex 的权限请求和问题会变成飞书按钮、下拉框或下一条消息输入,回答后原任务自动继续。
- 敏感输入保护:Codex 标记为秘密的问题不会在飞书提供答案入口,也不会转发到任务或写入内容日志。
- 分层实时呈现:普通回答更新同一条 Markdown;写文件和代码任务才展示排队、命令、文件修改和测试状态卡。
- 结果审阅中心:任务启动时建立 Git 基线,完成后展示测试证据、增删行、文件归因和分页 Diff;脏工作区不会被伪装成纯任务修改。
- 临时完全访问:完全访问不再永久保存,只能授权下一任务、30 分钟或当前会话,并绑定成员、项目和 Codex thread 后自动到期。
- 仓库安全策略:项目可用
.feishu-codex-policy.json降低 sandbox 上限、限制可申请外部动作或直接拒绝部署等动作。 - 统一脱敏:日志、诊断、审计摘要、可靠文本回复、任务/审批/确认卡、测试摘要和 Diff 共享凭据脱敏规则。
- 产品化回复:普通交流使用飞书原生 Markdown;控制、审批、追问、长任务和异常才使用 Card 2.0,可靠文本作为最后降级。
- 可靠恢复:SQLite WAL 保存会话、项目、任务、CardKit 序号、确认记录和事件去重;重启后自动恢复尚未开始的排队任务,已经运行的任务不会被危险地自动重放。
- 自动备份与对账:数据库升级前创建校验快照,失败自动回滚;启动时保守修复任务记录、卡片和 Codex 启动证据的不一致。
- 可靠发送:飞书 API 限流、超时和临时失败会退避重试;终态卡片失败时通过 SQLite outbox 保证仍有结果。
- 远程就绪:macOS 上可从设备卡开启
caffeinate,降低本机因空闲睡眠而离线的概率。 - 多层门禁:用户、聊天、项目、外部动作和运行时命令分别检查;完全访问不等于静默放行外部操作。
- 自动守护:支持 macOS LaunchAgent 和 Linux systemd user service,进程异常退出后自动拉起。
工作方式
flowchart LR
A["飞书项目群"] --> B["话题 / 回复串"]
B --> C["Workspace Session"]
C --> D["SQLite 可靠执行记录"]
D --> E["Codex app-server thread"]
E --> F["自然回复"]
E --> G["必要时:进度、追问与审批卡"]
F --> B
G --> B
飞书通过长连接把事件送到本机桥接服务,因此不需要把 Mac 的 SSH、HTTP 或其他入站端口暴露到公网。Mac 关机、断网或进入系统睡眠后,远程控制仍会暂停;“远程就绪”只能防止空闲睡眠,不能绕过合盖睡眠和 macOS 的电源规则。
快速开始
要求:macOS 或 Linux、Node.js 22 或更高版本、本机已完成 codex login,并已配置可接收消息事件的飞书自建应用。项目会安装并优先使用固定版本的 lark-cli。
推荐使用交互式向导:
npx feishu-codex-console init
向导会检查 Node、Codex 登录和飞书 Bot 身份,等待一条测试消息自动识别 open_id/chat_id,提供个人安全、团队安全和高级模式三档权限预设,并把配置以 0600 权限写入用户配置目录。自检通过后,它会安装 macOS LaunchAgent 或 Linux systemd user service。
完整步骤见 安装指南,全部配置见 配置参考,常见问题见 故障排查,五分钟完整闭环见 产品演示。产品方向和逐项需求见 产品需求地图,公开路线见 Roadmap,版本与依赖承诺见 兼容矩阵。
从源码安装:
git clone https://github.com/LeoChaseYoung/feishu-codex-console.git
cd feishu-codex-bridge
npm install
npx lark-cli config init --new
npx lark-cli whoami --as bot
cp .env.example .env
# 至少填写 ALLOWED_FEISHU_OPEN_IDS 和 CODEX_WORKDIR
npm run doctor
npm run check
npm test
npm run service:install
config init --new 会打开飞书应用配置流程;App Secret 由 lark-cli 保存在用户配置目录,不要写进项目或 .env。桥接服务只使用 Bot 应用身份(--as bot),不需要执行 auth login 用户授权。已有飞书应用时,可运行不带 --new 的 npx lark-cli config init 按提示绑定;自动化安装应使用 --app-id 配合 --app-secret-stdin,不要把 Secret 放进命令参数。
不知道自己的 open_id 或群 chat_id 时,可先监听一条消息,然后在飞书里给机器人发送测试消息:
npx lark-cli event consume im.message.receive_v1 --as bot --max-events 1 --timeout 2m
输出 JSON 中的 sender_id 填入成员角色配置,chat_id 填入群聊白名单。不要把这段包含真实标识的输出提交到 Git。
查看后台服务:
npm run service:status
tail -f var/log/bridge.log
tail -f var/log/bridge.error.log
Linux 使用 journalctl --user -u feishu-codex-bridge-default -f 查看日志。
停止并移除开机启动:
npm run service:uninstall
也可以前台运行:
npm run build
npm start
飞书里怎么用
直接发送任务、截图或常见文本/代码文件:
检查这个项目的测试,修复失败用例并说明改了什么
常用命令:
新手引导//start//onboarding:重新打开自适应欢迎卡。控制台/状态:打开本地设备控制台;额度只显示紧凑摘要。额度//usage//quota:独立查看 Codex 各滚动窗口的剩余比例、重置时间和可用重置次数。项目//projects:打开项目工作台。读取项目//overview:本地读取 Git、README、包清单和文件索引,生成 0 AI token 项目快照。设置/模型//settings:打开模型、推理强度和权限控制中心。模型 gpt-5.4/推理 high/权限 只读:不打开卡片直接切换。会话//sessions:恢复历史会话、压缩上下文或开启新会话。任务//tasks:查看运行中、排队和最近任务。团队//team:查看成员状态、项目负载、成功率和 token 使用概览。运行手册//runbooks:打开当前仓库审核过的任务模板。/run <手册ID> 参数=值:带显式参数启动团队运行手册。切换 <项目名或路径>//use <编号>:按项目卡显示的顺序切换;存在任务或上下文时会先要求确认。确认切换 <项目名或路径>:确认停止当前会话未完成任务、清空保存的上下文并切换项目。追加 <要求>//steer <要求>:把补充要求加入正在执行的 Codex turn。排队 <任务>//queue <任务>:当前任务运行时仍创建独立任务。新会话//new//reset:停止未完成任务并清空当前聊天的 Codex 上下文。停止//stop//interrupt:停止当前任务并移除本聊天的排队任务。帮助//help:显示帮助。
无需先选择任务类型,直接像在 Codex 中一样说话即可。桥接器只做本地展示和安全分流:问题显示为回答,读取/检查/分析显示为只读分析,文档与文件写作显示为内容任务,明确修复/实现/修改才显示为代码任务。原始要求仍会完整交给 Codex,不会被改写。
在群聊顶层直接发送普通要求时,机器人会把回复放进新的回复串;这个回复串就是一个独立工作会话。之后在串内继续说话会恢复同一个 Codex thread。新回复串会继承群主会话当前选择的项目、模型和权限上限,但不会继承旧 thread、临时完全访问或未完成审批。完整模型见 V4 工作区会话交互模型。
任务运行时直接发送下一条普通消息,也会自动作为补充要求加入当前 turn;只有显式使用“排队”才会创建另一个任务。读取项目 是本地确定性快照,不启动模型、使用 0 AI token;需要模型理解时再发送“深入分析项目架构”。任务卡把累计输入拆成新增与缓存,避免把已缓存上下文误认为本轮真实新增消耗。
模型、推理强度和任务权限按当前飞书成员会话保存,并从下一轮开始生效。选择“Codex 默认”会持续跟随本机 Codex 的默认模型,而“固定”某个具体模型才会保持该版本;如果模型或推理档位在 Codex 升级后消失,新任务会回退到可用默认值并在卡片中说明。模型目录暂时不可用时,设置卡进入只读“兼容模式”,不会伪造可选能力。
运行中的普通问题可以点击选项或直接发送下一条消息回答。权限卡默认“允许一次”,“本会话允许”会再次确认。密码、令牌、密钥等敏感问题不能通过飞书回答:桥接器会隐藏所有答案入口并拦截后续文字,用户应取消该远程回答后回到可信本机处理。
服务在任务运行期间停止时,该任务会显示为“已中断”,并保留 thread 和已发现的文件变更。为避免重复执行命令或重复修改,它不会自动重跑;先查看变更,再点击“重新执行”。尚未开始的排队任务会在服务恢复后继续排队。
项目工作台会把个人收藏放在最前、最近使用放在其后;同名项目始终同时显示路径。切换不会删除项目文件或 Codex 历史,但会停止当前飞书会话的未完成任务并解除旧 thread 绑定。新建 thread 会按第一条任务自动命名,之后可从“会话”中心恢复并与本机 Codex 接力。
新成员第一次私聊机器人发送有效消息或附件时,会看到一张紧凑欢迎卡,但原来的命令或任务仍会继续处理;群聊不会自动插入欢迎卡。卡片根据真实状态只提供一个主动作:查看连接、选择项目,或直接开始使用。准备完成后会给出提问、分析和代码任务示例,并用一句话说明团队用法:一个项目建一个群,新事情发新消息,继续同一件事就在回复里说。技术配置不会出现在成员引导中。欢迎卡按成员只自动出现一次;团队希望自行培训时,可在 .env 设置 FEISHU_AUTO_ONBOARDING=false,成员仍可随时发送“新手引导”手动打开。
团队模式
V5 不再把整个群聊当成同一个 Codex 会话。群顶层控制仍按 FEISHU_GROUP_SESSION_SCOPE 隔离;一旦进入话题/回复串,同一串中的成员会定位到同一个工作会话和 Codex thread。执行权仍属于当前控制者:当前控制者可显式转交,发起人可收回,管理员可接管;控制权变化不会改变任务的执行身份、项目或权限。
# 操作者:可以运行 Codex,但默认不能超过 CODEX_OPERATOR_SANDBOX_MODE
ALLOWED_FEISHU_OPEN_IDS=ou_operator_1,ou_operator_2
# 管理员:可以管理他人的任务、设备级 Remote Ready,并绕过项目 ACL
FEISHU_ADMIN_OPEN_IDS=ou_admin
# 只读成员:只能查看控制台、项目、会话和任务
FEISHU_VIEWER_OPEN_IDS=ou_viewer
# 卡片展示友好名称;未配置的成员会显示稳定匿名成员码
FEISHU_MEMBER_LABELS_JSON={"ou_admin":"平台管理员","ou_operator_1":"前端同学"}
FEISHU_GROUP_SESSION_SCOPE=member
CODEX_OPERATOR_SANDBOX_MODE=workspace-write
FEISHU_AUTO_ONBOARDING=true
如果 FEISHU_ADMIN_OPEN_IDS 留空,为兼容个人安装,所有操作者都会被视为管理员。团队部署应显式填写管理员。
项目 ACL 使用 JSON;键可以是项目名、展示路径、绝对路径或 *。未配置 ACL 时,全部授权成员都能看到所有已发现项目。
FEISHU_PROJECT_ACL_JSON={"frontend":["ou_operator_1"],"/srv/repos/backend":["ou_operator_2"],"*":["ou_viewer"]}
发送“审计”可以查看本人最近操作;管理员看到全团队最近记录。审计只记录身份、动作、资源、结果和少量错误摘要,不保存完整提示词。
发送“团队”打开团队工作台。管理员看到最近 7 天的授权团队聚合,其他成员只看到自己的发起/控制任务。面板展示状态、成功率、项目负载和 token 用量,但不会展示提示词、结果正文、Diff、附件或原始 open_id。群聊中的原始消息与任务卡仍对群成员可见;私密代码和客户信息应在私聊中处理。
设备控制台提供:
- 刷新本机、Codex、队列和电源状态。
- 查看 Codex 原生账户额度摘要;点击“查看额度详情”或发送“额度”,再按普通 Codex、Spark 等独立限额展示窗口周期、重置时间和可用重置次数;取不到时明确标记暂不可用。
- 切换项目。
- 开启新会话。
- 进入模型设置、历史会话和任务中心。
- 开启或关闭远程就绪。
- 有任务运行时直接停止当前任务。
任务卡提供:
实时审阅:运行中按需查看当前测试与文件变化;不会打断原任务流式更新。停止:中止当前任务;已经写入磁盘的修改不会自动撤销。重新执行:在相同项目中重跑原任务,包括原附件。新会话:清除该聊天的 Codex 上下文。
任务中心会展示任务 ID、所属项目、状态和更新时间。操作者可以停止单个运行/排队任务,也可停止当前飞书会话的全部任务;只读成员只看到状态与刷新入口。
团队可以在仓库根目录添加 .feishu-codex-runbooks.json,把常用测试、检查和文档任务做成审核过的模板。无论从 npm 还是源码安装,都可以安全生成示例;已有文件不会被覆盖:
feishu-codex-bridge init-runbooks --project /absolute/path/to/project
模板支持 {{parameter}} 参数、默认值、模型、推理强度,以及 read-only / workspace-write 权限预设。发送“运行手册”浏览;必填参数没有默认值时使用 /run inspect-module module="auth"。模板只能维持或降低成员当前权限,包含提交、推送、部署或 PR 的模板会失败关闭,参数替换后也会重新检查。完整格式见 D9 团队协作。
问答和只读分析会在同一条 Markdown 消息中持续更新,完成后只保留干净回答,不显示测试、Git 基线、任务 ID、权限、模型或 token。写文件和代码任务在原任务卡查看结果摘要;只有存在文件变化或测试证据时才显示“查看验证”。代码验证会展示测试命令与退出状态、文件增删行、任务前已有修改提示及逐文件分页 Diff;点击“返回结果”回到摘要,不新增聊天消息。代码任务没有运行测试会明确显示“未检测到测试命令”;最后测试仍失败时,即使 Codex turn 正常结束,任务卡也会显示红色“测试未通过”。本地绝对路径会降级为普通文件名,避免手机端出现无效链接和本机目录泄露。
审阅不会修改工作区。任务开始前已经脏的文件会被排除或标成“含既有修改”,任务结束后又变化的文件会显示过期提醒。.env、私钥、证书和凭据路径不在飞书展示正文,疑似 Token 和密码会脱敏。为避免误删本机原有内容,当前版本不提供远程一键丢弃;需要撤销时请回本机逐文件确认。
团队可以在仓库根目录添加 .feishu-codex-policy.json。包内的 .feishu-codex-policy.example.json 可直接复制;策略会在创建外部动作确认卡、任务入队和真正执行前重新读取,因此旧确认卡不能绕过后来收紧的规则。
{
"version": 1,
"sandbox": { "maximum": "workspace-write" },
"operations": {
"allow": ["commit", "push", "pull_request"],
"deny": ["deploy"],
"requireApproval": ["commit", "push", "pull_request"]
}
}
allow 表示可以申请,不表示静默放行;commit、push、PR 和部署仍保留飞书确认底线。策略只能收紧主机与角色上限。完整格式和失败关闭规则见 D7 权限与安全治理。
远程就绪
在飞书发送“控制台”,点击“开启远程就绪”。桥接服务会启动:
/usr/bin/caffeinate -i -w <bridge-pid>
这会在桥接进程运行期间阻止 macOS 因空闲自动进入系统睡眠。它不会:
- 在 Mac 已关机或断网时恢复连接。
- 保证 MacBook 合盖后继续运行。
- 绕过公司电源策略、系统更新或用户主动睡眠。
长时间在外使用时,建议让 Mac 接通电源、保持网络稳定,并按 macOS 的合盖运行要求连接外接显示器/电源,或保持屏幕打开。
完全访问模式
默认示例使用更安全的 workspace-write。确实需要完全访问时:
CODEX_SANDBOX_MODE=danger-full-access
danger-full-access 现在只是服务和管理员的能力上限,不会永久保存为成员会话默认值。长期默认最高仍是工作区写入;在飞书“设置”卡中,成员必须选择“下一任务”“30 分钟”或“当前会话”并再次确认,租约到期、消费、撤销、切项目或切 thread 后自动回落。
临时完全访问允许 Codex 在本机执行任意命令,风险显著高于工作区写入。V5 仍保留这些门禁:
- 只有管理员或操作者能触发任务;只读成员不能执行代码。
- 操作者的权限由
CODEX_OPERATOR_SANDBOX_MODE单独封顶,即使服务本身开启完全访问也默认只获得工作区写入。 - 临时租约绑定本人、聊天和当前项目;会话租约还绑定 Codex thread。管理员可以撤销他人租约,但不能替他人授予。
- 仓库策略可以把本项目权限进一步降为工作区写入或只读,已有租约不能越过仓库上限。
- 未配置
ALLOWED_FEISHU_CHAT_IDS时,授权用户私聊可用,但所有群聊请求会自动拒绝。 - 聊天只能选择项目注册表中已经发现的目录,不能通过消息输入任意本机路径。
- commit、push、publish、release、deploy,以及创建或合并 PR/MR,必须先在短期确认卡中明确授权。
- Codex 实际执行的命令会再次检查;临时决定执行未授权外部动作时,任务会被停止。
- 修改凭据、代表用户联系他人、删除外部数据始终禁止。
- Codex 子进程默认不继承飞书配置和常见 Token/密码变量;额外变量只能通过
CODEX_ALLOWED_ENV_VARS显式放行。 - 网络访问和 Web 搜索由独立配置控制,默认关闭。
命令检查是纵深防御,不是操作系统沙箱。更强的隔离方式是使用独立系统账号或容器,并只暴露必要的项目目录。完整边界见 SECURITY.md。
项目发现
CODEX_WORKDIR=/Users/me/Code/default-project
CODEX_SYNC_SAVED_PROJECTS=true
CODEX_PROJECT_STATE_FILE=
CODEX_PROJECT_ROOTS=
CODEX_PROJECT_SCAN_DEPTH=8
MAX_CODEX_PROJECTS=200
CODEX_WORKDIR 是新聊天的默认项目。开启 CODEX_SYNC_SAVED_PROJECTS 后,项目卡会读取 Codex 桌面端保存的项目和自定义名称。需要发现额外 Git 仓库时,再通过逗号分隔的 CODEX_PROJECT_ROOTS 配置扫描根目录。
切换项目会停止当前聊天的未完成任务并重置 Codex 会话,防止旧项目上下文进入新项目。
并发、恢复与超时
MAX_CONCURRENT_TASKS=2
MAX_QUEUED_PER_CONVERSATION=5
CODEX_TIMEOUT_MS=1200000
BRIDGE_DATA_DIR=/absolute/private/data/directory
不同项目最多同时运行 MAX_CONCURRENT_TASKS 个任务。一个私聊或群成员会话同一时间只运行一个任务,后续任务按顺序排队。达到单会话队列上限后,机器人会拒绝继续接收。
SQLite 数据库使用 WAL、FULL 同步和 owner-only 文件权限。V3/V4 旧状态会在第一次启动 V5 时自动迁移;BRIDGE_STATE_FILE 仅用于指定旧 JSON 状态文件位置。
自检、诊断和运行数据维护:
feishu-codex-bridge version
feishu-codex-bridge doctor --fix --config /absolute/path/to/default.env
feishu-codex-bridge support-bundle --config /absolute/path/to/default.env
feishu-codex-bridge backup --config /absolute/path/to/default.env
feishu-codex-bridge backups --config /absolute/path/to/default.env
从新 npm 包升级时,先运行不带 --yes 的只读预览。执行模式会拒绝替换仍有活动任务的服务,依次完成校验备份、新包自检、服务安装和双消费者健康验证;失败时尝试恢复数据与仍可用的旧服务包。
npx feishu-codex-console@latest upgrade --config /absolute/path/to/default.env
npx feishu-codex-console@latest upgrade --config /absolute/path/to/default.env --yes
回滚会替换当前 SQLite,必须先停止服务;命令会先保存回滚前状态,并校验清单、SHA-256 和数据库完整性:
feishu-codex-bridge stop --config /absolute/path/to/default.env
feishu-codex-bridge rollback --backup <backup-id> --yes --config /absolute/path/to/default.env
feishu-codex-bridge install --config /absolute/path/to/default.env
完整恢复语义和保留策略见 D8 可靠性与恢复。
附件
MAX_ATTACHMENT_BYTES=20971520
MAX_TEXT_ATTACHMENT_BYTES=131072
ATTACHMENT_RETENTION_HOURS=72
支持图片,以及常见 Markdown、JSON、YAML、CSV、日志、脚本和源代码文件。图片按文件签名校验,文本必须是有效 UTF-8。飞书资源以 0600 权限下载到 lark-im-resources/,默认 72 小时后清理。音视频、压缩包、Office/PDF 等二进制文件不会被伪装成已解析内容。
持久状态只保存附件路径和元数据,不复制文本附件正文。
飞书应用要求
- 机器人具备私聊/群聊消息读取与回复权限。
im:message:readonly:卡片回调与附件下载。cardkit:card:write:创建和持续更新 Card 2.0。- 在开发者后台启用
im.message.receive_v1与card.action.trigger。 - 使用长连接接收事件,无需公网回调地址。
旧应用不需要删除;给当前应用补齐权限和事件订阅即可。
数据与凭据
- 项目不保存飞书 App Secret 或 OpenAI Token。
- 飞书侧复用本机
lark-cliBot 身份;Codex 复用本机codex login登录态。 .env、SQLite 状态、旧 JSON 状态、日志和下载附件不会提交到 Git。var/state.sqlite保存会话、项目、可靠队列、确认、CardKit 序号和事件去重记录。<BRIDGE_DATA_DIR>/backups/默认保留最近 10 份带 SHA-256 清单的一致性数据库快照。var/log/bridge*.log默认限制为 10 MiB。
参考项目与设计取舍
V5 参考了这些开源项目的核心交互,但使用飞书原生 Card 2.0 重做了视觉与安全边界:
- Codex Console:项目感知会话、运行控制和
app-server驱动。 - agents-to-im:飞书会话绑定、持久运行状态和 CardKit 降级。
- ccgram:权限按钮、结构化追问、状态摘要和项目启动器。
- claude-code-slack-channel:外部动作策略、短期授权和出站门禁。
采用的原则是:项目和会话做成控制台;审批和追问使用原生交互;状态卡只展示当前决策需要的信息;危险操作不因“完全访问”而失去确认。
开发与验证
npm run check
npm test
npm run build
npm run test:package
npm run doctor
npm audit
GitHub Actions 会在 Ubuntu 与 macOS 执行类型检查、测试、生产构建和真实 npm tarball 安装。维护者发布前还应运行 npm run release:check -- v<version> 并完成 实机发布清单。
只验证 Codex 连接、不修改文件:
npm run smoke:codex
预期输出:BRIDGE_SMOKE_OK。