@burdenoff/desktop-shell

中文文档
2026.1107.1发布于 2026/11/07UNLICENSEDTypeScriptCommonJS近 30 天下载 8178

共享 Electron 主进程 + Burdenoff 产品app shells的预装运行时间(Tray,本地菜单,窗口状态,通知,徽章,主题同步,自动更新 UX,深层链接).

中文使用文档
文档目录18 节
  1. 此修正的两个错误
  2. 安装到 shell 中
  3. 渲染器表面
  4. 桌面焦点模式( E) focusMode: true (中文(简体) )
  5. 桌面闲置检测( E) idleDetection: true (中文(简体) )
  6. 内容安全政策
  7. CLI 参考
  8. stage
  9. launch
  10. smoke
  11. icons
  12. doctor
  13. 配置合同
  14. 环境
  15. 电子建构器配置
  16. 释放流量
  17. 移徙清单
  18. 开发此软件包

@ taffleoff/ desktop- shell (简体中文)

共享 Electron 运行时间和在每个 Burdenoff 桌面应用程序后面构建工具 shell——托盘,本地菜单,窗口状态,通知,徽章,主题同步, 自动更新 UX 和深层链接在一个软件包中,加 burdenoff-desktop 国 际 阶段、发射、烟雾测试和核验.

在此包裹之前, ~40 个应用弹壳中每个都携带自己的 30 kB electron/main.cjs本身 scripts/prepare-electron.mjs,以及它自己的副本 (单位:千美元) "build" 块中 package.json他们漂了,漂了.

此修正的两个错误

1. 包装的应用程序未发运 node_modules。 。 。 . directories.app 指针 electron/build/app,一个舞台脚本文件夹 装入了网页和两个 .cjs 文档 - 其它没有。 内部 包裹的灰烬, require('electron-updater') 财务报告和审定财务报表 require('@capgo/electron-updater') 因此,在启动时就抛出。 两者都是 包起来 try/catch,所以每个释放的安装器看起来健康,同时 自动更新和CapGo OTA无声地死去。 。 。 .

burdenoff-desktop stage 现在 捆绑 electron/main.cjs 与 bun build --target=node --format=cjs --external electron内衬 @burdenoff/desktop-shell 财务报告和审定财务报表 electron-updater,然后声明输出 包含没有纯更新导入。 CapGo 已经嵌入到已发布中 桌面 shell 捆绑一个拒绝并联的流取器,路径 越狱和超规模的档案。 一个仍然需要的舞台应用 node_modules 失败 .

2. 沙盒预装不能 require 队长Go. 仅解决预装的沙盒 electron 和几块活字 任意 npm require 预装是困难的失败,所以制造桥从不 出现。 预装货是用同样的方式捆绑的,并且针对一个明确的 允许列表( e)electron, (中文(简体) ), events, (中文(简体) ), timers, (中文(简体) ), url) (中文(简体) ).

两种说法都存在 stage,在这个repo's scripts/verify-bundle.ts,以及 作为发布工作流程中的"short splated bund"步骤.

第三只更安静的虫子:40发炮弹中有38发 默认电子图标, (中文(简体) ), 因为旧舞台剧本已经复制 build/icon.png 只有发生 已存在. stage 现在明确解决图标 失败 当没有 平方 PNG 至少为 512px.

安装到 shell 中

四个包装文件,一个配置切片,一个包. json delta:

electron/main.cjs             require('@burdenoff/desktop-shell/main').createDesktopApp(require('./desktop.config.cjs'));
electron/preload.cjs          require('@burdenoff/desktop-shell/preload').installPreload(require('./desktop.config.cjs'));
electron/desktop.config.cjs   module.exports = require('../native.config.json').desktop ?? require('../native.config.json');
electron-builder.config.cjs   module.exports = require('@burdenoff/desktop-shell/builder').createElectronBuilderConfig(require('./electron/desktop.config.cjs'));
{
  "main": "electron/main.cjs",
  "dependencies": { "@burdenoff/desktop-shell": "<CalVer>" },
  "devDependencies": {
    "electron": "^43.4.1",
    "electron-builder": "^26.0.12",
    "playwright-core": "^1.50.0"   // drives `burdenoff-desktop smoke`
  }
}

