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

插件仓库 Z-6354/dsh-plugin-repo

DeepSeek Harnessv1.9.17
Z-635467 天前有提交已提供中文文档扫描:含敏感能力

自建插件仓库,跨设备同步与安装管理

29.3/100
综合分
2
GitHub 星标
56
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-plugin-repo
npm 源 · dsh-plugin-repo 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · dev
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 67 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-plugin-repo @ 1.9.17
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/9/22 21:38:19

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 103 处,展示前 42 条)
  • 读取本地文件
    lib/index.mjs:88
    return JSON.parse(readFileSync(join(selfPluginDir, 'package.json'), 'utf8')).version || ''
  • 读取本地文件
    lib/index.mjs:120
    if (!abs || !existsSync(abs)) continue
  • 写入本地文件
    lib/index.mjs:127
    if (!existsSync(repoDir)) mkdirSync(repoDir, { recursive: true })
  • 读取本地文件
    lib/index.mjs:127
    if (!existsSync(repoDir)) mkdirSync(repoDir, { recursive: true })
  • 写入本地文件
    lib/index.mjs:128
    if (!existsSync(packagesDir)) mkdirSync(packagesDir, { recursive: true })
  • 读取本地文件
    lib/index.mjs:128
    if (!existsSync(packagesDir)) mkdirSync(packagesDir, { recursive: true })
  • 写入本地文件
    lib/index.mjs:129
    if (!existsSync(indexFile)) writeFileSync(indexFile, '{}')
  • 读取本地文件
    lib/index.mjs:129
    if (!existsSync(indexFile)) writeFileSync(indexFile, '{}')
  • 读取本地文件
    lib/index.mjs:133
    try { return JSON.parse(readFileSync(indexFile, 'utf8')) }
  • 写入本地文件
    lib/index.mjs:138
    writeFileSync(indexFile, JSON.stringify(index, null, 2))
  • 写入本地文件
    lib/index.mjs:302
    writeFileSync(searchRootsFile(), JSON.stringify({ roots }, null, 2))
  • 写入本地文件
    lib/index.mjs:539
    writeFileSync(join(profileDir, 'package.json'), JSON.stringify(pj, null, 2) + '\n')
  • 执行外部命令来自配置/变量
    lib/index.mjs:665
    return spawnSync(harnessBin.node, [...harnessBin.argsPrefix, 'plugin', '--profile', 'web', ...sub], {
  • 执行外部命令固定命令
    lib/index.mjs:670
    return spawnSync('pnpm', pnpmArgs, {
  • 执行外部命令固定命令
    lib/index.mjs:749
    r = spawnSync('pnpm', ['remove', name], {
  • 删除本地文件
    lib/index.mjs:765
    if (existsSync(fp)) unlinkSync(fp)
  • 执行外部命令固定命令
    lib/index.mjs:783
    r = spawnSync('pnpm', ['add', s], {
  • 删除本地文件
    lib/index.mjs:834
    if (existsSync(f)) unlinkSync(f)
  • 执行外部命令固定命令
    lib/index.mjs:845
    const r = spawnSync('npm', ['pack', found.dir, '--pack-destination', packagesDir], {
  • 删除本地文件
    lib/index.mjs:924
    if (existsSync(f)) unlinkSync(f)
  • 执行外部命令固定命令
    lib/index.mjs:972
    const r = spawnSync('npm', ['pack', s, '--pack-destination', packagesDir], {
  • 删除本地文件
    lib/index.mjs:2066
    try { const f = join(packagesDir, filename); if (existsSync(f)) unlinkSync(f) } catch (e) { }
  • 发起网络请求
    lib/client.js:19
    const res = await fetch(`${API}${path}`, {
  • 发起网络请求
    lib/client.js:698
    const res = await fetch(path, init)
  • 发起网络请求
    lib/client.js:1399
    const r = await fetch(`${API}/restart`, {
  • 发起网络请求
    lib/client.js:1503
    const r = await fetch(`${API}${path}`, {
  • 发起网络请求
    lib/client.js:1527
    const r = await fetch(`${API}/profile/batch`, {
  • 发起网络请求
    lib/client.js:1628
    const r = await fetch(`${API}/packages/${encodeURIComponent(key)}`, { method: 'DELETE' })
  • 读取本地文件
    lib/dsh-restart.mjs:36
    if (!existsSync(dir)) mkdirSync(dir, { recursive: true })
  • 写入本地文件
    lib/dsh-restart.mjs:36
    if (!existsSync(dir)) mkdirSync(dir, { recursive: true })
  • 写入本地文件
    lib/dsh-restart.mjs:44
    writeFileSync(p, `[${new Date().toISOString()}] ${line}\n`, { flag: 'a', encoding: 'utf8' })
  • 读取本地文件
    lib/dsh-restart.mjs:55
    return existsSync(built) ? built : null
  • 读取本地文件
    lib/dsh-restart.mjs:65
    if (existsSync(src)) {
  • 写入本地文件
    lib/dsh-restart.mjs:338
    writeFileSync(scriptPath, ps, 'utf8')
  • 执行外部命令固定命令
    lib/dsh-restart.mjs:339
    const child = spawn('cmd.exe', [
  • 写入本地文件
    lib/dsh-restart.mjs:354
    writeFileSync(scriptPath, sh, { encoding: 'utf8', mode: 0o755 })
  • 读取本地文件
    lib/dsh-restart.mjs:355
    const bash = existsSync('/bin/bash') ? '/bin/bash' : 'bash'
  • 执行外部命令来自配置/变量
    lib/dsh-restart.mjs:356
    const child = spawn(bash, [scriptPath], {
  • 发起网络请求
    lib/remote-client.mjs:7
    res = await fetch(url, {
  • 读取本地文件
    lib/enforce-disabled.mjs:16
    if (!existsSync(pjPath)) process.exit(0)
  • 读取本地文件
    lib/enforce-disabled.mjs:18
    const pj = JSON.parse(readFileSync(pjPath, 'utf8'))
  • 写入本地文件
    lib/enforce-disabled.mjs:27
    writeFileSync(pjPath, JSON.stringify(pj, null, 2) + '\n')
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-tools@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 自建插件仓库
  • 跨设备同步
  • 安装管理
v1.5.112026-08-22
· 变更 · 安装需重启的交互体验(Windows 手动重启 / Linux 自动重启) · 把本地仓库和已安装合并到一个标签页 · 修复跨列拖拽打包 · 安装确认关卡 + 路径加固
v1.4.02026-08-21
· 变更 · 跨设备推送到另一个 DSH 仓库(/api/remote-push,repo_remote_push) · 设置界面重构:标签页(本机仓库 / 跨设备同步 / 已安装 / 高级)、拉取/推送模式切换、双栏同步 · 安装路径只用 file:;优先用 dsh plugin add 直接装 · 安装 dsh plugin --profile web add dsh-plugin-repo@1.4.0 · 或 dsh plugin --profile web add ./dsh-plugin-repo-1.4.0.tgz
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-plugin-repo 用于 DeepSeek Harness 的自托管插件仓库——一个纯 Cordis 插件(不修改 @deepseek-ai/ 包)。 每台设备通过 HTTP 运行自己的仓库:列出 / 上传 / 下载 .tgz,检测非官方插件,带版本校验地安装,并跨设备拉取或推送包。官方 @deepseek-ai/ 插件永远不会被列出或修改。 安装 从 npm 安装 dsh plugin --profile web add dsh-plugin-repo 或从发布 tarball 安装 dsh plugin --profile web add ./dsh-plugin-repo-1.7.0.tgz 重启 DSH,然后打开 设置 → 插件仓库。升级后建议强制刷新(Ctrl+Shift+R)。
展开完整文档(README 剩余 1 节)
dsh-plugin-repo

用于 DeepSeek Harness 的自托管插件仓库——一个纯 Cordis 插件(不修改 @deepseek-ai/ 包)。

每台设备通过 HTTP 运行自己的仓库:列出 / 上传 / 下载 .tgz,检测非官方插件,带版本校验地安装,并跨设备拉取或推送包。官方 @deepseek-ai/ 插件永远不会被列出或修改。

安装

从 npm 安装
dsh plugin --profile web add dsh-plugin-repo

或从发布 tarball 安装
dsh plugin --profile web add ./dsh-plugin-repo-1.7.0.tgz

重启 DSH,然后打开 设置 → 插件仓库。升级后建议强制刷新(Ctrl+Shift+R)。

设置界面(v1.8)

| 标签页 | 用途 |
| 本机 | 本地 .tgz 仓库 + 已安装插件(双栏) |
| 跨设备同步 | 连接到另一台 DSH;拉取 → 本地 或 推送 → 远程 |
| 高级 | 用于发现插件的额外搜索根目录 |

已安装插件(v1.7+):

- 启用 / 关闭 — 切换 dsh.profile.bundles,但不移除依赖(需重启)
- 删除 — 当插件处于已关闭状态时,从 web profile 卸载(pnpm remove / dsh plugin remove)
- 从 npm 安装 — 将 pnpm add / dsh plugin add 安装到 web profile
- DSH 版本适配 — 读取 peerDependencies 并与正在运行的 @deepseek-ai/dsh 进行比较

跨设备同步使用双栏(本地 | 远程)。徽章显示具体版本(本机 1.5.2 > 对方 1.5.0)。使用 选需推送 / 选需拉取 仅选择有差异的包(包括 版本未知 → 默认推送)。推送时对降级会发出警告确认;相同的包显示为已同步。最近推送记录会持久保存在 repoDir/push-history.json 中,重启后依然保留,并说明远程原本是未知,还是推送时剥离了版本。

跨设备访问(v1.8+)

跨设备请求由本地 DSH 服务器发出(而非浏览器)。本插件不内嵌登录凭据。

当远程设备使用 dsh-local-hanaccount 时:

1. 推荐: 在双方设备的 设置 → 访问控制 → 对等设备 中配对设备。来自 DSH 的出站 fetch 将自动附加对等方 Bearer token。
2. 单侧 hc: 在装有 hc 的设备上,将 /pluginrepo 添加到 显式暴露(排除),以便局域网对等方无需配对即可同步。

没有 hc 的普通局域网 http://ip:3080 仍然可用。遇到 HTTP 401/403 时,界面会指向 hc 配对或显式暴露——而不是本插件中的 HTTP Basic。

仓库存储

默认位于配置的 repoDir 下(通常是 ~/.dsh/plugin-repo 或自定义路径):

- packages/.tgz — 非官方包
- index.json — 元数据(name、version、filename、size、uploadedAt)

HTTP API(位于 DSH web 端口,例如 http://127.0.0.1:3080)

| 方法 | 路径 | 描述 |
| GET | /pluginrepo | HTML 落地页 |
| GET | /pluginrepo/api/packages | 列出仓库中的包 |
| GET | /pluginrepo/api/unofficial | 已安装 + 仓库中的非官方插件 |
| POST | /pluginrepo/api/upload | 上传 .tgz(原始请求体;?name= 可选) |
| GET | /pluginrepo/download/.tgz | 下载 |
| GET/POST | /pluginrepo/api/remote | 列出另一台设备的包(POST 请求体:host,可选 port) |
| POST | /pluginrepo/api/remote-pull | 从另一台设备拉取到此仓库 |
| POST | /pluginrepo/api/remote-push | 将本地仓库的 .tgz 推送到另一台设备 |
| POST | /pluginrepo/api/install | 计划 / 确认安装到本地 profile |
| POST | /pluginrepo/api/profile/enable | 在 dsh.profile.bundles 中启用插件 |
| POST | /pluginrepo/api/profile/disable | 禁用插件(从 bundles 中移除) |
| POST | /pluginrepo/api/profile/uninstall | 从 profile 中卸载已禁用的插件 |
| POST | /pluginrepo/api/npm-add | 从 npm registry 安装(spec、confirm) |
| DELETE | /pluginrepo/api/packages/ | 删除仓库中的包 |

远程地址解析顺序:scheme → host → port。裸主机名 → http + 端口 3080;https:// → 端口 443;显式 :port 优先。URL 中的用户信息会被剥离并忽略。

模型工具

- repo_list / repo_unofficial / repo_push / repo_pull / repo_delete
- repo_remote / repo_remote_pull / repo_remote_push
- repo_install(需要 installConfirm=true 才能应用)

配置

可选的插件配置:

- repoDir — 绝对仓库目录
- logLevel — silent | info

注意: 使用 schemastery 风格的配置(字段默认可选)。不要对 schemastery schema 调用 zod 的 .optional()。

许可证

MIT
预览分享卡片长什么样 ↓Z-6354/dsh-plugin-repo
分享 · DeepSeek Harness Hub
Z-6354/dsh-plugin-repo

自建插件仓库,跨设备同步与安装管理

回到顶部