@tantawowa/hosanna-tools 3.14.1 → 3.15.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 (80) hide show
  1. package/README.md +12 -2
  2. package/dist/build-info.json +3 -3
  3. package/dist/cli.js +40 -7
  4. package/dist/cli.js.map +1 -1
  5. package/dist/lib/app-config-resolver.js +2 -2
  6. package/dist/lib/app-config-resolver.js.map +1 -1
  7. package/dist/native/native-project.d.ts +5 -2
  8. package/dist/native/native-project.js +215 -24
  9. package/dist/native/native-project.js.map +1 -1
  10. package/dist/native/templates/android/AndroidAutoManifest.xml +30 -0
  11. package/dist/native/templates/android/WearOsManifest.xml +31 -0
  12. package/dist/native/templates/android/app-build.gradle.kts +58 -12
  13. package/dist/native/templates/android/automotive_app_desc.xml +4 -0
  14. package/dist/native/templates/android/build.gradle.kts +3 -2
  15. package/dist/native/templates/android/gradle-wrapper.properties +1 -1
  16. package/dist/native/templates/android/gradle.properties +1 -0
  17. package/dist/native/templates/apple/HosannaCarPlay.entitlements +8 -0
  18. package/dist/native/templates/apple/HosannaIosApp.swift +7 -1
  19. package/dist/native/templates/apple/HosannaWatchApp.swift +10 -0
  20. package/dist/native/templates/apple/Info.carplay.plist +43 -0
  21. package/dist/native/templates/apple/Info.watchos.plist +26 -0
  22. package/dist/native/templates/apple/project.yml +8 -0
  23. package/dist/run/android-auto.d.ts +11 -0
  24. package/dist/run/android-auto.js +121 -0
  25. package/dist/run/android-auto.js.map +1 -0
  26. package/dist/run/android-emulator.d.ts +14 -1
  27. package/dist/run/android-emulator.js +303 -51
  28. package/dist/run/android-emulator.js.map +1 -1
  29. package/dist/run/apple-watch.d.ts +49 -0
  30. package/dist/run/apple-watch.js +389 -0
  31. package/dist/run/apple-watch.js.map +1 -0
  32. package/dist/run/carplay.d.ts +15 -0
  33. package/dist/run/carplay.js +68 -0
  34. package/dist/run/carplay.js.map +1 -0
  35. package/dist/run/destination-picker.js +25 -5
  36. package/dist/run/destination-picker.js.map +1 -1
  37. package/dist/run/executor.d.ts +2 -0
  38. package/dist/run/executor.js +27 -14
  39. package/dist/run/executor.js.map +1 -1
  40. package/dist/run/hsconfig-static-assets.d.ts +11 -0
  41. package/dist/run/hsconfig-static-assets.js +75 -0
  42. package/dist/run/hsconfig-static-assets.js.map +1 -1
  43. package/dist/run/ios-device.d.ts +1 -0
  44. package/dist/run/ios-device.js +2 -2
  45. package/dist/run/ios-device.js.map +1 -1
  46. package/dist/run/ios-simulator.d.ts +3 -1
  47. package/dist/run/ios-simulator.js +4 -4
  48. package/dist/run/ios-simulator.js.map +1 -1
  49. package/dist/run/native-build.d.ts +2 -2
  50. package/dist/run/native-build.js +15 -3
  51. package/dist/run/native-build.js.map +1 -1
  52. package/dist/run/planner.js +291 -13
  53. package/dist/run/planner.js.map +1 -1
  54. package/dist/run/run-controller.d.ts +10 -0
  55. package/dist/run/run-controller.js +442 -42
  56. package/dist/run/run-controller.js.map +1 -1
  57. package/dist/run/targets.d.ts +32 -0
  58. package/dist/run/targets.js +106 -6
  59. package/dist/run/targets.js.map +1 -1
  60. package/dist/run/types.d.ts +17 -2
  61. package/dist/run/types.js +24 -3
  62. package/dist/run/types.js.map +1 -1
  63. package/dist/support-tools/android-dev-server.d.ts +1 -1
  64. package/dist/support-tools/android-dev-server.js +8 -6
  65. package/dist/support-tools/android-dev-server.js.map +1 -1
  66. package/dist/support-tools/android-metro-build.d.ts +7 -0
  67. package/dist/support-tools/android-metro-build.js +36 -2
  68. package/dist/support-tools/android-metro-build.js.map +1 -1
  69. package/dist/support-tools/apple-bundler.js +62 -4
  70. package/dist/support-tools/apple-bundler.js.map +1 -1
  71. package/dist/support-tools/build-config-resolver.js +4 -2
  72. package/dist/support-tools/build-config-resolver.js.map +1 -1
  73. package/dist/support-tools/publish-roku.d.ts +11 -0
  74. package/dist/support-tools/publish-roku.js +51 -0
  75. package/dist/support-tools/publish-roku.js.map +1 -1
  76. package/dist/updater/framework-installer.js +7 -0
  77. package/dist/updater/framework-installer.js.map +1 -1
  78. package/dist/updater/license-manager.js +7 -0
  79. package/dist/updater/license-manager.js.map +1 -1
  80. package/package.json +1 -1
