@houwert/conductor 0.2.0 → 0.3.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 (53) hide show
  1. package/.claude-plugin/plugin.json +4 -1
  2. package/README.md +121 -21
  3. package/dist/commands/assert-not-visible.js +5 -0
  4. package/dist/commands/assert-visible.js +15 -0
  5. package/dist/commands/back.js +6 -1
  6. package/dist/commands/cheat-sheet.js +2 -0
  7. package/dist/commands/copy-app.js +55 -0
  8. package/dist/commands/daemon.js +4 -0
  9. package/dist/commands/device-pool.js +4 -0
  10. package/dist/commands/erase-text.js +2 -0
  11. package/dist/commands/focused.js +233 -0
  12. package/dist/commands/foreground-app.js +2 -0
  13. package/dist/commands/hide-keyboard.js +2 -0
  14. package/dist/commands/inspect.js +23 -1
  15. package/dist/commands/install.js +69 -4
  16. package/dist/commands/launch-app.js +6 -0
  17. package/dist/commands/list-apps.js +2 -0
  18. package/dist/commands/list-devices.js +70 -7
  19. package/dist/commands/open-link.js +2 -0
  20. package/dist/commands/press-key.js +73 -7
  21. package/dist/commands/run-flow-inline.js +3 -0
  22. package/dist/commands/run-flow.js +4 -0
  23. package/dist/commands/run-parallel.js +2 -0
  24. package/dist/commands/screenshot.js +2 -0
  25. package/dist/commands/scroll-until-visible.js +6 -0
  26. package/dist/commands/scroll.js +6 -0
  27. package/dist/commands/session.js +2 -0
  28. package/dist/commands/set-location.js +2 -0
  29. package/dist/commands/set-orientation.js +2 -0
  30. package/dist/commands/start-device.js +311 -9
  31. package/dist/commands/stop-app.js +2 -0
  32. package/dist/commands/swipe.js +10 -0
  33. package/dist/commands/tap.js +20 -0
  34. package/dist/commands/type.js +2 -0
  35. package/dist/daemon/server.js +64 -22
  36. package/dist/device-picker.js +65 -0
  37. package/dist/drivers/android.js +14 -13
  38. package/dist/drivers/bootstrap.js +179 -6
  39. package/dist/drivers/element-resolver.js +10 -0
  40. package/dist/drivers/flow-runner.js +6 -5
  41. package/dist/drivers/ios.js +2 -1
  42. package/dist/index.js +120 -97
  43. package/dist/postinstall.js +2 -2
  44. package/dist/runner.js +40 -6
  45. package/drivers/ios/conductor-driver-ios.zip +0 -0
  46. package/drivers/ios/conductor-driver-iosUITests-Runner.zip +0 -0
  47. package/drivers/tvos/conductor-driver-tvos-config.xctestrun +121 -0
  48. package/drivers/tvos/conductor-driver-tvos.zip +0 -0
  49. package/drivers/tvos/conductor-driver-tvosUITests-Runner.zip +0 -0
  50. package/package.json +1 -1
  51. package/skills/conductor/SKILL.md +44 -6
  52. package/skills/conductor/references/flow-syntax.md +1 -0
  53. package/skills/skills.yaml +8 -0
@@ -3,25 +3,86 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HELP = void 0;
6
7
  exports.installSkills = installSkills;
8
+ exports.installLocalSkills = installLocalSkills;
7
9
  exports.installPlugin = installPlugin;
10
+ exports.HELP = ` install Install/reinstall Claude Code plugin
11
+ install --skills Copy skills into local .claude/skills/
12
+ install --check Print current install status without modifying anything`;
8
13
  const fs_1 = __importDefault(require("fs"));
9
14
  const os_1 = __importDefault(require("os"));
10
15
  const path_1 = __importDefault(require("path"));
11
16
  const output_js_1 = require("../output.js");
12
17
  const pkg_root_js_1 = require("../pkg-root.js");
