swipium 1.5.0 → 2.0.1

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 (498) hide show
  1. package/CHANGELOG.md +183 -0
  2. package/README.md +173 -280
  3. package/THREAT_MODEL.md +223 -47
  4. package/dist/appMap/automationLink.js +30 -27
  5. package/dist/appMap/automationLink.js.map +1 -1
  6. package/dist/appMap/build.js +47 -21
  7. package/dist/appMap/build.js.map +1 -1
  8. package/dist/appMap/codeIndex.js +2 -2
  9. package/dist/appMap/codeIndex.js.map +1 -1
  10. package/dist/appMap/featureIndex.js +3 -3
  11. package/dist/appMap/featureIndex.js.map +1 -1
  12. package/dist/appMap/featureModel.js +2 -2
  13. package/dist/appMap/featureModel.js.map +1 -1
  14. package/dist/appMap/firstRunApply.js +2 -2
  15. package/dist/appMap/firstRunApply.js.map +1 -1
  16. package/dist/appMap/issues.js +10 -10
  17. package/dist/appMap/issues.js.map +1 -1
  18. package/dist/appMap/migrations.js +5 -5
  19. package/dist/appMap/migrations.js.map +1 -1
  20. package/dist/appMap/prelaunch.js +2 -2
  21. package/dist/appMap/prelaunch.js.map +1 -1
  22. package/dist/appMap/projectRegistry.js +77 -11
  23. package/dist/appMap/projectRegistry.js.map +1 -1
  24. package/dist/appMap/provenance.js +2 -2
  25. package/dist/appMap/provenance.js.map +1 -1
  26. package/dist/appMap/query.js +2 -2
  27. package/dist/appMap/query.js.map +1 -1
  28. package/dist/appMap/runtimeMerge.js +3 -3
  29. package/dist/appMap/runtimeMerge.js.map +1 -1
  30. package/dist/appMap/schema.js +1 -1
  31. package/dist/appMap/schema.js.map +1 -1
  32. package/dist/appMap/screenMatch.js +1 -1
  33. package/dist/appMap/screenMatch.js.map +1 -1
  34. package/dist/appMap/staticScan.js +17 -17
  35. package/dist/appMap/staticScan.js.map +1 -1
  36. package/dist/appMap/store.js +55 -7
  37. package/dist/appMap/store.js.map +1 -1
  38. package/dist/appMap/tsAstScan.js +3 -3
  39. package/dist/appMap/tsAstScan.js.map +1 -1
  40. package/dist/artifacts/bundletool.js +5 -5
  41. package/dist/artifacts/bundletool.js.map +1 -1
  42. package/dist/artifacts/resolve.js +10 -10
  43. package/dist/artifacts/resolve.js.map +1 -1
  44. package/dist/automation/capabilities.js +3 -3
  45. package/dist/automation/capabilities.js.map +1 -1
  46. package/dist/automation/gestures.js +1 -1
  47. package/dist/automation/gestures.js.map +1 -1
  48. package/dist/automation/plan.js +7 -7
  49. package/dist/automation/plan.js.map +1 -1
  50. package/dist/automation/report.js +3 -3
  51. package/dist/automation/report.js.map +1 -1
  52. package/dist/automation/selectors.js +14 -25
  53. package/dist/automation/selectors.js.map +1 -1
  54. package/dist/automation/types.js +1 -1
  55. package/dist/automation/types.js.map +1 -1
  56. package/dist/automation/waits.js +5 -5
  57. package/dist/automation/waits.js.map +1 -1
  58. package/dist/automation/webview.js +2 -2
  59. package/dist/automation/webview.js.map +1 -1
  60. package/dist/automationGen/appiumModel.js +13 -7
  61. package/dist/automationGen/appiumModel.js.map +1 -1
  62. package/dist/automationGen/ciEmitter.js +5 -5
  63. package/dist/automationGen/ciEmitter.js.map +1 -1
  64. package/dist/automationGen/identifiers.js +224 -0
  65. package/dist/automationGen/identifiers.js.map +1 -0
  66. package/dist/automationGen/jsEmitter.js +265 -106
  67. package/dist/automationGen/jsEmitter.js.map +1 -1
  68. package/dist/automationGen/packagePatch.js +2 -2
  69. package/dist/automationGen/packagePatch.js.map +1 -1
  70. package/dist/automationGen/platformResolve.js +36 -0
  71. package/dist/automationGen/platformResolve.js.map +1 -0
  72. package/dist/automationGen/projectProfile.js +71 -26
  73. package/dist/automationGen/projectProfile.js.map +1 -1
  74. package/dist/automationGen/pythonEmitter.js +276 -105
  75. package/dist/automationGen/pythonEmitter.js.map +1 -1
  76. package/dist/automationGen/readmeEmitter.js +7 -6
  77. package/dist/automationGen/readmeEmitter.js.map +1 -1
  78. package/dist/{tools/automationGenerate.js → automationGen/run.js} +72 -113
  79. package/dist/automationGen/run.js.map +1 -0
  80. package/dist/automationGen/suitePlan.js +6 -4
  81. package/dist/automationGen/suitePlan.js.map +1 -1
  82. package/dist/automationGen/validation.js +20 -8
  83. package/dist/automationGen/validation.js.map +1 -1
  84. package/dist/build/parseBuildLog.js +2 -2
  85. package/dist/build/parseBuildLog.js.map +1 -1
  86. package/dist/build/plan.js +7 -7
  87. package/dist/build/plan.js.map +1 -1
  88. package/dist/ci/preflight.js +13 -4
  89. package/dist/ci/preflight.js.map +1 -1
  90. package/dist/cli/gc.js +74 -0
  91. package/dist/cli/gc.js.map +1 -0
  92. package/dist/cli/init.js +217 -26
  93. package/dist/cli/init.js.map +1 -1
  94. package/dist/cli/main.js +50 -0
  95. package/dist/cli/main.js.map +1 -0
  96. package/dist/cli/report.js +218 -0
  97. package/dist/cli/report.js.map +1 -0
  98. package/dist/cli/scan.js +35 -14
  99. package/dist/cli/scan.js.map +1 -1
  100. package/dist/cli/suite.js +6 -6
  101. package/dist/cli/suite.js.map +1 -1
  102. package/dist/cli/verify.js +7 -7
  103. package/dist/cli/verify.js.map +1 -1
  104. package/dist/consent/consent.js +162 -5
  105. package/dist/consent/consent.js.map +1 -1
  106. package/dist/context/detect.js +45 -14
  107. package/dist/context/detect.js.map +1 -1
  108. package/dist/context/findApps.js +6 -6
  109. package/dist/context/findApps.js.map +1 -1
  110. package/dist/context/projectRoot.js +174 -19
  111. package/dist/context/projectRoot.js.map +1 -1
  112. package/dist/context/scan.js +1 -1
  113. package/dist/context/scan.js.map +1 -1
  114. package/dist/core/capabilityGroups.js +90 -0
  115. package/dist/core/capabilityGroups.js.map +1 -0
  116. package/dist/core/target.js +3 -3
  117. package/dist/core/target.js.map +1 -1
  118. package/dist/core/targetPlan.js +65 -62
  119. package/dist/core/targetPlan.js.map +1 -1
  120. package/dist/drivers/DirectDriver.js +300 -36
  121. package/dist/drivers/DirectDriver.js.map +1 -1
  122. package/dist/drivers/SimctlDriver.js +120 -7
  123. package/dist/drivers/SimctlDriver.js.map +1 -1
  124. package/dist/drivers/WdaDriver.js +350 -50
  125. package/dist/drivers/WdaDriver.js.map +1 -1
  126. package/dist/explore/candidates.js +2 -2
  127. package/dist/explore/candidates.js.map +1 -1
  128. package/dist/explore/graph.js +5 -5
  129. package/dist/explore/graph.js.map +1 -1
  130. package/dist/explore/policy.js +5 -5
  131. package/dist/explore/policy.js.map +1 -1
  132. package/dist/explore/runner.js +301 -284
  133. package/dist/explore/runner.js.map +1 -1
  134. package/dist/explore/signatures.js +1 -1
  135. package/dist/featureTesting/executionBootstrap.js +29 -30
  136. package/dist/featureTesting/executionBootstrap.js.map +1 -1
  137. package/dist/featureTesting/featureMap.js +2 -2
  138. package/dist/featureTesting/featureMap.js.map +1 -1
  139. package/dist/featureTesting/featureScope.js +12 -12
  140. package/dist/featureTesting/featureScope.js.map +1 -1
  141. package/dist/featureTesting/mapFeatureScope.js +7 -7
  142. package/dist/featureTesting/mapFeatureScope.js.map +1 -1
  143. package/dist/featureTesting/objectiveModel.js +10 -10
  144. package/dist/featureTesting/objectiveModel.js.map +1 -1
  145. package/dist/featureTesting/resultMerge.js +6 -6
  146. package/dist/featureTesting/resultMerge.js.map +1 -1
  147. package/dist/featureTesting/sources.js +4 -4
  148. package/dist/featureTesting/sources.js.map +1 -1
  149. package/dist/featureTesting/suiteBridge.js +1 -1
  150. package/dist/featureTesting/suiteBridge.js.map +1 -1
  151. package/dist/featureTesting/synonyms.js +1 -1
  152. package/dist/featureTesting/synonyms.js.map +1 -1
  153. package/dist/featureTesting/testCaseFactory.js +11 -11
  154. package/dist/featureTesting/testCaseFactory.js.map +1 -1
  155. package/dist/featureTesting/testPlan.js +3 -3
  156. package/dist/featureTesting/testPlan.js.map +1 -1
  157. package/dist/firstRun/authStateMachine.js +1 -1
  158. package/dist/firstRun/authStateMachine.js.map +1 -1
  159. package/dist/firstRun/classifyScreen.js +5 -5
  160. package/dist/firstRun/classifyScreen.js.map +1 -1
  161. package/dist/firstRun/firstRunPlanner.js +11 -11
  162. package/dist/firstRun/firstRunPlanner.js.map +1 -1
  163. package/dist/firstRun/firstRunRunner.js +8 -8
  164. package/dist/firstRun/firstRunRunner.js.map +1 -1
  165. package/dist/firstRun/generatedDataPolicy.js +9 -9
  166. package/dist/firstRun/generatedDataPolicy.js.map +1 -1
  167. package/dist/firstRun/inputPlanner.js +5 -5
  168. package/dist/firstRun/inputPlanner.js.map +1 -1
  169. package/dist/firstRun/onboardingStateMachine.js +1 -1
  170. package/dist/firstRun/onboardingStateMachine.js.map +1 -1
  171. package/dist/firstRun/paywallPolicy.js +3 -3
  172. package/dist/firstRun/paywallPolicy.js.map +1 -1
  173. package/dist/firstRun/types.js +1 -1
  174. package/dist/firstRun/types.js.map +1 -1
  175. package/dist/fixtures/catalog.js +33 -3
  176. package/dist/fixtures/catalog.js.map +1 -1
  177. package/dist/fixtures/load.js +50 -0
  178. package/dist/fixtures/load.js.map +1 -0
  179. package/dist/flows/discover.js +2 -2
  180. package/dist/flows/discover.js.map +1 -1
  181. package/dist/flows/generate.js +20 -10
  182. package/dist/flows/generate.js.map +1 -1
  183. package/dist/flows/pack.js +3 -3
  184. package/dist/flows/pack.js.map +1 -1
  185. package/dist/flows/paths.js +57 -0
  186. package/dist/flows/paths.js.map +1 -0
  187. package/dist/flows/repair.js +111 -23
  188. package/dist/flows/repair.js.map +1 -1
  189. package/dist/flows/run.js +153 -57
  190. package/dist/flows/run.js.map +1 -1
  191. package/dist/flows/schema.js +50 -5
  192. package/dist/flows/schema.js.map +1 -1
  193. package/dist/flows/seedExec.js +4 -4
  194. package/dist/flows/seedExec.js.map +1 -1
  195. package/dist/flows/templates.js +5 -5
  196. package/dist/index.js +50 -8
  197. package/dist/index.js.map +1 -1
  198. package/dist/issues/classify.js +16 -16
  199. package/dist/issues/classify.js.map +1 -1
  200. package/dist/issues/fingerprint.js +24 -4
  201. package/dist/issues/fingerprint.js.map +1 -1
  202. package/dist/issues/index.js +94 -31
  203. package/dist/issues/index.js.map +1 -1
  204. package/dist/issues/metrics.js +4 -4
  205. package/dist/issues/metrics.js.map +1 -1
  206. package/dist/issues/recurrence.js +35 -8
  207. package/dist/issues/recurrence.js.map +1 -1
  208. package/dist/issues/report.js +4 -4
  209. package/dist/issues/report.js.map +1 -1
  210. package/dist/issues/reportBridge.js +4 -4
  211. package/dist/issues/reportBridge.js.map +1 -1
  212. package/dist/issues/schema.js +2 -2
  213. package/dist/issues/schema.js.map +1 -1
  214. package/dist/issues/sourceRevision.js +2 -2
  215. package/dist/issues/sourceRevision.js.map +1 -1
  216. package/dist/issues/store.js +110 -32
  217. package/dist/issues/store.js.map +1 -1
  218. package/dist/lib/abortScope.js +48 -0
  219. package/dist/lib/abortScope.js.map +1 -0
  220. package/dist/lib/android.js +75 -7
  221. package/dist/lib/android.js.map +1 -1
  222. package/dist/lib/coordSpace.js +1 -1
  223. package/dist/lib/coordSpace.js.map +1 -1
  224. package/dist/lib/device.js +32 -7
  225. package/dist/lib/device.js.map +1 -1
  226. package/dist/lib/gestures.js +141 -0
  227. package/dist/lib/gestures.js.map +1 -0
  228. package/dist/lib/gitignore.js +4 -3
  229. package/dist/lib/gitignore.js.map +1 -1
  230. package/dist/lib/image.js +1 -1
  231. package/dist/lib/image.js.map +1 -1
  232. package/dist/lib/lockfile.js +370 -31
  233. package/dist/lib/lockfile.js.map +1 -1
  234. package/dist/lib/needsInput.js +3 -3
  235. package/dist/lib/needsInput.js.map +1 -1
  236. package/dist/lib/png.js +2 -2
  237. package/dist/lib/png.js.map +1 -1
  238. package/dist/lib/redact.js +170 -9
  239. package/dist/lib/redact.js.map +1 -1
  240. package/dist/lib/result.js +79 -10
  241. package/dist/lib/result.js.map +1 -1
  242. package/dist/lib/schemaHash.js +3 -3
  243. package/dist/lib/schemaHash.js.map +1 -1
  244. package/dist/lib/sensitive.js +3 -2
  245. package/dist/lib/sensitive.js.map +1 -1
  246. package/dist/lib/simctl.js +3 -3
  247. package/dist/lib/simctl.js.map +1 -1
  248. package/dist/lib/spawn.js +52 -10
  249. package/dist/lib/spawn.js.map +1 -1
  250. package/dist/lib/toolAnnotations.js +114 -0
  251. package/dist/lib/toolAnnotations.js.map +1 -0
  252. package/dist/lib/wda.js +294 -15
  253. package/dist/lib/wda.js.map +1 -1
  254. package/dist/mobileAudit/checks.js +12 -12
  255. package/dist/mobileAudit/checks.js.map +1 -1
  256. package/dist/mobileAudit/evidence.js +4 -4
  257. package/dist/mobileAudit/evidence.js.map +1 -1
  258. package/dist/mobileAudit/profiles.js +1 -1
  259. package/dist/mobileAudit/profiles.js.map +1 -1
  260. package/dist/mobileAudit/results.js +3 -3
  261. package/dist/mobileAudit/results.js.map +1 -1
  262. package/dist/mobileAudit/runner.js +72 -18
  263. package/dist/mobileAudit/runner.js.map +1 -1
  264. package/dist/oracle/auth.js +1 -1
  265. package/dist/oracle/auth.js.map +1 -1
  266. package/dist/oracle/failures.js +219 -36
  267. package/dist/oracle/failures.js.map +1 -1
  268. package/dist/oracle/health.js +63 -17
  269. package/dist/oracle/health.js.map +1 -1
  270. package/dist/oracle/locator.js +13 -13
  271. package/dist/oracle/locator.js.map +1 -1
  272. package/dist/oracle/record.js +3 -3
  273. package/dist/oracle/record.js.map +1 -1
  274. package/dist/orchestration/envelope.js +2 -2
  275. package/dist/orchestration/envelope.js.map +1 -1
  276. package/dist/orchestration/goal.js +4 -4
  277. package/dist/orchestration/goal.js.map +1 -1
  278. package/dist/orchestration/testThis/execute.js +62 -21
  279. package/dist/orchestration/testThis/execute.js.map +1 -1
  280. package/dist/orchestration/testThis/pipeline.js +119 -30
  281. package/dist/orchestration/testThis/pipeline.js.map +1 -1
  282. package/dist/orchestration/testThis/plan.js +162 -73
  283. package/dist/orchestration/testThis/plan.js.map +1 -1
  284. package/dist/orchestration/testThis/sessionIntent.js +72 -0
  285. package/dist/orchestration/testThis/sessionIntent.js.map +1 -0
  286. package/dist/orchestration/testThis/terminal.js +34 -16
  287. package/dist/orchestration/testThis/terminal.js.map +1 -1
  288. package/dist/orchestration/testThis/types.js +1 -1
  289. package/dist/orchestration/testThis/types.js.map +1 -1
  290. package/dist/plan/plan.js +9 -9
  291. package/dist/plan/plan.js.map +1 -1
  292. package/dist/prompts/index.js +22 -22
  293. package/dist/prompts/index.js.map +1 -1
  294. package/dist/report/export.js +392 -37
  295. package/dist/report/export.js.map +1 -1
  296. package/dist/report/findingsDedupe.js +41 -0
  297. package/dist/report/findingsDedupe.js.map +1 -0
  298. package/dist/report/policy.js +7 -4
  299. package/dist/report/policy.js.map +1 -1
  300. package/dist/report/qaLevel.js +8 -8
  301. package/dist/report/qaLevel.js.map +1 -1
  302. package/dist/report/sarifSources.js +160 -0
  303. package/dist/report/sarifSources.js.map +1 -0
  304. package/dist/report/summary.js +2 -2
  305. package/dist/report/summary.js.map +1 -1
  306. package/dist/report/testCatalog.js +4 -4
  307. package/dist/report/testCatalog.js.map +1 -1
  308. package/dist/report/toolHealth.js +124 -0
  309. package/dist/report/toolHealth.js.map +1 -0
  310. package/dist/server.js +472 -45
  311. package/dist/server.js.map +1 -1
  312. package/dist/services/automationGenerate.js +8 -2
  313. package/dist/services/automationGenerate.js.map +1 -1
  314. package/dist/services/build.js +2 -2
  315. package/dist/services/build.js.map +1 -1
  316. package/dist/{tools → services}/flowGenerate.js +29 -13
  317. package/dist/services/flowGenerate.js.map +1 -0
  318. package/dist/services/preflight.js +4 -4
  319. package/dist/services/preflight.js.map +1 -1
  320. package/dist/services/prepareAndroid.js +46 -8
  321. package/dist/services/prepareAndroid.js.map +1 -1
  322. package/dist/services/prepareIos.js +24 -9
  323. package/dist/services/prepareIos.js.map +1 -1
  324. package/dist/services/report.js +100 -45
  325. package/dist/services/report.js.map +1 -1
  326. package/dist/services/smoke.js +32 -16
  327. package/dist/services/smoke.js.map +1 -1
  328. package/dist/services/suiteGenerate.js +28 -3
  329. package/dist/services/suiteGenerate.js.map +1 -1
  330. package/dist/services/testSuiteKnowledge.js +40 -27
  331. package/dist/services/testSuiteKnowledge.js.map +1 -1
  332. package/dist/session/attach.js +270 -6
  333. package/dist/session/attach.js.map +1 -1
  334. package/dist/session/processRegistry.js +317 -48
  335. package/dist/session/processRegistry.js.map +1 -1
  336. package/dist/session/progress.js +1 -1
  337. package/dist/session/retention.js +201 -0
  338. package/dist/session/retention.js.map +1 -0
  339. package/dist/session/store.js +275 -48
  340. package/dist/session/store.js.map +1 -1
  341. package/dist/snapshot/overlays.js +53 -8
  342. package/dist/snapshot/overlays.js.map +1 -1
  343. package/dist/snapshot/parse.js +28 -4
  344. package/dist/snapshot/parse.js.map +1 -1
  345. package/dist/snapshot/present.js +11 -5
  346. package/dist/snapshot/present.js.map +1 -1
  347. package/dist/snapshot/settle.js +39 -9
  348. package/dist/snapshot/settle.js.map +1 -1
  349. package/dist/state/consent.js +99 -0
  350. package/dist/state/consent.js.map +1 -0
  351. package/dist/state/profile.js +46 -2
  352. package/dist/state/profile.js.map +1 -1
  353. package/dist/suite/compile.js +9 -5
  354. package/dist/suite/compile.js.map +1 -1
  355. package/dist/suite/lint.js +4 -4
  356. package/dist/suite/lint.js.map +1 -1
  357. package/dist/suite/pom.js +50 -41
  358. package/dist/suite/pom.js.map +1 -1
  359. package/dist/suite/secretGuard.js +266 -0
  360. package/dist/suite/secretGuard.js.map +1 -0
  361. package/dist/suite/testcase.js +9 -7
  362. package/dist/suite/testcase.js.map +1 -1
  363. package/dist/testSuite/exporter.js +4 -4
  364. package/dist/testSuite/exporter.js.map +1 -1
  365. package/dist/testSuite/generator.js +13 -9
  366. package/dist/testSuite/generator.js.map +1 -1
  367. package/dist/testSuite/history.js +1 -1
  368. package/dist/testSuite/history.js.map +1 -1
  369. package/dist/testSuite/issueLinks.js +3 -3
  370. package/dist/testSuite/issueLinks.js.map +1 -1
  371. package/dist/testSuite/lint.js +4 -4
  372. package/dist/testSuite/lint.js.map +1 -1
  373. package/dist/testSuite/merge.js +5 -5
  374. package/dist/testSuite/merge.js.map +1 -1
  375. package/dist/testSuite/schema.js +5 -5
  376. package/dist/testSuite/schema.js.map +1 -1
  377. package/dist/testSuite/store.js +3 -3
  378. package/dist/testSuite/store.js.map +1 -1
  379. package/dist/testSuite/traceability.js +2 -2
  380. package/dist/testSuite/traceability.js.map +1 -1
  381. package/dist/tools/act.js +794 -164
  382. package/dist/tools/act.js.map +1 -1
  383. package/dist/tools/agent.js +451 -128
  384. package/dist/tools/agent.js.map +1 -1
  385. package/dist/tools/appControl.js +69 -19
  386. package/dist/tools/appControl.js.map +1 -1
  387. package/dist/tools/appMap.js +188 -130
  388. package/dist/tools/appMap.js.map +1 -1
  389. package/dist/tools/build.js +32 -42
  390. package/dist/tools/build.js.map +1 -1
  391. package/dist/tools/bundletool.js +21 -31
  392. package/dist/tools/bundletool.js.map +1 -1
  393. package/dist/tools/clearOverlay.js +55 -12
  394. package/dist/tools/clearOverlay.js.map +1 -1
  395. package/dist/tools/device.js +76 -24
  396. package/dist/tools/device.js.map +1 -1
  397. package/dist/tools/doctor.js +68 -28
  398. package/dist/tools/doctor.js.map +1 -1
  399. package/dist/tools/explore.js +41 -47
  400. package/dist/tools/explore.js.map +1 -1
  401. package/dist/tools/featureTesting.js +31 -48
  402. package/dist/tools/featureTesting.js.map +1 -1
  403. package/dist/tools/firstRun.js +34 -41
  404. package/dist/tools/firstRun.js.map +1 -1
  405. package/dist/tools/flow.js +183 -103
  406. package/dist/tools/flow.js.map +1 -1
  407. package/dist/tools/flowRepair.js +25 -13
  408. package/dist/tools/flowRepair.js.map +1 -1
  409. package/dist/tools/generate.js +52 -89
  410. package/dist/tools/generate.js.map +1 -1
  411. package/dist/tools/getArtifact.js +16 -5
  412. package/dist/tools/getArtifact.js.map +1 -1
  413. package/dist/tools/health.js +15 -12
  414. package/dist/tools/health.js.map +1 -1
  415. package/dist/tools/ios.js +45 -223
  416. package/dist/tools/ios.js.map +1 -1
  417. package/dist/tools/issues.js +251 -35
  418. package/dist/tools/issues.js.map +1 -1
  419. package/dist/tools/jobs.js +41 -16
  420. package/dist/tools/jobs.js.map +1 -1
  421. package/dist/tools/metro.js +36 -35
  422. package/dist/tools/metro.js.map +1 -1
  423. package/dist/tools/mobileAudit.js +50 -45
  424. package/dist/tools/mobileAudit.js.map +1 -1
  425. package/dist/tools/network.js +31 -14
  426. package/dist/tools/network.js.map +1 -1
  427. package/dist/tools/note.js +26 -26
  428. package/dist/tools/note.js.map +1 -1
  429. package/dist/tools/prepareIosTarget.js +10 -16
  430. package/dist/tools/prepareIosTarget.js.map +1 -1
  431. package/dist/tools/prepareTarget.js +117 -50
  432. package/dist/tools/prepareTarget.js.map +1 -1
  433. package/dist/tools/report.js +11 -22
  434. package/dist/tools/report.js.map +1 -1
  435. package/dist/tools/resolveArtifact.js +11 -15
  436. package/dist/tools/resolveArtifact.js.map +1 -1
  437. package/dist/tools/resolveTarget.js +78 -24
  438. package/dist/tools/resolveTarget.js.map +1 -1
  439. package/dist/tools/screenRecord.js +23 -21
  440. package/dist/tools/screenRecord.js.map +1 -1
  441. package/dist/tools/screenshot.js +23 -16
  442. package/dist/tools/screenshot.js.map +1 -1
  443. package/dist/tools/smoke.js +20 -16
  444. package/dist/tools/smoke.js.map +1 -1
  445. package/dist/tools/snapshot.js +155 -118
  446. package/dist/tools/snapshot.js.map +1 -1
  447. package/dist/tools/startSession.js +104 -116
  448. package/dist/tools/startSession.js.map +1 -1
  449. package/dist/tools/suite.js +72 -43
  450. package/dist/tools/suite.js.map +1 -1
  451. package/dist/tools/testSuite.js +30 -20
  452. package/dist/tools/testSuite.js.map +1 -1
  453. package/dist/tools/testThis.js +24 -28
  454. package/dist/tools/testThis.js.map +1 -1
  455. package/dist/tools/visual.js +686 -210
  456. package/dist/tools/visual.js.map +1 -1
  457. package/dist/tools/wait.js +9 -38
  458. package/dist/tools/wait.js.map +1 -1
  459. package/dist/tools/wda.js +187 -57
  460. package/dist/tools/wda.js.map +1 -1
  461. package/dist/version.js +31 -22
  462. package/dist/version.js.map +1 -1
  463. package/dist/visual/ocr.js +53 -6
  464. package/dist/visual/ocr.js.map +1 -1
  465. package/dist/visual/provider.js +80 -12
  466. package/dist/visual/provider.js.map +1 -1
  467. package/docs/README.md +24 -10
  468. package/docs/ci-reports.md +328 -0
  469. package/docs/concepts.md +227 -0
  470. package/docs/flows.md +153 -0
  471. package/docs/mcp-server.md +194 -128
  472. package/docs/physical-devices.md +84 -0
  473. package/docs/tools.md +812 -152
  474. package/package.json +3 -2
  475. package/dist/tools/assertVisual.js +0 -84
  476. package/dist/tools/assertVisual.js.map +0 -1
  477. package/dist/tools/automationGenerate.js.map +0 -1
  478. package/dist/tools/capabilities.js +0 -179
  479. package/dist/tools/capabilities.js.map +0 -1
  480. package/dist/tools/detectContext.js +0 -41
  481. package/dist/tools/detectContext.js.map +0 -1
  482. package/dist/tools/flowGenerate.js.map +0 -1
  483. package/dist/tools/history.js +0 -86
  484. package/dist/tools/history.js.map +0 -1
  485. package/dist/tools/locator.js +0 -85
  486. package/dist/tools/locator.js.map +0 -1
  487. package/dist/tools/permissions.js +0 -174
  488. package/dist/tools/permissions.js.map +0 -1
  489. package/dist/tools/plan.js +0 -52
  490. package/dist/tools/plan.js.map +0 -1
  491. package/dist/tools/screenInfo.js +0 -76
  492. package/dist/tools/screenInfo.js.map +0 -1
  493. package/dist/tools/seed.js +0 -133
  494. package/dist/tools/seed.js.map +0 -1
  495. package/dist/tools/state.js +0 -217
  496. package/dist/tools/state.js.map +0 -1
  497. package/dist/tools/visualText.js +0 -106
  498. package/dist/tools/visualText.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,189 @@
