OpenTerminal v0.2.1: terminal suite with SSH, split panes, themes and keyword highlighting
- Local terminal (node-pty) + SSH sessions (ssh2) with unified data plane - dockview split panes, per-group '+' tab bar button, layout templates - Session replay buffer (late-subscriber catch-up), host key pinning, credential encryption via safeStorage - 12 builtin themes + custom theme editor, system font enumeration - Keyword highlighting: regex rules with priority, ANSI truecolor injection, chunk-boundary-safe stream (carry-over of partial escape sequences) - Dark antd theme app-wide, settings dialog redesign, error boundary - Tests: ssh loopback, session e2e, highlight split-chunk regression
This commit is contained in:
commit
551723c2d4
58 files changed
+11929
No files matched your search
@@ -0,0 +1,86 @@
|
||||
# OpenTerminal 长期路线图
|
||||
|
||||
目标:以开源组件组合复刻 XTerminal 的核心终端能力(调研依据见 `research/i18n-extracted.txt` 功能清单),按里程碑推进,每个里程碑可独立交付使用。
|
||||
|
||||
## 里程碑总览
|
||||
|
||||
| 阶段 | 内容 | 状态 |
|
||||
|---|---|---|
|
||||
| M1 | 本地终端 + 分屏 + 主题/字体 + 设置持久化 | ✅ 已完成(v0.1) |
|
||||
| M2 | SSH 远程会话 + 连接管理器 | ✅ 已完成(v0.2) |
|
||||
| M3 | SFTP 文件管理 + 传输面板 | 📋 下一步 |
|
||||
| M3 | SFTP 文件管理 + 传输面板 | |
|
||||
| M4 | 命令历史/命令库/补全 + 会话日志 + 关键词高亮 | |
|
||||
| M5 | 广播输入 + ZMODEM + 快捷输入面板 | |
|
||||
| M6 | AI 助手(终端内建议 + 独立对话) | |
|
||||
| M7 | 打包分发(electron-builder + 自动更新) | |
|
||||
|
||||
## M2 — SSH 远程会话 ✅
|
||||
|
||||
- [x] `src/main/ssh.ts`:ssh2 连接池(connect/shell/resize/close),PTY_DATA/PTY_EXIT 广播通道统一复用(本地与 SSH 会话同数据面)
|
||||
- [x] 连接配置模型(`shared/connections.ts`):host/port/username、密码 vs 私钥(keyPath/keyContent)vs Agent、keepalive
|
||||
- [x] 凭据加密存储:safeStorage(DPAPI) + `plain:` 兜底;渲染层只见 savedAuth 标志
|
||||
- [x] 连接管理器 UI:书签侧栏(分组手风琴)+ 新建/编辑对话框 + 双击连接
|
||||
- [x] Host key 校验:known_hosts 固定、首次确认、变更告警、30s 超时拒绝
|
||||
- [x] 测试:tests/ssh-loopback.mjs(ssh2 回环)+ tests/ssh-session-e2e.mjs(真实会话路由层 e2e)
|
||||
- 待解锁后的 GUI 验收:双击书签连接、指纹弹窗交互、断线提示
|
||||
- 已知限制:SSH 面板暂不支持作为分屏参照(总在新标签打开);连接中 Modal 不可取消;agent 认证未在本机验证
|
||||
|
||||
## M3 — SFTP 文件管理(下一步)
|
||||
|
||||
- [ ] `src/main/sftp.ts`:ssh2 SFTP 封装(readdir/stat/rename/mkdir/rm/mv,大文件分块传输 + 进度事件)
|
||||
- [ ] 双栏界面(本地 ↔ 远程)+ 拖拽上传/下载 + 传输面板(队列/暂停/取消)
|
||||
- [ ] 右键菜单:压缩/解压(tar.gz)、编辑远程文件(Monaco,下载-编辑-回传)
|
||||
- 验收:100MB 文件传输进度流畅、可取消续传
|
||||
|
||||
## M4 — 命令系统与会话日志
|
||||
|
||||
- [ ] 命令历史(sqlite + better-sqlite3,按会话去重)
|
||||
- [ ] 命令库(分组 + 参数变量 `{{param}}` + 一键运行/粘贴)
|
||||
- [ ] 终端补全:历史 + 命令库 + 内置命令表(XTerminal 内置 607 个 Linux 命令文档,可从 tldr 页面生成)
|
||||
- [ ] 会话日志:手动启停、纯文本落盘、断线暂停指示
|
||||
- [ ] 关键词高亮:正则规则 → 颜色(前景/背景 + 优先级),预设规则集(错误/警告/IP)
|
||||
- 验收:补全 ↑↓/Tab/Esc 交互与 XTerminal 一致
|
||||
|
||||
## M5 — 多终端协同
|
||||
|
||||
- [ ] 广播输入(toggleBroadcast):选中多个会话同步键入
|
||||
- [ ] 快捷输入面板(Quick Input):右下角浮层 = 命令输入 + 快捷命令 + 最近命令
|
||||
- [ ] ZMODEM(rz/sz):渲染层检测 ZRQINIT/ZRINIT 序列,触发文件选择
|
||||
- [ ] 快捷键系统:增减字号、切换上下个终端、全局快捷键(globalShortcut)
|
||||
- 验收:3 个分屏同步执行命令;rz 传输成功
|
||||
|
||||
## M6 — AI 助手
|
||||
|
||||
XTerminal 的模式(已从逆向确认):终端悬浮助手 + `fill_terminal_input` 工具(AI 生成命令 → 用户选「填充」或「回车执行」,危险命令标红确认)。
|
||||
|
||||
- [ ] Provider 抽象(OpenAI/Anthropic/本地 Ollama 兼容接口),API Key 本地加密存储
|
||||
- [ ] 选中即问(解释/翻译/修复错误)、命令建议 → 填充/执行二段式交互
|
||||
- [ ] 独立对话面板(多会话历史,本地存储)
|
||||
- 验收:断网优雅降级;流式输出;不做任何未确认的自动执行
|
||||
|
||||
## M7 — 打包与分发
|
||||
|
||||
- [ ] electron-builder:nsis 安装包(Windows 优先,x64/arm64)
|
||||
- [ ] 原生模块处理:node-pty 已用 @lydell 预编译版,无需 rebuild
|
||||
- [ ] 自动更新(electron-updater + generic provider 或 GitHub Releases)
|
||||
- [ ] 代码签名(可选)
|
||||
|
||||
## 工程约定(贯穿各阶段)
|
||||
|
||||
1. **契约先行**:新增功能先在 `src/shared/` 定义通道与模型,再实现两端
|
||||
2. **原生依赖**:优先选带预编译二进制的包(@lydell/node-pty 模式),避免用户机器装构建链
|
||||
3. **渲染层加密不可取**:不做代码混淆/加密(XTerminal 加密渲染层的做法牺牲了可调试性,收益仅是防抄)
|
||||
4. **测试**:main 进程服务(pty/ssh/sftp)用 vitest 单测;渲染层交互靠 dev 手测
|
||||
5. **里程碑验收后打 git tag**(引入 git 后)
|
||||
|
||||
## 已知待办(M1 遗留)
|
||||
|
||||
- [x] ~~布局塌陷~~(v0.2.1 修复:antd `<App>` 包裹层 `.ant-app` 无高度导致百分比高度链断裂)
|
||||
- [x] ~~关闭标签页整窗崩溃~~(v0.2.1 修复:xterm IDisposable 对象被当函数调用;并新增 ErrorBoundary 兜底 + 渲染层报错转发主进程日志)
|
||||
- [x] ~~首启动空屏~~(v0.2.1:启动自动打开一个终端)
|
||||
- [ ] autoWrap=false 的固定列宽模式(xterm.js 无原生 wrapMode,需自定义列数控制)
|
||||
- [ ] 终端标题跟随 OSC 序列(窗格标题显示当前目录/命令)
|
||||
- [ ] 内置等宽字体打包(OFL 许可:JetBrains Mono / Fira Code 等,XTerminal 内置 19 款可作清单参考)
|
||||
- [ ] rendererMode webgl 的终端数量上限自动降级(XTerminal:7 个后强制 DOM)
|
||||
- [ ] 会话数据在面板间拖拽迁移(dockview 原生支持面板拖动,已具备)
|
||||
Reference in new issue
Block a user