52 Commits
Author SHA1 Message Date
bigtan e91bab0d09 macOS 按 Apple Silicon 和 Intel 分别发布安装包
发布流程改为按 aarch64、x86_64 构建矩阵,分别签名、公证并上传 DMG 和升级 ZIP,
不再合成 universal 应用。两个任务使用独立缓存和产物名称,发布时收集全部架构。

更新清单保留原有平台键,分别记录对应架构包的地址、大小和 SHA-256。
已有 universal 客户端按运行架构升级;Rosetta 下的 Intel 版仍接收 Intel 包。
同步更新中英文下载说明、发布文档和示例清单,增加双架构校验与错包拒绝断言。

验证:52 项更新模块测试通过,Clippy、格式、YAML 和 shell 语法检查通过。
2026-10-10 22:33:22 +08:00
XuzandClaude Opus 5.5 ecf9d92e47 README 加上 LINUX DO 徽章
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 21:33:45 +08:00
XuzandClaude Opus 5.5 3c937a9be2 README 去掉界面语言的说明
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 00:18:41 +08:00
XuzandClaude Opus 5.5 51bdab74f4 README 默认英文:README.md 改为英文版,中文版移到 README.zh-CN.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 00:07:05 +08:00
XuzandClaude Opus 5.5 82c2c8b277 英文用户手册,README 说明界面有中英两种语言
docs/manual.en.md 按英文界面的用词翻译整本手册;README.en.md 改为链接英文手册。
两份 README 去掉「界面只有中文」的说明和路线图里的英文界面一项。
SFTP 标签菜单和地址提示里的 hostname 与其他处统一。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 22:30:25 +08:00
XuzandClaude Opus 5.5 cd3d41c496 接入 Aptabase 匿名使用统计,「设置 › 关于」新增开关
- 自己调 Aptabase 的批量接口 POST /api/v0/events(没有纯 Rust SDK)。只发版本、系统名和版本、CPU 架构、设置快照(取值固定,主机等数量只报档位)和功能使用次数;不发主机、凭据、命令、文件名、路径,也没有任何标识
- 四种事件:app_installed(首次启动,送达后记进 analytics.json)、app_started、app_active(窗口到前台且当天 UTC 还没报过)、usage(43 项功能计数,从第一次使用起满 4 小时汇总一条)
- 不用定时器:只在启动、窗口激活、用到功能、改设置时动作,满期的汇总和失败重试都等下一个信号;计数存盘,退出不等网络、不丢数据
- 内网断网不受影响:联网、系统检测、写文件都在后台线程,连接 5 秒、整体 15 秒超时,失败不提示,重试从 1 分钟起翻倍、最长 6 小时,4xx 不重试
- 「设置 › 关于」新增「隐私」组的「发送匿名使用统计」,默认开,关掉清空本机攒下的计数
- 只有发布构建发;开发构建设 SHELLRS_ANALYTICS_DEBUG=1 才发调试事件,汇总周期 1 分钟、失败 10 秒后重试
- 手册新增「隐私」一节列出全部上报内容,README 同步

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 20:04:38 +08:00
XuzandClaude Opus 5.5 7e32ac7033 外部 CLI 补齐主机与凭据管理和目录同步,命令写法对齐 termark
- 新增 shellrs hosts / credentials 的 list、show、create、update、delete,create / update 从标准输入读 JSON,show 的输出可以直接交回 update
- 校验和文案同对话框(HostDraft::validated),分组路径不存在就逐级新建;改了地址、端口或用户时保存的密码跟着搬
- 秘密只写不读:密码、口令、私钥进钥匙串或 keys/,show 只说有没有保存
- hosts delete 遇到有打开标签的主机报 host_in_use,--force 才关标签;删凭据时用它的主机改回自己登录
- 改动经服务端队列交给 UI 线程逐条执行,超时只算排队;写库和钥匙串失败报 save_failed
- 新增 shellrs sync:本地目录同步到远程,没变的文件跳过,--delete 删远程多余项(不删 .filepart 和备份,本地读不了的目录不清理)
- 去掉顶层 shellrs list,统一用 shellrs hosts list;skill、手册、README 同步更新

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 14:11:40 +08:00
XuzandClaude 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
XuzandClaude 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
XuzandClaude Opus 5.5 835894625f README:功能列表补上右侧栏工具,截图一节加右侧栏工具的拼图
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 19:03:05 +08:00
XuzandClaude Opus 5.5 28d4799154 README:写明可以像 Xshell、WinSCP 一样从堡垒机打开
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 17:54:07 +08:00
XuzandClaude Opus 5.5 6dcd084840 版本号改为 0.1.0:第一个正式版
更新日志的 0.1.0 一节补上右侧栏和从堡垒机打开;README 不再说目前只有 Beta 版。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 17:09:33 +08:00
XuzandClaude Opus 5.5 7886cb7138 外部 CLI:Agent Skills 增加 WorkBuddy
安装到 ~/.workbuddy/skills(Windows 是 %USERPROFILE%\.workbuddy\skills)。
设置页的 skill 行数按 AgentKind::ALL 的长度算,不再写死。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 23:25:40 +08:00
XuzandClaude 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
XuzandClaude Opus 5.5 260e5f493f README 的下载部分加上官网 shellrs.com/download
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 00:54:05 +08:00
XuzandClaude Opus 5.5 8ae0c38998 许可证改为 GPL-3.0:分发修改版本须同样以 GPL-3.0 公开源代码;README 开头一句强调 Rust 编写、GPU 渲染界面
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 23:45:21 +08:00
Xuz 3d6801d469 README 改写成开源首页:中英文两版、真实窗口截图(主界面深浅两色、分栏、SFTP、端口转发),原来的逐项说明、发布和开发说明移到 docs/;以 MIT OR Apache-2.0 双许可发布 2026-10-01 23:36:05 +08:00
Xuz ef2bd8c3a6 macOS 上点关闭按钮改为把 ShellRS 隐藏到后台:连接、传输和端口转发照常运行,点 Dock 图标恢复窗口,⌘Q 才退出 2026-10-01 21:00:22 +08:00
Xuz 43b5f81d51 README 去掉 SHELLRS_RELEASE_BASE 的说明:make-manifest.sh 里没有这个变量 2026-10-01 19:05:04 +08:00
Xuz 533d7aa3a1 更新清单里给每个包加上 GitHub Release 作为第二个下载地址 2026-10-01 19:04:15 +08:00
Xuz ee6633c401 make-manifest.sh 可用 SHELLRS_RELEASE_BASE 把下载地址指向本地服务器,便于本机演练升级 2026-10-01 17:32: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 e8b04b1344 README 不再提退出时安装更新 2026-10-01 14:46:31 +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
XuzandClaude 1e81f85343 SFTP:断线时操作远程侧弹出重连对话框,工具栏不换行,分栏对半并按标签记住
- 断线后对远程侧的操作(导航、刷新、删改、属性、所有传输)不再没有
  反应:弹出「与 会话名 的 SFTP 连接已断开」,说明原因,可直接「重新
  连接」;队列里有停止的批次或正在自动重连时只说明该怎么办。远程工具栏
  和菜单在未连接时保持可点,只有连接中才禁用
