stim 1.36.0 → 1.38.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 (167) hide show
  1. package/README.md +3 -1
  2. package/dist/{acquire-artifact-DGTHCd0Q.mjs → acquire-artifact-QKPDkesw.mjs} +2 -2
  3. package/dist/{act-CvN9xyV6.mjs → act-Bh3t-NuH.mjs} +28 -34
  4. package/dist/{activity-BpdDvA8Q.mjs → activity-CANftndU.mjs} +6 -6
  5. package/dist/{agent-device-usage-output-pbhaW7_k.mjs → agent-device-usage-output-CuROXefb.mjs} +5 -5
  6. package/dist/{android-SJx1V3R3.mjs → android-27_JgJ1T.mjs} +7 -7
  7. package/dist/{android-B0qTdwnt.mjs → android-Biwc4Dck.mjs} +5 -5
  8. package/dist/{android-5wkcMFDG.mjs → android-DGLG_VQ3.mjs} +2 -2
  9. package/dist/{android-e9WP10cE.mjs → android-Z6Eev9rL.mjs} +51 -42
  10. package/dist/{android-cas-BS9_55U5.mjs → android-cas-BDAwwL82.mjs} +4 -4
  11. package/dist/android-cas-compiler.mjs +1 -1
  12. package/dist/{android-image-BZ57YL6R.mjs → android-image-BcUD6bPi.mjs} +3 -3
  13. package/dist/api.d.mts +12 -5
  14. package/dist/api.mjs +34 -31
  15. package/dist/{apk-signed-tail-eZyXIrnc.mjs → apk-signed-tail-DHMkXs4s.mjs} +2 -2
  16. package/dist/{artifact-C3srrGVU.mjs → artifact-Dc1GsK7o.mjs} +29 -15
  17. package/dist/{artifact-platform-DqCWUieN.mjs → artifact-platform-BaGL1i1X.mjs} +1 -1
  18. package/dist/{artifact-ubNdxo_K.mjs → artifact-sGoFVK1q.mjs} +12 -12
  19. package/dist/{auto-placement-CKFpFCuq.mjs → auto-placement-RNh4kx2T.mjs} +7 -7
  20. package/dist/{browser-web-B63vLrj6.mjs → browser-web-7Oj57Roa.mjs} +15 -15
  21. package/dist/{build-B_Dx9SKJ.mjs → build-DkE5vjp1.mjs} +29 -28
  22. package/dist/{build-cache-BW8T4oD2.mjs → build-cache-CJ65Efv7.mjs} +10 -7
  23. package/dist/{build-plan-CeIooJqn.mjs → build-plan-DWajg5l_.mjs} +8 -7
  24. package/dist/{cache-manifest-CxWkZmUr.mjs → cache-manifest-BO0TIcPV.mjs} +1 -1
  25. package/dist/cache-manifest.mjs +1 -1
  26. package/dist/{cdp-C216kOAn.mjs → cdp-CgT47_9A.mjs} +1 -1
  27. package/dist/{chrome-C8sC5tdl.mjs → chrome-DL5znvmo.mjs} +1 -1
  28. package/dist/{cli-COdXswmc.mjs → cli-BSlwv9hI.mjs} +21 -21
  29. package/dist/cli.mjs +1 -1
  30. package/dist/{client-KSWIeQLA.mjs → client-qwmHFSga.mjs} +16 -12
  31. package/dist/collector-run.mjs +7 -7
  32. package/dist/{command-output-T3cDctRE.mjs → command-output-DsjhOzJ3.mjs} +1 -1
  33. package/dist/{config-BA3TgoIP.mjs → config-CNmN-ndb.mjs} +2 -2
  34. package/dist/{dependencies-LH-7k1Vr.mjs → dependencies-oku1ZLep.mjs} +144 -71
  35. package/dist/{dependency-state-Blfp3AkG.mjs → dependency-state-CBhPJAs_.mjs} +2 -2
  36. package/dist/{detached-entry-tfrgGVWb.mjs → detached-entry-VqFeEE9W.mjs} +1 -1
  37. package/dist/{dev-client-MO_DjTZr.mjs → dev-client-DL5UtVdx.mjs} +2 -2
  38. package/dist/{device-DNTWFFB1.mjs → device-CxMwX0VO.mjs} +17 -16
  39. package/dist/{device-android-BB9Lugr8.mjs → device-android-CSlBXuh_.mjs} +9 -9
  40. package/dist/{device-capacity-CpAVcKgq.mjs → device-capacity-D_IlxZRL.mjs} +84 -37
  41. package/dist/device-host-worker.mjs +28 -16
  42. package/dist/{device-pool-BJToGG-q.mjs → device-pool-BEaTdtss.mjs} +3 -3
  43. package/dist/{device-provision-CxQDCtrc.mjs → device-provision-C9NPdCne.mjs} +10 -10
  44. package/dist/{device-BZWt_aPJ.mjs → device-yfuJ-v4s.mjs} +11 -11
  45. package/dist/{doctor-C-46SkBe.mjs → doctor-BAA3zN5U.mjs} +1 -1
  46. package/dist/{doctor-DV639Iw_.mjs → doctor-BQ1Kl44s.mjs} +15 -21
  47. package/dist/{doctor-CYZ45LnX.mjs → doctor-QNzDE4aW.mjs} +24 -24
  48. package/dist/{doctor-fingerprint-DqWvIhMb.mjs → doctor-fingerprint-Bo4z8YNP.mjs} +1 -1
  49. package/dist/doctor-fingerprint.mjs +1 -1
  50. package/dist/{doctor-watchman-TZxYt_98.mjs → doctor-watchman-B8e3s9ko.mjs} +5 -5
  51. package/dist/{eas-build-Xf5Jd6LR.mjs → eas-build-4rg9WpEg.mjs} +4 -4
  52. package/dist/{eas-fallback-DNYPNinw.mjs → eas-fallback-UGo0SG7T.mjs} +6 -6
  53. package/dist/{eas-session-ledger-CXZ4aix0.mjs → eas-session-ledger-BDpSdFDM.mjs} +6 -6
  54. package/dist/{error-diagnostics-CvB5bpPU.mjs → error-diagnostics-CW9xl6ot.mjs} +10 -10
  55. package/dist/{exec-CGuDzt40.mjs → exec-L37dbiIb.mjs} +7 -1
  56. package/dist/{gc-DiUhrVFo.mjs → gc-3DHVCn-k.mjs} +52 -36
  57. package/dist/{gc-8Qm_K1iy.mjs → gc-BQ5dXnC7.mjs} +2 -2
  58. package/dist/{guide-CuvHRP53.mjs → guide-DqJCc4vW.mjs} +209 -78
  59. package/dist/{hosted-android-D__HGVIO.mjs → hosted-android-gwLspaz6.mjs} +4 -4
  60. package/dist/{hosted-client-DMOOu8vD.mjs → hosted-client-B_h_bTlz.mjs} +4 -4
  61. package/dist/{hosted-logs-CClIktQM.mjs → hosted-logs-BpQSRDRU.mjs} +17 -10
  62. package/dist/{hosted-logs-sync-B7XCeqVm.mjs → hosted-logs-sync-D3L1hDpM.mjs} +5 -5
  63. package/dist/{hosted-macos-D4sDJIbB.mjs → hosted-macos-GK4O1s7x.mjs} +6 -6
  64. package/dist/{hosted-native-BiiUG_Q6.mjs → hosted-native-B6ur_0OJ.mjs} +8 -8
  65. package/dist/{ios-Qam0bT9n.mjs → ios-2Qr4_Zu2.mjs} +1 -1
  66. package/dist/{ios-BZuhvLGr.mjs → ios-Bi0bQiZ_.mjs} +8 -8
  67. package/dist/{ios-BhfpRfNf.mjs → ios-DQEzde6f.mjs} +23 -10
  68. package/dist/{ios-BhpUWyN7.mjs → ios-M7nRVb33.mjs} +100 -37
  69. package/dist/{ios-device-vhYL1N--.mjs → ios-device-BLm1BZB4.mjs} +3 -3
  70. package/dist/{ios-device-DLdEDWJj.mjs → ios-device-ygijU78G.mjs} +1 -1
  71. package/dist/{ios-project-Cz0S1Sz-.mjs → ios-project-Bsm-eqwv.mjs} +7 -7
  72. package/dist/ios-runtime-DLiKoOkd.mjs +150 -0
  73. package/dist/{ios-signing-BcH88ecn.mjs → ios-signing-rWR_Mu5Z.mjs} +3 -3
  74. package/dist/{ios-state-Avwz2cbZ.mjs → ios-state-tzD0s7pt.mjs} +1 -1
  75. package/dist/{js-swap-Desu2iII.mjs → js-swap-Cuky0ZAQ.mjs} +60 -13
  76. package/dist/{launch-6ckG9UrC.mjs → launch-B-pkNlqg.mjs} +48 -28
  77. package/dist/{lightened-B6TnpHMX.mjs → lightened-KHWHmzGs.mjs} +5 -5
  78. package/dist/{logs-B-DMy1K0.mjs → logs-B0etn-BD.mjs} +7 -7
  79. package/dist/{logs-CO0CJRiC.mjs → logs-HomiqPhV.mjs} +6 -6
  80. package/dist/{macos-CduEmWAK.mjs → macos-C5liDnbP.mjs} +1 -1
  81. package/dist/macos-run.mjs +1 -1
  82. package/dist/{macos-B1aCXhem.mjs → macos-zMxSibx5.mjs} +22 -23
  83. package/dist/maintenance-run.mjs +6 -6
  84. package/dist/{metro-DM3yJL1M.mjs → metro-Cj6W4qOO.mjs} +4 -4
  85. package/dist/{metro-request-O8Q-JvBg.mjs → metro-request-BWCl3Zco.mjs} +2 -2
  86. package/dist/{prebuild-Di2IhUue.mjs → miss-reason-CeHvzeVm.mjs} +12 -272
  87. package/dist/{named-ports-BvB_CO9B.mjs → named-ports-DZ8DrkH1.mjs} +3 -3
  88. package/dist/{native-android-28NOG2-y.mjs → native-android-DtWLzg6g.mjs} +18 -18
  89. package/dist/{native-gradle-artifact-inputs-DxVEtS6_.mjs → native-gradle-artifact-inputs-D4w20_6d.mjs} +5 -5
  90. package/dist/{native-runtime-C3_NkUlW.mjs → native-runtime-BfvvAJLd.mjs} +6 -6
  91. package/dist/{native-source-ChAGj7R1.mjs → native-source-D2ZfiQ6U.mjs} +1 -1
  92. package/dist/{native-xcode-inputs-BWFTw5cJ.mjs → native-xcode-inputs-BHvnAq4o.mjs} +3 -3
  93. package/dist/{native-xcode-ios-B4Qoc7-U.mjs → native-xcode-ios-CYxrg_kK.mjs} +18 -19
  94. package/dist/offload-worker.mjs +23 -22
  95. package/dist/{operation-exec-DKlBcKAL.mjs → operation-exec-DNynwpqO.mjs} +1 -1
  96. package/dist/{ownership-C3y8wLSl.mjs → ownership-BLgOimfp.mjs} +3 -3
  97. package/dist/{page-Dj8IqvGM.mjs → page-CoN9al_x.mjs} +2 -2
  98. package/dist/{phone-reverses-BhSxbqom.mjs → phone-reverses-vRveZKSG.mjs} +4 -4
  99. package/dist/{placement-log-B8RCSzOm.mjs → placement-log-CM0DSELs.mjs} +1 -1
  100. package/dist/{plan-placement-BI4r55aP.mjs → plan-placement-CIrvKq8y.mjs} +6 -6
  101. package/dist/{ports-DhOSyWm9.mjs → ports-CKORWlC0.mjs} +3 -3
  102. package/dist/{project-Clk1JAWL.mjs → project-DIo71tGq.mjs} +16 -16
  103. package/dist/{pull-request-BpMTNkMB.mjs → pull-request-m8cMZ3aE.mjs} +2 -2
  104. package/dist/pull-requests.mjs +1 -1
  105. package/dist/{react-native-android-bdHBMrnf.mjs → react-native-android-B7VYSlKj.mjs} +41 -36
  106. package/dist/{react-native-build-CJega_NM.mjs → react-native-build-CFYTYmG4.mjs} +13 -10
  107. package/dist/{react-native-doctor-CY7BGITE.mjs → react-native-doctor-CnpVfE0k.mjs} +6 -6
  108. package/dist/{react-native-ios-Bo5EDVel.mjs → react-native-ios-ByeXo_NP.mjs} +18 -18
  109. package/dist/{recorded-build-BuGL_fnm.mjs → recorded-build-B4prJjSD.mjs} +20 -2
  110. package/dist/{recordings-6i2-x8LU.mjs → recordings-Byu5SzlI.mjs} +1 -1
  111. package/dist/{registration-DKjJGQ6p.mjs → registration-C-3PDR3X.mjs} +1 -1
  112. package/dist/{reload-BvDuvygc.mjs → reload-DANrKhQR.mjs} +1 -1
  113. package/dist/{reload-A_axEbeS.mjs → reload-DTd9g1EG.mjs} +16 -16
  114. package/dist/{remote-PD6CM0xp.mjs → remote-BWuq9qHV.mjs} +4 -4
  115. package/dist/{remote-WK_swZEw.mjs → remote-NOM82XE0.mjs} +10 -10
  116. package/dist/{result-BkDpN5Mz.mjs → result-C-ISEJ5F.mjs} +17 -17
  117. package/dist/{run-CTFi4Nq2.mjs → run-DQwx6djG.mjs} +2 -2
  118. package/dist/{server-bare-W0aPsRZE.mjs → server-bare-B_wRfchQ.mjs} +2 -2
  119. package/dist/{server-command-S00-ddjK.mjs → server-command-DgXYowQf.mjs} +6 -6
  120. package/dist/{server-expo-cc-cmfsl.mjs → server-expo-ByBM8DVv.mjs} +10 -8
  121. package/dist/server-expo-D7rwjAFp.mjs +2 -0
  122. package/dist/{settings-C_Xu4RNZ.mjs → settings-BthPoY3t.mjs} +2 -2
  123. package/dist/{settings-Bap-qjnp.mjs → settings-Cz8kQJzr.mjs} +49 -12
  124. package/dist/{settings-payload-D5jjhmrw.mjs → settings-payload-BOcxsZ6k.mjs} +5 -5
  125. package/dist/{settings-write-C5huI-iS.mjs → settings-write-BuMPL1rd.mjs} +6 -6
  126. package/dist/settings.schema.json +32 -2
  127. package/dist/{simslim-DlBvwgeF.mjs → simslim-BMgpTRWe.mjs} +2 -2
  128. package/dist/{slot-launch-qEQVTth7.mjs → slot-launch-BIm9w8kH.mjs} +6 -6
  129. package/dist/{stage-CxVI_MlP.mjs → stage-CX1Byp3n.mjs} +6 -5
  130. package/dist/{start-CVzivp35.mjs → start-BZWr85b2.mjs} +1 -1
  131. package/dist/{start-YpT_JpQQ.mjs → start-DI0ofPO-.mjs} +12 -12
  132. package/dist/{state-B4B5P4LU.mjs → state-45P8Kd6Z.mjs} +2 -2
  133. package/dist/{state-B9VFI6r0.mjs → state-C2vELPyr.mjs} +4 -4
  134. package/dist/{stats-COoePEri.mjs → stats-BDljWVWU.mjs} +5 -5
  135. package/dist/{stats-report-BVRCqwWA.mjs → stats-report-Ci6TAfFm.mjs} +1 -1
  136. package/dist/{status-CIvU5-TF.mjs → status-BG2S-a1d.mjs} +1 -1
  137. package/dist/{status-CQWmNl1f.mjs → status-C2PdxK6q.mjs} +1 -1
  138. package/dist/{status-CIg0k7Qb.mjs → status-DEZjHP4q.mjs} +32 -34
  139. package/dist/{status-watch--rfZynD_.mjs → status-watch-Cs18eFkQ.mjs} +5 -5
  140. package/dist/status-worker.mjs +1 -1
  141. package/dist/{stim-desktop-D0P_bzmd.mjs → stim-desktop-DWGAfaud.mjs} +2 -2
  142. package/dist/{stop-BiI4_VFG.mjs → stop-B2zDplJa.mjs} +2 -2
  143. package/dist/{stop-C3d5qG7C.mjs → stop-BPrTEOaz.mjs} +16 -16
  144. package/dist/{stop-BEBBruvD.mjs → stop-DrxHVVX9.mjs} +5 -5
  145. package/dist/supervisor-run.mjs +15 -15
  146. package/dist/{support-BJbXovoO.mjs → support-BeVRaMWT.mjs} +13 -14
  147. package/dist/{support-Vckdzrmk.mjs → support-DBKG3Yyb.mjs} +7 -7
  148. package/dist/{swiftpm-artifact-inputs-DbuF-Yrr.mjs → swiftpm-artifact-inputs-CfNAb6Vm.mjs} +4 -4
  149. package/dist/{swiftpm-macos-Bu8xeBfM.mjs → swiftpm-macos-xdHjJHIj.mjs} +11 -11
  150. package/dist/toolchain-CTsPS5tL.mjs +2 -0
  151. package/dist/{toolchain-DCnWAxQL.mjs → toolchain-CZvtCZ-m.mjs} +11 -8
  152. package/dist/trigger-Bp3lruF2.mjs +2 -0
  153. package/dist/{trigger-BtB4kbe0.mjs → trigger-G_gbfIVB.mjs} +2 -2
  154. package/dist/{warm-progress-DwsGBpph.mjs → warm-progress-D3a0KviW.mjs} +20 -16
  155. package/dist/{web-D2En0Wa5.mjs → web-BvAweypa.mjs} +9 -9
  156. package/dist/web-DDL3usMb.mjs +2 -0
  157. package/dist/web-run.mjs +8 -8
  158. package/dist/windows-report.mjs +1 -1
  159. package/dist/{workspace-state-BhwAJBgA.mjs → workspace-state-CHEN_xzy.mjs} +3 -3
  160. package/dist/{workspaces-Dh5N70qW.mjs → workspaces-BgAYIccE.mjs} +218 -54
  161. package/dist/{worktree-DLm4s2Ib.mjs → worktree-C0YZ6mnk.mjs} +1 -1
  162. package/dist/{worktree-Yw3EW77B.mjs → worktree-kGPE9Pcw.mjs} +339 -37
  163. package/package.json +7 -7
  164. package/dist/server-expo-BWJDa7Qb.mjs +0 -2
  165. package/dist/toolchain-CIRdNl-c.mjs +0 -2
  166. package/dist/trigger-D8B7QR0q.mjs +0 -2
  167. package/dist/web-Dpj70t4p.mjs +0 -2
