@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.
- package/README.md +38 -38
- package/dist/cli-run.js +4 -1
- package/dist/cli.js +2 -2
- package/dist/commands/cdp/client.js +1 -1
- package/dist/commands/cdp.js +1 -1
- package/dist/commands/clean.js +2 -3
- package/dist/commands/dev.js +25 -0
- package/dist/commands/lib/ensure-target.js +12 -17
- package/dist/commands/lib/migrate.js +17 -0
- package/dist/commands/logs.js +1 -1
- package/dist/commands/release.js +1 -1
- package/dist/commands/test.js +4 -4
- package/dist/commands/update.js +5 -4
- package/dist/defaults/.github/workflows/build.yml +18 -18
- package/dist/defaults/_.gitignore +0 -2
- package/dist/defaults/_mas/README.md +3 -3
- package/dist/defaults/config/certs/README.md +1 -1
- package/dist/defaults/config/omega.json5 +36 -36
- package/dist/defaults/docs/README.md +3 -3
- package/dist/defaults/gulpfile.js +1 -1
- package/dist/defaults/hooks/build/post.js +1 -1
- package/dist/defaults/hooks/build/pre.js +1 -1
- package/dist/defaults/hooks/notarize/post.js +2 -2
- package/dist/defaults/hooks/release/post.js +1 -1
- package/dist/defaults/hooks/release/pre.js +1 -1
- package/dist/defaults/src/assets/scss/pages/about.scss +1 -1
- package/dist/defaults/src/assets/scss/pages/main.scss +1 -1
- package/dist/defaults/src/assets/scss/pages/settings.scss +1 -1
- package/dist/defaults/src/integrations/context-menu/index.js +11 -11
- package/dist/defaults/src/integrations/menu/index.js +5 -5
- package/dist/defaults/src/integrations/tray/index.js +9 -9
- package/dist/defaults/src/main.js +2 -2
- package/dist/defaults/src/preload.js +1 -1
- package/dist/defaults/test/README.md +3 -3
- package/dist/defaults/test/_init.js +1 -1
- package/dist/gulp/tasks/audit.js +5 -8
- package/dist/lib/restart-manager/index.js +1 -1
- package/dist/lib/restart-manager/install.js +1 -1
- package/dist/lib/restart-manager/protocol.js +1 -1
- package/dist/main.js +4 -3
- package/dist/preload.js +1 -1
- package/dist/test/suites/build/audit.test.js +20 -7
- package/dist/test/suites/build/build-workflow-jobs.test.js +2 -2
- package/dist/test/suites/build/cli.test.js +28 -0
- package/dist/test/suites/build/defaults-em-dash.test.js +22 -0
- package/dist/test/suites/build/defaults-scaffold.test.js +19 -5
- package/dist/test/suites/build/deploy-direct.test.js +7 -5
- package/dist/test/suites/build/deploy-dispatch.test.js +2 -1
- package/dist/test/suites/build/deploy-hook.test.js +4 -2
- package/dist/test/suites/build/dev-verb.test.js +67 -0
- package/dist/test/suites/build/ensure-target.test.js +11 -3
- package/dist/test/suites/build/merge-line-files.test.js +6 -6
- package/dist/test/suites/build/migrate.test.js +29 -0
- package/dist/test/suites/build/project-scripts-deps.test.js +6 -10
- package/dist/test/suites/build/runner-env-write.test.js +73 -0
- package/dist/test/suites/build/runner.test.js +9 -8
- package/dist/test/suites/build/setup-scripts.test.js +27 -0
- package/dist/test/suites/build/validate-config.test.js +13 -2
- package/dist/test/suites/build/verb-logs.test.js +20 -0
- package/dist/test/suites/renderer/window-desktop-surface.test.js +1 -1
- package/dist/utils/build-pipeline.js +4 -4
- package/dist/utils/runner-env.js +13 -28
- package/dist/vendor/config/company.js +46 -14
- package/dist/vendor/config/defaults.js +30 -7
- package/dist/vendor/config/edit.js +25 -3
- package/dist/vendor/config/env-delivery.js +1 -1
- package/dist/vendor/config/env-schema.js +3 -6
- package/dist/vendor/config/env.js +34 -22
- package/dist/vendor/config/index.js +13 -17
- package/dist/vendor/config/load.js +15 -7
- package/dist/vendor/config/repo.js +10 -27
- package/dist/vendor/config/schema-client.js +64 -0
- package/dist/vendor/config/schema-cloud.js +38 -0
- package/dist/vendor/config/schema-manager.js +118 -0
- package/dist/vendor/config/schema-overrides.js +68 -0
- package/dist/vendor/config/schema.js +99 -152
- package/dist/vendor/config/validate.js +97 -77
- package/dist/vendor/devkit/agents-md.js +233 -0
- package/dist/vendor/devkit/attach-log-file.js +15 -1
- package/dist/vendor/devkit/ci-workflows.js +30 -30
- package/dist/vendor/devkit/cli-router.js +13 -7
- package/dist/vendor/devkit/defaults-engine.js +9 -43
- package/dist/vendor/devkit/deploy-snapshot.js +44 -9
- package/dist/vendor/devkit/env-lines.js +183 -0
- package/dist/vendor/devkit/local.js +62 -10
- package/dist/vendor/devkit/lockfile.js +32 -13
- package/dist/vendor/devkit/logger.js +7 -2
- package/dist/vendor/devkit/merge-line-files.js +219 -176
- package/dist/vendor/devkit/omega-bin.js +208 -111
- package/dist/vendor/devkit/preludes/docs-sync.js +52 -0
- package/dist/vendor/devkit/preludes/index.js +1 -0
- package/dist/vendor/devkit/target-picker.js +45 -0
- package/dist/vendor/devkit/test/dashed-files.js +37 -0
- package/dist/vendor/devkit/test/run-verb-under-tee.js +71 -0
- package/dist/vendor/devkit/update.js +15 -15
- package/dist/vendor/devkit/verb-scripts.js +40 -0
- package/dist/vendor/devkit/verbs.js +170 -0
- package/package.json +18 -24
- package/dist/commands/install.js +0 -37
- package/dist/defaults/AGENTS.md +0 -119
- package/dist/defaults/CLAUDE.md +0 -1
- package/dist/vendor/config/env-retired.js +0 -137
- package/dist/vendor/config/retired-keys.js +0 -635
- package/docs/analytics.md +0 -140
- package/docs/app-state.md +0 -92
- package/docs/audit.md +0 -69
- package/docs/auth.md +0 -284
- package/docs/auto-updater.md +0 -243
- package/docs/boot-sequence.md +0 -44
- package/docs/build-system.md +0 -169
- package/docs/cdp-debugging.md +0 -169
- package/docs/common-mistakes.md +0 -21
- package/docs/config-schema.md +0 -120
- package/docs/context-menu.md +0 -112
- package/docs/context.md +0 -81
- package/docs/css.md +0 -84
- package/docs/deep-link.md +0 -186
- package/docs/environment-detection.md +0 -112
- package/docs/fontawesome.md +0 -109
- package/docs/hooks.md +0 -89
- package/docs/icons.md +0 -79
- package/docs/index.md +0 -328
- package/docs/installer-options.md +0 -165
- package/docs/ipc.md +0 -61
- package/docs/lib-modules.md +0 -53
- package/docs/logging.md +0 -227
- package/docs/menu.md +0 -160
- package/docs/releasing.md +0 -239
- package/docs/remote-config.md +0 -118
- package/docs/remote-scripts.md +0 -144
- package/docs/restart-manager.md +0 -144
- package/docs/runner.md +0 -290
- package/docs/sentry.md +0 -97
- package/docs/shared/agent-docs.md +0 -89
- package/docs/shared/analytics.md +0 -612
- package/docs/shared/brands.md +0 -57
- package/docs/shared/breaking-changes.md +0 -917
- package/docs/shared/config.md +0 -1948
- package/docs/shared/deploys.md +0 -341
- package/docs/shared/icons.md +0 -219
- package/docs/shared/local-dev.md +0 -167
- package/docs/shared/logging.md +0 -205
- package/docs/shared/monitoring.md +0 -167
- package/docs/shared/publishing.md +0 -187
- package/docs/shared/rulings.md +0 -34
- package/docs/shared/testing.md +0 -147
- package/docs/shared/theming.md +0 -629
- package/docs/shared/translation.md +0 -342
- package/docs/shared/updates.md +0 -61
- package/docs/signing.md +0 -293
- package/docs/startup.md +0 -142
- package/docs/storage.md +0 -59
- package/docs/templating.md +0 -101
- package/docs/test-boot-layer.md +0 -157
- package/docs/test-framework.md +0 -362
- package/docs/themes.md +0 -149
- package/docs/tooltips.md +0 -99
- package/docs/tray.md +0 -164
- package/docs/usage.md +0 -58
- package/docs/verts.md +0 -62
- package/docs/windows.md +0 -149
package/docs/windows.md
DELETED
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
# Windows
|
|
2
|
-
|
|
3
|
-
**Lazy named-window registry.** @omega.js/desktop does NOT auto-create any window. Your `main.js` calls `omega.windows.create('main', { show: !startup.isLaunchHidden() })` from inside `omega.initialize().then(() => { ... })`. Always create `main`: its presence in the registry is what lets @omega.js/desktop's `app.on('activate')` (macOS dock click) and `app.on('second-instance')` (win/linux re-launch) handlers surface UI when the user double-clicks the running app. In hidden launches, pass `show: false` to keep the window invisible until something explicitly calls `windows.show('main')`. Use the registry for the common case (named, persistent, integrated windows). For one-off windows (a toast, a print preview), use `new BrowserWindow()` directly, `window-manager` doesn't get in the way.
|
|
4
|
-
|
|
5
|
-
## Re-surface on user re-launch
|
|
6
|
-
|
|
7
|
-
When the user double-clicks a running app (or clicks its dock icon on macOS), @omega.js/desktop transparently shows the main window — no consumer wiring needed.
|
|
8
|
-
|
|
9
|
-
- **macOS** → `app.on('activate')` calls `windows.show('main')` if `main` is in the registry.
|
|
10
|
-
- **Windows / Linux** → `app.on('second-instance')` does the same. (The OS spawns a duplicate process, the single-instance lock kills it, and the original instance receives the activation.)
|
|
11
|
-
|
|
12
|
-
Both handlers are no-ops if `main` isn't in the registry. So consumers who genuinely never want a window can omit `windows.create('main', ...)`. Otherwise, the canonical pattern (`windows.create('main', { show: !isLaunchHidden() })`) gives CleanMyMac-style behavior: tray-only at login, full window when the user manually opens the app.
|
|
13
|
-
|
|
14
|
-
## API
|
|
15
|
-
|
|
16
|
-
```js
|
|
17
|
-
await omega.windows.create('main', overrides?) // canonical entry point
|
|
18
|
-
await omega.windows.createNamed('main', mgr, opts?) // identical; .create() is sugar
|
|
19
|
-
omega.windows.get('main') // BrowserWindow | null
|
|
20
|
-
omega.windows.show('main') // show + focus + auto app.dock.show()
|
|
21
|
-
omega.windows.hide('main')
|
|
22
|
-
omega.windows.close('main') // force-close (bypasses hideOnClose)
|
|
23
|
-
omega.windows.list() // string[] of currently-open names
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
`create()` is single-instance: a second call with the same name returns the existing window and focuses it (no double-create).
|
|
27
|
-
|
|
28
|
-
## Defaults
|
|
29
|
-
|
|
30
|
-
No JSON config required. @omega.js/desktop bakes in sensible defaults so `omega.windows.create('main')` "just works":
|
|
31
|
-
|
|
32
|
-
| Window | Defaults |
|
|
33
|
-
|---|---|
|
|
34
|
-
| `main` | `{ width: 1024, height: 720, hideOnClose: true, view: 'main' }` |
|
|
35
|
-
| any other name | `{ width: 800, height: 600, hideOnClose: false, view: name }` |
|
|
36
|
-
|
|
37
|
-
Override at the call site:
|
|
38
|
-
|
|
39
|
-
```js
|
|
40
|
-
omega.windows.create('main', { width: 1280, height: 800 });
|
|
41
|
-
omega.windows.create('settings', { width: 600, height: 480 });
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
## Config (optional)
|
|
45
|
-
|
|
46
|
-
If you want to override defaults persistently (without typing them at every `create()` call), add a `windows:` block to `config/omega.json5`:
|
|
47
|
-
|
|
48
|
-
```jsonc
|
|
49
|
-
"windows": {
|
|
50
|
-
"main": { "width": 1280, "height": 800 }
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
Merge order: **framework defaults < JSON config < call-site overrides**.
|
|
55
|
-
|
|
56
|
-
Per-window keys:
|
|
57
|
-
|
|
58
|
-
| Key | Default (main) | Default (other) | Description |
|
|
59
|
-
|---|---|---|---|
|
|
60
|
-
| `view` | `main` | `<name>` | Folder under `src/views/`. Loads `dist/views/<view>/index.html`. |
|
|
61
|
-
| `width` / `height` | 1024 / 720 | 800 / 600 | Initial size (overridden by saved bounds if `persistBounds: true`). |
|
|
62
|
-
| `minWidth` / `minHeight` | 400 / 300 | 400 / 300 | |
|
|
63
|
-
| `show` | `true` | `true` | Auto-show on `ready-to-show`. `false` keeps the window hidden until `omega.windows.show()`. |
|
|
64
|
-
| `hideOnClose` | `true` | `false` | Discord-style: X click hides instead of closes. See "Hide-on-close" below. |
|
|
65
|
-
| `title` | `app.productName` | `app.productName` | Window title. |
|
|
66
|
-
| `backgroundColor` | `#ffffff` | `#ffffff` | Background color before the page loads. |
|
|
67
|
-
| `persistBounds` | `true` | `true` | Remember position+size across launches (see below). |
|
|
68
|
-
| `skipTaskbar` | `false` | `false` | Suppress taskbar/dock entry for THIS window. |
|
|
69
|
-
| `titleBar` | `'inset'` | `'inset'` | `'inset'` (mac/win native overlay) or `'native'` (full system frame). |
|
|
70
|
-
| `titleBarOverlay` | platform default | platform default | Override Windows overlay color/symbolColor/height. |
|
|
71
|
-
| `trafficLightPosition` | OS inset default | OS inset default | macOS only: `{ x, y }` custom position for the traffic lights (e.g. to center them inside a floating chrome panel). Only applies in `'inset'` mode. |
|
|
72
|
-
|
|
73
|
-
## Inset titlebar (default)
|
|
74
|
-
|
|
75
|
-
@omega.js/desktop ships an inset titlebar by default — the OS draws all the window controls and @omega.js/desktop adds a draggable strip in the page template:
|
|
76
|
-
|
|
77
|
-
| Platform | Behavior |
|
|
78
|
-
|---|---|
|
|
79
|
-
| **macOS** | `titleBarStyle: 'hiddenInset'` — traffic lights inset into the chrome region. Reposition them via `config.windows.<name>.trafficLightPosition = { x, y }` (e.g. when the app draws a floating chrome panel and the lights should sit inside it). |
|
|
80
|
-
| **Windows** | `titleBarStyle: 'hidden'` + `titleBarOverlay: { color, symbolColor, height: 36 }` — native min/max/close buttons drawn by the OS |
|
|
81
|
-
| **Linux** | Native frame (full system title bar) |
|
|
82
|
-
|
|
83
|
-
The page template (`<em>/src/config/page-template.html`, framework-internal — not consumer-overrideable) ships an `.omega-titlebar` div with `-webkit-app-region: drag`. Per-platform spacing is handled by `themes/classy/css/components/_titlebar.scss`, which keys off `html[data-platform]` (set by @omega.js/client during init):
|
|
84
|
-
|
|
85
|
-
- **mac** → `padding-left: 70px` (clear the traffic lights)
|
|
86
|
-
- **windows** → `padding-right: 140px` (clear the native overlay)
|
|
87
|
-
- **linux** → `display: none` (native frame draws title bar)
|
|
88
|
-
|
|
89
|
-
Override per-window via `config.windows.<name>.titleBar = 'native'` to opt out and get a full system frame on every platform.
|
|
90
|
-
|
|
91
|
-
## Hide-on-close (Discord-style)
|
|
92
|
-
|
|
93
|
-
The `main` window's X button **hides instead of closes** by default. Real quit only via:
|
|
94
|
-
|
|
95
|
-
- `Cmd+Q` (macOS standard `role: 'quit'` accelerator)
|
|
96
|
-
- Menu Quit (`main/quit` on mac, `file/quit` on win/linux)
|
|
97
|
-
- Tray Quit (`quit` item)
|
|
98
|
-
- Auto-updater install (`autoUpdater.installNow()`)
|
|
99
|
-
- Programmatic `omega.quit({ force: true })`
|
|
100
|
-
|
|
101
|
-
The window-manager close handler checks three flags before deciding to swallow vs let through:
|
|
102
|
-
|
|
103
|
-
| Flag | Set by | Means |
|
|
104
|
-
|---|---|---|
|
|
105
|
-
| `omega._allowQuit` | `omega.quit({ force: true })`, `autoUpdater.installNow()` | Programmatic force: let the close go through. |
|
|
106
|
-
| `omega._isQuitting` | `app.on('before-quit')` (every quit path Electron knows about) | App is quitting: let close events flow naturally. |
|
|
107
|
-
| `win._emForceClose` | `omega.windows.close(name)` | Per-window override. |
|
|
108
|
-
|
|
109
|
-
Other named windows default to `hideOnClose: false` (X actually closes). Override per window via config or call-site overrides.
|
|
110
|
-
|
|
111
|
-
## Bounds persistence
|
|
112
|
-
|
|
113
|
-
Every named window's position and size persist to storage on resize / move / maximize / unmaximize / fullscreen-enter / fullscreen-leave / close. Restored on next `create()`.
|
|
114
|
-
|
|
115
|
-
- Storage key: `windows.<name>.bounds`
|
|
116
|
-
- Saves debounced 250ms; close flushes synchronously.
|
|
117
|
-
- Off-screen detection: if a saved position has less than 100×50px overlap with any current display's `workArea`, position is dropped (size kept). Handles "monitor unplugged" gracefully.
|
|
118
|
-
- Maximized / fullscreen state is stored separately and restored via `win.maximize()` / `win.setFullScreen(true)`.
|
|
119
|
-
- Sanity floor: saved entries with `width < 100` or `height < 100` are ignored.
|
|
120
|
-
- Opt out per-window: `persistBounds: false`.
|
|
121
|
-
|
|
122
|
-
## macOS dock auto-show
|
|
123
|
-
|
|
124
|
-
When `LSUIElement: true` is baked at build time (`startup.mode: 'hidden'`), the app launches with **no dock icon, no Cmd+Tab, no taskbar**. The first time `omega.windows.create()` or `omega.windows.show()` runs, @omega.js/desktop calls `app.dock.show()` automatically: the dock icon appears alongside the window.
|
|
125
|
-
|
|
126
|
-
**And the inverse**: for `startup.mode: 'hidden'` apps, when the LAST visible named window hides (hide-on-close X, `windows.hide()`, any consumer `win.hide()`), @omega.js/desktop calls `app.dock.hide()` again: the app returns to its fully-invisible posture, dock and UI appearing and vanishing together. Normal-mode apps keep their dock icon for life; quit paths are untouched (`omega._isQuitting` guard).
|
|
127
|
-
|
|
128
|
-
This means agent / menubar apps can stay completely invisible until the user explicitly asks for UI:
|
|
129
|
-
|
|
130
|
-
```js
|
|
131
|
-
omega.initialize().then(() => {
|
|
132
|
-
// Don't call windows.create() here — app stays invisible.
|
|
133
|
-
// Surface UI later when something warrants it:
|
|
134
|
-
omega.tray.update('open', { click: () => omega.windows.create('main') });
|
|
135
|
-
});
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
## Auto-attach context-menu
|
|
139
|
-
|
|
140
|
-
Every window created via `omega.windows.create()` is automatically wired up with the consumer's `src/integrations/context-menu/index.js` (see [context-menu.md](context-menu.md)). Idempotent per webContents (uses a WeakSet). For windows you create directly with `new BrowserWindow()`, call `omega.contextMenu.attach(win.webContents)` manually.
|
|
141
|
-
|
|
142
|
-
## Testing mode: stealth surfacing
|
|
143
|
-
|
|
144
|
-
When `omega.isTesting()` (i.e. under `npx omega test`), every surfacing path in this lib (`ready-to-show`, `windows.show()`, the create-dedup focus) goes **stealth** instead of `win.show()`: `_surface()` applies the shared recipe from `src/utils/stealth-window.js` and surfaces via `showInactive()`, with no `win.focus()`/dock surfacing. **The full stealth story lives in [test-framework.md](test-framework.md) (SSOT)**: the recipe and why it's not `hide()`/`minimize()`, the raw-window `browser-window-created` hook, `webContents.focus()` suppression, macOS app-level activation suppression, and the **`OMEGA_TEST_SHOW=1`** opt-out. Covered by `suites/main/stealth-window.test.js`.
|
|
145
|
-
|
|
146
|
-
## Platform behavior
|
|
147
|
-
|
|
148
|
-
- `window-all-closed` → `app.quit()` on Windows/Linux only. macOS apps are sticky (stay running with no windows).
|
|
149
|
-
- All event listeners (`close` / `closed` / `resize` / `move` / `ready-to-show` / etc.) are attached **before** `await loadFile()` resolves, so the window is fully observable the moment it lands in the registry.
|