dsh-hide-workspace

DSH PLUGIN会话与消息

仓库 roekdnd/dsh-hide-workspace

会话与消息 L5 · 运行验证通过 安全审查:低风险 可信度:金 可安装插件
安装这个插件

dsh-hide-workspace 是 roekdnd 维护的 会话与消息 类 DSH 可安装插件, 仓库为 roekdnd/dsh-hide-workspace,许可证 MIT。 下面按「装什么、怎么装、验没验过、跑起来要注意什么」逐项列出。

一句话选型结论

按资料字段整理

dsh-hide-workspace 是会话与消息类的 DSH 可安装插件,验证等级 L5 · 运行验证通过,安全审查为低风险,有可直接复制的安装命令。验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么;涉及密钥或系统权限的,建议先在隔离环境试装。

分类会话与消息 收录类型可安装插件 验证等级L5 · 运行验证通过 安全审查低风险
验证等级 L5 L5 · 运行验证通过
GitHub 星标 0 复刻 0 · 未关闭 issue 0
最近更新 2026-10-28 创建于 2026-10-28
README 10.0 KB 正文体量,越大说明说明书写得越细

安装

可安装插件
在 DSH 里执行,装完用 dsh plugin list 确认已挂上;标了 L4 / L5 的命令已在沙盒里真实跑通
dsh plugin --profile web add github:roekdnd/dsh-hide-workspace
  1. 1
    确认版本与运行环境

    仓库没有标注兼容版本与 Node.js 要求,先确认你的 DSH 版本能装,再继续。

  2. 2
    执行安装命令

    在 DSH 里执行上面的命令;多包仓库要注意区分具体子包名,别装错包。

  3. 3
    确认已挂载

    用 dsh plugin list 查看列表里是否出现这个插件,出现即挂载成功。

  4. 4
    试跑并检查权限

    加载后跑一个最小用例,确认它能正常工作;同时看它申请了哪些文件、命令或网络权限。

兼容 DSH 版本未标注版本不匹配时安装会报错
Node.js 要求未标注来自仓库 package.json 的 engines 字段
前置依赖无需要同时安装的同级依赖
npm 包名未发布到 npm可用 npm view 查看包信息

能做什么

会话与消息
字段来自项目仓库与公开索引,中文说明由本站标注

适用场景

文件读写

上游标签

deepseek-harnessdshdsh-pluginhide-workspacesidebarworkspace

验证等级与安全审查

L5 · 运行验证通过
自动化流程结论,不是人工审核
验证等级L5 · 运行验证通过在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来
安全审查低风险静态分析结论,未标注不代表已通过审查
仓库健康度活跃按仓库活跃度与最近更新时间给出
可信度金综合仓库活跃度与验证结果

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 验证等级 L5:安装和运行都在沙盒里跑通过,装完能直接用的概率高。
  • 静态安全审查为低风险,没有发现明显可疑行为。
  • 有可直接复制的安装命令,不用自己翻文档找入口。

先想清楚的地方

  • 没有声明 Node.js 版本要求,版本不匹配可能装不上。
  • 验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么。

更适合

  • 需要在会话与消息场景里给 DSH 补能力的人。
  • 想装完就能用、不想自己排依赖的人。
  • 能接受在本地装依赖、愿意自己确认权限的人。

不太适合

  • 只使用 DSH 官方内置能力、不接受第三方插件的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
插件验证等级安全审查星标兼容版本安装命令
dsh-hide-workspace当前 L5 · 运行验证通过 低风险 0 未标注 有
dsh-desktop L3 · 安装规范通过 低风险 3.0 万 未标注 无
openpets L4 · 沙盒安装通过 低风险 1,274 未标注 有
deeptide L4 · 沙盒安装通过 低风险 1,104 0.1.1-rc.2 有
jingyun-dsh L3 · 安装规范通过 低风险 1,004 未标注 有
study-mate 未做沙盒验证 未标注 856 未标注 无

仓库档案

