@omega.js/desktop 0.53.0 → 0.54.1

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 (161) hide show
  1. package/README.md +38 -38
  2. package/dist/cli-run.js +4 -1
  3. package/dist/cli.js +2 -2
  4. package/dist/commands/cdp/client.js +1 -1
  5. package/dist/commands/cdp.js +1 -1
  6. package/dist/commands/clean.js +2 -3
  7. package/dist/commands/dev.js +25 -0
  8. package/dist/commands/lib/ensure-target.js +12 -17
  9. package/dist/commands/lib/migrate.js +17 -0
  10. package/dist/commands/logs.js +1 -1
  11. package/dist/commands/release.js +1 -1
  12. package/dist/commands/test.js +4 -4
  13. package/dist/commands/update.js +5 -4
  14. package/dist/defaults/.github/workflows/build.yml +18 -18
  15. package/dist/defaults/_.gitignore +0 -2
  16. package/dist/defaults/_mas/README.md +3 -3
  17. package/dist/defaults/config/certs/README.md +1 -1
  18. package/dist/defaults/config/omega.json5 +36 -36
  19. package/dist/defaults/docs/README.md +3 -3
  20. package/dist/defaults/gulpfile.js +1 -1
  21. package/dist/defaults/hooks/build/post.js +1 -1
  22. package/dist/defaults/hooks/build/pre.js +1 -1
  23. package/dist/defaults/hooks/notarize/post.js +2 -2
  24. package/dist/defaults/hooks/release/post.js +1 -1
  25. package/dist/defaults/hooks/release/pre.js +1 -1
  26. package/dist/defaults/src/assets/scss/pages/about.scss +1 -1
  27. package/dist/defaults/src/assets/scss/pages/main.scss +1 -1
  28. package/dist/defaults/src/assets/scss/pages/settings.scss +1 -1
  29. package/dist/defaults/src/integrations/context-menu/index.js +11 -11
  30. package/dist/defaults/src/integrations/menu/index.js +5 -5
  31. package/dist/defaults/src/integrations/tray/index.js +9 -9
  32. package/dist/defaults/src/main.js +2 -2
  33. package/dist/defaults/src/preload.js +1 -1
  34. package/dist/defaults/test/README.md +3 -3
  35. package/dist/defaults/test/_init.js +1 -1
  36. package/dist/gulp/tasks/audit.js +5 -8
  37. package/dist/lib/restart-manager/index.js +1 -1
  38. package/dist/lib/restart-manager/install.js +1 -1
  39. package/dist/lib/restart-manager/protocol.js +1 -1
  40. package/dist/main.js +4 -3
  41. package/dist/preload.js +1 -1
  42. package/dist/test/suites/build/audit.test.js +20 -7
  43. package/dist/test/suites/build/build-workflow-jobs.test.js +2 -2
  44. package/dist/test/suites/build/cli.test.js +28 -0
  45. package/dist/test/suites/build/defaults-em-dash.test.js +22 -0
  46. package/dist/test/suites/build/defaults-scaffold.test.js +19 -5
  47. package/dist/test/suites/build/deploy-direct.test.js +7 -5
  48. package/dist/test/suites/build/deploy-dispatch.test.js +2 -1
  49. package/dist/test/suites/build/deploy-hook.test.js +4 -2
  50. package/dist/test/suites/build/dev-verb.test.js +67 -0
  51. package/dist/test/suites/build/ensure-target.test.js +11 -3
  52. package/dist/test/suites/build/merge-line-files.test.js +6 -6
  53. package/dist/test/suites/build/migrate.test.js +29 -0
  54. package/dist/test/suites/build/project-scripts-deps.test.js +6 -10
  55. package/dist/test/suites/build/runner-env-write.test.js +73 -0
  56. package/dist/test/suites/build/runner.test.js +9 -8
  57. package/dist/test/suites/build/setup-scripts.test.js +27 -0
  58. package/dist/test/suites/build/validate-config.test.js +13 -2
  59. package/dist/test/suites/build/verb-logs.test.js +20 -0
  60. package/dist/test/suites/renderer/window-desktop-surface.test.js +1 -1
  61. package/dist/utils/build-pipeline.js +4 -4
  62. package/dist/utils/runner-env.js +13 -28
  63. package/dist/vendor/config/company.js +46 -14
  64. package/dist/vendor/config/defaults.js +30 -7
  65. package/dist/vendor/config/edit.js +25 -3
  66. package/dist/vendor/config/env-delivery.js +1 -1
  67. package/dist/vendor/config/env-schema.js +3 -6
  68. package/dist/vendor/config/env.js +34 -22
  69. package/dist/vendor/config/index.js +13 -17
  70. package/dist/vendor/config/load.js +15 -7
  71. package/dist/vendor/config/repo.js +10 -27
  72. package/dist/vendor/config/schema-client.js +64 -0
  73. package/dist/vendor/config/schema-cloud.js +38 -0
  74. package/dist/vendor/config/schema-manager.js +118 -0
  75. package/dist/vendor/config/schema-overrides.js +68 -0
  76. package/dist/vendor/config/schema.js +99 -152
  77. package/dist/vendor/config/validate.js +97 -77
  78. package/dist/vendor/devkit/agents-md.js +233 -0
  79. package/dist/vendor/devkit/attach-log-file.js +15 -1
  80. package/dist/vendor/devkit/ci-workflows.js +30 -30
  81. package/dist/vendor/devkit/cli-router.js +13 -7
  82. package/dist/vendor/devkit/defaults-engine.js +9 -43
  83. package/dist/vendor/devkit/deploy-snapshot.js +44 -9
  84. package/dist/vendor/devkit/env-lines.js +183 -0
  85. package/dist/vendor/devkit/local.js +62 -10
  86. package/dist/vendor/devkit/lockfile.js +32 -13
  87. package/dist/vendor/devkit/logger.js +7 -2
  88. package/dist/vendor/devkit/merge-line-files.js +219 -176
  89. package/dist/vendor/devkit/omega-bin.js +208 -111
  90. package/dist/vendor/devkit/preludes/docs-sync.js +52 -0
  91. package/dist/vendor/devkit/preludes/index.js +1 -0
  92. package/dist/vendor/devkit/target-picker.js +45 -0
  93. package/dist/vendor/devkit/test/dashed-files.js +37 -0
  94. package/dist/vendor/devkit/test/run-verb-under-tee.js +71 -0
  95. package/dist/vendor/devkit/update.js +15 -15
  96. package/dist/vendor/devkit/verb-scripts.js +40 -0
  97. package/dist/vendor/devkit/verbs.js +170 -0
  98. package/package.json +18 -24
  99. package/dist/commands/install.js +0 -37
  100. package/dist/defaults/AGENTS.md +0 -119
  101. package/dist/defaults/CLAUDE.md +0 -1
  102. package/dist/vendor/config/env-retired.js +0 -137
  103. package/dist/vendor/config/retired-keys.js +0 -635
  104. package/docs/analytics.md +0 -140
  105. package/docs/app-state.md +0 -92
  106. package/docs/audit.md +0 -69
  107. package/docs/auth.md +0 -284
  108. package/docs/auto-updater.md +0 -243
  109. package/docs/boot-sequence.md +0 -44
  110. package/docs/build-system.md +0 -169
  111. package/docs/cdp-debugging.md +0 -169
  112. package/docs/common-mistakes.md +0 -21
  113. package/docs/config-schema.md +0 -120
  114. package/docs/context-menu.md +0 -112
  115. package/docs/context.md +0 -81
  116. package/docs/css.md +0 -84
  117. package/docs/deep-link.md +0 -186
  118. package/docs/environment-detection.md +0 -112
  119. package/docs/fontawesome.md +0 -109
  120. package/docs/hooks.md +0 -89
  121. package/docs/icons.md +0 -79
  122. package/docs/index.md +0 -328
  123. package/docs/installer-options.md +0 -165
  124. package/docs/ipc.md +0 -61
  125. package/docs/lib-modules.md +0 -53
  126. package/docs/logging.md +0 -227
  127. package/docs/menu.md +0 -160
  128. package/docs/releasing.md +0 -239
  129. package/docs/remote-config.md +0 -118
  130. package/docs/remote-scripts.md +0 -144
  131. package/docs/restart-manager.md +0 -144
  132. package/docs/runner.md +0 -290
  133. package/docs/sentry.md +0 -97
  134. package/docs/shared/agent-docs.md +0 -89
  135. package/docs/shared/analytics.md +0 -612
  136. package/docs/shared/brands.md +0 -57
  137. package/docs/shared/breaking-changes.md +0 -917
  138. package/docs/shared/config.md +0 -1948
  139. package/docs/shared/deploys.md +0 -341
  140. package/docs/shared/icons.md +0 -219
  141. package/docs/shared/local-dev.md +0 -167
  142. package/docs/shared/logging.md +0 -205
  143. package/docs/shared/monitoring.md +0 -167
  144. package/docs/shared/publishing.md +0 -187
  145. package/docs/shared/rulings.md +0 -34
  146. package/docs/shared/testing.md +0 -147
  147. package/docs/shared/theming.md +0 -629
  148. package/docs/shared/translation.md +0 -342
  149. package/docs/shared/updates.md +0 -61
  150. package/docs/signing.md +0 -293
  151. package/docs/startup.md +0 -142
  152. package/docs/storage.md +0 -59
  153. package/docs/templating.md +0 -101
  154. package/docs/test-boot-layer.md +0 -157
  155. package/docs/test-framework.md +0 -362
  156. package/docs/themes.md +0 -149
  157. package/docs/tooltips.md +0 -99
  158. package/docs/tray.md +0 -164
  159. package/docs/usage.md +0 -58
  160. package/docs/verts.md +0 -62
  161. package/docs/windows.md +0 -149
