内置终端与 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 的入口。
终端视图没有接入主题契约
终端背景、前景、光标和选择色被写死为单套深色值,ANSI 16 色也没有显式定义;切换浅色、暖色或自定义主题时,终端与 App 其余区域不一致。
进程操作与状态缺失
原有视图只能输入,不能从工具栏复制选择、粘贴、清屏、重启或停止进程,也没有区分启动中、运行中、已退出和错误状态。
方案比较
| 方案 | 能力 | 决策 |
|---|---|---|
| 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。 | 拒绝。 |
目标交互
终端
在当前项目目录打开登录 shell。切换普通 tab 不终止会话;关闭 Terminal tab 才终止 PTY。
Claude Code
提供独立入口,点击后在同一项目目录直接执行 claude。
失败状态
bridge、PTY 模块或 CLI 不可用时显示明确错误;Web 模式不显示可交互假控件。项目 WebSocket 尚未解析时不得留下空白页面:短暂等待后以主目录启动,且本次终端 cwd 一经启动不因迟到的项目回复重启。
主题与 ANSI
xterm 的背景、前景、光标、选择色和 ANSI 16 色全部来自全站语义 token。主题或 Custom CSS 变化时只更新 xterm theme,不重启 PTY,不丢失缓冲区。
终端工具栏
顶部显示 preset、运行状态和本次进程实际 cwd;右侧提供复制、粘贴、清屏、重启和停止。按钮使用紧凑无边框样式,hover 和 focus 服从全站 token。
键盘与粘贴
Cmd/Ctrl+Shift+C 仅在有选择时复制;Cmd/Ctrl+Shift+V 读取剪贴板并写入 PTY;普通 Ctrl+C 继续发送中断字符。Cmd+K 只清理当前 xterm 视口。
数据流与信任边界
◀──────── 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、终端语义主题 token,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 到达进程。
- 项目列表正常返回时 cwd 使用当前主项目;项目连接未返回时最多等待短暂窗口,随后在主目录提供可输入 shell,不显示空白页。
- pane 宽度变化会同步 xterm 和 PTY cols/rows。
- 切换 tab 后 PTY pid 不变;单独关闭 Claude Code 不影响 Terminal。
- 深浅、暖色和自定义主题切换会更新终端表面与 ANSI 16 色,且不改变 PTY pid。
- 复制、粘贴、清屏、重启和停止均可用;Ctrl+C 保持进程中断语义;工具栏明确显示 running、exited 与 error。
- 专项检查、TypeScript 与 Web production build 通过,并更新默认 App 资产。
实现状态与证据
| 阶段 | 状态 |
|---|---|
| 设计与边界 | 完成 |
| 完整 renderer 与主题契约 | 完成:ANSI 16 色、主题热更新、状态、cwd 与五项工具栏操作已实现 |
| 专项检查 / TypeScript / production build | check:integrated-terminal、tsc --noEmit 与 Next.js production build 通过 |
| 默认 App 更新 | 已更新 /Applications/OpenProgram.app;默认 18100 App 实测输入、ANSI、清屏、粘贴、停止、重启、PID 变化与关闭清理通过 |