自建插件仓库,跨设备同步与安装管理
29.3/100
综合分
2
GitHub 星标
56
npm 周下载
—/5
用户评分
数据截至 2026/9/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-plugin-reponpm 源 · dsh-plugin-repo 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · dev
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 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🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 自建插件仓库
- 跨设备同步
- 安装管理
最近更新
在 GitHub 查看全部 →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
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Z-6354/dsh-plugin-repo
自建插件仓库,跨设备同步与安装管理
相关插件 · 开发 / 工程
隐私简历生成器reactive-resume/reactive-resume
Reactive Resume 已迁至 GitHub 上的…
★ 45,210已汉化MCP
71.7
AI 架构文档生成器sopaco/deepwiki-rs
🚀 Litho 已进化为 Terrain —— 给你的 AI 智能体一张会呼吸的代码库地图。
★ 3,157已汉化DSH
70.8
长时任务执行闭环AMAP-ML/LongHorizon-Harness
面向 Computer-Use Agent 的 Loop Engineering
★ 1,764已汉化DSH
70.5
多代理编排运行时Enderfga/claw-orchestrator
面向编程智能体的运行时。把 Claude Code、Codex、Antigravity、Grok…
★ 586已汉化MCP
69.4
记忆进化插件csyangwen/dsh-memory-evolve
dsh-memory-evolve 使用场景指南
★ 461已汉化DSH
67.9
原生编程智能体paean-ai/deeptide
由 DeepSeek 打造,为 DeepSeek 而生。
★ 1,107已汉化DSH
67.7