dsh-workspace-hide
在 DSH 侧边栏隐藏指定工作区,连同它名下的会话一起收进「归档」,并在 「设置 → 工作区显示」里随时恢复。
纯本地、可逆、不删数据:工作区文件夹和会话记录始终留在磁盘上。
介绍
它解决什么
DSH 内置的「删除工作区」其实也不删数据,但它的心智负担是"移出列表",恢复要重新添加文件夹。
更麻烦的是:任何只把工作区从列表里摘掉的做法,都会让它的会话掉进侧边栏的「未分组」,
变成一堆无主的条目(根因见 DESIGN.md §1.1)。
本插件同时处理这两件事:
- 侧边栏不再出现该工作区;
- 它名下的会话不会变成一堆无主的「未分组」条目,而是被归档收起来;
- 撤销隐藏时,只有"因为这次隐藏才被归档"的会话会回来。
隐藏之前就已经归档的会话,永远不会被这次隐藏/恢复碰到。
使用
- 安装后重启 DSH Desktop;
- 打开 设置,左侧栏出现「工作区显示」(排在「归档会话」之后); 导航栏容不下长标签,所以那里的名字是短的,面板内标题仍写全:「侧边栏显示的工作区」;
- 每行右侧一个开关,打开 = 在侧边栏显示,关掉 = 隐藏并归档其会话; 关掉后该行自动沉到列表底部,并显示「已归档 N 个会话」;
- 顶部显示「共 N 个 · 显示 N 个 · 隐藏 N 个」,点「全部显示」一键清空清单并批量恢复。
被隐藏的工作区不会从设置页消失——设置页读的是未过滤列表,否则就没法撤销了。 隐藏行上会显示「已归档 N 个会话」,让你知道恢复时会回来多少。
开关的默认状态是「打开」:新装插件时什么都没被隐藏,因此每一行都是显示的。 这套语义下不存在「新工作区默认消失」的坑——所有工作区默认都在侧边栏,只有你手动关掉的行才会藏起来。
卸载或清空清单之前,请先点一次「全部显示」,否则被归档的会话会留在「归档」页里。
安装
从 npm 安装(推荐)
dsh plugin add dsh-workspace-hide@0.2.0
从 GitHub 安装
dsh plugin add https://codeload.github.com/SUZUNAMI/dsh-workspace-hide/tar.gz/refs/tags/v0.2.0
dsh plugin add 本质就是在 profile 目录(~/.dsh/profiles/web)里跑一次 pnpm add,
并同时把包名写进 dependencies 与 dsh.profile.bundles 两处;dsh plugin remove
会把两处一起清掉。
各种目标形式的实测结果:
| 形式 | 命令 | 说明 |
|---|---|---|
| npm(推荐) | dsh plugin add dsh-workspace-hide@0.2.0 |
最短;只依赖 registry.npmjs.org,不碰 github.com |
| tarball | dsh plugin add https://codeload.github.com/SUZUNAMI/dsh-workspace-hide/tar.gz/refs/tags/v0.2.0 |
不经过 git,不需要 SSH 密钥,走 codeload.github.com;实测 1.6s |
git+https |
dsh plugin add git+https://github.com/SUZUNAMI/dsh-workspace-hide.git#v0.2.0 |
走 https git;需要能连上 github.com:443 |
github: |
dsh plugin add github:SUZUNAMI/dsh-workspace-hide#v0.2.0 |
⚠️ pnpm 会把它解析成 git+ssh://(见下),需要本机已配好 GitHub SSH 密钥与 known_hosts |
跟随 main |
dsh plugin add https://codeload.github.com/SUZUNAMI/dsh-workspace-hide/tar.gz/refs/heads/main |
上游随时会变,不建议 |
| 本地目录(改代码时) | dsh plugin add file:C:/path/to/dsh-workspace-hide |
⚠️ 只在安装那一刻物化一份,之后改源码不会同步(见下) |
关于
github:形式:pnpm 对它的解析目标是git+ssh://git@github.com/<owner>/<repo>.git,所以一台没配过 GitHub SSH 的机器 会直接Host key verification failed。tarball 形式没有这个问题。
关于
file:本地目录形式(改代码必读):pnpm 对file:目录依赖只在安装那一刻 把文件拷/硬链进node_modules,之后你改源码它一无所知——node_modules/dsh-workspace-hide里躺着的仍是安装时的旧快照。实测踩过一次:源码已经改到 43365 B,profile 里那份还是 42010 B 的旧文件,重启多少次界面都不变。想边改边用,就在装完之后把那份副本换成指向工作副本的目录联接(junction,不需要管理员权限):
$dst = "$env:USERPROFILE\.dsh\profiles\web\node_modules\dsh-workspace-hide" Move-Item $dst "$dst.bak" # 先备份旧副本 New-Item -ItemType Junction -Path $dst -Target "C:/path/to/dsh-workspace-hide"这样改源码后重启 DSH Desktop 即生效。注意以后跑
pnpm install或dsh plugin add/remove可能把它换回实体拷贝,那时重建一次即可。
装完重启 DSH Desktop,再打开「设置」,左侧应出现「工作区显示」。
第三方插件建议钉 tag 或 commit,不要跟随 main。
手动安装
在 ~/.dsh/profiles/web/package.json 里加两处,然后在该目录执行 pnpm install:
{
"dependencies": {
"dsh-workspace-hide": "0.2.0"
},
"dsh": {
"profile": {
"bundles": ["...", "dsh-workspace-hide"]
}
}
}
关于依赖:本插件是零依赖的
没有 npm 依赖,也没有构建步骤。 lib/client.js 是手写的
window.__ModuleLoader__ 工厂,它 require 的 react 与
@deepseek-ai/dsh-client-ui-primitives 都由 DSH 运行时注入(后者还有 try/catch
兜底,取不到就退化成内置控件)。所以这两个包不是 dependencies,也不该被写进
dependencies —— 那反而可能装进第二份 react 实例。
版本更新
0.2.0 — 设置页开关反转为「显示」语义
- 设置项改名:「隐藏的工作区」→ 面板标题「侧边栏显示的工作区」,导航栏短标签 「工作区显示」(导航栏放不下全称,会被截成「侧边栏显示的工…」);并加了一行说明。
- 开关方向反转:打开 = 显示,关掉 = 隐藏。此前是「选上 = 隐藏」,与直觉相反。
- 隐藏中的行自动沉到列表底部(稳定排序,显示中的行保持原来的相对顺序)。
- 计数下沉到计数文案里:「共 N 个 · 显示 N 个 · 隐藏 N 个」,全显示时显示 「共 N 个工作区,全部在显示中」。
- 按钮改名:「全部恢复」→「全部显示」(只在有行被隐藏时才可用)。
- 底层完全没动:存储格式仍是
dsh-workspace-hide.hidden.v2(同一份hidden清单)、归档/撤销归档范围、canRestore提示、失效项处理、跨版本迁移都不变。 反转只发生在WorkspaceRow一处(checked: hidden !== true,onChange再取反)。
0.1.3 — 发布流程与文档
插件行为无变化。这一版把发布方式换成 GitHub Actions 的 OIDC 可信发布
(.github/workflows/release.yml,仓库里不再需要任何长期 npm token),
并把 npm 安装提升为推荐方式 —— npm 只依赖 registry.npmjs.org,
不像 tarball / git 形式那样要求 github.com 可达。
0.1.2 — 首个公开发布版本
- 侧边栏隐藏工作区,其会话并入
archivedSessionIds,不再溢出到「未分组」。 - 检测到
@michengai/dsh-archive-manager时启用宿主层:真归档、可撤销; 未安装时退化为纯显示层,绝不真归档(内核没有反向操作,见DESIGN.md)。 - 设置页「隐藏的工作区」:逐项开关、
canRestore提示、失效项「移除记录」、 取消归档失败后的「重试恢复」、「全部恢复」。 - 清单持久化到
localStorage的dsh-workspace-hide.hidden.v2(含 v1 自动迁移)。 - 安装说明修正:
github:会被 pnpm 解析成git+ssh://,改用 codeload tarball。
更多文档
原理、接缝、已知边界、离线验证方法与真机源码证据:DESIGN.md。
许可
MIT
No comments yet. Be the first to write one.