前言¶
在 DeepSeek Harness(DSH)里长期开多个工作区和会话时,侧边栏会越来越长:有些目录只是偶尔才打开,有些对话已经结束但你还想保留记录,它们却每天都占着列表位置。删文件夹或清会话能腾地方,但往往不是你想要的——你只是希望界面先清爽一点。
下面介绍的 dsh-tidy(维护者 JHyugou)是社区目录里的客户端类插件:在侧边栏「插件」行与「工作区」分区之间增加一块可折叠的收纳区,用拖放把暂时不用的工作区(含其下全部会话)或单个会话收进去,需要时再还原。收纳只影响侧边栏显示,不改工作区目录、会话数据或宿主存储。
这是什么¶
dsh-tidy 的定位可以概括为:给 DSH 侧边栏加一个 stash 收纳区(Sidebar stash area for DeepSeek Harness)。
- 仓库:github.com/JHyugou/dsh-tidy
- 社区目录页:skillhub.cn/plugins/JHyugou/dsh-tidy
- 当前包版本(
package.json):0.2.0,许可证 MIT - 结构:宿主端 Cordis 插件 + 浏览器端 bundle,零 npm 依赖、零构建
收纳清单写在浏览器 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 挂载:
- 在
shell.overlay注册不产生可见 DOM 的 headless 组件,以使用useWorkspaces等钩子; - 用 React portal 把收纳区挂到
[role="tree"]上溯至「工作区」标题容器之前的精确位置; - 用 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 进程权限下运行。
典型用法¶
经过上面的安装与刷新,按下面顺序即可自测:
- 在侧边栏找到「插件」行下方的收纳区(空态为一行)。
- 将暂时不用的工作区标题行拖入收纳区,确认其下会话一并从列表消失。
- 或将某条会话行单独拖入,确认仅该行隐藏。
- 需要时点击 「还原」 或拖回工作区列表;也可点 「全部还原」。
- 若工作区已在磁盘删除,在收纳区用 「移除记录」 清理无效项。
排障时可在 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