@tantawowa/hosanna-tools 3.32.0 → 4.0.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 (204) hide show
  1. package/README.md +51 -108
  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 +50 -344
  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/emitters/RuntimeEmitter.js +1 -12
  22. package/dist/generation/emitters/RuntimeEmitter.js.map +1 -1
  23. package/dist/generation/import-utils.js +2 -11
  24. package/dist/generation/import-utils.js.map +1 -1
  25. package/dist/generation/shapes/shape-compiler.js +9 -0
  26. package/dist/generation/shapes/shape-compiler.js.map +1 -1
  27. package/dist/index.d.ts +3 -16
  28. package/dist/index.js +1 -22
  29. package/dist/index.js.map +1 -1
  30. package/dist/lib/app-config-resolver.js +10 -19
  31. package/dist/lib/app-config-resolver.js.map +1 -1
  32. package/dist/lib/hosanna-config.js +0 -4
  33. package/dist/lib/hosanna-config.js.map +1 -1
  34. package/dist/run/destination-picker.js +5 -60
  35. package/dist/run/destination-picker.js.map +1 -1
  36. package/dist/run/executor.d.ts +0 -9
  37. package/dist/run/executor.js +50 -119
  38. package/dist/run/executor.js.map +1 -1
  39. package/dist/run/launch-installed.d.ts +5 -14
  40. package/dist/run/launch-installed.js +17 -58
  41. package/dist/run/launch-installed.js.map +1 -1
  42. package/dist/run/planner.d.ts +2 -10
  43. package/dist/run/planner.js +26 -778
  44. package/dist/run/planner.js.map +1 -1
  45. package/dist/run/run-config.d.ts +5 -12
  46. package/dist/run/run-config.js +8 -36
  47. package/dist/run/run-config.js.map +1 -1
  48. package/dist/run/run-controller.d.ts +1 -43
  49. package/dist/run/run-controller.js +14 -1572
  50. package/dist/run/run-controller.js.map +1 -1
  51. package/dist/run/targets.d.ts +1 -65
  52. package/dist/run/targets.js +13 -282
  53. package/dist/run/targets.js.map +1 -1
  54. package/dist/run/types.d.ts +8 -13
  55. package/dist/run/types.js +14 -19
  56. package/dist/run/types.js.map +1 -1
  57. package/dist/run/web-build.d.ts +1 -0
  58. package/dist/run/web-build.js +15 -0
  59. package/dist/run/web-build.js.map +1 -1
  60. package/dist/support-tools/build-config-resolver.js +7 -77
  61. package/dist/support-tools/build-config-resolver.js.map +1 -1
  62. package/dist/support-tools/dev-runner.js +2 -2
  63. package/dist/support-tools/dev-runner.js.map +1 -1
  64. package/dist/support-tools/mcp-server/rasp-exporter.js +1 -1
  65. package/dist/support-tools/mcp-server/tools.js +2 -2
  66. package/dist/support-tools/mcp-server/tools.js.map +1 -1
  67. package/dist/testing/client.js +1 -35
  68. package/dist/testing/client.js.map +1 -1
  69. package/dist/testing/launch-args.d.ts +11 -0
  70. package/dist/testing/launch-args.js +8 -0
  71. package/dist/testing/launch-args.js.map +1 -0
  72. package/dist/testing/launcher.d.ts +1 -1
  73. package/dist/testing/launcher.js +44 -153
  74. package/dist/testing/launcher.js.map +1 -1
  75. package/dist/testing/physical-tv.d.ts +0 -11
  76. package/dist/testing/physical-tv.js +0 -49
  77. package/dist/testing/physical-tv.js.map +1 -1
  78. package/dist/testing/stream-config.d.ts +7 -0
  79. package/dist/testing/stream-config.js +31 -0
  80. package/dist/testing/stream-config.js.map +1 -0
  81. package/dist/testing/target.js +6 -3
  82. package/dist/testing/target.js.map +1 -1
  83. package/dist/testing/types.d.ts +5 -10
  84. package/dist/updater/framework-installer.d.ts +0 -1
  85. package/dist/updater/framework-installer.js +0 -13
  86. package/dist/updater/framework-installer.js.map +1 -1
  87. package/dist/updater/license-manager.d.ts +1 -2
  88. package/dist/updater/license-manager.js +1 -14
  89. package/dist/updater/license-manager.js.map +1 -1
  90. package/dist/updater/sdk-manager.d.ts +1 -1
  91. package/dist/updater/sdk-manager.js +1 -1
  92. package/dist/vite-app-artwork.js +1 -6
  93. package/dist/vite-app-artwork.js.map +1 -1
  94. package/dist/vite-pwa.d.ts +0 -3
  95. package/dist/vite-pwa.js +0 -9
  96. package/dist/vite-pwa.js.map +1 -1
  97. package/package.json +5 -9
  98. package/dist/artwork/native-artwork.d.ts +0 -33
  99. package/dist/artwork/native-artwork.js +0 -297
  100. package/dist/artwork/native-artwork.js.map +0 -1
  101. package/dist/artwork/packaged-artwork.d.ts +0 -10
  102. package/dist/artwork/packaged-artwork.js +0 -465
  103. package/dist/artwork/packaged-artwork.js.map +0 -1
  104. package/dist/device/drivers/tizen-driver.d.ts +0 -19
  105. package/dist/device/drivers/tizen-driver.js +0 -178
  106. package/dist/device/drivers/tizen-driver.js.map +0 -1
  107. package/dist/device/drivers/webos-driver.d.ts +0 -15
  108. package/dist/device/drivers/webos-driver.js +0 -175
  109. package/dist/device/drivers/webos-driver.js.map +0 -1
  110. package/dist/device/setup.d.ts +0 -39
  111. package/dist/device/setup.js +0 -168
  112. package/dist/device/setup.js.map +0 -1
  113. package/dist/native/app-entry-generation.d.ts +0 -9
  114. package/dist/native/app-entry-generation.js +0 -100
  115. package/dist/native/app-entry-generation.js.map +0 -1
  116. package/dist/native/artifacts.d.ts +0 -104
  117. package/dist/native/artifacts.js +0 -747
  118. package/dist/native/artifacts.js.map +0 -1
  119. package/dist/native/native-project.d.ts +0 -108
  120. package/dist/native/native-project.js +0 -1590
  121. package/dist/native/native-project.js.map +0 -1
  122. package/dist/native/prepared-runtime.d.ts +0 -14
  123. package/dist/native/prepared-runtime.js +0 -20
  124. package/dist/native/prepared-runtime.js.map +0 -1
  125. package/dist/native/templates/android/AndroidAutoManifest.xml +0 -33
  126. package/dist/native/templates/android/AndroidManifest.xml +0 -20
  127. package/dist/native/templates/android/WearOsManifest.xml +0 -31
  128. package/dist/native/templates/android/app-build.gradle.kts +0 -300
  129. package/dist/native/templates/android/automotive_app_desc.xml +0 -5
  130. package/dist/native/templates/android/build.gradle.kts +0 -5
  131. package/dist/native/templates/android/car_attribution_icon.xml +0 -10
  132. package/dist/native/templates/android/colors.xml +0 -3
  133. package/dist/native/templates/android/gradle-wrapper.jar +0 -0
  134. package/dist/native/templates/android/gradle-wrapper.properties +0 -7
  135. package/dist/native/templates/android/gradle.properties +0 -3
  136. package/dist/native/templates/android/gradlew +0 -251
  137. package/dist/native/templates/android/gradlew.bat +0 -94
  138. package/dist/native/templates/android/hosanna-animated-image-proguard-rules.pro +0 -5
  139. package/dist/native/templates/android/launcher.xml +0 -12
  140. package/dist/native/templates/android/settings.gradle.kts +0 -18
  141. package/dist/native/templates/android/strings.xml +0 -3
  142. package/dist/native/templates/android/styles.xml +0 -8
  143. package/dist/native/templates/apple/AppIconContents.json +0 -7
  144. package/dist/native/templates/apple/HosannaCarPlay.entitlements +0 -8
  145. package/dist/native/templates/apple/HosannaIosApp.swift +0 -110
  146. package/dist/native/templates/apple/HosannaTvApp.swift +0 -118
  147. package/dist/native/templates/apple/HosannaWatchApp.swift +0 -10
  148. package/dist/native/templates/apple/Info.carplay.plist +0 -43
  149. package/dist/native/templates/apple/Info.plist +0 -24
  150. package/dist/native/templates/apple/Info.watchos.plist +0 -26
  151. package/dist/native/templates/apple/Podfile.example +0 -7
  152. package/dist/native/templates/apple/project.yml +0 -107
  153. package/dist/native/templates/artifacts/verify-aab.mjs +0 -11
  154. package/dist/run/android-auto.d.ts +0 -11
  155. package/dist/run/android-auto.js +0 -121
  156. package/dist/run/android-auto.js.map +0 -1
  157. package/dist/run/android-emulator.d.ts +0 -80
  158. package/dist/run/android-emulator.js +0 -1208
  159. package/dist/run/android-emulator.js.map +0 -1
  160. package/dist/run/apple-tv.d.ts +0 -35
  161. package/dist/run/apple-tv.js +0 -410
  162. package/dist/run/apple-tv.js.map +0 -1
  163. package/dist/run/apple-watch.d.ts +0 -49
  164. package/dist/run/apple-watch.js +0 -389
  165. package/dist/run/apple-watch.js.map +0 -1
  166. package/dist/run/carplay.d.ts +0 -17
  167. package/dist/run/carplay.js +0 -232
  168. package/dist/run/carplay.js.map +0 -1
  169. package/dist/run/code-bundle-descriptor.d.ts +0 -31
  170. package/dist/run/code-bundle-descriptor.js +0 -68
  171. package/dist/run/code-bundle-descriptor.js.map +0 -1
  172. package/dist/run/installed-native-launch.d.ts +0 -12
  173. package/dist/run/installed-native-launch.js +0 -46
  174. package/dist/run/installed-native-launch.js.map +0 -1
  175. package/dist/run/ios-device.d.ts +0 -21
  176. package/dist/run/ios-device.js +0 -254
  177. package/dist/run/ios-device.js.map +0 -1
  178. package/dist/run/ios-simulator.d.ts +0 -23
  179. package/dist/run/ios-simulator.js +0 -217
  180. package/dist/run/ios-simulator.js.map +0 -1
  181. package/dist/run/native-build.d.ts +0 -21
  182. package/dist/run/native-build.js +0 -178
  183. package/dist/run/native-build.js.map +0 -1
  184. package/dist/run/tv-build.d.ts +0 -56
  185. package/dist/run/tv-build.js +0 -670
  186. package/dist/run/tv-build.js.map +0 -1
  187. package/dist/run/tv-test-config.d.ts +0 -13
  188. package/dist/run/tv-test-config.js +0 -70
  189. package/dist/run/tv-test-config.js.map +0 -1
  190. package/dist/support-tools/android-dev-server.d.ts +0 -2
  191. package/dist/support-tools/android-dev-server.js +0 -124
  192. package/dist/support-tools/android-dev-server.js.map +0 -1
  193. package/dist/support-tools/android-log-transformer.d.ts +0 -10
  194. package/dist/support-tools/android-log-transformer.js +0 -77
  195. package/dist/support-tools/android-log-transformer.js.map +0 -1
  196. package/dist/support-tools/android-metro-build.d.ts +0 -15
  197. package/dist/support-tools/android-metro-build.js +0 -373
  198. package/dist/support-tools/android-metro-build.js.map +0 -1
  199. package/dist/support-tools/apple-bundler.d.ts +0 -9
  200. package/dist/support-tools/apple-bundler.js +0 -426
  201. package/dist/support-tools/apple-bundler.js.map +0 -1
  202. package/dist/testing/native-simulator.d.ts +0 -42
  203. package/dist/testing/native-simulator.js +0 -222
  204. package/dist/testing/native-simulator.js.map +0 -1