会话与消息
字段来自项目仓库与公开索引,中文说明由本站标注
作者 / 维护方roekdnd仓库 dsh-hide-workspace · 默认分支 main
分类会话与消息desktop
收录类型可安装插件声明了 dsh.bundle、可用 dsh plugin add 安装的条目
开发语言未标注仓库主语言
许可证MIT商用或二次分发前请确认条款原文
星标 / 复刻 / issue0 / 0 / 0收录时的数值,非实时
创建 / 更新2026-10-28 · 2026-10-28最后推送 2026-10-28
本站收录2026-10-30首次进入本站目录的时间

README 全文

10.0 KB
作者原文,中文版优先;只做安全转义,不改内容

dsh-hide-workspace — 隐藏工作区

语言:中文 | English

把暂时不需要的工作区从左侧栏收起来,随时恢复。不删除任何东西。


一、它做了什么

入口 行为
工作区行 ⋯ 菜单 → 隐藏工作区 整组(含子工作区与其会话)从侧栏消失
已隐藏的工作区 ⋯ 菜单 → 取消隐藏 放回来(该项文案自动切换)
视图选项 → 筛选工作区(三态) 隐藏已隐藏 / 显示全部 / 仅显示已隐藏
Ctrl + H 无隐藏项 → 隐藏当前会话所在工作区;有隐藏项 → 恢复全部
隐藏后的 toast → 撤销 立即救回

被隐藏的工作区仍然可以被搜索到(搜索行不受影响),这是刻意保留的应急通道。


二、安装

本插件是一个 bundle,自带有 cordis.patch.yml 和 dsh.bundle.patch 声明,
所以它能出现在「设置 → 插件」面板里(有卡片、开关、卸载)。

方式一:从 GitHub 安装(推荐)

dsh plugin --profile desktop add github:roekdnd/dsh-hide-workspace

安装后重启 DSH。

方式二:从本地检出安装

dsh plugin --profile desktop add <本仓库的绝对路径>

安装后重启 DSH(新包首次可解析需要重启)。

改动 client.js 后刷新页面即可,源码无需构建——client.js 本身就是最终产物。

为什么不建议手改 profile

手改 ~/.dsh/profiles/desktop/cordis.patch.yml + pnpm add link: 也能装,但有三个坑:

  • 要走 pnpm add link:,别手写 node_modules 里的链接。
    实测 junction(mklink /J)在 Node 里同样满足 isSymbolicLink() === true,
    能正常工作;但让包管理器来建链接更稳妥,它同时会写进 lockfile。
  • 走手改路线时插件不会出现在插件面板里(面板只管理 bundle)
  • 官方明确说不要手写 profile 的 package.json / cordis.patch.yml,也不要自己跑 pnpm

三、数据存在哪

%USERPROFILE%\.dsh\... (不涉及)
浏览器 localStorage:
dsh.hide-workspace.hidden.v1   ← 被隐藏的工作区 id 列表
dsh.hide-workspace.filter.v1   ← 筛选工作区状态

刻意不碰 workspace.json。原因:它是 dsh-workspace 独占的存储域,
且其记录是 zod strip 模式 —— 往里塞自定义字段会被静默丢弃且不报错。
用 localStorage 也符合 DSH 自身的边界:布局类偏好本来就是浏览器本地
(ui-workspace 自己的展开状态和会话排序就是存 localStorage 的)。

代价:不跨设备同步。同时在 Web 端和桌面端使用时会各有一份。


四、DSH 更新后会怎样(重要)

DSH 的界面会随版本变化。插件只依赖显式字符串锚点,不依赖任何哈希类名:

依赖对象 稳定性
data-row-key="workspace:" 高(源码里写死的字符串,不是哈希)
role="menuitem" / aria-selected 高
哈希类名(如 XXXXXX_groupSection) 完全不依赖

自愈机制

插件每 1.2 秒做一次结构体检:如果有隐藏项、但侧栏一条工作区行都渲染不出来
(连续 4 次),就判定侧栏结构已变,此时:

  1. 自动清空隐藏列表 → 全部恢复显示(绝不让东西藏没了找不回来)
  2. 弹出提示:「侧栏结构已变化,「隐藏工作区」暂不可用,已恢复全部显示。」

也就是最坏结果是功能失效 + 用户能看见原因,而不是工作区凭空消失。

如果自愈提示出现了

