stim 1.4.0 → 1.6.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 (59) hide show
  1. package/README.md +3 -3
  2. package/dist/{android-BkM4qTaN.mjs → android-BkYmndPp.mjs} +5 -5
  3. package/dist/{android-BTR1KTMP.mjs → android-DLJB8ljN.mjs} +22 -22
  4. package/dist/{android-cas-BjLRZyks.mjs → android-cas-CrzI_Zha.mjs} +5 -5
  5. package/dist/{build-slots-D6sDzOe-.mjs → build-slots-CuPszJDu.mjs} +1 -1
  6. package/dist/{cache-manifest-D02TpYjA.mjs → cache-manifest-uoOKhgUD.mjs} +1 -1
  7. package/dist/cache-manifest.mjs +1 -1
  8. package/dist/cli.mjs +14 -14
  9. package/dist/collector-run.mjs +3 -3
  10. package/dist/{config-6vdGngKa.mjs → config-DMP7L7H6.mjs} +1 -1
  11. package/dist/{dependency-state-BMirHEPD.mjs → dependency-state-CTL8A9p3.mjs} +1 -1
  12. package/dist/{deps-Ck4wuTwa.mjs → deps-C1zGnr61.mjs} +1 -1
  13. package/dist/{dev-client-Cd0v7iZk.mjs → dev-client-BaTXAAnC.mjs} +9 -9
  14. package/dist/{device-CMDFzx7C.mjs → device-XY_5eGdN.mjs} +8 -8
  15. package/dist/{device-lease-DDJr85OK.mjs → device-lease-DBW-IL4p.mjs} +3 -3
  16. package/dist/{device-pool-DJvbIBGW.mjs → device-pool-C0s_83Og.mjs} +2 -2
  17. package/dist/{device-remote-CMfHhoc8.mjs → device-remote-D9wN3CdE.mjs} +6 -6
  18. package/dist/{device-CKXLnRRb.mjs → device-xoQxw8hR.mjs} +5 -5
  19. package/dist/{doctor-B_mfURdt.mjs → doctor-BRO8UKlK.mjs} +25 -168
  20. package/dist/{error-diagnostics-_VmkqRZo.mjs → error-diagnostics-B5STzxqN.mjs} +6 -6
  21. package/dist/{gc-0AyxmECv.mjs → gc-C-6grAQI.mjs} +12 -12
  22. package/dist/{guide-CGxdmQ0K.mjs → guide-CYtd7xbA.mjs} +49 -21
  23. package/dist/guide-status-BF6RsJJp.mjs +271 -0
  24. package/dist/{ios-CtmGLx3X.mjs → ios-Ccm6c8Hj.mjs} +21 -21
  25. package/dist/{logs-BF3qPA7w.mjs → logs-D4Poojxy.mjs} +4 -4
  26. package/dist/{metro-DFLmaVz8.mjs → metro-ato6ef3J.mjs} +3 -3
  27. package/dist/{named-ports-BO7Zpjp0.mjs → named-ports-DH9SXd0f.mjs} +3 -3
  28. package/dist/{ownership-BvSpZVBk.mjs → ownership-CD_XnpDu.mjs} +3 -3
  29. package/dist/{ownership-C08Yzrp7.mjs → ownership-CVY9cqCr.mjs} +3 -3
  30. package/dist/{ports-BiKqP92J.mjs → ports-A6uTJSPj.mjs} +3 -3
  31. package/dist/{ports-ClqG8GPt.mjs → ports-BZprTJRa.mjs} +1 -1
  32. package/dist/{project-CBFCwnN5.mjs → project-B_SDt4ip.mjs} +2 -2
  33. package/dist/{reclaim-DpDVo-AP.mjs → reclaim-WXTbXPX4.mjs} +10 -10
  34. package/dist/{reload-ByTqg6ZI.mjs → reload-xlQvHKfN.mjs} +6 -6
  35. package/dist/{server-bare-Buk-k8tI.mjs → server-bare-CCLb90FS.mjs} +11 -32
  36. package/dist/{server-expo-D4P7iTvf.mjs → server-expo-CX-zkgWl.mjs} +6 -14
  37. package/dist/server-expo-CjeTJ273.mjs +2 -0
  38. package/dist/{settings-DwfltIXQ.mjs → settings-CGHTt5vb.mjs} +7 -4
  39. package/dist/{slot-launch-DeKen9e5.mjs → slot-launch-BYjnljAs.mjs} +3 -3
  40. package/dist/{start-BpKUHcU_.mjs → start-DHYAyGzm.mjs} +16 -20
  41. package/dist/{state-CDbvmZdt.mjs → state-CnWzvCWP.mjs} +2 -2
  42. package/dist/{stats-k5qMjyxo.mjs → stats-DHrO0frH.mjs} +3 -3
  43. package/dist/{stats-C59QLKm2.mjs → stats-Fo9ACIv7.mjs} +1 -1
  44. package/dist/{status-Y2ij3dm6.mjs → status-QeLZb8SM.mjs} +14 -12
  45. package/dist/{stop-vKmmxhea.mjs → stop-CHTaw65F.mjs} +2 -2
  46. package/dist/{stop-_P2OQwmZ.mjs → stop-DsdOx9Hj.mjs} +11 -11
  47. package/dist/supervisor-run.d.mts +4 -1
  48. package/dist/supervisor-run.mjs +18 -10
  49. package/dist/{teardown-KsPpvldq.mjs → teardown-sm1FwF6V.mjs} +5 -5
  50. package/dist/{workspace-process-lock-UEIrvZMJ.mjs → workspace-process-lock-Bz19_R9R.mjs} +1 -1
  51. package/dist/{workspace-state-Do1e2mOH.mjs → workspace-state-WVwWw_hB.mjs} +1 -1
  52. package/dist/{worktree-BvcAIMdJ.mjs → worktree-CCNPg_f0.mjs} +25 -20
  53. package/dist/{worktree-DWNx4tUg.mjs → worktree-DJnBbQZ9.mjs} +49 -22
  54. package/dist/{xcode-D9tVItl-.mjs → xcode-DUF7jrXj.mjs} +89 -14
  55. package/package.json +5 -5
  56. package/shim/expo-metro-config.cjs +11 -17
  57. package/dist/server-expo-Dho5Raiw.mjs +0 -2
  58. package/shim/metro-cache-generation.cjs +0 -20
  59. package/shim/metro-cache-generation.d.cts +0 -5
package/README.md CHANGED
@@ -50,9 +50,9 @@ registered descendant app with logs when one exists.
50
50
 
51
51
  Use `stim start --reset-cache` to recover from stale Metro transforms or file-map
52
52
  state. It restarts only this app's verified owned Metro, keeping its port and
53
- devices. A fresh persistent cache namespace bypasses old entries without deleting
54
- shared stores or changing other apps or native build caches. Expo requires SDK
55
- 54+ and Stim's config adapter. See `stim guide lifecycle` for scope and limitations.
53
+ devices, with Metro's own reset: every store in the app's Metro config is cleared,
54
+ including this app's shared transform store, so other worktrees of the same app
55
+ rebuild their transforms too. Other apps and native build caches are unchanged.
56
56
 
57
57
  Use `stim doctor --platform ios` or `stim doctor --platform android` when only
58
58
  one native platform is in scope; shared project checks still run. Doctor also
@@ -1,10 +1,10 @@
1
1
  import { t as getExecutor } from "./exec-CyylIdq9.mjs";
2
- import { E as ownership_claim_exports, u as getConfigDir } from "./config-6vdGngKa.mjs";
3
- import { r as register } from "./cache-manifest-D02TpYjA.mjs";
4
- import { l as sharedBuildCache } from "./workspace-state-Do1e2mOH.mjs";
5
- import { r as pidExists } from "./metro-DFLmaVz8.mjs";
2
+ import { E as ownership_claim_exports, u as getConfigDir } from "./config-DMP7L7H6.mjs";
3
+ import { r as register } from "./cache-manifest-uoOKhgUD.mjs";
4
+ import { l as sharedBuildCache } from "./workspace-state-WVwWw_hB.mjs";
5
+ import { r as pidExists } from "./metro-ato6ef3J.mjs";
6
6
  import { a as formatElapsed } from "./command-output-BuIb_ZOI.mjs";
