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

插件商店增强版 yiqizhuapangxiema/harness-plugin-store-optimized

DeepSeek Harness
yiqizhuapangxiema79 天前有提交已提供中文文档扫描:高危

图形化安装管理插件,带依赖拓扑与冲突检测

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

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

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

状态速览

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

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

验证判据与等级说明 →

可信度证据

🔴 安全扫描发现高危能力自动 · 静态分析源码
v2.7.0
🔴 扫描:高危尚无人工评估

静态扫描发现安装期即执行代码,或命令参数由运行时变量拼接(参数来源无法静态判定,从严处理)。

命令参数由运行时变量拼接读写/删除本地文件发起外部网络请求
查看扫描证据(共 86 处,展示前 55 条)
  • 读取本地文件
    lib/host/index.js:100
    if (existsSync(file)) {
  • 读取本地文件
    lib/host/index.js:101
    const id = readFileSync(file, 'utf8').trim().slice(0, 64);
  • 读取本地文件
    lib/host/index.js:367
    const manifest = JSON.parse(readFileSync(this.profile.packageJsonFile, 'utf8'));
  • 读取本地文件
    lib/host/index.js:379
    const patch = readFileSync(this.profile.patchFile, 'utf8');
  • 请求外部主机registry.npmjs.org
    lib/host/index.js:457
    const res = await fetch(`https://registry.npmjs.org/${encodeURIComponent(packageName)}`, { signal: AbortSignal.timeout(10000) });
  • 发起网络请求
    lib/host/index.js:457
    const res = await fetch(`https://registry.npmjs.org/${encodeURIComponent(packageName)}`, { signal: AbortSignal.timeout(10000) });
  • 请求外部主机registry.npmjs.org
    lib/host/index.js:550
    const res = await fetch(`https://registry.npmjs.org/${encodeURIComponent(packageName)}`, { method: 'HEAD', signal: AbortSignal.timeout(8000) });
  • 发起网络请求
    lib/host/index.js:550
    const res = await fetch(`https://registry.npmjs.org/${encodeURIComponent(packageName)}`, { method: 'HEAD', signal: AbortSignal.timeout(8000) });
  • 读取本地文件
    lib/host/index.js:598
    const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
  • 请求外部主机api.npmjs.org
    lib/host/index.js:828
    const res = await fetch(`https://api.npmjs.org/downloads/range/${start}:${end}/${encodeURIComponent(packageName)}`, { signal: AbortSignal.timeout(10_0
  • 发起网络请求
    lib/host/index.js:828
    const res = await fetch(`https://api.npmjs.org/downloads/range/${start}:${end}/${encodeURIComponent(packageName)}`, { signal: AbortSignal.timeout(10_0
  • 读取本地文件
    lib/host/index.js:1014
    const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
  • 写入本地文件
    lib/host/store-db.js:143
    mkdirSync(dir, { recursive: true });
  • 发起网络请求
    lib/host/github.js:51
    const res = await fetch(url, { headers: { ...this.headers(), ...extraHeaders }, signal: AbortSignal.timeout(20000) });
  • 发起网络请求
    lib/host/github.js:71
    const res = await fetch(url, { headers: { 'User-Agent': 'dsh-plugin-hub' }, signal: AbortSignal.timeout(20000) });
  • 发起网络请求
    lib/host/github.js:126
    const res = await fetch(`${NPM_API}/downloads/point/last-month/${encodeURIComponent(packageName)}`, { signal: AbortSignal.timeout(10000) });
  • 写入本地文件
    lib/host/installer.js:58
    mkdirSync(dir, { recursive: true });
  • 读取本地文件
    lib/host/installer.js:59
    accessSync(dir, constants.W_OK);
  • 读取本地文件
    lib/host/installer.js:111
    if (existsSync(p))
  • 读取本地文件
    lib/host/installer.js:125
    if (existsSync(p))
  • 执行外部命令来自配置/变量
    lib/host/installer.js:152
    const child = spawn(exe, args, { cwd, windowsHide: true });
  • 执行外部命令运行时拼接
    lib/host/installer.js:174
    ? spawn(`${exe} ${args.map(escapeWinArg).join(' ')}`, { cwd, shell: true, windowsHide: true, env: { ...process.env, NO_COLOR: '1' } })
  • 执行外部命令来自配置/变量
    lib/host/installer.js:175
    : spawn(exe, args, { cwd, shell: false, windowsHide: true, env: { ...process.env, NO_COLOR: '1' } });
  • 执行外部命令固定命令
    lib/host/installer.js:188
    spawn('taskkill', ['/pid', String(child.pid), '/t', '/f'], { windowsHide: true, stdio: 'ignore' });
  • 读取本地文件
    lib/host/installer.js:219
    if (!existsSync(filename))
  • 读取本地文件
    lib/host/installer.js:222
    return JSON.parse(readFileSync(filename, 'utf8'));
  • 读取本地文件
    lib/host/installer.js:232
    const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
  • 写入本地文件
    lib/host/installer.js:313
    writeFile(profile.packageJsonFile, `${JSON.stringify(manifest, null, 2)}\n`, 'utf8').catch((err) => {
  • 写入本地文件
    lib/host/installer.js:396
    await mkdir(dirname(filename), { recursive: true });
  • 写入本地文件
    lib/host/installer.js:398
    await writeFile(temporary, content.endsWith('\n') ? content : `${content}\n`, 'utf8');
  • 写入本地文件
    lib/host/installer.js:399
    await rename(temporary, filename);
  • 写入本地文件
    lib/host/installer.js:489
    await writeFile(f, `${JSON.stringify(pkg, null, 2)}\n`, 'utf8');
  • 执行外部命令固定命令
    lib/host/installer.js:787
    const child = spawn('git', args, { cwd, windowsHide: true, env: { ...process.env, GIT_TERMINAL_PROMPT: '0' } });
  • 删除本地文件递归
    lib/host/installer.js:799
    await rm(target, { recursive: true, force: true });
  • 发起网络请求
    lib/host/npm-probe.js:32
    const res = await fetch(url, { method: 'HEAD', signal, redirect: 'follow' });
  • 执行外部命令运行时拼接
    lib/host/publish.js:34
    ? spawn(`${cmd} ${args.map(escapeWinArg).join(' ')}`, { cwd, shell: true, windowsHide: true, env: { ...process.env, NO_COLOR: '1' } })
  • 执行外部命令来自配置/变量
    lib/host/publish.js:35
    : spawn(cmd, args, { cwd, windowsHide: true, env: { ...process.env, NO_COLOR: '1' } });
  • 执行外部命令固定命令
    lib/host/publish.js:47
    spawn('taskkill', ['/pid', String(child.pid), '/t', '/f'], { windowsHide: true, stdio: 'ignore' });
  • 发起网络请求
    lib/host/publish.js:66
    const res = await fetch(url, {
  • 读取本地文件
    lib/host/publish.js:86
    const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
  • 读取本地文件
    lib/host/publish.js:211
    if (req.writeReadme !== false && m.description && !existsSync(join(m.dir, 'README.md')) && !existsSync(join(m.dir, 'readme.md'))) {
  • 写入本地文件
    lib/host/publish.js:214
    writeFileSync(join(m.dir, 'README.md'), readme, 'utf8');
  • 读取本地文件
    lib/host/publish.js:218
    if (!existsSync(join(m.dir, '.git'))) {
  • 发起网络请求
    lib/host/publish.js:295
    const res = await fetch(`${NPM_REGISTRY}/-/whoami`, {
  • 发起网络请求
    lib/host/publish.js:311
    const res = await fetch(`${NPM_REGISTRY}/${encodeURIComponent(m.pkgName).replace(/%2F/g, '/')}`, { signal: AbortSignal.timeout(15_000) });
  • 发起网络请求
    lib/host/catalog-sync.js:5
    const res = await fetch(CATALOG_URL, { signal: AbortSignal.timeout(15_000) });
  • 读取本地文件
    lib/host/conflict-check.js:28
    entries = readdirSync(dir);
  • 读取本地文件
    lib/host/conflict-check.js:39
    st = statSync(full);
  • 读取本地文件
    lib/host/conflict-check.js:67
    pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
  • 读取本地文件
    lib/host/conflict-check.js:80
    text = readFileSync(file, 'utf8');
  • 读取本地文件
    lib/host/conflict-check.js:96
    const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
  • 读取本地文件
    lib/host/conflict-check.js:107
    const manifest = JSON.parse(readFileSync(profile.packageJsonFile, 'utf8'));
  • 读取本地文件
    lib/host/security-scan.js:54
    entries = readdirSync(dir);
  • 读取本地文件
    lib/host/security-scan.js:65
    st = statSync(full);
  • 读取本地文件
    lib/host/security-scan.js:119
    text = readFileSync(join(dir, f), 'utf8');
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:registry.npmjs.org、api.npmjs.org

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-typert-protocol@deepseek-ai/cordis-plugin-loader@deepseek-ai/dsh-api-gateway@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-settings-general@deepseek-ai/dsh-client-ui-sidebar@deepseek-ai/dsh-client-ui-slots
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 图形化浏览搜索插件
  • 一键安装插件
  • 依赖拓扑展示

Harness 插件商店优化版:图形化浏览/搜索/一键安装 DSH 插件,评分评论、依赖拓扑、审计日志、质量门一应俱全;本 fork 新增可配置插件下载目录、bundle 层冲突检测、pnpm 自动寻路,并修复多项上游 bug

README

由 DeepSeek 最新模型翻译生成
Harness 插件商店优化版 简介:本仓库是 dsh-plugin-hub 0.1.6 的定制优化版。 - 继承原版全部功能:深度集成 Harness Web UI 的图形化插件商店 —— 浏览 / 搜索 / 一键安装、本地评分评论、依赖拓扑图、操作审计日志、插件开发脚手架、安装前质量门与安全扫描、健康度排行榜、信任徽章 - 本 fork 的修改优化:插件下载目录可配置(默认 /plugins,插件以源码文件夹落盘并自动注册部署)、bundle 层入口 id 冲突检测(安装前拦截会导致整树崩溃的插件)、pnpm 自动寻路(任意终端可用)、准确的"重启生效"提示、启用超时透传真实错误、scoped 包支持,以及 3 项上游 bug 修复 下载与安装 前置条件:官方 dsh CLI(npm install -g @deepseek-ai/dsh)、pnpm 10+(不在 PATH 上也没关系,商店安装插件时会自动寻找 harness 本地的 pnpm shim)。
展开完整文档(README 剩余 1 节)
Harness 插件商店优化版

简介:本仓库是 dsh-plugin-hub 0.1.6 的定制优化版。

- 继承原版全部功能:深度集成 Harness Web UI 的图形化插件商店 —— 浏览 / 搜索 / 一键安装、本地评分评论、依赖拓扑图、操作审计日志、插件开发脚手架、安装前质量门与安全扫描、健康度排行榜、信任徽章
- 本 fork 的修改优化:插件下载目录可配置(默认 /plugins,插件以源码文件夹落盘并自动注册部署)、bundle 层入口 id 冲突检测(安装前拦截会导致整树崩溃的插件)、pnpm 自动寻路(任意终端可用)、准确的"重启生效"提示、启用超时透传真实错误、scoped 包支持,以及 3 项上游 bug 修复

下载与安装

前置条件:官方 dsh CLI(npm install -g @deepseek-ai/dsh)、pnpm 10+(不在 PATH 上也没关系,商店安装插件时会自动寻找 harness 本地的 pnpm shim)。

方式一:克隆本仓库安装(推荐,替换 registry 版)

git clone https://github.com/yiqizhuapangxiema/harness-plugin-store-optimized.git
cd harness-plugin-store-optimized
dsh plugin --profile web add file:

profile 的依赖规格会变成 file: 指向本仓库,重启 dsh web 后生效(浏览器 Ctrl+F5 刷新)。

方式二:npm 安装(发布后可用)

dsh plugin --profile web add dsh-plugin-store-optimized

npm 包 dsh-plugin-store-optimized 尚未发布;发布后此命令即可用。

方式三:给已装的 registry 版打补丁

cd /profiles/web/node_modules/dsh-plugin-hub
git apply --ignore-whitespace /patches/installer.js.patch
其余 4 个补丁同法:index.js / conflict-check.js / remote.js / client.js

上游(原作者)发布新版本后,升级并重新打补丁即可。

注意:不要与 registry 版的 dsh-plugin-hub 同时安装 —— 两者插入相同的 loader 入口 id 会导致插件树崩溃。安装前先卸载旧版:dsh plugin --profile web remove dsh-plugin-hub。

本 fork 新增的功能

| 功能 | 说明 |
| 可配置插件下载目录 | 设置页(商店内设置 + 全局 DSH 设置)新增「插件安装目录」项。默认 /plugins;留空保存 = 恢复默认。商店初始化时自动创建该目录。 |
| 插件源码目录管理 | 商店安装的每个插件都会以真实包文件夹形式落到配置目录(如 plugins//,作用域包为 plugins/@scope/名称/),再通过 file: 依赖 + bundles/补丁激活自动注册进 profile。卸载时同步删除文件夹(及空的 scope 父目录)。 |
| bundle 层冲突检测(第 4 项检查) | 激活前将新插件 bundle 补丁中 insert 的入口 id 与现有所有 bundle 层逐一比对,重复即拦截并列出冲突 id(如把 TUI 插件装进 web profile 的场景)—— 防止整树启动崩溃(duplicate loader entry id)。 |
| pnpm 自动寻路 | 先搜 PATH 中的 pnpm,找不到则回退到 harness 本地 shim(/.dsh-tools/pnpm.cmd、/.bin/pnpm.cmd)。任意终端启动都能正常安装插件,即使 pnpm 不在 PATH 上。 |
| 准确的重启提示 | bundles 层插件只在启动时组合,安装回执现在明确提示「重启 dsh 后生效」(restartRequired: true),不再谎称热加载;对"已安装但未加载"的插件执行启用/禁用也会返回同样的明确提示。 |
| 启用超时透传真实错误 | 插件启用超时时的报错会附上条目真实的初始化失败原因(如 no pet packages found in ~/.codex/pets),不再只有干巴巴的「超时」。 |
| 作用域包支持 | @scope/name 包可正确暂存(自动创建 scope 父目录、暂存目录名扁平化)。 |
| 上游 bug 修复 | ① yaml 的 map.get('insert') 返回 YAMLSeq 节点,原代码用 Array.isArray 误判导致 owned 补丁行卸载时永远删不掉;② 补丁完整性检查用正则扫原始文本(引号不剥离、注释碎片被当成包名)→ 平台包(@deepseek-ai/*)被误拦,已改为结构化 YAML 解析;③ 容忍 pnpm 卸载后置失败(已删除但退出码 1),不再留下半卸载状态。 |

更新日志

0.2.0(2026-08-17)

- 可配置插件下载目录:设置页新增「插件安装目录」(默认 /plugins,留空恢复默认),商店初始化自动创建;插件以源码文件夹落盘并自动注册部署,卸载同步清理
- bundle 层冲突检测(第 4 项检查):安装前比对新插件与现有 bundle 层的 insert 入口 id,重复即拦截并列出冲突 id,防止整树启动崩溃
- pnpm 自动寻路:PATH 无 pnpm 时自动回退 harness 本地 shim,任意终端可用
- 准确的提示:bundles 插件安装回执明确「重启 dsh 后生效」;启用/禁用超时附上条目真实初始化错误
- scoped 包支持:@scope/name 包正确暂存与卸载(scope 父目录自动创建/回收)
- 上游 bug 修复:① yaml YAMLSeq 误判导致 owned 补丁行无法卸载清理;② 补丁完整性检查正则误报(引号/注释)→ 改为结构化 YAML 解析;③ 容忍 pnpm 卸载后置失败(已删除但退出码 1)

回归测试

| 脚本 | 覆盖 |
| tests/verify-install.mjs | 完整安装/卸载链路 10 项检查(假插件,含无 pnpm PATH 场景) |
| tests/verify-scoped.mjs | scoped 包名(@scope/name)安装/卸载回归 |
| tests/install-pet.mjs | 宠物包下载 + 用插件自身 loader 验证 |

运行:node tests/verify-install.mjs(Windows 上建议带 PATH=...\.dsh-tools 前缀以保证 pnpm 可用;无 pnpm 时脚本会走 shim 回退)。

其他文档

- FORK-README.md —— 改动清单、部署方法、基线提交
- docs/UPSTREAM-README.md —— 原始 README 存档(原版功能总览与更新日志)

上游许可见 LICENSE(二次开发需保留原作者版权声明)。
预览分享卡片长什么样 ↓yiqizhuapangxiema/harness-plugin-store-optimized
分享 · DeepSeek Harness Hub
yiqizhuapangxiema/harness-plugin-store-optimized

图形化安装管理插件,带依赖拓扑与冲突检测

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