@@ -1,8 +1,8 @@
1
- import { t as ANDROID_AVD_CONFIG_HELP } from "./settings-Bap-qjnp.mjs";
2
- import { i as findProjectRoot$1 } from "./project-Clk1JAWL.mjs";
3
- import { h as RECENT_LAUNCH_MS } from "./eas-session-ledger-CXZ4aix0.mjs";
4
- import { o as guideStatus, t as WATCHMAN_NESTED_WORKTREES } from "./doctor-watchman-TZxYt_98.mjs";
5
- import "./status-watch--rfZynD_.mjs";
1
+ import { t as ANDROID_AVD_CONFIG_HELP } from "./settings-Cz8kQJzr.mjs";
2
+ import { i as findProjectRoot$1 } from "./project-DIo71tGq.mjs";
3
+ import { h as RECENT_LAUNCH_MS } from "./eas-session-ledger-BDpSdFDM.mjs";
4
+ import { o as guideStatus, t as WATCHMAN_NESTED_WORKTREES } from "./doctor-watchman-B8e3s9ko.mjs";
5
+ import "./status-watch-Cs18eFkQ.mjs";
6
6
  import { SETTINGS, SETTINGS_SCHEMA_URL, TUTORIAL_VERSION } from "@stim-cli/core/state";
7
7
  import chalk from "chalk";
