lim 0.1.5 → 0.10.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 (349) hide show
  1. package/README.md +861 -0
  2. package/bin/dev.js +16 -0
  3. package/bin/run.js +63 -0
  4. package/dist/base-command.d.ts +55 -0
  5. package/dist/base-command.d.ts.map +1 -0
  6. package/dist/base-command.js +467 -0
  7. package/dist/base-command.js.map +1 -0
  8. package/dist/commands/android/connect.d.ts +17 -0
  9. package/dist/commands/android/connect.d.ts.map +1 -0
  10. package/dist/commands/android/connect.js +50 -0
  11. package/dist/commands/android/connect.js.map +1 -0
  12. package/dist/commands/android/create.d.ts +25 -0
  13. package/dist/commands/android/create.d.ts.map +1 -0
  14. package/dist/commands/android/create.js +202 -0
  15. package/dist/commands/android/create.js.map +1 -0
  16. package/dist/commands/android/delete.d.ts +17 -0
  17. package/dist/commands/android/delete.d.ts.map +1 -0
  18. package/dist/commands/android/delete.js +44 -0
  19. package/dist/commands/android/delete.js.map +1 -0
  20. package/dist/commands/android/element-tree.d.ts +16 -0
  21. package/dist/commands/android/element-tree.d.ts.map +1 -0
  22. package/dist/commands/android/element-tree.js +60 -0
  23. package/dist/commands/android/element-tree.js.map +1 -0
  24. package/dist/commands/android/find-element.d.ts +28 -0
  25. package/dist/commands/android/find-element.d.ts.map +1 -0
  26. package/dist/commands/android/find-element.js +70 -0
  27. package/dist/commands/android/find-element.js.map +1 -0
  28. package/dist/commands/android/get.d.ts +17 -0
  29. package/dist/commands/android/get.d.ts.map +1 -0
  30. package/dist/commands/android/get.js +43 -0
  31. package/dist/commands/android/get.js.map +1 -0
  32. package/dist/commands/android/install-app.d.ts +18 -0
  33. package/dist/commands/android/install-app.d.ts.map +1 -0
  34. package/dist/commands/android/install-app.js +70 -0
  35. package/dist/commands/android/install-app.js.map +1 -0
  36. package/dist/commands/android/list.d.ts +19 -0
  37. package/dist/commands/android/list.d.ts.map +1 -0
  38. package/dist/commands/android/list.js +61 -0
  39. package/dist/commands/android/list.js.map +1 -0
  40. package/dist/commands/android/open-url.d.ts +18 -0
  41. package/dist/commands/android/open-url.d.ts.map +1 -0
  42. package/dist/commands/android/open-url.js +51 -0
  43. package/dist/commands/android/open-url.js.map +1 -0
  44. package/dist/commands/android/press-key.d.ts +19 -0
  45. package/dist/commands/android/press-key.d.ts.map +1 -0
  46. package/dist/commands/android/press-key.js +52 -0
  47. package/dist/commands/android/press-key.js.map +1 -0
  48. package/dist/commands/android/record.d.ts +22 -0
  49. package/dist/commands/android/record.d.ts.map +1 -0
  50. package/dist/commands/android/record.js +100 -0
  51. package/dist/commands/android/record.js.map +1 -0
  52. package/dist/commands/android/screenshot.d.ts +18 -0
  53. package/dist/commands/android/screenshot.d.ts.map +1 -0
  54. package/dist/commands/android/screenshot.js +66 -0
  55. package/dist/commands/android/screenshot.js.map +1 -0
  56. package/dist/commands/android/scroll.d.ts +32 -0
  57. package/dist/commands/android/scroll.d.ts.map +1 -0
  58. package/dist/commands/android/scroll.js +72 -0
  59. package/dist/commands/android/scroll.js.map +1 -0
  60. package/dist/commands/android/tap-element.d.ts +27 -0
  61. package/dist/commands/android/tap-element.d.ts.map +1 -0
  62. package/dist/commands/android/tap-element.js +60 -0
  63. package/dist/commands/android/tap-element.js.map +1 -0
  64. package/dist/commands/android/tap.d.ts +25 -0
  65. package/dist/commands/android/tap.d.ts.map +1 -0
  66. package/dist/commands/android/tap.js +55 -0
  67. package/dist/commands/android/tap.js.map +1 -0
  68. package/dist/commands/android/type.d.ts +31 -0
  69. package/dist/commands/android/type.d.ts.map +1 -0
  70. package/dist/commands/android/type.js +53 -0
  71. package/dist/commands/android/type.js.map +1 -0
  72. package/dist/commands/asset/delete.d.ts +17 -0
  73. package/dist/commands/asset/delete.d.ts.map +1 -0
  74. package/dist/commands/asset/delete.js +23 -0
  75. package/dist/commands/asset/delete.js.map +1 -0
  76. package/dist/commands/asset/list.d.ts +22 -0
  77. package/dist/commands/asset/list.d.ts.map +1 -0
  78. package/dist/commands/asset/list.js +97 -0
  79. package/dist/commands/asset/list.js.map +1 -0
  80. package/dist/commands/asset/pull.d.ts +19 -0
  81. package/dist/commands/asset/pull.d.ts.map +1 -0
  82. package/dist/commands/asset/pull.js +84 -0
  83. package/dist/commands/asset/pull.js.map +1 -0
  84. package/dist/commands/asset/push.d.ts +18 -0
  85. package/dist/commands/asset/push.d.ts.map +1 -0
  86. package/dist/commands/asset/push.js +43 -0
  87. package/dist/commands/asset/push.js.map +1 -0
  88. package/dist/commands/go.d.ts +17 -0
  89. package/dist/commands/go.d.ts.map +1 -0
  90. package/dist/commands/go.js +201 -0
  91. package/dist/commands/go.js.map +1 -0
  92. package/dist/commands/ios/app-log.d.ts +20 -0
  93. package/dist/commands/ios/app-log.d.ts.map +1 -0
  94. package/dist/commands/ios/app-log.js +86 -0
  95. package/dist/commands/ios/app-log.js.map +1 -0
  96. package/dist/commands/ios/cp.d.ts +19 -0
  97. package/dist/commands/ios/cp.d.ts.map +1 -0
  98. package/dist/commands/ios/cp.js +64 -0
  99. package/dist/commands/ios/cp.js.map +1 -0
  100. package/dist/commands/ios/create.d.ts +25 -0
  101. package/dist/commands/ios/create.d.ts.map +1 -0
  102. package/dist/commands/ios/create.js +163 -0
  103. package/dist/commands/ios/create.js.map +1 -0
  104. package/dist/commands/ios/delete.d.ts +17 -0
  105. package/dist/commands/ios/delete.d.ts.map +1 -0
  106. package/dist/commands/ios/delete.js +44 -0
  107. package/dist/commands/ios/delete.js.map +1 -0
  108. package/dist/commands/ios/element-tree.d.ts +16 -0
  109. package/dist/commands/ios/element-tree.d.ts.map +1 -0
  110. package/dist/commands/ios/element-tree.js +57 -0
  111. package/dist/commands/ios/element-tree.js.map +1 -0
  112. package/dist/commands/ios/get.d.ts +17 -0
  113. package/dist/commands/ios/get.d.ts.map +1 -0
  114. package/dist/commands/ios/get.js +44 -0
  115. package/dist/commands/ios/get.js.map +1 -0
  116. package/dist/commands/ios/info.d.ts +16 -0
  117. package/dist/commands/ios/info.d.ts.map +1 -0
  118. package/dist/commands/ios/info.js +55 -0
  119. package/dist/commands/ios/info.js.map +1 -0
  120. package/dist/commands/ios/install-app.d.ts +20 -0
  121. package/dist/commands/ios/install-app.d.ts.map +1 -0
  122. package/dist/commands/ios/install-app.js +97 -0
  123. package/dist/commands/ios/install-app.js.map +1 -0
  124. package/dist/commands/ios/launch-app.d.ts +23 -0
  125. package/dist/commands/ios/launch-app.d.ts.map +1 -0
  126. package/dist/commands/ios/launch-app.js +74 -0
  127. package/dist/commands/ios/launch-app.js.map +1 -0
  128. package/dist/commands/ios/list-apps.d.ts +16 -0
  129. package/dist/commands/ios/list-apps.d.ts.map +1 -0
  130. package/dist/commands/ios/list-apps.js +51 -0
  131. package/dist/commands/ios/list-apps.js.map +1 -0
  132. package/dist/commands/ios/list.d.ts +19 -0
  133. package/dist/commands/ios/list.d.ts.map +1 -0
  134. package/dist/commands/ios/list.js +61 -0
  135. package/dist/commands/ios/list.js.map +1 -0
  136. package/dist/commands/ios/lsof.d.ts +16 -0
  137. package/dist/commands/ios/lsof.d.ts.map +1 -0
  138. package/dist/commands/ios/lsof.js +47 -0
  139. package/dist/commands/ios/lsof.js.map +1 -0
  140. package/dist/commands/ios/open-url.d.ts +18 -0
  141. package/dist/commands/ios/open-url.d.ts.map +1 -0
  142. package/dist/commands/ios/open-url.js +51 -0
  143. package/dist/commands/ios/open-url.js.map +1 -0
  144. package/dist/commands/ios/perform.d.ts +18 -0
  145. package/dist/commands/ios/perform.d.ts.map +1 -0
  146. package/dist/commands/ios/perform.js +228 -0
  147. package/dist/commands/ios/perform.js.map +1 -0
  148. package/dist/commands/ios/press-key.d.ts +19 -0
  149. package/dist/commands/ios/press-key.d.ts.map +1 -0
  150. package/dist/commands/ios/press-key.js +52 -0
  151. package/dist/commands/ios/press-key.js.map +1 -0
  152. package/dist/commands/ios/record.d.ts +22 -0
  153. package/dist/commands/ios/record.d.ts.map +1 -0
  154. package/dist/commands/ios/record.js +101 -0
  155. package/dist/commands/ios/record.js.map +1 -0
  156. package/dist/commands/ios/reverse.d.ts +19 -0
  157. package/dist/commands/ios/reverse.d.ts.map +1 -0
  158. package/dist/commands/ios/reverse.js +97 -0
  159. package/dist/commands/ios/reverse.js.map +1 -0
  160. package/dist/commands/ios/screenshot.d.ts +18 -0
  161. package/dist/commands/ios/screenshot.d.ts.map +1 -0
  162. package/dist/commands/ios/screenshot.js +65 -0
  163. package/dist/commands/ios/screenshot.js.map +1 -0
  164. package/dist/commands/ios/scroll.d.ts +19 -0
  165. package/dist/commands/ios/scroll.d.ts.map +1 -0
  166. package/dist/commands/ios/scroll.js +57 -0
  167. package/dist/commands/ios/scroll.js.map +1 -0
  168. package/dist/commands/ios/simctl.d.ts +17 -0
  169. package/dist/commands/ios/simctl.d.ts.map +1 -0
  170. package/dist/commands/ios/simctl.js +72 -0
  171. package/dist/commands/ios/simctl.js.map +1 -0
  172. package/dist/commands/ios/sync.d.ts +23 -0
  173. package/dist/commands/ios/sync.d.ts.map +1 -0
  174. package/dist/commands/ios/sync.js +90 -0
  175. package/dist/commands/ios/sync.js.map +1 -0
  176. package/dist/commands/ios/syslog.d.ts +16 -0
  177. package/dist/commands/ios/syslog.d.ts.map +1 -0
  178. package/dist/commands/ios/syslog.js +62 -0
  179. package/dist/commands/ios/syslog.js.map +1 -0
  180. package/dist/commands/ios/tap-element.d.ts +23 -0
  181. package/dist/commands/ios/tap-element.d.ts.map +1 -0
  182. package/dist/commands/ios/tap-element.js +92 -0
  183. package/dist/commands/ios/tap-element.js.map +1 -0
  184. package/dist/commands/ios/tap.d.ts +25 -0
  185. package/dist/commands/ios/tap.d.ts.map +1 -0
  186. package/dist/commands/ios/tap.js +55 -0
  187. package/dist/commands/ios/tap.js.map +1 -0
  188. package/dist/commands/ios/terminate-app.d.ts +18 -0
  189. package/dist/commands/ios/terminate-app.d.ts.map +1 -0
  190. package/dist/commands/ios/terminate-app.js +49 -0
  191. package/dist/commands/ios/terminate-app.js.map +1 -0
  192. package/dist/commands/ios/toggle-keyboard.d.ts +15 -0
  193. package/dist/commands/ios/toggle-keyboard.d.ts.map +1 -0
  194. package/dist/commands/ios/toggle-keyboard.js +45 -0
  195. package/dist/commands/ios/toggle-keyboard.js.map +1 -0
  196. package/dist/commands/ios/type.d.ts +19 -0
  197. package/dist/commands/ios/type.d.ts.map +1 -0
  198. package/dist/commands/ios/type.js +53 -0
  199. package/dist/commands/ios/type.js.map +1 -0
  200. package/dist/commands/ios/xcodebuild.d.ts +17 -0
  201. package/dist/commands/ios/xcodebuild.d.ts.map +1 -0
  202. package/dist/commands/ios/xcodebuild.js +59 -0
  203. package/dist/commands/ios/xcodebuild.js.map +1 -0
  204. package/dist/commands/ios/xcrun.d.ts +17 -0
  205. package/dist/commands/ios/xcrun.d.ts.map +1 -0
  206. package/dist/commands/ios/xcrun.js +60 -0
  207. package/dist/commands/ios/xcrun.js.map +1 -0
  208. package/dist/commands/login.d.ts +14 -0
  209. package/dist/commands/login.d.ts.map +1 -0
  210. package/dist/commands/login.js +22 -0
  211. package/dist/commands/login.js.map +1 -0
  212. package/dist/commands/logout.d.ts +14 -0
  213. package/dist/commands/logout.d.ts.map +1 -0
  214. package/dist/commands/logout.js +18 -0
  215. package/dist/commands/logout.js.map +1 -0
  216. package/dist/commands/session/start.d.ts +16 -0
  217. package/dist/commands/session/start.d.ts.map +1 -0
  218. package/dist/commands/session/start.js +129 -0
  219. package/dist/commands/session/start.js.map +1 -0
  220. package/dist/commands/session/status.d.ts +14 -0
  221. package/dist/commands/session/status.d.ts.map +1 -0
  222. package/dist/commands/session/status.js +65 -0
  223. package/dist/commands/session/status.js.map +1 -0
  224. package/dist/commands/session/stop.d.ts +18 -0
  225. package/dist/commands/session/stop.d.ts.map +1 -0
  226. package/dist/commands/session/stop.js +76 -0
  227. package/dist/commands/session/stop.js.map +1 -0
  228. package/dist/commands/skills/install.d.ts +18 -0
  229. package/dist/commands/skills/install.d.ts.map +1 -0
  230. package/dist/commands/skills/install.js +473 -0
  231. package/dist/commands/skills/install.js.map +1 -0
  232. package/dist/commands/xcode/attach-simulator.d.ts +18 -0
  233. package/dist/commands/xcode/attach-simulator.d.ts.map +1 -0
  234. package/dist/commands/xcode/attach-simulator.js +55 -0
  235. package/dist/commands/xcode/attach-simulator.js.map +1 -0
  236. package/dist/commands/xcode/build.d.ts +37 -0
  237. package/dist/commands/xcode/build.d.ts.map +1 -0
  238. package/dist/commands/xcode/build.js +233 -0
  239. package/dist/commands/xcode/build.js.map +1 -0
  240. package/dist/commands/xcode/create.d.ts +22 -0
  241. package/dist/commands/xcode/create.d.ts.map +1 -0
  242. package/dist/commands/xcode/create.js +187 -0
  243. package/dist/commands/xcode/create.js.map +1 -0
  244. package/dist/commands/xcode/delete.d.ts +17 -0
  245. package/dist/commands/xcode/delete.d.ts.map +1 -0
  246. package/dist/commands/xcode/delete.js +44 -0
  247. package/dist/commands/xcode/delete.js.map +1 -0
  248. package/dist/commands/xcode/get.d.ts +17 -0
  249. package/dist/commands/xcode/get.d.ts.map +1 -0
  250. package/dist/commands/xcode/get.js +59 -0
  251. package/dist/commands/xcode/get.js.map +1 -0
  252. package/dist/commands/xcode/list.d.ts +18 -0
  253. package/dist/commands/xcode/list.d.ts.map +1 -0
  254. package/dist/commands/xcode/list.js +58 -0
  255. package/dist/commands/xcode/list.js.map +1 -0
  256. package/dist/commands/xcode/sync.d.ts +24 -0
  257. package/dist/commands/xcode/sync.d.ts.map +1 -0
  258. package/dist/commands/xcode/sync.js +93 -0
  259. package/dist/commands/xcode/sync.js.map +1 -0
  260. package/dist/index.d.ts +2 -0
  261. package/dist/index.d.ts.map +1 -0
  262. package/dist/index.js +6 -0
  263. package/dist/index.js.map +1 -0
  264. package/dist/lib/additional-files.d.ts +6 -0
  265. package/dist/lib/additional-files.d.ts.map +1 -0
  266. package/dist/lib/additional-files.js +19 -0
  267. package/dist/lib/additional-files.js.map +1 -0
  268. package/dist/lib/android-selector.d.ts +50 -0
  269. package/dist/lib/android-selector.d.ts.map +1 -0
  270. package/dist/lib/android-selector.js +103 -0
  271. package/dist/lib/android-selector.js.map +1 -0
  272. package/dist/lib/auth.d.ts +2 -0
  273. package/dist/lib/auth.d.ts.map +1 -0
  274. package/dist/lib/auth.js +60 -0
  275. package/dist/lib/auth.js.map +1 -0
  276. package/dist/lib/config.d.ts +65 -0
  277. package/dist/lib/config.d.ts.map +1 -0
  278. package/dist/lib/config.js +292 -0
  279. package/dist/lib/config.js.map +1 -0
  280. package/dist/lib/daemon-client.d.ts +9 -0
  281. package/dist/lib/daemon-client.d.ts.map +1 -0
  282. package/dist/lib/daemon-client.js +81 -0
  283. package/dist/lib/daemon-client.js.map +1 -0
  284. package/dist/lib/daemon.d.ts +41 -0
  285. package/dist/lib/daemon.d.ts.map +1 -0
  286. package/dist/lib/daemon.js +511 -0
  287. package/dist/lib/daemon.js.map +1 -0
  288. package/dist/lib/detox-version.d.ts +12 -0
  289. package/dist/lib/detox-version.d.ts.map +1 -0
  290. package/dist/lib/detox-version.js +30 -0
  291. package/dist/lib/detox-version.js.map +1 -0
  292. package/dist/lib/duration.d.ts +2 -0
  293. package/dist/lib/duration.d.ts.map +1 -0
  294. package/dist/lib/duration.js +37 -0
  295. package/dist/lib/duration.js.map +1 -0
  296. package/dist/lib/formatting.d.ts +3 -0
  297. package/dist/lib/formatting.d.ts.map +1 -0
  298. package/dist/lib/formatting.js +31 -0
  299. package/dist/lib/formatting.js.map +1 -0
  300. package/dist/lib/ignore-patterns.d.ts +2 -0
  301. package/dist/lib/ignore-patterns.d.ts.map +1 -0
  302. package/dist/lib/ignore-patterns.js +18 -0
  303. package/dist/lib/ignore-patterns.js.map +1 -0
  304. package/dist/lib/instance-client-factory.d.ts +29 -0
  305. package/dist/lib/instance-client-factory.d.ts.map +1 -0
  306. package/dist/lib/instance-client-factory.js +87 -0
  307. package/dist/lib/instance-client-factory.js.map +1 -0
  308. package/dist/lib/launch-app-runtime.d.ts +23 -0
  309. package/dist/lib/launch-app-runtime.d.ts.map +1 -0
  310. package/dist/lib/launch-app-runtime.js +58 -0
  311. package/dist/lib/launch-app-runtime.js.map +1 -0
  312. package/dist/lib/onboarding.d.ts +42 -0
  313. package/dist/lib/onboarding.d.ts.map +1 -0
  314. package/dist/lib/onboarding.js +296 -0
  315. package/dist/lib/onboarding.js.map +1 -0
  316. package/dist/lib/project-detection.d.ts +11 -0
  317. package/dist/lib/project-detection.d.ts.map +1 -0
  318. package/dist/lib/project-detection.js +122 -0
  319. package/dist/lib/project-detection.js.map +1 -0
  320. package/dist/lib/remote-skills.d.ts +47 -0
  321. package/dist/lib/remote-skills.d.ts.map +1 -0
  322. package/dist/lib/remote-skills.js +241 -0
  323. package/dist/lib/remote-skills.js.map +1 -0
  324. package/dist/lib/reverse-port-mapping.d.ts +6 -0
  325. package/dist/lib/reverse-port-mapping.d.ts.map +1 -0
  326. package/dist/lib/reverse-port-mapping.js +24 -0
  327. package/dist/lib/reverse-port-mapping.js.map +1 -0
  328. package/dist/lib/skills.d.ts +17 -0
  329. package/dist/lib/skills.d.ts.map +1 -0
  330. package/dist/lib/skills.js +153 -0
  331. package/dist/lib/skills.js.map +1 -0
  332. package/dist/lib/xcode-sandbox.d.ts +2 -0
  333. package/dist/lib/xcode-sandbox.d.ts.map +1 -0
  334. package/dist/lib/xcode-sandbox.js +7 -0
  335. package/dist/lib/xcode-sandbox.js.map +1 -0
  336. package/package.json +69 -13
  337. package/.npmignore +0 -2
  338. package/build/lib/index.js +0 -1498
  339. package/build/lib/index.map +0 -1
  340. package/build/lib/utils/courier.js +0 -98
  341. package/build/lib/utils/courier.map +0 -1
  342. package/build/lib/utils/polyfill.js +0 -53
  343. package/build/lib/utils/polyfill.map +0 -1
  344. package/build.sh +0 -9
  345. package/index.js +0 -2
  346. package/lib/index.js +0 -284
  347. package/lib/utils/courier.js +0 -108
  348. package/lib/utils/polyfill.js +0 -42
  349. package/native.js +0 -2
