swipium 1.4.0 → 2.0.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 (541) hide show
  1. package/CHANGELOG.md +313 -0
  2. package/README.md +175 -219
  3. package/THREAT_MODEL.md +223 -47
  4. package/dist/appMap/automationLink.js +39 -26
  5. package/dist/appMap/automationLink.js.map +1 -1
  6. package/dist/appMap/build.js +68 -20
  7. package/dist/appMap/build.js.map +1 -1
  8. package/dist/appMap/codeIndex.js +31 -5
  9. package/dist/appMap/codeIndex.js.map +1 -1
  10. package/dist/appMap/featureIndex.js +23 -5
  11. package/dist/appMap/featureIndex.js.map +1 -1
  12. package/dist/appMap/featureModel.js +44 -8
  13. package/dist/appMap/featureModel.js.map +1 -1
  14. package/dist/appMap/firstRunApply.js +24 -6
  15. package/dist/appMap/firstRunApply.js.map +1 -1
  16. package/dist/appMap/fsWalk.js +19 -2
  17. package/dist/appMap/fsWalk.js.map +1 -1
  18. package/dist/appMap/issues.js +10 -30
  19. package/dist/appMap/issues.js.map +1 -1
  20. package/dist/appMap/migrations.js +6 -6
  21. package/dist/appMap/migrations.js.map +1 -1
  22. package/dist/appMap/prelaunch.js +2 -2
  23. package/dist/appMap/prelaunch.js.map +1 -1
  24. package/dist/appMap/projectRegistry.js +83 -11
  25. package/dist/appMap/projectRegistry.js.map +1 -1
  26. package/dist/appMap/provenance.js +2 -2
  27. package/dist/appMap/provenance.js.map +1 -1
  28. package/dist/appMap/query.js +21 -5
  29. package/dist/appMap/query.js.map +1 -1
  30. package/dist/appMap/runtimeMerge.js +12 -5
  31. package/dist/appMap/runtimeMerge.js.map +1 -1
  32. package/dist/appMap/schema.js +1 -1
  33. package/dist/appMap/schema.js.map +1 -1
  34. package/dist/appMap/screenMatch.js +6 -2
  35. package/dist/appMap/screenMatch.js.map +1 -1
  36. package/dist/appMap/staticScan.js +151 -39
  37. package/dist/appMap/staticScan.js.map +1 -1
  38. package/dist/appMap/store.js +58 -85
  39. package/dist/appMap/store.js.map +1 -1
  40. package/dist/appMap/tsAstScan.js +34 -12
  41. package/dist/appMap/tsAstScan.js.map +1 -1
  42. package/dist/artifacts/bundletool.js +49 -12
  43. package/dist/artifacts/bundletool.js.map +1 -1
  44. package/dist/artifacts/resolve.js +41 -14
  45. package/dist/artifacts/resolve.js.map +1 -1
  46. package/dist/automation/capabilities.js +112 -30
  47. package/dist/automation/capabilities.js.map +1 -1
  48. package/dist/automation/gestures.js +6 -2
  49. package/dist/automation/gestures.js.map +1 -1
  50. package/dist/automation/plan.js +71 -23
  51. package/dist/automation/plan.js.map +1 -1
  52. package/dist/automation/report.js +15 -5
  53. package/dist/automation/report.js.map +1 -1
  54. package/dist/automation/selectors.js +22 -28
  55. package/dist/automation/selectors.js.map +1 -1
  56. package/dist/automation/types.js +1 -1
  57. package/dist/automation/types.js.map +1 -1
  58. package/dist/automation/waits.js +14 -8
  59. package/dist/automation/waits.js.map +1 -1
  60. package/dist/automation/webview.js +9 -3
  61. package/dist/automation/webview.js.map +1 -1
  62. package/dist/automationGen/appiumModel.js +16 -8
  63. package/dist/automationGen/appiumModel.js.map +1 -1
  64. package/dist/automationGen/ciEmitter.js +6 -6
  65. package/dist/automationGen/ciEmitter.js.map +1 -1
  66. package/dist/automationGen/identifiers.js +224 -0
  67. package/dist/automationGen/identifiers.js.map +1 -0
  68. package/dist/automationGen/jsEmitter.js +288 -121
  69. package/dist/automationGen/jsEmitter.js.map +1 -1
  70. package/dist/automationGen/packagePatch.js +2 -2
  71. package/dist/automationGen/packagePatch.js.map +1 -1
  72. package/dist/automationGen/platformResolve.js +36 -0
  73. package/dist/automationGen/platformResolve.js.map +1 -0
  74. package/dist/automationGen/projectProfile.js +76 -27
  75. package/dist/automationGen/projectProfile.js.map +1 -1
  76. package/dist/automationGen/pythonEmitter.js +278 -107
  77. package/dist/automationGen/pythonEmitter.js.map +1 -1
  78. package/dist/automationGen/readmeEmitter.js +7 -6
  79. package/dist/automationGen/readmeEmitter.js.map +1 -1
  80. package/dist/automationGen/run.js +388 -0
  81. package/dist/automationGen/run.js.map +1 -0
  82. package/dist/automationGen/suitePlan.js +17 -10
  83. package/dist/automationGen/suitePlan.js.map +1 -1
  84. package/dist/automationGen/validation.js +52 -12
  85. package/dist/automationGen/validation.js.map +1 -1
  86. package/dist/build/parseBuildLog.js +235 -31
  87. package/dist/build/parseBuildLog.js.map +1 -1
  88. package/dist/build/plan.js +39 -18
  89. package/dist/build/plan.js.map +1 -1
  90. package/dist/ci/preflight.js +13 -4
  91. package/dist/ci/preflight.js.map +1 -1
  92. package/dist/cli/gc.js +74 -0
  93. package/dist/cli/gc.js.map +1 -0
  94. package/dist/cli/init.js +217 -26
  95. package/dist/cli/init.js.map +1 -1
  96. package/dist/cli/main.js +50 -0
  97. package/dist/cli/main.js.map +1 -0
  98. package/dist/cli/report.js +218 -0
  99. package/dist/cli/report.js.map +1 -0
  100. package/dist/cli/scan.js +36 -15
  101. package/dist/cli/scan.js.map +1 -1
  102. package/dist/cli/suite.js +7 -7
  103. package/dist/cli/suite.js.map +1 -1
  104. package/dist/cli/verify.js +7 -7
  105. package/dist/cli/verify.js.map +1 -1
  106. package/dist/consent/consent.js +162 -5
  107. package/dist/consent/consent.js.map +1 -1
  108. package/dist/context/detect.js +55 -18
  109. package/dist/context/detect.js.map +1 -1
  110. package/dist/context/findApps.js +22 -8
  111. package/dist/context/findApps.js.map +1 -1
  112. package/dist/context/projectRoot.js +174 -19
  113. package/dist/context/projectRoot.js.map +1 -1
  114. package/dist/context/scan.js +1 -1
  115. package/dist/context/scan.js.map +1 -1
  116. package/dist/core/capabilityGroups.js +90 -0
  117. package/dist/core/capabilityGroups.js.map +1 -0
  118. package/dist/core/target.js +10 -8
  119. package/dist/core/target.js.map +1 -1
  120. package/dist/core/targetPlan.js +160 -39
  121. package/dist/core/targetPlan.js.map +1 -1
  122. package/dist/drivers/DirectDriver.js +317 -43
  123. package/dist/drivers/DirectDriver.js.map +1 -1
  124. package/dist/drivers/SimctlDriver.js +124 -8
  125. package/dist/drivers/SimctlDriver.js.map +1 -1
  126. package/dist/drivers/WdaDriver.js +365 -55
  127. package/dist/drivers/WdaDriver.js.map +1 -1
  128. package/dist/explore/candidates.js +7 -3
  129. package/dist/explore/candidates.js.map +1 -1
  130. package/dist/explore/graph.js +15 -6
  131. package/dist/explore/graph.js.map +1 -1
  132. package/dist/explore/memory.js +4 -1
  133. package/dist/explore/memory.js.map +1 -1
  134. package/dist/explore/planner.js +54 -9
  135. package/dist/explore/planner.js.map +1 -1
  136. package/dist/explore/policy.js +11 -6
  137. package/dist/explore/policy.js.map +1 -1
  138. package/dist/explore/runner.js +363 -190
  139. package/dist/explore/runner.js.map +1 -1
  140. package/dist/explore/signatures.js +4 -2
  141. package/dist/explore/signatures.js.map +1 -1
  142. package/dist/explore/suite.js +3 -1
  143. package/dist/explore/suite.js.map +1 -1
  144. package/dist/featureTesting/executionBootstrap.js +137 -29
  145. package/dist/featureTesting/executionBootstrap.js.map +1 -1
  146. package/dist/featureTesting/featureMap.js +6 -3
  147. package/dist/featureTesting/featureMap.js.map +1 -1
  148. package/dist/featureTesting/featureScope.js +101 -20
  149. package/dist/featureTesting/featureScope.js.map +1 -1
  150. package/dist/featureTesting/mapFeatureScope.js +44 -15
  151. package/dist/featureTesting/mapFeatureScope.js.map +1 -1
  152. package/dist/featureTesting/objectiveModel.js +15 -11
  153. package/dist/featureTesting/objectiveModel.js.map +1 -1
  154. package/dist/featureTesting/resultMerge.js +16 -8
  155. package/dist/featureTesting/resultMerge.js.map +1 -1
  156. package/dist/featureTesting/sources.js +8 -5
  157. package/dist/featureTesting/sources.js.map +1 -1
  158. package/dist/featureTesting/suiteBridge.js +8 -2
  159. package/dist/featureTesting/suiteBridge.js.map +1 -1
  160. package/dist/featureTesting/synonyms.js +32 -4
  161. package/dist/featureTesting/synonyms.js.map +1 -1
  162. package/dist/featureTesting/testCaseFactory.js +27 -15
  163. package/dist/featureTesting/testCaseFactory.js.map +1 -1
  164. package/dist/featureTesting/testPlan.js +34 -12
  165. package/dist/featureTesting/testPlan.js.map +1 -1
  166. package/dist/firstRun/authStateMachine.js +1 -1
  167. package/dist/firstRun/authStateMachine.js.map +1 -1
  168. package/dist/firstRun/classifyScreen.js +9 -6
  169. package/dist/firstRun/classifyScreen.js.map +1 -1
  170. package/dist/firstRun/firstRunPlanner.js +16 -13
  171. package/dist/firstRun/firstRunPlanner.js.map +1 -1
  172. package/dist/firstRun/firstRunRunner.js +92 -31
  173. package/dist/firstRun/firstRunRunner.js.map +1 -1
  174. package/dist/firstRun/generatedDataPolicy.js +25 -15
  175. package/dist/firstRun/generatedDataPolicy.js.map +1 -1
  176. package/dist/firstRun/inputPlanner.js +45 -11
  177. package/dist/firstRun/inputPlanner.js.map +1 -1
  178. package/dist/firstRun/onboardingStateMachine.js +1 -1
  179. package/dist/firstRun/onboardingStateMachine.js.map +1 -1
  180. package/dist/firstRun/paywallPolicy.js +3 -3
  181. package/dist/firstRun/paywallPolicy.js.map +1 -1
  182. package/dist/firstRun/types.js +1 -1
  183. package/dist/firstRun/types.js.map +1 -1
  184. package/dist/fixtures/catalog.js +72 -9
  185. package/dist/fixtures/catalog.js.map +1 -1
  186. package/dist/fixtures/load.js +50 -0
  187. package/dist/fixtures/load.js.map +1 -0
  188. package/dist/flows/discover.js +2 -2
  189. package/dist/flows/discover.js.map +1 -1
  190. package/dist/flows/generate.js +68 -17
  191. package/dist/flows/generate.js.map +1 -1
  192. package/dist/flows/lint.js +88 -14
  193. package/dist/flows/lint.js.map +1 -1
  194. package/dist/flows/pack.js +21 -5
  195. package/dist/flows/pack.js.map +1 -1
  196. package/dist/flows/paths.js +57 -0
  197. package/dist/flows/paths.js.map +1 -0
  198. package/dist/flows/repair.js +176 -37
  199. package/dist/flows/repair.js.map +1 -1
  200. package/dist/flows/run.js +308 -99
  201. package/dist/flows/run.js.map +1 -1
  202. package/dist/flows/schema.js +107 -25
  203. package/dist/flows/schema.js.map +1 -1
  204. package/dist/flows/seedExec.js +8 -4
  205. package/dist/flows/seedExec.js.map +1 -1
  206. package/dist/flows/templates.js +5 -5
  207. package/dist/index.js +50 -8
  208. package/dist/index.js.map +1 -1
  209. package/dist/ios/signing.js +32 -3
  210. package/dist/ios/signing.js.map +1 -1
  211. package/dist/issues/classify.js +28 -20
  212. package/dist/issues/classify.js.map +1 -1
  213. package/dist/issues/fingerprint.js +35 -9
  214. package/dist/issues/fingerprint.js.map +1 -1
  215. package/dist/issues/index.js +93 -46
  216. package/dist/issues/index.js.map +1 -1
  217. package/dist/issues/metrics.js +6 -5
  218. package/dist/issues/metrics.js.map +1 -1
  219. package/dist/issues/recurrence.js +35 -8
  220. package/dist/issues/recurrence.js.map +1 -1
  221. package/dist/issues/report.js +12 -8
  222. package/dist/issues/report.js.map +1 -1
  223. package/dist/issues/reportBridge.js +40 -9
  224. package/dist/issues/reportBridge.js.map +1 -1
  225. package/dist/issues/schema.js +2 -2
  226. package/dist/issues/schema.js.map +1 -1
  227. package/dist/issues/sourceRevision.js +2 -2
  228. package/dist/issues/sourceRevision.js.map +1 -1
  229. package/dist/issues/store.js +110 -32
  230. package/dist/issues/store.js.map +1 -1
  231. package/dist/lib/abortScope.js +48 -0
  232. package/dist/lib/abortScope.js.map +1 -0
  233. package/dist/lib/android.js +84 -8
  234. package/dist/lib/android.js.map +1 -1
  235. package/dist/lib/coordSpace.js +1 -1
  236. package/dist/lib/coordSpace.js.map +1 -1
  237. package/dist/lib/device.js +53 -12
  238. package/dist/lib/device.js.map +1 -1
  239. package/dist/lib/gestures.js +141 -0
  240. package/dist/lib/gestures.js.map +1 -0
  241. package/dist/lib/gitignore.js +4 -3
  242. package/dist/lib/gitignore.js.map +1 -1
  243. package/dist/lib/image.js +12 -3
  244. package/dist/lib/image.js.map +1 -1
  245. package/dist/lib/lockfile.js +399 -0
  246. package/dist/lib/lockfile.js.map +1 -0
  247. package/dist/lib/needsInput.js +9 -6
  248. package/dist/lib/needsInput.js.map +1 -1
  249. package/dist/lib/png.js +4 -3
  250. package/dist/lib/png.js.map +1 -1
  251. package/dist/lib/redact.js +170 -9
  252. package/dist/lib/redact.js.map +1 -1
  253. package/dist/lib/result.js +94 -10
  254. package/dist/lib/result.js.map +1 -1
  255. package/dist/lib/schemaHash.js +7 -5
  256. package/dist/lib/schemaHash.js.map +1 -1
  257. package/dist/lib/sensitive.js +6 -3
  258. package/dist/lib/sensitive.js.map +1 -1
  259. package/dist/lib/simctl.js +3 -3
  260. package/dist/lib/simctl.js.map +1 -1
  261. package/dist/lib/spawn.js +78 -17
  262. package/dist/lib/spawn.js.map +1 -1
  263. package/dist/lib/toolAnnotations.js +114 -0
  264. package/dist/lib/toolAnnotations.js.map +1 -0
  265. package/dist/lib/wda.js +321 -25
  266. package/dist/lib/wda.js.map +1 -1
  267. package/dist/lib/wdaConfig.js +12 -5
  268. package/dist/lib/wdaConfig.js.map +1 -1
  269. package/dist/lib/wdaTune.js +52 -23
  270. package/dist/lib/wdaTune.js.map +1 -1
  271. package/dist/mobileAudit/checks.js +150 -28
  272. package/dist/mobileAudit/checks.js.map +1 -1
  273. package/dist/mobileAudit/evidence.js +4 -4
  274. package/dist/mobileAudit/evidence.js.map +1 -1
  275. package/dist/mobileAudit/profiles.js +121 -20
  276. package/dist/mobileAudit/profiles.js.map +1 -1
  277. package/dist/mobileAudit/results.js +9 -4
  278. package/dist/mobileAudit/results.js.map +1 -1
  279. package/dist/mobileAudit/runner.js +214 -35
  280. package/dist/mobileAudit/runner.js.map +1 -1
  281. package/dist/oracle/auth.js +1 -1
  282. package/dist/oracle/auth.js.map +1 -1
  283. package/dist/oracle/failures.js +1085 -145
  284. package/dist/oracle/failures.js.map +1 -1
  285. package/dist/oracle/health.js +148 -26
  286. package/dist/oracle/health.js.map +1 -1
  287. package/dist/oracle/locator.js +148 -19
  288. package/dist/oracle/locator.js.map +1 -1
  289. package/dist/oracle/record.js +3 -3
  290. package/dist/oracle/record.js.map +1 -1
  291. package/dist/orchestration/envelope.js +2 -2
  292. package/dist/orchestration/envelope.js.map +1 -1
  293. package/dist/orchestration/goal.js +7 -13
  294. package/dist/orchestration/goal.js.map +1 -1
  295. package/dist/orchestration/testThis/execute.js +167 -0
  296. package/dist/orchestration/testThis/execute.js.map +1 -0
  297. package/dist/orchestration/testThis/pipeline.js +413 -0
  298. package/dist/orchestration/testThis/pipeline.js.map +1 -0
  299. package/dist/orchestration/testThis/plan.js +519 -0
  300. package/dist/orchestration/testThis/plan.js.map +1 -0
  301. package/dist/orchestration/testThis/sessionIntent.js +72 -0
  302. package/dist/orchestration/testThis/sessionIntent.js.map +1 -0
  303. package/dist/orchestration/testThis/terminal.js +136 -0
  304. package/dist/orchestration/testThis/terminal.js.map +1 -0
  305. package/dist/orchestration/testThis/types.js +12 -0
  306. package/dist/orchestration/testThis/types.js.map +1 -0
  307. package/dist/plan/plan.js +9 -9
  308. package/dist/plan/plan.js.map +1 -1
  309. package/dist/prompts/index.js +24 -24
  310. package/dist/prompts/index.js.map +1 -1
  311. package/dist/report/coverage.js +0 -1
  312. package/dist/report/coverage.js.map +1 -1
  313. package/dist/report/evidence.js.map +1 -1
  314. package/dist/report/export.js +449 -72
  315. package/dist/report/export.js.map +1 -1
  316. package/dist/report/findingsDedupe.js +41 -0
  317. package/dist/report/findingsDedupe.js.map +1 -0
  318. package/dist/report/flake.js +13 -14
  319. package/dist/report/flake.js.map +1 -1
  320. package/dist/report/history.js +72 -38
  321. package/dist/report/history.js.map +1 -1
  322. package/dist/report/policy.js +18 -7
  323. package/dist/report/policy.js.map +1 -1
  324. package/dist/report/qaLevel.js +10 -16
  325. package/dist/report/qaLevel.js.map +1 -1
  326. package/dist/report/readiness.js +42 -12
  327. package/dist/report/readiness.js.map +1 -1
  328. package/dist/report/sarifSources.js +160 -0
  329. package/dist/report/sarifSources.js.map +1 -0
  330. package/dist/report/summary.js +2 -2
  331. package/dist/report/summary.js.map +1 -1
  332. package/dist/report/testCatalog.js +4 -4
  333. package/dist/report/testCatalog.js.map +1 -1
  334. package/dist/report/timing.js +23 -23
  335. package/dist/report/timing.js.map +1 -1
  336. package/dist/report/toolHealth.js +124 -0
  337. package/dist/report/toolHealth.js.map +1 -0
  338. package/dist/server.js +501 -69
  339. package/dist/server.js.map +1 -1
  340. package/dist/services/automationGenerate.js +8 -2
  341. package/dist/services/automationGenerate.js.map +1 -1
  342. package/dist/services/build.js +10 -4
  343. package/dist/services/build.js.map +1 -1
  344. package/dist/services/flowGenerate.js +75 -0
  345. package/dist/services/flowGenerate.js.map +1 -0
  346. package/dist/services/preflight.js +40 -8
  347. package/dist/services/preflight.js.map +1 -1
  348. package/dist/services/prepareAndroid.js +92 -18
  349. package/dist/services/prepareAndroid.js.map +1 -1
  350. package/dist/services/prepareIos.js +94 -17
  351. package/dist/services/prepareIos.js.map +1 -1
  352. package/dist/services/report.js +271 -80
  353. package/dist/services/report.js.map +1 -1
  354. package/dist/services/smoke.js +68 -22
  355. package/dist/services/smoke.js.map +1 -1
  356. package/dist/services/suiteGenerate.js +43 -6
  357. package/dist/services/suiteGenerate.js.map +1 -1
  358. package/dist/services/testSuiteKnowledge.js +78 -33
  359. package/dist/services/testSuiteKnowledge.js.map +1 -1
  360. package/dist/session/attach.js +284 -4
  361. package/dist/session/attach.js.map +1 -1
  362. package/dist/session/processRegistry.js +433 -0
  363. package/dist/session/processRegistry.js.map +1 -0
  364. package/dist/session/progress.js +1 -1
  365. package/dist/session/progress.js.map +1 -1
  366. package/dist/session/retention.js +201 -0
  367. package/dist/session/retention.js.map +1 -0
  368. package/dist/session/store.js +459 -59
  369. package/dist/session/store.js.map +1 -1
  370. package/dist/snapshot/overlays.js +60 -10
  371. package/dist/snapshot/overlays.js.map +1 -1
  372. package/dist/snapshot/parse.js +30 -12
  373. package/dist/snapshot/parse.js.map +1 -1
  374. package/dist/snapshot/present.js +36 -6
  375. package/dist/snapshot/present.js.map +1 -1
  376. package/dist/snapshot/settle.js +39 -9
  377. package/dist/snapshot/settle.js.map +1 -1
  378. package/dist/state/consent.js +99 -0
  379. package/dist/state/consent.js.map +1 -0
  380. package/dist/state/profile.js +82 -11
  381. package/dist/state/profile.js.map +1 -1
  382. package/dist/suite/compile.js +15 -6
  383. package/dist/suite/compile.js.map +1 -1
  384. package/dist/suite/lint.js +22 -4
  385. package/dist/suite/lint.js.map +1 -1
  386. package/dist/suite/pom.js +75 -44
  387. package/dist/suite/pom.js.map +1 -1
  388. package/dist/suite/secretGuard.js +266 -0
  389. package/dist/suite/secretGuard.js.map +1 -0
  390. package/dist/suite/testcase.js +15 -11
  391. package/dist/suite/testcase.js.map +1 -1
  392. package/dist/testSuite/exporter.js +7 -3
  393. package/dist/testSuite/exporter.js.map +1 -1
  394. package/dist/testSuite/generator.js +43 -14
  395. package/dist/testSuite/generator.js.map +1 -1
  396. package/dist/testSuite/history.js +1 -1
  397. package/dist/testSuite/history.js.map +1 -1
  398. package/dist/testSuite/issueLinks.js +3 -3
  399. package/dist/testSuite/issueLinks.js.map +1 -1
  400. package/dist/testSuite/lint.js +4 -4
  401. package/dist/testSuite/lint.js.map +1 -1
  402. package/dist/testSuite/merge.js +13 -7
  403. package/dist/testSuite/merge.js.map +1 -1
  404. package/dist/testSuite/schema.js +21 -16
  405. package/dist/testSuite/schema.js.map +1 -1
  406. package/dist/testSuite/store.js +12 -4
  407. package/dist/testSuite/store.js.map +1 -1
  408. package/dist/testSuite/traceability.js +2 -2
  409. package/dist/testSuite/traceability.js.map +1 -1
  410. package/dist/tools/act.js +868 -174
  411. package/dist/tools/act.js.map +1 -1
  412. package/dist/tools/agent.js +521 -112
  413. package/dist/tools/agent.js.map +1 -1
  414. package/dist/tools/appControl.js +82 -19
  415. package/dist/tools/appControl.js.map +1 -1
  416. package/dist/tools/appMap.js +393 -189
  417. package/dist/tools/appMap.js.map +1 -1
  418. package/dist/tools/build.js +92 -51
  419. package/dist/tools/build.js.map +1 -1
  420. package/dist/tools/bundletool.js +141 -40
  421. package/dist/tools/bundletool.js.map +1 -1
  422. package/dist/tools/clearOverlay.js +98 -18
  423. package/dist/tools/clearOverlay.js.map +1 -1
  424. package/dist/tools/device.js +108 -19
  425. package/dist/tools/device.js.map +1 -1
  426. package/dist/tools/doctor.js +98 -35
  427. package/dist/tools/doctor.js.map +1 -1
  428. package/dist/tools/explore.js +110 -42
  429. package/dist/tools/explore.js.map +1 -1
  430. package/dist/tools/featureTesting.js +152 -130
  431. package/dist/tools/featureTesting.js.map +1 -1
  432. package/dist/tools/firstRun.js +94 -66
  433. package/dist/tools/firstRun.js.map +1 -1
  434. package/dist/tools/flow.js +347 -132
  435. package/dist/tools/flow.js.map +1 -1
  436. package/dist/tools/flowRepair.js +42 -10
  437. package/dist/tools/flowRepair.js.map +1 -1
  438. package/dist/tools/generate.js +199 -0
  439. package/dist/tools/generate.js.map +1 -0
  440. package/dist/tools/getArtifact.js +37 -8
  441. package/dist/tools/getArtifact.js.map +1 -1
  442. package/dist/tools/health.js +17 -12
  443. package/dist/tools/health.js.map +1 -1
  444. package/dist/tools/ios.js +148 -194
  445. package/dist/tools/ios.js.map +1 -1
  446. package/dist/tools/issues.js +256 -171
  447. package/dist/tools/issues.js.map +1 -1
  448. package/dist/tools/jobs.js +55 -11
  449. package/dist/tools/jobs.js.map +1 -1
  450. package/dist/tools/metro.js +84 -38
  451. package/dist/tools/metro.js.map +1 -1
  452. package/dist/tools/mobileAudit.js +83 -26
  453. package/dist/tools/mobileAudit.js.map +1 -1
  454. package/dist/tools/network.js +36 -14
  455. package/dist/tools/network.js.map +1 -1
  456. package/dist/tools/note.js +31 -17
  457. package/dist/tools/note.js.map +1 -1
  458. package/dist/tools/prepareIosTarget.js +31 -14
  459. package/dist/tools/prepareIosTarget.js.map +1 -1
  460. package/dist/tools/prepareTarget.js +193 -47
  461. package/dist/tools/prepareTarget.js.map +1 -1
  462. package/dist/tools/report.js +16 -8
  463. package/dist/tools/report.js.map +1 -1
  464. package/dist/tools/resolveArtifact.js +12 -12
  465. package/dist/tools/resolveArtifact.js.map +1 -1
  466. package/dist/tools/resolveTarget.js +81 -18
  467. package/dist/tools/resolveTarget.js.map +1 -1
  468. package/dist/tools/screenRecord.js +85 -20
  469. package/dist/tools/screenRecord.js.map +1 -1
  470. package/dist/tools/screenshot.js +42 -18
  471. package/dist/tools/screenshot.js.map +1 -1
  472. package/dist/tools/smoke.js +29 -12
  473. package/dist/tools/smoke.js.map +1 -1
  474. package/dist/tools/snapshot.js +157 -107
  475. package/dist/tools/snapshot.js.map +1 -1
  476. package/dist/tools/startSession.js +117 -84
  477. package/dist/tools/startSession.js.map +1 -1
  478. package/dist/tools/suite.js +391 -310
  479. package/dist/tools/suite.js.map +1 -1
  480. package/dist/tools/testSuite.js +112 -36
  481. package/dist/tools/testSuite.js.map +1 -1
  482. package/dist/tools/testThis.js +35 -802
  483. package/dist/tools/testThis.js.map +1 -1
  484. package/dist/tools/visual.js +698 -116
  485. package/dist/tools/visual.js.map +1 -1
  486. package/dist/tools/wait.js +9 -23
  487. package/dist/tools/wait.js.map +1 -1
  488. package/dist/tools/wda.js +312 -54
  489. package/dist/tools/wda.js.map +1 -1
  490. package/dist/version.js +37 -64
  491. package/dist/version.js.map +1 -1
  492. package/dist/visual/ocr.js +65 -8
  493. package/dist/visual/ocr.js.map +1 -1
  494. package/dist/visual/provider.js +87 -15
  495. package/dist/visual/provider.js.map +1 -1
  496. package/docs/README.md +24 -10
  497. package/docs/ci-reports.md +328 -0
  498. package/docs/concepts.md +227 -0
  499. package/docs/flows.md +153 -0
  500. package/docs/mcp-server.md +210 -104
  501. package/docs/physical-devices.md +84 -0
  502. package/docs/tools.md +808 -217
  503. package/package.json +16 -6
  504. package/dist/appMap/diff.js +0 -60
  505. package/dist/appMap/diff.js.map +0 -1
  506. package/dist/automation/maestroIr.js +0 -282
  507. package/dist/automation/maestroIr.js.map +0 -1
  508. package/dist/interop/maestro.js +0 -151
  509. package/dist/interop/maestro.js.map +0 -1
  510. package/dist/tools/assertVisual.js +0 -74
  511. package/dist/tools/assertVisual.js.map +0 -1
  512. package/dist/tools/automationGenerate.js +0 -394
  513. package/dist/tools/automationGenerate.js.map +0 -1
  514. package/dist/tools/capabilities.js +0 -209
  515. package/dist/tools/capabilities.js.map +0 -1
  516. package/dist/tools/detectContext.js +0 -41
  517. package/dist/tools/detectContext.js.map +0 -1
  518. package/dist/tools/flowGenerate.js +0 -55
  519. package/dist/tools/flowGenerate.js.map +0 -1
  520. package/dist/tools/history.js +0 -56
  521. package/dist/tools/history.js.map +0 -1
  522. package/dist/tools/idling.js +0 -104
  523. package/dist/tools/idling.js.map +0 -1
  524. package/dist/tools/inputCapabilities.js +0 -30
  525. package/dist/tools/inputCapabilities.js.map +0 -1
  526. package/dist/tools/locator.js +0 -57
  527. package/dist/tools/locator.js.map +0 -1
  528. package/dist/tools/maestro.js +0 -78
  529. package/dist/tools/maestro.js.map +0 -1
  530. package/dist/tools/permissions.js +0 -149
  531. package/dist/tools/permissions.js.map +0 -1
  532. package/dist/tools/plan.js +0 -49
  533. package/dist/tools/plan.js.map +0 -1
  534. package/dist/tools/screenInfo.js +0 -70
  535. package/dist/tools/screenInfo.js.map +0 -1
  536. package/dist/tools/seed.js +0 -101
  537. package/dist/tools/seed.js.map +0 -1
  538. package/dist/tools/state.js +0 -170
  539. package/dist/tools/state.js.map +0 -1
  540. package/dist/tools/visualText.js +0 -61
  541. package/dist/tools/visualText.js.map +0 -1
