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

PRTS 皮肤整合包 missercatos/dsh-prts-ui

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

一键装好图形入口,给 dsh 换上黑白粒子主题

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

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

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

状态速览

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

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

验证判据与等级说明 →

可信度证据

安装兼容性检查⚠ 装前注意

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

展开查看检查明细 ↓

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

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

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/12 04:18:55

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

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 141 处,展示前 94 条)
  • 请求外部主机www.w3.org
    lib/client.js:2304
    function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefi
  • 请求外部主机discourse.threejs.org
    lib/client.js:2304
    function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefi
  • 请求外部主机discourse.threejs.org
    lib/client.js:2304
    function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefi
  • 发起网络请求
    lib/client.js:2304
    function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefi
  • 读取本地文件
    lib/host.js:212
    if (!existsSync(dir)) return json(res, 200, { items: [] })
  • 读取本地文件
    lib/host.js:213
    const items = readdirSync(dir)
  • 读取本地文件
    lib/host.js:217
    const st = statSync(join(dir, f))
  • 读取本地文件
    lib/host.js:228
    if (!existsSync(join(dir, file))) return json(res, 404, { ok: false })
  • 读取本地文件
    lib/host.js:229
    const b64 = readFileSync(join(dir, file)).toString('base64')
  • 删除本地文件递归
    lib/host.js:236
    if (existsSync(dir)) rmSync(dir, { recursive: true, force: true })
  • 读取本地文件
    lib/host.js:236
    if (existsSync(dir)) rmSync(dir, { recursive: true, force: true })
  • 删除本地文件
    lib/host.js:239
    if (existsSync(join(dir, file))) unlinkSync(join(dir, file))
  • 写入本地文件
    lib/host.js:246
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    lib/host.js:249
    if (offset <= 0) writeFileSync(join(dir, file), buf)
  • 写入本地文件
    lib/host.js:291
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    lib/host.js:292
    writeFileSync(file, JSON.stringify(items, null, 2))
  • 写入本地文件
    lib/host.js:298
    writeFileSync(file, JSON.stringify(items, null, 2))
  • 发起网络请求
    src/gui-boot.js:31
    const res = await fetch(url.replace(/ +$/, '') + '/api/workspace.list', {
  • 执行外部命令固定命令
    src/gui-boot.js:47
    spawn('taskkill', ['/pid', String(child.pid), '/T', '/F'], { stdio: 'ignore' })
  • 执行外部命令固定命令
    src/gui-boot.js:67
    child = spawn('dsh', ['--profile', profile, '--port', String(port)], opts);
  • 写入本地文件
    src/gui-boot.js:107
    try { if (state.child && state.child.pid) writeFileSync(state.pidFile, String(state.child.pid), 'utf8'); } catch (e) { }
  • 删除本地文件
    src/gui-boot.js:109
    const clearPid = () => { try { unlinkSync(state.pidFile); } catch (e) { } };
  • 读取本地文件
    src/gui-boot.js:201
    if (fromEnv && existsSync(fromEnv)) return fromEnv
  • 读取本地文件
    src/gui-boot.js:204
    return existsSync(bin) ? bin : null
  • 写入本地文件
    src/gui-boot.js:221
    const out = createWriteStream(dest)
  • 执行外部命令来自配置/变量
    src/gui-boot.js:238
    const child = spawn(cmd.file, cmd.args, { stdio: 'ignore' })
  • 写入本地文件
    src/gui-boot.js:249
    mkdirSync(dir, { recursive: true })
  • 删除本地文件
    src/gui-boot.js:258
    rmSync(zip, { force: true })
  • 删除本地文件
    src/gui-boot.js:261
    rmSync(zip, { force: true })
  • 读取本地文件
    src/gui-boot.js:263
    if (!existsSync(bin)) throw new Error('binary missing after unzip')
  • 执行外部命令来自配置/变量
    src/gui-boot.js:291
    const child = spawn(bin, ['--no-sandbox'].concat(cdpArgs, [main, url]), {
  • 读取本地文件
    src/shortcut.js:45
    if (existsSync(launcher)) return launcher
  • 写入本地文件
    src/shortcut.js:55
    mkdirSync(join(homedir(), '.local', 'share', 'icons'), { recursive: true })
  • 写入本地文件
    src/shortcut.js:56
    writeFileSync(stableIcon, readFileSync(iconPath))
  • 读取本地文件
    src/shortcut.js:56
    writeFileSync(stableIcon, readFileSync(iconPath))
  • 读取本地文件
    src/shortcut.js:58
    const icon = existsSync(stableIcon) ? stableIcon : iconPath
  • 写入本地文件
    src/shortcut.js:80
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    src/shortcut.js:82
    writeFileSync(vbs, 'CreateObject("WScript.Shell").Run "node ""' + join(pkgRoot, 'bin', 'dsh-prts-ui.js').replace(/ /g, '/') + '""", 0, False\n')
  • 写入本地文件
    src/shortcut.js:89
    writeFileSync(target, content, 'utf8')
  • 写入本地文件
    src/shortcut.js:90
    chmodSync(target, 0o755)
  • 读取本地文件
    src/shortcut.js:143
    if (!desktop || !existsSync(desktop)) {
  • 读取本地文件
    src/shortcut.js:156
    try { current = readFileSync(built.target, 'utf8') } catch (e) { }
  • 读取本地文件
    src/root.js:21
    return readFileSync(join(pkgRoot, rel), 'utf8')
  • 发起网络请求
    src/core/io.js:117
    const res = await fetch(request.url, {
  • 发起网络请求
    src/core/io.js:140
    const res = await fetch(request.url, {
  • 发起网络请求
    src/dsh/client.js:73
    const body = await bridge.request(method, payload || {});
  • 发起网络请求
    src/dsh/client.js:81
    res = await fetch(apiUrl(method), {
  • 发起网络请求
    src/dsh/client.js:107
    await fetch(D.baseUrl.replace(/ +$/, '') + '/api/respond', {
  • 发起网络请求
    src/dsh/client.js:192
    fetch(base + '/api/events.mux', { signal: ac.signal })
  • 发起网络请求
    src/dsh/state.js:60
    const r = await P.dsh.request('workspace.list', {});
  • 发起网络请求
    src/dsh/state.js:69
    const r = await P.dsh.request('session.list', {});
  • 发起网络请求
    src/dsh/state.js:118
    const r = await P.dsh.request('llm.models', {});
  • 发起网络请求
    src/dsh/state.js:125
    const r = await P.dsh.request('llm.providers', {});
  • 发起网络请求
    src/dsh/state.js:133
    const r = await P.dsh.request('agentPreset.list', {});
  • 发起网络请求
    src/dsh/state.js:148
    const r = await P.dsh.request('session.models', { sessionId });
  • 发起网络请求
    src/gui/app.js:91
    await fetch(origin + '/prts/api/open-path', {
  • 发起网络请求
    src/gui/app.js:140
    const res = await fetch(origin + '/prts/api/wallpaper?file=' + encodeURIComponent(w.file));
  • 发起网络请求
    src/gui/app.js:2288
    const res = await fetch(url, { method: 'HEAD' });
  • 发起网络请求
    src/gui/chat.js:534
    const res = await fetch(url, {
  • 写入剪贴板
    src/gui/chat.js:555
    if (navigator.clipboard) { await navigator.clipboard.writeText(s); return }
  • 发起网络请求
    src/gui/skills.js:42
    const res = await fetch(origin() + '/prts/api/skills');
  • 发起网络请求
    src/gui/skills.js:54
    const res = await fetch(origin() + '/prts/api/skills?name=' + encodeURIComponent(name));
  • 发起网络请求
    src/gui/skills.js:66
    const res = await fetch(origin() + '/prts/api/skills', {
  • 发起网络请求
    src/gui/skills.js:81
    const res = await fetch(origin() + '/prts/api/skill-install', {
  • 发起网络请求
    src/gui/skills.js:95
    const res = await fetch(origin() + '/prts/api/skill-delete', {
  • 发起网络请求
    src/gui/skills.js:187
    const res = await fetch(origin() + '/prts/api/open-path', {
  • 发起网络请求
    src/gui/stt.js:43
    const res = await fetch(url);
  • 发起网络请求
    src/gui/system.js:308
    const res = await fetch(origin + '/prts/api/logo');
  • 读取本地文件
    src/host.js:212
    if (!existsSync(dir)) return json(res, 200, { items: [] })
  • 读取本地文件
    src/host.js:213
    const items = readdirSync(dir)
  • 读取本地文件
    src/host.js:217
    const st = statSync(join(dir, f))
  • 读取本地文件
    src/host.js:228
    if (!existsSync(join(dir, file))) return json(res, 404, { ok: false })
  • 读取本地文件
    src/host.js:229
    const b64 = readFileSync(join(dir, file)).toString('base64')
  • 删除本地文件递归
    src/host.js:236
    if (existsSync(dir)) rmSync(dir, { recursive: true, force: true })
  • 读取本地文件
    src/host.js:236
    if (existsSync(dir)) rmSync(dir, { recursive: true, force: true })
  • 删除本地文件
    src/host.js:239
    if (existsSync(join(dir, file))) unlinkSync(join(dir, file))
  • 写入本地文件
    src/host.js:246
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    src/host.js:249
    if (offset <= 0) writeFileSync(join(dir, file), buf)
  • 写入本地文件
    src/host.js:291
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    src/host.js:292
    writeFileSync(file, JSON.stringify(items, null, 2))
  • 写入本地文件
    src/host.js:298
    writeFileSync(file, JSON.stringify(items, null, 2))
  • 执行外部命令来自配置/变量
    wizard/server.mjs:69
    try { return spawnSync(file, args, o) } catch (e) { return { status: 1, error: e } }
  • 读取本地文件
    wizard/server.mjs:78
    try { return JSON.parse(readFileSync(p, 'utf8')) } catch (e) { return null }
  • 读取本地文件
    wizard/server.mjs:136
    try { dirs = readdirSync(PROFILES_ROOT) } catch (e) { dirs = [] }
  • 读取本地文件
    wizard/server.mjs:140
    try { m = JSON.parse(readFileSync(pkgPath, 'utf8')) } catch (e) { continue }
  • 执行外部命令来自配置/变量
    wizard/server.mjs:172
    const child = spawn(cmd, args, Object.assign({ shell: IS_WIN, windowsHide: true }, opts))
  • 读取本地文件
    wizard/server.mjs:214
    const lines = readFileSync(ws, 'utf8').split('\n')
  • 写入本地文件
    wizard/server.mjs:219
    writeFileSync(ws, lines.join('\n'))
  • 读取本地文件
    wizard/server.mjs:303
    if (!existsSync(launcher)) return false
  • 执行外部命令固定命令
    wizard/server.mjs:305
    ? spawn('cmd.exe', ['/c', launcher], { detached: true, stdio: 'ignore', windowsHide: true })
  • 执行外部命令来自配置/变量
    wizard/server.mjs:306
    : spawn(launcher, [], { detached: true, stdio: 'ignore' })
  • 读取本地文件
    wizard/server.mjs:327
    const WIZARD_HTML = readFileSync(join(dirname(fileURLToPath(import.meta.url)), 'index.html'), 'utf8')
  • 执行外部命令来自配置/变量
    wizard/server.mjs:359
    const child = spawn(cmd[0], cmd[1], { detached: true, stdio: 'ignore', shell: IS_WIN })
  • 执行外部命令来自配置/变量
    wizard/server.mjs:372
    const child = spawn(bin, ['--no-sandbox', join(dirname(fileURLToPath(import.meta.url)), 'window.cjs'), url], {
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:www.w3.org、discourse.threejs.org

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-cmdline
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 一键安装图形入口
  • 黑白粒子主题

README

由 DeepSeek 最新模型翻译生成
PRTS — DeepSeek Harness (dsh) 整合包 + 皮肤 v0.0.1 (new) —— 彻底重做:PRTS 不再是一个「重写整个界面」的插件,而是一套整合包 + 皮肤。 PRTS 以 DeepSeek Harness (dsh) 为内核,套上一层「只做视觉、绝不动核心」的皮肤。它把复杂的命令行智能体工具封装成人人可用的图形化入口:桌面整合包负责「检测 / 安装 dsh → 打包已装插件 → 一键进入」,皮肤插件负责「好看」。 🔑 一个重要原则:不碰核心 PRTS 皮肤层严格只做五件事,其余 100% 走 dsh 原生: | # | 皮肤效果 | 做法 | | ① | 入场动画 | 整合包 splash 层三幕粒子(速度加快),dsh 就绪后进入 | | ② | 左上角品牌 | 鲸鱼 wordmark 视觉覆盖为菱形 + PRTS(不换图标文件) | | ③ | 首页欢迎语 | 「探索未至之境」→「欢迎回归,博士」(覆盖文案与鱼标) | | ④ | 系统面板 | 侧栏新增独立按钮,另开独立窗口(不改“点 logo 新建会话”) | | ⑤ | 整体主题 | 黑白 + 粒子 + 发光菱形 + 背景图形层(菱形 / 方块 / 白点,壁纸之上、对话框之下) |
展开完整文档(README 剩余 1 节)
PRTS — DeepSeek Harness (dsh) 整合包 + 皮肤

v0.0.1 (new) —— 彻底重做:PRTS 不再是一个「重写整个界面」的插件,而是一套整合包 + 皮肤。

PRTS 以 DeepSeek Harness (dsh) 为内核,套上一层「只做视觉、绝不动核心」的皮肤。它把复杂的命令行智能体工具封装成人人可用的图形化入口:桌面整合包负责「检测 / 安装 dsh → 打包已装插件 → 一键进入」,皮肤插件负责「好看」。

🔑 一个重要原则:不碰核心

PRTS 皮肤层严格只做五件事,其余 100% 走 dsh 原生:

| # | 皮肤效果 | 做法 |
| ① | 入场动画 | 整合包 splash 层三幕粒子(速度加快),dsh 就绪后进入 |
| ② | 左上角品牌 | 鲸鱼 wordmark 视觉覆盖为菱形 + PRTS(不换图标文件) |
| ③ | 首页欢迎语 | 「探索未至之境」→「欢迎回归,博士」(覆盖文案与鱼标) |
| ④ | 系统面板 | 侧栏新增独立按钮,另开独立窗口(不改“点 logo 新建会话”) |
| ⑤ | 整体主题 | 黑白 + 粒子 + 发光菱形 + 背景图形层(菱形 / 方块 / 白点,壁纸之上、对话框之下) |

这条红线保证了:输入框位置不动、deepseek 图标不换、对话 / 设置 / 插件市场等 dsh 核心逻辑完全不受影响。 dsh 升级只会带来新能力,不会让 PRTS 失效。

✨ 技术亮点

- 皮肤技术:复用 dsh 官方 client 插件 API —— theme.overrideTokens()(单色 token)、slots.register('sidebar.footer.action', …)(系统面板按钮)、CSS 皮肤层覆盖品牌与欢迎语。全部通过 dsh 稳定接口,不 patch 源码。
- 系统面板:Electron 独立 frameless 小窗(prts:openSystemPanel),只读遥测 / 关于,不改主窗口布局。
- 整合包:安装器「检测 / 装 dsh → 导出 ~/.dsh 已装插件 → 打包桌面整合包 → 生成快捷方式」,一键进入 PRTS 皮肤下的完整 DeepSeek Harness。

🖥️ 支持平台与安装包

| 平台 | 安装包 |
| Windows | PRTS-Setup--windows-x64.exe(自解压一键安装,重点) |
| Linux | PRTS--.deb |
| macOS | PRTS--macos.sh(安装器) |

安装器引导策略:
1. 检查系统是否自带 dsh,没有则自动安装(国内镜像回退);
2. 自动读取 ~/.dsh 各 profile 已安装的插件清单并作为整合包一起打包;
3. 生成桌面快捷方式(prts 命令 + 图标 = prts.png 菱形标志)。

▶️ 使用

prts # 打开 PRTS 窗口(粒子入场 → PRTS 皮肤版 dsh web)
dsh --profile prts # 等价写法
dsh --profile prts --lang zh
prts --shortcut # 刷新桌面快捷方式

配置 ~/.dsh/profiles/prts/prts-ui.json:.persona.userName 控制「欢迎回归,博士」中的称呼。

🛠️ 开发

pnpm install && pnpm bundle # 由 src/ 重新生成 web/index.html 与 lib/client.js
node scripts/make-dist.sh # 生成 dist/ 全部安装包(需对应平台打包工具)

皮肤插件核心:src/prts-client.js。Electron 壳:electron/main.cjs + electron/preload.cjs。
官网(保留):docs/(粒子特效下载站 + 手机端指引页),静态托管即可。

❓ 常见问题:Windows 安装时被 SmartScreen 拦截

安装 PRTS-Setup-*.exe 时 Windows 提示"Microsoft Defender SmartScreen 已阻止无法识别的应用程序",是因为:
- exe 未做代码签名(没有 Authenticode 数字证书),且是新文件、下载量少、信誉分不足。

临时放行(对当前用户):点击"更多信息 (More info)" → "仍要运行 (Run anyway)"。
如果提示来自文件属性("此文件来自其他计算机,可能被阻止"),右键 exe → 属性 → 勾选"解除锁定 (Unblock)"。

彻底解决(发布方):对 exe 做代码签名,签名后 SmartScreen 不再拦截,并显示发布者名称:
1. 购买 OV 或 EV 代码签名证书(DigiCert / Sectigo / GlobalSign / SSL.com 等,EV 可立即获得信誉),或使用 Azure Trusted Signing(微软云签名,无需 USB 令牌、按次计费);
2. 用 make-dist.sh 内置的签名步骤: Linux/macOS 用 osslsigncode:
PRTS_SIGN_PFX=/path/cert.pfx PRTS_SIGN_PASSWORD=xxx node scripts/make-dist.sh
Windows 用 SDK 的 signtool:
PRTS_SIGN_SHA1= node scripts/make-dist.sh

(自动加时间戳 http://timestamp.digicert.com;不提供证书时 exe 保持未签名并给出提示。)
3. 把最终 exe 提交到 Microsoft 恶意软件提交门户 并持续分发(下载量会累积信誉)。

📄 许可证

MIT —— 见 LICENSE。
预览分享卡片长什么样 ↓missercatos/dsh-prts-ui
分享 · DeepSeek Harness Hub
missercatos/dsh-prts-ui

一键装好图形入口,给 dsh 换上黑白粒子主题

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