Files
OpenTerminal/docs/ROADMAP.md
T

88 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 原生支持面板拖动,已具备)
- [ ] 界面语言切换(中/英):需先把全应用文案抽为 i18n 资源目录(一次完整重构),设置页预留「系统」分区