@myerscarpenter/quest-dev 1.4.0 → 2.0.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.
Files changed (151) hide show
  1. package/.claude/settings.local.json +7 -0
  2. package/.github/workflows/docs.yml +45 -0
  3. package/.github/workflows/publish.yml +11 -1
  4. package/README.md +27 -0
  5. package/build/cast/decoder.d.ts +48 -0
  6. package/build/cast/decoder.d.ts.map +1 -0
  7. package/build/cast/decoder.js +152 -0
  8. package/build/cast/decoder.js.map +1 -0
  9. package/build/cast/session.d.ts +87 -0
  10. package/build/cast/session.d.ts.map +1 -0
  11. package/build/cast/session.js +565 -0
  12. package/build/cast/session.js.map +1 -0
  13. package/build/commands/logcat.d.ts.map +1 -1
  14. package/build/commands/logcat.js +7 -6
  15. package/build/commands/logcat.js.map +1 -1
  16. package/build/commands/open.d.ts.map +1 -1
  17. package/build/commands/open.js +9 -4
  18. package/build/commands/open.js.map +1 -1
  19. package/build/commands/screenshot.d.ts.map +1 -1
  20. package/build/commands/screenshot.js +17 -20
  21. package/build/commands/screenshot.js.map +1 -1
  22. package/build/commands/stay-awake.d.ts +2 -15
  23. package/build/commands/stay-awake.d.ts.map +1 -1
  24. package/build/commands/stay-awake.js +14 -77
  25. package/build/commands/stay-awake.js.map +1 -1
  26. package/build/daemon/cast-manager.d.ts +42 -0
  27. package/build/daemon/cast-manager.d.ts.map +1 -0
  28. package/build/daemon/cast-manager.js +243 -0
  29. package/build/daemon/cast-manager.js.map +1 -0
  30. package/build/daemon/client.d.ts +40 -0
  31. package/build/daemon/client.d.ts.map +1 -0
  32. package/build/daemon/client.js +133 -0
  33. package/build/daemon/client.js.map +1 -0
  34. package/build/daemon/daemon.d.ts +20 -0
  35. package/build/daemon/daemon.d.ts.map +1 -0
  36. package/build/daemon/daemon.js +130 -0
  37. package/build/daemon/daemon.js.map +1 -0
  38. package/build/daemon/deploy.d.ts +44 -0
  39. package/build/daemon/deploy.d.ts.map +1 -0
  40. package/build/daemon/deploy.js +230 -0
  41. package/build/daemon/deploy.js.map +1 -0
  42. package/build/daemon/logcat-manager.d.ts +39 -0
  43. package/build/daemon/logcat-manager.d.ts.map +1 -0
  44. package/build/daemon/logcat-manager.js +194 -0
  45. package/build/daemon/logcat-manager.js.map +1 -0
  46. package/build/daemon/server.d.ts +19 -0
  47. package/build/daemon/server.d.ts.map +1 -0
  48. package/build/daemon/server.js +482 -0
  49. package/build/daemon/server.js.map +1 -0
  50. package/build/daemon/stay-awake-manager.d.ts +22 -0
  51. package/build/daemon/stay-awake-manager.d.ts.map +1 -0
  52. package/build/daemon/stay-awake-manager.js +74 -0
  53. package/build/daemon/stay-awake-manager.js.map +1 -0
  54. package/build/index.js +285 -45
  55. package/build/index.js.map +1 -1
  56. package/build/public/dashboard.js +749 -0
  57. package/build/public/index.html +12 -0
  58. package/build/public/style.css +106 -0
  59. package/build/utils/adb.d.ts +12 -0
  60. package/build/utils/adb.d.ts.map +1 -1
  61. package/build/utils/adb.js +116 -51
  62. package/build/utils/adb.js.map +1 -1
  63. package/build/utils/casting-apk.d.ts +40 -0
  64. package/build/utils/casting-apk.d.ts.map +1 -0
  65. package/build/utils/casting-apk.js +252 -0
  66. package/build/utils/casting-apk.js.map +1 -0
  67. package/build/utils/config.d.ts +5 -3
  68. package/build/utils/config.d.ts.map +1 -1
  69. package/build/utils/config.js +18 -38
  70. package/build/utils/config.js.map +1 -1
  71. package/build/utils/exec.d.ts +5 -0
  72. package/build/utils/exec.d.ts.map +1 -1
  73. package/build/utils/exec.js +17 -0
  74. package/build/utils/exec.js.map +1 -1
  75. package/build/utils/filename.d.ts +7 -1
  76. package/build/utils/filename.d.ts.map +1 -1
  77. package/build/utils/filename.js +17 -2
  78. package/build/utils/filename.js.map +1 -1
  79. package/build/utils/filename.test.js +33 -1
  80. package/build/utils/filename.test.js.map +1 -1
  81. package/build/utils/jpeg-comment.d.ts +14 -0
  82. package/build/utils/jpeg-comment.d.ts.map +1 -0
  83. package/build/utils/jpeg-comment.js +28 -0
  84. package/build/utils/jpeg-comment.js.map +1 -0
  85. package/build/utils/test-properties.d.ts +34 -0
  86. package/build/utils/test-properties.d.ts.map +1 -0
  87. package/build/utils/test-properties.js +73 -0
  88. package/build/utils/test-properties.js.map +1 -0
  89. package/build/utils/verbose.d.ts +3 -0
  90. package/build/utils/verbose.d.ts.map +1 -0
  91. package/build/utils/verbose.js +13 -0
  92. package/build/utils/verbose.js.map +1 -0
  93. package/package.json +11 -5
  94. package/packages/cast2-protocol/README.md +86 -0
  95. package/packages/cast2-protocol/docs/_config.yml +4 -0
  96. package/packages/cast2-protocol/docs/feature-flags.md +102 -0
  97. package/packages/cast2-protocol/docs/index.md +24 -0
  98. package/packages/cast2-protocol/docs/open-investigations.md +149 -0
  99. package/packages/cast2-protocol/docs/protocol.md +602 -0
  100. package/packages/cast2-protocol/package.json +46 -0
  101. package/packages/cast2-protocol/src/constants.ts +65 -0
  102. package/packages/cast2-protocol/src/index.ts +7 -0
  103. package/packages/cast2-protocol/src/mgik.ts +69 -0
  104. package/packages/cast2-protocol/src/mud.ts +294 -0
  105. package/packages/cast2-protocol/src/pose.ts +99 -0
  106. package/packages/cast2-protocol/src/resolutions.ts +34 -0
  107. package/packages/cast2-protocol/src/types.ts +64 -0
  108. package/packages/cast2-protocol/src/xrsp.ts +73 -0
  109. package/packages/cast2-protocol/tests/mgik.test.ts +80 -0
  110. package/packages/cast2-protocol/tests/mud.test.ts +295 -0
  111. package/packages/cast2-protocol/tests/pose.test.ts +173 -0
  112. package/packages/cast2-protocol/tests/xrsp.test.ts +90 -0
  113. package/packages/cast2-protocol/tsconfig.json +20 -0
  114. package/pnpm-workspace.yaml +2 -0
  115. package/src/cast/decoder.ts +178 -0
  116. package/src/cast/session.ts +708 -0
  117. package/src/commands/logcat.ts +6 -5
  118. package/src/commands/open.ts +10 -3
  119. package/src/commands/screenshot.ts +19 -13
  120. package/src/commands/stay-awake.ts +22 -91
  121. package/src/daemon/adbkit-apkreader.d.ts +14 -0
  122. package/src/daemon/cast-manager.ts +282 -0
  123. package/src/daemon/client.ts +166 -0
  124. package/src/daemon/daemon.ts +169 -0
  125. package/src/daemon/deploy.ts +307 -0
  126. package/src/daemon/logcat-manager.ts +229 -0
  127. package/src/daemon/server.ts +595 -0
  128. package/src/daemon/stay-awake-manager.ts +83 -0
  129. package/src/index.ts +340 -56
  130. package/src/public/dashboard.js +288 -0
  131. package/src/public/index.html +12 -0
  132. package/src/public/style.css +106 -0
  133. package/src/utils/adb.ts +129 -42
  134. package/src/utils/casting-apk.ts +276 -0
  135. package/src/utils/config.ts +18 -36
  136. package/src/utils/exec.ts +20 -0
  137. package/src/utils/filename.test.ts +41 -1
  138. package/src/utils/filename.ts +18 -2
  139. package/src/utils/jpeg-comment.ts +30 -0
  140. package/src/utils/test-properties.ts +94 -0
  141. package/src/utils/verbose.ts +14 -0
  142. package/tests/cast/auto-layer.test.ts +87 -0
  143. package/tests/cast/decoder.test.ts +82 -0
  144. package/tests/cast/session-restart.test.ts +107 -0
  145. package/tests/config.test.ts +17 -22
  146. package/tests/daemon/api-status.test.ts +82 -0
  147. package/tests/daemon/cast-manager.test.ts +69 -0
  148. package/tests/daemon/mjpeg-stream.test.ts +144 -0
  149. package/tests/daemon/pose-endpoint.test.ts +63 -0
  150. package/tests/daemon/start-guard.test.ts +77 -0
  151. package/vitest.config.ts +10 -0
