dsh-project-mcp-manager 0.3.1 → 0.4.2
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/README.md +151 -296
- package/docs/README.zh.md +123 -244
- package/docs/code-review/ts-review-since-v0.3.1.zh.md +451 -0
- package/docs/design/adaptation-dsh-0.1.2-rc1.md +117 -0
- package/docs/design/proposal-json-mcp-config.md +195 -0
- package/docs/guide/cli.md +48 -0
- package/docs/guide/cli.zh.md +39 -0
- package/docs/guide/env-expansion.md +24 -0
- package/docs/guide/env-expansion.zh.md +19 -0
- package/docs/guide/format.md +85 -0
- package/docs/guide/format.zh.md +74 -0
- package/docs/guide/layers.md +103 -0
- package/docs/guide/layers.zh.md +77 -0
- package/docs/releases/v0.3.1.md +152 -0
- package/docs/releases/v0.4.0.md +159 -0
- package/docs/releases/v0.4.1.md +117 -0
- package/docs/releases/v0.4.2.md +65 -0
- package/lib/cli.js +338 -126
- package/lib/dsh-paths.js +65 -0
- package/lib/index.js +26 -1
- package/lib/json-file.js +202 -0
- package/lib/json-write.js +125 -0
- package/lib/mcp-file.js +27 -6
- package/lib/model.js +24 -15
- package/lib/registry.js +710 -329
- package/package.json +8 -6
- package/lib/cc-file.js +0 -192
package/docs/README.zh.md
CHANGED
|
@@ -1,244 +1,123 @@
|
|
|
1
|
-
# dsh-project-mcp-manager
|
|
2
|
-
|
|
3
|
-
[English](../README.md) | 中文
|
|
4
|
-
|
|
5
|
-
项目级 MCP 自动加载插件:在项目根 `<projectRoot>/.dsh/mcp.yml` 写入 MCP
|
|
6
|
-
服务器配置,在该项目开启 dsh 会话时自动装载(经官方
|
|
7
|
-
`@deepseek-ai/dsh-mcp-client`),文件改动热重载到运行中的 dsh 进程,并按
|
|
8
|
-
会话 cwd 控制工具可见性。无 UI,仅具备核心功能。
|
|
9
|
-
|
|
10
|
-
##
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
#
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
-
|
|
105
|
-
|
|
106
|
-
`
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
(`~/.dsh/mcp.yml` 与 `~/.claude.json`)解析为 dsh 宿主的工作目录。
|
|
125
|
-
注意"用户层"不等于共享进程:用户层行仍**按每个已知项目各装一个进程**
|
|
126
|
-
(两个项目各开会话就是两个 fiber,按生效名规则改名为 `p<hash>_…`)——
|
|
127
|
-
共享的只是 `cwd`,不是连接。
|
|
128
|
-
- 未知 CC 键容忍忽略;`enabled: false`(以及作为别名的 `disabled: true`)
|
|
129
|
-
静默跳过该条目(不记诊断,也不占名)。
|
|
130
|
-
- 原生 yml 里 `disabled: true` 的行仍**占住影子键**(见下方去重规则):下层
|
|
131
|
-
同名行一并被遮蔽不装载——禁用意味着"这个名字不许跑",而不是"让位给 CC
|
|
132
|
-
副本"。CC 侧的 `enabled: false` 没有占位效果。推论:不删除、只在
|
|
133
|
-
`.mcp.json` 里关掉一条,同名的**用户层行会在该项目浮上来**装载;要把某台
|
|
134
|
-
服务器在所有层压住,请在 `.dsh/mcp.yml` 留一条 `disabled: true` 占位行
|
|
135
|
-
(名字或归一化名字对上即可)。
|
|
136
|
-
- 坏文件/坏条目不影响其他服务器,且**按源隔离**:`.mcp.json` 坏了不会卸掉
|
|
137
|
-
同项目的 yml 行(反之亦然);条目错误写入 `.dsh/.mcp-diag.json` 与宿主
|
|
138
|
-
日志(诊断从不带文件内容)。只有 `.mcp.json`、没用过原生 yml 的项目,
|
|
139
|
-
一旦有可报内容也会创建 `.dsh/` 目录。
|
|
140
|
-
- CC 每次会话都会重写 `~/.claude.json`;watcher 会对该文件做
|
|
141
|
-
`mcpServers` 子树的规范化哈希门控——子树没变就不触发对账。
|
|
142
|
-
- 共存边界开关(dsh 宿主环境变量):`DSH_MCP_READ_CLAUDE_USER=1` 显式启用
|
|
143
|
-
`~/.claude.json` 用户层;`DSH_MCP_IGNORE_MCP_JSON=1` 停用项目 `.mcp.json`
|
|
144
|
-
层;旧开关 `DSH_MCP_IGNORE_CLAUDE_JSON=1` 为强制关闭用户层,**优先级高于
|
|
145
|
-
opt-in**(冲突时打一次「胜出」告警;旧开关将在后续版本移除)。用户层开启
|
|
146
|
-
时,宿主一次性日志提示扇出规模(「N 条服务器将并入 M 个已知项目」),
|
|
147
|
-
让多出来的 spawn 可解释、可回退。
|
|
148
|
-
|
|
149
|
-
**影子优先序**——按 1→4 先到先得合并,后到行与已收录行命中**三把键中的任何
|
|
150
|
-
一把**即被遮蔽:精确 `serverName`;*归一化名称*(转小写去掉非字母数字后相同
|
|
151
|
-
——`unityMCP` 与 `unity-mcp` 就是一台服务器的两种写法);*服务身份*
|
|
152
|
-
(`stdio` 取 command + args,Windows 下路径大小写不敏感;`streamable-http`
|
|
153
|
-
取 url)。command/url 为空的行不注册身份键——`node a.js` 与 `node b.js` 是
|
|
154
|
-
不同服务、绝不互杀——而 `disabled` 占位行三键全占、自身不装载。身份比对用的
|
|
155
|
-
是**文件里的原始字符串,发生在 `${VAR}` 展开之前**,且 `env`、`headers`、
|
|
156
|
-
`cwd` **不参与**身份键:同一命令行、仅 env 不同的两台真不同服务器仍会被去重
|
|
157
|
-
(只留高优先级一条),同一台服务器一条写 `${VAR}`、一条写字面量则**不**互认。
|
|
158
|
-
误剔时的处置:给被剔行改名(归一化后不同)或调整命令与参数。被遮蔽方写入
|
|
159
|
-
`.dsh/.mcp-diag.json`(`shadowedByYml` / `shadowedByProject` /
|
|
160
|
-
`shadowedIdentity`),身份/归一名去重剔除的每行还会在宿主日志告警「跳过重复
|
|
161
|
-
服务定义」:
|
|
162
|
-
|
|
163
|
-
1. `<projectRoot>/.dsh/mcp.yml`(原生格式,面板/CLI 管理)
|
|
164
|
-
2. `<projectRoot>/.mcp.json`(CC project 层)
|
|
165
|
-
3. `~/.dsh/mcp.yml`(原生用户层,见 CLI)
|
|
166
|
-
4. `~/.claude.json` 顶层 `mcpServers`(CC user 层,opt-in)
|
|
167
|
-
|
|
168
|
-
用户层行适用于所有已知项目,因此「某项目与用户层同名」(或两个项目同名)
|
|
169
|
-
会走常规的生效名冲突改名规则(见工作原理)。
|
|
170
|
-
|
|
171
|
-
## `${VAR}` 展开
|
|
172
|
-
|
|
173
|
-
以上任一来源中,`command`、`args[*]`、`env[*]`、`cwd`、`url`、`headers[*]` 里的
|
|
174
|
-
`${VAR}` 引用(正则 `\$\{[A-Za-z_][A-Za-z0-9_]*\}`,允许出现在字符串任意
|
|
175
|
-
位置)在装载时刻从 dsh 宿主进程环境做**串内插值**——与 Claude Code 同语义,
|
|
176
|
-
`"Authorization": "Bearer ${TOKEN}"` 这类写法可用。变量未设置**或为空串**时
|
|
177
|
-
该行跳过装载,诊断记 `env-missing` 并只带变量名(绝不带值);需要保留字面
|
|
178
|
-
`${NAME}` 的写法目前不可表达。含引用的 `url` 在装载前的 schema 校验里任意
|
|
179
|
-
位置都放行(包括 host 段,如 `https://${HOST}/mcp`)——合法性只在展开后判定:
|
|
180
|
-
展开结果会再过一遍装载 schema 复验,产出非法配置(如 `${GATEWAY}/mcp` 拼出
|
|
181
|
-
非 URL)时以 `env-invalid` 跳过,不把坏值递给装载后端。快照/行视图里
|
|
182
|
-
`fiberPhase` 保持装载生命周期枚举(未挂上的行是 `pending`),跳过原因走独立
|
|
183
|
-
的 `skipReason` 字段(`env-missing` / `env-invalid` / `config-invalid` /
|
|
184
|
-
`plugin-throw`)。插件任何写路径都不落盘展开后的值;
|
|
185
|
-
CLI 写入时 `${VAR}` 原样保留——配置可以进 git,凭据留在环境里。
|
|
186
|
-
|
|
187
|
-
## CLI:`dsh-mcp`
|
|
188
|
-
|
|
189
|
-
CC 风格的原生文件命令行管理(**只写** `.dsh/mcp.yml`——从不写
|
|
190
|
-
`.mcp.json` / `~/.claude.json`;不连接运行中的 dsh 宿主,宿主经文件监听自动
|
|
191
|
-
收敛):
|
|
192
|
-
|
|
193
|
-
```powershell
|
|
194
|
-
dsh-mcp add gitlab npx -y @modelcontextprotocol/server-gitlab -e GITLAB_TOKEN=${GITLAB_TOKEN}
|
|
195
|
-
dsh-mcp add --transport http sentry https://mcp.sentry.dev/mcp -H "Authorization: Bearer ${SENTRY_TOKEN}"
|
|
196
|
-
dsh-mcp add --scope user shared node ./tools/shared.js # 写 ~/.dsh/mcp.yml
|
|
197
|
-
dsh-mcp list # 四个来源全展示,带遮蔽标注
|
|
198
|
-
dsh-mcp get gitlab # 优先层条目;密钥值只显示键名
|
|
199
|
-
dsh-mcp remove gitlab # 只动原生 yml;命中只读层时给出编辑指引
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
作用域:`--scope project`(缺省,写最近 `.git` 祖先下的
|
|
203
|
-
`.dsh/mcp.yml`)与 `--scope user`(写 `~/.dsh/mcp.yml`,装载进每个项目)。
|
|
204
|
-
`add` 的 `cwd` 缺省随作用域而变:project 为 `"."`(项目根),user 为 `""`
|
|
205
|
-
(宿主目录);`-c` 显式覆盖。
|
|
206
|
-
没有 `local` 作用域——`--scope local` 会报错并解释。`--transport` 接受
|
|
207
|
-
`stdio`(缺省)与 `http`;`sse` 拒绝(后端不支持)。
|
|
208
|
-
|
|
209
|
-
## 工作原理
|
|
210
|
-
|
|
211
|
-
- **项目发现**:在线 agent 会话的 `session.header.cwd` + dsh 进程启动目录 →
|
|
212
|
-
向上找最近的含 `.git` 的祖先目录作为项目根(无 `.git` 时退回目录本身)。
|
|
213
|
-
- **装载**:每个 `(项目, serverName)` 在宿主 ctx 上装载一个
|
|
214
|
-
`@deepseek-ai/dsh-mcp-client` 实例(`ctx.plugin`),注册进全局工具层。
|
|
215
|
-
同一项目内多会话共享同一连接。
|
|
216
|
-
- **热重载**:chokidar 监听各项目根(depth 2,忽略 node_modules/.git/.hg/
|
|
217
|
-
.svn),但只有**已知项目根的精确配置文件**(`<projectRoot>/.dsh/mcp.yml`
|
|
218
|
-
与 `<projectRoot>/.mcp.json`)的改动经 150ms 防抖触发全量对账:新增行
|
|
219
|
-
装载、删除行卸载、配置变化重装。另有独立 watcher 以**两个精确文件路径**
|
|
220
|
-
监听用户层:`~/.dsh/mcp.yml` 与 `~/.claude.json`(chokidar v5 对被监听的
|
|
221
|
-
缺失文件能在其创建时补发事件,前提是父目录已存在)——不监听家目录整体。
|
|
222
|
-
`~/.claude.json` 事件只由规范化内容哈希门裁决(没有 size/mtime 快路径:
|
|
223
|
-
同刻、同体积而内容不同的重写不能被吞掉)。
|
|
224
|
-
- **生效名**:原始 `serverName` 在整个目录(全局行 + 全部项目行;每个项目的
|
|
225
|
-
行集合含遮蔽后幸存的用户层行)中唯一时
|
|
226
|
-
保持原名;冲突时双方都改为 `p<sha256(项目根)前6位>_<原名>`(截断 32 字符,
|
|
227
|
-
确定性、与装载顺序无关),避免 `dsh-mcp-client` 按进程根的 serverName
|
|
228
|
-
预留冲突。全局行(profile `cordis.patch.yml` / bundle 层已装载的
|
|
229
|
-
mcp-client 行)参与占用判定但不改名。模型可见的工具名由生效服务器名与
|
|
230
|
-
MCP 工具自身的名字拼成 `mcp__<生效名>__<工具名>`,与文件里写的 `serverName` 可能不同。
|
|
231
|
-
- **会话可见性**:agent 创建时按其会话 cwd 解析项目,对该 agent 应用
|
|
232
|
-
`tools.restrict({ deny })`,deny 掉除本会话项目外的全部项目服务器;会话
|
|
233
|
-
无 cwd 时回退 owner 项目(子代理),再回退 dsh 进程 cwd 所在项目。会话
|
|
234
|
-
销毁时释放。
|
|
235
|
-
|
|
236
|
-
## 安全边界
|
|
237
|
-
|
|
238
|
-
`.dsh/mcp.yml` 中的 `stdio` 行(以及经兼容层装载的 `.mcp.json` 行)会在 dsh
|
|
239
|
-
宿主进程内 spawn 其 `command`——项目文件是**可执行代码载体**,只应在可信项目
|
|
240
|
-
中添加。装载失败/配置无效行仅告警跳过,不影响其他服务器。CC 的机器级
|
|
241
|
-
`~/.claude.json` 用户层因此**默认关闭**:读取它等于把外来的环境级服务器塞进
|
|
242
|
-
每个项目的 spawn 集合,必须是显式决定(`DSH_MCP_READ_CLAUDE_USER=1`)。
|
|
243
|
-
`~/.claude.json` 之所以同时按严格 allowlist 只读,正是因为该文件还存放凭据:
|
|
244
|
-
其中未使用的部分不会被读出、写入任何文件,也不会在 CLI 或诊断输出里出现。
|
|
1
|
+
# dsh-project-mcp-manager
|
|
2
|
+
|
|
3
|
+
[English](../README.md) | 中文
|
|
4
|
+
|
|
5
|
+
项目级 MCP 自动加载插件:在项目根 `<projectRoot>/.dsh/mcp.yml` 写入 MCP
|
|
6
|
+
服务器配置,在该项目开启 dsh 会话时自动装载(经官方
|
|
7
|
+
`@deepseek-ai/dsh-mcp-client`),文件改动热重载到运行中的 dsh 进程,并按
|
|
8
|
+
会话 cwd 控制工具可见性。无 UI,仅具备核心功能。
|
|
9
|
+
|
|
10
|
+
## 文档
|
|
11
|
+
|
|
12
|
+
功能说明已拆分到 `docs/`,中英双版并存:
|
|
13
|
+
|
|
14
|
+
- [配置格式](guide/format.zh.md)——原生 YAML 受管块、JSON 方言、与
|
|
15
|
+
cordis 方言的差异。
|
|
16
|
+
- [配置来源与分层](guide/layers.zh.md)——六层来源模型、影子优先序、
|
|
17
|
+
全局装载 vs 项目装载,以及只读的遗留 Claude Code 层。
|
|
18
|
+
- [`${VAR}` 展开](guide/env-expansion.zh.md)——装载时插值与对应诊断。
|
|
19
|
+
- [CLI `dsh-mcp`](guide/cli.zh.md)——作用域、写入格式与独占契约。
|
|
20
|
+
|
|
21
|
+
设计与发布记录(中文):[dsh 0.1.2-rc.1 适配记录](design/adaptation-dsh-0.1.2-rc1.md) ·
|
|
22
|
+
[JSON 配置层设计提案](design/proposal-json-mcp-config.md) ·
|
|
23
|
+
[v0.4.2 发布说明](releases/v0.4.2.md) ·
|
|
24
|
+
[v0.4.1 发布说明](releases/v0.4.1.md) ·
|
|
25
|
+
[v0.4.0 发布说明](releases/v0.4.0.md) ·
|
|
26
|
+
[v0.3.1 发布说明](releases/v0.3.1.md)。
|
|
27
|
+
|
|
28
|
+
代码审查记录(中文):[v0.3.1 以来 TypeScript 变更审查](code-review/ts-review-since-v0.3.1.zh.md)。
|
|
29
|
+
|
|
30
|
+
## 安装(挂载到 profile)
|
|
31
|
+
|
|
32
|
+
插件通过 **bundle patch** 挂载:把包加入 `dsh.profile.bundles` 后,dsh 启动时
|
|
33
|
+
按顺序合成每个 bundle 的 patch(`dsh.bundle.patch` 指向的 `cordis.patch.yml`)
|
|
34
|
+
作为插件行。
|
|
35
|
+
|
|
36
|
+
**前置:安装 dsh 本体**(尚未安装 dsh 的用户):
|
|
37
|
+
|
|
38
|
+
```powershell
|
|
39
|
+
npm install -g @deepseek-ai/dsh # npm 官方包
|
|
40
|
+
npm install -g deepseek-ai/dsh # 或从 GitHub 源码安装
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**方式一:dsh 插件命令(推荐)**——`dsh plugin` 在 profile 目录内转发 pnpm,
|
|
44
|
+
负责安装/升级依赖:
|
|
45
|
+
|
|
46
|
+
```powershell
|
|
47
|
+
# 安装最新版(web profile 示例;headless 等其他 profile 替换名字即可)
|
|
48
|
+
dsh plugin --profile web add dsh-project-mcp-manager@latest
|
|
49
|
+
|
|
50
|
+
# 安装指定版本(版本号可先 npm view dsh-project-mcp-manager versions 查看)
|
|
51
|
+
dsh plugin --profile web add dsh-project-mcp-manager@0.2.0
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**方式二:直接 pnpm 安装**(与方式一等价):
|
|
55
|
+
|
|
56
|
+
```powershell
|
|
57
|
+
# dshHome 默认为 %USERPROFILE%\.dsh(设置了 DSH_HOME 则用其值)
|
|
58
|
+
cd $env:USERPROFILE\.dsh\profiles\web
|
|
59
|
+
pnpm add dsh-project-mcp-manager@latest
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**方式三:本地开发安装**(junction 实时同步源码,改代码即生效):
|
|
63
|
+
|
|
64
|
+
```powershell
|
|
65
|
+
cd $env:USERPROFILE\.dsh\profiles\web
|
|
66
|
+
pnpm add link:<你的 dsh-mcp-project 源码目录> # 例如 D:\dev\dsh-mcp-project
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
> **dsh ≥ 0.1.2 注意**:插件是否生效取决于 profile 的 `dsh.profile.bundles`,
|
|
70
|
+
> 而单纯 `pnpm add link:` **不会**把包写进 bundles。方式一/方式二会自动补齐;
|
|
71
|
+
> 若你手写了 pnpm 命令,请再跑一次任意 `dsh plugin --profile web list`(或
|
|
72
|
+
> `--dump-config` 检查合成结果里有没有 `dsh-project-mcp-manager` 行)触发
|
|
73
|
+
> bundle reconcile。
|
|
74
|
+
|
|
75
|
+
**升级/锁定版本**:重跑方式一的 `add` 命令并带上目标版本后缀——`@latest`
|
|
76
|
+
升级到最新,`@0.2.0` 锁定到指定版本。
|
|
77
|
+
|
|
78
|
+
## 构建与测试
|
|
79
|
+
|
|
80
|
+
```powershell
|
|
81
|
+
pnpm install
|
|
82
|
+
pnpm run build # tsc → lib/
|
|
83
|
+
pnpm test # node 直跑 test/ 下六个 .mjs(model / mcp-file / json-file / json-write / registry / cli)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## 工作原理
|
|
87
|
+
|
|
88
|
+
- **项目发现**:在线 agent 会话的 `session.header.cwd` + dsh 进程启动目录 →
|
|
89
|
+
向上找最近的含 `.git` 的祖先目录作为项目根(无 `.git` 时退回目录本身)。
|
|
90
|
+
- **装载**:项目层每个 `(项目, serverName)` 在宿主 ctx 上装载一个
|
|
91
|
+
`@deepseek-ai/dsh-mcp-client` 实例(`ctx.plugin`),注册进全局工具层,同一
|
|
92
|
+
项目内多会话共享同一连接;**用户层每行只装载一个实例**(全局,与项目数无关)
|
|
93
|
+
——详见[配置来源与分层](guide/layers.zh.md)。
|
|
94
|
+
- **热重载**:chokidar 监听各项目根(depth 2,忽略 node_modules/.git/.hg/
|
|
95
|
+
.svn),但只有**已知项目根的精确配置文件**(`<projectRoot>/.dsh/mcp.yml`、
|
|
96
|
+
`<projectRoot>/.dsh/mcp.json` 与 `<projectRoot>/.mcp.json`)的改动经 150ms
|
|
97
|
+
防抖触发全量对账:新增行装载、删除行卸载、配置变化重装。另有独立 watcher 以
|
|
98
|
+
**精确文件路径**监听用户层:`~/.dsh/mcp.yml`、`~/.dsh/mcp.json` 与
|
|
99
|
+
`~/.dsh/profiles/<当前 profile>/mcp.json`(chokidar v5 对被监听的缺失文件能在
|
|
100
|
+
其创建时补发事件,前提是父目录已存在)——不监听家目录整体。
|
|
101
|
+
- **profile 名解析**:从 loader 根 include 的 `config.path`
|
|
102
|
+
(`~/.dsh/profiles/<name>/cordis.yml`)或 `ctx.baseUrl` 推导,可用
|
|
103
|
+
`DSH_MCP_PROFILE=<name>` 覆盖;解析不出时不读 profile 层(其余层照常)。
|
|
104
|
+
- **生效名**:原始 `serverName` 在整个目录(宿主全局行 + 全部项目行)中唯一时
|
|
105
|
+
保持原名;冲突时**项目行**改为 `p<sha256(项目根)前6位>_<原名>`(截断 32 字符,
|
|
106
|
+
确定性、与装载顺序无关),避免 `dsh-mcp-client` 按进程根的 serverName
|
|
107
|
+
预留冲突。全局行(profile patch 行与用户层行)参与占用判定但不改名。模型可见
|
|
108
|
+
的工具名由生效服务器名与 MCP 工具自身的名字拼成 `mcp__<生效名>__<工具名>`,
|
|
109
|
+
与文件里写的 `serverName` 可能不同。
|
|
110
|
+
- **会话可见性**:agent 创建时按其会话 cwd 解析项目,对该 agent 应用
|
|
111
|
+
`tools.restrict({ deny })`,deny 掉除本会话项目外的全部项目服务器,以及本项目
|
|
112
|
+
自身行压制过的全局服务器;会话无 cwd 时回退 owner 项目(子代理),再回退 dsh
|
|
113
|
+
进程 cwd 所在项目。会话销毁时释放。
|
|
114
|
+
|
|
115
|
+
## 安全边界
|
|
116
|
+
|
|
117
|
+
`.dsh/mcp.yml`、`.dsh/mcp.json` 与 `.mcp.json` 中的 `stdio` 行会在 dsh
|
|
118
|
+
宿主进程内 spawn 其 `command`——配置文件是**可执行代码载体**,只应在可信项目
|
|
119
|
+
中添加。用户层(`~/.dsh/mcp.yml`、`~/.dsh/mcp.json`、profile json)同样是可执行
|
|
120
|
+
代码载体,只是它们属于你自己的机器:用户层行会以**全局**方式装载(宿主级一条
|
|
121
|
+
连接,所有项目可见),不再按项目 fan-out。装载失败/配置无效行仅告警跳过,不影响
|
|
122
|
+
其他服务器。`~/.claude.json` 这类 Claude 用户态单体文件(混存凭据与项目历史)
|
|
123
|
+
自 v0.4.0 起**完全不再读取**。
|