devlens-mcp 0.3.0 → 0.3.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.
Files changed (162) hide show
  1. package/README.md +10 -21
  2. package/docs/setup-guide.md +11 -31
  3. package/package.json +1 -1
  4. package/.claude/settings.json +0 -12
  5. package/.claude/settings.local.json +0 -17
  6. package/bin/cli.ts +0 -22
  7. package/bin/register.ts +0 -96
  8. package/dist/src/config/devlens-config.d.ts +0 -92
  9. package/dist/src/config/devlens-config.d.ts.map +0 -1
  10. package/dist/src/config/devlens-config.js +0 -70
  11. package/dist/src/config/devlens-config.js.map +0 -1
  12. package/dist/src/index.d.ts +0 -35
  13. package/dist/src/index.d.ts.map +0 -1
  14. package/dist/src/index.js +0 -8
  15. package/dist/src/index.js.map +0 -1
  16. package/dist/src/metro/cdp-client.d.ts +0 -48
  17. package/dist/src/metro/cdp-client.d.ts.map +0 -1
  18. package/dist/src/metro/cdp-client.js +0 -127
  19. package/dist/src/metro/cdp-client.js.map +0 -1
  20. package/dist/src/metro/log-collector.d.ts +0 -30
  21. package/dist/src/metro/log-collector.d.ts.map +0 -1
  22. package/dist/src/metro/log-collector.js +0 -114
  23. package/dist/src/metro/log-collector.js.map +0 -1
  24. package/dist/src/metro/metro-bridge.d.ts +0 -56
  25. package/dist/src/metro/metro-bridge.d.ts.map +0 -1
  26. package/dist/src/metro/metro-bridge.js +0 -255
  27. package/dist/src/metro/metro-bridge.js.map +0 -1
  28. package/dist/src/metro/network-inspector.d.ts +0 -34
  29. package/dist/src/metro/network-inspector.d.ts.map +0 -1
  30. package/dist/src/metro/network-inspector.js +0 -100
  31. package/dist/src/metro/network-inspector.js.map +0 -1
  32. package/dist/src/platform/android/adb.d.ts +0 -50
  33. package/dist/src/platform/android/adb.d.ts.map +0 -1
  34. package/dist/src/platform/android/adb.js +0 -137
  35. package/dist/src/platform/android/adb.js.map +0 -1
  36. package/dist/src/platform/android/android-device.d.ts +0 -21
  37. package/dist/src/platform/android/android-device.d.ts.map +0 -1
  38. package/dist/src/platform/android/android-device.js +0 -94
  39. package/dist/src/platform/android/android-device.js.map +0 -1
  40. package/dist/src/platform/android/ui-automator.d.ts +0 -17
  41. package/dist/src/platform/android/ui-automator.d.ts.map +0 -1
  42. package/dist/src/platform/android/ui-automator.js +0 -126
  43. package/dist/src/platform/android/ui-automator.js.map +0 -1
  44. package/dist/src/platform/device-manager.d.ts +0 -28
  45. package/dist/src/platform/device-manager.d.ts.map +0 -1
  46. package/dist/src/platform/device-manager.js +0 -185
  47. package/dist/src/platform/device-manager.js.map +0 -1
  48. package/dist/src/platform/device.d.ts +0 -86
  49. package/dist/src/platform/device.d.ts.map +0 -1
  50. package/dist/src/platform/device.js +0 -7
  51. package/dist/src/platform/device.js.map +0 -1
  52. package/dist/src/platform/ios/accessibility.d.ts +0 -17
  53. package/dist/src/platform/ios/accessibility.d.ts.map +0 -1
  54. package/dist/src/platform/ios/accessibility.js +0 -159
  55. package/dist/src/platform/ios/accessibility.js.map +0 -1
  56. package/dist/src/platform/ios/ios-device.d.ts +0 -22
  57. package/dist/src/platform/ios/ios-device.d.ts.map +0 -1
  58. package/dist/src/platform/ios/ios-device.js +0 -97
  59. package/dist/src/platform/ios/ios-device.js.map +0 -1
  60. package/dist/src/platform/ios/simctl.d.ts +0 -54
  61. package/dist/src/platform/ios/simctl.d.ts.map +0 -1
  62. package/dist/src/platform/ios/simctl.js +0 -192
  63. package/dist/src/platform/ios/simctl.js.map +0 -1
  64. package/dist/src/server.d.ts +0 -3
  65. package/dist/src/server.d.ts.map +0 -1
  66. package/dist/src/server.js +0 -176
  67. package/dist/src/server.js.map +0 -1
  68. package/dist/src/snapshot/formatter.d.ts +0 -18
  69. package/dist/src/snapshot/formatter.d.ts.map +0 -1
  70. package/dist/src/snapshot/formatter.js +0 -86
  71. package/dist/src/snapshot/formatter.js.map +0 -1
  72. package/dist/src/snapshot/ref-registry.d.ts +0 -67
  73. package/dist/src/snapshot/ref-registry.d.ts.map +0 -1
  74. package/dist/src/snapshot/ref-registry.js +0 -169
  75. package/dist/src/snapshot/ref-registry.js.map +0 -1
  76. package/dist/src/snapshot/snapshot-differ.d.ts +0 -57
  77. package/dist/src/snapshot/snapshot-differ.d.ts.map +0 -1
  78. package/dist/src/snapshot/snapshot-differ.js +0 -153
  79. package/dist/src/snapshot/snapshot-differ.js.map +0 -1
  80. package/dist/src/tools/app-tools.d.ts +0 -71
  81. package/dist/src/tools/app-tools.d.ts.map +0 -1
  82. package/dist/src/tools/app-tools.js +0 -97
  83. package/dist/src/tools/app-tools.js.map +0 -1
  84. package/dist/src/tools/device-tools.d.ts +0 -53
  85. package/dist/src/tools/device-tools.d.ts.map +0 -1
  86. package/dist/src/tools/device-tools.js +0 -86
  87. package/dist/src/tools/device-tools.js.map +0 -1
  88. package/dist/src/tools/ds-tools.d.ts +0 -65
  89. package/dist/src/tools/ds-tools.d.ts.map +0 -1
  90. package/dist/src/tools/ds-tools.js +0 -314
  91. package/dist/src/tools/ds-tools.js.map +0 -1
  92. package/dist/src/tools/interaction-tools.d.ts +0 -248
  93. package/dist/src/tools/interaction-tools.d.ts.map +0 -1
  94. package/dist/src/tools/interaction-tools.js +0 -391
  95. package/dist/src/tools/interaction-tools.js.map +0 -1
  96. package/dist/src/tools/metro-tools.d.ts +0 -115
  97. package/dist/src/tools/metro-tools.d.ts.map +0 -1
  98. package/dist/src/tools/metro-tools.js +0 -270
  99. package/dist/src/tools/metro-tools.js.map +0 -1
  100. package/dist/src/tools/navigation-tools.d.ts +0 -36
  101. package/dist/src/tools/navigation-tools.d.ts.map +0 -1
  102. package/dist/src/tools/navigation-tools.js +0 -60
  103. package/dist/src/tools/navigation-tools.js.map +0 -1
  104. package/dist/src/tools/screenshot-tools.d.ts +0 -298
  105. package/dist/src/tools/screenshot-tools.d.ts.map +0 -1
  106. package/dist/src/tools/screenshot-tools.js +0 -565
  107. package/dist/src/tools/screenshot-tools.js.map +0 -1
  108. package/dist/src/tools/snapshot-tools.d.ts +0 -161
  109. package/dist/src/tools/snapshot-tools.d.ts.map +0 -1
  110. package/dist/src/tools/snapshot-tools.js +0 -479
  111. package/dist/src/tools/snapshot-tools.js.map +0 -1
  112. package/dist/src/utils/image-preprocess.d.ts +0 -49
  113. package/dist/src/utils/image-preprocess.d.ts.map +0 -1
  114. package/dist/src/utils/image-preprocess.js +0 -322
  115. package/dist/src/utils/image-preprocess.js.map +0 -1
  116. package/dist/src/utils/retry.d.ts +0 -21
  117. package/dist/src/utils/retry.d.ts.map +0 -1
  118. package/dist/src/utils/retry.js +0 -33
  119. package/dist/src/utils/retry.js.map +0 -1
  120. package/dist/src/visual/comparator.d.ts +0 -51
  121. package/dist/src/visual/comparator.d.ts.map +0 -1
  122. package/dist/src/visual/comparator.js +0 -119
  123. package/dist/src/visual/comparator.js.map +0 -1
  124. package/dist/src/visual/layout-analyzer.d.ts +0 -64
  125. package/dist/src/visual/layout-analyzer.d.ts.map +0 -1
  126. package/dist/src/visual/layout-analyzer.js +0 -198
  127. package/dist/src/visual/layout-analyzer.js.map +0 -1
  128. package/dist/src/visual/screenshot.d.ts +0 -17
  129. package/dist/src/visual/screenshot.d.ts.map +0 -1
  130. package/dist/src/visual/screenshot.js +0 -39
  131. package/dist/src/visual/screenshot.js.map +0 -1
  132. package/src/config/devlens-config.ts +0 -76
  133. package/src/index.ts +0 -5
  134. package/src/metro/cdp-client.ts +0 -160
  135. package/src/metro/log-collector.ts +0 -137
  136. package/src/metro/metro-bridge.ts +0 -307
  137. package/src/metro/network-inspector.ts +0 -134
  138. package/src/platform/android/adb.ts +0 -200
  139. package/src/platform/android/android-device.ts +0 -116
  140. package/src/platform/android/ui-automator.ts +0 -141
  141. package/src/platform/device-manager.ts +0 -229
  142. package/src/platform/device.ts +0 -110
  143. package/src/platform/ios/accessibility.ts +0 -189
  144. package/src/platform/ios/ios-device.ts +0 -116
  145. package/src/platform/ios/simctl.ts +0 -244
  146. package/src/server.ts +0 -228
  147. package/src/snapshot/formatter.ts +0 -102
  148. package/src/snapshot/ref-registry.ts +0 -230
  149. package/src/snapshot/snapshot-differ.ts +0 -220
  150. package/src/tools/app-tools.ts +0 -111
  151. package/src/tools/device-tools.ts +0 -96
  152. package/src/tools/ds-tools.ts +0 -395
  153. package/src/tools/interaction-tools.ts +0 -467
  154. package/src/tools/metro-tools.ts +0 -320
  155. package/src/tools/navigation-tools.ts +0 -71
  156. package/src/tools/screenshot-tools.ts +0 -698
  157. package/src/tools/snapshot-tools.ts +0 -585
  158. package/src/utils/image-preprocess.ts +0 -430
  159. package/src/utils/retry.ts +0 -51
  160. package/src/visual/comparator.ts +0 -191
  161. package/src/visual/layout-analyzer.ts +0 -283
  162. package/src/visual/screenshot.ts +0 -49
