DeepSeek Harness Hub
← 返回列表

多文件夹工作区Boy-Grid/dsh-multi-folder-workspace

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
未验证

让一个工作区横跨多个文件夹,会话可读写全部成员

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/8/23 · 已提供中文文档

DeepSeek Harness 的多文件夹工作区:一个工作区跨越多个文件夹,会话能够读写每个成员。核心补丁集 + 插件 + 一条命令的 npx 启动器。

综合分
28.2
GitHub 分
28.2
用户评分
★ Stars
1
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add Boy-Grid/dsh-multi-folder-workspace
该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/16(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

DSH 多文件夹工作区

English · 启动器 · 插件 · MIT

npx @boy_grid/dsh-mfw web

让 DeepSeek Harness(DSH)支持多文件夹工作区:一个工作区由多个分散的文件夹组成,工作区内的会话可以读写全部成员文件夹,在侧边栏与普通单文件夹工作区同列展示,成员还能在之后增删。

为什么是双轨仓库

上游 DSH 把工作区建模为「恰好一个文件夹」,这个假设散布在多个核心包里——持久记录(path: string)、沙箱策略(workspaceRoot: string)、RPC 载荷、目录选取契约(onPicked(path))。插件无法改写进程内已存在服务的类型与执行方,所以这个特性做不成纯插件。

上游目前也不接受外部 PR。因此本仓库交付必须成套安装的两样东西:

| 轨道 | 交付物 | 作用 |
| --- | --- | --- |
| 核心 fork | 补丁集 —— 10 包 / 27 补丁,经 pnpm patchedDependencies 应用 | 多路径领域模型、多根沙箱、扩展 RPC、onPicked(paths[]) 契约、模型可见的成员变更轨迹 |
| 插件 | @boy_grid/multi-folder-workspace | 多选目录流 + 成员管理 UI |

插件依赖的契约只在补丁应用之后才存在,在 stock DSH 上无法工作。选 patchedDependencies 是因为它覆盖依赖树里的全部实例(含 peer 边)——pnpm overrides 不作用于 peerDependencies,所以 scripts/repack.mjs 能产出的 @boy_grid/dsh- 重发布包只作实验,不发布。

手工装齐两轨要好几步,所以还有第三个包替你做完:@boy_grid/dsh-mfw 是一个启动器,它准备好打了补丁的运行时、维护自己的 DSH profile 并装好插件,然后把你的参数原样交给 dsh。见 packages/dsh-mfw。

兼容性

| | 版本 |
| --- | --- |
| DSH 基线 | 0.1.1-rc.2 —— 精确 pin,见 fork/fork.json |
| 撰写时上游 latest | 0.1.1-rc.2 |
| Node | >= 22 |
| pnpm | 11.7(或 corepack) |

基线跟随 npm 的 latest dist-tag。上游发新版后,补丁集需要先 rebase 才能用在新版上——流程见 docs/RELEASE.md §6。除了精确 pin @deepseek-ai/dsh,还必须保留 lockfile:上游包之间用 ^ 区间互相引用,否则会漂到新的 prerelease,补丁随之变成 unused。

安全须知

多文件夹工作区扩大了 Agent 的写面。在 workspace-write 模式下,工作区内的会话可以写入全部成员文件夹,而不只是它自己的工作目录。具体来说:

- 补丁集修改了 DSH 的沙箱组件:dsh-sandbox(writableRoots 改为全部成员的并集)、dsh-sandbox-policy(经新增的 ctx.workspaceRoots seam 按会话实时解析成员集)、dsh-sandbox-local(Seatbelt / bwrap / Landlock 多目录授权)、dsh-sandbox-windows-acl(逐成员目录授 Write ACE)。
- 成员集合之外的路径仍然被拒,FS_SANDBOX_DENIED / [sandbox: …] 的升级路径不变。read-only 与 danger-full-access 语义未受影响。
- 成员变更即时生效:新增成员后既有会话立刻可写,移除成员后立刻收回。
- 成员集合与每一次增删都会投影进模型上下文,并作为 workspace/membership 会话事件落盘,轨迹可审计、可重放。

安装前请自行评估这个取舍。如果你一次只在一个文件夹里工作,就不需要它。

快速开始

npx @boy_grid/dsh-mfw web

启动器会在你的缓存目录里准备一棵打好补丁的 DSH 运行时(仅首次,约 10–30 秒)、把插件装进它自己的 DSH profile,然后起 web UI。web 之后的参数原样透传给 dsh,所以 npx @boy_grid/dsh-mfw web --port 8080 按预期工作。

它不干扰你已有的 DSH 安装:你的 web profile 及其 cordis.patch.yml 既不读也不写,原本的 dsh web 行为完全不变;同时两者共享 $DSH_HOME 里的会话与凭据。npx @boy_grid/dsh-mfw doctor 会打印它解析出的每个路径,clean --all 清掉缓存。细节见 packages/dsh-mfw/README.md。

前置要求:Node >= 22、首次运行需联网、pnpm 11+(PATH 上够新就直接用,否则经 corepack 取)。

手工安装(进阶)

想自己掌握安装树——比如 pin 进自己的仓库,或与其他补丁组合?仓库自带一份现成的安装套件,含补丁、清单与冻结 lockfile:

cp -R consumer-template /path/to/my-dsh-deploy
cd /path/to/my-dsh-deploy
pnpm install --frozen-lockfile --config.confirmModulesPurge=false
pnpm add @boy_grid/multi-folder-workspace

然后把插件与 browse 后端写进 profile 的 cordis.patch.yml,并禁用 native picker:

- id: directory-picker
disabled: true
- insert:
- id: directory-picker-browse
name: '@deepseek-ai/dsh-host-directory-picker-browse'
- id: multi-folder-workspace
name: '@boy_grid/multi-folder-workspace'

这个文件要等 profile 建出来才有,而 profile 是 dsh web 第一次运行时创建的——所以先起一次、停掉,再改。改完重启 dsh web。安装成功的判据:node_modules/.pnpm 下有 10 个带 _patch_hash 后缀的目录。完整步骤见 docs/RELEASE.md。

仓库结构

dsh-multi-folder-workspace/
├── plugins/multi-folder-workspace/  发布的插件(client 半:多选目录流 + 成员管理 UI)
├── packages/dsh-mfw/                发布的启动器(npx 入口;自带补丁集)
├── fork/
│   ├── fork.json                    清单:scope / forkVersion / baseVersion / 包列表
│   └── patches//               每包的分步补丁(NN-.patch)+ NOTES.md
├── consumer-template/               即拷即用的消费者套件:清单 + 补丁 + 冻结 lockfile
├── scripts/
│   ├── combine-patches.mjs          重放分步补丁,合成每包一个规范化补丁
│   ├── repack.mjs                   实验性 @boy_grid/dsh-* 重发布管线
│   ├── build-client.mjs             插件 client 半 → __ModuleLoader__ 格式
│   ├── deploy.sh / run-experiment.sh / serve.sh / wire-plugin.sh / toggle-plugin.sh
│   ├── test-setup.sh / integration-smoke.mjs        跨包集成冒烟
│   ├── gen-consumer.sh / make-test-bundle.sh        消费者套件 + 跨平台测试包
│   ├── test-platform.sh / test-platform.ps1        测试包内的 bootstrap 脚本
│   └── lib/pnpm.sh                  共享的 pnpm 解析(.tool → PATH → corepack)
└── docs/                            设计、状态、验证与发布文档(中文)

开发

pnpm install
pnpm typecheck          # 对着 pin 住的基线跑 tsc --noEmit
pnpm build:plugin       # host 半 + __ModuleLoader__ 格式的 client 半
pnpm patches            # dist/fork/combined/.patch(10 个)
pnpm test               # 解包 + 打补丁基线、自建上游树,然后跑跨包集成冒烟(11 项)
pnpm consumer:regen     # 重建 consumer-template,证明 pnpm 能应用全部 10 个补丁
pnpm experiment         # 部署 + 接插件 + 用隔离的 DSH_HOME 启动 dsh web

启动器自带一份 combined 补丁集副本,所以 pnpm patches 之后要同步:

pnpm launcher:assets    # 把 dist/fork/combined 拷进 packages/dsh-mfw/assets 并刷新其清单
pnpm launcher:verify    # 资产漂移就失败(prepack 与 CI 也会跑)

想用本地插件构建试启动器、又不发布任何东西,就把它指向工作副本,并给它一次性的缓存与 home:

DSH_MFW_PLUGIN=$PWD/plugins/multi-folder-workspace \
DSH_MFW_CACHE=/tmp/mfw-cache DSH_HOME=/tmp/mfw-home \
node packages/dsh-mfw/lib/bin.js web

实验部署树在仓库之外(默认 $HOME/.cache/dsh-mfw-experiment,用 MFW_DEPLOY_DIR 改),因为它含有带凭据的真实 DSH_HOME。MFW_DSH_HOME 单独覆盖 home,PORT 改 web 端口。

一个值得记住的 pnpm 坑:脚本化的 pnpm install 必须带 --config.confirmModulesPurge=false,否则可能停在「modules directories will be removed and reinstalled」的交互确认上一直挂着。仓库脚本已统一带上。

已知限制

- 扩展契约没有类型声明。 补丁只改运行时 lib/.js。workspace.paths、addMember/removeMember、onPicked(paths[])、SandboxExecutionPolicy.workspaceRoots 在运行时存在,但不在 .d.ts 里,TypeScript 消费方调用这些扩展点需自行 declare module 补充。
- 基线是 pin 住的。 换用更新的 DSH 版本前需要先 rebase 补丁集。
- 两项 UI 打磨未做:工作区行的成员数徽标;新建会话时选择落在哪个成员目录(当前默认主成员)。
- 上游特性不会自动感知多根,除非它走沙箱 seam。例如 0.1.1 新增的 @ 文件引用按会话自身的工作目录解析,不跨成员目录。
- 嵌套成员被设计性拒绝:成员之间不得互为祖先/后代,同工作区内与跨工作区都一样。
- 卸载是安全的,但不可逆。 打补丁侧写出的记录会保留 path 指向主成员,所以卸载后原版 DSH 仍能启动,并把这些工作区显示为单文件夹工作区。但原版第一次写回记录时会把 paths 字段剥掉,此后成员集合就没了。想保留就先备份 $DSH_HOME/storages/workspace.json。
- Windows 上卸载会留下目录 ACE。 写授权是往成员目录的 DACL 上挂一条 capability SID 的 ACE 实现的,它在文件系统上而不在 DSH_HOME 里,删缓存和 profile 带不走。没有进程持有对应 SID 时它不授予任何权限,但想恢复原样需要手工清一次,命令见 docs/platform-testing.md。

文档

| 文档 | 内容 |
| --- | --- |
| packages/dsh-mfw/README.md | 启动器:命令、选项、环境变量、它碰与不碰什么(英文) |
| docs/architecture.md | 上游约束、各层设计决策、fork 基线策略、客制化缝 |
| docs/implementation-status.md | 逐补丁的实现状态与验证证据、剩余边界 |
| docs/RELEASE.md | 发布指南、消费者安装、上游发新版时的 rebase 流程 |
| docs/manual-e2e-checklist.md | 手工 GUI 验收清单 |
| docs/platform-testing.md | 各平台沙箱覆盖情况与跨平台测试包 |

参与

欢迎 issue 与 PR,见 CONTRIBUTING.md。最有价值的贡献是「把补丁 rebase 到上游新版」与「特定平台的沙箱验证」。

许可

MIT。补丁集派生自 MIT 许可的上游 @deepseek-ai/dsh- npm 产物;上游版权声明保留在 THIRD_PARTY_NOTICES.md。

本项目是独立的社区项目,与 DeepSeek 无隶属关系,也未获其背书。

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

同作者(Boy-Grid)的其他插件

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群