内置终端与 Claude Code 启动
中心标签页提供真实本地终端,并可从新标签页直接启动本机 Claude Code CLI。Web 模式不暴露主机命令执行能力,也不将本地 CLI 表述为远程 cloud session。
已验证缺口
普通管道不是 PTY
旧草稿使用 child_process.spawn、TERM=dumb 和 pipe。交互式程序没有终端设备,Claude Code 的光标、全屏刷新、颜色和快捷键不能正常工作。
输入输出控件不具备终端语义
<pre> 和单行 <input> 不解释 ANSI、光标移动、alternate screen、粘贴和 Ctrl+C。
入口与能力不一致
旧入口只显示 Terminal,且只能逐行提交命令;没有直接启动 Claude Code 的入口。
方案比较
| 方案 | 能力 | 决策 |
|---|---|---|
| node-pty | 真实 PTY,支持 input、output、resize 与生命周期;官方包含 Electron main + IPC + xterm.js 示例。 | 采用;只运行在 Electron main。 |
| xterm.js + FitAddon | 解释终端序列,产生原始输入,按 pane 计算 cols/rows。 | 采用;不自行实现终端协议。 |
| Claude Code CLI | 在终端中运行的本地 CLI。 | 采用本机 claude,由登录 shell 解析 PATH。 |
| spawn + pipe | 适合非交互命令,不提供终端模式与 resize。 | 拒绝。 |
目标交互
Terminal
在当前项目目录打开登录 shell。切换普通 tab 不终止会话;关闭 Terminal tab 才终止 PTY。
Claude Code
提供独立入口,点击后在同一项目目录直接执行 claude。
失败状态
bridge、PTY 模块或 CLI 不可用时显示明确错误;Web 模式不显示可交互假控件。
数据流与信任边界
xterm.js ── write / resize ──▶ preload allowlist ──▶ Electron main ──▶ node-pty ──▶ login shell / Claude Code
◀──────── terminal:data / exit ────────◀
◀──────── terminal:data / exit ────────◀
- renderer 只能选择
shell或claudepreset,不能提交任意 executable/argv。 cwd经 realpath 解析且必须为目录;PTY 绑定 renderer sender 与 terminal id。- 单次输入上限 64 KiB;cols/rows 限定范围;替代进程屏蔽旧进程输出。
- 进程按 tab 生命周期保留;普通 tab 切换只卸载 xterm 视图。标签关闭、renderer 销毁或显式 stop 才释放 PTY。
- PTY 使用 App 当前本机用户权限,不提供远程沙箱。
实现范围
变更限定为 built-in tab 的 id、label、launcher、renderer,terminal page/CSS,desktop bridge、preload、main,两份 package manifest、xterm 全局 CSS 和对应测试。
- Terminal 与 Claude Code 均使用 PTY + xterm.js。
- 保留现有 session、file、browser、web、bookmark、history、split、close 与 drag 行为。
- 排除远程 cloud session、通用终端会话管理、shell profile 编辑器、命令历史持久化、Windows 与 Web 主机终端。
验收条件
- 默认 App 中 Terminal 可执行
pwd。 - Claude Code 入口直接显示本机 CLI,输入与 Ctrl+C 到达进程。
- pane 宽度变化会同步 xterm 和 PTY cols/rows。
- 切换 tab 后 PTY pid 不变;单独关闭 Claude Code 不影响 Terminal。
- 公共入口、desktop IPC、TypeScript、Web build、desktop package 和默认 App E2E 全部通过。
实现状态与证据
| 阶段 | 状态 |
|---|---|
| 设计与边界 | 完成 |
| public-entry RED / GREEN | 入口、IPC、生命周期与打包检查通过 |
| 规格审查 / 质量审查 | 独立规格审查与质量审查通过 |
| 默认 App 可见验收 | 默认 18100 App E2E 通过;验证 Claude Code、Ctrl+C、resize、tab 保活与关闭清理 |