package/README.md CHANGED
@@ -303,9 +303,19 @@ Bare `hst run` in an interactive terminal discovers runnable web previews, vendo
303
303
  ### Roku Commands (`roku:*`) - Roku Deployment & Packaging
304
304
  - `roku:run` - Deploy a Roku app to a device (supports .zip file or folder)
305
305
  - `roku:command` - Send a Hosanna command to an installed channel through Roku ECP
306
- - `roku:package` - Package and sign a Roku channel using roku-deploy
306
+ - `roku:package` - Package and sign a Roku channel using roku-deploy. Source zips over 4 MiB warn by default; signed packages over 4 MiB fail.
307
307
  - `roku:map-stack` - Resolve Roku `.brs` stack traces, compile errors, and crash snippets to original TypeScript locations using `.brs.map` files
308
308
 
309
+ The package-size limit defaults to Roku's 4 MiB certification limit. Set a different
310
+ limit with `--max-pkg-size-mb`, or explicitly allow an oversized signed package with
311
+ `--ignorePkgTooBig` (`--ignore-pkg-too-big` is equivalent). Oversized source zips
312
+ remain warnings because the signed `.pkg` is the release artifact Roku certifies.
313
+
314
+ ```bash
315
+ hst roku:package --max-pkg-size-mb 4
316
+ hst roku:package --ignorePkgTooBig
317
+ ```
318
+
309
319
  Send a command to the sideloaded `dev` channel (the default app ID):
310
320
 