7
- import { c as androidDataPartitionSizeBytes } from "./settings-DwfltIXQ.mjs";
7
+ import { c as androidDataPartitionSizeBytes } from "./settings-CGHTt5vb.mjs";
8
8
  import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
9
9
  import { createHash } from "node:crypto";
10
10
  import { join } from "node:path";
@@ -1,31 +1,31 @@
1
1
  import { t as getExecutor } from "./exec-CyylIdq9.mjs";
2
- import { C as withConfigLock, E as ownership_claim_exports, F as deviceSlotPlatforms, P as deviceSlotKey, S as upsertProject, b as setDevice, f as getProject, g as loadConfig, l as getConcurrencyLimits, y as saveConfig, z as validateDeviceSlot } from "./config-6vdGngKa.mjs";
2
+ import { C as withConfigLock, E as ownership_claim_exports, F as deviceSlotPlatforms, P as deviceSlotKey, S as upsertProject, b as setDevice, f as getProject, g as loadConfig, l as getConcurrencyLimits, y as saveConfig, z as validateDeviceSlot } from "./config-DMP7L7H6.mjs";
3
3
  import { r as createNdjsonWriter } from "./ndjson-BZwI1NBv.mjs";
4
- import { _ as workspaceLogsDir, h as workspaceDir, o as writeWorkspaceState, r as readWorkspaceState, s as emulatorLogFile } from "./workspace-state-Do1e2mOH.mjs";
5
- import { C as makeTemporaryDirectory, _ as repoRoot, s as gitCommonDir, w as removeTemporaryEntry } from "./worktree-DWNx4tUg.mjs";
6
- import { a as findProjectRoot, c as projectShortcut, i as detectIsExpo, n as detectAndroidPackage, r as detectBundleId, t as appProjectProblem } from "./project-CBFCwnN5.mjs";
7
- import { n as MODE_EXPO, p as writeWorkspaceLaunch, t as MODE_BARE } from "./state-CDbvmZdt.mjs";
4
+ import { _ as workspaceLogsDir, h as workspaceDir, o as writeWorkspaceState, r as readWorkspaceState, s as emulatorLogFile } from "./workspace-state-WVwWw_hB.mjs";
5
+ import { T as removeTemporaryEntry, g as repoRoot, s as gitCommonDir, w as makeTemporaryDirectory } from "./worktree-DJnBbQZ9.mjs";
6
+ import { a as findProjectRoot, c as projectShortcut, i as detectIsExpo, n as detectAndroidPackage, r as detectBundleId, t as appProjectProblem } from "./project-B_SDt4ip.mjs";
7
+ import { n as MODE_EXPO, p as writeWorkspaceLaunch, t as MODE_BARE } from "./state-CnWzvCWP.mjs";
8
8
  import { r as waitForChild, t as createLineReader } from "./process-output-C7IlIzd7.mjs";
9
- import { i as resolveProjectMetro, r as pidExists } from "./metro-DFLmaVz8.mjs";
10
- import { n as verifyCollectorOwnership, r as readCollectors } from "./ownership-BvSpZVBk.mjs";
9
+ import { i as resolveProjectMetro, r as pidExists } from "./metro-ato6ef3J.mjs";
10
+ import { n as verifyCollectorOwnership, r as readCollectors } from "./ownership-CD_XnpDu.mjs";
11
11
  import { _ as launchErrorPreview, c as launchErrorReport, g as stepTimer, h as stepClock, i as formatDuration, l as phaseLine, n as appReadinessMessage, p as shortHash } from "./command-output-BuIb_ZOI.mjs";
12
- import { $ as providerDownloadPath, C as memoizeEmulatorProbe, G as buildCacheKey, J as filesystemBuildCapability, K as describeFingerprintMiss, L as waitForBoot, M as resetAdoptedAvd, N as resolveOwnedAvdSerial, P as resolvePhysicalDevice, Q as prepareProviderDownloadDir, R as WAIT_CEILING_MS, U as takeoverLine, V as releaseBuildLock, W as waitForBuild, X as fingerprintDiffSuffix, Y as fingerprintDiffRecord, Z as fingerprintProject, _ as findBuildTool, a as androidSystemImageAbi, at as untrackedMissLine, ct as captureAssetManifest, et as providerUploadOutcome, g as extractEmulatorFailure, h as emulatorFailureRemedy, i as androidPoolNoCandidatesRefusal, it as storedAssetManifest, j as probeEmulatorSerial, k as physicalDeviceModel, lt as compareAssetManifests, m as emulatorDiskSpaceRemedy, n as androidHome, nt as resolveBuild, ot as untrackedNativeFiles, r as androidPoolCandidates, rt as storeBuild, st as assetDiffReason, t as androidDeviceAbi, tt as refingerprintAfterMutation, ut as readAssetManifest, x as listInstalledSystemImages, y as listAdbDevices, z as acquireBuildLock } from "./android-BkM4qTaN.mjs";
13
- import { A as resolveSettings, B as artifactCachePolicy, D as remoteDeviceSettingError, E as remoteAndroidSetting, F as tunnelModeSetting, H as optimizationBuildProfile, I as unknownSettingKeys, N as settingShapeErrors, R as detectProviders, T as publicUrlSetting, U as resolveOptimizations, V as compilerCacheFallbackMessage, a as SETTING_SHAPE_REMEDY, d as cacheProviderSettingError, j as settingFile, k as resolveCacheProviderConfig, r as REMOTE_DEVICE_BACKENDS, s as androidAvdConfigSettingError, u as androidDataPartitionSizeGbSettingError, x as metroWarmupUrlSetting } from "./settings-DwfltIXQ.mjs";
14
- import { t as cleanLine } from "./server-expo-D4P7iTvf.mjs";
15
- import { C as resolveRemote, S as resolveEasCliBin, _ as exitAfterFlush, f as RESOLVE_TIMEOUT_MS, g as easAuthNote, h as checkEasAuth, l as parkedMaxSetting, m as cacheLevel, p as UPLOAD_TIMEOUT_MS, v as isEasAuthFailureText, w as uploadRemote, y as loadProjectProvider } from "./teardown-KsPpvldq.mjs";
16
- import { c as ensureWorkspaceStorageSafely, d as launchOutcomeRecord, f as noMetroMessage, g as warmMetro, i as detectEntryFile, m as resolveMetroWithRetry, n as pickDevClientScheme, o as needsPrebuild, p as noMetroRemedy, s as runPrebuild, t as devClientScheme, u as isPhysicalDeviceRequest, v as isEasBuildFailure, y as resolveEasDevelopmentBuild } from "./dev-client-Cd0v7iZk.mjs";
17
- import { t as withWorkspaceProcessLock } from "./workspace-process-lock-UEIrvZMJ.mjs";
12
+ import { $ as providerDownloadPath, C as memoizeEmulatorProbe, G as buildCacheKey, J as filesystemBuildCapability, K as describeFingerprintMiss, L as waitForBoot, M as resetAdoptedAvd, N as resolveOwnedAvdSerial, P as resolvePhysicalDevice, Q as prepareProviderDownloadDir, R as WAIT_CEILING_MS, U as takeoverLine, V as releaseBuildLock, W as waitForBuild, X as fingerprintDiffSuffix, Y as fingerprintDiffRecord, Z as fingerprintProject, _ as findBuildTool, a as androidSystemImageAbi, at as untrackedMissLine, ct as captureAssetManifest, et as providerUploadOutcome, g as extractEmulatorFailure, h as emulatorFailureRemedy, i as androidPoolNoCandidatesRefusal, it as storedAssetManifest, j as probeEmulatorSerial, k as physicalDeviceModel, lt as compareAssetManifests, m as emulatorDiskSpaceRemedy, n as androidHome, nt as resolveBuild, ot as untrackedNativeFiles, r as androidPoolCandidates, rt as storeBuild, st as assetDiffReason, t as androidDeviceAbi, tt as refingerprintAfterMutation, ut as readAssetManifest, x as listInstalledSystemImages, y as listAdbDevices, z as acquireBuildLock } from "./android-BkYmndPp.mjs";
13
+ import { A as resolveSettings, B as artifactCachePolicy, D as remoteDeviceSettingError, E as remoteAndroidSetting, F as tunnelModeSetting, H as optimizationBuildProfile, I as unknownSettingKeys, N as settingShapeErrors, R as detectProviders, T as publicUrlSetting, U as resolveOptimizations, V as compilerCacheFallbackMessage, a as SETTING_SHAPE_REMEDY, d as cacheProviderSettingError, j as settingFile, k as resolveCacheProviderConfig, r as REMOTE_DEVICE_BACKENDS, s as androidAvdConfigSettingError, u as androidDataPartitionSizeGbSettingError, x as metroWarmupUrlSetting } from "./settings-CGHTt5vb.mjs";
14
+ import { t as cleanLine } from "./server-expo-CX-zkgWl.mjs";
15
+ import { C as resolveRemote, S as resolveEasCliBin, _ as exitAfterFlush, f as RESOLVE_TIMEOUT_MS, g as easAuthNote, h as checkEasAuth, l as parkedMaxSetting, m as cacheLevel, p as UPLOAD_TIMEOUT_MS, v as isEasAuthFailureText, w as uploadRemote, y as loadProjectProvider } from "./teardown-sm1FwF6V.mjs";
16
+ import { c as ensureWorkspaceStorageSafely, d as launchOutcomeRecord, f as noMetroMessage, g as warmMetro, i as detectEntryFile, m as resolveMetroWithRetry, n as pickDevClientScheme, o as needsPrebuild, p as noMetroRemedy, s as runPrebuild, t as devClientScheme, u as isPhysicalDeviceRequest, v as isEasBuildFailure, y as resolveEasDevelopmentBuild } from "./dev-client-BaTXAAnC.mjs";
17
+ import { t as withWorkspaceProcessLock } from "./workspace-process-lock-Bz19_R9R.mjs";
18
18
  import { D as verifyAndroidReleaseLaunch, E as unverifiedLaunchLines, O as verifyLaunch, S as launchAndroidReleaseApp, _ as installConflictKind, c as RELEASE_VERIFY_WAIT_MS, d as androidDevClientUrl, g as installAndroidApp, h as deviceShellArg, i as LAUNCH_BUNDLING, l as VERIFY_TIMEOUT_MS, n as DEFAULT_METRO_PORT, o as LAUNCH_FATAL, s as LAUNCH_UNVERIFIED, t as ADB_INSTALL_TIMEOUT_MS, u as androidAppProcess, x as launchAndroidApp } from "./app-install--PAocWvq.mjs";
