dsh-plugin-tool-management 0.19.0 → 0.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -10,6 +10,37 @@
10
10
 
11
11
  ---
12
12
 
13
+ ## [0.19.1] - 2026-10-10
14
+
15
+ 提示词预设补上「取消应用」,删除保护与回收站一并修好;回收站新增保留期与批量删除。
16
+
17
+ ### 新增
18
+
19
+ - **「取消应用」**:那颗「生效中」的开关现在能关掉了 —— 把 `AGENTS.md` 恢复成开始应用之前的状态;那时没有这个文件就把文件删掉。点之前弹窗会说清是哪种(删文件时按钮变红),点完给一条回执。
20
+ - **回收站保留期**:可选永久保留 / 7 / 30 / 90 天,超期条目由后台清扫自动永久删除,覆盖提示词预设、快捷提示词、子智能体人设、场景、技能、记忆六类。默认永久保留;改设置从此刻重新计时。
21
+ - **回收站批量永久删除**:条目可勾选,「全选 / 取消全选」与「永久删除 (N)」同一行、就地二次确认。技能回收站按上下两块各一套。
22
+ - **场景表单的「全局提示词」与「快捷提示词」各多一个「无」**;「无」是快捷提示词的第一项,也是新建场景的默认值。
23
+ - **History 页的保留期多了「90 天」**。
24
+
25
+ ### 修复
26
+
27
+ - **「取消应用」回不到「没有文件」**:原本没有 `AGENTS.md` 时,连续应用 a、b 之后取消应用,文件永远不消失。
28
+ - **「取消应用」关不掉**:开始应用之前没有 `AGENTS.md` 时走不通,而界面给出的出路也不成立。
29
+ - **「只有一份预设且它生效中」时开关关不掉、删除也删不掉**(死锁)。
30
+ - **删除保护漏了一类**:当前应用的那份预设能直接删掉,删完 `AGENTS.md` 照旧生效、界面上却再没有预设对应它。
31
+ - **删光预设后又被自动重建**:删掉最后一个预设、刷新列表,同名 `default` 又回来。
32
+ - **删除后留下陈旧记录**:删掉某个预设后「最近一次应用」仍指向它,新建同 id 的预设会被误标。
33
+ - **History 页保留期静默误报**:设置值不在预设里(如 15 天)时显示成「永久保留」,其实会到期自动删。
34
+
35
+ ### 变更
36
+
37
+ - **删除保护改成认两类**:场景绑定的、以及当前应用的那一份。首次打开时自动生成的那份副本仍可直接删。
38
+ - **场景表单三处文案**:「提示词预设」→「全局提示词」,「按场景勾选」→「自定义」,两条「无」改成从"这一格要不要设"的角度说话。
39
+ - **快捷提示词选「无」或「保持现状」时不再显示「本场景启用」勾选卡**。
40
+ - **回收站加高到 760**,提示词回收站拆成上下两块(各自滚动、各自一条批量条)。
41
+
42
+ ---
43
+
13
44
  ## [0.19.0] - 2026-10-07
14
45
 
15
46
  子智能体四件事:人设可以标「允许追问」+ 修好自 0.15.0 起完全不可用的 `subagent_manager_run` + 子代理不再把自己当成主代理 + 人设表单的「高级选项」重排;外加「工具限制」的候选修好并分三段。