8
8
  //#region src/guide/agent.ts
@@ -616,8 +616,15 @@ All methods accept signal. run builds, installs and launches. iOS and Android ru
616
616
  also accept recordedBuild: true, which installs and launches the app the last
617
617
  build with the same scheme and configuration (or variant) recorded in this
618
618
  workspace, without fingerprinting, building or replacing its JS, and refuses with
619
- STIM_NO_RECORDED_BUILD when there is none. @stim-cli/ci uses it; the CLI and the
620
- private Desktop transport do not.
619
+ STIM_NO_RECORDED_BUILD when there is none. They also accept cleanAppState: true,
620
+ which before install uninstalls every other user app except XCUITest runners
621
+ (*.xctrunner) and clears the app's data
622
+ (iOS: defaults, data container and the simulator keychain; Android: pm clear),
623
+ whether or not the install is skipped, on a local simulator or emulator only: a
624
+ run placed on another machine or on EAS is not cleaned. Both refuse device, and
625
+ cleanAppState refuses a local simulator or emulator Stim does not own, with
626
+ STIM_BAD_ARG.
627
+ @stim-cli/ci sets both; the CLI and the private Desktop transport set neither.
621
628
  Web requires a running server, just like stim web.
622
629
 
623
630
  build produces an artifact without acquiring a device, starting a runtime, or
@@ -635,13 +642,18 @@ Build options:
635
642
  ios: scheme, configuration, arch (arm64, x86_64, all), buildCache, remoteBuild, easProfile
636
643
  android: variant, abi (arm64-v8a, armeabi-v7a, x86, x86_64, all), buildCache, remoteBuild, easProfile
637
644
  macos: remoteBuild
638
- An iOS build targets the simulator. A Debug build defaults to the host
639
- architecture (Android only while optimizations.android.targetAbiOnly is on, the
640
- default); Release defaults to all. macOS builds the configured Debug SwiftPM app.
645
+ An iOS build targets the simulator and defaults to the host architecture in
646
+ every configuration; arch all builds every architecture the project lists. An
647
+ Android Debug build defaults to the host ABI while
648
+ optimizations.android.targetAbiOnly is on, the default; Release defaults to all.
649
+ macOS builds the configured Debug SwiftPM app.
641
650
  Build results retain an owned appPath (iOS), apkPath (Android) or bundle (macOS)
642
- inside this workspace until worktree removal. Later builds keep earlier copies. An iOS or
643
- Android build also records its app in workspace state for recordedBuild runs; the
644
- last build per scheme and configuration or variant wins. easProfile downloads a
651
+ inside this workspace. An iOS or Android build also records its app in workspace
652
+ state for recordedBuild runs; the last build per scheme and configuration or
653
+ variant wins. A successful build removes the workspace's other copies for its
654
+ platform that no recorded build points to, so a copy lasts until a build replaces
655
+ its record (for macOS, until the next macOS build) or the worktree is removed.
656
+ Copy or export a result you need to keep before the next build. easProfile downloads a
645
657
  completed EAS development build instead of compiling; it never starts an EAS build.
646
658
  A build leaves a running app's last build record and build log untouched; it
647
659
  writes its own build-artifact-<platform>.ndjson. No distribution archive or web build
@@ -958,12 +970,14 @@ leased until <time>" for each one.`,
958
970
  the ios.scheme setting; absent for automatic selection;
959
971
  not the app URL scheme
960
972
  cacheKey the shared-build-cache key derived from it (the
961
- configuration is part of it: -release-sim vs
973
+ configuration is part of it: -release-sim-arm64 vs
962
974
  -debug-sim-arm64). A single-architecture simulator build
963
- ends in its architecture (-arm64 or -x86-64): a local Debug
964
- build compiles this machine's, a --remote build the remote
965
- host's. A local non-Debug simulator build compiles every
966
- architecture the project lists and has no suffix
975
+ ends in its architecture (-arm64 or -x86-64): a local build
976
+ compiles this machine's in every configuration, a --remote
977
+ build the remote host's (a React Native Release build
978
+ offloaded to a worker may also contain other
979
+ architectures). A build of every architecture the project
980
+ lists (stim build --arch all) has no suffix
967
981
  With --eas-profile, fingerprint is computed by EAS CLI using the selected