19
- import { a as lostLine, c as releaseLeaseOnSignal, i as leaseExpiryText, l as runLease, n as DEBUG_VERIFY_STEP_MS, o as lostRefusal, r as acquireRunLease, s as parseDeviceWait, t as selectFromPool, u as waitFlagConflict } from "./device-pool-DJvbIBGW.mjs";
20
- import { r as releaseBuildSlot, t as acquireBuildSlot } from "./build-slots-D6sDzOe-.mjs";
21
- import { a as statsProjectKey, i as recordRunStats, n as readRunEstimates, t as createRunRecorder } from "./stats-C59QLKm2.mjs";
22
- import { i as ensureOwnedDevice, l as AvdBootError, o as unknownAndroidSystemImageRefusal, r as ensureBooted, t as checkDeviceCapacity, u as AvdRecoveryError } from "./device-CMDFzx7C.mjs";
23
- import { a as ensureMetroReachable, b as ownedSessionName, l as resolveRemoteContext, n as binOnPath, o as ensureRemoteBootOwned, s as remoteAndroidDeps } from "./device-remote-CMfHhoc8.mjs";
24
- import { a as buildAndroid, c as CCACHE_NOT_RUN, f as resolveCcache, l as CCACHE_UNAVAILABLE, n as resolveAndroidCas, o as productFlavorRefusal, p as formatDiagnostic, r as resolveAndroidCompilerCache, s as readProductFlavors, u as ccacheActivityLine } from "./android-cas-BjLRZyks.mjs";
25
- import { d as startBuildHeartbeat, f as tailLines, n as HEARTBEAT_INTERVAL_MS } from "./xcode-D9tVItl-.mjs";
26
- import { n as nativeRunCommand, t as launchSlotScope } from "./slot-launch-DeKen9e5.mjs";
19
+ import { a as lostLine, c as releaseLeaseOnSignal, i as leaseExpiryText, l as runLease, n as DEBUG_VERIFY_STEP_MS, o as lostRefusal, r as acquireRunLease, s as parseDeviceWait, t as selectFromPool, u as waitFlagConflict } from "./device-pool-C0s_83Og.mjs";
20
+ import { r as releaseBuildSlot, t as acquireBuildSlot } from "./build-slots-CuPszJDu.mjs";
21
+ import { a as statsProjectKey, i as recordRunStats, n as readRunEstimates, t as createRunRecorder } from "./stats-Fo9ACIv7.mjs";
22
+ import { i as ensureOwnedDevice, l as AvdBootError, o as unknownAndroidSystemImageRefusal, r as ensureBooted, t as checkDeviceCapacity, u as AvdRecoveryError } from "./device-XY_5eGdN.mjs";
23
+ import { a as ensureMetroReachable, b as ownedSessionName, l as resolveRemoteContext, n as binOnPath, o as ensureRemoteBootOwned, s as remoteAndroidDeps } from "./device-remote-D9wN3CdE.mjs";
24
+ import { a as buildAndroid, c as CCACHE_NOT_RUN, f as resolveCcache, l as CCACHE_UNAVAILABLE, n as resolveAndroidCas, o as productFlavorRefusal, p as formatDiagnostic, r as resolveAndroidCompilerCache, s as readProductFlavors, u as ccacheActivityLine } from "./android-cas-CrzI_Zha.mjs";
25
+ import { d as startBuildHeartbeat, f as tailLines, n as HEARTBEAT_INTERVAL_MS } from "./xcode-DUF7jrXj.mjs";
26
+ import { n as nativeRunCommand, t as launchSlotScope } from "./slot-launch-BYjnljAs.mjs";
27
27
  import { t as spawnEntry } from "./spawn-entry-nCE6m770.mjs";
28
- import { a as printNativeCrashReport, r as captureNativeCrashes, t as errorDiagnostics } from "./error-diagnostics-_VmkqRZo.mjs";
28
+ import { a as printNativeCrashReport, r as captureNativeCrashes, t as errorDiagnostics } from "./error-diagnostics-B5STzxqN.mjs";
29
29
  import { existsSync, mkdirSync, openSync, readFileSync, readdirSync, rmSync } from "node:fs";
30
30
  import { InvalidArgumentError } from "commander";
31
31
  import { basename, dirname, join, relative } from "node:path";
@@ -1,11 +1,11 @@
1
1
  import { t as getExecutor } from "./exec-CyylIdq9.mjs";
2
- import { D as withDirLock, u as getConfigDir } from "./config-6vdGngKa.mjs";
3
- import { r as register } from "./cache-manifest-D02TpYjA.mjs";
4
- import { _ as workspaceLogsDir, c as ensureWorkspaceStorage, u as sharedCcache } from "./workspace-state-Do1e2mOH.mjs";
2
+ import { D as withDirLock, u as getConfigDir } from "./config-DMP7L7H6.mjs";
3
+ import { r as register } from "./cache-manifest-uoOKhgUD.mjs";
4
+ import { _ as workspaceLogsDir, c as ensureWorkspaceStorage, u as sharedCcache } from "./workspace-state-WVwWw_hB.mjs";
5
5
  import { n as stripAnsi, r as waitForChild, t as createLineReader } from "./process-output-C7IlIzd7.mjs";
