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
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
// qa_test_this terminal-state assembly
|
|
1
|
+
// qa_test_this terminal-state assembly: every terminal state (completed OR blocked) generates a
|
|
2
2
|
// report artifact (Milestone B) and lands the uniform TerminalEnvelope on the job result, so the
|
|
3
3
|
// outcome is summarizable from structured output without log parsing.
|
|
4
4
|
import { buildTerminalEnvelope, typedBlockerFromCode } from '../envelope.js';
|
|
5
5
|
import { generateSessionReport } from '../../services/report.js';
|
|
6
6
|
import { startProgress } from '../../session/progress.js';
|
|
7
7
|
import { log } from '../../lib/logger.js';
|
|
8
|
-
/** Every terminal state
|
|
8
|
+
/** Every terminal state (completed OR blocked) generates a report artifact (Milestone B). */
|
|
9
9
|
export function createFinisher(ctx) {
|
|
10
10
|
const { sessions, session, job, a, attempted, artifacts, upd } = ctx;
|
|
11
11
|
return async (state, failureCode, summary, extra = {}) => {
|
|
@@ -16,7 +16,7 @@ export function createFinisher(ctx) {
|
|
|
16
16
|
risk: a.testThisPlanMutation.risk,
|
|
17
17
|
target: a.testThisPlanMutation.affects,
|
|
18
18
|
consent: a.mutationConsent,
|
|
19
|
-
status: state === '
|
|
19
|
+
status: state === 'blocked' || state === 'unsafe' ? 'blocked' : 'executed',
|
|
20
20
|
detail: failureCode,
|
|
21
21
|
});
|
|
22
22
|
}
|
|
@@ -46,6 +46,7 @@ export function createFinisher(ctx) {
|
|
|
46
46
|
});
|
|
47
47
|
reportUri = r.reportUri;
|
|
48
48
|
manifestUri = r.manifestUri;
|
|
49
|
+
sessions.milestone(session, 'report_generated'); // persisted flag for qa_status's ladder
|
|
49
50
|
if (!artifacts.includes(reportUri))
|
|
50
51
|
artifacts.push(reportUri);
|
|
51
52
|
appVerdict = r.report.appVerdict;
|
|
@@ -62,16 +63,28 @@ export function createFinisher(ctx) {
|
|
|
62
63
|
: session.findings.some((f) => f.layer === 'app' && f.severity === 'medium')
|
|
63
64
|
? 'degraded'
|
|
64
65
|
: 'OK';
|
|
65
|
-
// The report already exists
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
66
|
+
// The report already exists, so point the agent AT it (fetch/open), not back at qa_report.
|
|
67
|
+
const question = extra.needsInput;
|
|
68
|
+
const nextRecommendedAction = state === 'needs_input' && question?.resume
|
|
69
|
+
? {
|
|
70
|
+
tool: question.resume.tool,
|
|
71
|
+
args: question.resume.args,
|
|
72
|
+
why: `Ask the user exactly this one question, then resume with their answer: ${question.question ?? question.kind ?? 'input needed'}`,
|
|
73
|
+
}
|
|
74
|
+
: state === 'completed'
|
|
75
|
+
? reportUri
|
|
76
|
+
? {
|
|
77
|
+
tool: 'qa_get_artifact',
|
|
78
|
+
args: { uri: reportUri },
|
|
79
|
+
why: `Open the generated report (${reportUri})`,
|
|
80
|
+
}
|
|
81
|
+
: { tool: 'qa_report', args: { sessionId: session.id }, why: 'Generate the report' }
|
|
82
|
+
: {
|
|
83
|
+
tool: 'qa_explain_blocker',
|
|
84
|
+
// sessionId lets qa_explain_blocker stamp the blocker as explained, so qa_status moves on.
|
|
85
|
+
args: { failureCode: failureCode ?? 'UNKNOWN', sessionId: session.id },
|
|
86
|
+
why: 'Understand the blocker and how to fix it',
|
|
87
|
+
};
|
|
75
88
|
// Uniform terminal envelope (Milestone B): summarizable from structured output, no log parsing.
|
|
76
89
|
const envelope = buildTerminalEnvelope({
|
|
77
90
|
state,
|
|
@@ -87,16 +100,17 @@ export function createFinisher(ctx) {
|
|
|
87
100
|
...(coverageVerdict ? { coverage: coverageVerdict } : {}),
|
|
88
101
|
...(toolVerdict ? { tool: toolVerdict } : {}),
|
|
89
102
|
},
|
|
90
|
-
blockers: state === 'completed' || !failureCode ? [] : [typedBlockerFromCode(failureCode)],
|
|
103
|
+
blockers: state === 'completed' || state === 'needs_input' || !failureCode ? [] : [typedBlockerFromCode(failureCode)],
|
|
91
104
|
reportUri: reportUri ?? null,
|
|
92
105
|
nextRecommendedAction,
|
|
93
106
|
});
|
|
94
107
|
upd({
|
|
95
|
-
|
|
108
|
+
// needs_input is a clean pause (the run did what it could and asks ONE question), not a failure.
|
|
109
|
+
status: state === 'completed' || state === 'needs_input' ? 'done' : 'failed',
|
|
96
110
|
progress: state,
|
|
97
111
|
result: {
|
|
98
112
|
...envelope,
|
|
99
|
-
// Pre-launch static app map URI is present in EVERY terminal state
|
|
113
|
+
// Pre-launch static app map URI is present in EVERY terminal state, including blocked (Fix 1).
|
|
100
114
|
appMapUri: a.appMapUri,
|
|
101
115
|
goal: a.goal,
|
|
102
116
|
requiredOutputs: a.requiredOutputs,
|
|
@@ -106,6 +120,10 @@ export function createFinisher(ctx) {
|
|
|
106
120
|
manifestUri,
|
|
107
121
|
health: { native, app },
|
|
108
122
|
inputsProvided: session.inputs.map((i) => i.varName),
|
|
123
|
+
// Compact report pointer: verdict one-liner + URI; the full report lives at reportUri.
|
|
124
|
+
reportSummary: reportUri
|
|
125
|
+
? `${appVerdict?.status ?? 'n/a'} app · ${coverageVerdict?.status ?? 'n/a'} coverage · ${toolVerdict?.status ?? 'n/a'} tool. Read ${reportUri}`
|
|
126
|
+
: null,
|
|
109
127
|
notes: session.notes.length,
|
|
110
128
|
findings: session.findings.length,
|
|
111
129
|
...extra,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../../src/orchestration/testThis/terminal.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../../src/orchestration/testThis/terminal.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Shared types for the qa_test_this orchestration state machine (split out of
|
|
2
|
-
// src/tools/testThis.ts). Pure declarations + tiny helpers
|
|
2
|
+
// src/tools/testThis.ts). Pure declarations + tiny helpers, no side effects.
|
|
3
3
|
export const selToPlatform = {
|
|
4
4
|
'android-emulator': 'android',
|
|
5
5
|
'android-real': 'android',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/orchestration/testThis/types.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/orchestration/testThis/types.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,6EAA6E;AA0B7E,MAAM,CAAC,MAAM,aAAa,GAA2C;IACnE,kBAAkB,EAAE,SAAS;IAC7B,cAAc,EAAE,SAAS;IACzB,eAAe,EAAE,KAAK;IACtB,UAAU,EAAE,KAAK;CAClB,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,MAAc;IACpD,OAAO,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC"}
|
package/dist/plan/plan.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Workflow-plan core (qa_resolve_target include:["plan"]): PURE synthesis. Given what we detected about the
|
|
2
2
|
// project + what the session declared (fixtures, observed auth, prepared appId), produce a
|
|
3
3
|
// safe test plan: which workflows are READY, which are BLOCKED (and why + how to unblock),
|
|
4
4
|
// and which are UNSAFE (and why). No device I/O lives here, so it is fully unit-testable;
|
|
5
|
-
// the tool wrapper (src/tools/
|
|
5
|
+
// the tool wrapper (src/tools/resolveTarget.ts workflowPlan) gathers the inputs and calls buildPlan().
|
|
6
6
|
const LOGIN_FIXTURE = /login|auth|account|credential|sign[\s_-]?in/i;
|
|
7
7
|
function isDebugRN(fw) {
|
|
8
8
|
return fw === 'expo' || fw === 'bare-react-native';
|
|
@@ -37,7 +37,7 @@ export function buildPlan(i) {
|
|
|
37
37
|
}
|
|
38
38
|
return null;
|
|
39
39
|
};
|
|
40
|
-
// launch_smoke
|
|
40
|
+
// launch_smoke: the cheapest always-valuable check.
|
|
41
41
|
{
|
|
42
42
|
const g = gateEnv('launch_smoke', 'guardrail');
|
|
43
43
|
if (g)
|
|
@@ -45,7 +45,7 @@ export function buildPlan(i) {
|
|
|
45
45
|
else
|
|
46
46
|
ready.push({ workflow: 'launch_smoke', budgetProfile: 'guardrail', requires: [] });
|
|
47
47
|
}
|
|
48
|
-
// visual_smoke
|
|
48
|
+
// visual_smoke: screenshot/landmark check for visual-only (map/canvas) screens.
|
|
49
49
|
{
|
|
50
50
|
const g = gateEnv('visual_smoke', 'login_smoke');
|
|
51
51
|
if (g)
|
|
@@ -53,7 +53,7 @@ export function buildPlan(i) {
|
|
|
53
53
|
else
|
|
54
54
|
ready.push({ workflow: 'visual_smoke', budgetProfile: 'login_smoke', requires: [] });
|
|
55
55
|
}
|
|
56
|
-
// login_smoke
|
|
56
|
+
// login_smoke: needs a credential fixture on top of the env gate.
|
|
57
57
|
{
|
|
58
58
|
const g = gateEnv('login_smoke', 'login_smoke');
|
|
59
59
|
if (g)
|
|
@@ -64,7 +64,7 @@ export function buildPlan(i) {
|
|
|
64
64
|
budgetProfile: 'login_smoke',
|
|
65
65
|
category: 'missing_test_data',
|
|
66
66
|
requiredState: 'a test account (credentials)',
|
|
67
|
-
recommendedSetup: 'Declare a fixture with a testAccount label (and provide
|
|
67
|
+
recommendedSetup: 'Declare a fixture with a testAccount label (and provide SWIPIUM_TEST_EMAIL/SWIPIUM_TEST_PASSWORD via env), or add it to .swipium/fixtures.json.',
|
|
68
68
|
});
|
|
69
69
|
}
|
|
70
70
|
else {
|
|
@@ -80,7 +80,7 @@ export function buildPlan(i) {
|
|
|
80
80
|
ready.push({ workflow: name, budgetProfile: 'full_smoke', requires: [] });
|
|
81
81
|
}
|
|
82
82
|
// Fixtures that declare an unmet requiredState surface as blocked workflows so "no saved
|
|
83
|
-
// flight to delete" reads as setup guidance, not a failure (
|
|
83
|
+
// flight to delete" reads as setup guidance, not a failure (qa_note semantics).
|
|
84
84
|
for (const f of i.fixtures) {
|
|
85
85
|
if (f.requiredState && !LOGIN_FIXTURE.test(f.name) && !f.testAccount) {
|
|
86
86
|
blocked.push({
|
|
@@ -92,7 +92,7 @@ export function buildPlan(i) {
|
|
|
92
92
|
});
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
|
-
// UNSAFE
|
|
95
|
+
// UNSAFE: destructive actions that Swipium will refuse by default.
|
|
96
96
|
if (isDebugRN(i.framework)) {
|
|
97
97
|
unsafe.push({
|
|
98
98
|
workflow: 'fresh_start',
|
|
@@ -115,7 +115,7 @@ export function buildPlan(i) {
|
|
|
115
115
|
'Destructive exploration requires dry_run_destructive first, then candidate-bound approval with disposable test state.',
|
|
116
116
|
];
|
|
117
117
|
if (i.auth.authedAtStart === false || i.auth.loginScreenSeen) {
|
|
118
|
-
notes.push('A login screen was observed
|
|
118
|
+
notes.push('A login screen was observed. Authenticated workflows will need credentials.');
|
|
119
119
|
}
|
|
120
120
|
for (const b of i.blockers)
|
|
121
121
|
notes.push(b);
|
package/dist/plan/plan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/plan/plan.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/plan/plan.ts"],"names":[],"mappings":"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"}
|
package/dist/prompts/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
// MCP prompts
|
|
1
|
+
// MCP prompts: the spec's third server capability (after tools +
|
|
2
2
|
// resources). Prompts are reusable workflow templates a prompt-capable client (e.g. Claude)
|
|
3
3
|
// can invoke by name, so common QA runs don't need a hand-written prompt each time.
|
|
4
4
|
//
|
|
5
5
|
// Design rules:
|
|
6
6
|
// - Prompts are THIN: they only orchestrate tools that already exist. No privileged logic
|
|
7
|
-
// lives here
|
|
7
|
+
// lives here. Consent stays server-side (security best-practices doc).
|
|
8
8
|
// - Clients that don't support prompts lose nothing: every step is "call <tool>", which the
|
|
9
9
|
// agent can do directly. Nothing is prompt-only.
|
|
10
10
|
//
|
|
@@ -18,20 +18,20 @@ export function registerPrompts(server) {
|
|
|
18
18
|
description: 'Verify Swipium can test a project and report what (if anything) is blocking.',
|
|
19
19
|
argsSchema: { projectRoot: z.string().optional().describe('Absolute path to the app project.') },
|
|
20
20
|
}, ({ projectRoot }) => userText(`Check whether Swipium can test ${projectRoot ? `the project at ${projectRoot}` : 'this project'}.\n\n` +
|
|
21
|
-
`1. Call qa_doctor to confirm the toolchain (
|
|
21
|
+
`1. Call qa_doctor to confirm the toolchain (Android SDK/emulator, and Xcode/simctl on macOS) and that the client is not stale.\n` +
|
|
22
22
|
`2. Call qa_start_session${projectRoot ? ` { projectRoot: "${projectRoot}" }` : ''}.\n` +
|
|
23
|
-
`3. Call
|
|
24
|
-
`4. Summarize:
|
|
23
|
+
`3. Call qa_resolve_target { sessionId, include: ["context", "plan"] }.\n` +
|
|
24
|
+
`4. Summarize: which workflows are READY, BLOCKED, or UNSAFE? List the exact missing items (APK, device, credentials) and the recommended budget profile. Do not start testing yet.`));
|
|
25
25
|
server.registerPrompt('swipium_guardrail_validation', {
|
|
26
26
|
title: 'Validate safety guardrails',
|
|
27
|
-
description: 'Confirm Swipium refuses an unsafe destructive action (bundle-loss) on a debug RN/Expo build.',
|
|
27
|
+
description: 'Confirm Swipium refuses an unsafe destructive action (bundle-loss) on a debug RN/Expo Android build.',
|
|
28
28
|
argsSchema: { projectRoot: z.string().optional() },
|
|
29
29
|
}, ({ projectRoot }) => userText(`Validate Swipium's destructive-action guardrails (do NOT override them).\n\n` +
|
|
30
30
|
`1. qa_start_session${projectRoot ? ` { projectRoot: "${projectRoot}", ` : ' { '}profile: "guardrail" }.\n` +
|
|
31
|
-
`2.
|
|
32
|
-
`3. qa_prepare_target to get the app running.\n` +
|
|
33
|
-
`4. Attempt qa_app_control { action: "fresh_start" } WITHOUT acknowledgeBundleRisk
|
|
34
|
-
`5. qa_report and confirm destructiveGuardrail shows the action was refused, not executed. Report PASS only if it was refused.`));
|
|
31
|
+
`2. qa_resolve_target { sessionId, include: ["plan"] } and confirm fresh_start appears under UNSAFE with reason bundle_cache_loss for a debug RN/Expo build.\n` +
|
|
32
|
+
`3. qa_prepare_target { sessionId } to get the app running on an Android Emulator (approve consent for boot/install if prompted).\n` +
|
|
33
|
+
`4. Attempt qa_app_control { sessionId, action: "fresh_start" } WITHOUT acknowledgeBundleRisk. Expect a refusal (failureCode BUNDLE_LOSS_REFUSED), not execution.\n` +
|
|
34
|
+
`5. qa_report { sessionId } and confirm destructiveGuardrail shows the action was refused, not executed. Report PASS only if it was refused.`));
|
|
35
35
|
server.registerPrompt('swipium_full_smoke', {
|
|
36
36
|
title: 'Run a full smoke test',
|
|
37
37
|
description: 'Plan, prepare, run the top ready workflows, and produce a report.',
|
|
@@ -41,11 +41,11 @@ export function registerPrompts(server) {
|
|
|
41
41
|
},
|
|
42
42
|
}, ({ projectRoot, appId }) => userText(`Run a full smoke test and produce a report a developer can act on.\n\n` +
|
|
43
43
|
`1. qa_start_session${projectRoot ? ` { projectRoot: "${projectRoot}", ` : ' { '}profile: "full_smoke", responseMode: "compact" }.\n` +
|
|
44
|
-
`2.
|
|
45
|
-
`3. qa_prepare_target${appId ? ` { appId: "${appId}"
|
|
44
|
+
`2. qa_resolve_target { sessionId, include: ["plan"] } and pick the READY workflows; respect anything listed as UNSAFE.\n` +
|
|
45
|
+
`3. qa_prepare_target { sessionId${appId ? `, appId: "${appId}"` : ''} } (Android) or qa_prepare_ios_target { sessionId${appId ? `, bundleId: "${appId}"` : ''} } (iOS) (approve consent for boot/install if prompted).\n` +
|
|
46
46
|
`4. For each ready workflow: drive it with qa_snapshot/qa_act, checking qa_check_health after key steps. Use qa_clear_overlay if a keyboard/dialog/banner blocks a target.\n` +
|
|
47
|
-
`5. Record each result with qa_note (pass/fail/blocked + category). For visual-only screens use
|
|
48
|
-
`6. qa_report at the end. Summarize release risk and the single most important next action.`));
|
|
47
|
+
`5. Record each result with qa_note (sessionId, workflow, outcome pass/fail/blocked + category). For visual-only screens use qa_visual mode:"assert".\n` +
|
|
48
|
+
`6. qa_report { sessionId } at the end. Summarize release risk and the single most important next action.`));
|
|
49
49
|
server.registerPrompt('swipium_bug_repro', {
|
|
50
50
|
title: 'Reproduce and document a bug',
|
|
51
51
|
description: 'Drive to a described bug, capture deterministic evidence, and file it as a structured outcome.',
|
|
@@ -54,20 +54,20 @@ export function registerPrompts(server) {
|
|
|
54
54
|
projectRoot: z.string().optional(),
|
|
55
55
|
},
|
|
56
56
|
}, ({ bug, projectRoot }) => userText(`Reproduce and document this bug with evidence:\n"${bug}"\n\n` +
|
|
57
|
-
`1. qa_start_session${projectRoot ? ` { projectRoot: "${projectRoot}", ` : ' { '}profile: "login_smoke" }, then
|
|
58
|
-
`2. qa_prepare_target, then navigate toward the reported bug with qa_snapshot/qa_act.\n` +
|
|
59
|
-
`3. At the failure, call qa_check_health (
|
|
60
|
-
`4. Record qa_note { outcome: "fail", category: "app_bug", reason, artifactUris }
|
|
61
|
-
`5. qa_report. Include exact reproduction steps and the evidence artifact URIs so the report stands alone without the transcript.`));
|
|
57
|
+
`1. qa_start_session${projectRoot ? ` { projectRoot: "${projectRoot}", ` : ' { '}profile: "login_smoke" }, then qa_resolve_target { sessionId, include: ["plan"] }.\n` +
|
|
58
|
+
`2. qa_prepare_target (Android) or qa_prepare_ios_target (iOS) { sessionId }, then navigate toward the reported bug with qa_snapshot/qa_act.\n` +
|
|
59
|
+
`3. At the failure, call qa_check_health { sessionId } (native vs app classification) and qa_screenshot { sessionId, reason } for evidence (on a visual-only iOS screen, qa_visual mode:"assert").\n` +
|
|
60
|
+
`4. Record qa_note { sessionId, workflow, outcome: "fail", category: "app_bug", reason, artifactUris }. Use "blocked"/"not_applicable" if you could not reach it, with missingPrecondition.\n` +
|
|
61
|
+
`5. qa_report { sessionId }. Include exact reproduction steps and the evidence artifact URIs so the report stands alone without the transcript.`));
|
|
62
62
|
server.registerPrompt('swipium_convert_run_to_flow', {
|
|
63
63
|
title: 'Convert a run into a reusable flow',
|
|
64
64
|
description: 'Draft a repeatable .swipium/flows/*.yaml from the steps you just performed, then validate it.',
|
|
65
65
|
argsSchema: { name: z.string().optional().describe('Flow name, e.g. login-smoke.') },
|
|
66
66
|
}, ({ name }) => userText(`Turn the workflow you just ran into a repeatable Swipium flow.\n\n` +
|
|
67
67
|
`1. Call qa_generate { sessionId, target: "flow", name: "${name ?? 'my-flow'}" } to draft the flow YAML from the recorded actions (or write it by hand with: name, appId, budgetProfile, fixtures, and a steps list).\n` +
|
|
68
|
-
`2. Use durable selectors: prefer text/id (e.g. tap: "Sign In") over @ref. Replace credentials with \${
|
|
69
|
-
`
|
|
68
|
+
`2. Use durable selectors: prefer text/id (e.g. tap: "Sign In") over @ref. Replace credentials with \${SWIPIUM_TEST_EMAIL}/\${SWIPIUM_TEST_PASSWORD} variables. Never inline secrets.\n` +
|
|
69
|
+
` Common steps: prepareTarget, tap, tapAt, inputText, assertVisible, assertNotVisible, swipe, scrollTo, press, openUrl, wait, clearOverlay (full list: docs/tools.md#flow-steps).\n` +
|
|
70
70
|
`3. Validate it with qa_flow_check { flowYaml: "<your yaml>" } and fix any reported errors (qa_generate also reports a durability grade + brittle steps).\n` +
|
|
71
|
-
`4. Save it under .swipium/flows/${name ?? 'my-flow'}.yaml (qa_generate save:true does this) so
|
|
71
|
+
`4. Save it under .swipium/flows/${name ?? 'my-flow'}.yaml (qa_generate save:true does this) so the workflow plan lists it and qa_flow_run can replay it.`));
|
|
72
72
|
}
|
|
73
73
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"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"}
|