前言¶
在 DeepSeek Harness(DSH)里,工作区通常对应侧边栏里的一条路径:会话的当前工作目录(cwd)就落在该文件夹下。若你同时在多个仓库或子项目间切换,要么反复改工作区路径,要么把代码都拷贝到一个目录里,维护和检索都不顺手。
下面介绍的 dsh-managed-workspaces 由社区维护者 CoraxEldridge 发布,分类属于工作流。插件在指定根目录下由 DSH 自建工作区目录,并允许把多个已有文件夹以链接形式挂到同一工作区,而不必把整个项目树搬进单一目录。
这是什么¶
dsh-managed-workspaces 是 DSH 插件(npm 包名同为 dsh-managed-workspaces,当前资料中版本为 1.3.0,许可证 MIT)。它解决的是:工作区不必再必须指向一个已存在的单一路径;可以在可配置根目录下创建托管工作区,并通过 _roots/<别名> 关联多个外部文件夹(Windows 上使用 NTFS junction,无需管理员权限)。
插件归属与源码见 GitHub 仓库;社区目录页为 SkillHub 插件页。DSH 生态以「一切皆插件」为方向,SkillHub 等目录为社区站点,与 DeepSeek / 幻方无官方从属关系。
工作区模型¶
默认根目录为 <用户目录>/DSH-Workspaces,可在托管面板中修改。目录结构示意如下:
<根目录>/
demo/ ← 工作区主目录,注册进侧边栏,会话 cwd 即此目录
_roots/ ← 固定目录,存放关联文件夹的链接
web/ ← junction → 例如 D:\repos\web
api/ ← junction → 例如 D:\repos\api
工作区主目录由插件创建,并通过 ctx.workspaceRegistry 注册;在侧边栏出现后,直接在该行新建会话即可。关联路径保留真实绝对路径;解除关联只删除链接,不删除被关联的文件夹;从插件移出工作区只删除注册与插件记录,不删除文件夹或会话。
核心功能¶
新建与关联¶
- 在托管面板设置工作区根目录并保存。
- 输入名称点「新建」:创建
<根目录>/<名称>/并注册到侧边栏。 - 展开工作区,填入要关联的文件夹(可指定别名),点「关联」。
- 在该工作区行新建会话开始工作。
接入已有工作区¶
侧边栏里已有的工作区可「接入」插件,纳入同一套管理(便于再关联额外文件夹),不移动、不改名、不新建任何文件:
- 界面:右键工作区 →「接入托管工作区」;或在托管面板「已有工作区(未接入)」中逐项或全部接入。
- 工具:
managed_workspace({ action: "adopt", all: true }),或managed_workspace({ action: "adopt", folder: "路径" })。
接入后的工作区在第一次「关联」之前不会创建空的 _roots/。
侧边栏与「添加工作区」¶
插件以更高优先级接管侧边栏「+」流程,提供:新建托管工作区 / 选择已有文件夹(保留宿主官方行为)/ 接入已有工作区 / 打开托管面板。已托管工作区右键可打开托管面板、关联文件夹、迁移、修复、移出插件等。卸载插件后官方选择器自动恢复。
迁移工作区¶
通过「迁移…」或 managed_workspace({ action: "migrate", destination: "目标路径", workspace: "名称" }) 将整个工作区目录移动,并重建 _roots 下链接。若工作区仍有会话,会自动采用 anchor 模式:原路径保留为指向新位置的目录链接,以便会话头中不可变的 cwd 仍有效;无会话时可用 clean 模式直接迁址并重新注册。
managed_workspace 工具¶
未指定 workspace 时,工具以当前会话所在工作区为上下文。常用 action 包括:status、list、create、adopt、attach、detach、register、forget(详见仓库 README 表格)。
状态持久化¶
%DSH_HOME%\managed-workspaces\manifest.json(DSH_HOME 未设置时为 ~/.dsh)记录根目录、工作区与关联关系;写入采用临时文件加 rename,损坏时会备份并以空状态继续,界面会告警。
安装与启用¶
包已发布到 npm:https://www.npmjs.com/package/dsh-managed-workspaces。
推荐用 DSH 插件命令(将 desktop 换成你的 profile 名):
dsh plugin --profile desktop add dsh-managed-workspaces
该命令会在 profile 中安装包,并把新增 bundle 自动加入 dsh.profile.bundles;重启 DSH 后生效。
也可通过 plugin_manager 安装:
plugin_manager({ action: "install_bundle", target: "dsh-managed-workspaces" })
从 GitHub 或本地目录安装时,使用资料中的 install_bundle 目标 URL 或本地路径。安装后点侧边栏「+」可见托管工作区入口;若提示 restart-required,需重启 DSH。更新时重复对应安装命令即可。
插件在你的 DSH 进程权限下运行;安装前建议查看 源码 与 MIT 许可证,确认符合你的环境策略。
典型用法小结¶
经过上面的安装步骤后,可按 README 中的顺序:打开托管面板设根目录 → 新建工作区 → 关联 web、api 等别名目录 → 在工作区下开会话。需要把现有侧边栏工作区纳入管理时,用「接入」而非重建目录。跨盘或换机整理目录时,用「迁移」并注意有会话时的 anchor 与磁盘上原路径链接是否可长期保留。
通过工具批量操作时,例如查看未接入列表:
managed_workspace({ action: "list" })
关联文件夹示例:
managed_workspace({ action: "attach", folder: "D:\\repos\\web", alias: "web" })
适用场景与注意¶
适合:多仓库并行、希望一个 DSH 工作区里统一会话 cwd,又要把真实代码留在原路径的团队或个人;需要在不改仓库布局的前提下给已有工作区加「虚拟多根」的场景。
务必留意的限制(均来自插件文档):
- 从工作区根做
glob/grep时不会自动跟随_roots下的链接;应对每个别名路径显式指定,例如grep({ path: "_roots/web" })。 - 在
workspace-write沙箱下无法写入关联文件夹内容;修改关联目录中的文件需将会话切到danger-full-access。 - 不支持将 junction 指向 UNC 网络共享。
- 依赖宿主原生目录选择器时,「选择已有文件夹」在部分宿主上可能不可用,可改用手动路径输入。
- 会话不能跨工作区拖动;归属由会话头 cwd 决定,整理位置应使用「迁移工作区」。
- 工作区或链接被外部删除后需点「修复」;
_roots/<别名>若被真实文件占用,插件只报冲突不覆盖。
卸载插件不会删除磁盘上的工作区文件夹、链接或会话。
结尾¶
dsh-managed-workspaces 把 DSH 工作区从「必须指向单一已有目录」扩展为「根目录下自建 + 多文件夹链接」的模型,并覆盖接入、迁移、修复等日常运维。若你在 SkillHub 或 GitHub 检索工作流类插件,可按本文命令安装试用。