swipium 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +295 -0
- package/dist/appMap/automationLink.js +74 -0
- package/dist/appMap/automationLink.js.map +1 -0
- package/dist/appMap/build.js +193 -0
- package/dist/appMap/build.js.map +1 -0
- package/dist/appMap/codeIndex.js +73 -0
- package/dist/appMap/codeIndex.js.map +1 -0
- package/dist/appMap/featureModel.js +83 -0
- package/dist/appMap/featureModel.js.map +1 -0
- package/dist/appMap/firstRunApply.js +131 -0
- package/dist/appMap/firstRunApply.js.map +1 -0
- package/dist/appMap/fsWalk.js +75 -0
- package/dist/appMap/fsWalk.js.map +1 -0
- package/dist/appMap/issues.js +227 -0
- package/dist/appMap/issues.js.map +1 -0
- package/dist/appMap/migrations.js +87 -0
- package/dist/appMap/migrations.js.map +1 -0
- package/dist/appMap/prelaunch.js +66 -0
- package/dist/appMap/prelaunch.js.map +1 -0
- package/dist/appMap/projectRegistry.js +70 -0
- package/dist/appMap/projectRegistry.js.map +1 -0
- package/dist/appMap/provenance.js +52 -0
- package/dist/appMap/provenance.js.map +1 -0
- package/dist/appMap/query.js +118 -0
- package/dist/appMap/query.js.map +1 -0
- package/dist/appMap/runtimeMerge.js +207 -0
- package/dist/appMap/runtimeMerge.js.map +1 -0
- package/dist/appMap/schema.js +65 -0
- package/dist/appMap/schema.js.map +1 -0
- package/dist/appMap/screenMatch.js +75 -0
- package/dist/appMap/screenMatch.js.map +1 -0
- package/dist/appMap/staticScan.js +614 -0
- package/dist/appMap/staticScan.js.map +1 -0
- package/dist/appMap/store.js +173 -0
- package/dist/appMap/store.js.map +1 -0
- package/dist/appMap/tsAstScan.js +184 -0
- package/dist/appMap/tsAstScan.js.map +1 -0
- package/dist/artifacts/bundletool.js +199 -0
- package/dist/artifacts/bundletool.js.map +1 -0
- package/dist/artifacts/resolve.js +388 -0
- package/dist/artifacts/resolve.js.map +1 -0
- package/dist/automationGen/appiumModel.js +129 -0
- package/dist/automationGen/appiumModel.js.map +1 -0
- package/dist/automationGen/ciEmitter.js +80 -0
- package/dist/automationGen/ciEmitter.js.map +1 -0
- package/dist/automationGen/jsEmitter.js +440 -0
- package/dist/automationGen/jsEmitter.js.map +1 -0
- package/dist/automationGen/packagePatch.js +56 -0
- package/dist/automationGen/packagePatch.js.map +1 -0
- package/dist/automationGen/projectProfile.js +317 -0
- package/dist/automationGen/projectProfile.js.map +1 -0
- package/dist/automationGen/pythonEmitter.js +386 -0
- package/dist/automationGen/pythonEmitter.js.map +1 -0
- package/dist/automationGen/readmeEmitter.js +66 -0
- package/dist/automationGen/readmeEmitter.js.map +1 -0
- package/dist/automationGen/suitePlan.js +94 -0
- package/dist/automationGen/suitePlan.js.map +1 -0
- package/dist/automationGen/validation.js +150 -0
- package/dist/automationGen/validation.js.map +1 -0
- package/dist/build/parseBuildLog.js +119 -0
- package/dist/build/parseBuildLog.js.map +1 -0
- package/dist/build/plan.js +150 -0
- package/dist/build/plan.js.map +1 -0
- package/dist/ci/preflight.js +85 -0
- package/dist/ci/preflight.js.map +1 -0
- package/dist/cli/init.js +105 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/scan.js +85 -0
- package/dist/cli/scan.js.map +1 -0
- package/dist/cli/suite.js +85 -0
- package/dist/cli/suite.js.map +1 -0
- package/dist/cli/verify.js +62 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/consent/consent.js +43 -0
- package/dist/consent/consent.js.map +1 -0
- package/dist/context/detect.js +156 -0
- package/dist/context/detect.js.map +1 -0
- package/dist/context/findApps.js +198 -0
- package/dist/context/findApps.js.map +1 -0
- package/dist/context/projectRoot.js +41 -0
- package/dist/context/projectRoot.js.map +1 -0
- package/dist/context/scan.js +167 -0
- package/dist/context/scan.js.map +1 -0
- package/dist/core/target.js +115 -0
- package/dist/core/target.js.map +1 -0
- package/dist/core/targetPlan.js +140 -0
- package/dist/core/targetPlan.js.map +1 -0
- package/dist/drivers/DirectDriver.js +228 -0
- package/dist/drivers/DirectDriver.js.map +1 -0
- package/dist/drivers/Driver.js +4 -0
- package/dist/drivers/Driver.js.map +1 -0
- package/dist/drivers/SimctlDriver.js +127 -0
- package/dist/drivers/SimctlDriver.js.map +1 -0
- package/dist/drivers/WdaDriver.js +250 -0
- package/dist/drivers/WdaDriver.js.map +1 -0
- package/dist/explore/candidates.js +93 -0
- package/dist/explore/candidates.js.map +1 -0
- package/dist/explore/graph.js +116 -0
- package/dist/explore/graph.js.map +1 -0
- package/dist/explore/memory.js +35 -0
- package/dist/explore/memory.js.map +1 -0
- package/dist/explore/planner.js +105 -0
- package/dist/explore/planner.js.map +1 -0
- package/dist/explore/policy.js +85 -0
- package/dist/explore/policy.js.map +1 -0
- package/dist/explore/runner.js +475 -0
- package/dist/explore/runner.js.map +1 -0
- package/dist/explore/signatures.js +35 -0
- package/dist/explore/signatures.js.map +1 -0
- package/dist/explore/suite.js +55 -0
- package/dist/explore/suite.js.map +1 -0
- package/dist/featureTesting/executionBootstrap.js +140 -0
- package/dist/featureTesting/executionBootstrap.js.map +1 -0
- package/dist/firstRun/authStateMachine.js +83 -0
- package/dist/firstRun/authStateMachine.js.map +1 -0
- package/dist/firstRun/classifyScreen.js +201 -0
- package/dist/firstRun/classifyScreen.js.map +1 -0
- package/dist/firstRun/firstRunPlanner.js +207 -0
- package/dist/firstRun/firstRunPlanner.js.map +1 -0
- package/dist/firstRun/firstRunRunner.js +331 -0
- package/dist/firstRun/firstRunRunner.js.map +1 -0
- package/dist/firstRun/generatedDataPolicy.js +215 -0
- package/dist/firstRun/generatedDataPolicy.js.map +1 -0
- package/dist/firstRun/inputPlanner.js +67 -0
- package/dist/firstRun/inputPlanner.js.map +1 -0
- package/dist/firstRun/onboardingStateMachine.js +46 -0
- package/dist/firstRun/onboardingStateMachine.js.map +1 -0
- package/dist/firstRun/paywallPolicy.js +54 -0
- package/dist/firstRun/paywallPolicy.js.map +1 -0
- package/dist/firstRun/types.js +7 -0
- package/dist/firstRun/types.js.map +1 -0
- package/dist/fixtures/catalog.js +131 -0
- package/dist/fixtures/catalog.js.map +1 -0
- package/dist/flows/discover.js +18 -0
- package/dist/flows/discover.js.map +1 -0
- package/dist/flows/generate.js +211 -0
- package/dist/flows/generate.js.map +1 -0
- package/dist/flows/lint.js +97 -0
- package/dist/flows/lint.js.map +1 -0
- package/dist/flows/pack.js +68 -0
- package/dist/flows/pack.js.map +1 -0
- package/dist/flows/run.js +738 -0
- package/dist/flows/run.js.map +1 -0
- package/dist/flows/schema.js +240 -0
- package/dist/flows/schema.js.map +1 -0
- package/dist/flows/seedExec.js +108 -0
- package/dist/flows/seedExec.js.map +1 -0
- package/dist/flows/templates.js +155 -0
- package/dist/flows/templates.js.map +1 -0
- package/dist/flows/waitGuards.js +12 -0
- package/dist/flows/waitGuards.js.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/ios/signing.js +182 -0
- package/dist/ios/signing.js.map +1 -0
- package/dist/issues/classify.js +186 -0
- package/dist/issues/classify.js.map +1 -0
- package/dist/issues/fingerprint.js +130 -0
- package/dist/issues/fingerprint.js.map +1 -0
- package/dist/issues/index.js +240 -0
- package/dist/issues/index.js.map +1 -0
- package/dist/issues/metrics.js +155 -0
- package/dist/issues/metrics.js.map +1 -0
- package/dist/issues/recurrence.js +193 -0
- package/dist/issues/recurrence.js.map +1 -0
- package/dist/issues/report.js +110 -0
- package/dist/issues/report.js.map +1 -0
- package/dist/issues/reportBridge.js +119 -0
- package/dist/issues/reportBridge.js.map +1 -0
- package/dist/issues/schema.js +90 -0
- package/dist/issues/schema.js.map +1 -0
- package/dist/issues/sourceRevision.js +108 -0
- package/dist/issues/sourceRevision.js.map +1 -0
- package/dist/issues/store.js +155 -0
- package/dist/issues/store.js.map +1 -0
- package/dist/lib/android.js +278 -0
- package/dist/lib/android.js.map +1 -0
- package/dist/lib/commandTemplate.js +55 -0
- package/dist/lib/commandTemplate.js.map +1 -0
- package/dist/lib/coordSpace.js +23 -0
- package/dist/lib/coordSpace.js.map +1 -0
- package/dist/lib/device.js +87 -0
- package/dist/lib/device.js.map +1 -0
- package/dist/lib/gitignore.js +22 -0
- package/dist/lib/gitignore.js.map +1 -0
- package/dist/lib/image.js +97 -0
- package/dist/lib/image.js.map +1 -0
- package/dist/lib/logger.js +8 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/metroState.js +45 -0
- package/dist/lib/metroState.js.map +1 -0
- package/dist/lib/needsInput.js +201 -0
- package/dist/lib/needsInput.js.map +1 -0
- package/dist/lib/png.js +103 -0
- package/dist/lib/png.js.map +1 -0
- package/dist/lib/redact.js +21 -0
- package/dist/lib/redact.js.map +1 -0
- package/dist/lib/result.js +87 -0
- package/dist/lib/result.js.map +1 -0
- package/dist/lib/schemaHash.js +65 -0
- package/dist/lib/schemaHash.js.map +1 -0
- package/dist/lib/sensitive.js +13 -0
- package/dist/lib/sensitive.js.map +1 -0
- package/dist/lib/simctl.js +149 -0
- package/dist/lib/simctl.js.map +1 -0
- package/dist/lib/spawn.js +144 -0
- package/dist/lib/spawn.js.map +1 -0
- package/dist/lib/wda.js +347 -0
- package/dist/lib/wda.js.map +1 -0
- package/dist/lib/wdaConfig.js +69 -0
- package/dist/lib/wdaConfig.js.map +1 -0
- package/dist/lib/wdaTune.js +58 -0
- package/dist/lib/wdaTune.js.map +1 -0
- package/dist/oracle/auth.js +22 -0
- package/dist/oracle/auth.js.map +1 -0
- package/dist/oracle/failures.js +193 -0
- package/dist/oracle/failures.js.map +1 -0
- package/dist/oracle/health.js +123 -0
- package/dist/oracle/health.js.map +1 -0
- package/dist/oracle/record.js +36 -0
- package/dist/oracle/record.js.map +1 -0
- package/dist/orchestration/envelope.js +52 -0
- package/dist/orchestration/envelope.js.map +1 -0
- package/dist/orchestration/goal.js +98 -0
- package/dist/orchestration/goal.js.map +1 -0
- package/dist/plan/plan.js +124 -0
- package/dist/plan/plan.js.map +1 -0
- package/dist/prompts/index.js +63 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/report/artifactManifest.js +44 -0
- package/dist/report/artifactManifest.js.map +1 -0
- package/dist/report/coverage.js +60 -0
- package/dist/report/coverage.js.map +1 -0
- package/dist/report/evidence.js +84 -0
- package/dist/report/evidence.js.map +1 -0
- package/dist/report/export.js +447 -0
- package/dist/report/export.js.map +1 -0
- package/dist/report/flake.js +61 -0
- package/dist/report/flake.js.map +1 -0
- package/dist/report/history.js +564 -0
- package/dist/report/history.js.map +1 -0
- package/dist/report/policy.js +98 -0
- package/dist/report/policy.js.map +1 -0
- package/dist/report/qaLevel.js +96 -0
- package/dist/report/qaLevel.js.map +1 -0
- package/dist/report/readiness.js +213 -0
- package/dist/report/readiness.js.map +1 -0
- package/dist/report/summary.js +42 -0
- package/dist/report/summary.js.map +1 -0
- package/dist/report/testCatalog.js +93 -0
- package/dist/report/testCatalog.js.map +1 -0
- package/dist/report/timing.js +37 -0
- package/dist/report/timing.js.map +1 -0
- package/dist/server.js +180 -0
- package/dist/server.js.map +1 -0
- package/dist/services/automationGenerate.js +60 -0
- package/dist/services/automationGenerate.js.map +1 -0
- package/dist/services/build.js +66 -0
- package/dist/services/build.js.map +1 -0
- package/dist/services/preflight.js +51 -0
- package/dist/services/preflight.js.map +1 -0
- package/dist/services/prepareAndroid.js +183 -0
- package/dist/services/prepareAndroid.js.map +1 -0
- package/dist/services/prepareIos.js +162 -0
- package/dist/services/prepareIos.js.map +1 -0
- package/dist/services/report.js +537 -0
- package/dist/services/report.js.map +1 -0
- package/dist/services/smoke.js +120 -0
- package/dist/services/smoke.js.map +1 -0
- package/dist/services/suiteGenerate.js +123 -0
- package/dist/services/suiteGenerate.js.map +1 -0
- package/dist/services/testSuiteKnowledge.js +150 -0
- package/dist/services/testSuiteKnowledge.js.map +1 -0
- package/dist/session/attach.js +47 -0
- package/dist/session/attach.js.map +1 -0
- package/dist/session/progress.js +56 -0
- package/dist/session/progress.js.map +1 -0
- package/dist/session/store.js +329 -0
- package/dist/session/store.js.map +1 -0
- package/dist/snapshot/overlays.js +132 -0
- package/dist/snapshot/overlays.js.map +1 -0
- package/dist/snapshot/parse.js +204 -0
- package/dist/snapshot/parse.js.map +1 -0
- package/dist/snapshot/present.js +12 -0
- package/dist/snapshot/present.js.map +1 -0
- package/dist/snapshot/settle.js +36 -0
- package/dist/snapshot/settle.js.map +1 -0
- package/dist/state/profile.js +318 -0
- package/dist/state/profile.js.map +1 -0
- package/dist/suite/compile.js +176 -0
- package/dist/suite/compile.js.map +1 -0
- package/dist/suite/lint.js +45 -0
- package/dist/suite/lint.js.map +1 -0
- package/dist/suite/pom.js +285 -0
- package/dist/suite/pom.js.map +1 -0
- package/dist/suite/testcase.js +87 -0
- package/dist/suite/testcase.js.map +1 -0
- package/dist/testSuite/generator.js +222 -0
- package/dist/testSuite/generator.js.map +1 -0
- package/dist/testSuite/history.js +44 -0
- package/dist/testSuite/history.js.map +1 -0
- package/dist/testSuite/issueLinks.js +96 -0
- package/dist/testSuite/issueLinks.js.map +1 -0
- package/dist/testSuite/merge.js +190 -0
- package/dist/testSuite/merge.js.map +1 -0
- package/dist/testSuite/schema.js +86 -0
- package/dist/testSuite/schema.js.map +1 -0
- package/dist/testSuite/store.js +116 -0
- package/dist/testSuite/store.js.map +1 -0
- package/dist/testSuite/traceability.js +55 -0
- package/dist/testSuite/traceability.js.map +1 -0
- package/dist/tools/act.js +457 -0
- package/dist/tools/act.js.map +1 -0
- package/dist/tools/agent.js +225 -0
- package/dist/tools/agent.js.map +1 -0
- package/dist/tools/appMap.js +317 -0
- package/dist/tools/appMap.js.map +1 -0
- package/dist/tools/assertVisual.js +74 -0
- package/dist/tools/assertVisual.js.map +1 -0
- package/dist/tools/automationGenerate.js +394 -0
- package/dist/tools/automationGenerate.js.map +1 -0
- package/dist/tools/capabilities.js +114 -0
- package/dist/tools/capabilities.js.map +1 -0
- package/dist/tools/clearOverlay.js +150 -0
- package/dist/tools/clearOverlay.js.map +1 -0
- package/dist/tools/detectContext.js +41 -0
- package/dist/tools/detectContext.js.map +1 -0
- package/dist/tools/doctor.js +116 -0
- package/dist/tools/doctor.js.map +1 -0
- package/dist/tools/explore.js +289 -0
- package/dist/tools/explore.js.map +1 -0
- package/dist/tools/firstRun.js +136 -0
- package/dist/tools/firstRun.js.map +1 -0
- package/dist/tools/flow.js +331 -0
- package/dist/tools/flow.js.map +1 -0
- package/dist/tools/flowGenerate.js +55 -0
- package/dist/tools/flowGenerate.js.map +1 -0
- package/dist/tools/getArtifact.js +39 -0
- package/dist/tools/getArtifact.js.map +1 -0
- package/dist/tools/health.js +41 -0
- package/dist/tools/health.js.map +1 -0
- package/dist/tools/ios.js +492 -0
- package/dist/tools/ios.js.map +1 -0
- package/dist/tools/jobs.js +20 -0
- package/dist/tools/jobs.js.map +1 -0
- package/dist/tools/network.js +50 -0
- package/dist/tools/network.js.map +1 -0
- package/dist/tools/note.js +69 -0
- package/dist/tools/note.js.map +1 -0
- package/dist/tools/plan.js +49 -0
- package/dist/tools/plan.js.map +1 -0
- package/dist/tools/prepareIosTarget.js +99 -0
- package/dist/tools/prepareIosTarget.js.map +1 -0
- package/dist/tools/prepareTarget.js +257 -0
- package/dist/tools/prepareTarget.js.map +1 -0
- package/dist/tools/report.js +42 -0
- package/dist/tools/report.js.map +1 -0
- package/dist/tools/screenRecord.js +24 -0
- package/dist/tools/screenRecord.js.map +1 -0
- package/dist/tools/screenshot.js +63 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/smoke.js +39 -0
- package/dist/tools/smoke.js.map +1 -0
- package/dist/tools/snapshot.js +129 -0
- package/dist/tools/snapshot.js.map +1 -0
- package/dist/tools/startSession.js +169 -0
- package/dist/tools/startSession.js.map +1 -0
- package/dist/tools/state.js +87 -0
- package/dist/tools/state.js.map +1 -0
- package/dist/tools/suite.js +412 -0
- package/dist/tools/suite.js.map +1 -0
- package/dist/tools/testThis.js +774 -0
- package/dist/tools/testThis.js.map +1 -0
- package/dist/tools/wda.js +477 -0
- package/dist/tools/wda.js.map +1 -0
- package/dist/version.js +62 -0
- package/dist/version.js.map +1 -0
- package/dist/visual/ocr.js +72 -0
- package/dist/visual/ocr.js.map +1 -0
- package/dist/visual/provider.js +75 -0
- package/dist/visual/provider.js.map +1 -0
- package/docs/README.md +19 -0
- package/docs/assets/swipium-lockup-ink-on-light.png +0 -0
- package/docs/mcp-server.md +135 -0
- package/docs/tools.md +130 -0
- package/package.json +70 -0
package/dist/version.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// Single source of truth for the Swipium version and the public v1 tool surface. Used by the
|
|
2
|
+
// server identity, qa_doctor / qa_start_session, qa_capabilities, and `swipium verify`.
|
|
3
|
+
export const SWIPIUM_VERSION = '1.0.0';
|
|
4
|
+
export const TOOL_NAMES = [
|
|
5
|
+
'qa_agent_brief',
|
|
6
|
+
'qa_capabilities',
|
|
7
|
+
'qa_test_this',
|
|
8
|
+
'qa_job_status',
|
|
9
|
+
'qa_status',
|
|
10
|
+
'qa_explain_blocker',
|
|
11
|
+
'qa_continue_from_blocker',
|
|
12
|
+
'qa_get_artifact',
|
|
13
|
+
'qa_doctor',
|
|
14
|
+
'qa_start_session',
|
|
15
|
+
'qa_detect_context',
|
|
16
|
+
'qa_plan',
|
|
17
|
+
'qa_prepare_target',
|
|
18
|
+
'qa_prepare_ios_target',
|
|
19
|
+
'qa_ios',
|
|
20
|
+
'qa_wda',
|
|
21
|
+
'qa_snapshot',
|
|
22
|
+
'qa_act',
|
|
23
|
+
'qa_clear_overlay',
|
|
24
|
+
'qa_check_health',
|
|
25
|
+
'qa_screenshot',
|
|
26
|
+
'qa_note',
|
|
27
|
+
'qa_assert_visual',
|
|
28
|
+
'qa_smoke',
|
|
29
|
+
'qa_explore',
|
|
30
|
+
'qa_report',
|
|
31
|
+
'qa_app_map_build',
|
|
32
|
+
'qa_app_map_read',
|
|
33
|
+
'qa_app_map_query',
|
|
34
|
+
'qa_app_map_feature_scope',
|
|
35
|
+
'qa_app_map_validate',
|
|
36
|
+
'qa_flow_check',
|
|
37
|
+
'qa_flow_run',
|
|
38
|
+
'qa_flow_generate',
|
|
39
|
+
'qa_suite_generate',
|
|
40
|
+
'qa_suite_compile',
|
|
41
|
+
'qa_testcase_generate',
|
|
42
|
+
'qa_first_run_plan',
|
|
43
|
+
'qa_first_run_continue',
|
|
44
|
+
'qa_automation_plan',
|
|
45
|
+
'qa_automation_generate',
|
|
46
|
+
'qa_automation_validate',
|
|
47
|
+
];
|
|
48
|
+
export const TOOL_COUNT = TOOL_NAMES.length;
|
|
49
|
+
export const TOOL_NAME_SET = new Set(TOOL_NAMES);
|
|
50
|
+
/** MCP prompts (reusable workflow templates) — PHASE3-PLAN §3.3. */
|
|
51
|
+
export const PROMPT_NAMES = [
|
|
52
|
+
'swipium_setup_check',
|
|
53
|
+
'swipium_full_smoke',
|
|
54
|
+
'swipium_bug_repro',
|
|
55
|
+
'swipium_convert_run_to_flow',
|
|
56
|
+
];
|
|
57
|
+
export const PROMPT_COUNT = PROMPT_NAMES.length;
|
|
58
|
+
/** Shown when a client may be running an older build than what's installed on disk. */
|
|
59
|
+
export const STALE_CLIENT_HINT = `Swipium v${SWIPIUM_VERSION} exposes ${TOOL_COUNT} tools + ${PROMPT_COUNT} prompts. If your MCP client lists fewer ` +
|
|
60
|
+
`(e.g. qa_test_this / qa_plan / qa_flow_run / qa_ios missing), it is running a server ` +
|
|
61
|
+
`spawned before the upgrade. Restart the client to reload Swipium.`;
|
|
62
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,wFAAwF;AAExF,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC;AAEvC,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,gBAAgB;IAChB,iBAAiB;IACjB,cAAc;IACd,eAAe;IACf,WAAW;IACX,oBAAoB;IACpB,0BAA0B;IAC1B,iBAAiB;IACjB,WAAW;IACX,kBAAkB;IAClB,mBAAmB;IACnB,SAAS;IACT,mBAAmB;IACnB,uBAAuB;IACvB,QAAQ;IACR,QAAQ;IACR,aAAa;IACb,QAAQ;IACR,kBAAkB;IAClB,iBAAiB;IACjB,eAAe;IACf,SAAS;IACT,kBAAkB;IAClB,UAAU;IACV,YAAY;IACZ,WAAW;IACX,kBAAkB;IAClB,iBAAiB;IACjB,kBAAkB;IAClB,0BAA0B;IAC1B,qBAAqB;IACrB,eAAe;IACf,aAAa;IACb,kBAAkB;IAClB,mBAAmB;IACnB,kBAAkB;IAClB,sBAAsB;IACtB,mBAAmB;IACnB,uBAAuB;IACvB,oBAAoB;IACpB,wBAAwB;IACxB,wBAAwB;CAChB,CAAC;AAEX,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;AAC5C,MAAM,CAAC,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;AAEtE,oEAAoE;AACpE,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,qBAAqB;IACrB,oBAAoB;IACpB,mBAAmB;IACnB,6BAA6B;CACrB,CAAC;AAEX,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC;AAEhD,uFAAuF;AACvF,MAAM,CAAC,MAAM,iBAAiB,GAC5B,YAAY,eAAe,YAAY,UAAU,YAAY,YAAY,2CAA2C;IACpH,uFAAuF;IACvF,mEAAmE,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { rmSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { loadProjectConfig } from '../cli/scan.js';
|
|
5
|
+
import { captureCoordinateSpace, toDevicePoint } from '../lib/coordSpace.js';
|
|
6
|
+
import { maskScreenshotForProvider, runVisualProvider } from './provider.js';
|
|
7
|
+
export function configuredOcrCommand(root) {
|
|
8
|
+
const cfg = loadProjectConfig(root)?.ocrCommand;
|
|
9
|
+
return cfg ?? process.env.SWIPIUM_OCR_CMD;
|
|
10
|
+
}
|
|
11
|
+
export function parseOcrOutput(stdout) {
|
|
12
|
+
const trimmed = stdout.trim();
|
|
13
|
+
if (!trimmed)
|
|
14
|
+
return { text: '', regions: [] };
|
|
15
|
+
try {
|
|
16
|
+
const json = JSON.parse(trimmed);
|
|
17
|
+
const arr = Array.isArray(json) ? json : Array.isArray(json?.regions) ? json.regions : [];
|
|
18
|
+
const regions = arr
|
|
19
|
+
.map((r) => r)
|
|
20
|
+
.filter((r) => typeof r.text === 'string' && typeof r.confidence === 'number' && !!r.bbox && typeof r.bbox.x === 'number' && typeof r.bbox.y === 'number' && typeof r.bbox.width === 'number' && typeof r.bbox.height === 'number')
|
|
21
|
+
.map((r) => ({ ...r, coordinateSpace: 'screenshot_px' }));
|
|
22
|
+
const text = typeof json?.text === 'string' ? json.text : regions.map((r) => r.text).join('\n');
|
|
23
|
+
return { text, regions };
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return { text: trimmed, regions: [] };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export async function runOcr(driver, root, command) {
|
|
30
|
+
const png = await driver.screenshot();
|
|
31
|
+
const coordinateSpace = await captureCoordinateSpace(driver, png);
|
|
32
|
+
const imgPath = join(tmpdir(), `swipium-ocr-${Date.now()}.png`);
|
|
33
|
+
const cleanup = [imgPath];
|
|
34
|
+
try {
|
|
35
|
+
writeFileSync(imgPath, png);
|
|
36
|
+
const masking = await maskScreenshotForProvider(root, imgPath, { task: 'ocr' });
|
|
37
|
+
cleanup.push(...masking.tempPaths);
|
|
38
|
+
const { resolved, result } = await runVisualProvider(command, { image: masking.imagePath }, {
|
|
39
|
+
task: 'ocr',
|
|
40
|
+
imagePath: masking.imagePath,
|
|
41
|
+
coordinateSpace,
|
|
42
|
+
masking: { providerConfigured: masking.providerConfigured, masksApplied: masking.masksApplied },
|
|
43
|
+
}, 30000);
|
|
44
|
+
return {
|
|
45
|
+
...parseOcrOutput(result.stdout),
|
|
46
|
+
coordinateSpace,
|
|
47
|
+
provider: { io: resolved.io, argv: resolved.argv },
|
|
48
|
+
masking: { providerConfigured: masking.providerConfigured, masksApplied: masking.masksApplied },
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
for (const path of cleanup) {
|
|
53
|
+
try {
|
|
54
|
+
rmSync(path, { force: true });
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// best-effort cleanup
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export function findOcrRegion(result, query, minConfidence = 0.8) {
|
|
63
|
+
const q = query.toLowerCase();
|
|
64
|
+
const region = result.regions
|
|
65
|
+
.filter((r) => r.confidence >= minConfidence && r.text.toLowerCase().includes(q))
|
|
66
|
+
.sort((a, b) => b.confidence - a.confidence)[0];
|
|
67
|
+
if (!region)
|
|
68
|
+
return null;
|
|
69
|
+
const center = { x: region.bbox.x + region.bbox.width / 2, y: region.bbox.y + region.bbox.height / 2 };
|
|
70
|
+
return { region, devicePoint: toDevicePoint(result.coordinateSpace, center.x, center.y) };
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=ocr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ocr.js","sourceRoot":"","sources":["../../src/visual/ocr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { existsSync, rmSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { loadProjectConfig } from '../cli/scan.js';
|
|
5
|
+
import { resolveCommandTemplate } from '../lib/commandTemplate.js';
|
|
6
|
+
import { assertNoGitScope, run } from '../lib/spawn.js';
|
|
7
|
+
function isProviderObject(value) {
|
|
8
|
+
return !!value && typeof value === 'object' && !Array.isArray(value) && ('command' in value);
|
|
9
|
+
}
|
|
10
|
+
export function resolveVisualProvider(command, vars, defaultTimeoutMs) {
|
|
11
|
+
const raw = isProviderObject(command) ? command.command : command;
|
|
12
|
+
const resolved = resolveCommandTemplate(raw, vars);
|
|
13
|
+
assertNoGitScope(resolved.command, resolved.args);
|
|
14
|
+
const io = isProviderObject(command) && command.io === 'json' ? 'json' : 'argv';
|
|
15
|
+
const timeoutMs = isProviderObject(command) && Number.isFinite(command.timeoutMs) && command.timeoutMs > 0 ? Math.floor(command.timeoutMs) : defaultTimeoutMs;
|
|
16
|
+
return { ...resolved, io, timeoutMs };
|
|
17
|
+
}
|
|
18
|
+
export async function runVisualProvider(command, vars, payload, defaultTimeoutMs) {
|
|
19
|
+
const resolved = resolveVisualProvider(command, vars, defaultTimeoutMs);
|
|
20
|
+
const input = resolved.io === 'json' ? JSON.stringify({ schema: 'swipium.visual.provider.v1', ...payload }) + '\n' : undefined;
|
|
21
|
+
const result = await run(resolved.command, resolved.args, { timeoutMs: resolved.timeoutMs, input });
|
|
22
|
+
return { resolved, result };
|
|
23
|
+
}
|
|
24
|
+
export function configuredMaskCommand(root) {
|
|
25
|
+
const cfg = loadProjectConfig(root)?.visualMaskCommand;
|
|
26
|
+
return cfg ?? process.env.SWIPIUM_VISUAL_MASK_CMD;
|
|
27
|
+
}
|
|
28
|
+
export function resolveMaskProvider(root) {
|
|
29
|
+
const command = configuredMaskCommand(root);
|
|
30
|
+
return command ? resolveVisualProvider(command, { image: '<screenshot>', output: '<masked-screenshot>' }, 30000) : null;
|
|
31
|
+
}
|
|
32
|
+
export async function maskScreenshotForProvider(root, imagePath, context) {
|
|
33
|
+
const command = configuredMaskCommand(root);
|
|
34
|
+
if (!command)
|
|
35
|
+
return { imagePath, tempPaths: [], masksApplied: [], providerConfigured: false };
|
|
36
|
+
const outputPath = join(tmpdir(), `swipium-masked-${Date.now()}.png`);
|
|
37
|
+
const { result } = await runVisualProvider(command, { image: imagePath, output: outputPath }, {
|
|
38
|
+
task: 'mask_screenshot',
|
|
39
|
+
imagePath,
|
|
40
|
+
outputPath,
|
|
41
|
+
context,
|
|
42
|
+
}, 30000);
|
|
43
|
+
let parsed = {};
|
|
44
|
+
try {
|
|
45
|
+
parsed = JSON.parse(result.stdout.trim());
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
parsed = {};
|
|
49
|
+
}
|
|
50
|
+
const produced = typeof parsed.imagePath === 'string' && parsed.imagePath.trim() ? parsed.imagePath : outputPath;
|
|
51
|
+
if (!existsSync(produced)) {
|
|
52
|
+
rmSync(outputPath, { force: true });
|
|
53
|
+
throw new Error('visualMaskCommand did not produce a masked imagePath or output file');
|
|
54
|
+
}
|
|
55
|
+
const masksApplied = Array.isArray(parsed.masksApplied) ? parsed.masksApplied.filter((v) => typeof v === 'string') : ['external_mask'];
|
|
56
|
+
return { imagePath: produced, tempPaths: produced === imagePath ? [] : [produced], masksApplied, providerConfigured: true };
|
|
57
|
+
}
|
|
58
|
+
export function boundedProviderObject(value, redact, maxChars = 8000) {
|
|
59
|
+
const raw = redact(JSON.stringify(value)) ?? '{}';
|
|
60
|
+
const bounded = raw.length > maxChars ? raw.slice(0, maxChars) : raw;
|
|
61
|
+
try {
|
|
62
|
+
const parsed = JSON.parse(bounded);
|
|
63
|
+
if (raw.length > maxChars)
|
|
64
|
+
parsed.truncated = true;
|
|
65
|
+
return parsed;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return { text: bounded, truncated: raw.length > maxChars };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export function boundedText(value, redact, maxChars = 8000) {
|
|
72
|
+
const safe = redact(value) ?? '';
|
|
73
|
+
return { text: safe.slice(0, maxChars), truncated: safe.length > maxChars };
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/visual/provider.ts"],"names":[],"mappings":"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"}
|
package/docs/README.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Swipium Docs
|
|
2
|
+
|
|
3
|
+
This directory contains public v1 documentation for the Swipium MCP server.
|
|
4
|
+
|
|
5
|
+
## Index
|
|
6
|
+
|
|
7
|
+
- [MCP Server](mcp-server.md): server setup, client configuration, and agent integration.
|
|
8
|
+
- [Tool Reference](tools.md): public v1 MCP tools grouped by workflow.
|
|
9
|
+
|
|
10
|
+
## Scope
|
|
11
|
+
|
|
12
|
+
Swipium v1 is simulator-only:
|
|
13
|
+
|
|
14
|
+
- Android Emulator.
|
|
15
|
+
- iOS Simulator.
|
|
16
|
+
- Local MCP stdio server.
|
|
17
|
+
- Local artifacts and app-map memory.
|
|
18
|
+
|
|
19
|
+
Real devices, Jira integration, external ticket workflows, cloud execution, and certification are outside the public v1 scope.
|
|
Binary file
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# MCP Server
|
|
2
|
+
|
|
3
|
+
Swipium runs as a local stdio MCP server. The MCP client starts the process and sends tool calls over stdin and stdout.
|
|
4
|
+
|
|
5
|
+
## Requirements
|
|
6
|
+
|
|
7
|
+
- Node.js 20 or newer.
|
|
8
|
+
- A mobile app repository as the MCP `cwd`.
|
|
9
|
+
- Android Studio for Android Emulator workflows.
|
|
10
|
+
- Xcode for iOS Simulator workflows.
|
|
11
|
+
|
|
12
|
+
## Server Command
|
|
13
|
+
|
|
14
|
+
No global install:
|
|
15
|
+
|
|
16
|
+
```jsonc
|
|
17
|
+
{s
|
|
18
|
+
"mcpServers": {
|
|
19
|
+
"swipium": {
|
|
20
|
+
"command": "npx",
|
|
21
|
+
"args": ["-y", "swipium"],
|
|
22
|
+
"cwd": "/absolute/path/to/your/mobile-app",
|
|
23
|
+
"timeout": 600000
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Global install:
|
|
30
|
+
|
|
31
|
+
```jsonc
|
|
32
|
+
{
|
|
33
|
+
"mcpServers": {
|
|
34
|
+
"swipium": {
|
|
35
|
+
"command": "swipium",
|
|
36
|
+
"args": [],
|
|
37
|
+
"cwd": "/absolute/path/to/your/mobile-app",
|
|
38
|
+
"timeout": 600000
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Claude Code
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
npm install -g swipium
|
|
48
|
+
swipium init claude --apply --scope project
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
No global install:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
claude mcp add swipium --scope project -- npx -y swipium
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Gemini CLI
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
npm install -g swipium
|
|
61
|
+
swipium init gemini --apply
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
No global install:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
gemini mcp add swipium npx -y swipium
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Codex
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
npm install -g swipium
|
|
74
|
+
swipium init codex --apply
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Manual config:
|
|
78
|
+
|
|
79
|
+
```toml
|
|
80
|
+
[mcp_servers.swipium]
|
|
81
|
+
command = "npx"
|
|
82
|
+
args = ["-y", "swipium"]
|
|
83
|
+
cwd = "/absolute/path/to/your/mobile-app"
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Verification
|
|
87
|
+
|
|
88
|
+
Run:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
swipium verify
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Then, inside the MCP client, call:
|
|
95
|
+
|
|
96
|
+
```text
|
|
97
|
+
qa_doctor
|
|
98
|
+
qa_capabilities
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Expected v1 tool count: 42.
|
|
102
|
+
|
|
103
|
+
If the client lists fewer tools, restart the MCP client. MCP clients often keep an old server process alive after package upgrades.
|
|
104
|
+
|
|
105
|
+
## Artifacts
|
|
106
|
+
|
|
107
|
+
Swipium stores evidence as local artifacts and returns `swipium://` URIs. Use:
|
|
108
|
+
|
|
109
|
+
- `qa_get_artifact` to read an artifact by URI.
|
|
110
|
+
- `qa_report` to generate report artifacts.
|
|
111
|
+
- `qa_screenshot` to capture screenshot artifacts.
|
|
112
|
+
- `qa_app_map_read` to read app-map sections.
|
|
113
|
+
|
|
114
|
+
Images default to metadata through `qa_get_artifact`. Request inline mode only when pixels are needed.
|
|
115
|
+
|
|
116
|
+
## Consent
|
|
117
|
+
|
|
118
|
+
Swipium requests consent before high-impact local actions such as:
|
|
119
|
+
|
|
120
|
+
- Booting a simulator when required by the plan.
|
|
121
|
+
- Installing external app artifacts.
|
|
122
|
+
- Writing generated automation into a project directory.
|
|
123
|
+
- Running mutating flow steps.
|
|
124
|
+
|
|
125
|
+
The consent result includes a `consentId`. Re-call the same tool with `approve: true` and that `consentId` to continue.
|
|
126
|
+
|
|
127
|
+
## Simulator Scope
|
|
128
|
+
|
|
129
|
+
Public v1 supports:
|
|
130
|
+
|
|
131
|
+
- Android Emulator.
|
|
132
|
+
- iOS Simulator.
|
|
133
|
+
- Optional WebDriverAgent for structured iOS simulator automation.
|
|
134
|
+
|
|
135
|
+
Public v1 does not support real-device execution.
|
package/docs/tools.md
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# Tool Reference
|
|
2
|
+
|
|
3
|
+
Swipium v1 exposes 42 public MCP tools. The intended default entry point is `qa_test_this`.
|
|
4
|
+
|
|
5
|
+
## Start
|
|
6
|
+
|
|
7
|
+
Use these tools to orient the agent, start autopilot work, poll jobs, handle blockers, and fetch artifacts.
|
|
8
|
+
|
|
9
|
+
| Tool | What it does | Use when |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| `qa_agent_brief` | Returns the recommended orchestration rules for agents. | The agent needs the correct first call, polling behavior, report behavior, or blocker handling rules. |
|
|
12
|
+
| `qa_capabilities` | Lists the public v1 tool surface grouped by purpose. | The agent or user needs to discover available Swipium capabilities. |
|
|
13
|
+
| `qa_test_this` | Autopilot for "test it": resolves the project, finds or builds an artifact, prepares a simulator, runs smoke or exploration, reports results, and can generate suite output. | The user gives a low-context request such as "test this app". |
|
|
14
|
+
| `qa_job_status` | Polls a long-running job started by `qa_test_this` or prepare tools. | A tool returns a `jobId` with status `running`. |
|
|
15
|
+
| `qa_status` | Returns compact session status and recommended next action. | The agent needs to recover context during a session. |
|
|
16
|
+
| `qa_explain_blocker` | Explains a typed blocker, likely owner, and recovery path. | A run stops with a blocker and the user needs a concise explanation. |
|
|
17
|
+
| `qa_continue_from_blocker` | Resumes after user input and registers secret values for redaction. | A blocker asks for credentials, OTP, target choice, or approval data. |
|
|
18
|
+
| `qa_get_artifact` | Fetches artifact metadata or contents by `swipium://` URI. | A report, screenshot, dump, log, or generated file must be read. |
|
|
19
|
+
|
|
20
|
+
## Setup
|
|
21
|
+
|
|
22
|
+
Use these tools to verify the local environment, create sessions, and prepare simulator targets.
|
|
23
|
+
|
|
24
|
+
| Tool | What it does | Use when |
|
|
25
|
+
| --- | --- | --- |
|
|
26
|
+
| `qa_doctor` | Checks Node, Android tooling, emulator availability, AVDs, and stale-client symptoms. | Before the first run or when setup fails. |
|
|
27
|
+
| `qa_start_session` | Opens a project QA session with budget, response mode, fixtures, and sensitive mode. | Running lower-level tools directly instead of `qa_test_this`. |
|
|
28
|
+
| `qa_detect_context` | Detects framework, project readiness, artifacts, devices, and likely blockers. | The agent needs a preflight view before selecting a path. |
|
|
29
|
+
| `qa_plan` | Produces a safe workflow plan before acting. | The user asks for a plan or the agent needs a low-risk next step. |
|
|
30
|
+
| `qa_prepare_target` | Prepares an Android Emulator target, installs or launches an APK, and binds the session. | Testing Android on an emulator. |
|
|
31
|
+
| `qa_prepare_ios_target` | Boots an iOS Simulator, installs a simulator `.app` when provided, launches a bundle id, and reports visual or WDA mode. | Testing iOS on a simulator. |
|
|
32
|
+
| `qa_ios` | Runs iOS Simulator lifecycle operations such as boot, install, launch, screenshot, logs, privacy reset, and erase. | Direct iOS simulator control is needed. |
|
|
33
|
+
| `qa_wda` | Checks, builds, or starts WebDriverAgent for structured iOS simulator automation. | iOS needs structured UI tree access instead of visual-only checks. |
|
|
34
|
+
|
|
35
|
+
## Drive
|
|
36
|
+
|
|
37
|
+
Use these tools to observe the UI, act on it, collect evidence, and record results.
|
|
38
|
+
|
|
39
|
+
| Tool | What it does | Use when |
|
|
40
|
+
| --- | --- | --- |
|
|
41
|
+
| `qa_snapshot` | Captures compact structured UI elements where the backend supports it. | The agent needs selectors, visible text, or UI state. |
|
|
42
|
+
| `qa_act` | Taps, types, clears, swipes, scrolls, presses keys, opens URLs, waits, and observes after action. | The agent needs to drive the app step by step. |
|
|
43
|
+
| `qa_clear_overlay` | Attempts to dismiss common overlays blocking a target. | Popups, permissions, modals, or sheets block the next action. |
|
|
44
|
+
| `qa_check_health` | Checks foreground app status, crash signals, ANR, error boundaries, and native health. | The agent needs to distinguish app bugs from environment issues. |
|
|
45
|
+
| `qa_screenshot` | Captures a screenshot artifact with coordinate-space metadata. | Visual evidence is required. |
|
|
46
|
+
| `qa_note` | Records a structured QA outcome in the session. | The agent needs to log pass, fail, blocked, skipped, or finding details. |
|
|
47
|
+
| `qa_assert_visual` | Captures a visual assertion with evidence. | The agent needs to document that a visual condition is true or false. |
|
|
48
|
+
|
|
49
|
+
## Run
|
|
50
|
+
|
|
51
|
+
Use these tools to run broader QA workflows and produce reports.
|
|
52
|
+
|
|
53
|
+
| Tool | What it does | Use when |
|
|
54
|
+
| --- | --- | --- |
|
|
55
|
+
| `qa_smoke` | Runs launch smoke, baseline health, screenshot evidence, and saved flows. | The app is prepared and the agent needs a deterministic smoke pass. |
|
|
56
|
+
| `qa_explore` | Performs bounded guided exploration, builds a screen graph, and records evidence. | The agent needs to discover reachable workflows or collect runtime app-map data. |
|
|
57
|
+
| `qa_report` | Generates a session report with findings, blockers, evidence, mutations, workarounds, and next actions. | A run should be summarized or exported. |
|
|
58
|
+
|
|
59
|
+
## App Map
|
|
60
|
+
|
|
61
|
+
Use these tools to build and read Swipium's durable app knowledge map.
|
|
62
|
+
|
|
63
|
+
| Tool | What it does | Use when |
|
|
64
|
+
| --- | --- | --- |
|
|
65
|
+
| `qa_app_map_build` | Builds or updates the app map from static analysis and runtime observations. | The project needs durable QA memory. |
|
|
66
|
+
| `qa_app_map_read` | Reads compact app-map sections such as features, screens, auth, automation, or test suite. | The agent needs app context without flooding the transcript. |
|
|
67
|
+
| `qa_app_map_query` | Searches features, screens, tests, and code links with ranked results. | The user asks about a feature, screen, or test surface. |
|
|
68
|
+
| `qa_app_map_feature_scope` | Resolves a feature query or feature id into focused testing scope and recommended plan. | The agent needs to test a specific feature. |
|
|
69
|
+
| `qa_app_map_validate` | Validates schema, provenance, links, duplicate ids, impossible states, and stale fingerprints. | The map must be trusted before feature-focused testing. |
|
|
70
|
+
|
|
71
|
+
## Flows and Suites
|
|
72
|
+
|
|
73
|
+
Use these tools to create, validate, run, and compile reusable test assets.
|
|
74
|
+
|
|
75
|
+
| Tool | What it does | Use when |
|
|
76
|
+
| --- | --- | --- |
|
|
77
|
+
| `qa_flow_check` | Parses and statically validates a Swipium flow. | A flow file should be checked before execution. |
|
|
78
|
+
| `qa_flow_run` | Executes a Swipium flow against a prepared simulator session. | A saved flow needs to run against the app. |
|
|
79
|
+
| `qa_flow_generate` | Generates a flow from recorded actions. | A manual or exploratory run should become a reusable flow. |
|
|
80
|
+
| `qa_suite_generate` | Generates a POM-style suite from recorded behavior. | The run should become a structured test suite. |
|
|
81
|
+
| `qa_suite_compile` | Compiles a generated suite into runnable Swipium flows. | A generated suite needs executable flow output. |
|
|
82
|
+
| `qa_testcase_generate` | Generates test-case documentation from recorded behavior. | The run should produce human-readable test cases and steps. |
|
|
83
|
+
|
|
84
|
+
## First Run
|
|
85
|
+
|
|
86
|
+
Use these tools for login, account creation, onboarding, permissions, OTP, and paywall screens.
|
|
87
|
+
|
|
88
|
+
| Tool | What it does | Use when |
|
|
89
|
+
| --- | --- | --- |
|
|
90
|
+
| `qa_first_run_plan` | Classifies the current first-run screen and creates a safe plan without acting. | The agent reaches login, signup, onboarding, permission, OTP, paywall, or home screens. |
|
|
91
|
+
| `qa_first_run_continue` | Executes bounded first-run steps with safe generated data when allowed and stops at gates. | The plan can safely proceed in a test or staging environment. |
|
|
92
|
+
|
|
93
|
+
## Automation
|
|
94
|
+
|
|
95
|
+
Use these tools to generate and validate automation code from Swipium evidence.
|
|
96
|
+
|
|
97
|
+
| Tool | What it does | Use when |
|
|
98
|
+
| --- | --- | --- |
|
|
99
|
+
| `qa_automation_plan` | Plans generated JS, TS, or Python Appium automation from project profile and recorded actions. | The user asks to automate the tested behavior. |
|
|
100
|
+
| `qa_automation_generate` | Generates an Appium POM suite from recorded actions and validates it. | The run should produce automation code. |
|
|
101
|
+
| `qa_automation_validate` | Validates generated automation code without a device. | Generated files need checks for secrets, durability, capabilities, syntax, and empty files. |
|
|
102
|
+
|
|
103
|
+
## Recommended Entry Points
|
|
104
|
+
|
|
105
|
+
| User intent | First tool |
|
|
106
|
+
| --- | --- |
|
|
107
|
+
| "Test it" | `qa_test_this` |
|
|
108
|
+
| "Check setup" | `qa_doctor` |
|
|
109
|
+
| "Start a manual run" | `qa_start_session` |
|
|
110
|
+
| "Launch Android" | `qa_prepare_target` |
|
|
111
|
+
| "Launch iOS" | `qa_prepare_ios_target` |
|
|
112
|
+
| "Smoke test" | `qa_smoke` |
|
|
113
|
+
| "Explore the app" | `qa_explore` |
|
|
114
|
+
| "Generate report" | `qa_report` |
|
|
115
|
+
| "Read app memory" | `qa_app_map_read` |
|
|
116
|
+
| "Create a flow" | `qa_flow_generate` |
|
|
117
|
+
| "Generate automation" | `qa_automation_plan` |
|
|
118
|
+
|
|
119
|
+
## Extension Pattern
|
|
120
|
+
|
|
121
|
+
When adding tools in future releases, document each tool with:
|
|
122
|
+
|
|
123
|
+
- Name.
|
|
124
|
+
- Group.
|
|
125
|
+
- What it does.
|
|
126
|
+
- When to use it.
|
|
127
|
+
- Main inputs.
|
|
128
|
+
- Main outputs.
|
|
129
|
+
- Scope limits.
|
|
130
|
+
- Consent or mutation behavior.
|
package/package.json
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "swipium",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "Swipium MCP server for simulator-based mobile QA workflows, evidence capture, app maps, and generated test suites.",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"mcp",
|
|
8
|
+
"model-context-protocol",
|
|
9
|
+
"mobile-testing",
|
|
10
|
+
"qa-automation",
|
|
11
|
+
"android-emulator",
|
|
12
|
+
"ios-simulator",
|
|
13
|
+
"appium",
|
|
14
|
+
"ai-agents",
|
|
15
|
+
"test-automation",
|
|
16
|
+
"e2e-testing",
|
|
17
|
+
"react-native-testing",
|
|
18
|
+
"flutter-testing",
|
|
19
|
+
"app-map",
|
|
20
|
+
"test-suites",
|
|
21
|
+
"developer-tools"
|
|
22
|
+
],
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"type": "module",
|
|
25
|
+
"bin": {
|
|
26
|
+
"swipium": "dist/index.js"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist",
|
|
30
|
+
"docs"
|
|
31
|
+
],
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=20"
|
|
34
|
+
},
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/geropalombo/swipium.git"
|
|
38
|
+
},
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/geropalombo/swipium/issues"
|
|
41
|
+
},
|
|
42
|
+
"homepage": "https://github.com/geropalombo/swipium",
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
},
|
|
46
|
+
"scripts": {
|
|
47
|
+
"build": "tsc && chmod +x dist/index.js",
|
|
48
|
+
"dev": "tsc -w",
|
|
49
|
+
"start": "node dist/index.js",
|
|
50
|
+
"verify": "npm run build && node dist/index.js verify",
|
|
51
|
+
"typecheck": "tsc --noEmit",
|
|
52
|
+
"test": "vitest run",
|
|
53
|
+
"audit:prod": "npm audit --omit=dev --audit-level=moderate",
|
|
54
|
+
"release:check": "npm run typecheck && npm test && npm run audit:prod && npm pack --dry-run",
|
|
55
|
+
"prepack": "npm run build",
|
|
56
|
+
"prepublishOnly": "npm run build",
|
|
57
|
+
"inspector": "npm run build && npx @modelcontextprotocol/inspector node dist/index.js"
|
|
58
|
+
},
|
|
59
|
+
"dependencies": {
|
|
60
|
+
"@modelcontextprotocol/sdk": "^1.19.1",
|
|
61
|
+
"fast-xml-parser": "^5.8.0",
|
|
62
|
+
"yaml": "^2.9.0",
|
|
63
|
+
"zod": "^3.25.76"
|
|
64
|
+
},
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@types/node": "^22.10.2",
|
|
67
|
+
"typescript": "^5.7.2",
|
|
68
|
+
"vitest": "^4.1.7"
|
|
69
|
+
}
|
|
70
|
+
}
|