这条警告意味着侧栏 DOM 变了,选择器需要重新校准。
请带着提示内容开一个 issue,
并附上 DSH 版本号。最可能需要调整的是:

  • 工作区行是否还是 data-row-key="workspace:"
  • 会话行是否还是 aria-selected="true"
  • ⋯ 菜单是否还是 role="menu" + role="menuitem"

五、已知限制

  1. 没有独立管理面板。取消隐藏只能靠 ⋯ 菜单、Ctrl+H 或视图选项。
  2. 不能右键工作区行。DSH 没有工作区级菜单槽,右键菜单也没有注入点。
  3. 隐藏模式下拖拽排序会不准。被隐藏的组仍参与拖拽落点计算,
    对着看不见的兄弟节点拖会提交一个看不见的换序。隐藏期间请避免拖动排序。
  4. 搜索仍能搜到已隐藏的工作区(这是刻意的逃生通道)。
  5. 「仅显示已归档」+「仅显示已隐藏」可能全空。
    DSH 在"仅显示已归档"下会把没有归档会话的工作区整个不渲染,
    此时列表可能为空 → 会显示「当前筛选下没有工作区」+【显示全部工作区】按钮。
  6. 树形模式:隐藏父工作区会连子工作区一起隐藏(子行渲染在父块内部)。
  7. localStorage 被清空(清除站点数据)后,隐藏列表会丢失,全部工作区重新显示。

六、自测

cd dsh-hide-workspace
node test/check-logic.mjs

47 项断言,零依赖(不需要 jsdom / Chrome),跑一次不到 1 秒:

  • blockOf / selectedWorkspaceId 在真实同构节点树上解析正确(含有会话的工作区、
    空工作区、多工作区并列、会话归属)
  • 防循环结构检查:每帧执行的写入必须"值变了才写"、勾选靠状态属性切换、
    构建行必须由数量不符触发(因此不会每帧跑)

当前结果 47 passed, 0 failed。

完整缺陷清单与故障场景见 AUDIT.md。

实现上已修正的几个坑(都是实测发现的)

问题 原因 现在的做法
工作区行找不到 文件夹行被 HoverCard 包了一层,会话行是它的兄弟而非子节点 从会话行向上找“只含一个工作区行”的祖先
空工作区藏不掉 旧逻辑靠“有没有会话行”识别块边界 改为判断“是否含其它工作区行”,与会话无关
菜单项带边框、样式不一致 手搓 `` 无法复现官方样式 克隆官方「重命名」整行(普通行,天然无红色)
菜单项是红色 克隆了「删除工作区」,它带 _danger_ 类;按名字删类顶不住版本变化 改为克隆「重命名」行,并额外移除任何含 danger 的类
菜单文本匹配失效 只读了第一个 ``,那是空的图标位 读整行 textContent
「隐藏工作区」显示成原始 key 从没注册 locale 字典 内联中英文字典并 ctx.locale.register()
隐藏完全没生效 用 requestAnimationFrame 刷新,窗口不可见时不触发,标志位永久卡死 改用微任务调度
点「视图选项」整个界面卡死 MutationObserver 监听整个 body,而每次渲染都写 DOM,写 → 观察 → 再写,无限循环 三重防护:①渲染期间加的 DOM 变更被忽略 ②所有写入改为"值变了才写" ③只监听节点增删,不监听属性/文本
筛选选项排成一行、带原生边框 直接 createElement('button'),没套用菜单行的结构 改为克隆官方筛选行(分隔线、小标题、行本身都克隆)
选中项用 ✓ 字符,宽度会跳 官方是在末尾放独立图标位 复用官方的勾选元素,靠状态属性切换

七、为什么在 DOM 层做,而不是数据层

DSH 没有提供工作区级的扩展点,这一节记录实测结论(详见 docs/research/)。

没有可用的 slot

sidebar.workspaces 只声明了 Session 级的子 slot:

sidebar.workspaces
sidebar.workspaces.directoryFlow
sidebar.workspaces.session.menu.item      ← Session
sidebar.workspaces.session.row.action     ← Session

工作区行的 ⋯ 菜单和「视图选项」菜单都是硬编码的闭合数组,没有任何注入点。
本插件的两个入口因此是 DOM 注入的。

