swipium 1.5.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +183 -0
- package/README.md +173 -280
- package/THREAT_MODEL.md +223 -47
- package/dist/appMap/automationLink.js +30 -27
- package/dist/appMap/automationLink.js.map +1 -1
- package/dist/appMap/build.js +47 -21
- package/dist/appMap/build.js.map +1 -1
- package/dist/appMap/codeIndex.js +2 -2
- package/dist/appMap/codeIndex.js.map +1 -1
- package/dist/appMap/featureIndex.js +3 -3
- package/dist/appMap/featureIndex.js.map +1 -1
- package/dist/appMap/featureModel.js +2 -2
- package/dist/appMap/featureModel.js.map +1 -1
- package/dist/appMap/firstRunApply.js +2 -2
- package/dist/appMap/firstRunApply.js.map +1 -1
- package/dist/appMap/issues.js +10 -10
- package/dist/appMap/issues.js.map +1 -1
- package/dist/appMap/migrations.js +5 -5
- package/dist/appMap/migrations.js.map +1 -1
- package/dist/appMap/prelaunch.js +2 -2
- package/dist/appMap/prelaunch.js.map +1 -1
- package/dist/appMap/projectRegistry.js +77 -11
- package/dist/appMap/projectRegistry.js.map +1 -1
- package/dist/appMap/provenance.js +2 -2
- package/dist/appMap/provenance.js.map +1 -1
- package/dist/appMap/query.js +2 -2
- package/dist/appMap/query.js.map +1 -1
- package/dist/appMap/runtimeMerge.js +3 -3
- package/dist/appMap/runtimeMerge.js.map +1 -1
- package/dist/appMap/schema.js +1 -1
- package/dist/appMap/schema.js.map +1 -1
- package/dist/appMap/screenMatch.js +1 -1
- package/dist/appMap/screenMatch.js.map +1 -1
- package/dist/appMap/staticScan.js +17 -17
- package/dist/appMap/staticScan.js.map +1 -1
- package/dist/appMap/store.js +55 -7
- package/dist/appMap/store.js.map +1 -1
- package/dist/appMap/tsAstScan.js +3 -3
- package/dist/appMap/tsAstScan.js.map +1 -1
- package/dist/artifacts/bundletool.js +5 -5
- package/dist/artifacts/bundletool.js.map +1 -1
- package/dist/artifacts/resolve.js +10 -10
- package/dist/artifacts/resolve.js.map +1 -1
- package/dist/automation/capabilities.js +3 -3
- package/dist/automation/capabilities.js.map +1 -1
- package/dist/automation/gestures.js +1 -1
- package/dist/automation/gestures.js.map +1 -1
- package/dist/automation/plan.js +7 -7
- package/dist/automation/plan.js.map +1 -1
- package/dist/automation/report.js +3 -3
- package/dist/automation/report.js.map +1 -1
- package/dist/automation/selectors.js +14 -25
- package/dist/automation/selectors.js.map +1 -1
- package/dist/automation/types.js +1 -1
- package/dist/automation/types.js.map +1 -1
- package/dist/automation/waits.js +5 -5
- package/dist/automation/waits.js.map +1 -1
- package/dist/automation/webview.js +2 -2
- package/dist/automation/webview.js.map +1 -1
- package/dist/automationGen/appiumModel.js +13 -7
- package/dist/automationGen/appiumModel.js.map +1 -1
- package/dist/automationGen/ciEmitter.js +5 -5
- package/dist/automationGen/ciEmitter.js.map +1 -1
- package/dist/automationGen/identifiers.js +224 -0
- package/dist/automationGen/identifiers.js.map +1 -0
- package/dist/automationGen/jsEmitter.js +265 -106
- package/dist/automationGen/jsEmitter.js.map +1 -1
- package/dist/automationGen/packagePatch.js +2 -2
- package/dist/automationGen/packagePatch.js.map +1 -1
- package/dist/automationGen/platformResolve.js +36 -0
- package/dist/automationGen/platformResolve.js.map +1 -0
- package/dist/automationGen/projectProfile.js +71 -26
- package/dist/automationGen/projectProfile.js.map +1 -1
- package/dist/automationGen/pythonEmitter.js +276 -105
- package/dist/automationGen/pythonEmitter.js.map +1 -1
- package/dist/automationGen/readmeEmitter.js +7 -6
- package/dist/automationGen/readmeEmitter.js.map +1 -1
- package/dist/{tools/automationGenerate.js → automationGen/run.js} +72 -113
- package/dist/automationGen/run.js.map +1 -0
- package/dist/automationGen/suitePlan.js +6 -4
- package/dist/automationGen/suitePlan.js.map +1 -1
- package/dist/automationGen/validation.js +20 -8
- package/dist/automationGen/validation.js.map +1 -1
- package/dist/build/parseBuildLog.js +2 -2
- package/dist/build/parseBuildLog.js.map +1 -1
- package/dist/build/plan.js +7 -7
- package/dist/build/plan.js.map +1 -1
- package/dist/ci/preflight.js +13 -4
- package/dist/ci/preflight.js.map +1 -1
- package/dist/cli/gc.js +74 -0
- package/dist/cli/gc.js.map +1 -0
- package/dist/cli/init.js +217 -26
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/main.js +50 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/report.js +218 -0
- package/dist/cli/report.js.map +1 -0
- package/dist/cli/scan.js +35 -14
- package/dist/cli/scan.js.map +1 -1
- package/dist/cli/suite.js +6 -6
- package/dist/cli/suite.js.map +1 -1
- package/dist/cli/verify.js +7 -7
- package/dist/cli/verify.js.map +1 -1
- package/dist/consent/consent.js +162 -5
- package/dist/consent/consent.js.map +1 -1
- package/dist/context/detect.js +45 -14
- package/dist/context/detect.js.map +1 -1
- package/dist/context/findApps.js +6 -6
- package/dist/context/findApps.js.map +1 -1
- package/dist/context/projectRoot.js +174 -19
- package/dist/context/projectRoot.js.map +1 -1
- package/dist/context/scan.js +1 -1
- package/dist/context/scan.js.map +1 -1
- package/dist/core/capabilityGroups.js +90 -0
- package/dist/core/capabilityGroups.js.map +1 -0
- package/dist/core/target.js +3 -3
- package/dist/core/target.js.map +1 -1
- package/dist/core/targetPlan.js +65 -62
- package/dist/core/targetPlan.js.map +1 -1
- package/dist/drivers/DirectDriver.js +300 -36
- package/dist/drivers/DirectDriver.js.map +1 -1
- package/dist/drivers/SimctlDriver.js +120 -7
- package/dist/drivers/SimctlDriver.js.map +1 -1
- package/dist/drivers/WdaDriver.js +350 -50
- package/dist/drivers/WdaDriver.js.map +1 -1
- package/dist/explore/candidates.js +2 -2
- package/dist/explore/candidates.js.map +1 -1
- package/dist/explore/graph.js +5 -5
- package/dist/explore/graph.js.map +1 -1
- package/dist/explore/policy.js +5 -5
- package/dist/explore/policy.js.map +1 -1
- package/dist/explore/runner.js +301 -284
- package/dist/explore/runner.js.map +1 -1
- package/dist/explore/signatures.js +1 -1
- package/dist/featureTesting/executionBootstrap.js +29 -30
- package/dist/featureTesting/executionBootstrap.js.map +1 -1
- package/dist/featureTesting/featureMap.js +2 -2
- package/dist/featureTesting/featureMap.js.map +1 -1
- package/dist/featureTesting/featureScope.js +12 -12
- package/dist/featureTesting/featureScope.js.map +1 -1
- package/dist/featureTesting/mapFeatureScope.js +7 -7
- package/dist/featureTesting/mapFeatureScope.js.map +1 -1
- package/dist/featureTesting/objectiveModel.js +10 -10
- package/dist/featureTesting/objectiveModel.js.map +1 -1
- package/dist/featureTesting/resultMerge.js +6 -6
- package/dist/featureTesting/resultMerge.js.map +1 -1
- package/dist/featureTesting/sources.js +4 -4
- package/dist/featureTesting/sources.js.map +1 -1
- package/dist/featureTesting/suiteBridge.js +1 -1
- package/dist/featureTesting/suiteBridge.js.map +1 -1
- package/dist/featureTesting/synonyms.js +1 -1
- package/dist/featureTesting/synonyms.js.map +1 -1
- package/dist/featureTesting/testCaseFactory.js +11 -11
- package/dist/featureTesting/testCaseFactory.js.map +1 -1
- package/dist/featureTesting/testPlan.js +3 -3
- package/dist/featureTesting/testPlan.js.map +1 -1
- package/dist/firstRun/authStateMachine.js +1 -1
- package/dist/firstRun/authStateMachine.js.map +1 -1
- package/dist/firstRun/classifyScreen.js +5 -5
- package/dist/firstRun/classifyScreen.js.map +1 -1
- package/dist/firstRun/firstRunPlanner.js +11 -11
- package/dist/firstRun/firstRunPlanner.js.map +1 -1
- package/dist/firstRun/firstRunRunner.js +8 -8
- package/dist/firstRun/firstRunRunner.js.map +1 -1
- package/dist/firstRun/generatedDataPolicy.js +9 -9
- package/dist/firstRun/generatedDataPolicy.js.map +1 -1
- package/dist/firstRun/inputPlanner.js +5 -5
- package/dist/firstRun/inputPlanner.js.map +1 -1
- package/dist/firstRun/onboardingStateMachine.js +1 -1
- package/dist/firstRun/onboardingStateMachine.js.map +1 -1
- package/dist/firstRun/paywallPolicy.js +3 -3
- package/dist/firstRun/paywallPolicy.js.map +1 -1
- package/dist/firstRun/types.js +1 -1
- package/dist/firstRun/types.js.map +1 -1
- package/dist/fixtures/catalog.js +33 -3
- package/dist/fixtures/catalog.js.map +1 -1
- package/dist/fixtures/load.js +50 -0
- package/dist/fixtures/load.js.map +1 -0
- package/dist/flows/discover.js +2 -2
- package/dist/flows/discover.js.map +1 -1
- package/dist/flows/generate.js +20 -10
- package/dist/flows/generate.js.map +1 -1
- package/dist/flows/pack.js +3 -3
- package/dist/flows/pack.js.map +1 -1
- package/dist/flows/paths.js +57 -0
- package/dist/flows/paths.js.map +1 -0
- package/dist/flows/repair.js +111 -23
- package/dist/flows/repair.js.map +1 -1
- package/dist/flows/run.js +153 -57
- package/dist/flows/run.js.map +1 -1
- package/dist/flows/schema.js +50 -5
- package/dist/flows/schema.js.map +1 -1
- package/dist/flows/seedExec.js +4 -4
- package/dist/flows/seedExec.js.map +1 -1
- package/dist/flows/templates.js +5 -5
- package/dist/index.js +50 -8
- package/dist/index.js.map +1 -1
- package/dist/issues/classify.js +16 -16
- package/dist/issues/classify.js.map +1 -1
- package/dist/issues/fingerprint.js +24 -4
- package/dist/issues/fingerprint.js.map +1 -1
- package/dist/issues/index.js +94 -31
- package/dist/issues/index.js.map +1 -1
- package/dist/issues/metrics.js +4 -4
- package/dist/issues/metrics.js.map +1 -1
- package/dist/issues/recurrence.js +35 -8
- package/dist/issues/recurrence.js.map +1 -1
- package/dist/issues/report.js +4 -4
- package/dist/issues/report.js.map +1 -1
- package/dist/issues/reportBridge.js +4 -4
- package/dist/issues/reportBridge.js.map +1 -1
- package/dist/issues/schema.js +2 -2
- package/dist/issues/schema.js.map +1 -1
- package/dist/issues/sourceRevision.js +2 -2
- package/dist/issues/sourceRevision.js.map +1 -1
- package/dist/issues/store.js +110 -32
- package/dist/issues/store.js.map +1 -1
- package/dist/lib/abortScope.js +48 -0
- package/dist/lib/abortScope.js.map +1 -0
- package/dist/lib/android.js +75 -7
- package/dist/lib/android.js.map +1 -1
- package/dist/lib/coordSpace.js +1 -1
- package/dist/lib/coordSpace.js.map +1 -1
- package/dist/lib/device.js +32 -7
- package/dist/lib/device.js.map +1 -1
- package/dist/lib/gestures.js +141 -0
- package/dist/lib/gestures.js.map +1 -0
- package/dist/lib/gitignore.js +4 -3
- package/dist/lib/gitignore.js.map +1 -1
- package/dist/lib/image.js +1 -1
- package/dist/lib/image.js.map +1 -1
- package/dist/lib/lockfile.js +370 -31
- package/dist/lib/lockfile.js.map +1 -1
- package/dist/lib/needsInput.js +3 -3
- package/dist/lib/needsInput.js.map +1 -1
- package/dist/lib/png.js +2 -2
- package/dist/lib/png.js.map +1 -1
- package/dist/lib/redact.js +170 -9
- package/dist/lib/redact.js.map +1 -1
- package/dist/lib/result.js +79 -10
- package/dist/lib/result.js.map +1 -1
- package/dist/lib/schemaHash.js +3 -3
- package/dist/lib/schemaHash.js.map +1 -1
- package/dist/lib/sensitive.js +3 -2
- package/dist/lib/sensitive.js.map +1 -1
- package/dist/lib/simctl.js +3 -3
- package/dist/lib/simctl.js.map +1 -1
- package/dist/lib/spawn.js +52 -10
- package/dist/lib/spawn.js.map +1 -1
- package/dist/lib/toolAnnotations.js +114 -0
- package/dist/lib/toolAnnotations.js.map +1 -0
- package/dist/lib/wda.js +294 -15
- package/dist/lib/wda.js.map +1 -1
- package/dist/mobileAudit/checks.js +12 -12
- package/dist/mobileAudit/checks.js.map +1 -1
- package/dist/mobileAudit/evidence.js +4 -4
- package/dist/mobileAudit/evidence.js.map +1 -1
- package/dist/mobileAudit/profiles.js +1 -1
- package/dist/mobileAudit/profiles.js.map +1 -1
- package/dist/mobileAudit/results.js +3 -3
- package/dist/mobileAudit/results.js.map +1 -1
- package/dist/mobileAudit/runner.js +72 -18
- package/dist/mobileAudit/runner.js.map +1 -1
- package/dist/oracle/auth.js +1 -1
- package/dist/oracle/auth.js.map +1 -1
- package/dist/oracle/failures.js +219 -36
- package/dist/oracle/failures.js.map +1 -1
- package/dist/oracle/health.js +63 -17
- package/dist/oracle/health.js.map +1 -1
- package/dist/oracle/locator.js +13 -13
- package/dist/oracle/locator.js.map +1 -1
- package/dist/oracle/record.js +3 -3
- package/dist/oracle/record.js.map +1 -1
- package/dist/orchestration/envelope.js +2 -2
- package/dist/orchestration/envelope.js.map +1 -1
- package/dist/orchestration/goal.js +4 -4
- package/dist/orchestration/goal.js.map +1 -1
- package/dist/orchestration/testThis/execute.js +62 -21
- package/dist/orchestration/testThis/execute.js.map +1 -1
- package/dist/orchestration/testThis/pipeline.js +119 -30
- package/dist/orchestration/testThis/pipeline.js.map +1 -1
- package/dist/orchestration/testThis/plan.js +162 -73
- package/dist/orchestration/testThis/plan.js.map +1 -1
- package/dist/orchestration/testThis/sessionIntent.js +72 -0
- package/dist/orchestration/testThis/sessionIntent.js.map +1 -0
- package/dist/orchestration/testThis/terminal.js +34 -16
- package/dist/orchestration/testThis/terminal.js.map +1 -1
- package/dist/orchestration/testThis/types.js +1 -1
- package/dist/orchestration/testThis/types.js.map +1 -1
- package/dist/plan/plan.js +9 -9
- package/dist/plan/plan.js.map +1 -1
- package/dist/prompts/index.js +22 -22
- package/dist/prompts/index.js.map +1 -1
- package/dist/report/export.js +392 -37
- package/dist/report/export.js.map +1 -1
- package/dist/report/findingsDedupe.js +41 -0
- package/dist/report/findingsDedupe.js.map +1 -0
- package/dist/report/policy.js +7 -4
- package/dist/report/policy.js.map +1 -1
- package/dist/report/qaLevel.js +8 -8
- package/dist/report/qaLevel.js.map +1 -1
- package/dist/report/sarifSources.js +160 -0
- package/dist/report/sarifSources.js.map +1 -0
- package/dist/report/summary.js +2 -2
- package/dist/report/summary.js.map +1 -1
- package/dist/report/testCatalog.js +4 -4
- package/dist/report/testCatalog.js.map +1 -1
- package/dist/report/toolHealth.js +124 -0
- package/dist/report/toolHealth.js.map +1 -0
- package/dist/server.js +472 -45
- package/dist/server.js.map +1 -1
- package/dist/services/automationGenerate.js +8 -2
- package/dist/services/automationGenerate.js.map +1 -1
- package/dist/services/build.js +2 -2
- package/dist/services/build.js.map +1 -1
- package/dist/{tools → services}/flowGenerate.js +29 -13
- package/dist/services/flowGenerate.js.map +1 -0
- package/dist/services/preflight.js +4 -4
- package/dist/services/preflight.js.map +1 -1
- package/dist/services/prepareAndroid.js +46 -8
- package/dist/services/prepareAndroid.js.map +1 -1
- package/dist/services/prepareIos.js +24 -9
- package/dist/services/prepareIos.js.map +1 -1
- package/dist/services/report.js +100 -45
- package/dist/services/report.js.map +1 -1
- package/dist/services/smoke.js +32 -16
- package/dist/services/smoke.js.map +1 -1
- package/dist/services/suiteGenerate.js +28 -3
- package/dist/services/suiteGenerate.js.map +1 -1
- package/dist/services/testSuiteKnowledge.js +40 -27
- package/dist/services/testSuiteKnowledge.js.map +1 -1
- package/dist/session/attach.js +270 -6
- package/dist/session/attach.js.map +1 -1
- package/dist/session/processRegistry.js +317 -48
- package/dist/session/processRegistry.js.map +1 -1
- package/dist/session/progress.js +1 -1
- package/dist/session/retention.js +201 -0
- package/dist/session/retention.js.map +1 -0
- package/dist/session/store.js +275 -48
- package/dist/session/store.js.map +1 -1
- package/dist/snapshot/overlays.js +53 -8
- package/dist/snapshot/overlays.js.map +1 -1
- package/dist/snapshot/parse.js +28 -4
- package/dist/snapshot/parse.js.map +1 -1
- package/dist/snapshot/present.js +11 -5
- package/dist/snapshot/present.js.map +1 -1
- package/dist/snapshot/settle.js +39 -9
- package/dist/snapshot/settle.js.map +1 -1
- package/dist/state/consent.js +99 -0
- package/dist/state/consent.js.map +1 -0
- package/dist/state/profile.js +46 -2
- package/dist/state/profile.js.map +1 -1
- package/dist/suite/compile.js +9 -5
- package/dist/suite/compile.js.map +1 -1
- package/dist/suite/lint.js +4 -4
- package/dist/suite/lint.js.map +1 -1
- package/dist/suite/pom.js +50 -41
- package/dist/suite/pom.js.map +1 -1
- package/dist/suite/secretGuard.js +266 -0
- package/dist/suite/secretGuard.js.map +1 -0
- package/dist/suite/testcase.js +9 -7
- package/dist/suite/testcase.js.map +1 -1
- package/dist/testSuite/exporter.js +4 -4
- package/dist/testSuite/exporter.js.map +1 -1
- package/dist/testSuite/generator.js +13 -9
- package/dist/testSuite/generator.js.map +1 -1
- package/dist/testSuite/history.js +1 -1
- package/dist/testSuite/history.js.map +1 -1
- package/dist/testSuite/issueLinks.js +3 -3
- package/dist/testSuite/issueLinks.js.map +1 -1
- package/dist/testSuite/lint.js +4 -4
- package/dist/testSuite/lint.js.map +1 -1
- package/dist/testSuite/merge.js +5 -5
- package/dist/testSuite/merge.js.map +1 -1
- package/dist/testSuite/schema.js +5 -5
- package/dist/testSuite/schema.js.map +1 -1
- package/dist/testSuite/store.js +3 -3
- package/dist/testSuite/store.js.map +1 -1
- package/dist/testSuite/traceability.js +2 -2
- package/dist/testSuite/traceability.js.map +1 -1
- package/dist/tools/act.js +794 -164
- package/dist/tools/act.js.map +1 -1
- package/dist/tools/agent.js +451 -128
- package/dist/tools/agent.js.map +1 -1
- package/dist/tools/appControl.js +69 -19
- package/dist/tools/appControl.js.map +1 -1
- package/dist/tools/appMap.js +188 -130
- package/dist/tools/appMap.js.map +1 -1
- package/dist/tools/build.js +32 -42
- package/dist/tools/build.js.map +1 -1
- package/dist/tools/bundletool.js +21 -31
- package/dist/tools/bundletool.js.map +1 -1
- package/dist/tools/clearOverlay.js +55 -12
- package/dist/tools/clearOverlay.js.map +1 -1
- package/dist/tools/device.js +76 -24
- package/dist/tools/device.js.map +1 -1
- package/dist/tools/doctor.js +68 -28
- package/dist/tools/doctor.js.map +1 -1
- package/dist/tools/explore.js +41 -47
- package/dist/tools/explore.js.map +1 -1
- package/dist/tools/featureTesting.js +31 -48
- package/dist/tools/featureTesting.js.map +1 -1
- package/dist/tools/firstRun.js +34 -41
- package/dist/tools/firstRun.js.map +1 -1
- package/dist/tools/flow.js +183 -103
- package/dist/tools/flow.js.map +1 -1
- package/dist/tools/flowRepair.js +25 -13
- package/dist/tools/flowRepair.js.map +1 -1
- package/dist/tools/generate.js +52 -89
- package/dist/tools/generate.js.map +1 -1
- package/dist/tools/getArtifact.js +16 -5
- package/dist/tools/getArtifact.js.map +1 -1
- package/dist/tools/health.js +15 -12
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/ios.js +45 -223
- package/dist/tools/ios.js.map +1 -1
- package/dist/tools/issues.js +251 -35
- package/dist/tools/issues.js.map +1 -1
- package/dist/tools/jobs.js +41 -16
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/metro.js +36 -35
- package/dist/tools/metro.js.map +1 -1
- package/dist/tools/mobileAudit.js +50 -45
- package/dist/tools/mobileAudit.js.map +1 -1
- package/dist/tools/network.js +31 -14
- package/dist/tools/network.js.map +1 -1
- package/dist/tools/note.js +26 -26
- package/dist/tools/note.js.map +1 -1
- package/dist/tools/prepareIosTarget.js +10 -16
- package/dist/tools/prepareIosTarget.js.map +1 -1
- package/dist/tools/prepareTarget.js +117 -50
- package/dist/tools/prepareTarget.js.map +1 -1
- package/dist/tools/report.js +11 -22
- package/dist/tools/report.js.map +1 -1
- package/dist/tools/resolveArtifact.js +11 -15
- package/dist/tools/resolveArtifact.js.map +1 -1
- package/dist/tools/resolveTarget.js +78 -24
- package/dist/tools/resolveTarget.js.map +1 -1
- package/dist/tools/screenRecord.js +23 -21
- package/dist/tools/screenRecord.js.map +1 -1
- package/dist/tools/screenshot.js +23 -16
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/smoke.js +20 -16
- package/dist/tools/smoke.js.map +1 -1
- package/dist/tools/snapshot.js +155 -118
- package/dist/tools/snapshot.js.map +1 -1
- package/dist/tools/startSession.js +104 -116
- package/dist/tools/startSession.js.map +1 -1
- package/dist/tools/suite.js +72 -43
- package/dist/tools/suite.js.map +1 -1
- package/dist/tools/testSuite.js +30 -20
- package/dist/tools/testSuite.js.map +1 -1
- package/dist/tools/testThis.js +24 -28
- package/dist/tools/testThis.js.map +1 -1
- package/dist/tools/visual.js +686 -210
- package/dist/tools/visual.js.map +1 -1
- package/dist/tools/wait.js +9 -38
- package/dist/tools/wait.js.map +1 -1
- package/dist/tools/wda.js +187 -57
- package/dist/tools/wda.js.map +1 -1
- package/dist/version.js +31 -22
- package/dist/version.js.map +1 -1
- package/dist/visual/ocr.js +53 -6
- package/dist/visual/ocr.js.map +1 -1
- package/dist/visual/provider.js +80 -12
- package/dist/visual/provider.js.map +1 -1
- package/docs/README.md +24 -10
- package/docs/ci-reports.md +328 -0
- package/docs/concepts.md +227 -0
- package/docs/flows.md +153 -0
- package/docs/mcp-server.md +194 -128
- package/docs/physical-devices.md +84 -0
- package/docs/tools.md +812 -152
- package/package.json +3 -2
- package/dist/tools/assertVisual.js +0 -84
- package/dist/tools/assertVisual.js.map +0 -1
- package/dist/tools/automationGenerate.js.map +0 -1
- package/dist/tools/capabilities.js +0 -179
- package/dist/tools/capabilities.js.map +0 -1
- package/dist/tools/detectContext.js +0 -41
- package/dist/tools/detectContext.js.map +0 -1
- package/dist/tools/flowGenerate.js.map +0 -1
- package/dist/tools/history.js +0 -86
- package/dist/tools/history.js.map +0 -1
- package/dist/tools/locator.js +0 -85
- package/dist/tools/locator.js.map +0 -1
- package/dist/tools/permissions.js +0 -174
- package/dist/tools/permissions.js.map +0 -1
- package/dist/tools/plan.js +0 -52
- package/dist/tools/plan.js.map +0 -1
- package/dist/tools/screenInfo.js +0 -76
- package/dist/tools/screenInfo.js.map +0 -1
- package/dist/tools/seed.js +0 -133
- package/dist/tools/seed.js.map +0 -1
- package/dist/tools/state.js +0 -217
- package/dist/tools/state.js.map +0 -1
- package/dist/tools/visualText.js +0 -106
- package/dist/tools/visualText.js.map +0 -1
package/dist/tools/metro.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// qa_metro
|
|
1
|
+
// qa_metro: own the debug React Native / Expo Metro flow (review §4.2 / Rec 5).
|
|
2
2
|
// A debug RN/Expo APK needs a Metro dev server on :8081 + `adb reverse` to fetch its JS
|
|
3
3
|
// bundle. `status` reports whether that's ready; `start` (consent-gated) sets up the
|
|
4
4
|
// reverse and launches Metro, logging to a session artifact.
|
|
@@ -6,7 +6,7 @@ import { z } from 'zod';
|
|
|
6
6
|
import { openSync, closeSync } from 'node:fs';
|
|
7
7
|
import { join } from 'node:path';
|
|
8
8
|
import { spawn, spawnSync } from 'node:child_process';
|
|
9
|
-
import { qaOk, qaError } from '../lib/result.js';
|
|
9
|
+
import { qaOk, qaError, unknownSessionError } from '../lib/result.js';
|
|
10
10
|
import { requireConsent, consumeConsent } from '../consent/consent.js';
|
|
11
11
|
import { run } from '../lib/spawn.js';
|
|
12
12
|
import { detectFramework } from '../context/detect.js';
|
|
@@ -14,17 +14,18 @@ import { METRO_PORT, metroReadiness } from '../lib/metroState.js';
|
|
|
14
14
|
import { parseSnapshot } from '../snapshot/parse.js';
|
|
15
15
|
import { detectRedBox } from '../snapshot/overlays.js';
|
|
16
16
|
import { getDriver, resolveDevice, bindDevice } from '../session/attach.js';
|
|
17
|
-
import { registerManagedProcess, unregisterManagedProcess } from '../session/processRegistry.js';
|
|
17
|
+
import { psEnv, registerManagedProcess, unregisterManagedProcess } from '../session/processRegistry.js';
|
|
18
18
|
/** True if `pid` is a live process whose command looks like a Metro/Expo/RN bundler. Guards
|
|
19
|
-
* against killing a recycled PID
|
|
20
|
-
* restart that now belongs to an unrelated process. Best-effort (POSIX `ps`); on any doubt
|
|
19
|
+
* against killing a recycled PID (e.g. a `metroPid` persisted before a machine or server
|
|
20
|
+
* restart that now belongs to an unrelated process). Best-effort (POSIX `ps`); on any doubt
|
|
21
21
|
* we report "not ours" so we never signal a stranger. */
|
|
22
22
|
function metroProcessLooksAlive(pid) {
|
|
23
23
|
try {
|
|
24
|
-
const out = spawnSync('ps', ['-o', 'command=', '-p', String(pid)], { encoding: 'utf8' });
|
|
24
|
+
const out = spawnSync('ps', ['-o', 'command=', '-p', String(pid)], { encoding: 'utf8', env: psEnv() });
|
|
25
25
|
if (out.status !== 0 || !out.stdout)
|
|
26
26
|
return false;
|
|
27
|
-
|
|
27
|
+
// `npm exec …`: npx retitles itself after spawn (the launcher we recorded as metroPid).
|
|
28
|
+
return /metro|expo|react-native|node|npm exec/i.test(out.stdout);
|
|
28
29
|
}
|
|
29
30
|
catch {
|
|
30
31
|
return false;
|
|
@@ -40,7 +41,7 @@ function killMetroGroup(pid) {
|
|
|
40
41
|
return true;
|
|
41
42
|
}
|
|
42
43
|
catch {
|
|
43
|
-
/* not a group leader, or group already gone
|
|
44
|
+
/* not a group leader, or group already gone, fall through */
|
|
44
45
|
}
|
|
45
46
|
try {
|
|
46
47
|
process.kill(pid, 'SIGTERM');
|
|
@@ -73,7 +74,9 @@ function metroCommand(framework) {
|
|
|
73
74
|
export function registerMetro(server, sessions) {
|
|
74
75
|
server.registerTool('qa_metro', {
|
|
75
76
|
title: 'Metro dev server (debug RN/Expo)',
|
|
76
|
-
description: '
|
|
77
|
+
description: 'Metro bundler for debug React Native / Expo builds (:8081). status: Metro/reverse/serving state; diagnose: + RedBox ' +
|
|
78
|
+
'detection, logcat evidence, and recovery steps; start (consent-gated): adb reverse + launch Metro with a log artifact; ' +
|
|
79
|
+
'stop: kill it + remove the reverse. After start, relaunch with qa_prepare_target.',
|
|
77
80
|
inputSchema: {
|
|
78
81
|
sessionId: z.string(),
|
|
79
82
|
action: z.enum(['status', 'diagnose', 'start', 'stop']),
|
|
@@ -83,20 +86,16 @@ export function registerMetro(server, sessions) {
|
|
|
83
86
|
}, async ({ sessionId, action, consentId, approve }) => {
|
|
84
87
|
const session = sessions.get(sessionId);
|
|
85
88
|
if (!session)
|
|
86
|
-
return
|
|
87
|
-
what: `Unknown sessionId ${sessionId}`,
|
|
88
|
-
changedState: false,
|
|
89
|
-
retrySafe: true,
|
|
90
|
-
nextSteps: ['Call qa_start_session first.'],
|
|
91
|
-
});
|
|
89
|
+
return unknownSessionError(sessionId);
|
|
92
90
|
// Centralized device resolution (P0.1/P0.3): use the session device, else the single
|
|
93
|
-
// online one (bind it), else ask / guide
|
|
91
|
+
// online one (bind it), else ask / guide. Never a circular "no device" dead end.
|
|
94
92
|
const dev = await resolveDevice(session);
|
|
95
93
|
if (dev.needSelection && action !== 'status') {
|
|
96
94
|
return qaError({
|
|
97
|
-
what: 'Multiple devices online
|
|
95
|
+
what: 'Multiple devices online, choose one',
|
|
98
96
|
changedState: false,
|
|
99
97
|
retrySafe: true,
|
|
98
|
+
failureCode: 'MULTIPLE_DEVICES',
|
|
100
99
|
nextSteps: [`Re-run qa_prepare_target with device="<serial>". Online: ${dev.available.join(', ')}`],
|
|
101
100
|
});
|
|
102
101
|
}
|
|
@@ -110,7 +109,7 @@ export function registerMetro(server, sessions) {
|
|
|
110
109
|
if (action === 'status') {
|
|
111
110
|
const deviceHint = serial
|
|
112
111
|
? ''
|
|
113
|
-
: '\n⚠ No device bound
|
|
112
|
+
: '\n⚠ No device bound; adb reverse needs one. Call qa_prepare_target first (it binds the device), then qa_metro.';
|
|
114
113
|
return qaOk({
|
|
115
114
|
framework: fw,
|
|
116
115
|
metroListening: listening,
|
|
@@ -125,8 +124,8 @@ export function registerMetro(server, sessions) {
|
|
|
125
124
|
needsDevice: !serial,
|
|
126
125
|
}, `framework=${fw} metro:${METRO_PORT}=${listening ? 'listening' : 'down'} serving=${rd.serving} adb-reverse=${serial ? (reverseSet ? 'set' : 'unset') : 'n/a (no device)'} device=${serial ?? 'none'} online=[${dev.available.join(',')}]${session.metroPid ? ` pid=${session.metroPid}` : ''}` +
|
|
127
126
|
(rd.ready
|
|
128
|
-
? '\nReady
|
|
129
|
-
: deviceHint || '\nNot fully ready
|
|
127
|
+
? '\nReady: debug bundle can load.'
|
|
128
|
+
: deviceHint || '\nNot fully ready. Run qa_metro action="start" (or qa_metro diagnose).'));
|
|
130
129
|
}
|
|
131
130
|
if (action === 'diagnose') {
|
|
132
131
|
const { driver } = await getDriver(session);
|
|
@@ -148,23 +147,23 @@ export function registerMetro(server, sessions) {
|
|
|
148
147
|
let requiresReinstall = false;
|
|
149
148
|
if (!serial)
|
|
150
149
|
recovery.push(dev.needSelection
|
|
151
|
-
? `Multiple devices online
|
|
152
|
-
: 'No device online
|
|
150
|
+
? `Multiple devices online. Re-run qa_prepare_target device="<serial>". Online: ${dev.available.join(', ')}`
|
|
151
|
+
: 'No device online. Boot one via qa_prepare_target (it boots + sets reverse), then retry.');
|
|
153
152
|
if (!listening)
|
|
154
153
|
recovery.push('Start Metro: qa_metro action="start".');
|
|
155
154
|
if (serial && listening && !reverseSet)
|
|
156
155
|
recovery.push('Set reverse: qa_metro action="start" (sets adb reverse).');
|
|
157
156
|
if (listening && !rd.serving)
|
|
158
|
-
recovery.push('Metro is up but not serving the bundle yet
|
|
157
|
+
recovery.push('Metro is up but not serving the bundle yet. Wait ~10s for the first transform, then retry.');
|
|
159
158
|
if (redbox.unableToLoadScript) {
|
|
160
159
|
requiresReinstall = true;
|
|
161
|
-
recovery.push('RedBox is "Unable to load script": the installed build cannot fetch the JS bundle. If Metro+reverse are ready and it still fails, the APK is bundle-less/asset-only
|
|
160
|
+
recovery.push('RedBox is "Unable to load script": the installed build cannot fetch the JS bundle. If Metro+reverse are ready and it still fails, the APK is bundle-less/asset-only. RECOVERY REQUIRES REINSTALL/REBUILD of a working debug or release APK (a data wipe alone will not fix it).');
|
|
162
161
|
}
|
|
163
162
|
else if (redbox.present) {
|
|
164
163
|
recovery.push('RedBox present (not load-script): tap RELOAD via qa_act, or fix the JS error shown.');
|
|
165
164
|
}
|
|
166
165
|
if (rd.ready && !redbox.present)
|
|
167
|
-
recovery.push('Metro ready and no RedBox
|
|
166
|
+
recovery.push('Metro ready and no RedBox. The bundle should load.');
|
|
168
167
|
return qaOk({
|
|
169
168
|
framework: fw,
|
|
170
169
|
...rd,
|
|
@@ -177,7 +176,7 @@ export function registerMetro(server, sessions) {
|
|
|
177
176
|
recovery,
|
|
178
177
|
}, `framework=${fw} | metro listening=${rd.listening} serving=${rd.serving} reverse=${reverseSet} ready=${rd.ready}\n` +
|
|
179
178
|
`redbox=${redbox.present ? (redbox.unableToLoadScript ? 'UNABLE-TO-LOAD-SCRIPT' : 'present') : 'none'}${requiresReinstall ? ' ⚠ requires reinstall/rebuild' : ''}\n` +
|
|
180
|
-
`recovery:\n - ${recovery.join('\n - ') || '(none
|
|
179
|
+
`recovery:\n - ${recovery.join('\n - ') || '(none, looks healthy)'}` +
|
|
181
180
|
(logUri ? `\nlogcat evidence: ${logUri}` : ''));
|
|
182
181
|
}
|
|
183
182
|
if (action === 'stop') {
|
|
@@ -214,20 +213,21 @@ export function registerMetro(server, sessions) {
|
|
|
214
213
|
? `Stopped Metro pid ${had}${killed ? '' : ' (was already gone)'}; removed adb reverse.`
|
|
215
214
|
: 'No Swipium-started Metro to stop (it may have been started externally).');
|
|
216
215
|
}
|
|
217
|
-
// action === 'start'
|
|
216
|
+
// action === 'start': `serial` is the single online device (auto-bound) or a session
|
|
218
217
|
// device. If none online, guide to prepare_target to BOOT (terminal, non-circular).
|
|
219
218
|
if (!serial) {
|
|
220
219
|
return qaError({
|
|
221
|
-
what: dev.needSelection ? 'Multiple devices online
|
|
220
|
+
what: dev.needSelection ? 'Multiple devices online, choose one' : 'No device online. Metro reverse needs a running device',
|
|
222
221
|
changedState: false,
|
|
223
222
|
retrySafe: true,
|
|
223
|
+
failureCode: dev.needSelection ? 'MULTIPLE_DEVICES' : 'NO_DEVICE',
|
|
224
224
|
nextSteps: dev.needSelection
|
|
225
225
|
? [`Re-run qa_prepare_target device="<serial>". Online: ${dev.available.join(', ')}`]
|
|
226
226
|
: ['Boot a device first: qa_prepare_target { bindOnly:true } (boots an AVD + sets reverse), then qa_metro start.'],
|
|
227
227
|
});
|
|
228
228
|
}
|
|
229
229
|
if (listening && reverseSet) {
|
|
230
|
-
return qaOk({ framework: fw, metroListening: true, reverseSet: true, alreadyRunning: true }, 'Metro already listening and adb reverse already set
|
|
230
|
+
return qaOk({ framework: fw, metroListening: true, reverseSet: true, alreadyRunning: true }, 'Metro already listening and adb reverse already set, nothing to do.');
|
|
231
231
|
}
|
|
232
232
|
const { cmd, args } = metroCommand(fw);
|
|
233
233
|
const cmdStr = `adb -s ${serial} reverse tcp:${METRO_PORT} tcp:${METRO_PORT} && (cd ${session.root} && ${cmd} ${args.join(' ')})`;
|
|
@@ -236,14 +236,14 @@ export function registerMetro(server, sessions) {
|
|
|
236
236
|
sessions.recordMutation(session, {
|
|
237
237
|
tool: 'qa_metro',
|
|
238
238
|
action: 'start_metro',
|
|
239
|
-
risk: '
|
|
239
|
+
risk: 'medium',
|
|
240
240
|
target: { device: serial, port: METRO_PORT, framework: fw },
|
|
241
241
|
consent: { required: true, approved: false },
|
|
242
242
|
status: 'requested',
|
|
243
243
|
});
|
|
244
244
|
return requireConsent({
|
|
245
245
|
action: 'start_metro',
|
|
246
|
-
risk: '
|
|
246
|
+
risk: 'medium',
|
|
247
247
|
exactCommand: cmdStr,
|
|
248
248
|
affects: { port: METRO_PORT, framework: fw },
|
|
249
249
|
explain: `This looks like a debug ${fw} build needing Metro on :${METRO_PORT}. Set adb reverse and start Metro?`,
|
|
@@ -252,7 +252,7 @@ export function registerMetro(server, sessions) {
|
|
|
252
252
|
sessions.recordMutation(session, {
|
|
253
253
|
tool: 'qa_metro',
|
|
254
254
|
action: 'start_metro',
|
|
255
|
-
risk: '
|
|
255
|
+
risk: 'medium',
|
|
256
256
|
target: { device: serial, port: METRO_PORT, framework: fw },
|
|
257
257
|
consent: { required: true, consentId, approved: true },
|
|
258
258
|
status: 'approved',
|
|
@@ -265,7 +265,7 @@ export function registerMetro(server, sessions) {
|
|
|
265
265
|
sessions.recordMutation(session, {
|
|
266
266
|
tool: 'qa_metro',
|
|
267
267
|
action: 'start_metro',
|
|
268
|
-
risk: '
|
|
268
|
+
risk: 'medium',
|
|
269
269
|
target: { device: serial, port: METRO_PORT, framework: fw },
|
|
270
270
|
consent: { required: true, consentId, approved: true },
|
|
271
271
|
status: 'blocked',
|
|
@@ -276,6 +276,7 @@ export function registerMetro(server, sessions) {
|
|
|
276
276
|
commandAttempted: `adb -s ${serial} reverse tcp:${METRO_PORT} tcp:${METRO_PORT}`,
|
|
277
277
|
changedState: true,
|
|
278
278
|
retrySafe: true,
|
|
279
|
+
failureCode: 'METRO_FAILED',
|
|
279
280
|
nextSteps: ['Check the device is online.'],
|
|
280
281
|
});
|
|
281
282
|
}
|
|
@@ -293,13 +294,13 @@ export function registerMetro(server, sessions) {
|
|
|
293
294
|
sessions.recordMutation(session, {
|
|
294
295
|
tool: 'qa_metro',
|
|
295
296
|
action: 'start_metro',
|
|
296
|
-
risk: '
|
|
297
|
+
risk: 'medium',
|
|
297
298
|
target: { device: serial, port: METRO_PORT, framework: fw, pid: child.pid ?? null },
|
|
298
299
|
consent: { required: true, consentId, approved: true },
|
|
299
300
|
status: 'executed',
|
|
300
301
|
ledgerUri: logUri,
|
|
301
302
|
});
|
|
302
|
-
return qaOk({ framework: fw, started: true, port: METRO_PORT, reverseSet: true, pid: child.pid, logUri, logPath }, `Started Metro (${fw}) on :${METRO_PORT} + adb reverse set. Log
|
|
303
|
+
return qaOk({ framework: fw, started: true, port: METRO_PORT, reverseSet: true, pid: child.pid, logUri, logPath }, `Started Metro (${fw}) on :${METRO_PORT} + adb reverse set. Log: ${logUri}\nWait ~5-10s for "Metro waiting", then relaunch the app with qa_prepare_target.`);
|
|
303
304
|
});
|
|
304
305
|
}
|
|
305
306
|
//# sourceMappingURL=metro.js.map
|
package/dist/tools/metro.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metro.js","sourceRoot":"","sources":["../../src/tools/metro.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"metro.js","sourceRoot":"","sources":["../../src/tools/metro.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
// SWIPIUM Mobile QA Toolkit MCP tool
|
|
1
|
+
// SWIPIUM Mobile QA Toolkit MCP tool. qa_mobile_audit turns a named profile
|
|
2
2
|
// (smoke | account_cycle | store_compliance | resilience | release_gate) into an ordered, classified
|
|
3
3
|
// checklist plus the account-cycle safety contract the agent executes with the existing driver tools.
|
|
4
4
|
// It also surfaces the issue-ledger recurrence state so a release gate sees regressions. Thin wrapper
|
|
5
5
|
// over src/mobileAudit/* and src/issues/*.
|
|
6
6
|
import { z } from 'zod';
|
|
7
|
-
import { qaOk, qaError } from '../lib/result.js';
|
|
8
|
-
import { resolveProjectRoot } from '../context/projectRoot.js';
|
|
9
|
-
import { getDriver } from '../session/attach.js';
|
|
7
|
+
import { qaOk, qaError, unknownSessionError } from '../lib/result.js';
|
|
8
|
+
import { resolveProjectRoot, unresolvedProjectRootError } from '../context/projectRoot.js';
|
|
9
|
+
import { blockedDeviceResult, getDriver } from '../session/attach.js';
|
|
10
10
|
import { accountCycleSafety, checksForProfile, ALL_PROFILES } from '../mobileAudit/profiles.js';
|
|
11
|
-
import { runMobileAudit } from '../mobileAudit/runner.js';
|
|
11
|
+
import { auditChangesNetwork, auditNetworkConsentRequest, runMobileAudit } from '../mobileAudit/runner.js';
|
|
12
|
+
import { consumeConsent, requireConsent } from '../consent/consent.js';
|
|
12
13
|
import { auditRunToMarkdown } from '../mobileAudit/results.js';
|
|
13
14
|
import { generateSessionReport } from '../services/report.js';
|
|
14
15
|
import { queryIssues } from '../issues/index.js';
|
|
15
|
-
import { issuesResourceUri } from '../issues/store.js';
|
|
16
16
|
import { resolveSourceRevision } from '../issues/sourceRevision.js';
|
|
17
17
|
import { loadPolicy } from '../issues/store.js';
|
|
18
18
|
function nowIso() {
|
|
@@ -22,7 +22,7 @@ async function rootFor(server, sessions, args) {
|
|
|
22
22
|
if (args.sessionId) {
|
|
23
23
|
const s = sessions.get(args.sessionId);
|
|
24
24
|
if (!s)
|
|
25
|
-
return {
|
|
25
|
+
return { error: unknownSessionError(args.sessionId) };
|
|
26
26
|
return { root: s.root };
|
|
27
27
|
}
|
|
28
28
|
const resolved = await resolveProjectRoot(server, args.projectRoot);
|
|
@@ -33,45 +33,31 @@ async function rootFor(server, sessions, args) {
|
|
|
33
33
|
export function registerMobileAudit(server, sessions) {
|
|
34
34
|
server.registerTool('qa_mobile_audit', {
|
|
35
35
|
title: 'Mobile QA release audit',
|
|
36
|
-
description: '
|
|
36
|
+
description: 'Plan or execute a release audit. profile: smoke, account_cycle (create > logout > login > forgot-password on a ' +
|
|
37
|
+
'DISPOSABLE generated account), store_compliance (privacy/terms/account deletion/subscription/paywall), resilience ' +
|
|
38
|
+
'(offline/relaunch/rotation; airplane toggle is consent-gated, original network restored), release_gate (all + locator readiness + issue recurrence). mode:"plan" ' +
|
|
39
|
+
'(default) returns the checklist + safety contract without the device; "execute" (prepared session) runs every check, ' +
|
|
40
|
+
'logs fail/blocked checks to the issue ledger with evidence, and returns release impact. No check passes without ' +
|
|
41
|
+
'evidence.',
|
|
37
42
|
inputSchema: {
|
|
38
43
|
projectRoot: z.string().optional(),
|
|
39
44
|
sessionId: z.string().optional(),
|
|
40
|
-
profile: z
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
.enum(['plan', 'execute'])
|
|
45
|
-
.optional()
|
|
46
|
-
.describe('plan (default): return the ordered checklist (expected behavior + report classification), the account-cycle safety contract, and an `executor` handoff — no device is touched. execute: drive the audit against the attached device, record issues + evidence, and return per-check MobileAuditCheckResults + release impact.'),
|
|
47
|
-
allowGeneratedData: z
|
|
48
|
-
.boolean()
|
|
49
|
-
.optional()
|
|
50
|
-
.describe('Permit safe generated disposable-account data (test/staging only). Safety contract: logout is permitted only inside the controlled account-cycle workflow on the disposable account; delete/pay/send stay refused; a real account is never deleted; OTP/MFA returns needs_input.'),
|
|
51
|
-
allowTestAccountDeletion: z
|
|
52
|
-
.boolean()
|
|
53
|
-
.optional()
|
|
54
|
-
.describe('Permit destructive cleanup of disposable test accounts only (never a real account).'),
|
|
45
|
+
profile: z.enum(ALL_PROFILES),
|
|
46
|
+
mode: z.enum(['plan', 'execute']).optional(),
|
|
47
|
+
allowGeneratedData: z.boolean().optional().describe('Permit generated disposable test data (required for account_cycle).'),
|
|
48
|
+
allowTestAccountDeletion: z.boolean().optional().describe('Permit deleting disposable test accounts (never a real account).'),
|
|
55
49
|
offlineMode: z.boolean().optional().describe('Hint that resilience checks should drive offline state.'),
|
|
56
50
|
sourceRevision: z
|
|
57
51
|
.object({ commit: z.string().optional(), buildVersion: z.string().optional(), branch: z.string().optional() })
|
|
58
52
|
.optional(),
|
|
59
53
|
targetApp: z.string().optional(),
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
.optional()
|
|
63
|
-
.describe('Reserved; execute currently always runs to completion and returns the full result.'),
|
|
54
|
+
consentId: z.string().optional().describe('execute: consent for the resilience airplane-mode toggle (network_change).'),
|
|
55
|
+
approve: z.boolean().optional(),
|
|
64
56
|
},
|
|
65
|
-
}, async ({ projectRoot, sessionId, profile, mode, allowGeneratedData, allowTestAccountDeletion, offlineMode, sourceRevision, targetApp, }) => {
|
|
66
|
-
const { root, hint } = await rootFor(server, sessions, { projectRoot, sessionId });
|
|
57
|
+
}, async ({ projectRoot, sessionId, profile, mode, allowGeneratedData, allowTestAccountDeletion, offlineMode, sourceRevision, targetApp, consentId, approve, }) => {
|
|
58
|
+
const { root, hint, error } = await rootFor(server, sessions, { projectRoot, sessionId });
|
|
67
59
|
if (!root)
|
|
68
|
-
return
|
|
69
|
-
what: 'Could not resolve a project root',
|
|
70
|
-
changedState: false,
|
|
71
|
-
retrySafe: true,
|
|
72
|
-
nextSteps: ['Pass projectRoot or sessionId.'],
|
|
73
|
-
clientHint: hint,
|
|
74
|
-
});
|
|
60
|
+
return error ?? unresolvedProjectRootError({ source: 'none', hint });
|
|
75
61
|
const prof = profile;
|
|
76
62
|
const policyForRev = loadPolicy(root);
|
|
77
63
|
const revisionResolved = resolveSourceRevision({
|
|
@@ -90,16 +76,36 @@ export function registerMobileAudit(server, sessions) {
|
|
|
90
76
|
retrySafe: true,
|
|
91
77
|
nextSteps: ['Call qa_start_session + qa_prepare_target (or qa_test_this), then qa_mobile_audit { mode:"execute" }.'],
|
|
92
78
|
});
|
|
93
|
-
const { driver } = await getDriver(session);
|
|
79
|
+
const { driver, blocked } = await getDriver(session);
|
|
94
80
|
if (!driver)
|
|
95
|
-
return
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
81
|
+
return (blockedDeviceResult(blocked) ??
|
|
82
|
+
qaError({
|
|
83
|
+
what: 'No device attached to this session',
|
|
84
|
+
changedState: false,
|
|
85
|
+
retrySafe: true,
|
|
86
|
+
nextSteps: ['Prepare a device first (qa_test_this / qa_prepare_target), then re-run.'],
|
|
87
|
+
}));
|
|
88
|
+
// resilience / release_gate toggle airplane mode: same network_change gate as qa_network.
|
|
89
|
+
let networkChangeApproved = false;
|
|
90
|
+
if (auditChangesNetwork(prof)) {
|
|
91
|
+
const req = auditNetworkConsentRequest(prof);
|
|
92
|
+
const gate = consumeConsent(consentId, approve, { action: req.action, affects: req.affects });
|
|
93
|
+
if (!gate.approved) {
|
|
94
|
+
sessions.recordMutation(session, {
|
|
95
|
+
tool: 'qa_mobile_audit',
|
|
96
|
+
action: req.action,
|
|
97
|
+
risk: req.risk,
|
|
98
|
+
target: req.affects,
|
|
99
|
+
consent: { required: true, approved: false },
|
|
100
|
+
status: 'requested',
|
|
101
|
+
});
|
|
102
|
+
return requireConsent(req);
|
|
103
|
+
}
|
|
104
|
+
networkChangeApproved = true;
|
|
105
|
+
}
|
|
101
106
|
try {
|
|
102
107
|
const run = await runMobileAudit(sessions, session, driver, {
|
|
108
|
+
networkChangeApproved,
|
|
103
109
|
profile: prof,
|
|
104
110
|
allowGeneratedData,
|
|
105
111
|
allowTestAccountDeletion,
|
|
@@ -117,7 +123,7 @@ export function registerMobileAudit(server, sessions) {
|
|
|
117
123
|
/* report is best-effort */
|
|
118
124
|
}
|
|
119
125
|
const passed = run.checks.filter((c) => c.status === 'pass').length;
|
|
120
|
-
return qaOk({ ...run, markdown: auditRunToMarkdown(run)
|
|
126
|
+
return qaOk({ ...run, markdown: auditRunToMarkdown(run) }, `🔍 mobile audit ${prof}: ${run.state}, release=${run.releaseImpact}, ${passed}/${run.checks.length} pass, ${run.issueIds.length} issue(s)${run.recurrenceWarnings.length ? `, ${run.recurrenceWarnings.length} recurrence` : ''}`);
|
|
121
127
|
}
|
|
122
128
|
catch (e) {
|
|
123
129
|
return qaError({
|
|
@@ -160,7 +166,6 @@ export function registerMobileAudit(server, sessions) {
|
|
|
160
166
|
blockedChecks,
|
|
161
167
|
recurrenceWarnings: recurrence,
|
|
162
168
|
sourceRevision: revisionResolved,
|
|
163
|
-
resourceUri: issuesResourceUri(root),
|
|
164
169
|
}, summary);
|
|
165
170
|
});
|
|
166
171
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mobileAudit.js","sourceRoot":"","sources":["../../src/tools/mobileAudit.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"mobileAudit.js","sourceRoot":"","sources":["../../src/tools/mobileAudit.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/network.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
// qa_network
|
|
1
|
+
// qa_network: safe offline/online testing without raw adb (Phase 2 CR2).
|
|
2
2
|
// Uses `cmd connectivity airplane-mode` (API 30+). Records the original state on first
|
|
3
3
|
// change so it can be restored; report + session-end restore use session.network.
|
|
4
4
|
import { z } from 'zod';
|
|
5
|
-
import { qaOk, qaError } from '../lib/result.js';
|
|
5
|
+
import { qaOk, qaError, unknownSessionError } from '../lib/result.js';
|
|
6
6
|
import { requireConsent, consumeConsent } from '../consent/consent.js';
|
|
7
|
-
import { getDriver } from '../session/attach.js';
|
|
7
|
+
import { blockedDeviceResult, getDriver } from '../session/attach.js';
|
|
8
8
|
/** Restore network to the recorded original state. Exported for report/session-end use. */
|
|
9
9
|
export async function restoreNetwork(sessions, session, d) {
|
|
10
10
|
if (!session.network?.changed)
|
|
@@ -25,7 +25,7 @@ export async function restoreNetwork(sessions, session, d) {
|
|
|
25
25
|
sessions.persist(session);
|
|
26
26
|
return `restored (airplane=${original})`;
|
|
27
27
|
}
|
|
28
|
-
/** Best-effort restore of EVERY session that changed the network
|
|
28
|
+
/** Best-effort restore of EVERY session that changed the network, for server shutdown. */
|
|
29
29
|
export async function restoreAllNetwork(sessions) {
|
|
30
30
|
const { DirectDriver } = await import('../drivers/DirectDriver.js');
|
|
31
31
|
for (const s of sessions.list()) {
|
|
@@ -56,7 +56,8 @@ export async function restoreAllNetwork(sessions) {
|
|
|
56
56
|
export function registerNetwork(server, sessions) {
|
|
57
57
|
server.registerTool('qa_network', {
|
|
58
58
|
title: 'Network state control',
|
|
59
|
-
description: 'Offline/online testing via airplane mode (
|
|
59
|
+
description: 'Offline/online testing via airplane mode (Android 11+). action: status, offline/online (consent-gated), restore. The ' +
|
|
60
|
+
'original state is restored on qa_report, on restore, and on server shutdown.',
|
|
60
61
|
inputSchema: {
|
|
61
62
|
sessionId: z.string(),
|
|
62
63
|
action: z.enum(['status', 'offline', 'online', 'restore']),
|
|
@@ -65,9 +66,23 @@ export function registerNetwork(server, sessions) {
|
|
|
65
66
|
},
|
|
66
67
|
}, async ({ sessionId, action, consentId, approve }) => {
|
|
67
68
|
const session = sessions.get(sessionId);
|
|
68
|
-
|
|
69
|
+
if (!session)
|
|
70
|
+
return unknownSessionError(sessionId);
|
|
71
|
+
const { driver: d, blocked } = await getDriver(session);
|
|
69
72
|
if (!session || !d) {
|
|
70
|
-
return
|
|
73
|
+
return (blockedDeviceResult(blocked) ??
|
|
74
|
+
qaError({ what: 'No device attached', changedState: false, retrySafe: true, nextSteps: ['Call qa_prepare_target first.'] }));
|
|
75
|
+
}
|
|
76
|
+
// Airplane-mode control is an Android emulator feature (`cmd connectivity airplane-mode`); iOS
|
|
77
|
+
// simulators have no equivalent, so answer with a typed refusal instead of a raw driver error.
|
|
78
|
+
if (d.kind !== 'direct') {
|
|
79
|
+
return qaError({
|
|
80
|
+
what: 'qa_network is supported on Android emulators only (iOS simulators have no airplane-mode control)',
|
|
81
|
+
changedState: false,
|
|
82
|
+
retrySafe: false,
|
|
83
|
+
failureCode: 'BACKEND_UNSUPPORTED',
|
|
84
|
+
nextSteps: ['On iOS, test offline behavior by disconnecting the Mac from the network or with a network link conditioner.'],
|
|
85
|
+
});
|
|
71
86
|
}
|
|
72
87
|
const airplane = await d.airplaneOn();
|
|
73
88
|
if (action === 'status') {
|
|
@@ -76,13 +91,13 @@ export function registerNetwork(server, sessions) {
|
|
|
76
91
|
airplaneOn: airplane,
|
|
77
92
|
changedBySwipium: !!session.network?.changed,
|
|
78
93
|
restoreAvailable: !!session.network?.changed,
|
|
79
|
-
}, `network=${airplane ? 'offline (airplane on)' : 'online'}${session.network?.changed ? ' (changed by Swipium
|
|
94
|
+
}, `network=${airplane ? 'offline (airplane on)' : 'online'}${session.network?.changed ? ' (changed by Swipium, will restore)' : ''}`);
|
|
80
95
|
}
|
|
81
96
|
if (action === 'restore') {
|
|
82
97
|
const msg = await restoreNetwork(sessions, session, d);
|
|
83
98
|
return qaOk({ network: (await d.airplaneOn()) ? 'offline' : 'online', restored: !!msg }, msg ? `network ${msg}` : 'nothing to restore (Swipium did not change the network)');
|
|
84
99
|
}
|
|
85
|
-
// offline / online
|
|
100
|
+
// offline / online: consent-gated, records original on first change.
|
|
86
101
|
const wantAirplane = action === 'offline';
|
|
87
102
|
const gate = consumeConsent(consentId, approve, { action: 'network_change', affects: { to: action } });
|
|
88
103
|
if (!gate.approved) {
|
|
@@ -110,7 +125,8 @@ export function registerNetwork(server, sessions) {
|
|
|
110
125
|
consent: { required: true, consentId, approved: true, payloadHash: action },
|
|
111
126
|
status: 'approved',
|
|
112
127
|
});
|
|
113
|
-
|
|
128
|
+
const firstChange = !session.network?.changed;
|
|
129
|
+
if (firstChange) {
|
|
114
130
|
session.network = { changed: true, originalAirplane: airplane };
|
|
115
131
|
}
|
|
116
132
|
sessions.persist(session);
|
|
@@ -118,8 +134,9 @@ export function registerNetwork(server, sessions) {
|
|
|
118
134
|
await d.setAirplane(wantAirplane);
|
|
119
135
|
}
|
|
120
136
|
catch (e) {
|
|
121
|
-
// Older images / no `cmd connectivity airplane-mode` (pre-Android 11).
|
|
122
|
-
|
|
137
|
+
// Older images / no `cmd connectivity airplane-mode` (pre-Android 11). Nothing changed, so
|
|
138
|
+
// drop the restore record this call just created (an earlier change's record is kept).
|
|
139
|
+
if (firstChange)
|
|
123
140
|
session.network = undefined;
|
|
124
141
|
sessions.persist(session);
|
|
125
142
|
return qaError({
|
|
@@ -129,7 +146,7 @@ export function registerNetwork(server, sessions) {
|
|
|
129
146
|
nextSteps: ['Needs Android 11+ (`cmd connectivity airplane-mode`). Use a newer emulator image, or toggle network manually.'],
|
|
130
147
|
});
|
|
131
148
|
}
|
|
132
|
-
sessions.addEnvChange(session, `network
|
|
149
|
+
sessions.addEnvChange(session, `network > ${action} (airplane=${wantAirplane})`);
|
|
133
150
|
await new Promise((r) => setTimeout(r, 1200)); // settle
|
|
134
151
|
const now = await d.airplaneOn();
|
|
135
152
|
sessions.recordMutation(session, {
|
|
@@ -141,7 +158,7 @@ export function registerNetwork(server, sessions) {
|
|
|
141
158
|
status: 'executed',
|
|
142
159
|
detail: `network=${now ? 'offline' : 'online'}`,
|
|
143
160
|
});
|
|
144
|
-
return qaOk({ network: now ? 'offline' : 'online', previousStateRecorded: true, restoreAvailable: true }, `network
|
|
161
|
+
return qaOk({ network: now ? 'offline' : 'online', previousStateRecorded: true, restoreAvailable: true }, `network > ${now ? 'offline' : 'online'}. Original recorded; restore on qa_report / qa_network restore.`);
|
|
145
162
|
});
|
|
146
163
|
}
|
|
147
164
|
//# sourceMappingURL=network.js.map
|