Skip to content
dsh.fish
Bundle

dsh-workspace-tree

DSH 工作区树:把左侧栏工作区重做为文件系统树双模式——文件夹模式按真实目录层级浏览并新建(会话 cwd = 目录,环境隔离),工作区模式只管工作区与会话;工作区=目录强绑定,含拖拽排序、状态向上透传、会话/文件夹搜索过滤与配置面板。

Source
liceses
stars
7 stars
License
MIT
Updated
Updated 12 hours ago

Readme

# dsh-workspace-tree · 工作区树(v4)

把 DSH Web 左侧栏的「工作区」重做为**文件系统树双模式**。核心原则:
**工作区 = 目录强绑定**——会话的 cwd 就是它所在的目录,环境真正隔离。

![工作区树总览](docs/screenshots/overview.png)

> 工作区模式:工作区按目录层级嵌套(子文件夹直接显示在父工作区下),
> 会话挂各自工作区,行尾为最近活动时间。

## 双模式(标题栏切换,选择自动记忆)

| 模式 | 显示 | 用途 |
| --- | --- | --- |
| **文件夹模式** | 完整文件系统目录树(含非工作区的中间目录),工作区节点带会话计数标记 | 浏览目录结构;hover 任意目录可「新建会话」(会话 cwd = 该目录,自动注册工作区)或「添加为工作区」;点击工作区节点 = 纯导航到工作区模式并定位 |
| **工作区模式** | 只显示工作区节点(隐藏中间目录),按目录相对层级嵌套,会话挂各自工作区下 | 管理会话:打开 / 重命名 / 分叉 / 归档;工作区重命名 / 删除 |

## v4 新增:搜索过滤

模式切换按钮与「新建会话」之间新增简约搜索框(🔍 图标,输入即过滤,
`Esc` / ✕ 清空):

- **匹配范围**:会话标题 或 文件夹/工作区名,不区分大小写子串
- **工作区模式**:隐藏不匹配的会话与整组;命中组强制展开(临时),清空后
  还原手动折叠状态
- **文件夹模式**:目录按「名字或后代会话是否有匹配」剪枝并强制展开命中
  分支;命中的工作区节点下**内联列出要展示的会话**(名字命中 → 该工作区
  全部可见会话,否则仅标题命中的会话),可直接点击打开
- 无任何命中时显示「无匹配会话」空态

## 为什么重写(v2 → v3)

v2 的自定义逻辑文件夹(不改变会话 cwd)造成了**环境不隔离**:文件夹只是 UI 归类,
会话里的文件操作仍落在工作区根目录。v3 彻底移除逻辑文件夹模型,树完全由
`workspaces[].path` 的文件系统层级推导,**在目录下新建的会话其 cwd 就是该目录**。

## 架构

| 半区 | 文件 | 职责 |
| --- | --- | --- |
| Host | `lib/index.js` | 仅保留只读调试路由 `/api/dsh-workspace-tree/debug`(工作区注册表投影),零持久化 |
| Client | `lib/client.js` | 树浏览器:双模式渲染、目录树推导(`buildDirTree` / `buildWorkspaceForest`)、导航联动、隔离会话创建(`sessions.create({cwd})`) |

数据源全部来自标准 props(`useWorkspaces` / `useSessions`),无额外状态。

## 交互细节

- **文件夹模式**:目录节点点击 = 展开/折叠(chevron 单独点击也可);工作区节点点击 = 切到工作区模式 + 展开该组 + 滚动定位(纯导航,不打断当前会话);hover 操作:工作区节点「+新建会话 / ✎重命名 / 🗑删除」,普通目录「+新建会话(自动注册)/ +添加为工作区」
- **工作区模式**:组头「+新建会话 / ✎重命名 / 🗑删除」;会话行保留官方「完成未读」绿色提醒点、运行矩阵动画、等待交互琥珀点
- 展开状态、模式选择均 localStorage 记忆

## 安装

```bash
cd dsh-workspace-tree
dsh plugin add .          # 或按部署方式装配 bundle
```

或通过 dsh-super-injector 运行时注入(免重启):

```text
dev_inject_plugin {"dir": "D:/developing/DSH-plugin/dsh-workspace-tree"}
```

## 兼容性

- 路由前缀、patch 行 id(`dsh-workspace-tree`)唯一;不声明 children slot(避免与官方
  `sidebar.workspaces.directoryFlow` 冲突)
- 以 `priority: -1` 替换官方浏览器(shadowing 升序、最低渲染)
- 卸载插件后官方浏览器自动恢复,无残留数据(v3 零持久化)

Install

dsh plugin --profile web add github:liceses/dsh-workspace-tree

Profile: web

  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source