package/build/index.js CHANGED
@@ -7,13 +7,17 @@ import yargs from 'yargs';
7
7
  import { hideBin } from 'yargs/helpers';
8
8
  import { readFileSync } from 'fs';
9
9
  import { fileURLToPath } from 'url';
10
- import { dirname, join } from 'path';
10
+ import { dirname, join, resolve } from 'path';
11
11
  import { screenshotCommand } from './commands/screenshot.js';
12
12
  import { openCommand } from './commands/open.js';
13
- import { startCommand, stopCommand, statusCommand, tailCommand } from './commands/logcat.js';
13
+ import { tailCommand } from './commands/logcat.js';
14
14
  import { batteryCommand } from './commands/battery.js';
15
- import { stayAwakeCommand, stayAwakeWatchdog, stayAwakeStatus, stayAwakeDisable } from './commands/stay-awake.js';
15
+ import { stayAwakeStatus, stayAwakeDisable } from './commands/stay-awake.js';
16
16
  import { saveConfig, loadConfig } from './utils/config.js';
17
+ import { setVerbose } from './utils/verbose.js';
18
+ import { ensureDaemon, discoverDaemon, daemonFetch, resolvePort } from './daemon/client.js';
19
+ import { startDaemon } from './daemon/daemon.js';
20
+ import { extractCastingApk, hasCastingApk, findInstalledMqdh } from './utils/casting-apk.js';
17
21
  // Read version from package.json
