目标:确认 chat2ide 能完成单用户远程 Codex CLI 工作流。
- 已运行
npm run test。 - 已运行
npm run build。 - 已运行
npm run preflight,或明确知道失败项是测试环境故意造成的。 - 已配置 PIN。
- 已配置可执行的
CODEX_COMMAND。 - 已配置存在且有权限的
CODEX_CWD。 - 如果验收 direct client bridge,已配置
APP_BRIDGE_TOKEN。
- 打开页面。
- 确认先看到 PIN 登录页。
- 输入错误 PIN。
- 确认返回模糊错误,不泄露内部细节。
- 输入正确 PIN。
- 确认进入主控制台。
- 刷新页面,确认 session 未过期时仍可进入。
通过标准:
- PIN 必须由服务端校验。
- 登录后浏览器能维持会话。
- 错误 PIN 不暴露真实 PIN 或 hash 状态。
- 点击“新建终端”两次。
- 确认出现两个标签页。
- 确认每个标签页都有独立状态和 PID。
- 桌面端确认顶部概览显示正确的终端总数、运行/启动/停止/异常数量和当前尺寸。
- 分别发送不同命令。
- 切换标签页,确认输出不互相污染。
- 在非活动标签产生输出后,确认标签未读数和顶部未读计数增加。
- 关闭当前标签,确认页面优先切到右侧相邻标签;关闭最右侧标签时切到左侧标签。
通过标准:
- 每个标签页对应一个独立 PTY 进程。
- tab 切换不会串输出。
- 多终端统计和未读数不能撑坏移动端布局。
- 关闭标签后的活动终端选择符合相邻任务逻辑。
- 新建后首次 attach 才启动 PTY 的语义可被观察到:创建后状态为启动中,附着后进入运行中或错误。
- 选中一个终端。
- 在底部输入栏发送
echo hello。 - 确认命令进入当前 PTY。
- 再发送一条短命令,在单行输入状态下用方向键回填最近命令。
- 输入多行内容,确认方向键仍用于编辑 textarea,不劫持为历史切换。
- 运行一个持续输出命令。
- 确认主视图实时流式显示输出。
通过标准:
- 输出主界面是 xterm 终端,不是聊天卡片。
- ANSI 和换行行为不被前端重新包装。
- 输入在 WebSocket 断开时不会被误报为已发送。
- 命令历史只保存在当前浏览器会话内,退出登录或刷新后不会恢复。
- 运行一个长命令。
- 点击
Ctrl+C,确认命令被中断。 - 点击“停止”,确认进程结束,状态变为已停止。
- 点击“重启”,确认终端清屏并启动新 PTY。
- 点击“关闭”,确认标签页被移除。
- 打开一个持续输出中的终端。
- 刷新页面,或临时断开网络后恢复。
- 页面恢复后重新登录或自动恢复 session。
- 确认终端列表仍存在。
- 选中终端,确认最近输出被 replay。
通过标准:
- 服务进程未重启时,不需要重新创建终端。
- replay 只覆盖 ring buffer 最近输出,不声称是完整日志。
- 新建终端并确认正在运行。
- 重启
chat2ide服务。 - 刷新页面并重新登录。
- 确认旧终端不存在。
通过标准:
- 服务重启会清空 session、PTY 和 ring buffer。
- 这个行为应与 README、运维文档一致。
- 通过 Cloudflare 域名访问页面。
- 登录。
- 新建终端。
- 发送命令。
- 确认
/ws正常升级。 - 刷新页面并确认 replay。
通过标准:
APP_PUBLIC_ORIGIN与公网 origin 一致。- cookie 在 Cloudflare 后有效。
- WebSocket 不需要额外 path rewrite。
- 用手机浏览器打开页面。
- 登录。
- 确认顶部紧凑状态栏、标签页、终端区和底部输入栏都可见,页面本身没有横向滚动。
- 横向滚动标签页。
- 使用底部输入栏发送命令。
- 用方向键回填单行历史命令。
- 点击
Ctrl+C、停止、重启。 - 在弱网恢复后点击“重连”。
通过标准:
- 底部输入栏可用。
- 顶部状态栏不会挤压到终端不可用。
- 标签页可横向滚动。
- 终端区域仍保留主要可视空间。
- 控制按钮文字不溢出。
- 以
APP_BRIDGE_TOKEN=bridge-token-32-bytes-minimum-dev-123456启动服务。 - 登录 Web UI。
- 在另一个终端运行:
APP_BRIDGE_TOKEN=bridge-token-32-bytes-minimum-dev-123456 node scripts/bridge-smoke-client.mjs- 也可以运行一键端到端 smoke:
npm run build
npm run smoke:e2e- 确认终端列表自动出现
Direct client smoke session,后端标识为Bridge。 - 选中该终端,确认能看到
bridge smoke client ready。 - 用底部输入栏发送
hello bridge。 - 确认 smoke client 把输入回显为
echo:hello bridge。 - 点击“重启”,确认终端清屏后出现
bridge smoke client restarted。 - 点击“关闭”,确认 bridge 标签移除,smoke client 退出。
通过标准:
/bridge未配置 token 时不可用;配置 token 后要求 Bearer token。- Bridge 会话不需要创建 PTY profile,会自动进入同一终端列表。
- 手机端输入、resize、重启和关闭都能转发到拥有该 session 的客户端。