🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

盘符直达选择器 Charlotteyi5/dsh-workspace-drive-picker

DeepSeek Harness
Charlotteyi514 天前有提交已提供中文文档扫描:含敏感能力

一键跳转任意盘符并记住上次打开的目录

29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/23 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Charlotteyi5/dsh-workspace-drive-picker
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 14 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 14 处,展示前 14 条)
  • 读取本地文件
    index.js:223
    await readdir(path)
  • 读取本地文件
    index.js:249
    entries = await readdir(mountRoot, { withFileTypes: true })
  • 读取本地文件
    index.js:279
    await readdir(path)
  • 读取本地文件
    index.js:308
    const raw = await readFile(STATE_FILE, 'utf8')
  • 写入本地文件
    index.js:334
    await mkdir(join(homedir(), '.dsh'), { recursive: true })
  • 写入本地文件
    index.js:335
    await writeFile(STATE_FILE, `${payload}\n`, 'utf8')
  • 读取本地文件
    index.js:386
    const dirents = await readdir(target, { withFileTypes: true })
  • 发起网络请求
    index.js:431
    const response = await fetch(`${base}/remote-ssh/api/${method}`, {
  • 写入本地文件
    index.js:479
    await mkdir(target, { recursive: true })
  • 发起网络请求
    client.js:169
    const response = await fetch(`${API}/${action}`, {
  • 执行外部命令固定命令
    audit.mjs:57
    const files = execFileSync('git', ['ls-files', '--cached', '--others', '--exclude-standard'], {
  • 读取本地文件
    audit.mjs:70
    text = readFileSync(file, 'utf8')
  • 读取本地文件
    smoke-client.mjs:46
    const source = await readFile(new URL('./client.js', import.meta.url), 'utf8')
  • 读取本地文件
    smoke-remember.mjs:51
    const source = await readFile(new URL('./client.js', import.meta.url), 'utf8')
扫描于 2026/11/4(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

给 DSH 的「添加工作区」选择器加上盘符快捷标签,并记住上次打开的起始目录

README

由 DeepSeek 最新模型翻译生成
dsh-workspace-drive-picker 给 DSH「添加工作区」的目录选择器加上盘符一键直达。 它解决什么 Windows 没有比 C:\ 更上一层的统一根目录。DSH 自带的选择器只能沿目录树往上走,走到 D:\ 就再也上不去了,跨不到别的盘;它的面包屑还会在主目录处折叠,正好把通往其他盘的那段路藏起来。想换盘只能手打路径。 本插件接管两个目录流 slot(sidebar.workspaces.directoryFlow 与 conversation.hero.workspace.directoryFlow),把这些补上: - 盘符条:一排 chip,点一下直接跳到该盘根(宿主端枚举 A:–Z:,实际挂载的才出现)。每个 chip 显示卷标与剩余空间(C: System 316.7G),悬停出完整路径与总容量。 - 常用目录:下载 / 文档 / 桌面。 - 常显路径框:粘贴任意绝对路径回车即跳。 - 完整面包屑:从根开始,不在主目录折叠。 - 新建文件夹:在当前层建,建完直接进去。 - 记住上次的目录:下次打开「添加工作区」直接回到上次停留的那一层。 - 本机 / 远程两个标签:远程那半复用 dsh-remote-ssh 已配好的 SSH 连接与工作区,不重配。
展开完整文档(README 剩余 1 节)
dsh-workspace-drive-picker

给 DSH「添加工作区」的目录选择器加上盘符一键直达。

它解决什么

Windows 没有比 C:\ 更上一层的统一根目录。DSH 自带的选择器只能沿目录树往上走,走到 D:\ 就再也上不去了,跨不到别的盘;它的面包屑还会在主目录处折叠,正好把通往其他盘的那段路藏起来。想换盘只能手打路径。

本插件接管两个目录流 slot(sidebar.workspaces.directoryFlow 与 conversation.hero.workspace.directoryFlow),把这些补上:

- 盘符条:一排 chip,点一下直接跳到该盘根(宿主端枚举 A:–Z:,实际挂载的才出现)。每个 chip 显示卷标与剩余空间(C: System 316.7G),悬停出完整路径与总容量。
- 常用目录:下载 / 文档 / 桌面。
- 常显路径框:粘贴任意绝对路径回车即跳。
- 完整面包屑:从根开始,不在主目录折叠。
- 新建文件夹:在当前层建,建完直接进去。
- 记住上次的目录:下次打开「添加工作区」直接回到上次停留的那一层。
- 本机 / 远程两个标签:远程那半复用 dsh-remote-ssh 已配好的 SSH 连接与工作区,不重配。

卷标与剩余空间从哪来

Node 没有读取 Windows 卷标的 API(statfs 只给容量),所以宿主侧用一条 PowerShell 查询:

Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3" |
Select-Object DeviceID,VolumeName,Size,FreeSpace | ConvertTo-Json -Compress

DriveType=3 是「本地固定磁盘」,可移动盘与网络映射盘不参与,避免失效的映射盘拖慢列表。实测六个卷约 430 ms,因此结果缓存 2 分钟;缓存期内再开弹窗是 3 ms。

查询失败(PowerShell 被策略拦、非 Windows、WMI 不可用)一律降级为空卷标 + 不显示剩余空间,弹窗退回纯盘符,绝不因为一个卷标而报错。

记住上次目录为什么存在宿主

GUI 的源每次重启都会变(127.0.0.1:52844 → :54740 → :56261 …),localStorage 按源隔离,于是每次重启都会静默忘掉这个偏好。所以状态写在宿主:

~/.dsh/workspace-drive-picker.json
{ "path": "D:\\work", "tab": "local" }

写入是 best-effort(只读 home、并发写都不影响弹窗);文件损坏或不存在就是「没有记住」,绝不阻塞流程。记住的目录若已被删除或所在盘未挂载,列举会失败并在弹窗内报错,此时点盘符条或手打路径都能继续。

为什么优先级是 −1000

DSH 的 slot 是遮蔽语义:同一个 slot 里优先级最低(数字最小)的占用者负责渲染。dsh-remote-ssh 用 −100 接管了这两个 slot,官方 browse 是 0。本插件取 −1000,因此在它之上渲染,同时保持可插拔:卸掉它,原来那个界面原样回来,不需要改任何配置。

安装

把仓库克隆到本地任意位置,然后在该目录里执行:
dsh plugin --profile desktop add file:<仓库所在的绝对路径>

例如仓库放在 D:\plugins\dsh-workspace-drive-picker:

dsh plugin --profile desktop add file:D:\plugins\dsh-workspace-drive-picker

CLI 不可用时也可以手动登记:在 ~/.dsh/profiles/desktop/package.json 的 dependencies 里加一行 file: 引用,再把它加进 dsh.profile.bundles,然后 pnpm install。

装完重启 DSH 桌面端、刷新页面。

卸载

从 package.json 移除该依赖与 bundle 行,pnpm install,重启。原来的选择器自动恢复。

结构

| 文件 | 职责 |
| index.js | 宿主半:一个 prefix 路由 /workspace-drive-picker,五个动作 drives(盘符 + 卷标 + 剩余空间 + 记住的目录)/ list(列一层)/ mkdir / state(读写记住的目录)/ remote(白名单代理到 dsh-remote-ssh 的 /remote-ssh/api) |
| client.js | 浏览器半:接管两个 directory-flow slot 的对话框 |
| smoke.mjs | 宿主半冒烟测试,不用开 GUI:node smoke.mjs |

安全边界

- 每条路由都要求 X-Requested-With,与同宿主上其他插件路由一致的 CSRF 栅栏;跨站页面无法在无预检的情况下设置该头。
- 代理只放行 listProfiles / listDir / mkdir / createRemoteWorkspace,所以这条路由不可能变成通用 SSH 控制台。
- 单层列举上限 500 条、请求体上限 1 MB,避免巨大目录拖垮对话框或宿主内存。

已知限制

- 盘符枚举靠 readdir('X:\\') 探测,读不动但确实存在的卷(例如权限全拒的卷)不会出现在盘符条里 —— 仍可从路径框手打进入。
- 远程面板只列目录,不在远端建文件夹(远端建目录请用 dsh-remote-ssh 自己的设置页)。

开发时踩过的两个坑(改代码前先看)

1. alive ref 必须在 effect 里重新置 true

// 错误:第一次 cleanup 之后永远是 false
useEffect(() => () => { alive.current = false }, [])

// 正确
useEffect(() => {
alive.current = true
return () => { alive.current = false }
}, [])
React 18 在开发模式下会跑 mount → cleanup → mount。只清不置的写法会让 alive 在第一轮 cleanup 后卡在 false,于是每个响应都被丢弃:loading 永远停在 true,底部按钮(含「选择此目录」)全部 disabled,点上去看起来完全没反应,控制台也没有任何报错。这个 bug 从代码上读很难发现,症状又极易误判成「按钮没绑事件」。

2. Modal 要传 headless

官方 Modal 默认会把 children 包进它自己的 .content / .body 两层容器。本对话框依赖「头部固定 + 列表 flex:1 + 页脚固定」的纵向布局,多出来的包装层会让页脚被挤出卡片外看不见。传 headless: true 自己管布局:.wdp_dialog(卡片本身)overflow:hidden,内部 .wdp_sheet 用 height:100% 撑满。

测试

node smoke.mjs # 宿主半:路由、盘符枚举、CSRF 栅栏、白名单、404
node smoke-client.mjs # 浏览器半:按 web shell 的方式加载 bundle,验证 apply() 注册的两个 slot
node smoke-state.mjs # 卷标/剩余空间真实读数 + 记住的目录往返
node smoke-remember.mjs # 「恢复」与「保存」两个 effect 不会互相打架的规则

都不需要开 GUI。smoke-client.mjs 用假的 window.__ModuleLoader__ / React / slots / locale 把 apply() 跑一遍 —— 这是重启前唯一能发现「bundle 能解析但激活时抛错」的手段。smoke-state.mjs 会真跑那条 PowerShell 查询,并断言冷/热两次调用的耗时差距,防止有人把缓存删掉却没人发现。

3. 恢复与保存的两个 effect 不能互相触发

「记住上次目录」是两个 effect:一个用记住的路径去 load,一个在 path 变化时 state 保存。如果恢复效应的依赖里混进了 path,那么用户每跳一层 → 保存新路径 → 恢复效应重跑 → 把用户拽回旧目录,看起来就是「点盘符没反应 / 一直弹回原处」。规则(smoke-remember.mjs 守着):恢复只依赖 load 与 driveFacts?.saved?.path,保存只依赖 path 且在 path === '' 时直接 return。
预览分享卡片长什么样 ↓Charlotteyi5/dsh-workspace-drive-picker
分享 · DeepSeek Harness Hub
Charlotteyi5/dsh-workspace-drive-picker

一键跳转任意盘符并记住上次打开的目录

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部