18
22
  const __dirname = dirname(fileURLToPath(import.meta.url));
19
23
  const packageJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'));
@@ -25,6 +29,27 @@ const cli = yargs(hideBin(process.argv))
25
29
  .usage('Usage: $0 <command> [options]')
26
30
  .demandCommand(1, '')
27
31
  .strict()
32
+ .option('verbose', {
33
+ describe: 'Show detailed debug output',
34
+ type: 'boolean',
35
+ default: false,
36
+ global: true,
37
+ })
38
+ .option('port', {
39
+ describe: 'Daemon HTTP port (or save with: quest-dev config --port)',
40
+ type: 'number',
41
+ global: true,
42
+ })
43
+ .option('device', {
44
+ describe: 'Quest IP address (or save with: quest-dev config --device)',
45
+ type: 'string',
46
+ global: true,
47
+ })
48
+ .option('host', {
49
+ describe: 'Daemon bind address (default: 127.0.0.1, use 0.0.0.0 for network access)',
50
+ type: 'string',
51
+ global: true,
52
+ })
28
53
  .fail((msg, err, yargs) => {
29
54
  yargs.showHelp();
30
55
  if (err)
@@ -33,8 +58,8 @@ const cli = yargs(hideBin(process.argv))
33
58
  })
34
59
  .help()
35
60
  .alias('help', 'h')
