Desktop onlyLocal processPTY

内置终端与 Claude Code 启动

中心标签页提供真实本地终端,并可从新标签页直接启动本机 Claude Code CLI。Web 模式不暴露主机命令执行能力,也不将本地 CLI 表述为远程 cloud session。

已验证缺口

普通管道不是 PTY

旧草稿使用 child_process.spawnTERM=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 ────────◀

实现范围

变更限定为 built-in tab 的 id、label、launcher、renderer,terminal page/CSS,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. pane 宽度变化会同步 xterm 和 PTY cols/rows。
  4. 切换 tab 后 PTY pid 不变;单独关闭 Claude Code 不影响 Terminal。
  5. 公共入口、desktop IPC、TypeScript、Web build、desktop package 和默认 App E2E 全部通过。

实现状态与证据

阶段状态
设计与边界完成
public-entry RED / GREEN入口、IPC、生命周期与打包检查通过
规格审查 / 质量审查独立规格审查与质量审查通过
默认 App 可见验收默认 18100 App E2E 通过;验证 Claude Code、Ctrl+C、resize、tab 保活与关闭清理