2
2
 
3
3
  All notable public changes to Swipium are documented here.
4
4
 
5
+ ## 2.0.1 - 2026-09-30
6
+
7
+ A small maintenance release. No behavior changes for agents or flows.
8
+
9
+ ### Fixed
10
+
11
+ - SARIF exports (`qa_report format:"sarif"`) link the tool to the real repository, `https://github.com/GeroPalombo/swipium`. The old link pointed at a GitHub account that doesn't exist, which code-scanning pages show to users.
12
+
13
+ ### Changed
14
+
15
+ - Test fixtures no longer contain paths from a developer's machine.
16
+
17
+ ## 2.0.0 - 2026-09-30
18
+
19
+ Swipium 2.0.0 fixes the typing, gesture, and secret-handling defects in the core test loop, makes iOS Simulator sessions and background jobs more reliable, adds CI report exports and one visual tool, and narrows the public surface from 60 to 55 tools (6 removed, `qa_visual` added). **It removes and renames public tools and tightens several defaults.** Work through the upgrade checklist before upgrading.
20
+
21
+ ### Upgrade checklist
22
+
23
+ Items tagged **You** need an action from you. Items tagged **Automatic** happen on their own and are listed so they don't surprise you.
24
+
25
+ 1. **You:** restart your MCP client (or reload its server list) after upgrading. A client still holding the 1.5.x tool list gets `STALE_CLIENT` errors that name the replacement call.
26
+ 2. **You:** rename the environment variables your flows and `.swipium/fixtures.json` read through `${VAR}` so they start with `SWIPIUM_`. Other names no longer resolve from the server environment. See [README.md](README.md#configuration--environment-variables).
27
+ 3. **You:** in CI, install the app yourself (for example `adb install -r -g app.apk`) before the agent step. Every Swipium install now asks for consent, and nobody can approve it in CI. [docs/ci-reports.md](docs/ci-reports.md#github-actions-recipe-android) has a complete recipe.
28
+ 4. **You:** replace calls to removed tools using the [migration table](#migrating-from-150), and remove arguments a tool does not declare. They are now rejected with `INVALID_ARGUMENT` instead of being ignored.
29
+ 5. **You:** if you use a remote (non-loopback) WebDriverAgent, `ios.wda.allowNonLoopbackUrls` in `.swipium/config.json` no longer pre-approves it. Pass `allowNonLoopback: true` and approve the consent prompt, or set `SWIPIUM_ALLOW_REMOTE_WDA` to the exact URL in the MCP server environment.
30
+ 6. **You:** scripts that call `swipium <word>` with a word that is not a subcommand now exit with status `2` instead of starting a server. Use `swipium` or `swipium serve`.
31
+ 7. **You:** stop any Metro bundler or WebDriverAgent that a 1.5.x server started and left running. 2.0 only cleans up processes it recorded with a start-time and command fingerprint, and 1.5.x recorded none.
32
+ 8. **Automatic:** when a call has no `projectRoot`, no MCP roots, and no `SWIPIUM_PROJECT_ROOT` or `CLAUDE_PROJECT_DIR`, the server's working directory becomes the project root if it contains a project marker (see Breaking changes).
33
+ 9. **Automatic:** old session folders under `~/.swipium/runs` are pruned (see Added). Set `SWIPIUM_RETENTION_DAYS=off` to keep them.
34
+
35
+ ### Breaking changes
36
+
37
+ - **Removed and renamed tools.** See the migration table below (also at the end of `docs/tools.md`). A client still running a pre-upgrade server, or a saved prompt that calls a removed tool, gets a typed `STALE_CLIENT` error that names the replacement.
38
+ - **Environment variables in flows and fixtures.** Flows and `.swipium/fixtures.json` resolve `${VAR}` from the server environment only for names starting with `SWIPIUM_`. Explicit `variables` and inputs stored in the session still work. Generated flows and suites use `SWIPIUM_TEST_*` for stored inputs and `SWIPIUM_SECRET_N` for other secrets. `swipium init flows` templates use `SWIPIUM_TEST_EMAIL`, `SWIPIUM_TEST_PASSWORD` and `SWIPIUM_TEST_DEEP_LINK` (was `TEST_DEEP_LINK`). Rename any other variables your flows read from the environment.
39
+ - **Every app install asks for consent**, including an APK inside the project (Android now matches iOS). Only an app already installed on a running emulator skips the prompt.
40
+ - **Unknown tool arguments are rejected** with `INVALID_ARGUMENT`, which lists the accepted parameters, and nothing runs. They used to be ignored silently, so a call such as `qa_app_control {appId:"other.app"}` ran against the session's app.
41
+ - **Remote WebDriverAgent.** A repository config can no longer pre-approve a non-loopback WDA: `ios.wda.allowNonLoopbackUrls` is ignored as an approval. Use `allowNonLoopback: true` with consent, or the user-level `SWIPIUM_ALLOW_REMOTE_WDA`.
42
+ - **Project root from the server's working directory.** 1.5.0 never used the working directory: without `projectRoot` or MCP roots it asked for a path. 2.0 falls back to `SWIPIUM_PROJECT_ROOT`, then `CLAUDE_PROJECT_DIR`, then the working directory when it is not `/` or `$HOME` and contains a project marker. A server launched inside an app directory now works in that directory without asking. The result's `rootSource` says which one was used.
43
+ - **Physical devices.** A single USB phone is no longer bound automatically, and `preferRealDevice: true` or an iOS build that installs only on real hardware returns `PHYSICAL_DEVICE_UNSUPPORTED` (was `BACKEND_UNSUPPORTED`). `qa_resolve_target` no longer plans a real device. See [docs/physical-devices.md](docs/physical-devices.md).
44
+ - **Consent risk of source builds.** `build_from_source` is `high` risk (was `medium`), and `start_metro` is `medium` (was `low`). Prompts and the mutation ledger show the new level, and an executed high-risk build lowers the report's readiness score.
45
+ - **CLI:** an unknown subcommand prints usage and exits `2` instead of starting the server. Unknown `--flags` (such as `--stdio`) still start the server, with a warning.
46
+
47
+ ### Migrating from 1.5.0
48
+
49
+ | 1.5.0 call | Now |
50
+ | --- | --- |
51
+ | `qa_agent_brief`, `qa_capabilities` | Server `instructions` (sent at connect), or `qa_status` without `sessionId` |
52
+ | `qa_next_best_action {sessionId, goal}` | `qa_status {sessionId, goal}` (always returns `nextBestAction`) |
53
+ | `qa_detect_context` | `qa_resolve_target {include:["context"]}` |
54
+ | `qa_plan {sessionId}` | `qa_resolve_target {sessionId, include:["plan"]}` |
55
+ | `qa_assert_visual` | `qa_visual {mode:"assert", assertion, pass}` |
56
+ | `qa_ios action:"wda_status"` / `"wda_attach"` | `qa_wda action:"status"` / `"attach"` |
57
+ | `qa_ios action:"screenshot"` | `qa_screenshot` |
58
+ | `qa_wait {for:"job_done"}` | `qa_job_status {jobId, waitMs}` |
59
+ | `qa_wda {udid}` | `qa_wda {device}` (`udid` still accepted) |
60
+ | `qa_suite_generate {creativityLevel}` | `qa_suite_generate {creativity}` (`creativityLevel` still accepted) |
61
+ | `qa_mobile_audit {waitForCompletion}` | removed; passing it returns `INVALID_ARGUMENT` |
62
+
63
+ ### Added
64
+
65
+ - `qa_visual`: one screenshot-based tool with `mode:"assert"|"baseline"|"diff"|"find_text"|"find_image"`. Because it needs only screenshots, it also works on an iOS Simulator without WebDriverAgent, where `qa_snapshot` and `qa_act` are unavailable. `find_text` and `find_image` return tappable device coordinates (points on iOS) and can tap them (`tap:true`, through `idb` on a simulator without WebDriverAgent). Those taps are recorded and budgeted like `qa_act` taps. `find_text` is consent-gated and needs a local OCR command (`SWIPIUM_OCR_CMD` or `ocrCommand` in `.swipium/config.json`). Without one it returns `OCR_NOT_CONFIGURED` with the provider contract and a tesseract example.
66
+ - `qa_issue_log` lifecycle: `mode:"history"` (default, the 1.5.0 behavior), `"log"`, `"mark_fixed"` (`fixedInCommit`, `fixedInVersion`, `howFixed`), `"verify_fixed"` (`evidenceUris`), `"suppress"` (`suppressionScope`, a `suppressedUntil` expiry, and `unsuppress:true`), and `"metrics"` (`groupBy`). A manually logged issue is identified by its title, category and platform, and a title with no identifying words returns `ISSUE_LOG_TOO_VAGUE`. Lifecycle errors are typed: `ISSUE_NOT_FOUND`, `ISSUE_STATE_INVALID`, `ISSUE_EVIDENCE_REQUIRED`. An issue marked fixed and seen again is classified as a regression.
67
+ - CI exports: `qa_report format:"junit"|"sarif"|"github-summary"`, and a `swipium report` CLI (`--latest --format … --out … --fail-on-gate`) that renders the last saved report and exits `1` when the `.swipium/policy.json` release gate blocks. SARIF results point at real repository files so GitHub code scanning shows them. `docs/ci-reports.md` has a complete GitHub Actions recipe (Android emulator, headless Claude Code, report, SARIF upload, JUnit).
68
+ - `qa_act observe:"diff"|"full"|"none"`, and `warnings[]` in `qa_act` results.
69
+ - `qa_job_status waitMs` long-polls until the job leaves `running` (up to 120 s). `qa_status` accepts `goal` to bias `nextBestAction`.
70
+ - `qa_test_this`: `responseMode`, and a compact report summary in the terminal result.
71
+ - `qa_explain_blocker` accepts `sessionId`, so `qa_status` moves past the blocker it explained.
72
+ - `qa_app_control` results carry `changedState`, which is `false` when the call failed before changing anything.
73
+ - MCP tool annotations on every tool. Read-only tools carry `readOnlyHint: true` and `openWorldHint: false`; every other tool also sets `destructiveHint` and `idempotentHint`. Clients can use them to auto-approve read-only calls. The server also sends `instructions` with the operating guide.
74
+ - MCP resource listing for session artifacts and app-map sections, scoped to the current project and excluding sensitive-mode sessions.
75
+ - Consent through MCP elicitation: on clients that support it, privileged actions are approved in a real user prompt. A declined prompt returns `CONSENT_DECLINED`, and the mutation ledger records how each action was approved (`elicitation`, `client-assertion`, or `policy`). `SWIPIUM_REQUIRE_ELICITATION=1` refuses every consent-gated action on clients without elicitation (`CONSENT_REFUSED`).
76
+ - CLI: `swipium --help`, `--version`, `swipium serve`, `swipium init cursor`, `swipium init vscode`, and `init --cwd <dir>`.
77
+ - Disk retention: when the session registry is first loaded, Swipium prunes, in the background, `~/.swipium/runs` session folders older than 30 days that are not in the session registry and are not among the newest 20 of their project. `SWIPIUM_RETENTION_DAYS=0|off` disables the prune, and `SWIPIUM_RETENTION_KEEP` sets how many recent sessions per project are kept. If `~/.swipium/registry.json` cannot be read, nothing is deleted. `swipium gc [--dry-run] [--days N] [--keep N]` reclaims space on demand, and `~/.swipium/projects.json` drops entries for deleted projects.
78
+ - `qa_device_info` on iOS Simulators returns name, runtime, state, and screen size. `qa_resolve_target include:["context"]` lists booted and available iOS Simulators.
79
+ - `qa_wda build` and `start` find an Appium-installed WebDriverAgent project (under `$APPIUM_HOME`, `~/.appium`, or the global npm roots) when `wdaProjectPath` is not given.
80
+
81
+ ### Changed
82
+
83
+ - Project root resolution: explicit `projectRoot` > MCP roots > `SWIPIUM_PROJECT_ROOT` > `CLAUDE_PROJECT_DIR` > the server's working directory, which is used only when it is not `/` or `$HOME` and contains a project marker (`package.json`, `app.json`, `pubspec.yaml`, Gradle or Xcode files, `Podfile`, `android/`, `ios/`). Results report where the root came from (`rootSource`). An unresolved root fails with `PROJECT_ROOT_UNRESOLVED`. `qa_flow_check` and `qa_flow_run mode:"plan"` resolve the root the same way. See [docs/concepts.md](docs/concepts.md#project-root).
84
+ - **`qa_status`** without `sessionId` returns first-call orientation instead of an error. With a session, it follows the last job: after a finished run it recommends that run's next action (read the report, explain the blocker, answer the question) instead of `qa_smoke` again, and it stops repeating advice that was already followed.
85
+ - **`qa_test_this`:**
86
+ - It never installs on a physical phone. With a phone connected it waits for the emulator it planned to boot; when a phone is the only option it returns `PHYSICAL_DEVICE_UNSUPPORTED`.
87
+ - `needs_input` is a terminal job state. A credentials question found during a run is returned instead of dropped.
88
+ - On iOS without WebDriverAgent it no longer blocks by default. It skips suite generation and exploration and runs a visual-only smoke. It still blocks when you explicitly ask for work that needs WebDriverAgent.
89
+ - **Response format in normal mode:** the JSON block in the text channel is compact and omits keys the text above it already shows; `renderedAbove` lists the omitted keys (a 32-element `qa_snapshot` is under half its 1.5.0 size). `responseMode: "verbose"` restores every key, and `structuredContent` always carries the full payload. `qa_act` returns only the elements that changed once a snapshot exists (`observe:"diff"`), and falls back to the full list when most of the screen changed.
90
+ - Consent challenges (`consentId`) expire after 30 minutes, and at most 200 are pending at once. See [docs/concepts.md](docs/concepts.md#consent).
91
+ - An unknown `sessionId` returns `INVALID_ARGUMENT`.
92
+ - `qa_prepare_target` with several devices online and no `device` returns `MULTIPLE_DEVICES`.
93
+ - `qa_network` on an iOS Simulator returns `BACKEND_UNSUPPORTED` (airplane-mode control is Android-only). A toggle that fails on the device leaves no restore record behind.
94
+ - Flow and fixture variables whose names contain `code` (such as `SWIPIUM_VERIFICATION_CODE`) are treated as secrets, like names containing `pass`, `secret`, `token`, `otp`, `pin`, `cvv` or `key`.
95
+ - `swipium init` writes a portable `npx -y swipium` command for project-scoped registrations (shared `.mcp.json`, Gemini project settings, Cursor, VS Code). Absolute paths are used only for user or local scope. Codex registrations include `startup_timeout_sec = 30` and `tool_timeout_sec = 600`.
96
+ - `adb` and `emulator` are found through `ANDROID_HOME`, `ANDROID_SDK_ROOT`, or the OS default SDK location when they are not on `PATH` (useful for GUI-launched clients). See [docs/mcp-server.md](docs/mcp-server.md#requirements).
97
+ - `qa_doctor` checks both platforms by default on macOS, and checks the Node version against `engines`.
98
+ - `qa_mobile_audit` `resilience` and `release_gate` profiles ask for network-change consent before toggling airplane mode, and restore its original state afterwards.
99
+ - `qa_continue_from_blocker` returns `ignored[]` for answers the resumed tool cannot use, and replays the goal and flags of the interrupted `qa_test_this` call.
100
+ - `qa_flow_repair` proposes elements of the same kind ranked by text similarity and refuses to apply low-confidence repairs. A failed `qa_flow_run` points to it.
101
+ - `qa_report` merges identical findings into one with a count, and reports `DEGRADED` tool status when tools failed during the run. Cancelled calls, unknown sessions, invalid app IDs, and deliberate refusals do not count as tool errors.
102
+ - `qa_generate` returns `NO_RECORDED_ACTIONS` for every target when the session has recorded no actions.
103
+ - Errors that returned `UNKNOWN` now carry typed codes (`INVALID_ARGUMENT`, `FLOW_NOT_FOUND`, `KEYBOARD_NOT_DISMISSIBLE`, `CAPTURE_WITHHELD_SECURE`, `SENSITIVE_MODE_REFUSED`, `NO_DEVICE`, `CANCELLED`).
104
+ - Fewer device round trips per action: adaptive settle interval, bounded screen-dump timeouts, a cheaper foreground and health check, longer-lived screen-size caches, and one keyboard lookup per action.
105
+
106
+ ### Fixed
107
+
108
+ **Android**
109
+
110
+ - Typing escapes every shell metacharacter (including `{ } [ ]`), types a literal `%s` correctly, and treats empty text as a no-op. Characters `adb input text` cannot deliver fail with `TEXT_INPUT_UNSUPPORTED`, and replace-mode typing refuses them before clearing the field.
111
+ - Deep links and launch extras containing `&`, spaces, or `;` reach the app intact.
112
+ - An emulator that is still booting is no longer bound automatically (`DEVICE_NOT_READY`). Network-attached emulators (such as `localhost:5555`) are accepted. A missing `adb` returns `ADB_NOT_FOUND`.
113
+ - Snapshots skip rows Android reports as scrolled off the list or that lie off-screen, so `scroll untilVisible` no longer reports an off-screen row as found and taps no longer land on the list edge.
114
+ - Apps whose package name contains `debug` or `alert` no longer show false banner or snackbar overlays.
115
+
116
+ **Gestures and actions (both platforms)**
117
+
118
+ - Swipe and scroll geometry comes from the live screen size, accounts for rotation, and keeps clear of screen edges. The old fixed 1080×2400 coordinates were off-screen on iOS.
119
+ - Scrolls start inside the scrollable list rather than the screen center, a plain `scroll` performs one swipe, and `changed` also reflects content that moved. `scroll untilVisible` checks before the first swipe and reports `endOfList` only when the list stopped moving.
120
+ - Tapping a control hidden under the soft keyboard no longer types into the field. When the keyboard covers the target, Swipium hides the keyboard, finds the target again, and returns `KEYBOARD_OBSTRUCTION` if it is still covered. When the keyboard area is unknown, it taps and returns a warning.
121
+ - Tapping a switch or checkbox is detected as a change instead of being retried and toggled back.
122
+ - Navigation bars, list rows, and text fields are no longer reported as banner or snackbar overlays. A password field's show/hide button keeps its label in snapshots; only secure values are masked.
123
+ - Flow `clearOverlay` no longer presses BACK on a plain screen (which could leave the app). It dismisses dialogs, sheets, and dev overlays (iOS alerts through the alert API) and reports when there was nothing to clear.
124
+
125
+ **iOS**
126
+
127
+ - A resumed iOS session is rebound to its own simulator (through WebDriverAgent when it was attached), never to another device, and reuses the running app instead of relaunching it.
128
+ - A managed WebDriverAgent started by a previous server run is adopted at startup when it is healthy and less than 12 hours old, so a resumed session keeps structured automation. It is recognized even though Xcode's `xcodebuild` shim re-executes under its full path, and `qa_wda stop` can stop it, including when its registry entry was lost.
129
+ - Recovery from an expired WebDriverAgent session no longer relaunches or terminates the app, every WebDriverAgent call has a request timeout, and a brief outage while resuming no longer downgrades the session permanently.
130
+ - A session that fell back to visual-only on one slow screen returns to structured mode once screen dumps work again. `qa_status` reports a simulator session without WebDriverAgent as `visual-only`.
131
+ - `qa_ios launch` and `terminate` work while WebDriverAgent is attached. `qa_app_control background` waits for the home screen and reports the real foreground app, or `unknown` when WebDriverAgent cannot tell.
132
+ - `press key:"back"` taps the navigation bar's back button or swipes from the left edge. It reuses the last settled screen dump only for 3 s, and never after the screen changed, so it does not press a back button that is no longer there.
133
+ - Snapshots include accessibility identifiers and search and text fields, so typed values can be read back. Keyboard detection works through WebDriverAgent.
134
+ - After `qa_ios boot`, next steps point at iOS tools, and target plans count simulators.
135
+
136
+ **Sessions and jobs**
137
+
138
+ - Cancelling one call no longer cancels another: each tool call and background job carries its own cancel signal. Cancelled calls and jobs return `CANCELLED` and are never recorded as tool errors or findings.
139
+ - App-map and session state writes are atomic and locked. A stale lock is taken over safely (the lock can no longer spin forever and block startup), long app-map scans run outside the lock, and a corrupt `app-map.json` is restored from history.
140
+ - Fixtures are reloaded from `.swipium/fixtures.json` on resume instead of being replayed as `«redacted»` after a restart.
141
+ - Monorepos: answering the "which app?" question selects that app instead of being treated as a device ID, and the question is not asked again.
142
+ - An orphaned Metro started through `npx` is cleaned up after a crash, including on Linux when it was recorded while its `#!/usr/bin/env node` launcher was still starting. A child process that exits before reading its stdin can no longer crash the server.
143
+
144
+ **Generation**
145
+
146
+ - Generated Appium suites perform real scroll and swipe gestures, and a scroll recorded without a target replays in the right direction. Steps that cannot be generated fail with `UNEMITTABLE_STEP` instead of producing no-op code.
147
+ - Generated JavaScript suites contain no TypeScript-only syntax, and JavaScript and Python suites compile when element labels are keywords, start with digits, or contain quotes or backslashes. The Python generator passes its own validation.
148
+ - Generated suites default to the session's platform (iOS sessions get XCUITest), and `qa_visual mode:"assert"` steps become marked manual checks.
149
+ - Common-word passwords ("test", "password") no longer rewrite selectors or block generation on template text.
150
+ - Suite files from `qa_test_this generateSuite:true` are fetchable `swipium://` artifacts.
151
+
152
+ **Reports and issues**
153
+
154
+ - JUnit exports are always well-formed XML, and failures the release-gate policy ignores are reported as skipped. GitHub step summaries stay below GitHub's 1 MiB limit.
155
+ - The issue ledger is locked across processes, and issues recorded by 1.5.x keep their identity.
156
+ - The documented tesseract OCR setup works: the provider runs from the project root, a crashing provider returns `OCR_PROVIDER_FAILED`, and screenshots are written where macOS tesseract can read them.
157
+
158
+ **CLI**
159
+
160
+ - `swipium scan` writes nothing when it cannot identify a project, and the docs and CLI no longer mention the nonexistent `swipium plan` and `swipium ci` commands.
161
+
162
+ ### Security
163
+
164
+ - A consent prompt the user dismisses or leaves unanswered is a refusal (`CONSENT_CANCELLED`); the agent cannot approve that action itself, and an open prompt cannot be bypassed with `approve:true`. Consent prompts strip control characters and are bound to the session that requested them.
165
+ - A cloned repository is treated as untrusted input. Flows and `.swipium/fixtures.json` cannot read server environment variables outside `SWIPIUM_*`, and values read from the environment are treated as secrets. An `openUrl` containing a variable is consent-gated. Consent shows the exact commands of flow seed steps and of repository-configured OCR and mask commands, labelled as unreviewed. A repository config can no longer pre-approve a non-loopback WebDriverAgent (the user can set `SWIPIUM_ALLOW_REMOTE_WDA` to allow specific URLs).
166
+ - Secrets never appear in error messages: a failed `adb input text` no longer echoes the typed value, and `qa_act` and flow errors are redacted.
167
+ - Values typed into secure fields (passwords, PINs, OTPs, CVVs) are redacted regardless of length with whole-token matching. JSON and XML artifacts are redacted structurally so they stay valid. Secrets shorter than 3 characters are reported as not redacted instead of blanking unrelated text, and a session resumed after a restart is flagged `redactionDegraded` in `qa_report`.
168
+ - Report exports (JUnit, SARIF, GitHub summary, Markdown, JSON) are redacted field by field before rendering, so escaping cannot defeat redaction.
169
+ - A value typed through a native selector into a secure field, or a registered secret typed into an ordinary field, is recorded as a secret (generated flows use `${SWIPIUM_TEST_PASSWORD}` instead of the plaintext), and every generator checks its output against the session's secrets: generation fails with `SECRET_IN_GENERATED_OUTPUT` and writes nothing rather than emit one. `state.json`, `test-suite.json`, and test cases no longer store secret values.
170
+ - `qa_visual` baseline names and template paths are confined to the project (`VISUAL_PATH_REFUSED`), and artifact names cannot escape the session directory. On screens Swipium cannot inspect, OCR results that look like credentials are withheld.
171
+ - Orphan-process cleanup only signals a process whose recorded start time and command still match, so a reused process ID can no longer be killed.
172
+ - App IDs are validated and quoted for the device shell. Sensitive mode suppresses screenshots in flows and smoke runs. `qa_issue_log` redacts session secrets before writing the ledger. Session folders and files are private (`0700` / `0600`), and OCR temp files live in private per-call directories.
173
+ - `THREAT_MODEL.md` documents the limits of the re-call consent convention and the stronger elicitation path.
174
+ - GitHub Actions in this repository's workflows are pinned to commit SHAs. Production dependencies are updated for advisories in transitive MCP SDK dependencies (`fast-uri`, `hono`, `@hono/node-server`, `body-parser`).
175
+
176
+ ### Known issues
177
+
178
+ - The first time an iOS session from a pre-2.0 WebDriverAgent run is rebound after upgrading, the app may be relaunched once.
179
+ - Stale-client hints (`STALE_CLIENT` for removed tools) depend on an internal of the MCP SDK. If a future SDK changes it, Swipium logs a warning and those calls get the SDK's plain "tool not found" error instead.
180
+ - Fixtures passed inline to `qa_start_session` come back without their values after a server restart. Fixtures in `.swipium/fixtures.json` are reloaded.
181
+ - On slow emulators a tap that navigates to a new screen can take several seconds, most of it spent on screen dumps.
182
+
183
+ ### Removed
184
+
185
+ - The tools listed in the migration table.
186
+ - Unregistered pre-1.5.0 tool modules that still shipped in `dist/`. `qa_seed`, `qa_permissions`, `qa_screen_info`, and `qa_locator_suggest` moved to `src/tools/deferred/`, which is excluded from the build and the npm package.
187
+
5
188
  ## 1.5.0 - 2026-07-03
6
189
 
7
190
  Swipium 1.5.0 is the production consolidation release. It narrows the MCP surface from 95 to 60 public tools, keeps the main simulator QA workflows, and moves lower-level/internal helpers out of the public contract so agents have fewer overlapping choices.