tapflow 0.7.0 → 0.8.0-next.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/README.md +1 -1
- package/dist/commands/doctor.d.ts +4 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +23 -10
- 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 +78 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/doctor.d.ts +6 -1
- package/dist/lib/doctor.d.ts.map +1 -1
- package/dist/lib/doctor.js +76 -50
- 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 +443 -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,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC/F"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { runDoctorChecks } from '../lib/doctor.js';
|
|
2
|
-
import { banner, step, GREEN, RED, YELLOW, BOLD, DIM, R } from '../lib/print.js';
|
|
2
|
+
import { banner, step, warn, 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,37 @@ 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
|
-
|
|
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 = {}) {
|
|
26
|
+
if (opts.platform && opts.platform !== 'ios' && opts.platform !== 'android') {
|
|
27
|
+
warn(`Unknown platform: ${opts.platform}. Supported: ios, android`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
const result = await runDoctorChecks(opts.platform);
|
|
31
|
+
if (opts.json) {
|
|
32
|
+
const ok = !hasFailures(result);
|
|
33
|
+
console.log(JSON.stringify({ ok, common: result.common, ios: result.ios, android: result.android }, null, 2));
|
|
34
|
+
if (!ok)
|
|
35
|
+
process.exit(1);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
24
38
|
console.log('\ntapflow doctor\n');
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
hasFailure = printChecks(result.common) || hasFailure;
|
|
39
|
+
const hasFailure = hasFailures(result);
|
|
40
|
+
printChecks(result.common);
|
|
28
41
|
if (result.ios) {
|
|
29
42
|
console.log(`\n ${BOLD}iOS${R}`);
|
|
30
|
-
|
|
43
|
+
printChecks(result.ios);
|
|
31
44
|
}
|
|
32
45
|
if (result.android) {
|
|
33
46
|
console.log(`\n ${BOLD}Android${R}`);
|
|
34
|
-
|
|
47
|
+
printChecks(result.android);
|
|
35
48
|
}
|
|
36
49
|
console.log();
|
|
37
50
|
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":"AAuCA,wBAAsB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgC/D"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { confirm, isCancel } from '@clack/prompts';
|
|
2
|
+
import { runSetupAndroid, runSetupIos } from '../lib/setup.js';
|
|
3
|
+
import { resolveAdb } from '../lib/doctor.js';
|
|
4
|
+
import { warn, banner, BOLD, GREEN, RED, YELLOW, DIM, R } from '../lib/print.js';
|
|
5
|
+
const RUNNERS = {
|
|
6
|
+
ios: runSetupIos,
|
|
7
|
+
android: runSetupAndroid,
|
|
8
|
+
};
|
|
9
|
+
// 인자 없이 실행 시 환경을 보고 가능한 플랫폼을 고른다.
|
|
10
|
+
// macOS면 iOS, adb가 있으면 Android 자동. adb가 없어도 TTY면 Android 세팅 의향을 묻는다.
|
|
11
|
+
async function detectPlatforms() {
|
|
12
|
+
const platforms = [];
|
|
13
|
+
if (process.platform === 'darwin')
|
|
14
|
+
platforms.push('ios');
|
|
15
|
+
if (resolveAdb() !== null) {
|
|
16
|
+
platforms.push('android');
|
|
17
|
+
}
|
|
18
|
+
else if (process.platform === 'darwin' && process.stdout.isTTY) {
|
|
19
|
+
const also = await confirm({ message: 'Also set up Android? (adb not found)' });
|
|
20
|
+
if (!isCancel(also) && also)
|
|
21
|
+
platforms.push('android');
|
|
22
|
+
}
|
|
23
|
+
return platforms;
|
|
24
|
+
}
|
|
25
|
+
function printResults(results) {
|
|
26
|
+
for (const r of results) {
|
|
27
|
+
if (r.ok) {
|
|
28
|
+
console.log(` ${GREEN}✓${R} ${r.label}`);
|
|
29
|
+
if (r.detail)
|
|
30
|
+
console.log(`${DIM} ${r.detail}${R}`);
|
|
31
|
+
}
|
|
32
|
+
else if (r.warn) {
|
|
33
|
+
console.log(` ${YELLOW}⚠${R} ${r.label}`);
|
|
34
|
+
if (r.detail)
|
|
35
|
+
console.log(`${DIM} → ${r.detail}${R}`);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
console.log(` ${RED}✗${R} ${r.label}`);
|
|
39
|
+
if (r.detail)
|
|
40
|
+
console.log(`${DIM} → ${r.detail}${R}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export async function cmdSetup(platform) {
|
|
45
|
+
let targets;
|
|
46
|
+
if (platform) {
|
|
47
|
+
if (!RUNNERS[platform]) {
|
|
48
|
+
warn(`Unknown or unsupported platform: ${platform}. Supported: ios, android`);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
targets = [platform];
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
targets = await detectPlatforms();
|
|
55
|
+
if (targets.length === 0) {
|
|
56
|
+
warn('No supported platform detected. Run: tapflow setup ios | android');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// 각 플랫폼 실행 후, 마지막에 relay/agent READY 톤의 요약 배너로 준비 상태를 알린다.
|
|
61
|
+
const summary = [];
|
|
62
|
+
let allReady = true;
|
|
63
|
+
for (const t of targets) {
|
|
64
|
+
console.log(`\n${BOLD}tapflow setup ${t}${R}\n`);
|
|
65
|
+
const results = await RUNNERS[t]();
|
|
66
|
+
printResults(results);
|
|
67
|
+
const pending = results.filter((r) => !r.ok);
|
|
68
|
+
if (pending.length === 0) {
|
|
69
|
+
summary.push(`${t}: ready`);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
allReady = false;
|
|
73
|
+
summary.push(`${t}: incomplete — ${pending.map((r) => r.label).join(', ')}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
banner(allReady ? 'success' : 'error', allReady ? 'SETUP COMPLETE' : 'SETUP INCOMPLETE', summary);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
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';
|
|
@@ -35,8 +36,12 @@ cli
|
|
|
35
36
|
process.exit(1);
|
|
36
37
|
});
|
|
37
38
|
cli
|
|
38
|
-
.command('doctor', 'Check system prerequisites')
|
|
39
|
-
.
|
|
39
|
+
.command('doctor [platform]', 'Check system prerequisites (ios | android; omit for all)')
|
|
40
|
+
.option('--json', 'Output machine-readable JSON')
|
|
41
|
+
.action((platform, opts) => cmdDoctor({ ...opts, platform }));
|
|
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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/doctor.d.ts
CHANGED
|
@@ -9,5 +9,10 @@ export interface DoctorResult {
|
|
|
9
9
|
ios: DoctorCheck[] | null;
|
|
10
10
|
android: DoctorCheck[] | null;
|
|
11
11
|
}
|
|
12
|
-
export declare function runDoctorChecks(): Promise<DoctorResult>;
|
|
12
|
+
export declare function runDoctorChecks(platform?: string): 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;AAGD,wBAAsB,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAU9E;AAmGD,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,49 @@
|
|
|
1
1
|
import { execSync } from 'node:child_process';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
|
-
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
// platform: 'ios' | 'android' 지정 시 해당 플랫폼만. 없으면 자동(iOS는 macOS에서만, Android은 항상).
|
|
6
|
+
export async function runDoctorChecks(platform) {
|
|
4
7
|
const isMac = process.platform === 'darwin';
|
|
5
|
-
const
|
|
8
|
+
const wantIos = platform === 'ios' || (!platform && isMac);
|
|
9
|
+
const wantAndroid = platform === 'android' || !platform;
|
|
6
10
|
return {
|
|
7
11
|
common: [checkNodeVersion()],
|
|
8
|
-
ios:
|
|
9
|
-
android:
|
|
12
|
+
ios: wantIos ? buildIosChecks(isMac) : null,
|
|
13
|
+
android: wantAndroid ? buildAndroidChecks(resolveAdb()) : null,
|
|
10
14
|
};
|
|
11
15
|
}
|
|
16
|
+
function buildIosChecks(isMac) {
|
|
17
|
+
if (!isMac) {
|
|
18
|
+
return [{ label: 'iOS', ok: false, warn: true, detail: 'iOS testing requires macOS.' }];
|
|
19
|
+
}
|
|
20
|
+
return [checkXcode(), checkSimctl(), checkBootedSimulator()];
|
|
21
|
+
}
|
|
22
|
+
// adb가 없어도 섹션을 숨기지 않고 진단을 노출한다(Android를 세팅하려는 사용자가 볼 수 있도록).
|
|
23
|
+
function buildAndroidChecks(adb) {
|
|
24
|
+
if (!adb) {
|
|
25
|
+
return [
|
|
26
|
+
{
|
|
27
|
+
label: 'adb',
|
|
28
|
+
ok: false,
|
|
29
|
+
warn: true,
|
|
30
|
+
detail: 'adb not found. Run: tapflow setup android',
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
}
|
|
34
|
+
if (adb.inPath) {
|
|
35
|
+
return [checkAdb(adb.path), checkAvdAvailable()];
|
|
36
|
+
}
|
|
37
|
+
return [
|
|
38
|
+
{
|
|
39
|
+
label: 'adb (not in PATH)',
|
|
40
|
+
ok: false,
|
|
41
|
+
warn: true,
|
|
42
|
+
detail: `adb found at ${adb.path} but not in PATH. Run: tapflow setup android`,
|
|
43
|
+
},
|
|
44
|
+
checkAvdAvailable(),
|
|
45
|
+
];
|
|
46
|
+
}
|
|
12
47
|
function checkXcode() {
|
|
13
48
|
try {
|
|
14
49
|
const out = execSync('xcodebuild -version', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
@@ -43,20 +78,20 @@ function checkSimctl() {
|
|
|
43
78
|
};
|
|
44
79
|
}
|
|
45
80
|
}
|
|
81
|
+
// 부팅은 QA Session 접속 시 relay가 on-demand로 한다 — 미부팅은 정상, 디바이스 존재만 확인.
|
|
46
82
|
function checkBootedSimulator() {
|
|
47
83
|
try {
|
|
48
84
|
const raw = execSync('xcrun simctl list devices --json', { encoding: 'utf8', stdio: 'pipe' });
|
|
49
85
|
const data = JSON.parse(raw);
|
|
50
86
|
const allDevices = Object.values(data.devices).flat();
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return { label: `Simulator booted: ${booted.name}`, ok: true };
|
|
87
|
+
if (allDevices.length === 0) {
|
|
88
|
+
return { label: 'Simulator', ok: false, warn: true, detail: 'No simulator available. Run: tapflow setup ios' };
|
|
54
89
|
}
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
? `
|
|
58
|
-
:
|
|
59
|
-
|
|
90
|
+
const booted = allDevices.find((d) => d.state === 'Booted');
|
|
91
|
+
return {
|
|
92
|
+
label: booted ? `Simulator: ${booted.name} (booted)` : `Simulator available (${allDevices.length})`,
|
|
93
|
+
ok: true,
|
|
94
|
+
};
|
|
60
95
|
}
|
|
61
96
|
catch {
|
|
62
97
|
return { label: 'Simulator', ok: false, detail: 'Could not query simulators. Is Xcode installed?' };
|
|
@@ -72,56 +107,47 @@ function checkNodeVersion() {
|
|
|
72
107
|
detail: ok ? undefined : 'Node ≥ 20 required. Install from https://nodejs.org/',
|
|
73
108
|
};
|
|
74
109
|
}
|
|
75
|
-
function resolveAdb() {
|
|
110
|
+
export function resolveAdb() {
|
|
76
111
|
try {
|
|
77
|
-
const
|
|
78
|
-
|
|
112
|
+
const found = execSync('which adb', { encoding: 'utf8', stdio: 'pipe' }).trim();
|
|
113
|
+
if (found)
|
|
114
|
+
return { path: found, inPath: true };
|
|
79
115
|
}
|
|
80
116
|
catch {
|
|
81
|
-
|
|
117
|
+
// PATH에 없으면 표준 SDK 위치 탐색으로 진행
|
|
118
|
+
}
|
|
119
|
+
for (const candidate of standardAdbPaths()) {
|
|
120
|
+
if (existsSync(candidate))
|
|
121
|
+
return { path: candidate, inPath: false };
|
|
82
122
|
}
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
function standardAdbPaths() {
|
|
126
|
+
const paths = [];
|
|
127
|
+
if (process.env.ANDROID_HOME)
|
|
128
|
+
paths.push(join(process.env.ANDROID_HOME, 'platform-tools', 'adb'));
|
|
129
|
+
if (process.env.ANDROID_SDK_ROOT)
|
|
130
|
+
paths.push(join(process.env.ANDROID_SDK_ROOT, 'platform-tools', 'adb'));
|
|
131
|
+
const home = homedir();
|
|
132
|
+
paths.push(join(home, 'Library', 'Android', 'sdk', 'platform-tools', 'adb')); // macOS
|
|
133
|
+
paths.push(join(home, 'Android', 'Sdk', 'platform-tools', 'adb')); // Linux
|
|
134
|
+
return paths;
|
|
83
135
|
}
|
|
84
136
|
function checkAdb(path) {
|
|
85
137
|
return { label: `adb found: ${path}`, ok: true };
|
|
86
138
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
const out = execSync('adb devices', { encoding: 'utf8', stdio: 'pipe' });
|
|
90
|
-
const lines = out.trim().split('\n').slice(1).filter(Boolean);
|
|
91
|
-
const emulator = lines.find((l) => l.startsWith('emulator-'));
|
|
92
|
-
if (!emulator) {
|
|
93
|
-
const hint = listAvdHint();
|
|
94
|
-
return {
|
|
95
|
-
label: 'AVD',
|
|
96
|
-
ok: false,
|
|
97
|
-
warn: true,
|
|
98
|
-
detail: hint
|
|
99
|
-
? `No running emulator. Run: emulator @${hint}`
|
|
100
|
-
: 'No running emulator. Start an AVD from Android Studio > Device Manager.',
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
const serial = emulator.split('\t')[0]?.trim() ?? '';
|
|
104
|
-
try {
|
|
105
|
-
const avdName = execSync(`adb -s ${serial} emu avd name`, { encoding: 'utf8', stdio: 'pipe' })
|
|
106
|
-
.split('\n')[0]
|
|
107
|
-
?.trim() ?? serial;
|
|
108
|
-
return { label: `AVD: ${avdName}`, ok: true };
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
return { label: `AVD: ${serial}`, ok: true };
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
catch {
|
|
115
|
-
return { label: 'AVD', ok: false, detail: 'Could not query running emulators.' };
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
function listAvdHint() {
|
|
139
|
+
// 부팅은 relay on-demand가 한다 — AVD가 하나라도 존재하면 ok.
|
|
140
|
+
function checkAvdAvailable() {
|
|
119
141
|
try {
|
|
120
142
|
const out = execSync('emulator -list-avds', { encoding: 'utf8', stdio: 'pipe' }).trim();
|
|
121
|
-
|
|
143
|
+
const avds = out ? out.split('\n').map((l) => l.trim()).filter(Boolean) : [];
|
|
144
|
+
if (avds.length > 0) {
|
|
145
|
+
return { label: `AVD available: ${avds[0]}`, ok: true };
|
|
146
|
+
}
|
|
122
147
|
}
|
|
123
148
|
catch {
|
|
124
|
-
|
|
149
|
+
// emulator 미설치/조회 실패 — 아래 안내
|
|
125
150
|
}
|
|
151
|
+
return { label: 'AVD', ok: false, warn: true, detail: 'No AVD found. Run: tapflow setup android' };
|
|
126
152
|
}
|
|
127
153
|
//# sourceMappingURL=doctor.js.map
|
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;AAyDzC,wBAAsB,eAAe,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAQlE;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAQ9D"}
|
|
@@ -0,0 +1,443 @@
|
|
|
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
|
+
// Play Store 이미지는 crash 이슈가 있어 google_apis(non-playstore)를 쓴다.
|
|
15
|
+
const AVD_IMAGE_API = 'android-35';
|
|
16
|
+
// 폼팩터별로 해상도가 골고루 분포하도록 4종. device id는 SDK마다 다르므로 후보 중 가용한 첫 id 선택.
|
|
17
|
+
const AVD_SPECS = [
|
|
18
|
+
{ name: 'tapflow-compact', deviceCandidates: ['pixel_5', 'pixel_4a', 'pixel_4'] },
|
|
19
|
+
{ name: 'tapflow-phone', deviceCandidates: ['pixel_7', 'pixel_6', 'pixel'] },
|
|
20
|
+
{ name: 'tapflow-large', deviceCandidates: ['pixel_7_pro', 'pixel_6_pro', 'pixel_4_xl'] },
|
|
21
|
+
{ name: 'tapflow-tablet', deviceCandidates: ['pixel_tablet', 'pixel_c', 'Nexus 10'] },
|
|
22
|
+
];
|
|
23
|
+
function androidSystemImage() {
|
|
24
|
+
const abi = process.arch === 'arm64' ? 'arm64-v8a' : 'x86_64';
|
|
25
|
+
return `system-images;${AVD_IMAGE_API};google_apis;${abi}`;
|
|
26
|
+
}
|
|
27
|
+
// 디바이스 부팅은 하지 않는다 — QA Session 접속 시 relay가 on-demand로 부팅한다.
|
|
28
|
+
// setup은 "부팅 가능한 디바이스/AVD가 준비된 상태"까지만 보장한다.
|
|
29
|
+
// confirm 후 sudo 명령들을 순차 실행(stdio 상속 → sudo가 비번 프롬프트를 직접 처리).
|
|
30
|
+
async function runSudo(message, commands) {
|
|
31
|
+
const proceed = await confirm({ message });
|
|
32
|
+
if (isCancel(proceed) || !proceed)
|
|
33
|
+
return false;
|
|
34
|
+
console.log();
|
|
35
|
+
for (const args of commands) {
|
|
36
|
+
const r = spawnSync('sudo', args, { stdio: 'inherit' });
|
|
37
|
+
if (r.status !== 0)
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
function isXcodeReady() {
|
|
43
|
+
try {
|
|
44
|
+
execSync('xcodebuild -version', { stdio: 'pipe' });
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function hasIosDevice() {
|
|
52
|
+
try {
|
|
53
|
+
const raw = execSync('xcrun simctl list devices --json', { encoding: 'utf8', stdio: 'pipe' });
|
|
54
|
+
const data = JSON.parse(raw);
|
|
55
|
+
return Object.values(data.devices).some((arr) => arr.length > 0);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export async function runSetupAndroid() {
|
|
62
|
+
const results = [];
|
|
63
|
+
const brew = await checkAndFixHomebrew();
|
|
64
|
+
results.push(brew);
|
|
65
|
+
results.push(checkAndFixAdb(brew.ok));
|
|
66
|
+
results.push(await checkAndFixAndroidStudio(brew.ok));
|
|
67
|
+
results.push(await checkAndFixAvd());
|
|
68
|
+
return results;
|
|
69
|
+
}
|
|
70
|
+
export async function runSetupIos() {
|
|
71
|
+
const results = [];
|
|
72
|
+
results.push(await checkAndFixHomebrew());
|
|
73
|
+
const xcode = await checkAndFixXcode();
|
|
74
|
+
results.push(xcode);
|
|
75
|
+
results.push(await checkXcodeActivation(xcode.ok));
|
|
76
|
+
results.push(await checkAndFixSimulator());
|
|
77
|
+
return results;
|
|
78
|
+
}
|
|
79
|
+
async function checkAndFixXcode() {
|
|
80
|
+
if (existsSync(XCODE_APP)) {
|
|
81
|
+
return { label: 'Xcode installed', ok: true };
|
|
82
|
+
}
|
|
83
|
+
// Xcode는 App Store에서만 설치 가능 — CLI가 직접 설치할 수 없다.
|
|
84
|
+
if (!process.stdout.isTTY) {
|
|
85
|
+
return {
|
|
86
|
+
label: 'Xcode',
|
|
87
|
+
ok: false,
|
|
88
|
+
warn: true,
|
|
89
|
+
detail: `Install Xcode from the App Store: ${XCODE_APPSTORE}`,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
step('Xcode can only be installed from the App Store.');
|
|
93
|
+
const openPrompt = await text({ message: 'Press Enter to open the App Store…' });
|
|
94
|
+
if (isCancel(openPrompt)) {
|
|
95
|
+
return {
|
|
96
|
+
label: 'Xcode',
|
|
97
|
+
ok: false,
|
|
98
|
+
warn: true,
|
|
99
|
+
detail: 'Cancelled. Install Xcode from the App Store and re-run `tapflow setup ios`.',
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
spawnSync('open', ['macappstores://apps.apple.com/app/xcode/id497799835'], { stdio: 'ignore' });
|
|
103
|
+
const continuePrompt = await text({ message: 'Install Xcode, then press Enter to continue…' });
|
|
104
|
+
if (isCancel(continuePrompt)) {
|
|
105
|
+
return {
|
|
106
|
+
label: 'Xcode',
|
|
107
|
+
ok: false,
|
|
108
|
+
warn: true,
|
|
109
|
+
detail: 'Cancelled. Re-run `tapflow setup ios` after installing Xcode.',
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
if (existsSync(XCODE_APP)) {
|
|
113
|
+
return { label: 'Xcode installed', ok: true };
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
label: 'Xcode',
|
|
117
|
+
ok: false,
|
|
118
|
+
warn: true,
|
|
119
|
+
detail: 'Xcode not detected yet. Re-run `tapflow setup ios` after installing.',
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
// 설치됨 ≠ 사용 가능: active developer dir / 라이선스 / first-launch. sudo 조치를 동의 후 직접 실행.
|
|
123
|
+
async function checkXcodeActivation(xcodeInstalled) {
|
|
124
|
+
if (!xcodeInstalled) {
|
|
125
|
+
return { label: 'Xcode activation', ok: false, warn: true, detail: 'Install Xcode first.' };
|
|
126
|
+
}
|
|
127
|
+
const selectHint = `Run: sudo xcode-select -s ${XCODE_DEVELOPER_DIR}`;
|
|
128
|
+
// 1. active developer dir이 Xcode를 가리키게
|
|
129
|
+
let dir = '';
|
|
130
|
+
try {
|
|
131
|
+
dir = execSync('xcode-select -p', { encoding: 'utf8', stdio: 'pipe' }).trim();
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// 미설정 — 아래에서 조치
|
|
135
|
+
}
|
|
136
|
+
if (!dir.includes('Xcode.app')) {
|
|
137
|
+
if (!process.stdout.isTTY) {
|
|
138
|
+
return { label: 'Xcode command-line tools', ok: false, warn: true, detail: selectHint };
|
|
139
|
+
}
|
|
140
|
+
const ok = await runSudo('Set Xcode as the active developer directory (needs sudo)?', [
|
|
141
|
+
['xcode-select', '-s', XCODE_DEVELOPER_DIR],
|
|
142
|
+
]);
|
|
143
|
+
if (!ok) {
|
|
144
|
+
return { label: 'Xcode command-line tools', ok: false, warn: true, detail: selectHint };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// 2. license / first-launch
|
|
148
|
+
if (isXcodeReady()) {
|
|
149
|
+
return { label: 'Xcode ready', ok: true };
|
|
150
|
+
}
|
|
151
|
+
const finishHint = 'Finish Xcode setup: sudo xcodebuild -license accept && sudo xcodebuild -runFirstLaunch';
|
|
152
|
+
if (!process.stdout.isTTY) {
|
|
153
|
+
return { label: 'Xcode setup', ok: false, warn: true, detail: finishHint };
|
|
154
|
+
}
|
|
155
|
+
const ok = await runSudo('Accept the Xcode license and run first launch (needs sudo)?', [
|
|
156
|
+
['xcodebuild', '-license', 'accept'],
|
|
157
|
+
['xcodebuild', '-runFirstLaunch'],
|
|
158
|
+
]);
|
|
159
|
+
if (ok && isXcodeReady()) {
|
|
160
|
+
return { label: 'Xcode ready', ok: true };
|
|
161
|
+
}
|
|
162
|
+
return { label: 'Xcode setup', ok: false, warn: true, detail: finishHint };
|
|
163
|
+
}
|
|
164
|
+
// 부팅하지 않는다 — 시뮬 런타임/디바이스가 준비됐는지만 보장(없으면 런타임 설치).
|
|
165
|
+
async function checkAndFixSimulator() {
|
|
166
|
+
if (hasIosDevice()) {
|
|
167
|
+
return { label: 'Simulator ready', ok: true };
|
|
168
|
+
}
|
|
169
|
+
const hint = 'No simulator runtime. Run: xcodebuild -downloadPlatform iOS (or install one in Xcode).';
|
|
170
|
+
if (!process.stdout.isTTY) {
|
|
171
|
+
return { label: 'Simulator', ok: false, warn: true, detail: hint };
|
|
172
|
+
}
|
|
173
|
+
const proceed = await confirm({ message: 'No iOS simulator found. Download the iOS simulator runtime?' });
|
|
174
|
+
if (isCancel(proceed) || !proceed) {
|
|
175
|
+
return { label: 'Simulator', ok: false, warn: true, detail: `Skipped. ${hint}` };
|
|
176
|
+
}
|
|
177
|
+
console.log();
|
|
178
|
+
const r = spawnSync('xcodebuild', ['-downloadPlatform', 'iOS'], { stdio: 'inherit' });
|
|
179
|
+
if (r.status === 0 && hasIosDevice()) {
|
|
180
|
+
return { label: 'Simulator runtime installed', ok: true };
|
|
181
|
+
}
|
|
182
|
+
return { label: 'Simulator', ok: false, warn: true, detail: 'Could not prepare a simulator. Open Xcode to install a runtime.' };
|
|
183
|
+
}
|
|
184
|
+
// eval "$(...)"로 감싸 명령 치환 결과(설치 스크립트)가 word splitting 없이 단일 평가되게 한다.
|
|
185
|
+
const HOMEBREW_INSTALL = 'eval "$(/usr/bin/curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"';
|
|
186
|
+
async function checkAndFixHomebrew() {
|
|
187
|
+
try {
|
|
188
|
+
execSync('which brew', { stdio: 'pipe' });
|
|
189
|
+
return { label: 'Homebrew installed', ok: true };
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
// 미설치 — 아래에서 확인 후 설치
|
|
193
|
+
}
|
|
194
|
+
// 원격 스크립트 자동 실행은 명시적 동의가 있을 때만. 비대화형이면 안내만.
|
|
195
|
+
if (!process.stdout.isTTY) {
|
|
196
|
+
return {
|
|
197
|
+
label: 'Homebrew',
|
|
198
|
+
ok: false,
|
|
199
|
+
warn: true,
|
|
200
|
+
detail: 'Install Homebrew: https://brew.sh (skipped in non-interactive mode)',
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
const proceed = await confirm({
|
|
204
|
+
message: 'Homebrew not found. Install it now via the official script? (may prompt for sudo)',
|
|
205
|
+
});
|
|
206
|
+
if (isCancel(proceed) || !proceed) {
|
|
207
|
+
return { label: 'Homebrew', ok: false, warn: true, detail: 'Skipped. Install Homebrew: https://brew.sh' };
|
|
208
|
+
}
|
|
209
|
+
console.log();
|
|
210
|
+
const r = spawnSync('/bin/bash', ['-c', HOMEBREW_INSTALL], { stdio: 'inherit' });
|
|
211
|
+
if (r.status === 0) {
|
|
212
|
+
// 방금 설치한 brew는 현재 프로세스 PATH에 아직 없을 수 있다(셸 재시작 전).
|
|
213
|
+
return {
|
|
214
|
+
label: 'Homebrew installed',
|
|
215
|
+
ok: true,
|
|
216
|
+
detail: "If later steps can't find brew, open a new terminal and re-run tapflow setup.",
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
label: 'Homebrew',
|
|
221
|
+
ok: false,
|
|
222
|
+
warn: true,
|
|
223
|
+
detail: 'Homebrew install failed. Install manually: https://brew.sh',
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
function checkAndFixAdb(brewAvailable) {
|
|
227
|
+
const adb = resolveAdb();
|
|
228
|
+
// 1. PATH에 있음
|
|
229
|
+
if (adb?.inPath) {
|
|
230
|
+
return { label: `adb in PATH: ${adb.path}`, ok: true };
|
|
231
|
+
}
|
|
232
|
+
// 2. 표준 SDK 위치엔 있지만 PATH에 없음 → shell rc에 등록
|
|
233
|
+
if (adb) {
|
|
234
|
+
const platformTools = dirname(adb.path);
|
|
235
|
+
const registered = registerPathInShellRc(platformTools);
|
|
236
|
+
if (!registered) {
|
|
237
|
+
return {
|
|
238
|
+
label: 'adb (not in PATH)',
|
|
239
|
+
ok: false,
|
|
240
|
+
warn: true,
|
|
241
|
+
detail: `adb found at ${adb.path} but your shell ($SHELL) isn't auto-configurable. Add to your shell config: export PATH="${platformTools}:$PATH"`,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
if (registered.added) {
|
|
245
|
+
return {
|
|
246
|
+
label: 'adb added to PATH',
|
|
247
|
+
ok: true,
|
|
248
|
+
detail: `Added ${platformTools} to PATH in ${registered.file}. Restart your shell or run: source ${registered.file}`,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
return {
|
|
252
|
+
label: 'adb PATH already configured',
|
|
253
|
+
ok: true,
|
|
254
|
+
detail: `${platformTools} already registered in ${registered.file}`,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
// 3. 어디에도 없음 → brew 설치
|
|
258
|
+
if (!brewAvailable) {
|
|
259
|
+
return {
|
|
260
|
+
label: 'adb',
|
|
261
|
+
ok: false,
|
|
262
|
+
warn: true,
|
|
263
|
+
detail: 'Install Homebrew first, then: brew install android-platform-tools',
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
const spinner = createSpinner('Installing android-platform-tools via Homebrew…');
|
|
267
|
+
spinner.start();
|
|
268
|
+
const r = spawnSync('brew', ['install', 'android-platform-tools'], { stdio: 'pipe' });
|
|
269
|
+
spinner.stop(r.status === 0);
|
|
270
|
+
if (r.status === 0) {
|
|
271
|
+
return { label: 'adb installed via Homebrew', ok: true };
|
|
272
|
+
}
|
|
273
|
+
return {
|
|
274
|
+
label: 'adb',
|
|
275
|
+
ok: false,
|
|
276
|
+
warn: true,
|
|
277
|
+
detail: 'brew install android-platform-tools failed. Install manually.',
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
async function checkAndFixAndroidStudio(brewAvailable) {
|
|
281
|
+
if (existsSync(STUDIO_APP)) {
|
|
282
|
+
return { label: 'Android Studio installed', ok: true };
|
|
283
|
+
}
|
|
284
|
+
if (!brewAvailable) {
|
|
285
|
+
return {
|
|
286
|
+
label: 'Android Studio',
|
|
287
|
+
ok: false,
|
|
288
|
+
warn: true,
|
|
289
|
+
detail: 'Install from https://developer.android.com/studio',
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
// 대용량(~1GB+)이라 확인 후 설치. 비대화형이면 안내만.
|
|
293
|
+
if (!process.stdout.isTTY) {
|
|
294
|
+
return {
|
|
295
|
+
label: 'Android Studio',
|
|
296
|
+
ok: false,
|
|
297
|
+
warn: true,
|
|
298
|
+
detail: 'Run: brew install --cask android-studio (skipped in non-interactive mode)',
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
const proceed = await confirm({ message: 'Install Android Studio (~1GB) via Homebrew?' });
|
|
302
|
+
if (isCancel(proceed) || !proceed) {
|
|
303
|
+
return {
|
|
304
|
+
label: 'Android Studio',
|
|
305
|
+
ok: false,
|
|
306
|
+
warn: true,
|
|
307
|
+
detail: 'Skipped. Run: brew install --cask android-studio',
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
const spinner = createSpinner('Installing Android Studio via Homebrew…');
|
|
311
|
+
spinner.start();
|
|
312
|
+
const r = spawnSync('brew', ['install', '--cask', 'android-studio'], { stdio: 'pipe' });
|
|
313
|
+
spinner.stop(r.status === 0);
|
|
314
|
+
if (r.status === 0) {
|
|
315
|
+
return { label: 'Android Studio installed via Homebrew', ok: true };
|
|
316
|
+
}
|
|
317
|
+
return {
|
|
318
|
+
label: 'Android Studio',
|
|
319
|
+
ok: false,
|
|
320
|
+
warn: true,
|
|
321
|
+
detail: 'brew install --cask android-studio failed. Install manually.',
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
// 부팅하지 않는다 — AVD가 하나라도 준비됐는지만 보장(없으면 시스템 이미지 + AVD 생성).
|
|
325
|
+
async function checkAndFixAvd() {
|
|
326
|
+
const avds = listAvds();
|
|
327
|
+
if (avds.length > 0) {
|
|
328
|
+
return { label: `AVD ready: ${avds[0]}`, ok: true };
|
|
329
|
+
}
|
|
330
|
+
const manualHint = 'Create an AVD in Android Studio > Device Manager.';
|
|
331
|
+
if (!process.stdout.isTTY) {
|
|
332
|
+
return { label: 'AVD', ok: false, warn: true, detail: `No AVD found. ${manualHint}` };
|
|
333
|
+
}
|
|
334
|
+
const proceed = await confirm({
|
|
335
|
+
message: 'No Android Virtual Device found. Create a set of AVDs now? (downloads a system image)',
|
|
336
|
+
});
|
|
337
|
+
if (isCancel(proceed) || !proceed) {
|
|
338
|
+
return { label: 'AVD', ok: false, warn: true, detail: `Skipped. ${manualHint}` };
|
|
339
|
+
}
|
|
340
|
+
const result = createAvds();
|
|
341
|
+
if (result.ok) {
|
|
342
|
+
return { label: `AVDs created: ${result.created.join(', ')}`, ok: true };
|
|
343
|
+
}
|
|
344
|
+
return { label: 'AVD', ok: false, warn: true, detail: result.detail ?? manualHint };
|
|
345
|
+
}
|
|
346
|
+
function listAvds() {
|
|
347
|
+
try {
|
|
348
|
+
const out = execSync('emulator -list-avds', { encoding: 'utf8', stdio: 'pipe' }).trim();
|
|
349
|
+
return out ? out.split('\n').map((l) => l.trim()).filter(Boolean) : [];
|
|
350
|
+
}
|
|
351
|
+
catch {
|
|
352
|
+
return [];
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
function resolveAndroidSdk() {
|
|
356
|
+
const candidates = [
|
|
357
|
+
process.env.ANDROID_HOME,
|
|
358
|
+
process.env.ANDROID_SDK_ROOT,
|
|
359
|
+
join(homedir(), 'Library', 'Android', 'sdk'), // macOS
|
|
360
|
+
join(homedir(), 'Android', 'Sdk'), // Linux
|
|
361
|
+
];
|
|
362
|
+
for (const c of candidates) {
|
|
363
|
+
if (c && existsSync(c))
|
|
364
|
+
return c;
|
|
365
|
+
}
|
|
366
|
+
return null;
|
|
367
|
+
}
|
|
368
|
+
function createAvds() {
|
|
369
|
+
const sdk = resolveAndroidSdk();
|
|
370
|
+
if (!sdk) {
|
|
371
|
+
return { ok: false, created: [], detail: 'Android SDK not found. Install it via Android Studio.' };
|
|
372
|
+
}
|
|
373
|
+
const bin = join(sdk, 'cmdline-tools', 'latest', 'bin');
|
|
374
|
+
const sdkmanager = join(bin, 'sdkmanager');
|
|
375
|
+
const avdmanager = join(bin, 'avdmanager');
|
|
376
|
+
if (!existsSync(sdkmanager) || !existsSync(avdmanager)) {
|
|
377
|
+
return {
|
|
378
|
+
ok: false,
|
|
379
|
+
created: [],
|
|
380
|
+
detail: 'Android command-line tools not found. Install "Android SDK Command-line Tools" in Android Studio > SDK Manager.',
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
const image = androidSystemImage();
|
|
384
|
+
console.log();
|
|
385
|
+
// 시스템 이미지 1회 설치 (모든 AVD가 공유). 라이선스는 'y'로 동의.
|
|
386
|
+
const img = spawnSync(sdkmanager, [image], { stdio: 'inherit', input: 'y\n' });
|
|
387
|
+
if (img.status !== 0) {
|
|
388
|
+
return { ok: false, created: [], detail: `Failed to install ${image}.` };
|
|
389
|
+
}
|
|
390
|
+
// 폼팩터별로 가용한 device id를 골라 AVD 생성. ('custom hardware profile?'에 'no')
|
|
391
|
+
const available = listDeviceIds(avdmanager);
|
|
392
|
+
const created = [];
|
|
393
|
+
for (const spec of AVD_SPECS) {
|
|
394
|
+
const device = spec.deviceCandidates.find((d) => available.includes(d));
|
|
395
|
+
if (!device)
|
|
396
|
+
continue;
|
|
397
|
+
const r = spawnSync(avdmanager, ['create', 'avd', '-n', spec.name, '-k', image, '-d', device, '--force'], { stdio: 'inherit', input: 'no\n' });
|
|
398
|
+
if (r.status === 0)
|
|
399
|
+
created.push(spec.name);
|
|
400
|
+
}
|
|
401
|
+
if (created.length === 0) {
|
|
402
|
+
return { ok: false, created, detail: 'Could not create any AVD.' };
|
|
403
|
+
}
|
|
404
|
+
return { ok: true, created };
|
|
405
|
+
}
|
|
406
|
+
function listDeviceIds(avdmanager) {
|
|
407
|
+
try {
|
|
408
|
+
const r = spawnSync(avdmanager, ['list', 'device'], { encoding: 'utf8' });
|
|
409
|
+
const out = r.stdout ?? '';
|
|
410
|
+
const ids = [];
|
|
411
|
+
for (const m of out.matchAll(/id:\s*\d+\s+or\s+"([^"]+)"/g)) {
|
|
412
|
+
if (m[1])
|
|
413
|
+
ids.push(m[1]);
|
|
414
|
+
}
|
|
415
|
+
return ids;
|
|
416
|
+
}
|
|
417
|
+
catch {
|
|
418
|
+
return [];
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
// 자동 등록을 지원하는 셸의 rc 경로. 그 외 셸은 null(수동 안내).
|
|
422
|
+
function shellRcPath() {
|
|
423
|
+
const shell = process.env.SHELL ?? '';
|
|
424
|
+
const home = homedir();
|
|
425
|
+
if (shell.includes('zsh'))
|
|
426
|
+
return join(home, '.zshrc');
|
|
427
|
+
if (shell.includes('bash'))
|
|
428
|
+
return join(home, '.bashrc');
|
|
429
|
+
return null;
|
|
430
|
+
}
|
|
431
|
+
function registerPathInShellRc(platformTools) {
|
|
432
|
+
const file = shellRcPath();
|
|
433
|
+
if (!file)
|
|
434
|
+
return null;
|
|
435
|
+
const existing = existsSync(file) ? readFileSync(file, 'utf8') : '';
|
|
436
|
+
if (existing.includes(PATH_MARKER_START)) {
|
|
437
|
+
return { added: false, file };
|
|
438
|
+
}
|
|
439
|
+
const block = `\n${PATH_MARKER_START}\nexport PATH="${platformTools}:$PATH"\n${PATH_MARKER_END}\n`;
|
|
440
|
+
appendFileSync(file, block);
|
|
441
|
+
return { added: true, file };
|
|
442
|
+
}
|
|
443
|
+
//# 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.1",
|
|
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.1",
|
|
51
|
+
"@tapflowio/android-agent": "0.8.0-next.1",
|
|
52
|
+
"@tapflowio/ios-agent": "0.8.0-next.1",
|
|
53
|
+
"@tapflowio/relay": "0.8.0-next.1"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@types/node": "^20.0.0",
|