@lsdt45-dal/dsh-workspace-plus
Hierarchical workspace tree plus browser-style session tabs for the DSH sidebar: a "/" in a workspace or session title creates a virtual folder, with sections, pinning, time buckets, drag ordering, unified 6px status dots, per-row appearance customization (colour, glow, weight, icon) and a floating
Install
dsh plugin --profile web add @lsdt45-dal/dsh-workspace-plus
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
<div align="center">
dsh-workspace-plus
给 DSH 的侧边栏装上「文件夹系统」与浏览器式会话标签页,外加统一状态点与插件配置页





[简体中文](README.md) · [English](README_EN.md)
</div>
DSH 插件:给 DeepSeek Harness (DSH) 的侧边栏「工作区」列表装上一套文件夹系统——工作区还是那个工作区(一个目录),但标题里的 / 就是层级,让「网页前端」「网页后端」这类工作区归到同一个 web 分组下;再叠加浏览器风格的会话标签页、统一状态点与插件配置页。
- 🗂️ 层级树 —— 工作区 / 会话标题里的
/即分组,任意多级;另含分区、置顶、时间分桶与拖拽排序 - 📑 会话标签页 —— 点击会话即开新标签(Shift+点击改为替换当前标签,可在设置里把两种手势对调)、行末
+一键新会话、未发送的新会话标签切走也不关、右键复用会话菜单、拖拽实时排序;标签过多时先压缩、再滚动,并以「全部标签页」列表兜底;顺序随重启恢复,最多 12 个 - 🌿 气泡详情 —— 悬浮会话行或标签页弹出的气泡里带上「项目 · 当前 git 分支 · 时间」,气泡取不到分支时自动省略该段
- 🔍 全文检索 —— 窗口正中的浮层搜索:标题即时匹配 + 会话正文检索(插件自带容错索引,坏日志逐条跳过);「内容」开关、⌃1–9 直达。首次内容检索会在后台建索引,需几十秒,期间标题检索照常可用
- 🔴 状态点 —— 每行统一 6px:运行橙呼吸 / 待交互琥珀 / 完成绿,标签条同步显示
- 🎛️ 插件配置页 —— 「展示会话标签页」「启用圆点状态」等开关,关掉即还原宿主原生顶栏与状态灯
- 📦 装上就能用 —— 预构建产物随仓库与 Release 提供,从 git 安装无需构建
更新提示:dsh plugin --profile desktop update @lsdt45-dal/dsh-workspace-plus(Web 端把desktop换成web),更新后重启 DSH 生效;标签页与状态点都可在「设置 → 插件 → 更好的工作区」里逐项开关。
Fork of KannaKuron/dsh-better-workspace
目录:[功能与效果](#功能与效果) · [安装](#安装) · [工作原理](#工作原理) · [开发](#开发) · 更新日志 · [License](#license)
<details>
<summary><b>功能小节索引</b></summary>
- [层级树](#层级树)
- [添加工作区:点选分区与分组](#添加工作区点选分区与分组)
- [分组增删](#分组增删)
- [会话标签页](#会话标签页)
- [搜索](#搜索)
- [工作区与会话分区](#工作区与会话分区)
- [视图配置](#视图配置)
- [插件配置页](#插件配置页)
- [会话置顶](#会话置顶)
- [状态一目了然](#状态一目了然)
- [外观自定义](#外观自定义)
- [单链折叠](#单链折叠)
- [拖拽](#拖拽)
- [右键菜单](#右键菜单)
- [不丢原生能力](#不丢原生能力)
</details>
github/ ← 虚拟分组(不是真实目录,纯命名层级) └─ dsh-plan-plus ← 工作区「github/dsh-plan-plus」 dsh-workspace-plus ← 原有的单层工作区照常工作 codeisland-ask-bridge dsh-model-config
功能与效果
层级树
<table>
<tr>
<td align="center" width="48%"><img src="docs/screenshots/1-workspace-tree.png" alt="工作区分层树"/></td>
<td valign="top"><b>层级树(项目视图)</b><br/>工作区名称里的 <code>/</code> 即分组:如 <code>github/dsh-plan-plus</code> 自动归入 <code>github</code> 虚拟分组,支持任意多级;单层工作区(如 <code>dsh-workspace-plus</code>)照常显示在根层。重命名工作区后树<b>即时重排</b>——分组只是名字的投影,没有第二份需要同步的数据。</td>
</tr>
</table>
添加工作区:点选分区与分组
点「添加工作区」并选完文件夹后,弹出一个小对话框,两个目标字段都可直接点选,不再是只能打字的原生 datalist:
- 所属分区:点开就是分区列表,单击即选中(含「不分区(项目)」);也可以就地「新建分区…」输入名称,回车或「确定」后随工作区一起创建——取消弹窗不会留下空分区。
- 所属分组:自由输入名称路径(如
web),下拉里列出已有层级并可单击选中,也支持「新建分组「…」」与「不嵌套(根级)」。
两处控件外形一致(方框右内侧同一个箭头),下拉都是浮层:展开/收起时弹窗高度不变,也不会被弹窗圆角裁切;最后一个「所属分组」的下拉在空间不足时自动向上展开,因此底部按钮始终可见。列表展开时按 Esc 只收起列表,不会关闭整个弹窗;支持单击选择与 ↑/↓/Home/End 走查。对话框底部实时预览最终标题(如 web/frontend/新项目)以及是否并入某个分区。确认后插件创建工作区、写入分组前缀并使它立即出现在所选分区下。对话空态页的「添加工作区」走的也是这条交互。
远程 / 无桌面宿主:DSH 可能只提供 browse(应用内目录浏览)而不是 OS 原生选择器。此时「添加工作区」会自动切到插件内置的目录浏览器:逐级进入文件夹、显示隐藏文件夹、就地新建文件夹,点「选择此文件夹」后再进入分区/分组弹窗。原生选择器可用时仍优先用它,行为不变。
分组增删
右键任意分组行即可:新增子分组(路径自动带上父分组前缀)、新增子工作区(选完目录后所属分组输入框自动预填)、重命名分组、删除空分组;标题栏不放独立按钮。空分组持久保存在浏览器本地;一旦有工作区落进去,分组就由名称自然派生。
会话标签页
<p align="center"><img src="docs/screenshots/4-session-tabs.png" alt="对话顶栏的会话标签页:状态点、标题、关闭按钮,当前标签带品牌色下划线" width="720"/></p>
打开的会话一个占一个标签,排在对话顶栏、视图切换行上方:每个标签自带状态点、标题和关闭按钮,当前标签用品牌色下划线 + 加粗标题强调。行末还有一个 + 用于新建会话。
- 打开方式:点击左侧会话 = 在新标签页打开(不会顶掉正在看的页面);Shift + 点击 = 替换当前标签里的会话。两者可在「设置 → 插件 → 更好的工作区 → 点击会话即在新标签页打开」里对调:关掉开关后普通点击恢复「替换当前标签」,Shift+点击则改开新标签。新建会话(标签条行末的
+、工作区行的+按钮、快捷键,或任何宿主入口)自动开一个新标签——标签条上的+调用的就是宿主自己的「新会话」入口,工作区由宿主按「当前工作区 → 最近工作区」挑,和快捷键完全一致——未发消息时标签显示「新会话」,发出第一条消息后变成正式标题。未发送的新会话标签不会因为你切到别的会话而被关掉——它留在原处,点回来即可继续输入。标签槽位于顶栏左侧的公开插槽;标签条宽度按顶栏实际可用空间测量(52vw 只是首次测量前的兜底),不会挤占右上角的宿主控件。 - 悬停看详情:鼠标停在标签上会弹出一个气泡(位置在标签下方),显示完整标题和「所属项目 · 当前 git 分支 · 更新时间」,和左侧会话行悬停时的气泡同一套样式,长标题被截断也能看全。分支名取该标签所属项目目录(会话的
cwd)当前检出的分支;目录不是 git 仓库、detached HEAD 或取不到时,自动省略这一段,其余内容照旧。 - 标签宽度自适应:每个标签按自己的标题自适应宽度(短标题短、长标题长,上限 200px,下限 72px),不再被拉伸成等宽;标签条整体以「右侧操作区之前 12px」为上限,标题长、标签多时先压缩到下限再横向滚动,始终不会挤压右上角的宿主控件。
- 标签过多时(溢出处理):标签先按浏览器习惯自动压缩到可读宽度;仍放不下时标签条变成可横向滚动——滚轮/触控板横滑直接滚动标签条,两端出现渐隐提示还有标签,末尾出现 ▾「全部标签页」 按钮。点开即列出全部标签(含被滚出可见区的):状态点、当前项勾选、悬停逐个关闭,右键仍是同一套会话菜单;↑/↓ + Enter 键盘切换,Esc 关闭。切换标签(含从列表里选择)时当前标签会自动滚回可见,不会再出现「最后一个标签被切掉、又翻不到」的情况。
- 右键菜单:在标签上右键,弹出与左侧会话行完全相同的菜单(重命名 / 归档 / 分区 / 置顶 / 分支 / 删除 / 自定义外观 / 刷新…,内容见下文「右键菜单」),因为它复用同一套菜单状态,不是另做一份。
- 拖拽排序:按住标签左右拖动即可实时换位(HTML5 拖拽;拖动中的标签半透明,其余标签即时让位,松手即落位)。
- 持久化与上限:标签顺序与打开的标签列表保存在当前浏览器(
dsh.betterWorkspace.tabs.v1),刷新/重启后恢复;最多 12 个,超出时最旧的标签自动退出。 - 关闭与清理:关闭当前标签时相邻标签接管;已归档会话的标签会自动移除。新建但还没发送的「新会话」标签会保留(切到别的会话也不会被自动关掉),只有手动关闭它才消失——切走时目标会话按「开新标签」处理,不会占用刚保留的那个标签位。
- 可以整体关掉:插件配置页的「展示会话标签页」关掉后,标签条消失、顶栏完全还原为宿主原生布局;重新打开即恢复原来的标签列表。
<table>
<tr>
<td align="center" width="52%"><img src="docs/screenshots/16-tab-overflow.png" alt="标签溢出时的「全部标签页」面板:状态点、当前项勾选、逐个关闭"/></td>
<td valign="top" width="48%"><b>标签放不下时:先压缩、再滚动、最后列全</b><br/>标签按浏览器习惯先压缩到可读宽度;仍放不下就变成可横向滚动(滚轮/触控板横滑),两端渐隐提示还有内容。末尾的 ▾ 按钮列出<b>全部</b>标签——包括被滚出可见区的:每行带状态点与所属项目,当前标签打勾,右侧可逐个关闭,右键仍是同一套会话菜单;↑/↓ + Enter 键盘切换,Esc 关闭。</td>
</tr>
</table>
搜索
点击侧栏标题栏的搜索按钮(或折叠栏的放大镜)打开一个窗口正中的浮层搜索面板,样式对齐 Codex App:
<table>
<tr>
<td align="center" width="100%"><img src="docs/screenshots/14-search.png" alt="窗口正中的浮层搜索面板:标题与内容命中、⌃1–9 序号、内容开关"/></td>
</tr>
</table>
- 标题匹配(即时):输入即在前端过滤会话标题与工作区名,命中的会话排在最前;
- 内容匹配(插件自带索引):防抖后检索历史消息正文,只在消息里命中的会话补进结果,第二行显示命中片段;
- 内容开关:输入框右侧的「内容」开关控制是否检索会话内容;关闭后只做标题匹配、不再发起检索。状态保存在当前浏览器;
- **键盘操
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::4,最后更新 2026-11-06