Skip to content

Issue 7 Validation

clean edited this page Oct 2, 2026 · 4 revisions

Issue #7:仓库终端实现与验收

产品行为

v0.6.1 的仓库工具栏没有终端。此 PR 在中央区域底部加入真实交互终端:本机仓库使用 Alune 服务所在主机的 node-pty;SSH 仓库使用对应连接的 ssh2 PTY;关联 Worktree 使用自己的登记路径。服务端从 repositoryId 解析环境和 cwd,客户端不能传任意 cwd。

每窗口最多 8 个会话,切换仓库、关闭仓库标签、收起面板保留进程与输出。重载窗口或断线会关闭所属通道,不恢复旧会话、不重放命令。退出显示状态和退出码。SSH 断网后已脱离会话的远端任务状态无法保证。

输出使用客户端完成 xterm 解析后 ACK 的背压,单包不超过 16 KiB,待发队列不超过 256 KiB,30 秒没有 ACK 时终止会话。历史最多 10,000 行 / 2 MiB UTF-8 文本;出现裁剪时显示提示。窗口尺寸限制为 2–500 列、1–200 行。

关闭运行会话、删除仓库登记/连接、应用退出使用 L2 确认:默认取消、勾选后才能操作、Enter 不确认。取消创建不需要额外确认。删除 Worktree 期间锁住新建,避免创建与删除竞态。

桌面启动使用应用 token;未认证 Web 服务禁用终端。本机 Web 终端代表服务主机,界面展示主机身份。认证 token 具有该服务用户的 shell 权限,不支持开放匿名终端。

本地自动验证

环境:macOS ARM64;本地 Node 25.5.0、Electron 44.2.0、node-pty 1.1.0、xterm 6.0.0。测试只修改隔离临时仓库。

命令 / 场景 结果
npm test -w server -- --runInBand 26 suites / 282 tests 通过
npm test -w web 235 tests 通过
npm run test:unit -w desktop 45 tests 通过
npm run test -w desktop(完整旧桌面冒烟) 未通过:settings-shell-smoke.cjs:111 的设置页返回按钮焦点断言失败,现场 documentFocused:false;不能标为完整桌面回归通过
node --test apps/server/test/terminal.integration.cjs 2 集成测试通过,使用真实 node-pty、HTTP、Socket.IO、两个独立 SSH 服务
npm run desktop:build shared / ssh-client / server / web / Electron stage 通过
npm run pack -w desktop macOS ARM64 .app 生成通过,未签名/公证
npm run test:terminals -w desktop -- --packaged 原生包输入、真实 cwd、中文路径、收起恢复、L2 关闭、退出取消、exit 7、registry 清理通过;补充 12,000 行输出/截断提示、备用屏幕切换、200% 缩放复验通过

集成测试覆盖:本机和关联 Worktree 独立 pwd、特殊中文/空格/引号/$(...) 路径、两个 SSH transport、跨窗口输入/resize/ACK/关闭拒绝、输出不串流、8 会话上限、resize 的 stty size、Ctrl+C、exit code、缺失路径/缺失 shell、创建取消竞态、SSH 断线、关闭 SSH 后 Git 仍可用、删除确认 snapshot、未认证服务拒绝、未 ACK 时暂停输出、关闭 HUP 抵抗子进程。

两个 SSH 服务位于同一台隔离测试主机、使用不同登录身份和通道;这验证路由隔离,并不等同于两台独立服务器的系统 hostname / 用户部署验收。

Windows 首轮集成测试在 fixture 初始化阶段失败:直接使用 Windows 反斜线路径调用 Worktree 打开接口,与接口要求的 Git 列表路径不一致。已改为先读取真实 Worktree 列表,再使用返回的路径;失败初始化也会清理服务,避免测试进程挂住。此失败发生在 PTY 创建之前,不能算 Windows 终端通过。

早期测试暴露 node-pty 预编译 spawn-helper 无执行位、PTY 暂停后退出无法排空等问题,已修复后复验通过。官网单独安装依赖不包含 node-pty,prepare 脚本现在跳过缺失的可选工作区依赖。