6
6
  import { l as phaseLine } from "./command-output-BuIb_ZOI.mjs";
7
- import { n as androidHome } from "./android-BkM4qTaN.mjs";
8
- import { d as startBuildHeartbeat, n as HEARTBEAT_INTERVAL_MS } from "./xcode-D9tVItl-.mjs";
7
+ import { n as androidHome } from "./android-BkYmndPp.mjs";
8
+ import { d as startBuildHeartbeat, n as HEARTBEAT_INTERVAL_MS } from "./xcode-DUF7jrXj.mjs";
9
9
  import { accessSync, constants, existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, statSync, symlinkSync, writeFileSync } from "node:fs";
10
10
  import { createHash, randomUUID } from "node:crypto";
11
11
  import { dirname, isAbsolute, join, relative } from "node:path";
@@ -1,4 +1,4 @@
1
- import { E as ownership_claim_exports, u as getConfigDir } from "./config-6vdGngKa.mjs";
1
+ import { E as ownership_claim_exports, u as getConfigDir } from "./config-DMP7L7H6.mjs";
2
2
  import { a as formatElapsed } from "./command-output-BuIb_ZOI.mjs";
3
3
  import { readdirSync, statSync } from "node:fs";
4
4
  import { join } from "node:path";
@@ -1,4 +1,4 @@
1
- import { u as getConfigDir } from "./config-6vdGngKa.mjs";
1
+ import { u as getConfigDir } from "./config-DMP7L7H6.mjs";
2
2
  import { existsSync } from "fs";
3
3
  import { homedir } from "os";
4
4
  import { join, resolve } from "path";
@@ -1,2 +1,2 @@
1
- import { a as unregister, i as registeredCaches, n as readManifest, r as register, t as manifestPath } from "./cache-manifest-D02TpYjA.mjs";
1
+ import { a as unregister, i as registeredCaches, n as readManifest, r as register, t as manifestPath } from "./cache-manifest-uoOKhgUD.mjs";
2
2
  export { manifestPath, readManifest, register, registeredCaches, unregister };
package/dist/cli.mjs CHANGED
@@ -3,20 +3,20 @@ import { readFileSync } from "node:fs";
3
3
  import { Command } from "commander";
4
4
  //#region bin/cli.ts
5
5
  const commands = /* @__PURE__ */ new Map([
6
- ["doctor", () => import("./doctor-B_mfURdt.mjs")],
7
- ["worktree", () => import("./worktree-BvcAIMdJ.mjs")],
8
- ["start", () => import("./start-BpKUHcU_.mjs")],
9
- ["ports", () => import("./ports-BiKqP92J.mjs")],
10
- ["stop", () => import("./stop-vKmmxhea.mjs")],
11
- ["ios", () => import("./ios-CtmGLx3X.mjs")],
12
- ["android", () => import("./android-BTR1KTMP.mjs")],
13
- ["reload", () => import("./reload-ByTqg6ZI.mjs")],
14
- ["device", () => import("./device-CKXLnRRb.mjs")],
15
- ["logs", () => import("./logs-BF3qPA7w.mjs")],
16
- ["status", () => import("./status-Y2ij3dm6.mjs")],
17
- ["stats", () => import("./stats-k5qMjyxo.mjs")],
18
- ["gc", () => import("./gc-0AyxmECv.mjs")],
19
- ["guide", () => import("./guide-CGxdmQ0K.mjs")]
6
+ ["doctor", () => import("./doctor-BRO8UKlK.mjs")],
7
+ ["worktree", () => import("./worktree-CCNPg_f0.mjs")],
8
+ ["start", () => import("./start-DHYAyGzm.mjs")],
9
+ ["ports", () => import("./ports-A6uTJSPj.mjs")],
10
+ ["stop", () => import("./stop-CHTaw65F.mjs")],
11
+ ["ios", () => import("./ios-Ccm6c8Hj.mjs")],
12
+ ["android", () => import("./android-DLJB8ljN.mjs")],
13
+ ["reload", () => import("./reload-xlQvHKfN.mjs")],
14
+ ["device", () => import("./device-xoQxw8hR.mjs")],
15
+ ["logs", () => import("./logs-D4Poojxy.mjs")],
16
+ ["status", () => import("./status-QeLZb8SM.mjs")],
17
+ ["stats", () => import("./stats-DHrO0frH.mjs")],
18
+ ["gc", () => import("./gc-C-6grAQI.mjs")],
19
+ ["guide", () => import("./guide-CYtd7xbA.mjs")]
20
20
  ]);
21
21
  const pkg = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf-8"));
22
22
  const program = new Command();
@@ -1,10 +1,10 @@
1
1
  import { t as getExecutor } from "./exec-CyylIdq9.mjs";
2
- import { P as deviceSlotKey, w as process_identity_exports, z as validateDeviceSlot } from "./config-6vdGngKa.mjs";
2
+ import { P as deviceSlotKey, w as process_identity_exports, z as validateDeviceSlot } from "./config-DMP7L7H6.mjs";
3
3
  import { r as createNdjsonWriter } from "./ndjson-BZwI1NBv.mjs";
4
- import { _ as workspaceLogsDir } from "./workspace-state-Do1e2mOH.mjs";
4
+ import { _ as workspaceLogsDir } from "./workspace-state-WVwWw_hB.mjs";
5
5
  import { t as createLineReader } from "./process-output-C7IlIzd7.mjs";
6
6
  import { i as startIosDeviceConsole, r as parseDeviceConsoleLine } from "./ios-device-D3pzTKQE.mjs";
7
- import { a as unregisterCollector, i as registerCollector, r as readCollectors, t as collectorProcessTitle } from "./ownership-BvSpZVBk.mjs";
7
+ import { a as unregisterCollector, i as registerCollector, r as readCollectors, t as collectorProcessTitle } from "./ownership-CD_XnpDu.mjs";
8
8
  import { a as watchAppPid, i as waitForAppPid, n as parseLogcatLine, r as startAndroidLogcat, t as androidClockOffset } from "./android-BW8i_YxU.mjs";
9
9
  import { existsSync } from "node:fs";
10
10
  import { isAbsolute, join, resolve } from "node:path";
@@ -313,7 +313,7 @@ function upsertProject(projectPath, fields) {
313
313
  };
314
314
  cfg.projects[projectPath] = {
315
315
  ...existing,
316
- ...fields
316
+ ...typeof fields === "function" ? fields(existing) : fields
317
317
  };
318
318
  saveConfig(cfg);
319
319
  return cfg.projects[projectPath];
@@ -1,5 +1,5 @@
1
1
  import { t as getExecutor } from "./exec-CyylIdq9.mjs";
2
- import { _ as repoRoot } from "./worktree-DWNx4tUg.mjs";
2
+ import { g as repoRoot } from "./worktree-DJnBbQZ9.mjs";
3
3
  import { existsSync } from "node:fs";
4
4
  import { dirname, join, relative } from "node:path";
5
5
  //#region src/dependency-state.ts
@@ -1,6 +1,6 @@
1
1
  import { t as getExecutor } from "./exec-CyylIdq9.mjs";
2
2
  import { n as stripAnsi, r as waitForChild, t as createLineReader } from "./process-output-C7IlIzd7.mjs";
3
- import { d as startBuildHeartbeat, m as bundlerPin, n as HEARTBEAT_INTERVAL_MS } from "./xcode-D9tVItl-.mjs";
3
+ import { d as startBuildHeartbeat, m as bundlerPin, n as HEARTBEAT_INTERVAL_MS } from "./xcode-DUF7jrXj.mjs";
4
4
  import { existsSync, readFileSync } from "node:fs";
5
5
  import { dirname, join, relative, resolve, sep } from "node:path";
6
6
  import { homedir } from "node:os";
@@ -1,15 +1,15 @@
1
1
  import { t as getExecutor } from "./exec-CyylIdq9.mjs";
