@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.
Files changed (197) hide show
  1. package/README.md +38 -100
  2. package/dist/artwork/app-artwork.d.ts +2 -59
  3. package/dist/artwork/app-artwork.js +26 -243
  4. package/dist/artwork/app-artwork.js.map +1 -1
  5. package/dist/build-info.json +3 -3
  6. package/dist/capture/mcp-tools.d.ts +1 -1
  7. package/dist/capture/mcp-tools.js +2 -4
  8. package/dist/capture/mcp-tools.js.map +1 -1
  9. package/dist/capture/video-capture.d.ts +2 -13
  10. package/dist/capture/video-capture.js +8 -53
  11. package/dist/capture/video-capture.js.map +1 -1
  12. package/dist/cli.js +44 -338
  13. package/dist/cli.js.map +1 -1
  14. package/dist/device/device-cli.js +4 -19
  15. package/dist/device/device-cli.js.map +1 -1
  16. package/dist/device/devices-file.js +4 -7
  17. package/dist/device/devices-file.js.map +1 -1
  18. package/dist/device/driver-registry.js +3 -31
  19. package/dist/device/driver-registry.js.map +1 -1
  20. package/dist/device/types.d.ts +1 -1
  21. package/dist/generation/shapes/shape-compiler.js +9 -0
  22. package/dist/generation/shapes/shape-compiler.js.map +1 -1
  23. package/dist/index.d.ts +3 -16
  24. package/dist/index.js +1 -22
  25. package/dist/index.js.map +1 -1
  26. package/dist/lib/app-config-resolver.js +10 -19
  27. package/dist/lib/app-config-resolver.js.map +1 -1
  28. package/dist/run/destination-picker.js +5 -60
  29. package/dist/run/destination-picker.js.map +1 -1
  30. package/dist/run/executor.d.ts +0 -9
  31. package/dist/run/executor.js +50 -119
  32. package/dist/run/executor.js.map +1 -1
  33. package/dist/run/launch-installed.d.ts +5 -14
  34. package/dist/run/launch-installed.js +17 -58
  35. package/dist/run/launch-installed.js.map +1 -1
  36. package/dist/run/planner.d.ts +2 -10
  37. package/dist/run/planner.js +26 -778
  38. package/dist/run/planner.js.map +1 -1
  39. package/dist/run/run-config.d.ts +5 -12
  40. package/dist/run/run-config.js +8 -36
  41. package/dist/run/run-config.js.map +1 -1
  42. package/dist/run/run-controller.d.ts +1 -43
  43. package/dist/run/run-controller.js +14 -1572
  44. package/dist/run/run-controller.js.map +1 -1
  45. package/dist/run/targets.d.ts +1 -65
  46. package/dist/run/targets.js +13 -282
  47. package/dist/run/targets.js.map +1 -1
  48. package/dist/run/types.d.ts +8 -13
  49. package/dist/run/types.js +14 -19
  50. package/dist/run/types.js.map +1 -1
  51. package/dist/run/web-build.d.ts +1 -0
  52. package/dist/run/web-build.js +15 -0
  53. package/dist/run/web-build.js.map +1 -1
  54. package/dist/support-tools/build-config-resolver.js +7 -77
  55. package/dist/support-tools/build-config-resolver.js.map +1 -1
  56. package/dist/support-tools/dev-runner.js +2 -2
  57. package/dist/support-tools/dev-runner.js.map +1 -1
  58. package/dist/support-tools/mcp-server/tools.js +2 -2
  59. package/dist/support-tools/mcp-server/tools.js.map +1 -1
  60. package/dist/testing/client.js +1 -35
  61. package/dist/testing/client.js.map +1 -1
  62. package/dist/testing/launch-args.d.ts +11 -0
  63. package/dist/testing/launch-args.js +8 -0
  64. package/dist/testing/launch-args.js.map +1 -0
  65. package/dist/testing/launcher.d.ts +1 -1
  66. package/dist/testing/launcher.js +44 -153
  67. package/dist/testing/launcher.js.map +1 -1
  68. package/dist/testing/physical-tv.d.ts +0 -11
  69. package/dist/testing/physical-tv.js +0 -49
  70. package/dist/testing/physical-tv.js.map +1 -1
  71. package/dist/testing/stream-config.d.ts +7 -0
  72. package/dist/testing/stream-config.js +31 -0
  73. package/dist/testing/stream-config.js.map +1 -0
  74. package/dist/testing/target.js +6 -3
  75. package/dist/testing/target.js.map +1 -1
  76. package/dist/testing/types.d.ts +5 -10
  77. package/dist/updater/framework-installer.d.ts +0 -1
  78. package/dist/updater/framework-installer.js +0 -13
  79. package/dist/updater/framework-installer.js.map +1 -1
  80. package/dist/updater/license-manager.d.ts +1 -2
  81. package/dist/updater/license-manager.js +1 -14
  82. package/dist/updater/license-manager.js.map +1 -1
  83. package/dist/updater/sdk-manager.d.ts +1 -1
  84. package/dist/updater/sdk-manager.js +1 -1
  85. package/dist/vite-app-artwork.js +1 -6
  86. package/dist/vite-app-artwork.js.map +1 -1
  87. package/dist/vite-pwa.d.ts +0 -3
  88. package/dist/vite-pwa.js +0 -9
  89. package/dist/vite-pwa.js.map +1 -1
  90. package/package.json +2 -8
  91. package/dist/artwork/native-artwork.d.ts +0 -33
  92. package/dist/artwork/native-artwork.js +0 -297
  93. package/dist/artwork/native-artwork.js.map +0 -1
  94. package/dist/artwork/packaged-artwork.d.ts +0 -10
  95. package/dist/artwork/packaged-artwork.js +0 -465
  96. package/dist/artwork/packaged-artwork.js.map +0 -1
  97. package/dist/device/drivers/tizen-driver.d.ts +0 -19
  98. package/dist/device/drivers/tizen-driver.js +0 -178
  99. package/dist/device/drivers/tizen-driver.js.map +0 -1
  100. package/dist/device/drivers/webos-driver.d.ts +0 -15
  101. package/dist/device/drivers/webos-driver.js +0 -175
  102. package/dist/device/drivers/webos-driver.js.map +0 -1
  103. package/dist/device/setup.d.ts +0 -39
  104. package/dist/device/setup.js +0 -168
  105. package/dist/device/setup.js.map +0 -1
  106. package/dist/native/app-entry-generation.d.ts +0 -9
  107. package/dist/native/app-entry-generation.js +0 -100
  108. package/dist/native/app-entry-generation.js.map +0 -1
  109. package/dist/native/artifacts.d.ts +0 -104
  110. package/dist/native/artifacts.js +0 -747
  111. package/dist/native/artifacts.js.map +0 -1
  112. package/dist/native/native-project.d.ts +0 -108
  113. package/dist/native/native-project.js +0 -1590
  114. package/dist/native/native-project.js.map +0 -1
  115. package/dist/native/prepared-runtime.d.ts +0 -14
  116. package/dist/native/prepared-runtime.js +0 -20
  117. package/dist/native/prepared-runtime.js.map +0 -1
  118. package/dist/native/templates/android/AndroidAutoManifest.xml +0 -33
  119. package/dist/native/templates/android/AndroidManifest.xml +0 -20
  120. package/dist/native/templates/android/WearOsManifest.xml +0 -31
  121. package/dist/native/templates/android/app-build.gradle.kts +0 -300
  122. package/dist/native/templates/android/automotive_app_desc.xml +0 -5
  123. package/dist/native/templates/android/build.gradle.kts +0 -5
  124. package/dist/native/templates/android/car_attribution_icon.xml +0 -10
  125. package/dist/native/templates/android/colors.xml +0 -3
  126. package/dist/native/templates/android/gradle-wrapper.jar +0 -0
  127. package/dist/native/templates/android/gradle-wrapper.properties +0 -7
  128. package/dist/native/templates/android/gradle.properties +0 -3
  129. package/dist/native/templates/android/gradlew +0 -251
  130. package/dist/native/templates/android/gradlew.bat +0 -94
  131. package/dist/native/templates/android/hosanna-animated-image-proguard-rules.pro +0 -5
  132. package/dist/native/templates/android/launcher.xml +0 -12
  133. package/dist/native/templates/android/settings.gradle.kts +0 -18
  134. package/dist/native/templates/android/strings.xml +0 -3
  135. package/dist/native/templates/android/styles.xml +0 -8
  136. package/dist/native/templates/apple/AppIconContents.json +0 -7
  137. package/dist/native/templates/apple/HosannaCarPlay.entitlements +0 -8
  138. package/dist/native/templates/apple/HosannaIosApp.swift +0 -110
  139. package/dist/native/templates/apple/HosannaTvApp.swift +0 -118
  140. package/dist/native/templates/apple/HosannaWatchApp.swift +0 -10
  141. package/dist/native/templates/apple/Info.carplay.plist +0 -43
  142. package/dist/native/templates/apple/Info.plist +0 -24
  143. package/dist/native/templates/apple/Info.watchos.plist +0 -26
  144. package/dist/native/templates/apple/Podfile.example +0 -7
  145. package/dist/native/templates/apple/project.yml +0 -107
  146. package/dist/native/templates/artifacts/verify-aab.mjs +0 -11
  147. package/dist/run/android-auto.d.ts +0 -11
  148. package/dist/run/android-auto.js +0 -121
  149. package/dist/run/android-auto.js.map +0 -1
  150. package/dist/run/android-emulator.d.ts +0 -80
  151. package/dist/run/android-emulator.js +0 -1208
  152. package/dist/run/android-emulator.js.map +0 -1
  153. package/dist/run/apple-tv.d.ts +0 -35
  154. package/dist/run/apple-tv.js +0 -410
  155. package/dist/run/apple-tv.js.map +0 -1
  156. package/dist/run/apple-watch.d.ts +0 -49
  157. package/dist/run/apple-watch.js +0 -389
  158. package/dist/run/apple-watch.js.map +0 -1
  159. package/dist/run/carplay.d.ts +0 -17
  160. package/dist/run/carplay.js +0 -232
  161. package/dist/run/carplay.js.map +0 -1
  162. package/dist/run/code-bundle-descriptor.d.ts +0 -31
  163. package/dist/run/code-bundle-descriptor.js +0 -68
  164. package/dist/run/code-bundle-descriptor.js.map +0 -1
  165. package/dist/run/installed-native-launch.d.ts +0 -12
  166. package/dist/run/installed-native-launch.js +0 -46
  167. package/dist/run/installed-native-launch.js.map +0 -1
  168. package/dist/run/ios-device.d.ts +0 -21
  169. package/dist/run/ios-device.js +0 -254
  170. package/dist/run/ios-device.js.map +0 -1
  171. package/dist/run/ios-simulator.d.ts +0 -23
  172. package/dist/run/ios-simulator.js +0 -217
  173. package/dist/run/ios-simulator.js.map +0 -1
  174. package/dist/run/native-build.d.ts +0 -21
  175. package/dist/run/native-build.js +0 -178
  176. package/dist/run/native-build.js.map +0 -1
  177. package/dist/run/tv-build.d.ts +0 -56
  178. package/dist/run/tv-build.js +0 -670
  179. package/dist/run/tv-build.js.map +0 -1
  180. package/dist/run/tv-test-config.d.ts +0 -13
  181. package/dist/run/tv-test-config.js +0 -70
  182. package/dist/run/tv-test-config.js.map +0 -1
  183. package/dist/support-tools/android-dev-server.d.ts +0 -2
  184. package/dist/support-tools/android-dev-server.js +0 -124
  185. package/dist/support-tools/android-dev-server.js.map +0 -1
  186. package/dist/support-tools/android-log-transformer.d.ts +0 -10
  187. package/dist/support-tools/android-log-transformer.js +0 -77
  188. package/dist/support-tools/android-log-transformer.js.map +0 -1
  189. package/dist/support-tools/android-metro-build.d.ts +0 -15
  190. package/dist/support-tools/android-metro-build.js +0 -373
  191. package/dist/support-tools/android-metro-build.js.map +0 -1
  192. package/dist/support-tools/apple-bundler.d.ts +0 -9
  193. package/dist/support-tools/apple-bundler.js +0 -426
  194. package/dist/support-tools/apple-bundler.js.map +0 -1
  195. package/dist/testing/native-simulator.d.ts +0 -42
  196. package/dist/testing/native-simulator.js +0 -222
  197. 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 Apple simulators, physical-TV capture cards, and macOS windows.
