@tantawowa/hosanna-tools 3.32.0 → 4.0.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.
- package/README.md +38 -100
- package/dist/artwork/app-artwork.d.ts +2 -59
- package/dist/artwork/app-artwork.js +26 -243
- package/dist/artwork/app-artwork.js.map +1 -1
- package/dist/build-info.json +3 -3
- package/dist/capture/mcp-tools.d.ts +1 -1
- package/dist/capture/mcp-tools.js +2 -4
- package/dist/capture/mcp-tools.js.map +1 -1
- package/dist/capture/video-capture.d.ts +2 -13
- package/dist/capture/video-capture.js +8 -53
- package/dist/capture/video-capture.js.map +1 -1
- package/dist/cli.js +44 -338
- package/dist/cli.js.map +1 -1
- package/dist/device/device-cli.js +4 -19
- package/dist/device/device-cli.js.map +1 -1
- package/dist/device/devices-file.js +4 -7
- package/dist/device/devices-file.js.map +1 -1
- package/dist/device/driver-registry.js +3 -31
- package/dist/device/driver-registry.js.map +1 -1
- package/dist/device/types.d.ts +1 -1
- package/dist/generation/shapes/shape-compiler.js +9 -0
- package/dist/generation/shapes/shape-compiler.js.map +1 -1
- package/dist/index.d.ts +3 -16
- package/dist/index.js +1 -22
- package/dist/index.js.map +1 -1
- package/dist/lib/app-config-resolver.js +10 -19
- package/dist/lib/app-config-resolver.js.map +1 -1
- package/dist/run/destination-picker.js +5 -60
- package/dist/run/destination-picker.js.map +1 -1
- package/dist/run/executor.d.ts +0 -9
- package/dist/run/executor.js +50 -119
- package/dist/run/executor.js.map +1 -1
- package/dist/run/launch-installed.d.ts +5 -14
- package/dist/run/launch-installed.js +17 -58
- package/dist/run/launch-installed.js.map +1 -1
- package/dist/run/planner.d.ts +2 -10
- package/dist/run/planner.js +26 -778
- package/dist/run/planner.js.map +1 -1
- package/dist/run/run-config.d.ts +5 -12
- package/dist/run/run-config.js +8 -36
- package/dist/run/run-config.js.map +1 -1
- package/dist/run/run-controller.d.ts +1 -43
- package/dist/run/run-controller.js +14 -1572
- package/dist/run/run-controller.js.map +1 -1
- package/dist/run/targets.d.ts +1 -65
- package/dist/run/targets.js +13 -282
- package/dist/run/targets.js.map +1 -1
- package/dist/run/types.d.ts +8 -13
- package/dist/run/types.js +14 -19
- package/dist/run/types.js.map +1 -1
- package/dist/run/web-build.d.ts +1 -0
- package/dist/run/web-build.js +15 -0
- package/dist/run/web-build.js.map +1 -1
- package/dist/support-tools/build-config-resolver.js +7 -77
- package/dist/support-tools/build-config-resolver.js.map +1 -1
- package/dist/support-tools/dev-runner.js +2 -2
- package/dist/support-tools/dev-runner.js.map +1 -1
- package/dist/support-tools/mcp-server/tools.js +2 -2
- package/dist/support-tools/mcp-server/tools.js.map +1 -1
- package/dist/testing/client.js +1 -35
- package/dist/testing/client.js.map +1 -1
- package/dist/testing/launch-args.d.ts +11 -0
- package/dist/testing/launch-args.js +8 -0
- package/dist/testing/launch-args.js.map +1 -0
- package/dist/testing/launcher.d.ts +1 -1
- package/dist/testing/launcher.js +44 -153
- package/dist/testing/launcher.js.map +1 -1
- package/dist/testing/physical-tv.d.ts +0 -11
- package/dist/testing/physical-tv.js +0 -49
- package/dist/testing/physical-tv.js.map +1 -1
- package/dist/testing/stream-config.d.ts +7 -0
- package/dist/testing/stream-config.js +31 -0
- package/dist/testing/stream-config.js.map +1 -0
- package/dist/testing/target.js +6 -3
- package/dist/testing/target.js.map +1 -1
- package/dist/testing/types.d.ts +5 -10
- package/dist/updater/framework-installer.d.ts +0 -1
- package/dist/updater/framework-installer.js +0 -13
- package/dist/updater/framework-installer.js.map +1 -1
- package/dist/updater/license-manager.d.ts +1 -2
- package/dist/updater/license-manager.js +1 -14
- package/dist/updater/license-manager.js.map +1 -1
- package/dist/updater/sdk-manager.d.ts +1 -1
- package/dist/updater/sdk-manager.js +1 -1
- package/dist/vite-app-artwork.js +1 -6
- package/dist/vite-app-artwork.js.map +1 -1
- package/dist/vite-pwa.d.ts +0 -3
- package/dist/vite-pwa.js +0 -9
- package/dist/vite-pwa.js.map +1 -1
- package/package.json +2 -8
- package/dist/artwork/native-artwork.d.ts +0 -33
- package/dist/artwork/native-artwork.js +0 -297
- package/dist/artwork/native-artwork.js.map +0 -1
- package/dist/artwork/packaged-artwork.d.ts +0 -10
- package/dist/artwork/packaged-artwork.js +0 -465
- package/dist/artwork/packaged-artwork.js.map +0 -1
- package/dist/device/drivers/tizen-driver.d.ts +0 -19
- package/dist/device/drivers/tizen-driver.js +0 -178
- package/dist/device/drivers/tizen-driver.js.map +0 -1
- package/dist/device/drivers/webos-driver.d.ts +0 -15
- package/dist/device/drivers/webos-driver.js +0 -175
- package/dist/device/drivers/webos-driver.js.map +0 -1
- package/dist/device/setup.d.ts +0 -39
- package/dist/device/setup.js +0 -168
- package/dist/device/setup.js.map +0 -1
- package/dist/native/app-entry-generation.d.ts +0 -9
- package/dist/native/app-entry-generation.js +0 -100
- package/dist/native/app-entry-generation.js.map +0 -1
- package/dist/native/artifacts.d.ts +0 -104
- package/dist/native/artifacts.js +0 -747
- package/dist/native/artifacts.js.map +0 -1
- package/dist/native/native-project.d.ts +0 -108
- package/dist/native/native-project.js +0 -1590
- package/dist/native/native-project.js.map +0 -1
- package/dist/native/prepared-runtime.d.ts +0 -14
- package/dist/native/prepared-runtime.js +0 -20
- package/dist/native/prepared-runtime.js.map +0 -1
- package/dist/native/templates/android/AndroidAutoManifest.xml +0 -33
- package/dist/native/templates/android/AndroidManifest.xml +0 -20
- package/dist/native/templates/android/WearOsManifest.xml +0 -31
- package/dist/native/templates/android/app-build.gradle.kts +0 -300
- package/dist/native/templates/android/automotive_app_desc.xml +0 -5
- package/dist/native/templates/android/build.gradle.kts +0 -5
- package/dist/native/templates/android/car_attribution_icon.xml +0 -10
- package/dist/native/templates/android/colors.xml +0 -3
- package/dist/native/templates/android/gradle-wrapper.jar +0 -0
- package/dist/native/templates/android/gradle-wrapper.properties +0 -7
- package/dist/native/templates/android/gradle.properties +0 -3
- package/dist/native/templates/android/gradlew +0 -251
- package/dist/native/templates/android/gradlew.bat +0 -94
- package/dist/native/templates/android/hosanna-animated-image-proguard-rules.pro +0 -5
- package/dist/native/templates/android/launcher.xml +0 -12
- package/dist/native/templates/android/settings.gradle.kts +0 -18
- package/dist/native/templates/android/strings.xml +0 -3
- package/dist/native/templates/android/styles.xml +0 -8
- package/dist/native/templates/apple/AppIconContents.json +0 -7
- package/dist/native/templates/apple/HosannaCarPlay.entitlements +0 -8
- package/dist/native/templates/apple/HosannaIosApp.swift +0 -110
- package/dist/native/templates/apple/HosannaTvApp.swift +0 -118
- package/dist/native/templates/apple/HosannaWatchApp.swift +0 -10
- package/dist/native/templates/apple/Info.carplay.plist +0 -43
- package/dist/native/templates/apple/Info.plist +0 -24
- package/dist/native/templates/apple/Info.watchos.plist +0 -26
- package/dist/native/templates/apple/Podfile.example +0 -7
- package/dist/native/templates/apple/project.yml +0 -107
- package/dist/native/templates/artifacts/verify-aab.mjs +0 -11
- package/dist/run/android-auto.d.ts +0 -11
- package/dist/run/android-auto.js +0 -121
- package/dist/run/android-auto.js.map +0 -1
- package/dist/run/android-emulator.d.ts +0 -80
- package/dist/run/android-emulator.js +0 -1208
- package/dist/run/android-emulator.js.map +0 -1
- package/dist/run/apple-tv.d.ts +0 -35
- package/dist/run/apple-tv.js +0 -410
- package/dist/run/apple-tv.js.map +0 -1
- package/dist/run/apple-watch.d.ts +0 -49
- package/dist/run/apple-watch.js +0 -389
- package/dist/run/apple-watch.js.map +0 -1
- package/dist/run/carplay.d.ts +0 -17
- package/dist/run/carplay.js +0 -232
- package/dist/run/carplay.js.map +0 -1
- package/dist/run/code-bundle-descriptor.d.ts +0 -31
- package/dist/run/code-bundle-descriptor.js +0 -68
- package/dist/run/code-bundle-descriptor.js.map +0 -1
- package/dist/run/installed-native-launch.d.ts +0 -12
- package/dist/run/installed-native-launch.js +0 -46
- package/dist/run/installed-native-launch.js.map +0 -1
- package/dist/run/ios-device.d.ts +0 -21
- package/dist/run/ios-device.js +0 -254
- package/dist/run/ios-device.js.map +0 -1
- package/dist/run/ios-simulator.d.ts +0 -23
- package/dist/run/ios-simulator.js +0 -217
- package/dist/run/ios-simulator.js.map +0 -1
- package/dist/run/native-build.d.ts +0 -21
- package/dist/run/native-build.js +0 -178
- package/dist/run/native-build.js.map +0 -1
- package/dist/run/tv-build.d.ts +0 -56
- package/dist/run/tv-build.js +0 -670
- package/dist/run/tv-build.js.map +0 -1
- package/dist/run/tv-test-config.d.ts +0 -13
- package/dist/run/tv-test-config.js +0 -70
- package/dist/run/tv-test-config.js.map +0 -1
- package/dist/support-tools/android-dev-server.d.ts +0 -2
- package/dist/support-tools/android-dev-server.js +0 -124
- package/dist/support-tools/android-dev-server.js.map +0 -1
- package/dist/support-tools/android-log-transformer.d.ts +0 -10
- package/dist/support-tools/android-log-transformer.js +0 -77
- package/dist/support-tools/android-log-transformer.js.map +0 -1
- package/dist/support-tools/android-metro-build.d.ts +0 -15
- package/dist/support-tools/android-metro-build.js +0 -373
- package/dist/support-tools/android-metro-build.js.map +0 -1
- package/dist/support-tools/apple-bundler.d.ts +0 -9
- package/dist/support-tools/apple-bundler.js +0 -426
- package/dist/support-tools/apple-bundler.js.map +0 -1
- package/dist/testing/native-simulator.d.ts +0 -42
- package/dist/testing/native-simulator.js +0 -222
- package/dist/testing/native-simulator.js.map +0 -1
package/README.md
CHANGED
|
@@ -21,8 +21,8 @@ Run `npx -y skills update --global --yes` to update the installed skills later.
|
|
|
21
21
|
## Documentation
|
|
22
22
|
|
|
23
23
|
- **[MCP debugger](src/support-tools/mcp-server/README.md)** — `hst mcp:start`, debugger tools, commands by use case, examples, and RASP certification capture.
|
|
24
|
-
- **[Video capture](docs/video-capture.md)** — standalone, agent-driven, and test-run recording for
|
|
25
|
-
- **[
|
|
24
|
+
- **[Video capture](docs/video-capture.md)** — standalone, agent-driven, and test-run recording for Roku capture cards and browser emulator windows.
|
|
25
|
+
- **[Roku and browser emulation](docs/roku-browser-emulation.md)** — supported launch commands, device selection, and emulator configuration.
|
|
26
26
|
- **[docs/README.md](docs/README.md)** — index of docs in this repo (MCP + source-map note).
|
|
27
27
|
- **hosanna-ui** (separate repo): `docs/README.md` for agentic debugging and links back to this README.
|
|
28
28
|
|
|
@@ -101,7 +101,7 @@ await buildConfig.resolve({
|
|
|
101
101
|
await compiler.install({ version: '0.33.7' });
|
|
102
102
|
await roku.package({ env: 'prod', prebuild: 'npm run roku:build:prod' });
|
|
103
103
|
|
|
104
|
-
const recording = await capture.start({ platform: '
|
|
104
|
+
const recording = await capture.start({ platform: 'roku', videoDevice: 'USB Video' });
|
|
105
105
|
// Drive the app manually, through MCP, or through another automation API.
|
|
106
106
|
await recording.stop();
|
|
107
107
|
```
|
|
@@ -115,7 +115,7 @@ Common build-script replacements:
|
|
|
115
115
|
| `npx hst build-config:resolve --env dev --platform roku --out assets/meta/build-config.json` | `await buildConfig.resolve({ env: 'dev', platform: 'roku', out: 'assets/meta/build-config.json' })` |
|
|
116
116
|
| `npx hst compiler:install 0.33.7` | `await compiler.install({ version: '0.33.7' })` |
|
|
117
117
|
| `npx hst roku:package --env prod --prebuild 'npm run roku:build:prod'` | `await roku.package({ env: 'prod', prebuild: 'npm run roku:build:prod' })` |
|
|
118
|
-
| `npx hst capture
|
|
118
|
+
| `npx hst capture roku --video-device 'USB Video'` | `await capture.start({ platform: 'roku', videoDevice: 'USB Video' })` |
|
|
119
119
|
| `npx hst secrets:check` | `await secrets.check({ cwd: process.cwd() })` |
|
|
120
120
|
| `npx hst env check` | `await env.check({ cwd: process.cwd() })` |
|
|
121
121
|
| `npx hst doctor` | `await env.check({ cwd: process.cwd() })` |
|
|
@@ -123,9 +123,9 @@ Common build-script replacements:
|
|
|
123
123
|
|
|
124
124
|
Long-running APIs such as `dev.run`, `debugger.start`, `mcp.start`, and RASP-owned certification capture workflows keep the same operational behavior as the corresponding CLI commands: they start services, attach to debuggers, or wait for user/session activity. `mcp.start` and `dev.run` are wired for programmatic no-exit behavior through the top-level API.
|
|
125
125
|
|
|
126
|
-
### Installable
|
|
126
|
+
### Installable Roku browser emulator
|
|
127
127
|
|
|
128
|
-
`hosannaPwaPlugin` is a build-only Vite plugin for the
|
|
128
|
+
`hosannaPwaPlugin` is a build-only Vite plugin for the browser emulator shell. The
|
|
129
129
|
host application supplies its identity, artwork, launch selection, offline page,
|
|
130
130
|
and network-only routes; Hosanna Tools emits the manifest, registration module,
|
|
131
131
|
versioned service worker, and validated icon copies.
|
|
@@ -138,7 +138,7 @@ hosannaPwaPlugin({
|
|
|
138
138
|
id: '/',
|
|
139
139
|
name: 'Example',
|
|
140
140
|
shortName: 'Example',
|
|
141
|
-
startUrl: '/?app=example&expression=
|
|
141
|
+
startUrl: '/?app=example&expression=tv',
|
|
142
142
|
scope: '/',
|
|
143
143
|
backgroundColor: '#ffffff',
|
|
144
144
|
themeColor: '#123456',
|
|
@@ -324,52 +324,28 @@ Hosanna Tools is a comprehensive CLI toolset for the Hosanna framework that prov
|
|
|
324
324
|
The CLI commands are organized into logical groups using colon-separated namespacing:
|
|
325
325
|
|
|
326
326
|
### Development Commands
|
|
327
|
-
- `run` - Canonical cross-platform app launcher. Bare interactive runs show one destination picker; explicit platform options include Browser, Samsung Tizen, LG webOS, Roku, Apple, and Android hosts.
|
|
328
|
-
- `launch` - Restart an already-installed Roku, iOS, Apple TV, Android, or Android TV app with launch arguments. No build, install, generated config, or development server is involved. See [launching installed apps](docs/launch-installed.md).
|
|
329
|
-
- `build` - Build/package without device discovery, deployment, launch, browser opening, or log streaming. Successful Tizen/webOS builds print their absolute `.wgt`/`.ipk` path.
|
|
330
|
-
- `device:setup <tizen|webos>` - Guided, dry-runnable vendor setup: connect/authorize Samsung with SDB and verify an external signing profile, or register an LG ares alias and optionally run the official interactive key flow. HST never stores keys, certificates, or passphrases.
|
|
331
|
-
- `capture` - Record an Apple simulator, a physical-TV capture-card input, or a macOS screen/window. The default timeout is 180 seconds; use `--timeout` to override it.
|
|
332
|
-
- `target:list` - List launch targets for humans or agents, including web emulators, sims, and physical devices.
|
|
333
|
-
- `dev:start` - Run dev processes: vite, generator watch, and optional debugger
|
|
334
|
-
- `debugger:start` - Start the command debugger WebSocket proxy (only one debugger is needed for multiple apps; if the port is already in use, a friendly message is shown instead of crashing)
|
|
335
327
|
|
|
336
|
-
|
|
328
|
+
Hosanna launches native Roku or Roku emulated in the browser. Other platform launchers have been removed. Physical Roku device sessions must be reserved through Device Deck before deployment.
|
|
329
|
+
|
|
330
|
+
- `run` — Start Roku or its browser emulator. Bare interactive runs show the supported destinations.
|
|
331
|
+
- `launch roku` — Restart an installed Roku channel through ECP without building or installing.
|
|
332
|
+
- `build` — Prepare Roku or browser output without starting it.
|
|
333
|
+
- `target:list` — List the Roku emulator and physical Roku devices.
|
|
334
|
+
- `dev:start` — Start the Roku browser emulator development server and generator.
|
|
335
|
+
- `debugger:start` — Start the shared command debugger.
|
|
337
336
|
|
|
338
337
|
```bash
|
|
339
338
|
hst run
|
|
340
339
|
hst run --last
|
|
340
|
+
hst run roku dev device --device 192.168.1.229
|
|
341
|
+
hst run roku dev emulator
|
|
341
342
|
hst run browser dev emulator
|
|
342
|
-
hst
|
|
343
|
-
hst
|
|
344
|
-
hst
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
hst run --platform roku --target emulator
|
|
349
|
-
hst run --platform ios --target emulator
|
|
350
|
-
hst run --platform android --target emulator
|
|
351
|
-
hst run --platform apple-tv --target emulator
|
|
352
|
-
hst run --platform android-tv --target emulator
|
|
353
|
-
hst run --platform ios --target sim --device "iPhone 17 Pro"
|
|
354
|
-
hst run --platform ios --target device --device "George iPhone" --no-logs
|
|
355
|
-
hst run --platform android --target sim --device "Pixel_8" --no-logs
|
|
356
|
-
hst run --platform android --target device --device "RF8M62694QT" --no-logs
|
|
357
|
-
hst run --platform android-tv --target sim --device "Television_1080p" --no-logs
|
|
358
|
-
hst run --platform apple-tv --target sim --device "Apple TV 4K"
|
|
359
|
-
hst run --platform roku --target device --device "Living Room"
|
|
360
|
-
hst run --platform roku --target device --device "Living Room" --replace
|
|
361
|
-
hst target:list --platform ios --target device --json
|
|
362
|
-
hst target:list --platform android --target sim --json
|
|
363
|
-
hst target:list --platform android-tv --target sim --json
|
|
364
|
-
hst target:list --platform apple-tv --target sim --json
|
|
365
|
-
hst target:list --form-factor tv --json
|
|
366
|
-
```
|
|
367
|
-
|
|
368
|
-
Bare `hst run` in an interactive terminal discovers runnable web previews, vendor simulators, and online physical devices, then presents one flat destination picker. The last selection is placed first, so pressing Enter repeats it; `hst run --last` skips discovery and immediately uses that remembered destination. The selection is stored in the user-level `~/.hosanna-tools/run.json`, preserving existing defaults. Explicit commands remain deterministic, and non-interactive runs never open the picker.
|
|
369
|
-
|
|
370
|
-
`browser` is the canonical public platform; legacy platform input `web` is normalized to `browser`. `emulator` is the public desktop-preview target and HST retains internal target kind `web`. For Tizen and webOS, emulator mode launches the target-specific Vite config so compile-time initializers are selected; it is not a vendor simulator. `--target sim` launches a real vendor virtual device only for supported Apple/Android platforms. `--target device` launches or deploys to physical local hardware. Device/sim runs record the target and refuse to overwrite a recorded session or safe-to-kill occupied resource in non-interactive mode unless `--replace` is passed. Tizen/webOS previews cannot reuse a Browser session because their compiled alias graphs differ. Preferred run defaults live in `.hosanna-tools/run.json`, and friendly device aliases live in `.hosanna-tools/devices.json` or `~/.hosanna-tools/devices.json`; signing keys and device passphrases remain in vendor stores.
|
|
371
|
-
|
|
372
|
-
HST starts new Android virtual devices with the Android Emulator's recommended `auto` graphics mode. Set `HS_ANDROID_EMULATOR_GPU` to an emulator-supported mode such as `host` or `software` when a machine needs an explicit performance or compatibility override. HST reads this setting only when it starts the AVD; stop and restart an already-running emulator through HST after changing it. The value is passed directly to the installed emulator, so its available modes remain authoritative.
|
|
343
|
+
hst build roku dev device
|
|
344
|
+
hst target:list --json
|
|
345
|
+
hst launch roku --app-id dev --device 192.168.1.229
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
`web` aliases `browser`. Browser launches default to the `rokufhd` device preset. Existing development sessions are reused only when the requested app and port match. Configured run defaults live in `.hosanna-tools/run.json`.
|
|
373
349
|
|
|
374
350
|
### Roku Commands (`roku:*`) - Roku Deployment & Packaging
|
|
375
351
|
- `roku:run` - Deploy a Roku app to a device (supports .zip file or folder)
|
|
@@ -438,31 +414,17 @@ Supported inputs include `file/line: pkg:/components/source_0.brs(7475)`, `at ..
|
|
|
438
414
|
### Build Config Commands (`build-config`) - Runtime Configuration
|
|
439
415
|
- `build-config:resolve` - Resolve `build-config/base.json`, env/platform overlays, secrets, and optional developer profiles into the canonical runtime `build-config.json`
|
|
440
416
|
|
|
441
|
-
Production JavaScript bundles strip `console.*` calls by default. Configure this through the normal overlay chain with `build.stripLogs`: set it to `false` in `build-config/prod.json` to retain production logs, or in `build-config/prod.
|
|
417
|
+
Production JavaScript bundles strip `console.*` calls by default. Configure this through the normal overlay chain with `build.stripLogs`: set it to `false` in `build-config/prod.json` to retain production logs, or in `build-config/prod.web.json` for a platform-only exception. Non-production environments keep logs unless their overlay explicitly enables stripping.
|
|
442
418
|
|
|
443
|
-
Native Apple and Android phone/TV builds also emit a descriptor for the final packaged code bytes. See [Packaged code bundle descriptors](docs/code-bundle-descriptors.md) for version precedence, deterministic artifact paths, and the integrity-versus-authenticity security boundary.
|
|
444
419
|
|
|
445
420
|
Roku builds also populate `assetServer.baseUrl` when an overlay does not define it. `hst run` uses the resolved project Vite port and a reachable LAN IPv4 address. Override either the complete URL with `HS_ASSET_SERVER_BASE_URL`, or its parts with `HS_ASSET_SERVER_HOST` and `HS_ASSET_SERVER_PORT`; the equivalent `HOSANNA_ASSET_SERVER_*` names are also accepted. Explicit build-config overlays remain authoritative. The legacy `game.assetBaseUrl` setting is generated independently for backward compatibility.
|
|
446
421
|
|
|
447
|
-
|
|
448
|
-
Web overlay only when the exact file is absent. Physical development builds
|
|
449
|
-
resolve remote-debug loopback hosts to a reachable LAN address; override with
|
|
450
|
-
`HS_REMOTE_DEBUG_HOST`. Production TV builds force remote debugging off. Exact
|
|
451
|
-
non-secret service origins can be supplied with `--connect-origin` or
|
|
452
|
-
`HS_TV_CONNECT_ORIGINS`; unresolved package tokens and wildcard origins fail
|
|
453
|
-
staging. See [Browser, Tizen, and webOS](docs/browser-tizen-webos.md).
|
|
454
|
-
|
|
455
|
-
Native builds can resolve config immediately before the platform build:
|
|
422
|
+
Roku builds can resolve config immediately before the platform build:
|
|
456
423
|
|
|
457
424
|
```bash
|
|
458
425
|
npx hst build-config:resolve --env dev --platform roku --out assets/meta/build-config.json
|
|
459
426
|
npm run roku:build
|
|
460
427
|
|
|
461
|
-
HS_ENV=dev HS_PLATFORM=android npx hst build-config:resolve --out assets/meta/build-config.json
|
|
462
|
-
npm run android:build-code
|
|
463
|
-
|
|
464
|
-
HS_ENV=dev HS_PLATFORM=apple HS_BUILD_PROFILE=george npx hst build-config:resolve --out assets/meta/build-config.json
|
|
465
|
-
npm run apple:build-code
|
|
466
428
|
```
|
|
467
429
|
|
|
468
430
|
### CI Commands (`ci:*`) - Continuous Integration
|
|
@@ -631,7 +593,7 @@ silently break an install.
|
|
|
631
593
|
- `mcp:start` - Start the Hosanna MCP server for AI agent debugging
|
|
632
594
|
- `mcp:stop` - Stop the Hosanna MCP server
|
|
633
595
|
|
|
634
|
-
**Cursor and MCP:** Cursor does not magically attach to a terminal `hst mcp:start`. Add Hosanna as a Command MCP server (project **`.cursor/mcp.json`** or **Cursor Settings → MCP → Add Custom MCP**) so Cursor spawns **`hosanna-mcp`** over stdio. Start the command debugger/app explicitly with `hst run browser dev emulator
|
|
596
|
+
**Cursor and MCP:** Cursor does not magically attach to a terminal `hst mcp:start`. Add Hosanna as a Command MCP server (project **`.cursor/mcp.json`** or **Cursor Settings → MCP → Add Custom MCP**) so Cursor spawns **`hosanna-mcp`** over stdio. Start the command debugger/app explicitly with `hst run browser dev emulator` or `hst run roku dev device`.
|
|
635
597
|
|
|
636
598
|
### Deterministic UI testing
|
|
637
599
|
|
|
@@ -639,24 +601,20 @@ Applications own regular Vitest suites. Global setup comes from `@tantawowa/hosa
|
|
|
639
601
|
|
|
640
602
|
Add `createHosannaReporter(config)` from `@tantawowa/hosanna-tools/testing/vitest/reporter` to the application's Vitest reporters. Every run then writes a self-contained JSON and HTML report under `test-results/<testRunId>/`, updates `test-results/latest.json` and `test-results/latest.html`, and includes every Vitest result plus any named visual proofs captured by the tests.
|
|
641
603
|
|
|
642
|
-
Tests can record
|
|
643
|
-
Roku device run:
|
|
604
|
+
Tests can record a complete browser emulator or Roku device run:
|
|
644
605
|
|
|
645
606
|
```ts
|
|
646
607
|
defineHosannaTestConfig({
|
|
647
608
|
// ...
|
|
648
609
|
video: true,
|
|
649
610
|
// Browser: video: { size: { width: 1280, height: 720 } },
|
|
650
|
-
//
|
|
611
|
+
// Roku device: video: { timeoutSeconds: 300, videoDevice: 'USB Video' },
|
|
651
612
|
});
|
|
652
613
|
```
|
|
653
614
|
|
|
654
615
|
The finalized recording is written below
|
|
655
616
|
`test-results/<testRunId>/<platform>-<target>/` and embedded in the HTML report.
|
|
656
|
-
Browser
|
|
657
|
-
Physical Roku, Tizen, and webOS targets use AVFoundation or a configured macOS
|
|
658
|
-
screen/window source; HST does not claim vendor-native TV recording.
|
|
659
|
-
Native/device capture defaults to 180 seconds; override it with
|
|
617
|
+
Browser emulation uses Playwright WebM. Roku devices use their assigned capture card or a host window showing that feed. Roku capture defaults to 180 seconds; override it with
|
|
660
618
|
`timeoutSeconds`. This is a review artifact, not a replay format or executable
|
|
661
619
|
test source.
|
|
662
620
|
|
|
@@ -691,7 +649,7 @@ await hs.proof.capture('programme-focused', {
|
|
|
691
649
|
});
|
|
692
650
|
```
|
|
693
651
|
|
|
694
|
-
Image readiness requires a non-empty URI, `loadStatus: "ready"`, positive rendered dimensions, and positive decoded bitmap dimensions by default. Explicit `loadWidth`/`loadHeight` assertions remain available for controls that request a fixed decode size; zero is valid when the runtime decodes at the source size. `hs.image.byId(...)`, `hs.image.within(...)`, and semantic `hs.image.inCollectionCell(...)` locators work across
|
|
652
|
+
Image readiness requires a non-empty URI, `loadStatus: "ready"`, positive rendered dimensions, and positive decoded bitmap dimensions by default. Explicit `loadWidth`/`loadHeight` assertions remain available for controls that request a fixed decode size; zero is valid when the runtime decodes at the source size. `hs.image.byId(...)`, `hs.image.within(...)`, and semantic `hs.image.inCollectionCell(...)` locators work across Roku and its browser emulator.
|
|
695
653
|
|
|
696
654
|
Screenshots and proofs wait for the command-plane hierarchy and focus to remain stable for 300ms by default, then allow a short platform render-settle window. Consecutive screenshots are also spaced automatically. Override this only for known platform behaviour through the test config's `screenshot` settings or per-capture options; failure diagnostics bypass the stable-frame wait so they can still capture broken states.
|
|
697
655
|
|
|
@@ -714,14 +672,13 @@ defineHosannaTestConfig({
|
|
|
714
672
|
});
|
|
715
673
|
```
|
|
716
674
|
|
|
717
|
-
Use `createHosannaTestTarget(config)` with Vitest's standard conditional APIs. Selectors
|
|
675
|
+
Use `createHosannaTestTarget(config)` with Vitest's standard conditional APIs. Selectors distinguish Roku browser emulation and physical Roku targets:
|
|
718
676
|
|
|
719
677
|
```ts
|
|
720
678
|
const target = createHosannaTestTarget(config);
|
|
721
679
|
|
|
722
680
|
test.runIf(target.matches({ platform: 'roku', target: 'device' }))('Roku only', async ({ hs }) => {});
|
|
723
|
-
test.runIf(target.matches({
|
|
724
|
-
test.runIf(target.matches({ target: 'web' }))('all browser flavours', async ({ hs }) => {});
|
|
681
|
+
test.runIf(target.matches({ target: 'web' }))('Roku browser emulation', async ({ hs }) => {});
|
|
725
682
|
```
|
|
726
683
|
|
|
727
684
|
Browser Channel Store emulation supports per-test `success`, `cancelled`, and `failed` outcomes when `channelStore.testMode.enabled` is present in the test overlay. Set it from a named precondition with `hs.mocks.channelStore.setPurchaseOutcome(...)`. This API refuses physical-device targets. Roku purchase tests use Roku Pay [billing testing](https://developer.roku.com/dev/docs/billing-testing), a linked [Roku test user](https://developer.roku.com/dev/docs/test-users), and real Channel Store/OS purchase screens; keep them opt-in and serial.
|
|
@@ -732,31 +689,12 @@ For Roku device suites, the launcher builds and deploys before the test launch,
|
|
|
732
689
|
|
|
733
690
|
```bash
|
|
734
691
|
# Development workflow
|
|
735
|
-
hst run browser dev emulator #
|
|
736
|
-
hst run
|
|
737
|
-
hst run
|
|
738
|
-
hst
|
|
739
|
-
hst
|
|
740
|
-
hst
|
|
741
|
-
hst run webos dev device "LG living room"
|
|
742
|
-
hst run --platform roku --target emulator
|
|
743
|
-
hst run --platform ios --target emulator
|
|
744
|
-
hst run --platform android --target emulator
|
|
745
|
-
hst run --platform apple-tv --target emulator
|
|
746
|
-
hst run --platform android-tv --target emulator
|
|
747
|
-
hst run --platform ios --target sim --device "iPhone 17 Pro"
|
|
748
|
-
hst run --platform ios --target device --device "George iPhone" --no-logs
|
|
749
|
-
hst run --platform android --target sim --device "Pixel_8" --no-logs
|
|
750
|
-
hst run --platform android --target device --device "RF8M62694QT" --no-logs
|
|
751
|
-
hst run --platform android-tv --target sim --device "Television_1080p" --no-logs
|
|
752
|
-
hst run --platform apple-tv --target sim --device "Apple TV 4K"
|
|
753
|
-
hst run --platform roku --target device --device "Living Room"
|
|
754
|
-
hst run --platform roku --target device --device "Living Room" --replace
|
|
755
|
-
hst target:list --platform ios --target device --json
|
|
756
|
-
hst target:list --platform android --target sim --json
|
|
757
|
-
hst target:list --platform android-tv --target sim --json
|
|
758
|
-
hst target:list --platform apple-tv --target sim --json
|
|
759
|
-
hst target:list --form-factor tv --json
|
|
692
|
+
hst run browser dev emulator # Roku browser emulator, FHD by default
|
|
693
|
+
hst run roku dev emulator --device rokuhd
|
|
694
|
+
hst run roku dev device --device "Living Room"
|
|
695
|
+
hst run roku dev device --device "Living Room" --replace
|
|
696
|
+
hst target:list --platform roku --target device --json
|
|
697
|
+
hst target:list --target emulator --json
|
|
760
698
|
hst generate:all --watch # Generate code with file watching
|
|
761
699
|
hst dev:start # Lower-level dev server task used by hst run
|
|
762
700
|
|
|
@@ -1,44 +1,9 @@
|
|
|
1
1
|
import type { HosannaPwaIcon } from '../vite-pwa.js';
|
|
2
|
-
export type AppArtworkPlatform = 'browser' | 'roku'
|
|
2
|
+
export type AppArtworkPlatform = 'browser' | 'roku';
|
|
3
3
|
/** Build-time sources. Paths are relative to this manifest, never runtime URLs. */
|
|
4
4
|
export interface AppArtworkManifest {
|
|
5
5
|
schemaVersion: 1;
|
|
6
6
|
icon?: string;
|
|
7
|
-
ios?: {
|
|
8
|
-
icon?: string;
|
|
9
|
-
launchScreen?: {
|
|
10
|
-
image: string;
|
|
11
|
-
backgroundColor: string;
|
|
12
|
-
};
|
|
13
|
-
};
|
|
14
|
-
android?: {
|
|
15
|
-
icon?: string;
|
|
16
|
-
adaptive?: {
|
|
17
|
-
foreground: string;
|
|
18
|
-
background: string;
|
|
19
|
-
monochrome?: string;
|
|
20
|
-
};
|
|
21
|
-
launchScreen?: {
|
|
22
|
-
backgroundColor: string;
|
|
23
|
-
icon?: string;
|
|
24
|
-
};
|
|
25
|
-
};
|
|
26
|
-
androidTv?: {
|
|
27
|
-
icon?: string;
|
|
28
|
-
banner: string;
|
|
29
|
-
launchScreen?: {
|
|
30
|
-
backgroundColor: string;
|
|
31
|
-
icon?: string;
|
|
32
|
-
};
|
|
33
|
-
};
|
|
34
|
-
appleTv?: {
|
|
35
|
-
assetCatalog: string;
|
|
36
|
-
appIconName?: string;
|
|
37
|
-
launchScreen?: {
|
|
38
|
-
image: string;
|
|
39
|
-
backgroundColor: string;
|
|
40
|
-
};
|
|
41
|
-
};
|
|
42
7
|
roku?: {
|
|
43
8
|
channel: {
|
|
44
9
|
hd: string;
|
|
@@ -53,7 +18,6 @@ export interface AppArtworkManifest {
|
|
|
53
18
|
web?: {
|
|
54
19
|
icon?: string;
|
|
55
20
|
maskableIcon?: string;
|
|
56
|
-
appleTouchIcon?: string;
|
|
57
21
|
favicon?: string;
|
|
58
22
|
loadingScreen?: {
|
|
59
23
|
image: string;
|
|
@@ -75,26 +39,6 @@ export interface PreparedAppArtwork {
|
|
|
75
39
|
inputHash: string;
|
|
76
40
|
outputDir: string;
|
|
77
41
|
receiptPath: string;
|
|
78
|
-
apple?: {
|
|
79
|
-
assetCatalogPath: string;
|
|
80
|
-
appIconName: string;
|
|
81
|
-
watchAppIconName?: string;
|
|
82
|
-
launchScreen?: {
|
|
83
|
-
storyboardPath: string;
|
|
84
|
-
storyboardName: string;
|
|
85
|
-
imageName: string;
|
|
86
|
-
backgroundColor: string;
|
|
87
|
-
};
|
|
88
|
-
};
|
|
89
|
-
android?: {
|
|
90
|
-
resourceDirectory: string;
|
|
91
|
-
iconResource: string;
|
|
92
|
-
bannerResource?: string;
|
|
93
|
-
launchScreen?: {
|
|
94
|
-
iconResource: string;
|
|
95
|
-
backgroundColor: string;
|
|
96
|
-
};
|
|
97
|
-
};
|
|
98
42
|
roku?: {
|
|
99
43
|
files: Array<{
|
|
100
44
|
source: string;
|
|
@@ -104,7 +48,6 @@ export interface PreparedAppArtwork {
|
|
|
104
48
|
};
|
|
105
49
|
web?: {
|
|
106
50
|
icons: HosannaPwaIcon[];
|
|
107
|
-
appleTouchIcon?: string;
|
|
108
51
|
favicon?: {
|
|
109
52
|
source: string;
|
|
110
53
|
src: string;
|
|
@@ -116,7 +59,7 @@ export interface PreparedAppArtwork {
|
|
|
116
59
|
};
|
|
117
60
|
};
|
|
118
61
|
}
|
|
119
|
-
/** Prepare one selected target without modifying
|
|
62
|
+
/** Prepare one selected target without modifying supplied sources. */
|
|
120
63
|
export declare function prepareAppArtwork(options: PrepareAppArtworkOptions): Promise<PreparedAppArtwork>;
|
|
121
64
|
/** Validate the generic local manifest shape before an app-owned downloader activates it. */
|
|
122
65
|
export declare function validateAppArtworkManifest(value: unknown): AppArtworkManifest;
|