@@ -1,4 +1,4 @@
1
- // SWIPIUM Mobile QA Toolkit — profile + check definitions (SWIPIUM-REQ-07 "Mobile QA Toolkit").
1
+ // SWIPIUM Mobile QA Toolkit: profile + check definitions.
2
2
  //
3
3
  // A named, profile-based mobile-release audit. PURE data + selection logic: the qa_mobile_audit tool
4
4
  // turns a chosen profile into an ordered checklist (with expected behavior + report classification)
@@ -6,25 +6,126 @@
6
6
  // qa_app_control / qa_network …). Keeping the catalog pure makes profile behavior unit-testable.
7
7
  export const ALL_PROFILES = ['smoke', 'account_cycle', 'store_compliance', 'resilience', 'release_gate'];
8
8
  const CHECKS = {
9
- launch: { id: 'launch', title: 'App launch + main screen', expected: 'App launches and renders its main screen with no crash/RedBox.', classification: 'blocker_app_bug' },
10
- health_scan: { id: 'health_scan', title: 'Crash / RedBox / log scan', expected: 'No native crash, RedBox, unhandled exception, or error surface on the main flow.', classification: 'app_bug' },
11
- navigation: { id: 'navigation', title: 'Basic navigation', expected: 'Primary tabs / navigation are reachable and stable.', classification: 'app_bug' },
12
- privacy_link: { id: 'privacy_link', title: 'Privacy Policy link', expected: 'Privacy Policy link exists, opens, and is reachable.', classification: 'store_compliance' },
13
- terms_link: { id: 'terms_link', title: 'Terms link', expected: 'Terms link exists where account/payment/subscription surfaces need it.', classification: 'store_compliance' },
14
- account_deletion: { id: 'account_deletion', title: 'Account deletion path', expected: 'Account/settings exposes a delete-account or data-deletion flow when the app has accounts.', classification: 'store_compliance' },
15
- subscription_management: { id: 'subscription_management', title: 'Subscription management / restore', expected: 'Paywall/account exposes restore-purchase and a manage-subscription path or clear system handoff.', classification: 'store_compliance' },
16
- paywall: { id: 'paywall', title: 'Paywall classification', expected: 'Soft paywall can be dismissed or a free path exists; a hard paywall is recorded without purchase.', classification: 'hard_gate' },
17
- external_links: { id: 'external_links', title: 'External links', expected: 'External links (support/help/store) open without crashing the app.', classification: 'improvement' },
18
- create_account: { id: 'create_account', title: 'Create account', expected: 'A safe generated account can be created in test/staging.', classification: 'app_bug', requiresAccountCycle: true, requiresGeneratedData: true },
19
- logout: { id: 'logout', title: 'Logout', expected: 'User can log out from the disposable test account.', classification: 'app_bug', requiresAccountCycle: true },
20
- login_again: { id: 'login_again', title: 'Login again', expected: 'The same generated account can log back in.', classification: 'app_bug', requiresAccountCycle: true, requiresGeneratedData: true },
21
- forgot_password: { id: 'forgot_password', title: 'Forgot password surface', expected: 'A forgot-password entrypoint exists and accepts a test email without consuming email/OTP.', classification: 'improvement', requiresAccountCycle: true },
22
- offline_entry: { id: 'offline_entry', title: 'Offline entry', expected: 'App handles offline state gracefully (expected offline message, no crash/blank).', classification: 'app_bug' },
23
- network_restoration: { id: 'network_restoration', title: 'Network restoration', expected: 'App recovers after connectivity returns.', classification: 'app_bug' },
24
- process_relaunch: { id: 'process_relaunch', title: 'Process kill / relaunch', expected: 'After process kill + relaunch the app restores or returns to a sane state.', classification: 'app_bug' },
25
- rotation: { id: 'rotation', title: 'Rotation', expected: 'Rotation (where supported) does not crash or lose critical state.', classification: 'improvement' },
26
- locator_readiness: { id: 'locator_readiness', title: 'Accessibility / test IDs', expected: 'Important buttons/fields have stable locators.', classification: 'accessibility_readiness' },
27
- issue_recurrence: { id: 'issue_recurrence', title: 'Issue-ledger recurrence', expected: 'No previously-fixed issue has regressed (issue ledger reports no reopened fingerprints).', classification: 'app_bug' },
9
+ launch: {
10
+ id: 'launch',
11
+ title: 'App launch + main screen',
12
+ expected: 'App launches and renders its main screen with no crash/RedBox.',
13
+ classification: 'blocker_app_bug',
14
+ },
15
+ health_scan: {
16
+ id: 'health_scan',
17
+ title: 'Crash / RedBox / log scan',
18
+ expected: 'No native crash, RedBox, unhandled exception, or error surface on the main flow.',
19
+ classification: 'app_bug',
20
+ },
21
+ navigation: {
22
+ id: 'navigation',
23
+ title: 'Basic navigation',
24
+ expected: 'Primary tabs / navigation are reachable and stable.',
25
+ classification: 'app_bug',
26
+ },
27
+ privacy_link: {
28
+ id: 'privacy_link',
29
+ title: 'Privacy Policy link',
30
+ expected: 'Privacy Policy link exists, opens, and is reachable.',
31
+ classification: 'store_compliance',
32
+ },
33
+ terms_link: {
34
+ id: 'terms_link',
35
+ title: 'Terms link',
36
+ expected: 'Terms link exists where account/payment/subscription surfaces need it.',
37
+ classification: 'store_compliance',
38
+ },
39
+ account_deletion: {
40
+ id: 'account_deletion',
41
+ title: 'Account deletion path',
42
+ expected: 'Account/settings exposes a delete-account or data-deletion flow when the app has accounts.',
43
+ classification: 'store_compliance',
44
+ },
45
+ subscription_management: {
46
+ id: 'subscription_management',
47
+ title: 'Subscription management / restore',
48
+ expected: 'Paywall/account exposes restore-purchase and a manage-subscription path or clear system handoff.',
49
+ classification: 'store_compliance',
50
+ },
51
+ paywall: {
52
+ id: 'paywall',
53
+ title: 'Paywall classification',
54
+ expected: 'Soft paywall can be dismissed or a free path exists; a hard paywall is recorded without purchase.',
55
+ classification: 'hard_gate',
56
+ },
57
+ external_links: {
58
+ id: 'external_links',
59
+ title: 'External links',
60
+ expected: 'External links (support/help/store) open without crashing the app.',
61
+ classification: 'improvement',
62
+ },
63
+ create_account: {
64
+ id: 'create_account',
65
+ title: 'Create account',
66
+ expected: 'A safe generated account can be created in test/staging.',
67
+ classification: 'app_bug',
68
+ requiresAccountCycle: true,
69
+ requiresGeneratedData: true,
70
+ },
71
+ logout: {
72
+ id: 'logout',
73
+ title: 'Logout',
74
+ expected: 'User can log out from the disposable test account.',
75
+ classification: 'app_bug',
76
+ requiresAccountCycle: true,
77
+ },
78
+ login_again: {
79
+ id: 'login_again',
80
+ title: 'Login again',
81
+ expected: 'The same generated account can log back in.',
82
+ classification: 'app_bug',
83
+ requiresAccountCycle: true,
84
+ requiresGeneratedData: true,
85
+ },
86
+ forgot_password: {
87
+ id: 'forgot_password',
88
+ title: 'Forgot password surface',
89
+ expected: 'A forgot-password entrypoint exists and accepts a test email without consuming email/OTP.',
90
+ classification: 'improvement',
91
+ requiresAccountCycle: true,
92
+ },
93
+ offline_entry: {
94
+ id: 'offline_entry',
95
+ title: 'Offline entry',
96
+ expected: 'App handles offline state gracefully (expected offline message, no crash/blank).',
97
+ classification: 'app_bug',
98
+ },
99
+ network_restoration: {
100
+ id: 'network_restoration',
101
+ title: 'Network restoration',
102
+ expected: 'App recovers after connectivity returns.',
103
+ classification: 'app_bug',
104
+ },
105
+ process_relaunch: {
106
+ id: 'process_relaunch',
107
+ title: 'Process kill / relaunch',
108
+ expected: 'After process kill + relaunch the app restores or returns to a sane state.',
109
+ classification: 'app_bug',
110
+ },
111
+ rotation: {
112
+ id: 'rotation',
113
+ title: 'Rotation',
114
+ expected: 'Rotation (where supported) does not crash or lose critical state.',
115
+ classification: 'improvement',
116
+ },
117
+ locator_readiness: {
118
+ id: 'locator_readiness',
119
+ title: 'Accessibility / test IDs',
120
+ expected: 'Important buttons/fields have stable locators.',
121
+ classification: 'accessibility_readiness',
122
+ },
123
+ issue_recurrence: {
124
+ id: 'issue_recurrence',
125
+ title: 'Issue-ledger recurrence',
126
+ expected: 'No previously-fixed issue has regressed (issue ledger reports no reopened fingerprints).',
127
+ classification: 'app_bug',
128
+ },
28
129
  };
