dsh-workspace-organizer
DSH(DeepSeek Harness)Web 端会话整理插件:标签分类 · 归档 / 恢复 · 已归档浏览。 Organize your DSH Web sessions: tag-based grouping, archive & restore, and an archived-session browser.
DSH 自带的工作区视图只能按「目录」分组、组内只能排序,会话一多就堆在一起。 本插件为会话区补上一层自定义分类维度和归档管理面板,并且归档状态与 DSH 原生的 归档体系完全同源——操作后侧边栏会实时联动,没有 hack。
功能
- 悬浮按钮:菱形图标,自动吸附在侧边栏底部「设置」区旁边(侧边栏伸缩 / 窗口变化自动跟随)。
- 整理面板:
- 按标签分组展示全部会话,未分类会话单列一组;
- 底部独立「已归档」区,集中查看历史归档;
- 顶部筛选 chips:
全部/未分类/已归档/ 各标签。
- 每个会话行:
标签:增删标签,每会话最多 8 个,可用按钮一键复用已有标签;归档:立即从原生侧边栏列表隐藏(不删除数据);恢复:把已归档会话一键放回侧边栏原位置。
- 实时联动:归档 / 恢复直接走 DSH 内置的
workspaceRegistry,原生侧边栏同步更新。 - 主题自适应:面板与图标使用 DSH 主题变量(
--dsw-*),明 / 暗主题下都协调。
安装
方式一:npm(已发布后最省事)
dsh plugin --profile web add dsh-workspace-organizer
方式二:直接从 GitHub 安装(无需等待 npm 发布)
dsh plugin --profile web add github:Wang993/DSH_OrganizeFilesInTheSameWorkspace
方式三:本地 clone + link(开发用)
git clone git@github.com:Wang993/DSH_OrganizeFilesInTheSameWorkspace.git
dsh plugin --profile web add link:<克隆下来的目录绝对路径>
方式四:手动编辑 profile
编辑 $DSH_HOME/profiles/web/package.json:
{
"dsh": { "profile": { "bundles": ["...", "dsh-workspace-organizer"] } },
"dependencies": { "dsh-workspace-organizer": "link:./dsh-workspace-organizer" }
}
把插件目录放到 $DSH_HOME/profiles/web/dsh-workspace-organizer,然后在该目录执行 pnpm install。
四种方式安装后都需要重启 dsh web 并刷新页面,即可看到菱形按钮。
使用
- 点击侧边栏设置区右侧的菱形按钮打开「会话整理」面板。
- 点会话行的「标签」给它分类,再点顶部标签 chip 筛选。
- 点「归档」把不用的会话收起来;在「🗄 已归档」区点「恢复」可随时放回。
- 面板每 5 秒自动刷新(正在输入标签时不会打断);也可以点「刷新」手动更新。
数据位置:标签存于 $DSH_HOME/.dsh-organizer-tags.json(纯 JSON,可备份、可手工编辑、可纳入版本管理)。
实现原理
| 部分 | 说明 |
|---|---|
宿主插件 lib/index.js |
注入 webServer / workspaceRegistry / sessionQuery,注册 /dsh-organizer/* 路由,并用 ctx.webServer.tapIndex() 向页面注入客户端脚本 |
客户端 lib/organizer.js |
纯 DOM(无框架、无构建),负责按钮吸附、面板渲染、交互 |
| 会话列表 | ctx.sessionQuery.listSessions() 取全部会话,readTitleSnapshots() 折叠日志标题 |
| 归档 | ctx.workspaceRegistry.archiveSession(id)(官方接口) |
| 恢复 | 读写内置 archivedSessionIds 状态集(官方未暴露反归档 RPC) |
| 按钮吸附 | 读取侧边栏设置区元素的屏幕位置,MutationObserver + resize + 定时兜底三层跟踪 |
无构建步骤:没有打包器、没有依赖,插件就是几个 ESM / 浏览器脚本文件。
已知限制
- 需要一个包含
dsh-base+dsh-web-app的 Web profile(DSH 默认的web模板即是)。 - 会话的工作区归属仍由工作目录决定(DSH 架构限制),本插件不改变归属,只额外提供标签维度与归档管理。
- 按钮吸附依赖 DSH 侧边栏的哈希类名
.hHd-Xa_settingsArea。DSH 升级若改掉该类名,按钮会自动回退到左下角固定位置,功能不受影响。 - 归档沿用 DSH 的全局归档集合:归档只隐藏、不删除,会话日志仍在
$DSH_HOME/sessions下。
开发
node --check lib/index.js # 宿主插件语法校验
node --check lib/organizer.js # 客户端脚本语法校验
- 改
lib/organizer.js:刷新页面即生效(脚本每次请求都从磁盘实时读取,无需重启)。 - 改
lib/index.js:需要重启dsh web(宿主插件只在启动时加载)。
发布(Release)
本仓库自带 .github/workflows/publish.yml:推送 v* 标签即自动发布到 npm。
改
package.json的version(例如1.0.1);commit 并 push 到
main;打标签并推送(标签必须与版本号一致,workflow 会强校验):
git tag v1.0.1 git push origin v1.0.1GitHub Actions 会依次执行:语法闸门 → 标签/版本一致性校验 → 同版本重复发布检测 →
npm publish。
认证:Trusted Publishing (OIDC),无需任何密钥
本包已在 npm 侧配置 Trusted Publisher(包页面 → Settings → Publishing access → Trusted Publisher):
| 字段 | 值 |
|---|---|
| Provider | GitHub Actions |
| Organization or user | Wang993 |
| Repository | DSH_OrganizeFilesInTheSameWorkspace |
| Workflow filename | publish.yml |
| Environment name | (留空) |
workflow 在有 id-token: write 且未设置 NPM_TOKEN 时自动走 OIDC,因此 CI 里不需要任何长期密钥。
从公开仓库经 OIDC 发布时,npm 还会自动生成 provenance 证明(无需 --provenance 参数)。
⚠️ 已知坑:bypass-2FA token 不能直接发布
npm 自 2026-07-31 起收紧了两类凭据,配置时务必避开:
- 勾选了 “Bypass 2FA” 的 Granular Access Token:只能发到暂存区(staging),直接
npm publish会报E403 ... E_STAGE_REQUIRED;CI 里用它会失败。 - 对新包而言,暂存流程还要求包已存在,所以新包的首次发布必须用「可直达」的方式 bootstrap 一次:
本地
npm login --registry https://registry.npmjs.org后发布,或走npm stage publish+npm stage approve(后者需要维护者用 2FA 审批)。 - 首次发布成功后,后续版本全部交给 OIDC 即可;仓库里不要再配
NPM_TOKEN, 否则 workflow 会退回 token 路径从而继续撞上E_STAGE_REQUIRED。
据此,本仓库的推荐配置是:只保留 Trusted Publisher + 在包设置里勾选 “Require two-factor authentication and disallow tokens”,不需要任何 token secret。
卸载
- 从
profiles/web/package.json的dsh.profile.bundles与dependencies移除本包; - 在该目录执行
pnpm install; - 重启
dsh web; - (可选)删除
$DSH_HOME/.dsh-organizer-tags.json。
License
MIT
No comments yet. Be the first to write one.