- 列表还没读到目录时显示「正在连接 SFTP…」「正在读取目录…」,不再
  先显示「空目录」
- 工具栏固定一行高,放不下的按钮从右往左整个隐藏,不换行,两侧列表
  始终对齐
- 新开的 SFTP 标签本地、远程对半分;分隔线位置(含队列)由标签自己
  持有,切换标签后不再被重置(不持久化)
- 去掉当前面板路径标签的蓝色下划线
- 双击任一中间区标签的标题,显示 / 隐藏左侧会话栏(同 ⌘B)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-30 18:06:07 +08:00
XuzandClaude 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
XuzandClaude 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
XuzandClaude e8f13c29fb SFTP:大小列可切换格式,确认框清单与传输详情更清楚
- 大小列默认按整 KB 显示(同 WinSCP),右键「大小」列标题可切换为
  字节 / 千字节 / 简短格式,全局生效并保存在 settings.json;列标题的
  右键命中经 menu_hit 交给列表容器的同一个菜单,不另挂菜单
- format_size 在四舍五入跨过 1024 或 100 时换单位 / 取整,
  不再出现「1024 KB」「100.0 KB」
- 上传 / 下载确认框:首行写明数量与种类,共同目录只写一次,每项一行
  带图标、悬停显示完整路径,长路径不再折成两行看似两项
