dsh-plugin-tool-management 0.6.0 → 0.8.0
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 +179 -0
- package/README.md +117 -221
- package/README_EN.md +116 -220
- package/docs/images/1/345/234/272/346/231/257.png +0 -0
- package/docs/images/1/345/234/272/346/231/257_en.png +0 -0
- package/docs/images/2MCP.png +0 -0
- package/docs/images/2MCP_en.png +0 -0
- package/docs/images/3/346/212/200/350/203/275.png +0 -0
- package/docs/images/3/346/212/200/350/203/275_en.png +0 -0
- package/docs/images/4/345/255/220/346/231/272/350/203/275/344/275/223.png +0 -0
- package/docs/images/4/345/255/220/346/231/272/350/203/275/344/275/223_en.png +0 -0
- package/docs/images/5/346/217/220/347/244/272/350/257/215.png +0 -0
- package/docs/images/5/346/217/220/347/244/272/350/257/215_en.png +0 -0
- package/docs/images/6/350/256/260/345/277/206.png +0 -0
- package/docs/images/6/350/256/260/345/277/206_en.png +0 -0
- package/docs/images/7/344/274/232/350/257/235.png +0 -0
- package/docs/images/7/344/274/232/350/257/235_en.png +0 -0
- package/docs/images/8/345/205/274/345/256/271.png +0 -0
- package/docs/images/8/345/205/274/345/256/271_en.png +0 -0
- package/docs/update.md +56 -38
- package/lib/agents-md/service.js +84 -5
- package/lib/client.js +1488 -475
- package/lib/compat/preset-reach.js +425 -0
- package/lib/compat/probe.js +8 -0
- package/lib/http-fence.js +21 -0
- package/lib/hub.js +160 -2
- package/lib/index.js +687 -47
- package/lib/mcp/override-blocks.js +195 -0
- package/lib/mcp/state-section.js +90 -0
- package/lib/prompt-sections.js +148 -0
- package/lib/rules/archive-engine.js +99 -29
- package/lib/rules/archive.js +56 -28
- package/lib/rules/service.js +332 -35
- package/lib/skills/core.js +15 -1
- package/lib/skills/service.js +3 -0
- package/lib/subagents/catalog.js +89 -0
- package/lib/subagents/service.js +384 -41
- package/lib/subagents/tools.js +18 -5
- package/package.json +97 -96
- package/screenshots.json +10 -10
- package/docs/Changelog.md +0 -144
- package/lib/rules/provider.js +0 -121
package/README.md
CHANGED
|
@@ -6,80 +6,68 @@
|
|
|
6
6
|
[](https://github.com/ouli-1242/dsh-plugin-tool-management)
|
|
7
7
|
[](https://dsh.market/)
|
|
8
8
|
|
|
9
|
-
**简体中文** · [English](README_EN.md) · [Changelog](
|
|
9
|
+
**简体中文** · [English](README_EN.md) · [Changelog](CHANGELOG.md) · [版本更新概要](docs/update.md)
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
- **MCP** —— 连了哪些服务、各有哪些工具、哪些该让模型用:增删改查、启停、重启,即改即生效;
|
|
14
|
-
- **Skills** —— 本机各处的技能(DSH / Agents / Codex / Claude / 项目级 / 任意自定义目录)一览,逐个或整组启停、创建、导入、回收;
|
|
15
|
-
- **AGENTS.md** —— 多套全局指令基线预设,一键应用写入 `~/.dsh/AGENTS.md`;
|
|
16
|
-
- **History** —— 归档会话按项目分组管理,批量恢复 / 删除,对话导入导出,保留期自动清理;
|
|
17
|
-
- **场景记忆** —— `memories/<场景>/<名>.md` 一个文件夹一个场景,启用场景里的记忆正文**整篇进系统提示词**,不用每次重复解释。
|
|
18
|
-
|
|
19
|
-
不手改 `cordis.patch.yml`,不碰任何技能源文件,重启与升级后配置依旧。
|
|
11
|
+
- DeepSeek Harness 的 **MCP、技能、场景、记忆、子智能体、提示词与归档会话**管理插件。
|
|
12
|
+
- 八个页签:**场景**、**MCP**、**技能**、**子智能体**、**提示词**、**记忆**、**会话**、**兼容**。
|
|
20
13
|
|
|
21
14
|
```sh
|
|
22
15
|
dsh plugin --profile web add dsh-plugin-tool-management@latest
|
|
23
16
|
```
|
|
24
17
|
|
|
25
|
-
装完硬刷新浏览器(Cmd/Ctrl+Shift-R
|
|
26
|
-
|
|
27
|
-
## 截图
|
|
28
|
-
|
|
29
|
-

|
|
18
|
+
装完硬刷新浏览器(Cmd/Ctrl+Shift-R),设置 → **工具** 即安装成功。不手改 `cordis.patch.yml`,不碰技能源文件,重启与升级后配置依旧。
|
|
30
19
|
|
|
31
|
-
|
|
20
|
+
---
|
|
32
21
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-

|
|
36
|
-
|
|
37
|
-

|
|
38
|
-
|
|
39
|
-

|
|
40
|
-
|
|
41
|
-

|
|
22
|
+
## 截图
|
|
42
23
|
|
|
43
|
-
|
|
24
|
+
| | |
|
|
25
|
+
|:---:|:---:|
|
|
26
|
+
|  |  |
|
|
27
|
+
| **场景** | **MCP** |
|
|
28
|
+
|  |  |
|
|
29
|
+
| **技能** | **子智能体** |
|
|
30
|
+
|  |  |
|
|
31
|
+
| **提示词** | **记忆** |
|
|
32
|
+
|  |  |
|
|
33
|
+
| **会话** | **兼容** |
|
|
44
34
|
|
|
45
35
|
## 核心亮点
|
|
46
36
|
|
|
47
|
-
| 能力 |
|
|
37
|
+
| 能力 | 说明 |
|
|
48
38
|
|---|---|
|
|
49
|
-
|
|
|
50
|
-
| MCP
|
|
51
|
-
|
|
|
52
|
-
|
|
|
53
|
-
|
|
|
54
|
-
|
|
|
55
|
-
|
|
|
56
|
-
|
|
|
57
|
-
|
|
|
58
|
-
|
|
|
59
|
-
|
|
|
60
|
-
|
|
|
61
|
-
|
|
|
62
|
-
|
|
|
63
|
-
|
|
|
64
|
-
| 前缀缓存友好 |
|
|
65
|
-
|
|
|
66
|
-
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
39
|
+
| 场景记忆 | 启用场景里的 `.md` 正文**自动进系统提示词**,下一个请求即生效 |
|
|
40
|
+
| 场景档案 | 每个场景自由搭配 **MCP 工具集 / 技能集 / 子智能体 / 记忆**;打开场景即应用,关闭按快照恢复 |
|
|
41
|
+
| 场景提示词 | 场景绑一份提示词预设,切换场景直接改写 `~/.dsh/AGENTS.md`(关掉自动恢复) |
|
|
42
|
+
| 场景锁定 | 锁住一个场景 = **五个管理域整体只读**(勾没勾的都不能动);未启动不能上锁,锁定中关不掉,先解锁再改 |
|
|
43
|
+
| MCP 工具级开关 | 单台服务器里**单个工具**可独立启停:模型看不见也调不到 |
|
|
44
|
+
| 重启语义 | 重启只重连,**不改变启停状态** |
|
|
45
|
+
| 密钥安全 | 密钥默认打码;「显示密钥」与导出**必须带令牌**——没配 `token` 就不给明文 |
|
|
46
|
+
| 技能来源 | 接入 `~/.agents` / `~/.codex` / `~/.claude` 与自定义目录;默认来源必须读取但技能可删 |
|
|
47
|
+
| 回收站 | 人设 / 场景 / 提示词 / 记忆 / 技能删除都进回收站,可恢复 |
|
|
48
|
+
| AGENTS.md 预设 | 多套全局基线,一键应用,保留 5 代备份 |
|
|
49
|
+
| 归档会话 | 按项目分组、批量恢复 / 删除、保留期清理;工作区登记被删后可重建 |
|
|
50
|
+
| 对话导入导出 | 接管 Claude Code / Cursor / Codex / 任意文本;导出 Markdown / JSONL |
|
|
51
|
+
| 导入导出成对 | 技能 / 子智能体 / 提示词 / 记忆都有导出:勾选条目 → 打包 zip 到指定目录(只读源文件) |
|
|
52
|
+
| 子智能体 | 一个文件一个人设,**启停开关**决定是否注入上下文;即用即弃不进 History,自动继承场景记忆 |
|
|
53
|
+
| 上下文可见性 | 人设目录与「当前可用的 MCP server + 你的备注」进入系统提示词,模型自己知道有什么可用 |
|
|
54
|
+
| 前缀缓存友好 | 注入段只由「启用场景 + 文件内容」决定,逐字节稳定 |
|
|
55
|
+
| 兼容体检 | 「兼容」页一屏看清宿主能力、每个动作走原生还是适配、哪些降级 |
|
|
56
|
+
| 模型工具 | **14 个**(`skill_mcp_manager_*` / `skill_manager_*` / `agentsmd_*` / `rule_manager_*` / `subagent_*`) |
|
|
57
|
+
| 界面 | 自有设计系统,**八栏**,中英双语、跟随宿主语言 |
|
|
58
|
+
|
|
59
|
+
## 快速开始
|
|
60
|
+
|
|
61
|
+
前置:DSH 已安装(`dsh web` 可运行),Node.js ≥ 18。
|
|
71
62
|
|
|
72
63
|
```sh
|
|
73
|
-
# 安装 /
|
|
74
|
-
dsh plugin --profile web
|
|
75
|
-
|
|
76
|
-
# 卸载
|
|
77
|
-
dsh plugin --profile web remove dsh-plugin-tool-management
|
|
64
|
+
dsh plugin --profile web add dsh-plugin-tool-management@latest # 安装 / 更新
|
|
65
|
+
dsh plugin --profile web remove dsh-plugin-tool-management # 卸载
|
|
78
66
|
```
|
|
79
67
|
|
|
80
|
-
|
|
68
|
+
装完硬刷新浏览器,设置 → **工具** 出现八栏即成功。客户端改动热加载,宿主侧改动需重启 `dsh web`。
|
|
81
69
|
|
|
82
|
-
|
|
70
|
+
也可以让模型代劳:
|
|
83
71
|
|
|
84
72
|
```text
|
|
85
73
|
安装 dsh-plugin-tool-management 插件:
|
|
@@ -87,213 +75,121 @@ dsh plugin --profile web add dsh-plugin-tool-management@latest
|
|
|
87
75
|
装完提醒我硬刷新浏览器。
|
|
88
76
|
```
|
|
89
77
|
|
|
90
|
-
|
|
78
|
+
模型可用 14 个工具管理上述功能(见亮点表);脚本走 `POST /dsh-plugin-tool-management/api`(`{op, args}` 协议)。
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 功能
|
|
91
83
|
|
|
92
84
|
### 场景与记忆
|
|
93
85
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
-
|
|
98
|
-
-
|
|
99
|
-
-
|
|
100
|
-
-
|
|
101
|
-
-
|
|
102
|
-
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
-
|
|
107
|
-
-
|
|
108
|
-
-
|
|
109
|
-
-
|
|
110
|
-
-
|
|
111
|
-
- **场景档案(四段自由搭配)**:卡片上「档案」打开编辑器,四段各自独立「添加 / 移除」——**MCP 工具集**(两级勾选:先勾服务器,不勾 = 整台停用,勾了但一个工具都不勾 = 该服务器全停)、**技能集**(只列实时发现的条目,勾 = 启用)、**子智能体绑定**(勾人设名单,全不选 = 不限制)、**记忆**(**只列被编辑场景自己的记忆**,可筛选;**只影响注入**,文件与内容一律不动——全局记忆恒定注入、别的场景的勾了也不生效,所以都不在这里出现)。**新添加的段默认一项都不勾**:记忆段只预勾**本场景里已启用**的那几条,其余三段是空集(MCP / 技能 / 记忆段空集 = 该域全部停用,子智能体段空集 = 不限制,段脚注写明这句话);「全选」= 本场景全部。编辑器顶部有筛选框,记忆描述按 80 字截断(全文在悬浮提示里),弹窗固定高度、加减段不跳动。
|
|
112
|
-
- **场景模式**:勾了工具或技能段的场景出现「切入此模式」——**进入 = 快照当前启停 → 先落盘快照 → 应用勾选集 → 记忆收窄到该场景**;「退出」按快照**原文**恢复(模式期间写进去的整台停用键随之消失)。运行中手动改动不会偷偷回写,点「保存到场景」才落盘。任一步失败自动回滚并如实上报(回滚未完成会写进错误文本,不谎报「已回滚」)。
|
|
113
|
-
|
|
114
|
-
### 子智能体(人设)
|
|
115
|
-
|
|
116
|
-
- **一个文件一个人设**:`~/.dsh/tool-management/agents/<人设>.md`,frontmatter 全部可选——`description`(何时调用,一句话即可)/ `provider` + `model`(模型路由,**两者是一对**:跨来源换模型必须都填;只填 `model` 会落在主会话的来源上)/ `tools` 白名单 / `toolsDeny` 黑名单,正文就是人设提示词。
|
|
117
|
-
- **高级选项**:模型与工具限制收在「高级选项」折叠区(已在用的人设自动展开)。模型是**下拉选择**(宿主 LLM 目录里的 `provider · model` 对,目录里没有的可切「自定义」手填);工具白 / 黑名单是**勾选器**,候选是**全部 Agent 预设工具名的并集**并按预设分组展示——人设可能在任何预设下被复用,只列当前会话的工具会让换预设后的子代理启动失败(官方 `toolFilter` 对未知名直接拒绝启动)。
|
|
118
|
-
- **导入**:页头「导入」支持 `.md` 与 `.zip`(zip 内任意层级的 `.md` 都按文件名导入,**同名自动跳过并列出名单**)。
|
|
119
|
-
- **运行**:模型用 `subagent_list` 看清单、`subagent_run{agent, task}` 调用:子代理**带人设独立运行**、自动继承当前启用场景的记忆段、只把最终输出回传主模型(≤16 KiB),跑完即弃、不进 History。场景档案可绑定「本场景可用哪些人设」(绑定外调用报「人设不可用」);运行默认弹确认(花的是真 token),设置 `requireConfirmForModelSubagentRun: false` 可关。
|
|
120
|
-
- **治理边界**:以上约束只覆盖 `subagent_run` 这一条通道——DSH 官方的 `subagent` / `subagent_fork` 是宿主能力,无确认门、也不认这套人设,任何模式下都不受本插件约束(见 [FAQ](#常见问题))。人设不入回收站(删了就是删了),v1 也没有给人设写文件的模型工具。
|
|
86
|
+
- **场景 = 分组,记忆 = `.md` 文件**。`memories/<场景>/<名>.md`,整篇正文自动进系统提示词,文件名支持中文。
|
|
87
|
+
- **单选启用**:同时只启用一个场景(其余置灰),关掉全部 = 只注入「全局」与 `_shared`。新场景默认不启动。
|
|
88
|
+
- **场景绑提示词**:切换场景直接改写 `~/.dsh/AGENTS.md`(覆盖前 5 代备份,关掉自动恢复基线)。
|
|
89
|
+
- **场景档案**:每个场景搭配 MCP 工具集 / 技能集 / 子智能体 / 记忆(任意组合);打开场景即应用并收窄注入,关闭按快照原文恢复(开关是唯一入口)。
|
|
90
|
+
- **导入**:`.md` / `.zip`(目录名 = 场景,bundle 带附件),同名跳过绝不覆盖,超限逐条回报。
|
|
91
|
+
- **导出**:勾选记忆打包成 zip,保留「场景/名称」层级;bundle 型连目录里的附件一起打进去。只读源文件。
|
|
92
|
+
- **注入预算**:默认 64 KiB,放不下的跳过并列出清单。删除进回收站。
|
|
93
|
+
- **场景锁定**:锁定后 MCP / 技能 / 子智能体 / 记忆 / 提示词整体只读,界面禁用 + 服务端守卫双侧拦截;未启动不能上锁,锁定中不能关闭,先解锁再改。
|
|
94
|
+
- **删除场景 = 连记忆一起删**:场景记录、档案与全部记忆进同一条回收站条目,恢复按原路径整条放回;使用中的场景拒绝删除。场景名可改(连带目录与档案,记忆正文不动)。
|
|
95
|
+
|
|
96
|
+
### 子智能体
|
|
97
|
+
|
|
98
|
+
- **一个文件一个人设**:`agents/<人设>.md`,frontmatter 全可选。
|
|
99
|
+
- **工具限制按 Agent 预设**:每个预设一份白/黑名单(互相排斥),运行期按当前预设生效——堵掉旧「全体并集」名单换预设后子代理起不来的坑。
|
|
100
|
+
- **即用即弃**:`subagent_run` 带人设运行、只回传结果、不进 History,自动继承场景记忆。场景可绑定可用人设。
|
|
101
|
+
- **启停开关**:停用的人设不注入上下文、模型不可见(文件不动);新建 / 导入 / 恢复自动启用。启动场景时档案勾选的人设自动启用,退出按快照精确停回。
|
|
102
|
+
- **人设目录进系统提示词**:只列名字 + 描述,模型知道有哪些人设可委派;人设名可改,场景绑定自动跟着改。
|
|
121
103
|
|
|
122
104
|
### MCP 服务
|
|
123
105
|
|
|
124
|
-
-
|
|
125
|
-
-
|
|
126
|
-
-
|
|
127
|
-
-
|
|
128
|
-
-
|
|
106
|
+
- **增删改查 + 即改即生效**:写入 `cordis.patch.yml`,HMR 自动生效。
|
|
107
|
+
- **工具级开关**:单个工具可独立停用(模型看不见也调不到),整台支持批量。
|
|
108
|
+
- **密钥打码**:默认 `••••••`,「显示密钥」要令牌。
|
|
109
|
+
- **迁移与备份**:跨项目级/全局迁移失败自动回滚;JSON 导出导入。
|
|
110
|
+
- **状态与备注进系统提示词**:只列当前真正可用的 server,你的备注作为决策提示带给模型;级别分「全局 / 应用级」,新增默认全局。
|
|
129
111
|
|
|
130
112
|
### 技能
|
|
131
113
|
|
|
132
|
-
-
|
|
133
|
-
-
|
|
134
|
-
-
|
|
135
|
-
-
|
|
136
|
-
- **同名技能自选**:多处出现同名技能时,默认按来源优先级自动取一个生效(其余显示「被覆盖」,无开关);想改用某来源的版本,点该行「启用这个」即设为**同名首选**并启用——首选只写进状态文件(`preferredSkills`),不动任何源文件;赢家行可「取消首选」回到自动。来源整体停用时「启用这个」会被拦截并提示先启用该来源。
|
|
137
|
-
- **自定义目录**:点「添加目录」输入绝对路径,该目录即成为只读技能来源——适合管理散落在仓库、网盘同步目录里的技能合集;与已有来源重叠的路径会被拒绝,避免遮蔽失效。
|
|
138
|
-
- **创建与导入**:表单直接创建;ZIP、`.md`、技能文件夹拖进来就能装,导入弹窗里也可以「选择文件夹」;删除先进回收站,可恢复,永久删除前还会尝试移入系统回收站兜底。可删的是**插件自己管理的来源**(DSH 技能 / 导入技能 / 项目级 `.dsh/skills`);外部 Agent 目录与自定义目录只读,上面的技能删不掉。
|
|
114
|
+
- **来源一览**:项目级 / DSH / Agents / Codex / Claude / 自定义目录,按来源分组。
|
|
115
|
+
- **两组权限相反**:默认来源(DSH / 导入技能)必须读取但技能可删;外部目录可停用/移除但技能只读。
|
|
116
|
+
- **移除 ≠ 停用**:移除 = 连目录都不扫(文件零改动,可恢复);停用 = 仍列出但不可调用。
|
|
117
|
+
- **同名自选 / 自定义目录 / ZIP 导入导出 / 回收站**。
|
|
139
118
|
|
|
140
|
-
###
|
|
119
|
+
### 提示词预设
|
|
141
120
|
|
|
142
|
-
-
|
|
143
|
-
-
|
|
121
|
+
- 多套 `~/.dsh/AGENTS.md` 基线,一键应用(宿主每轮重读该文件,下一轮对话生效),保留 5 代备份。
|
|
122
|
+
- **描述**:每条预设可写一句「这份是干什么的」,只显示在插件界面里;它存在同目录的 `meta.json`,不进 AGENTS.md,也就不会被注入提示词。
|
|
123
|
+
- 新建即可写正文,编辑可改 id(= 目录改名,场景绑定自动跟着改)。正在生效的不能删;删除进回收站。
|
|
144
124
|
|
|
145
125
|
### 历史会话
|
|
146
126
|
|
|
147
|
-
-
|
|
148
|
-
-
|
|
149
|
-
-
|
|
150
|
-
- **导入对话**:无痛接管其他工具的会话——Claude Code / Cursor 的 JSONL、Codex 的 Markdown、以及任意文本格式,导入后即可继续对话。
|
|
151
|
-
- **导出对话**:按会话范围(全部 / 仅归档 / 按工作区)导出,每个会话一个 Markdown 或 JSONL 文件;导出目录默认桌面,旁边带「选择文件夹」按钮弹出目录树,逐级浏览选中后自动回填绝对路径。
|
|
152
|
-
|
|
153
|
-
#### 归档服务兼容边界
|
|
154
|
-
|
|
155
|
-
- 本插件**不禁用也不替换**官方 `workspace` / `session-projection-cache`,不注册第二个同名服务,也不再用包名判断是否与归档管理器冲突——`cordis.patch.yml` 只插入插件自己这一行。
|
|
156
|
-
- 归档走插件自己的门面:**有原生入口走原生、没有走受检适配层、都不行才拒绝**。判定依据是「插件与宿主是不是同一份物理模块 + 宿主对象上有没有这个能力」,**不再比对官方源码文本**——上游重构不会再把功能整体打死;最坏情况是该动作被禁用,并在「兼容」页与拒绝信息里说明缺什么、后果、怎么修。
|
|
157
|
-
- 适配层访问工作区内部状态(含官方声明为 private 的方法),并在宿主缺少自带删除屏障时可逆地包裹投影缓存的 `put` / `write`。**所以「不替换服务、不争注册」≠「零侵入」**,也不是「解耦」。
|
|
158
|
-
- 归档时刻通过官方持久化事件同步;旧记录缺少归档时刻时,从首次观察时开始保留期,不按很早的会话创建时间立即删除。
|
|
159
|
-
- 旧的独立缓存文件不迁移、不删除,改回官方缓存后可能需要按需重建摘要。若用户配置中手写了旧 `/workspace`、`/projcache` 挂载,应单独检查;本插件不会擅自改用户的补丁文件。
|
|
160
|
-
- 已用官方服务及隔离 JSON 存储验证归档、恢复、批量删除和缓存防回写;与 `@michengai/dsh-archive-manager` 实际双安装仍未验证,不承诺任意版本都兼容。
|
|
127
|
+
- 按项目分组、搜索、批量恢复 / 永久删除、保留期自动清理。
|
|
128
|
+
- 工作区登记被删后按会话目录重建分组,可一键重新登记。
|
|
129
|
+
- 导入 Claude Code / Cursor / Codex / 任意文本;导出 Markdown / JSONL。
|
|
161
130
|
|
|
162
131
|
### 宿主兼容
|
|
163
132
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
- **设置 → 工具 → 兼容**(第 8 栏):界面版体检——宿主版本与要求范围、插件适配版本、能力可用数、每个宿主动作走**宿主原生入口 / 插件适配层 / 不可用**、已降级能力与原因、模块实体是否同一份、阻塞项清单。只读,不改任何数据。
|
|
167
|
-
- **命令行版**:
|
|
168
|
-
|
|
169
|
-
```bash
|
|
170
|
-
node scripts/doctor.mjs # 只读体检:模块实体是否同一份 + 宿主能力概览
|
|
171
|
-
node scripts/host-deps.mjs # 报告差异(默认 dry-run)
|
|
172
|
-
node scripts/host-deps.mjs --fix # 把差异包改为 junction 指向宿主安装(原始副本备份到 .host-deps-backup/)
|
|
173
|
-
node scripts/host-deps.mjs --restore # 还原
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
DSH 升级(更换安装目录)后重跑一次 `--fix`;宿主缺某个包时插件会拒绝受影响的动作并说明原因,不会「猜着写」。
|
|
177
|
-
|
|
178
|
-
> `doctor.mjs` 的能力清单是脚本内的**静态子集**(只看成员是否存在,不做运行期行为干跑,也不覆盖删除路由);要完整的运行时结论,以**兼容页**为准。
|
|
179
|
-
|
|
180
|
-
### 让模型和脚本参与管理
|
|
133
|
+
插件运行期用宿主同一批 `@deepseek-ai/*` 库——必须是同一份物理模块,否则判断退化成猜。
|
|
181
134
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
| `skill_manager_list / set_enabled / create` | 模型查询与操作技能(创建前会征求你同意) |
|
|
186
|
-
| `agentsmd_list / agentsmd_apply` | 模型查询 AGENTS.md 预设库、切换当前预设(写入 `~/.dsh/AGENTS.md`,新会话生效);**不提供新建 / 删除**,避免模型误删你的预设 |
|
|
187
|
-
| `rule_manager_list / read / write` | 模型查询与读写场景记忆(写入前会征求你同意,可在设置中关闭确认) |
|
|
188
|
-
| `subagent_list / subagent_run` | 模型列出人设、按人设运行一次性子代理(只回传结果、跑完即弃;运行前默认需确认,可在设置中关闭) |
|
|
189
|
-
| `POST /dsh-plugin-tool-management/api` | 脚本调用的 HTTP API(`{op, args}` 协议) |
|
|
135
|
+
- **「兼容」页**:宿主版本、能力可用数、每个动作走原生/适配/不可用、降级项与原因。只读。
|
|
136
|
+
- **命令行**:`node scripts/doctor.mjs`(体检)、`node scripts/host-deps.mjs --fix`(依赖对齐)。
|
|
137
|
+
- `minimal` 预设下,场景记忆 / AGENTS.md / 技能目录不生效(该预设的设计意图),兼容页逐列标出。
|
|
190
138
|
|
|
191
|
-
|
|
192
|
-
> 它们只能输出纯文本快照、既不能操作也容易与面板状态不一致,面板里每一项都有等价入口。
|
|
139
|
+
---
|
|
193
140
|
|
|
194
141
|
## 数据落点
|
|
195
142
|
|
|
196
143
|
| 内容 | 位置 |
|
|
197
144
|
|---|---|
|
|
198
|
-
| MCP
|
|
199
|
-
|
|
|
200
|
-
|
|
|
201
|
-
|
|
|
202
|
-
|
|
|
203
|
-
|
|
|
204
|
-
|
|
|
205
|
-
|
|
|
206
|
-
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
| 记忆回收站 | `~/.dsh/tool-management/rules-trash/<trashId>/`(删除记忆先进这里,可恢复) |
|
|
210
|
-
| 运行日志 | `~/.dsh/dsh-plugin-tool-management.log`(滚动) |
|
|
211
|
-
|
|
212
|
-
**插件安装目录里不存任何用户数据**——npm 安装下 `dsh plugin update` 会整体替换该目录。
|
|
145
|
+
| MCP 定义 | `cordis.patch.yml`(改前自动 `.bak`) |
|
|
146
|
+
| 技能策略 / 自定义目录 | `~/.dsh/tool-management/state.json` |
|
|
147
|
+
| 技能 / 记忆 / 人设 / 预设 | `~/.dsh/tool-management/{skills,memories,agents,agents-md}/` |
|
|
148
|
+
| 子智能体启停 | `~/.dsh/tool-management/agents-index.json` |
|
|
149
|
+
| 回收站 | `~/.dsh/tool-management/trash/` |
|
|
150
|
+
| 归档账本 / 保留期 | `~/.dsh/tool-management/history-*.json` |
|
|
151
|
+
| 记忆索引 / 场景 / 档案 | `~/.dsh/tool-management/rules-index.json` |
|
|
152
|
+
| 页面设置 | `~/.dsh/dsh-plugin-tool-management-settings.json` |
|
|
153
|
+
| 运行日志 | `~/.dsh/dsh-plugin-tool-management.log` |
|
|
154
|
+
|
|
155
|
+
**插件安装目录里不存用户数据**(`dsh plugin update` 会整体替换该目录)。
|
|
213
156
|
|
|
214
157
|
## 配置与安全
|
|
215
158
|
|
|
216
|
-
插件 loader 行支持以下可选字段(`dsh plugin add` 会自动插入,一般无需手写):
|
|
217
|
-
|
|
218
159
|
| 字段 | 说明 |
|
|
219
160
|
|---|---|
|
|
220
|
-
| `token` |
|
|
221
|
-
| `maxBodyBytes` | 请求体上限,默认 88 MiB
|
|
222
|
-
|
|
223
|
-
鉴权怎么工作的:插件路由**不在**宿主的全局鉴权闸门里,所以它自己调宿主的 `connection.requestRejection(req)`——先过 Host / Origin 栅栏(Host 必须是回环或本机 LAN 的 IP 字面量,这是 DNS rebinding 唯一伪造不了的头),再过 browser-session cookie 鉴权。宿主该服务不在场时退回**本地判定**,只检查「Host 是回环 + 非跨站 Fetch + Origin 与 Host 同源」,**不含 cookie 鉴权**(比宿主栅栏弱,这种环境下更要配 token)。因此:
|
|
161
|
+
| `token` | 访问令牌。设了之后**所有写操作 + 明文密钥**都要求 `x-dsh-token`;**不设时明文接口一律关闭**。也是 curl / 局域网的逃生门。 |
|
|
162
|
+
| `maxBodyBytes` | 请求体上限,默认 88 MiB。 |
|
|
224
163
|
|
|
225
|
-
-
|
|
226
|
-
- **curl /
|
|
227
|
-
-
|
|
228
|
-
- 把端口转发到局域网 / 公网时,token 仍是防止陌生人注入 MCP 命令(等同远程执行:`command` / `args` 会被直接 spawn)与窃取明文密钥的关键防线,**建议配置**。
|
|
229
|
-
- 自定义头 `x-dsh-plugin` 只是防误触的门禁标识,不是凭证。
|
|
164
|
+
- **浏览器**:读写走 cookie,不需要 token;但**明文密钥**(显示密钥 / 导出)要令牌。
|
|
165
|
+
- **curl / 脚本**:带 `x-dsh-token`,或带浏览器 cookie。
|
|
166
|
+
- **端口转发到公网**:建议配 token——防陌生人注入 MCP 命令(等同远程执行)与窃取密钥。
|
|
230
167
|
|
|
231
168
|
## 常见问题
|
|
232
169
|
|
|
233
170
|
| 现象 | 解决 |
|
|
234
171
|
|---|---|
|
|
235
|
-
|
|
|
236
|
-
|
|
|
237
|
-
|
|
|
238
|
-
|
|
|
239
|
-
|
|
|
240
|
-
|
|
|
241
|
-
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
| 场景里只绑了 A 人设,为什么模型还是跑起了没绑定的子代理? | **子代理有两条通道**。本插件的 `subagent_run` 走确认门 + 场景人设绑定;DSH 官方的 `subagent` / `subagent_fork` 是宿主能力,**没有确认门、也没有「用哪个人设」的概念**,因此任何模式下都不受本插件的确认与绑定约束(实测:同一条消息里官方 `subagent` 无审批卡直接返回,紧接着的 `subagent_run` 才弹卡)。本插件的治理只覆盖 `subagent_run`。 |
|
|
172
|
+
| 装完没有页面 | 硬刷新;不行重启 DSH。 |
|
|
173
|
+
| 重复 MCP 页签 | 删 `cordis.patch.yml` 里的旧 loader 行后重启。 |
|
|
174
|
+
| 改坏配置 DSH 起不来 | 取最近的 `.bak-<时间戳>` 恢复。 |
|
|
175
|
+
| 升级 DSH 后动作不可用 | 设置 → 工具 → **兼容** 看原因;`doctor.mjs` → `host-deps.mjs --fix`。 |
|
|
176
|
+
| `approval=never` 还要确认吗 | 不弹卡,直接放行并记日志;想问回来切回「工作区内修改」。 |
|
|
177
|
+
| `subagent_run` 报 spawn 不可用 | 宿主没注册 spawn provider;挂载 `@deepseek-ai/dsh-subagent-spawn-in-process` 后重启。 |
|
|
178
|
+
| 场景绑了 A 人设,官方 `subagent` 还跑别的 | 两条通道:本插件只管 `subagent_run`;官方 `subagent` / `subagent_fork` 无确认门、不认人设。 |
|
|
179
|
+
|
|
180
|
+
---
|
|
245
181
|
|
|
246
182
|
## 开发
|
|
247
183
|
|
|
248
184
|
```bash
|
|
249
185
|
npm install
|
|
250
|
-
npm run build #
|
|
251
|
-
npm
|
|
252
|
-
npm run
|
|
253
|
-
npm run
|
|
254
|
-
npm run check:host # 宿主依赖体检(只读,见下「宿主兼容」)
|
|
255
|
-
npm run host-deps # 把插件依赖指向宿主安装(需要时执行一次)
|
|
256
|
-
npm run doctor # 打印模块实体归属 + 宿主能力探测结果
|
|
257
|
-
npm test # 构建 + i18n 自检 + 语义契约测试(node --test test/*.test.mjs,13 组)
|
|
186
|
+
npm run build # tsc + 同步客户端
|
|
187
|
+
npm test # 构建 + i18n + 语义契约测试
|
|
188
|
+
npm run check:i18n # 词典自检
|
|
189
|
+
npm run doctor # 宿主兼容体检
|
|
258
190
|
```
|
|
259
191
|
|
|
260
|
-
|
|
261
|
-
> 插件由宿主启动时加载 `lib/`,**改完要重启 `dsh web`** 才生效(patch 热重载不会重新 import 插件模块)。
|
|
262
|
-
|
|
263
|
-
### 验证方式
|
|
264
|
-
|
|
265
|
-
本项目的验证是**直接跑一遍真实行为**,而不是断言代码当前怎么实现——后者只是把实现抄一遍,必然通过。
|
|
266
|
-
**文案与排版不做逐条断言**(用户裁定 2026-09-14:那是刻舟求剑,改一次样式就要改一次断言,页面观感由人在真实页面上确认)。
|
|
267
|
-
|
|
268
|
-
保留的是 13 组**语义契约**测试(`npm test`,跑 `lib/` 产物):
|
|
269
|
-
|
|
270
|
-
| 测试 | 断言的语义 |
|
|
271
|
-
|---|---|
|
|
272
|
-
| `archive.test.mjs` | 场景引擎状态机:段存在性与空集合相互独立、勾选集 → 停用补集、快照深拷贝、应用失败回滚并如实上报 |
|
|
273
|
-
| `import.test.mjs` | 导入展开与落点规划:路径穿越拒绝、zip 认魔数不认扩展名、超限与非法条目逐条回报原因 |
|
|
274
|
-
| `approval-policy.test.mjs` | `approval=never` 探测链;用真实 cordis + 真实 `ApprovalService` 复现读取链,缺服务或抛错时一律不放行 |
|
|
275
|
-
| `subagent-scene.test.mjs` | 场景人设绑定:绑定外调用必须在子代理运行**之前**被拒 |
|
|
276
|
-
| `subagent-persona.test.mjs` | 人设 frontmatter 往返:`provider` / `model` / `toolsDeny` 读写不丢;目录不存在时创建 |
|
|
277
|
-
| `hub-layout.test.mjs` | 统一数据目录:旧布局搬移不覆盖、保留场景 `global` 恒在且不可删、记忆必须归属已存在场景、档案记忆段只影响投影 |
|
|
278
|
-
| `skills-state.test.mjs` | 状态文件读取韧性:缺键自愈、类型错仍 fail-closed、默认来源的残留策略位被丢弃 |
|
|
279
|
-
| `skills-delete.test.mjs` | 默认来源的技能删得掉且能从回收站**原样放回**;只读来源仍只读 |
|
|
280
|
-
| `skills-source-remove.test.mjs` | 「移除来源」:移除后不再被读取、不参与同名优先级、模型侧候选不可见,而文件零改动、可恢复;默认来源既不可移除也不可停用 |
|
|
281
|
-
| `client-exports.test.mjs` | 客户端导出契约:只求值 factory 不跑 `apply` 也能拿到 `dict` / `pages`;禁止把导出写在 `apply` 方法体里 |
|
|
282
|
-
| `client-render.test.mjs` | 装配与渲染:假 ctx 跑完整 `apply`,注册 `settings.section` 并递归渲染整棵组件树不抛错(这一条抓到过真的白屏)、带数据再渲染不抛错;场景页与档案弹窗只断结构不断文案;兼容页只在真有阻塞 / 降级时着色,且英文词典下结论条不得出现中文字符 |
|
|
283
|
-
| `compat-probe.test.mjs` | 宿主能力探测:用真实官方类原型链构造宿主对象,成员改名 / 返回值形状变化 / 服务缺失都必须降级为**具名**结论而不是抛错;探测本身只读 |
|
|
284
|
-
| `compat-fallback.test.mjs` | 能力门禁真的挡在写之前:缺串行写事务时归档被拒且宿主写方法一次都没被调用;缓存只在宿主缺自带删除屏障时才包裹,并在卸载后还原 |
|
|
285
|
-
|
|
286
|
-
另有 `npm run check:i18n`(词典键集合、重复键、占位符对齐 + 字面量引用完整性;当前 zh/en 各 722 条、454 处引用)与 `node scripts/i18n-debt.mjs`(还剩多少硬编码中文,**当前 214 条**,其中提示词页 15 条、其余散落在未按页统计的组件与共享壳中,会话页已清零)。
|
|
287
|
-
|
|
288
|
-
契约测试断言语义契约而非实现抄写;**真实行为验收仍以浏览器 / 宿主实测为准,契约测试不能替代**。
|
|
289
|
-
|
|
290
|
-
### 结构
|
|
291
|
-
|
|
292
|
-
宿主端 `src/index.ts`(Cordis 对象插件,`lib/index.js` 为发布产物);宿主能力探测 `src/compat/probe.ts`(唯一决定「能对宿主做什么」的地方,只读);HTTP 门禁 `src/http-fence.ts`;数据目录常量与搬移 `src/hub.ts`;技能核心 `src/skills/core.js`(纯 Node);AGENTS.md 预设库 `src/agents-md/service.ts`;归档会话管理 `lib/history/`(`workspace.js` 门面 / `bridge.js` 兼容层 / `projcache.js` / `tombstone.js`);对话导入解析 `src/imports/parsers.js`;场景记忆服务 `src/rules/`(`service.ts` 发现、CRUD、索引、体检与两相扫描段渲染,`provider.ts` 注册 per-agent `systemPrompt` 段;模块路径与 `rules-*` op 名保留为内部协议,用户可见的页面与目录名是「场景记忆」/ `memories/`);浏览器端 `src/client.js`(ModuleLoader CJS bundle,`dsm-*` 设计系统,经同源 API 与宿主通信);开发期脚本 `scripts/host-deps.mjs`(依赖对齐)与 `scripts/doctor.mjs`(兼容体检)。
|
|
293
|
-
|
|
294
|
-
运行时依赖仅 `fflate`(ZIP 解压);`@deepseek-ai/*` 一律用宿主那份(见上「宿主兼容」)。
|
|
295
|
-
|
|
296
|
-
发布:`npm publish`(`prepublishOnly` 自动构建;版本号用 `npm version <minor|patch>`)。
|
|
192
|
+
`lib/` 不入版本库,克隆后先 `npm run build`。改完重启 `dsh web` 才生效。运行时依赖仅 `fflate`;`@deepseek-ai/*` 一律用宿主那份。
|
|
297
193
|
|
|
298
194
|
## 许可证
|
|
299
195
|
|