不能在数据层过滤

groupByWorkspace() 用传入的 workspaces 数组构建 accounted 集合,
再把没归属的会话收进「未分组」。所以从一个工作区从列表里摘掉,它的会话会掉进「未分组」,
变成一堆无主条目。

尝试过但不可行

方案 结果
用 priority: -100 覆盖 sidebar.workspaces 会抛 slot "" is already declared。省略 5 个子 slot 又会连带干掉会话菜单、悬停按钮和「添加工作区」流程。真要这么做等于 fork 约 4100 行
provideRoot({hooks:{workspaces}}) 抛 duplicate root standard hook,workspaces 是 Cordis Service,重复注册直接报错
往 workspace.json 塞自定义字段 该记录是 zod strip 模式,多余字段静默丢弃且不报错(tools/scratch/zod-strip-proof.mjs 可复现)

存储位置

隐藏集合是设备本地的视图偏好,存在 localStorage,
和 ui-workspace 自己持久化展开状态、会话排序的做法一致。

> 从旧版 dsh-better-sidebar 升级时,旧的 dsh.better-sidebar.* 键会被自动迁移一次,
> 已隐藏的工作区不会丢失。


八、文件结构

dsh-hide-workspace/
├─ package.json          dsh.bundle.patch + dsh.client 声明
├─ cordis.patch.yml      bundle 自带的挂载行
├─ index.js              host 半边(纯 UI 插件,故意为空)
├─ client.js             ← 全部逻辑
├─ icon.svg
├─ locale/{zh,en}.json   面板卡片文案
├─ test/check-logic.mjs  自测(不随包发布)
├─ docs/                 ← 调研与设计记录
│   ├─ research/         DSH 源码分析:打包、过滤可行性、持久化
│   └─ design/           方案讨论
└─ tools/                重新解包 DSH 的脚本(asar 本身不入库)

package.json 的 files 只发布运行所需的 6 个路径

index.js、client.js、cordis.patch.yml、locale/*.json、icon.svg。
docs/、tools/、test/ 留在仓库里供阅读,不会进入安装包。


九、License

MIT

常见问题

6 问
答案由本站依据条目字段整理,不引用上游原文
dsh-hide-workspace 怎么安装?

在 DSH 里执行 `dsh plugin --profile web add github:roekdnd/dsh-hide-workspace` 即可。

dsh-hide-workspace 的验证等级是什么意思?

L5 · 运行验证通过。在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来

dsh-hide-workspace 安全吗?

低风险。

dsh-hide-workspace 装之前要先确认什么?

先看它会读写哪些文件、执行哪些命令、连接哪些网络地址;验证等级只说明装得上、跑得起来,不等于安全。涉及密钥或系统权限的,建议先在隔离环境试装。

dsh-hide-workspace 用的是什么许可证?

上游标注为 MIT。商用或二次分发前请到仓库确认许可证原文。

这条记录的数据可靠吗?

本站按仓库名去重后合并整理,字段以作者仓库与 npm 元数据为准;安装命令、仓库地址与 README 保持原文,带 L4 / L5 标记的安装命令已在隔离沙盒里真实跑通。

会话与消息
按星标排序,可作替代方案

dsh-desktop

dsh-desktop

为 DeepSeek Harness (DSH) 插件生态打造的现代化桌面端解决方案。万物皆「插件」,桌面本身也是「插件」。

L3 · 安装规范通过 3.0 万 星

openpets

openpets

L4 · 沙盒安装通过 1,274 星

deeptide

deeptide

L4 · 沙盒安装通过 1,104 星

jingyun-dsh

jingyun-dsh

井云 DSH 客户端插件,为 DeepSeek Harness 注入会员登录、订阅支付、算力管控与应用市场,让智能体和技能快速变成可交易商品

L3 · 安装规范通过 1,004 星

study-mate

study-mate

StudyMate 是 DSH 的「学习模式」预设与技能包,为数学、计算机科目定制学习路线、讲解课件与练习评估,跨科目共享记忆。

未标注验证等级 856 星

插件的元信息来自作者仓库;分类、验证等级与安全结论的中文说明为中文整理,最近核验 —。