🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

动态插件管理器 Thomas-key/dsh-dynplugin-manager

DeepSeek Harness
Thomas-key81 天前有提交已提供中文文档扫描:含敏感能力

扫描本地目录,一键安装加载并管理动态插件

27.5/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Thomas-key/dsh-dynplugin-manager
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/09/27·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/05·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 81 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 52 处,展示前 36 条)
  • 读取本地文件
    lib/index.js:45
    const raw = readFileSync(storePath(), 'utf8')
  • 写入本地文件
    lib/index.js:84
    mkdirSync(dirname(target), { recursive: true })
  • 写入本地文件
    lib/index.js:85
    writeFileSync(tmp, JSON.stringify(payload, null, 2), 'utf8')
  • 写入本地文件
    lib/index.js:86
    renameSync(tmp, target)
  • 读取本地文件
    lib/index.js:119
    const raw = readFileSync(join(dir, 'package.json'), 'utf8')
  • 读取本地文件
    lib/index.js:133
    if (statSync(full).isFile()) return full
  • 读取本地文件
    lib/index.js:152
    if (statSync(full).isFile()) return full
  • 读取本地文件
    lib/index.js:186
    const head = readFileSync(hostFile, 'utf8').slice(0, 8192)
  • 读取本地文件
    lib/index.js:235
    entries = readdirSync(scanDir, { withFileTypes: true })
  • 执行外部命令固定命令
    lib/index.js:533
    execFile('cmd.exe', full, { timeout: timeoutMs, windowsHide: true, maxBuffer: 8 * 1024 * 1024 }, (error, stdout, stderr) => {
  • 删除本地文件递归
    lib/index.js:667
    rmSync(target.dir, { recursive: true, force: true })
  • 删除本地文件递归
    lib/index.js:703
    rmSync(target.dir, { recursive: true, force: true })
  • 请求外部主机registry.npmjs.org
    lib/index.js:848
    const r = await fetch('https://registry.npmjs.org/' + encodeURIComponent(source), { signal: AbortSignal.timeout(30000) })
  • 发起网络请求
    lib/index.js:848
    const r = await fetch('https://registry.npmjs.org/' + encodeURIComponent(source), { signal: AbortSignal.timeout(30000) })
  • 写入本地文件
    lib/index.js:942
    mkdirSync(target, { recursive: true })
  • 发起网络请求
    lib/index.js:947
    const r = await fetch(url, { signal: AbortSignal.timeout(60000) })
  • 写入本地文件
    lib/index.js:953
    writeFileSync(zipPath, zipBuf)
  • 删除本地文件递归
    lib/index.js:955
    rmSync(extractDir, { recursive: true, force: true })
  • 写入本地文件
    lib/index.js:956
    mkdirSync(extractDir, { recursive: true })
  • 执行外部命令固定命令
    lib/index.js:958
    execFile('tar.exe', ['-xf', zipPath, '-C', extractDir], { timeout: 60000, windowsHide: true }, (e) => resolve(!e))
  • 执行外部命令固定命令
    lib/index.js:962
    execFile('powershell.exe', ['-NoProfile', '-Command', `Expand-Archive -Path '${zipPath}' -DestinationPath '${extractDir}' -Force`], { timeout: 120000,
  • 删除本地文件递归
    lib/index.js:983
    rmSync(dest, { recursive: true, force: true })
  • 发起网络请求
    lib/client.js:80
    fetch(SCAN_URL, {
  • 发起网络请求
    lib/client.js:100
    fetch(INSTALL_URL, {
  • 发起网络请求
    lib/client.js:119
    fetch(MOUNT_URL, {
  • 发起网络请求
    lib/client.js:242
    fetch(LIST_URL)
  • 发起网络请求
    lib/client.js:258
    fetch(url, {
  • 读取本地文件
    lib/loader.js:75
    return readFileSync(patchPath(profile), 'utf8')
  • 读取本地文件
    lib/loader.js:100
    return hasManagedBlock(readFileSync(patchPath(profile), 'utf8'), rowId)
  • 写入本地文件
    lib/loader.js:150
    mkdirSync(dirname(target), { recursive: true })
  • 写入本地文件
    lib/loader.js:152
    writeFileSync(tmp, next, 'utf8')
  • 写入本地文件
    lib/loader.js:153
    renameSync(tmp, target)
  • 写入本地文件
    lib/loader.js:187
    writeFileSync(tmp, next, 'utf8')
  • 写入本地文件
    lib/loader.js:188
    renameSync(tmp, target)
  • 读取本地文件
    lib/loader.js:221
    if (existsSync(join(root, pkgName))) return true
  • 读取本地文件
    lib/loader.js:224
    if (existsSync(join(root, scope, name))) return true
扫描于 2026/11/5(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:registry.npmjs.org

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-tools@deepseek-ai/cordis
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 扫描本地目录
  • 一键安装加载
  • 斜杠命令管理

用 /dyn 斜杠命令管理 DeepSeek Harness 动态插件:扫描本地目录、浏览、加载

README

由 DeepSeek 最新模型翻译生成
dsh-dynplugin-manager 管理 DSH 动态插件(Dynamic Cordis Plugins):内置发现、安装弹窗、加载。社区空白,自研插件。 DSH 动态插件有两条加载通道: - runner 通道(cordis_define / cordis_run):会话级,代码在 vm 沙箱执行(禁 import/require),进程重启后失效——自包含插件(如 web-access 的函数体形态)走这里 - loader 通道(insert 行 + 官方 patch watcher):持久,社区 npm 插件形态(正常 import)走这里——写 cordis.patch.yml 由官方 watcher 热挂载、免重启 官方只有 agent 工具(模型才能调用),没有人类可操作的界面。
展开完整文档(README 剩余 1 节)
dsh-dynplugin-manager

管理 DSH 动态插件(Dynamic Cordis Plugins):内置发现、安装弹窗、加载。社区空白,自研插件。

DSH 动态插件有两条加载通道:

- runner 通道(cordis_define / cordis_run):会话级,代码在 vm 沙箱执行(禁 import/require),进程重启后失效——自包含插件(如 web-access 的函数体形态)走这里
- loader 通道(insert 行 + 官方 patch watcher):持久,社区 npm 插件形态(正常 import)走这里——写 cordis.patch.yml 由官方 watcher 热挂载、免重启

官方只有 agent 工具(模型才能调用),没有人类可操作的界面。本插件补齐:

- 设置页"动态插件":内置发现(runner 托管目录 + profile 已安装的非 bundle 包),状态徽标(已加载/未加载/加载失败+原因/缺依赖声明/未构建),loader 插件卡片带停用/卸载按钮,安装弹窗候选带安装状态(已加载/已安装/未安装)
- 安装弹窗:本地目录 / GitHub 仓库 / npm 包三种来源 → 扫描 → 逐插件选安装方式(link/copy)→ 安装结果即时反馈 → 一键挂载
- 斜杠命令:/dynload (自动分流加载)、/dynunmount(停用)、/dynuninstall(彻底卸载)

安装

⚠️ 同名包警告

npm 上可能已存在同名包。请始终显式指定本仓库:

从 GitHub 安装
dsh plugin --profile web add -w Thomas-key/dsh-dynplugin-manager

或从本地目录安装
dsh plugin --profile web add -w ./dsh-dynplugin-manager

第 1 步:安装运行时依赖(必须!)

本插件以 link 方式安装(profile 引用本地目录),Node 从目录自身解析 import。运行时依赖 @deepseek-ai/dsh-tools 不会随仓库分发(在 node_modules/,被 .gitignore 排除)——必须先在本地仓库装好,否则 dsh web 启动即崩:

cd dsh-dynplugin-manager
npm install
cd ..

peerDependencies(@deepseek-ai/cordis、react)由 DSH 宿主提供,不需要本地安装。

第 2 步:添加插件

dsh plugin --profile web add -w ./dsh-dynplugin-manager

重启 dsh web 后:设置 → 动态插件。

插件发现(内置,无需配置目录)

| 来源 | 位置 | 说明 |
| runner 托管目录 | ~/.dsh/dynplugin-manager/plugins/ | 自包含插件安装到这里(弹窗「安装到托管目录」),重启后仍在列表(加载是会话级) |
| profile 已安装包 | ~/.dsh/profiles//node_modules/ | 非 bundle + 入口导出 apply 的包自动出现(link 或 npm 安装均可) |

安装弹窗

安装插件 按钮 → 选择来源:

| 来源 | 扫描方式 | 安装方式 |
| 本地目录 | 目录本身或一层子目录 | loader:link(改源码重启即生效)/ copy(独立副本,改源码需重装);runner:托管目录复制 |
| GitHub 仓库 | 下载 zip 到 ~/.dsh/dynplugin-manager/cache/ → 解压 → 扫描(支持 monorepo) | 同本地目录(copy 语义) |
| npm 包 | registry 元数据 → 单包卡片 | copy 安装 |

安装时弹窗阻塞其他输入;完成后显示结果(失败给出原因 + 手动命令),loader 插件可立即挂载(验证先于写入:真实 import + apply 通过才写 insert 行,失败零残留)。

加载与生命周期

设置页按钮(loader 插件):停用(删 insert 行,实时生效,包保留)/ 卸载(彻底移除)。runner 插件保持会话级——列表无按钮,请在会话中用 /dynload 加载、官方动态插件面板停止。

斜杠命令:

| 命令 | 动作 | 持久性 |
| /dynload | 自动分流:自包含 → runner 会话级;需 import → loader 持久挂载 | runner 会话级 / loader 持久 |
| /dynunmount | loader 删 insert 行(停用);runner 删托管副本 | 可逆 |
| /dynuninstall | 彻底移除:删行 + dsh plugin remove(pnpm 引用计数保留共享依赖)+ 删托管副本 + 清记录 | 依赖图恢复干净;.pnpm 物理残留可手动 dsh plugin --profile web prune 回收(勿自动 prune——会误删用户手动安装的包) |

插件形态说明

- 自包含(runner):文件是函数体(无 import/export,顶层 return { apply })——vm 沙箱直接执行,会话级,怎么报错都不影响 DSH
- 需 import(loader):入口用模块系统——必须已安装(质量门检查依赖可解析),挂载前内存预执行验证,任何验证失败都不写配置(fail-closed)
- 缺依赖声明:代码 import 了裸包但 package.json 没声明 → 拦截并列出包名,补声明后重扫
- 未构建:入口文件缺失(如 TS 未编译)→ 置灰,先构建

与同名包的区别

npm 上已有 dsh-plugin-manager(作者 hrhgit)——那是管理 bundle 插件(Loader 条目启停、持久化到 cordis.patch.yml)的工具。本插件管的是动态插件(runner 会话级加载 + loader 持久挂载)。二者定位不同、可共存。

维护状态

本插件由 deepseek-v4-flash(AI agent)制作。如果这句话没有被删除,说明作者不会主动维护此插件。欢迎 fork 和 PR。

License

MIT
预览分享卡片长什么样 ↓Thomas-key/dsh-dynplugin-manager
分享 · DeepSeek Harness Hub
Thomas-key/dsh-dynplugin-manager

扫描本地目录,一键安装加载并管理动态插件

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部