2
- import { E as ownership_claim_exports } from "./config-6vdGngKa.mjs";
3
- import { c as ensureWorkspaceStorage } from "./workspace-state-Do1e2mOH.mjs";
4
- import { C as makeTemporaryDirectory, w as removeTemporaryEntry } from "./worktree-DWNx4tUg.mjs";
5
- import { i as detectIsExpo, o as isPackageResolvable } from "./project-CBFCwnN5.mjs";
2
+ import { E as ownership_claim_exports } from "./config-DMP7L7H6.mjs";
3
+ import { c as ensureWorkspaceStorage } from "./workspace-state-WVwWw_hB.mjs";
4
+ import { T as removeTemporaryEntry, w as makeTemporaryDirectory } from "./worktree-DJnBbQZ9.mjs";
5
+ import { i as detectIsExpo, o as isPackageResolvable } from "./project-B_SDt4ip.mjs";
6
6
  import { n as stripAnsi, r as waitForChild, t as createLineReader } from "./process-output-C7IlIzd7.mjs";
7
- import { t as NOT_OURS_FOREIGN_CWD } from "./metro-DFLmaVz8.mjs";
8
- import { V as releaseBuildLock, z as acquireBuildLock } from "./android-BkM4qTaN.mjs";
9
- import { i as expoBinRefusal, r as expoBinPath, t as cleanLine } from "./server-expo-D4P7iTvf.mjs";
10
- import { S as resolveEasCliBin } from "./teardown-KsPpvldq.mjs";
7
+ import { t as NOT_OURS_FOREIGN_CWD } from "./metro-ato6ef3J.mjs";
8
+ import { V as releaseBuildLock, z as acquireBuildLock } from "./android-BkYmndPp.mjs";
9
+ import { i as expoBinRefusal, r as expoBinPath, t as cleanLine } from "./server-expo-CX-zkgWl.mjs";
10
+ import { S as resolveEasCliBin } from "./teardown-sm1FwF6V.mjs";
11
11
  import { i as LAUNCH_BUNDLING, s as LAUNCH_UNVERIFIED } from "./app-install--PAocWvq.mjs";
12
- import { d as startBuildHeartbeat, f as tailLines, n as HEARTBEAT_INTERVAL_MS } from "./xcode-D9tVItl-.mjs";
12
+ import { d as startBuildHeartbeat, f as tailLines, n as HEARTBEAT_INTERVAL_MS } from "./xcode-DUF7jrXj.mjs";
13
13
  import { existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, statSync } from "node:fs";
14
14
  import { createHash } from "node:crypto";
15
15
  import { basename, join } from "node:path";
@@ -1,14 +1,14 @@
1
1
  import { t as getExecutor } from "./exec-CyylIdq9.mjs";
2
- import { C as withConfigLock, E as ownership_claim_exports, F as deviceSlotPlatforms, L as projectDeviceSlots, T as acquireAvdClaim, _ as releaseAndroidConsolePort, b as setDevice, g as loadConfig, i as clearDevice, t as allConsolePortsAndSerials, u as getConfigDir, w as process_identity_exports, y as saveConfig } from "./config-6vdGngKa.mjs";
3
- import { g as workspaceId } from "./workspace-state-Do1e2mOH.mjs";
4
- import { s as ownedDeviceLabel } from "./project-CBFCwnN5.mjs";
2
+ import { C as withConfigLock, E as ownership_claim_exports, F as deviceSlotPlatforms, L as projectDeviceSlots, T as acquireAvdClaim, _ as releaseAndroidConsolePort, b as setDevice, g as loadConfig, i as clearDevice, t as allConsolePortsAndSerials, u as getConfigDir, w as process_identity_exports, y as saveConfig } from "./config-DMP7L7H6.mjs";
3
+ import { g as workspaceId } from "./workspace-state-WVwWw_hB.mjs";
4
+ import { s as ownedDeviceLabel } from "./project-B_SDt4ip.mjs";
5
5
  import { n as stripAnsi, r as waitForChild, t as createLineReader } from "./process-output-C7IlIzd7.mjs";
6
- import { r as pidExists } from "./metro-DFLmaVz8.mjs";
6
+ import { r as pidExists } from "./metro-ato6ef3J.mjs";
7
7
  import { l as phaseLine } from "./command-output-BuIb_ZOI.mjs";
8
- import { A as pickDefaultSystemImage, D as ownedAvdName, E as ownedAvdMatchesConfiguration, L as waitForBoot, N as resolveOwnedAvdSerial, O as ownedAvdSystemImage, b as listAvds, c as avdPoolConfiguration, d as configureNewOwnedAvd, f as createOwnedAvd, o as assertOwnedAvdStopped, u as bootAndroidEmulator, v as getAvdNameForSerial, w as nextConsolePort, x as listInstalledSystemImages, y as listAdbDevices } from "./android-BkM4qTaN.mjs";
9
- import { l as androidDataPartitionSizeGbSetting, o as androidAvdConfigSetting, v as iosSimSlimProfileSetting } from "./settings-DwfltIXQ.mjs";
10
- import { c as isLegacyDeletionClaim, d as selectParked, i as teardownParkedIosSim, l as parkedMaxSetting, o as adoptParked, r as teardownParkedAvd, s as dropParked, t as teardownOwnedAvd, u as readParked } from "./teardown-KsPpvldq.mjs";
11
- import { t as withWorkspaceProcessLock } from "./workspace-process-lock-UEIrvZMJ.mjs";
8
+ import { A as pickDefaultSystemImage, D as ownedAvdName, E as ownedAvdMatchesConfiguration, L as waitForBoot, N as resolveOwnedAvdSerial, O as ownedAvdSystemImage, b as listAvds, c as avdPoolConfiguration, d as configureNewOwnedAvd, f as createOwnedAvd, o as assertOwnedAvdStopped, u as bootAndroidEmulator, v as getAvdNameForSerial, w as nextConsolePort, x as listInstalledSystemImages, y as listAdbDevices } from "./android-BkYmndPp.mjs";
9
+ import { l as androidDataPartitionSizeGbSetting, o as androidAvdConfigSetting, v as iosSimSlimProfileSetting } from "./settings-CGHTt5vb.mjs";
10
+ import { c as isLegacyDeletionClaim, d as selectParked, i as teardownParkedIosSim, l as parkedMaxSetting, o as adoptParked, r as teardownParkedAvd, s as dropParked, t as teardownOwnedAvd, u as readParked } from "./teardown-sm1FwF6V.mjs";
11
+ import { t as withWorkspaceProcessLock } from "./workspace-process-lock-Bz19_R9R.mjs";
12
12
  import { E as readHostMemoryPressure, T as hostMemoryPressureAdvice, _ as renameIosSim, b as resolveIosCreation, c as iosRuntimeMatches, d as listIosDeviceTypes, g as parseRuntimeVersion, i as createOwnedIosSim, l as iosSimulatorFailureAdvice, m as ownedSimName, n as bootIosSim, u as listAllIosSims, v as resetIosKeychain, x as resolveOwnedIosSim, y as resetIosPrivacy } from "./ios-Deh5js5V.mjs";
13
13
  import { randomUUID } from "node:crypto";
14
14
  import { join } from "node:path";
@@ -1,6 +1,6 @@
1
- import { D as withDirLock, I as parseDeviceSlotKey, P as deviceSlotKey, u as getConfigDir, z as validateDeviceSlot } from "./config-6vdGngKa.mjs";
2
- import { a as withWorkspaceStateLock, n as clearWorkspaceStateKeys, o as writeWorkspaceState, r as readWorkspaceState } from "./workspace-state-Do1e2mOH.mjs";
3
- import { H as segment } from "./android-BkM4qTaN.mjs";
1
+ import { D as withDirLock, I as parseDeviceSlotKey, P as deviceSlotKey, u as getConfigDir, z as validateDeviceSlot } from "./config-DMP7L7H6.mjs";
2
+ import { a as withWorkspaceStateLock, n as clearWorkspaceStateKeys, o as writeWorkspaceState, r as readWorkspaceState } from "./workspace-state-WVwWw_hB.mjs";
3
+ import { H as segment } from "./android-BkYmndPp.mjs";
4
4
  import { mkdirSync, readFileSync, readdirSync, renameSync, rmSync, writeFileSync } from "node:fs";
