tapflow 0.7.0 → 0.8.0-next.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 +1 -1
- package/dist/commands/doctor.d.ts +3 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +18 -9
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/setup.d.ts +2 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +58 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/doctor.d.ts +5 -0
- package/dist/lib/doctor.d.ts.map +1 -1
- package/dist/lib/doctor.js +43 -9
- package/dist/lib/doctor.js.map +1 -1
- package/dist/lib/setup.d.ts +5 -0
- package/dist/lib/setup.d.ts.map +1 -0
- package/dist/lib/setup.js +338 -0
- package/dist/lib/setup.js.map +1 -0
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -135,7 +135,7 @@ Navigate to `http://localhost:4000` and sign in with the account you just create
|
|
|
135
135
|
|
|
136
136
|
What's included:
|
|
137
137
|
|
|
138
|
-
- **Browser streaming** — iOS & Android at ~30 fps, no extra app on the device.
|
|
138
|
+
- **Browser streaming** — iOS & Android at ~30 fps, no extra app on the device. Both stream H.264 through a 2-tier decoder (WebCodecs on secure contexts, WASM/tinyh264 on plain HTTP), which removes the media-element buffer from the decode path. Resolution adapts to the connection — native on a secure context, downscaled on plain-HTTP LAN.<sup>[1](#latency-note)</sup>
|
|
139
139
|
- **Codec fallback** — the stream negotiates the codec per client and falls back to JPEG when a hardware or WASM decoder isn't available, so older browsers still work.
|
|
140
140
|
- **Touch, swipe & pinch** — real-time input forwarded to the simulator or emulator.
|
|
141
141
|
- **Deeplink toolbar** — open supported deeplinks directly from the QA toolbar.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAuBA,wBAAsB,SAAS,CAAC,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC5E"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { runDoctorChecks } from '../lib/doctor.js';
|
|
2
2
|
import { banner, step, GREEN, RED, YELLOW, BOLD, DIM, R } from '../lib/print.js';
|
|
3
3
|
function printChecks(checks) {
|
|
4
|
-
let hasFailure = false;
|
|
5
4
|
for (const check of checks) {
|
|
6
5
|
if (check.ok) {
|
|
7
6
|
console.log(` ${GREEN}✓${R} ${check.label}`);
|
|
@@ -15,23 +14,33 @@ function printChecks(checks) {
|
|
|
15
14
|
console.log(` ${RED}✗${R} ${check.label}`);
|
|
16
15
|
if (check.detail)
|
|
17
16
|
console.log(`${DIM} → ${check.detail}${R}`);
|
|
18
|
-
hasFailure = true;
|
|
19
17
|
}
|
|
20
18
|
}
|
|
21
|
-
return hasFailure;
|
|
22
19
|
}
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
// 실패 = ok가 아니면서 warn도 아닌 체크 (warn은 실패로 치지 않음)
|
|
21
|
+
function hasFailures(result) {
|
|
22
|
+
const all = [...result.common, ...(result.ios ?? []), ...(result.android ?? [])];
|
|
23
|
+
return all.some((c) => !c.ok && !c.warn);
|
|
24
|
+
}
|
|
25
|
+
export async function cmdDoctor(opts = {}) {
|
|
25
26
|
const result = await runDoctorChecks();
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
if (opts.json) {
|
|
28
|
+
const ok = !hasFailures(result);
|
|
29
|
+
console.log(JSON.stringify({ ok, common: result.common, ios: result.ios, android: result.android }, null, 2));
|
|
30
|
+
if (!ok)
|
|
31
|
+
process.exit(1);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
console.log('\ntapflow doctor\n');
|
|
35
|
+
const hasFailure = hasFailures(result);
|
|
36
|
+
printChecks(result.common);
|
|
28
37
|
if (result.ios) {
|
|
29
38
|
console.log(`\n ${BOLD}iOS${R}`);
|
|
30
|
-
|
|
39
|
+
printChecks(result.ios);
|
|
31
40
|
}
|
|
32
41
|
if (result.android) {
|
|
33
42
|
console.log(`\n ${BOLD}Android${R}`);
|
|
34
|
-
|
|
43
|
+
printChecks(result.android);
|
|
35
44
|
}
|
|
36
45
|
console.log();
|
|
37
46
|
if (hasFailure) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAgCA,wBAAsB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB/D"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { runSetupAndroid, runSetupIos } from '../lib/setup.js';
|
|
2
|
+
import { resolveAdb } from '../lib/doctor.js';
|
|
3
|
+
import { warn, BOLD, GREEN, RED, YELLOW, DIM, R } from '../lib/print.js';
|
|
4
|
+
const RUNNERS = {
|
|
5
|
+
ios: runSetupIos,
|
|
6
|
+
android: runSetupAndroid,
|
|
7
|
+
};
|
|
8
|
+
// 인자 없이 실행 시 환경을 보고 가능한 플랫폼을 고른다.
|
|
9
|
+
function detectPlatforms() {
|
|
10
|
+
const platforms = [];
|
|
11
|
+
if (process.platform === 'darwin')
|
|
12
|
+
platforms.push('ios');
|
|
13
|
+
if (resolveAdb() !== null)
|
|
14
|
+
platforms.push('android');
|
|
15
|
+
return platforms;
|
|
16
|
+
}
|
|
17
|
+
function printResults(results) {
|
|
18
|
+
for (const r of results) {
|
|
19
|
+
if (r.ok) {
|
|
20
|
+
console.log(` ${GREEN}✓${R} ${r.label}`);
|
|
21
|
+
if (r.detail)
|
|
22
|
+
console.log(`${DIM} ${r.detail}${R}`);
|
|
23
|
+
}
|
|
24
|
+
else if (r.warn) {
|
|
25
|
+
console.log(` ${YELLOW}⚠${R} ${r.label}`);
|
|
26
|
+
if (r.detail)
|
|
27
|
+
console.log(`${DIM} → ${r.detail}${R}`);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
console.log(` ${RED}✗${R} ${r.label}`);
|
|
31
|
+
if (r.detail)
|
|
32
|
+
console.log(`${DIM} → ${r.detail}${R}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export async function cmdSetup(platform) {
|
|
37
|
+
let targets;
|
|
38
|
+
if (platform) {
|
|
39
|
+
if (!RUNNERS[platform]) {
|
|
40
|
+
warn(`Unknown or unsupported platform: ${platform}. Supported: ios, android`);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
targets = [platform];
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
targets = detectPlatforms();
|
|
47
|
+
if (targets.length === 0) {
|
|
48
|
+
warn('No supported platform detected. Run: tapflow setup ios | android');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
for (const t of targets) {
|
|
53
|
+
console.log(`\n${BOLD}tapflow setup ${t}${R}\n`);
|
|
54
|
+
printResults(await RUNNERS[t]());
|
|
55
|
+
}
|
|
56
|
+
console.log();
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAwB,MAAM,iBAAiB,CAAA;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAA;AAExE,MAAM,OAAO,GAAqD;IAChE,GAAG,EAAE,WAAW;IAChB,OAAO,EAAE,eAAe;CACzB,CAAA;AAED,kCAAkC;AAClC,SAAS,eAAe;IACtB,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACxD,IAAI,UAAU,EAAE,KAAK,IAAI;QAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACpD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,OAA0B;IAC9C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;YAC1C,IAAI,CAAC,CAAC,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAA;QAC3D,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;YAC3C,IAAI,CAAC,CAAC,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAA;QAC7D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;YACxC,IAAI,CAAC,CAAC,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAA;QAC7D,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAiB;IAC9C,IAAI,OAAiB,CAAA;IACrB,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,oCAAoC,QAAQ,2BAA2B,CAAC,CAAA;YAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAA;IACtB,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,eAAe,EAAE,CAAA;QAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,kEAAkE,CAAC,CAAA;YACxE,OAAM;QACR,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAChD,YAAY,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAA;AACf,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,7 @@ const { version } = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'
|
|
|
7
7
|
import { cmdInitConfig } from './commands/init.js';
|
|
8
8
|
import { cmdAdminInit } from './commands/admin-init.js';
|
|
9
9
|
import { cmdDoctor } from './commands/doctor.js';
|
|
10
|
+
import { cmdSetup } from './commands/setup.js';
|
|
10
11
|
import { cmdDevices } from './commands/devices.js';
|
|
11
12
|
import { cmdBoot } from './commands/boot.js';
|
|
12
13
|
import { cmdStart } from './commands/start.js';
|
|
@@ -36,7 +37,11 @@ cli
|
|
|
36
37
|
});
|
|
37
38
|
cli
|
|
38
39
|
.command('doctor', 'Check system prerequisites')
|
|
39
|
-
.
|
|
40
|
+
.option('--json', 'Output machine-readable JSON')
|
|
41
|
+
.action((opts) => cmdDoctor(opts));
|
|
42
|
+
cli
|
|
43
|
+
.command('setup [platform]', 'Set up the environment (ios | android; omit to auto-detect)')
|
|
44
|
+
.action((platform) => cmdSetup(platform));
|
|
40
45
|
cli
|
|
41
46
|
.command('devices', 'List available iOS simulators and Android AVDs')
|
|
42
47
|
.action(() => cmdDevices());
|
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,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;AAE5C,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE;IACvC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA;AAEF,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAA;AAE1B,GAAG;KACA,OAAO,CAAC,MAAM,EAAE,4CAA4C,CAAC;KAC7D,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;KACtE,MAAM,CAAC,SAAS,EAAE,wCAAwC,CAAC;KAC3D,MAAM,CAAC,CAAC,IAA0C,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAA;AAE9E,GAAG;KACA,OAAO,CAAC,oBAAoB,EAAE,2CAA2C,CAAC;KAC1E,MAAM,CAAC,eAAe,EAAE,4CAA4C,CAAC;KACrE,MAAM,CAAC,CAAC,UAAkB,EAAE,IAAwB,EAAE,EAAE;IACvD,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,YAAY,CAAC,IAAI,CAAC,CAAA;IACpD,OAAO,CAAC,KAAK,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAA;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA;AAEJ,GAAG;KACA,OAAO,CAAC,QAAQ,EAAE,4BAA4B,CAAC;KAC/C,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/doctor.d.ts
CHANGED
|
@@ -10,4 +10,9 @@ export interface DoctorResult {
|
|
|
10
10
|
android: DoctorCheck[] | null;
|
|
11
11
|
}
|
|
12
12
|
export declare function runDoctorChecks(): Promise<DoctorResult>;
|
|
13
|
+
export interface AdbResolution {
|
|
14
|
+
path: string;
|
|
15
|
+
inPath: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function resolveAdb(): AdbResolution | null;
|
|
13
18
|
//# sourceMappingURL=doctor.d.ts.map
|
package/dist/lib/doctor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/lib/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/lib/doctor.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,EAAE,EAAE,OAAO,CAAA;IACX,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,GAAG,EAAE,WAAW,EAAE,GAAG,IAAI,CAAA;IACzB,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,CAAA;CAC9B;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC,CAS7D;AAkFD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,wBAAgB,UAAU,IAAI,aAAa,GAAG,IAAI,CAWjD"}
|
package/dist/lib/doctor.js
CHANGED
|
@@ -1,14 +1,31 @@
|
|
|
1
1
|
import { execSync } from 'node:child_process';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
3
5
|
export async function runDoctorChecks() {
|
|
4
6
|
const isMac = process.platform === 'darwin';
|
|
5
|
-
const
|
|
7
|
+
const adb = resolveAdb();
|
|
6
8
|
return {
|
|
7
9
|
common: [checkNodeVersion()],
|
|
8
10
|
ios: isMac ? [checkXcode(), checkSimctl(), checkBootedSimulator()] : null,
|
|
9
|
-
android:
|
|
11
|
+
android: adb !== null ? buildAndroidChecks(adb) : null,
|
|
10
12
|
};
|
|
11
13
|
}
|
|
14
|
+
function buildAndroidChecks(adb) {
|
|
15
|
+
// adb가 PATH에 있으면 명령은 그대로 'adb', 표준 위치 fallback이면 절대경로로 실행
|
|
16
|
+
if (adb.inPath) {
|
|
17
|
+
return [checkAdb(adb.path), checkBootedAvd('adb')];
|
|
18
|
+
}
|
|
19
|
+
return [
|
|
20
|
+
{
|
|
21
|
+
label: 'adb (not in PATH)',
|
|
22
|
+
ok: false,
|
|
23
|
+
warn: true,
|
|
24
|
+
detail: `adb found at ${adb.path} but not in PATH. Run: tapflow setup android`,
|
|
25
|
+
},
|
|
26
|
+
checkBootedAvd(adb.path),
|
|
27
|
+
];
|
|
28
|
+
}
|
|
12
29
|
function checkXcode() {
|
|
13
30
|
try {
|
|
14
31
|
const out = execSync('xcodebuild -version', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
@@ -72,21 +89,38 @@ function checkNodeVersion() {
|
|
|
72
89
|
detail: ok ? undefined : 'Node ≥ 20 required. Install from https://nodejs.org/',
|
|
73
90
|
};
|
|
74
91
|
}
|
|
75
|
-
function resolveAdb() {
|
|
92
|
+
export function resolveAdb() {
|
|
76
93
|
try {
|
|
77
|
-
const
|
|
78
|
-
|
|
94
|
+
const found = execSync('which adb', { encoding: 'utf8', stdio: 'pipe' }).trim();
|
|
95
|
+
if (found)
|
|
96
|
+
return { path: found, inPath: true };
|
|
79
97
|
}
|
|
80
98
|
catch {
|
|
81
|
-
|
|
99
|
+
// PATH에 없으면 표준 SDK 위치 탐색으로 진행
|
|
100
|
+
}
|
|
101
|
+
for (const candidate of standardAdbPaths()) {
|
|
102
|
+
if (existsSync(candidate))
|
|
103
|
+
return { path: candidate, inPath: false };
|
|
82
104
|
}
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
function standardAdbPaths() {
|
|
108
|
+
const paths = [];
|
|
109
|
+
if (process.env.ANDROID_HOME)
|
|
110
|
+
paths.push(join(process.env.ANDROID_HOME, 'platform-tools', 'adb'));
|
|
111
|
+
if (process.env.ANDROID_SDK_ROOT)
|
|
112
|
+
paths.push(join(process.env.ANDROID_SDK_ROOT, 'platform-tools', 'adb'));
|
|
113
|
+
const home = homedir();
|
|
114
|
+
paths.push(join(home, 'Library', 'Android', 'sdk', 'platform-tools', 'adb')); // macOS
|
|
115
|
+
paths.push(join(home, 'Android', 'Sdk', 'platform-tools', 'adb')); // Linux
|
|
116
|
+
return paths;
|
|
83
117
|
}
|
|
84
118
|
function checkAdb(path) {
|
|
85
119
|
return { label: `adb found: ${path}`, ok: true };
|
|
86
120
|
}
|
|
87
|
-
function checkBootedAvd() {
|
|
121
|
+
function checkBootedAvd(adbCmd) {
|
|
88
122
|
try {
|
|
89
|
-
const out = execSync(
|
|
123
|
+
const out = execSync(`${adbCmd} devices`, { encoding: 'utf8', stdio: 'pipe' });
|
|
90
124
|
const lines = out.trim().split('\n').slice(1).filter(Boolean);
|
|
91
125
|
const emulator = lines.find((l) => l.startsWith('emulator-'));
|
|
92
126
|
if (!emulator) {
|
|
@@ -102,7 +136,7 @@ function checkBootedAvd() {
|
|
|
102
136
|
}
|
|
103
137
|
const serial = emulator.split('\t')[0]?.trim() ?? '';
|
|
104
138
|
try {
|
|
105
|
-
const avdName = execSync(
|
|
139
|
+
const avdName = execSync(`${adbCmd} -s ${serial} emu avd name`, { encoding: 'utf8', stdio: 'pipe' })
|
|
106
140
|
.split('\n')[0]
|
|
107
141
|
?.trim() ?? serial;
|
|
108
142
|
return { label: `AVD: ${avdName}`, ok: true };
|
package/dist/lib/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/lib/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/lib/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type DoctorCheck } from './doctor.js';
|
|
2
|
+
export type SetupStepResult = DoctorCheck;
|
|
3
|
+
export declare function runSetupAndroid(): Promise<SetupStepResult[]>;
|
|
4
|
+
export declare function runSetupIos(): Promise<SetupStepResult[]>;
|
|
5
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/lib/setup.ts"],"names":[],"mappings":"AAKA,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAK1D,MAAM,MAAM,eAAe,GAAG,WAAW,CAAA;AASzC,wBAAsB,eAAe,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAQlE;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAQ9D"}
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
import { execSync, spawnSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, readFileSync, appendFileSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
import { confirm, text, isCancel } from '@clack/prompts';
|
|
6
|
+
import { resolveAdb } from './doctor.js';
|
|
7
|
+
import { createSpinner, step } from './print.js';
|
|
8
|
+
const PATH_MARKER_START = '# >>> tapflow android sdk >>>';
|
|
9
|
+
const PATH_MARKER_END = '# <<< tapflow android sdk <<<';
|
|
10
|
+
const STUDIO_APP = '/Applications/Android Studio.app';
|
|
11
|
+
const XCODE_APP = '/Applications/Xcode.app';
|
|
12
|
+
const XCODE_APPSTORE = 'https://apps.apple.com/app/xcode/id497799835';
|
|
13
|
+
const XCODE_DEVELOPER_DIR = '/Applications/Xcode.app/Contents/Developer';
|
|
14
|
+
export async function runSetupAndroid() {
|
|
15
|
+
const results = [];
|
|
16
|
+
const brew = await checkAndFixHomebrew();
|
|
17
|
+
results.push(brew);
|
|
18
|
+
results.push(checkAndFixAdb(brew.ok));
|
|
19
|
+
results.push(await checkAndFixAndroidStudio(brew.ok));
|
|
20
|
+
results.push(checkAndFixEmulator());
|
|
21
|
+
return results;
|
|
22
|
+
}
|
|
23
|
+
export async function runSetupIos() {
|
|
24
|
+
const results = [];
|
|
25
|
+
results.push(await checkAndFixHomebrew());
|
|
26
|
+
const xcode = await checkAndFixXcode();
|
|
27
|
+
results.push(xcode);
|
|
28
|
+
results.push(checkXcodeActivation(xcode.ok));
|
|
29
|
+
results.push(checkAndFixSimulator());
|
|
30
|
+
return results;
|
|
31
|
+
}
|
|
32
|
+
async function checkAndFixXcode() {
|
|
33
|
+
if (existsSync(XCODE_APP)) {
|
|
34
|
+
return { label: 'Xcode installed', ok: true };
|
|
35
|
+
}
|
|
36
|
+
// Xcode는 App Store에서만 설치 가능 — CLI가 직접 설치할 수 없다.
|
|
37
|
+
if (!process.stdout.isTTY) {
|
|
38
|
+
return {
|
|
39
|
+
label: 'Xcode',
|
|
40
|
+
ok: false,
|
|
41
|
+
warn: true,
|
|
42
|
+
detail: `Install Xcode from the App Store: ${XCODE_APPSTORE}`,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
step('Xcode can only be installed from the App Store.');
|
|
46
|
+
const openPrompt = await text({ message: 'Press Enter to open the App Store…' });
|
|
47
|
+
if (isCancel(openPrompt)) {
|
|
48
|
+
return {
|
|
49
|
+
label: 'Xcode',
|
|
50
|
+
ok: false,
|
|
51
|
+
warn: true,
|
|
52
|
+
detail: 'Cancelled. Install Xcode from the App Store and re-run `tapflow setup ios`.',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
spawnSync('open', ['macappstores://apps.apple.com/app/xcode/id497799835'], { stdio: 'ignore' });
|
|
56
|
+
const continuePrompt = await text({ message: 'Install Xcode, then press Enter to continue…' });
|
|
57
|
+
if (isCancel(continuePrompt)) {
|
|
58
|
+
return {
|
|
59
|
+
label: 'Xcode',
|
|
60
|
+
ok: false,
|
|
61
|
+
warn: true,
|
|
62
|
+
detail: 'Cancelled. Re-run `tapflow setup ios` after installing Xcode.',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if (existsSync(XCODE_APP)) {
|
|
66
|
+
return { label: 'Xcode installed', ok: true };
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
label: 'Xcode',
|
|
70
|
+
ok: false,
|
|
71
|
+
warn: true,
|
|
72
|
+
detail: 'Xcode not detected yet. Re-run `tapflow setup ios` after installing.',
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// 설치됨 ≠ 사용 가능: active developer dir / 라이선스 / first-launch를 점검(sudo 작업은 안내만).
|
|
76
|
+
function checkXcodeActivation(xcodeInstalled) {
|
|
77
|
+
if (!xcodeInstalled) {
|
|
78
|
+
return { label: 'Xcode activation', ok: false, warn: true, detail: 'Install Xcode first.' };
|
|
79
|
+
}
|
|
80
|
+
let dir = '';
|
|
81
|
+
try {
|
|
82
|
+
dir = execSync('xcode-select -p', { encoding: 'utf8', stdio: 'pipe' }).trim();
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// active dir 미설정 — 아래 안내
|
|
86
|
+
}
|
|
87
|
+
if (!dir.includes('Xcode.app')) {
|
|
88
|
+
return {
|
|
89
|
+
label: 'Xcode command-line tools',
|
|
90
|
+
ok: false,
|
|
91
|
+
warn: true,
|
|
92
|
+
detail: `Active developer dir points away from Xcode. Run: sudo xcode-select -s ${XCODE_DEVELOPER_DIR}`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
execSync('xcodebuild -version', { stdio: 'pipe' });
|
|
97
|
+
return { label: 'Xcode ready', ok: true };
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return {
|
|
101
|
+
label: 'Xcode setup',
|
|
102
|
+
ok: false,
|
|
103
|
+
warn: true,
|
|
104
|
+
detail: 'Finish Xcode setup: sudo xcodebuild -license accept && sudo xcodebuild -runFirstLaunch',
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function checkAndFixSimulator() {
|
|
109
|
+
try {
|
|
110
|
+
const raw = execSync('xcrun simctl list devices --json', { encoding: 'utf8', stdio: 'pipe' });
|
|
111
|
+
const data = JSON.parse(raw);
|
|
112
|
+
const all = Object.values(data.devices).flat();
|
|
113
|
+
const booted = all.find((d) => d.state === 'Booted');
|
|
114
|
+
if (booted) {
|
|
115
|
+
return { label: `Simulator booted: ${booted.name}`, ok: true };
|
|
116
|
+
}
|
|
117
|
+
const candidate = all.find((d) => d.state === 'Shutdown');
|
|
118
|
+
if (candidate) {
|
|
119
|
+
const boot = spawnSync('xcrun', ['simctl', 'boot', candidate.udid], { stdio: 'pipe' });
|
|
120
|
+
if (boot.status !== 0)
|
|
121
|
+
throw new Error('simctl boot failed');
|
|
122
|
+
return { label: `Simulator booted: ${candidate.name}`, ok: true };
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
label: 'Simulator',
|
|
126
|
+
ok: false,
|
|
127
|
+
warn: true,
|
|
128
|
+
detail: 'No simulators available. Open Xcode to install a simulator runtime.',
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return {
|
|
133
|
+
label: 'Simulator',
|
|
134
|
+
ok: false,
|
|
135
|
+
warn: true,
|
|
136
|
+
detail: 'Could not query simulators. Finish Xcode setup first.',
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// eval "$(...)"로 감싸 명령 치환 결과(설치 스크립트)가 word splitting 없이 단일 평가되게 한다.
|
|
141
|
+
const HOMEBREW_INSTALL = 'eval "$(/usr/bin/curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"';
|
|
142
|
+
async function checkAndFixHomebrew() {
|
|
143
|
+
try {
|
|
144
|
+
execSync('which brew', { stdio: 'pipe' });
|
|
145
|
+
return { label: 'Homebrew installed', ok: true };
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// 미설치 — 아래에서 확인 후 설치
|
|
149
|
+
}
|
|
150
|
+
// 원격 스크립트 자동 실행은 명시적 동의가 있을 때만. 비대화형이면 안내만.
|
|
151
|
+
if (!process.stdout.isTTY) {
|
|
152
|
+
return {
|
|
153
|
+
label: 'Homebrew',
|
|
154
|
+
ok: false,
|
|
155
|
+
warn: true,
|
|
156
|
+
detail: 'Install Homebrew: https://brew.sh (skipped in non-interactive mode)',
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
const proceed = await confirm({
|
|
160
|
+
message: 'Homebrew not found. Install it now via the official script? (may prompt for sudo)',
|
|
161
|
+
});
|
|
162
|
+
if (isCancel(proceed) || !proceed) {
|
|
163
|
+
return { label: 'Homebrew', ok: false, warn: true, detail: 'Skipped. Install Homebrew: https://brew.sh' };
|
|
164
|
+
}
|
|
165
|
+
console.log();
|
|
166
|
+
const r = spawnSync('/bin/bash', ['-c', HOMEBREW_INSTALL], { stdio: 'inherit' });
|
|
167
|
+
if (r.status === 0) {
|
|
168
|
+
// 방금 설치한 brew는 현재 프로세스 PATH에 아직 없을 수 있다(셸 재시작 전).
|
|
169
|
+
return {
|
|
170
|
+
label: 'Homebrew installed',
|
|
171
|
+
ok: true,
|
|
172
|
+
detail: "If later steps can't find brew, open a new terminal and re-run tapflow setup.",
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
label: 'Homebrew',
|
|
177
|
+
ok: false,
|
|
178
|
+
warn: true,
|
|
179
|
+
detail: 'Homebrew install failed. Install manually: https://brew.sh',
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
function checkAndFixAdb(brewAvailable) {
|
|
183
|
+
const adb = resolveAdb();
|
|
184
|
+
// 1. PATH에 있음
|
|
185
|
+
if (adb?.inPath) {
|
|
186
|
+
return { label: `adb in PATH: ${adb.path}`, ok: true };
|
|
187
|
+
}
|
|
188
|
+
// 2. 표준 SDK 위치엔 있지만 PATH에 없음 → shell rc에 등록
|
|
189
|
+
if (adb) {
|
|
190
|
+
const platformTools = dirname(adb.path);
|
|
191
|
+
const registered = registerPathInShellRc(platformTools);
|
|
192
|
+
if (!registered) {
|
|
193
|
+
return {
|
|
194
|
+
label: 'adb (not in PATH)',
|
|
195
|
+
ok: false,
|
|
196
|
+
warn: true,
|
|
197
|
+
detail: `adb found at ${adb.path} but your shell ($SHELL) isn't auto-configurable. Add to your shell config: export PATH="${platformTools}:$PATH"`,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
if (registered.added) {
|
|
201
|
+
return {
|
|
202
|
+
label: 'adb added to PATH',
|
|
203
|
+
ok: true,
|
|
204
|
+
detail: `Added ${platformTools} to PATH in ${registered.file}. Restart your shell or run: source ${registered.file}`,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
label: 'adb PATH already configured',
|
|
209
|
+
ok: true,
|
|
210
|
+
detail: `${platformTools} already registered in ${registered.file}`,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
// 3. 어디에도 없음 → brew 설치
|
|
214
|
+
if (!brewAvailable) {
|
|
215
|
+
return {
|
|
216
|
+
label: 'adb',
|
|
217
|
+
ok: false,
|
|
218
|
+
warn: true,
|
|
219
|
+
detail: 'Install Homebrew first, then: brew install android-platform-tools',
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
const spinner = createSpinner('Installing android-platform-tools via Homebrew…');
|
|
223
|
+
spinner.start();
|
|
224
|
+
const r = spawnSync('brew', ['install', 'android-platform-tools'], { stdio: 'pipe' });
|
|
225
|
+
spinner.stop(r.status === 0);
|
|
226
|
+
if (r.status === 0) {
|
|
227
|
+
return { label: 'adb installed via Homebrew', ok: true };
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
label: 'adb',
|
|
231
|
+
ok: false,
|
|
232
|
+
warn: true,
|
|
233
|
+
detail: 'brew install android-platform-tools failed. Install manually.',
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
async function checkAndFixAndroidStudio(brewAvailable) {
|
|
237
|
+
if (existsSync(STUDIO_APP)) {
|
|
238
|
+
return { label: 'Android Studio installed', ok: true };
|
|
239
|
+
}
|
|
240
|
+
if (!brewAvailable) {
|
|
241
|
+
return {
|
|
242
|
+
label: 'Android Studio',
|
|
243
|
+
ok: false,
|
|
244
|
+
warn: true,
|
|
245
|
+
detail: 'Install from https://developer.android.com/studio',
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
// 대용량(~1GB+)이라 확인 후 설치. 비대화형이면 안내만.
|
|
249
|
+
if (!process.stdout.isTTY) {
|
|
250
|
+
return {
|
|
251
|
+
label: 'Android Studio',
|
|
252
|
+
ok: false,
|
|
253
|
+
warn: true,
|
|
254
|
+
detail: 'Run: brew install --cask android-studio (skipped in non-interactive mode)',
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
const proceed = await confirm({ message: 'Install Android Studio (~1GB) via Homebrew?' });
|
|
258
|
+
if (isCancel(proceed) || !proceed) {
|
|
259
|
+
return {
|
|
260
|
+
label: 'Android Studio',
|
|
261
|
+
ok: false,
|
|
262
|
+
warn: true,
|
|
263
|
+
detail: 'Skipped. Run: brew install --cask android-studio',
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
const spinner = createSpinner('Installing Android Studio via Homebrew…');
|
|
267
|
+
spinner.start();
|
|
268
|
+
const r = spawnSync('brew', ['install', '--cask', 'android-studio'], { stdio: 'pipe' });
|
|
269
|
+
spinner.stop(r.status === 0);
|
|
270
|
+
if (r.status === 0) {
|
|
271
|
+
return { label: 'Android Studio installed via Homebrew', ok: true };
|
|
272
|
+
}
|
|
273
|
+
return {
|
|
274
|
+
label: 'Android Studio',
|
|
275
|
+
ok: false,
|
|
276
|
+
warn: true,
|
|
277
|
+
detail: 'brew install --cask android-studio failed. Install manually.',
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
function checkAndFixEmulator() {
|
|
281
|
+
// resolveAdb()로 해석한 경로를 쓴다. 직전 단계에서 PATH에 등록했어도 현재 프로세스
|
|
282
|
+
// PATH엔 반영되지 않으므로 'adb'를 그대로 부르면 오탐이 난다.
|
|
283
|
+
const adb = resolveAdb();
|
|
284
|
+
if (!adb) {
|
|
285
|
+
return {
|
|
286
|
+
label: 'No running emulator',
|
|
287
|
+
ok: false,
|
|
288
|
+
warn: true,
|
|
289
|
+
detail: 'adb not found. Install/configure adb first, then start an AVD.',
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
try {
|
|
293
|
+
const out = execSync(`"${adb.path}" devices`, { encoding: 'utf8', stdio: 'pipe' });
|
|
294
|
+
const lines = out.trim().split('\n').slice(1).filter(Boolean);
|
|
295
|
+
if (lines.some((l) => l.startsWith('emulator-'))) {
|
|
296
|
+
return { label: 'Emulator running', ok: true };
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
// adb 실행 실패 — 아래 힌트로
|
|
301
|
+
}
|
|
302
|
+
let hint = 'Start an AVD from Android Studio > Device Manager';
|
|
303
|
+
try {
|
|
304
|
+
const first = execSync('emulator -list-avds', { encoding: 'utf8', stdio: 'pipe' })
|
|
305
|
+
.trim()
|
|
306
|
+
.split('\n')[0]
|
|
307
|
+
?.trim();
|
|
308
|
+
if (first)
|
|
309
|
+
hint = `Start an AVD: emulator @${first} (or Android Studio > Device Manager)`;
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
// emulator 미설치 — 일반 힌트 유지
|
|
313
|
+
}
|
|
314
|
+
return { label: 'No running emulator', ok: false, warn: true, detail: hint };
|
|
315
|
+
}
|
|
316
|
+
// 자동 등록을 지원하는 셸의 rc 경로. 그 외 셸은 null(수동 안내).
|
|
317
|
+
function shellRcPath() {
|
|
318
|
+
const shell = process.env.SHELL ?? '';
|
|
319
|
+
const home = homedir();
|
|
320
|
+
if (shell.includes('zsh'))
|
|
321
|
+
return join(home, '.zshrc');
|
|
322
|
+
if (shell.includes('bash'))
|
|
323
|
+
return join(home, '.bashrc');
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
326
|
+
function registerPathInShellRc(platformTools) {
|
|
327
|
+
const file = shellRcPath();
|
|
328
|
+
if (!file)
|
|
329
|
+
return null;
|
|
330
|
+
const existing = existsSync(file) ? readFileSync(file, 'utf8') : '';
|
|
331
|
+
if (existing.includes(PATH_MARKER_START)) {
|
|
332
|
+
return { added: false, file };
|
|
333
|
+
}
|
|
334
|
+
const block = `\n${PATH_MARKER_START}\nexport PATH="${platformTools}:$PATH"\n${PATH_MARKER_END}\n`;
|
|
335
|
+
appendFileSync(file, block);
|
|
336
|
+
return { added: true, file };
|
|
337
|
+
}
|
|
338
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/lib/setup.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.8.0-next.0",
|
|
4
4
|
"description": "Self-hosted iOS/Android simulator streaming for the whole team",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ios",
|
|
@@ -47,10 +47,10 @@
|
|
|
47
47
|
"cac": "^6.7.14",
|
|
48
48
|
"ws": "^8.0.0",
|
|
49
49
|
"zod": "^4.4.3",
|
|
50
|
-
"@tapflowio/agent-core": "0.
|
|
51
|
-
"@tapflowio/android-agent": "0.
|
|
52
|
-
"@tapflowio/ios-agent": "0.
|
|
53
|
-
"@tapflowio/relay": "0.
|
|
50
|
+
"@tapflowio/agent-core": "0.8.0-next.0",
|
|
51
|
+
"@tapflowio/android-agent": "0.8.0-next.0",
|
|
52
|
+
"@tapflowio/ios-agent": "0.8.0-next.0",
|
|
53
|
+
"@tapflowio/relay": "0.8.0-next.0"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@types/node": "^20.0.0",
|