25
- - **[Browser, Tizen, and webOS](docs/browser-tizen-webos.md)** — canonical commands, desktop previews, package/device workflows, vendor trust, and CSP/LAN policy.
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: 'ios', device: 'iPhone 17 Pro' });
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 ios --device 'iPhone 17 Pro'` | `await capture.start({ platform: 'ios', device: 'iPhone 17 Pro' })` |
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 Browser builds
126
+ ### Installable Roku browser emulator
127
127
 
128
- `hosannaPwaPlugin` is a build-only Vite plugin for the generic install shell. 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=phone',
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
- Examples:
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 run tizen dev emulator
343
- hst run webos dev emulator
344
- hst build tizen dev device --signing-profile samsung-tv-dev
345
- hst build webos dev device
346
- hst run tizen dev device "Samsung living room" --signing-profile samsung-tv-dev
347
- hst run webos dev device "LG living room"
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.apple.json` / `build-config/prod.web.json` for a platform-only exception. Non-production environments keep logs unless their overlay explicitly enables stripping. Apple `prod` builds use Xcode `Release`; other environments continue to use `Debug`.
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
- Tizen/webOS builds prefer exact target overlays and fall back to the matching
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`, `hst run tizen dev emulator`, `hst run webos dev emulator`, or `hst run roku dev device`.
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 the complete owned browser, supported Apple simulator, or
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
- // Native/device: video: { timeoutSeconds: 300, videoDevice: 'USB Video' },
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 targets use Playwright WebM. iOS/Apple TV simulators use `simctl` MP4.
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 browser, Roku, and later native drivers.
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 accept one platform or a set, and distinguish browser, simulator, and physical-device targets:
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({ platform: ['ios', 'android'], target: 'sim' }))('mobile simulators', async ({ hs }) => {});
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 # Canonical Browser host
736
- hst run tizen dev emulator # Desktop Tizen composition preview
737
- hst run webos dev emulator # Desktop webOS composition preview
738
- hst build tizen dev device --signing-profile samsung-tv-dev
739
- hst build webos dev device
740
- hst run tizen dev device "Samsung living room" --signing-profile samsung-tv-dev
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' | 'ios' | 'apple-tv' | 'android' | 'android-tv';
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 any supplied source or native project. */
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;