@@ -1,31 +1,14 @@
1
1
  /**
2
- * @omega.js/config repo: the ONE derivation of every repo a brand owns
3
- * ([#883](https://github.com/Omega-JS-Stack/omega/issues/883)).
4
- *
5
- * ONE config block says where a brand hosts its code:
6
- *
7
- * repo: { provider: 'github', org: 'Acme-Org' }
8
- *
9
- * and nothing else. Presence of the block enables the repo service, exactly
10
- * as a target's key presence enables a target; `provider` defaults to `github`
11
- * and `org` is the only typed value. No repo NAME is ever configured: every
12
- * name derives from the `<brand.id>-<role>` rule (Ian 2026-09-07,
13
- * [#809](https://github.com/Omega-JS-Stack/omega/issues/809)), one function per
14
- * role, so nobody types a repo name to get the right one:
15
- *
16
- * - `<brand.id>-omega` the SOURCE monorepo (`sourceRepo`)
17
- * - `<brand.id>-releases` the public release channel (`releasesRepo`)
18
- * - `<brand.id>-<name>` one per web target that GitHub hosts (`websiteRepo`)
19
- *
20
- * A repo name that must differ is a brand id that must differ: the override
21
- * keys (`repo.providers.github.repo`, the top-level `github` block,
22
- * `targets.<name>.github.repo`, `targets.desktop.releases.owner/repo`) are
23
- * retired, each with a row in retired-keys.js.
24
- *
25
- * Visibility is NOT in omega.json5 either: the brand root's package.json
26
- * `private` field is the one statement of it (`brandVisibility`), absent
27
- * meaning private, because every brand monorepo is private by default
28
- * (Ian 2026-09-11).
2
+ * @omega.js/config repo: the ONE derivation of every repo a brand owns. One
3
+ * block says where a brand hosts its code, `repo: { provider: 'github', org }`:
4
+ * its presence enables the repo service, `provider` defaults to `github`, and
5
+ * `org` is the only typed value. No repo NAME is configured anywhere; each
6
+ * derives from `<brand.id>-<role>`, one function per role: `<brand.id>-omega`
7
+ * the source monorepo (`sourceRepo`), `<brand.id>-releases` the public release
8
+ * channel (`releasesRepo`), `<brand.id>-<name>` per GitHub-hosted web target
9
+ * (`websiteRepo`). The old override keys are rows in @omega.js/manager's
10
+ * src/migrate/retired-keys.js. Visibility is the brand root package.json's
11
+ * `private` field (`brandVisibility`), absent meaning private.
29
12
  */