从外壳中移除: "build" 键, electron-updater, (中文(简体) ), @capgo/electron-updater, (中文(简体) ), @capacitor-community/electron, (中文(简体) ), scripts/prepare-electron.mjs, (中文(简体) ), scripts/electron-launch.mjs, (中文(简体) ), scripts/electron-before-build.cjs, (中文(简体) ), src/electronRuntime.ts。 。 。 .

分类脚本、模板和每个 {{TOKEN}} 发电机 替代品 : templates/README.md。 。 。 .

校验 bunx burdenoff-desktop doctor - 它必须离开0.

渲染器表面

制造器被视为不可信:它运行共享的MFE捆绑,在 生产,任何网络捆绑 CAPGO OTA 活动。 它所能达到的:

全球目录
window.__burdenoffDesktop桌面桥(BurdenoffDesktopBridge 内 src/shared/types.ts(中文(简体) )
window.<product>Electron遗留子集; legacyGlobal: false 移除它
window.electronUpdaternotifyAppReady() 仅限

每个 ipcMain 输入点检查调用框架是否在应用程序源头上 (或dev服务器)在演艺前. OTA 捆绑选择——下载,激活, 重置、频道和端点变化——只在主要过程中发生 CapGo软件包自有的渲染器API和IPC处理器没有被安装. 这个 渲染器的单个OTA输入是应用准备的信号,两者都 __burdenoffDesktop.notifyAppReady() 财务报告和审定财务报表 electronUpdater.notifyAppReady() 发送 IPC.appReady,而主要进程向 CapGo 推进 运行的捆绑是保存而不是回滚.

桌面焦点模式( E)focusMode: true(中文(简体) )

有重点会议(TimeCampus)的产品可以打开 window.__burdenoffDesktop.focus。显示器,它持有用户的 届会、电话 focus.setState({ active, sessionId, endsAt, strict, blockedApps, doNotDisturb, trackAppSwitches }) 每隔几秒钟 会话运行;然后主进程:

  • 打开操作系统不扰动模式,然后恢复,除非它 是那个打开的 macOS 没有公共焦点 API, 因此运行 两个用户创建的快捷键("焦点打开"/"焦点关闭"); 2; GNOME 应用 gsettings (单位:千美元)show-banners); Windows 没有支持的 API,所以 状态为 unsupported 附有说明;
  • 样本前景应用程序(macOS) osascript + 系统事件,需要 自动化权限; Windows PowerShell + user32; Linux X11 xdotool, (中文(简体) ), Wayland 不支持). 切换到被屏蔽的应用程序会被严格隐藏 课程或对标准课程的警告,并通过 focus.onBlockedApp; 与 trackAppSwitches 每一个完成的前景 长度报告通过 focus.onAppSegment· ;
  • 如果渲染器停止刷新5个, 将再次关闭所有设备 几分钟后,一个坠毁或被记录下来的 渲染器从不离开 应用程序隐藏或 通知已变音.

