Repository navigation
Releases: MCviseron/dsh-matlab-mcp
Releases · MCviseron/dsh-matlab-mcp
Release list
v0.7.1
0.7.1 - 2026-10-14
修复
deploy/proxy-config.mjs非默认端口漏端口:--port 8443时生成的proxy_redirect目标与downloadMirror行都不带端口(指向 80/443),客户端第一跳就会走进死路。现在引入authority(默认端口省略、非默认端口补上),三处proxy_redirect、镜像行与验证命令统一使用它。
新增
deploy/DEPLOY.md:服务器部署详细流程 —— 现状勘察(含按发行版/宝塔/1Panel/Docker 判断配置目录)、备份、放文件、nginx -t+reload、本机 curl 判读表、安全组放行、插件填一行、回滚,以及未备案决策树(非标端口 / IP 直连 / 境外机器)。
v0.7.0
0.7.0 - 2026-10-14
变更
- 划清边界:服务器侧部署工具移出插件目录。原先放在
scripts/的mirror-assets.mjs(建静态镜像)与proxy-config.mjs(生成 nginx 反代配置)移到deploy/,并配独立 README 说明「这不是插件的一部分、npm 包也不包含它」。scripts/现在只剩插件侧内容:install.mjs(把插件装进 DSH)与各类验证探针。- 插件 README 把原来大段的 nginx/备案/端口内容压成一小节「制品获取(镜像 / 本地目录)」:只保留插件自身需要配置的
downloadMirror/localAssetsDir,其余指向deploy/。
- 插件运行逻辑不变:这两个字段是插件「从哪取制品」的配置能力(默认关闭/空值),与制品如何部署到服务器上无关。
v0.6.1
0.6.1 - 2026-10-14
修复
proxy-config.mjs在 IP 场景不可用:--host给 IP 时原来仍生成listen 443 ssl+ 证书占位符,而 IP 一般拿不到公共 CA 证书(实测dl.159.75.130.207这类「前缀+IP」连 DNS 都解析不了)。现在按主机名自动选择:IP →--scheme http(listen 80,不生成 ssl 指令)并给出提示;域名 → HTTPS。新增--scheme/--port显式覆盖。- 反代下 19.5 MB 二进制缓存永远 MISS:release 资产的最终 URL 带会轮换的签名串(
?sp=…&se=…&sig=…),而 nginx 默认把整个 request URI 计入 cache key。生成配置现在给/mp-assets/指定proxy_cache_key "$scheme$request_method$host$uri"(仅按路径),并加proxy_read_timeout/send_timeout 300s。 - 生成文件的头部注释补充放置位置说明(Debian/Ubuntu 的
conf.d已在http{}内;CentOS/宝塔注意server{}上下文)。
v0.6.0
0.6.0 - 2026-10-14
新增
- 服务器反代配置生成器
scripts/proxy-config.mjs:输出可直接粘贴的 nginx 片段(三段上游 + 缓存 + Range 透传 + 安全限制)与对应的 DSH 镜像行,适合「不占磁盘、配置即用」的部署。- 实测跳转链决定了配置形态:
…/releases/latest/download/X→ github.com(同主机换 tag)→ release-assets.githubusercontent.com(19.5 MB 二进制终态);…/archive/refs/heads/main.zip→ codeload.github.com。nginx 不跟随跳转,因此codeload与release-assets各需独立location并用proxy_redirect把跳转留在代理内,否则客户端会绕过代理直连 GitHub CDN。 - 生成的配置默认包含
limit_except GET HEAD与client_max_body_size 1m以避免开放代理,并加X-Mirror-Cache便于验证缓存命中。
- 实测跳转链决定了配置形态:
- 本地制品目录
localAssetsDir(可选、完全离线):命中mirror-assets.mjs产出的目录树时直接复制、零网络请求;优先级 本地目录 → 镜像列表 → 直连。适合内网/断网机器与「一次拷贝、多机复用」。
变更
- 供给日志区分来源:
本地目录 / local、镜像 / via mirror或直连。
v0.5.0
0.5.0 - 2026-10-14
新增
- 自建镜像工具
scripts/mirror-assets.mjs:在一台网络好的机器上跑一次,产出可整体上传的静态目录树(按 GitHub 路径排布,因此一个{path}模板即可覆盖全部制品)、mirror.json(路径 + 字节数 + sha256)、nginx.conf.example与README.txt(上传/部署/验证清单)。- 实测:4 个文件合计 38.4 MB(二进制 19.5 MB + 工具箱 0.06 MB + 两个 zipball 4.1/16.4 MB),经
gh-proxy.com拉取 5.22 / 0.06 / 4.12 / 13.55 MB/s。 - 支持
--via <模板>:抓取时也可走镜像;--out/--base-url/--asset/--force。
- 实测:4 个文件合计 38.4 MB(二进制 19.5 MB + 工具箱 0.06 MB + 两个 zipball 4.1/16.4 MB),经
- 端到端验证:本地起静态服务器模拟「用户自己的服务器」,在隔离的 DSH_HOME 里跑插件的真实供给流程 —— 二进制
v0.14.0 (via mirror)、工具箱via mirror、两个技能仓均从该服务器下载,ready: true。 - 文档新增「自建镜像」一节:静态模式(推荐)与反向代理模式的取舍,以及开放代理风险的明确警告(不得做成对全路径开放的 GitHub 代理)。
说明
- 静态模式对服务器零副作用:不新开端口、不访问外网、无缓存进程;磁盘占用即上表 38.4 MB,CPU/内存开销可忽略。
- 许可提示:把 MathWorks 制品放到自己的服务器供自己使用属于私有使用;发布到公共 registry/公开站点则构成再分发,需遵守其许可证(保留版权与许可声明、仅配合 MathWorks 产品使用)。
v0.4.0
0.4.0 - 2026-10-14
修复
- 严重:点「一键安装 / 修复」后 DSH 客户端崩溃(
dsh: fatal uncaught exception: Error: spawn ...bin\matlab-mcp-server-windows-x64.exe ENOENT)。- 根因不是文件缺失:libuv 在
cwd不存在时同样报spawn <exe> ENOENT(错误指向命令,实为 chdir 失败)。挂载配置的cwd指向<DSH_HOME>\matlab-mcp\workspace,而全新机器上该目录从未被创建(一键安装只建了缓存根与logs/)。新机器时间线:启动时还没有二进制 → 不挂载(安全)→ 点安装 → 二进制就位 → 路由reconnect()→ 用不存在的cwd启动 → 未捕获异常 → 宿主退出。 - 实测对照:同一个真实存在的 exe,
cwd正常 →spawned ok;cwd不存在 →ENOENT,与崩溃日志逐字一致。 - 修复(多层防护):①
buildLaunch构造启动配置时创建cwd与--log-folder;② 挂载前用我们自己的execFile做--version预检,跑不起来的二进制不再交给 MCP 客户端,改为可操作报错;③ 挂载配置在ctx.inject(['tools'])回调内现算,压掉「检查存在」与「真正 spawn」之间的窗口;④probeMcp补上child.on('error')(此前缺该监听,同样会变成未捕获异常);⑤ 下载改为暂存校验后再原子换入(校验在.partial上做),失败只清理暂存文件;ensureBinary不再「先删后下」,也不再对下载后跑不起来的二进制返回成功。
- 根因不是文件缺失:libuv 在
- 这是 DSH 侧
dsh-mcp-client的健壮性缺陷:子进程spawn失败以未捕获异常终止宿主。插件已从自身侧消除可预见的触发条件,仍建议向上游反馈「ChildProcess的'error'事件必须被捕获」。
变更
- 多镜像 + 镜像优先:
downloadMirror改为逗号分隔的模板列表(支持{url}前缀式、{path}换主机式,兼容老的纯前缀写法);开启镜像后镜像优先、直连兜底(实测直连 0.21 MB/s vs 镜像 2.5–9.5 MB/s)。 - 默认镜像按实测重排:
gh-proxy.com→gh.llkk.cc→ghproxy.net(2026-10-14 关梯子实测:gh-proxy.com 2.53 MB/s / codeload 9.51 MB/s,ghproxy.net 0.03 MB/s,其余候选全部不通)。 - 技能仓优先走 zipball(开启镜像时):codeload 经镜像实测 9.5 MB/s(40 MB ≈ 5 秒);
git clone直连 GitHub、绕不过镜像,退居兜底。解压成功后才切换目录,失败不会毁掉已有技能仓。 - 设置卡新增「镜像测速」:对真实制品测 TTFB 与吞吐,并可一键「把最快的排到最前」——镜像存活期常常只有几小时,写死排序必然过期。
- README 排障表补充:崩溃日志读法(
ENOENT≠ 文件不存在)与杀毒软件隔离的应对。
v0.3.1
0.3.1 - 2026-10-14
修复
- 内联版在 DSH 里加载失败(
matlab-mcp (dsh-matlab-mcp): failed to import):- 现象:0.3.0 的
lib/index.js在node -e、DSH 自带 Node、Electron-as-Node 三种独立进程里都能 import,但 DSH 启动时该 entry 的fiber始终是undefined(dsh-app-boot把fiber === undefined归类为failed to import,真实异常只打到控制台)。 - 定位:把 DSH 宿主的 Electron 进程当作测试环境(
run_code就运行在其中),用与加载器相同的await import(file://…)复现出真实异常:
Error: Dynamic require of "child_process" is not supported at lib/index.js:11:9(栈上是cross-spawn← MCP SDK)。 - 根因:把 CJS 依赖内联进 ESM bundle 后,esbuild 会把它们的
require('child_process')改写成__require垫片;ESM 里没有require绑定时该垫片直接抛错 —— 只有真正走到宿主加载路径才会触发。 - 修复:
build.mjs给宿主 bundle 加 banner,用createRequire(import.meta.url)恢复 CJS 全局(require/__filename/__dirname)。 - 验证:在宿主 Electron 进程内
await import()成功,resolveConfig/Config/buildLaunch均正常。
- 现象:0.3.0 的
- CI 增补:
inlined CJS dependencies must have their globals(检查 banner 关键字)与the host bundle must import cleanly(真实 import + 导出形状断言),防止同类问题再溜过去。
v0.3.0
0.3.0 - 2026-10-14
变更
- 插件改为「clone 下来就能用」:
- 宿主 bundle 现在内联全部运行时依赖(
@deepseek-ai/dsh-mcp-client、dsh-settings、schemastery等),lib/index.js只依赖 Node 内置模块 —— 实测把node_modules整个移走后仍能import成功(IMPORT OK -> Config,MATLAB_MCP_SETTINGS_NAMESPACE,apply,buildLaunch,inject,resolveConfig)。 lib/随仓库提交(移出.gitignore),新客户端git clone后无需pnpm install/pnpm build即可加载。scripts/install.mjs相应简化:不再强制安装依赖与构建,只做接线(建%DSH_HOME%联接 → 写 profile → 建立/修复node_modules联接),没有 pnpm 也能装;新增--rebuild供开发者从源码重建。
- 宿主 bundle 现在内联全部运行时依赖(
- CI(
.github/workflows/check.yml):每次 push 跑typecheck+ 6 套测试 +build,并校验 ①lib/与全新构建一致(不会悄悄过期)②lib/index.js里不再残留@deepseek-ai/*外部 import(保证自包含)。 dependencies清空(依赖已内联),相关包移入devDependencies。
v0.2.1
0.2.1 - 2026-10-14
新增
- 新客户端一键安装器
scripts/install.mjs:git clone后在仓库里跑node scripts/install.mjs即可完成全部接线 ——
① 仓库内pnpm install(prepare顺带构建lib/index.js);
② 在%DSH_HOME%建matlab-mcp-plugin联接指向仓库(同盘路径,规避 pnpm 跨盘link:问题);
③ 给每个存在的 profile 写dependencies/dsh.profile.bundles/cordis.patch.yml;
④ 在 profile 内pnpm install,并统一修复所有失效的link:联接(含其它本地插件);
⑤ 打印后续步骤。支持--dry-run/--profile <name>/--skip-profile-install,pnpm缺失时给出 DSH 自带 pnpm 的用法。
修复
- 新客户端启动报
matlab-mcp (dsh-matlab-mcp): failed to import:根因是仓库按惯例不提交构建产物(lib/被.gitignore排除)且插件从自身node_modules解析@deepseek-ai/*,全新克隆后两者都不存在。安装器与文档(README「安装」第 0 节 + 排障表)现在明确覆盖这一路径。
v0.2.0
0.2.0 - 2026-10-14
新增
- 聊天主界面「打开 MATLAB」按钮:注册到会话标题栏动作位
conversation.session.header.actions(独立于设置页的第二个 UI 入口),点击即打开 MATLAB 桌面窗口。new会话模式:打开独立 MATLAB 桌面窗口,按钮提示里说明 Agent 使用的是它自己启动的会话。auto/existing会话模式:以-r shareMATLABSession打开共享会话,MCP 服务器随后连到同一个 MATLAB —— 你能在窗口里直接看着 Agent 干活。- 以
detached + unref启动,窗口独立于插件生命周期:插件卸载不会关掉它(脚本scripts/open-matlab.ts实测:新 MATLAB 进程出现,且归属判定为「非本插件所有」)。 - 新增宿主路由
POST /api/dsh-matlab-mcp/open-matlab与buildMatlabDesktopArgs单测。