Xuz and Claude Opus 5.5
e9700d0e32
设置新增「应用 › 窗口」:记住窗口大小和位置
...
- 设置左栏在「关于」上面新增「应用」,「窗口」组两个开关,默认都打开:
记住窗口大小(含最大化状态)、记住窗口位置(连同所在屏幕),下次启动
时生效。
- 窗口移动、缩放停下后记进数据目录的 window.json,退出时再记一次。
- 恢复时那块屏幕不在了、或窗口大半在屏幕外,就放在屏幕中间;比屏幕大
就缩到能放下。全屏不记,按退出全屏后的大小恢复。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-06 23:17:55 +08:00
Xuz and Claude Opus 5.5
1bab1bff50
设置:切到别的标签再回来,停在原来的分类上
...
- 之前切回设置标签总是回到「外观」:gpui-kit 的 Settings 把选中的分类
放在元素状态里,标签不显示时就丢了。现在记下正在显示的分类,回来时
从它开始。页内的滚动位置和搜索框内容仍不保留。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-06 22:34:55 +08:00
Xuz and Claude Opus 5.5
613287aedd
主题:可选让界面也按主题配色,默认保持中性
...
- 「外观 › 终端主题」改名「主题」,组里第一项「界面跟随主题」,默认
关闭:界面是中性的黑白灰,只有终端按所选主题配色。
- 打开后侧栏、标签栏、对话框等也换成主题的底色和文字色,成功、警告、
错误等状态用主题的绿、黄、红;次要文字在正文偏淡的主题里也保持可读。
ShellRS Light / Dark 就是原来的界面。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-06 22:27:23 +08:00
Xuz and Claude Opus 5.5
d791dad8ae
终端主题:浅色、深色外观各选一套,界面切深浅时终端跟着换
...
- 设置 › 外观新开「终端主题」组,左栏浅色、右栏深色各 10 套内置主题,
卡片是主题名加一段 ls 示例,选中的整张加底色、右上角蓝底对勾。同一
主题的浅、深两版在同一行,没有另一版的排最后。应用外观(含跟随系统、
标题栏按钮)决定用哪一栏。
- 默认 ShellRS Light / Dark:背景、文字、光标、选区和原来一样,16 色
按 Tailwind 色阶重调,浅色下黄字等不再看不清。第三方主题取自各项目
自己的终端配色(MIT、Apache-2.0),出处写在源码里。
- 终端格子、边距、选区、链接都取自终端主题;程序查询颜色(OSC 4 / 10
/ 11 / 12)按当前主题回答,不再一律答深色背景。字体和关键字高亮的
预览也用当前主题。
- 不做自定义主题、导入、按主机指定。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-06 21:39:22 +08:00
Xuz and Claude Opus 5.5
2aa5d5be49
关键字高亮设置改成可直接编辑的规则表,总开关默认关闭
...
- 设置页分三组:常规(启用关键字高亮,默认关闭)、预览(当前终端字体和
配色下的一段示例日志)、规则(N)。
- 规则表在行里直接改,不再弹对话框:拖动把手排序、启用、正则表达式、
备注、颜色(取色器加 #rrggbb 输入框)、通知、删除。规则都是正则,区分
大小写;颜色可任意取,不跟主题;去掉加粗。通知标题用备注。
- 预置 ERROR、WARN、IPv4 三条示例,各自启用、不通知,打开总开关就能用。
- 取色器自带一行与调色板不重复的常用色:gpui-kit 默认的常用色也在调色板
里,同色两格是重复的无障碍节点,调试版会因此崩溃。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-06 19:46:18 +08:00
Xuz and Claude Opus 5.5
5f588a4a18
终端关键字高亮:按规则给匹配的文字上色,可选匹配时通知
...
- 规则是关键字(smart case,同查找)或正则表达式,加颜色(主题的红、黄、
绿、青、蓝、紫)和加粗,在所有终端里显示,回滚历史里的也一样;重叠时
靠前的规则优先。
- 只改显示:每帧对可见行把折行接成逻辑行再匹配,不改服务器的输出,复制
出的文字不变;窗口缩放重排、折成两行的词都照样上色。用 regex crate
匹配,不用 alacritty 的 RegexSearch(编不了 \b,^ 只认第一行)。
- 勾了「匹配时通知」的规则在看不到那个终端时提醒,同响铃;解析线程在
换行前读完整的一行,同一终端 10 秒一次,反复重画的同一行 5 分钟一次。
- 全屏程序(vim、less、top、tmux)里不高亮也不通知。
- 设置左栏新增「关键字高亮」,排在「终端」后面;首次预置 ERROR 红粗、
WARN 黄、IPv4 蓝三条示例。settings.json 里读不了的规则单条丢掉,不让
整个设置回退成默认值。
- 光标闪烁不再每 500 ms 取一整份终端快照。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-06 17:54:04 +08:00
Xuz and Claude Opus 5.5
3c38c664c2
外部 CLI 加 exec --json:JSON 进出,输出只含 ASCII
...
- shellrs exec --json 从标准输入读 {"host", "command"},命令结束后输出
{"exit_code", "stdout", "stderr"},出错时输出 {"error": {"code", "message"}},
退出码和不加 --json 时一样。非 ASCII 字符都转成 \uXXXX,不是 UTF-8 的输出
换成 U+FFFD:命令不经过本机 shell 的引号处理,控制台代码页也弄不乱输出。
- skill 的 Windows 一节:PowerShell 优先用 --json;要边执行边看输出时用
here-string 加 --stdin,先设 UTF-8 编码;Git Bash 用 heredoc。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-06 16:09:20 +08:00
Xuz and Claude Opus 5.5
a9e8d8dbef
终端通知:程序请求的通知(OSC 9 / 777)和响铃提醒
...
- 程序用 OSC 9 或 OSC 777 notify 请求通知,终端响铃时也提醒;OSC 9 里
ConEmu 的进度条、当前目录等命令不算。
- ShellRS 不在前台时发系统通知,点了回到那个终端;在前台但终端在别的标签
时弹应用内通知,点一下切过去。响铃在终端就在眼前时不提醒。
- 标题是标签名,同一终端程序通知 2 秒、响铃 10 秒内只提醒一次;设置 ›
终端 › 通知可分别关掉。
- 启动时设置应用标识 com.shellrs.ShellRS,Windows 安装程序的快捷方式用
同一个 AppUserModelID。
- 不做 OSC 133 长命令通知:要每台服务器装 shell 集成,收益不抵成本。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-06 14:37:53 +08:00
Xuz and Claude Opus 5.5
befdfc7b02
终端识别链接、支持鼠标上报和 OSC 52 远程复制
...
- 链接:输出里的 http / https 地址和程序用 OSC 8 标出的链接一直画成蓝色加
下划线,⌘(其他平台 Ctrl)单击用浏览器打开,悬停显示真实地址;末尾标点
和不成对的括号不算,折行的长地址算一个,其他协议不当链接。
- 鼠标上报:vim、htop、tmux 等要求鼠标时,单击、拖动和滚轮交给程序
(1000 / 1002 / 1003,默认、UTF-8、SGR 编码);按住 Shift 照旧选文字和
翻回滚,右键始终是 ShellRS 的菜单。
- OSC 52:远程程序复制的内容进本机剪贴板,只写不读,主选择区忽略。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-06 13:26:21 +08:00
Xuz and Claude Opus 5.5
d53bb559e6
SFTP 加「显示隐藏文件」开关:本地、远程各自独立,默认不显示
...
工具栏第一行最右边的眼睛按钮(睁眼表示正在显示,划掉的眼睛表示不显示)、
空白处右键的勾选项和 ⌘⇧. / Ctrl+Alt+H 切换所在一侧,名称以「.」开头的
文件和目录算隐藏文件。每一侧的选择对所有 SFTP 标签生效,存进设置。
不显示时面板底部写「隐藏 N 项」,选中的隐藏文件随之取消选择,新建和重命名
查重名时仍算上它们;显示时隐藏文件整行文字浅一些。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-06 11:45:18 +08:00
Xuz and Claude Opus 5.5
f1ac434ebf
SFTP 右键菜单:去掉目录的「打开」,加「复制路径」
...
文件名上的菜单不再有「打开」:目录双击就进入。「上传… / 下载…」下面
加「复制路径」,复制选中项目的完整路径,多个时每行一个,「..」是上级目录。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-06 09:29:05 +08:00
Xuz and Claude Opus 5.5
8e290562f8
SFTP 加图片和 Markdown 预览:双击图片预览,可缩放、原图和滚动
...
图片(PNG、JPG、GIF、WebP、SVG、BMP、ICO、TIFF)和 Markdown 在一个像快速查看的大对话框里预览,
Esc 关闭,远程文件可以「下载…」,Markdown 可以「编辑」。双击图片就预览;Markdown 和 SVG 是文本,
双击仍是编辑,右键另有「预览」。图片上限 20 MB,Markdown 同编辑器 5 MB。
图片默认适合窗口、居中显示;可以放大、缩小(⌘= / ⌘-,按住 ⌘ 滚动连续缩放)、看原图(⌘0)、
回到适合窗口(⌘9),双击图片在两者之间切换;比预览区大时可以滚动,缩放时中间的位置不动。
解不开的图片写明「无法显示这张图片」。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-05 22:50:02 +08:00
Xuz and Claude Opus 5.5
c679d9d8a0
SFTP 加内置编辑器:双击文件在编辑器标签里编辑,⌘S 原地写回
...
SFTP 里双击、回车、F4 或右键「编辑」一个文件(远程和本地都行),在中间区的「编辑器」标签里打开;
「新建 › 文件…」建好后也直接打开。同一个文件只开一个标签。先读后开:超过 5 MB、二进制或不是
UTF-8 的文件只弹说明,远程的可以改用「下载…」。
远程文件经打开它的 SFTP 标签的连接读写,不另起登录。保存是原地改写(截断后写原文件),所有者、
权限和链接都不变;保存前核对大小和修改时间,被别人改过就先问「覆盖」。BOM 和 CRLF 原样写回。
常见的约 15 种语言有语法高亮(gpui-kit 的 tree-sitter 特性;SQL 的语法库要求 cc ~1.2,所以
Cargo.lock 里 cc 退到 1.2.67)。
关闭有修改的标签问「保存 / 放弃修改 / 取消」;批量关闭、关 SFTP 标签、⌘Q(Windows / Linux 还有
窗口的关闭按钮)有未保存的文件时问一次。状态栏显示光标位置和编码、换行方式。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-05 21:37:26 +08:00
Xuz and Claude Opus 5.5
2de318a4e6
开始页加「快速连接」:搜索保存的主机,回车或单击连接
...
「最近连接」标题右边,「新建主机…」左边加一个小号的「快速连接」按钮(两个按钮都改成小号)。
打开的对话框列出所有保存的主机,连接过的按最近连接排在前面,其余按名称排;每行是系统徽章、
名称和「分组 · 用户@地址:端口」。名称、地址、用户名、备注和分组都能搜,几个词都要匹配。
打开时不高亮任何一台,输入后高亮第一个匹配的,回车或单击连接。
多选(Tab 选中、⌘A 全选、⇧↵ 批量连接)已经做好但先关掉,常量 MULTIPLE 打开即可。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-04 19:20:57 +08:00
Xuz and Claude Opus 5.5
9474c9e789
临时连接:标题栏「临时连接…」打开对话框,连一台主机而不保存
...
标题栏右上角的「新建主机…」换成「临时连接…」(新建主机还在主机列表的「+」、
右键菜单和 ⌘N)。对话框沿用主机对话框,去掉分组、连接方式和备注,名称可不填;
密码只留在内存里,不进钥匙串。连上后功能齐全(不像外部连接只开一个通道),
不进主机列表和最近连接,标签都关掉就没了;可以使用凭据,凭据改动和删除也
照顾到它。外部 CLI 不区分临时连接和外部连接,表格写「(未保存)」。
测试连接选「密码」却没填时,按「无密码」那样试(免认证、SSH Agent、默认私钥),
服务器要密码时报「未填写密码」。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-04 15:52:29 +08:00
Xuz and Claude Opus 5.5
2feae2fe3b
外部连接:sftp:// 链接打开 SFTP 标签,兼容 WinSCP 的调用方式
...
堡垒机像调 WinSCP 一样拉起 ShellRS(`ShellRS sftp://用户[:密码]@地址[:端口]`,
前面可以有 `/sessionname=名称`),开一个不保存的 SFTP 标签,左侧栏收起;
其余规则和 ssh:// 的外部连接一样。WinSCP 的其他开关忽略,链接里的路径暂不认。
补了 SFTP 不带密码、只凭账号(堡垒机令牌)登录的协议测试。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-03 15:44:17 +08:00
Xuz and Claude Opus 5.5
d5370f8bac
外部连接:改名并在打开时收起左侧栏
...
命名(用户定的):命令行链接打开的叫「外部连接」(不保存、只开终端);以后在
ShellRS 里直接输入地址、不保存但功能齐全的叫「临时连接」。代码里共同的「不
保存」统一叫 temporary(HostStore 的 temporary / is_temporary、
SecretRef::Temporary、TemporarySecretStore,和 CLI 的 JSON 字段一致),「只开
终端」改由来源决定:HostStore::is_external,login_of 只对它置 shell_only,右
侧栏也看它。shellrs list 表格写「(外部连接)」。
外部连接打开时左侧栏开着就收起(同 ⌘B),终端占满窗口;链接有误时不收。
命令片段面板本来就列出全部片段,外部连接照常都能看到;以后做适用范围时外部
和临时连接只显示「所有主机」的,规则记在 CLAUDE.md。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-03 15:17:03 +08:00
Xuz and Claude Opus 5.5
4fc7704954
临时连接只用终端这一个通道
...
用户的堡垒机在同一条连接上又来一个通道(系统探测的 exec)时会结束整个会
话:正替终端登录目标机时到来,终端报「No more authentication methods
available」;探测跑完通道一关,刚出提示符就退出。Xshell 和 OpenSSH 只开终
端一个通道。HostLogin 加 shell_only(临时主机置上):不做系统探测,工具的
命令直接拒绝、不发给服务器,右侧栏只给不执行命令的命令片段。延迟测量是全局
请求,照常。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-03 13:39:46 +08:00
Xuz and Claude Opus 5.5
e7fcc7ca40
Docker:同一个镜像有多个标签时每个标签一行,按标签查看和删除
...
docker images 每个「仓库:标签」一行,同一镜像的几行镜像 ID 相同,卡片和删除
按钮的 id 因此重复:调试版构建在镜像页直接崩溃,正式版里详情和删除只认第一
行,按 ID 删多标签镜像还会被 Docker 拒绝。现在每行按 Image::key 认:有标签
用「仓库:标签」(删除只去掉这个标签),没有标签用镜像 ID。只有仓库名的镜像
显示为「仓库:<none>」、按 ID 操作,不再被当成 仓库:latest;valid_id 允许 /,
带仓库地址的镜像可以删除和查看详情。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-03 13:03:18 +08:00
Xuz and Claude Opus 5.5
87c5cfb120
堡垒机用 ssh:// 链接打开临时连接(兼容 Xshell 的调用方式)
...
`ShellRS ssh://用户[:密码]@地址[:端口]` 或 `ShellRS -url … -newtab 名称`
开一个终端标签连过去。只看第一个参数判断是不是链接,外部 CLI 的命令不受
影响;Windows 发布版也认。
- 临时连接不保存:HostStore 把它放在单独的 transient 里,按 id 找得到,
但不在 hosts() 里,不写库、不进最近连接;终端和 SFTP 标签都关掉就忘掉。
- 链接里的密码只在 TransientSecretStore 的内存里(SecretRef::Transient),
不进钥匙串。
- ShellRS 已在运行时,Request::Activate 带上链接交给它打开;不带链接时消息
和以前一字不差,旧版收到也只是调出窗口,所以不升协议版本。
- 链接有问题时弹通知说明原因,文字里不带链接原文。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-03 11:24:42 +08:00
Xuz and Claude Opus 5.5
ba63b3d73f
在线升级:标题栏按钮更醒目,更新对话框不再列更新说明
...
标题栏的更新按钮改成 success 色的浅色按钮(出错时 warning 色),不再是
普通图标加一个小绿点。更新对话框不再显示更新说明,页脚两个按钮:「查看
更新内容」打开 https://shellrs.com/changelog,「重启并安装」照旧;去掉
「稍后」,用关闭按钮或 Esc 关。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-03 00:25:41 +08:00
Xuz and Claude Opus 5.5
de0fafe6ee
Docker:有多个容器的 compose 项目默认折叠
...
只有一个容器、而且它在运行的项目默认展开;多个容器的项目展开会把下面的
都挤下去,卡片上已经写着「运行中/总数」。手动展开或折叠照旧记在面板里。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-03 00:25:36 +08:00
Xuz and Claude Opus 5.5
ee8441e301
命令片段:右侧栏的新工具,按分类保存常用命令,点一下输入或执行
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-02 20:09:20 +08:00
Xuz and Claude Opus 5.5
9143e387bc
历史命令:右侧栏的新工具,列出主机上 bash 的历史命令,点一下放进终端输入行
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-02 19:08:16 +08:00
Xuz and Claude Opus 5.5
2576b46e43
Docker:右侧栏的 Docker 工具,管理容器、卷、镜像和网络
...
- 容器按 compose 项目分组,可启停、重启,查看详情和日志;卷、镜像、网络可查看详情和删除
- 工具图标换成 Docker 的鲸鱼;单元测试起子进程时加锁,修好外部 CLI 测试的偶发失败
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-02 18:18:27 +08:00
Xuz and Claude Opus 5.5
610cb12fbf
系统服务:右侧栏的新工具,管理 Linux 主机的 systemd 服务
...
- 按自定义 / 系统分组,按状态分页、搜索;启动、停止、重启,启用或禁用开机启动
- 点服务打开详情,含状态和最近的日志
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-02 16:51:39 +08:00
Xuz and Claude Opus 5.5
3e8f635fa7
进程管理:右侧栏的新工具,列出 Linux 主机的进程,可查看详情和结束进程
...
- 按内存或 CPU 排序、搜索,每 15 秒刷新;点进程打开详情,含完整命令
- 右键或详情里结束 / 强制结束进程,先确认
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-02 16:10:56 +08:00
Xuz and Claude Opus 5.5
0d455e02f5
网络连接:右侧栏的新工具,列出 Linux 主机的 TCP、UDP 连接和监听端口
...
- 卡片显示协议、状态、地址、进程和用户,可搜索、按协议和状态筛选
- 打开或切换终端时读取一次,点刷新再读;系统监控和它共用终端里执行命令的部分
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-02 14:41:00 +08:00
Xuz and Claude Opus 5.5
8a0436caf6
系统监控:右侧栏的第一个工具,经终端自己的 SSH 连接读取 Linux 主机的 CPU、内存、网络和磁盘
...
- 右侧栏只跟远程终端出现,已知不是 Linux 的主机不显示监控图标,最窄 320 px
- 端口转发、凭据列表和开始页的滚动条挂到不滚动的外层上,修正滑块位置
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-02 13:34:23 +08:00
Xuz and Claude Opus 5.5
616bcead0f
终端右侧栏:窗口最右边一列工具切换,右侧 Dock 里显示所选工具,先放四个占位面板
...
- 窗口级的一份右侧栏,只跟着终端出现(远程终端和本地终端):SFTP、设置、开始页在前时
右侧栏连同按钮列都不显示,回到任一终端时按原样恢复,内容对应这个终端(主机或本机)
- 右侧 Dock 只有一个面板 ToolSidebar,按钮列由工作区画在 DockArea 外面;点工具显示、
再点收起,⌘⌥B / Ctrl+Alt+B 显示或隐藏;默认收起、宽 320 px,不持久化
- 占位工具:命令片段、历史命令、Docker、系统监控,写明将来显示什么和「即将推出」
- 当前标签统一经 Workspace::set_active_tab 改,它同步右侧栏的显示与指向的终端
- 右侧 Dock 不可折叠,只在关闭时临时可折叠,避免中间区标签栏多出 gpui-kit 的折叠按钮;
按钮不抢终端焦点,收起时焦点在右侧栏里就交还给中间的标签
- 新增 UI 测试;CLAUDE.md 记下产品决定、实现要点和测试标识
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-02 11:42:31 +08:00
Xuz and Claude Opus 5.5
0ff59d07bc
侧栏三个列表的行 tooltip 统一成主机列表的样式:开在行的右侧、主题反色、在行间跟着指针移动
...
- 主机列表的 TooltipOverlay、主人判断和动画抽成 shared::RowTooltips,主机、端口转发、凭据三个面板共用;
转发和凭据原来用 ListItem::tooltip,贴着鼠标弹出、盖住下面的行、和菜单同色
- 内容一律是一行要点、下面小一号的补充:主机是 user@地址:端口加备注,转发是完整的规则说明,
凭据是行里第二行的全文,密钥凭据下面是私钥文件的完整路径
- 转发行的启停按钮有自己的 tooltip:指针在按钮上时行的 tooltip 收起,回到行里再出来;
ListItem 的 suffix 不在内容盒里,按钮区另外量一次,tooltip 按并集定位,不再压在按钮上
- 新增转发和凭据行 tooltip 的 UI 测试;主机备注的测试 id 改为 host-tooltip-note;CLAUDE.md 同步
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-02 09:57:06 +08:00
Xuz
c69d14dc4b
其余新建、编辑对话框的校验错误统一改用错误通知
...
- 分组、端口转发、凭据、SFTP 重命名 / 新建和「打开目录」不再在表单最下面放错误行,
校验不过时弹 form_error_notification;同一种通知新的替换旧的,点一下收起,
对话框关闭时由 on_close 收掉(凭据加密完后自行关闭的那条路单独收)
- 删除不再使用的 shared::form_error
- 新增测试:主机、分组、端口转发、凭据四个对话框各弹一条错误通知,关闭对话框后消失
- CLAUDE.md 写明「表单的校验错误一律弹错误通知」
2026-10-01 15:47:24 +08:00
Xuz
b97d5b493e
修正通知画在对话框背景底下:通知层的绘制优先级提到弹出层之下一级
...
- gpui-base 的对话框按 10 + 层号的优先级绘制,通知层原来是 1,一直被对话框背景盖住、
发灰,点它也点到背景上;改为 POPUP_PRIORITY - 1,高过对话框、低于菜单和 tooltip
- 主机表单的错误通知点一下就收起
- 新增测试:点主机对话框的错误通知能点到它并收起(旧优先级下这个测试超时)
- CLAUDE.md 更正对话框绘制优先级的说法
2026-10-01 15:35:54 +08:00
Xuz
d9fcb78ea4
主机对话框的校验错误改用错误通知弹出,不再显示在表单最下面
...
- 新增 shared::form_error_notification / dismiss_form_error:错误以通知弹出,元素沿用
form-error 标识;同一种通知新的替换旧的,不叠;对话框关闭时一并收掉
- 主机表单去掉错误行和对应的状态
- 新建主机的校验测试补上:错误是一条通知、再点一次仍只有一条、保存后消失
2026-10-01 15:34:09 +08:00
Xuz
82fcdd4296
SFTP 标签栏右侧显示连接延迟,和终端标签一样
...
- SFTP 工作线程另起一个任务测往返:新连接建好就测,之后每 5 秒一次,传输进行中也照测;
只在一次 ping 期间持有连接,客户端被换掉或断开就放手,「断开」照样立刻关掉连接
- 新事件 SftpEvent::Latency;SFTP 标签在已连接时于标签栏右侧显示,断开、重连时清掉
- Latency / LatencyLevel 从终端模块移到 connection.rs;测往返的函数提到 ssh/latency.rs,
终端和 SFTP 共用;标签栏上的延迟文字抽成 shared::LatencyLabel
- 新增协议测试(连上后很快报出实测延迟)和 SFTP 标签栏的界面测试
2026-10-01 15:32:24 +08:00
Xuz
388a1aa68a
UI 测试按功能拆成模块:tests/ui.rs → tests/ui/
...
- 仍是一个测试程序(tests/ui/main.rs,cargo test --test ui),每个文件单独成测试程序会再链接一遍 GPUI
- 按功能分 11 个模块:host_dialog、host_tree、connection、terminal、workspace、settings、
sftp、transfer、forward、credential、update
- 两个以上模块共用的夹具和假实现放进 support/:mod.rs 是公共的 use、种子 id 和通用助手,
其余按终端、SFTP、端口转发、测试连接、凭据分文件;只有一个模块用的留在那个模块里
- 纯搬移,测试逻辑不变:147 个测试名称与搬移前一致,全部通过
- CLAUDE.md 写明模块划分和新测试该放哪里,AGENTS.md、README 改路径
2026-10-01 14:53:33 +08:00
Xuz
03dfd8d8eb
设置「关于」简化为「应用更新」三行,更新渠道可在运行时切换
...
- 「关于」页只剩「应用更新」一组:当前版本(下面是状态,右边是版本号和一个按钮:
检查更新,或重启并安装… / 下载更新 / 前往下载页)、更新渠道、自动升级;
构建号和平台挪到版本号的悬停提示里,去掉官网、更新日志链接和更新内容
- 更新渠道(稳定版 / Beta)存在 settings.json,默认是安装包自己的渠道;切换后丢掉
已找到和已下好的版本,开着自动升级时立刻查新渠道
- 状态文案改成整句,去掉「上次检查」时间;设置页和更新对话框共用 UpdateStep,
对话框的按钮改叫「重启并安装」
- 主机对话框「无密码」和「SSH 跳板」的说明文字缩短
- 新增切换渠道的 UI 测试,假更新源按渠道签发清单
2026-10-01 14:43:17 +08:00
Xuz
2dff7be7db
主机行的悬停提示显示备注
...
- 悬停主机行时,tooltip 在「用户@地址:端口」下面用小一号、淡一些的字显示备注;
最宽 20 rem、自动折行,超过 6 行省略,没有备注的主机不变
- 新增 UI 测试:备注在地址下面,没有备注的主机不显示这一行
- CLAUDE.md 与 README 同步更新
2026-10-01 14:14:41 +08:00
Xuz
ef83812f45
表结构发布前重构,「会话」在代码和数据库里统一改名为 Host
...
- 数据库升到第 13 版:主机的登录、连接方式、代理和备注合进 hosts 一行,只有一对多的跳板、书签和端口转发单独成表;全部表改为 STRICT,并用 CHECK 写明约束;用凭据的主机不再冗余存用户名,凭据外键不再级联,在用的凭据删不掉
- 表名 sessions → hosts、session_jumps → host_jumps,session_id → host_id,地址列 host → address;schema 比对去掉排版,以后加字段可以直接 ADD COLUMN
- 删除开发期的历史迁移代码:版本 1–12 的库直接拒绝打开、不动文件
- 代码里 Session / SessionId / SessionStore 等改为 Host*,模块 session/ → host/,Host.host → Host.address,菜单命令与界面元素 id 同步改名
- 外部 CLI 的参数、JSON 字段和错误码改为 host(host_not_found),协议版本升到 2
- CLAUDE.md、AGENTS.md、README 与 Agent skill 同步更新
2026-10-01 14:04:30 +08:00
Xuz
f0690fe6b2
在线升级:后台检查、下载并在重启或退出时安装新版本,发布流水线与应用图标
...
- 新增 update 模块:从 dl.shellrs.com 取已签名的更新清单(minisign,签名绑定通道和版本),
按大小和 SHA-256 校验安装包;下载可续传、可换镜像,走系统代理
- 按安装方式安装:macOS 整包交换并核对开发者签名,Windows 静默运行安装程序,Linux 覆盖 AppImage;
开发构建和无法自更新的安装只提示前往下载页
- 设置新增「关于」:版本信息、检查更新、下载进度和「自动检查并下载更新」开关;
新版本就绪后标题栏右上角提示,更新对话框写明重启会中断什么;退出时自动安装,新版本启动后提示已更新
- 数据库拒绝打开更新版本建的库,迁移已有的库之前先备份成 shellrs.db.v<旧版本>.bak
- 新增 release workflow 和 packaging 脚本:universal macOS 包签名公证、Inno Setup 安装程序、
AppImage、上传 R2、生成并签名更新清单;新增 CHANGELOG.md
- 应用图标放在 assets/logo;开发模式下 macOS Dock 显示 logo,Windows exe 嵌入图标
- 修正 AppImage 里 shellrs 命令链接到临时挂载点;启动时刷新已安装但过期的 Agent skill
- 新增清单、验签、下载、各平台安装器和界面的单元测试与 UI 测试
2026-10-01 12:33:01 +08:00
Xuz
e60275dfde
主机增加「备注」
...
- 主机对话框最后新增多行「备注」(回车换行,不提交对话框),记下机器的用途、负责人、
到期时间之类;只保存在本地数据库,不进登录快照,修改备注不会重连
- 数据库升到第 12 版,新增 session_notes 表,只有填了备注的主机有一行;复制主机时备注一起复制
- 新增迁移、存取、复制和对话框的测试
2026-10-01 12:30:26 +08:00
Xuz
f1485fe8f5
主机增加「连接方式」:直接连接 / SSH 跳板 / 代理连接
...
- 主机对话框「分组」下新增「连接方式」分段控件:SSH 跳板选已保存的主机、可多级(只走列出的链,跳板主机自己的连接方式不生效),代理连接支持 HTTP(CONNECT)和 SOCKS5,用户名和密码可选,代理密码进系统钥匙串
- SshConnector 按路由建立底层流:代理握手后的 TCP,或上一台跳板的 direct-tcpip 通道;跳板连接随最终连接一起关闭;跳板和代理的问答与报错写明是哪一台
- 数据库升到第 11 版,新增 session_jumps / session_proxies 两张表;删除被用作跳板的主机时留下「已删除的主机」占位,连接时报错,不悄悄改成直连
- 改跳板主机的地址或认证方式,经过它的主机也会重连;删除确认框写明有几台主机把它用作跳板
- 新增代理握手单元测试、跳板与代理的协议测试和对话框 UI 测试
2026-10-01 11:10:37 +08:00
Xuz
9ec2b46234
主机认证方式改为「密码 / 使用凭据 / 无密码」,对话框单选改用分段控件
...
- 主机对话框去掉「认证类型」和私钥字段:「密码」只走密码(留空则每次询问),
「无密码」依次试服务器免认证、SSH Agent 和 ~/.ssh 默认私钥,服务器要密码时直接报错不询问;
私钥只能通过密钥凭据使用
- 数据库升到第 10 版:自己选了私钥文件的主机按「用户 + 私钥文件」转成密钥凭据,
原来的「自动」归为「密码」
- 删除凭据后,密码凭据的主机改为「密码」,密钥和 Agent 凭据的主机改为「无密码」
- 新增基于 gpui-base Radio 的 SegmentedControl,用于主机和凭据对话框里的几选一
- 主机列表标题栏的「新建主机」移到「新建分组」前面
- 测试夹具一律关闭动画,避免对话框滑入导致的偶发失败
2026-10-01 10:03:25 +08:00
Xuz
ee488309f3
密钥凭据可粘贴和生成私钥,状态栏显示终端尺寸
...
- 密钥凭据的私钥分「本机文件 / 粘贴 / 生成新密钥」三种来源,仍是一个对话框;
生成支持 Ed25519 与 RSA 4096,可用口令加密,对话框里显示并可复制公钥
- 粘贴和生成的私钥写成数据目录 keys/ 下的 0600 文件,凭据引用其路径;
再次粘贴或生成时原地覆盖,换掉或删除凭据时随之删除,用户自己的私钥文件从不改动
- 空列表和空白处右键新增「生成密钥…」,密钥凭据右键新增「复制公钥」
- 窗口状态栏右侧由写死的光标位置改为当前终端的尺寸(列×行),
SFTP 标签、开始页和设置页不显示
- UI 测试的基础夹具关闭动画,修正对话框滑入导致的偶发失败
2026-10-01 09:06:31 +08:00
Xuz
d6d052de9e
凭据(密码 / 密钥 / SSH Agent),主机的认证方式分「手动输入 / 使用凭据」
...
凭据
- 标题栏「ShellRS」后面加第三个图标「凭据」,侧栏的第三个列表:搜索、
↑↓ 与回车编辑、双击编辑、右键编辑 / 删除,空列表里有「新建凭据…」
- 三种:密码(用户名 + 密码)、密钥(用户名 + 本机私钥文件路径 + 口令)、
SSH Agent(用户名)。凭据带用户名,改了之后用它的主机一起变;改用户名、
类型或私钥文件会让已连接的主机重连,只改名称不会
- 密码进钥匙串,账户名 credential:<随机 keychain_id>,不用会被复用的数字
id;口令照旧按私钥文件归属
- 删除仍在用的凭据先确认并写明台数,那些主机改成「手动输入 · 自动」、
保留用户名,已打开的连接不断开,凭据的密码随之删掉
- 库升到 v9:新增 credentials 与 session_credentials 两张表(不给 sessions
加列,ALTER TABLE 会破坏「升级后与新库逐字相同」),迁移改成按 STEPS
逐级升级
主机对话框
- 「认证方式」改为「手动输入 / 使用凭据」单选。手动输入原样保留
自动 / 密码 / 私钥文件;使用凭据时选凭据,用户名和秘密都来自凭据,
「测试连接」读钥匙串里凭据保存的密码
- 密码、私钥文件、口令三个字段连同异步预填和 secret_change 抽成
session::SecretFields,主机和凭据两个对话框共用
- 地址与端口同一行的四列布局
登录
- 新的 SessionLogin:store 在 UI 线程查好凭据生成的登录快照,终端、SFTP、
端口转发的 provider 和外部 CLI 的 CliTarget 都改收它;主机和凭据的修改
按前后快照是否相等决定是否重连
- SSH Agent 凭据只走 agent,连不上、没有钥匙、服务器都不接受时明确报错;
agent 位置可注入(AgentLocation),Windows 接 OpenSSH Agent 的命名管道,
手动的「自动」也走同一个 connect_agent
- LoginTest 分 typed(表单说了算)和 saved(读钥匙串)
测试
- 单元:凭据模型、登录快照、v8→v9 迁移、store 的凭据接口与用户名同步、
删除规则
- 协议:密码凭据只读自己的钥匙串条目;进程内 russh agent 服务端覆盖
Agent 登录成功和几种失败
- UI:侧栏切换、新建 / 编辑 / 删除凭据、类型决定字段、主机使用凭据、
测试连接、终端拿到的登录、改用户名重连;新建主机的校验测试改为等待
错误行出现(对话框滑入时它在最底下一行)
文档:README 新增「凭据」一节;CLAUDE.md 同步架构和不变量,并更正
转发对话框「选完主机移走焦点」的描述(代码里从未有这个处理)
2026-10-01 07:45:58 +08:00
Xuz
837ccb7f89
端口转发(本地 / 远程 / 动态),「会话」改称「主机」,同一数据目录只运行一个实例
...
端口转发
- 标题栏「ShellRS」后面两个图标切换左侧栏:主机列表 / 端口转发列表。
侧栏是一个面板(workspace::Sidebar)里的两个列表,「设置」页脚两边
都有;有转发在跑时图标旁显示数量
- 三种转发:本地(direct-tcpip)、远程(tcpip-forward)、动态(手写的
SOCKS5 / SOCKS4 / 4a)。每条规则经由一台已保存的主机,启动时自己建
一条 SSH 连接,不计入主机的连接状态,「断开连接」不停它;删除主机或
分组连同规则一起删,确认框写明数量
- 本地 / 动态转发先监听再登录,端口被占用在任何问答之前就报出来;
断线后按 1、3、10 秒自动重连三次,重连不弹问答;断线靠 SSH 处理器被
丢弃来发现
- 规则和主机同库:schema 升到 8,新增 forwards 表和 7→8 的迁移步骤
- 列表:搜索、启停按钮、状态(连接中 / 运行中及连接数 / 重连 / 失败
原因)、右键菜单、↑↓ 与回车;规则可设「启动 ShellRS 时自动开启」
- 配置对话框:一行三张类型卡片、随表单填入地址的示意图、一句话说明
和一直循环的流向动画(gpui-kit 的 animate_keyframes)。示意图里的
服务器按角色叫「SSH 服务器」;「经由主机」默认留空;远程转发填了非
回环地址时提示服务器要设置 GatewayPorts
- 测试:进程内 russh 服务器加回显服务驱动真实工作线程(protocol_tests),
UI 测试注入 FakeForwardProvider
界面文案
- 左侧列表里保存的一项从「会话」改称「主机」(量词「台」),主机对话框
里填 IP / 域名的字段改叫「地址」;代码标识符仍是 Session,外部 CLI 的
英文说明和 session_not_found 不变
- 所有对话框点外面不再关闭,只能用取消、关闭按钮或 Esc
单实例与启动
- 再次打开 ShellRS 时把已有窗口调到前面、新进程退出:启动图形界面前
先连外部 CLI 的套接字发 Request::Activate,不受「启用外部 CLI」开关
影响
- 修正两处启动即崩溃:数据库 / 设置读不出来、外部 CLI 启动失败时,在
窗口的 Root 挂上之前弹通知会 panic,改为 notify_once_open 延后
其他
- parse_port、confirm_delete 移到 shared/dialog.rs;SshConnector 增加
connect_forwarding 与 is_network_error
- README、CLAUDE.md、AGENTS.md 同步
2026-10-01 00:46:51 +08:00
Xuz and Claude
341ae93618
重构:删除死代码、合并重复逻辑,迁移链压成一份 schema,修正重试时的总字节数
...
功能不变的精简(src 净减约 1200 行)
- 死代码:没人调用的 Workspace 构造函数、终端引擎 / 视图的 Changed 事件、
append_line 一串、known_hosts_path、若干无人调用的访问器和字段,以及
no_json 动作上用不到的 Deserialize
- 上传 / 下载各写一遍的进度记账抽成 TransferMeter(sftp/meter.rs);两个
确认框合成一个 TransferForm;面板和目录行的拖放处理合成 accept_drops
- ExplorerCommand 里只做转手的 6 个变体收成 Enqueue(TransferJob) 和
Operate { remote, operation }
- SessionStore 的写库报错收成 persist,拖动排序的分组 / 会话分支共用
reordered;认证和主机密钥提示的回调共用一个闭包;5 个动作宏合成
id_actions!;表单对话框的页脚和错误行抽到 shared/dialog.rs
- CLI 服务端的 serve 改为 respond 返回 Result
- 去掉 TerminalPrompt* 别名层,统一用 connection::Connection*;
WorkspaceStatus 改为枚举;SSH 认证函数去掉只有一个实现的泛型
- 上传续传记录不再接受从未写出过的 version 1 格式
数据库
- SCHEMA_V1…V7 和七级迁移压成一份完整的 SCHEMA,新库直接建成当前结构。
版本号保持 7,已有的库照常识别;版本 1–6 的旧库不再能打开(项目尚未
发布)
修正
- 目录扫描失败后点「重试」,total_bytes 不再多减目录自身的大小(上传和
下载都是),补了两个回归测试
- UI 测试 canceling_unknown_host_prompt_keeps_session_disconnected 等
传输线程处理完取消再断言,去掉一处线程竞态
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-30 20:21:29 +08:00
Xuz and Claude
1e81f85343
SFTP:断线时操作远程侧弹出重连对话框,工具栏不换行,分栏对半并按标签记住
...
- 断线后对远程侧的操作(导航、刷新、删改、属性、所有传输)不再没有
反应:弹出「与 会话名 的 SFTP 连接已断开」,说明原因,可直接「重新
连接」;队列里有停止的批次或正在自动重连时只说明该怎么办。远程工具栏
和菜单在未连接时保持可点,只有连接中才禁用
- 列表还没读到目录时显示「正在连接 SFTP…」「正在读取目录…」,不再
先显示「空目录」
- 工具栏固定一行高,放不下的按钮从右往左整个隐藏,不换行,两侧列表
始终对齐
- 新开的 SFTP 标签本地、远程对半分;分隔线位置(含队列)由标签自己
持有,切换标签后不再被重置(不持久化)
- 去掉当前面板路径标签的蓝色下划线
- 双击任一中间区标签的标题,显示 / 隐藏左侧会话栏(同 ⌘B)
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-30 18:06:07 +08:00
Xuz and Claude
bf72546c64
SFTP:断网和读目录错误显示在窗口左下角,标签增加终端的命令,空闲时也能发现断网
...
- 读不了目录、连接断开的原因不再插在列表上方,改为用红字显示在窗口
状态栏最左边(平时写「已连接 会话名」处);SFTP 标签在前时那里显示
这个标签自己的连接状态。终端标签的会话断开时也是红字
- SFTP 标签菜单增加打开 SFTP、复制 IP 地址 / 主机名、重新连接,标签栏
和远程终端一样有「SFTP」「重新连接」按钮;重新连接在已连接时也可用
(先断开再连),有批次在跑或停在队首时不可用
- russh-sftp 的「session closed」算作断网,断网后刷新不再停在
「已连接」、无法重连
- SFTP 通道流包一层 WatchedStream,读到结尾即发出关闭信号;工作线程
空闲时等它,和终端一样在 keepalive 关掉连接时立刻报告断开,不必等
下一次请求。等待时不持有客户端,主动断开仍会立即关掉连接
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-26 09:19:07 +08:00
Xuz and Claude
59a3ffd1a6
SFTP:WinSCP 式传输队列,文件列表支持框选、按名称单元格选择
...
传输队列(每个 SFTP 标签一个,替代原来的进度条)
- 传输进行中也能再发起上传 / 下载,新批次排队依次执行;引擎每个命令后
发 Idle,标签据此推进。已停止的批次挡在队首,等继续、丢弃续传进度
或移出队列
- 队列面板在双栏下方,有项目时出现、可拖动高度:每批一行(来源、目标、
已传输、剩余时间、速度、进度),进行中的批次带当前文件子行,批次行
可展开看逐项结果;工具栏有继续、停止、移出、丢弃、清除已完成
- TransferProgress 补当前文件、只按传输阶段累计的用时、最近 3 秒的速度
(TransferClock)、跳过 / 失败的字节和重连说明
- 确认框在有传输时提示这一批会排队
文件列表的选择(同 WinSCP 关闭「整行选择」)
- 名称单元格才是项目:悬停只有名称格变灰,选中底色和光标框铺满名称格,
单击 / 双击 / 右键作用在整个名称格上;行上不再画任何状态,DataTable
自带的整行 hover 用表格底色盖住,右键的整行边框立即清掉
- 光标框只画在未选中的光标项上(..、刚用 ⌘ 取消的项)
- 从名称格右边的空白、其他列或列表下方拖动是框选,按住 ⌘ / Shift 开始
则加到原有选择上,拖到边缘自动滚动;框选只作用于开始它的面板
- 单击空白处(其他列、列表下方)取消选择,⌘ / Shift 单击不取消
- 只有拖图标和文件名才是拖文件:按下未选中的项时只选中它,拖已选中的
项带走全部已选;只有到了另一侧列表上才显示「上传 / 下载 N 个项目」
并用复制光标,其他地方(包括自己的列表)显示禁止光标
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-25 21:35:05 +08:00