DeepSeek Harness 插件分发架构收敛:移除专用 repository 插件路径,统一为 profile 组合包模型
DeepSeek Harness 插件分发架构收敛移除专用 repository 插件路径统一为 profile 组合包模型【免费下载链接】deepseek-harnessDeepSeek Harness: Everything is a Plugin.项目地址: https://gitcode.com/gh_mirrors/de/deepseek-harness本篇技术指南剖析 DeepSeek Harness一切皆插件在外部第三方插件分发机制上的一次重要架构简化彻底移除deepseek-ai/dsh-repository-plugin专用路径.dsh-plugin清单格式、dsh-plugin-prepare准备可执行文件、生成式包装层、不可变 repository 缓存、Loader 内置项及专用 skill/MCP 适配器将外部插件分发收敛为唯一的 profile 组合包bundle模型。读完本文你将理解这一决策的来龙去脉、组合包模型下的完整安装与配置工作流dsh plugin --profile、dsh.bundle.patch、cordis.patch.yml三层架构以及仓库源码中与之对应的具体实现路径。该决策记录位于 .agents/notes/implemented/simplification/2026-08-09-remove-repository-plugin.zh.md英文版见 2026-08-09-remove-repository-plugin.md状态标记为implemented即该简化已经落地。问题两条并行的外部插件分发路径在移除之前DeepSeek Harness 存在两条重复实现第三方包安装与组合的路径repository 插件路径通过repositories源列表选择外部包再依赖一整套专属基础设施——.dsh-pluginmanifest元数据清单、生成的包装层generated wrapper、dsh-plugin-prepare准备工作可执行文件、第二套 Git包缓存、Loader 内置项以及 repository 专用的 skill 与 MCP 适配器。profile 组合包路径通过 profile 包管理器直接安装 npm 或 Git 包说明符保留正常的依赖与生命周期语义并贡献一个有序的cordis.patch.yml层其中可以挂载普通 Cordis 插件。问题的本质在于repository 路径不仅重复造轮子而且能力更弱。其repositories列表只能选择源字符串生成的包装层在挂载代码入口时无法传入用户提供的插件配置——也就是说一个通用分发机制却比它试图替代的组合包暴露更少的配置面。结果是 repository 专用的准备流程增加了大量代码和 CI 工作却始终没有成长为通用的外部插件分发机制。决策只保留 profile 组合包这一条外部插件分发路径决策明确且彻底——DeepSeek Harness 只保留一种独立的外部插件分发路径可安装的 profile 组合包。核心工作流为dsh plugin --profile name add package-or-git-spec该命令将依赖记录到 profile 包$DSH_HOME/profiles/name/package.json的dependencies中安装的包通过声明dsh.bundle.patch贡献自己的 patch 层。职责划分清晰职责归属方获取源码、管理版本与依赖、运行构建生命周期、维护锁文件包管理器pnpm选择要挂载的 Cordis 插件、提供完整插件配置组合包 patch 层移除清单被清理的具体资产按决策以下内容全部移除deepseek-ai/dsh-repository-plugin包本体.dsh-plugin编写格式manifest 格式dsh-plugin-prepare可执行文件生成的包装层generated wrapper不可变 repository 缓存immutable repository cachebase 组合包中的repository-plugins配置项专用 GitHub 验收流水线acceptance lanevendor 中不再使用的cordisjs/plugin-loader/repository子路径及其随附的 pnpm 依赖随唯一消费方一并移除。关于旧缓存数据需要特别注意现有 repository 缓存目录只是不会再产生作用的用户数据。DSH 既不会读取这些目录也不会删除它们用户可以自行删除但系统不做迁移或自动清理。组合包如何直接组合现有归属方移除 repository 专用适配器后组合包不再需要定制运行时代码而是直接组合现有归属方提供 skill 的组合包挂载deepseek-ai/dsh-skill-filesystem见 packages/skill/skill-filesystem/package.json提供 MCP 服务器的组合包挂载deepseek-ai/dsh-mcp-client需要原生行为的组合包挂载普通的已编译 Cordis 插件。这些包继续保有各自的校验、生命周期、注册和 teardown 契约无需任何 repository 专属适配。同时静态资源需要一种由组合包拥有、可相对于包解析的路径形式使声明式组合包可以将dsh-skill-filesystem、dsh-mcp-client或其他插件指向它随包交付的文件——该能力归属于组合包格式本身而不是 repository 适配器。根据预发布兼容政策不保留针对.dsh-plugin的兼容解析器或迁移机制。源码实现dsh plugin如何工作dsh plugin子命令的核心实现在 apps/cli/src/plugin.ts。从模块注释可以看出它的定位一个薄的 pnpm 转发器——首次使用时初始化 profile在 profile 目录中运行pnpm args...然后将dsh.profile.bundles层列表与已安装状态进行协调reconcile。关键流程初始化若$DSH_HOME/profiles/name/package.json不存在则用PROFILE_TEMPLATES[profile]或DEFAULT_PROFILE_BUNDLES初始化见runPlugin。转发 pnpmspawnSync(pnpm, ...)在 profile 目录中执行继承 stdio。Windows 下通过.cmdshim 需要shell: true这是 CVE-2024-27980 加固后的要求。协调层列表reconcilePlugins依据安装后的实际状态而非依赖 diff决定层列表——这是update能自动激活新版本中才获得dsh.bundle声明的包的原因。exportsPatch判断一个依赖是否为组合包function exportsPatch(packageName: string, profileDir: string): boolean { ... const manifest readProfileManifest(NAME, dir) return manifest.dsh?.bundle?.patch ! undefined }dsh.bundle.patch是组合包的签名只要解析到的包 manifest 声明了dsh.bundle.patch该依赖即加入层栈按依赖顺序追加反之被移除或新版本丢掉声明的依赖则从层栈中退出。对新加入的非组合包依赖会输出一次警告普通库可正常安装警告仅作方向提示。相对路径锚定anchorPathSpec处理了一个容易被忽视的坑pnpm 以 profile 目录为 cwd 运行裸的.或../plugin及其file:/link:形式会静默解析到 profile 内部——add .会让插件自身链接到 profile。因此相对路径说明符会被重写为锚定到用户调用dsh时的目录而绝对路径、registry 名称及其他 pnpm 参数原样透传。包管理失败诊断pnpm 失败时runPlugin会特别针对Git 托管插件输出诊断git 依赖通过preparebuild脚本在安装时构建而 pnpm ≥10 默认阻止这类脚本直到在白名单中放行——提示用户将 pnpm 打印的精确 key 加入pnpm-workspace.yaml的allowBuilds后重试。注意 profile 目录拥有自己的pnpm-workspace.yamlnodeLinker: hoisted、autoInstallPeers: false见 packages/boot/app-boot/src/profile.ts 中的PROFILE_PNPM_WORKSPACE。源码实现profile 的组合与 patch 层排序组合包格式在 packages/boot/app-boot/src/profile.ts 中定义了组合包的 manifest 契约/** The bundle half of the dsh manifest section: what a bundle package exports. */ export interface DshBundleManifest { /** The patch layer this bundle exports, relative to its package root. */ patch: string }即一个 npm 包只要在package.json中声明dsh: { bundle: { patch: ./cordis.patch.yml } }就成为一个组合包。loadProfile会为dsh.profile.bundles中的每个条目解析包目录、读取其dsh.bundle.patch并加载 patch 文件——列出的包若没有dsh.bundle声明会直接 fail-loud因为把非组合包作为层是配置错误而不是没有 patch。内置 profile 模板PROFILE_TEMPLATES定义了随安装附带的 profileprofilebundlespatchReloadacpdeepseek-ai/dsh-basedeepseek-ai/dsh-acp-appstartupwebdeepseek-ai/dsh-basedeepseek-ai/dsh-web-appliveheadlessdeepseek-ai/dsh-basedeepseek-ai/dsh-headlessstartupsdkdeepseek-ai/dsh-basedeepseek-ai/dsh-sdk-appstartupsdk-minimaldeepseek-ai/dsh-sdk-minimalstartup无模板的自定义 profile 初始化时使用DEFAULT_PROFILE_BUNDLES [deepseek-ai/dsh-base]并默认采用live热重载。层组合顺序在 apps/cli/src/profile-boot.ts 中profile 的完整 patch 栈按如下顺序应用bundle 层按 dsh.profile.bundles 顺序 → profile 自身的 cordis.patch.yml → 家目录层 $DSH_HOME/cordis.patch.yml机器级偏好高于 profile 层 → --patch 覆盖层按 argv 顺序 → 遥测开关补丁profile 根配置cordis.yml是一个空条目列表整个树都是 patch 组合出来的——每次启动都会重写该空根否则 Loader 的树写回会把组合出的行烘焙进根文件导致下次启动重复插入每个 bundle。对live热重载 profile用户 patch 文件profile 层与家目录层会被监视编辑即生效重组时 bundle 层在下方、覆盖层在上方用户编辑永远无法顶替 bundle 层。这一实现直接呼应了决策文档的后果条款用户 patch 的 HMR 仍可配置已安装组合包所提供的配置项。曾考虑的替代方案及其否决理由决策文档明确记录了四个被否决的方案理解它们有助于把握设计边界保留 repository 插件作为组合包的便利包装层——否决同一个包会保留两条安装命令、两种 manifest 格式、两套失败缓存标识而且无法传递普通插件配置的便利包装能力仍不及它所包装的机制。让 repository 包装层加载组合包 patch——否决repository 缓存和准备协议仍会重复 profile 依赖安装组合包已能通过 pnpm 接受 npm、Git、file 和 link 说明符。为未来可能出现的消费方保留通用 Loader repository 缓存——否决移除相关包后已无当前消费方却仍让 vendor 中与浏览器相邻的包携带固定版本的包管理器运行时。只有当无需显式安装即可在配置阶段激活成为 profile 依赖无法满足的产品需求时才值得重新引入专用缓存届时由该消费方自选缓存约定。禁用 repository 插件但保留磁盘格式以供迁移——预发布方针下否决保留解析器或兼容 loader 会在没有外部兼容义务的情况下让已移除的契约继续存在。后果与迁移注意事项决策落地后产生的关键影响第三方包统一使用一种安装与组合模型——普通依赖声明 完整的 patch 层插件配置不再有第二套语义。安装或更新外部组合包是显式包管理操作必须通过dsh plugin而不是编辑受监听的源列表。profile 安装要求宿主机PATH中存在pnpm对显式包管理操作可接受也避免了仅为配置阶段激活而随产品附带已移除缓存所使用的固定版本包管理器运行时。pnpm not found on PATH时dsh plugin返回退出码 127 并给出提示。.dsh-plugin包和现有 repository 源列表 patch 停止工作旧缓存文件可自行删除但不会被迁移或自动删除。专用 pnpm 运行时、准备可执行文件、包装层生成器、Git 凭据 CI 设置、repository 缓存和 repository 专用测试全部消失。测试与验证本层移除有两条测试保障见决策文档测试一节及 apps/cli/tests 目录静态门禁会拒绝残留的包、配置、文档、图和 workspace 引用——防止移除不彻底。现有dsh plugin内置 CLI 验收测试覆盖 profile 初始化、包管理器安装、组合包发现和层调和。仓库中相关测试包括 profile-hmr.spec.ts、built-bin.e2e.ts 等。同时决策文档明确记录了已命名覆盖缺口声明式、相对于包解析的 skill 与 MCP 组合包资源仍未被本移除层的测试覆盖——这是该格式能力中已知待补强的部分。小结这次架构简化体现了每个能力只保留一个归属方的设计原则外部插件的获取与生命周期归包管理器插件选择与配置归组合包 patch 层skill/MCP/原生行为的贡献归各自现有归属方dsh-skill-filesystem、dsh-mcp-client、普通 Cordis 插件。由此换来的是统一的安装模型、完整的 patch 层配置能力以及大幅缩减的代码与 CI 面。对使用方而言对外分发外部插件只剩一条路让包声明dsh.bundle.patch然后dsh plugin --profile name add spec。【免费下载链接】deepseek-harnessDeepSeek Harness: Everything is a Plugin.项目地址: https://gitcode.com/gh_mirrors/de/deepseek-harness创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