package/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # hosanna-tools
2
2
 
3
+ This package lives in `packages/tools` in the Hosanna UI monorepo. It retains its
4
+ own package name, version, and lockfile. Run its development commands from this
5
+ directory; framework source remains at the repository root.
6
+
3
7
  ## Agent skills
4
8
 
5
9
  The repository instructions use TantaWowa's ClickUp workflow skills, Matt
@@ -7,7 +11,7 @@ Pocock's engineering skills, and pstack's `unslop` skill. Install them once on
7
11
  each developer machine:
8
12
 
9
13
  ```sh
10
- npx -y skills add TantaWowa/hosanna-tools --global --skill work-on-ticket hope-platform-planning hope-platform-architecture-ownership --agent '*' --full-depth --yes
14
+ npx -y skills add TantaWowa/hosanna-tools --global --skill work-on-ticket --agent '*' --full-depth --yes
11
15
  npx -y skills add mattpocock/skills --global --all
12
16
  npx -y skills add cursor/plugins --global --skill unslop --agent '*' --full-depth --yes
13
17
  ```
@@ -21,10 +25,10 @@ Run `npx -y skills update --global --yes` to update the installed skills later.
21
25
  ## Documentation
22
26
 
23
27
  - **[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.
28
+ - **[Video capture](docs/video-capture.md)** — standalone, agent-driven, and test-run recording for Roku capture cards and browser emulator windows.
29
+ - **[Roku and browser emulation](docs/roku-browser-emulation.md)** — supported launch commands, device selection, and emulator configuration.
26
30
  - **[docs/README.md](docs/README.md)** — index of docs in this repo (MCP + source-map note).
27
- - **hosanna-ui** (separate repo): `docs/README.md` for agentic debugging and links back to this README.
31
+ - **[Hosanna UI framework](../../docs/README.md)** for agentic debugging and framework documentation.
28
32
 
29
33
  ## To use the tool
30
34
 
@@ -101,7 +105,7 @@ await buildConfig.resolve({
101
105
  await compiler.install({ version: '0.33.7' });
102
106
  await roku.package({ env: 'prod', prebuild: 'npm run roku:build:prod' });
103
107
 
104
- const recording = await capture.start({ platform: 'ios', device: 'iPhone 17 Pro' });
108
+ const recording = await capture.start({ platform: 'roku', videoDevice: 'USB Video' });
105
109
  // Drive the app manually, through MCP, or through another automation API.
106
110
  await recording.stop();
107
111
  ```
@@ -115,7 +119,7 @@ Common build-script replacements:
115
119
  | `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
120
  | `npx hst compiler:install 0.33.7` | `await compiler.install({ version: '0.33.7' })` |
117
121
  | `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' })` |
122
+ | `npx hst capture roku --video-device 'USB Video'` | `await capture.start({ platform: 'roku', videoDevice: 'USB Video' })` |
119
123
  | `npx hst secrets:check` | `await secrets.check({ cwd: process.cwd() })` |
120
124
  | `npx hst env check` | `await env.check({ cwd: process.cwd() })` |
121
125
  | `npx hst doctor` | `await env.check({ cwd: process.cwd() })` |
@@ -123,9 +127,9 @@ Common build-script replacements:
123
127
 
124
128
  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
129
 
126
- ### Installable Browser builds
130
+ ### Installable Roku browser emulator
127
131
 
128
- `hosannaPwaPlugin` is a build-only Vite plugin for the generic install shell. The
132
+ `hosannaPwaPlugin` is a build-only Vite plugin for the browser emulator shell. The
129
133
  host application supplies its identity, artwork, launch selection, offline page,
130
134
  and network-only routes; Hosanna Tools emits the manifest, registration module,
131
135
  versioned service worker, and validated icon copies.
@@ -138,7 +142,7 @@ hosannaPwaPlugin({
138
142
  id: '/',
139
143
  name: 'Example',
140
144
  shortName: 'Example',
141
- startUrl: '/?app=example&expression=phone',
145
+ startUrl: '/?app=example&expression=tv',
142
146
  scope: '/',
143
147
  backgroundColor: '#ffffff',
144
148
  themeColor: '#123456',
@@ -295,14 +299,15 @@ See [RELEASE.md](RELEASE.md) for the full release process.
295
299
 
296
300
  Quick reference:
297
301
  ```bash
298
- npm run release -- patch # 2.14.0 → 2.14.1
299
- npm run release -- minor # 2.14.0 → 2.15.0
300
- npm run release -- major # 2.14.0 → 3.0.0
302
+ npm run release -- patch --dry-run
303
+ npm run release -- minor --dry-run
304
+ npm run release -- major --dry-run
301
305
  ```
302
306
 
303
- For tokenless agent releases, dispatch **Release Patch** or **Release Minor**
304
- in GitHub Actions. Both wrappers invoke the OIDC-trusted `release.yml`
305
- workflow on `main`; agents do not need npm credentials.
307
+ The wrapper delegates to the root monorepo release command. Publication uses the
308
+ central `monorepo-release.yml` workflow after this package's npm trusted publisher
309
+ has been migrated. See [RELEASE.md](RELEASE.md) for the configuration and validation
310
+ requirements.
306
311
 
307
312
  ## CLI: configure-hosanna-url
308
313
 
@@ -324,52 +329,28 @@ Hosanna Tools is a comprehensive CLI toolset for the Hosanna framework that prov
324
329
  The CLI commands are organized into logical groups using colon-separated namespacing:
325
330
 
326
331
  ### 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
332
 
336
- Examples:
333
+ 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.
334
+
335
+ - `run` — Start Roku or its browser emulator. Bare interactive runs show the supported destinations.
336
+ - `launch roku` — Restart an installed Roku channel through ECP without building or installing.
337
+ - `build` — Prepare Roku or browser output without starting it.
338
+ - `target:list` — List the Roku emulator and physical Roku devices.
339
+ - `dev:start` — Start the Roku browser emulator development server and generator.
340
+ - `debugger:start` — Start the shared command debugger.
337
341
 
338
342
  ```bash
339
343
  hst run
340
344
  hst run --last
345
+ hst run roku dev device --device 192.0.2.50
346
+ hst run roku dev emulator
341
347
  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.
348
+ hst build roku dev device
349
+ hst target:list --json
350
+ hst launch roku --app-id dev --device 192.0.2.50
351
+ ```
352
+
353
+ `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
354
 
374
355
  ### Roku Commands (`roku:*`) - Roku Deployment & Packaging
375
356
  - `roku:run` - Deploy a Roku app to a device (supports .zip file or folder)
@@ -438,31 +419,17 @@ Supported inputs include `file/line: pkg:/components/source_0.brs(7475)`, `at ..
438
419
  ### Build Config Commands (`build-config`) - Runtime Configuration
439
420
  - `build-config:resolve` - Resolve `build-config/base.json`, env/platform overlays, secrets, and optional developer profiles into the canonical runtime `build-config.json`
440
421
 
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`.
422
+ 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
423
 
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
424
 
445
425
  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
426
 
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:
427
+ Roku builds can resolve config immediately before the platform build:
456
428
 
457
429
  ```bash
458
430
  npx hst build-config:resolve --env dev --platform roku --out assets/meta/build-config.json
459
431
  npm run roku:build
460
432
 
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
433
  ```
467
434
 
468
435
  ### CI Commands (`ci:*`) - Continuous Integration
@@ -631,7 +598,7 @@ silently break an install.
631
598
  - `mcp:start` - Start the Hosanna MCP server for AI agent debugging
632
599
  - `mcp:stop` - Stop the Hosanna MCP server
633
600
 
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`.
601
+ **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
602
 
636
603
  ### Deterministic UI testing
637
604
 
@@ -639,24 +606,20 @@ Applications own regular Vitest suites. Global setup comes from `@tantawowa/hosa
639
606
 
640
607
  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
608
 
642
- Tests can record the complete owned browser, supported Apple simulator, or
643
- Roku device run:
609
+ Tests can record a complete browser emulator or Roku device run:
644
610
 
645
611
  ```ts
646
612
  defineHosannaTestConfig({
647
613
  // ...
648
614
  video: true,
649
615
  // Browser: video: { size: { width: 1280, height: 720 } },
650
- // Native/device: video: { timeoutSeconds: 300, videoDevice: 'USB Video' },
616
+ // Roku device: video: { timeoutSeconds: 300, videoDevice: 'USB Video' },
651
617
  });
652
618
  ```
653
619
 
654
620
  The finalized recording is written below
655
621
  `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
622
+ 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
623
  `timeoutSeconds`. This is a review artifact, not a replay format or executable
661
624
  test source.
662
625
 
@@ -691,7 +654,7 @@ await hs.proof.capture('programme-focused', {
691
654
  });
692
655
  ```
693
656
 
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.
657
+ 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
658
 
696
659
  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
660
 
@@ -714,14 +677,13 @@ defineHosannaTestConfig({
714
677
  });
715
678
  ```
716
679
 
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:
680
+ Use `createHosannaTestTarget(config)` with Vitest's standard conditional APIs. Selectors distinguish Roku browser emulation and physical Roku targets:
718
681
 
719
682
  ```ts
720
683
  const target = createHosannaTestTarget(config);
721
684
 
722
685
  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 }) => {});
686
+ test.runIf(target.matches({ target: 'web' }))('Roku browser emulation', async ({ hs }) => {});
725
687
  ```
726
688
 
727
689
  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 +694,12 @@ For Roku device suites, the launcher builds and deploys before the test launch,
732
694
 
733
695
  ```bash
734
696
  # 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
697
+ hst run browser dev emulator # Roku browser emulator, FHD by default
698
+ hst run roku dev emulator --device rokuhd
699
+ hst run roku dev device --device "Living Room"
700
+ hst run roku dev device --device "Living Room" --replace
701
+ hst target:list --platform roku --target device --json
702
+ hst target:list --target emulator --json
760
703
  hst generate:all --watch # Generate code with file watching
761
704
  hst dev:start # Lower-level dev server task used by hst run
762
705
 
@@ -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;