deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
ouli-1242/dsh-plugin-tool-management
DSH 插件:一个设置面板,统一管理 MCP 服务器、技能、场景、记忆、子智能体人格、AGENTS.md 预设与归档会话——一个场景即可切换整个环境,模型也能帮你驱动这一切。 | DSH plugin: one settings panel managing MCP servers, skills, scenes, memories, subagent personas, AGENTS.md presets and archived sessions — one scene can switch the environment, and the model can help drive it all too.
PROJECT TOPICS
PROJECT README
简体中文 · English · Changelog · 版本更新概要
DeepSeek Harness 的 MCP、技能、场景、记忆、子智能体、提示词与归档会话管理插件。八个页签:场景 / MCP / 技能 / 子智能体 / 提示词 / 记忆 / 会话 / 兼容。
dsh plugin --profile web add dsh-plugin-tool-management@latest
装完硬刷新浏览器(Cmd/Ctrl+Shift+R),设置 → 工具。插件只写自己的文件,不改技能源文件;重启与升级后配置都在。
![]() |
![]() |
| 场景 | MCP |
![]() |
![]() |
| 技能 | 子智能体 |
![]() |
![]() |
| 提示词 | 记忆 |
![]() |
![]() |
| 会话 | 兼容 |
一句话:把「工作 / 写作 / 编程」各配成一套场景,点一下整套切换;插件管的东西,模型都看得见。
| 亮点 | 说明 |
|---|---|
| 一键换场景 | 每个场景各配一套 MCP / 技能 / 人设 / 记忆(绑了的话还有快捷提示词),进入时整套切换、退出时还原;模型也能按你说的切 |
| 不离开对话就能管 | 在对话输入框打 / 出「工具」段:进场景、启停技能 / MCP / 子智能体 / 提示词 / 记忆,点一下就生效 |
| 记忆自动送到模型眼前 | 每个场景下写几段 .md 就是它的资料库,正文自动进上下文,不用每次复制粘贴 |
| 给 MCP 服务器写备注 | 「A 不可用时改用 B 兜底」这类话写进备注,模型每轮都看得到,会照做 |
| 单个工具也能关 | 一台服务器里可以只停某个工具,模型看不见也调不到;「重启」只重连,不改开关状态 |
| 技能状况一眼看穿 | 哪份在生效标「首选」,被同名覆盖的标出来源 |
| 子智能体 = 一个文件一个角色 | 写一份角色说明就能派活;跑完只回结果、不占你的会话记录 |
| 提示词备好几套 | AGENTS.md 可以存多份、一键切换;场景可以各自绑一份 |
| 会话不再丢 | 归档按项目分组、能搜、能批量恢复;Claude Code / Cursor / Codex 的记录能导进来 |
| 模型一定看得见 | 六个域各注入一条上下文,内容没变不重发;压制型预设下默认不注入,可在「兼容」页开 |
| 锁住就不怕手滑 | 场景可以上锁:五个域的增删改整体只读,先解锁才能改 |
| 删了能找回 | 技能 / 记忆 / 人设 / 提示词 / 场景的删除都进回收站(会话永久删除是例外) |
| 安全、不添乱 | 只写自己的文件;密钥默认打码、看明文要令牌 |
前置:DSH 已安装(dsh web 可运行),Node.js ≥ 18。
dsh plugin --profile web add dsh-plugin-tool-management@latest # 安装 / 更新
dsh plugin --profile web remove dsh-plugin-tool-management # 卸载
装完硬刷新浏览器,设置 → 工具 出现八栏即成功。界面改动即时生效,宿主侧改动需重启 dsh web。
也可以让模型代劳:
安装 dsh-plugin-tool-management 插件:
dsh plugin --profile web add dsh-plugin-tool-management@latest
装完提醒我硬刷新浏览器。
/ 出「工具」段:六行 —— 场景 / 技能 / MCP 服务器 / 子智能体 / 提示词 / 记忆。点一行原地进入这一域的条目(顶栏面包屑点「工具」回上一级),再点一条直接生效。点完菜单不关,接着点下一条也行 —— 连点多个开关是主要用法。当前:工作、3 启用 / 1 停用),不点进去也知道现在什么状况。点下去立刻翻转(本地乐观状态),写失败会翻回来并说明原因。/ 菜单回到出厂样子(修改后重启 DSH 即可生效)。AGENTS.md(单选,各带分组标题),快捷那组 = 这条还开不开着(与提示词页那颗药丸开关同一个动作、同一份状态)。这一域里连已经关着的快捷词也列 —— 管理那一层不该因为被管起来就找不到。.md 文件:memories/<场景>/<名>.md,整篇正文自动注入上下文,文件名支持中文。_shared);进入才按档案整套切换 MCP / 技能 / 人设(绑了的话还有快捷提示词),并把绑定的提示词写进 AGENTS.md。两者必须恒等,而这条恒等由服务端兜住:rules-set-active 先把运行时切到位再写启用集合(切不动就一个字都不写),所以面板开关、/ 菜单、模型工具哪个入口都只发一次调用就两轴齐动。.md / .zip(目录名 = 场景,bundle 带附件),同名跳过绝不覆盖;导出勾选记忆打包成 zip,只读源文件。subagents/<人设>.md,frontmatter 全可选。output: 一行一条写"产出必须长什么样"(可检验的格式要求比一句抽象要求更容易被遵守)。subagent_manager_run 带人设运行、只回最终结果、不进 History。默认新起独立会话(任务要写全);inherit: true 则继承本次会话已完成的轮次(本轮内容继承不到,此时任务仍要写全)。catalogDepth):默认 1 = 只在顶层会话注入目录,99 = 任何深度都注入。它只管目录,不限制嵌套深度(那由宿主决定)。mcp__* 工具,所以"只勾 read"拦不住暴露 shell 的 MCP 服务器;名单里的名字全都对不上时按"不限制"处理。cordis.patch.yml,改前自动备份。级别分「全局 / 应用级」,新增默认全局。$VAR、!!js 这类间接引用不动;URL 的查询串、user:pass@ 与 #片段 一并打码),看明文要令牌。打码值不会被写回配置 —— 保存时你原样留着的字段会还原成已存的值,地址里没有可还原的原值时整次保存会被拒绝(静默丢掉查询串会留下一个"连得上但认证失败"的地址)。打码只管界面展示,详见「配置与安全」。~/.dsh/AGENTS.md 基线一键应用(下一轮对话生效),保留 5 代备份。AGENTS.md,也答得出来源(会注明"此后文件有变")。AGENTS.md。AGENTS.md;已经亮着的那颗再点一次 = 重新写回(把被手改的文件拉回来)。基线没有"全部不应用"这一态,所以这颗开关关不掉 —— 想换一份就点亮另一份(单选)。/ 点一下就原样贴进输入框,可直接编辑再发送。它不注入上下文,卡片上那颗开关只管一件事 —— 这条还在不在 / 的「快捷提示词」段里出现(关掉时正文与备注都留着;同一颗开关在「工具 › 提示词」那一域里也拨得动)。只由你自己点出来;与全局基线分开存,删除进回收站,也能导出与随迁移快照带走。node scripts/doctor.mjs(体检)、node scripts/host-deps.mjs --fix(依赖对齐)。minimal 这类)下本插件的注入默认停用(跟随预设的设计意图),可在「兼容」页按域强制打开。<system-reminder>,# 板块标题 + 正文 + 一句"以本份为准",只写"现在是什么"、不写指令。你写的内容里出现 </system-reminder> 会被转义。| 内容 | 位置 |
|---|---|
| MCP 定义 | ~/.dsh/cordis.patch.yml(插件只写它;改前自动备份到 hub 的 backups/) |
| 技能策略 / 自定义目录 | ~/.dsh/tool-management/skills-state.json |
| 技能 / 记忆 / 人设 / 预设 | ~/.dsh/tool-management/{skills,memories,subagents,prompts}/ |
| 子智能体启停 | ~/.dsh/tool-management/subagents-index.json |
| 回收站(技能 / 人设 / 预设 / 场景) | ~/.dsh/tool-management/trash/{skills,subagents,prompts,scenes}-trash/ |
| 记忆回收站 | ~/.dsh/tool-management/memories-trash/(在 hub 根下,不在 trash/ 里) |
| 归档账本 / 保留期 | ~/.dsh/tool-management/history-*.json |
| 记忆索引 / 场景 / 档案 | ~/.dsh/tool-management/memories-index.json |
| MCP 侧车(停用表 / 已知工具 / 备注 / 设置) | ~/.dsh/tool-management/mcp-*.json |
| 注入设置(六个域开关) | ~/.dsh/tool-management/inject-settings.json |
| 模型工具表(关掉的工具 + 存下的方案) | ~/.dsh/tool-management/tool-table.json |
| 场景页界面设置(进场景前弹不弹预览卡) | ~/.dsh/tool-management/scene-settings.json |
| 运行日志 / patch 备份 | ~/.dsh/tool-management/tool-management.log · backups/ |
插件安装目录里不存用户数据(dsh plugin update 会整体替换该目录)。备份按每份 patch 文件各留 5 份(全局与每个 profile 各自计),一次批量操作就可能把某层的 5 个槽位吃掉。
| 字段 | 说明 |
|---|---|
token |
访问令牌。设了之后所有写操作 + 明文密钥都要求 x-dsh-token;不设时明文接口一律关闭。也可改用环境变量 DSH_PLUGIN_TOOL_MANAGEMENT_TOKEN。 |
tokenDisabled |
true = 令牌保留在配置里但当前不生效(兼容页「关闭保护」写的就是这一行)。写操作不再要求令牌,明文查看仍然要。 |
maxBodyBytes |
请求体上限,默认 88 MiB。 |
磁盘上的明文(必读):打码只发生在界面展示。MCP 的 env / headers 与插件自己的 token 在 cordis.patch.yml(及各 profile 副本)里始终是明文,而每次改配置前插件会把整份文件备份进 ~/.dsh/tool-management/backups/(不加密、不轮转、卸载也不回收)—— 一份密钥最多有 5 ×(含它的 patch 文件数)+ 1 份明文副本。令牌门禁管的是"谁能通过 HTTP 拿到明文",管不到磁盘读取:真正的防线是操作系统的文件权限。清理入口:设置 → 工具 → 兼容 → 「清理旧备份」(可按层级各删最旧的 N 份,弹窗内二次确认),也可以手工删那个目录下的旧文件。
x-dsh-token,或带浏览器 cookie。{ ok: false, error } —— 脚本分流请以 body.ok 为准。connection 服务时栅栏退到「Host 回环 + 同源」判定,本机进程伪造 Host: localhost 即可调用写 op。转发到局域网 / 公网的场景务必配令牌 —— 陌生人注入 MCP 命令等同远程执行。「选择文件夹」弹窗用的 dir-list 能列出任意绝对路径(只读),同一条前提。__(起名建议):工具全名是 mcp__<服务器名>__<工具名>,所以服务器名里再出现 __ 会让它切不唯一 —— mcp__a__b__c 既可能是服务器 a 的工具 b__c,也可能是服务器 a__b 的工具 c;两个服务器名互为 __ 前缀(a 与 a__b)同理。本轮不收紧校验(今天放行 __ 的 5 处校验一旦收紧,存量服务器会从"能管"变成"管不了",而服务器本身照跑),改为在兼容页出一条提示。工具照常可用,只是界面上的勾选可能落不到停用表里那条键上 —— 起名时避开 __ 就没有这个问题。| 现象 | 解决 |
|---|---|
| 装完没有页面 | 硬刷新;不行重启 DSH。 |
| 重复 MCP 页签 | 删 cordis.patch.yml 里的旧 loader 行后重启。 |
| 改坏配置 DSH 起不来 | 从 ~/.dsh/tool-management/backups/ 取最近的 cordis.patch.yml.<层级>.bak-<时间戳> 覆盖回去(每份 patch 各留 5 份)。 |
| 升级 DSH 后动作不可用 | 设置 → 工具 → 兼容 看原因;doctor.mjs → host-deps.mjs --fix。 |
| 模型调不到某条工具 | 「兼容」页的模型工具表看它是不是被关了(出厂默认关着 15 条);面板和脚本不受影响。 |
approval=never 还要确认吗 |
不弹卡,直接放行并记日志;想问回来切回「工作区内修改」。 |
subagent_manager_run 报 provider 不可用 |
对应 provider 没注册:spawn(默认)/ fork(inherit)分别挂 @deepseek-ai/dsh-subagent-spawn-in-process / -fork-in-process 后重启。 |
场景绑了 A 人设,官方 subagent 还在跑别的 |
官方那两个是宿主的工具,本插件管不到它们的可见性;插件会把分界写进上下文 —— 贴合人设的走 subagent_manager_run,官方只在没有人设贴合或要后台跑时用。 |
npm install
npm run build # tsc + 同步客户端
npm test # 构建 + i18n + 契约测试(纯函数不变量与宿主契约)
npm run check:i18n # 词典自检
npm run doctor # 宿主兼容体检
lib/ 不入版本库,克隆后先 npm run build。改完重启 dsh web 才生效。运行时依赖:fflate(导出打包)、js-yaml(写宿主补丁前的解析校验,惰性加载);@deepseek-ai/* 一律用宿主那份。
部署注意:
npm run build的 profile 镜像清单不含node_modules,本地联调时新增的运行时依赖(如js-yaml)要么在 profile 侧装一份,要么接受"补丁校验跳过并上报"的降级。npm install装到 profile 的正式安装不受影响。
MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。