一份经过实际安装验证的 macOS 教程:包含 Web 工作台、精选插件、独立 TUI、日常使用与故障恢复。
DeepSeek Harness(简称 DSH)是 DeepSeek 推出的开源 Agent Harness。它不是一个模型,而是一套把模型、文件系统、Shell、Skills、MCP、会话和界面组合起来的本地 Agent 运行时。
它最大的特点也是最大的风险:Everything is a plugin。
插件化让 DSH 很灵活,但当前生态仍处于快速发展阶段。插件质量差异明显,不兼容的组合甚至会让 Web 服务无法启动。因此,这篇教程不会追求”装得多”,而是搭建一套职责清晰、可以长期使用的配置:
- Web 工作台负责日常编码和长任务;
- 独立 TUI 提供接近 Claude Code 的终端体验;
- 文件、Git、通知、用量和记忆各选一个插件;
- 不在同一 profile 中叠加功能重复的插件。
本文命令已在以下环境完成实际验证:
| 组件 | 验证版本 |
|---|---|
| macOS | Apple Silicon |
| Node.js | 26.7.0 |
| npm | 11.19.0 |
| DeepSeek Harness | 0.1.1-rc.2 |
| DSH TUI | 0.9.0 |
DSH 目前仍是 Developer Preview,后续版本可能存在破坏性变更。本文固定具体版本和插件提交,避免安装结果随时间漂移。
相关链接:
目录
一、安装前准备
1. 检查 Node.js
DSH 要求:
Node.js ^22.19.0 或 >=24.0.0先检查当前版本:
node -vnpm -vwhich node如果尚未安装 Node.js,在 macOS 上可以使用 Homebrew:
brew install node如果已经通过 Homebrew 安装了旧版本:
brew upgrade nodebrew cleanup node再次确认:
node -v本文验证时使用的是 v26.7.0。Node 23 不在 DSH 支持范围内,不要忽略这一点。
2. 准备 DeepSeek API Key
前往 DeepSeek 开放平台创建 API Key。安装过程中不要把密钥写进项目仓库,也不要直接贴进公开日志。
可以先临时导出:
export DEEPSEEK_API_KEY="你的 API Key"稍后会把它保存到 DSH 自己的配置目录,并限制文件权限。
3. 处理 npm 镜像
如果本机 npm 使用第三方镜像,安装 @deepseek-ai/* 包时可能遇到 403、包不存在或下载中断。
本文所有核心安装命令都显式使用 npm 官方源:
https://registry.npmjs.org/不需要永久修改全局 npm 配置。
二、安装 DeepSeek Harness
1. 安装固定版本
npm install -g @deepseek-ai/dsh@0.1.1-rc.2 \ --registry https://registry.npmjs.org/验证:
which dshdsh --version预期输出:
/opt/homebrew/bin/dsh0.1.1-rc.22. 初始化 Web profile
执行一次配置导出即可初始化 ~/.dsh/profiles/web,无需先常驻启动服务器:
dsh web --dump-default-config > /tmp/dsh-default-config.yml检查目录:
ls -la ~/.dsh/profiles/web正常情况下会看到:
cordis.patch.ymlcordis.ymlpackage.jsonpnpm-workspace.yaml3. 保存 API Key
umask 077printf 'DEEPSEEK_API_KEY=%s\n' "$DEEPSEEK_API_KEY" > ~/.dsh/.envchmod 600 ~/.dsh/.env验证权限:
ls -l ~/.dsh/.env文件权限应为 -rw-------。
DSH 也支持托管凭据文件
~/.dsh/.credentials.yaml。无论采用哪种方式,都不要把密钥写进工作区的.env后提交到 Git。
三、启用官方 Schedule
社区插件统一通过 dsh plugin add 安装。官方可选能力则通过 profile patch 挂载。两者不要混用。
编辑:
~/.dsh/profiles/web/cordis.patch.yml写入:
# 官方可选能力写在这里;社区插件只使用 dsh plugin add 安装- insert: - id: schedule name: '@deepseek-ai/dsh-schedule'验证组合树:
dsh web --dump-config | grep -A 1 -B 1 dsh-schedule如果 --dump-config 能正常结束,并显示 @deepseek-ai/dsh-schedule,说明挂载成功。
不要从旧文章复制
tool-session-query、PTY 或 Hooks 的 YAML。0.1.1-rc.2的公开安装包并没有可直接照抄的独立tool-session-query包,错误的 id 可能被静默跳过,重复 id 则可能直接阻止启动。
四、安装经过筛选的 Web 插件
这套组合只保留六个社区插件:
| 插件 | 用途 |
|---|---|
DSH-better-sidebar | 文件、编辑器、终端、Git 和子代理侧栏 |
dsh-at-file | 在输入框中使用 @file 引用工作区文件 |
dsh-open-in-vscode | 从 Web 工作台打开 VS Code / Cursor |
dsh-notification | 任务完成和异常通知 |
dsh-usage-stats | Token、费用、余额和使用统计 |
dsh-memento | 有边界、可审批、可审计的跨会话记忆 |
没有安装插件市场、皮肤大礼包、多套记忆或第二套侧栏。它们要么功能重叠,要么扩大了冲突面。
1. 允许受信任插件执行构建脚本
部分 Git 插件带有 prepare 脚本。pnpm 默认会阻止执行,并报:
ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED编辑:
~/.dsh/profiles/web/pnpm-workspace.yaml写入以下完整内容:
packages: - .
nodeLinker: hoistedautoInstallPeers: false
allowBuilds: dsh-better-sidebar: true dsh-at-file: true dsh-open-in-vscode: true dsh-notification: true dsh-usage-stats: true dsh-memento: true
onlyBuiltDependencies: - dsh-better-sidebar - dsh-at-file - dsh-open-in-vscode - dsh-notification - dsh-usage-stats - dsh-memento只为明确审查并准备安装的包开放脚本,不要使用全局的”允许全部脚本”设置。
2. 逐个安装并验证
不要一次粘贴六条命令后离开。每安装一个插件,都执行一次 --dump-config。这样如果组合树损坏,可以准确知道最后一个变更是什么。
Better Sidebar
dsh plugin --profile web add \ "github:omdsh-dev/DSH-better-sidebar#d9b8f15d9eab018742f97d67e54b2398504894cd"
dsh web --dump-config | grep -i better-sidebar@file 引用
dsh plugin --profile web add \ "github:FSMargoo/dsh-at-file#c37b0ed9e8bf3585bf9f272462dcf01886efe2a3"
dsh web --dump-config | grep -i dsh-at-file打开编辑器
dsh plugin --profile web add \ "github:omdsh-dev/dsh-open-in-vscode#8aed144abdc158a332aa73bce42fc217d962f751"
dsh web --dump-config | grep -i open-in-vscode桌面通知
dsh plugin --profile web add \ "github:omdsh-dev/dsh-notification#ddec603395a223deb46c75b74274c41849c6a131"
dsh web --dump-config | grep -i dsh-notification用量统计
dsh plugin --profile web add \ "github:Ychris12138/dsh-usage-stats#7c88a445b73f78af7df6082fd671d22a293acb6d"
dsh web --dump-config | grep -i usage-statsMemento 记忆
dsh plugin --profile web add \ "github:PerryLink/dsh-memento#ee198efd71dc60f5cd1cd2019e20c63028d2d182"
dsh web --dump-config | grep -i memento这里选择 Memento,而不是功能更庞杂的”记忆 + 技能进化 + 待办 + 调度”一体化插件。原因很简单:记忆属于高影响能力,边界清晰、可审批、可审计比功能数量更重要。
3. 检查最终组合
dsh plugin --profile web listdsh web --dump-config > /tmp/dsh-web-config.yml检查 bundle 列表:
python3 - <<'PY'import jsonfrom pathlib import Path
profile = Path.home() / ".dsh/profiles/web/package.json"bundles = json.loads(profile.read_text())["dsh"]["profile"]["bundles"]for bundle in bundles: print(bundle)PY最终应包含:
@deepseek-ai/dsh-base@deepseek-ai/dsh-web-appdsh-better-sidebardsh-at-filedsh-open-in-vscodedsh-notification@ychris12138/dsh-usage-statsdsh-memento五、安装独立 TUI
如果希望像使用 Claude Code 一样从终端进入 DSH,安装 dsh-tui。
关键原则:TUI 必须使用独立 profile,不能叠加到 web profile。
错误地把 dsh-web-app 和 TUI 放进同一个 profile,可能出现:
duplicate loader entry id: agent-presetsduplicate loader entry id: storage正确安装方式:
dsh plugin --profile dsh-tui add \ @deepseek-harness-tui/dsh-tui@0.9.0 \ --registry https://registry.npmjs.org/验证:
dsh --profile dsh-tui --dump-config > /tmp/dsh-tui-config.yml检查 profile:
python3 - <<'PY'import jsonfrom pathlib import Path
profile = Path.home() / ".dsh/profiles/dsh-tui/package.json"bundles = json.loads(profile.read_text())["dsh"]["profile"]["bundles"]print(bundles)PY预期:
['@deepseek-ai/dsh-base', '@deepseek-harness-tui/dsh-tui']这里不应出现 @deepseek-ai/dsh-web-app。
六、启动与日常使用
1. 启动 Web 工作台
dsh web默认地址:
http://127.0.0.1:3080如果不希望自动打开浏览器:
dsh web --no-open端口被占用时:
dsh web --port 3081默认只监听 127.0.0.1,不会向局域网暴露。不要为了手机访问直接改成 0.0.0.0;远程访问应额外配置认证和 HTTPS。
2. 第一次创建工作区
打开页面后:
- 选择一个真实 Git 仓库作为 workspace;
- 选择 DeepSeek provider 和模型;
- 日常编码优先选择 Standard 或 PTC;
- 先执行一个只读任务验证工具链。
例如:
列出当前仓库前 10 个文件,并说明项目使用的语言和构建工具。不要修改文件。确认文件读取和工具调用正常后,再让 Agent 修改代码。
3. 使用 @file
在输入框输入 @,搜索并选择工作区文件,然后继续描述任务:
@src/app.ts 分析这个入口的错误处理路径,只分析,不修改。明确引用文件比只写模糊文件名更可靠,也能减少 Agent 在大仓库里无目的搜索。
4. 使用侧栏
Better Sidebar 提供文件、编辑器、终端、Git 和子代理视图。
建议分工:
- 小范围查看和快速编辑留在 Web 工作台;
- 复杂 diff、重构和手工审查通过 Open in VS Code / Cursor 打开;
- Git 推送、删除分支等高风险操作仍由人确认。
不要再叠加第二套侧栏或 web-ui-all。多个插件争用相同 UI slot 是最常见的页面异常来源之一。
5. 使用记忆
Memento 不应被当成”自动保存所有聊天”的黑箱。只保存稳定、可复用的信息,例如:
- 个人编码偏好;
- 项目的长期约定;
- 经验证的构建和测试命令;
- 需要跨会话保留的架构决策。
不要保存:
- API Key、Token 和密码;
- 临时任务进度;
- 未验证的技术推断;
- 很快会过期的日志内容。
首次使用时先保存一条无敏感信息的偏好,然后新建会话验证能否召回。
6. 查看用量与通知
用量统计插件用于观察:
- 输入、输出和缓存 Token;
- 会话成本;
- Provider 余额或配额;
- 不同模型的使用差异。
通知插件需要浏览器授予通知权限。可以启动一个短任务,切到其他窗口,确认任务完成后是否收到通知。
7. 使用 TUI
在终端运行:
dsh --profile dsh-tui恢复会话:
dsh --profile dsh-tui --resumeWeb 和 TUI 可以共享 DSH 的基础配置与会话目录,但拥有独立的 profile 组合。不要为了”配置统一”把两个 bundle 合并。
8. 停止服务
前台运行时按:
Ctrl+C如果此前把 Web 服务放到后台,先找到进程:
pgrep -af "dsh.*web"确认 PID 后再结束对应进程,不要使用模糊的 killall node,否则会误杀其他 Node 服务。
七、完整验收
1. 版本
node -vnpm -vdsh --version2. 配置树
dsh web --dump-config > /tmp/dsh-web-config.ymldsh --profile dsh-tui --dump-config > /tmp/dsh-tui-config.yml两个命令都必须以退出码 0 结束。
3. HTTP 服务
启动 Web 后执行:
curl -sS -o /dev/null \ -w 'HTTP %{http_code}\n' \ http://127.0.0.1:3080/预期:
HTTP 2004. 功能
@file能搜索并引用工作区文件;- 侧栏能打开文件、Git 和终端;
- Open in VS Code / Cursor 能打开当前 workspace;
- 任务完成后能收到浏览器通知;
- Usage Stats 能显示用量;
- Memento 能保存并跨会话召回一条已批准记忆;
- TUI 能独立启动,Web profile 中没有 TUI bundle。
只有这些路径都走通,安装才算真正完成。
八、常见故障
1. npm 返回 403
使用 npm 官方源重试:
npm install -g @deepseek-ai/dsh@0.1.1-rc.2 \ --registry https://registry.npmjs.org/2. Git 插件拒绝执行 prepare
错误:
ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED把错误信息中给出的准确包名加入:
~/.dsh/profiles/web/pnpm-workspace.yaml的 allowBuilds 和 onlyBuiltDependencies,然后重新执行安装命令。不要允许未知包运行安装脚本。
3. Web 启动时报 duplicate loader entry id
根因通常是同一插件同时存在于:
package.json的dsh.profile.bundles;cordis.patch.yml的手工insert。
先检查:
dsh web --dump-configcat ~/.dsh/profiles/web/package.jsoncat ~/.dsh/profiles/web/cordis.patch.yml社区插件应保留在 bundle 中,并删除 patch 里重复的 insert。如果 patch 中有该插件的自定义配置,可以只保留按 id 覆盖的配置,不再 insert。
4. 删除插件后仍无法启动
dsh plugin remove 只删除依赖,不一定清理手工 patch。
dsh plugin --profile web remove <package>随后检查并删除 cordis.patch.yml 中对应的手工挂载。
5. 不要直接删除整个 ~/.dsh
会话和配置都位于 ~/.dsh。Web profile 损坏时,应只重建 profile:
mv ~/.dsh/profiles/web \ ~/.dsh/profiles/web.backup.$(date +%Y%m%d-%H%M%S)
dsh web --dump-default-config > /tmp/dsh-default-config.yml这样可以保留 ~/.dsh/sessions 中的会话记录。
九、更新、备份与卸载
更新前备份
cp ~/.dsh/profiles/web/package.json \ ~/.dsh/profiles/web/package.json.backup
cp ~/.dsh/profiles/web/cordis.patch.yml \ ~/.dsh/profiles/web/cordis.patch.yml.backup
dsh web --dump-config > ~/.dsh/web-config.backup.yml更新原则
- 先阅读 DSH changelog;
- 一次只更新核心或一个插件;
- 每次更新后运行
--dump-config; - 不要让 Git 插件长期跟随
#main; - 核心 rc 变化后,先确认插件兼容性再升级。
本文使用的插件命令已经固定到具体提交。需要升级时,应先在插件仓库确认兼容版本,再替换提交哈希。
卸载插件
dsh plugin --profile web remove <package>dsh web --dump-config卸载 DSH
npm uninstall -g @deepseek-ai/dsh该命令不会自动删除 ~/.dsh。确认不再需要会话和配置后,再手动归档或删除该目录。
结语
DeepSeek Harness 的价值不是插件数量,而是组合能力。一个稳定的工作台应该让每个插件都有明确职责,并且随时可以卸载、验证和回滚。
本文这套配置刻意保持克制:
- 官方核心负责 Agent 主循环与 Schedule;
- Better Sidebar 负责工作区界面;
@file负责精确上下文;- Notification 和 Usage Stats 负责可观察性;
- Memento 负责跨会话记忆;
- TUI 使用独立 profile,避免污染 Web。
先把这套基础能力用稳定,再根据真实需求增加插件。不要从插件市场开始搭建系统——那通常是把排障工作提前埋进未来。