悬停工作区行,一键把会话列表切换成懒加载文件树
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/9/28 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add jipika/dsh-workspace-files该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
装得上吗[实装验证]—
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →数据截至 2026/10/05·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件
查看扫描证据(共 16 处,展示前 14 条)
- 读取本地文件lib/index.js:130
parent = await realpath(parent); - 读取本地文件lib/index.js:155
await lstat(target); - 读取本地文件lib/index.js:169
await lstat(target); - 写入本地文件lib/index.js:175
await mkdir(trashDir, { recursive: true }); - 读取本地文件lib/index.js:179
trashInfo = await stat(trashDir); - 读取本地文件lib/index.js:185
info = await lstat(target); - 读取本地文件lib/index.js:194
for (const entry of await readdir(trashDir)) taken.add(entry); - 写入本地文件lib/index.js:197
await rename(target, destination); - 写入本地文件lib/index.js:208
await rename(target, destination); - 写入本地文件lib/index.js:225
if (kind === "dir") await mkdir(target); - 写入本地文件lib/index.js:226
else await writeFile(target, "", { flag: "wx" }); - 执行外部命令固定命令lib/index.js:241
? spawn("open", ["-a", "Terminal", dir], { detached: true, stdio: "ignore" }) - 执行外部命令固定命令lib/index.js:243
? spawn("cmd", ["/c", "start", "cmd"], { cwd: dir, detached: true, stdio: "ignore", windowsHide: true }) - 执行外部命令固定命令lib/index.js:244
: spawn("x-terminal-emulator", [], { cwd: dir, detached: true, stdio: "ignore" });
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 悬停工作区行切换
- 会话列表转文件树
- 懒加载文件树
左侧栏文件切换:悬停工作区行,点文件夹图标,会话列表就变成懒加载文件树。
README
由 DeepSeek 最新模型翻译生成dsh-workspace-files
拥有:左侧边栏工作区行右侧的文件夹图标、以及覆盖在会话列表上的文件树(DOM 层)。
冲突时:刻意不注册 sidebar.workspaces slot(官方源码声明该区域归其所有);DOM 定位只用 [class="_projectRow"] 这类属性子串,不碰 CSS Module hash 前缀。
回滚:删 dsh-workspace-files insert + 重启应用。
Left-sidebar file switch: hover a workspace row, click the icon, and its session list
becomes a lazy file tree.
左侧边栏的 工作区行 → 文件列表 切换(对标 zcode 的交互)。
展开完整文档(README 剩余 1 节)
dsh-workspace-files
拥有:左侧边栏工作区行右侧的文件夹图标、以及覆盖在会话列表上的文件树(DOM 层)。
冲突时:刻意不注册 sidebar.workspaces slot(官方源码声明该区域归其所有);DOM 定位只用 [class="_projectRow"] 这类属性子串,不碰 CSS Module hash 前缀。
回滚:删 dsh-workspace-files insert + 重启应用。
Left-sidebar file switch: hover a workspace row, click the icon, and its session list
becomes a lazy file tree.
左侧边栏的 工作区行 → 文件列表 切换(对标 zcode 的交互)。
license
- 鼠标移到某个工作区标题行上 → 行右侧浮出一个切换图标
- 点它 → 整个列表区域切换成这个工作区的文件模式(zcode 同款:会话列表滑出、文件树滑入),不再只是行下方塞一块面板
- 文件模式顶部有返回按钮(←),点击或再点行上的切换图标 → 滑回会话列表
- 展开的工作区记在 localStorage["dsh-workspace-files:open"],刷新/重启后自动恢复
- 目录懒加载(点开才请求,结果进内存缓存),头部有「重新载入」清缓存重取
- 点文件 → 拼 dsh-resource://file/session// 交给右侧栏打开
文件模式(v0.3.0,参考 zcode WorkspaceSidebar 的双视图设计)
- 覆盖层 absolute inset-0 挂在列表滚动容器的父级上,与 zcode 的两视图叠放同构;切换用克制的 crossfade(160ms 淡入淡出 + 4px 位移,prefers-reduced-motion 时无动画)—— 不做整屏大平移:官方滚动容器若自带 transition/裁剪,大位移会被打断出怪动画。
- 列表隐藏用 visibility:hidden(延迟到淡出结束),覆盖层背景透明 —— 透出的永远是侧边栏原生底色,不猜任何主题 token,暗/亮主题都不会出现色块。
- 容器定位不硬编码类名:从 projectRow 向上找「包含全部行」的共同祖先,再向上找第一个 overflow-y: auto/scroll 的滚动容器;挂载点运行时补 position:relative + overflow:hidden。
- 会话行不再逐行隐藏(旧做法 data-wsf-hidden 已删)—— 整个列表让位即可,对官方 React 重渲染的干扰更小。
- 列出该工作区文件需要它名下会话的 cwd;探测链(sessions store → workspaces store → DOM 挖 id → 当前会话兜底)不变。
智能排序(v0.2.0)
同一层级的条目按下面的规则排(目录始终在文件前面):
1. 序章 / 楔子 / 引子 / 前言… 开头的排最前;番外 / 终章 / 尾声 / 后记… 排最后
2. 第X章|节|回|卷|话|集|部|篇|幕|场 且 X 为中文数字(一~九、十、百、千、万、两、〇)或阿拉伯数字 → 按章号数值排:第三章 → 第九章 → 第二十一章 → 第三百零五章,不再按字符码位把「第三十章」插到「第三章」前面
3. 同章号先比写法(第3章 add @jipika/dsh-workspace-files
② GitHub(源码直装,跟随 main 分支)
dsh plugin --profile add github:jipika/dsh-workspace-files
yaml
~/.dsh/profiles//cordis.patch.yml
- insert:
- id: workspace-files
name: @jipika/dsh-workspace-files
desktop profile 被 Electron 独占(CLI 子命令会被拒),需手改 package.json + pnpm install;改 lib/client.js 后必须重启 host 进程(或应用),刷新页面无效。
卸载:删掉那行 insert(或加 disabled: true)→ 重启:按钮、面板、隐藏都消失,会话列表恢复原样。
两态切换
- 按钮图标是「圆角方框 + 两行短横」的列表图标(不用文件夹 —— 文件夹容易被误读成"打开目录",而这里切换的是整个列表的视图)。
- 未激活(当前看会话)时按钮灰显、只在鼠标悬停工作区行时出现;激活(当前看文件)时变强调色 + 浅底色块。
- tooltip 与 aria-pressed 随状态在「查看文件列表」/「切换回会话列表」之间切换,点一下就是回另一态。
- 文件树内部的目录节点仍用文件夹图标 —— 那才是"这是一个目录"的语义。
官方右侧栏那个文件树 tab(@deepseek-ai/dsh-client-ui-sidebar-files)完全不碰。
原理(零源码补丁)
| 环节 | 做法 |
| 拿数据 | 直接读 client 服务 ctx.get("workspaces") / ctx.get("sessions")(官方 dsh-client-ui-workspace 自己就是这么取的),用 getSnapshot/getState/subscribe 多路适配服务形状。刻意不注册 sidebar.workspaces slot —— 官方 sidebar 源码注释写明那块区域是 "the registrant's",且官方注册时没声明 kind,再注册一个条目有挤掉官方工作区列表的风险 |
| 找 DOM | 不硬编码 CSS Module 的 hash 前缀,用属性子串选择器 [class="_projectRow"] / [class*="_sessionRow"] —— hash 随版本变,_projectRow 这个后缀名不变 |
| 归属关系 | 用 TreeWalker 按文档顺序推断:遇到下一个 _projectRow 之前的所有 _sessionRow 都归它。不依赖具体嵌套层级 |
| 文件数据 | 走官方 Remote:remote.workspaceFiles.list(sessionId, parent) → { ok, value: { entries: [{name,type}], truncated } }。parent 是被列目录的绝对路径(官方 childPath(parent, name) 就是 parent + "/" + name;传空串会被网关判 gateway/bad-request),实际取该会话记录的 cwd |
| 打开文件 | 拼 dsh-resource://file/session// 地址,交给 ctx.sidebarRight.openResource(...)(没有该服务时退化为打印地址) |
| 目录懒加载 | 点开目录才请求,结果进内存缓存;8 秒超时保护;面板头部的「重新载入」清缓存重取 |
隐藏会话行用属性标记 + CSS 规则([data-wsf-hidden="1"]{display:none!important}),不用内联 style —— 内联 style 会被官方 React 重渲染覆盖。
自诊断
重启后在 DevTools 控制台执行: js
__dshWorkspaceFiles()
返回插件当前看到的东西: js { openKey, workspacesSeen, sessionsSeen, projectRows, sessionRows, panels, services, sample, sessionSample }
- projectRows 为 0 → DOM 选择器没匹配上(官方类名规则变了)
- workspacesSeen 为 0 → ctx.get("workspaces") 没取到数据:看返回里的 services.workspaces 字段("缺失" 表示服务名变了,否则列出的是取到的成员名)
- 面板里显示「拿不到该工作区的 session」→ workspace 记录里没有可用的 session id(sample 里能看到实际形状)
插件还会在发生变化时写一条 dsh-workspace-files:diag 记录,便于回看。
已知限制
- 靠 DOM 挖掘与内部服务形状适配,官方侧边栏结构变化后需要跟改(自诊断函数就是为这个准备的)。
- 需要 exports.inject = ["remote.workspaceFiles"]:cordis 会拦截未声明的服务,缺了它会报 cannot get property "remote.workspaceFiles" without inject。
- 会话与工作目录必须成对取自同一条 session 记录 —— 用 A 会话的 id 配 B 会话的路径,网关会判 bad-request(甚至越权读别的目录),所以 rootFor() 里刻意不混用。
License
MIT © 2026 jipika预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
jipika/dsh-workspace-files
悬停工作区行,一键把会话列表切换成懒加载文件树
相关插件 · 浏览器
智能体插件框架deepseek-ai/deepseek-harness
DeepSeek Harnessdsh是由 DeepSeek AI 开发的开源 agent harness智能体框架。
★ 272,060已汉化DSH
71.9
多设备 Agent 看板YaoApp/yao
✨ 所有 Agent 和工作区集中管理,覆盖你的每一台设备。任务看板追踪进度,桌面端、移动端、浏览器、API…
★ 8,147已汉化DSH
71.2
可扩展侧边栏工作台omdsh-dev/DSH-better-sidebar
DSH 的双工作台:原生右侧栏 + 自绘底部面板,并把 ctx.betterSidebar 服务开放给所有插件
★ 4,885已汉化DSH
71.2
浏览器自动化桥Tencent/BrowserSkill
你的 Agent。你的浏览器。连接,就能协作。
★ 9,967已汉化DSH
71
AI 小说创作工作台EthanYoQ/AI-Novel-Writer
AI 小说作家 / AI Novel Writer
★ 1,591已汉化DSH
70.7
智能体浏览器引擎platonai/Browser4
DeepSeek Harness 集成
★ 1,175已汉化DSH
70.4
这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。