execbro 0.0.1-reserve → 1.10.13

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 (475) hide show
  1. package/LICENSE +32 -0
  2. package/README.md +496 -0
  3. package/build/__tests__/helpers/fake-cdp-server.d.ts +56 -0
  4. package/build/__tests__/helpers/fake-cdp-server.d.ts.map +1 -0
  5. package/build/__tests__/helpers/fake-cdp-server.js +120 -0
  6. package/build/__tests__/helpers/fake-cdp-server.js.map +1 -0
  7. package/build/__tests__/helpers/tap-test-helpers.d.ts +36 -0
  8. package/build/__tests__/helpers/tap-test-helpers.d.ts.map +1 -0
  9. package/build/__tests__/helpers/tap-test-helpers.js +130 -0
  10. package/build/__tests__/helpers/tap-test-helpers.js.map +1 -0
  11. package/build/__tests__/integration/auto-reconnect.test.d.ts +2 -0
  12. package/build/__tests__/integration/auto-reconnect.test.d.ts.map +1 -0
  13. package/build/__tests__/integration/auto-reconnect.test.js +118 -0
  14. package/build/__tests__/integration/auto-reconnect.test.js.map +1 -0
  15. package/build/__tests__/integration/connection-health.test.d.ts +2 -0
  16. package/build/__tests__/integration/connection-health.test.d.ts.map +1 -0
  17. package/build/__tests__/integration/connection-health.test.js +157 -0
  18. package/build/__tests__/integration/connection-health.test.js.map +1 -0
  19. package/build/__tests__/integration/execute-in-app.test.d.ts +2 -0
  20. package/build/__tests__/integration/execute-in-app.test.d.ts.map +1 -0
  21. package/build/__tests__/integration/execute-in-app.test.js +124 -0
  22. package/build/__tests__/integration/execute-in-app.test.js.map +1 -0
  23. package/build/__tests__/integration/per-call-timeout.test.d.ts +2 -0
  24. package/build/__tests__/integration/per-call-timeout.test.d.ts.map +1 -0
  25. package/build/__tests__/integration/per-call-timeout.test.js +103 -0
  26. package/build/__tests__/integration/per-call-timeout.test.js.map +1 -0
  27. package/build/__tests__/integration/tap-strategies.test.d.ts +2 -0
  28. package/build/__tests__/integration/tap-strategies.test.d.ts.map +1 -0
  29. package/build/__tests__/integration/tap-strategies.test.js +330 -0
  30. package/build/__tests__/integration/tap-strategies.test.js.map +1 -0
  31. package/build/__tests__/integration/tools.test.d.ts +2 -0
  32. package/build/__tests__/integration/tools.test.d.ts.map +1 -0
  33. package/build/__tests__/integration/tools.test.js +227 -0
  34. package/build/__tests__/integration/tools.test.js.map +1 -0
  35. package/build/__tests__/setup.d.ts +2 -0
  36. package/build/__tests__/setup.d.ts.map +1 -0
  37. package/build/__tests__/setup.js +15 -0
  38. package/build/__tests__/setup.js.map +1 -0
  39. package/build/__tests__/unit/androidEmulatorAvds.test.d.ts +2 -0
  40. package/build/__tests__/unit/androidEmulatorAvds.test.d.ts.map +1 -0
  41. package/build/__tests__/unit/androidEmulatorAvds.test.js +98 -0
  42. package/build/__tests__/unit/androidEmulatorAvds.test.js.map +1 -0
  43. package/build/__tests__/unit/buildToken.test.d.ts +2 -0
  44. package/build/__tests__/unit/buildToken.test.d.ts.map +1 -0
  45. package/build/__tests__/unit/buildToken.test.js +22 -0
  46. package/build/__tests__/unit/buildToken.test.js.map +1 -0
  47. package/build/__tests__/unit/bundle.test.d.ts +2 -0
  48. package/build/__tests__/unit/bundle.test.d.ts.map +1 -0
  49. package/build/__tests__/unit/bundle.test.js +53 -0
  50. package/build/__tests__/unit/bundle.test.js.map +1 -0
  51. package/build/__tests__/unit/burst.test.d.ts +2 -0
  52. package/build/__tests__/unit/burst.test.d.ts.map +1 -0
  53. package/build/__tests__/unit/burst.test.js +54 -0
  54. package/build/__tests__/unit/burst.test.js.map +1 -0
  55. package/build/__tests__/unit/connection-health.test.d.ts +2 -0
  56. package/build/__tests__/unit/connection-health.test.d.ts.map +1 -0
  57. package/build/__tests__/unit/connection-health.test.js +38 -0
  58. package/build/__tests__/unit/connection-health.test.js.map +1 -0
  59. package/build/__tests__/unit/debugGlobals.test.d.ts +2 -0
  60. package/build/__tests__/unit/debugGlobals.test.d.ts.map +1 -0
  61. package/build/__tests__/unit/debugGlobals.test.js +14 -0
  62. package/build/__tests__/unit/debugGlobals.test.js.map +1 -0
  63. package/build/__tests__/unit/deviceDiscovery.test.d.ts +2 -0
  64. package/build/__tests__/unit/deviceDiscovery.test.d.ts.map +1 -0
  65. package/build/__tests__/unit/deviceDiscovery.test.js +119 -0
  66. package/build/__tests__/unit/deviceDiscovery.test.js.map +1 -0
  67. package/build/__tests__/unit/deviceResolver.test.d.ts +2 -0
  68. package/build/__tests__/unit/deviceResolver.test.d.ts.map +1 -0
  69. package/build/__tests__/unit/deviceResolver.test.js +261 -0
  70. package/build/__tests__/unit/deviceResolver.test.js.map +1 -0
  71. package/build/__tests__/unit/escapeNonAscii.test.d.ts +2 -0
  72. package/build/__tests__/unit/escapeNonAscii.test.d.ts.map +1 -0
  73. package/build/__tests__/unit/escapeNonAscii.test.js +76 -0
  74. package/build/__tests__/unit/escapeNonAscii.test.js.map +1 -0
  75. package/build/__tests__/unit/exec.test.d.ts +2 -0
  76. package/build/__tests__/unit/exec.test.d.ts.map +1 -0
  77. package/build/__tests__/unit/exec.test.js +54 -0
  78. package/build/__tests__/unit/exec.test.js.map +1 -0
  79. package/build/__tests__/unit/executor.test.d.ts +2 -0
  80. package/build/__tests__/unit/executor.test.d.ts.map +1 -0
  81. package/build/__tests__/unit/executor.test.js +220 -0
  82. package/build/__tests__/unit/executor.test.js.map +1 -0
  83. package/build/__tests__/unit/failureArtifact.test.d.ts +2 -0
  84. package/build/__tests__/unit/failureArtifact.test.d.ts.map +1 -0
  85. package/build/__tests__/unit/failureArtifact.test.js +207 -0
  86. package/build/__tests__/unit/failureArtifact.test.js.map +1 -0
  87. package/build/__tests__/unit/fastRefreshRecorder.test.d.ts +2 -0
  88. package/build/__tests__/unit/fastRefreshRecorder.test.d.ts.map +1 -0
  89. package/build/__tests__/unit/fastRefreshRecorder.test.js +68 -0
  90. package/build/__tests__/unit/fastRefreshRecorder.test.js.map +1 -0
  91. package/build/__tests__/unit/fastRefreshTools.test.d.ts +2 -0
  92. package/build/__tests__/unit/fastRefreshTools.test.d.ts.map +1 -0
  93. package/build/__tests__/unit/fastRefreshTools.test.js +112 -0
  94. package/build/__tests__/unit/fastRefreshTools.test.js.map +1 -0
  95. package/build/__tests__/unit/fiberMatch.test.d.ts +2 -0
  96. package/build/__tests__/unit/fiberMatch.test.d.ts.map +1 -0
  97. package/build/__tests__/unit/fiberMatch.test.js +114 -0
  98. package/build/__tests__/unit/fiberMatch.test.js.map +1 -0
  99. package/build/__tests__/unit/fingerprint.test.d.ts +2 -0
  100. package/build/__tests__/unit/fingerprint.test.d.ts.map +1 -0
  101. package/build/__tests__/unit/fingerprint.test.js +99 -0
  102. package/build/__tests__/unit/fingerprint.test.js.map +1 -0
  103. package/build/__tests__/unit/focusedInput.test.d.ts +2 -0
  104. package/build/__tests__/unit/focusedInput.test.d.ts.map +1 -0
  105. package/build/__tests__/unit/focusedInput.test.js +58 -0
  106. package/build/__tests__/unit/focusedInput.test.js.map +1 -0
  107. package/build/__tests__/unit/focusedInputTools.test.d.ts +2 -0
  108. package/build/__tests__/unit/focusedInputTools.test.d.ts.map +1 -0
  109. package/build/__tests__/unit/focusedInputTools.test.js +79 -0
  110. package/build/__tests__/unit/focusedInputTools.test.js.map +1 -0
  111. package/build/__tests__/unit/iconSemantics.test.d.ts +2 -0
  112. package/build/__tests__/unit/iconSemantics.test.d.ts.map +1 -0
  113. package/build/__tests__/unit/iconSemantics.test.js +80 -0
  114. package/build/__tests__/unit/iconSemantics.test.js.map +1 -0
  115. package/build/__tests__/unit/imageBuffer.test.d.ts +2 -0
  116. package/build/__tests__/unit/imageBuffer.test.d.ts.map +1 -0
  117. package/build/__tests__/unit/imageBuffer.test.js +128 -0
  118. package/build/__tests__/unit/imageBuffer.test.js.map +1 -0
  119. package/build/__tests__/unit/logs.test.d.ts +2 -0
  120. package/build/__tests__/unit/logs.test.d.ts.map +1 -0
  121. package/build/__tests__/unit/logs.test.js +90 -0
  122. package/build/__tests__/unit/logs.test.js.map +1 -0
  123. package/build/__tests__/unit/measureComponent.test.d.ts +2 -0
  124. package/build/__tests__/unit/measureComponent.test.d.ts.map +1 -0
  125. package/build/__tests__/unit/measureComponent.test.js +66 -0
  126. package/build/__tests__/unit/measureComponent.test.js.map +1 -0
  127. package/build/__tests__/unit/measureComponentTools.test.d.ts +2 -0
  128. package/build/__tests__/unit/measureComponentTools.test.d.ts.map +1 -0
  129. package/build/__tests__/unit/measureComponentTools.test.js +94 -0
  130. package/build/__tests__/unit/measureComponentTools.test.js.map +1 -0
  131. package/build/__tests__/unit/metro.test.d.ts +2 -0
  132. package/build/__tests__/unit/metro.test.d.ts.map +1 -0
  133. package/build/__tests__/unit/metro.test.js +61 -0
  134. package/build/__tests__/unit/metro.test.js.map +1 -0
  135. package/build/__tests__/unit/network.test.d.ts +2 -0
  136. package/build/__tests__/unit/network.test.d.ts.map +1 -0
  137. package/build/__tests__/unit/network.test.js +102 -0
  138. package/build/__tests__/unit/network.test.js.map +1 -0
  139. package/build/__tests__/unit/networkInterceptor.test.d.ts +2 -0
  140. package/build/__tests__/unit/networkInterceptor.test.d.ts.map +1 -0
  141. package/build/__tests__/unit/networkInterceptor.test.js +104 -0
  142. package/build/__tests__/unit/networkInterceptor.test.js.map +1 -0
  143. package/build/__tests__/unit/probe.test.d.ts +2 -0
  144. package/build/__tests__/unit/probe.test.d.ts.map +1 -0
  145. package/build/__tests__/unit/probe.test.js +62 -0
  146. package/build/__tests__/unit/probe.test.js.map +1 -0
  147. package/build/__tests__/unit/rnGlobalsBootstrap.test.d.ts +2 -0
  148. package/build/__tests__/unit/rnGlobalsBootstrap.test.d.ts.map +1 -0
  149. package/build/__tests__/unit/rnGlobalsBootstrap.test.js +29 -0
  150. package/build/__tests__/unit/rnGlobalsBootstrap.test.js.map +1 -0
  151. package/build/__tests__/unit/screenState.test.d.ts +2 -0
  152. package/build/__tests__/unit/screenState.test.d.ts.map +1 -0
  153. package/build/__tests__/unit/screenState.test.js +384 -0
  154. package/build/__tests__/unit/screenState.test.js.map +1 -0
  155. package/build/__tests__/unit/screenshot-diff.test.d.ts +2 -0
  156. package/build/__tests__/unit/screenshot-diff.test.d.ts.map +1 -0
  157. package/build/__tests__/unit/screenshot-diff.test.js +97 -0
  158. package/build/__tests__/unit/screenshot-diff.test.js.map +1 -0
  159. package/build/__tests__/unit/tap-evidence.test.d.ts +2 -0
  160. package/build/__tests__/unit/tap-evidence.test.d.ts.map +1 -0
  161. package/build/__tests__/unit/tap-evidence.test.js +89 -0
  162. package/build/__tests__/unit/tap-evidence.test.js.map +1 -0
  163. package/build/__tests__/unit/tap.test.d.ts +2 -0
  164. package/build/__tests__/unit/tap.test.d.ts.map +1 -0
  165. package/build/__tests__/unit/tap.test.js +767 -0
  166. package/build/__tests__/unit/tap.test.js.map +1 -0
  167. package/build/__tests__/unit/timeoutClamp.test.d.ts +2 -0
  168. package/build/__tests__/unit/timeoutClamp.test.d.ts.map +1 -0
  169. package/build/__tests__/unit/timeoutClamp.test.js +17 -0
  170. package/build/__tests__/unit/timeoutClamp.test.js.map +1 -0
  171. package/build/__tests__/unit/toolDescriptions.test.d.ts +2 -0
  172. package/build/__tests__/unit/toolDescriptions.test.d.ts.map +1 -0
  173. package/build/__tests__/unit/toolDescriptions.test.js +145 -0
  174. package/build/__tests__/unit/toolDescriptions.test.js.map +1 -0
  175. package/build/__tests__/unit/transportClassify.test.d.ts +2 -0
  176. package/build/__tests__/unit/transportClassify.test.d.ts.map +1 -0
  177. package/build/__tests__/unit/transportClassify.test.js +60 -0
  178. package/build/__tests__/unit/transportClassify.test.js.map +1 -0
  179. package/build/__tests__/unit/verifyAction.test.d.ts +2 -0
  180. package/build/__tests__/unit/verifyAction.test.d.ts.map +1 -0
  181. package/build/__tests__/unit/verifyAction.test.js +26 -0
  182. package/build/__tests__/unit/verifyAction.test.js.map +1 -0
  183. package/build/core/android.d.ts +299 -0
  184. package/build/core/android.d.ts.map +1 -0
  185. package/build/core/android.js +1582 -0
  186. package/build/core/android.js.map +1 -0
  187. package/build/core/appDetection.d.ts +20 -0
  188. package/build/core/appDetection.d.ts.map +1 -0
  189. package/build/core/appDetection.js +167 -0
  190. package/build/core/appDetection.js.map +1 -0
  191. package/build/core/bundle.d.ts +49 -0
  192. package/build/core/bundle.d.ts.map +1 -0
  193. package/build/core/bundle.js +356 -0
  194. package/build/core/bundle.js.map +1 -0
  195. package/build/core/componentSearch.d.ts +41 -0
  196. package/build/core/componentSearch.d.ts.map +1 -0
  197. package/build/core/componentSearch.js +588 -0
  198. package/build/core/componentSearch.js.map +1 -0
  199. package/build/core/componentTree.d.ts +13 -0
  200. package/build/core/componentTree.d.ts.map +1 -0
  201. package/build/core/componentTree.js +275 -0
  202. package/build/core/componentTree.js.map +1 -0
  203. package/build/core/config.d.ts +9 -0
  204. package/build/core/config.d.ts.map +1 -0
  205. package/build/core/config.js +28 -0
  206. package/build/core/config.js.map +1 -0
  207. package/build/core/connection.d.ts +102 -0
  208. package/build/core/connection.d.ts.map +1 -0
  209. package/build/core/connection.js +1710 -0
  210. package/build/core/connection.js.map +1 -0
  211. package/build/core/connectionState.d.ts +122 -0
  212. package/build/core/connectionState.d.ts.map +1 -0
  213. package/build/core/connectionState.js +313 -0
  214. package/build/core/connectionState.js.map +1 -0
  215. package/build/core/debugGlobals.d.ts +6 -0
  216. package/build/core/debugGlobals.d.ts.map +1 -0
  217. package/build/core/debugGlobals.js +370 -0
  218. package/build/core/debugGlobals.js.map +1 -0
  219. package/build/core/deviceDiscovery.d.ts +52 -0
  220. package/build/core/deviceDiscovery.d.ts.map +1 -0
  221. package/build/core/deviceDiscovery.js +74 -0
  222. package/build/core/deviceDiscovery.js.map +1 -0
  223. package/build/core/deviceResolver.d.ts +44 -0
  224. package/build/core/deviceResolver.d.ts.map +1 -0
  225. package/build/core/deviceResolver.js +225 -0
  226. package/build/core/deviceResolver.js.map +1 -0
  227. package/build/core/errorScreenParser.d.ts +30 -0
  228. package/build/core/errorScreenParser.d.ts.map +1 -0
  229. package/build/core/errorScreenParser.js +198 -0
  230. package/build/core/errorScreenParser.js.map +1 -0
  231. package/build/core/errors.d.ts +14 -0
  232. package/build/core/errors.d.ts.map +1 -0
  233. package/build/core/errors.js +17 -0
  234. package/build/core/errors.js.map +1 -0
  235. package/build/core/escapeNonAscii.d.ts +18 -0
  236. package/build/core/escapeNonAscii.d.ts.map +1 -0
  237. package/build/core/escapeNonAscii.js +352 -0
  238. package/build/core/escapeNonAscii.js.map +1 -0
  239. package/build/core/exec.d.ts +22 -0
  240. package/build/core/exec.d.ts.map +1 -0
  241. package/build/core/exec.js +54 -0
  242. package/build/core/exec.js.map +1 -0
  243. package/build/core/executor.d.ts +9 -0
  244. package/build/core/executor.d.ts.map +1 -0
  245. package/build/core/executor.js +12 -0
  246. package/build/core/executor.js.map +1 -0
  247. package/build/core/failureArtifact.d.ts +120 -0
  248. package/build/core/failureArtifact.d.ts.map +1 -0
  249. package/build/core/failureArtifact.js +113 -0
  250. package/build/core/failureArtifact.js.map +1 -0
  251. package/build/core/fastRefreshRecorder.d.ts +23 -0
  252. package/build/core/fastRefreshRecorder.d.ts.map +1 -0
  253. package/build/core/fastRefreshRecorder.js +83 -0
  254. package/build/core/fastRefreshRecorder.js.map +1 -0
  255. package/build/core/fastRefreshTools.d.ts +19 -0
  256. package/build/core/fastRefreshTools.d.ts.map +1 -0
  257. package/build/core/fastRefreshTools.js +71 -0
  258. package/build/core/fastRefreshTools.js.map +1 -0
  259. package/build/core/feedback.d.ts +18 -0
  260. package/build/core/feedback.d.ts.map +1 -0
  261. package/build/core/feedback.js +73 -0
  262. package/build/core/feedback.js.map +1 -0
  263. package/build/core/fiberMatch.d.ts +25 -0
  264. package/build/core/fiberMatch.d.ts.map +1 -0
  265. package/build/core/fiberMatch.js +35 -0
  266. package/build/core/fiberMatch.js.map +1 -0
  267. package/build/core/fingerprint.d.ts +4 -0
  268. package/build/core/fingerprint.d.ts.map +1 -0
  269. package/build/core/fingerprint.js +47 -0
  270. package/build/core/fingerprint.js.map +1 -0
  271. package/build/core/focusedInput.d.ts +27 -0
  272. package/build/core/focusedInput.d.ts.map +1 -0
  273. package/build/core/focusedInput.js +110 -0
  274. package/build/core/focusedInput.js.map +1 -0
  275. package/build/core/focusedInputTools.d.ts +21 -0
  276. package/build/core/focusedInputTools.d.ts.map +1 -0
  277. package/build/core/focusedInputTools.js +51 -0
  278. package/build/core/focusedInputTools.js.map +1 -0
  279. package/build/core/format.d.ts +8 -0
  280. package/build/core/format.d.ts.map +1 -0
  281. package/build/core/format.js +34 -0
  282. package/build/core/format.js.map +1 -0
  283. package/build/core/guides.d.ts +21 -0
  284. package/build/core/guides.d.ts.map +1 -0
  285. package/build/core/guides.js +397 -0
  286. package/build/core/guides.js.map +1 -0
  287. package/build/core/iconSemantics.d.ts +18 -0
  288. package/build/core/iconSemantics.d.ts.map +1 -0
  289. package/build/core/iconSemantics.js +114 -0
  290. package/build/core/iconSemantics.js.map +1 -0
  291. package/build/core/imageBuffer.d.ts +37 -0
  292. package/build/core/imageBuffer.d.ts.map +1 -0
  293. package/build/core/imageBuffer.js +58 -0
  294. package/build/core/imageBuffer.js.map +1 -0
  295. package/build/core/index.d.ts +37 -0
  296. package/build/core/index.d.ts.map +1 -0
  297. package/build/core/index.js +66 -0
  298. package/build/core/index.js.map +1 -0
  299. package/build/core/inspector.d.ts +55 -0
  300. package/build/core/inspector.d.ts.map +1 -0
  301. package/build/core/inspector.js +603 -0
  302. package/build/core/inspector.js.map +1 -0
  303. package/build/core/ios.d.ts +263 -0
  304. package/build/core/ios.d.ts.map +1 -0
  305. package/build/core/ios.js +1705 -0
  306. package/build/core/ios.js.map +1 -0
  307. package/build/core/jsExecute.d.ts +62 -0
  308. package/build/core/jsExecute.d.ts.map +1 -0
  309. package/build/core/jsExecute.js +696 -0
  310. package/build/core/jsExecute.js.map +1 -0
  311. package/build/core/license.d.ts +48 -0
  312. package/build/core/license.d.ts.map +1 -0
  313. package/build/core/license.js +267 -0
  314. package/build/core/license.js.map +1 -0
  315. package/build/core/logbox.d.ts +58 -0
  316. package/build/core/logbox.d.ts.map +1 -0
  317. package/build/core/logbox.js +330 -0
  318. package/build/core/logbox.js.map +1 -0
  319. package/build/core/logs.d.ts +44 -0
  320. package/build/core/logs.d.ts.map +1 -0
  321. package/build/core/logs.js +149 -0
  322. package/build/core/logs.js.map +1 -0
  323. package/build/core/measureComponent.d.ts +19 -0
  324. package/build/core/measureComponent.d.ts.map +1 -0
  325. package/build/core/measureComponent.js +94 -0
  326. package/build/core/measureComponent.js.map +1 -0
  327. package/build/core/measureComponentTools.d.ts +6 -0
  328. package/build/core/measureComponentTools.d.ts.map +1 -0
  329. package/build/core/measureComponentTools.js +43 -0
  330. package/build/core/measureComponentTools.js.map +1 -0
  331. package/build/core/metro.d.ts +31 -0
  332. package/build/core/metro.d.ts.map +1 -0
  333. package/build/core/metro.js +124 -0
  334. package/build/core/metro.js.map +1 -0
  335. package/build/core/nativeOnlyHints.d.ts +14 -0
  336. package/build/core/nativeOnlyHints.d.ts.map +1 -0
  337. package/build/core/nativeOnlyHints.js +58 -0
  338. package/build/core/nativeOnlyHints.js.map +1 -0
  339. package/build/core/network.d.ts +43 -0
  340. package/build/core/network.d.ts.map +1 -0
  341. package/build/core/network.js +217 -0
  342. package/build/core/network.js.map +1 -0
  343. package/build/core/networkInterceptor.d.ts +30 -0
  344. package/build/core/networkInterceptor.d.ts.map +1 -0
  345. package/build/core/networkInterceptor.js +211 -0
  346. package/build/core/networkInterceptor.js.map +1 -0
  347. package/build/core/ocr.d.ts +87 -0
  348. package/build/core/ocr.d.ts.map +1 -0
  349. package/build/core/ocr.js +335 -0
  350. package/build/core/ocr.js.map +1 -0
  351. package/build/core/paths.d.ts +2 -0
  352. package/build/core/paths.d.ts.map +1 -0
  353. package/build/core/paths.js +28 -0
  354. package/build/core/paths.js.map +1 -0
  355. package/build/core/posthog.d.ts +5 -0
  356. package/build/core/posthog.d.ts.map +1 -0
  357. package/build/core/posthog.js +52 -0
  358. package/build/core/posthog.js.map +1 -0
  359. package/build/core/pressables.d.ts +46 -0
  360. package/build/core/pressables.d.ts.map +1 -0
  361. package/build/core/pressables.js +1719 -0
  362. package/build/core/pressables.js.map +1 -0
  363. package/build/core/probe.d.ts +12 -0
  364. package/build/core/probe.d.ts.map +1 -0
  365. package/build/core/probe.js +56 -0
  366. package/build/core/probe.js.map +1 -0
  367. package/build/core/redux.d.ts +22 -0
  368. package/build/core/redux.d.ts.map +1 -0
  369. package/build/core/redux.js +116 -0
  370. package/build/core/redux.js.map +1 -0
  371. package/build/core/register.d.ts +8 -0
  372. package/build/core/register.d.ts.map +1 -0
  373. package/build/core/register.js +202 -0
  374. package/build/core/register.js.map +1 -0
  375. package/build/core/rnGlobalsBootstrap.d.ts +16 -0
  376. package/build/core/rnGlobalsBootstrap.d.ts.map +1 -0
  377. package/build/core/rnGlobalsBootstrap.js +116 -0
  378. package/build/core/rnGlobalsBootstrap.js.map +1 -0
  379. package/build/core/screenLayout.d.ts +53 -0
  380. package/build/core/screenLayout.d.ts.map +1 -0
  381. package/build/core/screenLayout.js +878 -0
  382. package/build/core/screenLayout.js.map +1 -0
  383. package/build/core/screenState.d.ts +166 -0
  384. package/build/core/screenState.d.ts.map +1 -0
  385. package/build/core/screenState.js +1352 -0
  386. package/build/core/screenState.js.map +1 -0
  387. package/build/core/sdkBridge.d.ts +67 -0
  388. package/build/core/sdkBridge.d.ts.map +1 -0
  389. package/build/core/sdkBridge.js +148 -0
  390. package/build/core/sdkBridge.js.map +1 -0
  391. package/build/core/state.d.ts +37 -0
  392. package/build/core/state.d.ts.map +1 -0
  393. package/build/core/state.js +124 -0
  394. package/build/core/state.js.map +1 -0
  395. package/build/core/telemetry.d.ts +50 -0
  396. package/build/core/telemetry.d.ts.map +1 -0
  397. package/build/core/telemetry.js +653 -0
  398. package/build/core/telemetry.js.map +1 -0
  399. package/build/core/toolHelpers.d.ts +24 -0
  400. package/build/core/toolHelpers.d.ts.map +1 -0
  401. package/build/core/toolHelpers.js +118 -0
  402. package/build/core/toolHelpers.js.map +1 -0
  403. package/build/core/types.d.ts +162 -0
  404. package/build/core/types.d.ts.map +1 -0
  405. package/build/core/types.js +2 -0
  406. package/build/core/types.js.map +1 -0
  407. package/build/index.d.ts +4 -0
  408. package/build/index.d.ts.map +1 -0
  409. package/build/index.js +132 -0
  410. package/build/index.js.map +1 -0
  411. package/build/pro/screenshot-diff.d.ts +10 -0
  412. package/build/pro/screenshot-diff.d.ts.map +1 -0
  413. package/build/pro/screenshot-diff.js +38 -0
  414. package/build/pro/screenshot-diff.js.map +1 -0
  415. package/build/pro/tap.d.ts +291 -0
  416. package/build/pro/tap.d.ts.map +1 -0
  417. package/build/pro/tap.js +1839 -0
  418. package/build/pro/tap.js.map +1 -0
  419. package/build/pro/verifyAction.d.ts +50 -0
  420. package/build/pro/verifyAction.d.ts.map +1 -0
  421. package/build/pro/verifyAction.js +285 -0
  422. package/build/pro/verifyAction.js.map +1 -0
  423. package/build/tools/_deviceArg.d.ts +45 -0
  424. package/build/tools/_deviceArg.d.ts.map +1 -0
  425. package/build/tools/_deviceArg.js +58 -0
  426. package/build/tools/_deviceArg.js.map +1 -0
  427. package/build/tools/accountTools.d.ts +46 -0
  428. package/build/tools/accountTools.d.ts.map +1 -0
  429. package/build/tools/accountTools.js +223 -0
  430. package/build/tools/accountTools.js.map +1 -0
  431. package/build/tools/bundleTools.d.ts +3 -0
  432. package/build/tools/bundleTools.d.ts.map +1 -0
  433. package/build/tools/bundleTools.js +375 -0
  434. package/build/tools/bundleTools.js.map +1 -0
  435. package/build/tools/componentTools.d.ts +3 -0
  436. package/build/tools/componentTools.d.ts.map +1 -0
  437. package/build/tools/componentTools.js +746 -0
  438. package/build/tools/componentTools.js.map +1 -0
  439. package/build/tools/connectionTools.d.ts +3 -0
  440. package/build/tools/connectionTools.d.ts.map +1 -0
  441. package/build/tools/connectionTools.js +625 -0
  442. package/build/tools/connectionTools.js.map +1 -0
  443. package/build/tools/deviceTools.d.ts +3 -0
  444. package/build/tools/deviceTools.d.ts.map +1 -0
  445. package/build/tools/deviceTools.js +423 -0
  446. package/build/tools/deviceTools.js.map +1 -0
  447. package/build/tools/executionTools.d.ts +3 -0
  448. package/build/tools/executionTools.d.ts.map +1 -0
  449. package/build/tools/executionTools.js +243 -0
  450. package/build/tools/executionTools.js.map +1 -0
  451. package/build/tools/interactionTools.d.ts +3 -0
  452. package/build/tools/interactionTools.d.ts.map +1 -0
  453. package/build/tools/interactionTools.js +539 -0
  454. package/build/tools/interactionTools.js.map +1 -0
  455. package/build/tools/logTools.d.ts +3 -0
  456. package/build/tools/logTools.d.ts.map +1 -0
  457. package/build/tools/logTools.js +371 -0
  458. package/build/tools/logTools.js.map +1 -0
  459. package/build/tools/metaTools.d.ts +7 -0
  460. package/build/tools/metaTools.d.ts.map +1 -0
  461. package/build/tools/metaTools.js +186 -0
  462. package/build/tools/metaTools.js.map +1 -0
  463. package/build/tools/networkTools.d.ts +3 -0
  464. package/build/tools/networkTools.d.ts.map +1 -0
  465. package/build/tools/networkTools.js +478 -0
  466. package/build/tools/networkTools.js.map +1 -0
  467. package/build/tools/reduxTools.d.ts +3 -0
  468. package/build/tools/reduxTools.d.ts.map +1 -0
  469. package/build/tools/reduxTools.js +83 -0
  470. package/build/tools/reduxTools.js.map +1 -0
  471. package/build/tools/screenshotTools.d.ts +3 -0
  472. package/build/tools/screenshotTools.d.ts.map +1 -0
  473. package/build/tools/screenshotTools.js +703 -0
  474. package/build/tools/screenshotTools.js.map +1 -0
  475. package/package.json +63 -2
@@ -0,0 +1,397 @@
1
+ /**
2
+ * Usage guides for MCP tools.
3
+ * Returned by the get_usage_guide tool to help agents understand recommended workflows.
4
+ */
5
+ const guides = [
6
+ {
7
+ id: "setup",
8
+ title: "Session Setup",
9
+ summary: "Connect to a running React Native app via Metro bundler",
10
+ content: `# Session Setup
11
+
12
+ ## Prerequisites (CRITICAL — install BEFORE using device tools)
13
+ - **iOS UI driver (required for tap, ios_button, and all iOS interaction tools):**
14
+ - Default: AXe — brew install cameroncooke/axe/axe
15
+ - Alternative: IDB — brew install idb-companion (set IOS_DRIVER=idb in MCP server env to use it)
16
+ - Without a UI driver, most iOS tools will fail with "not installed" errors
17
+ - **Android:** ADB must be in PATH (comes with Android SDK Platform Tools)
18
+
19
+ ## Quick Start
20
+ 1. scan_metro — auto-discovers Metro on common ports (8081, 8082, 19000-19002) and connects. Note: this occupies the CDP slot, which prevents the built-in React Native debugger from connecting. See "Switch to Native Debugger" below.
21
+ 2. get_apps — verify the app appears in connected list
22
+ 3. get_connection_status — check connection health
23
+
24
+ ## If No App Running
25
+ - list_ios_simulators / list_android_devices — find available devices
26
+ - ios_boot_simulator — boot an iOS simulator if needed
27
+ - ios_launch_app / android_launch_app — launch the app
28
+ - Wait 2-3 seconds, then scan_metro
29
+
30
+ ## Switch to Native Debugger
31
+ - disconnect_metro — closes all CDP connections and stops auto-reconnect
32
+ - The built-in React Native debugger can now connect
33
+ - Use scan_metro to reconnect when done with native debugger
34
+
35
+ ## Key Tools
36
+ - scan_metro: auto-discover and connect (preferred)
37
+ - connect_metro: connect to specific port (when you know it)
38
+ - disconnect_metro: close all connections (free CDP slot for native debugger)
39
+ - ensure_connection: health check with healthCheck=true
40
+ - get_connection_status: check uptime and gaps`
41
+ },
42
+ {
43
+ id: "inspect",
44
+ title: "Component Inspection",
45
+ summary: "Identify which React component renders a UI element, get hierarchy and file paths",
46
+ content: `# Component Inspection
47
+
48
+ ## Recommended Workflow: Identify a Component on Screen
49
+ 1. Take a screenshot (ios_screenshot / android_screenshot) or use ocr_screenshot
50
+ 2. Identify the target element visually, estimate its coordinates
51
+ 3. Convert screenshot pixels to points: divide by device pixel ratio (e.g. pixel_x / 3 for @3x iPhones)
52
+ 4. Pick the right tool (see decision below) and call it with (x, y)
53
+
54
+ ## get_inspector_selection vs inspect_at_point — DECISION GUIDE
55
+
56
+ Both answer "what is at (x, y)?" but surface different supplementary data. Pick by what you need next.
57
+
58
+ | Question you're asking | Use |
59
+ |---|---|
60
+ | "Why is the borderRadius wrong?" / "What's the padding here?" | get_inspector_selection — RICH STYLE per ancestor |
61
+ | "Why is this hit area so small?" / "Where exactly is each ancestor?" | inspect_at_point — FRAME PER ANCESTOR |
62
+ | "What handler is wired to this Pressable?" / "What testID does it have?" | inspect_at_point — full PROPS (including [Function] handlers) |
63
+ | "Which file owns this component?" | get_inspector_selection (source paths pre-wired; null on React 19 today) |
64
+ | "I need to call this multiple times rapidly" or "before/after a transition" | inspect_at_point — pure JS, no overlay flicker |
65
+
66
+ ### get_inspector_selection(x, y)
67
+ - Invokes RN's Element Inspector programmatically (auto toggles overlay on, captures, toggles back off — ~600ms total, brief flicker).
68
+ - Returns: element name, full owner-tree path, frame of the inspected element, merged style of the inspected element, AND a hierarchy where each entry has its own resolved style (paddingHorizontal, borderRadius, fontFamily, etc.).
69
+ - Best for visual/style debugging where you want to see exactly what RN's on-device overlay shows.
70
+
71
+ ### inspect_at_point(x, y)
72
+ - Pure fiber-tree hit test via measureInWindow. NO overlay, zero visual side effect.
73
+ - Returns: element name, path, hit-tested ancestors with FRAME PER ANCESTOR, and PROPS (handlers, refs, testID, custom props, style as a flat reference).
74
+ - Best for layout measurements, props inspection, and any rapid/repeated calls.
75
+
76
+ ### Other inspection tools
77
+ - find_components(pattern) — regex search by component name across the fiber tree.
78
+ - get_component_tree — full tree overview. Use focusedOnly=true and structureOnly=true for compact output.
79
+ - inspect_component(name) — deep dive into a specific component's props, state, and hooks.
80
+
81
+ ## Tips
82
+ - Both tools work on Paper, Fabric, and Bridgeless / new arch.
83
+ - toggle_element_inspector is rarely needed — get_inspector_selection auto-toggles the overlay around its capture and hides it afterward.
84
+ - Coordinates: get_inspector_selection accepts points/dp; inspect_at_point accepts dp (divide screenshot pixels by pixel ratio).`
85
+ },
86
+ {
87
+ id: "layout",
88
+ title: "Layout Debugging",
89
+ summary: "Capture screenshots, verify UI changes, inspect layout frames and styles",
90
+ content: `# Layout Debugging
91
+
92
+ ## Verify UI Changes
93
+ 1. ios_screenshot / android_screenshot — capture current screen
94
+ 2. Compare visually against expected result or Figma design
95
+ 3. If an issue is spotted, drill down with inspection tools
96
+
97
+ ## Inspect at a Point — Pick the Right Tool
98
+ - Style/identity ("what is this and how is it styled?") → get_inspector_selection(x, y)
99
+ - Returns RN's curated hierarchy with merged style PER ANCESTOR (padding, margin, border, layout).
100
+ - Briefly toggles the on-device overlay (auto-hidden after capture).
101
+ - Layout/props ("frames per ancestor, handler functions, refs") → inspect_at_point(x, y)
102
+ - Returns frame for each hit ancestor + full props (handlers as [Function], testID, refs).
103
+ - Pure JS hit test, no overlay flicker — preferred for rapid calls or before/after comparisons.
104
+
105
+ Most layout-debugging questions ("why is this clipped?", "what's the actual size?") fit inspect_at_point.
106
+ Most styling questions ("why does this border look wrong?") fit get_inspector_selection.
107
+
108
+ ## Full Screen Layout
109
+ - get_screen_layout — full layout data for all components
110
+ - Use componentsOnly=true to hide host components (View, Text) and see only custom components
111
+ - find_components with includeLayout=true for targeted layout info
112
+
113
+ ## Key Tools
114
+ - ios_screenshot / android_screenshot: visual capture
115
+ - tap: also returns a post-tap screenshot by default (no separate screenshot call needed after tapping)
116
+ - ocr_screenshot: screenshot with text recognition and tap coordinates
117
+ - inspect_at_point: frames per ancestor + props (no overlay, fast)
118
+ - get_inspector_selection: rich style per ancestor (briefly toggles RN inspector overlay)`
119
+ },
120
+ {
121
+ id: "interact",
122
+ title: "Device Interaction",
123
+ summary: "Tap buttons, swipe, type text, and navigate the app UI",
124
+ content: `# Device Interaction
125
+
126
+ ## Prerequisites
127
+ iOS interaction tools (tap, ios_button) require a UI driver:
128
+ - Default: AXe — brew install cameroncooke/axe/axe
129
+ - Alternative: IDB — brew install idb-companion (set IOS_DRIVER=idb in MCP server env to use it)
130
+ Without a UI driver installed, these tools will fail.
131
+
132
+ ## Tapping Elements
133
+ Use tap — it tries multiple strategies automatically and returns a post-tap screenshot:
134
+ 1. tap(testID="login-btn") — most reliable, works via fiber tree (both platforms) and accessibility (Android)
135
+ 2. tap(text="Login") — text match via fiber tree, then accessibility, then OCR
136
+ 3. tap(component="IconName") — component name match with parent traversal (for icon-only buttons; use find_components to discover names first)
137
+ 4. tap(x=..., y=...) — coordinate-based tap from screenshot (last resort)
138
+ 5. tap(x=..., y=..., native=true) — taps directly via ADB/simctl without React Native connection (for system dialogs, non-RN apps)
139
+
140
+ tap returns a screenshot after every action (screenshot=true by default) — no need to call ios_screenshot/android_screenshot after tapping.
141
+ For coordinate/accessibility/OCR taps, it also verifies if the tap caused a visual change (verify=true by default). Set screenshot=false for fastest execution.
142
+
143
+ ## Best Practice: Use testID
144
+ Set testID on all interactive elements (buttons, inputs, links) for reliable tapping:
145
+ - More stable than text matching — doesn't break with translations or UI text changes
146
+ - Exact match — no ambiguity when multiple elements share similar text
147
+ - Works across fiber (iOS + Android) and accessibility (Android via resource-id)
148
+ - Also enables TextInput focusing: tap(testID="email-input") finds inputs via fiber
149
+
150
+ ## TextInput Fields
151
+ tap detects TextInput elements (onChangeText/onFocus) in the fiber tree and falls through to native tap (accessibility or coordinates) for actual focus. This means tap(testID="email-input") works even though inputs don't have onPress.
152
+
153
+ ### Replacing pre-filled values (Bridgeless/Fabric only)
154
+ Inputs that already contain text are the most common verification-blocker. The typing tools APPEND by default — typing "https://app.example.com" into a field that already holds "https://demo.example.com" produces "https://demo.example.comhttps://app.example.com", not the intended replacement. Three dedicated tools handle this on Bridgeless/Fabric apps:
155
+
156
+ - **clear_focused_input** — empty the currently focused TextInput, with the React state owner notified via onChangeText. Use BEFORE typing into a pre-filled field. Returns "no focused TextInput" (not a silent no-op) if nothing has focus.
157
+ - **ios_input_text / android_input_text with replace:true** — one-shot: clear the focused field, then type. Equivalent to clear_focused_input + input_text but in a single call.
158
+ - **dismiss_keyboard** — blur the currently focused TextInput, closing the on-screen keyboard. Useful before tapping buttons hidden behind the keyboard, or to verify "tap outside dismisses" behavior.
159
+
160
+ All three target whatever has focus (no testID needed). They update React state via onChangeText("") — controlled components (Formik, react-hook-form, useState) stay consistent. Calling publicInstance.clear() directly does NOT do this; it only updates the native side and leaves form state stale.
161
+
162
+ Multi-device sessions: pass device="<rn-device-name>" (substring match) to disambiguate when replace:true is used. Single-device sessions can omit.
163
+
164
+ ## Icon-Only Buttons
165
+ For buttons that contain only an icon (no text):
166
+ - tap(component="CartIcon") — finds the icon and walks up the fiber tree to press the nearest pressable parent
167
+ - Use maxTraversalDepth to increase parent search depth (default: 15) for deeply wrapped components
168
+
169
+ ## Non-ASCII Text (Cyrillic, CJK, Arabic)
170
+ tap(text=...) skips fiber for non-ASCII (Hermes limitation) and uses accessibility/OCR instead. For best results, use testID or coordinates.
171
+
172
+ ## Other Interactions
173
+ - swipe: cross-platform swipe/scroll with start/end coordinates. Use for FlatList/SectionList scrolling where off-screen items aren't mounted. Returns verification.meaningful — if false the gesture had no visual effect (end-of-list, non-scrollable surface, or coordinates missed the scroll surface). Set burst:true to surface overscroll/bounce feedback even when the final state is unchanged. Set verify:false, screenshot:false for the fastest path when you only care about firing the gesture. Pass delta on iOS to control touch step size.
174
+ - android_input_text / ios_input_text: type text (tap input field first to focus). Pass replace:true to clear pre-filled values before typing (Bridgeless/Fabric only).
175
+ - clear_focused_input: clear the focused TextInput via onChangeText (controlled-state safe). Pair with input_text for replace flows, or use input_text({replace:true}) for one-shot.
176
+ - dismiss_keyboard: blur the focused input, closing the keyboard.
177
+ - ios_button / android_key_event: hardware buttons (HOME, BACK, etc.)
178
+ - ios_open_url: deep links and universal links
179
+
180
+ ## After Interactions
181
+ - Take a screenshot to verify the result`
182
+ },
183
+ {
184
+ id: "logs",
185
+ title: "Debug Logs",
186
+ summary: "Read console logs, errors, and warnings from the running app",
187
+ content: `# Debug Logs
188
+
189
+ ## Workflow
190
+ 1. get_logs with summary=true — get counts by level and last 5 messages (overview first)
191
+ 2. Based on what you see:
192
+ - get_logs with level="error" — errors only
193
+ - search_logs with text="..." — find specific messages
194
+ - get_logs with verbose=true and maxLogs=10 — full details for recent entries
195
+ 3. clear_logs — reset buffer, then re-capture after a specific action
196
+
197
+ ## Key Tools
198
+ - get_logs: retrieve logs with filtering (level, maxLogs, summary, verbose, startFromText)
199
+ - search_logs: text search across all captured logs
200
+ - clear_logs: reset the log buffer
201
+
202
+ ## Tips
203
+ - Always start with summary=true to avoid token overload
204
+ - Use verbose=true with low maxLogs for full error details
205
+ - Use startFromText to begin reading from a specific point`
206
+ },
207
+ {
208
+ id: "network",
209
+ title: "Network Inspection",
210
+ summary: "Debug API calls, check request/response data, find failed requests",
211
+ content: `# Network Inspection
212
+
213
+ ## Important: Network Capture Limitations
214
+
215
+ Network capture works differently depending on your React Native architecture:
216
+
217
+ **Without SDK (basic mode):**
218
+ - Works best on RN 0.73-0.75 (Hermes + Bridge) via CDP Network domain
219
+ - On Bridgeless targets (Expo SDK 52+, RN 0.76+), uses a JS fetch interceptor as fallback — may miss early startup requests (auth, config, initial API calls)
220
+ - Does NOT capture request/response bodies or full headers
221
+ - Some architecture combinations may not capture network data at all
222
+
223
+ **With SDK (recommended for network debugging):**
224
+ - Install: npm install execbro-sdk
225
+ - Captures ALL requests from app startup including auth flows and token refresh
226
+ - Full request/response headers and bodies (including GraphQL queries and responses)
227
+ - Works reliably on all RN architectures
228
+
229
+ If network tools return no data or you need startup requests, recommend the SDK to the user.
230
+
231
+ ## Workflow
232
+ 1. get_network_stats or get_network_requests with summary=true — overview of all requests
233
+ 2. Filter by what you need:
234
+ - get_network_requests with urlPattern, method, or status filters
235
+ - search_network with urlPattern for text search
236
+ 3. get_request_details with requestId — full headers, body, timing for a specific request
237
+ 4. clear_network — reset buffer, then re-capture
238
+
239
+ ## Key Tools
240
+ - get_network_requests: list requests with filters (urlPattern, method, status, summary)
241
+ - get_network_stats: quick stats overview
242
+ - search_network: search by URL pattern
243
+ - get_request_details: full request/response details (use verbose=true for large payloads). With SDK installed, includes full request/response bodies.
244
+ - clear_network: reset the request buffer
245
+
246
+ ## Tips
247
+ - Start with summary=true to see the request landscape
248
+ - Use get_request_details with verbose=true for full JSON payloads
249
+ - If no network data appears, the app may be on a Bridgeless target — suggest installing the SDK
250
+ - With SDK: response bodies show full GraphQL responses, useful for debugging data issues`
251
+ },
252
+ {
253
+ id: "state",
254
+ title: "App State",
255
+ summary: "Inspect Redux store, global variables, and execute JavaScript in the app",
256
+ content: `# App State
257
+
258
+ ## Workflow
259
+ 1. list_debug_globals — discover what's exposed (Redux store, navigation refs, action creators). If the SDK is installed, the response includes an \`sdk.paths\` array of ready-to-use dotted paths.
260
+ 2. inspect_global with objectName — see properties and methods before calling them. Accepts identifiers AND dotted paths (e.g. \`__RN_AI_DEVTOOLS__.stores.redux\`).
261
+ 3. execute_in_app — run JavaScript expressions in the app context
262
+
263
+ ## SDK Integration (execbro-sdk, formerly react-native-ai-devtools-sdk)
264
+ If the app called \`init({ stores, navigation, custom })\`, prefer the SDK paths over scattered globals:
265
+ - Inspect a registered store: inspect_global("__RN_AI_DEVTOOLS__.stores.redux")
266
+ - Inspect navigation ref: inspect_global("__RN_AI_DEVTOOLS__.navigation")
267
+ - Inspect a custom object (e.g. mmkv, api client): inspect_global("__RN_AI_DEVTOOLS__.custom.mmkv")
268
+ - Read state: execute_in_app("__RN_AI_DEVTOOLS__.stores.redux.getState().sliceName")
269
+
270
+ ## Common Patterns (no SDK)
271
+ - Read Redux: execute_in_app("globalThis.__REDUX_STORE__.getState().sliceName")
272
+ - Dispatch action: execute_in_app("globalThis.__dispatch__(globalThis.__REDUX_ACTIONS__.slice.action(args))")
273
+ - Navigate: execute_in_app("globalThis.__navigate__('ScreenName')")
274
+ - Current route: execute_in_app("globalThis.__getCurrentRoute__()")
275
+
276
+ ## Hermes Limitations
277
+ - NO require() or import — only pre-existing globals
278
+ - NO async/await — use simple expressions or .then() chains
279
+ - NO emoji or non-ASCII in string literals
280
+ - Use globalThis instead of global
281
+
282
+ ## Tips
283
+ - Always inspect_global before calling methods on unfamiliar objects
284
+ - Use verbose=true with caution — Redux stores can return 10KB+
285
+ - Set higher maxResultLength when default 2000 chars isn't enough`
286
+ },
287
+ {
288
+ id: "bundle",
289
+ title: "Bundle Health",
290
+ summary: "Check Metro bundler status, fix compilation errors, reload the app",
291
+ content: `# Bundle Health
292
+
293
+ ## Workflow
294
+ 1. get_bundle_status — check if Metro is running and its build state
295
+ 2. get_bundle_errors — check for compilation/bundling errors
296
+ 3. Fix errors in code
297
+ 4. clear_bundle_errors — clear the error buffer
298
+ 5. reload_app — trigger full JS bundle reload (only if needed)
299
+
300
+ ## When to Reload
301
+ React Native has Fast Refresh by default. Only reload_app when:
302
+ - Changes aren't appearing after a few seconds
303
+ - App is in a broken/error state
304
+ - Need to reset full app state (navigation, context)
305
+ - Made changes to native code or config files
306
+
307
+ ## Red Screen Errors
308
+ If no errors captured via CDP, use get_bundle_errors with platform="ios" or "android" — this triggers screenshot+OCR fallback to read errors from the device screen.
309
+
310
+ ## Key Tools
311
+ - get_bundle_status: Metro health check
312
+ - get_bundle_errors: compilation errors
313
+ - clear_bundle_errors: clear error buffer
314
+ - reload_app: full JS bundle reload
315
+ - ensure_connection: verify connection with healthCheck=true`
316
+ },
317
+ {
318
+ id: "feedback",
319
+ title: "Feedback",
320
+ summary: "Share feedback, request features, or report bugs to the development team",
321
+ content: `# Feedback
322
+
323
+ ## When to Use
324
+ When you or the user want to report something about the ExecBro tools themselves — a tool that misbehaved, was confusing, was missing, or could be improved. Scope is strictly the debugging tooling. Do NOT use this to report bugs in the user's app under test or to summarize the feature/task worked on in the session — that is not what this channel is for.
325
+
326
+ ## How It Works
327
+ 1. Call send_feedback with a type (feedback, feature_request, or bug), title, and description
328
+ 2. The tool auto-collects environment info (server version, platform, device, license)
329
+ 3. It returns a pre-filled GitHub issue URL and a formatted issue body
330
+ 4. Ask the user to open the URL and paste the body to submit
331
+
332
+ ## Parameters
333
+ - type: "feedback", "feature_request", or "bug"
334
+ - title: short summary (becomes the GitHub issue title)
335
+ - description: detailed explanation
336
+ - workflow_context (optional): what the user was trying to do
337
+
338
+ ## End-of-Session Experience Report
339
+ At the end of a session, you can self-report your experience using the tools — this is some of the most valuable feedback we get. When asked (or proactively when a session wrapped up with notable friction):
340
+ 1. Write a report covering where the ExecBro tools made you struggle and what about them could be improved — which tool, what you expected, what happened. Keep it about the tools, not the app you were debugging. Save it as a Markdown file for the user.
341
+ 2. Call send_feedback with type "feedback", a short title, and the report as the description (set workflow_context to which ExecBro tools / steps were involved). This turns the report into a pre-filled GitHub issue URL.
342
+ 3. Give the user the returned URL and ask them to open and submit it.
343
+
344
+ Saving the Markdown file alone does NOT reach the team — you must call send_feedback to generate the GitHub issue.
345
+
346
+ Suggested prompt the user can paste to trigger this:
347
+ > Write a report about your experience with the ExecBro tools specifically — which tools made the debugging work harder, what you expected vs. what happened, and what could be improved. Don't summarize the app feature we worked on; focus on the tools. Save it as a Markdown file for me, then submit it using the send_feedback tool (type "feedback") so it becomes a GitHub issue.
348
+
349
+ ## Tips
350
+ - Include workflow_context when possible — name the ExecBro tools/steps in play so the team can reproduce the tooling issue
351
+ - The user can review and edit the issue body before submitting
352
+ - No GitHub account setup or CLI tools needed — just a browser`
353
+ }
354
+ ];
355
+ /**
356
+ * Shared quick decision tree body — embedded into the MCP server-level
357
+ * `instructions` field (src/index.ts) AND into `getGuideOverview()` so agents
358
+ * see identical guidance regardless of whether their client surfaces
359
+ * `instructions`. Keep this as the single source of truth.
360
+ */
361
+ export const DECISION_TREE = [
362
+ "Primary tools: scan_metro, get_logs / search_logs, ios_screenshot / android_screenshot, tap, get_pressable_elements, get_screen_layout.",
363
+ "Platform-specific ios_* / android_* tools (ios_button, android_input_text, android_key_event, android_long_press, ios_open_url, etc.) are FALLBACKS for non-React or native-only flows — prefer the cross-platform primary tools above whenever possible.",
364
+ "",
365
+ "Call get_usage_guide(topic=...) for end-to-end workflows. Available topics:",
366
+ " setup — session setup (scan_metro, connect_metro, ensure_connection)",
367
+ " logs — console debugging (get_logs, search_logs)",
368
+ " interact — device interaction (tap, swipe, screenshots, android_input_text, clear_focused_input, dismiss_keyboard)",
369
+ " layout — on-screen layout check (get_screen_layout, get_pressable_elements)",
370
+ " inspect — component inspection (find_components, inspect_component, get_inspector_selection)",
371
+ " network — network request inspection (get_network_requests, search_network)",
372
+ " state — app state & JS execution (execute_in_app, list_debug_globals)",
373
+ " bundle — bundle / Metro error checks (get_bundle_status, get_bundle_errors)",
374
+ " feedback — share feedback, feature requests, or bug reports (send_feedback)"
375
+ ].join("\n");
376
+ export function getGuideOverview() {
377
+ const guideList = guides.map((g) => ` ${g.id} — ${g.summary}`).join("\n");
378
+ return `Quick decision tree
379
+ -------------------
380
+ ${DECISION_TREE}
381
+
382
+ Available usage guides:
383
+
384
+ ${guideList}
385
+
386
+ Call get_usage_guide with a topic parameter for the full guide.`;
387
+ }
388
+ export function getGuideByTopic(topic) {
389
+ const guide = guides.find((g) => g.id === topic.toLowerCase());
390
+ if (!guide)
391
+ return null;
392
+ return guide.content;
393
+ }
394
+ export function getAvailableTopics() {
395
+ return guides.map((g) => g.id);
396
+ }
397
+ //# sourceMappingURL=guides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guides.js","sourceRoot":"","sources":["../../src/core/guides.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Map an icon component name to a semantic guess, or null when the name
3
+ * carries no recognizable icon keyword.
4
+ *
5
+ * iconSemanticHint("SvgChevronBackward") → "possibly back button"
6
+ * iconSemanticHint("CheckboxOutline") → "possibly checkbox"
7
+ * iconSemanticHint("FloatingHeader") → null
8
+ */
9
+ export declare function iconSemanticHint(name: string | null | undefined): string | null;
10
+ /**
11
+ * Build the display label for an icon-only pressable: the most specific
12
+ * component name plus the semantic guess when one exists.
13
+ *
14
+ * iconLabel("FloatingHeader", "SvgChevronBackward") → "SvgChevronBackward — possibly back button"
15
+ * iconLabel("FloatingHeader", null) → null
16
+ */
17
+ export declare function iconLabel(component: string | null | undefined, icon: string | null | undefined): string | null;
18
+ //# sourceMappingURL=iconSemantics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iconSemantics.d.ts","sourceRoot":"","sources":["../../src/core/iconSemantics.ts"],"names":[],"mappings":"AA8EA;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAe/E;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAI9G"}
@@ -0,0 +1,114 @@
1
+ // ============================================================================
2
+ // Icon component name → semantic hint ("possibly back button")
3
+ //
4
+ // Icon-only pressables usually wrap an icon component whose NAME carries the
5
+ // semantics the visible UI doesn't (SvgChevronBackward, CloseIcon, RadioOn).
6
+ // This module maps those names to a human/agent-readable guess so labels read
7
+ // "SvgChevronBackward — possibly back button" instead of "(icon/image)".
8
+ // ============================================================================
9
+ /**
10
+ * Split a component name into lowercase words: strips Svg/Icon affixes,
11
+ * splits camelCase / kebab / snake. "SvgChevronBackward" → ["chevron","backward"].
12
+ */
13
+ function iconNameWords(name) {
14
+ return String(name)
15
+ .replace(/^(Svg|Icon|Ico)(?=[A-Z0-9])/, "")
16
+ .replace(/(Svg|Icon)$/, "")
17
+ .replace(/([a-z0-9])([A-Z])/g, "$1 $2")
18
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2")
19
+ .replace(/[^a-zA-Z0-9]+/g, " ")
20
+ .toLowerCase()
21
+ .split(/\s+/)
22
+ .filter(Boolean);
23
+ }
24
+ // Ordered rules — first match wins. Keywords are matched as whole words so
25
+ // "Feedback" does not match "back" and "Background" does not match "back".
26
+ // More specific rules (checkbox) must precede their prefixes (check).
27
+ const ICON_HINT_RULES = [
28
+ { keywords: ["checkbox"], hint: "possibly checkbox" },
29
+ { keywords: ["radio"], hint: "possibly radio button" },
30
+ { keywords: ["back", "backward", "backwards", "goback", "previous", "prev"], hint: "possibly back button" },
31
+ { keywords: ["forward", "next"], hint: "possibly forward/next button" },
32
+ { keywords: ["close", "cross", "xmark", "times", "dismiss"], hint: "possibly close button" },
33
+ { keywords: ["check", "checkmark", "tick", "done"], hint: "possibly confirm/check button" },
34
+ { keywords: ["plus", "add"], hint: "possibly add button" },
35
+ { keywords: ["minus", "subtract"], hint: "possibly remove/decrease button" },
36
+ { keywords: ["trash", "delete", "bin", "garbage"], hint: "possibly delete button" },
37
+ { keywords: ["search", "magnifier", "magnify", "magnifying"], hint: "possibly search button" },
38
+ { keywords: ["menu", "hamburger", "bars", "drawer"], hint: "possibly menu button" },
39
+ { keywords: ["settings", "gear", "cog"], hint: "possibly settings button" },
40
+ { keywords: ["heart", "favorite", "favourite"], hint: "possibly favorite button" },
41
+ { keywords: ["star", "rating"], hint: "possibly rating/favorite button" },
42
+ { keywords: ["share", "export"], hint: "possibly share button" },
43
+ { keywords: ["edit", "pencil", "pen"], hint: "possibly edit button" },
44
+ { keywords: ["camera", "photo"], hint: "possibly camera button" },
45
+ { keywords: ["bell", "notification", "notifications"], hint: "possibly notifications button" },
46
+ { keywords: ["user", "profile", "person", "avatar", "account"], hint: "possibly profile button" },
47
+ { keywords: ["home", "house"], hint: "possibly home button" },
48
+ { keywords: ["cart", "bag", "basket"], hint: "possibly cart button" },
49
+ { keywords: ["filter", "funnel"], hint: "possibly filter button" },
50
+ { keywords: ["refresh", "reload", "sync"], hint: "possibly refresh button" },
51
+ { keywords: ["logout", "signout"], hint: "possibly logout button" },
52
+ { keywords: ["send"], hint: "possibly send button" },
53
+ { keywords: ["download"], hint: "possibly download button" },
54
+ { keywords: ["upload"], hint: "possibly upload button" },
55
+ { keywords: ["copy"], hint: "possibly copy button" },
56
+ { keywords: ["qr", "scan", "barcode"], hint: "possibly scan button" },
57
+ { keywords: ["play"], hint: "possibly play button" },
58
+ { keywords: ["pause"], hint: "possibly pause button" },
59
+ { keywords: ["eye", "visibility"], hint: "possibly visibility toggle" },
60
+ { keywords: ["lock", "padlock"], hint: "possibly lock button" },
61
+ { keywords: ["calendar", "date"], hint: "possibly calendar/date button" },
62
+ { keywords: ["info", "information"], hint: "possibly info button" },
63
+ { keywords: ["question", "help", "faq"], hint: "possibly help button" },
64
+ { keywords: ["more", "dots", "ellipsis", "kebab", "meatball", "options"], hint: "possibly more-options button" },
65
+ { keywords: ["toggle", "switch"], hint: "possibly toggle" },
66
+ ];
67
+ // Direction words for composite chevron/arrow/caret matching.
68
+ const ICON_BASES = ["chevron", "arrow", "caret", "angle"];
69
+ const DIRECTION_HINTS = [
70
+ { keywords: ["left", "back", "backward", "backwards", "previous", "prev"], hint: "possibly back button" },
71
+ { keywords: ["right", "forward", "next"], hint: "possibly forward/next button" },
72
+ { keywords: ["down"], hint: "possibly expand/open button" },
73
+ { keywords: ["up"], hint: "possibly collapse button" },
74
+ ];
75
+ /**
76
+ * Map an icon component name to a semantic guess, or null when the name
77
+ * carries no recognizable icon keyword.
78
+ *
79
+ * iconSemanticHint("SvgChevronBackward") → "possibly back button"
80
+ * iconSemanticHint("CheckboxOutline") → "possibly checkbox"
81
+ * iconSemanticHint("FloatingHeader") → null
82
+ */
83
+ export function iconSemanticHint(name) {
84
+ if (!name)
85
+ return null;
86
+ const words = iconNameWords(name);
87
+ if (words.length === 0)
88
+ return null;
89
+ const has = (keywords) => keywords.some((k) => words.includes(k));
90
+ if (has(ICON_BASES)) {
91
+ for (const rule of DIRECTION_HINTS) {
92
+ if (has(rule.keywords))
93
+ return rule.hint;
94
+ }
95
+ }
96
+ for (const rule of ICON_HINT_RULES) {
97
+ if (has(rule.keywords))
98
+ return rule.hint;
99
+ }
100
+ return null;
101
+ }
102
+ /**
103
+ * Build the display label for an icon-only pressable: the most specific
104
+ * component name plus the semantic guess when one exists.
105
+ *
106
+ * iconLabel("FloatingHeader", "SvgChevronBackward") → "SvgChevronBackward — possibly back button"
107
+ * iconLabel("FloatingHeader", null) → null
108
+ */
109
+ export function iconLabel(component, icon) {
110
+ const source = icon || component;
111
+ const hint = iconSemanticHint(source);
112
+ return hint ? `${source} — ${hint}` : null;
113
+ }
114
+ //# sourceMappingURL=iconSemantics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iconSemantics.js","sourceRoot":"","sources":["../../src/core/iconSemantics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export interface ImageEntry {
2
+ id: string;
3
+ image: Buffer;
4
+ timestamp: number;
5
+ source: string;
6
+ groupId?: string;
7
+ metadata?: Record<string, any>;
8
+ }
9
+ export interface ImageGroup {
10
+ groupId: string;
11
+ intent: string;
12
+ source: string;
13
+ timestamp: number;
14
+ frameCount: number;
15
+ summary: Record<string, any>;
16
+ }
17
+ export type ImageEntryMeta = Omit<ImageEntry, "image">;
18
+ export declare class ImageBuffer {
19
+ private entries;
20
+ private groups;
21
+ private maxSize;
22
+ constructor(maxSize?: number);
23
+ add(entry: ImageEntry): void;
24
+ addGroup(group: ImageGroup): void;
25
+ getById(id: string): ImageEntry | undefined;
26
+ getByGroupFrame(groupId: string, frameIndex: number): ImageEntry | undefined;
27
+ listEntries(options?: {
28
+ source?: string;
29
+ groupId?: string;
30
+ last?: number;
31
+ }): ImageEntryMeta[];
32
+ listGroups(): ImageGroup[];
33
+ clear(): number;
34
+ get size(): number;
35
+ private cleanupGroupIfEmpty;
36
+ }
37
+ //# sourceMappingURL=imageBuffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageBuffer.d.ts","sourceRoot":"","sources":["../../src/core/imageBuffer.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAEvD,qBAAa,WAAW;IACpB,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,MAAM,CAAsC;IACpD,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAW;IAIhC,GAAG,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAU5B,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAIjC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI3C,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAM5E,WAAW,CAAC,OAAO,GAAE;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;KACZ,GAAG,cAAc,EAAE;IAkBzB,UAAU,IAAI,UAAU,EAAE;IAI1B,KAAK,IAAI,MAAM;IAOf,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,OAAO,CAAC,mBAAmB;CAM9B"}
@@ -0,0 +1,58 @@
1
+ export class ImageBuffer {
2
+ entries = [];
3
+ groups = new Map();
4
+ maxSize;
5
+ constructor(maxSize = 50) {
6
+ this.maxSize = maxSize;
7
+ }
8
+ add(entry) {
9
+ this.entries.push(entry);
10
+ while (this.entries.length > this.maxSize) {
11
+ const evicted = this.entries.shift();
12
+ if (evicted?.groupId) {
13
+ this.cleanupGroupIfEmpty(evicted.groupId);
14
+ }
15
+ }
16
+ }
17
+ addGroup(group) {
18
+ this.groups.set(group.groupId, group);
19
+ }
20
+ getById(id) {
21
+ return this.entries.find((e) => e.id === id);
22
+ }
23
+ getByGroupFrame(groupId, frameIndex) {
24
+ return this.entries.find((e) => e.groupId === groupId && e.metadata?.frameIndex === frameIndex);
25
+ }
26
+ listEntries(options = {}) {
27
+ let filtered = this.entries;
28
+ if (options.source) {
29
+ filtered = filtered.filter((e) => e.source === options.source);
30
+ }
31
+ if (options.groupId) {
32
+ filtered = filtered.filter((e) => e.groupId === options.groupId);
33
+ }
34
+ if (options.last && options.last > 0) {
35
+ filtered = filtered.slice(-options.last);
36
+ }
37
+ return filtered.map(({ image, ...meta }) => meta);
38
+ }
39
+ listGroups() {
40
+ return Array.from(this.groups.values());
41
+ }
42
+ clear() {
43
+ const count = this.entries.length;
44
+ this.entries = [];
45
+ this.groups.clear();
46
+ return count;
47
+ }
48
+ get size() {
49
+ return this.entries.length;
50
+ }
51
+ cleanupGroupIfEmpty(groupId) {
52
+ const hasEntries = this.entries.some((e) => e.groupId === groupId);
53
+ if (!hasEntries) {
54
+ this.groups.delete(groupId);
55
+ }
56
+ }
57
+ }
58
+ //# sourceMappingURL=imageBuffer.js.map