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.
Files changed (96) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +33 -82
  3. package/dist/cli.js +236 -7
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config.d.ts +43 -17
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +17 -0
  8. package/dist/config.js.map +1 -1
  9. package/dist/driver/artifacts.d.ts +17 -0
  10. package/dist/driver/artifacts.d.ts.map +1 -0
  11. package/dist/driver/artifacts.js +40 -0
  12. package/dist/driver/artifacts.js.map +1 -0
  13. package/dist/driver/diagnosis.d.ts +9 -0
  14. package/dist/driver/diagnosis.d.ts.map +1 -0
  15. package/dist/driver/diagnosis.js +72 -0
  16. package/dist/driver/diagnosis.js.map +1 -0
  17. package/dist/driver/doctor.d.ts +6 -0
  18. package/dist/driver/doctor.d.ts.map +1 -1
  19. package/dist/driver/doctor.js +20 -0
  20. package/dist/driver/doctor.js.map +1 -1
  21. package/dist/driver/exec.d.ts +1 -0
  22. package/dist/driver/exec.d.ts.map +1 -1
  23. package/dist/driver/exec.js +3 -0
  24. package/dist/driver/exec.js.map +1 -1
  25. package/dist/driver/flow-io.d.ts +8 -0
  26. package/dist/driver/flow-io.d.ts.map +1 -0
  27. package/dist/driver/flow-io.js +128 -0
  28. package/dist/driver/flow-io.js.map +1 -0
  29. package/dist/driver/flows.d.ts +3 -0
  30. package/dist/driver/flows.d.ts.map +1 -0
  31. package/dist/driver/flows.js +20 -0
  32. package/dist/driver/flows.js.map +1 -0
  33. package/dist/driver/logs.d.ts +33 -0
  34. package/dist/driver/logs.d.ts.map +1 -0
  35. package/dist/driver/logs.js +199 -0
  36. package/dist/driver/logs.js.map +1 -0
  37. package/dist/driver/maestro.d.ts +22 -2
  38. package/dist/driver/maestro.d.ts.map +1 -1
  39. package/dist/driver/maestro.js +139 -21
  40. package/dist/driver/maestro.js.map +1 -1
  41. package/dist/driver/metro.d.ts +5 -0
  42. package/dist/driver/metro.d.ts.map +1 -0
  43. package/dist/driver/metro.js +57 -0
  44. package/dist/driver/metro.js.map +1 -0
  45. package/dist/driver/screenshot.d.ts +3 -1
  46. package/dist/driver/screenshot.d.ts.map +1 -1
  47. package/dist/driver/screenshot.js +10 -1
  48. package/dist/driver/screenshot.js.map +1 -1
  49. package/dist/driver/simulator.d.ts +3 -0
  50. package/dist/driver/simulator.d.ts.map +1 -0
  51. package/dist/driver/simulator.js +66 -0
  52. package/dist/driver/simulator.js.map +1 -0
  53. package/dist/errors.d.ts +2 -2
  54. package/dist/errors.d.ts.map +1 -1
  55. package/dist/errors.js +2 -1
  56. package/dist/errors.js.map +1 -1
  57. package/dist/index.d.ts +21 -8
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +16 -7
  60. package/dist/index.js.map +1 -1
  61. package/dist/mcp/resources.d.ts +15 -0
  62. package/dist/mcp/resources.d.ts.map +1 -0
  63. package/dist/mcp/resources.js +31 -0
  64. package/dist/mcp/resources.js.map +1 -0
  65. package/dist/mcp/serialize-result.d.ts +20 -0
  66. package/dist/mcp/serialize-result.d.ts.map +1 -0
  67. package/dist/mcp/serialize-result.js +61 -0
  68. package/dist/mcp/serialize-result.js.map +1 -0
  69. package/dist/mcp/tools/definitions.d.ts +7 -0
  70. package/dist/mcp/tools/definitions.d.ts.map +1 -0
  71. package/dist/mcp/tools/definitions.js +181 -0
  72. package/dist/mcp/tools/definitions.js.map +1 -0
  73. package/dist/mcp/tools/handlers.d.ts +5 -0
  74. package/dist/mcp/tools/handlers.d.ts.map +1 -0
  75. package/dist/mcp/tools/handlers.js +132 -0
  76. package/dist/mcp/tools/handlers.js.map +1 -0
  77. package/dist/mcp/tools.d.ts +3 -11
  78. package/dist/mcp/tools.d.ts.map +1 -1
  79. package/dist/mcp/tools.js +2 -151
  80. package/dist/mcp/tools.js.map +1 -1
  81. package/dist/mcp-server.js +15 -5
  82. package/dist/mcp-server.js.map +1 -1
  83. package/dist/results/format.d.ts +16 -0
  84. package/dist/results/format.d.ts.map +1 -0
  85. package/dist/results/format.js +95 -0
  86. package/dist/results/format.js.map +1 -0
  87. package/dist/results/types.d.ts +95 -0
  88. package/dist/results/types.d.ts.map +1 -0
  89. package/dist/results/types.js +5 -0
  90. package/dist/results/types.js.map +1 -0
  91. package/dist/runtime.d.ts +26 -4
  92. package/dist/runtime.d.ts.map +1 -1
  93. package/dist/runtime.js +110 -10
  94. package/dist/runtime.js.map +1 -1
  95. package/mobile-agent.config.example.json +5 -0
  96. 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
- Drive **iOS simulators, Android emulators, and USB devices** from Cursor, Claude, Codex, or a shell. Maestro runs your flows; this package handles the host side: list devices, screenshots, deep links, `adb reverse`, per-repo config.
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
- No Expo or Flutter lock-in. Your Maestro YAML and env vars live in your project.
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
- You need Node 20+, [Maestro](https://maestro.mobile.dev/), Xcode on macOS for iOS, and `adb` for Android.
13
+ Requires Node 20+, [Maestro](https://maestro.mobile.dev/), Xcode (iOS), `adb` (Android).
14
14
 
15
15
  ## Config
16
16
 
17
- Put `mobile-agent.config.json` in the repo root. Example: [`mobile-agent.config.example.json`](mobile-agent.config.example.json).
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
- ## CLI
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
- Flags: `--project-root`, `--flows-dir`, `--screenshot-dir`.
21
+ ## MCP tools
63
22
 
64
- ## MCP
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
- ```bash
67
- mobile-agent-mcp
68
- ```
34
+ Resource: `mobile-agent://screenshot/latest`
69
35
 
70
- | Tool | What it does |
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
- Local checkout: point at `dist/mcp-server.js` instead of `npx`.
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
- const agent = createRuntime();
109
- agent.doctor();
110
- agent.screenshot('ios');
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
- ## Roadmap
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
- .action((_args, command) => {
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, _args, command) => {
120
+ .action((platform, options, command) => {
70
121
  try {
71
- printResult(createCliRuntime(command).screenshot(platform));
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
- printResult(createCliRuntime(command).runFlow(flow, platform, parseEnvPairs(options.env)));
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
- printResult(createCliRuntime(command).runSmoke(platform, parseEnvPairs(options.env)));
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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"}