实际 UI

使用 ego-browser 操作真实产品和 SSH 服务,已验证浅/深主题、390px 窄窗口无页面横向溢出、真实 SSH 输入输出、L2 勾选门槛、保留运行会话。此处截图来自实际产品,不是原型。

浅色 SSH 终端,系统 hostname 与本机用户名两行已用色块脱敏;其余输出是临时测试仓库,未替换为伪造输出:

Alune 实际产品:SSH 终端与特殊字符路径

390px 窄窗口,中央终端与空状态:

Alune 实际产品:390px 仓库终端

深色主题已人工检查;最终深色截图被既有仓库提示遮挡,未用作证据。后续补截图时浏览器由用户接管,自动化已停止,没有绕过用户控制。

平台与支持边界

CI 使用 Node 22.22.0,矩阵为 macos-14、ubuntu-22.04、windows-latest。构建后运行真实 PTY 集成,再打包并从 .app / .exe / Linux 可执行文件运行 renderer 输入测试。Linux 使用 xvfb。Windows 使用 ConPTY / cmd;SSH POSIX fixture 在 Windows 不运行。

PR 提交 b0b074c 的 CI 运行 37022304301 三个平台全部通过。合并到 development 后,提交 c322bbb 的 CI 运行 37024930921 再次通过三平台真实 PTY 集成与原生包终端检查,单元测试 CI 也已通过。本轮包含同时合入的工作区与 PR 页面改动;下表结果在合并提交上复验通过,不代表完整旧桌面冒烟或尚未完成的现场检查通过。

平台 PTY 集成 打包后原生窗口测试 shell / 范围
macOS ARM64 (macos-14) 2 / 2 通过 TERMINAL_DESKTOP_SMOKE_OK darwin arm64 本机 /bin/sh、两个隔离 POSIX SSH 服务、Worktree
Linux x64 (ubuntu-22.04) 2 / 2 通过 TERMINAL_DESKTOP_SMOKE_OK linux x64,xvfb 本机 /bin/sh、两个隔离 POSIX SSH 服务、Worktree
Windows x64 (windows-latest) 2 / 2 通过 TERMINAL_DESKTOP_SMOKE_OK win32 x64 本机 cmd / ConPTY、Worktree;此 runner 未运行 POSIX SSH fixture

各原生包实际验证输入、读取测试文件、cwd、隐藏/恢复、L2 关闭、12,000 行历史裁剪、200% 缩放完整可见、应用关闭取消、exit 7 与最终 registry 清理。备用屏幕测试在 POSIX 平台执行。以下保留排错经过,最终结果以上表为准。

Windows 第二轮的真实 PTY 用例已执行到清理,但 fixture 未关闭 SQLite,删除临时库报 EBUSY。已补数据库连接关闭。排查测试进程不结束时,也发现 node-pty 的 Windows 输出线程在 shell 正常退出后仍需显式 kill() 清理;产品传输层已修复(1e9a14b)。后续 CI 的 Windows PTY 集成已通过,进程可正常结束。原生包首次检查因 Windows 短路径 RUNNER~1 与真实长路径比较失败;已改用原生路径规范化。

200% 缩放检查进一步要求输出区完整落在面板范围内,发现短窗口预留预览空间会裁切输入区。已修正短窗口布局并复验;先前仅检查元素非零高度的结果不足以证明可见。多行粘贴现在展示完整的 16 KiB 范围内内容供确认。Windows 的较小可用桌面进一步暴露短窗口控制栏占用过高。已将短窗口复制、粘贴、复制路径、关闭操作合并到菜单;高度不足时用“全部会话”切换,优先保留 PTY。自动检查现在使用 1024×680 内容窗口加 200% 缩放,并验证输出区域完整位于面板内。原生桌面包最终结果见上表。

尚未声称通过:系统中文输入法候选/组合过程、Windows/Linux 人工视觉与剪贴板、独立远程 sshd 的 bash/zsh/fish 部署矩阵、断网后主动脱离 PTY 的远端任务清理。现有测试不等价于这些现场检查,发布前应逐项复验。

Clone this wiki locally