YOLO 多目标跟踪部署选型指南:CPU、GPU、TPU 实测对比,3 分钟锁定方案

YOLO 多目标跟踪部署选型指南:CPU、GPU、TPU 实测对比,3 分钟锁定方案

YOLO 多目标跟踪部署选型指南:CPU、GPU、TPU 实测对比,3 分钟锁定方案 【免费下载链接】boxmot BoxMOT: Pluggable Python and C SOTA multi-object tracking modules with support for axis-aligned and oriented bounding boxes 项目地址: https://g…

2026/9/20 19:53:42 阅读更多 →
Milvus 2.5.4离线部署指南:Docker镜像导入与备份恢复实战

Milvus 2.5.4离线部署指南:Docker镜像导入与备份恢复实战

简介:milvus-standalone2.5.4.zip 离线安装包面向需要快速部署向量数据库的开发者和数据科学家,用于在无外网环境下搭建 Milvus 2.5.4 单节点服务,支撑图像识别、推荐系统、自然语言处理等场景的向量相似度检索。Milvus 本身不存储原始数据&a…

2026/9/20 19:53:42 阅读更多 →
GetQzonehistory 保姆级教程:QQ空间说说导出成 Excel 与网页存档

GetQzonehistory 保姆级教程:QQ空间说说导出成 Excel 与网页存档