5
5
  import { randomBytes } from "node:crypto";
6
6
  import { join } from "node:path";
@@ -1,7 +1,7 @@
1
- import { P as deviceSlotKey } from "./config-6vdGngKa.mjs";
1
+ import { P as deviceSlotKey } from "./config-DMP7L7H6.mjs";
2
2
  import { a as formatElapsed, r as clockTime } from "./command-output-BuIb_ZOI.mjs";
3
3
  import { A as APP_READINESS_TIMEOUT_MS, l as VERIFY_TIMEOUT_MS } from "./app-install--PAocWvq.mjs";
4
- import { a as parseLease, c as releaseRunLease, d as selectPoolDevice, f as takeLease, n as fileLeaseIo, r as leaseIsExpired, s as raiseLease, t as deviceLeasePath } from "./device-lease-DDJr85OK.mjs";
4
+ import { a as parseLease, c as releaseRunLease, d as selectPoolDevice, f as takeLease, n as fileLeaseIo, r as leaseIsExpired, s as raiseLease, t as deviceLeasePath } from "./device-lease-DBW-IL4p.mjs";
5
5
  //#region src/engine/device-lease-run.ts
6
6
  const LEASE_STEP_FLOOR_MS = 6e4;
7
7
  const DEBUG_VERIFY_STEP_MS = VERIFY_TIMEOUT_MS + APP_READINESS_TIMEOUT_MS;
@@ -1,10 +1,10 @@
1
1
  import { t as getExecutor } from "./exec-CyylIdq9.mjs";
2
- import { D as withDirLock, u as getConfigDir } from "./config-6vdGngKa.mjs";
3
- import { _ as workspaceLogsDir, h as workspaceDir, v as workspaceName, y as workspaceStateFile } from "./workspace-state-Do1e2mOH.mjs";
4
- import { a as clearRemoteSession, l as readRemoteSession, s as readMetroTunnel } from "./state-CDbvmZdt.mjs";
5
- import { r as pidExists } from "./metro-DFLmaVz8.mjs";
6
- import { z as planMetroReach } from "./settings-DwfltIXQ.mjs";
7
- import { t as withWorkspaceProcessLock } from "./workspace-process-lock-UEIrvZMJ.mjs";
2
+ import { D as withDirLock, u as getConfigDir } from "./config-DMP7L7H6.mjs";
3
+ import { _ as workspaceLogsDir, h as workspaceDir, v as workspaceName, y as workspaceStateFile } from "./workspace-state-WVwWw_hB.mjs";
4
+ import { a as clearRemoteSession, l as readRemoteSession, s as readMetroTunnel } from "./state-CnWzvCWP.mjs";
5
+ import { r as pidExists } from "./metro-ato6ef3J.mjs";
6
+ import { z as planMetroReach } from "./settings-CGHTt5vb.mjs";
7
+ import { t as withWorkspaceProcessLock } from "./workspace-process-lock-Bz19_R9R.mjs";
8
8
  import { T as readMetroRecords, a as LAUNCH_ERROR, b as isBundleProof, p as devClientDeepLink, r as INSTALL_ERROR } from "./app-install--PAocWvq.mjs";
9
9
  import { S as sanitizeDeviceLabel } from "./ios-Deh5js5V.mjs";
10
10
  import { existsSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, writeFileSync } from "node:fs";
@@ -1,9 +1,9 @@
1
- import { z as validateDeviceSlot } from "./config-6vdGngKa.mjs";
2
- import { a as findProjectRoot } from "./project-CBFCwnN5.mjs";
1
+ import { z as validateDeviceSlot } from "./config-DMP7L7H6.mjs";
2
+ import { a as findProjectRoot } from "./project-B_SDt4ip.mjs";
3
3
  import { r as clockTime } from "./command-output-BuIb_ZOI.mjs";
4
- import { C as memoizeEmulatorProbe, P as resolvePhysicalDevice, i as androidPoolNoCandidatesRefusal, j as probeEmulatorSerial, k as physicalDeviceModel, r as androidPoolCandidates, y as listAdbDevices } from "./android-BkM4qTaN.mjs";
5
- import { f as takeLease, l as releaseWorkspaceLeases, n as fileLeaseIo, o as parseLeaseDuration } from "./device-lease-DDJr85OK.mjs";
6
- import { d as waitForDevice, s as parseDeviceWait, t as selectFromPool } from "./device-pool-DJvbIBGW.mjs";
4
+ import { C as memoizeEmulatorProbe, P as resolvePhysicalDevice, i as androidPoolNoCandidatesRefusal, j as probeEmulatorSerial, k as physicalDeviceModel, r as androidPoolCandidates, y as listAdbDevices } from "./android-BkYmndPp.mjs";
5
+ import { f as takeLease, l as releaseWorkspaceLeases, n as fileLeaseIo, o as parseLeaseDuration } from "./device-lease-DBW-IL4p.mjs";
6
+ import { d as waitForDevice, s as parseDeviceWait, t as selectFromPool } from "./device-pool-C0s_83Og.mjs";
7
7
  import { c as listIosDevices, o as iosPoolCandidates, s as iosPoolNoCandidatesRefusal, u as resolveIosPhysicalDevice } from "./ios-device-DJOi9FR5.mjs";
8
8
  import chalk from "chalk";
9
9
  //#region src/commands/device.ts
@@ -1,21 +1,22 @@
1
1
  import { t as getExecutor } from "./exec-CyylIdq9.mjs";
2
- import { g as loadConfig, l as getConcurrencyLimits, o as configCorruptRepair } from "./config-6vdGngKa.mjs";
3
- import { l as sharedBuildCache, m as workspaceDerivedData } from "./workspace-state-Do1e2mOH.mjs";
4
- import { C as makeTemporaryDirectory, S as filesystemDevice, T as temporaryRoot, _ as repoRoot, a as dirtyFingerprintFiles, f as listWorktrees, p as locallyKnownUpstream, s as gitCommonDir } from "./worktree-DWNx4tUg.mjs";
5
- import { a as findProjectRoot, i as detectIsExpo, t as appProjectProblem } from "./project-CBFCwnN5.mjs";
2
+ import { g as loadConfig, l as getConcurrencyLimits, o as configCorruptRepair } from "./config-DMP7L7H6.mjs";
3
+ import { l as sharedBuildCache, m as workspaceDerivedData } from "./workspace-state-WVwWw_hB.mjs";
4
+ import { C as filesystemDevice, E as temporaryRoot, a as dirtyFingerprintFiles, d as listWorktrees, f as locallyKnownUpstream, g as repoRoot, s as gitCommonDir, v as resolveSourceCheckout, w as makeTemporaryDirectory } from "./worktree-DJnBbQZ9.mjs";
5
+ import { a as findProjectRoot, i as detectIsExpo, t as appProjectProblem } from "./project-B_SDt4ip.mjs";
6
6
  import { d as quotedPath, l as phaseLine, u as plural } from "./command-output-BuIb_ZOI.mjs";
