swipium 1.3.0 → 1.5.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.
- package/CHANGELOG.md +142 -0
- package/README.md +89 -25
- package/THREAT_MODEL.md +1 -1
- package/dist/appMap/automationLink.js +13 -3
- package/dist/appMap/automationLink.js.map +1 -1
- package/dist/appMap/build.js +28 -6
- package/dist/appMap/build.js.map +1 -1
- package/dist/appMap/codeIndex.js +29 -3
- package/dist/appMap/codeIndex.js.map +1 -1
- package/dist/appMap/featureIndex.js +20 -2
- package/dist/appMap/featureIndex.js.map +1 -1
- package/dist/appMap/featureModel.js +42 -6
- package/dist/appMap/featureModel.js.map +1 -1
- package/dist/appMap/firstRunApply.js +22 -4
- package/dist/appMap/firstRunApply.js.map +1 -1
- package/dist/appMap/fsWalk.js +19 -2
- package/dist/appMap/fsWalk.js.map +1 -1
- package/dist/appMap/issues.js +0 -20
- package/dist/appMap/issues.js.map +1 -1
- package/dist/appMap/migrations.js +1 -1
- package/dist/appMap/migrations.js.map +1 -1
- package/dist/appMap/prelaunch.js.map +1 -1
- package/dist/appMap/projectRegistry.js +8 -2
- package/dist/appMap/projectRegistry.js.map +1 -1
- package/dist/appMap/query.js +20 -4
- package/dist/appMap/query.js.map +1 -1
- package/dist/appMap/runtimeMerge.js +9 -2
- package/dist/appMap/runtimeMerge.js.map +1 -1
- package/dist/appMap/schema.js.map +1 -1
- package/dist/appMap/screenMatch.js +5 -1
- package/dist/appMap/screenMatch.js.map +1 -1
- package/dist/appMap/staticScan.js +134 -22
- package/dist/appMap/staticScan.js.map +1 -1
- package/dist/appMap/store.js +4 -79
- package/dist/appMap/store.js.map +1 -1
- package/dist/appMap/tsAstScan.js +31 -9
- package/dist/appMap/tsAstScan.js.map +1 -1
- package/dist/artifacts/bundletool.js +44 -7
- package/dist/artifacts/bundletool.js.map +1 -1
- package/dist/artifacts/resolve.js +33 -6
- package/dist/artifacts/resolve.js.map +1 -1
- package/dist/automation/capabilities.js +109 -27
- package/dist/automation/capabilities.js.map +1 -1
- package/dist/automation/gestures.js +5 -1
- package/dist/automation/gestures.js.map +1 -1
- package/dist/automation/plan.js +65 -17
- package/dist/automation/plan.js.map +1 -1
- package/dist/automation/report.js +12 -2
- package/dist/automation/report.js.map +1 -1
- package/dist/automation/selectors.js +8 -3
- package/dist/automation/selectors.js.map +1 -1
- package/dist/automation/types.js.map +1 -1
- package/dist/automation/waits.js +9 -3
- package/dist/automation/waits.js.map +1 -1
- package/dist/automation/webview.js +7 -1
- package/dist/automation/webview.js.map +1 -1
- package/dist/automationGen/appiumModel.js +3 -1
- package/dist/automationGen/appiumModel.js.map +1 -1
- package/dist/automationGen/ciEmitter.js +1 -1
- package/dist/automationGen/ciEmitter.js.map +1 -1
- package/dist/automationGen/jsEmitter.js +29 -21
- package/dist/automationGen/jsEmitter.js.map +1 -1
- package/dist/automationGen/projectProfile.js +5 -1
- package/dist/automationGen/projectProfile.js.map +1 -1
- package/dist/automationGen/pythonEmitter.js +3 -3
- package/dist/automationGen/pythonEmitter.js.map +1 -1
- package/dist/automationGen/readmeEmitter.js.map +1 -1
- package/dist/automationGen/suitePlan.js +11 -6
- package/dist/automationGen/suitePlan.js.map +1 -1
- package/dist/automationGen/validation.js +33 -5
- package/dist/automationGen/validation.js.map +1 -1
- package/dist/build/parseBuildLog.js +234 -30
- package/dist/build/parseBuildLog.js.map +1 -1
- package/dist/build/plan.js +33 -12
- package/dist/build/plan.js.map +1 -1
- package/dist/ci/preflight.js.map +1 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/scan.js +1 -1
- package/dist/cli/scan.js.map +1 -1
- package/dist/cli/suite.js +2 -2
- package/dist/cli/suite.js.map +1 -1
- package/dist/cli/verify.js.map +1 -1
- package/dist/context/detect.js +10 -4
- package/dist/context/detect.js.map +1 -1
- package/dist/context/findApps.js +16 -2
- package/dist/context/findApps.js.map +1 -1
- package/dist/context/scan.js.map +1 -1
- package/dist/core/target.js +7 -5
- package/dist/core/target.js.map +1 -1
- package/dist/core/targetPlan.js +135 -17
- package/dist/core/targetPlan.js.map +1 -1
- package/dist/drivers/DirectDriver.js +17 -7
- package/dist/drivers/DirectDriver.js.map +1 -1
- package/dist/drivers/SimctlDriver.js +4 -1
- package/dist/drivers/SimctlDriver.js.map +1 -1
- package/dist/drivers/WdaDriver.js +15 -5
- package/dist/drivers/WdaDriver.js.map +1 -1
- package/dist/explore/candidates.js +5 -1
- package/dist/explore/candidates.js.map +1 -1
- package/dist/explore/graph.js +11 -2
- package/dist/explore/graph.js.map +1 -1
- package/dist/explore/memory.js +4 -1
- package/dist/explore/memory.js.map +1 -1
- package/dist/explore/planner.js +54 -9
- package/dist/explore/planner.js.map +1 -1
- package/dist/explore/policy.js +6 -1
- package/dist/explore/policy.js.map +1 -1
- package/dist/explore/runner.js +179 -23
- package/dist/explore/runner.js.map +1 -1
- package/dist/explore/signatures.js +3 -1
- package/dist/explore/signatures.js.map +1 -1
- package/dist/explore/suite.js +3 -1
- package/dist/explore/suite.js.map +1 -1
- package/dist/featureTesting/executionBootstrap.js +128 -19
- package/dist/featureTesting/executionBootstrap.js.map +1 -1
- package/dist/featureTesting/featureMap.js +4 -1
- package/dist/featureTesting/featureMap.js.map +1 -1
- package/dist/featureTesting/featureScope.js +94 -13
- package/dist/featureTesting/featureScope.js.map +1 -1
- package/dist/featureTesting/mapFeatureScope.js +37 -8
- package/dist/featureTesting/mapFeatureScope.js.map +1 -1
- package/dist/featureTesting/objectiveModel.js +5 -1
- package/dist/featureTesting/objectiveModel.js.map +1 -1
- package/dist/featureTesting/resultMerge.js +10 -2
- package/dist/featureTesting/resultMerge.js.map +1 -1
- package/dist/featureTesting/sources.js +4 -1
- package/dist/featureTesting/sources.js.map +1 -1
- package/dist/featureTesting/suiteBridge.js +7 -1
- package/dist/featureTesting/suiteBridge.js.map +1 -1
- package/dist/featureTesting/synonyms.js +31 -3
- package/dist/featureTesting/synonyms.js.map +1 -1
- package/dist/featureTesting/testCaseFactory.js +16 -4
- package/dist/featureTesting/testCaseFactory.js.map +1 -1
- package/dist/featureTesting/testPlan.js +32 -10
- package/dist/featureTesting/testPlan.js.map +1 -1
- package/dist/firstRun/classifyScreen.js +4 -1
- package/dist/firstRun/classifyScreen.js.map +1 -1
- package/dist/firstRun/firstRunPlanner.js +5 -2
- package/dist/firstRun/firstRunPlanner.js.map +1 -1
- package/dist/firstRun/firstRunRunner.js +84 -23
- package/dist/firstRun/firstRunRunner.js.map +1 -1
- package/dist/firstRun/generatedDataPolicy.js +16 -6
- package/dist/firstRun/generatedDataPolicy.js.map +1 -1
- package/dist/firstRun/inputPlanner.js +40 -6
- package/dist/firstRun/inputPlanner.js.map +1 -1
- package/dist/firstRun/paywallPolicy.js.map +1 -1
- package/dist/fixtures/catalog.js +39 -6
- package/dist/fixtures/catalog.js.map +1 -1
- package/dist/flows/generate.js +53 -12
- package/dist/flows/generate.js.map +1 -1
- package/dist/flows/lint.js +88 -14
- package/dist/flows/lint.js.map +1 -1
- package/dist/flows/pack.js +18 -2
- package/dist/flows/pack.js.map +1 -1
- package/dist/flows/repair.js +71 -20
- package/dist/flows/repair.js.map +1 -1
- package/dist/flows/run.js +164 -51
- package/dist/flows/run.js.map +1 -1
- package/dist/flows/schema.js +57 -20
- package/dist/flows/schema.js.map +1 -1
- package/dist/flows/seedExec.js +5 -1
- package/dist/flows/seedExec.js.map +1 -1
- package/dist/ios/signing.js +32 -3
- package/dist/ios/signing.js.map +1 -1
- package/dist/issues/classify.js +12 -4
- package/dist/issues/classify.js.map +1 -1
- package/dist/issues/fingerprint.js +11 -5
- package/dist/issues/fingerprint.js.map +1 -1
- package/dist/issues/index.js +4 -20
- package/dist/issues/index.js.map +1 -1
- package/dist/issues/metrics.js +2 -1
- package/dist/issues/metrics.js.map +1 -1
- package/dist/issues/recurrence.js.map +1 -1
- package/dist/issues/report.js +8 -4
- package/dist/issues/report.js.map +1 -1
- package/dist/issues/reportBridge.js +36 -5
- package/dist/issues/reportBridge.js.map +1 -1
- package/dist/issues/schema.js.map +1 -1
- package/dist/issues/store.js.map +1 -1
- package/dist/lib/android.js +9 -1
- package/dist/lib/android.js.map +1 -1
- package/dist/lib/device.js +21 -5
- package/dist/lib/device.js.map +1 -1
- package/dist/lib/image.js +11 -2
- package/dist/lib/image.js.map +1 -1
- package/dist/lib/lockfile.js +60 -0
- package/dist/lib/lockfile.js.map +1 -0
- package/dist/lib/needsInput.js +6 -3
- package/dist/lib/needsInput.js.map +1 -1
- package/dist/lib/png.js +2 -1
- package/dist/lib/png.js.map +1 -1
- package/dist/lib/result.js +16 -1
- package/dist/lib/result.js.map +1 -1
- package/dist/lib/schemaHash.js +4 -2
- package/dist/lib/schemaHash.js.map +1 -1
- package/dist/lib/sensitive.js +3 -1
- package/dist/lib/sensitive.js.map +1 -1
- package/dist/lib/simctl.js.map +1 -1
- package/dist/lib/spawn.js +29 -10
- package/dist/lib/spawn.js.map +1 -1
- package/dist/lib/wda.js +27 -10
- package/dist/lib/wda.js.map +1 -1
- package/dist/lib/wdaConfig.js +12 -5
- package/dist/lib/wdaConfig.js.map +1 -1
- package/dist/lib/wdaTune.js +52 -23
- package/dist/lib/wdaTune.js.map +1 -1
- package/dist/mobileAudit/checks.js +141 -19
- package/dist/mobileAudit/checks.js.map +1 -1
- package/dist/mobileAudit/profiles.js +120 -19
- package/dist/mobileAudit/profiles.js.map +1 -1
- package/dist/mobileAudit/results.js +7 -2
- package/dist/mobileAudit/results.js.map +1 -1
- package/dist/mobileAudit/runner.js +144 -19
- package/dist/mobileAudit/runner.js.map +1 -1
- package/dist/oracle/auth.js.map +1 -1
- package/dist/oracle/failures.js +888 -131
- package/dist/oracle/failures.js.map +1 -1
- package/dist/oracle/health.js +90 -14
- package/dist/oracle/health.js.map +1 -1
- package/dist/oracle/locator.js +147 -18
- package/dist/oracle/locator.js.map +1 -1
- package/dist/oracle/record.js.map +1 -1
- package/dist/orchestration/goal.js +3 -9
- package/dist/orchestration/goal.js.map +1 -1
- package/dist/orchestration/testThis/execute.js +126 -0
- package/dist/orchestration/testThis/execute.js.map +1 -0
- package/dist/orchestration/testThis/pipeline.js +324 -0
- package/dist/orchestration/testThis/pipeline.js.map +1 -0
- package/dist/orchestration/testThis/plan.js +430 -0
- package/dist/orchestration/testThis/plan.js.map +1 -0
- package/dist/orchestration/testThis/terminal.js +118 -0
- package/dist/orchestration/testThis/terminal.js.map +1 -0
- package/dist/orchestration/testThis/types.js +12 -0
- package/dist/orchestration/testThis/types.js.map +1 -0
- package/dist/plan/plan.js.map +1 -1
- package/dist/prompts/index.js +3 -3
- package/dist/prompts/index.js.map +1 -1
- package/dist/report/coverage.js +0 -1
- package/dist/report/coverage.js.map +1 -1
- package/dist/report/evidence.js.map +1 -1
- package/dist/report/export.js +59 -37
- package/dist/report/export.js.map +1 -1
- package/dist/report/flake.js +13 -14
- package/dist/report/flake.js.map +1 -1
- package/dist/report/history.js +72 -38
- package/dist/report/history.js.map +1 -1
- package/dist/report/policy.js +11 -3
- package/dist/report/policy.js.map +1 -1
- package/dist/report/qaLevel.js +2 -8
- package/dist/report/qaLevel.js.map +1 -1
- package/dist/report/readiness.js +42 -12
- package/dist/report/readiness.js.map +1 -1
- package/dist/report/summary.js.map +1 -1
- package/dist/report/timing.js +23 -23
- package/dist/report/timing.js.map +1 -1
- package/dist/server.js +42 -37
- package/dist/server.js.map +1 -1
- package/dist/services/automationGenerate.js.map +1 -1
- package/dist/services/build.js +8 -2
- package/dist/services/build.js.map +1 -1
- package/dist/services/preflight.js +38 -6
- package/dist/services/preflight.js.map +1 -1
- package/dist/services/prepareAndroid.js +46 -10
- package/dist/services/prepareAndroid.js.map +1 -1
- package/dist/services/prepareIos.js +72 -10
- package/dist/services/prepareIos.js.map +1 -1
- package/dist/services/report.js +173 -37
- package/dist/services/report.js.map +1 -1
- package/dist/services/smoke.js +36 -6
- package/dist/services/smoke.js.map +1 -1
- package/dist/services/suiteGenerate.js +16 -4
- package/dist/services/suiteGenerate.js.map +1 -1
- package/dist/services/testSuiteKnowledge.js +38 -6
- package/dist/services/testSuiteKnowledge.js.map +1 -1
- package/dist/session/attach.js +16 -0
- package/dist/session/attach.js.map +1 -1
- package/dist/session/processRegistry.js +164 -0
- package/dist/session/processRegistry.js.map +1 -0
- package/dist/session/progress.js +1 -1
- package/dist/session/progress.js.map +1 -1
- package/dist/session/store.js +216 -43
- package/dist/session/store.js.map +1 -1
- package/dist/snapshot/overlays.js +7 -2
- package/dist/snapshot/overlays.js.map +1 -1
- package/dist/snapshot/parse.js +2 -8
- package/dist/snapshot/parse.js.map +1 -1
- package/dist/snapshot/present.js +27 -3
- package/dist/snapshot/present.js.map +1 -1
- package/dist/state/profile.js +36 -9
- package/dist/state/profile.js.map +1 -1
- package/dist/suite/compile.js +7 -2
- package/dist/suite/compile.js.map +1 -1
- package/dist/suite/lint.js +21 -3
- package/dist/suite/lint.js.map +1 -1
- package/dist/suite/pom.js +26 -4
- package/dist/suite/pom.js.map +1 -1
- package/dist/suite/testcase.js +6 -4
- package/dist/suite/testcase.js.map +1 -1
- package/dist/testSuite/exporter.js +6 -2
- package/dist/testSuite/exporter.js.map +1 -1
- package/dist/testSuite/generator.js +31 -6
- package/dist/testSuite/generator.js.map +1 -1
- package/dist/testSuite/issueLinks.js.map +1 -1
- package/dist/testSuite/lint.js +1 -1
- package/dist/testSuite/lint.js.map +1 -1
- package/dist/testSuite/merge.js +8 -2
- package/dist/testSuite/merge.js.map +1 -1
- package/dist/testSuite/schema.js +16 -11
- package/dist/testSuite/schema.js.map +1 -1
- package/dist/testSuite/store.js +9 -1
- package/dist/testSuite/store.js.map +1 -1
- package/dist/tools/act.js +107 -43
- package/dist/tools/act.js.map +1 -1
- package/dist/tools/agent.js +123 -25
- package/dist/tools/agent.js.map +1 -1
- package/dist/tools/appControl.js +16 -3
- package/dist/tools/appControl.js.map +1 -1
- package/dist/tools/appMap.js +331 -63
- package/dist/tools/appMap.js.map +1 -1
- package/dist/tools/assertVisual.js +12 -2
- package/dist/tools/assertVisual.js.map +1 -1
- package/dist/tools/automationGenerate.js +276 -241
- package/dist/tools/automationGenerate.js.map +1 -1
- package/dist/tools/build.js +92 -41
- package/dist/tools/build.js.map +1 -1
- package/dist/tools/bundletool.js +139 -28
- package/dist/tools/bundletool.js.map +1 -1
- package/dist/tools/capabilities.js +45 -71
- package/dist/tools/capabilities.js.map +1 -1
- package/dist/tools/clearOverlay.js +45 -8
- package/dist/tools/clearOverlay.js.map +1 -1
- package/dist/tools/detectContext.js +1 -1
- package/dist/tools/detectContext.js.map +1 -1
- package/dist/tools/device.js +44 -7
- package/dist/tools/device.js.map +1 -1
- package/dist/tools/doctor.js +38 -15
- package/dist/tools/doctor.js.map +1 -1
- package/dist/tools/explore.js +96 -22
- package/dist/tools/explore.js.map +1 -1
- package/dist/tools/featureTesting.js +153 -114
- package/dist/tools/featureTesting.js.map +1 -1
- package/dist/tools/firstRun.js +95 -60
- package/dist/tools/firstRun.js.map +1 -1
- package/dist/tools/flow.js +236 -101
- package/dist/tools/flow.js.map +1 -1
- package/dist/tools/flowGenerate.js +51 -47
- package/dist/tools/flowGenerate.js.map +1 -1
- package/dist/tools/flowRepair.js +24 -4
- package/dist/tools/flowRepair.js.map +1 -1
- package/dist/tools/generate.js +236 -0
- package/dist/tools/generate.js.map +1 -0
- package/dist/tools/getArtifact.js +21 -3
- package/dist/tools/getArtifact.js.map +1 -1
- package/dist/tools/health.js +3 -1
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/history.js +40 -10
- package/dist/tools/history.js.map +1 -1
- package/dist/tools/ios.js +157 -25
- package/dist/tools/ios.js.map +1 -1
- package/dist/tools/issues.js +19 -150
- package/dist/tools/issues.js.map +1 -1
- package/dist/tools/jobs.js +23 -4
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/locator.js +36 -8
- package/dist/tools/locator.js.map +1 -1
- package/dist/tools/metro.js +61 -16
- package/dist/tools/metro.js.map +1 -1
- package/dist/tools/mobileAudit.js +67 -15
- package/dist/tools/mobileAudit.js.map +1 -1
- package/dist/tools/network.js +6 -1
- package/dist/tools/network.js.map +1 -1
- package/dist/tools/note.js +20 -6
- package/dist/tools/note.js.map +1 -1
- package/dist/tools/permissions.js +31 -6
- package/dist/tools/permissions.js.map +1 -1
- package/dist/tools/plan.js +5 -2
- package/dist/tools/plan.js.map +1 -1
- package/dist/tools/prepareIosTarget.js +31 -8
- package/dist/tools/prepareIosTarget.js.map +1 -1
- package/dist/tools/prepareTarget.js +97 -18
- package/dist/tools/prepareTarget.js.map +1 -1
- package/dist/tools/report.js +24 -5
- package/dist/tools/report.js.map +1 -1
- package/dist/tools/resolveArtifact.js +9 -5
- package/dist/tools/resolveArtifact.js.map +1 -1
- package/dist/tools/resolveTarget.js +11 -2
- package/dist/tools/resolveTarget.js.map +1 -1
- package/dist/tools/screenInfo.js +8 -2
- package/dist/tools/screenInfo.js.map +1 -1
- package/dist/tools/screenRecord.js +74 -11
- package/dist/tools/screenRecord.js.map +1 -1
- package/dist/tools/screenshot.js +23 -6
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/seed.js +38 -6
- package/dist/tools/seed.js.map +1 -1
- package/dist/tools/smoke.js +16 -3
- package/dist/tools/smoke.js.map +1 -1
- package/dist/tools/snapshot.js +59 -6
- package/dist/tools/snapshot.js.map +1 -1
- package/dist/tools/startSession.js +54 -9
- package/dist/tools/startSession.js.map +1 -1
- package/dist/tools/state.js +62 -15
- package/dist/tools/state.js.map +1 -1
- package/dist/tools/suite.js +350 -298
- package/dist/tools/suite.js.map +1 -1
- package/dist/tools/testSuite.js +94 -28
- package/dist/tools/testSuite.js.map +1 -1
- package/dist/tools/testThis.js +30 -793
- package/dist/tools/testThis.js.map +1 -1
- package/dist/tools/visual.js +124 -18
- package/dist/tools/visual.js.map +1 -1
- package/dist/tools/visualText.js +51 -6
- package/dist/tools/visualText.js.map +1 -1
- package/dist/tools/wait.js +18 -3
- package/dist/tools/wait.js.map +1 -1
- package/dist/tools/wda.js +157 -29
- package/dist/tools/wda.js.map +1 -1
- package/dist/version.js +17 -49
- package/dist/version.js.map +1 -1
- package/dist/visual/ocr.js +12 -2
- package/dist/visual/ocr.js.map +1 -1
- package/dist/visual/provider.js +7 -3
- package/dist/visual/provider.js.map +1 -1
- package/docs/mcp-server.md +44 -4
- package/docs/tools.md +42 -100
- package/package.json +14 -5
- package/dist/appMap/diff.js +0 -60
- package/dist/appMap/diff.js.map +0 -1
- package/dist/automation/maestroIr.js +0 -282
- package/dist/automation/maestroIr.js.map +0 -1
- package/dist/interop/maestro.js +0 -151
- package/dist/interop/maestro.js.map +0 -1
- package/dist/tools/idling.js +0 -104
- package/dist/tools/idling.js.map +0 -1
- package/dist/tools/inputCapabilities.js +0 -30
- package/dist/tools/inputCapabilities.js.map +0 -1
- package/dist/tools/maestro.js +0 -78
- package/dist/tools/maestro.js.map +0 -1
package/dist/flows/generate.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//
|
|
1
|
+
// qa_generate target:"flow" core (PHASE3-PLAN §4.1 / DESIGN §8). Two pure pieces:
|
|
2
2
|
// - recordableTap: at qa_act time, turn a resolved tap target into a replayable descriptor +
|
|
3
3
|
// exportability tag (translating an @ref into its visible text/label where possible — the
|
|
4
4
|
// key durability insight: a ref is run-time-only, but its label survives).
|
|
@@ -11,7 +11,10 @@ function currentScreenSignature(session) {
|
|
|
11
11
|
const sigs = session.lastSnapshot?.signatures;
|
|
12
12
|
if (!sigs?.size)
|
|
13
13
|
return undefined;
|
|
14
|
-
return createHash('sha1')
|
|
14
|
+
return createHash('sha1')
|
|
15
|
+
.update([...sigs].sort().join('\n'))
|
|
16
|
+
.digest('hex')
|
|
17
|
+
.slice(0, 16);
|
|
15
18
|
}
|
|
16
19
|
function bucketBounds(bounds, point) {
|
|
17
20
|
const b = bounds ?? (point ? [point.x, point.y, point.x, point.y] : undefined);
|
|
@@ -40,14 +43,34 @@ function provenance(session, opts) {
|
|
|
40
43
|
* falls back to coordinates (brittle) when the element exposes no human-readable handle. */
|
|
41
44
|
export function recordableTap(session, target, point) {
|
|
42
45
|
if (target?.x != null)
|
|
43
|
-
return {
|
|
46
|
+
return {
|
|
47
|
+
x: point.x,
|
|
48
|
+
y: point.y,
|
|
49
|
+
selectorKind: 'coords',
|
|
50
|
+
exportability: 'coordinate',
|
|
51
|
+
provenance: provenance(session, { selectorKind: 'coords', point }),
|
|
52
|
+
};
|
|
44
53
|
if (target?.id) {
|
|
45
54
|
const selectorKind = session.driver?.kind === 'wda' ? 'accessibility_id' : 'resource_id';
|
|
46
|
-
return {
|
|
55
|
+
return {
|
|
56
|
+
selector: target.id,
|
|
57
|
+
selectorKind,
|
|
58
|
+
exportability: 'semantic',
|
|
59
|
+
provenance: provenance(session, { selectorKind, selectorValue: target.id, point }),
|
|
60
|
+
};
|
|
47
61
|
}
|
|
48
|
-
const node = point.ref
|
|
62
|
+
const node = point.ref
|
|
63
|
+
? session.lastSnapshot?.fullByRef.get(point.ref)
|
|
64
|
+
: target?.ref
|
|
65
|
+
? session.lastSnapshot?.fullByRef.get(target.ref)
|
|
66
|
+
: undefined;
|
|
49
67
|
if (session.driver?.kind === 'wda' && node?.id)
|
|
50
|
-
return {
|
|
68
|
+
return {
|
|
69
|
+
selector: node.id,
|
|
70
|
+
selectorKind: 'accessibility_id',
|
|
71
|
+
exportability: 'semantic',
|
|
72
|
+
provenance: provenance(session, { selectorKind: 'accessibility_id', selectorValue: node.id, point }),
|
|
73
|
+
};
|
|
51
74
|
let label;
|
|
52
75
|
if (target?.text)
|
|
53
76
|
label = target.text;
|
|
@@ -57,9 +80,21 @@ export function recordableTap(session, target, point) {
|
|
|
57
80
|
const warning = session.driver?.kind === 'wda'
|
|
58
81
|
? `iOS label/name selector "${label}" is usable, but add an accessibilityIdentifier for CI-stable replay`
|
|
59
82
|
: undefined;
|
|
60
|
-
return {
|
|
83
|
+
return {
|
|
84
|
+
selector: label,
|
|
85
|
+
selectorKind: 'text',
|
|
86
|
+
exportability: 'semantic',
|
|
87
|
+
warning,
|
|
88
|
+
provenance: provenance(session, { selectorKind: 'text', selectorValue: label, point }),
|
|
89
|
+
};
|
|
61
90
|
}
|
|
62
|
-
return {
|
|
91
|
+
return {
|
|
92
|
+
x: point.x,
|
|
93
|
+
y: point.y,
|
|
94
|
+
selectorKind: 'coords',
|
|
95
|
+
exportability: 'coordinate',
|
|
96
|
+
provenance: provenance(session, { selectorKind: 'coords', point }),
|
|
97
|
+
};
|
|
63
98
|
}
|
|
64
99
|
export function recordableNativeSelector(session, selectorKind, selectorValue) {
|
|
65
100
|
return { provenance: provenance(session, { selectorKind, selectorValue }) };
|
|
@@ -116,7 +151,10 @@ export function generateFlow(actions, opts) {
|
|
|
116
151
|
addProvenance(provenanceEntries, a, actionIndex, steps.length + 1, 'tapAt');
|
|
117
152
|
steps.push({ tapAt: [a.x ?? 0, a.y ?? 0] });
|
|
118
153
|
coordinate++;
|
|
119
|
-
brittleSteps.push({
|
|
154
|
+
brittleSteps.push({
|
|
155
|
+
index: i,
|
|
156
|
+
reason: `tapped by coordinates (${a.x},${a.y})${a.screen ? ` on ${a.screen}` : ''} — add a testID/accessibilityLabel for a durable selector`,
|
|
157
|
+
});
|
|
120
158
|
}
|
|
121
159
|
}
|
|
122
160
|
break;
|
|
@@ -130,14 +168,17 @@ export function generateFlow(actions, opts) {
|
|
|
130
168
|
addProvenance(provenanceEntries, a, actionIndex, steps.length + 1, 'tapAt');
|
|
131
169
|
steps.push({ tapAt: [a.x ?? 0, a.y ?? 0] }, { inputText: '' });
|
|
132
170
|
coordinate++;
|
|
133
|
-
brittleSteps.push({
|
|
171
|
+
brittleSteps.push({
|
|
172
|
+
index: i,
|
|
173
|
+
reason: `cleared by coordinates (${a.x},${a.y})${a.screen ? ` on ${a.screen}` : ''} — add a testID/accessibilityLabel for a durable selector`,
|
|
174
|
+
});
|
|
134
175
|
}
|
|
135
176
|
break;
|
|
136
177
|
}
|
|
137
178
|
case 'type':
|
|
138
179
|
{
|
|
139
180
|
const selector = actionSelector(a);
|
|
140
|
-
const text = a.secret ? `\${SECRET_${++secretCount}}` : a.text ?? '';
|
|
181
|
+
const text = a.secret ? `\${SECRET_${++secretCount}}` : (a.text ?? '');
|
|
141
182
|
if (a.secret) {
|
|
142
183
|
variables.push(`SECRET_${secretCount}`);
|
|
143
184
|
needsHumanData++;
|
|
@@ -195,7 +236,7 @@ export function generateFlow(actions, opts) {
|
|
|
195
236
|
flowObj.provenance = provenanceEntries;
|
|
196
237
|
flowObj.steps = steps;
|
|
197
238
|
const header = [
|
|
198
|
-
`# Generated by Swipium
|
|
239
|
+
`# Generated by Swipium qa_generate target:"flow" — review before committing.`,
|
|
199
240
|
`# durability: ${grade} (${semanticPct}% semantic; ${coordinate} coordinate, ${needsHumanData} needs-human-data)`,
|
|
200
241
|
...(variables.length ? [`# variables — provide via qa_flow_run { variables }: ${variables.join(', ')}`] : []),
|
|
201
242
|
...brittleSteps.map((b) => `# WARNING step ${b.index}: ${b.reason}`),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/flows/generate.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/flows/generate.ts"],"names":[],"mappings":"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"}
|
package/dist/flows/lint.js
CHANGED
|
@@ -6,8 +6,10 @@ const MUTATING = new Set(['networkOffline', 'networkOnline', 'seed', 'restartApp
|
|
|
6
6
|
const SECRET_LITERAL = /password|passwd|secret|token|otp|api[_-]?key/i;
|
|
7
7
|
function stepText(step) {
|
|
8
8
|
switch (step.kind) {
|
|
9
|
-
case 'tap':
|
|
10
|
-
|
|
9
|
+
case 'tap':
|
|
10
|
+
return step.selector;
|
|
11
|
+
case 'inputText':
|
|
12
|
+
return step.value;
|
|
11
13
|
case 'assertVisible':
|
|
12
14
|
case 'assertNotVisible':
|
|
13
15
|
case 'waitForVisible':
|
|
@@ -37,41 +39,111 @@ export function lintFlowObjectWithOptions(file, flow, opts = {}) {
|
|
|
37
39
|
const all = [...flow.setup, ...flow.steps, ...flow.teardown];
|
|
38
40
|
const setupHasMutation = flow.setup.some((step) => MUTATING.has(step.kind));
|
|
39
41
|
if (setupHasMutation && !flow.teardown.length) {
|
|
40
|
-
findings.push({
|
|
42
|
+
findings.push({
|
|
43
|
+
file,
|
|
44
|
+
flow: flow.name,
|
|
45
|
+
severity: 'warn',
|
|
46
|
+
code: 'MUTATING_SETUP_WITHOUT_TEARDOWN',
|
|
47
|
+
message: 'Setup mutates device/app/test state but the flow has no teardown; add cleanup/restore steps or document why state reuse is safe.',
|
|
48
|
+
});
|
|
41
49
|
}
|
|
42
50
|
for (let i = 0; i < all.length; i++) {
|
|
43
51
|
const step = all[i];
|
|
44
52
|
const stepNo = i + 1;
|
|
45
53
|
const text = stepText(step);
|
|
46
54
|
if (step.kind === 'tapAt') {
|
|
47
|
-
findings.push({
|
|
55
|
+
findings.push({
|
|
56
|
+
file,
|
|
57
|
+
flow: flow.name,
|
|
58
|
+
step: stepNo,
|
|
59
|
+
severity: 'warn',
|
|
60
|
+
code: 'COORDINATE_ONLY',
|
|
61
|
+
message: 'Coordinate-only tap is brittle; prefer an accessibility id or stable text locator.',
|
|
62
|
+
});
|
|
48
63
|
}
|
|
49
64
|
if (/xpath=|^\/\//i.test(text)) {
|
|
50
|
-
findings.push({
|
|
65
|
+
findings.push({
|
|
66
|
+
file,
|
|
67
|
+
flow: flow.name,
|
|
68
|
+
step: stepNo,
|
|
69
|
+
severity: 'warn',
|
|
70
|
+
code: 'XPATH_LOCATOR',
|
|
71
|
+
message: 'XPath locators are brittle and slow; prefer accessibility id/name, predicate/class-chain on iOS, or resource id on Android.',
|
|
72
|
+
});
|
|
51
73
|
}
|
|
52
|
-
if ((opts.platform === 'cross-platform' || (!opts.platform && flow.mode === 'auto')) &&
|
|
53
|
-
|
|
74
|
+
if ((opts.platform === 'cross-platform' || (!opts.platform && flow.mode === 'auto')) &&
|
|
75
|
+
/(resource-id=|uiautomator|android\.|accessibility id=|name=|class chain|predicate string|XCUIElementType)/i.test(text)) {
|
|
76
|
+
findings.push({
|
|
77
|
+
file,
|
|
78
|
+
flow: flow.name,
|
|
79
|
+
step: stepNo,
|
|
80
|
+
severity: 'warn',
|
|
81
|
+
code: 'PLATFORM_SPECIFIC_LOCATOR',
|
|
82
|
+
message: 'Platform-specific locator in an auto/cross-platform flow; prefer shared text/testID/accessibility labels or split into platform-specific flows.',
|
|
83
|
+
});
|
|
54
84
|
}
|
|
55
85
|
if (opts.platform === 'ios' && /resource-id=|uiautomator|android\./i.test(text)) {
|
|
56
|
-
findings.push({
|
|
86
|
+
findings.push({
|
|
87
|
+
file,
|
|
88
|
+
flow: flow.name,
|
|
89
|
+
step: stepNo,
|
|
90
|
+
severity: 'warn',
|
|
91
|
+
code: 'ANDROID_LOCATOR_IN_IOS_FLOW',
|
|
92
|
+
message: 'Android-specific locator in an iOS flow; prefer accessibilityIdentifier/name/label, predicate string, or class chain.',
|
|
93
|
+
});
|
|
57
94
|
}
|
|
58
95
|
if (opts.platform === 'android' && /class chain|predicate string|XCUIElementType|accessibility id=|name=/i.test(text)) {
|
|
59
|
-
findings.push({
|
|
96
|
+
findings.push({
|
|
97
|
+
file,
|
|
98
|
+
flow: flow.name,
|
|
99
|
+
step: stepNo,
|
|
100
|
+
severity: 'warn',
|
|
101
|
+
code: 'IOS_LOCATOR_IN_ANDROID_FLOW',
|
|
102
|
+
message: 'iOS-specific locator in an Android flow; prefer resource-id, content-desc, or stable text.',
|
|
103
|
+
});
|
|
60
104
|
}
|
|
61
105
|
if (step.kind === 'inputText' && !/\$\{[^}]+}/.test(step.value) && (step.secret || SECRET_LITERAL.test(step.value))) {
|
|
62
|
-
findings.push({
|
|
106
|
+
findings.push({
|
|
107
|
+
file,
|
|
108
|
+
flow: flow.name,
|
|
109
|
+
step: stepNo,
|
|
110
|
+
severity: 'error',
|
|
111
|
+
code: 'INLINE_SECRET',
|
|
112
|
+
message: 'Secret-looking input is inline; use ${ENV_VAR} from CI secrets instead.',
|
|
113
|
+
});
|
|
63
114
|
}
|
|
64
115
|
if ((step.kind === 'assertVisible' || step.kind === 'assertNotVisible') && i > 0) {
|
|
65
116
|
const prev = all[i - 1];
|
|
66
117
|
if (!['wait', 'waitForVisible', 'waitForIdle', 'assertVisible', 'assertNotVisible'].includes(prev.kind)) {
|
|
67
|
-
findings.push({
|
|
118
|
+
findings.push({
|
|
119
|
+
file,
|
|
120
|
+
flow: flow.name,
|
|
121
|
+
step: stepNo,
|
|
122
|
+
severity: 'warn',
|
|
123
|
+
code: 'ASSERT_WITHOUT_WAIT',
|
|
124
|
+
message: 'Assertion follows an action without an explicit wait; add waitForVisible/waitForIdle for CI stability.',
|
|
125
|
+
});
|
|
68
126
|
}
|
|
69
127
|
}
|
|
70
128
|
if (MUTATING.has(step.kind)) {
|
|
71
|
-
findings.push({
|
|
129
|
+
findings.push({
|
|
130
|
+
file,
|
|
131
|
+
flow: flow.name,
|
|
132
|
+
step: stepNo,
|
|
133
|
+
severity: 'warn',
|
|
134
|
+
code: 'MUTATING_STEP',
|
|
135
|
+
message: 'Mutating step requires explicit CI policy allowance and should have teardown where applicable.',
|
|
136
|
+
});
|
|
72
137
|
const policyMessage = mutatingPolicyMessage(step, opts.policy);
|
|
73
138
|
if (policyMessage) {
|
|
74
|
-
findings.push({
|
|
139
|
+
findings.push({
|
|
140
|
+
file,
|
|
141
|
+
flow: flow.name,
|
|
142
|
+
step: stepNo,
|
|
143
|
+
severity: 'error',
|
|
144
|
+
code: 'MUTATING_STEP_WITHOUT_POLICY',
|
|
145
|
+
message: policyMessage,
|
|
146
|
+
});
|
|
75
147
|
}
|
|
76
148
|
}
|
|
77
149
|
}
|
|
@@ -82,7 +154,9 @@ export function lintFlowFiles(root, opts = {}) {
|
|
|
82
154
|
if (!existsSync(dir))
|
|
83
155
|
return { files: 0, findings: [{ file: dir, severity: 'error', code: 'NO_FLOWS_DIR', message: 'No .swipium/flows directory found.' }] };
|
|
84
156
|
const policy = loadPolicy(root);
|
|
85
|
-
const files = readdirSync(dir)
|
|
157
|
+
const files = readdirSync(dir)
|
|
158
|
+
.filter((f) => /\.ya?ml$/i.test(f))
|
|
159
|
+
.map((f) => join(dir, f));
|
|
86
160
|
const findings = [];
|
|
87
161
|
for (const file of files) {
|
|
88
162
|
const { flow, errors } = parseFlow(readFileSync(file, 'utf8'));
|
package/dist/flows/lint.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/flows/lint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAA4B,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAe,MAAM,qBAAqB,CAAC;AAwBjF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAmB,CAAC,gBAAgB,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AACtG,MAAM,cAAc,GAAG,+CAA+C,CAAC;AAEvE,SAAS,QAAQ,CAAC,IAAc;IAC9B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/flows/lint.ts"],"names":[],"mappings":"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"}
|
package/dist/flows/pack.js
CHANGED
|
@@ -53,12 +53,28 @@ export async function runPack(sessions, session, driver, root, pack, opts = {})
|
|
|
53
53
|
for (const name of pack.flows) {
|
|
54
54
|
const p = flowPath(root, name);
|
|
55
55
|
if (!p) {
|
|
56
|
-
results.push({
|
|
56
|
+
results.push({
|
|
57
|
+
name,
|
|
58
|
+
passed: false,
|
|
59
|
+
reason: `flow not found: ${name}`,
|
|
60
|
+
failureCode: 'NO_ARTIFACT',
|
|
61
|
+
steps: [],
|
|
62
|
+
durationMs: 0,
|
|
63
|
+
counters: session.counters,
|
|
64
|
+
});
|
|
57
65
|
continue;
|
|
58
66
|
}
|
|
59
67
|
const { flow, errors } = parseFlow(readFileSync(p, 'utf8'));
|
|
60
68
|
if (errors.length || !flow) {
|
|
61
|
-
results.push({
|
|
69
|
+
results.push({
|
|
70
|
+
name,
|
|
71
|
+
passed: false,
|
|
72
|
+
reason: `invalid flow: ${errors[0] ?? 'parse error'}`,
|
|
73
|
+
failureCode: 'UNKNOWN',
|
|
74
|
+
steps: [],
|
|
75
|
+
durationMs: 0,
|
|
76
|
+
counters: session.counters,
|
|
77
|
+
});
|
|
62
78
|
continue;
|
|
63
79
|
}
|
|
64
80
|
results.push(await runFlow(sessions, session, driver, flow, opts));
|
package/dist/flows/pack.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../../src/flows/pack.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,0FAA0F;AAC1F,kGAAkG;AAElG,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAsB,MAAM,UAAU,CAAC;AAevD,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,MAAM,EAAE,CAAC,qBAAqB,MAAM,CAAE,CAAW,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAChF,CAAC;IACD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC,4CAA4C,CAAC,EAAE,CAAC;IACvG,MAAM,CAAC,GAAG,GAA8B,CAAC;IACzC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAChG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../../src/flows/pack.ts"],"names":[],"mappings":"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"}
|
package/dist/flows/repair.js
CHANGED
|
@@ -12,7 +12,12 @@ export function resolveFlowSource(root, flow, flowYaml) {
|
|
|
12
12
|
return { error: 'Provide flow or flowYaml.' };
|
|
13
13
|
const candidates = isAbsolute(flow)
|
|
14
14
|
? [flow]
|
|
15
|
-
: [
|
|
15
|
+
: [
|
|
16
|
+
join(root, flow),
|
|
17
|
+
join(root, '.swipium', 'flows', `${flow}.yaml`),
|
|
18
|
+
join(root, '.swipium', 'flows', `${flow}.yml`),
|
|
19
|
+
join(root, '.swipium', 'flows', flow),
|
|
20
|
+
];
|
|
16
21
|
const path = candidates.find((p) => existsSync(p));
|
|
17
22
|
return path ? { source: path, yaml: readFileSync(path, 'utf8'), writable: true } : { error: `Flow not found: ${flow}` };
|
|
18
23
|
}
|
|
@@ -28,8 +33,10 @@ function stepAt(flow, failedStep) {
|
|
|
28
33
|
}
|
|
29
34
|
function selectorOf(step) {
|
|
30
35
|
switch (step.kind) {
|
|
31
|
-
case 'tap':
|
|
32
|
-
|
|
36
|
+
case 'tap':
|
|
37
|
+
return step.selector;
|
|
38
|
+
case 'inputText':
|
|
39
|
+
return step.into;
|
|
33
40
|
case 'assertVisible':
|
|
34
41
|
case 'assertNotVisible':
|
|
35
42
|
case 'waitForVisible':
|
|
@@ -100,10 +107,14 @@ function provenanceEntries(yamlText) {
|
|
|
100
107
|
function provenanceForStep(yamlText, failedStep, originalSelector) {
|
|
101
108
|
const oneBased = failedStep + 1;
|
|
102
109
|
const entries = provenanceEntries(yamlText);
|
|
103
|
-
return entries.find((e) => e.generatedStepIndex === oneBased)
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
110
|
+
return (entries.find((e) => e.generatedStepIndex === oneBased) ??
|
|
111
|
+
entries.find((e) => e.stepIndex === oneBased) ??
|
|
112
|
+
(originalSelector
|
|
113
|
+
? entries.find((e) => [e.selector, e.selectorValue, e.resourceId, e.text, e.accessibilityLabel].some((v) => v && norm(v) === norm(originalSelector)))
|
|
114
|
+
: undefined) ??
|
|
115
|
+
(originalSelector
|
|
116
|
+
? entries.find((e) => [e.selector, e.selectorValue, e.resourceId, e.text, e.accessibilityLabel].some((v) => v && (norm(v).includes(norm(originalSelector)) || norm(originalSelector).includes(norm(v)))))
|
|
117
|
+
: undefined));
|
|
107
118
|
}
|
|
108
119
|
function byNorm(values, target) {
|
|
109
120
|
return !!target && values.some((v) => !!v && norm(v) === norm(target));
|
|
@@ -117,27 +128,47 @@ function driftFindings(provenance, elements, picked) {
|
|
|
117
128
|
const findings = [];
|
|
118
129
|
const currentSig = currentScreenSignature(elements);
|
|
119
130
|
if (provenance.originalScreenSignature && currentSig && provenance.originalScreenSignature !== currentSig) {
|
|
120
|
-
findings.push({
|
|
131
|
+
findings.push({
|
|
132
|
+
code: 'screen_mismatch',
|
|
133
|
+
message: `Recorded screen signature ${provenance.originalScreenSignature} differs from current screen ${currentSig}. Navigation may have failed before this step.`,
|
|
134
|
+
});
|
|
121
135
|
}
|
|
122
136
|
if (provenance.resourceId) {
|
|
123
137
|
const idMatches = elements.filter((e) => byNorm([e.id], provenance.resourceId));
|
|
124
138
|
if (idMatches.length === 0) {
|
|
125
|
-
findings.push({
|
|
139
|
+
findings.push({
|
|
140
|
+
code: 'resource_id_missing',
|
|
141
|
+
message: `Recorded resource id "${provenance.resourceId}" is not present on the current screen.`,
|
|
142
|
+
});
|
|
126
143
|
}
|
|
127
144
|
else if (idMatches.length > 1) {
|
|
128
|
-
findings.push({
|
|
145
|
+
findings.push({
|
|
146
|
+
code: 'duplicate_candidate',
|
|
147
|
+
message: `Recorded resource id "${provenance.resourceId}" now matches ${idMatches.length} elements; add a more specific testID/accessibilityIdentifier.`,
|
|
148
|
+
});
|
|
129
149
|
}
|
|
130
150
|
}
|
|
131
151
|
const oldLabel = provenance.accessibilityLabel ?? provenance.text;
|
|
132
|
-
if (oldLabel &&
|
|
133
|
-
|
|
152
|
+
if (oldLabel &&
|
|
153
|
+
!elements.some((e) => byNorm([e.label, e.text], oldLabel)) &&
|
|
154
|
+
elements.some((e) => containsNorm([e.label, e.text], oldLabel))) {
|
|
155
|
+
findings.push({
|
|
156
|
+
code: 'text_or_label_drift',
|
|
157
|
+
message: `Recorded text/label "${oldLabel}" changed but a similar current label exists.`,
|
|
158
|
+
});
|
|
134
159
|
}
|
|
135
160
|
else if (oldLabel && picked.element && !byNorm([picked.element.label, picked.element.text], oldLabel)) {
|
|
136
|
-
findings.push({
|
|
161
|
+
findings.push({
|
|
162
|
+
code: 'text_or_label_drift',
|
|
163
|
+
message: `Recorded text/label "${oldLabel}" no longer identifies the proposed replacement.`,
|
|
164
|
+
});
|
|
137
165
|
}
|
|
138
166
|
const oldRole = provenance.elementRole ?? provenance.className?.split('.').pop();
|
|
139
167
|
if (oldRole && picked.element && norm(picked.element.role) !== norm(oldRole) && !norm(picked.element.role).endsWith(norm(oldRole))) {
|
|
140
|
-
findings.push({
|
|
168
|
+
findings.push({
|
|
169
|
+
code: 'role_changed',
|
|
170
|
+
message: `Recorded element role "${oldRole}" differs from current candidate role "${picked.element.role}".`,
|
|
171
|
+
});
|
|
141
172
|
}
|
|
142
173
|
return findings;
|
|
143
174
|
}
|
|
@@ -147,7 +178,11 @@ function driftRationale(findings) {
|
|
|
147
178
|
return ` Drift analysis: ${findings.map((f) => `${f.code}: ${f.message}`).join(' ')}`;
|
|
148
179
|
}
|
|
149
180
|
function desiredId(label, role) {
|
|
150
|
-
const base = label
|
|
181
|
+
const base = label
|
|
182
|
+
.toLowerCase()
|
|
183
|
+
.replace(/[^a-z0-9]+/g, '_')
|
|
184
|
+
.replace(/^_+|_+$/g, '')
|
|
185
|
+
.slice(0, 40) || 'target';
|
|
151
186
|
const suffix = /field|text/i.test(role) ? 'field' : /button|cell|link/i.test(role) ? 'button' : 'control';
|
|
152
187
|
return `${base}_${suffix}`;
|
|
153
188
|
}
|
|
@@ -191,7 +226,11 @@ function applyReplacement(yamlText, phase, phaseIndex, step, replacement) {
|
|
|
191
226
|
break;
|
|
192
227
|
case 'inputText': {
|
|
193
228
|
const v = raw.inputText;
|
|
194
|
-
list[phaseIndex] = {
|
|
229
|
+
list[phaseIndex] = {
|
|
230
|
+
inputText: typeof v === 'object' && v
|
|
231
|
+
? { ...v, into: replacement }
|
|
232
|
+
: { into: replacement, text: step.value, secret: step.secret },
|
|
233
|
+
};
|
|
195
234
|
break;
|
|
196
235
|
}
|
|
197
236
|
case 'assertVisible':
|
|
@@ -270,7 +309,8 @@ export function repairFlow(opts) {
|
|
|
270
309
|
if (isVisualStep(at.step)) {
|
|
271
310
|
const fallback = chooseReplacement(undefined, opts.elements, platform);
|
|
272
311
|
const replacementSelector = selectorForSuggestion(fallback.suggestion, fallback.element, platform);
|
|
273
|
-
const suggestions = [
|
|
312
|
+
const suggestions = [
|
|
313
|
+
{
|
|
274
314
|
failedStep: opts.failedStep,
|
|
275
315
|
phase: at.phase,
|
|
276
316
|
phaseIndex: at.phaseIndex,
|
|
@@ -281,12 +321,23 @@ export function repairFlow(opts) {
|
|
|
281
321
|
rationale: replacementSelector
|
|
282
322
|
? 'Visual/OCR locator drift suspected. Refresh the visual evidence and consider this structured fallback locator.'
|
|
283
323
|
: 'Visual/OCR locator drift suspected. Refresh the screenshot crop/OCR text, confidence threshold, locale/theme/density/orientation metadata, and rerun.',
|
|
284
|
-
appCodeSuggestion: replacementSelector
|
|
324
|
+
appCodeSuggestion: replacementSelector
|
|
325
|
+
? undefined
|
|
326
|
+
: 'Expose a stable accessibilityIdentifier/testID near this visual target so replay can fall back to structure.',
|
|
285
327
|
platform,
|
|
286
328
|
failureCode: 'VISUAL_LOCATOR_DRIFT',
|
|
287
|
-
visualProvenanceRequired: [
|
|
329
|
+
visualProvenanceRequired: [
|
|
330
|
+
'screenshot crop',
|
|
331
|
+
'OCR text/confidence',
|
|
332
|
+
'locale',
|
|
333
|
+
'theme',
|
|
334
|
+
'density',
|
|
335
|
+
'orientation',
|
|
336
|
+
'fallback structured locator',
|
|
337
|
+
],
|
|
288
338
|
provenance: { found: false, currentScreenSignature: currentSig },
|
|
289
|
-
}
|
|
339
|
+
},
|
|
340
|
+
];
|
|
290
341
|
return {
|
|
291
342
|
source: src.source,
|
|
292
343
|
flow: parsed.flow.name,
|