Skip to content

Latest commit

 

History

History
162 lines (121 loc) · 5.29 KB

File metadata and controls

162 lines (121 loc) · 5.29 KB

手工验收

目标:确认 chat2ide 能完成单用户远程 Codex CLI 工作流。

0. 预设条件

  • 已运行 npm run test
  • 已运行 npm run build
  • 已运行 npm run preflight,或明确知道失败项是测试环境故意造成的。
  • 已配置 PIN。
  • 已配置可执行的 CODEX_COMMAND
  • 已配置存在且有权限的 CODEX_CWD
  • 如果验收 direct client bridge,已配置 APP_BRIDGE_TOKEN

1. 登录验收

  1. 打开页面。
  2. 确认先看到 PIN 登录页。
  3. 输入错误 PIN。
  4. 确认返回模糊错误,不泄露内部细节。
  5. 输入正确 PIN。
  6. 确认进入主控制台。
  7. 刷新页面,确认 session 未过期时仍可进入。

通过标准:

  • PIN 必须由服务端校验。
  • 登录后浏览器能维持会话。
  • 错误 PIN 不暴露真实 PIN 或 hash 状态。

2. 多终端验收

  1. 点击“新建终端”两次。
  2. 确认出现两个标签页。
  3. 确认每个标签页都有独立状态和 PID。
  4. 桌面端确认顶部概览显示正确的终端总数、运行/启动/停止/异常数量和当前尺寸。
  5. 分别发送不同命令。
  6. 切换标签页,确认输出不互相污染。
  7. 在非活动标签产生输出后,确认标签未读数和顶部未读计数增加。
  8. 关闭当前标签,确认页面优先切到右侧相邻标签;关闭最右侧标签时切到左侧标签。

通过标准:

  • 每个标签页对应一个独立 PTY 进程。
  • tab 切换不会串输出。
  • 多终端统计和未读数不能撑坏移动端布局。
  • 关闭标签后的活动终端选择符合相邻任务逻辑。
  • 新建后首次 attach 才启动 PTY 的语义可被观察到:创建后状态为启动中,附着后进入运行中或错误。

3. 输入与流式输出

  1. 选中一个终端。
  2. 在底部输入栏发送 echo hello
  3. 确认命令进入当前 PTY。
  4. 再发送一条短命令,在单行输入状态下用方向键回填最近命令。
  5. 输入多行内容,确认方向键仍用于编辑 textarea,不劫持为历史切换。
  6. 运行一个持续输出命令。
  7. 确认主视图实时流式显示输出。

通过标准:

  • 输出主界面是 xterm 终端,不是聊天卡片。
  • ANSI 和换行行为不被前端重新包装。
  • 输入在 WebSocket 断开时不会被误报为已发送。
  • 命令历史只保存在当前浏览器会话内,退出登录或刷新后不会恢复。

4. 控制按钮

  1. 运行一个长命令。
  2. 点击 Ctrl+C,确认命令被中断。
  3. 点击“停止”,确认进程结束,状态变为已停止。
  4. 点击“重启”,确认终端清屏并启动新 PTY。
  5. 点击“关闭”,确认标签页被移除。

5. 重连与回放

  1. 打开一个持续输出中的终端。
  2. 刷新页面,或临时断开网络后恢复。
  3. 页面恢复后重新登录或自动恢复 session。
  4. 确认终端列表仍存在。
  5. 选中终端,确认最近输出被 replay。

通过标准:

  • 服务进程未重启时,不需要重新创建终端。
  • replay 只覆盖 ring buffer 最近输出,不声称是完整日志。

6. 服务重启边界

  1. 新建终端并确认正在运行。
  2. 重启 chat2ide 服务。
  3. 刷新页面并重新登录。
  4. 确认旧终端不存在。

通过标准:

  • 服务重启会清空 session、PTY 和 ring buffer。
  • 这个行为应与 README、运维文档一致。

7. Cloudflare Tunnel

  1. 通过 Cloudflare 域名访问页面。
  2. 登录。
  3. 新建终端。
  4. 发送命令。
  5. 确认 /ws 正常升级。
  6. 刷新页面并确认 replay。

通过标准:

  • APP_PUBLIC_ORIGIN 与公网 origin 一致。
  • cookie 在 Cloudflare 后有效。
  • WebSocket 不需要额外 path rewrite。

8. 手机端

  1. 用手机浏览器打开页面。
  2. 登录。
  3. 确认顶部紧凑状态栏、标签页、终端区和底部输入栏都可见,页面本身没有横向滚动。
  4. 横向滚动标签页。
  5. 使用底部输入栏发送命令。
  6. 用方向键回填单行历史命令。
  7. 点击 Ctrl+C、停止、重启。
  8. 在弱网恢复后点击“重连”。

通过标准:

  • 底部输入栏可用。
  • 顶部状态栏不会挤压到终端不可用。
  • 标签页可横向滚动。
  • 终端区域仍保留主要可视空间。
  • 控制按钮文字不溢出。

9. Direct Client Bridge

  1. APP_BRIDGE_TOKEN=bridge-token-32-bytes-minimum-dev-123456 启动服务。
  2. 登录 Web UI。
  3. 在另一个终端运行:
APP_BRIDGE_TOKEN=bridge-token-32-bytes-minimum-dev-123456 node scripts/bridge-smoke-client.mjs
  1. 也可以运行一键端到端 smoke:
npm run build
npm run smoke:e2e
  1. 确认终端列表自动出现 Direct client smoke session,后端标识为 Bridge
  2. 选中该终端,确认能看到 bridge smoke client ready
  3. 用底部输入栏发送 hello bridge
  4. 确认 smoke client 把输入回显为 echo:hello bridge
  5. 点击“重启”,确认终端清屏后出现 bridge smoke client restarted
  6. 点击“关闭”,确认 bridge 标签移除,smoke client 退出。

通过标准:

  • /bridge 未配置 token 时不可用;配置 token 后要求 Bearer token。
  • Bridge 会话不需要创建 PTY profile,会自动进入同一终端列表。
  • 手机端输入、resize、重启和关闭都能转发到拥有该 session 的客户端。