7
- import { B as listBuildLocks, Z as fingerprintProject, q as diffFingerprintSources, y as listAdbDevices } from "./android-BkM4qTaN.mjs";
8
- import { A as resolveSettings, E as remoteAndroidSetting, I as unknownSettingKeys, M as settingOrigin, N as settingShapeErrors, O as remoteIosSetting, P as settingsLayers, U as resolveOptimizations, V as compilerCacheFallbackMessage, a as SETTING_SHAPE_REMEDY, i as SETTINGS_WITH_RESOLVE_TIME_FALLBACK, n as PATH_SETTINGS, v as iosSimSlimProfileSetting, w as projectOptimizations, y as mergeSettingsLayers } from "./settings-DwfltIXQ.mjs";
9
- import { S as resolveEasCliBin, a as POOL_SETTING_REMEDY, b as ownerFromConfig, h as checkEasAuth$1, l as parkedMaxSetting, x as providerFromConfig } from "./teardown-KsPpvldq.mjs";
7
+ import { B as listBuildLocks, Z as fingerprintProject, q as diffFingerprintSources, y as listAdbDevices } from "./android-BkYmndPp.mjs";
8
+ import { A as resolveSettings, E as remoteAndroidSetting, I as unknownSettingKeys, M as settingOrigin, N as settingShapeErrors, O as remoteIosSetting, P as settingsLayers, U as resolveOptimizations, V as compilerCacheFallbackMessage, a as SETTING_SHAPE_REMEDY, i as SETTINGS_WITH_RESOLVE_TIME_FALLBACK, n as PATH_SETTINGS, v as iosSimSlimProfileSetting, w as projectOptimizations, y as mergeSettingsLayers } from "./settings-CGHTt5vb.mjs";
9
+ import { S as resolveEasCliBin, a as POOL_SETTING_REMEDY, b as ownerFromConfig, h as checkEasAuth$1, l as parkedMaxSetting, x as providerFromConfig } from "./teardown-sm1FwF6V.mjs";
10
10
  import { E as readHostMemoryPressure, T as hostMemoryPressureAdvice, u as listAllIosSims } from "./ios-Deh5js5V.mjs";
11
- import { n as listBuildSlots } from "./build-slots-D6sDzOe-.mjs";
12
- import { a as liveOwnedDeviceCount, d as simslimIsOnPath } from "./device-CMDFzx7C.mjs";
13
- import { d as projectCmakeLauncher, i as apkOutputsDir, r as resolveAndroidCompilerCache, t as readAndroidCasToolchain } from "./android-cas-BjLRZyks.mjs";
14
- import { h as podInstallCommand, i as ccacheEnabled, o as detectXcodeMajor } from "./xcode-D9tVItl-.mjs";
15
- import { n as hasInstalledDependencies, r as installedNpmTreeIsValid, t as dependencyState } from "./dependency-state-BMirHEPD.mjs";
16
- import { accessSync, constants, existsSync, lstatSync, readFileSync, readdirSync, realpathSync, rmSync, statSync } from "node:fs";
11
+ import { n as listBuildSlots } from "./build-slots-CuPszJDu.mjs";
12
+ import { a as liveOwnedDeviceCount, d as simslimIsOnPath } from "./device-XY_5eGdN.mjs";
13
+ import { d as projectCmakeLauncher, i as apkOutputsDir, r as resolveAndroidCompilerCache, t as readAndroidCasToolchain } from "./android-cas-CrzI_Zha.mjs";
14
+ import { h as podInstallCommand, i as ccacheEnabled, o as detectXcodeMajor } from "./xcode-DUF7jrXj.mjs";
15
+ import { i as inspectStimVersions, n as recordDoctorRun, r as compareStimVersions } from "./guide-status-BF6RsJJp.mjs";
16
+ import { n as hasInstalledDependencies, r as installedNpmTreeIsValid, t as dependencyState } from "./dependency-state-CTL8A9p3.mjs";
17
+ import { existsSync, lstatSync, readFileSync, readdirSync, realpathSync, rmSync } from "node:fs";
17
18
  import { InvalidArgumentError } from "commander";
