前言¶
DSH 以插件机制扩展能力,社区里也已经有把「多文件夹」做进工作流的插件。实际用下来,这类需求很具体:你的 Agent 会话工作目录只有工作区本身,但代码、文档、脚本散落在工作区之外的多个目录里,模型要么看不到,要么只能在一个根目录里读写。
yanguohong1 维护的 dsh-project-sources 解决这个问题:把工作区之外的额外目录挂进同一个会话,每个目录起一个短别名,模型通过别名引用路径,读写和执行权限跟随当前 sandbox 模式。
这是什么¶
一句话定位:Codex-style 的 project sources,挂在 DSH 上,一个 workspace、多 folder、各自带别名。
- 维护者:yanguohong1
- 分类:工作流
- 许可证:MIT
- 版本:0.1.0(package.json 里的
version) - 环境要求:DeepSeek Harness
0.2.1-rc.5 … 0.2.x(engines.dsh: ^0.2.1-rc.5),Node.js ≥ 20
核心设计:会话的 cwd 仍然是工作区,每个挂载的 source 拿到与工作区相同的 read / write / edit / command 权限,并各带一个最多 48 字符的别名。别名在系统提示里映射到绝对路径,因此模型可以无歧义地引用 @web/src/a.ts。
核心功能¶
下面按插件实际提供的能力分节。
项目编辑器¶
两个入口:
- 会话头部的「编辑项目」对话框
- 会话创建页 composer 上方的「📁 项目源文件夹」pill
在里面可以添加目录、改别名、移除目录。工作区本身不能移除。
会话中的别名¶
系统提示里有一个段落把每个别名映射到它的绝对路径,模型引用别名时路径是确定的,不需要猜。
@ 菜单覆盖¶
DSH 自带的 @ provider 是单根的。这个插件提供一个伴生 group,在所有 source 中搜索,可按别名、目录名或绝对路径匹配。
source 目录里的 skills¶
/ 命令会在 <source>/.dsh/skills、<source>/.agents/skills 和 <source>/skills 下递归查找 skills。
不新增工具¶
read / glob / grep Already 在任何位置可用;write / edit / pwsh / bash 被插件拦截并重新定位到匹配的 source 目录。也就是说,模型不需要新的工具名,只是让已有工具在多个根里工作。
安装与启用¶
在 Web UI 上:
Settings → Plugins → Add,粘贴 dsh-project-sources。
在 CLI 上:
dsh plugin --profile <profile> add dsh-project-sources@0.1.0
也可以从本地目录安装,agent 工具 plugin_manager 接受目录:
plugin_manager install_bundle target: D:\work\dsh-project-sources
安装后如果做了 source 变更,需要重启 Host(Host 模块在启动时 import);浏览器端 bundle 刷新页面即可。
典型用法¶
先创建会话,在创建页 composer 上方点「📁 项目源文件夹」,添加几个目录,比如 D:\work\api 和 D:\work\web,分别给别名 api 和 web。会话开始后,在提示里写 @web/src/a.ts,模型按系统提示里的别名映射读到正确路径。
后续在会话头部的「项目」按钮可以随时增删。别名只允许字母、数字、.、_、-,最长 48 字符,重名会自动加 -2 后缀。
需要写文件时,在 write / edit / bash 里给出 source 内的路径即可,权限和工作区当前 sandbox 模式下一致。命令如果要在具体 source 里执行,把 workdir 写成 source 内的绝对路径。
数据放在哪¶
配置存于:
<DSH_HOME>/storages/project-sources/<workspace-key>.json
每个工作区一条记录,位置在所有 agent sandbox root 之外。只有用户驱动的流程会写这个文件,Agent 不能给自己添加目录。
平台支持¶
文件夹选择器的行为:
- Windows:
powershell -STA+FolderBrowserDialog - macOS:
osascript … choose folder - Linux:先回退到 Host picker,再退回手动输入路径
sandbox re-rooting、@ 菜单和 skill 发现是平台无关的。README 注明 macOS 支持已实现但未在 Mac 上测试。
适用场景与注意¶
适用场景:需要让一个 DSH 会话同时处理工作区之外多个目录的开发者,例如本地仓库 + 另一个服务的代码目录,或文档目录与代码目录分开放。插件继承会话当前的 sandbox 模式,权限与工作区同档。
注意:
- 每条命令只有一个可写根。shell 命令只会在它实际解析到的
workdir目录里写。请传 source 内的绝对workdir;相对路径按工作区解析,命令内部cd <source>或git -C <source>也不会扩大根的范围。 - 会话
cwd固定,没有「主目录」概念,工作区根仍然是默认工作目录。 - 不能和拦截同一工具管线的其他插件并排运行,比如
dsh-multi-folder。 - 后台 shell 通过 jobs runtime 支持,但如果权限拒绝发生在调用返回之后,只有
job_output里能看到。 - 插件以当前 DSH 进程的权限运行,安装前应查看源码与许可证(MIT),确认目录挂载范围符合预期。
开发与测试¶
没有构建步骤,npm test 在不依赖 DSH runtime 的情况下跑两个套件:
node test/smoke.mjs # config store, interception, prompt, remote API
node test/skills.mjs # source-folder skill discovery
发布流程(版本 bump、npm publish with passkey、回滚、注意事项)写在 docs/RELEASING.md(中文)。工具拦截和 sandbox re-rooting 的思路来源于 AngelosZou 的 dsh-multi-folder(MIT),见 NOTICE。
结尾¶
dsh-project-sources 的价值在于把「一个工作区、多个目录」变成会话的默认状态,不用为每个目录开一个会话,也不用改 Agent 的工具集。适合目录分散、希望在一个会话里统一读写的人。
目录页:https://www.skillhub.cn/plugins/yanguohong1/dsh-project-sources
GitHub:https://github.com/yanguohong1/dsh-project-sources