tapflow 0.12.0 → 0.14.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/README.md +28 -57
- package/dist/commands/flow-run.d.ts +13 -0
- package/dist/commands/flow-run.d.ts.map +1 -0
- package/dist/commands/flow-run.js +141 -0
- package/dist/commands/flow-run.js.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -1
- package/package.json +6 -5
package/README.md
CHANGED
|
@@ -8,6 +8,14 @@
|
|
|
8
8
|
Your builds, streams, and recordings stay on infrastructure you control.
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
|
+
<p>
|
|
12
|
+
<strong>No WebDriverAgent</strong>
|
|
13
|
+
·
|
|
14
|
+
<strong>2-line setup</strong>
|
|
15
|
+
·
|
|
16
|
+
<strong>Self-hosted · Free · MIT</strong>
|
|
17
|
+
</p>
|
|
18
|
+
|
|
11
19
|
<p>
|
|
12
20
|
<a href="https://github.com/jo-duchan/tapflow/blob/main/LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="MIT License" /></a>
|
|
13
21
|
<a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-%3E%3D20-brightgreen" alt="Node.js ≥ 20" /></a>
|
|
@@ -35,6 +43,10 @@
|
|
|
35
43
|
<p><em>Click to play</em></p>
|
|
36
44
|
</div>
|
|
37
45
|
|
|
46
|
+
<p align="center"><em>Streams over H.264 with a zero-buffer decoder (no MSE) — <a href="https://github.com/jo-duchan/tapflow/blob/main/contributing/streaming-latency-log.md">latency measurements ↗</a></em></p>
|
|
47
|
+
|
|
48
|
+
> **v0.x, actively developed** — backward-compatible by default; breaking changes are rare and always noted in the [changelog](https://github.com/jo-duchan/tapflow/blob/main/CHANGELOG.md). [Roadmap →](https://github.com/jo-duchan/tapflow/blob/main/ROADMAP.md)
|
|
49
|
+
|
|
38
50
|
---
|
|
39
51
|
|
|
40
52
|
## Why tapflow?
|
|
@@ -60,31 +72,22 @@ We hit this exact problem, so we built tapflow.
|
|
|
60
72
|
| Xcode / Android Studio | Each teammate needs a Mac and a full mobile toolchain |
|
|
61
73
|
| **tapflow** | Reuse your own Macs — data stays on infrastructure you control, and the whole team does QA from a browser |
|
|
62
74
|
|
|
63
|
-
##
|
|
75
|
+
## How it works
|
|
64
76
|
|
|
65
77
|
tapflow connects three parts:
|
|
66
78
|
|
|
67
|
-
1. A **self-hosted relay**
|
|
68
|
-
2. A **macOS agent** that drives iOS
|
|
69
|
-
3. A **browser dashboard** for the rest of the team
|
|
79
|
+
1. A **self-hosted relay** (Linux or Mac) — also serves the dashboard on the same port, so there's no separate web server.
|
|
80
|
+
2. A **macOS agent** that drives the iOS Simulator and Android emulator — it connects _outbound_ to the relay (no inbound firewall rules) and injects iOS touch directly, without WebDriverAgent.
|
|
81
|
+
3. A **browser dashboard** for the rest of the team — pick an available device and interact with it in real time while the simulators keep running on your Macs.
|
|
70
82
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
## What tapflow is not
|
|
74
|
-
|
|
75
|
-
tapflow doesn't replace native mobile development tools. Mobile developers still use Xcode, Android Studio, and their build tooling. tapflow makes the *running* simulators and emulators accessible to the rest of the team through a browser — it isn't an automation framework or a device farm.
|
|
76
|
-
|
|
77
|
-
## How it works
|
|
78
|
-
|
|
79
|
-
```
|
|
83
|
+
```text
|
|
80
84
|
Browser (your team) ←─ WebSocket ─→ Relay Server ←─ WebSocket (outbound) ─→ Mac Agent
|
|
81
85
|
(Linux / Mac) (iOS · Android)
|
|
82
86
|
```
|
|
83
87
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
4. The **relay** also serves the dashboard SPA on the same port — no separate web server needed.
|
|
88
|
+
## What tapflow is not
|
|
89
|
+
|
|
90
|
+
tapflow doesn't replace native mobile development tools. Mobile developers still use Xcode, Android Studio, and their build tooling. tapflow makes the *running* simulators and emulators accessible to the rest of the team through a browser, and it is not a device farm. It does have an automated QA axis — a deterministic flow runner and an MCP server for LLM agents — but wiring in external automation frameworks like WebDriverAgent or Appium is out of scope; tapflow ships its own minimal runner instead.
|
|
88
91
|
|
|
89
92
|
## Quick Start
|
|
90
93
|
|
|
@@ -141,7 +144,7 @@ Navigate to `http://localhost:4000` and sign in with the account you just create
|
|
|
141
144
|
## Features
|
|
142
145
|
|
|
143
146
|
- **No mobile toolchain for QA users** — teammates test from a browser without installing Xcode, Android Studio, or local simulator tooling.
|
|
144
|
-
- **Self-hosted by default** —
|
|
147
|
+
- **Self-hosted by default** — no third-party cloud and no external accounts; everything runs on hardware you already own.
|
|
145
148
|
- **Use your existing Mac setup** — run agents on Macs that already have the iOS Simulator or Android emulator available.
|
|
146
149
|
- **API-first** — REST endpoints and Personal Access Tokens support CI/CD and AI-agent workflows.
|
|
147
150
|
|
|
@@ -157,10 +160,10 @@ What's included:
|
|
|
157
160
|
- **Screenshot REST endpoint** — `GET /api/v1/sessions/:sessionId/screenshot` for CI and AI agents.
|
|
158
161
|
- **Mac resource monitoring** — CPU & RAM per agent, to spot overloaded hosts before assigning sessions.
|
|
159
162
|
- **Team management** — invite links, roles (Admin / Developer / QA / Viewer), and Personal Access Tokens.
|
|
160
|
-
- **MCP Server**
|
|
163
|
+
- **MCP Server** — `@tapflowio/mcp-server` lets Claude Code and other LLM agents control simulators as native tools.
|
|
161
164
|
|
|
162
165
|
<a name="latency-note"></a>
|
|
163
|
-
> <sup>1</sup> On
|
|
166
|
+
> <sup>1</sup> On a real LAN, decode-to-present measures in the low tens of milliseconds (p50 ~11–17 ms with the WASM software decoder; faster with WebCodecs on HTTPS); end-to-end "glass-to-glass" latency adds your network's round trip on top. See the [streaming latency log](https://github.com/jo-duchan/tapflow/blob/main/contributing/streaming-latency-log.md) for the full measurements, conditions, and known limitations.
|
|
164
167
|
|
|
165
168
|
## Security & Privacy
|
|
166
169
|
|
|
@@ -182,17 +185,7 @@ Found a vulnerability? See [SECURITY.md](https://github.com/jo-duchan/tapflow/bl
|
|
|
182
185
|
|
|
183
186
|
## Self-Hosting
|
|
184
187
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
Relay and agent on the same machine — ideal for a single developer or small team.
|
|
188
|
-
|
|
189
|
-
```sh
|
|
190
|
-
tapflow start
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
### Team (separate relay server)
|
|
194
|
-
|
|
195
|
-
Run the relay on a Linux server or dedicated Mac. Each Mac with simulators runs the agent.
|
|
188
|
+
A single Mac needs nothing beyond `tapflow start` (see [Quick Start](#quick-start)). For a team, run the relay on a separate Linux server or dedicated Mac, and point each Mac agent at it.
|
|
196
189
|
|
|
197
190
|
**Relay server:**
|
|
198
191
|
|
|
@@ -234,33 +227,11 @@ Full reference → [CLI docs](https://www.tapflow.dev/reference/cli)
|
|
|
234
227
|
|
|
235
228
|
## Documentation
|
|
236
229
|
|
|
237
|
-
**[www.tapflow.dev](https://www.tapflow.dev)**
|
|
238
|
-
|
|
239
|
-
**Getting Started**
|
|
240
|
-
- [Introduction](https://www.tapflow.dev/guide/introduction)
|
|
241
|
-
- [Quick Start](https://www.tapflow.dev/guide/getting-started)
|
|
242
|
-
- [Requirements](https://www.tapflow.dev/guide/requirements)
|
|
243
|
-
|
|
244
|
-
**Setup**
|
|
245
|
-
- [Self-Hosting the Relay](https://www.tapflow.dev/guide/self-hosting)
|
|
246
|
-
- [Security & Privacy](https://www.tapflow.dev/guide/security)
|
|
247
|
-
- [Agent Setup](https://www.tapflow.dev/guide/agent)
|
|
248
|
-
- [Uploading Builds (CI/CD)](https://www.tapflow.dev/guide/upload-builds)
|
|
249
|
-
- [Scaling Mac Resources](https://www.tapflow.dev/guide/scaling)
|
|
250
|
-
|
|
251
|
-
**Dashboard**
|
|
252
|
-
- [First-time Setup](https://www.tapflow.dev/dashboard/setup)
|
|
253
|
-
- [Dashboard Overview](https://www.tapflow.dev/dashboard/overview)
|
|
254
|
-
|
|
255
|
-
**AI Agent**
|
|
256
|
-
- [MCP Server](https://www.tapflow.dev/guide/mcp-server) *(experimental)*
|
|
257
|
-
|
|
258
|
-
**Reference**
|
|
259
|
-
- [CLI Reference](https://www.tapflow.dev/reference/cli)
|
|
260
|
-
- [Configuration](https://www.tapflow.dev/reference/configuration)
|
|
261
|
-
- [REST API](https://www.tapflow.dev/reference/api)
|
|
230
|
+
Full docs: **[www.tapflow.dev](https://www.tapflow.dev)**
|
|
262
231
|
|
|
263
|
-
**[Troubleshooting](https://www.tapflow.dev/guide/troubleshooting)
|
|
232
|
+
- **Guides** — [Quick Start](https://www.tapflow.dev/guide/getting-started) · [Environment Setup](https://www.tapflow.dev/guide/environment-setup) · [Self-Hosting](https://www.tapflow.dev/guide/self-hosting) · [Security & Privacy](https://www.tapflow.dev/guide/security) · [Uploading Builds (CI/CD)](https://www.tapflow.dev/guide/upload-builds) · [Troubleshooting](https://www.tapflow.dev/guide/troubleshooting)
|
|
233
|
+
- **Reference** — [CLI](https://www.tapflow.dev/reference/cli) · [Configuration](https://www.tapflow.dev/reference/configuration) · [REST API](https://www.tapflow.dev/reference/api)
|
|
234
|
+
- **AI Agent** — [MCP Server](https://www.tapflow.dev/guide/mcp-server)
|
|
264
235
|
|
|
265
236
|
## Contributing
|
|
266
237
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface FlowRunOptions {
|
|
2
|
+
relay?: string;
|
|
3
|
+
token?: string;
|
|
4
|
+
session?: string;
|
|
5
|
+
device?: string;
|
|
6
|
+
build?: number;
|
|
7
|
+
install?: boolean;
|
|
8
|
+
junit?: string;
|
|
9
|
+
artifacts?: string;
|
|
10
|
+
timeout?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function cmdFlowRun(files: string[], opts: FlowRunOptions): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=flow-run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-run.d.ts","sourceRoot":"","sources":["../../src/commands/flow-run.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AA+CD,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA0FrF"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { parseFlow, runFlow, toJUnitXml, RelayClient, RelayDriver, } from '@tapflowio/flow-runner';
|
|
4
|
+
// Exit codes are part of the CI contract: 0 = all flows passed,
|
|
5
|
+
// 1 = at least one flow failed, 2 = environment/config error.
|
|
6
|
+
const EXIT_FLOW_FAILED = 1;
|
|
7
|
+
const EXIT_ENV_ERROR = 2;
|
|
8
|
+
function envFail(message) {
|
|
9
|
+
console.error(`✗ ${message}`);
|
|
10
|
+
process.exit(EXIT_ENV_ERROR);
|
|
11
|
+
}
|
|
12
|
+
async function resolveSession(client, opts) {
|
|
13
|
+
const sessions = await client.listDevices();
|
|
14
|
+
const devices = sessions.flatMap((s) => s.devices);
|
|
15
|
+
if (devices.length === 0)
|
|
16
|
+
envFail('no devices registered on the relay — is an agent running?');
|
|
17
|
+
let candidates = devices;
|
|
18
|
+
if (opts.session) {
|
|
19
|
+
candidates = devices.filter((d) => d.sessionId === opts.session);
|
|
20
|
+
if (candidates.length === 0)
|
|
21
|
+
envFail(`session ${opts.session} not found`);
|
|
22
|
+
if (candidates.length > 1)
|
|
23
|
+
envFail(`session ${opts.session} matches multiple devices — narrow with --device <name>`);
|
|
24
|
+
}
|
|
25
|
+
else if (opts.device) {
|
|
26
|
+
candidates = devices.filter((d) => d.name === opts.device);
|
|
27
|
+
if (candidates.length === 0) {
|
|
28
|
+
envFail(`device "${opts.device}" not found (available: ${devices.map((d) => d.name).join(', ')})`);
|
|
29
|
+
}
|
|
30
|
+
// The same device name can exist on two agents (two Macs) — never pick one silently.
|
|
31
|
+
if (candidates.length > 1)
|
|
32
|
+
envFail(`multiple devices named "${opts.device}" — narrow with --session <id> (tapflow status)`);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
const booted = devices.filter((d) => d.status === 'booted');
|
|
36
|
+
if (booted.length === 1) {
|
|
37
|
+
candidates = booted;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
envFail(booted.length === 0
|
|
41
|
+
? 'no booted device — pass --device <name> to boot one, or boot it in the dashboard'
|
|
42
|
+
: `multiple booted devices — pick one with --device <name> or --session <id> (booted: ${booted.map((d) => d.name).join(', ')})`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const device = candidates[0];
|
|
46
|
+
if (device.busy)
|
|
47
|
+
envFail(`device "${device.name}" is busy (another session is active)`);
|
|
48
|
+
return { sessionId: device.sessionId, device };
|
|
49
|
+
}
|
|
50
|
+
export async function cmdFlowRun(files, opts) {
|
|
51
|
+
if (files.length === 0)
|
|
52
|
+
envFail('no flow files given — usage: tapflow flow run .tapflow/flows/*.yaml');
|
|
53
|
+
// NaN would disable every deadline check in the engine (Date.now() >= NaN is
|
|
54
|
+
// always false) and hang the run — reject bad numeric flags up front.
|
|
55
|
+
if (opts.build !== undefined && !Number.isInteger(opts.build))
|
|
56
|
+
envFail('--build must be an integer build id (see list_builds / the dashboard)');
|
|
57
|
+
if (opts.timeout !== undefined && !(Number.isFinite(opts.timeout) && opts.timeout > 0))
|
|
58
|
+
envFail('--timeout must be a positive number of seconds');
|
|
59
|
+
// Parse everything up front: a schema error is a config problem (exit 2),
|
|
60
|
+
// not a test failure, and it should surface before touching any device.
|
|
61
|
+
const flows = [];
|
|
62
|
+
for (const file of files) {
|
|
63
|
+
let text;
|
|
64
|
+
try {
|
|
65
|
+
text = fs.readFileSync(file, 'utf-8');
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
envFail(`cannot read ${file}: ${e.message}`);
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
flows.push(parseFlow(text, file));
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
envFail(e.message);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const relayUrl = opts.relay ?? 'ws://localhost:4000';
|
|
78
|
+
const token = opts.token ?? process.env.TAPFLOW_TOKEN ?? '';
|
|
79
|
+
const client = new RelayClient(relayUrl, token);
|
|
80
|
+
try {
|
|
81
|
+
await client.connect();
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
envFail(`cannot connect to relay at ${relayUrl}: ${e.message}`);
|
|
85
|
+
}
|
|
86
|
+
let exitCode = 0;
|
|
87
|
+
try {
|
|
88
|
+
const { sessionId, device } = await resolveSession(client, opts);
|
|
89
|
+
await client.joinSession(sessionId);
|
|
90
|
+
// Always send device:boot — it is idempotent on a booted device and it is
|
|
91
|
+
// what initializes the agent's touch/stream state for this session (the
|
|
92
|
+
// dashboard does the same on join).
|
|
93
|
+
console.log(`preparing ${device.name}...`);
|
|
94
|
+
await client.bootDevice(sessionId, device.id);
|
|
95
|
+
if (opts.build !== undefined && opts.install !== false) {
|
|
96
|
+
console.log(`installing build ${opts.build}...`);
|
|
97
|
+
await client.installApp(sessionId, opts.build);
|
|
98
|
+
}
|
|
99
|
+
const driver = new RelayDriver(client, sessionId, opts.build);
|
|
100
|
+
const engineOpts = opts.timeout !== undefined ? { defaultTimeoutMs: opts.timeout * 1000 } : {};
|
|
101
|
+
const results = [];
|
|
102
|
+
for (const [flowIndex, flow] of flows.entries()) {
|
|
103
|
+
process.stdout.write(`▶ ${flow.name} `);
|
|
104
|
+
const result = await runFlow(flow, driver, engineOpts);
|
|
105
|
+
results.push(result);
|
|
106
|
+
console.log(result.status === 'passed' ? `✓ (${(result.durationMs / 1000).toFixed(1)}s)` : '✗');
|
|
107
|
+
if (result.status === 'failed') {
|
|
108
|
+
console.error(` ${result.failureMessage}`);
|
|
109
|
+
if (result.failureScreenshot) {
|
|
110
|
+
// Runtime data belongs in the gitignored .tapflow-data/, and the
|
|
111
|
+
// index prefix keeps same-named flows from different directories
|
|
112
|
+
// from overwriting each other's evidence.
|
|
113
|
+
const dir = opts.artifacts ?? path.join('.tapflow-data', 'artifacts');
|
|
114
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
115
|
+
const shot = path.join(dir, `${String(flowIndex + 1).padStart(2, '0')}-${flow.name.replace(/[^\w.-]+/g, '_')}-failure.png`);
|
|
116
|
+
fs.writeFileSync(shot, result.failureScreenshot);
|
|
117
|
+
console.error(` screenshot: ${shot}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (opts.junit) {
|
|
122
|
+
fs.mkdirSync(path.dirname(path.resolve(opts.junit)), { recursive: true });
|
|
123
|
+
fs.writeFileSync(opts.junit, toJUnitXml(results));
|
|
124
|
+
console.log(`JUnit report: ${opts.junit}`);
|
|
125
|
+
}
|
|
126
|
+
const failed = results.filter((r) => r.status === 'failed').length;
|
|
127
|
+
console.log(`\n${results.length - failed}/${results.length} flows passed`);
|
|
128
|
+
if (failed > 0)
|
|
129
|
+
exitCode = EXIT_FLOW_FAILED;
|
|
130
|
+
client.leaveSession(sessionId);
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
console.error(`✗ ${e.message}`);
|
|
134
|
+
exitCode = EXIT_ENV_ERROR;
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
client.disconnect();
|
|
138
|
+
}
|
|
139
|
+
process.exit(exitCode);
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=flow-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-run.js","sourceRoot":"","sources":["../../src/commands/flow-run.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -16,6 +16,7 @@ import { cmdAgentStart } from './commands/agent-start.js';
|
|
|
16
16
|
import { cmdReset } from './commands/reset.js';
|
|
17
17
|
import { cmdStatus } from './commands/status.js';
|
|
18
18
|
import { cmdLogs } from './commands/logs.js';
|
|
19
|
+
import { cmdFlowRun } from './commands/flow-run.js';
|
|
19
20
|
process.on('unhandledRejection', (err) => {
|
|
20
21
|
console.error(err instanceof Error ? err.message : String(err));
|
|
21
22
|
process.exit(1);
|
|
@@ -87,6 +88,28 @@ cli
|
|
|
87
88
|
.option('--relay <url>', 'Relay URL (default: http://localhost:4000)')
|
|
88
89
|
.option('--lines <n>', 'Number of lines to show (default: 100)', { default: 100 })
|
|
89
90
|
.action((opts) => cmdLogs(opts));
|
|
91
|
+
cli
|
|
92
|
+
.command('flow <subcommand> [...files]', 'Deterministic flow commands (subcommand: run)')
|
|
93
|
+
.option('--relay <url>', 'Relay URL (default: ws://localhost:4000)')
|
|
94
|
+
.option('--token <token>', 'PAT for a remote relay (or TAPFLOW_TOKEN env)')
|
|
95
|
+
.option('--session <id>', 'Target session id (from tapflow status)')
|
|
96
|
+
.option('--device <name>', 'Target device by name (boots it when shut down)')
|
|
97
|
+
.option('--build <id>', 'Build under test — installed before the run, launched by the launchApp step')
|
|
98
|
+
.option('--no-install', 'Skip installing --build before the run')
|
|
99
|
+
.option('--junit <path>', 'Write a JUnit XML report')
|
|
100
|
+
.option('--artifacts <dir>', 'Failure screenshot directory (default: .tapflow/artifacts)')
|
|
101
|
+
.option('--timeout <seconds>', 'Default per-selector wait (default: 10)')
|
|
102
|
+
.action((subcommand, files, opts) => {
|
|
103
|
+
if (subcommand !== 'run') {
|
|
104
|
+
console.error(`unknown flow subcommand: ${subcommand} (expected: run)`);
|
|
105
|
+
process.exit(2);
|
|
106
|
+
}
|
|
107
|
+
return cmdFlowRun(files, {
|
|
108
|
+
...opts,
|
|
109
|
+
build: opts.build !== undefined ? Number(opts.build) : undefined,
|
|
110
|
+
timeout: opts.timeout !== undefined ? Number(opts.timeout) : undefined,
|
|
111
|
+
});
|
|
112
|
+
});
|
|
90
113
|
cli.help();
|
|
91
114
|
cli.version(version);
|
|
92
115
|
cli.parse();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAEzB,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AACzD,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAwB,CAAA;AACnH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tapflow",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"description": "Self-hosted iOS/Android simulator streaming for the whole team",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ios",
|
|
@@ -47,10 +47,11 @@
|
|
|
47
47
|
"cac": "^6.7.14",
|
|
48
48
|
"ws": "^8.21.0",
|
|
49
49
|
"zod": "^4.4.3",
|
|
50
|
-
"@tapflowio/agent-core": "0.
|
|
51
|
-
"@tapflowio/android-agent": "0.
|
|
52
|
-
"@tapflowio/
|
|
53
|
-
"@tapflowio/
|
|
50
|
+
"@tapflowio/agent-core": "0.14.0",
|
|
51
|
+
"@tapflowio/android-agent": "0.14.0",
|
|
52
|
+
"@tapflowio/flow-runner": "0.14.0",
|
|
53
|
+
"@tapflowio/ios-agent": "0.14.0",
|
|
54
|
+
"@tapflowio/relay": "0.14.0"
|
|
54
55
|
},
|
|
55
56
|
"devDependencies": {
|
|
56
57
|
"@types/node": "^20.19.43",
|