@@ -1,185 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DeviceManager = void 0;
4
- const child_process_1 = require("child_process");
5
- const util_1 = require("util");
6
- const android_device_js_1 = require("./android/android-device.js");
7
- const ios_device_js_1 = require("./ios/ios-device.js");
8
- const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
9
- /**
10
- * DeviceManager discovers running iOS Simulators and Android Emulators,
11
- * and creates Device instances for them.
12
- */
13
- class DeviceManager {
14
- activeDevice = null;
15
- activeDeviceId = null;
16
- activePlatform = null;
17
- async discoverDevices() {
18
- const devices = [];
19
- const [androidDevices, iosDevices] = await Promise.allSettled([
20
- this.discoverAndroidDevices(),
21
- this.discoverIosDevices(),
22
- ]);
23
- if (androidDevices.status === "fulfilled") {
24
- devices.push(...androidDevices.value);
25
- }
26
- if (iosDevices.status === "fulfilled") {
27
- devices.push(...iosDevices.value);
28
- }
29
- return devices;
30
- }
31
- async getDevice(deviceId) {
32
- // If we have a cached device and it matches, verify it's still healthy
33
- if (this.activeDevice &&
34
- this.activeDeviceId &&
35
- (!deviceId || deviceId === this.activeDeviceId)) {
36
- const isHealthy = await this.checkDeviceHealth(this.activeDeviceId, this.activePlatform);
37
- if (isHealthy) {
38
- return this.activeDevice;
39
- }
40
- // Device is stale — clear cache and rediscover
41
- this.activeDevice = null;
42
- this.activeDeviceId = null;
43
- this.activePlatform = null;
44
- }
45
- const devices = await this.discoverDevices();
46
- const bootedDevices = devices.filter((d) => d.isBooted);
47
- if (bootedDevices.length === 0) {
48
- throw new Error("No running simulators or emulators found. Please start a device first.");
49
- }
50
- let target;
51
- if (deviceId) {
52
- const found = bootedDevices.find((d) => d.id === deviceId);
53
- if (!found) {
54
- throw new Error(`Device "${deviceId}" not found or not running. Available: ${bootedDevices.map((d) => d.id).join(", ")}`);
55
- }
56
- target = found;
57
- }
58
- else {
59
- target = bootedDevices[0];
60
- }
61
- if (target.platform === "android") {
62
- this.activeDevice = new android_device_js_1.AndroidDevice(target.id);
63
- }
64
- else {
65
- this.activeDevice = new ios_device_js_1.IosDevice(target.id);
66
- }
67
- this.activeDeviceId = target.id;
68
- this.activePlatform = target.platform;
69
- return this.activeDevice;
70
- }
71
- /**
72
- * Quick health check to verify a cached device is still alive.
73
- * Returns false if the device is disconnected or no longer booted.
74
- */
75
- async checkDeviceHealth(deviceId, platform) {
76
- try {
77
- if (platform === "android") {
78
- const adbPath = this.getAdbPath();
79
- const { stdout } = await execFileAsync(adbPath, ["-s", deviceId, "get-state"], {
80
- timeout: 5000,
81
- });
82
- return stdout.trim() === "device";
83
- }
84
- else if (platform === "ios") {
85
- const { stdout } = await execFileAsync("xcrun", ["simctl", "list", "devices", "--json"], { timeout: 5000 });
86
- const data = JSON.parse(stdout);
87
- for (const deviceList of Object.values(data.devices)) {
88
- const found = deviceList.find((d) => d.udid === deviceId);
89
- if (found)
90
- return found.state === "Booted";
91
- }
92
- return false;
93
- }
94
- return true;
95
- }
96
- catch {
97
- return false;
98
- }
99
- }
100
- async discoverAndroidDevices() {
101
- try {
102
- const adbPath = this.getAdbPath();
103
- const { stdout } = await execFileAsync(adbPath, ["devices", "-l"]);
104
- const devices = [];
105
- for (const line of stdout.split("\n").slice(1)) {
106
- const trimmed = line.trim();
107
- if (!trimmed || trimmed === "")
108
- continue;
109
- const parts = trimmed.split(/\s+/);
110
- const id = parts[0];
111
- const status = parts[1];
112
- if (status !== "device")
113
- continue;
114
- // Extract model name from properties
115
- const modelMatch = trimmed.match(/model:(\S+)/);
116
- const name = modelMatch ? modelMatch[1] : id;
117
- // Get Android version
118
- let osVersion = "unknown";
119
- try {
120
- const { stdout: versionOut } = await execFileAsync(adbPath, [
121
- "-s",
122
- id,
123
- "shell",
124
- "getprop",
125
- "ro.build.version.release",
126
- ]);
127
- osVersion = versionOut.trim();
128
- }
129
- catch {
130
- // Ignore version fetch errors
131
- }
132
- devices.push({
133
- id,
134
- name,
135
- platform: "android",
136
- osVersion,
137
- isBooted: true,
138
- });
139
- }
140
- return devices;
141
- }
142
- catch {
143
- return [];
144
- }
145
- }
146
- async discoverIosDevices() {
147
- try {
148
- const { stdout } = await execFileAsync("xcrun", [
149
- "simctl",
150
- "list",
151
- "devices",
152
- "--json",
153
- ]);
154
- const data = JSON.parse(stdout);
155
- const devices = [];
156
- for (const [runtime, deviceList] of Object.entries(data.devices)) {
157
- const osVersion = runtime.replace(/^com\.apple\.CoreSimulator\.SimRuntime\./, "").replace(/-/g, ".").replace(/^iOS\./, "");
158
- for (const device of deviceList) {
159
- if (device.state === "Booted") {
160
- devices.push({
161
- id: device.udid,
162
- name: device.name,
163
- platform: "ios",
164
- osVersion,
165
- isBooted: true,
166
- });
167
- }
168
- }
169
- }
170
- return devices;
171
- }
172
- catch {
173
- return [];
174
- }
175
- }
176
- getAdbPath() {
177
- const androidHome = process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT;
178
- if (androidHome) {
179
- return `${androidHome}/platform-tools/adb`;
180
- }
181
- return "adb";
182
- }
183
- }
184
- exports.DeviceManager = DeviceManager;
185
- //# sourceMappingURL=device-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"device-manager.js","sourceRoot":"","sources":["../../../src/platform/device-manager.ts"],"names":[],"mappings":"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"}
@@ -1,86 +0,0 @@
1
- /**
2
- * Abstract Device interface — the core abstraction that iOS and Android drivers implement.
3
- * Every MCP tool delegates to this interface. Tools never know which platform they're on.
4
- */
5
- export interface DeviceInfo {
6
- id: string;
7
- name: string;
8
- platform: "ios" | "android";
9
- osVersion: string;
10
- screenWidth: number;
11
- screenHeight: number;
12
- orientation: "portrait" | "landscape";
13
- isBooted: boolean;
14
- }
15
- export interface AppInfo {
16
- appId: string;
17
- name: string;
18
- isRunning: boolean;
19
- }
20
- export interface Bounds {
21
- x: number;
22
- y: number;
23
- width: number;
24
- height: number;
25
- }
26
- export interface SnapshotNode {
27
- /** Element class/type (e.g., "android.widget.TextView", "UILabel") */
28
- type: string;
29
- /** Text content of the element */
30
- text?: string;
31
- /** Accessibility label */
32
- label?: string;
33
- /** Content description / accessibility hint */
34
- description?: string;
35
- /** Bounding box in screen coordinates */
36
- bounds: Bounds;
37
- /** Whether the element is interactive (clickable, tappable) */
38
- interactive: boolean;
39
- /** Whether the element is focused */
40
- focused?: boolean;
41
- /** Whether the element is enabled */
42
- enabled?: boolean;
43
- /** Whether the element is visible */
44
- visible?: boolean;
45
- /** Element value (for inputs, toggles, etc.) */
46
- value?: string;
47
- /** Resource ID (Android) or accessibility identifier (iOS) */
48
- resourceId?: string;
49
- /** Child elements */
50
- children: SnapshotNode[];
51
- /** Platform-specific raw attributes (for debugging) */
52
- rawAttributes?: Record<string, string>;
53
- }
54
- export interface Device {
55
- /** Get device information */
56
- getInfo(): Promise<DeviceInfo>;
57
- /** Get the accessibility tree of the current screen */
58
- getSnapshot(): Promise<SnapshotNode>;
59
- /** Take a screenshot, returns PNG buffer */
60
- takeScreenshot(): Promise<Buffer>;
61
- /** Tap at screen coordinates */
62
- tap(x: number, y: number): Promise<void>;
63
- /** Double-tap at screen coordinates */
64
- doubleTap(x: number, y: number): Promise<void>;
65
- /** Long press at screen coordinates */
66
- longPress(x: number, y: number, durationMs?: number): Promise<void>;
67
- /** Type text (assumes an input is already focused) */
68
- typeText(text: string): Promise<void>;
69
- /** Swipe from one point to another */
70
- swipe(startX: number, startY: number, endX: number, endY: number, durationMs?: number): Promise<void>;
71
- /** Press a hardware/system button */
72
- pressButton(button: "home" | "back" | "enter"): Promise<void>;
73
- /** Set device orientation */
74
- setOrientation(orientation: "portrait" | "landscape"): Promise<void>;
75
- /** Launch an app by its bundle/package ID */
76
- launchApp(appId: string): Promise<void>;
77
- /** Terminate a running app */
78
- terminateApp(appId: string): Promise<void>;
79
- /** Install an app from a file path */
80
- installApp(path: string): Promise<void>;
81
- /** List installed apps */
82
- listApps(): Promise<AppInfo[]>;
83
- /** Open a URL (deep link or web URL) */
84
- openUrl(url: string): Promise<void>;
85
- }
86
- //# sourceMappingURL=device.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../../src/platform/device.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- "use strict";
2
- /**
3
- * Abstract Device interface — the core abstraction that iOS and Android drivers implement.
4
- * Every MCP tool delegates to this interface. Tools never know which platform they're on.
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- //# sourceMappingURL=device.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"device.js","sourceRoot":"","sources":["../../../src/platform/device.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
@@ -1,17 +0,0 @@
1
- import type { SnapshotNode } from "../device.js";
2
- /**
3
- * Parses iOS accessibility output from `simctl ui` into SnapshotNode tree.
4
- *
5
- * The simctl accessibility output varies by iOS/Xcode version. This parser
6
- * handles the common formats:
7
- *
8
- * Format 1 (structured):
9
- * Element: UIButton, Label: "Submit", Traits: Button, Frame: {{20, 100}, {340, 44}}
10
- *
11
- * Format 2 (XML-like from accessibility inspector):
12
- * <AXElement type="UIButton" label="Submit" frame="20 100 340 44" ...>
13
- *
14
- * When neither format is available, we fall back to a basic tree.
15
- */
16
- export declare function parseIosAccessibilityOutput(output: string): SnapshotNode;
17
- //# sourceMappingURL=accessibility.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"accessibility.d.ts","sourceRoot":"","sources":["../../../../src/platform/ios/accessibility.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAU,MAAM,cAAc,CAAC;AAEzD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,GACb,YAAY,CAad"}
@@ -1,159 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseIosAccessibilityOutput = parseIosAccessibilityOutput;
4
- /**
5
- * Parses iOS accessibility output from `simctl ui` into SnapshotNode tree.
6
- *
7
- * The simctl accessibility output varies by iOS/Xcode version. This parser
8
- * handles the common formats:
9
- *
10
- * Format 1 (structured):
11
- * Element: UIButton, Label: "Submit", Traits: Button, Frame: {{20, 100}, {340, 44}}
12
- *
13
- * Format 2 (XML-like from accessibility inspector):
14
- * <AXElement type="UIButton" label="Submit" frame="20 100 340 44" ...>
15
- *
16
- * When neither format is available, we fall back to a basic tree.
17
- */
18
- function parseIosAccessibilityOutput(output) {
19
- // Try XML-like format first
20
- if (output.includes("<AX") || output.includes("AXElement")) {
21
- return parseAxFormat(output);
22
- }
23
- // Try structured text format
24
- if (output.includes("Element:") || output.includes("Label:")) {
25
- return parseStructuredFormat(output);
26
- }
27
- // Try simctl describe format (indented tree)
28
- return parseDescribeFormat(output);
29
- }
30
- function parseAxFormat(output) {
31
- const root = createContainerNode("Screen");
32
- const lines = output.split("\n");
33
- for (const line of lines) {
34
- const trimmed = line.trim();
35
- if (!trimmed)
36
- continue;
37
- const typeMatch = trimmed.match(/type[=:]\s*"?(\w+)"?/i);
38
- const labelMatch = trimmed.match(/label[=:]\s*"([^"]*)"/i);
39
- const frameMatch = trimmed.match(/frame[=:]\s*"?(\d+)\s+(\d+)\s+(\d+)\s+(\d+)"?/i);
40
- const traitsMatch = trimmed.match(/traits?[=:]\s*"?([^">\n]+)"?/i);
41
- if (typeMatch) {
42
- const node = {
43
- type: simplifyIosType(typeMatch[1]),
44
- text: labelMatch ? labelMatch[1] : undefined,
45
- label: labelMatch ? labelMatch[1] : undefined,
46
- description: undefined,
47
- bounds: frameMatch
48
- ? {
49
- x: parseInt(frameMatch[1]),
50
- y: parseInt(frameMatch[2]),
51
- width: parseInt(frameMatch[3]),
52
- height: parseInt(frameMatch[4]),
53
- }
54
- : { x: 0, y: 0, width: 0, height: 0 },
55
- interactive: isInteractiveTrait(traitsMatch?.[1] || ""),
56
- children: [],
57
- };
58
- root.children.push(node);
59
- }
60
- }
61
- return root;
62
- }
63
- function parseStructuredFormat(output) {
64
- const root = createContainerNode("Screen");
65
- const blocks = output.split(/\n(?=Element:)/);
66
- for (const block of blocks) {
67
- const typeMatch = block.match(/Element:\s*(\w+)/);
68
- const labelMatch = block.match(/Label:\s*"([^"]*)"/);
69
- const frameMatch = block.match(/Frame:\s*\{\{(\d+),\s*(\d+)\},\s*\{(\d+),\s*(\d+)\}\}/);
70
- const traitsMatch = block.match(/Traits?:\s*(.+)/);
71
- if (typeMatch) {
72
- const node = {
73
- type: simplifyIosType(typeMatch[1]),
74
- text: labelMatch ? labelMatch[1] : undefined,
75
- label: labelMatch ? labelMatch[1] : undefined,
76
- description: undefined,
77
- bounds: frameMatch
78
- ? {
79
- x: parseInt(frameMatch[1]),
80
- y: parseInt(frameMatch[2]),
81
- width: parseInt(frameMatch[3]),
82
- height: parseInt(frameMatch[4]),
83
- }
84
- : { x: 0, y: 0, width: 0, height: 0 },
85
- interactive: isInteractiveTrait(traitsMatch?.[1] || ""),
86
- children: [],
87
- };
88
- root.children.push(node);
89
- }
90
- }
91
- return root;
92
- }
93
- function parseDescribeFormat(output) {
94
- const root = createContainerNode("Screen");
95
- const lines = output.split("\n");
96
- const stack = [
97
- { node: root, indent: -1 },
98
- ];
99
- for (const line of lines) {
100
- if (!line.trim())
101
- continue;
102
- const indent = line.search(/\S/);
103
- const trimmed = line.trim();
104
- // Parse "Type: Label" or just "Type"
105
- const parts = trimmed.split(/:\s*/);
106
- const type = parts[0] || "View";
107
- const label = parts.length > 1 ? parts.slice(1).join(": ") : undefined;
108
- const node = {
109
- type: simplifyIosType(type),
110
- text: label,
111
- label,
112
- description: undefined,
113
- bounds: { x: 0, y: 0, width: 0, height: 0 },
114
- interactive: isInteractiveType(type),
115
- children: [],
116
- };
117
- // Find parent based on indentation
118
- while (stack.length > 1 && stack[stack.length - 1].indent >= indent) {
119
- stack.pop();
120
- }
121
- stack[stack.length - 1].node.children.push(node);
122
- stack.push({ node, indent });
123
- }
124
- return root;
125
- }
126
- function createContainerNode(name) {
127
- return {
128
- type: name,
129
- bounds: { x: 0, y: 0, width: 0, height: 0 },
130
- interactive: false,
131
- children: [],
132
- };
133
- }
134
- function simplifyIosType(type) {
135
- return type
136
- .replace(/^UI/, "")
137
- .replace(/^AX/, "")
138
- .replace(/^_/, "");
139
- }
140
- function isInteractiveTrait(traits) {
141
- const lower = traits.toLowerCase();
142
- return (lower.includes("button") ||
143
- lower.includes("link") ||
144
- lower.includes("textfield") ||
145
- lower.includes("searchfield") ||
146
- lower.includes("adjustable") ||
147
- lower.includes("toggle"));
148
- }
149
- function isInteractiveType(type) {
150
- const lower = type.toLowerCase();
151
- return (lower.includes("button") ||
152
- lower.includes("textfield") ||
153
- lower.includes("textview") ||
154
- lower.includes("switch") ||
155
- lower.includes("slider") ||
156
- lower.includes("picker") ||
157
- lower.includes("link"));
158
- }
159
- //# sourceMappingURL=accessibility.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"accessibility.js","sourceRoot":"","sources":["../../../../src/platform/ios/accessibility.ts"],"names":[],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- import type { Device, DeviceInfo, AppInfo, SnapshotNode } from "../device.js";
2
- export declare class IosDevice implements Device {
3
- private deviceId;
4
- private simctl;
5
- constructor(deviceId: string);
6
- getInfo(): Promise<DeviceInfo>;
7
- getSnapshot(): Promise<SnapshotNode>;
8
- takeScreenshot(): Promise<Buffer>;
9
- tap(x: number, y: number): Promise<void>;
10
- doubleTap(x: number, y: number): Promise<void>;
11
- longPress(x: number, y: number, _durationMs?: number): Promise<void>;
12
- typeText(text: string): Promise<void>;
13
- swipe(startX: number, startY: number, endX: number, endY: number, _durationMs?: number): Promise<void>;
14
- pressButton(button: "home" | "back" | "enter"): Promise<void>;
15
- setOrientation(orientation: "portrait" | "landscape"): Promise<void>;
16
- launchApp(appId: string): Promise<void>;
17
- terminateApp(appId: string): Promise<void>;
18
- installApp(path: string): Promise<void>;
19
- listApps(): Promise<AppInfo[]>;
20
- openUrl(url: string): Promise<void>;
21
- }
22
- //# sourceMappingURL=ios-device.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ios-device.d.ts","sourceRoot":"","sources":["../../../../src/platform/ios/ios-device.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAI9E,qBAAa,SAAU,YAAW,MAAM;IAG1B,OAAO,CAAC,QAAQ;IAF5B,OAAO,CAAC,MAAM,CAAS;gBAEH,QAAQ,EAAE,MAAM;IAI9B,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;IAkB9B,WAAW,IAAI,OAAO,CAAC,YAAY,CAAC;IAKpC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAIjC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9C,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,KAAK,CACT,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,WAAW,SAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IAIV,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB7D,cAAc,CAAC,WAAW,EAAE,UAAU,GAAG,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpE,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAS9B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG1C"}
@@ -1,97 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.IosDevice = void 0;
4
- const simctl_js_1 = require("./simctl.js");
5
- const accessibility_js_1 = require("./accessibility.js");
6
- class IosDevice {
7
- deviceId;
8
- simctl;
9
- constructor(deviceId) {
10
- this.deviceId = deviceId;
11
- this.simctl = new simctl_js_1.Simctl(deviceId);
12
- }
13
- async getInfo() {
14
- const [deviceInfo, screenSize] = await Promise.all([
15
- this.simctl.getDeviceInfo(),
16
- this.simctl.getScreenSize(),
17
- ]);
18
- return {
19
- id: this.deviceId,
20
- name: deviceInfo.name,
21
- platform: "ios",
22
- osVersion: deviceInfo.runtime,
23
- screenWidth: screenSize.width,
24
- screenHeight: screenSize.height,
25
- orientation: "portrait", // Default; would need to query actual orientation
26
- isBooted: deviceInfo.state === "Booted",
27
- };
28
- }
29
- async getSnapshot() {
30
- const output = await this.simctl.getAccessibilityTree();
31
- return (0, accessibility_js_1.parseIosAccessibilityOutput)(output);
32
- }
33
- async takeScreenshot() {
34
- return this.simctl.screenshot();
35
- }
36
- async tap(x, y) {
37
- await this.simctl.tap(x, y);
38
- }
39
- async doubleTap(x, y) {
40
- await this.simctl.tap(x, y);
41
- await sleep(100);
42
- await this.simctl.tap(x, y);
43
- }
44
- async longPress(x, y, _durationMs = 1000) {
45
- // simctl doesn't have a native long-press; we hold via swipe-in-place
46
- await this.simctl.swipe(x, y, x, y);
47
- }
48
- async typeText(text) {
49
- await this.simctl.typeText(text);
50
- }
51
- async swipe(startX, startY, endX, endY, _durationMs = 300) {
52
- await this.simctl.swipe(startX, startY, endX, endY);
53
- }
54
- async pressButton(button) {
55
- switch (button) {
56
- case "home":
57
- await this.simctl.pressKey("home");
58
- break;
59
- case "back":
60
- // iOS doesn't have a hardware back button; swipe from left edge
61
- const screenSize = await this.simctl.getScreenSize();
62
- await this.simctl.swipe(0, screenSize.height / 2, screenSize.width / 2, screenSize.height / 2);
63
- break;
64
- case "enter":
65
- await this.simctl.pressKey("return");
66
- break;
67
- }
68
- }
69
- async setOrientation(orientation) {
70
- await this.simctl.setOrientation(orientation);
71
- }
72
- async launchApp(appId) {
73
- await this.simctl.launchApp(appId);
74
- }
75
- async terminateApp(appId) {
76
- await this.simctl.terminateApp(appId);
77
- }
78
- async installApp(path) {
79
- await this.simctl.installApp(path);
80
- }
81
- async listApps() {
82
- const apps = await this.simctl.listApps();
83
- return apps.map((app) => ({
84
- appId: app.bundleId,
85
- name: app.name,
86
- isRunning: false,
87
- }));
88
- }
89
- async openUrl(url) {
90
- await this.simctl.openUrl(url);
91
- }
92
- }
93
- exports.IosDevice = IosDevice;
94
- function sleep(ms) {
95
- return new Promise((resolve) => setTimeout(resolve, ms));
96
- }
97
- //# sourceMappingURL=ios-device.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ios-device.js","sourceRoot":"","sources":["../../../../src/platform/ios/ios-device.ts"],"names":[],"mappings":"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"}