package/README.md ADDED
@@ -0,0 +1,861 @@
1
+ # lim
2
+
3
+ The official command-line interface for [Limrun](https://limrun.com) — create and control cloud mobile sandboxes for Android, iOS, and Xcode.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ # npm
9
+ npm install -g lim
10
+
11
+ # npx (no install)
12
+ npx lim <command>
13
+ ```
14
+
15
+ ### Migrating from `@limrun/cli`
16
+
17
+ `lim` is the canonical npm package for the Limrun CLI. If you already installed the older scoped package, remove it before installing `lim` so npm does not hit a global `lim` binary conflict:
18
+
19
+ ```bash
20
+ npm uninstall -g @limrun/cli
21
+ npm install -g lim
22
+ ```
23
+
24
+ If you already have the `lim` package installed globally, update it with:
25
+
26
+ ```bash
27
+ npm install -g lim
28
+ ```
29
+
30
+ ## Authentication
31
+
32
+ ```bash
33
+ # Log in via browser (stores API key in ~/.lim/config.yaml)
34
+ lim login
35
+
36
+ # Or provide an API key directly
37
+ lim --api-key <YOUR_KEY> android list
38
+
39
+ # Or use an environment variable
40
+ export LIM_API_KEY=<YOUR_KEY>
41
+ lim android list
42
+
43
+ # Log out (removes stored API key)
44
+ lim logout
45
+ ```
46
+
47
+ The CLI stores configuration in `~/.lim/config.yaml`. This file is compatible with the Go-based `lim` CLI — if you've already logged in with the Go version, the TypeScript CLI will use the same credentials.
48
+
49
+ ## Fast First Run
50
+
51
+ ```bash
52
+ lim go
53
+ ```
54
+
55
+ `lim go` is the fastest way to get started with Limrun. Run it inside a clear iOS or Expo project root to install the Limrun agent skills for that project and get the next prompt for your coding agent. Run it anywhere else to clone the native sample app, build it on Limrun, and print a cloud simulator URL.
56
+
57
+ ## Global Flags
58
+
59
+ Most commands support these flags (exceptions: `lim skills install` does not take `--api-key` because it does not talk to the API):
60
+
61
+ | Flag | Description |
62
+ | ------------------- | ---------------------------------------------------------- |
63
+ | `--api-key <value>` | API key (also reads `LIM_API_KEY` env var) |
64
+ | `--json` | Output as JSON instead of human-readable tables |
65
+ | `--quiet` | Suppress intermediate logs and print only the final result |
66
+ | `--help` | Show help for any command |
67
+
68
+ ## Command Structure
69
+
70
+ Commands are organized by resource (noun-first), so you can discover everything available for a platform with `--help`:
71
+
72
+ ```bash
73
+ lim ios --help # All iOS commands
74
+ lim android --help # All Android commands
75
+ lim xcode --help # All Xcode commands
76
+ lim asset --help # All asset commands
77
+ ```
78
+
79
+ **Instance ID is optional** on interaction commands. When omitted, the CLI uses the last created instance of the matching type:
80
+
81
+ ```bash
82
+ lim ios create # Creates ios_abc123, remembers it
83
+ lim ios screenshot test.png # Uses ios_abc123 automatically
84
+ lim ios tap 100 200 # Still uses ios_abc123
85
+ lim session start # Starts session for ios_abc123
86
+ ```
87
+
88
+ You can always provide an ID explicitly to target a specific instance:
89
+
90
+ ```bash
91
+ lim ios screenshot test.png --id ios_def456
92
+ ```
93
+
94
+ For repeatable scripts and LLM agents, prefer explicit platform commands plus an explicit `--id` once you have it:
95
+
96
+ ```bash
97
+ lim ios get ios_abc123 --json
98
+ lim ios screenshot screenshot.png --id ios_abc123
99
+ lim android tap --id android_abc123 100 200
100
+ ```
101
+
102
+ This avoids relying on locally cached "last created" state and keeps the target platform explicit.
103
+
104
+ ## Commands
105
+
106
+ - [Go](#go) — Get started with Limrun on your project or the sample app
107
+ - [iOS](#ios) — Create, manage, and interact with iOS instances
108
+ - [Android](#android) — Create, manage, and interact with Android instances
109
+ - [Xcode](#xcode) — Create and manage Xcode sandbox instances
110
+ - [Assets](#assets) — Upload and download files (APKs, IPAs, etc.)
111
+ - [Sessions](#sessions) — Persistent connections for fast, interactive device control
112
+ - [Xcode Build Pipeline](#xcode-build-pipeline) — Sync code and run xcodebuild remotely
113
+ - [Skills](#skills) — Install Limrun skills for AI coding agents (Claude Code, Cursor, Codex)
114
+
115
+ ---
116
+
117
+ ### Go
118
+
119
+ `lim go` logs in if needed, then chooses the fastest useful path:
120
+
121
+ ```bash
122
+ lim go
123
+ ```
124
+
125
+ - In a clear native iOS project, it installs the Limrun iOS/Xcode skill into `.agents/skills/` and `.claude/skills/`.
126
+ - In a clear Expo project, it installs the Limrun iOS/Xcode and Expo skills into `.agents/skills/` and `.claude/skills/`.
127
+ - In any other directory, it clones `limrun-inc/sample-native-app`, builds it with a Limrun iOS simulator + Xcode sandbox, and prints a simulator URL.
128
+
129
+ After setup, open your coding agent in the project and ask it to build and run the app with Limrun. For manual agent setup, use `lim skills install`.
130
+
131
+ ---
132
+
133
+ ### iOS
134
+
135
+ ```bash
136
+ lim ios create # Create a new iOS instance
137
+ lim ios list # List all ready iOS instances
138
+ lim ios get <ID> # Get details of a specific instance
139
+ lim ios delete <ID> # Delete an instance
140
+ lim ios info # Get device info from a running instance
141
+ ```
142
+
143
+ #### Create Options
144
+
145
+ ```bash
146
+ # Basic
147
+ lim ios create
148
+
149
+ # With specific device model
150
+ lim ios create --model ipad --rm
151
+
152
+ # With pre-installed app from asset storage
153
+ lim ios create --install-asset my-app.ipa
154
+
155
+ # With Xcode sandbox enabled
156
+ lim ios create --xcode
157
+
158
+ # Full options
159
+ lim ios create --region us-west --display-name "CI Test" --label env=ci --rm
160
+ ```
161
+
162
+ **Flags for `ios create`:**
163
+
164
+ | Flag | Description |
165
+ | --------------------------------- | ------------------------------------------------------ |
166
+ | `--rm` | Auto-delete the instance on exit (Ctrl+C) |
167
+ | `--model <iphone\|ipad\|watch>` | Simulator device model |
168
+ | `--xcode` | Attach a Xcode build sandbox to the iOS instance |
169
+ | `--region <value>` | Region for the instance (e.g. `us-west`) |
170
+ | `--display-name <value>` | Human-readable name |
171
+ | `--label <key=value>` | Labels (repeatable). Used for filtering and reuse |
172
+ | `--hard-timeout <duration>` | Max lifetime (e.g. `1m`, `10m`, `3h`). Default: none |
173
+ | `--inactivity-timeout <duration>` | Idle timeout. Default: `3m` |
174
+ | `--reuse-if-exists` | Reuse an existing instance with matching labels/region |
175
+ | `--install <file>` | Local file to install (auto-uploads, repeatable) |
176
+ | `--install-asset <name>` | Asset name to install (repeatable) |
177
+
178
+ #### List and Filter
179
+
180
+ ```bash
181
+ lim ios list # Ready instances
182
+ lim ios list --all # All states
183
+ lim ios list --state creating # Filter by state
184
+ lim ios list --region us-west # Filter by region
185
+ lim ios list --label-selector env=prod # Filter by labels
186
+ lim ios list --json # JSON output
187
+ lim ios get <ID> # Single instance details
188
+ ```
189
+
190
+ #### Device Interaction
191
+
192
+ All interaction commands accept an optional `--id`. When omitted, the last created iOS instance is used.
193
+
194
+ ```bash
195
+ # Device info
196
+ lim ios info
197
+ lim ios info --json
198
+
199
+ # Screenshots
200
+ lim ios screenshot screenshot.png
201
+
202
+ # Tapping
203
+ lim ios tap 100 200
204
+ lim ios tap-element --ax-label "Submit"
205
+ lim ios tap-element --ax-unique-id btn_ok
206
+
207
+ # Text input
208
+ lim ios type "Hello World"
209
+ lim ios type "search query" --enter
210
+ lim ios press-key enter
211
+ lim ios press-key a --modifier shift
212
+ lim ios toggle-keyboard
213
+
214
+ # Scrolling
215
+ lim ios scroll down --amount 500
216
+
217
+ # Batch multiple actions in one call
218
+ lim ios perform --action type=tap,x=100,y=200 --action 'type=typeText,text=Hello World'
219
+ lim ios perform --action type=wait,durationMs=500 --action type=pressKey,key=enter
220
+ lim ios perform --file ./actions.yaml
221
+
222
+ # actions.yaml
223
+ - type: tap
224
+ x: 100
225
+ y: 200
226
+ - type: typeText
227
+ text: "Hello World"
228
+
229
+ # UI inspection
230
+ lim ios element-tree
231
+ lim ios element-tree | jq '.'
232
+
233
+ # Open URLs / deep links
234
+ lim ios open-url https://example.com
235
+ lim ios open-url myapp://settings
236
+
237
+ # Low-level simulator access
238
+ lim ios simctl -- listapps booted
239
+ lim ios xcrun -- --sdk iphonesimulator --show-sdk-version
240
+ lim ios xcodebuild -- -version
241
+ lim ios cp payload.json ./fixtures/payload.json
242
+ lim ios lsof
243
+ ```
244
+
245
+ #### App Management (iOS only)
246
+
247
+ ```bash
248
+ # Install an app (local file auto-uploads, or use URL)
249
+ lim ios install-app ./MyApp.ipa
250
+ lim ios install-app https://example.com/app.ipa
251
+ lim ios install-app https://example.com/app.ipa --md5 <hex-digest>
252
+ lim ios install-app ./MyApp.ipa --launch-mode RelaunchIfRunning
253
+
254
+ # Launch / terminate
255
+ lim ios launch-app com.example.myapp
256
+ lim ios launch-app com.example.myapp --mode RelaunchIfRunning
257
+ lim ios terminate-app com.example.myapp
258
+
259
+ # List installed apps
260
+ lim ios list-apps
261
+ ```
262
+
263
+ #### Log Streaming (iOS only)
264
+
265
+ ```bash
266
+ # Tail recent logs
267
+ lim ios app-log com.example.myapp --tail 50
268
+
269
+ # Stream logs continuously (Ctrl+C to stop)
270
+ lim ios app-log com.example.myapp --follow
271
+
272
+ # Stream full simulator syslog
273
+ lim ios syslog
274
+ lim ios syslog --json
275
+ ```
276
+
277
+ #### Video Recording
278
+
279
+ ```bash
280
+ lim ios record start
281
+ lim ios record start --quality 8
282
+ lim ios record stop
283
+ lim ios record stop -o recording.mp4
284
+ lim ios record stop --presigned-url https://example.com/upload
285
+ ```
286
+
287
+ #### Built App Sync (iOS only)
288
+
289
+ ```bash
290
+ # Sync a built .app bundle to the current iOS instance
291
+ lim ios sync ./Build/Products/Debug-iphonesimulator/MyApp.app
292
+
293
+ # Re-sync on changes and relaunch if the app is already running
294
+ lim ios sync ./MyApp.app --watch --launch-mode RelaunchIfRunning
295
+
296
+ # Tune the delta-sync cache and patch size
297
+ lim ios sync ./MyApp.app --basis-cache-dir ./.limsync-cache --max-patch-bytes 2097152
298
+ ```
299
+
300
+ ---
301
+
302
+ ### Android
303
+
304
+ ```bash
305
+ lim android create # Create a new Android instance
306
+ lim android list # List all ready Android instances
307
+ lim android get <ID> # Get details of a specific instance
308
+ lim android delete <ID> # Delete an instance
309
+ ```
310
+
311
+ #### Create Options
312
+
313
+ ```bash
314
+ # Basic (prints a Console URL you can open in the browser)
315
+ lim android create
316
+
317
+ # With apps pre-installed
318
+ lim android create --install ./my-app.apk --install ./another.apk
319
+
320
+ # Create without opening an ADB tunnel
321
+ lim android create --no-connect
322
+
323
+ # Full options
324
+ lim android create --region us-west --display-name "CI Test" --label env=ci --rm
325
+ ```
326
+
327
+ **Android-specific flags:**
328
+
329
+ | Flag | Description |
330
+ | ------------------- | ----------------------------------------------- |
331
+ | `--[no-]connect` | Start an ADB tunnel immediately (default: true) |
332
+ | `--adb-path <path>` | Path to `adb` binary (default: `adb`) |
333
+
334
+ `lim android create` always prints a Console URL such as `https://console.limrun.com/stream/android_...` that you can open in the browser for live viewing. For automation, `--no-connect` is usually the safest default.
335
+
336
+ #### Device Interaction
337
+
338
+ All interaction commands accept an optional `--id`. When omitted, the last created Android instance is used.
339
+
340
+ ```bash
341
+ # Screenshots
342
+ lim android screenshot screenshot.png
343
+
344
+ # Tapping
345
+ lim android tap 100 200
346
+ lim android tap-element --resource-id com.example:id/button
347
+ lim android tap-element --content-desc "Sign In button"
348
+ lim android tap-element --text "Sign In"
349
+ lim android find-element --resource-id com.example:id/button --json
350
+
351
+ # Text input
352
+ lim android type "Hello World"
353
+ lim android type "Hello World" --resource-id com.example:id/search_input
354
+ lim android press-key enter
355
+
356
+ # Scrolling
357
+ lim android scroll down --amount 500
358
+ lim android scroll down --resource-id com.example:id/list --amount 500
359
+
360
+ # UI inspection
361
+ lim android element-tree
362
+
363
+ # Install app
364
+ lim android install-app ./app.apk
365
+
366
+ # Open URL
367
+ lim android open-url https://example.com
368
+
369
+ # Video recording
370
+ lim android record start
371
+ lim android record start --quality 8
372
+ lim android record stop
373
+ lim android record stop -o recording.mp4
374
+ lim android record stop --presigned-url https://example.com/upload
375
+ ```
376
+
377
+ #### ADB Tunnel
378
+
379
+ Connect to a running Android instance for direct `adb` access:
380
+
381
+ ```bash
382
+ lim android connect
383
+ lim android connect --id android_abc123 --adb-path /usr/local/bin/adb
384
+ ```
385
+
386
+ The tunnel stays open until you press Ctrl+C. While connected, you can use `adb` commands in another terminal.
387
+
388
+ ---
389
+
390
+ ### Xcode
391
+
392
+ Standalone Xcode build sandboxes for remote compilation.
393
+
394
+ ```bash
395
+ lim xcode create # Create a new Xcode sandbox
396
+ lim xcode create --ios # Create an iOS instance with an attached Xcode sandbox
397
+ lim xcode list # List all ready Xcode instances
398
+ lim xcode get <ID> # Get details of a specific instance
399
+ lim xcode delete <ID> # Delete an instance
400
+ lim xcode attach-simulator <IOS_ID> --id <XCODE_ID>
401
+ ```
402
+
403
+ ```bash
404
+ # Create with options
405
+ lim xcode create --rm --region us-west --hard-timeout 1h
406
+
407
+ # Build (automatically syncs the project path first)
408
+ lim xcode build ./MyProject --scheme MyApp --workspace MyApp.xcworkspace
409
+
410
+ # Build and upload artifact
411
+ lim xcode build ./MyProject --scheme MyApp --upload my-app-build
412
+
413
+ # Signed device build
414
+ lim xcode build ./MyProject --scheme MyApp --certificate-p12 ./certificate.p12 --certificate-password "$P12_PASSWORD" --provisioning-profile ./profile.mobileprovision --upload signed-device-build.ipa
415
+
416
+ # Attach an existing simulator so builds auto-install there
417
+ lim xcode attach-simulator ios_abc123 --id sandbox_def456
418
+
419
+ # Tune sync cache, patch size, or ignore additional paths
420
+ lim xcode sync ./MyProject --watch --basis-cache-dir ./.limsync-cache --max-patch-bytes 2097152
421
+ lim xcode sync ./MyProject --ignore "\\.xcuserdata/" --ignore "^DerivedData/"
422
+ ```
423
+
424
+ ---
425
+
426
+ ### Assets
427
+
428
+ Assets are files (APKs, IPAs, configs, etc.) stored in Limrun's cloud storage for use with instances.
429
+
430
+ ```bash
431
+ # Upload a file
432
+ lim asset push ./my-app.apk
433
+ lim asset push ./my-app.ipa -n custom-name
434
+
435
+ # Download a file
436
+ lim asset pull asset_abc123
437
+ lim asset pull asset_abc123 -o ./downloads
438
+ lim asset list --name my-app.apk --json
439
+ lim asset pull asset_abc123
440
+
441
+ # List assets
442
+ lim asset list
443
+ lim asset list --name my-app
444
+ lim asset list --name-prefix builds/
445
+ lim asset list --download-url
446
+ lim asset list --include-app-store
447
+
448
+ # Get a specific asset
449
+ lim asset list asset_abc123
450
+
451
+ # Delete an asset
452
+ lim asset delete asset_abc123
453
+ ```
454
+
455
+ ---
456
+
457
+ ### Sessions
458
+
459
+ Sessions keep a persistent WebSocket connection to an instance in the background, making all interaction commands near-instant (~50ms instead of ~2s per command).
460
+
461
+ #### Why Sessions?
462
+
463
+ Without a session, every command creates a new connection:
464
+
465
+ ```
466
+ lim ios screenshot screenshot.png # ~2s (connect + auth + screenshot + disconnect)
467
+ lim ios tap 100 200 # ~2s (connect + auth + tap + disconnect)
468
+ lim ios element-tree # ~2s (connect + auth + fetch + disconnect)
469
+ # Total: ~6s for 3 commands
470
+ ```
471
+
472
+ With a session, the connection is created once and reused:
473
+
474
+ ```
475
+ lim session start # ~2s (one-time connection setup)
476
+ lim ios screenshot screenshot.png # ~50ms (reuses connection)
477
+ lim ios tap 100 200 # ~50ms (reuses connection)
478
+ lim ios element-tree # ~50ms (reuses connection)
479
+ lim session stop # instant cleanup
480
+ # Total: ~2.15s for 3 commands
481
+ ```
482
+
483
+ This makes sessions essential for interactive workflows, AI agent loops, and any scenario where you run multiple commands against the same instance.
484
+
485
+ #### Session Commands
486
+
487
+ ```bash
488
+ # Start a session (defaults to the last remembered iOS instance, otherwise Android, then Xcode)
489
+ lim session start
490
+
491
+ # Or specify an instance explicitly
492
+ lim session start --id ios_abc123
493
+
494
+ # Multiple sessions can run simultaneously
495
+ lim session start --id ios_abc123
496
+ lim session start --id android_def456
497
+
498
+ # Check all active sessions
499
+ lim session status
500
+ lim session status --json
501
+
502
+ # Stop a specific session
503
+ lim session stop --id ios_abc123
504
+
505
+ # Stop all sessions at once
506
+ lim session stop --all
507
+ ```
508
+
509
+ If only one session is active, `lim session stop` (no ID) stops it automatically. For scripts and agents, prefer `--id` explicitly so the target instance is unambiguous.
510
+
511
+ #### How It Works
512
+
513
+ Each `lim session start` spawns an independent background daemon that:
514
+
515
+ - Holds a persistent WebSocket connection to that specific instance
516
+ - Listens on its own Unix socket under `~/.lim/sessions/<hashed-instance-id>/`
517
+ - All interaction commands automatically detect the matching session and route through it
518
+ - Multiple sessions run in parallel with no shared state
519
+
520
+ #### Example: Interactive Testing
521
+
522
+ ```bash
523
+ lim ios create --model iphone
524
+ lim session start
525
+
526
+ # Fast interaction loop — each command takes ~50ms
527
+ lim ios launch-app com.example.myapp
528
+ lim ios element-tree | jq '.tree'
529
+ lim ios tap-element --ax-label "Login"
530
+ lim ios type "user@example.com"
531
+ lim ios tap-element --ax-label "Submit"
532
+ lim ios screenshot after-login.png
533
+
534
+ lim session stop
535
+ lim ios delete ios_abc123
536
+ ```
537
+
538
+ #### Example: Multi-Device AI Agent
539
+
540
+ ```bash
541
+ # Create two instances and start sessions for both
542
+ lim ios create --model iphone
543
+ lim ios create --model ipad
544
+ lim session start --id ios_phone_123
545
+ lim session start --id ios_tablet_456
546
+
547
+ # Agent controls both devices in parallel — ~50ms per command
548
+ lim ios launch-app com.example.myapp --id ios_phone_123
549
+ lim ios launch-app com.example.myapp --id ios_tablet_456
550
+
551
+ lim ios screenshot phone.png --id ios_phone_123
552
+ lim ios screenshot tablet.png --id ios_tablet_456
553
+
554
+ lim ios tap 200 400 --id ios_phone_123
555
+ lim ios element-tree --id ios_tablet_456 --json > tablet-tree.json
556
+
557
+ # Clean up all sessions
558
+ lim session stop --all
559
+ lim ios delete ios_phone_123
560
+ lim ios delete ios_tablet_456
561
+ ```
562
+
563
+ #### Example: Automated Test Matrix
564
+
565
+ ```bash
566
+ # Spin up devices, start sessions, run tests, tear down
567
+ DEVICES=("iphone" "ipad")
568
+ IDS=()
569
+
570
+ for model in "${DEVICES[@]}"; do
571
+ ID=$(lim ios create --model $model --json | jq -r '.metadata.id')
572
+ lim session start --id $ID
573
+ IDS+=($ID)
574
+ done
575
+
576
+ # Run tests against all devices
577
+ for ID in "${IDS[@]}"; do
578
+ lim ios launch-app com.example.myapp --id $ID
579
+ lim ios screenshot "test_${ID}.png" --id $ID
580
+ done
581
+
582
+ # Tear down
583
+ lim session stop --all
584
+ for ID in "${IDS[@]}"; do
585
+ lim ios delete $ID
586
+ done
587
+ ```
588
+
589
+ ---
590
+
591
+ ### Xcode Build Pipeline
592
+
593
+ Build and test iOS apps remotely using cloud Xcode sandboxes. The `sync` and `build` commands work with both standalone Xcode instances and iOS instances that have Xcode sandbox enabled.
594
+
595
+ #### Option A: iOS Instance with Xcode Sandbox (Recommended)
596
+
597
+ This gives you a simulator **and** a build environment in one instance — the built app is automatically installed on the simulator.
598
+
599
+ ```bash
600
+ # 1. Create iOS instance with Xcode sandbox
601
+ lim ios create --xcode
602
+ # Output:
603
+ # Instance ID: ios_abc123
604
+ # Xcode Sandbox: https://...limrun.net/v1/sandbox_.../xcode
605
+ # (sandbox URL is cached locally for sync/build to use)
606
+
607
+ # 2. Build — automatically syncs your project code first, then auto-installs on the simulator
608
+ lim xcode build ./MyProject --id ios_abc123 --scheme MyApp --workspace MyApp.xcworkspace
609
+
610
+ # 3. Start a session for fast device interaction
611
+ lim session start
612
+
613
+ # 4. Test the built app on the simulator (~50ms per command)
614
+ lim ios launch-app com.example.myapp
615
+ lim ios element-tree | jq '.'
616
+ lim ios screenshot built-app.png
617
+
618
+ # 5. Clean up
619
+ lim session stop
620
+ lim ios delete ios_abc123
621
+ ```
622
+
623
+ > **Note:** `lim xcode build` already syncs the project path you pass before invoking `xcodebuild`, so you do not need to call `lim xcode sync` first. The Xcode sandbox URL is only returned when the instance is created — not on subsequent `list` calls. The CLI caches it locally at `~/.lim/instances/` so that build workflows can find it. This means `build` must run on the same machine where `ios create --xcode` was executed.
624
+
625
+ #### Option B: Standalone Xcode Instance
626
+
627
+ Use this when you only need to build (no simulator needed), or when you want to attach a simulator separately.
628
+
629
+ ```bash
630
+ # 1. Create a standalone Xcode instance
631
+ lim xcode create --rm
632
+
633
+ # 2. Optionally attach an existing simulator by ID
634
+ lim xcode attach-simulator ios_abc123 --id sandbox_def456
635
+
636
+ # 3. Build (automatically syncs the project path first)
637
+ lim xcode build ./MyProject --scheme MyApp --workspace MyApp.xcworkspace
638
+
639
+ # 4. Upload build artifact
640
+ lim xcode build ./MyProject --scheme MyApp --upload my-app-build
641
+
642
+ # Signed device builds default to --sdk iphoneos when signing assets are provided
643
+ lim xcode build ./MyProject --scheme MyApp --certificate-p12 ./certificate.p12 --certificate-password "$P12_PASSWORD" --provisioning-profile ./profile.mobileprovision --upload signed-device-build.ipa
644
+
645
+ # 5. Download the artifact
646
+ lim asset pull my-app-build -o ./build-output
647
+ ```
648
+
649
+ #### Build Behavior
650
+
651
+ `lim xcode build [PATH]` automatically performs a one-shot code sync for the given project path before invoking `xcodebuild`. The sync step automatically ignores build artifacts (`build/`, `DerivedData/`, `.build/`), dependency folders (`Pods/`, `Carthage/Build/`, `.swiftpm/`), and user-specific files (`xcuserdata/`, `.dSYM/`).
652
+
653
+ Provide `--certificate-p12`, `--certificate-password`, and `--provisioning-profile` together to sign a real-device build. When signing assets are provided without `--sdk`, the CLI builds with `iphoneos`; pass `--sdk watchos` for signed watchOS device builds.
654
+
655
+ ---
656
+
657
+ ### Skills
658
+
659
+ Fetch the latest Limrun skills from `limrun-inc/skills@main` and install them into the native skills directory of AI coding agents (Claude Code, Cursor, Codex). After installation, the agent auto-discovers the skill and triggers it when you ask things like "build the iOS app" or "show me a screenshot."
660
+
661
+ ```bash
662
+ # Interactive: prompts for agents (with detected ones pre-checked) and scope
663
+ lim skills install
664
+
665
+ # Non-interactive
666
+ lim skills install --agents claude --scope project
667
+ lim skills install --agents claude --agents cursor --scope project
668
+ lim skills install --agents codex --scope global
669
+ lim skills install --agents cursor --scope project --skills limrun-expo-development
670
+
671
+ # Overwrite existing skill directories (otherwise the command refuses on non-interactive runs)
672
+ lim skills install --agents claude --scope project --force
673
+
674
+ # Machine-readable output for scripts
675
+ lim skills install --agents claude --scope project --json
676
+ ```
677
+
678
+ **Flags:**
679
+
680
+ | Flag | Description |
681
+ | --------------------------- | -------------------------------------------------------------------------------------------- |
682
+ | `--agents <id>` | Target agent. Repeat to select multiple. One of: `claude`, `cursor`, `codex`. |
683
+ | `--skills <name>` | Limrun skill to install. Repeat to select multiple. Defaults to the remote catalog default. |
684
+ | `--scope <project\|global>` | `project` writes into the current directory; `global` writes into the user's home directory. |
685
+ | `--force` | Overwrite existing skill directories without confirmation. |
686
+ | `--json` | Emit structured JSON instead of the human summary. |
687
+ | `--quiet` | Suppress non-result output. |
688
+
689
+ **Available skills:**
690
+
691
+ - `limrun-xcode-and-ios-simulator` (default): Build, launch, and control iOS apps with remote XCode and Simulators.
692
+ - `limrun-expo-development`: Iterate on Expo / React Native apps with remote iOS dev-client workflows.
693
+ - `limrun-detox-testing`: Configure, run, and debug Detox against Limrun iOS simulators.
694
+
695
+ **Install paths:**
696
+
697
+ | Agent | Project | Global |
698
+ | ----------- | ------------------------- | -------------------------------------------------------------------------- |
699
+ | Claude Code | `.claude/skills/<skill>/` | `$CLAUDE_CONFIG_DIR/skills/<skill>/` (default `~/.claude/skills/<skill>/`) |
700
+ | Cursor | `.agents/skills/<skill>/` | `~/.agents/skills/<skill>/` |
701
+ | Codex | `.codex/skills/<skill>/` | `$CODEX_HOME/skills/<skill>/` (default `~/.codex/skills/<skill>/`) |
702
+
703
+ **Behavior:**
704
+
705
+ - The command fetches `limrun-inc/skills@main` at runtime, so skill updates do not require a new `lim` release.
706
+ - The command compares fetched vs existing skill directories byte-for-byte. Identical content is reported as `Unchanged` (no writes).
707
+ - Different content: in interactive mode you are asked to confirm each overwrite; in non-interactive mode the command refuses unless `--force` is passed.
708
+ - Non-interactive runs are all-or-nothing: if any selected target conflicts and `--force` is not set, no files are written for any target, and the command exits with status 1.
709
+ - Ctrl-C cancellation at any prompt exits cleanly without writing.
710
+
711
+ Cursor reads `.agents/skills/` natively, so we install there rather than `.cursor/skills/`. As a bonus, the same install reaches OpenCode and any other tool that follows the AGENTS.md convention - no extra menu options needed.
712
+
713
+ ---
714
+
715
+ ## Configuration
716
+
717
+ The CLI reads configuration from multiple sources (in order of precedence):
718
+
719
+ 1. Command-line flags (`--api-key`)
720
+ 2. Environment variables (`LIM_API_KEY`, `LIM_API_ENDPOINT`, `LIM_CONSOLE_ENDPOINT`), including values loaded from a local `.env` file
721
+ 3. Config file (`~/.lim/config.yaml`)
722
+
723
+ **Config file keys:**
724
+
725
+ | Key | Default | Description |
726
+ | ------------------ | ---------------------------- | ----------------------- |
727
+ | `api-key` | — | Your Limrun API key |
728
+ | `api-endpoint` | `https://api.limrun.com` | API base URL |
729
+ | `console-endpoint` | `https://console.limrun.com` | Console URL (for login) |
730
+
731
+ ---
732
+
733
+ ## JSON Output
734
+
735
+ All commands support `--json` for machine-readable output, making the CLI suitable for scripting and AI agent automation:
736
+
737
+ ```bash
738
+ # Get instance details as JSON
739
+ lim ios get ios_abc123 --json
740
+
741
+ # Parse with jq
742
+ lim android list --json | jq '.[].metadata.id'
743
+
744
+ # Use in scripts
745
+ INSTANCE_ID=$(lim ios create --json | jq -r '.metadata.id')
746
+ lim ios screenshot test.png --id $INSTANCE_ID
747
+ lim ios delete $INSTANCE_ID
748
+ ```
749
+
750
+ ---
751
+
752
+ ## Workflows
753
+
754
+ ### CI Testing: Install and Verify an App
755
+
756
+ ```bash
757
+ # Create instance and start session for fast commands
758
+ lim ios create --install ./build/MyApp.ipa
759
+ lim session start
760
+
761
+ # Verify — each command takes ~50ms with session
762
+ lim ios launch-app com.example.myapp
763
+ sleep 2
764
+ lim ios element-tree | grep "Welcome"
765
+ lim ios screenshot test-result.png
766
+
767
+ # Clean up
768
+ lim session stop
769
+ lim ios delete ios_abc123
770
+ ```
771
+
772
+ ### AI Agent Automation
773
+
774
+ ```bash
775
+ # Create instance
776
+ INSTANCE=$(lim ios create --model iphone --json)
777
+ ID=$(echo $INSTANCE | jq -r '.metadata.id')
778
+
779
+ # Start session — all commands now run in ~50ms
780
+ lim session start
781
+
782
+ # Agent can interact at high speed
783
+ lim ios tap 200 400
784
+ lim ios type "test@example.com"
785
+ lim ios tap-element --ax-label "Sign In"
786
+ lim ios screenshot result.png
787
+ lim ios element-tree --json > ui-state.json
788
+
789
+ # Tail logs (non-streaming works through session too)
790
+ lim ios app-log com.example.myapp --tail 20
791
+
792
+ # Clean up
793
+ lim session stop
794
+ lim ios delete $ID
795
+ ```
796
+
797
+ ### Remote Build + Test on iOS Simulator
798
+
799
+ ```bash
800
+ # Single instance: Xcode sandbox + iOS simulator
801
+ ID=$(lim ios create --xcode --json | jq -r '.metadata.id')
802
+
803
+ # Build and test (build automatically syncs the project path first)
804
+ lim xcode build ./MyiOSProject --id $ID --scheme MyApp --workspace MyApp.xcworkspace
805
+
806
+ # Verify the built app on the simulator
807
+ lim session start
808
+ lim ios launch-app com.example.myapp
809
+ sleep 2
810
+ lim ios element-tree | grep "Welcome"
811
+ lim ios screenshot test-result.png
812
+ lim session stop
813
+
814
+ lim ios delete $ID
815
+ ```
816
+
817
+ ### Build-Only with Artifact Upload
818
+
819
+ ```bash
820
+ lim xcode create --rm --reuse-if-exists --label project=myapp
821
+
822
+ lim xcode build ./MyiOSProject --scheme MyApp --workspace MyApp.xcworkspace --upload myapp-latest
823
+ lim asset list --name myapp-latest --json
824
+ lim asset pull asset_abc123 -o ./build-output
825
+ ```
826
+
827
+ ---
828
+
829
+ ## Development
830
+
831
+ ### Setup
832
+
833
+ ```bash
834
+ cd packages/cli
835
+ npm install
836
+ npm run build
837
+ ```
838
+
839
+ ### Run commands during development
840
+
841
+ ```bash
842
+ # After making changes, rebuild and run
843
+ npm run build && node bin/run.js <command>
844
+
845
+ # Or use watch mode in one terminal, run in another
846
+ npx tsc --watch # Terminal 1
847
+ node bin/run.js ios list # Terminal 2
848
+ ```
849
+
850
+ ### Link globally
851
+
852
+ ```bash
853
+ npm link
854
+
855
+ # Now `lim` works anywhere on your machine
856
+ lim --help
857
+ lim android list
858
+
859
+ # Unlink when done
860
+ npm unlink -g lim
861
+ ```