13
- async function installSkills(opts) {
18
+ async function installSkills(opts, skillsOnly = false, check = false) {
14
19
  try {
15
- installPlugin();
16
- (0, output_js_1.printSuccess)('Conductor Claude Code plugin installed', opts);
20
+ if (check) {
21
+ return checkInstallStatus(opts);
22
+ }
23
+ if (skillsOnly) {
24
+ installLocalSkills();
25
+ (0, output_js_1.printSuccess)('Conductor skills installed → .claude/skills/conductor/', opts);
26
+ }
27
+ else {
28
+ const version = installPlugin();
29
+ const pluginCacheDir = path_1.default.join(os_1.default.homedir(), '.claude', 'plugins', 'cache', 'conductor', 'conductor', version);
30
+ (0, output_js_1.printSuccess)(`Conductor plugin installed (v${version}) → ${pluginCacheDir}`, opts);
31
+ }
17
32
  return 0;
18
33
  }
19
34
  catch (err) {
20
35
  const message = err instanceof Error ? err.message : String(err);
21
- (0, output_js_1.printError)(`Plugin install failed: ${message}`, opts);
36
+ (0, output_js_1.printError)(`Install failed: ${message}`, opts);
22
37
  return 1;
23
38
  }
24
39
  }
40
+ function checkInstallStatus(opts) {
41
+ const installedPluginsPath = path_1.default.join(os_1.default.homedir(), '.claude', 'plugins', 'installed_plugins.json');
42
+ const localSkillsPath = path_1.default.join(process.cwd(), '.claude', 'skills', 'conductor', 'SKILL.md');
43
+ let pluginVersion = null;
44
+ if (fs_1.default.existsSync(installedPluginsPath)) {
45
+ const installed = JSON.parse(fs_1.default.readFileSync(installedPluginsPath, 'utf8'));
46
+ const entry = installed.plugins.find((p) => p.name === 'conductor');
47
+ if (entry)
48
+ pluginVersion = entry.version;
49
+ }
50
+ const hasLocalSkills = fs_1.default.existsSync(localSkillsPath);
51
+ if (opts.json) {
52
+ (0, output_js_1.printData)({
53
+ globalPlugin: { installed: pluginVersion !== null, version: pluginVersion },
54
+ localSkills: { installed: hasLocalSkills },
55
+ }, opts);
56
+ }
57
+ else {
58
+ if (pluginVersion) {
59
+ console.log(`Global plugin: installed (v${pluginVersion})`);
60
+ }
61
+ else {
62
+ console.log('Global plugin: not installed');
63
+ }
64
+ if (hasLocalSkills) {
65
+ console.log('Local skills: installed → .claude/skills/conductor/');
66
+ }
67
+ else {
68
+ console.log('Local skills: not installed');
69
+ }
70
+ if (!pluginVersion && !hasLocalSkills) {
71
+ console.log('\nRun `conductor install` to install the global plugin.');
72
+ console.log('Run `conductor install --skills` to copy skills into this project.');
73
+ }
74
+ }
75
+ return 0;
76
+ }
77
+ function installLocalSkills() {
78
+ const pkgRoot = (0, pkg_root_js_1.findPkgRoot)(__dirname);
79
+ const skillsSrc = path_1.default.join(pkgRoot, 'skills', 'conductor');
80
+ if (!fs_1.default.existsSync(skillsSrc)) {
81
+ throw new Error(`No skills found at ${skillsSrc}`);
82
+ }
83
+ const skillsDest = path_1.default.join(process.cwd(), '.claude', 'skills', 'conductor');
84
+ copyDir(skillsSrc, skillsDest);
85
+ }
25
86
  function installPlugin() {
26
87
  const pkgRoot = (0, pkg_root_js_1.findPkgRoot)(__dirname);
27
88
  const pkgJsonPath = path_1.default.join(pkgRoot, 'package.json');
@@ -43,11 +104,15 @@ function installPlugin() {
43
104
  let installed = { plugins: [] };
44
105
  if (fs_1.default.existsSync(installedPluginsPath)) {
45
106
  installed = JSON.parse(fs_1.default.readFileSync(installedPluginsPath, 'utf8'));
107
+ if (!Array.isArray(installed.plugins)) {
108
+ installed.plugins = [];
109
+ }
46
110
  }
47
111
  installed.plugins = installed.plugins.filter((p) => p.name !== 'conductor');
48
112
  installed.plugins.push({ name: 'conductor', version, path: pluginCacheDir });
49
113
  fs_1.default.mkdirSync(path_1.default.dirname(installedPluginsPath), { recursive: true });
50
114
  fs_1.default.writeFileSync(installedPluginsPath, JSON.stringify(installed, null, 2));
115
+ return version;
51
116
  }
52
117
  function copyDir(src, dest) {
53
118
  fs_1.default.mkdirSync(dest, { recursive: true });
@@ -1,6 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HELP = void 0;
3
4
  exports.launchApp = launchApp;
5
+ exports.HELP = ` launch-app <appId> Launch app (saves to session)
6
+ --clear-state Clear app data/state before launching
7
+ --clear-keychain Clear keychain before launching
8
+ --no-stop-app Do not stop the app before launching (resume instead of restart)
9
+ --argument key=value Set launch argument (repeatable)`;
4
10
  const runner_js_1 = require("../runner.js");
5
11
  const session_js_1 = require("../session.js");
6
12
  const output_js_1 = require("../output.js");
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HELP = void 0;
3
4
  exports.listApps = listApps;
5
+ exports.HELP = ` list-apps List installed app IDs / package names`;
4
6
  const runner_js_1 = require("../runner.js");
5
7
  const session_js_1 = require("../session.js");
6
8
  const output_js_1 = require("../output.js");
@@ -1,9 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HELP = void 0;
4
+ exports.discoverBootedDevices = discoverBootedDevices;
5
+ exports.discoverAvailableDevices = discoverAvailableDevices;
3
6
  exports.listDevices = listDevices;
7
+ exports.HELP = ` list-devices List booted and available devices/simulators`;
4
8
  const runner_js_1 = require("../runner.js");
5
9
  const output_js_1 = require("../output.js");
6
- async function listDevices(opts) {
10
+ async function discoverBootedDevices() {
7
11
  const devices = [];
8
12
  // Try adb devices (Android)
9
13
  const adb = await (0, runner_js_1.spawnCommand)('adb', ['devices', '-l']);
@@ -28,13 +32,13 @@ async function listDevices(opts) {
28
32
  if (xcrun.success) {
29
33
  try {
30
34
  const parsed = JSON.parse(xcrun.stdout);
31
- for (const [_runtime, sims] of Object.entries(parsed.devices)) {
35
+ for (const [runtime, sims] of Object.entries(parsed.devices)) {
32
36
  for (const sim of sims) {
33
37
  if (sim.state === 'Booted') {
34
38
  devices.push({
35
39
  id: sim.udid,
36
40
  name: sim.name,
37
- platform: 'ios',
41
+ platform: runtime.includes('tvOS') ? 'tvos' : 'ios',
38
42
  status: 'booted',
39
43
  });
40
44
  }
@@ -45,16 +49,75 @@ async function listDevices(opts) {
45
49
  // ignore parse errors
46
50
  }
47
51
  }
48
- if (devices.length === 0) {
52
+ return devices;
53
+ }
54
+ async function discoverAvailableDevices() {
55
+ const devices = [];
56
+ // iOS: all available simulators that are not booted
57
+ const xcrun = await (0, runner_js_1.spawnCommand)('xcrun', ['simctl', 'list', 'devices', '--json']);
58
+ if (xcrun.success) {
59
+ try {
60
+ const parsed = JSON.parse(xcrun.stdout);
61
+ for (const [runtime, sims] of Object.entries(parsed.devices)) {
62
+ for (const sim of sims) {
63
+ if (sim.isAvailable && sim.state !== 'Booted') {
64
+ devices.push({
65
+ id: sim.udid,
66
+ name: sim.name,
67
+ platform: runtime.includes('tvOS') ? 'tvos' : 'ios',
68
+ status: sim.state.toLowerCase(),
69
+ });
70
+ }
71
+ }
72
+ }
73
+ }
74
+ catch {
75
+ // ignore parse errors
76
+ }
77
+ }
78
+ // Android: list available AVDs
79
+ const emu = await (0, runner_js_1.spawnCommand)('emulator', ['-list-avds']);
80
+ if (emu.success) {
81
+ for (const line of emu.stdout.split('\n')) {
82
+ const name = line.trim();
83
+ if (name) {
84
+ devices.push({ id: name, name, platform: 'android', status: 'available' });
85
+ }
86
+ }
87
+ }
88
+ return devices;
89
+ }
90
+ async function listDevices(opts) {
91
+ const [devices, availableDevices] = await Promise.all([
92
+ discoverBootedDevices(),
93
+ discoverAvailableDevices(),
94
+ ]);
95
+ if (devices.length === 0 && availableDevices.length === 0) {
49
96
  (0, output_js_1.printError)('No devices found. Start an emulator or simulator first.', opts);
50
97
  return 1;
51
98
  }
52
99
  if (opts.json) {
53
- (0, output_js_1.printData)({ status: 'ok', devices }, opts);
100
+ (0, output_js_1.printData)({ status: 'ok', devices, availableDevices }, opts);
54
101
  }
55
102
  else {
56
- for (const d of devices) {
57
- console.log(`${d.platform.padEnd(8)} ${d.status.padEnd(10)} ${d.id} ${d.name}`);
103
+ if (devices.length > 0) {
104
+ console.log('Booted devices:');
105
+ for (const d of devices) {
106
+ console.log(` ${d.platform.padEnd(8)} ${d.status.padEnd(10)} ${d.id} ${d.name}`);
107
+ }
108
+ }
109
+ else {
110
+ console.log('No booted devices.');
111
+ }
112
+ console.log('');
113
+ if (availableDevices.length > 0) {
114
+ console.log('Available devices:');
115
+ for (const d of availableDevices) {
116
+ console.log(` ${d.platform.padEnd(8)} ${d.status.padEnd(10)} ${d.id} ${d.name}`);
117
+ }
118
+ }
119
+ else {
120
+ console.log('No available devices.');
58
121
  }
59
122
  }
60
123
  return 0;
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HELP = void 0;
3
4
  exports.openLink = openLink;
5
+ exports.HELP = ` open-link <url> Open a URL / deep link`;
4
6
  const runner_js_1 = require("../runner.js");
5
7
  const output_js_1 = require("../output.js");
6
8
  async function openLink(url, opts = {}, sessionName = 'default') {
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HELP = void 0;
3
4
  exports.pressKey = pressKey;
5
+ exports.HELP = ` press-key <key> Press a key (Enter, Backspace, Home, ...)`;
4
6
  const runner_js_1 = require("../runner.js");
5
7
  const output_js_1 = require("../output.js");
6
8
  const ios_js_1 = require("../drivers/ios.js");
@@ -20,6 +22,26 @@ const VALID_KEYS = [
20
22
  'Back',
21
23
  'Camera',
22
24
  'Search',
25
+ 'Remote Dpad Up',
26
+ 'Remote Dpad Down',
27
+ 'Remote Dpad Left',
28
+ 'Remote Dpad Right',
29
+ 'Remote Dpad Center',
30
+ 'Remote Media Play Pause',
31
+ 'Remote Media Stop',
32
+ 'Remote Media Next',
33
+ 'Remote Media Previous',
34
+ 'Remote Media Rewind',
35
+ 'Remote Media Fast Forward',
36
+ 'Remote System Navigation Up',
37
+ 'Remote System Navigation Down',
38
+ 'Remote Button A',
39
+ 'Remote Button B',
40
+ 'Remote Menu',
41
+ 'TV Input',
42
+ 'TV Input HDMI 1',
43
+ 'TV Input HDMI 2',
44
+ 'TV Input HDMI 3',
23
45
  ];
24
46
  // iOS XCTest pressKey accepts these values (maps to XCUIKeyboardKey)
25
47
  const IOS_KEY_MAP = {
@@ -34,6 +56,16 @@ const IOS_BUTTON_MAP = {
34
56
  Lock: 'lock',
35
57
  Power: 'lock',
36
58
  };
59
+ // tvOS remote: map key names to pressButton values
60
+ const TVOS_REMOTE_BUTTONS = {
61
+ 'Remote Dpad Up': 'up',
62
+ 'Remote Dpad Down': 'down',
63
+ 'Remote Dpad Left': 'left',
64
+ 'Remote Dpad Right': 'right',
65
+ 'Remote Dpad Center': 'select',
66
+ 'Remote Menu': 'menu',
67
+ 'Remote Media Play Pause': 'playPause',
68
+ };
37
69
  // Android keyevent codes
38
70
  const ANDROID_KEYCODE = {
39
71
  Home: 3,
@@ -50,6 +82,27 @@ const ANDROID_KEYCODE = {
50
82
  Search: 84,
51
83
  Escape: 111,
52
84
  End: 123,
85
+ // Android TV remote keys
86
+ 'Remote Dpad Up': 19,
87
+ 'Remote Dpad Down': 20,
88
+ 'Remote Dpad Left': 21,
89
+ 'Remote Dpad Right': 22,
90
+ 'Remote Dpad Center': 23,
91
+ 'Remote Media Play Pause': 85,
92
+ 'Remote Media Stop': 86,
93
+ 'Remote Media Next': 87,
94
+ 'Remote Media Previous': 88,
95
+ 'Remote Media Rewind': 89,
96
+ 'Remote Media Fast Forward': 90,
97
+ 'Remote System Navigation Up': 280,
98
+ 'Remote System Navigation Down': 281,
99
+ 'Remote Button A': 96,
100
+ 'Remote Button B': 97,
101
+ 'Remote Menu': 82,
102
+ 'TV Input': 178,
103
+ 'TV Input HDMI 1': 243,
104
+ 'TV Input HDMI 2': 244,
105
+ 'TV Input HDMI 3': 245,
53
106
  };
54
107
  async function pressKey(key, opts = {}, sessionName = 'default') {
55
108
  if (!key) {
@@ -63,15 +116,28 @@ async function pressKey(key, opts = {}, sessionName = 'default') {
63
116
  }
64
117
  const result = await (0, runner_js_1.runDirect)(async (driver) => {
65
118
  if (driver instanceof ios_js_1.IOSDriver) {
66
- const iosKey = IOS_KEY_MAP[matched];
67
- const iosButton = IOS_BUTTON_MAP[matched];
68
- if (iosKey) {
69
- await driver.pressKey(iosKey);
119
+ if (driver.platform === 'tvos') {
120
+ const tvosButton = TVOS_REMOTE_BUTTONS[matched];
121
+ const iosButton = IOS_BUTTON_MAP[matched];
122
+ if (tvosButton) {
123
+ await driver.pressButton(tvosButton);
124
+ }
125
+ else if (iosButton) {
126
+ await driver.pressButton(iosButton);
127
+ }
128
+ // Keys not mapped on tvOS are silently ignored
70
129
  }
71
- else if (iosButton) {
72
- await driver.pressButton(iosButton);
130
+ else {
131
+ const iosKey = IOS_KEY_MAP[matched];
132
+ const iosButton = IOS_BUTTON_MAP[matched];
133
+ if (iosKey) {
134
+ await driver.pressKey(iosKey);
135
+ }
136
+ else if (iosButton) {
137
+ await driver.pressButton(iosButton);
138
+ }
139
+ // Keys not mapped on iOS (e.g. Back, VolumeUp) are silently ignored
73
140
  }
74
- // Keys not mapped on iOS (e.g. Back, VolumeUp) are silently ignored
75
141
  }
76
142
  else if (driver instanceof android_js_1.AndroidDriver) {
77
143
  const code = ANDROID_KEYCODE[matched];
@@ -1,6 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HELP = void 0;
3
4
  exports.runFlowInline = runFlowInline;
5
+ exports.HELP = ` run-flow-inline <yaml> Run inline YAML commands
6
+ --benchmark Print elapsed time for each command and total flow time`;
4
7
  const runner_js_1 = require("../runner.js");
5
8
  const output_js_1 = require("../output.js");
6
9
  /** run-flow-inline: Execute inline Maestro YAML commands natively via the flow runner. */
@@ -3,7 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HELP = void 0;
6
7
  exports.runFlow = runFlow;
8
+ exports.HELP = ` run-flow <file> [--device <id>] Run a Maestro YAML flow file
9
+ --env KEY=VALUE Inject env var (repeatable; overrides flow env block)
10
+ --benchmark Print elapsed time for each command and total flow time`;
7
11
  const path_1 = __importDefault(require("path"));
8
12
  const runner_js_1 = require("../runner.js");
9
13
  const flow_runner_js_1 = require("../drivers/flow-runner.js");
@@ -3,7 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HELP = void 0;
6
7
  exports.runParallel = runParallel;
8
+ exports.HELP = ` run-parallel --flows-dir <path> Run flows in parallel across all devices`;
7
9
  /**
8
10
  * run-parallel: Run Maestro YAML flows in parallel across all booted simulators.
9
11
  *
@@ -3,7 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HELP = void 0;
6
7
  exports.screenshot = screenshot;
8
+ exports.HELP = ` screenshot [--output <path>] Take screenshot`;
7
9
  const path_1 = __importDefault(require("path"));
8
10
  const promises_1 = __importDefault(require("fs/promises"));
9
11
  const runner_js_1 = require("../runner.js");
@@ -1,6 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HELP = void 0;
3
4
  exports.scrollUntilVisible = scrollUntilVisible;
5
+ exports.HELP = ` scroll-until-visible <element> Scroll until element is visible
6
+ --id <id> Match by accessibility id instead of text
7
+ --text <text> Match by text only (not id)
8
+ --direction <down|up|left|right> Scroll direction (default: down)
9
+ --timeout <ms> Max time in milliseconds (default: 30000)`;
4
10
  const runner_js_1 = require("../runner.js");
5
11
  const output_js_1 = require("../output.js");
6
12
  const ios_js_1 = require("../drivers/ios.js");
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HELP = void 0;
3
4
  exports.scroll = scroll;
5
+ exports.HELP = ` scroll [--direction down|up|left|right]`;
4
6
  const runner_js_1 = require("../runner.js");
5
7
  const output_js_1 = require("../output.js");
6
8
  const ios_js_1 = require("../drivers/ios.js");
@@ -13,6 +15,10 @@ async function scroll(direction = 'down', opts = {}, sessionName = 'default') {
13
15
  return 1;
14
16
  }
15
17
  const result = await (0, runner_js_1.runDirect)(async (driver) => {
18
+ if (driver instanceof ios_js_1.IOSDriver && driver.platform === 'tvos') {
19
+ throw new Error('scroll is not supported on tvOS — Apple TV uses focus-based navigation.\n' +
20
+ 'Use press-key to navigate (e.g. conductor press-key down).');
21
+ }
16
22
  const coords = (0, utils_js_1.swipeCoords)(direction);
17
23
  if (driver instanceof ios_js_1.IOSDriver) {
18
24
  const info = await driver.deviceInfo();
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HELP = void 0;
3
4
  exports.sessionCmd = sessionCmd;
5
+ exports.HELP = ` session [--clear] [--list] Show, clear, or list device sessions`;
4
6
  const session_js_1 = require("../session.js");
5
7
  const output_js_1 = require("../output.js");
6
8
  async function sessionCmd(clear, list, opts = {}, sessionName = 'default') {
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HELP = void 0;
3
4
  exports.setLocation = setLocation;
5
+ exports.HELP = ` set-location --lat <n> --lng <n> Set GPS coordinates`;
4
6
  const runner_js_1 = require("../runner.js");
5
7
  const output_js_1 = require("../output.js");
6
8
  async function setLocation(latitude, longitude, opts = {}, sessionName = 'default') {
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HELP = void 0;
3
4
  exports.setOrientation = setOrientation;
5
+ exports.HELP = ` set-orientation <portrait|landscape> Set device orientation`;
4
6
  const runner_js_1 = require("../runner.js");
5
7
  const output_js_1 = require("../output.js");
6
8
  const VALID = ['portrait', 'landscape'];