swipium 1.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/LICENSE +21 -0
- package/README.md +295 -0
- package/dist/appMap/automationLink.js +74 -0
- package/dist/appMap/automationLink.js.map +1 -0
- package/dist/appMap/build.js +193 -0
- package/dist/appMap/build.js.map +1 -0
- package/dist/appMap/codeIndex.js +73 -0
- package/dist/appMap/codeIndex.js.map +1 -0
- package/dist/appMap/featureModel.js +83 -0
- package/dist/appMap/featureModel.js.map +1 -0
- package/dist/appMap/firstRunApply.js +131 -0
- package/dist/appMap/firstRunApply.js.map +1 -0
- package/dist/appMap/fsWalk.js +75 -0
- package/dist/appMap/fsWalk.js.map +1 -0
- package/dist/appMap/issues.js +227 -0
- package/dist/appMap/issues.js.map +1 -0
- package/dist/appMap/migrations.js +87 -0
- package/dist/appMap/migrations.js.map +1 -0
- package/dist/appMap/prelaunch.js +66 -0
- package/dist/appMap/prelaunch.js.map +1 -0
- package/dist/appMap/projectRegistry.js +70 -0
- package/dist/appMap/projectRegistry.js.map +1 -0
- package/dist/appMap/provenance.js +52 -0
- package/dist/appMap/provenance.js.map +1 -0
- package/dist/appMap/query.js +118 -0
- package/dist/appMap/query.js.map +1 -0
- package/dist/appMap/runtimeMerge.js +207 -0
- package/dist/appMap/runtimeMerge.js.map +1 -0
- package/dist/appMap/schema.js +65 -0
- package/dist/appMap/schema.js.map +1 -0
- package/dist/appMap/screenMatch.js +75 -0
- package/dist/appMap/screenMatch.js.map +1 -0
- package/dist/appMap/staticScan.js +614 -0
- package/dist/appMap/staticScan.js.map +1 -0
- package/dist/appMap/store.js +173 -0
- package/dist/appMap/store.js.map +1 -0
- package/dist/appMap/tsAstScan.js +184 -0
- package/dist/appMap/tsAstScan.js.map +1 -0
- package/dist/artifacts/bundletool.js +199 -0
- package/dist/artifacts/bundletool.js.map +1 -0
- package/dist/artifacts/resolve.js +388 -0
- package/dist/artifacts/resolve.js.map +1 -0
- package/dist/automationGen/appiumModel.js +129 -0
- package/dist/automationGen/appiumModel.js.map +1 -0
- package/dist/automationGen/ciEmitter.js +80 -0
- package/dist/automationGen/ciEmitter.js.map +1 -0
- package/dist/automationGen/jsEmitter.js +440 -0
- package/dist/automationGen/jsEmitter.js.map +1 -0
- package/dist/automationGen/packagePatch.js +56 -0
- package/dist/automationGen/packagePatch.js.map +1 -0
- package/dist/automationGen/projectProfile.js +317 -0
- package/dist/automationGen/projectProfile.js.map +1 -0
- package/dist/automationGen/pythonEmitter.js +386 -0
- package/dist/automationGen/pythonEmitter.js.map +1 -0
- package/dist/automationGen/readmeEmitter.js +66 -0
- package/dist/automationGen/readmeEmitter.js.map +1 -0
- package/dist/automationGen/suitePlan.js +94 -0
- package/dist/automationGen/suitePlan.js.map +1 -0
- package/dist/automationGen/validation.js +150 -0
- package/dist/automationGen/validation.js.map +1 -0
- package/dist/build/parseBuildLog.js +119 -0
- package/dist/build/parseBuildLog.js.map +1 -0
- package/dist/build/plan.js +150 -0
- package/dist/build/plan.js.map +1 -0
- package/dist/ci/preflight.js +85 -0
- package/dist/ci/preflight.js.map +1 -0
- package/dist/cli/init.js +105 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/scan.js +85 -0
- package/dist/cli/scan.js.map +1 -0
- package/dist/cli/suite.js +85 -0
- package/dist/cli/suite.js.map +1 -0
- package/dist/cli/verify.js +62 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/consent/consent.js +43 -0
- package/dist/consent/consent.js.map +1 -0
- package/dist/context/detect.js +156 -0
- package/dist/context/detect.js.map +1 -0
- package/dist/context/findApps.js +198 -0
- package/dist/context/findApps.js.map +1 -0
- package/dist/context/projectRoot.js +41 -0
- package/dist/context/projectRoot.js.map +1 -0
- package/dist/context/scan.js +167 -0
- package/dist/context/scan.js.map +1 -0
- package/dist/core/target.js +115 -0
- package/dist/core/target.js.map +1 -0
- package/dist/core/targetPlan.js +140 -0
- package/dist/core/targetPlan.js.map +1 -0
- package/dist/drivers/DirectDriver.js +228 -0
- package/dist/drivers/DirectDriver.js.map +1 -0
- package/dist/drivers/Driver.js +4 -0
- package/dist/drivers/Driver.js.map +1 -0
- package/dist/drivers/SimctlDriver.js +127 -0
- package/dist/drivers/SimctlDriver.js.map +1 -0
- package/dist/drivers/WdaDriver.js +250 -0
- package/dist/drivers/WdaDriver.js.map +1 -0
- package/dist/explore/candidates.js +93 -0
- package/dist/explore/candidates.js.map +1 -0
- package/dist/explore/graph.js +116 -0
- package/dist/explore/graph.js.map +1 -0
- package/dist/explore/memory.js +35 -0
- package/dist/explore/memory.js.map +1 -0
- package/dist/explore/planner.js +105 -0
- package/dist/explore/planner.js.map +1 -0
- package/dist/explore/policy.js +85 -0
- package/dist/explore/policy.js.map +1 -0
- package/dist/explore/runner.js +475 -0
- package/dist/explore/runner.js.map +1 -0
- package/dist/explore/signatures.js +35 -0
- package/dist/explore/signatures.js.map +1 -0
- package/dist/explore/suite.js +55 -0
- package/dist/explore/suite.js.map +1 -0
- package/dist/featureTesting/executionBootstrap.js +140 -0
- package/dist/featureTesting/executionBootstrap.js.map +1 -0
- package/dist/firstRun/authStateMachine.js +83 -0
- package/dist/firstRun/authStateMachine.js.map +1 -0
- package/dist/firstRun/classifyScreen.js +201 -0
- package/dist/firstRun/classifyScreen.js.map +1 -0
- package/dist/firstRun/firstRunPlanner.js +207 -0
- package/dist/firstRun/firstRunPlanner.js.map +1 -0
- package/dist/firstRun/firstRunRunner.js +331 -0
- package/dist/firstRun/firstRunRunner.js.map +1 -0
- package/dist/firstRun/generatedDataPolicy.js +215 -0
- package/dist/firstRun/generatedDataPolicy.js.map +1 -0
- package/dist/firstRun/inputPlanner.js +67 -0
- package/dist/firstRun/inputPlanner.js.map +1 -0
- package/dist/firstRun/onboardingStateMachine.js +46 -0
- package/dist/firstRun/onboardingStateMachine.js.map +1 -0
- package/dist/firstRun/paywallPolicy.js +54 -0
- package/dist/firstRun/paywallPolicy.js.map +1 -0
- package/dist/firstRun/types.js +7 -0
- package/dist/firstRun/types.js.map +1 -0
- package/dist/fixtures/catalog.js +131 -0
- package/dist/fixtures/catalog.js.map +1 -0
- package/dist/flows/discover.js +18 -0
- package/dist/flows/discover.js.map +1 -0
- package/dist/flows/generate.js +211 -0
- package/dist/flows/generate.js.map +1 -0
- package/dist/flows/lint.js +97 -0
- package/dist/flows/lint.js.map +1 -0
- package/dist/flows/pack.js +68 -0
- package/dist/flows/pack.js.map +1 -0
- package/dist/flows/run.js +738 -0
- package/dist/flows/run.js.map +1 -0
- package/dist/flows/schema.js +240 -0
- package/dist/flows/schema.js.map +1 -0
- package/dist/flows/seedExec.js +108 -0
- package/dist/flows/seedExec.js.map +1 -0
- package/dist/flows/templates.js +155 -0
- package/dist/flows/templates.js.map +1 -0
- package/dist/flows/waitGuards.js +12 -0
- package/dist/flows/waitGuards.js.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/ios/signing.js +182 -0
- package/dist/ios/signing.js.map +1 -0
- package/dist/issues/classify.js +186 -0
- package/dist/issues/classify.js.map +1 -0
- package/dist/issues/fingerprint.js +130 -0
- package/dist/issues/fingerprint.js.map +1 -0
- package/dist/issues/index.js +240 -0
- package/dist/issues/index.js.map +1 -0
- package/dist/issues/metrics.js +155 -0
- package/dist/issues/metrics.js.map +1 -0
- package/dist/issues/recurrence.js +193 -0
- package/dist/issues/recurrence.js.map +1 -0
- package/dist/issues/report.js +110 -0
- package/dist/issues/report.js.map +1 -0
- package/dist/issues/reportBridge.js +119 -0
- package/dist/issues/reportBridge.js.map +1 -0
- package/dist/issues/schema.js +90 -0
- package/dist/issues/schema.js.map +1 -0
- package/dist/issues/sourceRevision.js +108 -0
- package/dist/issues/sourceRevision.js.map +1 -0
- package/dist/issues/store.js +155 -0
- package/dist/issues/store.js.map +1 -0
- package/dist/lib/android.js +278 -0
- package/dist/lib/android.js.map +1 -0
- package/dist/lib/commandTemplate.js +55 -0
- package/dist/lib/commandTemplate.js.map +1 -0
- package/dist/lib/coordSpace.js +23 -0
- package/dist/lib/coordSpace.js.map +1 -0
- package/dist/lib/device.js +87 -0
- package/dist/lib/device.js.map +1 -0
- package/dist/lib/gitignore.js +22 -0
- package/dist/lib/gitignore.js.map +1 -0
- package/dist/lib/image.js +97 -0
- package/dist/lib/image.js.map +1 -0
- package/dist/lib/logger.js +8 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/metroState.js +45 -0
- package/dist/lib/metroState.js.map +1 -0
- package/dist/lib/needsInput.js +201 -0
- package/dist/lib/needsInput.js.map +1 -0
- package/dist/lib/png.js +103 -0
- package/dist/lib/png.js.map +1 -0
- package/dist/lib/redact.js +21 -0
- package/dist/lib/redact.js.map +1 -0
- package/dist/lib/result.js +87 -0
- package/dist/lib/result.js.map +1 -0
- package/dist/lib/schemaHash.js +65 -0
- package/dist/lib/schemaHash.js.map +1 -0
- package/dist/lib/sensitive.js +13 -0
- package/dist/lib/sensitive.js.map +1 -0
- package/dist/lib/simctl.js +149 -0
- package/dist/lib/simctl.js.map +1 -0
- package/dist/lib/spawn.js +144 -0
- package/dist/lib/spawn.js.map +1 -0
- package/dist/lib/wda.js +347 -0
- package/dist/lib/wda.js.map +1 -0
- package/dist/lib/wdaConfig.js +69 -0
- package/dist/lib/wdaConfig.js.map +1 -0
- package/dist/lib/wdaTune.js +58 -0
- package/dist/lib/wdaTune.js.map +1 -0
- package/dist/oracle/auth.js +22 -0
- package/dist/oracle/auth.js.map +1 -0
- package/dist/oracle/failures.js +193 -0
- package/dist/oracle/failures.js.map +1 -0
- package/dist/oracle/health.js +123 -0
- package/dist/oracle/health.js.map +1 -0
- package/dist/oracle/record.js +36 -0
- package/dist/oracle/record.js.map +1 -0
- package/dist/orchestration/envelope.js +52 -0
- package/dist/orchestration/envelope.js.map +1 -0
- package/dist/orchestration/goal.js +98 -0
- package/dist/orchestration/goal.js.map +1 -0
- package/dist/plan/plan.js +124 -0
- package/dist/plan/plan.js.map +1 -0
- package/dist/prompts/index.js +63 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/report/artifactManifest.js +44 -0
- package/dist/report/artifactManifest.js.map +1 -0
- package/dist/report/coverage.js +60 -0
- package/dist/report/coverage.js.map +1 -0
- package/dist/report/evidence.js +84 -0
- package/dist/report/evidence.js.map +1 -0
- package/dist/report/export.js +447 -0
- package/dist/report/export.js.map +1 -0
- package/dist/report/flake.js +61 -0
- package/dist/report/flake.js.map +1 -0
- package/dist/report/history.js +564 -0
- package/dist/report/history.js.map +1 -0
- package/dist/report/policy.js +98 -0
- package/dist/report/policy.js.map +1 -0
- package/dist/report/qaLevel.js +96 -0
- package/dist/report/qaLevel.js.map +1 -0
- package/dist/report/readiness.js +213 -0
- package/dist/report/readiness.js.map +1 -0
- package/dist/report/summary.js +42 -0
- package/dist/report/summary.js.map +1 -0
- package/dist/report/testCatalog.js +93 -0
- package/dist/report/testCatalog.js.map +1 -0
- package/dist/report/timing.js +37 -0
- package/dist/report/timing.js.map +1 -0
- package/dist/server.js +180 -0
- package/dist/server.js.map +1 -0
- package/dist/services/automationGenerate.js +60 -0
- package/dist/services/automationGenerate.js.map +1 -0
- package/dist/services/build.js +66 -0
- package/dist/services/build.js.map +1 -0
- package/dist/services/preflight.js +51 -0
- package/dist/services/preflight.js.map +1 -0
- package/dist/services/prepareAndroid.js +183 -0
- package/dist/services/prepareAndroid.js.map +1 -0
- package/dist/services/prepareIos.js +162 -0
- package/dist/services/prepareIos.js.map +1 -0
- package/dist/services/report.js +537 -0
- package/dist/services/report.js.map +1 -0
- package/dist/services/smoke.js +120 -0
- package/dist/services/smoke.js.map +1 -0
- package/dist/services/suiteGenerate.js +123 -0
- package/dist/services/suiteGenerate.js.map +1 -0
- package/dist/services/testSuiteKnowledge.js +150 -0
- package/dist/services/testSuiteKnowledge.js.map +1 -0
- package/dist/session/attach.js +47 -0
- package/dist/session/attach.js.map +1 -0
- package/dist/session/progress.js +56 -0
- package/dist/session/progress.js.map +1 -0
- package/dist/session/store.js +329 -0
- package/dist/session/store.js.map +1 -0
- package/dist/snapshot/overlays.js +132 -0
- package/dist/snapshot/overlays.js.map +1 -0
- package/dist/snapshot/parse.js +204 -0
- package/dist/snapshot/parse.js.map +1 -0
- package/dist/snapshot/present.js +12 -0
- package/dist/snapshot/present.js.map +1 -0
- package/dist/snapshot/settle.js +36 -0
- package/dist/snapshot/settle.js.map +1 -0
- package/dist/state/profile.js +318 -0
- package/dist/state/profile.js.map +1 -0
- package/dist/suite/compile.js +176 -0
- package/dist/suite/compile.js.map +1 -0
- package/dist/suite/lint.js +45 -0
- package/dist/suite/lint.js.map +1 -0
- package/dist/suite/pom.js +285 -0
- package/dist/suite/pom.js.map +1 -0
- package/dist/suite/testcase.js +87 -0
- package/dist/suite/testcase.js.map +1 -0
- package/dist/testSuite/generator.js +222 -0
- package/dist/testSuite/generator.js.map +1 -0
- package/dist/testSuite/history.js +44 -0
- package/dist/testSuite/history.js.map +1 -0
- package/dist/testSuite/issueLinks.js +96 -0
- package/dist/testSuite/issueLinks.js.map +1 -0
- package/dist/testSuite/merge.js +190 -0
- package/dist/testSuite/merge.js.map +1 -0
- package/dist/testSuite/schema.js +86 -0
- package/dist/testSuite/schema.js.map +1 -0
- package/dist/testSuite/store.js +116 -0
- package/dist/testSuite/store.js.map +1 -0
- package/dist/testSuite/traceability.js +55 -0
- package/dist/testSuite/traceability.js.map +1 -0
- package/dist/tools/act.js +457 -0
- package/dist/tools/act.js.map +1 -0
- package/dist/tools/agent.js +225 -0
- package/dist/tools/agent.js.map +1 -0
- package/dist/tools/appMap.js +317 -0
- package/dist/tools/appMap.js.map +1 -0
- package/dist/tools/assertVisual.js +74 -0
- package/dist/tools/assertVisual.js.map +1 -0
- package/dist/tools/automationGenerate.js +394 -0
- package/dist/tools/automationGenerate.js.map +1 -0
- package/dist/tools/capabilities.js +114 -0
- package/dist/tools/capabilities.js.map +1 -0
- package/dist/tools/clearOverlay.js +150 -0
- package/dist/tools/clearOverlay.js.map +1 -0
- package/dist/tools/detectContext.js +41 -0
- package/dist/tools/detectContext.js.map +1 -0
- package/dist/tools/doctor.js +116 -0
- package/dist/tools/doctor.js.map +1 -0
- package/dist/tools/explore.js +289 -0
- package/dist/tools/explore.js.map +1 -0
- package/dist/tools/firstRun.js +136 -0
- package/dist/tools/firstRun.js.map +1 -0
- package/dist/tools/flow.js +331 -0
- package/dist/tools/flow.js.map +1 -0
- package/dist/tools/flowGenerate.js +55 -0
- package/dist/tools/flowGenerate.js.map +1 -0
- package/dist/tools/getArtifact.js +39 -0
- package/dist/tools/getArtifact.js.map +1 -0
- package/dist/tools/health.js +41 -0
- package/dist/tools/health.js.map +1 -0
- package/dist/tools/ios.js +492 -0
- package/dist/tools/ios.js.map +1 -0
- package/dist/tools/jobs.js +20 -0
- package/dist/tools/jobs.js.map +1 -0
- package/dist/tools/network.js +50 -0
- package/dist/tools/network.js.map +1 -0
- package/dist/tools/note.js +69 -0
- package/dist/tools/note.js.map +1 -0
- package/dist/tools/plan.js +49 -0
- package/dist/tools/plan.js.map +1 -0
- package/dist/tools/prepareIosTarget.js +99 -0
- package/dist/tools/prepareIosTarget.js.map +1 -0
- package/dist/tools/prepareTarget.js +257 -0
- package/dist/tools/prepareTarget.js.map +1 -0
- package/dist/tools/report.js +42 -0
- package/dist/tools/report.js.map +1 -0
- package/dist/tools/screenRecord.js +24 -0
- package/dist/tools/screenRecord.js.map +1 -0
- package/dist/tools/screenshot.js +63 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/smoke.js +39 -0
- package/dist/tools/smoke.js.map +1 -0
- package/dist/tools/snapshot.js +129 -0
- package/dist/tools/snapshot.js.map +1 -0
- package/dist/tools/startSession.js +169 -0
- package/dist/tools/startSession.js.map +1 -0
- package/dist/tools/state.js +87 -0
- package/dist/tools/state.js.map +1 -0
- package/dist/tools/suite.js +412 -0
- package/dist/tools/suite.js.map +1 -0
- package/dist/tools/testThis.js +774 -0
- package/dist/tools/testThis.js.map +1 -0
- package/dist/tools/wda.js +477 -0
- package/dist/tools/wda.js.map +1 -0
- package/dist/version.js +62 -0
- package/dist/version.js.map +1 -0
- package/dist/visual/ocr.js +72 -0
- package/dist/visual/ocr.js.map +1 -0
- package/dist/visual/provider.js +75 -0
- package/dist/visual/provider.js.map +1 -0
- package/docs/README.md +19 -0
- package/docs/assets/swipium-lockup-ink-on-light.png +0 -0
- package/docs/mcp-server.md +135 -0
- package/docs/tools.md +130 -0
- package/package.json +70 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// Target Resolver (roadmap §5) — pick the best available device/simulator for a first run,
|
|
2
|
+
// deterministically, so "test this" does not depend on agent improvisation. PURE: callers
|
|
3
|
+
// gather the live inputs (online adb devices, AVDs, simulators, the resolved artifact's
|
|
4
|
+
// platform) and pass them in; this module applies the decision order and explains the choice.
|
|
5
|
+
//
|
|
6
|
+
// Decision order (§5):
|
|
7
|
+
// 1. Explicit platform/device request wins.
|
|
8
|
+
// 2. A platform-specific artifact constrains the platform.
|
|
9
|
+
// 3. Prefer an already-online device/simulator (fastest).
|
|
10
|
+
// 4. Prefer emulator/simulator for the first run.
|
|
11
|
+
// 5. Prefer a real device only when requested or required.
|
|
12
|
+
// 6. If nothing is running, boot the fastest known emulator/simulator.
|
|
13
|
+
function isEmulatorSerial(serial) {
|
|
14
|
+
return /^emulator-\d+/.test(serial);
|
|
15
|
+
}
|
|
16
|
+
/** Which platforms have ANY usable device (online or bootable)? */
|
|
17
|
+
function platformsViable(i) {
|
|
18
|
+
const out = [];
|
|
19
|
+
if (i.android.online.length || i.android.avds.length) {
|
|
20
|
+
out.push(i.android.online.some((s) => !isEmulatorSerial(s)) ? 'android-real' : 'android-emulator');
|
|
21
|
+
}
|
|
22
|
+
if (i.ios.bootedSimulators.length || i.ios.availableSimulators.length)
|
|
23
|
+
out.push('ios-simulator');
|
|
24
|
+
if (i.ios.realDevices?.length)
|
|
25
|
+
out.push('ios-real');
|
|
26
|
+
return out;
|
|
27
|
+
}
|
|
28
|
+
function planAndroid(i, reasonPrefix) {
|
|
29
|
+
const online = i.android.online;
|
|
30
|
+
const real = online.find((s) => !isEmulatorSerial(s));
|
|
31
|
+
const emu = online.find((s) => isEmulatorSerial(s));
|
|
32
|
+
if (i.preferRealDevice && real) {
|
|
33
|
+
return { selected: 'android-real', device: real, reason: `${reasonPrefix}real device ${real} is online.`, alternatives: emu ? ['android-emulator'] : [], preconditions: [], willBoot: false };
|
|
34
|
+
}
|
|
35
|
+
if (emu) {
|
|
36
|
+
return { selected: 'android-emulator', device: emu, reason: `${reasonPrefix}emulator ${emu} is already online (fastest).`, alternatives: real ? ['android-real'] : [], preconditions: [], willBoot: false };
|
|
37
|
+
}
|
|
38
|
+
if (real) {
|
|
39
|
+
return { selected: 'android-real', device: real, reason: `${reasonPrefix}device ${real} is online.`, alternatives: [], preconditions: [], willBoot: false };
|
|
40
|
+
}
|
|
41
|
+
if (i.android.avds.length) {
|
|
42
|
+
return { selected: 'android-emulator', reason: `${reasonPrefix}no device online — will boot AVD "${i.android.avds[0]}".`, alternatives: [], preconditions: ['emulator boot (~30-60s)'], willBoot: true, bootTarget: i.android.avds[0] };
|
|
43
|
+
}
|
|
44
|
+
return { selected: null, reason: `${reasonPrefix}no Android device online and no AVD to boot.`, alternatives: [], preconditions: [], willBoot: false, blocked: { failureCode: 'NO_DEVICE', detail: 'No Android device online and no AVD available — create one (qa_doctor).' } };
|
|
45
|
+
}
|
|
46
|
+
function planIos(i, reasonPrefix) {
|
|
47
|
+
const iosPre = i.wdaAvailable === false ? ['WDA required for structured iOS tap/type/snapshot (qa_wda); else visual-only'] : [];
|
|
48
|
+
if (i.preferRealDevice && i.ios.realDevices?.length) {
|
|
49
|
+
return { selected: 'ios-real', device: i.ios.realDevices[0], reason: `${reasonPrefix}real iOS device requested and available.`, alternatives: ['ios-simulator'], preconditions: ['Apple code signing required', ...iosPre], willBoot: false };
|
|
50
|
+
}
|
|
51
|
+
if (i.ios.bootedSimulators.length) {
|
|
52
|
+
const s = i.ios.bootedSimulators[0];
|
|
53
|
+
return { selected: 'ios-simulator', device: s.udid, reason: `${reasonPrefix}simulator "${s.name}" is already booted (fastest).`, alternatives: [], preconditions: iosPre, willBoot: false };
|
|
54
|
+
}
|
|
55
|
+
if (i.ios.availableSimulators.length) {
|
|
56
|
+
const s = i.ios.availableSimulators[0];
|
|
57
|
+
return { selected: 'ios-simulator', reason: `${reasonPrefix}no simulator booted — will boot "${s.name}".`, alternatives: [], preconditions: ['simulator boot (~10-30s)', ...iosPre], willBoot: true, bootTarget: s.udid };
|
|
58
|
+
}
|
|
59
|
+
return { selected: null, reason: `${reasonPrefix}no iOS simulator booted or available.`, alternatives: [], preconditions: [], willBoot: false, blocked: { failureCode: 'SIMULATOR_RUNTIME_MISSING', detail: 'No iOS simulator available — install a runtime / create a simulator in Xcode.' } };
|
|
60
|
+
}
|
|
61
|
+
/** PURE: the typed blocker for an artifact that can never install on the chosen target, or null. */
|
|
62
|
+
export function artifactTargetMismatch(selected, installTargets) {
|
|
63
|
+
if (!installTargets || installTargets.length === 0)
|
|
64
|
+
return null; // unknown / archive-only → don't second-guess here
|
|
65
|
+
if (installTargets.includes(selected))
|
|
66
|
+
return null;
|
|
67
|
+
// Specific, common impossibilities get a precise code.
|
|
68
|
+
if (selected === 'ios-simulator' && installTargets.includes('ios-real')) {
|
|
69
|
+
return { failureCode: 'IPA_NEEDS_REAL_DEVICE', detail: 'The resolved artifact installs only on a real iOS device, but the plan selected the simulator.' };
|
|
70
|
+
}
|
|
71
|
+
if (selected === 'ios-real' && installTargets.includes('ios-simulator')) {
|
|
72
|
+
return { failureCode: 'IOS_APP_WRONG_ARCH', detail: 'The resolved artifact is a simulator .app, but the plan selected a real device.' };
|
|
73
|
+
}
|
|
74
|
+
return { failureCode: 'WRONG_ARCH', detail: `The resolved artifact installs on [${installTargets.join(', ')}], not the selected ${selected}.` };
|
|
75
|
+
}
|
|
76
|
+
export function planTarget(i) {
|
|
77
|
+
const plan = planTargetCore(i);
|
|
78
|
+
// Refuse impossible artifact/target combinations (plan §7). Only when a target was selected
|
|
79
|
+
// and the artifact's install targets are known and exclude it.
|
|
80
|
+
if (plan.selected && !plan.blocked) {
|
|
81
|
+
const mismatch = artifactTargetMismatch(plan.selected, i.artifactInstallTargets);
|
|
82
|
+
if (mismatch) {
|
|
83
|
+
return { ...plan, blocked: mismatch, reason: `${plan.reason} BUT ${mismatch.detail}` };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return plan;
|
|
87
|
+
}
|
|
88
|
+
function planTargetCore(i) {
|
|
89
|
+
// 1. Explicit device wins — figure out its platform from where it appears.
|
|
90
|
+
if (i.requestedDevice) {
|
|
91
|
+
const dev = i.requestedDevice;
|
|
92
|
+
if (i.android.online.includes(dev) || i.android.avds.includes(dev)) {
|
|
93
|
+
const online = i.android.online.includes(dev);
|
|
94
|
+
const sel = !isEmulatorSerial(dev) && online ? 'android-real' : 'android-emulator';
|
|
95
|
+
return { selected: sel, device: online ? dev : undefined, reason: `Honoring requested device "${dev}".`, alternatives: [], preconditions: [], willBoot: !online, bootTarget: online ? undefined : dev };
|
|
96
|
+
}
|
|
97
|
+
const simBooted = i.ios.bootedSimulators.find((s) => s.udid === dev || s.name === dev);
|
|
98
|
+
const simAvail = i.ios.availableSimulators.find((s) => s.udid === dev || s.name === dev);
|
|
99
|
+
if (simBooted)
|
|
100
|
+
return { selected: 'ios-simulator', device: simBooted.udid, reason: `Honoring requested simulator "${dev}".`, alternatives: [], preconditions: [], willBoot: false };
|
|
101
|
+
if (simAvail)
|
|
102
|
+
return { selected: 'ios-simulator', reason: `Honoring requested simulator "${dev}" — will boot it.`, alternatives: [], preconditions: ['simulator boot'], willBoot: true, bootTarget: simAvail.udid };
|
|
103
|
+
if (i.ios.realDevices?.includes(dev))
|
|
104
|
+
return { selected: 'ios-real', device: dev, reason: `Honoring requested real iOS device "${dev}".`, alternatives: [], preconditions: ['Apple code signing required'], willBoot: false };
|
|
105
|
+
return { selected: null, reason: `Requested device "${dev}" is not online/available.`, alternatives: [], preconditions: [], willBoot: false, blocked: { failureCode: 'NO_DEVICE', detail: `Device "${dev}" not found among online devices/simulators.` } };
|
|
106
|
+
}
|
|
107
|
+
// 2. Explicit platform, else artifact-constrained platform.
|
|
108
|
+
const platform = i.requestedPlatform ?? i.artifactPlatform;
|
|
109
|
+
if (platform === 'android')
|
|
110
|
+
return planAndroid(i, 'Android chosen: ');
|
|
111
|
+
if (platform === 'ios')
|
|
112
|
+
return planIos(i, 'iOS chosen: ');
|
|
113
|
+
// 3-6. No constraint: pick deterministically. Prefer a platform with an online device,
|
|
114
|
+
// then a bootable one; tie → Android (most common QA-first target).
|
|
115
|
+
const androidOnline = i.android.online.length > 0;
|
|
116
|
+
const iosBooted = i.ios.bootedSimulators.length > 0;
|
|
117
|
+
if (androidOnline && !iosBooted)
|
|
118
|
+
return planAndroid(i, 'Auto: Android device already online — ');
|
|
119
|
+
if (iosBooted && !androidOnline)
|
|
120
|
+
return planIos(i, 'Auto: iOS simulator already booted — ');
|
|
121
|
+
if (androidOnline && iosBooted) {
|
|
122
|
+
const a = planAndroid(i, 'Auto: both online, defaulting to Android — ');
|
|
123
|
+
a.alternatives = [...new Set([...a.alternatives, 'ios-simulator'])];
|
|
124
|
+
return a;
|
|
125
|
+
}
|
|
126
|
+
// Nothing online: boot the fastest available (simulator boots faster than an emulator).
|
|
127
|
+
const viable = platformsViable(i);
|
|
128
|
+
if (i.ios.availableSimulators.length) {
|
|
129
|
+
const p = planIos(i, 'Auto: nothing online — booting a simulator (fastest) — ');
|
|
130
|
+
p.alternatives = [...new Set([...p.alternatives, ...viable.filter((v) => v !== 'ios-simulator')])];
|
|
131
|
+
return p;
|
|
132
|
+
}
|
|
133
|
+
if (i.android.avds.length) {
|
|
134
|
+
const p = planAndroid(i, 'Auto: nothing online — booting an emulator — ');
|
|
135
|
+
p.alternatives = [...new Set([...p.alternatives, ...viable.filter((v) => v !== 'android-emulator')])];
|
|
136
|
+
return p;
|
|
137
|
+
}
|
|
138
|
+
return { selected: null, reason: 'No device or simulator is online or bootable on this machine.', alternatives: [], preconditions: [], willBoot: false, blocked: { failureCode: 'NO_DEVICE', detail: 'No Android emulator/device and no iOS simulator available — set one up (qa_doctor / Xcode).' } };
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=targetPlan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targetPlan.js","sourceRoot":"","sources":["../../src/core/targetPlan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
// DirectDriver — the v1 Android backend. Reads the accessibility tree via
|
|
2
|
+
// the platform UI-dump tool and acts via `adb shell input` (DESIGN §11). No external
|
|
3
|
+
// automation server.
|
|
4
|
+
//
|
|
5
|
+
// The shell-tap / `input text` approach is the same one proven in the Inn suite for
|
|
6
|
+
// React Native custom inputs that don't respond to programmatic clicks.
|
|
7
|
+
import { run, runBinary } from '../lib/spawn.js';
|
|
8
|
+
import { adbDevices } from '../lib/android.js';
|
|
9
|
+
const KEYCODE = {
|
|
10
|
+
back: '4',
|
|
11
|
+
home: '3',
|
|
12
|
+
enter: '66',
|
|
13
|
+
};
|
|
14
|
+
export class DirectDriver {
|
|
15
|
+
kind = 'direct';
|
|
16
|
+
serial;
|
|
17
|
+
signal;
|
|
18
|
+
constructor(serial) {
|
|
19
|
+
this.serial = serial;
|
|
20
|
+
}
|
|
21
|
+
/** Bind an AbortSignal so a cancelled job actually kills in-flight adb children. */
|
|
22
|
+
setSignal(signal) {
|
|
23
|
+
this.signal = signal;
|
|
24
|
+
}
|
|
25
|
+
base() {
|
|
26
|
+
return this.serial ? ['-s', this.serial] : [];
|
|
27
|
+
}
|
|
28
|
+
async adb(args, opts = {}) {
|
|
29
|
+
return run('adb', [...this.base(), ...args], {
|
|
30
|
+
timeoutMs: opts.timeoutMs ?? 20000,
|
|
31
|
+
signal: opts.signal ?? this.signal,
|
|
32
|
+
rejectOnNonZero: true,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
async listDevices() {
|
|
36
|
+
return adbDevices();
|
|
37
|
+
}
|
|
38
|
+
useDevice(serial) {
|
|
39
|
+
this.serial = serial;
|
|
40
|
+
}
|
|
41
|
+
currentDevice() {
|
|
42
|
+
return this.serial;
|
|
43
|
+
}
|
|
44
|
+
async installApp(apkPath) {
|
|
45
|
+
await this.adb(['install', '-r', '-g', apkPath], { timeoutMs: 180000 });
|
|
46
|
+
}
|
|
47
|
+
async uninstallApp(pkg) {
|
|
48
|
+
await this.adb(['uninstall', pkg], { timeoutMs: 60000 });
|
|
49
|
+
}
|
|
50
|
+
async isInstalled(pkg) {
|
|
51
|
+
const r = await this.adb(['shell', 'pm', 'list', 'packages', pkg]);
|
|
52
|
+
return r.stdout.split('\n').some((l) => l.trim() === `package:${pkg}`);
|
|
53
|
+
}
|
|
54
|
+
async isRunning(pkg) {
|
|
55
|
+
try {
|
|
56
|
+
const r = await this.adb(['shell', 'pidof', pkg]);
|
|
57
|
+
return r.stdout.trim().length > 0;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false; // pidof exits non-zero when no process
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async clearData(pkg) {
|
|
64
|
+
await this.adb(['shell', 'pm', 'clear', pkg]);
|
|
65
|
+
}
|
|
66
|
+
async imeShown() {
|
|
67
|
+
try {
|
|
68
|
+
const r = await this.adb(['shell', 'dumpsys', 'input_method']);
|
|
69
|
+
return /mInputShown=true/.test(r.stdout);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async logcat(lines, grep) {
|
|
76
|
+
try {
|
|
77
|
+
const r = await this.adb(['logcat', '-d', '-t', String(lines)], { timeoutMs: 8000 });
|
|
78
|
+
const out = r.stdout;
|
|
79
|
+
if (!grep)
|
|
80
|
+
return out;
|
|
81
|
+
const re = new RegExp(grep, 'i');
|
|
82
|
+
return out.split('\n').filter((l) => re.test(l)).join('\n');
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return '';
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async airplaneOn() {
|
|
89
|
+
try {
|
|
90
|
+
const r = await this.adb(['shell', 'settings', 'get', 'global', 'airplane_mode_on']);
|
|
91
|
+
return r.stdout.trim() === '1';
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async setAirplane(on) {
|
|
98
|
+
// `cmd connectivity airplane-mode` (API 30+) flips the flag + radios + broadcast.
|
|
99
|
+
await this.adb(['shell', 'cmd', 'connectivity', 'airplane-mode', on ? 'enable' : 'disable']);
|
|
100
|
+
}
|
|
101
|
+
async launchApp(pkg) {
|
|
102
|
+
// monkey is the simplest reliable launcher when we don't know the main activity.
|
|
103
|
+
await this.adb(['shell', 'monkey', '-p', pkg, '-c', 'android.intent.category.LAUNCHER', '1']);
|
|
104
|
+
}
|
|
105
|
+
async launchAppWithArgs(pkg, args) {
|
|
106
|
+
const resolved = await this.adb(['shell', 'cmd', 'package', 'resolve-activity', '--brief', pkg], { timeoutMs: 8000 });
|
|
107
|
+
const component = resolved.stdout.split(/\r?\n/).map((l) => l.trim()).filter(Boolean).at(-1);
|
|
108
|
+
if (!component || !component.includes('/'))
|
|
109
|
+
throw new Error(`Could not resolve launch activity for ${pkg}`);
|
|
110
|
+
const extras = [];
|
|
111
|
+
for (const [key, value] of Object.entries(args)) {
|
|
112
|
+
if (typeof value === 'boolean')
|
|
113
|
+
extras.push('--ez', key, String(value));
|
|
114
|
+
else if (Number.isInteger(value))
|
|
115
|
+
extras.push('--ei', key, String(value));
|
|
116
|
+
else if (typeof value === 'number')
|
|
117
|
+
extras.push('--ef', key, String(value));
|
|
118
|
+
else
|
|
119
|
+
extras.push('--es', key, String(value));
|
|
120
|
+
}
|
|
121
|
+
await this.adb(['shell', 'am', 'start', '-W', '-S', '-n', component, ...extras], { timeoutMs: 30000 });
|
|
122
|
+
}
|
|
123
|
+
async terminateApp(pkg) {
|
|
124
|
+
await this.adb(['shell', 'am', 'force-stop', pkg]);
|
|
125
|
+
}
|
|
126
|
+
async foregroundOwner() {
|
|
127
|
+
// Parse the currently focused window/activity. Works across recent Android versions.
|
|
128
|
+
const r = await this.adb(['shell', 'dumpsys', 'activity', 'activities']);
|
|
129
|
+
const m = r.stdout.match(/mResumedActivity:.*\{[^}]*\s([^\s/]+\/[^\s}]+)/) ||
|
|
130
|
+
r.stdout.match(/mCurrentFocus=.*\s([^\s/]+\/[^\s}]+)/);
|
|
131
|
+
return m?.[1] ?? 'unknown';
|
|
132
|
+
}
|
|
133
|
+
async screenshot() {
|
|
134
|
+
// exec-out returns raw PNG bytes on stdout — must be collected as binary.
|
|
135
|
+
const r = await runBinary('adb', [...this.base(), 'exec-out', 'screencap', '-p'], {
|
|
136
|
+
timeoutMs: 15000,
|
|
137
|
+
signal: this.signal,
|
|
138
|
+
rejectOnNonZero: true,
|
|
139
|
+
});
|
|
140
|
+
return r.stdout;
|
|
141
|
+
}
|
|
142
|
+
async dumpXml() {
|
|
143
|
+
// mobile-mcp's proven recipe: exec-out to stdout, retry on the transient
|
|
144
|
+
// "could not get hierarchy" / null-root, strip warning lines before <?xml.
|
|
145
|
+
// Kept modest (5) so a PERSISTENT idle failure (looping animation) surfaces fast and the
|
|
146
|
+
// tool layer can switch to visual-fallback rather than burning ~30 attempts.
|
|
147
|
+
const ATTEMPTS = 5;
|
|
148
|
+
let lastErr = '';
|
|
149
|
+
for (let attempt = 0; attempt < ATTEMPTS; attempt++) {
|
|
150
|
+
try {
|
|
151
|
+
const r = await this.adb(['exec-out', 'uiautomator', 'dump', '/dev/tty']);
|
|
152
|
+
const idx = r.stdout.indexOf('<?xml');
|
|
153
|
+
if (idx >= 0 && r.stdout.includes('</hierarchy>')) {
|
|
154
|
+
return r.stdout.slice(idx);
|
|
155
|
+
}
|
|
156
|
+
lastErr = r.stdout.trim() || r.stderr.trim();
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
lastErr = String(e);
|
|
160
|
+
}
|
|
161
|
+
await new Promise((res) => setTimeout(res, 400));
|
|
162
|
+
}
|
|
163
|
+
throw new Error(`uiautomator dump failed after ${ATTEMPTS} attempts: ${lastErr}`);
|
|
164
|
+
}
|
|
165
|
+
async tapXY(x, y) {
|
|
166
|
+
await this.adb(['shell', 'input', 'tap', String(Math.round(x)), String(Math.round(y))]);
|
|
167
|
+
}
|
|
168
|
+
async pressXY(x, y, ms) {
|
|
169
|
+
// Same-point swipe with a duration — registers on RN views that ignore instant taps.
|
|
170
|
+
const sx = String(Math.round(x));
|
|
171
|
+
const sy = String(Math.round(y));
|
|
172
|
+
await this.adb(['shell', 'input', 'swipe', sx, sy, sx, sy, String(Math.round(ms))]);
|
|
173
|
+
}
|
|
174
|
+
async inputText(text) {
|
|
175
|
+
// `input text` uses %s for space; avoid characters the shell would interpret.
|
|
176
|
+
const escaped = text.replace(/ /g, '%s');
|
|
177
|
+
await this.adb(['shell', 'input', 'text', escaped]);
|
|
178
|
+
}
|
|
179
|
+
async clearFocusedText(approxLen = 40) {
|
|
180
|
+
const n = Math.min(Math.max(approxLen + 2, 1), 120);
|
|
181
|
+
// MOVE_END (123) then a batch of DEL (67) in a single keyevent call.
|
|
182
|
+
await this.adb(['shell', 'input', 'keyevent', '123', ...Array(n).fill('67')]);
|
|
183
|
+
}
|
|
184
|
+
async pressKey(key) {
|
|
185
|
+
await this.adb(['shell', 'input', 'keyevent', KEYCODE[key]]);
|
|
186
|
+
}
|
|
187
|
+
async swipe(x1, y1, x2, y2, ms = 300) {
|
|
188
|
+
await this.adb([
|
|
189
|
+
'shell', 'input', 'swipe',
|
|
190
|
+
String(Math.round(x1)), String(Math.round(y1)),
|
|
191
|
+
String(Math.round(x2)), String(Math.round(y2)),
|
|
192
|
+
String(ms),
|
|
193
|
+
]);
|
|
194
|
+
}
|
|
195
|
+
async screenSize() {
|
|
196
|
+
try {
|
|
197
|
+
const r = await this.adb(['shell', 'wm', 'size']);
|
|
198
|
+
// prefer "Override size:" if present, else "Physical size:"
|
|
199
|
+
const m = r.stdout.match(/Override size:\s*(\d+)x(\d+)/) ?? r.stdout.match(/Physical size:\s*(\d+)x(\d+)/);
|
|
200
|
+
return m ? { width: Number(m[1]), height: Number(m[2]) } : null;
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async screenDensity() {
|
|
207
|
+
try {
|
|
208
|
+
const r = await this.adb(['shell', 'wm', 'density']);
|
|
209
|
+
const m = r.stdout.match(/Override density:\s*(\d+)/) ?? r.stdout.match(/Physical density:\s*(\d+)/);
|
|
210
|
+
return m ? Number(m[1]) : null;
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async adbReverseMetro(port = 8081) {
|
|
217
|
+
await this.adb(['reverse', `tcp:${port}`, `tcp:${port}`]);
|
|
218
|
+
}
|
|
219
|
+
async openUrl(url) {
|
|
220
|
+
await this.adb(['shell', 'am', 'start', '-a', 'android.intent.action.VIEW', '-d', url]);
|
|
221
|
+
}
|
|
222
|
+
async disableAnimations() {
|
|
223
|
+
for (const k of ['window_animation_scale', 'transition_animation_scale', 'animator_duration_scale']) {
|
|
224
|
+
await this.adb(['shell', 'settings', 'put', 'global', k, '0']);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=DirectDriver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DirectDriver.js","sourceRoot":"","sources":["../../src/drivers/DirectDriver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Driver.js","sourceRoot":"","sources":["../../src/drivers/Driver.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,wDAAwD"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// SimctlDriver — the iOS Simulator backend behind the same Driver seam (PHASE3-PLAN Phase 11).
|
|
2
|
+
// It implements exactly what `simctl` supports (screenshot, lifecycle, deep links) so the shared
|
|
3
|
+
// visual tools (qa_screenshot, qa_assert_visual) work on iOS unchanged. Operations that
|
|
4
|
+
// require a UI tree or input injection are honestly UNSUPPORTED here. Attach WebDriverAgent
|
|
5
|
+
// for structured iOS automation; this driver stays visual/lifecycle-only.
|
|
6
|
+
import * as sim from '../lib/simctl.js';
|
|
7
|
+
import { pngSize } from '../lib/png.js';
|
|
8
|
+
const UNSUPPORTED = 'not supported on the visual-only iOS simulator backend. ' +
|
|
9
|
+
'Attach WebDriverAgent with qa_wda for structured tap/type/snapshot, or use qa_ios plus qa_assert_visual for visual checks.';
|
|
10
|
+
export class SimctlDriver {
|
|
11
|
+
kind = 'simulator';
|
|
12
|
+
udid;
|
|
13
|
+
size;
|
|
14
|
+
constructor(udid) {
|
|
15
|
+
this.udid = udid;
|
|
16
|
+
}
|
|
17
|
+
// REJECT (not throw) — these implement async Driver methods, so callers that do
|
|
18
|
+
// `driver.x().catch(...)` (e.g. qa_report) must see a rejected promise, not a sync throw.
|
|
19
|
+
no(op) {
|
|
20
|
+
return Promise.reject(new Error(`${op} ${UNSUPPORTED}`));
|
|
21
|
+
}
|
|
22
|
+
async listDevices() {
|
|
23
|
+
return (await sim.listSimulators()).filter((s) => s.state === 'Booted').map((s) => s.udid);
|
|
24
|
+
}
|
|
25
|
+
useDevice(udid) {
|
|
26
|
+
this.udid = udid;
|
|
27
|
+
this.size = undefined;
|
|
28
|
+
}
|
|
29
|
+
currentDevice() {
|
|
30
|
+
return this.udid;
|
|
31
|
+
}
|
|
32
|
+
installApp(appPath) {
|
|
33
|
+
return sim.installApp(this.udid, appPath);
|
|
34
|
+
}
|
|
35
|
+
uninstallApp(bundleId) {
|
|
36
|
+
return sim.uninstallApp(this.udid, bundleId);
|
|
37
|
+
}
|
|
38
|
+
isInstalled(bundleId) {
|
|
39
|
+
return sim.isInstalled(this.udid, bundleId);
|
|
40
|
+
}
|
|
41
|
+
launchApp(bundleId) {
|
|
42
|
+
return sim.launchApp(this.udid, bundleId);
|
|
43
|
+
}
|
|
44
|
+
launchAppWithArgs(bundleId, args) {
|
|
45
|
+
return sim.launchAppWithArgs(this.udid, bundleId, args);
|
|
46
|
+
}
|
|
47
|
+
terminateApp(bundleId) {
|
|
48
|
+
return sim.terminateApp(this.udid, bundleId);
|
|
49
|
+
}
|
|
50
|
+
openUrl(url) {
|
|
51
|
+
return sim.openUrl(this.udid, url);
|
|
52
|
+
}
|
|
53
|
+
async screenshot() {
|
|
54
|
+
return sim.screenshot(this.udid);
|
|
55
|
+
}
|
|
56
|
+
async screenSize() {
|
|
57
|
+
if (this.size)
|
|
58
|
+
return this.size;
|
|
59
|
+
try {
|
|
60
|
+
const dims = pngSize(await sim.screenshot(this.udid));
|
|
61
|
+
if (dims)
|
|
62
|
+
this.size = dims;
|
|
63
|
+
return dims;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async screenDensity() {
|
|
70
|
+
return null; // simulator density isn't exposed via simctl; coordinate space still has px + scale
|
|
71
|
+
}
|
|
72
|
+
// --- UI tree / input injection: attach WebDriverAgent for structured automation. ---
|
|
73
|
+
isRunning() {
|
|
74
|
+
return this.no('checking run state');
|
|
75
|
+
}
|
|
76
|
+
clearData() {
|
|
77
|
+
return this.no('clear app data (use qa_ios erase / privacy_reset)');
|
|
78
|
+
}
|
|
79
|
+
imeShown() {
|
|
80
|
+
return this.no('keyboard detection');
|
|
81
|
+
}
|
|
82
|
+
async logcat(lines = 200, grep) {
|
|
83
|
+
const raw = await sim.simulatorLogs(this.udid, { last: '5m' });
|
|
84
|
+
const filtered = grep
|
|
85
|
+
? raw.split(/\r?\n/).filter((line) => new RegExp(grep, 'i').test(line)).join('\n')
|
|
86
|
+
: raw;
|
|
87
|
+
const all = filtered.split(/\r?\n/);
|
|
88
|
+
return all.slice(Math.max(0, all.length - lines)).join('\n');
|
|
89
|
+
}
|
|
90
|
+
airplaneOn() {
|
|
91
|
+
return this.no('airplane-mode read');
|
|
92
|
+
}
|
|
93
|
+
setAirplane() {
|
|
94
|
+
return this.no('airplane-mode toggle');
|
|
95
|
+
}
|
|
96
|
+
foregroundOwner() {
|
|
97
|
+
return this.no('foreground-app detection');
|
|
98
|
+
}
|
|
99
|
+
dumpXml() {
|
|
100
|
+
return this.no('UI-tree dump (qa_snapshot)');
|
|
101
|
+
}
|
|
102
|
+
tapXY() {
|
|
103
|
+
return this.no('tap');
|
|
104
|
+
}
|
|
105
|
+
pressXY() {
|
|
106
|
+
return this.no('press');
|
|
107
|
+
}
|
|
108
|
+
inputText() {
|
|
109
|
+
return this.no('text input');
|
|
110
|
+
}
|
|
111
|
+
clearFocusedText() {
|
|
112
|
+
return this.no('clearing a field');
|
|
113
|
+
}
|
|
114
|
+
pressKey() {
|
|
115
|
+
return this.no('key press');
|
|
116
|
+
}
|
|
117
|
+
swipe() {
|
|
118
|
+
return this.no('swipe');
|
|
119
|
+
}
|
|
120
|
+
adbReverseMetro() {
|
|
121
|
+
return this.no('dev-server port reverse');
|
|
122
|
+
}
|
|
123
|
+
disableAnimations() {
|
|
124
|
+
return this.no('disabling animations');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=SimctlDriver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SimctlDriver.js","sourceRoot":"","sources":["../../src/drivers/SimctlDriver.ts"],"names":[],"mappings":"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"}
|