36
- .epilog('Requires ADB and Quest connected via USB. Sets up CDP on port 9223 for cdp-cli.');
37
- // Screenshot command
61
+ .epilog('Requires ADB and Quest connected via USB or Wi-Fi (adb connect).');
62
+ // Screenshot command (standalone — no daemon needed)
38
63
  cli.command('screenshot <directory>', 'Take a screenshot from Quest and save to directory with auto-generated filename', (yargs) => {
39
64
  return yargs
40
65
  .positional('directory', {
@@ -50,7 +75,7 @@ cli.command('screenshot <directory>', 'Take a screenshot from Quest and save to
50
75
  }, async (argv) => {
51
76
  await screenshotCommand(argv.directory, argv.caption);
52
77
  });
53
- // Open command
78
+ // Open command (standalone)
54
79
  cli.command('open <url>', 'Open URL in Quest browser (sets up CDP debugging port forwarding)', (yargs) => {
55
80
  return yargs
56
81
  .positional('url', {
@@ -72,7 +97,7 @@ cli.command('open <url>', 'Open URL in Quest browser (sets up CDP debugging port
72
97
  }, async (argv) => {
73
98
  await openCommand(argv.url, argv.closeOthers, argv.browser);
74
99
  });
75
- // Logcat command
100
+ // Logcat command — delegates to daemon for start/stop/status, tail remains standalone
76
101
  cli.command('logcat <action>', 'Capture Android logcat to files (CRITICAL: always start before testing to avoid losing crash logs)', (yargs) => {
77
102
  return yargs
78
103
  .positional('action', {
@@ -87,31 +112,93 @@ cli.command('logcat <action>', 'Capture Android logcat to files (CRITICAL: alway
87
112
  });
88
113
  }, async (argv) => {
89
114
  const action = argv.action;
90
- const filter = argv.filter;
115
+ if (action === 'tail') {
116
+ await tailCommand();
117
+ return;
118
+ }
119
+ // Delegate to daemon
120
+ const info = await ensureDaemon({ port: argv.port, device: argv.device, host: argv.host });
91
121
  switch (action) {
92
- case 'start':
93
- await startCommand(filter);
94
- break;
95
- case 'stop':
96
- await stopCommand();
122
+ case 'start': {
123
+ const result = await daemonFetch(info, '/logcat/start', {
124
+ body: { filter: argv.filter },
125
+ });
126
+ if (result.ok) {
127
+ console.log(`Capturing (PID: ${result.pid})`);
128
+ console.log(`File: ${result.file}`);
129
+ console.log('');
130
+ console.log('Now run your test. When done: quest-dev logcat stop');
131
+ }
132
+ else {
133
+ console.error('Failed to start logcat capture');
134
+ console.error(JSON.stringify(result, null, 2));
135
+ }
97
136
  break;
98
- case 'status':
99
- await statusCommand();
137
+ }
138
+ case 'stop': {
139
+ const result = await daemonFetch(info, '/logcat/stop', {
140
+ method: 'POST',
141
+ });
142
+ if (result.ok) {
143
+ // Show file info
144
+ const status = await daemonFetch(info, '/logcat/status');
145
+ console.log('Capture stopped');
146
+ if (status.file) {
147
+ console.log(`File: ${status.file}`);
148
+ if (status.size)
149
+ console.log(`Size: ${status.size}`);
150
+ }
151
+ }
100
152
  break;
101
- case 'tail':
102
- await tailCommand();
153
+ }
154
+ case 'status': {
155
+ const result = await daemonFetch(info, '/logcat/status');
156
+ if (result.capturing) {
157
+ console.log(`Capturing (PID: ${result.pid})`);
158
+ if (result.file) {
159
+ console.log(`File: ${result.file}`);
160
+ if (result.size)
161
+ console.log(`Size: ${result.size}`);
162
+ }
163
+ }
164
+ else {
165
+ console.log('Not capturing');
166
+ }
103
167
  break;
104
- default:
105
- console.error(`Unknown action: ${action}`);
106
- process.exit(1);
168
+ }
107
169
  }
108
170
  });
109
- // Battery command
171
+ // Battery command (standalone)
110
172
  cli.command('battery', 'Show Quest battery percentage and charging status', () => { }, async () => {
111
173
  await batteryCommand();
112
174
  });
113
- // Stay-awake command
114
- cli.command('stay-awake', 'Keep Quest awake (disables autosleep, guardian, dialogs)', (yargs) => {
175
+ // Start command — starts daemon with stay-awake for web content workflows
176
+ cli.command('start', 'Start quest-dev daemon (enables stay-awake, serves dashboard for casting)', (yargs) => {
177
+ return yargs
178
+ .option('pin', {
179
+ describe: 'Meta Store PIN for stay-awake (or save with: quest-dev config --pin)',
180
+ type: 'string',
181
+ });
182
+ }, async (argv) => {
183
+ const info = await ensureDaemon({ port: argv.port, device: argv.device, host: argv.host });
184
+ // Enable stay-awake
185
+ const result = await daemonFetch(info, '/stay-awake/enable', {
186
+ body: { pin: argv.pin },
187
+ });
188
+ if (result.ok) {
189
+ console.log('Stay-awake enabled');
190
+ }
191
+ else if (result.error !== 'PIN required') {
192
+ console.warn('Stay-awake:', result.error);
193
+ }
194
+ const url = `http://localhost:${info.port}/`;
195
+ console.log(`\nDaemon running (PID: ${info.pid}, port: ${info.port})`);
196
+ console.log(`Dashboard: ${url}`);
197
+ console.log(`\nStart casting: curl -X POST ${url}cast/start`);
198
+ console.log(`Stop daemon: quest-dev stop`);
199
+ });
200
+ // Stay-awake command — delegates to daemon
201
+ cli.command('stay-awake', 'Keep Quest awake (disables autosleep, guardian, dialogs) via daemon', (yargs) => {
115
202
  return yargs
116
203
  .option('pin', {
117
204
  describe: 'Meta Store PIN (or save with: quest-dev config --pin)',
@@ -135,25 +222,122 @@ cli.command('stay-awake', 'Keep Quest awake (disables autosleep, guardian, dialo
135
222
  describe: 'Show current property values and exit',
136
223
  type: 'boolean',
137
224
  default: false,
138
- })
139
- .option('verbose', {
140
- describe: 'Print battery level on every check (every 60s)',
141
- type: 'boolean',
142
- default: false,
143
- alias: 'v',
144
225
  });
145
226
  }, async (argv) => {
146
227
  if (argv.status) {
147
228
  await stayAwakeStatus();
229
+ return;
230
+ }
231
+ if (argv.disable) {
232
+ // Try daemon first, fall back to direct
233
+ const existing = discoverDaemon();
234
+ if (existing) {
235
+ await daemonFetch(existing, '/stay-awake/disable', { method: 'POST' });
236
+ console.log('Stay-awake disabled via daemon');
237
+ }
238
+ else {
239
+ await stayAwakeDisable(argv.pin);
240
+ }
241
+ return;
148
242
  }
149
- else if (argv.disable) {
150
- await stayAwakeDisable(argv.pin);
243
+ // Enable via daemon
244
+ const info = await ensureDaemon({
245
+ port: argv.port,
246
+ device: argv.device,
247
+ host: argv.host,
248
+ idleTimeout: argv.idleTimeout,
249
+ lowBattery: argv.lowBattery,
250
+ });
251
+ const result = await daemonFetch(info, '/stay-awake/enable', {
252
+ body: { pin: argv.pin },
253
+ });
254
+ if (result.ok) {
255
+ console.log('Stay-awake enabled via daemon');
256
+ console.log(`Daemon PID: ${info.pid}, port: ${info.port}`);
151
257
  }
152
258
  else {
153
- await stayAwakeCommand(argv.pin, argv.idleTimeout, argv.lowBattery, argv.verbose);
259
+ console.error('Failed to enable stay-awake:', result.error);
260
+ process.exit(1);
154
261
  }
155
262
  });
156
- // Config command
263
+ // Deploy command — auto-starts daemon, deploys APK, reports crash/success
264
+ cli.command('deploy <apk>', 'Deploy APK to Quest (auto-starts daemon, enables stay-awake, installs, launches, checks for crash)', (yargs) => {
265
+ return yargs
266
+ .positional('apk', {
267
+ describe: 'Path to APK file',
268
+ type: 'string',
269
+ demandOption: true,
270
+ })
271
+ .option('crash-wait', {
272
+ describe: 'Time in ms to wait before crash check (default: 5000)',
273
+ type: 'number',
274
+ default: 5000,
275
+ });
276
+ }, async (argv) => {
277
+ const apkPath = resolve(argv.apk);
278
+ const info = await ensureDaemon({ port: argv.port, device: argv.device, host: argv.host });
279
+ console.log(`Deploying: ${apkPath}`);
280
+ const result = await daemonFetch(info, '/deploy', {
281
+ body: {
282
+ apk_path: apkPath,
283
+ crash_wait_ms: argv.crashWait,
284
+ },
285
+ });
286
+ if (result.ok) {
287
+ const inst = result.install;
288
+ if (inst) {
289
+ const mode = inst.incremental ? 'incremental' : 'full';
290
+ if (inst.blocksTransferred !== undefined && inst.totalBlocks) {
291
+ const kb = Math.round((inst.bytesTransferred ?? 0) / 1024);
292
+ console.log(`\nInstalled (${mode}, ${inst.installSecs}s): ${inst.blocksTransferred}/${inst.totalBlocks} blocks (~${kb}KB of ${inst.apkSizeMB}MB)`);
293
+ }
294
+ else {
295
+ console.log(`\nInstalled (${mode}, ${inst.installSecs}s)`);
296
+ }
297
+ }
298
+ console.log(`Deploy successful: ${result.package} is running`);
299
+ console.log(`Logcat: ${result.logcatFile}`);
300
+ console.log(`Daemon API: http://127.0.0.1:${info.port}/help`);
301
+ }
302
+ else if (result.crashed) {
303
+ console.error(`\nCRASH DETECTED: ${result.package}`);
304
+ if (result.logcatLines && result.logcatLines.length > 0) {
305
+ console.error(`\n--- ${result.logcatFile} ---`);
306
+ for (const line of result.logcatLines) {
307
+ console.error(line);
308
+ }
309
+ console.error(`--- End ${result.logcatFile} ---\n`);
310
+ }
311
+ if (result.error) {
312
+ console.error(result.error);
313
+ }
314
+ console.error(`Logcat: ${result.logcatFile}`);
315
+ process.exit(1);
316
+ }
317
+ else {
318
+ console.error(`\nDeploy failed: ${result.error}`);
319
+ if (result.logcatFile) {
320
+ console.error(`Logcat: ${result.logcatFile}`);
321
+ }
322
+ process.exit(1);
323
+ }
324
+ });
325
+ // Stop command — shuts down daemon
326
+ cli.command('stop', 'Stop the quest-dev daemon (restores Quest settings)', () => { }, async () => {
327
+ const existing = discoverDaemon();
328
+ if (!existing) {
329
+ console.log('No daemon running');
330
+ return;
331
+ }
332
+ try {
333
+ await daemonFetch(existing, '/shutdown', { method: 'POST' });
334
+ console.log('Daemon shutdown requested');
335
+ }
336
+ catch {
337
+ console.log('Daemon is not responding (may already be stopped)');
338
+ }
339
+ });
340
+ // Config command (standalone)
157
341
  cli.command('config', 'Save default settings for quest-dev commands', (yargs) => {
158
342
  return yargs
159
343
  .option('pin', {
@@ -187,32 +371,88 @@ cli.command('config', 'Save default settings for quest-dev commands', (yargs) =>
187
371
  const values = {};
188
372
  if (argv.pin !== undefined)
189
373
  values.pin = argv.pin;
374
+ if (argv.port !== undefined)
375
+ values.port = argv.port;
376
+ if (argv.device !== undefined)
377
+ values.device = argv.device;
190
378
  if (argv.idleTimeout !== undefined)
191
379
  values.idleTimeout = argv.idleTimeout;
192
380
  if (argv.lowBattery !== undefined)
193
381
  values.lowBattery = argv.lowBattery;
194
382
  if (Object.keys(values).length === 0) {
195
- console.error('No config values provided. Use --pin, --idle-timeout, or --low-battery.');
383
+ console.error('No config values provided. Use --pin, --port, --device, --idle-timeout, or --low-battery.');
196
384
  process.exit(1);
197
385
  }
198
386
  saveConfig(values);
199
387
  console.log('Config saved:');
200
388
  console.log(JSON.stringify(values, null, 2));
389
+ // Warn if device changed while daemon is running
390
+ if (values.device !== undefined && discoverDaemon()) {
391
+ console.log('\nNote: daemon is running. Restart it to use the new device:');
392
+ console.log(' quest-dev stop && quest-dev start');
393
+ }
201
394
  });
202
- // Stay-awake watchdog (internal subcommand, spawned by stay-awake parent)
203
- cli.command('stay-awake-watchdog', false, // Hide from help
204
- (yargs) => {
395
+ // Setup cast extract casting APK from MQDH
396
+ cli.command('setup-cast [source]', 'Extract casting APK from Meta Quest Developer Hub', (yargs) => {
205
397
  return yargs
206
- .option('parent-pid', {
207
- type: 'number',
208
- demandOption: true,
209
- })
210
- .option('pin', {
398
+ .positional('source', {
399
+ describe: 'Path to MQDH (.app, .dmg, .exe.zip, .exe, or directory). Omit to auto-detect.',
211
400
  type: 'string',
212
- demandOption: true,
213
- });
401
+ })
402
+ .example('$0 setup-cast', 'Auto-detect MQDH installation')
403
+ .example('$0 setup-cast "/Applications/Meta Quest Developer Hub.app"', 'macOS .app')
404
+ .example('$0 setup-cast ~/Downloads/MetaQuestDeveloperHub.dmg', 'macOS .dmg')
405
+ .example('$0 setup-cast ~/Downloads/Meta-Quest-Developer-Hub.exe.zip', 'Windows installer');
214
406
  }, async (argv) => {
215
- await stayAwakeWatchdog(argv.parentPid, argv.pin);
407
+ // If APKs already extracted, just confirm
408
+ if (!argv.source && hasCastingApk()) {
409
+ console.log('Casting APKs already extracted. Ready to cast.');
410
+ console.log('(Run with a path argument to re-extract from a newer MQDH version.)');
411
+ return;
412
+ }
413
+ let source = argv.source;
414
+ // Auto-detect if no source provided
415
+ if (!source) {
416
+ const found = findInstalledMqdh();
417
+ if (found) {
418
+ console.log(`Found MQDH: ${found}`);
419
+ source = found;
420
+ }
421
+ else {
422
+ console.log('Could not find Meta Quest Developer Hub on this machine.\n');
423
+ console.log('Download it from:');
424
+ console.log(' https://developer.oculus.com/meta-quest-developer-hub\n');
425
+ console.log('Then run:');
426
+ console.log(' quest-dev setup-cast /path/to/Meta\\ Quest\\ Developer\\ Hub.app (macOS)');
427
+ console.log(' quest-dev setup-cast /path/to/MetaQuestDeveloperHub.dmg (macOS)');
428
+ console.log(' quest-dev setup-cast /path/to/Meta-Quest-Developer-Hub.exe.zip (Windows)');
429
+ process.exit(1);
430
+ }
431
+ }
432
+ console.log('Extracting casting APKs...');
433
+ await extractCastingApk(resolve(source));
434
+ console.log('\nDone. The APK will be auto-installed on your Quest when you start casting.');
435
+ });
436
+ // Hidden daemon subcommand (spawned by client.ts)
437
+ cli.command('daemon', false, // Hide from help
438
+ (yargs) => {
439
+ return yargs
440
+ .option('idle-timeout', { type: 'number' })
441
+ .option('low-battery', { type: 'number' });
442
+ }, async (argv) => {
443
+ await startDaemon({
444
+ port: resolvePort(argv.port),
445
+ device: argv.device,
446
+ host: argv.host,
447
+ idleTimeout: argv.idleTimeout,
448
+ lowBattery: argv.lowBattery,
449
+ });
450
+ });
451
+ // Set verbose flag before any command runs
452
+ cli.middleware((argv) => {
453
+ if (argv.verbose) {
454
+ setVerbose(true);
455
+ }
216
456
  });
217
457
  // Parse and execute
218
458
  cli.parse();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}