package/README.md CHANGED
@@ -1,223 +1,254 @@
1
- # dsh-plugin-tool-management
2
-
3
- [![npm version](https://img.shields.io/npm/v/dsh-plugin-tool-management?logo=npm&color=cb3837)](https://www.npmjs.com/package/dsh-plugin-tool-management)
4
- [![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
5
- [![Node](https://img.shields.io/badge/node-%3E%3D18-339933?logo=node.js)](package.json)
6
- [![GitHub](https://img.shields.io/badge/GitHub-ouli--1242%2Fdsh--plugin--tool--management-181717?logo=github)](https://github.com/ouli-1242/dsh-plugin-tool-management)
7
-
8
- [![DSH Market](https://raw.githubusercontent.com/2BingLing/dsh-market/master/assets/readme/badge-listed-zh.svg)](https://dsh.market/)
9
- [![awesome-dsh-plugin](https://img.shields.io/badge/awesome--dsh--plugin-%E5%B7%B2%E6%94%B6%E5%BD%95-3fb950)](https://awesome-dsh-plugin.com)
10
- [![dshfind](https://dshfind.com/api/badge/ouli-1242/dsh-plugin-tool-management?lang=zh)](https://dshfind.com/zh/plugins/ouli-1242/dsh-plugin-tool-management)
11
- [![0xsline](https://img.shields.io/badge/0xsline-%E5%B7%B2%E6%94%B6%E5%BD%95-3fb950)](https://github.com/0xsline/awesome-deepseek-harness)
12
-
13
- **简体中文** · [English](README_EN.md) · [Changelog](CHANGELOG.md) · [版本更新概要](docs/update.md)
14
-
15
- DeepSeek Harness 的 **MCP、技能、场景、记忆、子智能体、提示词与归档会话**管理插件。八个页签:场景 / MCP / 技能 / 子智能体 / 提示词 / 记忆 / 会话 / 兼容。
16
-
17
- ```sh
18
- dsh plugin --profile web add dsh-plugin-tool-management@latest
19
- ```
20
-
21
- 装完硬刷新浏览器(Cmd/Ctrl+Shift+R),设置 → **工具**。插件只写自己的文件,不改技能源文件;重启与升级后配置都在。
22
-
23
- ---
24
-
25
- ## 截图
26
-
27
- | | |
28
- |:----------------------------:|:------------------------------:|
29
- | ![场景](docs/images/1.png) | ![MCP](docs/images/2.png) |
30
- | **场景** | **MCP** |
31
- | ![技能](docs/images/3.png) | ![子智能体](docs/images/4.png) |
32
- | **技能** | **子智能体** |
33
- | ![提示词](docs/images/5.png) | ![记忆](docs/images/6.png) |
34
- | **提示词** | **记忆** |
35
- | ![会话](docs/images/7.png) | ![兼容](docs/images/8.png) |
36
- | **会话** | **兼容** |
37
-
38
- ## 核心亮点
39
-
40
- 一句话:**把「工作 / 写作 / 编程」各配成一套场景,点一下整套切换;插件管的东西,模型都看得见。**
41
-
42
- | 亮点 | 说明 |
43
- | --------------------------- | ----------------------------------------------------------------------------------------- |
44
- | 一键换场景 | 每个场景各配一套 MCP / 技能 / 人设 / 记忆,进入时整套切换、退出时还原;模型也能按你说的切 |
45
- | 不离开对话就能管 | 对话里打 `/` 出「工具」段,启停各域条目,点一下就生效 |
46
- | 记忆自动送到模型眼前 | 每个场景下写几段 `.md` 就是它的资料库,正文自动进上下文 |
47
- | 给 MCP 服务器写备注 | 写进备注的话模型每轮都看得到,会照做 |
48
- | 单个工具也能关 | 一台服务器里可以只停某个工具,模型看不见也调不到 |
49
- | 技能状况一眼看穿 | 哪份在生效标「首选」,被同名覆盖的标出来源 |
50
- | 子智能体 = 一个文件一个角色 | 写一份角色说明就能派活;跑完只回结果、不占你的会话记录 |
51
- | 提示词备好几套 | `AGENTS.md` 可以存多份、一键切换;场景可以各自绑一份 |
52
- | 会话不再丢 | 归档按项目分组、能搜、能批量恢复;Claude Code / Cursor / Codex 的记录能导进来 |
53
- | 模型一定看得见 | 六个域各注入一条上下文,内容没变不重发 |
54
- | 锁住就不怕手滑 | 场景可以上锁:五个域的增删改整体只读 |
55
- | 删了能找回 | 技能 / 记忆 / 人设 / 提示词 / 场景的删除都进回收站(会话永久删除除外) |
56
- | 安全、不添乱 | 只写自己的文件;密钥默认打码、看明文要令牌 |
57
-
58
- ## 快速开始
59
-
60
- 前置:DSH 已安装(`dsh web` 可运行),Node.js ≥ 18。
61
-
62
- ```sh
63
- dsh plugin --profile web add dsh-plugin-tool-management@latest # 安装 / 更新
64
- dsh plugin --profile web remove dsh-plugin-tool-management # 卸载
65
- ```
66
-
67
- 装完硬刷新浏览器,设置 → **工具** 出现八栏即成功。界面改动即时生效,宿主侧改动需重启 `dsh web`。
68
-
69
- 也可以让模型代劳:
70
-
71
- ```text
72
- 安装 dsh-plugin-tool-management 插件:
73
- dsh plugin --profile web add dsh-plugin-tool-management@latest
74
- 装完提醒我硬刷新浏览器。
75
- ```
76
-
77
- ## 功能
78
-
79
- ### 斜杠命令(在对话里直接管)
80
-
81
- - **打 `/` 出「工具」段**:六行 —— 场景 / 技能 / MCP 服务器 / 子智能体 / 提示词 / 记忆。点一行进这一域,再点一条直接生效;点完菜单不关。
82
- - **状态看得见**:启用项绿勾、停用项空框,右侧灰字是条目备注,域行右侧给当前态摘要。
83
- - **条目多也不挡路**:每域全量列出、面板自己滚;技能按来源目录分组、记忆按场景分组,已启用的排前面。每个外部技能目录另给一行,点它就是启停整个来源。
84
- - **只放可逆动作**:进场景与各类启停;增删改、导入导出、改配置仍各归各页。
85
- - **走宿主官方通道**:用 DSH 的输入触发器接口注册,不 patch 官方包;「兼容 → 注入」里两段各一颗开关。
86
- - **「工具 › 提示词」两类都在**:全局那组选哪一份写进 `AGENTS.md`(单选),快捷那组是启停。
87
- - **「快捷提示词」另起一段**:只列开着的,点一行把存好的话贴进输入框,不自动发送。
88
-
89
- ### 场景与记忆
90
-
91
- - **场景 = 分组,记忆 = `.md` 文件**:`memories/<场景>/<名>.md`,整篇正文自动注入上下文,文件名支持中文。
92
- - **「启用」与「进入」是两件事**:启用决定注入按哪个场景走(单选,全关 = 只注入「全局」与 `_shared`);进入才按档案整套切换 MCP / 技能 / 人设,并把绑定的提示词写进 `AGENTS.md`。
93
- - **场景档案**:每个场景搭配 MCP 工具集 / 技能集 / 子智能体 / 记忆;勾的启用、没勾的停用,整段没建 = 该域全部停用,退出时按进场景前的快照还原。
94
- - **场景锁定**:锁定后 MCP / 技能 / 子智能体 / 记忆 / 提示词五域的增删改整体只读。
95
- - **删除场景 = 连记忆一起删**:场景记录、档案与全部记忆进同一条回收站条目,恢复时整条放回;使用中的场景拒绝删除。
96
- - **导入导出**:`.md` / `.zip`(目录名 = 场景,bundle 带附件),同名跳过绝不覆盖。
97
- - **注入预算**:默认 128 KiB,放不下的跳过并列出清单。
98
- - **子代理会话不另设开关**:注入哪几个域由同一张表决定,但场景与记忆只在顶层注入。
99
-
100
- ### 子智能体
101
-
102
- - **一个文件一个人设**:`subagents/<人设>.md`,frontmatter 全可选;`output:` 一行一条写"产出必须长什么样"。
103
- - **人设正文带一层角色框架**:正文原样用在 `# Persona: <名字>` 标题下,附授权与边界各一行;人设文件本身不用改。
104
- - **委派**:`subagent_manager_run` 带人设运行、只回最终结果、不进 History;默认新起独立会话,`inherit: true` 继承本次会话已完成的轮次。
105
- - **启停与目录**:停用的人设不注入、模型不可见(文件不动);新建 / 导入 / 恢复默认停用。人设目录只列名字 + 描述。
106
- - **目录注入深度(`catalogDepth`)**:默认 `1` = 只在顶层会话注入目录,`99` = 任何深度都注入;不限制嵌套深度。
107
- - **工具限制按 Agent 预设**:每个预设一份白 / 黑名单(互斥),候选只列该预设自己的工具,分「插件工具 / 官方工具 / 其他工具」三段;白名单会并回当前所有 `mcp__*` 工具(只勾 `read` 拦不住 MCP 里的 shell),保留名 `run_code` 会被剔除并注明。
108
- - **模型与来源**:都从宿主 LLM 目录里选(选定来源后模型只列该来源的);留空 = 继承主会话。
109
- - **思考强度**:档位由所选模型声明;指定了模型时留空 = 用该模型的默认档位。
110
-
111
- ### MCP 服务
112
-
113
- - **增删改查、即改即生效**:写入 `cordis.patch.yml`,改前自动备份。级别分「全局 / 应用级」,新增默认全局。
114
- - **工具级开关**:单个工具可独立停用(模型看不见也调不到),整台支持批量。
115
- - **停着也能看清单**:没在跑的服务器仍显示上次见过的工具名与描述(标「上次运行时」);从没跑过的可以一键启动读取。
116
- - **备注**:每台服务器可写一句给模型的提示,随状态段一起注入;曾经连上过、现在连不上的会列出来并标注。
117
- - **密钥打码**:默认把凭据整值打码(`$VAR`、`!!js` 这类间接引用不动),看明文要令牌;打码值不会被写回配置。
118
- - **迁移与备份**:跨项目级 / 全局迁移失败自动回滚;支持 JSON 导出导入。
119
-
120
- ### 技能
121
-
122
- - **来源一览**:项目级 / DSH / Agents / Codex / Claude / 自定义目录,按来源分组。
123
- - **两组权限相反**:默认来源的技能可删可停;外部目录可以停用或移除,但里面的技能文件只读。
124
- - **移除 ≠ 停用**:移除 = 连目录都不扫(文件零改动,可恢复);停用 = 仍列出但不可调用。
125
- - **同名谁在生效**:生效的那份标「首选」,被覆盖的标出来源。
126
- - **自定义目录 / ZIP 导入导出 / 回收站**。
127
-
128
- ### 提示词预设
129
-
130
- - 多套 `~/.dsh/AGENTS.md` 基线一键应用(下一轮对话生效),保留 5 代备份。
131
- - **记得「最近一次应用的是哪份」**:就算你手改过 `AGENTS.md`,也答得出来源。
132
- - 每条预设可写一句"这份是干什么的",只存在插件侧、不进 `AGENTS.md`。
133
- - **被引用的不能删**(场景绑定 / 当前内容 / 退出场景要恢复的那一份),删除进回收站。
134
- - **生效与否就是卡片左边那颗开关**:点亮 = 把这一份写进 `AGENTS.md`;基线是单选,所以关不掉 —— 想换一份就点亮另一份。
135
- - 场景接管期间点亮另一份 = 把该场景改绑到那一份;锁定时拒绝。
136
- - **快捷提示词**(同页第二段):存一段常用的话,`/` 里点一下就原样贴进输入框;它不注入上下文,卡片上那颗开关只管这条在 `/` 里出不出现。
137
- - **场景可以绑定一组快捷提示词**:进入本场景只启用勾的那几条、其余停用,退出按进场景前的开关还原。
138
- - **两组各自是一张可折叠卡片**(点卡片头收起 / 展开);快捷那组卡片头有「全选 / 取消全选」,全局那组没有 —— 那一档是单选。
139
-
140
- ### 历史会话
141
-
142
- - 按项目分组、搜索、批量恢复 / 永久删除、保留期自动清理;工作区登记被删后可一键重新登记。
143
- - 导入 Claude Code / Cursor / Codex / 任意文本(工作区可挑、可浏览、可给路径);导出 Markdown / JSONL,分三档累进:仅正文 → 正文 + 工具 → 正文 + 工具 + 思考。**导出是转录,不是备份** —— 要留全量请用「归档」。
144
-
145
- ### 宿主兼容
146
-
147
- - **「兼容」页**:宿主版本、能力可用数、每个动作走原生 / 适配 / 不可用、降级项与原因;三个写入口:访问令牌、注入设置、模型工具表。
148
- - **命令行**:`node scripts/doctor.mjs`(体检)、`node scripts/host-deps.mjs --fix`(依赖对齐)。
149
- - **压制型预设**(`minimal` 这类)下本插件的注入默认停用,可在「兼容」页按域强制打开。
150
- - **关掉「技能」「提示词」的勾选 = 连宿主那份一起停**(这两域在标准预设下由官方送);其余三域勾选完全生效。
151
- - **注入长什么样**:每个域一条 `<system-reminder>`,`# 板块标题` + 正文 + 一句"以本份为准";正文里的 `</system-reminder>` 会被转义。
152
-
153
- ---
154
-
155
- ## 数据落点
156
-
157
- | 内容 | 位置 |
158
- | ------------------------------------------- | ------------------------------------------------------------------------- |
159
- | MCP 定义 | `~/.dsh/cordis.patch.yml`(插件只写它;改前自动备份到 hub 的 `backups/`) |
160
- | 技能策略 / 自定义目录 | `~/.dsh/tool-management/skills-state.json` |
161
- | 技能 / 记忆 / 人设 / 预设 | `~/.dsh/tool-management/{skills,memories,subagents,prompts}/` |
162
- | 子智能体启停 | `~/.dsh/tool-management/subagents-index.json` |
163
- | 回收站(技能 / 人设 / 预设 / 场景) | `~/.dsh/tool-management/trash/{skills,subagents,prompts,scenes}-trash/` |
164
- | 记忆回收站 | `~/.dsh/tool-management/memories-trash/`(在 hub 根下,不在 `trash/` 里) |
165
- | 归档账本 / 保留期 | `~/.dsh/tool-management/history-*.json` |
166
- | 记忆索引 / 场景 / 档案 | `~/.dsh/tool-management/memories-index.json` |
167
- | MCP 侧车(停用表 / 已知工具 / 备注 / 设置) | `~/.dsh/tool-management/mcp-*.json` |
168
- | 注入设置(六个域开关) | `~/.dsh/tool-management/inject-settings.json` |
169
- | 模型工具表(关掉的工具 + 存下的方案) | `~/.dsh/tool-management/tool-table.json` |
170
- | 场景页界面设置(进场景前弹不弹预览卡) | `~/.dsh/tool-management/scene-settings.json` |
171
- | 运行日志 / patch 备份 | `~/.dsh/tool-management/tool-management.log` · `backups/` |
172
-
173
- **插件安装目录里不存用户数据**(`dsh plugin update` 会整体替换该目录)。备份按**每份 patch 文件各留 5 份**(全局与每个 profile 各自计),一次批量操作就可能把某层的 5 个槽位吃掉。
174
-
175
- ## 配置与安全
176
-
177
- | 字段 | 说明 |
178
- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
179
- | `token` | 访问令牌。设了之后**所有写操作 + 明文密钥**都要求 `x-dsh-token`;不设时明文接口一律关闭。也可改用环境变量 `DSH_PLUGIN_TOOL_MANAGEMENT_TOKEN`。 |
180
- | `tokenDisabled` | `true` = 令牌保留在配置里但当前不生效(兼容页「关闭保护」写的就是这一行)。写操作不再要求令牌,明文查看仍然要。 |
181
- | `maxBodyBytes` | 请求体上限,默认 88 MiB。 |
182
-
183
- **磁盘上的明文(必读)**:打码**只发生在界面展示**;MCP 的 `env` / `headers` 与插件自己的 `token` 在 `cordis.patch.yml`(及各 profile 副本)里始终明文,改配置前整份文件会备份进 `~/.dsh/tool-management/backups/`(不加密、不轮转、卸载也不回收)—— 一份密钥最多有 `5 ×(含它的 patch 文件数)+ 1` 份明文副本。令牌门禁**管不到磁盘读取**,防线是操作系统的文件权限。清理入口:**设置 → 工具 → 兼容 → 「清理旧备份」**。
184
-
185
- - **浏览器**:读写走 cookie,不需要令牌;**明文密钥**(显示密钥 / 导出)要令牌。令牌在「兼容」页的「访问令牌」块管理:本次启动填一次管到 DSH 退出;写进配置文件要重启生效。
186
- - **销毁方向一律要当场再输一次当前令牌**(关闭保护 / 修改 / 删除)—— 本次启动解锁过不算。
187
- - **curl / 脚本**:带 `x-dsh-token`,或带浏览器 cookie。
188
- - **HTTP 状态码**:除安全栅栏的 401 / 403 外,一律 HTTP 200 + `{ ok: false, error }` —— 脚本分流请以 `body.ok` 为准。
189
- - **端口转发**:宿主缺 `connection` 服务时栅栏退到「Host 回环 + 同源」判定,本机进程伪造 `Host: localhost` 即可调用写 op。转发到局域网 / 公网的场景**务必配令牌** —— 陌生人注入 MCP 命令等同远程执行;「选择文件夹」弹窗用的 `dir-list` 能列出任意绝对路径(只读),同一条前提。
190
- - **服务器名避开 `__`(起名建议)**:工具全名是 `mcp__<服务器名>__<工具名>`,服务器名里再有 `__` 会让它切不唯一,界面上的勾选可能落不到停用表里那条键上。本轮不收紧校验,改为在**兼容页**出一条提示;起名时避开 `__` 就没有这个问题。
191
-
192
- ## 常见问题
193
-
194
- | 现象 | 解决 |
195
- | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
196
- | 装完没有页面 | 硬刷新;不行重启 DSH。 |
197
- | 重复 MCP 页签 | 删 `cordis.patch.yml` 里的旧 loader 行后重启。 |
198
- | 改坏配置 DSH 起不来 | 从 `~/.dsh/tool-management/backups/` 取最近的 `cordis.patch.yml.<层级>.bak-<时间戳>` 覆盖回去(每份 patch 各留 5 份)。 |
199
- | 升级 DSH 后动作不可用 | 设置 → 工具 → **兼容** 看原因;`doctor.mjs` → `host-deps.mjs --fix`。 |
200
- | 模型调不到某条工具 | 「兼容」页的**模型工具表**看它是不是被关了(出厂默认关着 15 条);面板和脚本不受影响。 |
201
- | `approval=never` 还要确认吗 | 不弹卡,直接放行并记日志;想问回来切回「工作区内修改」。 |
202
- | `subagent_manager_run` 报 provider 不可用 | 对应 provider 没注册:`spawn`(默认)/ `fork`(`inherit`)分别挂 `@deepseek-ai/dsh-subagent-spawn-in-process` / `-fork-in-process` 后重启。 |
203
- | 场景绑了 A 人设,官方 `subagent` 还在跑别的 | 官方那两个是宿主的工具,本插件管不到;贴合人设的走 `subagent_manager_run`,官方只在没有人设贴合或要后台跑时用。 |
204
-
205
- ---
206
-
207
- ## 开发
208
-
209
- ```bash
210
- npm install
211
- npm run build # tsc + 同步客户端
212
- npm test # 构建 + i18n + 契约测试(纯函数不变量与宿主契约)
213
- npm run check:i18n # 词典自检
214
- npm run doctor # 宿主兼容体检
215
- ```
216
-
217
- `lib/` 不入版本库,克隆后先 `npm run build`。改完重启 `dsh web` 才生效。运行时依赖:`fflate`(导出打包)、`js-yaml`(写宿主补丁前的解析校验,惰性加载);`@deepseek-ai/*` 一律用宿主那份。
218
-
219
- > **部署注意**:`npm run build` 的 profile 镜像清单**不含 `node_modules`**,本地联调时新增的运行时依赖(如 `js-yaml`)要么在 profile 侧装一份,要么接受"补丁校验跳过并上报"的降级。`npm install` 装到 profile 的正式安装不受影响。
220
-
221
- ## 许可证
222
-
223
- MIT
1
+ <p align="center">
2
+ <img src="docs/images/logo.png" width="120" height="120" alt="dsh-plugin-tool-management">
3
+ </p>
4
+
5
+ # dsh-plugin-tool-management
6
+
7
+ ![npm version](https://img.shields.io/npm/v/dsh-plugin-tool-management?logo=npm\&color=cb3837)
8
+
9
+ ![License](https://img.shields.io/badge/license-MIT-blue)
10
+
11
+ ![Node](https://img.shields.io/badge/node-%3E%3D18-339933?logo=node.js)
12
+
13
+ ![GitHub](https://img.shields.io/badge/GitHub-ouli--1242%2Fdsh--plugin--tool--management-181717?logo=github)
14
+
15
+ ![DSH Market](https://raw.githubusercontent.com/2BingLing/dsh-market/master/assets/readme/badge-listed-zh.svg)
16
+
17
+ ![awesome-dsh-plugin](https://img.shields.io/badge/awesome--dsh--plugin-%E5%B7%B2%E6%94%B6%E5%BD%95-3fb950)
18
+
19
+ ![dshfind](https://dshfind.com/api/badge/ouli-1242/dsh-plugin-tool-management?lang=zh)
20
+
21
+ ![0xsline](https://img.shields.io/badge/0xsline-%E5%B7%B2%E6%94%B6%E5%BD%95-3fb950)
22
+
23
+ **简体中文** · [English](README_EN.md) · [Changelog](CHANGELOG.md) · [版本更新概要](docs/update.md)
24
+
25
+ DeepSeek Harness 的 **MCP、技能、场景、记忆、子智能体、提示词与归档会话**管理插件。八个页签:场景 / MCP / 技能 / 子智能体 / 提示词 / 记忆 / 会话 / 兼容。
26
+
27
+ ```sh
28
+ dsh plugin --profile web add dsh-plugin-tool-management@latest # web 版
29
+ dsh plugin --profile desktop add dsh-plugin-tool-management@latest # 桌面版
30
+ ```
31
+
32
+ 装完 web 版硬刷新浏览器(Cmd/Ctrl+Shift+R),桌面版重启应用,设置 → **工具**。插件只写自己的文件,不改技能源文件;重启与升级后配置都在。
33
+
34
+ ---
35
+
36
+ ## 演示视频
37
+
38
+ <video controls src="https://github.com/user-attachments/assets/3bed27b0-2d73-4e89-b1dd-f2b1cbd6eaca"></video>
39
+
40
+ 画面里每一个界面都是真机截图,没有重画的 UI,也没有伪造控件。
41
+
42
+ 背景音乐:Kevin MacLeod「Limit 70」,[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)。
43
+
44
+ ---
45
+
46
+ ## 截图
47
+
48
+ | | |
49
+ | :-----: | :------: |
50
+ | 场景 | MCP |
51
+ | **场景** | **MCP** |
52
+ | 技能 | 子智能体 |
53
+ | **技能** | **子智能体** |
54
+ | 提示词 | 记忆 |
55
+ | **提示词** | **记忆** |
56
+ | 会话 | 兼容 |
57
+ | **会话** | **兼容** |
58
+
59
+ ## 核心亮点
60
+
61
+ 一句话:**把「工作 / 写作 / 编程」各配成一套场景,点一下整套切换;插件管的东西,模型都看得见。**
62
+
63
+ | 亮点 | 说明 |
64
+ | --------------- | ----------------------------------------------------------------------- |
65
+ | 一键换场景 | 每个场景各配一套 MCP / 技能 / 人设 / 记忆,进入时整套切换、退出时还原;模型也能按你说的切 |
66
+ | 不离开对话就能管 | 对话里打 `/` 出「工具」段,启停各域条目,点一下就生效 |
67
+ | 记忆自动送到模型眼前 | 每个场景下写几段 `.md` 就是它的资料库,正文自动进上下文 |
68
+ | 给 MCP 服务器写备注 | 写进备注的话模型每轮都看得到,会照做 |
69
+ | 单个工具也能关 | 一台服务器里可以只停某个工具,模型看不见也调不到 |
70
+ | 技能状况一眼看穿 | 哪份在生效标「首选」,被同名覆盖的标出来源 |
71
+ | 子智能体 = 一个文件一个角色 | 写一份角色说明就能派活;跑完只回结果、不占你的会话记录 |
72
+ | 提示词备好几套 | `AGENTS.md` 可以存多份、一键切换;场景可以各自绑一份,也可以选「无」(不绑) |
73
+ | 会话不再丢 | 归档按项目分组、能搜、能批量恢复;Claude Code / Cursor / Codex 的记录能导进来 |
74
+ | 模型一定看得见 | 六个域各注入一条上下文,内容没变不重发 |
75
+ | 锁住就不怕手滑 | 场景可以上锁:五个域的增删改整体只读 |
76
+ | 删了能找回 | 技能 / 记忆 / 人设 / 提示词 / 场景的删除都进回收站(会话永久删除除外);可勾选批量永久删除,也可设保留期让它自动清(默认永久保留) |
77
+ | 安全、不添乱 | 只写自己的文件;密钥默认打码、看明文要令牌 |
78
+
79
+ ## 快速开始
80
+
81
+ 前置:DSH 已安装(`dsh web` 可运行),Node.js ≥ 18。命令按端选:`--profile web` 装 web 版,`--profile desktop` 装桌面版。桌面版的 profile 由 DSH Desktop 自己初始化 —— 先打开过一次应用,执行命令前把它完全退出。
82
+
83
+ ```sh
84
+ dsh plugin --profile web add dsh-plugin-tool-management@latest # web 版 · 安装 / 更新
85
+ dsh plugin --profile web remove dsh-plugin-tool-management # web 版 · 卸载
86
+ dsh plugin --profile desktop add dsh-plugin-tool-management@latest # 桌面版 · 安装 / 更新
87
+ dsh plugin --profile desktop remove dsh-plugin-tool-management # 桌面版 · 卸载
88
+ ```
89
+
90
+ 装完 web 版硬刷新浏览器、桌面版重启应用,设置 → **工具** 出现八栏即成功。界面改动即时生效,宿主侧改动需重启(web 重启 `dsh web`,桌面重启桌面应用)。
91
+
92
+ 也可以让模型代劳:
93
+
94
+ ```text
95
+ 安装 dsh-plugin-tool-management 插件:
96
+ dsh plugin --profile web add dsh-plugin-tool-management@latest
97
+ 装完提醒我硬刷新浏览器。
98
+ ```
99
+
100
+ 桌面版把 `web` 换成 `desktop`,最后一句改成「装完提醒我重启桌面应用」。
101
+
102
+ ## 功能
103
+
104
+ ### 斜杠命令(在对话里直接管)
105
+
106
+ - **打 `/` 出「工具」段**:六行 —— 场景 / 技能 / MCP 服务器 / 子智能体 / 提示词 / 记忆。点一行进这一域,再点一条直接生效;点完菜单不关。
107
+ - **状态看得见**:启用项绿勾、停用项空框,右侧灰字是条目备注,域行右侧给当前态摘要。
108
+ - **条目多也不挡路**:每域全量列出、面板自己滚;技能按来源目录分组、记忆按场景分组,已启用的排前面。每个外部技能目录另给一行,点它就是启停整个来源。
109
+ - **只放可逆动作**:进场景与各类启停;增删改、导入导出、改配置仍各归各页。
110
+ - **走宿主官方通道**:用 DSH 的输入触发器接口注册,不 patch 官方包;「兼容 → 注入」里两段各一颗开关。
111
+ - **「工具 › 提示词」两类都在**:全局那组选哪一份写进 `AGENTS.md`(单选),快捷那组是启停。
112
+ - **「快捷提示词」另起一段**:只列开着的,点一行把存好的话贴进输入框,不自动发送。
113
+
114
+ ### 场景与记忆
115
+
116
+ - **场景 = 分组,记忆 = `.md` 文件**:`memories/<场景>/<名>.md`,整篇正文自动注入上下文,文件名支持中文。
117
+ - **「启用」与「进入」是两件事**:启用决定注入按哪个场景走(单选,全关 = 只注入「全局」与 `_shared`);进入才按档案整套切换 MCP / 技能 / 人设,并把绑定的提示词写进 `AGENTS.md`。
118
+ - **场景档案**:每个场景搭配 MCP 工具集 / 技能集 / 子智能体 / 记忆;勾的启用、没勾的停用,整段没建 = 该域全部停用,退出时按进场景前的快照还原。
119
+ - **「全局提示词」与「快捷提示词」这两格另给「无」**:前者 = 这个场景不碰 `AGENTS.md`(进出都保持原样),后者 = 进入后一条快捷提示词都不启用,也是新建场景的默认值(排在选项第一位)。两者都区别于「保持现状」——那一档才是真的不动。快捷提示词选「无」或「保持现状」时,下面那张「本场景启用」的勾选卡不出现(没有可勾的东西);只有选「自定义」才出现,勾哪几条就是哪几条。
120
+ - **场景锁定**:锁定后 MCP / 技能 / 子智能体 / 记忆 / 提示词五域的增删改整体只读。
121
+ - **删除场景 = 连记忆一起删**:场景记录、档案与全部记忆进同一条回收站条目,恢复时整条放回;使用中的场景拒绝删除。
122
+ - **导入导出**:`.md` / `.zip`(目录名 = 场景,bundle 带附件),同名跳过绝不覆盖。
123
+ - **注入预算**:默认 128 KiB,放不下的跳过并列出清单。
124
+ - **子代理会话不另设开关**:注入哪几个域由同一张表决定,但场景与记忆只在顶层注入。
125
+
126
+ ### 子智能体
127
+
128
+ - **一个文件一个人设**:`subagents/<人设>.md`,frontmatter 全可选;`output:` 一行一条写"产出必须长什么样"。
129
+ - **人设正文带一层角色框架**:正文原样用在 `# Persona: <名字>` 标题下,附授权与边界各一行;人设文件本身不用改。
130
+ - **委派**:`subagent_manager_run` 带人设运行、只回最终结果、不进 History;默认新起独立会话,`inherit: true` 继承本次会话已完成的轮次。
131
+ - **启停与目录**:停用的人设不注入、模型不可见(文件不动);新建 / 导入 / 恢复默认停用。人设目录只列名字 + 描述。
132
+ - **目录注入深度(`catalogDepth`)**:默认 `1` = 只在顶层会话注入目录,`99` = 任何深度都注入;不限制嵌套深度。
133
+ - **工具限制按 Agent 预设**:每个预设一份白 / 黑名单(互斥),候选只列该预设自己的工具,分「插件工具 / 官方工具 / 其他工具」三段;白名单会并回当前所有 `mcp__*` 工具(只勾 `read` 拦不住 MCP 里的 shell),保留名 `run_code` 会被剔除并注明。
134
+ - **模型与来源**:都从宿主 LLM 目录里选(选定来源后模型只列该来源的);留空 = 继承主会话。
135
+ - **思考强度**:档位由所选模型声明;指定了模型时留空 = 用该模型的默认档位。
136
+
137
+ ### MCP 服务
138
+
139
+ - **增删改查、即改即生效**:写入 `cordis.patch.yml`,改前自动备份。级别分「全局 / 应用级」,新增默认全局。
140
+ - **工具级开关**:单个工具可独立停用(模型看不见也调不到),整台支持批量。
141
+ - **停着也能看清单**:没在跑的服务器仍显示上次见过的工具名与描述(标「上次运行时」);从没跑过的可以一键启动读取。
142
+ - **备注**:每台服务器可写一句给模型的提示,随状态段一起注入;曾经连上过、现在连不上的会列出来并标注。
143
+ - **密钥打码**:默认把凭据整值打码(`$VAR`、`!!js` 这类间接引用不动),看明文要令牌;打码值不会被写回配置。
144
+ - **迁移与备份**:跨项目级 / 全局迁移失败自动回滚;支持 JSON 导出导入。
145
+
146
+ ### 技能
147
+
148
+ - **来源一览**:项目级 / DSH / Agents / Codex / Claude / 自定义目录,按来源分组。
149
+ - **两组权限相反**:默认来源的技能可删可停;外部目录可以停用或移除,但里面的技能文件只读。
150
+ - **移除 ≠ 停用**:移除 = 连目录都不扫(文件零改动,可恢复);停用 = 仍列出但不可调用。
151
+ - **同名谁在生效**:生效的那份标「首选」,被覆盖的标出来源。
152
+ - **自定义目录 / ZIP 导入导出 / 回收站**。
153
+
154
+ ### 提示词预设
155
+
156
+ - 多套 `~/.dsh/AGENTS.md` 基线一键应用(下一轮对话生效),保留 5 代备份。
157
+ - **记得「最近一次应用的是哪份」**:就算你手改过 `AGENTS.md`,也答得出来源。
158
+ - 每条预设可写一句"这份是干什么的",只存在插件侧、不进 `AGENTS.md`。
159
+ - **两类不能直接删**:**被场景绑定的**(删了场景会静默失效)、以及**当前应用的那一份**(删了 `AGENTS.md` 内容一字不变、照旧生效,但界面上再没有预设对应它)。后者先点左边那颗开关「取消应用」就能删了。删除一律进回收站。
160
+ - **首次打开时自动生成的那份副本可以直接删**:它内容与 `AGENTS.md` 相同、界面也标「文件里是它」,但从未被「应用」过 —— 删它不影响全局提示词(删预设本来就不碰 `AGENTS.md`)。「退出场景要恢复的那一份」也照旧只标出来、不拦删除,因为恢复用的是快照里的正文。
161
+ - **生效与否就是卡片左边那颗开关**:点亮 = 把这一份写进 `AGENTS.md`;再点一下 = **取消应用**,把基线恢复成**链起点**(这一串应用/取消往复开始之前的状态)—— 起点有内容就把那份内容写回去,起点根本没有 `AGENTS.md` 就把文件删掉。点之前弹窗会说清是哪种(删文件时按钮变红),点完还给一条回执说明到底做了什么。
162
+ - **「取消应用」一步回到链起点,不是只退一步**:连续应用过 A、B 时,取消应用直接回到「应用 A 之前」,而不是退回 A 的内容;想换成 A 就点 A 自己的开关,效果等价。中途每一份内容都还留在 `__last-applied__/AGENTS.md.bak-*`(保留 5 代),所以还能再应用回来。从没「应用」过(例如首次打开时自动生成的那份预设)则没有链起点可回,点开关只会说明原因与出路。
163
+ - 场景接管期间点亮另一份 = 把该场景改绑到那一份;锁定时拒绝。
164
+ - **快捷提示词**(同页第二段):存一段常用的话,`/` 里点一下就原样贴进输入框;它不注入上下文,卡片上那颗开关只管这条在 `/` 里出不出现。
165
+ - **场景可以绑定一组快捷提示词**:进入本场景只启用勾的那几条、其余停用,退出按进场景前的开关还原;也可以选「无」,一条都不启用。
166
+ - **两组各自是一张可折叠卡片**(点卡片头收起 / 展开);快捷那组卡片头有「全选 / 取消全选」,全局那组没有 —— 那一档是单选。
167
+ - **这一页的回收站按域拆成上下两块**:「提示词预设」与「快捷提示词」各自滚动、**各自一条**「已选 N 项 + 全选 + 永久删除 (N)」。两块的后果不同(删的是两个不同的目录),排在一条长列表里再配一颗共用的删除键,勾完之后就看不出那一键会删掉哪几个。技能页的回收站同样分两块(「不再读取的来源」/「回收站里的技能」);场景 / 子智能体 / MCP 三页仍是一条列表、跨组勾选。
168
+
169
+ ### 历史会话
170
+
171
+ - 按项目分组、搜索、批量恢复 / 永久删除、保留期自动清理;工作区登记被删后可一键重新登记。
172
+ - 导入 Claude Code / Cursor / Codex / 任意文本(工作区可挑、可浏览、可给路径);导出 Markdown / JSONL,分三档累进:仅正文 → 正文 + 工具 → 正文 + 工具 + 思考。**导出是转录,不是备份** —— 要留全量请用「归档」。
173
+
174
+ ### 宿主兼容
175
+
176
+ - **「兼容」页**:宿主版本、能力可用数、每个动作走原生 / 适配 / 不可用、降级项与原因;三个写入口:访问令牌、注入设置、模型工具表。
177
+ - **命令行**:`node scripts/doctor.mjs`(体检)、`node scripts/host-deps.mjs --fix`(依赖对齐)。
178
+ - **压制型预设**(`minimal` 这类)下本插件的注入默认停用,可在「兼容」页按域强制打开。
179
+ - **关掉「技能」「提示词」的勾选 = 连宿主那份一起停**(这两域在标准预设下由官方送);其余三域勾选完全生效。
180
+ - **注入长什么样**:每个域一条 `<system-reminder>`,`# 板块标题` + 正文 + 一句"以本份为准";正文里的 `</system-reminder>` 会被转义。
181
+
182
+ ---
183
+
184
+ ## 数据落点
185
+
186
+ | 内容 | 位置 |
187
+ | ---------------------------- | ----------------------------------------------------------------------- |
188
+ | MCP 定义 | `~/.dsh/cordis.patch.yml`(插件只写它;改前自动备份到 hub 的 `backups/`) |
189
+ | 技能策略 / 自定义目录 | `~/.dsh/tool-management/skills-state.json` |
190
+ | 技能 / 记忆 / 人设 / 预设 | `~/.dsh/tool-management/{skills,memories,subagents,prompts}/` |
191
+ | 子智能体启停 | `~/.dsh/tool-management/subagents-index.json` |
192
+ | 回收站(技能 / 人设 / 预设 / 场景) | `~/.dsh/tool-management/trash/{skills,subagents,prompts,scenes}-trash/` |
193
+ | 记忆回收站 | `~/.dsh/tool-management/memories-trash/`(在 hub 根下,不在 `trash/` 里) |
194
+ | 归档账本 / 保留期 | `~/.dsh/tool-management/history-*.json` |
195
+ | 回收站保留期 | `~/.dsh/tool-management/trash-retention.json`(`0` = 永久保留) |
196
+ | 记忆索引 / 场景 / 档案 | `~/.dsh/tool-management/memories-index.json` |
197
+ | MCP 侧车(停用表 / 已知工具 / 备注 / 设置) | `~/.dsh/tool-management/mcp-*.json` |
198
+ | 注入设置(六个域开关) | `~/.dsh/tool-management/inject-settings.json` |
199
+ | 模型工具表(关掉的工具 + 存下的方案) | `~/.dsh/tool-management/tool-table.json` |
200
+ | 场景页界面设置(进场景前弹不弹预览卡) | `~/.dsh/tool-management/scene-settings.json` |
201
+ | 运行日志 / patch 备份 | `~/.dsh/tool-management/tool-management.log` · `backups/` |
202
+
203
+
204
+ **插件安装目录里不存用户数据**(`dsh plugin update` 会整体替换该目录)。备份按**每份 patch 文件各留 5 份**(全局与每个 profile 各自计),一次批量操作就可能把某层的 5 个槽位吃掉。
205
+
206
+ ## 配置与安全
207
+
208
+ | 字段 | 说明 |
209
+ | --------------- | --------------------------------------------------------------------------------------------------- |
210
+ | `token` | 访问令牌。设了之后**所有写操作 + 明文密钥**都要求 `x-dsh-token`;不设时明文接口一律关闭。也可改用环境变量 `DSH_PLUGIN_TOOL_MANAGEMENT_TOKEN`。 |
211
+ | `tokenDisabled` | `true` = 令牌保留在配置里但当前不生效(兼容页「关闭保护」写的就是这一行)。写操作不再要求令牌,明文查看仍然要。 |
212
+ | `maxBodyBytes` | 请求体上限,默认 88 MiB。 |
213
+
214
+ **磁盘上的明文(必读)**:打码**只发生在界面展示**;MCP 的 `env` / `headers` 与插件自己的 `token` 在 `cordis.patch.yml`(及各 profile 副本)里始终明文,改配置前整份文件会备份进 `~/.dsh/tool-management/backups/`(不加密、不轮转、卸载也不回收)—— 一份密钥最多有 `5 ×(含它的 patch 文件数)+ 1` 份明文副本。令牌门禁**管不到磁盘读取**,防线是操作系统的文件权限。清理入口:**设置 → 工具 → 兼容 → 「清理旧备份」**。
215
+
216
+ - **浏览器**:读写走 cookie,不需要令牌;**明文密钥**(显示密钥 / 导出)要令牌。令牌在「兼容」页的「访问令牌」块管理:本次启动填一次管到 DSH 退出;写进配置文件要重启生效。
217
+ - **销毁方向一律要当场再输一次当前令牌**(关闭保护 / 修改 / 删除)—— 本次启动解锁过不算。
218
+ - **curl / 脚本**:带 `x-dsh-token`,或带浏览器 cookie。
219
+ - **HTTP 状态码**:除安全栅栏的 401 / 403 外,一律 HTTP 200 + `{ ok: false, error }` —— 脚本分流请以 `body.ok` 为准。
220
+ - **端口转发**:宿主缺 `connection` 服务时栅栏退到「Host 回环 + 同源」判定,本机进程伪造 `Host: localhost` 即可调用写 op。转发到局域网 / 公网的场景**务必配令牌** —— 陌生人注入 MCP 命令等同远程执行;「选择文件夹」弹窗用的 `dir-list` 能列出任意绝对路径(只读),同一条前提。
221
+ - **服务器名避开 `__`(起名建议)**:工具全名是 `mcp__<服务器名>__<工具名>`,服务器名里再有 `__` 会让它切不唯一,界面上的勾选可能落不到停用表里那条键上。本轮不收紧校验,改为在**兼容页**出一条提示;起名时避开 `__` 就没有这个问题。
222
+
223
+ ## 常见问题
224
+
225
+ | 现象 | 解决 |
226
+ | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
227
+ | 装完没有页面 | 硬刷新;不行重启 DSH。 |
228
+ | 重复 MCP 页签 | 删 `cordis.patch.yml` 里的旧 loader 行后重启。 |
229
+ | 改坏配置 DSH 起不来 | 从 `~/.dsh/tool-management/backups/` 取最近的 `cordis.patch.yml.<层级>.bak-<时间戳>` 覆盖回去(每份 patch 各留 5 份)。 |
230
+ | 升级 DSH 后动作不可用 | 设置 → 工具 → **兼容** 看原因;`doctor.mjs` → `host-deps.mjs --fix`。 |
231
+ | 模型调不到某条工具 | 「兼容」页的**模型工具表**看它是不是被关了(出厂默认关着 15 条);面板和脚本不受影响。 |
232
+ | `approval=never` 还要确认吗 | 不弹卡,直接放行并记日志;想问回来切回「工作区内修改」。 |
233
+ | `subagent_manager_run` 报 provider 不可用 | 对应 provider 没注册:`spawn`(默认)/ `fork`(`inherit`)分别挂 `@deepseek-ai/dsh-subagent-spawn-in-process` / `-fork-in-process` 后重启。 |
234
+ | 场景绑了 A 人设,官方 `subagent` 还在跑别的 | 官方那两个是宿主的工具,本插件管不到;贴合人设的走 `subagent_manager_run`,官方只在没有人设贴合或要后台跑时用。 |
235
+
236
+ ---
237
+
238
+ ## 开发
239
+
240
+ ```bash
241
+ npm install
242
+ npm run build # tsc + 同步客户端
243
+ npm test # 构建 + i18n + 契约测试(纯函数不变量与宿主契约)
244
+ npm run check:i18n # 词典自检
245
+ npm run doctor # 宿主兼容体检
246
+ ```
247
+
248
+ `lib/` 不入版本库,克隆后先 `npm run build`。改完重启 `dsh web` 才生效。运行时依赖:`fflate`(导出打包)、`js-yaml`(写宿主补丁前的解析校验,惰性加载);`@deepseek-ai/*` 一律用宿主那份。
249
+
250
+ > **部署注意**:`npm run build` 的 profile 镜像清单**不含 `node_modules`**,本地联调时新增的运行时依赖(如 `js-yaml`)要么在 profile 侧装一份,要么接受"补丁校验跳过并上报"的降级。`npm install` 装到 profile 的正式安装不受影响。
251
+
252
+ ## 许可证
253
+
254
+ MIT