968
982
  profile/environment, and cacheKey identifies the EAS project and build ID
969
983
  separately from local native builds. cacheHit is "remote" for the EAS
@@ -1627,7 +1641,8 @@ RULES
1627
1641
  invalidProjects { path } the registry key is not absolute
1628
1642
  orphanedPorts { project, label, port }
1629
1643
  orphanedWorkspaces { dir, projectRoot, bytes } --delete removes the
1630
- whole workspace directory
1644
+ whole workspace directory; projectRoot is null
1645
+ for an empty directory with no workspace.json
1631
1646
  linkedWorktrees { path, idleDays, mergedInto, pullRequest,
1632
1647
  pullRequestUnknown, willRemove, reason,
1633
1648
  detail, eligibleAt, buildState } mergedInto is the
@@ -1718,9 +1733,10 @@ RULES
1718
1733
  whose absolute workspace root is missing on a
1719
1734
  mounted volume; --delete forgets the entry
1720
1735
  only and contacts no EAS session
1721
- staleStatusCaches { kind: "disk-usage" | "pull-request", path,
1722
- file, bytes } entries of $STIM_HOME/disk-usage
1723
- and pull-requests whose path is gone from a
1736
+ staleStatusCaches { kind: "disk-usage" | "pull-request" | "git-merge",
1737
+ path, file, bytes } entries of
1738
+ $STIM_HOME/disk-usage, pull-requests and
1739
+ git-merge whose path is gone from a
1724
1740
  mounted volume; --delete removes the file
1725
1741
  idleDevices { kind, id, name, project, slot, lastActivityAt,
1726
1742
  idleForMs, buildInProgress } booted owned
@@ -1759,7 +1775,7 @@ RULES
1759
1775
  workspaceBuildOutputs { dir, projectRoot, inTreeDirs, bytes, idleDays,
1760
1776
  willClear, reason, detail } derived-data,
1761
1777
  gradle-build, android-cas, cache-provider,
1762
- macos/build, macos/<Product>.app and
1778
+ js-swap-tmp, macos/build, macos/<Product>.app and
1763
1779
  macos/staging-* of each workspace; inTreeDirs
1764
1780
  lists the project's android/app/build,
1765
1781
  android/build,
@@ -1855,12 +1871,14 @@ RULES
1855
1871
  "busy" | "unknown", reclaimable, reason,
1856
1872
  detail } without --cache, or with --cache
1857
1873
  watchman or gradle-daemons; reclaimable marks
