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

桌面发行版铸造台 ptonlix/dsh-forge

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

围绕 DeepSeek Harness(DSH)打造可审计的桌面发行版。

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

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

自动兼容检查未通过:要求 dsh 0.1.2-alpha.4,而最新版为 0.2.1-rc.5;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add ptonlix/dsh-forge
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · browser
装得上吗
实装验证未通过(dep_tree_unresolvable),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 1 天前
档位由哪些信号合成

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

验证判据与等级说明 →
⚠︎ 实装验证未通过(dep_tree_unresolvable · 2026/9/28) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

要求 dsh 0.1.2-alpha.4,而最新版为 0.2.1-rc.5;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

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

✗npm 包@dsh-forge/core(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22.13.0 · 基线 Node 22.19 满足
✗dsh CLI 依赖要求 0.1.2-alpha.4 · 最新 0.2.1-rc.5 不兼容
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/2 17:43:09

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 45 处,展示前 40 条)
  • 读取本地文件
    apps/desktop/main.ts:169
    if (!fs.existsSync(profileAnchor)) fail(`缺少 profile 模块锚点: ${profileAnchor}`, 'PROFILE_DEPENDENCY_ANCHOR_MISSING');
  • 读取本地文件
    apps/desktop/main.ts:185
    if (fs.existsSync(manifest)) return fs.realpathSync(directory);
  • 读取本地文件
    apps/desktop/main.ts:191
    const manifest = JSON.parse(fs.readFileSync(path.join(directory, 'package.json'), 'utf8')) as { name?: unknown };
  • 读取本地文件
    apps/desktop/main.ts:196
    const manifest = JSON.parse(fs.readFileSync(path.join(directory, 'package.json'), 'utf8')) as { version?: unknown };
  • 写入本地文件
    apps/desktop/main.ts:213
    fs.mkdirSync(path.dirname(link), { recursive: true, mode: 0o700 });
  • 读取本地文件
    apps/desktop/main.ts:216
    stat = fs.lstatSync(link);
  • 删除本地文件
    apps/desktop/main.ts:240
    fs.unlinkSync(link);
  • 写入本地文件
    apps/desktop/main.ts:260
    fs.mkdirSync(path.dirname(destination), { recursive: true, mode: 0o700 });
  • 读取本地文件
    apps/desktop/main.ts:263
    stat = fs.lstatSync(destination);
  • 删除本地文件
    apps/desktop/main.ts:267
    if (stat?.isSymbolicLink()) fs.unlinkSync(destination);
  • 写入本地文件
    apps/desktop/main.ts:270
    fs.mkdirSync(destination, { recursive: true, mode: 0o700 });
  • 写入本地文件
    apps/desktop/main.ts:327
    fs.mkdirSync(path.dirname(destination), { recursive: true, mode: 0o700 });
  • 发起网络请求
    apps/desktop/main.ts:434
    const request = http.get(url, (response) => {
  • 读取本地文件
    packages/desktop-services-local/src/full-package-ota.ts:148
    parsed = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) as unknown;
  • 读取本地文件
    packages/desktop-services-local/src/full-package-ota.ts:182
    const stat = fs.lstatSync(value);
  • 读取本地文件
    packages/desktop-services-local/src/full-package-ota.ts:184
    fs.accessSync(value, fs.constants.W_OK);
  • 读取本地文件
    packages/desktop-services-local/src/full-package-ota.ts:198
    osRelease = options.readOsRelease ? options.readOsRelease() : fs.readFileSync('/etc/os-release', 'utf8');
  • 删除本地文件
    packages/desktop-services-local/src/full-package-ota.ts:232
    return fsPromises.rm(file, { force: true }).catch(() => undefined);
  • 写入本地文件
    packages/desktop-services-local/src/full-package-ota.ts:325
    await fsPromises.mkdir(stagingDirectory, { recursive: true, mode: 0o700 });
  • 写入本地文件
    packages/desktop-services-local/src/full-package-ota.ts:346
    await pipeline(source, fs.createWriteStream(partialPackage, { flags: 'wx', mode: 0o600 }));
  • 写入本地文件
    packages/desktop-services-local/src/full-package-ota.ts:350
    await fsPromises.rename(partialPackage, stagedPackage);
  • 写入本地文件
    packages/desktop-services-local/src/full-package-ota.ts:351
    await fsPromises.chmod(stagedPackage, 0o600);
  • 读取本地文件
    packages/desktop-services-local/src/packages.ts:170
    if (!fs.existsSync(file)) fail('pnpm lockfile 缺失,无法验证实际解析来源', 'INSTALL_LOCKFILE_UNKNOWN');
  • 读取本地文件
    packages/desktop-services-local/src/packages.ts:171
    const lock = object(parseYaml(fs.readFileSync(file, 'utf8')));
  • 读取本地文件
    packages/desktop-services-local/src/packages.ts:221
    if (!path.isAbsolute(capability.profileDir) || !fs.existsSync(capability.profileDir))
  • 写入本地文件
    packages/desktop-services-local/src/packages.ts:244
    fs.mkdirSync(this.transactionDir, { recursive: true, mode: 0o700 });
  • 删除本地文件
    packages/desktop-services-local/src/packages.ts:259
    fs.unlinkSync(wal);
  • 删除本地文件
    packages/desktop-services-local/src/packages.ts:273
    fs.unlinkSync(wal);
  • 删除本地文件
    packages/desktop-services-local/src/packages.ts:282
    fs.unlinkSync(wal);
  • 读取本地文件
    packages/desktop-services-local/src/packages.ts:288
    if (fs.existsSync(wal)) fs.unlinkSync(wal);
  • 执行外部命令固定命令
    packages/desktop-services-local/src/process-tree.ts:34
    spawnSync('taskkill', ['/pid', String(pid), '/T', '/F'], { stdio: 'ignore', windowsHide: true });
  • 执行外部命令来自配置/变量
    packages/desktop-services-local/src/process-tree.ts:82
    spawn(command, args, {
  • 读取本地文件
    packages/desktop-services-local/src/recovery.ts:41
    snapshot[file] = fs.existsSync(target) ? fs.readFileSync(target).toString('base64') : null;
  • 读取本地文件
    packages/desktop-services-local/src/recovery.ts:50
    if (fs.existsSync(target)) fs.unlinkSync(target);
  • 写入本地文件
    packages/desktop-services-local/src/recovery.ts:52
    fs.writeFileSync(target, Buffer.from(content, 'base64'), { mode: 0o600 });
  • 读取本地文件
    packages/desktop-services-local/src/recovery.ts:59
    if (!fs.existsSync(transactionDir)) return Object.freeze({ recovered: false, manualRecovery: false, reason: null });
  • 读取本地文件
    packages/desktop-services-local/src/recovery.ts:61
    for (const name of fs.readdirSync(transactionDir).filter((file) => /^install-.*\.json$/.test(file))) {
  • 读取本地文件
    packages/desktop-services-local/src/recovery.ts:64
    const wal = JSON.parse(fs.readFileSync(file, 'utf8')) as Partial<InstallWal>;
  • 写入本地文件
    packages/desktop-services-local/src/recovery.ts:67
    fs.renameSync(file, `${file}.recovered`);
  • 写入本地文件
    packages/desktop-services-local/src/recovery.ts:81
    fs.writeFileSync(file, `${JSON.stringify(value, null, 2)}\n`, { encoding: 'utf8', mode: 0o600, flag: 'wx' });
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/cordis-plugin-group@deepseek-ai/dsh@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-invariants
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

2 张 · 点击查看大图

功能亮点

  • 打造可审计桌面发行版

README

由 DeepSeek 最新模型翻译生成
⚒️ DSH Forge DSH Forge 铸造台为你的 DeepSeek Harness 构建桌面发行版构建期组合插件 · 打包 Electron 应用 · 锁定并验证依赖 - 直接安装官方版本 本仓库会精选当前DSH插件整合成一个官方桌面端(懒人一键下载安装)官方构建 - Fork 并定制自己的 Harness —— Fork 本仓库, 基于本仓库的内容拓展或者替换相关DSH插件,打包定制属于自己的桌面端 (DSH Forge已为你处理好桌面端的细节) 🎨 DSH Forge 核心特色 DSH Forge 将 Electron 宿主与 DSH 插件分层 1. apps/desktop 是唯一的桌面宿主,负责启动器、窗口安全、generation 生命周期和平台适配; 2. 创建 launcher capability,由 desktop layer 注册私有 @dsh-forge/desktop-services-local provider。 3. 第三方 bundle 只依赖公开的@dsh-forge/desktop-services contract,通过 Cordis 使用 desktopProfiles、desktopPnpm 和 desktopServices,不直接接触 Electron、宿主路径或 pnpm参数。
展开完整文档(README 剩余 1 节)
⚒️ DSH Forge

DSH Forge 铸造台为你的 DeepSeek Harness 构建桌面发行版构建期组合插件 · 打包 Electron 应用 · 锁定并验证依赖

- 直接安装官方版本 本仓库会精选当前DSH插件整合成一个官方桌面端(懒人一键下载安装)官方构建
- Fork 并定制自己的 Harness —— Fork 本仓库, 基于本仓库的内容拓展或者替换相关DSH插件,打包定制属于自己的桌面端 (DSH Forge已为你处理好桌面端的细节)

🎨 DSH Forge 核心特色

DSH Forge 将 Electron 宿主与 DSH 插件分层

1. apps/desktop 是唯一的桌面宿主,负责启动器、窗口安全、generation 生命周期和平台适配;
2. 创建 launcher capability,由 desktop layer 注册私有 @dsh-forge/desktop-services-local provider。
3. 第三方 bundle 只依赖公开的@dsh-forge/desktop-services contract,通过 Cordis 使用 desktopProfiles、desktopPnpm 和 desktopServices,不直接接触 Electron、宿主路径或 pnpm参数。

支持快速继承社区插件:

- 构建期可组合:distribution.yml、profile、bundle 和静态 catalog 共同定义发行版
- 宿主边界清晰:apps/desktop 聚焦 Electron 和平台职责,公开 contract 与私有 provider 分离,DSH 核心无需改写。
- 可复现、可验证:依赖闭包在构建期解析并锁定,lockfile、SBOM 和打包检查沉淀为发布证据

当前已支持的桌面端功能

- [x] Electron 宿主启动:apps/desktop 负责单实例锁、窗口创建、平台适配和受控退出。
- [x] 安全窗口与导航:启用 Chromium sandbox、context isolation,关闭 Node integration;仅允许当前
generation 的 loopback 页面,HTTP(S) 和 mailto: 外链交给系统,任意新窗口和 file: 导航都会被拒绝。
- [x] Profile 与 DSH Home:开发态可以使用 --profile 选择 profile;打包应用固定构建时的 profile,并将
受管 profile 放入 DSH Home。
- [x] Generation 生命周期:Host、loopback、窗口和 renderer 按序就绪后才提交;支持
last-known-good 回退、失败事实持久化和受管进程 teardown。
- [x] 公开桌面 service:通过 @dsh-forge/desktop-services 提供 desktopProfiles、desktopPnpm 和
desktopServices,调用前校验 protocol。
- [x] 受管 pnpm 与安装恢复(底层 API):支持 inspect、reconcile、remove 和 catalog 确认安装,
带 operation lease、取消、WAL、来源复核和健康检查;当前没有页面端插件安装入口。
- [x] 完整安装包 OTA:支持版本检查、设置页“升级管理”、下载进度、用户确认、Windows/macOS/Ubuntu
AppImage 重启回执与失败恢复;Linux OTA 仅支持 Ubuntu 22.04+ 的可写 AppImage。
- [ ] 打包应用运行时 profile 切换:当前发行包固定一个 profile,页面端不提供切换。
- [ ] 页面端插件市场与在线下载/安装。
- [ ] 存储空间管理。
- [ ] 托盘或终端 UI。

🚀 快速开始

环境要求

- Node.js >=22.13.0
- pnpm 11.7.0
- 能运行 Electron 的 macOS、Windows 或 Linux 环境

安装依赖并启动默认开发 profile:

pnpm install --frozen-lockfile
pnpm dev

切换其他开发 profile:pnpm dev -- --profile developer

使用插件引入 Skill

在你的 DSH Forge Fork 根目录安装 dsh-forge-add-plugin:

npx skills add ptonlix/dsh-forge --skill dsh-forge-add-plugin

CLI 会提示你选择已使用的 agent 与项目级安装方式。随后直接告诉 agent 要引入的 npm 包或 GitHub 地址,以及可选目标 profile:

使用 $dsh-forge-add-plugin 将 dsh-better-sidebar@0.18.0-alpha.0 引入 developer。
使用 $dsh-forge-add-plugin 将 https://github.com/example/dsh-plugin 引入 developer。

省略目标时默认引入 dsh-forge-official。GitHub 仓库必须固定到 commit,且当前dsh-forge-official profile 只接受已发布的 npm bundle;仅存在 GitHub 来源的插件请指定 developer。
skill 会审核来源和脚本、更新 OpenSpec、依赖、catalog 与 profile,并执行实际 Electron 打包和 smoke;需要执行第三方生命周期脚本时会先请求确认。

🛠️ 常用命令

| 命令 | 作用 |
| pnpm run profile:resolve -- dsh-forge-official | 把 profile 解析为 lockfile 和 SBOM 输入 |
| pnpm run profile:verify -- dsh-forge-official | 对照运行时和 schema 约束验证组合 |
| pnpm run package:desktop -- dsh-forge-official | 为 profile 构建 Electron 安装包 |
| pnpm run package:inspect -- dsh-forge-official | 检查安装包内容和运行时事实 |
| pnpm run package:smoke -- dsh-forge-official | 启动打包应用并运行 smoke 检查 |

质量与文档门禁:

pnpm run check:all
pnpm run docs:check
pnpm run docs:build

🗂️ 仓库布局

.
├── .agents/
│ └── skills/ # 仓库内 agent 工作流与维护规范 ├── .github/ │ └── workflows/ # CI、发布与站点自动化 ├── apps/ │ └── desktop/ # Electron 宿主 │ ├── bootstrap/ # 启动与单实例入口 │ ├── platform/ # 窗口、安全与原生平台适配 │ └── runtime/ # generation 与运行时编排 ├── assets/ # README 与站点使用的图形资源 ├── build/ # 安装包图标、许可与 macOS entitlements ├── catalog/ │ └── catalog.yml # 外部 bundle 的静态审核事实 ├── docs/ │ ├── design/ # 架构与发行版边界 │ ├── engineering/ # 工程、迁移与验证记录 │ ├── i18n/ # 公开文档清单与双语治理 │ └── reference/ # 配置、service 与操作参考 ├── openspec/ │ ├── changes/ # 活动及归档变更材料 │ └── specs/ # 当前能力规范 ├── packages/ │ ├── bundles/ │ │ └── desktop-layer/ # launcher 临时注入的桌面 bundle │ ├── desktop-services/ # 面向 bundle/Fork 的公开 contract │ └── desktop-services-local/ # 私有 provider:WAL、受管 pnpm ├── profiles/ │ ├── developer/ # 最小开发组合 │ └── dsh-forge-official/ # 默认发行组合 ├── schemas/ # distribution、profile、bundle 与 catalog 契约 ├── scripts/ # 构建、打包、边界、smoke 与发布编排 ├── skills/ │ └── dsh-forge-add-plugin/ # 供 npx skills 发现的可分发 skill ├── tests/ │ └── fixtures/ # 单元、集成、边界与发布测试夹具 ├── tools/ │ └── profile-toolchain/ # resolve、verify、catalog、SBOM 与 CLI ├── website/ │ ├── .vitepress/ # VitePress 配置 │ └── docs.ts # 文档投影与站点导航 ├── distribution.yml # 发行版身份、默认 profile 与平台声明 ├── package.json # workspace 依赖、命令与构建入口 └── pnpm-workspace.yaml # workspace 范围与允许的构建脚本

📚 文档导航

公开文档地图见 docs/README.zh.md。架构归属 docs/design/dsh-forge.zh.md,稳定配置和 service 事实归属 docs/reference/foundation-contracts.zh.md,源/产物与恢复边界归属 docs/engineering/foundation-boundaries.zh.md。
profile 编译器见 tools/profile-toolchain/README.zh.md。

每篇公开页面都由英文 foo.md、中文 foo.zh.md 和 foo.i18n.yaml hash 记录组成。
双语治理规则见 docs/i18n/README.md。

⭐ Star 历史
预览分享卡片长什么样 ↓ptonlix/dsh-forge
分享 · DeepSeek Harness Hub
ptonlix/dsh-forge

围绕 DeepSeek Harness(DSH)打造可审计的桌面发行版。

回到顶部