swipium 1.5.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +171 -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,174 +0,0 @@
|
|
|
1
|
-
// qa_permissions (PHASE3-PLAN §4.2) — list / grant / revoke Android runtime permissions without
|
|
2
|
-
// raw adb. grant is low-risk (commonly used to pre-approve and skip a dialog) and only logged;
|
|
3
|
-
// revoke can break app state, so it is consent-gated. Every mutation is recorded as an
|
|
4
|
-
// environment change for qa_report.
|
|
5
|
-
import { z } from 'zod';
|
|
6
|
-
import { qaOk, qaError } from '../lib/result.js';
|
|
7
|
-
import { requireConsent, consumeConsent } from '../consent/consent.js';
|
|
8
|
-
import { getDriver } from '../session/attach.js';
|
|
9
|
-
import { listRuntimePermissions, grantPermission, revokePermission } from '../lib/device.js';
|
|
10
|
-
export function registerPermissions(server, sessions) {
|
|
11
|
-
server.registerTool('qa_permissions', {
|
|
12
|
-
title: 'App permissions',
|
|
13
|
-
description: "Inspect or change a package's Android runtime permissions. action: list (granted/denied), grant (pre-approve to skip a dialog — logged), revoke (consent-gated, can break app state — logged). `package` defaults to the session's appId; `permission` is a full android.permission.* name (e.g. android.permission.ACCESS_FINE_LOCATION).",
|
|
14
|
-
inputSchema: {
|
|
15
|
-
sessionId: z.string(),
|
|
16
|
-
action: z.enum(['list', 'grant', 'revoke']),
|
|
17
|
-
package: z.string().optional().describe('Target package (default: the session appId).'),
|
|
18
|
-
permission: z.string().optional().describe('Full permission name, required for grant/revoke.'),
|
|
19
|
-
consentId: z.string().optional(),
|
|
20
|
-
approve: z.boolean().optional(),
|
|
21
|
-
},
|
|
22
|
-
}, async ({ sessionId, action, package: pkgArg, permission, consentId, approve }) => {
|
|
23
|
-
const session = sessions.get(sessionId);
|
|
24
|
-
const { driver } = session ? await getDriver(session) : { driver: undefined };
|
|
25
|
-
const serial = driver?.currentDevice();
|
|
26
|
-
if (!session || !driver || !serial) {
|
|
27
|
-
return qaError({
|
|
28
|
-
what: 'No device attached to this session',
|
|
29
|
-
changedState: false,
|
|
30
|
-
retrySafe: true,
|
|
31
|
-
nextSteps: ['Call qa_prepare_target first.'],
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
const pkg = pkgArg ?? session.appId;
|
|
35
|
-
if (!pkg) {
|
|
36
|
-
return qaError({
|
|
37
|
-
what: 'No package given and the session has no appId',
|
|
38
|
-
changedState: false,
|
|
39
|
-
retrySafe: true,
|
|
40
|
-
nextSteps: ['Pass package, or qa_prepare_target to set the appId.'],
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
if (action === 'list') {
|
|
44
|
-
const perms = await listRuntimePermissions(serial, pkg);
|
|
45
|
-
return qaOk({ package: pkg, ...perms }, `${pkg}: ${perms.granted.length} granted, ${perms.denied.length} denied\n granted: ${perms.granted.join(', ') || '—'}\n denied: ${perms.denied.join(', ') || '—'}`);
|
|
46
|
-
}
|
|
47
|
-
if (!permission) {
|
|
48
|
-
return qaError({
|
|
49
|
-
what: `${action} requires a permission name`,
|
|
50
|
-
changedState: false,
|
|
51
|
-
retrySafe: true,
|
|
52
|
-
nextSteps: ['Pass permission="android.permission.…" (qa_permissions list to see them).'],
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
if (action === 'revoke') {
|
|
56
|
-
// Revoking can crash/break the app — gate behind consent.
|
|
57
|
-
const gate = consumeConsent(consentId, approve, { action: 'permission_revoke', affects: { package: pkg, permission } });
|
|
58
|
-
if (!gate.approved) {
|
|
59
|
-
sessions.recordMutation(session, {
|
|
60
|
-
tool: 'qa_permissions',
|
|
61
|
-
action: 'permission_revoke',
|
|
62
|
-
risk: 'medium',
|
|
63
|
-
target: { package: pkg, permission },
|
|
64
|
-
consent: { required: true, approved: false },
|
|
65
|
-
status: 'requested',
|
|
66
|
-
});
|
|
67
|
-
return requireConsent({
|
|
68
|
-
action: 'permission_revoke',
|
|
69
|
-
risk: 'medium',
|
|
70
|
-
exactCommand: `adb -s ${serial} shell pm revoke ${pkg} ${permission}`,
|
|
71
|
-
affects: { package: pkg, permission },
|
|
72
|
-
explain: `Revoke ${permission} from ${pkg}? This can change app behavior or crash a poorly-guarded app.`,
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
sessions.recordMutation(session, {
|
|
76
|
-
tool: 'qa_permissions',
|
|
77
|
-
action: 'permission_revoke',
|
|
78
|
-
risk: 'medium',
|
|
79
|
-
target: { package: pkg, permission },
|
|
80
|
-
consent: { required: true, consentId, approved: true },
|
|
81
|
-
status: 'approved',
|
|
82
|
-
});
|
|
83
|
-
try {
|
|
84
|
-
await revokePermission(serial, pkg, permission);
|
|
85
|
-
}
|
|
86
|
-
catch (e) {
|
|
87
|
-
sessions.recordMutation(session, {
|
|
88
|
-
tool: 'qa_permissions',
|
|
89
|
-
action: 'permission_revoke',
|
|
90
|
-
risk: 'medium',
|
|
91
|
-
target: { package: pkg, permission },
|
|
92
|
-
consent: { required: true, consentId, approved: true },
|
|
93
|
-
status: 'blocked',
|
|
94
|
-
detail: String(e),
|
|
95
|
-
});
|
|
96
|
-
return qaError({
|
|
97
|
-
what: `revoke failed: ${String(e)}`,
|
|
98
|
-
changedState: false,
|
|
99
|
-
retrySafe: true,
|
|
100
|
-
nextSteps: ['Check the permission name; some are not revocable.'],
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
sessions.addEnvChange(session, `permission revoke ${permission} from ${pkg}`);
|
|
104
|
-
sessions.recordMutation(session, {
|
|
105
|
-
tool: 'qa_permissions',
|
|
106
|
-
action: 'permission_revoke',
|
|
107
|
-
risk: 'medium',
|
|
108
|
-
target: { package: pkg, permission },
|
|
109
|
-
consent: { required: true, consentId, approved: true },
|
|
110
|
-
status: 'executed',
|
|
111
|
-
});
|
|
112
|
-
return qaOk({ package: pkg, permission, action }, `revoked ${permission} from ${pkg}`);
|
|
113
|
-
}
|
|
114
|
-
// grant — low risk, but still a state mutation (it can hide a permission-dialog bug), so
|
|
115
|
-
// it is consent-gated (low) and always reported, never silent.
|
|
116
|
-
const grantGate = consumeConsent(consentId, approve, { action: 'permission_grant', affects: { package: pkg, permission } });
|
|
117
|
-
if (!grantGate.approved) {
|
|
118
|
-
sessions.recordMutation(session, {
|
|
119
|
-
tool: 'qa_permissions',
|
|
120
|
-
action: 'permission_grant',
|
|
121
|
-
risk: 'low',
|
|
122
|
-
target: { package: pkg, permission },
|
|
123
|
-
consent: { required: true, approved: false },
|
|
124
|
-
status: 'requested',
|
|
125
|
-
});
|
|
126
|
-
return requireConsent({
|
|
127
|
-
action: 'permission_grant',
|
|
128
|
-
risk: 'low',
|
|
129
|
-
exactCommand: `adb -s ${serial} shell pm grant ${pkg} ${permission}`,
|
|
130
|
-
affects: { package: pkg, permission },
|
|
131
|
-
explain: `Pre-grant ${permission} to ${pkg}? This skips the runtime permission dialog — convenient, but it can mask a permission-prompt bug.`,
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
sessions.recordMutation(session, {
|
|
135
|
-
tool: 'qa_permissions',
|
|
136
|
-
action: 'permission_grant',
|
|
137
|
-
risk: 'low',
|
|
138
|
-
target: { package: pkg, permission },
|
|
139
|
-
consent: { required: true, consentId, approved: true },
|
|
140
|
-
status: 'approved',
|
|
141
|
-
});
|
|
142
|
-
try {
|
|
143
|
-
await grantPermission(serial, pkg, permission);
|
|
144
|
-
}
|
|
145
|
-
catch (e) {
|
|
146
|
-
sessions.recordMutation(session, {
|
|
147
|
-
tool: 'qa_permissions',
|
|
148
|
-
action: 'permission_grant',
|
|
149
|
-
risk: 'low',
|
|
150
|
-
target: { package: pkg, permission },
|
|
151
|
-
consent: { required: true, consentId, approved: true },
|
|
152
|
-
status: 'blocked',
|
|
153
|
-
detail: String(e),
|
|
154
|
-
});
|
|
155
|
-
return qaError({
|
|
156
|
-
what: `grant failed: ${String(e)}`,
|
|
157
|
-
changedState: false,
|
|
158
|
-
retrySafe: true,
|
|
159
|
-
nextSteps: ['Check the permission name; only runtime permissions are grantable.'],
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
sessions.addEnvChange(session, `permission grant ${permission} to ${pkg}`);
|
|
163
|
-
sessions.recordMutation(session, {
|
|
164
|
-
tool: 'qa_permissions',
|
|
165
|
-
action: 'permission_grant',
|
|
166
|
-
risk: 'low',
|
|
167
|
-
target: { package: pkg, permission },
|
|
168
|
-
consent: { required: true, consentId, approved: true },
|
|
169
|
-
status: 'executed',
|
|
170
|
-
});
|
|
171
|
-
return qaOk({ package: pkg, permission, action }, `granted ${permission} to ${pkg}`);
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
//# sourceMappingURL=permissions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/tools/permissions.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/plan.js
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
// qa_plan (PHASE3-PLAN §3.2) — propose a safe test plan instead of making the agent guess.
|
|
2
|
-
// Synthesizes detectContext() + the session's declared fixtures / observed auth / prepared
|
|
3
|
-
// appId into READY / BLOCKED / UNSAFE workflows. Pure planning logic lives in src/plan/plan.ts.
|
|
4
|
-
import { z } from 'zod';
|
|
5
|
-
import { qaOk, qaError } from '../lib/result.js';
|
|
6
|
-
import { detectContext } from '../context/detect.js';
|
|
7
|
-
import { buildPlan } from '../plan/plan.js';
|
|
8
|
-
import { listFlowFiles } from '../flows/discover.js';
|
|
9
|
-
export function registerPlan(server, sessions) {
|
|
10
|
-
server.registerTool('qa_plan', {
|
|
11
|
-
title: 'Plan what to test',
|
|
12
|
-
description: 'Propose a safe test plan for the current session instead of guessing. Returns READY workflows (with budget profile + satisfied preconditions), BLOCKED workflows (with a category — missing_device/missing_artifact/missing_test_data/missing_toolchain — required state, and how to unblock), and UNSAFE workflows (with a reason, e.g. bundle_cache_loss for fresh_start on a debug RN/Expo build). Call this first to decide what to run. Reads detected context + declared fixtures + observed auth; does not touch the device.',
|
|
13
|
-
inputSchema: {
|
|
14
|
-
sessionId: z.string().describe('A session from qa_start_session (its fixtures/auth/root inform the plan).'),
|
|
15
|
-
},
|
|
16
|
-
}, async ({ sessionId }) => {
|
|
17
|
-
const session = sessions.get(sessionId);
|
|
18
|
-
if (!session) {
|
|
19
|
-
return qaError({
|
|
20
|
-
what: 'No such session',
|
|
21
|
-
changedState: false,
|
|
22
|
-
retrySafe: true,
|
|
23
|
-
nextSteps: ['Call qa_start_session first, then qa_plan with its sessionId.'],
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
const ctx = await detectContext(session.root);
|
|
27
|
-
const plan = buildPlan({
|
|
28
|
-
framework: ctx.framework,
|
|
29
|
-
hasDevice: ctx.devices.androidOnline.length > 0 || ctx.devices.avds.length > 0,
|
|
30
|
-
hasApk: ctx.artifacts.apks.length > 0 || ctx.artifacts.ipas.length > 0 || ctx.artifacts.appBundles.length > 0,
|
|
31
|
-
appPrepared: !!session.appId,
|
|
32
|
-
fixtures: session.fixtures,
|
|
33
|
-
auth: session.auth,
|
|
34
|
-
blockers: ctx.blockers,
|
|
35
|
-
flows: listFlowFiles(session.root).map((f) => f.name),
|
|
36
|
-
});
|
|
37
|
-
const line = (s) => ` - ${s}`;
|
|
38
|
-
const summary = `Plan for session ${session.id} (framework=${ctx.framework})\n` +
|
|
39
|
-
`READY (${plan.ready.length}):\n` +
|
|
40
|
-
(plan.ready
|
|
41
|
-
.map((w) => line(`${w.workflow} [${w.budgetProfile}]${w.requires.length ? ` needs ${w.requires.join(', ')}` : ''}`))
|
|
42
|
-
.join('\n') || ' (none)') +
|
|
43
|
-
`\nBLOCKED (${plan.blocked.length}):\n` +
|
|
44
|
-
(plan.blocked.map((w) => line(`${w.workflow}: ${w.category} — ${w.requiredState} → ${w.recommendedSetup}`)).join('\n') ||
|
|
45
|
-
' (none)') +
|
|
46
|
-
`\nUNSAFE (${plan.unsafe.length}):\n` +
|
|
47
|
-
(plan.unsafe.map((w) => line(`${w.workflow}: ${w.reason} — ${w.detail}`)).join('\n') || ' (none)') +
|
|
48
|
-
(plan.notes.length ? `\nnotes:\n` + plan.notes.map(line).join('\n') : '');
|
|
49
|
-
return qaOk({ ...plan, framework: ctx.framework }, summary);
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
//# sourceMappingURL=plan.js.map
|
package/dist/tools/plan.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/tools/plan.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/screenInfo.js
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
// qa_screen_info — device + screen metadata for coordinate-driven (visual-fallback) work,
|
|
2
|
-
// so the agent doesn't shell out to `adb shell wm size/density` or measure screenshots.
|
|
3
|
-
import { z } from 'zod';
|
|
4
|
-
import { qaOk, qaError } from '../lib/result.js';
|
|
5
|
-
import { getOrientation } from '../lib/device.js';
|
|
6
|
-
import { getDriver } from '../session/attach.js';
|
|
7
|
-
export function registerScreenInfo(server, sessions) {
|
|
8
|
-
server.registerTool('qa_screen_info', {
|
|
9
|
-
title: 'Screen info',
|
|
10
|
-
description: 'Device + screen metadata for coordinate work: width/height (px), density (dpi), session mode (structured | visual-fallback), the latest screenshot URI, and budget counters. Use this in visual-fallback mode to place coordinate taps instead of shelling out to wm size/density.',
|
|
11
|
-
inputSchema: { sessionId: z.string() },
|
|
12
|
-
}, async ({ sessionId }) => {
|
|
13
|
-
const session = sessions.get(sessionId);
|
|
14
|
-
const { driver } = session ? await getDriver(session) : { driver: undefined };
|
|
15
|
-
if (!session || !driver) {
|
|
16
|
-
return qaError({
|
|
17
|
-
what: 'No device attached to this session',
|
|
18
|
-
changedState: false,
|
|
19
|
-
retrySafe: true,
|
|
20
|
-
nextSteps: ['Call qa_prepare_target first.'],
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
const serial = driver.currentDevice();
|
|
24
|
-
const [size, density, orient] = await Promise.all([
|
|
25
|
-
driver.screenSize(),
|
|
26
|
-
driver.screenDensity(),
|
|
27
|
-
serial ? getOrientation(serial).catch(() => null) : Promise.resolve(null),
|
|
28
|
-
]);
|
|
29
|
-
const orientation = orient ? (orient.rotation === 1 || orient.rotation === 3 ? 'landscape' : 'portrait') : 'unknown';
|
|
30
|
-
const lastShot = [...session.artifacts].reverse().find((a) => a.kind === 'screenshot');
|
|
31
|
-
// Coordinate landmarks (P1.7) for visual-fallback taps — so the agent places taps from
|
|
32
|
-
// named anchors instead of guessing pixels off a screenshot.
|
|
33
|
-
let landmarks;
|
|
34
|
-
let bands;
|
|
35
|
-
if (size) {
|
|
36
|
-
const w = size.width;
|
|
37
|
-
const h = size.height;
|
|
38
|
-
const X = (fx) => Math.round(w * fx);
|
|
39
|
-
const Y = (fy) => Math.round(h * fy);
|
|
40
|
-
landmarks = {
|
|
41
|
-
topNavCenter: [X(0.5), Y(0.06)],
|
|
42
|
-
bottomNavCenter: [X(0.5), Y(0.96)],
|
|
43
|
-
center: [X(0.5), Y(0.5)],
|
|
44
|
-
topLeft: [X(0.08), Y(0.06)],
|
|
45
|
-
topRight: [X(0.92), Y(0.06)],
|
|
46
|
-
bottomLeft: [X(0.08), Y(0.96)],
|
|
47
|
-
bottomRight: [X(0.92), Y(0.96)],
|
|
48
|
-
primaryCtaArea: [X(0.5), Y(0.88)], // most apps put the main CTA in the bottom band
|
|
49
|
-
};
|
|
50
|
-
bands = {
|
|
51
|
-
topNav: { yFrom: 0, yTo: Y(0.12) },
|
|
52
|
-
content: { yFrom: Y(0.12), yTo: Y(0.85) },
|
|
53
|
-
bottomNav: { yFrom: Y(0.9), yTo: h },
|
|
54
|
-
ctaBand: { yFrom: Y(0.78), yTo: Y(0.95) },
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
return qaOk({
|
|
58
|
-
device: session.device ?? null,
|
|
59
|
-
screen: size ? { width: size.width, height: size.height, density } : null,
|
|
60
|
-
orientation,
|
|
61
|
-
coordinateNote: 'landmarks/bands are DEVICE pixels (origin top-left) — pass directly as qa_act {x,y}. For screenshot-space hits (qa_visual find_image) convert with coordinateSpace.scale.',
|
|
62
|
-
mode: session.mode,
|
|
63
|
-
headless: session.headless ?? null,
|
|
64
|
-
latestScreenshot: lastShot?.uri ?? null,
|
|
65
|
-
landmarks,
|
|
66
|
-
bands,
|
|
67
|
-
counters: session.counters,
|
|
68
|
-
budget: session.budget,
|
|
69
|
-
}, `device=${session.device} screen=${size ? `${size.width}x${size.height}@${density ?? '?'}dpi` : 'unknown'} mode=${session.mode}` +
|
|
70
|
-
(landmarks
|
|
71
|
-
? `\nlandmarks: center=${landmarks.center} bottomNav=${landmarks.bottomNavCenter} cta=${landmarks.primaryCtaArea}`
|
|
72
|
-
: '') +
|
|
73
|
-
(lastShot ? `\nlatest screenshot: ${lastShot.uri}` : '\n(no screenshot yet — call qa_screenshot)'));
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
//# sourceMappingURL=screenInfo.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"screenInfo.js","sourceRoot":"","sources":["../../src/tools/screenInfo.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/seed.js
DELETED
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
// qa_seed (PHASE3-PLAN §4.4 / roadmap §9) — turn a declared precondition into one Swipium can
|
|
2
|
-
// actually create, OPT-IN and consent-gated. A fixture may carry a `seed` spec: a deep link, a
|
|
3
|
-
// project-root script, or an API call. Every seed is a mutation → explicit consent, exact action
|
|
4
|
-
// shown. The raw execution lives in src/flows/seedExec.ts (shared with the flow `seed` step). If
|
|
5
|
-
// seeding fails it is reported as a SETUP failure (environment bucket), never an app bug.
|
|
6
|
-
import { z } from 'zod';
|
|
7
|
-
import { qaOk, qaError } from '../lib/result.js';
|
|
8
|
-
import { qaFail } from '../oracle/failures.js';
|
|
9
|
-
import { requireConsent, consumeConsent } from '../consent/consent.js';
|
|
10
|
-
import { executeSeed, seedExactCommand, seedGitScopeViolation } from '../flows/seedExec.js';
|
|
11
|
-
import { getDriver } from '../session/attach.js';
|
|
12
|
-
export function registerSeed(server, sessions) {
|
|
13
|
-
server.registerTool('qa_seed', {
|
|
14
|
-
title: 'Seed a precondition',
|
|
15
|
-
description: 'Create a declared precondition (opt-in, consent-gated) so a blocked workflow can run. The named fixture must declare a `seed`: deeplink (open a setup deep link), script (argv array run under the project root), or api (HTTP call). Every seed is a mutation and requires consent showing the exact action. If seeding fails it is reported as a SETUP failure, not an app bug.',
|
|
16
|
-
inputSchema: {
|
|
17
|
-
sessionId: z.string(),
|
|
18
|
-
fixture: z.string().describe('Name of a declared fixture that has a `seed` spec.'),
|
|
19
|
-
consentId: z.string().optional(),
|
|
20
|
-
approve: z.boolean().optional(),
|
|
21
|
-
},
|
|
22
|
-
}, async ({ sessionId, fixture: fixtureName, consentId, approve }) => {
|
|
23
|
-
const session = sessions.get(sessionId);
|
|
24
|
-
if (!session) {
|
|
25
|
-
return qaError({
|
|
26
|
-
what: `Unknown sessionId ${sessionId}`,
|
|
27
|
-
changedState: false,
|
|
28
|
-
retrySafe: true,
|
|
29
|
-
nextSteps: ['Call qa_start_session first.'],
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
const fixture = session.fixtures.find((f) => f.name === fixtureName);
|
|
33
|
-
if (!fixture) {
|
|
34
|
-
return qaError({
|
|
35
|
-
what: `No declared fixture "${fixtureName}"`,
|
|
36
|
-
changedState: false,
|
|
37
|
-
retrySafe: true,
|
|
38
|
-
nextSteps: ['Declare it in .swipium/fixtures.json or qa_start_session { fixtures }.'],
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
const seed = fixture.seed;
|
|
42
|
-
if (!seed) {
|
|
43
|
-
return qaError({
|
|
44
|
-
what: `Fixture "${fixtureName}" has no seed spec`,
|
|
45
|
-
changedState: false,
|
|
46
|
-
retrySafe: true,
|
|
47
|
-
nextSteps: ['Add a seed: { type: "deeplink"|"script"|"api", … } to the fixture to make it creatable.'],
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
const git = seedGitScopeViolation(seed);
|
|
51
|
-
if (git) {
|
|
52
|
-
return qaFail('GIT_SCOPE_FORBIDDEN', {
|
|
53
|
-
what: `Fixture "${fixtureName}" seed command is refused because Git is outside Swipium's QA scope: ${git}`,
|
|
54
|
-
changedState: false,
|
|
55
|
-
extra: { fixture: fixtureName, command: git },
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
// Consent — exact action shown, scoped to this fixture + seed type.
|
|
59
|
-
const affects = { fixture: fixtureName, type: seed.type };
|
|
60
|
-
const risk = seed.type === 'script' ? 'high' : seed.type === 'api' ? 'medium' : 'low';
|
|
61
|
-
const gate = consumeConsent(consentId, approve, { action: 'seed_state', affects });
|
|
62
|
-
if (!gate.approved) {
|
|
63
|
-
sessions.recordMutation(session, {
|
|
64
|
-
tool: 'qa_seed',
|
|
65
|
-
action: 'seed_state',
|
|
66
|
-
risk,
|
|
67
|
-
target: affects,
|
|
68
|
-
consent: { required: true, approved: false },
|
|
69
|
-
status: 'requested',
|
|
70
|
-
});
|
|
71
|
-
return requireConsent({
|
|
72
|
-
action: 'seed_state',
|
|
73
|
-
risk,
|
|
74
|
-
exactCommand: seedExactCommand(seed),
|
|
75
|
-
affects,
|
|
76
|
-
explain: `Seed precondition "${fixtureName}" via ${seed.type}? This mutates state${seed.type === 'script' ? ' by running a command under the project root' : seed.type === 'api' ? ' by calling an external API' : ' by opening a deep link'}.`,
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
sessions.recordMutation(session, {
|
|
80
|
-
tool: 'qa_seed',
|
|
81
|
-
action: 'seed_state',
|
|
82
|
-
risk,
|
|
83
|
-
target: affects,
|
|
84
|
-
consent: { required: true, consentId, approved: true },
|
|
85
|
-
status: 'approved',
|
|
86
|
-
});
|
|
87
|
-
const { driver } = await getDriver(session);
|
|
88
|
-
const result = await executeSeed(sessions, session, driver, fixtureName, seed);
|
|
89
|
-
if (!result.ok) {
|
|
90
|
-
// Record as a SETUP failure (not an app bug) so the report can't mislabel it.
|
|
91
|
-
sessions.addNote(session, {
|
|
92
|
-
at: Date.now(),
|
|
93
|
-
workflow: `seed:${fixtureName}`,
|
|
94
|
-
outcome: 'blocked',
|
|
95
|
-
category: 'missing_test_data',
|
|
96
|
-
reason: `seed failed: ${result.detail}`,
|
|
97
|
-
requiredState: fixture.requiredState,
|
|
98
|
-
recommendedSetup: fixture.recommendedSetup,
|
|
99
|
-
});
|
|
100
|
-
sessions.recordMutation(session, {
|
|
101
|
-
tool: 'qa_seed',
|
|
102
|
-
action: 'seed_state',
|
|
103
|
-
risk,
|
|
104
|
-
target: affects,
|
|
105
|
-
consent: { required: true, consentId, approved: true },
|
|
106
|
-
status: 'blocked',
|
|
107
|
-
detail: result.detail,
|
|
108
|
-
});
|
|
109
|
-
return qaFail('SEED_FAILED', {
|
|
110
|
-
what: `Seeding "${fixtureName}" failed: ${result.detail}`,
|
|
111
|
-
changedState: true,
|
|
112
|
-
extra: { fixture: fixtureName, type: seed.type },
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
sessions.addNote(session, {
|
|
116
|
-
at: Date.now(),
|
|
117
|
-
workflow: `seed:${fixtureName}`,
|
|
118
|
-
outcome: 'pass',
|
|
119
|
-
reason: `precondition created via ${seed.type}`,
|
|
120
|
-
});
|
|
121
|
-
sessions.recordMutation(session, {
|
|
122
|
-
tool: 'qa_seed',
|
|
123
|
-
action: 'seed_state',
|
|
124
|
-
risk,
|
|
125
|
-
target: affects,
|
|
126
|
-
consent: { required: true, consentId, approved: true },
|
|
127
|
-
status: 'executed',
|
|
128
|
-
detail: result.warnings.join(' ') || undefined,
|
|
129
|
-
});
|
|
130
|
-
return qaOk({ fixture: fixtureName, type: seed.type, seeded: true, warnings: result.warnings }, `✅ seeded "${fixtureName}" via ${seed.type} — the precondition should now be met. Re-run the workflow.${result.warnings.length ? `\n⚠ ${result.warnings.join(' ')}` : ''}`);
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
//# sourceMappingURL=seed.js.map
|
package/dist/tools/seed.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/tools/seed.ts"],"names":[],"mappings":"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"}
|