swipium 1.4.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 +313 -0
- package/README.md +175 -219
- package/THREAT_MODEL.md +223 -47
- package/dist/appMap/automationLink.js +39 -26
- package/dist/appMap/automationLink.js.map +1 -1
- package/dist/appMap/build.js +68 -20
- package/dist/appMap/build.js.map +1 -1
- package/dist/appMap/codeIndex.js +31 -5
- package/dist/appMap/codeIndex.js.map +1 -1
- package/dist/appMap/featureIndex.js +23 -5
- package/dist/appMap/featureIndex.js.map +1 -1
- package/dist/appMap/featureModel.js +44 -8
- package/dist/appMap/featureModel.js.map +1 -1
- package/dist/appMap/firstRunApply.js +24 -6
- package/dist/appMap/firstRunApply.js.map +1 -1
- package/dist/appMap/fsWalk.js +19 -2
- package/dist/appMap/fsWalk.js.map +1 -1
- package/dist/appMap/issues.js +10 -30
- package/dist/appMap/issues.js.map +1 -1
- package/dist/appMap/migrations.js +6 -6
- 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 +83 -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 +21 -5
- package/dist/appMap/query.js.map +1 -1
- package/dist/appMap/runtimeMerge.js +12 -5
- 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 +6 -2
- package/dist/appMap/screenMatch.js.map +1 -1
- package/dist/appMap/staticScan.js +151 -39
- package/dist/appMap/staticScan.js.map +1 -1
- package/dist/appMap/store.js +58 -85
- package/dist/appMap/store.js.map +1 -1
- package/dist/appMap/tsAstScan.js +34 -12
- package/dist/appMap/tsAstScan.js.map +1 -1
- package/dist/artifacts/bundletool.js +49 -12
- package/dist/artifacts/bundletool.js.map +1 -1
- package/dist/artifacts/resolve.js +41 -14
- package/dist/artifacts/resolve.js.map +1 -1
- package/dist/automation/capabilities.js +112 -30
- package/dist/automation/capabilities.js.map +1 -1
- package/dist/automation/gestures.js +6 -2
- package/dist/automation/gestures.js.map +1 -1
- package/dist/automation/plan.js +71 -23
- package/dist/automation/plan.js.map +1 -1
- package/dist/automation/report.js +15 -5
- package/dist/automation/report.js.map +1 -1
- package/dist/automation/selectors.js +22 -28
- 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 +14 -8
- package/dist/automation/waits.js.map +1 -1
- package/dist/automation/webview.js +9 -3
- package/dist/automation/webview.js.map +1 -1
- package/dist/automationGen/appiumModel.js +16 -8
- package/dist/automationGen/appiumModel.js.map +1 -1
- package/dist/automationGen/ciEmitter.js +6 -6
- 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 +288 -121
- 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 +76 -27
- package/dist/automationGen/projectProfile.js.map +1 -1
- package/dist/automationGen/pythonEmitter.js +278 -107
- 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/automationGen/run.js +388 -0
- package/dist/automationGen/run.js.map +1 -0
- package/dist/automationGen/suitePlan.js +17 -10
- package/dist/automationGen/suitePlan.js.map +1 -1
- package/dist/automationGen/validation.js +52 -12
- package/dist/automationGen/validation.js.map +1 -1
- package/dist/build/parseBuildLog.js +235 -31
- package/dist/build/parseBuildLog.js.map +1 -1
- package/dist/build/plan.js +39 -18
- 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 +36 -15
- package/dist/cli/scan.js.map +1 -1
- package/dist/cli/suite.js +7 -7
- 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 +55 -18
- package/dist/context/detect.js.map +1 -1
- package/dist/context/findApps.js +22 -8
- 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 +10 -8
- package/dist/core/target.js.map +1 -1
- package/dist/core/targetPlan.js +160 -39
- package/dist/core/targetPlan.js.map +1 -1
- package/dist/drivers/DirectDriver.js +317 -43
- package/dist/drivers/DirectDriver.js.map +1 -1
- package/dist/drivers/SimctlDriver.js +124 -8
- package/dist/drivers/SimctlDriver.js.map +1 -1
- package/dist/drivers/WdaDriver.js +365 -55
- package/dist/drivers/WdaDriver.js.map +1 -1
- package/dist/explore/candidates.js +7 -3
- package/dist/explore/candidates.js.map +1 -1
- package/dist/explore/graph.js +15 -6
- package/dist/explore/graph.js.map +1 -1
- package/dist/explore/memory.js +4 -1
- package/dist/explore/memory.js.map +1 -1
- package/dist/explore/planner.js +54 -9
- package/dist/explore/planner.js.map +1 -1
- package/dist/explore/policy.js +11 -6
- package/dist/explore/policy.js.map +1 -1
- package/dist/explore/runner.js +363 -190
- package/dist/explore/runner.js.map +1 -1
- package/dist/explore/signatures.js +4 -2
- package/dist/explore/signatures.js.map +1 -1
- package/dist/explore/suite.js +3 -1
- package/dist/explore/suite.js.map +1 -1
- package/dist/featureTesting/executionBootstrap.js +137 -29
- package/dist/featureTesting/executionBootstrap.js.map +1 -1
- package/dist/featureTesting/featureMap.js +6 -3
- package/dist/featureTesting/featureMap.js.map +1 -1
- package/dist/featureTesting/featureScope.js +101 -20
- package/dist/featureTesting/featureScope.js.map +1 -1
- package/dist/featureTesting/mapFeatureScope.js +44 -15
- package/dist/featureTesting/mapFeatureScope.js.map +1 -1
- package/dist/featureTesting/objectiveModel.js +15 -11
- package/dist/featureTesting/objectiveModel.js.map +1 -1
- package/dist/featureTesting/resultMerge.js +16 -8
- package/dist/featureTesting/resultMerge.js.map +1 -1
- package/dist/featureTesting/sources.js +8 -5
- package/dist/featureTesting/sources.js.map +1 -1
- package/dist/featureTesting/suiteBridge.js +8 -2
- package/dist/featureTesting/suiteBridge.js.map +1 -1
- package/dist/featureTesting/synonyms.js +32 -4
- package/dist/featureTesting/synonyms.js.map +1 -1
- package/dist/featureTesting/testCaseFactory.js +27 -15
- package/dist/featureTesting/testCaseFactory.js.map +1 -1
- package/dist/featureTesting/testPlan.js +34 -12
- 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 +9 -6
- package/dist/firstRun/classifyScreen.js.map +1 -1
- package/dist/firstRun/firstRunPlanner.js +16 -13
- package/dist/firstRun/firstRunPlanner.js.map +1 -1
- package/dist/firstRun/firstRunRunner.js +92 -31
- package/dist/firstRun/firstRunRunner.js.map +1 -1
- package/dist/firstRun/generatedDataPolicy.js +25 -15
- package/dist/firstRun/generatedDataPolicy.js.map +1 -1
- package/dist/firstRun/inputPlanner.js +45 -11
- 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 +72 -9
- 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 +68 -17
- package/dist/flows/generate.js.map +1 -1
- package/dist/flows/lint.js +88 -14
- package/dist/flows/lint.js.map +1 -1
- package/dist/flows/pack.js +21 -5
- 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 +176 -37
- package/dist/flows/repair.js.map +1 -1
- package/dist/flows/run.js +308 -99
- package/dist/flows/run.js.map +1 -1
- package/dist/flows/schema.js +107 -25
- package/dist/flows/schema.js.map +1 -1
- package/dist/flows/seedExec.js +8 -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/ios/signing.js +32 -3
- package/dist/ios/signing.js.map +1 -1
- package/dist/issues/classify.js +28 -20
- package/dist/issues/classify.js.map +1 -1
- package/dist/issues/fingerprint.js +35 -9
- package/dist/issues/fingerprint.js.map +1 -1
- package/dist/issues/index.js +93 -46
- package/dist/issues/index.js.map +1 -1
- package/dist/issues/metrics.js +6 -5
- 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 +12 -8
- package/dist/issues/report.js.map +1 -1
- package/dist/issues/reportBridge.js +40 -9
- 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 +84 -8
- 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 +53 -12
- 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 +12 -3
- package/dist/lib/image.js.map +1 -1
- package/dist/lib/lockfile.js +399 -0
- package/dist/lib/lockfile.js.map +1 -0
- package/dist/lib/needsInput.js +9 -6
- package/dist/lib/needsInput.js.map +1 -1
- package/dist/lib/png.js +4 -3
- 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 +94 -10
- package/dist/lib/result.js.map +1 -1
- package/dist/lib/schemaHash.js +7 -5
- package/dist/lib/schemaHash.js.map +1 -1
- package/dist/lib/sensitive.js +6 -3
- 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 +78 -17
- 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 +321 -25
- package/dist/lib/wda.js.map +1 -1
- package/dist/lib/wdaConfig.js +12 -5
- package/dist/lib/wdaConfig.js.map +1 -1
- package/dist/lib/wdaTune.js +52 -23
- package/dist/lib/wdaTune.js.map +1 -1
- package/dist/mobileAudit/checks.js +150 -28
- 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 +121 -20
- package/dist/mobileAudit/profiles.js.map +1 -1
- package/dist/mobileAudit/results.js +9 -4
- package/dist/mobileAudit/results.js.map +1 -1
- package/dist/mobileAudit/runner.js +214 -35
- 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 +1085 -145
- package/dist/oracle/failures.js.map +1 -1
- package/dist/oracle/health.js +148 -26
- package/dist/oracle/health.js.map +1 -1
- package/dist/oracle/locator.js +148 -19
- 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 +7 -13
- package/dist/orchestration/goal.js.map +1 -1
- package/dist/orchestration/testThis/execute.js +167 -0
- package/dist/orchestration/testThis/execute.js.map +1 -0
- package/dist/orchestration/testThis/pipeline.js +413 -0
- package/dist/orchestration/testThis/pipeline.js.map +1 -0
- package/dist/orchestration/testThis/plan.js +519 -0
- package/dist/orchestration/testThis/plan.js.map +1 -0
- package/dist/orchestration/testThis/sessionIntent.js +72 -0
- package/dist/orchestration/testThis/sessionIntent.js.map +1 -0
- package/dist/orchestration/testThis/terminal.js +136 -0
- package/dist/orchestration/testThis/terminal.js.map +1 -0
- package/dist/orchestration/testThis/types.js +12 -0
- package/dist/orchestration/testThis/types.js.map +1 -0
- package/dist/plan/plan.js +9 -9
- package/dist/plan/plan.js.map +1 -1
- package/dist/prompts/index.js +24 -24
- package/dist/prompts/index.js.map +1 -1
- package/dist/report/coverage.js +0 -1
- package/dist/report/coverage.js.map +1 -1
- package/dist/report/evidence.js.map +1 -1
- package/dist/report/export.js +449 -72
- 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/flake.js +13 -14
- package/dist/report/flake.js.map +1 -1
- package/dist/report/history.js +72 -38
- package/dist/report/history.js.map +1 -1
- package/dist/report/policy.js +18 -7
- package/dist/report/policy.js.map +1 -1
- package/dist/report/qaLevel.js +10 -16
- package/dist/report/qaLevel.js.map +1 -1
- package/dist/report/readiness.js +42 -12
- package/dist/report/readiness.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/timing.js +23 -23
- package/dist/report/timing.js.map +1 -1
- package/dist/report/toolHealth.js +124 -0
- package/dist/report/toolHealth.js.map +1 -0
- package/dist/server.js +501 -69
- 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 +10 -4
- package/dist/services/build.js.map +1 -1
- package/dist/services/flowGenerate.js +75 -0
- package/dist/services/flowGenerate.js.map +1 -0
- package/dist/services/preflight.js +40 -8
- package/dist/services/preflight.js.map +1 -1
- package/dist/services/prepareAndroid.js +92 -18
- package/dist/services/prepareAndroid.js.map +1 -1
- package/dist/services/prepareIos.js +94 -17
- package/dist/services/prepareIos.js.map +1 -1
- package/dist/services/report.js +271 -80
- package/dist/services/report.js.map +1 -1
- package/dist/services/smoke.js +68 -22
- package/dist/services/smoke.js.map +1 -1
- package/dist/services/suiteGenerate.js +43 -6
- package/dist/services/suiteGenerate.js.map +1 -1
- package/dist/services/testSuiteKnowledge.js +78 -33
- package/dist/services/testSuiteKnowledge.js.map +1 -1
- package/dist/session/attach.js +284 -4
- package/dist/session/attach.js.map +1 -1
- package/dist/session/processRegistry.js +433 -0
- package/dist/session/processRegistry.js.map +1 -0
- package/dist/session/progress.js +1 -1
- package/dist/session/progress.js.map +1 -1
- package/dist/session/retention.js +201 -0
- package/dist/session/retention.js.map +1 -0
- package/dist/session/store.js +459 -59
- package/dist/session/store.js.map +1 -1
- package/dist/snapshot/overlays.js +60 -10
- package/dist/snapshot/overlays.js.map +1 -1
- package/dist/snapshot/parse.js +30 -12
- package/dist/snapshot/parse.js.map +1 -1
- package/dist/snapshot/present.js +36 -6
- 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 +82 -11
- package/dist/state/profile.js.map +1 -1
- package/dist/suite/compile.js +15 -6
- package/dist/suite/compile.js.map +1 -1
- package/dist/suite/lint.js +22 -4
- package/dist/suite/lint.js.map +1 -1
- package/dist/suite/pom.js +75 -44
- 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 +15 -11
- package/dist/suite/testcase.js.map +1 -1
- package/dist/testSuite/exporter.js +7 -3
- package/dist/testSuite/exporter.js.map +1 -1
- package/dist/testSuite/generator.js +43 -14
- 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 +13 -7
- package/dist/testSuite/merge.js.map +1 -1
- package/dist/testSuite/schema.js +21 -16
- package/dist/testSuite/schema.js.map +1 -1
- package/dist/testSuite/store.js +12 -4
- 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 +868 -174
- package/dist/tools/act.js.map +1 -1
- package/dist/tools/agent.js +521 -112
- package/dist/tools/agent.js.map +1 -1
- package/dist/tools/appControl.js +82 -19
- package/dist/tools/appControl.js.map +1 -1
- package/dist/tools/appMap.js +393 -189
- package/dist/tools/appMap.js.map +1 -1
- package/dist/tools/build.js +92 -51
- package/dist/tools/build.js.map +1 -1
- package/dist/tools/bundletool.js +141 -40
- package/dist/tools/bundletool.js.map +1 -1
- package/dist/tools/clearOverlay.js +98 -18
- package/dist/tools/clearOverlay.js.map +1 -1
- package/dist/tools/device.js +108 -19
- package/dist/tools/device.js.map +1 -1
- package/dist/tools/doctor.js +98 -35
- package/dist/tools/doctor.js.map +1 -1
- package/dist/tools/explore.js +110 -42
- package/dist/tools/explore.js.map +1 -1
- package/dist/tools/featureTesting.js +152 -130
- package/dist/tools/featureTesting.js.map +1 -1
- package/dist/tools/firstRun.js +94 -66
- package/dist/tools/firstRun.js.map +1 -1
- package/dist/tools/flow.js +347 -132
- package/dist/tools/flow.js.map +1 -1
- package/dist/tools/flowRepair.js +42 -10
- package/dist/tools/flowRepair.js.map +1 -1
- package/dist/tools/generate.js +199 -0
- package/dist/tools/generate.js.map +1 -0
- package/dist/tools/getArtifact.js +37 -8
- package/dist/tools/getArtifact.js.map +1 -1
- package/dist/tools/health.js +17 -12
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/ios.js +148 -194
- package/dist/tools/ios.js.map +1 -1
- package/dist/tools/issues.js +256 -171
- package/dist/tools/issues.js.map +1 -1
- package/dist/tools/jobs.js +55 -11
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/metro.js +84 -38
- package/dist/tools/metro.js.map +1 -1
- package/dist/tools/mobileAudit.js +83 -26
- package/dist/tools/mobileAudit.js.map +1 -1
- package/dist/tools/network.js +36 -14
- package/dist/tools/network.js.map +1 -1
- package/dist/tools/note.js +31 -17
- package/dist/tools/note.js.map +1 -1
- package/dist/tools/prepareIosTarget.js +31 -14
- package/dist/tools/prepareIosTarget.js.map +1 -1
- package/dist/tools/prepareTarget.js +193 -47
- package/dist/tools/prepareTarget.js.map +1 -1
- package/dist/tools/report.js +16 -8
- package/dist/tools/report.js.map +1 -1
- package/dist/tools/resolveArtifact.js +12 -12
- package/dist/tools/resolveArtifact.js.map +1 -1
- package/dist/tools/resolveTarget.js +81 -18
- package/dist/tools/resolveTarget.js.map +1 -1
- package/dist/tools/screenRecord.js +85 -20
- package/dist/tools/screenRecord.js.map +1 -1
- package/dist/tools/screenshot.js +42 -18
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/smoke.js +29 -12
- package/dist/tools/smoke.js.map +1 -1
- package/dist/tools/snapshot.js +157 -107
- package/dist/tools/snapshot.js.map +1 -1
- package/dist/tools/startSession.js +117 -84
- package/dist/tools/startSession.js.map +1 -1
- package/dist/tools/suite.js +391 -310
- package/dist/tools/suite.js.map +1 -1
- package/dist/tools/testSuite.js +112 -36
- package/dist/tools/testSuite.js.map +1 -1
- package/dist/tools/testThis.js +35 -802
- package/dist/tools/testThis.js.map +1 -1
- package/dist/tools/visual.js +698 -116
- package/dist/tools/visual.js.map +1 -1
- package/dist/tools/wait.js +9 -23
- package/dist/tools/wait.js.map +1 -1
- package/dist/tools/wda.js +312 -54
- package/dist/tools/wda.js.map +1 -1
- package/dist/version.js +37 -64
- package/dist/version.js.map +1 -1
- package/dist/visual/ocr.js +65 -8
- package/dist/visual/ocr.js.map +1 -1
- package/dist/visual/provider.js +87 -15
- 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 +210 -104
- package/docs/physical-devices.md +84 -0
- package/docs/tools.md +808 -217
- package/package.json +16 -6
- package/dist/appMap/diff.js +0 -60
- package/dist/appMap/diff.js.map +0 -1
- package/dist/automation/maestroIr.js +0 -282
- package/dist/automation/maestroIr.js.map +0 -1
- package/dist/interop/maestro.js +0 -151
- package/dist/interop/maestro.js.map +0 -1
- package/dist/tools/assertVisual.js +0 -74
- package/dist/tools/assertVisual.js.map +0 -1
- package/dist/tools/automationGenerate.js +0 -394
- package/dist/tools/automationGenerate.js.map +0 -1
- package/dist/tools/capabilities.js +0 -209
- 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 +0 -55
- package/dist/tools/flowGenerate.js.map +0 -1
- package/dist/tools/history.js +0 -56
- package/dist/tools/history.js.map +0 -1
- package/dist/tools/idling.js +0 -104
- package/dist/tools/idling.js.map +0 -1
- package/dist/tools/inputCapabilities.js +0 -30
- package/dist/tools/inputCapabilities.js.map +0 -1
- package/dist/tools/locator.js +0 -57
- package/dist/tools/locator.js.map +0 -1
- package/dist/tools/maestro.js +0 -78
- package/dist/tools/maestro.js.map +0 -1
- package/dist/tools/permissions.js +0 -149
- package/dist/tools/permissions.js.map +0 -1
- package/dist/tools/plan.js +0 -49
- package/dist/tools/plan.js.map +0 -1
- package/dist/tools/screenInfo.js +0 -70
- package/dist/tools/screenInfo.js.map +0 -1
- package/dist/tools/seed.js +0 -101
- package/dist/tools/seed.js.map +0 -1
- package/dist/tools/state.js +0 -170
- package/dist/tools/state.js.map +0 -1
- package/dist/tools/visualText.js +0 -61
- package/dist/tools/visualText.js.map +0 -1
package/dist/build/plan.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Build-from-source planner
|
|
1
|
+
// Build-from-source planner: propose the EXACT commands that turn a source
|
|
2
2
|
// project into an installable artifact, per framework + platform, with prerequisites
|
|
3
3
|
// (dependency install, Expo prebuild, CocoaPods) and the artifact globs the build will produce.
|
|
4
4
|
//
|
|
@@ -14,11 +14,7 @@ function hasFile(root, ...rel) {
|
|
|
14
14
|
}
|
|
15
15
|
/** Pick the package manager from lockfiles (npm default). */
|
|
16
16
|
function nodeInstallStep(root) {
|
|
17
|
-
const pm = existsSync(join(root, 'pnpm-lock.yaml'))
|
|
18
|
-
? 'pnpm'
|
|
19
|
-
: existsSync(join(root, 'yarn.lock'))
|
|
20
|
-
? 'yarn'
|
|
21
|
-
: 'npm';
|
|
17
|
+
const pm = existsSync(join(root, 'pnpm-lock.yaml')) ? 'pnpm' : existsSync(join(root, 'yarn.lock')) ? 'yarn' : 'npm';
|
|
22
18
|
const argv = pm === 'npm' ? ['npm', 'install'] : [pm, 'install'];
|
|
23
19
|
return { label: 'install JS dependencies', command: argv.join(' '), argv, cwd: root, optionalIfPresent: 'node_modules' };
|
|
24
20
|
}
|
|
@@ -51,14 +47,14 @@ function xcodebuildStep(root, variant) {
|
|
|
51
47
|
const { workspace, project, scheme, dir } = iosWorkspace(root);
|
|
52
48
|
const notes = [];
|
|
53
49
|
if (!scheme)
|
|
54
|
-
return { step: null, notes: ['Could not find an .xcworkspace/.xcodeproj
|
|
50
|
+
return { step: null, notes: ['Could not find an .xcworkspace/.xcodeproj. Pass the scheme/workspace explicitly.'] };
|
|
55
51
|
const config = variant === 'release' ? 'Release' : 'Debug';
|
|
56
52
|
const argv = ['xcodebuild', '-scheme', scheme, '-sdk', 'iphonesimulator', '-configuration', config, '-derivedDataPath', 'build', 'build'];
|
|
57
53
|
if (workspace)
|
|
58
54
|
argv.splice(1, 0, '-workspace', basename(workspace));
|
|
59
55
|
else if (project)
|
|
60
56
|
argv.splice(1, 0, '-project', basename(project));
|
|
61
|
-
notes.push(`Using scheme "${scheme}" (best-effort)
|
|
57
|
+
notes.push(`Using scheme "${scheme}" (best-effort). Override if your scheme differs.`);
|
|
62
58
|
return { step: { label: 'build iOS simulator app', command: argv.join(' '), argv, cwd: dir }, notes };
|
|
63
59
|
}
|
|
64
60
|
/**
|
|
@@ -72,8 +68,16 @@ export async function buildPlan(opts) {
|
|
|
72
68
|
const prerequisites = [];
|
|
73
69
|
const missingToolchain = [];
|
|
74
70
|
const base = (over = {}) => ({
|
|
75
|
-
framework,
|
|
76
|
-
|
|
71
|
+
framework,
|
|
72
|
+
platform,
|
|
73
|
+
variant,
|
|
74
|
+
prerequisites,
|
|
75
|
+
build: null,
|
|
76
|
+
expectedArtifactGlobs: [],
|
|
77
|
+
toolchainOk: missingToolchain.length === 0,
|
|
78
|
+
missingToolchain,
|
|
79
|
+
notes,
|
|
80
|
+
...over,
|
|
77
81
|
});
|
|
78
82
|
if (framework === 'unknown') {
|
|
79
83
|
return base({ failureCode: 'UNSUPPORTED_FRAMEWORK', notes: ['No supported mobile framework detected at this root.'] });
|
|
@@ -88,17 +92,23 @@ export async function buildPlan(opts) {
|
|
|
88
92
|
const gradleArg = variant === 'release' ? 'assembleRelease' : 'assembleDebug';
|
|
89
93
|
switch (framework) {
|
|
90
94
|
case 'expo': {
|
|
91
|
-
// No native android dir
|
|
95
|
+
// No native android dir: expo run:android prebuilds; otherwise it reuses it.
|
|
92
96
|
if (!hasFile(root, 'android'))
|
|
93
|
-
notes.push('No android/ directory
|
|
97
|
+
notes.push('No android/ directory, so expo run:android will prebuild it (EXPO_PREBUILD).');
|
|
94
98
|
notes.push('Expo Android local run compiles native code, installs the app, and starts Metro. First run can take several minutes; later JS/TS-only work should usually reuse the installed development build with Metro.');
|
|
95
99
|
const argv = ['npx', 'expo', 'run:android', '--variant', variant];
|
|
96
|
-
return base({
|
|
100
|
+
return base({
|
|
101
|
+
build: { label: 'Expo Android local run', command: argv.join(' '), argv, cwd: root },
|
|
102
|
+
expectedArtifactGlobs: apkGlobs,
|
|
103
|
+
});
|
|
97
104
|
}
|
|
98
105
|
case 'bare-react-native':
|
|
99
106
|
case 'native-android': {
|
|
100
107
|
if (!hasFile(root, 'android/gradlew', 'gradlew')) {
|
|
101
|
-
return base({
|
|
108
|
+
return base({
|
|
109
|
+
failureCode: 'BUILD_COMMAND_UNAVAILABLE',
|
|
110
|
+
notes: ['No gradlew found. Run from the Android project or add the Gradle wrapper.'],
|
|
111
|
+
});
|
|
102
112
|
}
|
|
103
113
|
const cwd = existsSync(join(root, 'android')) ? join(root, 'android') : root;
|
|
104
114
|
const argv = ['./gradlew', gradleArg];
|
|
@@ -109,7 +119,11 @@ export async function buildPlan(opts) {
|
|
|
109
119
|
missingToolchain.push('flutter');
|
|
110
120
|
prerequisites.unshift({ label: 'flutter pub get', command: 'flutter pub get', argv: ['flutter', 'pub', 'get'], cwd: root });
|
|
111
121
|
const argv = ['flutter', 'build', 'apk', `--${variant}`];
|
|
112
|
-
return base({
|
|
122
|
+
return base({
|
|
123
|
+
build: { label: 'flutter build apk', command: argv.join(' '), argv, cwd: root },
|
|
124
|
+
expectedArtifactGlobs: flutterGlobs,
|
|
125
|
+
toolchainOk: missingToolchain.length === 0,
|
|
126
|
+
});
|
|
113
127
|
}
|
|
114
128
|
default:
|
|
115
129
|
return base({ failureCode: 'BUILD_COMMAND_UNAVAILABLE' });
|
|
@@ -122,9 +136,12 @@ export async function buildPlan(opts) {
|
|
|
122
136
|
switch (framework) {
|
|
123
137
|
case 'expo': {
|
|
124
138
|
if (!hasFile(root, 'ios'))
|
|
125
|
-
notes.push('No ios/ directory
|
|
139
|
+
notes.push('No ios/ directory, so expo run:ios will prebuild it (EXPO_PREBUILD).');
|
|
126
140
|
const argv = ['npx', 'expo', 'run:ios', '--no-bundler'];
|
|
127
|
-
return base({
|
|
141
|
+
return base({
|
|
142
|
+
build: { label: 'build + run iOS simulator (Expo)', command: argv.join(' '), argv, cwd: root },
|
|
143
|
+
expectedArtifactGlobs: appGlobs,
|
|
144
|
+
});
|
|
128
145
|
}
|
|
129
146
|
case 'bare-react-native':
|
|
130
147
|
case 'native-ios': {
|
|
@@ -142,7 +159,11 @@ export async function buildPlan(opts) {
|
|
|
142
159
|
missingToolchain.push('flutter');
|
|
143
160
|
prerequisites.unshift({ label: 'flutter pub get', command: 'flutter pub get', argv: ['flutter', 'pub', 'get'], cwd: root });
|
|
144
161
|
const argv = ['flutter', 'build', 'ios', '--simulator', `--${variant}`];
|
|
145
|
-
return base({
|
|
162
|
+
return base({
|
|
163
|
+
build: { label: 'flutter build ios --simulator', command: argv.join(' '), argv, cwd: root },
|
|
164
|
+
expectedArtifactGlobs: ['build/ios/iphonesimulator/*.app'],
|
|
165
|
+
toolchainOk: missingToolchain.length === 0,
|
|
166
|
+
});
|
|
146
167
|
}
|
|
147
168
|
default:
|
|
148
169
|
return base({ failureCode: 'BUILD_COMMAND_UNAVAILABLE' });
|
package/dist/build/plan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/build/plan.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/build/plan.ts"],"names":[],"mappings":"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"}
|
package/dist/ci/preflight.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ciMutationAllowed } from '../report/policy.js';
|
|
2
|
-
|
|
2
|
+
import { flowEnvAllowed, isMutatingFlowStep } from '../flows/schema.js';
|
|
3
3
|
const VAR_REF = /\$\{([^}]+)\}/g;
|
|
4
4
|
function variableBearingValues(step) {
|
|
5
5
|
switch (step.kind) {
|
|
@@ -28,13 +28,16 @@ export function ciMutatingSteps(flow) {
|
|
|
28
28
|
const all = [...flow.setup, ...flow.steps, ...flow.teardown];
|
|
29
29
|
const out = [];
|
|
30
30
|
all.forEach((step, i) => {
|
|
31
|
-
|
|
31
|
+
// Same rule as qa_flow_run consent / qa_smoke: includes an openUrl that interpolates ${VAR}.
|
|
32
|
+
if (!isMutatingFlowStep(step))
|
|
32
33
|
return;
|
|
33
34
|
out.push({
|
|
34
35
|
flow: flow.name,
|
|
35
36
|
step: i + 1,
|
|
36
37
|
kind: step.kind,
|
|
37
|
-
reason:
|
|
38
|
+
reason: step.kind === 'openUrl'
|
|
39
|
+
? 'openUrl interpolates a ${VAR} into a URL that leaves the device and requires .swipium/policy.json ciAllowMutations ("openUrl")'
|
|
40
|
+
: `${step.kind} changes device/app/test state and requires .swipium/policy.json ciAllowMutations`,
|
|
38
41
|
});
|
|
39
42
|
});
|
|
40
43
|
return out;
|
|
@@ -54,7 +57,9 @@ export function ciRequiredVariables(flow) {
|
|
|
54
57
|
step: i + 1,
|
|
55
58
|
kind: step.kind,
|
|
56
59
|
variable: match[1],
|
|
57
|
-
reason:
|
|
60
|
+
reason: flowEnvAllowed(match[1])
|
|
61
|
+
? `${step.kind} references \${${match[1]}}; set it in the CI environment before running Swipium.`
|
|
62
|
+
: `${step.kind} references \${${match[1]}}; flows read only SWIPIUM_* environment variables. Rename it (e.g. SWIPIUM_${match[1]}) or pass it as an explicit variable.`,
|
|
58
63
|
});
|
|
59
64
|
}
|
|
60
65
|
}
|
|
@@ -68,6 +73,10 @@ export function validateCiVariables(flows, env = process.env, variables = {}) {
|
|
|
68
73
|
const explicit = variables[v.variable];
|
|
69
74
|
if (explicit != null && explicit !== '')
|
|
70
75
|
return false;
|
|
76
|
+
// The flow runner reads the environment only for SWIPIUM_* names, so any other env var
|
|
77
|
+
// does not satisfy the requirement (it would still be missing at run time).
|
|
78
|
+
if (!flowEnvAllowed(v.variable))
|
|
79
|
+
return true;
|
|
71
80
|
return env[v.variable] == null || env[v.variable] === '';
|
|
72
81
|
});
|
|
73
82
|
return { ok: missing.length === 0, missing };
|
package/dist/ci/preflight.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/ci/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAe,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/ci/preflight.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/gc.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// `swipium gc [--dry-run] [--days N] [--keep N]`: reclaim disk from old ~/.swipium/runs session dirs
|
|
2
|
+
// (same rule as the automatic startup prune in src/session/retention.ts) and compact
|
|
3
|
+
// ~/.swipium/projects.json (drop entries whose project root no longer exists, cap to 200).
|
|
4
|
+
//
|
|
5
|
+
// CLI path, not the MCP server, so writing to stdout is fine here.
|
|
6
|
+
import { pruneSessionRuns, retentionDaysFromEnv, retentionKeepFromEnv, DEFAULT_RETENTION_DAYS } from '../session/retention.js';
|
|
7
|
+
import { compactProjectRegistry } from '../appMap/projectRegistry.js';
|
|
8
|
+
export const GC_USAGE = `Usage: swipium gc [--dry-run] [--days N] [--keep N]
|
|
9
|
+
Delete ~/.swipium/runs session dirs older than N days (default: SWIPIUM_RETENTION_DAYS or 30) that
|
|
10
|
+
are not in ~/.swipium/registry.json, keeping the newest --keep (default: SWIPIUM_RETENTION_KEEP or 20)
|
|
11
|
+
per project regardless of age; prune ~/.swipium/projects.json entries whose root no longer exists.
|
|
12
|
+
--dry-run report what would be reclaimed, delete nothing
|
|
13
|
+
`;
|
|
14
|
+
export function parseGcArgs(argv, env = process.env) {
|
|
15
|
+
const out = { dryRun: false, days: retentionDaysFromEnv(env) ?? DEFAULT_RETENTION_DAYS, keep: retentionKeepFromEnv(env) };
|
|
16
|
+
for (let i = 0; i < argv.length; i++) {
|
|
17
|
+
const a = argv[i];
|
|
18
|
+
if (a === '--dry-run' || a === '-n')
|
|
19
|
+
out.dryRun = true;
|
|
20
|
+
else if (a === '--help' || a === '-h')
|
|
21
|
+
out.help = true;
|
|
22
|
+
else if (a === '--days' || a === '--keep' || a.startsWith('--days=') || a.startsWith('--keep=')) {
|
|
23
|
+
const [flag, inline] = a.split('=', 2);
|
|
24
|
+
const raw = inline ?? argv[++i];
|
|
25
|
+
const n = Number(raw);
|
|
26
|
+
if (raw == null || !Number.isInteger(n) || n < 0) {
|
|
27
|
+
out.error = `${flag} expects a non-negative integer (got ${raw ?? 'nothing'})`;
|
|
28
|
+
return out;
|
|
29
|
+
}
|
|
30
|
+
if (flag === '--days')
|
|
31
|
+
out.days = n;
|
|
32
|
+
else
|
|
33
|
+
out.keep = n;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
out.error = `unknown option ${a}`;
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
export function formatBytes(n) {
|
|
43
|
+
if (n < 1024)
|
|
44
|
+
return `${n} B`;
|
|
45
|
+
if (n < 1024 * 1024)
|
|
46
|
+
return `${(n / 1024).toFixed(1)} KB`;
|
|
47
|
+
if (n < 1024 * 1024 * 1024)
|
|
48
|
+
return `${(n / (1024 * 1024)).toFixed(1)} MB`;
|
|
49
|
+
return `${(n / (1024 * 1024 * 1024)).toFixed(2)} GB`;
|
|
50
|
+
}
|
|
51
|
+
/** Run gc; returns the process exit code. */
|
|
52
|
+
export async function runGc(argv, out = (s) => void process.stdout.write(s)) {
|
|
53
|
+
const args = parseGcArgs(argv);
|
|
54
|
+
if (args.help) {
|
|
55
|
+
out(GC_USAGE);
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
if (args.error) {
|
|
59
|
+
process.stderr.write(`swipium gc: ${args.error}\n\n${GC_USAGE}`);
|
|
60
|
+
return 2;
|
|
61
|
+
}
|
|
62
|
+
const r = await pruneSessionRuns({ days: args.days, keepPerProject: args.keep, dryRun: args.dryRun });
|
|
63
|
+
const projects = compactProjectRegistry({ dryRun: args.dryRun });
|
|
64
|
+
const verb = args.dryRun ? 'would delete' : 'deleted';
|
|
65
|
+
out(`swipium gc${args.dryRun ? ' (dry run)' : ''}: scanned ${r.scanned} session dir(s) under ${r.runsDir}\n` +
|
|
66
|
+
` ${verb} ${r.deleted.length} session dir(s) older than ${r.days} day(s) (not registered; newest ${r.keepPerProject} per project kept)\n` +
|
|
67
|
+
` ${args.dryRun ? 'reclaimable' : 'reclaimed'}: ${formatBytes(r.bytesReclaimed)}\n` +
|
|
68
|
+
` projects.json: ${projects.before} > ${projects.after} entr${projects.after === 1 ? 'y' : 'ies'}` +
|
|
69
|
+
`${projects.removed ? ` (${projects.removed} stale ${args.dryRun ? 'would be ' : ''}removed)` : ''}\n` +
|
|
70
|
+
(r.skipped ? ` prune skipped: ${r.skipped}\n` : '') +
|
|
71
|
+
(r.errors ? ` ${r.errors} entr${r.errors === 1 ? 'y' : 'ies'} could not be processed (see logs)\n` : ''));
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=gc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gc.js","sourceRoot":"","sources":["../../src/cli/gc.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/init.js
CHANGED
|
@@ -1,34 +1,171 @@
|
|
|
1
|
-
// `swipium init <client> [--apply] [--scope project|user|local]`
|
|
1
|
+
// `swipium init <client> [--apply] [--scope project|user|local] [--cwd <dir>]`
|
|
2
2
|
//
|
|
3
3
|
// Default = PREVIEW the exact registration (safe, no mutation). `--apply` executes it by
|
|
4
|
-
// DELEGATING to the client's own CLI where
|
|
5
|
-
// Codex's config.toml (
|
|
6
|
-
//
|
|
4
|
+
// DELEGATING to the client's own CLI where that is the documented path (claude/gemini
|
|
5
|
+
// `mcp add`), writing Codex's ~/.codex/config.toml (so the block carries cwd + timeouts, which
|
|
6
|
+
// `codex mcp add` cannot set), or merging a project file for Cursor (.cursor/mcp.json) and
|
|
7
|
+
// VS Code (.vscode/mcp.json). After a successful apply it runs `verify` (the server starts +
|
|
8
|
+
// tools inject).
|
|
7
9
|
//
|
|
8
|
-
//
|
|
10
|
+
// Portability: anything that lands in a TEAM-SHARED project file (`claude --scope project`,
|
|
11
|
+
// gemini project scope, .cursor/.vscode) uses `npx -y swipium`, never this machine's absolute
|
|
12
|
+
// node/script paths. Absolute paths are used only for machine-local registrations
|
|
13
|
+
// (claude local/user, gemini user, codex), and even then not when this process runs from the
|
|
14
|
+
// npx cache (that path is ephemeral).
|
|
15
|
+
//
|
|
16
|
+
// NOTE: this is the CLI path, not the MCP server, so writing to stdout is fine here.
|
|
9
17
|
import { spawnSync } from 'node:child_process';
|
|
10
|
-
import { existsSync, readFileSync, appendFileSync, mkdirSync } from 'node:fs';
|
|
18
|
+
import { existsSync, readFileSync, appendFileSync, mkdirSync, writeFileSync, statSync } from 'node:fs';
|
|
11
19
|
import { homedir } from 'node:os';
|
|
12
20
|
import { fileURLToPath } from 'node:url';
|
|
13
21
|
import { dirname, resolve, join } from 'node:path';
|
|
14
22
|
import { runVerify } from './verify.js';
|
|
15
23
|
import { initFlowTemplates } from '../flows/templates.js';
|
|
16
24
|
const SELF = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'index.js'); // dist/index.js
|
|
25
|
+
export const PORTABLE_COMMAND = { command: 'npx', args: ['-y', 'swipium'] };
|
|
26
|
+
/** True when `self` lives in npm's npx cache (…/_npx/…). An absolute path to it would rot. */
|
|
27
|
+
export function isEphemeralInstall(self = SELF) {
|
|
28
|
+
return self.split(/[\\/]/).includes('_npx');
|
|
29
|
+
}
|
|
30
|
+
/** The command a client should run: portable `npx -y swipium`, or this machine's node + script. */
|
|
31
|
+
export function serverCommand(portable, node = process.execPath, self = SELF) {
|
|
32
|
+
if (portable || isEphemeralInstall(self))
|
|
33
|
+
return { command: PORTABLE_COMMAND.command, args: [...PORTABLE_COMMAND.args] };
|
|
34
|
+
return { command: node, args: [self] };
|
|
35
|
+
}
|
|
17
36
|
/** A delegated CLI registration succeeded only if it both ran and exited 0. */
|
|
18
37
|
export function applyOk(r) {
|
|
19
38
|
return !r.error && r.status === 0;
|
|
20
39
|
}
|
|
21
|
-
|
|
22
|
-
|
|
40
|
+
/** Gemini settings.json entry (user scope: machine-local command + the app repo as cwd). */
|
|
41
|
+
export function geminiBlock(node, cwd, self = SELF) {
|
|
42
|
+
const c = serverCommand(false, node, self);
|
|
43
|
+
return ` "swipium": { "command": ${JSON.stringify(c.command)}, "args": ${JSON.stringify(c.args)}, "cwd": ${JSON.stringify(cwd)}, "timeout": 600000 }`;
|
|
44
|
+
}
|
|
45
|
+
/** Codex keeps servers in ~/.codex/config.toml; its defaults (10 s startup, 60 s per tool) are too
|
|
46
|
+
* short for `npx` first runs and for device work (builds, boots, flows). */
|
|
47
|
+
export function codexBlock(node, cwd, self = SELF) {
|
|
48
|
+
const c = serverCommand(false, node, self);
|
|
49
|
+
return [
|
|
50
|
+
'[mcp_servers.swipium]',
|
|
51
|
+
`command = ${JSON.stringify(c.command)}`,
|
|
52
|
+
`args = [${c.args.map((a) => JSON.stringify(a)).join(', ')}]`,
|
|
53
|
+
`cwd = ${JSON.stringify(cwd)}`,
|
|
54
|
+
'startup_timeout_sec = 30',
|
|
55
|
+
'tool_timeout_sec = 600',
|
|
56
|
+
].join('\n');
|
|
57
|
+
}
|
|
58
|
+
/** `claude mcp add` argv. Project scope writes the team-shared .mcp.json, so the command is portable. */
|
|
59
|
+
export function claudeAddArgs(scope, node = process.execPath, self = SELF) {
|
|
60
|
+
const c = serverCommand(scope === 'project', node, self);
|
|
61
|
+
return ['mcp', 'add', 'swipium', ...(scope !== 'local' ? ['--scope', scope] : []), '--', c.command, ...c.args];
|
|
62
|
+
}
|
|
63
|
+
/** `gemini mcp add` argv. Gemini's default scope is project (.gemini/settings.json), so it's portable. */
|
|
64
|
+
export function geminiAddArgs(scope, node = process.execPath, self = SELF) {
|
|
65
|
+
const user = scope === 'user';
|
|
66
|
+
const c = serverCommand(!user, node, self);
|
|
67
|
+
// Gemini's parser would read `-y` as its own flag: server args that start with "-" go after `--`
|
|
68
|
+
// (documented form: `gemini mcp add python-server python server.py -- --server-arg v`).
|
|
69
|
+
const rest = c.args.some((x) => x.startsWith('-')) ? ['--', ...c.args] : c.args;
|
|
70
|
+
return ['mcp', 'add', '--scope', user ? 'user' : 'project', 'swipium', c.command, ...rest];
|
|
71
|
+
}
|
|
72
|
+
/** Cursor: .cursor/mcp.json (`mcpServers`). ${workspaceFolder} is interpolated by Cursor. */
|
|
73
|
+
export function cursorEntry() {
|
|
74
|
+
return {
|
|
75
|
+
type: 'stdio',
|
|
76
|
+
command: PORTABLE_COMMAND.command,
|
|
77
|
+
args: [...PORTABLE_COMMAND.args],
|
|
78
|
+
env: { SWIPIUM_PROJECT_ROOT: '${workspaceFolder}' },
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/** VS Code: .vscode/mcp.json uses a top-level `servers` object (not `mcpServers`). */
|
|
82
|
+
export function vscodeEntry() {
|
|
83
|
+
return {
|
|
84
|
+
type: 'stdio',
|
|
85
|
+
command: PORTABLE_COMMAND.command,
|
|
86
|
+
args: [...PORTABLE_COMMAND.args],
|
|
87
|
+
env: { SWIPIUM_PROJECT_ROOT: '${workspaceFolder}' },
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Merge `swipium` into an existing JSON config under `topKey` WITHOUT touching anything else.
|
|
92
|
+
* Refuses (never overwrites) when the file isn't plain JSON (e.g. JSONC comments) or `topKey`
|
|
93
|
+
* isn't an object; leaves an existing `swipium` entry as-is.
|
|
94
|
+
*/
|
|
95
|
+
export function mergeServerJson(existing, topKey, entry) {
|
|
96
|
+
let doc = {};
|
|
97
|
+
if (existing !== null && existing.trim()) {
|
|
98
|
+
try {
|
|
99
|
+
const parsed = JSON.parse(existing);
|
|
100
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
101
|
+
return { status: 'invalid', reason: 'top level is not a JSON object' };
|
|
102
|
+
doc = parsed;
|
|
103
|
+
}
|
|
104
|
+
catch (e) {
|
|
105
|
+
return {
|
|
106
|
+
status: 'invalid',
|
|
107
|
+
reason: `not valid JSON (${e.message}); comments/trailing commas are not merged automatically`,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const cur = doc[topKey];
|
|
112
|
+
if (cur !== undefined && (typeof cur !== 'object' || cur === null || Array.isArray(cur))) {
|
|
113
|
+
return { status: 'invalid', reason: `"${topKey}" is not an object` };
|
|
114
|
+
}
|
|
115
|
+
const servers = { ...(cur ?? {}) };
|
|
116
|
+
if (Object.prototype.hasOwnProperty.call(servers, 'swipium'))
|
|
117
|
+
return { status: 'present' };
|
|
118
|
+
servers.swipium = entry;
|
|
119
|
+
return { status: 'added', json: `${JSON.stringify({ ...doc, [topKey]: servers }, null, 2)}\n` };
|
|
120
|
+
}
|
|
121
|
+
/** The app repo the server should run in: `--cwd <dir>` if given, else where init was invoked. */
|
|
122
|
+
export function resolveTargetCwd(args) {
|
|
123
|
+
const cwdIdx = args.indexOf('--cwd');
|
|
124
|
+
return resolve(cwdIdx >= 0 ? (args[cwdIdx + 1] ?? '') : process.cwd());
|
|
125
|
+
}
|
|
126
|
+
function isDir(p) {
|
|
127
|
+
try {
|
|
128
|
+
return statSync(p).isDirectory();
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
23
133
|
}
|
|
24
|
-
|
|
25
|
-
|
|
134
|
+
const CWD_NOTE = '(cwd should be your mobile app repo: run init from it, or pass --cwd <dir>)';
|
|
135
|
+
export const INIT_USAGE = 'Usage: swipium init <claude|codex|gemini|cursor|vscode> [--apply] [--scope local|user|project] [--cwd <dir>]\n' +
|
|
136
|
+
' swipium init flows [--root <dir>] [--force]\n' +
|
|
137
|
+
'Without --apply, prints the exact registration and changes nothing.\n';
|
|
138
|
+
/** Preview/apply a project-file registration (Cursor/VS Code). Returns false when refused. */
|
|
139
|
+
function projectFileInit(opts) {
|
|
140
|
+
const { label, file, topKey, entry, apply } = opts;
|
|
141
|
+
const snippet = JSON.stringify({ [topKey]: { swipium: entry } }, null, 2);
|
|
142
|
+
if (!apply) {
|
|
143
|
+
process.stdout.write(`Preview (run with --apply to merge into ${file}):\n${snippet}\n` +
|
|
144
|
+
`SWIPIUM_PROJECT_ROOT uses \${workspaceFolder}, which ${label} expands to the open folder.\n` +
|
|
145
|
+
(opts.extraPreview ?? ''));
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
const existing = existsSync(file) ? readFileSync(file, 'utf8') : null;
|
|
149
|
+
const merged = mergeServerJson(existing, topKey, entry);
|
|
150
|
+
if (merged.status === 'invalid') {
|
|
151
|
+
process.stdout.write(`Refusing to modify ${file}: ${merged.reason}.\nAdd this under "${topKey}" by hand:\n${snippet}\n`);
|
|
152
|
+
process.exitCode = 2;
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
if (merged.status === 'present') {
|
|
156
|
+
process.stdout.write(`Already present in ${file} (left unchanged).\n`);
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
mkdirSync(dirname(file), { recursive: true });
|
|
160
|
+
writeFileSync(file, merged.json);
|
|
161
|
+
process.stdout.write(`${existing === null ? 'Created' : 'Merged into'} ${file}\n`);
|
|
162
|
+
return true;
|
|
26
163
|
}
|
|
27
164
|
export async function runInit(args) {
|
|
28
165
|
const client = (args[0] ?? '').toLowerCase();
|
|
29
166
|
const apply = args.includes('--apply');
|
|
30
167
|
const scopeIdx = args.indexOf('--scope');
|
|
31
|
-
const scope = scopeIdx >= 0 ? args[scopeIdx + 1] : 'local';
|
|
168
|
+
const scope = scopeIdx >= 0 ? (args[scopeIdx + 1] ?? 'local') : 'local';
|
|
32
169
|
const node = process.execPath;
|
|
33
170
|
if (client === 'flows') {
|
|
34
171
|
const rootIdx = args.indexOf('--root');
|
|
@@ -42,15 +179,33 @@ export async function runInit(args) {
|
|
|
42
179
|
process.stdout.write('\nNext: edit selectors/variables, then validate with qa_flow_check and run with qa_flow_run from an MCP session.\n');
|
|
43
180
|
return;
|
|
44
181
|
}
|
|
45
|
-
if (
|
|
46
|
-
process.stdout.write(
|
|
182
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
183
|
+
process.stdout.write(INIT_USAGE);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
if (!['claude', 'gemini', 'codex', 'cursor', 'vscode'].includes(client)) {
|
|
187
|
+
process.stdout.write(INIT_USAGE);
|
|
188
|
+
process.exitCode = 2;
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
if (!['local', 'user', 'project'].includes(scope)) {
|
|
192
|
+
process.stdout.write(`Unknown --scope "${scope}" (expected local, user, or project).\n${INIT_USAGE}`);
|
|
47
193
|
process.exitCode = 2;
|
|
48
194
|
return;
|
|
49
195
|
}
|
|
196
|
+
const cwd = resolveTargetCwd(args);
|
|
197
|
+
const refuseMissingCwd = () => {
|
|
198
|
+
if (isDir(cwd))
|
|
199
|
+
return false;
|
|
200
|
+
process.stdout.write(`Refusing to apply: cwd ${cwd} does not exist. Run init from your mobile app repo or pass --cwd <dir>.\n`);
|
|
201
|
+
process.exitCode = 2;
|
|
202
|
+
return true;
|
|
203
|
+
};
|
|
50
204
|
if (client === 'claude') {
|
|
51
|
-
const cmd =
|
|
205
|
+
const cmd = claudeAddArgs(scope, node);
|
|
206
|
+
const shared = scope === 'project' ? '\n(project scope writes .mcp.json for your team, so it uses the portable `npx -y swipium`.)' : '';
|
|
52
207
|
if (apply) {
|
|
53
|
-
const r = spawnSync('claude', cmd, { stdio: 'inherit' });
|
|
208
|
+
const r = spawnSync('claude', cmd, { stdio: 'inherit', cwd: isDir(cwd) ? cwd : undefined });
|
|
54
209
|
if (!applyOk(r)) {
|
|
55
210
|
process.stdout.write(`claude registration failed (status ${r.status ?? 'n/a'}). Run manually:\n claude ${cmd.join(' ')}\n`);
|
|
56
211
|
}
|
|
@@ -60,15 +215,18 @@ export async function runInit(args) {
|
|
|
60
215
|
}
|
|
61
216
|
}
|
|
62
217
|
else {
|
|
63
|
-
process.stdout.write(`Preview (run with --apply to execute):\n claude ${cmd.join(' ')}\n`);
|
|
218
|
+
process.stdout.write(`Preview (run with --apply to execute):\n claude ${cmd.join(' ')}${shared}\n`);
|
|
64
219
|
}
|
|
65
220
|
}
|
|
66
221
|
else if (client === 'gemini') {
|
|
67
|
-
const cmd =
|
|
222
|
+
const cmd = geminiAddArgs(scope, node);
|
|
223
|
+
const manual = scope === 'user'
|
|
224
|
+
? `add to ~/.gemini/settings.json under "mcpServers":\n${geminiBlock(node, cwd)}\n${CWD_NOTE}`
|
|
225
|
+
: `add to ${join(cwd, '.gemini', 'settings.json')} under "mcpServers":\n "swipium": { "command": "npx", "args": ["-y", "swipium"], "timeout": 600000 }`;
|
|
68
226
|
if (apply) {
|
|
69
|
-
const r = spawnSync('gemini', cmd, { stdio: 'inherit' });
|
|
227
|
+
const r = spawnSync('gemini', cmd, { stdio: 'inherit', cwd: isDir(cwd) ? cwd : undefined });
|
|
70
228
|
if (!applyOk(r)) {
|
|
71
|
-
process.stdout.write(`gemini \`mcp add\`
|
|
229
|
+
process.stdout.write(`gemini \`mcp add\` failed or unavailable. Instead, ${manual}\n`);
|
|
72
230
|
}
|
|
73
231
|
else {
|
|
74
232
|
process.stdout.write('\nRegistered. Verifying…\n');
|
|
@@ -76,28 +234,61 @@ export async function runInit(args) {
|
|
|
76
234
|
}
|
|
77
235
|
}
|
|
78
236
|
else {
|
|
79
|
-
process.stdout.write(`Preview (run with --apply):\n gemini ${cmd.join(' ')}\nor
|
|
237
|
+
process.stdout.write(`Preview (run with --apply):\n gemini ${cmd.join(' ')}\nor ${manual}\n`);
|
|
80
238
|
}
|
|
81
239
|
}
|
|
82
|
-
else {
|
|
83
|
-
//
|
|
240
|
+
else if (client === 'codex') {
|
|
241
|
+
// Written to config.toml directly (rather than `codex mcp add`) so the block carries cwd and
|
|
242
|
+
// longer startup/tool timeouts, which `codex mcp add` has no flags for.
|
|
84
243
|
const cfg = join(homedir(), '.codex', 'config.toml');
|
|
85
|
-
const block = codexBlock(node);
|
|
244
|
+
const block = codexBlock(node, cwd);
|
|
245
|
+
const c = serverCommand(false, node);
|
|
246
|
+
const alt = ` codex mcp add swipium --env SWIPIUM_PROJECT_ROOT=${cwd} -- ${[c.command, ...c.args].join(' ')}\n (then add startup_timeout_sec = 30 and tool_timeout_sec = 600 under [mcp_servers.swipium] in ${cfg})`;
|
|
247
|
+
const caveat = '⚠ Codex Desktop threads may not expose tools from custom stdio MCP servers (openai/codex#19425, open). If the tools are missing in the Desktop app, try the Codex CLI.\n';
|
|
86
248
|
if (apply) {
|
|
249
|
+
if (refuseMissingCwd())
|
|
250
|
+
return;
|
|
87
251
|
mkdirSync(dirname(cfg), { recursive: true });
|
|
88
252
|
const cur = existsSync(cfg) ? readFileSync(cfg, 'utf8') : '';
|
|
89
253
|
if (cur.includes('[mcp_servers.swipium]')) {
|
|
90
|
-
process.stdout.write(`Already present in ${cfg}\n`);
|
|
254
|
+
process.stdout.write(`Already present in ${cfg} (left unchanged). Expected block:\n${block}\n`);
|
|
91
255
|
}
|
|
92
256
|
else {
|
|
93
257
|
appendFileSync(cfg, `\n${block}\n`);
|
|
94
258
|
process.stdout.write(`Appended to ${cfg}\n`);
|
|
95
259
|
}
|
|
96
|
-
process.stdout.write(
|
|
260
|
+
process.stdout.write(caveat + 'Server-side self-check:\n');
|
|
97
261
|
await runVerify();
|
|
98
262
|
}
|
|
99
263
|
else {
|
|
100
|
-
process.stdout.write(`
|
|
264
|
+
process.stdout.write(`Preview (run with --apply to append to ${cfg}):\n${block}\n${CWD_NOTE}\nor register with the Codex CLI:\n${alt}\n${caveat}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
else if (client === 'cursor' || client === 'vscode') {
|
|
268
|
+
const isCursor = client === 'cursor';
|
|
269
|
+
if (scope === 'user') {
|
|
270
|
+
process.stdout.write(`Note: init ${client} only writes the project file (${isCursor ? '.cursor/mcp.json' : '.vscode/mcp.json'}); ` +
|
|
271
|
+
(isCursor
|
|
272
|
+
? 'for all projects, add the same entry to ~/.cursor/mcp.json.\n'
|
|
273
|
+
: 'for your user profile use `code --add-mcp` (shown below).\n'));
|
|
274
|
+
}
|
|
275
|
+
if (apply && refuseMissingCwd())
|
|
276
|
+
return;
|
|
277
|
+
const ok = projectFileInit({
|
|
278
|
+
label: isCursor ? 'Cursor' : 'VS Code',
|
|
279
|
+
file: join(cwd, isCursor ? '.cursor' : '.vscode', 'mcp.json'),
|
|
280
|
+
topKey: isCursor ? 'mcpServers' : 'servers',
|
|
281
|
+
entry: isCursor ? cursorEntry() : vscodeEntry(),
|
|
282
|
+
apply,
|
|
283
|
+
extraPreview: isCursor
|
|
284
|
+
? undefined
|
|
285
|
+
: `or add it to your VS Code user profile:\n code --add-mcp '${JSON.stringify({ name: 'swipium', command: 'npx', args: ['-y', 'swipium'] })}'\n`,
|
|
286
|
+
});
|
|
287
|
+
if (!ok)
|
|
288
|
+
return;
|
|
289
|
+
if (apply) {
|
|
290
|
+
process.stdout.write(`Reload ${isCursor ? 'Cursor' : 'VS Code'} (or its MCP server list) to start Swipium. Server-side self-check:\n`);
|
|
291
|
+
await runVerify();
|
|
101
292
|
}
|
|
102
293
|
}
|
|
103
294
|
process.stdout.write('\nSelf-check anytime: swipium verify\n');
|