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,15 +1,16 @@
1
- // SWIPIUM-REQ-04 — README emitter. Pure: documents the generated suite, the required environment
1
+ // README emitter. Pure: documents the generated suite, the required environment
2
2
  // variables (app id/path, device, Appium host/port, credentials, test data), and the exact run
3
3
  // commands. Honest about platform coverage and non-release-grade fallbacks.
4
- function envTable(model, isPython) {
4
+ import { defaultPlatformOf } from './platformResolve.js';
5
+ function envTable(model, isPython, primary) {
5
6
  const common = [
6
7
  '| `APPIUM_HOST` / `APPIUM_PORT`' + (isPython ? ' / `APPIUM_URL`' : '') + ' | Appium server location (default 127.0.0.1:4723) |',
7
- '| `SWIPIUM_PLATFORM` | `android` (default) or `ios` |',
8
+ `| \`SWIPIUM_PLATFORM\` | ${primary === 'ios' ? '`ios` (default) or `android`' : '`android` (default) or `ios`'} |`,
8
9
  '| `ANDROID_DEVICE_NAME`, `ANDROID_APP_PACKAGE`, `ANDROID_APP_ACTIVITY`, `ANDROID_APP_PATH`, `ANDROID_UDID` | Android target/app |',
9
10
  '| `IOS_DEVICE_NAME`, `IOS_BUNDLE_ID`, `IOS_APP_PATH`, `IOS_UDID` | iOS target/app (when SWIPIUM_PLATFORM=ios) |',
10
11
  ];
11
12
  const data = model.variables.map((v) => `| \`${v}\` | test data (non-secret) |`);
12
- const secrets = model.secrets.map((v) => `| \`${v}\` | **secret** — provide via environment/CI secrets only |`);
13
+ const secrets = model.secrets.map((v) => `| \`${v}\` | **secret**, provide via environment/CI secrets only |`);
13
14
  return ['| Variable | Purpose |', '| --- | --- |', ...common, ...data, ...secrets];
14
15
  }
15
16
  export function emitReadme(input) {
@@ -27,7 +28,7 @@ export function emitReadme(input) {
27
28
  : '```sh\nnpm install\nnpx appium & # or rely on the @wdio/appium-service\nnpm test\n```';
28
29
  const brittle = model.audit.brittle;
29
30
  const lines = [];
30
- lines.push(`# ${input.appId ?? 'App'} — Appium ${isPython ? 'Python' : 'WebdriverIO'} POM suite`);
31
+ lines.push(`# ${input.appId ?? 'App'}: Appium ${isPython ? 'Python' : 'WebdriverIO'} POM suite`);
31
32
  lines.push('');
32
33
  lines.push('> Generated by Swipium from recorded QA actions. **Review before committing.**');
33
34
  lines.push('');
@@ -47,7 +48,7 @@ export function emitReadme(input) {
47
48
  lines.push('');
48
49
  lines.push('## Environment variables');
49
50
  lines.push('');
50
- lines.push(...envTable(model, isPython));
51
+ lines.push(...envTable(model, isPython, defaultPlatformOf(profile, model)));
51
52
  lines.push('');
52
53
  lines.push('## Locator readiness');
53
54
  lines.push('');
@@ -1 +1 @@
1
- {"version":3,"file":"readmeEmitter.js","sourceRoot":"","sources":["../../src/automationGen/readmeEmitter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"readmeEmitter.js","sourceRoot":"","sources":["../../src/automationGen/readmeEmitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,388 @@
1
+ // "Automate my app". Generates a runnable JS/TS or Python Appium POM suite from a
2
+ // session's recorded actions, adapting to the project's language/platform/test stack.
3
+ //
4
+ // runAutomationPlan: read-only core for qa_generate target:"appium" mode:"plan":
5
+ // project profile + generation plan + blockers.
6
+ // runAutomationGenerate: core for qa_generate target:"appium": emit + write the JS/Python
7
+ // suite (+ README, optional CI), validate.
8
+ //
9
+ // The canonical Swipium YAML/POM remains the intermediate model (non-goal: don't replace it). JS/Python
10
+ // are emitted on top so they can't drift. Project-file mutation (integrateIntoProject) is consent-gated.
11
+ // Both cores are registered through qa_generate (src/tools/generate.ts). This module registers no tool.
12
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
13
+ import { join, dirname } from 'node:path';
14
+ import { qaOk, qaError, unknownSessionError } from '../lib/result.js';
15
+ import { unresolvedProjectRootError } from '../context/projectRoot.js';
16
+ import { requireConsent, consumeConsent } from '../consent/consent.js';
17
+ import { assembleAutomationSuite, buildAutomationProfile, writeAutomationFiles, mapPresent } from '../services/automationGenerate.js';
18
+ import { buildSuitePlan } from './suitePlan.js';
19
+ import { buildProjectProfile } from './projectProfile.js';
20
+ import { validateGeneratedSuite } from './validation.js';
21
+ import { structuralLiterals } from '../suite/secretGuard.js';
22
+ import { UnemittableStepError } from './identifiers.js';
23
+ import { getDriver } from '../session/attach.js';
24
+ import { runExplore } from '../explore/runner.js';
25
+ import { ensurePrelaunchAppMap } from '../appMap/prelaunch.js';
26
+ import { loadAppMap } from '../appMap/store.js';
27
+ import { detectFramework } from '../context/detect.js';
28
+ import { deriveAutomationLinks, linkAutomationSuite } from '../appMap/automationLink.js';
29
+ import { mergeFromAutomation } from '../services/testSuiteKnowledge.js';
30
+ import { bootstrapFeatureExecution } from '../featureTesting/executionBootstrap.js';
31
+ import { log } from '../lib/logger.js';
32
+ /** Merge a prebuilt appMapUri into a tool result's structured content (Fix 6: a bootstrap blocker
33
+ * still built the static map, so the URI must survive on the returned blocker/consent result). */
34
+ function withAppMapUri(result, appMapUri) {
35
+ if (!appMapUri)
36
+ return result;
37
+ const sc = (result.structuredContent ?? {});
38
+ if (sc.appMapUri)
39
+ return result;
40
+ return { ...result, structuredContent: { ...sc, appMapUri } };
41
+ }
42
+ function resolveRoot(sessions, sessionId, projectRoot) {
43
+ if (sessionId) {
44
+ const session = sessions.get(sessionId);
45
+ if (session)
46
+ return { session, root: session.root };
47
+ }
48
+ return { root: projectRoot };
49
+ }
50
+ /** profileInputs from tool args. */
51
+ function profileInputs(language, platform, integrateIntoProject) {
52
+ return {
53
+ language: (language ?? 'auto'),
54
+ platform: (platform ?? 'auto'),
55
+ integrateIntoProject: integrateIntoProject ?? false,
56
+ };
57
+ }
58
+ /**
59
+ * Core handler for qa_generate target:"appium" mode:"plan". Read-only: inspect the project
60
+ * (language, platform support, existing test stack) and build a plan for an "Automate my app"
61
+ * Appium POM suite: selected automation language, backends, coverage, files planned, blockers.
62
+ */
63
+ /** A recorded step the generators cannot express as real code. Fail generation with the reason
64
+ * instead of writing a suite that silently skips the step (§4). */
65
+ function unemittable(e, extra = {}) {
66
+ return qaError({
67
+ what: `Automation suite not generated: ${e.message}`,
68
+ changedState: false,
69
+ retrySafe: false,
70
+ failureCode: e.code,
71
+ nextSteps: [
72
+ 'Re-record the step with qa_act (supported: tap, type, swipe/scroll up|down|left|right, press back|home|enter, open_url), then regenerate.',
73
+ ],
74
+ }, extra);
75
+ }
76
+ export async function runAutomationPlan(sessions, { sessionId, projectRoot, feature, language, platform, backend, includeCi }) {
77
+ const { session, root } = resolveRoot(sessions, sessionId, projectRoot);
78
+ if (!root)
79
+ return unresolvedProjectRootError({ source: 'none' }, { nextSteps: ['Pass sessionId or an absolute projectRoot.'] });
80
+ const inputs = profileInputs(language, platform);
81
+ const profile = session ? buildAutomationProfile(session, inputs) : buildAutomationProfileFromRoot(root, inputs);
82
+ let plan;
83
+ if (session && session.recordedActions.length) {
84
+ let assembled;
85
+ try {
86
+ assembled = assembleAutomationSuite(session, { ...inputs, includeCi });
87
+ }
88
+ catch (e) {
89
+ if (e instanceof UnemittableStepError)
90
+ return unemittable(e);
91
+ throw e;
92
+ }
93
+ plan = assembled.plan;
94
+ }
95
+ else {
96
+ plan = buildSuitePlan(profile, { actionCount: session?.recordedActions.length ?? 0, mapPresent: mapPresent(root), includeCi });
97
+ }
98
+ const backendNote = backend && backend !== 'auto' && backend !== 'appium'
99
+ ? `\nNote: backend=${backend} requested; Appium code is generated as an ADDITIONAL layer; existing ${backend} flows are kept.`
100
+ : '';
101
+ const featureNote = feature ? ` (feature focus: ${feature})` : '';
102
+ const summary = `Automation plan${featureNote}: ${profile.automationLanguage} / ${profile.testFramework}, ` +
103
+ `default backend ${profile.defaultBackend}${profile.secondaryBackend ? ` (+${profile.secondaryBackend})` : ''}.\n` +
104
+ `platforms: android=${profile.platforms.android.level}, ios=${profile.platforms.ios.level}\n` +
105
+ (plan.mapCoverage
106
+ ? `coverage: ${plan.mapCoverage.actionCount} step(s), ${plan.mapCoverage.screenCount} screen(s); locators ${plan.locatorReadiness} (${plan.mapCoverage.brittlePct}% brittle)`
107
+ : 'coverage: no recorded actions yet') +
108
+ (plan.blockers.length ? `\nblockers: ${plan.blockers.map((b) => b.code).join(', ')}` : '') +
109
+ `\nfiles planned: ${plan.filesPlanned.length}\nnext: ${plan.nextAction}` +
110
+ backendNote;
111
+ return qaOk({ profile, plan, feature: feature ?? null, backend: backend ?? 'auto' }, summary);
112
+ }
113
+ /**
114
+ * Core handler for qa_generate target:"appium". Generates a runnable Appium POM suite from the
115
+ * session's recorded actions (WebdriverIO TS/JS or Python), bootstrapping a device/session/actions
116
+ * from projectRoot when none exist. Never inlines secrets; integrateIntoProject is consent-gated.
117
+ */
118
+ export async function runAutomationGenerate(server, sessions, { sessionId, projectRoot, bootstrap, feature, device, name, language, platform, save, integrateIntoProject, includeCi, candidateOnly, brittleThreshold, consentId, approve, }) {
119
+ let session = sessionId ? sessions.get(sessionId) : undefined;
120
+ if (sessionId && !session)
121
+ return unknownSessionError(sessionId, ['Call qa_start_session first, or omit sessionId to bootstrap from projectRoot.']);
122
+ // Fix 6: one-call "Automate my app": when no session/actions exist, build the static app map
123
+ // (so it always exists) and bootstrap a device (consent-gated) + record actions via exploration.
124
+ const wantBootstrap = bootstrap !== false && (bootstrap === true || bootstrap === 'auto' || !sessionId);
125
+ let appMapUri;
126
+ const rootForMap = session?.root ?? (projectRoot && projectRoot.trim() ? projectRoot.trim() : undefined);
127
+ if (rootForMap && existsSync(rootForMap)) {
128
+ try {
129
+ appMapUri = ensurePrelaunchAppMap(rootForMap, { at: new Date().toISOString() }).appMapUri;
130
+ }
131
+ catch (e) {
132
+ log('warn', 'automation prelaunch app map failed', { err: String(e) });
133
+ }
134
+ }
135
+ if ((!session || !session.recordedActions.length) && wantBootstrap) {
136
+ let driver = session ? (await getDriver(session)).driver : undefined;
137
+ if (!session || !driver) {
138
+ if (!projectRoot?.trim() && !session) {
139
+ return qaError({
140
+ what: 'Need a sessionId or projectRoot to bootstrap an automation suite',
141
+ changedState: false,
142
+ retrySafe: true,
143
+ nextSteps: ['Pass projectRoot="/abs/path" (bootstrap defaults on), or a prepared sessionId.'],
144
+ }, appMapUri ? { appMapUri } : {});
145
+ }
146
+ const boot = await bootstrapFeatureExecution({
147
+ server,
148
+ sessions,
149
+ projectRoot: projectRoot?.trim() ?? session.root,
150
+ feature: feature ?? 'create automation suite',
151
+ platform: platform === 'android' || platform === 'ios' ? platform : undefined,
152
+ device,
153
+ consentId,
154
+ approve,
155
+ });
156
+ // Honest target blocker / consent request. But the static app map WAS still built, so the
157
+ // caller can read it even though no device/artifact is available (Fix 6 acceptance).
158
+ if (!boot.ok)
159
+ return withAppMapUri(boot.result, appMapUri);
160
+ session = boot.session;
161
+ driver = boot.driver;
162
+ if (!appMapUri && existsSync(session.root)) {
163
+ try {
164
+ appMapUri = ensurePrelaunchAppMap(session.root, { at: new Date().toISOString() }).appMapUri;
165
+ }
166
+ catch {
167
+ /* best-effort */
168
+ }
169
+ }
170
+ }
171
+ // Record durable actions via a bounded, safe exploration so generation has something to emit.
172
+ if (driver && !session.recordedActions.length) {
173
+ try {
174
+ await runExplore(sessions, session, driver, { goal: feature, maxScreens: 6, maxActions: 16, stopOnAuth: true });
175
+ }
176
+ catch (e) {
177
+ log('warn', 'automation bootstrap exploration failed', { err: String(e) });
178
+ }
179
+ }
180
+ }
181
+ if (!session)
182
+ return qaError({
183
+ what: 'Need a sessionId or projectRoot',
184
+ changedState: false,
185
+ retrySafe: true,
186
+ nextSteps: ['Pass a prepared sessionId, or projectRoot to bootstrap.'],
187
+ }, appMapUri ? { appMapUri } : {});
188
+ if (!session.recordedActions.length) {
189
+ return qaError({
190
+ what: 'No recorded actions to turn into an automation suite (bootstrap could not record any)',
191
+ changedState: false,
192
+ retrySafe: true,
193
+ failureCode: 'NO_RECORDED_ACTIONS',
194
+ nextSteps: [
195
+ 'Run qa_test_this { goal: "create_automation_suite" } (smoke + explore records actions + builds the app map), then re-run qa_generate target:"appium".',
196
+ 'Or drive the app with qa_act/qa_smoke/qa_explore first.',
197
+ ],
198
+ }, appMapUri ? { appMapUri } : {});
199
+ }
200
+ const inputs = profileInputs(language, platform, integrateIntoProject);
201
+ let assembled;
202
+ try {
203
+ assembled = assembleAutomationSuite(session, { ...inputs, name, includeCi });
204
+ }
205
+ catch (e) {
206
+ if (e instanceof UnemittableStepError)
207
+ return unemittable(e, appMapUri ? { appMapUri } : {});
208
+ throw e;
209
+ }
210
+ const validation = validateGeneratedSuite(assembled.files, {
211
+ brittlePct: assembled.model.audit.brittlePct,
212
+ brittleThreshold,
213
+ candidateOnly,
214
+ secrets: assembled.model.secrets,
215
+ secretValues: session.secrets,
216
+ structural: structuralLiterals(session.recordedActions),
217
+ });
218
+ // Defense in depth: a registered secret value in ANY generated file fails generation loudly,
219
+ // nothing is written (neither the suite nor the test-suite.json merge).
220
+ const leakFindings = validation.findings.filter((f) => f.code === 'SECRET_IN_GENERATED_OUTPUT');
221
+ if (leakFindings.length) {
222
+ return qaError({
223
+ what: `Automation suite not generated: a registered secret value would be written in plaintext (${leakFindings
224
+ .slice(0, 5)
225
+ .map((f) => f.file)
226
+ .join(', ')})`,
227
+ changedState: false,
228
+ retrySafe: false,
229
+ failureCode: 'SECRET_IN_GENERATED_OUTPUT',
230
+ nextSteps: ['Nothing was written. Re-record the credential step so it is captured as a ${VAR}, then regenerate.'],
231
+ }, { validation, ...(appMapUri ? { appMapUri } : {}) });
232
+ }
233
+ const doSave = save !== false;
234
+ let written = [];
235
+ let targetDir = assembled.outputDir;
236
+ let integrated = false;
237
+ let skippedExisting = [];
238
+ if (doSave && integrateIntoProject) {
239
+ // Consent-gated project mutation; never overwrite existing files.
240
+ const projectDir = projectTestDir(session.root, assembled.profile.automationLanguage);
241
+ const affects = { projectDir, files: assembled.files.map((f) => f.path) };
242
+ const gate = consumeConsent(consentId, approve, { action: 'automation_project_write', affects });
243
+ if (!gate.approved) {
244
+ return requireConsent({
245
+ action: 'automation_project_write',
246
+ risk: 'medium',
247
+ exactCommand: `write ${assembled.files.length} files into ${projectDir} (no overwrite)`,
248
+ affects,
249
+ explain: `Write the generated Appium suite into your project at ${projectDir}? Existing files are never overwritten.`,
250
+ });
251
+ }
252
+ const res = writeProjectFilesNoOverwrite(session.root, projectDir, assembled.files);
253
+ written = res.written;
254
+ skippedExisting = res.skipped;
255
+ targetDir = projectDir;
256
+ integrated = true;
257
+ sessions.recordMutation(session, {
258
+ tool: 'qa_generate',
259
+ action: 'automation_project_write',
260
+ risk: 'medium',
261
+ target: affects,
262
+ consent: { required: true, consentId, approved: true },
263
+ status: 'executed',
264
+ });
265
+ }
266
+ else if (doSave) {
267
+ written = writeAutomationFiles(session.root, assembled.outputDir, assembled.files);
268
+ }
269
+ // Fix 7: link the generated suite back into the durable app map + persistent suite, so future
270
+ // feature/ticket decisions know which flows are automated. Best-effort (warnings, never fatal).
271
+ let suiteDelta;
272
+ let suiteUri;
273
+ const automationWarnings = [];
274
+ if (doSave) {
275
+ const now = new Date().toISOString();
276
+ const screenNames = assembled.model.screens.map((s) => s.pageName || s.className);
277
+ try {
278
+ const fw = detectFramework(session.root);
279
+ const fallback = {
280
+ root: session.root,
281
+ gitRemote: null,
282
+ packageName: null,
283
+ workspaceTarget: null,
284
+ framework: fw,
285
+ platforms: fw === 'native-android' ? ['android'] : fw === 'native-ios' ? ['ios'] : ['android', 'ios'],
286
+ };
287
+ const existingMap = loadAppMap(session.root, fallback, now).map;
288
+ const links = existingMap ? deriveAutomationLinks(existingMap, screenNames) : { screenIds: [], featureIds: [] };
289
+ const suiteRef = {
290
+ name: name ?? `swipium-appium-${assembled.profile.automationLanguage}`,
291
+ path: targetDir,
292
+ framework: assembled.profile.automationLanguage === 'python' ? 'appium-python' : 'wdio',
293
+ linkedFeatureIds: links.featureIds,
294
+ linkedScreenIds: links.screenIds,
295
+ };
296
+ const linkRes = linkAutomationSuite(session.root, suiteRef, now);
297
+ if (linkRes.ok)
298
+ appMapUri = linkRes.appMapUri ?? appMapUri;
299
+ else
300
+ automationWarnings.push('app map not found; automation suite not linked into the map');
301
+ }
302
+ catch (e) {
303
+ automationWarnings.push(`app-map automation link failed: ${String(e)}`);
304
+ }
305
+ try {
306
+ const fw2 = detectFramework(session.root);
307
+ const fb2 = {
308
+ root: session.root,
309
+ gitRemote: null,
310
+ packageName: null,
311
+ workspaceTarget: null,
312
+ framework: fw2,
313
+ platforms: fw2 === 'native-android' ? ['android'] : fw2 === 'native-ios' ? ['ios'] : ['android', 'ios'],
314
+ };
315
+ const mapForLinks = loadAppMap(session.root, fb2, now).map;
316
+ const links = mapForLinks
317
+ ? deriveAutomationLinks(mapForLinks, assembled.model.screens.map((s) => s.pageName || s.className))
318
+ : { screenIds: [], featureIds: [] };
319
+ const merge = mergeFromAutomation(session.root, session, { assembled, validationOk: validation.ok, links }, { source: 'generate', now, runId: `automation-${Date.now()}`, sourceUri: appMapUri, appId: session.appId, sessionId: session.id });
320
+ suiteDelta = merge.delta;
321
+ suiteUri = merge.suiteUri;
322
+ if (merge.warning)
323
+ automationWarnings.push(merge.warning);
324
+ }
325
+ catch (e) {
326
+ automationWarnings.push(`suite automation merge failed: ${String(e)}`);
327
+ }
328
+ }
329
+ const a = assembled.model.audit;
330
+ const recommendation = integrated
331
+ ? undefined
332
+ : assembled.profile.outputMode === 'project_native'
333
+ ? 'Copy the suite into your project test dir, or re-run with integrateIntoProject:true (consent-gated).'
334
+ : `Generated under ${assembled.outputDir}. Install deps (${assembled.dependencyPatch.notes[0]}) and run per the README.`;
335
+ const summary = `✅ Generated ${assembled.profile.automationLanguage} Appium POM suite (${assembled.model.screens.length} screen(s), ${assembled.files.length} files).\n` +
336
+ `runner ${assembled.profile.testFramework}; backend ${assembled.profile.defaultBackend}${assembled.profile.secondaryBackend ? ` (+${assembled.profile.secondaryBackend})` : ''}\n` +
337
+ `locators: ${a.durable} durable / ${a.semi} semi / ${a.brittle} brittle (${a.brittlePct}% brittle)\n` +
338
+ `validation: ${validation.ok ? 'passed' : 'FAILED'} (${validation.findings.filter((f) => f.severity === 'error').length} error, ${validation.findings.filter((f) => f.severity === 'warning').length} warn); secrets ${validation.secretsClean ? 'clean' : 'LEAK'}\n` +
339
+ (written.length ? `wrote ${written.length} files under ${join(session.root, targetDir)}` : '(preview, pass save:true)') +
340
+ (skippedExisting.length
341
+ ? `\nskipped ${skippedExisting.length} existing file(s) (no overwrite): ${skippedExisting.slice(0, 5).join(', ')}`
342
+ : '') +
343
+ (recommendation ? `\n${recommendation}` : '');
344
+ return qaOk({
345
+ profile: assembled.profile,
346
+ outputDir: targetDir,
347
+ integrated,
348
+ files: assembled.files.map((f) => f.path),
349
+ written,
350
+ skippedExisting,
351
+ screens: assembled.model.screens.map((s) => s.className),
352
+ variables: assembled.model.variables,
353
+ secrets: assembled.model.secrets,
354
+ audit: a,
355
+ validation,
356
+ dependencyPatch: assembled.dependencyPatch,
357
+ plan: assembled.plan,
358
+ appMapUri: appMapUri ?? null,
359
+ suiteDelta: suiteDelta ?? null,
360
+ suiteUri: suiteUri ?? null,
361
+ automationWarnings,
362
+ }, summary);
363
+ }
364
+ // ---- helpers that need root-only (no session) profile ----
365
+ function buildAutomationProfileFromRoot(root, inputs) {
366
+ return buildProjectProfile(root, inputs);
367
+ }
368
+ function projectTestDir(root, language) {
369
+ const candidates = language === 'python' ? ['tests/e2e', 'e2e', 'tests'] : ['e2e', 'test/e2e', 'tests/e2e'];
370
+ const found = candidates.find((c) => existsSync(join(root, c)));
371
+ return found ?? (language === 'python' ? 'tests/e2e' : 'e2e');
372
+ }
373
+ function writeProjectFilesNoOverwrite(root, dir, files) {
374
+ const written = [];
375
+ const skipped = [];
376
+ for (const f of files) {
377
+ const abs = join(root, dir, f.path);
378
+ if (existsSync(abs)) {
379
+ skipped.push(f.path);
380
+ continue;
381
+ }
382
+ mkdirSync(dirname(abs), { recursive: true });
383
+ writeFileSync(abs, f.content);
384
+ written.push(abs);
385
+ }
386
+ return { written, skipped };
387
+ }
388
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/automationGen/run.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- // SWIPIUM-REQ-04 — suite-generation plan. Pure: assembles the read-only plan behind
2
- // qa_automation_plan from the project profile + (optional) Appium model. No device, no writes.
1
+ // Suite-generation plan. Pure: assembles the read-only plan behind
2
+ // the qa_generate target:"appium" plan from the project profile + (optional) Appium model. No device, no writes.
3
3
  // Honest about prerequisites (map/recorded actions) and locator readiness.
4
4
  import { emitJsSuite } from './jsEmitter.js';
5
5
  import { emitPythonSuite } from './pythonEmitter.js';
6
- /** .swipium/automation/<dir> — js for TS/JS, python for Python (matches REQ-04 layout). */
6
+ /** .swipium/automation/<dir>: js for TS/JS, python for Python (the generated-suite layout). */
7
7
  export function outputDirFor(language) {
8
8
  return `.swipium/automation/${language === 'python' ? 'python' : 'js'}`;
9
9
  }
@@ -23,7 +23,7 @@ export function buildSuitePlan(profile, opts = {}) {
23
23
  const blockers = [];
24
24
  const prerequisites = [];
25
25
  const hasActions = !!opts.model && opts.model.steps.length > 0;
26
- const actionCount = opts.model ? opts.model.steps.length : opts.actionCount ?? 0;
26
+ const actionCount = opts.model ? opts.model.steps.length : (opts.actionCount ?? 0);
27
27
  let mapCoverage = null;
28
28
  let filesPlanned = [];
29
29
  if (opts.model) {
@@ -38,7 +38,12 @@ export function buildSuitePlan(profile, opts = {}) {
38
38
  brittlePct: a.brittlePct,
39
39
  };
40
40
  const files = language === 'python'
41
- ? emitPythonSuite({ model: opts.model, profile, appId: opts.appId, framework: profile.testFramework === 'pytest' ? 'pytest' : 'unittest' })
41
+ ? emitPythonSuite({
42
+ model: opts.model,
43
+ profile,
44
+ appId: opts.appId,
45
+ framework: profile.testFramework === 'pytest' ? 'pytest' : 'unittest',
46
+ })
42
47
  : emitJsSuite({ model: opts.model, profile, appId: opts.appId, language });
43
48
  filesPlanned = files.map((f) => `${outputDir}/${f.path}`);
44
49
  filesPlanned.push(`${outputDir}/README.md`);
@@ -46,11 +51,11 @@ export function buildSuitePlan(profile, opts = {}) {
46
51
  filesPlanned.push(`${outputDir}/ci.example.yml`);
47
52
  }
48
53
  else {
49
- // No model yet — list the skeleton we WOULD generate, and require a recording/map pass first.
54
+ // No model yet: list the skeleton we WOULD generate, and require a recording/map pass first.
50
55
  blockers.push({
51
56
  code: 'NO_RECORDED_ACTIONS',
52
57
  detail: 'No recorded actions / app map to turn into a POM suite.',
53
- nextStep: 'Run qa_test_this { goal: "create_automation_suite" } (smoke + explore records actions), or qa_explore to build the app map, then re-run qa_automation_generate.',
58
+ nextStep: 'Run qa_test_this { goal: "create_automation_suite" } (smoke + explore records actions), or qa_explore to build the app map, then re-run qa_generate target:"appium".',
54
59
  });
55
60
  prerequisites.push('Record actions via qa_test_this/qa_smoke/qa_explore, or build the app map first.');
56
61
  }
@@ -68,20 +73,22 @@ export function buildSuitePlan(profile, opts = {}) {
68
73
  if (mapCoverage && mapCoverage.brittle > 0) {
69
74
  blockers.push({
70
75
  code: 'BRITTLE_LOCATORS',
71
- detail: `${mapCoverage.brittle} brittle/coordinate locator(s) (${mapCoverage.brittlePct}% brittle) — not release-grade.`,
76
+ detail: `${mapCoverage.brittle} brittle/coordinate locator(s) (${mapCoverage.brittlePct}% brittle), not release-grade.`,
72
77
  nextStep: 'Add durable accessibility id / resource-id / testID; generated suite marks these as candidate-only.',
73
78
  });
74
79
  }
75
80
  const nextAction = blockers.some((b) => b.code === 'NO_RECORDED_ACTIONS')
76
81
  ? 'qa_test_this { goal: "create_automation_suite" }'
77
82
  : blockers.some((b) => b.code === 'NO_PLATFORM_SUPPORT')
78
- ? 'qa_automation_plan { platform: "android" }'
79
- : 'qa_automation_generate { save: true }';
83
+ ? 'qa_generate { target: "appium", mode: "plan", platform: "android" }'
84
+ : 'qa_generate { target: "appium", save: true }';
80
85
  return {
81
86
  profile,
82
87
  language,
83
88
  outputDir,
84
89
  platforms,
90
+ primaryPlatform: profile.primaryPlatform ?? (profile.defaultBackend === 'appium-xcuitest' ? 'ios' : 'android'),
91
+ platformSource: profile.platformSource ?? 'project',
85
92
  backends: { default: profile.defaultBackend, secondary: profile.secondaryBackend },
86
93
  mapCoverage,
87
94
  prerequisites,
@@ -1 +1 @@
1
- {"version":3,"file":"suitePlan.js","sourceRoot":"","sources":["../../src/automationGen/suitePlan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"suitePlan.js","sourceRoot":"","sources":["../../src/automationGen/suitePlan.ts"],"names":[],"mappings":"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"}