30
13
 
31
14
  const fs = require('node:fs');
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Schema rules for the `client` blob: the @omega.js/client settings bag a web
3
+ * target carries. The bag is OPEN (the client normalizes it against its own
4
+ * defaults); only the keys a brand authors, and consent, are typed.
5
+ */
6
+
7
+ const CLIENT_RULES = [
8
+ {
9
+ path: 'client',
10
+ type: 'object',
11
+ open: true,
12
+ required: false,
13
+ description: "The @omega.js/client runtime settings (auth, firebase, exitPopup, …), merged over the client's own defaults. Open by design: only consent and the keys a brand authors are typed below.",
14
+ },
15
+
16
+ // Consent decides whether a visitor is tracked at all: a typo that silently
17
+ // disabled the banner would ship a site with no consent gate and no error.
18
+ {
19
+ path: 'client.consent.enabled',
20
+ type: 'boolean',
21
+ required: false,
22
+ default: true,
23
+ description: 'The consent banner + the provider-script gate (default true). false ships NO banner: legal only for a site that loads no analytics/marketing provider at all.',
24
+ },
25
+ {
26
+ path: 'client.consent.config.position',
27
+ type: 'string',
28
+ required: false,
29
+ enum: ['bottom-left', 'bottom-right', 'bottom'],
30
+ description: "Where the panel sits. 'bottom' is the centered full-width form.",
31
+ },
32
+ {
33
+ path: 'client.consent.config.content',
34
+ type: 'object',
35
+ required: false,
36
+ description: "Banner copy: message, panelIntro, accept, customize, acceptAll, acceptNone (a literal `{terms}`/`{cookies}` links the terms/cookie-policy page). Category labels are framework copy: a brand renames the buttons, not the categories.",
37
+ },
38
+
39
+ // The keys a BRAND authors: each one reaches the client payload and changes
40
+ // what the site does, so each one is typed.
41
+ {
42
+ path: 'client.auth.config.policy',
43
+ type: 'string',
44
+ required: false,
45
+ enum: ['authenticated', 'unauthenticated', 'disabled'],
46
+ description: "Who a page is FOR: 'authenticated' redirects a signed-out visitor to the signin route, 'unauthenticated' redirects a signed-in one away, 'disabled' skips the auth module entirely (a vert iframe). Absent = no policy, which is the site-wide answer: the auth/admin layouts set theirs in page frontmatter, so a brand only sets this to blanket a whole site.",
47
+ },
48
+ {
49
+ path: 'client.exitPopup.enabled',
50
+ type: 'boolean',
51
+ required: false,
52
+ default: true,
53
+ description: 'The exit-intent offer popup (default true). false ships no popup at all; its copy, timeout and avatars live under client.exitPopup.config.',
54
+ },
55
+ {
56
+ path: 'client.serviceWorker.enabled',
57
+ type: 'boolean',
58
+ required: false,
59
+ default: true,
60
+ description: 'Registers the site service worker (default true): the offline/refresh lane and the push-notification registration ride it. false unregisters any worker the visitor already has.',
61
+ },
62
+ ];
63
+
64
+ module.exports = { CLIENT_RULES };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Schema rules for `cloud.config`, the provider's web-app config. For firebase
3
+ * it is the console's config verbatim: public by design (the web API key is no
4
+ * secret), and every key the Firebase web SDK takes is typed.
5
+ */
6
+
7
+ const FIREBASE_WEB_KEYS = {
8
+ apiKey: 'The web API key the Firebase SDKs identify the project with. Public by design: it ships in every browser bundle.',
9
+ authDomain: "The Firebase Auth domain: the BRAND host, where the web build self-hosts /__/auth/* (docs/shared/config.md → authDomain).",
10
+ databaseURL: 'The Realtime Database URL, for a project that has one.',
11
+ storageBucket: 'The default Cloud Storage bucket.',
12
+ messagingSenderId: 'The Cloud Messaging sender id web push registers against.',
13
+ appId: 'The Firebase web app id.',
14
+ measurementId: 'The Google Analytics measurement id Firebase links to the web app.',
15
+ };
16
+
17
+ const CLOUD_CONFIG_RULES = [
18
+ {
19
+ path: 'cloud.config',
20
+ type: 'object',
21
+ required: false,
22
+ description: 'Provider app config. For firebase: the web-app config verbatim from the console. Public by design: the web API key is not a secret.',
23
+ },
24
+ {
25
+ path: 'cloud.config.projectId',
26
+ type: 'string',
27
+ required: false,
28
+ description: 'Drives auth, emulator project selection, analytics uuidv5 namespace, remote-config URL fallbacks.',
29
+ },
30
+ ...Object.entries(FIREBASE_WEB_KEYS).map(([key, description]) => ({
31
+ path: `cloud.config.${key}`,
32
+ type: 'string',
33
+ required: false,
34
+ description,
35
+ })),
36
+ ];
37
+
38
+ module.exports = { CLOUD_CONFIG_RULES };
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Schema rules for the keys the manager's services (and the backend's content
3
+ * generators) read or write back: the brand switch, service switches, and the
4
+ * Stripe, GA4, devlog, blog and SEO engine data. The four zero-data switches
5
+ * default ON here and are materialized into brand files; the engine data's
6
+ * defaults stay in the manager's config.js.
7
+ */
8
+
9
+ const MANAGER_RULES = [
10
+ {
11
+ path: 'enabled',
12
+ type: 'boolean',
13
+ required: false,
14
+ default: true,
15
+ description: 'Whether the brand is active. `false` makes the manager skip it: a company run stamps it but never spawns its walk.',
16
+ },
17
+ {
18
+ path: 'server.enabled',
19
+ type: 'boolean',
20
+ required: false,
21
+ default: true,
22
+ description: "false (or `server: false`) skips the manager's server service, which registers this brand in the company server's brands collection.",
23
+ },
24
+ {
25
+ path: 'assets.enabled',
26
+ type: 'boolean',
27
+ required: false,
28
+ default: true,
29
+ description: "false (or `assets: false`) skips the manager's assets service, which derives the brand's visual collateral from its logo sources.",
30
+ },
31
+ {
32
+ path: 'payment.enabled',
33
+ type: 'boolean',
34
+ required: false,
35
+ default: true,
36
+ description: "false skips the manager's payment service: no provider account, product, webhook or Radar reconciliation for this brand.",
37
+ },
38
+ {
39
+ path: 'payment.providers.stripe.updateAccountInfo',
40
+ type: 'boolean',
41
+ required: false,
42
+ description: "false leaves the Stripe account's business profile alone instead of diffing it to the brand's name, url and support email.",
43
+ },
44
+ {
45
+ path: 'payment.providers.stripe.radar',
46
+ type: 'array',
47
+ required: false,
48
+ description: "The Radar fraud rules ([{ action, predicate, description }]) the payment service prints as guidance: Radar has no API, so a human applies them in the Dashboard.",
49
+ },
50
+ {
51
+ path: 'payment.providers.stripe.radarConfirmed',
52
+ type: 'boolean',
53
+ required: false,
54
+ description: 'Machine-written: the Radar rules were applied by hand in the Dashboard. The confirmation is the record, because nothing can read them back.',
55
+ },
56
+ {
57
+ path: 'payment.providers.stripe.disputesConfirmed',
58
+ type: 'boolean',
59
+ required: false,
60
+ description: 'Machine-written: Enhanced Dispute Protection was switched on by hand in the Dashboard. The confirmation is the record, because nothing can read it back.',
61
+ },
62
+ {
63
+ path: 'analytics.providers.google.timeZone',
64
+ type: 'string',
65
+ required: false,
66
+ description: 'The GA4 property reporting time zone the analytics service uses when it creates the property.',
67
+ },
68
+ {
69
+ path: 'analytics.providers.google.currency',
70
+ type: 'string',
71
+ required: false,
72
+ description: 'The GA4 property reporting currency the analytics service uses when it creates the property.',
73
+ },
74
+ {
75
+ path: 'analytics.providers.google.enhancedMeasurement',
76
+ type: 'object',
77
+ required: false,
78
+ description: "The GA4 web streams' Enhanced Measurement switches ({ scrollsEnabled, siteSearchEnabled, … }) the analytics service diffs every stream to.",
79
+ },
80
+ {
81
+ path: 'devlog.providers.ghostii',
82
+ type: 'object',
83
+ required: false,
84
+ description: 'The devlog writer and its settings (orgs, lookbackDays, excludeRepos, excludeCommits, excludeTopics, includePrivate, postPath, destinations, overrides): the manager\'s devlog pipeline reads them here.',
85
+ },
86
+ {
87
+ path: 'blog.enabled',
88
+ type: 'boolean',
89
+ required: false,
90
+ description: "true lets the backend's daily blog auto-publisher run; absent or false, it skips.",
91
+ },
92
+ {
93
+ path: 'blog.providers',
94
+ type: 'object',
95
+ required: false,
96
+ description: 'The blog writer, a KEY under `providers` (ghostii when none is picked).',
97
+ },
98
+ {
99
+ path: 'blog.content',
100
+ type: 'object|array',
101
+ required: false,
102
+ description: 'The blog pipeline entries ({ sources, categories, links, postPath, … }), one object or a list.',
103
+ },
104
+ {
105
+ path: 'seo.enabled',
106
+ type: 'boolean',
107
+ required: false,
108
+ description: "false (or `seo: false`) skips the manager's seo service.",
109
+ },
110
+ {
111
+ path: 'seo.github',
112
+ type: 'object',
113
+ required: false,
114
+ description: "The parasite-SEO content repos (`seo.github.content[]`) the seo service reconciles; a `config/seo.json5` sidecar merges over it.",
115
+ },
116
+ ];
117
+
118
+ module.exports = { MANAGER_RULES };
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Per-target rules for what a brand hands a framework verbatim: the desktop
3
+ * install knobs electron-builder takes, and the documented override blocks
4
+ * whose shape belongs to someone else (electron-builder, Electron, the MCP
5
+ * client), where a rule types the block and never the keys inside it.
6
+ */
7
+
8
+ // A platform's install knobs beside its `formats`, handed to electron-builder
9
+ const knob = (path, type, description) => ({ path: `platforms.${path}`, type, required: false, description });
10
+
11
+ const DESKTOP = [
12
+ knob('mac.arch', 'array|string', 'The mac architectures built (`universal`, `x64`, `arm64`).'),
13
+ knob('mac.entitlements', 'object|string', 'The mac hardened-runtime entitlements (a map, or a plist path).'),
14
+ knob('mac.mas.enabled', 'boolean', 'Mac App Store distribution: reserved, not implemented yet (the audit warns when true).'),
15
+ knob('mac.mas.provisioningProfile', 'string', 'The Mac App Store provisioning profile path (reserved).'),
16
+ knob('mac.mas.entitlements', 'string', 'The Mac App Store entitlements plist (reserved).'),
17
+ knob('mac.mas.entitlementsInherit', 'string', 'The Mac App Store inherited entitlements plist (reserved).'),
18
+ knob('windows.arch', 'array|string', 'The Windows architectures built (`x64`, `ia32`, `arm64`).'),
19
+ knob('windows.oneClick', 'boolean', 'NSIS one-click install (no wizard).'),
20
+ knob('windows.desktopShortcut', 'boolean', 'NSIS creates a desktop shortcut.'),
21
+ knob('windows.startMenuShortcut', 'boolean', 'NSIS creates a Start-menu shortcut.'),
22
+ knob('windows.runAfterFinish', 'boolean', 'NSIS launches the app when the install finishes.'),
23
+ knob('windows.perMachine', 'boolean', 'NSIS installs for every user rather than the current one.'),
24
+ knob('windows.signing.cloud', 'object', 'The cloud signing provider and its options, for the `cloud` signing strategy.'),
25
+ knob('linux.arch', 'array|string', 'The Linux architectures built (`x64`, `arm64`).'),
26
+ {
27
+ path: 'electronBuilder',
28
+ type: 'object',
29
+ required: false,
30
+ description: "Merged over the generated electron-builder config as the LAST layer (build-config.js), for the rare knob the framework defaults do not cover. Any electron-builder key.",
31
+ },
32
+ {
33
+ path: 'fileAssociations',
34
+ type: 'array',
35
+ required: false,
36
+ description: "The file types the packaged app registers for ([{ ext, name, role, icon }]), handed to electron-builder's fileAssociations as written.",
37
+ },
38
+ {
39
+ path: 'protocols',
40
+ type: 'array',
41
+ required: false,
42
+ description: "The URL schemes the packaged app registers for ([{ name, schemes }]), handed to electron-builder's protocols as written.",
43
+ },
44
+ {
45
+ path: 'windows',
46
+ type: 'object',
47
+ required: false,
48
+ description: 'Per-window BrowserWindow options keyed by window name (`windows.main.width`); the window manager merges each over its own defaults, and a call-site override still wins.',
49
+ },
50
+ {
51
+ path: 'cdp',
52
+ type: 'object',
53
+ required: false,
54
+ description: 'The desktop cdp command\'s settings. `cdp.readySignal` is the URL substring of the view whose load marks boot complete, for an app that finishes after its first paint.',
55
+ },
56
+ ];
57
+
58
+ const BACKEND = [
59
+ {
60
+ path: 'mcp.authUrl',
61
+ type: 'string',
62
+ required: false,
63
+ match: /^https?:\/\//,
64
+ description: "Overrides the consumer auth URL the backend's MCP OAuth flow sends a client to; unset derives `<website url>/token` (docs/backend/mcp.md).",
65
+ },
66
+ ];
67
+
68
+ module.exports = { OVERRIDE_RULES: { desktop: DESKTOP, backend: BACKEND } };