29
130
  const PROFILE_CHECKS = {
30
131
  smoke: ['launch', 'health_scan', 'navigation'],
@@ -1 +1 @@
1
- {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/mobileAudit/profiles.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/mobileAudit/profiles.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- // SWIPIUM-REQ-08 — executable mobile-audit result model + release-impact rollup.
2
- import { combineReleaseImpact, defaultReleaseImpact } from '../issues/schema.js';
1
+ // Executable mobile-audit result model + release-impact rollup.
2
+ import { combineReleaseImpact, defaultReleaseImpact, } from '../issues/schema.js';
3
3
  /**
4
4
  * Release impact of a finished audit run. A failed check with a real-defect / store-compliance /
5
5
  * hard-gate category contributes its category's default impact; recurrence of a previously-fixed
@@ -24,11 +24,16 @@ export function auditReleaseImpact(checks, hasBlockingRecurrence) {
24
24
  /** Map a finished check to a one-line markdown row. */
25
25
  export function checkLine(c) {
26
26
  const tag = c.issueId ? ` [${c.issueId}]` : '';
27
- return `- ${c.status.toUpperCase()} — ${c.title}${c.reason ? `: ${c.reason}` : ''}${tag}`;
27
+ return `- ${c.status.toUpperCase()}: ${c.title}${c.reason ? `: ${c.reason}` : ''}${tag}`;
28
28
  }
29
29
  /** Render the audit run as a compact markdown block for the report / tool output. */
30
30
  export function auditRunToMarkdown(run) {
31
- const lines = [`## Mobile Audit — ${run.profile}`, '', `State: **${run.state}** · Release impact: **${run.releaseImpact.toUpperCase()}**`, ''];
31
+ const lines = [
32
+ `## Mobile Audit: ${run.profile}`,
33
+ '',
34
+ `State: **${run.state}** · Release impact: **${run.releaseImpact.toUpperCase()}**`,
35
+ '',
36
+ ];
32
37
  for (const c of run.checks)
33
38
  lines.push(checkLine(c));
34
39
  if (run.recurrenceWarnings.length) {
@@ -1 +1 @@
1
- {"version":3,"file":"results.js","sourceRoot":"","sources":["../../src/mobileAudit/results.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAA8D,MAAM,qBAAqB,CAAC;AAkC7I;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAgC,EAAE,qBAA8B;IACjG,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;YAAE,SAAS;QAC5D,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAChB,mFAAmF;YACnF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,qBAAqB;QAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,SAAS,CAAC,CAAyB;IACjD,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/C,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC;AAC5F,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,kBAAkB,CAAC,GAAyB;IAC1D,MAAM,KAAK,GAAG,CAAC,qBAAqB,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,YAAY,GAAG,CAAC,KAAK,0BAA0B,GAAG,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/I,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,GAAG,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,kBAAkB;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"results.js","sourceRoot":"","sources":["../../src/mobileAudit/results.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAEhE,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GAIrB,MAAM,qBAAqB,CAAC;AAkC7B;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAgC,EAAE,qBAA8B;IACjG,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;YAAE,SAAS;QAC5D,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAChB,mFAAmF;YACnF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,qBAAqB;QAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,SAAS,CAAC,CAAyB;IACjD,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/C,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC;AAC3F,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,kBAAkB,CAAC,GAAyB;IAC1D,MAAM,KAAK,GAAG;QACZ,oBAAoB,GAAG,CAAC,OAAO,EAAE;QACjC,EAAE;QACF,YAAY,GAAG,CAAC,KAAK,0BAA0B,GAAG,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI;QAClF,EAAE;KACH,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,GAAG,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,kBAAkB;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -1,4 +1,4 @@
1
- // SWIPIUM-REQ-08 — executable mobile-audit runner. Orchestrates the existing driver capabilities
1
+ // Executable mobile-audit runner. Orchestrates the existing driver capabilities
2
2
  // (health, snapshot, network, first-run, guided exploration) into a profile-based audit that
3
3
  // produces honest, evidence-backed check results and records issue-ledger entries. It NEVER claims
4
4
  // a check passed without observed evidence, never purchases / bypasses OTP / deletes real accounts,
@@ -11,6 +11,21 @@ import { checksForProfile } from './profiles.js';
11
11
  import * as C from './checks.js';
12
12
  import { snapshotText, foreground } from './evidence.js';
13
13
  import { auditReleaseImpact } from './results.js';
14
+ /** True when a profile's execution toggles airplane mode (needs network_change consent). */
15
+ export function auditChangesNetwork(profile) {
16
+ return profile === 'resilience' || profile === 'release_gate';
17
+ }
18
+ /** The consent request a caller should raise before executing a network-changing audit. Same
19
+ * `network_change` action/risk qa_network uses, with the exact toggles shown. */
20
+ export function auditNetworkConsentRequest(profile) {
21
+ return {
22
+ action: 'network_change',
23
+ risk: 'medium',
24
+ exactCommand: 'airplane mode ON (offline_entry), then OFF (network_restoration), then restore the recorded original state',
25
+ affects: { to: 'offline', tool: 'qa_mobile_audit', profile },
26
+ explain: `qa_mobile_audit ${profile} toggles airplane mode for the offline/restoration checks and restores the device's original network state afterwards. Allow it?`,
27
+ };
28
+ }
14
29
  function platformOf(driver) {
15
30
  return driver.kind === 'wda' || driver.kind === 'simulator' ? 'ios' : 'android';
16
31
  }
@@ -26,7 +41,7 @@ export async function runMobileAudit(sessions, session, driver, opts) {
26
41
  const issueIds = [];
27
42
  const recurrenceWarnings = [];
28
43
  let state = 'completed';
29
- // Record a fail/blocked check as an issue (the check IS the classifier → forceCategory). Returns
44
+ // Record a fail/blocked check as an issue (the check IS the classifier, so forceCategory). Returns
30
45
  // the issue id, or undefined when the check has no category (pure environment/setup gap).
31
46
  const recordIssue = async (title, raw) => {
32
47
  if (raw.status !== 'fail' && raw.status !== 'blocked')
@@ -57,7 +72,20 @@ export async function runMobileAudit(sessions, session, driver, opts) {
57
72
  const issueId = await recordIssue(title, raw);
58
73
  if (issueId)
59
74
  issueIds.push(issueId);
60
- checks.push({ id, title, profile: opts.profile, status: raw.status, category: raw.category, severity: raw.severity, issueId, reason: raw.reason, evidenceUris: raw.evidenceUris, workflow: raw.workflow, screenId: raw.screenId, nextStep: raw.nextStep });
75
+ checks.push({
76
+ id,
77
+ title,
78
+ profile: opts.profile,
79
+ status: raw.status,
80
+ category: raw.category,
81
+ severity: raw.severity,
82
+ issueId,
83
+ reason: raw.reason,
84
+ evidenceUris: raw.evidenceUris,
85
+ workflow: raw.workflow,
86
+ screenId: raw.screenId,
87
+ nextStep: raw.nextStep,
88
+ });
61
89
  };
62
90
  const profilesToRun = opts.profile === 'release_gate' ? ['smoke', 'account_cycle', 'store_compliance', 'resilience'] : [opts.profile];
63
91
  for (const prof of profilesToRun) {
@@ -76,20 +104,59 @@ export async function runMobileAudit(sessions, session, driver, opts) {
76
104
  await finalize('external_links', 'External links', C.checkExternalLinks());
77
105
  }
78
106
  else if (prof === 'resilience') {
107
+ const networkApproved = opts.networkChangeApproved === true;
108
+ let preAudit;
109
+ let auditOwnsRestore = false;
79
110
  try {
80
- await finalize('offline_entry', 'Offline entry', await C.checkOfflineEntry(ev));
81
- await finalize('network_restoration', 'Network restoration', await C.checkNetworkRestoration(ev));
111
+ if (!networkApproved) {
112
+ await finalize('offline_entry', 'Offline entry', {
113
+ status: 'blocked',
114
+ reason: 'airplane-mode toggle needs network_change consent; the device network was not touched',
115
+ evidenceUris: [],
116
+ nextStep: 'Re-run qa_mobile_audit execute with the network_change consent approved (same gate as qa_network).',
117
+ });
118
+ await finalize('network_restoration', 'Network restoration', {
119
+ status: 'skipped',
120
+ reason: 'network was not changed (no consent)',
121
+ evidenceUris: [],
122
+ });
123
+ }
124
+ else {
125
+ // Record the ORIGINAL airplane state before the first toggle so the finally-block
126
+ // restores it (not a blind "airplane OFF" that would flip a device that started offline).
127
+ preAudit = await driver.airplaneOn().catch(() => undefined);
128
+ if (!session.network?.changed) {
129
+ session.network = { changed: true, originalAirplane: preAudit ?? false };
130
+ auditOwnsRestore = true;
131
+ sessions.persist(session);
132
+ }
133
+ sessions.recordMutation(session, {
134
+ tool: 'qa_mobile_audit',
135
+ action: 'network_change',
136
+ risk: 'medium',
137
+ target: { to: 'offline', profile: prof, originalAirplane: preAudit ?? null },
138
+ consent: { required: true, approved: true },
139
+ status: 'executed',
140
+ detail: 'resilience offline_entry / network_restoration',
141
+ });
142
+ await finalize('offline_entry', 'Offline entry', await C.checkOfflineEntry(ev));
143
+ await finalize('network_restoration', 'Network restoration', await C.checkNetworkRestoration(ev));
144
+ }
82
145
  await finalize('process_relaunch', 'Process kill / relaunch', await C.checkProcessRelaunch(ev));
83
146
  await finalize('rotation', 'Rotation', C.checkRotation());
84
147
  }
85
148
  finally {
86
- // GUARANTEED network restore — even if a resilience check threw (REQ-08 safety).
87
- try {
88
- await driver.setAirplane(false);
89
- await restoreNetwork(sessions, session, driver);
90
- }
91
- catch {
92
- /* best-effort */
149
+ // GUARANTEED network restore to the recorded ORIGINAL state, even if a check threw.
150
+ if (networkApproved) {
151
+ try {
152
+ if (auditOwnsRestore)
153
+ await restoreNetwork(sessions, session, driver);
154
+ else if (preAudit !== undefined)
155
+ await driver.setAirplane(preAudit);
156
+ }
157
+ catch {
158
+ /* best-effort */
159
+ }
93
160
  }
94
161
  }
95
162
  }
@@ -110,7 +177,14 @@ export async function runMobileAudit(sessions, session, driver, opts) {
110
177
  if (opts.profile === 'release_gate') {
111
178
  await finalize('locator_readiness', 'Accessibility / test IDs', await C.checkLocatorReadiness(ev));
112
179
  if (reopened.length === 0) {
113
- checks.push({ id: 'issue_recurrence', title: 'Issue-ledger recurrence', profile: 'release_gate', status: 'pass', reason: 'no previously-fixed issue has regressed', evidenceUris: [] });
180
+ checks.push({
181
+ id: 'issue_recurrence',
182
+ title: 'Issue-ledger recurrence',
183
+ profile: 'release_gate',
184
+ status: 'pass',
185
+ reason: 'no previously-fixed issue has regressed',
186
+ evidenceUris: [],
187
+ });
114
188
  }
115
189
  else {
116
190
  const top = reopened.find((r) => r.severity === 'blocker' || r.severity === 'high') ?? reopened[0];
@@ -132,11 +206,18 @@ export async function runMobileAudit(sessions, session, driver, opts) {
132
206
  const releaseImpact = auditReleaseImpact(checks, blockingRecurrence);
133
207
  return { profile: opts.profile, state, releaseImpact, checks, issueIds, recurrenceWarnings };
134
208
  }
135
- /** Bounded, honest account-cycle: create (first-run) → logout (controlled explore). Steps that
209
+ /** Bounded, honest account-cycle: create (first-run) > logout (controlled explore). Steps that
136
210
  * cannot be confirmed are reported blocked/needs_input/skipped, never a false pass. */
137
211
  async function runAccountCycle(sessions, session, driver, opts, finalize) {
138
212
  if (!opts.allowGeneratedData) {
139
- const blocked = { status: 'blocked', category: 'missing_test_data', severity: 'medium', reason: 'account-cycle needs generated disposable-account data; re-run with allowGeneratedData in a test/staging environment', evidenceUris: [], workflow: 'account_cycle' };
213
+ const blocked = {
214
+ status: 'blocked',
215
+ category: 'missing_test_data',
216
+ severity: 'medium',
217
+ reason: 'account-cycle needs generated disposable-account data; re-run with allowGeneratedData in a test/staging environment',
218
+ evidenceUris: [],
219
+ workflow: 'account_cycle',
220
+ };
140
221
  await finalize('create_account', 'Create account', blocked);
141
222
  await finalize('logout', 'Logout', { status: 'skipped', reason: 'account not created', evidenceUris: [] });
142
223
  await finalize('login_again', 'Login again', { status: 'skipped', reason: 'account not created', evidenceUris: [] });
@@ -150,22 +231,53 @@ async function runAccountCycle(sessions, session, driver, opts, finalize) {
150
231
  switch (fr.accountOutcome) {
151
232
  case 'created':
152
233
  case 'used_provided_credentials':
153
- createResult = { status: 'pass', reason: `account ${fr.accountOutcome} (${fr.pathTaken ?? 'auth'})`, evidenceUris: fr.evidenceUris, workflow: 'account_cycle' };
234
+ createResult = {
235
+ status: 'pass',
236
+ reason: `account ${fr.accountOutcome} (${fr.pathTaken ?? 'auth'})`,
237
+ evidenceUris: fr.evidenceUris,
238
+ workflow: 'account_cycle',
239
+ };
154
240
  break;
155
241
  case 'reached_verification':
156
- createResult = { status: 'blocked', category: 'hard_gate', severity: 'medium', reason: 'account creation reached an OTP/verification gate (needs a real code)', evidenceUris: fr.evidenceUris, workflow: 'account_cycle' };
242
+ createResult = {
243
+ status: 'blocked',
244
+ category: 'hard_gate',
245
+ severity: 'medium',
246
+ reason: 'account creation reached an OTP/verification gate (needs a real code)',
247
+ evidenceUris: fr.evidenceUris,
248
+ workflow: 'account_cycle',
249
+ };
157
250
  runState = 'needs_input';
158
251
  break;
159
252
  case 'refused_unsafe':
160
- createResult = { status: 'blocked', category: 'missing_test_data', severity: 'medium', reason: fr.stoppedReason || 'environment unsafe for generated account creation', evidenceUris: fr.evidenceUris, workflow: 'account_cycle' };
253
+ createResult = {
254
+ status: 'blocked',
255
+ category: 'missing_test_data',
256
+ severity: 'medium',
257
+ reason: fr.stoppedReason || 'environment unsafe for generated account creation',
258
+ evidenceUris: fr.evidenceUris,
259
+ workflow: 'account_cycle',
260
+ };
161
261
  runState = 'unsafe';
162
262
  break;
163
263
  default:
164
- createResult = { status: 'blocked', reason: `account creation ${fr.accountOutcome}: ${fr.stoppedReason}`, evidenceUris: fr.evidenceUris, workflow: 'account_cycle' };
264
+ createResult = {
265
+ status: 'blocked',
266
+ reason: `account creation ${fr.accountOutcome}: ${fr.stoppedReason}`,
267
+ evidenceUris: fr.evidenceUris,
268
+ workflow: 'account_cycle',
269
+ };
165
270
  }
166
271
  }
167
272
  catch (e) {
168
- createResult = { status: 'fail', category: 'app_bug', severity: 'high', reason: `account creation errored: ${String(e.message ?? e)}`, evidenceUris: [], workflow: 'account_cycle' };
273
+ createResult = {
274
+ status: 'fail',
275
+ category: 'app_bug',
276
+ severity: 'high',
277
+ reason: `account creation errored: ${String(e.message ?? e)}`,
278
+ evidenceUris: [],
279
+ workflow: 'account_cycle',
280
+ };
169
281
  }
170
282
  await finalize('create_account', 'Create account', createResult);
171
283
  // Logout is attempted only through the controlled disposable-account exploration (logout permitted
@@ -173,51 +285,118 @@ async function runAccountCycle(sessions, session, driver, opts, finalize) {
173
285
  // oracles, so the outcome is honest: skipped/blocked unless the create step already failed.
174
286
  if (createResult.status === 'pass') {
175
287
  // Controlled logout: find + tap a logout control (disposable account only) and READ the resulting
176
- // logged-out auth surface immediately — without a full exploration that would auto-re-login via the
177
- // stored generated credentials and hide the forgot-password entrypoint (REQ-08 account-cycle bug).
288
+ // logged-out auth surface immediately, without a full exploration that would auto-re-login via the
289
+ // stored generated credentials and hide the forgot-password entrypoint (account-cycle bug).
178
290
  const ev = { sessions, session, driver, appId: session.appId };
179
291
  let loggedOutText = '';
180
292
  try {
181
293
  const lo = await C.findAndTapLogout(ev, true);
182
294
  loggedOutText = lo.loggedOutText;
183
295
  if (lo.tapped && lo.authSurface)
184
- await finalize('logout', 'Logout', { status: 'pass', reason: 'logged out — reached a logged-out auth surface', evidenceUris: [], workflow: 'account_cycle' });
296
+ await finalize('logout', 'Logout', {
297
+ status: 'pass',
298
+ reason: 'logged out: reached a logged-out auth surface',
299
+ evidenceUris: [],
300
+ workflow: 'account_cycle',
301
+ });
185
302
  else if (lo.tapped)
186
- await finalize('logout', 'Logout', { status: 'skipped', reason: 'tapped a logout control but did not clearly reach a logged-out auth surface — confirm manually', evidenceUris: [], workflow: 'account_cycle' });
303
+ await finalize('logout', 'Logout', {
304
+ status: 'skipped',
305
+ reason: 'tapped a logout control but did not clearly reach a logged-out auth surface; confirm manually',
306
+ evidenceUris: [],
307
+ workflow: 'account_cycle',
308
+ });
187
309
  else
188
- await finalize('logout', 'Logout', { status: 'fail', category: 'improvement', severity: 'low', reason: 'no logout control found on the post-login screens', evidenceUris: [], workflow: 'account_cycle', nextStep: 'Expose a logout control once signed in.' });
310
+ await finalize('logout', 'Logout', {
311
+ status: 'fail',
312
+ category: 'improvement',
313
+ severity: 'low',
314
+ reason: 'no logout control found on the post-login screens',
315
+ evidenceUris: [],
316
+ workflow: 'account_cycle',
317
+ nextStep: 'Expose a logout control once signed in.',
318
+ });
189
319
  }
190
320
  catch (e) {
191
- await finalize('logout', 'Logout', { status: 'fail', category: 'app_bug', severity: 'high', reason: `logout attempt errored: ${String(e.message ?? e)}`, evidenceUris: [], workflow: 'account_cycle' });
321
+ await finalize('logout', 'Logout', {
322
+ status: 'fail',
323
+ category: 'app_bug',
324
+ severity: 'high',
325
+ reason: `logout attempt errored: ${String(e.message ?? e)}`,
326
+ evidenceUris: [],
327
+ workflow: 'account_cycle',
328
+ });
192
329
  }
193
330
  // Forgot-password is evaluated on the LOGGED-OUT auth surface captured above (right after logout),
194
- // BEFORE login_again returns to home — otherwise a valid "Forgot password?" link on the login
331
+ // BEFORE login_again returns to home. Otherwise a valid "Forgot password?" link on the login
195
332
  // screen would be falsely reported missing. Finalized after login_again to keep output order.
196
333
  const forgotResult = C.checkForgotPassword(loggedOutText);
197
334
  // Login again: re-run first-run, which now reuses the generated credentials (hasProvidedCredentials
198
- // → login intent). Pass ONLY when an authenticated/home state is observed; OTP/MFA → needs_input.
335
+ // > login intent). Pass ONLY when an authenticated/home state is observed; OTP/MFA > needs_input.
199
336
  try {
200
337
  const fr2 = await runFirstRun(sessions, session, driver, { mode: 'until_home', allowGeneratedAccount: true });
201
338
  let login;
202
339
  if (fr2.state === 'completed')
203
- login = { status: 'pass', reason: `re-authenticated to home with the generated account (${fr2.pathTaken ?? 'login'})`, evidenceUris: fr2.evidenceUris, workflow: 'account_cycle' };
340
+ login = {
341
+ status: 'pass',
342
+ reason: `re-authenticated to home with the generated account (${fr2.pathTaken ?? 'login'})`,
343
+ evidenceUris: fr2.evidenceUris,
344
+ workflow: 'account_cycle',
345
+ };
204
346
  else if (fr2.accountOutcome === 'reached_verification')
205
- login = { status: 'blocked', category: 'hard_gate', severity: 'medium', reason: 'login-again hit an OTP/verification gate (needs a real code)', evidenceUris: fr2.evidenceUris, workflow: 'account_cycle' };
347
+ login = {
348
+ status: 'blocked',
349
+ category: 'hard_gate',
350
+ severity: 'medium',
351
+ reason: 'login-again hit an OTP/verification gate (needs a real code)',
352
+ evidenceUris: fr2.evidenceUris,
353
+ workflow: 'account_cycle',
354
+ };
206
355
  else if (fr2.needsInput)
207
- login = { status: 'blocked', category: 'hard_gate', severity: 'medium', reason: `login-again needs input: ${fr2.needsInput.reason}`, evidenceUris: fr2.evidenceUris, workflow: 'account_cycle' };
356
+ login = {
357
+ status: 'blocked',
358
+ category: 'hard_gate',
359
+ severity: 'medium',
360
+ reason: `login-again needs input: ${fr2.needsInput.reason}`,
361
+ evidenceUris: fr2.evidenceUris,
362
+ workflow: 'account_cycle',
363
+ };
208
364
  else
209
- login = { status: 'fail', category: 'app_bug', severity: 'high', reason: `could not log back in with the generated account (${fr2.state}: ${fr2.stoppedReason})`, evidenceUris: fr2.evidenceUris, workflow: 'account_cycle' };
365
+ login = {
366
+ status: 'fail',
367
+ category: 'app_bug',
368
+ severity: 'high',
369
+ reason: `could not log back in with the generated account (${fr2.state}: ${fr2.stoppedReason})`,
370
+ evidenceUris: fr2.evidenceUris,
371
+ workflow: 'account_cycle',
372
+ };
210
373
  await finalize('login_again', 'Login again', login);
211
374
  }
212
375
  catch (e) {
213
- await finalize('login_again', 'Login again', { status: 'fail', category: 'app_bug', severity: 'high', reason: `login-again errored: ${String(e.message ?? e)}`, evidenceUris: [], workflow: 'account_cycle' });
376
+ await finalize('login_again', 'Login again', {
377
+ status: 'fail',
378
+ category: 'app_bug',
379
+ severity: 'high',
380
+ reason: `login-again errored: ${String(e.message ?? e)}`,
381
+ evidenceUris: [],
382
+ workflow: 'account_cycle',
383
+ });
214
384
  }
215
385
  // Finalize forgot-password with the evidence captured on the logged-out surface (above).
216
386
  await finalize('forgot_password', 'Forgot password surface', forgotResult);
217
387
  }
218
388
  else {
219
- for (const [id, title] of [['logout', 'Logout'], ['login_again', 'Login again'], ['forgot_password', 'Forgot password surface']]) {
220
- await finalize(id, title, { status: 'skipped', reason: 'account not established this run', evidenceUris: [], workflow: 'account_cycle' });
389
+ for (const [id, title] of [
390
+ ['logout', 'Logout'],
391
+ ['login_again', 'Login again'],
392
+ ['forgot_password', 'Forgot password surface'],
393
+ ]) {
394
+ await finalize(id, title, {
395
+ status: 'skipped',
396
+ reason: 'account not established this run',
397
+ evidenceUris: [],
398
+ workflow: 'account_cycle',
399
+ });
221
400
  }
222
401
  }
223
402
  return runState;