focus.getStatus() 编号 : focus.onStatus() 报告实际效果 机器(on, (中文(简体) ), needs-setup, (中文(简体) ), unsupported, (中文(简体) ), error与人可读 detail。所有帮助者都会通过 execFile 带有参数数组和 a 超时; 没有渲染器字符串到达外壳或脚本正文 .

桌面闲置检测( E)idleDetection: true(中文(简体) )

自动捕获(TimeCampus)的产品可打开 window.__burdenoffDesktop.idle。渲染器调用 idle.configure({ enabled, thresholdSeconds }) 使用用户的设置 (阈值被夹到 60.3600秒);然后是主要过程 powerMonitor.getSystemIdleTime() (门槛的每个季度,最多 每15秒)并收听屏幕锁定,解锁,暂停并恢复.

每个完成的拉伸 人离开他们的最后键盘或 鼠标输入其之后的第一个输入(或解锁/恢复),是 通过报告 idle.onIdlePeriod({ startedAt, endedAt, reason }) 与 reason inactive, (中文(简体) ), locked 或者说 suspended。伸展比 阈值从未报告, 关闭检测会打开 伸缩. idle.getStatus() 编号 : idle.onStatus() 报告该人是否 现在,以及这个操作系统是否能够报告输入不活动 (单位:千美元)supported) (中文(简体) ). 显示器只读取上次输入后的秒; 它 永远也看不到哪个键被按住或者指针去了哪里.

内容安全政策

每个 HTML 文档 <scheme>://app 协议服务(内置捆绑, a OTA捆绑,和SPA倒置) 包含两种政策,由 src/main/csp.ts 从运行时间配置 :

页眉政策
Content-Security-Policyobject-src 'none'; base-uri 'none'; frame-ancestors 'self'
Content-Security-Policy-Report-Only全面目标政策: 'self',网关来源(https + wss),SSO来源,以及第三方共享的 MFE 负载(Stripe.js, Razorpay Checkout; 软件包-CDN样式表和字体). 图像和媒体可能来自任何 https 主机

仅报告违规情况不会封锁任何东西;主要进程记录每个 独立([burdenoff-desktop:<product>:csp]),所以包件构建没有 DevTools还给他们看。 目标中故意不包含软件包 CDN script-src:从中装入的脚本被报告,应当与 应用程序之前 script-src 进入强制政策. frame-ancestors 实值 'self'没有 'none',因此应用程序仍然可以设定自己的文档 smoke 命令检查信头和一个同源的iframe.

CLI 参考

burdenoff-desktop <command> [options]
  -h, --help       this help (or `<command> --help`)
  -v, --version    package version

stage

构建 electron/build/app ——文件夹电子-构建器包. 替换 scripts/prepare-electron.mjs。 。 。 .

选项默认含义
--root <dir>数据贝壳根
--env <name>$BURDENOFF_DESKTOP_ENVlocal | alpha | prod (单位:千美元)staging编号 :production 已接受)
--web-dist <dir>dist要复制的网页构建
--deps-mode <mode>bundlebundle 内入每个依赖; install 写入 dependencies 进入舞台 package.json 运行 bun install --production --ignore-scripts 里面(有记录的倒地,为真正无法分解的本地模块)
--launch关运行 launch 后来

它: 读取配置 解析图标( 如果缺少则失败) 擦去 electron/build/app * 复制网页内容 * 捆绑 main.cjs + 键 preload.cjs 写道: electron/runtime-config.json (单位:千美元) 无依赖性 package.json + 阶段图标+应享待遇 + 在macOS上 重命名 dev 副本 Electron.app (PlistBuddy + 临时代号) 所以码头 图标和菜单标题是产品的.

launch

burdenoff-desktop launch [--root <dir>] [--env <name>] [-- <electron args>]

将本地的Electron在舞台应用上相接而来 每个 BURDENOFF_DESKTOP_* 变量( 遗留 <PREFIX>_ELECTRON_* 值为 常态化为克能克名先行). 在macOS上,它更喜欢重命名 electron/build/<ProductName>.app替换 scripts/electron-launch.mjs。 。 。 .

命令行没有通过运行时配置参数 : RUNTIME_ARG_PREFIX 是主 + 预装通道( URI- encoded JSON by additionalArguments, (中文(简体) ), 与 cfAccess (被剥去). 主读舞台 runtime-config.json 本身, 财务报告和审定财务报表 BURDENOFF_DESKTOP_* 超过它.

smoke

burdenoff-desktop smoke [--root <dir>] [--packaged <dir>] [--timeout <ms>] [--screenshot <path>] [--no-tray] [--allow-missing-driver]

推出相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相相接相接相接相接相接相接相接相接相接相接相接相相接相接相相相相相相相接相相. electron/dist/linux-unpacked)通过 playwright-core电子驱动器 BURDENOFF_DESKTOP_SMOKE=1 并声称:

