@omega.js/desktop 0.50.0 → 0.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/README.md +1 -1
  2. package/dist/assets/css/tokens/_index.scss +1 -1
  3. package/dist/assets/themes/base/_includes/frontend/sections/account-section-header.html +4 -1
  4. package/dist/assets/themes/base/_includes/frontend/sections/footer.html +13 -6
  5. package/dist/assets/themes/base/_includes/frontend/sections/nav.html +10 -8
  6. package/dist/assets/themes/base/_includes/global/sections/account.html +3 -1
  7. package/dist/assets/themes/base/_includes/global/sections/app-sidebar.html +12 -8
  8. package/dist/assets/themes/base/_includes/global/sections/app-topbar.html +10 -6
  9. package/dist/assets/themes/base/_includes/global/sections/page-header.html +8 -4
  10. package/dist/assets/themes/base/_layouts/backend/pages/dashboard/index.html +24 -24
  11. package/dist/assets/themes/base/_layouts/frontend/pages/about.html +10 -10
  12. package/dist/assets/themes/base/_layouts/frontend/pages/account/index.html +35 -35
  13. package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/index.html +4 -4
  14. package/dist/assets/themes/base/_layouts/frontend/pages/auth/signin.html +1 -1
  15. package/dist/assets/themes/base/_layouts/frontend/pages/auth/signup.html +4 -4
  16. package/dist/assets/themes/base/_layouts/frontend/pages/contact.html +3 -3
  17. package/dist/assets/themes/base/_layouts/frontend/pages/download.html +34 -33
  18. package/dist/assets/themes/base/_layouts/frontend/pages/extension/index.html +11 -11
  19. package/dist/assets/themes/base/_layouts/frontend/pages/legal/document.html +1 -1
  20. package/dist/assets/themes/base/_layouts/frontend/pages/status.html +1 -1
  21. package/dist/assets/themes/base/_layouts/frontend/pages/team/index.html +9 -7
  22. package/dist/assets/themes/base/_layouts/frontend/pages/team/member.html +5 -3
  23. package/dist/assets/themes/base/_sections/about/letter/section.html +1 -1
  24. package/dist/assets/themes/base/_sections/about/letter/section.json5 +4 -4
  25. package/dist/assets/themes/base/_sections/marketing/bento/section.html +1 -1
  26. package/dist/assets/themes/base/_sections/marketing/bento/section.json5 +15 -15
  27. package/dist/assets/themes/base/_sections/marketing/cta/section.json5 +1 -1
  28. package/dist/assets/themes/base/_sections/marketing/hero/section.html +6 -6
  29. package/dist/assets/themes/base/_sections/marketing/hero/section.json5 +10 -10
  30. package/dist/assets/themes/base/_sections/marketing/product-demo/section.html +1 -1
  31. package/dist/assets/themes/base/_sections/marketing/product-demo/section.json5 +2 -2
  32. package/dist/assets/themes/base/_sections/marketing/stats/section.html +1 -1
  33. package/dist/assets/themes/base/_sections/marketing/stats/section.json5 +5 -5
  34. package/dist/assets/themes/base/_sections/marketing/trusted-by/section.html +1 -1
  35. package/dist/assets/themes/base/_sections/marketing/trusted-by/section.json5 +2 -2
  36. package/dist/assets/themes/neobrutalism/_layouts/frontend/pages/index.html +10 -10
  37. package/dist/assets/themes/newsflash/_layouts/frontend/pages/index.html +10 -10
  38. package/dist/assets/themes/newsflash/_sections/marketing/desks/section.html +2 -2
  39. package/dist/assets/themes/newsflash/_sections/marketing/desks/section.json5 +4 -4
  40. package/dist/build.js +69 -28
  41. package/dist/cli-run.js +20 -13
  42. package/dist/cli.js +12 -7
  43. package/dist/commands/build.js +0 -2
  44. package/dist/commands/deploy.js +116 -44
  45. package/dist/commands/finalize-release.js +5 -4
  46. package/dist/commands/launch.js +12 -7
  47. package/dist/commands/lib/deploy-precheck.js +66 -34
  48. package/dist/commands/lib/ensure-target.js +71 -11
  49. package/dist/commands/package.js +0 -1
  50. package/dist/commands/publish.js +11 -4
  51. package/dist/commands/release.js +99 -252
  52. package/dist/commands/runner.js +42 -5
  53. package/dist/commands/sign-windows.js +46 -15
  54. package/dist/commands/test.js +4 -3
  55. package/dist/commands/validate-certs.js +291 -115
  56. package/dist/config/page-template.html +4 -0
  57. package/dist/defaults/.github/workflows/build.yml +144 -64
  58. package/dist/defaults/AGENTS.md +3 -2
  59. package/dist/defaults/_.gitignore +4 -2
  60. package/dist/defaults/config/certs/README.md +25 -45
  61. package/dist/defaults/config/omega.json5 +66 -32
  62. package/dist/defaults/hooks/deploy/pre.js +10 -0
  63. package/dist/defaults/src/assets/scss/main.scss +12 -2
  64. package/dist/defaults/src/integrations/tray/index.js +1 -1
  65. package/dist/gulp/main.js +13 -25
  66. package/dist/gulp/tasks/audit.js +18 -6
  67. package/dist/gulp/tasks/build-config.js +181 -60
  68. package/dist/gulp/tasks/bundle.js +108 -36
  69. package/dist/gulp/tasks/release.js +86 -4
  70. package/dist/gulp/tasks/sass.js +11 -0
  71. package/dist/hooks/lib/notarize-tools.js +137 -0
  72. package/dist/hooks/notarize-artifacts.js +57 -0
  73. package/dist/hooks/notarize.js +59 -8
  74. package/dist/lib/auth-persistence.js +25 -0
  75. package/dist/lib/client-bridge.js +11 -8
  76. package/dist/lib/deep-link.js +15 -8
  77. package/dist/lib/protocol.js +7 -1
  78. package/dist/lib/restart-manager/install.js +6 -3
  79. package/dist/lib/sign-helpers/auto-unlock.js +65 -27
  80. package/dist/lib/sign-helpers/console-lock.js +34 -0
  81. package/dist/lib/sign-helpers/exec-with-limit.js +68 -0
  82. package/dist/lib/sign-helpers/resolve-icons.js +6 -4
  83. package/dist/lib/tray.js +7 -6
  84. package/dist/main.js +16 -0
  85. package/dist/preload.js +8 -0
  86. package/dist/renderer.js +16 -4
  87. package/dist/runner/job-started.js +104 -0
  88. package/dist/test/fixtures/consumer-app/config/omega.json5 +7 -0
  89. package/dist/test/fixtures/consumer-app/package.json +1 -1
  90. package/dist/test/fixtures/consumer-app/src/assets/js/components/main/index.js +7 -1
  91. package/dist/test/harness/main-entry.js +2 -1
  92. package/dist/test/harness/renderer-preload.js +12 -3
  93. package/dist/test/runners/boot.js +101 -11
  94. package/dist/test/runners/electron.js +1 -1
  95. package/dist/test/suites/boot/consumer-app-boots.test.js +54 -0
  96. package/dist/test/suites/build/audit.test.js +45 -6
  97. package/dist/test/suites/build/auth-persistence-resolve.test.js +119 -0
  98. package/dist/test/suites/build/auto-unlock.test.js +105 -0
  99. package/dist/test/suites/build/boot-runner-timeout.test.js +253 -0
  100. package/dist/test/suites/build/brand-scss.test.js +106 -0
  101. package/dist/test/suites/build/build-config.test.js +146 -36
  102. package/dist/test/suites/build/build-json-bake.test.js +245 -0
  103. package/dist/test/suites/build/build-verbs.test.js +48 -15
  104. package/dist/test/suites/build/build-workflow-jobs.test.js +190 -0
  105. package/dist/test/suites/build/cli.test.js +32 -10
  106. package/dist/test/suites/build/config-schema.test.js +4 -4
  107. package/dist/test/suites/build/console-lock.test.js +51 -0
  108. package/dist/test/suites/build/defaults-scaffold.test.js +71 -2
  109. package/dist/test/suites/build/deploy-direct.test.js +241 -0
  110. package/dist/test/suites/build/deploy-dispatch.test.js +287 -0
  111. package/dist/test/suites/build/deploy-hook.test.js +169 -0
  112. package/dist/test/suites/build/ensure-target.test.js +14 -2
  113. package/dist/test/suites/build/env-delivery.test.js +19 -10
  114. package/dist/test/suites/build/env-watch.test.js +18 -7
  115. package/dist/test/suites/build/esm-only-dependency.test.js +127 -0
  116. package/dist/test/suites/build/exec-with-limit.test.js +53 -0
  117. package/dist/test/suites/build/finalize-release.test.js +2 -2
  118. package/dist/test/suites/build/get-config.test.js +120 -8
  119. package/dist/test/suites/build/github-utils.test.js +12 -6
  120. package/dist/test/suites/build/license-stamp.test.js +6 -4
  121. package/dist/test/suites/build/manager.test.js +88 -68
  122. package/dist/test/suites/build/manifest-deps.test.js +116 -0
  123. package/dist/test/suites/build/merge-line-files.test.js +27 -4
  124. package/dist/test/suites/build/notarize-artifacts.test.js +135 -0
  125. package/dist/test/suites/build/notarize-tools.test.js +38 -0
  126. package/dist/test/suites/build/notarize.test.js +207 -0
  127. package/dist/test/suites/build/release-pipeline.test.js +38 -60
  128. package/dist/test/suites/build/release-skipped-upload.test.js +107 -0
  129. package/dist/test/suites/build/resolve-icons.test.js +35 -35
  130. package/dist/test/suites/build/runner-job-guard.test.js +182 -0
  131. package/dist/test/suites/build/runner.test.js +25 -2
  132. package/dist/test/suites/build/sentry.test.js +8 -3
  133. package/dist/test/suites/build/setup-scripts.test.js +3 -0
  134. package/dist/test/suites/build/sign-windows.test.js +92 -8
  135. package/dist/test/suites/build/test-stealth.test.js +17 -11
  136. package/dist/test/suites/build/url-helpers.test.js +37 -17
  137. package/dist/test/suites/build/validate-certs.test.js +428 -55
  138. package/dist/test/suites/build/validate-config.test.js +3 -3
  139. package/dist/test/suites/main/auth-flow.test.js +12 -0
  140. package/dist/test/suites/main/auth-persistence.test.js +14 -17
  141. package/dist/test/suites/main/auto-updater.test.js +2 -2
  142. package/dist/test/suites/main/boot-sequence.test.js +1 -1
  143. package/dist/test/suites/main/client-bridge.integration.test.js +5 -82
  144. package/dist/test/suites/main/client-bridge.test.js +19 -6
  145. package/dist/test/suites/main/deep-link.test.js +54 -0
  146. package/dist/test/suites/main/startup-paths-and-ua.test.js +1 -1
  147. package/dist/test/suites/main/url-helpers.test.js +81 -72
  148. package/dist/test/suites/renderer/cross-context-helpers.test.js +19 -16
  149. package/dist/utils/build-pipeline.js +10 -10
  150. package/dist/utils/github.js +12 -51
  151. package/dist/utils/load-env.js +66 -0
  152. package/dist/utils/mode-helpers.js +43 -111
  153. package/dist/utils/platform.js +37 -0
  154. package/dist/utils/runner-env.js +2 -1
  155. package/dist/utils/runner-job-guard.js +149 -0
  156. package/dist/utils/ship-keys.js +52 -0
  157. package/dist/utils/test-stealth.js +5 -3
  158. package/dist/utils/url-helpers.js +33 -17
  159. package/dist/vendor/config/bundle-id.js +53 -0
  160. package/dist/vendor/config/client-config.js +141 -0
  161. package/dist/vendor/config/company.js +334 -15
  162. package/dist/vendor/config/dev-facts.js +48 -0
  163. package/dist/vendor/config/env-delivery.js +231 -9
  164. package/dist/vendor/config/env-retired.js +137 -0
  165. package/dist/vendor/config/env-rules.js +22 -3
  166. package/dist/vendor/config/env-schema.js +234 -117
  167. package/dist/vendor/config/env.js +55 -26
  168. package/dist/vendor/config/environment.js +189 -0
  169. package/dist/vendor/config/hooks.js +13 -11
  170. package/dist/vendor/config/index.js +121 -44
  171. package/dist/vendor/config/load.js +366 -115
  172. package/dist/vendor/config/merge.js +2 -2
  173. package/dist/vendor/config/order.js +3 -3
  174. package/dist/vendor/config/platforms.js +276 -0
  175. package/dist/vendor/config/repo.js +226 -104
  176. package/dist/vendor/config/retired-keys.js +232 -27
  177. package/dist/vendor/config/schema.js +525 -99
  178. package/dist/vendor/config/site-global.js +63 -53
  179. package/dist/vendor/config/targets.js +187 -0
  180. package/dist/vendor/config/validate.js +119 -59
  181. package/dist/vendor/devkit/argv.js +118 -0
  182. package/dist/vendor/devkit/attach-log-file.js +21 -13
  183. package/dist/vendor/devkit/brand-tokens.js +278 -0
  184. package/dist/vendor/devkit/brand-version.js +264 -0
  185. package/dist/vendor/devkit/build-json.js +91 -0
  186. package/dist/vendor/devkit/bundle.js +48 -0
  187. package/dist/vendor/devkit/certificate-expiry.js +108 -0
  188. package/dist/vendor/devkit/certs.js +16 -194
  189. package/dist/vendor/devkit/ci-workflows.js +124 -8
  190. package/dist/vendor/devkit/cli-router.js +3 -3
  191. package/dist/vendor/devkit/defaults-engine.js +69 -7
  192. package/dist/vendor/devkit/deploy-follow.js +297 -0
  193. package/dist/vendor/devkit/deploy-precheck.js +23 -8
  194. package/dist/vendor/devkit/deploy-record.js +11 -27
  195. package/dist/vendor/devkit/deploy-snapshot.js +661 -0
  196. package/dist/vendor/devkit/deploy.js +445 -75
  197. package/dist/vendor/devkit/git-auth.js +73 -0
  198. package/dist/vendor/devkit/git-remote.js +95 -0
  199. package/dist/vendor/devkit/github-repo.js +290 -0
  200. package/dist/vendor/devkit/local.js +47 -0
  201. package/dist/vendor/devkit/merge-line-files.js +23 -16
  202. package/dist/vendor/devkit/omega-bin.js +18 -3
  203. package/dist/vendor/devkit/pack-local.js +391 -0
  204. package/dist/vendor/devkit/preludes/index.js +120 -0
  205. package/dist/vendor/devkit/preludes/origin-heal.js +156 -0
  206. package/dist/vendor/devkit/service-account.js +43 -0
  207. package/dist/vendor/devkit/ship-plan.js +112 -0
  208. package/dist/vendor/devkit/signing-env.js +180 -0
  209. package/dist/vendor/devkit/signing-tree.js +92 -0
  210. package/dist/vendor/devkit/target-seams.js +142 -0
  211. package/dist/vendor/devkit/target-secrets.js +235 -50
  212. package/dist/vendor/devkit/test/esm-only-fixture.js +48 -0
  213. package/dist/vendor/devkit/test/fixtures/esm-only-package/browser.js +19 -0
  214. package/dist/vendor/devkit/test/fixtures/esm-only-package/index.js +20 -0
  215. package/dist/vendor/devkit/test/fixtures/esm-only-package/package.json +13 -0
  216. package/dist/vendor/monitoring/env.js +20 -10
  217. package/dist/vendor/monitoring/main.js +1 -1
  218. package/dist/vendor/monitoring/preload.js +1 -1
  219. package/dist/vendor/monitoring/renderer.js +1 -1
  220. package/docs/analytics.md +1 -1
  221. package/docs/auto-updater.md +5 -5
  222. package/docs/boot-sequence.md +1 -1
  223. package/docs/build-system.md +15 -7
  224. package/docs/client-bridge.md +9 -7
  225. package/docs/config-schema.md +4 -4
  226. package/docs/css.md +8 -2
  227. package/docs/deep-link.md +12 -4
  228. package/docs/environment-detection.md +32 -24
  229. package/docs/hooks.md +3 -1
  230. package/docs/icons.md +7 -7
  231. package/docs/index.md +61 -23
  232. package/docs/installer-options.md +24 -21
  233. package/docs/logging.md +5 -5
  234. package/docs/releasing.md +25 -17
  235. package/docs/runner.md +40 -5
  236. package/docs/shared/brands.md +12 -6
  237. package/docs/shared/breaking-changes.md +375 -21
  238. package/docs/shared/config.md +757 -199
  239. package/docs/shared/deploys.md +194 -91
  240. package/docs/shared/icons.md +18 -0
  241. package/docs/shared/local-dev.md +24 -6
  242. package/docs/shared/logging.md +9 -6
  243. package/docs/shared/monitoring.md +27 -13
  244. package/docs/shared/publishing.md +3 -3
  245. package/docs/shared/rulings.md +2 -2
  246. package/docs/shared/testing.md +1 -1
  247. package/docs/shared/theming.md +26 -1
  248. package/docs/shared/translation.md +49 -7
  249. package/docs/shared/updates.md +1 -1
  250. package/docs/signing.md +59 -33
  251. package/docs/test-framework.md +10 -5
  252. package/docs/themes.md +15 -1
  253. package/package.json +18 -12
  254. package/bin/omega-desktop +0 -2
  255. package/dist/commands/push-secrets.js +0 -141
  256. package/dist/test/suites/build/deliver-certs.test.js +0 -95
  257. package/dist/test/suites/build/derive-signing-env.test.js +0 -122
  258. package/dist/test/suites/build/push-secrets.test.js +0 -226
  259. package/dist/test/suites/build/resolve-signing-cert.test.js +0 -342
  260. package/dist/utils/deliver-certs.js +0 -69
  261. package/dist/utils/derive-signing-env.js +0 -56
  262. package/dist/utils/resolve-signing-cert.js +0 -175
  263. package/dist/vendor/config/desktop-artifacts.js +0 -110
  264. package/dist/vendor/config/instances.js +0 -208
  265. /package/dist/defaults/config/icons/{macos → mac}/dmg.png +0 -0
  266. /package/dist/defaults/config/icons/{macos → mac}/icon.png +0 -0
  267. /package/dist/defaults/config/icons/{macos → mac}/tray.png +0 -0
