DeepSeek Harness(DSH)Web UI 的 Steam 创意工坊式插件浏览器——零服务器:GitHub 驱动搜索、趋势窗口、中文搜索与双语翻译、插件签名过滤,还有智能一键安装/更新/卸载,附带已装插件管理器。
数据截至 2026/9/17 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
dsh plugin --profile web add yyyyukari/dsh-plugin-workshop状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
安装兼容性检查需源码安装仓库 package.json 标记 private,未发布到 npm,需从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/30 06:16:35
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
查看扫描证据(共 61 处,展示前 35 条)
- 执行外部命令固定命令lib/index.js:65
const r = spawnSync('git', ['--version'], { encoding: 'utf8', timeout: 10000, windowsHide: true }) - 执行外部命令来自配置/变量lib/index.js:77
return spawnSync(cmd, args, { encoding: 'utf8', timeout: timeoutMs || 180000, windowsHide: true }) - 读取本地文件lib/index.js:83
return JSON.parse(readFileSync(join(profileDir(), 'package.json'), 'utf8')) - 读取本地文件lib/index.js:139
dirs = readdirSync(presetsDir(), { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name) - 读取本地文件lib/index.js:156
hasLocal: !!(info && info.fromLink && existsSync(join(presetsDir(), info.repo))), - 读取本地文件lib/index.js:176
return JSON.parse(readFileSync(join(profileDir(), 'node_modules', pkgName, 'package.json'), 'utf8')) - 读取本地文件lib/index.js:191
const lines = readFileSync(patchPath(), 'utf8').split(/ ? /) - 读取本地文件lib/index.js:209
if (!existsSync(p)) return true - 写入本地文件lib/index.js:237
writeFileSync(p, out, 'utf8') - 写入本地文件lib/index.js:240
writeFileSync(p, lines.join('\n'), 'utf8') - 写入本地文件lib/index.js:263
writeFileSync(p, text, 'utf8') - 删除本地文件递归lib/index.js:349
if (st.isSymbolicLink() || st.isDirectory()) rmSync(entry, { recursive: true, force: true }) - 写入本地文件lib/index.js:391
writeFileSync(file, lines.join('\r\n'), 'utf8') - 执行外部命令固定命令lib/index.js:392
const child = spawn('cmd', ['/c', file], { detached: true, stdio: 'ignore', windowsHide: true }) - 写入本地文件lib/index.js:414
try { writeFileSync(file, id, 'utf8') } catch (e) { } - 写入本地文件lib/index.js:439
writeFileSync('C:/Users/Administrator/workshop-host-probe.txt', 'apply ran: ' + new Date().toISOString()) - 删除本地文件递归lib/index.js:502
rmSync(cloneDir, { recursive: true, force: true }) - 删除本地文件递归lib/index.js:534
rmSync(tmp, { recursive: true, force: true }) - 删除本地文件递归lib/index.js:579
rmSync(tmp, { recursive: true, force: true }) - 删除本地文件递归lib/index.js:585
rmSync(tmp, { recursive: true, force: true }) - 删除本地文件递归lib/index.js:589
if (existsSync(target)) rmSync(target, { recursive: true, force: true }) - 发起网络请求lib/client.js:44
const r = await window.fetch(path, { headers: { 'X-DSH-Workshop': '1' } }) - 发起网络请求lib/client.js:60
const res = await window.fetch(url, { headers: headers }) - 发起网络请求lib/client.js:70
const r = await window.fetch(url, { signal: AbortSignal.timeout(10000) }) - 请求外部主机translate.googleapis.comlib/client.js:191
return window.fetch('https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=zh-CN&dt=t&q=' + encodeURIComponent(t), { signal: Abort - 发起网络请求lib/client.js:191
return window.fetch('https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=zh-CN&dt=t&q=' + encodeURIComponent(t), { signal: Abort - 写入剪贴板lib/client.js:581
try { if (window.navigator && window.navigator.clipboard) window.navigator.clipboard.writeText(line) } catch (e) {} - 发起网络请求lib/client.js:806
window.fetch(statsUrl.replace(/ +$/, '') + '/stats?repos=' + encodeURIComponent(names), { signal: AbortSignal.timeout(6000) }) - 发起网络请求src/client/index.js:42
const r = await window.fetch(path, { headers: { 'X-DSH-Workshop': '1' } }) - 发起网络请求src/client/index.js:58
const res = await window.fetch(url, { headers: headers }) - 发起网络请求src/client/index.js:68
const r = await window.fetch(url, { signal: AbortSignal.timeout(10000) }) - 请求外部主机translate.googleapis.comsrc/client/index.js:189
return window.fetch('https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=zh-CN&dt=t&q=' + encodeURIComponent(t), { signal: Abort - 发起网络请求src/client/index.js:189
return window.fetch('https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=zh-CN&dt=t&q=' + encodeURIComponent(t), { signal: Abort - 写入剪贴板src/client/index.js:579
try { if (window.navigator && window.navigator.clipboard) window.navigator.clipboard.writeText(line) } catch (e) {} - 发起网络请求src/client/index.js:804
window.fetch(statsUrl.replace(/ +$/, '') + '/stats?repos=' + encodeURIComponent(names), { signal: AbortSignal.timeout(6000) })
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
功能亮点
- GitHub驱动插件搜索
- 趋势窗口浏览
- 插件签名过滤
README
由 DeepSeek 最新模型翻译生成展开完整文档(README 剩余 1 节)
🧩 DSH 插件工坊(dsh-plugin-workshop)
DeepSeek Harness(DSH)的创意工坊式插件浏览器——零服务器、单包开箱即用,内置在 DSH Web UI 侧栏「新会话」按钮正下方。
与 DSH_Creative_Workshop 的中心化市场平台路线不同,本项目走零基础设施路线:目录、搜索、热度、发布时间全部由 GitHub 免费提供,不部署任何控制平面或账号系统,装进 profile 即用。
✨ 特性
- 侧栏常驻入口:官方「新会话」按钮正下方,同款样式(DOM 克隆官方按钮,宽/窄侧栏自适应),刷新、重启都不丢
- 搜索与排序:关键词搜索(支持中文,自动映射英文)、★最热 / ⏰最新、飙升榜时间窗口(近 7/30/90 天新建 + 热度排序,Steam Trending 近似)
- 默认只搜 DSH 插件:默认「插件话题」(topic:dsh-plugin);搜索结果自动排除官方 harness 等核心仓库(查询级 -repo: 过滤,不再占据榜首);全站模式自带插件特征验证(检查 package.json 的 dsh 字段 / cordis.yml 等,走 raw CDN 不耗 API 额度),默认过滤无关仓库
- 已安装管理:工具栏「📦 已安装」视图——合并 profile 依赖/激活行/本地预设展示本机插件(类型、激活状态、安装来源),一键更新(pnpm update / git pull)与卸载
- 双语体验:描述一键切换原文/中文机翻,README 可整篇翻译(Google 翻译接口,自动缓存)
- 智能一键安装/卸载(预检分级):详情页自动预检仓库结构,给出「可直接安装 / 有风险 / 建议手动」三级评级——标准 bundle/nested/preset 一键安装照旧;特殊结构(多包 monorepo、非插件仓库、带构建脚本等)自动降级为作者给出的安装方式(从 README 提取安装命令,可复制,绝不自动执行)。卸载按安装方式逆向清理(pnpm remove 失败则不动文件、不留失效链接;成功后自动重启 dsh web 刷新插件表);缺 git 时界面明确提示
- 详情页:星数/fork/语言/许可证/创建时间、README 轻量渲染、手动安装命令、GitHub 直达
- 额度透明:实时显示 GitHub 搜索剩余额度与恢复倒计时;可选填 GitHub Token(30 次/分,仅存本机浏览器)
- 零服务器:数据全部来自 GitHub 搜索 API(浏览器直连,CORS)+ raw.githubusercontent.com(特征验证与 README);可选接入统计服务后解锁「社区装机徽章 + 真·飙升榜」(见 remote/README.md,不部署零影响)
📦 安装
以 web profile 为例:
一条命令即可:本包在 package.json 声明了 dsh.bundle.patch,
dsh plugin add 会自动把它加入 profile 的 dsh.profile.bundles,
启动时其 cordis.patch.yml 作为 bundle 补丁层自动激活,无需手改配置。
dsh plugin --profile web add "github:yyyyukari/dsh-plugin-workshop"
重启 dsh web 并刷新浏览器
手动接入旧流程:把本包加进 profile dependencies,并在 $DSH_HOME/profiles/web/cordis.patch.yml 添加:
- insert:
- id: plugin-workshop
name: '@dsh-external/dsh-plugin-workshop'
激活后侧栏「新会话」下方出现「🧩 插件工坊」,点击打开浮层;设置 → 插件 区也有「插件工坊」标签页。
🧭 使用
| 需求 | 操作 |
| 找 DSH 插件 | 默认即「插件话题」列表(topic:dsh-plugin 收录的仓库) |
| 看飙升榜 | 时间下拉选 近7天/近30天/近90天飙升 + ★最热 |
| 中文搜索 | 直接输入「天气」「翻译」等中文词,自动映射英文关键词 |
| 看中文描述 | 工具栏「描述中文」;详情页「翻译 README」 |
| 安装/更新/卸载插件 | 详情页「一键安装(订阅)/ 更新到最新 / 卸载」,按仓库类型自动选择安装路径(需要本机 git,缺失时会提示) |
| 提高搜索额度 | 工具栏 ⚙ → 填入 GitHub Personal Access Token |
🏗️ 架构
- 宿主侧(lib/index.js):在 webServer 服务上注册同源 HTTP 路由 /dsh-plugin-workshop/api/{status,install,update,uninstall};智能安装(bundle/preset 类型检测)与逆向卸载(严格输入校验 + 自定义头 CSRF 防护)
- 浏览器侧(lib/client.js):React + 平台种子模块;DOM 克隆官方按钮 + MutationObserver 自愈;shell.overlay 与 settings.plugins.tab 双挂载
- 数据流:GitHub 搜索 API(匿名 10 次/分)→ 特征验证与 README(raw CDN,无额度)→ 机翻(Google gtx)
- 安全:不执行任何第三方代码;Token 仅存 localStorage
🗺️ Roadmap
- [x] v1.1 一键安装/更新(宿主 API:git 探测、clone/pull 到 .agent-presets,缺失时界面提示)
- [x] v1.2 智能安装/卸载:bundle 型走官方 dsh plugin add + 激活行,preset 型走 .agent-presets,卸载逆向清理(实测通过)
- [x] v1.3 遵循 DSH bundle 规范:package.json 声明 dsh.bundle.patch(dsh plugin add 一条命令自动激活);智能安装兼容三种仓库形态(bundle / nested / preset)
- [x] v1.4 「已安装」管理视图(更新/卸载、类型与激活状态);搜索结果排除官方核心仓库;卸载安全化(失败不改动、自动重启刷新)
- [x] v1.5 可选统计服务(Phase A):匿名装机埋点 + 社区装机徽章 + 真·飙升榜(Cloudflare Worker 参考实现见 remote/,未部署时零影响)
- [x] 社区索引收录:✅ 三大列表全部收录——awesome-dsh-plugin(UI Enhancements 分类)/ awesome-deepseek-harness / awesome-dsh-plugins
📄 License
MIT预览分享卡片长什么样 ↓
DeepSeek Harness(DSH)Web UI 的 Steam 创意工坊式插件浏览器——零服务器:GitHub 驱动搜索、趋势窗口、中文搜索与双语翻译、插件签名过滤,还有智能一键安装/更新/卸载,附带已装插件管理器。