检查请求
window第一个窗口打开
title等于 productName
bridgewindow.__burdenoffDesktop.product.id 等于 product
diagnosticsglobalThis.__burdenoffDesktopDiagnostics 已发布
protocolprotocolRegistered
menumenu
traytray (轻轻地) --no-tray ——无头 CI 没有托盘主机)
deep-linkapp.emit('open-url', …, '<scheme>://app/smoke') 到达渲染器
updater-surfacewindow.electronUpdater 曝光情况 notifyAppReady 没有别的了
csp应用文档带有强制基线和只报告的政策(退出应用协议)
csp-frame应用程序文档的同源 iframe 还装入
updater 编号 : capgo 编号 : webRoot未报告

写作 electron/dist/smoke/window.png 并打印表格;以非零键退出 关于失败的可读报告。 运行在下面 xvfb-run 在 Linux 上。 无 playwright-core 其出口为 1 或 0 --allow-missing-driver。 。 。 .

icons

burdenoff-desktop icons [--root <dir>] [--check]

物质 electron/build/icons/ (电子建筑师 buildResources: icon.png 从 iconSource → public/icons/icon-512x512.png → public/icons/icon-512.png → electron/icon.png → build/icon.png附加时 entitlements.mac.plist 从这个包裹. --check 只有报告. 电子建设器 .icns编号 :.ico 从PNG,所以没有图像库 参与.

doctor

burdenoff-desktop doctor [--root <dir>] [--json]

只读验证外壳——配置有效性(每个问题都报告,而不是) 只是第一个,薄薄的包装, electron-builder.config.cjs,可解的图标, 需要/禁止依赖性、教条脚本、遗留文件 删除 "build" 键。 打印表格; --json 发射 { root, product, ok, checks: [{ id, status, summary, problems }] } 联 合 国 舰队核查员。 1号出口,任何故障.

预期的软件包. json delta 是从这个软件包读取的 templates/package-scripts.json,所以迁移模板和验证人 永远无法漂移.

配置合同

src/shared/types.ts 是权威的。 外壳的桌面切片 native.config.json数字 :

{
  "desktop": {
    "product": "vibecontrols",              // slug: Linux executableName, staged package name
    "productName": "VibeControls",          // window title, tray, installer, artifact names
    "appId": "com.vibecontrols.www",        // NEVER rewrite — updater identity + Windows AUMID
    "capgoAppId": "com.vibecontrols.desktop", // omit to disable CapGo OTA
    "scheme": "vibecontrols",               // deep links + Linux MimeType
    "domain": "vibecontrols.com",           // app origins + update feeds
    "devServerPort": 5200,
    "envPrefix": "VIBE",                    // legacy VIBE_ELECTRON_* fallback ("VIBE_ELECTRON" also accepted)
    "appOrigins": { "prod": "https://admin.burdenoff.com" }, // optional override
    "category": { "mac": "public.app-category.developer-tools", "linux": "Development" },
    "links": { "docs": "…", "support": "…", "status": "…" },
    "window": { "width": 1440, "height": 900, "minWidth": 960, "minHeight": 600 },
    "closeToTray": { "win32": true, "linux": false },
    "iconSource": "public/icons/icon-512x512.png",
    "maintainer": "Name <email>",
    "legacyGlobal": true,
    "focusMode": false,                     // true exposes __burdenoffDesktop.focus (see below)
    "idleDetection": false                  // true exposes __burdenoffDesktop.idle (see below)
  }
}

electron/desktop.config.cjs 还被接受为来源并优先.

环境

每个变量都是 BURDENOFF_DESKTOP_<KEY>背负遗产 <envPrefix>_ELECTRON_<KEY> 所以没有移动的贝壳和工作流程继续工作:

变量效果
ENVlocal | alpha | prod
VERSION卡尔维尔烤入舞台 package.json
START_URLdev- server 来源于窗口负载
UPDATE_FEED_URL覆盖生成的电子更新种子
GLOBAL_BASE_URL 编号 : WORKSPACE_BASE_URL 编号 : PUBLIC_STORE_BASE_URL网关覆盖
CF_ACCESS_CLIENT_ID 编号 : CF_ACCESS_CLIENT_SECRET只有α ——被烤入电子更新器可以到达Access-gated alpha下载主机
DEVTOOLS启动时打开桌面

默认来源 domain: prod 种子 https://<domain>/downloads/latest, (中文(简体) ), 阿尔法种子 https://alphadownloads.<domain>/downloads/latest,应用程序来源 https://app.<domain> 编号 : https://alphaapp.<domain>。 。 。 .

CF 访问证书被烤入 仅构建α 拥有一个α 二进制意味着加入团队. 他们从来没有被写成一个专业或本地 建立,而CLI在每一个日志行中都进行编辑.

电子建构器配置

createElectronBuilderConfig(config, overrides?) 获得整个 配置 。 和旧的手工复制品一样 "build" 块 (附录+deb x64, 通用 dmg + zip, NSIS x64, asar,, ), ${productName}-${version}-${arch}.${ext}),随舰队修正:

  • directories.buildResources 实值 electron/build/icons, (中文(简体) ), 没有 build/ —— 说 多个贝壳生成 build/i18n-bundle.json 那边;
  • 链接 .desktop 获得 MimeType=x-scheme-handler/<scheme>; - 没有它深 链接在 Linux 上保持沉默;
  • npmRebuild: false 替换旧的 beforeBuild: () => false 黑客攻击;
  • 硬化运行时间, gatekeeperAssess: false权利,以及 notarize: false ——公证是明示的 xcrun notarytool CI步骤如此 苹果的证书上永远没有障碍;
  • 没有 publish 键:发布工作流程同步到S3本身.

