@8bitbish/screenshot-service 1.2.6 → 1.2.9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../setup/detect.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAwC7D,wBAAsB,aAAa,IAAI,OAAO,CAAC,cAAc,CAAC,CAW7D;AAwBD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAIrE"}
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../setup/detect.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AA+D7D,wBAAsB,aAAa,IAAI,OAAO,CAAC,cAAc,CAAC,CAyB7D;AAwBD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAarE"}
@@ -9,6 +9,7 @@ const python_1 = require("./python");
9
9
  const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
10
10
  const PMD3 = ["-m", "pymobiledevice3"];
11
11
  const ADB_CANDIDATES = ["/opt/homebrew/bin/adb", "/usr/local/bin/adb", "adb"];
12
+ const IDEVICEPAIR_CANDIDATES = ["/opt/homebrew/bin/idevicepair", "/usr/local/bin/idevicepair", "idevicepair"];
12
13
  function commandExists(bin, args = ["--version"]) {
13
14
  try {
14
15
  (0, child_process_1.execFileSync)(bin, args, { stdio: "ignore", timeout: 3000 });
@@ -18,6 +19,28 @@ function commandExists(bin, args = ["--version"]) {
18
19
  return false;
19
20
  }
20
21
  }
22
+ function xcodeCltInstalled() {
23
+ // `xcode-select -p` prints the active developer dir and exits 0 only when CLT
24
+ // (or Xcode) is installed. On a fresh Mac it exits non-zero with "xcode-select:
25
+ // note: no developer tools were found".
26
+ try {
27
+ (0, child_process_1.execFileSync)("xcode-select", ["-p"], { stdio: "ignore", timeout: 3000 });
28
+ return true;
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ function libimobiledeviceInstalled() {
35
+ for (const p of IDEVICEPAIR_CANDIDATES) {
36
+ try {
37
+ (0, child_process_1.execFileSync)(p, ["--help"], { stdio: "ignore", timeout: 3000 });
38
+ return true;
39
+ }
40
+ catch { }
41
+ }
42
+ return false;
43
+ }
21
44
  function sudoersConfigured() {
22
45
  // We can't read /etc/sudoers.d/* without root, but the file is world-readable
23
46
  // when written via our postinstall (chmod 440 makes it root-only; checking
@@ -41,14 +64,28 @@ async function iosDeviceVisible(python) {
41
64
  }
42
65
  }
43
66
  async function checkIosSetup() {
67
+ const xcodeCommandLineTools = xcodeCltInstalled();
44
68
  const brew = commandExists("brew");
45
- const python = (0, python_1.findPython)();
69
+ // Without CLT, invoking bare `python3` hits macOS's /usr/bin/python3 stub, which
70
+ // pops a system dialog ("python3 command requires the command line developer
71
+ // tools") behind the wizard. Skip detection until CLT lands — install handles it.
72
+ const python = xcodeCommandLineTools ? (0, python_1.findPython)() : null;
46
73
  const pymobiledevice3 = python !== null;
74
+ const libimobiledevice = libimobiledeviceInstalled();
47
75
  const sudoers = sudoersConfigured();
48
76
  const deviceVisible = python ? await iosDeviceVisible(python) : false;
49
77
  // sudoers is convenience (skip password prompt) — not required for capture to work
50
- const ok = brew && pymobiledevice3;
51
- return { brew, python, pymobiledevice3, sudoers, deviceVisible, ok };
78
+ const ok = xcodeCommandLineTools && brew && pymobiledevice3 && libimobiledevice;
79
+ return {
80
+ xcodeCommandLineTools,
81
+ brew,
82
+ python,
83
+ pymobiledevice3,
84
+ libimobiledevice,
85
+ sudoers,
86
+ deviceVisible,
87
+ ok,
88
+ };
52
89
  }
53
90
  function findAdb() {
54
91
  for (const p of ADB_CANDIDATES) {
@@ -73,8 +110,17 @@ async function androidDeviceConnected(adb) {
73
110
  }
74
111
  }
75
112
  async function checkAndroidSetup() {
113
+ const xcodeCommandLineTools = xcodeCltInstalled();
114
+ const brew = commandExists("brew");
76
115
  const adb = findAdb();
77
116
  const deviceConnected = adb ? await androidDeviceConnected(adb) : false;
78
- return { adb, deviceConnected, ok: adb !== null };
117
+ // ADB is the only hard requirement for capture; CLT + brew are only needed to install it.
118
+ return {
119
+ xcodeCommandLineTools,
120
+ brew,
121
+ adb,
122
+ deviceConnected,
123
+ ok: adb !== null,
124
+ };
79
125
  }
80
126
  //# sourceMappingURL=detect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../setup/detect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../setup/detect.ts"],"names":[],"mappings":"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"}
@@ -1,20 +1,22 @@
1
1
  import { SetupProgressCallback } from "./types";
2
2
  /**
3
- * Install everything iOS capture needs:
4
- * 1. Verify Homebrew is present (we don't install it that requires admin and
5
- * a long curl|bash; the wizard sends users to https://brew.sh instead).
6
- * 2. brew install python@3.13 if no compatible python is present.
7
- * 3. pip install pymobiledevice3.
8
- * 4. Write the sudoers rule so the tunnel can start without a password prompt.
3
+ * Install everything iOS capture needs from scratch:
4
+ * 1. Xcode Command Line Tools (Homebrew prereq) triggers macOS GUI + polls.
5
+ * 2. Homebrew itself, via `NONINTERACTIVE=1` + osascript-primed sudo.
6
+ * 3. python@3.13 via brew if no compatible python is present.
7
+ * 4. pymobiledevice3 via pip.
8
+ * 5. libimobiledevice via brew (needed for our trust filter via idevicepair validate).
9
+ * 6. Sudoers rule so the tunnel daemon starts without a password prompt.
9
10
  *
10
- * Each step emits progress. Steps that are already satisfied are reported as
11
- * `status: "skipped"` so the wizard can show them as ticks immediately.
11
+ * Each step emits progress. Already-satisfied steps come through as
12
+ * `status: "skipped"` so the wizard ticks them immediately.
12
13
  */
13
14
  export declare function installIosDeps(onProgress?: SetupProgressCallback): Promise<void>;
14
15
  /**
15
16
  * Install everything Android capture needs:
16
- * 1. Verify Homebrew is present.
17
- * 2. brew install android-platform-tools if adb is missing.
17
+ * 1. Xcode Command Line Tools (Homebrew prereq).
18
+ * 2. Homebrew.
19
+ * 3. brew install android-platform-tools if adb is missing.
18
20
  *
19
21
  * Pairing/connecting a device is a separate step — see {@link pairAndroidWireless}
20
22
  * and the `setup-android` wizard flow.
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../setup/install.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,qBAAqB,EAAiB,MAAM,SAAS,CAAC;AAoE/D;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,UAAU,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkFtF;AAID;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C1F"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../setup/install.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,qBAAqB,EAAiB,MAAM,SAAS,CAAC;AA4O/D;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,UAAU,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8GtF;AAID;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD1F"}
@@ -10,6 +10,19 @@ const path_1 = require("path");
10
10
  const detect_1 = require("./detect");
11
11
  const python_1 = require("./python");
12
12
  const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
13
+ // Where Homebrew installs binaries on Apple Silicon vs Intel. We add both to
14
+ // PATH for child processes so newly-installed `brew` / `python3.13` / `pip` /
15
+ // `idevicepair` are found without needing a fresh shell session.
16
+ const BREW_BIN_PATHS = ["/opt/homebrew/bin", "/usr/local/bin"];
17
+ const BREW_INSTALL_URL = "https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh";
18
+ /** Returns a child-process env with Homebrew's bin dirs prepended to PATH. */
19
+ function brewEnv() {
20
+ const augmentedPath = [
21
+ ...BREW_BIN_PATHS,
22
+ process.env.PATH || "",
23
+ ].filter(Boolean).join(":");
24
+ return { ...process.env, PATH: augmentedPath };
25
+ }
13
26
  function progressEmitter(cb, total) {
14
27
  let index = 0;
15
28
  return {
@@ -33,9 +46,12 @@ function progressEmitter(cb, total) {
33
46
  // Stream a long-running subprocess and forward each stdout/stderr line to the
34
47
  // progress callback's `log` field — gives the wizard a live log tail without
35
48
  // any shell window.
36
- async function runStreaming(bin, args, p, emit) {
49
+ async function runStreaming(bin, args, p, emit, opts = {}) {
37
50
  return new Promise((resolve, reject) => {
38
- const child = (0, child_process_1.spawn)(bin, args, { stdio: ["ignore", "pipe", "pipe"] });
51
+ const child = (0, child_process_1.spawn)(bin, args, {
52
+ stdio: ["ignore", "pipe", "pipe"],
53
+ env: opts.env ?? process.env,
54
+ });
39
55
  const onLine = (chunk) => {
40
56
  for (const line of chunk.toString("utf8").split("\n")) {
41
57
  if (!line.trim())
@@ -67,45 +83,185 @@ async function runAsAdmin(script) {
67
83
  catch { }
68
84
  }
69
85
  }
86
+ // ── Xcode Command Line Tools ─────────────────────────────────────────────────
87
+ function isCltInstalled() {
88
+ try {
89
+ (0, child_process_1.execFileSync)("xcode-select", ["-p"], { stdio: "ignore", timeout: 3000 });
90
+ return true;
91
+ }
92
+ catch {
93
+ return false;
94
+ }
95
+ }
96
+ /**
97
+ * Estimates CLT install progress by measuring the on-disk size of
98
+ * /Library/Developer/CommandLineTools and comparing against the typical
99
+ * final size (~1.5 GB). Apple's installer doesn't expose its true %, so this
100
+ * is approximate — but it gives the user something to watch beyond elapsed
101
+ * seconds. Returns 0 while the folder is empty (download phase).
102
+ */
103
+ function cltInstallPercent() {
104
+ try {
105
+ const out = (0, child_process_1.execFileSync)("du", ["-sk", "/Library/Developer/CommandLineTools"], { encoding: "utf8", timeout: 3000, stdio: ["ignore", "pipe", "ignore"] });
106
+ const kb = parseInt(out.split(/\s+/)[0], 10);
107
+ if (!kb || isNaN(kb))
108
+ return 0;
109
+ // CLT final size varies by macOS version, roughly 1.5–2 GB. 1.5 GB target.
110
+ const targetKb = 1500000;
111
+ return Math.min(95, Math.floor((kb / targetKb) * 100));
112
+ }
113
+ catch {
114
+ return 0;
115
+ }
116
+ }
117
+ /**
118
+ * Triggers the macOS CLT install GUI and polls until it completes (or times out).
119
+ *
120
+ * Apple owns the install UI — we can't auto-click "Install" in the system dialog,
121
+ * and there's no silent install path that doesn't require an Apple ID with a
122
+ * paid developer account. So we trigger the dialog and wait, surfacing elapsed
123
+ * time + an approximate percent (derived from install dir size) as the user
124
+ * waits.
125
+ */
126
+ async function installXcodeCLT(p, emit) {
127
+ // `xcode-select --install` returns immediately after surfacing the dialog.
128
+ // It exits 0 even if the user later cancels; we rely on `-p` polling for truth.
129
+ try {
130
+ await execFileAsync("xcode-select", ["--install"], { timeout: 5000 });
131
+ }
132
+ catch {
133
+ // "Install requested for command line developer tools" — already requested
134
+ // or already installing. Either way, continue to the poll loop.
135
+ }
136
+ emit?.({ ...p, log: "macOS is installing developer tools. Click Install in the dialog if it appeared.", status: "running" });
137
+ const pollIntervalMs = 5000;
138
+ const maxWaitMs = 30 * 60 * 1000; // 30 minutes
139
+ const startedAt = Date.now();
140
+ let lastReport = 0;
141
+ while (Date.now() - startedAt < maxWaitMs) {
142
+ if (isCltInstalled()) {
143
+ emit?.({ ...p, detail: "100% — done", status: "running" });
144
+ return;
145
+ }
146
+ await new Promise(r => setTimeout(r, pollIntervalMs));
147
+ const elapsedMs = Date.now() - startedAt;
148
+ const pct = cltInstallPercent();
149
+ const stageDetail = pct === 0
150
+ ? `Downloading… (${formatElapsed(elapsedMs)} elapsed)`
151
+ : `${pct}% installed (${formatElapsed(elapsedMs)} elapsed)`;
152
+ emit?.({ ...p, detail: stageDetail, status: "running" });
153
+ // Report progress to the log box every ~30 s (less spammy than every 5 s)
154
+ if (elapsedMs - lastReport >= 30000) {
155
+ emit?.({ ...p, detail: stageDetail, log: stageDetail, status: "running" });
156
+ lastReport = elapsedMs;
157
+ }
158
+ }
159
+ throw new Error("Xcode Command Line Tools install didn't complete within 30 minutes. " +
160
+ "Try running `xcode-select --install` from Terminal, then re-run setup.");
161
+ }
162
+ function formatElapsed(ms) {
163
+ const mins = Math.floor(ms / 60000);
164
+ const secs = Math.floor((ms % 60000) / 1000);
165
+ return `${mins}m ${secs.toString().padStart(2, "0")}s`;
166
+ }
167
+ // ── Homebrew ──────────────────────────────────────────────────────────────────
168
+ function isBrewInstalled() {
169
+ try {
170
+ (0, child_process_1.execFileSync)("brew", ["--version"], { stdio: "ignore", timeout: 3000, env: brewEnv() });
171
+ return true;
172
+ }
173
+ catch {
174
+ return false;
175
+ }
176
+ }
177
+ /**
178
+ * Install Homebrew non-interactively.
179
+ *
180
+ * Apple's installer ordinarily wants both a "press Return" confirmation AND a
181
+ * sudo prompt for /opt/homebrew setup. We bypass the first with NONINTERACTIVE=1,
182
+ * and we prime sudo via osascript so the user enters their password once via
183
+ * macOS's native admin dialog (no terminal needed). The 5-minute sudo cache then
184
+ * carries the installer through its privileged operations.
185
+ */
186
+ async function installHomebrew(p, emit) {
187
+ // 1) Prime sudo via osascript admin prompt. This pops the standard macOS
188
+ // password dialog. Once OK'd, sudo timestamp is set for ~5 minutes — enough
189
+ // for the Homebrew installer to run its `sudo` calls non-interactively.
190
+ emit?.({ ...p, log: "Requesting admin password for Homebrew install…", status: "running" });
191
+ try {
192
+ await runAsAdmin("sudo -v");
193
+ }
194
+ catch {
195
+ throw new Error("Admin password is required to install Homebrew. Cancel happened or wrong password — try again.");
196
+ }
197
+ // 2) Run the official installer with NONINTERACTIVE=1. Stream output to the log box.
198
+ emit?.({ ...p, log: "Running the Homebrew installer (this can take 3–5 minutes)…", status: "running" });
199
+ const installScript = `curl -fsSL ${BREW_INSTALL_URL} | /bin/bash`;
200
+ await runStreaming("/bin/bash", ["-c", installScript], p, emit, { env: { ...process.env, NONINTERACTIVE: "1" } });
201
+ // 3) Sanity check.
202
+ if (!isBrewInstalled()) {
203
+ throw new Error("Homebrew installer reported success but `brew --version` still fails. " +
204
+ "Try opening a fresh Terminal and running `brew --version` — if it works there, restart this app.");
205
+ }
206
+ }
70
207
  // ── iOS install ───────────────────────────────────────────────────────────────
71
208
  /**
72
- * Install everything iOS capture needs:
73
- * 1. Verify Homebrew is present (we don't install it that requires admin and
74
- * a long curl|bash; the wizard sends users to https://brew.sh instead).
75
- * 2. brew install python@3.13 if no compatible python is present.
76
- * 3. pip install pymobiledevice3.
77
- * 4. Write the sudoers rule so the tunnel can start without a password prompt.
209
+ * Install everything iOS capture needs from scratch:
210
+ * 1. Xcode Command Line Tools (Homebrew prereq) triggers macOS GUI + polls.
211
+ * 2. Homebrew itself, via `NONINTERACTIVE=1` + osascript-primed sudo.
212
+ * 3. python@3.13 via brew if no compatible python is present.
213
+ * 4. pymobiledevice3 via pip.
214
+ * 5. libimobiledevice via brew (needed for our trust filter via idevicepair validate).
215
+ * 6. Sudoers rule so the tunnel daemon starts without a password prompt.
78
216
  *
79
- * Each step emits progress. Steps that are already satisfied are reported as
80
- * `status: "skipped"` so the wizard can show them as ticks immediately.
217
+ * Each step emits progress. Already-satisfied steps come through as
218
+ * `status: "skipped"` so the wizard ticks them immediately.
81
219
  */
82
220
  async function installIosDeps(onProgress) {
83
221
  if (process.platform !== "darwin") {
84
222
  throw new Error("iOS capture is only supported on macOS.");
85
223
  }
86
- const TOTAL = 4;
224
+ const TOTAL = 6;
87
225
  const emit = progressEmitter(onProgress, TOTAL);
88
- // ── Step 1: Homebrew ───────────────────────────────────────────────────────
89
226
  const status = await (0, detect_1.checkIosSetup)();
90
- if (status.brew) {
227
+ // ── Step 1: Xcode Command Line Tools ─────────────────────────────────────
228
+ if (status.xcodeCommandLineTools) {
229
+ emit.skip("clt", "Xcode Command Line Tools");
230
+ }
231
+ else {
232
+ const p = emit.next("Installing Xcode Command Line Tools", "clt");
233
+ try {
234
+ await installXcodeCLT(p, onProgress);
235
+ emit.update(p, { status: "done" });
236
+ }
237
+ catch (err) {
238
+ emit.update(p, { status: "error", log: err.message });
239
+ throw err;
240
+ }
241
+ }
242
+ // ── Step 2: Homebrew ─────────────────────────────────────────────────────
243
+ if (status.brew || isBrewInstalled()) {
91
244
  emit.skip("brew", "Homebrew");
92
245
  }
93
246
  else {
94
- const p = emit.next("Homebrew not installed", "brew");
95
- emit.update(p, {
96
- status: "error",
97
- log: "Homebrew is required. Install it from https://brew.sh, then run setup again.",
98
- });
99
- throw new Error("Homebrew not installed. Install from https://brew.sh and re-run setup.");
247
+ const p = emit.next("Installing Homebrew", "brew");
248
+ try {
249
+ await installHomebrew(p, onProgress);
250
+ emit.update(p, { status: "done" });
251
+ }
252
+ catch (err) {
253
+ emit.update(p, { status: "error", log: err.message });
254
+ throw err;
255
+ }
100
256
  }
101
- // ── Step 2: python@3.13 (skip if any compatible python already has pmd3) ──
257
+ // ── Step 3: python@3.13 ───────────────────────────────────────────────────
102
258
  if (status.python) {
103
259
  emit.skip("python", `Python (${status.python})`);
104
260
  }
105
261
  else {
106
262
  const p = emit.next("Installing Python 3.13", "python");
107
263
  try {
108
- await runStreaming("brew", ["install", "python@3.13"], p, onProgress);
264
+ await runStreaming("brew", ["install", "python@3.13"], p, onProgress, { env: brewEnv() });
109
265
  emit.update(p, { status: "done" });
110
266
  }
111
267
  catch (err) {
@@ -113,7 +269,7 @@ async function installIosDeps(onProgress) {
113
269
  throw err;
114
270
  }
115
271
  }
116
- // ── Step 3: pymobiledevice3 ───────────────────────────────────────────────
272
+ // ── Step 4: pymobiledevice3 ───────────────────────────────────────────────
117
273
  const python = status.python ?? (0, python_1.findPython)() ?? "python3.13";
118
274
  if (status.pymobiledevice3) {
119
275
  emit.skip("pymobiledevice3", "pymobiledevice3");
@@ -121,9 +277,22 @@ async function installIosDeps(onProgress) {
121
277
  else {
122
278
  const p = emit.next("Installing pymobiledevice3", "pymobiledevice3");
123
279
  try {
124
- // pip is bundled with the python install; pip3.13 may not exist on PATH,
125
- // so we invoke via `python -m pip`.
126
- await runStreaming(python, ["-m", "pip", "install", "--break-system-packages", "--upgrade", "pymobiledevice3"], p, onProgress);
280
+ await runStreaming(python, ["-m", "pip", "install", "--break-system-packages", "--upgrade", "pymobiledevice3"], p, onProgress, { env: brewEnv() });
281
+ emit.update(p, { status: "done" });
282
+ }
283
+ catch (err) {
284
+ emit.update(p, { status: "error", log: err.message });
285
+ throw err;
286
+ }
287
+ }
288
+ // ── Step 5: libimobiledevice (idevicepair for our trust filter) ──────────
289
+ if (status.libimobiledevice) {
290
+ emit.skip("libimobiledevice", "libimobiledevice");
291
+ }
292
+ else {
293
+ const p = emit.next("Installing libimobiledevice", "libimobiledevice");
294
+ try {
295
+ await runStreaming("brew", ["install", "libimobiledevice"], p, onProgress, { env: brewEnv() });
127
296
  emit.update(p, { status: "done" });
128
297
  }
129
298
  catch (err) {
@@ -131,7 +300,7 @@ async function installIosDeps(onProgress) {
131
300
  throw err;
132
301
  }
133
302
  }
134
- // ── Step 4: sudoers (optional but a major UX win) ─────────────────────────
303
+ // ── Step 6: sudoers (optional but a major UX win) ─────────────────────────
135
304
  if (status.sudoers) {
136
305
  emit.skip("sudoers", "Passwordless tunnel configured");
137
306
  }
@@ -159,47 +328,58 @@ async function installIosDeps(onProgress) {
159
328
  // ── Android install ───────────────────────────────────────────────────────────
160
329
  /**
161
330
  * Install everything Android capture needs:
162
- * 1. Verify Homebrew is present.
163
- * 2. brew install android-platform-tools if adb is missing.
331
+ * 1. Xcode Command Line Tools (Homebrew prereq).
332
+ * 2. Homebrew.
333
+ * 3. brew install android-platform-tools if adb is missing.
164
334
  *
165
335
  * Pairing/connecting a device is a separate step — see {@link pairAndroidWireless}
166
336
  * and the `setup-android` wizard flow.
167
337
  */
168
338
  async function installAndroidDeps(onProgress) {
169
339
  if (process.platform !== "darwin") {
170
- // Linux users can apt/dnf install platform-tools themselves; we only auto-
171
- // install on macOS for now. The wizard surfaces a manual-install message.
172
340
  throw new Error("Auto-install of ADB is only supported on macOS. Install android-platform-tools via your package manager.");
173
341
  }
174
- const TOTAL = 2;
342
+ const TOTAL = 3;
175
343
  const emit = progressEmitter(onProgress, TOTAL);
176
344
  const status = await (0, detect_1.checkAndroidSetup)();
177
- // Brew
178
- let brewOk = false;
179
- try {
180
- await execFileAsync("brew", ["--version"], { timeout: 3000 });
181
- brewOk = true;
345
+ // ── Step 1: Xcode Command Line Tools ─────────────────────────────────────
346
+ if (status.xcodeCommandLineTools) {
347
+ emit.skip("clt", "Xcode Command Line Tools");
348
+ }
349
+ else {
350
+ const p = emit.next("Installing Xcode Command Line Tools", "clt");
351
+ try {
352
+ await installXcodeCLT(p, onProgress);
353
+ emit.update(p, { status: "done" });
354
+ }
355
+ catch (err) {
356
+ emit.update(p, { status: "error", log: err.message });
357
+ throw err;
358
+ }
182
359
  }
183
- catch { }
184
- if (brewOk) {
360
+ // ── Step 2: Homebrew ─────────────────────────────────────────────────────
361
+ if (status.brew || isBrewInstalled()) {
185
362
  emit.skip("brew", "Homebrew");
186
363
  }
187
364
  else {
188
- const p = emit.next("Homebrew not installed", "brew");
189
- emit.update(p, {
190
- status: "error",
191
- log: "Homebrew is required. Install it from https://brew.sh, then run setup again.",
192
- });
193
- throw new Error("Homebrew not installed. Install from https://brew.sh and re-run setup.");
365
+ const p = emit.next("Installing Homebrew", "brew");
366
+ try {
367
+ await installHomebrew(p, onProgress);
368
+ emit.update(p, { status: "done" });
369
+ }
370
+ catch (err) {
371
+ emit.update(p, { status: "error", log: err.message });
372
+ throw err;
373
+ }
194
374
  }
195
- // ADB
375
+ // ── Step 3: ADB ──────────────────────────────────────────────────────────
196
376
  if (status.adb) {
197
377
  emit.skip("adb", `adb (${status.adb})`);
198
378
  }
199
379
  else {
200
380
  const p = emit.next("Installing android-platform-tools", "adb");
201
381
  try {
202
- await runStreaming("brew", ["install", "android-platform-tools"], p, onProgress);
382
+ await runStreaming("brew", ["install", "android-platform-tools"], p, onProgress, { env: brewEnv() });
203
383
  emit.update(p, { status: "done" });
204
384
  }
205
385
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../setup/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../setup/install.ts"],"names":[],"mappings":";;AA+PA,wCA8GC;AAaD,gDAoDC;AA9aD,iDAA8D;AAC9D,+BAAiC;AACjC,2BAA+C;AAC/C,2BAA4B;AAC5B,+BAA4B;AAC5B,qCAA4D;AAC5D,qCAAsC;AAGtC,MAAM,aAAa,GAAG,IAAA,gBAAS,EAAC,wBAAQ,CAAC,CAAC;AAE1C,6EAA6E;AAC7E,8EAA8E;AAC9E,iEAAiE;AACjE,MAAM,cAAc,GAAG,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAAC;AAC/D,MAAM,gBAAgB,GACpB,oEAAoE,CAAC;AAEvE,8EAA8E;AAC9E,SAAS,OAAO;IACd,MAAM,aAAa,GAAG;QACpB,GAAG,cAAc;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;KACvB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,eAAe,CAAC,EAAqC,EAAE,KAAa;IAC3E,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO;QACL,IAAI,CAAC,KAAa,EAAE,EAAU;YAC5B,KAAK,IAAI,CAAC,CAAC;YACX,MAAM,CAAC,GAAkB,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YACxE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YACR,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,CAAC,CAAgB,EAAE,KAA6B;YACpD,MAAM,MAAM,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;YAClC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;YACb,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,EAAU,EAAE,KAAa;YAC5B,KAAK,IAAI,CAAC,CAAC;YACX,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,6EAA6E;AAC7E,oBAAoB;AACpB,KAAK,UAAU,YAAY,CACzB,GAAW,EACX,IAAc,EACd,CAAgB,EAChB,IAAuC,EACvC,OAAoC,EAAE;IAEtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,GAAG,EAAE,IAAI,EAAE;YAC7B,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG;SAC7B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE;YAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,SAAS;gBAC3B,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC,CAAC;QACF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CACzB,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,CAChG,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,iFAAiF;AACjF,iEAAiE;AACjE,KAAK,UAAU,UAAU,CAAC,MAAc;IACtC,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,IAAA,WAAM,GAAE,EAAE,4BAA4B,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/E,IAAA,kBAAa,EAAC,UAAU,EAAE,wBAAwB,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,WAAW,EAAE;YAC/B,IAAI;YACJ,oBAAoB,UAAU,iCAAiC;SAChE,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YAAC,IAAA,eAAU,EAAC,UAAU,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,IAAA,4BAAY,EAAC,cAAc,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,iBAAiB;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,4BAAY,EACtB,IAAI,EACJ,CAAC,KAAK,EAAE,qCAAqC,CAAC,EAC9C,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CACzE,CAAC;QACF,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC;YAAE,OAAO,CAAC,CAAC;QAC/B,2EAA2E;QAC3E,MAAM,QAAQ,GAAG,OAAS,CAAC;QAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,eAAe,CAC5B,CAAgB,EAChB,IAAuC;IAEvC,2EAA2E;IAC3E,gFAAgF;IAChF,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,cAAc,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,2EAA2E;QAC3E,gEAAgE;IAClE,CAAC;IAED,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,kFAAkF,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAE7H,MAAM,cAAc,GAAG,IAAI,CAAC;IAC5B,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAE,aAAa;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC;QAC1C,IAAI,cAAc,EAAE,EAAE,CAAC;YACrB,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACzC,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,GAAG,KAAK,CAAC;YAC3B,CAAC,CAAC,iBAAiB,aAAa,CAAC,SAAS,CAAC,WAAW;YACtD,CAAC,CAAC,GAAG,GAAG,gBAAgB,aAAa,CAAC,SAAS,CAAC,WAAW,CAAC;QAC9D,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACzD,0EAA0E;QAC1E,IAAI,SAAS,GAAG,UAAU,IAAI,KAAM,EAAE,CAAC;YACrC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3E,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CACb,sEAAsE;QACtE,wEAAwE,CACzE,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,EAAU;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,KAAM,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,KAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9C,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AACzD,CAAC;AAED,iFAAiF;AAEjF,SAAS,eAAe;IACtB,IAAI,CAAC;QACH,IAAA,4BAAY,EAAC,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QACxF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,eAAe,CAC5B,CAAgB,EAChB,IAAuC;IAEvC,yEAAyE;IACzE,+EAA+E;IAC/E,2EAA2E;IAC3E,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,iDAAiD,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5F,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,gGAAgG,CAAC,CAAC;IACpH,CAAC;IAED,qFAAqF;IACrF,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,6DAA6D,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACxG,MAAM,aAAa,GAAG,cAAc,gBAAgB,cAAc,CAAC;IACnE,MAAM,YAAY,CAChB,WAAW,EACX,CAAC,IAAI,EAAE,aAAa,CAAC,EACrB,CAAC,EACD,IAAI,EACJ,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,EAAE,CACjD,CAAC;IAEF,mBAAmB;IACnB,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,wEAAwE;YACxE,kGAAkG,CACnG,CAAC;IACJ,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF;;;;;;;;;;;GAWG;AACI,KAAK,UAAU,cAAc,CAAC,UAAkC;IACrE,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,CAAC;IAChB,MAAM,IAAI,GAAG,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAa,GAAE,CAAC;IAErC,4EAA4E;IAC5E,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,0BAA0B,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;QAClE,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACjE,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,IAAI,MAAM,CAAC,IAAI,IAAI,eAAe,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACjE,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,QAAQ,CAAC,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YAC1F,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACjE,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,IAAA,mBAAU,GAAE,IAAI,YAAY,CAAC;IAC7D,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,4BAA4B,EAAE,iBAAiB,CAAC,CAAC;QACrE,IAAI,CAAC;YACH,MAAM,YAAY,CAChB,MAAM,EACN,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,yBAAyB,EAAE,WAAW,EAAE,iBAAiB,CAAC,EACnF,CAAC,EACD,UAAU,EACV,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,CACnB,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACjE,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,6BAA6B,EAAE,kBAAkB,CAAC,CAAC;QACvE,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,kBAAkB,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YAC/F,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACjE,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gCAAgC,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,iCAAiC,EAAE,SAAS,CAAC,CAAC;QAClE,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAA,mBAAU,GAAE,IAAI,MAAM,CAAC;YAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;YACtD,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,GAAG,QAAQ,wBAAwB,WAAW,oCAAoC,CAAC;YAChG,MAAM,UAAU,CACd,mBAAmB,IAAI,2CAA2C;gBAChE,+CAA+C,CAClD,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,yEAAyE;YACzE,4DAA4D;YAC5D,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;gBACb,MAAM,EAAE,SAAS;gBACjB,GAAG,EAAE,iGAAiG;aACvG,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF;;;;;;;;GAQG;AACI,KAAK,UAAU,kBAAkB,CAAC,UAAkC;IACzE,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,0GAA0G,CAC3G,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,CAAC;IAChB,MAAM,IAAI,GAAG,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAiB,GAAE,CAAC;IAEzC,4EAA4E;IAC5E,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,0BAA0B,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;QAClE,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACjE,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,IAAI,MAAM,CAAC,IAAI,IAAI,eAAe,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACjE,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QAChE,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,wBAAwB,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YACrG,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACjE,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,12 +1,16 @@
1
1
  export interface IosSetupStatus {
2
+ xcodeCommandLineTools: boolean;
2
3
  brew: boolean;
3
4
  python: string | null;
4
5
  pymobiledevice3: boolean;
6
+ libimobiledevice: boolean;
5
7
  sudoers: boolean;
6
8
  deviceVisible: boolean;
7
9
  ok: boolean;
8
10
  }
9
11
  export interface AndroidSetupStatus {
12
+ xcodeCommandLineTools: boolean;
13
+ brew: boolean;
10
14
  adb: string | null;
11
15
  deviceConnected: boolean;
12
16
  ok: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../setup/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,aAAa;IAC5B,oFAAoF;IACpF,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;AAE/D,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../setup/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,aAAa;IAC5B,oFAAoF;IACpF,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;AAE/D,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
@@ -423,6 +423,9 @@
423
423
  <section class="screen" id="screen-install">
424
424
  <p class="lede" id="install-lede">Installing what's missing. This takes a couple of minutes.</p>
425
425
  <ul class="step-list" id="install-list"></ul>
426
+ <div class="muted" id="clt-note" style="display: none; margin: 8px 0 4px">
427
+ macOS is installing developer tools. This can take 10–15 minutes. Leave the dialog open.
428
+ </div>
426
429
  <div class="log-box">
427
430
  <button class="log-toggle" id="log-toggle">Show details</button>
428
431
  <div class="log-content" id="log-content"></div>
@@ -1021,10 +1024,12 @@
1021
1024
  const status = await window.wizard.checkIos();
1022
1025
  const list = $('detect-list');
1023
1026
  list.innerHTML = '';
1024
- renderStep(list, { id: 'brew', label: 'Homebrew', status: status.brew ? 'done' : 'error' });
1025
- renderStep(list, { id: 'python', label: 'Python', status: status.pymobiledevice3 ? 'done' : 'error' });
1026
- renderStep(list, { id: 'pmd3', label: 'pymobiledevice3', status: status.pymobiledevice3 ? 'done' : 'error' });
1027
- renderStep(list, { id: 'sudoers', label: 'Passwordless tunnel', status: status.sudoers ? 'done' : 'pending',
1027
+ renderStep(list, { id: 'clt', label: 'Xcode Command Line Tools', status: status.xcodeCommandLineTools ? 'done' : 'error' });
1028
+ renderStep(list, { id: 'brew', label: 'Homebrew', status: status.brew ? 'done' : 'error' });
1029
+ renderStep(list, { id: 'python', label: 'Python', status: status.pymobiledevice3 ? 'done' : 'error' });
1030
+ renderStep(list, { id: 'pmd3', label: 'pymobiledevice3', status: status.pymobiledevice3 ? 'done' : 'error' });
1031
+ renderStep(list, { id: 'libimobiledevice', label: 'libimobiledevice', status: status.libimobiledevice ? 'done' : 'error' });
1032
+ renderStep(list, { id: 'sudoers', label: 'Passwordless tunnel', status: status.sudoers ? 'done' : 'pending',
1028
1033
  detail: status.sudoers ? '' : 'Optional — you can skip and enter your Mac password each session.' });
1029
1034
 
1030
1035
  btnPrimary.style.display = '';
@@ -1044,13 +1049,17 @@
1044
1049
  btnPrimary.disabled = true;
1045
1050
  btnPrimary.textContent = 'Installing…';
1046
1051
 
1052
+ const cltNote = $('clt-note');
1053
+ cltNote.style.display = 'none';
1047
1054
  const off = window.wizard.onInstallIosProgress((p) => {
1048
1055
  renderStep($('install-list'), p);
1049
1056
  if (p.log) appendLog(p.log);
1057
+ if (p.id === 'clt') cltNote.style.display = p.status === 'running' ? '' : 'none';
1050
1058
  });
1051
1059
  try {
1052
1060
  await window.wizard.installIos();
1053
1061
  btnPrimary.disabled = false;
1062
+ cltNote.style.display = 'none';
1054
1063
  runDeviceManager();
1055
1064
  } catch (err) {
1056
1065
  btnPrimary.disabled = false;
@@ -1070,11 +1079,13 @@
1070
1079
  const status = await window.wizard.checkAndroid();
1071
1080
  const list = $('detect-list');
1072
1081
  list.innerHTML = '';
1073
- renderStep(list, { id: 'adb', label: 'ADB (Android Debug Bridge)', status: status.adb ? 'done' : 'error' });
1082
+ renderStep(list, { id: 'clt', label: 'Xcode Command Line Tools', status: status.xcodeCommandLineTools ? 'done' : 'error' });
1083
+ renderStep(list, { id: 'brew', label: 'Homebrew', status: status.brew ? 'done' : 'error' });
1084
+ renderStep(list, { id: 'adb', label: 'ADB (Android Debug Bridge)', status: status.adb ? 'done' : 'error' });
1074
1085
 
1075
1086
  btnPrimary.style.display = '';
1076
- if (!status.adb) {
1077
- btnPrimary.textContent = 'Install ADB';
1087
+ if (!status.ok) {
1088
+ btnPrimary.textContent = 'Install missing tools';
1078
1089
  btnPrimary.onclick = runAndroidInstall;
1079
1090
  } else {
1080
1091
  runDeviceManager();
@@ -1087,13 +1098,17 @@
1087
1098
  $('install-error').style.display = 'none';
1088
1099
  btnPrimary.disabled = true;
1089
1100
  btnPrimary.textContent = 'Installing…';
1101
+ const cltNote = $('clt-note');
1102
+ cltNote.style.display = 'none';
1090
1103
  const off = window.wizard.onInstallAndroidProgress((p) => {
1091
1104
  renderStep($('install-list'), p);
1092
1105
  if (p.log) appendLog(p.log);
1106
+ if (p.id === 'clt') cltNote.style.display = p.status === 'running' ? '' : 'none';
1093
1107
  });
1094
1108
  try {
1095
1109
  await window.wizard.installAndroid();
1096
1110
  btnPrimary.disabled = false;
1111
+ cltNote.style.display = 'none';
1097
1112
  runDeviceManager();
1098
1113
  } catch (err) {
1099
1114
  btnPrimary.disabled = false;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@8bitbish/screenshot-service",
3
- "version": "1.2.6",
3
+ "version": "1.2.9",
4
4
  "description": "Capture screenshots and recordings from connected iPhone and Android devices, with a built-in visual setup wizard.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",