1858
- the ones gc --delete --cache <cacheKind>
1859
- would stop (\`guide cleanup memory\`)
1874
+ the ones gc --delete would stop (watchman) or
1875
+ gc --delete --cache gradle-daemons would
1876
+ (\`guide cleanup memory\`)
1860
1877
  watchmanRoots { path, stale: "missing" | "pruned-worktree" |
1861
1878
  null, subscriptions, triggers, removable,
1862
1879
  detail } removable marks the stale roots
1863
- --cache watchman would watch-del
1880
+ gc --delete (or --cache watchman) would
1881
+ watch-del
1864
1882
  memoryNotices { message } why the memory sweep was skipped
1865
1883
  bytes is null when the size is unknown: not measured, or the measurement
1866
1884
  failed. idleDays is null when the last use is unknown. listed is false for
@@ -2846,6 +2864,9 @@ project's before exiting. You get your shell back with a bundler running: no
2846
2864
  backgrounding idiom, no sleep, no poll loop, and no chance of building against
2847
2865
  another worktree's bundler.
2848
2866
 
2867
+ If Expo cannot be resolved in a linked worktree, run \`stim worktree warm\`
2868
+ there before retrying. The refusal also names dependency installation.
2869
+
2849
2870
  --json one line of facts on stdout, everything else on stderr:
2850
2871
  { port, supervisorPid, mode, logsDir, alreadyRunning }
2851
2872
  --wait <seconds> how long to wait for server and remote tunnel readiness
@@ -3014,8 +3035,9 @@ WHAT THE SUPERVISOR IS
3014
3035
  for the bundle lines.
3015
3036
 
3016
3037
  expo-child and command-child put the Node the app pins (.nvmrc,
3017
- .node-version, .tool-versions nodejs, or package.json volta.node) first
3018
- on PATH when an nvm, fnm, Volta, asdf, mise or linked Homebrew
3038
+ .node-version, .tool-versions nodejs, or package.json volta.node), looking
3039
+ from the app directory up to its repository or worktree root, first on PATH
3040
+ when an nvm, fnm, Volta, asdf, mise or linked Homebrew
3019
3041
  node/node@NN install satisfies the pin and the node already on PATH does
3020
3042
  not; the metro log then records a project_node event naming it. When no
3021
3043
  install has the version the pin names, the newest install of the pinned
@@ -4043,7 +4065,8 @@ Branch on the code, never on the message.`,
4043
4065
  the first diagnostics are the phase names and the last error lines the
4044
4066
  script printed, ahead of the compiler diagnostics.
4045
4067
  Three Android refusals share this code without gradle itself failing:
4046
- - NO ANDROID SDK, before gradle starts: nothing exists at the SDK path
4068
+ - NO ANDROID SDK, before gradle starts: local React Native emulator runs
4069
+ refuse before Metro or device setup. Nothing exists at the SDK path
4047
4070
  Stim resolves (ANDROID_HOME, else ANDROID_SDK_ROOT, else the default
4048
4071
  location), and there is no android/local.properties. Set ANDROID_HOME to the SDK or write sdk.dir
4049
4072
  into android/local.properties; \`stim doctor --platform android\` reports
@@ -4285,7 +4308,9 @@ too old to speak protocol 2, incompatible
4285
4308
  toolchain/runtime/CPU, low disk, busy, sync/build failure, artifact failure,
4286
4309
  or a checkout that changed while it built. Unsupported build kinds also refuse.
4287
4310
  No local xcodebuild, Gradle or SwiftPM compile or alternate machine follows a
4288
- refusal. For stim ios, a toolchain difference on the named machine, such as Xcode,
4311
+ refusal. For stim android, a known toolchain refusal on the named machine stops
4312
+ before prebuild; busy, low disk and unreachable are checked again afterward.
4313
+ For stim ios, a toolchain difference on the named machine, such as Xcode,
4289
4314
  the simulator runtime or the CPU, refuses before this machine runs prebuild or pod
4290
4315
  install, even when prebuild would have produced an app the local cache already holds, or the
4291
4316
  machine already holds the exact artifact. A
@@ -4780,7 +4805,8 @@ so a Debug run on one is wired to a LAN origin instead of localhost.`,
4780
4805
  owned by this Stim home, or it is not booted or running. Permission and push
4781
4806
  also refuse when no app is recorded for the device. Run the platform command
4782
4807
  the remedy names (\`stim ios\` or \`stim android\`, with \`--slot\` for a named
4783
- slot) and retry. No tool runs before this refusal.`
4808
+ slot) and retry. A non-Mac client cannot run a local iOS simulator; run the
4809
+ iOS tool on a Mac with a local Stim-owned simulator. No tool runs before this refusal.`
4784
4810
  },
4785
4811
  STIM_DEVICE_TOOL_UNSUPPORTED: {
4786
4812
  summary: "that device tool has no equivalent on that platform",
@@ -5562,6 +5588,16 @@ not on any remote" (worktree remove)
5562
5588
  source path and warm cannot move it, it prints "removed <dir>/Pods/Manifest.lock
5563
5589
  so pod install runs" and \`stim ios\` runs \`pod install\`.
5564
5590
 
5591
+ "carry left out <app>/<platform>: <reason>"
5592
+ The app is an Expo project whose ios/ or android/ Git ignores, and Stim
5593
+ cannot show the source checkout's copy was generated from the app's current
5594
+ inputs: Stim has no prebuild record for it, its last prebuild did not
5595
+ finish, or the record names an earlier native fingerprint. Warm does not
5596
+ copy it, so the first \`stim <platform>\` in this worktree generates it
5597
+ fresh. Nothing to fix. To let later warms copy it, delete <platform>/ in
5598
+ the source checkout and run \`stim <platform>\` there, so Stim generates it
5599
+ fresh and records that.
5600
+
5565
5601
  "carry carried <dir>/Pods but there is no <dir>/Podfile.lock"
5566
5602
  Warm copied Pods but the destination has no Podfile.lock. Follow the printed
5567
5603
  pod-install command before building.
@@ -6189,7 +6225,9 @@ not the caller's. The returned fingerprint remains null; transfer digests never
6189
6225
  become reusable APK cache keys. Workers with native-gradle-peer-cache can offer a
6190
6226
  completed APK for declared source and resolved variant, ABI and build options,
6191
6227
  rechecking current private inputs against the saved receipt at offer and fetch.
6192
- A hit skips source upload and compilation even while that worker is busy or
6228
+ When this machine has a JDK, native-gradle-peer-jdk also selects that exact
6229
+ JDK major for the private-input check. Older workers skip this lookup and use
6230
+ normal build placement. A hit skips source upload and compilation even while that worker is busy or
6193
6231
  this machine has room. A miss follows normal placement; older Gradle workers
6194
6232
  still build normally. Off mode, explicit local builds and disabled remote cache
6195
6233
  reads skip peer lookup. Hosts without native-gradle-build refuse before upload.
@@ -6218,6 +6256,7 @@ cleanup stops that workspace, including resources created before a build fails.
6218
6256
 
6219
6257
  Or install npm install --global @stim-cli/ci and use stim-ci directly.
6220
6258
  Platforms: ios, android, macos, web. Everything after -- is argv, not a shell.
6259
+ Without --, run installs and launches the app, then stops it with exit code 0.
6221
6260
  build is the only step that compiles (or restores from the cache, or with
6222
6261
  --eas-profile downloads an EAS development build). It records the app for this
6223
6262
  checkout, platform and selectors (iOS scheme and configuration, Android variant)
@@ -6228,6 +6267,16 @@ Metro from run. With no recorded build for the selectors, run refuses with
6228
6267
  STIM_NO_RECORDED_BUILD and names the stim-ci build command. Build and run must
6229
6268
  share the Stim home (--home or STIM_HOME). macOS and web run unchanged: macOS
6230
6269
  run builds the app itself.
6270
+ Every iOS and Android run on this machine starts from clean app state, even when
6271
+ the install is skipped: it uninstalls every other user app except XCUITest runners
6272
+ (*.xctrunner), clears the app's defaults and data
6273
+ container and resets the simulator keychain on iOS, and runs pm clear on Android.
6274
+ A run that ios.remote or android.remote places on another machine or on EAS is
6275
+ not cleaned. build always compiles on this machine and ignores remote.build. An
6276
+ iOS build, and an Android Debug build, target this machine's architecture only;
6277
+ when run can land on
6278
+ another machine or on EAS, build with --arch all (iOS) or --abi all (Android).
6279
+ Plain stim ios and stim android clean only a device they adopt.
6231
6280
  build exports nothing unless --export <path> is given (an APK, or a tar.gz).
6232
6281
  --artifacts selects a directory for result, test and diagnostic files; without
6233
6282
  it none are written, no logs are copied and the action uploads nothing.
@@ -6690,8 +6739,10 @@ ${HOSTED_RECORDING("simulator")}
6690
6739
 
6691
6740
  If hosting.agentDriver is none, the driver cannot enforce its policy, or the
6692
6741
  host does not advertise hosted-ios-agent, agent reports
6693
- { driver: 'none', setting: 'hosting.agentDriver' }. Update the host and check
6694
- its setting and agent-device installation. No other simulator becomes reachable.
6742
+ { driver: 'none', setting: 'hosting.agentDriver' }. A run whose host disables
6743
+ the driver prints a notice; plain status also names the host setting when
6744
+ agent control is unavailable. Update the host and check its setting and
6745
+ agent-device installation. No other simulator becomes reachable.
6695
6746
  Client hello carries only name and version, not features, so the host cannot gate
6696
6747
  daemon startup or grant issuance on client support. The client checks the host's
6697
6748
  hosted-ios-agent feature before using a grant.
@@ -7067,7 +7118,7 @@ result as proof instead of requiring an unrelated screenshot.`
7067
7118
  at adoption renamed for the adopting workspace, then, inside the boot
7068
7119
  the run pays anyway, \`simctl privacy reset all\` and
7069
7120
  \`simctl keychain reset\`; at install, every other user app
7070
- is uninstalled, and this workspace's app, when it is
7121
+ except XCUITest runners (*.xctrunner) is uninstalled, and this workspace's app, when it is
7071
7122
  installed, has its preferences domain deleted (an
7072
7123
  expo-dev-client app's is replaced by the two dev-menu-off
7073
7124
  keys, see \`guide facts devmenu\`) and its data
@@ -7735,7 +7786,7 @@ WHAT MAKES THE CACHE ACTUALLY HIT: .FINGERPRINTIGNORE
7735
7786
  looks exactly like a cache that is not there.
7736
7787
 
7737
7788
  Stim ignores paths a fresh checkout never has and no native Debug build
7738
- reads: android/local.properties, android/.idea, *.xcodeproj/xcuserdata, and,
7789
+ reads: android/local.properties, android/.idea, *.xcodeproj/xcuserdata, .git (and its contents), .expo, and,
7739
7790
  while a .gitignore pattern matches them (even when committed), the
7740
7791
  \`react-native bundle\` output ios/main.jsbundle and ios/assets. A project
7741
7792
  does not repeat those.
@@ -8048,7 +8099,7 @@ OPT-IN CONCURRENCY LIMITS (UNLIMITED BY DEFAULT)
8048
8099
  summary: "every flag per command, Android variants and flavors, the per-run simulator model, runtime and system image",
8049
8100
  body: () => `THE OPTION SURFACE, IN FULL
8050
8101
  start --json --wait <seconds> --remote --reset-cache
8051
- ios --remote-build <local|auto|remote|remote-only|name> --slot <name> --json --plan --no-metro-check --no-build-cache --scheme <name> --configuration <name> --device-type <name> --runtime <version> --simulator-app <xcode|siniulator|stim-desktop> --device [udid] --wait <seconds> --no-wait --remote <eas|proxy|local|auto|remote|remote-only|machine>
8102
+ ios --remote-build <local|auto|remote|remote-only|name> --slot <name> --json --plan --no-metro-check --no-build-cache --scheme <name> --configuration <name> --device-type <name> --runtime <version> --install-runtime --simulator-app <xcode|siniulator|stim-desktop> --device [udid] --wait <seconds> --no-wait --remote <eas|proxy|local|auto|remote|remote-only|machine>
8052
8103
  android --remote-build <local|auto|remote|remote-only|name> --slot <name> --json --plan --no-metro-check --no-build-cache --variant <name> --system-image <id> --device-profile <id> --device [serial] --wait <seconds> --no-wait --remote <proxy|eas|local|auto|remote|remote-only|machine>
8053
8104
  ios/android --wait bounds owned-device slot waits (default 600s), or physical
8054
8105
  leases with --device (default 60s). Remote targets do not join this local
@@ -8226,16 +8277,18 @@ OPT-IN CONCURRENCY LIMITS (UNLIMITED BY DEFAULT)
8226
8277
 
8227
8278
  Warm copies installed dependencies, Pods, native output, and other ignored
8228
8279
  paths eligible under the source checkout's Git ignore rules, including .env
8229
- and local configuration. The source's nonempty
8230
- .worktreeexclude replaces its resolved worktree.exclude setting. Nested
8231
- registered worktrees and ignored entries named .DS_Store, .DerivedData,
8232
- .idea, .jj or .pnpm-store are not copied, and neither is
8233
- android/build/generated/autolinking. Warm never walks a copied directory, so
8234
- a .DS_Store or .idea inside a copied directory stays. Warm deletes only
8235
- these paths from the copy: .pnpm-store in a copied node_modules (pnpm
8236
- refills it from the network or its global store), the autolinking directory
8237
- under a copied android, android/build or android/build/generated (Gradle
8238
- regenerates it for the destination checkout on its next build), and the
8280
+ and local configuration. The source's nonempty .worktreeexclude replaces its
8281
+ resolved worktree.exclude setting. Nested registered worktrees and ignored
8282
+ entries named .DS_Store, .DerivedData, .idea, .jj or .pnpm-store are not
8283
+ copied, and neither are android/build/generated/autolinking and .expo/types.
8284
+ Warm never walks a copied directory, so a .DS_Store or .idea inside a copied
8285
+ directory stays. Warm deletes only these paths from the copy: .pnpm-store in
8286
+ a copied node_modules (pnpm refills it from the network or its global
8287
+ store), the autolinking directory under a copied android, android/build or
8288
+ android/build/generated (Gradle regenerates it for the destination checkout
8289
+ on its next build), types in a copied .expo (Expo Router's typed routes,
8290
+ possibly generated from the source's older routes; Expo regenerates them on
8291
+ the destination's first expo start), and the
8239
8292
  expo-modules-jsi/apple/.DerivedData Xcode build state, directly under
8240
8293
  node_modules or in the pnpm virtual store. An ignored directory that Git
8241
8294
  reports above those names (for example an app directory with no tracked
@@ -8243,9 +8296,9 @@ OPT-IN CONCURRENCY LIMITS (UNLIMITED BY DEFAULT)
8243
8296
  $STIM_HOME/trash and a detached, low-priority rm deletes them after warm
8244
8297
  returns (through the programmatic API, before the call resolves); when the
8245
8298
  rename is not possible (Windows, $STIM_HOME on another volume), warm deletes
8246
- them before it returns. Warm also skips paths
8247
- overlapping a nested destination worktree or below a symlink ancestor.
8248
- Tracked .idea settings come from Git and stay untouched by warm.
8299
+ them before it returns. Warm also skips paths overlapping a nested
8300
+ destination worktree or below a symlink ancestor. Tracked .idea settings
8301
+ come from Git and stay untouched by warm.
8249
8302
 
8250
8303
  A carried ios/Pods still names the source checkout's path in its generated
8251
8304
  files and in the checksum of a podspec that embeds that path (the
@@ -8265,6 +8318,17 @@ OPT-IN CONCURRENCY LIMITS (UNLIMITED BY DEFAULT)
8265
8318
  cannot (stale node_modules, a leftover path, an error), warm deletes
8266
8319
  ios/Pods/Manifest.lock so \`stim ios\` runs \`pod install\`.
8267
8320
 
8321
+ In an Expo project whose ios/ or android/ Git ignores, warm copies that
8322
+ directory only when the source's last Stim prebuild of it ran on the app's
8323
+ current native fingerprint, and records the same prebuild in the worktree.
8324
+ Otherwise it leaves the directory out and prints
8325
+ "carry left out <app>/<platform>: <reason>"; the first
8326
+ \`stim <platform>\` there generates it fresh. A directory generated outside
8327
+ Stim has no record and is left out. To make it eligible, delete it in the
8328
+ source checkout and run \`stim <platform>\` there so Stim generates it
8329
+ fresh; running Stim over the existing directory records it as current even
8330
+ when it came from an older template.
8331
+
8268
8332
  Other generated state stays eligible: .gradle, .cxx, *.tsbuildinfo, build
8269
8333
  directories, and embedded JavaScript need project-specific decisions about
8270
8334
  regeneration. Native intermediates can record the source checkout's paths;
@@ -8328,6 +8392,26 @@ OPT-IN CONCURRENCY LIMITS (UNLIMITED BY DEFAULT)
8328
8392
  ios.runtime, android.systemImage, android.deviceProfile) for that one
8329
8393
  invocation, exactly as \`--configuration\` overrides ios.configuration.
8330
8394
 
8395
+ \`stim ios --runtime 26.5 --install-runtime --remote local\` installs that
8396
+ missing iOS runtime with Xcode, then continues the run. Use
8397
+ \`--remote <mac>\` for a named approved hosting Mac, including from Linux.
8398
+ ios.autoInstallRuntime enables the same opt-in for an explicit ios.runtime
8399
+ or --runtime version; it defaults to false. Installation requires an exact
8400
+ major.minor[.patch] version, about 8-10 GB to download (actual size varies),
8401
+ and at least 20 GB free on the simulator volume for download and unpacking.
8402
+ A child-aware ownership claim serializes Stim installs in this Mac's Stim
8403
+ home and the installer takes an available build slot. Run output shows
8404
+ Xcode progress locally and periodic waiting messages remotely; status shows
8405
+ the install phase and remote machine. Without opt-in, a missing runtime
8406
+ still refuses. Automatic placement, eas/proxy and physical-device runs do
8407
+ not install runtimes: choose --remote local or one named Mac first.
8408
+ Xcode Settings > Components lists downloadable versions supported by Xcode;
8409
+ Stim retains Xcode's error for unavailable versions. Installed versions
8410
+ appear in stim doctor and xcrun simctl list runtimes. Runtimes are shared
8411
+ Xcode components, not Stim-owned devices: remove them manually through
8412
+ Xcode Settings > Components after checking other workspaces no longer need
8413
+ them. Stim does not prune them.
8414
+
8331
8415
  A name that is not INSTALLED on this machine refuses with STIM_BAD_ARG
8332
8416
  before anything is created, and the message lists the installed names, so a
8333
8417
  wrong guess is one command, not a created simulator. A blank value is the
@@ -8730,6 +8814,9 @@ THE POOL: WHICH DEVICE AN ID-LESS \`--device\` PICKS
8730
8814
  alive on the device rather than by a bundle fetch. Device logs are still
8731
8815
  collected, so \`logs --errors\` answers "does it repro in release/Hermes
8732
8816
  bytecode".
8817
+ EAS and proxy adapters cannot verify a release or native process launch:
8818
+ launched stays "unverified" with a notice that process verification is
8819
+ unavailable. These adapters collect no device logs or native crash reports.
8733
8820
 
8734
8821
  On a release CACHE HIT the cached APK carries its BUILDER's baked-in JS, so
8735
8822
  it is never installed as-is. Stim copies it aside, regenerates this
@@ -8740,7 +8827,11 @@ THE POOL: WHICH DEVICE AN ID-LESS \`--device\` PICKS
8740
8827
  mmaps it), then zipaligns and re-signs with apksigner. The keystore defaults
8741
8828
  to android/app/debug.keystore with the standard password; android.keystore /
8742
8829
  android.keystorePassword override it (see \`guide settings\`). The cache
8743
- entry itself is never modified.
8830
+ entry itself is never modified. The bundler runs with TMPDIR set to the
8831
+ workspace's js-swap-tmp/, which holds Metro's default cache; Stim empties it
8832
+ when an EXPO_PUBLIC_ value, EXPO_NO_DOTENV, NODE_ENV or a .env* file in the
8833
+ project root differs from the previous swap's. A metro.config.js that sets
8834
+ its own cacheStores keeps its own cache location.
8744
8835
 
8745
8836
  AN EXPO-UPDATES APP GETS A FRESH EMBEDDED UPDATE. expo-updates launches the
8746
8837
  update with the newest commitTime for the binary's runtime version, and the
@@ -8792,13 +8883,16 @@ THE POOL: WHICH DEVICE AN ID-LESS \`--device\` PICKS
8792
8883
  skips Metro ENTIRELY: no gate, no port wiring, no dev-client deep link (a
8793
8884
  plain \`simctl launch\`), and the payload says \`metroPort: null\` --
8794
8885
  \`launched\` is verified by the app PROCESS staying alive, not by a bundle
8795
- fetch. The build cache keys on the configuration
8796
- (\`<fingerprint>-release-sim\`), and because a cached Release .app carries
8797
- its builder's baked-in JS, a cache hit regenerates THIS workspace's bundle
8886
+ fetch. The build cache keys on the configuration and this Mac's simulator
8887
+ architecture, the only one a local build compiles
8888
+ (\`<fingerprint>-release-sim-arm64\`), and because a cached Release .app
8889
+ carries its builder's baked-in JS, a cache hit regenerates THIS workspace's bundle
8798
8890
  (the project's own \`expo export:embed\` / \`react-native bundle\`, plus
8799
8891
  its own hermesc when Hermes is enabled) into a copy of the artifact,
8800
8892
  refreshes an expo-updates manifest as described above, re-signs it and
8801
- installs that; any swap failure falls back to a full build
8893
+ installs that. Like the Android swap, it bundles with a workspace-private
8894
+ default Metro cache that is emptied when the EXPO_PUBLIC_ values,
8895
+ EXPO_NO_DOTENV, NODE_ENV or .env* files change. Any swap failure falls back to a full build
8802
8896
  rather than ever installing stale JS. A simulator Release build can run on
8803
8897
  a remote machine (stim guide settings, remote.build), which bundles the JS
8804
8898
  of the checkout it synced, its gitignored .env.production files included,
@@ -9049,8 +9143,9 @@ In on mode a pass runs, cheapest to rebuild first:
9049
9143
  3. build-cache and Metro entries, least recently used first, down to
9050
9144
  maintenance.capTargetPercent of caches.buildCacheMaxGb or
9051
9145
  caches.metroCacheMaxGb, and entries unused for olderThanDays
9052
- 4. the Swift compilation cache, emptied whole, only below
9053
- budget.hardFloorDiskGb, and kept while an iOS build holds its shared
9146
+ 4. the Swift compilation cache, emptied whole once it is over
9147
+ caches.swiftCompilationCacheMaxGb (default 0, no cap), whatever the free
9148
+ disk, and kept while an iOS build holds its shared
9054
9149
  claim (taken for each xcodebuild run that compiles with it) or that
9055
9150
  claim is unresolved; the emptying holds the exclusive claim
9056
9151
  5. linked worktrees whose branch or pull request finished (gc's finished
@@ -9248,8 +9343,9 @@ WHAT RECLAIMS AN OWNED DEVICE
9248
9343
  shuts DOWN (never deletes) owned devices with no
9249
9344
  driver, claim or activity for that long
9250
9345
 
9251
- \`gc --delete --cache watchman\` and \`gc --delete --cache gradle-daemons\`
9252
- stop shared helper processes, not devices (\`guide cleanup memory\`).
9346
+ \`gc --delete\` also shuts down an unused watchman daemon, and \`gc --delete
9347
+ --cache gradle-daemons\` stops idle Gradle and Kotlin daemons. They are shared
9348
+ helper processes, not devices (\`guide cleanup memory\`).
9253
9349
 
9254
9350
  \`worktree remove\` and \`gc --delete\` are the only two commands that delete;
9255
9351
  \`gc --delete\` deletes worktrees only through \`worktree remove\`. \`gc
@@ -9722,8 +9818,15 @@ ORPHANED WORKSPACE DIRECTORIES
9722
9818
  "Orphaned workspace directories" when the recorded project root is gone,
9723
9819
  its volume is mounted, no registry key equals it or sits under it, and the
9724
9820
  workspace is not in use. \`gc --delete\` re-checks each one, then removes
9725
- it. A directory with a missing or unparseable workspace.json, or a root on
9726
- an unmounted volume, is reported under Skipped and never deleted.
9821
+ it. A directory with an unparseable workspace.json, or a root on an
9822
+ unmounted volume, is reported under Skipped and never deleted.
9823
+ A directory with no workspace.json that holds only leftovers of a removed
9824
+ workspace is reported the same way: maintenance.ndjson, log-error-index.json,
9825
+ ended-agents.json, empty lock files and an agent-device directory with no
9826
+ running daemon. It counts as gone when it is empty, or when the project
9827
+ root its maintenance log names maps to the directory name and is gone. Any
9828
+ other file (state.json, for one), a held lock or a log naming no root keeps
9829
+ it under Skipped. The empty directory report has no project root.
9727
9830
 
9728
9831
  DELETED WORKTREES STILL REGISTERED
9729
9832
  A worktree deleted outside Stim keeps its registry entry; \`stim status\`
@@ -9758,9 +9861,11 @@ TMPDIR LEFTOVERS
9758
9861
  STALE STATUS CACHE ENTRIES
9759
9862
  \`stim status\` caches each folder's size under $STIM_HOME/disk-usage and
9760
9863
  each worktree's pull request under $STIM_HOME/pull-requests, which the
9761
- maintenance worktree check and \`gc --delete\` also write. \`worktree
9864
+ maintenance worktree check and \`gc --delete\` also write. The merge check
9865
+ caches each worktree's verdict under $STIM_HOME/git-merge. \`worktree
9762
9866
  remove\` drops the entries of the worktree it removed (its checkout,
9763
- node_modules and workspace folder, and its pull request), not the size
9867
+ node_modules and workspace folder, its pull request and its merge
9868
+ verdict), not the size
9764
9869
  entries of its owned devices' data folders. \`gc\` reports the
9765
9870
  entries of a folder or worktree that was removed some other way under "Stale
9766
9871
  status cache entries", and \`gc --delete\` removes them. An entry counts as
@@ -9819,6 +9924,10 @@ WHICH stim-* DEVICES gc DELETES
9819
9924
  \`rm -rf <dir>\` for AVD data with no registration), and
9820
9925
  never runs it. Boot, shutdown and teardown re-check ownership by the same
9821
9926
  rule, so a device that stops matching is left alone.
9927
+ With STIM_HOME set, gc skips the device sweep because simulators and AVDs
9928
+ are machine-global, but pruning a dead project still deletes the devices its
9929
+ record marks as owned. gc lists them as to be deleted under "Device sweep
9930
+ notices"; every other stim-* device is reported as not touched.
9822
9931
 
9823
9932
  ANDROID DATA WITHOUT A REGISTRATION
9824
9933
  \`gc\` also reports stim-*.avd directories whose .ini registration is
@@ -9838,6 +9947,9 @@ BUILD LOCKS
9838
9947
  \`gc --delete\` clears them. A lock whose builder IS running is a build in
9839
9948
  progress -- it is named in the report and touched by nothing, because
9840
9949
  removing it would put a second workspace on the same compile.
9950
+ \`gc --delete\` also removes the empty directories under ~/.stim/process-locks
9951
+ that removed projects and worktrees leave behind; it never touches a lock
9952
+ that holds a claim.
9841
9953
 
9842
9954
  DEVICE LEASES
9843
9955
  A workspace can hold a timed lease on a physical device. The lease is one
@@ -9988,7 +10100,7 @@ THE ONE CASE GC WILL NOT REAP
9988
10100
  Wall-clock timestamps and command names are not ownership proof.`
9989
10101
  },
9990
10102
  memory: {
9991
- summary: "watchman and Gradle and Kotlin daemon memory in gc, and when gc --delete --cache watchman or gradle-daemons stops them",
10103
+ summary: "watchman and Gradle and Kotlin daemon memory in gc, and when gc --delete and gc --delete --cache gradle-daemons stop them",
9992
10104
  body: () => `MEMORY
9993
10105
  Every \`gc\` without --cache, and \`gc --cache watchman\` or
9994
10106
  \`gc --cache gradle-daemons\`, reports the long-lived helpers that grow while
@@ -9996,19 +10108,22 @@ THE ONE CASE GC WILL NOT REAP
9996
10108
  daemons. Each line gives the pid, physical footprint (the measure status
9997
10109
  uses; resident size when the footprint cannot be read), uptime and whether
9998
10110
  it is idle, and a kept one says why. The reclaimable line totals what
9999
- the two commands below would free now.
10111
+ the commands below would free now.
10000
10112
 
10001
- Only these two commands stop anything, and each acts only on its own kind.
10002
- Neither a plain \`gc --delete\` nor \`--cache all\` touches them:
10003
- stim gc --delete --cache watchman
10113
+ Watchman is stopped by a plain \`gc --delete\` and by \`gc --delete --cache
10114
+ watchman\`; \`--cache all\` and every other \`--cache\` value leave it alone.
10115
+ The Gradle and Kotlin daemons are stopped only by \`--cache gradle-daemons\`:
10116
+ stim gc --delete (or: stim gc --delete --cache watchman)
10004
10117
  runs \`watchman watch-del\` on each stale root
10005
10118
  with no subscription or trigger, then
10006
10119
  \`watchman shutdown-server\` only when
10007
10120
  \`debug-status\` lists no client but gc's own
10008
- call and no root has a trigger; otherwise
10009
- the daemon is kept and the report names
10010
- each client, as the Stim workspace whose
10011
- dev server it belongs to where it can
10121
+ call, every root's subscriptions and
10122
+ triggers were readable and no root has a
10123
+ trigger; otherwise the daemon is kept and
10124
+ the report names each client, as the Stim
10125
+ workspace whose dev server it belongs to
10126
+ where it can
10012
10127
  stim gc --delete --cache gradle-daemons
10013
10128
  stops each Gradle daemon its own
10014
10129
  \`gradle --status\` reports IDLE, then each
@@ -10118,7 +10233,7 @@ a changed value.
10118
10233
 
10119
10234
  WORKSPACE BUILD OUTPUTS
10120
10235
  Each workspace directory holds derived-data/, gradle-build/, android-cas/,
10121
- cache-provider/, macos/build, the staged macos/<Product>.app and macos/staging-*
10236
+ cache-provider/, js-swap-tmp/, macos/build, the staged macos/<Product>.app and macos/staging-*
10122
10237
  leftovers. The project's own android/app/build, android/build,
10123
10238
  android/.gradle and .build count with them when git ignores every file in
10124
10239
  the directory and tracks none; one that fails that check, or is not in a
@@ -10235,8 +10350,13 @@ DEVICE RECORDINGS
10235
10350
  stays.
10236
10351
 
10237
10352
  SHARED BUILD CACHES
10238
- The caches that make a second workspace fast are alive by design and never
10239
- included in a plain \`gc --delete\`. Every \`gc\` run reports them anyway,
10353
+ The caches that make a second workspace fast are alive by design and, with
10354
+ one exception, not touched by a plain \`gc --delete\`. The exception is the
10355
+ Swift compilation cache (the Xcode CAS under $STIM_HOME/compilation-cache):
10356
+ once it is over caches.swiftCompilationCacheMaxGb (default 0, no cap), a
10357
+ plain \`gc --delete\` empties it whole, since age trimming would corrupt its
10358
+ index. It is kept, with the build named, while an iOS build holds its shared
10359
+ claim or that claim is unresolved. Every \`gc\` run reports them anyway,
10240
10360
  each row tagged (registered) or (detected), with its size:
10241
10361
  stim gc # report, caches included
10242
10362
  stim gc --delete --older-than 30 # trim entries nothing has used
@@ -10363,6 +10483,15 @@ KEYS STIM READS
10363
10483
  The \`--runtime\` flag overrides this per invocation,
10364
10484
  and an uninstalled version refuses the same way,
10365
10485
  naming the layer the value came from
10486
+ ios.autoInstallRuntime false (default). With true and an explicit ios.runtime
10487
+ or --runtime version, install a missing iOS runtime
10488
+ with Xcode on the local or named approved Mac before
10489
+ continuing. --install-runtime opts in for one run.
10490
+ Requires 20 GB free for download and unpacking;
10491
+ typically downloads 8-10 GB (actual size varies).
10492
+ Automatic placement, eas/proxy and physical phones
10493
+ do not install runtimes. Shared runtimes are removed
10494
+ manually in Xcode Settings > Components.
10366
10495
  ios.scheme e.g. "RNTester" -- the shared Xcode scheme to build
10367
10496
  when the workspace lists several and none matches
10368
10497
  its name, which otherwise refuses with
@@ -10376,7 +10505,7 @@ KEYS STIM READS
10376
10505
  (simulator only). Committing
10377
10506
  { "ios": { "configuration": "Release" } } makes every
10378
10507
  \`stim ios\` in the app a release-shaped build:
10379
- embedded JS, no Metro, cache keyed -release-sim, and
10508
+ embedded JS, no Metro, cache keyed -release-sim-<arch>, and
10380
10509
  a JS-bundle swap on cache hits. The \`--configuration\`
10381
10510
  flag overrides this per invocation. Unset means Debug.
10382
10511
  ios.remote where the simulator runs, with the same meaning as
@@ -11330,7 +11459,7 @@ stats. A listed paired name with a cache hit compiles nothing, contacts no worke
11330
11459
  and records buildMachine with builtOn absent. Build failures retain the selected
11331
11460
  value; builtOn is here or the configured machine entry when compilation ran.
11332
11461
  Prebuild and pod install still run on this machine before a named offload; stim ios
11333
- checks the machine's toolchain first. A refusal
11462
+ and stim android check the machine's toolchain first. A refusal
11334
11463
  starts no local xcodebuild, Gradle or SwiftPM compile.
11335
11464
  A React Native offload sends the tracked and untracked files, and the gitignored
11336
11465
  files the native fingerprint hashes or the Expo config reads, such as .env.local
@@ -11424,7 +11553,9 @@ do not query peer caches. Older workers continue normal placement. This peer
11424
11553
  lookup also covers declared native Gradle worker APKs when the worker supports
11425
11554
  native-gradle-peer-cache. It rechecks current private inputs against the saved
11426
11555
  receipt at offer and fetch for the requested source, resolved variant, ABI and
11427
- build options. Caller fingerprints stay null; worker keys stay worker-scoped.
11556
+ build options. With a known local JDK, lookup also requires native-gradle-peer-jdk
11557
+ and rechecks on that exact JDK major; older workers use normal build placement.
11558
+ Caller fingerprints stay null; worker keys stay worker-scoped.
11428
11559
  React Native and Expo development builds also query enabled paired workers
11429
11560
  with react-native-peer-cache after local and configured-provider misses. Their
11430
11561
  post-mutation fingerprint, native build choices and compatible toolchain must
@@ -1,7 +1,7 @@
1
- import { d as throwIfCancelled } from "./exec-CGuDzt40.mjs";
2
- import { l as call, u as connectHost } from "./hosted-client-DMOOu8vD.mjs";
3
- import { a as requestHostedMetro } from "./metro-request-O8Q-JvBg.mjs";
4
- import { a as stopHostedNative, i as prepareHostedNative, r as placeHostedNative } from "./hosted-native-BiiUG_Q6.mjs";
1
+ import { d as throwIfCancelled } from "./exec-L37dbiIb.mjs";
2
+ import { l as call, u as connectHost } from "./hosted-client-B_h_bTlz.mjs";
3
+ import { a as requestHostedMetro } from "./metro-request-BWCl3Zco.mjs";
4
+ import { a as stopHostedNative, i as prepareHostedNative, r as placeHostedNative } from "./hosted-native-B6ur_0OJ.mjs";
5
5
  //#region src/device-host/hosted-android.ts
6
6
  async function prepareHostedAndroid(machine, selectors, recorded, mode) {
7
7
  return await prepareHostedNative(machine, selectors, recorded, "android", false, mode);
@@ -1,7 +1,7 @@
1
- import { d as throwIfCancelled, l as cancellableSleep } from "./exec-CGuDzt40.mjs";
2
- import { F as diagnoseConnectFailure, q as resolveEndpoint } from "./config-BA3TgoIP.mjs";
3
- import { t as BuildConnection } from "./client-KSWIeQLA.mjs";
4
- import { nt as configuredMachines } from "./support-BJbXovoO.mjs";
1
+ import { d as throwIfCancelled, l as cancellableSleep } from "./exec-L37dbiIb.mjs";
2
+ import { F as diagnoseConnectFailure, q as resolveEndpoint } from "./config-CNmN-ndb.mjs";
3
+ import { t as BuildConnection } from "./client-qwmHFSga.mjs";
4
+ import { nt as configuredMachines } from "./support-BeVRaMWT.mjs";
5
5
  import { createHash } from "node:crypto";
6
6
  import { lstatSync, readFileSync, readdirSync, readlinkSync } from "node:fs";
7
7
  import { join } from "node:path";