appId 通过逐字记录。 贝壳不同(com.burdenoff.<p> 对 com.<p>.www)并重写每个安装的用户的应用程序数据和 打破更新器.

释放流量

bun run electron:build:<env> → burdenoff-desktop stage - 主张已定 捆 * electron-builder --config electron-builder.config.cjs 签了字 s3 云纹无效.

templates/workflows/release-electron.yml 是峡谷管道 (单位:千美元)workflow_dispatch 与 platforms编号 :channel编号 :version编号 :dry_run编号 :mark_latest: (单位:千美元) validate-inputs 任务/ 其它工作取决于( CalVer) version时,已知 选择值,无秘密),a capgo-ota 工作(仅生产 electron-production从完整性锁定的CLI .github/tools/capgo-cli, (中文(简体) ), linux 编号 : macos (单位:千美元)macos-15) (中文(简体) ) windows 构建 任务,以及 a publish 任务上传 downloads/<ver>/<os>/,镜像 downloads/latest/<os>/ 带有稳定的未变相别名 自动更新器种子( e)latest-mac.yml, (中文(简体) ), latest.yml, (中文(简体) ), latest-linux.yml 加减 安装器,它们的名字) downloads/latest/ 其中电子更新器 generic 提供者寻找, 写入 manifest.json (建造与 jq)并作废云花. macOS 标志 CSC_LINK 和通过公证工具进行公证/安装; Windows 标志 azure/artifact-signing-action (v2.0.0) 接着 重新计算 latest.yml 长沙512/大小,因为签名会在二进制后重写 电子建构器将其散开,电子更新器将拒绝 下载。 安装为 --frozen-lockfile第三方行动以SHA为支柱, 而发送输入仅通过 env: 看到了吗 templates/README.md。 。 。 .

