dsh-tidy:用侧边栏收纳区整理暂时不用的工作区与会话

前言

在 DeepSeek Harness(DSH)里长期开多个工作区和会话时,侧边栏会越来越长:有些目录只是偶尔才打开,有些对话已经结束但你还想保留记录,它们却每天都占着列表位置。删文件夹或清会话能腾地方,但往往不是你想要的——你只是希望界面先清爽一点。

下面介绍的 dsh-tidy(维护者 JHyugou)是社区目录里的客户端类插件:在侧边栏「插件」行与「工作区」分区之间增加一块可折叠的收纳区,用拖放把暂时不用的工作区(含其下全部会话)或单个会话收进去,需要时再还原。收纳只影响侧边栏显示,不改工作区目录、会话数据或宿主存储。

这是什么

dsh-tidy 的定位可以概括为:给 DSH 侧边栏加一个 stash 收纳区(Sidebar stash area for DeepSeek Harness)。

收纳清单写在浏览器 localStorage(键 dsh-tidy.stash.v1,读取时会自动迁移到 v2),跨重启保留;不写宿主、不改动工作区与会话实体本身。

收纳区在侧边栏的位置

收纳区插在「插件」面板行与「工作区」分区标题之间,逻辑结构大致如下(与 README 示意一致):

[品牌 / 新会话]
[插件]                 ← 全局面板行(ui-plugin-manager)
[收纳区  N 个  全部还原]  ← dsh-tidy(标题前可折叠)
     单个会话被收纳(只藏这一行,工作区还在)
     工作区被收纳(其下所有会话一起从列表消失)
[工作区  搜索  设置  新建]  ← ui-workspace 分区标题
  ...

空态只占一行(约 28px);有收纳项时才展开为标题加列表。点标题前的折叠控件可以把整块收成一行,折叠状态会跨页面刷新保留。

核心功能

拖放收纳与还原

操作 做法
收纳工作区 把工作区标题行(带文件夹图标)拖进收纳区 → 该工作区及其名下所有会话从侧边栏消失
收纳单个会话 把会话行拖进收纳区 → 只隐藏该行,工作区与其它会话不变
折叠 / 展开 点收纳区标题前的折叠标记;状态持久化
单条还原 点该行右侧 「还原」,或把收纳行拖回下方「工作区」列表
批量还原 点标题栏右侧 「全部还原」
清理失效项 工作区已删除时显示「已不存在」,点 「移除记录」 只清收纳记录

补充行为(README 已说明):

  • 「新会话」占位行不能被收纳,会提示。
  • 某会话已收纳、其工作区也被收纳时,该行会标注「随工作区」;还原工作区后该会话仍保持收纳,需单独点「还原」。
  • 正在使用的工作区或会话也可以被收纳,会话不会因此关闭;通过还原或搜索、URL 等入口仍可访问。

实现要点(与 DSH 的耦合)

侧边栏外壳没有「插件行与工作区之间」的官方插槽,且 sidebar.workspaces 为 single 席位,无法简单替换 ui-workspace。本插件采用 headless 插槽 + DOM 挂载:

  1. 在 shell.overlay 注册不产生可见 DOM 的 headless 组件,以使用 useWorkspaces 等钩子;
  2. 用 React portal 把收纳区挂到 [role="tree"] 上溯至「工作区」标题容器之前的精确位置;
  3. 用 CSS 属性选择器隐藏对应行:workspace:<id> 整段分组收起,session:<id> 单行隐藏;不支持 :has() 时有降级。

宿主端还提供只读诊断路由 /api/dsh-tidy.status。依赖项(行 data-row-key、拖放载荷、锚点 DOM 等)变化时,收纳能力会降级并打 [dsh-tidy] 警告,不影响 DSH 其余功能。

安装与启用

README 中的安装方式以本机目录 link 为例(改代码可即时生效)。首次安装与卸载命令如下——请将 <本目录路径> 换为你 clone 或解压后的插件目录绝对路径;不要凭插件名自行拼接未在文档出现的 dsh plugin add github:... 形式。

# 首次安装(desktop profile)
dsh plugin --profile desktop add <本目录路径>

# 卸载
dsh plugin --profile desktop remove dsh-tidy

装好后宿主会热加载客户端 bundle(dsh-client-modules 增量扫描 Loader 条目),但已打开的 DSH 窗口需要刷新一次(Ctrl+R) 才会拉取新的浏览器 bundle。

社区目录页可能提供面向普通用户的安装指引;无论从何渠道安装,安装前建议阅读仓库源码与 MIT 许可证,并确认插件在与你相同的 DSH 进程权限下运行。

典型用法

经过上面的安装与刷新,按下面顺序即可自测:

  1. 在侧边栏找到「插件」行下方的收纳区(空态为一行)。
  2. 将暂时不用的工作区标题行拖入收纳区,确认其下会话一并从列表消失。
  3. 或将某条会话行单独拖入,确认仅该行隐藏。
  4. 需要时点击 「还原」 或拖回工作区列表;也可点 「全部还原」。
  5. 若工作区已在磁盘删除,在收纳区用 「移除记录」 清理无效项。

排障时可在 DSH 窗口 DevTools 控制台使用诊断 API(节选):

__dshTidy.state()        // 当前收纳清单与折叠态
__dshTidy.anchor()       // 插入点解析结果
__dshTidy.mounted()      // 挂载容器是否在位
__dshTidy.probe(id)      // id 会被识别为工作区还是会话
__dshTidy.unstashAll();  // 等价于全部还原

仓库内验证命令(维护者自测用,可选):

node --test                    # 43 项单元测试
node tools/verify.mjs          # 宿主端 5 项
node tools/browser-check.mjs   # 真浏览器 31 项(无 Chrome/Edge 时 SKIP)

适用场景与注意

适合谁:经常在 DSH 里并行多个仓库或长会话、希望侧边栏保持可读、又不想删数据或关会话的开发者。

已知限制(来自 README):

  • 平铺视图(「按会话」分组)与搜索结果中没有工作区行:无法从那里拖入工作区收纳,但收纳区内的项仍可还原;已收纳工作区的会话在平铺视图里也会被隐藏。
  • 收纳的是显示,不是数据;清单在 localStorage,换浏览器或清站点数据会丢清单,实体工作区与会话不受影响。
  • 隐私模式下 localStorage 不可用时,清单降级为仅本次会话有效。

DSH 生态强调「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。安装第三方插件前请自行审阅代码与权限边界。

结尾

dsh-tidy 用一块可折叠的侧边栏收纳区,把「暂时不用」的工作区或会话从列表里挪开,需要时再拖回或一键还原,且不触碰底层数据。若你正在整理 DSH 桌面侧栏,可以从目录页或 GitHub 仓库查看说明与源码:

  • 目录页:https://www.skillhub.cn/plugins/JHyugou/dsh-tidy
  • GitHub:https://github.com/JHyugou/dsh-tidy
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye