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

插件市场面板 99galaxy/dsh-plugin-market

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

在设置面板浏览社区插件目录并一键安装

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

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

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add 99galaxy/dsh-plugin-market
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

验证判据与等级说明 →

可信度证据

安装兼容性检查⚠ 装前注意
要求 Node:>=22.19(dsh 本身要求 Node ≥ 22.19)

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

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

✗npm 包@99galaxy/dsh-plugin-market(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

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

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 48 处,展示前 33 条)
  • 读取本地文件
    index.js:122
    const st = statSync(HELPER_PATH)
  • 读取本地文件
    index.js:130
    if (!existsSync(target) || readFileSync(target, 'utf8') !== readFileSync(HELPER_PATH, 'utf8')) {
  • 读取本地文件
    index.js:130
    if (!existsSync(target) || readFileSync(target, 'utf8') !== readFileSync(HELPER_PATH, 'utf8')) {
  • 写入本地文件
    index.js:131
    mkdirSync(dir, { recursive: true })
  • 读取本地文件
    index.js:132
    writeFileSync(target, readFileSync(HELPER_PATH, 'utf8'))
  • 写入本地文件
    index.js:132
    writeFileSync(target, readFileSync(HELPER_PATH, 'utf8'))
  • 读取本地文件
    index.js:140
    if (existsSync(HELPER_PATH)) return { ok: true, script: HELPER_PATH, cwd: HERE }
  • 写入本地文件
    index.js:167
    mkdirSync(runDir, { recursive: true })
  • 读取本地文件
    index.js:177
    const readFile = (p) => { try { return readFileSync(p, 'utf8') } catch (e) { return '' } }
  • 删除本地文件
    index.js:179
    try { rmSync(outPath, { force: true }) } catch (e) { }
  • 删除本地文件
    index.js:180
    try { rmSync(errPath, { force: true }) } catch (e) { }
  • 执行外部命令来自配置/变量
    index.js:185
    child = spawn(process.execPath, [env.script].concat(args), {
  • 请求外部主机registry.npmjs.org
    index.js:599
    const response = await fetch('https://registry.npmjs.org/' + encodeURIComponent(name) + '/latest', {
  • 发起网络请求
    index.js:599
    const response = await fetch('https://registry.npmjs.org/' + encodeURIComponent(name) + '/latest', {
  • 发起网络请求
    client/client.js:111
    const res = await fetch(API_LIST + '?' + params.toString(), { headers: { accept: 'application/json' } })
  • 发起网络请求
    client/client.js:118
    const res = await fetch(API_INSTALL, {
  • 发起网络请求
    client/client.js:129
    const res = await fetch(API_RELOAD, {
  • 读取本地文件
    market-core.mjs:35
    if (!existsSync(STATE_DIR)) mkdirSync(STATE_DIR, { recursive: true })
  • 写入本地文件
    market-core.mjs:35
    if (!existsSync(STATE_DIR)) mkdirSync(STATE_DIR, { recursive: true })
  • 发起网络请求
    market-core.mjs:62
    const res = await fetch(url, {
  • 写入本地文件
    market-core.mjs:112
    writeFileSync(CATALOG_PATH, JSON.stringify(payload))
  • 读取本地文件
    market-core.mjs:115
    count: payload.plugins.length, path: CATALOG_PATH, bytes: statSync(CATALOG_PATH).size,
  • 读取本地文件
    market-core.mjs:126
    if (!existsSync(CATALOG_PATH)) return null
  • 读取本地文件
    market-core.mjs:127
    const j = JSON.parse(readFileSync(CATALOG_PATH, 'utf8'))
  • 读取本地文件
    market-core.mjs:162
    try { bytes = statSync(CATALOG_PATH).size } catch (e) { bytes = 0 }
  • 读取本地文件
    market-core.mjs:175
    if (!existsSync(pkgPath)) return { ok: false, message: '没有找到 profile:' + profileDir }
  • 写入本地文件
    market-core.mjs:227
    mkdirSync(dirname(installedPath), { recursive: true })
  • 写入本地文件
    market-core.mjs:228
    writeFileSync(installedPath, JSON.stringify(payload))
  • 写入本地文件
    market-core.mjs:339
    mkdirSync(runDir, { recursive: true })
  • 执行外部命令来自配置/变量
    market-core.mjs:353
    r = spawnSync(
  • 删除本地文件
    market-core.mjs:364
    try { rmSync(outPath, { force: true }) } catch (e) { }
  • 删除本地文件
    market-core.mjs:365
    try { rmSync(errPath, { force: true }) } catch (e) { }
  • 写入本地文件
    market-core.mjs:408
    writeFileSync(manifestPath, JSON.stringify(after, null, 2) + '\n')
扫描于 2026/11/4(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:registry.npmjs.org

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 浏览社区插件目录
  • 一键安装插件

在 DeepSeek Harness 设置面板里浏览并一键安装社区插件 | DeepSeek Harness 设置面板内置的插件市场

README

由 DeepSeek 最新模型翻译生成
@99galaxy/dsh-plugin-market 从 DeepSeek Harness 的左侧栏打开插件市场,一键安装。 DeepSeek Harness 的侧边栏插件市场页面:浏览社区目录,在单独的标签里查看你已经装了什么,一键安装。 数据来自 awesome-dsh-plugin 维护的官方目录 plugins.json —— 约 4,400+ 个插件、23 个双语分类,带 Star 数、下载量、收录日期,以及每个条目的官方安装命令。 它做什么 左侧栏新增 「插件市场」 入口,点击后在主区域打开独立页面。页面内有三个标签: | 标签 | 内容 | | 全部插件 | 完整目录。
展开完整文档(README 剩余 1 节)
@99galaxy/dsh-plugin-market

从 DeepSeek Harness 的左侧栏打开插件市场,一键安装。

DeepSeek Harness 的侧边栏插件市场页面:浏览社区目录,在单独的标签里查看你已经装了什么,一键安装。

数据来自 awesome-dsh-plugin 维护的官方目录 plugins.json —— 约 4,400+ 个插件、23 个双语分类,带 Star 数、下载量、收录日期,以及每个条目的官方安装命令。

它做什么

左侧栏新增 「插件市场」 入口,点击后在主区域打开独立页面。页面内有三个标签:

| 标签 | 内容 |
| 全部插件 | 完整目录。可按分类筛选、按 Star/下载量/名称/收录时间排序、搜索插件名或简介 |
| 已安装 | 只列出你已经装过的插件,标签上直接显示数量 |
| 可更新 | 只列出装了但目录里有更新版本的插件,标签上直接显示数量 |

- 一键安装:点「安装」即执行该条目的官方安装命令,装到当前 profile
- 安装状态:已安装的条目带绿色徽章;若目录名与你实际装的包名不同,会标出真实包名
- 更新检测:拿目录里的 version 和 profile 里实际装的版本比对,有更新的挂橙色徽章「可更新 1.47.0(当前 1.46.1)」,按钮从「重新安装」变成「更新」
- 精确更新:更新 npm 插件时直接安装目录中的目标版本,不会因为旧的 ^ 范围而误报「已是最新」;Git 来源更新则强制重新解析来源
- 中英切换:简介可切中文/英文
- 本地缓存:目录存到本地,1 小时内直接复用;过期时先显示本地内容并在后台更新,不再用下载阻塞首屏;要立即等待最新版可点「强制重新获取」
- 一键重载 profile:装完插件点「重载 profile」,通过 DSH 的 HMR 重新组合当前 profile,不必重启;没有 HMR 的 profile 会提示你重启
- 四级降级:官方域名 → 镜像 → CDN → npm,任一条通即可

安装

这是一个 DSH bundle:装进 profile 后重启 DSH 自动加载。

cd ~/.dsh/profiles/web # Web 版;DSH 桌面版换成 desktop
pnpm add github:99galaxy/dsh-plugin-market

也可以显式用 HTTPS 地址:

pnpm add https://github.com/99galaxy/dsh-plugin-market

装进来的包名是 @99galaxy/dsh-plugin-market —— 与仓库名不同,所以下面层列表里要写这个带 scope 的名字。

DSH 0.2.x 桌面版跑的是 desktop profile。插件会通过 ctx.profileContext.name 自动识别当前 profile,所以页面里的「安装」不需要你在命令里写死 --profile。

然后把它加进 package.json 的层列表 —— 声明了 dsh.bundle 的依赖才会被加载:

{
"dsh": {
"profile": {
"bundles": ["...", "@99galaxy/dsh-plugin-market"]
}
}
}

重启 DSH。

github: 前缀在部分 git 配置下会被解析成 git+ssh,而匿名 HTTPS 不需要任何凭据。若 pnpm 报找不到仓库或索要 SSH 密钥,改用上面的 HTTPS 形式。

使用

1. 点击左侧栏的 插件市场
2. 浏览或搜索;点卡片右侧「安装」
3. 安装完成后点工具栏的「重载 profile」;没有启用 HMR 的 profile 仍需重启 DSH

「已安装」标签里可以确认某个插件是否已经在你的 profile 里;「可更新」标签里是可以升级的那些。

关于「更新」:它执行的仍是目录里那条安装命令,所以装的是目录指定的那个来源 —— 一个用 github: 装的插件,如果目录对应的条目是 npm 包名,更新后会变成 npm 包。想留在固定 commit 上就别点更新。

判断不了的插件:目录里没有 version、或目录根本没收录的插件,无法判断有没有更新。它们不会出现在「可更新」标签里,但标签内会单独说明有多少个 —— 免得把「判断不了」误读成「已经是最新」。

架构

┌─ 浏览器半边 ────────────────────────────────────────────────┐ │ window.__ModuleLoader__.load({ id, factory(require) }) │ │ require('react');槽位服务由 ctx 注入 │ │ sidebar.panellist → 左侧栏「插件市场」入口 │ │ main → 独立的「DSH 插件市场」页面 │ │ 页面内三个标签:全部插件 / 已安装 / 可更新 │ │ 筛选、排序、分页、更新比对全部在宿主侧完成 │ └───────────────┬─────────────────────────────────────────────┘ │ fetch() ← 不是动态插件的私有 RPC,也不是 ctx.remote ┌───────────────▼─────────────────────────────────────────────┐ │ 宿主半边 index.js │ │ ctx.inject(['webServer']) → │ │ GET /dsh-plugin-market/list │ │ POST /dsh-plugin-market/install │ │ POST /dsh-plugin-market/reload │ │ 子进程输出经文件描述符捕获(非管道、非 shell) │ └───────────────┬─────────────────────────────────────────────┘ │ spawn(node, [market-core.mjs, …]) ┌───────────────▼─────────────────────────────────────────────┐ │ market-core.mjs(真实文件,可单独运行) │ │ catalog 抓取/缓存目录(官方 → 镜像 → CDN → npm) │ │ installed 读 profile 依赖 + node_modules + 已装版本 │ │ install 优先用 DSH 提供的包管理器;CLI 回退到 pnpm │ └─────────────────────────────────────────────────────────────┘

为什么用 HTTP 而不是 ctx.remote

浏览器半边要调用宿主能力,但 ctx.remote.<ns> 的方法来自 DSH 的 Typert 代码生成 ——
本地手写的插件无法注册自己的命名空间(ctx.remote.$mount() 只接受生成的贡献)。
而 webserver 的命名路由注册是公开服务:

ctx.inject(['webServer'], (host) => {
host.webServer.register({ kind: 'exact', path: '…', handler: (req, res) => {} })
})

于是宿主暴露三条路由,浏览器半边用 fetch 调用。

HTTP 接口

| 方法 | 路径 | 入参 | 出参 |
| GET | /dsh-plugin-market/list | bypass, category, q, sort, only, limit, offset(only 取 all / installed / notinstalled / updatable) | { ok, payload: { items, categories, count, total, matched, installedTotal, updatableTotal, unknownTotal, offset, sort, only, category, q, catalogFromCache, fetchedAt, catalogUpdated, source, note } } |
| POST | /dsh-plugin-market/install | { install, name?, version?, update? } | { ok, spec, seconds, log } |
| POST | /dsh-plugin-market/reload | {} | { ok, warnings, pending, restartReason } |

items 里的每个条目除了插件本身,还带 installed / installedAs / installedVersion / update。
updatableTotal 是可更新数,unknownTotal 是判断不了的数(目录里没有版本,或目录没收录已声明的 bundle);普通 profile 依赖不计入。
更新判断只比对目录里的 version,不额外发任何网络请求。

bypass=1 是唯一的强制重新抓取旗标;只有「强制重新获取」按钮发它,其余调用都只做新鲜度检查。
三个标签都是页面内的:插件注册一个 sidebar.panellist 入口和对应的 main 页面,标签由页面自己渲染。

三条路由只接受同源调用(校验 Sec-Fetch-Site 与 Origin),安装和重载接口还要求 Content-Type: application/json —— 直接挂在 webServer 上的路由不受 DSH /api 那道 browser-trust fence 保护,所以插件自己拦。安装命令里的包名若以 - 开头会被拒绝(它会成为 pnpm 的一个选项而不是包名)。

重载走 DSH 的 hmr 服务:hmr.runExclusive(() => hmr.reconcileProfile()),会把新装的
bundle 重新组合进运行中的 Loader 树。返回里的 pending 是仍需重启才能替换的模块, restartReason 是 profile 级重启原因;两者都为空才会自动刷新页面。安装进行中会拒绝重载。

包内容

package.json 声明 dsh.bundle.patch 与 dsh.client.platform cordis.patch.yml 把自己插进 profile 的层栈 index.js 宿主半边:三条 HTTP 路由 market-core.mjs 市场逻辑(生成物,请勿手改) client/client.js 浏览器半边:左侧栏入口 + 主区域页面 + 页内三个标签

market-core.mjs 由源生成后一并提交,所以 clone 下来即可安装,不需要任何构建步骤。

许可

MIT
预览分享卡片长什么样 ↓99galaxy/dsh-plugin-market
分享 · DeepSeek Harness Hub
99galaxy/dsh-plugin-market

在设置面板浏览社区插件目录并一键安装

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