mobile-agent-mcp 0.1.1 → 1.0.1
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 +50 -0
- package/README.md +33 -82
- package/dist/cli.js +236 -7
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +43 -17
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -1
- package/dist/driver/artifacts.d.ts +17 -0
- package/dist/driver/artifacts.d.ts.map +1 -0
- package/dist/driver/artifacts.js +40 -0
- package/dist/driver/artifacts.js.map +1 -0
- package/dist/driver/diagnosis.d.ts +9 -0
- package/dist/driver/diagnosis.d.ts.map +1 -0
- package/dist/driver/diagnosis.js +72 -0
- package/dist/driver/diagnosis.js.map +1 -0
- package/dist/driver/doctor.d.ts +6 -0
- package/dist/driver/doctor.d.ts.map +1 -1
- package/dist/driver/doctor.js +20 -0
- package/dist/driver/doctor.js.map +1 -1
- package/dist/driver/exec.d.ts +1 -0
- package/dist/driver/exec.d.ts.map +1 -1
- package/dist/driver/exec.js +3 -0
- package/dist/driver/exec.js.map +1 -1
- package/dist/driver/flow-io.d.ts +8 -0
- package/dist/driver/flow-io.d.ts.map +1 -0
- package/dist/driver/flow-io.js +128 -0
- package/dist/driver/flow-io.js.map +1 -0
- package/dist/driver/flows.d.ts +3 -0
- package/dist/driver/flows.d.ts.map +1 -0
- package/dist/driver/flows.js +20 -0
- package/dist/driver/flows.js.map +1 -0
- package/dist/driver/logs.d.ts +33 -0
- package/dist/driver/logs.d.ts.map +1 -0
- package/dist/driver/logs.js +199 -0
- package/dist/driver/logs.js.map +1 -0
- package/dist/driver/maestro.d.ts +22 -2
- package/dist/driver/maestro.d.ts.map +1 -1
- package/dist/driver/maestro.js +139 -21
- package/dist/driver/maestro.js.map +1 -1
- package/dist/driver/metro.d.ts +5 -0
- package/dist/driver/metro.d.ts.map +1 -0
- package/dist/driver/metro.js +57 -0
- package/dist/driver/metro.js.map +1 -0
- package/dist/driver/screenshot.d.ts +3 -1
- package/dist/driver/screenshot.d.ts.map +1 -1
- package/dist/driver/screenshot.js +10 -1
- package/dist/driver/screenshot.js.map +1 -1
- package/dist/driver/simulator.d.ts +3 -0
- package/dist/driver/simulator.d.ts.map +1 -0
- package/dist/driver/simulator.js +66 -0
- package/dist/driver/simulator.js.map +1 -0
- package/dist/errors.d.ts +2 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +2 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +21 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -7
- package/dist/index.js.map +1 -1
- package/dist/mcp/resources.d.ts +15 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +31 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/serialize-result.d.ts +20 -0
- package/dist/mcp/serialize-result.d.ts.map +1 -0
- package/dist/mcp/serialize-result.js +61 -0
- package/dist/mcp/serialize-result.js.map +1 -0
- package/dist/mcp/tools/definitions.d.ts +7 -0
- package/dist/mcp/tools/definitions.d.ts.map +1 -0
- package/dist/mcp/tools/definitions.js +181 -0
- package/dist/mcp/tools/definitions.js.map +1 -0
- package/dist/mcp/tools/handlers.d.ts +5 -0
- package/dist/mcp/tools/handlers.d.ts.map +1 -0
- package/dist/mcp/tools/handlers.js +132 -0
- package/dist/mcp/tools/handlers.js.map +1 -0
- package/dist/mcp/tools.d.ts +3 -11
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +2 -151
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp-server.js +15 -5
- package/dist/mcp-server.js.map +1 -1
- package/dist/results/format.d.ts +16 -0
- package/dist/results/format.d.ts.map +1 -0
- package/dist/results/format.js +95 -0
- package/dist/results/format.js.map +1 -0
- package/dist/results/types.d.ts +95 -0
- package/dist/results/types.d.ts.map +1 -0
- package/dist/results/types.js +5 -0
- package/dist/results/types.js.map +1 -0
- package/dist/runtime.d.ts +26 -4
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +110 -10
- package/dist/runtime.js.map +1 -1
- package/mobile-agent.config.example.json +5 -0
- package/package.json +8 -4
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,52 @@
|
|
|
3
3
|
All notable changes are documented here. This project follows [Semantic Versioning](https://semver.org):
|
|
4
4
|
`MAJOR.MINOR.PATCH`: breaking, feature, or fix.
|
|
5
5
|
|
|
6
|
+
## [1.0.1] - 2026-07-20
|
|
7
|
+
|
|
8
|
+
### Fixed
|
|
9
|
+
|
|
10
|
+
- Removed third party library references from docs.
|
|
11
|
+
- Replaced em dashes in documentation.
|
|
12
|
+
|
|
13
|
+
## [1.0.0] - 2026-07-20
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- Structured MCP responses with `schemaVersion: 1` envelope for all tools.
|
|
18
|
+
- Inline PNG screenshots in MCP tool responses plus `mobile-agent://screenshot/latest` resource.
|
|
19
|
+
- `run_flow_with_context` MCP tool and `mobile-agent run-with-context` CLI.
|
|
20
|
+
- RN-specific failure diagnosis (`metro_unreachable`, `js_error`, `element_not_found`, etc.).
|
|
21
|
+
- Lifecycle tools: `metro_status`, `reload_app`, `boot_simulator`.
|
|
22
|
+
- Flow tools: `validate_flow`, `write_flow` (path traversal blocked).
|
|
23
|
+
- `collect_logs` MCP tool with bounded `durationMs` polling (max 10s).
|
|
24
|
+
- CLI `--json` for doctor, logs, screenshot, run, run-with-context, run-all, metro, reload, boot-simulator, validate-flow, write-flow.
|
|
25
|
+
- Example configs: `examples/expo.config.json`, `examples/bare-rn.config.json`.
|
|
26
|
+
- Docs: `docs/mcp-response-schema.md`.
|
|
27
|
+
- npm publish workflow with provenance on tag push.
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
|
|
31
|
+
- MCP tools return JSON envelopes instead of plain text (CLI human output unchanged).
|
|
32
|
+
- `run_maestro_flow` and `run_smoke_flows` return structured results in MCP.
|
|
33
|
+
- `doctor` MCP returns `DoctorResult` with `blockers` array.
|
|
34
|
+
- `tail_logs` returns `LogSnapshot` objects in MCP envelope.
|
|
35
|
+
- Bumped to v1.0.0 as production-ready agent loop.
|
|
36
|
+
|
|
37
|
+
## [0.2.0] - 2026-05-30
|
|
38
|
+
|
|
39
|
+
### Added
|
|
40
|
+
|
|
41
|
+
- `tail_logs` MCP tool and `mobile-agent logs` CLI (Metro, logcat, iOS sim).
|
|
42
|
+
- Config `log` block: `androidPackage`, `metroPort`, `filters`.
|
|
43
|
+
- `list_flows` / `mobile-agent list-flows` to discover Maestro flows.
|
|
44
|
+
- `doctor --json` for scriptable checks.
|
|
45
|
+
- Doctor WARN checks for log sources when `log` is configured.
|
|
46
|
+
|
|
47
|
+
### Changed
|
|
48
|
+
|
|
49
|
+
- README: quick start section.
|
|
50
|
+
- Removed deprecated `MobileAgentRuntime` / `MobileAgentError` exports.
|
|
51
|
+
|
|
6
52
|
## [0.1.1] - 2026-05-30
|
|
7
53
|
|
|
8
54
|
### Added
|
|
@@ -10,6 +56,7 @@ All notable changes are documented here. This project follows [Semantic Versioni
|
|
|
10
56
|
- Driver unit tests (Maestro arg building, adb reverse, open-url) with a mocked `spawnSync`.
|
|
11
57
|
- Biome for lint + format; `pnpm lint`, `pnpm format`, and `pnpm check` now gate on it.
|
|
12
58
|
- `CONTRIBUTING.md` with SemVer policy and release steps.
|
|
59
|
+
- CODEOWNERS and GitHub Actions CI.
|
|
13
60
|
|
|
14
61
|
### Fixed
|
|
15
62
|
|
|
@@ -28,5 +75,8 @@ All notable changes are documented here. This project follows [Semantic Versioni
|
|
|
28
75
|
- Per-repo `mobile-agent.config.json` with upward discovery and env overrides.
|
|
29
76
|
- Typed errors with stable exit codes and Zod-validated config.
|
|
30
77
|
|
|
78
|
+
[1.0.1]: https://github.com/anthonysbr/mobile-agent-mcp/compare/v1.0.0...v1.0.1
|
|
79
|
+
[1.0.0]: https://github.com/anthonysbr/mobile-agent-mcp/compare/v0.2.0...v1.0.0
|
|
80
|
+
[0.2.0]: https://github.com/anthonysbr/mobile-agent-mcp/compare/v0.1.1...v0.2.0
|
|
31
81
|
[0.1.1]: https://github.com/anthonysbr/mobile-agent-mcp/compare/v0.1.0...v0.1.1
|
|
32
82
|
[0.1.0]: https://github.com/anthonysbr/mobile-agent-mcp/releases/tag/v0.1.0
|
package/README.md
CHANGED
|
@@ -1,82 +1,39 @@
|
|
|
1
1
|
# mobile-agent-mcp
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
MCP + CLI for iOS sims, Android emulators, and USB devices. Maestro runs flows; this handles config, doctor, logs, screenshots, RN diagnosis, and Expo/Android host plumbing.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
## Install
|
|
5
|
+
## Quick start
|
|
8
6
|
|
|
9
7
|
```bash
|
|
10
8
|
npm install -D mobile-agent-mcp
|
|
9
|
+
mobile-agent doctor
|
|
10
|
+
mobile-agent run-with-context smoke-login ios --json
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Requires Node 20+, [Maestro](https://maestro.mobile.dev/), Xcode (iOS), `adb` (Android).
|
|
14
14
|
|
|
15
15
|
## Config
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
```json
|
|
20
|
-
{
|
|
21
|
-
"projectRoot": ".",
|
|
22
|
-
"flowsDir": "e2e/maestro/flows",
|
|
23
|
-
"screenshotDir": "artifacts/mobile-screenshots",
|
|
24
|
-
"smokeFlows": ["smoke-login", "smoke-logout"],
|
|
25
|
-
"maestro": {
|
|
26
|
-
"bin": "maestro",
|
|
27
|
-
"defaultEnv": { "APP_ID": "com.example.app" }
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Optional `devServerUrl` builds something like `exp://192.168.x.x:8081` for Maestro and `open-dev-url`:
|
|
33
|
-
|
|
34
|
-
```json
|
|
35
|
-
"devServerUrl": {
|
|
36
|
-
"scheme": "exp",
|
|
37
|
-
"port": 8081,
|
|
38
|
-
"hostEnv": "EXPO_DEV_HOST",
|
|
39
|
-
"outputEnvKey": "EXPO_URL"
|
|
40
|
-
}
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
Env overrides: `MOBILE_AGENT_PROJECT_ROOT`, `MOBILE_AGENT_FLOWS_DIR`, `MOBILE_AGENT_SCREENSHOT_DIR`, `MAESTRO_BIN`, `MAESTRO_DEVICE`.
|
|
44
|
-
|
|
45
|
-
If MCP starts from a random cwd, set `MOBILE_AGENT_PROJECT_ROOT` to your repo path.
|
|
46
|
-
|
|
47
|
-
Run `mobile-agent doctor` before a long session. Saves guessing why nothing boots.
|
|
17
|
+
`mobile-agent.config.json` in repo root. See [`mobile-agent.config.example.json`](mobile-agent.config.example.json), [`examples/expo.config.json`](examples/expo.config.json), [`examples/bare-rn.config.json`](examples/bare-rn.config.json).
|
|
48
18
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
mobile-agent doctor
|
|
53
|
-
mobile-agent devices
|
|
54
|
-
mobile-agent screenshot ios
|
|
55
|
-
mobile-agent run my-flow ios -e APP_ID=com.example.app
|
|
56
|
-
mobile-agent run-all ios
|
|
57
|
-
mobile-agent adb-reverse 8081 4000
|
|
58
|
-
mobile-agent open-url "myapp://home" ios
|
|
59
|
-
mobile-agent open-dev-url ios
|
|
60
|
-
```
|
|
19
|
+
Set `MOBILE_AGENT_PROJECT_ROOT` if MCP starts from the wrong cwd.
|
|
61
20
|
|
|
62
|
-
|
|
21
|
+
## MCP tools
|
|
63
22
|
|
|
64
|
-
|
|
23
|
+
| Tool | Purpose |
|
|
24
|
+
|------|---------|
|
|
25
|
+
| `doctor` | Preflight checks |
|
|
26
|
+
| `run_flow_with_context` | Flow + logs + screenshot + diagnosis |
|
|
27
|
+
| `run_maestro_flow` / `run_smoke_flows` | Flow execution |
|
|
28
|
+
| `screenshot` | PNG + inline image |
|
|
29
|
+
| `collect_logs` / `tail_logs` | Metro, logcat, sim logs |
|
|
30
|
+
| `metro_status` / `reload_app` / `boot_simulator` | Dev lifecycle |
|
|
31
|
+
| `validate_flow` / `write_flow` | Flow authoring |
|
|
32
|
+
| `adb_reverse` / `open_url` / `open_dev_url` | RN/Expo plumbing |
|
|
65
33
|
|
|
66
|
-
|
|
67
|
-
mobile-agent-mcp
|
|
68
|
-
```
|
|
34
|
+
Resource: `mobile-agent://screenshot/latest`
|
|
69
35
|
|
|
70
|
-
|
|
71
|
-
|------|----------------|
|
|
72
|
-
| `doctor` | Config, flows dir, Maestro, adb/simctl |
|
|
73
|
-
| `list_devices` | Sims, USB, Maestro version |
|
|
74
|
-
| `screenshot` | PNG path |
|
|
75
|
-
| `run_maestro_flow` | One flow from `flowsDir` |
|
|
76
|
-
| `run_smoke_flows` | All `smokeFlows` |
|
|
77
|
-
| `adb_reverse` | USB Android → localhost ports |
|
|
78
|
-
| `open_url` | Any deep link |
|
|
79
|
-
| `open_dev_url` | URL from config |
|
|
36
|
+
Responses: [`docs/mcp-response-schema.md`](docs/mcp-response-schema.md). Agent loop: [`docs/agent-skill.md`](docs/agent-skill.md).
|
|
80
37
|
|
|
81
38
|
**Cursor** (`.cursor/mcp.json`):
|
|
82
39
|
|
|
@@ -86,30 +43,24 @@ mobile-agent-mcp
|
|
|
86
43
|
"mobile-agent": {
|
|
87
44
|
"command": "npx",
|
|
88
45
|
"args": ["-y", "mobile-agent-mcp"],
|
|
89
|
-
"env": {
|
|
90
|
-
"MOBILE_AGENT_PROJECT_ROOT": "/absolute/path/to/your/project"
|
|
91
|
-
}
|
|
46
|
+
"env": { "MOBILE_AGENT_PROJECT_ROOT": "/absolute/path/to/your/project" }
|
|
92
47
|
}
|
|
93
48
|
}
|
|
94
49
|
}
|
|
95
50
|
```
|
|
96
51
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
Claude Desktop: same block in `~/Library/Application Support/Claude/claude_desktop_config.json`.
|
|
100
|
-
|
|
101
|
-
No MCP? Shell works fine. See [`docs/agent-skill.md`](docs/agent-skill.md).
|
|
102
|
-
|
|
103
|
-
## Programmatic use
|
|
104
|
-
|
|
105
|
-
```ts
|
|
106
|
-
import { createRuntime } from 'mobile-agent-mcp';
|
|
52
|
+
## CLI
|
|
107
53
|
|
|
108
|
-
|
|
109
|
-
agent
|
|
110
|
-
agent
|
|
54
|
+
```bash
|
|
55
|
+
mobile-agent doctor [--json]
|
|
56
|
+
mobile-agent run-with-context <flow> [ios|android] [--json]
|
|
57
|
+
mobile-agent run-all [ios|android] [--json]
|
|
58
|
+
mobile-agent logs [ios|android] [--json] [--duration-ms 3000]
|
|
59
|
+
mobile-agent screenshot [ios|android] [--json]
|
|
60
|
+
mobile-agent metro-status | reload-app | boot-simulator [--json]
|
|
61
|
+
mobile-agent validate-flow <flow> | write-flow <flow> [--template smoke] [--json]
|
|
62
|
+
mobile-agent adb-reverse 8081
|
|
63
|
+
mobile-agent open-dev-url [ios|android]
|
|
111
64
|
```
|
|
112
65
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
[`ROADMAP.md`](ROADMAP.md): next up **`tail_logs`** (Metro, logcat, iOS sim logs).
|
|
66
|
+
Flags: `--project-root`, `--flows-dir`, `--screenshot-dir`.
|
package/dist/cli.js
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { Command } from 'commander';
|
|
4
|
-
import { parseEnvPairs, parsePorts } from './config.js';
|
|
4
|
+
import { parseEnvPairs, parseLogSource, parsePorts } from './config.js';
|
|
5
5
|
import { formatError, getExitCode } from './errors.js';
|
|
6
|
+
import { flowContextEnvelope, flowRunEnvelope, smokeRunEnvelope } from './results/format.js';
|
|
7
|
+
import { envelope } from './results/types.js';
|
|
6
8
|
import { createRuntime } from './runtime.js';
|
|
7
9
|
import { PACKAGE_NAME, PACKAGE_VERSION } from './version.js';
|
|
8
10
|
function printResult(text) {
|
|
9
11
|
process.stdout.write(`${text}\n`);
|
|
10
12
|
}
|
|
13
|
+
function printJson(value) {
|
|
14
|
+
process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
|
|
15
|
+
}
|
|
11
16
|
function printError(error) {
|
|
12
17
|
process.stderr.write(`[${PACKAGE_NAME}] ${formatError(error)}\n`);
|
|
13
18
|
process.exit(getExitCode(error));
|
|
@@ -39,10 +44,11 @@ function createCliRuntime(command) {
|
|
|
39
44
|
program
|
|
40
45
|
.command('doctor')
|
|
41
46
|
.description('Sanity check before running flows')
|
|
42
|
-
.
|
|
47
|
+
.option('--json', 'Print JSON instead of text')
|
|
48
|
+
.action((options, command) => {
|
|
43
49
|
try {
|
|
44
50
|
const runtime = createCliRuntime(command);
|
|
45
|
-
printResult(runtime.doctor());
|
|
51
|
+
printResult(options.json ? runtime.doctorJson() : runtime.doctor());
|
|
46
52
|
if (runtime.doctorFailed()) {
|
|
47
53
|
process.exit(4);
|
|
48
54
|
}
|
|
@@ -62,13 +68,64 @@ program
|
|
|
62
68
|
printError(error);
|
|
63
69
|
}
|
|
64
70
|
});
|
|
71
|
+
program
|
|
72
|
+
.command('list-flows')
|
|
73
|
+
.description('List Maestro flow names in flowsDir')
|
|
74
|
+
.action((_args, command) => {
|
|
75
|
+
try {
|
|
76
|
+
printResult(createCliRuntime(command).listFlows());
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
printError(error);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
program
|
|
83
|
+
.command('logs')
|
|
84
|
+
.argument('[platform]', 'ios or android', 'ios')
|
|
85
|
+
.option('--lines <n>', 'Number of lines to return', '100')
|
|
86
|
+
.option('--source <source>', 'metro, logcat, sim, or auto', 'auto')
|
|
87
|
+
.option('--follow', 'Stream logs until Ctrl+C')
|
|
88
|
+
.option('--json', 'Print JSON log snapshot')
|
|
89
|
+
.option('--duration-ms <n>', 'Bounded collect duration (max 10000)')
|
|
90
|
+
.description('Tail Metro, logcat, or iOS sim logs')
|
|
91
|
+
.action(async (platform, options, command) => {
|
|
92
|
+
try {
|
|
93
|
+
const runtime = createCliRuntime(command);
|
|
94
|
+
const source = parseLogSource(options.source);
|
|
95
|
+
const lines = Number(options.lines);
|
|
96
|
+
if (options.follow) {
|
|
97
|
+
const code = await runtime.tailLogsFollow(platform, source);
|
|
98
|
+
process.exit(code === 0 ? 0 : 6);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const durationMs = Number(options.durationMs);
|
|
102
|
+
const snapshot = Number.isFinite(durationMs) && durationMs > 0
|
|
103
|
+
? await runtime.collectLogs(platform, source, Number.isFinite(lines) ? lines : 100, durationMs)
|
|
104
|
+
: runtime.tailLogsSnapshot(platform, source, Number.isFinite(lines) ? lines : 100);
|
|
105
|
+
if (options.json) {
|
|
106
|
+
printJson(envelope(true, `Collected ${snapshot.lineCount} log line(s)`, snapshot));
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
printResult(runtime.tailLogs(platform, source, Number.isFinite(lines) ? lines : 100));
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
printError(error);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
65
115
|
program
|
|
66
116
|
.command('screenshot')
|
|
67
117
|
.argument('[platform]', 'ios or android', 'ios')
|
|
118
|
+
.option('--json', 'Print JSON result')
|
|
68
119
|
.description('PNG to screenshotDir; prints path')
|
|
69
|
-
.action((platform,
|
|
120
|
+
.action((platform, options, command) => {
|
|
70
121
|
try {
|
|
71
|
-
|
|
122
|
+
const runtime = createCliRuntime(command);
|
|
123
|
+
const result = runtime.screenshot(platform);
|
|
124
|
+
if (options.json) {
|
|
125
|
+
printJson(envelope(true, `Screenshot saved: ${result.path}`, result));
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
printResult(result.path);
|
|
72
129
|
}
|
|
73
130
|
catch (error) {
|
|
74
131
|
printError(error);
|
|
@@ -79,10 +136,52 @@ program
|
|
|
79
136
|
.argument('<flow>', 'Maestro flow name or path relative to flowsDir')
|
|
80
137
|
.argument('[platform]', 'ios or android', 'ios')
|
|
81
138
|
.option('-e, --env <pair...>', 'Maestro env var KEY=VALUE')
|
|
139
|
+
.option('--json', 'Print JSON result')
|
|
82
140
|
.description('Run one Maestro flow')
|
|
83
141
|
.action((flow, platform, options, command) => {
|
|
84
142
|
try {
|
|
85
|
-
|
|
143
|
+
const runtime = createCliRuntime(command);
|
|
144
|
+
const result = runtime.runFlow(flow, platform, parseEnvPairs(options.env));
|
|
145
|
+
if (options.json) {
|
|
146
|
+
printJson(flowRunEnvelope(result));
|
|
147
|
+
if (!result.ok) {
|
|
148
|
+
process.exit(6);
|
|
149
|
+
}
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
printResult(runtime.formatFlowRun(result));
|
|
153
|
+
if (!result.ok) {
|
|
154
|
+
process.exit(6);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
printError(error);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
program
|
|
162
|
+
.command('run-with-context')
|
|
163
|
+
.argument('<flow>', 'Maestro flow name or path relative to flowsDir')
|
|
164
|
+
.argument('[platform]', 'ios or android', 'ios')
|
|
165
|
+
.option('-e, --env <pair...>', 'Maestro env var KEY=VALUE')
|
|
166
|
+
.option('--log-lines <n>', 'Log lines to attach', '80')
|
|
167
|
+
.option('--json', 'Print JSON result')
|
|
168
|
+
.description('Run one flow with logs, screenshot, and diagnosis')
|
|
169
|
+
.action((flow, platform, options, command) => {
|
|
170
|
+
try {
|
|
171
|
+
const runtime = createCliRuntime(command);
|
|
172
|
+
const logLines = Number(options.logLines);
|
|
173
|
+
const result = runtime.runFlowWithContext(flow, platform, parseEnvPairs(options.env), Number.isFinite(logLines) ? logLines : 80);
|
|
174
|
+
if (options.json) {
|
|
175
|
+
printJson(flowContextEnvelope(result));
|
|
176
|
+
if (!result.ok) {
|
|
177
|
+
process.exit(6);
|
|
178
|
+
}
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
printResult(runtime.formatFlowContext(result));
|
|
182
|
+
if (!result.ok) {
|
|
183
|
+
process.exit(6);
|
|
184
|
+
}
|
|
86
185
|
}
|
|
87
186
|
catch (error) {
|
|
88
187
|
printError(error);
|
|
@@ -92,10 +191,140 @@ program
|
|
|
92
191
|
.command('run-all')
|
|
93
192
|
.argument('[platform]', 'ios or android', 'ios')
|
|
94
193
|
.option('-e, --env <pair...>', 'Maestro env var KEY=VALUE')
|
|
194
|
+
.option('--json', 'Print JSON result')
|
|
95
195
|
.description('Run every flow in smokeFlows from config')
|
|
96
196
|
.action((platform, options, command) => {
|
|
97
197
|
try {
|
|
98
|
-
|
|
198
|
+
const runtime = createCliRuntime(command);
|
|
199
|
+
const result = runtime.runSmoke(platform, parseEnvPairs(options.env));
|
|
200
|
+
if (options.json) {
|
|
201
|
+
printJson(smokeRunEnvelope(result));
|
|
202
|
+
if (!result.readyForCommit) {
|
|
203
|
+
process.exit(6);
|
|
204
|
+
}
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
printResult(runtime.formatSmokeRun(result));
|
|
208
|
+
if (!result.readyForCommit) {
|
|
209
|
+
process.exit(6);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
printError(error);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
program
|
|
217
|
+
.command('metro-status')
|
|
218
|
+
.option('--json', 'Print JSON result')
|
|
219
|
+
.description('Check Metro reachability')
|
|
220
|
+
.action((options, command) => {
|
|
221
|
+
try {
|
|
222
|
+
const runtime = createCliRuntime(command);
|
|
223
|
+
const result = runtime.metroStatus();
|
|
224
|
+
if (options.json) {
|
|
225
|
+
printJson(envelope(result.reachable, result.reachable ? 'Metro reachable' : 'Metro down', result));
|
|
226
|
+
process.exit(result.reachable ? 0 : 6);
|
|
227
|
+
}
|
|
228
|
+
printResult(result.reachable
|
|
229
|
+
? `Metro reachable on :${result.port}`
|
|
230
|
+
: `Metro not reachable on :${result.port}`);
|
|
231
|
+
if (!result.reachable) {
|
|
232
|
+
process.exit(6);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
printError(error);
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
program
|
|
240
|
+
.command('reload-app')
|
|
241
|
+
.option('--json', 'Print JSON result')
|
|
242
|
+
.description('Reload app via Metro')
|
|
243
|
+
.action((options, command) => {
|
|
244
|
+
try {
|
|
245
|
+
const runtime = createCliRuntime(command);
|
|
246
|
+
const result = runtime.reloadApp();
|
|
247
|
+
if (options.json) {
|
|
248
|
+
printJson(envelope(result.reloaded, result.message, result));
|
|
249
|
+
process.exit(result.reloaded ? 0 : 6);
|
|
250
|
+
}
|
|
251
|
+
printResult(result.message);
|
|
252
|
+
if (!result.reloaded) {
|
|
253
|
+
process.exit(6);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
printError(error);
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
program
|
|
261
|
+
.command('boot-simulator')
|
|
262
|
+
.argument('[deviceName]', 'Simulator device name')
|
|
263
|
+
.option('--json', 'Print JSON result')
|
|
264
|
+
.description('Boot an iOS simulator')
|
|
265
|
+
.action((deviceName, options, command) => {
|
|
266
|
+
try {
|
|
267
|
+
const runtime = createCliRuntime(command);
|
|
268
|
+
const result = runtime.bootSimulator(deviceName);
|
|
269
|
+
if (options.json) {
|
|
270
|
+
printJson(envelope(result.booted, result.message, result));
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
printResult(result.message);
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
printError(error);
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
program
|
|
280
|
+
.command('validate-flow')
|
|
281
|
+
.argument('<flow>', 'Flow name under flowsDir')
|
|
282
|
+
.option('--json', 'Print JSON result')
|
|
283
|
+
.description('Validate a Maestro flow file')
|
|
284
|
+
.action((flow, options, command) => {
|
|
285
|
+
try {
|
|
286
|
+
const runtime = createCliRuntime(command);
|
|
287
|
+
const result = runtime.validateFlow(flow);
|
|
288
|
+
if (options.json) {
|
|
289
|
+
printJson(envelope(result.valid, result.valid ? 'Flow valid' : 'Flow invalid', result));
|
|
290
|
+
if (!result.valid) {
|
|
291
|
+
process.exit(6);
|
|
292
|
+
}
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
printResult(result.valid
|
|
296
|
+
? `${result.flowPath} is valid (${result.method})`
|
|
297
|
+
: `${result.flowPath} invalid:\n${result.issues.join('\n')}`);
|
|
298
|
+
if (!result.valid) {
|
|
299
|
+
process.exit(6);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
printError(error);
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
program
|
|
307
|
+
.command('write-flow')
|
|
308
|
+
.argument('<flow>', 'Flow name under flowsDir')
|
|
309
|
+
.option('--content <yaml>', 'YAML content')
|
|
310
|
+
.option('--template <name>', 'login, deeplink, or smoke')
|
|
311
|
+
.option('--overwrite', 'Overwrite existing flow')
|
|
312
|
+
.option('--json', 'Print JSON result')
|
|
313
|
+
.description('Write a Maestro flow under flowsDir')
|
|
314
|
+
.action((flow, options, command) => {
|
|
315
|
+
try {
|
|
316
|
+
const runtime = createCliRuntime(command);
|
|
317
|
+
const template = options.template === 'login' ||
|
|
318
|
+
options.template === 'deeplink' ||
|
|
319
|
+
options.template === 'smoke'
|
|
320
|
+
? options.template
|
|
321
|
+
: undefined;
|
|
322
|
+
const result = runtime.writeFlow(flow, options.content, template, options.overwrite === true);
|
|
323
|
+
if (options.json) {
|
|
324
|
+
printJson(envelope(result.written, `Wrote ${result.flowPath}`, result));
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
printResult(result.flowPath);
|
|
99
328
|
}
|
|
100
329
|
catch (error) {
|
|
101
330
|
printError(error);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|