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
package/dist/cli/main.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// CLI argv parsing + usage text for the `swipium` binary (kept out of src/index.ts so it can be
|
|
2
|
+
// unit-tested without starting the stdio server). No subcommand (or `serve`) = run the stdio MCP
|
|
3
|
+
// server; `--help`/`--version` print and exit; an unknown subcommand (bare word) prints usage and
|
|
4
|
+
// exits 2 instead of silently starting a server that waits on stdin forever. Unknown `--flags`
|
|
5
|
+
// with no subcommand (e.g. `--stdio`, which MCP client configs / registries commonly pass) start
|
|
6
|
+
// the server as 1.5 did, with a warning on stderr (stdout is the MCP channel).
|
|
7
|
+
//
|
|
8
|
+
// CLI path, not the MCP server, so writing to stdout is fine here.
|
|
9
|
+
import { SWIPIUM_VERSION } from '../version.js';
|
|
10
|
+
export const SUBCOMMANDS = ['init', 'scan', 'suite', 'verify', 'report', 'gc'];
|
|
11
|
+
export const USAGE = `swipium ${SWIPIUM_VERSION}: MCP server for mobile QA (Android emulator / iOS simulator)
|
|
12
|
+
|
|
13
|
+
Usage:
|
|
14
|
+
swipium Start the stdio MCP server (what MCP clients run). Alias: swipium serve
|
|
15
|
+
swipium init <client> Preview (default) or --apply the MCP client registration
|
|
16
|
+
clients: claude | codex | gemini | cursor | vscode (also: init flows)
|
|
17
|
+
options: [--apply] [--scope local|user|project] [--cwd <app dir>]
|
|
18
|
+
swipium verify Start the server over stdio, list its tools, run qa_doctor
|
|
19
|
+
swipium scan [path] Inspect a project; scaffold .swipium/ unless BLOCKED
|
|
20
|
+
options: [--check | --dry-run | --no-write]
|
|
21
|
+
swipium suite <lint|compile|init> [projectRoot] [--suite suites/smoke.yaml]
|
|
22
|
+
swipium report --format junit|sarif|github-summary|markdown|json
|
|
23
|
+
options: [--latest | --session <id> | --report <file>] [--root <dir>]
|
|
24
|
+
[--out <file>] [--fail-on-gate] (swipium report --help)
|
|
25
|
+
swipium gc [--dry-run] [--days N] [--keep N]
|
|
26
|
+
Delete old ~/.swipium/runs session dirs + stale projects.json entries
|
|
27
|
+
swipium --help | -h Show this help
|
|
28
|
+
swipium --version | -v Print the version
|
|
29
|
+
|
|
30
|
+
Docs: https://github.com/GeroPalombo/swipium#readme
|
|
31
|
+
`;
|
|
32
|
+
export function parseCommand(argv, warn = (m) => void process.stderr.write(m)) {
|
|
33
|
+
const [cmd, ...rest] = argv;
|
|
34
|
+
if (cmd === undefined || cmd === 'serve')
|
|
35
|
+
return { kind: 'serve' };
|
|
36
|
+
if (cmd === '--help' || cmd === '-h' || cmd === 'help')
|
|
37
|
+
return { kind: 'help' };
|
|
38
|
+
if (cmd === '--version' || cmd === '-v' || cmd === 'version')
|
|
39
|
+
return { kind: 'version' };
|
|
40
|
+
if (SUBCOMMANDS.includes(cmd))
|
|
41
|
+
return { kind: 'sub', cmd: cmd, rest };
|
|
42
|
+
if (cmd.startsWith('-')) {
|
|
43
|
+
// No subcommand, only flags (e.g. `--stdio`): serve, as 1.5 did. MCP configs pass these.
|
|
44
|
+
const ignoredFlags = argv.filter((a) => a.startsWith('-'));
|
|
45
|
+
warn(`swipium: ignoring unrecognized flag(s) ${ignoredFlags.join(' ')}, starting the stdio MCP server (see swipium --help)\n`);
|
|
46
|
+
return { kind: 'serve', ignoredFlags };
|
|
47
|
+
}
|
|
48
|
+
return { kind: 'unknown', cmd };
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,iGAAiG;AACjG,kGAAkG;AAClG,+FAA+F;AAC/F,iGAAiG;AACjG,+EAA+E;AAC/E,EAAE;AACF,mEAAmE;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAU,CAAC;AAUxF,MAAM,CAAC,MAAM,KAAK,GAAG,WAAW,eAAe;;;;;;;;;;;;;;;;;;;;CAoB9C,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,IAAc,EAAE,OAA8B,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5G,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACnE,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAChF,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACzF,IAAK,WAAiC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAiB,EAAE,IAAI,EAAE,CAAC;IAC3G,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,yFAAyF;QACzF,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,0CAA0C,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QAC/H,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IACzC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
// `swipium report`: render a persisted Swipium session report as a CI artifact, WITHOUT an agent.
|
|
2
|
+
//
|
|
3
|
+
// An agent (Claude Code headless, etc.) drives the device through the MCP server and calls
|
|
4
|
+
// qa_report; that persists a deep-redacted report JSON as a session artifact under
|
|
5
|
+
// ~/.swipium/runs/<project-hash>/<session>/report/. This command finds that report for the
|
|
6
|
+
// project, renders junit | sarif | github-summary | markdown | json with the same exporters
|
|
7
|
+
// qa_report uses, and (with --fail-on-gate) turns the release-gate policy
|
|
8
|
+
// (.swipium/policy.json blockOn/warnOn/ignoreKnown) into the process exit code.
|
|
9
|
+
//
|
|
10
|
+
// Exit codes: 0 = written (gate passed or not checked), 1 = --fail-on-gate and the gate blocks,
|
|
11
|
+
// 2 = usage error / no persisted report found. runReport() returns the code; it never exits.
|
|
12
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, writeFileSync } from 'node:fs';
|
|
13
|
+
import { homedir } from 'node:os';
|
|
14
|
+
import { dirname, isAbsolute, join, resolve } from 'node:path';
|
|
15
|
+
import { createHash } from 'node:crypto';
|
|
16
|
+
import { reportPolicyVerdicts, toGithubSummary, toJUnit, toMarkdown, toSarif } from '../report/export.js';
|
|
17
|
+
import { applyPolicy, loadPolicy as loadReleasePolicy } from '../report/policy.js';
|
|
18
|
+
import { loadReport } from '../report/history.js';
|
|
19
|
+
import { resolveSarifSources } from '../report/sarifSources.js';
|
|
20
|
+
export const REPORT_FORMATS = ['junit', 'sarif', 'github-summary', 'markdown', 'json'];
|
|
21
|
+
export const REPORT_USAGE = `Usage: swipium report --format <junit|sarif|github-summary|markdown|json> [options]
|
|
22
|
+
|
|
23
|
+
Render the report a Swipium session already produced (via the qa_report MCP tool) as a CI file.
|
|
24
|
+
Needs no device and no agent, only the session state Swipium persisted under ~/.swipium/runs.
|
|
25
|
+
|
|
26
|
+
Options:
|
|
27
|
+
--format <fmt> junit | sarif | github-summary | markdown | json (required)
|
|
28
|
+
--root <dir> project root the session ran against (default: current directory)
|
|
29
|
+
--session <id> use this session id
|
|
30
|
+
--latest use the most recent session for the project that has a report (default)
|
|
31
|
+
--report <file> render this report JSON file directly (skips session lookup)
|
|
32
|
+
--out <file> write to a file instead of stdout (parent dirs are created)
|
|
33
|
+
--fail-on-gate exit 1 when the release-gate policy (.swipium/policy.json) blocks
|
|
34
|
+
-h, --help show this help
|
|
35
|
+
|
|
36
|
+
Exit codes: 0 ok · 1 release gate blocked (with --fail-on-gate) · 2 usage error / no report found.
|
|
37
|
+
`;
|
|
38
|
+
const defaultIo = {
|
|
39
|
+
stdout: (s) => process.stdout.write(s),
|
|
40
|
+
stderr: (s) => process.stderr.write(s),
|
|
41
|
+
};
|
|
42
|
+
function parseArgs(args) {
|
|
43
|
+
const out = { failOnGate: false, help: false };
|
|
44
|
+
const valueFlags = {
|
|
45
|
+
'--format': 'format',
|
|
46
|
+
'--root': 'root',
|
|
47
|
+
'--session': 'session',
|
|
48
|
+
'--report': 'report',
|
|
49
|
+
'--out': 'out',
|
|
50
|
+
};
|
|
51
|
+
for (let i = 0; i < args.length; i++) {
|
|
52
|
+
const a = args[i];
|
|
53
|
+
const eq = a.indexOf('=');
|
|
54
|
+
const flag = a.startsWith('--') && eq > 0 ? a.slice(0, eq) : a;
|
|
55
|
+
if (flag === '-h' || flag === '--help')
|
|
56
|
+
out.help = true;
|
|
57
|
+
else if (flag === '--fail-on-gate')
|
|
58
|
+
out.failOnGate = true;
|
|
59
|
+
else if (flag === '--latest')
|
|
60
|
+
out.session = undefined;
|
|
61
|
+
else if (flag in valueFlags) {
|
|
62
|
+
const value = eq > 0 && a.startsWith('--') ? a.slice(eq + 1) : args[++i];
|
|
63
|
+
if (value === undefined || value.startsWith('--'))
|
|
64
|
+
return { ...out, error: `${flag} needs a value` };
|
|
65
|
+
out[valueFlags[flag]] = value;
|
|
66
|
+
}
|
|
67
|
+
else
|
|
68
|
+
return { ...out, error: `Unknown argument: ${a}` };
|
|
69
|
+
}
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
function canonical(p) {
|
|
73
|
+
try {
|
|
74
|
+
return realpathSync(p);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return resolve(p);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/** Newest persisted report JSON of a session (the qa_report "report" artifact, not an export). */
|
|
81
|
+
function latestReportJson(dir, state) {
|
|
82
|
+
const isReportJson = (p) => /(^|[\\/])report-\d+\.json$/.test(p);
|
|
83
|
+
const fromState = (state.artifacts ?? [])
|
|
84
|
+
.filter((a) => a.kind === 'report' && a.mime === 'application/json' && a.path && isReportJson(a.path) && existsSync(a.path))
|
|
85
|
+
.sort((a, b) => (a.createdAt ?? 0) - (b.createdAt ?? 0));
|
|
86
|
+
if (fromState.length)
|
|
87
|
+
return fromState[fromState.length - 1].path;
|
|
88
|
+
const reportDir = join(dir, 'report');
|
|
89
|
+
if (!existsSync(reportDir))
|
|
90
|
+
return undefined;
|
|
91
|
+
const files = readdirSync(reportDir)
|
|
92
|
+
.filter((f) => isReportJson(f))
|
|
93
|
+
.sort((a, b) => Number(a.match(/\d+/)?.[0] ?? 0) - Number(b.match(/\d+/)?.[0] ?? 0));
|
|
94
|
+
return files.length ? join(reportDir, files[files.length - 1]) : undefined;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Sessions persisted for `root`: the registry (~/.swipium/registry.json, which also covers custom
|
|
98
|
+
* session dirs) plus a scan of the default per-project runs dir (the registry is capped). A session
|
|
99
|
+
* belongs to the project when its state.json `root` resolves to the same directory.
|
|
100
|
+
*/
|
|
101
|
+
export function findProjectSessions(root, home = homedir()) {
|
|
102
|
+
const base = join(home, '.swipium');
|
|
103
|
+
const dirs = new Set();
|
|
104
|
+
try {
|
|
105
|
+
const reg = JSON.parse(readFileSync(join(base, 'registry.json'), 'utf8'));
|
|
106
|
+
for (const e of reg)
|
|
107
|
+
if (typeof e.dir === 'string')
|
|
108
|
+
dirs.add(e.dir);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
/* no registry yet */
|
|
112
|
+
}
|
|
113
|
+
// Mirrors SessionStore's default session dir: ~/.swipium/runs/<sha256(resolve(root))[:16]>/<id>.
|
|
114
|
+
const projectRuns = join(base, 'runs', createHash('sha256').update(resolve(root)).digest('hex').slice(0, 16));
|
|
115
|
+
try {
|
|
116
|
+
for (const d of readdirSync(projectRuns, { withFileTypes: true }))
|
|
117
|
+
if (d.isDirectory())
|
|
118
|
+
dirs.add(join(projectRuns, d.name));
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
/* no runs for this project */
|
|
122
|
+
}
|
|
123
|
+
const want = canonical(root);
|
|
124
|
+
const out = [];
|
|
125
|
+
for (const dir of dirs) {
|
|
126
|
+
try {
|
|
127
|
+
const st = JSON.parse(readFileSync(join(dir, 'state.json'), 'utf8'));
|
|
128
|
+
if (typeof st.id !== 'string' || typeof st.root !== 'string' || canonical(st.root) !== want)
|
|
129
|
+
continue;
|
|
130
|
+
out.push({ id: st.id, dir, createdAt: st.createdAt ?? 0, reportPath: latestReportJson(dir, st) });
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
/* unreadable / partial session: skip */
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return out.sort((a, b) => a.createdAt - b.createdAt);
|
|
137
|
+
}
|
|
138
|
+
/** Render one format from a (persisted, already-redacted) report. Exported for tests. */
|
|
139
|
+
export function renderReport(data, format, root) {
|
|
140
|
+
const policy = applyPolicy(reportPolicyVerdicts(data), loadReleasePolicy(root));
|
|
141
|
+
const body = format === 'junit'
|
|
142
|
+
? toJUnit(data, policy)
|
|
143
|
+
: format === 'sarif'
|
|
144
|
+
? toSarif(data, policy, { sources: resolveSarifSources(root, data) })
|
|
145
|
+
: format === 'github-summary'
|
|
146
|
+
? toGithubSummary(data, policy)
|
|
147
|
+
: format === 'markdown'
|
|
148
|
+
? toMarkdown(data)
|
|
149
|
+
: JSON.stringify({ ...data, releaseGate: policy }, null, 2);
|
|
150
|
+
return { body, block: policy.block, reason: policy.reason };
|
|
151
|
+
}
|
|
152
|
+
export async function runReport(args, io = defaultIo) {
|
|
153
|
+
const parsed = parseArgs(args);
|
|
154
|
+
if (parsed.help) {
|
|
155
|
+
io.stdout(REPORT_USAGE);
|
|
156
|
+
return 0;
|
|
157
|
+
}
|
|
158
|
+
if (parsed.error) {
|
|
159
|
+
io.stderr(`${parsed.error}\n\n${REPORT_USAGE}`);
|
|
160
|
+
return 2;
|
|
161
|
+
}
|
|
162
|
+
if (!parsed.format || !REPORT_FORMATS.includes(parsed.format)) {
|
|
163
|
+
io.stderr(`${parsed.format ? `Unknown --format "${parsed.format}"` : '--format is required'}\n\n${REPORT_USAGE}`);
|
|
164
|
+
return 2;
|
|
165
|
+
}
|
|
166
|
+
const format = parsed.format;
|
|
167
|
+
const cwd = process.cwd();
|
|
168
|
+
const root = parsed.root ? (isAbsolute(parsed.root) ? parsed.root : join(cwd, parsed.root)) : cwd;
|
|
169
|
+
let reportPath;
|
|
170
|
+
if (parsed.report) {
|
|
171
|
+
reportPath = isAbsolute(parsed.report) ? parsed.report : join(cwd, parsed.report);
|
|
172
|
+
if (!existsSync(reportPath)) {
|
|
173
|
+
io.stderr(`Report file not found: ${reportPath}\n`);
|
|
174
|
+
return 2;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
const sessions = findProjectSessions(root);
|
|
179
|
+
const pick = parsed.session ? sessions.find((s) => s.id === parsed.session) : [...sessions].reverse().find((s) => s.reportPath);
|
|
180
|
+
if (!pick) {
|
|
181
|
+
io.stderr(parsed.session
|
|
182
|
+
? `No persisted Swipium session "${parsed.session}" for project ${root}.\n`
|
|
183
|
+
: `No Swipium session with a report found for project ${root} (looked in ${join(homedir(), '.swipium')}).\n` +
|
|
184
|
+
'Run the agent step first and make sure it calls qa_report (any format) before the session ends.\n');
|
|
185
|
+
return 2;
|
|
186
|
+
}
|
|
187
|
+
if (!pick.reportPath) {
|
|
188
|
+
io.stderr(`Session ${pick.id} has no persisted report yet. Call qa_report for it first.\n`);
|
|
189
|
+
return 2;
|
|
190
|
+
}
|
|
191
|
+
reportPath = pick.reportPath;
|
|
192
|
+
}
|
|
193
|
+
let data;
|
|
194
|
+
try {
|
|
195
|
+
data = loadReport(reportPath);
|
|
196
|
+
}
|
|
197
|
+
catch (e) {
|
|
198
|
+
io.stderr(`Could not read report ${reportPath}: ${String(e.message ?? e)}\n`);
|
|
199
|
+
return 2;
|
|
200
|
+
}
|
|
201
|
+
if (!data || typeof data !== 'object' || !Array.isArray(data.findings) || !Array.isArray(data.testOutcomes)) {
|
|
202
|
+
io.stderr(`${reportPath} is not a Swipium report JSON (missing findings/testOutcomes).\n`);
|
|
203
|
+
return 2;
|
|
204
|
+
}
|
|
205
|
+
const { body, block, reason } = renderReport(data, format, root);
|
|
206
|
+
if (parsed.out) {
|
|
207
|
+
const outPath = isAbsolute(parsed.out) ? parsed.out : join(cwd, parsed.out);
|
|
208
|
+
mkdirSync(dirname(outPath), { recursive: true });
|
|
209
|
+
writeFileSync(outPath, body.endsWith('\n') ? body : `${body}\n`);
|
|
210
|
+
io.stderr(`Wrote ${format} for session ${data.sessionId} > ${outPath}\n`);
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
io.stdout(body.endsWith('\n') ? body : `${body}\n`);
|
|
214
|
+
}
|
|
215
|
+
io.stderr(`Release gate: ${block ? 'BLOCK' : 'PASS'}: ${reason}\n`);
|
|
216
|
+
return parsed.failOnGate && block ? 1 : 0;
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/cli/report.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/scan.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
// `swipium scan [path]
|
|
1
|
+
// `swipium scan [path]`: inspect a project and scaffold its .swipium/.
|
|
2
2
|
// Writes .swipium/config.json (generated, overwritten), and scaffolds .swipium/fixtures.json
|
|
3
|
-
// (only if absent
|
|
3
|
+
// (only if absent, never clobbers user fixtures) and .swipium/flows/. Ends with a clear
|
|
4
4
|
// ready | partial | blocked summary and the exact missing items.
|
|
5
|
-
// Pass --check / --dry-run / --no-write to inspect without writing project files.
|
|
5
|
+
// Pass --check / --dry-run / --no-write to inspect without writing project files. Nothing is
|
|
6
|
+
// written when the project is BLOCKED (a scaffold for a non-app directory is just litter), nor
|
|
7
|
+
// on --help.
|
|
6
8
|
//
|
|
7
|
-
// CLI path, not the MCP server
|
|
9
|
+
// CLI path, not the MCP server, so writing to stdout is fine here, and defaulting to cwd is
|
|
8
10
|
// fine (the no-cwd rule is for the stdio server, which has no meaningful working directory).
|
|
9
11
|
import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'node:fs';
|
|
10
12
|
import { join, resolve } from 'node:path';
|
|
@@ -15,11 +17,26 @@ const FIXTURES_TEMPLATE = {
|
|
|
15
17
|
};
|
|
16
18
|
const FLOWS_README = `# Swipium flows
|
|
17
19
|
|
|
18
|
-
Put repeatable tests here as \`*.yaml\`. Each flow is picked up by \`
|
|
19
|
-
\`
|
|
20
|
+
Put repeatable tests here as \`*.yaml\`. Each flow is picked up by \`qa_resolve_target include:["plan"]\` as a candidate
|
|
21
|
+
workflow; validate one with \`qa_flow_check\` and run it with \`qa_flow_run\` from an MCP session.
|
|
20
22
|
`;
|
|
23
|
+
export const SCAN_USAGE = [
|
|
24
|
+
'Usage: swipium scan [path] [--check | --dry-run | --no-write]',
|
|
25
|
+
'',
|
|
26
|
+
'Inspect a mobile app project (default: current directory) and print READY / PARTIAL / BLOCKED',
|
|
27
|
+
'with the exact missing items. When not BLOCKED it scaffolds .swipium/ (config.json is',
|
|
28
|
+
'regenerated; fixtures.json and flows/ are created only if absent).',
|
|
29
|
+
'',
|
|
30
|
+
' --check, --dry-run, --no-write inspect only; write no files',
|
|
31
|
+
' -h, --help show this help',
|
|
32
|
+
'',
|
|
33
|
+
].join('\n');
|
|
21
34
|
export async function runScan(args) {
|
|
22
|
-
|
|
35
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
36
|
+
process.stdout.write(SCAN_USAGE);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const checkOnly = args.some((arg) => arg === '--check' || arg === '--dry-run' || arg === '--no-write');
|
|
23
40
|
const rootArg = args.find((arg) => arg.trim() && !arg.startsWith('--'));
|
|
24
41
|
const root = resolve(rootArg?.trim() || process.cwd());
|
|
25
42
|
if (!existsSync(root)) {
|
|
@@ -29,6 +46,8 @@ export async function runScan(args) {
|
|
|
29
46
|
}
|
|
30
47
|
process.stdout.write(`Scanning ${root} …\n`);
|
|
31
48
|
const scan = await scanProject(root);
|
|
49
|
+
const blocked = scan.readiness === 'blocked';
|
|
50
|
+
const write = !checkOnly && !blocked;
|
|
32
51
|
const swipiumDir = join(root, '.swipium');
|
|
33
52
|
const configPath = join(swipiumDir, 'config.json');
|
|
34
53
|
const fixturesPath = join(swipiumDir, 'fixtures.json');
|
|
@@ -36,13 +55,13 @@ export async function runScan(args) {
|
|
|
36
55
|
const fixturesNote = existsSync(fixturesPath) ? 'kept existing' : 'created (empty template)';
|
|
37
56
|
if (write) {
|
|
38
57
|
mkdirSync(swipiumDir, { recursive: true });
|
|
39
|
-
// config.json
|
|
58
|
+
// config.json: generated artifact, always refreshed.
|
|
40
59
|
writeFileSync(configPath, JSON.stringify(scan, null, 2));
|
|
41
|
-
// fixtures.json
|
|
60
|
+
// fixtures.json: scaffold only if absent (don't clobber the user's declared preconditions).
|
|
42
61
|
if (!existsSync(fixturesPath)) {
|
|
43
62
|
writeFileSync(fixturesPath, JSON.stringify(FIXTURES_TEMPLATE, null, 2));
|
|
44
63
|
}
|
|
45
|
-
// flows
|
|
64
|
+
// flows/: scaffold the directory + a README if empty.
|
|
46
65
|
mkdirSync(flowsDir, { recursive: true });
|
|
47
66
|
mkdirSync(join(swipiumDir, 'packs'), { recursive: true }); // flow packs (release suites)
|
|
48
67
|
const flowsReadme = join(flowsDir, 'README.md');
|
|
@@ -53,7 +72,7 @@ export async function runScan(args) {
|
|
|
53
72
|
const lines = [
|
|
54
73
|
'',
|
|
55
74
|
`${icon} ${scan.readiness.toUpperCase()}`,
|
|
56
|
-
`framework: ${scan.framework}${scan.monorepo ? ' (monorepo
|
|
75
|
+
`framework: ${scan.framework}${scan.monorepo ? ' (monorepo, pick a target)' : ''}`,
|
|
57
76
|
`appId: ${scan.appId ?? 'unknown'}${scan.appIdSource ? ` (via ${scan.appIdSource})` : ''}`,
|
|
58
77
|
`artifacts: ${scan.apks.length} apk, ${scan.ipas.length} ipa, ${scan.appBundles.length} .app${scan.installed === true ? ' · app installed' : scan.installed === false ? ' · app NOT installed' : ''}`,
|
|
59
78
|
`devices: online=[${scan.devices.androidOnline.join(', ')}] avds=[${scan.devices.avds.join(', ')}]`,
|
|
@@ -65,9 +84,11 @@ export async function runScan(args) {
|
|
|
65
84
|
for (const m of scan.missing)
|
|
66
85
|
lines.push(` - ${m}`);
|
|
67
86
|
}
|
|
68
|
-
lines.push('', write ? `wrote: ${configPath}` : `check mode: no files written`, write ? ` ${fixturesPath} (${fixturesNote})` : `would write: ${configPath}`, write ? ` ${flowsDir}/` : ` ${fixturesPath} (${fixturesNote})`, ...(write ? [] : [` ${flowsDir}/`]), `git scope: not
|
|
69
|
-
? 'Next:
|
|
70
|
-
:
|
|
87
|
+
lines.push('', write ? `wrote: ${configPath}` : blocked && !checkOnly ? 'blocked: no files written' : `check mode: no files written`, write ? ` ${fixturesPath} (${fixturesNote})` : `would write: ${configPath}`, write ? ` ${flowsDir}/` : ` ${fixturesPath} (${fixturesNote})`, ...(write ? [] : [` ${flowsDir}/`]), `git scope: scan does not edit .gitignore (Swipium adds .swipium/ to a Git repo's .gitignore the first time it writes the app map or issue ledger)`, '', write
|
|
88
|
+
? 'Next: in your agent, call qa_test_this { mode: "execute" }, or qa_start_session, then qa_resolve_target { sessionId, include: ["plan"] } for READY/BLOCKED/UNSAFE workflows.'
|
|
89
|
+
: blocked
|
|
90
|
+
? 'Next: fix the items above and rerun `swipium scan` (or point it at your app directory: `swipium scan <path>`).'
|
|
91
|
+
: 'Next: rerun without --check when you are ready to create Swipium project files, or use qa_resolve_target { include: ["context"] } for read-only MCP inspection.', '');
|
|
71
92
|
process.stdout.write(lines.join('\n'));
|
|
72
93
|
}
|
|
73
94
|
/** Read a previously generated .swipium/config.json, if present. Used by qa_start_session. */
|
package/dist/cli/scan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/cli/scan.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/cli/scan.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/suite.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// `swipium suite <lint|compile|init>`. `lint` audits generated page objects for
|
|
2
2
|
// brittle locators; `init` prints how to bootstrap a suite (generation needs a recorded run,
|
|
3
|
-
// which is a live MCP session
|
|
3
|
+
// which is a live MCP session, so the CLI points the user at it rather than guessing).
|
|
4
4
|
import { isAbsolute, join } from 'node:path';
|
|
5
5
|
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
6
6
|
import { lintSuitePages } from '../suite/lint.js';
|
|
@@ -32,7 +32,7 @@ function compileToFlows(root, suiteRel) {
|
|
|
32
32
|
writeFileSync(join(flowsDir, `${slug}.yaml`), f.yaml);
|
|
33
33
|
writeFileSync(join(compiledDir, `${slug}.flow.yaml`), f.yaml);
|
|
34
34
|
slugs.push(slug);
|
|
35
|
-
lines.push(`✓ ${f.name}
|
|
35
|
+
lines.push(`✓ ${f.name} > .swipium/flows/${slug}.yaml`);
|
|
36
36
|
}
|
|
37
37
|
else {
|
|
38
38
|
allOk = false;
|
|
@@ -69,10 +69,10 @@ export async function runSuite(args) {
|
|
|
69
69
|
process.stdout.write([
|
|
70
70
|
'Swipium suites are generated from a recorded run (durable selectors > guesswork):',
|
|
71
71
|
' 1. Start the MCP server and a session (qa_start_session).',
|
|
72
|
-
' 2. Drive the app with qa_act (or qa_smoke)
|
|
73
|
-
' 3. qa_generate target:"suite"
|
|
74
|
-
' 4. swipium suite lint
|
|
75
|
-
' 5. swipium suite compile
|
|
72
|
+
' 2. Drive the app with qa_act (or qa_smoke). Every action is recorded.',
|
|
73
|
+
' 3. qa_generate target:"suite" writes .swipium/{pages,tests,suites,testcases,locators}.',
|
|
74
|
+
' 4. swipium suite lint: audit locator durability before committing.',
|
|
75
|
+
' 5. swipium suite compile: POM > runnable Flow V2 under .swipium/flows.',
|
|
76
76
|
' 6. Execute compiled flows through qa_flow_run from an MCP session.',
|
|
77
77
|
'',
|
|
78
78
|
].join('\n'));
|
package/dist/cli/suite.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suite.js","sourceRoot":"","sources":["../../src/cli/suite.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,6FAA6F;AAC7F,
|
|
1
|
+
{"version":3,"file":"suite.js","sourceRoot":"","sources":["../../src/cli/suite.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/verify.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
// `swipium verify
|
|
1
|
+
// `swipium verify`: programmatic proxy for "does the server start and do its tools
|
|
2
2
|
// inject?". Spawns dist/index.js as a stdio MCP server via the SDK client, lists tools,
|
|
3
3
|
// asserts the full Phase-0 surface is present, and calls qa_doctor. This is the same
|
|
4
|
-
// JSON-RPC path the real clients use
|
|
4
|
+
// JSON-RPC path the real clients use. It's the closest automatable check to the in-client test.
|
|
5
5
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
6
6
|
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
7
7
|
import { fileURLToPath } from 'node:url';
|
|
@@ -17,7 +17,7 @@ export async function runVerify() {
|
|
|
17
17
|
const { tools } = await client.listTools();
|
|
18
18
|
const names = tools.map((t) => t.name);
|
|
19
19
|
const missing = EXPECTED.filter((t) => !names.includes(t));
|
|
20
|
-
// Prompts are the third MCP capability
|
|
20
|
+
// Prompts are the third MCP capability, so confirm they inject too (best-effort: a client
|
|
21
21
|
// that doesn't support prompts will throw, which we tolerate).
|
|
22
22
|
let promptNames = [];
|
|
23
23
|
try {
|
|
@@ -25,7 +25,7 @@ export async function runVerify() {
|
|
|
25
25
|
promptNames = prompts.map((p) => p.name);
|
|
26
26
|
}
|
|
27
27
|
catch {
|
|
28
|
-
/* prompts unsupported by this transport/client
|
|
28
|
+
/* prompts unsupported by this transport/client: not fatal */
|
|
29
29
|
}
|
|
30
30
|
const missingPrompts = [...PROMPT_NAMES].filter((p) => !promptNames.includes(p));
|
|
31
31
|
let doctorRan = false;
|
|
@@ -42,11 +42,11 @@ export async function runVerify() {
|
|
|
42
42
|
}
|
|
43
43
|
await client.close();
|
|
44
44
|
if (missing.length) {
|
|
45
|
-
console.log(`❌ verify FAILED
|
|
45
|
+
console.log(`❌ verify FAILED: missing tools: ${missing.join(', ')}`);
|
|
46
46
|
process.exitCode = 1;
|
|
47
47
|
return;
|
|
48
48
|
}
|
|
49
|
-
console.log(`✅ verify OK
|
|
49
|
+
console.log(`✅ verify OK: server starts, ${names.length} tools inject (all ${EXPECTED.length} expected present), schema ${schemaHash}, qa_doctor ${doctorRan ? 'ran' : 'ERRORED'}.`);
|
|
50
50
|
console.log(`tools: ${names.join(', ')}`);
|
|
51
51
|
console.log(missingPrompts.length
|
|
52
52
|
? `⚠ prompts: ${promptNames.length}/${PROMPT_NAMES.length} present (missing: ${missingPrompts.join(', ')})`
|
|
@@ -55,7 +55,7 @@ export async function runVerify() {
|
|
|
55
55
|
process.exitCode = 1;
|
|
56
56
|
}
|
|
57
57
|
catch (e) {
|
|
58
|
-
console.log(`❌ verify FAILED
|
|
58
|
+
console.log(`❌ verify FAILED: could not start/inspect the server: ${String(e)}`);
|
|
59
59
|
process.exitCode = 1;
|
|
60
60
|
}
|
|
61
61
|
}
|
package/dist/cli/verify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/cli/verify.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/cli/verify.ts"],"names":[],"mappings":"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"}
|