Repository navigation
Releases
v0.10.0
发布说明 v0.10.0(左侧栏入口 · 适配 dsh 0.2.1-rc.5)
← 返回 README | 相关:MCP 管理页指南 ·
dsh 0.2.1-rc.5 适配记录 ·
v0.9.0 发布说明
发布日期:2026-11-04 | 区间:v0.9.0 → v0.10.0
宿主:dsh 0.2 线,从 0.2.1-rc.5 起(engines.dsh 为 ^0.2.1-rc.5)。
0.2.1-rc.2–rc.4 继续使用 v0.9.0;dsh 0.2.0 继续使用插件 v0.8.2;dsh 0.1.5
继续使用 v0.6.0。
源码版本和 Git 标签不表示 dsh-project-mcp-manager 或 dsh-project-mcp-ui
已经发布到 npm。
亮点速览
| 主题 | 一句话 |
|---|---|
| 新入口 | 左侧栏出现「MCP 管理」,与「插件」「自动化任务」同一套面板机制 |
| 旧入口 | 「设置 → 内置插件 → 插件:MCP 管理」保留一个版本,计划在 0.11.0 移除 |
| 宿主对齐 | 依赖下限抬到 dsh 0.2.1-rc.5;client 桥接 schema 与 rc.2 逐字节相同 |
| 内部逻辑 | 配置读写、/api/project-mcp/* 路由、文件格式全部不变 |
用户可见变化
- 左侧栏新增「MCP 管理」。点开是同一个服务器列表页,整页宽度比设置弹窗宽;
侧栏收起成 56px 轨道时只显示图标,悬停或键盘聚焦显示名称。图标为数据库形状,
位置紧跟「插件」。 - 两个入口并存一个版本。新页面顶部写明旧设置页会保留到下一个版本;旧设置页
顶部写明新入口的位置,并说明本页将在下一个版本移除。 - 隐藏方式不变。只关闭 manager bundle 所含的
mcp-project-ui(或 profile
patch 按 id 覆盖禁用)就同时隐藏左侧栏与设置页两个入口,装载器继续运行。
宿主对齐:dsh 0.2.1-rc.5
@deepseek-ai/dsh-mcp-client、UI 的@deepseek-ai/dsh-native-command、client
开发依赖,以及两包engines.dsh一起抬到^0.2.1-rc.5。- 为什么是「抬下限」而不是「保持 rc.2」:rc.5 client 的 peer 是精确版本的 rc.5
包,npm 会把^0.2.1-rc.2解析成 rc.5;在 rc.2–rc.4 宿主上会装出一套对不上的
peer。声明 rc.5 为下限,旧宿主会得到明确的引擎拒绝,而不是静默混装。 - 已逐项核对 rc.5 的运行时接口:client 的
Configschema、导出、传输集合、
reconnect 上限与 MCP SDK 2.2.0 均未变;sidebar.panellist、main、
settings.plugins.tab仍由 rc.5 的对应包声明;connection.fetch.register
的入参形状不变;页面用到的 primitives 图标仍在 web 前端模块表里。 pnpm-workspace.yaml的minimumReleaseAgeExclude从 rc.2 换成 rc.5,避免
供应链年龄策略把新版本过滤掉、回落到旧 tuple。
迁移提示
- 升级到 0.10.0 后无需改配置、无需迁移文件;两个入口读写的仍是同一批受管
mcp.yml。 - 如果你还在 dsh 0.2.1-rc.2–rc.4,请留在插件 v0.9.0;升级宿主到 rc.5 后再装
0.10.0。 - 0.11.0 会移除设置标签页。如果你的操作手册或内部文档写着
「设置 → 内置插件 → 插件:MCP 管理」,现在就可以改成左侧栏「MCP 管理」。
验证
npm test(Node 26.7.0,rc.5 依赖树)全绿:model 34 / mcp-file 7 / json-file 13 /
json-write 6 / registry 63 / project-watch 5 / cli 21 / ui-collapse 14 / ui-paste 14 /
ui-display 7 / panel-helpers / bundle / ui-lifecycle 11。根与 client 两套
tsc --noEmit 通过。test-bundle.mjs 额外断言浏览器 bundle 同时保留
settings.plugins.tab 与 sidebar.panellist / main 两处注册,且两者共用一个
id。未做真机点击回归。
v0.9.0
发布说明 v0.9.0(适配 dsh 0.2.1-rc.2)
← 返回 README | 相关:适配记录 ·
v0.8.2 发布说明 ·
dsh 0.2.0-rc.2 适配记录
发布日期:2026-10-17 | 区间:v0.8.2 → v0.9.0
宿主:dsh 0.2 线,从 0.2.1-rc.2 起。dsh 0.2.0 继续使用插件 v0.8.2。
dsh 0.1.5 继续使用插件 v0.6.0。
官方 dsh 仍不发现项目级 MCP 文件、不按会话隔离工具、也没有 MCP 专用 CLI。
v0.9.0 把装载后端对齐到宿主自带的 @deepseek-ai/dsh-mcp-client@0.2.1-rc.2。
这一版 client 的桥接代码与 0.2.0-rc.2 相同,配置字段没有新增。
源码版本和 Git 标签不表示 dsh-project-mcp-manager 或 dsh-project-mcp-ui
已经发布到 npm。
亮点速览
| 主题 | 一句话 |
|---|---|
| 依赖下限 | @deepseek-ai/dsh-mcp-client 与 UI 的 dsh-native-command 抬到 ^0.2.1-rc.2;cordis 开发依赖 ^4.0.5 |
| 宿主门禁 | 两包 engines.dsh 为 ^0.2.1-rc.2 |
| 项目焦点 | 仍读 session.header.cwd。working_directory 不挪 MCP 可见性 |
| 传输 | 仍是 stdio | streamable-http。装载时的 MCP SDK 为 2.2.0 |
用户可见变化
- 支持矩阵改为 dsh ≥ 0.2.1-rc.2(
0.2线,engines.dsh上限<0.3.0-0)。
^0.2.0-rc.2解析不到0.2.1-rc.*,且旧 client 的 cordis peer~4.0.4
接不住宿主的 4.0.5。 - 在 dsh 0.2.1 里调用
working_directory只改当前执行目录。项目 MCP 仍跟着
会话创建时的原始项目。 - 设置页仍挂在「设置 → 内置插件 → 插件:MCP 管理」。精确 Fetch 路由由宿主
只对 owner Peer 放行,页面本身的注册方式不变。
验证
pnpm test(Node 22.23.3)全绿:model 34 / mcp-file 7 / json-file 13 /
json-write 6 / registry 63 / project-watch 5 / cli 21 / ui-collapse 14 /
ui-paste 14 / ui-display 7 / panel-helpers / bundle 11 / ui-lifecycle 11。
0.2.1-rc.2 client 能在解析后的 peer 树上加载。没有做 headless 实机装载。
v0.8.2
发布说明 v0.8.2(项目监听不再钉住工作区)
← 返回 README | 相关:v0.7.2 发布说明
发布日期:2026-10-17 | 区间:v0.8.0 → v0.8.2
宿主:dsh 0.2.0 线(从 0.2.0-rc.2 起),与 v0.8.0 相同。配置口径与装载语义不变。
v0.8.1 是未正常发布的内部版本,不作为对外发布。本说明沿用它的内容。v0.8.2 与 dsh-project-mcp-ui 0.8.2 同步升版。源码版本和 Git 标签不表示两个包已经发布到 npm。
v0.8.2 收窄项目层文件监听。此前 chokidar 以 depth 2 对项目根下两层内的每个目录和文件调用 fs.watch。Windows 上这些句柄让目录停在 delete-pending,构建脚本删除 lib/ 会得到 ENOTEMPTY,并且在宿主重启前无法在原路径重建。
亮点速览
| 主题 | 一句话 |
|---|---|
| 监听范围 | 只放行项目根、.dsh 和三个配置文件,depth 改为 1 |
| 热重载 | .dsh 事后创建,以及三个配置文件的新增、修改、删除,仍然触发对账 |
| 用户层 | 用户层与 profile 层仍按精确文件路径监听,这次没有改 |
变更明细
- allow-list:
syncWatcher只打开项目根、.dsh、.dsh/mcp.yml、.dsh/mcp.json、.mcp.json。其它路径一律忽略,因此不会打开lib/、src/、build/。 - depth:用 1。0 看不到
.dsh里的文件;再深就会打开工作区第一层目录。 - 三个配置文件留在集合里:目录重读只发出新增和删除,内容变化靠文件自己的
fs.watch。 - 不能改成只盯三个尚不存在的路径。
.dsh还不存在时,chokidar 会退回监听项目根,并且只匹配根下名叫mcp.yml的文件,之后创建的.dsh/mcp.yml收不到。 - 文档:npm 0.8.0 web profile 的验证记录和本地一次性产物的清理口径归档到
docs/testing/。
验证
pnpm test 在本机 Windows 10.0.26200、Node v26.7.0 上通过(model 34 / mcp-file 7 / json-file 13 / json-write 6 / registry 63 / project-watch 5 / cli 21 / ui-collapse 14 / ui-paste 14 / ui-display 7 / panel-helpers 7,bundle 与 UI 生命周期一并通过)。新增 test/test-project-watch.mjs 的路径断言与 normalizePathKey 一样,在 Windows 上先转小写再比较。
另用本机 DSH 运行时(DeepSeek Harness 的 Electron,Node v24.18.1,libuv 1.52.1)对照过监听集合:旧的 depth 2 会把 lib/、src/ 放进 getWatched(),这一版的 allow-list 只留下 .dsh 和配置文件;两种监听下改 .dsh/mcp.yml 都收到 change。这台系统上,监听开着时 rmSync('lib') 已经能删掉并重建,ENOTEMPTY 没有复现。修复保证的是这些目录不再被打开。
v0.8.0 — 默认集成 MCP 管理界面,新增 profile YAML 配置
本版本将 MCP 设置界面纳入默认安装:只安装 dsh-project-mcp-manager,即可同时获得核心装载器与管理 UI,无需另外安装 UI 包。
同时新增 profile 层原生 YAML 配置,完善服务器状态展示,并修复新工作区加载、启动状态更新和 UI 卸载时的资源清理问题。
✨ 默认包含 MCP 管理界面
主包默认 bundle 包含两个组件,均默认启用:
| 组件 | 用途 |
|---|---|
mcp-project |
核心 MCP 装载器 |
mcp-project-ui |
MCP 设置界面 |
主包与配套 dsh-project-mcp-ui 统一使用 0.8.0,以精确版本配套。
设置页入口:设置 → 内置插件 → 插件:MCP 管理。
可以在界面中:
- 查看工作区、profile 和用户层的 MCP 服务器及运行状态。
- 添加服务器,配置命令、参数、地址和相关字段。
- 从剪贴板中的 JSON 或 YAML 配置填入添加表单。
- 启用、停用或删除服务器,管理单个工具的可见性。
- 通过「MCP 配置」菜单打开对应作用域的配置文件。
界面只写入受管 mcp.yml,不会直接修改 JSON 配置或遗留 .mcp.json。修改其他来源的服务器时,会先确认,再将覆盖配置写入同作用域的受管 YAML 文件。
只想隐藏设置页时,可在插件管理器中关闭 mcp-project-ui,保留 mcp-project:关闭 UI 不会停止核心装载器。
🗂️ 新增 profile 层 YAML 配置
支持原生受管配置:
~/.dsh/profiles/<name>/mcp.yml
七层配置优先级由高到低为:
工作区 .dsh/mcp.yml
→ 工作区 .dsh/mcp.json
→ 工作区 .mcp.json
→ 当前 profile 的 mcp.yml
→ 当前 profile 的 mcp.json
→ 用户层 ~/.dsh/mcp.yml
→ 用户层 ~/.dsh/mcp.json
CLI 的 profile 作用域默认写入 YAML;需要继续写 JSON 时,可显式使用 --format json。未指定格式的 profile 删除操作会先检查 YAML,再检查 JSON。
🖥️ 更准确的服务器列表与状态
- 工作区、profile、用户层分别展示,不再将 profile 服务器归入用户层。
- 区分“已启用但等待会话”和“实际运行中”,运行中的服务器显示工具数量。
- 显示配置来源、跳过原因,以及写入时需要接管到受管 YAML 的提示。
- 同名低优先级配置保留为覆盖说明;同命令或地址、但名称不同的非 YAML 冗余项不再显示为独立卡片。
- 统一中英文术语、确认按钮和路径展示,用户及 profile 路径以
~简写。
🛠️ 稳定性修复
- 修复服务器已连接,但设置页仍显示“正在启动”的问题。
- 修复运行过程中首次打开工作区时,MCP 配置需要重启才加载的问题。
- 修复停用 UI 或 connection 服务销毁后,已有 SSE 连接未完整清理的问题;现在会释放订阅、心跳定时器及中止监听器。
- 项目诊断文件迁移到
$DSH_HOME/mcp-diag/,不再写入工作区;遗留诊断文件会在后续对账时清理,CLI 状态查询同步使用新路径。
📦 安装与升级
两个 0.8.0 包发布到 npm 后,只需安装主包:
# 桌面端
dsh plugin --profile desktop add dsh-project-mcp-manager@0.8.0
# Web 端
dsh plugin --profile web add dsh-project-mcp-manager@0.8.0headless 可以使用同一个 bundle:没有浏览器运行时就没有设置页;缺少 connection 服务时,UI 不注册路由,也不阻塞核心装载器。
从独立 UI 安装迁移
如果之前单独安装过 dsh-project-mcp-ui:
- 安装或升级主包。
- 从 profile 的
dsh.profile.bundles中移除独立 UI 选择,只保留 manager。 - 运行新 bundle 前,移除旧的直接 UI 依赖,或将其对齐到主包的精确版本,避免旧版本优先于传递依赖解析。
移除直接 UI 依赖的示例:
dsh plugin --profile desktop remove dsh-project-mcp-ui
# Web 端改用 --profile webUI 仍会通过主包的依赖安装。
如果此前禁用了独立 UI bundle,应在加载新 manager bundle 前添加以下 profile patch,保留停用意图:
- id: mcp-project-ui
disabled: true旧 bundle 选择和直接依赖不会承诺自动清理。
✅ 兼容性与验证
- 宿主支持范围保持为 dsh
0.2.0线,从0.2.0-rc.2起。 - 仍使用 dsh
0.1.5的用户,请继续使用插件0.6.0。 0.8.0核心与 UI 构建、锁文件校验及全套回归测试通过。- 默认 bundle 已通过真实打包单包安装、Web 页面及 headless 联调验证,包括单独停用/重新启用 UI 时保持核心运行。
完整变更: v0.7.2...v0.8.0
v0.7.2
发布说明 v0.7.2(查询面推送)
← 返回 README | 相关:查询面 ·
v0.7.1 发布说明
发布日期:2026-10-02 | 区间:v0.7.1 → v0.7.2
宿主:dsh 0.2.0 线(从 0.2.0-rc.2 起),与 v0.7.1 相同。装载语义不变。
v0.7.2 让配套 UI 不用再定时轮询 snapshot()。对账成功结束时发一条进程内事件,
视图类型从包入口具名导出。浏览器 SSE 仍由 UI 包自建。
亮点速览
| 主题 | 一句话 |
|---|---|
| 变更事件 | 对账成功结束 ctx.emit("projectMcp/updated"),无载荷;监听方再读 snapshot() |
| 具名类型 | 包入口导出 ProjectFileState、McpServerRuntimeView、McpServerView、McpRowSource 等,并开始生成 .d.ts |
| 稳定性 | 方法、事件与这些视图类型对配套 UI 按语义化版本承诺;UI 包以同一精确版本 peer-depend |
变更明细
- 变更事件:每次成功的
reconcileAll结束(含指纹未变、跳过重读但仍跑完巡检的那一轮)
emitprojectMcp/updated。查询方法本身不发。监听方抛错记一条
项目 MCP 变更事件投递失败:…,对账仍算成功。 - 类型出口:
declaration打开后lib/index.d.ts才存在;package.json的types
指向它。exports仍不开放lib/深导入。 - 配套 UI:查询面从「不承诺稳定」改为对该消费方按语义化版本演进。patch 保持形状,
minor 只增加,major 才删除或改名。peer 写成精确版本,不要^/~。
验证
pnpm test 六套全绿(model 33 / mcp-file 7 / json-file 13 / json-write 6 /
registry 48 / cli 21)。
v0.7.1
发布说明 v0.7.1(代码审查整改)
← 返回 README | 相关:审查记录 ·
v0.7.0 发布说明 ·
dsh 0.2.0-rc.2 适配记录
发布日期:2026-09-30 | 区间:v0.7.0 → v0.7.1
宿主:dsh 0.2.0 线(从 0.2.0-rc.2 起),与 v0.7.0 相同;纯补丁版,配置口径与装载语义不变。
v0.7.1 只落地 feat/adapt-dsh-0.2.0-rc.2 代码审查
的意见:一处可靠性修复、一处死代码清理、两条回归测试,以及不改变语义的小重构。
亮点速览
| 主题 | 一句话 |
|---|---|
| 后台任务失败可见 | 所有不 await 的入队统一走 schedule(),失败记一条 warn(原先完全静默) |
| 死导出 | 删除无人引用的 DEFAULT_MAX_INSTRUCTION_BYTES,避免与上游默认漂移 |
| 回归测试 | 覆盖 agent/created(source: "resume")事件路径与「连接字段变更必拆连接」的装载计划 |
| 小重构 | 抽 enqueueDiag()、放宽 enqueue() 签名;配置指纹的 stat 并发发起 |
变更明细
- 后台入队(审查 S1 / Sonar S9383):构造函数的
agent/created、agent/disposed
与插件热更补扫三处,加上文件事件kick、宽限卸载 timer、kickSweep,全部改走新的
schedule()——enqueue()的返回值不再被丢弃,失败会记一条
项目 MCP 后台任务失败:<原因>。此前这类失败被链路完全吞掉:对账没跑成,日志里
什么也看不到。诊断落盘(fiber settle 后的active/failed)仍走独立的
enqueueDiag():同样排回对账链,但按最佳努力静默失败。 - 死代码(审查 B1):删掉
DEFAULT_MAX_INSTRUCTION_BYTES。「缺省不写键、让官方
默认值生效」的口径由字段注释与四处输出(官方配置 / 受管行 / view / JSON 条目)的
测试固定,不需要再在本地留一份 32768。 - 回归测试(审查 B2、B3):新增两条用例——
agent/created带source: "resume"时补扫并挂载会话项目,且对被自己项目行遮蔽的
全局实例应用 deny(项目侧压制展开成精确工具名);planProjectChanges在
maxInstructionBytes这类连接字段变化时产出 unmount → mount,而tools变化不拆连接。 - 小重构(审查 S7503、S9381、S9382):
enqueue()签名放宽为() => T | Promise<T>,
serverView()/snapshot()去掉只为满足签名的async;trackMount的 fiber settle
回调改调enqueueDiag(),消掉嵌套 Promise;配置指纹的逐文件stat改Promise.all
并发发起(签名仍按排序后的路径逐条拼接,结果与串行一致)。
验证
tsc --noEmit 通过;六套测试全绿(model 33 / mcp-file 7 / json-file 13 /
json-write 6 / registry 48 / cli 21,registry 比 v0.7.0 多两条新用例)。
v0.7.0
发布说明 v0.7.0(适配 dsh 0.2.0-rc.2)
← 返回 README | 相关:适配记录 ·
v0.6.0 发布说明 ·
0.1.6-alpha.2 适配方案
发布日期:2026-09-30 | 区间:v0.6.0 → v0.7.0
宿主:dsh 0.2.0 线,从 0.2.0-rc.2 起。dsh 0.1.5 继续使用插件 v0.6.0。
官方 dsh 仍不发现项目级 MCP 文件、不按会话 cwd 隔离工具、也没有 MCP 专用 CLI。
v0.7.0 把装载后端对齐到宿主自带的 @deepseek-ai/dsh-mcp-client@0.2.0-rc.2,
并补上这一版新增的配置字段。
亮点速览
| 主题 | 一句话 |
|---|---|
| 依赖下限 | @deepseek-ai/dsh-mcp-client 抬到 ^0.2.0-rc.2;cordis 开发依赖 ^4.0.4 |
| 会话事件 | 删除已不存在的 agent/session-start;补扫由 agent/created(含 source)承担 |
| instructions 上限 | 可选透传 maxInstructionBytes;缺省不写键,官方默认 32768 |
| 定位 | 承认官方 profile patch / HMR / resources;本插件留下项目发现、会话隔离、CLI |
用户可见变化
- 支持矩阵改为 dsh ≥ 0.2.0-rc.2(
0.2.0元组)。^0.1.5-rc.1解析不到
0.2.0-rc.*,不改范围就会在新宿主里嵌一套旧 client。 .dsh/mcp.yml与 JSON 方言可以写maxInstructionBytes(整数 ≥ 1)。省略时
不把 32768 抄进配置。超限由官方 client 拒绝该次连接。dsh-mcp不增加对应参数。- 官方 stdio 会丢掉父进程里名字像凭据的环境变量和
DSH_*。写进env并经
${VAR}展开的值仍然传给子进程。
验证
pnpm test 六套全绿(model 33 / mcp-file 7 / json-file 13 / json-write 6 /
registry 46 / cli 21)。headless profile 实机见适配记录。
v0.6.0
发布说明 v0.6.0(运行时稳健性与 JSON 互通)
← 返回 README | 相关:v0.4.3 发布说明 ·
设计提案 ·
本区间 TypeScript 审查 ·
审查落地复查(7e0088d…804662f)
发布日期:2026-09-13 | 区间:v0.4.3 → v0.6.0
规模:PR #9(提案 A/B/C 组,C3 除外)+ 审查落地与 Sonar 拆分;
pnpm test 六套全绿
v0.6.0 落地
运行时稳健性与 JSON 互通提案。
一次跳过中间的 0.4.4 / 0.5.0 切分,是因为 B1 按需挂载改变了装载语义
(无会话项目不再常驻 stdio 子进程)。VS Code .vscode/mcp.json 只读层(C3)
本轮明确不做。
亮点速览
| 主题 | 一句话 |
|---|---|
项目层只给有会话 ∪ 进程 cwd 的项目装载;无会话宽限 5 分钟后卸载,记 idle |
|
| 连接自愈 | 当前 fiber 世代曾有工具、持续 0 工具才重挂;恢复清零;连续 3 次失败才 give-up |
诊断摘要 + status |
{ summary?, events };CLI 不连宿主即可看层行数、idle / 不健康 / 预算 |
dsh-mcp import |
批量导入 mcpServers;同名锁内 skip;--dry-run 预演影子冲突 |
| 工具过滤 / 预算 | 条目 tools.allow/deny;超阈值只告警不裁剪 |
| JSON 互通 | 传输值域镜像官方 client;SSE 可执行报错;Gemini httpUrl;对方格式诊断 |
projectMcp 查询面 |
不稳定 API:内存快照进 enqueue,不读盘、不驱动对账 |
用户可见变化
装载与运行时
- 按需挂载:扫描与生效名仍按全量已知项目计算;项目层只给「有活跃会话 ∪
进程 cwd」的项目发起装载。最后一次会话离开且该项目不是 cwd 后,宽限 5 分钟
再卸载服务器,保留条目与文件监听,行记skipReason: "idle"并进入
summary.idle(不算不健康;已有env-missing等更具体原因不覆盖)。
用户层仍宿主级常驻。 - 连接自愈:曾经在当前 fiber 世代暴露过工具、后来
mcpToolCount === 0
且持续超过退避窗口时 unmount 再 mount。单次 0 工具边沿(list_changed
闪空)不拆连接;新一代首连窗口交给官方 client 内部重连。tools > 0清
remountCount/givenUp(连续失败,不是寿命配额;连续 3 次无恢复才
give-up)。disabled: true/enabled: false不复活。 - 配置指纹:
mtimeMs+size加上当前 profile 名与排序后的宿主全局名未变则
跳过文件重读,仍跑巡检 / deny / 预算 / 摘要。运行中改DSH_MCP_PROFILE
或宿主 patch 名集会失配并重读。 - 工具预算:超过
DSH_MCP_TOOL_BUDGET_WARN(缺省 200 工具 / 256KiB)每次
越过阈值告警一次并写入诊断摘要,回落到阈值下会清门控。永不裁剪。
deny 展开与预算共用schemaToolId(name优先于id)。 - 工具过滤:条目
tools.allow/tools.deny(完整 glob;deny 优先)。
JSON 亦映射includeTools/excludeTools。只改过滤不拆连接。完整
mcp__…模式按生效名匹配(项目行改名后写死原名不会命中)。非法 glob
(例如[z-a])按条目告警一次。
JSON / CLI
- 传输值域镜像官方 client(
stdio|streamable-http)。 - MCP SSE 端点传输给出可执行报错,不静默回退。
- 接受 Gemini
httpUrl与原生transport;裸url在本插件仍是 Streamable
HTTP(与 Gemini 相反,已文档化)。无type/transport时同时有command
与url/httpUrl的条目报错,不当 stdio 静默装载。 - 对方
{version, servers}存储格式写诊断并声明共存。用户层 watcher 监听
$DSH_HOME/dsh-mcp.json,创建即可诊断;该文件若已是本插件mcpServers
方言,提示搬到mcp.json,仍不从此路径装载。 - 诊断文件
{ summary?, events };rows按配置目录计。dsh-mcp status
打印层行数与摘要。--scope project|user|profile只打印对应层与诊断文件
(profile只列 profile 层,可再配--profile)。idle 打成「未装载(无会话)」。 dsh-mcp import --from <file|->批量导入mcpServers(缺省 project,
--dry-run/--overwrite;同名 skip/overwrite 在锁内判定)。dsh-mcp add没有--allow/--deny;过滤请写文件或用import。
list/get会展示已有过滤(只显示模式文本)。
插件查询面
其它插件可经不稳定服务 ctx.projectMcp(snapshot / serverView /
globalState / reload)读装载状态。查询进 enqueue、只读上一轮对账内存,
不读盘、不驱动对账。不承诺 API 稳定。
审查收口
两轮 TypeScript 审查的高/中优先级项均已落地后再切 tag:
- v0.4.3 至 v0.6.0
(H1–H2 / M1–M8) - 7e0088d 至 804662f 复查
余项(健康配额恢复清零、查询面内存快照、同世代 0 工具去抖、idle 不算不健康、
status --scope profile等)在dcdcdab及后续 commit 关闭。
PR #9 后续的 Sonar 认知复杂度拆分不改变行为。
升级
- 行为变化:长期开着许多项目、但只有一两个有会话时,未活跃项目的 MCP
子进程会在 5 分钟宽限后退出。需要某个无会话项目始终在线时,把 dsh 进程 cwd
放在该项目,或保持至少一条会话。 - 配置文件格式向后兼容;
type: "sse"仍会跳过,只是报错更可执行。 - 不读
.vscode/mcp.json(与 v0.4.3 相同)。 - 宿主对齐:与 dsh 0.1.5-rc.1 / rc.2 同线(
@deepseek-ai/dsh-mcp-client ^0.1.5-rc.1)。rc.2 相对 rc.1 仅为 UI 变更,运行时无差别。
dsh plugin --profile <p> add dsh-project-mcp-manager@0.6.0组件版本
dsh-project-mcp-managerv0.6.0 | 依赖@deepseek-ai/dsh-mcp-client ^0.1.5-rc.1、
chokidar ^5、yaml ^2、zod ^4(开发:@deepseek-ai/cordis ^4.0.2、typescript ^7)- 实测宿主:
@deepseek-ai/dsh@0.1.5-rc.2(见
适配记录)
Full Changelog:v0.4.3...v0.6.0
v0.4.3
发布说明 v0.4.3(对齐 dsh 0.1.5-rc.1)
← 返回 README | 相关:v0.4.2 发布说明 ·
dsh 0.1.5-rc.1 适配记录
发布日期:2026-09-10 | 区间:v0.4.2 → v0.4.3
规模:依赖对齐 1 commit + 适配记录 1 commit + 发布 1 commit;
无源码与测试改动,测试套件与用例数不变(6 套 101 例全绿)
v0.4.3 是一次宿主对齐版本:把运行时依赖从 dsh 0.1.2-rc.1 线升到
0.1.5-rc.1,避免已发布的 v0.4.2 在新宿主里继续装入自带的旧 mcp-client
副本。没有任何用户可见的行为变化——配置格式、装载语义、deny 隔离与
CLI 输出与 v0.4.2 完全一致。
变更
@deepseek-ai/dsh-mcp-client ^0.1.2-rc.1 → ^0.1.5-rc.1
^0.1.2-rc.1 不会解析到 0.1.5-rc.1:npm semver 要求带 prerelease 的
候选版本与比较符的 major.minor.patch 元组相同。v0.4.2 因此在 dsh 0.1.5-rc.1
宿主进程里加载插件自带的 0.1.2-rc.1 客户端及其 0.1.2-rc.1 peer
(dsh-tools / dsh-scope / dsh-timeout 等)。
升到 ^0.1.5-rc.1 后,mcp-client 与全部 peer 解析到 0.1.5-rc.1,与宿主
同版。pnpm 12 为这批刚发布的 rc 写入 pnpm-workspace.yaml 的
minimumReleaseAgeExclude,否则供应链门禁会挡住安装。
静态核对:tools.restrict、agents.list / isOwnedBy、会话事件名、
mcp-client Config、serverName 约束、mcp__<name>__<tool> 命名与
MAX_TIMER_DELAY_MS 均无断裂。实现 diff 仅 tools/list 增加重复
continuation cursor 校验。
隔离实机:ProjectMcpRegistry 读项目 .dsh/mcp.yml 后
scan → attempt → active,mcp__compat-probe__probe →
pong:compat-015。完整记录见
适配记录。
升级
无破坏性变更,无需改任何配置文件。
已装 v0.4.2 且宿主已升到 dsh 0.1.5-rc.1 的 profile,把插件升到 v0.4.3
即可去掉进程内双副本:
dsh plugin --profile <p> add dsh-project-mcp-manager@0.4.3本地 link 开发:pnpm install 后确认
@deepseek-ai/dsh-mcp-client 解析为 0.1.5-rc.1。
v0.4.2
发布说明 v0.4.2(质量门禁收口)
← 返回 README | 相关:v0.4.1 发布说明
发布日期:2026-09-16 | 区间:v0.4.1 → v0.4.2
规模:代码修复 1 commit + 锁文件元数据 1 commit + 发布 1 commit;
源码与测试 8 文件 +106 / −54,无新增模块,测试套件与用例数不变(6 套 101 例全绿)
v0.4.2 是一次纯代码质量版本:清零 PR #7 上 Sonar「New Code 可靠性评级 = D」
门禁的全部 15 项告警(12×S2871、1×S3776、1×S7778、1×S1199)。
没有任何用户可见的行为变化——每一处修改要么是把代码原本就在做的语义显式写出来,
要么是内部拆分。
修复
字符串排序全部改用显式比较器(12 项 CRITICAL,S2871)
Array.prototype.sort() 不带比较器的写法被静态分析判为可靠性缺陷(默认序随元素
toString 漂移)。新增 src/model.ts 导出的具名比较器:
export function byCodeUnit(a: string, b: string): number {
if (a < b) return -1;
if (a > b) return 1;
return 0;
}它就是 UTF-16 码元序——与 sort() 默认行为逐字节等价,所以全部排序结果的既有
顺序不变、测试零改动。刻意不用 localeCompare:诊断/快照的键集顺序、告警门控签名、
list 输出序都是 wire 可见的,不能交给宿主机的 locale 决定。落点:
src/registry.ts 6 处(canonicalConfig、两个签名函数、两路 watcher 键、blocked 集)、
src/cli.ts 1 处(profile 枚举)、五个测试文件 8 处(含未被标记的同类,一并对齐)。
scanProject 认知复杂度 24 → 约 6(S3776)
两处无损拆分(src/registry.ts):
- 同服务剔除告警 + 变更门控(签名比对、告警循环)抽为方法
warnIdentityShadows(key, projectRoot, identityShadows): boolean,返回
shadowChanged供诊断条件使用; - scan 诊断的「值不值得写」大 || 条件与载荷字段抽为纯函数
buildScanDiag(input): Record<string, unknown> | null,返回null即
「干净且无配置」——零配置项目不留痕的约定原样保持,写入的载荷逐字段等价。
其余两项 MINOR(S7778 / S1199)
src/cli.tscollectLayers末尾两次layers.push合并为单次调用(实参自左向右
求值,六层影子优先序不变)。test/test-model.mjs第 17 用例去掉冗余裸块。
依赖元数据
pnpm-lock.yaml 的 @deepseek-ai/cordis importer specifier 由 ^4.0.1 同步为
^4.0.2——package.json 自 v0.4.1 起声明的就是 ^4.0.2(解析版本一直是 4.0.2),
此前锁文件差一行元数据导致 pnpm 每次运行都要求重锁。不改依赖解析结果。
升级
无破坏性变更,无需任何操作:不写不改任何配置文件,装载、deny、诊断、CLI 输出与
v0.4.1 完全一致。