- 传输「详情」:结果改为结构化的 TransferDetail(完成 / 跳过 / 失败
  及原因),带状态图标、最新在上;尚无结束项目时显示说明,不再展开
  成空框;按钮显示展开状态

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-25 16:08:08 +08:00
XuzandClaude d6e1ed69ec 外部 CLI 支持 Windows:命名管道、独立控制台程序 shellrs-cli 与用户 PATH 安装
- 新增 shellrs-cli 二进制(各平台都构建);Windows 发布版的 GUI 改为
  windows_subsystem = "windows",命令由 shellrs-cli.exe 承担
- Windows 上经命名管道 \\.\pipe\shellrs-cli-<数据目录散列> 与应用通信:
  DACL 只允许当前用户、拒绝远程客户端、首个实例独占名字;客户端以
  SECURITY_IDENTIFICATION 打开并校验管道属主,防止抢注冒充
- 设置 → 外部 CLI 在 Windows 上把 shellrs-cli.exe 复制成
  %LOCALAPPDATA%\ShellRS\bin\shellrs.exe 并加入用户 PATH;旧副本启动时
  自动更新,正在使用的副本也能替换;新增「已安装旧版本」「不在 PATH」
  「找不到 shellrs-cli.exe」状态
- 客户端拆成按平台的 connect 与共用的读帧循环;进度行改用空格覆盖;
  Windows 控制台上非法 UTF-8 输出替换为 U+FFFD;命令文本去 BOM、CRLF 转 LF
