deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
在同一个会话里跨多个项目文件夹工作:把一组项目文件夹组织成一个「项目组」,agent 可以直接读写组内任意文件夹的文件、列出目录、运行命令(git / npm / 构建等)——无需手动切换、无需为每个项目另开会话,像 Codex 的多文件夹工作区一样自然。

| 场景 | 原生 DSH(单工作区) | 项目组模式 |
|---|---|---|
| 跨项目工作 | 一个会话绑定一个工作区目录,跨项目要另开会话 | 一个会话内直接操作组内任意文件夹 |
| 上下文连续性 | 每个会话独立记忆,A 项目的结论带不到 B 项目 | 对话历史与理解全程保留,跨项目无缝衔接 |
| 文件夹切换 | 需要手动切换工作区/目录 | 无需切换——folderId 直接指定目标文件夹 |
| 项目范围控制 | 工作区外不可操作(沙箱限制) | 只对已注册文件夹开放,越界拒绝,安全可控 |
| 配置持久化 | — | settings 持久化,重启/换机迁移不丢 |
核心优势:
fs.contains 越界拒绝),写入以目标文件夹为沙箱根,无需放开全局权限。settings.yaml),重启不丢;复制 profile 即可换机迁移。node install.mjs 装到任意机器,安装器幂等且自动修复损坏的配置。project 模型工具,可对组内任意文件夹直接操作(通过 folderId 指定目标,无需切换)list — 查看项目组与全部文件夹及其 folderIdreadFile / writeFile / listDir — 对指定文件夹读写文件、列目录(路径限制在注册的文件夹内,越界拒绝)run — 在指定文件夹运行命令(经 PowerShell,自动探测 pwsh / Windows PowerShell 5.1)settings.yaml),重启不丢read/write/list_dir/set_active 等为什么不在左侧栏?侧栏的「工作区区域上方」没有可追加的插槽——只有替换整个侧栏外壳才能放内容,会破坏原始侧栏样式(设置入口等)。因此本项目采用纯追加式插槽(设置页 + 输入框状态条),完全不改动原始界面。
| 部分 | 机制 |
|---|---|
宿主插件 lib/index.js |
状态注册表 + /api/project-groups HTTP API(webServer 路由)+ project 模型工具(tools)+ 提示词上下文(systemPrompt)+ settings 持久化 |
浏览器插件 lib/client.js |
__ModuleLoader__ bundle,注册 settings.section 与 conversation.input.dock 两个追加插槽,通过 fetch 调用宿主 API |
| 通信 | 浏览器 → /api/project-groups(GET 查询 / POST 变更,JSON) |
| 依赖 | @deepseek-ai/dsh-tools、@deepseek-ai/schemastery、@deepseek-ai/dsh-settings(均随 dsh 安装提供) |
宿主插件通过 inject: ['settings','webServer','tools','systemPrompt'] 等待核心服务挂载后再激活。
dsh CLI,本插件按 web profile 编写)$DSH_HOME/profiles/web/,默认 C:\Users\<你>\.dsh\profiles\web\)install.mjs,直接 node 运行,无任何依赖)把本仓库克隆/下载到本地后,在 PowerShell、cmd 或任意终端里:
node install.mjs
# 可选参数:
# --home <目录> 指定 DSH_HOME(默认 ~/.dsh)
# --profile <名> 指定 profile(默认 web)
# --auto 装完自动重启 dsh web(内部调用 restart.mjs)
# --force 已有目录链接指向别处时强制改指
脚本会:
$DSH_HOME/profiles/<profile>/plugins/dsh-ProjectModel/$DSH_HOME/profiles/node_modules/dsh-ProjectModel(客户端模块表解析)node_modules/dsh-ProjectModel(宿主 loader 解析裸包名)--force 才改指cordis.patch.yml 追加插件行--auto 直接重启)重启后刷新浏览器即可。重启也可以用仓库里的 node restart.mjs(自动找端口进程 → 停止 → 重启 → 验证 /api/project-groups)。
以默认 profile web 为例($DSH_HOME = C:\Users\<你>\.dsh):
放置插件:把本仓库复制为
C:\Users\<你>\.dsh\profiles\web\plugins\dsh-ProjectModel\
创建目录链接(两条都要,Windows 用 junction):
$target = 'C:\Users\<你>\.dsh\profiles\web\plugins\dsh-ProjectModel'
# ① profile 侧(客户端模块表)
New-Item -ItemType Junction -Path 'C:\Users\<你>\.dsh\profiles\node_modules\dsh-ProjectModel' -Target $target
# ② 安装侧(宿主 loader)。把 <dsh-install> 换成 dsh 安装位置,例如:
# D:\Program Files\nodejs\node_cache\_npx\xxxxxxxx\node_modules
New-Item -ItemType Junction -Path '<dsh-install>\node_modules\dsh-ProjectModel' -Target $target
② 是必须的:宿主 loader 对裸包名的解析以 dsh 安装目录为基准;只做 ① 时客户端能加载但宿主端(API/工具)不生效。 不确定安装目录?执行:
node -e "const {createRequire}=require('module');console.log(createRequire(process.cwd()+'/cordis.yml').resolve('@deepseek-ai/dsh-base/package.json'))"取结果中node_modules之前的路径。
注册插件行:编辑 C:\Users\<你>\.dsh\profiles\web\cordis.patch.yml,追加:
- insert:
- id: project-groups
name: dsh-ProjectModel
重启 dsh:在启动 dsh 的终端 Ctrl+C,然后重新运行 dsh web(或 dsh --profile web)。
刷新浏览器(Ctrl+F5),打开 设置 → 项目组 即可使用。
仓库里还保留了一份
install.ps1(PowerShell 版安装器)。早期版本以 PowerShell 提供,是因为安装动作(junction 链接、与 dsh 的 PowerShell 生态交互)在 PowerShell 里最直接;后来改成了更合理的 Node 版:dsh 本身是 Node 应用、无 PowerShell 编码坑、跨平台、零依赖。两个版本行为一致,二选一即可。
http://127.0.0.1:3080/api/project-groups,应返回 {"groups":[...],...}(未配置时为空列表)在对话里直接说:
E:\proj-a 和 E:\proj-b 加进项目组「后端」”git status”agent 会直接用 project 工具对相应文件夹操作(folderId 指定目标),全部在同一个会话内、无需手动切换。
cordis.patch.yml 删除新增的 insert 块dsh-ProjectModel junction 目录链接plugins\dsh-ProjectModel 目录配置(settings.yaml 里的 project-groups: 段)可手动删除。
Q: 重启后 agent 的普通文件工具(read/write/pwsh)还是不能访问项目文件夹?
这是 dsh 的会话沙箱设计:普通工具被限制在会话工作区内。project 工具是插件自带的通道,不受该限制(写入以目标文件夹为沙箱根)。
Q: 为什么不在左侧栏显示? 见上方「为什么不在左侧栏」:没有可追加的插槽,替换侧栏会破坏原始样式。
Q: 改代码后如何生效? lib/ 改完 → 重启 dsh(宿主)→ 刷新浏览器(客户端 bundle 会以新 rev 下发)。
MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。