templates/workflows/native-smoke.yml 是 ~6分钟的路径过滤式 PR 守护 : 安装 / 医生 / 建造 / 阶段 / electron-builder --dir --linux → xvfb-run burdenoff-desktop smoke --packaged ——截图文物.

移徙清单

  1. 添加数据 desktop 切为 native.config.json。 。 。 .
  2. 邮票 electron/main.cjs, (中文(简体) ), electron/preload.cjs, (中文(简体) ), electron/desktop.config.cjs, (中文(简体) ), electron-builder.config.cjs。 。 。 .
  3. 应用 templates/package-scripts.json (合并数) scripts/deps, 应用 remove) (中文(简体) ).
  4. 删除 scripts/prepare-electron.mjs, (中文(简体) ), scripts/electron-launch.mjs, (中文(简体) ), scripts/electron-before-build.cjs, (中文(简体) ), src/electronRuntime.ts,则 "build" 键.
  5. 确保 PNG 的正方形存在 :public/icons/icon-512x512.png) (中文(简体) ).
  6. 印出两个工作流程.
  7. bun install && bunx burdenoff-desktop doctor - 必须离开0.
  8. bun run electron:run:local ——窗口,托盘,菜单,深链接.
  9. bunx burdenoff-desktop smoke (编) --no-tray 在无头的Linux.
  10. 释放干运行 : Release Electron 与 dry_run=true。 。 。 .

开发此软件包

bun install
bun run sanity        # lint + format + type:check + test + build
bun run build         # dist/{main,preload,builder,config,cli}.cjs + d.ts
bun run scripts/verify-bundle.ts

test/fixture-shell/ 是用于 .github/workflows/smoke.yml 锻炼 doctor, (中文(简体) ), icons, (中文(简体) ), stage 财务报告和审定财务报表 smoke 结束而不依赖 在产品回收.

许可证:专有——包德诺夫咨询服务有限公司.

版本与发布记录

@burdenoff/desktop-shell 共发布 22 个版本,首次发布于 2026/08/23;过去 12 个月发布了 22 个版本。

版本发布日期距今
2026.1107.1latest2026/11/071 天前
2026.1102.12026/11/035 天前
2026.1031.12026/11/018 天前
2026.1028.32026/10/2811 天前
2026.1028.22026/10/2811 天前
2026.1028.12026/10/2811 天前

关于 @burdenoff/desktop-shell 的常见问题

@burdenoff/desktop-shell 是什么?

共享 Electron 主进程 + Burdenoff 产品app shells的预装运行时间(Tray,本地菜单,窗口状态,通知,徽章,主题同步,自动更新 UX,深层链接).

如何安装 @burdenoff/desktop-shell?

在项目目录运行 npm install @burdenoff/desktop-shell,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:electron(>=39 <45)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。它还提供命令行工具 burdenoff-desktop,可以用 npx burdenoff-desktop 直接运行。

@burdenoff/desktop-shell 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@burdenoff/desktop-shell 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@burdenoff/desktop-shell 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@burdenoff/desktop-shell 可以商用吗?

@burdenoff/desktop-shell 使用 UNLICENSED 许可。作者声明为 UNLICENSED,即不授予公开使用许可(与公共领域的 Unlicense 不同)。使用前需获得作者授权。以上为概括,不构成法律意见,请以许可原文为准。

@burdenoff/desktop-shell 的下载量有多少?

根据 npm 官方下载统计,@burdenoff/desktop-shell 在 2026/10/09 – 2026/11/07 这 30 天内被下载 8,178 次,日均约 273 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@burdenoff/desktop-shell 还在维护吗?

最新版本 2026.1107.1 发布于 2026/11/07(1 天前);至今共发布 22 个版本,其中过去 12 个月发布了 22 个;首次发布于 2026/08/23。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。