luis1232023
dsh-workspace-enhance
以默认工作区浏览器为蓝本的工作区增强侧栏——每个工作区文件夹下提供 会话/文件/Git 子 Tab,含文件树与右侧预览、Git 的 Changes/Graph 双视图、搜索、视图切换与添加工作区,界面样式对齐默认插件。
- Stars
- 1
- Language
- JavaScript
- Created
- Aug 16, 2026
- Updated
- Aug 16, 2026
Introduction
dsh-workspace-enhance(dsh工作区加强)
DSH(DeepSeek Harness)Web 界面的侧栏工作区增强插件:以默认工作区浏览器为基础,把左侧栏改造成工作区文件夹列表——每个文件夹展开后有 会话 / 文件 / Git 三个子 Tab,另加右侧文件预览面板。
源码位置与结构
插件根目录:D:\luisdesk\other\dsh-workspace-enhance
dsh-workspace-enhance/
├── package.json # 插件清单:dsh.client 清单 + dsh.bundle.patch(安装入口)
├── cordis.patch.yml # bundle patch:向 profile 注入一行插件配置
├── build.mjs # 构建脚本(esbuild 原生二进制,产出 web2 ModuleLoader 格式 bundle)
├── tsconfig.json # 类型检查配置(paths 指向 profile 内的 @deepseek-ai 类型)
├── CONTRIBUTING.md # 贡献规范(贡献前检查清单 / 提交流程,请先阅读)
├── LICENSE / CODE_OF_CONDUCT.md / SECURITY.md / CHANGELOG.md
├── .github/ # PR / Issue 模板与 CI(.github/workflows/ci.yml)
├── lib/
│ ├── index.js # node 半边(宿主进程运行):RPC 通道 + fs/git/会话删除
│ └── client.js # client 半边(浏览器运行):由 src/ 构建,勿手改
├── src/ # client 半边源码(TypeScript/TSX)
│ ├── client.tsx # 入口:注册 sidebar.workspaces(priority -1) + shell.overlay
│ ├── store.ts # 共享 store(预览、删除墓碑、每文件夹子 Tab、视图模式)
│ ├── rpc.ts / contract.ts# RPC 调用封装与类型契约
│ ├── rows.tsx # 对齐内置样式的文件夹行/会话行
│ ├── highlight.ts # highlight.js 语法高亮(内联打包)
│ ├── styles.ts # 全部样式(对齐默认工作区的 --dsw-* 变量)
│ ├── tabs/ # WorkspaceRegion / WorkspaceFolderTabs / Sessions / File / Git
│ └── preview/ # 右侧文件预览面板(shell.overlay 槽位)
└── scripts/ # 测试与校验(node 半边集成测试、渲染测试、真实 store 测试)
架构:node 半边在宿主进程注册通用 RPC 通道 /dsh-workspace-enhance
(ctx.connection.rpc.handle,loopback 信任),endpoints:fs/root、fs/list、
fs/read、git/log(含 --graph)、git/show、git/status、session/delete、
debug/report。client 半边注册两个槽位:sidebar.workspaces(priority: -1
遮蔽内置浏览器)渲染文件夹/子 Tab 区域;shell.overlay(additive 列表槽)渲染
右侧文件预览面板。
功能
| 模块 | 说明 |
|---|---|
| 会话 | 每个工作区文件夹下的会话:打开 / 重命名 / 归档 / 彻底删除(host 删日志,二次确认);文件夹行:新建会话 / 重命名 / 删除工作区;顶部 +新会话 |
| 文件 | 以该文件夹为根的文件树(懒加载、dot 按钮切换显示隐藏文件),点击文件在右侧预览:文本语法高亮 / 图片 / 二进制占位 |
| Git | 顶部 Changes / Graph 双视图:Changes=工作区改动列表(点击文件可预览)、Graph=带 ASCII 分支图的提交记录(点击查看单次提交元信息/变更文件/diff);仅当目录是 git 仓库才显示该 Tab |
| 区头 | 右侧:搜索(展开式输入 + 内容搜索)、添加工作区(系统目录选择器)、视图选项(按工作区/平铺、最近更新/手动) |
| 对齐默认 | 文件夹行 34px、会话行 32px、hover 行为、运行中会话的 8 格矩阵动画点、激活下划线 -1px 的子 Tab、空闲会话灰色状态点 |
安装(DSH 插件安装说明)
前置:本机已安装 DSH(dsh 命令可用),且已存在 web profile(C:\Users\yicheng\.dsh\profiles\web)。
1. 添加插件到 profile
在插件目录的上级目录(即 D:\luisdesk\other)执行:
dsh plugin --profile web add file:./dsh-workspace-enhance
该命令会:
- 把
dsh-workspace-enhance追加到 profile 的dsh.profile.bundles; - 因插件声明了
dsh.bundle.patch,自动把一行插件配置注入配置树; - 在 profile 的 node_modules 里安装插件(pnpm
file:依赖是打包拷贝,只含files字段列出的lib/与cordis.patch.yml,见下方「开发」注意事项)。
2. 重启使生效
# 先停止当前 web 实例,再:
dsh web
重启后左侧栏即为插件界面。验证:
# bundle 可访问(含最新 rev):
Invoke-WebRequest http://127.0.0.1:3080/plugins/dsh-workspace-enhance/client.js
# 合成配置树确认:
dsh --profile web --dump-config
3. 禁用 / 重新启用
编辑 C:\Users\yicheng\.dsh\profiles\web\cordis.patch.yml(顶层必须是 YAML 数组):
# 禁用(恢复默认工作区浏览器):
- id: dsh-workspace-enhance
disabled: true
删掉这两行(或把 disabled 改为 false)即重新启用。每次改动后重启 dsh web。
4. 卸载
从 profile 的 package.json(dependencies 与 dsh.profile.bundles)移除
dsh-workspace-enhance,删除 cordis.patch.yml 中对应行,重跑 pnpm install 与
dsh --profile web --dump-config 确认,再重启。插件目录本身可整个删除。
开发
cd D:\luisdesk\other\dsh-workspace-enhance
# 首次:安装构建期依赖(esbuild + highlight.js;会被打进 client bundle,无需进 profile)
npm install --ignore-scripts --legacy-peer-deps
# 构建 / 监听(client 半边改动)
npm run build # 或 npm run watch(HMR 免刷新热加载浏览器半边)
# 类型检查(tsc strict;依赖本机 profile 内的 @deepseek-ai 类型)
npm run typecheck
# 测试
npm test # 聚合:node 半边集成测试 + client 干跑 + 真实 store 测试(需 profile)
node scripts/test-node.mjs # node 半边集成测试(需本机 git)
node scripts/dry-run-client.mjs # client bundle 干跑(ModuleLoader 格式校验)
node scripts/test-real-store.mjs # 真实 store 引擎 + persist 测试(需本机 profile)
# 渲染测试:esbuild 打包 scripts/render-tabs-test.tsx 后运行(见该文件头部注释)
注意(重要):web profile 用 pnpm 安装的 file: 依赖是打包拷贝,不是
符号链接——npm run build 会把 lib/* 同步进
C:\Users\yicheng\.dsh\profiles\web\node_modules\dsh-workspace-enhance\lib(在受限
沙箱/权限环境下无法写入时需手动复制,或在普通终端执行构建)。client 半边改动靠
HMR 热加载(无需重启);node 半边(lib/index.js)改动必须重启 dsh web。
npm run typecheck与npm test(其中的真实 store 测试)依赖本机 DSH profile 的绝对路径(tsconfig.json的 paths、scripts/test-real-store.mjs的createRequire),CI 中只跑不依赖 profile 的部分(见.github/workflows/ci.yml)。
贡献
欢迎贡献!请先阅读 CONTRIBUTING.md(贡献前检查清单、 什么算好的贡献、质量与数据完整性、提交流程),并遵守 CODE_OF_CONDUCT.md。
- Bug / 功能 / 文档问题:按 Issue 模板 提交
- 代码改动:按 PR 模板 发起,勾选检查清单
- 安全漏洞:见 SECURITY.md(请勿公开披露)
保持关注
- Watch 本仓库,关注 Releases 与 CHANGELOG.md。
- 功能讨论与使用问题:GitHub Issues / Discussions。
- 已知边界以本文档「已知限制」为准。
常见问题(FAQ)
Q:为什么 Git Tab 不显示?
A:仅当当前工作区文件夹是 git 仓库(git rev-parse 成功)时才显示。
Q:改动 client 半边后界面没变化?
A:client 半边走 HMR 免刷新热加载;若没生效,确认 npm run watch 在运行,或手动
npm run build 后刷新页面。node 半边改动则必须重启 dsh web。
Q:「彻底删除」能恢复吗? A:不能。它由 host 直接删除会话目录,不可恢复,界面有二次确认。
Q:远程/容器部署时「添加工作区」不可用? A:原生目录选择器在远程/进程内部署可能不可用,此时会回退到手动输入路径。
Q:CI 为什么没跑 typecheck?
A:tsc 的 paths 与真实 store 测试都指向本机 profile 的绝对路径,CI 沙箱没有
profile;它们是本地质量门禁(见 CONTRIBUTING.md 检查清单)。
已知限制
- 会话「彻底删除」由 host 直接删除
$DSH_HOME/sessions/<scope>/<sessionId>/目录,不可恢复;工作区记账可能残留该 id,由本插件渲染层过滤。 - Git 为只读(log/show/status),无写操作;Changes 视图点击文件是在右侧预览, 不是编辑。
- 原生目录选择器在远程/进程内部署可能不可用,此时添加工作区会回退到手动输入路径。
许可
MIT © 2025 luis