@@ -22,6 +22,16 @@
22
22
  },
23
23
  },
24
24
 
25
+ // Where this brand's code and artifacts live (#883): ONE org, and every repo
26
+ // derives from `<brand.id>-<role>`: `<brand.id>-omega` (source),
27
+ // `<brand.id>-releases` (the public artifact channel this app's updater
28
+ // polls), `<brand.id>-<web target>` (a built site). No repo NAME is ever
29
+ // typed. Uncomment and name the org to address them.
30
+ // repo: {
31
+ // provider: 'github',
32
+ // org: 'MyOrg',
33
+ // },
34
+
25
35
  monitoring: {
26
36
  providers: {
27
37
  sentry: {
@@ -84,13 +94,19 @@
84
94
  appearance: 'system',
85
95
  },
86
96
 
87
- // ── Target-scoped config. Key presence = "this brand enables this target". ──
88
- // For a standalone desktop repo only the `desktop` entry exists; in a brand
89
- // monorepo the brand-level omega.json5 lists every enabled target.
97
+ // ── Target-scoped config. Every key is a target NAME (the folder
98
+ // targets/<name> in a brand monorepo) and every entry declares its framework
99
+ // `type`. For a standalone desktop repo only the `desktop` entry exists; in a
100
+ // brand monorepo the brand-level omega.json5 lists every declared target.
90
101
  targets: {
91
102
  desktop: {
103
+ type: 'desktop',
104
+
92
105
  // App-level metadata — universal cross-platform fields. @omega.js/desktop auto-derives sensible
93
- // defaults from the BRAND: `appId` ← reverse-domain of `brand.url`
106
+ // defaults from the BRAND: `appId` ← `certificates.providers.apple.bundleIdPrefix`
107
+ // plus `brand.id` with its dashes as dots (`com.example` + `my-app` →
108
+ // `com.example.my.app`), the same id the certificates service registers.
109
+ // No prefix declared → reverse-domain of `brand.url`
94
110
  // (`https://foo.example.com` → `com.example.foo`; no url → `app.<brand.id>`),
95
111
  // `productName` ← `brand.name`, `copyright` ← `© <year>, <brand.name>`.
96
112
  // Override any of these explicitly only if you must.
@@ -112,7 +128,7 @@
112
128
  darkModeSupport: true, // mac honors via NSRequiresAquaSystemAppearance; win/linux ignore
113
129
  // Icons are convention-only. Drop PNGs at:
114
130
  // config/icons/global/<slot>.png — universal default for all platforms
115
- // config/icons/macos/<slot>.png — macOS override (beats global)
131
+ // config/icons/mac/<slot>.png : macOS override (beats global)
116
132
  // config/icons/windows/<slot>.png — Windows override
117
133
  // config/icons/linux/<slot>.png — Linux override (otherwise falls back to global → windows)
118
134
  // Slots: icon, tray (mac+win+linux); dmg (mac-only).
@@ -120,14 +136,26 @@
120
136
  // macOS tray must be 32×32; @omega.js/desktop renames the dist output to trayTemplate.png for the
121
137
  // OS dark-mode auto-inversion magic.
122
138
  },
123
- // Per-platform install/distribution config. The keys here map directly to the same
124
- // electron-builder concepts (`mac.target`, `win.target`, `linux.target`) but @omega.js/desktop owns
125
- // the actual target list (dmg+zip on mac, nsis on win, deb+AppImage on linux) so
126
- // auto-update keeps working — see docs/installer-options.md for why. Each block
127
- // exposes only the knobs that exist for that platform — no cross-platform analog
128
- // for any of these.
139
+ // What this app SHIPS, plus each platform's install knobs (#867). The
140
+ // vocabulary is the client's: mac, windows, linux (never macos, never win).
141
+ //
142
+ // `formats` is the declaration: presence = enabled, every format below is
143
+ // ON by default, and the only way to drop one is `false` (e.g.
144
+ // `snap: false`). Per-format settings live inside the format. The keys
145
+ // beside `formats` are install knobs that map onto the same
146
+ // electron-builder concepts (`mac.target`, `win.target`, `linux.target`),
147
+ // but @omega.js/desktop owns the actual target list so auto-update keeps
148
+ // working (see docs/installer-options.md for why). Each block exposes only
149
+ // the knobs that exist for that platform: there is no cross-platform
150
+ // analog for any of these.
129
151
  platforms: {
130
152
  mac: {
153
+ // The disk image the site's /download/mac/dmg hands over. The
154
+ // auto-update zip is not a format: electron-updater fetches it from
155
+ // the feed and nobody links it, so the mac leg always builds it.
156
+ formats: {
157
+ dmg: {},
158
+ },
131
159
  arch: ['universal'], // universal binary (x64 + arm64 lipo'd) — one .dmg/.zip for both
132
160
  // Entitlements override map. @omega.js/desktop ships sensible defaults (allow-jit,
133
161
  // allow-unsigned-executable-memory, disable-library-validation, network.client/server,
@@ -148,7 +176,12 @@
148
176
  entitlementsInherit: null,
149
177
  },
150
178
  },
151
- win: {
179
+ windows: {
180
+ // The one installer, at /download/windows/nsis. NSIS merges every
181
+ // arch below into a single .exe.
182
+ formats: {
183
+ nsis: {},
184
+ },
152
185
  arch: ['x64', 'ia32'], // 64-bit + 32-bit (single multi-arch NSIS installer)
153
186
  oneClick: true, // no installer wizard, just installs immediately
154
187
  desktopShortcut: true,
@@ -168,25 +201,28 @@
168
201
  },
169
202
  },
170
203
  linux: {
171
- arch: ['x64'], // amd64; ia32 is essentially extinct on Linux
172
- // Snap publishing — enabled by default. Adds a `snap` target to the linux build
173
- // and auto-publishes to the Snap Store on release. Requires SNAPCRAFT_STORE_CREDENTIALS
174
- // in your `.env` (run `snapcraft export-login -` locally to mint, then `mgr push-secrets`
175
- // flows it to GH Actions). Set enabled:false here to skip the snap target entirely.
176
- snap: {
177
- enabled: true,
178
- confinement: 'strict',
179
- grade: 'stable',
180
- autoStart: true,
181
- channels: ['stable'],
204
+ formats: {
205
+ deb: {}, // /download/linux/deb (needs brand.url + brand.contact.email)
206
+ appimage: {}, // /download/linux/appimage
207
+ // Snap publishing, on by default: adds a `snap` target to the linux
208
+ // build and publishes to the Snap Store on release. Needs
209
+ // SNAPCRAFT_STORE_CREDENTIALS in your `.env` (the manage walk asks
210
+ // for it; `snapcraft export-login -` mints it, then `omega deploy`
211
+ // flows it to GH Actions). `snap: false` drops it.
212
+ snap: {
213
+ confinement: 'strict',
214
+ grade: 'stable',
215
+ autoStart: true,
216
+ channels: ['stable'],
217
+ },
182
218
  },
219
+ arch: ['x64'], // amd64; ia32 is essentially extinct on Linux
183
220
  },
184
221
  },
185
222
  // Auto-updater (electron-updater wrapper). Feed URL is auto-derived from `releases` (below).
186
223
  // Set `OMEGA_DEV_UPDATE=available|unavailable|error` to simulate updates in dev.
187
224
  autoUpdate: {
188
225
  enabled: true,
189
- channel: 'latest',
190
226
  autoDownload: true,
191
227
  startupDelayMs: 10000, // 10s after whenReady → first check
192
228
  feedCheckIntervalMs: 3600000, // 1h between feed polls (HTTP — keep slow)
@@ -234,17 +270,15 @@
234
270
  // Add a `windows: {}` block here only if you want to override defaults persistently.
235
271
 
236
272
  // Releases: the ONE public repo where built artifacts (and the auto-update feed) live.
237
- // The app repo can stay private; this one MUST be public for unauthenticated downloads + auto-updates.
238
- // Both keys default: repo is `<brand.id>-releases` and owner is the brand repo's owner, so the whole
239
- // block can stay empty (`releases: {}`) and still address a repo.
273
+ // The source repo can stay private; this one is always public, for unauthenticated downloads + auto-updates.
274
+ // Nothing names it: it is always `<brand.id>-releases` under the top-level `repo.org`, so this block is
275
+ // a presence switch and nothing more (#883). An empty `releases: {}` addresses the repo in full.
240
276
  // `npx omega deploy`'s precheck auto-creates it if it doesn't exist (uses GH_TOKEN).
241
- // Artifact names carry NO version (MyApp-mac-universal.dmg), so this repo also serves the marketing
242
- // site: https://github.com/<owner>/<repo>/releases/latest/download/<asset> never changes across
243
- // versions, and the website derives its download buttons from it. See docs/releasing.md.
277
+ // Artifact names carry NO version (MyApp-mac-dmg.dmg), so this repo also serves the marketing
278
+ // site: https://github.com/<org>/<brand.id>-releases/releases/latest/download/<asset> never changes
279
+ // across versions, and the website derives its download buttons from it. See docs/releasing.md.
244
280
  releases: {
245
281
  enabled: true,
246
- // owner: null, // null = the brand repo's owner
247
- // repo: 'myapp-releases', // default: `<brand.id>-releases`
248
282
  },
249
283
  // Deep links: scheme is automatically `<brand.id>://...`. Built-in routes:
250
284
  // auth/token → @omega.js/client auth token handoff
@@ -0,0 +1,10 @@
1
+ // Optional consumer extension hook: called by `omega deploy` on both lanes, after the local
2
+ // scaffold and BEFORE the network precheck, the dispatch, or a local publish. No-op by default.
3
+ // A dry run skips it.
4
+ //
5
+ // Use this for: resetting a release the deploy will recreate, last-mile validations, anything
6
+ // that must happen before the publish reaches the release repo.
7
+
8
+ module.exports = async (ctx) => {
9
+ // ctx = { manager, projectRoot, mode }
10
+ };
@@ -4,11 +4,16 @@
4
4
  // Customize Classy theme variables here. See:
5
5
  // node_modules/@omega.js/desktop/dist/assets/themes/classy/_config.scss for all available variables.
6
6
 
7
+ // The brand accent, generated from `brand.color` in config/omega.json5 by the
8
+ // sass task. Deliberate divergence? Put a literal in its place below:
9
+ // $primary: #2563EB, // in place of `brand.$primary`
10
+ @use 'brand';
11
+
7
12
  @use 'omega-desktop' as * with (
8
13
  // ============================================
9
14
  // Brand Colors
10
15
  // ============================================
11
- $primary: #2563EB,
16
+ $primary: brand.$primary,
12
17
  // $secondary: #6C757D,
13
18
 
14
19
  // ============================================
@@ -28,7 +33,12 @@
28
33
  // $border-radius: 0.5rem,
29
34
  );
30
35
 
36
+ // The runtime --omega-accent ramp, the same light and dark families the web
37
+ // target inlines into its <head>. It goes AFTER the framework import so it wins
38
+ // the cascade over the token sheet's placeholders.
39
+ @include brand.ramp;
40
+
31
41
  // ============================================
32
42
  // Custom Global Styles
33
43
  // ============================================
34
- // Add your project-specific styles below — applied on every page.
44
+ // Add your project-specific styles below, applied on every page.
@@ -25,7 +25,7 @@ module.exports = ({ manager, tray }) => {
25
25
 
26
26
  // ───────── Examples (uncomment to use) ─────────
27
27
  //
28
- // // Override the icon path (otherwise auto-resolved from config/icons/macos/tray.png).
28
+ // // Override the icon path (otherwise auto-resolved from config/icons/mac/tray.png).
29
29
  // // On macOS, the filename MUST end in `Template.png` for OS dark-mode auto-inversion.
30
30
  // tray.icon('src/assets/icons/my-trayTemplate.png');
31
31
  //
package/dist/gulp/main.js CHANGED
@@ -1,4 +1,4 @@
1
- // Strip ELECTRON_RUN_AS_NODE — see bin/omega-desktop for the full story. Belt-and-suspenders
1
+ // Strip ELECTRON_RUN_AS_NODE: see src/cli-run.js for the full story. Belt-and-suspenders
2
2
  // at the gulp boundary too because gulp can be invoked outside of mgr (e.g. `npx gulp build`).
3
3
  delete process.env.ELECTRON_RUN_AS_NODE;
4
4
 
@@ -15,10 +15,16 @@ const package = Manager.getPackage('main');
15
15
  const project = Manager.getPackage('project');
16
16
  const projectRoot = Manager.getRootPath('project');
17
17
 
18
- // Resolve the .env cascade from the project root (shell > app > brand > company).
19
- // `target` delivers the schema's `deliverAs` renames into process.env (#678);
20
- // gulp can be invoked outside the CLI (`npx gulp build`), so it asks here too.
21
- require('../vendor/config/index.js').loadEnv(projectRoot, { target: 'desktop' });
18
+ // Resolve the .env cascade from the project root (shell > app > brand > company)
19
+ // and derive the signing paths the brand's signing tree implies. gulp is its own
20
+ // PROCESS (npm start invokes it with no CLI above it), so it asks the same
21
+ // wrapper the CLI asks and gets the same answer
22
+ // ([#891](https://github.com/Omega-JS-Stack/omega/issues/891)). The load has to
23
+ // precede the log tee (the tee reads the env it populates), so what it derived
24
+ // is REPORTED below instead: the derived lines are what a CI signing failure is
25
+ // diagnosed from, and they belong in build.log.
26
+ const { loadDesktopEnv, reportSigningEnv } = require('../utils/load-env.js');
27
+ const signingEnv = loadDesktopEnv(projectRoot);
22
28
 
23
29
  // Empty-string signing placeholders (CSC_LINK="" etc. from the .env template)
24
30
  // must read as UNSET — app-builder-lib only null-checks and would resolve ''
@@ -40,26 +46,8 @@ if (logFileEnv !== 'false' && logFileEnv !== '0') {
40
46
  logger.log(`Logs tee'd to ${logPath}`);
41
47
  }
42
48
 
43
- // Signing certificate lookup: explicit CSC_LINK → the brand's gitignored
44
- // .omega/certificates tree → the Keychain (the default, and what a tree-less
45
- // setup keeps getting). Runs AFTER the log tee so the chosen source and reason
46
- // land in build.log — the line a CI signing failure is diagnosed from.
47
- // See utils/resolve-signing-cert.js.
48
- const signingCert = require('../utils/resolve-signing-cert.js')({ projectRoot });
49
- if (signingCert.source === 'certificates') {
50
- process.env.CSC_LINK = signingCert.cscLink;
51
- }
52
- logger.log(`Signing certificate: ${signingCert.source} (${signingCert.reason})`);
53
-
54
- // The signing paths the DELIVERED artifacts imply (#678): the manager's
55
- // disperse service used to stamp CSC_LINK / APPLE_API_KEY into the target's
56
- // .env; no machine writes a target .env any more, so an unset key whose file
57
- // sits in config/certs/ is derived here instead. Runs last: an explicit
58
- // answer, and the lookup above, always win. See utils/derive-signing-env.js.
59
- const derivedSigningKeys = require('../utils/derive-signing-env.js')({ env: process.env, projectDir: projectRoot });
60
- if (derivedSigningKeys.length) {
61
- logger.log(`Derived signing env from the certs dir: ${derivedSigningKeys.map((entry) => `${entry.key}=${entry.value}`).join(', ')}`);
62
- }
49
+ // What the env load derived, now that build.log is catching lines.
50
+ reportSigningEnv(signingEnv, logger);
63
51
 
64
52
  logger.log('Starting...', argv);
65
53
 
@@ -20,7 +20,7 @@
20
20
  const path = require('path');
21
21
  const jetpack = require('fs-jetpack');
22
22
  const Manager = new (require('../../build.js'));
23
- const { validateConfig, releasesRepo } = require('../../vendor/config/index.js');
23
+ const { validateConfig, releasesRepo, hasOmegaConfig, loadConfig } = require('../../vendor/config/index.js');
24
24
 
25
25
  const logger = Manager.logger('audit');
26
26
 
@@ -41,6 +41,18 @@ module.exports = function audit(done) {
41
41
  const { errors: schemaErrors } = validateConfig(config, { target: 'desktop' });
42
42
  errors.push(...schemaErrors);
43
43
 
44
+ // ...and the validator's WARNINGS, which this task used to drop on the floor
45
+ // while reporting `0 warnings` ([#911](https://github.com/Omega-JS-Stack/omega/issues/911)).
46
+ // A key the schema does not declare is what a typo looks like, and the
47
+ // consumer has to see it at build time. They come off the LOAD, the same
48
+ // resolution `Manager.getConfig()` runs: loadConfig judges what the brand
49
+ // AUTHORED, before the loader fills its own resolved facts (`company.name`
50
+ // and friends) and before the build attaches `environment`.
51
+ const { warnings: configWarnings } = hasOmegaConfig(cwd)
52
+ ? loadConfig(cwd, 'desktop', { environment: Manager.getEnvironment() })
53
+ : { warnings: [] };
54
+ warnings.push(...configWarnings);
55
+
44
56
  // 2. File existence for paths the build references (not in schema because these are
45
57
  // tied to the build pipeline, not the config shape).
46
58
  fileMustExist('src/main.js', 'src/main.js');
@@ -49,11 +61,11 @@ module.exports = function audit(done) {
49
61
  // Icon must exist when packaging — dev runs fine with the default Electron icon.
50
62
  fileMustExist(config.brand.images?.icon, 'config.brand.images.icon');
51
63
  }
52
- // Publishing needs an ADDRESS for the releases repo, not a hand-written name:
53
- // @omega.js/config's releasesRepo defaults it to `<brand.id>-releases` under the
54
- // brand repo owner, so only a missing owner (or brand.id) leaves it unaddressable.
55
- if (Manager.isPublishMode() && config.releases?.enabled !== false && !releasesRepo(config).repo) {
56
- errors.push('the releases repo is unaddressable: set repo.providers.github.org (or targets.desktop.releases.owner) and brand.id. The repo name defaults to "<brand.id>-releases"');
64
+ // Publishing needs an ADDRESS for the releases repo, and no repo name is ever
65
+ // typed: @omega.js/config's releasesRepo derives `<brand.id>-releases` under
66
+ // the brand's org, so only a missing org (or brand.id) leaves it unaddressable.
67
+ if (Manager.isPublishMode() && config.releases?.enabled !== false && !releasesRepo(config)) {
68
+ errors.push('the releases repo is unaddressable: set repo.org and brand.id. The repo is always "<brand.id>-releases" under that org');
57
69
  }
58
70
 
59
71
  // 3. Soft warnings — not fatal but worth surfacing.