react-native-ai-debugger 1.0.6 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +84 -83
- package/build/core/android.d.ts +138 -0
- package/build/core/android.d.ts.map +1 -1
- package/build/core/android.js +630 -0
- package/build/core/android.js.map +1 -1
- package/build/core/executor.d.ts.map +1 -1
- package/build/core/executor.js +69 -29
- package/build/core/executor.js.map +1 -1
- package/build/core/index.d.ts +4 -3
- package/build/core/index.d.ts.map +1 -1
- package/build/core/index.js +8 -2
- package/build/core/index.js.map +1 -1
- package/build/core/ios.d.ts +69 -0
- package/build/core/ios.d.ts.map +1 -1
- package/build/core/ios.js +213 -0
- package/build/core/ios.js.map +1 -1
- package/build/index.js +386 -3
- package/build/index.js.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ An MCP (Model Context Protocol) server for AI-powered React Native debugging. En
|
|
|
17
17
|
- **Android device control** - screenshots, tap, swipe, text input, key events via ADB
|
|
18
18
|
- **iOS simulator control** - screenshots, app management, URL handling via simctl
|
|
19
19
|
- **iOS UI automation** - tap, swipe, text input, button presses via IDB (optional)
|
|
20
|
-
- **
|
|
20
|
+
- **Element-based UI automation** - find and wait for elements by text/label without screenshots (faster, cheaper)
|
|
21
21
|
|
|
22
22
|
## Requirements
|
|
23
23
|
|
|
@@ -133,47 +133,35 @@ Requires VS Code 1.102+ with Copilot ([docs](https://code.visualstudio.com/docs/
|
|
|
133
133
|
|
|
134
134
|
### Android (ADB)
|
|
135
135
|
|
|
136
|
-
| Tool
|
|
137
|
-
|
|
|
138
|
-
| `list_android_devices`
|
|
139
|
-
| `android_screenshot`
|
|
140
|
-
| `android_install_app`
|
|
141
|
-
| `android_launch_app`
|
|
142
|
-
| `android_list_packages`
|
|
143
|
-
| `android_tap`
|
|
144
|
-
| `android_long_press`
|
|
145
|
-
| `android_swipe`
|
|
146
|
-
| `android_input_text`
|
|
147
|
-
| `android_key_event`
|
|
148
|
-
| `android_get_screen_size`
|
|
136
|
+
| Tool | Description |
|
|
137
|
+
| --------------------------- | ------------------------------------------------------------- |
|
|
138
|
+
| `list_android_devices` | List connected Android devices and emulators via ADB |
|
|
139
|
+
| `android_screenshot` | Take a screenshot from an Android device/emulator |
|
|
140
|
+
| `android_install_app` | Install an APK on an Android device/emulator |
|
|
141
|
+
| `android_launch_app` | Launch an app by package name |
|
|
142
|
+
| `android_list_packages` | List installed packages (with optional filter) |
|
|
143
|
+
| `android_tap` | Tap at specific coordinates on screen |
|
|
144
|
+
| `android_long_press` | Long press at specific coordinates |
|
|
145
|
+
| `android_swipe` | Swipe from one point to another |
|
|
146
|
+
| `android_input_text` | Type text at current focus point |
|
|
147
|
+
| `android_key_event` | Send key events (HOME, BACK, ENTER, etc.) |
|
|
148
|
+
| `android_get_screen_size` | Get device screen resolution |
|
|
149
|
+
| `android_find_element` | Find element by text/contentDesc/resourceId (no screenshot) |
|
|
150
|
+
| `android_wait_for_element` | Wait for element to appear (useful for screen transitions) |
|
|
149
151
|
|
|
150
152
|
### iOS (Simulator)
|
|
151
153
|
|
|
152
|
-
| Tool
|
|
153
|
-
|
|
|
154
|
-
| `list_ios_simulators`
|
|
155
|
-
| `ios_screenshot`
|
|
156
|
-
| `ios_install_app`
|
|
157
|
-
| `ios_launch_app`
|
|
158
|
-
| `ios_open_url`
|
|
159
|
-
| `ios_terminate_app`
|
|
160
|
-
| `ios_boot_simulator`
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
These tools require [Facebook IDB](https://fbidb.io/) to be installed: `brew install idb-companion`
|
|
165
|
-
|
|
166
|
-
| Tool | Description |
|
|
167
|
-
| ------------------- | ----------------------------------------------------- |
|
|
168
|
-
| `ios_tap` | Tap at specific coordinates on screen |
|
|
169
|
-
| `ios_tap_element` | Tap an element by its accessibility label |
|
|
170
|
-
| `ios_swipe` | Swipe from one point to another |
|
|
171
|
-
| `ios_input_text` | Type text into the active input field |
|
|
172
|
-
| `ios_button` | Press hardware buttons (HOME, LOCK, SIRI, etc.) |
|
|
173
|
-
| `ios_key_event` | Send a key event by keycode |
|
|
174
|
-
| `ios_key_sequence` | Send multiple key events in sequence |
|
|
175
|
-
| `ios_describe_all` | Get accessibility tree for entire screen |
|
|
176
|
-
| `ios_describe_point`| Get accessibility info for element at specific point |
|
|
154
|
+
| Tool | Description |
|
|
155
|
+
| ----------------------- | --------------------------------------------------------------- |
|
|
156
|
+
| `list_ios_simulators` | List available iOS simulators |
|
|
157
|
+
| `ios_screenshot` | Take a screenshot from an iOS simulator |
|
|
158
|
+
| `ios_install_app` | Install an app bundle (.app) on a simulator |
|
|
159
|
+
| `ios_launch_app` | Launch an app by bundle ID |
|
|
160
|
+
| `ios_open_url` | Open a URL (deep links or web URLs) |
|
|
161
|
+
| `ios_terminate_app` | Terminate a running app |
|
|
162
|
+
| `ios_boot_simulator` | Boot a simulator by UDID |
|
|
163
|
+
| `ios_find_element` | Find element by label/value (requires IDB, no screenshot) |
|
|
164
|
+
| `ios_wait_for_element` | Wait for element to appear (requires IDB) |
|
|
177
165
|
|
|
178
166
|
## Usage
|
|
179
167
|
|
|
@@ -476,78 +464,91 @@ Open a deep link:
|
|
|
476
464
|
ios_open_url with url="myapp://settings"
|
|
477
465
|
```
|
|
478
466
|
|
|
479
|
-
|
|
467
|
+
## Efficient UI Automation (No Screenshots)
|
|
480
468
|
|
|
481
|
-
|
|
469
|
+
For action triggering without layout debugging, use element-based tools instead of screenshots. This is **2-3x faster** and uses fewer tokens.
|
|
482
470
|
|
|
483
|
-
|
|
484
|
-
- iOS IDB uses **points** (logical coordinates), not pixels
|
|
485
|
-
- For 2x Retina displays: 1 point = 2 pixels
|
|
486
|
-
- Example: 1640x2360 pixel screenshot = 820x1180 points
|
|
487
|
-
- Use `ios_describe_all` to get exact element coordinates in points
|
|
471
|
+
### Android - Find and Tap by Text
|
|
488
472
|
|
|
489
|
-
Tap on screen (coordinates in points):
|
|
490
|
-
|
|
491
|
-
```
|
|
492
|
-
ios_tap with x=200 y=400
|
|
493
473
|
```
|
|
474
|
+
# Wait for screen to load
|
|
475
|
+
android_wait_for_element with text="Login"
|
|
494
476
|
|
|
495
|
-
|
|
477
|
+
# Find element (returns tap coordinates)
|
|
478
|
+
android_find_element with textContains="submit"
|
|
496
479
|
|
|
480
|
+
# Tap the element (use coordinates from find_element)
|
|
481
|
+
android_tap with x=540 y=960
|
|
497
482
|
```
|
|
498
|
-
ios_tap with x=200 y=400 duration=2
|
|
499
|
-
```
|
|
500
|
-
|
|
501
|
-
Swipe gesture:
|
|
502
483
|
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
484
|
+
Search options:
|
|
485
|
+
- `text` - exact text match
|
|
486
|
+
- `textContains` - partial text (case-insensitive)
|
|
487
|
+
- `contentDesc` - accessibility content description
|
|
488
|
+
- `contentDescContains` - partial content description
|
|
489
|
+
- `resourceId` - resource ID (e.g., "button" or "com.app:id/button")
|
|
506
490
|
|
|
507
|
-
|
|
491
|
+
### iOS - Find and Tap by Label (requires IDB)
|
|
508
492
|
|
|
493
|
+
```bash
|
|
494
|
+
# Install IDB first
|
|
495
|
+
brew install idb-companion
|
|
509
496
|
```
|
|
510
|
-
ios_tap with x=200 y=300
|
|
511
|
-
ios_input_text with text="hello@example.com"
|
|
512
|
-
```
|
|
513
|
-
|
|
514
|
-
Press hardware buttons:
|
|
515
497
|
|
|
516
498
|
```
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
499
|
+
# Wait for element
|
|
500
|
+
ios_wait_for_element with label="Sign In"
|
|
501
|
+
|
|
502
|
+
# Find element by partial label
|
|
503
|
+
ios_find_element with labelContains="welcome"
|
|
520
504
|
```
|
|
521
505
|
|
|
522
|
-
|
|
506
|
+
Search options:
|
|
507
|
+
- `label` - exact accessibility label
|
|
508
|
+
- `labelContains` - partial label (case-insensitive)
|
|
509
|
+
- `value` - accessibility value
|
|
510
|
+
- `valueContains` - partial value
|
|
511
|
+
- `type` - element type (e.g., "Button", "TextField")
|
|
523
512
|
|
|
524
|
-
|
|
525
|
-
ios_describe_all
|
|
526
|
-
```
|
|
513
|
+
### Wait for Screen Transitions
|
|
527
514
|
|
|
528
|
-
|
|
515
|
+
Both platforms support waiting with timeout:
|
|
529
516
|
|
|
530
517
|
```
|
|
531
|
-
|
|
518
|
+
android_wait_for_element with text="Dashboard" timeoutMs=15000 pollIntervalMs=500
|
|
519
|
+
ios_wait_for_element with label="Home" timeoutMs=10000
|
|
532
520
|
```
|
|
533
521
|
|
|
534
|
-
|
|
522
|
+
### Recommended Workflow (Priority Order)
|
|
535
523
|
|
|
536
|
-
|
|
537
|
-
ios_tap_element with label="Settings"
|
|
538
|
-
```
|
|
524
|
+
**Always try accessibility tools first, fall back to screenshots only when needed:**
|
|
539
525
|
|
|
540
|
-
|
|
526
|
+
1. **Wait for screen** → Use `wait_for_element` with expected text/label
|
|
527
|
+
2. **Find target** → Use `find_element` to get tap coordinates
|
|
528
|
+
3. **Tap** → Use `tap` with coordinates from step 2
|
|
529
|
+
4. **Fallback** → If element not in accessibility tree, use `screenshot`
|
|
541
530
|
|
|
542
531
|
```
|
|
543
|
-
|
|
532
|
+
# Example: Tap "Submit" button after screen loads
|
|
533
|
+
android_wait_for_element with text="Submit" # Step 1: Wait
|
|
534
|
+
android_find_element with text="Submit" # Step 2: Find (returns center coordinates)
|
|
535
|
+
android_tap with x=540 y=1200 # Step 3: Tap (use returned coordinates)
|
|
544
536
|
```
|
|
545
537
|
|
|
546
|
-
|
|
538
|
+
**Why this order?**
|
|
539
|
+
- `find_element`: ~100-200 tokens, <100ms
|
|
540
|
+
- `screenshot`: ~400-500 tokens, 200-500ms
|
|
547
541
|
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
542
|
+
### When to Use Screenshots vs Element Tools
|
|
543
|
+
|
|
544
|
+
| Use Case | Recommended Tool |
|
|
545
|
+
|----------|------------------|
|
|
546
|
+
| Trigger button taps | `find_element` + `tap` |
|
|
547
|
+
| Wait for screen load | `wait_for_element` |
|
|
548
|
+
| Navigate through flow | `wait_for_element` + `tap` |
|
|
549
|
+
| Debug layout issues | `screenshot` |
|
|
550
|
+
| Verify visual appearance | `screenshot` |
|
|
551
|
+
| Find elements without labels | `screenshot` |
|
|
551
552
|
|
|
552
553
|
## Supported React Native Versions
|
|
553
554
|
|
package/build/core/android.d.ts
CHANGED
|
@@ -96,6 +96,81 @@ export declare function androidInputText(text: string, deviceId?: string): Promi
|
|
|
96
96
|
* Send a key event to an Android device
|
|
97
97
|
*/
|
|
98
98
|
export declare function androidKeyEvent(keyCode: number | keyof typeof ANDROID_KEY_EVENTS, deviceId?: string): Promise<AdbResult>;
|
|
99
|
+
/**
|
|
100
|
+
* UI Element from accessibility tree
|
|
101
|
+
*/
|
|
102
|
+
export interface AndroidUIElement {
|
|
103
|
+
text: string;
|
|
104
|
+
contentDesc: string;
|
|
105
|
+
resourceId: string;
|
|
106
|
+
className: string;
|
|
107
|
+
bounds: {
|
|
108
|
+
left: number;
|
|
109
|
+
top: number;
|
|
110
|
+
right: number;
|
|
111
|
+
bottom: number;
|
|
112
|
+
width: number;
|
|
113
|
+
height: number;
|
|
114
|
+
};
|
|
115
|
+
center: {
|
|
116
|
+
x: number;
|
|
117
|
+
y: number;
|
|
118
|
+
};
|
|
119
|
+
clickable: boolean;
|
|
120
|
+
enabled: boolean;
|
|
121
|
+
focused: boolean;
|
|
122
|
+
scrollable: boolean;
|
|
123
|
+
selected: boolean;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Result of element find operations
|
|
127
|
+
*/
|
|
128
|
+
export interface FindElementResult {
|
|
129
|
+
success: boolean;
|
|
130
|
+
found: boolean;
|
|
131
|
+
element?: AndroidUIElement;
|
|
132
|
+
allMatches?: AndroidUIElement[];
|
|
133
|
+
matchCount?: number;
|
|
134
|
+
error?: string;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Result of wait for element operations
|
|
138
|
+
*/
|
|
139
|
+
export interface WaitForElementResult extends FindElementResult {
|
|
140
|
+
elapsedMs?: number;
|
|
141
|
+
timedOut?: boolean;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Options for finding elements
|
|
145
|
+
*/
|
|
146
|
+
export interface FindElementOptions {
|
|
147
|
+
text?: string;
|
|
148
|
+
textContains?: string;
|
|
149
|
+
contentDesc?: string;
|
|
150
|
+
contentDescContains?: string;
|
|
151
|
+
resourceId?: string;
|
|
152
|
+
index?: number;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get UI accessibility tree from Android device using uiautomator
|
|
156
|
+
*/
|
|
157
|
+
export declare function androidGetUITree(deviceId?: string): Promise<{
|
|
158
|
+
success: boolean;
|
|
159
|
+
elements?: AndroidUIElement[];
|
|
160
|
+
rawXml?: string;
|
|
161
|
+
error?: string;
|
|
162
|
+
}>;
|
|
163
|
+
/**
|
|
164
|
+
* Find element(s) in the UI tree matching the given criteria
|
|
165
|
+
*/
|
|
166
|
+
export declare function androidFindElement(options: FindElementOptions, deviceId?: string): Promise<FindElementResult>;
|
|
167
|
+
/**
|
|
168
|
+
* Wait for element to appear on screen with polling
|
|
169
|
+
*/
|
|
170
|
+
export declare function androidWaitForElement(options: FindElementOptions & {
|
|
171
|
+
timeoutMs?: number;
|
|
172
|
+
pollIntervalMs?: number;
|
|
173
|
+
}, deviceId?: string): Promise<WaitForElementResult>;
|
|
99
174
|
/**
|
|
100
175
|
* Get device screen size
|
|
101
176
|
*/
|
|
@@ -105,4 +180,67 @@ export declare function androidGetScreenSize(deviceId?: string): Promise<{
|
|
|
105
180
|
height?: number;
|
|
106
181
|
error?: string;
|
|
107
182
|
}>;
|
|
183
|
+
/**
|
|
184
|
+
* Android UI element from uiautomator dump
|
|
185
|
+
*/
|
|
186
|
+
export interface AndroidAccessibilityElement {
|
|
187
|
+
class: string;
|
|
188
|
+
text?: string;
|
|
189
|
+
contentDesc?: string;
|
|
190
|
+
resourceId?: string;
|
|
191
|
+
bounds: {
|
|
192
|
+
left: number;
|
|
193
|
+
top: number;
|
|
194
|
+
right: number;
|
|
195
|
+
bottom: number;
|
|
196
|
+
};
|
|
197
|
+
frame: {
|
|
198
|
+
x: number;
|
|
199
|
+
y: number;
|
|
200
|
+
width: number;
|
|
201
|
+
height: number;
|
|
202
|
+
};
|
|
203
|
+
tap: {
|
|
204
|
+
x: number;
|
|
205
|
+
y: number;
|
|
206
|
+
};
|
|
207
|
+
children: AndroidAccessibilityElement[];
|
|
208
|
+
checkable?: boolean;
|
|
209
|
+
checked?: boolean;
|
|
210
|
+
clickable?: boolean;
|
|
211
|
+
enabled?: boolean;
|
|
212
|
+
focusable?: boolean;
|
|
213
|
+
focused?: boolean;
|
|
214
|
+
scrollable?: boolean;
|
|
215
|
+
selected?: boolean;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Result type for accessibility operations
|
|
219
|
+
*/
|
|
220
|
+
export interface AndroidDescribeResult {
|
|
221
|
+
success: boolean;
|
|
222
|
+
elements?: AndroidAccessibilityElement[];
|
|
223
|
+
formatted?: string;
|
|
224
|
+
error?: string;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Get the UI hierarchy from the connected Android device using uiautomator dump
|
|
228
|
+
*/
|
|
229
|
+
export declare function androidDescribeAll(deviceId?: string): Promise<AndroidDescribeResult>;
|
|
230
|
+
/**
|
|
231
|
+
* Get accessibility info for the UI element at specific coordinates
|
|
232
|
+
*/
|
|
233
|
+
export declare function androidDescribePoint(x: number, y: number, deviceId?: string): Promise<AndroidDescribeResult>;
|
|
234
|
+
/**
|
|
235
|
+
* Tap an element by its text, content-description, or resource-id
|
|
236
|
+
*/
|
|
237
|
+
export declare function androidTapElement(options: {
|
|
238
|
+
text?: string;
|
|
239
|
+
textContains?: string;
|
|
240
|
+
contentDesc?: string;
|
|
241
|
+
contentDescContains?: string;
|
|
242
|
+
resourceId?: string;
|
|
243
|
+
index?: number;
|
|
244
|
+
deviceId?: string;
|
|
245
|
+
}): Promise<AdbResult>;
|
|
108
246
|
//# sourceMappingURL=android.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"android.d.ts","sourceRoot":"","sources":["../../src/core/android.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"android.d.ts","sourceRoot":"","sources":["../../src/core/android.ts"],"names":[],"mappings":"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"}
|