仅桌面端本地进程PTY

内置终端与 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 视口。

数据流与信任边界

xterm.js ── 写入 / 调整大小 ──▶ preload 允许清单 ──▶ Electron 主进程 ──▶ node-pty ──▶ 登录 shell / Claude Code
◀──────── terminal:data / exit ────────◀

实现范围

变更限定为 built-in tab 的 id、label、launcher、renderer,terminal page/CSS、终端语义主题 token,desktop bridge、preload、main,两份 package manifest、xterm 全局 CSS 和对应测试。

  1. Terminal 与 Claude Code 均使用 PTY + xterm.js。
  2. 保留现有 session、file、browser、web、bookmark、history、split、close 与 drag 行为。
  3. 排除远程 cloud session、通用终端会话管理、shell profile 编辑器、命令历史持久化、Windows 与 Web 主机终端。

验收条件

  1. 默认 App 中 Terminal 可执行 pwd。
  2. Claude Code 入口直接显示本机 CLI,输入与 Ctrl+C 到达进程。
  3. 项目列表正常返回时 cwd 使用当前主项目;项目连接未返回时最多等待短暂窗口,随后在主目录提供可输入 shell,不显示空白页。
  4. pane 宽度变化会同步 xterm 和 PTY cols/rows。
  5. 切换 tab 后 PTY pid 不变;单独关闭 Claude Code 不影响 Terminal。
  6. 深浅、暖色和自定义主题切换会更新终端表面与 ANSI 16 色,且不改变 PTY pid。
  7. 复制、粘贴、清屏、重启和停止均可用;Ctrl+C 保持进程中断语义;工具栏明确显示 running、exited 与 error。
  8. 专项检查、TypeScript 与 Web production build 通过,并更新默认 App 资产。

实现状态与证据

阶段状态
设计与边界完成
完整 renderer 与主题契约完成:ANSI 16 色、主题热更新、状态、cwd 与五项工具栏操作已实现
专项检查 / TypeScript / production buildcheck:integrated-terminal、tsc --noEmit 与 Next.js production build 通过
默认 App 更新已更新 /Applications/OpenProgram.app;默认 18100 App 实测输入、ANSI、清屏、粘贴、停止、重启、PID 变化与关闭清理通过