DeepSeek Harness Hub
← 返回列表

miaokela/tinyterm-egui

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
未验证

使用DeepSeek V4.1测试版对tinyterm electron版本的功能复刻的纯rust版本

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/11 · 已提供中文文档
综合分
29.8
GitHub 分
29.8
用户评分
★ Stars
1
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add miaokela/tinyterm-egui
该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/20(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

TinyTerm (egui)

TinyTerm 的 egui / eframe 重写版本 —— 一个纯 Rust 的桌面 SSH 客户端,视觉与交互对齐原版
Tauri + React 实现(cosmic / glassmorphism 主题)。

TinyTerm 主界面:左侧主机列表,中间终端,右侧本地/远端文件管理

tinyterm-egui/
├── Cargo.toml
├── README.md
├── docs/
│   ├── ANALYSIS.md             # 原版全量功能与 UI 细节分析(需求基线)
│   ├── spec-backend.md         # Rust 后端逐命令规格(SQL/SSH/SFTP/加密)
│   └── spec-filemanager.md     # 文件管理器逐交互规格
└── src/
├── main.rs                 # 入口:存储、tokio runtime、eframe
├── app.rs                  # eframe::App:布局、事件泵、弹窗路由
├── state.rs                # 应用状态(Host/Session 标签、文件管理器、弹窗、Toast)
├── actions.rs              # 状态迁移(等价于原版 Zustand store actions)
├── models.rs               # 数据模型
├── storage.rs              # SQLite(与原版同 schema)
├── crypto.rs               # ttenc:v1 密钥信封(RSA-OAEP + AES-256-GCM)
├── ssh.rs                  # russh:连接、指纹校验、认证、PTY、exec、SFTP
├── session.rs              # 会话管理 + 事件总线
├── remote_fs.rs            # SFTP 远端文件操作 + tar 目录传输
├── local_fs.rs             # 本地文件操作与删除保护
├── transfer.rs             # 上传/下载编排(批次、tar、降级、冲突)
├── term.rs                 # vt100 终端仿真 + egui 网格渲染 + 按键编码
├── theme.rs                # 设计令牌(颜色/圆角/字号/光晕/星空背景)
├── widgets.rs              # 自绘控件(按钮、输入框、图标、加载动画)
└── ui/                     # 各界面模块
├── sidebar.rs          # 左侧主机侧边栏
├── session_tabs.rs     # 顶部会话标签条
├── terminal_view.rs    # 终端面板(输入/选择/滚动/右键/状态覆盖层)
├── file_manager.rs     # 文件管理双栏 + 传输队列 + 右键菜单
├── quick_actions.rs    # 快捷操作栏 + 常用指令 + 历史命令
├── system_info.rs      # CPU / 内存 / 磁盘表格弹窗
├── hosts_modal.rs      # 主机管理弹窗 + 主机表单
├── credentials_modal.rs# 凭据管理弹窗 + 凭据表单
├── settings_modal.rs   # 设置面板(原版缺失,此处补齐)
├── dialogs.rs          # 确认/冲突/登录/粘贴确认
└── toast.rs            # 右下角通知

构建与运行

改造本项目前先读 skills/tinyterm-egui-dev/SKILL.md:里面沉淀了设计令牌、布局常量、
SSH/SFTP 事件契约、打包流水线,以及一路踩过的坑(-1728、crt-static、wgpu 等)。

需要 Rust 1.85+(开发使用 nightly 1.100)。

cargo run --release

首次构建会编译 eframe/wgpu 等依赖,耗时较长。若网络受限:

CARGO_NET_OFFLINE=true cargo build

测试

cargo test

13 个测试覆盖:加密信封往返、SQLite CRUD 与设置迁移、终端仿真与按键编码、
路径/进度/解析辅助函数、本地 tar 打包解包、删除保护,以及一个*进程内 russh
测试服务器驱动的 SSH 端到端测试(首次连接指纹提示 → 信任后握手 → 错误密码被拒 →
密码认证成功 → exec / 远端 HOME / 远端 cwd → PTY shell 回显 → SFTP 子系统协商)。

数据位置

| 文件 | 路径 |
|---|---|
| SQLite | ~/Library/Application Support/com.tinyterm.app/tinyterm.db |
| 密钥 | 同目录 secret-key.pem |
| 缩放 | 同目录 zoom.txt |

环境变量 TINYTERM_DB 可覆盖数据库路径(指向原版 tinyterm.db 即可直接复用历史主机与凭据)。
若平台数据目录不可写,会自动回退到 ~/.tinyterm-egui/tinyterm.db。

数据库 schema 与原版 TinyTerm 完全一致,且加密信封格式相同,因此可以直接复用已有的
tinyterm.db(凭据会自动解密)。

已实现功能

- 主机 / 凭据 CRUD、搜索、复制、连接
- 多主机标签 + 多会话标签,标签切换保留终端上下文
- SSH 连接、主机指纹信任流程(首次 / 变更)、密码与私钥认证
- 完整终端仿真:256 色、粗体/斜体/下划线/反显、光标样式与闪烁、scrollback、文本选择与复制粘贴
- 右侧辅助终端(独立 SSH 会话并排)
- 文件管理器:本地/远程双栏、隐藏文件、路径编辑、重命名、新建文件夹、删除保护
- 上传 / 下载:单文件、目录(tar 打包)、批次队列、进度、取消、冲突处理
- 终端 cwd 跟随远端目录
- 快捷操作栏:CPU / 内存 / 磁盘查询、常用指令库、shell 历史
- 设置面板:字体、scrollback、光标、隐藏文件、界面缩放、已信任指纹管理
- 主机可达性探测与自动重连
- Toast 通知、统一确认对话框、登录提示、粘贴确认
- 终端鼠标上报(SGR/X10,TUI 程序可用)、括号粘贴(bracketed paste)

图标与品牌资源

界面图标使用 Phosphor Icons(MIT),字体文件内嵌在
assets/Phosphor.ttf,常量在 src/icons.rs。之所以不直接依赖 egui-phosphor:
该 crate 目前绑的是 egui 0.35,会把整个 egui 0.35/epaint 0.35 依赖树再编译一遍;
直接内嵌 TTF 只增加约 490 KB 二进制体积。

原版 TinyTerm 的品牌资源也一并复用:

| 文件 | 来源 | 用途 |
|---|---|---|
| assets/icon.png | src-tauri/icons/icon.png(512×512) | 窗口图标(ViewportBuilder::with_icon) |
| assets/logo.png | public/assets/logo.png(512×512) | 空状态 / 空会话里的 logo 贴图 |
| assets/icon.icns | src-tauri/icons/icon.icns | macOS .app 包图标 |
| assets/icon.ico | 由 icon.png 生成(16–256 全尺寸) | Windows exe 图标 + NSIS 安装包图标 |
| assets/screenshot.png | 本机运行截图 | README 界面预览 |

macOS 说明:winit 在 macOS 上不支持 set_window_icon,Dock/Finder 图标只能来自
.app 包里的 .icns,所以图标必须靠打包脚本写进 bundle(见下节)。

打包与分发

GitHub Actions 在推送 v tag 时构建两个产物,并同时发布到 GitHub Release,
从 Releases 页面直接下载(Actions 的 Artifacts 里也各留一份):

| 平台 | 产物 | 说明 |
|---|---|---|
| macOS 通用版 | TinyTerm-macos-universal.dmg | arm64 + x86_64 用 lipo 合并,带背景图的拖拽安装盘 |
| Windows x86_64 | TinyTerm-windows-x86_64-setup.exe | NSIS 安装包,按用户安装,不需要管理员权限 |

macOS

./scripts/bundle-macos.sh      # 生成 target/release/TinyTerm.app 和 TinyTerm.dmg
open target/release/TinyTerm.app

scripts/make-dmg.sh 生成带背景图的拖拽安装盘:左侧是 TinyTerm,右侧是
/Applications 别名,背景图底部给出两种 Gatekeeper 拦截的解决办法。

| 文件 | 用途 |
|---|---|
| assets/dmg-background.png / @2x.png | 660×440 / 1320×880 背景图 |
| scripts/make-dmg-background.swift | 背景图生成器(改文案后重新运行即可) |
| scripts/make-dmg.sh | 组装 .app → UDRW 镜像 → Finder 布局 → UDZO |

swift scripts/make-dmg-background.swift          # 重新生成背景图
scripts/make-dmg.sh dist/TinyTerm.app out.dmg    # 打包

布局靠 AppleScript 驱动 Finder 写入 .DS_Store;若当前环境不允许自动化控制
Finder,脚本会照常产出 DMG,只是没有背景图和图标位置(会打印 warning)。

因为构建产物未做 Apple 签名与公证,用户首次打开会遇到两种情况,背景图里都写了:

1. 「TinyTerm 已损坏,无法打开」 —— 从浏览器下载的文件带 quarantine 属性,
打开「终端」执行 xattr -cr /Applications/TinyTerm.app 即可。
2. 「无法验证开发者」 —— 点「完成」关闭弹窗,再到
系统设置 → 隐私与安全性,找到 TinyTerm 点「仍要打开」。

Windows

| 文件 | 用途 |
|---|---|
| scripts/windows-installer.nsi | NSIS 脚本:安装到 %LOCALAPPDATA%\Programs\TinyTerm,创建开始菜单/桌面快捷方式,写入「应用和功能」卸载项 |
| .cargo/config.toml | 为 Windows 目标打开 +crt-static(见下) |
| build.rs | 用 winresource 把 assets/icon.ico 和版本信息嵌进 exe(非 Windows 平台跳过) |
| assets/icon.ico | 由 scripts/make-windows-icon.swift 从 assets/icon.png 生成 |

cargo build --release
makensis /DAPP_VERSION=0.1.2
/DAPP_EXE="$PWD\target\release\tinyterm-egui.exe"
/DOUT_FILE="$PWD\TinyTerm-0.1.2-setup.exe"
/DICON_FILE="$PWD\assets\icon.ico"
scripts\windows-installer.nsi

关于 VCRUNTIME140.dll was not found:MSVC 目标默认动态链接 VC 运行库,没装
在装有 VC++ Redistributable 的机器上直接运行 exe 就会报这个错。.cargo/config.toml 给
x86_64-pc-windows-msvc 加了 -C target-feature=+crt-static,把运行库静态链进
exe,安装包因此不依赖任何额外组件。main.rs 里的
#![cfg_attr(all(target_os = "windows", not(debug_assertions)), windows_subsystem = "windows")]
则保证 release 版不弹控制台窗口。

关于远程桌面/虚拟机里打不开:Windows 版默认用 wgpu 渲染(DX12),并且自定义
了适配器选择——优先独显/集显,没有可用 GPU 时退到软件光栅化(WARP),所以远程桌面
会话和无 GPU 的云主机也能正常启动;macOS/Linux 仍然用 glow/OpenGL。
启动日志写在 %USERPROFILE%\.tinyterm-egui\tinyterm.log,致命错误会弹原生对话框。

与原版的差异(有意为之)

1. 终端仿真使用 vt100 而非 xterm.js;已覆盖常用 VT100/xterm 序列。
2. 使用 russh(纯 Rust)替代 libssh2,SFTP 与终端共用一条 SSH 连接(原版为独立连接)。
3. 增加连接超时(30s),避免黑洞主机无限等待。
4. 补齐原版缺失的完整设置面板。
5. 侧边栏折叠、缩放等交互改用 egui 原生实现(Cmd/Ctrl + +/-/0 仍然可用)。

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群