18
- import { basename, delimiter, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
19
+ import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
19
20
  import { existsSync as existsSync$1, lstatSync as lstatSync$1, mkdirSync as mkdirSync$1, readFileSync as readFileSync$1, readdirSync as readdirSync$1, realpathSync as realpathSync$1, renameSync as renameSync$1, rmSync as rmSync$1, writeFileSync as writeFileSync$1 } from "fs";
20
21
  import { homedir } from "os";
21
22
  import { dirname as dirname$1, isAbsolute as isAbsolute$1, join as join$1, relative as relative$1, resolve as resolve$1 } from "path";
@@ -238,7 +239,8 @@ function checkStorageLayout(projectRoot, { platform, device = filesystemDevice,
238
239
  };
239
240
  try {
240
241
  const target = repoRoot(projectRoot) ?? projectRoot;
241
- check("Worktree copy", [listWorktrees(target)[0]?.path ?? target, target], "Keep the source checkout and linked worktree on the same volume to share file blocks when warming.");
242
+ const source = resolveSourceCheckout(target);
243
+ check("Worktree copy", ["path" in source ? source.path : target, target], "Keep the source checkout and linked worktree on the same volume to share file blocks when warming.");
242
244
  const cache = sharedBuildCache();
243
245
  check("Cached app/APK staging", [cache, stagingRoot(join(cache, "artifact.app"))], temporaryFix);
244
246
  const cacheFix = "Place STIM_BUILD_CACHE / machine caches.buildCache on the build-output volume, or accept the full-copy cost of keeping the cache on a separate volume.";
@@ -657,11 +659,11 @@ function mainCheckoutProjectRoot(projectRoot) {
657
659
  const currentRepoRoot = repoRoot(projectRoot);
658
660
  if (!currentRepoRoot) return projectRoot;
659
661
  try {
660
- const main = listWorktrees(currentRepoRoot)[0];
661
- if (!main) return projectRoot;
662
+ const source = resolveSourceCheckout(currentRepoRoot);
663
+ if ("refusal" in source) return projectRoot;
662
664
  const projectRel = relative$1(currentRepoRoot, realpathSync$1(projectRoot));
663
665
  if (projectRel.startsWith("..")) return projectRoot;
664
- return resolve$1(main.path, projectRel);
666
+ return resolve$1(source.path, projectRel);
665
667
  } catch {
666
668
  return projectRoot;
667
669
  }
@@ -692,7 +694,7 @@ function hasIosWarmOutput(root) {
692
694
  function hasLinkedWorktree(projectRoot) {
693
695
  const root = repoRoot(projectRoot);
694
696
  if (!root) return false;
695
- return listWorktrees(root).filter((entry) => !entry.prunable).length > 1;
697
+ return listWorktrees(root).filter((entry) => !entry.prunable && !entry.bare).length > 1;
696
698
  }
697
699
  function headBranch(root) {
698
700
  const ref = getExecutor().runFileQuiet("git", [
@@ -1234,154 +1236,6 @@ async function detectFingerprintParity(projectRoot, { createFingerprint = expoFi
1234
1236
  }
1235
1237
  }
1236
1238
  //#endregion
1237
- //#region src/stim-installations.ts
1238
- const VERSION_OUTPUT_LIMIT = 4096;
1239
- function parsedVersion(version) {
1240
- const match = /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/.exec(version);
1241
- if (!match) return null;
1242
- const core = [
1243
- match[1],
1244
- match[2],
1245
- match[3]
1246
- ];
1247
- if (core.some((part) => part.length > 1 && part.startsWith("0"))) return null;
1248
- const prereleaseParts = match[4]?.split(".");
1249
- if (prereleaseParts?.some((part) => !part || /^\d+$/.test(part) && part.length > 1 && part.startsWith("0"))) return null;
1250
- const prerelease = prereleaseParts?.map((part) => /^\d+$/.test(part) ? Number(part) : part);
1251
- return {
1252
- core: core.map(Number),
1253
- prerelease: prerelease ?? null
1254
- };
1255
- }
1256
- function compareStimVersions(left, right) {
1257
- const a = parsedVersion(left);
1258
- const b = parsedVersion(right);
1259
- if (!a || !b) return null;
1260
- for (let index = 0; index < a.core.length; index += 1) {
1261
- const difference = (a.core[index] ?? 0) - (b.core[index] ?? 0);
1262
- if (difference !== 0) return difference;
1263
- }
1264
- if (!a.prerelease && !b.prerelease) return 0;
1265
- if (!a.prerelease) return 1;
1266
- if (!b.prerelease) return -1;
1267
- for (let index = 0; index < Math.max(a.prerelease.length, b.prerelease.length); index += 1) {
1268
- const x = a.prerelease[index];
1269
- const y = b.prerelease[index];
1270
- if (x === void 0) return -1;
1271
- if (y === void 0) return 1;
1272
- if (x === y) continue;
1273
- if (typeof x === "number" && typeof y === "number") return x - y;
1274
- if (typeof x === "number") return -1;
1275
- if (typeof y === "number") return 1;
1276
- return x < y ? -1 : 1;
1277
- }
1278
- return 0;
1279
- }
1280
- function parseStimVersionOutput(output) {
1281
- const version = output?.split("\n")[0]?.trim() ?? "";
1282
- return parsedVersion(version) ? version.replace(/^v/, "") : null;
1283
- }
1284
- function executableNames(platform) {
1285
- return platform === "win32" ? [
1286
- "stim.cmd",
1287
- "stim.exe",
1288
- "stim"
1289
- ] : ["stim"];
1290
- }
1291
- function stimExecutablePaths(pathValue, { platform = process.platform, cwd = process.cwd() } = {}) {
1292
- const found = [];
1293
- const seen = /* @__PURE__ */ new Set();
1294
- for (const entry of pathValue.split(delimiter)) {
1295
- const directory = resolve(cwd, entry || ".");
1296
- for (const name of executableNames(platform)) {
1297
- const path = join(directory, name);
1298
- try {
1299
- accessSync(path, platform === "win32" ? constants.F_OK : constants.X_OK);
1300
- if (!statSync(path).isFile()) continue;
1301
- const realPath = realpathSync(path);
1302
- if (seen.has(realPath)) continue;
1303
- seen.add(realPath);
1304
- found.push({
1305
- path,
1306
- realPath
1307
- });
1308
- } catch {}
1309
- }
1310
- }
1311
- return found;
1312
- }
1313
- function canonicalPath(path) {
1314
- if (!path) return null;
1315
- try {
1316
- return realpathSync(resolve(path));
1317
- } catch {
1318
- return resolve(path);
1319
- }
1320
- }
1321
- function analyzeStimVersions(runningVersion, runningPath, installations) {
1322
- const candidates = [runningVersion, ...installations.map((entry) => entry.version)];
1323
- const versions = [...new Set(candidates)].filter((version) => version !== null && compareStimVersions(version, version) !== null).toSorted((left, right) => -(compareStimVersions(left, right) ?? 0));
1324
- const highestVersion = versions[0] ?? null;
1325
- const resolved = installations[0] ?? null;
1326
- return {
1327
- runningVersion,
1328
- runningPath,
1329
- resolved,
1330
- installations,
1331
- versions,
1332
- highestVersion,
1333
- resolvedIsOlder: Boolean(resolved?.version && highestVersion && (compareStimVersions(resolved.version, highestVersion) ?? 0) < 0)
1334
- };
1335
- }
1336
- function probeStimVersion(path, timeoutMs) {
1337
- return new Promise((resolveProbe) => {
1338
- let settled = false;
1339
- let output = "";
1340
- const finish = (version) => {
1341
- if (settled) return;
1342
- settled = true;
1343
- clearTimeout(timer);
1344
- resolveProbe(version);
1345
- };
1346
- let child;
1347
- try {
1348
- child = getExecutor().spawn(path, ["--version"], {
1349
- stdio: [
1350
- "ignore",
1351
- "pipe",
1352
- "ignore"
1353
- ],
1354
- detached: process.platform !== "win32"
1355
- });
1356
- } catch {
1357
- resolveProbe(null);
1358
- return;
1359
- }
1360
- const timer = setTimeout(() => {
1361
- try {
1362
- if (process.platform !== "win32" && child.pid) process.kill(-child.pid, "SIGKILL");
1363
- else child.kill("SIGKILL");
1364
- } catch {}
1365
- finish(null);
1366
- }, timeoutMs);
1367
- child.stdout?.on("data", (chunk) => {
1368
- if (output.length < VERSION_OUTPUT_LIMIT) output += String(chunk).slice(0, VERSION_OUTPUT_LIMIT - output.length);
1369
- });
1370
- child.on("error", () => finish(null));
1371
- child.on("close", (code) => finish(code === 0 ? parseStimVersionOutput(output) : null));
1372
- });
1373
- }
1374
- async function inspectStimVersions(runningVersion, { pathValue = process.env.PATH ?? "", runningPath = process.argv[1], probeTimeoutMs = 5e3 } = {}) {
1375
- const paths = stimExecutablePaths(pathValue);
1376
- const versions = await Promise.all(paths.map((entry) => probeStimVersion(entry.path, probeTimeoutMs)));
1377
- const installations = paths.map((entry, index) => ({
1378
- path: entry.path,
1379
- realPath: entry.realPath,
1380
- version: versions[index] ?? null
1381
- }));
1382
- return analyzeStimVersions(runningVersion, canonicalPath(runningPath), installations);
1383
- }
1384
- //#endregion
1385
1239
  //#region src/commands/doctor.ts
1386
1240
  function parseDoctorPlatform(value) {
1387
1241
  if (value === "ios" || value === "android") return value;
@@ -1485,7 +1339,7 @@ function applySandboxFix(root, env = process.env) {
1485
1339
  console.error(chalk.dim("Added writes to Stim's state directory, the simulator XPC service, and local port binding. Claude Code reads project settings from the directory a session starts in, so this file only counts for sessions rooted there. Restart the session for it to take effect."));
1486
1340
  }
1487
1341
  function doctorCommand(program, version, inspectVersions = inspectStimVersions) {
1488
- program.command("doctor").description("Inspect the source checkout and report project state that can make native worktrees slow or invalid. Read-only unless --fix is passed; --platform filters native findings.").option("--json", "print the findings as JSON").option("--platform <platform>", "report shared findings plus only this native platform: ios or android", parseDoctorPlatform).option("--fix", "repair the sandbox allowance when the report names it, and stale Android .cxx configurations in this checkout. Stop native builds first. Generated CMake output must be ignored and untracked; custom launcher settings and source files are preserved.").action(async (opts) => {
1342
+ program.command("doctor").description("Inspect the source checkout and report project state that can make native worktrees slow or invalid. The checkout is left untouched unless --fix is passed; --platform filters native findings. Each run is recorded in Stim state so guide can say when doctor is due.").option("--json", "print the findings as JSON").option("--platform <platform>", "report shared findings plus only this native platform: ios or android", parseDoctorPlatform).option("--fix", "repair the sandbox allowance when the report names it, and stale Android .cxx configurations in this checkout. Stop native builds first. Generated CMake output must be ignored and untracked; custom launcher settings and source files are preserved.").action(async (opts) => {
1489
1343
  const root = findProjectRoot(process.cwd());
1490
1344
  if (!root) {
1491
1345
  console.error(chalk.red("Not in a React Native project (no package.json found)."));
@@ -1526,6 +1380,7 @@ function doctorCommand(program, version, inspectVersions = inspectStimVersions)
1526
1380
  stim,
1527
1381
  findings
1528
1382
  }));
1383
+ recordDoctorRun(root, opts.platform, version);
1529
1384
  return;
1530
1385
  }
1531
1386
  if (findings.length === 0) {
@@ -1533,6 +1388,7 @@ function doctorCommand(program, version, inspectVersions = inspectStimVersions)
1533
1388
  for (const [index, line] of lines.entries()) if (index === 1) console.log(chalk.green(line));
1534
1389
  else if (line && !line.startsWith(" ")) console.log(chalk.bold(line));
1535
1390
  else console.log(chalk.dim(line));
1391
+ recordDoctorRun(root, opts.platform, version);
1536
1392
  return;
1537
1393
  }
1538
1394
  const ordered = findings.toSorted((a, b) => a.level === b.level ? 0 : a.level === "cost" ? -1 : 1);
@@ -1545,6 +1401,7 @@ function doctorCommand(program, version, inspectVersions = inspectStimVersions)
1545
1401
  if (f.fix) console.log(chalk.dim(` -> ${f.fix}`));
1546
1402
  }
1547
1403
  console.log(chalk.dim(`\n${findings.length} finding(s). Fix relevant "costs time" findings before copying the source checkout into a native worktree.`));
1404
+ recordDoctorRun(root, opts.platform, version);
1548
1405
  });
1549
1406
  }
1550
1407
  //#endregion