Skip to content

Releases

v0.10.0

Choose a tag to compare

@wldxiaobai wldxiaobai released this 03 Nov 19:42

发布说明 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 的 Config schema、导出、传输集合、
    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

Choose a tag to compare

@wldxiaobai wldxiaobai released this 17 Oct 10:02
733b1d9

发布说明 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

Choose a tag to compare

@wldxiaobai wldxiaobai released this 17 Oct 06:56

发布说明 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 配置

Choose a tag to compare

@wldxiaobai wldxiaobai released this 03 Oct 14:58

本版本将 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.0

headless 可以使用同一个 bundle:没有浏览器运行时就没有设置页;缺少 connection 服务时,UI 不注册路由,也不阻塞核心装载器。

从独立 UI 安装迁移

如果之前单独安装过 dsh-project-mcp-ui:

  1. 安装或升级主包。
  2. 从 profile 的 dsh.profile.bundles 中移除独立 UI 选择,只保留 manager。
  3. 运行新 bundle 前,移除旧的直接 UI 依赖,或将其对齐到主包的精确版本,避免旧版本优先于传递依赖解析。

移除直接 UI 依赖的示例:

dsh plugin --profile desktop remove dsh-project-mcp-ui
# Web 端改用 --profile web

UI 仍会通过主包的依赖安装。

如果此前禁用了独立 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

Choose a tag to compare

@wldxiaobai wldxiaobai released this 02 Oct 09:40

发布说明 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 结束(含指纹未变、跳过重读但仍跑完巡检的那一轮)
    emit projectMcp/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

Choose a tag to compare

@wldxiaobai wldxiaobai released this 29 Sep 19:58

发布说明 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

Choose a tag to compare

@wldxiaobai wldxiaobai released this 29 Sep 19:57

发布说明 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

Choose a tag to compare

@wldxiaobai wldxiaobai released this 12 Sep 18:20

发布说明 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-manager v0.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

Choose a tag to compare

@wldxiaobai wldxiaobai released this 10 Sep 05:52

发布说明 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

Choose a tag to compare

@wldxiaobai wldxiaobai released this 09 Sep 18:53

发布说明 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.ts collectLayers 末尾两次 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 完全一致。