GetQzonehistory 保姆级教程:QQ空间说说导出成 Excel 与网页存档 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory GetQzonehistory 是一个开源免费的 QQ 空间数据备份工具&am…

2026/9/20 19:53:42 阅读更多 →

最新新闻

从零手推SAR后向投影算法:MATLAB实现与逐点累加原理详解

从零手推SAR后向投影算法:MATLAB实现与逐点累加原理详解

1. 为什么我要从零手推SAR后向投影算法合成孔径雷达(SAR)成像算法里,后向投影(Back Projection,BP)算法是个很特别的存在。它计算量巨大、效率不算高,但几乎是最直观、最容易理解、也最容易从零…

2026/9/20 20:21:55 阅读更多 →
5 分钟一键生成黑苹果 EFI:OpCore Simplify 使用教程与避坑指南

5 分钟一键生成黑苹果 EFI:OpCore Simplify 使用教程与避坑指南

5 分钟一键生成黑苹果 EFI:OpCore Simplify 使用教程与避坑指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpCore Simplify 是黑苹果…

2026/9/20 20:21:55 阅读更多 →
脉冲多普勒雷达仿真全解析:从LFM信号到CFAR检测

脉冲多普勒雷达仿真全解析:从LFM信号到CFAR检测

简介:PDF格式的雷达原理课程设计参照,面向电子科学与技术、信息工程等专业本科生,用于完成常规脉冲雷达系统设计类课程报告。内容以探测距离10km、方位角分辨力2、俯仰角分辨力20、距离分辨力15m的设计要求为主线,完整展示从工作频…

2026/9/20 20:21:55 阅读更多 →
三步跑起 Sunshine 游戏串流:低延迟家庭串流服务器快速指南

三步跑起 Sunshine 游戏串流:低延迟家庭串流服务器快速指南

三步跑起 Sunshine 游戏串流:低延迟家庭串流服务器快速指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 晚上十点,你在沙发上坐下,拿起一个普…

2026/9/20 20:21:55 阅读更多 →
XGBoost 提升树原理精讲:从监督学习三要素到结构分数与分裂增益的完整推导

XGBoost 提升树原理精讲:从监督学习三要素到结构分数与分裂增益的完整推导

XGBoost 提升树原理精讲:从监督学习三要素到结构分数与分裂增益的完整推导 【免费下载链接】xgboost Scalable, Portable and Distributed Gradient Boosting (GBDT, GBRT or GBM) Library, for Python, R, Java, Scala, C and more. Runs on single machine, Hadoo…

2026/9/20 20:21:55 阅读更多 →
从规范到发布:用SDD驾驭AI协作开发npm工具包的实践

从规范到发布:用SDD驾驭AI协作开发npm工具包的实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 20:20:54 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →