mobile-debug-mcp 0.34.0 → 0.35.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 (432) hide show
  1. package/.agents/skills/mcp-builder/SKILL.md +44 -64
  2. package/.agents/skills/mcp-builder/references/build-flags.md +44 -43
  3. package/.agents/skills/mcp-builder/references/diagnostics-schema.md +4 -1
  4. package/.agents/skills/mcp-builder/references/toolchain-details.md +49 -62
  5. package/.agents/skills/spec-review/references/spec-review-checklist.md +7 -0
  6. package/.agents/skills/test-authoring/SKILL.md +7 -6
  7. package/.agents/skills/test-authoring/references/repo-test-layout.md +3 -1
  8. package/.agents/skills/test-authoring/references/test-authoring-workflow.md +16 -7
  9. package/.agents/skills/test-authoring/references/test-quality-checklist.md +2 -1
  10. package/.github/copilot-instructions.md +14 -36
  11. package/.github/workflows/ci.yml +4 -4
  12. package/AGENTS.md +12 -3
  13. package/CONTRIBUTING.md +79 -0
  14. package/README.md +156 -129
  15. package/agent-plugin/.claude-plugin/plugin.json +2 -2
  16. package/agent-plugin/.codex-plugin/plugin.json +1 -1
  17. package/agent-plugin/.cursor-plugin/plugin.json +2 -2
  18. package/agent-plugin/.mcp.json +1 -1
  19. package/agent-plugin/README.md +16 -6
  20. package/agent-plugin/mcp.json +1 -1
  21. package/agent-plugin/plugin.json +1 -1
  22. package/agent-plugin/skills/mobile-debug-mcp/SKILL.md +27 -2
  23. package/dist/contracts/execution-controls.js +24 -0
  24. package/dist/contracts/selector.js +8 -0
  25. package/dist/contracts/target.js +15 -0
  26. package/dist/contracts/ui.js +1 -0
  27. package/dist/debugger/android.js +2 -1
  28. package/dist/debugger/diagnostics.js +54 -0
  29. package/dist/debugger/protocol.js +33 -0
  30. package/dist/debugger/sessions.js +104 -62
  31. package/dist/debugger/worker.js +53 -42
  32. package/dist/interact/adjustment/adjustment-context.js +41 -0
  33. package/dist/interact/adjustment/adjustment-gestures.js +55 -0
  34. package/dist/interact/adjustment/adjustment-plan.js +18 -0
  35. package/dist/interact/adjustment/adjustment-resolution.js +127 -0
  36. package/dist/interact/adjustment/adjustment-result.js +19 -0
  37. package/dist/interact/adjustment/adjustment-semantic.js +64 -0
  38. package/dist/interact/adjustment/adjustment-verification.js +35 -0
  39. package/dist/interact/adjustment/adjustment.js +52 -0
  40. package/dist/interact/adjustment/control-geometry.js +87 -0
  41. package/dist/interact/adjustment/control-values.js +136 -0
  42. package/dist/interact/adjustment/slider-labels.js +84 -0
  43. package/dist/interact/assertions/screen-assertion.js +37 -0
  44. package/dist/interact/assertions/state-assertion-context.js +35 -0
  45. package/dist/interact/assertions/state-assertion.js +76 -0
  46. package/dist/interact/assertions/state-comparison.js +141 -0
  47. package/dist/interact/assertions/visibility-assertion.js +34 -0
  48. package/dist/interact/conditional-action.js +12 -7
  49. package/dist/interact/index.js +65 -3090
  50. package/dist/interact/input-service.js +1 -0
  51. package/dist/interact/interaction-trace.js +21 -0
  52. package/dist/interact/model.js +1 -0
  53. package/dist/interact/observation.js +1 -0
  54. package/dist/interact/targeting/candidate-ancestor.js +58 -0
  55. package/dist/interact/targeting/candidate-result.js +23 -0
  56. package/dist/interact/targeting/candidate-scoring.js +50 -0
  57. package/dist/interact/targeting/element-helpers.js +216 -0
  58. package/dist/interact/targeting/find-element.js +65 -0
  59. package/dist/interact/targeting/nearby-control.js +56 -0
  60. package/dist/interact/targeting/resolved-elements.js +21 -0
  61. package/dist/interact/targeting/tap-target.js +17 -0
  62. package/dist/interact/targeting/target-scope.js +104 -0
  63. package/dist/interact/waits/legacy-log-wait.js +38 -0
  64. package/dist/interact/waits/legacy-wait-observations.js +103 -0
  65. package/dist/interact/waits/legacy-wait-state.js +34 -0
  66. package/dist/interact/waits/legacy-wait.js +48 -0
  67. package/dist/interact/waits/screen-wait.js +49 -0
  68. package/dist/interact/waits/ui-change-helpers.js +157 -0
  69. package/dist/interact/waits/ui-change-state.js +18 -0
  70. package/dist/interact/waits/ui-change-wait.js +77 -0
  71. package/dist/interact/waits/ui-wait-condition.js +56 -0
  72. package/dist/interact/waits/ui-wait-state.js +38 -0
  73. package/dist/interact/waits/ui-wait.js +106 -0
  74. package/dist/manage/android.js +55 -51
  75. package/dist/manage/index.js +38 -75
  76. package/dist/manage/ios/build-types.js +1 -0
  77. package/dist/manage/ios/build.js +210 -0
  78. package/dist/manage/ios/project-discovery.js +29 -0
  79. package/dist/manage/ios/scheme.js +18 -0
  80. package/dist/manage/ios.js +42 -256
  81. package/dist/observe/android/context.js +1 -0
  82. package/dist/observe/android/current-screen.js +55 -0
  83. package/dist/observe/android/fingerprint.js +13 -0
  84. package/dist/observe/android/log-stream.js +132 -0
  85. package/dist/observe/android/logs.js +107 -0
  86. package/dist/observe/android/screenshot.js +70 -0
  87. package/dist/observe/android/ui-tree.js +107 -0
  88. package/dist/observe/android.js +16 -520
  89. package/dist/observe/evidence.js +114 -75
  90. package/dist/observe/index.js +16 -263
  91. package/dist/observe/ios/context.js +16 -0
  92. package/dist/observe/ios/fingerprint.js +12 -0
  93. package/dist/observe/ios/log-stream.js +105 -0
  94. package/dist/observe/ios/logs.js +168 -0
  95. package/dist/observe/ios/screenshot.js +22 -0
  96. package/dist/observe/ios/ui-elements.js +241 -0
  97. package/dist/observe/ios/ui-tree.js +137 -0
  98. package/dist/observe/ios.js +17 -715
  99. package/dist/observe/logs/model.js +1 -0
  100. package/dist/{network → observe/network}/index.js +2 -2
  101. package/dist/observe/readiness-service.js +4 -2
  102. package/dist/observe/readiness.js +29 -10
  103. package/dist/observe/screenshot-encoding.js +41 -0
  104. package/dist/observe/snapshot-collection.js +79 -0
  105. package/dist/observe/snapshot-logs.js +30 -0
  106. package/dist/observe/snapshot-metadata.js +43 -31
  107. package/dist/observe/snapshot-semantic.js +115 -0
  108. package/dist/observe/system-trace.js +22 -13
  109. package/dist/runtime/action-results.js +270 -0
  110. package/dist/runtime/clock.js +4 -0
  111. package/dist/server/common.js +1 -256
  112. package/dist/server/definitions/assert.js +162 -0
  113. package/dist/server/definitions/diagnostic.js +118 -0
  114. package/dist/server/definitions/input.js +274 -0
  115. package/dist/server/definitions/manage.js +194 -0
  116. package/dist/server/definitions/observe.js +149 -0
  117. package/dist/server/definitions/target.js +138 -0
  118. package/dist/server/definitions/wait.js +105 -0
  119. package/dist/server/handlers/action-execution.js +163 -0
  120. package/dist/server/handlers/correlation.js +23 -0
  121. package/dist/server/{debugger-handlers.js → handlers/debugger-handlers.js} +22 -12
  122. package/dist/server/handlers/debugger-response.js +9 -0
  123. package/dist/server/handlers/diagnostic.js +69 -0
  124. package/dist/server/handlers/handler-types.js +1 -0
  125. package/dist/server/handlers/input.js +154 -0
  126. package/dist/server/handlers/interact.js +113 -0
  127. package/dist/server/handlers/journey-assertions.js +35 -0
  128. package/dist/server/handlers/journey.js +147 -0
  129. package/dist/server/handlers/manage.js +119 -0
  130. package/dist/server/handlers/observe.js +95 -0
  131. package/dist/server/handlers/payload.js +4 -0
  132. package/dist/server/handlers/tool-handlers.js +160 -0
  133. package/dist/server/schemas/condition-schema.js +2 -0
  134. package/dist/server/{debugger-schema.js → schemas/debugger-schema.js} +11 -6
  135. package/dist/server/{journey-schema.js → schemas/journey-schema.js} +7 -22
  136. package/dist/server/tool-definitions.js +58 -1135
  137. package/dist/server-core.js +2 -2
  138. package/dist/system/android-status.js +101 -0
  139. package/dist/system/android.js +37 -27
  140. package/dist/system/index.js +13 -439
  141. package/dist/system/ios-status.js +132 -0
  142. package/dist/system/ios.js +11 -8
  143. package/dist/system/model.js +1 -0
  144. package/dist/system/probes.js +105 -0
  145. package/dist/system/status-summary.js +43 -0
  146. package/dist/system/unsupported-status.js +52 -0
  147. package/dist/utils/android/commands.js +89 -0
  148. package/dist/utils/android/gradle.js +139 -0
  149. package/dist/utils/android/logs.js +103 -0
  150. package/dist/utils/android/ui-tree.js +233 -0
  151. package/dist/utils/android/utils.js +6 -564
  152. package/dist/utils/cli/idb/idb-helper.js +4 -6
  153. package/dist/utils/cli/idb/install-idb.js +13 -9
  154. package/dist/utils/cli/ios/preflight-ios.js +42 -38
  155. package/dist/utils/ios/utils.js +45 -46
  156. package/dist/utils/java.js +65 -49
  157. package/dist/utils/resolve-device.js +4 -2
  158. package/dist/utils/ui/index.js +26 -26
  159. package/docs/CHANGELOG.md +44 -0
  160. package/docs/README.md +38 -0
  161. package/docs/benchmarks/README.md +18 -0
  162. package/docs/benchmarks/interaction-latency/README.md +14 -0
  163. package/docs/benchmarks/interaction-latency/final.md +4 -1
  164. package/docs/benchmarks/interaction-latency/ios-validation.md +2 -0
  165. package/docs/benchmarks/ui-tree-performance/README.md +24 -16
  166. package/docs/benchmarks/ui-tree-performance/comparison.md +11 -10
  167. package/docs/code-structure.md +118 -0
  168. package/docs/specs/001-state-verification/spec.md +16 -14
  169. package/docs/specs/002-richer-element-identity/spec.md +12 -10
  170. package/docs/specs/003-wait-and-synchronization-reliability/spec.md +12 -10
  171. package/docs/specs/004-action-verification-routing/spec.md +3 -3
  172. package/docs/specs/005-unified-action-execution-and-verification-model/spec.md +2 -0
  173. package/docs/specs/006-runtime-action-instrumentation-and-binding-layer/spec.md +2 -0
  174. package/docs/specs/007-actionability-resolution-and-executable-target-selection/spec.md +3 -1
  175. package/docs/specs/008-adjustable-control-support-and-semantic-value-manipulation/spec.md +3 -4
  176. package/docs/specs/009-semantic-control-modeling-for-custom-and-composite-controls/spec.md +2 -0
  177. package/docs/specs/010-verification-stabilization-and-temporal-convergence/spec.md +2 -2
  178. package/docs/specs/011-recovery-and-replanning-for-failed-or-ambiguous-interaction-flows/spec.md +2 -2
  179. package/docs/specs/011.1-recovery-contract-types-and-runtime-wiring-spec/spec.md +2 -0
  180. package/docs/specs/012-action-trace-and-xecution-observability/spec.md +2 -3
  181. package/docs/specs/013-wait-and-synchronization-reliability/spec.md +19 -19
  182. package/docs/specs/014-actionability-resolution/spec.md +20 -18
  183. package/docs/specs/015-adjustable-control-support/spec.md +17 -15
  184. package/docs/specs/016-environment-tools/spec.md +20 -20
  185. package/docs/specs/018-interaction-latency-and-batched-journeys/spec.md +2 -0
  186. package/docs/specs/019-ui-tree-observation-performance/spec.md +3 -1
  187. package/docs/specs/020-conditional-actions/intent.md +5 -3
  188. package/docs/specs/020-conditional-actions/plan.md +8 -9
  189. package/docs/specs/020-conditional-actions/spec.md +4 -2
  190. package/docs/specs/021-app-readiness-signals/intent.md +4 -2
  191. package/docs/specs/021-app-readiness-signals/plan.md +7 -6
  192. package/docs/specs/021-app-readiness-signals/spec.md +3 -1
  193. package/docs/specs/022-correlated-evidence/intent.md +4 -4
  194. package/docs/specs/022-correlated-evidence/plan.md +10 -11
  195. package/docs/specs/022-correlated-evidence/spec.md +3 -1
  196. package/docs/specs/023-android-system-traces/intent.md +3 -2
  197. package/docs/specs/023-android-system-traces/plan.md +5 -7
  198. package/docs/specs/023-android-system-traces/spec.md +3 -1
  199. package/docs/specs/024-android-heap-dump-capture/intent.md +3 -1
  200. package/docs/specs/025-android-runtime-debugger/intent.md +4 -3
  201. package/docs/specs/025-android-runtime-debugger/plan.md +3 -1
  202. package/docs/specs/025-android-runtime-debugger/spec.md +4 -3
  203. package/docs/specs/026-code-structure-and-quality-gates/health-plan.md +88 -0
  204. package/docs/specs/026-code-structure-and-quality-gates/intent.md +47 -0
  205. package/docs/specs/026-code-structure-and-quality-gates/plan.md +191 -0
  206. package/docs/specs/026-code-structure-and-quality-gates/spec.md +138 -0
  207. package/docs/specs/026-code-structure-and-quality-gates/verification-final.json +200 -0
  208. package/docs/specs/026-code-structure-and-quality-gates/verification-thin-facade.json +154 -0
  209. package/docs/specs/026-code-structure-and-quality-gates/verification.json +136 -0
  210. package/docs/specs/027-debugger-failure-diagnostics/intent.md +43 -0
  211. package/docs/specs/027-debugger-failure-diagnostics/plan.md +86 -0
  212. package/docs/specs/027-debugger-failure-diagnostics/spec.md +133 -0
  213. package/docs/specs/028-compact-debugger-responses/intent.md +41 -0
  214. package/docs/specs/028-compact-debugger-responses/plan.md +112 -0
  215. package/docs/specs/028-compact-debugger-responses/spec.md +108 -0
  216. package/docs/specs/029-kotlin-locals-validation/report.md +119 -0
  217. package/docs/specs/030-android-coroutine-validation/evidence.json +475 -0
  218. package/docs/specs/030-android-coroutine-validation/intent.md +47 -0
  219. package/docs/specs/030-android-coroutine-validation/plan.md +147 -0
  220. package/docs/specs/030-android-coroutine-validation/report.md +240 -0
  221. package/docs/specs/030-android-coroutine-validation/spec.md +107 -0
  222. package/docs/tools/TOOLS.md +31 -18
  223. package/docs/tools/{evidence.md → correlated-evidence.md} +9 -1
  224. package/docs/tools/debugger.md +76 -0
  225. package/docs/tools/interact.md +42 -20
  226. package/docs/tools/manage.md +25 -44
  227. package/docs/tools/observe.md +55 -23
  228. package/docs/tools/system-traces.md +9 -1
  229. package/docs/tools/system.md +12 -5
  230. package/package.json +11 -8
  231. package/scripts/architecture-graph.mjs +69 -0
  232. package/scripts/check-architecture.mjs +47 -0
  233. package/scripts/code-quality-baseline.json +1 -0
  234. package/scripts/code-quality.mjs +161 -0
  235. package/src/contracts/execution-controls.ts +26 -0
  236. package/src/contracts/selector.ts +17 -0
  237. package/src/contracts/target.ts +19 -0
  238. package/src/contracts/ui.ts +94 -0
  239. package/src/debugger/android.ts +2 -1
  240. package/src/debugger/diagnostics.ts +43 -0
  241. package/src/debugger/guard.ts +6 -1
  242. package/{worker → src/debugger/java}/DebuggerWorker.java +9 -3
  243. package/src/debugger/protocol.ts +37 -0
  244. package/src/debugger/sessions.ts +314 -155
  245. package/src/debugger/worker.ts +51 -38
  246. package/src/interact/adjustment/adjustment-context.ts +83 -0
  247. package/src/interact/adjustment/adjustment-gestures.ts +48 -0
  248. package/src/interact/adjustment/adjustment-plan.ts +23 -0
  249. package/src/interact/adjustment/adjustment-resolution.ts +104 -0
  250. package/src/interact/adjustment/adjustment-result.ts +34 -0
  251. package/src/interact/adjustment/adjustment-semantic.ts +53 -0
  252. package/src/interact/adjustment/adjustment-verification.ts +60 -0
  253. package/src/interact/adjustment/adjustment.ts +49 -0
  254. package/src/interact/adjustment/control-geometry.ts +120 -0
  255. package/src/interact/adjustment/control-values.ts +141 -0
  256. package/src/interact/adjustment/slider-labels.ts +84 -0
  257. package/src/interact/assertions/screen-assertion.ts +39 -0
  258. package/src/interact/assertions/state-assertion-context.ts +48 -0
  259. package/src/interact/assertions/state-assertion.ts +64 -0
  260. package/src/interact/assertions/state-comparison.ts +168 -0
  261. package/src/interact/assertions/visibility-assertion.ts +41 -0
  262. package/src/interact/conditional-action.ts +18 -12
  263. package/src/interact/index.ts +76 -3492
  264. package/src/interact/input-service.ts +11 -0
  265. package/src/interact/interaction-trace.ts +36 -0
  266. package/src/interact/model.ts +109 -0
  267. package/src/interact/observation.ts +7 -0
  268. package/src/interact/targeting/candidate-ancestor.ts +49 -0
  269. package/src/interact/targeting/candidate-result.ts +24 -0
  270. package/src/interact/targeting/candidate-scoring.ts +42 -0
  271. package/src/interact/targeting/element-helpers.ts +243 -0
  272. package/src/interact/targeting/find-element.ts +47 -0
  273. package/src/interact/targeting/nearby-control.ts +46 -0
  274. package/src/interact/targeting/resolved-elements.ts +20 -0
  275. package/src/interact/targeting/tap-target.ts +22 -0
  276. package/src/interact/targeting/target-scope.ts +121 -0
  277. package/src/interact/waits/legacy-log-wait.ts +30 -0
  278. package/src/interact/waits/legacy-wait-observations.ts +55 -0
  279. package/src/interact/waits/legacy-wait-state.ts +48 -0
  280. package/src/interact/waits/legacy-wait.ts +34 -0
  281. package/src/interact/waits/screen-wait.ts +37 -0
  282. package/src/interact/waits/ui-change-helpers.ts +184 -0
  283. package/src/interact/waits/ui-change-state.ts +26 -0
  284. package/src/interact/waits/ui-change-wait.ts +59 -0
  285. package/src/interact/waits/ui-wait-condition.ts +52 -0
  286. package/src/interact/waits/ui-wait-state.ts +55 -0
  287. package/src/interact/waits/ui-wait.ts +84 -0
  288. package/src/manage/android.ts +56 -50
  289. package/src/manage/index.ts +63 -93
  290. package/src/manage/ios/build-types.ts +14 -0
  291. package/src/manage/ios/build.ts +230 -0
  292. package/src/manage/ios/project-discovery.ts +26 -0
  293. package/src/manage/ios/scheme.ts +16 -0
  294. package/src/manage/ios.ts +65 -298
  295. package/src/observe/android/context.ts +1 -0
  296. package/src/observe/android/current-screen.ts +63 -0
  297. package/src/observe/android/fingerprint.ts +13 -0
  298. package/src/observe/android/log-stream.ts +127 -0
  299. package/src/observe/android/logs.ts +110 -0
  300. package/src/observe/android/screenshot.ts +79 -0
  301. package/src/observe/android/ui-tree.ts +113 -0
  302. package/src/observe/android.ts +17 -531
  303. package/src/observe/evidence.ts +122 -70
  304. package/src/observe/index.ts +24 -286
  305. package/src/observe/ios/context.ts +22 -0
  306. package/src/observe/ios/fingerprint.ts +12 -0
  307. package/src/observe/ios/log-stream.ts +103 -0
  308. package/src/observe/ios/logs.ts +179 -0
  309. package/src/observe/ios/screenshot.ts +26 -0
  310. package/src/observe/ios/ui-elements.ts +266 -0
  311. package/src/observe/ios/ui-tree.ts +143 -0
  312. package/src/observe/ios.ts +18 -749
  313. package/src/observe/logs/model.ts +11 -0
  314. package/src/{network → observe/network}/index.ts +2 -2
  315. package/src/observe/readiness-service.ts +5 -3
  316. package/src/observe/readiness.ts +39 -18
  317. package/src/observe/screenshot-encoding.ts +32 -0
  318. package/src/observe/snapshot-collection.ts +69 -0
  319. package/src/observe/snapshot-logs.ts +26 -0
  320. package/src/observe/snapshot-metadata.ts +51 -31
  321. package/src/observe/snapshot-semantic.ts +153 -0
  322. package/src/observe/system-trace.ts +24 -15
  323. package/src/runtime/action-results.ts +376 -0
  324. package/src/runtime/clock.ts +9 -0
  325. package/src/server/common.ts +9 -359
  326. package/src/server/definitions/assert.ts +164 -0
  327. package/src/server/definitions/diagnostic.ts +120 -0
  328. package/src/server/definitions/input.ts +276 -0
  329. package/src/server/definitions/manage.ts +196 -0
  330. package/src/server/definitions/observe.ts +151 -0
  331. package/src/server/definitions/target.ts +140 -0
  332. package/src/server/definitions/wait.ts +107 -0
  333. package/src/server/handlers/action-execution.ts +164 -0
  334. package/src/server/handlers/correlation.ts +20 -0
  335. package/src/server/handlers/debugger-handlers.ts +39 -0
  336. package/src/server/handlers/debugger-response.ts +7 -0
  337. package/src/server/handlers/diagnostic.ts +79 -0
  338. package/src/server/handlers/handler-types.ts +7 -0
  339. package/src/server/handlers/input.ts +173 -0
  340. package/src/server/handlers/interact.ts +135 -0
  341. package/src/server/handlers/journey-assertions.ts +39 -0
  342. package/src/server/handlers/journey.ts +132 -0
  343. package/src/server/handlers/manage.ts +141 -0
  344. package/src/server/handlers/observe.ts +116 -0
  345. package/src/server/handlers/payload.ts +36 -0
  346. package/src/server/handlers/tool-handlers.ts +159 -0
  347. package/src/server/schemas/condition-schema.ts +2 -0
  348. package/src/server/{debugger-schema.ts → schemas/debugger-schema.ts} +13 -7
  349. package/src/server/{journey-schema.ts → schemas/journey-schema.ts} +7 -22
  350. package/src/server/{system-trace-schema.ts → schemas/system-trace-schema.ts} +3 -3
  351. package/src/server/tool-definitions.ts +67 -1143
  352. package/src/server-core.ts +2 -2
  353. package/src/server.ts +1 -1
  354. package/src/system/android-status.ts +124 -0
  355. package/src/system/android.ts +33 -21
  356. package/src/system/index.ts +21 -525
  357. package/src/system/ios-status.ts +147 -0
  358. package/src/system/ios.ts +14 -10
  359. package/src/system/model.ts +41 -0
  360. package/src/system/probes.ts +114 -0
  361. package/src/system/status-summary.ts +47 -0
  362. package/src/system/unsupported-status.ts +55 -0
  363. package/src/types.ts +16 -106
  364. package/src/utils/android/commands.ts +81 -0
  365. package/src/utils/android/gradle.ts +132 -0
  366. package/src/utils/android/logs.ts +103 -0
  367. package/src/utils/android/ui-tree.ts +239 -0
  368. package/src/utils/android/utils.ts +16 -556
  369. package/src/utils/cli/idb/check-idb.ts +4 -4
  370. package/src/utils/cli/idb/idb-helper.ts +6 -8
  371. package/src/utils/cli/idb/install-idb.ts +15 -9
  372. package/src/utils/cli/ios/preflight-ios.ts +39 -31
  373. package/src/utils/cli/ios/run-ios-ui-tree-tap.ts +4 -4
  374. package/src/utils/ios/utils.ts +57 -61
  375. package/src/utils/java.ts +62 -43
  376. package/src/utils/resolve-device.ts +9 -6
  377. package/src/utils/ui/index.ts +28 -28
  378. package/test/device/automated/debugger/coroutine-lifecycle.ts +27 -0
  379. package/test/device/automated/debugger/coroutine-support.ts +140 -0
  380. package/test/device/automated/debugger/coroutine.android.test.ts +169 -0
  381. package/test/device/automated/debugger/kotlin.android.test.ts +127 -0
  382. package/test/device/automated/debugger/runtime.android.test.ts +19 -3
  383. package/test/device/automated/interact/interaction.android.test.ts +56 -0
  384. package/test/device/automated/observe/system-trace.smoke.ts +1 -1
  385. package/test/device/manual/interact/modul8_selector_tap.manual.ts +1 -1
  386. package/test/fixtures/contracts/tool-definitions.json +3536 -0
  387. package/test/fixtures/coroutine-app/MainActivity.kt +100 -0
  388. package/test/fixtures/coroutine-app/README.md +48 -0
  389. package/test/fixtures/coroutine-app/build.ts +35 -0
  390. package/test/fixtures/debugger-app/MainActivity.java +21 -0
  391. package/test/fixtures/debugger-app/MainActivity.kt +32 -0
  392. package/test/fixtures/debugger-app/README.md +52 -0
  393. package/test/fixtures/debugger-app/build.ts +25 -15
  394. package/test/fixtures/latency-journey-app/README.md +2 -0
  395. package/test/fixtures/readiness-app/README.md +2 -0
  396. package/test/unit/debugger/coroutine-lifecycle.test.ts +43 -0
  397. package/test/unit/debugger/diagnostic-sessions.test.ts +67 -0
  398. package/test/unit/debugger/diagnostics.test.ts +80 -0
  399. package/test/unit/debugger/guards.test.ts +4 -0
  400. package/test/unit/debugger/preparation.test.ts +32 -0
  401. package/test/unit/debugger/protocol.test.ts +15 -0
  402. package/test/unit/debugger/sessions.test.ts +1 -1
  403. package/test/unit/interact/adjustment_service.test.ts +42 -0
  404. package/test/unit/interact/adjustment_verification.test.ts +35 -0
  405. package/test/unit/interact/clock_dependencies.test.ts +63 -0
  406. package/test/unit/interact/element_helpers.test.ts +19 -0
  407. package/test/unit/interact/legacy_wait_service.test.ts +17 -0
  408. package/test/unit/interact/state_comparison.test.ts +20 -0
  409. package/test/unit/interact/target_scope.test.ts +35 -0
  410. package/test/unit/network/get_network_activity.test.ts +1 -1
  411. package/test/unit/observe/screenshot-encoding.test.ts +30 -0
  412. package/test/unit/observe/snapshot-logs.test.ts +14 -0
  413. package/test/unit/quality/architecture.test.ts +60 -0
  414. package/test/unit/quality/code-quality.test.ts +58 -0
  415. package/test/unit/quality/interaction_boundaries.test.ts +24 -0
  416. package/test/unit/server/conditional_actions.test.ts +1 -1
  417. package/test/unit/server/conditional_schema.test.ts +2 -2
  418. package/test/unit/server/debugger-response.test.ts +63 -0
  419. package/test/unit/server/tool_definitions_parity.test.ts +8 -0
  420. package/dist/server/tool-handlers.js +0 -1000
  421. package/docs/ROADMAP.md +0 -646
  422. package/docs/benchmarks/ui-tree-performance/bridge-probe.json +0 -29
  423. package/docs/benchmarks/ui-tree-performance/initial-baseline.json +0 -59560
  424. package/docs/specs/baseline-spec-v0.md +0 -312
  425. package/docs/specs/mcp-tooling-spec-v1.md +0 -446
  426. package/src/server/debugger-handlers.ts +0 -29
  427. package/src/server/tool-handlers.ts +0 -1008
  428. /package/dist/{server/condition-schema.js → contracts/condition.js} +0 -0
  429. /package/dist/server/{readiness-schema.js → schemas/readiness-schema.js} +0 -0
  430. /package/dist/server/{system-trace-schema.js → schemas/system-trace-schema.js} +0 -0
  431. /package/src/{server/condition-schema.ts → contracts/condition.ts} +0 -0
  432. /package/src/server/{readiness-schema.ts → schemas/readiness-schema.ts} +0 -0
@@ -1,67 +1,47 @@
1
1
  # MCP Builder skill
2
2
 
3
3
  name: mcp-builder
4
- version: 0.1.0
5
- summary: Reusable procedures for building, validating and installing Android/iOS apps in this repo. Designed for agents to act autonomously with project-specific guidance.
6
-
7
- # Purpose
8
- Provide concise, actionable procedures and schemas that encode the successful sequences used in mobile-debug-mcp: toolchain detection, build orchestration, install fallbacks, diagnostics collection, and verification (lint/tests). Keep core guidance short; link to references for details.
9
-
10
- # Activation conditions
11
- Activate when an agent needs to:
12
- - build or install an app from this repository
13
- - diagnose failing CI/dev machine builds
14
- - run lint/tests and collect reproducible diagnostics
15
-
16
- # Surface area (actions)
17
- - detect-toolchain
18
- - build-android
19
- - install-android
20
- - build-ios
21
- - install-ios
22
- - run-lint
23
- - run-tests
24
- - collect-diagnostics
25
-
26
- # Core guidance (what agent must do)
27
- 1. Prefer project conventions and existing helpers in src/utils and src/manage.
28
- 2. Use detect-toolchain to decide JAVA_HOME/JBR preference and whether adb/idb/xcrun are available.
29
- 3. For Android builds, call prepareGradle() to prepare child PATH and env, then run ./gradlew (wrapper) if present.
30
- 4. For installs, parse adb output defensively (ignore streamed-install noise) and on failure fall back to push+pm path.
31
- 5. For iOS installs, prefer simctl for simulators; if simctl fails check idb and attempt idb install with diagnostics.
32
- 6. On any error, call collect-diagnostics and attach env snapshot, invoked commands, stdout/stderr, and suggested fixes.
33
-
34
- # Inputs & outputs (short schemas)
35
- - detect-toolchain(input: { platform: 'android'|'ios'|'both', preferJBR?: boolean }) -> { tools: [{name, cmd, ok, version, suggestion}] }
36
- - build-android(input: { projectPath, variant?, clean?, envOverrides? }) -> { success, artifactPath?, logs?, diagnostics? }
37
- - install-android(input: { appPath, projectPath?, deviceId?, allowBuild? }) -> { installed:boolean, device, output?, diagnostics? }
38
- - build-ios/install-ios: mirror Android schema but use scheme/workspace/project and resultBundlePath
39
- - run-lint/run-tests -> { exitCode, stdout, stderr, artifacts[] }
40
- - collect-diagnostics(input: { reason, platform? }) -> { artifacts: [{ name, contentBase64?, path? }], envSnapshot }
41
-
42
- # Failure handling & suggestions
43
- - Always return structured diagnostics instead of throwing when possible.
44
- - Provide a short human-friendly suggestion in diagnostics (e.g., "Install Android Platform Tools or set ADB_PATH").
45
- - Redact sensitive env values (tokens, credentials) when including envSnapshot.
46
-
47
- # Progressive disclosure
48
- - Keep SKILL.md compact (this file). Place heavy references in skills/mcp-builder/references/*.md and instruct agents to load them only when needed.
49
-
50
- # References (implement as separate files)
51
- - references/toolchain-details.md — exact paths/heuristics used for JBR, JAVA_HOME, ANDROID_SDK locations.
52
- - references/build-flags.md — gradle/xcodebuild flags used, timeouts, and retry rationale.
53
- - references/diagnostics-schema.md — JSON schema for runResult and collected artifacts.
54
-
55
- # Implementation notes for maintainers
56
- - Implement a thin adapter in src/skills/mcp-builder/index.ts that maps skill actions to existing functions in src/manage and src/utils.
57
- - Provide unit tests under test/skills/mcp-builder that mock child_process to validate happy/failure paths.
58
- - Add env toggles: MCP_PREFERS_JBR, MCP_GRADLE_RETRIES, MCP_XCODEBUILD_RETRIES.
59
-
60
- # Example agent flow
61
- 1. call detect-toolchain({platform:'android', preferJBR:true})
62
- 2. if ok -> call build-android({projectPath:'/path', variant:'Debug'})
63
- 3. call install-android({appPath:'/path/to.apk', deviceId:'emulator-5554'})
64
- 4. if install fails -> call collect-diagnostics({reason:'install failure', platform:'android'})
65
-
66
- # License
67
- Same as repository (Apache-2.0).
4
+ version: 0.1.1
5
+ summary: Build, install and diagnose Android/iOS tooling using this repository’s existing adapters and validation commands.
6
+
7
+ ## Purpose
8
+
9
+ Use this skill for native builds, installations, toolchain diagnosis and verification
10
+ of `mobile-debug-mcp`. Follow the [shared development process](../../../docs/specs/process.md)
11
+ for scope, approvals and reporting.
12
+
13
+ ## Workflow
14
+
15
+ 1. Inspect the relevant adapter under `src/manage/` and platform helpers under
16
+ `src/utils/`. Reuse their subprocess, timeout and diagnostic handling.
17
+ 2. Check only the tools needed by the task. Use the
18
+ [toolchain reference](references/toolchain-details.md) for Java/JBR, adb, idb
19
+ and Xcode discovery; confirm environment settings in the owning source.
20
+ 3. For Gradle builds, reuse `prepareGradle()` from `src/utils/android/utils.ts`.
21
+ For iOS builds, follow `src/manage/ios.ts`. Consult
22
+ [build configuration](references/build-flags.md) for supported overrides.
23
+ 4. Preserve installation fallbacks and error contracts. Collect command, output,
24
+ exit status and relevant environment details on failure; redact secrets.
25
+ The [diagnostic report format](references/diagnostics-schema.md) is guidance
26
+ for investigations, not a replacement for a tool’s public response shape.
27
+ 5. Run `npm run verify` for code changes. Lint includes the
28
+ [structural and architecture gates](../../../docs/code-structure.md); use
29
+ `npm run check:quality` and `npm run check:architecture` to diagnose failures.
30
+ 6. For native/runtime changes, run applicable device checks and report the actual
31
+ device, server build, observed result and cleanup. A skipped device suite or
32
+ successful build does not prove device behaviour. The
33
+ [isolated Android fixture](../../../test/fixtures/debugger-app/README.md) covers
34
+ interactions, labelled-control convergence and debugger journeys.
35
+
36
+ ## Test placement
37
+
38
+ Follow the [test-authoring skill](../test-authoring/SKILL.md) when changing tests.
39
+ Fake-toolchain tests belong under `test/unit/manage/`, `test/unit/system/` or
40
+ `test/unit/utils/` according to the owning module. Automated native checks belong
41
+ under `test/device/automated/`; ad hoc helpers belong under `test/device/manual/`.
42
+
43
+ ## References
44
+
45
+ - [Toolchain details](references/toolchain-details.md): discovery and Java selection.
46
+ - [Build configuration](references/build-flags.md): existing build flags and overrides.
47
+ - [Diagnostics](references/diagnostics-schema.md): reporting command failures.
@@ -1,43 +1,44 @@
1
- # Build flags and runtime configuration
2
-
3
- Purpose: describe the flags, environment variables and spawn-environment handling that agents should use when orchestrating Android and iOS builds for this repo.
4
-
5
- Common env variables
6
- - MCP_GRADLE_RETRIES (default: 1) — number of retry attempts on watchdog kills for Gradle
7
- - MCP_GRADLE_TIMEOUT_MS (default: 300000) — gradle watch/duration timeout
8
- - MCP_XCODEBUILD_RETRIES, MCP_XCODEBUILD_TIMEOUT_MS — similar for xcodebuild
9
- - MCP_PREFERS_JBR — prefer Android Studio JBR for JAVA_HOME
10
- - MCP_DERIVED_DATA, MCP_XCODE_RESULTBUNDLE_PATH — override DerivedData/result bundle locations
11
-
12
- Android (Gradle)
13
- - Use the Gradle wrapper if present: `./gradlew assemble<Variant>` (e.g., assembleDebug). Prefer wrapper to ensure consistent Gradle version.
14
- - Prepare spawn env by prepending javaBin and platform-tools dir to PATH and set GRADLE_JAVA_HOME and `-Dorg.gradle.java.home` when necessary.
15
- - If wrapper exists, ensure `chmod +x ./gradlew` before spawn.
16
- - Recommended flags:
17
- - `--no-daemon` sometimes helpful in CI, but wrap with existing project conventions.
18
- - Set `org.gradle.jvmargs` via env or gradle.properties only if needed.
19
- - Timeouts & watchdog:
20
- - Use a watchdog timeout (MCP_GRADLE_TIMEOUT_MS) and retry (MCP_GRADLE_RETRIES) if killed by watchdog. Record stdout/stderr for each attempt.
21
-
22
- iOS (xcodebuild)
23
- - Use `xcodebuild -workspace <ws> -scheme <scheme> -configuration Debug -sdk iphonesimulator build` for simulator builds.
24
- - Provide `-derivedDataPath` and `-resultBundlePath` to isolate builds and produce diagnostics. Default result bundle path should be unique per run to avoid collisions.
25
- - Recommended flags: `-parallelizeTargets -jobs <N>` where N is from MCP_XCODE_JOBS or sensible default (4).
26
- - When a destination UDID is available, always pass `-destination "platform=iOS Simulator,id=<UDID>"` to avoid ambiguous device selection.
27
- - Timeouts & retries: respect MCP_XCODEBUILD_TIMEOUT_MS and MCP_XCODEBUILD_RETRIES; capture stdout/stderr and save logs under build-results.
28
-
29
- Install-time behavior
30
- - Android: prefer `adb install -r <apk>` for fast installs. If output contains spurious lines (e.g., "Performing Streamed Install" followed by "Success"), parse to extract final status. On failure try `adb push` to `/data/local/tmp` + `pm install -r <remote>` as a fallback collect push/install diagnostics.
31
- - iOS: prefer `xcrun simctl install <device> <app>` for simulator. On failure attempt idb install if idb exists: `idb install <ipa|app> --udid <udid>` and record its stdout/stderr.
32
-
33
- Diagnostics capture
34
- - Save stdout/stderr, exitCode and environment snapshot for each command. Persist logs under workspace/build-results or a temp dir provided by the caller.
35
- - For builds, also capture produced artifact paths to return to caller.
36
-
37
- Examples
38
- - Gradle invocation (pseudo):
39
- spawnOpts.env.PATH = `${javaBin}:${platformTools}:${process.env.PATH}`
40
- spawn('./gradlew', ['assembleDebug'], { cwd: projectRoot, env: spawnOpts.env })
41
-
42
- - xcodebuild invocation (pseudo):
43
- xcodebuild -workspace MyApp.xcworkspace -scheme MyApp -configuration Debug -sdk iphonesimulator -derivedDataPath /tmp/derived -resultBundlePath /tmp/Result-123.xcresult -parallelizeTargets -jobs 4 build
1
+ # Build configuration
2
+
3
+ Use the existing platform adapters rather than constructing a second build path.
4
+ The owning implementation is the source of truth for accepted overrides.
5
+
6
+ ## Android
7
+
8
+ [prepareGradle()](../../../../src/utils/android/utils.ts) selects the project
9
+ wrapper when present and prepares Java and platform-tools in the child environment.
10
+ [AndroidManage](../../../../src/manage/android.ts) executes that command.
11
+
12
+ | Setting | Current use |
13
+ | --- | --- |
14
+ | `MCP_GRADLE_TASK` | Gradle task; defaults to `assembleDebug` |
15
+ | `MCP_GRADLE_WORKERS`, then `MCP_BUILD_JOBS` | Supplies `--max-workers` |
16
+ | `MCP_GRADLE_CACHE=0` | Disables Gradle caching |
17
+ | `ANDROID_STUDIO_JDK`, `ANDROID_STUDIO_JBR`, `JAVA_HOME` | Java selection; see [toolchain details](toolchain-details.md) |
18
+
19
+ The current Android build adapter does not implement `MCP_GRADLE_RETRIES` or
20
+ `MCP_GRADLE_TIMEOUT_MS`. Do not assume iOS watchdog controls apply to Gradle.
21
+
22
+ ## iOS
23
+
24
+ [iOSManage](../../../../src/manage/ios.ts) discovers the workspace/project and
25
+ scheme, then supplies simulator destination, derived-data and result-bundle paths.
26
+
27
+ | Setting | Current use |
28
+ | --- | --- |
29
+ | `XCODEBUILD_PATH` | Build executable; defaults to `xcodebuild` |
30
+ | `MCP_XCODE_DESTINATION_UDID`, then `MCP_XCODE_DESTINATION` | Simulator destination when not supplied in options |
31
+ | `MCP_DERIVED_DATA` | Derived-data path when not supplied in options |
32
+ | `MCP_XCODE_RESULTBUNDLE_PATH` | Result bundle; otherwise generated uniquely per run |
33
+ | `MCP_XCODE_JOBS` | Build parallelism; defaults to 4 unless supplied in options |
34
+ | `MCP_FORCE_CLEAN=1` | Requests clean unless explicitly supplied in options |
35
+ | `MCP_XCODEBUILD_TIMEOUT` | Watchdog duration in milliseconds; defaults to 180000 |
36
+ | `MCP_XCODEBUILD_RETRIES` | Watchdog retries; current parsing falls back to 1 |
37
+
38
+ ## Installation and diagnostics
39
+
40
+ Preserve adapter-specific install fallbacks and errors. Use the
41
+ [management reference](../../../../docs/tools/manage.md) for public tool contracts.
42
+ Record exact commands, output, exit status and artifact paths when investigating
43
+ failures; see [diagnostics](diagnostics-schema.md). Keep environment snapshots
44
+ limited to relevant variables and redact secrets.
@@ -1,6 +1,9 @@
1
1
  # Diagnostics schema
2
2
 
3
- This document defines the JSON shapes that mcp-builder actions return when collecting diagnostics. Agents and tooling should rely on these keys.
3
+ Use this suggested format when reporting a build or toolchain investigation.
4
+ It is not a public MCP response schema or a claim that every adapter returns
5
+ these fields. Preserve the actual tool response and label supplemental diagnostics
6
+ separately; see the [management contracts](../../../../docs/tools/manage.md).
4
7
 
5
8
  Top-level diagnostic object
6
9
  {
@@ -1,62 +1,49 @@
1
- # Toolchain details
2
-
3
- This reference documents the exact heuristics and commands used by the mcp-builder skill to detect and validate the native toolchain (Android & iOS) on contributor machines.
4
-
5
- Key environment variables
6
- - ADB_PATH: explicit path to adb binary
7
- - ANDROID_SDK_ROOT / ANDROID_HOME: SDK root; platform-tools/adb under these
8
- - ANDROID_STUDIO_JBR / ANDROID_STUDIO_JDK: explicit Android Studio JBR/JDK path
9
- - JAVA_HOME: system JDK
10
- - IDB_PATH / MCP_IDB_PATH: idb path for iOS
11
- - XCRUN_PATH: explicit xcrun path
12
- - MCP_PREFERS_JBR: boolean to prefer Android Studio JBR when present
13
-
14
- Android Java detection precedence
15
- 1. ANDROID_STUDIO_JBR / ANDROID_STUDIO_JDK env vars (preferred when MCP_PREFERS_JBR set)
16
- 2. Known Android Studio JBR locations (macOS):
17
- - /Applications/Android Studio.app/Contents/jbr/Contents/Home
18
- - /Applications/Android Studio Preview.app/Contents/jbr/Contents/Home
19
- 3. Explicit JAVA_HOME (validate via `java -version`)
20
- 4. macOS `/usr/libexec/java_home -v 17` or `-v 21`
21
- 5. Common Linux JDK locations: `/usr/lib/jvm/*temurin*`, `/usr/lib/jvm/*zulu*`
22
-
23
- Validation rules
24
- - Accept only Java 17 or Java 21 for Gradle builds in this project (both tested/known working).
25
- - Reject GraalVM / Java 23 that causes Gradle jlink errors. If detected, return suggestion: "Prefer an Apple/Temurin/JBR Java 17 or 21. Set ANDROID_STUDIO_JBR or JAVA_HOME to a supported JDK."
26
-
27
- ADB resolution precedence
28
- 1. process.env.ADB_PATH (explicit)
29
- 2. ANDROID_SDK_ROOT or ANDROID_HOME -> platform-tools/adb
30
- 3. Common SDK locations (macOS/Linux): $HOME/Library/Android/sdk/platform-tools, /opt/android-sdk/platform-tools
31
- 4. `command -v adb` / `which adb` on PATH
32
- 5. fallback to `adb` (best-effort)
33
-
34
- IDB / XCRUN detection (iOS)
35
- - IDB: check MCP_IDB_PATH -> IDB_PATH -> common locations (/opt/homebrew/bin/idb, /usr/local/bin/idb, $HOME/Library/Python/*/bin/idb). Validate by running `idb --version` or `idb list-targets --json`.
36
- - XCRUN: check XCRUN_PATH -> run `xcrun --version`.
37
-
38
- How to probe (commands)
39
- - adb: `adb --version` and `adb devices --print` (or `adb devices -l`) to list.
40
- - java: `java -XshowSettings:properties -version` or `java -version` parse first line.
41
- - xcrun: `xcrun --version`
42
- - idb: `idb --version` or `idb list-targets --json`
43
-
44
- Output format
45
- - Each probe returns { name, cmd, ok, version?, suggestion? } so agents can reason programmatically.
46
- - Include env snapshot (PATH, JAVA_HOME, ADB_PATH, ANDROID_SDK_ROOT, IDB_PATH, XCRUN_PATH) to aid diagnostics.
47
-
48
- Notes & rationale
49
- - Prefer Android Studio JBR (JBR is bundled & known-good) because developer machines often have mismatched system JDKs (e.g., Graal). Allow override via env for CI.
50
- - For long-running server processes, prepend java/bin and platform-tools to spawn env PATH when running child builds so external PATH/JAVA_HOME changes don't require a server restart.
51
-
52
- Examples
53
- - Detected result (JSON):
54
- {
55
- "name": "adb",
56
- "cmd": "/Users/xxx/Library/Android/sdk/platform-tools/adb",
57
- "ok": true,
58
- "version": "Android Debug Bridge version 1.0.41"
59
- }
60
-
61
- - Java suggestion when incompatible:
62
- { "name": "java", "ok": false, "suggestion": "Found GraalVM (Java 23). Use Java 17 or 21: set ANDROID_STUDIO_JBR or JAVA_HOME." }
1
+ # Toolchain discovery
2
+
3
+ Inspect the owning helper before changing discovery or adding an override. Build
4
+ adapters use these helpers; a separate probe should report the selected executable
5
+ and its actual output, rather than infer success from an environment variable.
6
+
7
+ ## Android Java
8
+
9
+ [detectJavaHome()](../../../../src/utils/java.ts) checks explicit
10
+ `ANDROID_STUDIO_JDK`, then `ANDROID_STUDIO_JBR`, known Android Studio JBR locations,
11
+ and `JAVA_HOME`, followed by macOS and Linux fallback locations. The version
12
+ checks accept Java 17 or 21 for Android builds. Exact fallback locations live in
13
+ the helper rather than being duplicated here.
14
+
15
+ Use `java -version` on the selected executable. Distinguish Gradle’s selected JDK
16
+ from the shell Java version and the optional debugger worker’s Java requirements;
17
+ see [the debugger reference](../../../../docs/tools/debugger.md).
18
+
19
+ ## adb
20
+
21
+ [resolveAdbCmd()](../../../../src/utils/android/utils.ts) checks, in order:
22
+
23
+ 1. An explicit nonempty `ADB_PATH`.
24
+ 2. `adb` on `PATH`.
25
+ 3. `ANDROID_SDK_ROOT` or `ANDROID_HOME` with `platform-tools/adb`.
26
+ 4. The macOS user SDK location.
27
+ 5. A final `adb` fallback, whose availability still needs checking.
28
+
29
+ Probe with `adb version` and `adb devices -l`. Use an explicit serial for device
30
+ journeys and record whether it is a physical device or an emulator.
31
+
32
+ ## iOS
33
+
34
+ The [iOS command helpers](../../../../src/utils/ios/utils.ts) resolve idb through
35
+ configured overrides and the current installation. `MCP_IDB_PATH` takes precedence
36
+ over `IDB_PATH`; inspect `getConfiguredIdbPath()` for configuration-file fallbacks.
37
+ `getXcrunCmd()` uses `XCRUN_PATH` or `xcrun`.
38
+
39
+ Probe the selected binaries with `idb --version`, `idb list-targets --json`,
40
+ `xcrun --version`, or `xcrun simctl list devices booted` as appropriate. A working
41
+ simulator probe does not establish physical-iOS-device support.
42
+
43
+ ## Reporting
44
+
45
+ Record executable paths, relevant versions, device identities and the commands
46
+ that actually ran. Capture only relevant environment variables and redact secrets.
47
+ Use the [diagnostic report guidance](diagnostics-schema.md), keeping supplemental
48
+ diagnostics separate from public MCP responses. For available build settings,
49
+ continue with [build configuration](build-flags.md).
@@ -11,3 +11,10 @@ Ask these questions while reviewing a spec for implementation and execution read
11
11
  7. Does it match existing code paths and public tool surfaces?
12
12
  8. Can each open concern be classified as a spec issue, execution gap, or implementation issue?
13
13
  9. Is the spec ready to execute and implement without further interpretation?
14
+
15
+ For structural refactors, also compare the proposed ownership and dependency
16
+ directions against [the architecture rules](../../../../docs/code-structure.md).
17
+ Check that new contracts are shared across schemas, validation and types, that
18
+ timing-sensitive services have suitable clock/delay seams, and that compatibility
19
+ checks protect public definitions and error behaviour. Passing size limits alone
20
+ does not establish cohesive responsibilities.
@@ -1,7 +1,7 @@
1
1
  # Test Authoring skill
2
2
 
3
3
  name: test-authoring
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  summary: Reusable guidance for adding or updating tests in this repository without tying the workflow to a single agent product.
6
6
 
7
7
  # Purpose
@@ -27,10 +27,11 @@ Activate when an agent needs to:
27
27
  2. Follow the repository's current automated test style: self-running `tsx` scripts with explicit assertions and non-zero exit on failure.
28
28
  3. Put automated unit tests under `test/unit/...`; the unit runner automatically executes every `*.test.ts` file there.
29
29
  4. Put automated device smoke tests under `test/device/automated/...`; put human-invoked helpers under `test/device/manual/...`.
30
- 5. Reuse existing mocking seams and test hooks before creating new ones.
30
+ 5. Prefer the extracted services’ typed dependencies and injectable [clocks](../../../src/runtime/clock.ts) over replacing static methods or process-global timers. Reuse existing test seams before adding hooks.
31
31
  6. When testing user-facing tools, protect **response shape**, required fields, and documented defaults.
32
32
  7. Keep tests deterministic: isolate process-global mocks, prefer fake binaries or injected helpers over shared mutable module state.
33
- 8. Validate with the repository commands that already exist instead of inventing new runners.
33
+ 8. Run `npm run verify` for code/test changes and applicable native checks under the [shared process](../../../docs/specs/process.md#5-verify-and-report).
34
+ 9. Follow the [structure and architecture rules](../../../docs/code-structure.md). Keep guardrail failure cases under `test/unit/quality/` and preserve the complete public tool-definition compatibility fixture.
34
35
 
35
36
  # Inputs & outputs
36
37
  - choose-test-type(input: { changedPaths[], behaviorType, requiresRealDevice?: boolean }) -> { recommendedType: 'unit'|'device-automated'|'device-manual', rationale, targetPath }
@@ -49,9 +50,9 @@ Activate when an agent needs to:
49
50
  - Load detailed references only when deciding placement, matching existing style, or validating new tests.
50
51
 
51
52
  # References
52
- - `references/repo-test-layout.md` — where tests belong and what each tree means
53
- - `references/test-authoring-workflow.md` — step-by-step workflow for creating or changing tests
54
- - `references/test-quality-checklist.md` — what a good test in this repo should prove before it is considered done
53
+ - [references/repo-test-layout.md](references/repo-test-layout.md) — where tests belong and what each tree means
54
+ - [references/test-authoring-workflow.md](references/test-authoring-workflow.md) — step-by-step workflow for creating or changing tests
55
+ - [references/test-quality-checklist.md](references/test-quality-checklist.md) — what a good test in this repo should prove before it is considered done
55
56
 
56
57
  # License
57
58
  Same as repository (Apache-2.0).
@@ -15,11 +15,13 @@ Best for:
15
15
  - response-shape validation
16
16
  - shared utility behavior
17
17
  - deterministic edge cases
18
+ - injected-clock polling and stabilization checks (`test/unit/interact/`)
19
+ - structural and architectural negative controls (`test/unit/quality/`)
18
20
 
19
21
  ## Automated device smoke tests
20
22
 
21
23
  - Location: `test/device/automated/...`
22
- - Naming: usually `*.smoke.ts` or `*.integration.ts`
24
+ - Naming: `*.smoke.ts`, `*.integration.ts`, or `*.test.ts` as supported by the device runner
23
25
  - Execution: `npm run test:device`
24
26
  - Runner behavior: `test/device/index.ts` runs only the automated subtree
25
27
 
@@ -18,7 +18,8 @@ This usually determines the cheapest useful test type.
18
18
  Before writing a new test, inspect tests already covering the same area:
19
19
 
20
20
  - `test/unit/server/...` for tool registration and response-shape tests
21
- - `test/unit/interact/...` for handler tests and UI wait behavior
21
+ - `test/unit/interact/...` for service, handler and injected-clock tests
22
+ - `test/unit/quality/...` for structural and architecture rule failure cases
22
23
  - `test/unit/manage/...` for build/install flows and fake toolchain binaries
23
24
  - `test/unit/observe/...` for observe response contracts
24
25
  - `test/unit/utils/...` for shared helper coverage
@@ -44,6 +45,8 @@ For unit tests that need isolation:
44
45
 
45
46
  Before adding a new hook, search for:
46
47
 
48
+ - typed service dependencies under `src/interact/`
49
+ - `Clock` in `src/runtime/clock.ts` for deadlines, stability and retry/backoff tests
47
50
  - existing test-only setters/resetters
48
51
  - environment-variable based indirection
49
52
  - fake executable patterns already used in system/manage tests
@@ -61,12 +64,18 @@ When testing tools or handlers, cover:
61
64
 
62
65
  ## 6. Validate with repo commands
63
66
 
64
- Use only the existing validation entrypoints:
65
-
66
- - `npm run build`
67
- - `npm run lint`
68
- - `npm run test:unit`
69
- - `SKIP_DEVICE_TESTS=1 npm run test:device` for automated device wrappers when real devices are not part of the current validation run
67
+ Run focused tests while iterating, then `npm run verify`. It includes ESLint,
68
+ structural/type checks, ArchUnitTS rules, the build, unit tests and plugin checks.
69
+ Use `npm run check:quality` or `npm run check:architecture` to isolate gate failures;
70
+ see [code structure and quality checks](../../../../docs/code-structure.md).
71
+
72
+ Run `npm run test:device` when native/runtime behaviour changes. Record each
73
+ platform and journey that ran, and label skipped or unavailable coverage as unrun.
74
+ `SKIP_DEVICE_TESTS=1` is honoured only by individual wrappers, not by the device
75
+ runner as a whole. It neither disables every native test nor establishes device
76
+ coverage; report any skipped checks explicitly.
77
+ For isolated Android interaction coverage, see the
78
+ [fixture instructions](../../../../test/fixtures/debugger-app/README.md).
70
79
 
71
80
  ## 7. Update docs only when structure or expectations changed
72
81
 
@@ -11,7 +11,7 @@ A new test in this repo is high quality when it does most of the following:
11
11
 
12
12
  ## Determinism
13
13
 
14
- - does not depend on arbitrary timing unless the behavior is inherently time-based
14
+ - uses injected clocks for timing-dependent services so deadlines and stability can be asserted without real sleeps
15
15
  - restores mocks, env vars, and monkeypatches in `finally`
16
16
  - avoids leaking state into later tests
17
17
  - runs reliably in an isolated subprocess
@@ -27,6 +27,7 @@ A new test in this repo is high quality when it does most of the following:
27
27
  - reuses existing helpers, fake-binary patterns, or test seams
28
28
  - keeps fixtures as small as possible
29
29
  - makes the failure obvious from the assertion message or output
30
+ - uses deliberately broken fixtures for architecture rules, including relevant import forms; an empty or unresolved graph must not count as a pass
30
31
  - stays focused on one behavior cluster instead of becoming a broad scenario script
31
32
 
32
33
  ## Completion bar
@@ -1,40 +1,18 @@
1
- # Copilot Instructions for mobile-debug-mcp
1
+ # Copilot instructions
2
2
 
3
- ## Required workflow
3
+ Read [AGENTS.md](../AGENTS.md) and follow the shared [development
4
+ process](../docs/specs/process.md) before planning, editing, or reviewing changes.
5
+ These instructions also apply to delegated work.
4
6
 
5
- Read and follow [AGENTS.md](../AGENTS.md) and the shared
6
- [development process](../docs/specs/process.md) before planning, editing, or
7
- reviewing changes. These are the authoritative repository instructions, including
8
- for delegated work; the notes below supplement them.
7
+ Use the [contribution guide](../CONTRIBUTING.md) for setup, source layout,
8
+ validation commands, and documentation conventions. The [documentation
9
+ index](../docs/README.md) links to current tool contracts and historical designs.
10
+ Load the applicable [repository skill](../.agents/skills/README.md) before test
11
+ authoring, native tooling work, or specification review.
9
12
 
10
- ## Build and Run
11
- - **Build**: `npm run build` (runs `tsc` to compile TypeScript to `dist/`)
12
- - **Start**: `npm start` (runs the compiled server at `dist/server.js`)
13
- - **Dev Workflow**: modify `src/*.ts` -> `npm run build` -> `npm start` to test changes.
13
+ Follow the [module ownership and quality rules](../docs/code-structure.md) when
14
+ changing dependencies or extracting services.
14
15
 
15
- ## Architecture
16
- - **Core**: `src/server.ts` implements the MCP server using `@modelcontextprotocol/sdk`. It handles tool registration and execution.
17
- - **Platform Modules**:
18
- - `src/android.ts`: Encapsulates `adb` commands for Android device interaction.
19
- - `src/ios.ts`: Encapsulates `xcrun simctl` commands for iOS simulator interaction.
20
- - **Types**: `src/types.ts` defines shared interfaces for device info and tool responses.
21
-
22
- ## Key Conventions
23
-
24
- ### Tool Implementation
25
- - **Response Format**: Tools typically return a list of content blocks.
26
- - `start_app`: Returns a single text block containing JSON (via `wrapResponse`).
27
- - `terminate_app`: Returns a single text block containing JSON (via `wrapResponse`).
28
- - `restart_app`: Returns a single text block containing JSON (via `wrapResponse`).
29
- - `reset_app_data`: Returns a single text block containing JSON (via `wrapResponse`).
30
- - `get_logs`: Returns a text block (JSON metadata) AND a text block (raw logs).
31
- - `capture_screenshot`: Returns a text block (JSON metadata) AND an image block (base64 PNG).
32
- - **Metadata**: Always include a `device` object (platform, id, model, etc.) in the JSON response part.
33
-
34
- ### External Tools
35
- - **Android**: Uses `process.env.ADB_PATH` or defaults to `adb`.
36
- - **iOS**: Uses `process.env.XCRUN_PATH` or defaults to `xcrun`. Assumes a booted simulator.
37
- - **Execution**: Uses `child_process.exec` for running shell commands.
38
-
39
- ### Error Handling
40
- - Tools should catch execution errors and return a user-friendly error message in a `text` content block, rather than crashing the server.
16
+ Follow existing platform adapters, subprocess helpers, error handling, and MCP
17
+ response conventions. Inspect the relevant implementation and tests rather than
18
+ assuming all tools share one response shape or execution strategy.
@@ -14,7 +14,7 @@ jobs:
14
14
  - name: Use Node.js
15
15
  uses: actions/setup-node@v4
16
16
  with:
17
- node-version: '18'
17
+ node-version: '22'
18
18
  - name: Install dependencies
19
19
  run: npm ci
20
20
  - name: Lint
@@ -27,14 +27,14 @@ jobs:
27
27
  distribution: 'temurin'
28
28
  java-version: '17'
29
29
  - name: Compile optional debugger worker
30
- run: javac --release 17 --add-modules jdk.jdi -d "$RUNNER_TEMP/mobile-debug-jdi" worker/DebuggerWorker.java
30
+ run: javac --release 17 --add-modules jdk.jdi -d "$RUNNER_TEMP/mobile-debug-jdi" src/debugger/java/DebuggerWorker.java
31
31
  - name: Check debugger package contents
32
32
  run: |
33
33
  npm pack --dry-run --json > "$RUNNER_TEMP/mobile-debug-package.json"
34
34
  node --input-type=module - "$RUNNER_TEMP/mobile-debug-package.json" <<'JS'
35
35
  import fs from 'node:fs'
36
36
  const files = new Set(JSON.parse(fs.readFileSync(process.argv[2], 'utf8'))[0].files.map(file => file.path))
37
- for (const file of ['worker/DebuggerWorker.java', 'dist/debugger/worker.js', 'dist/server/debugger-schema.js']) {
37
+ for (const file of ['src/debugger/java/DebuggerWorker.java', 'dist/debugger/worker.js', 'dist/debugger/protocol.js', 'dist/runtime/action-results.js', 'dist/server/definitions/input.js', 'dist/server/schemas/debugger-schema.js', 'dist/server/handlers/tool-handlers.js', 'dist/interact/adjustment/adjustment.js', 'dist/interact/targeting/find-element.js', 'dist/interact/waits/ui-wait.js', 'dist/interact/assertions/state-assertion.js', 'dist/observe/network/index.js', 'dist/runtime/clock.js', 'dist/contracts/target.js', 'dist/contracts/execution-controls.js', 'dist/server/handlers/manage.js', 'dist/server/handlers/input.js', 'dist/server/handlers/journey.js']) {
38
38
  if (!files.has(file)) throw new Error(`Missing debugger package file: ${file}`)
39
39
  }
40
40
  JS
@@ -59,7 +59,7 @@ jobs:
59
59
  - name: Set up Node.js
60
60
  uses: actions/setup-node@v4
61
61
  with:
62
- node-version: '18'
62
+ node-version: '22'
63
63
 
64
64
  - name: Install dependencies
65
65
  run: npm ci
package/AGENTS.md CHANGED
@@ -21,12 +21,18 @@ instructions take precedence.
21
21
  Primary areas:
22
22
 
23
23
  - `src/server.ts` — runtime entrypoint
24
- - `src/server-core.ts` — tool registration and dispatch logic
24
+ - `src/server-core.ts` and `src/server/` — MCP registration, capability handlers, schemas and definitions
25
25
  - `src/interact/` — tap, swipe, typing, waits, and interaction helpers
26
26
  - `src/observe/` — logs, screenshots, UI tree, fingerprints, snapshots
27
27
  - `src/manage/` — build, install, start, terminate, restart, reset-app-data
28
28
  - `src/system/` — environment and toolchain health checks
29
+ - `src/debugger/` — debugger sessions, protocol and Java worker
29
30
  - `src/utils/` — shared helpers and platform-specific utility code
31
+ - `src/contracts/` — shared input shapes and validation
32
+ - `src/runtime/` — action results, traces and injectable clocks
33
+
34
+ See [code structure and quality checks](docs/code-structure.md) for interaction
35
+ subfolders, module ownership, dependency rules and enforced limits.
30
36
 
31
37
  ## First things an agent should know
32
38
 
@@ -61,7 +67,9 @@ If the task is about **reviewing an RFC or spec draft**, load `.agents/skills/sp
61
67
 
62
68
  ### Repository docs
63
69
 
64
- - `README.md` — high-level repo overview and commands
70
+ - [README.md](README.md) — project overview and setup
71
+ - [CONTRIBUTING.md](CONTRIBUTING.md) — development, validation, and documentation conventions
72
+ - [Documentation index](docs/README.md) — user guides, designs, and benchmarks
65
73
  - `docs/specs/process.md` — required development workflow for all agents
66
74
  - `docs/tools/TOOLS.md` — tool documentation and contracts
67
75
  - `docs/CHANGELOG.md` — recent behavioral changes
@@ -91,7 +99,8 @@ This file is intentionally short. Keep task-specific guidance in `.agents/skills
91
99
 
92
100
  - `npm run test:unit` runs every automated unit test under `test/unit/...`
93
101
  - `npm run test:device` runs the automated device smoke checks under `test/device/automated/...`
94
- - `npm run verify` runs the default maintainer verification sequence: lint, build, unit tests, and agent-plugin consistency checks
102
+ - `npm run lint` runs ESLint, structural/type limits and ArchUnitTS dependency checks
103
+ - `npm run verify` runs lint, build, unit tests, and agent-plugin consistency checks
95
104
  - Manual and debug-oriented device scripts live under `test/device/manual/...` and are not part of the default test commands
96
105
 
97
106
  ## Utility Scripts