311
321
  ```bash
@@ -585,7 +595,7 @@ hst generate:all --watch # Generate code with file watching
585
595
  hst dev:start # Lower-level dev server task used by hst run
586
596
 
587
597
  # Building and packaging
588
- hst roku:package --ip 192.168.1.10 # Package and deploy Roku app
598
+ hst roku:package --ip 192.168.1.10 # Package and deploy; signed .pkg must be <= 4 MiB
589
599
  hst generate:clean # Clean generated files
590
600
 
591
601
  # Setup and installation
@@ -1,6 +1,6 @@
1
1
  {
2
- "buildDate": "2026-08-05T12:31:10+00:00",
3
- "buildDateISO": "2026-08-05T12:31:10.889Z",
2
+ "buildDate": "2026-08-08T04:51:31+00:00",
3
+ "buildDateISO": "2026-08-08T04:51:31.428Z",
4
4
  "timeZone": "UTC",
5
- "gitHash": "040bff3"
5
+ "gitHash": "e37f03d"
6
6
  }
package/dist/cli.js CHANGED
@@ -234,7 +234,15 @@ function rememberedExplicitDestination(plan, hasExplicitDestination) {
234
234
  return undefined;
235
235
  return Object.assign({ platform: plan.resolved.platform, target }, (plan.resolved.deviceSelector ? { device: plan.resolved.deviceSelector } : {}));
236
236
  }
237
- const NATIVE_PLATFORM_CHOICES = ['apple', 'ios', 'apple-tv', 'android', 'android-tv', 'all'];
237
+ const NATIVE_PLATFORM_CHOICES = [
238
+ 'apple', 'ios', 'apple-tv', 'carplay', 'apple-watch', 'watchos',
239
+ 'android', 'android-tv', 'android-auto', 'wear-os', 'wearos', 'android-watch',
240
+ 'cars', 'watches', 'all',
241
+ ];
242
+ const RUN_PLATFORM_CHOICES = [
243
+ 'web', 'roku', 'ios', 'apple-tv', 'carplay', 'apple-watch', 'watchos',
244
+ 'android', 'android-tv', 'android-auto', 'wear-os', 'wearos', 'android-watch',
245
+ ];
238
246
  function nativeInputFromArgs(args) {
239
247
  return {
240
248
  cwd: process.cwd(),
@@ -244,8 +252,11 @@ function nativeInputFromArgs(args) {
244
252
  bundleId: stringArg(args['bundle-id']),
245
253
  iosBundleId: stringArg(args['ios-bundle-id']),
246
254
  appleTvBundleId: stringArg(args['apple-tv-bundle-id']),
255
+ appleWatchBundleId: stringArg(args['apple-watch-bundle-id']),
247
256
  androidPackage: stringArg(args['android-package']),
248
257
  androidTvPackage: stringArg(args['android-tv-package']),
258
+ androidAutoPackage: stringArg(args['android-auto-package']),
259
+ wearOsPackage: stringArg(args['wear-os-package']),
249
260
  teamId: stringArg(args['team-id']),
250
261
  versionName: stringArg(args['version-name']),
251
262
  versionCode: numberOrStringArg(args['version-code']),
@@ -656,8 +667,11 @@ catch (err) {
656
667
  .option('bundle-id', { type: 'string', describe: 'Base bundle/package identifier' })
657
668
  .option('ios-bundle-id', { type: 'string', describe: 'iOS bundle identifier' })
658
669
  .option('apple-tv-bundle-id', { type: 'string', describe: 'tvOS bundle identifier' })
670
+ .option('apple-watch-bundle-id', { type: 'string', describe: 'watchOS bundle identifier' })
659
671
  .option('android-package', { type: 'string', describe: 'Android namespace and phone package base' })
660
672
  .option('android-tv-package', { type: 'string', describe: 'Android TV application id' })
673
+ .option('android-auto-package', { type: 'string', describe: 'Android Auto application id' })
674
+ .option('wear-os-package', { type: 'string', describe: 'Wear OS application id' })
661
675
  .option('team-id', { type: 'string', describe: 'Apple development team id for generated xcconfig files' })
662
676
  .option('version-name', { type: 'string', describe: 'Native marketing/versionName value' })
663
677
  .option('version-code', { type: 'number', describe: 'Native build/versionCode value' })
@@ -667,6 +681,7 @@ catch (err) {
667
681
  .option('format', { type: 'string', choices: ['text', 'json'], default: 'text', describe: 'Output format' })
668
682
  .option('non-interactive', { type: 'boolean', default: false, describe: 'Fail instead of prompting when a decision is needed' })
669
683
  .example('$0 native:init all --display-name "Hope Stream"', 'Initialize Apple and Android app-owned native projects')
684
+ .example('$0 native:init watches --display-name "Hope Stream"', 'Initialize Apple Watch and Wear OS native targets')
670
685
  .example('$0 native:init android-tv --dry-run --format json', 'Preview Android TV native setup as JSON'), async (args) => {
671
686
  try {
672
687
  const mod = await Promise.resolve().then(() => __importStar(require('./native/native-project.js')));
@@ -700,8 +715,11 @@ catch (err) {
700
715
  .option('bundle-id', { type: 'string', describe: 'Base bundle/package identifier' })
701
716
  .option('ios-bundle-id', { type: 'string', describe: 'iOS bundle identifier' })
702
717
  .option('apple-tv-bundle-id', { type: 'string', describe: 'tvOS bundle identifier' })
718
+ .option('apple-watch-bundle-id', { type: 'string', describe: 'watchOS bundle identifier' })
703
719
  .option('android-package', { type: 'string', describe: 'Android namespace and phone package base' })
704
720
  .option('android-tv-package', { type: 'string', describe: 'Android TV application id' })
721
+ .option('android-auto-package', { type: 'string', describe: 'Android Auto application id' })
722
+ .option('wear-os-package', { type: 'string', describe: 'Wear OS application id' })
705
723
  .option('team-id', { type: 'string', describe: 'Apple development team id for generated xcconfig files' })
706
724
  .option('version-name', { type: 'string', describe: 'Native marketing/versionName value' })
707
725
  .option('version-code', { type: 'number', describe: 'Native build/versionCode value' })
@@ -731,8 +749,11 @@ catch (err) {
731
749
  .option('bundle-id', { type: 'string', describe: 'Base bundle/package identifier' })
732
750
  .option('ios-bundle-id', { type: 'string', describe: 'iOS bundle identifier' })
733
751
  .option('apple-tv-bundle-id', { type: 'string', describe: 'tvOS bundle identifier' })
752
+ .option('apple-watch-bundle-id', { type: 'string', describe: 'watchOS bundle identifier' })
734
753
  .option('android-package', { type: 'string', describe: 'Android namespace and phone package base' })
735
754
  .option('android-tv-package', { type: 'string', describe: 'Android TV application id' })
755
+ .option('android-auto-package', { type: 'string', describe: 'Android Auto application id' })
756
+ .option('wear-os-package', { type: 'string', describe: 'Wear OS application id' })
736
757
  .option('team-id', { type: 'string', describe: 'Apple development team id for generated xcconfig files' })
737
758
  .option('version-name', { type: 'string', describe: 'Native marketing/versionName value' })
738
759
  .option('version-code', { type: 'number', describe: 'Native build/versionCode value' })
@@ -766,6 +787,8 @@ catch (err) {
766
787
  .option('rootDir', { type: 'string', describe: 'Roku project root (default: ./platforms/roku/src)' })
767
788
  .option('outDir', { type: 'string', describe: 'Output directory (default: ./build)' })
768
789
  .option('prebuild', { type: 'string', describe: 'Shell command to run before packaging (e.g. "npm run transpile:prod")' })
790
+ .option('max-pkg-size-mb', { alias: 'maxPkgSizeMb', type: 'number', default: 4, describe: 'Maximum signed Roku .pkg size in MiB (default: Roku 4 MiB certification limit)' })
791
+ .option('ignore-pkg-too-big', { alias: 'ignorePkgTooBig', type: 'boolean', default: false, describe: 'Warn instead of failing when the signed .pkg exceeds the size limit' })
769
792
  .option('quiet', { type: 'boolean', default: false, describe: 'Reduce output; print only errors and success' })
770
793
  .example('$0 roku:package --ip 192.168.1.10 --installer-password secret --dev-id ABC --signing-password sss --key-pkg mykey.pkg', 'Package and sign with explicit args')
771
794
  .example('$0 roku:package --key-pkg-base64 <base64-string>', 'Package using base64-encoded key package')
@@ -787,6 +810,8 @@ catch (err) {
787
810
  rootDir: args.rootDir,
788
811
  outDir: args.outDir,
789
812
  prebuild: args.prebuild,
813
+ maxPkgSizeMb: args['max-pkg-size-mb'],
814
+ ignorePkgTooBig: Boolean(args['ignore-pkg-too-big']),
790
815
  quiet: Boolean(args.quiet),
791
816
  dotenv: true,
792
817
  });
@@ -1779,12 +1804,12 @@ catch (err) {
1779
1804
  .command('target:list [platform]', 'List run targets discovered by hst, including web emulators, sims, and physical devices', yargs => yargs
1780
1805
  .positional('platform', {
1781
1806
  type: 'string',
1782
- choices: ['web', 'roku', 'ios', 'apple-tv', 'android', 'android-tv'],
1807
+ choices: RUN_PLATFORM_CHOICES,
1783
1808
  describe: 'Filter by launch platform',
1784
1809
  })
1785
1810
  .option('platform', {
1786
1811
  type: 'string',
1787
- choices: ['web', 'roku', 'ios', 'apple-tv', 'android', 'android-tv'],
1812
+ choices: RUN_PLATFORM_CHOICES,
1788
1813
  describe: 'Filter by launch platform',
1789
1814
  })
1790
1815
  .option('target', {
@@ -1794,7 +1819,7 @@ catch (err) {
1794
1819
  })
1795
1820
  .option('form-factor', {
1796
1821
  type: 'string',
1797
- choices: ['desktop', 'mobile', 'tablet', 'tv'],
1822
+ choices: ['desktop', 'mobile', 'tablet', 'tv', 'car', 'watch'],
1798
1823
  describe: 'Filter by form factor for broad agent inventory queries',
1799
1824
  })
1800
1825
  .option('json', {
@@ -1816,6 +1841,8 @@ catch (err) {
1816
1841
  .example('$0 target:list --platform android --target device --json', 'List physical Android device targets as JSON')
1817
1842
  .example('$0 target:list --platform android-tv --target sim --json', 'List Android TV emulator targets as JSON')
1818
1843
  .example('$0 target:list --platform apple-tv --target sim --json', 'List Apple TV simulator targets as JSON')
1844
+ .example('$0 target:list --platform apple-watch --target sim --json', 'List Apple Watch simulator targets as JSON')
1845
+ .example('$0 target:list --platform wear-os --target sim --json', 'List Wear OS emulator targets as JSON')
1819
1846
  .example('$0 target:list --form-factor tv --json', 'List TV-class targets as JSON'), async (args) => {
1820
1847
  try {
1821
1848
  const mod = await Promise.resolve().then(() => __importStar(require('./run/targets.js')));
@@ -1859,7 +1886,7 @@ catch (err) {
1859
1886
  })
1860
1887
  .option('platform', {
1861
1888
  type: 'string',
1862
- choices: ['web', 'roku', 'ios', 'apple-tv', 'android', 'android-tv'],
1889
+ choices: RUN_PLATFORM_CHOICES,
1863
1890
  describe: 'Build platform.',
1864
1891
  })
1865
1892
  .option('env', {
@@ -1906,10 +1933,12 @@ catch (err) {
1906
1933
  .example('$0 build roku dev device', 'Build the dev Roku output without deploying or streaming logs')
1907
1934
  .example('$0 build roku prod device --hsc-project platforms/hsconfig-roku.prod.json', 'Build Roku with an explicit HSC project file')
1908
1935
  .example('$0 build ios dev sim --device "iPhone 17 Pro"', 'Build an iOS simulator target without install, launch, or logs')
1936
+ .example('$0 build apple-watch dev sim --device "Apple Watch Series 11 (46mm)"', 'Build the paired Apple Watch simulator target')
1937
+ .example('$0 build wear-os dev sim --device "Wear_OS_Large_Round"', 'Build the Wear OS emulator target')
1909
1938
  .example('$0 build web dev emulator', 'Resolve web runtime build config without opening a browser'), async (args) => {
1910
1939
  await runRunPlanCommand('build', args);
1911
1940
  })
1912
- .command('run [platform] [env] [target] [deviceSelector]', 'Launch a Hosanna app on a platform target (web, Roku, iOS, Apple TV, Android, and Android TV targets are supported)', yargs => yargs
1941
+ .command('run [platform] [env] [target] [deviceSelector]', 'Launch a Hosanna app on a platform target, including car and watch surfaces', yargs => yargs
1913
1942
  .parserConfiguration({ 'boolean-negation': false, 'populate--': true })
1914
1943
  .positional('platform', {
1915
1944
  type: 'string',
@@ -1929,7 +1958,7 @@ catch (err) {
1929
1958
  })
1930
1959
  .option('platform', {
1931
1960
  type: 'string',
1932
- choices: ['web', 'roku', 'ios', 'apple-tv', 'android', 'android-tv'],
1961
+ choices: RUN_PLATFORM_CHOICES,
1933
1962
  describe: 'Launch platform.',
1934
1963
  })
1935
1964
  .option('env', {
@@ -2003,6 +2032,10 @@ catch (err) {
2003
2032
  .example('$0 run --platform android --target device --device "RF8M62694QT" --no-logs', 'Build, install, and launch on a physical Android device')
2004
2033
  .example('$0 run --platform android-tv --target sim --device "Television_1080p" --no-logs', 'Build, install, and launch on an Android TV emulator')
2005
2034
  .example('$0 run --platform apple-tv --target sim --device "Apple TV 4K"', 'Build, install, and launch on an Apple TV simulator')
2035
+ .example('$0 run --platform carplay --target sim --device "iPhone 17 Pro"', 'Launch the iPhone host and open the CarPlay Simulator display')
2036
+ .example('$0 run --platform android-auto --target sim --device "Pixel_8"', 'Launch Android Auto through the Desktop Head Unit')
2037
+ .example('$0 run --platform apple-watch --target sim --device "Apple Watch Series 11 (46mm)"', 'Build and launch through the paired Apple Watch simulator')
2038
+ .example('$0 run --platform wear-os --target sim --device "Wear_OS_Large_Round"', 'Build, install, and launch on a Wear OS emulator')
2006
2039
  .example('$0 run --platform roku --target device --device "living room"', 'Build, deploy, launch, and stream logs on a Roku device')
2007
2040
  .example('$0 run roku dev device --app criterion', 'Run a configured monorepo app/flavor')
2008
2041
  .example('$0 run roku prod device --hsc-project platforms/hsconfig.criterion.prod.json', 'Override the Roku HSC project file'), async (args) => {