- 新增 tests/cli_bin.rs 进程级端到端测试与 Windows CI 工作流
- SKILL.md 增加 Windows / PowerShell 说明,README、CLAUDE.md 同步

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-25 14:00:21 +08:00
Xuz 9704a8cc20 新增外部 CLI:给 AI Agent 用的 shellrs 命令与设置页「外部 CLI」
- shellrs list / exec / upload / download:经本机套接字交给正在运行的 ShellRS 执行,命令本身不接触密码、钥匙串和数据库
- 设置 → 外部 CLI:启用开关(默认关)、把 shellrs 链接进 PATH、为通用 Agent / Codex / Claude Code / OpenCode 安装 skill
- exec 非交互登录,陌生主机或缺少密码直接失败;读到通道关闭为止,退出码透传远程命令
- 传输复用 SFTP 引擎,无人值守地回答提问;按 scp 规则解析目标并保留可执行位
- 套接字 0600 并校验对端 uid;开关关闭时仍监听但拒绝请求
- 修复 SFTP 批次准备失败时不发送 Idle 的问题
2026-09-25 13:11:23 +08:00
Xuz b2143edd01 会话列表悬停时在行右侧显示 用户@主机:端口 的 tooltip
- 会话行悬停 500 ms 后在行右侧弹出 tooltip,只显示 user@host:port,配色为主题反色
- 面板自持 TooltipOverlay 并指定 Placement::Right,不贴着鼠标、不遮挡下方行
- 修复鼠标向下移动到下一行时 tooltip 被上一行的收起请求提前收掉的问题
- 会话树里的系统徽章不再单独弹 tooltip,避免两个 tooltip 叠在一起
2026-09-25 12:01:39 +08:00
Xuz ead3712045 会话增加对外标识 public_id,右键菜单支持「复制 ID」
- sessions 表加 public_id 列(schema v7,唯一索引),16 位字母数字随机串,由 rand 生成
- 新建、复制会话时生成且不与已有的重复;编辑不变,删除后不复用;老库和手工插入的行在打开时补上
- 会话树和最近连接的右键菜单新增「复制 ID」,复制到剪贴板并通知
2026-09-25 11:30:53 +08:00
Xuz e3b5e20efe 程序改名为 ShellRS,命名空间改为 shellrs
- 界面显示名(窗口标题、标题栏、文案)改为 ShellRS
- crate、二进制、动作命名空间、线程名改为 shellrs
- 数据目录、数据库文件、SHELLRS_DATA_DIR、钥匙串服务名改为 shellrs;程序尚未发布,不保留旧名兼容代码
2026-09-25 10:49:37 +08:00
Xuz 5b6eee0b71 新增设置:外观(界面语言、应用外观)与终端字体配置,最近连接支持右键菜单
- 会话列表底部新增「设置」按钮(⌘, / Ctrl+,),在中间区打开单例的「设置」标签页
- 设置页用 gpui-kit 的 Settings 组件分两栏:左边分类(外观、终端,可搜索),右边设置分组
- 设置写穿到数据目录的 settings.json,写失败或读不出时弹通知;由工作区统一应用到窗口
- 外观 → 常规:界面语言(跟随系统 / 简体中文 / English,目前只切换 gpui-kit 自带文案)、应用外观(深色 / 浅色 / 跟随系统,随系统切换);标题栏主题按钮改为写这一项
- 终端 → 字体配置:字体(仅列出已安装的等宽字体,后台扫描)、字号、行高,默认值与原来一致,立即作用于已打开的终端;下方按终端排法预览数字、符号和中文
- 最近连接列表的主机支持右键菜单,与会话树共用同一个会话菜单
2026-09-25 10:00:20 +08:00
Xuz 348fe48e34 SFTP 路径标签与打开目录对话框、多 SFTP 标签、标签重命名,最近连接支持右键菜单
- 去掉面板顶部「用户@主机:端口」一行;路径栏改为 WinSCP 式路径标签:逐级可点、悬停高亮、过长时中段折叠
- 新增「打开目录/书签」对话框:目录输入加本侧书签列表,可添加、删除、上移、下移;书签按钮、⌘O 与路径标签均可打开
- 路径标签常驻浅蓝底色,当前面板加深蓝下边线;点列表空白处一次即切换当前面板
- 「正在连接 SFTP…」「正在读取目录…」移到列表下方状态栏,读取超过 300 ms 才显示,列表不再抖动
- 每次打开 SFTP 都新开标签(按 ExplorerId 寻址),各自独立连接与传输批次
- SFTP 标签使用主机系统徽章,右键菜单改为「重命名标签…」加关闭命令;重命名对话框与远程终端共用
- 最近连接列表的主机支持右键菜单,与会话树共用同一个会话菜单
2026-09-25 08:47:28 +08:00
Xuz 4badde667f SFTP 双栏对标 WinSCP:两行工具栏、WinSCP 列、多选、右键菜单、文件操作与下载 2026-09-25 01:54:32 +08:00
Xuz adbd1de688 终端右键菜单增加查找、清屏、SFTP、重新连接与断开连接 2026-09-24 23:13:14 +08:00
Xuz fa87917d9c 标签栏显示 SSH 连接延迟 2026-09-24 22:37:18 +08:00
Xuz 4428237b25 标签页增加右键菜单与主机徽章,统一「…」菜单 2026-09-24 22:36:24 +08:00
Xuz 47b2efdcc7 调整会话树展示并持久化分组展开状态 2026-09-24 18:55:37 +08:00